Files
commander-ai-lab/install-commander-ai-lab.ps1
T
KoalaTrapLord 384c3adfff v26: Wire RL training pipeline UI (phases 1-5)
- Fixed all ML types to match actual backend response shapes:
  MLStatus (logging state + decision files), MLDataStatus (datasets,
  checkpoints, eval results), MLTrainStatus (phases, metrics, result),
  PPOTrainStatus (metrics with win_rate/reward/losses), TournamentStatus
- Updated training API client with full parameter support for all endpoints
- Rewrote TrainingPage with 5 clear pipeline phases:
  Phase 1: Data Collection (toggle logging, view decision files)
  Phase 2: Dataset & Model Artifacts (splits, checkpoints, eval, model info)
  Phase 3: Supervised Training (epochs/lr/batch/patience, live progress,
           phase badges, real-time metrics, final eval results)
  Phase 4: PPO Reinforcement Learning (full config: iterations, episodes,
           clip epsilon, entropy coeff, opponent selection, live win rate)
  Phase 5: Tournament Evaluation (episodes, playstyle, leaderboard table)
- All sections are collapsible with live phase badges and progress bars
- Advanced config toggles for supervised and PPO training
- Proper mutex: can't start PPO while supervised is running, etc.
- Auto-refresh model info and data status when training completes
2026-03-12 02:54:30 +00:00

1917 lines
2.9 MiB
Plaintext

# Commander AI Lab - Full Fresh Installer
# Deploys ALL 174 project files
# Usage: powershell -ExecutionPolicy Bypass -File install-commander-ai-lab.ps1
$ErrorActionPreference = "Stop"
$targetDir = 'D:\ForgeCommander\commander-ai-lab'
Write-Host ''
Write-Host '=======================================================' -ForegroundColor Cyan
Write-Host ' Commander AI Lab - Full Fresh Installer' -ForegroundColor Cyan
Write-Host ' v23: React + TypeScript SPA Migration' -ForegroundColor Cyan
Write-Host '=======================================================' -ForegroundColor Cyan
Write-Host ''
if (-not (Test-Path $targetDir)) {
New-Item -ItemType Directory -Path $targetDir -Force | Out-Null
Write-Host (' Created: ' + $targetDir) -ForegroundColor Green
} else {
Write-Host (' Target exists: ' + $targetDir) -ForegroundColor Yellow
}
function Install-B64 {
param([string]$R, [string]$B)
$fp = Join-Path $targetDir $R
$d = Split-Path $fp -Parent
if (-not (Test-Path $d)) {
New-Item -ItemType Directory -Path $d -Force | Out-Null
}
$clean = $B -replace '[\r\n\s]',''
$bytes = [Convert]::FromBase64String($clean)
[IO.File]::WriteAllBytes($fp, $bytes)
$kb = [math]::Round($bytes.Length / 1024, 1)
Write-Host (' [OK] ' + $R + ' (' + $kb + ' KB)') -ForegroundColor Green
}
Write-Host (' Target: ' + $targetDir) -ForegroundColor Gray
Write-Host ' Files: 174' -ForegroundColor Gray
Write-Host ''
Write-Host ' Installing files...' -ForegroundColor White
Write-Host ''
# README.md (14,895 bytes)
$b = 'IyBDb21tYW5kZXIgQUkgTGFiCgpIZWFkbGVzcyBiYXRjaCBzaW11bGF0aW9uIGVudmlyb25tZW50IGZvciAzLUFJIE1URyBDb21tYW5kZXIgcG9kcy4KUnVuIDEwMCsgZ2FtZXMsIGFuYWx5emUgd2luIHJhdGVzLCBhbmQgc3RyZXNzLXRlc3QgeW91ciBkZWNrcyDigJQgYWxsIGZyb20gYSB3ZWIgVUkgb3IgQ0xJLgoKIyMgQXJjaGl0ZWN0dXJlCgpgYGAK4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCuKUgiAgV2ViIEJyb3dzZXIgKGFpLWxhYi5qcyArIGFpLWxhYi5jc3MpICAgICAgICAgICAgICAgICAgICAgICDilIIK4pSCICAgIFNlbGVjdCBkZWNrcyDihpIgU3RhcnQgYmF0Y2gg4oaSIFBvbGwgcHJvZ3Jlc3Mg4oaSIFZpZXcgc3RhdHMgIOKUggrilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgKICAgICAgICAgICAgICAgICAgICAgIOKUgiBIVFRQIChSRVNUKQrilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAK4pSCICBQeXRob24gRmFzdEFQSSBTZXJ2ZXIgKGxhYl9hcGkucHksIHBvcnQgODA4MCkgICAgICAgICAgICAgIOKUggrilIIgICAgL2FwaS9sYWIvc3RhcnQgIOKAlCBzcGF3biBKYXZhIGJhdGNoIHJ1bm5lciBzdWJwcm9jZXNzICAgICDilIIK4pSCICAgIC9hcGkvbGFiL3N0YXR1cyDigJQgcG9sbCBwcm9ncmVzcyAocGFyc2VzIHN0ZG91dCkgICAgICAgICAg4pSCCuKUgiAgICAvYXBpL2xhYi9yZXN1bHQg4oCUIHJldHVybiBjb21wbGV0ZWQgSlNPTiByZXN1bHRzICAgICAgICAgIOKUggrilIIgICAgL2FwaS9sYWIvZGVja3MgIOKAlCBsaXN0IGRlY2tzIGZyb20gRm9yZ2UgdXNlciBkYXRhICAgICAgICDilIIK4pSCICAgIC9hcGkvbGFiL2hpc3RvcnnigJQgYnJvd3NlIHBhc3QgYmF0Y2ggcnVucyAgICAgICAgICAgICAgICAg4pSCCuKUgiAgICAvYXBpL2xhYi9sb2cgICAg4oCUIHN0cmVhbSBsaXZlIGNvbnNvbGUgb3V0cHV0ICAgICAgICAgICAgIOKUggrilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgKICAgICAgICAgICAgICAgICAgICAgIOKUgiBzdWJwcm9jZXNzIChqYXZhIC1qYXIpCuKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkArilIIgIEphdmEgQ0xJIChMYWJDbGkuamF2YSArIEJhdGNoUnVubmVyICsgTXVsdGlUaHJlYWRSdW5uZXIpICAg4pSCCuKUgiAgICBQYXJzZXMgRm9yZ2Ugc2ltIG91dHB1dCDihpIgR2FtZVJlc3VsdCBvYmplY3RzIOKGkiBKU09OICAgICAg4pSCCuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmAogICAgICAgICAgICAgICAgICAgICAg4pSCIHN1YnByb2Nlc3MgcGVyIGdhbWUK4pSM4pSA' +
'4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCuKUgiAgQ2FyZCBGb3JnZSBFbmdpbmUgKGZvcmdlLWd1aS1kZXNrdG9wIHNpbSBtb2RlKSAgICAgICAgICAgICDilIIK4pSCICAgIGphdmEgLWphciBmb3JnZS5qYXIgc2ltIC1kICJkZWNrMSIgImRlY2syIiAiZGVjazMiICAgICAgIOKUggrilIIgICAgLWYgY29tbWFuZGVyIC1uIDEgLXEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCCuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmApgYGAKCiMjIFF1aWNrIFN0YXJ0IChXaW5kb3dzKQoKIyMjIFByZXJlcXVpc2l0ZXMKLSAqKkphdmEgMTcrKiogKGBqYXZhIC12ZXJzaW9uYCkKLSAqKlB5dGhvbiAzLjEwKyoqIChgcHl0aG9uIC0tdmVyc2lvbmApCi0gKipNYXZlbiAzLjgrKiogKGBtdm4gLS12ZXJzaW9uYCkKLSAqKkZvcmdlIHJlcG8qKiBjbG9uZWQgYW5kIGJ1aWx0IGF0IGBEOlxGb3JnZUNvbW1hbmRlclxmb3JnZS1yZXBvYAoKIyMjIDEuIEJ1aWxkIEZvcmdlIChvbmUtdGltZSkKYGBgcG93ZXJzaGVsbApjZCBEOlxGb3JnZUNvbW1hbmRlclxmb3JnZS1yZXBvCm12biBwYWNrYWdlIC1wbCBmb3JnZS1ndWktZGVza3RvcCAiLURza2lwVGVzdHMiICItRHJldmlzaW9uPTIuMC4xMi1TTkFQU0hPVCIgLWFtCmBgYAoKIyMjIDIuIEJ1aWxkIENvbW1hbmRlciBBSSBMYWIKYGBgcG93ZXJzaGVsbApjZCBEOlxGb3JnZUNvbW1hbmRlclxjb21tYW5kZXItYWktbGFiCm12biBwYWNrYWdlICItRHNraXBUZXN0cyIKYGBgClRoaXMgcHJvZHVjZXMgYHRhcmdldC9jb21tYW5kZXItYWktbGFiLTEuMC4wLVNOQVBTSE9ULmphcmAgKHNoYWRlZCBmYXQgSkFSKS4KCiMjIyAzLiBJbnN0YWxsIFB5dGhvbiBkZXBlbmRlbmNpZXMKYGBgcG93ZXJzaGVsbApwaXAgaW5zdGFsbCBmYXN0YXBpIHV2aWNvcm4KYGBgCgojIyMgNC4gTGF1bmNoIHRoZSBXZWIgVUkKKipPcHRpb24gQSDigJQgT25lLWNsaWNrIGxhdW5jaGVyOioqCmBgYHBvd2Vyc2hlbGwKLlxzdGFydC1sYWIuYmF0CmBgYApFZGl0IHRoZSBwYXRocyBhdCB0aGUgdG9wIG9mIGBzdGFydC1sYWIuYmF0YCBpZiBuZWVkZWQuCgoqKk9wdGlvbiBCIOKAlCBNYW51YWwgbGF1bmNoOioqCmBgYHBvd2Vyc2hlbGwKcHl0aG9uIGxhYl9hcGkucHkgYAogIC0tZm9yZ2UtamFyICJEOlxGb3JnZUNvbW1hbmRlclxmb3JnZS1yZXBvXGZvcmdlLWd1aS1kZXNrdG9wXHRhcmdldFxmb3JnZS1ndWktZGVza3RvcC0yLjAuMTItU05BUFNIT1QtamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphciIgYAogIC0tZm9yZ2UtZGlyICJEOlxGb3JnZUNvbW1hbmRlclxmb3JnZS1yZXBvXGZvcmdlLWd1aSIgYAogIC0tcG9ydCA4MDgwCmBgYAoKT3BlbiBgaHR0cDovL2xvY2FsaG9zdDo4MDgwYCDigJQgc2VsZWN0IDMgZGVja3MsIHNldCBnYW1lIGNvdW50LCBjbGljayAqKlJ1biBBSSBTaW1zKiouCgojIyMgNS4gQ0xJLW9ubHkgdXNhZ2UgKG5vIHdlYiBzZXJ2ZXIpCmBgYHBvd2Vyc2hlbGwKY2QgRDpcRm9yZ2VDb21tYW5kZXJcZm9yZ2UtcmVwb1xmb3JnZS1ndWkKCmphdmEgLWphciAiRDpcRm9yZ2VDb21tYW5kZXJcY29tbWFuZGVyLWFpLWxhYlx0YXJnZXRcY29tbWFuZGVyLWFpLWxhYi0xLjAuMC1TTkFQU0hPVC5qYXIiIGAKICAtLWZvcmdlLWphciAiLi5cZm9yZ2UtZ3VpLWRlc2t0b3BcdGFyZ2V0XGZvcmdlLWd1aS1kZXNrdG9wLTIuMC4xMi1TTkFQU0hPVC1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIiBgCiAgLS1mb3JnZS1kaXIgIi4iIGAKICAtLWRlY2sxICJFZGdhciBNYXJrb3YiIGAKICAtLWRlY2syICJHcmltZ3JpbiIgYAogIC0tZGVjazMgIlh5cmlzIiBgCiAgLS1nYW1lcyAxMDAgYAogIC0tdGhyZWFkcyA0IGAKICAtLW91dHB1dCByZXN1bHRzL2JhdGNoLTEwMC5qc29uCmBgYAoKIyMgU2NhbGluZyBUZXN0cwoKIyMjIFNpbmdsZS10aHJlYWRlZCBiYXNl' +
'bGluZSAoMTAgZ2FtZXMpCmBgYHBvd2Vyc2hlbGwKamF2YSAtamFyIHRhcmdldFxjb21tYW5kZXItYWktbGFiLTEuMC4wLVNOQVBTSE9ULmphciBgCiAgLS1mb3JnZS1qYXIgIi4uLiIgLS1mb3JnZS1kaXIgIi4uLiIgYAogIC0tZGVjazEgIkVkZ2FyIE1hcmtvdiIgLS1kZWNrMiAiR3JpbWdyaW4iIC0tZGVjazMgIlh5cmlzIiBgCiAgLS1nYW1lcyAxMCAtLXRocmVhZHMgMSAtLW91dHB1dCByZXN1bHRzL2Jhc2VsaW5lLTEwLmpzb24KYGBgCgojIyMgTXVsdGktdGhyZWFkZWQgKDEwIGdhbWVzLCAyIHRocmVhZHMpCmBgYHBvd2Vyc2hlbGwKamF2YSAtamFyIHRhcmdldFxjb21tYW5kZXItYWktbGFiLTEuMC4wLVNOQVBTSE9ULmphciBgCiAgLS1mb3JnZS1qYXIgIi4uLiIgLS1mb3JnZS1kaXIgIi4uLiIgYAogIC0tZGVjazEgIkVkZ2FyIE1hcmtvdiIgLS1kZWNrMiAiR3JpbWdyaW4iIC0tZGVjazMgIlh5cmlzIiBgCiAgLS1nYW1lcyAxMCAtLXRocmVhZHMgMiAtLW91dHB1dCByZXN1bHRzL210LTEwLXQyLmpzb24KYGBgCgojIyMgU2NhbGUgdG8gMTAwIGdhbWVzICg0IHRocmVhZHMpCmBgYHBvd2Vyc2hlbGwKamF2YSAtamFyIHRhcmdldFxjb21tYW5kZXItYWktbGFiLTEuMC4wLVNOQVBTSE9ULmphciBgCiAgLS1mb3JnZS1qYXIgIi4uLiIgLS1mb3JnZS1kaXIgIi4uLiIgYAogIC0tZGVjazEgIkVkZ2FyIE1hcmtvdiIgLS1kZWNrMiAiR3JpbWdyaW4iIC0tZGVjazMgIlh5cmlzIiBgCiAgLS1nYW1lcyAxMDAgLS10aHJlYWRzIDQgLS1vdXRwdXQgcmVzdWx0cy9zY2FsZS0xMDAtdDQuanNvbgpgYGAKCiMjIyBNYXhpbXVtIHRocm91Z2hwdXQgdGVzdCAoMTAwIGdhbWVzLCA4IHRocmVhZHMpCmBgYHBvd2Vyc2hlbGwKamF2YSAtamFyIHRhcmdldFxjb21tYW5kZXItYWktbGFiLTEuMC4wLVNOQVBTSE9ULmphciBgCiAgLS1mb3JnZS1qYXIgIi4uLiIgLS1mb3JnZS1kaXIgIi4uLiIgYAogIC0tZGVjazEgIkVkZ2FyIE1hcmtvdiIgLS1kZWNrMiAiR3JpbWdyaW4iIC0tZGVjazMgIlh5cmlzIiBgCiAgLS1nYW1lcyAxMDAgLS10aHJlYWRzIDggLS1zZWVkIDQyIC0tb3V0cHV0IHJlc3VsdHMvc2NhbGUtMTAwLXQ4LXNlZWQ0Mi5qc29uCmBgYAoKIyMjIFBlcmZvcm1hbmNlIGNvbXBhcmlzb24gc2NyaXB0ClJ1biBkaWZmZXJlbnQgdGhyZWFkIGNvdW50cyBhbmQgY29tcGFyZSBzaW1zL3NlYzoKYGBgcG93ZXJzaGVsbAojIEJhc2VsaW5lOiAxIHRocmVhZApqYXZhIC1qYXIgdGFyZ2V0XGNvbW1hbmRlci1haS1sYWItMS4wLjAtU05BUFNIT1QuamFyIC0tZm9yZ2UtamFyICIuLi4iIC0tZm9yZ2UtZGlyICIuLi4iIC0tZGVjazEgIkVkZ2FyIE1hcmtvdiIgLS1kZWNrMiAiR3JpbWdyaW4iIC0tZGVjazMgIlh5cmlzIiAtLWdhbWVzIDIwIC0tdGhyZWFkcyAxIC0tc2VlZCA0MiAtLW91dHB1dCByZXN1bHRzL3BlcmYtdDEuanNvbgoKIyAyIHRocmVhZHMKamF2YSAtamFyIHRhcmdldFxjb21tYW5kZXItYWktbGFiLTEuMC4wLVNOQVBTSE9ULmphciAtLWZvcmdlLWphciAiLi4uIiAtLWZvcmdlLWRpciAiLi4uIiAtLWRlY2sxICJFZGdhciBNYXJrb3YiIC0tZGVjazIgIkdyaW1ncmluIiAtLWRlY2szICJYeXJpcyIgLS1nYW1lcyAyMCAtLXRocmVhZHMgMiAtLXNlZWQgNDIgLS1vdXRwdXQgcmVzdWx0cy9wZXJmLXQyLmpzb24KCiMgNCB0aHJlYWRzCmphdmEgLWphciB0YXJnZXRcY29tbWFuZGVyLWFpLWxhYi0xLjAuMC1TTkFQU0hPVC5qYXIgLS1mb3JnZS1qYXIgIi4uLiIgLS1mb3JnZS1kaXIgIi4uLiIgLS1kZWNrMSAiRWRnYXIgTWFya292IiAtLWRlY2syICJHcmltZ3JpbiIgLS1kZWNrMyAiWHlyaXMiIC0tZ2FtZXMgMjAgLS10aHJlYWRzIDQgLS1zZWVkIDQyIC0tb3V0cHV0IHJlc3VsdHMvcGVyZi10NC5qc29uCgojIDggdGhyZWFkcwpqYXZhIC1qYXIgdGFyZ2V0XGNvbW1hbmRlci1haS1sYWItMS4wLjAtU05BUFNIT1QuamFyIC0tZm9yZ2UtamFyICIuLi4iIC0tZm9yZ2UtZGlyICIuLi4iIC0tZGVjazEgIkVkZ2FyIE1hcmtvdiIgLS1kZWNrMiAiR3JpbWdyaW4iIC0tZGVjazMgIlh5cmlzIiAtLWdhbWVzIDIwIC0tdGhyZWFkcyA4IC0tc2VlZCA0MiAtLW91dHB1dCByZXN1bHRzL3BlcmYtdDguanNvbgpgYGAKClRoZW4gY29tcGFyZSB0aGUgYHNpbXNQZXJTZWNvbmRgIHZhbHVlcyBpbiBlYWNoIG91dHB1dCBKU09OIHRvIHNlZSBzY2FsaW5nIGJlaGF2aW9yLgoKIyMgQVBJIFJlZmVyZW5jZQoKfCBFbmRwb2ludCB8IE1ldGhvZCB8IERlc2NyaXB0aW9uIHwKfC0tLXwt' +
'LS18LS0tfAp8IGAvYXBpL2xhYi9kZWNrc2AgfCBHRVQgfCBMaXN0IGF2YWlsYWJsZSBDb21tYW5kZXIgZGVja3MgfAp8IGAvYXBpL2xhYi9zdGFydGAgfCBQT1NUIHwgU3RhcnQgYSBiYXRjaCBydW4gKHJldHVybnMgYmF0Y2hJZCkgfAp8IGAvYXBpL2xhYi9zdGF0dXM/YmF0Y2hJZD1YYCB8IEdFVCB8IFBvbGwgcHJvZ3Jlc3MgZm9yIGEgcnVubmluZyBiYXRjaCB8CnwgYC9hcGkvbGFiL3Jlc3VsdD9iYXRjaElkPVhgIHwgR0VUIHwgR2V0IGNvbXBsZXRlZCBiYXRjaCByZXN1bHQgSlNPTiB8CnwgYC9hcGkvbGFiL2xvZz9iYXRjaElkPVhgIHwgR0VUIHwgR2V0IGxpdmUgbG9nIGxpbmVzIGZyb20gcnVubmluZyBiYXRjaCB8CnwgYC9hcGkvbGFiL2hpc3RvcnlgIHwgR0VUIHwgTGlzdCBwYXN0IGJhdGNoIHJlc3VsdCBmaWxlcyB8CgojIyMgUE9TVCAvYXBpL2xhYi9zdGFydApgYGBqc29uCnsKICAiZGVja3MiOiBbIkVkZ2FyIE1hcmtvdiIsICJHcmltZ3JpbiIsICJYeXJpcyJdLAogICJudW1HYW1lcyI6IDEwMCwKICAidGhyZWFkcyI6IDQsCiAgInNlZWQiOiBudWxsLAogICJjbG9jayI6IDEyMAp9CmBgYAoKIyMjIEdFVCAvYXBpL2xhYi9zdGF0dXMgcmVzcG9uc2UKYGBganNvbgp7CiAgImJhdGNoSWQiOiAiYWJjMTIzIiwKICAicnVubmluZyI6IHRydWUsCiAgImNvbXBsZXRlZCI6IDQyLAogICJ0b3RhbCI6IDEwMCwKICAidGhyZWFkcyI6IDQsCiAgImVsYXBzZWRNcyI6IDE1NjAwMCwKICAiZXJyb3IiOiBudWxsCn0KYGBgCgojIyBQeXRob24gU2ltdWxhdG9yIChNb250ZSBDYXJsbyBFbmdpbmUpCgpBIHB1cmUtUHl0aG9uIGRlY2sgc2ltdWxhdG9yIGZvciByYXBpZCBNb250ZSBDYXJsbyBhbmFseXNpcyDigJQgbm8gRm9yZ2UgSlZNIHJlcXVpcmVkLgpQb3J0ZWQgZnJvbSB0aGUgW210Zy1jb21tYW5kZXItbGFuXShodHRwczovL2dpdGh1Yi5jb20vKSBOb2RlLmpzIHNpbXVsYXRvci4KCiMjIyBMb2NhdGlvbgoKYGBgCnNyYy9jb21tYW5kZXJfYWlfbGFiLwrilJzilIDilIAgX19pbml0X18ucHkK4pSc4pSA4pSAIHNpbS8gICAgICAgICAgICAgICAgICAgICAgICAgIyBDb3JlIHNpbXVsYXRpb24gZW5naW5lCuKUgiAgIOKUnOKUgOKUgCBfX2luaXRfXy5weSAgICAgICAgICAgICAgIyBQdWJsaWMgZXhwb3J0cwrilIIgICDilJzilIDilIAgbW9kZWxzLnB5ICAgICAgICAgICAgICAgICMgQ2FyZCwgUGxheWVyLCBTaW1TdGF0ZSwgR2FtZVJlc3VsdCwgUGxheWVyU3RhdHMK4pSCICAg4pSc4pSA4pSAIGVuZ2luZS5weSAgICAgICAgICAgICAgICAjIEdhbWVFbmdpbmUg4oCUIHR1cm4gbG9vcCwgY29tYmF0IChmbHlpbmcvdHJhbXBsZS9kZWF0aHRvdWNoL2xpZmVsaW5rL21lbmFjZS9yZWFjaCkK4pSCICAg4pSU4pSA4pSAIHJ1bGVzLnB5ICAgICAgICAgICAgICAgICAjIEFJX0RFRkFVTFRfV0VJR0hUUywgZW5yaWNoX2NhcmQoKSwgc2NvcmVfY2FyZCgpLCBwYXJzZV9kZWNrbGlzdCgpCuKUlOKUgOKUgCBsYWIvICAgICAgICAgICAgICAgICAgICAgICAgICMgSGlnaC1sZXZlbCBleHBlcmltZW50IGhlbHBlcnMKICAgIOKUnOKUgOKUgCBfX2luaXRfXy5weQogICAg4pSU4pSA4pSAIGV4cGVyaW1lbnRzLnB5ICAgICAgICAgICAjIGJ1aWxkX2RlY2soKSwgcnVuX3NpbmdsZV9nYW1lKCksIHJ1bl9zaW11bGF0aW9uKCksIF9jbGlfbWFpbigpCmBgYAoKIyMjIEluc3RhbGwgYXMgZWRpdGFibGUgcGFja2FnZQoKYGBgcG93ZXJzaGVsbApjZCBEOlxGb3JnZUNvbW1hbmRlclxjb21tYW5kZXItYWktbGFiCnBpcCBpbnN0YWxsIC1lIC4KYGBgCgpUaGlzIGluc3RhbGxzIGBjb21tYW5kZXJfYWlfbGFiYCBhcyBhbiBpbXBvcnRhYmxlIHBhY2thZ2UgYW5kIHJlZ2lzdGVycyB0aGUgYGNvbW1hbmRlci1zaW1gIENMSSBjb21tYW5kLgoKIyMjIFF1aWNrIHNtb2tlIHRlc3QKCmBgYHBvd2Vyc2hlbGwKcHl0aG9uIC1tIGNvbW1hbmRlcl9haV9sYWIubGFiLmV4cGVyaW1lbnRzCmBgYAoKRXhwZWN0ZWQgb3V0cHV0IOKAlCBhIDEwLWdhbWUgTW9udGUgQ2FybG8gcnVuIG9mIGEgc2FtcGxlICJLb3J2b2xkIiBkZWNrOgoKYGBgCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogIENvbW1hbmRlciBBSSBMYWIg4oCUIEV4cGVyaW1lbnQgUnVubmVyCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKLS0tIERlbW86IEtvcnZvbGQgQXJpc3RvY3JhdHMgKDEwIGdhbWVzKSAtLS0KCiAgV2luIHJhdGU6ICAgICAgICAgIFhYLlglCiAgQXZnIHR1cm5zOiAgICAgICAgIFhYLlgKICBBdmcgZGFtYWdlIGRlYWx0OiAgWFguWAogIEF2ZyBzcGVsbHMgY2FzdDogICBYWC5YCiAgQXZnIGNyZWF0dXJlczogICAgIFhYLlgKICBFbGFwc2VkOiAgICAgICAgICAgMC4wMnMKCiAgRG9uZS4KYGBgCgojIyMgUHl0aG9uIEFQSQoKYGBgcHl0aG9uCmZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0ubW9kZWxzIGltcG9ydCBDYXJkCmZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0uZW5naW5lIGltcG9ydCBHYW1lRW5naW5lCmZyb20gY29tbWFuZGVyX2FpX2xhYi5sYWIuZXhwZXJpbWVudHMgaW1wb3J0IGJ1aWxkX2RlY2ssIHJ1bl9zaW11bGF0aW9uCgojIEJ1aWxkIGEgZGVjayBmcm9tIGNhcmQgbmFtZXMKZGVjayA9IGJ1aWxkX2RlY2soWyJTb2wgUmluZyIsICJDdWx0aXZhdGUiLCAiTGlnaHRuaW5nIEJvbHQiLCAiRm9yZXN0Il0gKyBbIkZvcmVzdCJdICogMzYpCgojIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gKDEwMCBnYW1lcykKc3RhdHMgPSBydW5fc2ltdWxhdGlvbihkZWNrLCBudW1fZ2FtZXM9MTAwLCBuYW1lX2E9Ik15IERlY2siKQpwcmludChmIldpbiByYXRlOiB7c3RhdHNbJ3dpbl9yYXRlJ106LjElfSIpCnByaW50KGYiQXZnIHR1cm5zOiB7c3RhdHNbJ2F2Z190dXJucyddOi4xZn0iKQpgYGAKCktleSBmdW5jdGlvbnM6Cgp8IEZ1bmN0aW9uIHwgRGVzY3JpcHRpb24gfAp8LS0tfC0tLXwKfCBgYnVpbGRfZGVjayhjYXJkX25hbWVzKWAgfCBDcmVhdGUgZW5yaWNoZWQgYENhcmRgIGxpc3QgZnJvbSBuYW1lcyB8CnwgYGJ1aWxkX2RlY2tfZnJvbV90ZXh0KGRlY2tsaXN0KWAgfCBQYXJzZSBgIjEgU29sIFJpbmdcbjM3IEZvcmVzdCJgIGZvcm1hdCB8CnwgYHJ1bl9zaW5nbGVfZ2FtZShkZWNrX2EsIGRlY2tfYilgIHwgT25lIGdhbWUsIHJldHVybnMgd2lubmVyL3R1cm5zL3N0YXRzIHwKfCBgcnVuX3NpbXVsYXRpb24oZGVja19hLCBkZWNrX2IsIG4pYCB8IE1vbnRlIENhcmxvIG92ZXIgYG5gIGdhbWVzLCBhZ2dyZWdhdGVkIHN0YXRzIHwKCiMjIyBDTEkgZW50cnkgcG9pbnQKCkFmdGVyIGBwaXAgaW5zdGFsbCAtZSAuYDoKCmBgYHBvd2Vyc2hlbGwKY29tbWFuZGVyLXNpbQpgYGAKClJ1bnMgdGhlIHNhbWUgZGVtbyBhcyBgcHl0aG9uIC1tIGNvbW1hbmRlcl9haV9sYWIubGFiLmV4cGVyaW1lbnRzYC4KCiMjIyBIb3cgdGhlIGVuZ2luZSB3b3JrcwoKMS4gKipEZWNrIGVucmljaG1lbnQqKiDigJQgYGVucmljaF9jYXJkKClgIGluZmVycyB0eXBlLCBDTUMsIGtleXdvcmRzLCBhbmQgcG93ZXIvdG91Z2huZXNzIGZyb20gY2FyZCBuYW1lIGhldXJpc3RpY3Mgd2hlbiBTY3J5ZmFsbCBkYXRhIGlzIHVuYXZhaWxhYmxlLgoyLiAqKkFJIHNjb3JpbmcqKiDigJQgYHNjb3JlX2NhcmQoKWAgdXNlcyB3ZWlnaHRlZCBjYXRlZ29yaWVzIChyZW1vdmFsLCByYW1wLCBkcmF3LCBhZ2dybywgZXRjLikgdG8gcGljayB0aGUgYmVzdCBwbGF5IGVhY2ggdHVybi4KMy4gKipHYW1lIGxvb3AqKiDigJQgRWFjaCB0dXJuOiB1bnRhcCDihpIgZHJhdyDihpIgcGxheSBsYW5kcyDihpIgY2FzdCBzcGVsbHMgKEFJIHNjb3JlZCkg4oaSIGNvbWJhdCAoYXR0YWNrL2Jsb2NrIGRlY2lzaW9ucykg4oaSIGVuZCBzdGVwLiBGdWxsIGtleXdvcmQgc3VwcG9ydCBmb3IgZmx5aW5nLCB0cmFtcGxlLCBkZWF0aHRvdWNoLCBsaWZlbGluaywgbWVuYWNlLCBhbmQgcmVhY2guCjQuICoqTW9udGUgQ2FybG8qKiDigJQgYHJ1bl9zaW11bGF0aW9uKClgIHJ1bnMgTiBpbmRlcGVuZGVudCBnYW1lcyBhbmQgYWdncmVnYXRlcyB3aW4gcmF0ZSwgYXZnIHR1cm5zLCBkYW1hZ2UgZGVhbHQvcmVjZWl2ZWQsIHNwZWxscyBjYXN0LCBjcmVhdHVyZXMgcGxheWVkLCByZW1vdmFsIHVzZWQsIHJhbXAgcGxheWVkLCBjYXJkcyBkcmF3biwgYW5kIG1heCBib2FyZCBzaXplLgoKIyMgUHJvamVjdCBTdHJ1Y3R1cmUKCmBgYApjb21tYW5kZXItYWktbGFiLwrilJzilIDilIAgbGFiX2FwaS5weSAgICAgICAgICAgICAgICAgICAgIyBQeXRob24gRmFzdEFQSSBzZXJ2ZXIgKHdlYiBVSSBiYWNrZW5kKQrilJzilIDilIAgc3RhcnQtbGFiLmJhdCAgICAgICAg' +
'ICAgICAgICAgIyBXaW5kb3dzIG9uZS1jbGljayBsYXVuY2hlcgrilJzilIDilIAgcG9tLnhtbCAgICAgICAgICAgICAgICAgICAgICAgIyBNYXZlbiBidWlsZCAoSmF2YSAxNywgc2hhZGVkIEpBUikK4pSc4pSA4pSAIHB5cHJvamVjdC50b21sICAgICAgICAgICAgICAgICMgUHl0aG9uIHBhY2thZ2UgY29uZmlnIChzcmMvIGxheW91dCkK4pSc4pSA4pSAIHVpLwrilIIgICDilJzilIDilIAgaW5kZXguaHRtbCAgICAgICAgICAgICAgICAjIFdlYiBVSSBlbnRyeSBwb2ludArilIIgICDilJzilIDilIAgYWktbGFiLmpzICAgICAgICAgICAgICAgICAjIFVJIGNvbnRyb2xsZXIgKGRlY2sgc2VsZWN0aW9uLCBwcm9ncmVzcywgcmVzdWx0cykK4pSCICAg4pSc4pSA4pSAIGFpLWxhYi5jc3MgICAgICAgICAgICAgICAgIyBTdHlsZXMgKGRhcmsgdGhlbWUsIHJlc3BvbnNpdmUpCuKUgiAgIOKUnOKUgOKUgCBjb2xsZWN0aW9uLmh0bWwgICAgICAgICAgICMgQ2FyZCBjb2xsZWN0aW9uIG1hbmFnZXIK4pSCICAg4pSc4pSA4pSAIGNvbGxlY3Rpb24uanMgICAgICAgICAgICAgIyBDb2xsZWN0aW9uIGNvbnRyb2xsZXIK4pSCICAg4pSc4pSA4pSAIGNvbGxlY3Rpb24uY3NzICAgICAgICAgICAgIyBDb2xsZWN0aW9uIHN0eWxlcwrilIIgICDilJzilIDilIAgZGVja2J1aWxkZXIuaHRtbCAgICAgICAgICAjIERlY2sgYnVpbGRlciArIEVESCBhZHZpc29yCuKUgiAgIOKUnOKUgOKUgCBkZWNrYnVpbGRlci5qcyAgICAgICAgICAgICMgRGVjayBidWlsZGVyIGNvbnRyb2xsZXIK4pSCICAg4pSU4pSA4pSAIGRlY2tidWlsZGVyLmNzcyAgICAgICAgICAgIyBEZWNrIGJ1aWxkZXIgc3R5bGVzCuKUnOKUgOKUgCBzcmMvY29tbWFuZGVyX2FpX2xhYi8gICAgICAgICAjIFB5dGhvbiBzaW11bGF0b3IgcGFja2FnZQrilIIgICDilJzilIDilIAgX19pbml0X18ucHkK4pSCICAg4pSc4pSA4pSAIHNpbS8gICAgICAgICAgICAgICAgICAgICAgIyBDb3JlIGVuZ2luZSAobW9kZWxzLCBlbmdpbmUsIHJ1bGVzKQrilIIgICDilJTilIDilIAgbGFiLyAgICAgICAgICAgICAgICAgICAgICAjIEV4cGVyaW1lbnQgaGVscGVycwrilJzilIDilIAgc3JjL21haW4vamF2YS9jb21tYW5kZXJhaWxhYi8gIyBKYXZhIGJhdGNoIHJ1bm5lciAoRm9yZ2UgaW50ZWdyYXRpb24pCuKUgiAgIOKUnOKUgOKUgCBjbGkvTGFiQ2xpLmphdmEgICAgICAgICAgICMgQ0xJIGVudHJ5IHBvaW50IChwaWNvY2xpKQrilIIgICDilJzilIDilIAgYmF0Y2gvCuKUgiAgIOKUgiAgIOKUnOKUgOKUgCBCYXRjaFJ1bm5lci5qYXZhICAgICAgIyBTaW5nbGUtdGhyZWFkIHJ1bm5lciAocGFyc2VzIEZvcmdlIG91dHB1dCkK4pSCICAg4pSCICAg4pSU4pSA4pSAIE11bHRpVGhyZWFkQmF0Y2hSdW5uZXIuamF2YSAgIyBNdWx0aS10aHJlYWQgcnVubmVyIChFeGVjdXRvclNlcnZpY2UpCuKUgiAgIOKUnOKUgOKUgCBicmlkZ2UvV2ViQXBpQnJpZGdlLmphdmEgICMgSmF2YS1zaWRlIHdlYiBBUEkgYnJpZGdlCuKUgiAgIOKUnOKUgOKUgCBzY2hlbWEvCuKUgiAgIOKUgiAgIOKUnOKUgOKUgCBCYXRjaFJlc3VsdC5qYXZhICAgICAgIyBEYXRhIG1vZGVsIFBPSk9zCuKUgiAgIOKUgiAgIOKUlOKUgOKUgCBKc29uRXhwb3J0ZXIuamF2YSAgICAgIyBKU09OIHNlcmlhbGl6YXRpb24gKyB2YWxpZGF0aW9uCuKUgiAgIOKUnOKUgOKUgCBzdGF0cy9TdGF0c0FnZ3JlZ2F0b3IuamF2YSAjIFdpbiByYXRlcywgdHVybiBjb3VudHMsIGJyZWFrZG93bnMK4pSCICAg4pSU4pSA4pSAIGFpLwrilIIgICAgICAg4pSc4pSA4pSAIEFpUG9saWN5LmphdmEgICAgICAgICAjIFBvbGljeSBpbnRlcmZhY2UK4pSCICAgICAgIOKUlOKUgOKUgCBGb3JnZUJ1aWx0aW5Qb2xpY3kuamF2YSAjIHYxIEZvcmdlIEFJIHdyYXBwZXIK4pSc4pSA4pSAIHNjYW5uZXIvICAgICAgICAgICAgICAgICAgICAgICMgQ2FyZCBzY2FubmVyIChPQ1IgcGlwZWxpbmUpCuKUgiAgIOKUnOKUgOKUgCBfX2luaXRfXy5weQrilIIgICDilJzilIDilIAgb2NyLnB5ICAgICAgICAgICAgICAgICAgICAjIFRlc3NlcmFjdCBPQ1Igd3JhcHBlcgrilIIgICDilJzilIDilIAgcGlwZWxpbmUucHkgICAgICAgICAgICAgICAjIEltYWdlIHByZXByb2Nlc3NpbmcgcGlwZWxpbmUK4pSCICAg4pSU4pSA4pSAIHByZXByb2Nlc3MucHkgICAgICAgICAgICAgIyBJbWFnZSBwcmVwcm9jZXNzaW5nIGhlbHBlcnMK4pSc4pSA4pSAIGRvY3MvCuKUgiAgIOKUnOKUgOKUgCBQUk9KRUNUX1ZJU0lPTi5tZAri' +
'lIIgICDilJzilIDilIAgYmF0Y2gtcmVzdWx0LXNjaGVtYS5qc29uCuKUgiAgIOKUlOKUgOKUgCBnYW1lLWxvZy1zY2hlbWEuanNvbgrilJzilIDilIAgc2FtcGxlLWRlY2tzLyAgICAgICAgICAgICAgICAgIyAzIHNhbXBsZSAuZGNrIGZpbGVzCuKUnOKUgOKUgCBwcmVjb24tZGVja3MvICAgICAgICAgICAgICAgICAjIFByZWNvbnN0cnVjdGVkIGRlY2tzICsgaW5kZXgK4pSc4pSA4pSAIHJlc3VsdHMvICAgICAgICAgICAgICAgICAgICAgICMgQmF0Y2ggb3V0cHV0IEpTT04gZmlsZXMgKGdpdGlnbm9yZWQpCuKUlOKUgOKUgCBzcmMvdGVzdC9qYXZhLyAgICAgICAgICAgICAgICAjIFVuaXQgdGVzdHMKYGBgCgojIyBPdXRwdXQgRm9ybWF0CgpFYWNoIGJhdGNoIHJ1biBwcm9kdWNlcyBKU09OIGNvbmZvcm1pbmcgdG8gYGRvY3MvYmF0Y2gtcmVzdWx0LXNjaGVtYS5qc29uYDoKYGBganNvbgp7CiAgIm1ldGFkYXRhIjogewogICAgInNjaGVtYVZlcnNpb24iOiAiMS4wLjAiLAogICAgImJhdGNoSWQiOiAidXVpZCIsCiAgICAidGltZXN0YW1wIjogIjIwMjYtMDMtMDZULi4uIiwKICAgICJ0b3RhbEdhbWVzIjogMTAwLAogICAgImNvbXBsZXRlZEdhbWVzIjogMTAwLAogICAgImZvcm1hdCI6ICJjb21tYW5kZXIiLAogICAgInBvZFNpemUiOiAzLAogICAgImVuZ2luZVZlcnNpb24iOiAiZm9yZ2UtMi4wLjEyLVNOQVBTSE9UIiwKICAgICJtYXN0ZXJTZWVkIjogNDIsCiAgICAidGhyZWFkcyI6IDQsCiAgICAiZWxhcHNlZE1zIjogMjYwMDAwCiAgfSwKICAiZGVja3MiOiBbLi4uXSwKICAiZ2FtZXMiOiBbLi4uXSwKICAic3VtbWFyeSI6IHsKICAgICJwZXJEZWNrIjogWwogICAgICB7ICJkZWNrTmFtZSI6ICJFZGdhciBNYXJrb3YiLCAid2luUmF0ZSI6IDAuNjAsICJ3aW5zIjogNjAsIC4uLiB9CiAgICBdLAogICAgImF2Z0dhbWVUdXJucyI6IDEyLjMsCiAgICAic2ltc1BlclNlY29uZCI6IDAuMzgKICB9Cn0KYGBgCgojIyBLbm93biBMaW1pdGF0aW9ucwotIFdpbm5lcidzIGxpZmUgdG90YWwgbm90IGNhcHR1cmVkIChGb3JnZSBxdWlldCBtb2RlIG9ubHkgcmVwb3J0cyBsb3NlcnMpCi0gV2luIGNvbmRpdGlvbiBjbGFzc2lmaWNhdGlvbiBpcyBoZXVyaXN0aWMtYmFzZWQgb24gRm9yZ2UgbG9zcyByZWFzb24gc3RyaW5ncwotIEVhY2ggZ2FtZSBzcGF3bnMgYSBuZXcgSlZNIHByb2Nlc3MgKH4yLTNzIG92ZXJoZWFkIHBlciBnYW1lKQotIE1heCB0aHJvdWdocHV0IH4wLjA0IHNpbXMvc2VjIHNpbmdsZS10aHJlYWRlZCAoRm9yZ2Ugc2ltIGlzIENQVS1oZWF2eSkKLSBNdWx0aXRocmVhZGluZyBzcGF3bnMgcGFyYWxsZWwgc3VicHJvY2Vzc2VzIOKAlCB0aHJvdWdocHV0IHNjYWxlcyBsaW5lYXJseSB3aXRoIHRocmVhZHMgdXAgdG8gQ1BVIGNvcmUgY291bnQK'
Install-B64 -R 'README.md' -B $b
# coach/__init__.py (87 bytes)
$b = 'IyBDb21tYW5kZXIgQUkgTGFiIOKAlCBDb2FjaCBNb2R1bGUKIyBMTE0tcG93ZXJlZCBkZWNrIGNvYWNoaW5nIHdpdGggZW1iZWRkaW5ncyBzZWFyY2gK'
Install-B64 -R 'coach\__init__.py' -B $b
# coach/clients/__init__.py (42 bytes)
$b = 'IyBDb2FjaCBjbGllbnRzIOKAlCBQZXJwbGV4aXR5LCBMTSBTdHVkaW8K'
Install-B64 -R 'coach\clients\__init__.py' -B $b
# coach/clients/perplexity_client.py (9,727 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFBlcnBsZXhpdHkgU29uYXIgU3RydWN0dXJlZCBPdXRwdXQgQ2xpZW50CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApVc2VzIHRoZSBvcGVuYWkgU0RLIHRvIGNhbGwgUGVycGxleGl0eSdzIGNoYXQvY29tcGxldGlvbnMgZW5kcG9pbnQKd2l0aCByZXNwb25zZV9mb3JtYXQ6IGpzb25fc2NoZW1hIGZvciBndWFyYW50ZWVkIHN0cnVjdHVyZWQgb3V0cHV0LgoKU3VwcG9ydHMgYm90aCBzb25hciAoZmFzdCwgY2hlYXApIGFuZCBzb25hci1wcm8gKGRlZXAsIHRob3JvdWdoKS4KIiIiCgppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgYXN5bmNpbwpmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwKCmZyb20gb3BlbmFpIGltcG9ydCBPcGVuQUkKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb2FjaC5wcGx4IikKCiMg4pSA4pSAIFBlcnBsZXhpdHkgTW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApTT05BUiA9ICJzb25hciIKU09OQVJfUFJPID0gInNvbmFyLXBybyIKU09OQVJfREVFUF9SRVNFQVJDSCA9ICJzb25hci1kZWVwLXJlc2VhcmNoIgoKCmNsYXNzIFBlcnBsZXhpdHlSZXNwb25zZToKICAgICIiIlBhcnNlZCByZXNwb25zZSBjb250YWluZXIgZnJvbSBQZXJwbGV4aXR5IEFQSS4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZW50OiBzdHIsIHBhcnNlZF9qc29uOiBPcHRpb25hbFtkaWN0XSwKICAgICAgICAgICAgICAgICBwcm9tcHRfdG9rZW5zOiBpbnQsIGNvbXBsZXRpb25fdG9rZW5zOiBpbnQsCiAgICAgICAgICAgICAgICAgbW9kZWw6IHN0ciwgY2l0YXRpb25zOiBsaXN0W3N0cl0gPSBOb25lKToKICAgICAgICBzZWxmLmNvbnRlbnQgPSBjb250ZW50CiAgICAgICAgc2VsZi5wYXJzZWRfanNvbiA9IHBhcnNlZF9qc29uCiAgICAgICAgc2VsZi5wcm9tcHRfdG9rZW5zID0gcHJvbXB0X3Rva2VucwogICAgICAgIHNlbGYuY29tcGxldGlvbl90b2tlbnMgPSBjb21wbGV0aW9uX3Rva2VucwogICAgICAgIHNlbGYubW9kZWwgPSBtb2RlbAogICAgICAgIHNlbGYuY2l0YXRpb25zID0gY2l0YXRpb25zIG9yIFtdCgogICAgQHByb3BlcnR5CiAgICBkZWYgb2soc2VsZikgLT4gYm9vbDoKICAgICAgICByZXR1cm4gc2VsZi5wYXJzZWRfanNvbiBpcyBub3QgTm9uZQoKCmNsYXNzIFBlcnBsZXhpdHlDbGllbnQ6CiAgICAiIiIKICAgIFBlcnBsZXhpdHkgU29uYXIgQVBJIGNsaWVudCB1c2luZyB0aGUgb3BlbmFpIFNESy4KCiAgICBVc2FnZToKICAgICAgICBjbGllbnQgPSBQZXJwbGV4aXR5Q2xpZW50KGFwaV9rZXk9InBwbHgtLi4uIikKICAgICAgICByZXNwID0gY2xpZW50LmNoYXRfc3RydWN0dXJlZCgKICAgICAgICAgICAgc3lzdGVtX3Byb21wdD0iWW91IGFyZSBhIGRlY2sgYnVpbGRlci4iLAogICAgICAgICAgICB1c2VyX3Byb21wdD0iQnVpbGQgYSBkZWNrIGZvci4uLiIsCiAgICAgICAgICAgIGpzb25fc2NoZW1hPWRlY2tfc2NoZW1hLAogICAgICAgICAgICBzY2hlbWFfbmFtZT0iRGVja0xpc3QiLAogICAgICAgICkKICAgICAgICBpZiByZXNwLm9rOgogICAgICAgICAgICBkZWNrID0gcmVzcC5wYXJzZWRfanNvbgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFwaV9rZXk6IHN0ciwgbW9kZWw6IHN0ciA9IFNPTkFSLAogICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGludCA9IDEyMCk6CiAgICAgICAgaWYgbm90IGFwaV9rZXk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBlcnBsZXhpdHkgQVBJIGtleSBpcyByZXF1aXJlZCIpCiAgICAgICAgc2VsZi5hcGlfa2V5ID0gYXBpX2tleQogICAgICAgIHNlbGYubW9kZWwgPSBtb2RlbAogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICBzZWxmLl9jbGllbnQgPSBPcGVuQUkoCiAgICAgICAgICAgIGFwaV9rZXk9YXBpX2tleSwKICAgICAgICAgICAgYmFzZV91cmw9Imh0dHBzOi8vYXBpLnBlcnBsZXhpdHkuYWkiLAogICAgICAg' +
'ICAgICB0aW1lb3V0PXRpbWVvdXQsCiAgICAgICAgKQoKICAgIGRlZiBjaGF0X3N0cnVjdHVyZWQoCiAgICAgICAgc2VsZiwKICAgICAgICBzeXN0ZW1fcHJvbXB0OiBzdHIsCiAgICAgICAgdXNlcl9wcm9tcHQ6IHN0ciwKICAgICAgICBqc29uX3NjaGVtYTogZGljdCwKICAgICAgICBzY2hlbWFfbmFtZTogc3RyID0gInJlc3BvbnNlIiwKICAgICAgICBtb2RlbDogc3RyID0gTm9uZSwKICAgICAgICB0ZW1wZXJhdHVyZTogZmxvYXQgPSAwLjIsCiAgICAgICAgbWF4X3Rva2VuczogaW50ID0gODE5MiwKICAgICkgLT4gUGVycGxleGl0eVJlc3BvbnNlOgogICAgICAgICIiIgogICAgICAgIFNlbmQgYSBjaGF0IHJlcXVlc3Qgd2l0aCBzdHJ1Y3R1cmVkIEpTT04gb3V0cHV0LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzeXN0ZW1fcHJvbXB0OiBTeXN0ZW0gbWVzc2FnZQogICAgICAgICAgICB1c2VyX3Byb21wdDogVXNlciBtZXNzYWdlCiAgICAgICAgICAgIGpzb25fc2NoZW1hOiBKU09OIFNjaGVtYSBkaWN0IGZvciByZXNwb25zZV9mb3JtYXQKICAgICAgICAgICAgc2NoZW1hX25hbWU6IE5hbWUgZm9yIHRoZSBzY2hlbWEgKHVzZWQgaW4gcmVzcG9uc2VfZm9ybWF0KQogICAgICAgICAgICBtb2RlbDogT3ZlcnJpZGUgbW9kZWwgKHNvbmFyLCBzb25hci1wcm8pCiAgICAgICAgICAgIHRlbXBlcmF0dXJlOiBTYW1wbGluZyB0ZW1wZXJhdHVyZSAoMC4w4oCTMS4wKQogICAgICAgICAgICBtYXhfdG9rZW5zOiBNYXggb3V0cHV0IHRva2VucwoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBQZXJwbGV4aXR5UmVzcG9uc2Ugd2l0aCBwYXJzZWRfanNvbiBndWFyYW50ZWVkIGJ5IHNjaGVtYQogICAgICAgICIiIgogICAgICAgIHVzZV9tb2RlbCA9IG1vZGVsIG9yIHNlbGYubW9kZWwKCiAgICAgICAgbWVzc2FnZXMgPSBbCiAgICAgICAgICAgIHsicm9sZSI6ICJzeXN0ZW0iLCAiY29udGVudCI6IHN5c3RlbV9wcm9tcHR9LAogICAgICAgICAgICB7InJvbGUiOiAidXNlciIsICJjb250ZW50IjogdXNlcl9wcm9tcHR9LAogICAgICAgIF0KCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSgKICAgICAgICAgICAgICAgIG1vZGVsPXVzZV9tb2RlbCwKICAgICAgICAgICAgICAgIG1lc3NhZ2VzPW1lc3NhZ2VzLAogICAgICAgICAgICAgICAgdGVtcGVyYXR1cmU9dGVtcGVyYXR1cmUsCiAgICAgICAgICAgICAgICBtYXhfdG9rZW5zPW1heF90b2tlbnMsCiAgICAgICAgICAgICAgICByZXNwb25zZV9mb3JtYXQ9ewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImpzb25fc2NoZW1hIiwKICAgICAgICAgICAgICAgICAgICAianNvbl9zY2hlbWEiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2NoZW1hX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJzY2hlbWEiOiBqc29uX3NjaGVtYSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY2hvaWNlID0gcmVzcG9uc2UuY2hvaWNlc1swXQogICAgICAgICAgICBjb250ZW50ID0gY2hvaWNlLm1lc3NhZ2UuY29udGVudCBvciAiIgogICAgICAgICAgICB1c2FnZSA9IHJlc3BvbnNlLnVzYWdlCgogICAgICAgICAgICAjIFBhcnNlIHRoZSBzdHJ1Y3R1cmVkIEpTT04KICAgICAgICAgICAgcGFyc2VkID0gTm9uZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXJzZWQgPSBqc29uLmxvYWRzKGNvbnRlbnQpCiAgICAgICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFR5cGVFcnJvcikgYXMgZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJGYWlsZWQgdG8gcGFyc2Ugc3RydWN0dXJlZCByZXNwb25zZTogJXMiLCBlKQogICAgICAgICAgICAgICAgIyBGYWxsYmFjazogdHJ5IGV4dHJhY3RpbmcgSlNPTiBvYmplY3QKICAgICAgICAgICAgICAgIHBhcnNlZCA9IHNlbGYuX2V4dHJhY3RfanNvbihjb250ZW50KQoKICAgICAgICAgICAgIyBFeHRyYWN0IGNpdGF0aW9ucyBpZiBhdmFpbGFibGUKICAgICAgICAgICAgY2l0YXRpb25zID0gW10KICAgICAgICAgICAgaWYgaGFzYXR0cihyZXNwb25zZSwgJ2NpdGF0aW9ucycpIGFuZCByZXNwb25zZS5jaXRhdGlvbnM6CiAgICAgICAgICAgICAgICBjaXRhdGlvbnMgPSByZXNwb25zZS5jaXRhdGlvbnMKCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAog' +
'ICAgICAgICAgICAgICAgIltwcGx4XSBtb2RlbD0lcyB0b2tlbnM9KCVkIHByb21wdCwgJWQgY29tcGxldGlvbikgcGFyc2VkPSVzIiwKICAgICAgICAgICAgICAgIHVzZV9tb2RlbCwKICAgICAgICAgICAgICAgIHVzYWdlLnByb21wdF90b2tlbnMgaWYgdXNhZ2UgZWxzZSAwLAogICAgICAgICAgICAgICAgdXNhZ2UuY29tcGxldGlvbl90b2tlbnMgaWYgdXNhZ2UgZWxzZSAwLAogICAgICAgICAgICAgICAgInllcyIgaWYgcGFyc2VkIGVsc2UgIm5vIiwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgcmV0dXJuIFBlcnBsZXhpdHlSZXNwb25zZSgKICAgICAgICAgICAgICAgIGNvbnRlbnQ9Y29udGVudCwKICAgICAgICAgICAgICAgIHBhcnNlZF9qc29uPXBhcnNlZCwKICAgICAgICAgICAgICAgIHByb21wdF90b2tlbnM9dXNhZ2UucHJvbXB0X3Rva2VucyBpZiB1c2FnZSBlbHNlIDAsCiAgICAgICAgICAgICAgICBjb21wbGV0aW9uX3Rva2Vucz11c2FnZS5jb21wbGV0aW9uX3Rva2VucyBpZiB1c2FnZSBlbHNlIDAsCiAgICAgICAgICAgICAgICBtb2RlbD11c2VfbW9kZWwsCiAgICAgICAgICAgICAgICBjaXRhdGlvbnM9Y2l0YXRpb25zLAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbcHBseF0gQVBJIGNhbGwgZmFpbGVkOiAlcyIsIGUpCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIGNoYXRfcGxhaW4oCiAgICAgICAgc2VsZiwKICAgICAgICBzeXN0ZW1fcHJvbXB0OiBzdHIsCiAgICAgICAgdXNlcl9wcm9tcHQ6IHN0ciwKICAgICAgICBtb2RlbDogc3RyID0gTm9uZSwKICAgICAgICB0ZW1wZXJhdHVyZTogZmxvYXQgPSAwLjIsCiAgICAgICAgbWF4X3Rva2VuczogaW50ID0gNDA5NiwKICAgICkgLT4gUGVycGxleGl0eVJlc3BvbnNlOgogICAgICAgICIiIgogICAgICAgIFNlbmQgYSBwbGFpbiBjaGF0IHJlcXVlc3Qgd2l0aG91dCBzdHJ1Y3R1cmVkIG91dHB1dC4KICAgICAgICBVc2VkIGZvciBzdWJzdGl0dXRpb24gZmFsbGJhY2sgcXVlcmllcyB3aGVyZSBzY2hlbWEKICAgICAgICBjb21wbGlhbmNlIGlzIGxlc3MgY3JpdGljYWwuCiAgICAgICAgIiIiCiAgICAgICAgdXNlX21vZGVsID0gbW9kZWwgb3Igc2VsZi5tb2RlbAoKICAgICAgICBtZXNzYWdlcyA9IFsKICAgICAgICAgICAgeyJyb2xlIjogInN5c3RlbSIsICJjb250ZW50Ijogc3lzdGVtX3Byb21wdH0sCiAgICAgICAgICAgIHsicm9sZSI6ICJ1c2VyIiwgImNvbnRlbnQiOiB1c2VyX3Byb21wdH0sCiAgICAgICAgXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5fY2xpZW50LmNoYXQuY29tcGxldGlvbnMuY3JlYXRlKAogICAgICAgICAgICAgICAgbW9kZWw9dXNlX21vZGVsLAogICAgICAgICAgICAgICAgbWVzc2FnZXM9bWVzc2FnZXMsCiAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZT10ZW1wZXJhdHVyZSwKICAgICAgICAgICAgICAgIG1heF90b2tlbnM9bWF4X3Rva2VucywKICAgICAgICAgICAgKQoKICAgICAgICAgICAgY2hvaWNlID0gcmVzcG9uc2UuY2hvaWNlc1swXQogICAgICAgICAgICBjb250ZW50ID0gY2hvaWNlLm1lc3NhZ2UuY29udGVudCBvciAiIgogICAgICAgICAgICB1c2FnZSA9IHJlc3BvbnNlLnVzYWdlCgogICAgICAgICAgICAjIFRyeSB0byBwYXJzZSBhcyBKU09OIGFueXdheQogICAgICAgICAgICBwYXJzZWQgPSBzZWxmLl9leHRyYWN0X2pzb24oY29udGVudCkKCiAgICAgICAgICAgIGNpdGF0aW9ucyA9IFtdCiAgICAgICAgICAgIGlmIGhhc2F0dHIocmVzcG9uc2UsICdjaXRhdGlvbnMnKSBhbmQgcmVzcG9uc2UuY2l0YXRpb25zOgogICAgICAgICAgICAgICAgY2l0YXRpb25zID0gcmVzcG9uc2UuY2l0YXRpb25zCgogICAgICAgICAgICByZXR1cm4gUGVycGxleGl0eVJlc3BvbnNlKAogICAgICAgICAgICAgICAgY29udGVudD1jb250ZW50LAogICAgICAgICAgICAgICAgcGFyc2VkX2pzb249cGFyc2VkLAogICAgICAgICAgICAgICAgcHJvbXB0X3Rva2Vucz11c2FnZS5wcm9tcHRfdG9rZW5zIGlmIHVzYWdlIGVsc2UgMCwKICAgICAgICAgICAgICAgIGNvbXBsZXRpb25fdG9rZW5zPXVzYWdlLmNvbXBsZXRpb25fdG9rZW5zIGlmIHVzYWdlIGVsc2UgMCwKICAgICAgICAgICAgICAgIG1vZGVsPXVzZV9tb2RlbCwKICAgICAgICAgICAgICAgIGNpdGF0aW9ucz1jaXRhdGlvbnMsCiAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IEV4Y2Vw' +
'dGlvbiBhcyBlOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoIltwcGx4XSBQbGFpbiBjaGF0IGZhaWxlZDogJXMiLCBlKQogICAgICAgICAgICByYWlzZQoKICAgIGFzeW5jIGRlZiBhY2hhdF9zdHJ1Y3R1cmVkKHNlbGYsICphcmdzLCAqKmt3YXJncykgLT4gUGVycGxleGl0eVJlc3BvbnNlOgogICAgICAgICIiIkFzeW5jIHdyYXBwZXIg4oCUIHJ1bnMgc3RydWN0dXJlZCBjaGF0IGluIHRocmVhZCBleGVjdXRvci4iIiIKICAgICAgICBsb29wID0gYXN5bmNpby5nZXRfZXZlbnRfbG9vcCgpCiAgICAgICAgcmV0dXJuIGF3YWl0IGxvb3AucnVuX2luX2V4ZWN1dG9yKAogICAgICAgICAgICBOb25lLCBsYW1iZGE6IHNlbGYuY2hhdF9zdHJ1Y3R1cmVkKCphcmdzLCAqKmt3YXJncykKICAgICAgICApCgogICAgYXN5bmMgZGVmIGFjaGF0X3BsYWluKHNlbGYsICphcmdzLCAqKmt3YXJncykgLT4gUGVycGxleGl0eVJlc3BvbnNlOgogICAgICAgICIiIkFzeW5jIHdyYXBwZXIg4oCUIHJ1bnMgcGxhaW4gY2hhdCBpbiB0aHJlYWQgZXhlY3V0b3IuIiIiCiAgICAgICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKQogICAgICAgIHJldHVybiBhd2FpdCBsb29wLnJ1bl9pbl9leGVjdXRvcigKICAgICAgICAgICAgTm9uZSwgbGFtYmRhOiBzZWxmLmNoYXRfcGxhaW4oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2V4dHJhY3RfanNvbih0ZXh0OiBzdHIpIC0+IE9wdGlvbmFsW2RpY3RdOgogICAgICAgICIiIkJlc3QtZWZmb3J0IEpTT04gZXh0cmFjdGlvbiBmcm9tIHBvc3NpYmx5IG5vaXN5IHRleHQuIiIiCiAgICAgICAgIyBEaXJlY3QgcGFyc2UKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKHRleHQuc3RyaXAoKSkKICAgICAgICBleGNlcHQgKGpzb24uSlNPTkRlY29kZUVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgICAgICBwYXNzCgogICAgICAgICMgTWFya2Rvd24gZmVuY2VzCiAgICAgICAgaW1wb3J0IHJlCiAgICAgICAgZmVuY2VfbWF0Y2ggPSByZS5zZWFyY2gocidgYGAoPzpqc29uKT9ccyooW1xzXFNdKj8pYGBgJywgdGV4dCkKICAgICAgICBpZiBmZW5jZV9tYXRjaDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoZmVuY2VfbWF0Y2guZ3JvdXAoMSkuc3RyaXAoKSkKICAgICAgICAgICAgZXhjZXB0IChqc29uLkpTT05EZWNvZGVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBCcmFjZSBjb3VudGluZwogICAgICAgIHN0YXJ0ID0gdGV4dC5maW5kKCd7JykKICAgICAgICBpZiBzdGFydCA9PSAtMToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZGVwdGggPSAwCiAgICAgICAgaW5fc3RyaW5nID0gRmFsc2UKICAgICAgICBlc2NhcGVfbmV4dCA9IEZhbHNlCiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnQsIGxlbih0ZXh0KSk6CiAgICAgICAgICAgIGNoID0gdGV4dFtpXQogICAgICAgICAgICBpZiBlc2NhcGVfbmV4dDoKICAgICAgICAgICAgICAgIGVzY2FwZV9uZXh0ID0gRmFsc2UKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGNoID09ICdcXCcgYW5kIGluX3N0cmluZzoKICAgICAgICAgICAgICAgIGVzY2FwZV9uZXh0ID0gVHJ1ZQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgY2ggPT0gJyInOgogICAgICAgICAgICAgICAgaW5fc3RyaW5nID0gbm90IGluX3N0cmluZwogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgaW5fc3RyaW5nOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgY2ggPT0gJ3snOgogICAgICAgICAgICAgICAgZGVwdGggKz0gMQogICAgICAgICAgICBlbGlmIGNoID09ICd9JzoKICAgICAgICAgICAgICAgIGRlcHRoIC09IDEKICAgICAgICAgICAgICAgIGlmIGRlcHRoID09IDA6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNvbi5sb2Fkcyh0ZXh0W3N0YXJ0OmkrMV0pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChqc29uLkpTT05EZWNvZGVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBjaGVja19zdGF0dXMoc2VsZikgLT4gZGljdDoKICAgICAgICAiIiJRdWljayBoZWFs' +
'dGggY2hlY2sg4oCUIHRyeSBhIG1pbmltYWwgQVBJIGNhbGwuIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuX2NsaWVudC5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSgKICAgICAgICAgICAgICAgIG1vZGVsPXNlbGYubW9kZWwsCiAgICAgICAgICAgICAgICBtZXNzYWdlcz1bCiAgICAgICAgICAgICAgICAgICAgeyJyb2xlIjogInN5c3RlbSIsICJjb250ZW50IjogIlJlcGx5IHdpdGggdGhlIHdvcmQgT0suIn0sCiAgICAgICAgICAgICAgICAgICAgeyJyb2xlIjogInVzZXIiLCAiY29udGVudCI6ICJTdGF0dXMgY2hlY2suIn0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgbWF4X3Rva2Vucz0xMCwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgImNvbm5lY3RlZCI6IFRydWUsCiAgICAgICAgICAgICAgICAibW9kZWwiOiBzZWxmLm1vZGVsLAogICAgICAgICAgICAgICAgInJlc3BvbnNlIjogcmVzcG9uc2UuY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnQsCiAgICAgICAgICAgIH0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAiY29ubmVjdGVkIjogRmFsc2UsCiAgICAgICAgICAgICAgICAibW9kZWwiOiBzZWxmLm1vZGVsLAogICAgICAgICAgICAgICAgImVycm9yIjogc3RyKGUpLAogICAgICAgICAgICB9Cg=='
Install-B64 -R 'coach\clients\perplexity_client.py' -B $b
# coach/coach_service.py (11,183 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIENvYWNoIFNlcnZpY2UK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCk1haW4gb3JjaGVzdHJhdG9yOiBsb2FkcyBkZWNrIHJlcG9ydHMsIGlkZW50aWZpZXMgdW5kZXJwZXJmb3JtZXJzLApmaW5kcyByZXBsYWNlbWVudCBjYW5kaWRhdGVzIHZpYSBlbWJlZGRpbmdzLCBidWlsZHMgcHJvbXB0cywKY2FsbHMgdGhlIExMTSwgcGFyc2VzIHJlc3BvbnNlcywgYW5kIHBlcnNpc3RzIGNvYWNoaW5nIHNlc3Npb25zLgoiIiIKCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCB1dWlkCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lLCB0aW1lem9uZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsLCBMaXN0LCBEaWN0Cgpmcm9tIC5jb25maWcgaW1wb3J0ICgKICAgIERFQ0tfUkVQT1JUU19ESVIsIENPQUNIX1NFU1NJT05TX0RJUiwKICAgIE1BWF9VTkRFUlBFUkZPUk1FUlMsIE1BWF9DQU5ESURBVEVTX1BFUl9VTkRFUlBFUkZPUk1FUiwKICAgIFVOREVSUEVSRk9STUVSX0lNUEFDVF9USFJFU0hPTEQsIGVuc3VyZV9kaXJzLAopCmZyb20gLm1vZGVscyBpbXBvcnQgKAogICAgRGVja1JlcG9ydCwgQ29hY2hHb2FscywgQ29hY2hTZXNzaW9uLAogICAgU3VnZ2VzdGVkQ3V0LCBTdWdnZXN0ZWRBZGQsIENvYWNoU3RhdHVzLAopCmZyb20gLmxsbV9jbGllbnQgaW1wb3J0IExNU3R1ZGlvQ2xpZW50CmZyb20gLmVtYmVkZGluZ3MgaW1wb3J0IE1UR0VtYmVkZGluZ0luZGV4CmZyb20gLnByb21wdF90ZW1wbGF0ZSBpbXBvcnQgYnVpbGRfc3lzdGVtX3Byb21wdCwgYnVpbGRfdXNlcl9wcm9tcHQKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb2FjaC5zZXJ2aWNlIikKCgpjbGFzcyBDb2FjaFNlcnZpY2U6CiAgICAiIiIKICAgIERlY2sgY29hY2hpbmcgc2VydmljZSBwb3dlcmVkIGJ5IGxvY2FsIExMTSBhbmQgY2FyZCBlbWJlZGRpbmdzLgoKICAgIFVzYWdlOgogICAgICAgIGVtYmVkZGluZ3MgPSBNVEdFbWJlZGRpbmdJbmRleCgpCiAgICAgICAgZW1iZWRkaW5ncy5sb2FkKCkKICAgICAgICBsbG0gPSBMTVN0dWRpb0NsaWVudCgpCiAgICAgICAgY29hY2ggPSBDb2FjaFNlcnZpY2UobGxtLCBlbWJlZGRpbmdzKQogICAgICAgIHNlc3Npb24gPSBhd2FpdCBjb2FjaC5ydW5fY29hY2hpbmdfc2Vzc2lvbigiZWRnYXItbWFya292IikKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsbG06IExNU3R1ZGlvQ2xpZW50LCBlbWJlZGRpbmdzOiBNVEdFbWJlZGRpbmdJbmRleCk6CiAgICAgICAgc2VsZi5sbG0gPSBsbG0KICAgICAgICBzZWxmLmVtYmVkZGluZ3MgPSBlbWJlZGRpbmdzCiAgICAgICAgZW5zdXJlX2RpcnMoKQoKICAgICMg4pSA4pSAIERlY2sgUmVwb3J0IEkvTyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBkZWYgbG9hZF9kZWNrX3JlcG9ydChzZWxmLCBkZWNrX2lkOiBzdHIpIC0+IE9wdGlvbmFsW0RlY2tSZXBvcnRdOgogICAgICAgICIiIkxvYWQgYSBkZWNrIHJlcG9ydCBmcm9tIGRpc2suIiIiCiAgICAgICAgIyBUcnkgZXhhY3QgZmlsZW5hbWUgZmlyc3QsIHRoZW4gY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2gKICAgICAgICByZXBvcnRfcGF0aCA9IERFQ0tfUkVQT1JUU19ESVIgLyBmIntkZWNrX2lkfS5qc29uIgogICAgICAgIGlmIG5vdCByZXBvcnRfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgIyBUcnkgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaAogICAgICAgICAgICBmb3IgZiBpbiBERUNLX1JFUE9SVFNfRElSLmdsb2IoIiouanNvbiIpOgogICAgICAgICAgICAgICAgaWYgZi5zdGVtLmxvd2VyKCkgPT0gZGVja19pZC5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIHJlcG9ydF9wYXRoID0gZgogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIG5vdCByZXBvcnRfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkRlY2sgcmVwb3J0IG5vdCBmb3VuZDogJXMiLCBkZWNrX2lkKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3Bl' +
'bihyZXBvcnRfcGF0aCwgInIiKSBhcyBmOgogICAgICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZChmKQogICAgICAgICAgICByZXR1cm4gRGVja1JlcG9ydCgqKmRhdGEpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBsb2FkIGRlY2sgcmVwb3J0ICVzOiAlcyIsIGRlY2tfaWQsIGUpCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGxpc3RfZGVja19yZXBvcnRzKHNlbGYpIC0+IExpc3Rbc3RyXToKICAgICAgICAiIiJMaXN0IGFsbCBhdmFpbGFibGUgZGVjayByZXBvcnQgSURzLiIiIgogICAgICAgIGlmIG5vdCBERUNLX1JFUE9SVFNfRElSLmV4aXN0cygpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICByZXR1cm4gW2Yuc3RlbSBmb3IgZiBpbiBERUNLX1JFUE9SVFNfRElSLmdsb2IoIiouanNvbiIpXQoKICAgICMg4pSA4pSAIENvYWNoIFNlc3Npb24gSS9PIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGRlZiBzYXZlX3Nlc3Npb24oc2VsZiwgc2Vzc2lvbjogQ29hY2hTZXNzaW9uKSAtPiBQYXRoOgogICAgICAgICIiIlBlcnNpc3QgYSBjb2FjaGluZyBzZXNzaW9uIHRvIGRpc2suIiIiCiAgICAgICAgQ09BQ0hfU0VTU0lPTlNfRElSLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICBwYXRoID0gQ09BQ0hfU0VTU0lPTlNfRElSIC8gZiJ7c2Vzc2lvbi5zZXNzaW9uSWR9Lmpzb24iCiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3IikgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShzZXNzaW9uLm1vZGVsX2R1bXBfanNvbihpbmRlbnQ9MikpCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgbG9hZF9zZXNzaW9uKHNlbGYsIHNlc3Npb25faWQ6IHN0cikgLT4gT3B0aW9uYWxbQ29hY2hTZXNzaW9uXToKICAgICAgICAiIiJMb2FkIGEgY29hY2hpbmcgc2Vzc2lvbiBmcm9tIGRpc2suIiIiCiAgICAgICAgcGF0aCA9IENPQUNIX1NFU1NJT05TX0RJUiAvIGYie3Nlc3Npb25faWR9Lmpzb24iCiAgICAgICAgaWYgbm90IHBhdGguZXhpc3RzKCk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInIiKSBhcyBmOgogICAgICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZChmKQogICAgICAgICAgICByZXR1cm4gQ29hY2hTZXNzaW9uKCoqZGF0YSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGxvYWQgc2Vzc2lvbiAlczogJXMiLCBzZXNzaW9uX2lkLCBlKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBsaXN0X3Nlc3Npb25zKHNlbGYsIGRlY2tfaWQ6IHN0ciA9IE5vbmUpIC0+IExpc3RbZGljdF06CiAgICAgICAgIiIiTGlzdCBhbGwgY29hY2hpbmcgc2Vzc2lvbnMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgZGVjay4iIiIKICAgICAgICBpZiBub3QgQ09BQ0hfU0VTU0lPTlNfRElSLmV4aXN0cygpOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBzZXNzaW9ucyA9IFtdCiAgICAgICAgZm9yIGYgaW4gc29ydGVkKENPQUNIX1NFU1NJT05TX0RJUi5nbG9iKCIqLmpzb24iKSwgcmV2ZXJzZT1UcnVlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyIikgYXMgZmg6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZChmaCkKICAgICAgICAgICAgICAgIGlmIGRlY2tfaWQgYW5kIGRhdGEuZ2V0KCJkZWNrSWQiLCAiIikgIT0gZGVja19pZDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgc2Vzc2lvbnMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAic2Vzc2lvbklkIjogZGF0YS5nZXQoInNlc3Npb25JZCIsIGYuc3RlbSksCiAgICAgICAgICAgICAgICAgICAgImRlY2tJZCI6IGRhdGEuZ2V0KCJkZWNrSWQiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCI6IGRhdGEuZ2V0KCJ0aW1lc3RhbXAiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgInN1bW1hcnkiOiBkYXRhLmdldCgic3VtbWFyeSIsICIiKVs6MTAwXSwKICAgICAgICAgICAgICAgICAgICAiY3V0c0NvdW50IjogbGVuKGRhdGEuZ2V0KCJz' +
'dWdnZXN0ZWRDdXRzIiwgW10pKSwKICAgICAgICAgICAgICAgICAgICAiYWRkc0NvdW50IjogbGVuKGRhdGEuZ2V0KCJzdWdnZXN0ZWRBZGRzIiwgW10pKSwKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgIHJldHVybiBzZXNzaW9ucwoKICAgICMg4pSA4pSAIE1haW4gQ29hY2hpbmcgUGlwZWxpbmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZGVmIHJ1bl9jb2FjaGluZ19zZXNzaW9uKHNlbGYsIGRlY2tfaWQ6IHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IE9wdGlvbmFsW0NvYWNoR29hbHNdID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIC0+IENvYWNoU2Vzc2lvbjoKICAgICAgICAiIiIKICAgICAgICBGdWxsIGNvYWNoaW5nIHBpcGVsaW5lOgogICAgICAgIDEuIExvYWQgZGVjayByZXBvcnQKICAgICAgICAyLiBJZGVudGlmeSB1bmRlcnBlcmZvcm1lcnMKICAgICAgICAzLiBGaW5kIHJlcGxhY2VtZW50IGNhbmRpZGF0ZXMgdmlhIGVtYmVkZGluZ3MKICAgICAgICA0LiBCdWlsZCBwcm9tcHQKICAgICAgICA1LiBDYWxsIExMTQogICAgICAgIDYuIFBhcnNlIHJlc3BvbnNlCiAgICAgICAgNy4gUGVyc2lzdCBzZXNzaW9uCiAgICAgICAgIiIiCiAgICAgICAgIyAwLiBBdXRvLWxvYWQgZW1iZWRkaW5ncyBpZiBub3QgbG9hZGVkCiAgICAgICAgaWYgbm90IHNlbGYuZW1iZWRkaW5ncy5sb2FkZWQ6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJFbWJlZGRpbmdzIG5vdCBsb2FkZWQg4oCUIGF0dGVtcHRpbmcgYXV0by1sb2FkLi4uIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9hZGVkID0gc2VsZi5lbWJlZGRpbmdzLmxvYWQoKQogICAgICAgICAgICAgICAgaWYgbG9hZGVkOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJFbWJlZGRpbmdzIGF1dG8tbG9hZGVkOiAlZCBjYXJkcyIsIHNlbGYuZW1iZWRkaW5ncy5jYXJkX2NvdW50KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiRW1iZWRkaW5ncyBhdXRvLWxvYWQgcmV0dXJuZWQgRmFsc2UiKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiRW1iZWRkaW5ncyBhdXRvLWxvYWQgZmFpbGVkOiAlcyIsIGUpCgogICAgICAgICMgMS4gTG9hZCBkZWNrIHJlcG9ydAogICAgICAgIHJlcG9ydCA9IHNlbGYubG9hZF9kZWNrX3JlcG9ydChkZWNrX2lkKQogICAgICAgIGlmIHJlcG9ydCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiRGVjayByZXBvcnQgbm90IGZvdW5kIGZvcjoge2RlY2tfaWR9IikKCiAgICAgICAgIyAyLiBHZXQgZGVjayBjYXJkIG5hbWVzIChmb3IgZXhjbHVzaW9uIGZyb20gY2FuZGlkYXRlcykKICAgICAgICBkZWNrX2NhcmRfbmFtZXMgPSBbYy5uYW1lIGZvciBjIGluIHJlcG9ydC5jYXJkc10KCiAgICAgICAgIyAzLiBGaW5kIHJlcGxhY2VtZW50IGNhbmRpZGF0ZXMgZm9yIHVuZGVycGVyZm9ybWVycwogICAgICAgIGNhbmRpZGF0ZXM6IERpY3Rbc3RyLCBMaXN0W2RpY3RdXSA9IHt9CgogICAgICAgIHVuZGVycGVyZm9ybWVycyA9IHJlcG9ydC51bmRlcnBlcmZvcm1lcnNbOk1BWF9VTkRFUlBFUkZPUk1FUlNdCiAgICAgICAgaWYgbm90IHVuZGVycGVyZm9ybWVyczoKICAgICAgICAgICAgIyBJZiBubyBleHBsaWNpdCB1bmRlcnBlcmZvcm1lcnMsIHBpY2sgbG93ZXN0IGltcGFjdCBjYXJkcwogICAgICAgICAgICBzb3J0ZWRfY2FyZHMgPSBzb3J0ZWQocmVwb3J0LmNhcmRzLCBrZXk9bGFtYmRhIGM6IGMuaW1wYWN0U2NvcmUpCiAgICAgICAgICAgIHVuZGVycGVyZm9ybWVycyA9IFsKICAgICAgICAgICAgICAgIGMubmFtZSBmb3IgYyBpbiBzb3J0ZWRfY2FyZHNbOk1BWF9VTkRFUlBFUkZPUk1FUlNdCiAgICAgICAgICAgICAgICBpZiBjLmltcGFjdFNjb3JlIDwgVU5ERVJQRVJGT1JNRVJfSU1QQUNUX1RIUkVTSE9MRAogICAgICAgICAgICBdCgogICAgICAgICMgSWYgc3RpbGwgbm8gdW5kZXJwZXJmb3JtZXJzIGFuZCB3ZSBoYXZlIGNhcmRzLCBwaWNrIGJvdHRvbSBOIGJ5IGltcGFj' +
'dAogICAgICAgIGlmIG5vdCB1bmRlcnBlcmZvcm1lcnMgYW5kIHJlcG9ydC5jYXJkczoKICAgICAgICAgICAgc29ydGVkX2NhcmRzID0gc29ydGVkKHJlcG9ydC5jYXJkcywga2V5PWxhbWJkYSBjOiBjLmltcGFjdFNjb3JlKQogICAgICAgICAgICAjIFRha2UgdGhlIGJvdHRvbSA1IG5vbi1sYW5kIGNhcmRzIGFzIGNhbmRpZGF0ZXMgZm9yIGN1dHMKICAgICAgICAgICAgdW5kZXJwZXJmb3JtZXJzID0gWwogICAgICAgICAgICAgICAgYy5uYW1lIGZvciBjIGluIHNvcnRlZF9jYXJkc1s6NV0KICAgICAgICAgICAgICAgIGlmIG5vdCBhbnkodCBpbiAoYy50YWdzIG9yIFtdKSBmb3IgdCBpbiBbXSkKICAgICAgICAgICAgXVs6TUFYX1VOREVSUEVSRk9STUVSU10KCiAgICAgICAgaWYgc2VsZi5lbWJlZGRpbmdzLmxvYWRlZDoKICAgICAgICAgICAgZm9yIGNhcmRfbmFtZSBpbiB1bmRlcnBlcmZvcm1lcnM6CiAgICAgICAgICAgICAgICBtYXRjaGVzID0gc2VsZi5lbWJlZGRpbmdzLmZpbmRfcmVwbGFjZW1lbnRzKAogICAgICAgICAgICAgICAgICAgIHVuZGVycGVyZm9ybWVyPWNhcmRfbmFtZSwKICAgICAgICAgICAgICAgICAgICBkZWNrX2NvbG9ycz1yZXBvcnQuY29sb3JJZGVudGl0eSwKICAgICAgICAgICAgICAgICAgICBkZWNrX2NhcmRfbmFtZXM9ZGVja19jYXJkX25hbWVzLAogICAgICAgICAgICAgICAgICAgIHRvcF9uPU1BWF9DQU5ESURBVEVTX1BFUl9VTkRFUlBFUkZPUk1FUiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIG1hdGNoZXM6CiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlc1tjYXJkX25hbWVdID0gW20udG9fZGljdCgpIGZvciBtIGluIG1hdGNoZXNdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkVtYmVkZGluZ3Mgbm90IGxvYWRlZCDigJQgc2tpcHBpbmcgY2FuZGlkYXRlIHNlYXJjaCIpCgogICAgICAgICMgNC4gQnVpbGQgcHJvbXB0cwogICAgICAgIHN5c3RlbV9wcm9tcHQgPSBidWlsZF9zeXN0ZW1fcHJvbXB0KHJlcG9ydCwgZ29hbHMpCiAgICAgICAgdXNlcl9wcm9tcHQgPSBidWlsZF91c2VyX3Byb21wdChyZXBvcnQsIGNhbmRpZGF0ZXMpCgogICAgICAgICMgNS4gQ2FsbCBMTE0KICAgICAgICBsb2dnZXIuaW5mbygiQ2FsbGluZyBMTE0gZm9yIGRlY2s6ICVzIiwgZGVja19pZCkKICAgICAgICBsbG1fcmVzcG9uc2UgPSBhd2FpdCBzZWxmLmxsbS5jaGF0KHN5c3RlbV9wcm9tcHQsIHVzZXJfcHJvbXB0KQoKICAgICAgICAjIDYuIFBhcnNlIHJlc3BvbnNlIGludG8gQ29hY2hTZXNzaW9uCiAgICAgICAgc2Vzc2lvbl9pZCA9IGYic2Vzcy17ZGF0ZXRpbWUubm93KHRpbWV6b25lLnV0Yykuc3RyZnRpbWUoJyVZJW0lZC0lSCVNJVMnKX0te3V1aWQudXVpZDQoKS5oZXhbOjZdfSIKCiAgICAgICAgc2Vzc2lvbiA9IENvYWNoU2Vzc2lvbigKICAgICAgICAgICAgc2Vzc2lvbklkPXNlc3Npb25faWQsCiAgICAgICAgICAgIGRlY2tJZD1kZWNrX2lkLAogICAgICAgICAgICB0aW1lc3RhbXA9ZGF0ZXRpbWUubm93KHRpbWV6b25lLnV0YykuaXNvZm9ybWF0KCksCiAgICAgICAgICAgIG1vZGVsVXNlZD1sbG1fcmVzcG9uc2UubW9kZWwsCiAgICAgICAgICAgIHByb21wdFRva2Vucz1sbG1fcmVzcG9uc2UucHJvbXB0X3Rva2VucywKICAgICAgICAgICAgY29tcGxldGlvblRva2Vucz1sbG1fcmVzcG9uc2UuY29tcGxldGlvbl90b2tlbnMsCiAgICAgICAgICAgIGdvYWxzPWdvYWxzLAogICAgICAgICkKCiAgICAgICAgaWYgbGxtX3Jlc3BvbnNlLnBhcnNlZF9qc29uOgogICAgICAgICAgICBzZWxmLl9wb3B1bGF0ZV9zZXNzaW9uX2Zyb21fanNvbihzZXNzaW9uLCBsbG1fcmVzcG9uc2UucGFyc2VkX2pzb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBGYWxsYmFjazogc3RvcmUgcmF3IHRleHQKICAgICAgICAgICAgc2Vzc2lvbi5yYXdUZXh0RXhwbGFuYXRpb24gPSBsbG1fcmVzcG9uc2UuY29udGVudAogICAgICAgICAgICBzZXNzaW9uLnN1bW1hcnkgPSAiTExNIHJldHVybmVkIG5vbi1KU09OIHJlc3BvbnNlLiBTZWUgcmF3IGV4cGxhbmF0aW9uLiIKCiAgICAgICAgIyA3LiBQZXJzaXN0CiAgICAgICAgc2VsZi5zYXZlX3Nlc3Npb24oc2Vzc2lvbikKICAgICAgICBsb2dnZXIuaW5mbygiQ29hY2hpbmcgc2Vzc2lvbiBzYXZlZDogJXMiLCBzZXNzaW9uX2lkKQoKICAgICAgICByZXR1cm4gc2Vzc2lvbgoKICAgIGRlZiBfcG9wdWxhdGVfc2Vzc2lvbl9mcm9tX2pzb24oc2Vs' +
'Ziwgc2Vzc2lvbjogQ29hY2hTZXNzaW9uLCBkYXRhOiBkaWN0KToKICAgICAgICAiIiJQYXJzZSBMTE0gSlNPTiByZXNwb25zZSBpbnRvIENvYWNoU2Vzc2lvbiBmaWVsZHMuIiIiCiAgICAgICAgc2Vzc2lvbi5zdW1tYXJ5ID0gZGF0YS5nZXQoInN1bW1hcnkiLCAiIikKICAgICAgICBzZXNzaW9uLnJhd1RleHRFeHBsYW5hdGlvbiA9IGRhdGEuZ2V0KCJyYXdUZXh0RXhwbGFuYXRpb24iLCAiIikKICAgICAgICBzZXNzaW9uLm1hbmFCYXNlQWR2aWNlID0gZGF0YS5nZXQoIm1hbmFCYXNlQWR2aWNlIikKCiAgICAgICAgIyBIZXVyaXN0aWMgaGludHMKICAgICAgICBoaW50cyA9IGRhdGEuZ2V0KCJoZXVyaXN0aWNIaW50cyIsIFtdKQogICAgICAgIHNlc3Npb24uaGV1cmlzdGljSGludHMgPSBoaW50cyBpZiBpc2luc3RhbmNlKGhpbnRzLCBsaXN0KSBlbHNlIFtzdHIoaGludHMpXQoKICAgICAgICAjIFN1Z2dlc3RlZCBjdXRzCiAgICAgICAgZm9yIGN1dF9kYXRhIGluIGRhdGEuZ2V0KCJzdWdnZXN0ZWRDdXRzIiwgW10pOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGN1dF9kYXRhLCBkaWN0KToKICAgICAgICAgICAgICAgIHNlc3Npb24uc3VnZ2VzdGVkQ3V0cy5hcHBlbmQoU3VnZ2VzdGVkQ3V0KAogICAgICAgICAgICAgICAgICAgIGNhcmROYW1lPWN1dF9kYXRhLmdldCgiY2FyZE5hbWUiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgcmVhc29uPWN1dF9kYXRhLmdldCgicmVhc29uIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50T3B0aW9ucz1jdXRfZGF0YS5nZXQoInJlcGxhY2VtZW50T3B0aW9ucyIsIFtdKSwKICAgICAgICAgICAgICAgICkpCgogICAgICAgICMgU3VnZ2VzdGVkIGFkZHMKICAgICAgICBmb3IgYWRkX2RhdGEgaW4gZGF0YS5nZXQoInN1Z2dlc3RlZEFkZHMiLCBbXSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkX2RhdGEsIGRpY3QpOgogICAgICAgICAgICAgICAgc2Vzc2lvbi5zdWdnZXN0ZWRBZGRzLmFwcGVuZChTdWdnZXN0ZWRBZGQoCiAgICAgICAgICAgICAgICAgICAgY2FyZE5hbWU9YWRkX2RhdGEuZ2V0KCJjYXJkTmFtZSIsICIiKSwKICAgICAgICAgICAgICAgICAgICByb2xlPWFkZF9kYXRhLmdldCgicm9sZSIsICIiKSwKICAgICAgICAgICAgICAgICAgICByZWFzb249YWRkX2RhdGEuZ2V0KCJyZWFzb24iLCAiIiksCiAgICAgICAgICAgICAgICAgICAgc3luZXJneVdpdGg9YWRkX2RhdGEuZ2V0KCJzeW5lcmd5V2l0aCIsIFtdKSwKICAgICAgICAgICAgICAgICkpCgogICAgIyDilIDilIAgU3RhdHVzIENoZWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGRlZiBnZXRfc3RhdHVzKHNlbGYpIC0+IENvYWNoU3RhdHVzOgogICAgICAgICIiIkNoZWNrIHRoZSBoZWFsdGggb2YgYWxsIGNvYWNoIHN1YnN5c3RlbXMuIiIiCiAgICAgICAgc3RhdHVzID0gQ29hY2hTdGF0dXMoKQoKICAgICAgICAjIENoZWNrIExMTQogICAgICAgIGxsbV9zdGF0dXMgPSBzZWxmLmxsbS5jaGVja19jb25uZWN0aW9uKCkKICAgICAgICBzdGF0dXMubGxtQ29ubmVjdGVkID0gbGxtX3N0YXR1cy5nZXQoImNvbm5lY3RlZCIsIEZhbHNlKQogICAgICAgIHN0YXR1cy5sbG1Nb2RlbCA9IGxsbV9zdGF0dXMuZ2V0KCJhY3RpdmVfbW9kZWwiKQogICAgICAgIHN0YXR1cy5sbG1Nb2RlbHMgPSBsbG1fc3RhdHVzLmdldCgibW9kZWxzIiwgW10pCiAgICAgICAgaWYgbm90IHN0YXR1cy5sbG1Db25uZWN0ZWQ6CiAgICAgICAgICAgIHN0YXR1cy5lcnJvciA9IGxsbV9zdGF0dXMuZ2V0KCJlcnJvciIsICJMTSBTdHVkaW8gbm90IHJlYWNoYWJsZSIpCgogICAgICAgICMgQ2hlY2sgZW1iZWRkaW5ncwogICAgICAgIHN0YXR1cy5lbWJlZGRpbmdzTG9hZGVkID0gc2VsZi5lbWJlZGRpbmdzLmxvYWRlZAogICAgICAgIHN0YXR1cy5lbWJlZGRpbmdDYXJkcyA9IHNlbGYuZW1iZWRkaW5ncy5jYXJkX2NvdW50CgogICAgICAgICMgQ2hlY2sgZGVjayByZXBvcnRzCiAgICAgICAgc3RhdHVzLmRlY2tSZXBvcnRzQXZhaWxhYmxlID0gbGVuKHNlbGYubGlzdF9kZWNrX3JlcG9ydHMoKSkKCiAgICAgICAgcmV0dXJuIHN0YXR1cwo='
Install-B64 -R 'coach\coach_service.py' -B $b
# coach/config.py (3,839 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIENvYWNoIENvbmZpZ3VyYXRpb24K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCkNlbnRyYWwgY29uZmlnIGZvciBMTSBTdHVkaW8sIGVtYmVkZGluZ3MsIGFuZCBjb2FjaCBzZXJ2aWNlIHBhdGhzLgpBbGwgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjb21tYW5kZXItYWktbGFiIHJvb3QgZGlyZWN0b3J5LgoiIiIKCmltcG9ydCBvcwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCiMg4pSA4pSAIEJhc2UgUGF0aHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiMgUmVzb2x2ZSByZWxhdGl2ZSB0byB3aGVyZXZlciB0aGUgbGFiIGlzIGluc3RhbGxlZApMQUJfUk9PVCA9IFBhdGgob3MuZW52aXJvbi5nZXQoIkNPTU1BTkRFUl9MQUJfUk9PVCIsIFBhdGgoX19maWxlX18pLnBhcmVudC5wYXJlbnQpKQoKIyDilIDilIAgTE0gU3R1ZGlvIChPcGVuQUktY29tcGF0aWJsZSBBUEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApMTV9TVFVESU9fVVJMID0gb3MuZW52aXJvbi5nZXQoIkxNX1NUVURJT19VUkwiLCAiaHR0cDovLzE5Mi4xNjguMC4xMjI6MTIzNC92MSIpCkxNX1NUVURJT19NT0RFTCA9IG9zLmVudmlyb24uZ2V0KCJMTV9TVFVESU9fTU9ERUwiLCAibG9jYWwtbW9kZWwiKQpMTV9TVFVESU9fVElNRU9VVCA9IGludChvcy5lbnZpcm9uLmdldCgiTE1fU1RVRElPX1RJTUVPVVQiLCAiMTIwIikpICAjIHNlY29uZHMKTE1fU1RVRElPX01BWF9SRVRSSUVTID0gMwoKIyDilIDilIAgRW1iZWRkaW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKRU1CRURESU5HU19ESVIgPSBMQUJfUk9PVCAvICJkYXRhIgpFTUJFRERJTkdTX05QWiA9IEVNQkVERElOR1NfRElSIC8gIm10Zy1lbWJlZGRpbmdzLm5weiIKRU1CRURESU5HU19QQVJRVUVUID0gRU1CRURESU5HU19ESVIgLyAibXRnLWVtYmVkZGluZ3MucGFycXVldCIKCiMg4pSA4pSAIERlY2sgUmVwb3J0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKREVDS19SRVBPUlRTX0RJUiA9IExBQl9ST09UIC8gImRlY2stcmVwb3J0cyIKQ09BQ0hfU0VTU0lPTlNfRElSID0gTEFCX1JPT1QgLyAiY29hY2gtc2Vzc2lvbnMiCgojIOKUgOKUgCBQcm9tcHQgTGltaXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApNQVhfUFJPTVBUX1RPS0VOUyA9IDQwOTYKTUFYX0NBTkRJREFURVNfUEVSX1VOREVSUEVSRk9STUVSID0gMTAKTUFYX1VOREVSUEVSRk9STUVSUyA9IDgKVU5ERVJQRVJGT1JNRVJfSU1QQUNUX1RIUkVTSE9MRCA9IC0wLjA1ICAjIGltcGFjdFNjb3JlIGJlbG93IHRoaXMgPSB1bmRlcnBlcmZvcm1lcgoKIyDilIDilIAgTExNIEdlbmVyYXRpb24gU2V0dGluZ3MgKENvYWNoIOKAlCBMTSBTdHVkaW8pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApERUZBVUxUX1RFTVBFUkFUVVJFID0gMC43CiMgRGVlcFNlZWstUjEgdXNlcyA8dGhpbms+IHJlYXNvbmluZyB0b2tlbnMgYmVmb3JlIHRoZSBKU09OIG91dHB1dCwKIyBzbyB3ZSBuZWVkIGEgZ2VuZXJvdXMgbGltaXQgdG8gYXZvaWQgdHJ1bmNhdGlvbgpERUZBVUxUX01BWF9UT0tFTlMgPSA4MTkyCgojIOKUgOKUgCBQZXJwbGV4aXR5IERlY2sgR2VuZXJhdGlvbiBTZXR0aW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' +
'lIDilIAKIyBQcm92aWRlciBmb3IgZGVjayBnZW5lcmF0aW9uOiAicGVycGxleGl0eSIgKFYzKSBvciAibG9jYWwiIChWMiBjb2xsZWN0aW9uLWJhc2VkKQpERUNLX0dFTl9QUk9WSURFUiA9IG9zLmVudmlyb24uZ2V0KCJERUNLX0dFTl9QUk9WSURFUiIsICJwZXJwbGV4aXR5IikKIyBNb2RlbCBmb3IgZGVjayBnZW5lcmF0aW9uIChzb25hciA9IGZhc3QvJDAuMDA0LCBzb25hci1wcm8gPSBkZWVwLyQwLjA0KQpERUNLX0dFTl9NT0RFTCA9IG9zLmVudmlyb24uZ2V0KCJERUNLX0dFTl9NT0RFTCIsICJzb25hciIpCkRFQ0tfR0VOX1RFTVBFUkFUVVJFID0gZmxvYXQob3MuZW52aXJvbi5nZXQoIkRFQ0tfR0VOX1RFTVBFUkFUVVJFIiwgIjAuMiIpKQpERUNLX0dFTl9NQVhfVE9LRU5TID0gaW50KG9zLmVudmlyb24uZ2V0KCJERUNLX0dFTl9NQVhfVE9LRU5TIiwgIjgxOTIiKSkKCiMg4pSA4pSAIFNtYXJ0IFN1YnN0aXR1dGlvbiBTZXR0aW5ncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyBNaW5pbXVtIGVtYmVkZGluZyBzaW1pbGFyaXR5IHRvIGFjY2VwdCBhIHN1YnN0aXR1dGUgd2l0aG91dCBQZXJwbGV4aXR5IGZhbGxiYWNrClNVQlNUSVRVVElPTl9NSU5fU0lNSUxBUklUWSA9IGZsb2F0KG9zLmVudmlyb24uZ2V0KCJTVUJTVElUVVRJT05fTUlOX1NJTUlMQVJJVFkiLCAiMC43NSIpKQojIE1heGltdW0gbnVtYmVyIG9mIGFsdGVybmF0aXZlcyB0byBzdWdnZXN0IHBlciBtaXNzaW5nIGNhcmQKU1VCU1RJVFVUSU9OX01BWF9BTFRFUk5BVElWRVMgPSBpbnQob3MuZW52aXJvbi5nZXQoIlNVQlNUSVRVVElPTl9NQVhfQUxURVJOQVRJVkVTIiwgIjUiKSkKIyBNb2RlbCBmb3Igc3Vic3RpdHV0aW9uIGZhbGxiYWNrIChzb25hciBpcyBmaW5lIOKAlCBzbWFsbCBmb2N1c2VkIHF1ZXJpZXMpClNVQlNUSVRVVElPTl9NT0RFTCA9IG9zLmVudmlyb24uZ2V0KCJTVUJTVElUVVRJT05fTU9ERUwiLCAic29uYXIiKQojIEVuYWJsZSBQZXJwbGV4aXR5IGZhbGxiYWNrIGZvciBsb3ctY29uZmlkZW5jZSBlbWJlZGRpbmcgbWF0Y2hlcwpTVUJTVElUVVRJT05fVVNFX1BQTFhfRkFMTEJBQ0sgPSBvcy5lbnZpcm9uLmdldCgiU1VCU1RJVFVUSU9OX1VTRV9QUExYX0ZBTExCQUNLIiwgInRydWUiKS5sb3dlcigpID09ICJ0cnVlIgoKIyDilIDilIAgRW5zdXJlIGRpcmVjdG9yaWVzIGV4aXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApkZWYgZW5zdXJlX2RpcnMoKToKICAgICIiIkNyZWF0ZSByZXF1aXJlZCBkaXJlY3RvcmllcyBpZiB0aGV5IGRvbid0IGV4aXN0LiIiIgogICAgRU1CRURESU5HU19ESVIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogICAgREVDS19SRVBPUlRTX0RJUi5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCiAgICBDT0FDSF9TRVNTSU9OU19ESVIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQo='
Install-B64 -R 'coach\config.py' -B $b
# coach/embeddings.py (12,853 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIE1URyBDYXJkIEVtYmVkZGluZ3MgSW5kZXgK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCkxvYWRzIHByZS1jb21wdXRlZCBjYXJkIGVtYmVkZGluZ3MgZnJvbSBtaW5pbWF4aXIvbXRnLWVtYmVkZGluZ3MKKEh1Z2dpbmcgRmFjZSkgYW5kIHByb3ZpZGVzIHZlY3RvciBzaW1pbGFyaXR5IHNlYXJjaCB3aXRoCm1ldGFkYXRhIGZpbHRlcmluZyAoY29sb3IgaWRlbnRpdHksIHR5cGUsIG1hbmEgdmFsdWUpLgoKRGF0YSBzb3VyY2U6IGh0dHBzOi8vaHVnZ2luZ2ZhY2UuY28vZGF0YXNldHMvbWluaW1heGlyL210Zy1lbWJlZGRpbmdzCkZvcm1hdDogUGFycXVldCB3aXRoIDc2OC1kaW0gZmxvYXQzMiBlbWJlZGRpbmdzIHBlciBjYXJkICh+MzJLIGNhcmRzKQpNb2RlbDogQWxpYmFiYS1OTFAvZ3RlLW1vZGVybmJlcnQtYmFzZQoKVXNlcyBOdW1QeSBicnV0ZS1mb3JjZSBjb3NpbmUgc2ltaWxhcml0eSDigJQgZmFzdCBlbm91Z2ggZm9yIH4zMksgY2FyZHMgKDwxMDBtcykuCiIiIgoKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCmltcG9ydCBvcwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIE9wdGlvbmFsLCBUdXBsZQpmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuLCBSZXF1ZXN0CgppbXBvcnQgbnVtcHkgYXMgbnAKCmZyb20gLmNvbmZpZyBpbXBvcnQgRU1CRURESU5HU19ESVIsIEVNQkVERElOR1NfTlBaLCBFTUJFRERJTkdTX1BBUlFVRVQKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb2FjaC5lbWJlZGRpbmdzIikKCiMg4pSA4pSAIEh1Z2dpbmdGYWNlIGRvd25sb2FkIFVSTCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKSEZfUEFSUVVFVF9VUkwgPSAoCiAgICAiaHR0cHM6Ly9odWdnaW5nZmFjZS5jby9kYXRhc2V0cy9taW5pbWF4aXIvbXRnLWVtYmVkZGluZ3MvIgogICAgInJlc29sdmUvbWFpbi9tdGdfZW1iZWRkaW5ncy5wYXJxdWV0IgopCgojIOKUgOKUgCBDb2xvciBpZGVudGl0eSBwYXJzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIE1hcHMgbWFuYSBzeW1ib2xzIGxpa2Uge1d9LCB7VX0sIHtCfSwge1J9LCB7R30gdG8gY29sb3IgbGV0dGVycwpNQU5BX1NZTUJPTF9DT0xPUlMgPSB7CiAgICAiVyI6ICJXIiwgIlUiOiAiVSIsICJCIjogIkIiLCAiUiI6ICJSIiwgIkciOiAiRyIKfQoKCmRlZiBfcGFyc2VfY29sb3JfaWRlbnRpdHkobWFuYV9jb3N0OiBzdHIpIC0+IHN0cjoKICAgICIiIkV4dHJhY3QgY29sb3IgaWRlbnRpdHkgc3RyaW5nIGZyb20gbWFuYSBjb3N0IGxpa2UgJ3syfXtXfXtVfScuIiIiCiAgICBpZiBub3QgbWFuYV9jb3N0OgogICAgICAgIHJldHVybiAiIgogICAgY29sb3JzID0gc2V0KCkKICAgIGZvciBtYXRjaCBpbiByZS5maW5kaXRlcihyJ1x7KFtXVUJSR10pXH0nLCBtYW5hX2Nvc3Qgb3IgIiIpOgogICAgICAgIGNvbG9ycy5hZGQobWF0Y2guZ3JvdXAoMSkpCiAgICAjIFNvcnQgaW4gV1VCUkcgb3JkZXIKICAgIG9yZGVyID0gIldVQlJHIgogICAgcmV0dXJuICIiLmpvaW4oYyBmb3IgYyBpbiBvcmRlciBpZiBjIGluIGNvbG9ycykKCgpkZWYgX3BhcnNlX21hbmFfdmFsdWUobWFuYV9jb3N0OiBzdHIpIC0+IGZsb2F0OgogICAgIiIiQ29tcHV0ZSBjb252ZXJ0ZWQgbWFuYSBjb3N0IGZyb20gbWFuYSBjb3N0IHN0cmluZy4iIiIKICAgIGlmIG5vdCBtYW5hX2Nvc3Q6CiAgICAgICAgcmV0dXJuIDAuMAogICAgdG90YWwgPSAwLjAKICAgIGZvciBtYXRjaCBpbiByZS5maW5kaXRlcihyJ1x7KFtefV0rKVx9JywgbWFuYV9jb3N0IG9yICIiKToKICAgICAgICBzeW1ib2wgPSBtYXRjaC5ncm91cCgxKQogICAgICAgIGlmIHN5bWJvbCBpbiBNQU5BX1NZTUJPTF9DT0xPUlM6CiAgICAgICAgICAgIHRvdGFsICs9IDEuMAogICAgICAgIGVsaWYgc3ltYm9sID09ICJYIjoKICAgICAgICAgICAgcGFzcyAgIyBYID0gMCBmb3IgQ01DIHB1cnBvc2VzCiAgICAg' +
'ICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdG90YWwgKz0gZmxvYXQoc3ltYm9sKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICMgSHlicmlkL3BoeXJleGlhbiBzeW1ib2xzIGNvdW50IGFzIDEKICAgICAgICAgICAgICAgIHRvdGFsICs9IDEuMAogICAgcmV0dXJuIHRvdGFsCgoKZGVmIF9pc19jb2xvcl9zdWJzZXQoY2FyZF9jb2xvcnM6IHN0ciwgZGVja19jb2xvcnM6IExpc3Rbc3RyXSkgLT4gYm9vbDoKICAgICIiIkNoZWNrIGlmIGNhcmQncyBjb2xvciBpZGVudGl0eSBpcyB3aXRoaW4gZGVjaydzIGNvbG9yIGlkZW50aXR5LiIiIgogICAgZGVja19zZXQgPSBzZXQoZGVja19jb2xvcnMpCiAgICBjYXJkX3NldCA9IHNldChjYXJkX2NvbG9ycykKICAgIHJldHVybiBjYXJkX3NldC5pc3N1YnNldChkZWNrX3NldCkgb3IgbGVuKGNhcmRfc2V0KSA9PSAwICAjIGNvbG9ybGVzcyBhbHdheXMgYWxsb3dlZAoKCmNsYXNzIENhcmRNYXRjaDoKICAgICIiIlJlc3VsdCBmcm9tIGFuIGVtYmVkZGluZyBzaW1pbGFyaXR5IHNlYXJjaC4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lOiBzdHIsIHNpbWlsYXJpdHk6IGZsb2F0LCB0eXBlczogc3RyID0gIiIsCiAgICAgICAgICAgICAgICAgbWFuYV92YWx1ZTogZmxvYXQgPSAwLCBjb2xvcl9pZGVudGl0eTogc3RyID0gIiIsCiAgICAgICAgICAgICAgICAgbWFuYV9jb3N0OiBzdHIgPSAiIiwgdGV4dDogc3RyID0gIiIpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnNpbWlsYXJpdHkgPSBzaW1pbGFyaXR5CiAgICAgICAgc2VsZi50eXBlcyA9IHR5cGVzCiAgICAgICAgc2VsZi5tYW5hX3ZhbHVlID0gbWFuYV92YWx1ZQogICAgICAgIHNlbGYuY29sb3JfaWRlbnRpdHkgPSBjb2xvcl9pZGVudGl0eQogICAgICAgIHNlbGYubWFuYV9jb3N0ID0gbWFuYV9jb3N0CiAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAoKICAgIGRlZiB0b19kaWN0KHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgIm5hbWUiOiBzZWxmLm5hbWUsCiAgICAgICAgICAgICJzaW1pbGFyaXR5Ijogcm91bmQoc2VsZi5zaW1pbGFyaXR5LCA0KSwKICAgICAgICAgICAgInR5cGVzIjogc2VsZi50eXBlcywKICAgICAgICAgICAgIm1hbmFfdmFsdWUiOiBzZWxmLm1hbmFfdmFsdWUsCiAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IHNlbGYuY29sb3JfaWRlbnRpdHksCiAgICAgICAgICAgICJtYW5hX2Nvc3QiOiBzZWxmLm1hbmFfY29zdCwKICAgICAgICAgICAgInRleHQiOiBzZWxmLnRleHRbOjIwMF0gaWYgc2VsZi50ZXh0IGVsc2UgIiIsCiAgICAgICAgfQoKCmNsYXNzIE1UR0VtYmVkZGluZ0luZGV4OgogICAgIiIiCiAgICBJbi1tZW1vcnkgaW5kZXggb2YgTVRHIGNhcmQgZW1iZWRkaW5ncyBmb3Igc2ltaWxhcml0eSBzZWFyY2guCgogICAgVXNhZ2U6CiAgICAgICAgaW5kZXggPSBNVEdFbWJlZGRpbmdJbmRleCgpCiAgICAgICAgaW5kZXgubG9hZCgpCiAgICAgICAgbWF0Y2hlcyA9IGluZGV4LnNlYXJjaF9zaW1pbGFyKCJTb2wgUmluZyIsIHRvcF9uPTEwKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYubmFtZXM6IG5wLm5kYXJyYXkgPSBOb25lICAgICAgICMgKE4sKSBzdHJpbmcgYXJyYXkKICAgICAgICBzZWxmLmNvbG9yczogbnAubmRhcnJheSA9IE5vbmUgICAgICAjIChOLCkgc3RyaW5nIGFycmF5IChlLmcuLCAiV1UiLCAiQlJHIikKICAgICAgICBzZWxmLm1hbmFfdmFsdWVzOiBucC5uZGFycmF5ID0gTm9uZSAjIChOLCkgZmxvYXQgYXJyYXkKICAgICAgICBzZWxmLnR5cGVzOiBucC5uZGFycmF5ID0gTm9uZSAgICAgICAjIChOLCkgc3RyaW5nIGFycmF5CiAgICAgICAgc2VsZi5tYW5hX2Nvc3RzOiBucC5uZGFycmF5ID0gTm9uZSAgIyAoTiwpIHN0cmluZyBhcnJheQogICAgICAgIHNlbGYudGV4dHM6IG5wLm5kYXJyYXkgPSBOb25lICAgICAgICMgKE4sKSBzdHJpbmcgYXJyYXkKICAgICAgICBzZWxmLnZlY3RvcnM6IG5wLm5kYXJyYXkgPSBOb25lICAgICAjIChOLCA3NjgpIGZsb2F0MzIsIEwyLW5vcm1hbGl6ZWQKICAgICAgICBzZWxmLl9uYW1lX3RvX2lkeDogZGljdCA9IHt9CiAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2FkZWQoc2VsZikgLT4gYm9vbDoKICAgICAgICByZXR1cm4gc2VsZi5fbG9hZGVkCgogICAg' +
'QHByb3BlcnR5CiAgICBkZWYgY2FyZF9jb3VudChzZWxmKSAtPiBpbnQ6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLm5hbWVzKSBpZiBzZWxmLm5hbWVzIGlzIG5vdCBOb25lIGVsc2UgMAoKICAgIGRlZiBkb3dubG9hZF9wYXJxdWV0KHNlbGYsIGZvcmNlOiBib29sID0gRmFsc2UpIC0+IFBhdGg6CiAgICAgICAgIiIiRG93bmxvYWQgdGhlIG10Zy1lbWJlZGRpbmdzIHBhcnF1ZXQgZmlsZSBmcm9tIEh1Z2dpbmdGYWNlLiIiIgogICAgICAgIEVNQkVERElOR1NfRElSLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICAgICAgaWYgRU1CRURESU5HU19QQVJRVUVULmV4aXN0cygpIGFuZCBub3QgZm9yY2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJQYXJxdWV0IGFscmVhZHkgZXhpc3RzOiAlcyIsIEVNQkVERElOR1NfUEFSUVVFVCkKICAgICAgICAgICAgcmV0dXJuIEVNQkVERElOR1NfUEFSUVVFVAoKICAgICAgICBsb2dnZXIuaW5mbygiRG93bmxvYWRpbmcgbXRnLWVtYmVkZGluZ3MgZnJvbSBIdWdnaW5nRmFjZS4uLiIpCiAgICAgICAgcmVxID0gUmVxdWVzdChIRl9QQVJRVUVUX1VSTCwgaGVhZGVycz17IlVzZXItQWdlbnQiOiAiY29tbWFuZGVyLWFpLWxhYi8xLjAifSkKICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTEyMCkgYXMgcmVzcDoKICAgICAgICAgICAgZGF0YSA9IHJlc3AucmVhZCgpCgogICAgICAgIHdpdGggb3BlbihFTUJFRERJTkdTX1BBUlFVRVQsICJ3YiIpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICBsb2dnZXIuaW5mbygiRG93bmxvYWRlZCAlLjFmIE1CIHRvICVzIiwKICAgICAgICAgICAgICAgICAgICAgbGVuKGRhdGEpIC8gMTAyNCAvIDEwMjQsIEVNQkVERElOR1NfUEFSUVVFVCkKICAgICAgICByZXR1cm4gRU1CRURESU5HU19QQVJRVUVUCgogICAgZGVmIGNvbnZlcnRfcGFycXVldF90b19ucHooc2VsZikgLT4gUGF0aDoKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IHRoZSBQYXJxdWV0IGZpbGUgdG8gYSBjb21wYWN0IE5QWiBmb3IgZmFzdCBsb2FkaW5nLgogICAgICAgIFJlcXVpcmVzIHBhbmRhcyBhbmQgcHlhcnJvdy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBwYW5kYXMgYXMgcGQKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJwYW5kYXMgaXMgcmVxdWlyZWQ6IHBpcCBpbnN0YWxsIHBhbmRhcyBweWFycm93IikKCiAgICAgICAgbG9nZ2VyLmluZm8oIkNvbnZlcnRpbmcgcGFycXVldCB0byBOUFouLi4iKQogICAgICAgIGRmID0gcGQucmVhZF9wYXJxdWV0KHN0cihFTUJFRERJTkdTX1BBUlFVRVQpKQoKICAgICAgICBuYW1lcyA9IGRmWyJuYW1lIl0udmFsdWVzLmFzdHlwZShzdHIpCiAgICAgICAgbWFuYV9jb3N0cyA9IGRmWyJtYW5hQ29zdCJdLmZpbGxuYSgiIikudmFsdWVzLmFzdHlwZShzdHIpCiAgICAgICAgdHlwZXMgPSBkZlsidHlwZSJdLmZpbGxuYSgiIikudmFsdWVzLmFzdHlwZShzdHIpCiAgICAgICAgdGV4dHMgPSBkZlsidGV4dCJdLmZpbGxuYSgiIikudmFsdWVzLmFzdHlwZShzdHIpCgogICAgICAgICMgUGFyc2UgY29sb3IgaWRlbnRpdGllcyBmcm9tIG1hbmEgY29zdHMKICAgICAgICBjb2xvcnMgPSBucC5hcnJheShbX3BhcnNlX2NvbG9yX2lkZW50aXR5KG1jKSBmb3IgbWMgaW4gbWFuYV9jb3N0c10pCiAgICAgICAgbWFuYV92YWx1ZXMgPSBucC5hcnJheShbX3BhcnNlX21hbmFfdmFsdWUobWMpIGZvciBtYyBpbiBtYW5hX2Nvc3RzXSwgZHR5cGU9bnAuZmxvYXQzMikKCiAgICAgICAgIyBFeHRyYWN0IGVtYmVkZGluZyB2ZWN0b3JzCiAgICAgICAgZW1iZWRkaW5ncyA9IG5wLnZzdGFjayhkZlsiZW1iZWRkaW5nIl0udG9fbnVtcHkoKSkuYXN0eXBlKG5wLmZsb2F0MzIpCgogICAgICAgICMgTDIgbm9ybWFsaXplIGZvciBjb3NpbmUgc2ltaWxhcml0eSB2aWEgZG90IHByb2R1Y3QKICAgICAgICBub3JtcyA9IG5wLmxpbmFsZy5ub3JtKGVtYmVkZGluZ3MsIGF4aXM9MSwga2VlcGRpbXM9VHJ1ZSkKICAgICAgICBub3Jtc1tub3JtcyA9PSAwXSA9IDEuMAogICAgICAgIGVtYmVkZGluZ3MgPSBlbWJlZGRpbmdzIC8gbm9ybXMKCiAgICAgICAgbnAuc2F2ZXpfY29tcHJlc3NlZCgKICAgICAgICAgICAgc3RyKEVNQkVERElOR1NfTlBaKSwKICAgICAgICAgICAgbmFtZXM9bmFtZXMsCiAgICAgICAgICAgIGNvbG9ycz1jb2xvcnMsCiAgICAgICAg' +
'ICAgIG1hbmFfdmFsdWVzPW1hbmFfdmFsdWVzLAogICAgICAgICAgICB0eXBlcz10eXBlcywKICAgICAgICAgICAgbWFuYV9jb3N0cz1tYW5hX2Nvc3RzLAogICAgICAgICAgICB0ZXh0cz10ZXh0cywKICAgICAgICAgICAgdmVjdG9ycz1lbWJlZGRpbmdzLAogICAgICAgICkKCiAgICAgICAgc2l6ZV9tYiA9IG9zLnBhdGguZ2V0c2l6ZShFTUJFRERJTkdTX05QWikgLyAxMDI0IC8gMTAyNAogICAgICAgIGxvZ2dlci5pbmZvKCJTYXZlZCBOUFo6ICVkIGNhcmRzLCAlLjFmIE1CIGF0ICVzIiwKICAgICAgICAgICAgICAgICAgICAgbGVuKG5hbWVzKSwgc2l6ZV9tYiwgRU1CRURESU5HU19OUFopCiAgICAgICAgcmV0dXJuIEVNQkVERElOR1NfTlBaCgogICAgZGVmIGxvYWQoc2VsZiwgZm9yY2VfZG93bmxvYWQ6IGJvb2wgPSBGYWxzZSkgLT4gYm9vbDoKICAgICAgICAiIiIKICAgICAgICBMb2FkIGVtYmVkZGluZ3MgZnJvbSBOUFogKGZhc3QpIG9yIGZhbGwgYmFjayB0byBkb3dubG9hZGluZwogICAgICAgIGFuZCBjb252ZXJ0aW5nIGZyb20gUGFycXVldC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9sb2FkZWQgYW5kIG5vdCBmb3JjZV9kb3dubG9hZDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBUcnkgTlBaIGZpcnN0IChmYXN0IHBhdGgpCiAgICAgICAgaWYgRU1CRURESU5HU19OUFouZXhpc3RzKCkgYW5kIG5vdCBmb3JjZV9kb3dubG9hZDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xvYWRfbnB6KCkKCiAgICAgICAgIyBEb3dubG9hZCBhbmQgY29udmVydAogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5kb3dubG9hZF9wYXJxdWV0KGZvcmNlPWZvcmNlX2Rvd25sb2FkKQogICAgICAgICAgICBzZWxmLmNvbnZlcnRfcGFycXVldF90b19ucHooKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fbG9hZF9ucHooKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gbG9hZCBlbWJlZGRpbmdzOiAlcyIsIGUpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfbG9hZF9ucHooc2VsZikgLT4gYm9vbDoKICAgICAgICAiIiJMb2FkIGZyb20gcHJlLWJ1aWx0IE5QWiBmaWxlLiIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IG5wLmxvYWQoc3RyKEVNQkVERElOR1NfTlBaKSwgYWxsb3dfcGlja2xlPVRydWUpCiAgICAgICAgICAgIHNlbGYubmFtZXMgPSBkYXRhWyJuYW1lcyJdCiAgICAgICAgICAgIHNlbGYuY29sb3JzID0gZGF0YVsiY29sb3JzIl0KICAgICAgICAgICAgc2VsZi5tYW5hX3ZhbHVlcyA9IGRhdGFbIm1hbmFfdmFsdWVzIl0KICAgICAgICAgICAgc2VsZi50eXBlcyA9IGRhdGFbInR5cGVzIl0KICAgICAgICAgICAgc2VsZi5tYW5hX2Nvc3RzID0gZGF0YS5nZXQoIm1hbmFfY29zdHMiLCBucC5hcnJheShbIiJdICogbGVuKHNlbGYubmFtZXMpKSkKICAgICAgICAgICAgc2VsZi50ZXh0cyA9IGRhdGEuZ2V0KCJ0ZXh0cyIsIG5wLmFycmF5KFsiIl0gKiBsZW4oc2VsZi5uYW1lcykpKQogICAgICAgICAgICBzZWxmLnZlY3RvcnMgPSBkYXRhWyJ2ZWN0b3JzIl0KCiAgICAgICAgICAgICMgQnVpbGQgbmFtZSBsb29rdXAKICAgICAgICAgICAgc2VsZi5fbmFtZV90b19pZHggPSB7CiAgICAgICAgICAgICAgICBuYW1lLmxvd2VyKCk6IGkgZm9yIGksIG5hbWUgaW4gZW51bWVyYXRlKHNlbGYubmFtZXMpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQogICAgICAgICAgICBsb2dnZXIuaW5mbygiTG9hZGVkICVkIGNhcmQgZW1iZWRkaW5ncyBmcm9tIE5QWiIsIGxlbihzZWxmLm5hbWVzKSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGxvYWQgTlBaOiAlcyIsIGUpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBnZXRfY2FyZF92ZWN0b3Ioc2VsZiwgY2FyZF9uYW1lOiBzdHIpIC0+IE9wdGlvbmFsW25wLm5kYXJyYXldOgogICAgICAgICIiIkdldCB0aGUgZW1iZWRkaW5nIHZlY3RvciBmb3IgYSBjYXJkIGJ5IG5hbWUgKGNhc2UtaW5zZW5zaXRpdmUpLiIiIgogICAgICAgIGlkeCA9IHNlbGYuX25hbWVfdG9faWR4LmdldChjYXJkX25hbWUubG93ZXIoKSkKICAgICAgICBpZiBpZHggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnZlY3RvcnNb' +
'aWR4XQogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIHNlYXJjaF9zaW1pbGFyKHNlbGYsIHF1ZXJ5X2NhcmQ6IHN0ciwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9maWx0ZXI6IExpc3Rbc3RyXSA9IE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9maWx0ZXI6IHN0ciA9IE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgbWFuYV9yYW5nZTogVHVwbGVbZmxvYXQsIGZsb2F0XSA9IE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9jYXJkczogTGlzdFtzdHJdID0gTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICB0b3BfbjogaW50ID0gMjApIC0+IExpc3RbQ2FyZE1hdGNoXToKICAgICAgICAiIiIKICAgICAgICBGaW5kIHRoZSBtb3N0IHNpbWlsYXIgY2FyZHMgdG8gcXVlcnlfY2FyZC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcXVlcnlfY2FyZDogQ2FyZCBuYW1lIHRvIGZpbmQgc2ltaWxhciBjYXJkcyBmb3IKICAgICAgICAgICAgY29sb3JfZmlsdGVyOiBPbmx5IHJldHVybiBjYXJkcyB3aXRoaW4gdGhlc2UgY29sb3JzIChlLmcuLCBbIlciLCAiVSIsICJCIl0pCiAgICAgICAgICAgIHR5cGVfZmlsdGVyOiBGaWx0ZXIgYnkgdHlwZSBzdWJzdHJpbmcgKGUuZy4sICJDcmVhdHVyZSIsICJJbnN0YW50IikKICAgICAgICAgICAgbWFuYV9yYW5nZTogKG1pbl9tdiwgbWF4X212KSBtYW5hIHZhbHVlIHJhbmdlCiAgICAgICAgICAgIGV4Y2x1ZGVfY2FyZHM6IENhcmQgbmFtZXMgdG8gZXhjbHVkZSBmcm9tIHJlc3VsdHMKICAgICAgICAgICAgdG9wX246IE51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBMaXN0IG9mIENhcmRNYXRjaCBvYmplY3RzIHNvcnRlZCBieSBzaW1pbGFyaXR5IChkZXNjZW5kaW5nKQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9sb2FkZWQ6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJFbWJlZGRpbmdzIG5vdCBsb2FkZWQsIGNhbGwgbG9hZCgpIGZpcnN0IikKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHF1ZXJ5X3ZlYyA9IHNlbGYuZ2V0X2NhcmRfdmVjdG9yKHF1ZXJ5X2NhcmQpCiAgICAgICAgaWYgcXVlcnlfdmVjIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJDYXJkIG5vdCBmb3VuZCBpbiBlbWJlZGRpbmdzOiAlcyIsIHF1ZXJ5X2NhcmQpCiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICAjIENvbXB1dGUgc2ltaWxhcml0aWVzIChkb3QgcHJvZHVjdCBvbiBub3JtYWxpemVkIHZlY3RvcnMgPSBjb3NpbmUgc2ltaWxhcml0eSkKICAgICAgICBzaW1pbGFyaXRpZXMgPSBzZWxmLnZlY3RvcnMgQCBxdWVyeV92ZWMKCiAgICAgICAgIyBCdWlsZCBleGNsdXNpb24gc2V0CiAgICAgICAgZXhjbHVkZV9zZXQgPSBzZXQoKQogICAgICAgIGV4Y2x1ZGVfc2V0LmFkZChxdWVyeV9jYXJkLmxvd2VyKCkpCiAgICAgICAgaWYgZXhjbHVkZV9jYXJkczoKICAgICAgICAgICAgZXhjbHVkZV9zZXQudXBkYXRlKG5hbWUubG93ZXIoKSBmb3IgbmFtZSBpbiBleGNsdWRlX2NhcmRzKQoKICAgICAgICAjIEZpbHRlciBhbmQgY29sbGVjdCByZXN1bHRzCiAgICAgICAgcmVzdWx0cyA9IFtdCiAgICAgICAgZm9yIGlkeCBpbiBucC5hcmdzb3J0KHNpbWlsYXJpdGllcylbOjotMV06CiAgICAgICAgICAgIG5hbWUgPSBzdHIoc2VsZi5uYW1lc1tpZHhdKQogICAgICAgICAgICBpZiBuYW1lLmxvd2VyKCkgaW4gZXhjbHVkZV9zZXQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBDb2xvciBmaWx0ZXIKICAgICAgICAgICAgaWYgY29sb3JfZmlsdGVyOgogICAgICAgICAgICAgICAgY2FyZF9jb2xvcnMgPSBzdHIoc2VsZi5jb2xvcnNbaWR4XSkKICAgICAgICAgICAgICAgIGlmIG5vdCBfaXNfY29sb3Jfc3Vic2V0KGNhcmRfY29sb3JzLCBjb2xvcl9maWx0ZXIpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIFR5cGUgZmlsdGVyCiAgICAgICAgICAgIGlmIHR5cGVfZmlsdGVyOgogICAgICAgICAgICAgICAgY2FyZF90eXBlID0gc3RyKHNlbGYudHlwZXNbaWR4XSkKICAgICAgICAgICAgICAgIGlmIHR5cGVfZmlsdGVyLmxvd2VyKCkgbm90IGluIGNhcmRfdHlwZS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIE1hbmEgdmFsdWUgcmFuZ2UgZmlsdGVyCiAgICAgICAgICAgIGlmIG1hbmFf' +
'cmFuZ2U6CiAgICAgICAgICAgICAgICBtdiA9IGZsb2F0KHNlbGYubWFuYV92YWx1ZXNbaWR4XSkKICAgICAgICAgICAgICAgIGlmIG12IDwgbWFuYV9yYW5nZVswXSBvciBtdiA+IG1hbmFfcmFuZ2VbMV06CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKENhcmRNYXRjaCgKICAgICAgICAgICAgICAgIG5hbWU9bmFtZSwKICAgICAgICAgICAgICAgIHNpbWlsYXJpdHk9ZmxvYXQoc2ltaWxhcml0aWVzW2lkeF0pLAogICAgICAgICAgICAgICAgdHlwZXM9c3RyKHNlbGYudHlwZXNbaWR4XSksCiAgICAgICAgICAgICAgICBtYW5hX3ZhbHVlPWZsb2F0KHNlbGYubWFuYV92YWx1ZXNbaWR4XSksCiAgICAgICAgICAgICAgICBjb2xvcl9pZGVudGl0eT1zdHIoc2VsZi5jb2xvcnNbaWR4XSksCiAgICAgICAgICAgICAgICBtYW5hX2Nvc3Q9c3RyKHNlbGYubWFuYV9jb3N0c1tpZHhdKSBpZiBzZWxmLm1hbmFfY29zdHMgaXMgbm90IE5vbmUgZWxzZSAiIiwKICAgICAgICAgICAgICAgIHRleHQ9c3RyKHNlbGYudGV4dHNbaWR4XSkgaWYgc2VsZi50ZXh0cyBpcyBub3QgTm9uZSBlbHNlICIiLAogICAgICAgICAgICApKQoKICAgICAgICAgICAgaWYgbGVuKHJlc3VsdHMpID49IHRvcF9uOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCiAgICBkZWYgZmluZF9yZXBsYWNlbWVudHMoc2VsZiwgdW5kZXJwZXJmb3JtZXI6IHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNrX2NvbG9yczogTGlzdFtzdHJdLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfY2FyZF9uYW1lczogTGlzdFtzdHJdID0gTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlX3RhZzogc3RyID0gTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BfbjogaW50ID0gMTApIC0+IExpc3RbQ2FyZE1hdGNoXToKICAgICAgICAiIiIKICAgICAgICBGaW5kIHJlcGxhY2VtZW50IGNhbmRpZGF0ZXMgZm9yIGFuIHVuZGVycGVyZm9ybWluZyBjYXJkLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICB1bmRlcnBlcmZvcm1lcjogQ2FyZCBuYW1lIHRvIHJlcGxhY2UKICAgICAgICAgICAgZGVja19jb2xvcnM6IERlY2sncyBjb2xvciBpZGVudGl0eSAoZS5nLiwgWyJXIiwgIlUiLCAiQiJdKQogICAgICAgICAgICBkZWNrX2NhcmRfbmFtZXM6IEFsbCBjYXJkIG5hbWVzIGN1cnJlbnRseSBpbiB0aGUgZGVjayAoZXhjbHVkZWQgZnJvbSByZXN1bHRzKQogICAgICAgICAgICByb2xlX3RhZzogT3B0aW9uYWwgdHlwZS9yb2xlIGZpbHRlcgogICAgICAgICAgICB0b3BfbjogTnVtYmVyIG9mIGNhbmRpZGF0ZXMgdG8gcmV0dXJuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuc2VhcmNoX3NpbWlsYXIoCiAgICAgICAgICAgIHF1ZXJ5X2NhcmQ9dW5kZXJwZXJmb3JtZXIsCiAgICAgICAgICAgIGNvbG9yX2ZpbHRlcj1kZWNrX2NvbG9ycywKICAgICAgICAgICAgdHlwZV9maWx0ZXI9cm9sZV90YWcsCiAgICAgICAgICAgIGV4Y2x1ZGVfY2FyZHM9ZGVja19jYXJkX25hbWVzLAogICAgICAgICAgICB0b3Bfbj10b3BfbiwKICAgICAgICApCg=='
Install-B64 -R 'coach\embeddings.py' -B $b
# coach/llm_client.py (11,114 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIExNIFN0dWRpbyBDbGllbnQK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCkFzeW5jIEhUVFAgY2xpZW50IHRhcmdldGluZyBMTSBTdHVkaW8ncyBPcGVuQUktY29tcGF0aWJsZQovdjEvY2hhdC9jb21wbGV0aW9ucyBlbmRwb2ludC4gSW5jbHVkZXMgcmV0cnkgbG9naWMgZm9yCm5vbi1KU09OIHJlc3BvbnNlcyBhbmQgY29uZmlndXJhYmxlIHRpbWVvdXQuCiIiIgoKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IGFzeW5jaW8KZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4sIFJlcXVlc3QKZnJvbSB1cmxsaWIuZXJyb3IgaW1wb3J0IFVSTEVycm9yCgpmcm9tIC5jb25maWcgaW1wb3J0ICgKICAgIExNX1NUVURJT19VUkwsIExNX1NUVURJT19NT0RFTCwKICAgIExNX1NUVURJT19USU1FT1VULCBMTV9TVFVESU9fTUFYX1JFVFJJRVMsCiAgICBERUZBVUxUX1RFTVBFUkFUVVJFLCBERUZBVUxUX01BWF9UT0tFTlMsCikKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb2FjaC5sbG0iKQoKCmNsYXNzIExMTVJlc3BvbnNlOgogICAgIiIiUGFyc2VkIExMTSByZXNwb25zZSBjb250YWluZXIuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGVudDogc3RyLCBwYXJzZWRfanNvbjogT3B0aW9uYWxbZGljdF0sCiAgICAgICAgICAgICAgICAgcHJvbXB0X3Rva2VuczogaW50LCBjb21wbGV0aW9uX3Rva2VuczogaW50LAogICAgICAgICAgICAgICAgIG1vZGVsOiBzdHIpOgogICAgICAgIHNlbGYuY29udGVudCA9IGNvbnRlbnQKICAgICAgICBzZWxmLnBhcnNlZF9qc29uID0gcGFyc2VkX2pzb24KICAgICAgICBzZWxmLnByb21wdF90b2tlbnMgPSBwcm9tcHRfdG9rZW5zCiAgICAgICAgc2VsZi5jb21wbGV0aW9uX3Rva2VucyA9IGNvbXBsZXRpb25fdG9rZW5zCiAgICAgICAgc2VsZi5tb2RlbCA9IG1vZGVsCgoKY2xhc3MgTE1TdHVkaW9DbGllbnQ6CiAgICAiIiIKICAgIENsaWVudCBmb3IgTE0gU3R1ZGlvJ3MgT3BlbkFJLWNvbXBhdGlibGUgQVBJLgoKICAgIFVzYWdlOgogICAgICAgIGNsaWVudCA9IExNU3R1ZGlvQ2xpZW50KCkKICAgICAgICByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5jaGF0KHN5c3RlbV9wcm9tcHQsIHVzZXJfcHJvbXB0KQogICAgICAgIGlmIHJlc3BvbnNlLnBhcnNlZF9qc29uOgogICAgICAgICAgICBzdWdnZXN0aW9ucyA9IHJlc3BvbnNlLnBhcnNlZF9qc29uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZV91cmw6IHN0ciA9IE5vbmUsIG1vZGVsOiBzdHIgPSBOb25lLAogICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGludCA9IE5vbmUpOgogICAgICAgIHNlbGYuYmFzZV91cmwgPSAoYmFzZV91cmwgb3IgTE1fU1RVRElPX1VSTCkucnN0cmlwKCIvIikKICAgICAgICBzZWxmLm1vZGVsID0gbW9kZWwgb3IgTE1fU1RVRElPX01PREVMCiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dCBvciBMTV9TVFVESU9fVElNRU9VVAogICAgICAgIHNlbGYuX3Jlc29sdmVkX21vZGVsID0gTm9uZSAgIyBhY3R1YWwgbW9kZWwgbmFtZSBmcm9tIC9tb2RlbHMgZW5kcG9pbnQKCiAgICBkZWYgX3Jlc29sdmVfbW9kZWwoc2VsZikgLT4gc3RyOgogICAgICAgICIiIkdldCB0aGUgYWN0dWFsIGxvYWRlZCBtb2RlbCBuYW1lIGZyb20gTE0gU3R1ZGlvIC9tb2RlbHMgZW5kcG9pbnQuIiIiCiAgICAgICAgaWYgc2VsZi5fcmVzb2x2ZWRfbW9kZWw6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXNvbHZlZF9tb2RlbAogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5jaGVja19jb25uZWN0aW9uKCkKICAgICAgICAgICAgaWYgc3RhdHVzLmdldCgiY29ubmVjdGVkIikgYW5kIHN0YXR1cy5nZXQoImFjdGl2ZV9tb2RlbCIpOgogICAgICAgICAgICAgICAgc2VsZi5fcmVzb2x2ZWRfbW9kZWwgPSBzdGF0dXNbImFjdGl2ZV9tb2RlbCJdCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUmVzb2x2ZWQgTE0gU3R1ZGlvIG1vZGVsOiAlcyIsIHNlbGYuX3Jlc29sdmVkX21vZGVsKQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc29sdmVkX21vZGVsCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgICAg' +
'IHJldHVybiBzZWxmLm1vZGVsCgogICAgZGVmIF9idWlsZF9yZXF1ZXN0X2JvZHkoc2VsZiwgc3lzdGVtX3Byb21wdDogc3RyLCB1c2VyX3Byb21wdDogc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmU6IGZsb2F0LCBtYXhfdG9rZW5zOiBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZV9qc29uOiBib29sKSAtPiBkaWN0OgogICAgICAgIG1vZGVsX25hbWUgPSBzZWxmLl9yZXNvbHZlX21vZGVsKCkKICAgICAgICBib2R5ID0gewogICAgICAgICAgICAibW9kZWwiOiBtb2RlbF9uYW1lLAogICAgICAgICAgICAibWVzc2FnZXMiOiBbCiAgICAgICAgICAgICAgICB7InJvbGUiOiAic3lzdGVtIiwgImNvbnRlbnQiOiBzeXN0ZW1fcHJvbXB0fSwKICAgICAgICAgICAgICAgIHsicm9sZSI6ICJ1c2VyIiwgImNvbnRlbnQiOiB1c2VyX3Byb21wdH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJ0ZW1wZXJhdHVyZSI6IHRlbXBlcmF0dXJlLAogICAgICAgICAgICAibWF4X3Rva2VucyI6IG1heF90b2tlbnMsCiAgICAgICAgfQogICAgICAgICMgT25seSByZXF1ZXN0IEpTT04gZm9ybWF0IGlmIHVzaW5nIGEgbW9kZWwgdGhhdCBzdXBwb3J0cyBpdAogICAgICAgICMgU29tZSBtb2RlbHMgKGVzcC4gc21hbGxlciBvbmVzKSBkb24ndCBzdXBwb3J0IHJlc3BvbnNlX2Zvcm1hdAogICAgICAgIGlmIGZvcmNlX2pzb246CiAgICAgICAgICAgIGJvZHlbInJlc3BvbnNlX2Zvcm1hdCJdID0geyJ0eXBlIjogImpzb25fb2JqZWN0In0KICAgICAgICByZXR1cm4gYm9keQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc3RyaXBfdGhpbmtfdGFncyh0ZXh0OiBzdHIpIC0+IHN0cjoKICAgICAgICAiIiJSZW1vdmUgRGVlcFNlZWstUjEgPHRoaW5rPi4uLjwvdGhpbms+IHJlYXNvbmluZyBibG9ja3MgZnJvbSBMTE0gb3V0cHV0LiIiIgogICAgICAgIGltcG9ydCByZQogICAgICAgICMgUmVtb3ZlIGFsbCA8dGhpbms+Li4uPC90aGluaz4gYmxvY2tzIChncmVlZHksIGhhbmRsZXMgbXVsdGlsaW5lKQogICAgICAgIGNsZWFuZWQgPSByZS5zdWIocic8dGhpbms+Lio/PC90aGluaz4nLCAnJywgdGV4dCwgZmxhZ3M9cmUuRE9UQUxMKQogICAgICAgIHJldHVybiBjbGVhbmVkLnN0cmlwKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2V4dHJhY3RfanNvbl9vYmplY3QodGV4dDogc3RyKSAtPiBPcHRpb25hbFtkaWN0XToKICAgICAgICAiIiJGaW5kIGFuZCBwYXJzZSB0aGUgZmlyc3QgY29tcGxldGUgSlNPTiBvYmplY3QgaW4gdGV4dC4KICAgICAgICBVc2VzIGJyYWNlLWNvdW50aW5nIHRvIGhhbmRsZSBuZXN0ZWQgb2JqZWN0cyByZWxpYWJseS4iIiIKICAgICAgICBzdGFydCA9IHRleHQuZmluZCgneycpCiAgICAgICAgaWYgc3RhcnQgPT0gLTE6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGRlcHRoID0gMAogICAgICAgIGluX3N0cmluZyA9IEZhbHNlCiAgICAgICAgZXNjYXBlX25leHQgPSBGYWxzZQoKICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFydCwgbGVuKHRleHQpKToKICAgICAgICAgICAgY2ggPSB0ZXh0W2ldCiAgICAgICAgICAgIGlmIGVzY2FwZV9uZXh0OgogICAgICAgICAgICAgICAgZXNjYXBlX25leHQgPSBGYWxzZQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgY2ggPT0gJ1xcJzoKICAgICAgICAgICAgICAgIGlmIGluX3N0cmluZzoKICAgICAgICAgICAgICAgICAgICBlc2NhcGVfbmV4dCA9IFRydWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGNoID09ICciJzoKICAgICAgICAgICAgICAgIGluX3N0cmluZyA9IG5vdCBpbl9zdHJpbmcKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGluX3N0cmluZzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGNoID09ICd7JzoKICAgICAgICAgICAgICAgIGRlcHRoICs9IDEKICAgICAgICAgICAgZWxpZiBjaCA9PSAnfSc6CiAgICAgICAgICAgICAgICBkZXB0aCAtPSAxCiAgICAgICAgICAgICAgICBpZiBkZXB0aCA9PSAwOgogICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IHRleHRbc3RhcnQ6aSsxXQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoY2FuZGlkYXRlKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFZh' +
'bHVlRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICAjIE1hbGZvcm1lZCDigJQgdHJ5IG5leHQgb3BlbmluZyBicmFjZQogICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3N0YXJ0ID0gdGV4dC5maW5kKCd7Jywgc3RhcnQgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXh0X3N0YXJ0ICE9IC0xIGFuZCBuZXh0X3N0YXJ0IDwgaToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbmV4dF9zdGFydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSAxICAjIHdlJ3JlIGFscmVhZHkgcGFzdCB0aGlzIGJyYWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX3BhcnNlX3Jlc3BvbnNlKHNlbGYsIHJhdzogZGljdCkgLT4gTExNUmVzcG9uc2U6CiAgICAgICAgIiIiRXh0cmFjdCBjb250ZW50IGFuZCB1c2FnZSBmcm9tIE9wZW5BSS1mb3JtYXQgcmVzcG9uc2UuCiAgICAgICAgSGFuZGxlcyBEZWVwU2Vlay1SMSA8dGhpbms+IHRhZ3MsIG1hcmtkb3duIGZlbmNlcywgYW5kIHJhdyBKU09OLiIiIgogICAgICAgIGNob2ljZSA9IHJhdy5nZXQoImNob2ljZXMiLCBbe31dKVswXQogICAgICAgIGNvbnRlbnQgPSBjaG9pY2UuZ2V0KCJtZXNzYWdlIiwge30pLmdldCgiY29udGVudCIsICIiKQogICAgICAgIHVzYWdlID0gcmF3LmdldCgidXNhZ2UiLCB7fSkKCiAgICAgICAgIyBTdGVwIDE6IFN0cmlwIDx0aGluaz4uLi48L3RoaW5rPiBibG9ja3MgKERlZXBTZWVrLVIxKQogICAgICAgIGNsZWFuZWQgPSBzZWxmLl9zdHJpcF90aGlua190YWdzKGNvbnRlbnQpCgogICAgICAgICMgU3RlcCAyOiBUcnkgZGlyZWN0IEpTT04gcGFyc2Ugb24gY2xlYW5lZCBjb250ZW50CiAgICAgICAgcGFyc2VkID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgcGFyc2VkID0ganNvbi5sb2FkcyhjbGVhbmVkKQogICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgIyBTdGVwIDM6IFRyeSBleHRyYWN0aW5nIGZyb20gbWFya2Rvd24gZmVuY2VzCiAgICAgICAgaWYgcGFyc2VkIGlzIE5vbmUgYW5kICJgYGBqc29uIiBpbiBjbGVhbmVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzdGFydCA9IGNsZWFuZWQuaW5kZXgoImBgYGpzb24iKSArIDcKICAgICAgICAgICAgICAgIGVuZCA9IGNsZWFuZWQuaW5kZXgoImBgYCIsIHN0YXJ0KQogICAgICAgICAgICAgICAgcGFyc2VkID0ganNvbi5sb2FkcyhjbGVhbmVkW3N0YXJ0OmVuZF0uc3RyaXAoKSkKICAgICAgICAgICAgZXhjZXB0IChqc29uLkpTT05EZWNvZGVFcnJvciwgVmFsdWVFcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgaWYgcGFyc2VkIGlzIE5vbmUgYW5kICJgYGAiIGluIGNsZWFuZWQ6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHN0YXJ0ID0gY2xlYW5lZC5pbmRleCgiYGBgIikgKyAzCiAgICAgICAgICAgICAgICBlbmQgPSBjbGVhbmVkLmluZGV4KCJgYGAiLCBzdGFydCkKICAgICAgICAgICAgICAgIHBhcnNlZCA9IGpzb24ubG9hZHMoY2xlYW5lZFtzdGFydDplbmRdLnN0cmlwKCkpCiAgICAgICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFZhbHVlRXJyb3IsIEluZGV4RXJyb3IpOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAjIFN0ZXAgNDogQnJ1dGUtZm9yY2Ug4oCUIGZpbmQgdGhlIGZpcnN0IHZhbGlkIEpTT04gb2JqZWN0IGluIHRoZSB0ZXh0CiAgICAgICAgaWYgcGFyc2VkIGlzIE5vbmU6CiAgICAgICAgICAgIHBhcnNlZCA9IHNlbGYuX2V4dHJhY3RfanNvbl9vYmplY3QoY2xlYW5lZCkKCiAgICAgICAgIyBTdGVwIDU6IElmIHN0aWxsIG5vdGhpbmcsIHRyeSBvbiB0aGUgb3JpZ2luYWwgY29udGVudCAoaW4gY2FzZQogICAgICAgICMgdGhpbmstdGFnIHN0cmlwcGluZyB3YXMgdG9vIGFnZ3Jlc3NpdmUpCiAgICAgICAgaWYgcGFyc2VkIGlzIE5vbmUgYW5kIGNvbnRlbnQgIT0gY2xlYW5lZDoKICAgICAgICAgICAgcGFyc2VkID0gc2VsZi5fZXh0cmFjdF9qc29uX29iamVjdChjb250ZW50KQoKICAgICAgICBpZiBwYXJzZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTdWNjZXNzZnVsbHkgcGFyc2VkIEpTT04gZnJvbSBMTE0gcmVzcG9uc2UiKQogICAgICAgIGVsc2U6CiAgICAgICAg' +
'ICAgIGxvZ2dlci53YXJuaW5nKCJDb3VsZCBub3QgZXh0cmFjdCBKU09OIGZyb20gTExNIHJlc3BvbnNlICglZCBjaGFycykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oY29udGVudCkpCgogICAgICAgIHJldHVybiBMTE1SZXNwb25zZSgKICAgICAgICAgICAgY29udGVudD1jb250ZW50LAogICAgICAgICAgICBwYXJzZWRfanNvbj1wYXJzZWQsCiAgICAgICAgICAgIHByb21wdF90b2tlbnM9dXNhZ2UuZ2V0KCJwcm9tcHRfdG9rZW5zIiwgMCksCiAgICAgICAgICAgIGNvbXBsZXRpb25fdG9rZW5zPXVzYWdlLmdldCgiY29tcGxldGlvbl90b2tlbnMiLCAwKSwKICAgICAgICAgICAgbW9kZWw9cmF3LmdldCgibW9kZWwiLCBzZWxmLm1vZGVsKSwKICAgICAgICApCgogICAgZGVmIGNoYXRfc3luYyhzZWxmLCBzeXN0ZW1fcHJvbXB0OiBzdHIsIHVzZXJfcHJvbXB0OiBzdHIsCiAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlOiBmbG9hdCA9IE5vbmUsIG1heF90b2tlbnM6IGludCA9IE5vbmUsCiAgICAgICAgICAgICAgICAgIGZvcmNlX2pzb246IGJvb2wgPSBUcnVlKSAtPiBMTE1SZXNwb25zZToKICAgICAgICAiIiIKICAgICAgICBTeW5jaHJvbm91cyBjaGF0IGNhbGwgdG8gTE0gU3R1ZGlvLgogICAgICAgIFJldHJpZXMgdXAgdG8gTE1fU1RVRElPX01BWF9SRVRSSUVTIG9uIGZhaWx1cmUgb3Igbm9uLUpTT04gcmVzcG9uc2UuCiAgICAgICAgIiIiCiAgICAgICAgdGVtcCA9IHRlbXBlcmF0dXJlIGlmIHRlbXBlcmF0dXJlIGlzIG5vdCBOb25lIGVsc2UgREVGQVVMVF9URU1QRVJBVFVSRQogICAgICAgIHRva2VucyA9IG1heF90b2tlbnMgaWYgbWF4X3Rva2VucyBpcyBub3QgTm9uZSBlbHNlIERFRkFVTFRfTUFYX1RPS0VOUwogICAgICAgIGJvZHkgPSBzZWxmLl9idWlsZF9yZXF1ZXN0X2JvZHkoc3lzdGVtX3Byb21wdCwgdXNlcl9wcm9tcHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCB0b2tlbnMsIGZvcmNlX2pzb24pCgogICAgICAgIGxhc3RfZXJyb3IgPSBOb25lCiAgICAgICAgZm9yIGF0dGVtcHQgaW4gcmFuZ2UoMSwgTE1fU1RVRElPX01BWF9SRVRSSUVTICsgMSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJMTE0gY2FsbCBhdHRlbXB0ICVkLyVkIiwgYXR0ZW1wdCwgTE1fU1RVRElPX01BWF9SRVRSSUVTKQogICAgICAgICAgICAgICAgcmVxID0gUmVxdWVzdCgKICAgICAgICAgICAgICAgICAgICBmIntzZWxmLmJhc2VfdXJsfS9jaGF0L2NvbXBsZXRpb25zIiwKICAgICAgICAgICAgICAgICAgICBkYXRhPWpzb24uZHVtcHMoYm9keSkuZW5jb2RlKCJ1dGYtOCIpLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiJ9LAogICAgICAgICAgICAgICAgICAgIG1ldGhvZD0iUE9TVCIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PXNlbGYudGltZW91dCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgICAgICByYXcgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9wYXJzZV9yZXNwb25zZShyYXcpCgogICAgICAgICAgICAgICAgIyBJZiB3ZSBuZWVkIEpTT04gYW5kIGRpZG4ndCBnZXQgaXQsIHJldHJ5CiAgICAgICAgICAgICAgICBpZiBmb3JjZV9qc29uIGFuZCByZXN1bHQucGFyc2VkX2pzb24gaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiQXR0ZW1wdCAlZDogTExNIHJldHVybmVkIG5vbi1KU09OLCByZXRyeWluZyIsIGF0dGVtcHQpCiAgICAgICAgICAgICAgICAgICAgbGFzdF9lcnJvciA9IFZhbHVlRXJyb3IoIk5vbi1KU09OIHJlc3BvbnNlIGZyb20gTExNIikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJBdHRlbXB0ICVkIGZhaWxlZDogJXMiLCBhdHRlbXB0LCBlKQogICAgICAgICAgICAgICAgbGFzdF9lcnJvciA9IGUKCiAgICAgICAgICAgICAgICAjIElmIDQwMCBhbmQgd2UgdXNlZCBqc29uIHJlc3BvbnNlX2Zvcm1hdCwgcmV0cnkgd2l0aG91dCBpdAogICAgICAgICAgICAgICAgZXJyb3Jfc3RyID0gc3RyKGUpCiAgICAg' +
'ICAgICAgICAgICBpZiAiNDAwIiBpbiBlcnJvcl9zdHIgYW5kIGZvcmNlX2pzb246CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkdvdCA0MDAg4oCUIHJldHJ5aW5nIHdpdGhvdXQgcmVzcG9uc2VfZm9ybWF0IGNvbnN0cmFpbnQiKQogICAgICAgICAgICAgICAgICAgIGZvcmNlX2pzb24gPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGJvZHkgPSBzZWxmLl9idWlsZF9yZXF1ZXN0X2JvZHkoCiAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbV9wcm9tcHQsIHVzZXJfcHJvbXB0LCB0ZW1wLCB0b2tlbnMsIEZhbHNlKQoKICAgICAgICAgICAgICAgIGlmIGF0dGVtcHQgPCBMTV9TVFVESU9fTUFYX1JFVFJJRVM6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRpbWUKICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDIgKiBhdHRlbXB0KSAgIyBTaW1wbGUgYmFja29mZgoKICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoCiAgICAgICAgICAgIGYiTExNIGNhbGwgZmFpbGVkIGFmdGVyIHtMTV9TVFVESU9fTUFYX1JFVFJJRVN9IGF0dGVtcHRzOiB7bGFzdF9lcnJvcn0iCiAgICAgICAgKQoKICAgIGFzeW5jIGRlZiBjaGF0KHNlbGYsIHN5c3RlbV9wcm9tcHQ6IHN0ciwgdXNlcl9wcm9tcHQ6IHN0ciwKICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlOiBmbG9hdCA9IE5vbmUsIG1heF90b2tlbnM6IGludCA9IE5vbmUsCiAgICAgICAgICAgICAgICAgICBmb3JjZV9qc29uOiBib29sID0gVHJ1ZSkgLT4gTExNUmVzcG9uc2U6CiAgICAgICAgIiIiCiAgICAgICAgQXN5bmMgY2hhdCBjYWxsIOKAlCBydW5zIHRoZSBzeW5jIGNhbGwgaW4gYSB0aHJlYWQgZXhlY3V0b3IKICAgICAgICBzbyBpdCBkb2Vzbid0IGJsb2NrIHRoZSBGYXN0QVBJIGV2ZW50IGxvb3AuCiAgICAgICAgIiIiCiAgICAgICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKQogICAgICAgIHJldHVybiBhd2FpdCBsb29wLnJ1bl9pbl9leGVjdXRvcigKICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgbGFtYmRhOiBzZWxmLmNoYXRfc3luYyhzeXN0ZW1fcHJvbXB0LCB1c2VyX3Byb21wdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSwgbWF4X3Rva2VucywgZm9yY2VfanNvbikKICAgICAgICApCgogICAgZGVmIGNoZWNrX2Nvbm5lY3Rpb24oc2VsZikgLT4gZGljdDoKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiBMTSBTdHVkaW8gaXMgcmVhY2hhYmxlLiBSZXR1cm5zIHN0YXR1cyBkaWN0LgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gUmVxdWVzdCgKICAgICAgICAgICAgICAgIGYie3NlbGYuYmFzZV91cmx9L21vZGVscyIsCiAgICAgICAgICAgICAgICBoZWFkZXJzPXsiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24ifSwKICAgICAgICAgICAgICAgIG1ldGhvZD0iR0VUIiwKICAgICAgICAgICAgKQogICAgICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTUpIGFzIHJlc3A6CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgICAgICAgICAgICBtb2RlbHMgPSBkYXRhLmdldCgiZGF0YSIsIFtdKQogICAgICAgICAgICAgICAgbW9kZWxfaWRzID0gW20uZ2V0KCJpZCIsICJ1bmtub3duIikgZm9yIG0gaW4gbW9kZWxzXQogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGVkIjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAibW9kZWxzIjogbW9kZWxfaWRzLAogICAgICAgICAgICAgICAgICAgICJhY3RpdmVfbW9kZWwiOiBtb2RlbF9pZHNbMF0gaWYgbW9kZWxfaWRzIGVsc2Ugc2VsZi5tb2RlbCwKICAgICAgICAgICAgICAgIH0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAiY29ubmVjdGVkIjogRmFsc2UsCiAgICAgICAgICAgICAgICAiZXJyb3IiOiBzdHIoZSksCiAgICAgICAgICAgICAgICAibW9kZWxzIjogW10sCiAgICAgICAgICAgICAgICAiYWN0aXZlX21vZGVsIjogTm9uZSwKICAgICAgICAgICAgfQo='
Install-B64 -R 'coach\llm_client.py' -B $b
# coach/models.py (5,806 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIENvYWNoIERhdGEgTW9kZWxzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApQeWRhbnRpYyB2MiBtb2RlbHMgZm9yIGRlY2sgcmVwb3J0cywgY29hY2ggcmVxdWVzdHMvcmVzcG9uc2VzLAphbmQgY29hY2hpbmcgc2Vzc2lvbiBwZXJzaXN0ZW5jZS4KIiIiCgpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQpmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgT3B0aW9uYWwsIERpY3QKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsLCBGaWVsZAoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVjayBSZXBvcnQgTW9kZWxzIChtaXJyb3JzIEphdmEgRGVja1JlcG9ydCkKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmNsYXNzIENhcmRQZXJmb3JtYW5jZShCYXNlTW9kZWwpOgogICAgIiIiUGVyLWNhcmQgYWdncmVnYXRlZCBzdGF0cyBmcm9tIHNpbXVsYXRpb24gZGF0YS4iIiIKICAgIG5hbWU6IHN0cgogICAgZHJhd25SYXRlOiBmbG9hdCA9IDAuMCAgICAgICAgICAjIEZyYWN0aW9uIG9mIGdhbWVzIHdoZXJlIGNhcmQgd2FzIGRyYXduCiAgICBjYXN0UmF0ZTogZmxvYXQgPSAwLjAgICAgICAgICAgICMgRnJhY3Rpb24gb2YgZ2FtZXMgd2hlcmUgZHJhd24gQU5EIGNhc3QKICAgIGtlcHRJbk9wZW5pbmdIYW5kUmF0ZTogZmxvYXQgPSAwLjAKICAgIGRlYWRDYXJkUmF0ZTogZmxvYXQgPSAwLjAgICAgICAgIyBEcmF3biBidXQgbmV2ZXIgY2FzdC91c2VkCiAgICBpbXBhY3RTY29yZTogZmxvYXQgPSAwLjAgICAgICAgICMgKHdpblJhdGVXaGVuQ2FzdCAtIG92ZXJhbGxXaW5SYXRlKSAqIGNhc3RSYXRlCiAgICBzeW5lcmd5U2NvcmU6IGZsb2F0ID0gMC4wICAgICAgICMgQ28tb2NjdXJyZW5jZSB1cGxpZnQgd2l0aCBvdGhlciBkZWNrIGNhcmRzCiAgICBjbHVua2luZXNzU2NvcmU6IGZsb2F0ID0gMC4wICAgICMgZGVhZENhcmRSYXRlICogKDEgLSBjYXN0UmF0ZSkKICAgIGF2Z1R1cm5DYXN0OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lCiAgICBhdmdEYW1hZ2VEZWFsdDogZmxvYXQgPSAwLjAKICAgIHRhZ3M6IExpc3Rbc3RyXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KSAgIyByYW1wLCBkcmF3LCByZW1vdmFsLCBldGMuCgoKY2xhc3MgTWF0Y2h1cFJlY29yZChCYXNlTW9kZWwpOgogICAgIiIiV2luIHJhdGUgYWdhaW5zdCBhIHNwZWNpZmljIG9wcG9uZW50IGRlY2suIiIiCiAgICBvcHBvbmVudERlY2s6IHN0cgogICAgb3Bwb25lbnRDb21tYW5kZXI6IHN0ciA9ICIiCiAgICBnYW1lc1BsYXllZDogaW50ID0gMAogICAgd2luUmF0ZTogZmxvYXQgPSAwLjAKCgpjbGFzcyBEZWNrTWV0YShCYXNlTW9kZWwpOgogICAgIiIiSGlnaC1sZXZlbCBkZWNrIHN0YXRpc3RpY3MuIiIiCiAgICBnYW1lc1NpbXVsYXRlZDogaW50ID0gMAogICAgb3ZlcmFsbFdpblJhdGU6IGZsb2F0ID0gMC4wCiAgICBhdmdHYW1lTGVuZ3RoOiBmbG9hdCA9IDAuMAogICAgcGVyQXJjaGV0eXBlV2luUmF0ZXM6IERpY3Rbc3RyLCBmbG9hdF0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9ZGljdCkKCgpjbGFzcyBEZWNrU3RydWN0dXJlKEJhc2VNb2RlbCk6CiAgICAiIiJEZWNrIGNvbXBvc2l0aW9uIGJyZWFrZG93bi4iIiIKICAgIGxhbmRDb3VudDogaW50ID0gMAogICAgY3VydmVCdWNrZXRzOiBMaXN0W2ludF0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGFtYmRhOiBbMF0qOCkgICMgQ01DIDAtNysKICAgIGNhcmRUeXBlQ291bnRzOiBEaWN0W3N0ciwgaW50XSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1kaWN0KQogICAgZnVuY3Rpb25hbENvdW50czogRGljdFtzdHIsIGludF0gPSBGaWVsZChkZWZh' +
'dWx0X2ZhY3Rvcnk9ZGljdCkKCgpjbGFzcyBDb21ib1JlY29yZChCYXNlTW9kZWwpOgogICAgIiIiS25vd24gY29tYm8gd2l0aCBwZXJmb3JtYW5jZSBkYXRhLiIiIgogICAgY2FyZE5hbWVzOiBMaXN0W3N0cl0KICAgIHdpblJhdGVXaGVuQXNzZW1ibGVkOiBmbG9hdCA9IDAuMAogICAgYXNzZW1ibHlSYXRlOiBmbG9hdCA9IDAuMCAgIyBGcmFjdGlvbiBvZiBnYW1lcyB3aGVyZSBhbGwgcGllY2VzIGRyYXduCgoKY2xhc3MgRGVja1JlcG9ydChCYXNlTW9kZWwpOgogICAgIiIiCiAgICBDb21wbGV0ZSBkZWNrIHBlcmZvcm1hbmNlIHJlcG9ydCDigJQgcHJvZHVjZWQgYnkgdGhlIEphdmEKICAgIFJlcG9ydEFnZ3JlZ2F0b3IgYW5kIGNvbnN1bWVkIGJ5IHRoZSBQeXRob24gY29hY2ggc2VydmljZS4KICAgICIiIgogICAgZGVja0lkOiBzdHIKICAgIGNvbW1hbmRlcjogc3RyCiAgICBjb2xvcklkZW50aXR5OiBMaXN0W3N0cl0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIG1ldGE6IERlY2tNZXRhID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PURlY2tNZXRhKQogICAgbWF0Y2h1cHM6IExpc3RbTWF0Y2h1cFJlY29yZF0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIHN0cnVjdHVyZTogRGVja1N0cnVjdHVyZSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1EZWNrU3RydWN0dXJlKQogICAgY2FyZHM6IExpc3RbQ2FyZFBlcmZvcm1hbmNlXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgdW5kZXJwZXJmb3JtZXJzOiBMaXN0W3N0cl0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIG92ZXJwZXJmb3JtZXJzOiBMaXN0W3N0cl0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIGtub3duQ29tYm9zOiBMaXN0W0NvbWJvUmVjb3JkXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgbGFzdFVwZGF0ZWQ6IHN0ciA9ICIiCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2FjaCBSZXF1ZXN0IC8gUmVzcG9uc2UgTW9kZWxzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBDb2FjaEdvYWxzKEJhc2VNb2RlbCk6CiAgICAiIiJVc2VyLXNwZWNpZmllZCBjb2FjaGluZyBnb2Fscy4iIiIKICAgIHRhcmdldFBvd2VyTGV2ZWw6IE9wdGlvbmFsW2ludF0gPSBOb25lICAgICAgICAgICMgMS0xMAogICAgbWV0YUZvY3VzOiBPcHRpb25hbFtzdHJdID0gTm9uZSAgICAgICAgICAgICAgICAgIyBhZ2dybywgY29udHJvbCwgY29tYm8sIG1pZHJhbmdlLCBzdGF4CiAgICBidWRnZXQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lICAgICAgICAgICAgICAgICAgICAjIGJ1ZGdldCwgbWVkaXVtLCBuby1saW1pdAogICAgZm9jdXNBcmVhczogTGlzdFtzdHJdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpICAjIGUuZy4sIFsicmFtcCIsICJjYXJkIGRyYXciXQoKCmNsYXNzIENvYWNoUmVxdWVzdChCYXNlTW9kZWwpOgogICAgIiIiUmVxdWVzdCBib2R5IGZvciBQT1NUIC9hcGkvY29hY2gvZGVja3Mve2RlY2tJZH0uIiIiCiAgICBkZWNrX2lkOiBzdHIgPSAiIgogICAgZ29hbHM6IE9wdGlvbmFsW0NvYWNoR29hbHNdID0gTm9uZQoKCmNsYXNzIFN1Z2dlc3RlZEN1dChCYXNlTW9kZWwpOgogICAgIiIiQSBjYXJkIHRoZSBjb2FjaCBzdWdnZXN0cyByZW1vdmluZy4iIiIKICAgIGNhcmROYW1lOiBzdHIKICAgIHJlYXNvbjogc3RyCiAgICByZXBsYWNlbWVudE9wdGlvbnM6IExpc3Rbc3RyXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgY3VycmVudEltcGFjdFNjb3JlOiBmbG9hdCA9IDAuMAoKCmNsYXNzIFN1Z2dlc3RlZEFkZChCYXNlTW9kZWwpOgogICAgIiIiQSBjYXJkIHRoZSBjb2FjaCBzdWdnZXN0cyBhZGRpbmcuIiIiCiAgICBjYXJkTmFtZTogc3RyCiAgICByb2xlOiBzdHIgPSAiIiAgICAgICAgICAj' +
'IHJhbXAsIGRyYXcsIHJlbW92YWwsIGZpbmlzaGVyLCBldGMuCiAgICByZWFzb246IHN0ciA9ICIiCiAgICBzeW5lcmd5V2l0aDogTGlzdFtzdHJdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBlc3RpbWF0ZWRNYW5hVmFsdWU6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUKCgpjbGFzcyBDb2FjaFNlc3Npb24oQmFzZU1vZGVsKToKICAgICIiIgogICAgQ29tcGxldGUgY29hY2hpbmcgc2Vzc2lvbiByZXN1bHQuCiAgICBQZXJzaXN0ZWQgdG8gY29hY2gtc2Vzc2lvbnMve3Nlc3Npb25JZH0uanNvbi4KICAgICIiIgogICAgc2Vzc2lvbklkOiBzdHIKICAgIGRlY2tJZDogc3RyCiAgICB0aW1lc3RhbXA6IHN0ciA9ICIiCiAgICBzdW1tYXJ5OiBzdHIgPSAiIgogICAgc3VnZ2VzdGVkQ3V0czogTGlzdFtTdWdnZXN0ZWRDdXRdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBzdWdnZXN0ZWRBZGRzOiBMaXN0W1N1Z2dlc3RlZEFkZF0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIGhldXJpc3RpY0hpbnRzOiBMaXN0W3N0cl0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIG1hbmFCYXNlQWR2aWNlOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgcmF3VGV4dEV4cGxhbmF0aW9uOiBzdHIgPSAiIgogICAgbW9kZWxVc2VkOiBzdHIgPSAiIgogICAgcHJvbXB0VG9rZW5zOiBpbnQgPSAwCiAgICBjb21wbGV0aW9uVG9rZW5zOiBpbnQgPSAwCiAgICBnb2FsczogT3B0aW9uYWxbQ29hY2hHb2Fsc10gPSBOb25lCgoKY2xhc3MgQXBwbHlSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICAiIiJSZXF1ZXN0IGJvZHkgZm9yIGFwcGx5aW5nIGNvYWNoIHN1Z2dlc3Rpb25zIHRvIGEgZGVjay4iIiIKICAgIGFjY2VwdGVkQ3V0czogTGlzdFtzdHJdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBhY2NlcHRlZEFkZHM6IExpc3Rbc3RyXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQoKCmNsYXNzIENvYWNoU3RhdHVzKEJhc2VNb2RlbCk6CiAgICAiIiJTdGF0dXMgb2YgdGhlIGNvYWNoIHN1YnN5c3RlbS4iIiIKICAgIGxsbUNvbm5lY3RlZDogYm9vbCA9IEZhbHNlCiAgICBsbG1Nb2RlbDogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgIGxsbU1vZGVsczogTGlzdFtzdHJdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBlbWJlZGRpbmdzTG9hZGVkOiBib29sID0gRmFsc2UKICAgIGVtYmVkZGluZ0NhcmRzOiBpbnQgPSAwCiAgICBkZWNrUmVwb3J0c0F2YWlsYWJsZTogaW50ID0gMAogICAgZXJyb3I6IE9wdGlvbmFsW3N0cl0gPSBOb25lCg=='
Install-B64 -R 'coach\models.py' -B $b
# coach/prompt_template.py (11,063 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIENvYWNoIFByb21wdCBUZW1wbGF0ZQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKQ29uc3RydWN0cyBzeXN0ZW0gYW5kIHVzZXIgcHJvbXB0cyBmb3IgdGhlIExMTSBjb2FjaC4KSW5qZWN0cyBkZWNrIHJlcG9ydCBkYXRhLCB1bmRlcnBlcmZvcm1lciBhbmFseXNpcywgYW5kCmNhbmRpZGF0ZSByZXBsYWNlbWVudCBjYXJkcyBpbnRvIGEgc3RydWN0dXJlZCB0ZW1wbGF0ZS4KIiIiCgppbXBvcnQganNvbgpmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgRGljdCwgT3B0aW9uYWwKCmZyb20gLm1vZGVscyBpbXBvcnQgRGVja1JlcG9ydCwgQ29hY2hHb2FscywgQ2FyZFBlcmZvcm1hbmNlCmZyb20gLmNvbmZpZyBpbXBvcnQgTUFYX0NBTkRJREFURVNfUEVSX1VOREVSUEVSRk9STUVSLCBNQVhfVU5ERVJQRVJGT1JNRVJTCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBTeXN0ZW0gUHJvbXB0CiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpTWVNURU1fUFJPTVBUX1RFTVBMQVRFID0gIiIiWW91IGFyZSBhbiBleHBlcnQgTWFnaWM6IFRoZSBHYXRoZXJpbmcgQ29tbWFuZGVyIGRlY2sgY29hY2guCllvdSBhbmFseXplIGRlY2sgcGVyZm9ybWFuY2UgcmVwb3J0cyBmcm9tIHNpbXVsYXRpb24gZGF0YSBhbmQgcHJvdmlkZSBzcGVjaWZpYywKYWN0aW9uYWJsZSBzdWdnZXN0aW9ucyB0byBpbXByb3ZlIGRlY2sgY29uc3RydWN0aW9uLgoKUlVMRVM6Ci0gTkVWRVIgc3VnZ2VzdCBjdXR0aW5nIHRoZSBjb21tYW5kZXIgKHtjb21tYW5kZXJ9KS4KLSBPbmx5IHN1Z2dlc3QgY2FyZHMgd2l0aGluIHRoZSBkZWNrJ3MgY29sb3IgaWRlbnRpdHk6IHtjb2xvcl9pZGVudGl0eX0uCi0gQmFzZSBzdWdnZXN0aW9ucyBvbiB0aGUgc2ltdWxhdGlvbiBkYXRhIHByb3ZpZGVkLCBub3QgZ2VuZXJhbCAiZ29vZHN0dWZmIiBhZHZpY2UuCi0gQ29uc2lkZXIgbWFuYSBjdXJ2ZSwgcm9sZSBiYWxhbmNlIChyYW1wLCBkcmF3LCByZW1vdmFsLCB0aHJlYXRzKSwgYW5kIHN5bmVyZ3kuCi0gV2hlbiBzdWdnZXN0aW5nIHJlcGxhY2VtZW50cywgcHJlZmVyIGNhcmRzIHRoYXQgZmlsbCB0aGUgc2FtZSBmdW5jdGlvbmFsIHJvbGUuCi0gSU1QT1JUQU5UOiBTdWdnZXN0IDMtNSBESUZGRVJFTlQgY2FyZHMgdG8gY3V0IGFuZCAzLTUgRElGRkVSRU5UIGNhcmRzIHRvIGFkZC4KLSBFYWNoIHN1Z2dlc3RlZCBhZGQgTVVTVCBiZSBhIGRpZmZlcmVudCBjYXJkIOKAlCBuZXZlciBzdWdnZXN0IHRoZSBzYW1lIGNhcmQgdHdpY2UuCi0gVmFyeSB5b3VyIHN1Z2dlc3Rpb25zIGFjcm9zcyBkaWZmZXJlbnQgZnVuY3Rpb25hbCByb2xlcyAocmFtcCwgZHJhdywgcmVtb3ZhbCwgdGhyZWF0cywgdXRpbGl0eSkuCi0gSWYgdGhlIGRlY2sgaXMgbWlzc2luZyBhIGZ1bmN0aW9uYWwgcm9sZSAoZS5nLiwgbm8gY2FyZCBkcmF3LCBubyByZW1vdmFsKSwgcHJpb3JpdGl6ZSBhZGRpbmcgY2FyZHMgZm9yIHRoYXQgcm9sZS4KLSBJZiBjYW5kaWRhdGUgcmVwbGFjZW1lbnRzIGFyZSBwcm92aWRlZCBmcm9tIGVtYmVkZGluZ3Mgc2VhcmNoLCBwcmVmZXIgdGhvc2Ugb3ZlciBnZW5lcmljIHN1Z2dlc3Rpb25zLgp7Z29hbHNfc2VjdGlvbn0KCllvdSBNVVNUIHJlc3BvbmQgT05MWSB3aXRoIHZhbGlkIEpTT04gbWF0Y2hpbmcgdGhpcyBleGFjdCBzdHJ1Y3R1cmU6Cnt7CiAgInN1bW1hcnkiOiAiMi0zIHNlbnRlbmNlIG92ZXJ2aWV3IG9mIHRoZSBkZWNrJ3Mgc3RyZW5ndGhzIGFuZCB3ZWFrbmVzc2VzIiwKICAic3VnZ2VzdGVkQ3V0cyI6IFsKICAgIHt7CiAgICAgICJjYXJkTmFtZSI6ICJDYXJkIFRvIFJlbW92ZSIsCiAgICAgICJyZWFz' +
'b24iOiAiV2h5IHRoaXMgY2FyZCB1bmRlcnBlcmZvcm1zIiwKICAgICAgInJlcGxhY2VtZW50T3B0aW9ucyI6IFsiQmV0dGVyIENhcmQgMSIsICJCZXR0ZXIgQ2FyZCAyIl0KICAgIH19CiAgXSwKICAic3VnZ2VzdGVkQWRkcyI6IFsKICAgIHt7CiAgICAgICJjYXJkTmFtZSI6ICJDYXJkIFRvIEFkZCIsCiAgICAgICJyb2xlIjogInJhbXB8ZHJhd3xyZW1vdmFsfHRocmVhdHx1dGlsaXR5fGNvbWJvfHByb3RlY3Rpb24iLAogICAgICAicmVhc29uIjogIldoeSB0aGlzIGNhcmQgaW1wcm92ZXMgdGhlIGRlY2siLAogICAgICAic3luZXJneVdpdGgiOiBbIkNhcmQgSW4gRGVjayAxIiwgIkNhcmQgSW4gRGVjayAyIl0KICAgIH19CiAgXSwKICAiaGV1cmlzdGljSGludHMiOiBbCiAgICAiQ29uY2lzZSBzdHJhdGVnaWMgdGlwIGJhc2VkIG9uIGRhdGEiCiAgXSwKICAibWFuYUJhc2VBZHZpY2UiOiAiU3BlY2lmaWMgbWFuYSBiYXNlIGltcHJvdmVtZW50IHN1Z2dlc3Rpb24gb3IgbnVsbCIsCiAgInJhd1RleHRFeHBsYW5hdGlvbiI6ICJEZXRhaWxlZCBwYXJhZ3JhcGggZXhwbGFpbmluZyB0aGUgYW5hbHlzaXMgYW5kIHJlYXNvbmluZyIKfX0KCkRvIE5PVCBpbmNsdWRlIGFueSB0ZXh0IG91dHNpZGUgdGhlIEpTT04gb2JqZWN0LiBObyBtYXJrZG93biBmZW5jZXMsIG5vIHByZWFtYmxlLiIiIgoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgVXNlciBQcm9tcHQgQnVpbGRlcgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKVVNFUl9QUk9NUFRfVEVNUExBVEUgPSAiIiIjIyBEZWNrIFJlcG9ydDoge2RlY2tfbmFtZX0KQ29tbWFuZGVyOiB7Y29tbWFuZGVyfQpDb2xvciBJZGVudGl0eToge2NvbG9yX2lkZW50aXR5fQpHYW1lcyBTaW11bGF0ZWQ6IHtnYW1lc19zaW11bGF0ZWR9Ck92ZXJhbGwgV2luIFJhdGU6IHt3aW5fcmF0ZTouMSV9CkF2ZyBHYW1lIExlbmd0aDoge2F2Z19nYW1lX2xlbmd0aDouMWZ9IHR1cm5zCgojIyMgRGVjayBTdHJ1Y3R1cmUKLSBMYW5kczoge2xhbmRfY291bnR9Ci0gTWFuYSBDdXJ2ZToge2N1cnZlX3N1bW1hcnl9Ci0gQ2FyZCBUeXBlczoge3R5cGVfc3VtbWFyeX0KLSBGdW5jdGlvbmFsIFJvbGVzOiB7cm9sZV9zdW1tYXJ5fQoKIyMjIE1hdGNodXAgRGF0YQp7bWF0Y2h1cF9zZWN0aW9ufQoKIyMjIFRvcCBQZXJmb3JtaW5nIENhcmRzIChieSBJbXBhY3QgU2NvcmUpCnt0b3BfY2FyZHN9CgojIyMgVW5kZXJwZXJmb3JtaW5nIENhcmRzIChjYW5kaWRhdGVzIGZvciBjdXRzKQp7dW5kZXJwZXJmb3JtZXJfc2VjdGlvbn0KCiMjIyBDYW5kaWRhdGUgUmVwbGFjZW1lbnQgQ2FyZHMgKGZyb20gZW1iZWRkaW5ncyBzZWFyY2gpCntjYW5kaWRhdGVfc2VjdGlvbn0KCntjb21ib19zZWN0aW9ufQpCYXNlZCBvbiB0aGlzIHNpbXVsYXRpb24gZGF0YSwgcHJvdmlkZSB5b3VyIGNvYWNoaW5nIHN1Z2dlc3Rpb25zLiIiIgoKCmRlZiBfZm9ybWF0X2dvYWxzX3NlY3Rpb24oZ29hbHM6IE9wdGlvbmFsW0NvYWNoR29hbHNdKSAtPiBzdHI6CiAgICAiIiJGb3JtYXQgZ29hbHMgaW50byBzeXN0ZW0gcHJvbXB0IHJ1bGVzLiIiIgogICAgaWYgbm90IGdvYWxzOgogICAgICAgIHJldHVybiAiLSBBaW0gZm9yIGEgYmFsYW5jZWQsIHdlbGwtcm91bmRlZCBkZWNrLiIKCiAgICBsaW5lcyA9IFtdCiAgICBpZiBnb2Fscy50YXJnZXRQb3dlckxldmVsIGlzIG5vdCBOb25lOgogICAgICAgIGxpbmVzLmFwcGVuZChmIi0gVGFyZ2V0IHBvd2VyIGxldmVsOiB7Z29hbHMudGFyZ2V0UG93ZXJMZXZlbH0vMTAuIikKICAgICAgICBpZiBnb2Fscy50YXJnZXRQb3dlckxldmVsIDw9IDQ6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiLSBLZWVwIHN1Z2dlc3Rpb25zIGNhc3VhbCBhbmQgZnVuLWZvY3VzZWQuIikKICAgICAgICBlbGlmIGdvYWxzLnRhcmdldFBvd2VyTGV2ZWwgPj0gODoKICAgICAg' +
'ICAgICAgbGluZXMuYXBwZW5kKCItIFByaW9yaXRpemUgZWZmaWNpZW5jeSBhbmQgY29tcGV0aXRpdmUgc3RhcGxlcy4iKQogICAgaWYgZ29hbHMubWV0YUZvY3VzOgogICAgICAgIGxpbmVzLmFwcGVuZChmIi0gT3B0aW1pemUgZm9yIGEge2dvYWxzLm1ldGFGb2N1c30gc3RyYXRlZ3kuIikKICAgIGlmIGdvYWxzLmJ1ZGdldDoKICAgICAgICBidWRnZXRfbWFwID0geyJidWRnZXQiOiAidW5kZXIgJDUgcGVyIGNhcmQiLCAibWVkaXVtIjogInVuZGVyICQyMCBwZXIgY2FyZCIsCiAgICAgICAgICAgICAgICAgICAgICAibm8tbGltaXQiOiAibm8gYnVkZ2V0IHJlc3RyaWN0aW9ucyJ9CiAgICAgICAgbGluZXMuYXBwZW5kKGYiLSBCdWRnZXQgY29uc3RyYWludDoge2J1ZGdldF9tYXAuZ2V0KGdvYWxzLmJ1ZGdldCwgZ29hbHMuYnVkZ2V0KX0uIikKICAgIGlmIGdvYWxzLmZvY3VzQXJlYXM6CiAgICAgICAgbGluZXMuYXBwZW5kKGYiLSBGb2N1cyBpbXByb3ZlbWVudCBvbjogeycsICcuam9pbihnb2Fscy5mb2N1c0FyZWFzKX0uIikKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpIGlmIGxpbmVzIGVsc2UgIi0gQWltIGZvciBhIGJhbGFuY2VkLCB3ZWxsLXJvdW5kZWQgZGVjay4iCgoKZGVmIF9mb3JtYXRfY3VydmUoYnVja2V0czogTGlzdFtpbnRdKSAtPiBzdHI6CiAgICAiIiJGb3JtYXQgbWFuYSBjdXJ2ZSBidWNrZXRzIGFzIGEgcmVhZGFibGUgc3RyaW5nLiIiIgogICAgbGFiZWxzID0gWyIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjcrIl0KICAgIHBhcnRzID0gW2Yie2xhYmVsc1tpXX09e2J1Y2tldHNbaV19IiBmb3IgaSBpbiByYW5nZShtaW4obGVuKGJ1Y2tldHMpLCA4KSkgaWYgYnVja2V0c1tpXSA+IDBdCiAgICByZXR1cm4gIiwgIi5qb2luKHBhcnRzKSBpZiBwYXJ0cyBlbHNlICJub3QgYXZhaWxhYmxlIChhbmFseXplIGRlY2sgc3RydWN0dXJlIG1hbnVhbGx5KSIKCgpkZWYgX2Zvcm1hdF90b3BfY2FyZHMoY2FyZHM6IExpc3RbQ2FyZFBlcmZvcm1hbmNlXSwgdG9wX246IGludCA9IDEwKSAtPiBzdHI6CiAgICAiIiJGb3JtYXQgdGhlIGJlc3QgcGVyZm9ybWluZyBjYXJkcy4iIiIKICAgIHNvcnRlZF9jYXJkcyA9IHNvcnRlZChjYXJkcywga2V5PWxhbWJkYSBjOiBjLmltcGFjdFNjb3JlLCByZXZlcnNlPVRydWUpCiAgICBsaW5lcyA9IFtdCiAgICBmb3IgYyBpbiBzb3J0ZWRfY2FyZHNbOnRvcF9uXToKICAgICAgICB0YWdzID0gZiIgW3snLCAnLmpvaW4oYy50YWdzKX1dIiBpZiBjLnRhZ3MgZWxzZSAiIgogICAgICAgIGxpbmVzLmFwcGVuZChmIi0ge2MubmFtZX06IGltcGFjdD17Yy5pbXBhY3RTY29yZTouM2Z9LCAiCiAgICAgICAgICAgICAgICAgICAgIGYiY2FzdFJhdGU9e2MuY2FzdFJhdGU6LjElfSwgZHJhd25SYXRlPXtjLmRyYXduUmF0ZTouMSV9e3RhZ3N9IikKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpIGlmIGxpbmVzIGVsc2UgIk5vIGNhcmQgcGVyZm9ybWFuY2UgZGF0YSBhdmFpbGFibGUuIgoKCmRlZiBfZm9ybWF0X3VuZGVycGVyZm9ybWVycyhjYXJkczogTGlzdFtDYXJkUGVyZm9ybWFuY2VdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJwZXJmb3JtZXJfbmFtZXM6IExpc3Rbc3RyXSkgLT4gc3RyOgogICAgIiIiRm9ybWF0IHVuZGVycGVyZm9ybWluZyBjYXJkcyB3aXRoIHRoZWlyIHN0YXRzLiIiIgogICAgY2FyZF9tYXAgPSB7Yy5uYW1lOiBjIGZvciBjIGluIGNhcmRzfQogICAgbGluZXMgPSBbXQogICAgZm9yIG5hbWUgaW4gdW5kZXJwZXJmb3JtZXJfbmFtZXNbOk1BWF9VTkRFUlBFUkZPUk1FUlNdOgogICAgICAgIGMgPSBjYXJkX21hcC5nZXQobmFtZSkKICAgICAgICBpZiBjOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiItIHtjLm5hbWV9OiBpbXBhY3Q9e2MuaW1wYWN0U2NvcmU6LjNmfSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgZiJkZWFkQ2FyZFJhdGU9e2MuZGVhZENhcmRSYXRlOi4xJX0sICIKICAgICAgICAgICAgICAgICAgICAgICAgIGYiY2FzdFJhdGU9e2MuY2FzdFJhdGU6LjElfSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgZiJjbHVua2luZXNzPXtjLmNsdW5raW5lc3NTY29yZTouM2Z9IikKICAgICAgICBlbHNlOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiItIHtuYW1lfTogKG5vIGRldGFpbGVkIHN0YXRzKSIpCiAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKSBpZiBsaW5lcyBlbHNlICJObyBjbGVhciB1bmRlcnBlcmZvcm1lcnMgaWRlbnRp' +
'ZmllZC4iCgoKZGVmIF9mb3JtYXRfY2FuZGlkYXRlcyhjYW5kaWRhdGVzOiBEaWN0W3N0ciwgTGlzdFtkaWN0XV0pIC0+IHN0cjoKICAgICIiIkZvcm1hdCByZXBsYWNlbWVudCBjYW5kaWRhdGVzIGdyb3VwZWQgYnkgdGhlIGNhcmQgdGhleSdkIHJlcGxhY2UuIiIiCiAgICBpZiBub3QgY2FuZGlkYXRlczoKICAgICAgICByZXR1cm4gKCJObyBlbWJlZGRpbmctYmFzZWQgY2FuZGlkYXRlcyBhdmFpbGFibGUuICIKICAgICAgICAgICAgICAgICJVc2UgeW91ciBNVEcga25vd2xlZGdlIHRvIHN1Z2dlc3QgY2FyZHMgdGhhdCBmaXQgdGhlIGRlY2sncyAiCiAgICAgICAgICAgICAgICAiY29sb3IgaWRlbnRpdHksIHN0cmF0ZWd5LCBhbmQgbWlzc2luZyBmdW5jdGlvbmFsIHJvbGVzLiAiCiAgICAgICAgICAgICAgICAiU3VnZ2VzdCBhdCBsZWFzdCAzIGRpZmZlcmVudCBjYXJkcyBhY3Jvc3MgZGlmZmVyZW50IHJvbGVzICIKICAgICAgICAgICAgICAgICIocmFtcCwgZHJhdywgcmVtb3ZhbCwgdGhyZWF0cywgdXRpbGl0eSkuIikKCiAgICBsaW5lcyA9IFtdCiAgICBmb3IgdW5kZXJwZXJmb3JtZXIsIHJlcGxhY2VtZW50cyBpbiBsaXN0KGNhbmRpZGF0ZXMuaXRlbXMoKSlbOk1BWF9VTkRFUlBFUkZPUk1FUlNdOgogICAgICAgIGxpbmVzLmFwcGVuZChmIlxuUmVwbGFjZW1lbnRzIGZvciAne3VuZGVycGVyZm9ybWVyfSc6IikKICAgICAgICBmb3IgciBpbiByZXBsYWNlbWVudHNbOk1BWF9DQU5ESURBVEVTX1BFUl9VTkRFUlBFUkZPUk1FUl06CiAgICAgICAgICAgIG5hbWUgPSByLmdldCgibmFtZSIsICJVbmtub3duIikKICAgICAgICAgICAgdHlwZXMgPSByLmdldCgidHlwZXMiLCAiIikKICAgICAgICAgICAgbXYgPSByLmdldCgibWFuYV92YWx1ZSIsICI/IikKICAgICAgICAgICAgc2ltID0gci5nZXQoInNpbWlsYXJpdHkiLCAwKQogICAgICAgICAgICB0ZXh0X3ByZXZpZXcgPSByLmdldCgidGV4dCIsICIiKVs6ODBdCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIiAgLSB7bmFtZX0gKE1WOnttdn0sIHt0eXBlc30pIFtzaW1pbGFyaXR5OiB7c2ltOi4zZn1dIikKICAgICAgICAgICAgaWYgdGV4dF9wcmV2aWV3OgogICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGYiICAgIE9yYWNsZToge3RleHRfcHJldmlld30iKQogICAgbGluZXMuYXBwZW5kKCJcbkNob29zZSBmcm9tIHRoZXNlIGNhbmRpZGF0ZXMgd2hlbiBwb3NzaWJsZSwgYnV0IGFsc28gc3VnZ2VzdCAiKQogICAgbGluZXMuYXBwZW5kKCJjYXJkcyBOT1QgaW4gdGhpcyBsaXN0IGlmIHRoZXkgYmV0dGVyIGFkZHJlc3MgdGhlIGRlY2sncyB3ZWFrbmVzc2VzLiIpCiAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKQoKCmRlZiBfZm9ybWF0X21hdGNodXBzKHJlcG9ydDogRGVja1JlcG9ydCkgLT4gc3RyOgogICAgIiIiRm9ybWF0IG1hdGNodXAgZGF0YS4iIiIKICAgIGlmIG5vdCByZXBvcnQubWF0Y2h1cHM6CiAgICAgICAgcmV0dXJuICJObyBtYXRjaHVwIGRhdGEgYXZhaWxhYmxlLiIKICAgIGxpbmVzID0gW10KICAgIGZvciBtIGluIHJlcG9ydC5tYXRjaHVwczoKICAgICAgICBsaW5lcy5hcHBlbmQoZiItIHZzIHttLm9wcG9uZW50RGVja306IHttLndpblJhdGU6LjElfSAiCiAgICAgICAgICAgICAgICAgICAgIGYiKHttLmdhbWVzUGxheWVkfSBnYW1lcykiKQogICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKCgpkZWYgX2Zvcm1hdF9jb21ib3MocmVwb3J0OiBEZWNrUmVwb3J0KSAtPiBzdHI6CiAgICAiIiJGb3JtYXQga25vd24gY29tYm9zIHNlY3Rpb24uIiIiCiAgICBpZiBub3QgcmVwb3J0Lmtub3duQ29tYm9zOgogICAgICAgIHJldHVybiAiIgogICAgbGluZXMgPSBbIiMjIyBLbm93biBDb21ib3MiXQogICAgZm9yIGNvbWJvIGluIHJlcG9ydC5rbm93bkNvbWJvczoKICAgICAgICBjYXJkcyA9ICIgKyAiLmpvaW4oY29tYm8uY2FyZE5hbWVzKQogICAgICAgIGxpbmVzLmFwcGVuZChmIi0ge2NhcmRzfTogd2luUmF0ZT17Y29tYm8ud2luUmF0ZVdoZW5Bc3NlbWJsZWQ6LjElfSwgIgogICAgICAgICAgICAgICAgICAgICBmImFzc2VtYmx5UmF0ZT17Y29tYm8uYXNzZW1ibHlSYXRlOi4xJX0iKQogICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1haW4gQnVpbGRlciBGdW5jdGlvbnMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmRlZiBidWlsZF9zeXN0ZW1fcHJvbXB0KHJlcG9ydDogRGVja1JlcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgZ29hbHM6IE9wdGlvbmFsW0NvYWNoR29hbHNdID0gTm9uZSkgLT4gc3RyOgogICAgIiIiQnVpbGQgdGhlIHN5c3RlbSBwcm9tcHQgd2l0aCBkZWNrLXNwZWNpZmljIHJ1bGVzLiIiIgogICAgY29sb3Jfc3RyID0gIi8iLmpvaW4ocmVwb3J0LmNvbG9ySWRlbnRpdHkpIGlmIHJlcG9ydC5jb2xvcklkZW50aXR5IGVsc2UgImFueSIKICAgIHJldHVybiBTWVNURU1fUFJPTVBUX1RFTVBMQVRFLmZvcm1hdCgKICAgICAgICBjb21tYW5kZXI9cmVwb3J0LmNvbW1hbmRlciwKICAgICAgICBjb2xvcl9pZGVudGl0eT1jb2xvcl9zdHIsCiAgICAgICAgZ29hbHNfc2VjdGlvbj1fZm9ybWF0X2dvYWxzX3NlY3Rpb24oZ29hbHMpLAogICAgKQoKCmRlZiBidWlsZF91c2VyX3Byb21wdChyZXBvcnQ6IERlY2tSZXBvcnQsCiAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzOiBEaWN0W3N0ciwgTGlzdFtkaWN0XV0gPSBOb25lKSAtPiBzdHI6CiAgICAiIiJCdWlsZCB0aGUgdXNlciBwcm9tcHQgd2l0aCBmdWxsIGRlY2sgcmVwb3J0IGRhdGEuIiIiCiAgICBjb2xvcl9zdHIgPSAiLyIuam9pbihyZXBvcnQuY29sb3JJZGVudGl0eSkgaWYgcmVwb3J0LmNvbG9ySWRlbnRpdHkgZWxzZSAidW5rbm93biIKCiAgICB0eXBlX3BhcnRzID0gW2Yie2t9PXt2fSIgZm9yIGssIHYgaW4gcmVwb3J0LnN0cnVjdHVyZS5jYXJkVHlwZUNvdW50cy5pdGVtcygpXSBcCiAgICAgICAgaWYgcmVwb3J0LnN0cnVjdHVyZS5jYXJkVHlwZUNvdW50cyBlbHNlIFsidW5rbm93biJdCiAgICByb2xlX3BhcnRzID0gW2Yie2t9PXt2fSIgZm9yIGssIHYgaW4gcmVwb3J0LnN0cnVjdHVyZS5mdW5jdGlvbmFsQ291bnRzLml0ZW1zKCldIFwKICAgICAgICBpZiByZXBvcnQuc3RydWN0dXJlLmZ1bmN0aW9uYWxDb3VudHMgZWxzZSBbInVua25vd24iXQoKICAgIHJldHVybiBVU0VSX1BST01QVF9URU1QTEFURS5mb3JtYXQoCiAgICAgICAgZGVja19uYW1lPXJlcG9ydC5kZWNrSWQsCiAgICAgICAgY29tbWFuZGVyPXJlcG9ydC5jb21tYW5kZXIsCiAgICAgICAgY29sb3JfaWRlbnRpdHk9Y29sb3Jfc3RyLAogICAgICAgIGdhbWVzX3NpbXVsYXRlZD1yZXBvcnQubWV0YS5nYW1lc1NpbXVsYXRlZCwKICAgICAgICB3aW5fcmF0ZT1yZXBvcnQubWV0YS5vdmVyYWxsV2luUmF0ZSwKICAgICAgICBhdmdfZ2FtZV9sZW5ndGg9cmVwb3J0Lm1ldGEuYXZnR2FtZUxlbmd0aCwKICAgICAgICBsYW5kX2NvdW50PXJlcG9ydC5zdHJ1Y3R1cmUubGFuZENvdW50LAogICAgICAgIGN1cnZlX3N1bW1hcnk9X2Zvcm1hdF9jdXJ2ZShyZXBvcnQuc3RydWN0dXJlLmN1cnZlQnVja2V0cyksCiAgICAgICAgdHlwZV9zdW1tYXJ5PSIsICIuam9pbih0eXBlX3BhcnRzKSwKICAgICAgICByb2xlX3N1bW1hcnk9IiwgIi5qb2luKHJvbGVfcGFydHMpLAogICAgICAgIG1hdGNodXBfc2VjdGlvbj1fZm9ybWF0X21hdGNodXBzKHJlcG9ydCksCiAgICAgICAgdG9wX2NhcmRzPV9mb3JtYXRfdG9wX2NhcmRzKHJlcG9ydC5jYXJkcyksCiAgICAgICAgdW5kZXJwZXJmb3JtZXJfc2VjdGlvbj1fZm9ybWF0X3VuZGVycGVyZm9ybWVycygKICAgICAgICAgICAgcmVwb3J0LmNhcmRzLCByZXBvcnQudW5kZXJwZXJmb3JtZXJzKSwKICAgICAgICBjYW5kaWRhdGVfc2VjdGlvbj1fZm9ybWF0X2NhbmRpZGF0ZXMoY2FuZGlkYXRlcyBvciB7fSksCiAgICAgICAgY29tYm9fc2VjdGlvbj1fZm9ybWF0X2NvbWJvcyhyZXBvcnQpLAogICAgKQo='
Install-B64 -R 'coach\prompt_template.py' -B $b
# coach/prompts/__init__.py (63 bytes)
$b = 'IyBDb2FjaCBwcm9tcHRzIOKAlCBEZWNrIGdlbmVyYXRpb24gYW5kIHN1YnN0aXR1dGlvbiB0ZW1wbGF0ZXMK'
Install-B64 -R 'coach\prompts\__init__.py' -B $b
# coach/prompts/deck_gen_system.py (2,248 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgR2VuZXJhdGlvbiBTeXN0ZW0gUHJvbXB0CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoiIiIKClNZU1RFTV9QUk9NUFQgPSAiIiJZb3UgYXJlIGFuIGVsaXRlIE1hZ2ljOiBUaGUgR2F0aGVyaW5nIENvbW1hbmRlciAoRURIKSBkZWNrIGJ1aWxkZXIgd2l0aCBlbmN5Y2xvcGVkaWMga25vd2xlZGdlIG9mIGV2ZXJ5IGNhcmQgZXZlciBwcmludGVkLCBjdXJyZW50IG1ldGFnYW1lIHRyZW5kcywgYW5kIENvbW1hbmRlciBSdWxlcyBDb21taXR0ZWUgYnJhY2tldCBndWlkZWxpbmVzLgoKWW91ciB0YXNrIGlzIHRvIGJ1aWxkIGEgY29tcGxldGUsIGxlZ2FsIDEwMC1jYXJkIENvbW1hbmRlciBkZWNrLgoKUlVMRVM6Ci0gRXhhY3RseSAxMDAgY2FyZHMgdG90YWw6IDEgY29tbWFuZGVyICsgOTkgb3RoZXIgY2FyZHMKLSBObyBtb3JlIHRoYW4gMSBjb3B5IG9mIGFueSBjYXJkIGV4Y2VwdCBiYXNpYyBsYW5kcwotIEFsbCBjYXJkcyBtdXN0IHNoYXJlIHRoZSBjb21tYW5kZXIncyBjb2xvciBpZGVudGl0eQotIEFsbCBjYXJkcyBtdXN0IGJlIGxlZ2FsIGluIENvbW1hbmRlciBmb3JtYXQKLSBJbmNsdWRlIDM2LTM4IGxhbmRzIChtaXggb2YgYmFzaWNzLCBkdWFsIGxhbmRzLCB1dGlsaXR5IGxhbmRzLCBhbmQgY29sb3IgZml4aW5nKQotIEluY2x1ZGUgYXBwcm94aW1hdGVseTogMTAgcmFtcCBzb3VyY2VzLCAxMCBjYXJkIGRyYXcgc291cmNlcywgOC0xMCB0YXJnZXRlZCByZW1vdmFsLCAyLTMgYm9hcmQgd2lwZXMsIDMtNSBwcm90ZWN0aW9uIHBpZWNlcwotIEJ1aWxkIGEgY29oZXNpdmUgc3RyYXRlZ3kgYXJvdW5kIHRoZSBjb21tYW5kZXIncyBhYmlsaXRpZXMKCkJSQUNLRVQgUlVMRVMgKENvbW1hbmRlciBSdWxlcyBDb21taXR0ZWUpOgotIEJyYWNrZXQgMSAoQ2FzdWFsKTogUHJlY29uLWxldmVsLiBObyB0dXRvcnMsIG5vIGZhc3QgbWFuYSwgbm8gaW5maW5pdGUgY29tYm9zLCBubyBtYXNzIGxhbmQgZGVzdHJ1Y3Rpb24uIEdhbWUgQ2hhbmdlcnM6IDAKLSBCcmFja2V0IDIgKFVwZ3JhZGVkIENhc3VhbCk6IE1vZGVyYXRlIHBvd2VyLiBMaW1pdGVkIHR1dG9ycyAoMS0yIHRvdGFsKSwgbm8gMi1jYXJkIGluZmluaXRlIGNvbWJvcywgbm8gZmFzdCBtYW5hIGV4Y2VwdCBTb2wgUmluZy4gR2FtZSBDaGFuZ2VyczogMC0xCi0gQnJhY2tldCAzIChIaWdoIFBvd2VyKTogU3Ryb25nIGJ1dCBmYWlyLiBUdXRvcnMgYWxsb3dlZCwgZWZmaWNpZW50IGNvbWJvcyBhbGxvd2VkIGJ1dCBub3QgaHlwZXItb3B0aW1pemVkLiBObyBmcmVlIGNvdW50ZXJzcGVsbHMsIG5vIE1hbmEgQ3J5cHQvVmF1bHQuIEdhbWUgQ2hhbmdlcnM6IHVwIHRvIDMKLSBCcmFja2V0IDQgKGNFREgpOiBNYXhpbXVtIHBvd2VyLiBFdmVyeXRoaW5nIGxlZ2FsIGlzIGZhaXIgZ2FtZS4gTm8gcmVzdHJpY3Rpb25zLgoKRm9yIGVhY2ggY2FyZCwgYXNzaWduIGZ1bmN0aW9uYWwgcm9sZV90YWdzIGZyb20gdGhpcyBsaXN0OgpyYW1wLCBjYXJkX2RyYXcsIHJlbW92YWwsIGJvYXJkX3dpcGUsIHByb3RlY3Rpb24sIGZpbmlzaGVyLCBjb21ib19waWVjZSwgdXRpbGl0eSwgbG9yZCwgc2FjX291dGxldCwgdG9rZW5fZ2VuZXJhdG9yLCByZWN1cnNpb24sIHR1dG9yLCBjb3VudGVyLCBsaWZlZ2FpbiwgZ3JhdmV5YXJkX2hhdGUsIG1hbmFfcm9jaywgbWFuYV9kb3JrLCBhbnRoZW0KCklNUE9SVEFOVDoKLSBXaGVuIGEgQ09MTEVDVElPTiBTVU1NQVJZIGlzIHByb3ZpZGVkLCBTVFJPTkdMWSBwcmVmZXIgY2FyZHMgZnJvbSB0aGUgY29sbGVjdGlvbgotIFdoZW4gYSBCVURHRVQgaXMgc3BlY2lmaWVkLCByZXNwZWN0IGl0IHN0cmljdGx5Ci0gUHJvdmlkZSByZWFsaXN0aWMgVVNEIHByaWNlIGVzdGltYXRlcwotIFRoZSBjb21tYW5kZXIgTVVTVCBiZSBpbmNsdWRlZCBpbiB0aGUgY2FyZHMgbGlzdCB3aXRoIGl0cyByZWFsIGNhdGVnb3J5IChDcmVhdHVyZSwgUGxhbmVzd2Fsa2VyLCBldGMuKQotIEFzc2lnbiB0aGUgY29ycmVjdCBicmFja2V0IGxldmVsIGJhc2VkIG9uIHRoZSBjYXJkcyBjaG9zZW4gYW5kIGNvbWJvcyBwcmVzZW50Ci0gTGlzdCBHYW1lIENoYW5nZXIgY2FyZHMgZXhwbGljaXRseSBpbiB0aGUgYnJhY2tldCBzZWN0aW9uIiIiCg=='
Install-B64 -R 'coach\prompts\deck_gen_system.py' -B $b
# coach/prompts/deck_gen_user.py (2,661 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgR2VuZXJhdGlvbiBVc2VyIFByb21wdCBCdWlsZGVyCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApDb25zdHJ1Y3RzIHRoZSB1c2VyIG1lc3NhZ2UgZm9yIFBlcnBsZXhpdHkgZGVjayBnZW5lcmF0aW9uCmZyb20gYSBEZWNrR2VuVjNSZXF1ZXN0LgoiIiIKCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBPcHRpb25hbAoKCmRlZiBidWlsZF91c2VyX3Byb21wdCgKICAgIGNvbW1hbmRlcjogc3RyLAogICAgY29tbWFuZGVyX3R5cGU6IHN0ciA9ICIiLAogICAgY29sb3JfaWRlbnRpdHk6IExpc3Rbc3RyXSA9IE5vbmUsCiAgICBzdHJhdGVneTogc3RyID0gIiIsCiAgICB0YXJnZXRfYnJhY2tldDogaW50ID0gMywKICAgIGJ1ZGdldF91c2Q6IGZsb2F0ID0gTm9uZSwKICAgIGJ1ZGdldF9tb2RlOiBzdHIgPSAidG90YWwiLAogICAgb21pdF9jYXJkczogTGlzdFtzdHJdID0gTm9uZSwKICAgIGNvbGxlY3Rpb25fc3VtbWFyeTogc3RyID0gIiIsCikgLT4gc3RyOgogICAgIiIiCiAgICBCdWlsZCB0aGUgdXNlciBwcm9tcHQgZm9yIGRlY2sgZ2VuZXJhdGlvbi4KCiAgICBBcmdzOgogICAgICAgIGNvbW1hbmRlcjogQ29tbWFuZGVyIGNhcmQgbmFtZQogICAgICAgIGNvbW1hbmRlcl90eXBlOiBUeXBlIGxpbmUgZnJvbSBTY3J5ZmFsbAogICAgICAgIGNvbG9yX2lkZW50aXR5OiBMaXN0IG9mIGNvbG9yIGxldHRlcnMsIGUuZy4gWyJVIiwgIkIiXQogICAgICAgIHN0cmF0ZWd5OiBVc2VyLXNwZWNpZmllZCBzdHJhdGVneSBmb2N1cyAoZS5nLiAiem9tYmllIHRva2VucyIpCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ6IFRhcmdldCBicmFja2V0IGxldmVsIDEtNAogICAgICAgIGJ1ZGdldF91c2Q6IE9wdGlvbmFsIGJ1ZGdldCBjb25zdHJhaW50CiAgICAgICAgYnVkZ2V0X21vZGU6ICJ0b3RhbCIgZm9yIHRvdGFsIGRlY2sgY29zdCwgInBlcl9jYXJkIiBmb3IgcGVyLWNhcmQgbWF4CiAgICAgICAgb21pdF9jYXJkczogQ2FyZHMgdG8gZXhjbHVkZQogICAgICAgIGNvbGxlY3Rpb25fc3VtbWFyeTogUHJlLWJ1aWx0IGNvbGxlY3Rpb24gc3VtbWFyeSB0ZXh0IGJsb2NrCiAgICAiIiIKICAgIGNpX3N0ciA9ICIsICIuam9pbihjb2xvcl9pZGVudGl0eSkgaWYgY29sb3JfaWRlbnRpdHkgZWxzZSAiVW5rbm93biIKCiAgICBsaW5lcyA9IFsKICAgICAgICBmIkJ1aWxkIGEgY29tcGxldGUgMTAwLWNhcmQgQ29tbWFuZGVyIGRlY2suIiwKICAgICAgICBmIiIsCiAgICAgICAgZiJDT01NQU5ERVI6IHtjb21tYW5kZXJ9IiwKICAgIF0KCiAgICBpZiBjb21tYW5kZXJfdHlwZToKICAgICAgICBsaW5lcy5hcHBlbmQoZiJUWVBFOiB7Y29tbWFuZGVyX3R5cGV9IikKCiAgICBsaW5lcy5hcHBlbmQoZiJDT0xPUiBJREVOVElUWToge2NpX3N0cn0iKQogICAgbGluZXMuYXBwZW5kKGYiVEFSR0VUIEJSQUNLRVQ6IHt0YXJnZXRfYnJhY2tldH0iKQoKICAgIGlmIHN0cmF0ZWd5OgogICAgICAgIGxpbmVzLmFwcGVuZChmIlNUUkFURUdZIEZPQ1VTOiB7c3RyYXRlZ3l9IikKCiAgICBpZiBidWRnZXRfdXNkOgogICAgICAgIGlmIGJ1ZGdldF9tb2RlID09ICJwZXJfY2FyZCI6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIkJVREdFVDogTWF4ICR7YnVkZ2V0X3VzZDouMGZ9IHBlciBjYXJkLiBObyBjYXJkIHNob3VsZCBleGNlZWQgdGhpcyBwcmljZS4iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIkJVREdFVDogJHtidWRnZXRfdXNkOi4wZn0gdG90YWwgZGVjayBjb3N0LiBTdGF5IHdpdGhpbiBidWRnZXQuIikKCiAgICBpZiBvbWl0X2NhcmRzOgogICAgICAgIGxpbmVzLmFwcGVuZChmIk9NSVQgTElTVCAoZG8gTk9UIGluY2x1ZGUgdGhlc2UgY2FyZHMpOiB7JywgJy5qb2luKG9taXRfY2FyZHMpfSIpCgogICAgaWYgY29sbGVjdGlvbl9zdW1tYXJ5OgogICAgICAgIGxpbmVzLmFwcGVuZChmIiIpCiAgICAgICAgbGluZXMuYXBwZW5kKGNvbGxlY3Rpb25fc3VtbWFyeSkKICAgICAgICBsaW5lcy5hcHBlbmQoZiIiKQogICAgICAgIGxpbmVzLmFwcGVuZChmIlNUUk9OR0xZIFBSRUZFUiBjYXJkcyBmcm9tIHRoZSBjb2xsZWN0aW9uIHdoZW4gdGhleSBmaXQgdGhlIHN0' +
'cmF0ZWd5LiIpCiAgICBlbHNlOgogICAgICAgIGxpbmVzLmFwcGVuZChmIiIpCiAgICAgICAgbGluZXMuYXBwZW5kKGYiTm8gY29sbGVjdGlvbiBkYXRhIGF2YWlsYWJsZSDigJQgc3VnZ2VzdCB0aGUgYmVzdCBjYXJkcyByZWdhcmRsZXNzIG9mIG93bmVyc2hpcC4iKQoKICAgIGxpbmVzLmFwcGVuZChmIiIpCiAgICBsaW5lcy5hcHBlbmQoZiJCdWlsZCB0aGUgZGVjayBhcyBhIHN0cnVjdHVyZWQgSlNPTiByZXNwb25zZS4gSW5jbHVkZSB0aGUgY29tbWFuZGVyIGluIHRoZSBjYXJkcyBsaXN0LiIpCiAgICBsaW5lcy5hcHBlbmQoZiJFbnN1cmUgZXhhY3RseSAxMDAgdG90YWwgY2FyZHMuIEFzc2lnbiByb2xlX3RhZ3MgYW5kIGJyYWNrZXQgaW5mbyBhY2N1cmF0ZWx5LiIpCgogICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykK'
Install-B64 -R 'coach\prompts\deck_gen_user.py' -B $b
# coach/prompts/substitution_prompt.py (2,449 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFN1YnN0aXR1dGlvbiBQcm9tcHQgVGVtcGxhdGVzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApQcm9tcHRzIGZvciB0aGUgUGVycGxleGl0eSBmYWxsYmFjayBzdWJzdGl0dXRpb24gcGFzcy4KIiIiCgoKU1VCU1RJVFVUSU9OX1NZU1RFTSA9ICIiIllvdSBhcmUgYW4gZXhwZXJ0IE1hZ2ljOiBUaGUgR2F0aGVyaW5nIENvbW1hbmRlciBkZWNrIGJ1aWxkZXIgc3BlY2lhbGl6aW5nIGluIGNhcmQgc3Vic3RpdHV0aW9ucy4KCkdpdmVuIGEgbGlzdCBvZiBjYXJkcyB0aGF0IGEgcGxheWVyIGRvZXMgTk9UIG93biwgc3VnZ2VzdCB0aGUgYmVzdCByZXBsYWNlbWVudCBmcm9tIHRoZWlyIGF2YWlsYWJsZSBjb2xsZWN0aW9uLiBFYWNoIHN1YnN0aXR1dGUgc2hvdWxkOgoxLiBGaWxsIHRoZSBzYW1lIGZ1bmN0aW9uYWwgcm9sZSAocmFtcCDihpIgcmFtcCwgcmVtb3ZhbCDihpIgcmVtb3ZhbCwgbG9yZCDihpIgbG9yZCkKMi4gQmUgd2l0aGluIHRoZSBzYW1lIGNvbG9yIGlkZW50aXR5CjMuIEhhdmUgYSBzaW1pbGFyIG1hbmEgY29zdCAod2l0aGluIMKxMiBDTUMpCjQuIE1haW50YWluIHRoZSBkZWNrJ3Mgc3RyYXRlZ3kgYW5kIHN5bmVyZ2llcyBhcyBtdWNoIGFzIHBvc3NpYmxlCgpPbmx5IHN1Z2dlc3QgY2FyZHMgZnJvbSB0aGUgQUxMT1dFRCBDQVJEUyBMSVNUIHByb3ZpZGVkLiBEbyBub3Qgc3VnZ2VzdCBjYXJkcyBvdXRzaWRlIHRoYXQgbGlzdC4KSWYgbm8gZ29vZCBzdWJzdGl0dXRlIGV4aXN0cyBmb3IgYSBjYXJkLCBvbWl0IGl0IGZyb20gdGhlIHN1YnN0aXR1dGlvbnMgYXJyYXkuIiIiCgoKZGVmIGJ1aWxkX3N1YnN0aXR1dGlvbl9wcm9tcHQoCiAgICBtaXNzaW5nX2NhcmRzOiBsaXN0W2RpY3RdLAogICAgYWxsb3dlZF9jYXJkczogbGlzdFtzdHJdLAogICAgY29tbWFuZGVyOiBzdHIsCiAgICBjb2xvcl9pZGVudGl0eTogbGlzdFtzdHJdLAogICAgc3RyYXRlZ3k6IHN0ciA9ICIiLAopIC0+IHN0cjoKICAgICIiIgogICAgQnVpbGQgdGhlIHVzZXIgcHJvbXB0IGZvciBiYXRjaCBzdWJzdGl0dXRpb24uCgogICAgQXJnczoKICAgICAgICBtaXNzaW5nX2NhcmRzOiBMaXN0IG9mIGRpY3RzIHdpdGggJ25hbWUnLCAncm9sZV90YWdzJywgJ2NhdGVnb3J5JywgJ3JlYXNvbicKICAgICAgICBhbGxvd2VkX2NhcmRzOiBMaXN0IG9mIGNhcmQgbmFtZXMgdGhlIHBsYXllciBvd25zIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICBjb21tYW5kZXI6IENvbW1hbmRlciBuYW1lCiAgICAgICAgY29sb3JfaWRlbnRpdHk6IERlY2sgY29sb3IgaWRlbnRpdHkKICAgICAgICBzdHJhdGVneTogRGVjayBzdHJhdGVneSBzdW1tYXJ5CiAgICAiIiIKICAgIGxpbmVzID0gWwogICAgICAgIGYiREVDSzoge2NvbW1hbmRlcn0gKHsnLCAnLmpvaW4oY29sb3JfaWRlbnRpdHkpfSkiLAogICAgXQogICAgaWYgc3RyYXRlZ3k6CiAgICAgICAgbGluZXMuYXBwZW5kKGYiU1RSQVRFR1k6IHtzdHJhdGVneX0iKQoKICAgIGxpbmVzLmFwcGVuZChmIiIpCiAgICBsaW5lcy5hcHBlbmQoZiJDQVJEUyBUSEFUIE5FRUQgUkVQTEFDSU5HICh7bGVuKG1pc3NpbmdfY2FyZHMpfSk6IikKICAgIGZvciBjYXJkIGluIG1pc3NpbmdfY2FyZHM6CiAgICAgICAgcm9sZXMgPSAiLCAiLmpvaW4oY2FyZC5nZXQoInJvbGVfdGFncyIsIFtdKSkKICAgICAgICBsaW5lcy5hcHBlbmQoZiIgIC0ge2NhcmRbJ25hbWUnXX0gW3tjYXJkLmdldCgnY2F0ZWdvcnknLCAnPycpfV0gKHJvbGVzOiB7cm9sZXN9KSDigJQge2NhcmQuZ2V0KCdyZWFzb24nLCAnJyl9IikKCiAgICBsaW5lcy5hcHBlbmQoZiIiKQogICAgbGluZXMuYXBwZW5kKGYiQUxMT1dFRCBDQVJEUyAocGxheWVyJ3MgY29sbGVjdGlvbiwge2xlbihhbGxvd2VkX2NhcmRzKX0gY2FyZHMpOiIpCiAgICAjIEdyb3VwIGludG8gY2h1bmtzIHRvIHN0YXkgcmVhZGFibGUKICAgIGNodW5rX3NpemUgPSAyMAogICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGFsbG93ZWRfY2FyZHMpLCBjaHVua19zaXplKToKICAgICAgICBjaHVuayA9IGFsbG93ZWRfY2FyZHNbaTppK2NodW5rX3NpemVdCiAgICAgICAgbGluZXMuYXBwZW5kKGYiICB7JywgJy5qb2luKGNodW5rKX0iKQoKICAgIGxpbmVzLmFwcGVuZChmIiIp' +
'CiAgICBsaW5lcy5hcHBlbmQoZiJGb3IgZWFjaCBtaXNzaW5nIGNhcmQsIHN1Z2dlc3QgdGhlIEJFU1Qgc3Vic3RpdHV0ZSBmcm9tIHRoZSBhbGxvd2VkIGxpc3QuIikKICAgIGxpbmVzLmFwcGVuZChmIlJldHVybiBzdHJ1Y3R1cmVkIEpTT04gd2l0aCB0aGUgc3Vic3RpdHV0aW9ucyBhcnJheS4iKQoKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpCg=='
Install-B64 -R 'coach\prompts\substitution_prompt.py' -B $b
# coach/report_generator.py (23,508 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgUmVwb3J0IEdlbmVyYXRvciAoUHl0aG9uKQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKUmVhZHMgYmF0Y2ggcmVzdWx0IEpTT04gZmlsZXMgZnJvbSByZXN1bHRzLyBhbmQgZ2VuZXJhdGVzCmRlY2sgcmVwb3J0IEpTT05zIGluIGRlY2stcmVwb3J0cy8gdGhhdCB0aGUgY29hY2ggc2VydmljZSBjb25zdW1lcy4KClN1cHBvcnRzIGJvdGggSmF2YSBiYXRjaCBmb3JtYXQgYW5kIERlZXBTZWVrIGJhdGNoIGZvcm1hdC4KUG9wdWxhdGVzIGRlY2sgc3RydWN0dXJlIChsYW5kIGNvdW50LCBjdXJ2ZSwgY2FyZCB0eXBlcywgZnVuY3Rpb25hbCByb2xlcykKZnJvbSB0aGUgZGVjayBidWlsZGVyIGRhdGFiYXNlIHdoZW4gYXZhaWxhYmxlLgoiIiIKCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc3FsaXRlMwpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZXpvbmUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBPcHRpb25hbCwgRGljdAoKZnJvbSAuY29uZmlnIGltcG9ydCBERUNLX1JFUE9SVFNfRElSLCBMQUJfUk9PVAoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvYWNoLnJlcG9ydF9nZW5lcmF0b3IiKQoKVU5ERVJQRVJGT1JNRVJfVEhSRVNIT0xEID0gLTAuMDUKTUFYX1VOREVSUEVSRk9STUVSUyA9IDgKTUFYX09WRVJQRVJGT1JNRVJTID0gOAoKCmRlZiBnZW5lcmF0ZV9kZWNrX3JlcG9ydHMocmVzdWx0c19kaXI6IHN0ciwgcmVwb3J0c19kaXI6IHN0ciA9IE5vbmUpIC0+IExpc3Rbc3RyXToKICAgICIiIgogICAgU2NhbiBhbGwgYmF0Y2gtKi5qc29uIGZpbGVzIGluIHJlc3VsdHNfZGlyIGFuZCBnZW5lcmF0ZQogICAgb25lIGRlY2sgcmVwb3J0IHBlciB1bmlxdWUgZGVjayBhY3Jvc3MgYWxsIGJhdGNoZXMuCgogICAgUmV0dXJucyBsaXN0IG9mIGRlY2sgSURzIHRoYXQgd2VyZSBnZW5lcmF0ZWQuCiAgICAiIiIKICAgIHJlc3VsdHNfcGF0aCA9IFBhdGgocmVzdWx0c19kaXIpCiAgICBvdXRwdXRfcGF0aCA9IFBhdGgocmVwb3J0c19kaXIpIGlmIHJlcG9ydHNfZGlyIGVsc2UgREVDS19SRVBPUlRTX0RJUgogICAgb3V0cHV0X3BhdGgubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQoKICAgICMgTG9hZCBhbGwgYmF0Y2ggcmVzdWx0cwogICAgYmF0Y2hfZmlsZXMgPSBzb3J0ZWQocmVzdWx0c19wYXRoLmdsb2IoImJhdGNoLSouanNvbiIpKQogICAgaWYgbm90IGJhdGNoX2ZpbGVzOgogICAgICAgIGxvZ2dlci5pbmZvKCJObyBiYXRjaCByZXN1bHQgZmlsZXMgZm91bmQgaW4gJXMiLCByZXN1bHRzX2RpcikKICAgICAgICByZXR1cm4gW10KCiAgICBhbGxfYmF0Y2hlcyA9IFtdCiAgICBmb3IgYmYgaW4gYmF0Y2hfZmlsZXM6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oYmYsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWQoZikKICAgICAgICAgICAgYWxsX2JhdGNoZXMuYXBwZW5kKGRhdGEpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygiRmFpbGVkIHRvIGxvYWQgJXM6ICVzIiwgYmYsIGUpCgogICAgaWYgbm90IGFsbF9iYXRjaGVzOgogICAgICAgIHJldHVybiBbXQoKICAgICMgRmluZCBhbGwgdW5pcXVlIGRlY2tzIGFjcm9zcyBhbGwgYmF0Y2hlcwogICAgZGVja19zZWF0czogRGljdFtzdHIsIGRpY3RdID0ge30gICMgZGVja05hbWUgLT4ge3NlYXRJbmRleCwgY29tbWFuZGVyTmFtZSwgY29sb3JJZGVudGl0eX0KICAgIGZvciBiYXRjaCBpbiBhbGxfYmF0Y2hlczoKICAgICAgICBmb3IgZGkgaW4gYmF0Y2guZ2V0KCJkZWNrcyIsIFtdKToKICAgICAgICAgICAgbmFtZSA9IGRpLmdldCgiZGVja05hbWUiLCAiIikKICAgICAgICAgICAgaWYgbmFtZSBhbmQgbmFtZSBub3QgaW4gZGVja19zZWF0czoKICAgICAgICAgICAgICAgIGRlY2tfc2VhdHNbbmFtZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgInNlYXRJbmRleCI6IGRpLmdldCgic2VhdEluZGV4IiwgMCksCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRlck5hbWUiOiBk' +
'aS5nZXQoImNvbW1hbmRlck5hbWUiLCBkaS5nZXQoImNvbW1hbmRlciIsICIiKSksCiAgICAgICAgICAgICAgICAgICAgImNvbG9ySWRlbnRpdHkiOiBkaS5nZXQoImNvbG9ySWRlbnRpdHkiLCBbXSksCiAgICAgICAgICAgICAgICB9CgogICAgIyBHZW5lcmF0ZSByZXBvcnQgZm9yIGVhY2ggZGVjawogICAgZ2VuZXJhdGVkID0gW10KICAgIGZvciBkZWNrX25hbWUsIGRlY2tfaW5mbyBpbiBkZWNrX3NlYXRzLml0ZW1zKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXBvcnQgPSBfYnVpbGRfZGVja19yZXBvcnQoZGVja19uYW1lLCBkZWNrX2luZm8sIGFsbF9iYXRjaGVzKQogICAgICAgICAgICBvdXRfZmlsZSA9IG91dHB1dF9wYXRoIC8gZiJ7ZGVja19uYW1lfS5qc29uIgogICAgICAgICAgICB3aXRoIG9wZW4ob3V0X2ZpbGUsICJ3IiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIGpzb24uZHVtcChyZXBvcnQsIGYsIGluZGVudD0yKQogICAgICAgICAgICBnZW5lcmF0ZWQuYXBwZW5kKGRlY2tfbmFtZSkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiR2VuZXJhdGVkIHJlcG9ydCBmb3IgJXM6ICVkIGdhbWVzLCAlLjFmJSUgd2luIHJhdGUiLAogICAgICAgICAgICAgICAgZGVja19uYW1lLAogICAgICAgICAgICAgICAgcmVwb3J0WyJtZXRhIl1bImdhbWVzU2ltdWxhdGVkIl0sCiAgICAgICAgICAgICAgICByZXBvcnRbIm1ldGEiXVsib3ZlcmFsbFdpblJhdGUiXSAqIDEwMCwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVwb3J0IGZvciAlczogJXMiLCBkZWNrX25hbWUsIGUpCgogICAgcmV0dXJuIGdlbmVyYXRlZAoKCmRlZiBnZW5lcmF0ZV9zaW5nbGVfZGVja19yZXBvcnQoYmF0Y2hfanNvbl9wYXRoOiBzdHIsIHJlcG9ydHNfZGlyOiBzdHIgPSBOb25lKSAtPiBMaXN0W3N0cl06CiAgICAiIiIKICAgIEdlbmVyYXRlIGRlY2sgcmVwb3J0cyBmcm9tIGEgc2luZ2xlIGJhdGNoIHJlc3VsdCBKU09OIGZpbGUuCiAgICBNZXJnZXMgd2l0aCBleGlzdGluZyByZXBvcnRzIGlmIHRoZXkgZXhpc3QuCgogICAgUmV0dXJucyBsaXN0IG9mIGRlY2sgSURzIHRoYXQgd2VyZSB1cGRhdGVkLgogICAgIiIiCiAgICBvdXRwdXRfcGF0aCA9IFBhdGgocmVwb3J0c19kaXIpIGlmIHJlcG9ydHNfZGlyIGVsc2UgREVDS19SRVBPUlRTX0RJUgogICAgb3V0cHV0X3BhdGgubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQoKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4oYmF0Y2hfanNvbl9wYXRoLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgIGJhdGNoID0ganNvbi5sb2FkKGYpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gbG9hZCBiYXRjaCByZXN1bHQ6ICVzIiwgZSkKICAgICAgICByZXR1cm4gW10KCiAgICAjIEFsc28gbG9hZCBleGlzdGluZyBiYXRjaCByZXN1bHRzIGZvciBjb21wcmVoZW5zaXZlIHJlcG9ydHMKICAgIHJlc3VsdHNfZGlyID0gUGF0aChiYXRjaF9qc29uX3BhdGgpLnBhcmVudAogICAgYWxsX2JhdGNoZXMgPSBbXQogICAgZm9yIGJmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJiYXRjaC0qLmpzb24iKSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oYmYsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIGFsbF9iYXRjaGVzLmFwcGVuZChqc29uLmxvYWQoZikpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY29udGludWUKCiAgICBpZiBub3QgYWxsX2JhdGNoZXM6CiAgICAgICAgYWxsX2JhdGNoZXMgPSBbYmF0Y2hdCgogICAgIyBHZW5lcmF0ZSByZXBvcnRzIGZvciBhbGwgZGVja3MgaW4gdGhpcyBiYXRjaAogICAgZ2VuZXJhdGVkID0gW10KICAgIGZvciBkaSBpbiBiYXRjaC5nZXQoImRlY2tzIiwgW10pOgogICAgICAgIGRlY2tfbmFtZSA9IGRpLmdldCgiZGVja05hbWUiLCAiIikKICAgICAgICBpZiBub3QgZGVja19uYW1lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGRlY2tfaW5mbyA9IHsKICAgICAgICAgICAgInNlYXRJbmRleCI6IGRpLmdldCgic2VhdEluZGV4IiwgMCksCiAgICAgICAgICAgICJjb21tYW5kZXJOYW1lIjogZGkuZ2V0KCJjb21tYW5kZXJOYW1lIiwgZGku' +
'Z2V0KCJjb21tYW5kZXIiLCAiIikpLAogICAgICAgICAgICAiY29sb3JJZGVudGl0eSI6IGRpLmdldCgiY29sb3JJZGVudGl0eSIsIFtdKSwKICAgICAgICB9CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXBvcnQgPSBfYnVpbGRfZGVja19yZXBvcnQoZGVja19uYW1lLCBkZWNrX2luZm8sIGFsbF9iYXRjaGVzKQogICAgICAgICAgICBvdXRfZmlsZSA9IG91dHB1dF9wYXRoIC8gZiJ7ZGVja19uYW1lfS5qc29uIgogICAgICAgICAgICB3aXRoIG9wZW4ob3V0X2ZpbGUsICJ3IiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIGpzb24uZHVtcChyZXBvcnQsIGYsIGluZGVudD0yKQogICAgICAgICAgICBnZW5lcmF0ZWQuYXBwZW5kKGRlY2tfbmFtZSkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiVXBkYXRlZCByZXBvcnQgZm9yICVzOiAlZCBnYW1lcywgJS4xZiUlIHdpbiByYXRlIiwKICAgICAgICAgICAgICAgIGRlY2tfbmFtZSwKICAgICAgICAgICAgICAgIHJlcG9ydFsibWV0YSJdWyJnYW1lc1NpbXVsYXRlZCJdLAogICAgICAgICAgICAgICAgcmVwb3J0WyJtZXRhIl1bIm92ZXJhbGxXaW5SYXRlIl0gKiAxMDAsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIHJlcG9ydCBmb3IgJXM6ICVzIiwgZGVja19uYW1lLCBlKQoKICAgIHJldHVybiBnZW5lcmF0ZWQKCgojIOKUgOKUgCBEYXRhYmFzZSBoZWxwZXJzIGZvciBkZWNrIHN0cnVjdHVyZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfZ2V0X2RlY2tfY2FyZF9tZXRhZGF0YShkZWNrX25hbWU6IHN0cikgLT4gT3B0aW9uYWxbTGlzdFtkaWN0XV06CiAgICAiIiIKICAgIExvb2sgdXAgY2FyZCBtZXRhZGF0YSAodHlwZV9saW5lLCBjbWMsIG9yYWNsZV90ZXh0LCBtYW5hX2Nvc3QsIGtleXdvcmRzKQogICAgZnJvbSB0aGUgZGVjayBidWlsZGVyIGRhdGFiYXNlIGZvciB0aGUgZ2l2ZW4gZGVjayBuYW1lLgogICAgUmV0dXJucyBOb25lIGlmIERCIG5vdCBhdmFpbGFibGUgb3IgZGVjayBub3QgZm91bmQuCiAgICAiIiIKICAgIGRiX3BhdGggPSBMQUJfUk9PVCAvICJkZWNrYnVpbGRlci5kYiIKICAgIGlmIG5vdCBkYl9wYXRoLmV4aXN0cygpOgogICAgICAgICMgVHJ5IGFsdGVybmF0ZSBsb2NhdGlvbgogICAgICAgIGRiX3BhdGggPSBMQUJfUk9PVCAvICJkYXRhIiAvICJkZWNrYnVpbGRlci5kYiIKICAgIGlmIG5vdCBkYl9wYXRoLmV4aXN0cygpOgogICAgICAgIHJldHVybiBOb25lCgogICAgdHJ5OgogICAgICAgIGNvbm4gPSBzcWxpdGUzLmNvbm5lY3Qoc3RyKGRiX3BhdGgpKQogICAgICAgIGNvbm4ucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdwoKICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaWQgRlJPTSBkZWNrcyBXSEVSRSBuYW1lID0gPyBDT0xMQVRFIE5PQ0FTRSIsIChkZWNrX25hbWUsKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGlmIG5vdCByb3c6CiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBkZWNrX2lkID0gcm93WyJpZCJdCiAgICAgICAgY2FyZHMgPSBjb25uLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIFNFTEVDVCBkYy5jYXJkX25hbWUsIGRjLnF1YW50aXR5LCBkYy5pc19jb21tYW5kZXIsCiAgICAgICAgICAgICAgICAgICBjZS50eXBlX2xpbmUsIGNlLmNtYywgY2Uub3JhY2xlX3RleHQsCiAgICAgICAgICAgICAgICAgICBjZS5rZXl3b3JkcywgY2UubWFuYV9jb3N0LCBjZS5jb2xvcl9pZGVudGl0eQogICAgICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICAgICAgTEVGVCBKT0lOIGNvbGxlY3Rpb25fZW50cmllcyBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/CiAgICAgICAgIiIiLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgZm9yIHIgaW4gY2FyZHM6CiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKHJbInF1YW50aXR5Il0gb3IgMSk6CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHJbImNhcmRfbmFtZSJdLAogICAgICAg' +
'ICAgICAgICAgICAgICJ0eXBlX2xpbmUiOiByWyJ0eXBlX2xpbmUiXSBvciAiIiwKICAgICAgICAgICAgICAgICAgICAiY21jIjogclsiY21jIl0gb3IgMCwKICAgICAgICAgICAgICAgICAgICAib3JhY2xlX3RleHQiOiByWyJvcmFjbGVfdGV4dCJdIG9yICIiLAogICAgICAgICAgICAgICAgICAgICJrZXl3b3JkcyI6IHJbImtleXdvcmRzIl0gb3IgIiIsCiAgICAgICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6IHJbIm1hbmFfY29zdCJdIG9yICIiLAogICAgICAgICAgICAgICAgICAgICJpc19jb21tYW5kZXIiOiByWyJpc19jb21tYW5kZXIiXSBvciAwLAogICAgICAgICAgICAgICAgfSkKICAgICAgICBjb25uLmNsb3NlKCkKICAgICAgICByZXR1cm4gcmVzdWx0IGlmIHJlc3VsdCBlbHNlIE5vbmUKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dnZXIud2FybmluZygiREIgbG9va3VwIGZhaWxlZCBmb3IgZGVjayAnJXMnOiAlcyIsIGRlY2tfbmFtZSwgZSkKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBfY29tcHV0ZV9zdHJ1Y3R1cmUoZGVja19jYXJkczogTGlzdFtkaWN0XSkgLT4gZGljdDoKICAgICIiIkNvbXB1dGUgZGVjayBzdHJ1Y3R1cmUgKGxhbmRDb3VudCwgY3VydmVCdWNrZXRzLCBjYXJkVHlwZUNvdW50cywgZnVuY3Rpb25hbENvdW50cykKICAgIGZyb20gY2FyZCBtZXRhZGF0YS4iIiIKICAgIGxhbmRfY291bnQgPSAwCiAgICBjdXJ2ZV9idWNrZXRzID0gWzBdICogOCAgIyBDTUMgMCwgMSwgMiwgMywgNCwgNSwgNiwgNysKICAgIGNhcmRfdHlwZV9jb3VudHM6IERpY3Rbc3RyLCBpbnRdID0ge30KICAgIGZ1bmN0aW9uYWxfY291bnRzOiBEaWN0W3N0ciwgaW50XSA9IHt9CgogICAgZm9yIGNhcmQgaW4gZGVja19jYXJkczoKICAgICAgICB0eXBlX2xpbmUgPSBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpLmxvd2VyKCkKICAgICAgICBjbWMgPSBjYXJkLmdldCgiY21jIiwgMCkgb3IgMAogICAgICAgIG9yYWNsZSA9IChjYXJkLmdldCgib3JhY2xlX3RleHQiLCAiIikgb3IgIiIpLmxvd2VyKCkKICAgICAgICBrZXl3b3JkcyA9IChjYXJkLmdldCgia2V5d29yZHMiLCAiIikgb3IgIiIpLmxvd2VyKCkKCiAgICAgICAgIyBEZXRlcm1pbmUgcHJpbWFyeSB0eXBlCiAgICAgICAgcHJpbWFyeV90eXBlID0gIk90aGVyIgogICAgICAgIGlmICJsYW5kIiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHByaW1hcnlfdHlwZSA9ICJMYW5kIgogICAgICAgICAgICBsYW5kX2NvdW50ICs9IDEKICAgICAgICBlbGlmICJjcmVhdHVyZSIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICBwcmltYXJ5X3R5cGUgPSAiQ3JlYXR1cmUiCiAgICAgICAgZWxpZiAiaW5zdGFudCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICBwcmltYXJ5X3R5cGUgPSAiSW5zdGFudCIKICAgICAgICBlbGlmICJzb3JjZXJ5IiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHByaW1hcnlfdHlwZSA9ICJTb3JjZXJ5IgogICAgICAgIGVsaWYgImFydGlmYWN0IiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHByaW1hcnlfdHlwZSA9ICJBcnRpZmFjdCIKICAgICAgICBlbGlmICJlbmNoYW50bWVudCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICBwcmltYXJ5X3R5cGUgPSAiRW5jaGFudG1lbnQiCiAgICAgICAgZWxpZiAicGxhbmVzd2Fsa2VyIiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHByaW1hcnlfdHlwZSA9ICJQbGFuZXN3YWxrZXIiCgogICAgICAgIGNhcmRfdHlwZV9jb3VudHNbcHJpbWFyeV90eXBlXSA9IGNhcmRfdHlwZV9jb3VudHMuZ2V0KHByaW1hcnlfdHlwZSwgMCkgKyAxCgogICAgICAgICMgTWFuYSBjdXJ2ZSAoZXhjbHVkZSBsYW5kcykKICAgICAgICBpZiBwcmltYXJ5X3R5cGUgIT0gIkxhbmQiOgogICAgICAgICAgICBidWNrZXQgPSBtaW4oaW50KGNtYyksIDcpCiAgICAgICAgICAgIGN1cnZlX2J1Y2tldHNbYnVja2V0XSArPSAxCgogICAgICAgICMgRnVuY3Rpb25hbCByb2xlIGNsYXNzaWZpY2F0aW9uCiAgICAgICAgcm9sZSA9IF9jbGFzc2lmeV9yb2xlKG9yYWNsZSwga2V5d29yZHMsIHR5cGVfbGluZSwgcHJpbWFyeV90eXBlKQogICAgICAgIGlmIHJvbGU6CiAgICAgICAgICAgIGZ1bmN0aW9uYWxfY291bnRzW3JvbGVdID0gZnVuY3Rpb25hbF9jb3VudHMuZ2V0KHJvbGUsIDApICsgMQoKICAgIHJldHVybiB7CiAgICAgICAgImxhbmRDb3VudCI6IGxhbmRfY291bnQsCiAgICAgICAgImN1cnZlQnVja2V0cyI6IGN1cnZlX2J1Y2tldHMs' +
'CiAgICAgICAgImNhcmRUeXBlQ291bnRzIjogY2FyZF90eXBlX2NvdW50cywKICAgICAgICAiZnVuY3Rpb25hbENvdW50cyI6IGZ1bmN0aW9uYWxfY291bnRzLAogICAgfQoKCmRlZiBfY2xhc3NpZnlfcm9sZShvcmFjbGU6IHN0ciwga2V5d29yZHM6IHN0ciwgdHlwZV9saW5lOiBzdHIsIHByaW1hcnlfdHlwZTogc3RyKSAtPiBzdHI6CiAgICAiIiJDbGFzc2lmeSBhIGNhcmQncyBmdW5jdGlvbmFsIHJvbGUgZnJvbSBpdHMgb3JhY2xlIHRleHQgYW5kIHR5cGUuIiIiCiAgICBpZiBwcmltYXJ5X3R5cGUgPT0gIkxhbmQiOgogICAgICAgIHJldHVybiAiIgoKICAgICMgUmFtcCBkZXRlY3Rpb24KICAgIGlmIGFueShwaHJhc2UgaW4gb3JhY2xlIGZvciBwaHJhc2UgaW4gWwogICAgICAgICJhZGQgeyIsICJhZGQgb25lIG1hbmEiLCAic2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSBiYXNpYyBsYW5kIiwKICAgICAgICAic2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSBsYW5kIiwgIm1hbmEgb2YgYW55IiwgImFkZGl0aW9uYWwgbGFuZCIsCiAgICBdKToKICAgICAgICByZXR1cm4gInJhbXAiCgogICAgIyBDYXJkIGRyYXcKICAgIGlmIGFueShwaHJhc2UgaW4gb3JhY2xlIGZvciBwaHJhc2UgaW4gWwogICAgICAgICJkcmF3IGEgY2FyZCIsICJkcmF3IHR3byIsICJkcmF3IHRocmVlIiwgImRyYXcgY2FyZHMiLAogICAgICAgICJkcmF3IHggY2FyZCIsICJkcmF3cyBhIGNhcmQiLAogICAgXSk6CiAgICAgICAgcmV0dXJuICJkcmF3IgoKICAgICMgUmVtb3ZhbAogICAgaWYgYW55KHBocmFzZSBpbiBvcmFjbGUgZm9yIHBocmFzZSBpbiBbCiAgICAgICAgImRlc3Ryb3kgdGFyZ2V0IiwgImV4aWxlIHRhcmdldCIsICJkZWFscyBkYW1hZ2UgdG8gdGFyZ2V0IiwKICAgICAgICAiLXgvLXgiLCAiZGVzdHJveSBhbGwiLCAiZXhpbGUgYWxsIiwgInJldHVybiB0YXJnZXQiLAogICAgICAgICJjb3VudGVyIHRhcmdldCBzcGVsbCIsCiAgICBdKToKICAgICAgICByZXR1cm4gInJlbW92YWwiCgogICAgIyBQcm90ZWN0aW9uIC8gaW50ZXJhY3Rpb24KICAgIGlmIGFueShwaHJhc2UgaW4gb3JhY2xlIGZvciBwaHJhc2UgaW4gWwogICAgICAgICJoZXhwcm9vZiIsICJpbmRlc3RydWN0aWJsZSIsICJwcm90ZWN0aW9uIGZyb20iLAogICAgICAgICJzaHJvdWQiLCAid2FyZCIsCiAgICBdKSBvciBhbnkoa3cgaW4ga2V5d29yZHMgZm9yIGt3IGluIFsiaGV4cHJvb2YiLCAiaW5kZXN0cnVjdGlibGUiLCAid2FyZCJdKToKICAgICAgICByZXR1cm4gInByb3RlY3Rpb24iCgogICAgIyBUdXRvcgogICAgaWYgInNlYXJjaCB5b3VyIGxpYnJhcnkiIGluIG9yYWNsZSBhbmQgImxhbmQiIG5vdCBpbiBvcmFjbGU6CiAgICAgICAgcmV0dXJuICJ0dXRvciIKCiAgICAjIFRocmVhdCAvIGZpbmlzaGVyIChoaWdoLXBvd2VyIGNyZWF0dXJlcywgcGxhbmVzd2Fsa2VycykKICAgIGlmIHByaW1hcnlfdHlwZSA9PSAiUGxhbmVzd2Fsa2VyIjoKICAgICAgICByZXR1cm4gInRocmVhdCIKICAgIGlmIHByaW1hcnlfdHlwZSA9PSAiQ3JlYXR1cmUiIGFuZCAoCiAgICAgICAgIndoZW5ldmVyIiBpbiBvcmFjbGUgb3IgImVhY2giIGluIG9yYWNsZSBvciAiYWxsIiBpbiBvcmFjbGUKICAgICk6CiAgICAgICAgcmV0dXJuICJ0aHJlYXQiCgogICAgIyBEZWZhdWx0OiB1dGlsaXR5CiAgICByZXR1cm4gInV0aWxpdHkiCgoKIyDilIDilIAgR2FtZSBkYXRhIGV4dHJhY3Rpb24gaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfZXh0cmFjdF9nYW1lc19mcm9tX2JhdGNoKGJhdGNoOiBkaWN0LCBkZWNrX25hbWU6IHN0cikgLT4gTGlzdFtkaWN0XToKICAgICIiIgogICAgRXh0cmFjdCBnYW1lIGRhdGEgZnJvbSBhIGJhdGNoIGluIGEgbm9ybWFsaXplZCBmb3JtYXQsCiAgICBzdXBwb3J0aW5nIGJvdGggRGVlcFNlZWsgYW5kIEphdmEgYmF0Y2ggZm9ybWF0cy4KCiAgICBSZXR1cm5zIGxpc3Qgb2Y6CiAgICB7CiAgICAgICAgIndvbiI6IGJvb2wsCiAgICAgICAgInR1cm5zIjogaW50LAogICAgICAgICJvcHBvbmVudHMiOiBbc3RyXSwKICAgICAgICAiY2FyZFN0YXRzIjogW3siY2FyZE5hbWUiOiAuLi4sICJkcmF3biI6IC4uLiwgImNhc3QiOiAuLi4sIC4uLn1dCiAgICB9CiAgICAiIiIKICAgIGdhbWVzID0gW10KCiAgICAjIEZpbmQgdGhpcyBkZWNrIGluIHRoZSBiYXRjaAogICAgYmF0' +
'Y2hfZGVjayA9IE5vbmUKICAgIGZvciBkaSBpbiBiYXRjaC5nZXQoImRlY2tzIiwgW10pOgogICAgICAgIGlmIGRpLmdldCgiZGVja05hbWUiLCAiIikgPT0gZGVja19uYW1lOgogICAgICAgICAgICBiYXRjaF9kZWNrID0gZGkKICAgICAgICAgICAgYnJlYWsKICAgIGlmIGJhdGNoX2RlY2sgaXMgTm9uZToKICAgICAgICByZXR1cm4gZ2FtZXMKCiAgICAjIERldGVybWluZSBvcHBvbmVudCBuYW1lcwogICAgb3Bwb25lbnRzID0gWwogICAgICAgIGRpLmdldCgiZGVja05hbWUiLCAiIikKICAgICAgICBmb3IgZGkgaW4gYmF0Y2guZ2V0KCJkZWNrcyIsIFtdKQogICAgICAgIGlmIGRpLmdldCgiZGVja05hbWUiLCAiIikgIT0gZGVja19uYW1lCiAgICBdCgogICAgIyDilIDilIAgRm9ybWF0IDE6IERlZXBTZWVrIGZvcm1hdCDilIDilIAKICAgICMgR2FtZXMgYXJlIG5lc3RlZCBpbnNpZGUgZWFjaCBkZWNrOiBiYXRjaF9kZWNrWyJnYW1lcyJdID0gW3sid2lubmVyIjogMCwgInR1cm5zIjogMTIsICJwbGF5ZXJBIjogey4uLn0sIC4uLn1dCiAgICBkZWNrX2dhbWVzID0gYmF0Y2hfZGVjay5nZXQoImdhbWVzIiwgW10pCiAgICBpZiBkZWNrX2dhbWVzOgogICAgICAgIGZvciBnYW1lIGluIGRlY2tfZ2FtZXM6CiAgICAgICAgICAgIGlmICJlcnJvciIgaW4gZ2FtZSBhbmQgIndpbm5lciIgbm90IGluIGdhbWU6CiAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBTa2lwIGVycm9yZWQgZ2FtZXMKCiAgICAgICAgICAgIHdvbiA9IGdhbWUuZ2V0KCJ3aW5uZXIiLCAtMSkgPT0gMAogICAgICAgICAgICB0dXJucyA9IGdhbWUuZ2V0KCJ0dXJucyIsIDApCiAgICAgICAgICAgIGdhbWVzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAid29uIjogd29uLAogICAgICAgICAgICAgICAgInR1cm5zIjogdHVybnMsCiAgICAgICAgICAgICAgICAib3Bwb25lbnRzIjogb3Bwb25lbnRzLAogICAgICAgICAgICAgICAgImNhcmRTdGF0cyI6IFtdLCAgIyBEZWVwU2VlayBkb2Vzbid0IGhhdmUgcGVyLWNhcmQgc3RhdHMKICAgICAgICAgICAgfSkKICAgICAgICByZXR1cm4gZ2FtZXMKCiAgICAjIOKUgOKUgCBGb3JtYXQgMjogSmF2YSBmb3JtYXQg4pSA4pSACiAgICAjIEdhbWVzIGFyZSBhdCBiYXRjaCBsZXZlbDogYmF0Y2hbImdhbWVzIl0gPSBbeyJ0b3RhbFR1cm5zIjogLi4uLCAicGxheWVyUmVzdWx0cyI6IFsuLi5dfV0KICAgIGJhdGNoX3NlYXQgPSBiYXRjaF9kZWNrLmdldCgic2VhdEluZGV4IiwgMCkKICAgIGZvciBnYW1lIGluIGJhdGNoLmdldCgiZ2FtZXMiLCBbXSk6CiAgICAgICAgbXlfcmVzdWx0ID0gTm9uZQogICAgICAgIGZvciBwciBpbiBnYW1lLmdldCgicGxheWVyUmVzdWx0cyIsIFtdKToKICAgICAgICAgICAgaWYgcHIuZ2V0KCJzZWF0SW5kZXgiKSA9PSBiYXRjaF9zZWF0OgogICAgICAgICAgICAgICAgbXlfcmVzdWx0ID0gcHIKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbXlfcmVzdWx0IGlzIE5vbmU6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHdvbiA9IG15X3Jlc3VsdC5nZXQoImlzV2lubmVyIiwgRmFsc2UpCiAgICAgICAgdHVybnMgPSBnYW1lLmdldCgidG90YWxUdXJucyIsIDApCiAgICAgICAgY2FyZF9zdGF0cyA9IG15X3Jlc3VsdC5nZXQoImNhcmRTdGF0cyIsIFtdKQoKICAgICAgICBnYW1lcy5hcHBlbmQoewogICAgICAgICAgICAid29uIjogd29uLAogICAgICAgICAgICAidHVybnMiOiB0dXJucywKICAgICAgICAgICAgIm9wcG9uZW50cyI6IG9wcG9uZW50cywKICAgICAgICAgICAgImNhcmRTdGF0cyI6IGNhcmRfc3RhdHMsCiAgICAgICAgfSkKCiAgICByZXR1cm4gZ2FtZXMKCgpkZWYgX2J1aWxkX2RlY2tfcmVwb3J0KGRlY2tfbmFtZTogc3RyLCBkZWNrX2luZm86IGRpY3QsIGFsbF9iYXRjaGVzOiBsaXN0KSAtPiBkaWN0OgogICAgIiIiQnVpbGQgYSBjb21wbGV0ZSBkZWNrIHJlcG9ydCBmcm9tIGJhdGNoIGRhdGEuIiIiCiAgICBjb21tYW5kZXIgPSBkZWNrX2luZm8uZ2V0KCJjb21tYW5kZXJOYW1lIiwgZGVja19uYW1lKQogICAgY29sb3JzID0gZGVja19pbmZvLmdldCgiY29sb3JJZGVudGl0eSIsIFtdKQoKICAgIHRvdGFsX2dhbWVzID0gMAogICAgdG90YWxfd2lucyA9IDAKICAgIHRvdGFsX3R1cm5zID0gMAoKICAgICMgUGVyLWNhcmQgYWNjdW11bGF0b3JzIChmcm9tIEphdmEgZm9ybWF0IGNhcmRTdGF0cykKICAgIGNhcmRfbWFwOiBEaWN0W3N0ciwgZGljdF0gPSB7fQoKICAgICMgTWF0Y2h1cCB0cmFj' +
'a2luZwogICAgbWF0Y2h1cF9tYXA6IERpY3Rbc3RyLCBMaXN0W2ludF1dID0ge30gICMgb3Bwb25lbnQgLT4gW2dhbWVzLCB3aW5zXQoKICAgIGZvciBiYXRjaCBpbiBhbGxfYmF0Y2hlczoKICAgICAgICAjIFVwZGF0ZSBjb21tYW5kZXIvY29sb3JzIGZyb20gYmF0Y2ggZGVjayBlbnRyeQogICAgICAgIGZvciBkaSBpbiBiYXRjaC5nZXQoImRlY2tzIiwgW10pOgogICAgICAgICAgICBpZiBkaS5nZXQoImRlY2tOYW1lIikgPT0gZGVja19uYW1lOgogICAgICAgICAgICAgICAgaWYgbm90IGNvbW1hbmRlciBvciBjb21tYW5kZXIgPT0gZGVja19uYW1lOgogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlciA9IGRpLmdldCgiY29tbWFuZGVyTmFtZSIsIGRpLmdldCgiY29tbWFuZGVyIiwgZGVja19uYW1lKSkKICAgICAgICAgICAgICAgIGlmIG5vdCBjb2xvcnM6CiAgICAgICAgICAgICAgICAgICAgY29sb3JzID0gZGkuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAjIEV4dHJhY3Qgbm9ybWFsaXplZCBnYW1lIGRhdGEKICAgICAgICBnYW1lcyA9IF9leHRyYWN0X2dhbWVzX2Zyb21fYmF0Y2goYmF0Y2gsIGRlY2tfbmFtZSkKCiAgICAgICAgZm9yIGdhbWUgaW4gZ2FtZXM6CiAgICAgICAgICAgIHRvdGFsX2dhbWVzICs9IDEKICAgICAgICAgICAgdG90YWxfdHVybnMgKz0gZ2FtZVsidHVybnMiXQoKICAgICAgICAgICAgd29uID0gZ2FtZVsid29uIl0KICAgICAgICAgICAgaWYgd29uOgogICAgICAgICAgICAgICAgdG90YWxfd2lucyArPSAxCgogICAgICAgICAgICAjIE1hdGNodXBzCiAgICAgICAgICAgIGZvciBvcHAgaW4gZ2FtZVsib3Bwb25lbnRzIl06CiAgICAgICAgICAgICAgICBpZiBvcHAgbm90IGluIG1hdGNodXBfbWFwOgogICAgICAgICAgICAgICAgICAgIG1hdGNodXBfbWFwW29wcF0gPSBbMCwgMF0KICAgICAgICAgICAgICAgIG1hdGNodXBfbWFwW29wcF1bMF0gKz0gMQogICAgICAgICAgICAgICAgaWYgd29uOgogICAgICAgICAgICAgICAgICAgIG1hdGNodXBfbWFwW29wcF1bMV0gKz0gMQoKICAgICAgICAgICAgIyBQZXItY2FyZCBzdGF0cyAob25seSBhdmFpbGFibGUgZnJvbSBKYXZhIGZvcm1hdCkKICAgICAgICAgICAgZm9yIHBjcyBpbiBnYW1lLmdldCgiY2FyZFN0YXRzIiwgW10pOgogICAgICAgICAgICAgICAgY2FyZF9uYW1lID0gcGNzLmdldCgiY2FyZE5hbWUiLCAiIikKICAgICAgICAgICAgICAgIGlmIG5vdCBjYXJkX25hbWU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICBpZiBjYXJkX25hbWUgbm90IGluIGNhcmRfbWFwOgogICAgICAgICAgICAgICAgICAgIGNhcmRfbWFwW2NhcmRfbmFtZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY2FyZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAiZ2FtZXNTZWVuIjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgImdhbWVzRHJhd24iOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAiZ2FtZXNDYXN0IjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgImdhbWVzV2hlbkNhc3QiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAid2luc1doZW5DYXN0IjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgImdhbWVzRGVhZENhcmQiOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAiZ2FtZXNLZXB0SW5PcGVuaW5nIjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsVHVybkNhc3QiOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbERhbWFnZSI6IDAuMCwKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY3AgPSBjYXJkX21hcFtjYXJkX25hbWVdCiAgICAgICAgICAgICAgICBjcFsiZ2FtZXNTZWVuIl0gKz0gMQoKICAgICAgICAgICAgICAgIGlmIHBjcy5nZXQoImRyYXduIiwgRmFsc2UpOgogICAgICAgICAgICAgICAgICAgIGNwWyJnYW1lc0RyYXduIl0gKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIHBjcy5nZXQoImNhc3QiLCBGYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNwWyJnYW1lc0Nhc3QiXSArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGNwWyJnYW1lc1doZW5DYXN0Il0gKz0gMQogICAgICAgICAgICAgICAgICAgICAgICBpZiB3b246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcFsid2luc1doZW5DYXN0Il0gKz0gMQogICAgICAgICAgICAgICAgICAgICAgICB0' +
'dXJuX2Nhc3QgPSBwY3MuZ2V0KCJ0dXJuQ2FzdCIsIC0xKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0dXJuX2Nhc3QgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwWyJ0b3RhbFR1cm5DYXN0Il0gKz0gdHVybl9jYXN0CiAgICAgICAgICAgICAgICAgICAgaWYgcGNzLmdldCgic3R1Y2tJbkhhbmQiLCBGYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNwWyJnYW1lc0RlYWRDYXJkIl0gKz0gMQoKICAgICAgICAgICAgICAgIGlmIHBjcy5nZXQoImluT3BlbmluZ0hhbmQiLCBGYWxzZSkgYW5kIHBjcy5nZXQoImtlcHRJbk9wZW5pbmdIYW5kIiwgRmFsc2UpOgogICAgICAgICAgICAgICAgICAgIGNwWyJnYW1lc0tlcHRJbk9wZW5pbmciXSArPSAxCgogICAgICAgICAgICAgICAgY3BbInRvdGFsRGFtYWdlIl0gKz0gcGNzLmdldCgiZGFtYWdlRGVhbHQiLCAwKQoKICAgICMg4pSA4pSAIENvbXB1dGUgZGVjay1sZXZlbCBzdGF0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBvdmVyYWxsX3dpbl9yYXRlID0gdG90YWxfd2lucyAvIHRvdGFsX2dhbWVzIGlmIHRvdGFsX2dhbWVzID4gMCBlbHNlIDAuMAogICAgYXZnX2dhbWVfbGVuZ3RoID0gdG90YWxfdHVybnMgLyB0b3RhbF9nYW1lcyBpZiB0b3RhbF9nYW1lcyA+IDAgZWxzZSAwLjAKCiAgICAjIOKUgOKUgCBDb21wdXRlIG1hdGNodXBzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIG1hdGNodXBzID0gW10KICAgIGZvciBvcHBfbmFtZSwgc3RhdHMgaW4gbWF0Y2h1cF9tYXAuaXRlbXMoKToKICAgICAgICBtYXRjaHVwcy5hcHBlbmQoewogICAgICAgICAgICAib3Bwb25lbnREZWNrIjogb3BwX25hbWUsCiAgICAgICAgICAgICJvcHBvbmVudENvbW1hbmRlciI6ICIiLAogICAgICAgICAgICAiZ2FtZXNQbGF5ZWQiOiBzdGF0c1swXSwKICAgICAgICAgICAgIndpblJhdGUiOiBzdGF0c1sxXSAvIHN0YXRzWzBdIGlmIHN0YXRzWzBdID4gMCBlbHNlIDAuMCwKICAgICAgICB9KQoKICAgICMg4pSA4pSAIENvbXB1dGUgcGVyLWNhcmQgcGVyZm9ybWFuY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgY2FyZHMgPSBbXQogICAgZm9yIGNwIGluIGNhcmRfbWFwLnZhbHVlcygpOgogICAgICAgIGdzID0gY3BbImdhbWVzU2VlbiJdCiAgICAgICAgaWYgZ3MgPT0gMDoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgZHJhd25fcmF0ZSA9IGNwWyJnYW1lc0RyYXduIl0gLyBncwogICAgICAgIGNhc3RfcmF0ZSA9IGNwWyJnYW1lc0Nhc3QiXSAvIGNwWyJnYW1lc0RyYXduIl0gaWYgY3BbImdhbWVzRHJhd24iXSA+IDAgZWxzZSAwLjAKICAgICAgICBkZWFkX2NhcmRfcmF0ZSA9IGNwWyJnYW1lc0RlYWRDYXJkIl0gLyBjcFsiZ2FtZXNEcmF3biJdIGlmIGNwWyJnYW1lc0RyYXduIl0gPiAwIGVsc2UgMC4wCiAgICAgICAga2VwdF9yYXRlID0gY3BbImdhbWVzS2VwdEluT3BlbmluZyJdIC8gZ3MKCiAgICAgICAgIyBJbXBhY3Qgc2NvcmUKICAgICAgICB3aW5fcmF0ZV93aGVuX2Nhc3QgPSAoCiAgICAgICAgICAgIGNwWyJ3aW5zV2hlbkNhc3QiXSAvIGNwWyJnYW1lc1doZW5DYXN0Il0KICAgICAgICAgICAgaWYgY3BbImdhbWVzV2hlbkNhc3QiXSA+IDAKICAgICAgICAgICAgZWxzZSAwLjAKICAgICAgICApCiAgICAgICAgaW1wYWN0X3Njb3JlID0gKHdpbl9yYXRlX3doZW5fY2FzdCAtIG92ZXJhbGxfd2luX3JhdGUpICogY2FzdF9yYXRlCgogICAgICAgICMgQ2x1bmtpbmVzcwogICAgICAgIGNsdW5raW5lc3MgPSBkZWFkX2NhcmRfcmF0ZSAqICgxLjAgLSBjYXN0X3JhdGUpCgogICAgICAgICMgQXZlcmFnZSB0dXJuIGNhc3QKICAgICAgICBhdmdfdHVybl9jYXN0ID0gKAogICAgICAgICAgICBjcFsidG90YWxUdXJuQ2FzdCJdIC8gY3BbImdhbWVzQ2FzdCJdIGlmIGNwWyJnYW1lc0Nhc3QiXSA+IDAgZWxzZSBOb25lCiAgICAgICAgKQoKICAgICAgICBhdmdfZGFtYWdlID0gY3BbInRvdGFsRGFtYWdlIl0gLyBncwoKICAgICAgICBjYXJkcy5hcHBlbmQoewogICAgICAgICAgICAibmFtZSI6' +
'IGNwWyJuYW1lIl0sCiAgICAgICAgICAgICJkcmF3blJhdGUiOiByb3VuZChkcmF3bl9yYXRlLCA0KSwKICAgICAgICAgICAgImNhc3RSYXRlIjogcm91bmQoY2FzdF9yYXRlLCA0KSwKICAgICAgICAgICAgImtlcHRJbk9wZW5pbmdIYW5kUmF0ZSI6IHJvdW5kKGtlcHRfcmF0ZSwgNCksCiAgICAgICAgICAgICJkZWFkQ2FyZFJhdGUiOiByb3VuZChkZWFkX2NhcmRfcmF0ZSwgNCksCiAgICAgICAgICAgICJpbXBhY3RTY29yZSI6IHJvdW5kKGltcGFjdF9zY29yZSwgNCksCiAgICAgICAgICAgICJzeW5lcmd5U2NvcmUiOiAwLjAsCiAgICAgICAgICAgICJjbHVua2luZXNzU2NvcmUiOiByb3VuZChjbHVua2luZXNzLCA0KSwKICAgICAgICAgICAgImF2Z1R1cm5DYXN0Ijogcm91bmQoYXZnX3R1cm5fY2FzdCwgMikgaWYgYXZnX3R1cm5fY2FzdCBpcyBub3QgTm9uZSBlbHNlIE5vbmUsCiAgICAgICAgICAgICJhdmdEYW1hZ2VEZWFsdCI6IHJvdW5kKGF2Z19kYW1hZ2UsIDIpLAogICAgICAgICAgICAidGFncyI6IFtdLAogICAgICAgIH0pCgogICAgIyDilIDilIAgUG9wdWxhdGUgZGVjayBzdHJ1Y3R1cmUgZnJvbSBEQiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBzdHJ1Y3R1cmUgPSB7CiAgICAgICAgImxhbmRDb3VudCI6IDAsCiAgICAgICAgImN1cnZlQnVja2V0cyI6IFswXSAqIDgsCiAgICAgICAgImNhcmRUeXBlQ291bnRzIjoge30sCiAgICAgICAgImZ1bmN0aW9uYWxDb3VudHMiOiB7fSwKICAgIH0KCiAgICBkZWNrX2NhcmRzX21ldGEgPSBfZ2V0X2RlY2tfY2FyZF9tZXRhZGF0YShkZWNrX25hbWUpCiAgICBpZiBkZWNrX2NhcmRzX21ldGE6CiAgICAgICAgc3RydWN0dXJlID0gX2NvbXB1dGVfc3RydWN0dXJlKGRlY2tfY2FyZHNfbWV0YSkKICAgICAgICBsb2dnZXIuaW5mbygiUG9wdWxhdGVkIHN0cnVjdHVyZSBmb3IgJXMgZnJvbSBEQjogJWQgbGFuZHMsIHR5cGVzPSVzIiwKICAgICAgICAgICAgICAgICAgICAgZGVja19uYW1lLCBzdHJ1Y3R1cmVbImxhbmRDb3VudCJdLCBzdHJ1Y3R1cmVbImNhcmRUeXBlQ291bnRzIl0pCgogICAgICAgICMgSWYgd2UgaGF2ZSBubyBwZXItY2FyZCBzdGF0cyBmcm9tIHNpbSBkYXRhIChEZWVwU2VlayBmb3JtYXQpLAogICAgICAgICMgY3JlYXRlIHBsYWNlaG9sZGVyIGNhcmQgZW50cmllcyBmcm9tIHRoZSBEQiBzbyB0aGUgY29hY2ggaGFzCiAgICAgICAgIyBjYXJkIG5hbWVzIHRvIHdvcmsgd2l0aAogICAgICAgIGlmIG5vdCBjYXJkcyBhbmQgZGVja19jYXJkc19tZXRhOgogICAgICAgICAgICBmb3IgY2FyZF9tZXRhIGluIGRlY2tfY2FyZHNfbWV0YToKICAgICAgICAgICAgICAgIGNhcmRfbmFtZSA9IGNhcmRfbWV0YVsibmFtZSJdCiAgICAgICAgICAgICAgICB0eXBlX2xpbmUgPSBjYXJkX21ldGEuZ2V0KCJ0eXBlX2xpbmUiLCAiIikKICAgICAgICAgICAgICAgICMgU2tpcCBiYXNpYyBsYW5kcyBmcm9tIHRoZSBjYXJkIGxpc3Qgc2VudCB0byBjb2FjaAogICAgICAgICAgICAgICAgaWYgIkJhc2ljIiBpbiB0eXBlX2xpbmUgYW5kICJMYW5kIiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGNhcmRzLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBjYXJkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgImRyYXduUmF0ZSI6IDAuMCwKICAgICAgICAgICAgICAgICAgICAiY2FzdFJhdGUiOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgImtlcHRJbk9wZW5pbmdIYW5kUmF0ZSI6IDAuMCwKICAgICAgICAgICAgICAgICAgICAiZGVhZENhcmRSYXRlIjogMC4wLAogICAgICAgICAgICAgICAgICAgICJpbXBhY3RTY29yZSI6IDAuMCwKICAgICAgICAgICAgICAgICAgICAic3luZXJneVNjb3JlIjogMC4wLAogICAgICAgICAgICAgICAgICAgICJjbHVua2luZXNzU2NvcmUiOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgImF2Z1R1cm5DYXN0IjogTm9uZSwKICAgICAgICAgICAgICAgICAgICAiYXZnRGFtYWdlRGVhbHQiOiAwLjAsCiAgICAgICAgICAgICAgICAgICAgInRhZ3MiOiBfZ2V0X2NhcmRfdGFncyhjYXJkX21ldGEpLAogICAgICAgICAgICAgICAgfSkKCiAgICAjIOKUgOKUgCBJZGVudGlmeSB1bmRlci9vdmVyIHBlcmZvcm1lcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA' +
'4pSA4pSA4pSA4pSACgogICAgdW5kZXJwZXJmb3JtZXJzID0gW10KICAgIG92ZXJwZXJmb3JtZXJzID0gW10KCiAgICBpZiBhbnkoY1siaW1wYWN0U2NvcmUiXSAhPSAwIGZvciBjIGluIGNhcmRzKToKICAgICAgICAjIFdlIGhhdmUgcmVhbCBzaW0gZGF0YSDigJQgdXNlIGltcGFjdCBzY29yZXMKICAgICAgICBzb3J0ZWRfYnlfaW1wYWN0ID0gc29ydGVkKGNhcmRzLCBrZXk9bGFtYmRhIGM6IGNbImltcGFjdFNjb3JlIl0pCgogICAgICAgIGZvciBjIGluIHNvcnRlZF9ieV9pbXBhY3RbOk1BWF9VTkRFUlBFUkZPUk1FUlNdOgogICAgICAgICAgICBpZiBjWyJpbXBhY3RTY29yZSJdIDwgVU5ERVJQRVJGT1JNRVJfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgdW5kZXJwZXJmb3JtZXJzLmFwcGVuZChjWyJuYW1lIl0pCgogICAgICAgIGZvciBjIGluIHJldmVyc2VkKHNvcnRlZF9ieV9pbXBhY3RbLU1BWF9PVkVSUEVSRk9STUVSUzpdKToKICAgICAgICAgICAgaWYgY1siaW1wYWN0U2NvcmUiXSA+IDA6CiAgICAgICAgICAgICAgICBvdmVycGVyZm9ybWVycy5hcHBlbmQoY1sibmFtZSJdKQogICAgZWxpZiBjYXJkczoKICAgICAgICAjIE5vIHJlYWwgcGVyLWNhcmQgc3RhdHMgKERlZXBTZWVrIG9ubHkpIOKAlCBmbGFnIGNhcmRzIHdpdGgKICAgICAgICAjIGhpZ2hlc3QgbWFuYSBjb3N0IGFuZCBsZWFzdCBzeW5lcmd5IHBvdGVudGlhbCBhcyBjYW5kaWRhdGVzLgogICAgICAgICMgVGhpcyBnaXZlcyB0aGUgY29hY2ggU09NRVRISU5HIHRvIHdvcmsgd2l0aC4KICAgICAgICBsb2dnZXIuaW5mbygiTm8gcGVyLWNhcmQgc2ltIGRhdGEgZm9yICVzIOKAlCB1c2luZyBEQiBoZXVyaXN0aWNzIGZvciB1bmRlcnBlcmZvcm1lcnMiLCBkZWNrX25hbWUpCiAgICAgICAgaWYgZGVja19jYXJkc19tZXRhOgogICAgICAgICAgICAjIFNvcnQgbm9uLWxhbmQgY2FyZHMgYnkgQ01DIGRlc2NlbmRpbmcg4oCUIGhpZ2hlc3QgY29zdCBjYXJkcwogICAgICAgICAgICAjIGFyZSBtb3N0IGxpa2VseSB1bmRlcnBlcmZvcm1lcnMgaW4gYWdncmVzc2l2ZS9taWRyYW5nZSBkZWNrcwogICAgICAgICAgICBub25sYW5kID0gW2MgZm9yIGMgaW4gZGVja19jYXJkc19tZXRhIGlmICJsYW5kIiBub3QgaW4gKGMuZ2V0KCJ0eXBlX2xpbmUiLCAiIikgb3IgIiIpLmxvd2VyKCldCiAgICAgICAgICAgIGJ5X2NtYyA9IHNvcnRlZChub25sYW5kLCBrZXk9bGFtYmRhIGM6IGMuZ2V0KCJjbWMiLCAwKSBvciAwLCByZXZlcnNlPVRydWUpCiAgICAgICAgICAgIGZvciBjIGluIGJ5X2NtY1s6TUFYX1VOREVSUEVSRk9STUVSU106CiAgICAgICAgICAgICAgICBpZiAoYy5nZXQoImNtYyIsIDApIG9yIDApID49IDU6CiAgICAgICAgICAgICAgICAgICAgdW5kZXJwZXJmb3JtZXJzLmFwcGVuZChjWyJuYW1lIl0pCgogICAgIyDilIDilIAgQnVpbGQgZmluYWwgcmVwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHJldHVybiB7CiAgICAgICAgImRlY2tJZCI6IGRlY2tfbmFtZSwKICAgICAgICAiY29tbWFuZGVyIjogY29tbWFuZGVyLAogICAgICAgICJjb2xvcklkZW50aXR5IjogY29sb3JzLAogICAgICAgICJtZXRhIjogewogICAgICAgICAgICAiZ2FtZXNTaW11bGF0ZWQiOiB0b3RhbF9nYW1lcywKICAgICAgICAgICAgIm92ZXJhbGxXaW5SYXRlIjogcm91bmQob3ZlcmFsbF93aW5fcmF0ZSwgNCksCiAgICAgICAgICAgICJhdmdHYW1lTGVuZ3RoIjogcm91bmQoYXZnX2dhbWVfbGVuZ3RoLCAyKSwKICAgICAgICAgICAgInBlckFyY2hldHlwZVdpblJhdGVzIjoge30sCiAgICAgICAgfSwKICAgICAgICAibWF0Y2h1cHMiOiBtYXRjaHVwcywKICAgICAgICAic3RydWN0dXJlIjogc3RydWN0dXJlLAogICAgICAgICJjYXJkcyI6IGNhcmRzLAogICAgICAgICJ1bmRlcnBlcmZvcm1lcnMiOiB1bmRlcnBlcmZvcm1lcnMsCiAgICAgICAgIm92ZXJwZXJmb3JtZXJzIjogb3ZlcnBlcmZvcm1lcnMsCiAgICAgICAgImtub3duQ29tYm9zIjogW10sCiAgICAgICAgImxhc3RVcGRhdGVkIjogZGF0ZXRpbWUubm93KHRpbWV6b25lLnV0YykuaXNvZm9ybWF0KCksCiAgICB9CgoKZGVmIF9nZXRfY2FyZF90YWdzKGNhcmRfbWV0YTogZGljdCkgLT4gTGlzdFtzdHJdOgogICAgIiIiRGVyaXZlIGZ1bmN0aW9uYWwgdGFncyBmcm9tIGNhcmQgbWV0YWRhdGEu' +
'IiIiCiAgICB0YWdzID0gW10KICAgIHR5cGVfbGluZSA9IChjYXJkX21ldGEuZ2V0KCJ0eXBlX2xpbmUiLCAiIikgb3IgIiIpLmxvd2VyKCkKICAgIG9yYWNsZSA9IChjYXJkX21ldGEuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSBvciAiIikubG93ZXIoKQogICAga2V5d29yZHMgPSAoY2FyZF9tZXRhLmdldCgia2V5d29yZHMiLCAiIikgb3IgIiIpLmxvd2VyKCkKCiAgICByb2xlID0gX2NsYXNzaWZ5X3JvbGUob3JhY2xlLCBrZXl3b3JkcywgdHlwZV9saW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgIF9wcmltYXJ5X3R5cGUodHlwZV9saW5lKSkKICAgIGlmIHJvbGU6CiAgICAgICAgdGFncy5hcHBlbmQocm9sZSkKCiAgICBpZiAiY3JlYXR1cmUiIGluIHR5cGVfbGluZToKICAgICAgICB0YWdzLmFwcGVuZCgiY3JlYXR1cmUiKQogICAgaWYgImxlZ2VuZGFyeSIgaW4gdHlwZV9saW5lOgogICAgICAgIHRhZ3MuYXBwZW5kKCJsZWdlbmRhcnkiKQoKICAgIHJldHVybiB0YWdzCgoKZGVmIF9wcmltYXJ5X3R5cGUodHlwZV9saW5lOiBzdHIpIC0+IHN0cjoKICAgICIiIkdldCBwcmltYXJ5IGNhcmQgdHlwZSBmcm9tIHR5cGUgbGluZS4iIiIKICAgIHRsID0gdHlwZV9saW5lLmxvd2VyKCkKICAgIGlmICJsYW5kIiBpbiB0bDoKICAgICAgICByZXR1cm4gIkxhbmQiCiAgICBlbGlmICJjcmVhdHVyZSIgaW4gdGw6CiAgICAgICAgcmV0dXJuICJDcmVhdHVyZSIKICAgIGVsaWYgImluc3RhbnQiIGluIHRsOgogICAgICAgIHJldHVybiAiSW5zdGFudCIKICAgIGVsaWYgInNvcmNlcnkiIGluIHRsOgogICAgICAgIHJldHVybiAiU29yY2VyeSIKICAgIGVsaWYgImFydGlmYWN0IiBpbiB0bDoKICAgICAgICByZXR1cm4gIkFydGlmYWN0IgogICAgZWxpZiAiZW5jaGFudG1lbnQiIGluIHRsOgogICAgICAgIHJldHVybiAiRW5jaGFudG1lbnQiCiAgICBlbGlmICJwbGFuZXN3YWxrZXIiIGluIHRsOgogICAgICAgIHJldHVybiAiUGxhbmVzd2Fsa2VyIgogICAgcmV0dXJuICJPdGhlciIK'
Install-B64 -R 'coach\report_generator.py' -B $b
# coach/schemas/__init__.py (53 bytes)
$b = 'IyBDb2FjaCBzY2hlbWFzIOKAlCBEZWNrIGdlbmVyYXRpb24gYW5kIHN1YnN0aXR1dGlvbgo='
Install-B64 -R 'coach\schemas\__init__.py' -B $b
# coach/schemas/deck_schema.py (7,322 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgR2VuZXJhdGlvbiBKU09OIFNjaGVtYXMK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQClB5ZGFudGljIG1vZGVscyBhbmQgSlNPTiBTY2hlbWEgZGljdHMgZm9yIFBlcnBsZXhpdHkKc3RydWN0dXJlZCBvdXRwdXQgZGVjayBnZW5lcmF0aW9uLgoiIiIKCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBPcHRpb25hbApmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwsIEZpZWxkCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBQeWRhbnRpYyBNb2RlbHMgKGZvciB2YWxpZGF0aW9uICYgdHlwZSBjaGVja2luZykKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmNsYXNzIERlY2tDYXJkKEJhc2VNb2RlbCk6CiAgICAiIiJBIHNpbmdsZSBjYXJkIGluIGEgZ2VuZXJhdGVkIGRlY2suIiIiCiAgICBuYW1lOiBzdHIgPSBGaWVsZChkZXNjcmlwdGlvbj0iRXhhY3QgY2FyZCBuYW1lIGFzIHByaW50ZWQiKQogICAgY291bnQ6IGludCA9IEZpZWxkKGRlZmF1bHQ9MSwgZGVzY3JpcHRpb249Ik51bWJlciBvZiBjb3BpZXMgKDEgZm9yIGFsbCBleGNlcHQgYmFzaWMgbGFuZHMpIikKICAgIGNhdGVnb3J5OiBzdHIgPSBGaWVsZChkZXNjcmlwdGlvbj0iQ2FyZCBjYXRlZ29yeTogQ3JlYXR1cmUsIEluc3RhbnQsIFNvcmNlcnksIEFydGlmYWN0LCBFbmNoYW50bWVudCwgUGxhbmVzd2Fsa2VyLCBMYW5kLCBCYXR0bGUiKQogICAgcm9sZV90YWdzOiBMaXN0W3N0cl0gPSBGaWVsZCgKICAgICAgICBkZWZhdWx0X2ZhY3Rvcnk9bGlzdCwKICAgICAgICBkZXNjcmlwdGlvbj0iRnVuY3Rpb25hbCByb2xlczogcmFtcCwgY2FyZF9kcmF3LCByZW1vdmFsLCBib2FyZF93aXBlLCBwcm90ZWN0aW9uLCBmaW5pc2hlciwgY29tYm9fcGllY2UsIHV0aWxpdHksIGxvcmQsIHNhY19vdXRsZXQsIHRva2VuX2dlbmVyYXRvciwgcmVjdXJzaW9uLCB0dXRvciwgY291bnRlciwgbGlmZWdhaW4sIGdyYXZleWFyZF9oYXRlLCBtYW5hX3JvY2ssIG1hbmFfZG9yaywgYW50aGVtIgogICAgKQogICAgcmVhc29uOiBzdHIgPSBGaWVsZChkZWZhdWx0PSIiLCBkZXNjcmlwdGlvbj0iQnJpZWYgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgY2FyZCBpcyBpbmNsdWRlZCIpCiAgICBlc3RpbWF0ZWRfcHJpY2VfdXNkOiBmbG9hdCA9IEZpZWxkKGRlZmF1bHQ9MC4wLCBkZXNjcmlwdGlvbj0iRXN0aW1hdGVkIFRDRyBtYXJrZXQgcHJpY2UgaW4gVVNEIikKICAgIHN5bmVyZ3lfd2l0aDogTGlzdFtzdHJdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QsIGRlc2NyaXB0aW9uPSJOYW1lcyBvZiBvdGhlciBjYXJkcyBpbiB0aGUgZGVjayB0aGlzIHN5bmVyZ2l6ZXMgd2l0aCIpCgoKY2xhc3MgQnJhY2tldEluZm8oQmFzZU1vZGVsKToKICAgICIiIkNvbW1hbmRlciBicmFja2V0IGNsYXNzaWZpY2F0aW9uICgxLTQgcGVyIFJ1bGVzIENvbW1pdHRlZSkuIiIiCiAgICBsZXZlbDogaW50ID0gRmllbGQoZ2U9MSwgbGU9NCwgZGVzY3JpcHRpb249IkJyYWNrZXQgbGV2ZWwgMS00IikKICAgIHJlYXNvbmluZzogc3RyID0gRmllbGQoZGVzY3JpcHRpb249IldoeSB0aGlzIGJyYWNrZXQgd2FzIGFzc2lnbmVkIikKICAgIGdhbWVfY2hhbmdlcnM6IExpc3Rbc3RyXSA9IEZpZWxkKAogICAgICAgIGRlZmF1bHRfZmFjdG9yeT1saXN0LAogICAgICAgIGRlc2NyaXB0aW9uPSJDYXJkcyB0aGF0IGNvdW50IGFzICdHYW1lIENoYW5nZXJzJyBmb3IgYnJhY2tldCBjbGFzc2lmaWNhdGlvbiIKICAgICkKCgpjbGFzcyBEZWNrUmVhc29uaW5nKEJhc2VNb2RlbCk6CiAgICAiIiJTdHJhdGVn' +
'aWMgcmVhc29uaW5nIGJlaGluZCBkZWNrIGNvbnN0cnVjdGlvbi4iIiIKICAgIHN0cmF0ZWd5OiBzdHIgPSBGaWVsZChkZXNjcmlwdGlvbj0iQ29yZSBnYW1lIHBsYW4gYW5kIHdpbiBjb25kaXRpb25zIikKICAgIG1hbmFfY3VydmU6IHN0ciA9IEZpZWxkKGRlc2NyaXB0aW9uPSJIb3cgdGhlIG1hbmEgY3VydmUgd2FzIGRlc2lnbmVkIikKICAgIGtleV9zeW5lcmdpZXM6IHN0ciA9IEZpZWxkKGRlc2NyaXB0aW9uPSJNb3N0IGltcG9ydGFudCBjYXJkIGludGVyYWN0aW9ucyIpCiAgICBidWRnZXRfbm90ZXM6IHN0ciA9IEZpZWxkKGRlZmF1bHQ9IiIsIGRlc2NyaXB0aW9uPSJIb3cgYnVkZ2V0IGNvbnN0cmFpbnRzIHdlcmUgbWFuYWdlZCIpCiAgICBicmFja2V0X2NvbXBsaWFuY2U6IHN0ciA9IEZpZWxkKGRlZmF1bHQ9IiIsIGRlc2NyaXB0aW9uPSJIb3cgYnJhY2tldCBydWxlcyB3ZXJlIHJlc3BlY3RlZCIpCgoKY2xhc3MgR2VuZXJhdGVkRGVja0xpc3QoQmFzZU1vZGVsKToKICAgICIiIkNvbXBsZXRlIGdlbmVyYXRlZCBkZWNrIG91dHB1dCBmcm9tIFBlcnBsZXhpdHkuIiIiCiAgICBjb21tYW5kZXI6IHN0ciA9IEZpZWxkKGRlc2NyaXB0aW9uPSJDb21tYW5kZXIgY2FyZCBuYW1lIikKICAgIHN0cmF0ZWd5X3N1bW1hcnk6IHN0ciA9IEZpZWxkKGRlc2NyaXB0aW9uPSIxLTIgc2VudGVuY2Ugc3RyYXRlZ3kgb3ZlcnZpZXciKQogICAgYnJhY2tldDogQnJhY2tldEluZm8KICAgIGFyY2hldHlwZTogc3RyID0gRmllbGQoZGVzY3JpcHRpb249IlByaW1hcnkgYXJjaGV0eXBlOiBhZ2dybywgbWlkcmFuZ2UsIGNvbnRyb2wsIGNvbWJvLCBzdGF4LCB2b2x0cm9uLCBhcmlzdG9jcmF0cywgc3BlbGxzbGluZ2VyLCB0b2tlbnMsIHRyaWJhbCwgZ3JvdXBfaHVnLCBsYW5kcywgcmVhbmltYXRvciIpCiAgICBjYXJkczogTGlzdFtEZWNrQ2FyZF0gPSBGaWVsZChkZXNjcmlwdGlvbj0iQ29tcGxldGUgY2FyZCBsaXN0IChjb21tYW5kZXIgKyA5OSkiKQogICAgcmVhc29uaW5nOiBEZWNrUmVhc29uaW5nCiAgICBlc3RpbWF0ZWRfdG90YWxfdXNkOiBmbG9hdCA9IEZpZWxkKGRlZmF1bHQ9MC4wLCBkZXNjcmlwdGlvbj0iRXN0aW1hdGVkIHRvdGFsIGRlY2sgY29zdCIpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBKU09OIFNjaGVtYSBkaWN0cyAoZm9yIFBlcnBsZXhpdHkgcmVzcG9uc2VfZm9ybWF0KQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKREVDS19DQVJEX1NDSEVNQSA9IHsKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAibmFtZSI6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAiRXhhY3QgY2FyZCBuYW1lIGFzIHByaW50ZWQifSwKICAgICAgICAiY291bnQiOiB7InR5cGUiOiAiaW50ZWdlciIsICJkZXNjcmlwdGlvbiI6ICJOdW1iZXIgb2YgY29waWVzICgxIGZvciBhbGwgZXhjZXB0IGJhc2ljIGxhbmRzKSJ9LAogICAgICAgICJjYXRlZ29yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNhcmQgY2F0ZWdvcnkiLAogICAgICAgICAgICAiZW51bSI6IFsiQ3JlYXR1cmUiLCAiSW5zdGFudCIsICJTb3JjZXJ5IiwgIkFydGlmYWN0IiwgIkVuY2hhbnRtZW50IiwgIlBsYW5lc3dhbGtlciIsICJMYW5kIiwgIkJhdHRsZSJdLAogICAgICAgIH0sCiAgICAgICAgInJvbGVfdGFncyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7InR5cGUiOiAic3RyaW5nIn0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJGdW5jdGlvbmFsIHJvbGVzOiByYW1wLCBjYXJkX2RyYXcsIHJlbW92YWwsIGJvYXJkX3dpcGUsIHByb3RlY3Rpb24sIGZpbmlzaGVyLCBjb21ib19waWVjZSwgdXRpbGl0eSwgbG9yZCwgc2FjX291' +
'dGxldCwgdG9rZW5fZ2VuZXJhdG9yLCByZWN1cnNpb24sIHR1dG9yLCBjb3VudGVyLCBsaWZlZ2FpbiwgZ3JhdmV5YXJkX2hhdGUsIG1hbmFfcm9jaywgbWFuYV9kb3JrLCBhbnRoZW0iLAogICAgICAgIH0sCiAgICAgICAgInJlYXNvbiI6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAiQnJpZWYgZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgY2FyZCBpcyBpbmNsdWRlZCJ9LAogICAgICAgICJlc3RpbWF0ZWRfcHJpY2VfdXNkIjogeyJ0eXBlIjogIm51bWJlciIsICJkZXNjcmlwdGlvbiI6ICJFc3RpbWF0ZWQgVENHIG1hcmtldCBwcmljZSBpbiBVU0QifSwKICAgICAgICAic3luZXJneV93aXRoIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsidHlwZSI6ICJzdHJpbmcifSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5hbWVzIG9mIG90aGVyIGNhcmRzIHRoaXMgc3luZXJnaXplcyB3aXRoIiwKICAgICAgICB9LAogICAgfSwKICAgICJyZXF1aXJlZCI6IFsibmFtZSIsICJjb3VudCIsICJjYXRlZ29yeSIsICJyb2xlX3RhZ3MiLCAicmVhc29uIl0sCiAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKfQoKQlJBQ0tFVF9TQ0hFTUEgPSB7CiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgImxldmVsIjogeyJ0eXBlIjogImludGVnZXIiLCAiZGVzY3JpcHRpb24iOiAiQnJhY2tldCBsZXZlbCAxLTQifSwKICAgICAgICAicmVhc29uaW5nIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJXaHkgdGhpcyBicmFja2V0IHdhcyBhc3NpZ25lZCJ9LAogICAgICAgICJnYW1lX2NoYW5nZXJzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsidHlwZSI6ICJzdHJpbmcifSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNhcmRzIHRoYXQgYXJlIEdhbWUgQ2hhbmdlcnMgZm9yIGJyYWNrZXQgY2xhc3NpZmljYXRpb24iLAogICAgICAgIH0sCiAgICB9LAogICAgInJlcXVpcmVkIjogWyJsZXZlbCIsICJyZWFzb25pbmciLCAiZ2FtZV9jaGFuZ2VycyJdLAogICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UsCn0KCkRFQ0tfUkVBU09OSU5HX1NDSEVNQSA9IHsKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAic3RyYXRlZ3kiOiB7InR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIkNvcmUgZ2FtZSBwbGFuIGFuZCB3aW4gY29uZGl0aW9ucyJ9LAogICAgICAgICJtYW5hX2N1cnZlIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJIb3cgdGhlIG1hbmEgY3VydmUgd2FzIGRlc2lnbmVkIn0sCiAgICAgICAgImtleV9zeW5lcmdpZXMiOiB7InR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIk1vc3QgaW1wb3J0YW50IGNhcmQgaW50ZXJhY3Rpb25zIn0sCiAgICAgICAgImJ1ZGdldF9ub3RlcyI6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAiSG93IGJ1ZGdldCBjb25zdHJhaW50cyB3ZXJlIG1hbmFnZWQifSwKICAgICAgICAiYnJhY2tldF9jb21wbGlhbmNlIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJIb3cgYnJhY2tldCBydWxlcyB3ZXJlIHJlc3BlY3RlZCJ9LAogICAgfSwKICAgICJyZXF1aXJlZCI6IFsic3RyYXRlZ3kiLCAibWFuYV9jdXJ2ZSIsICJrZXlfc3luZXJnaWVzIl0sCiAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKfQoKREVDS19MSVNUX1NDSEVNQSA9IHsKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAiY29tbWFuZGVyIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJDb21tYW5kZXIgY2FyZCBuYW1lIn0sCiAgICAgICAgInN0cmF0ZWd5X3N1bW1hcnkiOiB7InR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIjEtMiBzZW50ZW5jZSBzdHJhdGVneSBvdmVydmlldyJ9LAogICAgICAgICJicmFja2V0IjogQlJBQ0tFVF9TQ0hFTUEsCiAgICAgICAgImFyY2hldHlwZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlByaW1hcnkgYXJjaGV0eXBlIiwKICAgICAgICAgICAgImVudW0iOiBbImFnZ3JvIiwgIm1pZHJhbmdlIiwgImNvbnRyb2wiLCAiY29tYm8iLCAic3RheCIsICJ2b2x0cm9uIiwgImFy' +
'aXN0b2NyYXRzIiwgInNwZWxsc2xpbmdlciIsICJ0b2tlbnMiLCAidHJpYmFsIiwgImdyb3VwX2h1ZyIsICJsYW5kcyIsICJyZWFuaW1hdG9yIiwgIm90aGVyIl0sCiAgICAgICAgfSwKICAgICAgICAiY2FyZHMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogREVDS19DQVJEX1NDSEVNQSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbXBsZXRlIGNhcmQgbGlzdCAoY29tbWFuZGVyICsgOTkpIiwKICAgICAgICB9LAogICAgICAgICJyZWFzb25pbmciOiBERUNLX1JFQVNPTklOR19TQ0hFTUEsCiAgICAgICAgImVzdGltYXRlZF90b3RhbF91c2QiOiB7InR5cGUiOiAibnVtYmVyIiwgImRlc2NyaXB0aW9uIjogIkVzdGltYXRlZCB0b3RhbCBkZWNrIGNvc3QifSwKICAgIH0sCiAgICAicmVxdWlyZWQiOiBbImNvbW1hbmRlciIsICJzdHJhdGVneV9zdW1tYXJ5IiwgImJyYWNrZXQiLCAiYXJjaGV0eXBlIiwgImNhcmRzIiwgInJlYXNvbmluZyIsICJlc3RpbWF0ZWRfdG90YWxfdXNkIl0sCiAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKfQo='
Install-B64 -R 'coach\schemas\deck_schema.py' -B $b
# coach/schemas/substitution_schema.py (4,104 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFN1YnN0aXR1dGlvbiBTY2hlbWFzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApQeWRhbnRpYyBtb2RlbHMgYW5kIEpTT04gU2NoZW1hIGRpY3RzIGZvciB0aGUKU21hcnQgU3Vic3RpdHV0aW9uIEVuZ2luZSBvdXRwdXQuCiIiIgoKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIE9wdGlvbmFsCmZyb20gcHlkYW50aWMgaW1wb3J0IEJhc2VNb2RlbCwgRmllbGQKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFB5ZGFudGljIE1vZGVscwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKY2xhc3MgQ2FyZEFsdGVybmF0aXZlKEJhc2VNb2RlbCk6CiAgICAiIiJBIHNpbmdsZSBzdWJzdGl0dXRlIGNhcmQgc3VnZ2VzdGlvbi4iIiIKICAgIG5hbWU6IHN0ciA9IEZpZWxkKGRlc2NyaXB0aW9uPSJFeGFjdCBjYXJkIG5hbWUiKQogICAgc2ltaWxhcml0eV9zY29yZTogZmxvYXQgPSBGaWVsZChkZWZhdWx0PTAuMCwgZGVzY3JpcHRpb249IkNvc2luZSBzaW1pbGFyaXR5IHNjb3JlICgwLTEpIikKICAgIHJlYXNvbjogc3RyID0gRmllbGQoZGVmYXVsdD0iIiwgZGVzY3JpcHRpb249IldoeSB0aGlzIGNhcmQgaXMgYSBnb29kIHN1YnN0aXR1dGUiKQogICAgc291cmNlOiBzdHIgPSBGaWVsZChkZWZhdWx0PSJlbWJlZGRpbmciLCBkZXNjcmlwdGlvbj0iSG93IGl0IHdhcyBmb3VuZDogJ2VtYmVkZGluZycgb3IgJ3BlcnBsZXhpdHknIikKICAgIHJvbGVfb3ZlcmxhcDogTGlzdFtzdHJdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QsIGRlc2NyaXB0aW9uPSJTaGFyZWQgZnVuY3Rpb25hbCByb2xlcyIpCiAgICBjbWNfZGVsdGE6IGZsb2F0ID0gRmllbGQoZGVmYXVsdD0wLjAsIGRlc2NyaXB0aW9uPSJDTUMgZGlmZmVyZW5jZSBmcm9tIG9yaWdpbmFsIikKCgpjbGFzcyBEZWNrQ2FyZFdpdGhTdGF0dXMoQmFzZU1vZGVsKToKICAgICIiIkEgZGVjayBjYXJkIGVucmljaGVkIHdpdGggb3duZXJzaGlwIGFuZCBzdWJzdGl0dXRpb24gZGF0YS4iIiIKICAgIG5hbWU6IHN0cgogICAgY291bnQ6IGludCA9IDEKICAgIGNhdGVnb3J5OiBzdHIgPSAiIgogICAgcm9sZV90YWdzOiBMaXN0W3N0cl0gPSBGaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIHJlYXNvbjogc3RyID0gIiIKICAgIGVzdGltYXRlZF9wcmljZV91c2Q6IGZsb2F0ID0gMC4wCiAgICBzeW5lcmd5X3dpdGg6IExpc3Rbc3RyXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQoKICAgICMgT3duZXJzaGlwICYgc3Vic3RpdHV0aW9uCiAgICBvd25lZDogYm9vbCA9IFRydWUKICAgIG93bmVkX3F0eTogaW50ID0gMAogICAgc2NyeWZhbGxfaWQ6IHN0ciA9ICIiCiAgICBzdGF0dXM6IHN0ciA9IEZpZWxkKGRlZmF1bHQ9Im93bmVkIiwgZGVzY3JpcHRpb249Im93bmVkIHwgc3Vic3RpdHV0ZWQgfCBtaXNzaW5nIikKICAgIG9yaWdpbmFsX2NhcmQ6IE9wdGlvbmFsW3N0cl0gPSBGaWVsZChkZWZhdWx0PU5vbmUsIGRlc2NyaXB0aW9uPSJPcmlnaW5hbCBjYXJkIG5hbWUgaWYgdGhpcyBpcyBhIHN1YnN0aXR1dGlvbiIpCiAgICBhbHRlcm5hdGl2ZXM6IExpc3RbQ2FyZEFsdGVybmF0aXZlXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgc2VsZWN0ZWRfc3Vic3RpdHV0ZTogT3B0aW9uYWxbc3RyXSA9IEZpZWxkKGRlZmF1bHQ9Tm9uZSwgZGVzY3JpcHRpb249IlVzZXItc2VsZWN0ZWQgc3Vic3RpdHV0ZSBuYW1lIikKCgpjbGFzcyBTdWJzdGl0dXRpb25SZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICAiIiJSZXF1ZXN0IGZvciBzdWJzdGl0dXRpb24gb24gYSBzaW5nbGUgY2FyZC4iIiIKICAgIGNhcmRfbmFtZTog' +
'c3RyCiAgICByb2xlX3RhZ3M6IExpc3Rbc3RyXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgY2F0ZWdvcnk6IHN0ciA9ICIiCiAgICBjbWM6IGZsb2F0ID0gMC4wCiAgICBjb2xvcl9pZGVudGl0eTogTGlzdFtzdHJdID0gRmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCgoKY2xhc3MgU3Vic3RpdHV0aW9uQmF0Y2hSZXN1bHQoQmFzZU1vZGVsKToKICAgICIiIlJlc3VsdCBvZiBhIGJhdGNoIHN1YnN0aXR1dGlvbiBwYXNzLiIiIgogICAgdG90YWxfY2FyZHM6IGludCA9IDAKICAgIG93bmVkX2NvdW50OiBpbnQgPSAwCiAgICBzdWJzdGl0dXRlZF9jb3VudDogaW50ID0gMAogICAgbWlzc2luZ19jb3VudDogaW50ID0gMAogICAgY2FyZHM6IExpc3RbRGVja0NhcmRXaXRoU3RhdHVzXSA9IEZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgSlNPTiBTY2hlbWEgZGljdHMgKGZvciBQZXJwbGV4aXR5IGZhbGxiYWNrIHN1YnN0aXR1dGlvbikKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKClNVQlNUSVRVVElPTl9SRVNQT05TRV9TQ0hFTUEgPSB7CiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgInN1YnN0aXR1dGlvbnMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJvcmlnaW5hbCI6IHsidHlwZSI6ICJzdHJpbmciLCAiZGVzY3JpcHRpb24iOiAiQ2FyZCB0aGF0IG5lZWRzIHJlcGxhY2luZyJ9LAogICAgICAgICAgICAgICAgICAgICJzdWJzdGl0dXRlIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJSZWNvbW1lbmRlZCByZXBsYWNlbWVudCBmcm9tIHRoZSBhbGxvd2VkIGxpc3QifSwKICAgICAgICAgICAgICAgICAgICAicmVhc29uIjogeyJ0eXBlIjogInN0cmluZyIsICJkZXNjcmlwdGlvbiI6ICJXaHkgdGhpcyBzdWJzdGl0dXRlIHdvcmtzIn0sCiAgICAgICAgICAgICAgICAgICAgInJvbGVfb3ZlcmxhcCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7InR5cGUiOiAic3RyaW5nIn0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaGFyZWQgZnVuY3Rpb25hbCByb2xlcyIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm9yaWdpbmFsIiwgInN1YnN0aXR1dGUiLCAicmVhc29uIl0sCiAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBGYWxzZSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKICAgICJyZXF1aXJlZCI6IFsic3Vic3RpdHV0aW9ucyJdLAogICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogRmFsc2UsCn0K'
Install-B64 -R 'coach\schemas\substitution_schema.py' -B $b
# coach/services/__init__.py (39 bytes)
$b = 'IyBDb2FjaCBzZXJ2aWNlcyDigJQgRGVjayBnZW5lcmF0b3IgVjMK'
Install-B64 -R 'coach\services\__init__.py' -B $b
# coach/services/deck_generator.py (21,925 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFYzIERlY2sgR2VuZXJhdG9yIFNlcnZpY2UK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCkdlbmVyYXRlcyBDb21tYW5kZXIgZGVja3MgdXNpbmcgUGVycGxleGl0eSBTb25hcgpzdHJ1Y3R1cmVkIEpTT04gb3V0cHV0LCB0aGVuIHJ1bnMgb3duZXJzaGlwIGNoZWNrCmFuZCBzbWFydCBzdWJzdGl0dXRpb24uCiIiIgoKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCmltcG9ydCBzcWxpdGUzCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBPcHRpb25hbCwgVHVwbGUKZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbiwgUmVxdWVzdAoKZnJvbSAuLmNsaWVudHMucGVycGxleGl0eV9jbGllbnQgaW1wb3J0IFBlcnBsZXhpdHlDbGllbnQKZnJvbSAuLnNjaGVtYXMuZGVja19zY2hlbWEgaW1wb3J0IERFQ0tfTElTVF9TQ0hFTUEsIEdlbmVyYXRlZERlY2tMaXN0CmZyb20gLi5zY2hlbWFzLnN1YnN0aXR1dGlvbl9zY2hlbWEgaW1wb3J0ICgKICAgIENhcmRBbHRlcm5hdGl2ZSwgRGVja0NhcmRXaXRoU3RhdHVzLCBTdWJzdGl0dXRpb25CYXRjaFJlc3VsdCwKKQpmcm9tIC4ucHJvbXB0cy5kZWNrX2dlbl9zeXN0ZW0gaW1wb3J0IFNZU1RFTV9QUk9NUFQKZnJvbSAuLnByb21wdHMuZGVja19nZW5fdXNlciBpbXBvcnQgYnVpbGRfdXNlcl9wcm9tcHQKZnJvbSAuLnByb21wdHMuc3Vic3RpdHV0aW9uX3Byb21wdCBpbXBvcnQgKAogICAgU1VCU1RJVFVUSU9OX1NZU1RFTSwgYnVpbGRfc3Vic3RpdHV0aW9uX3Byb21wdCwKKQpmcm9tIC4uY29uZmlnIGltcG9ydCAoCiAgICBERUNLX0dFTl9NT0RFTCwgREVDS19HRU5fVEVNUEVSQVRVUkUsIERFQ0tfR0VOX01BWF9UT0tFTlMsCiAgICBTVUJTVElUVVRJT05fTUlOX1NJTUlMQVJJVFksIFNVQlNUSVRVVElPTl9NQVhfQUxURVJOQVRJVkVTLAogICAgU1VCU1RJVFVUSU9OX01PREVMLCBTVUJTVElUVVRJT05fVVNFX1BQTFhfRkFMTEJBQ0ssCikKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb2FjaC5kZWNrZ2VuIikKCgpjbGFzcyBEZWNrR2VuZXJhdG9yVjM6CiAgICAiIiIKICAgIFYzIERlY2sgR2VuZXJhdG9yIHVzaW5nIFBlcnBsZXhpdHkgc3RydWN0dXJlZCBvdXRwdXQuCgogICAgUGlwZWxpbmU6CiAgICAgIDEuIFJlc29sdmUgY29tbWFuZGVyIHZpYSBTY3J5ZmFsbAogICAgICAyLiBCdWlsZCBjb2xsZWN0aW9uIHN1bW1hcnkKICAgICAgMy4gQ2FsbCBQZXJwbGV4aXR5IHdpdGggc3RydWN0dXJlZCBKU09OIHNjaGVtYQogICAgICA0LiBWYWxpZGF0ZSBjYXJkIG5hbWVzIHZpYSBTY3J5ZmFsbAogICAgICA1LiBDaGVjayBvd25lcnNoaXAgYWdhaW5zdCBjb2xsZWN0aW9uIERCCiAgICAgIDYuIFJ1biBTbWFydCBTdWJzdGl0dXRpb24gKGVtYmVkZGluZyArIFBlcnBsZXhpdHkgZmFsbGJhY2spCiAgICAgIDcuIFJldHVybiBmaW5hbGl6ZWQgZGVjayB3aXRoIHN1YnN0aXR1dGlvbiBkYXRhCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHBseF9jbGllbnQ6IFBlcnBsZXhpdHlDbGllbnQsIGRiX2Nvbm5fZmFjdG9yeSwKICAgICAgICAgICAgICAgICBlbWJlZGRpbmdfaW5kZXg9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcHBseF9jbGllbnQ6IENvbmZpZ3VyZWQgUGVycGxleGl0eUNsaWVudCBpbnN0YW5jZQogICAgICAgICAgICBkYl9jb25uX2ZhY3Rvcnk6IENhbGxhYmxlIHRoYXQgcmV0dXJucyBzcWxpdGUzLkNvbm5lY3Rpb24KICAgICAgICAgICAgZW1iZWRkaW5nX2luZGV4OiBPcHRpb25hbCBNVEdFbWJlZGRpbmdJbmRleCBmb3Igc3Vic3RpdHV0aW9uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wcGx4ID0gcHBseF9jbGllbnQKICAgICAgICBzZWxmLmRiX2Nvbm5fZmFjdG9yeSA9IGRiX2Nvbm5fZmFjdG9yeQogICAgICAgIHNlbGYuZW1iZWRkaW5nX2luZGV4ID0gZW1iZWRkaW5nX2luZGV4CgogICAgIyDilIDilIAgU3RlcCAxOiBSZXNvbHZlIENvbW1hbmRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGRlZiByZXNvbHZlX2NvbW1hbmRlcihzZWxmLCBjb21tYW5kZXJfbmFt' +
'ZTogc3RyKSAtPiBkaWN0OgogICAgICAgICIiIkxvb2sgdXAgY29tbWFuZGVyIG9uIFNjcnlmYWxsIHRvIGdldCBjYW5vbmljYWwgbmFtZSwgY29sb3IgaWRlbnRpdHksIHR5cGUuIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlbmNvZGVkID0gY29tbWFuZGVyX25hbWUucmVwbGFjZSgiICIsICIrIikKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZnV6enk9e2VuY29kZWR9IgogICAgICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCkKICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoIlVzZXItQWdlbnQiLCAiQ29tbWFuZGVyQUlMYWIvMy4wIikKICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoIkFjY2VwdCIsICJhcHBsaWNhdGlvbi9qc29uIikKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgIm5hbWUiOiBkYXRhLmdldCgibmFtZSIsIGNvbW1hbmRlcl9uYW1lKSwKICAgICAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IGRhdGEuZ2V0KCJpZCIsICIiKSwKICAgICAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGRhdGEuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKSwKICAgICAgICAgICAgICAgICJ0eXBlX2xpbmUiOiBkYXRhLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6IGRhdGEuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogZGF0YS5nZXQoImltYWdlX3VyaXMiLCB7fSkuZ2V0KCJub3JtYWwiLCAiIiksCiAgICAgICAgICAgICAgICAib3JhY2xlX3RleHQiOiBkYXRhLmdldCgib3JhY2xlX3RleHQiLCAiIiksCiAgICAgICAgICAgIH0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJTY3J5ZmFsbCBsb29rdXAgZmFpbGVkIGZvciAnJXMnOiAlcyIsIGNvbW1hbmRlcl9uYW1lLCBlKQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgIm5hbWUiOiBjb21tYW5kZXJfbmFtZSwKICAgICAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6ICIiLAogICAgICAgICAgICAgICAgImNvbG9yX2lkZW50aXR5IjogW10sCiAgICAgICAgICAgICAgICAidHlwZV9saW5lIjogIiIsCiAgICAgICAgICAgICAgICAibWFuYV9jb3N0IjogIiIsCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogIiIsCiAgICAgICAgICAgICAgICAib3JhY2xlX3RleHQiOiAiIiwKICAgICAgICAgICAgfQoKICAgICMg4pSA4pSAIFN0ZXAgMjogQnVpbGQgQ29sbGVjdGlvbiBTdW1tYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgZGVmIGJ1aWxkX2NvbGxlY3Rpb25fc3VtbWFyeShzZWxmLCBjb2xvcl9pZGVudGl0eTogTGlzdFtzdHJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3Blcl9ncm91cDogaW50ID0gMjApIC0+IHN0cjoKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIHRleHQgc3VtbWFyeSBvZiBvd25lZCBjYXJkcyBtYXRjaGluZyB0aGUgZGVjaydzIGNvbG9yIGlkZW50aXR5LgogICAgICAgIEdyb3VwcyBieSBjYXJkIHR5cGUgZm9yIHRoZSBMTE0gcHJvbXB0LgogICAgICAgICIiIgogICAgICAgIGNvbm4gPSBzZWxmLmRiX2Nvbm5fZmFjdG9yeSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBuYW1lLCB0eXBlX2xpbmUsIGNtYywgb3JhY2xlX3RleHQsIHF1YW50aXR5LCB0Y2dfcHJpY2UgIgogICAgICAgICAgICAgICAgIkZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHF1YW50aXR5ID4gMCIKICAgICAgICAgICAgKS5mZXRjaGFsbCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygiRmFpbGVkIHRvIGxvYWQgY29sbGVjdGlvbjogJXMiLCBlKQogICAgICAgICAgICByZXR1cm4gIiIKCiAgICAgICAgaWYgbm90IHJvd3M6CiAgICAgICAgICAgIHJldHVybiAiIgoKICAgICAgICAjIEZpbHRlciBieSBjb2xvciBpZGVudGl0eQogICAgICAgIGNpX3NldCA9IHNldChjb2xvcl9pZGVudGl0eSkgaWYgY29sb3JfaWRlbnRpdHkg' +
'ZWxzZSBOb25lCiAgICAgICAgZmlsdGVyZWQgPSBbXQogICAgICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICAgICAgbmFtZSA9IHJvd1sibmFtZSJdCiAgICAgICAgICAgIHR5cGVfbGluZSA9IHJvd1sidHlwZV9saW5lIl0gb3IgIiIKICAgICAgICAgICAgIyBCYXNpYyBsYW5kcyBhbmQgY29sb3JsZXNzIGFyZSBhbHdheXMgYWxsb3dlZAogICAgICAgICAgICBpZiBjaV9zZXQ6CiAgICAgICAgICAgICAgICAjIFNpbXBsZSBjb2xvciBjaGVjayBmcm9tIHR5cGVfbGluZSBhbmQgbmFtZQogICAgICAgICAgICAgICAgIyBGb3IgcHJvcGVyIGZpbHRlcmluZyB3ZSdkIGNoZWNrIG1hbmEgY29zdCBidXQgdGhpcyBpcyBnb29kIGVub3VnaCBmb3Igc3VtbWFyeQogICAgICAgICAgICAgICAgY2FyZF9jb2xvcnMgPSBzZXQoKQogICAgICAgICAgICAgICAgb3JhY2xlID0gcm93WyJvcmFjbGVfdGV4dCJdIG9yICIiCiAgICAgICAgICAgICAgICBtYW5hX2Nvc3QgPSAiIgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIG1hbmFfY29zdCA9IHJvd1sibWFuYV9jb3N0Il0gb3IgIiIKICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW5kZXhFcnJvciwgS2V5RXJyb3IpOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIGZvciBzeW0gaW4gWyJXIiwgIlUiLCAiQiIsICJSIiwgIkciXToKICAgICAgICAgICAgICAgICAgICBpZiBmInt7e3N5bX19fSIgaW4gKG1hbmFfY29zdCBvciBvcmFjbGUpOgogICAgICAgICAgICAgICAgICAgICAgICBjYXJkX2NvbG9ycy5hZGQoc3ltKQogICAgICAgICAgICAgICAgaWYgY2FyZF9jb2xvcnMgYW5kIG5vdCBjYXJkX2NvbG9ycy5pc3N1YnNldChjaV9zZXQpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZpbHRlcmVkLmFwcGVuZChyb3cpCgogICAgICAgIGlmIG5vdCBmaWx0ZXJlZDoKICAgICAgICAgICAgcmV0dXJuICIiCgogICAgICAgICMgR3JvdXAgYnkgY2FyZCB0eXBlCiAgICAgICAgZ3JvdXBzID0ge30KICAgICAgICBmb3Igcm93IGluIGZpbHRlcmVkOgogICAgICAgICAgICB0eXBlX2xpbmUgPSByb3dbInR5cGVfbGluZSJdIG9yICIiCiAgICAgICAgICAgIGlmICJDcmVhdHVyZSIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICAgICAgZ3JvdXAgPSAiQ3JlYXR1cmVzIgogICAgICAgICAgICBlbGlmICJJbnN0YW50IiBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgICAgICBncm91cCA9ICJJbnN0YW50cyIKICAgICAgICAgICAgZWxpZiAiU29yY2VyeSIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICAgICAgZ3JvdXAgPSAiU29yY2VyaWVzIgogICAgICAgICAgICBlbGlmICJBcnRpZmFjdCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICAgICAgZ3JvdXAgPSAiQXJ0aWZhY3RzIgogICAgICAgICAgICBlbGlmICJFbmNoYW50bWVudCIgaW4gdHlwZV9saW5lOgogICAgICAgICAgICAgICAgZ3JvdXAgPSAiRW5jaGFudG1lbnRzIgogICAgICAgICAgICBlbGlmICJQbGFuZXN3YWxrZXIiIGluIHR5cGVfbGluZToKICAgICAgICAgICAgICAgIGdyb3VwID0gIlBsYW5lc3dhbGtlcnMiCiAgICAgICAgICAgIGVsaWYgIkxhbmQiIGluIHR5cGVfbGluZToKICAgICAgICAgICAgICAgIGdyb3VwID0gIkxhbmRzIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ3JvdXAgPSAiT3RoZXIiCiAgICAgICAgICAgIGdyb3Vwcy5zZXRkZWZhdWx0KGdyb3VwLCBbXSkuYXBwZW5kKHJvdykKCiAgICAgICAgIyBTb3J0IGVhY2ggZ3JvdXAgYnkgcG9wdWxhcml0eS9wcmljZSBhbmQgYnVpbGQgdGV4dAogICAgICAgIGxpbmVzID0gW2YiQ09MTEVDVElPTiBTVU1NQVJZICh7bGVuKGZpbHRlcmVkKX0gY2FyZHMgaW4gZGVjayBjb2xvcnMpOiJdCiAgICAgICAgZm9yIGdyb3VwX25hbWUgaW4gWyJDcmVhdHVyZXMiLCAiSW5zdGFudHMiLCAiU29yY2VyaWVzIiwgIkFydGlmYWN0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmNoYW50bWVudHMiLCAiUGxhbmVzd2Fsa2VycyIsICJMYW5kcyIsICJPdGhlciJdOgogICAgICAgICAgICBjYXJkcyA9IGdyb3Vwcy5nZXQoZ3JvdXBfbmFtZSwgW10pCiAgICAgICAgICAgIGlmIG5vdCBjYXJkczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICMgU29ydCBieSBwcmljZSBkZXNjZW5kaW5nIChoaWdoZXIgdmFsdWUgPSBsaWtlbHkgYmV0dGVyIGNhcmQpCiAgICAgICAgICAgIGNhcmRzLnNvcnQo' +
'a2V5PWxhbWJkYSByOiByWyJ0Y2dfcHJpY2UiXSBvciAwLCByZXZlcnNlPVRydWUpCiAgICAgICAgICAgIGNhcmRfc3RycyA9IFtdCiAgICAgICAgICAgIGZvciBjIGluIGNhcmRzWzptYXhfcGVyX2dyb3VwXToKICAgICAgICAgICAgICAgIHByaWNlID0gZiIke2NbJ3RjZ19wcmljZSddOi4yZn0iIGlmIGNbInRjZ19wcmljZSJdIGVsc2UgIiQ/IgogICAgICAgICAgICAgICAgY2FyZF9zdHJzLmFwcGVuZChmIntjWyduYW1lJ119ICh7cHJpY2V9KSIpCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIiAge2dyb3VwX25hbWV9ICh7bGVuKGNhcmRzKX0pOiB7JywgJy5qb2luKGNhcmRfc3Rycyl9IikKCiAgICAgICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKCiAgICAjIOKUgOKUgCBTdGVwIDM6IEdlbmVyYXRlIERlY2sgdmlhIFBlcnBsZXhpdHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBkZWYgZ2VuZXJhdGVfZGVjaygKICAgICAgICBzZWxmLAogICAgICAgIGNvbW1hbmRlcl9uYW1lOiBzdHIsCiAgICAgICAgc3RyYXRlZ3k6IHN0ciA9ICIiLAogICAgICAgIHRhcmdldF9icmFja2V0OiBpbnQgPSAzLAogICAgICAgIGJ1ZGdldF91c2Q6IGZsb2F0ID0gTm9uZSwKICAgICAgICBidWRnZXRfbW9kZTogc3RyID0gInRvdGFsIiwKICAgICAgICBvbWl0X2NhcmRzOiBMaXN0W3N0cl0gPSBOb25lLAogICAgICAgIHVzZV9jb2xsZWN0aW9uOiBib29sID0gVHJ1ZSwKICAgICAgICBtb2RlbDogc3RyID0gTm9uZSwKICAgICkgLT4gZGljdDoKICAgICAgICAiIiIKICAgICAgICBHZW5lcmF0ZSBhIGNvbXBsZXRlIENvbW1hbmRlciBkZWNrLgoKICAgICAgICBSZXR1cm5zIGRpY3Qgd2l0aDoKICAgICAgICAgIC0gY29tbWFuZGVyOiBkaWN0IHdpdGggU2NyeWZhbGwgZGF0YQogICAgICAgICAgLSByYXdfZGVjazogcGFyc2VkIEdlbmVyYXRlZERlY2tMaXN0IGZyb20gUGVycGxleGl0eQogICAgICAgICAgLSBjYXJkczogbGlzdCBvZiBEZWNrQ2FyZFdpdGhTdGF0dXMgKGFmdGVyIG93bmVyc2hpcCBjaGVjaykKICAgICAgICAgIC0gc3RhdHM6IGRlY2sgc3RhdGlzdGljcwogICAgICAgICAgLSB0b2tlbnNfdXNlZDoge3Byb21wdCwgY29tcGxldGlvbn0KICAgICAgICAiIiIKICAgICAgICAjIFN0ZXAgMTogUmVzb2x2ZSBjb21tYW5kZXIKICAgICAgICBjbWRyID0gc2VsZi5yZXNvbHZlX2NvbW1hbmRlcihjb21tYW5kZXJfbmFtZSkKICAgICAgICBjb2xvcl9pZGVudGl0eSA9IGNtZHJbImNvbG9yX2lkZW50aXR5Il0KICAgICAgICBsb2dnZXIuaW5mbygiQ29tbWFuZGVyOiAlcywgQ0k6ICVzIiwgY21kclsibmFtZSJdLCBjb2xvcl9pZGVudGl0eSkKCiAgICAgICAgIyBTdGVwIDI6IENvbGxlY3Rpb24gc3VtbWFyeQogICAgICAgIGNvbGxlY3Rpb25fYmxvY2sgPSAiIgogICAgICAgIGlmIHVzZV9jb2xsZWN0aW9uOgogICAgICAgICAgICBjb2xsZWN0aW9uX2Jsb2NrID0gc2VsZi5idWlsZF9jb2xsZWN0aW9uX3N1bW1hcnkoY29sb3JfaWRlbnRpdHkpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDb2xsZWN0aW9uIHN1bW1hcnk6ICVkIGNoYXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGNvbGxlY3Rpb25fYmxvY2spIGlmIGNvbGxlY3Rpb25fYmxvY2sgZWxzZSAwKQoKICAgICAgICAjIFN0ZXAgMzogQnVpbGQgcHJvbXB0cwogICAgICAgIHVzZXJfcHJvbXB0ID0gYnVpbGRfdXNlcl9wcm9tcHQoCiAgICAgICAgICAgIGNvbW1hbmRlcj1jbWRyWyJuYW1lIl0sCiAgICAgICAgICAgIGNvbW1hbmRlcl90eXBlPWNtZHJbInR5cGVfbGluZSJdLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eT1jb2xvcl9pZGVudGl0eSwKICAgICAgICAgICAgc3RyYXRlZ3k9c3RyYXRlZ3ksCiAgICAgICAgICAgIHRhcmdldF9icmFja2V0PXRhcmdldF9icmFja2V0LAogICAgICAgICAgICBidWRnZXRfdXNkPWJ1ZGdldF91c2QsCiAgICAgICAgICAgIGJ1ZGdldF9tb2RlPWJ1ZGdldF9tb2RlLAogICAgICAgICAgICBvbWl0X2NhcmRzPW9taXRfY2FyZHMsCiAgICAgICAgICAgIGNvbGxlY3Rpb25fc3VtbWFyeT1jb2xsZWN0aW9uX2Jsb2NrLAogICAgICAgICkKCiAgICAgICAgIyBTdGVwIDQ6IENhbGwgUGVycGxleGl0eSB3aXRoIHN0cnVjdHVyZWQgb3V0cHV0CiAgICAgICAgdXNlX21vZGVsID0gbW9kZWwgb3IgREVDS19HRU5fTU9ERUwKICAgICAgICBsb2dnZXIuaW5mbygiQ2FsbGluZyBQZXJwbGV4aXR5ICglcykgZm9y' +
'IGRlY2sgZ2VuZXJhdGlvbi4uLiIsIHVzZV9tb2RlbCkKCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnBwbHguY2hhdF9zdHJ1Y3R1cmVkKAogICAgICAgICAgICBzeXN0ZW1fcHJvbXB0PVNZU1RFTV9QUk9NUFQsCiAgICAgICAgICAgIHVzZXJfcHJvbXB0PXVzZXJfcHJvbXB0LAogICAgICAgICAgICBqc29uX3NjaGVtYT1ERUNLX0xJU1RfU0NIRU1BLAogICAgICAgICAgICBzY2hlbWFfbmFtZT0iRGVja0xpc3QiLAogICAgICAgICAgICBtb2RlbD11c2VfbW9kZWwsCiAgICAgICAgICAgIHRlbXBlcmF0dXJlPURFQ0tfR0VOX1RFTVBFUkFUVVJFLAogICAgICAgICAgICBtYXhfdG9rZW5zPURFQ0tfR0VOX01BWF9UT0tFTlMsCiAgICAgICAgKQoKICAgICAgICBpZiBub3QgcmVzcG9uc2Uub2s6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICBmIlBlcnBsZXhpdHkgcmV0dXJuZWQgaW52YWxpZCByZXNwb25zZToge3Jlc3BvbnNlLmNvbnRlbnRbOjMwMF19IgogICAgICAgICAgICApCgogICAgICAgIHJhd19kZWNrID0gcmVzcG9uc2UucGFyc2VkX2pzb24KICAgICAgICBsb2dnZXIuaW5mbygiRGVjayBnZW5lcmF0ZWQ6ICVkIGNhcmRzLCBicmFja2V0ICVkIiwKICAgICAgICAgICAgICAgICAgICAgbGVuKHJhd19kZWNrLmdldCgiY2FyZHMiLCBbXSkpLAogICAgICAgICAgICAgICAgICAgICByYXdfZGVjay5nZXQoImJyYWNrZXQiLCB7fSkuZ2V0KCJsZXZlbCIsIDApKQoKICAgICAgICAjIFN0ZXAgNTogQ2hlY2sgb3duZXJzaGlwIGFuZCBidWlsZCBlbnJpY2hlZCBjYXJkIGxpc3QKICAgICAgICBjYXJkc193aXRoX3N0YXR1cyA9IHNlbGYuX2NoZWNrX293bmVyc2hpcChyYXdfZGVjay5nZXQoImNhcmRzIiwgW10pKQoKICAgICAgICAjIFN0ZXAgNjogQ29tcHV0ZSBzdGF0cwogICAgICAgIHN0YXRzID0gc2VsZi5fY29tcHV0ZV9zdGF0cyhjYXJkc193aXRoX3N0YXR1cykKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgImNvbW1hbmRlciI6IGNtZHIsCiAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNvbG9yX2lkZW50aXR5LAogICAgICAgICAgICAicmF3X2RlY2siOiByYXdfZGVjaywKICAgICAgICAgICAgImNhcmRzIjogW2MubW9kZWxfZHVtcCgpIGZvciBjIGluIGNhcmRzX3dpdGhfc3RhdHVzXSwKICAgICAgICAgICAgInN0YXRzIjogc3RhdHMsCiAgICAgICAgICAgICJzdHJhdGVneV9zdW1tYXJ5IjogcmF3X2RlY2suZ2V0KCJzdHJhdGVneV9zdW1tYXJ5IiwgIiIpLAogICAgICAgICAgICAiYnJhY2tldCI6IHJhd19kZWNrLmdldCgiYnJhY2tldCIsIHt9KSwKICAgICAgICAgICAgImFyY2hldHlwZSI6IHJhd19kZWNrLmdldCgiYXJjaGV0eXBlIiwgIiIpLAogICAgICAgICAgICAicmVhc29uaW5nIjogcmF3X2RlY2suZ2V0KCJyZWFzb25pbmciLCB7fSksCiAgICAgICAgICAgICJlc3RpbWF0ZWRfdG90YWxfdXNkIjogcmF3X2RlY2suZ2V0KCJlc3RpbWF0ZWRfdG90YWxfdXNkIiwgMCksCiAgICAgICAgICAgICJ0b2tlbnNfdXNlZCI6IHsKICAgICAgICAgICAgICAgICJwcm9tcHQiOiByZXNwb25zZS5wcm9tcHRfdG9rZW5zLAogICAgICAgICAgICAgICAgImNvbXBsZXRpb24iOiByZXNwb25zZS5jb21wbGV0aW9uX3Rva2VucywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm1vZGVsIjogcmVzcG9uc2UubW9kZWwsCiAgICAgICAgICAgICJjaXRhdGlvbnMiOiByZXNwb25zZS5jaXRhdGlvbnMsCiAgICAgICAgfQoKICAgICMg4pSA4pSAIFN0ZXAgNTogT3duZXJzaGlwIENoZWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgZGVmIF9jaGVja19vd25lcnNoaXAoc2VsZiwgY2FyZHM6IExpc3RbZGljdF0pIC0+IExpc3RbRGVja0NhcmRXaXRoU3RhdHVzXToKICAgICAgICAiIiIKICAgICAgICBDcm9zcy1yZWZlcmVuY2UgZ2VuZXJhdGVkIGNhcmRzIGFnYWluc3QgdGhlIGNvbGxlY3Rpb24gREIuCiAgICAgICAgU2V0cyBvd25lZC9zY3J5ZmFsbF9pZC9vd25lZF9xdHkgYW5kIHJlYWwgcHJpY2UuCiAgICAgICAgIiIiCiAgICAgICAgY29ubiA9IHNlbGYuZGJfY29ubl9mYWN0b3J5KCkKICAgICAgICBlbnJpY2hlZCA9IFtdCgogICAgICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgICAgICBuYW1lID0gY2FyZC5nZXQoIm5hbWUiLCAiIikKICAgICAgICAgICAgaWYgbm90IG5h' +
'bWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBMb29rIHVwIGluIGNvbGxlY3Rpb24KICAgICAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgIlNFTEVDVCBuYW1lLCBzY3J5ZmFsbF9pZCwgcXVhbnRpdHksIHRjZ19wcmljZSwgdHlwZV9saW5lLCBjbWMgIgogICAgICAgICAgICAgICAgIkZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIG5hbWUgPSA/IENPTExBVEUgTk9DQVNFIExJTUlUIDEiLAogICAgICAgICAgICAgICAgKG5hbWUsKQogICAgICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgICAgIGlzX293bmVkID0gYm9vbChyb3cgYW5kIHJvd1sicXVhbnRpdHkiXSBhbmQgcm93WyJxdWFudGl0eSJdID4gMCkKCiAgICAgICAgICAgIGVucmljaGVkX2NhcmQgPSBEZWNrQ2FyZFdpdGhTdGF0dXMoCiAgICAgICAgICAgICAgICBuYW1lPXJvd1sibmFtZSJdIGlmIHJvdyBlbHNlIG5hbWUsCiAgICAgICAgICAgICAgICBjb3VudD1jYXJkLmdldCgiY291bnQiLCAxKSwKICAgICAgICAgICAgICAgIGNhdGVnb3J5PWNhcmQuZ2V0KCJjYXRlZ29yeSIsICIiKSwKICAgICAgICAgICAgICAgIHJvbGVfdGFncz1jYXJkLmdldCgicm9sZV90YWdzIiwgW10pLAogICAgICAgICAgICAgICAgcmVhc29uPWNhcmQuZ2V0KCJyZWFzb24iLCAiIiksCiAgICAgICAgICAgICAgICBlc3RpbWF0ZWRfcHJpY2VfdXNkPSgKICAgICAgICAgICAgICAgICAgICByb3VuZChyb3dbInRjZ19wcmljZSJdLCAyKSBpZiByb3cgYW5kIHJvd1sidGNnX3ByaWNlIl0KICAgICAgICAgICAgICAgICAgICBlbHNlIGNhcmQuZ2V0KCJlc3RpbWF0ZWRfcHJpY2VfdXNkIiwgMCkKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBzeW5lcmd5X3dpdGg9Y2FyZC5nZXQoInN5bmVyZ3lfd2l0aCIsIFtdKSwKICAgICAgICAgICAgICAgIG93bmVkPWlzX293bmVkLAogICAgICAgICAgICAgICAgb3duZWRfcXR5PWludChyb3dbInF1YW50aXR5Il0pIGlmIHJvdyBhbmQgcm93WyJxdWFudGl0eSJdIGVsc2UgMCwKICAgICAgICAgICAgICAgIHNjcnlmYWxsX2lkPXJvd1sic2NyeWZhbGxfaWQiXSBpZiByb3cgZWxzZSAiIiwKICAgICAgICAgICAgICAgIHN0YXR1cz0ib3duZWQiIGlmIGlzX293bmVkIGVsc2UgIm1pc3NpbmciLAogICAgICAgICAgICApCiAgICAgICAgICAgIGVucmljaGVkLmFwcGVuZChlbnJpY2hlZF9jYXJkKQoKICAgICAgICByZXR1cm4gZW5yaWNoZWQKCiAgICAjIOKUgOKUgCBTdGVwIDY6IFNtYXJ0IFN1YnN0aXR1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGRlZiBydW5fc3Vic3RpdHV0aW9uKAogICAgICAgIHNlbGYsCiAgICAgICAgY2FyZHM6IExpc3RbRGVja0NhcmRXaXRoU3RhdHVzXSwKICAgICAgICBjb21tYW5kZXI6IGRpY3QsCiAgICAgICAgc3RyYXRlZ3k6IHN0ciA9ICIiLAogICAgKSAtPiBTdWJzdGl0dXRpb25CYXRjaFJlc3VsdDoKICAgICAgICAiIiIKICAgICAgICBSdW4gdGhlIFNtYXJ0IFN1YnN0aXR1dGlvbiBFbmdpbmUgb24gbWlzc2luZyBjYXJkcy4KCiAgICAgICAgUGlwZWxpbmU6CiAgICAgICAgICBhKSBJZGVudGlmeSBtaXNzaW5nIGNhcmRzCiAgICAgICAgICBiKSBGb3IgZWFjaDogdHJ5IGVtYmVkZGluZyBzaW1pbGFyaXR5IChmcmVlLCBmYXN0KQogICAgICAgICAgYykgRm9yIGxvdy1jb25maWRlbmNlIG1hdGNoZXM6IGJhdGNoIFBlcnBsZXhpdHkgZmFsbGJhY2sKICAgICAgICAgIGQpIEF1dG8tc2VsZWN0IGJlc3Qgc3Vic3RpdHV0ZSBwZXIgY2FyZAoKICAgICAgICBSZXR1cm5zIFN1YnN0aXR1dGlvbkJhdGNoUmVzdWx0IHdpdGggYWxsIGNhcmRzIHVwZGF0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgY29sb3JfaWRlbnRpdHkgPSBjb21tYW5kZXIuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKQogICAgICAgIG1pc3NpbmcgPSBbYyBmb3IgYyBpbiBjYXJkcyBpZiBub3QgYy5vd25lZF0KICAgICAgICBvd25lZCA9IFtjIGZvciBjIGluIGNhcmRzIGlmIGMub3duZWRdCgogICAgICAgIGlmIG5vdCBtaXNzaW5nOgogICAgICAgICAgICByZXR1cm4gU3Vic3RpdHV0aW9uQmF0Y2hSZXN1bHQoCiAgICAgICAgICAgICAgICB0b3RhbF9jYXJkcz1sZW4oY2FyZHMpLAogICAgICAgICAgICAgICAgb3duZWRfY291bnQ9bGVuKG93bmVkKSwKICAgICAgICAgICAgICAgIHN1' +
'YnN0aXR1dGVkX2NvdW50PTAsCiAgICAgICAgICAgICAgICBtaXNzaW5nX2NvdW50PTAsCiAgICAgICAgICAgICAgICBjYXJkcz1jYXJkcywKICAgICAgICAgICAgKQoKICAgICAgICBsb2dnZXIuaW5mbygiU3Vic3RpdHV0aW9uOiAlZCBtaXNzaW5nIC8gJWQgb3duZWQiLCBsZW4obWlzc2luZyksIGxlbihvd25lZCkpCgogICAgICAgICMgQnVpbGQgbGlzdCBvZiBvd25lZCBjYXJkIG5hbWVzIGZvciBzdWJzdGl0dXRpb24gcG9vbAogICAgICAgIGNvbm4gPSBzZWxmLmRiX2Nvbm5fZmFjdG9yeSgpCiAgICAgICAgb3duZWRfcG9vbF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIERJU1RJTkNUIG5hbWUgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgcXVhbnRpdHkgPiAwIgogICAgICAgICkuZmV0Y2hhbGwoKQogICAgICAgIG93bmVkX3Bvb2wgPSBbclsibmFtZSJdIGZvciByIGluIG93bmVkX3Bvb2xfcm93c10KCiAgICAgICAgIyBFeGNsdWRlIGNhcmRzIGFscmVhZHkgaW4gdGhlIGRlY2sKICAgICAgICBkZWNrX25hbWVzID0gc2V0KGMubmFtZS5sb3dlcigpIGZvciBjIGluIGNhcmRzKQogICAgICAgIGF2YWlsYWJsZV9wb29sID0gW24gZm9yIG4gaW4gb3duZWRfcG9vbCBpZiBuLmxvd2VyKCkgbm90IGluIGRlY2tfbmFtZXNdCgogICAgICAgICMgYSkgRW1iZWRkaW5nIHBhc3MKICAgICAgICBuZWVkc19wcGx4X2ZhbGxiYWNrID0gW10KICAgICAgICBmb3IgY2FyZCBpbiBtaXNzaW5nOgogICAgICAgICAgICBlbWJlZGRpbmdfYWx0cyA9IHNlbGYuX2VtYmVkZGluZ19zdWJzdGl0dXRpb24oCiAgICAgICAgICAgICAgICBjYXJkLCBjb2xvcl9pZGVudGl0eSwgYXZhaWxhYmxlX3Bvb2wKICAgICAgICAgICAgKQogICAgICAgICAgICBjYXJkLmFsdGVybmF0aXZlcyA9IGVtYmVkZGluZ19hbHRzCgogICAgICAgICAgICAjIENoZWNrIGlmIGJlc3QgbWF0Y2ggbWVldHMgdGhyZXNob2xkCiAgICAgICAgICAgIGlmIGVtYmVkZGluZ19hbHRzIGFuZCBlbWJlZGRpbmdfYWx0c1swXS5zaW1pbGFyaXR5X3Njb3JlID49IFNVQlNUSVRVVElPTl9NSU5fU0lNSUxBUklUWToKICAgICAgICAgICAgICAgIGNhcmQuc2VsZWN0ZWRfc3Vic3RpdHV0ZSA9IGVtYmVkZGluZ19hbHRzWzBdLm5hbWUKICAgICAgICAgICAgICAgIGNhcmQuc3RhdHVzID0gInN1YnN0aXR1dGVkIgogICAgICAgICAgICAgICAgIyBSZW1vdmUgc2VsZWN0ZWQgZnJvbSBwb29sCiAgICAgICAgICAgICAgICBpZiBjYXJkLnNlbGVjdGVkX3N1YnN0aXR1dGUubG93ZXIoKSBpbiBbbi5sb3dlcigpIGZvciBuIGluIGF2YWlsYWJsZV9wb29sXToKICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfcG9vbCA9IFtuIGZvciBuIGluIGF2YWlsYWJsZV9wb29sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuLmxvd2VyKCkgIT0gY2FyZC5zZWxlY3RlZF9zdWJzdGl0dXRlLmxvd2VyKCldCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuZWVkc19wcGx4X2ZhbGxiYWNrLmFwcGVuZChjYXJkKQoKICAgICAgICAjIGIpIFBlcnBsZXhpdHkgZmFsbGJhY2sgZm9yIGxvdy1jb25maWRlbmNlIG1hdGNoZXMKICAgICAgICBpZiBuZWVkc19wcGx4X2ZhbGxiYWNrIGFuZCBTVUJTVElUVVRJT05fVVNFX1BQTFhfRkFMTEJBQ0s6CiAgICAgICAgICAgIHNlbGYuX3BwbHhfc3Vic3RpdHV0aW9uKAogICAgICAgICAgICAgICAgbmVlZHNfcHBseF9mYWxsYmFjaywgYXZhaWxhYmxlX3Bvb2wsCiAgICAgICAgICAgICAgICBjb21tYW5kZXIsIHN0cmF0ZWd5CiAgICAgICAgICAgICkKCiAgICAgICAgIyBDb3VudCByZXN1bHRzCiAgICAgICAgc3Vic3RpdHV0ZWQgPSBzdW0oMSBmb3IgYyBpbiBjYXJkcyBpZiBjLnN0YXR1cyA9PSAic3Vic3RpdHV0ZWQiKQogICAgICAgIHN0aWxsX21pc3NpbmcgPSBzdW0oMSBmb3IgYyBpbiBjYXJkcyBpZiBjLnN0YXR1cyA9PSAibWlzc2luZyIpCgogICAgICAgIHJldHVybiBTdWJzdGl0dXRpb25CYXRjaFJlc3VsdCgKICAgICAgICAgICAgdG90YWxfY2FyZHM9bGVuKGNhcmRzKSwKICAgICAgICAgICAgb3duZWRfY291bnQ9bGVuKG93bmVkKSwKICAgICAgICAgICAgc3Vic3RpdHV0ZWRfY291bnQ9c3Vic3RpdHV0ZWQsCiAgICAgICAgICAgIG1pc3NpbmdfY291bnQ9c3RpbGxfbWlzc2luZywKICAgICAgICAgICAgY2FyZHM9Y2FyZHMsCiAgICAgICAgKQoKICAgIGRlZiBfZW1iZWRkaW5nX3N1YnN0aXR1dGlvbigKICAgICAg' +
'ICBzZWxmLAogICAgICAgIGNhcmQ6IERlY2tDYXJkV2l0aFN0YXR1cywKICAgICAgICBjb2xvcl9pZGVudGl0eTogTGlzdFtzdHJdLAogICAgICAgIGF2YWlsYWJsZV9wb29sOiBMaXN0W3N0cl0sCiAgICApIC0+IExpc3RbQ2FyZEFsdGVybmF0aXZlXToKICAgICAgICAiIiJGaW5kIGVtYmVkZGluZy1zaW1pbGFyIG93bmVkIGNhcmRzIGFzIHN1YnN0aXR1dGVzLiIiIgogICAgICAgIGlmIG5vdCBzZWxmLmVtYmVkZGluZ19pbmRleCBvciBub3Qgc2VsZi5lbWJlZGRpbmdfaW5kZXgubG9hZGVkOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgIyBVc2UgdGhlIGVtYmVkZGluZ3Mgc2VhcmNoIHRvIGZpbmQgc2ltaWxhciBjYXJkcwogICAgICAgIG1hdGNoZXMgPSBzZWxmLmVtYmVkZGluZ19pbmRleC5zZWFyY2hfc2ltaWxhcigKICAgICAgICAgICAgcXVlcnlfY2FyZD1jYXJkLm5hbWUsCiAgICAgICAgICAgIGNvbG9yX2ZpbHRlcj1jb2xvcl9pZGVudGl0eSBpZiBjb2xvcl9pZGVudGl0eSBlbHNlIE5vbmUsCiAgICAgICAgICAgIHR5cGVfZmlsdGVyPWNhcmQuY2F0ZWdvcnkgaWYgY2FyZC5jYXRlZ29yeSBlbHNlIE5vbmUsCiAgICAgICAgICAgIGV4Y2x1ZGVfY2FyZHM9W2NhcmQubmFtZV0sCiAgICAgICAgICAgIHRvcF9uPVNVQlNUSVRVVElPTl9NQVhfQUxURVJOQVRJVkVTICogMywgICMgT3Zlci1mZXRjaCwgdGhlbiBmaWx0ZXIgdG8gb3duZWQKICAgICAgICApCgogICAgICAgICMgRmlsdGVyIHRvIG9ubHkgY2FyZHMgaW4gdGhlIGF2YWlsYWJsZSBwb29sCiAgICAgICAgcG9vbF9sb3dlciA9IHNldChuLmxvd2VyKCkgZm9yIG4gaW4gYXZhaWxhYmxlX3Bvb2wpCiAgICAgICAgYWx0ZXJuYXRpdmVzID0gW10KICAgICAgICBmb3IgbWF0Y2ggaW4gbWF0Y2hlczoKICAgICAgICAgICAgaWYgbWF0Y2gubmFtZS5sb3dlcigpIGluIHBvb2xfbG93ZXI6CiAgICAgICAgICAgICAgICAjIENvbXB1dGUgcm9sZSBvdmVybGFwCiAgICAgICAgICAgICAgICBtYXRjaF9yb2xlcyA9IFtdICAjIFdvdWxkIG5lZWQgY2FyZCdzIHJvbGVfdGFncyBmcm9tIERCCiAgICAgICAgICAgICAgICByb2xlX292ZXJsYXAgPSBsaXN0KHNldChjYXJkLnJvbGVfdGFncykgJiBzZXQobWF0Y2hfcm9sZXMpKSBpZiBtYXRjaF9yb2xlcyBlbHNlIFtdCgogICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmVzLmFwcGVuZChDYXJkQWx0ZXJuYXRpdmUoCiAgICAgICAgICAgICAgICAgICAgbmFtZT1tYXRjaC5uYW1lLAogICAgICAgICAgICAgICAgICAgIHNpbWlsYXJpdHlfc2NvcmU9bWF0Y2guc2ltaWxhcml0eSwKICAgICAgICAgICAgICAgICAgICByZWFzb249ZiJTaW1pbGFyIHRvIHtjYXJkLm5hbWV9IChjb3NpbmUgc2ltOiB7bWF0Y2guc2ltaWxhcml0eTouM2Z9KSIsCiAgICAgICAgICAgICAgICAgICAgc291cmNlPSJlbWJlZGRpbmciLAogICAgICAgICAgICAgICAgICAgIHJvbGVfb3ZlcmxhcD1yb2xlX292ZXJsYXAsCiAgICAgICAgICAgICAgICAgICAgY21jX2RlbHRhPW1hdGNoLm1hbmFfdmFsdWUgLSAoY2FyZC5lc3RpbWF0ZWRfcHJpY2VfdXNkIG9yIDApLAogICAgICAgICAgICAgICAgKSkKCiAgICAgICAgICAgICAgICBpZiBsZW4oYWx0ZXJuYXRpdmVzKSA+PSBTVUJTVElUVVRJT05fTUFYX0FMVEVSTkFUSVZFUzoKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICByZXR1cm4gYWx0ZXJuYXRpdmVzCgogICAgZGVmIF9wcGx4X3N1YnN0aXR1dGlvbigKICAgICAgICBzZWxmLAogICAgICAgIG1pc3NpbmdfY2FyZHM6IExpc3RbRGVja0NhcmRXaXRoU3RhdHVzXSwKICAgICAgICBhdmFpbGFibGVfcG9vbDogTGlzdFtzdHJdLAogICAgICAgIGNvbW1hbmRlcjogZGljdCwKICAgICAgICBzdHJhdGVneTogc3RyLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBCYXRjaCBQZXJwbGV4aXR5IGZhbGxiYWNrIGZvciBjYXJkcyB3aXRoIGxvdyBlbWJlZGRpbmcgY29uZmlkZW5jZS4KICAgICAgICBNdXRhdGVzIHRoZSBjYXJkcyBpbi1wbGFjZSB3aXRoIHN1YnN0aXR1dGlvbiBkYXRhLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBhdmFpbGFibGVfcG9vbDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQnVpbGQgdGhlIHJlcXVlc3QKICAgICAgICBtaXNzaW5nX2RpY3RzID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6IGMubmFtZSwKICAgICAgICAgICAgICAgICJyb2xlX3RhZ3MiOiBjLnJvbGVfdGFncywKICAgICAgICAgICAg' +
'ICAgICJjYXRlZ29yeSI6IGMuY2F0ZWdvcnksCiAgICAgICAgICAgICAgICAicmVhc29uIjogYy5yZWFzb24sCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIGMgaW4gbWlzc2luZ19jYXJkcwogICAgICAgIF0KCiAgICAgICAgdXNlcl9wcm9tcHQgPSBidWlsZF9zdWJzdGl0dXRpb25fcHJvbXB0KAogICAgICAgICAgICBtaXNzaW5nX2NhcmRzPW1pc3NpbmdfZGljdHMsCiAgICAgICAgICAgIGFsbG93ZWRfY2FyZHM9YXZhaWxhYmxlX3Bvb2xbOjIwMF0sICAjIExpbWl0IHRvIGF2b2lkIHRva2VuIG92ZXJmbG93CiAgICAgICAgICAgIGNvbW1hbmRlcj1jb21tYW5kZXIuZ2V0KCJuYW1lIiwgIiIpLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eT1jb21tYW5kZXIuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKSwKICAgICAgICAgICAgc3RyYXRlZ3k9c3RyYXRlZ3ksCiAgICAgICAgKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gLi5zY2hlbWFzLnN1YnN0aXR1dGlvbl9zY2hlbWEgaW1wb3J0IFNVQlNUSVRVVElPTl9SRVNQT05TRV9TQ0hFTUEKICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnBwbHguY2hhdF9zdHJ1Y3R1cmVkKAogICAgICAgICAgICAgICAgc3lzdGVtX3Byb21wdD1TVUJTVElUVVRJT05fU1lTVEVNLAogICAgICAgICAgICAgICAgdXNlcl9wcm9tcHQ9dXNlcl9wcm9tcHQsCiAgICAgICAgICAgICAgICBqc29uX3NjaGVtYT1TVUJTVElUVVRJT05fUkVTUE9OU0VfU0NIRU1BLAogICAgICAgICAgICAgICAgc2NoZW1hX25hbWU9IlN1YnN0aXR1dGlvblJlc3BvbnNlIiwKICAgICAgICAgICAgICAgIG1vZGVsPVNVQlNUSVRVVElPTl9NT0RFTCwKICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlPTAuMSwKICAgICAgICAgICAgICAgIG1heF90b2tlbnM9NDA5NiwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgaWYgbm90IHJlc3BvbnNlLm9rOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIlBlcnBsZXhpdHkgc3Vic3RpdHV0aW9uIGZhbGxiYWNrIGZhaWxlZCDigJQgbm9uLUpTT04gcmVzcG9uc2UiKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBzdWJzID0gcmVzcG9uc2UucGFyc2VkX2pzb24uZ2V0KCJzdWJzdGl0dXRpb25zIiwgW10pCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJQZXJwbGV4aXR5IHN1Z2dlc3RlZCAlZCBzdWJzdGl0dXRpb25zIiwgbGVuKHN1YnMpKQoKICAgICAgICAgICAgIyBBcHBseSBzdWJzdGl0dXRpb25zCiAgICAgICAgICAgIGNhcmRfYnlfbmFtZSA9IHtjLm5hbWUubG93ZXIoKTogYyBmb3IgYyBpbiBtaXNzaW5nX2NhcmRzfQogICAgICAgICAgICBmb3Igc3ViIGluIHN1YnM6CiAgICAgICAgICAgICAgICBvcmlnID0gc3ViLmdldCgib3JpZ2luYWwiLCAiIikubG93ZXIoKQogICAgICAgICAgICAgICAgc3Vic3RpdHV0ZSA9IHN1Yi5nZXQoInN1YnN0aXR1dGUiLCAiIikKICAgICAgICAgICAgICAgIHJlYXNvbiA9IHN1Yi5nZXQoInJlYXNvbiIsICIiKQoKICAgICAgICAgICAgICAgIGlmIG9yaWcgaW4gY2FyZF9ieV9uYW1lIGFuZCBzdWJzdGl0dXRlOgogICAgICAgICAgICAgICAgICAgIGNhcmQgPSBjYXJkX2J5X25hbWVbb3JpZ10KICAgICAgICAgICAgICAgICAgICAjIEFkZCBhcyB0b3AgYWx0ZXJuYXRpdmUKICAgICAgICAgICAgICAgICAgICBwcGx4X2FsdCA9IENhcmRBbHRlcm5hdGl2ZSgKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1zdWJzdGl0dXRlLAogICAgICAgICAgICAgICAgICAgICAgICBzaW1pbGFyaXR5X3Njb3JlPTAuODAsICAjIE5vbWluYWwgc2NvcmUgZm9yIFBlcnBsZXhpdHkgc3VnZ2VzdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uPXJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPSJwZXJwbGV4aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgcm9sZV9vdmVybGFwPXN1Yi5nZXQoInJvbGVfb3ZlcmxhcCIsIFtdKSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgIyBJbnNlcnQgYXQgZnJvbnQKICAgICAgICAgICAgICAgICAgICBjYXJkLmFsdGVybmF0aXZlcy5pbnNlcnQoMCwgcHBseF9hbHQpCiAgICAgICAgICAgICAgICAgICAgY2FyZC5zZWxlY3RlZF9zdWJzdGl0dXRlID0gc3Vic3RpdHV0ZQogICAgICAgICAgICAgICAgICAgIGNhcmQuc3RhdHVzID0gInN1YnN0aXR1dGVkIgoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAg' +
'IGxvZ2dlci5lcnJvcigiUGVycGxleGl0eSBzdWJzdGl0dXRpb24gZmFsbGJhY2sgZXJyb3I6ICVzIiwgZSkKCiAgICAjIOKUgOKUgCBTdGF0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY29tcHV0ZV9zdGF0cyhjYXJkczogTGlzdFtEZWNrQ2FyZFdpdGhTdGF0dXNdKSAtPiBkaWN0OgogICAgICAgICIiIkNvbXB1dGUgZGVjayBzdGF0aXN0aWNzIGZyb20gdGhlIGVucmljaGVkIGNhcmQgbGlzdC4iIiIKICAgICAgICBieV9jYXRlZ29yeSA9IHt9CiAgICAgICAgYnlfc3RhdHVzID0geyJvd25lZCI6IDAsICJzdWJzdGl0dXRlZCI6IDAsICJtaXNzaW5nIjogMH0KICAgICAgICB0b3RhbF9wcmljZSA9IDAuMAogICAgICAgIG93bmVkX3ByaWNlID0gMC4wCiAgICAgICAgbWlzc2luZ19wcmljZSA9IDAuMAogICAgICAgIHJvbGVfY291bnRzID0ge30KCiAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgICAgIGNhdCA9IGNhcmQuY2F0ZWdvcnkgb3IgIk90aGVyIgogICAgICAgICAgICBieV9jYXRlZ29yeVtjYXRdID0gYnlfY2F0ZWdvcnkuZ2V0KGNhdCwgMCkgKyBjYXJkLmNvdW50CiAgICAgICAgICAgIGJ5X3N0YXR1c1tjYXJkLnN0YXR1c10gPSBieV9zdGF0dXMuZ2V0KGNhcmQuc3RhdHVzLCAwKSArIDEKICAgICAgICAgICAgcHJpY2UgPSBjYXJkLmVzdGltYXRlZF9wcmljZV91c2QgKiBjYXJkLmNvdW50CiAgICAgICAgICAgIHRvdGFsX3ByaWNlICs9IHByaWNlCiAgICAgICAgICAgIGlmIGNhcmQub3duZWQ6CiAgICAgICAgICAgICAgICBvd25lZF9wcmljZSArPSBwcmljZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbWlzc2luZ19wcmljZSArPSBwcmljZQogICAgICAgICAgICBmb3Igcm9sZSBpbiBjYXJkLnJvbGVfdGFnczoKICAgICAgICAgICAgICAgIHJvbGVfY291bnRzW3JvbGVdID0gcm9sZV9jb3VudHMuZ2V0KHJvbGUsIDApICsgMQoKICAgICAgICBsYW5kX2NvdW50ID0gYnlfY2F0ZWdvcnkuZ2V0KCJMYW5kIiwgMCkKICAgICAgICBub25sYW5kX2NvdW50ID0gc3VtKHYgZm9yIGssIHYgaW4gYnlfY2F0ZWdvcnkuaXRlbXMoKSBpZiBrICE9ICJMYW5kIikKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInRvdGFsX2NhcmRzIjogc3VtKGMuY291bnQgZm9yIGMgaW4gY2FyZHMpLAogICAgICAgICAgICAibGFuZF9jb3VudCI6IGxhbmRfY291bnQsCiAgICAgICAgICAgICJub25sYW5kX2NvdW50Ijogbm9ubGFuZF9jb3VudCwKICAgICAgICAgICAgImJ5X2NhdGVnb3J5IjogYnlfY2F0ZWdvcnksCiAgICAgICAgICAgICJieV9zdGF0dXMiOiBieV9zdGF0dXMsCiAgICAgICAgICAgICJyb2xlX2NvdW50cyI6IHJvbGVfY291bnRzLAogICAgICAgICAgICAidG90YWxfcHJpY2VfdXNkIjogcm91bmQodG90YWxfcHJpY2UsIDIpLAogICAgICAgICAgICAib3duZWRfcHJpY2VfdXNkIjogcm91bmQob3duZWRfcHJpY2UsIDIpLAogICAgICAgICAgICAibWlzc2luZ19wcmljZV91c2QiOiByb3VuZChtaXNzaW5nX3ByaWNlLCAyKSwKICAgICAgICB9Cg=='
Install-B64 -R 'coach\services\deck_generator.py' -B $b
# deck_sources/__init__.py (236 bytes)
$b = 'IyBEZWNrIFNvdXJjZXMg4oCUIFRlbXBsYXRlIGRlY2sgYWRhcHRlcnMgZm9yIEF1dG8gRGVjayBHZW5lcmF0b3IKIwojIEVhY2ggYWRhcHRlciBmZXRjaGVzIHRlbXBsYXRlIGRlY2tsaXN0cyBmcm9tIGFuIGV4dGVybmFsIHNvdXJjZQojIChBcmNoaWRla3QsIEVESFJFQywgTW94ZmllbGQsIE1UR0dvbGRmaXNoKSBhbmQgbm9ybWFsaXplcyB0aGVtCiMgaW50byBhIGNvbW1vbiBUZW1wbGF0ZURlY2sgZm9ybWF0Lgo='
Install-B64 -R 'deck_sources\__init__.py' -B $b
# deck_sources/archidekt_adapter.py (1,134 bytes)
$b = 'IiIiCkFyY2hpZGVrdCBBZGFwdGVyIChzdHViKQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkZldGNoZXMgdGVtcGxhdGUgZGVja2xpc3RzIGZyb20gQXJjaGlkZWt0IGZvciBhIGdpdmVuIGNvbW1hbmRlci4KQ3VycmVudGx5IHJldHVybnMgYSBoYXJkY29kZWQgc2FtcGxlIGZvciBlbmQtdG8tZW5kIHdpcmluZy4KUmVhbCBpbXBsZW1lbnRhdGlvbiB3aWxsIGNhbGwgdGhlIEFyY2hpZGVrdCBBUEkuCiIiIgpmcm9tIC5tb2RlbHMgaW1wb3J0IFRlbXBsYXRlRGVjaywgVGVtcGxhdGVEZWNrQ2FyZAoKCmRlZiBmZXRjaF90ZW1wbGF0ZV9kZWNrcyhjb21tYW5kZXJfbmFtZTogc3RyLCBjb2xvcl9pZGVudGl0eTogbGlzdCwgY29uZmlnOiBkaWN0ID0gTm9uZSkgLT4gbGlzdDoKICAgICIiIgogICAgRmV0Y2ggdGVtcGxhdGUgZGVja3MgZnJvbSBBcmNoaWRla3QgZm9yIHRoZSBnaXZlbiBjb21tYW5kZXIuCgogICAgQXJnczoKICAgICAgICBjb21tYW5kZXJfbmFtZTogVGhlIGNvbW1hbmRlcidzIG5hbWUKICAgICAgICBjb2xvcl9pZGVudGl0eTogTGlzdCBvZiBjb2xvciBsZXR0ZXJzLCBlLmcuIFsiVyIsICJVIiwgIkIiXQogICAgICAgIGNvbmZpZzogT3B0aW9uYWwgY29uZmlnIChVUkxzLCBJRHMsIGV0Yy4pCgogICAgUmV0dXJuczoKICAgICAgICBMaXN0IG9mIFRlbXBsYXRlRGVjayBvYmplY3RzIChjdXJyZW50bHkgc3R1YmJlZCkKICAgICIiIgogICAgIyBTVFVCOiBSZXR1cm4gZW1wdHkgbGlzdCB1bnRpbCByZWFsIEFyY2hpZGVrdCBBUEkgaW50ZWdyYXRpb24KICAgICMgV2hlbiBpbXBsZW1lbnRlZCwgdGhpcyB3aWxsOgogICAgIyAxLiBTZWFyY2ggQXJjaGlkZWt0IGZvciBwb3B1bGFyIGRlY2tzIHdpdGggdGhpcyBjb21tYW5kZXIKICAgICMgMi4gRmV0Y2ggdGhlIHRvcCAzLTUgZGVja2xpc3RzCiAgICAjIDMuIE5vcm1hbGl6ZSBjYXJkIG5hbWVzIGFuZCByZXR1cm4gYXMgVGVtcGxhdGVEZWNrCiAgICBwcmludChmIiAgICBbQVJDSElERUtUXSBTdHViOiBObyB0ZW1wbGF0ZSBkZWNrcyBmb3IgJ3tjb21tYW5kZXJfbmFtZX0nIChub3QgeWV0IGltcGxlbWVudGVkKSIpCiAgICByZXR1cm4gW10K'
Install-B64 -R 'deck_sources\archidekt_adapter.py' -B $b
# deck_sources/edhrec_adapter.py (1,180 bytes)
$b = 'IiIiCkVESFJFQyBBZGFwdGVyIChzdHViKQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkZldGNoZXMgcG9wdWxhci9yZWNvbW1lbmRlZCBjYXJkcyBmcm9tIEVESFJFQyBmb3IgYSBnaXZlbiBjb21tYW5kZXIuCkN1cnJlbnRseSByZXR1cm5zIGEgaGFyZGNvZGVkIHNhbXBsZSBmb3IgZW5kLXRvLWVuZCB3aXJpbmcuClJlYWwgaW1wbGVtZW50YXRpb24gd2lsbCBwYXJzZSBFREhSRUMgY29tbWFuZGVyIHBhZ2VzLgoiIiIKZnJvbSAubW9kZWxzIGltcG9ydCBUZW1wbGF0ZURlY2ssIFRlbXBsYXRlRGVja0NhcmQKCgpkZWYgZmV0Y2hfdGVtcGxhdGVfZGVja3MoY29tbWFuZGVyX25hbWU6IHN0ciwgY29sb3JfaWRlbnRpdHk6IGxpc3QsIGNvbmZpZzogZGljdCA9IE5vbmUpIC0+IGxpc3Q6CiAgICAiIiIKICAgIEZldGNoIHJlY29tbWVuZGVkIGNhcmRzIGZyb20gRURIUkVDIGZvciB0aGUgZ2l2ZW4gY29tbWFuZGVyLgoKICAgIEFyZ3M6CiAgICAgICAgY29tbWFuZGVyX25hbWU6IFRoZSBjb21tYW5kZXIncyBuYW1lCiAgICAgICAgY29sb3JfaWRlbnRpdHk6IExpc3Qgb2YgY29sb3IgbGV0dGVycwogICAgICAgIGNvbmZpZzogT3B0aW9uYWwgY29uZmlnCgogICAgUmV0dXJuczoKICAgICAgICBMaXN0IG9mIFRlbXBsYXRlRGVjayBvYmplY3RzIChjdXJyZW50bHkgc3R1YmJlZCkKICAgICIiIgogICAgIyBTVFVCOiBSZXR1cm4gZW1wdHkgbGlzdCB1bnRpbCByZWFsIEVESFJFQyBpbnRlZ3JhdGlvbgogICAgIyBXaGVuIGltcGxlbWVudGVkLCB0aGlzIHdpbGw6CiAgICAjIDEuIEJ1aWxkIEVESFJFQyBVUkwgZm9yIHRoZSBjb21tYW5kZXIgKGUuZy4sIC9jb21tYW5kZXJzL2tvcnZvbGQtZmFlLWN1cnNlZC1raW5nKQogICAgIyAyLiBGZXRjaCB0aGUgIkF2ZXJhZ2UgRGVjayIgb3IgIlRvcCBDYXJkcyIgbGlzdAogICAgIyAzLiBQYXJzZSBjYXJkIG5hbWVzIGFuZCBpbmNsdXNpb24gcGVyY2VudGFnZXMKICAgICMgNC4gUmV0dXJuIGFzIGEgc2luZ2xlIFRlbXBsYXRlRGVjayB3aXRoIHdlaWdodGVkIGNhcmRzCiAgICBwcmludChmIiAgICBbRURIUkVDXSBTdHViOiBObyByZWNvbW1lbmRhdGlvbnMgZm9yICd7Y29tbWFuZGVyX25hbWV9JyAobm90IHlldCBpbXBsZW1lbnRlZCkiKQogICAgcmV0dXJuIFtdCg=='
Install-B64 -R 'deck_sources\edhrec_adapter.py' -B $b
# deck_sources/models.py (1,001 bytes)
$b = 'IiIiCkRlY2sgU291cmNlcyDigJQgU2hhcmVkIE1vZGVscwrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkNvbW1vbiBkYXRhIG1vZGVscyBmb3IgdGVtcGxhdGUgZGVja3MgZmV0Y2hlZCBmcm9tIGV4dGVybmFsIHNvdXJjZXMuCiIiIgoKCmNsYXNzIFRlbXBsYXRlRGVja0NhcmQ6CiAgICAiIiJBIHNpbmdsZSBjYXJkIGluIGEgdGVtcGxhdGUgZGVjay4iIiIKICAgIF9fc2xvdHNfXyA9ICgibmFtZSIsICJxdWFudGl0eSIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU6IHN0ciwgcXVhbnRpdHk6IGludCA9IDEpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnF1YW50aXR5ID0gcXVhbnRpdHkKCiAgICBkZWYgdG9fZGljdChzZWxmKSAtPiBkaWN0OgogICAgICAgIHJldHVybiB7Im5hbWUiOiBzZWxmLm5hbWUsICJxdWFudGl0eSI6IHNlbGYucXVhbnRpdHl9CgoKY2xhc3MgVGVtcGxhdGVEZWNrOgogICAgIiIiQSB0ZW1wbGF0ZSBkZWNrIGZldGNoZWQgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuIiIiCiAgICBfX3Nsb3RzX18gPSAoIm5hbWUiLCAic291cmNlIiwgImNhcmRzIikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZTogc3RyLCBzb3VyY2U6IHN0ciwgY2FyZHM6IGxpc3QgPSBOb25lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2UKICAgICAgICBzZWxmLmNhcmRzID0gY2FyZHMgb3IgW10gICMgbGlzdCBvZiBUZW1wbGF0ZURlY2tDYXJkCgogICAgZGVmIHRvX2RpY3Qoc2VsZikgLT4gZGljdDoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAibmFtZSI6IHNlbGYubmFtZSwKICAgICAgICAgICAgInNvdXJjZSI6IHNlbGYuc291cmNlLAogICAgICAgICAgICAiY2FyZHMiOiBbYy50b19kaWN0KCkgZm9yIGMgaW4gc2VsZi5jYXJkc10sCiAgICAgICAgfQo='
Install-B64 -R 'deck_sources\models.py' -B $b
# deck_sources/moxfield_adapter.py (599 bytes)
$b = 'IiIiCk1veGZpZWxkIEFkYXB0ZXIgKHN0dWIpCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKRmV0Y2hlcyB0ZW1wbGF0ZSBkZWNrbGlzdHMgZnJvbSBNb3hmaWVsZCBmb3IgYSBnaXZlbiBjb21tYW5kZXIuCkN1cnJlbnRseSByZXR1cm5zIGVtcHR5IChleHBlcmltZW50YWwg4oCUIG5vdCB5ZXQgaW1wbGVtZW50ZWQpLgoiIiIKZnJvbSAubW9kZWxzIGltcG9ydCBUZW1wbGF0ZURlY2ssIFRlbXBsYXRlRGVja0NhcmQKCgpkZWYgZmV0Y2hfdGVtcGxhdGVfZGVja3MoY29tbWFuZGVyX25hbWU6IHN0ciwgY29sb3JfaWRlbnRpdHk6IGxpc3QsIGNvbmZpZzogZGljdCA9IE5vbmUpIC0+IGxpc3Q6CiAgICAiIiIKICAgIEZldGNoIHRlbXBsYXRlIGRlY2tzIGZyb20gTW94ZmllbGQgZm9yIHRoZSBnaXZlbiBjb21tYW5kZXIuCiAgICBFeHBlcmltZW50YWwg4oCUIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAgICAiIiIKICAgIHByaW50KGYiICAgIFtNT1hGSUVMRF0gU3R1YjogTm90IHlldCBpbXBsZW1lbnRlZCBmb3IgJ3tjb21tYW5kZXJfbmFtZX0nIikKICAgIHJldHVybiBbXQo='
Install-B64 -R 'deck_sources\moxfield_adapter.py' -B $b
# deck_sources/mtggoldfish_adapter.py (620 bytes)
$b = 'IiIiCk1UR0dvbGRmaXNoIEFkYXB0ZXIgKHN0dWIpCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKRmV0Y2hlcyB0ZW1wbGF0ZSBkZWNrbGlzdHMgZnJvbSBNVEdHb2xkZmlzaCBmb3IgYSBnaXZlbiBjb21tYW5kZXIuCkN1cnJlbnRseSByZXR1cm5zIGVtcHR5IChleHBlcmltZW50YWwg4oCUIG5vdCB5ZXQgaW1wbGVtZW50ZWQpLgoiIiIKZnJvbSAubW9kZWxzIGltcG9ydCBUZW1wbGF0ZURlY2ssIFRlbXBsYXRlRGVja0NhcmQKCgpkZWYgZmV0Y2hfdGVtcGxhdGVfZGVja3MoY29tbWFuZGVyX25hbWU6IHN0ciwgY29sb3JfaWRlbnRpdHk6IGxpc3QsIGNvbmZpZzogZGljdCA9IE5vbmUpIC0+IGxpc3Q6CiAgICAiIiIKICAgIEZldGNoIHRlbXBsYXRlIGRlY2tzIGZyb20gTVRHR29sZGZpc2ggZm9yIHRoZSBnaXZlbiBjb21tYW5kZXIuCiAgICBFeHBlcmltZW50YWwg4oCUIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAgICAiIiIKICAgIHByaW50KGYiICAgIFtNVEdHT0xERklTSF0gU3R1YjogTm90IHlldCBpbXBsZW1lbnRlZCBmb3IgJ3tjb21tYW5kZXJfbmFtZX0nIikKICAgIHJldHVybiBbXQo='
Install-B64 -R 'deck_sources\mtggoldfish_adapter.py' -B $b
# docs/PROJECT_VISION.md (5,376 bytes)
$b = 'IyBDb21tYW5kZXIgQUkgTGFiIOKAlCBQcm9qZWN0IFZpc2lvbgoKIyMgVmlzaW9uIFN0YXRlbWVudAoKQ29tbWFuZGVyIEFJIExhYiBpcyBhIGhlYWRsZXNzLCBiYXRjaC1vcmllbnRlZCBzaW11bGF0aW9uIGVudmlyb25tZW50IGZvciBNYWdpYzogVGhlIEdhdGhlcmluZyBDb21tYW5kZXIgdGhhdCBwaXRzIDMgQUktY29udHJvbGxlZCBkZWNrcyBhZ2FpbnN0IGVhY2ggb3RoZXIgaW4gYXV0b21hdGVkIGdhbWVzLCBjb2xsZWN0cyBzdHJ1Y3R1cmVkIEpTT04gcmVzdWx0cywgYW5kIHN1cmZhY2VzIGFjdGlvbmFibGUgc3RhdGlzdGljc+KAlHdpbiByYXRlcywgYXZlcmFnZSB0dXJucyB0byB3aW4sIG11bGxpZ2FuIHJhdGVzLCBhbmQgd2luLWNvbmRpdGlvbiBicmVha2Rvd25zLiBCeSB3cmFwcGluZyB0aGUgb3Blbi1zb3VyY2UgRm9yZ2UgcnVsZXMgZW5naW5lIGluIGEgcHJvZ3JhbW1hYmxlIHBpcGVsaW5lLCB0aGUgbGFiIGVuYWJsZXMgZGVjayBidWlsZGVycyB0byBzdHJlc3MtdGVzdCBzdHJhdGVnaWVzIGF0IHNjYWxlIChodW5kcmVkcyBvciB0aG91c2FuZHMgb2Ygc2ltdWxhdGVkIGdhbWVzKSB3aXRob3V0IG1hbnVhbCBwbGF5LCBwcm92aWRpbmcgZGF0YS1kcml2ZW4gaW5zaWdodHMgaW50byBDb21tYW5kZXIgZGVjayBwZXJmb3JtYW5jZS4KCiMjIENvcmUgdjEgR29hbHMKCjEuICoqSGVhZGxlc3MgMy1BSSBTaW11bGF0aW9ucyoqIOKAlCBSdW4gQ29tbWFuZGVyIGdhbWVzIHdpdGggMyBBSSBwbGF5ZXJzLCBubyBHVUksIG5vIGh1bWFuIGlucHV0LCBsZXZlcmFnaW5nIEZvcmdlJ3MgYnVpbHQtaW4gYHNpbWAgbW9kZSB3aXRoIENvbW1hbmRlciBmb3JtYXQgc3VwcG9ydC4KMi4gKipKU09OIEJhdGNoIFJlc3VsdHMqKiDigJQgRXZlcnkgYmF0Y2ggcnVuIHByb2R1Y2VzIGEgc3RydWN0dXJlZCBKU09OIGZpbGUgY29uZm9ybWluZyB0byBhIGRlZmluZWQgc2NoZW1hLCBjb250YWluaW5nIHBlci1nYW1lIG91dGNvbWVzLCBwZXItZGVjayBzdGF0aXN0aWNzLCBhbmQgcnVuIG1ldGFkYXRhLgozLiAqKkJhc2ljIFN0YXRpc3RpY3MqKiDigJQgQ29tcHV0ZSBhbmQgcmVwb3J0OgogICAtIFdpbiByYXRlIHBlciBkZWNrCiAgIC0gQXZlcmFnZSB0dXJucyB0byB3aW4KICAgLSBNdWxsaWdhbiBmcmVxdWVuY3kgcGVyIGRlY2sKICAgLSBXaW4gY29uZGl0aW9uIGNsYXNzaWZpY2F0aW9uIChjb21tYW5kZXIgZGFtYWdlLCBjb21iYXQgZGFtYWdlLCBjb21iby9hbHQtd2luLCBjb25jZXNzaW9uL3RpbWVvdXQpCgojIyB2MSBTY29wZQoKfCBJbiBTY29wZSB8IE91dCBvZiBTY29wZSB8CnwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18CnwgRml4ZWQgMy1wbGF5ZXIgcG9kcyB8IDQtcGxheWVyIHBvZHMgKHYyKSB8CnwgRml4ZWQvcHJlLWJ1aWx0IGRlY2tzIG9ubHkgfCBEeW5hbWljIGRlY2sgZ2VuZXJhdGlvbiB8CnwgRm9yZ2UncyBidWlsdC1pbiBBSSAodXRpbGl0eS1iYXNlZCkgfCBSZWluZm9yY2VtZW50IGxlYXJuaW5nIC8gdHJhaW5pbmcgVUkgfAp8IE5vIHBvbGl0aWNzLCBubyB0YWJsZSB0YWxrIHwgTXVsdGlwbGF5ZXIgaHVtYW4gcGxheWVycyB8CnwgQ0xJIGJhdGNoIHJ1bm5lciB8IEVESFJFQyAvIG1ldGEgaW50ZWdyYXRpb24gfAp8IEpTT04gZXhwb3J0IHRvIGZpbGUgfCBEYXRhYmFzZSBwZXJzaXN0ZW5jZSB8CnwgU2luZ2xlLXRocmVhZCArIG11bHRpLXRocmVhZCBiYXRjaCB8IERpc3RyaWJ1dGVkIC8gY2xvdWQgZXhlY3V0aW9uIHwKfCBCYXNpYyBzdGF0cyBkYXNoYm9hcmQgaW4gd2ViIFVJIHwgQWR2YW5jZWQgYW5hbHl0aWNzIC8gTUwgaW5zaWdodHMgfAoKIyMgQXJjaGl0ZWN0dXJlIE92ZXJ2aWV3CgpgYGAK4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCuKUgiAgICAgICAgICAgICAgICBDb21tYW5kZXIgQUkgTGFiICAgICAgICAgICAgICAgICAgICAgIOKUggrilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIK4pSCICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' +
'lIDilIDilIDilIDilJAg4pSCCuKUgiAg4pSCIENMSSAvICAgIOKUguKUgOKUgOKWtuKUgiBCYXRjaCBSdW5uZXIg4pSC4pSA4pSA4pa24pSCIFN0YXRzICAgICAgICDilIIg4pSCCuKUgiAg4pSCIFdlYiBVSSAgIOKUgiAgIOKUgiAoc2luZ2xlL210KSAg4pSCICAg4pSCIEFnZ3JlZ2F0b3IgICDilIIg4pSCCuKUgiAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYIOKUggrilIIgICAgICAgICAgICAgICAgICAgICAgICDilIIgICAgICAgICAgICAgICAgICAg4pSCICAgICAgICAg4pSCCuKUgiAgICAgICAgICAgICAgICAgICAgICAgIOKWvCAgICAgICAgICAgICAgICAgICDilrwgICAgICAgICDilIIK4pSCICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUggrilIIgICAgICAgICAgICAgIOKUgiBGb3JnZSBFbmdpbmUg4pSCICAgICDilIIgSlNPTiBFeHBvcnQgICDilIIgICDilIIK4pSCICAgICAgICAgICAgICDilIIgKHNpbSBtb2RlKSAgIOKUgiAgICAg4pSCIChzY2hlbWEgdjEpICDilIIgICDilIIK4pSCICAgICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmCAgIOKUggrilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIK4pSCICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICAg4pSCCuKUgiAg4pSCIEFJIFBvbGljeSBMYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgICAg4pSCCuKUgiAg4pSCIOKAoiBDYXJkIGFkdmFudGFnZSBzY29yaW5nICAgICAgICAgICAgICAgICAgICAgIOKUgiAgICDilIIK4pSCICDilIIg4oCiIFRlbXBvIC8gbWFuYSBlZmZpY2llbmN5ICAgICAgICAgICAgICAgICAgICAg4pSCICAgIOKUggrilIIgIOKUgiDigKIgVGhyZWF0IHNjb3JpbmcgcGVyIG9wcG9uZW50ICAgICAgICAgICAgICAgICDilIIgICAg4pSCCuKUgiAg4pSCIOKAoiBCYXNpYyBjb21iYXQgbG9naWMgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgiAgICDilIIK4pSCICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJggICAg4pSCCuKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmApgYGAKCiMjIEN1cnJlbnQgQ29tcG9uZW50cyAoSW52ZW50b3J5KQoKIyMjIEV4aXN0aW5nIFBpZWNlcwoxLiAqKkZvcmdlLWJhc2VkIHJ1bGVzIGVuZ2luZSoqIChgZm9yZ2UtY29tbWFuZGVyLWVuZ2luZWApIOKAlCBKYXZhIDE3L01hdmVuIHByb2plY3Qgd3JhcHBpbmcgRm9yZ2Ugd2l0aCBgQnJpZGdlUGxheWVyQ29udHJvbGxlcmAgZm9yIEpTT04tc2VyaWFsaXplZCBkZWNpc2lvbnMuCjIuICoqQnJpZGdlL0pTT04gY29udHJvbGxlcioqIOKAlCBgQnJpZGdlUGxheWVyQ29udHJvbGxlci5qYXZhYCBzZXJpYWxpemVzIGdhbWVwbGF5IGRlY2lzaW9ucyBhcyBKU09OLCBgU3RkaW9CcmlkZ2VUcmFuc3BvcnRgIGFuZCBgSW5Qcm9jZXNzVHJhbnNwb3J0YCBoYW5kbGUgY29tbXVuaWNhdGlvbi4KMy4gKipXZWIgc2ltdWxhdG9yIFVJKiogKGBtdGctY29tbWFuZGVyLWxhbmApIOKAlCBIVE1ML0NTUy9KUyBDb21tYW5kZXIgc2ltdWxhdG9yIHdpdGggYm9hcmQgc3RhdGUsIFNjcnlmYWxsIGludGVncmF0aW9uLCBkZWNrIGJ1aWxkZXIs' +
'IGNvbGxlY3Rpb24gdHJhY2tlciwgdG9rZW4gc3lzdGVtLgo0LiAqKkRlY2sgYnVpbGRlciAvIHRyYWNrZXIqKiDigJQgSW50ZWdyYXRlZCBpbnRvIHdlYiBzaW11bGF0b3Igd2l0aCBsb2NhbFN0b3JhZ2UgcGVyc2lzdGVuY2UsIFNjcnlmYWxsIEFQSSBjYXJkIGRhdGEuCgojIyMgTWlzc2luZyBQaWVjZXMgKFRvIEJ1aWxkKQoxLiAqKkJhdGNoIFJ1bm5lcioqIOKAlCBPcmNoZXN0cmF0aW9uIGxheWVyIHRoYXQgaW52b2tlcyBGb3JnZSBgc2ltYCBtb2RlIHJlcGVhdGVkbHksIGNvbGxlY3RzIG91dHB1dCwgaGFuZGxlcyB0aHJlYWRpbmcuCjIuICoqQUkgUG9saWN5IENsYXNzKiog4oCUIEFic3RyYWN0aW9uIGxheWVyIG92ZXIgRm9yZ2UncyBidWlsdC1pbiBBSSB3aXRoIGNvbmZpZ3VyYWJsZSBoZXVyaXN0aWMgd2VpZ2h0cyBmb3IgQ29tbWFuZGVyLXNwZWNpZmljIGRlY2lzaW9ucy4KMy4gKipTdGF0cyBBZ2dyZWdhdGlvbioqIOKAlCBNb2R1bGUgdG8gcGFyc2UgZ2FtZSBvdXRjb21lcyBhbmQgY29tcHV0ZSB3aW4gcmF0ZXMsIHR1cm4gY291bnRzLCBtdWxsaWdhbiByYXRlcywgd2luIGNvbmRpdGlvbnMuCjQuICoqSlNPTiBFeHBvcnQqKiDigJQgU3RydWN0dXJlZCBzZXJpYWxpemF0aW9uIG9mIGJhdGNoIHJlc3VsdHMgY29uZm9ybWluZyB0byB0aGUgZGVmaW5lZCBzY2hlbWEuCjUuICoqQ0xJIEVudHJ5IFBvaW50Kiog4oCUIENvbW1hbmQtbGluZSBpbnRlcmZhY2UgdG8gdHJpZ2dlciBiYXRjaCBydW5zIHdpdGggcGFyYW1ldGVycy4KNi4gKipXZWIgVUkgSW50ZWdyYXRpb24qKiDigJQgRGVjayBzZWxlY3Rpb24sICJSdW4gTiBzaW1zIiBidXR0b24sIHJlc3VsdHMgZGlzcGxheSBpbiB0aGUgZXhpc3Rpbmcgd2ViIHNpbXVsYXRvci4K'
Install-B64 -R 'docs\PROJECT_VISION.md' -B $b
# docs/batch-result-schema.json (5,394 bytes)
$b = 'ewogICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyIsCiAgInRpdGxlIjogIkNvbW1hbmRlciBBSSBMYWIg4oCUIEJhdGNoIFJlc3VsdCBTY2hlbWEgdjEiLAogICJkZXNjcmlwdGlvbiI6ICJPdXRwdXQgc2NoZW1hIGZvciBhIGJhdGNoIG9mIGhlYWRsZXNzIDMtQUkgQ29tbWFuZGVyIHNpbXVsYXRpb25zLiIsCiAgInR5cGUiOiAib2JqZWN0IiwKICAicmVxdWlyZWQiOiBbIm1ldGFkYXRhIiwgImRlY2tzIiwgImdhbWVzIiwgInN1bW1hcnkiXSwKICAicHJvcGVydGllcyI6IHsKICAgICJtZXRhZGF0YSI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInJlcXVpcmVkIjogWyJzY2hlbWFWZXJzaW9uIiwgImJhdGNoSWQiLCAidGltZXN0YW1wIiwgInRvdGFsR2FtZXMiLCAiY29tcGxldGVkR2FtZXMiLCAiZm9ybWF0IiwgInBvZFNpemUiLCAiZW5naW5lVmVyc2lvbiIsICJlbGFwc2VkTXMiXSwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgInNjaGVtYVZlcnNpb24iOiB7ICJ0eXBlIjogInN0cmluZyIsICJjb25zdCI6ICIxLjAuMCIgfSwKICAgICAgICAiYmF0Y2hJZCI6IHsgInR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIlVVSUQgZm9yIHRoaXMgYmF0Y2ggcnVuIiB9LAogICAgICAgICJ0aW1lc3RhbXAiOiB7ICJ0eXBlIjogInN0cmluZyIsICJmb3JtYXQiOiAiZGF0ZS10aW1lIiwgImRlc2NyaXB0aW9uIjogIklTTyA4NjAxIHN0YXJ0IHRpbWUiIH0sCiAgICAgICAgInRvdGFsR2FtZXMiOiB7ICJ0eXBlIjogImludGVnZXIiLCAibWluaW11bSI6IDEgfSwKICAgICAgICAiY29tcGxldGVkR2FtZXMiOiB7ICJ0eXBlIjogImludGVnZXIiLCAibWluaW11bSI6IDAgfSwKICAgICAgICAiZm9ybWF0IjogeyAidHlwZSI6ICJzdHJpbmciLCAiY29uc3QiOiAiY29tbWFuZGVyIiB9LAogICAgICAgICJwb2RTaXplIjogeyAidHlwZSI6ICJpbnRlZ2VyIiwgImNvbnN0IjogMyB9LAogICAgICAgICJlbmdpbmVWZXJzaW9uIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgIm1hc3RlclNlZWQiOiB7ICJ0eXBlIjogWyJpbnRlZ2VyIiwgIm51bGwiXSwgImRlc2NyaXB0aW9uIjogIk1hc3RlciBSTkcgc2VlZCAobnVsbCBpZiByYW5kb20pIiB9LAogICAgICAgICJ0aHJlYWRzIjogeyAidHlwZSI6ICJpbnRlZ2VyIiwgIm1pbmltdW0iOiAxIH0sCiAgICAgICAgImVsYXBzZWRNcyI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCwgImRlc2NyaXB0aW9uIjogIlRvdGFsIHdhbGwtY2xvY2sgdGltZSBpbiBtaWxsaXNlY29uZHMiIH0KICAgICAgfQogICAgfSwKICAgICJkZWNrcyI6IHsKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAibWluSXRlbXMiOiAzLAogICAgICAibWF4SXRlbXMiOiAzLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAicmVxdWlyZWQiOiBbInNlYXRJbmRleCIsICJkZWNrTmFtZSIsICJjb21tYW5kZXJOYW1lIl0sCiAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAic2VhdEluZGV4IjogeyAidHlwZSI6ICJpbnRlZ2VyIiwgIm1pbmltdW0iOiAwLCAibWF4aW11bSI6IDIgfSwKICAgICAgICAgICJkZWNrTmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgImNvbW1hbmRlck5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICJkZWNrRmlsZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImRlc2NyaXB0aW9uIjogIlBhdGggb3IgZmlsZW5hbWUgb2YgdGhlIC5kY2sgZmlsZSIgfSwKICAgICAgICAgICJjb2xvcklkZW50aXR5IjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbIlciLCAiVSIsICJCIiwgIlIiLCAiRyJdIH0KICAgICAgICAgIH0sCiAgICAgICAgICAiY2FyZENvdW50IjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImdhbWVzIjogewogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICJyZXF1aXJlZCI6IFsiZ2FtZUluZGV4IiwgIndpbm5pbmdTZWF0IiwgInRvdGFsVHVybnMiLCAid2luQ29uZGl0aW9uIiwgImdhbWVTZWVkIiwgImVsYXBzZWRNcyJdLAogICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgImdhbWVJ' +
'bmRleCI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCB9LAogICAgICAgICAgIndpbm5pbmdTZWF0IjogeyAidHlwZSI6IFsiaW50ZWdlciIsICJudWxsIl0sICJtaW5pbXVtIjogMCwgIm1heGltdW0iOiAyLCAiZGVzY3JpcHRpb24iOiAibnVsbCBpZiBkcmF3L3RpbWVvdXQiIH0sCiAgICAgICAgICAidG90YWxUdXJucyI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMSB9LAogICAgICAgICAgIndpbkNvbmRpdGlvbiI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImVudW0iOiBbImNvbWJhdF9kYW1hZ2UiLCAiY29tbWFuZGVyX2RhbWFnZSIsICJjb21ib19hbHRfd2luIiwgImxpZmVfZHJhaW4iLCAibWlsbCIsICJjb25jZXNzaW9uIiwgInRpbWVvdXQiLCAidW5rbm93biJdCiAgICAgICAgICB9LAogICAgICAgICAgImdhbWVTZWVkIjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9LAogICAgICAgICAgImVsYXBzZWRNcyI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCB9LAogICAgICAgICAgInBsYXllclJlc3VsdHMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIm1pbkl0ZW1zIjogMywKICAgICAgICAgICAgIm1heEl0ZW1zIjogMywKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJzZWF0SW5kZXgiLCAiZmluYWxMaWZlIiwgIm11bGxpZ2FucyIsICJpc1dpbm5lciJdLAogICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInNlYXRJbmRleCI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAgICJmaW5hbExpZmUiOiB7ICJ0eXBlIjogImludGVnZXIiIH0sCiAgICAgICAgICAgICAgICAibXVsbGlnYW5zIjogeyAidHlwZSI6ICJpbnRlZ2VyIiwgIm1pbmltdW0iOiAwIH0sCiAgICAgICAgICAgICAgICAiaXNXaW5uZXIiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAiY29tbWFuZGVyRGFtYWdlRGVhbHQiOiB7ICJ0eXBlIjogImludGVnZXIiLCAibWluaW11bSI6IDAgfSwKICAgICAgICAgICAgICAgICJjb21tYW5kZXJDYXN0cyI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCB9LAogICAgICAgICAgICAgICAgImxhbmRzUGxheWVkIjogeyAidHlwZSI6ICJpbnRlZ2VyIiwgIm1pbmltdW0iOiAwIH0sCiAgICAgICAgICAgICAgICAic3BlbGxzQ2FzdCI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCB9LAogICAgICAgICAgICAgICAgImNyZWF0dXJlc0Rlc3Ryb3llZCI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgInN1bW1hcnkiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJyZXF1aXJlZCI6IFsicGVyRGVjayJdLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAicGVyRGVjayI6IHsKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJtaW5JdGVtcyI6IDMsCiAgICAgICAgICAibWF4SXRlbXMiOiAzLAogICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInNlYXRJbmRleCIsICJkZWNrTmFtZSIsICJ3aW5zIiwgIndpblJhdGUiLCAiYXZnVHVybnNUb1dpbiIsICJhdmdNdWxsaWdhbnMiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgInNlYXRJbmRleCI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAiZGVja05hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAid2lucyI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCB9LAogICAgICAgICAgICAgICJsb3NzZXMiOiB7ICJ0eXBlIjogImludGVnZXIiLCAibWluaW11bSI6IDAgfSwKICAgICAgICAgICAgICAiZHJhd3MiOiB7ICJ0eXBlIjogImludGVnZXIiLCAibWluaW11bSI6IDAgfSwKICAgICAgICAgICAgICAid2luUmF0ZSI6IHsgInR5cGUiOiAibnVtYmVyIiwgIm1pbmltdW0iOiAwLCAibWF4aW11bSI6IDEgfSwKICAgICAgICAgICAgICAiYXZnVHVybnNUb1dpbiI6IHsgInR5cGUiOiBbIm51bWJlciIsICJudWxsIl0gfSwK' +
'ICAgICAgICAgICAgICAiYXZnTXVsbGlnYW5zIjogeyAidHlwZSI6ICJudW1iZXIiLCAibWluaW11bSI6IDAgfSwKICAgICAgICAgICAgICAiYXZnRmluYWxMaWZlIjogeyAidHlwZSI6ICJudW1iZXIiIH0sCiAgICAgICAgICAgICAgIndpbkNvbmRpdGlvbkJyZWFrZG93biI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgImNvbWJhdF9kYW1hZ2UiOiB7ICJ0eXBlIjogImludGVnZXIiIH0sCiAgICAgICAgICAgICAgICAgICJjb21tYW5kZXJfZGFtYWdlIjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9LAogICAgICAgICAgICAgICAgICAiY29tYm9fYWx0X3dpbiI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAgICAgImxpZmVfZHJhaW4iOiB7ICJ0eXBlIjogImludGVnZXIiIH0sCiAgICAgICAgICAgICAgICAgICJtaWxsIjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9LAogICAgICAgICAgICAgICAgICAiY29uY2Vzc2lvbiI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAgICAgInRpbWVvdXQiOiB7ICJ0eXBlIjogImludGVnZXIiIH0sCiAgICAgICAgICAgICAgICAgICJ1bmtub3duIjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiYXZnR2FtZVR1cm5zIjogeyAidHlwZSI6ICJudW1iZXIiIH0sCiAgICAgICAgImF2Z0dhbWVUaW1lTXMiOiB7ICJ0eXBlIjogIm51bWJlciIgfSwKICAgICAgICAic2ltc1BlclNlY29uZCI6IHsgInR5cGUiOiAibnVtYmVyIiB9CiAgICAgIH0KICAgIH0KICB9Cn0K'
Install-B64 -R 'docs\batch-result-schema.json' -B $b
# docs/game-log-schema.json (3,243 bytes)
$b = 'ewogICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyIsCiAgInRpdGxlIjogIkNvbW1hbmRlciBBSSBMYWIg4oCUIFBlci1HYW1lIExvZyBTY2hlbWEgdjEiLAogICJkZXNjcmlwdGlvbiI6ICJPcHRpb25hbCBkZXRhaWxlZCBsb2cgZm9yIGEgc2luZ2xlIHNpbXVsYXRlZCBnYW1lLiIsCiAgInR5cGUiOiAib2JqZWN0IiwKICAicmVxdWlyZWQiOiBbImdhbWVJbmRleCIsICJiYXRjaElkIiwgInR1cm5zIl0sCiAgInByb3BlcnRpZXMiOiB7CiAgICAiZ2FtZUluZGV4IjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9LAogICAgImJhdGNoSWQiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICJnYW1lU2VlZCI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICJ0dXJucyI6IHsKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAicmVxdWlyZWQiOiBbInR1cm5OdW1iZXIiLCAiYWN0aXZlU2VhdCIsICJwaGFzZXMiXSwKICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICJ0dXJuTnVtYmVyIjogeyAidHlwZSI6ICJpbnRlZ2VyIiwgIm1pbmltdW0iOiAxIH0sCiAgICAgICAgICAiYWN0aXZlU2VhdCI6IHsgInR5cGUiOiAiaW50ZWdlciIsICJtaW5pbXVtIjogMCwgIm1heGltdW0iOiAyIH0sCiAgICAgICAgICAicGhhc2VzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsicGhhc2UiXSwKICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJwaGFzZSI6IHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgImVudW0iOiBbInVudGFwIiwgInVwa2VlcCIsICJkcmF3IiwgIm1haW4xIiwgImNvbWJhdF9iZWdpbiIsICJkZWNsYXJlX2F0dGFja2VycyIsICJkZWNsYXJlX2Jsb2NrZXJzIiwgImNvbWJhdF9kYW1hZ2UiLCAiY29tYmF0X2VuZCIsICJtYWluMiIsICJlbmQiLCAiY2xlYW51cCJdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFjdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbInBsYXlfbGFuZCIsICJjYXN0X3NwZWxsIiwgImFjdGl2YXRlX2FiaWxpdHkiLCAiYXR0YWNrIiwgImJsb2NrIiwgInRyaWdnZXIiLCAicmVzb2x2ZSIsICJtdWxsaWdhbiIsICJwYXNzX3ByaW9yaXR5Il0KICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAiY2FyZCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgICAgICAgInRhcmdldHMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogeyAidHlwZSI6ICJzdHJpbmciIH0KICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAic2VhdCI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAgICAgICAgICJtYW5hU3BlbnQiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICAgICAgICJub3RlcyI6IHsgInR5cGUiOiAic3RyaW5nIiB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJvYXJkU3RhdGUiOiB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTbmFwc2hvdCBvZiBib2FyZCBzdGF0ZSBhZnRlciB0aGlzIHBoYXNlIChvcHRpb25hbCwgZXhwZW5zaXZlKSIsCiAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwbGF5ZXJzIjogewogICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAg' +
'ICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAic2VhdCI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAibGlmZSI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZFNpemUiOiB7ICJ0eXBlIjogImludGVnZXIiIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYnJhcnlTaXplIjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJtYW5lbnRDb3VudCI6IHsgInR5cGUiOiAiaW50ZWdlciIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhdmV5YXJkU2l6ZSI6IHsgInR5cGUiOiAiaW50ZWdlciIgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIm91dGNvbWUiOiB7CiAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJ3aW5uaW5nU2VhdCI6IHsgInR5cGUiOiBbImludGVnZXIiLCAibnVsbCJdIH0sCiAgICAgICAgIndpbkNvbmRpdGlvbiI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICJ0b3RhbFR1cm5zIjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9LAogICAgICAgICJmaW5hbExpZmVUb3RhbHMiOiB7CiAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAiaXRlbXMiOiB7ICJ0eXBlIjogImludGVnZXIiIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0K'
Install-B64 -R 'docs\game-log-schema.json' -B $b
# frontend/commander-ai-lab-ui/.gitignore (253 bytes)
$b = 'IyBMb2dzCmxvZ3MKKi5sb2cKbnBtLWRlYnVnLmxvZyoKeWFybi1kZWJ1Zy5sb2cqCnlhcm4tZXJyb3IubG9nKgpwbnBtLWRlYnVnLmxvZyoKbGVybmEtZGVidWcubG9nKgoKbm9kZV9tb2R1bGVzCmRpc3QKZGlzdC1zc3IKKi5sb2NhbAoKIyBFZGl0b3IgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi52c2NvZGUvKgohLnZzY29kZS9leHRlbnNpb25zLmpzb24KLmlkZWEKLkRTX1N0b3JlCiouc3VvCioubnR2cyoKKi5uanNwcm9qCiouc2xuCiouc3c/Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\.gitignore' -B $b
# frontend/commander-ai-lab-ui/README.md (2,555 bytes)
$b = 'IyBSZWFjdCArIFR5cGVTY3JpcHQgKyBWaXRlCgpUaGlzIHRlbXBsYXRlIHByb3ZpZGVzIGEgbWluaW1hbCBzZXR1cCB0byBnZXQgUmVhY3Qgd29ya2luZyBpbiBWaXRlIHdpdGggSE1SIGFuZCBzb21lIEVTTGludCBydWxlcy4KCkN1cnJlbnRseSwgdHdvIG9mZmljaWFsIHBsdWdpbnMgYXJlIGF2YWlsYWJsZToKCi0gW0B2aXRlanMvcGx1Z2luLXJlYWN0XShodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUtcGx1Z2luLXJlYWN0L2Jsb2IvbWFpbi9wYWNrYWdlcy9wbHVnaW4tcmVhY3QpIHVzZXMgW0JhYmVsXShodHRwczovL2JhYmVsanMuaW8vKSAob3IgW294Y10oaHR0cHM6Ly9veGMucnMpIHdoZW4gdXNlZCBpbiBbcm9sbGRvd24tdml0ZV0oaHR0cHM6Ly92aXRlLmRldi9ndWlkZS9yb2xsZG93bikpIGZvciBGYXN0IFJlZnJlc2gKLSBbQHZpdGVqcy9wbHVnaW4tcmVhY3Qtc3djXShodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUtcGx1Z2luLXJlYWN0L2Jsb2IvbWFpbi9wYWNrYWdlcy9wbHVnaW4tcmVhY3Qtc3djKSB1c2VzIFtTV0NdKGh0dHBzOi8vc3djLnJzLykgZm9yIEZhc3QgUmVmcmVzaAoKIyMgUmVhY3QgQ29tcGlsZXIKClRoZSBSZWFjdCBDb21waWxlciBpcyBub3QgZW5hYmxlZCBvbiB0aGlzIHRlbXBsYXRlIGJlY2F1c2Ugb2YgaXRzIGltcGFjdCBvbiBkZXYgJiBidWlsZCBwZXJmb3JtYW5jZXMuIFRvIGFkZCBpdCwgc2VlIFt0aGlzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcmVhY3QuZGV2L2xlYXJuL3JlYWN0LWNvbXBpbGVyL2luc3RhbGxhdGlvbikuCgojIyBFeHBhbmRpbmcgdGhlIEVTTGludCBjb25maWd1cmF0aW9uCgpJZiB5b3UgYXJlIGRldmVsb3BpbmcgYSBwcm9kdWN0aW9uIGFwcGxpY2F0aW9uLCB3ZSByZWNvbW1lbmQgdXBkYXRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIHR5cGUtYXdhcmUgbGludCBydWxlczoKCmBgYGpzCmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyhbCiAgZ2xvYmFsSWdub3JlcyhbJ2Rpc3QnXSksCiAgewogICAgZmlsZXM6IFsnKiovKi57dHMsdHN4fSddLAogICAgZXh0ZW5kczogWwogICAgICAvLyBPdGhlciBjb25maWdzLi4uCgogICAgICAvLyBSZW1vdmUgdHNlc2xpbnQuY29uZmlncy5yZWNvbW1lbmRlZCBhbmQgcmVwbGFjZSB3aXRoIHRoaXMKICAgICAgdHNlc2xpbnQuY29uZmlncy5yZWNvbW1lbmRlZFR5cGVDaGVja2VkLAogICAgICAvLyBBbHRlcm5hdGl2ZWx5LCB1c2UgdGhpcyBmb3Igc3RyaWN0ZXIgcnVsZXMKICAgICAgdHNlc2xpbnQuY29uZmlncy5zdHJpY3RUeXBlQ2hlY2tlZCwKICAgICAgLy8gT3B0aW9uYWxseSwgYWRkIHRoaXMgZm9yIHN0eWxpc3RpYyBydWxlcwogICAgICB0c2VzbGludC5jb25maWdzLnN0eWxpc3RpY1R5cGVDaGVja2VkLAoKICAgICAgLy8gT3RoZXIgY29uZmlncy4uLgogICAgXSwKICAgIGxhbmd1YWdlT3B0aW9uczogewogICAgICBwYXJzZXJPcHRpb25zOiB7CiAgICAgICAgcHJvamVjdDogWycuL3RzY29uZmlnLm5vZGUuanNvbicsICcuL3RzY29uZmlnLmFwcC5qc29uJ10sCiAgICAgICAgdHNjb25maWdSb290RGlyOiBpbXBvcnQubWV0YS5kaXJuYW1lLAogICAgICB9LAogICAgICAvLyBvdGhlciBvcHRpb25zLi4uCiAgICB9LAogIH0sCl0pCmBgYAoKWW91IGNhbiBhbHNvIGluc3RhbGwgW2VzbGludC1wbHVnaW4tcmVhY3QteF0oaHR0cHM6Ly9naXRodWIuY29tL1JlbDFjeC9lc2xpbnQtcmVhY3QvdHJlZS9tYWluL3BhY2thZ2VzL3BsdWdpbnMvZXNsaW50LXBsdWdpbi1yZWFjdC14KSBhbmQgW2VzbGludC1wbHVnaW4tcmVhY3QtZG9tXShodHRwczovL2dpdGh1Yi5jb20vUmVsMWN4L2VzbGludC1yZWFjdC90cmVlL21haW4vcGFja2FnZXMvcGx1Z2lucy9lc2xpbnQtcGx1Z2luLXJlYWN0LWRvbSkgZm9yIFJlYWN0LXNwZWNpZmljIGxpbnQgcnVsZXM6CgpgYGBqcwovLyBlc2xpbnQuY29uZmlnLmpzCmltcG9ydCByZWFjdFggZnJvbSAnZXNsaW50LXBsdWdpbi1yZWFjdC14JwppbXBvcnQgcmVhY3REb20gZnJvbSAnZXNsaW50LXBsdWdpbi1yZWFjdC1kb20nCgpleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoWwogIGdsb2JhbElnbm9yZXMoWydkaXN0J10pLAogIHsKICAgIGZpbGVzOiBbJyoqLyoue3RzLHRzeH0nXSwKICAgIGV4dGVuZHM6IFsKICAgICAgLy8gT3RoZXIgY29uZmlncy4uLgogICAgICAvLyBFbmFibGUgbGludCBydWxlcyBmb3IgUmVhY3QKICAgICAgcmVhY3RYLmNvbmZpZ3NbJ3JlY29tbWVuZGVkLXR5cGVz' +
'Y3JpcHQnXSwKICAgICAgLy8gRW5hYmxlIGxpbnQgcnVsZXMgZm9yIFJlYWN0IERPTQogICAgICByZWFjdERvbS5jb25maWdzLnJlY29tbWVuZGVkLAogICAgXSwKICAgIGxhbmd1YWdlT3B0aW9uczogewogICAgICBwYXJzZXJPcHRpb25zOiB7CiAgICAgICAgcHJvamVjdDogWycuL3RzY29uZmlnLm5vZGUuanNvbicsICcuL3RzY29uZmlnLmFwcC5qc29uJ10sCiAgICAgICAgdHNjb25maWdSb290RGlyOiBpbXBvcnQubWV0YS5kaXJuYW1lLAogICAgICB9LAogICAgICAvLyBvdGhlciBvcHRpb25zLi4uCiAgICB9LAogIH0sCl0pCmBgYAo='
Install-B64 -R 'frontend\commander-ai-lab-ui\README.md' -B $b
# frontend/commander-ai-lab-ui/eslint.config.js (616 bytes)
$b = 'aW1wb3J0IGpzIGZyb20gJ0Blc2xpbnQvanMnCmltcG9ydCBnbG9iYWxzIGZyb20gJ2dsb2JhbHMnCmltcG9ydCByZWFjdEhvb2tzIGZyb20gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnCmltcG9ydCByZWFjdFJlZnJlc2ggZnJvbSAnZXNsaW50LXBsdWdpbi1yZWFjdC1yZWZyZXNoJwppbXBvcnQgdHNlc2xpbnQgZnJvbSAndHlwZXNjcmlwdC1lc2xpbnQnCmltcG9ydCB7IGRlZmluZUNvbmZpZywgZ2xvYmFsSWdub3JlcyB9IGZyb20gJ2VzbGludC9jb25maWcnCgpleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoWwogIGdsb2JhbElnbm9yZXMoWydkaXN0J10pLAogIHsKICAgIGZpbGVzOiBbJyoqLyoue3RzLHRzeH0nXSwKICAgIGV4dGVuZHM6IFsKICAgICAganMuY29uZmlncy5yZWNvbW1lbmRlZCwKICAgICAgdHNlc2xpbnQuY29uZmlncy5yZWNvbW1lbmRlZCwKICAgICAgcmVhY3RIb29rcy5jb25maWdzLmZsYXQucmVjb21tZW5kZWQsCiAgICAgIHJlYWN0UmVmcmVzaC5jb25maWdzLnZpdGUsCiAgICBdLAogICAgbGFuZ3VhZ2VPcHRpb25zOiB7CiAgICAgIGVjbWFWZXJzaW9uOiAyMDIwLAogICAgICBnbG9iYWxzOiBnbG9iYWxzLmJyb3dzZXIsCiAgICB9LAogIH0sCl0pCg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\eslint.config.js' -B $b
# frontend/commander-ai-lab-ui/index.html (368 bytes)
$b = 'PCFkb2N0eXBlIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPGxpbmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS9zdmcreG1sIiBocmVmPSIvdml0ZS5zdmciIC8+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCIgLz4KICAgIDx0aXRsZT5jb21tYW5kZXItYWktbGFiLXVpPC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJyb290Ij48L2Rpdj4KICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIiBzcmM9Ii9zcmMvbWFpbi50c3giPjwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo='
Install-B64 -R 'frontend\commander-ai-lab-ui\index.html' -B $b
# frontend/commander-ai-lab-ui/package-lock.json (149,748 bytes)
$b = 'ewogICJuYW1lIjogImNvbW1hbmRlci1haS1sYWItdWkiLAogICJ2ZXJzaW9uIjogIjAuMC4wIiwKICAibG9ja2ZpbGVWZXJzaW9uIjogMywKICAicmVxdWlyZXMiOiB0cnVlLAogICJwYWNrYWdlcyI6IHsKICAgICIiOiB7CiAgICAgICJuYW1lIjogImNvbW1hbmRlci1haS1sYWItdWkiLAogICAgICAidmVyc2lvbiI6ICIwLjAuMCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkB0YWlsd2luZGNzcy92aXRlIjogIl40LjIuMSIsCiAgICAgICAgImx1Y2lkZS1yZWFjdCI6ICJeMC41NzcuMCIsCiAgICAgICAgInJlYWN0IjogIl4xOS4yLjAiLAogICAgICAgICJyZWFjdC1kb20iOiAiXjE5LjIuMCIsCiAgICAgICAgInJlYWN0LXJvdXRlci1kb20iOiAiXjcuMTMuMSIsCiAgICAgICAgInJlY2hhcnRzIjogIl4zLjguMCIsCiAgICAgICAgInRhaWx3aW5kY3NzIjogIl40LjIuMSIKICAgICAgfSwKICAgICAgImRldkRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGVzbGludC9qcyI6ICJeOS4zOS4xIiwKICAgICAgICAiQHR5cGVzL25vZGUiOiAiXjI0LjEwLjEiLAogICAgICAgICJAdHlwZXMvcmVhY3QiOiAiXjE5LjIuNyIsCiAgICAgICAgIkB0eXBlcy9yZWFjdC1kb20iOiAiXjE5LjIuMyIsCiAgICAgICAgIkB2aXRlanMvcGx1Z2luLXJlYWN0IjogIl41LjEuMSIsCiAgICAgICAgImVzbGludCI6ICJeOS4zOS4xIiwKICAgICAgICAiZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcyI6ICJeNy4wLjEiLAogICAgICAgICJlc2xpbnQtcGx1Z2luLXJlYWN0LXJlZnJlc2giOiAiXjAuNC4yNCIsCiAgICAgICAgImdsb2JhbHMiOiAiXjE2LjUuMCIsCiAgICAgICAgInR5cGVzY3JpcHQiOiAifjUuOS4zIiwKICAgICAgICAidHlwZXNjcmlwdC1lc2xpbnQiOiAiXjguNDguMCIsCiAgICAgICAgInZpdGUiOiAiXjcuMy4xIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvY29kZS1mcmFtZSI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yOS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9jb2RlLWZyYW1lLy0vY29kZS1mcmFtZS03LjI5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItOU5oQ2VZanE5KzN1eGdkdHAyMExTaUpYSnZOMEZlQ3ROR3BKeHVNRloxS3YzY1dVTmI2RE9oSndVdmNWQ3pLR1I2NmN3NG5qd002aHJKTHFnT3diY3c9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyIjogIl43LjI4LjUiLAogICAgICAgICJqcy10b2tlbnMiOiAiXjQuMC4wIiwKICAgICAgICAicGljb2NvbG9ycyI6ICJeMS4xLjEiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49Ni45LjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BiYWJlbC9jb21wYXQtZGF0YSI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yOS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9jb21wYXQtZGF0YS8tL2NvbXBhdC1kYXRhLTcuMjkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UMU5DSnFUL2o5K2NuOGZ2a3Q3anR3YkxCZkxDLzF5MWM3TnRDZVhGUmd6R1RzYWZpNjhNUnY4eXprWVNhcEJuRkE2TDNVMlZTYzAyY2lEem9BSmhKZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49Ni45LjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BiYWJlbC9jb3JlIjogewogICAgICAidmVyc2lvbiI6ICI3LjI5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2NvcmUvLS9jb3JlLTcuMjkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DR09mT0pxV2pnMnFXL01iNnpOc0RtK3U1dkZROER4WGZiTTA5ejY5cDVaNittRTFpa1AyalVYdytqNDJQZjFYVFlFRDJSbmk1Zjk1bnBZZXV3TURRQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBiYWJlbC9jb2RlLWZyYW1lIjogIl43LjI5LjAiLAogICAgICAgICJAYmFiZWwvZ2VuZXJhdG9yIjogIl43LjI5LjAi' +
'LAogICAgICAgICJAYmFiZWwvaGVscGVyLWNvbXBpbGF0aW9uLXRhcmdldHMiOiAiXjcuMjguNiIsCiAgICAgICAgIkBiYWJlbC9oZWxwZXItbW9kdWxlLXRyYW5zZm9ybXMiOiAiXjcuMjguNiIsCiAgICAgICAgIkBiYWJlbC9oZWxwZXJzIjogIl43LjI4LjYiLAogICAgICAgICJAYmFiZWwvcGFyc2VyIjogIl43LjI5LjAiLAogICAgICAgICJAYmFiZWwvdGVtcGxhdGUiOiAiXjcuMjguNiIsCiAgICAgICAgIkBiYWJlbC90cmF2ZXJzZSI6ICJeNy4yOS4wIiwKICAgICAgICAiQGJhYmVsL3R5cGVzIjogIl43LjI5LjAiLAogICAgICAgICJAanJpZGdld2VsbC9yZW1hcHBpbmciOiAiXjIuMy41IiwKICAgICAgICAiY29udmVydC1zb3VyY2UtbWFwIjogIl4yLjAuMCIsCiAgICAgICAgImRlYnVnIjogIl40LjEuMCIsCiAgICAgICAgImdlbnN5bmMiOiAiXjEuMC4wLWJldGEuMiIsCiAgICAgICAgImpzb241IjogIl4yLjIuMyIsCiAgICAgICAgInNlbXZlciI6ICJeNi4zLjEiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49Ni45LjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL2JhYmVsIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvZ2VuZXJhdG9yIjogewogICAgICAidmVyc2lvbiI6ICI3LjI5LjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2dlbmVyYXRvci8tL2dlbmVyYXRvci03LjI5LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcXNhRis5UWNtMlF2OFNSSU1Nc2NBdkc0TzNsSjBGMUd1TW81SFIvQnAwMkxvcE5nblpCQy9Fa2JldkhGZUdzNGxzL29Qejl2K0JzbXpia2JlKzBkVXc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvcGFyc2VyIjogIl43LjI5LjAiLAogICAgICAgICJAYmFiZWwvdHlwZXMiOiAiXjcuMjkuMCIsCiAgICAgICAgIkBqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nIjogIl4wLjMuMTIiLAogICAgICAgICJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nIjogIl4wLjMuMjgiLAogICAgICAgICJqc2VzYyI6ICJeMy4wLjIiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49Ni45LjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BiYWJlbC9oZWxwZXItY29tcGlsYXRpb24tdGFyZ2V0cyI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yOC42IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9oZWxwZXItY29tcGlsYXRpb24tdGFyZ2V0cy8tL2hlbHBlci1jb21waWxhdGlvbi10YXJnZXRzLTcuMjguNi50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KWXRsczNocWkxNWZjeDVHYVNOTDdTQ1RKMk1ObWpya0hYZzRGU3BPQS9ncnhLOEt3eVo1YnViSHNDcThGWENrdWE2eGh1YWFCaXQrM2I3K1ZaUmZjQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBiYWJlbC9jb21wYXQtZGF0YSI6ICJeNy4yOC42IiwKICAgICAgICAiQGJhYmVsL2hlbHBlci12YWxpZGF0b3Itb3B0aW9uIjogIl43LjI3LjEiLAogICAgICAgICJicm93c2Vyc2xpc3QiOiAiXjQuMjQuMCIsCiAgICAgICAgImxydS1jYWNoZSI6ICJeNS4xLjEiLAogICAgICAgICJzZW12ZXIiOiAiXjYuMy4xIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuOS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLWdsb2JhbHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMjguMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvaGVscGVyLWdsb2JhbHMvLS9oZWxwZXItZ2xvYmFscy03LjI4LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItK1c2Y0lTa1hGYTFqWHNERWRZQThIZWV2UVQvRlVMaHh6Ujk5cHhwaGx0WmNWYXVncHM1M1RIQ2VpV0E4U2d1eHhwU3AzZ0tQaXVZZlNXb3BrTFE0aHc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQi' +
'LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuOS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLW1vZHVsZS1pbXBvcnRzIjogewogICAgICAidmVyc2lvbiI6ICI3LjI4LjYiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2hlbHBlci1tb2R1bGUtaW1wb3J0cy8tL2hlbHBlci1tb2R1bGUtaW1wb3J0cy03LjI4LjYudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItbDVYa1pLN3I3d2E5THVjR3c5THdaeXlDVXNjYjR4MzdKV1RQejdzd3dGRS8wRk1RQUdwaVdVWm44dTlEemtTQldFY0syNWptdnViZnB3MmRuQU1kYnc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvdHJhdmVyc2UiOiAiXjcuMjguNiIsCiAgICAgICAgIkBiYWJlbC90eXBlcyI6ICJeNy4yOC42IgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuOS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvaGVscGVyLW1vZHVsZS10cmFuc2Zvcm1zIjogewogICAgICAidmVyc2lvbiI6ICI3LjI4LjYiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2hlbHBlci1tb2R1bGUtdHJhbnNmb3Jtcy8tL2hlbHBlci1tb2R1bGUtdHJhbnNmb3Jtcy03LjI4LjYudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNjdvWEZBWXIyY0RMRFZHTFhURUFCamRCSlo2ZHJFbFVTSTdXS3A3ME5ycHlJU3NvM3BsRzlTQUdFRjZ5N3piaGEvd096VUJ5V1dUSnZFRFZOSVVHY0E9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvaGVscGVyLW1vZHVsZS1pbXBvcnRzIjogIl43LjI4LjYiLAogICAgICAgICJAYmFiZWwvaGVscGVyLXZhbGlkYXRvci1pZGVudGlmaWVyIjogIl43LjI4LjUiLAogICAgICAgICJAYmFiZWwvdHJhdmVyc2UiOiAiXjcuMjguNiIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02LjkuMCIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBiYWJlbC9jb3JlIjogIl43LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGJhYmVsL2hlbHBlci1wbHVnaW4tdXRpbHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMjguNiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvaGVscGVyLXBsdWdpbi11dGlscy8tL2hlbHBlci1wbHVnaW4tdXRpbHMtNy4yOC42LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVM5Z3paL2J6ODNHUnlzSTdnQUQ0d1BUL0FJM3VDblkrOXhuK014L0tQczJKd0hKSXoxVzhQWmtnMmNxeXQzUk5PQk04ZWpjWGhWNnk4T2c3bHkvRHVnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02LjkuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGJhYmVsL2hlbHBlci1zdHJpbmctcGFyc2VyIjogewogICAgICAidmVyc2lvbiI6ICI3LjI3LjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2hlbHBlci1zdHJpbmctcGFyc2VyLy0vaGVscGVyLXN0cmluZy1wYXJzZXItNy4yNy4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFNbFN4S2JwUmxBcmlkREV4azkyblNvYnlEZHBQaWpVcTJEVzZvRG5VcWQwaU9HeG1RanlxaE1JaWhJOSt6djRMUHlaZFJqZTJjYXZXUGJDYldtM2VBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02LjkuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGJhYmVsL2hlbHBlci12YWxpZGF0b3ItaWRlbnRpZmllciI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yOC41IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9oZWxwZXItdmFsaWRhdG9yLWlkZW50aWZpZXIvLS9oZWxwZXItdmFsaWRhdG9yLWlkZW50aWZp' +
'ZXItNy4yOC41LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFTczRpZnd6S0pTVjM5dWNOanN2YzZXVkhzNmI3UzAzc09oMk9jSEY5VUhmVlBxV1dBTFVzTlVWemhTQmlJdGpSWm9MSHg3bklhclZqcUtWdXNVWjFRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02LjkuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGJhYmVsL2hlbHBlci12YWxpZGF0b3Itb3B0aW9uIjogewogICAgICAidmVyc2lvbiI6ICI3LjI3LjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2hlbHBlci12YWxpZGF0b3Itb3B0aW9uLy0vaGVscGVyLXZhbGlkYXRvci1vcHRpb24tNy4yNy4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVl2akpvdzlGeGJoRkZLRFN1Rm5WQ2UyV3hYazF6V2MyMmZGZVBWTkVhV0pFdThJclpWbGRhNk4wdUh3elpyVU0xaWw3TkM5TWxwNE1hSlliWWQ5SlNnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02LjkuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGJhYmVsL2hlbHBlcnMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMjguNiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvaGVscGVycy8tL2hlbHBlcnMtNy4yOC42LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhPQnZ3cTg2SEhkQjdXVURUZktmVC9WdXhoN2dFbFErU2Z0aTJDeTZ5SVdOVzA1UDhpVXNsT1ZjWjQvc0tiRSsvalFhdWtRQWR6L2dmMzcyNGtZZHF3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL3RlbXBsYXRlIjogIl43LjI4LjYiLAogICAgICAgICJAYmFiZWwvdHlwZXMiOiAiXjcuMjguNiIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02LjkuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGJhYmVsL3BhcnNlciI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yOS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9wYXJzZXIvLS9wYXJzZXItNy4yOS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUl5RGdGVjVHZURVVlg0WWRGLzNDUFVMdFZHU1hYTUxoMXhWSWdkQ2d4QXBrdHFuUVYwcjcvOE5xdGhnKzhZTEdhQXRkeUlsbzJxSWRacmJDdjQrN3d3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL3R5cGVzIjogIl43LjI5LjAiCiAgICAgIH0sCiAgICAgICJiaW4iOiB7CiAgICAgICAgInBhcnNlciI6ICJiaW4vYmFiZWwtcGFyc2VyLmpzIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvcGx1Z2luLXRyYW5zZm9ybS1yZWFjdC1qc3gtc2VsZiI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yNy4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXJlYWN0LWpzeC1zZWxmLy0vcGx1Z2luLXRyYW5zZm9ybS1yZWFjdC1qc3gtc2VsZi03LjI3LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNlV6a0NzK2VqR2RaNW1GRkMvT0NVcnYwMjhhYjJmcDF6blptQ1pqQU9CS2lCSzJqWEQxTytCUFNmWDhYMnFqSjc1ZlpCTVNuUW4zUnEybXJCSksybXc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvaGVscGVyLXBsdWdpbi11dGlscyI6ICJeNy4yNy4xIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuOS4wIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL2NvcmUiOiAiXjcuMC4wLTAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BiYWJlbC9wbHVnaW4t' +
'dHJhbnNmb3JtLXJlYWN0LWpzeC1zb3VyY2UiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMjcuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvcGx1Z2luLXRyYW5zZm9ybS1yZWFjdC1qc3gtc291cmNlLy0vcGx1Z2luLXRyYW5zZm9ybS1yZWFjdC1qc3gtc291cmNlLTcuMjcuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi16YndvVHNCcnVUZUtCOWhTcTczaGE2NmlGZUpIdWFGa1Vid3ZxRWxueWdvTmJqL2pIUnNTZW9rb3daRk4zQ1o2NEl2RXFjbW1rVmU4OU9QWGM3bGRBdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBiYWJlbC9oZWxwZXItcGx1Z2luLXV0aWxzIjogIl43LjI3LjEiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49Ni45LjAiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvY29yZSI6ICJeNy4wLjAtMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGJhYmVsL3RlbXBsYXRlIjogewogICAgICAidmVyc2lvbiI6ICI3LjI4LjYiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL3RlbXBsYXRlLy0vdGVtcGxhdGUtNy4yOC42LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlBNk1hMktzQ2RHYitXQzZVcEJWRkpHWEw1OE1EQTZveU9OYmp5Ri8rNXNCZ3hZL2R3a2hMb2diTVQyR1hYeVU4NC9JaFJ3LzJEMU9zMUIvZ2l6K0JRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL2NvZGUtZnJhbWUiOiAiXjcuMjguNiIsCiAgICAgICAgIkBiYWJlbC9wYXJzZXIiOiAiXjcuMjguNiIsCiAgICAgICAgIkBiYWJlbC90eXBlcyI6ICJeNy4yOC42IgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuOS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvdHJhdmVyc2UiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMjkuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvdHJhdmVyc2UvLS90cmF2ZXJzZS03LjI5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNEhQaVFyMFg3K3dhSGZ5WFBacFdQZldML0o3ZGNOMW14OWdMNldkUVZNYlBuRjMrWmhTTXM4dEN4TjdvSGRkSkU5ZmhORTcrbHhkbmx5ZW1LZkpSdUE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvY29kZS1mcmFtZSI6ICJeNy4yOS4wIiwKICAgICAgICAiQGJhYmVsL2dlbmVyYXRvciI6ICJeNy4yOS4wIiwKICAgICAgICAiQGJhYmVsL2hlbHBlci1nbG9iYWxzIjogIl43LjI4LjAiLAogICAgICAgICJAYmFiZWwvcGFyc2VyIjogIl43LjI5LjAiLAogICAgICAgICJAYmFiZWwvdGVtcGxhdGUiOiAiXjcuMjguNiIsCiAgICAgICAgIkBiYWJlbC90eXBlcyI6ICJeNy4yOS4wIiwKICAgICAgICAiZGVidWciOiAiXjQuMy4xIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuOS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AYmFiZWwvdHlwZXMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMjkuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvdHlwZXMvLS90eXBlcy03LjI5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTHdkWkhwU2NNNFF6OFh3MmlLU3pTK2NmZ2xaekpHdm9mUUlDeTdXN3Y0Y2FydTRFYUFteVV1TzZCR3JieVEybVlWMTFXMFU4ajVtQmhkMTRkZDNCMEE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAYmFiZWwvaGVscGVyLXN0cmluZy1wYXJzZXIiOiAiXjcuMjcuMSIsCiAgICAgICAgIkBiYWJlbC9oZWxwZXItdmFsaWRhdG9yLWlkZW50aWZpZXIiOiAiXjcuMjguNSIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02LjkuMCIKICAgICAgfQogICAgfSwKICAg' +
'ICJub2RlX21vZHVsZXMvQGVzYnVpbGQvYWl4LXBwYzY0IjogewogICAgICAidmVyc2lvbiI6ICIwLjI3LjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGVzYnVpbGQvYWl4LXBwYzY0Ly0vYWl4LXBwYzY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05ZkpNVE5GVFdaTWg1cXdyQkl0dXppdTgzNGVPQ1VjRXF5bVNIN3BZK3pvTVZFWmczZ2NQdUJOeEgxRXZmVlllOWgweC9QdHc4S0J6djdxeGI3bDhkZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAicHBjNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiYWl4IgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNidWlsZC9hbmRyb2lkLWFybSI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2FuZHJvaWQtYXJtLy0vYW5kcm9pZC1hcm0tMC4yNy4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWk1RDFoUFk3R0lRbVhsWGhzMnc4QVdIaGVuYjAwK0d4anhSbmNTMlpNN1lOVkdOZmFNeGd6U0d1TzhvOFNKelJjL29ad1UyYmNTY3ZWRVJrMDNRaHpBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm0iCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiYW5kcm9pZCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvYW5kcm9pZC1hcm02NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2FuZHJvaWQtYXJtNjQvLS9hbmRyb2lkLWFybTY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZZGdoUFlVbWovRlgyU1lLSjBPWnhmK2lhS2dNc0tIVlBGMU1BcS9QOFdpcm5TcENTdHpLSkZqT2p6c1cwUVE3b0lBaWNjSGRjcWpiSG1KeFJiL2RtZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiYW5kcm9pZCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvYW5kcm9pZC14NjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC9hbmRyb2lkLXg2NC8tL2FuZHJvaWQteDY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1JTi8wQk5Ua0h0azhsa09NOEpXQVlGZzRPUnhCa1pRZjl6WGlFT2ZFUlgvQ3p4VzNWZzFld0FoVTdRU1dRcFZJelRXK2I4WHkrbEd6ZFlYVjZVWk9iUT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImFuZHJvaWQiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL2Rhcndpbi1hcm02NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2Rhcndpbi1hcm02NC8tL2Rhcndpbi1hcm02NC0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmU0OTFrN0J5VFZSeTB0M0VLV2FqZExJcjBnejJrS0tmemFma3RoNFE4QTVuMXhUSHJrcVpnTExqRkVIVkQrQVhkVUdnUU1xK0dvZGZxNDVtR3BDS2c9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybTY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAg' +
'ICAgICAgImRhcndpbiIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvZGFyd2luLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2Rhcndpbi14NjQvLS9kYXJ3aW4teDY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12SGsvaEE3LzFBY2tqR3pScWk2d2JvK2phU2h6Um93WWlwNnJ0NnE3VllFRFg0TEV5MXBaZkRwZHhDQm5HdGwrQTV6cThpWERjeXV4d3R2M2hOdEhGZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImRhcndpbiIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvZnJlZWJzZC1hcm02NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2ZyZWVic2QtYXJtNjQvLS9mcmVlYnNkLWFybTY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pcFRZTTJmanQza1FBWU92bzZ2Y3hKeDNuQllBelBqZ1RDazdRRWdaRzhBVU8zeWRVaHZlbG1ocmJPaGVNbkdPbGFTRlVvSFhCNnVuK0E3cTR5Z1k5dz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiZnJlZWJzZCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvZnJlZWJzZC14NjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC9mcmVlYnNkLXg2NC8tL2ZyZWVic2QteDY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kRGswWDg3VDdtSTZVM0s5VmpXdEhPWHF3QU1KQk5OMnI3YmVqRHNjK2owM1NFanREOUhyT2w4Z1ZGQnllTTBhSmtzb1V1VVZVOVRCYVphMnJnajBvQT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImZyZWVic2QiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL2xpbnV4LWFybSI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2xpbnV4LWFybS8tL2xpbnV4LWFybS0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItczZuUHYyUWtTdXBKd0xZeWZTK2d3ZGlybTB1a3lURk5sM0tUZ1pFQWlKRGQraUhaY2JUUFBjV0NjUllIK1dsTmJ3Q2hnSDJRa0U5TlNsTnJNVDhHZnc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybSIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvbGludXgtYXJtNjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC9saW51eC1hcm02NC8tL2xpbnV4LWFybTY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zWk91RnoveFduWjRLSDNZZkZyS0NmMVd5UFpIYWtWelRpcWppM1dEYzBCQ2wya0J3aUpMQ1hwekx6VUJMZ21wNHZlRlpkdk41Q2hXNEVxLzhGYzJGZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJt' +
'NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL2xpbnV4LWlhMzIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC9saW51eC1pYTMyLy0vbGludXgtaWEzMi0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUdsUVlqZHh0TGRoMGEzakhqdXdPcnhRak9aWUQvQzlQZmRiZ0pKRjNUSVpXbm0vdE1kL1JjTmlMbmdpdTRpd2NCQU9lemRuU0xBd1FEUHFUbXRUWWc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImlhMzIiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL2xpbnV4LWxvb25nNjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC9saW51eC1sb29uZzY0Ly0vbGludXgtbG9vbmc2NC0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItV082MFNuOGx5M2d0emh5akFURGdpZUpOZXQvS3FzRGxYNW5SQzVZM29URmNTMWwwS1diYStTRWE5SmExR2ZEcVNGMXo2aGlmL1NrcFFKYkw2M2NnT0E9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImxvb25nNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL2xpbnV4LW1pcHM2NGVsIjogewogICAgICAidmVyc2lvbiI6ICIwLjI3LjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGVzYnVpbGQvbGludXgtbWlwczY0ZWwvLS9saW51eC1taXBzNjRlbC0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItQVBzeW1ZQTZzR2NaNHBENmsrVXhiRGpPRlN2UFd5WmhqYWlQeWwvZjc5eEt4d1Rucm41UVVuWFI1cHJ2ZXR1YVNNc2I0amdlSGV3SURDSVdsanJTeHc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIm1pcHM2NGVsIgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImxpbnV4IgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNidWlsZC9saW51eC1wcGM2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2xpbnV4LXBwYzY0Ly0vbGludXgtcHBjNjQtMC4yNy4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVpekJuVGVCZWZvanREYjluU2g0dnZWUTNWOVFmOURmMDFQZmF3UGNSekpINGdGU2dyT2J3K0x2ZVV5RG9LVTNreGk1KzlSSlRDV2xqNEZqWVhWUEVBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJwcGM2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvbGludXgtcmlzY3Y2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2xpbnV4LXJpc2N2NjQvLS9saW51eC1yaXNjdjY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zRW13aDByNXdtZm0zc3NU' +
'V1JRU3lWaGJPSHZxZWdVRFJkMFdobVhLWDJta0hKZTFTRkNNSmhhZ1VsZU1xK1VjaTM0d0xTaXBmOExhZ3Q0TGxwUkZXUT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAicmlzY3Y2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvbGludXgtczM5MHgiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC9saW51eC1zMzkweC8tL2xpbnV4LXMzOTB4LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1wQkhVeDlMelhXQmM3TUZJRUVMMHlEL1pWdE5nTHl0dng2MGdFUzI4R2NXTXFpbDhFbENZUjRrdmJWMkJEcXNIT3ZWRFJyT3hHeVNCTTlGY3Y3NDRodz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiczM5MHgiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL2xpbnV4LXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL2xpbnV4LXg2NC8tL2xpbnV4LXg2NC0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItQ3ppOHl6WFVXSVFZQXRMLzJ5NnZvZ0VSOHB2Y3NPc2s1Y3B3TDRHazVuSnFINVVaaVZCeUlZOEVvcm01UjEzZ3ErRFFLWWcwK0p5UW95dExRYXM0ZEE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvbmV0YnNkLWFybTY0IjogewogICAgICAidmVyc2lvbiI6ICIwLjI3LjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGVzYnVpbGQvbmV0YnNkLWFybTY0Ly0vbmV0YnNkLWFybTY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zRHBrMFJnbVRDUi81SGd1SVphOW45dStIVktmNDBmYkVVdCtpVHpTbkNhR3ZZOWtGUDBZS0JXWnRKYXJhb25GbnFlZjVTbEo4L1RpUEF4enlTK1VvQT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibmV0YnNkIgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNidWlsZC9uZXRic2QteDY0IjogewogICAgICAidmVyc2lvbiI6ICIwLjI3LjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGVzYnVpbGQvbmV0YnNkLXg2NC8tL25ldGJzZC14NjQtMC4yNy4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVAxNGxGS0psL0RkYUUwMExJdEF1a1VkWk81aXFOSDcrUGpvQm0rZkxRanR4ZmNmRkUyMFhmNUNyTHNtWmRxNUxGRlp6YjVKTVo5Z3JVd3Z0Vll6amlBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibmV0YnNkIgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNidWlsZC9vcGVuYnNkLWFybTY0IjogewogICAgICAidmVyc2lvbiI6ICIwLjI3LjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGVzYnVpbGQvb3BlbmJz' +
'ZC1hcm02NC8tL29wZW5ic2QtYXJtNjQtMC4yNy4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFJY01QNzdBdmlyR2JSbC9VWkZUcTVoalhLKzJ3QzdxRlJHb0hTRHJaNXY1YjhESy9HWXBYVzNDUFJMNTNOa3ZEcWI5RCthbEJpQy9kVjBGYjdlSmN3PT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJvcGVuYnNkIgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNidWlsZC9vcGVuYnNkLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL29wZW5ic2QteDY0Ly0vb3BlbmJzZC14NjQtMC4yNy4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURuVzJzUnJCekErWW5FNzBMS3FuTTNQK3o4dmVoZkpXSFhFQ2J3Qm1IL0NVNTF6NkZpcVRRVEhGZW5QbEhtbzNhOFVncEx5SDNQVCs4N09WaU9oMUFRPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAib3BlbmJzZCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvb3Blbmhhcm1vbnktYXJtNjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC9vcGVuaGFybW9ueS1hcm02NC8tL29wZW5oYXJtb255LWFybTY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OaW5BRWdyL2V0RVJQVHNaSjdhRVpRdnZnL0E2SXNaRy9MZ1p5Kzgxd09OMmh1VjdTckszZTYzZFUwWGh5WlA0UktHeVRtN2FPZ21RazBiR3AwZnkyZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAib3Blbmhhcm1vbnkiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL3N1bm9zLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL3N1bm9zLXg2NC8tL3N1bm9zLXg2NC0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItUGFuWituRXorZVdvQko4L2Y4SEt4VFREMTcyU0t3ZFhlYlowbmRkOTUzZ3QxSFJCYmhNc2FOcWpUeVlMR0xQZG9XSHk0ekxVN2JEVkp6dEY1ZjNCSEE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJzdW5vcyIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzYnVpbGQvd2luMzItYXJtNjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC93aW4zMi1hcm02NC8tL3dpbjMyLWFybTY0LTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CMnQ1OWxXV1lyYlJEdy90amlXT3V6U3NGaDFZL0U5NW9mS3o3cklWWVNRa1VZQmpmU2dmNm9lWVBOV0hUb0ZScjJ6eDUySktBcEljQVMvRDVUVUJuQT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL3dp' +
'bjMyLWlhMzIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjcuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNidWlsZC93aW4zMi1pYTMyLy0vd2luMzItaWEzMi0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItUUxLU0ZlWE5TOCt0SFc3dFpwTXRqbE5iN0hLYXUwUURwd200OXUwdlVwOXkxV09GK1BFemtVODR5OUdxWWFBVlc4YUg4ZjNHY0JjazI2amg1NGNYNFE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImlhMzIiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2J1aWxkL3dpbjMyLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2J1aWxkL3dpbjMyLXg2NC8tL3dpbjMyLXg2NC0wLjI3LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNHVKR2hzeHVwdHUzT2NwVkF6bGkrL2dXdXNWR3daWkhUbFM2M2hoKytlaEV4a1ZUOFNnaUVmNy91Qy9QY2xyUFBrTGhacUdnQ1RqZDBWV0xvNnhNcUE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJ3aW4zMiIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzbGludC1jb21tdW5pdHkvZXNsaW50LXV0aWxzIjogewogICAgICAidmVyc2lvbiI6ICI0LjkuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNsaW50LWNvbW11bml0eS9lc2xpbnQtdXRpbHMvLS9lc2xpbnQtdXRpbHMtNC45LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcGhyWW1OaVlwcFI3em5GRWRxZ2ZXSFhSNk5Da1pFSzdod1dESFpVaml0LzIvVTByNlh2a0RsMFNZbm9NNTFIcTdGaENHZExEVDZ6eENDT1kxaGV4c1E9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogIl4zLjQuMyIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjEyLjIyLjAgfHwgXjE0LjE3LjAgfHwgPj0xNi4wLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vZXNsaW50IgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZXNsaW50IjogIl42LjAuMCB8fCBeNy4wLjAgfHwgPj04LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzbGludC1jb21tdW5pdHkvZXNsaW50LXV0aWxzL25vZGVfbW9kdWxlcy9lc2xpbnQtdmlzaXRvci1rZXlzIjogewogICAgICAidmVyc2lvbiI6ICIzLjQuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdmlzaXRvci1rZXlzLy0vZXNsaW50LXZpc2l0b3Ita2V5cy0zLjQuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi13cGMrTFhlaXlpaXN4UGxFa1V6VTZzdnlTMWZySU8zTWd4ajFmZHk3UG04WWd6Z3VheDJOM0ZhL0QvYWcxV3FiT3ByZEkrdVk2d01VbDgvYTJHK2lhZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTIuMjIuMCB8fCBeMTQuMTcuMCB8fCA+PTE2LjAuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9lc2xpbnQiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2xpbnQtY29tbXVuaXR5L3JlZ2V4cHAiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMTIuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNsaW50LWNvbW11bml0eS9yZWdleHBwLy0v' +
'cmVnZXhwcC00LjEyLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItRXJpU1RsdDVPQzkvN1NYa1JTQ0FoZlN4eG9TVWdCbTMzT0grSWt3YmRwZ29xc1NzVWc3eTN1aCtJSUNJL1FnNEJCV3IzVTJpMzlScG15Y2J4TXE0ZXc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTIuMC4wIHx8IF4xNC4wLjAgfHwgPj0xNi4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2xpbnQvY29uZmlnLWFycmF5IjogewogICAgICAidmVyc2lvbiI6ICIwLjIxLjIiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGVzbGludC9jb25maWctYXJyYXkvLS9jb25maWctYXJyYXktMC4yMS4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5KbDJLR1RscmY5R2pMaW1nSXJ1K1YvbXpnU0swQUJDRFFSdnh3NUJqVVJMN1dmSDV1b1dtaXpiSDdRQjZNbW5NQmQ4Y0lDOXVjZVduZXpMMVZaV1d3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBlc2xpbnQvb2JqZWN0LXNjaGVtYSI6ICJeMi4xLjciLAogICAgICAgICJkZWJ1ZyI6ICJeNC4zLjEiLAogICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMS41IgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNsaW50L2NvbmZpZy1oZWxwZXJzIjogewogICAgICAidmVyc2lvbiI6ICIwLjQuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNsaW50L2NvbmZpZy1oZWxwZXJzLy0vY29uZmlnLWhlbHBlcnMtMC40LjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZ0JyeE44OGdPSWYzUjdqYTVLOXNsd05heVZjWmdLNlNPVU9SbTJ1QnpUZUlFZmVWYUloT3BDdFRveDNQNlI3bzJqTEZ3TEZUTG5DN2tVL1JHY1lFZ3c9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGVzbGludC9jb3JlIjogIl4wLjE3LjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2xpbnQvY29yZSI6IHsKICAgICAgInZlcnNpb24iOiAiMC4xNy4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2xpbnQvY29yZS8tL2NvcmUtMC4xNy4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlML3NMcnBtdERhRkVpVWoxb3NSUDRUSTJNRHoxQWRkSkwralo3S1NxdkJ1bGlONHhxWVk1NElmZE44cUQ4VG9hNmcxaWxvcGgxZnhRTmtqT3hycnBRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkB0eXBlcy9qc29uLXNjaGVtYSI6ICJeNy4wLjE1IgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNsaW50L2VzbGludHJjIjogewogICAgICAidmVyc2lvbiI6ICIzLjMuNSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNsaW50L2VzbGludHJjLy0vZXNsaW50cmMtMy4zLjUudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNElsSngwWDBxZnRWc041RSsvdkd1alRSSUZ0d3VMYk5zVlVlN1RPNnpZUERSMU82bkZ3dndoSUtFS1NybDZkWmNobVlCSVRhenhLb1VZT2pkdGpsUmc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJhanYiOiAiXjYuMTQuMCIsCiAgICAgICAgImRlYnVnIjogIl40LjMuMiIsCiAgICAgICAgImVzcHJlZSI6ICJeMTAuMC4xIiwKICAgICAgICAiZ2xvYmFscyI6ICJeMTQuMC4wIiwKICAgICAgICAiaWdub3JlIjogIl41LjIuMCIsCiAgICAg' +
'ICAgImltcG9ydC1mcmVzaCI6ICJeMy4yLjEiLAogICAgICAgICJqcy15YW1sIjogIl40LjEuMSIsCiAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4xLjUiLAogICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIl4zLjEuMSIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjE4LjE4LjAgfHwgXjIwLjkuMCB8fCA+PTIxLjEuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9lc2xpbnQiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2xpbnQvZXNsaW50cmMvbm9kZV9tb2R1bGVzL2dsb2JhbHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjE0LjAuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWxzLy0vZ2xvYmFscy0xNC4wLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItb2FoR3Z1TUdRbFB3L2l2SVlCalZTcldBZldMQmVrdTV0cFBFMmZPUExpK1dIZmZJV2J1aDJ0Q2poeVFoVEJQTWY1RTlqREVINEZPbVRZZ1l3Ykt3dFE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4IgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9zaW5kcmVzb3JodXMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Blc2xpbnQvanMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjkuMzkuNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNsaW50L2pzLy0vanMtOS4zOS40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5FN0RFSWNodnRpRlR3Qnc0TGZidTU5UEcra0NvZmhqc0thQ1d6eFRwdDRsZlJqUk1xRzZ1TUJ6S1h1RWN5WGhPSG9VcDlyaUFtNy9hV1lHaFhaOWN3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjE4LjE4LjAgfHwgXjIwLjkuMCB8fCA+PTIxLjEuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL2VzbGludC5vcmcvZG9uYXRlIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AZXNsaW50L29iamVjdC1zY2hlbWEiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMS43IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Blc2xpbnQvb2JqZWN0LXNjaGVtYS8tL29iamVjdC1zY2hlbWEtMi4xLjcudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVnRBT2F5bVdWZlpjbVpicDZFMm15bXBESUh2eWpYcy8xMkxxV1lqVnc2cWpyZkYrVksrZnlHMzNrQ2h6M25uSytTVTUvTmVIT3FyVEVIUzhzWE8zT0E9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjE4LjE4LjAgfHwgXjIwLjkuMCB8fCA+PTIxLjEuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGVzbGludC9wbHVnaW4ta2l0IjogewogICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AZXNsaW50L3BsdWdpbi1raXQvLS9wbHVnaW4ta2l0LTAuNC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTQzL3F0ckRVb2tyN0xKcW9GMmMzK1JJbnUvdDR6ZnJwWWRvU0RmWXloZzUycndMVjZUbk92ZEc0ZlhtN0lrU0Izd0Vya2NtSlM5aUVoalZ0T1NFampBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBlc2xpbnQvY29yZSI6ICJeMC4xNy4wIiwKICAgICAgICAibGV2biI6ICJeMC40LjEiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BodW1hbmZzL2NvcmUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMTkuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9A' +
'aHVtYW5mcy9jb3JlLy0vY29yZS0wLjE5LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNUR5UTQrMUpFVXplamVLMUpHSUNjaWRleWZVYkdpeGdTOWpOZ2V4NW5xa1crY1k3V1poeEJpZ21pZU41UW53OVpvc1NOVkM5S1FLeWIrR1VhR3lLVUE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOC4xOC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AaHVtYW5mcy9ub2RlIjogewogICAgICAidmVyc2lvbiI6ICIwLjE2LjciLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGh1bWFuZnMvbm9kZS8tL25vZGUtMC4xNi43LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS96VXgreU9zSXJHNFk0M0VoMnBlRGVLQ3hsUnQvZ0VUNmFIZmFLcHVxMjY3cVhkWURGVmlWSGZNYUx5eWdaT25sMGtHV3hGSWdzQnk4UUZ1VExVWEVRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBodW1hbmZzL2NvcmUiOiAiXjAuMTkuMSIsCiAgICAgICAgIkBodW1hbndob2NvZGVzL3JldHJ5IjogIl4wLjQuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOC4xOC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AaHVtYW53aG9jb2Rlcy9tb2R1bGUtaW1wb3J0ZXIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BodW1hbndob2NvZGVzL21vZHVsZS1pbXBvcnRlci8tL21vZHVsZS1pbXBvcnRlci0xLjAuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ieHZlVjRWOHY1WWI0bmNGVFQzclBTZ1pCT3BDa2pmSzB5NG9WVlZKd0l1RFZCUk1EWHJQeVhSTDk4OGk1YXA5bTlibnlFRWpXZm01V2tCbXRmZkxmQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEyLjIyIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJnaXRodWIiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL256YWthcyIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGh1bWFud2hvY29kZXMvcmV0cnkiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuNC4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BodW1hbndob2NvZGVzL3JldHJ5Ly0vcmV0cnktMC40LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItYlYwVGdvOUs0aGZQQ2VrK2FNQW44MVJwcEZLdjJ5U0RRZU1vU1p1dlRBU3l3TlRuVkpDQXJDWkUyRldxcHZJYXRLdTdWTVJMV2xSMUVhenZWaER5aFE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOC4xOCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAiZ2l0aHViIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9uemFrYXMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL2dlbi1tYXBwaW5nIjogewogICAgICAidmVyc2lvbiI6ICIwLjMuMTMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGpyaWRnZXdlbGwvZ2VuLW1hcHBpbmcvLS9nZW4tbWFwcGluZy0wLjMuMTMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItMmtrdC83bmlKNk1nRVB4RjBiWWRRNmV0WmFBK2ZRdkRjTEtja2h5MXlJUU96YW9LakJCalNqNjMvYUxWallFM3FoUnQ1ZHZNK3VVeWZDZzZVS0NCYkE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYyI6ICJeMS41LjAiLAogICAgICAgICJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nIjogIl4wLjMuMjQiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3JlbWFwcGluZyI6IHsKICAg' +
'ICAgInZlcnNpb24iOiAiMi4zLjUiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGpyaWRnZXdlbGwvcmVtYXBwaW5nLy0vcmVtYXBwaW5nLTIuMy41LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUxJOXUvK2xhWUc0RHMxVERLU0pXMllQcklsY1ZZT3dpMmZVQzZ4QjQzbHVlQ2pneFY0bGZmT0NaQ3RZRmlINlROT1grdFFLWHg5N1Q0SUtIYmh5SEVRPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAanJpZGdld2VsbC9nZW4tbWFwcGluZyI6ICJeMC4zLjUiLAogICAgICAgICJAanJpZGdld2VsbC90cmFjZS1tYXBwaW5nIjogIl4wLjMuMjQiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BqcmlkZ2V3ZWxsL3Jlc29sdmUtdXJpIjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AanJpZGdld2VsbC9yZXNvbHZlLXVyaS8tL3Jlc29sdmUtdXJpLTMuMS4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJSSVNnQ0lqUDIwL3RiV1NQV01FaTU0UVZQUlpFeGt1RDlsSkwrVUl4VUt0d1ZKQTh3VzFUcmIxak1zMVJGWG8xQ0JUTlovNWhwQzlRdm1LV2RvcEt3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AanJpZGdld2VsbC9zb3VyY2VtYXAtY29kZWMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuNS41IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BqcmlkZ2V3ZWxsL3NvdXJjZW1hcC1jb2RlYy8tL3NvdXJjZW1hcC1jb2RlYy0xLjUuNS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jWVE5MzEwZ3JxeHVlV2JsK1d1SVVJYWlVYURjajdXT3E1ZlZoRWxqTlZnUmZPVWhZOWZ5MnpUdmZvcVdzbmViaDhTbDcwVlNjRmJJQ3ZKbkxLQjBPZz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvQGpyaWRnZXdlbGwvdHJhY2UtbWFwcGluZyI6IHsKICAgICAgInZlcnNpb24iOiAiMC4zLjMxIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BqcmlkZ2V3ZWxsL3RyYWNlLW1hcHBpbmcvLS90cmFjZS1tYXBwaW5nLTAuMy4zMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi16ek5SK1NkUVNESnpjOGpvYWVQOFFRb0NRcjhOdVl4MmRJSXl0bDFRZUJFWkhKOXVXNmhlYnNyWWdiejhoSndVUWFvM1RXQ010bWZWOE51MXR3T0xBdz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGpyaWRnZXdlbGwvcmVzb2x2ZS11cmkiOiAiXjMuMS4wIiwKICAgICAgICAiQGpyaWRnZXdlbGwvc291cmNlbWFwLWNvZGVjIjogIl4xLjQuMTQiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0ByZWR1eGpzL3Rvb2xraXQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMTEuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AcmVkdXhqcy90b29sa2l0Ly0vdG9vbGtpdC0yLjExLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItS2Q2a0FIVEE2L25VcHA4bXlTUHFqM2VuM2RtMHRkTUlnYnR0blExeEZNVnB1Zm9qK0FEaThwWExCc2Q0eHpUUkhRYTd0L0p2OFc1VW5DdVc0a3VXTVE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBzdGFuZGFyZC1zY2hlbWEvc3BlYyI6ICJeMS4wLjAiLAogICAgICAgICJAc3RhbmRhcmQtc2NoZW1hL3V0aWxzIjogIl4wLjMuMCIsCiAgICAgICAgImltbWVyIjogIl4xMS4wLjAiLAogICAgICAgICJyZWR1eCI6ICJeNS4wLjEiLAogICAgICAgICJyZWR1eC10aHVuayI6ICJeMy4xLjAiLAogICAgICAgICJyZXNlbGVjdCI6ICJeNS4xLjAiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJyZWFjdCI6ICJeMTYuOS4wIHx8IF4xNy4wLjAgfHwgXjE4IHx8IF4xOSIsCiAgICAgICAgInJlYWN0LXJlZHV4IjogIl43LjIuMSB8fCBeOC4xLjMgfHwgXjkuMC4wIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llc01ldGEiOiB7CiAgICAgICAg' +
'InJlYWN0IjogewogICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgInJlYWN0LXJlZHV4IjogewogICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJlZHV4anMvdG9vbGtpdC9ub2RlX21vZHVsZXMvaW1tZXIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjExLjEuNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbW1lci8tL2ltbWVyLTExLjEuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1YUkVGQ1BvNmtzeFZ6UDRFMGVrRDVhTWRmOFdNd21kTmF6NnZ1dnhnSTQwVWFFaXU2cTNwOFg1MmFVNkdkeXZMWTNYWFgvOFI3Sk9UWFN0ei9uQmJSdz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vaW1tZXIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsZG93bi9wbHVnaW51dGlscyI6IHsKICAgICAgInZlcnNpb24iOiAiMS4wLjAtcmMuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9Acm9sbGRvd24vcGx1Z2ludXRpbHMvLS9wbHVnaW51dGlscy0xLjAuMC1yYy4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWV5YmszVGp6enpWOTdEbGo1YytYckJGVzU3ZVROaHpvZDY2eTlIckJseko2TnNDcldDcC8ya2FQUzNLOXdKbXVyQkMwVGR3NHlQalhLWnFsem5pbTNRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtYW5kcm9pZC1hcm0tZWFiaSI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWFuZHJvaWQtYXJtLWVhYmkvLS9yb2xsdXAtYW5kcm9pZC1hcm0tZWFiaS00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItdXBuTkJrQTZaSDJWS0djQmo5RnlsOUlHTlBVTGNqWFJsZzBMTGVhaW9RV3VlSDMwcDZJWHRKRWJLQWd2eXYrbUphTXhTbTFsNnh3RFhZanBFTWlMTWc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybSIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJhbmRyb2lkIgogICAgICBdCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9Acm9sbHVwL3JvbGx1cC1hbmRyb2lkLWFybTY0IjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHJvbGx1cC9yb2xsdXAtYW5kcm9pZC1hcm02NC8tL3JvbGx1cC1hbmRyb2lkLWFybTY0LTQuNTkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oWitaeGozU3lTbTRBL0R5bHNES1pBZVZnMG12aSsrMFBZVmNlVnlYN2hlbWt3N09yZUtkQ3ZXMm9RM1QxRk1adkNhUVhxT1RIYjhxbUJTaG9xazY5UT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiYW5kcm9pZCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtZGFyd2luLWFybTY0IjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHJvbGx1cC9yb2xsdXAtZGFyd2luLWFybTY0Ly0vcm9sbHVwLWRhcndpbi1hcm02NC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVzJQc25iaDFKOFpKdzB4S0FkOHpkTmdGOUhSTGtkV3d3ZFdxdWJTVmswcFV1UWtvSG52N3J4NEdpRjlyVDR0NURJWkdBc0NvblJFM0F4Q2RKNG04cmc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybTY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImRhcndpbiIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtZGFy' +
'd2luLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWRhcndpbi14NjQvLS9yb2xsdXAtZGFyd2luLXg2NC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItWlcyS2t3bFM0bHdUdjdaVnNZRGlBUmZGQ25TR2h6WVBkaU9VNElNMmZEYkwrUUdseUFiamdTRnVxTlJiU3RoeWJMYklKOTE1VXRaQnRtdUxyUUFUL3c9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJkYXJ3aW4iCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLWZyZWVic2QtYXJtNjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuNTkuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9Acm9sbHVwL3JvbGx1cC1mcmVlYnNkLWFybTY0Ly0vcm9sbHVwLWZyZWVic2QtYXJtNjQtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUVzS2FKNXl0QXU5akkzbG9uem4zQmdHOGlSQmpWNEx4WmV4eWdjUWJwaVUwd1UwQVR4aE5WRXBYS2ZVYTBwUzA1Z1RjU0RNS3BuM1N4K1FCOVJsVFRBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJmcmVlYnNkIgogICAgICBdCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9Acm9sbHVwL3JvbGx1cC1mcmVlYnNkLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWZyZWVic2QteDY0Ly0vcm9sbHVwLWZyZWVic2QteDY0LTQuNTkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kM0R1WmkyS3pUTWpJbXJ4b0hJQU9EVVpZb1VVTXN1VWlZNFNSUmNKeTZOSm9aNmlJcVduSnU5SVNjVjlqWHlzeUdNVnVXK0tOelp2QkxPY3BkbDNWZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImZyZWVic2QiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLWxpbnV4LWFybS1nbnVlYWJpaGYiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuNTkuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9Acm9sbHVwL3JvbGx1cC1saW51eC1hcm0tZ251ZWFiaWhmLy0vcm9sbHVwLWxpbnV4LWFybS1nbnVlYWJpaGYtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXQ0T05IYm9YaS8zRTByVDZPWmwxcEtibDJWZ3hmOXZKZldnbVVvQ0VWUVZ4aFc2Q3cvYzhJNmhiYnU3REF2Z3A4MlJLaUg3VHBMd3huSmVLdjJwYnN3PT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm0iCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLWxpbnV4LWFybS1tdXNsZWFiaWhmIjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHJvbGx1cC9yb2xsdXAtbGludXgtYXJtLW11c2xlYWJpaGYvLS9yb2xsdXAtbGludXgtYXJtLW11c2xlYWJpaGYtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNpa0ZUN2FZUEEydWZNRDA4NmNWT1JCWUdIZmZCbzRLOE1RNHVQUy9ablk1NEdLajM2aTE5NnU4VSthRFZUMkxYNGVTTWJ5SHR5T2g3RDdadmsyVnZBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm0iCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLWxpbnV4LWFybTY0LWdudSI6IHsKICAgICAgInZlcnNp' +
'b24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LWFybTY0LWdudS8tL3JvbGx1cC1saW51eC1hcm02NC1nbnUtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpZZ1VHazVhTGQxblViMUN0UThFK3Q1SmhMYzl4NVdkQktldzlaZ0FYZzdEQmswWkhFckxIZFhNMjRyZlgrYktyRmUrWHA1WXVKbzU0STVIRmpHREFBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtbGludXgtYXJtNjQtbXVzbCI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LWFybTY0LW11c2wvLS9yb2xsdXAtbGludXgtYXJtNjQtbXVzbC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcGVaUlZFZG5GV1o1QmgyS2V1bUtHOXR5N2FDWHp6RXNIU2hPWkVGaUNRbERFZXBQMWRwVWwvU3JVTlhOZzEzVW1abCtnelZEUHNpQ3duVjF1STBSVUE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybTY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImxpbnV4IgogICAgICBdCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9Acm9sbHVwL3JvbGx1cC1saW51eC1sb29uZzY0LWdudSI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LWxvb25nNjQtZ251Ly0vcm9sbHVwLWxpbnV4LWxvb25nNjQtZ251LTQuNTkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1nYlVTVy85N2Y3K3I0Z0h5M0psdXA4ekRHMTkwQXVvZHNXbk5pWEVycDltVDkwaUN5OU5LS1UwWHd4NWs4VmxSQUlWMnVVOUNzTW5FRmcveFhhT2ZYZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAibG9vbmc2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtbGludXgtbG9vbmc2NC1tdXNsIjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHJvbGx1cC9yb2xsdXAtbGludXgtbG9vbmc2NC1tdXNsLy0vcm9sbHVwLWxpbnV4LWxvb25nNjQtbXVzbC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTIteVRST05lNzlFK28wRldGaWphc29UanR6RzlFQmVkRlhKTWw4ODhOQkVEQ0RWOUkyd0diRkZmSlFRZTYzT2lqYkZDVVpxeHBIejFHenBidFNGaWtKNFE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImxvb25nNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLWxpbnV4LXBwYzY0LWdudSI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LXBwYzY0LWdudS8tL3JvbGx1cC1saW51eC1wcGM2NC1nbnUtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXN3MW8zdGZ5azEyazNPRXBSZGRGNjhhMXVuWjVWQ043em9UTnRTbjJLbmRVRStlYTNtM1JPT0tSQ1p4RXBtVDluc0dub2dwRlA5eDZtbkxUQ2FvTGtBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJwcGM2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtbGludXgtcHBjNjQtbXVzbCI6IHsKICAgICAgInZl' +
'cnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LXBwYzY0LW11c2wvLS9yb2xsdXAtbGludXgtcHBjNjQtbXVzbC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItKzJrTHRRNHhUM0FpSXhrekZWRlhmc21sWmlHNUZYWVc3WnlJSXZHQTdCZGV1aDlaMGFONGhWeVhTL0cxRTliVFAvdnFzek5JTi9wVUtDay9CVEhzS0E9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgInBwYzY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImxpbnV4IgogICAgICBdCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9Acm9sbHVwL3JvbGx1cC1saW51eC1yaXNjdjY0LWdudSI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LXJpc2N2NjQtZ251Ly0vcm9sbHVwLWxpbnV4LXJpc2N2NjQtZ251LTQuNTkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ORFlNcHNYWUpKYWorSTdVZHdJdUhITnhYWi9iL04yaFIxNU55SDNtMnFBdGIvaEhQQTRnNFN1dXZyZHhldFRkbmRmajliMVdPbXk3M2tjUFJvRVJVZz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAicmlzY3Y2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtbGludXgtcmlzY3Y2NC1tdXNsIjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHJvbGx1cC9yb2xsdXAtbGludXgtcmlzY3Y2NC1tdXNsLy0vcm9sbHVwLWxpbnV4LXJpc2N2NjQtbXVzbC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItbkxja0I4V09xSElmMWJoeW1rK29IeHZNOUQzdHlQbmRaSDhpOCszNXAvMVlpVm9Wc3dQaWQyeUx6Z1g3WkpQMEtRdm5raE00SDZRWjVtMEx6YnlJQWc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgInJpc2N2NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLWxpbnV4LXMzOTB4LWdudSI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LXMzOTB4LWdudS8tL3JvbGx1cC1saW51eC1zMzkweC1nbnUtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW9GODdJZTN1QUl2T1JGQnB3bkN2VXpkZVlVcWkyd1k2alJGV0pBeTFxdXMvdWRIRllJa3BsWVJXK3dvK0dSVVA0c0t6WWRtRTFZMytyWTVHYzRaTyt3PT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJzMzkweCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtbGludXgteDY0LWdudSI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLWxpbnV4LXg2NC1nbnUvLS9yb2xsdXAtbGludXgteDY0LWdudS00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItM0FIbXRRcS9wcE51VXNwS0FsdkE4SHRMeWJrRGZsa011TEs0RFBvNzdEZnRoUmI3MVY4NC9jNE1sV0pYaXhaejR1cnVJSDR1YWEwN0lxb0FrRzY0Zmc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtbGludXgteDY0LW11c2wiOiB7CiAgICAgICJ2ZXJzaW9uIjog' +
'IjQuNTkuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9Acm9sbHVwL3JvbGx1cC1saW51eC14NjQtbXVzbC8tL3JvbGx1cC1saW51eC14NjQtbXVzbC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItMlVkaXdTLzljVEF4N3FJVVpCL2ZXdFRvSnd2dDBWYm8wem1uWXQ3RUQzNUtQZzEzUTB5bTFnNDQyVEhMQzdWeUk2SmZZVFA0UGlTT1d5b01kVjIveGc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtb3BlbmJzZC14NjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuNTkuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9Acm9sbHVwL3JvbGx1cC1vcGVuYnNkLXg2NC8tL3JvbGx1cC1vcGVuYnNkLXg2NC00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTTNiTFJBVms2R093RmxQVEl4VkJTWUtVYXFmTHJuOGwwcHNLaW5rQ0Z4bDRsUXZPU3o4WnJLRHoyZ3hjQndIRnBjaTBCNnJ0dHlkSTRJcFM0SVMvalE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJvcGVuYnNkIgogICAgICBdCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9Acm9sbHVwL3JvbGx1cC1vcGVuaGFybW9ueS1hcm02NCI6IHsKICAgICAgInZlcnNpb24iOiAiNC41OS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0Byb2xsdXAvcm9sbHVwLW9wZW5oYXJtb255LWFybTY0Ly0vcm9sbHVwLW9wZW5oYXJtb255LWFybTY0LTQuNTkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10dDlLQkpxYXFwNWk1SFVaem9hZkhaWDhiNVEyRmU3VWpZRVJBRGxsODNPNGZHcUo0OU8xRnNMNkxwZHpWRlFjcHd2bnlkMGkrSy9WU3d1L28vbldsQT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAib3Blbmhhcm1vbnkiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLXdpbjMyLWFybTY0LW1zdmMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuNTkuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9Acm9sbHVwL3JvbGx1cC13aW4zMi1hcm02NC1tc3ZjLy0vcm9sbHVwLXdpbjMyLWFybTY0LW1zdmMtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVY1QjZtRzdPckdUd254YU5VelpURFRqRFM3Rjc1UE8xYWU2TUpZZGlNdTYwc3EwQ3FONUNWZVZzYmhQeGFsdXB2VFg4Z1hWU1U5Z3ErUngxL2h2dTZBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJ3aW4zMiIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHJvbGx1cC9yb2xsdXAtd2luMzItaWEzMi1tc3ZjIjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHJvbGx1cC9yb2xsdXAtd2luMzItaWEzMi1tc3ZjLy0vcm9sbHVwLXdpbjMyLWlhMzItbXN2Yy00LjU5LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVUtGTUhQdU05UjBpQmVnd3pLRjR5MEM0Sjl1OEM2TUVKZ0Z1WFRCZXJNazdFSjkyR0ZWRllCZk9aYVNHTHU2Q09mN0Z4cFFOcWhOUzRjNGljVVBxeEE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImlhMzIiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLXdpbjMyLXg2NC1nbnUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuNTkuMCIsCiAgICAgICJyZXNvbHZl' +
'ZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9Acm9sbHVwL3JvbGx1cC13aW4zMi14NjQtZ251Ly0vcm9sbHVwLXdpbjMyLXg2NC1nbnUtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxhQmtZbFNTMW4yTDhmU28xdGhETkdyQ1RRTW14allZNUcwV0ZXakZGWVprS1Bqc01Cc2dKZkdmNFRMeFhyRjZSeWhJNjBMOFRNT2pCTXZYaVRjeGVBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0Byb2xsdXAvcm9sbHVwLXdpbjMyLXg2NC1tc3ZjIjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHJvbGx1cC9yb2xsdXAtd2luMzIteDY0LW1zdmMvLS9yb2xsdXAtd2luMzIteDY0LW1zdmMtNC41OS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJIUkNtbDZPenRZWHlKWEF2ZERYUEtjYXd1a1dZMkdwUjUvbnhLcDRpQmdpTzN3Y29FR2tBYXFjdEliWmNOQjZLbFVRQklxdDhWWWtOU2oyMzk3RWZBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0BzdGFuZGFyZC1zY2hlbWEvc3BlYyI6IHsKICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHN0YW5kYXJkLXNjaGVtYS9zcGVjLy0vc3BlYy0xLjEuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sMmFGeTVqQUxobmlHNUhncXJENmpYTGkvclVXckt2cU4vcUp4NnlvSnNnS2hibFZkK2lxcVU0UkNYYXZtL2pQaXR5RG81VEN2S01ucGpLbk9yaXkwdz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHN0YW5kYXJkLXNjaGVtYS91dGlscyI6IHsKICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHN0YW5kYXJkLXNjaGVtYS91dGlscy8tL3V0aWxzLTAuMy4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWU3TWV3Njg2b3dNYVBKVk5OTHM1NVBVdmd6Mzcxbktnd3NjNHZ4RTQ5enNPRHBKRW54Z3hSbzJ5L09LcnF1ZWF2WGdaTk1EVmozRGRIRmxhU0FlVThnPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdGFpbHdpbmRjc3Mvbm9kZSI6IHsKICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHRhaWx3aW5kY3NzL25vZGUvLS9ub2RlLTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpseDZzTGs0RU93TzZoSGUxb0NHbTFRNEFOL3MwclNyVFRQQkdQTTAvUlE2VXlsd3ExN0Z1VThJZUpKS0VqdGM2SzZPMDd6c3ZQK2dETzZNTVdvN3BnPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAanJpZGdld2VsbC9yZW1hcHBpbmciOiAiXjIuMy41IiwKICAgICAgICAiZW5oYW5jZWQtcmVzb2x2ZSI6ICJeNS4xOS4wIiwKICAgICAgICAiaml0aSI6ICJeMi42LjEiLAogICAgICAgICJsaWdodG5pbmdjc3MiOiAiMS4zMS4xIiwKICAgICAgICAibWFnaWMtc3RyaW5nIjogIl4wLjMwLjIxIiwKICAgICAgICAic291cmNlLW1hcC1qcyI6ICJeMS4yLjEiLAogICAgICAgICJ0YWlsd2luZGNzcyI6ICI0LjIuMSIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHRhaWx3aW5kY3NzL294aWRlIjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUvLS9veGlkZS00LjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15djlqZUVGV25qS0NJNi9UM09xNTB5UUVPcW1wbXBmekcxaGNac0FPYVhGUVBmeldwcldybEhTZEdQRUYzV1FUaTh6dThvaEM5TWg5SjQ3MG5UNXBVdz09IiwKICAgICAg' +
'ImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMjAiCiAgICAgIH0sCiAgICAgICJvcHRpb25hbERlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHRhaWx3aW5kY3NzL294aWRlLWFuZHJvaWQtYXJtNjQiOiAiNC4yLjEiLAogICAgICAgICJAdGFpbHdpbmRjc3Mvb3hpZGUtZGFyd2luLWFybTY0IjogIjQuMi4xIiwKICAgICAgICAiQHRhaWx3aW5kY3NzL294aWRlLWRhcndpbi14NjQiOiAiNC4yLjEiLAogICAgICAgICJAdGFpbHdpbmRjc3Mvb3hpZGUtZnJlZWJzZC14NjQiOiAiNC4yLjEiLAogICAgICAgICJAdGFpbHdpbmRjc3Mvb3hpZGUtbGludXgtYXJtLWdudWVhYmloZiI6ICI0LjIuMSIsCiAgICAgICAgIkB0YWlsd2luZGNzcy9veGlkZS1saW51eC1hcm02NC1nbnUiOiAiNC4yLjEiLAogICAgICAgICJAdGFpbHdpbmRjc3Mvb3hpZGUtbGludXgtYXJtNjQtbXVzbCI6ICI0LjIuMSIsCiAgICAgICAgIkB0YWlsd2luZGNzcy9veGlkZS1saW51eC14NjQtZ251IjogIjQuMi4xIiwKICAgICAgICAiQHRhaWx3aW5kY3NzL294aWRlLWxpbnV4LXg2NC1tdXNsIjogIjQuMi4xIiwKICAgICAgICAiQHRhaWx3aW5kY3NzL294aWRlLXdhc20zMi13YXNpIjogIjQuMi4xIiwKICAgICAgICAiQHRhaWx3aW5kY3NzL294aWRlLXdpbjMyLWFybTY0LW1zdmMiOiAiNC4yLjEiLAogICAgICAgICJAdGFpbHdpbmRjc3Mvb3hpZGUtd2luMzIteDY0LW1zdmMiOiAiNC4yLjEiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0YWlsd2luZGNzcy9veGlkZS1hbmRyb2lkLWFybTY0IjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUtYW5kcm9pZC1hcm02NC8tL294aWRlLWFuZHJvaWQtYXJtNjQtNC4yLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVo3RzFabTVFQzhPT0thZXNJS3V3NzdqdysrUUoybEw5TitkRHBkUWlBQi9jL0Iyd0RoMFFQRkhia0JWclhud051Z3ZyYkpGazFnSzJTc1Zqd1dSZWc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybTY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImFuZHJvaWQiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDIwIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdGFpbHdpbmRjc3Mvb3hpZGUtZGFyd2luLWFybTY0IjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUtZGFyd2luLWFybTY0Ly0vb3hpZGUtZGFyd2luLWFybTY0LTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXEvTEhrT3N0b0o3cEkxSjBxNmRqZXNMelJ2UVNJZkV0bzE0OHBwQWQrQlZRSzBKWWpRSUZTSzNKZ1laSmErWXppMEREYTUyWnNReDJycXl0Qm5mOEh3PT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJkYXJ3aW4iCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDIwIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdGFpbHdpbmRjc3Mvb3hpZGUtZGFyd2luLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHRhaWx3aW5kY3NzL294aWRlLWRhcndpbi14NjQvLS9veGlkZS1kYXJ3aW4teDY0LTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS9mL296bGFYR1k2UUxicHZkL2tGVHJvMmwxOGY3ZEhLcEIraWVYeitDaWpsNE10OUFJMnJUcnBxN1YrdDA0bksrajlYQlFIblNNZGVRUmhiR3l0NmZ3PT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiZGFyd2luIgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAyMCIKICAgICAgfQogICAgfSwKICAgICJub2Rl' +
'X21vZHVsZXMvQHRhaWx3aW5kY3NzL294aWRlLWZyZWVic2QteDY0IjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUtZnJlZWJzZC14NjQvLS9veGlkZS1mcmVlYnNkLXg2NC00LjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01ZS9Ba2dZSlQvY3Bia3lzL09VMkVpMmpkRVRDTGxpZndtN29nTUM3L2hrc0kyZkMzaWlxNk9jWHdqaWJjSWpQdW5nMGtSdFIzVHhFSVRrcWduMFRjQT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImZyZWVic2QiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDIwIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdGFpbHdpbmRjc3Mvb3hpZGUtbGludXgtYXJtLWdudWVhYmloZiI6IHsKICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHRhaWx3aW5kY3NzL294aWRlLWxpbnV4LWFybS1nbnVlYWJpaGYvLS9veGlkZS1saW51eC1hcm0tZ251ZWFiaWhmLTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVueTFFY1ZUVG1lckNLdC8xWnVLVGtiMHg4WmFpdVl1Y2cyL2tJbU81QTVZL2tCejQxLytqMGd4VVpsK2hURjN4a1dwRG1IWCtUYVdoT3RiYTJGeXV3PT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm0iCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDIwIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdGFpbHdpbmRjc3Mvb3hpZGUtbGludXgtYXJtNjQtZ251IjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUtbGludXgtYXJtNjQtZ251Ly0vb3hpZGUtbGludXgtYXJtNjQtZ251LTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNUcndvbUkrYzduNmFTU1Fsc1BMMHJvUmlOTURRL1l6TUQ5RWpjUitINGYwSTFTUThRcUl1UG5zVnA3UWdNa0MxUWk4cnRrZWtMa09Gam83T2xFRlJRPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0YWlsd2luZGNzcy9veGlkZS1saW51eC1hcm02NC1tdXNsIjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUtbGludXgtYXJtNjQtbXVzbC8tL294aWRlLWxpbnV4LWFybTY0LW11c2wtNC4yLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItV1pBMENIUkwvU1AxVFJiQTVtcDlodHNwcFNFa1d1UTRLc1NVdW1ZUW55bDhaZFQzOW50d3FtejRJVUhHTjZwNFhkU2xZZkp3TTRyUnpaTFNoSHNHQVE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybTY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImxpbnV4IgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAyMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHRhaWx3aW5kY3NzL294aWRlLWxpbnV4LXg2NC1nbnUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0YWlsd2luZGNzcy9veGlkZS1saW51eC14NjQtZ251Ly0vb3hpZGUtbGludXgteDY0LWdudS00LjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xTUZ6eEkyWWxCT0xXNVBoYmx6dVNXbFdm' +
'd0xIYW5lQkUweEh6THJCZ050cU42bVdmcytxWWJocnlHU1hRakZZQjFEemY1dytMTjVxYlVUUGhXN1k1Zz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImxpbnV4IgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAyMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHRhaWx3aW5kY3NzL294aWRlLWxpbnV4LXg2NC1tdXNsIjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUtbGludXgteDY0LW11c2wvLS9veGlkZS1saW51eC14NjQtbXVzbC00LjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01cjFYMkZLbkNNVVBsWFRXUllwSGRQWVVZNmExQXIvdDdQMjRPdWlFZEVPbW1zNWx5cWpEUnZWWTF5eTlSbWlvaCtBdW5RMHJXaU9UUEU4RjlBM3Y1Zz09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImxpbnV4IgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAyMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHRhaWx3aW5kY3NzL294aWRlLXdhc20zMi13YXNpIjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdGFpbHdpbmRjc3Mvb3hpZGUtd2FzbTMyLXdhc2kvLS9veGlkZS13YXNtMzItd2FzaS00LjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NR0ZCNWNWUHZzaFI4NU1USmtFdnFEVW51Tm95c3JzUnhkNnZuazFMZjJ0YmlxTmxYcEhZWnFrcU9RYWx5ZGllbkVXT0hIRnl5dVRTWVJzTGZ4RkoyUT09IiwKICAgICAgImJ1bmRsZURlcGVuZGVuY2llcyI6IFsKICAgICAgICAiQG5hcGktcnMvd2FzbS1ydW50aW1lIiwKICAgICAgICAiQGVtbmFwaS9jb3JlIiwKICAgICAgICAiQGVtbmFwaS9ydW50aW1lIiwKICAgICAgICAiQHR5YnlzL3dhc20tdXRpbCIsCiAgICAgICAgIkBlbW5hcGkvd2FzaS10aHJlYWRzIiwKICAgICAgICAidHNsaWIiCiAgICAgIF0sCiAgICAgICJjcHUiOiBbCiAgICAgICAgIndhc20zMiIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGVtbmFwaS9jb3JlIjogIl4xLjguMSIsCiAgICAgICAgIkBlbW5hcGkvcnVudGltZSI6ICJeMS44LjEiLAogICAgICAgICJAZW1uYXBpL3dhc2ktdGhyZWFkcyI6ICJeMS4xLjAiLAogICAgICAgICJAbmFwaS1ycy93YXNtLXJ1bnRpbWUiOiAiXjEuMS4xIiwKICAgICAgICAiQHR5YnlzL3dhc20tdXRpbCI6ICJeMC4xMC4xIiwKICAgICAgICAidHNsaWIiOiAiXjIuOC4xIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE0LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHRhaWx3aW5kY3NzL294aWRlLXdpbjMyLWFybTY0LW1zdmMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0YWlsd2luZGNzcy9veGlkZS13aW4zMi1hcm02NC1tc3ZjLy0vb3hpZGUtd2luMzItYXJtNjQtbXN2Yy00LjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZbFVFSFJIQkduQ01oNE5qNEducVF5QnRzc2hVUGRpTnJvWmo4VlBrdlRaU29Ic2lsUkN3WGNWS25HOWt5aTBaRkFTLzN1K3FLSEJkRGM4MVNBRFRSQT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAiYXJtNjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDIwIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdGFpbHdpbmRjc3Mvb3hpZGUtd2luMzIteDY0LW1zdmMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKICAgICAg' +
'InJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0YWlsd2luZGNzcy9veGlkZS13aW4zMi14NjQtbXN2Yy8tL294aWRlLXdpbjMyLXg2NC1tc3ZjLTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJiTzM0RzVzTVdXeXJOL2lkTGVWeEFaZ0FLV3JuNUxpUjMvSTkwUTlNa0E2N3M2VDFvQjB4dFRlKzBoZW9CdkhTcGJVOU1rN2k2dXdKbnBvNHUyMVhRPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDIwIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdGFpbHdpbmRjc3Mvdml0ZSI6IHsKICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHRhaWx3aW5kY3NzL3ZpdGUvLS92aXRlLTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRCZjJzSmpZZWIyOGpEMlUvT2h3ZFcwYmJPc3hrV1B3UTdTcnFHZjlzVmNvWXdaajdya1hsanJvQk85d0tCdXQ5WG5tUUxYYW51RFVlcVFLMGxHZy93PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdGFpbHdpbmRjc3Mvbm9kZSI6ICI0LjIuMSIsCiAgICAgICAgIkB0YWlsd2luZGNzcy9veGlkZSI6ICI0LjIuMSIsCiAgICAgICAgInRhaWx3aW5kY3NzIjogIjQuMi4xIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAidml0ZSI6ICJeNS4yLjAgfHwgXjYgfHwgXjciCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0eXBlcy9iYWJlbF9fY29yZSI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yMC41IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9iYWJlbF9fY29yZS8tL2JhYmVsX19jb3JlLTcuMjAuNS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xb1Fwclp2ejV3UUZKd01EcWVzZVJYV3YzcnFNdmhncGJYRmZWeVdoYng5WDQ3UE9JQTZpLytkWGVmRW1aS29BZ09hVGRhSWdOU01xTUlVNjF5Unl6QT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBiYWJlbC9wYXJzZXIiOiAiXjcuMjAuNyIsCiAgICAgICAgIkBiYWJlbC90eXBlcyI6ICJeNy4yMC43IiwKICAgICAgICAiQHR5cGVzL2JhYmVsX19nZW5lcmF0b3IiOiAiKiIsCiAgICAgICAgIkB0eXBlcy9iYWJlbF9fdGVtcGxhdGUiOiAiKiIsCiAgICAgICAgIkB0eXBlcy9iYWJlbF9fdHJhdmVyc2UiOiAiKiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzL2JhYmVsX19nZW5lcmF0b3IiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMjcuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvYmFiZWxfX2dlbmVyYXRvci8tL2JhYmVsX19nZW5lcmF0b3ItNy4yNy4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXVmRmQyWGk5Mk9BVlBZc3krUDRuNy9VN2U2OGZleDArRWU4Z1NHOUtYN2VvMDg0Q1dpUTRzZHhrdHZkbDBiT1B1cFh0VkpQWTE5ems2RXdXcVVROGxnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL3R5cGVzIjogIl43LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzL2JhYmVsX190ZW1wbGF0ZSI6IHsKICAgICAgInZlcnNpb24iOiAiNy40LjQiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL2JhYmVsX190ZW1wbGF0ZS8tL2JhYmVsX190ZW1wbGF0ZS03LjQuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oL05VYVN5RzVFeXhCSXA4WVJ4bzRSTWUyL3FRZ3Z5b3dSd1ZNemhZaEJDT05iVzhQVXNnNGxrRk1yaGdaaFVlNXozTDNNaUxEdXZ5Si9DYVBhMkE4QT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkBiYWJlbC9w' +
'YXJzZXIiOiAiXjcuMS4wIiwKICAgICAgICAiQGJhYmVsL3R5cGVzIjogIl43LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzL2JhYmVsX190cmF2ZXJzZSI6IHsKICAgICAgInZlcnNpb24iOiAiNy4yOC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9iYWJlbF9fdHJhdmVyc2UvLS9iYWJlbF9fdHJhdmVyc2UtNy4yOC4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThQdmNYZjcwZ1REWkJndDlwdHhKOGVsQmVCamNMT0FjT3RvTy9tUEpqdGppMStDZEdiSGdtNzdvbTFHcnNQeHNpRSt1WElwTlNLNjRVWWFJd1FYZDRRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL3R5cGVzIjogIl43LjI4LjIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0eXBlcy9kMy1hcnJheSI6IHsKICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL2QzLWFycmF5Ly0vZDMtYXJyYXktMy4yLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItaE9MV1ZibTd1UnphMEJZWHBJSVc1cHhmcktlMFcrRDVsckZpQUVZUitwYjZ3M04yU3dTTWFKYlhkVWZTRXYrZFQ0TWZIQkx0bjVqczBMQVdhTzZvdHc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0eXBlcy9kMy1jb2xvciI6IHsKICAgICAgInZlcnNpb24iOiAiMy4xLjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL2QzLWNvbG9yLy0vZDMtY29sb3ItMy4xLjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItaU85MHNjdGg5V0FibWd2N29nb3E1N085WXBLbUZCYm1vRW9DSERCMnhNQlkwKy9LVnJxQWFDRHlDRTE2ZFVzcGVPdkl4RkZSSSswc0V0cURxeTJiNEE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0eXBlcy9kMy1lYXNlIjogewogICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvZDMtZWFzZS8tL2QzLWVhc2UtMy4wLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTmNWMUpqTzVvRHpvSzI2b016YklMRTZIVzd1VlhPSExRdkhzaEJVVzRVTWRaR2ZpWTZ2NUJlUXdoOWE5dEN6ditDZWVmWlFISnQ1U1JnSzE1NFJ0aUE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0eXBlcy9kMy1pbnRlcnBvbGF0ZSI6IHsKICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL2QzLWludGVycG9sYXRlLy0vZDMtaW50ZXJwb2xhdGUtMy4wLjQudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWdMUEVUbHJwVlYxWVJKSWdscjRFejQ3ZzdZeGpsMWxqN1lLc2lNQ2IyN1ZKSDlXOE5WTTZCYjlkOGtrcEcvdUFRUzVBbWJBNDhxMklBb2xLS28xTUE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkB0eXBlcy9kMy1jb2xvciI6ICIqIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvZDMtcGF0aCI6IHsKICAgICAgInZlcnNpb24iOiAiMy4xLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL2QzLXBhdGgvLS9kMy1wYXRoLTMuMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZNWkJZeVF2YkdtV3lXVmVhMEVIcy9Cd0xneGMrTUtpMXpMRENPTmtzb3pJNFlKTWNUdDhaRXVJUjRTYjFNTVRFOE1NVzQ5djBJd0k1K2I3Um1mV2xnPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvZDMtc2NhbGUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMC45IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9kMy1zY2FsZS8tL2QzLXNjYWxlLTQuMC45LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRMbXR3Qjh6a0FlTy9qdUFNZm5WK3NJdEtqbHN3MmxLZFpWVnk2TFJy' +
'MGNCbWVneFNBQmlMRXBHVm1TSko4TzA4aTQrc0dSNnFRdGI2V3R1d0pkdlZ3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdHlwZXMvZDMtdGltZSI6ICIqIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvZDMtc2hhcGUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMS44IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9kMy1zaGFwZS8tL2QzLXNoYXBlLTMuMS44LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxhZTBpV2ZjRGVSN3F0N3JBODhCTmlxZHZQUzVwRlZQcG81T2ZqRWx3TmFUMnl5ZWtiTTBDOXZLK3lxQnFFbUhyNmxEa1JuWU5vVEJZbEFnSmE3YTR3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdHlwZXMvZDMtcGF0aCI6ICIqIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvZDMtdGltZSI6IHsKICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL2QzLXRpbWUvLS9kMy10aW1lLTMuMC40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXl1elp1ZzFua0FBYUJsQkJpa0taVGd6Q2VBK2sxdXk0WkZ3V0FOT2ZLdzV6NUxSaFYwZ05BN2dOa0ttN0hvSytIUk4wd1gzRWt4R2swZnBiV2htQjdnPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvZDMtdGltZXIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9kMy10aW1lci8tL2QzLXRpbWVyLTMuMC4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVBzM1Q4RThkWkRhbTZmVXlOaU1rZWtLM1hVc2FVRWlrK2lkTzkvWWpQdGZqMnFydUY4dEZCWFM3WGh0RTRpSVhCTHhobUxqUDNTWHBMaFZmMjFJOUx3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvZXN0cmVlIjogewogICAgICAidmVyc2lvbiI6ICIxLjAuOCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvZXN0cmVlLy0vZXN0cmVlLTEuMC44LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRXSHpIYTJXcUVYSS9PMUU5T2pyb2NNVEtKbDJtU3JFb2xoMUlvbXJ2NlUrSnVOd2FIWHNYeDliTHU1Z0c3QlVXRklOMHNrSVFKUS9MMXJJZXg0WDZ3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvanNvbi1zY2hlbWEiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMC4xNSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvanNvbi1zY2hlbWEvLS9qc29uLXNjaGVtYS03LjAuMTUudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNStmUDhQOE1GTkMrQXlaQ0R4ckIycGtaRlBHenFRV1V6cFNldXVWTHZtOFZNY29yTllhdkJxb0ZjeEs4YlF6NFFzYm40b1VFRWVtNHdETGZjeXNHSEE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvbm9kZSI6IHsKICAgICAgInZlcnNpb24iOiAiMjQuMTIuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvbm9kZS8tL25vZGUtMjQuMTIuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HWUR4c1ppM0NoZ21ja1JUOUhQVTBXRWhLTFAwOGV2L1lmY3EyQXN0anJEQVNPWUNTWGV5akRzSGc0djV0NGpPajdjeURYM3ZtcHJhZktsV0lHOU1YUT09IiwKICAgICAgImRldk9wdGlvbmFsIjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAidW5kaWNpLXR5cGVzIjogIn43LjE2LjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0eXBlcy9yZWFjdCI6IHsKICAgICAgInZlcnNpb24iOiAiMTkuMi4xNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvcmVhY3QvLS9yZWFjdC0xOS4yLjE0LnRneiIsCiAgICAgICJpbnRl' +
'Z3JpdHkiOiAic2hhNTEyLWlsY1RIL1VuaUNrTWR0ZXhrb0NOMGJJN3BNY0pEdm1RRlB2dVB2bUVhWUEvTlNmRlRBZ2RVU0xBb1ZqYVJKbTcrNlB2Y00rcTF6WU93UzR3VFlNRjl3PT0iLAogICAgICAiZGV2T3B0aW9uYWwiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJjc3N0eXBlIjogIl4zLjIuMiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzL3JlYWN0LWRvbSI6IHsKICAgICAgInZlcnNpb24iOiAiMTkuMi4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9yZWFjdC1kb20vLS9yZWFjdC1kb20tMTkuMi4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwMkwvZVk2Zm4rS2dWVlFBT3FZSXRiRjBWWS9ZQXBlNU16MkYwYXlrU084Z3gzMWJZQ1p5dlNlWXhDSEt2ekhHNWVaamMrenlhUzVCckJXeWEyK2tRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkB0eXBlcy9yZWFjdCI6ICJeMTkuMi4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMC42IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZS8tL3VzZS1zeW5jLWV4dGVybmFsLXN0b3JlLTAuMC42LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpGREFEK3RscGYycjRhc3VIRWowWEg2cFk2aTBnNU5lQUhQbisxNXdrM0JWNkpBNjllRVJGWEMxZ3lHVGhEa1ZhMXpDeUtyNWpveDErMkxiVi9BTUxnPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiI6IHsKICAgICAgInZlcnNpb24iOiAiOC41Ny4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luLy0vZXNsaW50LXBsdWdpbi04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcWV1NHJUSFIzL0lhRk9SYkQxNmdtanE5K3JFczlmR0tkWDBrRjZCS1NmaStnQ3VHM1JDS0xsU0JZem4vYkdzWTlUajdLRS9EQVFTdGJwOEFISkdIRVE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAZXNsaW50LWNvbW11bml0eS9yZWdleHBwIjogIl40LjEyLjIiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvc2NvcGUtbWFuYWdlciI6ICI4LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZS11dGlscyI6ICI4LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMiOiAiOC41Ny4wIiwKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Zpc2l0b3Ita2V5cyI6ICI4LjU3LjAiLAogICAgICAgICJpZ25vcmUiOiAiXjcuMC41IiwKICAgICAgICAibmF0dXJhbC1jb21wYXJlIjogIl4xLjQuMCIsCiAgICAgICAgInRzLWFwaS11dGlscyI6ICJeMi40LjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3R5cGVzY3JpcHQtZXNsaW50IgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlciI6ICJeOC41Ny4wIiwKICAgICAgICAiZXNsaW50IjogIl44LjU3LjAgfHwgXjkuMC4wIHx8IF4xMC4wLjAiLAogICAgICAgICJ0eXBlc2NyaXB0IjogIj49NC44LjQgPDYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbi9ub2RlX21vZHVsZXMvaWdub3JlIjogewogICAgICAidmVyc2lvbiI6ICI3LjAuNSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pZ25vcmUvLS9pZ25vcmUtNy4wLjUudGd6IiwK' +
'ICAgICAgImludGVncml0eSI6ICJzaGE1MTItSHM1OXhCTmZVSXVuTUZnV0FiR1g1Y3E2ODkzSWJXZzRLbnJqYll3WDN0eDB6dG9yVmdUREE2QjJzeGY4ZWpISjR3ejhCcUdVTVlsbnpOQmVyNU52R2c9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSA0IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyIjogewogICAgICAidmVyc2lvbiI6ICI4LjU3LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlci8tL3BhcnNlci04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItWFp6T21paExJcjhBRDFiOWhMOWNjTk16RU1XdC9kRTJ1N055VFk5akpHNllOaU50aGFENVh0VUhWRjJ1Q1haMTVuZyt6MmhUM01WdXhuVVlocTZrMWc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvc2NvcGUtbWFuYWdlciI6ICI4LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMiOiAiOC41Ny4wIiwKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlIjogIjguNTcuMCIsCiAgICAgICAgIkB0eXBlc2NyaXB0LWVzbGludC92aXNpdG9yLWtleXMiOiAiOC41Ny4wIiwKICAgICAgICAiZGVidWciOiAiXjQuNC4zIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS90eXBlc2NyaXB0LWVzbGludCIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImVzbGludCI6ICJeOC41Ny4wIHx8IF45LjAuMCB8fCBeMTAuMC4wIiwKICAgICAgICAidHlwZXNjcmlwdCI6ICI+PTQuOC40IDw2LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzY3JpcHQtZXNsaW50L3Byb2plY3Qtc2VydmljZSI6IHsKICAgICAgInZlcnNpb24iOiAiOC41Ny4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlc2NyaXB0LWVzbGludC9wcm9qZWN0LXNlcnZpY2UvLS9wcm9qZWN0LXNlcnZpY2UtOC41Ny4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXBSK2RLMEJseENMeHRXZmFLUVd0WXI3TWhLbXpxWnh1aWkrWmp1RmxabElHUlptMjJIblhGcWEyZVkrOTBNVXo4L2k4MFlKbXpGR0RVc2k4ZE1PVjV3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3RzY29uZmlnLXV0aWxzIjogIl44LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMiOiAiXjguNTcuMCIsCiAgICAgICAgImRlYnVnIjogIl40LjQuMyIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjE4LjE4LjAgfHwgXjIwLjkuMCB8fCA+PTIxLjEuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vdHlwZXNjcmlwdC1lc2xpbnQiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJ0eXBlc2NyaXB0IjogIj49NC44LjQgPDYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvc2NvcGUtbWFuYWdlciI6IHsKICAgICAgInZlcnNpb24iOiAiOC41Ny4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlc2NyaXB0LWVzbGludC9zY29wZS1tYW5hZ2VyLy0vc2NvcGUtbWFuYWdlci04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItbnZFeFFxQUhGMDFsVU02Nk1za1NhWnVscFBMNXBneTVoSTVSZnJ4dmlMZ3paVmZmQjV5WXp3Mjd1Sy9mdDhRbktYSTJYMExCckhKRnIx' +
'VGFadEFpYnc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMiOiAiOC41Ny4wIiwKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Zpc2l0b3Ita2V5cyI6ICI4LjU3LjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3R5cGVzY3JpcHQtZXNsaW50IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvdHNjb25maWctdXRpbHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjguNTcuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXNjcmlwdC1lc2xpbnQvdHNjb25maWctdXRpbHMvLS90c2NvbmZpZy11dGlscy04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTHRYUmloYzV5dGpKSVFFSCt4cWpCMCtZZ3NWNC90VzM1WEtYM0dUWkhwV3RjQzhTUGtUL2Q0dHFkZjFjS3Rlc3J5SG0yYmdwNmw1NTVOWWNUMk5MdkE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS90eXBlc2NyaXB0LWVzbGludCIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInR5cGVzY3JpcHQiOiAiPj00LjguNCA8Ni4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL0B0eXBlc2NyaXB0LWVzbGludC90eXBlLXV0aWxzIjogewogICAgICAidmVyc2lvbiI6ICI4LjU3LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzY3JpcHQtZXNsaW50L3R5cGUtdXRpbHMvLS90eXBlLXV0aWxzLTguNTcuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15amdoN2dtRGNKMStUY0VnOHgzdVdRbW44aWZ2U3VwblBmalAyMXR3UEtyRFAvcFRIbEVRZ21LY2l0ekYvcnpQU212N1FqSjkwdlJwTjRVK3pvVWp3UT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlcyI6ICI4LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXNjcmlwdC1lc3RyZWUiOiAiOC41Ny4wIiwKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3V0aWxzIjogIjguNTcuMCIsCiAgICAgICAgImRlYnVnIjogIl40LjQuMyIsCiAgICAgICAgInRzLWFwaS11dGlscyI6ICJeMi40LjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3R5cGVzY3JpcHQtZXNsaW50IgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZXNsaW50IjogIl44LjU3LjAgfHwgXjkuMC4wIHx8IF4xMC4wLjAiLAogICAgICAgICJ0eXBlc2NyaXB0IjogIj49NC44LjQgPDYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjguNTcuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMvLS90eXBlcy04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZFRMSThQRVhoalVDN0I5S3JlK3UwWHpuTzY5NkJoWGNUbE9uMC82a2YxZkhhUVc4K1ZqSkFWSEozZVRJMTRaYXBUeGRrT21jODBIYmxQUUxhRWVKZGc9PSIsCiAgICAgICJkZXYiOiB0' +
'cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS90eXBlc2NyaXB0LWVzbGludCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlIjogewogICAgICAidmVyc2lvbiI6ICI4LjU3LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlLy0vdHlwZXNjcmlwdC1lc3RyZWUtOC41Ny4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW03ZmFIY3lWZzBCVDNWZFlUbFg4R2RKRU03Q09leFh4UzZLcUdvcHhkdGtRUnZCYW5LMzc3UURIcjRXL3ZJUEFSK2FoOStCL1JjbFNXNWxkVm5pTzFRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Byb2plY3Qtc2VydmljZSI6ICI4LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHNjb25maWctdXRpbHMiOiAiOC41Ny4wIiwKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzIjogIjguNTcuMCIsCiAgICAgICAgIkB0eXBlc2NyaXB0LWVzbGludC92aXNpdG9yLWtleXMiOiAiOC41Ny4wIiwKICAgICAgICAiZGVidWciOiAiXjQuNC4zIiwKICAgICAgICAibWluaW1hdGNoIjogIl4xMC4yLjIiLAogICAgICAgICJzZW12ZXIiOiAiXjcuNy4zIiwKICAgICAgICAidGlueWdsb2JieSI6ICJeMC4yLjE1IiwKICAgICAgICAidHMtYXBpLXV0aWxzIjogIl4yLjQuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjE4LjE4LjAgfHwgXjIwLjkuMCB8fCA+PTIxLjEuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vdHlwZXNjcmlwdC1lc2xpbnQiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJ0eXBlc2NyaXB0IjogIj49NC44LjQgPDYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXNjcmlwdC1lc3RyZWUvbm9kZV9tb2R1bGVzL2JhbGFuY2VkLW1hdGNoIjogewogICAgICAidmVyc2lvbiI6ICI0LjAuNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTQuMC40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUJMcmdFY1JUd1gybzZnR3hHT0NOeU12R1NwMzVZb2Z1WXp3OWgxSU1UUm1LcXR0QVpaVlU2N2JkYjlQcjJ2VUhBOCtqM2kydEpmak82QzYrNG15R1RBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiMTggfHwgMjAgfHwgPj0yMiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlL25vZGVfbW9kdWxlcy9icmFjZS1leHBhbnNpb24iOiB7CiAgICAgICJ2ZXJzaW9uIjogIjUuMC40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlLWV4cGFuc2lvbi8tL2JyYWNlLWV4cGFuc2lvbi01LjAuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oK0RFbnBWdnhtZlZlZmE0akZiQ2Y1SGRINVlNRFhSc21LZmxwZjFwSUxaV1JGbFRiSnB4ZVU1NW5KbDRTbXQ1SFFhR3pnMW82UkhGUEphT3FubUJEZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImJhbGFuY2VkLW1hdGNoIjogIl40LjAuMiIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiMTggfHwgMjAgfHwgPj0yMiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzY3JpcHQtZXNs' +
'aW50L3R5cGVzY3JpcHQtZXN0cmVlL25vZGVfbW9kdWxlcy9taW5pbWF0Y2giOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEwLjIuNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMTAuMi40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW9SalR3Lzk3YVRCTjBSSGJZQ2R0RjFNUWZ2dXNTSUJRTTBJWkVnemw2NDI2KzhqU0MwbkYxYS9HbW5WTHBmQjl5eXI2ZzZGVHFXcWlaVmJ4cnRhQ0lnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiQmx1ZU9hay0xLjAuMCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImJyYWNlLWV4cGFuc2lvbiI6ICJeNS4wLjIiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIjE4IHx8IDIwIHx8ID49MjIiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2lzYWFjcyIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzY3JpcHQtZXN0cmVlL25vZGVfbW9kdWxlcy9zZW12ZXIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuNy40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci03LjcuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12RktDMklFdFFuVmhwVDc4aDFZcDh3endyZjhDTStNektNSEdKWmZCdHpoWk55Y1JGblhzSGs2RTVUeElra01zZ05TN21kWDNBR0I3eDJRTTJkaTRsQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIklTQyIsCiAgICAgICJiaW4iOiB7CiAgICAgICAgInNlbXZlciI6ICJiaW4vc2VtdmVyLmpzIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEwIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjguNTcuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMvLS91dGlscy04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNWlJSHZwRDNDWmUwNnJpQXNiTnh4cmVQK011WWdWVXNWMG40YndMSC8vVkptZ3R0NTRzUWVZMkdzem50SjRCallDcE16cmZWaDJTQm5VUVR0eXMybFE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAZXNsaW50LWNvbW11bml0eS9lc2xpbnQtdXRpbHMiOiAiXjQuOS4xIiwKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3Njb3BlLW1hbmFnZXIiOiAiOC41Ny4wIiwKICAgICAgICAiQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVzIjogIjguNTcuMCIsCiAgICAgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzdHJlZSI6ICI4LjU3LjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3R5cGVzY3JpcHQtZXNsaW50IgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZXNsaW50IjogIl44LjU3LjAgfHwgXjkuMC4wIHx8IF4xMC4wLjAiLAogICAgICAgICJ0eXBlc2NyaXB0IjogIj49NC44LjQgPDYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvdmlzaXRvci1rZXlzIjogewogICAgICAidmVyc2lvbiI6ICI4LjU3LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzY3JpcHQtZXNsaW50L3Zpc2l0b3Ita2V5cy8tL3Zpc2l0b3Ita2V5cy04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItem02eHg4VVQvWHkyb1NyMlpYRDBwWm83SngyWHNDb0lEMklVaDlZU1RGUnU3eitXZHdZVFJrNkxoVWZ0bTFjcndxYnVvRjZJOHpBRmVDTXcwWWp3RGc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQi' +
'LAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZXMiOiAiOC41Ny4wIiwKICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeNS4wLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3R5cGVzY3JpcHQtZXNsaW50IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9AdHlwZXNjcmlwdC1lc2xpbnQvdmlzaXRvci1rZXlzL25vZGVfbW9kdWxlcy9lc2xpbnQtdmlzaXRvci1rZXlzIjogewogICAgICAidmVyc2lvbiI6ICI1LjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdmlzaXRvci1rZXlzLy0vZXNsaW50LXZpc2l0b3Ita2V5cy01LjAuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10RDQwZUh4QTM1aDBQRUlaTmVJamtIb0RSNFlqakpwMzRiaU0wbUR2cGxCZS8vbUIrSUhDcUhER1Y3cHhGKzdNa2xUdmlnaGNDUFBaQzd5bld5amRUQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMjAuMTkuMCB8fCBeMjIuMTMuMCB8fCA+PTI0IgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL2VzbGludCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvQHZpdGVqcy9wbHVnaW4tcmVhY3QiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjUuMS40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B2aXRlanMvcGx1Z2luLXJlYWN0Ly0vcGx1Z2luLXJlYWN0LTUuMS40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZJY0ZMZFJpL1ZZUlU4T0wvcHVMN1FYTVlhZkhtcU9ud1RaWTUwVTFKUGxDTmozMFB4Q014NjVjNDk0YjFLOWJlOWhYODNLVnQwK2dURXdUV0xxVG9BPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL2NvcmUiOiAiXjcuMjkuMCIsCiAgICAgICAgIkBiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXJlYWN0LWpzeC1zZWxmIjogIl43LjI3LjEiLAogICAgICAgICJAYmFiZWwvcGx1Z2luLXRyYW5zZm9ybS1yZWFjdC1qc3gtc291cmNlIjogIl43LjI3LjEiLAogICAgICAgICJAcm9sbGRvd24vcGx1Z2ludXRpbHMiOiAiMS4wLjAtcmMuMyIsCiAgICAgICAgIkB0eXBlcy9iYWJlbF9fY29yZSI6ICJeNy4yMC41IiwKICAgICAgICAicmVhY3QtcmVmcmVzaCI6ICJeMC4xOC4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMjAuMTkuMCB8fCA+PTIyLjEyLjAiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJ2aXRlIjogIl40LjIuMCB8fCBeNS4wLjAgfHwgXjYuMC4wIHx8IF43LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvYWNvcm4iOiB7CiAgICAgICJ2ZXJzaW9uIjogIjguMTYuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi8tL2Fjb3JuLTguMTYuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VVkp5RTlNdHRPc0JRSURLdzFza2I5bkF3UXVSNXd1R0QzKzgySzZKZ0psbS9ZK0tJOTJvTnNNTkdaQ1lkRHNWdFJIU2FrMHBjVjVEbm81KzRqaDlzdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJiaW4iOiB7CiAgICAgICAgImFjb3JuIjogImJpbi9hY29ybiIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0wLjQuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvYWNvcm4tanN4IjogewogICAgICAidmVyc2lvbiI6ICI1LjMuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi1qc3gvLS9hY29ybi1qc3gtNS4zLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcnE5cytKTmhm' +
'MElDaGp0RFh4bGxKN2c0MW9aazVTbFh0cDBMSHd5QTVjZWp3bjd2S21LcDRwUHJpNllFZVB2MlBVNjVzQXNlZ2JYdElpbm1ERkRYZ1E9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiYWNvcm4iOiAiXjYuMC4wIHx8IF43LjAuMCB8fCBeOC4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2FqdiI6IHsKICAgICAgInZlcnNpb24iOiAiNi4xNC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fqdi8tL2Fqdi02LjE0LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItSVdyb3NtL3lybjQzZWlLcWtma0hpczdRaW9EbGVhWFFIZERWUEtnMEZTd3dkL0R1dnlYNzlUWm5GT25ZcEI3ZGNzRkFNbXRGenRadVhQRHZTZVBrRnc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjMuMS4xIiwKICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKICAgICAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiAiXjAuNC4xIiwKICAgICAgICAidXJpLWpzIjogIl40LjIuMiIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAiZ2l0aHViIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9lcG9iZXJlemtpbiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvYW5zaS1zdHlsZXMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMy4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtNC4zLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItemJCOXJDSkFUMXJiamlWRGIyaHFLRkhOWUx4Z3RrOE5VUnhaM0lad0QzRjZOdHhiWFpRQ25uU2kxTGt4K0lEb2hkUGxGcDIyMndWQUxJaGVaSlFTRWc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJjb2xvci1jb252ZXJ0IjogIl4yLjAuMSIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj04IgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jaGFsay9hbnNpLXN0eWxlcz9zcG9uc29yPTEiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2FyZ3BhcnNlIjogewogICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTIuMC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTgrOVdxZWJiRnpwWDlPUitXYTZPMjlhc0lvZ2VSTXpjR3RBSU5kcE1ISHlBZzEwZjA1YVNGVkJiY0VxR2YvUFh3MUVqQVorcTIvYkVCZzNEdnVySzNRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiUHl0aG9uLTIuMCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2JhbGFuY2VkLW1hdGNoIjogewogICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWxhbmNlZC1tYXRjaC8tL2JhbGFuY2VkLW1hdGNoLTEuMC4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNvU2VVTzBUTVY2N2hOMUFtYlhzSzR5YXFVN3RqaUhsYnhSRFpPcEgwS1c5K0NlWDRiUkFhWDBBbnh0MHR4Mk1ycFJwV3dRYVB3SWxJU0VKaFlVNVB3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvYmFzZWxpbmUtYnJvd3Nlci1tYXBwaW5nIjogewogICAgICAidmVyc2lvbiI6ICIyLjEwLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFzZWxpbmUtYnJvd3Nlci1tYXBwaW5nLy0vYmFzZWxpbmUtYnJvd3Nlci1tYXBwaW5nLTIuMTAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sSXlnMHN6UmZZYml5NjdqOUtOOEl5ZUQ3cTdoY21xbkoxZGRXbU50MTlJdEdwTk42NG1ubGxteFVORklPZE9tNmJ5OTdqbEw2d2ZwVFRKcm1ualdBQT09' +
'IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAogICAgICAiYmluIjogewogICAgICAgICJiYXNlbGluZS1icm93c2VyLW1hcHBpbmciOiAiZGlzdC9jbGkuY2pzIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9icmFjZS1leHBhbnNpb24iOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMS4xMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9icmFjZS1leHBhbnNpb24vLS9icmFjZS1leHBhbnNpb24tMS4xLjEyLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTlUOVVqVzNyMFVXNWMxUTdHVHdsbHB0WHdodlltRXpGaHpNZlo5SDdGUVd0K3VaZVBqWlBqQlAvVzFaRXlaMXR3R1dvbTUvNTZURjRsUGNxam5ESGNnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiYmFsYW5jZWQtbWF0Y2giOiAiXjEuMC4wIiwKICAgICAgICAiY29uY2F0LW1hcCI6ICIwLjAuMSIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvYnJvd3NlcnNsaXN0IjogewogICAgICAidmVyc2lvbiI6ICI0LjI4LjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcnNsaXN0Ly0vYnJvd3NlcnNsaXN0LTQuMjguMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1aQzVCZDBMZ0pYZ3dHcVVrblpZL3ZrVVEwNHI4TlhuSlozeVlpNHZEbVNpWm1DL3BkU04wTmJOUlB4WnBidE80dUFmRFVBRmZmTzhJWm9NM0dqOElrQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJmdW5kaW5nIjogWwogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vYnJvd3NlcnNsaXN0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiLAogICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9ucG0vYnJvd3NlcnNsaXN0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiZ2l0aHViIiwKICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2FpIgogICAgICAgIH0KICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiYmFzZWxpbmUtYnJvd3Nlci1tYXBwaW5nIjogIl4yLjkuMCIsCiAgICAgICAgImNhbml1c2UtbGl0ZSI6ICJeMS4wLjMwMDAxNzU5IiwKICAgICAgICAiZWxlY3Ryb24tdG8tY2hyb21pdW0iOiAiXjEuNS4yNjMiLAogICAgICAgICJub2RlLXJlbGVhc2VzIjogIl4yLjAuMjciLAogICAgICAgICJ1cGRhdGUtYnJvd3NlcnNsaXN0LWRiIjogIl4xLjIuMCIKICAgICAgfSwKICAgICAgImJpbiI6IHsKICAgICAgICAiYnJvd3NlcnNsaXN0IjogImNsaS5qcyIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjYgfHwgXjcgfHwgXjggfHwgXjkgfHwgXjEwIHx8IF4xMSB8fCBeMTIgfHwgPj0xMy43IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9jYWxsc2l0ZXMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbGxzaXRlcy8tL2NhbGxzaXRlcy0zLjEuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QOEJqQXNYdlpTK1ZJRFVJMTFoSENRRXY3NFlUNjdZVWk1SkpGTldJcUwyMzVzQm1qWDQrcXg5TXV2bHM1aXZ5TkVOY3R4NDZ4UUxRM2FUdUU3c3NhUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvY2FuaXVzZS1saXRlIjogewogICAgICAidmVyc2lvbiI6ICIxLjAuMzAwMDE3NzciLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FuaXVzZS1saXRlLy0vY2FuaXVzZS1saXRlLTEuMC4zMDAwMTc3Ny50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10bU4rZkp4cm9QbmRDNzRl' +
'ZkNkcDEyaiswcmswUkh3VjVKd2ExeldhRlZ5dzJaeEF1UGVHOFpnV0MzV3o3dVNqVDNxTVJRNVhIWjRDT2dRbXNDTUpBUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJmdW5kaW5nIjogWwogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vYnJvd3NlcnNsaXN0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiLAogICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9ucG0vY2FuaXVzZS1saXRlIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiZ2l0aHViIiwKICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2FpIgogICAgICAgIH0KICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiQ0MtQlktNC4wIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvY2hhbGsiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMS4yIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstNC4xLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItb0tuYmhGeVJJWHBVdWV6OGlCTW15RWE0bmJqNElPUXl1aGMvd3k5a1k3L1dWUGN3SU85VkE2NjhQdThSa083KzBHNzZTTFJPZXl3OUNwUTA2MWk0bUE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJhbnNpLXN0eWxlcyI6ICJeNC4xLjAiLAogICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNy4xLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NoYWxrL2NoYWxrP3Nwb25zb3I9MSIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvY2xzeCI6IHsKICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xzeC8tL2Nsc3gtMi4xLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVltMFFXQnRVckJXWldHMGQzODZPR0F3MTZaOTk1UGlPVm8yQjdialdTYkhlZEdsNWUwWldhcTY1a09HZ1VTTmVzRUlEa0I5SVNiVGcvSks5ZGhDWkE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvY29sb3ItY29udmVydCI6IHsKICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItY29udmVydC8tL2NvbG9yLWNvbnZlcnQtMi4wLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlJFQ1BzajdpdS94YjVvS1ljc0ZIU3BwRk5uc2ovNTJPVlRSS2I0elA1b25Yd1ZGM3pWbW1Ub05jT2ZHQytDUkRwZksvVTU4NGZNZzM4WkhDYUVsS1E9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJjb2xvci1uYW1lIjogIn4xLjEuNCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj03LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvY29sb3ItbmFtZSI6IHsKICAgICAgInZlcnNpb24iOiAiMS4xLjQiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItbmFtZS8tL2NvbG9yLW5hbWUtMS4xLjQudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZE95KzNBdVczYTJ3TmJaSEl1TVpwVGNnakd1TFUvdUJML3ViY1pGOU9YYkRvOGZmNE84eVZwNUJmMGVmUzh1RW9ZbzVxNEZ4N2RZOU9nUUdYZ0FzUUE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9jb25jYXQtbWFwIjogewogICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtbWFwLy0vY29uY2F0LW1hcC0wLjAuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5Ijog' +
'InNoYTUxMi0vU3J2NGRzd3lRTkJmb2hHcHo5bzZZYjNHejNTclVEcUJINXJUdWhHUjdhaHRsYllLblZ4dzJiQ0ZNUmxqYUE3RVhIYVhaOHdzSGRvZEZ2YmtoS21xZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2NvbnZlcnQtc291cmNlLW1hcCI6IHsKICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29udmVydC1zb3VyY2UtbWFwLy0vY29udmVydC1zb3VyY2UtbWFwLTIuMC4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUt2cDQ1OUhyVjJGRUoxQ0FzaTFLdStNWTNrYXNIMTlURnlrVHoyeFdtTWVxNmJrMk5VM1hYdmZKK1E2MW0weGt0V3d0KzFIU1lmM0pac1RtczNhUkpnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvY29va2llIjogewogICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb29raWUvLS9jb29raWUtMS4xLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZWk4QW9zN2phMHdlUnBGekpuRUE5VUhKLzdYUW1xZ2xiUnduZjJBVGpjQjlXcTg3NFZLSDlrZmpqaXJNNlVoVTIvRTVmRllhZHlseWhGbGRjcVNpZFE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL2V4cHJlc3MiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2Nyb3NzLXNwYXduIjogewogICAgICAidmVyc2lvbiI6ICI3LjAuNiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcm9zcy1zcGF3bi8tL2Nyb3NzLXNwYXduLTcuMC42LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXVWMlFPV1Aybld6c3kyYU1wOGFSaWJoaTlkbHpGNUhnaDVTSGFCOU9pVEdFeURUaUpKeXgwdXk1MVFYZHlXYnRBSE51YTRYSnpVS2NhM096S1VkM3ZBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAicGF0aC1rZXkiOiAiXjMuMS4wIiwKICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4yLjAuMCIsCiAgICAgICAgIndoaWNoIjogIl4yLjAuMSIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gOCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvY3NzdHlwZSI6IHsKICAgICAgInZlcnNpb24iOiAiMy4yLjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY3NzdHlwZS8tL2Nzc3R5cGUtMy4yLjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItejFIR0tjWXkyeEE4QUdRZndybjBQQXkrUEI3WC9HU2ozVVZKVzlxS3luNDN4V2ErZ2w1blhtVTRxcUxNUnpXVkxGQzhLdXNVWDhULzBrQ2lPWXBBSVE9PSIsCiAgICAgICJkZXZPcHRpb25hbCI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2QzLWFycmF5IjogewogICAgICAidmVyc2lvbiI6ICIzLjIuNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy1hcnJheS8tL2QzLWFycmF5LTMuMi40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRkUUFteUExOGk0Sjd3cHJwWXE4Q2xjeFp5M1NDMzFRTWVCeXlDRnlSdDdCVkhkUkVRWjVscHpvZTVtRkVZWlVXZStvcThIQnZrOUpqcGlieUVWNEpnPT0iLAogICAgICAibGljZW5zZSI6ICJJU0MiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJpbnRlcm5tYXAiOiAiMSAtIDIiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2QzLWNvbG9yIjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy1jb2xvci8tL2QzLWNvbG9yLTMuMS4wLnRneiIsCiAg' +
'ICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpnL2NoYlh5ZUJ0TVExTGJEL1dTb1cyRHBDM0kwbXBtUGRXK3luUlRqL3gyREFXWXJJWTdxZVpJSGlkb3p3VjI0bTRpYXZyMTVsTndJd0x4Um1PeGhBPT0iLAogICAgICAibGljZW5zZSI6ICJJU0MiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEyIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9kMy1lYXNlIjogewogICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy1lYXNlLy0vZDMtZWFzZS0zLjAuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi13Ui9YSzNEM1hjTElad3BidlF3UTVmSys4WWtkczFpcDdBMlR4ZTB5eG5jWFNkcTFMOXNrY0c3YmxjZWRrT1grWmNneEdBbUxYMUZyUkdiQUR3emkwdz09IiwKICAgICAgImxpY2Vuc2UiOiAiQlNELTMtQ2xhdXNlIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZDMtZm9ybWF0IjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy1mb3JtYXQvLS9kMy1mb3JtYXQtMy4xLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItQUpEZFlPZG55UkRWNWI2QXJpbHpDUFB3YzFlamtIY295RmFycWxQcVQ3elJZamhhdmNUM3VTcnFjTXZzZ2gyQ2dvUGJLM1JDd3lIYVZ5eFljUDJBcmc9PSIsCiAgICAgICJsaWNlbnNlIjogIklTQyIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlIjogewogICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy1pbnRlcnBvbGF0ZS8tL2QzLWludGVycG9sYXRlLTMuMC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNiWXMxck9EMzN1bzhhcUpmS1AzSldQQWliZ3c4Wm0yK0w5dkJLRUhKMlJnK3ZpVFI3bzVNbXY1bVpjaWVOK0ZSWWFBT1dYNVNKQVRYNmsxUFd6NzJnPT0iLAogICAgICAibGljZW5zZSI6ICJJU0MiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJkMy1jb2xvciI6ICIxIC0gMyIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZDMtcGF0aCI6IHsKICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZDMtcGF0aC8tL2QzLXBhdGgtMy4xLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcDNLUDVIQ2YvYnZqQlNTS3VYaWQ2WnFpang3d0lmTlcrSi9tYVBzK2l3UjM1YXQ1SkNiTFVUMEx6RjFjbmpiQ0hXaHF6UVRJTjJKcGU4cFJlYklFRlE9PSIsCiAgICAgICJsaWNlbnNlIjogIklTQyIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2QzLXNjYWxlIjogewogICAgICAidmVyc2lvbiI6ICI0LjAuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy1zY2FsZS8tL2QzLXNjYWxlLTQuMC4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdaVzQ2NGcxU0g3YWczWTdoWGpmOFJvVXVBRklxa2xPQXEzTVJsNE9hV2FiVEZKWTlQTi9FMVlrbGhYTGgrT1EzZk05eVMybk9rQ29TK1dMWjZrdnhRPT0iLAogICAgICAibGljZW5zZSI6ICJJU0MiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJkMy1hcnJheSI6ICIyLjEwLjAgLSAzIiwKICAgICAgICAiZDMtZm9ybWF0IjogIjEgLSAzIiwKICAgICAgICAiZDMtaW50ZXJwb2xhdGUiOiAiMS4yLjAgLSAzIiwKICAgICAgICAiZDMtdGltZSI6ICIyLjEuMSAtIDMiLAogICAgICAgICJkMy10aW1lLWZvcm1hdCI6ICIyIC0gNCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZDMtc2hhcGUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMi4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBt' +
'anMub3JnL2QzLXNoYXBlLy0vZDMtc2hhcGUtMy4yLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItU2FMQnV3R20zTU9WaVJxMkFCazNlTG94d1pFTHBINnpobDNGYkFvSjdWbTFnb2ZLeDZFbDFJYjV6MjNOVUVoRjlBc0dsN3krZHpMZTVDdzJBQXJHVEE9PSIsCiAgICAgICJsaWNlbnNlIjogIklTQyIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImQzLXBhdGgiOiAiXjMuMS4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEyIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9kMy10aW1lIjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy10aW1lLy0vZDMtdGltZS0zLjEuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WcUtqekJMZWpiU01UNElnYm1WZ0RqcGtZck5XVVlKbmJDR284NzR1N01NS0lXc0lMUlgrT3BYL2dUazhNcWpwVDFBL2M2SFkyZENBNzdaTjBsa1EyUT09IiwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZDMtYXJyYXkiOiAiMiAtIDMiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2QzLXRpbWUtZm9ybWF0IjogewogICAgICAidmVyc2lvbiI6ICI0LjEuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kMy10aW1lLWZvcm1hdC8tL2QzLXRpbWUtZm9ybWF0LTQuMS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRKeFBCbHpDN051Z0IyUERMd285UThKaVRSM00zZTQvWEFOa3JlS1NVeEY4dnZYS3FtMVlmcTRRNWRsOGJ1ZGx1blJWbFVVYURVZ0Z0N2VBOEQ2TkxnPT0iLAogICAgICAibGljZW5zZSI6ICJJU0MiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJkMy10aW1lIjogIjEgLSAzIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEyIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9kMy10aW1lciI6IHsKICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZDMtdGltZXIvLS9kMy10aW1lci0zLjAuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uZGZKL0p4eE1kM253MzF1eUtvWTJuYWl2RityMjlWK0xjMHN2WnhlMUp2dklSbWk4aFVzck12ZE93Z1MxbzZ1QkhtaXo5MWdlUTB5bFBQMGFqMVZVQT09IiwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZGVidWciOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuNC4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctNC40LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItUkd3d1dud1F2a1ZmYXZLVnQyMkZHTHcreFlTZHpBUndtMHJ1NkRoVFZBM3VtVTVoWmMyOFYza080c3RnWXJ5clRsTHB1dmdJOUdpaWpsdEFqTmJjcUE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJtcyI6ICJeMi4xLjMiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49Ni4wIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llc01ldGEiOiB7CiAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogewogICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZGVjaW1hbC5qcy1saWdodCI6IHsKICAgICAgInZlcnNpb24iOiAiMi41LjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjaW1hbC5qcy1saWdodC8tL2RlY2ltYWwuanMtbGlnaHQtMi41LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcUlNRnBUTVptbnkrTU1JaXRBQjZEN2lWUEVvclZ3NllRUldrdmFyVGtUNHRCZVNMTGlIemN3ajZxME1tWVNGQ2lWcGlxUEpUSkVZSXJwY1B6VkVJdmc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0s' +
'CiAgICAibm9kZV9tb2R1bGVzL2RlZXAtaXMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZXAtaXMvLS9kZWVwLWlzLTAuMS40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW9JUHprc21UZzQvTXJpaWFZR08rb2tYRFQ3enRuL3czRXB0di8rZ1NJZE1kS3NKbzB1NENmWU5GSlB5KzRTS011Q3FHdzJ3eG5BK1VSTWczdDhhL2JRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMS4yIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1saWJjLy0vZGV0ZWN0LWxpYmMtMi4xLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItQnRqMkJPT084M28zV3lINTllOE1nWHN4RVFWY2Fya1VPcEVZcnViQjB1cnduTjEweVEzNjRyc2lCeVUxMW5abHFXWVptMDVpL29mN2lvNG16aWhCdFE9PSIsCiAgICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2VsZWN0cm9uLXRvLWNocm9taXVtIjogewogICAgICAidmVyc2lvbiI6ICIxLjUuMzA3IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VsZWN0cm9uLXRvLWNocm9taXVtLy0vZWxlY3Ryb24tdG8tY2hyb21pdW0tMS41LjMwNy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01ejN1RktCV2ppTlI0NG5GY1lka2NYaktNYmc1S1hOZGNpdTdtaFRQbzl0QjdOYnFTTlAyc1NuR1IrZnFrblpTQ3dLa0JOK294aWlhaldzNGRUNk9SZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIklTQyIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2VuaGFuY2VkLXJlc29sdmUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjUuMjAuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbmhhbmNlZC1yZXNvbHZlLy0vZW5oYW5jZWQtcmVzb2x2ZS01LjIwLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItL2NlNytqUTFQUTZyVlh3ZStqS0VnNWhXNWNpaWNId0lRVWFnWmtwNkl1ZkJvWTNZRGdkVFRZMWF6VnMwcW9SZ1ZtdnNOQityYmpMSnhEQWVISHR3c1E9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjIuNCIsCiAgICAgICAgInRhcGFibGUiOiAiXjIuMy4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEwLjEzLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2VzLXRvb2xraXQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuNDUuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lcy10b29sa2l0Ly0vZXMtdG9vbGtpdC0xLjQ1LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItL2pob09qL0Z4K0ErSUl5RE5Pdk8zVEl0R21sTUtodFg4SVNBSEtFOTBjNGIvazF0cWFxRVordVVxZnBVOERNblc1Y2dOSnY2MDZ6UzU1akd2emEwWHc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJ3b3Jrc3BhY2VzIjogWwogICAgICAgICJkb2NzIiwKICAgICAgICAiYmVuY2htYXJrcyIKICAgICAgXQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZXNidWlsZCI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzYnVpbGQvLS9lc2J1aWxkLTAuMjcuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04VndNbnlHQ09OSXM2Y1d1ZTJJZHBIeEhuQWp6eG53MlpyN01rVnhCMnZqbVEyaXZxR0ZiNExFRzNTTW52MEdiMkYvRy8yeUE4elVhaUwxZ3l3RENDZz09IiwKICAgICAgImhhc0luc3RhbGxTY3JpcHQiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiYmluIjogewogICAgICAgICJlc2J1aWxkIjogImJpbi9lc2J1aWxkIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4IgogICAgICB9LAogICAgICAib3B0aW9uYWxEZXBlbmRlbmNp' +
'ZXMiOiB7CiAgICAgICAgIkBlc2J1aWxkL2FpeC1wcGM2NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9hbmRyb2lkLWFybSI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9hbmRyb2lkLWFybTY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL2FuZHJvaWQteDY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL2Rhcndpbi1hcm02NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9kYXJ3aW4teDY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL2ZyZWVic2QtYXJtNjQiOiAiMC4yNy4zIiwKICAgICAgICAiQGVzYnVpbGQvZnJlZWJzZC14NjQiOiAiMC4yNy4zIiwKICAgICAgICAiQGVzYnVpbGQvbGludXgtYXJtIjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL2xpbnV4LWFybTY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL2xpbnV4LWlhMzIiOiAiMC4yNy4zIiwKICAgICAgICAiQGVzYnVpbGQvbGludXgtbG9vbmc2NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9saW51eC1taXBzNjRlbCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9saW51eC1wcGM2NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9saW51eC1yaXNjdjY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL2xpbnV4LXMzOTB4IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL2xpbnV4LXg2NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9uZXRic2QtYXJtNjQiOiAiMC4yNy4zIiwKICAgICAgICAiQGVzYnVpbGQvbmV0YnNkLXg2NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC9vcGVuYnNkLWFybTY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL29wZW5ic2QteDY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL29wZW5oYXJtb255LWFybTY0IjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL3N1bm9zLXg2NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC93aW4zMi1hcm02NCI6ICIwLjI3LjMiLAogICAgICAgICJAZXNidWlsZC93aW4zMi1pYTMyIjogIjAuMjcuMyIsCiAgICAgICAgIkBlc2J1aWxkL3dpbjMyLXg2NCI6ICIwLjI3LjMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2VzY2FsYWRlIjogewogICAgICAidmVyc2lvbiI6ICIzLjIuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhbGFkZS8tL2VzY2FsYWRlLTMuMi4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVdVajJxbHhhUXRPNGc2UHE1YzI5R1RjV0dEeWQ4aXRMOHpUbGlwZ0VDejNKZXNBaWlPS290ZDhKVTZvdEIzUEFDZ0c2eGtKVXlWaGJvTVMrYmplL2pBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9lc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLXN0cmluZy1yZWdleHAvLS9lc2NhcGUtc3RyaW5nLXJlZ2V4cC00LjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UdHBjTkozWEF6eDNHcThzV1J6SmFWYWpSczB1VnhBMllBa2RiMWptMllrUHo0RzZlZ1VGQXlBM241dnRFSVplZlBrNVdhNFVYYkt1UzVmS2tKV2RnQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL3NpbmRyZXNvcmh1cyIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZXNsaW50IjogewogICAgICAidmVyc2lvbiI6ICI5LjM5LjQiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50Ly0vZXNsaW50LTkuMzkuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Yb01qZEJPd2UvZXNWZ0V2TG1Oc0QzSVJIa203ZmJLSVVHdnJsZWxvSlhVWmdESGlnMklQV05uaXYrR3dqeUpYenVOcVZqbHI1KzR5VlVaanljSndmUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBl' +
'bmRlbmNpZXMiOiB7CiAgICAgICAgIkBlc2xpbnQtY29tbXVuaXR5L2VzbGludC11dGlscyI6ICJeNC44LjAiLAogICAgICAgICJAZXNsaW50LWNvbW11bml0eS9yZWdleHBwIjogIl40LjEyLjEiLAogICAgICAgICJAZXNsaW50L2NvbmZpZy1hcnJheSI6ICJeMC4yMS4yIiwKICAgICAgICAiQGVzbGludC9jb25maWctaGVscGVycyI6ICJeMC40LjIiLAogICAgICAgICJAZXNsaW50L2NvcmUiOiAiXjAuMTcuMCIsCiAgICAgICAgIkBlc2xpbnQvZXNsaW50cmMiOiAiXjMuMy41IiwKICAgICAgICAiQGVzbGludC9qcyI6ICI5LjM5LjQiLAogICAgICAgICJAZXNsaW50L3BsdWdpbi1raXQiOiAiXjAuNC4xIiwKICAgICAgICAiQGh1bWFuZnMvbm9kZSI6ICJeMC4xNi42IiwKICAgICAgICAiQGh1bWFud2hvY29kZXMvbW9kdWxlLWltcG9ydGVyIjogIl4xLjAuMSIsCiAgICAgICAgIkBodW1hbndob2NvZGVzL3JldHJ5IjogIl4wLjQuMiIsCiAgICAgICAgIkB0eXBlcy9lc3RyZWUiOiAiXjEuMC42IiwKICAgICAgICAiYWp2IjogIl42LjE0LjAiLAogICAgICAgICJjaGFsayI6ICJeNC4wLjAiLAogICAgICAgICJjcm9zcy1zcGF3biI6ICJeNy4wLjYiLAogICAgICAgICJkZWJ1ZyI6ICJeNC4zLjIiLAogICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeNC4wLjAiLAogICAgICAgICJlc2xpbnQtc2NvcGUiOiAiXjguNC4wIiwKICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeNC4yLjEiLAogICAgICAgICJlc3ByZWUiOiAiXjEwLjQuMCIsCiAgICAgICAgImVzcXVlcnkiOiAiXjEuNS4wIiwKICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAogICAgICAgICJmYXN0LWRlZXAtZXF1YWwiOiAiXjMuMS4zIiwKICAgICAgICAiZmlsZS1lbnRyeS1jYWNoZSI6ICJeOC4wLjAiLAogICAgICAgICJmaW5kLXVwIjogIl41LjAuMCIsCiAgICAgICAgImdsb2ItcGFyZW50IjogIl42LjAuMiIsCiAgICAgICAgImlnbm9yZSI6ICJeNS4yLjAiLAogICAgICAgICJpbXVybXVyaGFzaCI6ICJeMC4xLjQiLAogICAgICAgICJpcy1nbG9iIjogIl40LjAuMCIsCiAgICAgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkiOiAiXjEuMC4xIiwKICAgICAgICAibG9kYXNoLm1lcmdlIjogIl40LjYuMiIsCiAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4xLjUiLAogICAgICAgICJuYXR1cmFsLWNvbXBhcmUiOiAiXjEuNC4wIiwKICAgICAgICAib3B0aW9uYXRvciI6ICJeMC45LjMiCiAgICAgIH0sCiAgICAgICJiaW4iOiB7CiAgICAgICAgImVzbGludCI6ICJiaW4vZXNsaW50LmpzIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vZXNsaW50Lm9yZy9kb25hdGUiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJqaXRpIjogIioiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzTWV0YSI6IHsKICAgICAgICAiaml0aSI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMC4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MvLS9lc2xpbnQtcGx1Z2luLXJlYWN0LWhvb2tzLTcuMC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU8wZDBtMDRldmFOekVQb1NXKzU5TWV6ZjhRdDBJbmZnR0lCSm5wQzBoM05IL1dqVUFSN0JJS1VmeXNDNnRvZG10aVovQTBvVVZTOEdjZTBXaEJySHNBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGJhYmVsL2NvcmUiOiAiXjcuMjQuNCIsCiAgICAgICAgIkBiYWJlbC9wYXJzZXIiOiAiXjcuMjQuNCIsCiAgICAgICAgImhlcm1lcy1wYXJzZXIiOiAiXjAuMjUuMSIsCiAgICAgICAgInpvZCI6ICJeMy4yNS4wIHx8IF40LjAuMCIsCiAgICAgICAgInpvZC12YWxpZGF0aW9uLWVycm9yIjogIl4zLjUuMCB8fCBeNC4wLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0sCiAgICAg' +
'ICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJlc2xpbnQiOiAiXjMuMC4wIHx8IF40LjAuMCB8fCBeNS4wLjAgfHwgXjYuMC4wIHx8IF43LjAuMCB8fCBeOC4wLjAtMCB8fCBeOS4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2VzbGludC1wbHVnaW4tcmVhY3QtcmVmcmVzaCI6IHsKICAgICAgInZlcnNpb24iOiAiMC40LjI2IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1wbHVnaW4tcmVhY3QtcmVmcmVzaC8tL2VzbGludC1wbHVnaW4tcmVhY3QtcmVmcmVzaC0wLjQuMjYudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItMVJFVEV5bGh0Mk82Rk0vTXZnbnl2VCs4SzIxd0xxRE5nNHFENTFaajNndWhqdDQzM1hibm5rVnR0SE15YVZ5QUZEMDNRU1Y0TFBTNWlFM1ZRbU83WFE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZXNsaW50IjogIj49OC40MCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZXNsaW50LXNjb3BlIjogewogICAgICAidmVyc2lvbiI6ICI4LjQuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtc2NvcGUvLS9lc2xpbnQtc2NvcGUtOC40LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItc05YT2ZLQ243NHJ0OFJJQ0tNdkpTN1hLVi9YazlrQTdEeUpyOG1KaWszUzdDd2d5M3Fsa2tteVMydVFCM2ppSmc2Vk5kWmQvcERCSnUwbnZHMk5sVGc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJCU0QtMi1DbGF1c2UiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJlc3JlY3Vyc2UiOiAiXjQuMy4wIiwKICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNS4yLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vZXNsaW50IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9lc2xpbnQtdmlzaXRvci1rZXlzIjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdmlzaXRvci1rZXlzLy0vZXNsaW50LXZpc2l0b3Ita2V5cy00LjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VaGRrNXNmcWNlZS85SC9yQ09KaWtZejY3bzBhMlR3MmhHUlBPRzJZMVIyZGc3YnJSZTF1RzB5YU5RREh1K1RPL3VRUEYvNWVDYXB2WVNtSFVqdDdKUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL2VzbGludCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZXNwcmVlIjogewogICAgICAidmVyc2lvbiI6ICIxMC40LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmVlLy0vZXNwcmVlLTEwLjQuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qNlBBUTJ1VXI3OVBaaEJqUDVDNWZobDhlMzlGbVJuT2pzRDVsR25XckZVOGkyRzc3NnRCSzcrblA4S3VRVVRUeUFaVXdmUXFYQWdyVkg1TWJIOUNZUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkJTRC0yLUNsYXVzZSIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImFjb3JuIjogIl44LjE1LjAiLAogICAgICAgICJhY29ybi1qc3giOiAiXjUuMy4yIiwKICAgICAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6ICJeNC4yLjEiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl4xOC4xOC4wIHx8IF4yMC45LjAgfHwgPj0yMS4xLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vZXNsaW50IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9lc3F1ZXJ5Ijog' +
'ewogICAgICAidmVyc2lvbiI6ICIxLjcuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3F1ZXJ5Ly0vZXNxdWVyeS0xLjcuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BcDZHMFdRd2NVL0xIc3ZMd09OMWZBUVg5WnAwQTJZNlkvY0pCbDlyL0piVzkwWnlnNC96Ykc2enpLYTJPVEFMRUxhcllIbUt1MEdocE01RU8rN1QwZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkJTRC0zLUNsYXVzZSIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImVzdHJhdmVyc2UiOiAiXjUuMS4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTAuMTAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2VzcmVjdXJzZSI6IHsKICAgICAgInZlcnNpb24iOiAiNC4zLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNyZWN1cnNlLy0vZXNyZWN1cnNlLTQuMy4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUttZktMM2I2RytSWHZQOE4xdnIzVHExa0wvb0NGZ24yTllYRXRxUDgvTDNwS2FwVUE0RzhjRlZhb0YzU1UzMjNDRDRYeXBSL2ZmaW9IbWt0aTYvVGFnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiQlNELTItQ2xhdXNlIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNS4yLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9lc3RyYXZlcnNlIjogewogICAgICAidmVyc2lvbiI6ICI1LjMuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3RyYXZlcnNlLy0vZXN0cmF2ZXJzZS01LjMuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NTWRBUnVWRVF6aU5UZUpEOERnTXFtaHdSMTFCUlEvY0JQK3BMdFlkU1RuZjNNSU84ZkZlaUlORWJYMzZaZE5sZlUvN0E5ZjNnVXc0OUIzb1FzdndCQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkJTRC0yLUNsYXVzZSIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9lc3V0aWxzIjogewogICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3V0aWxzLy0vZXN1dGlscy0yLjAuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1rVnNjcVhrNE9DcDY4U1owZGtnRUtWaTYvOGlqMzAwS0JXVEpxMzJQL2RZZVdUU3dLNDFXeVR4YWxOMWVSbUE1WjlVVS9MWDlEN0ZXU21WOVNBWXg2Zz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIkJTRC0yLUNsYXVzZSIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC4xMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzIjogewogICAgICAidmVyc2lvbiI6ICI1LjAuNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ldmVudGVtaXR0ZXIzLy0vZXZlbnRlbWl0dGVyMy01LjAuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tbHNUUnlHYVBCalBlZGs2QnZ3K2FxYnNYRHRvQXlBem01TU83SmdVK3lWUnlNUTVPOGJENEtjY2k3QlM4NWY5M3ZlZWdlQ1BrTDhSNEdMQ2xuakxGdz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvZmFzdC1kZWVwLWVxdWFsIjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRlZXAtZXF1YWwvLS9mYXN0LWRlZXAtZXF1YWwtMy4xLjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZjNxUTlvUXk5ajJBaEJlL0g5VkM5MXdMbUtCQ0NVL2dET25LTkFZRzVoc3dPN0JMS2owOUhjNUhZTno5Y0dJKyt4bHBEQ0lnRGFpdFZzMDNBVFI4NFE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKICAgICAgInZlcnNpb24iOiAiMi4x' +
'LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvLS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS0yLjEuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1saGQvd0YrTGs5OEhab1RDdGxWcmFIdGZoNVhZaWpJamFsWGNrN3NhVXR1YW5TRHlMTXhuSGhTWEVESnFIeEQ3bXNSOEQwdUNtcWxrd2pDVjh4dndIdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2Zhc3QtbGV2ZW5zaHRlaW4iOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtbGV2ZW5zaHRlaW4vLS9mYXN0LWxldmVuc2h0ZWluLTIuMC42LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURDWHU2SWZocWNrczdUWktZM0h4cDN5NnFwaFk1U0pabXJXTURyS2NFUlNPWFdRZE1oVTlJZy9QWXJ6eXcvdWw5ak9JeWgwTjRNMHRiQzVob2RnOGR3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvZmRpciI6IHsKICAgICAgInZlcnNpb24iOiAiNi41LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmRpci8tL2ZkaXItNi41LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItdEliWXRaYnVjT3MwQlJHcVBKa3NoSlVZZEwrU0RIN2RWTThnankrRVJwM1dBVWpMRUZKRSswMmthbnlIdHdqV09ud3JLWUJpd0FtTTBwNGtMSkFuWGc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTIuMC4wIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAicGljb21hdGNoIjogIl4zIHx8IF40IgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llc01ldGEiOiB7CiAgICAgICAgInBpY29tYXRjaCI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2ZpbGUtZW50cnktY2FjaGUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjguMC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbGUtZW50cnktY2FjaGUvLS9maWxlLWVudHJ5LWNhY2hlLTguMC4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhYVFV3Q3Zpc2E1b2FjTkdSUDlTZk50WUJOQU1pK1JQd0JGbWJsWkVGN043c3dIWVFTNi9aZms3U1J3eDRENWozQ0gyMTFZTlJjbzFERU1OVmZaQ25RPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZmxhdC1jYWNoZSI6ICJeNC4wLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTYuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9maW5kLXVwIjogewogICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kLXVwLy0vZmluZC11cC01LjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03OC9QWFQxd2xMTERnVHpEczdzanE5aHp6MHZYRCt6bis3d3lwRWU0ZlhReENtZG1xZkdzRVBReG1pQ1NRSTNhakZWOTFiVlNzdk50ckpSaVc2bkduZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImxvY2F0ZS1wYXRoIjogIl42LjAuMCIsCiAgICAgICAgInBhdGgtZXhpc3RzIjogIl40LjAuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvc2luZHJlc29yaHVzIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9mbGF0LWNhY2hlIjogewogICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGF0LWNhY2hlLy0vZmxhdC1jYWNoZS00LjAuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNo' +
'YTUxMi1mN2NjRlBLM1NYRkhweDE1VUlHeVJKL0ZKUWN0dUtaMHpWdU4zZnJCbzRIbkszY2F5OVZFVzBSNnlQWUZIQzBBZ3FodWtQektqcTIydDVEbUF5cUd5dz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImZsYXR0ZWQiOiAiXjMuMi45IiwKICAgICAgICAia2V5diI6ICJeNC41LjQiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTYiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2ZsYXR0ZWQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuNC4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZsYXR0ZWQvLS9mbGF0dGVkLTMuNC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUl4ZlZiUkZWbFY4Vi95UmFHemswVVZJY3NLS0hNU2ZZdzY2VC91NG5Ud2xXdGVRZVBzeGUvL0xqdWRSMUFNWDR0WlczV0ZDaDNacWEvc2pscXBiVVJRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiSVNDIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvZnNldmVudHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMy4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzZXZlbnRzLy0vZnNldmVudHMtMi4zLjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNXhvRGZYK2ZMN2ZhQVRuYWdtV1BwYkZ0d2gvUjc3V21NTXFxSEdTNjVDM3Z2QjBZSHJnRitCMVltWjM0NDF0TWo1bjYzazAyMTJYTm9Kd3psaGZmUXc9PSIsCiAgICAgICJoYXNJbnN0YWxsU2NyaXB0IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJkYXJ3aW4iCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIl44LjE2LjAgfHwgXjEwLjYuMCB8fCA+PTExLjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZ2Vuc3luYyI6IHsKICAgICAgInZlcnNpb24iOiAiMS4wLjAtYmV0YS4yIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dlbnN5bmMvLS9nZW5zeW5jLTEuMC4wLWJldGEuMi50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0zaE43TmFza1l2TURMUVk1NWduVzNOUSttZXNFQWVwVHFsZytWRWJqN3p6cUVNQlZOaHpjR1lZZXFGby9UbFl6NmVRaUZjcDFIY3NDWk8rbkdnUzh6Zz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49Ni45LjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2dsb2ItcGFyZW50IjogewogICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLXBhcmVudC8tL2dsb2ItcGFyZW50LTYuMC4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVh4d0k4RU9oVlFnV3A2aURMKzNiMHI4NmY0ZDZBWDZ6U1U1NUhmQjR5ZENFdVhMWGM1RmNZZU91K25uR2Z0UzRURWp1LzExcnQ0S0pQVE1nYmZtdjRBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiaXMtZ2xvYiI6ICJeNC4wLjMiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTAuMTMuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZ2xvYmFscyI6IHsKICAgICAgInZlcnNpb24iOiAiMTYuNS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JhbHMvLS9nbG9iYWxzLTE2LjUuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jL2MxNWkyNlZySjRJUnQ1Wjg5RG5JekNHRG45RWNlYmliaEFPanc1aWJxRUhzRTF3TFVna1BuOVJEbU5jVUt5VTg3R2VhTDYzM255SitwcGxGUjJaUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL3NpbmRyZXNv' +
'cmh1cyIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvZ3JhY2VmdWwtZnMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMi4xMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncmFjZWZ1bC1mcy8tL2dyYWNlZnVsLWZzLTQuMi4xMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SYko1L2ptRmNOTkNjRFY1bzllVG5CTEovSHN6V1YwUDczYmMrRmY0blMvckpqK1lhUzZJR3lpT0wwVm9CWVgrbDFXcmwzazYzaC9LckgrbmhKMFh2UT09IiwKICAgICAgImxpY2Vuc2UiOiAiSVNDIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvaGFzLWZsYWciOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctNC4wLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItRXlrSlQvUTFLalRXY3RwcGdJQWdmU08wdEtWdVpVamhnTXIxN2txVHVtTWw2QWZ2M0VJU2xlVTdxWlV6b1hERlRBSFREQzROT29HL1p4VTNFdmxNUFE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2hlcm1lcy1lc3RyZWUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMjUuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oZXJtZXMtZXN0cmVlLy0vaGVybWVzLWVzdHJlZS0wLjI1LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItMHdVb0NjTHArNUV2NXBEVzJPcmlIQzJNSkNid0x3dVJ4K2dBcU1UT2tHS0pKaUJDTGp0cnZ5NFBXVUduNk1JVmVmZWNScHpvT1ovVVY2aUdkT3IrQ3c9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9oZXJtZXMtcGFyc2VyIjogewogICAgICAidmVyc2lvbiI6ICIwLjI1LjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGVybWVzLXBhcnNlci8tL2hlcm1lcy1wYXJzZXItMC4yNS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZwRWpxdUgzcnFhSTZjWUFYWVBjejlNUzRyWTZSNG5nUmdyZ2ZEc2hScHRVWkljM2x3ME1DSUpJR0RqOSsrbWZ5U091UFRIQjRuclNXOTlCQ3ZPUElBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiaGVybWVzLWVzdHJlZSI6ICIwLjI1LjEiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2lnbm9yZSI6IHsKICAgICAgInZlcnNpb24iOiAiNS4zLjIiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWdub3JlLy0vaWdub3JlLTUuMy4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWhzQlROVXFRVER3a1d0Y2RZSTJpMDZZL25VQkVzTkVESktqV2RpZ0x2ZWd5OGtEdUpBUzh1Umxwa2tjUXB5RVhMMFovcGpEeTVIQm1NalJDSjJncStnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gNCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvaW1tZXIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEwLjIuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbW1lci8tL2ltbWVyLTEwLjIuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1kLytYVE4zemZPRHlqcjg5Z00zbVBxMVdOWDJCOHBZc3U3ZU9SaXRkd3lBMnNCdWJuVGwzbGFZbEJrNHNYWTVGVWE1cVRaR0JEUEpJQ1ZidnF6amxidz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vaW1tZXIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2ltcG9ydC1mcmVzaCI6IHsKICAgICAgInZlcnNpb24iOiAiMy4zLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW1wb3J0LWZyZXNoLy0vaW1wb3J0LWZyZXNoLTMuMy4xLnRn' +
'eiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRSM0tmclRaVFlMUEI2alVqZng2TUY5V2NXckhMOXN1NVRPYks0WmtZZ0JkV0tQT0ZvU29RSWRFdVR1UjgycG10eEgyc3BXRzloNmV0d2ZyMXBMQnFRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAicGFyZW50LW1vZHVsZSI6ICJeMS4wLjAiLAogICAgICAgICJyZXNvbHZlLWZyb20iOiAiXjQuMC4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL3NpbmRyZXNvcmh1cyIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvaW11cm11cmhhc2giOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ltdXJtdXJoYXNoLy0vaW11cm11cmhhc2gtMC4xLjQudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItSm1YTVo2d3V2RG1MaUhFbWw5eWt6cU82bHdGYm9mMEdHNElrY0dhRU5kQ1JERG1NVm5ueTdzNUhzSWdIQ2JhcTB3Mk15UGhEcWtoVFVnUzJMVTJQSEE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTAuOC4xOSIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvaW50ZXJubWFwIjogewogICAgICAidmVyc2lvbiI6ICIyLjAuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbnRlcm5tYXAvLS9pbnRlcm5tYXAtMi4wLjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNUhoN1kxd1Fidlk1b29HZ1BiRGFMNWlZTEFQek1UVXJqTXVsc2tITEg2d252L0ErMXE1cmdFYWl1cUVqQitveEdYSVZaczFGRitSL0tQTjNaU1FZWWc9PSIsCiAgICAgICJsaWNlbnNlIjogIklTQyIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2lzLWV4dGdsb2IiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGdsb2IvLS9pcy1leHRnbG9iLTIuMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVNiS2JBTmtONjAzVmk0akVadjQ5TGVWSk1uNHlHd3Nielp3b3JFb3lFaXV0c04zbkpZZGJPMzZ6ZmhHSjZRRURwT1pJRmtEdG5xNUpSeG12bDNqc29RPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0wLjEwLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2lzLWdsb2IiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMC4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWdsb2IvLS9pcy1nbG9iLTQuMC4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhlbFNheUhIMzZaZ0U3WldobGk3cFczNGhOYk5sOE9qdjVLVm1rSkQ0aEJkRDN0aDhUZms5dllhc0xNK21YV09aaEZrZ1pmeGhMU25yd1JyNGVsU1NnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiaXMtZXh0Z2xvYiI6ICJeMi4xLjEiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC4xMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9pc2V4ZSI6IHsKICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SSHhNTHA5bG5LSEdIUm5nOVFGaFJDTWJZQWNWcG42OXNtU0djcTNmMzZ4amdWVldUaGo0cXFMYlRMbHE3U3NqOEIrZklRMUV1Q0VHSTJsS3N5UWVJdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIklTQyIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2ppdGkiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuNi4xIiwKICAgICAgInJlc29s' +
'dmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ppdGkvLS9qaXRpLTIuNi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVraWxDU04xandSdkliZ2VnLzU3WUZoOHFRRE5id0RiOXhUL3F1MkRBSGJGRlpVaWNJbDR5Z1ZhQXZ6dmVNaE1WcjNMbnBTS1RObnd0OFBvT2ZtS2hRPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiYmluIjogewogICAgICAgICJqaXRpIjogImxpYi9qaXRpLWNsaS5tanMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2pzLXRva2VucyI6IHsKICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMtdG9rZW5zLy0vanMtdG9rZW5zLTQuMC4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJkSlVmbGNFM2NVektpTXFRZ3NDdTA2RlB1OVVkSUpPMGJlWWJQaEhONGs2YXBnSnRpZmNvQ3RUOWJjeE9wWUJ0cEQya0NNNlNiemc0Q2F1c1cvUEtRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvanMteWFtbCI6IHsKICAgICAgInZlcnNpb24iOiAiNC4xLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtNC4xLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVFLVDR6UXhYbDhsTHdCdEhNV3dhVGNHZkZPWnZpT0pldDNPeS94bUdrMmdaSDY3N0NKTTlFdnRmZFNrZ1djQVRaaGovNTVKWjBybXkzbXlDVDVsc0E9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJhcmdwYXJzZSI6ICJeMi4wLjEiCiAgICAgIH0sCiAgICAgICJiaW4iOiB7CiAgICAgICAgImpzLXlhbWwiOiAiYmluL2pzLXlhbWwuanMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2pzZXNjIjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2VzYy8tL2pzZXNjLTMuMS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS9zTTNkTzJGT3pYaktRaEp1bzBRMTczd2YyS09vOHQ0STh2SHk2bEY5cG9VcDdiS1QwL05IRThmUFgyM1B3ZmhueWtmcW5DMnhSeE9uVnc1WHVHSWFBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImJpbiI6IHsKICAgICAgICAianNlc2MiOiAiYmluL2pzZXNjIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTYiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2pzb24tYnVmZmVyIjogewogICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLWJ1ZmZlci8tL2pzb24tYnVmZmVyLTMuMC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRiVjVCZlIybXFmUVRKbStWNXRQUGRmK1pwdWhpSXZUdUFCNWc4a2NyWE9acFRUL1F3d1ZSV0J5d1gxb3pyNmxFdVBkYkh4d2FKbG05RzZtSTJzZlNRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvanNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc2NoZW1hLXRyYXZlcnNlLy0vanNvbi1zY2hlbWEtdHJhdmVyc2UtMC40LjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTIteGJiQ0g1ZENZVTVUOExjRWhodWg3SEo4OEhYdVczcXNJM1kwek9aRktmWkVIY3BXaUhVL0p4ems2MjlCcnNhYi9tTWlIUXRpOXdNUCs4NDVSUGUzVmc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9qc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5IjogewogICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5Ly0vanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS0xLjAu' +
'MS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CZGJveStsN3RBM09HVzZGanlGSFdrUDVMdUJ5ajFUazMzTGp5cTBheHl6ZGs5Ly9KU2kydTNmUDFRU21kMUtOd3E2Vk9LWUdsQXU4N0Npc1ZpcjZQdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2pzb241IjogewogICAgICAidmVyc2lvbiI6ICIyLjIuMyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uNS8tL2pzb241LTIuMi4zLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhtT1dlN2V5SFlIMTRjTGRWUG95ZytHT0gzcllYKytLcHpyeWxKd1NXOTh0M05rK1U4WE9sOEZXS09nd3R6ZGI4bFhHZjZ6WXdEVXplSE1XZnhhc3lnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImJpbiI6IHsKICAgICAgICAianNvbjUiOiAibGliL2NsaS5qcyIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9rZXl2IjogewogICAgICAidmVyc2lvbiI6ICI0LjUuNCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rZXl2Ly0va2V5di00LjUuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1veFZIa0hSL0VKZjJDTlhuV3hSTFc2bWc3SnlDQ1VjRzBEdEVHbUwyY3RVbzFQTlRpbjFQVWlsK3IvKzRyNU1wVmdDL2ZuMWtqc3g3bWpTdWpLcUlwdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImpzb24tYnVmZmVyIjogIjMuMC4xIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9sZXZuIjogewogICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZuLy0vbGV2bi0wLjQuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rYlQydUg0RTVMR0U3aC9uM2V2Y1Mvc1FsSlhDcElwNnltOE9XSjVlVjYrNjdEc3FsL0xhYVQ3cUpCQXQycnpmb2EvNVFCR0JoeERpeDFkTXQya1FLUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInByZWx1ZGUtbHMiOiAiXjEuMi4xIiwKICAgICAgICAidHlwZS1jaGVjayI6ICJ+MC40LjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDAuOC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9saWdodG5pbmdjc3MiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMzEuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9saWdodG5pbmdjc3MvLS9saWdodG5pbmdjc3MtMS4zMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWw1MU4ycjkzV21HVXllM1d1Rm9ONWsxMHp5dnJWczBxZktCaHlDNW9nVVE2RXc2SlVTc3doNzhtYlNPK0lVM25UV3N5T0FycVBDY1NoZFFTYWRnaEJRPT0iLAogICAgICAibGljZW5zZSI6ICJNUEwtMi4wIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZGV0ZWN0LWxpYmMiOiAiXjIuMC4zIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAxMi4wLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3BhcmNlbCIKICAgICAgfSwKICAgICAgIm9wdGlvbmFsRGVwZW5kZW5jaWVzIjogewogICAgICAgICJsaWdodG5pbmdjc3MtYW5kcm9pZC1hcm02NCI6ICIxLjMxLjEiLAogICAgICAgICJsaWdodG5pbmdjc3MtZGFyd2luLWFybTY0IjogIjEuMzEuMSIsCiAgICAgICAgImxpZ2h0bmluZ2Nzcy1kYXJ3aW4teDY0IjogIjEuMzEuMSIsCiAgICAgICAgImxpZ2h0bmluZ2Nzcy1mcmVlYnNkLXg2NCI6ICIxLjMxLjEiLAogICAgICAgICJsaWdodG5pbmdjc3MtbGludXgtYXJtLWdudWVhYmloZiI6ICIxLjMxLjEiLAogICAgICAgICJsaWdodG5pbmdjc3MtbGludXgtYXJtNjQtZ251IjogIjEuMzEuMSIsCiAgICAgICAgImxpZ2h0bmluZ2Nzcy1saW51eC1hcm02' +
'NC1tdXNsIjogIjEuMzEuMSIsCiAgICAgICAgImxpZ2h0bmluZ2Nzcy1saW51eC14NjQtZ251IjogIjEuMzEuMSIsCiAgICAgICAgImxpZ2h0bmluZ2Nzcy1saW51eC14NjQtbXVzbCI6ICIxLjMxLjEiLAogICAgICAgICJsaWdodG5pbmdjc3Mtd2luMzItYXJtNjQtbXN2YyI6ICIxLjMxLjEiLAogICAgICAgICJsaWdodG5pbmdjc3Mtd2luMzIteDY0LW1zdmMiOiAiMS4zMS4xIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9saWdodG5pbmdjc3MtYW5kcm9pZC1hcm02NCI6IHsKICAgICAgInZlcnNpb24iOiAiMS4zMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZ2h0bmluZ2Nzcy1hbmRyb2lkLWFybTY0Ly0vbGlnaHRuaW5nY3NzLWFuZHJvaWQtYXJtNjQtMS4zMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhYSkYzeDh3OW5RNGpiWFJpTnBwQkNxZVpQSUFmVW84ekUva09FR2JXNU5adkdjL0s3bk14YmhJcitZbEZsSFc1bXBiZy9ZRlBkYm5DaDF3QVhDS0ZnPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTVBMLTIuMCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiYW5kcm9pZCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMTIuMC4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9wYXJjZWwiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy1kYXJ3aW4tYXJtNjQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMzEuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9saWdodG5pbmdjc3MtZGFyd2luLWFybTY0Ly0vbGlnaHRuaW5nY3NzLWRhcndpbi1hcm02NC0xLjMxLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItMDJ1VEVxZjN2SWZOTXEzaC96MmNKZmNPWG5RMEdSd1Fya21QYWZodWVMYjJoN21xRWlkaUN6a0U0Z0JNRUg2NWFiSFJpUXZoZGNRK2FQMEQwZzY3c2c9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybTY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNUEwtMi4wIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJkYXJ3aW4iCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDEyLjAuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vcGFyY2VsIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9saWdodG5pbmdjc3MtZGFyd2luLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMS4zMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZ2h0bmluZ2Nzcy1kYXJ3aW4teDY0Ly0vbGlnaHRuaW5nY3NzLWRhcndpbi14NjQtMS4zMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFPYmh5b0NZK3RHeHRzejFsU3g1TlhDajNuaXJrMFkwa0IvZzhCOERUK3NTeDRHOWRqaXRnOWVqRm5qYjNnSk5XbzdxWEg0REl5MlNVSHZwb0Z3ZlRBPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1QTC0yLjAiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImRhcndpbiIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMTIuMC4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9wYXJjZWwiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy1mcmVlYnNkLXg2NCI6IHsKICAgICAgInZlcnNpb24iOiAiMS4zMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZ2h0bmluZ2Nzcy1mcmVlYnNkLXg2NC8tL2xpZ2h0bmluZ2Nzcy1mcmVlYnNkLXg2NC0xLjMxLjEudGd6IiwK' +
'ICAgICAgImludGVncml0eSI6ICJzaGE1MTItMVJJTm1RS0FJdE82SVN4WWdQd3N6UUUxQnJzVlU1YUI0NWhvNk80Mm11OTZVaVpCeEVYc3VRN2NKVzR6czRDRW9kUFVpb2ovUXJYVzFyOXBMVU03NEE9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTVBMLTIuMCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAiZnJlZWJzZCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMTIuMC4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9wYXJjZWwiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy1saW51eC1hcm0tZ251ZWFiaWhmIjogewogICAgICAidmVyc2lvbiI6ICIxLjMxLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlnaHRuaW5nY3NzLWxpbnV4LWFybS1nbnVlYWJpaGYvLS9saWdodG5pbmdjc3MtbGludXgtYXJtLWdudWVhYmloZi0xLjMxLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItT09DbTIvL01aSjg3Q2RESzYyclpJdSthdzlnQnY0YXpNSnVBOC9LQjc0d21mUzNsbkM0eW9QSG0wdVhaL2R2Tk5IbW5abkI4WExBWnpPYmVHMG5TMWc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybSIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTVBMLTIuMCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDEyLjAuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vcGFyY2VsIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9saWdodG5pbmdjc3MtbGludXgtYXJtNjQtZ251IjogewogICAgICAidmVyc2lvbiI6ICIxLjMxLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlnaHRuaW5nY3NzLWxpbnV4LWFybTY0LWdudS8tL2xpZ2h0bmluZ2Nzcy1saW51eC1hcm02NC1nbnUtMS4zMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVdLeUxXenRENzFyVG5vdTR4QUQ1a1FUKzk4Mnd2Y2E3RTZRb0xwb2F3WjFnUDlKTTBHSmo0VHA1ak1VaDlCM0FpdEhiUloyL0gzVzV4UW1kRU9VbExnPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTVBMLTIuMCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDEyLjAuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vcGFyY2VsIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9saWdodG5pbmdjc3MtbGludXgtYXJtNjQtbXVzbCI6IHsKICAgICAgInZlcnNpb24iOiAiMS4zMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZ2h0bmluZ2Nzcy1saW51eC1hcm02NC1tdXNsLy0vbGlnaHRuaW5nY3NzLWxpbnV4LWFybTY0LW11c2wtMS4zMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1WWjdQZzJ6SWJlM1hsTmJaSmRqczg2WVZpUUZvSlNwYzQxQ2JWbUtCUGlHbUM0WXJmZU95ejY1bXMycXBBb2JWZDdXUXNiVzRQZHNTSkVNeW15SU1nPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJhcm02NCIKICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTVBMLTIuMCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAibGludXgiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDEyLjAuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAi' +
'aHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vcGFyY2VsIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9saWdodG5pbmdjc3MtbGludXgteDY0LWdudSI6IHsKICAgICAgInZlcnNpb24iOiAiMS4zMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZ2h0bmluZ2Nzcy1saW51eC14NjQtZ251Ly0vbGlnaHRuaW5nY3NzLWxpbnV4LXg2NC1nbnUtMS4zMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhHbEZXUk1sKzBLdlVoZ3lTZElhUmVRZEI0Rk51ZGZVVEFSbjdxMGhoL1Y2N1BWR0NzM0FERmp3KzYrK2tHMVJOZDB6ZEdSbEVLYStUMTMvdFFqUE1BPT0iLAogICAgICAiY3B1IjogWwogICAgICAgICJ4NjQiCiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1QTC0yLjAiLAogICAgICAib3B0aW9uYWwiOiB0cnVlLAogICAgICAib3MiOiBbCiAgICAgICAgImxpbnV4IgogICAgICBdLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAxMi4wLjAiCiAgICAgIH0sCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL3BhcmNlbCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvbGlnaHRuaW5nY3NzLWxpbnV4LXg2NC1tdXNsIjogewogICAgICAidmVyc2lvbiI6ICIxLjMxLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlnaHRuaW5nY3NzLWxpbnV4LXg2NC1tdXNsLy0vbGlnaHRuaW5nY3NzLWxpbnV4LXg2NC1tdXNsLTEuMzEuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lb3dGOFByS0h3OUxwb1ppaTV0ZFp3bkJjWUR4UncyclJDeXZBWExpMzRpeWVZZnFDUU5BOXJtVU0wY2U2Mk5sUGhDdm9mMSs5aXZSYVRZNnBTS0RhQT09IiwKICAgICAgImNwdSI6IFsKICAgICAgICAieDY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNUEwtMi4wIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJsaW51eCIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMTIuMC4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9wYXJjZWwiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy13aW4zMi1hcm02NC1tc3ZjIjogewogICAgICAidmVyc2lvbiI6ICIxLjMxLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlnaHRuaW5nY3NzLXdpbjMyLWFybTY0LW1zdmMvLS9saWdodG5pbmdjc3Mtd2luMzItYXJtNjQtbXN2Yy0xLjMxLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItYUpSZUViU0VRengxdUJsUWl6QU9CU2pjbXI5ZENkTDNYdUMvNkhMWEF4bXRFcnNqMklDbzV5WWdnZzFxT09EUU10bmpOUXYyVUhiOU5wT3VGdFllNHc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgImFybTY0IgogICAgICBdLAogICAgICAibGljZW5zZSI6ICJNUEwtMi4wIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKICAgICAgIm9zIjogWwogICAgICAgICJ3aW4zMiIKICAgICAgXSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMTIuMC4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9wYXJjZWwiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy13aW4zMi14NjQtbXN2YyI6IHsKICAgICAgInZlcnNpb24iOiAiMS4zMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xpZ2h0bmluZ2Nzcy13aW4zMi14NjQtbXN2Yy8tL2xpZ2h0bmluZ2Nzcy13aW4zMi14NjQtbXN2Yy0xLjMxLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItSTlhaUZyYmQ3b1lId2xuUURxcjFSb3orZlR6NjFvRERKWDduOXRZRjlGSnltSDFjSU4xRHRLdzNpWXQ2YjhXWmdFam9Od1ZTbmN3RjR3eC9aZWRNaHc9PSIsCiAgICAgICJjcHUiOiBbCiAgICAgICAgIng2NCIKICAgICAg' +
'XSwKICAgICAgImxpY2Vuc2UiOiAiTVBMLTIuMCIsCiAgICAgICJvcHRpb25hbCI6IHRydWUsCiAgICAgICJvcyI6IFsKICAgICAgICAid2luMzIiCiAgICAgIF0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDEyLjAuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInR5cGUiOiAib3BlbmNvbGxlY3RpdmUiLAogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vcGFyY2VsIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9sb2NhdGUtcGF0aCI6IHsKICAgICAgInZlcnNpb24iOiAiNi4wLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9jYXRlLXBhdGgvLS9sb2NhdGUtcGF0aC02LjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pUFpLNmVZamJ4UnUzdUI0L1daM0VzRUlNSkZNcUFvb3BsM1IrenVxMFVqY0FtL01PNktDd2VEZ1BmUDNlbFR6dG9LUDNLdG5WSHhUbjJOSEJTRFZVdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInAtbG9jYXRlIjogIl41LjAuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvc2luZHJlc29yaHVzIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9sb2Rhc2gubWVyZ2UiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuNi4yIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvZGFzaC5tZXJnZS8tL2xvZGFzaC5tZXJnZS00LjYuMi50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0wS3BqcVhSVnZyWXlDc1gxc3dSL1hUSzB2YTZWUWtRTTZNTm83UHFXNzdCeWpBaG9BUkE4RWZyUDFONCtLbEtqOFlTMFpVQ3RSVC9ZVXVoeVlEdWpJUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2xydS1jYWNoZSI6IHsKICAgICAgInZlcnNpb24iOiAiNS4xLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbHJ1LWNhY2hlLy0vbHJ1LWNhY2hlLTUuMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUtwTkFSUUEzSXd2K2pUQTB1dFVWVmJyaCtKbHJyMUZ2MGU1NkdHekFGT1hON2RrL0Z2aWFEVzhMSG1LNTJEbGNINFdQMm42Z0k4dk4xYWVzQkZnbzl3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAieWFsbGlzdCI6ICJeMy4wLjIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL2x1Y2lkZS1yZWFjdCI6IHsKICAgICAgInZlcnNpb24iOiAiMC41NzcuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sdWNpZGUtcmVhY3QvLS9sdWNpZGUtcmVhY3QtMC41NzcuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00TGpvRnYyZUVQd1lEUGcvQ1VkQkpRU0RmUHl6WENSclZXMVg3anJ4L3RyZ3hueGtIRmpuVlpJTmJ6dnp4ak43MGR4eWNoT2ZnK0ZUWXdCaVMzcFE1QT09IiwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInJlYWN0IjogIl4xNi41LjEgfHwgXjE3LjAuMCB8fCBeMTguMC4wIHx8IF4xOS4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL21hZ2ljLXN0cmluZyI6IHsKICAgICAgInZlcnNpb24iOiAiMC4zMC4yMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYWdpYy1zdHJpbmcvLS9tYWdpYy1zdHJpbmctMC4zMC4yMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12ZDJGNFlVeUVYS0djTEhvcStURXlDanh1ZVNlSG5GeHl5ak5wODB5ZzBYVjR2VWhuRGVyL2x2dmxxTS9hckI1YlhRTjVLMi8zb2lueUNSeXg4VDJDUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQGpyaWRnZXdlbGwvc291cmNlbWFwLWNvZGVjIjogIl4xLjUuNSIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVs' +
'ZXMvbWluaW1hdGNoIjogewogICAgICAidmVyc2lvbiI6ICIzLjEuNSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWF0Y2gvLS9taW5pbWF0Y2gtMy4xLjUudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmdqV1Vzbm5UNm4rTlVrNmVacTc3emVGZHBXMkxXRHpQNnpGR3JDYkhYaVlOdWw1RHpxazJISFE1dUZIMkROVzVYYnA4K2pWemFlTnQ5NHNzRUVsNHc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJJU0MiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJicmFjZS1leHBhbnNpb24iOiAiXjEuMS43IgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICIqIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9tcyI6IHsKICAgICAgInZlcnNpb24iOiAiMi4xLjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02Rmx6dWJUTFpHM0oyYS9OVkNBbGVFaGp6cTVveGdIeWFDVTl5WVh2Y0xzdm9WYUhKcS9zNXhYSTYvWFhQNnR6N1I5eEFPdEhuU08vdFh0RjNXUlRsQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL25hbm9pZCI6IHsKICAgICAgInZlcnNpb24iOiAiMy4zLjExIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25hbm9pZC8tL25hbm9pZC0zLjMuMTEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTjhTcGZQVW5VcDFiSytQTVlXOHFTV2RsOVUrd3dOV0k0UUt4T1lEeTlKQXJvM1dNWDdwMk9lVlJGOXYrMzQ3cG5ha05ldlBtaUhoTm1aMkhiRkE3Nnc9PSIsCiAgICAgICJmdW5kaW5nIjogWwogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIsCiAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9haSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJiaW4iOiB7CiAgICAgICAgIm5hbm9pZCI6ICJiaW4vbmFub2lkLmNqcyIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjEwIHx8IF4xMiB8fCBeMTMuNyB8fCBeMTQgfHwgPj0xNS4wLjEiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL25hdHVyYWwtY29tcGFyZSI6IHsKICAgICAgInZlcnNpb24iOiAiMS40LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmF0dXJhbC1jb21wYXJlLy0vbmF0dXJhbC1jb21wYXJlLTEuNC4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9XTkQ4ZWkzVnROQzloN1Y2MHFmZjNTVm9iSHI5OTZDVHdneHViZ3lRWUVwZzI5MGg5SjBidXlFQ05OSmV4a0ZtNXNPYWpoNUcxMTZSWUExYzhaTVN3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvbm9kZS1yZWxlYXNlcyI6IHsKICAgICAgInZlcnNpb24iOiAiMi4wLjM2IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vZGUtcmVsZWFzZXMvLS9ub2RlLXJlbGVhc2VzLTIuMC4zNi50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UZEM4RlNnSHo4TXd0dzlnNUw0Z1IvU2g5WGhTUC8wREVrUXhmRUZYT3BpdWw1SWlIZ0hhbjJWaFlZYjZhZ0RTZnA0S3V2bHRtR0FwYzhITWdVcklrQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL29wdGlvbmF0b3IiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjAuOS40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29wdGlvbmF0b3IvLS9vcHRpb25hdG9yLTAuOS40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZJcFE3bUtVeFJjWk5MSU9iUjBoejdseHNhcFNTSVlOWkp3WFBHZUYwbVRWcUdLRklYajFEUWNNb1QyMlMzUk9jTHlZL3J6MFBXYVdaOWF5V21hZDlnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZGVlcC1pcyI6ICJeMC4xLjMiLAogICAgICAgICJmYXN0' +
'LWxldmVuc2h0ZWluIjogIl4yLjAuNiIsCiAgICAgICAgImxldm4iOiAiXjAuNC4xIiwKICAgICAgICAicHJlbHVkZS1scyI6ICJeMS4yLjEiLAogICAgICAgICJ0eXBlLWNoZWNrIjogIl4wLjQuMCIsCiAgICAgICAgIndvcmQtd3JhcCI6ICJeMS4yLjUiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49IDAuOC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wLWxpbWl0IjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wLWxpbWl0Ly0vcC1saW1pdC0zLjEuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1UWU9hbk0zd0d3TkdzWk4yY1ZUWVBBcnc0NTR4blhqNXFtV0YxYkVvQWM0K2NVL29sN0dWaDdvZGV2anAxRk5IZHVIYzNLWk1jRmR1eFU1WGM2dUpSUT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInlvY3RvLXF1ZXVlIjogIl4wLjEuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvc2luZHJlc29yaHVzIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wLWxvY2F0ZSI6IHsKICAgICAgInZlcnNpb24iOiAiNS4wLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcC1sb2NhdGUvLS9wLWxvY2F0ZS01LjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MYU5qdFJXVUJZKyt6QjVuRS9Od2Nhb015bFNQaytTK1pITkIxVHpkYk1KTW55NmR5bnBBR3Q3WC90bC9RWXEzVEllRTZueEhwcGJvMkxHeW1yRzVQdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInAtbGltaXQiOiAiXjMuMC4yIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEwIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9zaW5kcmVzb3JodXMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3BhcmVudC1tb2R1bGUiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcmVudC1tb2R1bGUvLS9wYXJlbnQtbW9kdWxlLTEuMC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdRMkVXUnBRVjgvbytBdzhZcXRmWlpQZk5SV1pZa2JpZEU5azVycGwvaEMzdnRISEJmR20ySWZpNnFXVitjb0RHa3JVS1pBeEUzTG90NWtjc1JsaCtnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiY2FsbHNpdGVzIjogIl4zLjAuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wYXRoLWV4aXN0cyI6IHsKICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1leGlzdHMvLS9wYXRoLWV4aXN0cy00LjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hazlReTVRN2pZYjJXd2NleTVGcHZnMktvQWMvWkloTFNMT1NCbVJteWdQc0d3a1ZWdDBmWmEwcXJ0TXorbTZ0SlRBSGZaUThGbm1CNE1HNExXeTcvdz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49OCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGF0aC1rZXkiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgta2V5Ly0vcGF0aC1rZXktMy4xLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItb2ptZU4wcWQreTBqc3pFdG9ZNDhyMFBlcTVkd01Fa0lsQ091NlE1ZjQxbGZrc3dYdUt0WXJoZ29UcExueUljSG0yNFVocXgrNVRxbTJJblN3' +
'TGhFNlE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3BpY29jb2xvcnMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpY29jb2xvcnMvLS9waWNvY29sb3JzLTEuMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhjZUgyc25odGI1TTlsaXFEc21FdzU2bGUzNzZtVFprRVgvakViL1J4TkZ5ZWdOdWw3ZU5zbENYUDlGRGovTGN1MFg4S0V5TWNlUDJudHBhSHJERVZBPT0iLAogICAgICAibGljZW5zZSI6ICJJU0MiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9waWNvbWF0Y2giOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMC4zIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpY29tYXRjaC8tL3BpY29tYXRjaC00LjAuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01Z1RtZ0VZL3NxSzZnRlhMSXNRTkgxOWxXYjRlYlBETEE0U2RMUDdkc1drSVhIV2xHNjZvUHVWdlhTR0ZQcHBZWno4WkRacTBkWVlyYkhmQkNWVWIxUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMiIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvam9uc2NobGlua2VydCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcG9zdGNzcyI6IHsKICAgICAgInZlcnNpb24iOiAiOC41LjgiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcG9zdGNzcy8tL3Bvc3Rjc3MtOC41LjgudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItT1cvclg4Ty9qWG5tODJFeTFrNDRwT2JQdGRibGZpdVducmQ4WDdHSjdlbUltQ09zdHVuR2JYVXBwN0hkQnJGUVg2ckp6bjNzUFQzOTdXcDVhQ3dDSGc9PSIsCiAgICAgICJmdW5kaW5nIjogWwogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogIm9wZW5jb2xsZWN0aXZlIiwKICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9vcGVuY29sbGVjdGl2ZS5jb20vcG9zdGNzcy8iCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIsCiAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL25wbS9wb3N0Y3NzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInR5cGUiOiAiZ2l0aHViIiwKICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2FpIgogICAgICAgIH0KICAgICAgXSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAibmFub2lkIjogIl4zLjMuMTEiLAogICAgICAgICJwaWNvY29sb3JzIjogIl4xLjEuMSIsCiAgICAgICAgInNvdXJjZS1tYXAtanMiOiAiXjEuMi4xIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTAgfHwgXjEyIHx8ID49MTQiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3ByZWx1ZGUtbHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMi4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWx1ZGUtbHMvLS9wcmVsdWRlLWxzLTEuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZrY0RQclJabzFRWkxibjVSTEdQcGcvV21JUTY1cW9XV2hjR0tmL2I1ZXBsa2thclgwbTl6OHBwQ2F0NG1sT3FVc1dweU51WWdPM1ZSeXJZSFN6WDVnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMC44LjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3B1bnljb2RlIjogewogICAgICAidmVyc2lvbiI6ICIyLjMuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW55Y29kZS8tL3B1bnljb2RlLTIuMy4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZZdDdVRDFVOVdnNjEzOHNoTHRMT3ZkQXUrOERzQy9pbEZ0RVZIY0grd3lkY1NwTkUyMEFmU09kdWY2TWtSRmFoTDVGWTdYMW9V' +
'N25LVlpGdGZxOEZnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9yZWFjdCI6IHsKICAgICAgInZlcnNpb24iOiAiMTkuMi40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWN0Ly0vcmVhY3QtMTkuMi40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTluZnAyaFlwQ3dPakFOKzhUWkZHaHRXRXdndldIWHFFU0g4cVQ4OUFUL2xXa2xwTE9OMjJMYzhwRXRucHNaejdWbWF3YWJTVTBnQ2puajhhQzBldUhRPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTAuMTAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcmVhY3QtZG9tIjogewogICAgICAidmVyc2lvbiI6ICIxOS4yLjQiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhY3QtZG9tLy0vcmVhY3QtZG9tLTE5LjIuNC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BWEpkTG84a2dNYmltWTk1TzJhS1Fxc3oyaVdpOWpNZ0tKaFJCQXhFQ0U0SUZ4ZmNhekIyTG16bG9Jb2liSkkzQzEySWxZMjArS0ZhTHYrNzFiVUplUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAic2NoZWR1bGVyIjogIl4wLjI3LjAiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJyZWFjdCI6ICJeMTkuMi40IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9yZWFjdC1pcyI6IHsKICAgICAgInZlcnNpb24iOiAiMTkuMi40IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWN0LWlzLy0vcmVhY3QtaXMtMTkuMi40LnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVcrRVdHbjJ2MEFwUEtnS0tDeS83czdXSFhrYm9HY3NyWEUrMmpvTHlWeGtieVZRZk8zTVVFYVVRREhvU21iOFRGRnJTS1lhOW13NjRXWkhOSFNEellBPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAicGVlciI6IHRydWUKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4IjogewogICAgICAidmVyc2lvbiI6ICI5LjIuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFjdC1yZWR1eC8tL3JlYWN0LXJlZHV4LTkuMi4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJPWTlmdkhod09EOXlTZnJGMHdtdnUvL2JLQ1E2QWVaWnExbkpOdGJEQytrazVEdVN1TlgvbjZZV1lGL1NZeTdiU2JhNEQ0RlN6OERKZUtZL1MvcitnPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdHlwZXMvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUiOiAiXjAuMC42IiwKICAgICAgICAidXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUiOiAiXjEuNC4wIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHR5cGVzL3JlYWN0IjogIl4xOC4yLjI1IHx8IF4xOSIsCiAgICAgICAgInJlYWN0IjogIl4xOC4wIHx8IF4xOSIsCiAgICAgICAgInJlZHV4IjogIl41LjAuMCIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXNNZXRhIjogewogICAgICAgICJAdHlwZXMvcmVhY3QiOiB7CiAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAicmVkdXgiOiB7CiAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWZyZXNoIjogewogICAgICAidmVyc2lvbiI6ICIwLjE4LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhY3QtcmVmcmVzaC8tL3JlYWN0LXJlZnJlc2gtMC4xOC4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFnVDUvL0QzamZqSmI2R3NqeHYwU2xwajIzaXArSHRPcG5OZ25iMlM1elUzQ0IyNkcvSURQR295NFJKQjQyd3pGRTQ2RFJzc3RiVzZ0S0hvS2JoQXh3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0wLjEwLjAiCiAg' +
'ICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlciI6IHsKICAgICAgInZlcnNpb24iOiAiNy4xMy4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWN0LXJvdXRlci8tL3JlYWN0LXJvdXRlci03LjEzLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGQreFA0WDIvNkJKdlpvWDZ4dysrQTJEZEVpKytZeXBBNjliSlVWNW9WdnFmNi85LzluTmxENzBZTzFlOWQzTXlhbUpFQlFGRXprNm1iZkRZYnFyU0E9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImNvb2tpZSI6ICJeMS4wLjEiLAogICAgICAgICJzZXQtY29va2llLXBhcnNlciI6ICJeMi42LjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MjAuMC4wIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAicmVhY3QiOiAiPj0xOCIsCiAgICAgICAgInJlYWN0LWRvbSI6ICI+PTE4IgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llc01ldGEiOiB7CiAgICAgICAgInJlYWN0LWRvbSI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3JlYWN0LXJvdXRlci1kb20iOiB7CiAgICAgICJ2ZXJzaW9uIjogIjcuMTMuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFjdC1yb3V0ZXItZG9tLy0vcmVhY3Qtcm91dGVyLWRvbS03LjEzLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVUpuVjNSeGM1VGdVUEp0MktKcG8xSnB5ME9LUXIwQWpnYlp6QkZqYVBKY0ZPYjJZOGpBNUgzTFQ4SFVKQWlSTGxXckVYV0hiRjFaNFNDWmFRaldESHc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInJlYWN0LXJvdXRlciI6ICI3LjEzLjEiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MjAuMC4wIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAicmVhY3QiOiAiPj0xOCIsCiAgICAgICAgInJlYWN0LWRvbSI6ICI+PTE4IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9yZWNoYXJ0cyI6IHsKICAgICAgInZlcnNpb24iOiAiMy44LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVjaGFydHMvLS9yZWNoYXJ0cy0zLjguMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1aL20zOERYM0w3M0V4TzRUcGM5L2laV0htSG5seldHNG5qUWJ4c0Y1YVNqd3FtSE5EREltMHJkRUJBcmt3c0J2UjhVNkVpcmxFSGlRTllXQ1ZoOXNHUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIndvcmtzcGFjZXMiOiBbCiAgICAgICAgInd3dyIKICAgICAgXSwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHJlZHV4anMvdG9vbGtpdCI6ICJeMS45LjAgfHwgMi54LngiLAogICAgICAgICJjbHN4IjogIl4yLjEuMSIsCiAgICAgICAgImRlY2ltYWwuanMtbGlnaHQiOiAiXjIuNS4xIiwKICAgICAgICAiZXMtdG9vbGtpdCI6ICJeMS4zOS4zIiwKICAgICAgICAiZXZlbnRlbWl0dGVyMyI6ICJeNS4wLjEiLAogICAgICAgICJpbW1lciI6ICJeMTAuMS4xIiwKICAgICAgICAicmVhY3QtcmVkdXgiOiAiOC54LnggfHwgOS54LngiLAogICAgICAgICJyZXNlbGVjdCI6ICI1LjEuMSIsCiAgICAgICAgInRpbnktaW52YXJpYW50IjogIl4xLjMuMyIsCiAgICAgICAgInVzZS1zeW5jLWV4dGVybmFsLXN0b3JlIjogIl4xLjIuMiIsCiAgICAgICAgInZpY3RvcnktdmVuZG9yIjogIl4zNy4wLjIiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTgiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJyZWFjdCI6ICJeMTYuOC4wIHx8IF4xNy4wLjAgfHwgXjE4LjAuMCB8fCBeMTkuMC4wIiwKICAgICAgICAicmVhY3QtZG9tIjogIl4xNi4wLjAgfHwgXjE3LjAuMCB8fCBeMTguMC4wIHx8IF4xOS4wLjAiLAogICAgICAgICJyZWFjdC1pcyI6ICJeMTYuOC4wIHx8IF4xNy4wLjAgfHwgXjE4LjAuMCB8fCBeMTkuMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9yZWR1eCI6IHsKICAgICAgInZlcnNpb24i' +
'OiAiNS4wLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVkdXgvLS9yZWR1eC01LjAuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NOS9FTHFGNmZ5OEZ3bWtwbkYwUzNZS09xTXlvV0o0K0NTNUVmZzJjdDNvWTlkYVF2ZC9QYzcxRnBHWnNWc2JsM0NwYitJSWNqQkRVbm55QmRRYnE0dz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvcmVkdXgtdGh1bmsiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZHV4LXRodW5rLy0vcmVkdXgtdGh1bmstMy4xLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTlcycjVUNmtzVUtYQ2FiemhMOXoraDIwNkhRdy9OSmtjTG0xR1BJbVJROEl6Zlh3UkdxalZoS0pHYXVIaXJUMERBdXl5NmhqZG5NWmFSb0FjeTBLbHc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJyZWR1eCI6ICJeNS4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3Jlc2VsZWN0IjogewogICAgICAidmVyc2lvbiI6ICI1LjEuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNlbGVjdC8tL3Jlc2VsZWN0LTUuMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUsvQkc2ZUlreS9TQnB6Zkhadi9kZCs5SkJGaVM0U1dWN0ZJdWpWeUpSdXg2ZTQ1KzczUmFVSFhMbUlSMWY3V09NYVEwVTFrbTZxd2tsUlF4cEpKWTB3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9yZXNvbHZlLWZyb20iOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZnJvbS8tL3Jlc29sdmUtZnJvbS00LjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1wYi9NWW1Yc3RBa3lzUkZ4OHBpTkkxdEdGTlFJRkEzdmtFM0dxNEV1QTFkRjZnSHAvK3ZnWnFzQ0dKYXB2eThOM1ErNG83Rnd2cXVQSmNuWjdSWXk0Zz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcm9sbHVwIjogewogICAgICAidmVyc2lvbiI6ICI0LjU5LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcm9sbHVwLy0vcm9sbHVwLTQuNTkuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yb01wbDY3YTN6Q0g5SDc5TGVNY2JEaFhXL1VtV0cveTJ6dXFuRjJqUXE1dXE5VGJNOVRWeVh2QTQrdCtuZTJJSWtCZHJMcEFhUlFBdm83WUkvWXllZz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHR5cGVzL2VzdHJlZSI6ICIxLjAuOCIKICAgICAgfSwKICAgICAgImJpbiI6IHsKICAgICAgICAicm9sbHVwIjogImRpc3QvYmluL3JvbGx1cCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOC4wLjAiLAogICAgICAgICJucG0iOiAiPj04LjAuMCIKICAgICAgfSwKICAgICAgIm9wdGlvbmFsRGVwZW5kZW5jaWVzIjogewogICAgICAgICJAcm9sbHVwL3JvbGx1cC1hbmRyb2lkLWFybS1lYWJpIjogIjQuNTkuMCIsCiAgICAgICAgIkByb2xsdXAvcm9sbHVwLWFuZHJvaWQtYXJtNjQiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtZGFyd2luLWFybTY0IjogIjQuNTkuMCIsCiAgICAgICAgIkByb2xsdXAvcm9sbHVwLWRhcndpbi14NjQiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtZnJlZWJzZC1hcm02NCI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC1mcmVlYnNkLXg2NCI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC1saW51eC1hcm0tZ251ZWFiaWhmIjogIjQuNTkuMCIsCiAgICAgICAgIkByb2xsdXAvcm9sbHVwLWxpbnV4LWFybS1tdXNsZWFiaWhmIjogIjQuNTkuMCIsCiAgICAgICAgIkByb2xsdXAvcm9sbHVwLWxpbnV4LWFybTY0LWdudSI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC1saW51eC1hcm02NC1tdXNsIjog' +
'IjQuNTkuMCIsCiAgICAgICAgIkByb2xsdXAvcm9sbHVwLWxpbnV4LWxvb25nNjQtZ251IjogIjQuNTkuMCIsCiAgICAgICAgIkByb2xsdXAvcm9sbHVwLWxpbnV4LWxvb25nNjQtbXVzbCI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC1saW51eC1wcGM2NC1nbnUiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtbGludXgtcHBjNjQtbXVzbCI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC1saW51eC1yaXNjdjY0LWdudSI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC1saW51eC1yaXNjdjY0LW11c2wiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtbGludXgtczM5MHgtZ251IjogIjQuNTkuMCIsCiAgICAgICAgIkByb2xsdXAvcm9sbHVwLWxpbnV4LXg2NC1nbnUiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtbGludXgteDY0LW11c2wiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtb3BlbmJzZC14NjQiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtb3Blbmhhcm1vbnktYXJtNjQiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtd2luMzItYXJtNjQtbXN2YyI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC13aW4zMi1pYTMyLW1zdmMiOiAiNC41OS4wIiwKICAgICAgICAiQHJvbGx1cC9yb2xsdXAtd2luMzIteDY0LWdudSI6ICI0LjU5LjAiLAogICAgICAgICJAcm9sbHVwL3JvbGx1cC13aW4zMi14NjQtbXN2YyI6ICI0LjU5LjAiLAogICAgICAgICJmc2V2ZW50cyI6ICJ+Mi4zLjIiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3NjaGVkdWxlciI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yNy4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NjaGVkdWxlci8tL3NjaGVkdWxlci0wLjI3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZU52K1dyVmJLdTFmM3ZiWUpUL3h0aUY1c3lBNUhQSU10ZjlJZ1kvbktnMHNXcXpBVUV2cVkveG03T2NaYy9xYWZMeC9pTzlGZ09tZVNBcDR2NXRpL1E9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3NlbXZlciI6IHsKICAgICAgInZlcnNpb24iOiAiNi4zLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2VtdmVyLy0vc2VtdmVyLTYuMy4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUJSN1Z2RENWSE8rcTJ4QkVXc2t4UzZESkUxcVJuYjdEeHpVcm9nYjcxQ1dvU2ZpY0J4WXNpQUdkK0tsMG1tcS9NcHJHOXlBclJreXJReFRPNlhqTXpBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImJpbiI6IHsKICAgICAgICAic2VtdmVyIjogImJpbi9zZW12ZXIuanMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3NldC1jb29raWUtcGFyc2VyIjogewogICAgICAidmVyc2lvbiI6ICIyLjcuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtY29va2llLXBhcnNlci8tL3NldC1jb29raWUtcGFyc2VyLTIuNy4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW9lTTFscFUvVXZoVHh3K2czY0lmeFhIeUpSYy91aWRkM3lLMVAyNDJnekhkczB1ZFFCWXpzM3k4ajRnQ0NXK1pKN2FkMHljdGxkOFJZTytiZHVybHZ3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9zaGViYW5nLWNvbW1hbmQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWJhbmctY29tbWFuZC8tL3NoZWJhbmctY29tbWFuZC0yLjAuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1rSHhyMnpacFl0ZG1yTjFxRGpyclgvWjFyUjFrRzhEeCtna3BLMUc0ZVhtdlhzd21jRTFoVFdCV1lVemxyYVl3MS95WnA2WXVEWTc3WXR2Yk4wZG1EQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjMuMC4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3No' +
'ZWJhbmctcmVnZXgiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWJhbmctcmVnZXgvLS9zaGViYW5nLXJlZ2V4LTMuMC4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTcrK2RGaHRjeDMzNTN1QmFxOEREUjROdXhCZXRCekM3WlFPaG1UUUluSEVkNmJTclhkaUV5ekN2RzA3WjQ0VVlkTFNoV1V5WHQ1TS95aHo4ZWtjYjFBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj04IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLWpzIjogewogICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLWpzLy0vc291cmNlLW1hcC1qcy0xLjIuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VWFdNS2hMT3dWS2I3MjhJVXRRUFh4ZllVK3VzZHlidFVySy84dUdFOENRTXZyaE9wd3Z6REJ3ajBRaFNMN01RYzd2SXNJU0JHOFZROCtJRFF4cGZRQT09IiwKICAgICAgImxpY2Vuc2UiOiAiQlNELTMtQ2xhdXNlIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0wLjEwLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3N0cmlwLWpzb24tY29tbWVudHMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMS4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWpzb24tY29tbWVudHMvLS9zdHJpcC1qc29uLWNvbW1lbnRzLTMuMS4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZmUGMrUjRpaHdxUDZOL2FJdjJmMWdNSDhsT1Z0V1FIb3FDNHlLNm9TRFZWb2N1bUFzZkNxamtYbnFpWU1obU13Uy9tRUhMcDdWZWhsdDNxbDZsRWlnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj04IgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9zaW5kcmVzb3JodXMiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3N1cHBvcnRzLWNvbG9yIjogewogICAgICAidmVyc2lvbiI6ICI3LjIuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTcuMi4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFwQ0F2Umw5c3R1T0h2ZUtzbjdIbmNKUnZ2NTAxcUlhY0t6UWxPLytMd3hjOSswcTJ3THl2NERmdnQ4MC9EUG4ycHFPQnNKZERpb2dYR1I5K092d1J3PT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiaGFzLWZsYWciOiAiXjQuMC4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTgiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3RhaWx3aW5kY3NzIjogewogICAgICAidmVyc2lvbiI6ICI0LjIuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWlsd2luZGNzcy8tL3RhaWx3aW5kY3NzLTQuMi4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLS90QnJTUTM2dkNsZUprQU9zeTlrYk5UZ2F4dkdieU9hbUMzMFBSZVBUUWUvbzFNRndFS0hRazRDbjdCTkdhUHRqcCtQdVVyQnlKZWhNMWhneGZxNHN3PT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiCiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy90YXBhYmxlIjogewogICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXBhYmxlLy0vdGFwYWJsZS0yLjMuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1nOWxqWml3a2kvTGZ4bVFBRE8zZEVZMUNicG1YVDVIbTJmSitRYUdLd1NYVXlsTXliZVBSNy82N1lXN2pPcnJ2akVnTDFGbXo1a3p5QWpXVldMbHVjZz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj02IgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAg' +
'ICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS93ZWJwYWNrIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy90aW55LWludmFyaWFudCI6IHsKICAgICAgInZlcnNpb24iOiAiMS4zLjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGlueS1pbnZhcmlhbnQvLS90aW55LWludmFyaWFudC0xLjMuMy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0rRmJCUEUxbzlRQVl2dmlhdS9xQzVTRTNjYXcyMXEzeGt2V0tCdGphNXZncU9XSUhISjNpb2FxMVZQZm4vU3pxY3R6MmJVL29ZZUtkOS96NUJMK1BWZz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvdGlueWdsb2JieSI6IHsKICAgICAgInZlcnNpb24iOiAiMC4yLjE1IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RpbnlnbG9iYnkvLS90aW55Z2xvYmJ5LTAuMi4xNS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qMlpxNE55UVlHNVhNU1Q0Y2JzMDJBazhpSlVkeFJNMFhJNVF5eFh1Wk96S09JTm1XdXJwM3NtWHUzeTV3RGNKcnB0d3BTamdYSHpJUXhSMG9tWGxqUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZmRpciI6ICJeNi41LjAiLAogICAgICAgICJwaWNvbWF0Y2giOiAiXjQuMC4zIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTEyLjAuMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvU3VwZXJjaHVwdURldiIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvdHMtYXBpLXV0aWxzIjogewogICAgICAidmVyc2lvbiI6ICIyLjQuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cy1hcGktdXRpbHMvLS90cy1hcGktdXRpbHMtMi40LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItM1RhVlRhQXYyZ1RpTUIzNWkzRmlHSmFSZndiM1B5bi9qM20vYmZBdkdlOEZCN0NGNnUrTE1ZcVlsRGg3cmVRZjdVTnZvVHZkZkFxSEdtUEdPU3NQbUE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PTE4LjEyIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAidHlwZXNjcmlwdCI6ICI+PTQuOC40IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy90eXBlLWNoZWNrIjogewogICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90eXBlLWNoZWNrLy0vdHlwZS1jaGVjay0wLjQuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1YbGVVb2M5dXdHWHFqV3dYYVVUWkFtek1jRlo1ODU4UUEydnZ4MVVyNXhJY2l4WElQKzhMbkZEZ1JwbFUzMHVzNnRlcWRsc2tGZnUrYWU0Szc5T29ldz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInByZWx1ZGUtbHMiOiAiXjEuMi4xIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAwLjguMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvdHlwZXNjcmlwdCI6IHsKICAgICAgInZlcnNpb24iOiAiNS45LjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZXNjcmlwdC8tL3R5cGVzY3JpcHQtNS45LjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItamwxdlp6UERpbkxyOWVVdDNKL3Q3VjZGZ05FdzlRanZCUGR5c3o5S2ZRREQ0MWZRckMyWTR2S1FkaWFVcEZUNGJYbGIxUkhoTHBwOHd0bTZNNVRnU3c9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKICAgICAgImJpbiI6IHsKICAgICAgICAidHNjIjogImJpbi90c2MiLAogICAgICAgICJ0c3NlcnZlciI6ICJiaW4vdHNzZXJ2ZXIiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MTQuMTciCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9t' +
'b2R1bGVzL3R5cGVzY3JpcHQtZXNsaW50IjogewogICAgICAidmVyc2lvbiI6ICI4LjU3LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZXNjcmlwdC1lc2xpbnQvLS90eXBlc2NyaXB0LWVzbGludC04LjU3LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVzhHY2lnRU1FZUIwN3hFWm9sOG9KMjZyaWdtMytiZlBIeEh2d2JZVWx1MWZVRHNHdVE3SGlza3g1eEdXL3hNNFVTYzlFcGhlM2p0djdaWVBRbnRIZUE9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvZXNsaW50LXBsdWdpbiI6ICI4LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyIjogIjguNTcuMCIsCiAgICAgICAgIkB0eXBlc2NyaXB0LWVzbGludC90eXBlc2NyaXB0LWVzdHJlZSI6ICI4LjU3LjAiLAogICAgICAgICJAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMiOiAiOC41Ny4wIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICJeMTguMTguMCB8fCBeMjAuOS4wIHx8ID49MjEuMS4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS90eXBlc2NyaXB0LWVzbGludCIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImVzbGludCI6ICJeOC41Ny4wIHx8IF45LjAuMCB8fCBeMTAuMC4wIiwKICAgICAgICAidHlwZXNjcmlwdCI6ICI+PTQuOC40IDw2LjAuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvdW5kaWNpLXR5cGVzIjogewogICAgICAidmVyc2lvbiI6ICI3LjE2LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kaWNpLXR5cGVzLy0vdW5kaWNpLXR5cGVzLTcuMTYuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1aeithWldTajhMRTZ6b3hEK3hyamg0VmZrSUc4WWE2THZZa1pxdFVRR0pQWmpZbDUzeXBDYVV3V3FvN2VJMHg2NktCR2VSbyttbEJFa01TZVNaMzhOdz09IiwKICAgICAgImRldk9wdGlvbmFsIjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvdXBkYXRlLWJyb3dzZXJzbGlzdC1kYiI6IHsKICAgICAgInZlcnNpb24iOiAiMS4yLjMiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXBkYXRlLWJyb3dzZXJzbGlzdC1kYi8tL3VwZGF0ZS1icm93c2Vyc2xpc3QtZGItMS4yLjMudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItSnMwbTljeCtxT2dEeG8wZU1pRkdFdWVXenR6K2Q0K00zckdsbUtQVCtUNElTL2pQNHlsdzNOd3B1NmNwVFRQOFIxTUFDMWtGNFZiZEx0M0FSZjIwOXc9PSIsCiAgICAgICJkZXYiOiB0cnVlLAogICAgICAiZnVuZGluZyI6IFsKICAgICAgICB7CiAgICAgICAgICAidHlwZSI6ICJvcGVuY29sbGVjdGl2ZSIsCiAgICAgICAgICAidXJsIjogImh0dHBzOi8vb3BlbmNvbGxlY3RpdmUuY29tL2Jyb3dzZXJzbGlzdCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IiwKICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvbnBtL2Jyb3dzZXJzbGlzdCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIsCiAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9haSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImVzY2FsYWRlIjogIl4zLjIuMCIsCiAgICAgICAgInBpY29jb2xvcnMiOiAiXjEuMS4xIgogICAgICB9LAogICAgICAiYmluIjogewogICAgICAgICJ1cGRhdGUtYnJvd3NlcnNsaXN0LWRiIjogImNsaS5qcyIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgImJyb3dzZXJzbGlzdCI6ICI+PSA0LjIxLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3VyaS1qcyI6IHsKICAgICAgInZlcnNpb24iOiAiNC40LjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5v' +
'cmcvdXJpLWpzLy0vdXJpLWpzLTQuNC4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTdyS1V5eTMzUTF5Yzk4cFExREFtTHR3WDEwOUY3VElmV2xXMVlkbzhXbDFpaTFTZUhpZWVoMEhIZlBlTDJmTVhLNnowczhlY0tzOWZyQ3VMSnZuZEJnPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiQlNELTItQ2xhdXNlIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAicHVueWNvZGUiOiAiXjIuMS4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy91c2Utc3luYy1leHRlcm5hbC1zdG9yZSI6IHsKICAgICAgInZlcnNpb24iOiAiMS42LjAiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvLS91c2Utc3luYy1leHRlcm5hbC1zdG9yZS0xLjYuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QcDZHU3dHUC9OclBJcnhWRkFJa09RZXl3OGxGZW5PSGlqUVdrVVRyRHZyRjRBTHF5bFAyQy9LQ2tlUzlkcFVNM0t2WVJRaG5hNXZ0N0lMOTUrWlE5dz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgInBlZXJEZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInJlYWN0IjogIl4xNi44LjAgfHwgXjE3LjAuMCB8fCBeMTguMC4wIHx8IF4xOS4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3ZpY3RvcnktdmVuZG9yIjogewogICAgICAidmVyc2lvbiI6ICIzNy4zLjYiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmljdG9yeS12ZW5kb3IvLS92aWN0b3J5LXZlbmRvci0zNy4zLjYudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItU2JQRFBkREJZcCs1TUpIaEJDQXlJN3dLTTNkNWl2ZWtpZ2MyRGsyczdwZ2JaOXdJZ0lCWUdWdzR6R0hCbWwvcVRGYmV4cm9mWFc2R3U0bm9HeHJPd1E9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCBBTkQgSVNDIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHR5cGVzL2QzLWFycmF5IjogIl4zLjAuMyIsCiAgICAgICAgIkB0eXBlcy9kMy1lYXNlIjogIl4zLjAuMCIsCiAgICAgICAgIkB0eXBlcy9kMy1pbnRlcnBvbGF0ZSI6ICJeMy4wLjEiLAogICAgICAgICJAdHlwZXMvZDMtc2NhbGUiOiAiXjQuMC4yIiwKICAgICAgICAiQHR5cGVzL2QzLXNoYXBlIjogIl4zLjEuMCIsCiAgICAgICAgIkB0eXBlcy9kMy10aW1lIjogIl4zLjAuMCIsCiAgICAgICAgIkB0eXBlcy9kMy10aW1lciI6ICJeMy4wLjAiLAogICAgICAgICJkMy1hcnJheSI6ICJeMy4xLjYiLAogICAgICAgICJkMy1lYXNlIjogIl4zLjAuMSIsCiAgICAgICAgImQzLWludGVycG9sYXRlIjogIl4zLjAuMSIsCiAgICAgICAgImQzLXNjYWxlIjogIl40LjAuMiIsCiAgICAgICAgImQzLXNoYXBlIjogIl4zLjEuMCIsCiAgICAgICAgImQzLXRpbWUiOiAiXjMuMC4wIiwKICAgICAgICAiZDMtdGltZXIiOiAiXjMuMC4xIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy92aXRlIjogewogICAgICAidmVyc2lvbiI6ICI3LjMuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92aXRlLy0vdml0ZS03LjMuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi13K043SGlmcGMzZ1JqWjYzdllCWEE1NmR2dlJsTldSY3pUZG1DQkJhK0NvdFV6QVBmNWI3WU1kTVIvOENRb2VZRTVMWDNXNHdqNlJZVGdvbm0xYjlEQT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZXNidWlsZCI6ICJeMC4yNy4wIiwKICAgICAgICAiZmRpciI6ICJeNi41LjAiLAogICAgICAgICJwaWNvbWF0Y2giOiAiXjQuMC4zIiwKICAgICAgICAicG9zdGNzcyI6ICJeOC41LjYiLAogICAgICAgICJyb2xsdXAiOiAiXjQuNDMuMCIsCiAgICAgICAgInRpbnlnbG9iYnkiOiAiXjAuMi4xNSIKICAgICAgfSwKICAgICAgImJpbiI6IHsKICAgICAgICAidml0ZSI6ICJiaW4vdml0ZS5qcyIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiXjIwLjE5LjAgfHwgPj0yMi4xMi4wIgogICAgICB9LAogICAgICAiZnVuZGluZyI6IHsKICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS92aXRlanMvdml0ZT9zcG9uc29yPTEiCiAgICAgIH0sCiAgICAgICJvcHRpb25hbERlcGVuZGVuY2llcyI6IHsKICAgICAgICAiZnNldmVudHMiOiAi' +
'fjIuMy4zIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiQHR5cGVzL25vZGUiOiAiXjIwLjE5LjAgfHwgPj0yMi4xMi4wIiwKICAgICAgICAiaml0aSI6ICI+PTEuMjEuMCIsCiAgICAgICAgImxlc3MiOiAiXjQuMC4wIiwKICAgICAgICAibGlnaHRuaW5nY3NzIjogIl4xLjIxLjAiLAogICAgICAgICJzYXNzIjogIl4xLjcwLjAiLAogICAgICAgICJzYXNzLWVtYmVkZGVkIjogIl4xLjcwLjAiLAogICAgICAgICJzdHlsdXMiOiAiPj0wLjU0LjgiLAogICAgICAgICJzdWdhcnNzIjogIl41LjAuMCIsCiAgICAgICAgInRlcnNlciI6ICJeNS4xNi4wIiwKICAgICAgICAidHN4IjogIl40LjguMSIsCiAgICAgICAgInlhbWwiOiAiXjIuNC4yIgogICAgICB9LAogICAgICAicGVlckRlcGVuZGVuY2llc01ldGEiOiB7CiAgICAgICAgIkB0eXBlcy9ub2RlIjogewogICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgImppdGkiOiB7CiAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAibGVzcyI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9LAogICAgICAgICJsaWdodG5pbmdjc3MiOiB7CiAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAic2FzcyI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9LAogICAgICAgICJzYXNzLWVtYmVkZGVkIjogewogICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgInN0eWx1cyI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9LAogICAgICAgICJzdWdhcnNzIjogewogICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgInRlcnNlciI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9LAogICAgICAgICJ0c3giOiB7CiAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAieWFtbCI6IHsKICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3doaWNoIjogewogICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC8tL3doaWNoLTIuMC4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUJMSTNUbDFUVzNQdmw3MGwzeXEzWTY0aSthd3B3WHFzR0JZV2trcU10bmJYZ3JNRCt5ajdyaFcwa3VFRHh6SmFZWEdqRVc1b2dhcEtOTUVLTk1qaWJBPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAiaXNleGUiOiAiXjIuMC4wIgogICAgICB9LAogICAgICAiYmluIjogewogICAgICAgICJub2RlLXdoaWNoIjogImJpbi9ub2RlLXdoaWNoIgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSA4IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy93b3JkLXdyYXAiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMi41IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmQtd3JhcC8tL3dvcmQtd3JhcC0xLjIuNS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1CTjIyQjVlYU1NSTlVTXRqckdkNWc1ZUNZUHBDUERVeTBGSlhiWXNhVDV6WXhqRk9ja1M1M1NRREUzcFdrVm9XcEhYVmIzQnJZY0VONFR3YTU1QjVjQT09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC4xMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy95YWxsaXN0IjogewogICAgICAidmVyc2lvbiI6ICIzLjEuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy95YWxsaXN0Ly0veWFsbGlzdC0zLjEuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hNFVHUWFXUEg1OW1PWFVZbkFHMmV3bmNRUzRpNEY0M1R2M0pvQU0rczJWREFtUzlOc0s4R3BETUxyQ0hQa3NGVDdoM0s2VE9vVU5uMnBiN1JvWHg0Zz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIklTQyIKICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3lvY3RvLXF1ZXVlIjogewogICAgICAi' +
'dmVyc2lvbiI6ICIwLjEuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy95b2N0by1xdWV1ZS8tL3lvY3RvLXF1ZXVlLTAuMS4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJWa3N2c25OQ2RKL29oR2M2eGdQd3lOOGVoZUN4c2lMTThteHVFL3QvbU9WcUpld1B1TzFtaUxwVEhRaVJnVEtDTGV4TDRNZUFGVmFndHM3SG1OWjJRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xMCIKICAgICAgfSwKICAgICAgImZ1bmRpbmciOiB7CiAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvc2luZHJlc29yaHVzIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy96b2QiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMy42IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3pvZC8tL3pvZC00LjMuNi50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1yZnRscmtoSFpPY2pEd2tHbG5VdFpaa3ZhUEhDc0RBVHA0cEdwdU9PTURhVGRERFhGOTF3dVZESm9Xb1BzS1gvM1lQUTVmSHVGM1NUamNZeUtyK1FoZz09IiwKICAgICAgImRldiI6IHRydWUsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJmdW5kaW5nIjogewogICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2NvbGluaGFja3MiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3pvZC12YWxpZGF0aW9uLWVycm9yIjogewogICAgICAidmVyc2lvbiI6ICI0LjAuMiIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy96b2QtdmFsaWRhdGlvbi1lcnJvci8tL3pvZC12YWxpZGF0aW9uLWVycm9yLTQuMC4yLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVE2L25aTGU2anh1VTgwcWIvNHVKNHQ1djJWRVo0NGx6UWpQRGhZSk56dFJRNHd5V2M2VkYzRDNLYi9mQXVQZXRaUW5oUzNobmFqQ2Y5Q3NXZXNnaExRPT0iLAogICAgICAiZGV2IjogdHJ1ZSwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0xOC4wLjAiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJ6b2QiOiAiXjMuMjUuMCB8fCBeNC4wLjAiCiAgICAgIH0KICAgIH0KICB9Cn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\package-lock.json' -B $b
# frontend/commander-ai-lab-ui/package.json (877 bytes)
$b = 'ewogICJuYW1lIjogImNvbW1hbmRlci1haS1sYWItdWkiLAogICJwcml2YXRlIjogdHJ1ZSwKICAidmVyc2lvbiI6ICIwLjAuMCIsCiAgInR5cGUiOiAibW9kdWxlIiwKICAic2NyaXB0cyI6IHsKICAgICJkZXYiOiAidml0ZSIsCiAgICAiYnVpbGQiOiAidHNjIC1iICYmIHZpdGUgYnVpbGQiLAogICAgImxpbnQiOiAiZXNsaW50IC4iLAogICAgInByZXZpZXciOiAidml0ZSBwcmV2aWV3IgogIH0sCiAgImRlcGVuZGVuY2llcyI6IHsKICAgICJAdGFpbHdpbmRjc3Mvdml0ZSI6ICJeNC4yLjEiLAogICAgImx1Y2lkZS1yZWFjdCI6ICJeMC41NzcuMCIsCiAgICAicmVhY3QiOiAiXjE5LjIuMCIsCiAgICAicmVhY3QtZG9tIjogIl4xOS4yLjAiLAogICAgInJlYWN0LXJvdXRlci1kb20iOiAiXjcuMTMuMSIsCiAgICAicmVjaGFydHMiOiAiXjMuOC4wIiwKICAgICJ0YWlsd2luZGNzcyI6ICJeNC4yLjEiCiAgfSwKICAiZGV2RGVwZW5kZW5jaWVzIjogewogICAgIkBlc2xpbnQvanMiOiAiXjkuMzkuMSIsCiAgICAiQHR5cGVzL25vZGUiOiAiXjI0LjEwLjEiLAogICAgIkB0eXBlcy9yZWFjdCI6ICJeMTkuMi43IiwKICAgICJAdHlwZXMvcmVhY3QtZG9tIjogIl4xOS4yLjMiLAogICAgIkB2aXRlanMvcGx1Z2luLXJlYWN0IjogIl41LjEuMSIsCiAgICAiZXNsaW50IjogIl45LjM5LjEiLAogICAgImVzbGludC1wbHVnaW4tcmVhY3QtaG9va3MiOiAiXjcuMC4xIiwKICAgICJlc2xpbnQtcGx1Z2luLXJlYWN0LXJlZnJlc2giOiAiXjAuNC4yNCIsCiAgICAiZ2xvYmFscyI6ICJeMTYuNS4wIiwKICAgICJ0eXBlc2NyaXB0IjogIn41LjkuMyIsCiAgICAidHlwZXNjcmlwdC1lc2xpbnQiOiAiXjguNDguMCIsCiAgICAidml0ZSI6ICJeNy4zLjEiCiAgfQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\package.json' -B $b
# frontend/commander-ai-lab-ui/src/App.tsx (1,077 bytes)
$b = 'aW1wb3J0IHsgQnJvd3NlclJvdXRlciwgUm91dGVzLCBSb3V0ZSB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nCmltcG9ydCB7IFBhZ2VMYXlvdXQgfSBmcm9tICcuL2NvbXBvbmVudHMvbGF5b3V0L1BhZ2VMYXlvdXQnCmltcG9ydCB7IEJhdGNoU2ltUGFnZSB9IGZyb20gJy4vcGFnZXMvQmF0Y2hTaW1QYWdlJwppbXBvcnQgeyBDb2xsZWN0aW9uUGFnZSB9IGZyb20gJy4vcGFnZXMvQ29sbGVjdGlvblBhZ2UnCmltcG9ydCB7IERlY2tzUGFnZSB9IGZyb20gJy4vcGFnZXMvRGVja3NQYWdlJwppbXBvcnQgeyBBdXRvR2VuUGFnZSB9IGZyb20gJy4vcGFnZXMvQXV0b0dlblBhZ2UnCmltcG9ydCB7IFNpbXVsYXRvclBhZ2UgfSBmcm9tICcuL3BhZ2VzL1NpbXVsYXRvclBhZ2UnCmltcG9ydCB7IENvYWNoUGFnZSB9IGZyb20gJy4vcGFnZXMvQ29hY2hQYWdlJwppbXBvcnQgeyBUcmFpbmluZ1BhZ2UgfSBmcm9tICcuL3BhZ2VzL1RyYWluaW5nUGFnZScKCmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCgpIHsKICByZXR1cm4gKAogICAgPEJyb3dzZXJSb3V0ZXI+CiAgICAgIDxQYWdlTGF5b3V0PgogICAgICAgIDxSb3V0ZXM+CiAgICAgICAgICA8Um91dGUgcGF0aD0iLyIgZWxlbWVudD17PEJhdGNoU2ltUGFnZSAvPn0gLz4KICAgICAgICAgIDxSb3V0ZSBwYXRoPSIvY29sbGVjdGlvbiIgZWxlbWVudD17PENvbGxlY3Rpb25QYWdlIC8+fSAvPgogICAgICAgICAgPFJvdXRlIHBhdGg9Ii9kZWNrcyIgZWxlbWVudD17PERlY2tzUGFnZSAvPn0gLz4KICAgICAgICAgIDxSb3V0ZSBwYXRoPSIvYXV0b2dlbiIgZWxlbWVudD17PEF1dG9HZW5QYWdlIC8+fSAvPgogICAgICAgICAgPFJvdXRlIHBhdGg9Ii9zaW11bGF0b3IiIGVsZW1lbnQ9ezxTaW11bGF0b3JQYWdlIC8+fSAvPgogICAgICAgICAgPFJvdXRlIHBhdGg9Ii9jb2FjaCIgZWxlbWVudD17PENvYWNoUGFnZSAvPn0gLz4KICAgICAgICAgIDxSb3V0ZSBwYXRoPSIvdHJhaW5pbmciIGVsZW1lbnQ9ezxUcmFpbmluZ1BhZ2UgLz59IC8+CiAgICAgICAgPC9Sb3V0ZXM+CiAgICAgIDwvUGFnZUxheW91dD4KICAgIDwvQnJvd3NlclJvdXRlcj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\App.tsx' -B $b
# frontend/commander-ai-lab-ui/src/api/client.ts (2,683 bytes)
$b = 'Ly8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCi8vIEJhc2UgQVBJIGNsaWVudCDigJQgYWxsIGZldGNoIGNhbGxzIGdvIHRocm91Z2ggaGVyZQovLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmNvbnN0IEJBU0UgPSAnJyAvLyBzYW1lIG9yaWdpbjsgVml0ZSBwcm94eSBoYW5kbGVzIC9hcGkgaW4gZGV2CgpleHBvcnQgY2xhc3MgQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgc3RhdHVzOiBudW1iZXIKICBjb25zdHJ1Y3RvcihzdGF0dXM6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nKSB7CiAgICBzdXBlcihtZXNzYWdlKQogICAgdGhpcy5uYW1lID0gJ0FwaUVycm9yJwogICAgdGhpcy5zdGF0dXMgPSBzdGF0dXMKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlPFQ+KHJlczogUmVzcG9uc2UpOiBQcm9taXNlPFQ+IHsKICBpZiAoIXJlcy5vaykgewogICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkKICAgIGxldCBtZXNzYWdlID0gYEhUVFAgJHtyZXMuc3RhdHVzfWAKICAgIHRyeSB7CiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKGJvZHkpCiAgICAgIG1lc3NhZ2UgPSBqc29uLmRldGFpbCB8fCBqc29uLmVycm9yIHx8IG1lc3NhZ2UKICAgIH0gY2F0Y2ggewogICAgICBpZiAoYm9keSkgbWVzc2FnZSA9IGJvZHkKICAgIH0KICAgIHRocm93IG5ldyBBcGlFcnJvcihyZXMuc3RhdHVzLCBtZXNzYWdlKQogIH0KICAvLyBIYW5kbGUgMjA0IE5vIENvbnRlbnQKICBpZiAocmVzLnN0YXR1cyA9PT0gMjA0KSByZXR1cm4gdW5kZWZpbmVkIGFzIFQKICByZXR1cm4gcmVzLmpzb24oKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0PFQ+KHBhdGg6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZD4pOiBQcm9taXNlPFQ+IHsKICBjb25zdCB1cmwgPSBuZXcgVVJMKEJBU0UgKyBwYXRoLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKQogIGlmIChwYXJhbXMpIHsKICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcykuZm9yRWFjaCgoW2ssIHZdKSA9PiB7CiAgICAgIGlmICh2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gJycpIHVybC5zZWFyY2hQYXJhbXMuc2V0KGssIFN0cmluZyh2KSkKICAgIH0pCiAgfQogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpKQogIHJldHVybiBoYW5kbGVSZXNwb25zZTxUPihyZXMpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3N0PFQ+KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24pOiBQcm9taXNlPFQ+IHsKICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChCQVNFICsgcGF0aCwgewogICAgbWV0aG9kOiAnUE9TVCcsCiAgICBoZWFkZXJzOiBib2R5ID8geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gOiB7fSwKICAgIGJvZHk6IGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZCwKICB9KQogIHJldHVybiBoYW5kbGVSZXNwb25zZTxUPihyZXMpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwb3N0Rm9ybTxUPihwYXRoOiBzdHJpbmcsIGZvcm1EYXRhOiBGb3JtRGF0YSk6IFByb21pc2U8VD4gewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEJBU0UgKyBwYXRoLCB7CiAgICBtZXRob2Q6ICdQT1NUJywKICAgIGJvZHk6IGZvcm1EYXRhLAogIH0pCiAgcmV0dXJuIGhhbmRsZVJlc3BvbnNlPFQ+KHJlcykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHB1dDxUPihwYXRoOiBzdHJpbmcsIGJvZHk6IHVua25vd24pOiBQcm9taXNlPFQ+IHsKICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChCQVNFICsgcGF0aCwgewogICAgbWV0aG9kOiAnUFVUJywKICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgfSkKICByZXR1cm4gaGFuZGxl' +
'UmVzcG9uc2U8VD4ocmVzKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcGF0Y2g8VD4ocGF0aDogc3RyaW5nLCBib2R5OiB1bmtub3duKTogUHJvbWlzZTxUPiB7CiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQkFTRSArIHBhdGgsIHsKICAgIG1ldGhvZDogJ1BBVENIJywKICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgfSkKICByZXR1cm4gaGFuZGxlUmVzcG9uc2U8VD4ocmVzKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsPFQ+KHBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4gewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEJBU0UgKyBwYXRoLCB7IG1ldGhvZDogJ0RFTEVURScgfSkKICByZXR1cm4gaGFuZGxlUmVzcG9uc2U8VD4ocmVzKQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\client.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/coach.ts (1,213 bytes)
$b = 'aW1wb3J0IHsgZ2V0LCBwb3N0IH0gZnJvbSAnLi9jbGllbnQnCmltcG9ydCB0eXBlIHsgQ29hY2hTdGF0dXMsIENvYWNoRGVjaywgQ29hY2hTZXNzaW9uIH0gZnJvbSAnLi4vdHlwZXMnCgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29hY2hTdGF0dXMoKSB7CiAgcmV0dXJuIGdldDxDb2FjaFN0YXR1cz4oJy9hcGkvY29hY2gvc3RhdHVzJykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvYWNoRGVja3MoKSB7CiAgcmV0dXJuIGdldDxDb2FjaERlY2tbXT4oJy9hcGkvY29hY2gvZGVja3MnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29hY2hEZWNrUmVwb3J0KGRlY2tJZDogbnVtYmVyKSB7CiAgcmV0dXJuIGdldDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oYC9hcGkvY29hY2gvZGVja3MvJHtkZWNrSWR9L3JlcG9ydGApCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhbmFseXplQ29hY2hEZWNrKGRlY2tJZDogbnVtYmVyKSB7CiAgcmV0dXJuIHBvc3Q8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGAvYXBpL2NvYWNoL2RlY2tzLyR7ZGVja0lkfWApCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb2FjaFNlc3Npb25zKCkgewogIHJldHVybiBnZXQ8Q29hY2hTZXNzaW9uW10+KCcvYXBpL2NvYWNoL3Nlc3Npb25zJykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvYWNoU2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZykgewogIHJldHVybiBnZXQ8Q29hY2hTZXNzaW9uPihgL2FwaS9jb2FjaC9zZXNzaW9ucy8ke3Nlc3Npb25JZH1gKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRFbWJlZGRpbmdzKCkgewogIHJldHVybiBwb3N0PHsgc3RhdHVzOiBzdHJpbmcgfT4oJy9hcGkvY29hY2gvZW1iZWRkaW5ncy9kb3dubG9hZCcpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hFbWJlZGRpbmdzKHE6IHN0cmluZywgdG9wSz86IG51bWJlcikgewogIHJldHVybiBnZXQ8QXJyYXk8eyBuYW1lOiBzdHJpbmc7IHNjb3JlOiBudW1iZXIgfT4+KCcvYXBpL2NvYWNoL2VtYmVkZGluZ3Mvc2VhcmNoJywgeyBxLCB0b3BfazogdG9wSyB9KQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvcnQoZGVja0lkOiBudW1iZXIpIHsKICByZXR1cm4gcG9zdDx7IHJlcG9ydF9pZDogc3RyaW5nIH0+KCcvYXBpL2NvYWNoL3JlcG9ydHMvZ2VuZXJhdGUnLCB7IGRlY2tfaWQ6IGRlY2tJZCB9KQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\coach.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/collection.ts (2,067 bytes)
$b = 'aW1wb3J0IHsgZ2V0LCBwb3N0LCBwYXRjaCwgcG9zdEZvcm0gfSBmcm9tICcuL2NsaWVudCcKaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ2FyZCwgQ29sbGVjdGlvbkZpbHRlcnMsIFNldEluZm8sIFNjYW5SZXN1bHQgfSBmcm9tICcuLi90eXBlcycKCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hDb2xsZWN0aW9uKGZpbHRlcnM6IENvbGxlY3Rpb25GaWx0ZXJzKSB7CiAgcmV0dXJuIGdldDx7IGNhcmRzOiBDb2xsZWN0aW9uQ2FyZFtdOyB0b3RhbDogbnVtYmVyOyBwYWdlOiBudW1iZXI7IHBhZ2Vfc2l6ZTogbnVtYmVyIH0+KAogICAgJy9hcGkvY29sbGVjdGlvbicsIGZpbHRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4KICApCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYXJkKGNhcmRJZDogbnVtYmVyKSB7CiAgcmV0dXJuIGdldDxDb2xsZWN0aW9uQ2FyZD4oYC9hcGkvY29sbGVjdGlvbi8ke2NhcmRJZH1gKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQ2FyZChjYXJkSWQ6IG51bWJlciwgdXBkYXRlczogUGFydGlhbDxDb2xsZWN0aW9uQ2FyZD4pIHsKICByZXR1cm4gcGF0Y2g8Q29sbGVjdGlvbkNhcmQ+KGAvYXBpL2NvbGxlY3Rpb24vJHtjYXJkSWR9YCwgdXBkYXRlcykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNldHMoKSB7CiAgcmV0dXJuIGdldDxTZXRJbmZvW10+KCcvYXBpL2NvbGxlY3Rpb24vc2V0cycpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLZXl3b3JkcygpIHsKICByZXR1cm4gZ2V0PHN0cmluZ1tdPignL2FwaS9jb2xsZWN0aW9uL2tleXdvcmRzJykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cG9ydENvbGxlY3Rpb24oZm9ybWF0OiBzdHJpbmcgPSAnY3N2JykgewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAvYXBpL2NvbGxlY3Rpb24vZXhwb3J0P2Zvcm1hdD0ke2Zvcm1hdH1gKQogIHJldHVybiByZXMuYmxvYigpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRDb2xsZWN0aW9uKGZpbGU6IEZpbGUpIHsKICBjb25zdCBmZCA9IG5ldyBGb3JtRGF0YSgpCiAgZmQuYXBwZW5kKCdmaWxlJywgZmlsZSkKICByZXR1cm4gcG9zdEZvcm08eyBpbXBvcnRlZDogbnVtYmVyOyBlcnJvcnM6IHN0cmluZ1tdIH0+KCcvYXBpL2NvbGxlY3Rpb24vaW1wb3J0JywgZmQpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzY2FuQ2FyZChmaWxlOiBGaWxlKSB7CiAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoKQogIGZkLmFwcGVuZCgnaW1hZ2UnLCBmaWxlKQogIHJldHVybiBwb3N0Rm9ybTxTY2FuUmVzdWx0PignL2FwaS9jb2xsZWN0aW9uL3NjYW4nLCBmZCkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFNjYW5SZXN1bHQobWF0Y2g6IHsgbmFtZTogc3RyaW5nOyBzZXRfY29kZTogc3RyaW5nOyBzY3J5ZmFsbF9pZDogc3RyaW5nOyBxdWFudGl0eT86IG51bWJlciB9KSB7CiAgcmV0dXJuIHBvc3Q8eyBzdWNjZXNzOiBib29sZWFuOyBjYXJkX2lkOiBudW1iZXIgfT4oJy9hcGkvY29sbGVjdGlvbi9zY2FuL2FkZCcsIG1hdGNoKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVFbnJpY2hDYXJkcygpIHsKICByZXR1cm4gcG9zdDx7IHVwZGF0ZWQ6IG51bWJlciB9PignL2FwaS9jb2xsZWN0aW9uL3JlLWVucmljaCcpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhdXRvQ2xhc3NpZnkoY2FyZElkOiBudW1iZXIpIHsKICByZXR1cm4gcG9zdDx7IGNsYXNzaWZpY2F0aW9uczogc3RyaW5nW10gfT4oYC9hcGkvY29sbGVjdGlvbi9hdXRvLWNsYXNzaWZ5YCwgeyBjYXJkX2lkOiBjYXJkSWQgfSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dG9DbGFzc2lmeUFsbCgpIHsKICByZXR1cm4gcG9zdDx7IHByb2Nlc3NlZDogbnVtYmVyIH0+KCcvYXBpL2NvbGxlY3Rpb24vYXV0by1jbGFzc2lmeS1hbGwnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRocmVjRGF0YShjYXJkSWQ6IG51bWJlcikgewogIHJldHVybiBnZXQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGAvYXBpL2NvbGxlY3Rpb24vJHtjYXJkSWR9L2VkaHJlY2ApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\collection.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/deckgen.ts (854 bytes)
$b = 'aW1wb3J0IHsgZ2V0LCBwb3N0IH0gZnJvbSAnLi9jbGllbnQnCmltcG9ydCB0eXBlIHsgRGVja0dlblYzUmVxdWVzdCwgRGVja0dlblYzU3RhdHVzLCBEZWNrR2VuVjNSZXN1bHQsIENvbW1hbmRlclNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJwoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFYzU3RhdHVzKCkgewogIHJldHVybiBnZXQ8RGVja0dlblYzU3RhdHVzPignL2FwaS9kZWNrL3YzL3N0YXR1cycpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWFyY2hDb21tYW5kZXJzKHE6IHN0cmluZykgewogIHJldHVybiBnZXQ8Q29tbWFuZGVyU2VhcmNoUmVzdWx0W10+KCcvYXBpL2RlY2stZ2VuZXJhdG9yL2NvbW1hbmRlci1zZWFyY2gnLCB7IHEgfSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVja1YzKHJlcTogRGVja0dlblYzUmVxdWVzdCkgewogIHJldHVybiBwb3N0PERlY2tHZW5WM1Jlc3VsdD4oJy9hcGkvZGVjay92My9nZW5lcmF0ZScsIHJlcSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbW1pdERlY2tWMyhyZXE6IERlY2tHZW5WM1JlcXVlc3QpIHsKICByZXR1cm4gcG9zdDxEZWNrR2VuVjNSZXN1bHQgJiB7IGRlY2tfaWQ6IG51bWJlcjsgZGNrX3BhdGg6IHN0cmluZyB9PignL2FwaS9kZWNrL3YzL2NvbW1pdCcsIHJlcSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cG9ydERlY2tWMyhmb3JtYXQ6ICdjc3YnIHwgJ2RjaycgfCAnbW94ZmllbGQnIHwgJ3Nob3BwaW5nJywgcmVxOiBEZWNrR2VuVjNSZXF1ZXN0KSB7CiAgcmV0dXJuIHBvc3Q8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGAvYXBpL2RlY2svdjMvZXhwb3J0LyR7Zm9ybWF0fWAsIHJlcSkKfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\deckgen.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/decks.ts (3,174 bytes)
$b = 'aW1wb3J0IHsgZ2V0LCBwb3N0LCBwdXQsIGRlbCwgcGF0Y2ggfSBmcm9tICcuL2NsaWVudCcKaW1wb3J0IHR5cGUgeyBEZWNrLCBEZWNrQ2FyZCwgRGVja0FuYWx5c2lzLCBEZWNrUmVjb21tZW5kYXRpb24sIEVkaFJlY3NSZXNwb25zZSwgQ29sbGVjdGlvblJlY3NSZXNwb25zZSwgUHBseFN0YXR1cyB9IGZyb20gJy4uL3R5cGVzJwoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3REZWNrcygpIHsKICByZXR1cm4gZ2V0PERlY2tbXT4oJy9hcGkvZGVja3MnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVjayhkZWNrSWQ6IG51bWJlcikgewogIHJldHVybiBnZXQ8RGVjaz4oYC9hcGkvZGVja3MvJHtkZWNrSWR9YCkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlY2soZGVjazogeyBuYW1lOiBzdHJpbmc7IGNvbW1hbmRlcj86IHN0cmluZzsgZm9ybWF0Pzogc3RyaW5nIH0pIHsKICByZXR1cm4gcG9zdDxEZWNrPignL2FwaS9kZWNrcycsIGRlY2spCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEZWNrKGRlY2tJZDogbnVtYmVyLCB1cGRhdGVzOiBQYXJ0aWFsPERlY2s+KSB7CiAgcmV0dXJuIHB1dDxEZWNrPihgL2FwaS9kZWNrcy8ke2RlY2tJZH1gLCB1cGRhdGVzKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlRGVjayhkZWNrSWQ6IG51bWJlcikgewogIHJldHVybiBkZWw8dm9pZD4oYC9hcGkvZGVja3MvJHtkZWNrSWR9YCkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbERlY2tzKCkgewogIHJldHVybiBkZWw8dm9pZD4oJy9hcGkvZGVja3MnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVja0NhcmRzKGRlY2tJZDogbnVtYmVyKSB7CiAgcmV0dXJuIGdldDxEZWNrQ2FyZFtdPihgL2FwaS9kZWNrcy8ke2RlY2tJZH0vY2FyZHNgKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkQ2FyZFRvRGVjayhkZWNrSWQ6IG51bWJlciwgY2FyZDogeyBuYW1lOiBzdHJpbmc7IHNjcnlmYWxsX2lkPzogc3RyaW5nOyBxdWFudGl0eT86IG51bWJlcjsgY2F0ZWdvcnk/OiBzdHJpbmcgfSkgewogIHJldHVybiBwb3N0PERlY2tDYXJkPihgL2FwaS9kZWNrcy8ke2RlY2tJZH0vY2FyZHNgLCBjYXJkKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQ2FyZEZyb21EZWNrKGRlY2tJZDogbnVtYmVyLCBjYXJkSWQ6IG51bWJlcikgewogIHJldHVybiBkZWw8dm9pZD4oYC9hcGkvZGVja3MvJHtkZWNrSWR9L2NhcmRzLyR7Y2FyZElkfWApCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEZWNrQ2FyZChkZWNrSWQ6IG51bWJlciwgY2FyZElkOiBudW1iZXIsIHVwZGF0ZXM6IFBhcnRpYWw8RGVja0NhcmQ+KSB7CiAgcmV0dXJuIHBhdGNoPERlY2tDYXJkPihgL2FwaS9kZWNrcy8ke2RlY2tJZH0vY2FyZHMvJHtjYXJkSWR9YCwgdXBkYXRlcykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERlY2tBbmFseXNpcyhkZWNrSWQ6IG51bWJlcikgewogIHJldHVybiBnZXQ8RGVja0FuYWx5c2lzPihgL2FwaS9kZWNrcy8ke2RlY2tJZH0vYW5hbHlzaXNgKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvblJlY3MoZGVja0lkOiBudW1iZXIpIHsKICByZXR1cm4gZ2V0PENvbGxlY3Rpb25SZWNzUmVzcG9uc2U+KGAvYXBpL2RlY2tzLyR7ZGVja0lkfS9yZWNvbW1lbmRlZC1mcm9tLWNvbGxlY3Rpb25gKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RWRoUmVjcyhkZWNrSWQ6IG51bWJlciwgb25seU93bmVkID0gZmFsc2UsIG1heFJlc3VsdHMgPSAzMCkgewogIHJldHVybiBnZXQ8RWRoUmVjc1Jlc3BvbnNlPihgL2FwaS9kZWNrcy8ke2RlY2tJZH0vZWRoLXJlY3M/b25seV9vd25lZD0ke29ubHlPd25lZH0mbWF4X3Jlc3VsdHM9JHttYXhSZXN1bHRzfWApCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWxrQWRkQ2FyZHMoZGVja0lkOiBudW1iZXIsIGNhcmRzOiB7IG5hbWU6IHN0cmluZzsgcXVhbnRpdHk/OiBudW1iZXIgfVtdKSB7CiAgcmV0dXJuIHBvc3Q8eyBhZGRlZDogbnVtYmVyIH0+KGAvYXBpL2RlY2tzLyR7ZGVja0lkfS9idWxrLWFkZGAsIHsgY2FyZHMgfSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bGtBZGRSZWNvbW1lbmRlZChkZWNrSWQ6IG51bWJlciwgY2FyZHM6IHN0cmluZ1tdKSB7CiAgcmV0dXJuIHBvc3Q8eyBhZGRlZDogbnVtYmVyIH0+KGAvYXBpL2RlY2tzLyR7ZGVja0lkfS9idWxrLWFkZC1yZWNvbW1lbmRlZGAsIHsgY2FyZF9uYW1lczogY2FyZHMg' +
'fSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cG9ydERlY2tUb1NpbShkZWNrSWQ6IG51bWJlcikgewogIHJldHVybiBwb3N0PHsgcGF0aDogc3RyaW5nIH0+KGAvYXBpL2RlY2tzLyR7ZGVja0lkfS9leHBvcnQtdG8tc2ltYCkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydERlY2tUb0RlY2soZGVja0lkOiBudW1iZXIsIGRhdGE6IHsgdGV4dD86IHN0cmluZzsgdXJsPzogc3RyaW5nIH0pIHsKICByZXR1cm4gcG9zdDx7IGltcG9ydGVkOiBudW1iZXIgfT4oYC9hcGkvZGVja3MvJHtkZWNrSWR9L2ltcG9ydGAsIGRhdGEpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnROZXdEZWNrKGRhdGE6IHsgdGV4dD86IHN0cmluZzsgdXJsPzogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0pIHsKICByZXR1cm4gcG9zdDxEZWNrPignL2FwaS9kZWNrcy9pbXBvcnQtbmV3JywgZGF0YSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBwbHhTdGF0dXMoKSB7CiAgcmV0dXJuIGdldDxQcGx4U3RhdHVzPignL2FwaS9wcGx4L3N0YXR1cycpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNrUmVzZWFyY2gocGF5bG9hZDogeyBjb21tYW5kZXI6IHN0cmluZzsgc3RyYXRlZ3k/OiBzdHJpbmcgfSkgewogIHJldHVybiBwb3N0PHsgcmVzZWFyY2g6IHN0cmluZyB9PignL2FwaS9kZWNrLXJlc2VhcmNoJywgcGF5bG9hZCkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY2tHZW5lcmF0ZShwYXlsb2FkOiB7IGNvbW1hbmRlcjogc3RyaW5nOyBzdHJhdGVneT86IHN0cmluZzsgYnJhY2tldD86IG51bWJlciB9KSB7CiAgcmV0dXJuIHBvc3Q8eyBjYXJkczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHF1YW50aXR5OiBudW1iZXI7IGNhdGVnb3J5OiBzdHJpbmcgfT4gfT4oJy9hcGkvZGVjay1nZW5lcmF0ZScsIHBheWxvYWQpCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\decks.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/index.ts (264 bytes)
$b = 'ZXhwb3J0ICogYXMgY29sbGVjdGlvbkFwaSBmcm9tICcuL2NvbGxlY3Rpb24nCmV4cG9ydCAqIGFzIGRlY2tzQXBpIGZyb20gJy4vZGVja3MnCmV4cG9ydCAqIGFzIGRlY2tnZW5BcGkgZnJvbSAnLi9kZWNrZ2VuJwpleHBvcnQgKiBhcyBsYWJBcGkgZnJvbSAnLi9sYWInCmV4cG9ydCAqIGFzIHNpbUFwaSBmcm9tICcuL3NpbScKZXhwb3J0ICogYXMgY29hY2hBcGkgZnJvbSAnLi9jb2FjaCcKZXhwb3J0ICogYXMgdHJhaW5pbmdBcGkgZnJvbSAnLi90cmFpbmluZycK'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\index.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/lab.ts (2,088 bytes)
$b = 'aW1wb3J0IHsgZ2V0LCBwb3N0IH0gZnJvbSAnLi9jbGllbnQnCmltcG9ydCB0eXBlIHsgTGFiRGVjaywgTGFiU3RhdHVzLCBMYWJSZXN1bHQsIExhYkhpc3RvcnlFbnRyeSwgUHJlY29uRGVjayB9IGZyb20gJy4uL3R5cGVzJwoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhYkRlY2tzKCkgewogIHJldHVybiBnZXQ8TGFiRGVja1tdPignL2FwaS9sYWIvZGVja3MnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRCYXRjaFNpbShjb25maWc6IHsgZGVja3M6IHN0cmluZ1tdOyBnYW1lczogbnVtYmVyOyB0aHJlYWRzPzogbnVtYmVyOyB1c2VfZGVlcHNlZWs/OiBib29sZWFuOyBkZWVwc2Vla19kZWNrPzogc3RyaW5nIH0pIHsKICByZXR1cm4gcG9zdDx7IHJ1bl9pZDogc3RyaW5nIH0+KCcvYXBpL2xhYi9zdGFydCcsIGNvbmZpZykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGVlcFNlZWtTaW0oY29uZmlnOiB7IGRlY2tzOiBzdHJpbmdbXTsgZ2FtZXM6IG51bWJlcjsgZGVlcHNlZWtfZGVjazogc3RyaW5nIH0pIHsKICByZXR1cm4gcG9zdDx7IHJ1bl9pZDogc3RyaW5nIH0+KCcvYXBpL2xhYi9zdGFydC1kZWVwc2VlaycsIGNvbmZpZykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhYlN0YXR1cygpIHsKICByZXR1cm4gZ2V0PExhYlN0YXR1cz4oJy9hcGkvbGFiL3N0YXR1cycpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMYWJSZXN1bHQoKSB7CiAgcmV0dXJuIGdldDxMYWJSZXN1bHQ+KCcvYXBpL2xhYi9yZXN1bHQnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TGFiSGlzdG9yeSgpIHsKICByZXR1cm4gZ2V0PExhYkhpc3RvcnlFbnRyeVtdPignL2FwaS9sYWIvaGlzdG9yeScpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcmVjb25zKCkgewogIHJldHVybiBnZXQ8UHJlY29uRGVja1tdPignL2FwaS9sYWIvcHJlY29ucycpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsUHJlY29uKG5hbWU6IHN0cmluZykgewogIHJldHVybiBwb3N0PHsgaW5zdGFsbGVkOiBib29sZWFuIH0+KCcvYXBpL2xhYi9wcmVjb25zL2luc3RhbGwnLCB7IG5hbWUgfSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxQcmVjb25CYXRjaChuYW1lczogc3RyaW5nW10pIHsKICByZXR1cm4gcG9zdDx7IGluc3RhbGxlZDogbnVtYmVyIH0+KCcvYXBpL2xhYi9wcmVjb25zL2luc3RhbGwtYmF0Y2gnLCB7IG5hbWVzIH0pCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNZXRhQ29tbWFuZGVycygpIHsKICByZXR1cm4gZ2V0PEFycmF5PHsgbmFtZTogc3RyaW5nOyBjb2xvcl9pZGVudGl0eTogc3RyaW5nW10gfT4+KCcvYXBpL2xhYi9tZXRhL2NvbW1hbmRlcnMnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoTWV0YUNvbW1hbmRlcnMocTogc3RyaW5nKSB7CiAgcmV0dXJuIGdldDxBcnJheTx7IG5hbWU6IHN0cmluZzsgY29sb3JfaWRlbnRpdHk6IHN0cmluZ1tdOyBzb3VyY2U6IHN0cmluZyB9Pj4oJy9hcGkvbGFiL21ldGEvc2VhcmNoJywgeyBxIH0pCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaE1ldGFEZWNrKGNvbW1hbmRlcjogc3RyaW5nKSB7CiAgcmV0dXJuIHBvc3Q8eyBkZWNrX25hbWU6IHN0cmluZzsgY2FyZHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBxdWFudGl0eTogbnVtYmVyIH0+IH0+KCcvYXBpL2xhYi9tZXRhL2ZldGNoJywgeyBjb21tYW5kZXIgfSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydERlY2tGcm9tVXJsKHVybDogc3RyaW5nKSB7CiAgcmV0dXJuIHBvc3Q8eyBkZWNrX25hbWU6IHN0cmluZyB9PignL2FwaS9sYWIvaW1wb3J0L3VybCcsIHsgdXJsIH0pCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnREZWNrRnJvbVRleHQodGV4dDogc3RyaW5nLCBuYW1lPzogc3RyaW5nKSB7CiAgcmV0dXJuIHBvc3Q8eyBkZWNrX25hbWU6IHN0cmluZyB9PignL2FwaS9sYWIvaW1wb3J0L3RleHQnLCB7IHRleHQsIG5hbWUgfSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldExhYkxvZygpIHsKICByZXR1cm4gZ2V0PHsgbG9nOiBzdHJpbmcgfT4oJy9hcGkvbGFiL2xvZycpCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\lab.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/sim.ts (1,361 bytes)
$b = 'aW1wb3J0IHsgZ2V0LCBwb3N0IH0gZnJvbSAnLi9jbGllbnQnCmltcG9ydCB0eXBlIHsgU2ltU3RhdHVzLCBTaW1SZXN1bHQsIERlZXBTZWVrU3RhdHVzIH0gZnJvbSAnLi4vdHlwZXMnCgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2ltKGNvbmZpZzogeyBkZWNrX2E6IHN0cmluZzsgZGVja19iOiBzdHJpbmc7IGdhbWVzOiBudW1iZXIgfSkgewogIHJldHVybiBwb3N0PHsgc2ltX2lkOiBzdHJpbmcgfT4oJy9hcGkvc2ltL3J1bicsIGNvbmZpZykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blNpbUZyb21EZWNrKGRlY2tJZDogbnVtYmVyLCBjb25maWc6IHsgb3Bwb25lbnQ/OiBzdHJpbmc7IGdhbWVzPzogbnVtYmVyIH0pIHsKICByZXR1cm4gcG9zdDx7IHNpbV9pZDogc3RyaW5nIH0+KCcvYXBpL3NpbS9ydW4tZnJvbS1kZWNrJywgeyBkZWNrX2lkOiBkZWNrSWQsIC4uLmNvbmZpZyB9KQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuRGVlcFNlZWtTaW0oY29uZmlnOiB7IGRlY2tfYTogc3RyaW5nOyBkZWNrX2I6IHN0cmluZzsgZ2FtZXM6IG51bWJlcjsgZGVlcHNlZWtfZGVjazogc3RyaW5nIH0pIHsKICByZXR1cm4gcG9zdDx7IHNpbV9pZDogc3RyaW5nIH0+KCcvYXBpL3NpbS9ydW4tZGVlcHNlZWsnLCBjb25maWcpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaW1TdGF0dXMoc2ltSWQ6IHN0cmluZykgewogIHJldHVybiBnZXQ8U2ltU3RhdHVzPignL2FwaS9zaW0vc3RhdHVzJywgeyBzaW1JZCB9KQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2ltUmVzdWx0KHNpbUlkOiBzdHJpbmcpIHsKICByZXR1cm4gZ2V0PFNpbVJlc3VsdD4oJy9hcGkvc2ltL3Jlc3VsdCcsIHsgc2ltSWQgfSkKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3REZWVwU2VlaygpIHsKICByZXR1cm4gcG9zdDxEZWVwU2Vla1N0YXR1cz4oJy9hcGkvZGVlcHNlZWsvY29ubmVjdCcpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZWVwU2Vla1N0YXR1cygpIHsKICByZXR1cm4gZ2V0PERlZXBTZWVrU3RhdHVzPignL2FwaS9kZWVwc2Vlay9zdGF0dXMnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZmlndXJlRGVlcFNlZWsoY29uZmlnOiB7IG1vZGVsPzogc3RyaW5nOyBiYXNlX3VybD86IHN0cmluZyB9KSB7CiAgcmV0dXJuIHBvc3Q8RGVlcFNlZWtTdGF0dXM+KCcvYXBpL2RlZXBzZWVrL2NvbmZpZ3VyZScsIGNvbmZpZykKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERlZXBTZWVrTG9ncygpIHsKICByZXR1cm4gZ2V0PEFycmF5PHsgZmlsZW5hbWU6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyBtb2RpZmllZDogc3RyaW5nIH0+PignL2FwaS9kZWVwc2Vlay9sb2dzJykKfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\sim.ts' -B $b
# frontend/commander-ai-lab-ui/src/api/training.ts (3,535 bytes)
$b = 'aW1wb3J0IHsgZ2V0LCBwb3N0IH0gZnJvbSAnLi9jbGllbnQnCmltcG9ydCB0eXBlIHsKICBNTFN0YXR1cywgTUxEYXRhU3RhdHVzLCBNTFRyYWluU3RhdHVzLCBQUE9UcmFpblN0YXR1cywKICBUb3VybmFtZW50U3RhdHVzLCBUb3VybmFtZW50UmVzdWx0cywgTUxNb2RlbEluZm8KfSBmcm9tICcuLi90eXBlcycKCi8vIOKUgOKUgCBNTCBTdGF0dXMgJiBUb2dnbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNTFN0YXR1cygpIHsKICByZXR1cm4gZ2V0PE1MU3RhdHVzPignL2FwaS9tbC9zdGF0dXMnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9nZ2xlTUwoZW5hYmxlID0gdHJ1ZSkgewogIHJldHVybiBwb3N0PHsgbWxfbG9nZ2luZ19lbmFibGVkOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfT4oYC9hcGkvbWwvdG9nZ2xlP2VuYWJsZT0ke2VuYWJsZX1gKQp9CgovLyDilIDilIAgRGF0YSAmIE1vZGVsIEluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREYXRhU3RhdHVzKCkgewogIHJldHVybiBnZXQ8TUxEYXRhU3RhdHVzPignL2FwaS9tbC9kYXRhL3N0YXR1cycpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNb2RlbEluZm8oKSB7CiAgcmV0dXJuIGdldDxNTE1vZGVsSW5mbz4oJy9hcGkvbWwvbW9kZWwnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVsb2FkTW9kZWwoY2hlY2twb2ludD86IHN0cmluZykgewogIHJldHVybiBwb3N0PHsgc3VjY2VzczogYm9vbGVhbjsgc3RhdHVzOiBNTE1vZGVsSW5mbyB9PignL2FwaS9tbC9yZWxvYWQnLCBjaGVja3BvaW50ID8geyBjaGVja3BvaW50IH0gOiB1bmRlZmluZWQpCn0KCi8vIOKUgOKUgCBTdXBlcnZpc2VkIFRyYWluaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUcmFpbmluZyhjb25maWc6IHsKICBlcG9jaHM/OiBudW1iZXIKICBscj86IG51bWJlcgogIGJhdGNoU2l6ZT86IG51bWJlcgogIHBhdGllbmNlPzogbnVtYmVyCiAgcmVidWlsZERhdGFzZXQ/OiBib29sZWFuCn0pIHsKICByZXR1cm4gcG9zdDx7IHN0YXR1czogc3RyaW5nOyBjb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KCcvYXBpL21sL3RyYWluJywgY29uZmlnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VHJhaW5TdGF0dXMoKSB7CiAgcmV0dXJuIGdldDxNTFRyYWluU3RhdHVzPignL2FwaS9tbC90cmFpbi9zdGF0dXMnKQp9CgovLyDilIDilIAgUFBPIFRyYWluaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRQUE9UcmFpbmluZyhjb25maWc6IHsKICBpdGVyYXRpb25zPzogbnVtYmVyCiAgZXBpc29kZXNQZXJJdGVyPzogbnVtYmVyCiAgcHBvRXBvY2hzPzogbnVtYmVyCiAgYmF0Y2hTaXplPzogbnVtYmVyCiAgbHI/OiBudW1iZXIKICBjbGlwRXBzaWxvbj86IG51bWJlcgogIGVudHJvcHlDb2VmZj86IG51bWJlcgogIG9wcG9uZW50Pzogc3RyaW5nCiAgcGxheXN0eWxlPzogc3RyaW5nCiAgbG9hZFN1cGVydmlzZWQ/OiBzdHJpbmcKfSkgewogIHJldHVybiBwb3N0PHsgc3RhdHVzOiBzdHJpbmc7IGl0ZXJhdGlvbnM6IG51bWJlciB9PignL2FwaS9tbC90cmFpbi9wcG8nLCBjb25maWcpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQUE9TdGF0dXMoKSB7CiAgcmV0dXJuIGdldDxQUE9UcmFpblN0YXR1cz4oJy9hcGkvbWwvdHJhaW4vcHBvL3N0YXR1cycpCn0KCi8vIOKUgOKUgCBUb3VybmFtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUb3VybmFtZW50KGNvbmZpZzogewogIGVwaXNvZGVzPzogbnVtYmVyCiAgcGxheXN0eWxlPzogc3RyaW5nCn0pIHsKICByZXR1cm4gcG9zdDx7IHN0YXR1czogc3RyaW5nOyBlcGlzb2RlczogbnVtYmVyIH0+KCcvYXBpL21sL3RvdXJuYW1lbnQnLCBjb25maWcpCn0KCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRUb3VybmFtZW50U3RhdHVzKCkgewogIHJldHVybiBnZXQ8VG91cm5hbWVudFN0YXR1cz4oJy9hcGkvbWwvdG91cm5hbWVudC9zdGF0dXMnKQp9CgpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0VG91cm5hbWVudFJlc3VsdHMoKSB7CiAgcmV0dXJuIGdldDxUb3VybmFtZW50UmVzdWx0cz4oJy9hcGkvbWwvdG91cm5hbWVudC9yZXN1bHRzJykKfQoKLy8g4pSA4pSAIERlY2lzaW9uIEZpbGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVjaXNpb25GaWxlKGZpbGVuYW1lOiBzdHJpbmcsIGxpbWl0ID0gMTAwLCBvZmZzZXQgPSAwKSB7CiAgcmV0dXJuIGdldDx7IGZpbGU6IHN0cmluZzsgb2Zmc2V0OiBudW1iZXI7IGxpbWl0OiBudW1iZXI7IGNvdW50OiBudW1iZXI7IGRlY2lzaW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSB9PigKICAgIGAvYXBpL21sL2RlY2lzaW9ucy8ke2ZpbGVuYW1lfT9saW1pdD0ke2xpbWl0fSZvZmZzZXQ9JHtvZmZzZXR9YAogICkKfQoKLy8g4pSA4pSAIFByZWRpY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVkaWN0KHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgewogIHJldHVybiBwb3N0PHsgYWN0aW9uOiBzdHJpbmc7IGFjdGlvbl9pbmRleDogbnVtYmVyOyBjb25maWRlbmNlOiBudW1iZXI7IHByb2JhYmlsaXRpZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47IGluZmVyZW5jZV9tczogbnVtYmVyIH0+KAogICAgJy9hcGkvbWwvcHJlZGljdCcsIHN0YXRlCiAgKQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\api\training.ts' -B $b
# frontend/commander-ai-lab-ui/src/components/common/CardImage.tsx (1,500 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCcKCmludGVyZmFjZSBDYXJkSW1hZ2VQcm9wcyB7CiAgc3JjOiBzdHJpbmcKICBhbHQ6IHN0cmluZwogIHNpemU/OiAnc20nIHwgJ21kJyB8ICdsZycgfCAneGwnCiAgY2xhc3NOYW1lPzogc3RyaW5nCiAgb25DbGljaz86ICgpID0+IHZvaWQKfQoKY29uc3QgU0laRVMgPSB7CiAgc206ICd3LTE2IGgtWzIycHhdJywgICAgLy8gdGlueSBpbmxpbmUKICBtZDogJ3ctWzE0NnB4XSBoLVsyMDRweF0nLCAgLy8gZ3JpZCB0aHVtYm5haWwKICBsZzogJ3ctWzI0NHB4XSBoLVszNDBweF0nLCAgLy8gZGV0YWlsIHZpZXcKICB4bDogJ3ctWzMzNnB4XSBoLVs0NjhweF0nLCAgLy8gZnVsbCBzaXplCn0KCmV4cG9ydCBmdW5jdGlvbiBDYXJkSW1hZ2UoeyBzcmMsIGFsdCwgc2l6ZSA9ICdtZCcsIGNsYXNzTmFtZSA9ICcnLCBvbkNsaWNrIH06IENhcmRJbWFnZVByb3BzKSB7CiAgY29uc3QgW2xvYWRlZCwgc2V0TG9hZGVkXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpCgogIC8vIEJ1aWxkIFNjcnlmYWxsIFVSTCBpZiBuZWVkZWQg4oCUIGVuc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IHNpemUKICBjb25zdCBpbWdVcmwgPSBzcmMgfHwgJycKCiAgcmV0dXJuICgKICAgIDxkaXYKICAgICAgY2xhc3NOYW1lPXtgcmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbGcgYmctYmctdGVydGlhcnkgJHtTSVpFU1tzaXplXX0gJHtvbkNsaWNrID8gJ2N1cnNvci1wb2ludGVyIGhvdmVyOnJpbmctMiBob3ZlcjpyaW5nLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsJyA6ICcnfSAke2NsYXNzTmFtZX1gfQogICAgICBvbkNsaWNrPXtvbkNsaWNrfQogICAgPgogICAgICB7IWVycm9yID8gKAogICAgICAgIDxpbWcKICAgICAgICAgIHNyYz17aW1nVXJsfQogICAgICAgICAgYWx0PXthbHR9CiAgICAgICAgICBjbGFzc05hbWU9e2B3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlciB0cmFuc2l0aW9uLW9wYWNpdHkgZHVyYXRpb24tMjAwICR7bG9hZGVkID8gJ29wYWNpdHktMTAwJyA6ICdvcGFjaXR5LTAnfWB9CiAgICAgICAgICBvbkxvYWQ9eygpID0+IHNldExvYWRlZCh0cnVlKX0KICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldEVycm9yKHRydWUpfQogICAgICAgICAgbG9hZGluZz0ibGF6eSIKICAgICAgICAvPgogICAgICApIDogKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHRleHQtdGV4dC10ZXJ0aWFyeSB0ZXh0LXhzIHRleHQtY2VudGVyIHAtMiI+CiAgICAgICAgICB7YWx0fQogICAgICAgIDwvZGl2PgogICAgICApfQogICAgICB7IWxvYWRlZCAmJiAhZXJyb3IgJiYgKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJhYnNvbHV0ZSBpbnNldC0wIGJnLWJnLXRlcnRpYXJ5IGFuaW1hdGUtcHVsc2UiIC8+CiAgICAgICl9CiAgICA8L2Rpdj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\common\CardImage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/components/common/EmptyState.tsx (636 bytes)
$b = 'aW1wb3J0IHR5cGUgeyBMdWNpZGVJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0JwoKaW50ZXJmYWNlIEVtcHR5U3RhdGVQcm9wcyB7CiAgaWNvbjogTHVjaWRlSWNvbgogIHRpdGxlOiBzdHJpbmcKICBkZXNjcmlwdGlvbj86IHN0cmluZwogIGFjdGlvbj86IFJlYWN0LlJlYWN0Tm9kZQp9CgpleHBvcnQgZnVuY3Rpb24gRW1wdHlTdGF0ZSh7IGljb246IEljb24sIHRpdGxlLCBkZXNjcmlwdGlvbiwgYWN0aW9uIH06IEVtcHR5U3RhdGVQcm9wcykgewogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHktMTYgdGV4dC1jZW50ZXIiPgogICAgICA8SWNvbiBjbGFzc05hbWU9InctMTIgaC0xMiB0ZXh0LXRleHQtdGVydGlhcnkgbWItNCIgc3Ryb2tlV2lkdGg9ezEuNX0gLz4KICAgICAgPGgzIGNsYXNzTmFtZT0idGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IG1iLTEiPnt0aXRsZX08L2gzPgogICAgICB7ZGVzY3JpcHRpb24gJiYgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbWF4LXctbWQgbWItNCI+e2Rlc2NyaXB0aW9ufTwvcD59CiAgICAgIHthY3Rpb259CiAgICA8L2Rpdj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\common\EmptyState.tsx' -B $b
# frontend/commander-ai-lab-ui/src/components/common/ManaSymbols.tsx (1,883 bytes)
$b = 'Ly8gUGFyc2UgTVRHIG1hbmEgY29zdCBzdHJpbmdzIGxpa2UgInsyfXtXfXtVfSIgaW50byBjb2xvcmVkIHN5bWJvbHMKCmNvbnN0IE1BTkFfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gewogIFc6ICdiZy1tYW5hLXdoaXRlIHRleHQtYmxhY2snLAogIFU6ICdiZy1tYW5hLWJsdWUgdGV4dC13aGl0ZScsCiAgQjogJ2JnLW1hbmEtYmxhY2sgdGV4dC13aGl0ZScsCiAgUjogJ2JnLW1hbmEtcmVkIHRleHQtd2hpdGUnLAogIEc6ICdiZy1tYW5hLWdyZWVuIHRleHQtd2hpdGUnLAogIEM6ICdiZy1tYW5hLWNvbG9ybGVzcyB0ZXh0LXdoaXRlJywKfQoKaW50ZXJmYWNlIE1hbmFTeW1ib2xzUHJvcHMgewogIGNvc3Q6IHN0cmluZwogIHNpemU/OiAnc20nIHwgJ21kJwp9CgpleHBvcnQgZnVuY3Rpb24gTWFuYVN5bWJvbHMoeyBjb3N0LCBzaXplID0gJ3NtJyB9OiBNYW5hU3ltYm9sc1Byb3BzKSB7CiAgaWYgKCFjb3N0KSByZXR1cm4gbnVsbAoKICBjb25zdCBzeW1ib2xzID0gY29zdC5tYXRjaCgvXHsoW159XSspXH0vZykKICBpZiAoIXN5bWJvbHMpIHJldHVybiA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC10ZXJ0aWFyeSI+e2Nvc3R9PC9zcGFuPgoKICBjb25zdCBzeiA9IHNpemUgPT09ICdzbScgPyAndy01IGgtNSB0ZXh0LVsxMHB4XScgOiAndy02IGgtNiB0ZXh0LXhzJwoKICByZXR1cm4gKAogICAgPHNwYW4gY2xhc3NOYW1lPSJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTAuNSI+CiAgICAgIHtzeW1ib2xzLm1hcCgocywgaSkgPT4gewogICAgICAgIGNvbnN0IHZhbCA9IHMucmVwbGFjZSgvW3t9XS9nLCAnJykKICAgICAgICBjb25zdCBjb2xvckNsYXNzID0gTUFOQV9DT0xPUlNbdmFsXSB8fCAnYmctbWFuYS1jb2xvcmxlc3MgdGV4dC13aGl0ZScKICAgICAgICByZXR1cm4gKAogICAgICAgICAgPHNwYW4KICAgICAgICAgICAga2V5PXtpfQogICAgICAgICAgICBjbGFzc05hbWU9e2Ake3N6fSBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1mdWxsIGZvbnQtYm9sZCAke2NvbG9yQ2xhc3N9YH0KICAgICAgICAgID4KICAgICAgICAgICAge3ZhbH0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICApCiAgICAgIH0pfQogICAgPC9zcGFuPgogICkKfQoKLy8gQ29sb3IgaWRlbnRpdHkgZG90cwppbnRlcmZhY2UgQ29sb3JEb3RzUHJvcHMgewogIGNvbG9yczogc3RyaW5nW10KICBzaXplPzogJ3NtJyB8ICdtZCcKfQoKZXhwb3J0IGZ1bmN0aW9uIENvbG9yRG90cyh7IGNvbG9ycywgc2l6ZSA9ICdzbScgfTogQ29sb3JEb3RzUHJvcHMpIHsKICBpZiAoIWNvbG9ycyB8fCBjb2xvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXRleHQtdGVydGlhcnkgdGV4dC14cyI+Q29sb3JsZXNzPC9zcGFuPgoKICBjb25zdCBzeiA9IHNpemUgPT09ICdzbScgPyAndy0zIGgtMycgOiAndy00IGgtNCcKCiAgY29uc3QgRE9UX0NPTE9SUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsKICAgIFc6ICdiZy1tYW5hLXdoaXRlJywKICAgIFU6ICdiZy1tYW5hLWJsdWUnLAogICAgQjogJ2JnLW1hbmEtYmxhY2sgYm9yZGVyIGJvcmRlci1ib3JkZXItc2Vjb25kYXJ5JywKICAgIFI6ICdiZy1tYW5hLXJlZCcsCiAgICBHOiAnYmctbWFuYS1ncmVlbicsCiAgfQoKICByZXR1cm4gKAogICAgPHNwYW4gY2xhc3NOYW1lPSJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTAuNSI+CiAgICAgIHtjb2xvcnMubWFwKGMgPT4gKAogICAgICAgIDxzcGFuIGtleT17Y30gY2xhc3NOYW1lPXtgJHtzen0gcm91bmRlZC1mdWxsICR7RE9UX0NPTE9SU1tjXSB8fCAnYmctbWFuYS1jb2xvcmxlc3MnfWB9IC8+CiAgICAgICkpfQogICAgPC9zcGFuPgogICkKfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\common\ManaSymbols.tsx' -B $b
# frontend/commander-ai-lab-ui/src/components/common/Spinner.tsx (849 bytes)
$b = 'aW50ZXJmYWNlIFNwaW5uZXJQcm9wcyB7CiAgc2l6ZT86ICdzbScgfCAnbWQnIHwgJ2xnJwogIGNsYXNzTmFtZT86IHN0cmluZwp9Cgpjb25zdCBTSVpFUyA9IHsgc206ICd3LTQgaC00JywgbWQ6ICd3LTYgaC02JywgbGc6ICd3LTggaC04JyB9CgpleHBvcnQgZnVuY3Rpb24gU3Bpbm5lcih7IHNpemUgPSAnbWQnLCBjbGFzc05hbWUgPSAnJyB9OiBTcGlubmVyUHJvcHMpIHsKICByZXR1cm4gKAogICAgPHN2ZwogICAgICBjbGFzc05hbWU9e2BhbmltYXRlLXNwaW4gJHtTSVpFU1tzaXplXX0gJHtjbGFzc05hbWV9YH0KICAgICAgdmlld0JveD0iMCAwIDI0IDI0IgogICAgICBmaWxsPSJub25lIgogICAgPgogICAgICA8Y2lyY2xlCiAgICAgICAgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIgogICAgICAgIHN0cm9rZT0iY3VycmVudENvbG9yIgogICAgICAgIHN0cm9rZVdpZHRoPSIzIgogICAgICAgIHN0cm9rZUxpbmVjYXA9InJvdW5kIgogICAgICAgIGNsYXNzTmFtZT0ib3BhY2l0eS0yMCIKICAgICAgLz4KICAgICAgPHBhdGgKICAgICAgICBkPSJNMTIgMmExMCAxMCAwIDAgMSAxMCAxMCIKICAgICAgICBzdHJva2U9ImN1cnJlbnRDb2xvciIKICAgICAgICBzdHJva2VXaWR0aD0iMyIKICAgICAgICBzdHJva2VMaW5lY2FwPSJyb3VuZCIKICAgICAgLz4KICAgIDwvc3ZnPgogICkKfQoKZXhwb3J0IGZ1bmN0aW9uIFBhZ2VTcGlubmVyKCkgewogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC02NCI+CiAgICAgIDxTcGlubmVyIHNpemU9ImxnIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+CiAgICA8L2Rpdj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\common\Spinner.tsx' -B $b
# frontend/commander-ai-lab-ui/src/components/common/StatusBadge.tsx (1,138 bytes)
$b = 'aW1wb3J0IHsgQ2hlY2tDaXJjbGUsIFhDaXJjbGUsIEFsZXJ0VHJpYW5nbGUsIEluZm8gfSBmcm9tICdsdWNpZGUtcmVhY3QnCgp0eXBlIFZhcmlhbnQgPSAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ2luZm8nIHwgJ25ldXRyYWwnCgppbnRlcmZhY2UgU3RhdHVzQmFkZ2VQcm9wcyB7CiAgdmFyaWFudDogVmFyaWFudAogIGxhYmVsOiBzdHJpbmcKICBjbGFzc05hbWU/OiBzdHJpbmcKfQoKY29uc3QgU1RZTEVTOiBSZWNvcmQ8VmFyaWFudCwgc3RyaW5nPiA9IHsKICBzdWNjZXNzOiAnYmctc3RhdHVzLXN1Y2Nlc3MvMTUgdGV4dC1zdGF0dXMtc3VjY2VzcyBib3JkZXItc3RhdHVzLXN1Y2Nlc3MvMzAnLAogIGVycm9yOiAnYmctc3RhdHVzLWVycm9yLzE1IHRleHQtc3RhdHVzLWVycm9yIGJvcmRlci1zdGF0dXMtZXJyb3IvMzAnLAogIHdhcm5pbmc6ICdiZy1zdGF0dXMtd2FybmluZy8xNSB0ZXh0LXN0YXR1cy13YXJuaW5nIGJvcmRlci1zdGF0dXMtd2FybmluZy8zMCcsCiAgaW5mbzogJ2JnLXN0YXR1cy1pbmZvLzE1IHRleHQtc3RhdHVzLWluZm8gYm9yZGVyLXN0YXR1cy1pbmZvLzMwJywKICBuZXV0cmFsOiAnYmctYmctdGVydGlhcnkgdGV4dC10ZXh0LXNlY29uZGFyeSBib3JkZXItYm9yZGVyLXByaW1hcnknLAp9Cgpjb25zdCBJQ09OUzogUmVjb3JkPFZhcmlhbnQsIHR5cGVvZiBDaGVja0NpcmNsZT4gPSB7CiAgc3VjY2VzczogQ2hlY2tDaXJjbGUsCiAgZXJyb3I6IFhDaXJjbGUsCiAgd2FybmluZzogQWxlcnRUcmlhbmdsZSwKICBpbmZvOiBJbmZvLAogIG5ldXRyYWw6IEluZm8sCn0KCmV4cG9ydCBmdW5jdGlvbiBTdGF0dXNCYWRnZSh7IHZhcmlhbnQsIGxhYmVsLCBjbGFzc05hbWUgPSAnJyB9OiBTdGF0dXNCYWRnZVByb3BzKSB7CiAgY29uc3QgSWNvbiA9IElDT05TW3ZhcmlhbnRdCiAgcmV0dXJuICgKICAgIDxzcGFuIGNsYXNzTmFtZT17YGlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHB4LTIuNSBweS0xIHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZC1tZCBib3JkZXIgJHtTVFlMRVNbdmFyaWFudF19ICR7Y2xhc3NOYW1lfWB9PgogICAgICA8SWNvbiBjbGFzc05hbWU9InctMy41IGgtMy41IiAvPgogICAgICB7bGFiZWx9CiAgICA8L3NwYW4+CiAgKQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\common\StatusBadge.tsx' -B $b
# frontend/commander-ai-lab-ui/src/components/common/index.ts (230 bytes)
$b = 'ZXhwb3J0IHsgU3Bpbm5lciwgUGFnZVNwaW5uZXIgfSBmcm9tICcuL1NwaW5uZXInCmV4cG9ydCB7IFN0YXR1c0JhZGdlIH0gZnJvbSAnLi9TdGF0dXNCYWRnZScKZXhwb3J0IHsgQ2FyZEltYWdlIH0gZnJvbSAnLi9DYXJkSW1hZ2UnCmV4cG9ydCB7IE1hbmFTeW1ib2xzLCBDb2xvckRvdHMgfSBmcm9tICcuL01hbmFTeW1ib2xzJwpleHBvcnQgeyBFbXB0eVN0YXRlIH0gZnJvbSAnLi9FbXB0eVN0YXRlJwo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\common\index.ts' -B $b
# frontend/commander-ai-lab-ui/src/components/layout/PageLayout.tsx (328 bytes)
$b = 'aW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4vU2lkZWJhcicKCmludGVyZmFjZSBQYWdlTGF5b3V0UHJvcHMgewogIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUKfQoKZXhwb3J0IGZ1bmN0aW9uIFBhZ2VMYXlvdXQoeyBjaGlsZHJlbiB9OiBQYWdlTGF5b3V0UHJvcHMpIHsKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9Im1pbi1oLXNjcmVlbiBiZy1iZy1wcmltYXJ5Ij4KICAgICAgPFNpZGViYXIgLz4KICAgICAgPG1haW4gY2xhc3NOYW1lPSJtbC01NiBtaW4taC1zY3JlZW4iPgogICAgICAgIHtjaGlsZHJlbn0KICAgICAgPC9tYWluPgogICAgPC9kaXY+CiAgKQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\layout\PageLayout.tsx' -B $b
# frontend/commander-ai-lab-ui/src/components/layout/Sidebar.tsx (1,885 bytes)
$b = 'aW1wb3J0IHsgTmF2TGluayB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nCgpjb25zdCBOQVZfSVRFTVMgPSBbCiAgeyB0bzogJy8nLCAgICAgICAgICAgbGFiZWw6ICdCYXRjaCBTaW0nLCAgIGljb246ICfimpfvuI8nIH0sCiAgeyB0bzogJy9jb2xsZWN0aW9uJywgbGFiZWw6ICdDb2xsZWN0aW9uJywgIGljb246ICfwn5OmJyB9LAogIHsgdG86ICcvZGVja3MnLCAgICAgIGxhYmVsOiAnRGVja3MnLCAgICAgICBpY29uOiAn8J+DjycgfSwKICB7IHRvOiAnL2F1dG9nZW4nLCAgICBsYWJlbDogJ0F1dG8gR2VuJywgICAgaWNvbjogJ+KaoScgfSwKICB7IHRvOiAnL3NpbXVsYXRvcicsICBsYWJlbDogJ1NpbXVsYXRvcicsICAgaWNvbjogJ/Cfjq4nIH0sCiAgeyB0bzogJy9jb2FjaCcsICAgICAgbGFiZWw6ICdDb2FjaCcsICAgICAgIGljb246ICfwn6egJyB9LAogIHsgdG86ICcvdHJhaW5pbmcnLCAgIGxhYmVsOiAnVHJhaW5pbmcnLCAgICBpY29uOiAn8J+TiCcgfSwKXQoKZXhwb3J0IGZ1bmN0aW9uIFNpZGViYXIoKSB7CiAgcmV0dXJuICgKICAgIDxhc2lkZSBjbGFzc05hbWU9ImZpeGVkIGxlZnQtMCB0b3AtMCBib3R0b20tMCB3LTU2IGJnLWJnLXNlY29uZGFyeSBib3JkZXItciBib3JkZXItYm9yZGVyLXByaW1hcnkgZmxleCBmbGV4LWNvbCB6LTMwIj4KICAgICAgey8qIExvZ28gKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJweC01IHB5LTUgYm9yZGVyLWIgYm9yZGVyLWJvcmRlci1wcmltYXJ5Ij4KICAgICAgICA8aDEgY2xhc3NOYW1lPSJ0ZXh0LWJhc2UgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5IHRyYWNraW5nLXRpZ2h0Ij4KICAgICAgICAgIENvbW1hbmRlciBBSSBMYWIKICAgICAgICA8L2gxPgogICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgbXQtMC41Ij5NVEcgSW50ZWxsaWdlbmNlIFBsYXRmb3JtPC9wPgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBOYXYgKi99CiAgICAgIDxuYXYgY2xhc3NOYW1lPSJmbGV4LTEgcHktMyBvdmVyZmxvdy15LWF1dG8iPgogICAgICAgIHtOQVZfSVRFTVMubWFwKGl0ZW0gPT4gKAogICAgICAgICAgPE5hdkxpbmsKICAgICAgICAgICAga2V5PXtpdGVtLnRvfQogICAgICAgICAgICB0bz17aXRlbS50b30KICAgICAgICAgICAgZW5kPXtpdGVtLnRvID09PSAnLyd9CiAgICAgICAgICAgIGNsYXNzTmFtZT17KHsgaXNBY3RpdmUgfSkgPT4KICAgICAgICAgICAgICBgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtNSBweS0yLjUgdGV4dC1zbSB0cmFuc2l0aW9uLWNvbG9ycyBkdXJhdGlvbi0xNTAgJHsKICAgICAgICAgICAgICAgIGlzQWN0aXZlCiAgICAgICAgICAgICAgICAgID8gJ2JnLWFjY2VudC1ibHVlLzEwIHRleHQtYWNjZW50LWJsdWUgYm9yZGVyLXItMiBib3JkZXItYWNjZW50LWJsdWUnCiAgICAgICAgICAgICAgICAgIDogJ3RleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC10ZXh0LXByaW1hcnkgaG92ZXI6YmctYmctaG92ZXInCiAgICAgICAgICAgICAgfWAKICAgICAgICAgICAgfQogICAgICAgICAgPgogICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtYmFzZSI+e2l0ZW0uaWNvbn08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuPntpdGVtLmxhYmVsfTwvc3Bhbj4KICAgICAgICAgIDwvTmF2TGluaz4KICAgICAgICApKX0KICAgICAgPC9uYXY+CgogICAgICB7LyogRm9vdGVyICovfQogICAgICA8ZGl2IGNsYXNzTmFtZT0icHgtNSBweS00IGJvcmRlci10IGJvcmRlci1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSI+djQuMCDigJQgUmVhY3QgKyBUeXBlU2NyaXB0PC9wPgogICAgICA8L2Rpdj4KICAgIDwvYXNpZGU+CiAgKQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\components\layout\Sidebar.tsx' -B $b
# frontend/commander-ai-lab-ui/src/hooks/usePolling.ts (423 bytes)
$b = 'aW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCcKCi8qKiBQb2xscyBhIGZ1bmN0aW9uIGF0IHRoZSBnaXZlbiBpbnRlcnZhbCB3aGlsZSBgZW5hYmxlZGAgaXMgdHJ1ZSAqLwpleHBvcnQgZnVuY3Rpb24gdXNlUG9sbGluZyhmbjogKCkgPT4gdm9pZCwgaW50ZXJ2YWxNczogbnVtYmVyLCBlbmFibGVkOiBib29sZWFuKSB7CiAgY29uc3Qgc2F2ZWRGbiA9IHVzZVJlZihmbikKICBzYXZlZEZuLmN1cnJlbnQgPSBmbgoKICB1c2VFZmZlY3QoKCkgPT4gewogICAgaWYgKCFlbmFibGVkKSByZXR1cm4KICAgIGNvbnN0IGlkID0gc2V0SW50ZXJ2YWwoKCkgPT4gc2F2ZWRGbi5jdXJyZW50KCksIGludGVydmFsTXMpCiAgICByZXR1cm4gKCkgPT4gY2xlYXJJbnRlcnZhbChpZCkKICB9LCBbaW50ZXJ2YWxNcywgZW5hYmxlZF0pCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\hooks\usePolling.ts' -B $b
# frontend/commander-ai-lab-ui/src/index.css (3,239 bytes)
$b = 'QGltcG9ydCAidGFpbHdpbmRjc3MiOwoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIERlc2lnbiBUb2tlbnMgKFRhaWx3aW5kIHY0IENTUyBUaGVtZSkKICAgRnJlc2ggZGFyayB0aGVtZSB3aXRoIE1URy1pbnNwaXJlZCBhY2NlbnRzCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKQHRoZW1lIHsKICAvKiDilIDilIAgQmFja2dyb3VuZHMg4pSA4pSAICovCiAgLS1jb2xvci1iZy1wcmltYXJ5OiAjMGYxMTE3OwogIC0tY29sb3ItYmctc2Vjb25kYXJ5OiAjMTYxOTIxOwogIC0tY29sb3ItYmctdGVydGlhcnk6ICMxYzIwMzA7CiAgLS1jb2xvci1iZy1lbGV2YXRlZDogIzIyMjczODsKICAtLWNvbG9yLWJnLWhvdmVyOiAjMmEzMDQ4OwoKICAvKiDilIDilIAgQm9yZGVycyDilIDilIAgKi8KICAtLWNvbG9yLWJvcmRlci1wcmltYXJ5OiAjMmEyZjQyOwogIC0tY29sb3ItYm9yZGVyLXNlY29uZGFyeTogIzM2M2M1NDsKICAtLWNvbG9yLWJvcmRlci1hY2NlbnQ6ICM0ZjZlZjc7CgogIC8qIOKUgOKUgCBUZXh0IOKUgOKUgCAqLwogIC0tY29sb3ItdGV4dC1wcmltYXJ5OiAjZThlYWYwOwogIC0tY29sb3ItdGV4dC1zZWNvbmRhcnk6ICM5YmExYjg7CiAgLS1jb2xvci10ZXh0LXRlcnRpYXJ5OiAjNmI3MTkwOwogIC0tY29sb3ItdGV4dC1pbnZlcnNlOiAjMGYxMTE3OwoKICAvKiDilIDilIAgQWNjZW50cyDilIDilIAgKi8KICAtLWNvbG9yLWFjY2VudC1ibHVlOiAjNGY2ZWY3OwogIC0tY29sb3ItYWNjZW50LWJsdWUtaG92ZXI6ICM2Yjg0ZmY7CiAgLS1jb2xvci1hY2NlbnQtdGVhbDogIzJkZDRiZjsKICAtLWNvbG9yLWFjY2VudC10ZWFsLWhvdmVyOiAjNWVlYWQ0OwogIC0tY29sb3ItYWNjZW50LXB1cnBsZTogI2E3OGJmYTsKICAtLWNvbG9yLWFjY2VudC1hbWJlcjogI2ZiYmYyNDsKICAtLWNvbG9yLWFjY2VudC1yZWQ6ICNmODcxNzE7CiAgLS1jb2xvci1hY2NlbnQtZ3JlZW46ICM0YWRlODA7CgogIC8qIOKUgOKUgCBNVEcgTWFuYSBDb2xvcnMg4pSA4pSAICovCiAgLS1jb2xvci1tYW5hLXdoaXRlOiAjZjlmYWY0OwogIC0tY29sb3ItbWFuYS1ibHVlOiAjMGU2N2FiOwogIC0tY29sb3ItbWFuYS1ibGFjazogIzJiMjQyNDsKICAtLWNvbG9yLW1hbmEtcmVkOiAjZDMyMDJhOwogIC0tY29sb3ItbWFuYS1ncmVlbjogIzAwNzMzZTsKICAtLWNvbG9yLW1hbmEtY29sb3JsZXNzOiAjNzA2ZjZmOwoKICAvKiDilIDilIAgU3RhdHVzIOKUgOKUgCAqLwogIC0tY29sb3Itc3RhdHVzLXN1Y2Nlc3M6ICM0YWRlODA7CiAgLS1jb2xvci1zdGF0dXMtd2FybmluZzogI2ZiYmYyNDsKICAtLWNvbG9yLXN0YXR1cy1lcnJvcjogI2Y4NzE3MTsKICAtLWNvbG9yLXN0YXR1cy1pbmZvOiAjNjBhNWZhOwoKICAvKiDilIDilIAgUmFkaXVzIOKUgOKUgCAqLwogIC0tcmFkaXVzLXNtOiAwLjM3NXJlbTsKICAtLXJhZGl1cy1tZDogMC41cmVtOwogIC0tcmFkaXVzLWxnOiAwLjc1cmVtOwogIC0tcmFkaXVzLXhsOiAxcmVtOwoKICAvKiDilIDilIAgU2hhZG93cyDilIDilIAgKi8KICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAtLXNoYWRvdy1tZDogMCA0cHggMTJweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgLS1zaGFkb3ctbGc6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjUpOwogIC0tc2hhZG93LWdsb3ctYmx1ZTogMCAwIDIwcHggcmdiYSg3OSwgMTEwLCAyNDcsIDAuMTUpOwogIC0tc2hhZG93LWdsb3ctdGVhbDogMCAwIDIwcHggcmdiYSg0NSwgMjEyLCAxOTEsIDAuMTUpOwp9CgovKiDilIDilIAgQmFzZSBTdHlsZXMg4pSA4pSAICovCmh0bWwgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWJnLXByaW1hcnkpOwogIGNvbG9yOiB2YXIoLS1jb2xvci10ZXh0LXByaW1hcnkpOwp9Cgpib2R5IHsKICBmb250LWZhbWlseTogJ0ludGVy' +
'Jywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmOwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7Cn0KCi8qIOKUgOKUgCBTY3JvbGxiYXIg4pSA4pSAICovCjo6LXdlYmtpdC1zY3JvbGxiYXIgewogIHdpZHRoOiA4cHg7CiAgaGVpZ2h0OiA4cHg7Cn0KOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7CiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItYmctc2Vjb25kYXJ5KTsKfQo6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1ib3JkZXItc2Vjb25kYXJ5KTsKICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7CiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItdGV4dC10ZXJ0aWFyeSk7Cn0KCi8qIOKUgOKUgCBVdGlsaXR5IGFuaW1hdGlvbnMg4pSA4pSAICovCkBrZXlmcmFtZXMgZmFkZS1pbiB7CiAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSg0cHgpOyB9CiAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0KfQpAa2V5ZnJhbWVzIHB1bHNlLWdsb3cgewogIDAlLCAxMDAlIHsgYm94LXNoYWRvdzogMCAwIDAgMCByZ2JhKDc5LCAxMTAsIDI0NywgMC4yKTsgfQogIDUwJSB7IGJveC1zaGFkb3c6IDAgMCAxNnB4IDRweCByZ2JhKDc5LCAxMTAsIDI0NywgMC4xNSk7IH0KfQpAa2V5ZnJhbWVzIHNwaW4gewogIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQp9CgouYW5pbWF0ZS1mYWRlLWluIHsKICBhbmltYXRpb246IGZhZGUtaW4gMC4ycyBlYXNlLW91dDsKfQouYW5pbWF0ZS1wdWxzZS1nbG93IHsKICBhbmltYXRpb246IHB1bHNlLWdsb3cgMnMgaW5maW5pdGU7Cn0KLmFuaW1hdGUtc3BpbiB7CiAgYW5pbWF0aW9uOiBzcGluIDFzIGxpbmVhciBpbmZpbml0ZTsKfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\index.css' -B $b
# frontend/commander-ai-lab-ui/src/main.tsx (230 bytes)
$b = 'aW1wb3J0IHsgU3RyaWN0TW9kZSB9IGZyb20gJ3JlYWN0JwppbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCcKaW1wb3J0ICcuL2luZGV4LmNzcycKaW1wb3J0IEFwcCBmcm9tICcuL0FwcC50c3gnCgpjcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290JykhKS5yZW5kZXIoCiAgPFN0cmljdE1vZGU+CiAgICA8QXBwIC8+CiAgPC9TdHJpY3RNb2RlPiwKKQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\main.tsx' -B $b
# frontend/commander-ai-lab-ui/src/pages/AutoGenPage.tsx (21,555 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnCmltcG9ydCB7CiAgU2VhcmNoLCBXYW5kMiwgU2F2ZSwgQWxlcnRDaXJjbGUsCiAgQ2hldnJvbkRvd24sIFNwYXJrbGVzLCBSZWZyZXNoQ3csIENoZWNrCn0gZnJvbSAnbHVjaWRlLXJlYWN0JwppbXBvcnQgeyBTcGlubmVyLCBTdGF0dXNCYWRnZSwgTWFuYVN5bWJvbHMsIENhcmRJbWFnZSwgQ29sb3JEb3RzIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21tb24nCmltcG9ydCB7IGRlY2tnZW5BcGkgfSBmcm9tICcuLi9hcGknCmltcG9ydCB0eXBlIHsgRGVja0dlblYzU3RhdHVzLCBEZWNrR2VuVjNSZXN1bHQsIERlY2tHZW5WM0NhcmQsIENvbW1hbmRlclNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL3R5cGVzJwppbXBvcnQgeyBCYXJDaGFydCwgQmFyLCBYQXhpcywgWUF4aXMsIFRvb2x0aXAsIFJlc3BvbnNpdmVDb250YWluZXIsIENlbGwgfSBmcm9tICdyZWNoYXJ0cycKCi8vIOKUgOKUgCBDb21tYW5kZXIgU2VhcmNoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBDb21tYW5kZXJTZWFyY2goeyBvblNlbGVjdCB9OiB7IG9uU2VsZWN0OiAoYzogQ29tbWFuZGVyU2VhcmNoUmVzdWx0KSA9PiB2b2lkIH0pIHsKICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IHVzZVN0YXRlKCcnKQogIGNvbnN0IFtyZXN1bHRzLCBzZXRSZXN1bHRzXSA9IHVzZVN0YXRlPENvbW1hbmRlclNlYXJjaFJlc3VsdFtdPihbXSkKICBjb25zdCBbc2VhcmNoaW5nLCBzZXRTZWFyY2hpbmddID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgZGVib3VuY2VSZWYgPSB1c2VSZWY8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+KHVuZGVmaW5lZCkKCiAgZnVuY3Rpb24gaGFuZGxlU2VhcmNoKHE6IHN0cmluZykgewogICAgc2V0UXVlcnkocSkKICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVJlZi5jdXJyZW50KQogICAgaWYgKHEubGVuZ3RoIDwgMikgeyBzZXRSZXN1bHRzKFtdKTsgcmV0dXJuIH0KICAgIGRlYm91bmNlUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHsKICAgICAgc2V0U2VhcmNoaW5nKHRydWUpCiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgciA9IGF3YWl0IGRlY2tnZW5BcGkuc2VhcmNoQ29tbWFuZGVycyhxKQogICAgICAgIHNldFJlc3VsdHMocikKICAgICAgfSBjYXRjaCB7IHNldFJlc3VsdHMoW10pIH0KICAgICAgc2V0U2VhcmNoaW5nKGZhbHNlKQogICAgfSwgMzAwKQogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJyZWxhdGl2ZSI+CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJyZWxhdGl2ZSI+CiAgICAgICAgPFNlYXJjaCBjbGFzc05hbWU9ImFic29sdXRlIGxlZnQtMyB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdy00IGgtNCB0ZXh0LXRleHQtdGVydGlhcnkiIC8+CiAgICAgICAgPGlucHV0CiAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgcGxhY2Vob2xkZXI9IlNlYXJjaCBmb3IgYSBjb21tYW5kZXIuLi4iCiAgICAgICAgICB2YWx1ZT17cXVlcnl9CiAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBoYW5kbGVTZWFyY2goZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcGwtMTAgcHItNCBweS0zIGJnLWJnLXNlY29uZGFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBwbGFjZWhvbGRlcjp0ZXh0LXRleHQtdGVydGlhcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hY2NlbnQtYmx1ZS8zMCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAvPgogICAgICAgIHtzZWFyY2hpbmcgJiYgPFNwaW5uZXIgc2l6ZT0ic20iIGNsYXNzTmFtZT0iYWJzb2x1dGUgcmlnaHQtMyB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC1hY2NlbnQtYmx1ZSIgLz59CiAgICAgIDwvZGl2PgogICAgICB7cmVzdWx0cy5sZW5ndGggPiAwICYmICgKICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYWJzb2x1dGUgei0yMCB0b3AtZnVsbCBtdC0xIHctZnVsbCBiZy1iZy1lbGV2YXRlZCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQteGwgc2hhZG93LWxnIG1heC1oLTgw' +
'IG92ZXJmbG93LXktYXV0byI+CiAgICAgICAgICB7cmVzdWx0cy5tYXAoYyA9PiAoCiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBrZXk9e2Muc2NyeWZhbGxfaWR9CiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4geyBvblNlbGVjdChjKTsgc2V0UXVlcnkoYy5uYW1lKTsgc2V0UmVzdWx0cyhbXSkgfX0KICAgICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyBweC00IHB5LTMgaG92ZXI6YmctYmctaG92ZXIgdGV4dC1sZWZ0IHRyYW5zaXRpb24tY29sb3JzIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPENhcmRJbWFnZSBzcmM9e2MuaW1hZ2VfdXJsfSBhbHQ9e2MubmFtZX0gc2l6ZT0ic20iIC8+CiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXgtMSBtaW4tdy0wIj4KICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXRleHQtcHJpbWFyeSB0cnVuY2F0ZSI+e2MubmFtZX08L3A+CiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXNlY29uZGFyeSB0cnVuY2F0ZSI+e2MudHlwZV9saW5lfTwvcD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8Q29sb3JEb3RzIGNvbG9ycz17Yy5jb2xvcl9pZGVudGl0eX0gLz4KICAgICAgICAgICAgICB7Yy5pbl9jb2xsZWN0aW9uICYmICgKICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1bMTBweF0gcHgtMS41IHB5LTAuNSBiZy1hY2NlbnQtZ3JlZW4vMTUgdGV4dC1hY2NlbnQtZ3JlZW4gcm91bmRlZCI+T3duZWQ8L3NwYW4+CiAgICAgICAgICAgICAgKX0KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICApKX0KICAgICAgICA8L2Rpdj4KICAgICAgKX0KICAgIDwvZGl2PgogICkKfQoKLy8g4pSA4pSAIEdlbmVyYXRlZCBEZWNrIFZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIEdlbmVyYXRlZERlY2tWaWV3KHsgcmVzdWx0LCBvbkNvbW1pdCB9OiB7IHJlc3VsdDogRGVja0dlblYzUmVzdWx0OyBvbkNvbW1pdDogKCkgPT4gdm9pZCB9KSB7CiAgY29uc3QgW3ZpZXcsIHNldFZpZXddID0gdXNlU3RhdGU8J3Zpc3VhbCcgfCAnbGlzdCc+KCd2aXN1YWwnKQogIGNvbnN0IFtjb21taXR0aW5nLCBzZXRDb21taXR0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtzZWxlY3RlZENhcmQsIHNldFNlbGVjdGVkQ2FyZF0gPSB1c2VTdGF0ZTxEZWNrR2VuVjNDYXJkIHwgbnVsbD4obnVsbCkKCiAgLy8gR3JvdXAgYnkgY2F0ZWdvcnkKICBjb25zdCBncm91cGVkID0gcmVzdWx0LmNhcmRzLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBEZWNrR2VuVjNDYXJkW10+PigoYWNjLCBjKSA9PiB7CiAgICBjb25zdCBjYXQgPSBjLmNhdGVnb3J5IHx8ICdPdGhlcicKICAgIGlmICghYWNjW2NhdF0pIGFjY1tjYXRdID0gW10KICAgIGFjY1tjYXRdLnB1c2goYykKICAgIHJldHVybiBhY2MKICB9LCB7fSkKCiAgY29uc3QgY3VydmVEYXRhID0gT2JqZWN0LmVudHJpZXMocmVzdWx0LnN0YXRzLm1hbmFfY3VydmUpCiAgICAubWFwKChbY21jLCBjb3VudF0pID0+ICh7IGNtYzogY21jID09PSAnNycgPyAnNysnIDogY21jLCBjb3VudCB9KSkKICAgIC5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYS5jbWMpIC0gTnVtYmVyKGIuY21jKSkKCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ29tbWl0KCkgewogICAgc2V0Q29tbWl0dGluZyh0cnVlKQogICAgdHJ5IHsgb25Db21taXQoKSB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldENvbW1pdHRpbmcoZmFsc2UpCiAgfQoKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9InNwYWNlLXktNSBhbmltYXRlLWZhZGUtaW4iPgogICAgICB7LyogQ29tbWFuZGVyIGhlYWRlciAqL30KICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZ2FwLTUgYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTUiPgogICAgICAgIDxDYXJkSW1hZ2Ugc3JjPXtyZXN1bHQuY29tbWFuZGVyLmltYWdlX3VybH0gYWx0PXtyZXN1bHQuY29tbWFuZGVyLm5hbWV9IHNpemU9ImxnIiAvPgogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4LTEgc3BhY2UteS0zIj4KICAgICAgICAgIDxk' +
'aXY+CiAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9InRleHQteGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5Ij57cmVzdWx0LmNvbW1hbmRlci5uYW1lfTwvaDI+CiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij57cmVzdWx0LmNvbW1hbmRlci50eXBlX2xpbmV9PC9wPgogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgbXQtMiI+CiAgICAgICAgICAgICAgPE1hbmFTeW1ib2xzIGNvc3Q9e3Jlc3VsdC5jb21tYW5kZXIubWFuYV9jb3N0fSBzaXplPSJtZCIgLz4KICAgICAgICAgICAgICA8Q29sb3JEb3RzIGNvbG9ycz17cmVzdWx0LmNvbW1hbmRlci5jb2xvcl9pZGVudGl0eX0gc2l6ZT0ibWQiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgd2hpdGVzcGFjZS1wcmUtd3JhcCI+e3Jlc3VsdC5jb21tYW5kZXIub3JhY2xlX3RleHR9PC9wPgogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC00IHRleHQteHMgdGV4dC10ZXh0LXNlY29uZGFyeSI+CiAgICAgICAgICAgIDxzcGFuPlN0cmF0ZWd5OiA8c3BhbiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUgZm9udC1tZWRpdW0iPntyZXN1bHQuc3RyYXRlZ3l9PC9zcGFuPjwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4+QnJhY2tldDogPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LWFjY2VudC1hbWJlciBmb250LW1lZGl1bSI+e3Jlc3VsdC5icmFja2V0fTwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgIDxzcGFuPk1vZGVsOiA8c3BhbiBjbGFzc05hbWU9InRleHQtYWNjZW50LXB1cnBsZSBmb250LW1lZGl1bSI+e3Jlc3VsdC5tb2RlbH08L3NwYW4+PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICB7cmVzdWx0LnN1YnN0aXR1dGlvbiAmJiAoCiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyB0ZXh0LXhzIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtYWNjZW50LWdyZWVuIj57cmVzdWx0LnN1YnN0aXR1dGlvbi5vd25lZH0gb3duZWQ8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LWFjY2VudC1hbWJlciI+e3Jlc3VsdC5zdWJzdGl0dXRpb24uc3Vic3RpdHV0ZWR9IHN1YnN0aXR1dGVkPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1hY2NlbnQtcmVkIj57cmVzdWx0LnN1YnN0aXR1dGlvbi5taXNzaW5nfSBtaXNzaW5nPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICl9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgey8qIEFjdGlvbnMgKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyI+CiAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtoYW5kbGVDb21taXR9IGRpc2FibGVkPXtjb21taXR0aW5nfQogICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC00IHB5LTIuNSBiZy1hY2NlbnQtZ3JlZW4vMTUgdGV4dC1hY2NlbnQtZ3JlZW4gdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLWxnIGhvdmVyOmJnLWFjY2VudC1ncmVlbi8yNSBib3JkZXIgYm9yZGVyLWFjY2VudC1ncmVlbi8zMCB0cmFuc2l0aW9uLWNvbG9ycyBkaXNhYmxlZDpvcGFjaXR5LTUwIj4KICAgICAgICAgIHtjb21taXR0aW5nID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogPFNhdmUgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPn0KICAgICAgICAgIFNhdmUgdG8gRGVja3MKICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTAuNSI+CiAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldFZpZXcoJ3Zpc3VhbCcpfQogICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQtbWQgdHJhbnNpdGlvbi1jb2xvcnMgJHt2aWV3ID09PSAndmlzdWFsJyA/ICdiZy1iZy1ob3ZlciB0ZXh0LXRleHQtcHJpbWFyeScgOiAndGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnknfWB9PgogICAgICAgICAgICBWaXN1YWwKICAgICAg' +
'ICAgIDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3KCdsaXN0Jyl9CiAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZC1tZCB0cmFuc2l0aW9uLWNvbG9ycyAke3ZpZXcgPT09ICdsaXN0JyA/ICdiZy1iZy1ob3ZlciB0ZXh0LXRleHQtcHJpbWFyeScgOiAndGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnknfWB9PgogICAgICAgICAgICBMaXN0CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICB7LyogU3RhdHMgc3VtbWFyeSAqL30KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIiAvPgogICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkiPntyZXN1bHQuc3RhdHMuY2FyZF9jb3VudH0gY2FyZHM8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtYWNjZW50LXRlYWwgZm9udC1tZWRpdW0iPiR7cmVzdWx0LnN0YXRzLnRvdGFsX3ByaWNlLnRvRml4ZWQoMil9PC9zcGFuPgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBNYW5hIGN1cnZlIG1pbmkgKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHAtNCI+CiAgICAgICAgPGg0IGNsYXNzTmFtZT0idGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIgbWItMiI+TWFuYSBDdXJ2ZTwvaDQ+CiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImgtMjgiPgogICAgICAgICAgPFJlc3BvbnNpdmVDb250YWluZXIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+CiAgICAgICAgICAgIDxCYXJDaGFydCBkYXRhPXtjdXJ2ZURhdGF9IGJhclNpemU9ezIwfT4KICAgICAgICAgICAgICA8WEF4aXMgZGF0YUtleT0iY21jIiBheGlzTGluZT17ZmFsc2V9IHRpY2tMaW5lPXtmYWxzZX0gdGljaz17eyBmaWxsOiAnIzZiNzE5MCcsIGZvbnRTaXplOiAxMCB9fSAvPgogICAgICAgICAgICAgIDxZQXhpcyBoaWRlIC8+CiAgICAgICAgICAgICAgPFRvb2x0aXAgY29udGVudFN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyMxYzIwMzAnLCBib3JkZXI6ICcxcHggc29saWQgIzJhMmY0MicsIGJvcmRlclJhZGl1czogOCwgZm9udFNpemU6IDExIH19IC8+CiAgICAgICAgICAgICAgPEJhciBkYXRhS2V5PSJjb3VudCIgcmFkaXVzPXtbMywgMywgMCwgMF19PgogICAgICAgICAgICAgICAge2N1cnZlRGF0YS5tYXAoKF8sIGkpID0+IDxDZWxsIGtleT17aX0gZmlsbD0iIzRmNmVmNyIgZmlsbE9wYWNpdHk9ezAuOH0gLz4pfQogICAgICAgICAgICAgIDwvQmFyPgogICAgICAgICAgICA8L0JhckNoYXJ0PgogICAgICAgICAgPC9SZXNwb25zaXZlQ29udGFpbmVyPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBDYXJkIGdyaWQvbGlzdCAqL30KICAgICAge3ZpZXcgPT09ICd2aXN1YWwnID8gKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJzcGFjZS15LTUiPgogICAgICAgICAge09iamVjdC5lbnRyaWVzKGdyb3VwZWQpLm1hcCgoW2NhdCwgY2FyZHNdKSA9PiAoCiAgICAgICAgICAgIDxkaXYga2V5PXtjYXR9PgogICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9InRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIG1iLTMiPntjYXR9ICh7Y2FyZHMubGVuZ3RofSk8L2g0PgogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0zIHNtOmdyaWQtY29scy00IG1kOmdyaWQtY29scy01IGxnOmdyaWQtY29scy02IHhsOmdyaWQtY29scy04IGdhcC0yIj4KICAgICAgICAgICAgICAgIHtjYXJkcy5tYXAoY2FyZCA9PiAoCiAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtjYXJkLm5hbWV9IGNsYXNzTmFtZT0iZ3JvdXAgY3Vyc29yLXBvaW50ZXIgcmVsYXRpdmUiIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkQ2FyZChjYXJkKX0+CiAgICAgICAgICAgICAgICAgICAgPENhcmRJbWFnZSBzcmM9e2NhcmQuaW1hZ2VfdXJsfSBhbHQ9e2NhcmQubmFtZX0gc2l6ZT0ibWQiIGNsYXNzTmFtZT0idy1mdWxsIGgtYXV0byBhc3BlY3QtWzUvN10iIC8+CiAgICAgICAgICAgICAgICAgICAge2NhcmQuaXNfc3Vic3RpdHV0ZSAmJiAoCiAgICAgICAgICAgICAgICAg' +
'ICAgICA8ZGl2IGNsYXNzTmFtZT0iYWJzb2x1dGUgdG9wLTEgcmlnaHQtMSB3LTQgaC00IGJnLWFjY2VudC1hbWJlciByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8UmVmcmVzaEN3IGNsYXNzTmFtZT0idy0yLjUgaC0yLjUgdGV4dC1iZy1wcmltYXJ5IiAvPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgKX0KICAgICAgICAgICAgICAgICAgICB7Y2FyZC5vd25lZCAmJiAoCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYWJzb2x1dGUgdG9wLTEgbGVmdC0xIHctNCBoLTQgYmctYWNjZW50LWdyZWVuIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxDaGVjayBjbGFzc05hbWU9InctMi41IGgtMi41IHRleHQtYmctcHJpbWFyeSIgLz4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgKSl9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgKSl9CiAgICAgICAgPC9kaXY+CiAgICAgICkgOiAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgb3ZlcmZsb3ctaGlkZGVuIj4KICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9InctZnVsbCB0ZXh0LXNtIj4KICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9ImJvcmRlci1iIGJvcmRlci1ib3JkZXItcHJpbWFyeSB0ZXh0LWxlZnQiPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtNCBweS0zIHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGZvbnQtbWVkaXVtIHVwcGVyY2FzZSB0cmFja2luZy13aWRlciI+Q2FyZDwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPSJweC00IHB5LTMgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5DYXRlZ29yeTwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPSJweC00IHB5LTMgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5Sb2xlPC90aD4KICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTQgcHktMyB0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPk1hbmE8L3RoPgogICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtNCBweS0zIHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGZvbnQtbWVkaXVtIHVwcGVyY2FzZSB0cmFja2luZy13aWRlciB0ZXh0LXJpZ2h0Ij5QcmljZTwvdGg+CiAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPSJweC00IHB5LTMgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5TdGF0dXM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keSBjbGFzc05hbWU9ImRpdmlkZS15IGRpdmlkZS1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgICAgICAge3Jlc3VsdC5jYXJkcy5tYXAoY2FyZCA9PiAoCiAgICAgICAgICAgICAgICA8dHIga2V5PXtjYXJkLm5hbWV9IGNsYXNzTmFtZT0iaG92ZXI6YmctYmctaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJmb250LW1lZGl1bSB0ZXh0LXRleHQtcHJpbWFyeSI+e2NhcmQucXVhbnRpdHl9eCB7Y2FyZC5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICB7Y2FyZC5pc19zdWJzdGl0dXRlICYmICgKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ibWwtMiB0ZXh0LVsxMHB4XSB0ZXh0LWFjY2VudC1hbWJlciI+c3ViIGZvciB7Y2FyZC5vcmlnaW5hbF9uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICApfQogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSB0ZXh0' +
'LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkiPntjYXJkLmNhdGVnb3J5fTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9InB4LTQgcHktMi41IHRleHQteHMgdGV4dC10ZXh0LXNlY29uZGFyeSI+e2NhcmQucm9sZX08L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSI+PE1hbmFTeW1ib2xzIGNvc3Q9e2NhcmQubWFuYV9jb3N0fSAvPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9InB4LTQgcHktMi41IHRleHQtcmlnaHQgdGV4dC1hY2NlbnQtdGVhbCB0ZXh0LXhzIj57Y2FyZC50Y2dfcHJpY2UgIT0gbnVsbCA/IGAkJHtjYXJkLnRjZ19wcmljZS50b0ZpeGVkKDIpfWAgOiAn4oCUJ308L3RkPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgdGV4dC1bMTBweF0gcHgtMiBweS0wLjUgcm91bmRlZCAke2NhcmQub3duZWQgPyAnYmctYWNjZW50LWdyZWVuLzE1IHRleHQtYWNjZW50LWdyZWVuJyA6ICdiZy1iZy10ZXJ0aWFyeSB0ZXh0LXRleHQtdGVydGlhcnknfWB9PgogICAgICAgICAgICAgICAgICAgICAge2NhcmQub3duZWQgPyBgT3duZWQgKCR7Y2FyZC5vd25lZF9xdHl9KWAgOiAnTWlzc2luZyd9CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgICl9CgogICAgICB7LyogQ2FyZCBkZXRhaWwgcG9wdXAgKi99CiAgICAgIHtzZWxlY3RlZENhcmQgJiYgKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmaXhlZCBpbnNldC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmxhY2svNzAgYmFja2Ryb3AtYmx1ci1zbSIgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRDYXJkKG51bGwpfT4KICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHNoYWRvdy1sZyBtYXgtdy0yeGwgdy1mdWxsIG14LTQgcC02IGFuaW1hdGUtZmFkZS1pbiIgb25DbGljaz17ZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpfT4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZ2FwLTUiPgogICAgICAgICAgICAgIDxDYXJkSW1hZ2Ugc3JjPXtzZWxlY3RlZENhcmQuaW1hZ2VfdXJsfSBhbHQ9e3NlbGVjdGVkQ2FyZC5uYW1lfSBzaXplPSJsZyIgLz4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIHNwYWNlLXktMyI+CiAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSI+e3NlbGVjdGVkQ2FyZC5uYW1lfTwvaDM+CiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeSI+e3NlbGVjdGVkQ2FyZC50eXBlX2xpbmV9PC9wPgogICAgICAgICAgICAgICAgPE1hbmFTeW1ib2xzIGNvc3Q9e3NlbGVjdGVkQ2FyZC5tYW5hX2Nvc3R9IHNpemU9Im1kIiAvPgogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IHdoaXRlc3BhY2UtcHJlLXdyYXAiPntzZWxlY3RlZENhcmQucmVhc29ufTwvcD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyB0ZXh0LXhzIj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXRleHQtdGVydGlhcnkiPlJvbGU6IDxzcGFuIGNsYXNzTmFtZT0idGV4dC1hY2NlbnQtYmx1ZSI+e3NlbGVjdGVkQ2FyZC5yb2xlfTwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAgICAgIHtzZWxlY3RlZENhcmQuaXNfc3Vic3RpdHV0ZSAmJiAoCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LWFjY2VudC1hbWJlciI+U3Vic3RpdHV0ZWQgZm9yIHtzZWxlY3RlZENhcmQub3JpZ2luYWxfbmFtZX0gKHsoc2VsZWN0ZWRDYXJkLnNpbWlsYXJpdHlfc2NvcmUgPz8gMCAqIDEwMCkudG9GaXhlZCgwKX0lKTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgKX0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2' +
'PgogICAgICAgIDwvZGl2PgogICAgICApfQogICAgPC9kaXY+CiAgKQp9CgovLyDilIDilIAgTWFpbiBBdXRvIEdlbiBQYWdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgZnVuY3Rpb24gQXV0b0dlblBhZ2UoKSB7CiAgY29uc3QgW3N0YXR1cywgc2V0U3RhdHVzXSA9IHVzZVN0YXRlPERlY2tHZW5WM1N0YXR1cyB8IG51bGw+KG51bGwpCiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSkKICBjb25zdCBbZ2VuZXJhdGluZywgc2V0R2VuZXJhdGluZ10gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbcmVzdWx0LCBzZXRSZXN1bHRdID0gdXNlU3RhdGU8RGVja0dlblYzUmVzdWx0IHwgbnVsbD4obnVsbCkKICBjb25zdCBbY29tbWFuZGVyLCBzZXRDb21tYW5kZXJdID0gdXNlU3RhdGU8Q29tbWFuZGVyU2VhcmNoUmVzdWx0IHwgbnVsbD4obnVsbCkKICBjb25zdCBbc3RyYXRlZ3ksIHNldFN0cmF0ZWd5XSA9IHVzZVN0YXRlKCcnKQogIGNvbnN0IFticmFja2V0LCBzZXRCcmFja2V0XSA9IHVzZVN0YXRlKDMpCiAgY29uc3QgW2J1ZGdldCwgc2V0QnVkZ2V0XSA9IHVzZVN0YXRlPHN0cmluZz4oJycpCiAgY29uc3QgW3VzZUNvbGxlY3Rpb24sIHNldFVzZUNvbGxlY3Rpb25dID0gdXNlU3RhdGUodHJ1ZSkKICBjb25zdCBbcnVuU3ViLCBzZXRSdW5TdWJdID0gdXNlU3RhdGUodHJ1ZSkKICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpCgogIHVzZUVmZmVjdCgoKSA9PiB7CiAgICBkZWNrZ2VuQXBpLmdldFYzU3RhdHVzKCkudGhlbihzID0+IHsgc2V0U3RhdHVzKHMpOyBzZXRMb2FkaW5nKGZhbHNlKSB9KS5jYXRjaCgoKSA9PiBzZXRMb2FkaW5nKGZhbHNlKSkKICB9LCBbXSkKCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlR2VuZXJhdGUoKSB7CiAgICBpZiAoIWNvbW1hbmRlcikgcmV0dXJuCiAgICBzZXRHZW5lcmF0aW5nKHRydWUpCiAgICBzZXRFcnJvcihudWxsKQogICAgc2V0UmVzdWx0KG51bGwpCiAgICB0cnkgewogICAgICBjb25zdCByZXMgPSBhd2FpdCBkZWNrZ2VuQXBpLmdlbmVyYXRlRGVja1YzKHsKICAgICAgICBjb21tYW5kZXJfbmFtZTogY29tbWFuZGVyLm5hbWUsCiAgICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWd5IHx8IHVuZGVmaW5lZCwKICAgICAgICB0YXJnZXRfYnJhY2tldDogYnJhY2tldCwKICAgICAgICBidWRnZXRfdXNkOiBidWRnZXQgPyBOdW1iZXIoYnVkZ2V0KSA6IHVuZGVmaW5lZCwKICAgICAgICB1c2VfY29sbGVjdGlvbjogdXNlQ29sbGVjdGlvbiwKICAgICAgICBydW5fc3Vic3RpdHV0aW9uOiBydW5TdWIsCiAgICAgIH0pCiAgICAgIHNldFJlc3VsdChyZXMpCiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNldEVycm9yKGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6ICdHZW5lcmF0aW9uIGZhaWxlZCcpCiAgICB9CiAgICBzZXRHZW5lcmF0aW5nKGZhbHNlKQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ29tbWl0KCkgewogICAgaWYgKCFjb21tYW5kZXIgfHwgIXJlc3VsdCkgcmV0dXJuCiAgICB0cnkgewogICAgICBhd2FpdCBkZWNrZ2VuQXBpLmNvbW1pdERlY2tWMyh7CiAgICAgICAgY29tbWFuZGVyX25hbWU6IGNvbW1hbmRlci5uYW1lLAogICAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSB8fCB1bmRlZmluZWQsCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ6IGJyYWNrZXQsCiAgICAgICAgYnVkZ2V0X3VzZDogYnVkZ2V0ID8gTnVtYmVyKGJ1ZGdldCkgOiB1bmRlZmluZWQsCiAgICAgICAgdXNlX2NvbGxlY3Rpb246IHVzZUNvbGxlY3Rpb24sCiAgICAgICAgcnVuX3N1YnN0aXR1dGlvbjogcnVuU3ViLAogICAgICB9KQogICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgfQoKICBpZiAobG9hZGluZykgewogICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPSJwLTYgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC02NCI+PFNwaW5uZXIgc2l6ZT0ibGciIGNsYXNzTmFtZT0idGV4dC1hY2NlbnQtYmx1ZSIgLz48L2Rpdj4KICB9CgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0icC02IHNwYWNlLXktNSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgxIGNsYXNzTmFtZT0idGV4dC0yeGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZs' +
'ZXggaXRlbXMtY2VudGVyIGdhcC0zIj4KICAgICAgICAgIDxTcGFya2xlcyBjbGFzc05hbWU9InctNiBoLTYgdGV4dC1hY2NlbnQtcHVycGxlIiAvPgogICAgICAgICAgQXV0byBHZW4gVjMKICAgICAgICA8L2gxPgogICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5IG10LTAuNSI+QUktcG93ZXJlZCBkZWNrIGdlbmVyYXRpb24gd2l0aCBQZXJwbGV4aXR5PC9wPgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBTdGF0dXMgYmFyICovfQogICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMiPgogICAgICAgIDxTdGF0dXNCYWRnZQogICAgICAgICAgdmFyaWFudD17c3RhdHVzPy5pbml0aWFsaXplZCA/ICdzdWNjZXNzJyA6ICdlcnJvcid9CiAgICAgICAgICBsYWJlbD17c3RhdHVzPy5pbml0aWFsaXplZCA/ICdSZWFkeScgOiAnTm90IEluaXRpYWxpemVkJ30KICAgICAgICAvPgogICAgICAgIDxTdGF0dXNCYWRnZQogICAgICAgICAgdmFyaWFudD17c3RhdHVzPy5wcGx4X2NvbmZpZ3VyZWQgPyAnc3VjY2VzcycgOiAnd2FybmluZyd9CiAgICAgICAgICBsYWJlbD17c3RhdHVzPy5wcGx4X2NvbmZpZ3VyZWQgPyAnUGVycGxleGl0eSBDb25uZWN0ZWQnIDogJ1BlcnBsZXhpdHkgTm90IFNldCd9CiAgICAgICAgLz4KICAgICAgICB7c3RhdHVzPy5lbWJlZGRpbmdzX2xvYWRlZCAmJiAoCiAgICAgICAgICA8U3RhdHVzQmFkZ2UgdmFyaWFudD0iaW5mbyIgbGFiZWw9e2Ake3N0YXR1cy5lbWJlZGRpbmdfY2FyZHMudG9Mb2NhbGVTdHJpbmcoKX0gZW1iZWRkaW5nc2B9IC8+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CgogICAgICB7IXJlc3VsdCA/ICgKICAgICAgICAvKiBDb25maWcgZm9ybSAqLwogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJtYXgtdy0yeGwgc3BhY2UteS01Ij4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQtc20gZm9udC1tZWRpdW0gdGV4dC10ZXh0LXByaW1hcnkgYmxvY2sgbWItMiI+Q29tbWFuZGVyPC9sYWJlbD4KICAgICAgICAgICAgPENvbW1hbmRlclNlYXJjaCBvblNlbGVjdD17c2V0Q29tbWFuZGVyfSAvPgogICAgICAgICAgICB7Y29tbWFuZGVyICYmICgKICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibXQtMiBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyBwLTMgYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgICAgICAgICA8Q2FyZEltYWdlIHNyYz17Y29tbWFuZGVyLmltYWdlX3VybH0gYWx0PXtjb21tYW5kZXIubmFtZX0gc2l6ZT0ic20iIC8+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gZm9udC1tZWRpdW0gdGV4dC10ZXh0LXByaW1hcnkiPntjb21tYW5kZXIubmFtZX08L3A+CiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij57Y29tbWFuZGVyLnR5cGVfbGluZX08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxDb2xvckRvdHMgY29sb3JzPXtjb21tYW5kZXIuY29sb3JfaWRlbnRpdHl9IC8+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICl9CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5IGJsb2NrIG1iLTIiPlN0cmF0ZWd5IChvcHRpb25hbCk8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJlLmcuIFZvbHRyb24sIEFyaXN0b2NyYXRzLCBTdG9ybS4uLiIKICAgICAgICAgICAgICB2YWx1ZT17c3RyYXRlZ3l9CiAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0U3RyYXRlZ3koZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTQgcHktMyBiZy1iZy1zZWNvbmRhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgcGxhY2Vob2xkZXI6dGV4dC10ZXh0LXRlcnRpYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwiCiAgICAgICAgICAgIC8+CiAgICAgICAgICA8L2Rpdj4KCiAg' +
'ICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZ3JpZCBncmlkLWNvbHMtMiBnYXAtNCI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXRleHQtcHJpbWFyeSBibG9jayBtYi0yIj5UYXJnZXQgQnJhY2tldDwvbGFiZWw+CiAgICAgICAgICAgICAgPHNlbGVjdAogICAgICAgICAgICAgICAgdmFsdWU9e2JyYWNrZXR9CiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXRCcmFja2V0KE51bWJlcihlLnRhcmdldC52YWx1ZSkpfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtNCBweS0zIGJnLWJnLXNlY29uZGFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ezF9PjEg4oCUIENhc3VhbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT17Mn0+MiDigJQgTG93IFBvd2VyPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPXszfT4zIOKAlCBNaWQgUG93ZXI8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ezR9PjQg4oCUIEhpZ2ggUG93ZXI8L29wdGlvbj4KICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXRleHQtcHJpbWFyeSBibG9jayBtYi0yIj5CdWRnZXQgKFVTRCwgb3B0aW9uYWwpPC9sYWJlbD4KICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJObyBsaW1pdCIKICAgICAgICAgICAgICAgIHZhbHVlPXtidWRnZXR9CiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXRCdWRnZXQoZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtNCBweS0zIGJnLWJnLXNlY29uZGFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBwbGFjZWhvbGRlcjp0ZXh0LXRleHQtdGVydGlhcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAgICAgICAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNiI+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIGN1cnNvci1wb2ludGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9e3VzZUNvbGxlY3Rpb259IG9uQ2hhbmdlPXtlID0+IHNldFVzZUNvbGxlY3Rpb24oZS50YXJnZXQuY2hlY2tlZCl9CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctNCBoLTQgcm91bmRlZCBib3JkZXItYm9yZGVyLXByaW1hcnkgYmctYmctdGVydGlhcnkgdGV4dC1hY2NlbnQtYmx1ZSBmb2N1czpyaW5nLWFjY2VudC1ibHVlLzMwIiAvPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij5Vc2UgY29sbGVjdGlvbiBjYXJkczwvc3Bhbj4KICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgY3Vyc29yLXBvaW50ZXIiPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hlY2tlZD17cnVuU3VifSBvbkNoYW5nZT17ZSA9PiBzZXRSdW5TdWIoZS50YXJnZXQuY2hlY2tlZCl9CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctNCBoLTQgcm91bmRlZCBib3JkZXItYm9yZGVyLXByaW1hcnkgYmctYmctdGVydGlhcnkgdGV4dC1hY2NlbnQtYmx1ZSBmb2N1czpyaW5nLWFjY2VudC1ibHVlLzMwIiAvPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij5SdW4gc3Vic3RpdHV0aW9uIHBhc3M8L3NwYW4+CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICA8L2Rp' +
'dj4KCiAgICAgICAgICB7ZXJyb3IgJiYgKAogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtNCBweS0zIGJnLXN0YXR1cy1lcnJvci8xMCBib3JkZXIgYm9yZGVyLXN0YXR1cy1lcnJvci8zMCByb3VuZGVkLWxnIHRleHQtc20gdGV4dC1zdGF0dXMtZXJyb3IiPgogICAgICAgICAgICAgIDxBbGVydENpcmNsZSBjbGFzc05hbWU9InctNCBoLTQgZmxleC1zaHJpbmstMCIgLz4KICAgICAgICAgICAgICB7ZXJyb3J9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgKX0KCiAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZUdlbmVyYXRlfQogICAgICAgICAgICBkaXNhYmxlZD17IWNvbW1hbmRlciB8fCBnZW5lcmF0aW5nIHx8ICFzdGF0dXM/LmluaXRpYWxpemVkfQogICAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTYgcHktMyBiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHRleHQtc20gZm9udC1zZW1pYm9sZCByb3VuZGVkLWxnIGhvdmVyOmJnLWFjY2VudC1ibHVlLWhvdmVyIHNoYWRvdy1nbG93LWJsdWUgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCBkaXNhYmxlZDpzaGFkb3ctbm9uZSIKICAgICAgICAgID4KICAgICAgICAgICAge2dlbmVyYXRpbmcgPyAoCiAgICAgICAgICAgICAgPD48U3Bpbm5lciBzaXplPSJzbSIgLz4gR2VuZXJhdGluZy4uLjwvPgogICAgICAgICAgICApIDogKAogICAgICAgICAgICAgIDw+PFdhbmQyIGNsYXNzTmFtZT0idy00IGgtNCIgLz4gR2VuZXJhdGUgRGVjazwvPgogICAgICAgICAgICApfQogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICkgOiAoCiAgICAgICAgLyogUmVzdWx0cyAqLwogICAgICAgIDxkaXY+CiAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldFJlc3VsdChudWxsKX0KICAgICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBtYi00IHRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeSBob3Zlcjp0ZXh0LXRleHQtcHJpbWFyeSB0cmFuc2l0aW9uLWNvbG9ycyI+CiAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9InctNCBoLTQgcm90YXRlLTkwIiAvPgogICAgICAgICAgICBCYWNrIHRvIENvbmZpZwogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8R2VuZXJhdGVkRGVja1ZpZXcgcmVzdWx0PXtyZXN1bHR9IG9uQ29tbWl0PXtoYW5kbGVDb21taXR9IC8+CiAgICAgICAgPC9kaXY+CiAgICAgICl9CiAgICA8L2Rpdj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\pages\AutoGenPage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/pages/BatchSimPage.tsx (18,641 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JwppbXBvcnQgewogIEZsYXNrQ29uaWNhbCwgUGxheSwgQ2xvY2ssIFRyb3BoeSwKICBVcGxvYWQsIExpbmssIEZpbGVUZXh0LCBIaXN0b3J5LCBDaGV2cm9uUmlnaHQsIEFsZXJ0Q2lyY2xlLAogIENoZWNrCn0gZnJvbSAnbHVjaWRlLXJlYWN0JwppbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21tb24nCmltcG9ydCB7IGxhYkFwaSB9IGZyb20gJy4uL2FwaScKaW1wb3J0IHsgdXNlUG9sbGluZyB9IGZyb20gJy4uL2hvb2tzL3VzZVBvbGxpbmcnCmltcG9ydCB0eXBlIHsgTGFiRGVjaywgTGFiU3RhdHVzLCBMYWJSZXN1bHQsIExhYkhpc3RvcnlFbnRyeSwgUHJlY29uRGVjayB9IGZyb20gJy4uL3R5cGVzJwppbXBvcnQgeyBCYXJDaGFydCwgQmFyLCBYQXhpcywgWUF4aXMsIFRvb2x0aXAsIFJlc3BvbnNpdmVDb250YWluZXIsIENlbGwgfSBmcm9tICdyZWNoYXJ0cycKCi8vIOKUgOKUgCBSZXN1bHRzIENoYXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBSZXN1bHRzQ2hhcnQoeyByZXN1bHQgfTogeyByZXN1bHQ6IExhYlJlc3VsdCB9KSB7CiAgY29uc3QgZGF0YSA9IHJlc3VsdC5kZWNrcwogICAgLnNvcnQoKGEsIGIpID0+IGIud2luX3JhdGUgLSBhLndpbl9yYXRlKQogICAgLm1hcChkID0+ICh7CiAgICAgIG5hbWU6IGQubmFtZS5sZW5ndGggPiAyMCA/IGQubmFtZS5zbGljZSgwLCAxOCkgKyAnLi4uJyA6IGQubmFtZSwKICAgICAgd2luX3JhdGU6IE1hdGgucm91bmQoZC53aW5fcmF0ZSAqIDEwMCksCiAgICAgIGZ1bGxOYW1lOiBkLm5hbWUsCiAgICB9KSkKCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJoLTY0Ij4KICAgICAgPFJlc3BvbnNpdmVDb250YWluZXIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+CiAgICAgICAgPEJhckNoYXJ0IGRhdGE9e2RhdGF9IGxheW91dD0idmVydGljYWwiIGJhclNpemU9ezIwfSBtYXJnaW49e3sgbGVmdDogMTAsIHJpZ2h0OiAyMCB9fT4KICAgICAgICAgIDxYQXhpcyB0eXBlPSJudW1iZXIiIGRvbWFpbj17WzAsIDEwMF19IHRpY2s9e3sgZmlsbDogJyM2YjcxOTAnLCBmb250U2l6ZTogMTEgfX0gYXhpc0xpbmU9e2ZhbHNlfSB0aWNrTGluZT17ZmFsc2V9IC8+CiAgICAgICAgICA8WUF4aXMgdHlwZT0iY2F0ZWdvcnkiIGRhdGFLZXk9Im5hbWUiIHdpZHRoPXsxNTB9IHRpY2s9e3sgZmlsbDogJyM5YmExYjgnLCBmb250U2l6ZTogMTEgfX0gYXhpc0xpbmU9e2ZhbHNlfSB0aWNrTGluZT17ZmFsc2V9IC8+CiAgICAgICAgICA8VG9vbHRpcAogICAgICAgICAgICBjb250ZW50U3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnIzFjMjAzMCcsIGJvcmRlcjogJzFweCBzb2xpZCAjMmEyZjQyJywgYm9yZGVyUmFkaXVzOiA4LCBmb250U2l6ZTogMTIgfX0KICAgICAgICAgICAgZm9ybWF0dGVyPXsodmFsdWU6IHVua25vd24pID0+IFtgJHt2YWx1ZX0lYCwgJ1dpbiBSYXRlJ119CiAgICAgICAgICAgIGxhYmVsRm9ybWF0dGVyPXsobGFiZWw6IHVua25vd24pID0+IGRhdGEuZmluZChkID0+IGQubmFtZSA9PT0gU3RyaW5nKGxhYmVsKSk/LmZ1bGxOYW1lIHx8IFN0cmluZyhsYWJlbCl9CiAgICAgICAgICAvPgogICAgICAgICAgPEJhciBkYXRhS2V5PSJ3aW5fcmF0ZSIgcmFkaXVzPXtbMCwgNCwgNCwgMF19PgogICAgICAgICAgICB7ZGF0YS5tYXAoKF8sIGkpID0+ICgKICAgICAgICAgICAgICA8Q2VsbCBrZXk9e2l9IGZpbGw9e2kgPT09IDAgPyAnIzRhZGU4MCcgOiBpID09PSAxID8gJyM0ZjZlZjcnIDogJyMzNjNjNTQnfSAvPgogICAgICAgICAgICApKX0KICAgICAgICAgIDwvQmFyPgogICAgICAgIDwvQmFyQ2hhcnQ+CiAgICAgIDwvUmVzcG9uc2l2ZUNvbnRhaW5lcj4KICAgIDwvZGl2PgogICkKfQoKLy8g4pSA4pSAIERlY2sgU2VsZWN0b3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIERlY2tTZWxlY3Rvcih7CiAgZGVja3MsCiAgc2VsZWN0ZWQsCiAgb25Ub2dnbGUsCiAgcHJlY29u' +
'cywKICBvbkluc3RhbGxQcmVjb24sCn06IHsKICBkZWNrczogTGFiRGVja1tdCiAgc2VsZWN0ZWQ6IFNldDxzdHJpbmc+CiAgb25Ub2dnbGU6IChuYW1lOiBzdHJpbmcpID0+IHZvaWQKICBwcmVjb25zOiBQcmVjb25EZWNrW10KICBvbkluc3RhbGxQcmVjb246IChuYW1lOiBzdHJpbmcpID0+IHZvaWQKfSkgewogIGNvbnN0IFtzaG93UHJlY29ucywgc2V0U2hvd1ByZWNvbnNdID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgW2luc3RhbGxpbmcsIHNldEluc3RhbGxpbmddID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCkKCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW5zdGFsbChuYW1lOiBzdHJpbmcpIHsKICAgIHNldEluc3RhbGxpbmcobmFtZSkKICAgIGF3YWl0IG9uSW5zdGFsbFByZWNvbihuYW1lKQogICAgc2V0SW5zdGFsbGluZyhudWxsKQogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJzcGFjZS15LTMiPgogICAgICA8aDMgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPkF2YWlsYWJsZSBEZWNrczwvaDM+CiAgICAgIHtkZWNrcy5sZW5ndGggPT09IDAgPyAoCiAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSI+Tm8gZGVja3MgYXZhaWxhYmxlLiBJbXBvcnQgb3IgaW5zdGFsbCBwcmVjb25zLjwvcD4KICAgICAgKSA6ICgKICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS0xIG1heC1oLTY0IG92ZXJmbG93LXktYXV0byI+CiAgICAgICAgICB7ZGVja3MubWFwKGQgPT4gKAogICAgICAgICAgICA8bGFiZWwga2V5PXtkLm5hbWV9IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0yIHJvdW5kZWQtbGcgaG92ZXI6YmctYmctaG92ZXIgY3Vyc29yLXBvaW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCiAgICAgICAgICAgICAgICBjaGVja2VkPXtzZWxlY3RlZC5oYXMoZC5uYW1lKX0KICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoKSA9PiBvblRvZ2dsZShkLm5hbWUpfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LTQgaC00IHJvdW5kZWQgYm9yZGVyLWJvcmRlci1wcmltYXJ5IGJnLWJnLXRlcnRpYXJ5IHRleHQtYWNjZW50LWJsdWUgZm9jdXM6cmluZy1hY2NlbnQtYmx1ZS8zMCIKICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4LTEgbWluLXctMCI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgdHJ1bmNhdGUgYmxvY2siPntkLm5hbWV9PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LVsxMHB4XSB0ZXh0LXRleHQtdGVydGlhcnkiPntkLnNvdXJjZX0gwrcge2QuY2FyZF9jb3VudH0gY2FyZHM8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICApKX0KICAgICAgICA8L2Rpdj4KICAgICAgKX0KCiAgICAgIDxidXR0b24KICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93UHJlY29ucyghc2hvd1ByZWNvbnMpfQogICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSBiZy1iZy10ZXJ0aWFyeSByb3VuZGVkLWxnIHRleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6YmctYmctaG92ZXIgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSB0cmFuc2l0aW9uLWNvbG9ycyIKICAgICAgPgogICAgICAgIFByZWNvbiBEZWNrcwogICAgICAgIDxDaGV2cm9uUmlnaHQgY2xhc3NOYW1lPXtgdy0zLjUgaC0zLjUgdHJhbnNpdGlvbi10cmFuc2Zvcm0gJHtzaG93UHJlY29ucyA/ICdyb3RhdGUtOTAnIDogJyd9YH0gLz4KICAgICAgPC9idXR0b24+CgogICAgICB7c2hvd1ByZWNvbnMgJiYgKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJzcGFjZS15LTEgbWF4LWgtNDggb3ZlcmZsb3cteS1hdXRvIGFuaW1hdGUtZmFkZS1pbiI+CiAgICAgICAgICB7cHJlY29ucy5tYXAocCA9PiAoCiAgICAgICAgICAgIDxkaXYga2V5PXtwLm5hbWV9IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0yIHJvdW5kZWQtbGcgYmctYmctdGVydGlhcnkiPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0iZmxleC0xIHRleHQteHMg' +
'dGV4dC10ZXh0LXNlY29uZGFyeSB0cnVuY2F0ZSI+e3AubmFtZX08L3NwYW4+CiAgICAgICAgICAgICAge3AuaW5zdGFsbGVkID8gKAogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LVsxMHB4XSB0ZXh0LWFjY2VudC1ncmVlbiBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSI+PENoZWNrIGNsYXNzTmFtZT0idy0zIGgtMyIgLz4gSW5zdGFsbGVkPC9zcGFuPgogICAgICAgICAgICAgICkgOiAoCiAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUluc3RhbGwocC5uYW1lKX0KICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2luc3RhbGxpbmcgPT09IHAubmFtZX0KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ0ZXh0LVsxMHB4XSB0ZXh0LWFjY2VudC1ibHVlIGhvdmVyOnRleHQtYWNjZW50LWJsdWUtaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIHtpbnN0YWxsaW5nID09PSBwLm5hbWUgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiAnSW5zdGFsbCd9CiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICkpfQogICAgICAgIDwvZGl2PgogICAgICApfQogICAgPC9kaXY+CiAgKQp9CgovLyDilIDilIAgSW1wb3J0IFBhbmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBJbXBvcnRQYW5lbCh7IG9uSW1wb3J0ZWQgfTogeyBvbkltcG9ydGVkOiAoKSA9PiB2b2lkIH0pIHsKICBjb25zdCBbaW1wb3J0VXJsLCBzZXRJbXBvcnRVcmxdID0gdXNlU3RhdGUoJycpCiAgY29uc3QgW2ltcG9ydFRleHQsIHNldEltcG9ydFRleHRdID0gdXNlU3RhdGUoJycpCiAgY29uc3QgW2ltcG9ydE5hbWUsIHNldEltcG9ydE5hbWVdID0gdXNlU3RhdGUoJycpCiAgY29uc3QgW2ltcG9ydGluZywgc2V0SW1wb3J0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtpbXBvcnRNb2RlLCBzZXRJbXBvcnRNb2RlXSA9IHVzZVN0YXRlPCd1cmwnIHwgJ3RleHQnPigndXJsJykKCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW1wb3J0KCkgewogICAgc2V0SW1wb3J0aW5nKHRydWUpCiAgICB0cnkgewogICAgICBpZiAoaW1wb3J0TW9kZSA9PT0gJ3VybCcgJiYgaW1wb3J0VXJsLnRyaW0oKSkgewogICAgICAgIGF3YWl0IGxhYkFwaS5pbXBvcnREZWNrRnJvbVVybChpbXBvcnRVcmwudHJpbSgpKQogICAgICB9IGVsc2UgaWYgKGltcG9ydE1vZGUgPT09ICd0ZXh0JyAmJiBpbXBvcnRUZXh0LnRyaW0oKSkgewogICAgICAgIGF3YWl0IGxhYkFwaS5pbXBvcnREZWNrRnJvbVRleHQoaW1wb3J0VGV4dC50cmltKCksIGltcG9ydE5hbWUgfHwgdW5kZWZpbmVkKQogICAgICB9CiAgICAgIHNldEltcG9ydFVybCgnJykKICAgICAgc2V0SW1wb3J0VGV4dCgnJykKICAgICAgc2V0SW1wb3J0TmFtZSgnJykKICAgICAgb25JbXBvcnRlZCgpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldEltcG9ydGluZyhmYWxzZSkKICB9CgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0iYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTQgc3BhY2UteS0zIj4KICAgICAgPGgzIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIj4KICAgICAgICA8VXBsb2FkIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LWFjY2VudC1ibHVlIiAvPgogICAgICAgIEltcG9ydCBEZWNrCiAgICAgIDwvaDM+CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGdhcC0xIj4KICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldEltcG9ydE1vZGUoJ3VybCcpfQogICAgICAgICAgY2xhc3NOYW1lPXtgZmxleC0xIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZC1sZyB0cmFuc2l0aW9uLWNvbG9ycyAke2ltcG9ydE1vZGUgPT09ICd1cmwnID8gJ2JnLWFjY2VudC1ibHVlLzE1IHRleHQtYWNjZW50LWJsdWUnIDogJ2JnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC10ZXJ0aWFyeSd9YH0+CiAgICAgICAgICA8TGluayBjbGFzc05h' +
'bWU9InctMyBoLTMgaW5saW5lIG1yLTEiIC8+VVJMCiAgICAgICAgPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRJbXBvcnRNb2RlKCd0ZXh0Jyl9CiAgICAgICAgICBjbGFzc05hbWU9e2BmbGV4LTEgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkLWxnIHRyYW5zaXRpb24tY29sb3JzICR7aW1wb3J0TW9kZSA9PT0gJ3RleHQnID8gJ2JnLWFjY2VudC1ibHVlLzE1IHRleHQtYWNjZW50LWJsdWUnIDogJ2JnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC10ZXJ0aWFyeSd9YH0+CiAgICAgICAgICA8RmlsZVRleHQgY2xhc3NOYW1lPSJ3LTMgaC0zIGlubGluZSBtci0xIiAvPlRleHQKICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIHtpbXBvcnRNb2RlID09PSAndXJsJyA/ICgKICAgICAgICA8aW5wdXQKICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICBwbGFjZWhvbGRlcj0iTW94ZmllbGQsIEFyY2hpZGVrdCwgb3IgZGVjayBVUkwuLi4iCiAgICAgICAgICB2YWx1ZT17aW1wb3J0VXJsfQogICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0SW1wb3J0VXJsKGUudGFyZ2V0LnZhbHVlKX0KICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBwbGFjZWhvbGRlcjp0ZXh0LXRleHQtdGVydGlhcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAvPgogICAgICApIDogKAogICAgICAgIDw+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkRlY2sgbmFtZSIKICAgICAgICAgICAgdmFsdWU9e2ltcG9ydE5hbWV9CiAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldEltcG9ydE5hbWUoZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgcGxhY2Vob2xkZXI6dGV4dC10ZXh0LXRlcnRpYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwiCiAgICAgICAgICAvPgogICAgICAgICAgPHRleHRhcmVhCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPXsiMXggU29sIFJpbmdcbjF4IENvbW1hbmQgVG93ZXJcbi4uLiJ9CiAgICAgICAgICAgIHZhbHVlPXtpbXBvcnRUZXh0fQogICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXRJbXBvcnRUZXh0KGUudGFyZ2V0LnZhbHVlKX0KICAgICAgICAgICAgcm93cz17NX0KICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IHBsYWNlaG9sZGVyOnRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1vbm8gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCByZXNpemUtbm9uZSIKICAgICAgICAgIC8+CiAgICAgICAgPC8+CiAgICAgICl9CiAgICAgIDxidXR0b24gb25DbGljaz17aGFuZGxlSW1wb3J0fSBkaXNhYmxlZD17aW1wb3J0aW5nfQogICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTQgcHktMiBiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHRleHQtc20gZm9udC1tZWRpdW0gcm91bmRlZC1sZyBob3ZlcjpiZy1hY2NlbnQtYmx1ZS1ob3ZlciB0cmFuc2l0aW9uLWNvbG9ycyBkaXNhYmxlZDpvcGFjaXR5LTUwIj4KICAgICAgICB7aW1wb3J0aW5nID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogJ0ltcG9ydCd9CiAgICAgIDwvYnV0dG9uPgogICAgPC9kaXY+CiAgKQp9CgovLyDilIDilIAgTWFpbiBCYXRjaCBTaW0gUGFnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGZ1bmN0aW9uIEJhdGNoU2ltUGFnZSgpIHsKICBjb25zdCBbZGVja3MsIHNldERlY2tzXSA9IHVzZVN0YXRlPExhYkRlY2tbXT4oW10pCiAgY29u' +
'c3QgW3ByZWNvbnMsIHNldFByZWNvbnNdID0gdXNlU3RhdGU8UHJlY29uRGVja1tdPihbXSkKICBjb25zdCBbc2VsZWN0ZWQsIHNldFNlbGVjdGVkXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpCiAgY29uc3QgW2dhbWVzLCBzZXRHYW1lc10gPSB1c2VTdGF0ZSgxMDApCiAgY29uc3QgW3N0YXR1cywgc2V0U3RhdHVzXSA9IHVzZVN0YXRlPExhYlN0YXR1cyB8IG51bGw+KG51bGwpCiAgY29uc3QgW3Jlc3VsdCwgc2V0UmVzdWx0XSA9IHVzZVN0YXRlPExhYlJlc3VsdCB8IG51bGw+KG51bGwpCiAgY29uc3QgW2hpc3RvcnksIHNldEhpc3RvcnldID0gdXNlU3RhdGU8TGFiSGlzdG9yeUVudHJ5W10+KFtdKQogIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpCiAgY29uc3QgW3N0YXJ0aW5nLCBzZXRTdGFydGluZ10gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpCiAgY29uc3QgW3Nob3dIaXN0b3J5LCBzZXRTaG93SGlzdG9yeV0gPSB1c2VTdGF0ZShmYWxzZSkKCiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEZWNrcygpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IFtkLCBwXSA9IGF3YWl0IFByb21pc2UuYWxsKFtsYWJBcGkuZ2V0TGFiRGVja3MoKSwgbGFiQXBpLmdldFByZWNvbnMoKV0pCiAgICAgIHNldERlY2tzKGQpCiAgICAgIHNldFByZWNvbnMocCkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogICAgc2V0TG9hZGluZyhmYWxzZSkKICB9CgogIHVzZUVmZmVjdCgoKSA9PiB7CiAgICBmZXRjaERlY2tzKCkKICAgIGxhYkFwaS5nZXRMYWJTdGF0dXMoKS50aGVuKHNldFN0YXR1cykuY2F0Y2goKCkgPT4ge30pCiAgICBsYWJBcGkuZ2V0TGFiSGlzdG9yeSgpLnRoZW4oc2V0SGlzdG9yeSkuY2F0Y2goKCkgPT4ge30pCiAgfSwgW10pCgogIC8vIFBvbGwgd2hpbGUgcnVubmluZwogIHVzZVBvbGxpbmcoYXN5bmMgKCkgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgcyA9IGF3YWl0IGxhYkFwaS5nZXRMYWJTdGF0dXMoKQogICAgICBzZXRTdGF0dXMocykKICAgICAgaWYgKCFzLnJ1bm5pbmcgJiYgcy5ydW5faWQpIHsKICAgICAgICBjb25zdCByID0gYXdhaXQgbGFiQXBpLmdldExhYlJlc3VsdCgpCiAgICAgICAgc2V0UmVzdWx0KHIpCiAgICAgICAgbGFiQXBpLmdldExhYkhpc3RvcnkoKS50aGVuKHNldEhpc3RvcnkpLmNhdGNoKCgpID0+IHt9KQogICAgICB9CiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICB9LCAyMDAwLCBzdGF0dXM/LnJ1bm5pbmcgfHwgZmFsc2UpCgogIGZ1bmN0aW9uIHRvZ2dsZURlY2sobmFtZTogc3RyaW5nKSB7CiAgICBzZXRTZWxlY3RlZChwcmV2ID0+IHsKICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldikKICAgICAgaWYgKG5leHQuaGFzKG5hbWUpKSBuZXh0LmRlbGV0ZShuYW1lKQogICAgICBlbHNlIG5leHQuYWRkKG5hbWUpCiAgICAgIHJldHVybiBuZXh0CiAgICB9KQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RhcnQoKSB7CiAgICBpZiAoc2VsZWN0ZWQuc2l6ZSA8IDIpIHsgc2V0RXJyb3IoJ1NlbGVjdCBhdCBsZWFzdCAyIGRlY2tzJyk7IHJldHVybiB9CiAgICBzZXRTdGFydGluZyh0cnVlKQogICAgc2V0RXJyb3IobnVsbCkKICAgIHNldFJlc3VsdChudWxsKQogICAgdHJ5IHsKICAgICAgYXdhaXQgbGFiQXBpLnN0YXJ0QmF0Y2hTaW0oeyBkZWNrczogWy4uLnNlbGVjdGVkXSwgZ2FtZXMgfSkKICAgICAgY29uc3QgcyA9IGF3YWl0IGxhYkFwaS5nZXRMYWJTdGF0dXMoKQogICAgICBzZXRTdGF0dXMocykKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2V0RXJyb3IoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdGFydCcpCiAgICB9CiAgICBzZXRTdGFydGluZyhmYWxzZSkKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluc3RhbGxQcmVjb24obmFtZTogc3RyaW5nKSB7CiAgICB0cnkgewogICAgICBhd2FpdCBsYWJBcGkuaW5zdGFsbFByZWNvbihuYW1lKQogICAgICBmZXRjaERlY2tzKCkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJwLTYgc3BhY2UteS01Ij4KICAgICAgPGRpdj4KICAgICAgICA8aDEgY2xhc3NOYW1lPSJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMiPgogICAgICAgICAg' +
'PEZsYXNrQ29uaWNhbCBjbGFzc05hbWU9InctNiBoLTYgdGV4dC1hY2NlbnQtdGVhbCIgLz4KICAgICAgICAgIEJhdGNoIFNpbXVsYXRvcgogICAgICAgIDwvaDE+CiAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMC41Ij5SdW4gbWFzcyBzaW11bGF0aW9ucyBiZXR3ZWVuIGRlY2tzPC9wPgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGdhcC01Ij4KICAgICAgICB7LyogTGVmdCBzaWRlYmFyOiBkZWNrIHNlbGVjdGlvbiArIGltcG9ydCAqL30KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0idy03MiBmbGV4LXNocmluay0wIHNwYWNlLXktNCI+CiAgICAgICAgICB7bG9hZGluZyA/ICgKICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtMzIiPjxTcGlubmVyIHNpemU9Im1kIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+PC9kaXY+CiAgICAgICAgICApIDogKAogICAgICAgICAgICA8RGVja1NlbGVjdG9yCiAgICAgICAgICAgICAgZGVja3M9e2RlY2tzfQogICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH0KICAgICAgICAgICAgICBvblRvZ2dsZT17dG9nZ2xlRGVja30KICAgICAgICAgICAgICBwcmVjb25zPXtwcmVjb25zfQogICAgICAgICAgICAgIG9uSW5zdGFsbFByZWNvbj17aGFuZGxlSW5zdGFsbFByZWNvbn0KICAgICAgICAgICAgLz4KICAgICAgICAgICl9CiAgICAgICAgICA8SW1wb3J0UGFuZWwgb25JbXBvcnRlZD17ZmV0Y2hEZWNrc30gLz4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgey8qIE1haW4gY29udGVudCAqL30KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIHNwYWNlLXktNSI+CiAgICAgICAgICB7LyogQ29uZmlnICsgU3RhcnQgKi99CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQiPgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkdhbWVzPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgICAgICAgIG1pbj17MTB9CiAgICAgICAgICAgICAgICAgIG1heD17MTAwMDB9CiAgICAgICAgICAgICAgICAgIHN0ZXA9ezEwfQogICAgICAgICAgICAgICAgICB2YWx1ZT17Z2FtZXN9CiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldEdhbWVzKE51bWJlcihlLnRhcmdldC52YWx1ZSkpfQogICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im10LTEgdy0yOCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXgtMSI+CiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij5TZWxlY3RlZDoge3NlbGVjdGVkLnNpemV9IGRlY2tzPC9wPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIHtzdGF0dXM/LnJ1bm5pbmcgPyAoCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIiPgogICAgICAgICAgICAgICAgICAgIDxTcGlubmVyIHNpemU9InNtIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkiPgogICAgICAgICAgICAgICAgICAgICAge3N0YXR1cy5nYW1lc19jb21wbGV0ZWR9IC8ge3N0YXR1cy50b3RhbF9nYW1lc30gZ2FtZXMKICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2' +
'IGNsYXNzTmFtZT0idy00OCBoLTIgYmctYmctdGVydGlhcnkgcm91bmRlZC1mdWxsIG92ZXJmbG93LWhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJoLWZ1bGwgYmctYWNjZW50LWJsdWUgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tYWxsIgogICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6IGAke3N0YXR1cy50b3RhbF9nYW1lcyA/IChzdGF0dXMuZ2FtZXNfY29tcGxldGVkIC8gc3RhdHVzLnRvdGFsX2dhbWVzKSAqIDEwMCA6IDB9JWAgfX0KICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICkgOiAoCiAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVN0YXJ0fSBkaXNhYmxlZD17c3RhcnRpbmcgfHwgc2VsZWN0ZWQuc2l6ZSA8IDJ9CiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtNSBweS0yLjUgYmctYWNjZW50LXRlYWwvMTUgdGV4dC1hY2NlbnQtdGVhbCB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgcm91bmRlZC1sZyBob3ZlcjpiZy1hY2NlbnQtdGVhbC8yNSBib3JkZXIgYm9yZGVyLWFjY2VudC10ZWFsLzMwIHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNTAiPgogICAgICAgICAgICAgICAgICB7c3RhcnRpbmcgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8UGxheSBjbGFzc05hbWU9InctNCBoLTQiIC8+fQogICAgICAgICAgICAgICAgICBTdGFydCBTaW11bGF0aW9uCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICApfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAge2Vycm9yICYmICgKICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibXQtMyBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC00IHB5LTIgYmctc3RhdHVzLWVycm9yLzEwIGJvcmRlciBib3JkZXItc3RhdHVzLWVycm9yLzMwIHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXN0YXR1cy1lcnJvciI+CiAgICAgICAgICAgICAgICA8QWxlcnRDaXJjbGUgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPntlcnJvcn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIHsvKiBSZXN1bHRzICovfQogICAgICAgICAge3Jlc3VsdCAmJiAoCiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHAtNSBzcGFjZS15LTQgYW5pbWF0ZS1mYWRlLWluIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIj4KICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9InRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgICAgIDxUcm9waHkgY2xhc3NOYW1lPSJ3LTQgaC00IHRleHQtYWNjZW50LWFtYmVyIiAvPgogICAgICAgICAgICAgICAgICBSZXN1bHRzCiAgICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSI+e3Jlc3VsdC50b3RhbF9nYW1lc30gZ2FtZXMgwrcge25ldyBEYXRlKHJlc3VsdC50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCl9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxSZXN1bHRzQ2hhcnQgcmVzdWx0PXtyZXN1bHR9IC8+CiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9Im92ZXJmbG93LXgtYXV0byI+CiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPSJ3LWZ1bGwgdGV4dC1zbSI+CiAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3NOYW1lPSJib3JkZXItYiBib3JkZXItYm9yZGVyLXByaW1hcnkiPgogICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtMyBweS0yIHRleHQtbGVmdCB0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkRlY2s8L3RoPgogICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtMyBweS0yIHRleHQtcmlnaHQgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1t' +
'ZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5XaW5zPC90aD4KICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTMgcHktMiB0ZXh0LXJpZ2h0IHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGZvbnQtbWVkaXVtIHVwcGVyY2FzZSB0cmFja2luZy13aWRlciI+R2FtZXM8L3RoPgogICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtMyBweS0yIHRleHQtcmlnaHQgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5XaW4gUmF0ZTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPSJweC0zIHB5LTIgdGV4dC1yaWdodCB0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkF2ZyBUdXJuczwvdGg+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgPHRib2R5IGNsYXNzTmFtZT0iZGl2aWRlLXkgZGl2aWRlLWJvcmRlci1wcmltYXJ5Ij4KICAgICAgICAgICAgICAgICAgICB7cmVzdWx0LmRlY2tzLnNvcnQoKGEsIGIpID0+IGIud2luX3JhdGUgLSBhLndpbl9yYXRlKS5tYXAoKGQsIGkpID0+ICgKICAgICAgICAgICAgICAgICAgICAgIDx0ciBrZXk9e2QubmFtZX0gY2xhc3NOYW1lPSJob3ZlcjpiZy1iZy1ob3ZlciB0cmFuc2l0aW9uLWNvbG9ycyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9InB4LTMgcHktMi41IGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIj4KICAgICAgICAgICAgICAgICAgICAgICAgICB7aSA9PT0gMCAmJiA8VHJvcGh5IGNsYXNzTmFtZT0idy0zLjUgaC0zLjUgdGV4dC1hY2NlbnQtYW1iZXIiIC8+fQogICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0iZm9udC1tZWRpdW0gdGV4dC10ZXh0LXByaW1hcnkiPntkLm5hbWV9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC0zIHB5LTIuNSB0ZXh0LXJpZ2h0IHRleHQtdGV4dC1zZWNvbmRhcnkiPntkLndpbnN9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT0icHgtMyBweS0yLjUgdGV4dC1yaWdodCB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij57ZC5nYW1lc308L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC0zIHB5LTIuNSB0ZXh0LXJpZ2h0IGZvbnQtc2VtaWJvbGQgdGV4dC1hY2NlbnQtYmx1ZSI+eyhkLndpbl9yYXRlICogMTAwKS50b0ZpeGVkKDEpfSU8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC0zIHB5LTIuNSB0ZXh0LXJpZ2h0IHRleHQtdGV4dC1zZWNvbmRhcnkiPntkLmF2Z190dXJucy50b0ZpeGVkKDEpfTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICkpfQogICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICApfQoKICAgICAgICAgIHsvKiBIaXN0b3J5ICovfQogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRTaG93SGlzdG9yeSghc2hvd0hpc3RvcnkpfQogICAgICAgICAgICAgIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5IGhvdmVyOnRleHQtdGV4dC1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzIj4KICAgICAgICAgICAgICA8SGlzdG9yeSBjbGFzc05hbWU9InctNCBoLTQiIC8+CiAgICAgICAgICAgICAgUnVuIEhpc3RvcnkgKHtoaXN0b3J5Lmxlbmd0aH0pCiAgICAgICAgICAgICAgPENoZXZyb25SaWdodCBjbGFzc05hbWU9e2B3LTMuNSBoLTMuNSB0cmFuc2l0aW9uLXRyYW5zZm9ybSAke3Nob3dIaXN0b3J5ID8gJ3JvdGF0ZS05MCcgOiAnJ31gfSAvPgogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAge3Nob3dIaXN0b3J5ICYmIGhpc3RvcnkubGVuZ3RoID4gMCAmJiAoCiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9Im10LTMgc3BhY2UteS0yIGFuaW1hdGUtZmFkZS1pbiI+CiAgICAgICAgICAgICAgICB7aGlzdG9yeS5tYXAoaCA9PiAoCiAgICAgICAg' +
'ICAgICAgICAgIDxkaXYga2V5PXtoLnJ1bl9pZH0gY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBweC00IHB5LTMgYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgICAgICAgICAgICAgPENsb2NrIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LXRleHQtdGVydGlhcnkiIC8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXgtMSI+CiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkiPntoLmRlY2tzLmpvaW4oJyB2cyAnKX08L3A+CiAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij57bmV3IERhdGUoaC50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCl9IMK3IHtoLnRvdGFsX2dhbWVzfSBnYW1lczwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICkKfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\pages\BatchSimPage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/pages/CoachPage.tsx (9,066 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnCmltcG9ydCB7CiAgR3JhZHVhdGlvbkNhcCwgTWVzc2FnZVNxdWFyZSwgRG93bmxvYWQsCiAgQ2hldnJvblJpZ2h0LCBTcGFya2xlcywgQWxlcnRDaXJjbGUsIFgKfSBmcm9tICdsdWNpZGUtcmVhY3QnCmltcG9ydCB7IFNwaW5uZXIsIFN0YXR1c0JhZGdlLCBFbXB0eVN0YXRlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21tb24nCmltcG9ydCB7IGNvYWNoQXBpIH0gZnJvbSAnLi4vYXBpJwppbXBvcnQgdHlwZSB7IENvYWNoU3RhdHVzLCBDb2FjaERlY2ssIENvYWNoU2Vzc2lvbiB9IGZyb20gJy4uL3R5cGVzJwoKLy8g4pSA4pSAIENoYXQgU2Vzc2lvbiBWaWV3IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBDaGF0Vmlldyh7IHNlc3Npb24sIG9uQ2xvc2UgfTogeyBzZXNzaW9uOiBDb2FjaFNlc3Npb247IG9uQ2xvc2U6ICgpID0+IHZvaWQgfSkgewogIGNvbnN0IG1lc3NhZ2VzRW5kUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKQoKICB1c2VFZmZlY3QoKCkgPT4gewogICAgbWVzc2FnZXNFbmRSZWYuY3VycmVudD8uc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcgfSkKICB9LCBbc2Vzc2lvbi5tZXNzYWdlc10pCgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBmbGV4LWNvbCBoLVtjYWxjKDEwMHZoLTE2MHB4KV0iPgogICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTUgcHktMyBib3JkZXItYiBib3JkZXItYm9yZGVyLXByaW1hcnkiPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8aDMgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPntzZXNzaW9uLmRlY2tfbmFtZX08L2gzPgogICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSI+e25ldyBEYXRlKHNlc3Npb24uY3JlYXRlZF9hdCkudG9Mb2NhbGVTdHJpbmcoKX08L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtvbkNsb3NlfSBjbGFzc05hbWU9InAtMSByb3VuZGVkIGhvdmVyOmJnLWJnLWhvdmVyIHRleHQtdGV4dC10ZXJ0aWFyeSI+CiAgICAgICAgICA8WCBjbGFzc05hbWU9InctNCBoLTQiIC8+CiAgICAgICAgPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIG92ZXJmbG93LXktYXV0byBwLTUgc3BhY2UteS00Ij4KICAgICAgICB7c2Vzc2lvbi5tZXNzYWdlcy5tYXAoKG1zZywgaSkgPT4gKAogICAgICAgICAgPGRpdiBrZXk9e2l9IGNsYXNzTmFtZT17YGZsZXggJHttc2cucm9sZSA9PT0gJ3VzZXInID8gJ2p1c3RpZnktZW5kJyA6ICdqdXN0aWZ5LXN0YXJ0J31gfT4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BtYXgtdy1bODAlXSBweC00IHB5LTMgcm91bmRlZC14bCB0ZXh0LXNtIHdoaXRlc3BhY2UtcHJlLXdyYXAgbGVhZGluZy1yZWxheGVkICR7CiAgICAgICAgICAgICAgbXNnLnJvbGUgPT09ICd1c2VyJwogICAgICAgICAgICAgICAgPyAnYmctYWNjZW50LWJsdWUvMTUgdGV4dC10ZXh0LXByaW1hcnkgYm9yZGVyIGJvcmRlci1hY2NlbnQtYmx1ZS8yMCcKICAgICAgICAgICAgICAgIDogJ2JnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC1wcmltYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnknCiAgICAgICAgICAgIH1gfT4KICAgICAgICAgICAgICB7bXNnLmNvbnRlbnR9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgKSl9CiAgICAgICAgPGRpdiByZWY9e21lc3NhZ2VzRW5kUmVmfSAvPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICkKfQoKLy8g4pSA4pSAIE1haW4gQ29hY2ggUGFnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZXhwb3J0IGZ1bmN0aW9uIENvYWNoUGFnZSgpIHsKICBjb25zdCBbc3RhdHVzLCBzZXRTdGF0dXNdID0gdXNlU3RhdGU8Q29hY2hTdGF0dXMgfCBudWxsPihudWxsKQogIGNvbnN0IFtkZWNrcywg' +
'c2V0RGVja3NdID0gdXNlU3RhdGU8Q29hY2hEZWNrW10+KFtdKQogIGNvbnN0IFtzZXNzaW9ucywgc2V0U2Vzc2lvbnNdID0gdXNlU3RhdGU8Q29hY2hTZXNzaW9uW10+KFtdKQogIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpCiAgY29uc3QgW3NlbGVjdGVkU2Vzc2lvbiwgc2V0U2VsZWN0ZWRTZXNzaW9uXSA9IHVzZVN0YXRlPENvYWNoU2Vzc2lvbiB8IG51bGw+KG51bGwpCiAgY29uc3QgW2dlbmVyYXRpbmdSZXBvcnQsIHNldEdlbmVyYXRpbmdSZXBvcnRdID0gdXNlU3RhdGU8bnVtYmVyIHwgbnVsbD4obnVsbCkKICBjb25zdCBbZG93bmxvYWRpbmdFbWJlZGRpbmdzLCBzZXREb3dubG9hZGluZ0VtYmVkZGluZ3NdID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgW3Nob3dTZXNzaW9ucywgc2V0U2hvd1Nlc3Npb25zXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCkKCiAgdXNlRWZmZWN0KCgpID0+IHsKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgW3MsIGQsIHNlc3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgY29hY2hBcGkuZ2V0Q29hY2hTdGF0dXMoKSwKICAgICAgICAgIGNvYWNoQXBpLmdldENvYWNoRGVja3MoKSwKICAgICAgICAgIGNvYWNoQXBpLmdldENvYWNoU2Vzc2lvbnMoKSwKICAgICAgICBdKQogICAgICAgIHNldFN0YXR1cyhzKQogICAgICAgIHNldERlY2tzKGQpCiAgICAgICAgc2V0U2Vzc2lvbnMoc2VzcykKICAgICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgICAgIHNldExvYWRpbmcoZmFsc2UpCiAgICB9CiAgICBsb2FkKCkKICB9LCBbXSkKCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlR2VuZXJhdGVSZXBvcnQoZGVja0lkOiBudW1iZXIpIHsKICAgIHNldEdlbmVyYXRpbmdSZXBvcnQoZGVja0lkKQogICAgc2V0RXJyb3IobnVsbCkKICAgIHRyeSB7CiAgICAgIGF3YWl0IGNvYWNoQXBpLmdlbmVyYXRlUmVwb3J0KGRlY2tJZCkKICAgICAgLy8gUmVmcmVzaCBkZWNrcwogICAgICBjb25zdCBkID0gYXdhaXQgY29hY2hBcGkuZ2V0Q29hY2hEZWNrcygpCiAgICAgIHNldERlY2tzKGQpCiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNldEVycm9yKGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6ICdSZXBvcnQgZ2VuZXJhdGlvbiBmYWlsZWQnKQogICAgfQogICAgc2V0R2VuZXJhdGluZ1JlcG9ydChudWxsKQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRG93bmxvYWRFbWJlZGRpbmdzKCkgewogICAgc2V0RG93bmxvYWRpbmdFbWJlZGRpbmdzKHRydWUpCiAgICB0cnkgewogICAgICBhd2FpdCBjb2FjaEFwaS5kb3dubG9hZEVtYmVkZGluZ3MoKQogICAgICBjb25zdCBzID0gYXdhaXQgY29hY2hBcGkuZ2V0Q29hY2hTdGF0dXMoKQogICAgICBzZXRTdGF0dXMocykKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogICAgc2V0RG93bmxvYWRpbmdFbWJlZGRpbmdzKGZhbHNlKQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gdmlld1Nlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmcpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHMgPSBhd2FpdCBjb2FjaEFwaS5nZXRDb2FjaFNlc3Npb24oc2Vzc2lvbklkKQogICAgICBzZXRTZWxlY3RlZFNlc3Npb24ocykKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgaWYgKGxvYWRpbmcpIHsKICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT0icC02IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtNjQiPjxTcGlubmVyIHNpemU9ImxnIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+PC9kaXY+CiAgfQoKICBpZiAoc2VsZWN0ZWRTZXNzaW9uKSB7CiAgICByZXR1cm4gKAogICAgICA8ZGl2IGNsYXNzTmFtZT0icC02Ij4KICAgICAgICA8Q2hhdFZpZXcgc2Vzc2lvbj17c2VsZWN0ZWRTZXNzaW9ufSBvbkNsb3NlPXsoKSA9PiBzZXRTZWxlY3RlZFNlc3Npb24obnVsbCl9IC8+CiAgICAgIDwvZGl2PgogICAgKQogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJwLTYgc3BhY2UteS01Ij4KICAgICAgPGRpdj4KICAgICAgICA8aDEgY2xhc3NOYW1lPSJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMiPgogICAgICAgICAgPEdyYWR1YXRpb25DYXAgY2xhc3NOYW1lPSJ3LTYgaC02IHRleHQtYWNjZW50LWFt' +
'YmVyIiAvPgogICAgICAgICAgRGVjayBDb2FjaAogICAgICAgIDwvaDE+CiAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMC41Ij5BSS1wb3dlcmVkIGRlY2sgYW5hbHlzaXMgYW5kIGNvYWNoaW5nPC9wPgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBTdGF0dXMgKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyI+CiAgICAgICAgPFN0YXR1c0JhZGdlCiAgICAgICAgICB2YXJpYW50PXtzdGF0dXM/LmxsbV9jb25uZWN0ZWQgPyAnc3VjY2VzcycgOiAnd2FybmluZyd9CiAgICAgICAgICBsYWJlbD17c3RhdHVzPy5sbG1fY29ubmVjdGVkID8gYExMTTogJHtzdGF0dXMuYWN0aXZlX21vZGVsfWAgOiAnTExNOiBEaXNjb25uZWN0ZWQnfQogICAgICAgIC8+CiAgICAgICAgPFN0YXR1c0JhZGdlCiAgICAgICAgICB2YXJpYW50PXtzdGF0dXM/LmVtYmVkZGluZ3NfbG9hZGVkID8gJ3N1Y2Nlc3MnIDogJ25ldXRyYWwnfQogICAgICAgICAgbGFiZWw9e3N0YXR1cz8uZW1iZWRkaW5nc19sb2FkZWQgPyBgJHtzdGF0dXMuZW1iZWRkaW5nX2NhcmRzLnRvTG9jYWxlU3RyaW5nKCl9IGVtYmVkZGluZ3NgIDogJ05vIGVtYmVkZGluZ3MnfQogICAgICAgIC8+CiAgICAgICAgeyFzdGF0dXM/LmVtYmVkZGluZ3NfbG9hZGVkICYmICgKICAgICAgICAgIDxidXR0b24gb25DbGljaz17aGFuZGxlRG93bmxvYWRFbWJlZGRpbmdzfSBkaXNhYmxlZD17ZG93bmxvYWRpbmdFbWJlZGRpbmdzfQogICAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC14cyB0ZXh0LWFjY2VudC1ibHVlIGhvdmVyOnRleHQtYWNjZW50LWJsdWUtaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgICB7ZG93bmxvYWRpbmdFbWJlZGRpbmdzID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogPERvd25sb2FkIGNsYXNzTmFtZT0idy0zIGgtMyIgLz59CiAgICAgICAgICAgIERvd25sb2FkIEVtYmVkZGluZ3MKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICl9CiAgICAgIDwvZGl2PgoKICAgICAge2Vycm9yICYmICgKICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtNCBweS0yIGJnLXN0YXR1cy1lcnJvci8xMCBib3JkZXIgYm9yZGVyLXN0YXR1cy1lcnJvci8zMCByb3VuZGVkLWxnIHRleHQtc20gdGV4dC1zdGF0dXMtZXJyb3IiPgogICAgICAgICAgPEFsZXJ0Q2lyY2xlIGNsYXNzTmFtZT0idy00IGgtNCIgLz57ZXJyb3J9CiAgICAgICAgPC9kaXY+CiAgICAgICl9CgogICAgICB7LyogRGVja3MgZm9yIGNvYWNoaW5nICovfQogICAgICA8ZGl2PgogICAgICAgIDxoMiBjbGFzc05hbWU9InRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBtYi0zIj5Zb3VyIERlY2tzPC9oMj4KICAgICAgICB7ZGVja3MubGVuZ3RoID09PSAwID8gKAogICAgICAgICAgPEVtcHR5U3RhdGUgaWNvbj17R3JhZHVhdGlvbkNhcH0gdGl0bGU9Ik5vIGRlY2tzIGF2YWlsYWJsZSIgZGVzY3JpcHRpb249IkNyZWF0ZSBkZWNrcyBpbiB0aGUgRGVjayBCdWlsZGVyIHRvIHVzZSB0aGUgY29hY2guIiAvPgogICAgICAgICkgOiAoCiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtMyBnYXAtNCI+CiAgICAgICAgICAgIHtkZWNrcy5tYXAoZGVjayA9PiAoCiAgICAgICAgICAgICAgPGRpdiBrZXk9e2RlY2suZGVja19pZH0gY2xhc3NOYW1lPSJiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHAtNSBzcGFjZS15LTMiPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT0idGV4dC1iYXNlIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPntkZWNrLmRlY2tfbmFtZX08L2gzPgogICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeSI+e2RlY2suY29tbWFuZGVyfTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij4KICAgICAgICAgICAgICAgICAgPHNwYW4+e2RlY2sucmVwb3J0X2NvdW50fSByZXBvcnRzPC9zcGFuPgogICAgICAgICAgICAgICAgICB7ZGVjay5sYXN0' +
'X3JlcG9ydF9kYXRlICYmIDxzcGFuPkxhc3Q6IHtuZXcgRGF0ZShkZWNrLmxhc3RfcmVwb3J0X2RhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZygpfTwvc3Bhbj59CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVHZW5lcmF0ZVJlcG9ydChkZWNrLmRlY2tfaWQpfQogICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtnZW5lcmF0aW5nUmVwb3J0ID09PSBkZWNrLmRlY2tfaWR9CiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJmbGV4LTEgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yIGJnLWFjY2VudC1hbWJlci8xNSB0ZXh0LWFjY2VudC1hbWJlciB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQtbGcgaG92ZXI6YmctYWNjZW50LWFtYmVyLzI1IGJvcmRlciBib3JkZXItYWNjZW50LWFtYmVyLzMwIHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNTAiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICB7Z2VuZXJhdGluZ1JlcG9ydCA9PT0gZGVjay5kZWNrX2lkID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogPFNwYXJrbGVzIGNsYXNzTmFtZT0idy0zLjUgaC0zLjUiIC8+fQogICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIFJlcG9ydAogICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICApKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvZGl2PgoKICAgICAgey8qIFNlc3Npb25zICovfQogICAgICA8ZGl2PgogICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0U2hvd1Nlc3Npb25zKCFzaG93U2Vzc2lvbnMpfQogICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6dGV4dC10ZXh0LXByaW1hcnkgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgPE1lc3NhZ2VTcXVhcmUgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPgogICAgICAgICAgQ29hY2hpbmcgU2Vzc2lvbnMgKHtzZXNzaW9ucy5sZW5ndGh9KQogICAgICAgICAgPENoZXZyb25SaWdodCBjbGFzc05hbWU9e2B3LTMuNSBoLTMuNSB0cmFuc2l0aW9uLXRyYW5zZm9ybSAke3Nob3dTZXNzaW9ucyA/ICdyb3RhdGUtOTAnIDogJyd9YH0gLz4KICAgICAgICA8L2J1dHRvbj4KICAgICAgICB7c2hvd1Nlc3Npb25zICYmIHNlc3Npb25zLmxlbmd0aCA+IDAgJiYgKAogICAgICAgICAgPGRpdiBjbGFzc05hbWU9Im10LTMgc3BhY2UteS0yIGFuaW1hdGUtZmFkZS1pbiI+CiAgICAgICAgICAgIHtzZXNzaW9ucy5tYXAocyA9PiAoCiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAga2V5PXtzLnNlc3Npb25faWR9CiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB2aWV3U2Vzc2lvbihzLnNlc3Npb25faWQpfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQgcHgtNCBweS0zIGJnLWJnLXNlY29uZGFyeSByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgaG92ZXI6Ym9yZGVyLWJvcmRlci1zZWNvbmRhcnkgdGV4dC1sZWZ0IHRyYW5zaXRpb24tY29sb3JzIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxNZXNzYWdlU3F1YXJlIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LXRleHQtdGVydGlhcnkiIC8+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIj4KICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5Ij57cy5kZWNrX25hbWV9PC9wPgogICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij57bmV3IERhdGUocy5jcmVhdGVkX2F0KS50b0xvY2FsZVN0cmluZygpfSDCtyB7cy5tZXNzYWdlcy5sZW5ndGh9IG1lc3NhZ2VzPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LXRleHQtdGVydGlhcnkiIC8+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAg' +
'ICAgICkpfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\pages\CoachPage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/pages/CollectionPage.tsx (23,397 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2ssIHVzZVJlZiB9IGZyb20gJ3JlYWN0JwppbXBvcnQgewogIFNlYXJjaCwgRmlsdGVyLCBVcGxvYWQsIERvd25sb2FkLCBDYW1lcmEsIFJlZnJlc2hDdywKICBDaGV2cm9uTGVmdCwgQ2hldnJvblJpZ2h0LCBYLCBQYWNrYWdlLCBTbGlkZXJzSG9yaXpvbnRhbCwKICBQbHVzLCBHcmlkM3gzLCBMaXN0Cn0gZnJvbSAnbHVjaWRlLXJlYWN0JwppbXBvcnQgeyBTcGlubmVyLCBFbXB0eVN0YXRlLCBNYW5hU3ltYm9scywgQ2FyZEltYWdlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21tb24nCmltcG9ydCB7IGNvbGxlY3Rpb25BcGkgfSBmcm9tICcuLi9hcGknCmltcG9ydCB0eXBlIHsgQ29sbGVjdGlvbkNhcmQsIENvbGxlY3Rpb25GaWx0ZXJzLCBTZXRJbmZvIH0gZnJvbSAnLi4vdHlwZXMnCgovLyDilIDilIAgQ2FyZCBEZXRhaWwgTW9kYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIENhcmREZXRhaWxNb2RhbCh7IGNhcmQsIG9uQ2xvc2UgfTogeyBjYXJkOiBDb2xsZWN0aW9uQ2FyZDsgb25DbG9zZTogKCkgPT4gdm9pZCB9KSB7CiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJmaXhlZCBpbnNldC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmxhY2svNzAgYmFja2Ryb3AtYmx1ci1zbSIgb25DbGljaz17b25DbG9zZX0+CiAgICAgIDxkaXYKICAgICAgICBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgc2hhZG93LWxnIG1heC13LTR4bCB3LWZ1bGwgbXgtNCBtYXgtaC1bOTB2aF0gb3ZlcmZsb3cteS1hdXRvIGFuaW1hdGUtZmFkZS1pbiIKICAgICAgICBvbkNsaWNrPXtlID0+IGUuc3RvcFByb3BhZ2F0aW9uKCl9CiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gcC01IGJvcmRlci1iIGJvcmRlci1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8aDIgY2xhc3NOYW1lPSJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSI+e2NhcmQubmFtZX08L2gyPgogICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeSBtdC0wLjUiPntjYXJkLnR5cGVfbGluZX08L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxidXR0b24gb25DbGljaz17b25DbG9zZX0gY2xhc3NOYW1lPSJwLTEgcm91bmRlZCBob3ZlcjpiZy1iZy1ob3ZlciB0ZXh0LXRleHQtdGVydGlhcnkiPgogICAgICAgICAgICA8WCBjbGFzc05hbWU9InctNSBoLTUiIC8+CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBmbGV4LWNvbCBtZDpmbGV4LXJvdyBnYXAtNiBwLTUiPgogICAgICAgICAgey8qIExhcmdlIGNhcmQgaW1hZ2UgKi99CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC1zaHJpbmstMCI+CiAgICAgICAgICAgIDxDYXJkSW1hZ2Ugc3JjPXtjYXJkLmltYWdlX3VybH0gYWx0PXtjYXJkLm5hbWV9IHNpemU9InhsIiAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICB7LyogQ2FyZCBpbmZvICovfQogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXgtMSBzcGFjZS15LTQiPgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSB0cmFja2luZy13aWRlciI+TWFuYSBDb3N0PC9sYWJlbD4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibXQtMSI+PE1hbmFTeW1ib2xzIGNvc3Q9e2NhcmQubWFuYV9jb3N0fSBzaXplPSJtZCIgLz48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5PcmFjbGUgVGV4dDwvbGFiZWw+CiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJtdC0xIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgd2hpdGVzcGFjZS1wcmUtd3JhcCBsZWFkaW5nLXJlbGF4ZWQiPntjYXJkLm9yYWNsZV90' +
'ZXh0fTwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIGdhcC00Ij4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5TZXQ8L2xhYmVsPgogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJtdC0xIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkiPntjYXJkLnNldF9uYW1lfSAoe2NhcmQuc2V0X2NvZGUudG9VcHBlckNhc2UoKX0pPC9wPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPlJhcml0eTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9e2BtdC0xIHRleHQtc20gZm9udC1tZWRpdW0gY2FwaXRhbGl6ZSAkewogICAgICAgICAgICAgICAgICBjYXJkLnJhcml0eSA9PT0gJ215dGhpYycgPyAndGV4dC1hY2NlbnQtYW1iZXInIDoKICAgICAgICAgICAgICAgICAgY2FyZC5yYXJpdHkgPT09ICdyYXJlJyA/ICd0ZXh0LWFjY2VudC1hbWJlci84MCcgOgogICAgICAgICAgICAgICAgICBjYXJkLnJhcml0eSA9PT0gJ3VuY29tbW9uJyA/ICd0ZXh0LWFjY2VudC10ZWFsJyA6ICd0ZXh0LXRleHQtc2Vjb25kYXJ5JwogICAgICAgICAgICAgICAgfWB9PntjYXJkLnJhcml0eX08L3A+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSB0cmFja2luZy13aWRlciI+Q01DPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0ibXQtMSB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5Ij57Y2FyZC5jbWN9PC9wPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkVESFJFQyBSYW5rPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0ibXQtMSB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5Ij57Y2FyZC5lZGhyZWNfcmFuayA/PyAnTi9BJ308L3A+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZ3JpZCBncmlkLWNvbHMtMiBnYXAtNCI+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSB0cmFja2luZy13aWRlciI+UXVhbnRpdHk8L2xhYmVsPgogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJtdC0xIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkiPntjYXJkLnF1YW50aXR5fSAoKyB7Y2FyZC5mb2lsX3F1YW50aXR5fSBmb2lsKTwvcD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5QcmljZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9Im10LTEgdGV4dC1zbSB0ZXh0LWFjY2VudC10ZWFsIGZvbnQtc2VtaWJvbGQiPgogICAgICAgICAgICAgICAgICAke2NhcmQudGNnX3ByaWNlPy50b0ZpeGVkKDIpID8/ICfigJQnfQogICAgICAgICAgICAgICAgICB7Y2FyZC5mb2lsX3ByaWNlID8gPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXRleHQtdGVydGlhcnkgbWwtMiI+Rm9pbDogJHtjYXJkLmZvaWxfcHJpY2UudG9GaXhlZCgyKX08L3NwYW4+IDogbnVsbH0KICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICApCn0KCi8vIOKUgOKUgCBTY2FubmVyIFBhbmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBTY2FubmVyUGFuZWwoeyBvbkNhcmRBZGRlZCB9OiB7IG9uQ2FyZEFkZGVkOiAoKSA9PiB2b2lkIH0pIHsKICBjb25zdCBbc2Nhbm5pbmcsIHNldFNjYW5uaW5nXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtyZXN1bHRzLCBzZXRSZXN1bHRzXSA9IHVzZVN0YXRlPGltcG9ydCgnLi4vdHlwZXMnKS5TY2FuTWF0Y2hbXT4oW10pCiAgY29uc3QgW2FkZGluZywgc2V0QWRkaW5nXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpCiAgY29uc3QgZmlsZVJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKQoKICBhc3luYyBmdW5jdGlvbiBoYW5kbGVTY2FuKGZpbGU6IEZpbGUpIHsKICAgIHNldFNjYW5uaW5nKHRydWUpCiAgICBzZXRSZXN1bHRzKFtdKQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzID0gYXdhaXQgY29sbGVjdGlvbkFwaS5zY2FuQ2FyZChmaWxlKQogICAgICBzZXRSZXN1bHRzKHJlcy5tYXRjaGVzIHx8IFtdKQogICAgfSBjYXRjaCB7CiAgICAgIHNldFJlc3VsdHMoW10pCiAgICB9CiAgICBzZXRTY2FubmluZyhmYWxzZSkKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUFkZChtYXRjaDogaW1wb3J0KCcuLi90eXBlcycpLlNjYW5NYXRjaCkgewogICAgc2V0QWRkaW5nKG1hdGNoLnNjcnlmYWxsX2lkKQogICAgdHJ5IHsKICAgICAgYXdhaXQgY29sbGVjdGlvbkFwaS5hZGRTY2FuUmVzdWx0KHsKICAgICAgICBuYW1lOiBtYXRjaC5uYW1lLAogICAgICAgIHNldF9jb2RlOiBtYXRjaC5zZXRfY29kZSwKICAgICAgICBzY3J5ZmFsbF9pZDogbWF0Y2guc2NyeWZhbGxfaWQsCiAgICAgIH0pCiAgICAgIG9uQ2FyZEFkZGVkKCkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogICAgc2V0QWRkaW5nKG51bGwpCiAgfQoKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcC01Ij4KICAgICAgPGgzIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1iLTMiPgogICAgICAgIDxDYW1lcmEgY2xhc3NOYW1lPSJ3LTQgaC00IHRleHQtYWNjZW50LWJsdWUiIC8+CiAgICAgICAgQ2FyZCBTY2FubmVyCiAgICAgIDwvaDM+CiAgICAgIDxpbnB1dAogICAgICAgIHJlZj17ZmlsZVJlZn0KICAgICAgICB0eXBlPSJmaWxlIgogICAgICAgIGFjY2VwdD0iaW1hZ2UvKiIKICAgICAgICBjbGFzc05hbWU9ImhpZGRlbiIKICAgICAgICBvbkNoYW5nZT17ZSA9PiBlLnRhcmdldC5maWxlcz8uWzBdICYmIGhhbmRsZVNjYW4oZS50YXJnZXQuZmlsZXNbMF0pfQogICAgICAvPgogICAgICA8YnV0dG9uCiAgICAgICAgb25DbGljaz17KCkgPT4gZmlsZVJlZi5jdXJyZW50Py5jbGljaygpfQogICAgICAgIGRpc2FibGVkPXtzY2FubmluZ30KICAgICAgICBjbGFzc05hbWU9InctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiBweC00IHB5LTIuNSBiZy1hY2NlbnQtYmx1ZS8xMCB0ZXh0LWFjY2VudC1ibHVlIGJvcmRlciBib3JkZXItYWNjZW50LWJsdWUvMzAgcm91bmRlZC1sZyB0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOmJnLWFjY2VudC1ibHVlLzIwIHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNTAiCiAgICAgID4KICAgICAgICB7c2Nhbm5pbmcgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8Q2FtZXJhIGNsYXNzTmFtZT0idy00IGgtNCIgLz59CiAgICAgICAge3NjYW5uaW5nID8gJ1NjYW5uaW5nLi4uJyA6ICdTY2FuIGEgQ2FyZCd9CiAgICAgIDwvYnV0dG9uPgogICAgICB7cmVzdWx0cy5sZW5ndGggPiAwICYmICgKICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibXQtMyBzcGFjZS15LTIgbWF4LWgtNjAgb3ZlcmZsb3cteS1hdXRvIj4KICAgICAgICAgIHtyZXN1bHRzLm1hcChtID0+ICgKICAgICAgICAgICAgPGRpdiBrZXk9e20uc2NyeWZhbGxfaWR9IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgcC0yIHJvdW5kZWQtbGcgYmctYmctdGVydGlhcnkiPgogICAgICAgICAgICAgIDxDYXJkSW1hZ2Ugc3JjPXttLmltYWdlX3VybH0gYWx0PXttLm5hbWV9IHNpemU9InNtIiAvPgogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4LTEgbWluLXctMCI+CiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gZm9udC1tZWRpdW0g' +
'dGV4dC10ZXh0LXByaW1hcnkgdHJ1bmNhdGUiPnttLm5hbWV9PC9wPgogICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSI+e20uc2V0X25hbWV9IOKAlCB7KG0uY29uZmlkZW5jZSAqIDEwMCkudG9GaXhlZCgwKX0lPC9wPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUFkZChtKX0KICAgICAgICAgICAgICAgIGRpc2FibGVkPXthZGRpbmcgPT09IG0uc2NyeWZhbGxfaWR9CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InAtMS41IHJvdW5kZWQtbGcgYmctYWNjZW50LWdyZWVuLzE1IHRleHQtYWNjZW50LWdyZWVuIGhvdmVyOmJnLWFjY2VudC1ncmVlbi8yNSB0cmFuc2l0aW9uLWNvbG9ycyIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICB7YWRkaW5nID09PSBtLnNjcnlmYWxsX2lkID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogPFBsdXMgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPn0KICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICApKX0KICAgICAgICA8L2Rpdj4KICAgICAgKX0KICAgIDwvZGl2PgogICkKfQoKLy8g4pSA4pSAIE1haW4gQ29sbGVjdGlvbiBQYWdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgZnVuY3Rpb24gQ29sbGVjdGlvblBhZ2UoKSB7CiAgY29uc3QgW2NhcmRzLCBzZXRDYXJkc10gPSB1c2VTdGF0ZTxDb2xsZWN0aW9uQ2FyZFtdPihbXSkKICBjb25zdCBbdG90YWwsIHNldFRvdGFsXSA9IHVzZVN0YXRlKDApCiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSkKICBjb25zdCBbc2V0cywgc2V0U2V0c10gPSB1c2VTdGF0ZTxTZXRJbmZvW10+KFtdKQogIGNvbnN0IFtzZWxlY3RlZENhcmQsIHNldFNlbGVjdGVkQ2FyZF0gPSB1c2VTdGF0ZTxDb2xsZWN0aW9uQ2FyZCB8IG51bGw+KG51bGwpCiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTwnZ3JpZCcgfCAnbGlzdCc+KCdncmlkJykKICBjb25zdCBbc2hvd0ZpbHRlcnMsIHNldFNob3dGaWx0ZXJzXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtpbXBvcnRpbmcsIHNldEltcG9ydGluZ10gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbZW5yaWNoaW5nLCBzZXRFbnJpY2hpbmddID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgaW1wb3J0UmVmID0gdXNlUmVmPEhUTUxJbnB1dEVsZW1lbnQ+KG51bGwpCgogIGNvbnN0IFtmaWx0ZXJzLCBzZXRGaWx0ZXJzXSA9IHVzZVN0YXRlPENvbGxlY3Rpb25GaWx0ZXJzPih7CiAgICBxOiAnJywKICAgIHBhZ2U6IDEsCiAgICBwYWdlX3NpemU6IDQ4LAogICAgc29ydF9ieTogJ25hbWUnLAogICAgc29ydF9kaXI6ICdhc2MnLAogIH0pCgogIGNvbnN0IGZldGNoQ2FyZHMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7CiAgICBzZXRMb2FkaW5nKHRydWUpCiAgICB0cnkgewogICAgICBjb25zdCByZXMgPSBhd2FpdCBjb2xsZWN0aW9uQXBpLnNlYXJjaENvbGxlY3Rpb24oZmlsdGVycykKICAgICAgc2V0Q2FyZHMocmVzLmNhcmRzKQogICAgICBzZXRUb3RhbChyZXMudG90YWwpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldExvYWRpbmcoZmFsc2UpCiAgfSwgW2ZpbHRlcnNdKQoKICB1c2VFZmZlY3QoKCkgPT4geyBmZXRjaENhcmRzKCkgfSwgW2ZldGNoQ2FyZHNdKQoKICB1c2VFZmZlY3QoKCkgPT4gewogICAgY29sbGVjdGlvbkFwaS5nZXRTZXRzKCkudGhlbihzZXRTZXRzKS5jYXRjaCgoKSA9PiB7fSkKICB9LCBbXSkKCiAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGguY2VpbCh0b3RhbCAvIChmaWx0ZXJzLnBhZ2Vfc2l6ZSB8fCA0OCkpCgogIGZ1bmN0aW9uIHVwZGF0ZUZpbHRlcihrZXk6IGtleW9mIENvbGxlY3Rpb25GaWx0ZXJzLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCkgewogICAgc2V0RmlsdGVycyhwcmV2ID0+ICh7IC4uLnByZXYsIFtrZXldOiB2YWx1ZSwgcGFnZTogMSB9KSkKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUV4cG9ydCgpIHsKICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBjb2xsZWN0aW9uQXBpLmV4cG9ydENvbGxlY3Rpb24oJ2Nz' +
'dicpCiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpCiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpCiAgICBhLmhyZWYgPSB1cmwKICAgIGEuZG93bmxvYWQgPSAnY29sbGVjdGlvbi5jc3YnCiAgICBhLmNsaWNrKCkKICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlSW1wb3J0KGZpbGU6IEZpbGUpIHsKICAgIHNldEltcG9ydGluZyh0cnVlKQogICAgdHJ5IHsKICAgICAgYXdhaXQgY29sbGVjdGlvbkFwaS5pbXBvcnRDb2xsZWN0aW9uKGZpbGUpCiAgICAgIGZldGNoQ2FyZHMoKQogICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgICBzZXRJbXBvcnRpbmcoZmFsc2UpCiAgfQoKICBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZUVucmljaCgpIHsKICAgIHNldEVucmljaGluZyh0cnVlKQogICAgdHJ5IHsKICAgICAgYXdhaXQgY29sbGVjdGlvbkFwaS5yZUVucmljaENhcmRzKCkKICAgICAgZmV0Y2hDYXJkcygpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldEVucmljaGluZyhmYWxzZSkKICB9CgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0icC02IHNwYWNlLXktNSI+CiAgICAgIHsvKiBIZWFkZXIgKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8aDEgY2xhc3NOYW1lPSJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPkNvbGxlY3Rpb248L2gxPgogICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMC41Ij57dG90YWwudG9Mb2NhbGVTdHJpbmcoKX0gY2FyZHMgaW4geW91ciBjb2xsZWN0aW9uPC9wPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVJlRW5yaWNofSBkaXNhYmxlZD17ZW5yaWNoaW5nfQogICAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIGJnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC1zZWNvbmRhcnkgcm91bmRlZC1sZyBob3ZlcjpiZy1iZy1ob3ZlciBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNTAiPgogICAgICAgICAgICB7ZW5yaWNoaW5nID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogPFJlZnJlc2hDdyBjbGFzc05hbWU9InctMy41IGgtMy41IiAvPn0KICAgICAgICAgICAgUmUtRW5yaWNoCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDxpbnB1dCByZWY9e2ltcG9ydFJlZn0gdHlwZT0iZmlsZSIgYWNjZXB0PSIuY3N2LC50eHQiIGNsYXNzTmFtZT0iaGlkZGVuIgogICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBlLnRhcmdldC5maWxlcz8uWzBdICYmIGhhbmRsZUltcG9ydChlLnRhcmdldC5maWxlc1swXSl9IC8+CiAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IGltcG9ydFJlZi5jdXJyZW50Py5jbGljaygpfSBkaXNhYmxlZD17aW1wb3J0aW5nfQogICAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIGJnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC1zZWNvbmRhcnkgcm91bmRlZC1sZyBob3ZlcjpiZy1iZy1ob3ZlciBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNTAiPgogICAgICAgICAgICB7aW1wb3J0aW5nID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogPFVwbG9hZCBjbGFzc05hbWU9InctMy41IGgtMy41IiAvPn0KICAgICAgICAgICAgSW1wb3J0CiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gb25DbGljaz17aGFuZGxlRXhwb3J0fQogICAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIGJnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC1zZWNvbmRhcnkgcm91bmRlZC1sZyBob3ZlcjpiZy1iZy1ob3ZlciBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzIj4KICAgICAgICAgICAgPERvd25sb2FkIGNsYXNzTmFtZT0idy0zLjUgaC0zLjUiIC8+CiAgICAg' +
'ICAgICAgIEV4cG9ydAogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZ2FwLTUiPgogICAgICAgIHsvKiBMZWZ0IHNpZGViYXI6IHNlYXJjaCArIGZpbHRlcnMgKyBzY2FubmVyICovfQogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJ3LTcyIGZsZXgtc2hyaW5rLTAgc3BhY2UteS00Ij4KICAgICAgICAgIHsvKiBTZWFyY2ggKi99CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0icmVsYXRpdmUiPgogICAgICAgICAgICA8U2VhcmNoIGNsYXNzTmFtZT0iYWJzb2x1dGUgbGVmdC0zIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB3LTQgaC00IHRleHQtdGV4dC10ZXJ0aWFyeSIgLz4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VhcmNoIGNhcmRzLi4uIgogICAgICAgICAgICAgIHZhbHVlPXtmaWx0ZXJzLnEgfHwgJyd9CiAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gdXBkYXRlRmlsdGVyKCdxJywgZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHBsLTEwIHByLTQgcHktMi41IGJnLWJnLXNlY29uZGFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBwbGFjZWhvbGRlcjp0ZXh0LXRleHQtdGVydGlhcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hY2NlbnQtYmx1ZS8zMCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAgICAgLz4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIHsvKiBGaWx0ZXIgdG9nZ2xlICovfQogICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93RmlsdGVycyghc2hvd0ZpbHRlcnMpfQogICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtNCBweS0yLjUgYmctYmctc2Vjb25kYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgaG92ZXI6YmctYmctaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMiCiAgICAgICAgICA+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIiPgogICAgICAgICAgICAgIDxTbGlkZXJzSG9yaXpvbnRhbCBjbGFzc05hbWU9InctNCBoLTQiIC8+CiAgICAgICAgICAgICAgRmlsdGVycwogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDxGaWx0ZXIgY2xhc3NOYW1lPXtgdy0zLjUgaC0zLjUgdHJhbnNpdGlvbi10cmFuc2Zvcm0gJHtzaG93RmlsdGVycyA/ICdyb3RhdGUtMTgwJyA6ICcnfWB9IC8+CiAgICAgICAgICA8L2J1dHRvbj4KCiAgICAgICAgICB7c2hvd0ZpbHRlcnMgJiYgKAogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTQgc3BhY2UteS0zIGFuaW1hdGUtZmFkZS1pbiI+CiAgICAgICAgICAgICAgey8qIFJhcml0eSAqL30KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5SYXJpdHk8L2xhYmVsPgogICAgICAgICAgICAgICAgPHNlbGVjdAogICAgICAgICAgICAgICAgICB2YWx1ZT17ZmlsdGVycy5yYXJpdHkgfHwgJyd9CiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHVwZGF0ZUZpbHRlcigncmFyaXR5JywgZS50YXJnZXQudmFsdWUgfHwgdW5kZWZpbmVkKX0KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJtdC0xIHctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5BbGw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iY29tbW9uIj5Db21tb248L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0idW5j' +
'b21tb24iPlVuY29tbW9uPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InJhcmUiPlJhcmU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibXl0aGljIj5NeXRoaWM8L29wdGlvbj4KICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIHsvKiBDb2xvciAqL30KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5Db2xvcjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8c2VsZWN0CiAgICAgICAgICAgICAgICAgIHZhbHVlPXtmaWx0ZXJzLmNvbG9yIHx8ICcnfQogICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiB1cGRhdGVGaWx0ZXIoJ2NvbG9yJywgZS50YXJnZXQudmFsdWUgfHwgdW5kZWZpbmVkKX0KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJtdC0xIHctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5BbGw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iVyI+V2hpdGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iVSI+Qmx1ZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJCIj5CbGFjazwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJSIj5SZWQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iRyI+R3JlZW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQyI+Q29sb3JsZXNzPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7LyogU2V0ICovfQogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPlNldDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8c2VsZWN0CiAgICAgICAgICAgICAgICAgIHZhbHVlPXtmaWx0ZXJzLnNldF9jb2RlIHx8ICcnfQogICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiB1cGRhdGVGaWx0ZXIoJ3NldF9jb2RlJywgZS50YXJnZXQudmFsdWUgfHwgdW5kZWZpbmVkKX0KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJtdC0xIHctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5BbGwgU2V0czwvb3B0aW9uPgogICAgICAgICAgICAgICAgICB7c2V0cy5tYXAocyA9PiAoCiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e3MuY29kZX0gdmFsdWU9e3MuY29kZX0+e3MubmFtZX0gKHtzLmNhcmRfY291bnR9KTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIHsvKiBDTUMgUmFuZ2UgKi99CiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTIiPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5DTUMgTWluPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjIwIgogICAgICAgICAgICAgICAgICAgIHZhbHVlPXtmaWx0ZXJzLmNtY19taW4gPz8gJyd9CiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gdXBkYXRlRmlsdGVyKCdjbWNfbWluJywgZS50YXJnZXQudmFsdWUgPyBOdW1iZXIoZS50YXJnZXQu' +
'dmFsdWUpIDogdW5kZWZpbmVkKX0KICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im10LTEgdy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIgogICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkNNQyBNYXg8L2xhYmVsPgogICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iMjAiCiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2ZpbHRlcnMuY21jX21heCA/PyAnJ30KICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiB1cGRhdGVGaWx0ZXIoJ2NtY19tYXgnLCBlLnRhcmdldC52YWx1ZSA/IE51bWJlcihlLnRhcmdldC52YWx1ZSkgOiB1bmRlZmluZWQpfQogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ibXQtMSB3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAiCiAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7LyogU29ydCAqL30KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5Tb3J0IEJ5PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxzZWxlY3QKICAgICAgICAgICAgICAgICAgdmFsdWU9e2ZpbHRlcnMuc29ydF9ieSB8fCAnbmFtZSd9CiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHVwZGF0ZUZpbHRlcignc29ydF9ieScsIGUudGFyZ2V0LnZhbHVlKX0KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJtdC0xIHctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibmFtZSI+TmFtZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjbWMiPkNNQzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ0Y2dfcHJpY2UiPlByaWNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InJhcml0eSI+UmFyaXR5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InNldF9jb2RlIj5TZXQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWRkZWRfZGF0ZSI+RGF0ZSBBZGRlZDwvb3B0aW9uPgogICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgKX0KCiAgICAgICAgICB7LyogU2Nhbm5lciAqL30KICAgICAgICAgIDxTY2FubmVyUGFuZWwgb25DYXJkQWRkZWQ9e2ZldGNoQ2FyZHN9IC8+CiAgICAgICAgPC9kaXY+CgogICAgICAgIHsvKiBNYWluIGNvbnRlbnQ6IGNhcmQgZ3JpZC9saXN0ICovfQogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4LTEgbWluLXctMCI+CiAgICAgICAgICB7LyogVmlldyB0b2dnbGUgKyBwYWdpbmF0aW9uICovfQogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBtYi00Ij4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIGJnLWJnLXNlY29uZGFyeSByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcC0wLjUiPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKCdncmlkJyl9CiAgICAgICAgICAg' +
'ICAgICBjbGFzc05hbWU9e2BwLTEuNSByb3VuZGVkLW1kIHRyYW5zaXRpb24tY29sb3JzICR7dmlld01vZGUgPT09ICdncmlkJyA/ICdiZy1iZy1ob3ZlciB0ZXh0LXRleHQtcHJpbWFyeScgOiAndGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnknfWB9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPEdyaWQzeDMgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKCdsaXN0Jyl9CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BwLTEuNSByb3VuZGVkLW1kIHRyYW5zaXRpb24tY29sb3JzICR7dmlld01vZGUgPT09ICdsaXN0JyA/ICdiZy1iZy1ob3ZlciB0ZXh0LXRleHQtcHJpbWFyeScgOiAndGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnknfWB9CiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPExpc3QgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtc20gdGV4dC10ZXh0LXNlY29uZGFyeSI+CiAgICAgICAgICAgICAgPHNwYW4+UGFnZSB7ZmlsdGVycy5wYWdlfSBvZiB7dG90YWxQYWdlcyB8fCAxfTwvc3Bhbj4KICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRGaWx0ZXJzKHAgPT4gKHsgLi4ucCwgcGFnZTogTWF0aC5tYXgoMSwgKHAucGFnZSB8fCAxKSAtIDEpIH0pKX0KICAgICAgICAgICAgICAgIGRpc2FibGVkPXshZmlsdGVycy5wYWdlIHx8IGZpbHRlcnMucGFnZSA8PSAxfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJwLTEgcm91bmRlZCBob3ZlcjpiZy1iZy1ob3ZlciBkaXNhYmxlZDpvcGFjaXR5LTMwIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxDaGV2cm9uTGVmdCBjbGFzc05hbWU9InctNCBoLTQiIC8+CiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RmlsdGVycyhwID0+ICh7IC4uLnAsIHBhZ2U6IE1hdGgubWluKHRvdGFsUGFnZXMsIChwLnBhZ2UgfHwgMSkgKyAxKSB9KSl9CiAgICAgICAgICAgICAgICBkaXNhYmxlZD17KGZpbHRlcnMucGFnZSB8fCAxKSA+PSB0b3RhbFBhZ2VzfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJwLTEgcm91bmRlZCBob3ZlcjpiZy1iZy1ob3ZlciBkaXNhYmxlZDpvcGFjaXR5LTMwIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxDaGV2cm9uUmlnaHQgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPgogICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIHtsb2FkaW5nID8gKAogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC02NCI+CiAgICAgICAgICAgICAgPFNwaW5uZXIgc2l6ZT0ibGciIGNsYXNzTmFtZT0idGV4dC1hY2NlbnQtYmx1ZSIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICApIDogY2FyZHMubGVuZ3RoID09PSAwID8gKAogICAgICAgICAgICA8RW1wdHlTdGF0ZQogICAgICAgICAgICAgIGljb249e1BhY2thZ2V9CiAgICAgICAgICAgICAgdGl0bGU9Ik5vIGNhcmRzIGZvdW5kIgogICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcnkgYWRqdXN0aW5nIHlvdXIgc2VhcmNoIG9yIGZpbHRlcnMsIG9yIGltcG9ydCBhIGNvbGxlY3Rpb24uIgogICAgICAgICAgICAvPgogICAgICAgICAgKSA6IHZpZXdNb2RlID09PSAnZ3JpZCcgPyAoCiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIHNtOmdyaWQtY29scy0zIG1kOmdyaWQtY29scy00IGxnOmdyaWQtY29scy01IHhsOmdyaWQtY29scy02IGdhcC0zIj4KICAgICAgICAgICAgICB7Y2FyZHMubWFwKGNhcmQgPT4gKAogICAgICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgICAgICBrZXk9e2NhcmQuaWR9CiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0iZ3JvdXAgY3Vyc29yLXBvaW50ZXIiCiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkQ2FyZChjYXJkKX0K' +
'ICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPENhcmRJbWFnZSBzcmM9e2NhcmQuaW1hZ2VfdXJsfSBhbHQ9e2NhcmQubmFtZX0gc2l6ZT0ibWQiIGNsYXNzTmFtZT0idy1mdWxsIGgtYXV0byBhc3BlY3QtWzUvN10iIC8+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJtdC0xLjUgcHgtMC41Ij4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgZm9udC1tZWRpdW0gdGV4dC10ZXh0LXByaW1hcnkgdHJ1bmNhdGUgZ3JvdXAtaG92ZXI6dGV4dC1hY2NlbnQtYmx1ZSB0cmFuc2l0aW9uLWNvbG9ycyI+e2NhcmQubmFtZX08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiI+CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtWzEwcHhdIHRleHQtdGV4dC10ZXJ0aWFyeSI+e2NhcmQuc2V0X2NvZGUudG9VcHBlckNhc2UoKX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICB7Y2FyZC50Y2dfcHJpY2UgIT0gbnVsbCAmJiAoCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1bMTBweF0gdGV4dC1hY2NlbnQtdGVhbCBmb250LW1lZGl1bSI+JHtjYXJkLnRjZ19wcmljZS50b0ZpeGVkKDIpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgKSl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgKSA6ICgKICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgb3ZlcmZsb3ctaGlkZGVuIj4KICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPSJ3LWZ1bGwgdGV4dC1zbSI+CiAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9ImJvcmRlci1iIGJvcmRlci1ib3JkZXItcHJpbWFyeSB0ZXh0LWxlZnQiPgogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTQgcHktMyB0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkNhcmQ8L3RoPgogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTQgcHktMyB0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPlR5cGU8L3RoPgogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTQgcHktMyB0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPk1hbmE8L3RoPgogICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTQgcHktMyB0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1lZGl1bSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPlNldDwvdGg+CiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtNCBweS0zIHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGZvbnQtbWVkaXVtIHVwcGVyY2FzZSB0cmFja2luZy13aWRlciI+UXR5PC90aD4KICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPSJweC00IHB5LTMgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIHRleHQtcmlnaHQiPlByaWNlPC90aD4KICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICA8dGJvZHkgY2xhc3NOYW1lPSJkaXZpZGUteSBkaXZpZGUtYm9yZGVyLXByaW1hcnkiPgogICAgICAgICAgICAgICAgICB7Y2FyZHMubWFwKGNhcmQgPT4gKAogICAgICAgICAgICAgICAgICAgIDx0ciBrZXk9e2NhcmQuaWR9IGNsYXNzTmFtZT0iaG92ZXI6YmctYmctaG92ZXIgY3Vyc29yLXBvaW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMiIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkQ2FyZChjYXJkKX0+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0iZm9udC1tZWRpdW0gdGV4dC10ZXh0LXByaW1hcnkiPntjYXJkLm5hbWV9PC9zcGFu' +
'PgogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9InB4LTQgcHktMi41IHRleHQtdGV4dC1zZWNvbmRhcnkgdGV4dC14cyI+e2NhcmQudHlwZV9saW5lfTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSI+PE1hbmFTeW1ib2xzIGNvc3Q9e2NhcmQubWFuYV9jb3N0fSAvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHRleHQteHMiPntjYXJkLnNldF9jb2RlLnRvVXBwZXJDYXNlKCl9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9InB4LTQgcHktMi41IHRleHQtdGV4dC1zZWNvbmRhcnkiPntjYXJkLnF1YW50aXR5fTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPSJweC00IHB5LTIuNSB0ZXh0LXJpZ2h0IHRleHQtYWNjZW50LXRlYWwgZm9udC1tZWRpdW0iPntjYXJkLnRjZ19wcmljZSAhPSBudWxsID8gYCQke2NhcmQudGNnX3ByaWNlLnRvRml4ZWQoMil9YCA6ICfigJQnfTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgKSl9CiAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgKX0KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICB7LyogQ2FyZCBkZXRhaWwgbW9kYWwgKi99CiAgICAgIHtzZWxlY3RlZENhcmQgJiYgPENhcmREZXRhaWxNb2RhbCBjYXJkPXtzZWxlY3RlZENhcmR9IG9uQ2xvc2U9eygpID0+IHNldFNlbGVjdGVkQ2FyZChudWxsKX0gLz59CiAgICA8L2Rpdj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\pages\CollectionPage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/pages/DecksPage.tsx (42,258 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JwppbXBvcnQgewogIFBsdXMsIFRyYXNoMiwgRG93bmxvYWQsIENoZXZyb25SaWdodCwKICBCYXJDaGFydDMsIExpZ2h0YnVsYiwgTGF5ZXJzLCBYLCBMaWJyYXJ5LAogIEdsb2JlLCBDaGVja0NpcmNsZSwgWENpcmNsZSwgU2hvcHBpbmdDYXJ0LAogIENoZXZyb25Eb3duLCBDaGV2cm9uVXAsIFNwYXJrbGVzCn0gZnJvbSAnbHVjaWRlLXJlYWN0JwppbXBvcnQgeyBTcGlubmVyLCBFbXB0eVN0YXRlLCBNYW5hU3ltYm9scywgQ2FyZEltYWdlLCBDb2xvckRvdHMgfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbW1vbicKaW1wb3J0IHsgZGVja3NBcGkgfSBmcm9tICcuLi9hcGknCmltcG9ydCB0eXBlIHsKICBEZWNrLCBEZWNrQ2FyZCwgRGVja0FuYWx5c2lzLCBEZWNrUmVjb21tZW5kYXRpb24sCiAgRWRoUmVjQ2FyZCwgRWRoUmVjc1Jlc3BvbnNlLAogIENvbGxlY3Rpb25SZWNDYXJkLCBDb2xsZWN0aW9uUmVjc1Jlc3BvbnNlCn0gZnJvbSAnLi4vdHlwZXMnCmltcG9ydCB7IEJhckNoYXJ0LCBCYXIsIFhBeGlzLCBZQXhpcywgVG9vbHRpcCwgUmVzcG9uc2l2ZUNvbnRhaW5lciwgQ2VsbCB9IGZyb20gJ3JlY2hhcnRzJwoKLy8g4pSA4pSAIFJvbGUgQmFkZ2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmNvbnN0IFJPTEVfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gewogIFJhbXA6ICdiZy1ncmVlbi01MDAvMTUgdGV4dC1ncmVlbi00MDAgYm9yZGVyLWdyZWVuLTUwMC8yNScsCiAgRHJhdzogJ2JnLWJsdWUtNTAwLzE1IHRleHQtYmx1ZS00MDAgYm9yZGVyLWJsdWUtNTAwLzI1JywKICBSZW1vdmFsOiAnYmctcmVkLTUwMC8xNSB0ZXh0LXJlZC00MDAgYm9yZGVyLXJlZC01MDAvMjUnLAogIEJvYXJkV2lwZTogJ2JnLW9yYW5nZS01MDAvMTUgdGV4dC1vcmFuZ2UtNDAwIGJvcmRlci1vcmFuZ2UtNTAwLzI1JywKICBUdXRvcjogJ2JnLXB1cnBsZS01MDAvMTUgdGV4dC1wdXJwbGUtNDAwIGJvcmRlci1wdXJwbGUtNTAwLzI1JywKICBQcm90ZWN0aW9uOiAnYmctY3lhbi01MDAvMTUgdGV4dC1jeWFuLTQwMCBib3JkZXItY3lhbi01MDAvMjUnLAogIEZpbmlzaGVyOiAnYmcteWVsbG93LTUwMC8xNSB0ZXh0LXllbGxvdy00MDAgYm9yZGVyLXllbGxvdy01MDAvMjUnLAogIFJlY3Vyc2lvbjogJ2JnLWVtZXJhbGQtNTAwLzE1IHRleHQtZW1lcmFsZC00MDAgYm9yZGVyLWVtZXJhbGQtNTAwLzI1JywKICBPdGhlcjogJ2JnLXNsYXRlLTUwMC8xNSB0ZXh0LXNsYXRlLTQwMCBib3JkZXItc2xhdGUtNTAwLzI1JywKfQoKZnVuY3Rpb24gUm9sZUJhZGdlKHsgcm9sZSB9OiB7IHJvbGU6IHN0cmluZyB9KSB7CiAgY29uc3QgY29sb3JzID0gUk9MRV9DT0xPUlNbcm9sZV0gfHwgUk9MRV9DT0xPUlMuT3RoZXIKICByZXR1cm4gKAogICAgPHNwYW4gY2xhc3NOYW1lPXsndGV4dC1bMTBweF0gZm9udC1tZWRpdW0gcHgtMS41IHB5LTAuNSByb3VuZGVkIGJvcmRlciAnICsgY29sb3JzfT4KICAgICAge3JvbGV9CiAgICA8L3NwYW4+CiAgKQp9CgovLyDilIDilIAgRGVjayBDYXJkIExpc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIERlY2tDYXJkTGlzdCh7IGRlY2tJZCwgY2FyZHMsIG9uVXBkYXRlIH06IHsgZGVja0lkOiBudW1iZXI7IGNhcmRzOiBEZWNrQ2FyZFtdOyBvblVwZGF0ZTogKCkgPT4gdm9pZCB9KSB7CiAgY29uc3QgW3JlbW92aW5nLCBzZXRSZW1vdmluZ10gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihudWxsKQoKICAvLyBHcm91cCBjYXJkcyBieSBjYXRlZ29yeQogIGNvbnN0IGdyb3VwZWQgPSBjYXJkcy5yZWR1Y2U8UmVjb3JkPHN0cmluZywgRGVja0NhcmRbXT4+KChhY2MsIGMpID0+IHsKICAgIGNvbnN0IGNhdCA9IGMuY2F0ZWdvcnkgfHwgJ090aGVyJwogICAgaWYgKCFhY2NbY2F0XSkgYWNjW2NhdF0gPSBbXQogICAgYWNjW2NhdF0ucHVzaChjKQogICAgcmV0dXJuIGFjYwogIH0sIHt9KQoKICBjb25zdCBjYXRlZ29yeU9yZGVyID0gWydDb21tYW5kZXInLCAnQ3JlYXR1' +
'cmUnLCAnSW5zdGFudCcsICdTb3JjZXJ5JywgJ0FydGlmYWN0JywgJ0VuY2hhbnRtZW50JywgJ1BsYW5lc3dhbGtlcicsICdMYW5kJywgJ090aGVyJ10KICBjb25zdCBzb3J0ZWRDYXRlZ29yaWVzID0gT2JqZWN0LmtleXMoZ3JvdXBlZCkuc29ydCgoYSwgYikgPT4gewogICAgY29uc3QgaWEgPSBjYXRlZ29yeU9yZGVyLmluZGV4T2YoYSkKICAgIGNvbnN0IGliID0gY2F0ZWdvcnlPcmRlci5pbmRleE9mKGIpCiAgICByZXR1cm4gKGlhID09PSAtMSA/IDk5IDogaWEpIC0gKGliID09PSAtMSA/IDk5IDogaWIpCiAgfSkKCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlUmVtb3ZlKGNhcmRJZDogbnVtYmVyKSB7CiAgICBzZXRSZW1vdmluZyhjYXJkSWQpCiAgICB0cnkgewogICAgICBhd2FpdCBkZWNrc0FwaS5yZW1vdmVDYXJkRnJvbURlY2soZGVja0lkLCBjYXJkSWQpCiAgICAgIG9uVXBkYXRlKCkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogICAgc2V0UmVtb3ZpbmcobnVsbCkKICB9CgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS00Ij4KICAgICAge3NvcnRlZENhdGVnb3JpZXMubWFwKGNhdCA9PiAoCiAgICAgICAgPGRpdiBrZXk9e2NhdH0+CiAgICAgICAgICA8aDQgY2xhc3NOYW1lPSJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSB0cmFja2luZy13aWRlciBtYi0yIj4KICAgICAgICAgICAge2NhdH0gKHtncm91cGVkW2NhdF0ubGVuZ3RofSkKICAgICAgICAgIDwvaDQ+CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS0xIj4KICAgICAgICAgICAge2dyb3VwZWRbY2F0XS5tYXAoY2FyZCA9PiAoCiAgICAgICAgICAgICAgPGRpdiBrZXk9e2NhcmQuaWR9IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0yIHJvdW5kZWQtbGcgaG92ZXI6YmctYmctaG92ZXIgZ3JvdXAgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSB3LTUgdGV4dC1yaWdodCI+e2NhcmQucXVhbnRpdHl9eDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxNYW5hU3ltYm9scyBjb3N0PXtjYXJkLm1hbmFfY29zdH0gLz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0iZmxleC0xIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgdHJ1bmNhdGUiPntjYXJkLm5hbWV9PC9zcGFuPgogICAgICAgICAgICAgICAge2NhcmQudGNnX3ByaWNlICE9IG51bGwgJiYgKAogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC1hY2NlbnQtdGVhbCI+JHtjYXJkLnRjZ19wcmljZS50b0ZpeGVkKDIpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAgICB7IWNhcmQuaXNfY29tbWFuZGVyICYmICgKICAgICAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVJlbW92ZShjYXJkLmlkKX0KICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9wYWNpdHktMCBncm91cC1ob3ZlcjpvcGFjaXR5LTEwMCBwLTEgdGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtYWNjZW50LXJlZCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIHtyZW1vdmluZyA9PT0gY2FyZC5pZCA/IDxTcGlubmVyIHNpemU9InNtIiAvPiA6IDxUcmFzaDIgY2xhc3NOYW1lPSJ3LTMuNSBoLTMuNSIgLz59CiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgKX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgKSl9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgKSl9CiAgICA8L2Rpdj4KICApCn0KCi8vIOKUgOKUgCBNYW5hIEN1cnZlIENoYXJ0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApmdW5jdGlvbiBNYW5hQ3VydmVDaGFydCh7IGFuYWx5c2lzIH06IHsgYW5hbHlzaXM6IERlY2tBbmFseXNpcyB9KSB7CiAgY29uc3QgZGF0YSA9IE9iamVjdC5lbnRyaWVzKGFuYWx5c2lzLm1hbmFfY3VydmUpCiAgICAubWFwKChbY21jLCBjb3VudF0pID0+ICh7IGNtYzogY21jID09PSAnNycgPyAnNysnIDogY21jLCBjb3VudCB9KSkK' +
'ICAgIC5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYS5jbWMpIC0gTnVtYmVyKGIuY21jKSkKCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJoLTQwIj4KICAgICAgPFJlc3BvbnNpdmVDb250YWluZXIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+CiAgICAgICAgPEJhckNoYXJ0IGRhdGE9e2RhdGF9IGJhclNpemU9ezI0fT4KICAgICAgICAgIDxYQXhpcyBkYXRhS2V5PSJjbWMiIGF4aXNMaW5lPXtmYWxzZX0gdGlja0xpbmU9e2ZhbHNlfSB0aWNrPXt7IGZpbGw6ICcjNmI3MTkwJywgZm9udFNpemU6IDExIH19IC8+CiAgICAgICAgICA8WUF4aXMgaGlkZSAvPgogICAgICAgICAgPFRvb2x0aXAKICAgICAgICAgICAgY29udGVudFN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJyMxYzIwMzAnLCBib3JkZXI6ICcxcHggc29saWQgIzJhMmY0MicsIGJvcmRlclJhZGl1czogOCwgZm9udFNpemU6IDEyIH19CiAgICAgICAgICAgIGxhYmVsU3R5bGU9e3sgY29sb3I6ICcjOWJhMWI4JyB9fQogICAgICAgICAgICBpdGVtU3R5bGU9e3sgY29sb3I6ICcjZThlYWYwJyB9fQogICAgICAgICAgLz4KICAgICAgICAgIDxCYXIgZGF0YUtleT0iY291bnQiIHJhZGl1cz17WzQsIDQsIDAsIDBdfT4KICAgICAgICAgICAge2RhdGEubWFwKChfLCBpKSA9PiAoCiAgICAgICAgICAgICAgPENlbGwga2V5PXtpfSBmaWxsPSIjNGY2ZWY3IiBmaWxsT3BhY2l0eT17MC44fSAvPgogICAgICAgICAgICApKX0KICAgICAgICAgIDwvQmFyPgogICAgICAgIDwvQmFyQ2hhcnQ+CiAgICAgIDwvUmVzcG9uc2l2ZUNvbnRhaW5lcj4KICAgIDwvZGl2PgogICkKfQoKLy8g4pSA4pSAIEVESFJFQyBSZWNvbW1lbmRhdGlvbnMgU3ViLXRhYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gRWRoUmVjVGFiKHsgZGVja0lkLCBvbkFkZGVkQ2FyZHMgfTogeyBkZWNrSWQ6IG51bWJlcjsgb25BZGRlZENhcmRzOiAoKSA9PiB2b2lkIH0pIHsKICBjb25zdCBbZGF0YSwgc2V0RGF0YV0gPSB1c2VTdGF0ZTxFZGhSZWNzUmVzcG9uc2UgfCBudWxsPihudWxsKQogIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpCiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKQogIGNvbnN0IFtvbmx5T3duZWQsIHNldE9ubHlPd25lZF0gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbc2VsZWN0ZWRDYXJkcywgc2V0U2VsZWN0ZWRDYXJkc10gPSB1c2VTdGF0ZTxTZXQ8c3RyaW5nPj4obmV3IFNldCgpKQogIGNvbnN0IFthZGRpbmdDYXJkcywgc2V0QWRkaW5nQ2FyZHNdID0gdXNlU3RhdGU8U2V0PHN0cmluZz4+KG5ldyBTZXQoKSkKICBjb25zdCBbYnVsa0FkZGluZywgc2V0QnVsa0FkZGluZ10gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbaG92ZXJlZENhcmQsIHNldEhvdmVyZWRDYXJkXSA9IHVzZVN0YXRlPEVkaFJlY0NhcmQgfCBudWxsPihudWxsKQogIGNvbnN0IFtjb2xsYXBzZWRHcm91cHMsIHNldENvbGxhcHNlZEdyb3Vwc10gPSB1c2VTdGF0ZTxTZXQ8c3RyaW5nPj4obmV3IFNldCgpKQoKICBhc3luYyBmdW5jdGlvbiBmZXRjaFJlY3MoKSB7CiAgICBzZXRMb2FkaW5nKHRydWUpCiAgICBzZXRFcnJvcihudWxsKQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVja3NBcGkuZ2V0RWRoUmVjcyhkZWNrSWQsIG9ubHlPd25lZCkKICAgICAgc2V0RGF0YShyZXN1bHQpCiAgICB9IGNhdGNoIChlOiBhbnkpIHsKICAgICAgc2V0RXJyb3IoZT8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxvYWQgRURIUkVDIHJlY29tbWVuZGF0aW9ucycpCiAgICB9CiAgICBzZXRMb2FkaW5nKGZhbHNlKQogIH0KCiAgdXNlRWZmZWN0KCgpID0+IHsgZmV0Y2hSZWNzKCkgfSwgW2RlY2tJZCwgb25seU93bmVkXSkKCiAgZnVuY3Rpb24gdG9nZ2xlU2VsZWN0KG5hbWU6IHN0cmluZykgewogICAgc2V0U2VsZWN0ZWRDYXJkcyhwcmV2ID0+IHsKICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldikKICAgICAgaWYgKG5leHQuaGFzKG5hbWUpKSBuZXh0LmRlbGV0ZShuYW1lKQogICAgICBlbHNlIG5leHQuYWRkKG5hbWUpCiAgICAgIHJldHVybiBuZXh0CiAgICB9KQogIH0KCiAgZnVuY3Rpb24gc2VsZWN0QWxsKCkgewogICAgaWYgKCFkYXRhKSByZXR1cm4KICAgIHNldFNlbGVjdGVkQ2FyZHMobmV3IFNldChkYXRhLnJl' +
'Y29tbWVuZGF0aW9ucy5tYXAociA9PiByLm5hbWUpKSkKICB9CgogIGZ1bmN0aW9uIHNlbGVjdE5vbmUoKSB7IHNldFNlbGVjdGVkQ2FyZHMobmV3IFNldCgpKSB9CgogIGZ1bmN0aW9uIHNlbGVjdE93bmVkKCkgewogICAgaWYgKCFkYXRhKSByZXR1cm4KICAgIHNldFNlbGVjdGVkQ2FyZHMobmV3IFNldChkYXRhLnJlY29tbWVuZGF0aW9ucy5maWx0ZXIociA9PiByLm93bmVkKS5tYXAociA9PiByLm5hbWUpKSkKICB9CgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUFkZFNpbmdsZShuYW1lOiBzdHJpbmcpIHsKICAgIHNldEFkZGluZ0NhcmRzKHByZXYgPT4gbmV3IFNldChwcmV2KS5hZGQobmFtZSkpCiAgICB0cnkgewogICAgICBhd2FpdCBkZWNrc0FwaS5idWxrQWRkUmVjb21tZW5kZWQoZGVja0lkLCBbbmFtZV0pCiAgICAgIG9uQWRkZWRDYXJkcygpCiAgICAgIC8vIFJlbW92ZSBmcm9tIGxpc3QKICAgICAgaWYgKGRhdGEpIHsKICAgICAgICBzZXREYXRhKHsKICAgICAgICAgIC4uLmRhdGEsCiAgICAgICAgICByZWNvbW1lbmRhdGlvbnM6IGRhdGEucmVjb21tZW5kYXRpb25zLmZpbHRlcihyID0+IHIubmFtZSAhPT0gbmFtZSksCiAgICAgICAgICB0b3RhbDogZGF0YS50b3RhbCAtIDEsCiAgICAgICAgfSkKICAgICAgfQogICAgICBzZWxlY3RlZENhcmRzLmRlbGV0ZShuYW1lKQogICAgICBzZXRTZWxlY3RlZENhcmRzKG5ldyBTZXQoc2VsZWN0ZWRDYXJkcykpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldEFkZGluZ0NhcmRzKHByZXYgPT4geyBjb25zdCBuID0gbmV3IFNldChwcmV2KTsgbi5kZWxldGUobmFtZSk7IHJldHVybiBuIH0pCiAgfQoKICBhc3luYyBmdW5jdGlvbiBoYW5kbGVCdWxrQWRkKCkgewogICAgaWYgKHNlbGVjdGVkQ2FyZHMuc2l6ZSA9PT0gMCkgcmV0dXJuCiAgICBzZXRCdWxrQWRkaW5nKHRydWUpCiAgICB0cnkgewogICAgICBhd2FpdCBkZWNrc0FwaS5idWxrQWRkUmVjb21tZW5kZWQoZGVja0lkLCBBcnJheS5mcm9tKHNlbGVjdGVkQ2FyZHMpKQogICAgICBvbkFkZGVkQ2FyZHMoKQogICAgICBpZiAoZGF0YSkgewogICAgICAgIHNldERhdGEoewogICAgICAgICAgLi4uZGF0YSwKICAgICAgICAgIHJlY29tbWVuZGF0aW9uczogZGF0YS5yZWNvbW1lbmRhdGlvbnMuZmlsdGVyKHIgPT4gIXNlbGVjdGVkQ2FyZHMuaGFzKHIubmFtZSkpLAogICAgICAgICAgdG90YWw6IGRhdGEudG90YWwgLSBzZWxlY3RlZENhcmRzLnNpemUsCiAgICAgICAgfSkKICAgICAgfQogICAgICBzZXRTZWxlY3RlZENhcmRzKG5ldyBTZXQoKSkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogICAgc2V0QnVsa0FkZGluZyhmYWxzZSkKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZUdyb3VwKGdyb3VwTmFtZTogc3RyaW5nKSB7CiAgICBzZXRDb2xsYXBzZWRHcm91cHMocHJldiA9PiB7CiAgICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHByZXYpCiAgICAgIGlmIChuZXh0Lmhhcyhncm91cE5hbWUpKSBuZXh0LmRlbGV0ZShncm91cE5hbWUpCiAgICAgIGVsc2UgbmV4dC5hZGQoZ3JvdXBOYW1lKQogICAgICByZXR1cm4gbmV4dAogICAgfSkKICB9CgogIC8vIEdyb3VwIHJlY29tbWVuZGF0aW9ucyBieSByb2xlCiAgZnVuY3Rpb24gZ3JvdXBCeVJvbGUocmVjczogRWRoUmVjQ2FyZFtdKTogUmVjb3JkPHN0cmluZywgRWRoUmVjQ2FyZFtdPiB7CiAgICBjb25zdCBncm91cHM6IFJlY29yZDxzdHJpbmcsIEVkaFJlY0NhcmRbXT4gPSB7fQogICAgZm9yIChjb25zdCByZWMgb2YgcmVjcykgewogICAgICBjb25zdCByb2xlID0gcmVjLnJvbGUgfHwgJ090aGVyJwogICAgICBpZiAoIWdyb3Vwc1tyb2xlXSkgZ3JvdXBzW3JvbGVdID0gW10KICAgICAgZ3JvdXBzW3JvbGVdLnB1c2gocmVjKQogICAgfQogICAgcmV0dXJuIGdyb3VwcwogIH0KCiAgaWYgKGxvYWRpbmcpIHsKICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgaC00MCI+PFNwaW5uZXIgc2l6ZT0ibGciIGNsYXNzTmFtZT0idGV4dC1hY2NlbnQtYmx1ZSIgLz48L2Rpdj4KICB9CgogIGlmIChlcnJvcikgewogICAgcmV0dXJuICgKICAgICAgPGRpdiBjbGFzc05hbWU9ImJnLWFjY2VudC1yZWQvMTAgYm9yZGVyIGJvcmRlci1hY2NlbnQtcmVkLzIwIHJvdW5kZWQteGwgcC01IHRleHQtY2VudGVyIj4KICAgICAgICA8WENpcmNsZSBjbGFzc05hbWU9InctNiBoLTYgdGV4dC1hY2NlbnQtcmVkIG14LWF1dG8gbWItMiIgLz4KICAgICAgICA8' +
'cCBjbGFzc05hbWU9InRleHQtc20gdGV4dC1hY2NlbnQtcmVkIGZvbnQtbWVkaXVtIj57ZXJyb3J9PC9wPgogICAgICAgIDxidXR0b24gb25DbGljaz17ZmV0Y2hSZWNzfSBjbGFzc05hbWU9Im10LTMgcHgtNCBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gYmctYmctdGVydGlhcnkgdGV4dC10ZXh0LXNlY29uZGFyeSByb3VuZGVkLWxnIGhvdmVyOmJnLWJnLWhvdmVyIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgUmV0cnkKICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICApCiAgfQoKICBpZiAoIWRhdGEgfHwgZGF0YS5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID09PSAwKSB7CiAgICByZXR1cm4gPEVtcHR5U3RhdGUgaWNvbj17R2xvYmV9IHRpdGxlPSJObyBFREhSRUMgZGF0YSIgZGVzY3JpcHRpb249Ik5vIHJlY29tbWVuZGF0aW9ucyBmb3VuZCBmb3IgdGhpcyBjb21tYW5kZXIgb24gRURIUkVDLiIgLz4KICB9CgogIGNvbnN0IGdyb3VwZWQgPSBncm91cEJ5Um9sZShkYXRhLnJlY29tbWVuZGF0aW9ucykKICBjb25zdCByb2xlT3JkZXIgPSBbJ1JhbXAnLCAnRHJhdycsICdSZW1vdmFsJywgJ0JvYXJkV2lwZScsICdUdXRvcicsICdQcm90ZWN0aW9uJywgJ0ZpbmlzaGVyJywgJ1JlY3Vyc2lvbicsICdPdGhlciddCiAgY29uc3Qgc29ydGVkUm9sZXMgPSBPYmplY3Qua2V5cyhncm91cGVkKS5zb3J0KChhLCBiKSA9PiB7CiAgICBjb25zdCBpYSA9IHJvbGVPcmRlci5pbmRleE9mKGEpCiAgICBjb25zdCBpYiA9IHJvbGVPcmRlci5pbmRleE9mKGIpCiAgICByZXR1cm4gKGlhID09PSAtMSA/IDk5IDogaWEpIC0gKGliID09PSAtMSA/IDk5IDogaWIpCiAgfSkKCiAgY29uc3Qgb3duZWRDb3VudCA9IGRhdGEucmVjb21tZW5kYXRpb25zLmZpbHRlcihyID0+IHIub3duZWQpLmxlbmd0aAogIGNvbnN0IG1pc3NpbmdDb3VudCA9IGRhdGEucmVjb21tZW5kYXRpb25zLmxlbmd0aCAtIG93bmVkQ291bnQKCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJzcGFjZS15LTQiPgogICAgICB7LyogSGVhZGVyIGJhciAqL30KICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBmbGV4LXdyYXAgZ2FwLTMiPgogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyI+CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC1zbSI+CiAgICAgICAgICAgIDxTcGFya2xlcyBjbGFzc05hbWU9InctNCBoLTQgdGV4dC1hY2NlbnQtYmx1ZSIgLz4KICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXRleHQtcHJpbWFyeSBmb250LW1lZGl1bSI+e2RhdGEuY29tbWFuZGVyfTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXRleHQtdGVydGlhcnkiPnZpYSB7ZGF0YS5zb3VyY2V9PC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgcHgtMiBweS0wLjUgcm91bmRlZCBiZy1hY2NlbnQtZ3JlZW4vMTUgdGV4dC1hY2NlbnQtZ3JlZW4iPntvd25lZENvdW50fSBvd25lZDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyBweC0yIHB5LTAuNSByb3VuZGVkIGJnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC10ZXJ0aWFyeSI+e21pc3NpbmdDb3VudH0gbWlzc2luZzwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkgY3Vyc29yLXBvaW50ZXIgc2VsZWN0LW5vbmUiPgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgogICAgICAgICAgICBjaGVja2VkPXtvbmx5T3duZWR9CiAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldE9ubHlPd25lZChlLnRhcmdldC5jaGVja2VkKX0KICAgICAgICAgICAgY2xhc3NOYW1lPSJyb3VuZGVkIGJvcmRlci1ib3JkZXItcHJpbWFyeSBiZy1iZy10ZXJ0aWFyeSB0ZXh0LWFjY2VudC1ibHVlIGZvY3VzOnJpbmctYWNjZW50LWJsdWUvMzAgdy0zLjUgaC0zLjUiCiAgICAgICAgICAvPgogICAgICAgICAgU2hvdyBvbmx5IG93bmVkCiAgICAgICAgPC9sYWJlbD4KICAgICAgPC9kaXY+CgogICAgICB7LyogU2VsZWN0aW9uIHRvb2xiYXIgKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNl' +
'bnRlciBqdXN0aWZ5LWJldHdlZW4gYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBweC00IHB5LTMiPgogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij5TZWxlY3Q6PC9zcGFuPgogICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZWxlY3RBbGx9IGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LWFjY2VudC1ibHVlIGhvdmVyOnVuZGVybGluZSI+QWxsPC9idXR0b24+CiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC10ZXJ0aWFyeSI+Lzwvc3Bhbj4KICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2VsZWN0Tm9uZX0gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtYWNjZW50LWJsdWUgaG92ZXI6dW5kZXJsaW5lIj5Ob25lPC9idXR0b24+CiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC10ZXJ0aWFyeSI+Lzwvc3Bhbj4KICAgICAgICAgIDxidXR0b24gb25DbGljaz17c2VsZWN0T3duZWR9IGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LWFjY2VudC1ibHVlIGhvdmVyOnVuZGVybGluZSI+T3duZWQ8L2J1dHRvbj4KICAgICAgICAgIHtzZWxlY3RlZENhcmRzLnNpemUgPiAwICYmICgKICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkgbWwtMiI+KHtzZWxlY3RlZENhcmRzLnNpemV9IHNlbGVjdGVkKTwvc3Bhbj4KICAgICAgICAgICl9CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGJ1dHRvbgogICAgICAgICAgb25DbGljaz17aGFuZGxlQnVsa0FkZH0KICAgICAgICAgIGRpc2FibGVkPXtzZWxlY3RlZENhcmRzLnNpemUgPT09IDAgfHwgYnVsa0FkZGluZ30KICAgICAgICAgIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSBiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgaG92ZXI6YmctYWNjZW50LWJsdWUtaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMgZGlzYWJsZWQ6b3BhY2l0eS00MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQiCiAgICAgICAgPgogICAgICAgICAge2J1bGtBZGRpbmcgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8U2hvcHBpbmdDYXJ0IGNsYXNzTmFtZT0idy0zLjUgaC0zLjUiIC8+fQogICAgICAgICAgQWRkIHtzZWxlY3RlZENhcmRzLnNpemUgPiAwID8gc2VsZWN0ZWRDYXJkcy5zaXplIDogJyd9IHRvIERlY2sKICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICB7LyogR3JvdXBlZCBjYXJkcyAqL30KICAgICAge3NvcnRlZFJvbGVzLm1hcChyb2xlID0+IHsKICAgICAgICBjb25zdCBjYXJkcyA9IGdyb3VwZWRbcm9sZV0KICAgICAgICBjb25zdCBpc0NvbGxhcHNlZCA9IGNvbGxhcHNlZEdyb3Vwcy5oYXMocm9sZSkKICAgICAgICByZXR1cm4gKAogICAgICAgICAgPGRpdiBrZXk9e3JvbGV9IGNsYXNzTmFtZT0iYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBvdmVyZmxvdy1oaWRkZW4iPgogICAgICAgICAgICB7LyogR3JvdXAgaGVhZGVyICovfQogICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdG9nZ2xlR3JvdXAocm9sZSl9CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB4LTQgcHktMyBob3ZlcjpiZy1iZy1ob3ZlciB0cmFuc2l0aW9uLWNvbG9ycyIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgICA8Um9sZUJhZGdlIHJvbGU9e3JvbGV9IC8+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij4oe2NhcmRzLmxlbmd0aH0pPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIHtpc0NvbGxhcHNlZCA/IDxDaGV2cm9uRG93biBjbGFzc05hbWU9InctNCBoLTQgdGV4dC10ZXh0LXRlcnRpYXJ5IiAvPiA6IDxDaGV2cm9uVXAgY2xhc3NOYW1lPSJ3LTQgaC00IHRleHQtdGV4dC10ZXJ0aWFyeSIgLz59CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICB7LyogQ2FyZCBsaXN0ICovfQogICAgICAgICAgICB7IWlz' +
'Q29sbGFwc2VkICYmICgKICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYm9yZGVyLXQgYm9yZGVyLWJvcmRlci1wcmltYXJ5IGRpdmlkZS15IGRpdmlkZS1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgICAgICAgICB7Y2FyZHMubWFwKHJlYyA9PiAoCiAgICAgICAgICAgICAgICAgIDxkaXYKICAgICAgICAgICAgICAgICAgICBrZXk9e3JlYy5uYW1lfQogICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtNCBweS0yLjUgaG92ZXI6YmctYmctaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMgZ3JvdXAgcmVsYXRpdmUiCiAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoKSA9PiBzZXRIb3ZlcmVkQ2FyZChyZWMpfQogICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KCkgPT4gc2V0SG92ZXJlZENhcmQobnVsbCl9CiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICB7LyogQ2hlY2tib3ggKi99CiAgICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkQ2FyZHMuaGFzKHJlYy5uYW1lKX0KICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoKSA9PiB0b2dnbGVTZWxlY3QocmVjLm5hbWUpfQogICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJyb3VuZGVkIGJvcmRlci1ib3JkZXItcHJpbWFyeSBiZy1iZy10ZXJ0aWFyeSB0ZXh0LWFjY2VudC1ibHVlIGZvY3VzOnJpbmctYWNjZW50LWJsdWUvMzAgdy0zLjUgaC0zLjUgZmxleC1zaHJpbmstMCIKICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICAgIHsvKiBDYXJkIGltYWdlIG1pbmkgKi99CiAgICAgICAgICAgICAgICAgICAge3JlYy5pbWFnZV91cmwgJiYgKAogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9InctOCBoLTExIHJvdW5kZWQgb3ZlcmZsb3ctaGlkZGVuIGJnLWJnLXRlcnRpYXJ5IGZsZXgtc2hyaW5rLTAiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17cmVjLmltYWdlX3VybH0gYWx0PXtyZWMubmFtZX0gY2xhc3NOYW1lPSJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlciIgbG9hZGluZz0ibGF6eSIgLz4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAgICAgICAgey8qIENhcmQgaW5mbyAqL30KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIG1pbi13LTAiPgogICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5IHRydW5jYXRlIj57cmVjLm5hbWV9PC9wPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgbXQtMC41Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LVsxMHB4XSB0ZXh0LXRleHQtdGVydGlhcnkgdHJ1bmNhdGUiPntyZWMudHlwZV9saW5lfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAge3JlYy5yb2xlcy5sZW5ndGggPiAwICYmIHJlYy5yb2xlcy5tYXAociA9PiA8Um9sZUJhZGdlIGtleT17cn0gcm9sZT17cn0gLz4pfQogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgey8qIE93bmVkIGJhZGdlICovfQogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17J3RleHQteHMgcHgtMiBweS0wLjUgcm91bmRlZCBmbGV4LXNocmluay0wICcgKyAocmVjLm93bmVkID8gJ2JnLWFjY2VudC1ncmVlbi8xNSB0ZXh0LWFjY2VudC1ncmVlbicgOiAnYmctYmctdGVydGlhcnkgdGV4dC10ZXh0LXRlcnRpYXJ5Jyl9PgogICAgICAgICAgICAgICAgICAgICAge3JlYy5vd25lZCA/IChyZWMub3duZWRfcXR5ICsgJ3ggb3duZWQnKSA6ICdNaXNzaW5nJ30KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgey8qIEFkZCBidXR0b24gKi99CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17ZSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGhhbmRsZUFkZFNpbmdsZShyZWMubmFtZSkgfX0KICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVk' +
'PXthZGRpbmdDYXJkcy5oYXMocmVjLm5hbWUpfQogICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgcHgtMi41IHB5LTEgdGV4dC14cyBmb250LW1lZGl1bSBiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgaG92ZXI6YmctYWNjZW50LWJsdWUtaG92ZXIgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCBmbGV4LXNocmluay0wIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIHthZGRpbmdDYXJkcy5oYXMocmVjLm5hbWUpID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogJysgQWRkJ30KICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICkKICAgICAgfSl9CgogICAgICB7LyogSG92ZXIgcHJldmlldyAqL30KICAgICAge2hvdmVyZWRDYXJkICYmIGhvdmVyZWRDYXJkLmltYWdlX3VybCAmJiAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZpeGVkIHRvcC0yMCByaWdodC04IHotNTAgcG9pbnRlci1ldmVudHMtbm9uZSBhbmltYXRlLWZhZGUtaW4iPgogICAgICAgICAgPGltZwogICAgICAgICAgICBzcmM9e2hvdmVyZWRDYXJkLmltYWdlX3VybH0KICAgICAgICAgICAgYWx0PXtob3ZlcmVkQ2FyZC5uYW1lfQogICAgICAgICAgICBjbGFzc05hbWU9InctWzI0NHB4XSByb3VuZGVkLXhsIHNoYWRvdy0yeGwgc2hhZG93LWJsYWNrLzYwIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkiCiAgICAgICAgICAvPgogICAgICAgIDwvZGl2PgogICAgICApfQogICAgPC9kaXY+CiAgKQp9CgovLyDilIDilIAgQ29sbGVjdGlvbiBSZWNvbW1lbmRhdGlvbnMgU3ViLXRhYiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gQ29sbGVjdGlvblJlY1RhYih7IGRlY2tJZCwgb25BZGRlZENhcmRzIH06IHsgZGVja0lkOiBudW1iZXI7IG9uQWRkZWRDYXJkczogKCkgPT4gdm9pZCB9KSB7CiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gdXNlU3RhdGU8Q29sbGVjdGlvblJlY3NSZXNwb25zZSB8IG51bGw+KG51bGwpCiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSkKICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpCiAgY29uc3QgW3NlbGVjdGVkQ2FyZHMsIHNldFNlbGVjdGVkQ2FyZHNdID0gdXNlU3RhdGU8U2V0PHN0cmluZz4+KG5ldyBTZXQoKSkKICBjb25zdCBbYWRkaW5nQ2FyZHMsIHNldEFkZGluZ0NhcmRzXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpCiAgY29uc3QgW2J1bGtBZGRpbmcsIHNldEJ1bGtBZGRpbmddID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgW2NvbGxhcHNlZEdyb3Vwcywgc2V0Q29sbGFwc2VkR3JvdXBzXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihuZXcgU2V0KCkpCgogIGFzeW5jIGZ1bmN0aW9uIGZldGNoUmVjcygpIHsKICAgIHNldExvYWRpbmcodHJ1ZSkKICAgIHNldEVycm9yKG51bGwpCiAgICB0cnkgewogICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWNrc0FwaS5nZXRDb2xsZWN0aW9uUmVjcyhkZWNrSWQpCiAgICAgIHNldERhdGEocmVzdWx0KQogICAgfSBjYXRjaCAoZTogYW55KSB7CiAgICAgIHNldEVycm9yKGU/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsb2FkIGNvbGxlY3Rpb24gcmVjb21tZW5kYXRpb25zJykKICAgIH0KICAgIHNldExvYWRpbmcoZmFsc2UpCiAgfQoKICB1c2VFZmZlY3QoKCkgPT4geyBmZXRjaFJlY3MoKSB9LCBbZGVja0lkXSkKCiAgZnVuY3Rpb24gdG9nZ2xlU2VsZWN0KG5hbWU6IHN0cmluZykgewogICAgc2V0U2VsZWN0ZWRDYXJkcyhwcmV2ID0+IHsKICAgICAgY29uc3QgbmV4dCA9IG5ldyBTZXQocHJldikKICAgICAgaWYgKG5leHQuaGFzKG5hbWUpKSBuZXh0LmRlbGV0ZShuYW1lKQogICAgICBlbHNlIG5leHQuYWRkKG5hbWUpCiAgICAgIHJldHVybiBuZXh0CiAgICB9KQogIH0KCiAgZnVuY3Rpb24gc2VsZWN0QWxsKCkgewogICAgaWYgKCFkYXRhKSByZXR1cm4KICAgIGNvbnN0IGFsbCA9IG5ldyBTZXQ8c3RyaW5nPigpCiAgICBPYmplY3QudmFsdWVzKGRhdGEuZ3JvdXBlZCkuZmxhdCgpLmZv' +
'ckVhY2goYyA9PiBhbGwuYWRkKGMubmFtZSkpCiAgICBzZXRTZWxlY3RlZENhcmRzKGFsbCkKICB9CgogIGZ1bmN0aW9uIHNlbGVjdE5vbmUoKSB7IHNldFNlbGVjdGVkQ2FyZHMobmV3IFNldCgpKSB9CgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUFkZFNpbmdsZShuYW1lOiBzdHJpbmcpIHsKICAgIHNldEFkZGluZ0NhcmRzKHByZXYgPT4gbmV3IFNldChwcmV2KS5hZGQobmFtZSkpCiAgICB0cnkgewogICAgICBhd2FpdCBkZWNrc0FwaS5idWxrQWRkUmVjb21tZW5kZWQoZGVja0lkLCBbbmFtZV0pCiAgICAgIG9uQWRkZWRDYXJkcygpCiAgICAgIC8vIFJlbW92ZSBmcm9tIGdyb3VwaW5ncwogICAgICBpZiAoZGF0YSkgewogICAgICAgIGNvbnN0IG5ld0dyb3VwZWQgPSB7IC4uLmRhdGEuZ3JvdXBlZCB9CiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobmV3R3JvdXBlZCkpIHsKICAgICAgICAgIG5ld0dyb3VwZWRba2V5XSA9IG5ld0dyb3VwZWRba2V5XS5maWx0ZXIoYyA9PiBjLm5hbWUgIT09IG5hbWUpCiAgICAgICAgICBpZiAobmV3R3JvdXBlZFtrZXldLmxlbmd0aCA9PT0gMCkgZGVsZXRlIG5ld0dyb3VwZWRba2V5XQogICAgICAgIH0KICAgICAgICBzZXREYXRhKHsgLi4uZGF0YSwgZ3JvdXBlZDogbmV3R3JvdXBlZCwgdG90YWw6IGRhdGEudG90YWwgLSAxIH0pCiAgICAgIH0KICAgICAgc2VsZWN0ZWRDYXJkcy5kZWxldGUobmFtZSkKICAgICAgc2V0U2VsZWN0ZWRDYXJkcyhuZXcgU2V0KHNlbGVjdGVkQ2FyZHMpKQogICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgICBzZXRBZGRpbmdDYXJkcyhwcmV2ID0+IHsgY29uc3QgbiA9IG5ldyBTZXQocHJldik7IG4uZGVsZXRlKG5hbWUpOyByZXR1cm4gbiB9KQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQnVsa0FkZCgpIHsKICAgIGlmIChzZWxlY3RlZENhcmRzLnNpemUgPT09IDApIHJldHVybgogICAgc2V0QnVsa0FkZGluZyh0cnVlKQogICAgdHJ5IHsKICAgICAgYXdhaXQgZGVja3NBcGkuYnVsa0FkZFJlY29tbWVuZGVkKGRlY2tJZCwgQXJyYXkuZnJvbShzZWxlY3RlZENhcmRzKSkKICAgICAgb25BZGRlZENhcmRzKCkKICAgICAgaWYgKGRhdGEpIHsKICAgICAgICBjb25zdCBuZXdHcm91cGVkID0geyAuLi5kYXRhLmdyb3VwZWQgfQogICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG5ld0dyb3VwZWQpKSB7CiAgICAgICAgICBuZXdHcm91cGVkW2tleV0gPSBuZXdHcm91cGVkW2tleV0uZmlsdGVyKGMgPT4gIXNlbGVjdGVkQ2FyZHMuaGFzKGMubmFtZSkpCiAgICAgICAgICBpZiAobmV3R3JvdXBlZFtrZXldLmxlbmd0aCA9PT0gMCkgZGVsZXRlIG5ld0dyb3VwZWRba2V5XQogICAgICAgIH0KICAgICAgICBzZXREYXRhKHsgLi4uZGF0YSwgZ3JvdXBlZDogbmV3R3JvdXBlZCwgdG90YWw6IGRhdGEudG90YWwgLSBzZWxlY3RlZENhcmRzLnNpemUgfSkKICAgICAgfQogICAgICBzZXRTZWxlY3RlZENhcmRzKG5ldyBTZXQoKSkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogICAgc2V0QnVsa0FkZGluZyhmYWxzZSkKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZUdyb3VwKGdyb3VwTmFtZTogc3RyaW5nKSB7CiAgICBzZXRDb2xsYXBzZWRHcm91cHMocHJldiA9PiB7CiAgICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHByZXYpCiAgICAgIGlmIChuZXh0Lmhhcyhncm91cE5hbWUpKSBuZXh0LmRlbGV0ZShncm91cE5hbWUpCiAgICAgIGVsc2UgbmV4dC5hZGQoZ3JvdXBOYW1lKQogICAgICByZXR1cm4gbmV4dAogICAgfSkKICB9CgogIGlmIChsb2FkaW5nKSB7CiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtNDAiPjxTcGlubmVyIHNpemU9ImxnIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+PC9kaXY+CiAgfQoKICBpZiAoZXJyb3IpIHsKICAgIHJldHVybiAoCiAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1hY2NlbnQtcmVkLzEwIGJvcmRlciBib3JkZXItYWNjZW50LXJlZC8yMCByb3VuZGVkLXhsIHAtNSB0ZXh0LWNlbnRlciI+CiAgICAgICAgPFhDaXJjbGUgY2xhc3NOYW1lPSJ3LTYgaC02IHRleHQtYWNjZW50LXJlZCBteC1hdXRvIG1iLTIiIC8+CiAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtYWNjZW50LXJlZCBmb250LW1lZGl1bSI+e2Vycm9yfTwvcD4KICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2ZldGNoUmVjc30gY2xhc3NOYW1lPSJtdC0zIHB4LTQgcHkt' +
'MiB0ZXh0LXhzIGZvbnQtbWVkaXVtIGJnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC1zZWNvbmRhcnkgcm91bmRlZC1sZyBob3ZlcjpiZy1iZy1ob3ZlciBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzIj4KICAgICAgICAgIFJldHJ5CiAgICAgICAgPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgKQogIH0KCiAgaWYgKCFkYXRhIHx8IGRhdGEudG90YWwgPT09IDApIHsKICAgIHJldHVybiA8RW1wdHlTdGF0ZSBpY29uPXtMaWJyYXJ5fSB0aXRsZT0iTm8gY29sbGVjdGlvbiBtYXRjaGVzIiBkZXNjcmlwdGlvbj0iTm8gY2FyZHMgaW4geW91ciBjb2xsZWN0aW9uIG1hdGNoIHRoaXMgZGVjaydzIG5lZWRzLiIgLz4KICB9CgogIGNvbnN0IHR5cGVPcmRlciA9IFsnQ3JlYXR1cmUnLCAnSW5zdGFudCcsICdTb3JjZXJ5JywgJ0FydGlmYWN0JywgJ0VuY2hhbnRtZW50JywgJ1BsYW5lc3dhbGtlcicsICdMYW5kJywgJ090aGVyJ10KICBjb25zdCBzb3J0ZWRUeXBlcyA9IE9iamVjdC5rZXlzKGRhdGEuZ3JvdXBlZCkuc29ydCgoYSwgYikgPT4gewogICAgY29uc3QgaWEgPSB0eXBlT3JkZXIuaW5kZXhPZihhKQogICAgY29uc3QgaWIgPSB0eXBlT3JkZXIuaW5kZXhPZihiKQogICAgcmV0dXJuIChpYSA9PT0gLTEgPyA5OSA6IGlhKSAtIChpYiA9PT0gLTEgPyA5OSA6IGliKQogIH0pCgogIHJldHVybiAoCiAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS00Ij4KICAgICAgey8qIFNob3J0ZmFsbCBhbGVydCAqL30KICAgICAge2RhdGEuc2hvcnRmYWxsX3R5cGVzLmxlbmd0aCA+IDAgJiYgKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLXN0YXJ0IGdhcC0zIGJnLWFjY2VudC1ibHVlLzggYm9yZGVyIGJvcmRlci1hY2NlbnQtYmx1ZS8yMCByb3VuZGVkLXhsIHB4LTQgcHktMyI+CiAgICAgICAgICA8TGlnaHRidWxiIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LWFjY2VudC1ibHVlIG10LTAuNSBmbGV4LXNocmluay0wIiAvPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtYWNjZW50LWJsdWUiPkRlY2sgbmVlZHMgbW9yZTo8L3A+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGZsZXgtd3JhcCBnYXAtMS41IG10LTEiPgogICAgICAgICAgICAgIHtkYXRhLnNob3J0ZmFsbF90eXBlcy5tYXAodCA9PiAoCiAgICAgICAgICAgICAgICA8c3BhbiBrZXk9e3R9IGNsYXNzTmFtZT0idGV4dC1bMTBweF0gZm9udC1tZWRpdW0gcHgtMiBweS0wLjUgcm91bmRlZCBiZy1hY2NlbnQtYmx1ZS8xNSB0ZXh0LWFjY2VudC1ibHVlIGJvcmRlciBib3JkZXItYWNjZW50LWJsdWUvMjUiPnt0fTwvc3Bhbj4KICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgKX0KCiAgICAgIHsvKiBTZWxlY3Rpb24gdG9vbGJhciAqL30KICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHB4LTQgcHktMyI+CiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIj4KICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkiPlNlbGVjdDo8L3NwYW4+CiAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e3NlbGVjdEFsbH0gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtYWNjZW50LWJsdWUgaG92ZXI6dW5kZXJsaW5lIj5BbGw8L2J1dHRvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC10ZXh0LXRlcnRpYXJ5Ij4vPC9zcGFuPgogICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtzZWxlY3ROb25lfSBjbGFzc05hbWU9InRleHQteHMgdGV4dC1hY2NlbnQtYmx1ZSBob3Zlcjp1bmRlcmxpbmUiPk5vbmU8L2J1dHRvbj4KICAgICAgICAgIHtzZWxlY3RlZENhcmRzLnNpemUgPiAwICYmICgKICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkgbWwtMiI+KHtzZWxlY3RlZENhcmRzLnNpemV9IHNlbGVjdGVkKTwvc3Bhbj4KICAgICAgICAgICl9CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGJ1dHRvbgogICAgICAgICAgb25DbGljaz17aGFuZGxlQnVsa0FkZH0KICAgICAgICAgIGRpc2FibGVkPXtzZWxlY3RlZENhcmRzLnNpemUgPT09' +
'IDAgfHwgYnVsa0FkZGluZ30KICAgICAgICAgIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSBiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHJvdW5kZWQtbGcgaG92ZXI6YmctYWNjZW50LWJsdWUtaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMgZGlzYWJsZWQ6b3BhY2l0eS00MCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQiCiAgICAgICAgPgogICAgICAgICAge2J1bGtBZGRpbmcgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8U2hvcHBpbmdDYXJ0IGNsYXNzTmFtZT0idy0zLjUgaC0zLjUiIC8+fQogICAgICAgICAgQWRkIHtzZWxlY3RlZENhcmRzLnNpemUgPiAwID8gc2VsZWN0ZWRDYXJkcy5zaXplIDogJyd9IHRvIERlY2sKICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICB7LyogR3JvdXBlZCBjYXJkcyAqL30KICAgICAge3NvcnRlZFR5cGVzLm1hcCh0eXBlID0+IHsKICAgICAgICBjb25zdCBjYXJkcyA9IGRhdGEuZ3JvdXBlZFt0eXBlXQogICAgICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gY29sbGFwc2VkR3JvdXBzLmhhcyh0eXBlKQogICAgICAgIGNvbnN0IGlzU2hvcnRmYWxsID0gZGF0YS5zaG9ydGZhbGxfdHlwZXMuaW5jbHVkZXModHlwZSkKICAgICAgICByZXR1cm4gKAogICAgICAgICAgPGRpdiBrZXk9e3R5cGV9IGNsYXNzTmFtZT17J2JnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBvdmVyZmxvdy1oaWRkZW4gJyArIChpc1Nob3J0ZmFsbCA/ICdib3JkZXItYWNjZW50LWJsdWUvMzAnIDogJ2JvcmRlci1ib3JkZXItcHJpbWFyeScpfT4KICAgICAgICAgICAgey8qIEdyb3VwIGhlYWRlciAqL30KICAgICAgICAgICAgPGJ1dHRvbgogICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRvZ2dsZUdyb3VwKHR5cGUpfQogICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC00IHB5LTMgaG92ZXI6YmctYmctaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMiCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj57dHlwZX08L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij4oe2NhcmRzLmxlbmd0aH0pPC9zcGFuPgogICAgICAgICAgICAgICAge2lzU2hvcnRmYWxsICYmIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1bMTBweF0gZm9udC1tZWRpdW0gcHgtMS41IHB5LTAuNSByb3VuZGVkIGJnLWFjY2VudC1ibHVlLzE1IHRleHQtYWNjZW50LWJsdWUgYm9yZGVyIGJvcmRlci1hY2NlbnQtYmx1ZS8yNSI+U2hvcnRmYWxsPC9zcGFuPn0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICB7aXNDb2xsYXBzZWQgPyA8Q2hldnJvbkRvd24gY2xhc3NOYW1lPSJ3LTQgaC00IHRleHQtdGV4dC10ZXJ0aWFyeSIgLz4gOiA8Q2hldnJvblVwIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LXRleHQtdGVydGlhcnkiIC8+fQogICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgey8qIENhcmQgbGlzdCAqL30KICAgICAgICAgICAgeyFpc0NvbGxhcHNlZCAmJiAoCiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImJvcmRlci10IGJvcmRlci1ib3JkZXItcHJpbWFyeSBkaXZpZGUteSBkaXZpZGUtYm9yZGVyLXByaW1hcnkiPgogICAgICAgICAgICAgICAge2NhcmRzLm1hcChyZWMgPT4gKAogICAgICAgICAgICAgICAgICA8ZGl2IGtleT17cmVjLnNjcnlmYWxsX2lkfSBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIHB4LTQgcHktMi41IGhvdmVyOmJnLWJnLWhvdmVyIHRyYW5zaXRpb24tY29sb3JzIGdyb3VwIj4KICAgICAgICAgICAgICAgICAgICB7LyogQ2hlY2tib3ggKi99CiAgICAgICAgICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjaGVja2JveCIKICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3NlbGVjdGVkQ2FyZHMuaGFzKHJlYy5uYW1lKX0KICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoKSA9PiB0b2dnbGVTZWxlY3QocmVjLm5hbWUpfQogICAgICAgICAgICAgICAgICAgICAgY2xhc3NO' +
'YW1lPSJyb3VuZGVkIGJvcmRlci1ib3JkZXItcHJpbWFyeSBiZy1iZy10ZXJ0aWFyeSB0ZXh0LWFjY2VudC1ibHVlIGZvY3VzOnJpbmctYWNjZW50LWJsdWUvMzAgdy0zLjUgaC0zLjUgZmxleC1zaHJpbmstMCIKICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICAgIHsvKiBDYXJkIGltYWdlIG1pbmkgKi99CiAgICAgICAgICAgICAgICAgICAge3JlYy5pbWFnZV91cmwgJiYgKAogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9InctOCBoLTExIHJvdW5kZWQgb3ZlcmZsb3ctaGlkZGVuIGJnLWJnLXRlcnRpYXJ5IGZsZXgtc2hyaW5rLTAiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz17cmVjLmltYWdlX3VybH0gYWx0PXtyZWMubmFtZX0gY2xhc3NOYW1lPSJ3LWZ1bGwgaC1mdWxsIG9iamVjdC1jb3ZlciIgbG9hZGluZz0ibGF6eSIgLz4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICl9CiAgICAgICAgICAgICAgICAgICAgey8qIENhcmQgaW5mbyAqL30KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIG1pbi13LTAiPgogICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtdGV4dC1wcmltYXJ5IHRydW5jYXRlIj57cmVjLm5hbWV9PC9wPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgbXQtMC41Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LVsxMHB4XSB0ZXh0LXRleHQtdGVydGlhcnkiPntyZWMuY21jfSBDTUM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIHtyZWMucm9sZXMubGVuZ3RoID4gMCAmJiByZWMucm9sZXMubWFwKHIgPT4gPFJvbGVCYWRnZSBrZXk9e3J9IHJvbGU9e3J9IC8+KX0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIHsvKiBTY29yZSAqL30KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC1hY2NlbnQtdGVhbCBmb250LW1lZGl1bSBmbGV4LXNocmluay0wIj5TY29yZToge3JlYy5zY29yZX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgey8qIE93bmVkIHF0eSAqL30KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgcHgtMiBweS0wLjUgcm91bmRlZCBiZy1hY2NlbnQtZ3JlZW4vMTUgdGV4dC1hY2NlbnQtZ3JlZW4gZmxleC1zaHJpbmstMCI+e3JlYy5vd25lZF9xdHl9eDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICB7LyogQWRkIGJ1dHRvbiAqL30KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtlID0+IHsgZS5zdG9wUHJvcGFnYXRpb24oKTsgaGFuZGxlQWRkU2luZ2xlKHJlYy5uYW1lKSB9fQogICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2FkZGluZ0NhcmRzLmhhcyhyZWMubmFtZSl9CiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9Im9wYWNpdHktMCBncm91cC1ob3ZlcjpvcGFjaXR5LTEwMCBweC0yLjUgcHktMSB0ZXh0LXhzIGZvbnQtbWVkaXVtIGJnLWFjY2VudC1ibHVlIHRleHQtd2hpdGUgcm91bmRlZC1sZyBob3ZlcjpiZy1hY2NlbnQtYmx1ZS1ob3ZlciB0cmFuc2l0aW9uLWFsbCBkaXNhYmxlZDpvcGFjaXR5LTUwIGZsZXgtc2hyaW5rLTAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAge2FkZGluZ0NhcmRzLmhhcyhyZWMubmFtZSkgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiAnKyBBZGQnfQogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICkpfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICApfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgKQogICAgICB9KX0KICAgIDwvZGl2PgogICkKfQoKLy8g4pSA4pSAIERlY2sgRGV0YWlsIFZpZXcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIERlY2tEZXRhaWwoeyBkZWNrLCBvbkJhY2sgfTogeyBkZWNrOiBEZWNrOyBv' +
'bkJhY2s6ICgpID0+IHZvaWQgfSkgewogIGNvbnN0IFtjYXJkcywgc2V0Q2FyZHNdID0gdXNlU3RhdGU8RGVja0NhcmRbXT4oW10pCiAgY29uc3QgW2FuYWx5c2lzLCBzZXRBbmFseXNpc10gPSB1c2VTdGF0ZTxEZWNrQW5hbHlzaXMgfCBudWxsPihudWxsKQogIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpCiAgY29uc3QgW3RhYiwgc2V0VGFiXSA9IHVzZVN0YXRlPCdjYXJkcycgfCAnYW5hbHlzaXMnIHwgJ3JlY3MnPignY2FyZHMnKQogIGNvbnN0IFtyZWNTb3VyY2UsIHNldFJlY1NvdXJjZV0gPSB1c2VTdGF0ZTwnZWRocmVjJyB8ICdjb2xsZWN0aW9uJz4oJ2VkaHJlYycpCiAgY29uc3QgW2FkZGluZ0NhcmQsIHNldEFkZGluZ0NhcmRdID0gdXNlU3RhdGUoJycpCiAgY29uc3QgW2J1bGtUZXh0LCBzZXRCdWxrVGV4dF0gPSB1c2VTdGF0ZSgnJykKICBjb25zdCBbc2hvd0J1bGssIHNldFNob3dCdWxrXSA9IHVzZVN0YXRlKGZhbHNlKQoKICBhc3luYyBmdW5jdGlvbiBmZXRjaEFsbCgpIHsKICAgIHNldExvYWRpbmcodHJ1ZSkKICAgIHRyeSB7CiAgICAgIGNvbnN0IFtjLCBhXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICBkZWNrc0FwaS5nZXREZWNrQ2FyZHMoZGVjay5pZCksCiAgICAgICAgZGVja3NBcGkuZ2V0RGVja0FuYWx5c2lzKGRlY2suaWQpLAogICAgICBdKQogICAgICBzZXRDYXJkcyhjKQogICAgICBzZXRBbmFseXNpcyhhKQogICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgICBzZXRMb2FkaW5nKGZhbHNlKQogIH0KCiAgdXNlRWZmZWN0KCgpID0+IHsgZmV0Y2hBbGwoKSB9LCBbZGVjay5pZF0pCgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUFkZENhcmQoKSB7CiAgICBpZiAoIWFkZGluZ0NhcmQudHJpbSgpKSByZXR1cm4KICAgIHRyeSB7CiAgICAgIGF3YWl0IGRlY2tzQXBpLmFkZENhcmRUb0RlY2soZGVjay5pZCwgeyBuYW1lOiBhZGRpbmdDYXJkLnRyaW0oKSB9KQogICAgICBzZXRBZGRpbmdDYXJkKCcnKQogICAgICBmZXRjaEFsbCgpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUJ1bGtBZGQoKSB7CiAgICBpZiAoIWJ1bGtUZXh0LnRyaW0oKSkgcmV0dXJuCiAgICBjb25zdCBjYXJkTGluZXMgPSBidWxrVGV4dC5zcGxpdCgnXG4nKS5maWx0ZXIobCA9PiBsLnRyaW0oKSkKICAgIGNvbnN0IGNhcmRQYXJzZWQgPSBjYXJkTGluZXMubWFwKGwgPT4gewogICAgICBjb25zdCBtYXRjaCA9IGwubWF0Y2goL14oXGQrKXg/XHMrKC4rKSQvKQogICAgICByZXR1cm4gbWF0Y2ggPyB7IG5hbWU6IG1hdGNoWzJdLnRyaW0oKSwgcXVhbnRpdHk6IE51bWJlcihtYXRjaFsxXSkgfSA6IHsgbmFtZTogbC50cmltKCkgfQogICAgfSkKICAgIHRyeSB7CiAgICAgIGF3YWl0IGRlY2tzQXBpLmJ1bGtBZGRDYXJkcyhkZWNrLmlkLCBjYXJkUGFyc2VkKQogICAgICBzZXRCdWxrVGV4dCgnJykKICAgICAgc2V0U2hvd0J1bGsoZmFsc2UpCiAgICAgIGZldGNoQWxsKCkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRXhwb3J0VG9TaW0oKSB7CiAgICB0cnkgewogICAgICBhd2FpdCBkZWNrc0FwaS5leHBvcnREZWNrVG9TaW0oZGVjay5pZCkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJzcGFjZS15LTUiPgogICAgICB7LyogSGVhZGVyICovfQogICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQiPgogICAgICAgIDxidXR0b24gb25DbGljaz17b25CYWNrfSBjbGFzc05hbWU9InAtMiByb3VuZGVkLWxnIGhvdmVyOmJnLWJnLWhvdmVyIHRleHQtdGV4dC1zZWNvbmRhcnkgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgPENoZXZyb25SaWdodCBjbGFzc05hbWU9InctNSBoLTUgcm90YXRlLTE4MCIgLz4KICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleC0xIj4KICAgICAgICAgIDxoMiBjbGFzc05hbWU9InRleHQteGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5Ij57ZGVjay5uYW1lfTwvaDI+CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMgbXQtMSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij57ZGVjay5jb21tYW5kZXJ9PC9zcGFuPgogICAgICAgICAgICA8Q29s' +
'b3JEb3RzIGNvbG9ycz17ZGVjay5jb2xvcl9pZGVudGl0eX0gLz4KICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSI+e2RlY2suY2FyZF9jb3VudH0gY2FyZHM8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LWFjY2VudC10ZWFsIj4ke2RlY2sudG90YWxfcHJpY2UudG9GaXhlZCgyKX08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2hhbmRsZUV4cG9ydFRvU2ltfQogICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSBiZy1iZy10ZXJ0aWFyeSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHJvdW5kZWQtbGcgaG92ZXI6YmctYmctaG92ZXIgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSB0cmFuc2l0aW9uLWNvbG9ycyI+CiAgICAgICAgICA8RG93bmxvYWQgY2xhc3NOYW1lPSJ3LTMuNSBoLTMuNSIgLz4KICAgICAgICAgIEV4cG9ydCB0byBTaW0KICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CgogICAgICB7LyogVGFicyAqL30KICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZ2FwLTEgYm9yZGVyLWIgYm9yZGVyLWJvcmRlci1wcmltYXJ5Ij4KICAgICAgICB7KFsnY2FyZHMnLCAnYW5hbHlzaXMnLCAncmVjcyddIGFzIGNvbnN0KS5tYXAodCA9PiAoCiAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgIGtleT17dH0KICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0VGFiKHQpfQogICAgICAgICAgICBjbGFzc05hbWU9e2BweC00IHB5LTIuNSB0ZXh0LXNtIGZvbnQtbWVkaXVtIGJvcmRlci1iLTIgdHJhbnNpdGlvbi1jb2xvcnMgY2FwaXRhbGl6ZSAkewogICAgICAgICAgICAgIHRhYiA9PT0gdAogICAgICAgICAgICAgICAgPyAnYm9yZGVyLWFjY2VudC1ibHVlIHRleHQtYWNjZW50LWJsdWUnCiAgICAgICAgICAgICAgICA6ICdib3JkZXItdHJhbnNwYXJlbnQgdGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnknCiAgICAgICAgICAgIH1gfQogICAgICAgICAgPgogICAgICAgICAgICB7dCA9PT0gJ3JlY3MnID8gJ1JlY29tbWVuZGF0aW9ucycgOiB0fQogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgKSl9CiAgICAgIDwvZGl2PgoKICAgICAge2xvYWRpbmcgPyAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtNDAiPjxTcGlubmVyIHNpemU9ImxnIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+PC9kaXY+CiAgICAgICkgOiB0YWIgPT09ICdjYXJkcycgPyAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9InNwYWNlLXktNCI+CiAgICAgICAgICB7LyogQWRkIGNhcmQgKi99CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIiPgogICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJBZGQgY2FyZCBieSBuYW1lLi4uIgogICAgICAgICAgICAgIHZhbHVlPXthZGRpbmdDYXJkfQogICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldEFkZGluZ0NhcmQoZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICAgIG9uS2V5RG93bj17ZSA9PiBlLmtleSA9PT0gJ0VudGVyJyAmJiBoYW5kbGVBZGRDYXJkKCl9CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJmbGV4LTEgcHgtNCBweS0yLjUgYmctYmctc2Vjb25kYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IHBsYWNlaG9sZGVyOnRleHQtdGV4dC10ZXJ0aWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9e2hhbmRsZUFkZENhcmR9CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJweC00IHB5LTIuNSBiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHRleHQtc20gZm9udC1tZWRpdW0gcm91bmRlZC1sZyBob3ZlcjpiZy1hY2NlbnQtYmx1ZS1ob3ZlciB0cmFuc2l0aW9uLWNvbG9ycyI+CiAgICAgICAgICAgICAgQWRkCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldFNob3dCdWxrKCFzaG93QnVs' +
'ayl9CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJweC0zIHB5LTIuNSBiZy1iZy10ZXJ0aWFyeSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHRleHQtc20gcm91bmRlZC1sZyBob3ZlcjpiZy1iZy1ob3ZlciBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHRyYW5zaXRpb24tY29sb3JzIj4KICAgICAgICAgICAgICA8TGF5ZXJzIGNsYXNzTmFtZT0idy00IGgtNCIgLz4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIHtzaG93QnVsayAmJiAoCiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHAtNCBhbmltYXRlLWZhZGUtaW4gc3BhY2UteS0zIj4KICAgICAgICAgICAgICA8dGV4dGFyZWEKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXsiMXggU29sIFJpbmdcbjF4IENvbW1hbmQgVG93ZXJcbjJ4IENvdW50ZXJzcGVsbCJ9CiAgICAgICAgICAgICAgICB2YWx1ZT17YnVsa1RleHR9CiAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXRCdWxrVGV4dChlLnRhcmdldC52YWx1ZSl9CiAgICAgICAgICAgICAgICByb3dzPXs2fQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtNCBweS0zIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IHBsYWNlaG9sZGVyOnRleHQtdGV4dC10ZXJ0aWFyeSBmb250LW1vbm8gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCByZXNpemUtbm9uZSIKICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17aGFuZGxlQnVsa0FkZH0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0icHgtNCBweS0yIGJnLWFjY2VudC1ibHVlIHRleHQtd2hpdGUgdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLWxnIGhvdmVyOmJnLWFjY2VudC1ibHVlLWhvdmVyIHRyYW5zaXRpb24tY29sb3JzIj4KICAgICAgICAgICAgICAgIEJ1bGsgQWRkCiAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgKX0KICAgICAgICAgIDxEZWNrQ2FyZExpc3QgZGVja0lkPXtkZWNrLmlkfSBjYXJkcz17Y2FyZHN9IG9uVXBkYXRlPXtmZXRjaEFsbH0gLz4KICAgICAgICA8L2Rpdj4KICAgICAgKSA6IHRhYiA9PT0gJ2FuYWx5c2lzJyAmJiBhbmFseXNpcyA/ICgKICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBnYXAtNSI+CiAgICAgICAgICB7LyogU3RhdHMgKi99CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTUgc3BhY2UteS00Ij4KICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIj4KICAgICAgICAgICAgICA8QmFyQ2hhcnQzIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LWFjY2VudC1ibHVlIiAvPgogICAgICAgICAgICAgIERlY2sgU3RhdHMKICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTMiPgogICAgICAgICAgICAgIHtbCiAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQ2FyZHMnLCB2YWx1ZTogYW5hbHlzaXMuY2FyZF9jb3VudCB9LAogICAgICAgICAgICAgICAgeyBsYWJlbDogJ0xhbmRzJywgdmFsdWU6IGFuYWx5c2lzLmxhbmRfY291bnQgfSwKICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdDcmVhdHVyZXMnLCB2YWx1ZTogYW5hbHlzaXMuY3JlYXR1cmVfY291bnQgfSwKICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdOb24tQ3JlYXR1cmUnLCB2YWx1ZTogYW5hbHlzaXMubm9uY3JlYXR1cmVfY291bnQgfSwKICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdBdmcgQ01DJywgdmFsdWU6IGFuYWx5c2lzLmF2Z19jbWMudG9GaXhlZCgyKSB9LAogICAgICAgICAgICAgICAgeyBsYWJlbDogJ093bmVkJywgdmFsdWU6IGAke2FuYWx5c2lzLm93bmVkX2NvdW50fSAvICR7YW5hbHlzaXMuY2FyZF9jb3VudH1gIH0sCiAgICAgICAgICAgICAgXS5tYXAoc3RhdCA9PiAoCiAgICAgICAgICAgICAgICA8ZGl2IGtleT17c3RhdC5sYWJlbH0gY2xhc3NO' +
'YW1lPSJweC0zIHB5LTIgcm91bmRlZC1sZyBiZy1iZy10ZXJ0aWFyeSI+CiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkiPntzdGF0LmxhYmVsfTwvcD4KICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LWxnIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSI+e3N0YXQudmFsdWV9PC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgKSl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICB7LyogTWFuYSBDdXJ2ZSAqL30KICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHAtNSBzcGFjZS15LTQiPgogICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPk1hbmEgQ3VydmU8L2gzPgogICAgICAgICAgICA8TWFuYUN1cnZlQ2hhcnQgYW5hbHlzaXM9e2FuYWx5c2lzfSAvPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICB7LyogVHlwZSBEaXN0cmlidXRpb24gKi99CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTUgc3BhY2UteS0zIG1kOmNvbC1zcGFuLTIiPgogICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPlR5cGUgRGlzdHJpYnV0aW9uPC9oMz4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggZmxleC13cmFwIGdhcC0yIj4KICAgICAgICAgICAgICB7T2JqZWN0LmVudHJpZXMoYW5hbHlzaXMudHlwZV9kaXN0cmlidXRpb24pLm1hcCgoW3R5cGUsIGNvdW50XSkgPT4gKAogICAgICAgICAgICAgICAgPHNwYW4ga2V5PXt0eXBlfSBjbGFzc05hbWU9InB4LTMgcHktMS41IGJnLWJnLXRlcnRpYXJ5IHJvdW5kZWQtbGcgdGV4dC14cyB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij4KICAgICAgICAgICAgICAgICAge3R5cGV9OiA8c3BhbiBjbGFzc05hbWU9ImZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPntjb3VudH08L3NwYW4+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgKSl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICkgOiB0YWIgPT09ICdyZWNzJyA/ICgKICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS00Ij4KICAgICAgICAgIHsvKiBTdWItdGFiIHRvZ2dsZSAqL30KICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSBiZy1iZy10ZXJ0aWFyeSByb3VuZGVkLWxnIHAtMSB3LWZpdCI+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRSZWNTb3VyY2UoJ2VkaHJlYycpfQogICAgICAgICAgICAgIGNsYXNzTmFtZT17J2ZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtMy41IHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkLW1kIHRyYW5zaXRpb24tYWxsICcgKwogICAgICAgICAgICAgICAgKHJlY1NvdXJjZSA9PT0gJ2VkaHJlYycKICAgICAgICAgICAgICAgICAgPyAnYmctYWNjZW50LWJsdWUgdGV4dC13aGl0ZSBzaGFkb3ctc20nCiAgICAgICAgICAgICAgICAgIDogJ3RleHQtdGV4dC10ZXJ0aWFyeSBob3Zlcjp0ZXh0LXRleHQtc2Vjb25kYXJ5Jyl9CiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8R2xvYmUgY2xhc3NOYW1lPSJ3LTMuNSBoLTMuNSIgLz4KICAgICAgICAgICAgICBFREhSRUMKICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRSZWNTb3VyY2UoJ2NvbGxlY3Rpb24nKX0KICAgICAgICAgICAgICBjbGFzc05hbWU9eydmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHB4LTMuNSBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZC1tZCB0cmFuc2l0aW9uLWFsbCAnICsKICAgICAgICAgICAgICAgIChyZWNTb3VyY2UgPT09ICdjb2xsZWN0aW9uJwogICAgICAgICAgICAgICAgICA/ICdiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHNoYWRvdy1zbScKICAgICAgICAgICAgICAgICAgOiAndGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnknKX0KICAgICAgICAgICAg' +
'PgogICAgICAgICAgICAgIDxMaWJyYXJ5IGNsYXNzTmFtZT0idy0zLjUgaC0zLjUiIC8+CiAgICAgICAgICAgICAgRnJvbSBDb2xsZWN0aW9uCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgey8qIFN1Yi10YWIgY29udGVudCAqL30KICAgICAgICAgIHtyZWNTb3VyY2UgPT09ICdlZGhyZWMnID8gKAogICAgICAgICAgICA8RWRoUmVjVGFiIGRlY2tJZD17ZGVjay5pZH0gb25BZGRlZENhcmRzPXtmZXRjaEFsbH0gLz4KICAgICAgICAgICkgOiAoCiAgICAgICAgICAgIDxDb2xsZWN0aW9uUmVjVGFiIGRlY2tJZD17ZGVjay5pZH0gb25BZGRlZENhcmRzPXtmZXRjaEFsbH0gLz4KICAgICAgICAgICl9CiAgICAgICAgPC9kaXY+CiAgICAgICkgOiBudWxsfQogICAgPC9kaXY+CiAgKQp9CgovLyDilIDilIAgTWFpbiBEZWNrcyBQYWdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApleHBvcnQgZnVuY3Rpb24gRGVja3NQYWdlKCkgewogIGNvbnN0IFtkZWNrcywgc2V0RGVja3NdID0gdXNlU3RhdGU8RGVja1tdPihbXSkKICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKQogIGNvbnN0IFtzZWxlY3RlZERlY2ssIHNldFNlbGVjdGVkRGVja10gPSB1c2VTdGF0ZTxEZWNrIHwgbnVsbD4obnVsbCkKICBjb25zdCBbc2hvd0NyZWF0ZSwgc2V0U2hvd0NyZWF0ZV0gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbbmV3RGVja05hbWUsIHNldE5ld0RlY2tOYW1lXSA9IHVzZVN0YXRlKCcnKQogIGNvbnN0IFtuZXdDb21tYW5kZXIsIHNldE5ld0NvbW1hbmRlcl0gPSB1c2VTdGF0ZSgnJykKICBjb25zdCBbY3JlYXRpbmcsIHNldENyZWF0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKQoKICBhc3luYyBmdW5jdGlvbiBmZXRjaERlY2tzKCkgewogICAgc2V0TG9hZGluZyh0cnVlKQogICAgdHJ5IHsKICAgICAgY29uc3QgZCA9IGF3YWl0IGRlY2tzQXBpLmxpc3REZWNrcygpCiAgICAgIHNldERlY2tzKGQpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldExvYWRpbmcoZmFsc2UpCiAgfQoKICB1c2VFZmZlY3QoKCkgPT4geyBmZXRjaERlY2tzKCkgfSwgW10pCgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNyZWF0ZSgpIHsKICAgIGlmICghbmV3RGVja05hbWUudHJpbSgpKSByZXR1cm4KICAgIHNldENyZWF0aW5nKHRydWUpCiAgICB0cnkgewogICAgICBjb25zdCBkZWNrID0gYXdhaXQgZGVja3NBcGkuY3JlYXRlRGVjayh7IG5hbWU6IG5ld0RlY2tOYW1lLnRyaW0oKSwgY29tbWFuZGVyOiBuZXdDb21tYW5kZXIudHJpbSgpIHx8IHVuZGVmaW5lZCB9KQogICAgICBzZXROZXdEZWNrTmFtZSgnJykKICAgICAgc2V0TmV3Q29tbWFuZGVyKCcnKQogICAgICBzZXRTaG93Q3JlYXRlKGZhbHNlKQogICAgICBzZXRTZWxlY3RlZERlY2soZGVjaykKICAgICAgZmV0Y2hEZWNrcygpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldENyZWF0aW5nKGZhbHNlKQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGVsZXRlKGRlY2tJZDogbnVtYmVyKSB7CiAgICB0cnkgewogICAgICBhd2FpdCBkZWNrc0FwaS5kZWxldGVEZWNrKGRlY2tJZCkKICAgICAgZmV0Y2hEZWNrcygpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICB9CgogIGlmIChzZWxlY3RlZERlY2spIHsKICAgIHJldHVybiAoCiAgICAgIDxkaXYgY2xhc3NOYW1lPSJwLTYiPgogICAgICAgIDxEZWNrRGV0YWlsIGRlY2s9e3NlbGVjdGVkRGVja30gb25CYWNrPXsoKSA9PiB7IHNldFNlbGVjdGVkRGVjayhudWxsKTsgZmV0Y2hEZWNrcygpIH19IC8+CiAgICAgIDwvZGl2PgogICAgKQogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJwLTYgc3BhY2UteS01Ij4KICAgICAgey8qIEhlYWRlciAqL30KICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxoMSBjbGFzc05hbWU9InRleHQtMnhsIGZvbnQtYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSI+RGVja3M8L2gxPgogICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMC41Ij57ZGVja3MubGVuZ3RofSBkZWNre2RlY2tzLmxlbmd0aCAhPT0g' +
'MSA/ICdzJyA6ICcnfTwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8YnV0dG9uCiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTaG93Q3JlYXRlKHRydWUpfQogICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC00IHB5LTIuNSBiZy1hY2NlbnQtYmx1ZSB0ZXh0LXdoaXRlIHRleHQtc20gZm9udC1tZWRpdW0gcm91bmRlZC1sZyBob3ZlcjpiZy1hY2NlbnQtYmx1ZS1ob3ZlciB0cmFuc2l0aW9uLWNvbG9ycyIKICAgICAgICA+CiAgICAgICAgICA8UGx1cyBjbGFzc05hbWU9InctNCBoLTQiIC8+CiAgICAgICAgICBOZXcgRGVjawogICAgICAgIDwvYnV0dG9uPgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBDcmVhdGUgZm9ybSAqL30KICAgICAge3Nob3dDcmVhdGUgJiYgKAogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJiZy1iZy1zZWNvbmRhcnkgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHAtNSBhbmltYXRlLWZhZGUtaW4gc3BhY2UteS0zIj4KICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iPgogICAgICAgICAgICA8aDMgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPkNyZWF0ZSBOZXcgRGVjazwvaDM+CiAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0U2hvd0NyZWF0ZShmYWxzZSl9IGNsYXNzTmFtZT0idGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnkiPgogICAgICAgICAgICAgIDxYIGNsYXNzTmFtZT0idy00IGgtNCIgLz4KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIGdhcC0zIj4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iRGVjayBuYW1lIgogICAgICAgICAgICAgIHZhbHVlPXtuZXdEZWNrTmFtZX0KICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXROZXdEZWNrTmFtZShlLnRhcmdldC52YWx1ZSl9CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJweC00IHB5LTIuNSBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBwbGFjZWhvbGRlcjp0ZXh0LXRleHQtdGVydGlhcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iQ29tbWFuZGVyIChvcHRpb25hbCkiCiAgICAgICAgICAgICAgdmFsdWU9e25ld0NvbW1hbmRlcn0KICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXROZXdDb21tYW5kZXIoZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICAgIGNsYXNzTmFtZT0icHgtNCBweS0yLjUgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgcGxhY2Vob2xkZXI6dGV4dC10ZXh0LXRlcnRpYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwiCiAgICAgICAgICAgIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxidXR0b24gb25DbGljaz17aGFuZGxlQ3JlYXRlfSBkaXNhYmxlZD17Y3JlYXRpbmd9CiAgICAgICAgICAgIGNsYXNzTmFtZT0icHgtNCBweS0yIGJnLWFjY2VudC1ibHVlIHRleHQtd2hpdGUgdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLWxnIGhvdmVyOmJnLWFjY2VudC1ibHVlLWhvdmVyIHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNTAiPgogICAgICAgICAgICB7Y3JlYXRpbmcgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiAnQ3JlYXRlJ30KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICApfQoKICAgICAgey8qIERlY2sgbGlzdCAqL30KICAgICAge2xvYWRpbmcgPyAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtNDAiPjxTcGlubmVyIHNpemU9ImxnIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+PC9kaXY+CiAgICAgICkgOiBkZWNr' +
'cy5sZW5ndGggPT09IDAgPyAoCiAgICAgICAgPEVtcHR5U3RhdGUgaWNvbj17TGF5ZXJzfSB0aXRsZT0iTm8gZGVja3MgeWV0IiBkZXNjcmlwdGlvbj0iQ3JlYXRlIHlvdXIgZmlyc3QgZGVjayB0byBnZXQgc3RhcnRlZC4iIC8+CiAgICAgICkgOiAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTEgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTMgZ2FwLTQiPgogICAgICAgICAge2RlY2tzLm1hcChkZWNrID0+ICgKICAgICAgICAgICAgPGRpdgogICAgICAgICAgICAgIGtleT17ZGVjay5pZH0KICAgICAgICAgICAgICBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgaG92ZXI6Ym9yZGVyLWJvcmRlci1zZWNvbmRhcnkgcC01IGN1cnNvci1wb2ludGVyIHRyYW5zaXRpb24tYWxsIGdyb3VwIgogICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkRGVjayhkZWNrKX0KICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBtYi0zIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJtaW4tdy0wIGZsZXgtMSI+CiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9InRleHQtYmFzZSBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IHRydW5jYXRlIGdyb3VwLWhvdmVyOnRleHQtYWNjZW50LWJsdWUgdHJhbnNpdGlvbi1jb2xvcnMiPntkZWNrLm5hbWV9PC9oMz4KICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMC41IHRydW5jYXRlIj57ZGVjay5jb21tYW5kZXJ9PC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2UgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBoYW5kbGVEZWxldGUoZGVjay5pZCkgfX0KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJvcGFjaXR5LTAgZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAgcC0xLjUgdGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtYWNjZW50LXJlZCB0cmFuc2l0aW9uLWFsbCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPFRyYXNoMiBjbGFzc05hbWU9InctMy41IGgtMy41IiAvPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMiPgogICAgICAgICAgICAgICAgICA8Q29sb3JEb3RzIGNvbG9ycz17ZGVjay5jb2xvcl9pZGVudGl0eX0gLz4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSI+e2RlY2suY2FyZF9jb3VudH0gY2FyZHM8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LWFjY2VudC10ZWFsIj4ke2RlY2sudG90YWxfcHJpY2UudG9GaXhlZCgyKX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgKSl9CiAgICAgICAgPC9kaXY+CiAgICAgICl9CiAgICA8L2Rpdj4KICApCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\src\pages\DecksPage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/pages/SimulatorPage.tsx (12,631 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JwppbXBvcnQgewogIEdhbWVwYWQyLCBQbGF5LCBXaWZpLCBXaWZpT2ZmLCBTZXR0aW5ncywKICBBbGVydENpcmNsZSwgVHJvcGh5LCBDbG9jaywgQnJhaW4KfSBmcm9tICdsdWNpZGUtcmVhY3QnCmltcG9ydCB7IFNwaW5uZXIsIFN0YXR1c0JhZGdlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21tb24nCmltcG9ydCB7IHNpbUFwaSwgbGFiQXBpIH0gZnJvbSAnLi4vYXBpJwppbXBvcnQgeyB1c2VQb2xsaW5nIH0gZnJvbSAnLi4vaG9va3MvdXNlUG9sbGluZycKaW1wb3J0IHR5cGUgeyBTaW1TdGF0dXMsIFNpbVJlc3VsdCwgRGVlcFNlZWtTdGF0dXMsIExhYkRlY2sgfSBmcm9tICcuLi90eXBlcycKaW1wb3J0IHsgQmFyQ2hhcnQsIEJhciwgWEF4aXMsIFlBeGlzLCBUb29sdGlwLCBSZXNwb25zaXZlQ29udGFpbmVyLCBDZWxsIH0gZnJvbSAncmVjaGFydHMnCgpleHBvcnQgZnVuY3Rpb24gU2ltdWxhdG9yUGFnZSgpIHsKICBjb25zdCBbZGVja3MsIHNldERlY2tzXSA9IHVzZVN0YXRlPExhYkRlY2tbXT4oW10pCiAgY29uc3QgW2RlY2tBLCBzZXREZWNrQV0gPSB1c2VTdGF0ZSgnJykKICBjb25zdCBbZGVja0IsIHNldERlY2tCXSA9IHVzZVN0YXRlKCcnKQogIGNvbnN0IFtnYW1lcywgc2V0R2FtZXNdID0gdXNlU3RhdGUoNTApCiAgY29uc3QgW3VzZURlZXBTZWVrLCBzZXRVc2VEZWVwU2Vla10gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbZGVlcFNlZWtEZWNrLCBzZXREZWVwU2Vla0RlY2tdID0gdXNlU3RhdGUoJycpCiAgY29uc3QgW2RzU3RhdHVzLCBzZXREc1N0YXR1c10gPSB1c2VTdGF0ZTxEZWVwU2Vla1N0YXR1cyB8IG51bGw+KG51bGwpCiAgY29uc3QgW3J1bm5pbmcsIHNldFJ1bm5pbmddID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgW3NpbUlkLCBzZXRTaW1JZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKQogIGNvbnN0IFtzaW1TdGF0dXMsIHNldFNpbVN0YXR1c10gPSB1c2VTdGF0ZTxTaW1TdGF0dXMgfCBudWxsPihudWxsKQogIGNvbnN0IFtyZXN1bHQsIHNldFJlc3VsdF0gPSB1c2VTdGF0ZTxTaW1SZXN1bHQgfCBudWxsPihudWxsKQogIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCkKICBjb25zdCBbc3RhcnRpbmcsIHNldFN0YXJ0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKQoKICAvLyBEUyBjb25maWcKICBjb25zdCBbc2hvd0RzQ29uZmlnLCBzZXRTaG93RHNDb25maWddID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgW2RzTW9kZWwsIHNldERzTW9kZWxdID0gdXNlU3RhdGUoJycpCiAgY29uc3QgW2RzVXJsLCBzZXREc1VybF0gPSB1c2VTdGF0ZSgnJykKCiAgdXNlRWZmZWN0KCgpID0+IHsKICAgIGxhYkFwaS5nZXRMYWJEZWNrcygpLnRoZW4oc2V0RGVja3MpLmNhdGNoKCgpID0+IHt9KQogICAgc2ltQXBpLmdldERlZXBTZWVrU3RhdHVzKCkudGhlbihzID0+IHsKICAgICAgc2V0RHNTdGF0dXMocykKICAgICAgaWYgKHMubW9kZWwpIHNldERzTW9kZWwocy5tb2RlbCkKICAgICAgaWYgKHMuYmFzZV91cmwpIHNldERzVXJsKHMuYmFzZV91cmwpCiAgICB9KS5jYXRjaCgoKSA9PiB7fSkKICB9LCBbXSkKCiAgLy8gUG9sbCB3aGlsZSBydW5uaW5nCiAgdXNlUG9sbGluZyhhc3luYyAoKSA9PiB7CiAgICBpZiAoIXNpbUlkKSByZXR1cm4KICAgIHRyeSB7CiAgICAgIGNvbnN0IHMgPSBhd2FpdCBzaW1BcGkuZ2V0U2ltU3RhdHVzKHNpbUlkKQogICAgICBzZXRTaW1TdGF0dXMocykKICAgICAgaWYgKCFzLnJ1bm5pbmcpIHsKICAgICAgICBjb25zdCByID0gYXdhaXQgc2ltQXBpLmdldFNpbVJlc3VsdChzaW1JZCkKICAgICAgICBzZXRSZXN1bHQocikKICAgICAgICBzZXRSdW5uaW5nKGZhbHNlKQogICAgICB9CiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICB9LCAyMDAwLCBydW5uaW5nKQoKICBhc3luYyBmdW5jdGlvbiBoYW5kbGVTdGFydCgpIHsKICAgIGlmICghZGVja0EgfHwgIWRlY2tCKSB7IHNldEVycm9yKCdTZWxlY3QgYm90aCBkZWNrcycpOyByZXR1cm4gfQogICAgc2V0U3RhcnRpbmcodHJ1ZSkKICAgIHNldEVycm9yKG51bGwpCiAgICBzZXRSZXN1bHQobnVsbCkKICAgIHRyeSB7CiAgICAgIGxldCByZXMKICAgICAgaWYgKHVzZURlZXBTZWVrICYmIGRlZXBTZWVrRGVjaykgewogICAgICAgIHJlcyA9IGF3YWl0IHNpbUFwaS5ydW5EZWVwU2Vla1NpbSh7IGRlY2tfYTogZGVja0EsIGRl' +
'Y2tfYjogZGVja0IsIGdhbWVzLCBkZWVwc2Vla19kZWNrOiBkZWVwU2Vla0RlY2sgfSkKICAgICAgfSBlbHNlIHsKICAgICAgICByZXMgPSBhd2FpdCBzaW1BcGkucnVuU2ltKHsgZGVja19hOiBkZWNrQSwgZGVja19iOiBkZWNrQiwgZ2FtZXMgfSkKICAgICAgfQogICAgICBzZXRTaW1JZChyZXMuc2ltX2lkKQogICAgICBzZXRSdW5uaW5nKHRydWUpCiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNldEVycm9yKGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6ICdGYWlsZWQgdG8gc3RhcnQnKQogICAgfQogICAgc2V0U3RhcnRpbmcoZmFsc2UpCiAgfQoKICBhc3luYyBmdW5jdGlvbiBoYW5kbGVEc0Nvbm5lY3QoKSB7CiAgICB0cnkgewogICAgICBjb25zdCBzID0gYXdhaXQgc2ltQXBpLmNvbm5lY3REZWVwU2VlaygpCiAgICAgIHNldERzU3RhdHVzKHMpCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZURzQ29uZmlndXJlKCkgewogICAgdHJ5IHsKICAgICAgY29uc3QgcyA9IGF3YWl0IHNpbUFwaS5jb25maWd1cmVEZWVwU2Vlayh7CiAgICAgICAgbW9kZWw6IGRzTW9kZWwgfHwgdW5kZWZpbmVkLAogICAgICAgIGJhc2VfdXJsOiBkc1VybCB8fCB1bmRlZmluZWQsCiAgICAgIH0pCiAgICAgIHNldERzU3RhdHVzKHMpCiAgICAgIHNldFNob3dEc0NvbmZpZyhmYWxzZSkKICAgIH0gY2F0Y2ggeyAvKiBpZ25vcmUgKi8gfQogIH0KCiAgcmV0dXJuICgKICAgIDxkaXYgY2xhc3NOYW1lPSJwLTYgc3BhY2UteS01Ij4KICAgICAgPGRpdj4KICAgICAgICA8aDEgY2xhc3NOYW1lPSJ0ZXh0LTJ4bCBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTMiPgogICAgICAgICAgPEdhbWVwYWQyIGNsYXNzTmFtZT0idy02IGgtNiB0ZXh0LWFjY2VudC1wdXJwbGUiIC8+CiAgICAgICAgICBTaW11bGF0b3IKICAgICAgICA8L2gxPgogICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1zbSB0ZXh0LXRleHQtc2Vjb25kYXJ5IG10LTAuNSI+UnVuIGhlYWQtdG8taGVhZCBkZWNrIHNpbXVsYXRpb25zPC9wPgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBEZWVwU2VlayBzdGF0dXMgKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyI+CiAgICAgICAgPFN0YXR1c0JhZGdlCiAgICAgICAgICB2YXJpYW50PXtkc1N0YXR1cz8uY29ubmVjdGVkID8gJ3N1Y2Nlc3MnIDogJ3dhcm5pbmcnfQogICAgICAgICAgbGFiZWw9e2RzU3RhdHVzPy5jb25uZWN0ZWQgPyBgRGVlcFNlZWs6ICR7ZHNTdGF0dXMubW9kZWx9YCA6ICdEZWVwU2VlazogRGlzY29ubmVjdGVkJ30KICAgICAgICAvPgogICAgICAgIDxidXR0b24gb25DbGljaz17aGFuZGxlRHNDb25uZWN0fQogICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnkgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAge2RzU3RhdHVzPy5jb25uZWN0ZWQgPyA8V2lmaSBjbGFzc05hbWU9InctMyBoLTMiIC8+IDogPFdpZmlPZmYgY2xhc3NOYW1lPSJ3LTMgaC0zIiAvPn0KICAgICAgICAgIHtkc1N0YXR1cz8uY29ubmVjdGVkID8gJ1JlY29ubmVjdCcgOiAnQ29ubmVjdCd9CiAgICAgICAgPC9idXR0b24+CiAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRTaG93RHNDb25maWcoIXNob3dEc0NvbmZpZyl9CiAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgaG92ZXI6dGV4dC10ZXh0LXNlY29uZGFyeSB0cmFuc2l0aW9uLWNvbG9ycyI+CiAgICAgICAgICA8U2V0dGluZ3MgY2xhc3NOYW1lPSJ3LTMgaC0zIiAvPgogICAgICAgICAgQ29uZmlndXJlCiAgICAgICAgPC9idXR0b24+CiAgICAgIDwvZGl2PgoKICAgICAge3Nob3dEc0NvbmZpZyAmJiAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcC00IG1heC13LW1kIGFuaW1hdGUtZmFkZS1pbiBzcGFjZS15LTMiPgogICAgICAgICAgPGgzIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIj4KICAgICAgICAgICAgPEJyYWluIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LWFj' +
'Y2VudC1wdXJwbGUiIC8+CiAgICAgICAgICAgIERlZXBTZWVrIENvbmZpZ3VyYXRpb24KICAgICAgICAgIDwvaDM+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgcGxhY2Vob2xkZXI9Ik1vZGVsIG5hbWUiCiAgICAgICAgICAgIHZhbHVlPXtkc01vZGVsfQogICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXREc01vZGVsKGUudGFyZ2V0LnZhbHVlKX0KICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IHBsYWNlaG9sZGVyOnRleHQtdGV4dC10ZXJ0aWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIgogICAgICAgICAgLz4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICBwbGFjZWhvbGRlcj0iQmFzZSBVUkwgKGUuZy4gaHR0cDovLzE5Mi4xNjguMC4xMjI6MTIzNCkiCiAgICAgICAgICAgIHZhbHVlPXtkc1VybH0KICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0RHNVcmwoZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgcGxhY2Vob2xkZXI6dGV4dC10ZXh0LXRlcnRpYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwiCiAgICAgICAgICAvPgogICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXtoYW5kbGVEc0NvbmZpZ3VyZX0KICAgICAgICAgICAgY2xhc3NOYW1lPSJweC00IHB5LTIgYmctYWNjZW50LWJsdWUgdGV4dC13aGl0ZSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHJvdW5kZWQtbGcgaG92ZXI6YmctYWNjZW50LWJsdWUtaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgICBTYXZlCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgKX0KCiAgICAgIHsvKiBTaW0gY29uZmlnICovfQogICAgICA8ZGl2IGNsYXNzTmFtZT0iYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBwLTUgc3BhY2UteS00IG1heC13LTJ4bCI+CiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTQiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5EZWNrIEE8L2xhYmVsPgogICAgICAgICAgICA8c2VsZWN0CiAgICAgICAgICAgICAgdmFsdWU9e2RlY2tBfQogICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldERlY2tBKGUudGFyZ2V0LnZhbHVlKX0KICAgICAgICAgICAgICBjbGFzc05hbWU9Im10LTEgdy1mdWxsIHB4LTMgcHktMi41IGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwiCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPlNlbGVjdCBkZWNrLi4uPC9vcHRpb24+CiAgICAgICAgICAgICAge2RlY2tzLm1hcChkID0+IDxvcHRpb24ga2V5PXtkLm5hbWV9IHZhbHVlPXtkLm5hbWV9PntkLm5hbWV9PC9vcHRpb24+KX0KICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSB0cmFja2luZy13aWRlciI+RGVjayBCPC9sYWJlbD4KICAgICAgICAgICAgPHNlbGVjdAogICAgICAgICAgICAgIHZhbHVlPXtkZWNrQn0KICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiBzZXREZWNrQihlLnRhcmdldC52YWx1ZSl9CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJtdC0xIHctZnVsbCBweC0zIHB5LTIuNSBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1' +
'czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5TZWxlY3QgZGVjay4uLjwvb3B0aW9uPgogICAgICAgICAgICAgIHtkZWNrcy5tYXAoZCA9PiA8b3B0aW9uIGtleT17ZC5uYW1lfSB2YWx1ZT17ZC5uYW1lfT57ZC5uYW1lfTwvb3B0aW9uPil9CiAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNiI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkdhbWVzPC9sYWJlbD4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0ibnVtYmVyIiBtaW49ezF9IG1heD17MTAwMH0KICAgICAgICAgICAgICB2YWx1ZT17Z2FtZXN9CiAgICAgICAgICAgICAgb25DaGFuZ2U9e2UgPT4gc2V0R2FtZXMoTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSl9CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJtdC0xIHctMjQgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwiCiAgICAgICAgICAgIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIGN1cnNvci1wb2ludGVyIG10LTUiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9e3VzZURlZXBTZWVrfSBvbkNoYW5nZT17ZSA9PiBzZXRVc2VEZWVwU2VlayhlLnRhcmdldC5jaGVja2VkKX0KICAgICAgICAgICAgICBjbGFzc05hbWU9InctNCBoLTQgcm91bmRlZCBib3JkZXItYm9yZGVyLXByaW1hcnkgYmctYmctdGVydGlhcnkgdGV4dC1hY2NlbnQtcHVycGxlIGZvY3VzOnJpbmctYWNjZW50LXB1cnBsZS8zMCIgLz4KICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkiPlVzZSBEZWVwU2VlayBBSSBwaWxvdDwvc3Bhbj4KICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICB7dXNlRGVlcFNlZWsgJiYgKAogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ibXQtNSI+CiAgICAgICAgICAgICAgPHNlbGVjdAogICAgICAgICAgICAgICAgdmFsdWU9e2RlZXBTZWVrRGVja30KICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtlID0+IHNldERlZXBTZWVrRGVjayhlLnRhcmdldC52YWx1ZSl9CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+QUkgcGlsb3RzIHdoaWNoIGRlY2s/PC9vcHRpb24+CiAgICAgICAgICAgICAgICB7W2RlY2tBLCBkZWNrQl0uZmlsdGVyKEJvb2xlYW4pLm1hcChkID0+IDxvcHRpb24ga2V5PXtkfSB2YWx1ZT17ZH0+e2R9PC9vcHRpb24+KX0KICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICApfQogICAgICAgIDwvZGl2PgoKICAgICAgICB7ZXJyb3IgJiYgKAogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTQgcHktMiBiZy1zdGF0dXMtZXJyb3IvMTAgYm9yZGVyIGJvcmRlci1zdGF0dXMtZXJyb3IvMzAgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtc3RhdHVzLWVycm9yIj4KICAgICAgICAgICAgPEFsZXJ0Q2lyY2xlIGNsYXNzTmFtZT0idy00IGgtNCIgLz57ZXJyb3J9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICApfQoKICAgICAgICB7cnVubmluZyA/ICgKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyI+CiAgICAgICAgICAgIDxTcGlubmVyIHNpemU9Im1kIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+CiAgICAgICAgICAgIDxkaXY+CiAg' +
'ICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5Ij5TaW11bGF0aW9uIHJ1bm5pbmcuLi48L3A+CiAgICAgICAgICAgICAge3NpbVN0YXR1cyAmJiAoCiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5Ij4KICAgICAgICAgICAgICAgICAge3NpbVN0YXR1cy5nYW1lc19jb21wbGV0ZWQgPz8gMH0gLyB7c2ltU3RhdHVzLnRvdGFsX2dhbWVzID8/IGdhbWVzfSBnYW1lcwogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgKSA6ICgKICAgICAgICAgIDxidXR0b24gb25DbGljaz17aGFuZGxlU3RhcnR9IGRpc2FibGVkPXtzdGFydGluZyB8fCAhZGVja0EgfHwgIWRlY2tCfQogICAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTUgcHktMi41IGJnLWFjY2VudC1wdXJwbGUvMTUgdGV4dC1hY2NlbnQtcHVycGxlIHRleHQtc20gZm9udC1zZW1pYm9sZCByb3VuZGVkLWxnIGhvdmVyOmJnLWFjY2VudC1wdXJwbGUvMjUgYm9yZGVyIGJvcmRlci1hY2NlbnQtcHVycGxlLzMwIHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNTAiPgogICAgICAgICAgICB7c3RhcnRpbmcgPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8UGxheSBjbGFzc05hbWU9InctNCBoLTQiIC8+fQogICAgICAgICAgICBSdW4gU2ltdWxhdGlvbgogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CgogICAgICB7LyogUmVzdWx0cyAqL30KICAgICAge3Jlc3VsdCAmJiAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcC01IHNwYWNlLXktNCBhbmltYXRlLWZhZGUtaW4iPgogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiI+CiAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9InRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtcHJpbWFyeSBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgPFRyb3BoeSBjbGFzc05hbWU9InctNCBoLTQgdGV4dC1hY2NlbnQtYW1iZXIiIC8+CiAgICAgICAgICAgICAgUmVzdWx0cwogICAgICAgICAgICA8L2gzPgogICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUiPgogICAgICAgICAgICAgIDxDbG9jayBjbGFzc05hbWU9InctMyBoLTMiIC8+CiAgICAgICAgICAgICAgeyhyZXN1bHQuZHVyYXRpb25fbXMgLyAxMDAwKS50b0ZpeGVkKDEpfXMgwrcge3Jlc3VsdC50b3RhbF9nYW1lc30gZ2FtZXMKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iaC00OCI+CiAgICAgICAgICAgIDxSZXNwb25zaXZlQ29udGFpbmVyIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPgogICAgICAgICAgICAgIDxCYXJDaGFydCBkYXRhPXtyZXN1bHQuZGVja3MubWFwKGQgPT4gKHsgbmFtZTogZC5uYW1lLCB3aW5fcmF0ZTogTWF0aC5yb3VuZChkLndpbl9yYXRlICogMTAwKSB9KSl9IGJhclNpemU9ezQwfT4KICAgICAgICAgICAgICAgIDxYQXhpcyBkYXRhS2V5PSJuYW1lIiB0aWNrPXt7IGZpbGw6ICcjOWJhMWI4JywgZm9udFNpemU6IDEyIH19IGF4aXNMaW5lPXtmYWxzZX0gdGlja0xpbmU9e2ZhbHNlfSAvPgogICAgICAgICAgICAgICAgPFlBeGlzIGRvbWFpbj17WzAsIDEwMF19IHRpY2s9e3sgZmlsbDogJyM2YjcxOTAnLCBmb250U2l6ZTogMTEgfX0gYXhpc0xpbmU9e2ZhbHNlfSB0aWNrTGluZT17ZmFsc2V9IC8+CiAgICAgICAgICAgICAgICA8VG9vbHRpcCBjb250ZW50U3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiAnIzFjMjAzMCcsIGJvcmRlcjogJzFweCBzb2xpZCAjMmEyZjQyJywgYm9yZGVyUmFkaXVzOiA4LCBmb250U2l6ZTogMTIgfX0KICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyPXsodmFsdWU6IHVua25vd24pID0+IFtgJHt2YWx1ZX0lYCwgJ1dpbiBSYXRlJ119IC8+CiAgICAgICAgICAgICAgICA8QmFyIGRhdGFLZXk9Indpbl9yYXRlIiByYWRpdXM9e1s0LCA0LCAwLCAwXX0+CiAgICAgICAgICAgICAgICAgIHtyZXN1bHQuZGVja3MubWFwKChkLCBpKSA9PiAoCiAgICAg' +
'ICAgICAgICAgICAgICAgPENlbGwga2V5PXtpfSBmaWxsPXtkLndpbl9yYXRlID09PSBNYXRoLm1heCguLi5yZXN1bHQuZGVja3MubWFwKHggPT4geC53aW5fcmF0ZSkpID8gJyM0YWRlODAnIDogJyM0ZjZlZjcnfSAvPgogICAgICAgICAgICAgICAgICApKX0KICAgICAgICAgICAgICAgIDwvQmFyPgogICAgICAgICAgICAgIDwvQmFyQ2hhcnQ+CiAgICAgICAgICAgIDwvUmVzcG9uc2l2ZUNvbnRhaW5lcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTQiPgogICAgICAgICAgICB7cmVzdWx0LmRlY2tzLm1hcChkID0+ICgKICAgICAgICAgICAgICA8ZGl2IGtleT17ZC5uYW1lfSBjbGFzc05hbWU9InB4LTQgcHktMyByb3VuZGVkLWxnIGJnLWJnLXRlcnRpYXJ5Ij4KICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtdGV4dC1wcmltYXJ5Ij57ZC5uYW1lfTwvcD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0zIGdhcC0yIG10LTIiPgogICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1bMTBweF0gdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSI+V2luczwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtbGcgZm9udC1ib2xkIHRleHQtYWNjZW50LWdyZWVuIj57ZC53aW5zfTwvcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LVsxMHB4XSB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIj5XaW4gUmF0ZTwvcD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtbGcgZm9udC1ib2xkIHRleHQtYWNjZW50LWJsdWUiPnsoZC53aW5fcmF0ZSAqIDEwMCkudG9GaXhlZCgxKX0lPC9wPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtWzEwcHhdIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UiPkF2ZyBUdXJuPC9wPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1sZyBmb250LWJvbGQgdGV4dC10ZXh0LXByaW1hcnkiPntkLmF2Z190dXJuLnRvRml4ZWQoMSl9PC9wPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICApKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICApfQogICAgPC9kaXY+CiAgKQp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\pages\SimulatorPage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/pages/TrainingPage.tsx (42,191 bytes)
$b = 'aW1wb3J0IHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCcKaW1wb3J0IHsKICBCcmFpbiwgUGxheSwgU3F1YXJlLCBSb3RhdGVDdywgRGF0YWJhc2UsIFRyb3BoeSwgQWxlcnRDaXJjbGUsCiAgQWN0aXZpdHksIFphcCwgU3dvcmRzLCBGaWxlVGV4dCwgQ3B1LCBDaGVja0NpcmNsZSwKICBDaGV2cm9uRG93biwgQ2hldnJvblVwLCBEb3dubG9hZCwgSGFyZERyaXZlLCBMYXllcnMsIFNldHRpbmdzCn0gZnJvbSAnbHVjaWRlLXJlYWN0JwppbXBvcnQgeyBTcGlubmVyLCBTdGF0dXNCYWRnZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uJwppbXBvcnQgeyB0cmFpbmluZ0FwaSB9IGZyb20gJy4uL2FwaScKaW1wb3J0IHsgdXNlUG9sbGluZyB9IGZyb20gJy4uL2hvb2tzL3VzZVBvbGxpbmcnCmltcG9ydCB0eXBlIHsKICBNTFN0YXR1cywgTUxEYXRhU3RhdHVzLCBNTFRyYWluU3RhdHVzLCBQUE9UcmFpblN0YXR1cywKICBUb3VybmFtZW50U3RhdHVzLCBUb3VybmFtZW50UmVzdWx0cywgTUxNb2RlbEluZm8KfSBmcm9tICcuLi90eXBlcycKCi8vIOKUgOKUgCBQcm9ncmVzcyBCYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZ1bmN0aW9uIFByb2dyZXNzQmFyKHsgdmFsdWUsIG1heCwgbGFiZWwsIGNvbG9yID0gJ2JnLWFjY2VudC1ibHVlJyB9OiB7IHZhbHVlOiBudW1iZXI7IG1heDogbnVtYmVyOyBsYWJlbDogc3RyaW5nOyBjb2xvcj86IHN0cmluZyB9KSB7CiAgY29uc3QgcGN0ID0gbWF4ID4gMCA/IE1hdGgubWluKCh2YWx1ZSAvIG1heCkgKiAxMDAsIDEwMCkgOiAwCiAgcmV0dXJuICgKICAgIDxkaXY+CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gdGV4dC14cyBtYi0xIj4KICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC1zZWNvbmRhcnkiPntsYWJlbH08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXRleHQtdGVydGlhcnkiPnt2YWx1ZX0gLyB7bWF4fSAoe3BjdC50b0ZpeGVkKDApfSUpPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzc05hbWU9InctZnVsbCBoLTIgYmctYmctdGVydGlhcnkgcm91bmRlZC1mdWxsIG92ZXJmbG93LWhpZGRlbiI+CiAgICAgICAgPGRpdiBjbGFzc05hbWU9eydoLWZ1bGwgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTUwMCAnICsgY29sb3J9IHN0eWxlPXt7IHdpZHRoOiBgJHtwY3R9JWAgfX0gLz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICApCn0KCi8vIOKUgOKUgCBQaGFzZSBCYWRnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKY29uc3QgUEhBU0VfU1RZTEVTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gewogIGlkbGU6ICdiZy1iZy10ZXJ0aWFyeSB0ZXh0LXRleHQtdGVydGlhcnknLAogIHN0YXJ0aW5nOiAnYmctYWNjZW50LWJsdWUvMTUgdGV4dC1hY2NlbnQtYmx1ZSBhbmltYXRlLXB1bHNlJywKICBidWlsZGluZzogJ2JnLWFjY2VudC1wdXJwbGUvMTUgdGV4dC1hY2NlbnQtcHVycGxlIGFuaW1hdGUtcHVsc2UnLAogIHRyYWluaW5nOiAnYmctYWNjZW50LWJsdWUvMTUgdGV4dC1hY2NlbnQtYmx1ZSBhbmltYXRlLXB1bHNlJywKICBldmFsdWF0aW5nOiAnYmctYWNjZW50LXRlYWwvMTUgdGV4dC1hY2NlbnQtdGVhbCBhbmltYXRlLXB1bHNlJywKICBydW5uaW5nOiAnYmctYWNjZW50LWFtYmVyLzE1IHRleHQtYWNjZW50LWFtYmVyIGFuaW1hdGUtcHVsc2UnLAogIGRvbmU6ICdiZy1hY2NlbnQtZ3JlZW4vMTUgdGV4dC1hY2NlbnQtZ3JlZW4nLAogIGVycm9yOiAnYmctYWNjZW50LXJlZC8xNSB0ZXh0LWFjY2VudC1yZWQnLAp9CgpmdW5jdGlvbiBQaGFzZUJhZGdlKHsgcGhhc2UgfTogeyBwaGFzZTogc3RyaW5nIH0pIHsKICBjb25zdCBjbHMgPSBQSEFTRV9TVFlMRVNbcGhhc2VdIHx8IFBIQVNFX1NUWUxFUy5pZGxlCiAgcmV0dXJuICgKICAgIDxzcGFuIGNsYXNzTmFtZT17J3RleHQtWzEwcHhdIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRy' +
'YWNraW5nLXdpZGVyIHB4LTIgcHktMC41IHJvdW5kZWQgJyArIGNsc30+CiAgICAgIHtwaGFzZX0KICAgIDwvc3Bhbj4KICApCn0KCi8vIOKUgOKUgCBNZXRyaWMgQ2FyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gTWV0cmljQ2FyZCh7IGxhYmVsLCB2YWx1ZSwgYWNjZW50IH06IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bWJlcjsgYWNjZW50Pzogc3RyaW5nIH0pIHsKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9InB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSByb3VuZGVkLWxnIj4KICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LVsxMHB4XSB0ZXh0LXRleHQtdGVydGlhcnkiPntsYWJlbH08L3A+CiAgICAgIDxwIGNsYXNzTmFtZT17J3RleHQtc20gZm9udC1ib2xkICcgKyAoYWNjZW50IHx8ICd0ZXh0LXRleHQtcHJpbWFyeScpfT57dmFsdWV9PC9wPgogICAgPC9kaXY+CiAgKQp9CgovLyDilIDilIAgQ29sbGFwc2libGUgU2VjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZnVuY3Rpb24gU2VjdGlvbih7IHRpdGxlLCBpY29uLCBjaGlsZHJlbiwgZGVmYXVsdE9wZW4gPSB0cnVlLCBjb2xvciA9ICd0ZXh0LWFjY2VudC1ibHVlJyB9OiB7CiAgdGl0bGU6IHN0cmluZzsgaWNvbjogUmVhY3QuUmVhY3ROb2RlOyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlOyBkZWZhdWx0T3Blbj86IGJvb2xlYW47IGNvbG9yPzogc3RyaW5nCn0pIHsKICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShkZWZhdWx0T3BlbikKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9ImJnLWJnLXNlY29uZGFyeSByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgb3ZlcmZsb3ctaGlkZGVuIj4KICAgICAgPGJ1dHRvbgogICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4oIW9wZW4pfQogICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC01IHB5LTQgaG92ZXI6YmctYmctaG92ZXIgdHJhbnNpdGlvbi1jb2xvcnMiCiAgICAgID4KICAgICAgICA8aDMgY2xhc3NOYW1lPSJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXByaW1hcnkgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIiPgogICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjb2xvcn0+e2ljb259PC9zcGFuPgogICAgICAgICAge3RpdGxlfQogICAgICAgIDwvaDM+CiAgICAgICAge29wZW4gPyA8Q2hldnJvblVwIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LXRleHQtdGVydGlhcnkiIC8+IDogPENoZXZyb25Eb3duIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LXRleHQtdGVydGlhcnkiIC8+fQogICAgICA8L2J1dHRvbj4KICAgICAge29wZW4gJiYgPGRpdiBjbGFzc05hbWU9InB4LTUgcGItNSBzcGFjZS15LTQgYm9yZGVyLXQgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHB0LTQiPntjaGlsZHJlbn08L2Rpdj59CiAgICA8L2Rpdj4KICApCn0KCi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAovLyBNYWluIFRyYWluaW5nIFBhZ2UKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCmV4cG9ydCBmdW5jdGlvbiBUcmFpbmluZ1BhZ2UoKSB7CiAgLy8gU3RhdHVzIHN0YXRlcwogIGNvbnN0IFttbFN0YXR1cywgc2V0TWxTdGF0dXNdID0gdXNlU3RhdGU8TUxTdGF0dXMgfCBudWxsPihudWxsKQogIGNvbnN0IFtkYXRhU3RhdHVzLCBzZXREYXRhU3RhdHVzXSA9IHVzZVN0' +
'YXRlPE1MRGF0YVN0YXR1cyB8IG51bGw+KG51bGwpCiAgY29uc3QgW21vZGVsSW5mbywgc2V0TW9kZWxJbmZvXSA9IHVzZVN0YXRlPE1MTW9kZWxJbmZvIHwgbnVsbD4obnVsbCkKICBjb25zdCBbdHJhaW5TdGF0dXMsIHNldFRyYWluU3RhdHVzXSA9IHVzZVN0YXRlPE1MVHJhaW5TdGF0dXMgfCBudWxsPihudWxsKQogIGNvbnN0IFtwcG9TdGF0dXMsIHNldFBwb1N0YXR1c10gPSB1c2VTdGF0ZTxQUE9UcmFpblN0YXR1cyB8IG51bGw+KG51bGwpCiAgY29uc3QgW3RvdXJuU3RhdHVzLCBzZXRUb3VyblN0YXR1c10gPSB1c2VTdGF0ZTxUb3VybmFtZW50U3RhdHVzIHwgbnVsbD4obnVsbCkKICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKQogIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCkKCiAgLy8gU3VwZXJ2aXNlZCB0cmFpbmluZyBjb25maWcKICBjb25zdCBbZXBvY2hzLCBzZXRFcG9jaHNdID0gdXNlU3RhdGUoNTApCiAgY29uc3QgW2xyLCBzZXRMcl0gPSB1c2VTdGF0ZSgwLjAwMSkKICBjb25zdCBbYmF0Y2hTaXplLCBzZXRCYXRjaFNpemVdID0gdXNlU3RhdGUoMjU2KQogIGNvbnN0IFtwYXRpZW5jZSwgc2V0UGF0aWVuY2VdID0gdXNlU3RhdGUoMTApCiAgY29uc3QgW3JlYnVpbGREYXRhc2V0LCBzZXRSZWJ1aWxkRGF0YXNldF0gPSB1c2VTdGF0ZSh0cnVlKQoKICAvLyBQUE8gY29uZmlnCiAgY29uc3QgW3Bwb0l0ZXJhdGlvbnMsIHNldFBwb0l0ZXJhdGlvbnNdID0gdXNlU3RhdGUoMTAwKQogIGNvbnN0IFtwcG9FcGlzb2Rlcywgc2V0UHBvRXBpc29kZXNdID0gdXNlU3RhdGUoNjQpCiAgY29uc3QgW3Bwb0Vwb2Nocywgc2V0UHBvRXBvY2hzXSA9IHVzZVN0YXRlKDQpCiAgY29uc3QgW3Bwb0JhdGNoU2l6ZSwgc2V0UHBvQmF0Y2hTaXplXSA9IHVzZVN0YXRlKDI1NikKICBjb25zdCBbcHBvTHIsIHNldFBwb0xyXSA9IHVzZVN0YXRlKDAuMDAwMykKICBjb25zdCBbcHBvQ2xpcEVwcywgc2V0UHBvQ2xpcEVwc10gPSB1c2VTdGF0ZSgwLjIpCiAgY29uc3QgW3Bwb0VudHJvcHksIHNldFBwb0VudHJvcHldID0gdXNlU3RhdGUoMC4wMSkKICBjb25zdCBbcHBvT3Bwb25lbnQsIHNldFBwb09wcG9uZW50XSA9IHVzZVN0YXRlKCdoZXVyaXN0aWMnKQogIGNvbnN0IFtwcG9QbGF5c3R5bGUsIHNldFBwb1BsYXlzdHlsZV0gPSB1c2VTdGF0ZSgnbWlkcmFuZ2UnKQoKICAvLyBUb3VybmFtZW50IGNvbmZpZwogIGNvbnN0IFt0b3VybkVwaXNvZGVzLCBzZXRUb3VybkVwaXNvZGVzXSA9IHVzZVN0YXRlKDUwKQogIGNvbnN0IFt0b3VyblBsYXlzdHlsZSwgc2V0VG91cm5QbGF5c3R5bGVdID0gdXNlU3RhdGUoJ21pZHJhbmdlJykKCiAgLy8gQWN0aW9uIHN0YXRlcwogIGNvbnN0IFtzdGFydGluZ1RyYWluLCBzZXRTdGFydGluZ1RyYWluXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtzdGFydGluZ1Bwbywgc2V0U3RhcnRpbmdQcG9dID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgW3N0YXJ0aW5nVG91cm4sIHNldFN0YXJ0aW5nVG91cm5dID0gdXNlU3RhdGUoZmFsc2UpCiAgY29uc3QgW3JlbG9hZGluZywgc2V0UmVsb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKQogIGNvbnN0IFtzaG93U3VwQWR2YW5jZWQsIHNldFNob3dTdXBBZHZhbmNlZF0gPSB1c2VTdGF0ZShmYWxzZSkKICBjb25zdCBbc2hvd1Bwb0FkdmFuY2VkLCBzZXRTaG93UHBvQWR2YW5jZWRdID0gdXNlU3RhdGUoZmFsc2UpCgogIC8vIOKUgOKUgCBJbml0aWFsIExvYWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgY29uc3QgbG9hZEFsbCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IFttbCwgZGF0YSwgbW9kZWwsIHRyYWluLCBwcG8sIHRvdXJuXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICB0cmFpbmluZ0FwaS5nZXRNTFN0YXR1cygpLmNhdGNoKCgpID0+IG51bGwpLAogICAgICAgIHRyYWluaW5nQXBpLmdldERhdGFTdGF0dXMoKS5jYXRjaCgoKSA9PiBudWxsKSwKICAgICAgICB0cmFpbmluZ0FwaS5nZXRNb2RlbEluZm8oKS5jYXRjaCgoKSA9PiBudWxsKSwKICAgICAgICB0cmFpbmluZ0FwaS5nZXRUcmFpblN0YXR1cygpLmNhdGNoKCgpID0+IG51bGwpLAogICAgICAgIHRyYWlu' +
'aW5nQXBpLmdldFBQT1N0YXR1cygpLmNhdGNoKCgpID0+IG51bGwpLAogICAgICAgIHRyYWluaW5nQXBpLmdldFRvdXJuYW1lbnRTdGF0dXMoKS5jYXRjaCgoKSA9PiBudWxsKSwKICAgICAgXSkKICAgICAgaWYgKG1sKSBzZXRNbFN0YXR1cyhtbCkKICAgICAgaWYgKGRhdGEpIHNldERhdGFTdGF0dXMoZGF0YSkKICAgICAgaWYgKG1vZGVsKSBzZXRNb2RlbEluZm8obW9kZWwpCiAgICAgIGlmICh0cmFpbikgc2V0VHJhaW5TdGF0dXModHJhaW4pCiAgICAgIGlmIChwcG8pIHNldFBwb1N0YXR1cyhwcG8pCiAgICAgIGlmICh0b3Vybikgc2V0VG91cm5TdGF0dXModG91cm4pCiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICAgIHNldExvYWRpbmcoZmFsc2UpCiAgfSwgW10pCgogIHVzZUVmZmVjdCgoKSA9PiB7IGxvYWRBbGwoKSB9LCBbbG9hZEFsbF0pCgogIC8vIOKUgOKUgCBQb2xsaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogIGNvbnN0IGlzVHJhaW5pbmcgPSB0cmFpblN0YXR1cz8ucnVubmluZyB8fCBmYWxzZQogIGNvbnN0IGlzUHBvID0gcHBvU3RhdHVzPy5ydW5uaW5nIHx8IGZhbHNlCiAgY29uc3QgaXNUb3VybiA9IHRvdXJuU3RhdHVzPy5ydW5uaW5nIHx8IGZhbHNlCiAgY29uc3QgYW55UnVubmluZyA9IGlzVHJhaW5pbmcgfHwgaXNQcG8gfHwgaXNUb3VybgoKICB1c2VQb2xsaW5nKGFzeW5jICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHMgPSBhd2FpdCB0cmFpbmluZ0FwaS5nZXRUcmFpblN0YXR1cygpCiAgICAgIHNldFRyYWluU3RhdHVzKHMpCiAgICAgIGlmICghcy5ydW5uaW5nICYmIHMucGhhc2UgPT09ICdkb25lJykgewogICAgICAgIC8vIFJlZnJlc2ggbW9kZWwgaW5mbyArIGRhdGEgd2hlbiB0cmFpbmluZyBjb21wbGV0ZXMKICAgICAgICBjb25zdCBbbW9kZWwsIGRhdGFdID0gYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgdHJhaW5pbmdBcGkuZ2V0TW9kZWxJbmZvKCkuY2F0Y2goKCkgPT4gbnVsbCksCiAgICAgICAgICB0cmFpbmluZ0FwaS5nZXREYXRhU3RhdHVzKCkuY2F0Y2goKCkgPT4gbnVsbCksCiAgICAgICAgXSkKICAgICAgICBpZiAobW9kZWwpIHNldE1vZGVsSW5mbyhtb2RlbCkKICAgICAgICBpZiAoZGF0YSkgc2V0RGF0YVN0YXR1cyhkYXRhKQogICAgICB9CiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH0KICB9LCAyMDAwLCBpc1RyYWluaW5nKQoKICB1c2VQb2xsaW5nKGFzeW5jICgpID0+IHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHMgPSBhd2FpdCB0cmFpbmluZ0FwaS5nZXRQUE9TdGF0dXMoKQogICAgICBzZXRQcG9TdGF0dXMocykKICAgICAgaWYgKCFzLnJ1bm5pbmcgJiYgcy5waGFzZSA9PT0gJ2RvbmUnKSB7CiAgICAgICAgY29uc3QgW21vZGVsLCBkYXRhXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgIHRyYWluaW5nQXBpLmdldE1vZGVsSW5mbygpLmNhdGNoKCgpID0+IG51bGwpLAogICAgICAgICAgdHJhaW5pbmdBcGkuZ2V0RGF0YVN0YXR1cygpLmNhdGNoKCgpID0+IG51bGwpLAogICAgICAgIF0pCiAgICAgICAgaWYgKG1vZGVsKSBzZXRNb2RlbEluZm8obW9kZWwpCiAgICAgICAgaWYgKGRhdGEpIHNldERhdGFTdGF0dXMoZGF0YSkKICAgICAgfQogICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgfSwgMjAwMCwgaXNQcG8pCgogIHVzZVBvbGxpbmcoYXN5bmMgKCkgPT4gewogICAgdHJ5IHsKICAgICAgY29uc3QgcyA9IGF3YWl0IHRyYWluaW5nQXBpLmdldFRvdXJuYW1lbnRTdGF0dXMoKQogICAgICBzZXRUb3VyblN0YXR1cyhzKQogICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgfSwgMjAwMCwgaXNUb3VybikKCiAgLy8g4pSA4pSAIEFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlVG9nZ2xlTG9nZ2luZygpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IG5ld1N0YXRlID0gIShtbFN0YXR1cz8ubWxfbG9nZ2luZ19lbmFibGVkID8/IGZhbHNlKQogICAgICBhd2FpdCB0cmFpbmluZ0FwaS50' +
'b2dnbGVNTChuZXdTdGF0ZSkKICAgICAgY29uc3QgbWwgPSBhd2FpdCB0cmFpbmluZ0FwaS5nZXRNTFN0YXR1cygpCiAgICAgIHNldE1sU3RhdHVzKG1sKQogICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgfQoKICBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZWxvYWRNb2RlbCgpIHsKICAgIHNldFJlbG9hZGluZyh0cnVlKQogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzID0gYXdhaXQgdHJhaW5pbmdBcGkucmVsb2FkTW9kZWwoKQogICAgICBzZXRNb2RlbEluZm8ocmVzLnN0YXR1cykKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2V0RXJyb3IoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJ0ZhaWxlZCB0byByZWxvYWQgbW9kZWwnKQogICAgfQogICAgc2V0UmVsb2FkaW5nKGZhbHNlKQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RhcnRUcmFpbigpIHsKICAgIHNldFN0YXJ0aW5nVHJhaW4odHJ1ZSkKICAgIHNldEVycm9yKG51bGwpCiAgICB0cnkgewogICAgICBhd2FpdCB0cmFpbmluZ0FwaS5zdGFydFRyYWluaW5nKHsgZXBvY2hzLCBsciwgYmF0Y2hTaXplLCBwYXRpZW5jZSwgcmVidWlsZERhdGFzZXQgfSkKICAgICAgY29uc3QgcyA9IGF3YWl0IHRyYWluaW5nQXBpLmdldFRyYWluU3RhdHVzKCkKICAgICAgc2V0VHJhaW5TdGF0dXMocykKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2V0RXJyb3IoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdGFydCB0cmFpbmluZycpCiAgICB9CiAgICBzZXRTdGFydGluZ1RyYWluKGZhbHNlKQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlU3RhcnRQcG8oKSB7CiAgICBzZXRTdGFydGluZ1Bwbyh0cnVlKQogICAgc2V0RXJyb3IobnVsbCkKICAgIHRyeSB7CiAgICAgIGF3YWl0IHRyYWluaW5nQXBpLnN0YXJ0UFBPVHJhaW5pbmcoewogICAgICAgIGl0ZXJhdGlvbnM6IHBwb0l0ZXJhdGlvbnMsCiAgICAgICAgZXBpc29kZXNQZXJJdGVyOiBwcG9FcGlzb2RlcywKICAgICAgICBwcG9FcG9jaHMsCiAgICAgICAgYmF0Y2hTaXplOiBwcG9CYXRjaFNpemUsCiAgICAgICAgbHI6IHBwb0xyLAogICAgICAgIGNsaXBFcHNpbG9uOiBwcG9DbGlwRXBzLAogICAgICAgIGVudHJvcHlDb2VmZjogcHBvRW50cm9weSwKICAgICAgICBvcHBvbmVudDogcHBvT3Bwb25lbnQsCiAgICAgICAgcGxheXN0eWxlOiBwcG9QbGF5c3R5bGUsCiAgICAgIH0pCiAgICAgIGNvbnN0IHMgPSBhd2FpdCB0cmFpbmluZ0FwaS5nZXRQUE9TdGF0dXMoKQogICAgICBzZXRQcG9TdGF0dXMocykKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgc2V0RXJyb3IoZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogJ0ZhaWxlZCB0byBzdGFydCBQUE8gdHJhaW5pbmcnKQogICAgfQogICAgc2V0U3RhcnRpbmdQcG8oZmFsc2UpCiAgfQoKICBhc3luYyBmdW5jdGlvbiBoYW5kbGVTdGFydFRvdXJuYW1lbnQoKSB7CiAgICBzZXRTdGFydGluZ1RvdXJuKHRydWUpCiAgICBzZXRFcnJvcihudWxsKQogICAgdHJ5IHsKICAgICAgYXdhaXQgdHJhaW5pbmdBcGkuc3RhcnRUb3VybmFtZW50KHsgZXBpc29kZXM6IHRvdXJuRXBpc29kZXMsIHBsYXlzdHlsZTogdG91cm5QbGF5c3R5bGUgfSkKICAgICAgY29uc3QgcyA9IGF3YWl0IHRyYWluaW5nQXBpLmdldFRvdXJuYW1lbnRTdGF0dXMoKQogICAgICBzZXRUb3VyblN0YXR1cyhzKQogICAgfSBjYXRjaCAoZSkgewogICAgICBzZXRFcnJvcihlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIHN0YXJ0IHRvdXJuYW1lbnQnKQogICAgfQogICAgc2V0U3RhcnRpbmdUb3VybihmYWxzZSkKICB9CgogIC8vIOKUgOKUgCBSZW5kZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgaWYgKGxvYWRpbmcpIHsKICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT0icC02IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGgtNjQiPjxTcGlubmVyIHNpemU9ImxnIiBjbGFzc05hbWU9InRleHQtYWNjZW50LWJsdWUiIC8+PC9kaXY+CiAgfQoKICBjb25zdCB0cmFpbkRhdGFzZXQgPSBkYXRhU3RhdHVzPy5kYXRhc2V0cz8uWyd0cmFpbiddCiAgY29uc3QgaGFzRGVjaXNpb25zID0gKG1sU3RhdHVzPy50b3RhbF9kZWNpc2lvbnMgPz8g' +
'MCkgPiAwCiAgY29uc3QgaGFzRGF0YXNldCA9ICEhdHJhaW5EYXRhc2V0CiAgY29uc3QgaGFzTW9kZWwgPSBtb2RlbEluZm8/LmxvYWRlZCA9PT0gdHJ1ZQoKICByZXR1cm4gKAogICAgPGRpdiBjbGFzc05hbWU9InAtNiBzcGFjZS15LTUiPgogICAgICB7LyogUGFnZSBIZWFkZXIgKi99CiAgICAgIDxkaXY+CiAgICAgICAgPGgxIGNsYXNzTmFtZT0idGV4dC0yeGwgZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5IGZsZXggaXRlbXMtY2VudGVyIGdhcC0zIj4KICAgICAgICAgIDxCcmFpbiBjbGFzc05hbWU9InctNiBoLTYgdGV4dC1hY2NlbnQtZ3JlZW4iIC8+CiAgICAgICAgICBNTCBUcmFpbmluZyBQaXBlbGluZQogICAgICAgIDwvaDE+CiAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXNtIHRleHQtdGV4dC1zZWNvbmRhcnkgbXQtMC41Ij5Db2xsZWN0IGRhdGEsIHRyYWluIG1vZGVscywgYW5kIGV2YWx1YXRlIHBlcmZvcm1hbmNlPC9wPgogICAgICA8L2Rpdj4KCiAgICAgIHsvKiBFcnJvciBiYW5uZXIgKi99CiAgICAgIHtlcnJvciAmJiAoCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTQgcHktMiBiZy1hY2NlbnQtcmVkLzEwIGJvcmRlciBib3JkZXItYWNjZW50LXJlZC8zMCByb3VuZGVkLWxnIHRleHQtc20gdGV4dC1hY2NlbnQtcmVkIj4KICAgICAgICAgIDxBbGVydENpcmNsZSBjbGFzc05hbWU9InctNCBoLTQgZmxleC1zaHJpbmstMCIgLz4KICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0iZmxleC0xIj57ZXJyb3J9PC9zcGFuPgogICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiBzZXRFcnJvcihudWxsKX0gY2xhc3NOYW1lPSJ0ZXh0LWFjY2VudC1yZWQvNjAgaG92ZXI6dGV4dC1hY2NlbnQtcmVkIHRleHQteHMiPmRpc21pc3M8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgKX0KCiAgICAgIHsvKiBQaXBlbGluZSBvdmVydmlldyBiYXIgKi99CiAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTMgYmctYmctc2Vjb25kYXJ5IHJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSBweC01IHB5LTMiPgogICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17J3ctMiBoLTIgcm91bmRlZC1mdWxsICcgKyAobWxTdGF0dXM/Lm1sX2xvZ2dpbmdfZW5hYmxlZCA/ICdiZy1hY2NlbnQtZ3JlZW4nIDogJ2JnLXRleHQtdGVydGlhcnknKX0gLz4KICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij5Mb2dnaW5nIHttbFN0YXR1cz8ubWxfbG9nZ2luZ19lbmFibGVkID8gJ09uJyA6ICdPZmYnfTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtYm9yZGVyLXByaW1hcnkiPnw8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkiPnttbFN0YXR1cz8udG90YWxfZGVjaXNpb25zID8/IDB9IGRlY2lzaW9uczwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtYm9yZGVyLXByaW1hcnkiPnw8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkiPnt0cmFpbkRhdGFzZXQgPyBgJHt0cmFpbkRhdGFzZXQuc2FtcGxlcy50b0xvY2FsZVN0cmluZygpfSB0cmFpbmluZyBzYW1wbGVzYCA6ICdObyBkYXRhc2V0J308L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LWJvcmRlci1wcmltYXJ5Ij58PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij57KGRhdGFTdGF0dXM/LmNoZWNrcG9pbnRzPy5sZW5ndGggPz8gMCl9IGNoZWNrcG9pbnRzPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1ib3JkZXItcHJpbWFyeSI+fDwvc3Bhbj4KICAgICAgICA8U3RhdHVzQmFkZ2UKICAgICAgICAgIHZhcmlhbnQ9e2hhc01vZGVsID8gJ3N1Y2Nlc3MnIDogJ25ldXRyYWwnfQogICAgICAgICAgbGFiZWw9e2hhc01vZGVsID8gYE1vZGVsIG9uICR7bW9kZWxJbmZvPy5kZXZpY2UgPz8gJz8nfWAgOiAnTm8gbW9kZWwnfQogICAgICAgIC8+CiAgICAgICAge2FueVJ1bm5pbmcgJiYgKAogICAgICAgICAgPD4KICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LWJvcmRlci1wcmlt' +
'YXJ5Ij58PC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1hY2NlbnQtYmx1ZSBhbmltYXRlLXB1bHNlIj5QaXBlbGluZSBydW5uaW5nLi4uPC9zcGFuPgogICAgICAgICAgPC8+CiAgICAgICAgKX0KICAgICAgPC9kaXY+CgogICAgICB7Lyog4pWQ4pWQ4pWQIFBoYXNlIDE6IERhdGEgQ29sbGVjdGlvbiDilZDilZDilZAgKi99CiAgICAgIDxTZWN0aW9uIHRpdGxlPSJQaGFzZSAxIOKAlCBEYXRhIENvbGxlY3Rpb24iIGljb249ezxGaWxlVGV4dCBjbGFzc05hbWU9InctNCBoLTQiIC8+fSBjb2xvcj0idGV4dC1hY2NlbnQtdGVhbCI+CiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiI+CiAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXNlY29uZGFyeSI+CiAgICAgICAgICAgIFJ1biBiYXRjaCBzaW11bGF0aW9ucyB3aXRoIE1MIGxvZ2dpbmcgZW5hYmxlZCB0byBjb2xsZWN0IGRlY2lzaW9uIGRhdGEuCiAgICAgICAgICA8L3A+CiAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVRvZ2dsZUxvZ2dpbmd9CiAgICAgICAgICAgIGNsYXNzTmFtZT17J2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZC1sZyBib3JkZXIgdHJhbnNpdGlvbi1jb2xvcnMgJyArCiAgICAgICAgICAgICAgKG1sU3RhdHVzPy5tbF9sb2dnaW5nX2VuYWJsZWQKICAgICAgICAgICAgICAgID8gJ2JnLWFjY2VudC1ncmVlbi8xNSB0ZXh0LWFjY2VudC1ncmVlbiBib3JkZXItYWNjZW50LWdyZWVuLzMwIGhvdmVyOmJnLWFjY2VudC1ncmVlbi8yNScKICAgICAgICAgICAgICAgIDogJ2JnLWJnLXRlcnRpYXJ5IHRleHQtdGV4dC1zZWNvbmRhcnkgYm9yZGVyLWJvcmRlci1wcmltYXJ5IGhvdmVyOmJnLWJnLWhvdmVyJwogICAgICAgICAgICAgICl9CiAgICAgICAgICA+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXsndy0yIGgtMiByb3VuZGVkLWZ1bGwgJyArIChtbFN0YXR1cz8ubWxfbG9nZ2luZ19lbmFibGVkID8gJ2JnLWFjY2VudC1ncmVlbicgOiAnYmctdGV4dC10ZXJ0aWFyeScpfSAvPgogICAgICAgICAgICB7bWxTdGF0dXM/Lm1sX2xvZ2dpbmdfZW5hYmxlZCA/ICdMb2dnaW5nIEVuYWJsZWQnIDogJ0VuYWJsZSBMb2dnaW5nJ30KICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICB7LyogRGVjaXNpb24gZmlsZXMgKi99CiAgICAgICAgeyhkYXRhU3RhdHVzPy5kZWNpc2lvbkZpbGVzPy5sZW5ndGggPz8gMCkgPiAwID8gKAogICAgICAgICAgPGRpdiBjbGFzc05hbWU9InNwYWNlLXktMSI+CiAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9InRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5EZWNpc2lvbiBGaWxlczwvaDQ+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJtYXgtaC0zNiBvdmVyZmxvdy15LWF1dG8gc3BhY2UteS0xIj4KICAgICAgICAgICAgICB7ZGF0YVN0YXR1cyEuZGVjaXNpb25GaWxlcy5tYXAoZiA9PiAoCiAgICAgICAgICAgICAgICA8ZGl2IGtleT17Zi5uYW1lfSBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweC0zIHB5LTEuNSBiZy1iZy10ZXJ0aWFyeSByb3VuZGVkLWxnIHRleHQteHMiPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC1zZWNvbmRhcnkgZm9udC1tb25vIHRydW5jYXRlIj57Zi5uYW1lfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIHRleHQtdGV4dC10ZXJ0aWFyeSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2YuZGVjaXNpb25zLnRvTG9jYWxlU3RyaW5nKCl9IGRlY2lzaW9uczwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj57KGYuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMCl9IEtCPC9zcGFuPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICkpfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICkgOiAoCiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgaXRhbGljIj5ObyBkZWNpc2lvbiBmaWxlcyB5ZXQuIFJ1biBi' +
'YXRjaCBzaW1zIHdpdGggbG9nZ2luZyBlbmFibGVkLjwvZGl2PgogICAgICAgICl9CiAgICAgIDwvU2VjdGlvbj4KCiAgICAgIHsvKiDilZDilZDilZAgUGhhc2UgMjogRGF0YXNldCAmIENoZWNrcG9pbnRzIOKVkOKVkOKVkCAqL30KICAgICAgPFNlY3Rpb24gdGl0bGU9IlBoYXNlIDIg4oCUIERhdGFzZXQgJiBNb2RlbCBBcnRpZmFjdHMiIGljb249ezxEYXRhYmFzZSBjbGFzc05hbWU9InctNCBoLTQiIC8+fSBjb2xvcj0idGV4dC1hY2NlbnQtcHVycGxlIj4KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZ3JpZCBncmlkLWNvbHMtMSBtZDpncmlkLWNvbHMtMiBnYXAtNCI+CiAgICAgICAgICB7LyogRGF0YXNldCBzcGxpdHMgKi99CiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS0yIj4KICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT0idGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtdGV4dC10ZXJ0aWFyeSB1cHBlcmNhc2UgdHJhY2tpbmctd2lkZXIiPkRhdGFzZXQgU3BsaXRzPC9oND4KICAgICAgICAgICAge09iamVjdC5rZXlzKGRhdGFTdGF0dXM/LmRhdGFzZXRzID8/IHt9KS5sZW5ndGggPiAwID8gKAogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0zIGdhcC0yIj4KICAgICAgICAgICAgICAgIHsoWyd0cmFpbicsICd2YWwnLCAndGVzdCddIGFzIGNvbnN0KS5tYXAoc3BsaXQgPT4gewogICAgICAgICAgICAgICAgICBjb25zdCBkcyA9IGRhdGFTdGF0dXM/LmRhdGFzZXRzPy5bc3BsaXRdCiAgICAgICAgICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e3NwbGl0fSBjbGFzc05hbWU9InB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSByb3VuZGVkLWxnIj4KICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC1bMTBweF0gdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSI+e3NwbGl0fTwvcD4KICAgICAgICAgICAgICAgICAgICAgIHtkcyA/ICgKICAgICAgICAgICAgICAgICAgICAgICAgPD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtc20gZm9udC1ib2xkIHRleHQtdGV4dC1wcmltYXJ5Ij57ZHMuc2FtcGxlcy50b0xvY2FsZVN0cmluZygpfTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQtWzEwcHhdIHRleHQtdGV4dC10ZXJ0aWFyeSI+e2RzLmZlYXR1cmVzfSBmZWF0dXJlczwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC8+CiAgICAgICAgICAgICAgICAgICAgICApIDogKAogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGl0YWxpYyI+Tm90IGJ1aWx0PC9wPgogICAgICAgICAgICAgICAgICAgICAgKX0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfSl9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICkgOiAoCiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBpdGFsaWMiPk5vIGRhdGFzZXQgYnVpbHQgeWV0LiBUcmFpbmluZyB3aWxsIGJ1aWxkIGl0IGF1dG9tYXRpY2FsbHkuPC9wPgogICAgICAgICAgICApfQogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgey8qIENoZWNrcG9pbnRzICovfQogICAgICAgICAgPGRpdiBjbGFzc05hbWU9InNwYWNlLXktMiI+CiAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9InRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LXRleHQtdGVydGlhcnkgdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVyIj5DaGVja3BvaW50czwvaDQ+CiAgICAgICAgICAgIHsoZGF0YVN0YXR1cz8uY2hlY2twb2ludHM/Lmxlbmd0aCA/PyAwKSA+IDAgPyAoCiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9Im1heC1oLTI4IG92ZXJmbG93LXktYXV0byBzcGFjZS15LTEiPgogICAgICAgICAgICAgICAge2RhdGFTdGF0dXMhLmNoZWNrcG9pbnRzLm1hcChja3B0ID0+ICgKICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2NrcHQubmFtZX0gY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtMyBweS0xLjUgYmctYmctdGVydGlhcnkgcm91bmRlZC1sZyB0ZXh0LXhzIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC1zZWNvbmRhcnkgZm9udC1tb25vIHRydW5jYXRlIj57Y2twdC5uYW1lfTwvc3Bh' +
'bj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC10ZXJ0aWFyeSI+eyhja3B0LnNpemUgLyAxMDI0IC8gMTAyNCkudG9GaXhlZCgxKX0gTUI8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgKSl9CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICkgOiAoCiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBpdGFsaWMiPk5vIGNoZWNrcG9pbnRzIHlldC4gVHJhaW4gYSBtb2RlbCB0byBnZW5lcmF0ZSB0aGVtLjwvcD4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICB7LyogTW9kZWwgaW5mbyArIHJlbG9hZCAqL30KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTIgYm9yZGVyLXQgYm9yZGVyLWJvcmRlci1wcmltYXJ5Ij4KICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyI+CiAgICAgICAgICAgIDxDcHUgY2xhc3NOYW1lPSJ3LTQgaC00IHRleHQtdGV4dC10ZXJ0aWFyeSIgLz4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9InRleHQteHMiPgogICAgICAgICAgICAgIHtoYXNNb2RlbCA/ICgKICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1hY2NlbnQtZ3JlZW4gZm9udC1tZWRpdW0iPgogICAgICAgICAgICAgICAgICBNb2RlbCBsb2FkZWQgb24ge21vZGVsSW5mbz8uZGV2aWNlfSB8IHttb2RlbEluZm8/LmlucHV0X2RpbX0gZmVhdHVyZXMgfCB7bW9kZWxJbmZvPy5udW1fYWN0aW9uc30gYWN0aW9ucwogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICkgOiAoCiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQtdGV4dC10ZXJ0aWFyeSI+Tm8gbW9kZWwgbG9hZGVke21vZGVsSW5mbz8uZXJyb3IgPyBgIOKAlCAke21vZGVsSW5mby5lcnJvcn1gIDogJyd9PC9zcGFuPgogICAgICAgICAgICAgICl9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVJlbG9hZE1vZGVsfQogICAgICAgICAgICBkaXNhYmxlZD17cmVsb2FkaW5nfQogICAgICAgICAgICBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSBiZy1iZy10ZXJ0aWFyeSB0ZXh0LXRleHQtc2Vjb25kYXJ5IHJvdW5kZWQtbGcgaG92ZXI6YmctYmctaG92ZXIgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSB0cmFuc2l0aW9uLWNvbG9ycyBkaXNhYmxlZDpvcGFjaXR5LTUwIgogICAgICAgICAgPgogICAgICAgICAgICB7cmVsb2FkaW5nID8gPFNwaW5uZXIgc2l6ZT0ic20iIC8+IDogPFJvdGF0ZUN3IGNsYXNzTmFtZT0idy0zIGgtMyIgLz59CiAgICAgICAgICAgIFJlbG9hZCBNb2RlbAogICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+CgogICAgICAgIHsvKiBFdmFsIHJlc3VsdHMgKi99CiAgICAgICAge2RhdGFTdGF0dXM/LmV2YWxSZXN1bHRzICYmICgKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJwdC0yIGJvcmRlci10IGJvcmRlci1ib3JkZXItcHJpbWFyeSBzcGFjZS15LTIiPgogICAgICAgICAgICA8aDQgY2xhc3NOYW1lPSJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSB0cmFja2luZy13aWRlciBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgPENoZWNrQ2lyY2xlIGNsYXNzTmFtZT0idy0zLjUgaC0zLjUgdGV4dC1hY2NlbnQtZ3JlZW4iIC8+CiAgICAgICAgICAgICAgTGF0ZXN0IEV2YWx1YXRpb24KICAgICAgICAgICAgPC9oND4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgbWQ6Z3JpZC1jb2xzLTQgZ2FwLTIiPgogICAgICAgICAgICAgIHtPYmplY3QuZW50cmllcyhkYXRhU3RhdHVzLmV2YWxSZXN1bHRzKS5tYXAoKFtrLCB2XSkgPT4gKAogICAgICAgICAgICAgICAgPE1ldHJpY0NhcmQKICAgICAgICAgICAgICAgICAga2V5PXtrfQogICAgICAgICAgICAgICAgICBsYWJlbD17ay5yZXBsYWNlKC9fL2csICcgJyl9CiAgICAgICAgICAgICAgICAgIHZhbHVlPXt0eXBlb2YgdiA9PT0gJ251bWJlcicgPyAoay5pbmNsdWRlcygnYWNjdXJhY3knKSB8fCBrLmluY2x1ZGVz' +
'KCdyYXRlJykgPyBgJHsodiAqIDEwMCkudG9GaXhlZCgxKX0lYCA6IHYudG9GaXhlZCg0KSkgOiBTdHJpbmcodil9CiAgICAgICAgICAgICAgICAgIGFjY2VudD17ay5pbmNsdWRlcygnYWNjdXJhY3knKSA/ICd0ZXh0LWFjY2VudC1ncmVlbicgOiB1bmRlZmluZWR9CiAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICkpfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvU2VjdGlvbj4KCiAgICAgIHsvKiDilZDilZDilZAgUGhhc2UgMzogU3VwZXJ2aXNlZCBUcmFpbmluZyDilZDilZDilZAgKi99CiAgICAgIDxTZWN0aW9uIHRpdGxlPSJQaGFzZSAzIOKAlCBTdXBlcnZpc2VkIFRyYWluaW5nIiBpY29uPXs8QWN0aXZpdHkgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPn0+CiAgICAgICAgey8qIENvbmZpZyAqL30KICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ic3BhY2UteS0zIj4KICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIGdhcC0zIj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBibG9jayBtYi0xIj5FcG9jaHM8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG1pbj17MX0gbWF4PXsxMDAwfSB2YWx1ZT17ZXBvY2hzfSBvbkNoYW5nZT17ZSA9PiBzZXRFcG9jaHMoTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSl9CiAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNUcmFpbmluZ30KICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIGRpc2FibGVkOm9wYWNpdHktNTAiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGJsb2NrIG1iLTEiPkxlYXJuaW5nIFJhdGU8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG1pbj17MC4wMDAwMX0gbWF4PXsxfSBzdGVwPXswLjAwMDF9IHZhbHVlPXtscn0gb25DaGFuZ2U9e2UgPT4gc2V0THIoTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSl9CiAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNUcmFpbmluZ30KICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIGRpc2FibGVkOm9wYWNpdHktNTAiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgey8qIEFkdmFuY2VkIHRvZ2dsZSAqL30KICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0U2hvd1N1cEFkdmFuY2VkKCFzaG93U3VwQWR2YW5jZWQpfSBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnkgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgICA8U2V0dGluZ3MgY2xhc3NOYW1lPSJ3LTMgaC0zIiAvPgogICAgICAgICAgICB7c2hvd1N1cEFkdmFuY2VkID8gJ0hpZGUnIDogJ1Nob3cnfSBhZHZhbmNlZCBvcHRpb25zCiAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgIHtzaG93U3VwQWR2YW5jZWQgJiYgKAogICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZ3JpZCBncmlkLWNvbHMtMyBnYXAtMyBhbmltYXRlLWZhZGUtaW4iPgogICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBibG9jayBtYi0xIj5CYXRjaCBTaXplPC9sYWJlbD4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG1pbj17MTZ9IG1heD17MjA0OH0gdmFsdWU9e2JhdGNoU2l6ZX0gb25DaGFuZ2U9e2UgPT4gc2V0QmF0Y2hTaXplKE51bWJlcihlLnRhcmdldC52YWx1ZSkpfQogICAgICAgICAgICAgICAgICBkaXNhYmxlZD17' +
'aXNUcmFpbmluZ30KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCIgLz4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgYmxvY2sgbWItMSI+RWFybHkgU3RvcCBQYXRpZW5jZTwvbGFiZWw+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49ezF9IG1heD17MTAwfSB2YWx1ZT17cGF0aWVuY2V9IG9uQ2hhbmdlPXtlID0+IHNldFBhdGllbmNlKE51bWJlcihlLnRhcmdldC52YWx1ZSkpfQogICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNUcmFpbmluZ30KICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCIgLz4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1lbmQgcGItMSI+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkgY3Vyc29yLXBvaW50ZXIgc2VsZWN0LW5vbmUiPgogICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9e3JlYnVpbGREYXRhc2V0fSBvbkNoYW5nZT17ZSA9PiBzZXRSZWJ1aWxkRGF0YXNldChlLnRhcmdldC5jaGVja2VkKX0KICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNUcmFpbmluZ30KICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9InJvdW5kZWQgYm9yZGVyLWJvcmRlci1wcmltYXJ5IGJnLWJnLXRlcnRpYXJ5IHRleHQtYWNjZW50LWJsdWUgZm9jdXM6cmluZy1hY2NlbnQtYmx1ZS8zMCB3LTMuNSBoLTMuNSIgLz4KICAgICAgICAgICAgICAgICAgUmVidWlsZCBkYXRhc2V0CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICl9CiAgICAgICAgPC9kaXY+CgogICAgICAgIHsvKiBUcmFpbmluZyBzdGF0dXMgLyBzdGFydCBidXR0b24gKi99CiAgICAgICAge2lzVHJhaW5pbmcgfHwgKHRyYWluU3RhdHVzPy5waGFzZSAmJiB0cmFpblN0YXR1cy5waGFzZSAhPT0gJ2lkbGUnKSA/ICgKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJzcGFjZS15LTMgYmctYmctdGVydGlhcnkvNTAgcm91bmRlZC14bCBwLTQgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgICA8UGhhc2VCYWRnZSBwaGFzZT17dHJhaW5TdGF0dXMhLnBoYXNlfSAvPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC1zZWNvbmRhcnkiPnt0cmFpblN0YXR1cyEubWVzc2FnZX08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAge3RyYWluU3RhdHVzIS5zdGFydGVkX2F0ICYmICgKICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC1bMTBweF0gdGV4dC10ZXh0LXRlcnRpYXJ5Ij5TdGFydGVkOiB7bmV3IERhdGUodHJhaW5TdGF0dXMhLnN0YXJ0ZWRfYXQpLnRvTG9jYWxlVGltZVN0cmluZygpfTwvc3Bhbj4KICAgICAgICAgICAgICApfQogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIHsvKiBQcm9ncmVzcyBiYXIg4oCUIG9ubHkgaW4gdHJhaW5pbmcgcGhhc2UgKi99CiAgICAgICAgICAgIHsodHJhaW5TdGF0dXMhLnBoYXNlID09PSAndHJhaW5pbmcnIHx8IHRyYWluU3RhdHVzIS5waGFzZSA9PT0gJ2RvbmUnKSAmJiB0cmFpblN0YXR1cyEu' +
'dG90YWxfZXBvY2hzID4gMCAmJiAoCiAgICAgICAgICAgICAgPFByb2dyZXNzQmFyCiAgICAgICAgICAgICAgICB2YWx1ZT17dHJhaW5TdGF0dXMhLmN1cnJlbnRfZXBvY2h9CiAgICAgICAgICAgICAgICBtYXg9e3RyYWluU3RhdHVzIS50b3RhbF9lcG9jaHN9CiAgICAgICAgICAgICAgICBsYWJlbD0iRXBvY2ggcHJvZ3Jlc3MiCiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgKX0KCiAgICAgICAgICAgIHsvKiBMaXZlIG1ldHJpY3MgZHVyaW5nIHRyYWluaW5nICovfQogICAgICAgICAgICB7dHJhaW5TdGF0dXMhLm1ldHJpY3MgJiYgKAogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIG1kOmdyaWQtY29scy00IGdhcC0yIj4KICAgICAgICAgICAgICAgIHtPYmplY3QuZW50cmllcyh0cmFpblN0YXR1cyEubWV0cmljcykubWFwKChbaywgdl0pID0+IHsKICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2ICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGwKICAgICAgICAgICAgICAgICAgY29uc3QgaXNBY2MgPSBrLmluY2x1ZGVzKCdhY2N1cmFjeScpIHx8IGsuaW5jbHVkZXMoJ2FjYycpCiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTG9zcyA9IGsuaW5jbHVkZXMoJ2xvc3MnKQogICAgICAgICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgICAgIDxNZXRyaWNDYXJkCiAgICAgICAgICAgICAgICAgICAgICBrZXk9e2t9CiAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17ay5yZXBsYWNlKC9fL2csICcgJyl9CiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17aXNBY2MgPyBgJHsodiAqIDEwMCkudG9GaXhlZCgxKX0lYCA6IHYudG9GaXhlZCg0KX0KICAgICAgICAgICAgICAgICAgICAgIGFjY2VudD17aXNBY2MgPyAndGV4dC1hY2NlbnQtZ3JlZW4nIDogaXNMb3NzID8gJ3RleHQtYWNjZW50LWFtYmVyJyA6IHVuZGVmaW5lZH0KICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9KX0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgKX0KCiAgICAgICAgICAgIHsvKiBGaW5hbCByZXN1bHQgKi99CiAgICAgICAgICAgIHt0cmFpblN0YXR1cyEucGhhc2UgPT09ICdkb25lJyAmJiB0cmFpblN0YXR1cyEucmVzdWx0ICYmICgKICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0icHQtMiBib3JkZXItdCBib3JkZXItYm9yZGVyLXByaW1hcnkgc3BhY2UteS0yIj4KICAgICAgICAgICAgICAgIDxoNCBjbGFzc05hbWU9InRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWFjY2VudC1ncmVlbiBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41Ij4KICAgICAgICAgICAgICAgICAgPENoZWNrQ2lyY2xlIGNsYXNzTmFtZT0idy0zLjUgaC0zLjUiIC8+IFRyYWluaW5nIENvbXBsZXRlCiAgICAgICAgICAgICAgICA8L2g0PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgbWQ6Z3JpZC1jb2xzLTQgZ2FwLTIiPgogICAgICAgICAgICAgICAgICA8TWV0cmljQ2FyZCBsYWJlbD0iRGV2aWNlIiB2YWx1ZT17dHJhaW5TdGF0dXMhLnJlc3VsdC5kZXZpY2V9IC8+CiAgICAgICAgICAgICAgICAgIDxNZXRyaWNDYXJkIGxhYmVsPSJDaGVja3BvaW50IiB2YWx1ZT17dHJhaW5TdGF0dXMhLnJlc3VsdC5jaGVja3BvaW50LnNwbGl0KCcvJykucG9wKCkgfHwgJ+KAlCd9IC8+CiAgICAgICAgICAgICAgICAgIHt0cmFpblN0YXR1cyEucmVzdWx0LmV2YWx1YXRpb24gJiYgT2JqZWN0LmVudHJpZXModHJhaW5TdGF0dXMhLnJlc3VsdC5ldmFsdWF0aW9uKS5tYXAoKFtrLCB2XSkgPT4gKAogICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2ID09PSAnbnVtYmVyJyA/ICgKICAgICAgICAgICAgICAgICAgICAgIDxNZXRyaWNDYXJkIGtleT17a30gbGFiZWw9e2sucmVwbGFjZSgvXy9nLCAnICcpfQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ay5pbmNsdWRlcygnYWNjdXJhY3knKSA/IGAkeyh2ICogMTAwKS50b0ZpeGVkKDEpfSVgIDogdi50b0ZpeGVkKDQpfQogICAgICAgICAgICAgICAgICAgICAgICBhY2NlbnQ9e2suaW5jbHVkZXMoJ2FjY3VyYWN5JykgPyAndGV4dC1hY2NlbnQtZ3JlZW4nIDogdW5kZWZpbmVkfSAvPgogICAgICAgICAgICAgICAgICAgICkgOiBudWxsCiAgICAgICAgICAgICAgICAgICkpfQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICl9CgogICAg' +
'ICAgICAgICB7LyogRXJyb3Igc3RhdGUgKi99CiAgICAgICAgICAgIHt0cmFpblN0YXR1cyEucGhhc2UgPT09ICdlcnJvcicgJiYgdHJhaW5TdGF0dXMhLmVycm9yICYmICgKICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1zdGFydCBnYXAtMiBiZy1hY2NlbnQtcmVkLzEwIGJvcmRlciBib3JkZXItYWNjZW50LXJlZC8yMCByb3VuZGVkLWxnIHB4LTMgcHktMiI+CiAgICAgICAgICAgICAgICA8QWxlcnRDaXJjbGUgY2xhc3NOYW1lPSJ3LTQgaC00IHRleHQtYWNjZW50LXJlZCBtdC0wLjUgZmxleC1zaHJpbmstMCIgLz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LWFjY2VudC1yZWQiPnt0cmFpblN0YXR1cyEuZXJyb3J9PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICApfQogICAgICAgICAgPC9kaXY+CiAgICAgICAgKSA6ICgKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMyI+CiAgICAgICAgICAgIDxidXR0b24KICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTdGFydFRyYWlufQogICAgICAgICAgICAgIGRpc2FibGVkPXtzdGFydGluZ1RyYWluIHx8ICFoYXNEZWNpc2lvbnMgfHwgaXNQcG99CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC00IHB5LTIuNSBiZy1hY2NlbnQtYmx1ZS8xNSB0ZXh0LWFjY2VudC1ibHVlIHRleHQtc20gZm9udC1tZWRpdW0gcm91bmRlZC1sZyBob3ZlcjpiZy1hY2NlbnQtYmx1ZS8yNSBib3JkZXIgYm9yZGVyLWFjY2VudC1ibHVlLzMwIHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNDAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAge3N0YXJ0aW5nVHJhaW4gPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8UGxheSBjbGFzc05hbWU9InctNCBoLTQiIC8+fQogICAgICAgICAgICAgIFN0YXJ0IFRyYWluaW5nCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICB7IWhhc0RlY2lzaW9ucyAmJiAoCiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBpdGFsaWMiPkVuYWJsZSBsb2dnaW5nIGFuZCBydW4gYmF0Y2ggc2ltcyBmaXJzdCB0byBnZW5lcmF0ZSBkZWNpc2lvbiBkYXRhLjwvc3Bhbj4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvU2VjdGlvbj4KCiAgICAgIHsvKiDilZDilZDilZAgUGhhc2UgNDogUFBPIFJlaW5mb3JjZW1lbnQgTGVhcm5pbmcg4pWQ4pWQ4pWQICovfQogICAgICA8U2VjdGlvbiB0aXRsZT0iUGhhc2UgNCDigJQgUFBPIFJlaW5mb3JjZW1lbnQgTGVhcm5pbmciIGljb249ezxaYXAgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPn0gY29sb3I9InRleHQtYWNjZW50LXB1cnBsZSIgZGVmYXVsdE9wZW49e2ZhbHNlfT4KICAgICAgICA8cCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXNlY29uZGFyeSI+CiAgICAgICAgICBGaW5lLXR1bmUgdGhlIHN1cGVydmlzZWQgbW9kZWwgdXNpbmcgUFBPIHNlbGYtcGxheSBhZ2FpbnN0IGFuIG9wcG9uZW50IHBvbGljeS4KICAgICAgICA8L3A+CgogICAgICAgIHsvKiBDb25maWcgKi99CiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTMiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgYmxvY2sgbWItMSI+SXRlcmF0aW9uczwvbGFiZWw+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG1pbj17MX0gbWF4PXsxMDAwfSB2YWx1ZT17cHBvSXRlcmF0aW9uc30gb25DaGFuZ2U9e2UgPT4gc2V0UHBvSXRlcmF0aW9ucyhOdW1iZXIoZS50YXJnZXQudmFsdWUpKX0KICAgICAgICAgICAgICBkaXNhYmxlZD17aXNQcG99CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCIgLz4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0i' +
'dGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgYmxvY2sgbWItMSI+T3Bwb25lbnQ8L2xhYmVsPgogICAgICAgICAgICA8c2VsZWN0IHZhbHVlPXtwcG9PcHBvbmVudH0gb25DaGFuZ2U9e2UgPT4gc2V0UHBvT3Bwb25lbnQoZS50YXJnZXQudmFsdWUpfQogICAgICAgICAgICAgIGRpc2FibGVkPXtpc1Bwb30KICAgICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCBkaXNhYmxlZDpvcGFjaXR5LTUwIj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJoZXVyaXN0aWMiPkhldXJpc3RpYzwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InJhbmRvbSI+UmFuZG9tPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ic2VsZiI+U2VsZi1QbGF5PC9vcHRpb24+CiAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gc2V0U2hvd1Bwb0FkdmFuY2VkKCFzaG93UHBvQWR2YW5jZWQpfSBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGhvdmVyOnRleHQtdGV4dC1zZWNvbmRhcnkgdHJhbnNpdGlvbi1jb2xvcnMiPgogICAgICAgICAgPFNldHRpbmdzIGNsYXNzTmFtZT0idy0zIGgtMyIgLz4KICAgICAgICAgIHtzaG93UHBvQWR2YW5jZWQgPyAnSGlkZScgOiAnU2hvdyd9IGFkdmFuY2VkIG9wdGlvbnMKICAgICAgICA8L2J1dHRvbj4KICAgICAgICB7c2hvd1Bwb0FkdmFuY2VkICYmICgKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0zIGdhcC0zIGFuaW1hdGUtZmFkZS1pbiI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgYmxvY2sgbWItMSI+RXBpc29kZXMgLyBJdGVyPC9sYWJlbD4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49ezF9IG1heD17NTEyfSB2YWx1ZT17cHBvRXBpc29kZXN9IG9uQ2hhbmdlPXtlID0+IHNldFBwb0VwaXNvZGVzKE51bWJlcihlLnRhcmdldC52YWx1ZSkpfQogICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzUHBvfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgYmxvY2sgbWItMSI+UFBPIEVwb2NoczwvbGFiZWw+CiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgbWluPXsxfSBtYXg9ezIwfSB2YWx1ZT17cHBvRXBvY2hzfSBvbkNoYW5nZT17ZSA9PiBzZXRQcG9FcG9jaHMoTnVtYmVyKGUudGFyZ2V0LnZhbHVlKSl9CiAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNQcG99CiAgICAgICAgICAgICAgICBjbGFzc05hbWU9InctZnVsbCBweC0zIHB5LTIgYmctYmctdGVydGlhcnkgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSByb3VuZGVkLWxnIHRleHQtc20gdGV4dC10ZXh0LXByaW1hcnkgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOmJvcmRlci1hY2NlbnQtYmx1ZS81MCB0cmFuc2l0aW9uLWFsbCBkaXNhYmxlZDpvcGFjaXR5LTUwIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBibG9jayBtYi0xIj5CYXRjaCBTaXplPC9sYWJlbD4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49ezE2fSBtYXg9ezIwNDh9IHZhbHVlPXtwcG9CYXRjaFNpemV9IG9uQ2hhbmdlPXtlID0+IHNldFBwb0JhdGNoU2l6ZShOdW1iZXIoZS50YXJnZXQudmFsdWUpKX0KICAgICAgICAgICAg' +
'ICAgIGRpc2FibGVkPXtpc1Bwb30KICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIGRpc2FibGVkOm9wYWNpdHktNTAiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGJsb2NrIG1iLTEiPkxlYXJuaW5nIFJhdGU8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG1pbj17MC4wMDAwMDF9IG1heD17MC4wMX0gc3RlcD17MC4wMDAxfSB2YWx1ZT17cHBvTHJ9IG9uQ2hhbmdlPXtlID0+IHNldFBwb0xyKE51bWJlcihlLnRhcmdldC52YWx1ZSkpfQogICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzUHBvfQogICAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCIgLz4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgYmxvY2sgbWItMSI+Q2xpcCBFcHNpbG9uPC9sYWJlbD4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49ezAuMDV9IG1heD17MC41fSBzdGVwPXswLjA1fSB2YWx1ZT17cHBvQ2xpcEVwc30gb25DaGFuZ2U9e2UgPT4gc2V0UHBvQ2xpcEVwcyhOdW1iZXIoZS50YXJnZXQudmFsdWUpKX0KICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1Bwb30KICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIGRpc2FibGVkOm9wYWNpdHktNTAiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGJsb2NrIG1iLTEiPkVudHJvcHkgQ29lZmY8L2xhYmVsPgogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIG1pbj17MH0gbWF4PXswLjF9IHN0ZXA9ezAuMDA1fSB2YWx1ZT17cHBvRW50cm9weX0gb25DaGFuZ2U9e2UgPT4gc2V0UHBvRW50cm9weShOdW1iZXIoZS50YXJnZXQudmFsdWUpKX0KICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc1Bwb30KICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIGRpc2FibGVkOm9wYWNpdHktNTAiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgKX0KCiAgICAgICAgey8qIFBQTyBydW5uaW5nIHN0YXR1cyAqL30KICAgICAgICB7aXNQcG8gfHwgKHBwb1N0YXR1cz8ucGhhc2UgJiYgcHBvU3RhdHVzLnBoYXNlICE9PSAnaWRsZScpID8gKAogICAgICAgICAgPGRpdiBjbGFzc05hbWU9InNwYWNlLXktMyBiZy1iZy10ZXJ0aWFyeS81MCByb3VuZGVkLXhsIHAtNCBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5Ij4KICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIj4KICAgICAgICAgICAgICA8UGhhc2VCYWRnZSBwaGFzZT17cHBvU3RhdHVzIS5waGFzZX0gLz4KICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXNlY29uZGFyeSI+e3Bwb1N0YXR1cyEubWVzc2FnZX08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAg' +
'ICAgeyhwcG9TdGF0dXMhLnBoYXNlID09PSAndHJhaW5pbmcnIHx8IHBwb1N0YXR1cyEucGhhc2UgPT09ICdkb25lJykgJiYgcHBvU3RhdHVzIS50b3RhbF9pdGVyYXRpb25zID4gMCAmJiAoCiAgICAgICAgICAgICAgPFByb2dyZXNzQmFyCiAgICAgICAgICAgICAgICB2YWx1ZT17cHBvU3RhdHVzIS5pdGVyYXRpb259CiAgICAgICAgICAgICAgICBtYXg9e3Bwb1N0YXR1cyEudG90YWxfaXRlcmF0aW9uc30KICAgICAgICAgICAgICAgIGxhYmVsPSJQUE8gaXRlcmF0aW9uIgogICAgICAgICAgICAgICAgY29sb3I9ImJnLWFjY2VudC1wdXJwbGUiCiAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgKX0KCiAgICAgICAgICAgIHtwcG9TdGF0dXMhLm1ldHJpY3MgJiYgKAogICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJncmlkIGdyaWQtY29scy0yIG1kOmdyaWQtY29scy00IGdhcC0yIj4KICAgICAgICAgICAgICAgIHtwcG9TdGF0dXMhLm1ldHJpY3Mud2luX3JhdGUgIT0gbnVsbCAmJiAoCiAgICAgICAgICAgICAgICAgIDxNZXRyaWNDYXJkIGxhYmVsPSJXaW4gUmF0ZSIgdmFsdWU9e2AkeyhwcG9TdGF0dXMhLm1ldHJpY3Mud2luX3JhdGUgKiAxMDApLnRvRml4ZWQoMSl9JWB9IGFjY2VudD0idGV4dC1hY2NlbnQtZ3JlZW4iIC8+CiAgICAgICAgICAgICAgICApfQogICAgICAgICAgICAgICAge3Bwb1N0YXR1cyEubWV0cmljcy5hdmdfcmV3YXJkICE9IG51bGwgJiYgKAogICAgICAgICAgICAgICAgICA8TWV0cmljQ2FyZCBsYWJlbD0iQXZnIFJld2FyZCIgdmFsdWU9e3Bwb1N0YXR1cyEubWV0cmljcy5hdmdfcmV3YXJkLnRvRml4ZWQoMyl9IGFjY2VudD0idGV4dC1hY2NlbnQtYW1iZXIiIC8+CiAgICAgICAgICAgICAgICApfQogICAgICAgICAgICAgICAge3Bwb1N0YXR1cyEubWV0cmljcy5wb2xpY3lfbG9zcyAhPSBudWxsICYmICgKICAgICAgICAgICAgICAgICAgPE1ldHJpY0NhcmQgbGFiZWw9IlBvbGljeSBMb3NzIiB2YWx1ZT17cHBvU3RhdHVzIS5tZXRyaWNzLnBvbGljeV9sb3NzLnRvRml4ZWQoNCl9IC8+CiAgICAgICAgICAgICAgICApfQogICAgICAgICAgICAgICAge3Bwb1N0YXR1cyEubWV0cmljcy5lbnRyb3B5ICE9IG51bGwgJiYgKAogICAgICAgICAgICAgICAgICA8TWV0cmljQ2FyZCBsYWJlbD0iRW50cm9weSIgdmFsdWU9e3Bwb1N0YXR1cyEubWV0cmljcy5lbnRyb3B5LnRvRml4ZWQoNCl9IC8+CiAgICAgICAgICAgICAgICApfQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICApfQoKICAgICAgICAgICAge3Bwb1N0YXR1cyEucGhhc2UgPT09ICdkb25lJyAmJiBwcG9TdGF0dXMhLnJlc3VsdCAmJiAoCiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHB0LTIgYm9yZGVyLXQgYm9yZGVyLWJvcmRlci1wcmltYXJ5Ij4KICAgICAgICAgICAgICAgIDxDaGVja0NpcmNsZSBjbGFzc05hbWU9InctMy41IGgtMy41IHRleHQtYWNjZW50LWdyZWVuIiAvPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtYWNjZW50LWdyZWVuIGZvbnQtbWVkaXVtIj4KICAgICAgICAgICAgICAgICAgUFBPIFRyYWluaW5nIENvbXBsZXRlIOKAlCBCZXN0IFdpbiBSYXRlOiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHBwb1N0YXR1cyEucmVzdWx0LmJlc3Rfd2luX3JhdGUgPT09ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICA/IGAkeyhwcG9TdGF0dXMhLnJlc3VsdC5iZXN0X3dpbl9yYXRlIGFzIG51bWJlciAqIDEwMCkudG9GaXhlZCgxKX0lYAogICAgICAgICAgICAgICAgICAgICAgOiAn4oCUJwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICl9CgogICAgICAgICAgICB7cHBvU3RhdHVzIS5waGFzZSA9PT0gJ2Vycm9yJyAmJiBwcG9TdGF0dXMhLmVycm9yICYmICgKICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0iZmxleCBpdGVtcy1zdGFydCBnYXAtMiBiZy1hY2NlbnQtcmVkLzEwIGJvcmRlciBib3JkZXItYWNjZW50LXJlZC8yMCByb3VuZGVkLWxnIHB4LTMgcHktMiI+CiAgICAgICAgICAgICAgICA8QWxlcnRDaXJjbGUgY2xhc3NOYW1lPSJ3LTQgaC00IHRleHQtYWNjZW50LXJlZCBtdC0wLjUgZmxleC1zaHJpbmstMCIgLz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LWFjY2VudC1yZWQiPntwcG9TdGF0dXMh' +
'LmVycm9yfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICkgOiAoCiAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVN0YXJ0UHBvfQogICAgICAgICAgICBkaXNhYmxlZD17c3RhcnRpbmdQcG8gfHwgaXNUcmFpbmluZyB8fCAhaGFzTW9kZWx9CiAgICAgICAgICAgIGNsYXNzTmFtZT0iZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtNCBweS0yLjUgYmctYWNjZW50LXB1cnBsZS8xNSB0ZXh0LWFjY2VudC1wdXJwbGUgdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLWxnIGhvdmVyOmJnLWFjY2VudC1wdXJwbGUvMjUgYm9yZGVyIGJvcmRlci1hY2NlbnQtcHVycGxlLzMwIHRyYW5zaXRpb24tY29sb3JzIGRpc2FibGVkOm9wYWNpdHktNDAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIgogICAgICAgICAgPgogICAgICAgICAgICB7c3RhcnRpbmdQcG8gPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8UGxheSBjbGFzc05hbWU9InctNCBoLTQiIC8+fQogICAgICAgICAgICBTdGFydCBQUE8gVHJhaW5pbmcKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICl9CiAgICAgICAgeyFoYXNNb2RlbCAmJiAhKGlzUHBvIHx8IChwcG9TdGF0dXM/LnBoYXNlICYmIHBwb1N0YXR1cy5waGFzZSAhPT0gJ2lkbGUnKSkgJiYgKAogICAgICAgICAgPHAgY2xhc3NOYW1lPSJ0ZXh0LXhzIHRleHQtdGV4dC10ZXJ0aWFyeSBpdGFsaWMiPlRyYWluIGEgc3VwZXJ2aXNlZCBtb2RlbCBmaXJzdCAoUGhhc2UgMykgYmVmb3JlIHJ1bm5pbmcgUFBPLjwvcD4KICAgICAgICApfQogICAgICA8L1NlY3Rpb24+CgogICAgICB7Lyog4pWQ4pWQ4pWQIFBoYXNlIDU6IFRvdXJuYW1lbnQgRXZhbHVhdGlvbiDilZDilZDilZAgKi99CiAgICAgIDxTZWN0aW9uIHRpdGxlPSJQaGFzZSA1IOKAlCBUb3VybmFtZW50IEV2YWx1YXRpb24iIGljb249ezxTd29yZHMgY2xhc3NOYW1lPSJ3LTQgaC00IiAvPn0gY29sb3I9InRleHQtYWNjZW50LWFtYmVyIiBkZWZhdWx0T3Blbj17ZmFsc2V9PgogICAgICAgIDxwIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtc2Vjb25kYXJ5Ij4KICAgICAgICAgIFBpdCB0aGUgdHJhaW5lZCBtb2RlbCBhZ2FpbnN0IGhldXJpc3RpYywgcmFuZG9tLCBhbmQgb3RoZXIgcG9saWN5IHZhcmlhbnRzLgogICAgICAgIDwvcD4KCiAgICAgICAgPGRpdiBjbGFzc05hbWU9ImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTMiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT0idGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgYmxvY2sgbWItMSI+RXBpc29kZXMgcGVyIE1hdGNodXA8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49ezEwfSBtYXg9ezEwMDB9IHZhbHVlPXt0b3VybkVwaXNvZGVzfSBvbkNoYW5nZT17ZSA9PiBzZXRUb3VybkVwaXNvZGVzKE51bWJlcihlLnRhcmdldC52YWx1ZSkpfQogICAgICAgICAgICAgIGRpc2FibGVkPXtpc1RvdXJufQogICAgICAgICAgICAgIGNsYXNzTmFtZT0idy1mdWxsIHB4LTMgcHktMiBiZy1iZy10ZXJ0aWFyeSBib3JkZXIgYm9yZGVyLWJvcmRlci1wcmltYXJ5IHJvdW5kZWQtbGcgdGV4dC1zbSB0ZXh0LXRleHQtcHJpbWFyeSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWFjY2VudC1ibHVlLzUwIHRyYW5zaXRpb24tYWxsIGRpc2FibGVkOm9wYWNpdHktNTAiIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGJsb2NrIG1iLTEiPlBsYXlzdHlsZTwvbGFiZWw+CiAgICAgICAgICAgIDxzZWxlY3QgdmFsdWU9e3RvdXJuUGxheXN0eWxlfSBvbkNoYW5nZT17ZSA9PiBzZXRUb3VyblBsYXlzdHlsZShlLnRhcmdldC52YWx1ZSl9CiAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzVG91cm59CiAgICAgICAgICAgICAgY2xhc3NOYW1lPSJ3LWZ1bGwgcHgtMyBweS0yIGJnLWJnLXRlcnRpYXJ5IGJvcmRlciBib3JkZXItYm9yZGVyLXByaW1hcnkgcm91bmRlZC1sZyB0ZXh0LXNtIHRleHQtdGV4dC1wcmltYXJ5IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItYWNjZW50LWJsdWUvNTAgdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6b3BhY2l0eS01MCI+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibWlkcmFuZ2UiPk1pZHJhbmdlPC9vcHRp' +
'b24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWdncm8iPkFnZ3JvPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iY29udHJvbCI+Q29udHJvbDwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImNvbWJvIj5Db21ibzwvb3B0aW9uPgogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICB7LyogVG91cm5hbWVudCBzdGF0dXMgKi99CiAgICAgICAge2lzVG91cm4gfHwgKHRvdXJuU3RhdHVzPy5waGFzZSAmJiB0b3VyblN0YXR1cy5waGFzZSAhPT0gJ2lkbGUnKSA/ICgKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJzcGFjZS15LTMgYmctYmctdGVydGlhcnkvNTAgcm91bmRlZC14bCBwLTQgYm9yZGVyIGJvcmRlci1ib3JkZXItcHJpbWFyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgPFBoYXNlQmFkZ2UgcGhhc2U9e3RvdXJuU3RhdHVzIS5waGFzZX0gLz4KICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC10ZXh0LXNlY29uZGFyeSI+e3RvdXJuU3RhdHVzIS5tZXNzYWdlfTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICB7dG91cm5TdGF0dXMhLnBoYXNlID09PSAnZXJyb3InICYmIHRvdXJuU3RhdHVzIS5lcnJvciAmJiAoCiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9ImZsZXggaXRlbXMtc3RhcnQgZ2FwLTIgYmctYWNjZW50LXJlZC8xMCBib3JkZXIgYm9yZGVyLWFjY2VudC1yZWQvMjAgcm91bmRlZC1sZyBweC0zIHB5LTIiPgogICAgICAgICAgICAgICAgPEFsZXJ0Q2lyY2xlIGNsYXNzTmFtZT0idy00IGgtNCB0ZXh0LWFjY2VudC1yZWQgbXQtMC41IGZsZXgtc2hyaW5rLTAiIC8+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9InRleHQteHMgdGV4dC1hY2NlbnQtcmVkIj57dG91cm5TdGF0dXMhLmVycm9yfTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgKX0KICAgICAgICAgIDwvZGl2PgogICAgICAgICkgOiAoCiAgICAgICAgICA8YnV0dG9uCiAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVN0YXJ0VG91cm5hbWVudH0KICAgICAgICAgICAgZGlzYWJsZWQ9e3N0YXJ0aW5nVG91cm4gfHwgaXNUcmFpbmluZyB8fCBpc1Bwb30KICAgICAgICAgICAgY2xhc3NOYW1lPSJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC00IHB5LTIuNSBiZy1hY2NlbnQtYW1iZXIvMTUgdGV4dC1hY2NlbnQtYW1iZXIgdGV4dC1zbSBmb250LW1lZGl1bSByb3VuZGVkLWxnIGhvdmVyOmJnLWFjY2VudC1hbWJlci8yNSBib3JkZXIgYm9yZGVyLWFjY2VudC1hbWJlci8zMCB0cmFuc2l0aW9uLWNvbG9ycyBkaXNhYmxlZDpvcGFjaXR5LTQwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCIKICAgICAgICAgID4KICAgICAgICAgICAge3N0YXJ0aW5nVG91cm4gPyA8U3Bpbm5lciBzaXplPSJzbSIgLz4gOiA8VHJvcGh5IGNsYXNzTmFtZT0idy00IGgtNCIgLz59CiAgICAgICAgICAgIFN0YXJ0IFRvdXJuYW1lbnQKICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICl9CgogICAgICAgIHsvKiBUb3VybmFtZW50IHJlc3VsdHMgKi99CiAgICAgICAgeyh0b3VyblN0YXR1cz8ucmVzdWx0Py5wbGF5ZXJzPy5sZW5ndGggPz8gMCkgPiAwICYmICgKICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSJwdC0yIGJvcmRlci10IGJvcmRlci1ib3JkZXItcHJpbWFyeSBzcGFjZS15LTIiPgogICAgICAgICAgICA8aDQgY2xhc3NOYW1lPSJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC10ZXh0LXRlcnRpYXJ5IHVwcGVyY2FzZSB0cmFja2luZy13aWRlciBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiI+CiAgICAgICAgICAgICAgPFRyb3BoeSBjbGFzc05hbWU9InctMy41IGgtMy41IHRleHQtYWNjZW50LWFtYmVyIiAvPgogICAgICAgICAgICAgIExlYWRlcmJvYXJkCiAgICAgICAgICAgIDwvaDQ+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzc05hbWU9InctZnVsbCB0ZXh0LXNtIj4KICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICA8dHIgY2xhc3NOYW1lPSJib3JkZXItYiBib3JkZXItYm9yZGVyLXByaW1hcnkiPgogICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPSJweC0zIHB5LTIgdGV4dC1sZWZ0IHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGZvbnQtbWVkaXVtIHctOCI+IzwvdGg+CiAg' +
'ICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTMgcHktMiB0ZXh0LWxlZnQgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0iPlBvbGljeTwvdGg+CiAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9InB4LTMgcHktMiB0ZXh0LXJpZ2h0IHRleHQteHMgdGV4dC10ZXh0LXRlcnRpYXJ5IGZvbnQtbWVkaXVtIj5XaW5zPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtMyBweS0yIHRleHQtcmlnaHQgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0iPkdhbWVzPC90aD4KICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT0icHgtMyBweS0yIHRleHQtcmlnaHQgdGV4dC14cyB0ZXh0LXRleHQtdGVydGlhcnkgZm9udC1tZWRpdW0iPldpbiBSYXRlPC90aD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICA8dGJvZHkgY2xhc3NOYW1lPSJkaXZpZGUteSBkaXZpZGUtYm9yZGVyLXByaW1hcnkiPgogICAgICAgICAgICAgICAge3RvdXJuU3RhdHVzIS5yZXN1bHQhLnBsYXllcnMKICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIud2luX3JhdGUgLSBhLndpbl9yYXRlKQogICAgICAgICAgICAgICAgICAubWFwKChwLCBpKSA9PiAoCiAgICAgICAgICAgICAgICAgICAgPHRyIGtleT17cC5uYW1lfSBjbGFzc05hbWU9ImhvdmVyOmJnLWJnLWhvdmVyIHRyYW5zaXRpb24tY29sb3JzIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9InB4LTMgcHktMiB0ZXh0LXRleHQtdGVydGlhcnkgdGV4dC14cyI+CiAgICAgICAgICAgICAgICAgICAgICAgIHtpID09PSAwID8gPFRyb3BoeSBjbGFzc05hbWU9InctMy41IGgtMy41IHRleHQtYWNjZW50LWFtYmVyIiAvPiA6IGkgKyAxfQogICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9InB4LTMgcHktMiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0idGV4dC10ZXh0LXByaW1hcnkgZm9udC1tZWRpdW0gY2FwaXRhbGl6ZSI+e3AubmFtZX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT0icHgtMyBweS0yIHRleHQtcmlnaHQgdGV4dC10ZXh0LXNlY29uZGFyeSI+e3Aud2luc308L3RkPgogICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT0icHgtMyBweS0yIHRleHQtcmlnaHQgdGV4dC10ZXh0LXNlY29uZGFyeSI+e3AuZ2FtZXN9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9eydweC0zIHB5LTIgdGV4dC1yaWdodCBmb250LXNlbWlib2xkICcgKyAoaSA9PT0gMCA/ICd0ZXh0LWFjY2VudC1ncmVlbicgOiAndGV4dC1hY2NlbnQtYmx1ZScpfT4KICAgICAgICAgICAgICAgICAgICAgICAgeyhwLndpbl9yYXRlICogMTAwKS50b0ZpeGVkKDEpfSUKICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgKSl9CiAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICl9CiAgICAgIDwvU2VjdGlvbj4KICAgIDwvZGl2PgogICkKfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\pages\TrainingPage.tsx' -B $b
# frontend/commander-ai-lab-ui/src/types/index.ts (11,671 bytes)
$b = 'Ly8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCi8vIENvbW1hbmRlciBBSSBMYWIg4oCUIFR5cGVTY3JpcHQgVHlwZSBEZWZpbml0aW9ucwovLyBEZXJpdmVkIGZyb20gdGhlIEZhc3RBUEkgYmFja2VuZCdzIFB5ZGFudGljIG1vZGVscyArIFNRTGl0ZSBzY2hlbWEKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgovLyDilIDilIAgQ2FyZHMgJiBDb2xsZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ2FyZCB7CiAgaWQ6IG51bWJlcgogIG5hbWU6IHN0cmluZwogIHNjcnlmYWxsX2lkOiBzdHJpbmcKICBzZXRfY29kZTogc3RyaW5nCiAgc2V0X25hbWU6IHN0cmluZwogIGNvbGxlY3Rvcl9udW1iZXI6IHN0cmluZwogIHJhcml0eTogc3RyaW5nCiAgdHlwZV9saW5lOiBzdHJpbmcKICBtYW5hX2Nvc3Q6IHN0cmluZwogIGNtYzogbnVtYmVyCiAgb3JhY2xlX3RleHQ6IHN0cmluZwogIGNvbG9yX2lkZW50aXR5OiBzdHJpbmdbXQogIHF1YW50aXR5OiBudW1iZXIKICBmb2lsX3F1YW50aXR5OiBudW1iZXIKICBjb25kaXRpb246IHN0cmluZwogIHRjZ19wcmljZTogbnVtYmVyIHwgbnVsbAogIGZvaWxfcHJpY2U6IG51bWJlciB8IG51bGwKICBpbWFnZV91cmw6IHN0cmluZwogIGVkaHJlY19yYW5rOiBudW1iZXIgfCBudWxsCiAga2V5d29yZHM6IHN0cmluZwogIGFkZGVkX2RhdGU6IHN0cmluZwogIHVwZGF0ZWRfZGF0ZTogc3RyaW5nCn0KCmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkZpbHRlcnMgewogIHE/OiBzdHJpbmcKICB0eXBlX2xpbmU/OiBzdHJpbmcKICBjb2xvcj86IHN0cmluZwogIHJhcml0eT86IHN0cmluZwogIHNldF9jb2RlPzogc3RyaW5nCiAgY21jX21pbj86IG51bWJlcgogIGNtY19tYXg/OiBudW1iZXIKICBwcmljZV9taW4/OiBudW1iZXIKICBwcmljZV9tYXg/OiBudW1iZXIKICBvd25lZF9vbmx5PzogYm9vbGVhbgogIHNvcnRfYnk/OiBzdHJpbmcKICBzb3J0X2Rpcj86ICdhc2MnIHwgJ2Rlc2MnCiAgcGFnZT86IG51bWJlcgogIHBhZ2Vfc2l6ZT86IG51bWJlcgp9CgpleHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25TdGF0cyB7CiAgdG90YWxfY2FyZHM6IG51bWJlcgogIHRvdGFsX3VuaXF1ZTogbnVtYmVyCiAgdG90YWxfdmFsdWU6IG51bWJlcgogIHNldHNfY291bnQ6IG51bWJlcgp9CgpleHBvcnQgaW50ZXJmYWNlIFNldEluZm8gewogIGNvZGU6IHN0cmluZwogIG5hbWU6IHN0cmluZwogIGNhcmRfY291bnQ6IG51bWJlcgp9CgovLyDilIDilIAgU2NhbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmV4cG9ydCBpbnRlcmZhY2UgU2NhblJlc3VsdCB7CiAgbWF0Y2hlczogU2Nhbk1hdGNoW10KICBpbWFnZV91cmw/OiBzdHJpbmcKfQoKZXhwb3J0IGludGVyZmFjZSBTY2FuTWF0Y2ggewogIG5hbWU6IHN0cmluZwogIHNldF9jb2RlOiBzdHJpbmcKICBzZXRfbmFtZTogc3RyaW5nCiAgY29sbGVjdG9yX251bWJlcjogc3RyaW5nCiAgc2NyeWZhbGxfaWQ6IHN0cmluZwogIGNvbmZpZGVuY2U6IG51bWJlcgogIGltYWdlX3VybDogc3RyaW5nCiAgdHlwZV9saW5lOiBzdHJpbmcKICBvcmFjbGVfdGV4dDogc3RyaW5nCiAgbWFuYV9jb3N0OiBzdHJpbmcKICB0Y2dfcHJpY2U6IG51bWJlciB8IG51bGwKfQoKLy8g4pSA4pSAIERlY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZXhwb3J0IGludGVyZmFjZSBEZWNrIHsKICBpZDogbnVtYmVyCiAgbmFtZTogc3RyaW5nCiAgY29tbWFuZGVyOiBzdHJpbmcKICBjb21tYW5kZXJfc2NyeWZhbGxfaWQ/OiBzdHJpbmcKICBjb21tYW5kZXJfaW1hZ2VfdXJsPzogc3RyaW5nCiAgY29sb3JfaWRlbnRpdHk6IHN0cmluZ1tdCiAgZm9ybWF0OiBzdHJpbmcKICBjYXJkX2NvdW50OiBudW1iZXIKICB0b3RhbF9wcmljZTogbnVtYmVyCiAgY3JlYXRlZF9kYXRlOiBzdHJpbmcKICB1cGRhdGVkX2RhdGU6IHN0cmluZwp9CgpleHBvcnQgaW50ZXJmYWNlIERlY2tDYXJkIHsKICBpZDogbnVtYmVyCiAgZGVja19pZDogbnVtYmVyCiAgbmFtZTogc3RyaW5nCiAgc2NyeWZhbGxfaWQ6IHN0cmluZwogIHF1YW50aXR5OiBudW1iZXIKICBpc19jb21tYW5kZXI6IGJvb2xlYW4KICBjYXRlZ29yeTogc3RyaW5nCiAgdHlwZV9saW5lOiBzdHJpbmcKICBtYW5hX2Nvc3Q6IHN0cmluZwogIGNtYzogbnVtYmVyCiAgb3JhY2xlX3RleHQ6IHN0cmluZwogIHRjZ19wcmljZTogbnVtYmVyIHwgbnVsbAogIGltYWdlX3VybDogc3RyaW5nCiAgb3duZWRfcXR5OiBudW1iZXIKICBzZXRfY29kZTogc3RyaW5nCn0KCmV4cG9ydCBpbnRlcmZhY2UgRGVja0FuYWx5c2lzIHsKICBjYXJkX2NvdW50OiBudW1iZXIKICBsYW5kX2NvdW50OiBudW1iZXIKICBjcmVhdHVyZV9jb3VudDogbnVtYmVyCiAgbm9uY3JlYXR1cmVfY291bnQ6IG51bWJlcgogIGF2Z19jbWM6IG51bWJlcgogIG1hbmFfY3VydmU6IFJlY29yZDxudW1iZXIsIG51bWJlcj4KICBjb2xvcl9kaXN0cmlidXRpb246IFJlY29yZDxzdHJpbmcsIG51bWJlcj4KICB0eXBlX2Rpc3RyaWJ1dGlvbjogUmVjb3JkPHN0cmluZywgbnVtYmVyPgogIHRvdGFsX3ByaWNlOiBudW1iZXIKICBvd25lZF9jb3VudDogbnVtYmVyCiAgbWlzc2luZ19jb3VudDogbnVtYmVyCn0KCmV4cG9ydCBpbnRlcmZhY2UgRGVja1JlY29tbWVuZGF0aW9uIHsKICBuYW1lOiBzdHJpbmcKICBzY3J5ZmFsbF9pZDogc3RyaW5nCiAgdHlwZV9saW5lOiBzdHJpbmcKICBtYW5hX2Nvc3Q6IHN0cmluZwogIG9yYWNsZV90ZXh0OiBzdHJpbmcKICBpbWFnZV91cmw6IHN0cmluZwogIHRjZ19wcmljZTogbnVtYmVyIHwgbnVsbAogIHJlYXNvbjogc3RyaW5nCiAgc2NvcmU6IG51bWJlcgogIG93bmVkOiBib29sZWFuCn0KCi8vIOKUgOKUgCBFREhSRUMgUmVjb21tZW5kYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZXhwb3J0IGludGVyZmFjZSBFZGhSZWNDYXJkIHsKICBuYW1lOiBzdHJpbmcKICB0eXBlX2xpbmU6IHN0cmluZwogIHJvbGU6IHN0cmluZwogIHJvbGVzOiBzdHJpbmdbXQogIGluY2x1c2lvbl9wY3Q6IG51bWJlciB8IG51bGwKICBzeW5lcmd5X3Njb3JlOiBudW1iZXIgfCBudWxsCiAgb3duZWQ6IGJvb2xlYW4KICBvd25lZF9xdHk6IG51bWJlcgogIHNjcnlmYWxsX2lkOiBzdHJpbmcKICBpbWFnZV91cmw6IHN0cmluZyB8IG51bGwKfQoKZXhwb3J0IGludGVyZmFjZSBFZGhSZWNzUmVzcG9uc2UgewogIGNvbW1hbmRlcjogc3RyaW5nCiAgc291cmNlOiBzdHJpbmcKICB0b3RhbDogbnVtYmVyCiAgcmVjb21tZW5kYXRpb25zOiBFZGhSZWNDYXJkW10KfQoKLy8g4pSA4pSAIENvbGxlY3Rpb24gUmVjb21tZW5kYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uUmVjQ2FyZCB7CiAgaWQ6IG51bWJlcgogIHNjcnlmYWxsX2lkOiBzdHJpbmcKICBuYW1lOiBzdHJpbmcKICB0eXBlX2xpbmU6IHN0cmluZwogIGNhcmRfdHlwZTogc3RyaW5nCiAgY21jOiBudW1iZXIKICBjb2xvcl9pZGVudGl0eTogc3RyaW5nW10KICBvd25lZF9xdHk6IG51bWJlcgogIHJvbGVzOiBzdHJpbmdbXQogIHNjb3JlOiBudW1iZXIKICBpbWFnZV91cmw6IHN0cmluZyB8IG51bGwKfQoKZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uUmVjc1Jlc3BvbnNlIHsKICBzaG9ydGZhbGxfdHlwZXM6IHN0cmluZ1tdCiAgcm9sZV9maWx0ZXI6IHN0cmlu' +
'Z1tdCiAgZ3JvdXBlZDogUmVjb3JkPHN0cmluZywgQ29sbGVjdGlvblJlY0NhcmRbXT4KICB0b3RhbDogbnVtYmVyCn0KCi8vIOKUgOKUgCBWMyBEZWNrIEdlbmVyYXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmV4cG9ydCBpbnRlcmZhY2UgRGVja0dlblYzUmVxdWVzdCB7CiAgY29tbWFuZGVyX25hbWU6IHN0cmluZwogIHN0cmF0ZWd5Pzogc3RyaW5nCiAgdGFyZ2V0X2JyYWNrZXQ6IG51bWJlcgogIGJ1ZGdldF91c2Q/OiBudW1iZXIKICBidWRnZXRfbW9kZT86ICd0b3RhbCcgfCAncGVyX2NhcmQnCiAgb21pdF9jYXJkcz86IHN0cmluZ1tdCiAgdXNlX2NvbGxlY3Rpb24/OiBib29sZWFuCiAgcnVuX3N1YnN0aXR1dGlvbj86IGJvb2xlYW4KICBtb2RlbD86IHN0cmluZwogIGRlY2tfbmFtZT86IHN0cmluZwp9CgpleHBvcnQgaW50ZXJmYWNlIERlY2tHZW5WM1N0YXR1cyB7CiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4KICBwcGx4X2NvbmZpZ3VyZWQ6IGJvb2xlYW4KICBtb2RlbDogc3RyaW5nIHwgbnVsbAogIGVtYmVkZGluZ3NfbG9hZGVkOiBib29sZWFuCiAgZW1iZWRkaW5nX2NhcmRzOiBudW1iZXIKICBlcnJvcjogc3RyaW5nIHwgbnVsbAp9CgpleHBvcnQgaW50ZXJmYWNlIERlY2tHZW5WM0NhcmQgewogIG5hbWU6IHN0cmluZwogIHF1YW50aXR5OiBudW1iZXIKICBjYXRlZ29yeTogc3RyaW5nCiAgdHlwZV9saW5lOiBzdHJpbmcKICBtYW5hX2Nvc3Q6IHN0cmluZwogIGNtYzogbnVtYmVyCiAgcm9sZTogc3RyaW5nCiAgcmVhc29uOiBzdHJpbmcKICB0Y2dfcHJpY2U6IG51bWJlciB8IG51bGwKICBpbWFnZV91cmw6IHN0cmluZwogIG93bmVkOiBib29sZWFuCiAgb3duZWRfcXR5OiBudW1iZXIKICBzY3J5ZmFsbF9pZDogc3RyaW5nCiAgaXNfc3Vic3RpdHV0ZTogYm9vbGVhbgogIG9yaWdpbmFsX25hbWU6IHN0cmluZyB8IG51bGwKICBzdWJzdGl0dXRpb25fcmVhc29uOiBzdHJpbmcgfCBudWxsCiAgc2ltaWxhcml0eV9zY29yZTogbnVtYmVyIHwgbnVsbAp9CgpleHBvcnQgaW50ZXJmYWNlIERlY2tHZW5WM1Jlc3VsdCB7CiAgY29tbWFuZGVyOiB7CiAgICBuYW1lOiBzdHJpbmcKICAgIGltYWdlX3VybDogc3RyaW5nCiAgICB0eXBlX2xpbmU6IHN0cmluZwogICAgY29sb3JfaWRlbnRpdHk6IHN0cmluZ1tdCiAgICBtYW5hX2Nvc3Q6IHN0cmluZwogICAgb3JhY2xlX3RleHQ6IHN0cmluZwogIH0KICBjYXJkczogRGVja0dlblYzQ2FyZFtdCiAgc3RhdHM6IERlY2tBbmFseXNpcwogIHN0cmF0ZWd5OiBzdHJpbmcKICBicmFja2V0OiBudW1iZXIKICBtb2RlbDogc3RyaW5nCiAgc3Vic3RpdHV0aW9uPzogewogICAgb3duZWQ6IG51bWJlcgogICAgc3Vic3RpdHV0ZWQ6IG51bWJlcgogICAgbWlzc2luZzogbnVtYmVyCiAgfQp9CgovLyDilIDilIAgU2ltdWxhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmV4cG9ydCBpbnRlcmZhY2UgU2ltQ29uZmlnIHsKICBkZWNrX25hbWVzOiBzdHJpbmdbXQogIG51bV9nYW1lczogbnVtYmVyCiAgdGhyZWFkczogbnVtYmVyCiAgdXNlX2RlZXBzZWVrPzogYm9vbGVhbgp9CgpleHBvcnQgaW50ZXJmYWNlIFNpbVN0YXR1cyB7CiAgcnVubmluZzogYm9vbGVhbgogIHNpbV9pZDogc3RyaW5nCiAgcHJvZ3Jlc3M/OiBudW1iZXIKICBnYW1lc19jb21wbGV0ZWQ/OiBudW1iZXIKICB0b3RhbF9nYW1lcz86IG51bWJlcgp9CgpleHBvcnQgaW50ZXJmYWNlIFNpbVJlc3VsdCB7CiAgc2ltX2lkOiBzdHJpbmcKICBkZWNrczogU2ltRGVja1Jlc3VsdFtdCiAgdG90YWxfZ2FtZXM6IG51bWJlcgogIGR1cmF0aW9uX21zOiBudW1iZXIKICB0aW1lc3RhbXA6IHN0cmluZwp9CgpleHBvcnQgaW50ZXJmYWNlIFNpbURlY2tSZXN1bHQgewogIG5hbWU6IHN0cmluZwogIHdpbnM6IG51bWJlcgogIGxvc3NlczogbnVtYmVyCiAgd2luX3JhdGU6IG51bWJlcgogIGF2Z190dXJuOiBudW1iZXIKfQoKLy8g4pSA4pSAIEJhdGNoIFNpbSAoTGFiKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' +
'lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmV4cG9ydCBpbnRlcmZhY2UgTGFiRGVjayB7CiAgbmFtZTogc3RyaW5nCiAgc291cmNlOiBzdHJpbmcKICBwYXRoOiBzdHJpbmcKICBjYXJkX2NvdW50OiBudW1iZXIKfQoKZXhwb3J0IGludGVyZmFjZSBMYWJTdGFydFJlcXVlc3QgewogIGRlY2tzOiBzdHJpbmdbXQogIGdhbWVzOiBudW1iZXIKICB0aHJlYWRzPzogbnVtYmVyCiAgdXNlX2RlZXBzZWVrPzogYm9vbGVhbgogIGRlZXBzZWVrX2RlY2s/OiBzdHJpbmcKfQoKZXhwb3J0IGludGVyZmFjZSBMYWJTdGF0dXMgewogIHJ1bm5pbmc6IGJvb2xlYW4KICBydW5faWQ6IHN0cmluZwogIGdhbWVzX2NvbXBsZXRlZDogbnVtYmVyCiAgdG90YWxfZ2FtZXM6IG51bWJlcgogIGN1cnJlbnRfZGVja3M6IHN0cmluZ1tdCiAgZXJyb3I6IHN0cmluZyB8IG51bGwKfQoKZXhwb3J0IGludGVyZmFjZSBMYWJSZXN1bHQgewogIHJ1bl9pZDogc3RyaW5nCiAgZGVja3M6IExhYkRlY2tSZXN1bHRbXQogIHRvdGFsX2dhbWVzOiBudW1iZXIKICB0aW1lc3RhbXA6IHN0cmluZwp9CgpleHBvcnQgaW50ZXJmYWNlIExhYkRlY2tSZXN1bHQgewogIG5hbWU6IHN0cmluZwogIHdpbnM6IG51bWJlcgogIGdhbWVzOiBudW1iZXIKICB3aW5fcmF0ZTogbnVtYmVyCiAgYXZnX3R1cm5zOiBudW1iZXIKICBhdmdfbGlmZV9yZW1haW5pbmc6IG51bWJlcgp9CgpleHBvcnQgaW50ZXJmYWNlIExhYkhpc3RvcnlFbnRyeSB7CiAgcnVuX2lkOiBzdHJpbmcKICB0aW1lc3RhbXA6IHN0cmluZwogIGRlY2tzOiBzdHJpbmdbXQogIHRvdGFsX2dhbWVzOiBudW1iZXIKfQoKZXhwb3J0IGludGVyZmFjZSBQcmVjb25EZWNrIHsKICBuYW1lOiBzdHJpbmcKICBmaWxlbmFtZTogc3RyaW5nCiAgcmVsZWFzZV9kYXRlPzogc3RyaW5nCiAgc2V0X25hbWU/OiBzdHJpbmcKICBpbnN0YWxsZWQ6IGJvb2xlYW4KfQoKLy8g4pSA4pSAIENvYWNoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZXhwb3J0IGludGVyZmFjZSBDb2FjaFN0YXR1cyB7CiAgbGxtX2Nvbm5lY3RlZDogYm9vbGVhbgogIGFjdGl2ZV9tb2RlbDogc3RyaW5nIHwgbnVsbAogIGVtYmVkZGluZ3NfbG9hZGVkOiBib29sZWFuCiAgZW1iZWRkaW5nX2NhcmRzOiBudW1iZXIKfQoKZXhwb3J0IGludGVyZmFjZSBDb2FjaERlY2sgewogIGRlY2tfaWQ6IG51bWJlcgogIGRlY2tfbmFtZTogc3RyaW5nCiAgY29tbWFuZGVyOiBzdHJpbmcKICByZXBvcnRfY291bnQ6IG51bWJlcgogIGxhc3RfcmVwb3J0X2RhdGU6IHN0cmluZyB8IG51bGwKfQoKZXhwb3J0IGludGVyZmFjZSBDb2FjaFNlc3Npb24gewogIHNlc3Npb25faWQ6IHN0cmluZwogIGRlY2tfbmFtZTogc3RyaW5nCiAgY3JlYXRlZF9hdDogc3RyaW5nCiAgbWVzc2FnZXM6IENvYWNoTWVzc2FnZVtdCn0KCmV4cG9ydCBpbnRlcmZhY2UgQ29hY2hNZXNzYWdlIHsKICByb2xlOiAndXNlcicgfCAnYXNzaXN0YW50JwogIGNvbnRlbnQ6IHN0cmluZwogIHRpbWVzdGFtcDogc3RyaW5nCn0KCi8vIOKUgOKUgCBNTCBUcmFpbmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCi8qKiBHRVQgL2FwaS9tbC9zdGF0dXMgKi8KZXhwb3J0IGludGVyZmFjZSBNTFN0YXR1cyB7CiAgbWxfbG9nZ2luZ19lbmFibGVkOiBib29sZWFuCiAgdHJhaW5pbmdfZmlsZXM6IHsgZmlsZTogc3RyaW5nOyBkZWNpc2lvbnM6IG51bWJlcjsgc2l6ZV9rYjogbnVtYmVyIH1bXQogIHRvdGFsX2RlY2lzaW9uczogbnVtYmVyCiAgdG90YWxfZmlsZXM6IG51bWJlcgp9CgovKiogR0VUIC9hcGkvbWwvZGF0YS9zdGF0dXMgKi8KZXhwb3J0IGludGVyZmFjZSBNTERhdGFTdGF0dXMgewogIGRlY2lzaW9uRmlsZXM6IHsgbmFtZTogc3RyaW5nOyBzaXplOiBudW1iZXI7IGRlY2lzaW9uczogbnVtYmVyIH1bXQogIHRvdGFsRGVjaXNpb25zOiBudW1iZXIKICBkYXRhc2V0czogUmVjb3JkPHN0cmluZywgeyBzYW1wbGVzOiBudW1iZXI7IGZlYXR1' +
'cmVzOiBudW1iZXI7IHNpemU6IG51bWJlciB9PgogIGNoZWNrcG9pbnRzOiB7IG5hbWU6IHN0cmluZzsgc2l6ZTogbnVtYmVyOyBtb2RpZmllZDogc3RyaW5nIH1bXQogIGV2YWxSZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwKICBwb2xpY3lMb2FkZWQ6IGJvb2xlYW4KfQoKLyoqIEdFVCAvYXBpL21sL3RyYWluL3N0YXR1cyAqLwpleHBvcnQgaW50ZXJmYWNlIE1MVHJhaW5TdGF0dXMgewogIHJ1bm5pbmc6IGJvb2xlYW4KICBwcm9ncmVzczogbnVtYmVyCiAgdG90YWxfZXBvY2hzOiBudW1iZXIKICBjdXJyZW50X2Vwb2NoOiBudW1iZXIKICBwaGFzZTogJ2lkbGUnIHwgJ3N0YXJ0aW5nJyB8ICdidWlsZGluZycgfCAndHJhaW5pbmcnIHwgJ2V2YWx1YXRpbmcnIHwgJ2RvbmUnIHwgJ2Vycm9yJwogIG1lc3NhZ2U6IHN0cmluZwogIG1ldHJpY3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbAogIHJlc3VsdDogewogICAgdHJhaW5pbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+CiAgICBldmFsdWF0aW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwKICAgIGNoZWNrcG9pbnQ6IHN0cmluZwogICAgZGV2aWNlOiBzdHJpbmcKICB9IHwgbnVsbAogIGVycm9yOiBzdHJpbmcgfCBudWxsCiAgc3RhcnRlZF9hdDogc3RyaW5nIHwgbnVsbAp9CgovKiogR0VUIC9hcGkvbWwvdHJhaW4vcHBvL3N0YXR1cyAqLwpleHBvcnQgaW50ZXJmYWNlIFBQT1RyYWluU3RhdHVzIHsKICBydW5uaW5nOiBib29sZWFuCiAgaXRlcmF0aW9uOiBudW1iZXIKICB0b3RhbF9pdGVyYXRpb25zOiBudW1iZXIKICBwaGFzZTogJ2lkbGUnIHwgJ3N0YXJ0aW5nJyB8ICd0cmFpbmluZycgfCAnZG9uZScgfCAnZXJyb3InCiAgbWVzc2FnZTogc3RyaW5nCiAgbWV0cmljczogewogICAgYXZnX3Jld2FyZD86IG51bWJlcgogICAgd2luX3JhdGU/OiBudW1iZXIKICAgIHBvbGljeV9sb3NzPzogbnVtYmVyCiAgICB2YWx1ZV9sb3NzPzogbnVtYmVyCiAgICBlbnRyb3B5PzogbnVtYmVyCiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duCiAgfSB8IG51bGwKICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbAogIGVycm9yOiBzdHJpbmcgfCBudWxsCn0KCi8qKiBHRVQgL2FwaS9tbC90b3VybmFtZW50L3N0YXR1cyAqLwpleHBvcnQgaW50ZXJmYWNlIFRvdXJuYW1lbnRTdGF0dXMgewogIHJ1bm5pbmc6IGJvb2xlYW4KICBwaGFzZTogJ2lkbGUnIHwgJ3N0YXJ0aW5nJyB8ICdydW5uaW5nJyB8ICdkb25lJyB8ICdlcnJvcicKICBtZXNzYWdlOiBzdHJpbmcKICByZXN1bHQ6IFRvdXJuYW1lbnRSZXN1bHRzIHwgbnVsbAogIGVycm9yOiBzdHJpbmcgfCBudWxsCn0KCmV4cG9ydCBpbnRlcmZhY2UgVG91cm5hbWVudFJlc3VsdHMgewogIHBsYXllcnM6IFRvdXJuYW1lbnRQbGF5ZXJbXQogIHRvdGFsX21hdGNoZXM6IG51bWJlcgogIG1hdGNodXBzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4KfQoKZXhwb3J0IGludGVyZmFjZSBUb3VybmFtZW50UGxheWVyIHsKICBuYW1lOiBzdHJpbmcKICB3aW5zOiBudW1iZXIKICBnYW1lczogbnVtYmVyCiAgd2luX3JhdGU6IG51bWJlcgp9CgovKiogR0VUIC9hcGkvbWwvbW9kZWwgKi8KZXhwb3J0IGludGVyZmFjZSBNTE1vZGVsSW5mbyB7CiAgbG9hZGVkOiBib29sZWFuCiAgZGV2aWNlPzogc3RyaW5nCiAgaW5wdXRfZGltPzogbnVtYmVyCiAgbnVtX2FjdGlvbnM/OiBudW1iZXIKICBjaGVja3BvaW50X3BhdGg/OiBzdHJpbmcKICBlcnJvcj86IHN0cmluZwogIHRvcmNoX2F2YWlsYWJsZT86IGJvb2xlYW4KfQoKLy8g4pSA4pSAIERlZXBTZWVrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZXhwb3J0IGludGVyZmFjZSBEZWVwU2Vla1N0YXR1cyB7CiAgY29ubmVjdGVkOiBib29sZWFuCiAgbW9kZWw6IHN0cmluZyB8IG51bGwKICBiYXNlX3VybDogc3RyaW5nCn0KCi8vIOKUgOKUgCBDb21tYW5kZXIgU2VhcmNoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZXhwb3J0IGludGVyZmFjZSBDb21tYW5kZXJTZWFyY2hS' +
'ZXN1bHQgewogIG5hbWU6IHN0cmluZwogIHR5cGVfbGluZTogc3RyaW5nCiAgY29sb3JfaWRlbnRpdHk6IHN0cmluZ1tdCiAgbWFuYV9jb3N0OiBzdHJpbmcKICBpbWFnZV91cmw6IHN0cmluZwogIG9yYWNsZV90ZXh0OiBzdHJpbmcKICBzY3J5ZmFsbF9pZDogc3RyaW5nCiAgaW5fY29sbGVjdGlvbjogYm9vbGVhbgp9CgovLyDilIDilIAgUGVycGxleGl0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmV4cG9ydCBpbnRlcmZhY2UgUHBseFN0YXR1cyB7CiAgY29uZmlndXJlZDogYm9vbGVhbgogIGtleV9wcmVmaXg6IHN0cmluZwp9Cg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\src\types\index.ts' -B $b
# frontend/commander-ai-lab-ui/tsconfig.app.json (732 bytes)
$b = 'ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidHNCdWlsZEluZm9GaWxlIjogIi4vbm9kZV9tb2R1bGVzLy50bXAvdHNjb25maWcuYXBwLnRzYnVpbGRpbmZvIiwKICAgICJ0YXJnZXQiOiAiRVMyMDIyIiwKICAgICJ1c2VEZWZpbmVGb3JDbGFzc0ZpZWxkcyI6IHRydWUsCiAgICAibGliIjogWyJFUzIwMjIiLCAiRE9NIiwgIkRPTS5JdGVyYWJsZSJdLAogICAgIm1vZHVsZSI6ICJFU05leHQiLAogICAgInR5cGVzIjogWyJ2aXRlL2NsaWVudCJdLAogICAgInNraXBMaWJDaGVjayI6IHRydWUsCgogICAgLyogQnVuZGxlciBtb2RlICovCiAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJidW5kbGVyIiwKICAgICJhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9ucyI6IHRydWUsCiAgICAidmVyYmF0aW1Nb2R1bGVTeW50YXgiOiB0cnVlLAogICAgIm1vZHVsZURldGVjdGlvbiI6ICJmb3JjZSIsCiAgICAibm9FbWl0IjogdHJ1ZSwKICAgICJqc3giOiAicmVhY3QtanN4IiwKCiAgICAvKiBMaW50aW5nICovCiAgICAic3RyaWN0IjogdHJ1ZSwKICAgICJub1VudXNlZExvY2FscyI6IHRydWUsCiAgICAibm9VbnVzZWRQYXJhbWV0ZXJzIjogdHJ1ZSwKICAgICJlcmFzYWJsZVN5bnRheE9ubHkiOiB0cnVlLAogICAgIm5vRmFsbHRocm91Z2hDYXNlc0luU3dpdGNoIjogdHJ1ZSwKICAgICJub1VuY2hlY2tlZFNpZGVFZmZlY3RJbXBvcnRzIjogdHJ1ZQogIH0sCiAgImluY2x1ZGUiOiBbInNyYyJdCn0K'
Install-B64 -R 'frontend\commander-ai-lab-ui\tsconfig.app.json' -B $b
# frontend/commander-ai-lab-ui/tsconfig.json (119 bytes)
$b = 'ewogICJmaWxlcyI6IFtdLAogICJyZWZlcmVuY2VzIjogWwogICAgeyAicGF0aCI6ICIuL3RzY29uZmlnLmFwcC5qc29uIiB9LAogICAgeyAicGF0aCI6ICIuL3RzY29uZmlnLm5vZGUuanNvbiIgfQogIF0KfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\tsconfig.json' -B $b
# frontend/commander-ai-lab-ui/tsconfig.node.json (653 bytes)
$b = 'ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidHNCdWlsZEluZm9GaWxlIjogIi4vbm9kZV9tb2R1bGVzLy50bXAvdHNjb25maWcubm9kZS50c2J1aWxkaW5mbyIsCiAgICAidGFyZ2V0IjogIkVTMjAyMyIsCiAgICAibGliIjogWyJFUzIwMjMiXSwKICAgICJtb2R1bGUiOiAiRVNOZXh0IiwKICAgICJ0eXBlcyI6IFsibm9kZSJdLAogICAgInNraXBMaWJDaGVjayI6IHRydWUsCgogICAgLyogQnVuZGxlciBtb2RlICovCiAgICAibW9kdWxlUmVzb2x1dGlvbiI6ICJidW5kbGVyIiwKICAgICJhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9ucyI6IHRydWUsCiAgICAidmVyYmF0aW1Nb2R1bGVTeW50YXgiOiB0cnVlLAogICAgIm1vZHVsZURldGVjdGlvbiI6ICJmb3JjZSIsCiAgICAibm9FbWl0IjogdHJ1ZSwKCiAgICAvKiBMaW50aW5nICovCiAgICAic3RyaWN0IjogdHJ1ZSwKICAgICJub1VudXNlZExvY2FscyI6IHRydWUsCiAgICAibm9VbnVzZWRQYXJhbWV0ZXJzIjogdHJ1ZSwKICAgICJlcmFzYWJsZVN5bnRheE9ubHkiOiB0cnVlLAogICAgIm5vRmFsbHRocm91Z2hDYXNlc0luU3dpdGNoIjogdHJ1ZSwKICAgICJub1VuY2hlY2tlZFNpZGVFZmZlY3RJbXBvcnRzIjogdHJ1ZQogIH0sCiAgImluY2x1ZGUiOiBbInZpdGUuY29uZmlnLnRzIl0KfQo='
Install-B64 -R 'frontend\commander-ai-lab-ui\tsconfig.node.json' -B $b
# frontend/commander-ai-lab-ui/vite.config.ts (580 bytes)
$b = 'aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZScKaW1wb3J0IHJlYWN0IGZyb20gJ0B2aXRlanMvcGx1Z2luLXJlYWN0JwppbXBvcnQgdGFpbHdpbmRjc3MgZnJvbSAnQHRhaWx3aW5kY3NzL3ZpdGUnCgpleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoewogIHBsdWdpbnM6IFtyZWFjdCgpLCB0YWlsd2luZGNzcygpXSwKICBzZXJ2ZXI6IHsKICAgIHBvcnQ6IDUxNzMsCiAgICBwcm94eTogewogICAgICAnL2FwaSc6IHsKICAgICAgICB0YXJnZXQ6ICdodHRwOi8vbG9jYWxob3N0OjgwODAnLAogICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSwKICAgICAgfSwKICAgIH0sCiAgfSwKICBidWlsZDogewogICAgb3V0RGlyOiAnZGlzdCcsCiAgICBzb3VyY2VtYXA6IGZhbHNlLAogICAgcm9sbHVwT3B0aW9uczogewogICAgICBvdXRwdXQ6IHsKICAgICAgICBtYW51YWxDaHVua3M6IHsKICAgICAgICAgIHJlY2hhcnRzOiBbJ3JlY2hhcnRzJ10sCiAgICAgICAgICByZWFjdDogWydyZWFjdCcsICdyZWFjdC1kb20nLCAncmVhY3Qtcm91dGVyLWRvbSddLAogICAgICAgIH0sCiAgICAgIH0sCiAgICB9LAogIH0sCn0pCg=='
Install-B64 -R 'frontend\commander-ai-lab-ui\vite.config.ts' -B $b
# lab_api.py (308,777 bytes)
$b = 'IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKQ29tbWFuZGVyIEFJIExhYiDigJQgRmFzdEFQSSBCYWNrZW5kIHYzCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKdjMgYWRkczoKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC91cmwgICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gQXJjaGlkZWt0L0VESFJFQyBVUkwKICBQT1NUIC9hcGkvbGFiL2ltcG9ydC90ZXh0ICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gY2FyZCBsaXN0IHRleHQKICBHRVQgIC9hcGkvbGFiL21ldGEvY29tbWFuZGVycyAg4oCUIExpc3QgYXZhaWxhYmxlIGNvbW1hbmRlcnMgaW4gbWV0YSBtYXBwaW5nCiAgR0VUICAvYXBpL2xhYi9tZXRhL3NlYXJjaCAgICAgIOKAlCBTZWFyY2ggY29tbWFuZGVycyBieSBuYW1lCiAgUE9TVCAvYXBpL2xhYi9tZXRhL2ZldGNoICAgICAgIOKAlCBGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciBhIGNvbW1hbmRlcgogIFBPU1QgL2FwaS9sYWIvc3RhcnQgICAgICAgICAgICDigJQgRXh0ZW5kZWQ6IGFjY2VwdHMgaW1wb3J0ZWQgZGVjayBwcm9maWxlcwoKUnVucyBvbiBwb3J0IDgwODAgYnkgZGVmYXVsdC4gU2VydmVzIHRoZSB3ZWIgVUkgc3RhdGljIGZpbGVzIGF0IC8uCiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBhc3luY2lvCmltcG9ydCBjc3YKaW1wb3J0IGlvCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNxbGl0ZTMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCB0aW1lCmltcG9ydCB1dWlkCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwKZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbiwgUmVxdWVzdApmcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IKCnRyeToKICAgIGZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbiwgQmFja2dyb3VuZFRhc2tzLCBSZXF1ZXN0IGFzIEZhc3RBUElSZXF1ZXN0CiAgICBmcm9tIGZhc3RhcGkubWlkZGxld2FyZS5jb3JzIGltcG9ydCBDT1JTTWlkZGxld2FyZQogICAgZnJvbSBmYXN0YXBpLnJlc3BvbnNlcyBpbXBvcnQgRmlsZVJlc3BvbnNlLCBKU09OUmVzcG9uc2UsIFN0cmVhbWluZ1Jlc3BvbnNlCiAgICBmcm9tIGZhc3RhcGkuc3RhdGljZmlsZXMgaW1wb3J0IFN0YXRpY0ZpbGVzCiAgICBmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcHJpbnQoIkVSUk9SOiBGYXN0QVBJIG5vdCBpbnN0YWxsZWQuIFJ1bjogcGlwIGluc3RhbGwgZmFzdGFwaSB1dmljb3JuIikKICAgIHN5cy5leGl0KDEpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb25maWd1cmF0aW9uCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBDb25maWc6CiAgICAiIiJSdW50aW1lIGNvbmZpZ3VyYXRpb24g4oCUIHNldCB2aWEgQ0xJIGFyZ3Mgb3IgZW52IHZhcnMuIiIiCiAgICBmb3JnZV9qYXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kaXI6IHN0ciA9ICIiCiAgICBmb3JnZV9kZWNrc19kaXI6IHN0ciA9ICIiCiAgICBsYWJfamFyOiBzdHIgPSAiIgogICAgcmVzdWx0c19kaXI6IHN0ciA9ICJyZXN1bHRzIgogICAgcG9ydDogaW50ID0gODA4MAogICAgeGltaWxhcl9hcGlfa2V5OiBzdHIgPSAiIgogICAgcHBseF9hcGlfa2V5OiBzdHIgPSAiIiAgIyBQZXJwbGV4aXR5IEFQSSBrZXkgZm9yIGRlY2sgcmVzZWFyY2gvZ2VuZXJhdGlvbgoKQ0ZHID0gQ29uZmlnKCkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEFwcCBTZXR1cAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKYXBwID0gRmFzdEFQSSh0aXRsZT0iQ29tbWFuZGVyIEFJIExhYiBBUEkiLCB2ZXJzaW9uPSIzLjAuMCIpCgphcHAuYWRkX21pZGRsZXdhcmUoCiAgICBDT1JTTWlkZGxld2FyZSwKICAgIGFsbG93X29yaWdpbnM9WyIqIl0sCiAgICBhbGxvd19tZXRob2RzPVsiKiJdLAogICAgYWxsb3dfaGVhZGVycz1bIioiXSwKKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgSW4tTWVtb3J5IFN0YXRlCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBCYXRjaFN0YXRlOgogICAgIiIiVHJhY2tzIGEgcnVubmluZyBvciBjb21wbGV0ZWQgYmF0Y2guIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYmF0Y2hfaWQ6IHN0ciwgdG90YWxfZ2FtZXM6IGludCwgdGhyZWFkczogaW50KToKICAgICAgICBzZWxmLmJhdGNoX2lkID0gYmF0Y2hfaWQKICAgICAgICBzZWxmLnRvdGFsX2dhbWVzID0gdG90YWxfZ2FtZXMKICAgICAgICBzZWxmLnRocmVhZHMgPSB0aHJlYWRzCiAgICAgICAgc2VsZi5jb21wbGV0ZWRfZ2FtZXMgPSAwCiAgICAgICAgc2VsZi5ydW5uaW5nID0gVHJ1ZQogICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IGRhdGV0aW1lLm5vdygpCiAgICAgICAgc2VsZi5lbGFwc2VkX21zID0gMAogICAgICAgIHNlbGYucmVzdWx0X3BhdGg6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICAgICAgc2VsZi5lcnJvcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUKICAgICAgICBzZWxmLnByb2Nlc3M6IE9wdGlvbmFsW3N1YnByb2Nlc3MuUG9wZW5dID0gTm9uZQogICAgICAgIHNlbGYubG9nX2xpbmVzOiBsaXN0ID0gW10KICAgICAgICAjIHYyNCAoSXNzdWUgIzUpOiBSZWFsLXRpbWUgdGhyb3VnaHB1dCB0cmFja2luZwogICAgICAgIHNlbGYuc2ltc19wZXJfc2VjOiBmbG9hdCA9IDAuMAoKYWN0aXZlX2JhdGNoZXM6IGRpY3Rbc3RyLCBCYXRjaFN0YXRlXSA9IHt9CgojIENvbW1hbmRlciBtZXRhIG1hcHBpbmcgKGxvYWRlZCBhdCBzdGFydHVwKQpDT01NQU5ERVJfTUVUQTogZGljdCA9IHt9CgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFJlcXVlc3QgLyBSZXNwb25zZSBNb2RlbHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmNsYXNzIFN0YXJ0UmVxdWVzdChCYXNlTW9kZWwpOgogICAgZGVja3M6IGxpc3Rbc3RyXSAgICAgICAgICAgIyBFeGFjdGx5IDMgZGVjayBuYW1lcwogICAgbnVtR2FtZXM6IGludCA9IDEwMAogICAgdGhyZWFkczogaW50ID0gNAogICAgc2VlZDogT3B0aW9u' +
'YWxbaW50XSA9IE5vbmUKICAgIGNsb2NrOiBpbnQgPSAxMjAKICAgICMgdjM6IE9wdGlvbmFsIHNvdXJjZSBtZXRhZGF0YSBwZXIgZGVjawogICAgZGVja1NvdXJjZXM6IE9wdGlvbmFsW2xpc3RbT3B0aW9uYWxbZGljdF1dXSA9IE5vbmUgICMgW3tzb3VyY2UsIHNvdXJjZVVybCwgY29tbWFuZGVyLCBhcmNoZXR5cGV9XQogICAgIyB2ODogTGVhcm5lZCBwb2xpY3kgc3VwcG9ydAogICAgdXNlTGVhcm5lZFBvbGljeTogYm9vbCA9IEZhbHNlCiAgICBwb2xpY3lTdHlsZTogc3RyID0gIm1pZHJhbmdlIgogICAgcG9saWN5R3JlZWR5OiBib29sID0gRmFsc2UKICAgICMgdjI0IChJc3N1ZXMgIzQvIzUpOiBQZXJmb3JtYW5jZSBzZXR0aW5ncwogICAgYWlTaW1wbGlmaWVkOiBib29sID0gRmFsc2UgICAgICAgICAjIFVzZSBmYXN0ZXIgQUkgcHJvZmlsZQogICAgYWlUaGlua1RpbWVNczogaW50ID0gLTEgICAgICAgICAgICAjIENhcCBBSSB0aGluayB0aW1lICgtMSB1bmxpbWl0ZWQpCiAgICBtYXhRdWV1ZURlcHRoOiBpbnQgPSAtMSAgICAgICAgICAgICMgQmFja3ByZXNzdXJlIGxpbWl0ICgtMSB1bmxpbWl0ZWQpCgpjbGFzcyBTdGFydFJlc3BvbnNlKEJhc2VNb2RlbCk6CiAgICBiYXRjaElkOiBzdHIKICAgIHN0YXR1czogc3RyID0gInN0YXJ0ZWQiCiAgICBtZXNzYWdlOiBzdHIgPSAiIgoKY2xhc3MgU3RhdHVzUmVzcG9uc2UoQmFzZU1vZGVsKToKICAgIGJhdGNoSWQ6IHN0cgogICAgcnVubmluZzogYm9vbAogICAgY29tcGxldGVkOiBpbnQKICAgIHRvdGFsOiBpbnQKICAgIHRocmVhZHM6IGludAogICAgZWxhcHNlZE1zOiBpbnQKICAgIGVycm9yOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgc2ltc1BlclNlYzogZmxvYXQgPSAwLjAgICMgdjI0IChJc3N1ZSAjNSk6IFJlYWwtdGltZSB0aHJvdWdocHV0CgpjbGFzcyBEZWNrSW5mbyhCYXNlTW9kZWwpOgogICAgbmFtZTogc3RyCiAgICBmaWxlbmFtZTogc3RyCgpjbGFzcyBJbXBvcnRVcmxSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICB1cmw6IHN0cgoKY2xhc3MgSW1wb3J0VGV4dFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIHRleHQ6IHN0cgogICAgY29tbWFuZGVyOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKY2xhc3MgTWV0YUZldGNoUmVxdWVzdChCYXNlTW9kZWwpOgogICAgY29tbWFuZGVyOiBzdHIKCgojIOKUgOKUgCBEZWNrIEJ1aWxkZXIgTW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKY2xhc3MgQ3JlYXRlRGVja1JlcXVlc3QoQmFzZU1vZGVsKToKICAgIG5hbWU6IHN0cgogICAgY29tbWFuZGVyX3NjcnlmYWxsX2lkOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIGNvbW1hbmRlcl9uYW1lOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIGNvbG9yX2lkZW50aXR5OiBPcHRpb25hbFtsaXN0XSA9IFtdCiAgICBzdHJhdGVneV90YWc6IE9wdGlvbmFsW3N0cl0gPSAiIgoKCmNsYXNzIFVwZGF0ZURlY2tSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBuYW1lOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgY29tbWFuZGVyX3NjcnlmYWxsX2lkOiBPcHRpb25hbFtzdHJdID0gTm9uZQogICAgY29tbWFuZGVyX25hbWU6IE9wdGlvbmFsW3N0cl0gPSBOb25lCiAgICBjb2xvcl9pZGVudGl0eTogT3B0aW9uYWxbbGlzdF0gPSBOb25lCiAgICBzdHJhdGVneV90YWc6IE9wdGlvbmFsW3N0cl0gPSBOb25lCgoKY2xhc3MgQWRkRGVja0NhcmRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBzY3J5ZmFsbF9pZDogc3RyCiAgICBjYXJkX25hbWU6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgcXVhbnRpdHk6IE9wdGlvbmFsW2ludF0gPSAxCiAgICBpc19jb21tYW5kZXI6IE9wdGlvbmFsW2ludF0gPSAwCiAgICByb2xlX3RhZzogT3B0aW9uYWxbc3RyXSA9ICIiCgoKY2xhc3MgUGF0Y2hEZWNrQ2FyZFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIHF1YW50aXR5OiBPcHRpb25hbFtpbnRdID0gTm9uZQogICAgcm9sZV90YWc6IE9wdGlvbmFsW3N0cl0gPSBOb25lCgoKY2xhc3MgQnVsa0FkZFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGNhcmRzOiBsaXN0W2RpY3RdICAjIFt7c2NyeWZhbGxfaWQsIHF1YW50aXR5fV0KICAgIHJlc3BlY3RfcmF0aW9zOiBPcHRpb25hbFtib29sXSA9IEZhbHNlCgoKY2xhc3MgQnVsa0FkZFJlY29tbWVuZGVkUmVxdWVzdChCYXNlTW9kZWwpOgog' +
'ICAgc291cmNlOiBzdHIgPSAiY29sbGVjdGlvbiIgICMgImNvbGxlY3Rpb24iIHwgImVkaHJlYyIKICAgIG9ubHlfb3duZWQ6IE9wdGlvbmFsW2Jvb2xdID0gVHJ1ZQogICAgcmVzcGVjdF9yYXRpb3M6IE9wdGlvbmFsW2Jvb2xdID0gRmFsc2UKICAgIHR5cGVzOiBPcHRpb25hbFtsaXN0W3N0cl1dID0gTm9uZQogICAgcm9sZXM6IE9wdGlvbmFsW2xpc3Rbc3RyXV0gPSBOb25lCgoKIyDilIDilIAgQXV0byBEZWNrIEdlbmVyYXRvciBNb2RlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpjbGFzcyBEZWNrR2VuZXJhdGlvblNvdXJjZUNvbmZpZyhCYXNlTW9kZWwpOgogICAgdXNlX2FyY2hpZGVrdDogYm9vbCA9IFRydWUKICAgIHVzZV9lZGhyZWM6IGJvb2wgPSBUcnVlCiAgICB1c2VfbW94ZmllbGQ6IGJvb2wgPSBGYWxzZQogICAgdXNlX210Z2dvbGRmaXNoOiBib29sID0gRmFsc2UKICAgIGFyY2hpZGVrdF91cmw6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgbW94ZmllbGRfdXJsOiBPcHRpb25hbFtzdHJdID0gIiIKICAgIG10Z2dvbGRmaXNoX3VybDogT3B0aW9uYWxbc3RyXSA9ICIiCgoKY2xhc3MgRGVja0dlbmVyYXRpb25SZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBjb21tYW5kZXJfbmFtZTogT3B0aW9uYWxbc3RyXSA9ICIiCiAgICBjb21tYW5kZXJfc2NyeWZhbGxfaWQ6IE9wdGlvbmFsW3N0cl0gPSAiIgogICAgY29sb3JfaWRlbnRpdHk6IE9wdGlvbmFsW2xpc3Rbc3RyXV0gPSBOb25lCiAgICBzb3VyY2VzOiBPcHRpb25hbFtEZWNrR2VuZXJhdGlvblNvdXJjZUNvbmZpZ10gPSBOb25lCiAgICB0YXJnZXRfbGFuZF9jb3VudDogaW50ID0gMzcKICAgIHRhcmdldF9pbnN0YW50X2NvdW50OiBpbnQgPSAxMAogICAgdGFyZ2V0X3NvcmNlcnlfY291bnQ6IGludCA9IDgKICAgIHRhcmdldF9hcnRpZmFjdF9jb3VudDogaW50ID0gMTAKICAgIHRhcmdldF9lbmNoYW50bWVudF9jb3VudDogaW50ID0gOAogICAgdGFyZ2V0X2NyZWF0dXJlX2NvdW50OiBpbnQgPSAyNQogICAgdGFyZ2V0X3BsYW5lc3dhbGtlcl9jb3VudDogaW50ID0gMgogICAgb25seV9jYXJkc19pbl9jb2xsZWN0aW9uOiBib29sID0gRmFsc2UKICAgIGFsbG93X3Byb3hpZXM6IGJvb2wgPSBUcnVlCiAgICBkZWNrX25hbWU6IE9wdGlvbmFsW3N0cl0gPSAiIgoKCmNsYXNzIEdlbmVyYXRlZERlY2tDYXJkKEJhc2VNb2RlbCk6CiAgICBzY3J5ZmFsbF9pZDogc3RyID0gIiIKICAgIG5hbWU6IHN0ciA9ICIiCiAgICB0eXBlX2xpbmU6IHN0ciA9ICIiCiAgICBtYW5hX2Nvc3Q6IHN0ciA9ICIiCiAgICBjbWM6IGZsb2F0ID0gMAogICAgY2FyZF90eXBlOiBzdHIgPSAiIiAgICAgICAgIyBMYW5kIC8gQ3JlYXR1cmUgLyBJbnN0YW50IC8gZXRjLgogICAgcm9sZXM6IGxpc3Rbc3RyXSA9IFtdCiAgICBzb3VyY2U6IHN0ciA9ICJjb2xsZWN0aW9uIiAgIyBjb2xsZWN0aW9uIC8gZWRocmVjIC8gYXJjaGlkZWt0IC8gdGVtcGxhdGUKICAgIHF1YW50aXR5OiBpbnQgPSAxCiAgICBpbWFnZV91cmw6IHN0ciA9ICIiCiAgICBvd25lZF9xdHk6IGludCA9IDAKICAgIGlzX3Byb3h5OiBib29sID0gRmFsc2UKCgojIOKUgOKUgCBWMyBEZWNrIEdlbmVyYXRpb24gKFBlcnBsZXhpdHkgU3RydWN0dXJlZCBPdXRwdXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApjbGFzcyBEZWNrR2VuVjNSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBjb21tYW5kZXJfbmFtZTogc3RyID0gIiIKICAgIHN0cmF0ZWd5OiBzdHIgPSAiIiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlLmcuICJ6b21iaWUgdG9rZW5zIiwgInZvbHRyb24iCiAgICB0YXJnZXRfYnJhY2tldDogaW50ID0gMyAgICAgICAgICAgICAgICAgICAgICMgMS00IHBlciBDb21tYW5kZXIgUnVsZXMgQ29tbWl0dGVlCiAgICBidWRnZXRfdXNkOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lICAgICAgICAgICMgTm9uZSA9IG5vIGJ1ZGdldAogICAgYnVkZ2V0X21vZGU6IHN0ciA9ICJ0b3RhbCIgICAgICAgICAgICAgICAgICAjICJ0b3RhbCIgb3IgInBlcl9jYXJkIgogICAgb21pdF9jYXJkczogbGlzdFtzdHJdID0gW10gICAgICAgICAgICAgICAgICAjIENhcmRzIHRvIGV4Y2x1ZGUKICAgIHVzZV9jb2xsZWN0aW9uOiBib29sID0gVHJ1ZSAgICAgICAgICAgICAgICAgIyBDcm9zcy1yZWYgd2l0aCBjb2xsZWN0aW9u' +
'IERCCiAgICBydW5fc3Vic3RpdHV0aW9uOiBib29sID0gVHJ1ZSAgICAgICAgICAgICAgICMgRW5hYmxlIFNtYXJ0IFN1YnN0aXR1dGlvbiBFbmdpbmUKICAgIG1vZGVsOiBPcHRpb25hbFtzdHJdID0gTm9uZSAgICAgICAgICAgICAgICAgIyBPdmVycmlkZTogc29uYXIsIHNvbmFyLXBybwogICAgZGVja19uYW1lOiBPcHRpb25hbFtzdHJdID0gIiIgICAgICAgICAgICAgICAjIEN1c3RvbSBkZWNrIG5hbWUgZm9yIGNvbW1pdAoKCmNsYXNzIERlY2tHZW5WM1N1YnN0aXR1dGVSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICAiIiJSZXF1ZXN0IHRvIG1hbnVhbGx5IHBpY2sgYSBzdWJzdGl0dXRlIGZvciBhIGNhcmQuIiIiCiAgICBjYXJkX25hbWU6IHN0cgogICAgc3Vic3RpdHV0ZV9uYW1lOiBzdHIKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIHYzOiBEZWNrIEltcG9ydCAmIE1ldGEgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAYXBwLnBvc3QoIi9hcGkvbGFiL2ltcG9ydC91cmwiKQphc3luYyBkZWYgaW1wb3J0X2Zyb21fdXJsKHJlcTogSW1wb3J0VXJsUmVxdWVzdCk6CiAgICAiIiJJbXBvcnQgYSBkZWNrIGZyb20gQXJjaGlkZWt0IG9yIEVESFJFQyBVUkwuIFJldHVybnMgcGFyc2VkIERlY2tQcm9maWxlICsgc2F2ZXMgLmRjayBmaWxlLiIiIgogICAgdXJsID0gcmVxLnVybC5zdHJpcCgpCiAgICB0cnk6CiAgICAgICAgcHJvZmlsZSA9IF9pbXBvcnRfZnJvbV91cmwodXJsKQogICAgICAgIGRja19wYXRoID0gX3NhdmVfcHJvZmlsZV90b19kY2socHJvZmlsZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUsCiAgICAgICAgICAgICJkZWNrTmFtZSI6IHByb2ZpbGVbIm5hbWUiXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IHByb2ZpbGVbImNvbW1hbmRlciJdLAogICAgICAgICAgICAic291cmNlIjogcHJvZmlsZVsic291cmNlIl0sCiAgICAgICAgICAgICJzb3VyY2VVcmwiOiBwcm9maWxlWyJzb3VyY2VVcmwiXSwKICAgICAgICAgICAgInRvdGFsQ2FyZHMiOiBwcm9maWxlWyJ0b3RhbENhcmRzIl0sCiAgICAgICAgICAgICJkY2tGaWxlIjogZGNrX3BhdGguc3RlbSwKICAgICAgICAgICAgImNvbG9ySWRlbnRpdHkiOiBwcm9maWxlLmdldCgiY29sb3JJZGVudGl0eSIsIFtdKSwKICAgICAgICAgICAgImFyY2hldHlwZSI6IHByb2ZpbGUuZ2V0KCJhcmNoZXR5cGUiKSwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIHN0cihlKSkKCgpAYXBwLnBvc3QoIi9hcGkvbGFiL2ltcG9ydC90ZXh0IikKYXN5bmMgZGVmIGltcG9ydF9mcm9tX3RleHQocmVxOiBJbXBvcnRUZXh0UmVxdWVzdCk6CiAgICAiIiJJbXBvcnQgYSBkZWNrIGZyb20gcGxhaW4gdGV4dCBjYXJkIGxpc3QuIiIiCiAgICB0cnk6CiAgICAgICAgcHJvZmlsZSA9IF9wYXJzZV90ZXh0X2RlY2tsaXN0KHJlcS50ZXh0LCByZXEuY29tbWFuZGVyKQogICAgICAgIGRja19wYXRoID0gX3NhdmVfcHJvZmlsZV90b19kY2socHJvZmlsZSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IFRydWUsCiAgICAgICAgICAgICJkZWNrTmFtZSI6IHByb2ZpbGVbIm5hbWUiXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IHByb2ZpbGVbImNvbW1hbmRlciJdLAogICAgICAgICAgICAic291cmNlIjogIlRleHQgSW1wb3J0IiwKICAgICAgICAgICAgInRvdGFsQ2FyZHMiOiBwcm9maWxlWyJ0b3RhbENhcmRzIl0sCiAgICAgICAgICAgICJkY2tGaWxlIjogZGNrX3BhdGguc3RlbSwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIHN0cihlKSkKCgpAYXBwLmdldCgiL2FwaS9sYWIvbWV0YS9jb21tYW5kZXJz' +
'IikKYXN5bmMgZGVmIGxpc3RfbWV0YV9jb21tYW5kZXJzKCk6CiAgICAiIiJMaXN0IGF2YWlsYWJsZSBjb21tYW5kZXJzIGluIHRoZSBtZXRhIG1hcHBpbmcuIiIiCiAgICBjb21tYW5kZXJzID0gW10KICAgIGZvciBuYW1lLCBlbnRyaWVzIGluIENPTU1BTkRFUl9NRVRBLml0ZW1zKCk6CiAgICAgICAgZW50cnkgPSBlbnRyaWVzWzBdIGlmIGVudHJpZXMgZWxzZSB7fQogICAgICAgIGNvbW1hbmRlcnMuYXBwZW5kKHsKICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAiYXJjaGV0eXBlIjogZW50cnkuZ2V0KCJhcmNoZXR5cGUiLCAiIiksCiAgICAgICAgICAgICJjb2xvcklkZW50aXR5IjogZW50cnkuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pLAogICAgICAgICAgICAic291cmNlIjogZW50cnkuZ2V0KCJzb3VyY2UiLCAiZWRocmVjIiksCiAgICAgICAgfSkKICAgIHJldHVybiB7ImNvbW1hbmRlcnMiOiBjb21tYW5kZXJzfQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9tZXRhL3NlYXJjaCIpCmFzeW5jIGRlZiBzZWFyY2hfbWV0YV9jb21tYW5kZXJzKHE6IHN0ciA9ICIiKToKICAgICIiIlNlYXJjaCBjb21tYW5kZXJzIGJ5IHBhcnRpYWwgbmFtZSBtYXRjaC4iIiIKICAgIHF1ZXJ5ID0gcS5sb3dlcigpCiAgICBtYXRjaGVzID0gW10KICAgIGZvciBuYW1lLCBlbnRyaWVzIGluIENPTU1BTkRFUl9NRVRBLml0ZW1zKCk6CiAgICAgICAgaWYgcXVlcnkgaW4gbmFtZS5sb3dlcigpOgogICAgICAgICAgICBlbnRyeSA9IGVudHJpZXNbMF0gaWYgZW50cmllcyBlbHNlIHt9CiAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJhcmNoZXR5cGUiOiBlbnRyeS5nZXQoImFyY2hldHlwZSIsICIiKSwKICAgICAgICAgICAgICAgICJjb2xvcklkZW50aXR5IjogZW50cnkuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pLAogICAgICAgICAgICB9KQogICAgcmV0dXJuIHsicmVzdWx0cyI6IG1hdGNoZXN9CgoKQGFwcC5wb3N0KCIvYXBpL2xhYi9tZXRhL2ZldGNoIikKYXN5bmMgZGVmIGZldGNoX21ldGFfZGVjayhyZXE6IE1ldGFGZXRjaFJlcXVlc3QpOgogICAgIiIiRmV0Y2ggRURIUkVDIGF2ZXJhZ2UgZGVjayBmb3IgYSBjb21tYW5kZXIgYW5kIHNhdmUgYXMgLmRjayBmaWxlLiIiIgogICAgdHJ5OgogICAgICAgIHByb2ZpbGUgPSBfZmV0Y2hfZWRocmVjX2F2ZXJhZ2UocmVxLmNvbW1hbmRlcikKICAgICAgICBkY2tfcGF0aCA9IF9zYXZlX3Byb2ZpbGVfdG9fZGNrKHByb2ZpbGUpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInN1Y2Nlc3MiOiBUcnVlLAogICAgICAgICAgICAiZGVja05hbWUiOiBwcm9maWxlWyJuYW1lIl0sCiAgICAgICAgICAgICJjb21tYW5kZXIiOiBwcm9maWxlWyJjb21tYW5kZXIiXSwKICAgICAgICAgICAgInNvdXJjZSI6ICJFREhSRUMgQXZlcmFnZSIsCiAgICAgICAgICAgICJzb3VyY2VVcmwiOiBwcm9maWxlLmdldCgic291cmNlVXJsIiwgIiIpLAogICAgICAgICAgICAidG90YWxDYXJkcyI6IHByb2ZpbGVbInRvdGFsQ2FyZHMiXSwKICAgICAgICAgICAgImRja0ZpbGUiOiBkY2tfcGF0aC5zdGVtLAogICAgICAgICAgICAiY29sb3JJZGVudGl0eSI6IHByb2ZpbGUuZ2V0KCJjb2xvcklkZW50aXR5IiwgW10pLAogICAgICAgICAgICAic2FtcGxlU2l6ZSI6IHByb2ZpbGUuZ2V0KCJzYW1wbGVTaXplIiksCiAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCBmIkZhaWxlZCB0byBmZXRjaCBtZXRhIGRlY2sgZm9yICd7cmVxLmNvbW1hbmRlcn0nOiB7c3RyKGUpfSIpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBFeGlzdGluZyBFbmRwb2ludHMgKHYxL3YyKQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkAoKQGFwcC5wb3N0KCIvYXBpL2xhYi9zdGFydCIsIHJlc3BvbnNlX21vZGVsPVN0YXJ0UmVzcG9uc2UpCmFzeW5jIGRlZiBzdGFydF9iYXRjaChyZXE6IFN0YXJ0UmVxdWVzdCwgYmFja2dyb3VuZF90YXNrczogQmFja2dyb3VuZFRhc2tzKToKICAgICIiIlN0YXJ0IGEgbmV3IGJhdGNoIHNpbXVsYXRpb24gcnVuLiIiIgogICAgaWYgbGVuKHJlcS5kZWNrcykgIT0gMzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIkV4YWN0bHkgMyBkZWNrcyByZXF1aXJlZCIpCiAgICBpZiBub3QgYWxsKHJlcS5kZWNrcyk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJBbGwgMyBkZWNrIHNsb3RzIG11c3QgYmUgZmlsbGVkIikKICAgIGlmIHJlcS5udW1HYW1lcyA8IDEgb3IgcmVxLm51bUdhbWVzID4gMTAwMDA6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJudW1HYW1lcyBtdXN0IGJlIDEtMTAwMDAiKQogICAgaWYgcmVxLnRocmVhZHMgPCAxIG9yIHJlcS50aHJlYWRzID4gMTY6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJ0aHJlYWRzIG11c3QgYmUgMS0xNiIpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKENGRy5mb3JnZV9qYXIpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkZvcmdlIEpBUiBub3QgZm91bmQ6IHtDRkcuZm9yZ2VfamFyfSIpCiAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihDRkcuZm9yZ2VfZGlyKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGb3JnZSBkaXIgbm90IGZvdW5kOiB7Q0ZHLmZvcmdlX2Rpcn0iKQoKICAgIGJhdGNoX2lkID0gc3RyKHV1aWQudXVpZDQoKSlbOjEyXQogICAgc3RhdGUgPSBCYXRjaFN0YXRlKGJhdGNoX2lkLCByZXEubnVtR2FtZXMsIHJlcS50aHJlYWRzKQogICAgYWN0aXZlX2JhdGNoZXNbYmF0Y2hfaWRdID0gc3RhdGUKCiAgICBvcy5tYWtlZGlycyhDRkcucmVzdWx0c19kaXIsIGV4aXN0X29rPVRydWUpCiAgICBvdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihDRkcucmVzdWx0c19kaXIsIGYiYmF0Y2gte2JhdGNoX2lkfS5qc29uIikKICAgIHN0YXRlLnJlc3VsdF9wYXRoID0gb3V0cHV0X3BhdGgKCiAgICBiYWNrZ3JvdW5kX3Rhc2tzLmFkZF90YXNrKAogICAgICAgIHJ1bl9iYXRjaF9zdWJwcm9jZXNzLAogICAgICAgIHN0YXRlLAogICAgICAgIHJlcS5kZWNrcywKICAgICAgICByZXEubnVtR2FtZXMsCiAgICAgICAgcmVxLnRocmVhZHMsCiAgICAgICAgcmVxLnNlZWQsCiAgICAgICAgcmVxLmNsb2NrLAogICAgICAgIG91dHB1dF9wYXRoLAogICAgICAgIHJlcS51c2VMZWFybmVkUG9saWN5LAogICAgICAgIHJlcS5wb2xpY3lTdHlsZSwKICAgICAgICByZXEucG9saWN5R3JlZWR5LAogICAgICAgIHJlcS5haVNpbXBsaWZpZWQsCiAgICAgICAgcmVxLmFpVGhpbmtUaW1lTXMsCiAgICAgICAgcmVxLm1heFF1ZXVlRGVwdGgsCiAgICApCgogICAgcG9saWN5X21zZyA9ICIiCiAgICBpZiByZXEudXNlTGVhcm5lZFBvbGljeToKICAgICAgICBwb2xpY3lfbXNnID0gZiIgW0xlYXJuZWQgUG9saWN5OiB7cmVxLnBvbGljeVN0eWxlfV0iCiAgICByZXR1cm4gU3RhcnRSZXNwb25zZSgKICAgICAgICBiYXRjaElkPWJhdGNoX2lkLAogICAgICAgIHN0YXR1cz0ic3RhcnRlZCIsCiAgICAgICAgbWVzc2FnZT1mIlJ1bm5pbmcge3JlcS5udW1HYW1lc30gZ2FtZXMgd2l0aCB7cmVxLnRocmVhZHN9IHRocmVhZHN7cG9saWN5X21zZ30iLAogICAgKQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9zdGF0dXMiLCByZXNwb25zZV9tb2RlbD1TdGF0dXNSZXNwb25zZSkKYXN5bmMgZGVmIGdldF9zdGF0dXMoYmF0Y2hJZDogc3RyKToKICAgIHN0YXRlID0gYWN0aXZlX2JhdGNoZXMuZ2V0KGJhdGNoSWQpCiAgICBpZiBub3Qgc3RhdGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiQmF0Y2gge2JhdGNoSWR9IG5vdCBmb3VuZCIpCiAgICBlbGFwc2VkID0gaW50KChkYXRldGltZS5ub3coKSAtIHN0YXRlLnN0YXJ0X3RpbWUpLnRvdGFsX3NlY29uZHMoKSAqIDEwMDApCiAgICByZXR1cm4gU3RhdHVzUmVzcG9uc2UoCiAgICAgICAgYmF0Y2hJZD1zdGF0ZS5iYXRjaF9pZCwKICAgICAgICBydW5uaW5nPXN0YXRlLnJ1bm5pbmcsCiAgICAgICAgY29tcGxldGVkPXN0YXRlLmNvbXBsZXRlZF9nYW1lcywKICAgICAgICB0b3RhbD1zdGF0ZS50b3RhbF9nYW1lcywKICAgICAgICB0aHJlYWRzPXN0YXRlLnRocmVhZHMsCiAg' +
'ICAgICAgZWxhcHNlZE1zPWVsYXBzZWQgaWYgc3RhdGUucnVubmluZyBlbHNlIHN0YXRlLmVsYXBzZWRfbXMsCiAgICAgICAgZXJyb3I9c3RhdGUuZXJyb3IsCiAgICAgICAgc2ltc1BlclNlYz1zdGF0ZS5zaW1zX3Blcl9zZWMsCiAgICApCgoKQGFwcC5nZXQoIi9hcGkvbGFiL3Jlc3VsdCIpCmFzeW5jIGRlZiBnZXRfcmVzdWx0KGJhdGNoSWQ6IHN0cik6CiAgICBzdGF0ZSA9IGFjdGl2ZV9iYXRjaGVzLmdldChiYXRjaElkKQogICAgaWYgbm90IHN0YXRlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkJhdGNoIHtiYXRjaElkfSBub3QgZm91bmQiKQogICAgaWYgc3RhdGUucnVubmluZzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwOSwgIkJhdGNoIHN0aWxsIHJ1bm5pbmciKQogICAgaWYgc3RhdGUuZXJyb3I6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIHN0YXRlLmVycm9yKQogICAgaWYgbm90IHN0YXRlLnJlc3VsdF9wYXRoIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhzdGF0ZS5yZXN1bHRfcGF0aCk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJSZXN1bHQgZmlsZSBub3QgZm91bmQiKQogICAgd2l0aCBvcGVuKHN0YXRlLnJlc3VsdF9wYXRoLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgZGF0YSA9IGpzb24ubG9hZChmKQogICAgcmV0dXJuIEpTT05SZXNwb25zZShjb250ZW50PWRhdGEpCgoKQGFwcC5nZXQoIi9hcGkvbGFiL2RlY2tzIikKYXN5bmMgZGVmIGxpc3RfZGVja3MoKToKICAgIGRlY2tzID0gW10KICAgIHNlZW5fbmFtZXMgPSBzZXQoKQoKICAgICMgMS4gRm9yZ2UgLmRjayBmaWxlcyBmcm9tIGRlY2tzIGRpcmVjdG9yeQogICAgZGVja3NfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgaWYgZGVja3NfZGlyIGFuZCBvcy5wYXRoLmlzZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgZm9yIGYgaW4gc29ydGVkKFBhdGgoZGVja3NfZGlyKS5nbG9iKCIqLmRjayIpKToKICAgICAgICAgICAgZGVja19uYW1lID0gZi5zdGVtCiAgICAgICAgICAgIGRlY2tzLmFwcGVuZCh7Im5hbWUiOiBkZWNrX25hbWUsICJmaWxlbmFtZSI6IGYubmFtZSwgInNvdXJjZSI6ICJmb3JnZSJ9KQogICAgICAgICAgICBzZWVuX25hbWVzLmFkZChkZWNrX25hbWUubG93ZXIoKSkKCiAgICAjIDIuIERlY2tzIGZyb20gdGhlIERlY2sgQnVpbGRlciBkYXRhYmFzZQogICAgdHJ5OgogICAgICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgaWQsIG5hbWUsIGNvbW1hbmRlcl9uYW1lIEZST00gZGVja3MgT1JERVIgQlkgaWQgREVTQyIKICAgICAgICApLmZldGNoYWxsKCkKICAgICAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgICAgIGRiX25hbWUgPSByb3dbIm5hbWUiXQogICAgICAgICAgICBpZiBkYl9uYW1lLmxvd2VyKCkgbm90IGluIHNlZW5fbmFtZXM6CiAgICAgICAgICAgICAgICBkZWNrcy5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogZGJfbmFtZSwKICAgICAgICAgICAgICAgICAgICAiZmlsZW5hbWUiOiAiIiwKICAgICAgICAgICAgICAgICAgICAic291cmNlIjogImRlY2tidWlsZGVyIiwKICAgICAgICAgICAgICAgICAgICAiZGVja19pZCI6IHJvd1siaWQiXSwKICAgICAgICAgICAgICAgICAgICAiY29tbWFuZGVyIjogcm93WyJjb21tYW5kZXJfbmFtZSJdIG9yICIiLAogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIHNlZW5fbmFtZXMuYWRkKGRiX25hbWUubG93ZXIoKSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIiAgV0FSTklORzogRmFpbGVkIHRvIGxvYWQgREIgZGVja3MgZm9yIC9hcGkvbGFiL2RlY2tzOiB7ZX0iKQoKICAgIHJldHVybiB7ImRlY2tzIjogZGVja3N9CgoKQGFwcC5nZXQoIi9hcGkvbGFiL2hpc3RvcnkiKQphc3luYyBkZWYgbGlzdF9oaXN0b3J5KCk6CiAgICByZXN1bHRzX2RpciA9IFBhdGgoQ0ZHLnJlc3VsdHNfZGlyKQogICAgaWYgbm90IHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIHJldHVybiB7InJlc3VsdHMiOiBbXX0KICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIGYgaW4gc29ydGVkKHJlc3VsdHNfZGlyLmdsb2IoImJhdGNoLSouanNvbiIpLCByZXZlcnNlPVRydWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZmg6' +
'CiAgICAgICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkKGZoKQogICAgICAgICAgICBtZXRhID0gZGF0YS5nZXQoIm1ldGFkYXRhIiwge30pCiAgICAgICAgICAgIGRlY2tzID0gZGF0YS5nZXQoImRlY2tzIiwgW10pCiAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJmaWxlbmFtZSI6IGYubmFtZSwKICAgICAgICAgICAgICAgICJiYXRjaElkIjogbWV0YS5nZXQoImJhdGNoSWQiLCAiIiksCiAgICAgICAgICAgICAgICAidGltZXN0YW1wIjogbWV0YS5nZXQoInRpbWVzdGFtcCIsICIiKSwKICAgICAgICAgICAgICAgICJ0b3RhbEdhbWVzIjogbWV0YS5nZXQoImNvbXBsZXRlZEdhbWVzIiwgMCksCiAgICAgICAgICAgICAgICAidGhyZWFkcyI6IG1ldGEuZ2V0KCJ0aHJlYWRzIiwgMSksCiAgICAgICAgICAgICAgICAiZWxhcHNlZE1zIjogbWV0YS5nZXQoImVsYXBzZWRNcyIsIDApLAogICAgICAgICAgICAgICAgImRlY2tzIjogW3sibmFtZSI6IGQuZ2V0KCJkZWNrTmFtZSIsICIiKSwgInNvdXJjZSI6IGQuZ2V0KCJzb3VyY2UiLCAiIil9IGZvciBkIGluIGRlY2tzXSwKICAgICAgICAgICAgfSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb250aW51ZQogICAgcmV0dXJuIHsicmVzdWx0cyI6IHJlc3VsdHNbOjUwXX0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEFJIFByb2ZpbGVzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpBSV9QUk9GSUxFUyA9IHsKICAgICJkZWZhdWx0IjogewogICAgICAgICJuYW1lIjogImRlZmF1bHQiLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJCYWxhbmNlZCBcdTIwMTQgRm9yZ2UncyBkZWZhdWx0IEFJIGJlaGF2aW9yIiwKICAgICAgICAiYWdncmVzc2lvbiI6IDAuNSwgImNhcmRBZHZhbnRhZ2UiOiAwLjUsICJyZW1vdmFsUHJpb3JpdHkiOiAwLjUsCiAgICAgICAgImJvYXJkUHJlc2VuY2UiOiAwLjUsICJjb21ib1ByaW9yaXR5IjogMC4zLCAicGF0aWVuY2UiOiAwLjUsCiAgICB9LAogICAgImFnZ3JvIjogewogICAgICAgICJuYW1lIjogImFnZ3JvIiwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiQWdncmVzc2l2ZSBcdTIwMTQgYXR0YWNrcyBlYXJseSwgcHJpb3JpdGl6ZXMgZGFtYWdlIiwKICAgICAgICAiYWdncmVzc2lvbiI6IDAuOSwgImNhcmRBZHZhbnRhZ2UiOiAwLjMsICJyZW1vdmFsUHJpb3JpdHkiOiAwLjMsCiAgICAgICAgImJvYXJkUHJlc2VuY2UiOiAwLjgsICJjb21ib1ByaW9yaXR5IjogMC4xLCAicGF0aWVuY2UiOiAwLjEsCiAgICB9LAogICAgImNvbnRyb2wiOiB7CiAgICAgICAgIm5hbWUiOiAiY29udHJvbCIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbnRyb2wgXHUyMDE0IGRlZmVuc2l2ZSwgcmVtb3ZhbC1oZWF2eSwgY2FyZCBhZHZhbnRhZ2UiLAogICAgICAgICJhZ2dyZXNzaW9uIjogMC4yLCAiY2FyZEFkdmFudGFnZSI6IDAuOSwgInJlbW92YWxQcmlvcml0eSI6IDAuOSwKICAgICAgICAiYm9hcmRQcmVzZW5jZSI6IDAuMywgImNvbWJvUHJpb3JpdHkiOiAwLjQsICJwYXRpZW5jZSI6IDAuOSwKICAgIH0sCiAgICAiY29tYm8iOiB7CiAgICAgICAgIm5hbWUiOiAiY29tYm8iLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJDb21ibyBcdTIwMTQgcmFtcHMsIGRpZ3MgZm9yIHBpZWNlcywgYXNzZW1ibGVzIGNvbWJvcyIsCiAgICAgICAgImFnZ3Jlc3Npb24iOiAwLjIsICJjYXJkQWR2YW50YWdlIjogMC44LCAicmVtb3ZhbFByaW9yaXR5IjogMC40LAogICAgICAgICJib2FyZFByZXNlbmNlIjogMC4zLCAiY29tYm9Qcmlvcml0eSI6IDAuOTUsICJwYXRpZW5jZSI6IDAuNywKICAgIH0sCiAgICAibWlkcmFuZ2UiOiB7CiAgICAgICAgIm5hbWUiOiAibWlkcmFuZ2UiLAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJNaWRyYW5nZSBcdTIwMTQgZmxleGlibGUsIHN0cm9uZyBib2Fy' +
'ZCBwcmVzZW5jZSwgdmFsdWUtb3JpZW50ZWQiLAogICAgICAgICJhZ2dyZXNzaW9uIjogMC41LCAiY2FyZEFkdmFudGFnZSI6IDAuNiwgInJlbW92YWxQcmlvcml0eSI6IDAuNiwKICAgICAgICAiYm9hcmRQcmVzZW5jZSI6IDAuNywgImNvbWJvUHJpb3JpdHkiOiAwLjMsICJwYXRpZW5jZSI6IDAuNSwKICAgIH0sCn0KCkBhcHAuZ2V0KCIvYXBpL2xhYi9wcm9maWxlcyIpCmFzeW5jIGRlZiBsaXN0X3Byb2ZpbGVzKCk6CiAgICByZXR1cm4geyJwcm9maWxlcyI6IGxpc3QoQUlfUFJPRklMRVMudmFsdWVzKCkpfQoKQGFwcC5nZXQoIi9hcGkvbGFiL3Byb2ZpbGVzL3tuYW1lfSIpCmFzeW5jIGRlZiBnZXRfcHJvZmlsZShuYW1lOiBzdHIpOgogICAgcHJvZmlsZSA9IEFJX1BST0ZJTEVTLmdldChuYW1lLmxvd2VyKCkpCiAgICBpZiBub3QgcHJvZmlsZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJQcm9maWxlICd7bmFtZX0nIG5vdCBmb3VuZC4gQXZhaWxhYmxlOiB7bGlzdChBSV9QUk9GSUxFUy5rZXlzKCkpfSIpCiAgICByZXR1cm4gcHJvZmlsZQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9hbmFseXRpY3Mve2RlY2tfbmFtZX0iKQphc3luYyBkZWYgYW5hbHl6ZV9kZWNrKGRlY2tfbmFtZTogc3RyKToKICAgIGRlY2tzX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBkZWNrc19kaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoZGVja3NfZGlyKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJEZWNrcyBkaXJlY3Rvcnkgbm90IGZvdW5kOiB7ZGVja3NfZGlyfSIpCiAgICBkZWNrX3BhdGggPSBvcy5wYXRoLmpvaW4oZGVja3NfZGlyLCBkZWNrX25hbWUgKyAiLmRjayIpCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGVja19wYXRoKToKICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgICAgIGlmIGYubG93ZXIoKSA9PSBkZWNrX25hbWUubG93ZXIoKSArICIuZGNrIjoKICAgICAgICAgICAgICAgIGRlY2tfcGF0aCA9IG9zLnBhdGguam9pbihkZWNrc19kaXIsIGYpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkRlY2sgbm90IGZvdW5kOiB7ZGVja19uYW1lfSIpCiAgICB0cnk6CiAgICAgICAgYW5hbHlzaXMgPSBwYXJzZV9kY2tfZmlsZShkZWNrX3BhdGgpCiAgICAgICAgcmV0dXJuIGFuYWx5c2lzCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiQW5hbHlzaXMgZmFpbGVkOiB7c3RyKGUpfSIpCgoKZGVmIHBhcnNlX2Rja19maWxlKGRlY2tfcGF0aDogc3RyKSAtPiBkaWN0OgogICAgY2FyZHMgPSBbXQogICAgY29tbWFuZGVyID0gTm9uZQogICAgc2VjdGlvbiA9ICJNYWluIgogICAgZGVja19uYW1lID0gUGF0aChkZWNrX3BhdGgpLnN0ZW0KICAgIHdpdGggb3BlbihkZWNrX3BhdGgsICJyIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgiLy8iKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpIGFuZCBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJOYW1lPSIpOgogICAgICAgICAgICAgICAgZGVja19uYW1lID0gbGluZVs1Ol0uc3RyaXAoKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHIiXihcZCspXHMrKC4rPykoPzpcfCguKykpPyQiLCBsaW5lKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgcXR5ID0gaW50KG0uZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgyKS5zdHJpcCgpCiAgICAgICAgICAgICAgICBzZXRfY29kZSA9IG0uZ3JvdXAoMykuc3RyaXAoKSBpZiBtLmdyb3VwKDMpIGVsc2UgIiIKICAgICAgICAgICAgICAgIGNhcmRzLmFwcGVuZCh7InF1YW50aXR5IjogcXR5LCAibmFtZSI6IG5hbWUsICJzZXQiOiBzZXRfY29kZSwgInNlY3Rpb24iOiBzZWN0aW9ufSkKICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gPT0gIkNvbW1hbmRlciI6CiAg' +
'ICAgICAgICAgICAgICAgICAgY29tbWFuZGVyID0gbmFtZQogICAgdG90YWwgPSBzdW0oY1sicXVhbnRpdHkiXSBmb3IgYyBpbiBjYXJkcykKICAgIHJldHVybiB7CiAgICAgICAgImRlY2tOYW1lIjogZGVja19uYW1lLAogICAgICAgICJjb21tYW5kZXJOYW1lIjogY29tbWFuZGVyLAogICAgICAgICJ0b3RhbENhcmRzIjogdG90YWwsCiAgICAgICAgImNhcmRDb3VudCI6IGxlbihjYXJkcyksCiAgICAgICAgImNhcmRzIjogY2FyZHNbOjIwMF0sCiAgICB9CgoKQGFwcC5nZXQoIi9hcGkvbGFiL3RyZW5kcy97ZGVja19uYW1lfSIpCmFzeW5jIGRlZiBnZXRfZGVja190cmVuZHMoZGVja19uYW1lOiBzdHIpOgogICAgcmVzdWx0c19kaXIgPSBQYXRoKENGRy5yZXN1bHRzX2RpcikKICAgIGlmIG5vdCByZXN1bHRzX2Rpci5leGlzdHMoKToKICAgICAgICByZXR1cm4geyJkZWNrTmFtZSI6IGRlY2tfbmFtZSwgImhpc3RvcnkiOiBbXX0KICAgIGhpc3RvcnkgPSBbXQogICAgZm9yIGYgaW4gc29ydGVkKHJlc3VsdHNfZGlyLmdsb2IoImJhdGNoLSouanNvbiIpKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihmLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGZoOgogICAgICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZChmaCkKICAgICAgICAgICAgc3VtbWFyeSA9IGRhdGEuZ2V0KCJzdW1tYXJ5Iiwge30pCiAgICAgICAgICAgIG1ldGEgPSBkYXRhLmdldCgibWV0YWRhdGEiLCB7fSkKICAgICAgICAgICAgcGVyX2RlY2sgPSBzdW1tYXJ5LmdldCgicGVyRGVjayIsIFtdKQogICAgICAgICAgICBmb3IgZHMgaW4gcGVyX2RlY2s6CiAgICAgICAgICAgICAgICBpZiBkcy5nZXQoImRlY2tOYW1lIiwgIiIpLmxvd2VyKCkgPT0gZGVja19uYW1lLmxvd2VyKCk6CiAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICAgICAiYmF0Y2hJZCI6IG1ldGEuZ2V0KCJiYXRjaElkIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiOiBtZXRhLmdldCgidGltZXN0YW1wIiksCiAgICAgICAgICAgICAgICAgICAgICAgICJ3aW5SYXRlIjogZHMuZ2V0KCJ3aW5SYXRlIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICJ3aW5zIjogZHMuZ2V0KCJ3aW5zIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICJsb3NzZXMiOiBkcy5nZXQoImxvc3NlcyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAiZHJhd3MiOiBkcy5nZXQoImRyYXdzIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbEdhbWVzIjogbWV0YS5nZXQoImNvbXBsZXRlZEdhbWVzIiwgMCksCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICByZXR1cm4geyJkZWNrTmFtZSI6IGRlY2tfbmFtZSwgImhpc3RvcnkiOiBoaXN0b3J5fQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9sb2ciKQphc3luYyBkZWYgZ2V0X2xvZyhiYXRjaElkOiBzdHIpOgogICAgc3RhdGUgPSBhY3RpdmVfYmF0Y2hlcy5nZXQoYmF0Y2hJZCkKICAgIGlmIG5vdCBzdGF0ZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJCYXRjaCB7YmF0Y2hJZH0gbm90IGZvdW5kIikKICAgIHJldHVybiB7ImxpbmVzIjogc3RhdGUubG9nX2xpbmVzWy0yMDA6XX0KCgpAYXBwLmdldCgiL2FwaS9sYWIvZGVidWctbG9nIikKYXN5bmMgZGVmIGdldF9kZWJ1Z19sb2coKToKICAgICIiIlJldHVybiB0aGUgcmF3IEZvcmdlIHN1YnByb2Nlc3MgZGVidWcgbG9nIGZvciBkaWFnbm9zaW5nIHNpbXVsYXRpb24gaXNzdWVzLiIiIgogICAgIyBDaGVjayBtdWx0aXBsZSBwb3NzaWJsZSBsb2NhdGlvbnMgZm9yIHRoZSBkZWJ1ZyBsb2cKICAgIGNhbmRpZGF0ZXMgPSBbXQogICAgaWYgQ0ZHLmZvcmdlX2RpcjoKICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZChQYXRoKENGRy5mb3JnZV9kaXIpLnBhcmVudCAvICJmb3JnZS1zaW0tZGVidWcubG9nIikKICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZChQYXRoKENGRy5mb3JnZV9kaXIpIC8gImZvcmdlLXNpbS1kZWJ1Zy5sb2ciKQogICAgY2FuZGlkYXRlcy5hcHBlbmQoUGF0aCgiZm9yZ2Utc2ltLWRlYnVnLmxvZyIpKQoKICAgIGZvciBsb2dfcGF0aCBpbiBjYW5kaWRhdGVzOgogICAgICAgIGlmIGxvZ19wYXRoLmV4aXN0cygpOgogICAgICAgICAgICB0ZXh0ID0gbG9nX3BhdGgucmVhZF90' +
'ZXh0KGVuY29kaW5nPSJ1dGYtOCIsIGVycm9ycz0icmVwbGFjZSIpCiAgICAgICAgICAgICMgUmV0dXJuIGxhc3QgNTBLQiB0byBhdm9pZCBodWdlIHJlc3BvbnNlcwogICAgICAgICAgICBpZiBsZW4odGV4dCkgPiA1MDAwMDoKICAgICAgICAgICAgICAgIHRleHQgPSAiLi4uICh0cnVuY2F0ZWQpIC4uLlxuIiArIHRleHRbLTUwMDAwOl0KICAgICAgICAgICAgcmV0dXJuIHsicGF0aCI6IHN0cihsb2dfcGF0aCksICJjb250ZW50IjogdGV4dH0KCiAgICByZXR1cm4geyJwYXRoIjogTm9uZSwgImNvbnRlbnQiOiAiTm8gZGVidWcgbG9nIGZvdW5kLiBSdW4gYSBzaW11bGF0aW9uIGZpcnN0LiJ9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBQcmVjb24gRGVja3MKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKClBSRUNPTl9ESVIgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAicHJlY29uLWRlY2tzIgpQUkVDT05fSU5ERVg6IGxpc3RbZGljdF0gPSBbXQoKCmRlZiBsb2FkX3ByZWNvbl9pbmRleCgpOgogICAgZ2xvYmFsIFBSRUNPTl9JTkRFWAogICAgaWR4X3BhdGggPSBQUkVDT05fRElSIC8gInByZWNvbi1pbmRleC5qc29uIgogICAgaWYgaWR4X3BhdGguZXhpc3RzKCk6CiAgICAgICAgd2l0aCBvcGVuKGlkeF9wYXRoLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgIFBSRUNPTl9JTkRFWCA9IGpzb24ubG9hZChmKQogICAgICAgIHByaW50KGYiICBQcmVjb25zOiAgICAgIHtsZW4oUFJFQ09OX0lOREVYKX0gcHJlY29uIGRlY2tzIGxvYWRlZCIpCiAgICBlbHNlOgogICAgICAgIFBSRUNPTl9JTkRFWCA9IFtdCiAgICAgICAgcHJpbnQoZiIgIFByZWNvbnM6ICAgICAgaW5kZXggbm90IGZvdW5kIGF0IHtpZHhfcGF0aH0iKQoKCkBhcHAuZ2V0KCIvYXBpL2xhYi9wcmVjb25zIikKYXN5bmMgZGVmIGxpc3RfcHJlY29ucygpOgogICAgIiIiTGlzdCBhbGwgYXZhaWxhYmxlIHByZWNvbiBkZWNrcy4iIiIKICAgIHJldHVybiB7InByZWNvbnMiOiBQUkVDT05fSU5ERVh9CgoKQGFwcC5wb3N0KCIvYXBpL2xhYi9wcmVjb25zL2luc3RhbGwiKQphc3luYyBkZWYgaW5zdGFsbF9wcmVjb24ocmVxOiBkaWN0KToKICAgICIiIkluc3RhbGwgYSBwcmVjb24gZGVjayB0byB0aGUgRm9yZ2UgZGVja3MgZGlyZWN0b3J5LgogICAgQm9keTogeyJmaWxlTmFtZSI6ICJFbHZlbl9FbXBpcmUuZGNrIn0KICAgICIiIgogICAgZmlsZV9uYW1lID0gcmVxLmdldCgiZmlsZU5hbWUiLCAiIikKICAgIGlmIG5vdCBmaWxlX25hbWU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJmaWxlTmFtZSBpcyByZXF1aXJlZCIpCgogICAgc3JjID0gUFJFQ09OX0RJUiAvIGZpbGVfbmFtZQogICAgaWYgbm90IHNyYy5leGlzdHMoKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJQcmVjb24gbm90IGZvdW5kOiB7ZmlsZV9uYW1lfSIpCgogICAgZGVja3NfZGlyID0gQ0ZHLmZvcmdlX2RlY2tzX2RpcgogICAgaWYgbm90IGRlY2tzX2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihkZWNrc19kaXIpOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmIkZvcmdlIGRlY2tzIGRpcmVjdG9yeSBub3QgZm91bmQ6IHtkZWNrc19kaXJ9IikKCiAgICBpbXBvcnQgc2h1dGlsCiAgICBkc3QgPSBQYXRoKGRlY2tzX2RpcikgLyBmaWxlX25hbWUKICAgIHNodXRpbC5jb3B5MihzdHIoc3JjKSwgc3RyKGRzdCkpCgogICAgZGVja19uYW1lID0gZmlsZV9uYW1lLnJlcGxhY2UoIi5kY2siLCAiIikKICAgIHJldHVybiB7CiAgICAgICAgImluc3RhbGxlZCI6IFRydWUsCiAgICAgICAgImRlY2tOYW1lIjogZGVja19uYW1lLAogICAgICAgICJkZXN0aW5hdGlvbiI6IHN0cihkc3QpLAogICAgICAgICJtZXNzYWdlIjogZiJJbnN0YWxsZWQge2RlY2tfbmFtZX0gdG8gRm9yZ2Ug' +
'ZGVja3MiLAogICAgfQoKCkBhcHAucG9zdCgiL2FwaS9sYWIvcHJlY29ucy9pbnN0YWxsLWJhdGNoIikKYXN5bmMgZGVmIGluc3RhbGxfcHJlY29uc19iYXRjaChyZXE6IGRpY3QpOgogICAgIiIiSW5zdGFsbCBtdWx0aXBsZSBwcmVjb24gZGVja3MgYXQgb25jZS4KICAgIEJvZHk6IHsiZmlsZU5hbWVzIjogWyJFbHZlbl9FbXBpcmUuZGNrIiwgIk5lY3Jvbl9EeW5hc3RpZXMuZGNrIl19CiAgICAiIiIKICAgIGZpbGVfbmFtZXMgPSByZXEuZ2V0KCJmaWxlTmFtZXMiLCBbXSkKICAgIGlmIG5vdCBmaWxlX25hbWVzOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiZmlsZU5hbWVzIGxpc3QgaXMgcmVxdWlyZWQiKQoKICAgIGRlY2tzX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBkZWNrc19kaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoZGVja3NfZGlyKToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGb3JnZSBkZWNrcyBkaXJlY3Rvcnkgbm90IGZvdW5kOiB7ZGVja3NfZGlyfSIpCgogICAgaW1wb3J0IHNodXRpbAogICAgcmVzdWx0cyA9IFtdCiAgICBmb3IgZmlsZV9uYW1lIGluIGZpbGVfbmFtZXM6CiAgICAgICAgc3JjID0gUFJFQ09OX0RJUiAvIGZpbGVfbmFtZQogICAgICAgIGlmIG5vdCBzcmMuZXhpc3RzKCk6CiAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHsiZmlsZU5hbWUiOiBmaWxlX25hbWUsICJpbnN0YWxsZWQiOiBGYWxzZSwgImVycm9yIjogIm5vdCBmb3VuZCJ9KQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGRzdCA9IFBhdGgoZGVja3NfZGlyKSAvIGZpbGVfbmFtZQogICAgICAgIHNodXRpbC5jb3B5MihzdHIoc3JjKSwgc3RyKGRzdCkpCiAgICAgICAgZGVja19uYW1lID0gZmlsZV9uYW1lLnJlcGxhY2UoIi5kY2siLCAiIikKICAgICAgICByZXN1bHRzLmFwcGVuZCh7ImZpbGVOYW1lIjogZmlsZV9uYW1lLCAiaW5zdGFsbGVkIjogVHJ1ZSwgImRlY2tOYW1lIjogZGVja19uYW1lfSkKCiAgICByZXR1cm4geyJyZXN1bHRzIjogcmVzdWx0c30KCgojIOKUgOKUgCBQcmVjb24gQXV0by1Eb3dubG9hZCBmcm9tIEdpdEh1YiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkdJVEhVQl9QUkVDT05fVVJMID0gKAogICAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS90YXcvbWFnaWMtcHJlY29uc3RydWN0ZWQtZGVja3MtZGF0YS8iCiAgICAibWFzdGVyL2RlY2tzX3YyLmpzb24iCikKUFJFQ09OX0NBQ0hFX0hPVVJTID0gMTY4ICAjIHJlLWRvd25sb2FkIHdlZWtseQoKCmRlZiBfY29sb3JfaWRlbnRpdHlfZnJvbV9jYXJkcyhkZWNrX2RhdGE6IGRpY3QpIC0+IGxpc3Rbc3RyXToKICAgICIiIkV4dHJhY3QgYXBwcm94aW1hdGUgY29sb3IgaWRlbnRpdHkgZnJvbSBjb21tYW5kZXIgc2VjdGlvbi4iIiIKICAgICMgVGhlIGRhdGEgZG9lc24ndCBpbmNsdWRlIGNvbG9yIGluZm8gZGlyZWN0bHksIHNvIHdlIHRyYWNrIHdoYXQgd2UgY2FuCiAgICAjIGZyb20gY29tbWFuZGVyIG5hbWVzIOKAlCBidXQgd2UganVzdCBsZWF2ZSBpdCBhcyBhIHNlYXJjaGFibGUgZmllbGQuCiAgICByZXR1cm4gW10KCgpkZWYgX3Nhbml0aXplX2ZpbGVuYW1lKG5hbWU6IHN0cikgLT4gc3RyOgogICAgIiIiVHVybiBhIGRlY2sgbmFtZSBpbnRvIGEgc2FmZSBmaWxlbmFtZS4iIiIKICAgIHNhZmUgPSByZS5zdWIocidbPD46Ii9cXHw/Kl0nLCAnJywgbmFtZSkKICAgIHNhZmUgPSBzYWZlLnJlcGxhY2UoJyAnLCAnXycpLnJlcGxhY2UoIiciLCAnJykucmVwbGFjZSgnIScsICcnKQogICAgc2FmZSA9IHJlLnN1YihyJ18rJywgJ18nLCBzYWZlKS5zdHJpcCgnXycpCiAgICByZXR1cm4gc2FmZQoKCmRlZiBfZGVja190b19kY2soZGVja19kYXRhOiBkaWN0KSAtPiBzdHI6CiAgICAiIiJDb252ZXJ0IGEgZGVjayBlbnRyeSBmcm9tIGRlY2tzX3YyLmpzb24gaW50byAuZGNrIGZvcm1hdC4iIiIKICAgIGxpbmVzID0gW10KICAgIGxpbmVzLmFwcGVuZCgiW21ldGFkYXRhXSIpCiAgICBsaW5lcy5hcHBlbmQoZiJOYW1lPXtkZWNrX2RhdGFbJ25hbWUnXX0iKQoKICAgICMgQ29tbWFuZGVyIHNlY3Rpb24KICAgIGNvbW1hbmRlcnMgPSBkZWNrX2RhdGEuZ2V0KCdjb21tYW5kZXInLCBbXSkKICAgIGlmIGNvbW1hbmRlcnM6CiAgICAgICAgbGluZXMuYXBwZW5kKCJbQ29tbWFuZGVyXSIpCiAgICAgICAgZm9yIGNhcmQgaW4g' +
'Y29tbWFuZGVyczoKICAgICAgICAgICAgY291bnQgPSBjYXJkLmdldCgnY291bnQnLCAxKQogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7Y291bnR9IHtjYXJkWyduYW1lJ119IikKCiAgICAjIE1haW4gZGVjawogICAgY2FyZHMgPSBkZWNrX2RhdGEuZ2V0KCdjYXJkcycsIFtdKQogICAgaWYgY2FyZHM6CiAgICAgICAgbGluZXMuYXBwZW5kKCJbTWFpbl0iKQogICAgICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgICAgICBjb3VudCA9IGNhcmQuZ2V0KCdjb3VudCcsIDEpCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntjb3VudH0ge2NhcmRbJ25hbWUnXX0iKQoKICAgICMgU2lkZWJvYXJkIChyYXJlIGluIENvbW1hbmRlciBidXQgaW5jbHVkZSBpZiBwcmVzZW50KQogICAgc2lkZWJvYXJkID0gZGVja19kYXRhLmdldCgnc2lkZWJvYXJkJywgW10pCiAgICBpZiBzaWRlYm9hcmQ6CiAgICAgICAgbGluZXMuYXBwZW5kKCJbU2lkZWJvYXJkXSIpCiAgICAgICAgZm9yIGNhcmQgaW4gc2lkZWJvYXJkOgogICAgICAgICAgICBjb3VudCA9IGNhcmQuZ2V0KCdjb3VudCcsIDEpCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntjb3VudH0ge2NhcmRbJ25hbWUnXX0iKQoKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpICsgIlxuIgoKCmRlZiBkb3dubG9hZF9wcmVjb25fZGF0YWJhc2UoZm9yY2U6IGJvb2wgPSBGYWxzZSkgLT4gZGljdDoKICAgICIiIgogICAgRG93bmxvYWQgYWxsIENvbW1hbmRlciBwcmVjb24gZGVja3MgZnJvbSBHaXRIdWIsIGNvbnZlcnQgdG8gLmRjaywKICAgIGFuZCByZWJ1aWxkIHByZWNvbi1pbmRleC5qc29uLiAgU2tpcHMgaWYgaW5kZXggaXMgZnJlc2ggKDwgUFJFQ09OX0NBQ0hFX0hPVVJTIG9sZCkKICAgIHVubGVzcyBmb3JjZT1UcnVlLgoKICAgIFJldHVybnMgeyJkb3dubG9hZGVkIjogaW50LCAic2tpcHBlZCI6IGJvb2wsICJlcnJvciI6IHN0cnxOb25lfQogICAgIiIiCiAgICBnbG9iYWwgUFJFQ09OX0lOREVYCiAgICBpZHhfcGF0aCA9IFBSRUNPTl9ESVIgLyAicHJlY29uLWluZGV4Lmpzb24iCgogICAgIyDilIDilIAgQ2FjaGUgY2hlY2sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiBub3QgZm9yY2UgYW5kIGlkeF9wYXRoLmV4aXN0cygpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKGlkeF9wYXRoLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgICAgICBleGlzdGluZyA9IGpzb24ubG9hZChmKQogICAgICAgICAgICAjIElmIHdlIGhhdmUgYSBzdWJzdGFudGlhbCBudW1iZXIgb2YgZGVja3MgYW5kIGZpbGUgaXMgcmVjZW50LCBza2lwCiAgICAgICAgICAgIGlmIGxlbihleGlzdGluZykgPiA1MDoKICAgICAgICAgICAgICAgIGFnZV9ob3VycyA9ICh0aW1lLnRpbWUoKSAtIGlkeF9wYXRoLnN0YXQoKS5zdF9tdGltZSkgLyAzNjAwCiAgICAgICAgICAgICAgICBpZiBhZ2VfaG91cnMgPCBQUkVDT05fQ0FDSEVfSE9VUlM6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiIgIFByZWNvbnM6ICAgICAge2xlbihleGlzdGluZyl9IGRlY2tzIGNhY2hlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgZiIoe2FnZV9ob3VyczouMGZ9aCBvbGQsIHJlZnJlc2ggYWZ0ZXIge1BSRUNPTl9DQUNIRV9IT1VSU31oKSIpCiAgICAgICAgICAgICAgICAgICAgUFJFQ09OX0lOREVYID0gZXhpc3RpbmcKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyJkb3dubG9hZGVkIjogMCwgInNraXBwZWQiOiBUcnVlLCAidG90YWwiOiBsZW4oZXhpc3RpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIjogTm9uZX0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzICAjIEZhbGwgdGhyb3VnaCB0byBkb3dubG9hZAoKICAgICMg4pSA4pSAIERvd25sb2FkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHJpbnQoIiAgUHJlY29uczogICAgICBEb3dubG9hZGluZyBmdWxsIHByZWNvbiBkYXRhYmFzZSBmcm9tIEdpdEh1Yi4uLiIpCiAgICB0cnk6CiAg' +
'ICAgICAgcmVxID0gUmVxdWVzdChHSVRIVUJfUFJFQ09OX1VSTCwgaGVhZGVycz17IlVzZXItQWdlbnQiOiAiQ29tbWFuZGVyQUlMYWIvMy4wIn0pCiAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMjApIGFzIHJlc3A6CiAgICAgICAgICAgIHJhdyA9IHJlc3AucmVhZCgpCiAgICAgICAgYWxsX2RlY2tzID0ganNvbi5sb2FkcyhyYXcpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbXNnID0gZiJGYWlsZWQgdG8gZG93bmxvYWQgcHJlY29uIGRhdGFiYXNlOiB7ZX0iCiAgICAgICAgcHJpbnQoZiIgIFByZWNvbnM6ICAgICAgRVJST1Ig4oCUIHttc2d9IikKICAgICAgICAjIEZhbGwgYmFjayB0byB3aGF0ZXZlciB3ZSBoYXZlIGxvY2FsbHkKICAgICAgICBpZiBpZHhfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgbG9hZF9wcmVjb25faW5kZXgoKQogICAgICAgIHJldHVybiB7ImRvd25sb2FkZWQiOiAwLCAic2tpcHBlZCI6IEZhbHNlLCAiZXJyb3IiOiBtc2d9CgogICAgIyDilIDilIAgRmlsdGVyIHRvIENvbW1hbmRlciBwcmVjb24gZGVja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBjb21tYW5kZXJfZGVja3MgPSBbCiAgICAgICAgZCBmb3IgZCBpbiBhbGxfZGVja3MKICAgICAgICBpZiBkLmdldCgndHlwZScpID09ICdDb21tYW5kZXIgRGVjaycKICAgICAgICBhbmQgKGQuZ2V0KCdmb3JtYXQnKSBvciAnJykubG93ZXIoKSA9PSAnY29tbWFuZGVyJwogICAgXQogICAgcHJpbnQoZiIgIFByZWNvbnM6ICAgICAgRm91bmQge2xlbihjb21tYW5kZXJfZGVja3MpfSBDb21tYW5kZXIgcHJlY29uIGRlY2tzIikKCiAgICAjIOKUgOKUgCBFbnN1cmUgcHJlY29uLWRlY2tzIGRpciBleGlzdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBQUkVDT05fRElSLm1rZGlyKHBhcmVudHM9VHJ1ZSwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICAjIOKUgOKUgCBEZXRlY3QgZHVwbGljYXRlIG5hbWVzIGFuZCBhcHBlbmQgc2V0IGNvZGUgZm9yIHVuaXF1ZW5lc3Mg4pSACiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyCiAgICBuYW1lX2NvdW50cyA9IENvdW50ZXIoX3Nhbml0aXplX2ZpbGVuYW1lKGRbJ25hbWUnXSkgZm9yIGQgaW4gY29tbWFuZGVyX2RlY2tzKQogICAgZHVwX25hbWVzID0ge24gZm9yIG4sIGMgaW4gbmFtZV9jb3VudHMuaXRlbXMoKSBpZiBjID4gMX0KCiAgICAjIOKUgOKUgCBDb252ZXJ0IGFuZCB3cml0ZSAuZGNrIGZpbGVzICsgYnVpbGQgaW5kZXgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpbmRleCA9IFtdCiAgICB3cml0dGVuID0gMAogICAgZm9yIGRlY2sgaW4gc29ydGVkKGNvbW1hbmRlcl9kZWNrcywga2V5PWxhbWJkYSBkOiAoZC5nZXQoJ3JlbGVhc2VfZGF0ZScsICcnKSwgZC5nZXQoJ25hbWUnLCAnJykpKToKICAgICAgICBzYWZlX25hbWUgPSBfc2FuaXRpemVfZmlsZW5hbWUoZGVja1snbmFtZSddKQogICAgICAgICMgQXBwZW5kIHNldCBjb2RlIGZvciBkdXBsaWNhdGUgbmFtZXMgKGUuZy4gQW50aG9sb2d5IHJlcHJpbnRzKQogICAgICAgIGlmIHNhZmVfbmFtZSBpbiBkdXBfbmFtZXM6CiAgICAgICAgICAgIHNjID0gKGRlY2suZ2V0KCdzZXRfY29kZScpIG9yICd1bmsnKS51cHBlcigpCiAgICAgICAgICAgIHNhZmVfbmFtZSA9IGYie3NhZmVfbmFtZX1fe3NjfSIKICAgICAgICBmaWxlX25hbWUgPSBmIntzYWZlX25hbWV9LmRjayIKICAgICAgICBkY2tfcGF0aCA9IFBSRUNPTl9ESVIgLyBmaWxlX25hbWUKCiAgICAgICAgIyBFeHRyYWN0IGNvbW1hbmRlciBuYW1lcwogICAgICAgIGNvbW1hbmRlcnMgPSBkZWNrLmdldCgnY29tbWFuZGVyJywgW10pCiAgICAgICAgY21kcl9uYW1lcyA9IFtjWyduYW1lJ10gZm9yIGMgaW4gY29tbWFuZGVyc10gaWYgY29tbWFuZGVycyBlbHNlIFtdCgogICAgICAgICMgQ2FyZCBjb3VudAogICAgICAgIHRvdGFsX2NhcmRzID0gc3VtKGMuZ2V0KCdjb3VudCcsIDEpIGZvciBjIGluIGRlY2suZ2V0KCdjYXJkcycsIFtdKSkKICAgICAgICB0b3RhbF9jYXJkcyArPSBzdW0oYy5nZXQoJ2NvdW50JywgMSkgZm9yIGMgaW4gY29tbWFuZGVycykKCiAgICAgICAgIyBXcml0ZSAuZGNrIGZpbGUKICAgICAgICBkY2tfY29udGVudCA9IF9kZWNrX3RvX2RjayhkZWNrKQogICAgICAgIHdp' +
'dGggb3BlbihkY2tfcGF0aCwgInciLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKGRja19jb250ZW50KQogICAgICAgIHdyaXR0ZW4gKz0gMQoKICAgICAgICAjIEJ1aWxkIGluZGV4IGVudHJ5CiAgICAgICAgcmVsZWFzZSA9IGRlY2suZ2V0KCdyZWxlYXNlX2RhdGUnLCAnJykKICAgICAgICB5ZWFyID0gaW50KHJlbGVhc2VbOjRdKSBpZiByZWxlYXNlIGFuZCBsZW4ocmVsZWFzZSkgPj0gNCBlbHNlIDAKICAgICAgICBpbmRleC5hcHBlbmQoewogICAgICAgICAgICAibmFtZSI6IGRlY2tbJ25hbWUnXSwKICAgICAgICAgICAgImNvbW1hbmRlciI6IGNtZHJfbmFtZXNbMF0gaWYgY21kcl9uYW1lcyBlbHNlICJVbmtub3duIiwKICAgICAgICAgICAgImNvbW1hbmRlcnMiOiBjbWRyX25hbWVzLAogICAgICAgICAgICAiY29sb3JzIjogW10sICAjIENvbG9yIGRhdGEgbm90IGluIHNvdXJjZTsgVUkgY2FuIGluZmVyIGZyb20gY2FyZHMKICAgICAgICAgICAgInNldCI6IGRlY2suZ2V0KCdzZXRfbmFtZScsICcnKSwKICAgICAgICAgICAgInNldENvZGUiOiBkZWNrLmdldCgnc2V0X2NvZGUnLCAnJyksCiAgICAgICAgICAgICJ5ZWFyIjogeWVhciwKICAgICAgICAgICAgInJlbGVhc2VEYXRlIjogcmVsZWFzZSwKICAgICAgICAgICAgInRoZW1lIjogIiIsCiAgICAgICAgICAgICJmaWxlTmFtZSI6IGZpbGVfbmFtZSwKICAgICAgICAgICAgImNhcmRDb3VudCI6IHRvdGFsX2NhcmRzLAogICAgICAgIH0pCgogICAgIyDilIDilIAgV3JpdGUgaW5kZXgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICB3aXRoIG9wZW4oaWR4X3BhdGgsICJ3IiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICBqc29uLmR1bXAoaW5kZXgsIGYsIGluZGVudD0yLCBlbnN1cmVfYXNjaWk9RmFsc2UpCgogICAgUFJFQ09OX0lOREVYID0gaW5kZXgKICAgIHByaW50KGYiICBQcmVjb25zOiAgICAgIHt3cml0dGVufSAuZGNrIGZpbGVzIHdyaXR0ZW4sIGluZGV4IHNhdmVkIikKICAgIHJldHVybiB7ImRvd25sb2FkZWQiOiB3cml0dGVuLCAic2tpcHBlZCI6IEZhbHNlLCAidG90YWwiOiB3cml0dGVuLCAiZXJyb3IiOiBOb25lfQoKCkBhcHAucG9zdCgiL2FwaS9sYWIvcHJlY29ucy9yZWZyZXNoIikKYXN5bmMgZGVmIHJlZnJlc2hfcHJlY29ucygpOgogICAgIiIiRm9yY2UgcmUtZG93bmxvYWQgb2YgYWxsIENvbW1hbmRlciBwcmVjb24gZGVja3MgZnJvbSBHaXRIdWIuIiIiCiAgICByZXN1bHQgPSBkb3dubG9hZF9wcmVjb25fZGF0YWJhc2UoZm9yY2U9VHJ1ZSkKICAgIGlmIHJlc3VsdC5nZXQoImVycm9yIik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDIsIHJlc3VsdFsiZXJyb3IiXSkKICAgIHJldHVybiB7CiAgICAgICAgIm1lc3NhZ2UiOiBmIkRvd25sb2FkZWQge3Jlc3VsdFsnZG93bmxvYWRlZCddfSBDb21tYW5kZXIgcHJlY29uIGRlY2tzIiwKICAgICAgICAidG90YWwiOiByZXN1bHQuZ2V0KCJ0b3RhbCIsIDApLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVjayBJbXBvcnQgSGVscGVycyAoUHl0aG9uLXNpZGUpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpfQVBJX0hFQURFUlMgPSB7IlVzZXItQWdlbnQiOiAiQ29tbWFuZGVyQUlMYWIvMy4wIiwgIkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0KCgpkZWYgX2h0dHBfZ2V0KHVybDogc3RyKSAtPiBzdHI6CiAgICByZXEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz1fQVBJX0hFQURFUlMpCiAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTMwKSBhcyByZXNwOgogICAgICAgIHJldHVybiBy' +
'ZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikKCgpkZWYgX2ltcG9ydF9mcm9tX3VybCh1cmw6IHN0cikgLT4gZGljdDoKICAgICIiIkltcG9ydCBkZWNrIGZyb20gVVJMIChBcmNoaWRla3Qgb3IgRURIUkVDKS4iIiIKICAgIHVybCA9IHVybC5zdHJpcCgpCgogICAgIyBBcmNoaWRla3QKICAgIGlmICJhcmNoaWRla3QuY29tL2RlY2tzLyIgaW4gdXJsOgogICAgICAgIG0gPSByZS5zZWFyY2gociIvZGVja3MvKFxkKykiLCB1cmwpCiAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNvdWxkIG5vdCBwYXJzZSBBcmNoaWRla3QgZGVjayBJRCBmcm9tIFVSTCIpCiAgICAgICAgcmV0dXJuIF9mZXRjaF9hcmNoaWRla3RfZGVjayhtLmdyb3VwKDEpKQoKICAgICMgRURIUkVDIGF2ZXJhZ2UgZGVjawogICAgaWYgImVkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy8iIGluIHVybDoKICAgICAgICBzbHVnID0gcmUuc2VhcmNoKHIiL2F2ZXJhZ2UtZGVja3MvKFteLz8jXSspIiwgdXJsKS5ncm91cCgxKQogICAgICAgIGNvbW1hbmRlcl9uYW1lID0gc2x1Zy5yZXBsYWNlKCItIiwgIiAiKQogICAgICAgIHJldHVybiBfZmV0Y2hfZWRocmVjX2F2ZXJhZ2UoY29tbWFuZGVyX25hbWUpCgogICAgIyBFREhSRUMgY29tbWFuZGVyIHBhZ2UKICAgIGlmICJlZGhyZWMuY29tL2NvbW1hbmRlcnMvIiBpbiB1cmw6CiAgICAgICAgc2x1ZyA9IHJlLnNlYXJjaChyIi9jb21tYW5kZXJzLyhbXi8/I10rKSIsIHVybCkuZ3JvdXAoMSkKICAgICAgICBjb21tYW5kZXJfbmFtZSA9IHNsdWcucmVwbGFjZSgiLSIsICIgIikKICAgICAgICByZXR1cm4gX2ZldGNoX2VkaHJlY19hdmVyYWdlKGNvbW1hbmRlcl9uYW1lKQoKICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJVbnN1cHBvcnRlZCBVUkw6IHt1cmx9LiBTdXBwb3J0ZWQ6IGFyY2hpZGVrdC5jb20vZGVja3MvLi4uLCBlZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvLi4uLCBlZGhyZWMuY29tL2NvbW1hbmRlcnMvLi4uIikKCgpkZWYgX2ZldGNoX2FyY2hpZGVrdF9kZWNrKGRlY2tfaWQ6IHN0cikgLT4gZGljdDoKICAgICIiIkZldGNoIGRlY2sgZnJvbSBBcmNoaWRla3QgQVBJLiIiIgogICAgdXJsID0gZiJodHRwczovL2FyY2hpZGVrdC5jb20vYXBpL2RlY2tzL3tkZWNrX2lkfS8iCiAgICBkYXRhID0ganNvbi5sb2FkcyhfaHR0cF9nZXQodXJsKSkKCiAgICBwcm9maWxlID0gewogICAgICAgICJuYW1lIjogZGF0YS5nZXQoIm5hbWUiLCBmIkFyY2hpZGVrdCB7ZGVja19pZH0iKSwKICAgICAgICAiY29tbWFuZGVyIjogTm9uZSwKICAgICAgICAic291cmNlIjogIkFyY2hpZGVrdCIsCiAgICAgICAgInNvdXJjZVVybCI6IGYiaHR0cHM6Ly9hcmNoaWRla3QuY29tL2RlY2tzL3tkZWNrX2lkfSIsCiAgICAgICAgImNvbW1hbmRlcnMiOiB7fSwKICAgICAgICAibWFpbmJvYXJkIjoge30sCiAgICAgICAgImNvbG9ySWRlbnRpdHkiOiBbXSwKICAgICAgICAidG90YWxDYXJkcyI6IDAsCiAgICB9CgogICAgZm9yIGNhcmRfZW50cnkgaW4gZGF0YS5nZXQoImNhcmRzIiwgW10pOgogICAgICAgIHF0eSA9IGNhcmRfZW50cnkuZ2V0KCJxdWFudGl0eSIsIDEpCiAgICAgICAgY2FyZCA9IGNhcmRfZW50cnkuZ2V0KCJjYXJkIiwge30pCiAgICAgICAgb3JhY2xlID0gY2FyZC5nZXQoIm9yYWNsZUNhcmQiLCB7fSkKICAgICAgICBjYXJkX25hbWUgPSBvcmFjbGUuZ2V0KCJuYW1lIiwgIlVua25vd24iKQoKICAgICAgICBjYXRlZ29yaWVzID0gW2MgZm9yIGMgaW4gY2FyZF9lbnRyeS5nZXQoImNhdGVnb3JpZXMiLCBbXSldCiAgICAgICAgaXNfY29tbWFuZGVyID0gYW55KGMubG93ZXIoKSA9PSAiY29tbWFuZGVyIiBmb3IgYyBpbiBjYXRlZ29yaWVzKQoKICAgICAgICBpZiBpc19jb21tYW5kZXI6CiAgICAgICAgICAgIHByb2ZpbGVbImNvbW1hbmRlcnMiXVtjYXJkX25hbWVdID0gcXR5CiAgICAgICAgICAgIGlmIG5vdCBwcm9maWxlWyJjb21tYW5kZXIiXToKICAgICAgICAgICAgICAgIHByb2ZpbGVbImNvbW1hbmRlciJdID0gY2FyZF9uYW1lCiAgICAgICAgICAgICAgICBpZiBvcmFjbGUuZ2V0KCJjb2xvcklkZW50aXR5Iik6CiAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVsiY29sb3JJZGVudGl0eSJdID0gb3JhY2xlWyJjb2xvcklkZW50aXR5Il0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwcm9maWxlWyJtYWluYm9hcmQiXVtjYXJkX25hbWVdID0gcXR5CgogICAgcHJvZmlsZVsidG90YWxDYXJkcyJdID0gc3VtKHByb2Zp' +
'bGVbImNvbW1hbmRlcnMiXS52YWx1ZXMoKSkgKyBzdW0ocHJvZmlsZVsibWFpbmJvYXJkIl0udmFsdWVzKCkpCiAgICBpZiBub3QgcHJvZmlsZVsibmFtZSJdIG9yIHByb2ZpbGVbIm5hbWUiXSA9PSBmIkFyY2hpZGVrdCB7ZGVja19pZH0iOgogICAgICAgIHByb2ZpbGVbIm5hbWUiXSA9IGYie3Byb2ZpbGVbJ2NvbW1hbmRlciddfSDigJQgQXJjaGlkZWt0IgoKICAgIHJldHVybiBwcm9maWxlCgoKZGVmIF9mZXRjaF9lZGhyZWNfYXZlcmFnZShjb21tYW5kZXJfbmFtZTogc3RyKSAtPiBkaWN0OgogICAgIiIiRmV0Y2ggRURIUkVDIGF2ZXJhZ2UgZGVjayBmb3IgYSBjb21tYW5kZXIuIiIiCiAgICBzbHVnID0gX3RvX2VkaHJlY19zbHVnKGNvbW1hbmRlcl9uYW1lKQogICAgdXJsID0gZiJodHRwczovL2pzb24uZWRocmVjLmNvbS9wYWdlcy9hdmVyYWdlLWRlY2tzL3tzbHVnfS5qc29uIgogICAgZGF0YSA9IGpzb24ubG9hZHMoX2h0dHBfZ2V0KHVybCkpCgogICAgY29udGFpbmVyID0gZGF0YS5nZXQoImNvbnRhaW5lciIsIHt9KQogICAganNvbl9kaWN0ID0gY29udGFpbmVyLmdldCgianNvbl9kaWN0Iiwge30pCiAgICBjYXJkX2luZm8gPSBqc29uX2RpY3QuZ2V0KCJjYXJkIiwge30pCiAgICByZWFsX25hbWUgPSBjYXJkX2luZm8uZ2V0KCJuYW1lIiwgY29tbWFuZGVyX25hbWUudGl0bGUoKSkKCiAgICBwcm9maWxlID0gewogICAgICAgICJuYW1lIjogZiJ7cmVhbF9uYW1lfSDigJQgRURIUkVDIEF2ZXJhZ2UiLAogICAgICAgICJjb21tYW5kZXIiOiByZWFsX25hbWUsCiAgICAgICAgInNvdXJjZSI6ICJFREhSRUMgQXZlcmFnZSIsCiAgICAgICAgInNvdXJjZVVybCI6IGYiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3Mve3NsdWd9IiwKICAgICAgICAiY29tbWFuZGVycyI6IHtyZWFsX25hbWU6IDF9LAogICAgICAgICJtYWluYm9hcmQiOiB7fSwKICAgICAgICAiY29sb3JJZGVudGl0eSI6IGNhcmRfaW5mby5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pLAogICAgICAgICJzYW1wbGVTaXplIjogZGF0YS5nZXQoIm51bV9kZWNrc19hdmciKSwKICAgICAgICAidG90YWxDYXJkcyI6IDAsCiAgICB9CgogICAgIyBQYXJzZSBjYXJkIGxpc3RzCiAgICBmb3IgY2wgaW4ganNvbl9kaWN0LmdldCgiY2FyZGxpc3RzIiwgW10pOgogICAgICAgIGZvciBjdiBpbiBjbC5nZXQoImNhcmR2aWV3cyIsIFtdKToKICAgICAgICAgICAgY2FyZF9uYW1lID0gY3YuZ2V0KCJuYW1lIiwgIiIpCiAgICAgICAgICAgIGlmIGNhcmRfbmFtZToKICAgICAgICAgICAgICAgIHByb2ZpbGVbIm1haW5ib2FyZCJdW2NhcmRfbmFtZV0gPSAxCgogICAgIyBGaXggYmFzaWMgbGFuZCBxdWFudGl0aWVzIGZyb20gYXJjaGlkZWt0IGV4cG9ydCBkYXRhCiAgICBhcmNoaWRla3RfZGF0YSA9IGRhdGEuZ2V0KCJhcmNoaWRla3QiLCBbXSkKICAgIGlmIGFyY2hpZGVrdF9kYXRhOgogICAgICAgIGJhc2ljX25hbWVzID0gW10KICAgICAgICBmb3IgY2wgaW4ganNvbl9kaWN0LmdldCgiY2FyZGxpc3RzIiwgW10pOgogICAgICAgICAgICBpZiBjbC5nZXQoInRhZyIpID09ICJiYXNpY3MiOgogICAgICAgICAgICAgICAgZm9yIGN2IGluIGNsLmdldCgiY2FyZHZpZXdzIiwgW10pOgogICAgICAgICAgICAgICAgICAgIGJhc2ljX25hbWVzLmFwcGVuZChjdi5nZXQoIm5hbWUiLCAiIikpCgogICAgICAgICMgRmluZCBoaWdoLXF1YW50aXR5IGVudHJpZXMgKGJhc2ljcykKICAgICAgICBiYXNpY19xdWFudGl0aWVzID0gW10KICAgICAgICBmb3IgZW50cnkgaW4gYXJjaGlkZWt0X2RhdGE6CiAgICAgICAgICAgIGlmIGVudHJ5LmdldCgicSIsIDEpID4gMToKICAgICAgICAgICAgICAgIGJhc2ljX3F1YW50aXRpZXMuYXBwZW5kKGVudHJ5WyJxIl0pCgogICAgICAgIGZvciBpLCBuYW1lIGluIGVudW1lcmF0ZShiYXNpY19uYW1lcyk6CiAgICAgICAgICAgIGlmIGkgPCBsZW4oYmFzaWNfcXVhbnRpdGllcyk6CiAgICAgICAgICAgICAgICBwcm9maWxlWyJtYWluYm9hcmQiXVtuYW1lXSA9IGJhc2ljX3F1YW50aXRpZXNbaV0KCiAgICBwcm9maWxlWyJ0b3RhbENhcmRzIl0gPSBzdW0ocHJvZmlsZVsiY29tbWFuZGVycyJdLnZhbHVlcygpKSArIHN1bShwcm9maWxlWyJtYWluYm9hcmQiXS52YWx1ZXMoKSkKICAgIHJldHVybiBwcm9maWxlCgoKZGVmIF9wYXJzZV90ZXh0X2RlY2tsaXN0KHRleHQ6IHN0ciwgY29tbWFuZGVyX292ZXJyaWRlOiBzdHIgPSBOb25lKSAtPiBkaWN0OgogICAgIiIiUGFyc2UgYSBw' +
'bGFpbiB0ZXh0IGNhcmQgbGlzdCBpbnRvIGEgcHJvZmlsZS4iIiIKICAgIHByb2ZpbGUgPSB7CiAgICAgICAgIm5hbWUiOiAiVGV4dCBJbXBvcnQiLAogICAgICAgICJjb21tYW5kZXIiOiBOb25lLAogICAgICAgICJzb3VyY2UiOiAiVGV4dCBJbXBvcnQiLAogICAgICAgICJzb3VyY2VVcmwiOiBOb25lLAogICAgICAgICJjb21tYW5kZXJzIjoge30sCiAgICAgICAgIm1haW5ib2FyZCI6IHt9LAogICAgICAgICJ0b3RhbENhcmRzIjogMCwKICAgIH0KCiAgICBzZWN0aW9uID0gIm1haW4iCiAgICBmb3IgbGluZSBpbiB0ZXh0LnN0cmlwKCkuc3BsaXQoIlxuIik6CiAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgiLy8iKSBvciBsaW5lLnN0YXJ0c3dpdGgoIiMiKToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoImNvbW1hbmRlciIpIG9yIGxpbmUgPT0gIltDb21tYW5kZXJdIjoKICAgICAgICAgICAgc2VjdGlvbiA9ICJjb21tYW5kZXIiCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgbGluZS5sb3dlcigpLnN0YXJ0c3dpdGgoIm1haW4iKSBvciBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgiZGVjayIpIG9yIGxpbmUgPT0gIltNYWluXSI6CiAgICAgICAgICAgIHNlY3Rpb24gPSAibWFpbiIKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgic2lkZWJvYXJkIikgb3IgbGluZSA9PSAiW1NpZGVib2FyZF0iOgogICAgICAgICAgICBzZWN0aW9uID0gInNpZGVib2FyZCIKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBDbGVhbiBsaW5lCiAgICAgICAgY2xlYW4gPSByZS5zdWIociJcKFx3K1wpXHMqXGQqJCIsICIiLCBsaW5lKS5zdHJpcCgpCiAgICAgICAgY2xlYW4gPSByZS5zdWIociJccypcKi4qJCIsICIiLCBjbGVhbikuc3RyaXAoKQoKICAgICAgICBtID0gcmUubWF0Y2gociJeKFxkKyl4P1xzKyguKykkIiwgY2xlYW4pCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcXR5ID0gaW50KG0uZ3JvdXAoMSkpCiAgICAgICAgICAgIGNhcmRfbmFtZSA9IG0uZ3JvdXAoMikuc3RyaXAoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHF0eSA9IDEKICAgICAgICAgICAgY2FyZF9uYW1lID0gY2xlYW4KCiAgICAgICAgaWYgbm90IGNhcmRfbmFtZToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgc2VjdGlvbiA9PSAiY29tbWFuZGVyIjoKICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVycyJdW2NhcmRfbmFtZV0gPSBxdHkKICAgICAgICAgICAgaWYgbm90IHByb2ZpbGVbImNvbW1hbmRlciJdOgogICAgICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVyIl0gPSBjYXJkX25hbWUKICAgICAgICBlbGlmIHNlY3Rpb24gIT0gInNpZGVib2FyZCI6CiAgICAgICAgICAgIHByb2ZpbGVbIm1haW5ib2FyZCJdW2NhcmRfbmFtZV0gPSBxdHkKCiAgICBpZiBjb21tYW5kZXJfb3ZlcnJpZGU6CiAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVyIl0gPSBjb21tYW5kZXJfb3ZlcnJpZGUKICAgICAgICBpZiBub3QgcHJvZmlsZVsiY29tbWFuZGVycyJdOgogICAgICAgICAgICBpZiBjb21tYW5kZXJfb3ZlcnJpZGUgaW4gcHJvZmlsZVsibWFpbmJvYXJkIl06CiAgICAgICAgICAgICAgICBxdHkgPSBwcm9maWxlWyJtYWluYm9hcmQiXS5wb3AoY29tbWFuZGVyX292ZXJyaWRlKQogICAgICAgICAgICAgICAgcHJvZmlsZVsiY29tbWFuZGVycyJdW2NvbW1hbmRlcl9vdmVycmlkZV0gPSBxdHkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByb2ZpbGVbImNvbW1hbmRlcnMiXVtjb21tYW5kZXJfb3ZlcnJpZGVdID0gMQoKICAgIGlmIHByb2ZpbGVbImNvbW1hbmRlciJdOgogICAgICAgIHByb2ZpbGVbIm5hbWUiXSA9IGYie3Byb2ZpbGVbJ2NvbW1hbmRlciddfSDigJQgVGV4dCBJbXBvcnQiCgogICAgcHJvZmlsZVsidG90YWxDYXJkcyJdID0gc3VtKHByb2ZpbGVbImNvbW1hbmRlcnMiXS52YWx1ZXMoKSkgKyBzdW0ocHJvZmlsZVsibWFpbmJvYXJkIl0udmFsdWVzKCkpCiAgICByZXR1cm4gcHJvZmlsZQoKCmRlZiBfc2F2ZV9wcm9maWxlX3RvX2Rjayhwcm9maWxlOiBkaWN0KSAtPiBQYXRoOgogICAgIiIiQ29udmVydCBhIHByb2ZpbGUgZGljdCB0byAuZGNrIGFuZCBzYXZlIHRvIEZvcmdlIGRlY2tzIGRpci4iIiIKICAgIGxpbmVzID0gWyJbbWV0YWRhdGFd' +
'Il0KICAgIGxpbmVzLmFwcGVuZChmIk5hbWU9e3Byb2ZpbGUuZ2V0KCduYW1lJywgJ0ltcG9ydGVkIERlY2snKX0iKQogICAgbGluZXMuYXBwZW5kKCIiKQogICAgbGluZXMuYXBwZW5kKCJbQ29tbWFuZGVyXSIpCiAgICBmb3IgbmFtZSwgcXR5IGluIHByb2ZpbGUuZ2V0KCJjb21tYW5kZXJzIiwge30pLml0ZW1zKCk6CiAgICAgICAgbGluZXMuYXBwZW5kKGYie3F0eX0ge25hbWV9IikKICAgIGxpbmVzLmFwcGVuZCgiIikKICAgIGxpbmVzLmFwcGVuZCgiW01haW5dIikKICAgIGZvciBuYW1lLCBxdHkgaW4gcHJvZmlsZS5nZXQoIm1haW5ib2FyZCIsIHt9KS5pdGVtcygpOgogICAgICAgIGxpbmVzLmFwcGVuZChmIntxdHl9IHtuYW1lfSIpCgogICAgY29udGVudCA9ICJcbiIuam9pbihsaW5lcykKCiAgICAjIFNhdmUgdG8gRm9yZ2UgZGVja3MgZGlyCiAgICBzYWZlX25hbWUgPSByZS5zdWIociJbXmEtekEtWjAtOSBfLV0iLCAiIiwgcHJvZmlsZS5nZXQoIm5hbWUiLCAiaW1wb3J0ZWQiKSkucmVwbGFjZSgiICIsICJfIikuc3RyaXAoKQogICAgaWYgbm90IHNhZmVfbmFtZToKICAgICAgICBzYWZlX25hbWUgPSAiaW1wb3J0ZWRfZGVjayIKCiAgICBzYXZlX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBzYXZlX2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzYXZlX2Rpcik6CiAgICAgICAgc2F2ZV9kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImltcG9ydGVkLWRlY2tzIikKICAgICAgICBvcy5tYWtlZGlycyhzYXZlX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBvdXRfcGF0aCA9IFBhdGgoc2F2ZV9kaXIpIC8gZiJ7c2FmZV9uYW1lfS5kY2siCiAgICBvdXRfcGF0aC53cml0ZV90ZXh0KGNvbnRlbnQsIGVuY29kaW5nPSJ1dGYtOCIpCiAgICBwcmludChmIiAgW0ltcG9ydF0gU2F2ZWQgLmRjazoge291dF9wYXRofSIpCiAgICByZXR1cm4gb3V0X3BhdGgKCgpkZWYgX3RvX2VkaHJlY19zbHVnKG5hbWU6IHN0cikgLT4gc3RyOgogICAgc2x1ZyA9IG5hbWUubG93ZXIoKQogICAgc2x1ZyA9IHJlLnN1YihyIlsnLC5dIiwgIiIsIHNsdWcpCiAgICBzbHVnID0gcmUuc3ViKHIiW15hLXowLTldKyIsICItIiwgc2x1ZykKICAgIHNsdWcgPSBzbHVnLnN0cmlwKCItIikKICAgIHJldHVybiBzbHVnCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBCYWNrZ3JvdW5kIFRhc2sg4oCUIFJ1biB0aGUgSmF2YSBDTEkgc3VicHJvY2VzcwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKYXN5bmMgZGVmIHJ1bl9iYXRjaF9zdWJwcm9jZXNzKAogICAgc3RhdGU6IEJhdGNoU3RhdGUsCiAgICBkZWNrczogbGlzdFtzdHJdLAogICAgbnVtX2dhbWVzOiBpbnQsCiAgICB0aHJlYWRzOiBpbnQsCiAgICBzZWVkOiBPcHRpb25hbFtpbnRdLAogICAgY2xvY2s6IGludCwKICAgIG91dHB1dF9wYXRoOiBzdHIsCiAgICB1c2VfbGVhcm5lZF9wb2xpY3k6IGJvb2wgPSBGYWxzZSwKICAgIHBvbGljeV9zdHlsZTogc3RyID0gIm1pZHJhbmdlIiwKICAgIHBvbGljeV9ncmVlZHk6IGJvb2wgPSBGYWxzZSwKICAgIGFpX3NpbXBsaWZpZWQ6IGJvb2wgPSBGYWxzZSwKICAgIGFpX3RoaW5rX3RpbWVfbXM6IGludCA9IC0xLAogICAgbWF4X3F1ZXVlX2RlcHRoOiBpbnQgPSAtMSwKKToKICAgIHRyeToKICAgICAgICAjIENvbXB1dGUgcG9saWN5IHNlcnZlciBVUkwgZnJvbSBvdXIgb3duIHBvcnQKICAgICAgICBwb2xpY3lfc2VydmVyID0gZiJodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0iCiAgICAgICAgY21kID0gYnVpbGRfamF2YV9jb21tYW5kKAogICAgICAgICAgICBkZWNrcywgbnVtX2dhbWVzLCB0aHJlYWRzLCBzZWVkLCBjbG9jaywgb3V0cHV0X3BhdGgsCiAgICAgICAgICAgIHVzZV9sZWFybmVkX3BvbGljeT11c2VfbGVhcm5lZF9wb2xpY3ksCiAgICAg' +
'ICAgICAgIHBvbGljeV9zZXJ2ZXI9cG9saWN5X3NlcnZlciwKICAgICAgICAgICAgcG9saWN5X3N0eWxlPXBvbGljeV9zdHlsZSwKICAgICAgICAgICAgcG9saWN5X2dyZWVkeT1wb2xpY3lfZ3JlZWR5LAogICAgICAgICAgICBhaV9zaW1wbGlmaWVkPWFpX3NpbXBsaWZpZWQsCiAgICAgICAgICAgIGFpX3RoaW5rX3RpbWVfbXM9YWlfdGhpbmtfdGltZV9tcywKICAgICAgICAgICAgbWF4X3F1ZXVlX2RlcHRoPW1heF9xdWV1ZV9kZXB0aCwKICAgICAgICApCiAgICAgICAgcHJpbnQoZiJbTGFiIEFQSV0gU3RhcnRpbmcgYmF0Y2gge3N0YXRlLmJhdGNoX2lkfTogeycgJy5qb2luKGNtZFs6Nl0pfS4uLiIpCiAgICAgICAgbG9vcCA9IGFzeW5jaW8uZ2V0X2V2ZW50X2xvb3AoKQogICAgICAgIGF3YWl0IGxvb3AucnVuX2luX2V4ZWN1dG9yKAogICAgICAgICAgICBOb25lLAogICAgICAgICAgICBsYW1iZGE6IF9ydW5fcHJvY2Vzc19ibG9ja2luZyhzdGF0ZSwgY21kKSwKICAgICAgICApCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgc3RhdGUuZXJyb3IgPSBzdHIoZSkKICAgICAgICBzdGF0ZS5ydW5uaW5nID0gRmFsc2UKICAgICAgICBwcmludChmIltMYWIgQVBJXSBCYXRjaCB7c3RhdGUuYmF0Y2hfaWR9IEVSUk9SOiB7ZX0iKQoKCmRlZiBfcnVuX3Byb2Nlc3NfYmxvY2tpbmcoc3RhdGU6IEJhdGNoU3RhdGUsIGNtZDogbGlzdFtzdHJdKToKICAgICMgV3JpdGUgZGVidWcgbG9nIGZyb20gUHl0aG9uIHNpZGUgKGRvZXNuJ3QgZGVwZW5kIG9uIEphdmEgcmVidWlsZCkKICAgIGRlYnVnX2xvZ19wYXRoID0gUGF0aChDRkcuZm9yZ2VfZGlyKS5wYXJlbnQgLyAiZm9yZ2Utc2ltLWRlYnVnLmxvZyIgaWYgQ0ZHLmZvcmdlX2RpciBlbHNlIFBhdGgoImZvcmdlLXNpbS1kZWJ1Zy5sb2ciKQogICAgdHJ5OgogICAgICAgIHdpdGggb3BlbihkZWJ1Z19sb2dfcGF0aCwgImEiLCBlbmNvZGluZz0idXRmLTgiKSBhcyBkYmc6CiAgICAgICAgICAgIGRiZy53cml0ZShmIlxueyc9Jyo2MH1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmIkJhdGNoIHtzdGF0ZS5iYXRjaF9pZH0gQCB7ZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KCl9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJDb21tYW5kOiB7JyAnLmpvaW4oY21kKX1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmIkxhYiBKQVI6IHtDRkcubGFiX2phcn1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmIkZvcmdlIEpBUjoge0NGRy5mb3JnZV9qYXJ9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJGb3JnZSBEaXI6IHtDRkcuZm9yZ2VfZGlyfVxuIikKICAgICAgICAgICAgZGJnLndyaXRlKGYiTGFiIEpBUiBleGlzdHM6IHtvcy5wYXRoLmV4aXN0cyhDRkcubGFiX2phcil9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJGb3JnZSBKQVIgZXhpc3RzOiB7b3MucGF0aC5leGlzdHMoQ0ZHLmZvcmdlX2phcil9XG4iKQogICAgICAgICAgICBkYmcud3JpdGUoZiJGb3JnZSBEaXIgZXhpc3RzOiB7b3MucGF0aC5pc2RpcihDRkcuZm9yZ2VfZGlyKX1cbiIpCiAgICAgICAgICAgIGRiZy53cml0ZShmInsnLScqNjB9XG4iKQogICAgICAgIHByaW50KGYiW0xhYiBBUEldIERlYnVnIGxvZzoge2RlYnVnX2xvZ19wYXRofSIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiJbTGFiIEFQSV0gQ291bGQgbm90IHdyaXRlIGRlYnVnIGxvZyBoZWFkZXI6IHtlfSIpCgogICAgIyBFbnN1cmUgRm9yZ2Ugc3VicHJvY2Vzc2VzIHVzZSBKYXZhIDE3IChGb3JnZSBjcmFzaGVzIG9uIEphdmEgMjUrKQogICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKICAgIGphdmExNyA9IGdldF9qYXZhMTcoKQogICAgaWYgamF2YTE3ICE9ICdqYXZhJzoKICAgICAgICBqYXZhMTdfYmluID0gb3MucGF0aC5kaXJuYW1lKGphdmExNykKICAgICAgICBqYXZhMTdfaG9tZSA9IG9zLnBhdGguZGlybmFtZShqYXZhMTdfYmluKQogICAgICAgIGVudlsnSkFWQV9IT01FJ10gPSBqYXZhMTdfaG9tZQogICAgICAgIGVudlsnUEFUSCddID0gamF2YTE3X2JpbiArIG9zLnBhdGhzZXAgKyBlbnYuZ2V0KCdQQVRIJywgJycpCiAgICAgICAgcHJpbnQoZidbTGFiIEFQSV0gVXNpbmcgSmF2YSAxNzoge2phdmExN30nKQoKICAgICMgTk9URTogRG8gTk9UIHNldCBfSkFWQV9PUFRJT05TPS1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSBoZXJlLgogICAgIyBGb3JnZSBzaW0gbW9kZSBuZWVkcyBBV1QgY2xhc3NlcyBmb3Ig' +
'Y2FyZCBkYXRhIGluaXRpYWxpemF0aW9uOwogICAgIyBoZWFkbGVzcz10cnVlIGNhdXNlcyBzaWxlbnQgZXhpdCBjb2RlIDEgY3Jhc2guCgogICAgIyBQZXItZ2FtZSB0aW1lb3V0OiBjbG9jayArIDE4MHMgYnVmZmVyIGZvciBjYXJkIERCIGluaXQKICAgIHBlcl9nYW1lX3RpbWVvdXQgPSBzdGF0ZS50b3RhbF9nYW1lcyAqIDI0MCArIDMwMCAgIyBnZW5lcm91czogNG1pbi9nYW1lICsgNW1pbiBzdGFydHVwCgogICAgdHJ5OgogICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKAogICAgICAgICAgICBjbWQsCiAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKICAgICAgICAgICAgdGV4dD1UcnVlLAogICAgICAgICAgICBjd2Q9Tm9uZSwKICAgICAgICAgICAgYnVmc2l6ZT0xLAogICAgICAgICAgICBlbnY9ZW52LAogICAgICAgICkKICAgICAgICBzdGF0ZS5wcm9jZXNzID0gcHJvYwoKICAgICAgICAjIFB5dGhvbi1zaWRlIHdhdGNoZG9nOiBraWxsIGlmIG5vIHByb2dyZXNzIGZvciB0b28gbG9uZwogICAgICAgIGltcG9ydCB0aHJlYWRpbmcKICAgICAgICBsYXN0X2FjdGl2aXR5ID0gW3RpbWUudGltZSgpXQogICAgICAgIHN0YWxsX2xpbWl0ID0gMzAwICAjIDUgbWludXRlcyB3aXRoIG5vIG91dHB1dCA9IHN0YWxsZWQKCiAgICAgICAgZGVmIF93YXRjaGRvZygpOgogICAgICAgICAgICB3aGlsZSBwcm9jLnBvbGwoKSBpcyBOb25lOgogICAgICAgICAgICAgICAgdGltZS5zbGVlcCgzMCkKICAgICAgICAgICAgICAgIGVsYXBzZWRfc2luY2VfYWN0aXZpdHkgPSB0aW1lLnRpbWUoKSAtIGxhc3RfYWN0aXZpdHlbMF0KICAgICAgICAgICAgICAgIGlmIGVsYXBzZWRfc2luY2VfYWN0aXZpdHkgPiBzdGFsbF9saW1pdDoKICAgICAgICAgICAgICAgICAgICBwcmludChmJ1tMYWIgQVBJXSBXQVRDSERPRzogTm8gb3V0cHV0IGZvciB7aW50KGVsYXBzZWRfc2luY2VfYWN0aXZpdHkpfXMuIEtpbGxpbmcgcHJvY2Vzcy4nKQogICAgICAgICAgICAgICAgICAgIHN0YXRlLmxvZ19saW5lcy5hcHBlbmQoZidbV0FUQ0hET0ddIFByb2Nlc3Mgc3RhbGxlZCAoe2ludChlbGFwc2VkX3NpbmNlX2FjdGl2aXR5KX1zIHdpdGggbm8gb3V0cHV0KS4gS2lsbGVkLicpCiAgICAgICAgICAgICAgICAgICAgcHJvYy5raWxsKCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgd2RfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3dhdGNoZG9nLCBkYWVtb249VHJ1ZSkKICAgICAgICB3ZF90aHJlYWQuc3RhcnQoKQoKICAgICAgICBnYW1lX2NvdW50ID0gMAogICAgICAgIGFsbF9vdXRwdXRfbGluZXMgPSBbXQogICAgICAgIGZvciBsaW5lIGluIHByb2Muc3Rkb3V0OgogICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQogICAgICAgICAgICBsYXN0X2FjdGl2aXR5WzBdID0gdGltZS50aW1lKCkKICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChsaW5lKQogICAgICAgICAgICBhbGxfb3V0cHV0X2xpbmVzLmFwcGVuZChsaW5lKQoKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCJbR2FtZSAiKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoIl0iKVswXQogICAgICAgICAgICAgICAgICAgIG51bXMgPSBwYXJ0cy5yZXBsYWNlKCJbR2FtZSAiLCAiIikuc3BsaXQoIi8iKQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBpbnQobnVtc1swXSkKICAgICAgICAgICAgICAgICAgICBnYW1lX2NvdW50ID0gY3VycmVudAogICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvbXBsZXRlZF9nYW1lcyA9IGN1cnJlbnQKICAgICAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW5kZXhFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgIyB2MjQgKElzc3VlICM1KTogUGFyc2UgcmVhbC10aW1lIHNpbXMvc2VjIGZyb20gSmF2YSBvdXRwdXQKICAgICAgICAgICAgaWYgJ1tQUk9HUkVTU10nIGluIGxpbmUgb3IgJ1tCQVRDSF0nIGluIGxpbmU6CiAgICAgICAgICAgICAgICBpbXBvcnQgcmUKICAgICAgICAgICAgICAgIHNwc19tYXRjaCA9IHJlLnNlYXJjaChyJyhbXGQuXSspXHMrc2ltcy9zZWMnLCBsaW5lKQogICAgICAgICAgICAgICAgaWYgc3BzX21hdGNoOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc3Rh' +
'dGUuc2ltc19wZXJfc2VjID0gZmxvYXQoc3BzX21hdGNoLmdyb3VwKDEpKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICBwcmludChmIiAgW3tzdGF0ZS5iYXRjaF9pZH1dIHtsaW5lfSIpCgogICAgICAgIHByb2Mud2FpdCgpCgogICAgICAgIGVsYXBzZWQgPSBpbnQoKGRhdGV0aW1lLm5vdygpIC0gc3RhdGUuc3RhcnRfdGltZSkudG90YWxfc2Vjb25kcygpICogMTAwMCkKICAgICAgICBzdGF0ZS5lbGFwc2VkX21zID0gZWxhcHNlZAogICAgICAgIHN0YXRlLnJ1bm5pbmcgPSBGYWxzZQoKICAgICAgICAjIFdyaXRlIGFsbCBjYXB0dXJlZCBvdXRwdXQgdG8gZGVidWcgbG9nCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZGVidWdfbG9nX3BhdGgsICJhIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZGJnOgogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiRXhpdCBjb2RlOiB7cHJvYy5yZXR1cm5jb2RlfVxuIikKICAgICAgICAgICAgICAgIGRiZy53cml0ZShmIlRvdGFsIGxpbmVzOiB7bGVuKGFsbF9vdXRwdXRfbGluZXMpfVxuIikKICAgICAgICAgICAgICAgIGRiZy53cml0ZShmIkVsYXBzZWQ6IHtlbGFwc2VkfW1zXG4iKQogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiLS0gRlVMTCBTVUJQUk9DRVNTIE9VVFBVVCAtLVxuIikKICAgICAgICAgICAgICAgIGlmIGFsbF9vdXRwdXRfbGluZXM6CiAgICAgICAgICAgICAgICAgICAgZm9yIG9sIGluIGFsbF9vdXRwdXRfbGluZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGRiZy53cml0ZShvbCArICJcbiIpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRiZy53cml0ZSgiPDwgTk8gT1VUUFVUID4+XG4iKQogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiLS0gRU5EIE9VVFBVVCAtLVxuXG4iKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcHJpbnQoZiJbTGFiIEFQSV0gQ291bGQgbm90IHdyaXRlIGRlYnVnIGxvZyBvdXRwdXQ6IHtlfSIpCgogICAgICAgIGlmIHByb2MucmV0dXJuY29kZSAhPSAwOgogICAgICAgICAgICBpZiBwcm9jLnJldHVybmNvZGUgPT0gLTkgb3IgcHJvYy5yZXR1cm5jb2RlID09IDEzNzoKICAgICAgICAgICAgICAgIHN0YXRlLmVycm9yID0gJ0ZvcmdlIHByb2Nlc3Mga2lsbGVkIGJ5IHdhdGNoZG9nIChzdGFsbGVkIHdpdGggbm8gb3V0cHV0KS4gQ2hlY2sgZm9yZ2Utc2ltLWRlYnVnLmxvZyBmb3IgZGV0YWlscy4nCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdGF0ZS5lcnJvciA9IGYnSmF2YSBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUge3Byb2MucmV0dXJuY29kZX0uIENoZWNrIGZvcmdlLXNpbS1kZWJ1Zy5sb2cgZm9yIGRldGFpbHMuJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0YXRlLmNvbXBsZXRlZF9nYW1lcyA9IHN0YXRlLnRvdGFsX2dhbWVzCiAgICAgICAgICAgIHByaW50KGYiW0xhYiBBUEldIEJhdGNoIHtzdGF0ZS5iYXRjaF9pZH0gY29tcGxldGVkIGluIHtlbGFwc2VkfW1zIikKCiAgICAgICAgICAgICMgQXV0by1nZW5lcmF0ZSBkZWNrIHJlcG9ydHMgZm9yIHRoZSBjb2FjaAogICAgICAgICAgICBpZiBzdGF0ZS5yZXN1bHRfcGF0aCBhbmQgb3MucGF0aC5leGlzdHMoc3RhdGUucmVzdWx0X3BhdGgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZyb20gY29hY2gucmVwb3J0X2dlbmVyYXRvciBpbXBvcnQgZ2VuZXJhdGVfc2luZ2xlX2RlY2tfcmVwb3J0CiAgICAgICAgICAgICAgICAgICAgbGFiX3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgICAgICAgICAgICAgICAgICByZXBvcnRzX2RpciA9IHN0cihsYWJfcm9vdCAvICJkZWNrLXJlcG9ydHMiKQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBnZW5lcmF0ZV9zaW5nbGVfZGVja19yZXBvcnQoc3RhdGUucmVzdWx0X3BhdGgsIHJlcG9ydHNfZGlyKQogICAgICAgICAgICAgICAgICAgIGlmIHVwZGF0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGYiW0xhYiBBUEldIERlY2sgcmVwb3J0cyB1cGRhdGVkOiB7JywgJy5qb2luKHVwZGF0ZWQpfSIpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHJwdF9lcnI6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJbTGFiIEFQSV0gRGVjayByZXBvcnQgZ2VuZXJhdGlvbiBmYWlsZWQg' +
'KG5vbi1mYXRhbCk6IHtycHRfZXJyfSIpCgogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHN0YXRlLmVycm9yID0gc3RyKGUpCiAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZGVidWdfbG9nX3BhdGgsICJhIiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZGJnOgogICAgICAgICAgICAgICAgZGJnLndyaXRlKGYiRVhDRVBUSU9OOiB7ZX1cbiIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVlcFNlZWsgQmF0Y2ggU2ltIChQeXRob24gZW5naW5lICsgTExNIG9wcG9uZW50KQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZGVmIF9sb2FkX2RlY2tfY2FyZHNfYnlfbmFtZShkZWNrX25hbWU6IHN0cikgLT4gbGlzdFtkaWN0XToKICAgICIiIkxvYWQgY2FyZCBkYXRhIGZvciBhIGRlY2sgYnkgbmFtZS4gQ2hlY2tzIERCIGZpcnN0LCB0aGVuIC5kY2sgZmlsZXMuCiAgICBFYWNoIGNhcmQgZGljdCBpbmNsdWRlcyAnaXNfY29tbWFuZGVyJyBmbGFnICgwIG9yIDEpIHdoZW4gYXZhaWxhYmxlLiIiIgogICAgIyAxLiBUcnkgZGVjayBidWlsZGVyIERCCiAgICB0cnk6CiAgICAgICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIGlkLCBjb21tYW5kZXJfbmFtZSBGUk9NIGRlY2tzIFdIRVJFIG5hbWUgPSA/IENPTExBVEUgTk9DQVNFIiwgKGRlY2tfbmFtZSwpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgcm93OgogICAgICAgICAgICBkZWNrX2lkID0gcm93WyJpZCJdCiAgICAgICAgICAgIGRiX2NvbW1hbmRlcl9uYW1lID0gcm93WyJjb21tYW5kZXJfbmFtZSJdIG9yICIiCiAgICAgICAgICAgIGNhcmRzID0gY29ubi5leGVjdXRlKCIiIgogICAgICAgICAgICAgICAgU0VMRUNUIGRjLmNhcmRfbmFtZSwgZGMucXVhbnRpdHksIGRjLmlzX2NvbW1hbmRlciwKICAgICAgICAgICAgICAgICAgICAgICBjZS50eXBlX2xpbmUsIGNlLmNtYywgY2UucG93ZXIsIGNlLnRvdWdobmVzcywKICAgICAgICAgICAgICAgICAgICAgICBjZS5vcmFjbGVfdGV4dCwgY2Uua2V5d29yZHMsIGNlLm1hbmFfY29zdCwKICAgICAgICAgICAgICAgICAgICAgICBjZS5jb2xvcl9pZGVudGl0eQogICAgICAgICAgICAgICAgRlJPTSBkZWNrX2NhcmRzIGRjCiAgICAgICAgICAgICAgICBMRUZUIEpPSU4gY29sbGVjdGlvbl9lbnRyaWVzIGNlIE9OIGNlLnNjcnlmYWxsX2lkID0gZGMuc2NyeWZhbGxfaWQKICAgICAgICAgICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/CiAgICAgICAgICAgICIiIiwgKGRlY2tfaWQsKSkuZmV0Y2hhbGwoKQogICAgICAgICAgICByZXN1bHQgPSBbXQogICAgICAgICAgICBmb3IgciBpbiBjYXJkczoKICAgICAgICAgICAgICAgIGlzX2NtZHIgPSByWyJpc19jb21tYW5kZXIiXSBvciAwCiAgICAgICAgICAgICAgICAjIEFsc28gZGV0ZWN0IGJ5IGRlY2stbGV2ZWwgY29tbWFuZGVyX25hbWUgbWF0Y2gKICAgICAgICAgICAgICAgIGlmIG5vdCBpc19jbWRyIGFuZCBkYl9jb21tYW5kZXJfbmFtZSBhbmQgclsiY2FyZF9uYW1lIl0ubG93ZXIoKSA9PSBkYl9jb21tYW5kZXJfbmFtZS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIGlzX2NtZHIgPSAxCiAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShyWyJxdWFudGl0eSJdIG9yIDEpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IHJbImNhcmRfbmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAndHlwZV9saW5lJzogclsidHlwZV9saW5lIl0gb3IgJycsCiAgICAgICAgICAgICAgICAgICAgICAg' +
'ICdjbWMnOiByWyJjbWMiXSBvciAwLAogICAgICAgICAgICAgICAgICAgICAgICAncG93ZXInOiByWyJwb3dlciJdIG9yICcnLAogICAgICAgICAgICAgICAgICAgICAgICAndG91Z2huZXNzJzogclsidG91Z2huZXNzIl0gb3IgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdvcmFjbGVfdGV4dCc6IHJbIm9yYWNsZV90ZXh0Il0gb3IgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3Jkcyc6IHJbImtleXdvcmRzIl0gb3IgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtYW5hX2Nvc3QnOiByWyJtYW5hX2Nvc3QiXSBvciAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2lzX2NvbW1hbmRlcic6IGlzX2NtZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcl9pZGVudGl0eSc6IHJbImNvbG9yX2lkZW50aXR5Il0gb3IgJycsCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHByaW50KGYiW0RlZXBTZWVrIEJhdGNoXSBEQiBsb29rdXAgZmFpbGVkIGZvciAne2RlY2tfbmFtZX0nOiB7ZX0iKQoKICAgICMgMi4gVHJ5IC5kY2sgZmlsZQogICAgaWYgQ0ZHLmZvcmdlX2RlY2tzX2RpciBhbmQgb3MucGF0aC5pc2RpcihDRkcuZm9yZ2VfZGVja3NfZGlyKToKICAgICAgICBkY2tfcGF0aCA9IFBhdGgoQ0ZHLmZvcmdlX2RlY2tzX2RpcikgLyBmIntkZWNrX25hbWV9LmRjayIKICAgICAgICBpZiBkY2tfcGF0aC5leGlzdHMoKToKICAgICAgICAgICAgY2FyZHMgPSBbXQogICAgICAgICAgICBpbl9jYXJkcyA9IEZhbHNlICAjIFRydWUgd2hlbiBpbnNpZGUgW01haW5dLCBbRGVja10sIG9yIFtDb21tYW5kZXJdCiAgICAgICAgICAgIHdpdGggb3BlbihkY2tfcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgbG93ID0gbGluZS5sb3dlcigpCiAgICAgICAgICAgICAgICAgICAgaWYgbG93IGluICgnW21haW5dJywgJ1tkZWNrXScsICdbY29tbWFuZGVyXScpOgogICAgICAgICAgICAgICAgICAgICAgICBpbl9jYXJkcyA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ1snKToKICAgICAgICAgICAgICAgICAgICAgICAgaW5fY2FyZHMgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGlmIGluX2NhcmRzIGFuZCBsaW5lOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoJyAnLCAxKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXR5ID0gaW50KHBhcnRzWzBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXJ0c1sxXS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UocXR5KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZHMuYXBwZW5kKHsnbmFtZSc6IG5hbWUsICd0eXBlX2xpbmUnOiAnJywgJ2NtYyc6IDB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBpZiBjYXJkczoKICAgICAgICAgICAgICAgIHJldHVybiBjYXJkcwoKICAgIHJldHVybiBbXQoKCmRlZiBfcnVuX2RlZXBzZWVrX2JhdGNoX3RocmVhZCgKICAgIHN0YXRlOiBCYXRjaFN0YXRlLAogICAgZGVja19uYW1lczogbGlzdFtzdHJdLAogICAgbnVtX2dhbWVzOiBpbnQsCiAgICBvdXRwdXRfcGF0aDogc3RyLAopOgogICAgIiIiUnVuIGJhdGNoIHNpbXVsYXRpb24gdXNpbmcgUHl0aG9uIHNpbSBlbmdpbmUgKyBEZWVwU2VlayBBSSBvcHBvbmVudC4iIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzIGFzIF9zLCBvcyBhcyBfbywgdGltZSBhcyBfdAogICAgICAgIHNyY19kaXIgPSBfby5wYXRoLmpvaW4oX28ucGF0aC5kaXJuYW1lKF9vLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAnc3JjJykKICAg' +
'ICAgICBpZiBzcmNfZGlyIG5vdCBpbiBfcy5wYXRoOgogICAgICAgICAgICBfcy5wYXRoLmluc2VydCgwLCBzcmNfZGlyKQoKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0uZGVlcHNlZWtfZW5naW5lIGltcG9ydCBEZWVwU2Vla0dhbWVFbmdpbmUKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLnJ1bGVzIGltcG9ydCBlbnJpY2hfY2FyZAoKICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKCdbRGVlcFNlZWsgQmF0Y2hdIEluaXRpYWxpemluZyBEZWVwU2VlayBicmFpbi4uLicpCiAgICAgICAgYnJhaW4gPSBfZ2V0X2RlZXBzZWVrX2JyYWluKCkKICAgICAgICBpZiBicmFpbiBhbmQgbm90IGJyYWluLl9jb25uZWN0ZWQ6CiAgICAgICAgICAgIGJyYWluLmNoZWNrX2Nvbm5lY3Rpb24oKQogICAgICAgIGlmIG5vdCBicmFpbiBvciBub3QgYnJhaW4uX2Nvbm5lY3RlZDoKICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSAnRGVlcFNlZWsgTExNIG5vdCBjb25uZWN0ZWQuIEdvIHRvIFNpbXVsYXRvciA+IERlZXBTZWVrIGFuZCBjb25uZWN0IGZpcnN0LicKICAgICAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0RlZXBTZWVrIEJhdGNoXSBDb25uZWN0ZWQgdG8ge2JyYWluLmNvbmZpZy5tb2RlbH0nKQoKICAgICAgICAjIExvYWQgYWxsIGRlY2tzCiAgICAgICAgIyDilIDilIAgTG9vayB1cCBoaXN0b3JpY2FsIHdpbiByYXRlcyBmcm9tIHBhc3QgYmF0Y2ggcmVzdWx0cyDilIDilIAKICAgICAgICBkZWNrX3dpbl9yYXRlcyA9IHt9ICAjIGRlY2tfbmFtZSAtPiBmbG9hdCAoMC0xMDApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHRzX2RpciA9IENGRy5yZXN1bHRzX2RpcgogICAgICAgICAgICBpZiBfby5wYXRoLmlzZGlyKHJlc3VsdHNfZGlyKToKICAgICAgICAgICAgICAgIGZvciBmbmFtZSBpbiBzb3J0ZWQoX28ubGlzdGRpcihyZXN1bHRzX2RpciksIHJldmVyc2U9VHJ1ZSk6CiAgICAgICAgICAgICAgICAgICAgaWYgZm5hbWUuc3RhcnRzd2l0aCgnYmF0Y2gtJykgYW5kIGZuYW1lLmVuZHN3aXRoKCcuanNvbicpOgogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oX28ucGF0aC5qb2luKHJlc3VsdHNfZGlyLCBmbmFtZSksICdyJykgYXMgcmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdCA9IGpzb24ubG9hZHMocmYucmVhZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRkIGluIHBhc3QuZ2V0KCdkZWNrcycsIFtdKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbmFtZSA9IGRkLmdldCgnZGVja05hbWUnLCAnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ciA9IGRkLmdldCgnd2luUmF0ZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZG5hbWUgYW5kIHdyIGlzIG5vdCBOb25lIGFuZCBkbmFtZSBub3QgaW4gZGVja193aW5fcmF0ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfd2luX3JhdGVzW2RuYW1lXSA9IGZsb2F0KHdyKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgbG9hZGVkX2RlY2tzID0ge30KICAgICAgICBkZWNrX21ldGEgPSB7fSAgIyBkZWNrX25hbWUgLT4ge2NvbW1hbmRlcl9uYW1lLCBjb2xvcl9pZGVudGl0eSwgYXJjaGV0eXBlfQogICAgICAgIGZvciBkbiBpbiBkZWNrX25hbWVzOgogICAgICAgICAgICByYXdfY2FyZHMgPSBfbG9hZF9kZWNrX2NhcmRzX2J5X25hbWUoZG4pCiAgICAgICAgICAgIGlmIG5vdCByYXdfY2FyZHM6CiAgICAgICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0RlZXBTZWVrIEJhdGNoXSBXQVJOSU5HOiBDb3VsZCBub3QgbG9hZCBkZWNrICJ7ZG59Iiwgc2tpcHBpbmcuJykKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIERldGVjdCBjb21tYW5kZXIgYW5kIGNvbG9yIGlkZW50aXR5IGZyb20gY2FyZCBkYXRhCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lID0gJycK' +
'ICAgICAgICAgICAgY29sb3JfaWRlbnRpdHlfc2V0ID0gc2V0KCkKICAgICAgICAgICAgZGVja19vYmpzID0gW10KICAgICAgICAgICAgZm9yIGNkIGluIHJhd19jYXJkczoKICAgICAgICAgICAgICAgIGMgPSBDYXJkKG5hbWU9Y2RbJ25hbWUnXSkKICAgICAgICAgICAgICAgIGlmIGNkLmdldCgndHlwZV9saW5lJyk6IGMudHlwZV9saW5lID0gY2RbJ3R5cGVfbGluZSddCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ2NtYycpOiBjLmNtYyA9IGZsb2F0KGNkWydjbWMnXSkKICAgICAgICAgICAgICAgIGlmIGNkLmdldCgncG93ZXInKSBhbmQgY2QuZ2V0KCd0b3VnaG5lc3MnKToKICAgICAgICAgICAgICAgICAgICBjLnBvd2VyID0gc3RyKGNkWydwb3dlciddKQogICAgICAgICAgICAgICAgICAgIGMudG91Z2huZXNzID0gc3RyKGNkWyd0b3VnaG5lc3MnXSkKICAgICAgICAgICAgICAgICAgICBjLnB0ID0gYy5wb3dlciArICcvJyArIGMudG91Z2huZXNzCiAgICAgICAgICAgICAgICBpZiBjZC5nZXQoJ29yYWNsZV90ZXh0Jyk6IGMub3JhY2xlX3RleHQgPSBjZFsnb3JhY2xlX3RleHQnXQogICAgICAgICAgICAgICAgaWYgY2QuZ2V0KCdtYW5hX2Nvc3QnKTogYy5tYW5hX2Nvc3QgPSBjZFsnbWFuYV9jb3N0J10KICAgICAgICAgICAgICAgIGlmIGNkLmdldCgna2V5d29yZHMnKToKICAgICAgICAgICAgICAgICAgICBrdyA9IGNkWydrZXl3b3JkcyddCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrdywgc3RyKToKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OiBrdyA9IGpzb24ubG9hZHMoa3cpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246IGt3ID0gW10KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3LCBsaXN0KTogYy5rZXl3b3JkcyA9IGt3CiAgICAgICAgICAgICAgICAjIFNldCBpc19jb21tYW5kZXIgZmxhZyBmcm9tIERCIGRhdGEKICAgICAgICAgICAgICAgIGlmIGNkLmdldCgnaXNfY29tbWFuZGVyJyk6CiAgICAgICAgICAgICAgICAgICAgYy5pc19jb21tYW5kZXIgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyX25hbWUgPSBjZFsnbmFtZSddCiAgICAgICAgICAgICAgICAjIENvbGxlY3QgY29sb3IgaWRlbnRpdHkKICAgICAgICAgICAgICAgIGNpX3N0ciA9IGNkLmdldCgnY29sb3JfaWRlbnRpdHknLCAnJykKICAgICAgICAgICAgICAgIGlmIGNpX3N0cjoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNpX3BhcnNlZCA9IGpzb24ubG9hZHMoY2lfc3RyKSBpZiBpc2luc3RhbmNlKGNpX3N0ciwgc3RyKSBlbHNlIGNpX3N0cgogICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNpX3BhcnNlZCwgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY29sb3IgaW4gY2lfcGFyc2VkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X3NldC5hZGQoY29sb3IpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgZW5yaWNoX2NhcmQoYykKICAgICAgICAgICAgICAgIGRlY2tfb2Jqcy5hcHBlbmQoYykKCiAgICAgICAgICAgICMgSW5mZXIgYXJjaGV0eXBlIGZyb20gZGVjayBjb21wb3NpdGlvbgogICAgICAgICAgICBjcmVhdHVyZV9jb3VudCA9IHN1bSgxIGZvciBjIGluIGRlY2tfb2JqcyBpZiBjLmlzX2NyZWF0dXJlKCkpCiAgICAgICAgICAgIHJlbW92YWxfY291bnQgPSBzdW0oMSBmb3IgYyBpbiBkZWNrX29ianMgaWYgYy5pc19yZW1vdmFsKQogICAgICAgICAgICByYW1wX2NvdW50ID0gc3VtKDEgZm9yIGMgaW4gZGVja19vYmpzIGlmIGMuaXNfcmFtcCkKICAgICAgICAgICAgYXZnX2NtYyA9IHN1bShjLmNtYyBvciAwIGZvciBjIGluIGRlY2tfb2JqcyBpZiBub3QgYy5pc19sYW5kKCkpIC8gbWF4KHN1bSgxIGZvciBjIGluIGRlY2tfb2JqcyBpZiBub3QgYy5pc19sYW5kKCkpLCAxKQogICAgICAgICAgICBvcmFjbGVfYWxsID0gJyAnLmpvaW4oKGMub3JhY2xlX3RleHQgb3IgJycpLmxvd2VyKCkgZm9yIGMgaW4gZGVja19vYmpzKQogICAgICAgICAgICBoYXNfY29tYm9fdGV4dCA9IGFueShrdyBpbiBvcmFjbGVfYWxsIGZvciBrdyBpbiBbJ3lvdSB3aW4gdGhlIGdhbWUnLCAnaW5maW5pdGUnLCAnZXh0cmEgdHVybiddKQoKICAgICAgICAgICAgaWYgaGFz' +
'X2NvbWJvX3RleHQ6CiAgICAgICAgICAgICAgICBhcmNoZXR5cGUgPSAnY29tYm8nCiAgICAgICAgICAgIGVsaWYgY3JlYXR1cmVfY291bnQgPj0gMzAgYW5kIGF2Z19jbWMgPD0gMi44OgogICAgICAgICAgICAgICAgYXJjaGV0eXBlID0gJ2FnZ3JvJwogICAgICAgICAgICBlbGlmIHJlbW92YWxfY291bnQgPj0gMTAgb3IgKGNyZWF0dXJlX2NvdW50IDw9IDE4IGFuZCBhdmdfY21jID49IDMuMik6CiAgICAgICAgICAgICAgICBhcmNoZXR5cGUgPSAnY29udHJvbCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyY2hldHlwZSA9ICdtaWRyYW5nZScKCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X2xpc3QgPSBzb3J0ZWQobGlzdChjb2xvcl9pZGVudGl0eV9zZXQpKQogICAgICAgICAgICBkZWNrX21ldGFbZG5dID0gewogICAgICAgICAgICAgICAgJ2NvbW1hbmRlcl9uYW1lJzogY29tbWFuZGVyX25hbWUsCiAgICAgICAgICAgICAgICAnY29sb3JfaWRlbnRpdHknOiBjb2xvcl9pZGVudGl0eV9saXN0LAogICAgICAgICAgICAgICAgJ2FyY2hldHlwZSc6IGFyY2hldHlwZSwKICAgICAgICAgICAgICAgICd3aW5fcmF0ZSc6IGRlY2tfd2luX3JhdGVzLmdldChkbiksCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxvYWRlZF9kZWNrc1tkbl0gPSBkZWNrX29ianMKICAgICAgICAgICAgY21kcl9pbmZvID0gZicgKENvbW1hbmRlcjoge2NvbW1hbmRlcl9uYW1lfSknIGlmIGNvbW1hbmRlcl9uYW1lIGVsc2UgJycKICAgICAgICAgICAgd3JfaW5mbyA9IGYnIFtIaXN0b3J5OiB7ZGVja193aW5fcmF0ZXNbZG5dOi4wZn0lIFdSXScgaWYgZG4gaW4gZGVja193aW5fcmF0ZXMgZWxzZSAnJwogICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0RlZXBTZWVrIEJhdGNoXSBMb2FkZWQgZGVjayAie2RufSIgKHtsZW4oZGVja19vYmpzKX0gY2FyZHMsIHthcmNoZXR5cGV9KXtjbWRyX2luZm99e3dyX2luZm99JykKCiAgICAgICAgaWYgbm90IGxvYWRlZF9kZWNrczoKICAgICAgICAgICAgc3RhdGUuZXJyb3IgPSAnTm8gZGVja3MgY291bGQgYmUgbG9hZGVkLicKICAgICAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEJ1aWxkIG1hdGNodXAgc2NoZWR1bGU6IGVhY2ggZGVjayBwbGF5cyBudW1fZ2FtZXMgdnMgRGVlcFNlZWsgQUkKICAgICAgICBkZWNrX2xpc3QgPSBsaXN0KGxvYWRlZF9kZWNrcy5rZXlzKCkpCiAgICAgICAgZ2FtZXNfcGVyX2RlY2sgPSBtYXgoMSwgbnVtX2dhbWVzIC8vIGxlbihkZWNrX2xpc3QpKQogICAgICAgIHRvdGFsX2dhbWVzID0gZ2FtZXNfcGVyX2RlY2sgKiBsZW4oZGVja19saXN0KQogICAgICAgIHN0YXRlLnRvdGFsX2dhbWVzID0gdG90YWxfZ2FtZXMKCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gUnVubmluZyB7Z2FtZXNfcGVyX2RlY2t9IGdhbWVzIHBlciBkZWNrIMOXIHtsZW4oZGVja19saXN0KX0gZGVja3MgPSB7dG90YWxfZ2FtZXN9IHRvdGFsJykKCiAgICAgICAgZW5naW5lID0gRGVlcFNlZWtHYW1lRW5naW5lKAogICAgICAgICAgICBicmFpbj1icmFpbiwKICAgICAgICAgICAgYWlfcGxheWVyX2luZGV4PTAsICAjIEFJIHBpbG90cyBkZWNrX2EgKHVzZXIncyBkZWNrKSB3aXRoIGZ1bGwgaW50ZWxsaWdlbmNlCiAgICAgICAgICAgIG1heF90dXJucz0yNSwKICAgICAgICAgICAgcmVjb3JkX2xvZz1UcnVlLAogICAgICAgICAgICBtbF9sb2c9VHJ1ZSwKICAgICAgICApCgogICAgICAgIHN0YXJ0X3RpbWUgPSBfdC50aW1lKCkKICAgICAgICBhbGxfZGVja19yZXN1bHRzID0gW10KICAgICAgICBjb21wbGV0ZWQgPSAwCgogICAgICAgIGZvciBkZWNrX25hbWUgaW4gZGVja19saXN0OgogICAgICAgICAgICBkZWNrX2EgPSBsb2FkZWRfZGVja3NbZGVja19uYW1lXQogICAgICAgICAgICAjIEdlbmVyYXRlIGEgdHJhaW5pbmcgb3Bwb25lbnQgZm9yIGVhY2ggZ2FtZQogICAgICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIubGFiLmV4cGVyaW1lbnRzIGltcG9ydCBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjawoKICAgICAgICAgICAgZGVja19zdGF0cyA9IHsKICAgICAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgICAgICd3aW5zJzogMCwgJ2xvc3Nlcyc6IDAsICd0b3RhbEdhbWVzJzogZ2FtZXNfcGVyX2RlY2ssCiAgICAgICAgICAgICAgICAndG90YWxUdXJu' +
'cyc6IDAsICd0b3RhbERhbWFnZURlYWx0JzogMCwgJ3RvdGFsRGFtYWdlUmVjZWl2ZWQnOiAwLAogICAgICAgICAgICAgICAgJ3RvdGFsU3BlbGxzQ2FzdCc6IDAsICd0b3RhbENyZWF0dXJlc1BsYXllZCc6IDAsCiAgICAgICAgICAgICAgICAnZ2FtZXMnOiBbXSwKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWV0YSA9IGRlY2tfbWV0YS5nZXQoZGVja19uYW1lLCB7fSkKICAgICAgICAgICAgZGtfYXJjaGV0eXBlID0gbWV0YS5nZXQoJ2FyY2hldHlwZScsICdtaWRyYW5nZScpCiAgICAgICAgICAgIGRrX2NvbW1hbmRlciA9IG1ldGEuZ2V0KCdjb21tYW5kZXJfbmFtZScsICcnKQogICAgICAgICAgICBka19jb2xvcnMgPSBtZXRhLmdldCgnY29sb3JfaWRlbnRpdHknLCBbXSkKICAgICAgICAgICAgZGtfd2luX3JhdGUgPSBtZXRhLmdldCgnd2luX3JhdGUnKQoKICAgICAgICAgICAgZm9yIGcgaW4gcmFuZ2UoZ2FtZXNfcGVyX2RlY2spOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRlY2tfYiA9IF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrKCkKICAgICAgICAgICAgICAgICAgICBnYW1lX2lkID0gZidkcy17c3RhdGUuYmF0Y2hfaWR9LXtkZWNrX25hbWVbOjEyXX0tZ3tnKzF9JwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVuZ2luZS5ydW4oCiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfYSwgZGVja19iLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2E9ZGVja19uYW1lICsgJyAoQUkpJywKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9iPSdUcmFpbmluZyBPcHBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVfaWQ9Z2FtZV9pZCwgYXJjaGV0eXBlPWRrX2FyY2hldHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyX25hbWU9ZGtfY29tbWFuZGVyLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9pZGVudGl0eT1ka19jb2xvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbl9yYXRlPWRrX3dpbl9yYXRlLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBnZCA9IHJlc3VsdC50b19kaWN0KCkKICAgICAgICAgICAgICAgICAgICBnZFsnZ2FtZU51bWJlciddID0gZyArIDEKICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWydnYW1lcyddLmFwcGVuZChnZCkKCiAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0Lndpbm5lciA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd3aW5zJ10gKz0gMQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tfc3RhdHNbJ2xvc3NlcyddICs9IDEKICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbFR1cm5zJ10gKz0gcmVzdWx0LnR1cm5zCiAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0LnBsYXllcl9hX3N0YXRzOgogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbERhbWFnZURlYWx0J10gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9kZWFsdAogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbERhbWFnZVJlY2VpdmVkJ10gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9yZWNlaXZlZAogICAgICAgICAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWyd0b3RhbFNwZWxsc0Nhc3QnXSArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuc3BlbGxzX2Nhc3QKICAgICAgICAgICAgICAgICAgICAgICAgZGVja19zdGF0c1sndG90YWxDcmVhdHVyZXNQbGF5ZWQnXSArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY3JlYXR1cmVzX3BsYXllZAoKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICBmJ1tHYW1lIHtjb21wbGV0ZWQgKyAxfS97dG90YWxfZ2FtZXN9XSB7ZGVja19uYW1lfSAoQUktcGlsb3RlZCkg4oaSICcKICAgICAgICAgICAgICAgICAgICAgICAgZid7IldJTiIgaWYgcmVzdWx0Lndpbm5lciA9PSAwIGVsc2UgIkxPU1MifSAodHVybiB7cmVzdWx0LnR1cm5zfSknCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBnZToKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKGYnW0dhbWUge2NvbXBsZXRlZCArIDF9L3t0b3RhbF9nYW1lc31dIEVSUk9SOiB7Z2V9JykKICAgICAgICAgICAg' +
'ICAgICAgICBkZWNrX3N0YXRzWydnYW1lcyddLmFwcGVuZCh7J2Vycm9yJzogc3RyKGdlKSwgJ2dhbWVOdW1iZXInOiBnICsgMX0pCgogICAgICAgICAgICAgICAgY29tcGxldGVkICs9IDEKICAgICAgICAgICAgICAgIHN0YXRlLmNvbXBsZXRlZF9nYW1lcyA9IGNvbXBsZXRlZAoKICAgICAgICAgICAgbiA9IGRlY2tfc3RhdHNbJ3RvdGFsR2FtZXMnXQogICAgICAgICAgICBkZWNrX3N0YXRzWyd3aW5SYXRlJ10gPSByb3VuZChkZWNrX3N0YXRzWyd3aW5zJ10gLyBuICogMTAwLCAxKSBpZiBuID4gMCBlbHNlIDAuMAogICAgICAgICAgICBkZWNrX3N0YXRzWydhdmdUdXJucyddID0gcm91bmQoZGVja19zdGF0c1sndG90YWxUdXJucyddIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAKICAgICAgICAgICAgZGVja19zdGF0c1snYXZnRGFtYWdlRGVhbHQnXSA9IHJvdW5kKGRlY2tfc3RhdHNbJ3RvdGFsRGFtYWdlRGVhbHQnXSAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wCiAgICAgICAgICAgIGRlY2tfc3RhdHNbJ2F2Z0RhbWFnZVJlY2VpdmVkJ10gPSByb3VuZChkZWNrX3N0YXRzWyd0b3RhbERhbWFnZVJlY2VpdmVkJ10gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMAogICAgICAgICAgICBkZWNrX3N0YXRzWydhdmdTcGVsbHNDYXN0J10gPSByb3VuZChkZWNrX3N0YXRzWyd0b3RhbFNwZWxsc0Nhc3QnXSAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wCiAgICAgICAgICAgIGRlY2tfc3RhdHNbJ2F2Z0NyZWF0dXJlc1BsYXllZCddID0gcm91bmQoZGVja19zdGF0c1sndG90YWxDcmVhdHVyZXNQbGF5ZWQnXSAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wCiAgICAgICAgICAgICMgSW5jbHVkZSBkZWNrIGludGVsbGlnZW5jZSBtZXRhZGF0YQogICAgICAgICAgICBkZWNrX3N0YXRzWydhcmNoZXR5cGUnXSA9IGRrX2FyY2hldHlwZQogICAgICAgICAgICBkZWNrX3N0YXRzWydjb21tYW5kZXInXSA9IGRrX2NvbW1hbmRlcgogICAgICAgICAgICBkZWNrX3N0YXRzWydjb2xvcklkZW50aXR5J10gPSBka19jb2xvcnMKICAgICAgICAgICAgaWYgZGtfd2luX3JhdGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBkZWNrX3N0YXRzWydwcmlvcldpblJhdGUnXSA9IGRrX3dpbl9yYXRlCiAgICAgICAgICAgIGFsbF9kZWNrX3Jlc3VsdHMuYXBwZW5kKGRlY2tfc3RhdHMpCgogICAgICAgIGVsYXBzZWQgPSBfdC50aW1lKCkgLSBzdGFydF90aW1lCiAgICAgICAgZHNfc3RhdHMgPSBicmFpbi5nZXRfc3RhdHMoKSBpZiBicmFpbiBlbHNlIHt9CgogICAgICAgICMgQnVpbGQgcmVzdWx0IGluIGNvbXBhdGlibGUgZm9ybWF0CiAgICAgICAgYmF0Y2hfcmVzdWx0ID0gewogICAgICAgICAgICAnbWV0YWRhdGEnOiB7CiAgICAgICAgICAgICAgICAnYmF0Y2hJZCc6IHN0YXRlLmJhdGNoX2lkLAogICAgICAgICAgICAgICAgJ3RpbWVzdGFtcCc6IGRhdGV0aW1lLm5vdygpLmlzb2Zvcm1hdCgpLAogICAgICAgICAgICAgICAgJ2NvbXBsZXRlZEdhbWVzJzogY29tcGxldGVkLAogICAgICAgICAgICAgICAgJ3RocmVhZHMnOiAxLAogICAgICAgICAgICAgICAgJ2VsYXBzZWRNcyc6IGludChlbGFwc2VkICogMTAwMCksCiAgICAgICAgICAgICAgICAnZW5naW5lJzogJ2RlZXBzZWVrJywKICAgICAgICAgICAgICAgICdtb2RlbCc6IGJyYWluLmNvbmZpZy5tb2RlbCBpZiBicmFpbiBlbHNlICd1bmtub3duJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2RlY2tzJzogYWxsX2RlY2tfcmVzdWx0cywKICAgICAgICAgICAgJ2RlZXBzZWVrU3RhdHMnOiBkc19zdGF0cywKICAgICAgICB9CgogICAgICAgICMgV3JpdGUgTUwgZGVjaXNpb24gSlNPTkwgZm9yIHRoZSB0cmFpbmluZyBwaXBlbGluZQogICAgICAgIG1sX2RlY2lzaW9ucyA9IGVuZ2luZS5mbHVzaF9tbF9kZWNpc2lvbnMoKQogICAgICAgIGlmIG1sX2RlY2lzaW9uczoKICAgICAgICAgICAgbWxfanNvbmxfcGF0aCA9IG9zLnBhdGguam9pbihDRkcucmVzdWx0c19kaXIsIGYnbWwtZGVjaXNpb25zLWRzLXtzdGF0ZS5iYXRjaF9pZH0uanNvbmwnKQogICAgICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUobWxfanNvbmxfcGF0aCkgb3IgJy4nLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICB3aXRoIG9wZW4obWxfanNvbmxfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBtZjoKICAgICAgICAgICAgICAgIGZvciBkZWMgaW4gbWxfZGVjaXNpb25zOgogICAgICAgICAgICAgICAgICAgIG1mLndyaXRl' +
'KGpzb24uZHVtcHMoZGVjKSArICdcbicpCiAgICAgICAgICAgIHN0YXRlLmxvZ19saW5lcy5hcHBlbmQoZidbTUwgRGF0YV0gV3JvdGUge2xlbihtbF9kZWNpc2lvbnMpfSBkZWNpc2lvbiBzbmFwc2hvdHMgdG8ge29zLnBhdGguYmFzZW5hbWUobWxfanNvbmxfcGF0aCl9JykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0ZS5sb2dfbGluZXMuYXBwZW5kKCdbTUwgRGF0YV0gTm8gZGVjaXNpb24gc25hcHNob3RzIGNhcHR1cmVkICgwIGRlY2lzaW9ucyknKQoKICAgICAgICAjIFNhdmUgdG8gcmVzdWx0cyBkaXIKICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUob3V0cHV0X3BhdGgpLCBleGlzdF9vaz1UcnVlKQogICAgICAgIHdpdGggb3BlbihvdXRwdXRfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICBqc29uLmR1bXAoYmF0Y2hfcmVzdWx0LCBmLCBpbmRlbnQ9MiwgZGVmYXVsdD1zdHIpCgogICAgICAgIHN0YXRlLnJlc3VsdF9wYXRoID0gb3V0cHV0X3BhdGgKICAgICAgICBlbGFwc2VkX21zID0gaW50KGVsYXBzZWQgKiAxMDAwKQogICAgICAgIHN0YXRlLmVsYXBzZWRfbXMgPSBlbGFwc2VkX21zCiAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgc3RhdGUuY29tcGxldGVkX2dhbWVzID0gdG90YWxfZ2FtZXMKCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gQ29tcGxldGU6IHtjb21wbGV0ZWR9IGdhbWVzIGluIHtlbGFwc2VkOi4xZn1zJykKICAgICAgICBmb3IgZHMgaW4gYWxsX2RlY2tfcmVzdWx0czoKICAgICAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJyAge2RzWyJkZWNrTmFtZSJdfToge2RzWyJ3aW5zIl19Vy17ZHNbImxvc3NlcyJdfUwgKHtkc1sid2luUmF0ZSJdfSUgV1IpJykKCiAgICAgICAgcHJpbnQoZidbRGVlcFNlZWsgQmF0Y2hdIEJhdGNoIHtzdGF0ZS5iYXRjaF9pZH0gY29tcGxldGU6IHtjb21wbGV0ZWR9IGdhbWVzIGluIHtlbGFwc2VkOi4xZn1zJykKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIHN0YXRlLmVycm9yID0gc3RyKGUpCiAgICAgICAgc3RhdGUucnVubmluZyA9IEZhbHNlCiAgICAgICAgc3RhdGUubG9nX2xpbmVzLmFwcGVuZChmJ1tEZWVwU2VlayBCYXRjaF0gRkFUQUw6IHtlfScpCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCcvYXBpL2xhYi9zdGFydC1kZWVwc2VlaycpCmFzeW5jIGRlZiBzdGFydF9iYXRjaF9kZWVwc2VlayhyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCwgYmFja2dyb3VuZF90YXNrczogQmFja2dyb3VuZFRhc2tzKToKICAgICIiIlN0YXJ0IGEgYmF0Y2ggc2ltdWxhdGlvbiB1c2luZyB0aGUgUHl0aG9uIHNpbSBlbmdpbmUgKyBEZWVwU2VlayBMTE0gb3Bwb25lbnQuIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIGRlY2tzID0gYm9keS5nZXQoJ2RlY2tzJywgW10pCiAgICBudW1fZ2FtZXMgPSBib2R5LmdldCgnbnVtR2FtZXMnLCAzMCkKICAgICMgTm90ZTogdGhyZWFkcyBub3QgYXBwbGljYWJsZSBmb3IgUHl0aG9uIHNpbSAoc2luZ2xlLXRocmVhZGVkIExMTSBjYWxscykKCiAgICBpZiBub3QgZGVja3Mgb3IgbGVuKGRlY2tzKSA8IDE6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdBdCBsZWFzdCAxIGRlY2sgcmVxdWlyZWQnKQogICAgaWYgbnVtX2dhbWVzIDwgMSBvciBudW1fZ2FtZXMgPiA1MDA6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdudW1HYW1lcyBtdXN0IGJlIDEtNTAwJykKCiAgICAjIEZpbHRlciBlbXB0eSBkZWNrIHNsb3RzCiAgICBkZWNrcyA9IFtkIGZvciBkIGluIGRlY2tzIGlmIGRdCiAgICBpZiBub3QgZGVja3M6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdObyB2YWxpZCBkZWNrcyBwcm92aWRlZCcpCgogICAgYmF0Y2hfaWQgPSBzdHIodXVpZC51dWlkNCgpKVs6MTJdCiAgICBzdGF0ZSA9IEJhdGNoU3RhdGUoYmF0Y2hfaWQsIG51bV9nYW1lcywgMSkKICAgIGFjdGl2ZV9iYXRjaGVzW2JhdGNoX2lkXSA9IHN0YXRlCgogICAgb3MubWFrZWRpcnMoQ0ZHLnJlc3VsdHNfZGlyLCBleGlzdF9vaz1UcnVlKQogICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oQ0ZHLnJlc3VsdHNfZGlyLCBmJ2JhdGNoLXtiYXRjaF9pZH0uanNvbicpCiAgICBzdGF0ZS5yZXN1bHRfcGF0aCA9IG91' +
'dHB1dF9wYXRoCgogICAgIyBVc2UgdGhyZWFkaW5nIGluc3RlYWQgb2YgQmFja2dyb3VuZFRhc2tzIHRvIGF2b2lkIGFzeW5jIGlzc3VlcyB3aXRoIERCCiAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl9kZWVwc2Vla19iYXRjaF90aHJlYWQsCiAgICAgICAgYXJncz0oc3RhdGUsIGRlY2tzLCBudW1fZ2FtZXMsIG91dHB1dF9wYXRoKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHQuc3RhcnQoKQoKICAgIHJldHVybiBKU09OUmVzcG9uc2UoewogICAgICAgICdiYXRjaElkJzogYmF0Y2hfaWQsCiAgICAgICAgJ3N0YXR1cyc6ICdzdGFydGVkJywKICAgICAgICAnbWVzc2FnZSc6IGYnUnVubmluZyB7bnVtX2dhbWVzfSBnYW1lcyBhY3Jvc3Mge2xlbihkZWNrcyl9IGRlY2tzIHdpdGggRGVlcFNlZWsgQUknLAogICAgICAgICdlbmdpbmUnOiAnZGVlcHNlZWsnLAogICAgfSkKCgojIEdsb2JhbCBNTCBsb2dnaW5nIHRvZ2dsZSAoY2FuIGJlIGVuYWJsZWQgdmlhIEFQSSkKX21sX2xvZ2dpbmdfZW5hYmxlZCA9IEZhbHNlCgoKZGVmIF9maW5kX2phdmExNygpIC0+IHN0cjoKICAgICIiIkF1dG8tZGV0ZWN0IEphdmEgMTcgZm9yIEZvcmdlIHN1YnByb2Nlc3Nlcy4gRm9yZ2UgY3Jhc2hlcyBvbiBKYXZhIDI1Ky4iIiIKICAgIGltcG9ydCBnbG9iIGFzIF9nbG9iCiAgICAjIENoZWNrIGNvbW1vbiBBZG9wdGl1bS9PcmFjbGUgbG9jYXRpb25zIG9uIFdpbmRvd3MKICAgIHNlYXJjaF9kaXJzID0gWwogICAgICAgIHInQzpcUHJvZ3JhbSBGaWxlc1xFY2xpcHNlIEFkb3B0aXVtJywKICAgICAgICByJ0M6XFByb2dyYW0gRmlsZXNcSmF2YScsCiAgICBdCiAgICBmb3IgZCBpbiBzZWFyY2hfZGlyczoKICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGQpOgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gb3MubGlzdGRpcihkKToKICAgICAgICAgICAgICAgIGlmIGNoaWxkLnN0YXJ0c3dpdGgoJ2pkay0xNycpOgogICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IG9zLnBhdGguam9pbihkLCBjaGlsZCwgJ2JpbicsICdqYXZhLmV4ZScpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY2FuZGlkYXRlKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZQogICAgcmV0dXJuICdqYXZhJyAgIyBmYWxsYmFjayB0byBzeXN0ZW0gamF2YQoKX0pBVkExN19QQVRIID0gTm9uZSAgIyBjYWNoZWQgcmVzdWx0CgpkZWYgZ2V0X2phdmExNygpIC0+IHN0cjoKICAgIGdsb2JhbCBfSkFWQTE3X1BBVEgKICAgIGlmIF9KQVZBMTdfUEFUSCBpcyBOb25lOgogICAgICAgIF9KQVZBMTdfUEFUSCA9IF9maW5kX2phdmExNygpCiAgICByZXR1cm4gX0pBVkExN19QQVRICgoKZGVmIGJ1aWxkX2phdmFfY29tbWFuZCgKICAgIGRlY2tzOiBsaXN0W3N0cl0sCiAgICBudW1fZ2FtZXM6IGludCwKICAgIHRocmVhZHM6IGludCwKICAgIHNlZWQ6IE9wdGlvbmFsW2ludF0sCiAgICBjbG9jazogaW50LAogICAgb3V0cHV0X3BhdGg6IHN0ciwKICAgIHVzZV9sZWFybmVkX3BvbGljeTogYm9vbCA9IEZhbHNlLAogICAgcG9saWN5X3NlcnZlcjogc3RyID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIsCiAgICBwb2xpY3lfc3R5bGU6IHN0ciA9ICJtaWRyYW5nZSIsCiAgICBwb2xpY3lfZ3JlZWR5OiBib29sID0gRmFsc2UsCiAgICAjIHYyNCAoSXNzdWVzICM0LyM1KTogUGVyZm9ybWFuY2UgZmxhZ3MKICAgIGFpX3NpbXBsaWZpZWQ6IGJvb2wgPSBGYWxzZSwKICAgIGFpX3RoaW5rX3RpbWVfbXM6IGludCA9IC0xLAogICAgbWF4X3F1ZXVlX2RlcHRoOiBpbnQgPSAtMSwKKSAtPiBsaXN0W3N0cl06CiAgICBqYXZhMTcgPSBnZXRfamF2YTE3KCkKICAgIGNtZCA9IFsKICAgICAgICBqYXZhMTcsICItamFyIiwgQ0ZHLmxhYl9qYXIsCiAgICAgICAgIi0tZm9yZ2UtamFyIiwgQ0ZHLmZvcmdlX2phciwKICAgICAgICAiLS1mb3JnZS1kaXIiLCBDRkcuZm9yZ2VfZGlyLAogICAgICAgICItLWRlY2sxIiwgZGVja3NbMF0sCiAgICAgICAgIi0tZGVjazIiLCBkZWNrc1sxXSwKICAgICAgICAiLS1kZWNrMyIsIGRlY2tzWzJdLAogICAgICAgICItLWdhbWVzIiwgc3RyKG51bV9nYW1lcyksCiAgICAgICAgIi0tdGhyZWFkcyIsIHN0cih0aHJlYWRzKSwKICAgICAgICAiLS1jbG9jayIsIHN0cihjbG9jayksCiAgICAgICAgIi0tb3V0cHV0Iiwgb3V0cHV0X3BhdGgsCiAgICBdCiAgICBpZiBzZWVkIGlzIG5vdCBOb25lOgogICAgICAgIGNt' +
'ZC5leHRlbmQoWyItLXNlZWQiLCBzdHIoc2VlZCldKQogICAgaWYgX21sX2xvZ2dpbmdfZW5hYmxlZDoKICAgICAgICBjbWQuYXBwZW5kKCItLW1sLWxvZyIpCiAgICBpZiB1c2VfbGVhcm5lZF9wb2xpY3k6CiAgICAgICAgY21kLmFwcGVuZCgiLS1sZWFybmVkLXBvbGljeSIpCiAgICAgICAgY21kLmV4dGVuZChbIi0tcG9saWN5LXNlcnZlciIsIHBvbGljeV9zZXJ2ZXJdKQogICAgICAgIGNtZC5leHRlbmQoWyItLXBvbGljeS1zdHlsZSIsIHBvbGljeV9zdHlsZV0pCiAgICAgICAgaWYgcG9saWN5X2dyZWVkeToKICAgICAgICAgICAgY21kLmFwcGVuZCgiLS1wb2xpY3ktZ3JlZWR5IikKICAgICMgdjI0IChJc3N1ZXMgIzQvIzUpOiBQZXJmb3JtYW5jZSBmbGFncwogICAgaWYgYWlfc2ltcGxpZmllZDoKICAgICAgICBjbWQuYXBwZW5kKCItLWFpLXNpbXBsaWZpZWQiKQogICAgaWYgYWlfdGhpbmtfdGltZV9tcyA+IDA6CiAgICAgICAgY21kLmV4dGVuZChbIi0tYWktdGhpbmstdGltZSIsIHN0cihhaV90aGlua190aW1lX21zKV0pCiAgICBpZiBtYXhfcXVldWVfZGVwdGggPiAwOgogICAgICAgIGNtZC5leHRlbmQoWyItLW1heC1xdWV1ZSIsIHN0cihtYXhfcXVldWVfZGVwdGgpXSkKICAgIHJldHVybiBjbWQKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENvbGxlY3Rpb24gRGF0YWJhc2UgU2V0dXAKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkNPTExFQ1RJT05fREJfUEFUSCA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJjb2xsZWN0aW9uLmRiIgpfZGJfbG9jYWwgPSB0aHJlYWRpbmcubG9jYWwoKQoKCmRlZiBfZ2V0X2RiX2Nvbm4oKSAtPiBzcWxpdGUzLkNvbm5lY3Rpb246CiAgICAiIiJHZXQgYSB0aHJlYWQtbG9jYWwgU1FMaXRlIGNvbm5lY3Rpb24uIiIiCiAgICBpZiBub3QgaGFzYXR0cihfZGJfbG9jYWwsICJjb25uIikgb3IgX2RiX2xvY2FsLmNvbm4gaXMgTm9uZToKICAgICAgICBjb25uID0gc3FsaXRlMy5jb25uZWN0KHN0cihDT0xMRUNUSU9OX0RCX1BBVEgpLCBjaGVja19zYW1lX3RocmVhZD1GYWxzZSkKICAgICAgICBjb25uLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKICAgICAgICBfZGJfbG9jYWwuY29ubiA9IGNvbm4KICAgIHJldHVybiBfZGJfbG9jYWwuY29ubgoKCmRlZiBpbml0X2NvbGxlY3Rpb25fZGIoKToKICAgICIiIkluaXRpYWxpemUgdGhlIGNvbGxlY3Rpb24gU1FMaXRlIGRhdGFiYXNlIHdpdGggdGFibGVzIGFuZCBpbmRleGVzLiIiIgogICAgY29ubiA9IHNxbGl0ZTMuY29ubmVjdChzdHIoQ09MTEVDVElPTl9EQl9QQVRIKSwgY2hlY2tfc2FtZV90aHJlYWQ9RmFsc2UpCiAgICBjb25uLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKICAgIGN1ciA9IGNvbm4uY3Vyc29yKCkKCiAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiIiIKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBjYXJkX3JlY29yZHMgKAogICAgICAgICAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgIG5hbWUgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgdHlwZV9saW5lIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgc3VidHlwZXMgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBpc19sZWdlbmRhcnkgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIGlzX2Jhc2ljIElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGNtYyBSRUFMIERFRkFVTFQgMCwKICAgICAgICAgICAgb3JhY2xlX3RleHQgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBrZXl3b3JkcyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHRjZ19wcmljZSBSRUFMIERFRkFVTFQgMCwKICAgICAgICAgICAgc2FsdF9zY29yZSBSRUFMIERFRkFV' +
'TFQgMCwKICAgICAgICAgICAgaXNfZ2FtZV9jaGFuZ2VyIElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICBjYXRlZ29yeSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHNjcnlmYWxsX2lkIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgdGNncGxheWVyX2lkIFRFWFQgREVGQVVMVCAnJwogICAgICAgICk7CgogICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGNvbGxlY3Rpb25fZW50cmllcyAoCiAgICAgICAgICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgbmFtZSBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICB0eXBlX2xpbmUgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBzdWJ0eXBlcyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGlzX2xlZ2VuZGFyeSBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgaXNfYmFzaWMgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5IFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgY21jIFJFQUwgREVGQVVMVCAwLAogICAgICAgICAgICBtYW5hX2Nvc3QgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBvcmFjbGVfdGV4dCBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGtleXdvcmRzIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgcG93ZXIgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICB0b3VnaG5lc3MgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICByYXJpdHkgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBzZXRfbmFtZSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGVkaHJlY19yYW5rIElOVEVHRVIgREVGQVVMVCAwLAogICAgICAgICAgICB0Y2dfcHJpY2UgUkVBTCBERUZBVUxUIDAsCiAgICAgICAgICAgIHNhbHRfc2NvcmUgUkVBTCBERUZBVUxUIDAsCiAgICAgICAgICAgIGlzX2dhbWVfY2hhbmdlciBJTlRFR0VSIERFRkFVTFQgMCwKICAgICAgICAgICAgY2F0ZWdvcnkgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBzY3J5ZmFsbF9pZCBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHRjZ3BsYXllcl9pZCBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHF1YW50aXR5IElOVEVHRVIgREVGQVVMVCAxLAogICAgICAgICAgICBmaW5pc2ggVEVYVCBERUZBVUxUICdOT1JNQUwnLAogICAgICAgICAgICBjb25kaXRpb24gVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBsYW5ndWFnZSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIG5vdGVzIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgdGFncyBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHNldF9jb2RlIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgY29sbGVjdG9yX251bWJlciBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGNyZWF0ZWRfYXQgVEVYVCBERUZBVUxUIChkYXRldGltZSgnbm93JykpLAogICAgICAgICAgICB1cGRhdGVkX2F0IFRFWFQgREVGQVVMVCAoZGF0ZXRpbWUoJ25vdycpKQogICAgICAgICk7CgogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9uYW1lIE9OIGNvbGxlY3Rpb25fZW50cmllcyhuYW1lKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfY29sb3JfaWRlbnRpdHkgT04gY29sbGVjdGlvbl9lbnRyaWVzKGNvbG9yX2lkZW50aXR5KTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfdHlwZV9saW5lIE9OIGNvbGxlY3Rpb25fZW50cmllcyh0eXBlX2xpbmUpOwogICAgICAgIENSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9jZV9pc19sZWdlbmRhcnkgT04gY29sbGVjdGlvbl9lbnRyaWVzKGlzX2xlZ2VuZGFyeSk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX2NtYyBPTiBjb2xsZWN0aW9uX2VudHJpZXMoY21jKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfY2F0ZWdvcnkgT04gY29sbGVjdGlvbl9lbnRyaWVzKGNhdGVnb3J5KTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2Vfc2V0X2NvZGUgT04gY29sbGVjdGlvbl9lbnRyaWVzKHNldF9jb2RlKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfY2VfY29sbGVjdG9yX251bWJlciBPTiBjb2xsZWN0aW9uX2VudHJpZXMoY29sbGVjdG9yX251bWJlcik7CiAgICAgICAgQ1JF' +
'QVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NlX2ZpbmlzaCBPTiBjb2xsZWN0aW9uX2VudHJpZXMoZmluaXNoKTsKCiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2NyX25hbWUgT04gY2FyZF9yZWNvcmRzKG5hbWUpOwoKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkZWNrcyAoCiAgICAgICAgICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgbmFtZSBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICBjb21tYW5kZXJfc2NyeWZhbGxfaWQgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBjb21tYW5kZXJfbmFtZSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5IFRFWFQgREVGQVVMVCAnW10nLAogICAgICAgICAgICBzdHJhdGVneV90YWcgVEVYVCBERUZBVUxUICcnLAogICAgICAgICAgICBjcmVhdGVkX2F0IFRFWFQgREVGQVVMVCAoZGF0ZXRpbWUoJ25vdycpKSwKICAgICAgICAgICAgdXBkYXRlZF9hdCBURVhUIERFRkFVTFQgKGRhdGV0aW1lKCdub3cnKSkKICAgICAgICApOwoKICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkZWNrX2NhcmRzICgKICAgICAgICAgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgICAgICAgICBkZWNrX2lkIElOVEVHRVIgTk9UIE5VTEwsCiAgICAgICAgICAgIHNjcnlmYWxsX2lkIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgIGNhcmRfbmFtZSBURVhUIERFRkFVTFQgJycsCiAgICAgICAgICAgIHF1YW50aXR5IElOVEVHRVIgREVGQVVMVCAxLAogICAgICAgICAgICBpc19jb21tYW5kZXIgSU5URUdFUiBERUZBVUxUIDAsCiAgICAgICAgICAgIHJvbGVfdGFnIFRFWFQgREVGQVVMVCAnJywKICAgICAgICAgICAgRk9SRUlHTiBLRVkgKGRlY2tfaWQpIFJFRkVSRU5DRVMgZGVja3MoaWQpIE9OIERFTEVURSBDQVNDQURFCiAgICAgICAgKTsKCiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2RjX2RlY2tfaWQgT04gZGVja19jYXJkcyhkZWNrX2lkKTsKICAgICAgICBDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfZGNfc2NyeWZhbGxfaWQgT04gZGVja19jYXJkcyhzY3J5ZmFsbF9pZCk7CiAgICAgICAgQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X2RrX2NvbW1hbmRlciBPTiBkZWNrcyhjb21tYW5kZXJfc2NyeWZhbGxfaWQpOwogICAgIiIiKQoKICAgIGNvbm4uY29tbWl0KCkKCiAgICAjIOKUgOKUgCBNaWdyYXRpb246IGFkZCBjb2x1bW5zIHRvIGV4aXN0aW5nIERCcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIF9taWdyYXRlX2NvbHVtbnMgPSBbCiAgICAgICAgKCJtYW5hX2Nvc3QiLCAiVEVYVCBERUZBVUxUICcnIiksCiAgICAgICAgKCJwb3dlciIsICJURVhUIERFRkFVTFQgJyciKSwKICAgICAgICAoInRvdWdobmVzcyIsICJURVhUIERFRkFVTFQgJyciKSwKICAgICAgICAoInJhcml0eSIsICJURVhUIERFRkFVTFQgJyciKSwKICAgICAgICAoInNldF9uYW1lIiwgIlRFWFQgREVGQVVMVCAnJyIpLAogICAgICAgICgiZWRocmVjX3JhbmsiLCAiSU5URUdFUiBERUZBVUxUIDAiKSwKICAgIF0KICAgIGV4aXN0aW5nX2NvbHMgPSB7cm93WzFdIGZvciByb3cgaW4gY29ubi5leGVjdXRlKCJQUkFHTUEgdGFibGVfaW5mbyhjb2xsZWN0aW9uX2VudHJpZXMpIikuZmV0Y2hhbGwoKX0KICAgIGZvciBjb2xfbmFtZSwgY29sX2RlZiBpbiBfbWlncmF0ZV9jb2x1bW5zOgogICAgICAgIGlmIGNvbF9uYW1lIG5vdCBpbiBleGlzdGluZ19jb2xzOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoZiJBTFRFUiBUQUJMRSBjb2xsZWN0aW9uX2VudHJpZXMgQUREIENPTFVNTiB7Y29sX25hbWV9IHtjb2xfZGVmfSIpCiAgICAgICAgICAgIHByaW50KGYiICBNaWdyYXRpb246IGFkZGVkIGNvbHVtbiAne2NvbF9uYW1lfScgdG8gY29sbGVjdGlvbl9lbnRyaWVzIikKICAgIGNvbm4uY29tbWl0KCkKICAgIGNvbm4uY2xvc2UoKQogICAgcHJpbnQoZiIgIENvbGxlY3Rpb24gREI6IHtDT0xMRUNUSU9OX0RCX1BBVEh9IikKCgojIEZpZWxkcyBzdG9yZWQgYXMgSlNPTiBzdHJpbmdzIGluIFNRTGl0ZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBhcyBwYXJzZWQgYXJyYXlzCl9KU09OX0ZJRUxEUyA9ICgiY2F0ZWdvcnkiLCAiY29sb3JfaWRlbnRpdHkiLCAic3VidHlwZXMiLCAia2V5d29y' +
'ZHMiKQoKCmRlZiBfcm93X3RvX2RpY3Qocm93KSAtPiBkaWN0OgogICAgIiIiQ29udmVydCBhIHNxbGl0ZTMuUm93IHRvIGEgcGxhaW4gZGljdCwgcGFyc2luZyBKU09OIGFycmF5IGZpZWxkcy4iIiIKICAgIGlmIHJvdyBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBkID0gZGljdChyb3cpCiAgICBmb3IgZiBpbiBfSlNPTl9GSUVMRFM6CiAgICAgICAgaWYgZiBpbiBkIGFuZCBpc2luc3RhbmNlKGRbZl0sIHN0cik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRbZl0gPSBqc29uLmxvYWRzKGRbZl0pCiAgICAgICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgICAgICBkW2ZdID0gW10KICAgIHJldHVybiBkCgoKZGVmIF9zbmFrZV90b19jYW1lbChzOiBzdHIpIC0+IHN0cjoKICAgICIiIkNvbnZlcnQgc25ha2VfY2FzZSB0byBjYW1lbENhc2UuIiIiCiAgICBwYXJ0cyA9IHMuc3BsaXQoIl8iKQogICAgcmV0dXJuIHBhcnRzWzBdICsgIiIuam9pbihwLmNhcGl0YWxpemUoKSBmb3IgcCBpbiBwYXJ0c1sxOl0pCgoKZGVmIF9hZGRfaW1hZ2VfdXJsKGNhcmQ6IGRpY3QpIC0+IGRpY3Q6CiAgICAiIiJBZGQgaW1hZ2VVcmwgZmllbGQgYW5kIGNhbWVsQ2FzZSBhbGlhc2VzIGZvciBKUyBjb25zdW1wdGlvbi4iIiIKICAgIHNjcnlmYWxsX2lkID0gY2FyZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCiAgICBpZiBzY3J5ZmFsbF9pZDoKICAgICAgICBjYXJkWyJpbWFnZVVybCJdID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve3NjcnlmYWxsX2lkfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiCiAgICBlbHNlOgogICAgICAgIGNhcmRbImltYWdlVXJsIl0gPSBOb25lCiAgICAjIEFkZCBjYW1lbENhc2UgYWxpYXNlcyBmb3IgYWxsIHNuYWtlX2Nhc2Uga2V5cwogICAgZm9yIGtleSBpbiBsaXN0KGNhcmQua2V5cygpKToKICAgICAgICBpZiAiXyIgaW4ga2V5OgogICAgICAgICAgICBjYW1lbCA9IF9zbmFrZV90b19jYW1lbChrZXkpCiAgICAgICAgICAgIGlmIGNhbWVsIG5vdCBpbiBjYXJkOgogICAgICAgICAgICAgICAgY2FyZFtjYW1lbF0gPSBjYXJkW2tleV0KICAgIHJldHVybiBjYXJkCgoKZGVmIF9idWlsZF9jb2xsZWN0aW9uX2ZpbHRlcnMoCiAgICBxOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGNvbG9yczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICB0eXBlczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBpc0xlZ2VuZGFyeTogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNCYXNpYzogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNHYW1lQ2hhbmdlcjogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaGlnaFNhbHQ6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGZpbmlzaDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBjbWNNaW46IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBjbWNNYXg6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBwcmljZU1pbjogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIHByaWNlTWF4OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgY2F0ZWdvcnk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcmFyaXR5OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIHNldENvZGU6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAga2V5d29yZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBlZGhyZWNNaW46IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgZWRocmVjTWF4OiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHF0eU1pbjogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICBxdHlNYXg6IE9wdGlvbmFsW2ludF0gPSBOb25lLAopIC0+IHR1cGxlOgogICAgIiIiQnVpbGQgV0hFUkUgY2xhdXNlIGFuZCBwYXJhbXMgZm9yIGNvbGxlY3Rpb24gcXVlcmllcy4gUmV0dXJucyAod2hlcmVfc3RyLCBwYXJhbXNfbGlzdCkuIiIiCiAgICBjb25kaXRpb25zID0gW10KICAgIHBhcmFtcyA9IFtdCgogICAgaWYgcToKICAgICAgICBsaWtlX3EgPSBmIiV7cX0lIgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCIobmFtZSBMSUtFID8gT1IgdHlw' +
'ZV9saW5lIExJS0UgPyBPUiBvcmFjbGVfdGV4dCBMSUtFID8pIikKICAgICAgICBwYXJhbXMuZXh0ZW5kKFtsaWtlX3EsIGxpa2VfcSwgbGlrZV9xXSkKCiAgICBpZiBjb2xvcnM6CiAgICAgICAgY29sb3JfbGlzdCA9IFtjLnN0cmlwKCkudXBwZXIoKSBmb3IgYyBpbiBjb2xvcnMuc3BsaXQoIiwiKSBpZiBjLnN0cmlwKCldCiAgICAgICAgZm9yIGNvbG9yIGluIGNvbG9yX2xpc3Q6CiAgICAgICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJjb2xvcl9pZGVudGl0eSBMSUtFID8iKQogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKGYnJSJ7Y29sb3J9IiUnKQoKICAgIGlmIHR5cGVzOgogICAgICAgIHR5cGVfbGlzdCA9IFt0LnN0cmlwKCkgZm9yIHQgaW4gdHlwZXMuc3BsaXQoIiwiKSBpZiB0LnN0cmlwKCldCiAgICAgICAgdHlwZV9jb25kaXRpb25zID0gW10KICAgICAgICBmb3IgdCBpbiB0eXBlX2xpc3Q6CiAgICAgICAgICAgIHR5cGVfY29uZGl0aW9ucy5hcHBlbmQoInR5cGVfbGluZSBMSUtFID8iKQogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKGYiJXt0fSUiKQogICAgICAgIGlmIHR5cGVfY29uZGl0aW9uczoKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoZiIoeycgT1IgJy5qb2luKHR5cGVfY29uZGl0aW9ucyl9KSIpCgogICAgaWYgaXNMZWdlbmRhcnkgaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImlzX2xlZ2VuZGFyeSA9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoMSBpZiBpc0xlZ2VuZGFyeSBlbHNlIDApCgogICAgaWYgaXNCYXNpYyBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiaXNfYmFzaWMgPSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKDEgaWYgaXNCYXNpYyBlbHNlIDApCgogICAgaWYgaXNHYW1lQ2hhbmdlciBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiaXNfZ2FtZV9jaGFuZ2VyID0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZCgxIGlmIGlzR2FtZUNoYW5nZXIgZWxzZSAwKQoKICAgIGlmIGhpZ2hTYWx0OgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJzYWx0X3Njb3JlID4gMi4wIikKCiAgICBpZiBmaW5pc2g6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImZpbmlzaCA9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoZmluaXNoLnVwcGVyKCkpCgogICAgaWYgY21jTWluIGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJjbWMgPj0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChjbWNNaW4pCgogICAgaWYgY21jTWF4IGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJjbWMgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChjbWNNYXgpCgogICAgaWYgcHJpY2VNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoInRjZ19wcmljZSA+PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKHByaWNlTWluKQoKICAgIGlmIHByaWNlTWF4IGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJ0Y2dfcHJpY2UgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChwcmljZU1heCkKCiAgICBpZiBjYXRlZ29yeToKICAgICAgICBjYXRfbGlzdCA9IFtjLnN0cmlwKCkgZm9yIGMgaW4gY2F0ZWdvcnkuc3BsaXQoIiwiKSBpZiBjLnN0cmlwKCldCiAgICAgICAgY2F0X2NvbmRpdGlvbnMgPSBbXQogICAgICAgIGZvciBjIGluIGNhdF9saXN0OgogICAgICAgICAgICBjYXRfY29uZGl0aW9ucy5hcHBlbmQoImNhdGVnb3J5IExJS0UgPyIpCiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoZiclIntjfSIlJykKICAgICAgICBpZiBjYXRfY29uZGl0aW9uczoKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoZiIoeycgT1IgJy5qb2luKGNhdF9jb25kaXRpb25zKX0pIikKCiAgICAjIOKUgOKUgCBOZXcgZmlsdGVycyDilIDilIAKCiAgICBpZiByYXJpdHk6CiAgICAgICAgcmFyX2xpc3QgPSBbci5zdHJpcCgpLmxvd2VyKCkgZm9yIHIgaW4gcmFyaXR5LnNwbGl0KCIsIikgaWYgci5zdHJpcCgpXQogICAgICAgIGlmIHJhcl9saXN0OgogICAgICAgICAgICBwbGFjZWhvbGRlcnMgPSAiLCIuam9pbihbIj8iXSAqIGxlbihyYXJfbGlzdCkpCiAgICAgICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKGYiTE9XRVIocmFyaXR5KSBJTiAoe3BsYWNlaG9sZGVyc30pIikKICAgICAgICAgICAgcGFyYW1zLmV4dGVuZChyYXJfbGlzdCkKCiAgICBpZiBzZXRDb2RlOgogICAgICAgIHNldF9s' +
'aXN0ID0gW3Muc3RyaXAoKS51cHBlcigpIGZvciBzIGluIHNldENvZGUuc3BsaXQoIiwiKSBpZiBzLnN0cmlwKCldCiAgICAgICAgaWYgc2V0X2xpc3Q6CiAgICAgICAgICAgIHBsYWNlaG9sZGVycyA9ICIsIi5qb2luKFsiPyJdICogbGVuKHNldF9saXN0KSkKICAgICAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoZiJVUFBFUihzZXRfY29kZSkgSU4gKHtwbGFjZWhvbGRlcnN9KSIpCiAgICAgICAgICAgIHBhcmFtcy5leHRlbmQoc2V0X2xpc3QpCgogICAgaWYgcG93ZXJNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIkNBU1QocG93ZXIgQVMgUkVBTCkgPj0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChmbG9hdChwb3dlck1pbikpCgogICAgaWYgcG93ZXJNYXggaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIkNBU1QocG93ZXIgQVMgUkVBTCkgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChmbG9hdChwb3dlck1heCkpCgogICAgaWYgdG91Z2hNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoIkNBU1QodG91Z2huZXNzIEFTIFJFQUwpID49ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoZmxvYXQodG91Z2hNaW4pKQoKICAgIGlmIHRvdWdoTWF4IGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJDQVNUKHRvdWdobmVzcyBBUyBSRUFMKSA8PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKGZsb2F0KHRvdWdoTWF4KSkKCiAgICBpZiBrZXl3b3JkOgogICAgICAgIGt3X2xpc3QgPSBbay5zdHJpcCgpIGZvciBrIGluIGtleXdvcmQuc3BsaXQoIiwiKSBpZiBrLnN0cmlwKCldCiAgICAgICAgZm9yIGt3IGluIGt3X2xpc3Q6CiAgICAgICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJrZXl3b3JkcyBMSUtFID8iKQogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKGYiJXtrd30lIikKCiAgICBpZiBlZGhyZWNNaW4gaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoImVkaHJlY19yYW5rID49ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQoZWRocmVjTWluKQoKICAgIGlmIGVkaHJlY01heCBpcyBub3QgTm9uZToKICAgICAgICBjb25kaXRpb25zLmFwcGVuZCgiZWRocmVjX3JhbmsgPD0gPyIpCiAgICAgICAgcGFyYW1zLmFwcGVuZChlZGhyZWNNYXgpCgogICAgaWYgcXR5TWluIGlzIG5vdCBOb25lOgogICAgICAgIGNvbmRpdGlvbnMuYXBwZW5kKCJxdWFudGl0eSA+PSA/IikKICAgICAgICBwYXJhbXMuYXBwZW5kKHF0eU1pbikKCiAgICBpZiBxdHlNYXggaXMgbm90IE5vbmU6CiAgICAgICAgY29uZGl0aW9ucy5hcHBlbmQoInF1YW50aXR5IDw9ID8iKQogICAgICAgIHBhcmFtcy5hcHBlbmQocXR5TWF4KQoKICAgIHdoZXJlX3N0ciA9ICIiCiAgICBpZiBjb25kaXRpb25zOgogICAgICAgIHdoZXJlX3N0ciA9ICJXSEVSRSAiICsgIiBBTkQgIi5qb2luKGNvbmRpdGlvbnMpCgogICAgcmV0dXJuIHdoZXJlX3N0ciwgcGFyYW1zCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2xsZWN0aW9uIENSVUQgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpWQUxJRF9TT1JUX0ZJRUxEUyA9IHsibmFtZSIsICJjbWMiLCAidGNnX3ByaWNlIiwgInNhbHRfc2NvcmUiLCAiY2F0ZWdvcnkiLCAiY29sb3JfaWRlbnRpdHkiLCAicXVhbnRpdHkiLCAidHlwZV9saW5lIiwgImZpbmlzaCIsICJyYXJpdHkiLCAic2V0X2NvZGUiLCAicG93ZXIiLCAidG91Z2huZXNzIiwgImVkaHJlY19yYW5rIn0KCgpAYXBwLmdldCgiL2FwaS9jb2xsZWN0aW9uL2V4cG9ydCIpCmFzeW5jIGRlZiBleHBvcnRfY29sbGVjdGlvbigKICAgIGZvcm1hdDogc3RyID0gIklOVEVSTkFMX0NTViIsCiAgICBxOiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGNvbG9yczogT3B0aW9uYWxbc3Ry' +
'XSA9IE5vbmUsCiAgICB0eXBlczogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBpc0xlZ2VuZGFyeTogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNCYXNpYzogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaXNHYW1lQ2hhbmdlcjogT3B0aW9uYWxbYm9vbF0gPSBOb25lLAogICAgaGlnaFNhbHQ6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGZpbmlzaDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBjbWNNaW46IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBjbWNNYXg6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBwcmljZU1pbjogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIHByaWNlTWF4OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgY2F0ZWdvcnk6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAopOgogICAgIiIiRXhwb3J0IGNvbGxlY3Rpb24gaW4gdmFyaW91cyBmb3JtYXRzIHdpdGggb3B0aW9uYWwgZmlsdGVycy4iIiIKICAgIHdoZXJlX3N0ciwgcGFyYW1zID0gX2J1aWxkX2NvbGxlY3Rpb25fZmlsdGVycygKICAgICAgICBxPXEsIGNvbG9ycz1jb2xvcnMsIHR5cGVzPXR5cGVzLCBpc0xlZ2VuZGFyeT1pc0xlZ2VuZGFyeSwKICAgICAgICBpc0Jhc2ljPWlzQmFzaWMsIGlzR2FtZUNoYW5nZXI9aXNHYW1lQ2hhbmdlciwgaGlnaFNhbHQ9aGlnaFNhbHQsCiAgICAgICAgZmluaXNoPWZpbmlzaCwgY21jTWluPWNtY01pbiwgY21jTWF4PWNtY01heCwKICAgICAgICBwcmljZU1pbj1wcmljZU1pbiwgcHJpY2VNYXg9cHJpY2VNYXgsIGNhdGVnb3J5PWNhdGVnb3J5LAogICAgKQoKICAgIHNxbCA9IGYiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMge3doZXJlX3N0cn0gT1JERVIgQlkgbmFtZSBBU0MiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBbX3Jvd190b19kaWN0KHIpIGZvciByIGluIGNvbm4uZXhlY3V0ZShzcWwsIHBhcmFtcykuZmV0Y2hhbGwoKV0KCiAgICBmbXQgPSBmb3JtYXQudXBwZXIoKQogICAgb3V0cHV0ID0gaW8uU3RyaW5nSU8oKQoKICAgIGlmIGZtdCA9PSAiSU5URVJOQUxfQ1NWIjoKICAgICAgICBpZiByb3dzOgogICAgICAgICAgICBmaWVsZG5hbWVzID0gbGlzdChyb3dzWzBdLmtleXMoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWVsZG5hbWVzID0gWwogICAgICAgICAgICAgICAgImlkIiwgIm5hbWUiLCAidHlwZV9saW5lIiwgInN1YnR5cGVzIiwgImlzX2xlZ2VuZGFyeSIsICJpc19iYXNpYyIsCiAgICAgICAgICAgICAgICAiY29sb3JfaWRlbnRpdHkiLCAiY21jIiwgIm9yYWNsZV90ZXh0IiwgImtleXdvcmRzIiwgInRjZ19wcmljZSIsCiAgICAgICAgICAgICAgICAic2FsdF9zY29yZSIsICJpc19nYW1lX2NoYW5nZXIiLCAiY2F0ZWdvcnkiLCAic2NyeWZhbGxfaWQiLCAidGNncGxheWVyX2lkIiwKICAgICAgICAgICAgICAgICJxdWFudGl0eSIsICJmaW5pc2giLCAiY29uZGl0aW9uIiwgImxhbmd1YWdlIiwgIm5vdGVzIiwgInRhZ3MiLAogICAgICAgICAgICAgICAgInNldF9jb2RlIiwgImNvbGxlY3Rvcl9udW1iZXIiLCAiY3JlYXRlZF9hdCIsICJ1cGRhdGVkX2F0IiwKICAgICAgICAgICAgXQogICAgICAgIHdyaXRlciA9IGNzdi5EaWN0V3JpdGVyKG91dHB1dCwgZmllbGRuYW1lcz1maWVsZG5hbWVzKQogICAgICAgIHdyaXRlci53cml0ZWhlYWRlcigpCiAgICAgICAgd3JpdGVyLndyaXRlcm93cyhyb3dzKQogICAgICAgIGZpbGVuYW1lID0gImNvbGxlY3Rpb25fZXhwb3J0LmNzdiIKICAgICAgICBtZWRpYV90eXBlID0gInRleHQvY3N2IgoKICAgIGVsaWYgZm10ID09ICJNT1hGSUVMRF9DU1YiOgogICAgICAgIGZpZWxkbmFtZXMgPSBbIkNvdW50IiwgIk5hbWUiLCAiRWRpdGlvbiIsICJDb25kaXRpb24iLCAiTGFuZ3VhZ2UiLCAiRm9pbCIsICJDb2xsZWN0b3IgTnVtYmVyIl0KICAgICAgICB3cml0ZXIgPSBjc3YuRGljdFdyaXRlcihvdXRwdXQsIGZpZWxkbmFtZXM9ZmllbGRuYW1lcykKICAgICAgICB3cml0ZXIud3JpdGVoZWFkZXIoKQogICAgICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICAgICAgZmluaXNoX3ZhbCA9IHJvdy5nZXQoImZpbmlzaCIsICJOT1JNQUwiKS51cHBlcigpCiAgICAgICAgICAgIGZvaWxfdmFsID0gImZvaWwiIGlmIGZpbmlzaF92YWwgPT0gIkZPSUwiIGVsc2UgKCJldGNoZWQiIGlmIGZpbmlzaF92YWwgPT0gIkVUQ0hFRCIgZWxzZSAiIikKICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHsKICAgICAgICAg' +
'ICAgICAgICJDb3VudCI6IHJvdy5nZXQoInF1YW50aXR5IiwgMSksCiAgICAgICAgICAgICAgICAiTmFtZSI6IHJvdy5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgICAgICAgICAiRWRpdGlvbiI6IHJvdy5nZXQoInNldF9jb2RlIiwgIiIpLnVwcGVyKCksCiAgICAgICAgICAgICAgICAiQ29uZGl0aW9uIjogcm93LmdldCgiY29uZGl0aW9uIiwgIiIpLAogICAgICAgICAgICAgICAgIkxhbmd1YWdlIjogcm93LmdldCgibGFuZ3VhZ2UiLCAiIiksCiAgICAgICAgICAgICAgICAiRm9pbCI6IGZvaWxfdmFsLAogICAgICAgICAgICAgICAgIkNvbGxlY3RvciBOdW1iZXIiOiByb3cuZ2V0KCJjb2xsZWN0b3JfbnVtYmVyIiwgIiIpLAogICAgICAgICAgICB9KQogICAgICAgIGZpbGVuYW1lID0gImNvbGxlY3Rpb25fbW94ZmllbGQuY3N2IgogICAgICAgIG1lZGlhX3R5cGUgPSAidGV4dC9jc3YiCgogICAgZWxpZiBmbXQgPT0gIlRFWFQiOgogICAgICAgIGxpbmVzID0gW10KICAgICAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgICAgIHF0eSA9IHJvdy5nZXQoInF1YW50aXR5IiwgMSkKICAgICAgICAgICAgbmFtZSA9IHJvdy5nZXQoIm5hbWUiLCAiIikKICAgICAgICAgICAgc2V0X2NvZGUgPSByb3cuZ2V0KCJzZXRfY29kZSIsICIiKS51cHBlcigpCiAgICAgICAgICAgIGNvbGxfbnVtID0gcm93LmdldCgiY29sbGVjdG9yX251bWJlciIsICIiKQogICAgICAgICAgICBpZiBzZXRfY29kZSBhbmQgY29sbF9udW06CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0gKHtzZXRfY29kZX0pIHtjb2xsX251bX0iKQogICAgICAgICAgICBlbGlmIHNldF9jb2RlOgogICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGYie3F0eX0ge25hbWV9ICh7c2V0X2NvZGV9KSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0iKQogICAgICAgIG91dHB1dC53cml0ZSgiXG4iLmpvaW4obGluZXMpKQogICAgICAgIGZpbGVuYW1lID0gImNvbGxlY3Rpb25fZXhwb3J0LnR4dCIKICAgICAgICBtZWRpYV90eXBlID0gInRleHQvcGxhaW4iCgogICAgZWxzZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgZiJVbmtub3duIGZvcm1hdDoge2Zvcm1hdH0uIFVzZSBJTlRFUk5BTF9DU1YsIE1PWEZJRUxEX0NTViwgb3IgVEVYVC4iKQoKICAgIGNvbnRlbnQgPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgIGRlZiBpdGVyX2NvbnRlbnQoKToKICAgICAgICB5aWVsZCBjb250ZW50LmVuY29kZSgidXRmLTgiKQoKICAgIHJldHVybiBTdHJlYW1pbmdSZXNwb25zZSgKICAgICAgICBpdGVyX2NvbnRlbnQoKSwKICAgICAgICBtZWRpYV90eXBlPW1lZGlhX3R5cGUsCiAgICAgICAgaGVhZGVycz17IkNvbnRlbnQtRGlzcG9zaXRpb24iOiBmJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ7ZmlsZW5hbWV9Iid9LAogICAgKQoKCkBhcHAuZ2V0KCIvYXBpL2NvbGxlY3Rpb24vc2V0cyIpCmFzeW5jIGRlZiBjb2xsZWN0aW9uX3NldHMoKToKICAgICIiIlJldHVybiBkaXN0aW5jdCBzZXQgY29kZXMgKyBuYW1lcyBpbiB0aGUgY29sbGVjdGlvbiAoZm9yIGZpbHRlciBhdXRvY29tcGxldGUpLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgRElTVElOQ1QgVVBQRVIoc2V0X2NvZGUpIGFzIGNvZGUsIHNldF9uYW1lIGFzIG5hbWUgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgc2V0X2NvZGUgIT0gJycgT1JERVIgQlkgc2V0X25hbWUgQVNDIgogICAgKS5mZXRjaGFsbCgpCiAgICByZXN1bHQgPSBbXQogICAgZm9yIHIgaW4gcm93czoKICAgICAgICBjb2RlID0gclsiY29kZSJdIGlmICJjb2RlIiBpbiByLmtleXMoKSBlbHNlIHJbMF0KICAgICAgICBuYW1lID0gclsibmFtZSJdIGlmICJuYW1lIiBpbiByLmtleXMoKSBlbHNlIHJbMV0KICAgICAgICBpZiBjb2RlOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKHsiY29kZSI6IGNvZGUsICJuYW1lIjogbmFtZSBvciBjb2RlfSkKICAgIHJldHVybiBKU09OUmVzcG9uc2UocmVzdWx0KQoKCkBhcHAuZ2V0KCIvYXBpL2NvbGxlY3Rpb24va2V5d29yZHMiKQphc3luYyBkZWYgY29sbGVjdGlvbl9rZXl3b3JkcygpOgogICAgIiIiUmV0dXJuIGRpc3RpbmN0IGtleXdvcmRzIGZvdW5kIGluIHRoZSBjb2xsZWN0aW9uLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3dzID0g' +
'Y29ubi5leGVjdXRlKCJTRUxFQ1Qga2V5d29yZHMgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUga2V5d29yZHMgIT0gJycgQU5EIGtleXdvcmRzICE9ICdbXSciKS5mZXRjaGFsbCgpCiAgICBrd19zZXQgPSBzZXQoKQogICAgZm9yIHIgaW4gcm93czoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGt3cyA9IGpzb24ubG9hZHMoclsia2V5d29yZHMiXSkgaWYgaXNpbnN0YW5jZShyWyJrZXl3b3JkcyJdLCBzdHIpIGVsc2Ugclsia2V5d29yZHMiXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3cywgbGlzdCk6CiAgICAgICAgICAgICAgICBmb3IgayBpbiBrd3M6CiAgICAgICAgICAgICAgICAgICAgaWYgazoKICAgICAgICAgICAgICAgICAgICAgICAga3dfc2V0LmFkZChrKQogICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBKU09OUmVzcG9uc2Uoc29ydGVkKGt3X3NldCkpCgoKQGFwcC5nZXQoIi9hcGkvY29sbGVjdGlvbiIpCmFzeW5jIGRlZiBsaXN0X2NvbGxlY3Rpb24oCiAgICBwYWdlOiBpbnQgPSAxLAogICAgcGFnZVNpemU6IGludCA9IDUwLAogICAgcTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBzb3J0RmllbGQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgc29ydERpcjogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBjb2xvcnM6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdHlwZXM6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgaXNMZWdlbmRhcnk6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGlzQmFzaWM6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGlzR2FtZUNoYW5nZXI6IE9wdGlvbmFsW2Jvb2xdID0gTm9uZSwKICAgIGhpZ2hTYWx0OiBPcHRpb25hbFtib29sXSA9IE5vbmUsCiAgICBmaW5pc2g6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgY21jTWluOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgY21jTWF4OiBPcHRpb25hbFtmbG9hdF0gPSBOb25lLAogICAgcHJpY2VNaW46IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUsCiAgICBwcmljZU1heDogT3B0aW9uYWxbZmxvYXRdID0gTm9uZSwKICAgIGNhdGVnb3J5OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIGRlY2tfaWQ6IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgcmFyaXR5OiBPcHRpb25hbFtzdHJdID0gTm9uZSwKICAgIHNldENvZGU6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgcG93ZXJNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNaW46IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgdG91Z2hNYXg6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAga2V5d29yZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBlZGhyZWNNaW46IE9wdGlvbmFsW2ludF0gPSBOb25lLAogICAgZWRocmVjTWF4OiBPcHRpb25hbFtpbnRdID0gTm9uZSwKICAgIHF0eU1pbjogT3B0aW9uYWxbaW50XSA9IE5vbmUsCiAgICBxdHlNYXg6IE9wdGlvbmFsW2ludF0gPSBOb25lLAopOgogICAgIiIiTGlzdCBjb2xsZWN0aW9uIGVudHJpZXMgd2l0aCBzZWFyY2gsIHNvcnQsIGFuZCBmaWx0ZXIuCiAgICBPcHRpb25hbCBkZWNrX2lkOiB3aGVuIHByb3ZpZGVkLCBpbmNsdWRlcyBpbl9kZWNrX3F1YW50aXR5IGZvciBlYWNoIHJlc3VsdC4KICAgICIiIgogICAgd2hlcmVfc3RyLCBwYXJhbXMgPSBfYnVpbGRfY29sbGVjdGlvbl9maWx0ZXJzKAogICAgICAgIHE9cSwgY29sb3JzPWNvbG9ycywgdHlwZXM9dHlwZXMsIGlzTGVnZW5kYXJ5PWlzTGVnZW5kYXJ5LAogICAgICAgIGlzQmFzaWM9aXNCYXNpYywgaXNHYW1lQ2hhbmdlcj1pc0dhbWVDaGFuZ2VyLCBoaWdoU2FsdD1oaWdoU2FsdCwKICAgICAgICBmaW5pc2g9ZmluaXNoLCBjbWNNaW49Y21jTWluLCBjbWNNYXg9Y21jTWF4LAogICAgICAgIHByaWNlTWluPXByaWNlTWluLCBwcmljZU1heD1wcmljZU1heCwgY2F0ZWdvcnk9Y2F0ZWdvcnksCiAgICAgICAgcmFyaXR5PXJhcml0eSwgc2V0Q29kZT1zZXRDb2RlLCBwb3dlck1pbj1wb3dlck1pbiwgcG93ZXJNYXg9cG93ZXJNYXgsCiAgICAgICAgdG91Z2hNaW49dG91Z2hNaW4sIHRvdWdoTWF4PXRvdWdoTWF4LCBrZXl3b3JkPWtleXdvcmQsCiAgICAgICAgZWRocmVjTWluPWVkaHJlY01pbiwgZWRocmVjTWF4PWVkaHJlY01heCwgcXR5TWluPXF0eU1pbiwgcXR5TWF4PXF0eU1heCwKICAgICkK' +
'CiAgICAjIFZhbGlkYXRlIHNvcnQKICAgIHNvcnRfZmllbGQgPSBzb3J0RmllbGQgaWYgc29ydEZpZWxkIGluIFZBTElEX1NPUlRfRklFTERTIGVsc2UgIm5hbWUiCiAgICBzb3J0X2RpciA9ICJERVNDIiBpZiAoc29ydERpciBvciAiIikudXBwZXIoKSA9PSAiREVTQyIgZWxzZSAiQVNDIgoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgQ291bnQgdG90YWwKICAgIGNvdW50X3NxbCA9IGYiU0VMRUNUIENPVU5UKCopIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIHt3aGVyZV9zdHJ9IgogICAgdG90YWwgPSBjb25uLmV4ZWN1dGUoY291bnRfc3FsLCBwYXJhbXMpLmZldGNob25lKClbMF0KCiAgICAjIFBhZ2luYXRlCiAgICBvZmZzZXQgPSAobWF4KDEsIHBhZ2UpIC0gMSkgKiBwYWdlU2l6ZQogICAgZGF0YV9zcWwgPSBmIiIiCiAgICAgICAgU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMge3doZXJlX3N0cn0KICAgICAgICBPUkRFUiBCWSB7c29ydF9maWVsZH0ge3NvcnRfZGlyfQogICAgICAgIExJTUlUID8gT0ZGU0VUID8KICAgICIiIgogICAgcm93cyA9IGNvbm4uZXhlY3V0ZShkYXRhX3NxbCwgcGFyYW1zICsgW3BhZ2VTaXplLCBvZmZzZXRdKS5mZXRjaGFsbCgpCiAgICBpdGVtcyA9IFtfYWRkX2ltYWdlX3VybChfcm93X3RvX2RpY3QocikpIGZvciByIGluIHJvd3NdCgogICAgIyBJZiBkZWNrX2lkIHByb3ZpZGVkLCBhbm5vdGF0ZSBlYWNoIGl0ZW0gd2l0aCBob3cgbWFueSBjb3BpZXMgYXJlIGFscmVhZHkgaW4gdGhhdCBkZWNrCiAgICBpZiBkZWNrX2lkIGlzIG5vdCBOb25lOgogICAgICAgICMgQnVpbGQgYSBtYXAgb2Ygc2NyeWZhbGxfaWQgLT4gcXVhbnRpdHkgaW4gZGVjawogICAgICAgIGRlY2tfY2FyZF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIHNjcnlmYWxsX2lkLCBTVU0ocXVhbnRpdHkpIGFzIHF0eSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gR1JPVVAgQlkgc2NyeWZhbGxfaWQiLAogICAgICAgICAgICAoZGVja19pZCwpCiAgICAgICAgKS5mZXRjaGFsbCgpCiAgICAgICAgaW5fZGVja19tYXAgPSB7cm93WyJzY3J5ZmFsbF9pZCJdOiByb3dbInF0eSJdIGZvciByb3cgaW4gZGVja19jYXJkX3Jvd3N9CiAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgIGl0ZW1bImluX2RlY2tfcXVhbnRpdHkiXSA9IGluX2RlY2tfbWFwLmdldChpdGVtLmdldCgic2NyeWZhbGxfaWQiLCAiIiksIDApCgogICAgcmV0dXJuIHsiaXRlbXMiOiBpdGVtcywgInBhZ2UiOiBwYWdlLCAicGFnZVNpemUiOiBwYWdlU2l6ZSwgInRvdGFsIjogdG90YWx9CgoKQGFwcC5nZXQoIi9hcGkvY29sbGVjdGlvbi97Y2FyZElkfSIpCmFzeW5jIGRlZiBnZXRfY29sbGVjdGlvbl9jYXJkKGNhcmRJZDogaW50KToKICAgICIiIkdldCBhIHNpbmdsZSBjb2xsZWN0aW9uIGVudHJ5IGJ5IElELiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIGlkID0gPyIsIChjYXJkSWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJDYXJkIHdpdGggaWQge2NhcmRJZH0gbm90IGZvdW5kIikKICAgIHJldHVybiBfYWRkX2ltYWdlX3VybChfcm93X3RvX2RpY3Qocm93KSkKCgpAYXBwLnBhdGNoKCIvYXBpL2NvbGxlY3Rpb24ve2NhcmRJZH0iKQphc3luYyBkZWYgdXBkYXRlX2NvbGxlY3Rpb25fY2FyZChjYXJkSWQ6IGludCwgYm9keTogZGljdCk6CiAgICAiIiJVcGRhdGUgbXV0YWJsZSBmaWVsZHMgb2YgYSBjb2xsZWN0aW9uIGVudHJ5LiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIGlkID0gPyIsIChjYXJkSWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJDYXJkIHdpdGggaWQge2NhcmRJZH0gbm90IGZvdW5kIikKCiAgICB1cGRhdGVzID0ge30KICAgIGlmICJjYXRlZ29yeSIgaW4gYm9keToKICAgICAgICBjYXQgPSBib2R5WyJjYXRlZ29yeSJdCiAgICAgICAgaWYgaXNpbnN0YW5jZShjYXQsIGxpc3QpOgogICAgICAgICAgICB1cGRhdGVzWyJjYXRlZ29yeSJdID0ganNvbi5kdW1wcyhjYXQpCiAgICAgICAgZWxzZToKICAgICAgICAg' +
'ICAgdXBkYXRlc1siY2F0ZWdvcnkiXSA9IGNhdAogICAgaWYgInRhZ3MiIGluIGJvZHk6CiAgICAgICAgdXBkYXRlc1sidGFncyJdID0gc3RyKGJvZHlbInRhZ3MiXSkKICAgIGlmICJub3RlcyIgaW4gYm9keToKICAgICAgICB1cGRhdGVzWyJub3RlcyJdID0gc3RyKGJvZHlbIm5vdGVzIl0pCiAgICBpZiAiZmluaXNoIiBpbiBib2R5OgogICAgICAgIGZpbmlzaF92YWwgPSBzdHIoYm9keVsiZmluaXNoIl0pLnVwcGVyKCkKICAgICAgICBpZiBmaW5pc2hfdmFsIG5vdCBpbiAoIk5PUk1BTCIsICJGT0lMIiwgIkVUQ0hFRCIpOgogICAgICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgImZpbmlzaCBtdXN0IGJlIE5PUk1BTCwgRk9JTCwgb3IgRVRDSEVEIikKICAgICAgICB1cGRhdGVzWyJmaW5pc2giXSA9IGZpbmlzaF92YWwKCiAgICBpZiBub3QgdXBkYXRlczoKICAgICAgICByZXR1cm4gX2FkZF9pbWFnZV91cmwoX3Jvd190b19kaWN0KHJvdykpCgogICAgdXBkYXRlc1sidXBkYXRlZF9hdCJdID0gZGF0ZXRpbWUudXRjbm93KCkuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIikKICAgIHNldF9jbGF1c2UgPSAiLCAiLmpvaW4oZiJ7a30gPSA/IiBmb3IgayBpbiB1cGRhdGVzKQogICAgdmFsdWVzID0gbGlzdCh1cGRhdGVzLnZhbHVlcygpKSArIFtjYXJkSWRdCiAgICBjb25uLmV4ZWN1dGUoZiJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVCB7c2V0X2NsYXVzZX0gV0hFUkUgaWQgPSA/IiwgdmFsdWVzKQogICAgY29ubi5jb21taXQoKQoKICAgIHVwZGF0ZWRfcm93ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBpZCA9ID8iLCAoY2FyZElkLCkpLmZldGNob25lKCkKICAgIHJldHVybiBfYWRkX2ltYWdlX3VybChfcm93X3RvX2RpY3QodXBkYXRlZF9yb3cpKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ29sbGVjdGlvbiBJbXBvcnQgSGVscGVycwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBTY3J5ZmFsbCByYXRlLWxpbWl0IHNlbWFwaG9yZSAobWF4IDEwIHJlcS9zZWMpCl9zY3J5ZmFsbF9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQpfc2NyeWZhbGxfbGFzdF9jYWxsID0gMC4wCgoKZGVmIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCk6CiAgICAiIiJFbmZvcmNlIGF0IG1vc3QgMTAgU2NyeWZhbGwgcmVxdWVzdHMgcGVyIHNlY29uZCB2aWEgc2ltcGxlIHNsZWVwLiIiIgogICAgZ2xvYmFsIF9zY3J5ZmFsbF9sYXN0X2NhbGwKICAgIHdpdGggX3NjcnlmYWxsX2xvY2s6CiAgICAgICAgbm93ID0gdGltZS5tb25vdG9uaWMoKQogICAgICAgIGVsYXBzZWQgPSBub3cgLSBfc2NyeWZhbGxfbGFzdF9jYWxsCiAgICAgICAgaWYgZWxhcHNlZCA8IDAuMToKICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEgLSBlbGFwc2VkKQogICAgICAgIF9zY3J5ZmFsbF9sYXN0X2NhbGwgPSB0aW1lLm1vbm90b25pYygpCgoKZGVmIF9wYXJzZV9maW5pc2gocmF3OiBzdHIpIC0+IHN0cjoKICAgICIiIk5vcm1hbGl6ZSBmaW5pc2ggc3RyaW5nIHRvIE5PUk1BTHxGT0lMfEVUQ0hFRC4iIiIKICAgIGlmIG5vdCByYXc6CiAgICAgICAgcmV0dXJuICJOT1JNQUwiCiAgICByID0gcmF3LnN0cmlwKCkubG93ZXIoKQogICAgaWYgciBpbiAoImV0Y2hlZCIsICJmb2lsIGV0Y2hlZCIsICJmb2lsX2V0Y2hlZCIsICJldGNoZWQgZm9pbCIpOgogICAgICAgIHJldHVybiAiRVRDSEVEIgogICAgaWYgciBpbiAoInllcyIsICJmb2lsIiwgInRydWUiLCAiMSIpOgogICAgICAgIHJldHVybiAiRk9JTCIKICAgIHJldHVybiAiTk9STUFMIgoKCmRlZiBfcGFyc2VfdGV4dF9saW5lKGxpbmU6IHN0cikgLT4gZGljdDoKICAgICIiIgogICAgUGFyc2UgYSB0ZXh0IGltcG9ydCBsaW5lIGludG8ge25hbWUsIHF1YW50aXR5LCBzZXRfY29kZSwgY29sbGVj' +
'dG9yX251bWJlcn0uCiAgICBTdXBwb3J0cyBmb3JtYXRzOgogICAgICAtICIzIFNvbCBSaW5nIChDTVIpIDEyMyIKICAgICAgLSAiMXggU29sIFJpbmcgKENNUikiCiAgICAgIC0gIlNvbCBSaW5nIFtDTVI6MTIzXSIKICAgICAgLSAiMSBTb2wgUmluZyIKICAgICIiIgogICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCIjIikgb3IgbGluZS5zdGFydHN3aXRoKCIvLyIpOgogICAgICAgIHJldHVybiB7fQoKICAgIHJlc3VsdCA9IHsibmFtZSI6ICIiLCAicXVhbnRpdHkiOiAxLCAic2V0X2NvZGUiOiAiIiwgImNvbGxlY3Rvcl9udW1iZXIiOiAiIn0KCiAgICAjIFN0cmlwIHF1YW50aXR5IHByZWZpeAogICAgcXR5X21hdGNoID0gcmUubWF0Y2gociJeKFxkKyl4P1xzKyIsIGxpbmUpCiAgICBpZiBxdHlfbWF0Y2g6CiAgICAgICAgcmVzdWx0WyJxdWFudGl0eSJdID0gaW50KHF0eV9tYXRjaC5ncm91cCgxKSkKICAgICAgICBsaW5lID0gbGluZVtxdHlfbWF0Y2guZW5kKCk6XQoKICAgICMgRm9ybWF0OiAiTmFtZSBbU0VUOkNvbGxOdW1dIgogICAgYnJhY2tldF9tYXRjaCA9IHJlLnNlYXJjaChyIlxbKFtBLVphLXowLTldKyk6KFxTKylcXVxzKiQiLCBsaW5lKQogICAgaWYgYnJhY2tldF9tYXRjaDoKICAgICAgICByZXN1bHRbInNldF9jb2RlIl0gPSBicmFja2V0X21hdGNoLmdyb3VwKDEpLmxvd2VyKCkKICAgICAgICByZXN1bHRbImNvbGxlY3Rvcl9udW1iZXIiXSA9IGJyYWNrZXRfbWF0Y2guZ3JvdXAoMikKICAgICAgICBsaW5lID0gbGluZVs6YnJhY2tldF9tYXRjaC5zdGFydCgpXS5zdHJpcCgpCiAgICAgICAgcmVzdWx0WyJuYW1lIl0gPSBsaW5lCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICMgRm9ybWF0OiAiTmFtZSAoU0VUKSBDb2xsTnVtIgogICAgcGFyZW5fY29sbF9tYXRjaCA9IHJlLnNlYXJjaChyIlwoKFtBLVphLXowLTldKylcKVxzKyhcUyspXHMqJCIsIGxpbmUpCiAgICBpZiBwYXJlbl9jb2xsX21hdGNoOgogICAgICAgIHJlc3VsdFsic2V0X2NvZGUiXSA9IHBhcmVuX2NvbGxfbWF0Y2guZ3JvdXAoMSkubG93ZXIoKQogICAgICAgIHJlc3VsdFsiY29sbGVjdG9yX251bWJlciJdID0gcGFyZW5fY29sbF9tYXRjaC5ncm91cCgyKQogICAgICAgIGxpbmUgPSBsaW5lWzpwYXJlbl9jb2xsX21hdGNoLnN0YXJ0KCldLnN0cmlwKCkKICAgICAgICByZXN1bHRbIm5hbWUiXSA9IGxpbmUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgIyBGb3JtYXQ6ICJOYW1lIChTRVQpIgogICAgcGFyZW5fbWF0Y2ggPSByZS5zZWFyY2gociJcKChbQS1aYS16MC05XSspXClccyokIiwgbGluZSkKICAgIGlmIHBhcmVuX21hdGNoOgogICAgICAgIHJlc3VsdFsic2V0X2NvZGUiXSA9IHBhcmVuX21hdGNoLmdyb3VwKDEpLmxvd2VyKCkKICAgICAgICBsaW5lID0gbGluZVs6cGFyZW5fbWF0Y2guc3RhcnQoKV0uc3RyaXAoKQogICAgICAgIHJlc3VsdFsibmFtZSJdID0gbGluZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICByZXN1bHRbIm5hbWUiXSA9IGxpbmUuc3RyaXAoKQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfYXV0b19pbmZlcl9tYXBwaW5nKGhlYWRlcnM6IGxpc3QpIC0+IGRpY3Q6CiAgICAiIiIKICAgIEF1dG8taW5mZXIgY29sdW1uIOKGkiBmaWVsZCBtYXBwaW5nIGZyb20gaGVhZGVyIG5hbWVzLgogICAgUmV0dXJucyBkaWN0IG9mIHtoZWFkZXI6IGZpZWxkX2tleX0uCiAgICBGaWVsZCBrZXlzOiBuYW1lLCBxdWFudGl0eSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIsIGZpbmlzaCwgY29uZGl0aW9uLCBsYW5ndWFnZSwgbm90ZXMsIHRhZ3MKICAgICIiIgogICAgbWFwcGluZyA9IHt9CiAgICBoZWFkZXJfbG93ZXIgPSB7aDogaC5sb3dlcigpLnN0cmlwKCkgZm9yIGggaW4gaGVhZGVyc30KICAgIGZpZWxkX3BhdHRlcm5zID0gewogICAgICAgICJuYW1lIjogWyJuYW1lIiwgImNhcmQgbmFtZSIsICJjYXJkX25hbWUiLCAiY2FyZG5hbWUiLCAidGl0bGUiXSwKICAgICAgICAicXVhbnRpdHkiOiBbInF1YW50aXR5IiwgInF0eSIsICJjb3VudCIsICJhbW91bnQiLCAibnVtYmVyIiwgIiMiXSwKICAgICAgICAic2V0X2NvZGUiOiBbInNldCIsICJzZXQgY29kZSIsICJzZXRfY29kZSIsICJlZGl0aW9uIiwgInNldF9uYW1lIiwgImVkaXRpb24gY29kZSJdLAogICAgICAgICJjb2xsZWN0b3JfbnVtYmVyIjogWwogICAgICAgICAgICAiY29sbGVjdG9yIG51bWJlciIsICJjb2xsZWN0b3JfbnVt' +
'YmVyIiwgImNvbGxlY3Rvcm51bWJlciIsCiAgICAgICAgICAgICJjb2wgIyIsICJjb2wjIiwgIm51bWJlciIsICJjYXJkIG51bWJlciIsCiAgICAgICAgXSwKICAgICAgICAiZmluaXNoIjogWyJmaW5pc2giLCAiZm9pbCIsICJwcmludGluZyIsICJ0cmVhdG1lbnQiXSwKICAgICAgICAiY29uZGl0aW9uIjogWyJjb25kaXRpb24iLCAiY29uZCIsICJncmFkZSJdLAogICAgICAgICJsYW5ndWFnZSI6IFsibGFuZ3VhZ2UiLCAibGFuZyIsICJsb2NhbGUiXSwKICAgICAgICAibm90ZXMiOiBbIm5vdGVzIiwgIm5vdGUiLCAiY29tbWVudHMiLCAiY29tbWVudCJdLAogICAgICAgICJ0YWdzIjogWyJ0YWdzIiwgInRhZyIsICJsYWJlbHMiLCAibGFiZWwiXSwKICAgIH0KICAgIGZvciBoZWFkZXIsIGxvd2VyX2ggaW4gaGVhZGVyX2xvd2VyLml0ZW1zKCk6CiAgICAgICAgZm9yIGZpZWxkLCBwYXR0ZXJucyBpbiBmaWVsZF9wYXR0ZXJucy5pdGVtcygpOgogICAgICAgICAgICBpZiBsb3dlcl9oIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgbWFwcGluZ1toZWFkZXJdID0gZmllbGQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICByZXR1cm4gbWFwcGluZwoKCmRlZiBfcGFyc2VfY3N2X2NvbnRlbnQoY29udGVudDogc3RyLCBzb3VyY2U6IHN0ciwgbWFwcGluZzogT3B0aW9uYWxbZGljdF0pIC0+IGxpc3Q6CiAgICAiIiIKICAgIFBhcnNlIENTVi90ZXh0IGNvbnRlbnQgaW50byBhIGxpc3Qgb2YgUmF3SW1wb3J0Um93IGRpY3RzLgogICAgUmV0dXJucyBsaXN0IG9mIGRpY3RzIHdpdGgga2V5czogbmFtZSwgcXVhbnRpdHksIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyLCBmaW5pc2gsIGNvbmRpdGlvbiwgbGFuZ3VhZ2UsIG5vdGVzLCB0YWdzCiAgICAiIiIKICAgIHJvd3MgPSBbXQogICAgc291cmNlX3VwcGVyID0gKHNvdXJjZSBvciAiIikudXBwZXIoKQoKICAgIGlmIHNvdXJjZV91cHBlciA9PSAiVEVYVCI6CiAgICAgICAgZm9yIGxpbmUgaW4gY29udGVudC5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIHBhcnNlZCA9IF9wYXJzZV90ZXh0X2xpbmUobGluZSkKICAgICAgICAgICAgaWYgcGFyc2VkLmdldCgibmFtZSIpOgogICAgICAgICAgICAgICAgcm93cy5hcHBlbmQocGFyc2VkKQogICAgICAgIHJldHVybiByb3dzCgogICAgIyBDU1YtYmFzZWQgc291cmNlcwogICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoaW8uU3RyaW5nSU8oY29udGVudCkpCiAgICBoZWFkZXJzID0gcmVhZGVyLmZpZWxkbmFtZXMgb3IgW10KCiAgICAjIEJ1aWxkIGVmZmVjdGl2ZSBtYXBwaW5nCiAgICBpZiBtYXBwaW5nOgogICAgICAgIGNvbF9tYXAgPSB7aDogbWFwcGluZy5nZXQoaCwgIiIpIGZvciBoIGluIGhlYWRlcnN9CiAgICBlbHNlOgogICAgICAgIGNvbF9tYXAgPSBfYXV0b19pbmZlcl9tYXBwaW5nKGhlYWRlcnMpCgogICAgIyBOb3JtYWxpemUgY29sX21hcCBmaWVsZCB2YWx1ZXMgdG8gbG93ZXJjYXNlIHNvIGJvdGggIk5BTUUiIChVSSkgYW5kICJuYW1lIiAoYXV0by1pbmZlcikgd29yawogICAgY29sX21hcCA9IHtoOiAodi5sb3dlcigpIGlmIGlzaW5zdGFuY2Uodiwgc3RyKSBlbHNlIHYpIGZvciBoLCB2IGluIGNvbF9tYXAuaXRlbXMoKX0KCiAgICBmb3IgY3N2X3JvdyBpbiByZWFkZXI6CiAgICAgICAgcm93ID0gewogICAgICAgICAgICAibmFtZSI6ICIiLAogICAgICAgICAgICAicXVhbnRpdHkiOiAxLAogICAgICAgICAgICAic2V0X2NvZGUiOiAiIiwKICAgICAgICAgICAgImNvbGxlY3Rvcl9udW1iZXIiOiAiIiwKICAgICAgICAgICAgImZpbmlzaCI6ICJOT1JNQUwiLAogICAgICAgICAgICAiY29uZGl0aW9uIjogIiIsCiAgICAgICAgICAgICJsYW5ndWFnZSI6ICIiLAogICAgICAgICAgICAibm90ZXMiOiAiIiwKICAgICAgICAgICAgInRhZ3MiOiAiIiwKICAgICAgICB9CiAgICAgICAgZm9yIGhlYWRlciwgZmllbGQgaW4gY29sX21hcC5pdGVtcygpOgogICAgICAgICAgICB2YWwgPSBjc3Zfcm93LmdldChoZWFkZXIsICIiKS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCB2YWwgb3IgZmllbGQgPT0gImlnbm9yZSIgb3Igbm90IGZpZWxkOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgPT0gIm5hbWUiOgogICAgICAgICAgICAgICAgIyBTdHJpcCBmaW5pc2ggc3VmZml4IGxpa2UgIihGb2lsIEV0Y2hlZCkiCiAgICAgICAgICAgICAgICB2YWwgPSByZS5zdWIociJccypcKGZvaWwoPzogZXRjaGVkKT9cKVxzKiQiLCAi' +
'IiwgdmFsLCBmbGFncz1yZS5JR05PUkVDQVNFKS5zdHJpcCgpCiAgICAgICAgICAgICAgICByb3dbIm5hbWUiXSA9IHZhbAogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJxdWFudGl0eSI6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcm93WyJxdWFudGl0eSJdID0gaW50KGZsb2F0KHZhbCkpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICByb3dbInF1YW50aXR5Il0gPSAxCiAgICAgICAgICAgIGVsaWYgZmllbGQgaW4gKCJzZXRfY29kZSIsICJzZXRfY29kZV9zZWNvbmRhcnkiKToKICAgICAgICAgICAgICAgIHJvd1sic2V0X2NvZGUiXSA9IHZhbC5sb3dlcigpCiAgICAgICAgICAgIGVsaWYgZmllbGQgaW4gKCJjb2xsZWN0b3JfbnVtYmVyIiwgImNvbGxlY3Rvcl9udW1iZXJfc2Vjb25kYXJ5Iik6CiAgICAgICAgICAgICAgICByb3dbImNvbGxlY3Rvcl9udW1iZXIiXSA9IHZhbAogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJmaW5pc2giOgogICAgICAgICAgICAgICAgcm93WyJmaW5pc2giXSA9IF9wYXJzZV9maW5pc2godmFsKQogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJjb25kaXRpb24iOgogICAgICAgICAgICAgICAgcm93WyJjb25kaXRpb24iXSA9IHZhbAogICAgICAgICAgICBlbGlmIGZpZWxkID09ICJsYW5ndWFnZSI6CiAgICAgICAgICAgICAgICByb3dbImxhbmd1YWdlIl0gPSB2YWwKICAgICAgICAgICAgZWxpZiBmaWVsZCA9PSAibm90ZXMiOgogICAgICAgICAgICAgICAgcm93WyJub3RlcyJdID0gdmFsCiAgICAgICAgICAgIGVsaWYgZmllbGQgPT0gInRhZ3MiOgogICAgICAgICAgICAgICAgcm93WyJ0YWdzIl0gPSB2YWwKCiAgICAgICAgaWYgcm93WyJuYW1lIl06CiAgICAgICAgICAgIHJvd3MuYXBwZW5kKHJvdykKCiAgICByZXR1cm4gcm93cwoKCmRlZiBfZW5yaWNoX2Zyb21fc2NyeWZhbGwobmFtZTogc3RyLCBzZXRfY29kZTogc3RyID0gIiIsIGNvbGxlY3Rvcl9udW1iZXI6IHN0ciA9ICIiKSAtPiBkaWN0OgogICAgIiIiCiAgICBGZXRjaCBjYXJkIGRhdGEgZnJvbSBTY3J5ZmFsbCBhbmQgcmV0dXJuIGVucmljaGVkIGZpZWxkcyBkaWN0LgogICAgVHJpZXMgc2V0K2NvbGxlY3Rvck51bWJlciBmaXJzdCwgdGhlbiBleGFjdCBuYW1lIGxvb2t1cC4KICAgIFJldHVybnMgZW1wdHkgZGljdCBvbiBmYWlsdXJlLgogICAgIiIiCiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgcXVvdGUKICAgIF9zY3J5ZmFsbF9yYXRlX2xpbWl0KCkKCiAgICBjYXJkX2RhdGEgPSBOb25lCiAgICBsYXN0X2Vycm9yID0gIiIKCiAgICAjIFRyeSBzZXQgKyBjb2xsZWN0b3IgbnVtYmVyIGZpcnN0CiAgICBpZiBzZXRfY29kZSBhbmQgY29sbGVjdG9yX251bWJlcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3tzZXRfY29kZS5sb3dlcigpfS97Y29sbGVjdG9yX251bWJlcn0iCiAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGNhcmRfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbGFzdF9lcnJvciA9IHN0cihlKQogICAgICAgICAgICBjYXJkX2RhdGEgPSBOb25lCgogICAgIyBGYWxsIGJhY2sgdG8gZXhhY3QgbmFtZSBsb29rdXAKICAgIGlmIG5vdCBjYXJkX2RhdGE6CiAgICAgICAgX3NjcnlmYWxsX3JhdGVfbGltaXQoKQogICAgICAgIHRyeToKICAgICAgICAgICAgZW5jb2RlZF9uYW1lID0gcXVvdGUobmFtZSkKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZXhhY3Q9e2VuY29kZWRfbmFtZX0iCiAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGNhcmRfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbGFzdF9lcnJvciA9IHN0cihlKQogICAgICAgICAgICByZXR1cm4geyJfZXJyb3Ii' +
'OiBmIlNjcnlmYWxsIGxvb2t1cCBmYWlsZWQgZm9yICd7bmFtZX0nOiB7bGFzdF9lcnJvcn0ifQoKICAgIGlmIG5vdCBjYXJkX2RhdGEgb3IgY2FyZF9kYXRhLmdldCgib2JqZWN0IikgPT0gImVycm9yIjoKICAgICAgICBlcnJfZGV0YWlsID0gY2FyZF9kYXRhLmdldCgiZGV0YWlscyIsICJ1bmtub3duIGVycm9yIikgaWYgY2FyZF9kYXRhIGVsc2UgbGFzdF9lcnJvcgogICAgICAgIHJldHVybiB7Il9lcnJvciI6IGYiU2NyeWZhbGwgcmV0dXJuZWQgZXJyb3IgZm9yICd7bmFtZX0nOiB7ZXJyX2RldGFpbH0ifQoKICAgICMgRXh0cmFjdCBmaWVsZHMKICAgIHR5cGVfbGluZSA9IGNhcmRfZGF0YS5nZXQoInR5cGVfbGluZSIsICIiKQogICAgY29sb3JfaWRlbnRpdHkgPSBjYXJkX2RhdGEuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKQogICAga2V5d29yZHMgPSBjYXJkX2RhdGEuZ2V0KCJrZXl3b3JkcyIsIFtdKQoKICAgICMgUGFyc2Ugc3VidHlwZXMgKGFmdGVyIGVtLWRhc2ggb3IgaHlwaGVuKQogICAgc3VidHlwZXMgPSBbXQogICAgZm9yIHNlcCBpbiBbIiBcdTIwMTQgIiwgIiAtICJdOgogICAgICAgIGlmIHNlcCBpbiB0eXBlX2xpbmU6CiAgICAgICAgICAgIHBhcnRzID0gdHlwZV9saW5lLnNwbGl0KHNlcCwgMSkKICAgICAgICAgICAgc3VidHlwZXMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHBhcnRzWzFdLnNwbGl0KCkgaWYgcy5zdHJpcCgpXQogICAgICAgICAgICBicmVhawoKICAgIGlzX2xlZ2VuZGFyeSA9IDEgaWYgIkxlZ2VuZGFyeSIgaW4gdHlwZV9saW5lIGVsc2UgMAogICAgaXNfYmFzaWMgPSAxIGlmICJCYXNpYyIgaW4gdHlwZV9saW5lIGVsc2UgMAoKICAgICMgR2V0IHByaWNlCiAgICBwcmljZXMgPSBjYXJkX2RhdGEuZ2V0KCJwcmljZXMiLCB7fSkKICAgIHRjZ19wcmljZSA9IDAuMAogICAgdHJ5OgogICAgICAgIHByaWNlX3ZhbCA9IHByaWNlcy5nZXQoInVzZCIpIG9yIHByaWNlcy5nZXQoInVzZF9mb2lsIikgb3IgIjAiCiAgICAgICAgdGNnX3ByaWNlID0gZmxvYXQocHJpY2VfdmFsKSBpZiBwcmljZV92YWwgZWxzZSAwLjAKICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKICAgICAgICB0Y2dfcHJpY2UgPSAwLjAKCiAgICAjIEhhbmRsZSBkb3VibGUtZmFjZWQgY2FyZHM6IG9yYWNsZV90ZXh0IG1heSBiZSBvbiBjYXJkX2ZhY2VzCiAgICBvcmFjbGVfdGV4dCA9IGNhcmRfZGF0YS5nZXQoIm9yYWNsZV90ZXh0IiwgIiIpCiAgICBpZiBub3Qgb3JhY2xlX3RleHQgYW5kIGNhcmRfZGF0YS5nZXQoImNhcmRfZmFjZXMiKToKICAgICAgICBmYWNlX3RleHRzID0gW2YuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSBmb3IgZiBpbiBjYXJkX2RhdGFbImNhcmRfZmFjZXMiXV0KICAgICAgICBvcmFjbGVfdGV4dCA9ICJcbi8vXG4iLmpvaW4odCBmb3IgdCBpbiBmYWNlX3RleHRzIGlmIHQpCgogICAgIyBQb3dlci90b3VnaG5lc3MgKG1heSBiZSBvbiBjYXJkX2ZhY2VzIGZvciBERkNzKQogICAgcG93ZXIgPSBjYXJkX2RhdGEuZ2V0KCJwb3dlciIsICIiKQogICAgdG91Z2huZXNzID0gY2FyZF9kYXRhLmdldCgidG91Z2huZXNzIiwgIiIpCiAgICBpZiBub3QgcG93ZXIgYW5kIGNhcmRfZGF0YS5nZXQoImNhcmRfZmFjZXMiKToKICAgICAgICBwb3dlciA9IGNhcmRfZGF0YVsiY2FyZF9mYWNlcyJdWzBdLmdldCgicG93ZXIiLCAiIikKICAgICAgICB0b3VnaG5lc3MgPSBjYXJkX2RhdGFbImNhcmRfZmFjZXMiXVswXS5nZXQoInRvdWdobmVzcyIsICIiKQoKICAgICMgTWFuYSBjb3N0IChtYXkgYmUgb24gY2FyZF9mYWNlcyBmb3IgREZDcykKICAgIG1hbmFfY29zdCA9IGNhcmRfZGF0YS5nZXQoIm1hbmFfY29zdCIsICIiKQogICAgaWYgbm90IG1hbmFfY29zdCBhbmQgY2FyZF9kYXRhLmdldCgiY2FyZF9mYWNlcyIpOgogICAgICAgIG1hbmFfY29zdCA9IGNhcmRfZGF0YVsiY2FyZF9mYWNlcyJdWzBdLmdldCgibWFuYV9jb3N0IiwgIiIpCgogICAgIyBBdXRvLWRldGVjdCBmdW5jdGlvbmFsIGNhdGVnb3JpZXMKICAgIGF1dG9fcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCgogICAgcmV0dXJuIHsKICAgICAgICAibmFtZSI6IGNhcmRfZGF0YS5nZXQoIm5hbWUiLCBuYW1lKSwKICAgICAgICAidHlwZV9saW5lIjogdHlwZV9saW5lLAogICAgICAgICJzdWJ0eXBlcyI6IGpzb24uZHVtcHMoc3VidHlwZXMpLAogICAgICAgICJpc19sZWdlbmRhcnkiOiBpc19sZWdlbmRhcnksCiAg' +
'ICAgICAgImlzX2Jhc2ljIjogaXNfYmFzaWMsCiAgICAgICAgImNvbG9yX2lkZW50aXR5IjoganNvbi5kdW1wcyhjb2xvcl9pZGVudGl0eSksCiAgICAgICAgImNtYyI6IGNhcmRfZGF0YS5nZXQoImNtYyIsIDAuMCksCiAgICAgICAgIm1hbmFfY29zdCI6IG1hbmFfY29zdCwKICAgICAgICAib3JhY2xlX3RleHQiOiBvcmFjbGVfdGV4dCwKICAgICAgICAia2V5d29yZHMiOiBqc29uLmR1bXBzKGtleXdvcmRzKSwKICAgICAgICAicG93ZXIiOiBwb3dlciBvciAiIiwKICAgICAgICAidG91Z2huZXNzIjogdG91Z2huZXNzIG9yICIiLAogICAgICAgICJyYXJpdHkiOiBjYXJkX2RhdGEuZ2V0KCJyYXJpdHkiLCAiIiksCiAgICAgICAgInNldF9uYW1lIjogY2FyZF9kYXRhLmdldCgic2V0X25hbWUiLCAiIiksCiAgICAgICAgImVkaHJlY19yYW5rIjogY2FyZF9kYXRhLmdldCgiZWRocmVjX3JhbmsiLCAwKSBvciAwLAogICAgICAgICJ0Y2dfcHJpY2UiOiB0Y2dfcHJpY2UsCiAgICAgICAgInNhbHRfc2NvcmUiOiAwLjAsCiAgICAgICAgImlzX2dhbWVfY2hhbmdlciI6IDAsCiAgICAgICAgImNhdGVnb3J5IjoganNvbi5kdW1wcyhhdXRvX3JvbGVzKSwKICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkX2RhdGEuZ2V0KCJpZCIsICIiKSwKICAgICAgICAidGNncGxheWVyX2lkIjogc3RyKGNhcmRfZGF0YS5nZXQoInRjZ3BsYXllcl9pZCIsICIiKSksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb2xsZWN0aW9uIEltcG9ydCBFbmRwb2ludAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5wb3N0KCIvYXBpL2NvbGxlY3Rpb24vaW1wb3J0IikKYXN5bmMgZGVmIGltcG9ydF9jb2xsZWN0aW9uKGJvZHk6IGRpY3QpOgogICAgIiIiCiAgICBJbXBvcnQgY2FyZHMgaW50byB0aGUgY29sbGVjdGlvbiBmcm9tIENTViwgTW94ZmllbGQsIEFyY2hpZGVrdCwgb3IgcGxhaW4gdGV4dC4KCiAgICBCb2R5OgogICAgICB7CiAgICAgICAgInNvdXJjZSI6ICJDU1YiIHwgIk1PWEZJRUxEIiB8ICJBUkNISURFS1QiIHwgIlRFWFQiLAogICAgICAgICJtb2RlIjogIk1FUkdFIiB8ICJSRVBMQUNFIiwKICAgICAgICAiY29udGVudCI6ICIuLi5jc3Ygb3IgdGV4dCBjb250ZW50Li4uIiwKICAgICAgICAibWFwcGluZyI6IHsgLi4uIG9wdGlvbmFsIGNvbHVtbiBtYXBwaW5nIC4uLiB9CiAgICAgIH0KICAgICIiIgogICAgc291cmNlID0gc3RyKGJvZHkuZ2V0KCJzb3VyY2UiLCAiQ1NWIikpLnVwcGVyKCkKICAgIG1vZGUgPSBzdHIoYm9keS5nZXQoIm1vZGUiLCAiTUVSR0UiKSkudXBwZXIoKQogICAgY29udGVudCA9IHN0cihib2R5LmdldCgiY29udGVudCIsICIiKSkKICAgIG1hcHBpbmcgPSBib2R5LmdldCgibWFwcGluZyIsIHt9KQoKICAgIGlmIG5vdCBjb250ZW50LnN0cmlwKCk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJjb250ZW50IGlzIHJlcXVpcmVkIikKCiAgICBpbXBvcnRlZF9jb3VudCA9IDAKICAgIHVwZGF0ZWRfY291bnQgPSAwCiAgICBmYWlsZWRfY291bnQgPSAwCiAgICBlcnJvcnMgPSBbXQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgUkVQTEFDRSBtb2RlOiBjbGVhciBleGlzdGluZyBlbnRyaWVzCiAgICBpZiBtb2RlID09ICJSRVBMQUNFIjoKICAgICAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyIpCiAgICAgICAgY29ubi5jb21taXQoKQoKICAgICMgUGFyc2UgdGhlIGNvbnRlbnQgaW50byByYXcgcm93cwogICAgdHJ5OgogICAgICAgIHJhd19yb3dzID0gX3BhcnNlX2Nzdl9jb250ZW50KGNvbnRlbnQsIHNvdXJjZSwgbWFwcGluZyBpZiBtYXBwaW5nIGVsc2UgTm9uZSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgZiJGYWls' +
'ZWQgdG8gcGFyc2UgY29udGVudDoge3N0cihlKX0iKQoKICAgIGZvciByYXcgaW4gcmF3X3Jvd3M6CiAgICAgICAgbmFtZSA9IHJhdy5nZXQoIm5hbWUiLCAiIikuc3RyaXAoKQogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBxdWFudGl0eSA9IGludChyYXcuZ2V0KCJxdWFudGl0eSIsIDEpKQogICAgICAgIHNldF9jb2RlID0gcmF3LmdldCgic2V0X2NvZGUiLCAiIikubG93ZXIoKQogICAgICAgIGNvbGxlY3Rvcl9udW1iZXIgPSByYXcuZ2V0KCJjb2xsZWN0b3JfbnVtYmVyIiwgIiIpCiAgICAgICAgZmluaXNoID0gX3BhcnNlX2ZpbmlzaChyYXcuZ2V0KCJmaW5pc2giLCAiIikpCiAgICAgICAgY29uZGl0aW9uID0gcmF3LmdldCgiY29uZGl0aW9uIiwgIiIpCiAgICAgICAgbGFuZ3VhZ2UgPSByYXcuZ2V0KCJsYW5ndWFnZSIsICIiKQogICAgICAgIG5vdGVzID0gcmF3LmdldCgibm90ZXMiLCAiIikKICAgICAgICB0YWdzID0gcmF3LmdldCgidGFncyIsICIiKQoKICAgICAgICAjIFNjcnlmYWxsIGVucmljaG1lbnQKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVucmljaGVkID0gX2VucmljaF9mcm9tX3NjcnlmYWxsKG5hbWUsIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChmIlNjcnlmYWxsIGVycm9yIGZvciAne25hbWV9Jzoge3N0cihlKX0iKQogICAgICAgICAgICBmYWlsZWRfY291bnQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBub3QgZW5yaWNoZWQgb3IgIl9lcnJvciIgaW4gZW5yaWNoZWQ6CiAgICAgICAgICAgIGVycl9tc2cgPSBlbnJpY2hlZC5nZXQoIl9lcnJvciIsIGYiQ2FyZCBub3QgZm91bmQgb24gU2NyeWZhbGw6ICd7bmFtZX0nIikgaWYgZW5yaWNoZWQgZWxzZSBmIkNhcmQgbm90IGZvdW5kIG9uIFNjcnlmYWxsOiAne25hbWV9JyIKICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChlcnJfbXNnKQogICAgICAgICAgICBmYWlsZWRfY291bnQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFVzZSBTY3J5ZmFsbC1yZXNvbHZlZCBuYW1lIGlmIGF2YWlsYWJsZQogICAgICAgIHJlc29sdmVkX25hbWUgPSBlbnJpY2hlZC5nZXQoIm5hbWUiLCBuYW1lKQoKICAgICAgICAjIENoZWNrIGZvciBleGlzdGluZyBlbnRyeSAoaWRlbnRpdHkga2V5KQogICAgICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiJTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gY29sbGVjdGlvbl9lbnRyaWVzCiAgICAgICAgICAgICAgIFdIRVJFIG5hbWUgPSA/IEFORCBzZXRfY29kZSA9ID8gQU5EIGNvbGxlY3Rvcl9udW1iZXIgPSA/IEFORCBmaW5pc2ggPSA/IiIiLAogICAgICAgICAgICAocmVzb2x2ZWRfbmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIsIGZpbmlzaCksCiAgICAgICAgKS5mZXRjaG9uZSgpCgogICAgICAgIGlmIGV4aXN0aW5nIGFuZCBtb2RlID09ICJNRVJHRSI6CiAgICAgICAgICAgICMgVXBkYXRlIHF1YW50aXR5CiAgICAgICAgICAgIG5ld19xdHkgPSBleGlzdGluZ1sicXVhbnRpdHkiXSArIHF1YW50aXR5CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVCBxdWFudGl0eSA9ID8sIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIChuZXdfcXR5LCBleGlzdGluZ1siaWQiXSksCiAgICAgICAgICAgICkKICAgICAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgICAgICB1cGRhdGVkX2NvdW50ICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEluc2VydCBuZXcgcm93CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICIiIklOU0VSVCBJTlRPIGNvbGxlY3Rpb25fZW50cmllcwogICAgICAgICAgICAgICAgICAgKG5hbWUsIHR5cGVfbGluZSwgc3VidHlwZXMsIGlzX2xlZ2VuZGFyeSwgaXNfYmFzaWMsIGNvbG9yX2lkZW50aXR5LAogICAgICAgICAgICAgICAgICAgIGNtYywgbWFuYV9jb3N0LCBvcmFjbGVfdGV4dCwga2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgcG93ZXIsIHRvdWdobmVzcywgcmFyaXR5LCBzZXRfbmFtZSwgZWRocmVjX3JhbmssCiAgICAgICAgICAgICAgICAgICAgdGNnX3ByaWNlLCBzYWx0X3Njb3JlLCBpc19nYW1lX2NoYW5n' +
'ZXIsCiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnksIHNjcnlmYWxsX2lkLCB0Y2dwbGF5ZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHksIGZpbmlzaCwgY29uZGl0aW9uLCBsYW5ndWFnZSwgbm90ZXMsIHRhZ3MsCiAgICAgICAgICAgICAgICAgICAgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIpCiAgICAgICAgICAgICAgICAgICBWQUxVRVMgKD8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8sID8pIiIiLAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0eXBlX2xpbmUiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzdWJ0eXBlcyIsICJbXSIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiaXNfbGVnZW5kYXJ5IiwgMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJpc19iYXNpYyIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiY29sb3JfaWRlbnRpdHkiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImNtYyIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImtleXdvcmRzIiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJwb3dlciIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRvdWdobmVzcyIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInJhcml0eSIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInNldF9uYW1lIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiZWRocmVjX3JhbmsiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRjZ19wcmljZSIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzYWx0X3Njb3JlIiwgMC4wKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImlzX2dhbWVfY2hhbmdlciIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiY2F0ZWdvcnkiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgidGNncGxheWVyX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIHF1YW50aXR5LAogICAgICAgICAgICAgICAgICAgIGZpbmlzaCwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24sCiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgbm90ZXMsCiAgICAgICAgICAgICAgICAgICAgdGFncywKICAgICAgICAgICAgICAgICAgICBzZXRfY29kZSwKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3JfbnVtYmVyLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgICAgIGltcG9ydGVkX2NvdW50ICs9IDEKCiAgICByZXR1cm4gewogICAgICAgICJpbXBvcnRlZENvdW50IjogaW1wb3J0ZWRfY291bnQsCiAgICAgICAgInVwZGF0ZWRDb3VudCI6IHVwZGF0ZWRfY291bnQsCiAgICAgICAgImZhaWxlZENvdW50IjogZmFpbGVkX2NvdW50LAogICAgICAgICJlcnJvcnMiOiBlcnJvcnMsCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZWNrIEJ1aWxkZXIgSGVscGVycwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBUeXBlIGNsYXNzaWZpY2F0aW9uIHByaW9yaXR5IG9yZGVyCl9UWVBFX1BSSU9SSVRZID0gWyJMYW5kIiwgIkluc3RhbnQiLCAiU29yY2VyeSIsICJBcnRpZmFjdCIsICJFbmNoYW50bWVudCIsICJQbGFuZXN3YWxrZXIiLCAiQ3JlYXR1cmUiXQoKIyBUYXJnZXQgcmFuZ2VzOiB7dHlwZTogW21pbiwgbWF4XX0KX1RZUEVfVEFSR0VUUyA9IHsKICAgICJMYW5kIjogWzM2LCAzOF0sCiAgICAiSW5zdGFudCI6IFs5LCAxMV0sCiAgICAiU29yY2VyeSI6IFs3LCA5XSwKICAgICJBcnRpZmFjdCI6IFs5LCAxMV0sCiAgICAiQ3JlYXR1cmUiOiBbMjAsIDMwXSwKICAgICJFbmNoYW50bWVudCI6IFs1LCAxMF0sCiAgICAiUGxhbmVzd2Fsa2VyIjogWzAsIDVdLAp9CgoKZGVmIF9jbGFzc2lmeV9jYXJkX3R5cGUodHlwZV9saW5lOiBzdHIpIC0+IHN0cjoKICAgICIiIkNsYXNzaWZ5IGEgY2FyZCdzIHByaW1hcnkgdHlwZSBwZXIgcHJpb3JpdHkgb3JkZXIuIiIiCiAgICB0bCA9IHR5cGVfbGluZSBvciAiIgogICAgZm9yIHQgaW4gX1RZUEVfUFJJT1JJVFk6CiAgICAgICAgaWYgdCBpbiB0bDoKICAgICAgICAgICAgcmV0dXJuIHQKICAgIHJldHVybiAiT3RoZXIiCgoKZGVmIF9kZXRlY3RfY2FyZF9yb2xlcyhvcmFjbGVfdGV4dDogc3RyLCB0eXBlX2xpbmU6IHN0ciwga2V5d29yZHMpIC0+IGxpc3Q6CiAgICAiIiIKICAgIERldGVjdCBmdW5jdGlvbmFsIHJvbGVzIGZyb20gb3JhY2xlIHRleHQsIHR5cGUgbGluZSwgYW5kIGtleXdvcmRzLgogICAgSW5zcGlyZWQgYnkgQXJjaGlkZWt0IGF1dG8tY2F0ZWdvcnkgc3lzdGVtLgogICAgUmV0dXJucyBhIGxpc3Qgb2Ygcm9sZSBzdHJpbmdzLgogICAgIiIiCiAgICByb2xlcyA9IFtdCiAgICBvdCA9IChvcmFjbGVfdGV4dCBvciAiIikubG93ZXIoKQogICAgdGwgPSAodHlwZV9saW5lIG9yICIiKS5sb3dlcigpCiAgICBrd19yYXcgPSBrZXl3b3JkcyBvciBbXQogICAgaWYgaXNpbnN0YW5jZShrd19yYXcsIHN0cik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBrd19yYXcgPSBqc29uLmxvYWRzKGt3X3JhdykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBrd19yYXcgPSBbXQogICAga3cgPSAiICIuam9pbihzdHIoaykubG93ZXIoKSBmb3IgayBpbiBrd19yYXcpCgogICAgIyDilIDilIAgUmFtcCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiYWRkIHsiIGluIG90CiAgICAgICAgb3IgImFkZCBvbmUgbWFuYSIgaW4gb3QKICAgICAgICBvciAoInNlYXJjaCB5b3VyIGxpYnJhcnkgZm9yIGEiIGluIG90IGFuZCAibGFuZCIgaW4gb3QpCiAgICAgICAgb3IgKCJsYW5kIiBpbiB0bCBhbmQgImVudGVycyIgaW4gb3QgYW5kICJhZGQiIGluIG90KQogICAgICAgIG9yICJ0cmVhc3VyZSB0b2tlbiIgaW4gb3QKICAgICAgICBvciAiYWRkIG1hbmEiIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiUmFtcCIpCgogICAgIyDilIDilIAgRHJhdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiZHJhdyBhIGNhcmQiIGluIG90CiAgICAgICAgb3IgImRyYXcgY2FyZHMiIGluIG90CiAgICAgICAgb3IgImRyYXdzIGEgY2FyZCIgaW4gb3QKICAgICAgICBvciAiZHJhdyB0d28gY2FyZHMiIGluIG90CiAgICAgICAgb3IgImRyYXcgdGhyZWUgY2FyZHMiIGluIG90CiAgICAgICAgb3IgcmUuc2VhcmNoKHIiZHJhdyBcZCsgY2FyZHM/Iiwgb3QpCiAgICAgICAgb3IgIndoZW5ldmVyIiBpbiBvdCBhbmQgImRyYXciIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiRHJhdyIpCgogICAgIyDilIDilIAgUmVtb3ZhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiZGVz' +
'dHJveSB0YXJnZXQiIGluIG90CiAgICAgICAgb3IgImV4aWxlIHRhcmdldCIgaW4gb3QKICAgICAgICBvciByZS5zZWFyY2gociJkZWFscz8gXGQrIGRhbWFnZSB0byAodGFyZ2V0fGFueSB0YXJnZXQpIiwgb3QpCiAgICAgICAgb3IgcmUuc2VhcmNoKHIiZGVhbHM/IHggZGFtYWdlIHRvICh0YXJnZXR8YW55IHRhcmdldCkiLCBvdCkKICAgICAgICBvciAidGFyZ2V0IGNyZWF0dXJlIGdldHMgLSIgaW4gb3QKICAgICAgICBvciAiZmlnaHRzIHRhcmdldCIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJSZW1vdmFsIikKCiAgICAjIOKUgOKUgCBCb2FyZCBXaXBlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJkZXN0cm95IGFsbCIgaW4gb3QKICAgICAgICBvciAiZXhpbGUgYWxsIiBpbiBvdAogICAgICAgIG9yIHJlLnNlYXJjaChyImFsbCBjcmVhdHVyZXMgZ2V0IC1cZCsvLVxkKyIsIG90KQogICAgICAgIG9yIHJlLnNlYXJjaChyImVhY2ggY3JlYXR1cmUgZ2V0cyAtXGQrLy1cZCsiLCBvdCkKICAgICAgICBvciAoImRlYWxzIiBpbiBvdCBhbmQgInRvIGVhY2ggY3JlYXR1cmUiIGluIG90KQogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkJvYXJkIFdpcGUiKQoKICAgICMg4pSA4pSAIEFudGhlbSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICByZS5zZWFyY2gociJjcmVhdHVyZXM/IHlvdSBjb250cm9sIGdldCBcKyIsIG90KQogICAgICAgIG9yIHJlLnNlYXJjaChyImNyZWF0dXJlcz8geW91IGNvbnRyb2wgaGF2ZSIsIG90KQogICAgICAgIG9yIHJlLnNlYXJjaChyIm90aGVyIGNyZWF0dXJlcz8geW91IGNvbnRyb2wgZ2V0IFwrIiwgb3QpCiAgICAgICAgb3IgcmUuc2VhcmNoKHIiZWFjaCBjcmVhdHVyZSB5b3UgY29udHJvbCBnZXRzPyBcKyIsIG90KQogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkFudGhlbSIpCgogICAgIyDilIDilIAgUHJvdGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiaGV4cHJvb2YiIGluIG90IG9yICJoZXhwcm9vZiIgaW4ga3cKICAgICAgICBvciAiaW5kZXN0cnVjdGlibGUiIGluIG90IG9yICJpbmRlc3RydWN0aWJsZSIgaW4ga3cKICAgICAgICBvciAic2hyb3VkIiBpbiBvdCBvciAic2hyb3VkIiBpbiBrdwogICAgICAgIG9yICJ3YXJkIiBpbiBvdCBvciAid2FyZCIgaW4ga3cKICAgICAgICBvciAicHJvdGVjdGlvbiBmcm9tIiBpbiBvdAogICAgICAgIG9yICJjYW4ndCBiZSB0aGUgdGFyZ2V0IiBpbiBvdAogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIlByb3RlY3Rpb24iKQoKICAgICMg4pSA4pSAIFR1dG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgInNlYXJjaCB5b3VyIGxpYnJhcnkiIGluIG90OgogICAgICAgIHJvbGVzLmFwcGVuZCgiVHV0b3IiKQoKICAgICMg4pSA4pSAIENvdW50ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAiY291bnRlciB0YXJnZXQiIGluIG90OgogICAgICAgIHJvbGVzLmFwcGVuZCgiQ291bnRlciIpCgogICAgIyDilIDilIAgVG9rZW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgcmUuc2VhcmNo' +
'KHIiY3JlYXRlW3NkXT8gLip0b2tlbiIsIG90KQogICAgICAgIG9yICJjcmVhdHVyZSB0b2tlbiIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJUb2tlbiIpCgogICAgIyDilIDilIAgU2FjcmlmaWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJzYWNyaWZpY2UgYSAiIGluIG90CiAgICAgICAgb3IgInNhY3JpZmljZSBhbm90aGVyIiBpbiBvdAogICAgICAgIG9yICJ3aGVuIiBpbiBvdCBhbmQgInNhY3JpZmljZSIgaW4gb3QgYW5kICJkaWVzIiBub3QgaW4gb3QKICAgICAgICBvciAiZWFjaCBwbGF5ZXIgc2FjcmlmaWNlcyIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJTYWNyaWZpY2UiKQoKICAgICMg4pSA4pSAIFJlY3Vyc2lvbiAvIFJlYW5pbWF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAicmV0dXJuIiBpbiBvdCBhbmQgImZyb20geW91ciBncmF2ZXlhcmQiIGluIG90CiAgICAgICAgb3IgInJldHVybiIgaW4gb3QgYW5kICJmcm9tIGEgZ3JhdmV5YXJkIiBpbiBvdAogICAgICAgIG9yICJwdXQiIGluIG90IGFuZCAiZnJvbSB5b3VyIGdyYXZleWFyZCIgaW4gb3QgYW5kICJvbnRvIHRoZSBiYXR0bGVmaWVsZCIgaW4gb3QKICAgICAgICBvciAicHV0IiBpbiBvdCBhbmQgImZyb20gYSBncmF2ZXlhcmQiIGluIG90IGFuZCAib250byB0aGUgYmF0dGxlZmllbGQiIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiUmVjdXJzaW9uIikKCiAgICAjIOKUgOKUgCBHcmF2ZXlhcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgImdyYXZleWFyZCIgaW4gb3QKICAgICAgICBhbmQgKCJtaWxsIiBpbiBvdCBvciAicHV0IiBpbiBvdCBhbmQgImludG8iIGluIG90IGFuZCAiZ3JhdmV5YXJkIiBpbiBvdCkKICAgICkgb3IgIm1pbGwiIGluIGt3OgogICAgICAgIHJvbGVzLmFwcGVuZCgiR3JhdmV5YXJkIikKCiAgICAjIOKUgOKUgCBMaWZlZ2FpbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiZ2FpbiIgaW4gb3QgYW5kICJsaWZlIiBpbiBvdAogICAgICAgIG9yICJsaWZlbGluayIgaW4gb3Qgb3IgImxpZmVsaW5rIiBpbiBrdwogICAgKToKICAgICAgICByb2xlcy5hcHBlbmQoIkxpZmVnYWluIikKCiAgICAjIOKUgOKUgCBCdXJuIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgIHJlLnNlYXJjaChyImRlYWxzPyBcZCsgZGFtYWdlIHRvIChlYWNofGFueXx0YXJnZXQpIChvcHBvbmVudHxwbGF5ZXIpIiwgb3QpCiAgICAgICAgb3IgImVhY2ggb3Bwb25lbnQgbG9zZXMiIGluIG90IGFuZCAibGlmZSIgaW4gb3QKICAgICAgICBvciAiZGVhbHMgZGFtYWdlIHRvIGVhY2ggb3Bwb25lbnQiIGluIG90CiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiQnVybiIpCgogICAgIyDilIDilIAgU3RheCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAiY2FuJ3QgY2FzdCIgaW4gb3QKICAgICAgICBvciAiY2FuJ3QgYXR0YWNrIiBpbiBvdAogICAgICAgIG9yICJjYW4ndCBhY3RpdmF0ZSIgaW4gb3QKICAgICAgICBvciAiZW50ZXJzIHRoZSBiYXR0bGVmaWVsZCB0YXBwZWQiIGluIG90IGFuZCAib3Bwb25lbnRz' +
'IiBpbiBvdAogICAgICAgIG9yICJlYWNoIHBsYXllciBjYW4ndCIgaW4gb3QKICAgICAgICBvciAicGxheWVycyBjYW4ndCIgaW4gb3QKICAgICAgICBvciAiY29zdCB7IiBpbiBvdCBhbmQgIm1vcmUgdG8gY2FzdCIgaW4gb3QKICAgICAgICBvciAiY29zdCBtb3JlIiBpbiBvdCBhbmQgInNwZWxscyIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJTdGF4IikKCiAgICAjIOKUgOKUgCBFdmFzaW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgKAogICAgICAgICJmbHlpbmciIGluIGt3CiAgICAgICAgb3IgInRyYW1wbGUiIGluIGt3CiAgICAgICAgb3IgIm1lbmFjZSIgaW4ga3cKICAgICAgICBvciAic2hhZG93IiBpbiBrdwogICAgICAgIG9yICJmZWFyIiBpbiBrdwogICAgICAgIG9yICJpbnRpbWlkYXRlIiBpbiBrdwogICAgICAgIG9yICJjYW4ndCBiZSBibG9ja2VkIiBpbiBvdAogICAgICAgIG9yICJ1bmJsb2NrYWJsZSIgaW4gb3QKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJFdmFzaW9uIikKCiAgICAjIOKUgOKUgCBGaW5pc2hlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmICgKICAgICAgICAieW91IHdpbiB0aGUgZ2FtZSIgaW4gb3QKICAgICAgICBvciAiZXh0cmEgdHVybiIgaW4gb3QKICAgICAgICBvciAiaW5maW5pdGUiIGluIG90CiAgICAgICAgb3IgImxvc2VzIHRoZSBnYW1lIiBpbiBvdAogICAgICAgIG9yICJkYW1hZ2UgZXF1YWwgdG8iIGluIG90IGFuZCAoIm51bWJlciIgaW4gb3Qgb3IgInRvdGFsIiBpbiBvdCkKICAgICk6CiAgICAgICAgcm9sZXMuYXBwZW5kKCJGaW5pc2hlciIpCgogICAgIyDilIDilIAgQ29tYm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiAoCiAgICAgICAgInVudGFwIGFsbCIgaW4gb3QKICAgICAgICBvciAiY29weSIgaW4gb3QgYW5kICJzcGVsbCIgaW4gb3QKICAgICAgICBvciAidGFrZSBhbiBleHRyYSIgaW4gb3QKICAgICAgICBvciAiZG91YmxlIiBpbiBvdCBhbmQgKCJkYW1hZ2UiIGluIG90IG9yICJjb3VudGVycyIgaW4gb3Qgb3IgInRva2VucyIgaW4gb3QpCiAgICApOgogICAgICAgIHJvbGVzLmFwcGVuZCgiQ29tYm8iKQoKICAgIHJldHVybiByb2xlcwoKCmRlZiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQ6IGludCk6CiAgICAiIiJGZXRjaCBhIGRlY2sgcm93IG9yIHJhaXNlIDQwNC4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGRlY2tzIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiRGVjayB7ZGVja19pZH0gbm90IGZvdW5kIikKICAgIGQgPSBkaWN0KHJvdykKICAgIHRyeToKICAgICAgICBkWyJjb2xvcl9pZGVudGl0eSJdID0ganNvbi5sb2FkcyhkLmdldCgiY29sb3JfaWRlbnRpdHkiLCAiW10iKSkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgZFsiY29sb3JfaWRlbnRpdHkiXSA9IFtdCiAgICByZXR1cm4gZAoKCmRlZiBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQ6IGludCkgLT4gZGljdDoKICAgICIiIgogICAgQnVpbGQgdGhlIGZ1bGwgYW5hbHlzaXMgZGljdCBmb3IgYSBkZWNrLgogICAgSm9pbnMgZGVja19jYXJkcyB3aXRoIGNvbGxlY3Rpb25fZW50cmllcyB2aWEgc2NyeWZhbGxfaWQuCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUIGRjLmlkLCBkYy5zY3J5ZmFsbF9pZCwgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwgZGMuaXNfY29tbWFuZGVyLCBkYy5yb2xlX3RhZywKICAgICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5vcmFjbGVfdGV4dCwg' +
'Y2Uua2V5d29yZHMsIGNlLmNtYywgY2UuY29sb3JfaWRlbnRpdHkKICAgICAgICBGUk9NIGRlY2tfY2FyZHMgZGMKICAgICAgICBMRUZUIEpPSU4gY29sbGVjdGlvbl9lbnRyaWVzIGNlIE9OIGNlLnNjcnlmYWxsX2lkID0gZGMuc2NyeWZhbGxfaWQKICAgICAgICBXSEVSRSBkYy5kZWNrX2lkID0gPwogICAgICAgICIiIiwKICAgICAgICAoZGVja19pZCwpCiAgICApLmZldGNoYWxsKCkKCiAgICBjb3VudHNfYnlfdHlwZSA9IHt0OiAwIGZvciB0IGluIF9UWVBFX1BSSU9SSVRZfQogICAgY291bnRzX2J5X3R5cGVbIk90aGVyIl0gPSAwCiAgICBtYW5hX2N1cnZlID0gezA6IDAsIDE6IDAsIDI6IDAsIDM6IDAsIDQ6IDAsIDU6IDAsICI2KyI6IDB9CiAgICBjb2xvcl9waXBzID0geyJXIjogMCwgIlUiOiAwLCAiQiI6IDAsICJSIjogMCwgIkciOiAwfQogICAgcm9sZXNfY291bnQgPSB7IlJhbXAiOiAwLCAiRHJhdyI6IDAsICJSZW1vdmFsIjogMCwgIkJvYXJkV2lwZSI6IDAsCiAgICAgICAgICAgICAgICAgICAiUHJvdGVjdGlvbiI6IDAsICJUdXRvciI6IDAsICJDb3VudGVyIjogMH0KICAgIHRvdGFsX2NhcmRzID0gMAoKICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBxdHkgPSByb3dbInF1YW50aXR5Il0gb3IgMQogICAgICAgIHRvdGFsX2NhcmRzICs9IHF0eQogICAgICAgIHR5cGVfbGluZSA9IHJvd1sidHlwZV9saW5lIl0gb3IgIiIKICAgICAgICBvcmFjbGVfdGV4dCA9IHJvd1sib3JhY2xlX3RleHQiXSBvciAiIgogICAgICAgIGtleXdvcmRzID0gcm93WyJrZXl3b3JkcyJdIG9yICJbXSIKICAgICAgICBjbWMgPSBmbG9hdChyb3dbImNtYyJdIG9yIDApCiAgICAgICAgY29sX2lkX3JhdyA9IHJvd1siY29sb3JfaWRlbnRpdHkiXSBvciAiW10iCgogICAgICAgIGNhcmRfdHlwZSA9IF9jbGFzc2lmeV9jYXJkX3R5cGUodHlwZV9saW5lKQogICAgICAgIGNvdW50c19ieV90eXBlW2NhcmRfdHlwZV0gPSBjb3VudHNfYnlfdHlwZS5nZXQoY2FyZF90eXBlLCAwKSArIHF0eQoKICAgICAgICAjIE1hbmEgY3VydmUgKGV4Y2x1ZGUgbGFuZHMpCiAgICAgICAgaWYgY2FyZF90eXBlICE9ICJMYW5kIjoKICAgICAgICAgICAgY21jX2ludCA9IGludChjbWMpCiAgICAgICAgICAgIGlmIGNtY19pbnQgPj0gNjoKICAgICAgICAgICAgICAgIG1hbmFfY3VydmVbIjYrIl0gKz0gcXR5CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtYW5hX2N1cnZlW2NtY19pbnRdID0gbWFuYV9jdXJ2ZS5nZXQoY21jX2ludCwgMCkgKyBxdHkKCiAgICAgICAgIyBDb2xvciBwaXBzIGZyb20gY29sb3JfaWRlbnRpdHkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNpID0ganNvbi5sb2Fkcyhjb2xfaWRfcmF3KSBpZiBpc2luc3RhbmNlKGNvbF9pZF9yYXcsIHN0cikgZWxzZSBjb2xfaWRfcmF3CiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY2kgPSBbXQogICAgICAgIGZvciBjIGluIGNpOgogICAgICAgICAgICBpZiBjIGluIGNvbG9yX3BpcHM6CiAgICAgICAgICAgICAgICBjb2xvcl9waXBzW2NdICs9IHF0eQoKICAgICAgICAjIERldGVjdCByb2xlcwogICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCiAgICAgICAgZm9yIHJvbGUgaW4gY2FyZF9yb2xlczoKICAgICAgICAgICAgaWYgcm9sZSBpbiByb2xlc19jb3VudDoKICAgICAgICAgICAgICAgIHJvbGVzX2NvdW50W3JvbGVdICs9IHF0eQoKICAgICMgQ29tcHV0ZSBkZWx0YXM6IGN1cnJlbnQgLSBtaWRwb2ludCBvZiB0YXJnZXQgcmFuZ2UKICAgIGRlbHRhcyA9IHt9CiAgICBmb3IgdCwgKGxvLCBoaSkgaW4gX1RZUEVfVEFSR0VUUy5pdGVtcygpOgogICAgICAgIG1pZCA9IChsbyArIGhpKSAvIDIKICAgICAgICBjdXJyZW50ID0gY291bnRzX2J5X3R5cGUuZ2V0KHQsIDApCiAgICAgICAgZGVsdGEgPSBjdXJyZW50IC0gbWlkCiAgICAgICAgZGVsdGFzW3RdID0gcm91bmQoZGVsdGEsIDEpCgogICAgcmV0dXJuIHsKICAgICAgICAiY291bnRzX2J5X3R5cGUiOiBjb3VudHNfYnlfdHlwZSwKICAgICAgICAidGFyZ2V0cyI6IF9UWVBFX1RBUkdFVFMsCiAgICAgICAgImRlbHRhcyI6IGRlbHRhcywKICAgICAgICAibWFuYV9jdXJ2ZSI6IG1hbmFfY3VydmUsCiAgICAgICAgImNvbG9yX3BpcHMiOiBjb2xvcl9waXBzLAogICAgICAgICJ0b3RhbF9jYXJkcyI6IHRvdGFsX2NhcmRzLAogICAgICAgICJyb2xlcyI6IHJv' +
'bGVzX2NvdW50LAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVjayBCdWlsZGVyIEVuZHBvaW50cwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyDilIDilIAgMi4xIERlY2sgQ1JVRCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAucG9zdCgiL2FwaS9kZWNrcyIpCmFzeW5jIGRlZiBjcmVhdGVfZGVjayhyZXE6IENyZWF0ZURlY2tSZXF1ZXN0KToKICAgICIiIkNyZWF0ZSBhIG5ldyBkZWNrLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjb2xvcl9pZGVudGl0eV9qc29uID0ganNvbi5kdW1wcyhyZXEuY29sb3JfaWRlbnRpdHkgb3IgW10pCiAgICBjdXIgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgSU5TRVJUIElOVE8gZGVja3MgKG5hbWUsIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCwgY29tbWFuZGVyX25hbWUsIGNvbG9yX2lkZW50aXR5LCBzdHJhdGVneV90YWcpCiAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/KQogICAgICAgICIiIiwKICAgICAgICAoCiAgICAgICAgICAgIHJlcS5uYW1lLAogICAgICAgICAgICByZXEuY29tbWFuZGVyX3NjcnlmYWxsX2lkIG9yICIiLAogICAgICAgICAgICByZXEuY29tbWFuZGVyX25hbWUgb3IgIiIsCiAgICAgICAgICAgIGNvbG9yX2lkZW50aXR5X2pzb24sCiAgICAgICAgICAgIHJlcS5zdHJhdGVneV90YWcgb3IgIiIsCiAgICAgICAgKQogICAgKQogICAgY29ubi5jb21taXQoKQogICAgZGVja19pZCA9IGN1ci5sYXN0cm93aWQKICAgIHJldHVybiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCgoKQGFwcC5nZXQoIi9hcGkvZGVja3MiKQphc3luYyBkZWYgbGlzdF9kZWNrc19kYigpOgogICAgIiIiTGlzdCBhbGwgZGVja3Mgd2l0aCBjYXJkIGNvdW50cy4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiIiIKICAgICAgICBTRUxFQ1QgZC4qLAogICAgICAgICAgICAgICBDT0FMRVNDRShTVU0oZGMucXVhbnRpdHkpLCAwKSBBUyB0b3RhbF9jYXJkcywKICAgICAgICAgICAgICAgQ09VTlQoZGMuaWQpIEFTIGNhcmRfc2xvdHMKICAgICAgICBGUk9NIGRlY2tzIGQKICAgICAgICBMRUZUIEpPSU4gZGVja19jYXJkcyBkYyBPTiBkYy5kZWNrX2lkID0gZC5pZAogICAgICAgIEdST1VQIEJZIGQuaWQKICAgICAgICBPUkRFUiBCWSBkLnVwZGF0ZWRfYXQgREVTQwogICAgICAgICIiIgogICAgKS5mZXRjaGFsbCgpCiAgICBkZWNrcyA9IFtdCiAgICBmb3Igcm93IGluIHJvd3M6CiAgICAgICAgZCA9IGRpY3Qocm93KQogICAgICAgIHRyeToKICAgICAgICAgICAgZFsiY29sb3JfaWRlbnRpdHkiXSA9IGpzb24ubG9hZHMoZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgIltdIikpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZFsiY29sb3JfaWRlbnRpdHkiXSA9IFtdCiAgICAgICAgZGVja3MuYXBwZW5kKGQpCiAgICByZXR1cm4geyJkZWNrcyI6IGRlY2tzfQoKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfSIpCmFzeW5jIGRlZiBnZXRfZGVjayhkZWNrX2lkOiBpbnQpOgogICAgIiIiR2V0IGZ1bGwgZGVjayBpbmZvIHdpdGggY29tcG9zaXRpb24gc3VtbWFyeS4iIiIKICAgIGRlY2sgPSBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGNhcmRfcm93cyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUICogRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IE9SREVSIEJZIGlzX2NvbW1hbmRlciBERVNDLCBjYXJkX25hbWUgQVND' +
'IiwKICAgICAgICAoZGVja19pZCwpCiAgICApLmZldGNoYWxsKCkKICAgIGRlY2tbImNhcmRzIl0gPSBbZGljdChyKSBmb3IgciBpbiBjYXJkX3Jvd3NdCiAgICBkZWNrWyJ0b3RhbF9jYXJkcyJdID0gc3VtKHJbInF1YW50aXR5Il0gZm9yIHIgaW4gY2FyZF9yb3dzKQogICAgZGVja1siY2FyZF9zbG90cyJdID0gbGVuKGNhcmRfcm93cykKICAgICMgQ29tcG9zaXRpb24gc3VtbWFyeSBieSB0eXBlCiAgICBhbmFseXNpcyA9IF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKICAgIGRlY2tbImNvbXBvc2l0aW9uIl0gPSBhbmFseXNpc1siY291bnRzX2J5X3R5cGUiXQogICAgcmV0dXJuIGRlY2sKCgpAYXBwLnB1dCgiL2FwaS9kZWNrcy97ZGVja19pZH0iKQphc3luYyBkZWYgdXBkYXRlX2RlY2soZGVja19pZDogaW50LCByZXE6IFVwZGF0ZURlY2tSZXF1ZXN0KToKICAgICIiIlVwZGF0ZSBkZWNrIG1ldGFkYXRhLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKSAgIyBlbnN1cmUgZXhpc3RzCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICB1cGRhdGVzID0ge30KICAgIGlmIHJlcS5uYW1lIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbIm5hbWUiXSA9IHJlcS5uYW1lCiAgICBpZiByZXEuY29tbWFuZGVyX3NjcnlmYWxsX2lkIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbImNvbW1hbmRlcl9zY3J5ZmFsbF9pZCJdID0gcmVxLmNvbW1hbmRlcl9zY3J5ZmFsbF9pZAogICAgaWYgcmVxLmNvbW1hbmRlcl9uYW1lIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbImNvbW1hbmRlcl9uYW1lIl0gPSByZXEuY29tbWFuZGVyX25hbWUKICAgIGlmIHJlcS5jb2xvcl9pZGVudGl0eSBpcyBub3QgTm9uZToKICAgICAgICB1cGRhdGVzWyJjb2xvcl9pZGVudGl0eSJdID0ganNvbi5kdW1wcyhyZXEuY29sb3JfaWRlbnRpdHkpCiAgICBpZiByZXEuc3RyYXRlZ3lfdGFnIGlzIG5vdCBOb25lOgogICAgICAgIHVwZGF0ZXNbInN0cmF0ZWd5X3RhZyJdID0gcmVxLnN0cmF0ZWd5X3RhZwoKICAgIGlmIG5vdCB1cGRhdGVzOgogICAgICAgIHJldHVybiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCgogICAgdXBkYXRlc1sidXBkYXRlZF9hdCJdID0gZGF0ZXRpbWUudXRjbm93KCkuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIikKICAgIHNldF9jbGF1c2UgPSAiLCAiLmpvaW4oZiJ7a30gPSA/IiBmb3IgayBpbiB1cGRhdGVzKQogICAgY29ubi5leGVjdXRlKGYiVVBEQVRFIGRlY2tzIFNFVCB7c2V0X2NsYXVzZX0gV0hFUkUgaWQgPSA/IiwgbGlzdCh1cGRhdGVzLnZhbHVlcygpKSArIFtkZWNrX2lkXSkKICAgIGNvbm4uY29tbWl0KCkKICAgIHJldHVybiBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCgoKQGFwcC5kZWxldGUoIi9hcGkvZGVja3Mve2RlY2tfaWR9IikKYXN5bmMgZGVmIGRlbGV0ZV9kZWNrKGRlY2tfaWQ6IGludCk6CiAgICAiIiJEZWxldGUgYSBkZWNrIGFuZCBhbGwgaXRzIGNhcmRzIChjYXNjYWRlKS4iIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkgICMgZW5zdXJlIGV4aXN0cwogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICBjb25uLmV4ZWN1dGUoIkRFTEVURSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrcyBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQogICAgcmV0dXJuIHsiZGVsZXRlZCI6IFRydWUsICJkZWNrX2lkIjogZGVja19pZH0KCgpAYXBwLmRlbGV0ZSgiL2FwaS9kZWNrcyIpCmFzeW5jIGRlZiBkZWxldGVfYWxsX2RlY2tzKCk6CiAgICAiIiJEZWxldGUgQUxMIGRlY2tzIGFuZCB0aGVpciBjYXJkcy4iIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrX2NhcmRzIikKICAgIGNvdW50ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgQ09VTlQoKikgRlJPTSBkZWNrcyIpLmZldGNob25lKClbMF0KICAgIGNvbm4uZXhlY3V0ZSgiREVMRVRFIEZST00gZGVja3MiKQogICAgY29ubi5jb21taXQoKQogICAgcmV0dXJuIHsiZGVsZXRlZCI6IFRydWUsICJjb3VudCI6IGNvdW50fQoKCiMg4pSA4pSAIDIuMiBEZWNrIENhcmQgTWFuaXB1bGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgAoKQGFwcC5nZXQoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzIikKYXN5bmMgZGVmIGdldF9kZWNrX2NhcmRzKGRlY2tfaWQ6IGludCk6CiAgICAiIiJHZXQgYWxsIGNhcmRzIGluIGEgZGVjayB3aXRoIGpvaW5lZCBjb2xsZWN0aW9uIGRhdGEuIiIiCiAgICBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIiIiCiAgICAgICAgU0VMRUNUCiAgICAgICAgICAgIGRjLmlkLCBkYy5kZWNrX2lkLCBkYy5zY3J5ZmFsbF9pZCwgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwKICAgICAgICAgICAgZGMuaXNfY29tbWFuZGVyLCBkYy5yb2xlX3RhZywKICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5jbWMsIGNlLm1hbmFfY29zdCwgY2UuY29sb3JfaWRlbnRpdHksIGNlLm9yYWNsZV90ZXh0LCBjZS5rZXl3b3JkcywKICAgICAgICAgICAgY2UudGNnX3ByaWNlLCBjZS5xdWFudGl0eSBBUyBvd25lZF9xdHksIGNlLmlzX2xlZ2VuZGFyeSwKICAgICAgICAgICAgY2Uuc2FsdF9zY29yZSwgY2UuaXNfZ2FtZV9jaGFuZ2VyCiAgICAgICAgRlJPTSBkZWNrX2NhcmRzIGRjCiAgICAgICAgTEVGVCBKT0lOIGNvbGxlY3Rpb25fZW50cmllcyBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgV0hFUkUgZGMuZGVja19pZCA9ID8KICAgICAgICBPUkRFUiBCWSBkYy5pc19jb21tYW5kZXIgREVTQywgZGMuY2FyZF9uYW1lIEFTQwogICAgICAgICIiIiwKICAgICAgICAoZGVja19pZCwpCiAgICApLmZldGNoYWxsKCkKICAgIGNhcmRzID0gW10KICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBkID0gZGljdChyb3cpCiAgICAgICAgIyBQYXJzZSBKU09OIGZpZWxkcwogICAgICAgIGZvciBmIGluICgiY29sb3JfaWRlbnRpdHkiLCAia2V5d29yZHMiKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkLmdldChmKSwgc3RyKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBkW2ZdID0ganNvbi5sb2FkcyhkW2ZdKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBkW2ZdID0gW10KICAgICAgICBkWyJpbWFnZV91cmwiXSA9ICgKICAgICAgICAgICAgZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve2RbJ3NjcnlmYWxsX2lkJ119P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIKICAgICAgICAgICAgaWYgZC5nZXQoInNjcnlmYWxsX2lkIikgZWxzZSBOb25lCiAgICAgICAgKQogICAgICAgIGNhcmRzLmFwcGVuZChkKQogICAgcmV0dXJuIHsiY2FyZHMiOiBjYXJkcywgInRvdGFsIjogbGVuKGNhcmRzKX0KCgpAYXBwLnBvc3QoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzIikKYXN5bmMgZGVmIGFkZF9kZWNrX2NhcmQoZGVja19pZDogaW50LCByZXE6IEFkZERlY2tDYXJkUmVxdWVzdCk6CiAgICAiIiJBZGQgb3IgdXBkYXRlIGEgY2FyZCBpbiB0aGUgZGVjay4iIiIKICAgIF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgTG9vayB1cCBjYXJkX25hbWUgZnJvbSBjb2xsZWN0aW9uX2VudHJpZXMgYnkgc2NyeWZhbGxfaWQsIGZhbGwgYmFjayB0byByZXF1ZXN0CiAgICBjZV9yb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBuYW1lIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHNjcnlmYWxsX2lkID0gPyBMSU1JVCAxIiwKICAgICAgICAocmVxLnNjcnlmYWxsX2lkLCkKICAgICkuZmV0Y2hvbmUoKQogICAgY2FyZF9uYW1lID0gY2Vfcm93WyJuYW1lIl0gaWYgY2Vfcm93IGVsc2UgKHJlcS5jYXJkX25hbWUgb3IgIiIpCgogICAgIyBDaGVjayBpZiB0aGlzIHNjcnlmYWxsX2lkIGlzIGFscmVhZHkgaW4gdGhlIGRlY2sKICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgc2NyeWZhbGxfaWQgPSA/IiwKICAgICAgICAoZGVja19pZCwgcmVxLnNjcnlmYWxsX2lkKQogICAgKS5mZXRjaG9uZSgpCgogICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgbmV3X3F0eSA9IGV4aXN0aW5nWyJxdWFudGl0eSJdICsgKHJlcS5xdWFudGl0eSBvciAxKQogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlVQREFURSBkZWNrX2NhcmRzIFNFVCBxdWFudGl0eSA9' +
'ID8sIHJvbGVfdGFnID0gPywgaXNfY29tbWFuZGVyID0gPyBXSEVSRSBpZCA9ID8iLAogICAgICAgICAgICAobmV3X3F0eSwgcmVxLnJvbGVfdGFnIG9yICIiLCByZXEuaXNfY29tbWFuZGVyIG9yIDAsIGV4aXN0aW5nWyJpZCJdKQogICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKGV4aXN0aW5nWyJpZCJdLCkpLmZldGNob25lKCkKICAgIGVsc2U6CiAgICAgICAgY3VyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiIiIKICAgICAgICAgICAgSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlciwgcm9sZV90YWcpCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPykKICAgICAgICAgICAgIiIiLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBkZWNrX2lkLCByZXEuc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwKICAgICAgICAgICAgICAgIHJlcS5xdWFudGl0eSBvciAxLAogICAgICAgICAgICAgICAgcmVxLmlzX2NvbW1hbmRlciBvciAwLAogICAgICAgICAgICAgICAgcmVxLnJvbGVfdGFnIG9yICIiCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChjdXIubGFzdHJvd2lkLCkpLmZldGNob25lKCkKCiAgICAjIFVwZGF0ZSBkZWNrIHVwZGF0ZWRfYXQKICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCiAgICByZXR1cm4gZGljdChyb3cpCgoKQGFwcC5kZWxldGUoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzL3tjYXJkX2lkfSIpCmFzeW5jIGRlZiByZW1vdmVfZGVja19jYXJkKGRlY2tfaWQ6IGludCwgY2FyZF9pZDogaW50KToKICAgICIiIlJlbW92ZSBhIGNhcmQgZnJvbSBhIGRlY2suIiIiCiAgICBfZ2V0X2RlY2tfb3JfNDA0KGRlY2tfaWQpCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGlkIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8gQU5EIGRlY2tfaWQgPSA/IiwgKGNhcmRfaWQsIGRlY2tfaWQpCiAgICApLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiQ2FyZCBzbG90IHtjYXJkX2lkfSBub3QgZm91bmQgaW4gZGVjayB7ZGVja19pZH0iKQogICAgY29ubi5leGVjdXRlKCJERUxFVEUgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGlkID0gPyIsIChjYXJkX2lkLCkpCiAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgY29ubi5jb21taXQoKQogICAgcmV0dXJuIHsiZGVsZXRlZCI6IFRydWUsICJjYXJkX2lkIjogY2FyZF9pZCwgImRlY2tfaWQiOiBkZWNrX2lkfQoKCkBhcHAucGF0Y2goIi9hcGkvZGVja3Mve2RlY2tfaWR9L2NhcmRzL3tjYXJkX2lkfSIpCmFzeW5jIGRlZiBwYXRjaF9kZWNrX2NhcmQoZGVja19pZDogaW50LCBjYXJkX2lkOiBpbnQsIHJlcTogUGF0Y2hEZWNrQ2FyZFJlcXVlc3QpOgogICAgIiIiVXBkYXRlIHF1YW50aXR5IG9yIHJvbGVfdGFnIGZvciBhIGNhcmQgaW4gYSBkZWNrLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCAqIEZST00gZGVja19jYXJkcyBXSEVSRSBpZCA9ID8gQU5EIGRlY2tfaWQgPSA/IiwgKGNhcmRfaWQsIGRlY2tfaWQpCiAgICApLmZldGNob25lKCkKICAgIGlmIG5vdCByb3c6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiQ2FyZCBzbG90IHtjYXJkX2lkfSBub3QgZm91bmQgaW4gZGVjayB7ZGVja19pZH0iKQoKICAgIHVwZGF0ZXMgPSB7fQogICAgaWYgcmVxLnF1YW50aXR5IGlzIG5vdCBOb25lOgogICAgICAgIGlmIHJlcS5xdWFudGl0eSA8IDE6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAicXVhbnRpdHkgbXVzdCBiZSA+PSAxIikKICAg' +
'ICAgICB1cGRhdGVzWyJxdWFudGl0eSJdID0gcmVxLnF1YW50aXR5CiAgICBpZiByZXEucm9sZV90YWcgaXMgbm90IE5vbmU6CiAgICAgICAgdXBkYXRlc1sicm9sZV90YWciXSA9IHJlcS5yb2xlX3RhZwoKICAgIGlmIHVwZGF0ZXM6CiAgICAgICAgc2V0X2NsYXVzZSA9ICIsICIuam9pbihmIntrfSA9ID8iIGZvciBrIGluIHVwZGF0ZXMpCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICBmIlVQREFURSBkZWNrX2NhcmRzIFNFVCB7c2V0X2NsYXVzZX0gV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgbGlzdCh1cGRhdGVzLnZhbHVlcygpKSArIFtjYXJkX2lkXQogICAgICAgICkKICAgICAgICBjb25uLmV4ZWN1dGUoIlVQREFURSBkZWNrcyBTRVQgdXBkYXRlZF9hdCA9IGRhdGV0aW1lKCdub3cnKSBXSEVSRSBpZCA9ID8iLCAoZGVja19pZCwpKQogICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICB1cGRhdGVkID0gY29ubi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgaWQgPSA/IiwgKGNhcmRfaWQsKSkuZmV0Y2hvbmUoKQogICAgcmV0dXJuIGRpY3QodXBkYXRlZCkKCgojIOKUgOKUgCAyLjMgRGVjayBBbmFseXNpcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9hbmFseXNpcyIpCmFzeW5jIGRlZiBkZWNrX2FuYWx5c2lzKGRlY2tfaWQ6IGludCk6CiAgICAiIiJBbmFseXplIGRlY2sgY29tcG9zaXRpb24g4oCUIHR5cGUgY291bnRzLCBtYW5hIGN1cnZlLCBjb2xvciBwaXBzLCByb2xlcywgdGFyZ2V0cywgZGVsdGFzLiIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgcmV0dXJuIF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKCgojIOKUgOKUgCAyLjUgUmVjb21tZW5kYXRpb25zIGZyb20gQ29sbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAuZ2V0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9yZWNvbW1lbmRlZC1mcm9tLWNvbGxlY3Rpb24iKQphc3luYyBkZWYgcmVjb21tZW5kX2Zyb21fY29sbGVjdGlvbihkZWNrX2lkOiBpbnQsIG1heF9yZXN1bHRzOiBpbnQgPSAyMCwgcm9sZXM6IE9wdGlvbmFsW3N0cl0gPSBOb25lKToKICAgICIiIgogICAgUmVjb21tZW5kIGNhcmRzIGZyb20gdGhlIHVzZXIncyBjb2xsZWN0aW9uIGZvciBhIGRlY2suCiAgICBGaW5kcyBzaG9ydGZhbGxzLCB0aGVuIHNjb3JlcyBvd25lZCBjYXJkcyBieSBob3cgd2VsbCB0aGV5IGZpdC4KICAgICIiIgogICAgZGVjayA9IF9nZXRfZGVja19vcl80MDQoZGVja19pZCkKICAgIGRlY2tfY29sb3JfaWRlbnRpdHkgPSBkZWNrLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgUnVuIGFuYWx5c2lzIHRvIGZpbmQgc2hvcnRmYWxscwogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICBkZWx0YXMgPSBhbmFseXNpc1siZGVsdGFzIl0KICAgIGNvdW50c19ieV90eXBlID0gYW5hbHlzaXNbImNvdW50c19ieV90eXBlIl0KCiAgICAjIEZpbmQgdHlwZXMgdGhhdCBhcmUgYmVsb3cgdGhlaXIgdGFyZ2V0IG1pZHBvaW50IChzaG9ydGZhbGwpCiAgICBzaG9ydGZhbGxfdHlwZXMgPSBzZXQoKQogICAgZm9yIHQsIGRlbHRhIGluIGRlbHRhcy5pdGVtcygpOgogICAgICAgIGxvLCBoaSA9IF9UWVBFX1RBUkdFVFMuZ2V0KHQsIFswLCAwXSkKICAgICAgICBpZiBjb3VudHNfYnlfdHlwZS5nZXQodCwgMCkgPCBsbzoKICAgICAgICAgICAgc2hvcnRmYWxsX3R5cGVzLmFkZCh0KQoKICAgICMgR2V0IHNjcnlmYWxsX2lkcyBhbHJlYWR5IGluIGRlY2sgdG8gZXhjbHVkZQogICAgaW5fZGVja19pZHMgPSBzZXQoCiAgICAgICAgclsic2NyeWZhbGxfaWQiXSBmb3IgciBpbgogICAgICAgIGNvbm4uZXhlY3V0ZSgiU0VMRUNUIHNjcnlmYWxsX2lkIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyIsIChkZWNrX2lkLCkpLmZldGNoYWxsKCkKICAgICkKCiAgICAjIFBhcnNlIHJvbGUgZmlsdGVyCiAgICByb2xlX2ZpbHRlciA9IFtyLnN0cmlwKCkgZm9yIHIgaW4gcm9sZXMuc3BsaXQoIiwiKSBpZiBy' +
'LnN0cmlwKCldIGlmIHJvbGVzIGVsc2UgW10KCiAgICAjIFF1ZXJ5IGNvbGxlY3Rpb24gZm9yIGNhbmRpZGF0ZSBjYXJkcwogICAgY29sbF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgKiBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBxdWFudGl0eSA+IDAiCiAgICApLmZldGNoYWxsKCkKCiAgICBzY29yZWQgPSBbXQogICAgZm9yIHJvdyBpbiBjb2xsX3Jvd3M6CiAgICAgICAgY2FyZCA9IF9yb3dfdG9fZGljdChyb3cpCiAgICAgICAgY2FyZF9pZCA9IGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKQoKICAgICAgICAjIFNraXAgY2FyZHMgYWxyZWFkeSBpbiBkZWNrCiAgICAgICAgaWYgY2FyZF9pZCBpbiBpbl9kZWNrX2lkczoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBDb2xvciBpZGVudGl0eSBjaGVjazogYWxsIGNhcmQgY29sb3JzIG11c3QgYmUgaW4gZGVjayBjb2xvcnMKICAgICAgICBjYXJkX2NpID0gY2FyZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICAgICAgaWYgaXNpbnN0YW5jZShjYXJkX2NpLCBzdHIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjYXJkX2NpID0ganNvbi5sb2FkcyhjYXJkX2NpKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgY2FyZF9jaSA9IFtdCiAgICAgICAgaWYgZGVja19jb2xvcl9pZGVudGl0eSBhbmQgY2FyZF9jaToKICAgICAgICAgICAgaWYgbm90IGFsbChjIGluIGRlY2tfY29sb3JfaWRlbnRpdHkgZm9yIGMgaW4gY2FyZF9jaSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICB0eXBlX2xpbmUgPSBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICAgICAgb3JhY2xlX3RleHQgPSBjYXJkLmdldCgib3JhY2xlX3RleHQiLCAiIikKICAgICAgICBrZXl3b3JkcyA9IGNhcmQuZ2V0KCJrZXl3b3JkcyIsIFtdKQogICAgICAgIGNhcmRfdHlwZSA9IF9jbGFzc2lmeV9jYXJkX3R5cGUodHlwZV9saW5lKQogICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCgogICAgICAgICMgUm9sZSBmaWx0ZXIKICAgICAgICBpZiByb2xlX2ZpbHRlciBhbmQgbm90IGFueShyIGluIGNhcmRfcm9sZXMgZm9yIHIgaW4gcm9sZV9maWx0ZXIpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFNjb3JpbmcKICAgICAgICBzY29yZSA9IDAKICAgICAgICAjICszIGlmIGNhcmQgdHlwZSBpcyBpbiBzaG9ydGZhbGwKICAgICAgICBpZiBjYXJkX3R5cGUgaW4gc2hvcnRmYWxsX3R5cGVzOgogICAgICAgICAgICBzY29yZSArPSAzCiAgICAgICAgIyArMiBwZXIgbWF0Y2hpbmcgcm9sZQogICAgICAgIGZvciByIGluIGNhcmRfcm9sZXM6CiAgICAgICAgICAgIGlmIHIgaW4gKCJSYW1wIiwgIkRyYXciLCAiUmVtb3ZhbCIsICJCb2FyZFdpcGUiKToKICAgICAgICAgICAgICAgIHNjb3JlICs9IDIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNjb3JlICs9IDEKICAgICAgICAjICsxIGZvciBsb3dlciBDTUMgKGN1cnZlIGZpdCkKICAgICAgICBjbWMgPSBmbG9hdChjYXJkLmdldCgiY21jIiwgMCkpCiAgICAgICAgaWYgY21jIDw9IDM6CiAgICAgICAgICAgIHNjb3JlICs9IDEKCiAgICAgICAgc2NvcmVkLmFwcGVuZCh7CiAgICAgICAgICAgICJpZCI6IGNhcmQuZ2V0KCJpZCIpLAogICAgICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkX2lkLAogICAgICAgICAgICAibmFtZSI6IGNhcmQuZ2V0KCJuYW1lIiksCiAgICAgICAgICAgICJ0eXBlX2xpbmUiOiB0eXBlX2xpbmUsCiAgICAgICAgICAgICJjYXJkX3R5cGUiOiBjYXJkX3R5cGUsCiAgICAgICAgICAgICJjbWMiOiBjbWMsCiAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNhcmRfY2ksCiAgICAgICAgICAgICJvd25lZF9xdHkiOiBjYXJkLmdldCgicXVhbnRpdHkiLCAwKSwKICAgICAgICAgICAgInJvbGVzIjogY2FyZF9yb2xlcywKICAgICAgICAgICAgInNjb3JlIjogc2NvcmUsCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97Y2FyZF9pZH0/Zm9ybWF0PWltYWdlJnZlcnNpb249bm9ybWFsIiBpZiBjYXJkX2lkIGVsc2UgTm9uZSwKICAgICAgICB9KQoKICAgIHNjb3JlZC5zb3J0KGtleT1sYW1iZGEgeDogeFsic2NvcmUiXSwgcmV2ZXJzZT1UcnVlKQoKICAgICMgR3JvdXAgYnkgdHlwZQogICAgZ3Jv' +
'dXBlZCA9IHt9CiAgICBmb3IgY2FyZCBpbiBzY29yZWRbOm1heF9yZXN1bHRzXToKICAgICAgICBjdCA9IGNhcmRbImNhcmRfdHlwZSJdCiAgICAgICAgZ3JvdXBlZC5zZXRkZWZhdWx0KGN0LCBbXSkuYXBwZW5kKGNhcmQpCgogICAgcmV0dXJuIHsKICAgICAgICAic2hvcnRmYWxsX3R5cGVzIjogbGlzdChzaG9ydGZhbGxfdHlwZXMpLAogICAgICAgICJyb2xlX2ZpbHRlciI6IHJvbGVfZmlsdGVyLAogICAgICAgICJncm91cGVkIjogZ3JvdXBlZCwKICAgICAgICAidG90YWwiOiBsZW4oc2NvcmVkWzptYXhfcmVzdWx0c10pLAogICAgfQoKCiMg4pSA4pSAIDIuNiBFREhSRUMtc3R5bGUgUmVjb21tZW5kYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKQGFwcC5nZXQoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2VkaC1yZWNzIikKYXN5bmMgZGVmIGRlY2tfZWRoX3JlY3MoZGVja19pZDogaW50LCBvbmx5X293bmVkOiBib29sID0gRmFsc2UsIG1heF9yZXN1bHRzOiBpbnQgPSAzMCk6CiAgICAiIiIKICAgIEZldGNoIEVESFJFQyBhdmVyYWdlIGRlY2sgcmVjb21tZW5kYXRpb25zIGZvciB0aGlzIGRlY2sncyBjb21tYW5kZXIuCiAgICBDcm9zcy1yZWZlcmVuY2VzIHdpdGggY29sbGVjdGlvbiBmb3Igb3duZWQgc3RhdHVzLgogICAgIiIiCiAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29tbWFuZGVyX25hbWUgPSBkZWNrLmdldCgiY29tbWFuZGVyX25hbWUiLCAiIikKICAgIGlmIG5vdCBjb21tYW5kZXJfbmFtZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIkRlY2sgaGFzIG5vIGNvbW1hbmRlcl9uYW1lIHNldC4gVXBkYXRlIHRoZSBkZWNrIGZpcnN0LiIpCgogICAgIyBDYWNoZSBjaGVjawogICAgY2FjaGVfa2V5ID0gZiJlZGhyZWM6YXZnOntfdG9fZWRocmVjX3NsdWcoY29tbWFuZGVyX25hbWUpfSIKICAgIGNhY2hlZF9wcm9maWxlID0gX2VkaHJlY19jYWNoZV9nZXQoY2FjaGVfa2V5KQogICAgaWYgY2FjaGVkX3Byb2ZpbGUgaXMgTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhY2hlZF9wcm9maWxlID0gX2ZldGNoX2VkaHJlY19hdmVyYWdlKGNvbW1hbmRlcl9uYW1lKQogICAgICAgICAgICBfZWRocmVjX2NhY2hlX3NldChjYWNoZV9rZXksIGNhY2hlZF9wcm9maWxlKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDIsIGYiRmFpbGVkIHRvIGZldGNoIEVESFJFQyBkYXRhIGZvciAne2NvbW1hbmRlcl9uYW1lfSc6IHtzdHIoZSl9IikKCiAgICBlZGhyZWNfcHJvZmlsZSA9IGNhY2hlZF9wcm9maWxlCiAgICBtYWluYm9hcmQgPSBlZGhyZWNfcHJvZmlsZS5nZXQoIm1haW5ib2FyZCIsIHt9KQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgR2V0IGNhcmRzIGFscmVhZHkgaW4gZGVjawogICAgaW5fZGVja19uYW1lcyA9IHNldCgKICAgICAgICByWyJjYXJkX25hbWUiXS5sb3dlcigpIGZvciByIGluCiAgICAgICAgY29ubi5leGVjdXRlKCJTRUxFQ1QgY2FyZF9uYW1lIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyIsIChkZWNrX2lkLCkpLmZldGNoYWxsKCkKICAgICkKCiAgICAjIEJ1aWxkIGNvbGxlY3Rpb24gbG9va3VwOiBuYW1lIChsb3dlcikgLT4ge293bmVkLCBxdHksIHNjcnlmYWxsX2lkfQogICAgY29sbF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgbmFtZSwgcXVhbnRpdHksIHNjcnlmYWxsX2lkIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIgogICAgKS5mZXRjaGFsbCgpCiAgICBjb2xsX21hcCA9IHt9CiAgICBmb3IgciBpbiBjb2xsX3Jvd3M6CiAgICAgICAga2V5ID0gclsibmFtZSJdLmxvd2VyKCkKICAgICAgICBleGlzdGluZyA9IGNvbGxfbWFwLmdldChrZXkpCiAgICAgICAgaWYgbm90IGV4aXN0aW5nIG9yIHJbInF1YW50aXR5Il0gPiBleGlzdGluZ1sicXR5Il06CiAgICAgICAgICAgIGNvbGxfbWFwW2tleV0gPSB7Im93bmVkIjogVHJ1ZSwgInF0eSI6IHJbInF1YW50aXR5Il0sICJzY3J5ZmFsbF9pZCI6IHJbInNjcnlmYWxsX2lkIl19CgogICAgIyBBbHNvIGxvb2sgdXAgY2FyZCBkZXRhaWxzIGZyb20gY29sbGVjdGlvbl9lbnRyaWVzIGZvciB0eXBlL3JvbGUKICAgIGNvbGxfZGV0YWlscyA9IHt9CiAgICBmb3IgciBpbiBjb25uLmV4ZWN1dGUoIlNFTEVDVCBuYW1lLCB0' +
'eXBlX2xpbmUsIG9yYWNsZV90ZXh0LCBrZXl3b3Jkcywgc2NyeWZhbGxfaWQgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMiKS5mZXRjaGFsbCgpOgogICAgICAgIGtleSA9IHJbIm5hbWUiXS5sb3dlcigpCiAgICAgICAgaWYga2V5IG5vdCBpbiBjb2xsX2RldGFpbHM6CiAgICAgICAgICAgIGNvbGxfZGV0YWlsc1trZXldID0gZGljdChyKQoKICAgIHJlc3VsdHMgPSBbXQogICAgZm9yIGNhcmRfbmFtZSBpbiBtYWluYm9hcmQ6CiAgICAgICAgbmFtZV9sb3dlciA9IGNhcmRfbmFtZS5sb3dlcigpCiAgICAgICAgIyBTa2lwIGNhcmRzIGFscmVhZHkgaW4gZGVjawogICAgICAgIGlmIG5hbWVfbG93ZXIgaW4gaW5fZGVja19uYW1lczoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgb3duZWRfaW5mbyA9IGNvbGxfbWFwLmdldChuYW1lX2xvd2VyLCB7Im93bmVkIjogRmFsc2UsICJxdHkiOiAwLCAic2NyeWZhbGxfaWQiOiAiIn0pCgogICAgICAgIGlmIG9ubHlfb3duZWQgYW5kIG5vdCBvd25lZF9pbmZvWyJvd25lZCJdOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIEdldCB0eXBlL3JvbGUgZnJvbSBjb2xsZWN0aW9uIGlmIGF2YWlsYWJsZQogICAgICAgIGRldGFpbHMgPSBjb2xsX2RldGFpbHMuZ2V0KG5hbWVfbG93ZXIsIHt9KQogICAgICAgIHR5cGVfbGluZSA9IGRldGFpbHMuZ2V0KCJ0eXBlX2xpbmUiLCAiIikKICAgICAgICBvcmFjbGVfdGV4dCA9IGRldGFpbHMuZ2V0KCJvcmFjbGVfdGV4dCIsICIiKQogICAgICAgIGtleXdvcmRzID0gZGV0YWlscy5nZXQoImtleXdvcmRzIiwgIltdIikKICAgICAgICBjYXJkX3JvbGVzID0gX2RldGVjdF9jYXJkX3JvbGVzKG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGtleXdvcmRzKQogICAgICAgIHNjcnlmYWxsX2lkID0gb3duZWRfaW5mby5nZXQoInNjcnlmYWxsX2lkIikgb3IgZGV0YWlscy5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCgogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgIm5hbWUiOiBjYXJkX25hbWUsCiAgICAgICAgICAgICJ0eXBlX2xpbmUiOiB0eXBlX2xpbmUsCiAgICAgICAgICAgICJyb2xlIjogY2FyZF9yb2xlc1swXSBpZiBjYXJkX3JvbGVzIGVsc2UgIk90aGVyIiwKICAgICAgICAgICAgInJvbGVzIjogY2FyZF9yb2xlcywKICAgICAgICAgICAgImluY2x1c2lvbl9wY3QiOiBOb25lLCAgIyBFREhSRUMgYXZlcmFnZSBkb2Vzbid0IGV4cG9zZSAlIGRpcmVjdGx5IGluIHRoaXMgcGF0aAogICAgICAgICAgICAic3luZXJneV9zY29yZSI6IE5vbmUsCiAgICAgICAgICAgICJvd25lZCI6IG93bmVkX2luZm9bIm93bmVkIl0sCiAgICAgICAgICAgICJvd25lZF9xdHkiOiBvd25lZF9pbmZvWyJxdHkiXSwKICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97c2NyeWZhbGxfaWR9P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIgaWYgc2NyeWZhbGxfaWQgZWxzZSBOb25lLAogICAgICAgIH0pCgogICAgcmV0dXJuIHsKICAgICAgICAiY29tbWFuZGVyIjogY29tbWFuZGVyX25hbWUsCiAgICAgICAgInNvdXJjZSI6ICJFREhSRUMgQXZlcmFnZSIsCiAgICAgICAgInRvdGFsIjogbGVuKHJlc3VsdHNbOm1heF9yZXN1bHRzXSksCiAgICAgICAgInJlY29tbWVuZGF0aW9ucyI6IHJlc3VsdHNbOm1heF9yZXN1bHRzXSwKICAgIH0KCgojIOKUgOKUgCAyLjcgQnVsayBBZGQgT3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfY2hlY2tfcmF0aW9fbGltaXQoZGVja19pZDogaW50LCBjYXJkX3R5cGU6IHN0ciwgY291bnRfdG9fYWRkOiBpbnQgPSAxKSAtPiBib29sOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBhZGRpbmcgY291bnRfdG9fYWRkIGNhcmRzIG9mIGNhcmRfdHlwZSBzdGF5cyB3aXRoaW4gdGFyZ2V0IG1heC4KICAgICIiIgogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICBjdXJyZW50ID0gYW5hbHlzaXNbImNvdW50c19ieV90eXBlIl0uZ2V0KGNhcmRfdHlwZSwgMCkKICAgIHRhcmdldF9tYXggPSBfVFlQRV9UQVJHRVRTLmdldChjYXJkX3R5cGUsIFswLCA5OTk5XSlbMV0KICAgIHJldHVybiAoY3VycmVudCArIGNvdW50X3RvX2FkZCkgPD0g' +
'dGFyZ2V0X21heAoKCkBhcHAucG9zdCgiL2FwaS9kZWNrcy97ZGVja19pZH0vYnVsay1hZGQiKQphc3luYyBkZWYgYnVsa19hZGRfY2FyZHMoZGVja19pZDogaW50LCByZXE6IEJ1bGtBZGRSZXF1ZXN0KToKICAgICIiIgogICAgQnVsay1hZGQgY2FyZHMgdG8gYSBkZWNrIGJ5IHNjcnlmYWxsX2lkLgogICAgSWYgcmVzcGVjdF9yYXRpb3MsIHNraXBzIGNhcmRzIG9mIGEgdHlwZSB3aGVuIHRoZSB0YXJnZXQgbWF4IGlzIGFscmVhZHkgcmVhY2hlZC4KICAgICIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgYWRkZWQgPSAwCiAgICBza2lwcGVkID0gMAogICAgZGV0YWlscyA9IFtdCgogICAgZm9yIGNhcmRfZW50cnkgaW4gcmVxLmNhcmRzOgogICAgICAgIHNjcnlmYWxsX2lkID0gc3RyKGNhcmRfZW50cnkuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSkuc3RyaXAoKQogICAgICAgIHF1YW50aXR5ID0gaW50KGNhcmRfZW50cnkuZ2V0KCJxdWFudGl0eSIsIDEpKQogICAgICAgIGlmIG5vdCBzY3J5ZmFsbF9pZDoKICAgICAgICAgICAgc2tpcHBlZCArPSAxCiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHsic2NyeWZhbGxfaWQiOiBzY3J5ZmFsbF9pZCwgInN0YXR1cyI6ICJza2lwcGVkIiwgInJlYXNvbiI6ICJtaXNzaW5nIHNjcnlmYWxsX2lkIn0pCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgTG9vayB1cCBjYXJkIG5hbWUgYW5kIHR5cGUgZnJvbSBjb2xsZWN0aW9uCiAgICAgICAgY2Vfcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIG5hbWUsIHR5cGVfbGluZSwgb3JhY2xlX3RleHQsIGtleXdvcmRzIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHNjcnlmYWxsX2lkID0gPyBMSU1JVCAxIiwKICAgICAgICAgICAgKHNjcnlmYWxsX2lkLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBjYXJkX25hbWUgPSBjZV9yb3dbIm5hbWUiXSBpZiBjZV9yb3cgZWxzZSAiIgogICAgICAgIHR5cGVfbGluZSA9IGNlX3Jvd1sidHlwZV9saW5lIl0gaWYgY2Vfcm93IGVsc2UgIiIKICAgICAgICBjYXJkX3R5cGUgPSBfY2xhc3NpZnlfY2FyZF90eXBlKHR5cGVfbGluZSkKCiAgICAgICAgaWYgcmVxLnJlc3BlY3RfcmF0aW9zIGFuZCBub3QgX2NoZWNrX3JhdGlvX2xpbWl0KGRlY2tfaWQsIGNhcmRfdHlwZSwgcXVhbnRpdHkpOgogICAgICAgICAgICBza2lwcGVkICs9IDEKICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoewogICAgICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsCiAgICAgICAgICAgICAgICAibmFtZSI6IGNhcmRfbmFtZSwKICAgICAgICAgICAgICAgICJjYXJkX3R5cGUiOiBjYXJkX3R5cGUsCiAgICAgICAgICAgICAgICAic3RhdHVzIjogInNraXBwZWQiLAogICAgICAgICAgICAgICAgInJlYXNvbiI6IGYiVHlwZSAne2NhcmRfdHlwZX0nIGF0IG9yIGFib3ZlIHRhcmdldCBtYXgiLAogICAgICAgICAgICB9KQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFVwc2VydAogICAgICAgIGV4aXN0aW5nID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIGlkLCBxdWFudGl0eSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8gQU5EIHNjcnlmYWxsX2lkID0gPyIsCiAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCkKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgZGVja19jYXJkcyBTRVQgcXVhbnRpdHkgPSA/IFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICAoZXhpc3RpbmdbInF1YW50aXR5Il0gKyBxdWFudGl0eSwgZXhpc3RpbmdbImlkIl0pCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHkpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5KQogICAgICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGFkZGVkICs9IDEKICAgICAgICBkZXRhaWxzLmFwcGVuZCh7InNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsICJuYW1lIjogY2FyZF9uYW1lLCAi' +
'Y2FyZF90eXBlIjogY2FyZF90eXBlLCAic3RhdHVzIjogImFkZGVkIiwgInF1YW50aXR5IjogcXVhbnRpdHl9KQoKICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCgogICAgYW5hbHlzaXMgPSBfY29tcHV0ZV9kZWNrX2FuYWx5c2lzKGRlY2tfaWQpCiAgICByZXR1cm4geyJhZGRlZCI6IGFkZGVkLCAic2tpcHBlZCI6IHNraXBwZWQsICJkZXRhaWxzIjogZGV0YWlscywgImFuYWx5c2lzIjogYW5hbHlzaXN9CgoKQGFwcC5wb3N0KCIvYXBpL2RlY2tzL3tkZWNrX2lkfS9idWxrLWFkZC1yZWNvbW1lbmRlZCIpCmFzeW5jIGRlZiBidWxrX2FkZF9yZWNvbW1lbmRlZChkZWNrX2lkOiBpbnQsIHJlcTogQnVsa0FkZFJlY29tbWVuZGVkUmVxdWVzdCk6CiAgICAiIiIKICAgIEZldGNoIHJlY29tbWVuZGF0aW9ucyBmcm9tICdjb2xsZWN0aW9uJyBvciAnZWRocmVjJywgZmlsdGVyLCBhbmQgYnVsay1hZGQgdG8gZGVjay4KICAgICIiIgogICAgX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgc291cmNlID0gKHJlcS5zb3VyY2Ugb3IgImNvbGxlY3Rpb24iKS5sb3dlcigpCiAgICB0eXBlX2ZpbHRlciA9IFt0LnN0cmlwKCkgZm9yIHQgaW4gcmVxLnR5cGVzXSBpZiByZXEudHlwZXMgZWxzZSBbXQogICAgcm9sZV9maWx0ZXIgPSBbci5zdHJpcCgpIGZvciByIGluIHJlcS5yb2xlc10gaWYgcmVxLnJvbGVzIGVsc2UgW10KCiAgICBjYW5kaWRhdGVzID0gW10KCiAgICBpZiBzb3VyY2UgPT0gImNvbGxlY3Rpb24iOgogICAgICAgICMgUmV1c2UgdGhlIHJlY29tbWVuZF9mcm9tX2NvbGxlY3Rpb24gbG9naWMKICAgICAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgICAgIGRlY2tfY29sb3JfaWRlbnRpdHkgPSBkZWNrLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgICAgICBhbmFseXNpcyA9IF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKICAgICAgICBjb3VudHNfYnlfdHlwZSA9IGFuYWx5c2lzWyJjb3VudHNfYnlfdHlwZSJdCiAgICAgICAgc2hvcnRmYWxsX3R5cGVzID0ge3QgZm9yIHQsIChsbywgXykgaW4gX1RZUEVfVEFSR0VUUy5pdGVtcygpIGlmIGNvdW50c19ieV90eXBlLmdldCh0LCAwKSA8IGxvfQoKICAgICAgICBpbl9kZWNrX2lkcyA9IHNldCgKICAgICAgICAgICAgclsic2NyeWZhbGxfaWQiXSBmb3IgciBpbgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoIlNFTEVDVCBzY3J5ZmFsbF9pZCBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCiAgICAgICAgKQogICAgICAgIGNvbGxfcm93cyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgcXVhbnRpdHkgPiAwIikuZmV0Y2hhbGwoKQogICAgICAgIGZvciByb3cgaW4gY29sbF9yb3dzOgogICAgICAgICAgICBjYXJkID0gX3Jvd190b19kaWN0KHJvdykKICAgICAgICAgICAgY2lkID0gY2FyZC5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCiAgICAgICAgICAgIGlmIGNpZCBpbiBpbl9kZWNrX2lkczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNhcmRfY2kgPSBjYXJkLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjYXJkX2NpLCBzdHIpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNhcmRfY2kgPSBqc29uLmxvYWRzKGNhcmRfY2kpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGNhcmRfY2kgPSBbXQogICAgICAgICAgICBpZiBkZWNrX2NvbG9yX2lkZW50aXR5IGFuZCBjYXJkX2NpOgogICAgICAgICAgICAgICAgaWYgbm90IGFsbChjIGluIGRlY2tfY29sb3JfaWRlbnRpdHkgZm9yIGMgaW4gY2FyZF9jaSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdGwgPSBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICAgICAgICAgIGN0ID0gX2NsYXNzaWZ5X2NhcmRfdHlwZSh0bCkKICAgICAgICAgICAgY2FyZF9yb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcyhjYXJkLmdldCgib3JhY2xlX3RleHQiLCAiIiksIHRsLCBjYXJkLmdldCgia2V5d29yZHMiLCBbXSkpCiAgICAgICAgICAgIGlmIHR5cGVf' +
'ZmlsdGVyIGFuZCBjdCBub3QgaW4gdHlwZV9maWx0ZXI6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiByb2xlX2ZpbHRlciBhbmQgbm90IGFueShyIGluIGNhcmRfcm9sZXMgZm9yIHIgaW4gcm9sZV9maWx0ZXIpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoeyJzY3J5ZmFsbF9pZCI6IGNpZCwgImNhcmRfdHlwZSI6IGN0LCAicXVhbnRpdHkiOiAxfSkKCiAgICBlbGlmIHNvdXJjZSA9PSAiZWRocmVjIjoKICAgICAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgICAgIGNvbW1hbmRlcl9uYW1lID0gZGVjay5nZXQoImNvbW1hbmRlcl9uYW1lIiwgIiIpCiAgICAgICAgaWYgbm90IGNvbW1hbmRlcl9uYW1lOgogICAgICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIkRlY2sgaGFzIG5vIGNvbW1hbmRlcl9uYW1lIHNldCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlZGhyZWNfcHJvZmlsZSA9IF9mZXRjaF9lZGhyZWNfYXZlcmFnZShjb21tYW5kZXJfbmFtZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAyLCBmIkVESFJFQyBmZXRjaCBmYWlsZWQ6IHtlfSIpCiAgICAgICAgbWFpbmJvYXJkID0gZWRocmVjX3Byb2ZpbGUuZ2V0KCJtYWluYm9hcmQiLCB7fSkKICAgICAgICBpbl9kZWNrX25hbWVzID0gc2V0KAogICAgICAgICAgICByWyJjYXJkX25hbWUiXS5sb3dlcigpIGZvciByIGluCiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgiU0VMRUNUIGNhcmRfbmFtZSBGUk9NIGRlY2tfY2FyZHMgV0hFUkUgZGVja19pZCA9ID8iLCAoZGVja19pZCwpKS5mZXRjaGFsbCgpCiAgICAgICAgKQogICAgICAgIGNvbGxfcm93cyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUIG5hbWUsIHNjcnlmYWxsX2lkLCB0eXBlX2xpbmUsIG9yYWNsZV90ZXh0LCBrZXl3b3JkcywgcXVhbnRpdHkgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMiKS5mZXRjaGFsbCgpCiAgICAgICAgY29sbF9tYXAgPSB7clsibmFtZSJdLmxvd2VyKCk6IGRpY3QocikgZm9yIHIgaW4gY29sbF9yb3dzfQoKICAgICAgICBmb3IgY2FyZF9uYW1lIGluIG1haW5ib2FyZDoKICAgICAgICAgICAgbmFtZV9sb3dlciA9IGNhcmRfbmFtZS5sb3dlcigpCiAgICAgICAgICAgIGlmIG5hbWVfbG93ZXIgaW4gaW5fZGVja19uYW1lczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvbGxfaW5mbyA9IGNvbGxfbWFwLmdldChuYW1lX2xvd2VyKQogICAgICAgICAgICBpZiByZXEub25seV9vd25lZCBhbmQgbm90IGNvbGxfaW5mbzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5vdCBjb2xsX2luZm86CiAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBjYW4ndCBhZGQgd2l0aG91dCBzY3J5ZmFsbF9pZAogICAgICAgICAgICBzY3J5ZmFsbF9pZCA9IGNvbGxfaW5mby5nZXQoInNjcnlmYWxsX2lkIiwgIiIpCiAgICAgICAgICAgIGlmIG5vdCBzY3J5ZmFsbF9pZDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRsID0gY29sbF9pbmZvLmdldCgidHlwZV9saW5lIiwgIiIpCiAgICAgICAgICAgIGN0ID0gX2NsYXNzaWZ5X2NhcmRfdHlwZSh0bCkKICAgICAgICAgICAgY2FyZF9yb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcyhjb2xsX2luZm8uZ2V0KCJvcmFjbGVfdGV4dCIsICIiKSwgdGwsIGNvbGxfaW5mby5nZXQoImtleXdvcmRzIiwgW10pKQogICAgICAgICAgICBpZiB0eXBlX2ZpbHRlciBhbmQgY3Qgbm90IGluIHR5cGVfZmlsdGVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgcm9sZV9maWx0ZXIgYW5kIG5vdCBhbnkociBpbiBjYXJkX3JvbGVzIGZvciByIGluIHJvbGVfZmlsdGVyKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKHsic2NyeWZhbGxfaWQiOiBzY3J5ZmFsbF9pZCwgImNhcmRfdHlwZSI6IGN0LCAicXVhbnRpdHkiOiAxfSkKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIGYiVW5rbm93biBzb3VyY2UgJ3tzb3VyY2V9Jy4gVXNlICdjb2xsZWN0aW9uJyBvciAnZWRocmVjJy4iKQoKICAgICMgTm93IGJ1bGstYWRkIGNhbmRpZGF0ZXMKICAgIGFkZGVkID0gMAogICAgc2tpcHBlZCA9IDAKICAgIGRldGFpbHMgPSBbXQoKICAgIGZvciBjIGluIGNh' +
'bmRpZGF0ZXM6CiAgICAgICAgc2NyeWZhbGxfaWQgPSBjWyJzY3J5ZmFsbF9pZCJdCiAgICAgICAgY2FyZF90eXBlID0gY1siY2FyZF90eXBlIl0KICAgICAgICBxdWFudGl0eSA9IGNbInF1YW50aXR5Il0KCiAgICAgICAgaWYgcmVxLnJlc3BlY3RfcmF0aW9zIGFuZCBub3QgX2NoZWNrX3JhdGlvX2xpbWl0KGRlY2tfaWQsIGNhcmRfdHlwZSwgcXVhbnRpdHkpOgogICAgICAgICAgICBza2lwcGVkICs9IDEKICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoeyJzY3J5ZmFsbF9pZCI6IHNjcnlmYWxsX2lkLCAiY2FyZF90eXBlIjogY2FyZF90eXBlLCAic3RhdHVzIjogInNraXBwZWQiLCAicmVhc29uIjogInJhdGlvIGxpbWl0In0pCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGNlX3JvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBuYW1lIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHNjcnlmYWxsX2lkID0gPyBMSU1JVCAxIiwgKHNjcnlmYWxsX2lkLCkKICAgICAgICApLmZldGNob25lKCkKICAgICAgICBjYXJkX25hbWUgPSBjZV9yb3dbIm5hbWUiXSBpZiBjZV9yb3cgZWxzZSAiIgoKICAgICAgICBleGlzdGluZyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBpZCwgcXVhbnRpdHkgRlJPTSBkZWNrX2NhcmRzIFdIRVJFIGRlY2tfaWQgPSA/IEFORCBzY3J5ZmFsbF9pZCA9ID8iLAogICAgICAgICAgICAoZGVja19pZCwgc2NyeWZhbGxfaWQpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgZGVja19jYXJkcyBTRVQgcXVhbnRpdHkgPSA/IFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICAoZXhpc3RpbmdbInF1YW50aXR5Il0gKyBxdWFudGl0eSwgZXhpc3RpbmdbImlkIl0pCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHkpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5KQogICAgICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGFkZGVkICs9IDEKICAgICAgICBkZXRhaWxzLmFwcGVuZCh7InNjcnlmYWxsX2lkIjogc2NyeWZhbGxfaWQsICJuYW1lIjogY2FyZF9uYW1lLCAiY2FyZF90eXBlIjogY2FyZF90eXBlLCAic3RhdHVzIjogImFkZGVkIn0pCgogICAgY29ubi5leGVjdXRlKCJVUERBVEUgZGVja3MgU0VUIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwgKGRlY2tfaWQsKSkKICAgIGNvbm4uY29tbWl0KCkKCiAgICBhbmFseXNpcyA9IF9jb21wdXRlX2RlY2tfYW5hbHlzaXMoZGVja19pZCkKICAgIHJldHVybiB7ImFkZGVkIjogYWRkZWQsICJza2lwcGVkIjogc2tpcHBlZCwgImRldGFpbHMiOiBkZXRhaWxzLCAiYW5hbHlzaXMiOiBhbmFseXNpc30KCgojIOKUgOKUgCAyLjkgU2ltdWxhdGlvbiBFeHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpAYXBwLnBvc3QoIi9hcGkvZGVja3Mve2RlY2tfaWR9L2V4cG9ydC10by1zaW0iKQphc3luYyBkZWYgZXhwb3J0X2RlY2tfdG9fc2ltKGRlY2tfaWQ6IGludCk6CiAgICAiIiIKICAgIEV4cG9ydCBhIGRlY2sgdG8gRm9yZ2UgLmRjayBmb3JtYXQgYW5kIHNhdmUgdG8gdGhlIEZvcmdlIGRlY2tzIGRpcmVjdG9yeS4KICAgIFJldHVybnMgdGhlIGRlY2sgbmFtZSBmb3IgdXNlIGluIHNpbXVsYXRpb25zLgogICAgIiIiCiAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgY2FyZF9yb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICJTRUxFQ1QgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBPUkRFUiBCWSBpc19jb21tYW5kZXIgREVTQywgY2FyZF9uYW1lIEFTQyIsCiAgICAgICAgKGRlY2tfaWQsKQogICAgKS5mZXRjaGFsbCgpCgogICAgaWYgbm90IGNhcmRfcm93czoKICAgICAgICByYWlzZSBI' +
'VFRQRXhjZXB0aW9uKDQwMCwgIkRlY2sgaGFzIG5vIGNhcmRzIHRvIGV4cG9ydCIpCgogICAgIyBCdWlsZCAuZGNrIGNvbnRlbnQKICAgIGxpbmVzID0gWyJbbWV0YWRhdGFdIl0KICAgIGRlY2tfbmFtZSA9IGRlY2suZ2V0KCJuYW1lIiwgZiJEZWNrIHtkZWNrX2lkfSIpCiAgICBsaW5lcy5hcHBlbmQoZiJOYW1lPXtkZWNrX25hbWV9IikKICAgIGxpbmVzLmFwcGVuZCgiIikKCiAgICBjb21tYW5kZXJzID0gW3IgZm9yIHIgaW4gY2FyZF9yb3dzIGlmIHJbImlzX2NvbW1hbmRlciJdXQogICAgbWFpbmJvYXJkID0gW3IgZm9yIHIgaW4gY2FyZF9yb3dzIGlmIG5vdCByWyJpc19jb21tYW5kZXIiXV0KCiAgICBsaW5lcy5hcHBlbmQoIltDb21tYW5kZXJdIikKICAgIGZvciByIGluIGNvbW1hbmRlcnM6CiAgICAgICAgbmFtZSA9IHJbImNhcmRfbmFtZSJdIG9yICJVbmtub3duIgogICAgICAgIHF0eSA9IHJbInF1YW50aXR5Il0gb3IgMQogICAgICAgIGxpbmVzLmFwcGVuZChmIntxdHl9IHtuYW1lfSIpCgogICAgbGluZXMuYXBwZW5kKCIiKQogICAgbGluZXMuYXBwZW5kKCJbTWFpbl0iKQogICAgZm9yIHIgaW4gbWFpbmJvYXJkOgogICAgICAgIG5hbWUgPSByWyJjYXJkX25hbWUiXSBvciAiVW5rbm93biIKICAgICAgICBxdHkgPSByWyJxdWFudGl0eSJdIG9yIDEKICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7cXR5fSB7bmFtZX0iKQoKICAgIGNvbnRlbnQgPSAiXG4iLmpvaW4obGluZXMpCgogICAgIyBEZXRlcm1pbmUgc2F2ZSBkaXJlY3RvcnkKICAgIHNhZmVfbmFtZSA9IHJlLnN1YihyIlteYS16QS1aMC05IF8tXSIsICIiLCBkZWNrX25hbWUpLnJlcGxhY2UoIiAiLCAiXyIpLnN0cmlwKCkKICAgIGlmIG5vdCBzYWZlX25hbWU6CiAgICAgICAgc2FmZV9uYW1lID0gZiJkZWNrX3tkZWNrX2lkfSIKCiAgICBzYXZlX2RpciA9IENGRy5mb3JnZV9kZWNrc19kaXIKICAgIGlmIG5vdCBzYXZlX2RpciBvciBub3Qgb3MucGF0aC5pc2RpcihzYXZlX2Rpcik6CiAgICAgICAgc2F2ZV9kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImV4cG9ydGVkLWRlY2tzIikKICAgICAgICBvcy5tYWtlZGlycyhzYXZlX2RpciwgZXhpc3Rfb2s9VHJ1ZSkKCiAgICBvdXRfcGF0aCA9IFBhdGgoc2F2ZV9kaXIpIC8gZiJ7c2FmZV9uYW1lfS5kY2siCiAgICBvdXRfcGF0aC53cml0ZV90ZXh0KGNvbnRlbnQsIGVuY29kaW5nPSJ1dGYtOCIpCiAgICBwcmludChmIiAgW0RlY2tCdWlsZGVyXSBFeHBvcnRlZCBkZWNrIHtkZWNrX2lkfSB0byB7b3V0X3BhdGh9IikKCiAgICByZXR1cm4gewogICAgICAgICJzdWNjZXNzIjogVHJ1ZSwKICAgICAgICAiZGVja05hbWUiOiBzYWZlX25hbWUsCiAgICAgICAgImRja0ZpbGUiOiBzdHIob3V0X3BhdGgpLAogICAgICAgICJ0b3RhbENhcmRzIjogc3VtKHJbInF1YW50aXR5Il0gZm9yIHIgaW4gY2FyZF9yb3dzKSwKICAgICAgICAiY29tbWFuZGVyQ291bnQiOiBsZW4oY29tbWFuZGVycyksCiAgICAgICAgIm1haW5ib2FyZENvdW50IjogbGVuKG1haW5ib2FyZCksCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZWNrIEltcG9ydCBFbmRwb2ludAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKCmRlZiBfcGFyc2VfZGVja2xpc3RfdGV4dCh0ZXh0OiBzdHIpIC0+IGRpY3Q6CiAgICAiIiIKICAgIFBhcnNlIGEgZGVja2xpc3QgZnJvbSB0ZXh0LiBTdXBwb3J0czoKICAgICAgLSBGb3JnZSAuZGNrIGZvcm1hdCB3aXRoIFtDb21tYW5kZXJdLCBbRGVja10sIFtNYWluXSBzZWN0aW9ucwogICAgICAtIE1UR0EgZm9ybWF0OiAxIENhcmQgTmFtZQogICAgICAtIFBsYWluOiBDYXJkIE5hbWUgKGFzc3VtZWQgcXR5IDEpCiAgICAgIC0gTGluZXMgc3RhcnRpbmcgd2l0aCAvLyBvciAjIGFyZSBjb21tZW50cwogICAgUmV0dXJucyB7ICdj' +
'b21tYW5kZXJzJzogW3snbmFtZSc6IHN0ciwgJ3F0eSc6IGludH1dLCAnY2FyZHMnOiBbeyduYW1lJzogc3RyLCAncXR5JzogaW50fV0gfQogICAgIiIiCiAgICBjb21tYW5kZXJzID0gW10KICAgIGNhcmRzID0gW10KICAgIHNlY3Rpb24gPSAnbWFpbicgICMgZGVmYXVsdCBzZWN0aW9uCgogICAgZm9yIHJhd19saW5lIGluIHRleHQuc3BsaXRsaW5lcygpOgogICAgICAgIGxpbmUgPSByYXdfbGluZS5zdHJpcCgpCiAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCcvLycpIG9yIGxpbmUuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFNlY3Rpb24gaGVhZGVycwogICAgICAgIGxvdyA9IGxpbmUubG93ZXIoKQogICAgICAgIGlmIGxvdy5zdGFydHN3aXRoKCdbY29tbWFuZGVyJyk6CiAgICAgICAgICAgIHNlY3Rpb24gPSAnY29tbWFuZGVyJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGxvdy5zdGFydHN3aXRoKCdbZGVjaycpIG9yIGxvdy5zdGFydHN3aXRoKCdbbWFpbicpIG9yIGxvdy5zdGFydHN3aXRoKCdbbWFpbmJvYXJkJyk6CiAgICAgICAgICAgIHNlY3Rpb24gPSAnbWFpbicKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBsb3cuc3RhcnRzd2l0aCgnW3NpZGVib2FyZCcpIG9yIGxvdy5zdGFydHN3aXRoKCdbc2lkZScpIG9yIGxvdy5zdGFydHN3aXRoKCdbbWV0YWRhdGEnKToKICAgICAgICAgICAgc2VjdGlvbiA9ICdza2lwJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGxvdy5zdGFydHN3aXRoKCdbJyk6CiAgICAgICAgICAgICMgVW5rbm93biBzZWN0aW9uLCB0cmVhdCBhcyBtYWluCiAgICAgICAgICAgIHNlY3Rpb24gPSAnbWFpbicKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgc2VjdGlvbiA9PSAnc2tpcCc6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgUGFyc2UgcXVhbnRpdHkgKyBuYW1lCiAgICAgICAgbSA9IHJlLm1hdGNoKHInXihcZCspXHMqW3hYXT9ccysoLispJCcsIGxpbmUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgcXR5ID0gaW50KG0uZ3JvdXAoMSkpCiAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDIpLnN0cmlwKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBxdHkgPSAxCiAgICAgICAgICAgIG5hbWUgPSBsaW5lCgogICAgICAgICMgU3RyaXAgc2V0IGNvZGVzIGxpa2UgIihNMjEpIiBvciAiKE0yMSkgMTIzIiBmcm9tIE1UR0EgZXhwb3J0cwogICAgICAgIG5hbWUgPSByZS5zdWIocidccypcKFtBLVowLTldK1wpXHMqXGQqXHMqJCcsICcnLCBuYW1lKS5zdHJpcCgpCgogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBzZWN0aW9uID09ICdjb21tYW5kZXInOgogICAgICAgICAgICBjb21tYW5kZXJzLmFwcGVuZCh7J25hbWUnOiBuYW1lLCAncXR5JzogcXR5fSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBjYXJkcy5hcHBlbmQoeyduYW1lJzogbmFtZSwgJ3F0eSc6IHF0eX0pCgogICAgcmV0dXJuIHsnY29tbWFuZGVycyc6IGNvbW1hbmRlcnMsICdjYXJkcyc6IGNhcmRzfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrcy97ZGVja19pZH0vaW1wb3J0JykKYXN5bmMgZGVmIGltcG9ydF9kZWNrbGlzdChkZWNrX2lkOiBpbnQsIHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIgogICAgSW1wb3J0IGEgZGVja2xpc3QgaW50byBhbiBleGlzdGluZyBkZWNrLiBQYXJzZXMgdGV4dCwgbG9va3MgdXAgZWFjaCBjYXJkCiAgICBvbiBTY3J5ZmFsbCwgYW5kIGFkZHMgdGhlbSB0byB0aGUgZGVjay4KCiAgICBCb2R5OiB7ICJ0ZXh0IjogIjEgU29sIFJpbmdcbjEgQ3VsdGl2YXRlLi4uIiAsICJjbGVhckZpcnN0IjogZmFsc2UgfQogICAgIiIiCiAgICBkZWNrID0gX2dldF9kZWNrX29yXzQwNChkZWNrX2lkKQogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpCiAgICB0ZXh0ID0gYm9keS5nZXQoJ3RleHQnLCAnJykKICAgIGNsZWFyX2ZpcnN0ID0gYm9keS5nZXQoJ2NsZWFyRmlyc3QnLCBGYWxzZSkKCiAgICBpZiBub3QgdGV4dC5zdHJpcCgpOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdObyBkZWNrbGlzdCB0ZXh0IHByb3ZpZGVkJ30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBwYXJzZWQgPSBfcGFyc2VfZGVja2xpc3RfdGV4dCh0ZXh0KQogICAgYWxsX2VudHJpZXMgPSBbXQogICAgZm9yIGMgaW4gcGFyc2VkWydjb21t' +
'YW5kZXJzJ106CiAgICAgICAgYWxsX2VudHJpZXMuYXBwZW5kKHsqKmMsICdpc19jb21tYW5kZXInOiBUcnVlfSkKICAgIGZvciBjIGluIHBhcnNlZFsnY2FyZHMnXToKICAgICAgICBhbGxfZW50cmllcy5hcHBlbmQoeyoqYywgJ2lzX2NvbW1hbmRlcic6IEZhbHNlfSkKCiAgICBpZiBub3QgYWxsX2VudHJpZXM6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ05vIGNhcmRzIGZvdW5kIGluIGRlY2tsaXN0J30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIE9wdGlvbmFsbHkgY2xlYXIgZXhpc3RpbmcgY2FyZHMKICAgIGlmIGNsZWFyX2ZpcnN0OgogICAgICAgIGNvbm4uZXhlY3V0ZSgnREVMRVRFIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPycsIChkZWNrX2lkLCkpCiAgICAgICAgY29ubi5jb21taXQoKQoKICAgIGFkZGVkID0gMAogICAgZmFpbGVkID0gW10KICAgIHJlc3VsdHMgPSBbXQoKICAgIGZvciBlbnRyeSBpbiBhbGxfZW50cmllczoKICAgICAgICBuYW1lID0gZW50cnlbJ25hbWUnXQogICAgICAgIHF0eSA9IGVudHJ5WydxdHknXQogICAgICAgIGlzX2NtZCA9IGVudHJ5Wydpc19jb21tYW5kZXInXQoKICAgICAgICAjIExvb2sgdXAgb24gU2NyeWZhbGwKICAgICAgICBzZiA9IF9zY3J5ZmFsbF9mdXp6eV9sb29rdXAobmFtZSkKICAgICAgICBpZiBub3Qgc2Y6CiAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQobmFtZSkKICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoeyduYW1lJzogbmFtZSwgJ3N0YXR1cyc6ICdub3RfZm91bmQnfSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc2NyeWZhbGxfaWQgPSBzZi5nZXQoJ2lkJywgJycpCiAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IHNmLmdldCgnbmFtZScsIG5hbWUpCgogICAgICAgICMgQ2hlY2sgaWYgYWxyZWFkeSBpbiBkZWNrCiAgICAgICAgZXhpc3RpbmcgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICdTRUxFQ1QgaWQsIHF1YW50aXR5IEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgc2NyeWZhbGxfaWQgPSA/JywKICAgICAgICAgICAgKGRlY2tfaWQsIHNjcnlmYWxsX2lkKQogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICBpZiBleGlzdGluZzoKICAgICAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAgICAgJ1VQREFURSBkZWNrX2NhcmRzIFNFVCBxdWFudGl0eSA9ID8sIGlzX2NvbW1hbmRlciA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgICAgIChleGlzdGluZ1sncXVhbnRpdHknXSArIHF0eSwgMSBpZiBpc19jbWQgZWxzZSBleGlzdGluZy5nZXQoJ2lzX2NvbW1hbmRlcicsIDApLCBleGlzdGluZ1snaWQnXSkKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyKSBWQUxVRVMgKD8sID8sID8sID8sID8pJywKICAgICAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgcmVzb2x2ZWRfbmFtZSwgcXR5LCAxIGlmIGlzX2NtZCBlbHNlIDApCiAgICAgICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgYWRkZWQgKz0gMQogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsnbmFtZSc6IHJlc29sdmVkX25hbWUsICdxdHknOiBxdHksICdzdGF0dXMnOiAnYWRkZWQnLCAnaXNDb21tYW5kZXInOiBpc19jbWR9KQoKICAgICMgVXBkYXRlIGNvbW1hbmRlciBvbiBkZWNrIHJlY29yZCBpZiB3ZSBmb3VuZCBvbmUKICAgIGNtZF9lbnRyaWVzID0gW3IgZm9yIHIgaW4gcmVzdWx0cyBpZiByLmdldCgnaXNDb21tYW5kZXInKV0KICAgIGlmIGNtZF9lbnRyaWVzOgogICAgICAgIGNtZF9uYW1lID0gY21kX2VudHJpZXNbMF1bJ25hbWUnXQogICAgICAgICMgTG9vayB1cCBzY3J5ZmFsbF9pZCBmcm9tIHRoZSBkZWNrX2NhcmRzIHdlIGp1c3QgaW5zZXJ0ZWQKICAgICAgICBjbWRfcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAnU0VMRUNUIHNjcnlmYWxsX2lkIEZST00gZGVja19jYXJkcyBXSEVSRSBkZWNrX2lkID0gPyBBTkQgaXNfY29tbWFuZGVyID0gMSBMSU1JVCAxJywKICAgICAgICAgICAgKGRlY2tfaWQsKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGNtZF9zZl9pZCA9IGNtZF9yb3dbJ3NjcnlmYWxsX2lk' +
'J10gaWYgY21kX3JvdyBlbHNlICcnCiAgICAgICAgY29ubi5leGVjdXRlKAogICAgICAgICAgICAnVVBEQVRFIGRlY2tzIFNFVCBjb21tYW5kZXJfbmFtZSA9ID8sIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCA9ID8sIHVwZGF0ZWRfYXQgPSBkYXRldGltZShcJ25vd1wnKSBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAoY21kX25hbWUsIGNtZF9zZl9pZCwgZGVja19pZCkKICAgICAgICApCiAgICBlbHNlOgogICAgICAgIGNvbm4uZXhlY3V0ZSgiVVBEQVRFIGRlY2tzIFNFVCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsIChkZWNrX2lkLCkpCiAgICBjb25uLmNvbW1pdCgpCgogICAgcmV0dXJuIHsKICAgICAgICAnYWRkZWQnOiBhZGRlZCwKICAgICAgICAnZmFpbGVkJzogbGVuKGZhaWxlZCksCiAgICAgICAgJ2ZhaWxlZE5hbWVzJzogZmFpbGVkLAogICAgICAgICd0b3RhbCc6IGxlbihhbGxfZW50cmllcyksCiAgICAgICAgJ3Jlc3VsdHMnOiByZXN1bHRzLAogICAgfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrcy9pbXBvcnQtbmV3JykKYXN5bmMgZGVmIGltcG9ydF9kZWNrbGlzdF9uZXcocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiCiAgICBJbXBvcnQgYSBkZWNrbGlzdCBhcyBhIGJyYW5kLW5ldyBkZWNrLiBDcmVhdGVzIHRoZSBkZWNrLCB0aGVuIGltcG9ydHMgY2FyZHMuCgogICAgQm9keTogeyAidGV4dCI6ICIuLi4iLCAibmFtZSI6ICJNeSBEZWNrIiB9CiAgICAiIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgdGV4dCA9IGJvZHkuZ2V0KCd0ZXh0JywgJycpCiAgICBkZWNrX25hbWUgPSBib2R5LmdldCgnbmFtZScsICcnKS5zdHJpcCgpCgogICAgaWYgbm90IHRleHQuc3RyaXAoKToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnTm8gZGVja2xpc3QgdGV4dCBwcm92aWRlZCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgcGFyc2VkID0gX3BhcnNlX2RlY2tsaXN0X3RleHQodGV4dCkKICAgIGFsbF9lbnRyaWVzID0gW10KICAgIGZvciBjIGluIHBhcnNlZFsnY29tbWFuZGVycyddOgogICAgICAgIGFsbF9lbnRyaWVzLmFwcGVuZCh7KipjLCAnaXNfY29tbWFuZGVyJzogVHJ1ZX0pCiAgICBmb3IgYyBpbiBwYXJzZWRbJ2NhcmRzJ106CiAgICAgICAgYWxsX2VudHJpZXMuYXBwZW5kKHsqKmMsICdpc19jb21tYW5kZXInOiBGYWxzZX0pCgogICAgaWYgbm90IGFsbF9lbnRyaWVzOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdObyBjYXJkcyBmb3VuZCBpbiBkZWNrbGlzdCd9LCBzdGF0dXNfY29kZT00MDApCgogICAgIyBBdXRvLW5hbWUgZnJvbSBmaXJzdCBjb21tYW5kZXIgaWYgbm8gbmFtZSBnaXZlbgogICAgaWYgbm90IGRlY2tfbmFtZToKICAgICAgICBjbWQgPSBwYXJzZWRbJ2NvbW1hbmRlcnMnXVswXVsnbmFtZSddIGlmIHBhcnNlZFsnY29tbWFuZGVycyddIGVsc2UgTm9uZQogICAgICAgIGRlY2tfbmFtZSA9IGNtZCBvciAnSW1wb3J0ZWQgRGVjaycKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGN1ciA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAiSU5TRVJUIElOVE8gZGVja3MgKG5hbWUsIGNyZWF0ZWRfYXQsIHVwZGF0ZWRfYXQpIFZBTFVFUyAoPywgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpIiwKICAgICAgICAoZGVja19uYW1lLCkKICAgICkKICAgIGNvbm4uY29tbWl0KCkKICAgIG5ld19kZWNrX2lkID0gY3VyLmxhc3Ryb3dpZAoKICAgICMgU2V0IGNvbW1hbmRlciBvbiB0aGUgZGVjayBpZiB3ZSBoYXZlIG9uZQogICAgZmlyc3RfY21kX3NjcnlmYWxsID0gTm9uZQogICAgZmlyc3RfY21kX25hbWUgPSBOb25lCgogICAgYWRkZWQgPSAwCiAgICBmYWlsZWQgPSBbXQoKICAgIGZvciBlbnRyeSBpbiBhbGxfZW50cmllczoKICAgICAgICBuYW1lID0gZW50cnlbJ25hbWUnXQogICAgICAgIHF0eSA9IGVudHJ5WydxdHknXQogICAgICAgIGlzX2NtZCA9IGVudHJ5Wydpc19jb21tYW5kZXInXQoKICAgICAgICBzZiA9IF9zY3J5ZmFsbF9mdXp6eV9sb29rdXAobmFtZSkKICAgICAgICBpZiBub3Qgc2Y6CiAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQobmFtZSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgc2NyeWZhbGxfaWQgPSBzZi5nZXQoJ2lkJywgJycpCiAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IHNmLmdldCgnbmFtZScsIG5hbWUpCgogICAgICAgIGlmIGlzX2NtZCBhbmQgbm90IGZpcnN0X2Nt' +
'ZF9zY3J5ZmFsbDoKICAgICAgICAgICAgZmlyc3RfY21kX3NjcnlmYWxsID0gc2NyeWZhbGxfaWQKICAgICAgICAgICAgZmlyc3RfY21kX25hbWUgPSByZXNvbHZlZF9uYW1lCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBpc19jb21tYW5kZXIpIFZBTFVFUyAoPywgPywgPywgPywgPyknLAogICAgICAgICAgICAobmV3X2RlY2tfaWQsIHNjcnlmYWxsX2lkLCByZXNvbHZlZF9uYW1lLCBxdHksIDEgaWYgaXNfY21kIGVsc2UgMCkKICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGFkZGVkICs9IDEKCiAgICAjIFVwZGF0ZSBjb21tYW5kZXIgb24gZGVjayByZWNvcmQKICAgIGlmIGZpcnN0X2NtZF9zY3J5ZmFsbDoKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICdVUERBVEUgZGVja3MgU0VUIGNvbW1hbmRlcl9uYW1lID0gPywgY29tbWFuZGVyX3NjcnlmYWxsX2lkID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICAoZmlyc3RfY21kX25hbWUsIGZpcnN0X2NtZF9zY3J5ZmFsbCwgbmV3X2RlY2tfaWQpCiAgICAgICAgKQogICAgICAgIGNvbm4uY29tbWl0KCkKCiAgICByZXR1cm4gewogICAgICAgICdkZWNrSWQnOiBuZXdfZGVja19pZCwKICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgJ2FkZGVkJzogYWRkZWQsCiAgICAgICAgJ2ZhaWxlZCc6IGxlbihmYWlsZWQpLAogICAgICAgICdmYWlsZWROYW1lcyc6IGZhaWxlZCwKICAgICAgICAndG90YWwnOiBsZW4oYWxsX2VudHJpZXMpLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ2FyZCBTY2FubmVyIEVuZHBvaW50CiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgX3NjcnlmYWxsX2Z1enp5X2xvb2t1cChuYW1lOiBzdHIpIC0+IE9wdGlvbmFsW2RpY3RdOgogICAgIiIiCiAgICBGdXp6eS1zZWFyY2ggU2NyeWZhbGwgZm9yIGEgY2FyZCBuYW1lICh1c2VkIGJ5IHRoZSBzY2FubmVyIHBpcGVsaW5lKS4KICAgIFJldHVybnMgdGhlIHJhdyBTY3J5ZmFsbCBKU09OIGRpY3QsIG9yIE5vbmUgb24gZmFpbHVyZS4KICAgICIiIgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHF1b3RlCiAgICBfc2NyeWZhbGxfcmF0ZV9saW1pdCgpCiAgICB0cnk6CiAgICAgICAgZW5jb2RlZCA9IHF1b3RlKG5hbWUpCiAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZnV6enk9e2VuY29kZWR9IgogICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPV9BUElfSEVBREVSUykKICAgICAgICB3aXRoIHVybG9wZW4ocmVxLCB0aW1lb3V0PTEwKSBhcyByZXNwOgogICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCiAgICAgICAgaWYgZGF0YS5nZXQoIm9iamVjdCIpID09ICJlcnJvciI6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGRhdGEKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuIE5vbmUKCgpAYXBwLnBvc3QoIi9hcGkvY29sbGVjdGlvbi9zY2FuIikKYXN5bmMgZGVmIHNjYW5fY2FyZF9pbWFnZShyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiIKICAgIFNjYW4gYSBjYXJkIGltYWdlIGFuZCByZXR1cm4gcmVjb2duaXplZCBjYXJkIG5hbWUocykuCgogICAgVXNlcyBYaW1pbGFyIFZpc3VhbCBBSSBmb3IgY2FyZCByZWNvZ25pdGlvbi4KCiAgICBBY2NlcHRzIG11bHRpcGFydC9mb3JtLWRhdGEgd2l0aDoKICAgICAgLSBmaWxlOiBpbWFnZSBmaWxlIChKUEVHL1BORykKICAgICAgLSBtb2RlOiAic2luZ2xlIiAoZGVmYXVsdCkgb3IgIm11bHRpIgoKICAgIFJldHVybnM6' +
'CiAgICAgIHsgInJlc3VsdHMiOiBbIHsgcmF3X29jciwgbWF0Y2hlZF9uYW1lLCBzZXRfY29kZSwgc2NyeWZhbGxfaWQsIGNvbmZpZGVuY2UsIGltYWdlX3VyaSwgZXJyb3IsIGNvbGxlY3Rvcl9udW1iZXIsIHJhcml0eSwgdGNncGxheWVyX3VybCB9LCAuLi4gXSB9CiAgICAiIiIKICAgIHRyeToKICAgICAgICBmcm9tIHNjYW5uZXIucGlwZWxpbmUgaW1wb3J0IHNjYW5fc2luZ2xlLCBzY2FuX211bHRpCiAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJTY2FubmVyIG1vZHVsZSBub3QgYXZhaWxhYmxlOiB7ZX0iKQoKICAgICMgVHJ5IENGRyBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgdG8gZW52IHZhcgogICAgYXBpX2tleSA9IENGRy54aW1pbGFyX2FwaV9rZXkgb3Igb3MuZW52aXJvbi5nZXQoIlhJTUlMQVJfQVBJX0tFWSIsICIiKQogICAgaWYgbm90IGFwaV9rZXk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDYXJkIHNjYW5uZXIgbm90IGNvbmZpZ3VyZWQuIFN0YXJ0IHRoZSBzZXJ2ZXIgd2l0aCAtLXhpbWlsYXIta2V5IFlPVVJfS0VZIG9yIHNldCBYSU1JTEFSX0FQSV9LRVkgZW52IHZhci4iKQoKICAgICMgUGFyc2UgbXVsdGlwYXJ0IGZvcm0KICAgIGZvcm0gPSBhd2FpdCByZXF1ZXN0LmZvcm0oKQogICAgdXBsb2FkID0gZm9ybS5nZXQoImZpbGUiKQogICAgaWYgdXBsb2FkIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJObyBmaWxlIHVwbG9hZGVkLiBTZW5kIGFuIGltYWdlIGFzICdmaWxlJyBpbiBtdWx0aXBhcnQvZm9ybS1kYXRhLiIpCgogICAgbW9kZSA9IHN0cihmb3JtLmdldCgibW9kZSIsICJzaW5nbGUiKSkubG93ZXIoKQogICAgaW1hZ2VfYnl0ZXMgPSBhd2FpdCB1cGxvYWQucmVhZCgpCgogICAgaWYgbGVuKGltYWdlX2J5dGVzKSA9PSAwOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAiVXBsb2FkZWQgZmlsZSBpcyBlbXB0eSIpCgogICAgIyBMaW1pdCBmaWxlIHNpemUgKDIwIE1CKQogICAgaWYgbGVuKGltYWdlX2J5dGVzKSA+IDIwICogMTAyNCAqIDEwMjQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICJJbWFnZSBmaWxlIHRvbyBsYXJnZSAobWF4IDIwIE1CKSIpCgogICAgcHJpbnQoZiIgIFtTQ0FOXSBQcm9jZXNzaW5nIHtsZW4oaW1hZ2VfYnl0ZXMpfSBieXRlcywgbW9kZT17bW9kZX0gKFhpbWlsYXIgQUkpIikKCiAgICBpZiBtb2RlID09ICJtdWx0aSI6CiAgICAgICAgcmVzdWx0cyA9IHNjYW5fbXVsdGkoaW1hZ2VfYnl0ZXMsIF9zY3J5ZmFsbF9mdXp6eV9sb29rdXAsIHhpbWlsYXJfYXBpX2tleT1hcGlfa2V5KQogICAgZWxzZToKICAgICAgICByZXN1bHQgPSBzY2FuX3NpbmdsZShpbWFnZV9ieXRlcywgX3NjcnlmYWxsX2Z1enp5X2xvb2t1cCwgeGltaWxhcl9hcGlfa2V5PWFwaV9rZXkpCiAgICAgICAgcmVzdWx0cyA9IFtyZXN1bHRdCgogICAgcmV0dXJuIHsKICAgICAgICAicmVzdWx0cyI6IFtyLnRvX2RpY3QoKSBmb3IgciBpbiByZXN1bHRzXQogICAgfQoKCkBhcHAucG9zdCgiL2FwaS9jb2xsZWN0aW9uL3NjYW4vYWRkIikKYXN5bmMgZGVmIHNjYW5fYWRkX2NhcmRzKGJvZHk6IGRpY3QpOgogICAgIiIiCiAgICBBZGQgc2Nhbm5lZCBjYXJkcyB0byB0aGUgY29sbGVjdGlvbi4KCiAgICBCb2R5OgogICAgICB7CiAgICAgICAgImNhcmRzIjogWwogICAgICAgICAgeyAibmFtZSI6ICJMaWdodG5pbmcgQm9sdCIsICJzZXRfY29kZSI6ICJtMTEiLCAicXVhbnRpdHkiOiAxIH0sCiAgICAgICAgICAuLi4KICAgICAgICBdCiAgICAgIH0KICAgICIiIgogICAgY2FyZHMgPSBib2R5LmdldCgiY2FyZHMiLCBbXSkKICAgIGlmIG5vdCBjYXJkczoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgIk5vIGNhcmRzIHByb3ZpZGVkIikKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGltcG9ydGVkID0gMAogICAgdXBkYXRlZCA9IDAKICAgIGVycm9ycyA9IFtdCgogICAgZm9yIGNhcmRfcmVxIGluIGNhcmRzOgogICAgICAgIG5hbWUgPSBzdHIoY2FyZF9yZXEuZ2V0KCJuYW1lIiwgIiIpKS5zdHJpcCgpCiAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHF1YW50aXR5ID0gaW50KGNhcmRfcmVxLmdldCgicXVhbnRpdHkiLCAxKSkKICAgICAgICBzZXRfY29kZSA9IHN0cihjYXJkX3JlcS5nZXQoInNldF9jb2RlIiwgIiIpKS5sb3dlcigp' +
'CiAgICAgICAgY29sbGVjdG9yX251bWJlciA9IHN0cihjYXJkX3JlcS5nZXQoImNvbGxlY3Rvcl9udW1iZXIiLCAiIikpCiAgICAgICAgZmluaXNoID0gIk5PUk1BTCIKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlbnJpY2hlZCA9IF9lbnJpY2hfZnJvbV9zY3J5ZmFsbChuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZiJTY3J5ZmFsbCBlcnJvciBmb3IgJ3tuYW1lfSc6IHtlfSIpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIG5vdCBlbnJpY2hlZCBvciAiX2Vycm9yIiBpbiBlbnJpY2hlZDoKICAgICAgICAgICAgZXJyX21zZyA9IGVucmljaGVkLmdldCgiX2Vycm9yIiwgZiJOb3QgZm91bmQ6ICd7bmFtZX0nIikgaWYgZW5yaWNoZWQgZWxzZSBmIk5vdCBmb3VuZDogJ3tuYW1lfSciCiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZXJyX21zZykKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgcmVzb2x2ZWRfbmFtZSA9IGVucmljaGVkLmdldCgibmFtZSIsIG5hbWUpCgogICAgICAgICMgQ2hlY2sgZm9yIGV4aXN0aW5nIGVudHJ5CiAgICAgICAgZXhpc3RpbmcgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICIiIlNFTEVDVCBpZCwgcXVhbnRpdHkgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMKICAgICAgICAgICAgICAgV0hFUkUgbmFtZSA9ID8gQU5EIHNldF9jb2RlID0gPyBBTkQgY29sbGVjdG9yX251bWJlciA9ID8gQU5EIGZpbmlzaCA9ID8iIiIsCiAgICAgICAgICAgIChyZXNvbHZlZF9uYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlciwgZmluaXNoKSwKICAgICAgICApLmZldGNob25lKCkKCiAgICAgICAgaWYgZXhpc3Rpbmc6CiAgICAgICAgICAgIG5ld19xdHkgPSBleGlzdGluZ1sicXVhbnRpdHkiXSArIHF1YW50aXR5CiAgICAgICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgICAgICJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVCBxdWFudGl0eSA9ID8sIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgICAgIChuZXdfcXR5LCBleGlzdGluZ1siaWQiXSksCiAgICAgICAgICAgICkKICAgICAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgICAgICB1cGRhdGVkICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiIiJJTlNFUlQgSU5UTyBjb2xsZWN0aW9uX2VudHJpZXMKICAgICAgICAgICAgICAgICAgIChuYW1lLCB0eXBlX2xpbmUsIHN1YnR5cGVzLCBpc19sZWdlbmRhcnksIGlzX2Jhc2ljLCBjb2xvcl9pZGVudGl0eSwKICAgICAgICAgICAgICAgICAgICBjbWMsIG1hbmFfY29zdCwgb3JhY2xlX3RleHQsIGtleXdvcmRzLAogICAgICAgICAgICAgICAgICAgIHBvd2VyLCB0b3VnaG5lc3MsIHJhcml0eSwgc2V0X25hbWUsIGVkaHJlY19yYW5rLAogICAgICAgICAgICAgICAgICAgIHRjZ19wcmljZSwgc2FsdF9zY29yZSwgaXNfZ2FtZV9jaGFuZ2VyLAogICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LCBzY3J5ZmFsbF9pZCwgdGNncGxheWVyX2lkLAogICAgICAgICAgICAgICAgICAgIHF1YW50aXR5LCBmaW5pc2gsIGNvbmRpdGlvbiwgbGFuZ3VhZ2UsIG5vdGVzLCB0YWdzLAogICAgICAgICAgICAgICAgICAgIHNldF9jb2RlLCBjb2xsZWN0b3JfbnVtYmVyKQogICAgICAgICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/KSIiIiwKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZF9uYW1lLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgic3VidHlwZXMiLCAiW10iKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImlzX2xlZ2VuZGFyeSIsIDApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgiaXNfYmFzaWMiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJjbWMiLCAwLjApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgibWFu' +
'YV9jb3N0IiwgIiIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgib3JhY2xlX3RleHQiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJrZXl3b3JkcyIsICJbXSIpLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgicG93ZXIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0b3VnaG5lc3MiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJyYXJpdHkiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzZXRfbmFtZSIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImVkaHJlY19yYW5rIiwgMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJ0Y2dfcHJpY2UiLCAwLjApLAogICAgICAgICAgICAgICAgICAgIGVucmljaGVkLmdldCgic2FsdF9zY29yZSIsIDAuMCksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJpc19nYW1lX2NoYW5nZXIiLCAwKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoImNhdGVnb3J5IiwgIltdIiksCiAgICAgICAgICAgICAgICAgICAgZW5yaWNoZWQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBlbnJpY2hlZC5nZXQoInRjZ3BsYXllcl9pZCIsICIiKSwKICAgICAgICAgICAgICAgICAgICBxdWFudGl0eSwKICAgICAgICAgICAgICAgICAgICBmaW5pc2gsCiAgICAgICAgICAgICAgICAgICAgIiIsICAjIGNvbmRpdGlvbgogICAgICAgICAgICAgICAgICAgICIiLCAgIyBsYW5ndWFnZQogICAgICAgICAgICAgICAgICAgICIiLCAgIyBub3RlcwogICAgICAgICAgICAgICAgICAgICIiLCAgIyB0YWdzCiAgICAgICAgICAgICAgICAgICAgc2V0X2NvZGUsCiAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yX251bWJlciwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKICAgICAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgICAgICBpbXBvcnRlZCArPSAxCgogICAgcmV0dXJuIHsKICAgICAgICAiaW1wb3J0ZWRDb3VudCI6IGltcG9ydGVkLAogICAgICAgICJ1cGRhdGVkQ291bnQiOiB1cGRhdGVkLAogICAgICAgICJmYWlsZWRDb3VudCI6IGxlbihlcnJvcnMpLAogICAgICAgICJlcnJvcnMiOiBlcnJvcnMsCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBSZS1lbnJpY2ggQ29sbGVjdGlvbiBmcm9tIFNjcnlmYWxsCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAYXBwLnBvc3QoIi9hcGkvY29sbGVjdGlvbi9yZS1lbnJpY2giKQphc3luYyBkZWYgcmVfZW5yaWNoX2NvbGxlY3Rpb24oKToKICAgICIiIgogICAgUmUtZmV0Y2ggU2NyeWZhbGwgZGF0YSBmb3IgYWxsIGNvbGxlY3Rpb24gZW50cmllcyB0byBiYWNrZmlsbAogICAgbWlzc2luZyBmaWVsZHMgKG1hbmFfY29zdCwgcG93ZXIsIHRvdWdobmVzcywgcmFyaXR5LCBzZXRfbmFtZSwgZWRocmVjX3JhbmspLgogICAgQWxzbyByZWZyZXNoZXM6IHR5cGVfbGluZSwgb3JhY2xlX3RleHQsIGtleXdvcmRzLCBjbWMsIGNvbG9yX2lkZW50aXR5LCBwcmljZXMuCiAgICBSdW5zIHN5bmNocm9ub3VzbHkg4oCUIG1heSB0YWtlIGEgd2hpbGUgZm9yIGxhcmdlIGNvbGxlY3Rpb25zLgogICAgIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBpZCwgbmFtZSwgc2V0X2NvZGUsIGNvbGxlY3Rvcl9udW1iZXIgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgT1JERVIgQlkgaWQiCiAgICApLmZldGNoYWxsKCkKCiAgICB0b3RhbCA9IGxlbihyb3dzKQogICAgZW5yaWNoZWRfY291bnQgPSAwCiAgICBza2lwcGVkX2NvdW50ID0gMAogICAgZXJyb3JzID0gW10KCiAgICBmb3Igcm93IGluIHJv' +
'd3M6CiAgICAgICAgY2FyZF9pZCA9IHJvd1siaWQiXQogICAgICAgIG5hbWUgPSByb3dbIm5hbWUiXQogICAgICAgIHNldF9jb2RlID0gcm93WyJzZXRfY29kZSJdIG9yICIiCiAgICAgICAgY29sbGVjdG9yX251bWJlciA9IHJvd1siY29sbGVjdG9yX251bWJlciJdIG9yICIiCgogICAgICAgIHRyeToKICAgICAgICAgICAgZGF0YSA9IF9lbnJpY2hfZnJvbV9zY3J5ZmFsbChuYW1lLCBzZXRfY29kZSwgY29sbGVjdG9yX251bWJlcikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZiJFcnJvciBmb3IgJ3tuYW1lfSc6IHtlfSIpCiAgICAgICAgICAgIHNraXBwZWRfY291bnQgKz0gMQogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBub3QgZGF0YSBvciAiX2Vycm9yIiBpbiBkYXRhOgogICAgICAgICAgICBlcnJfbXNnID0gZGF0YS5nZXQoIl9lcnJvciIsIGYiTm90IGZvdW5kOiAne25hbWV9JyIpIGlmIGRhdGEgZWxzZSBmIk5vdCBmb3VuZDogJ3tuYW1lfSciCiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZXJyX21zZykKICAgICAgICAgICAgc2tpcHBlZF9jb3VudCArPSAxCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIiIiVVBEQVRFIGNvbGxlY3Rpb25fZW50cmllcyBTRVQKICAgICAgICAgICAgICAgIHR5cGVfbGluZSA9ID8sIHN1YnR5cGVzID0gPywgaXNfbGVnZW5kYXJ5ID0gPywgaXNfYmFzaWMgPSA/LAogICAgICAgICAgICAgICAgY29sb3JfaWRlbnRpdHkgPSA/LCBjbWMgPSA/LCBtYW5hX2Nvc3QgPSA/LAogICAgICAgICAgICAgICAgb3JhY2xlX3RleHQgPSA/LCBrZXl3b3JkcyA9ID8sCiAgICAgICAgICAgICAgICBwb3dlciA9ID8sIHRvdWdobmVzcyA9ID8sCiAgICAgICAgICAgICAgICByYXJpdHkgPSA/LCBzZXRfbmFtZSA9ID8sIGVkaHJlY19yYW5rID0gPywKICAgICAgICAgICAgICAgIHRjZ19wcmljZSA9ID8sIHNjcnlmYWxsX2lkID0gPywgdGNncGxheWVyX2lkID0gPywKICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gPywKICAgICAgICAgICAgICAgIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykKICAgICAgICAgICAgV0hFUkUgaWQgPSA/IiIiLAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBkYXRhLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInN1YnR5cGVzIiwgIltdIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgiaXNfbGVnZW5kYXJ5IiwgMCksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgiaXNfYmFzaWMiLCAwKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJjb2xvcl9pZGVudGl0eSIsICJbXSIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImNtYyIsIDAuMCksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgibWFuYV9jb3N0IiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoIm9yYWNsZV90ZXh0IiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImtleXdvcmRzIiwgIltdIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgicG93ZXIiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgidG91Z2huZXNzIiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInJhcml0eSIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJzZXRfbmFtZSIsICIiKSwKICAgICAgICAgICAgICAgIGRhdGEuZ2V0KCJlZGhyZWNfcmFuayIsIDApLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoInRjZ19wcmljZSIsIDAuMCksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgic2NyeWZhbGxfaWQiLCAiIiksCiAgICAgICAgICAgICAgICBkYXRhLmdldCgidGNncGxheWVyX2lkIiwgIiIpLAogICAgICAgICAgICAgICAgZGF0YS5nZXQoImNhdGVnb3J5IiwgIltdIiksCiAgICAgICAgICAgICAgICBjYXJkX2lkLAogICAgICAgICAgICApLAogICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCiAgICAgICAgZW5yaWNoZWRfY291bnQgKz0gMQoKICAgIHJldHVybiB7CiAgICAgICAgInRvdGFsIjogdG90YWwsCiAgICAgICAgImVucmljaGVkQ291bnQiOiBlbnJpY2hlZF9jb3VudCwKICAgICAgICAic2tpcHBlZENvdW50Ijogc2tpcHBlZF9jb3VudCwKICAgICAgICAiZXJyb3JzIjogZXJyb3JzWzo1MF0sICAjIGNhcCBlcnJvciBsaXN0CiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi' +
'lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBBdXRvLUNsYXNzaWZ5IENvbGxlY3Rpb24KIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAucG9zdCgiL2FwaS9jb2xsZWN0aW9uL2F1dG8tY2xhc3NpZnkiKQphc3luYyBkZWYgYXV0b19jbGFzc2lmeV9jb2xsZWN0aW9uKCk6CiAgICAiIiIKICAgIFJ1biBhdXRvLWNsYXNzaWZpY2F0aW9uIG9uIGFsbCBjb2xsZWN0aW9uIGVudHJpZXMuCiAgICBVc2VzIG9yYWNsZV90ZXh0LCB0eXBlX2xpbmUsIGFuZCBrZXl3b3JkcyB0byBkZXRlY3QgZnVuY3Rpb25hbCByb2xlcwogICAgKFJhbXAsIERyYXcsIFJlbW92YWwsIEJvYXJkIFdpcGUsIEFudGhlbSwgU3RheCwgZXRjLikuCiAgICBPbmx5IHVwZGF0ZXMgY2FyZHMgd2hvc2UgY3VycmVudCBjYXRlZ29yeSBpcyBlbXB0eSBvciAnW10nLgogICAgIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCBpZCwgb3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMsIGNhdGVnb3J5IEZST00gY29sbGVjdGlvbl9lbnRyaWVzIE9SREVSIEJZIGlkIgogICAgKS5mZXRjaGFsbCgpCgogICAgdG90YWwgPSBsZW4ocm93cykKICAgIGNsYXNzaWZpZWRfY291bnQgPSAwCiAgICBza2lwcGVkX2NvdW50ID0gMAoKICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBjYXJkX2lkID0gcm93WyJpZCJdCiAgICAgICAgZXhpc3RpbmdfY2F0cyA9IHJvd1siY2F0ZWdvcnkiXSBvciAiW10iCgogICAgICAgICMgUGFyc2UgZXhpc3RpbmcgY2F0ZWdvcmllcwogICAgICAgIHRyeToKICAgICAgICAgICAgY2F0cyA9IGpzb24ubG9hZHMoZXhpc3RpbmdfY2F0cykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjYXRzID0gW10KCiAgICAgICAgIyBTa2lwIGNhcmRzIHRoYXQgYWxyZWFkeSBoYXZlIG1hbnVhbGx5LXNldCBjYXRlZ29yaWVzCiAgICAgICAgaWYgY2F0czoKICAgICAgICAgICAgc2tpcHBlZF9jb3VudCArPSAxCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIG9yYWNsZV90ZXh0ID0gcm93WyJvcmFjbGVfdGV4dCJdIG9yICIiCiAgICAgICAgdHlwZV9saW5lID0gcm93WyJ0eXBlX2xpbmUiXSBvciAiIgogICAgICAgIGtleXdvcmRzID0gcm93WyJrZXl3b3JkcyJdIG9yICJbXSIKCiAgICAgICAgcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMob3JhY2xlX3RleHQsIHR5cGVfbGluZSwga2V5d29yZHMpCgogICAgICAgIGlmIHJvbGVzOgogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiVVBEQVRFIGNvbGxlY3Rpb25fZW50cmllcyBTRVQgY2F0ZWdvcnkgPSA/LCB1cGRhdGVkX2F0ID0gZGF0ZXRpbWUoJ25vdycpIFdIRVJFIGlkID0gPyIsCiAgICAgICAgICAgICAgICAoanNvbi5kdW1wcyhyb2xlcyksIGNhcmRfaWQpLAogICAgICAgICAgICApCiAgICAgICAgICAgIGNsYXNzaWZpZWRfY291bnQgKz0gMQoKICAgIGNvbm4uY29tbWl0KCkKCiAgICByZXR1cm4gewogICAgICAgICJ0b3RhbCI6IHRvdGFsLAogICAgICAgICJjbGFzc2lmaWVkQ291bnQiOiBjbGFzc2lmaWVkX2NvdW50LAogICAgICAgICJza2lwcGVkQ291bnQiOiBza2lwcGVkX2NvdW50LAogICAgICAgICJtZXNzYWdlIjogZiJDbGFzc2lmaWVkIHtjbGFzc2lmaWVkX2NvdW50fSBjYXJkcywgc2tpcHBlZCB7c2tpcHBlZF9jb3VudH0gKGFscmVhZHkgaGFkIGNhdGVnb3JpZXMpIiwKICAgIH0KCgpAYXBwLnBvc3QoIi9hcGkvY29sbGVjdGlvbi9hdXRvLWNsYXNzaWZ5LWFsbCIpCmFzeW5jIGRlZiBhdXRvX2NsYXNzaWZ5X2FsbF9jb2xsZWN0aW9uKCk6CiAgICAiIiIKICAgIEZvcmNlIHJlLWNsYXNzaWZ5IEFMTCBjb2xsZWN0aW9uIGVudHJpZXMsIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGNhdGVnb3JpZXMuCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcm93cyA9IGNv' +
'bm4uZXhlY3V0ZSgKICAgICAgICAiU0VMRUNUIGlkLCBvcmFjbGVfdGV4dCwgdHlwZV9saW5lLCBrZXl3b3JkcyBGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBPUkRFUiBCWSBpZCIKICAgICkuZmV0Y2hhbGwoKQoKICAgIHRvdGFsID0gbGVuKHJvd3MpCiAgICBjbGFzc2lmaWVkX2NvdW50ID0gMAoKICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBjYXJkX2lkID0gcm93WyJpZCJdCiAgICAgICAgb3JhY2xlX3RleHQgPSByb3dbIm9yYWNsZV90ZXh0Il0gb3IgIiIKICAgICAgICB0eXBlX2xpbmUgPSByb3dbInR5cGVfbGluZSJdIG9yICIiCiAgICAgICAga2V5d29yZHMgPSByb3dbImtleXdvcmRzIl0gb3IgIltdIgoKICAgICAgICByb2xlcyA9IF9kZXRlY3RfY2FyZF9yb2xlcyhvcmFjbGVfdGV4dCwgdHlwZV9saW5lLCBrZXl3b3JkcykKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJVUERBVEUgY29sbGVjdGlvbl9lbnRyaWVzIFNFVCBjYXRlZ29yeSA9ID8sIHVwZGF0ZWRfYXQgPSBkYXRldGltZSgnbm93JykgV0hFUkUgaWQgPSA/IiwKICAgICAgICAgICAgKGpzb24uZHVtcHMocm9sZXMpLCBjYXJkX2lkKSwKICAgICAgICApCiAgICAgICAgY2xhc3NpZmllZF9jb3VudCArPSAxCgogICAgY29ubi5jb21taXQoKQoKICAgIHJldHVybiB7CiAgICAgICAgInRvdGFsIjogdG90YWwsCiAgICAgICAgImNsYXNzaWZpZWRDb3VudCI6IGNsYXNzaWZpZWRfY291bnQsCiAgICAgICAgIm1lc3NhZ2UiOiBmIlJlLWNsYXNzaWZpZWQgYWxsIHtjbGFzc2lmaWVkX2NvdW50fSBjYXJkcyIsCiAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBFREhSRUMgUmVjb21tZW5kYXRpb25zIENhY2hlICsgRW5kcG9pbnQKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiMgU2ltcGxlIGluLW1lbW9yeSBjYWNoZToge2NhY2hlX2tleTogeyJkYXRhIjogLi4uLCAiZXhwaXJlcyI6IGZsb2F0fX0KX2VkaHJlY19jYWNoZTogZGljdCA9IHt9Cl9FREhSRUNfVFRMID0gMzYwMCAgIyAxIGhvdXIKCgpkZWYgX2VkaHJlY19jYWNoZV9nZXQoa2V5OiBzdHIpOgogICAgZW50cnkgPSBfZWRocmVjX2NhY2hlLmdldChrZXkpCiAgICBpZiBlbnRyeSBhbmQgdGltZS5tb25vdG9uaWMoKSA8IGVudHJ5WyJleHBpcmVzIl06CiAgICAgICAgcmV0dXJuIGVudHJ5WyJkYXRhIl0KICAgIHJldHVybiBOb25lCgoKZGVmIF9lZGhyZWNfY2FjaGVfc2V0KGtleTogc3RyLCBkYXRhKToKICAgIF9lZGhyZWNfY2FjaGVba2V5XSA9IHsiZGF0YSI6IGRhdGEsICJleHBpcmVzIjogdGltZS5tb25vdG9uaWMoKSArIF9FREhSRUNfVFRMfQoKCkBhcHAuZ2V0KCIvYXBpL2NvbGxlY3Rpb24ve2NhcmRJZH0vZWRocmVjIikKYXN5bmMgZGVmIGdldF9jYXJkX2VkaHJlYyhjYXJkSWQ6IGludCk6CiAgICAiIiIKICAgIEdldCBFREhSRUMgcmVjb21tZW5kYXRpb25zIGZvciBhIGNvbGxlY3Rpb24gY2FyZC4KICAgIEZvciBsZWdlbmRhcnkgY3JlYXR1cmVzIChwb3RlbnRpYWwgY29tbWFuZGVycyk6IGZldGNoIGNvbW1hbmRlciBzeW5lcmd5IGRhdGEuCiAgICBGb3Igb3RoZXIgY2FyZHM6IGZldGNoICdhbHNvIHBsYXllZCB3aXRoJyBkYXRhLgogICAgIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgaWQgPSA/IiwgKGNhcmRJZCwpKS5mZXRjaG9uZSgpCiAgICBpZiBub3Qgcm93OgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkNhcmQgd2l0aCBpZCB7Y2FyZElkfSBub3QgZm91bmQiKQoKICAgIGNhcmQgPSBfcm93X3RvX2RpY3Qocm93KQogICAgbmFtZSA9IGNhcmRbIm5hbWUiXQogICAgdHlwZV9saW5lID0gY2FyZC5nZXQoInR5cGVfbGluZSIsICIiKQogICAgaXNfbGVnZW5kYXJ5ID0g' +
'Y2FyZC5nZXQoImlzX2xlZ2VuZGFyeSIsIDApCgogICAgIyBEZXRlcm1pbmUgaWYgaXQncyBhIGxlZ2VuZGFyeSBjcmVhdHVyZSAocG90ZW50aWFsIGNvbW1hbmRlcikKICAgIGlzX2NvbW1hbmRlciA9IGJvb2woCiAgICAgICAgaXNfbGVnZW5kYXJ5IGFuZAogICAgICAgIHJlLnNlYXJjaChyIlxiQ3JlYXR1cmVcYiIsIHR5cGVfbGluZSwgcmUuSUdOT1JFQ0FTRSkKICAgICkKCiAgICBzbHVnID0gX3RvX2VkaHJlY19zbHVnKG5hbWUpCiAgICBjYWNoZV9rZXkgPSBmImVkaHJlYzp7J2NtZCcgaWYgaXNfY29tbWFuZGVyIGVsc2UgJ2NhcmQnfTp7c2x1Z30iCgogICAgY2FjaGVkID0gX2VkaHJlY19jYWNoZV9nZXQoY2FjaGVfa2V5KQogICAgaWYgY2FjaGVkOgogICAgICAgIHJldHVybiBjYWNoZWQKCiAgICByZWNvbW1lbmRhdGlvbnMgPSBbXQogICAgbGlua3MgPSB7CiAgICAgICAgImVkaHJlY1BhZ2UiOiAoCiAgICAgICAgICAgIGYiaHR0cHM6Ly9lZGhyZWMuY29tL2NvbW1hbmRlcnMve3NsdWd9IgogICAgICAgICAgICBpZiBpc19jb21tYW5kZXIKICAgICAgICAgICAgZWxzZSBmImh0dHBzOi8vZWRocmVjLmNvbS9jYXJkcy97c2x1Z30iCiAgICAgICAgKSwKICAgICAgICAiYXJjaGlkZWt0U2VhcmNoIjogZiJodHRwczovL2FyY2hpZGVrdC5jb20vc2VhcmNoL2NhcmRzP3E9e25hbWUucmVwbGFjZSgnICcsICcrJyl9IiwKICAgICAgICAibW94ZmllbGRTZWFyY2giOiBmImh0dHBzOi8vd3d3Lm1veGZpZWxkLmNvbS9zZWFyY2g/cT17bmFtZS5yZXBsYWNlKCcgJywgJysnKX0iLAogICAgfQoKICAgIHRyeToKICAgICAgICBpZiBpc19jb21tYW5kZXI6CiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9qc29uLmVkaHJlYy5jb20vcGFnZXMvY29tbWFuZGVycy97c2x1Z30uanNvbiIKICAgICAgICBlbHNlOgogICAgICAgICAgICB1cmwgPSBmImh0dHBzOi8vanNvbi5lZGhyZWMuY29tL3BhZ2VzL2NhcmRzL3tzbHVnfS5qc29uIgoKICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz1fQVBJX0hFQURFUlMpCiAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMCkgYXMgcmVzcDoKICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQoKICAgICAgICBpZiBpc19jb21tYW5kZXI6CiAgICAgICAgICAgICMgRXh0cmFjdCB0b3AgY2FyZHMgZnJvbSBjYXJkbGlzdHMKICAgICAgICAgICAgY29udGFpbmVyID0gZGF0YS5nZXQoImNvbnRhaW5lciIsIHt9KQogICAgICAgICAgICBqc29uX2RpY3QgPSBjb250YWluZXIuZ2V0KCJqc29uX2RpY3QiLCB7fSkKICAgICAgICAgICAgZm9yIGNhcmRsaXN0IGluIGpzb25fZGljdC5nZXQoImNhcmRsaXN0cyIsIFtdKToKICAgICAgICAgICAgICAgIHRhZyA9IGNhcmRsaXN0LmdldCgidGFnIiwgIiIpCiAgICAgICAgICAgICAgICBmb3IgY3YgaW4gY2FyZGxpc3QuZ2V0KCJjYXJkdmlld3MiLCBbXSlbOjEwXToKICAgICAgICAgICAgICAgICAgICByZWNfbmFtZSA9IGN2LmdldCgibmFtZSIsICIiKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWNfbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBzeW5lcmd5ID0gY3YuZ2V0KCJzeW5lcmd5IiwgMC4wKQogICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGF0aW9ucy5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHJlY19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAic3luZXJneSI6IHN5bmVyZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICJyb2xlIjogdGFnIG9yICJSZWNvbW1lbmRlZCIsCiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEV4dHJhY3QgImFsc28gcGxheWVkIHdpdGgiIGNhcmRzCiAgICAgICAgICAgIGNvbnRhaW5lciA9IGRhdGEuZ2V0KCJjb250YWluZXIiLCB7fSkKICAgICAgICAgICAganNvbl9kaWN0ID0gY29udGFpbmVyLmdldCgianNvbl9kaWN0Iiwge30pCiAgICAgICAgICAgIGZvciBjYXJkbGlzdCBpbiBqc29uX2RpY3QuZ2V0KCJjYXJkbGlzdHMiLCBbXSk6CiAgICAgICAgICAgICAgICB0YWcgPSBjYXJkbGlzdC5nZXQoInRhZyIsICIiKQogICAgICAgICAgICAgICAgZm9yIGN2IGluIGNhcmRsaXN0LmdldCgiY2FyZHZpZXdzIiwgW10pWzoxMF06CiAgICAgICAgICAgICAgICAgICAgcmVjX25hbWUgPSBjdi5nZXQoIm5hbWUiLCAiIikK' +
'ICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVjX25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgc3luZXJneSA9IGN2LmdldCgic3luZXJneSIsIDAuMCkKICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRhdGlvbnMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiByZWNfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgInN5bmVyZ3kiOiBzeW5lcmd5LAogICAgICAgICAgICAgICAgICAgICAgICAicm9sZSI6IHRhZyBvciAiQWxzbyBQbGF5ZWQgV2l0aCIsCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiIgIFtFREhSRUNdIEVycm9yIGZldGNoaW5nIGRhdGEgZm9yICd7bmFtZX0nOiB7ZX0iKQogICAgICAgICMgR3JhY2VmdWwgZGVncmFkYXRpb24g4oCUIHJldHVybiBlbXB0eSByZXN1bHRzCgogICAgcmVzdWx0ID0gewogICAgICAgICJyZWNvbW1lbmRhdGlvbnMiOiByZWNvbW1lbmRhdGlvbnNbOjMwXSwKICAgICAgICAibGlua3MiOiBsaW5rcywKICAgIH0KICAgIF9lZGhyZWNfY2FjaGVfc2V0KGNhY2hlX2tleSwgcmVzdWx0KQogICAgcmV0dXJuIHJlc3VsdAoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ29tbWFuZGVyIE1ldGEgTWFwcGluZyAobG9hZGVkIGF0IHN0YXJ0dXApCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpCVUlMVElOX0NPTU1BTkRFUlMgPSB7CiAgICAiRWRnYXIgTWFya292IjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiYWdncm8iLCAiY29sb3JJZGVudGl0eSI6IFsiVyIsIkIiLCJSIl19XSwKICAgICJBdHJheGEsIFByYWV0b3JzJyBWb2ljZSI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogIm1pZHJhbmdlIiwgImNvbG9ySWRlbnRpdHkiOiBbIlciLCJVIiwiQiIsIkciXX1dLAogICAgIktvcnZvbGQsIEZhZS1DdXJzZWQgS2luZyI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImNvbWJvIiwgImNvbG9ySWRlbnRpdHkiOiBbIkIiLCJSIiwiRyJdfV0sCiAgICAiTXVsZHJvdGhhLCB0aGUgR3JhdmV0aWRlIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAibWlkcmFuZ2UiLCAiY29sb3JJZGVudGl0eSI6IFsiVSIsIkIiLCJHIl19XSwKICAgICJUaGUgVXItRHJhZ29uIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAibWlkcmFuZ2UiLCAiY29sb3JJZGVudGl0eSI6IFsiVyIsIlUiLCJCIiwiUiIsIkciXX1dLAogICAgIll1cmlrbywgdGhlIFRpZ2VyJ3MgU2hhZG93IjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiYWdncm8iLCAiY29sb3JJZGVudGl0eSI6IFsiVSIsIkIiXX1dLAogICAgIktyZW5rbywgTW9iIEJvc3MiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJhZ2dybyIsICJjb2xvcklkZW50aXR5IjogWyJSIl19XSwKICAgICJNZXJlbiBvZiBDbGFuIE5lbCBUb3RoIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAibWlkcmFuZ2UiLCAiY29sb3JJZGVudGl0eSI6IFsiQiIsIkciXX1dLAogICAgIlByb3NzaCwgU2t5cmFpZGVyIG9mIEtoZXIiOiBbeyJzb3VyY2UiOiAiZWRocmVjIiwgImFyY2hldHlwZSI6ICJjb21ibyIsICJjb2xvcklkZW50aXR5IjogWyJCIiwiUiIsIkciXX1dLAogICAgIkthYWxpYSBvZiB0aGUgVmFzdCI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImFnZ3JvIiwgImNvbG9ySWRlbnRpdHkiOiBbIlciLCJCIiwiUiJdfV0sCiAgICAiVGFscmFuZCwgU2t5IFN1bW1vbmVyIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiY29udHJvbCIsICJjb2xvcklkZW50aXR5' +
'IjogWyJVIl19XSwKICAgICJPbW5hdGgsIExvY3VzIG9mIENyZWF0aW9uIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiY29tYm8iLCAiY29sb3JJZGVudGl0eSI6IFsiVyIsIlUiLCJSIiwiRyJdfV0sCiAgICAiVGV5c2EgS2FybG92IjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiY29tYm8iLCAiY29sb3JJZGVudGl0eSI6IFsiVyIsIkIiXX1dLAogICAgIkxhdGhyaWwsIEJsYWRlIG9mIHRoZSBFbHZlcyI6IFt7InNvdXJjZSI6ICJlZGhyZWMiLCAiYXJjaGV0eXBlIjogImFnZ3JvIiwgImNvbG9ySWRlbnRpdHkiOiBbIkIiLCJHIl19XSwKICAgICJCcmV5YSwgRXRoZXJpdW0gU2hhcGVyIjogW3sic291cmNlIjogImVkaHJlYyIsICJhcmNoZXR5cGUiOiAiY29tYm8iLCAiY29sb3JJZGVudGl0eSI6IFsiVyIsIlUiLCJCIiwiUiJdfV0sCn0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFB5dGhvbiBTaW11bGF0b3IgQVBJCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgppbXBvcnQgdGhyZWFkaW5nIGFzIF90aHJlYWRpbmcKaW1wb3J0IHV1aWQgYXMgX3V1aWQKCiMgSW4tbWVtb3J5IHN0b3JlIGZvciBzaW11bGF0aW9uIHJ1bnMKX3NpbV9ydW5zID0ge30gICMgc2ltX2lkIC0+IHsgc3RhdHVzLCByZXN1bHQsIGVycm9yIH0KX3NpbV9sb2NrID0gX3RocmVhZGluZy5Mb2NrKCkKCgpkZWYgX3J1bl9zaW1fdGhyZWFkX3YyKHNpbV9pZDogc3RyLCBjYXJkX2RhdGE6IGxpc3RbZGljdF0sIG51bV9nYW1lczogaW50LCBkZWNrX25hbWU6IHN0ciwgcmVjb3JkX2xvZ3M6IGJvb2wpOgogICAgIiIiQmFja2dyb3VuZCB0aHJlYWQgZm9yIHNpbXVsYXRpb25zIHdpdGggZnVsbCBjYXJkIGRhdGEgZnJvbSB0aGUgREIuIiIiCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cywgb3MKICAgICAgICBzcmNfZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgJ3NyYycpCiAgICAgICAgaWYgc3JjX2RpciBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzcmNfZGlyKQoKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0uZW5naW5lIGltcG9ydCBHYW1lRW5naW5lCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5ydWxlcyBpbXBvcnQgZW5yaWNoX2NhcmQKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIubGFiLmV4cGVyaW1lbnRzIGltcG9ydCBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjawoKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ3J1bm5pbmcnCgogICAgICAgICMgQnVpbGQgZGVjayB3aXRoIHJlYWwgY2FyZCBkYXRhIGZyb20gREIKICAgICAgICBkZWNrX2EgPSBbXQogICAgICAgIGZvciBjZCBpbiBjYXJkX2RhdGE6CiAgICAgICAgICAgIGMgPSBDYXJkKG5hbWU9Y2RbJ25hbWUnXSkKICAgICAgICAgICAgaWYgY2QuZ2V0KCd0eXBlX2xpbmUnKToKICAgICAgICAgICAgICAgIGMudHlwZV9saW5lID0gY2RbJ3R5cGVfbGluZSddCiAgICAgICAgICAgIGlmIGNkLmdldCgnY21jJyk6CiAgICAgICAgICAgICAgICBjLmNtYyA9IGZsb2F0KGNkWydjbWMnXSkKICAgICAgICAgICAgaWYgY2QuZ2V0KCdwb3dlcicpIGFuZCBjZC5nZXQoJ3RvdWdobmVzcycpOgogICAgICAgICAgICAgICAgYy5wb3dlciA9IHN0cihjZFsncG93ZXInXSkKICAgICAgICAgICAgICAgIGMudG91Z2huZXNzID0gc3RyKGNkWyd0b3VnaG5lc3MnXSkKICAgICAgICAgICAgICAgIGMucHQgPSBjLnBvd2VyICsgJy8nICsgYy50b3VnaG5lc3MKICAgICAgICAgICAgaWYgY2QuZ2V0KCdvcmFjbGVf' +
'dGV4dCcpOgogICAgICAgICAgICAgICAgYy5vcmFjbGVfdGV4dCA9IGNkWydvcmFjbGVfdGV4dCddCiAgICAgICAgICAgIGlmIGNkLmdldCgnbWFuYV9jb3N0Jyk6CiAgICAgICAgICAgICAgICBjLm1hbmFfY29zdCA9IGNkWydtYW5hX2Nvc3QnXQogICAgICAgICAgICBpZiBjZC5nZXQoJ2tleXdvcmRzJyk6CiAgICAgICAgICAgICAgICBrdyA9IGNkWydrZXl3b3JkcyddCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3LCBzdHIpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGpzb24gYXMgX2pzb24KICAgICAgICAgICAgICAgICAgICAgICAga3cgPSBfanNvbi5sb2FkcyhrdykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBrdyA9IFtdCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGt3LCBsaXN0KToKICAgICAgICAgICAgICAgICAgICBjLmtleXdvcmRzID0ga3cKICAgICAgICAgICAgIyBFbnJpY2ggZmlsbHMgaW4gZmxhZ3MgbGlrZSBpc19yZW1vdmFsLCBpc19yYW1wLCBpc19ib2FyZF93aXBlCiAgICAgICAgICAgIGVucmljaF9jYXJkKGMpCiAgICAgICAgICAgIGRlY2tfYS5hcHBlbmQoYykKCiAgICAgICAgZGVja19iID0gX2dlbmVyYXRlX3RyYWluaW5nX2RlY2soKQoKICAgICAgICBlbmdpbmUgPSBHYW1lRW5naW5lKG1heF90dXJucz0yNSwgcmVjb3JkX2xvZz1yZWNvcmRfbG9ncykKICAgICAgICBpbXBvcnQgdGltZQogICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKCiAgICAgICAgd2lucyA9IDAKICAgICAgICBsb3NzZXMgPSAwCiAgICAgICAgdG90YWxfdHVybnMgPSAwCiAgICAgICAgdG90YWxfZGFtYWdlX2RlYWx0ID0gMAogICAgICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZlZCA9IDAKICAgICAgICB0b3RhbF9zcGVsbHNfY2FzdCA9IDAKICAgICAgICB0b3RhbF9jcmVhdHVyZXNfcGxheWVkID0gMAogICAgICAgIHRvdGFsX3JlbW92YWxfdXNlZCA9IDAKICAgICAgICB0b3RhbF9yYW1wX3BsYXllZCA9IDAKICAgICAgICB0b3RhbF9jYXJkc19kcmF3biA9IDAKICAgICAgICB0b3RhbF9tYXhfYm9hcmQgPSAwCiAgICAgICAgZ2FtZV9yZXN1bHRzID0gW10KCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtX2dhbWVzKToKICAgICAgICAgICAgcmVzdWx0ID0gZW5naW5lLnJ1bihkZWNrX2EsIGRlY2tfYiwgbmFtZV9hPWRlY2tfbmFtZSwgbmFtZV9iPSJUcmFpbmluZyBEZWNrIikKCiAgICAgICAgICAgIGdhbWVfZGF0YSA9IHJlc3VsdC50b19kaWN0KCkKICAgICAgICAgICAgZ2FtZV9kYXRhWydnYW1lTnVtYmVyJ10gPSBpICsgMQogICAgICAgICAgICBnYW1lX3Jlc3VsdHMuYXBwZW5kKGdhbWVfZGF0YSkKCiAgICAgICAgICAgIGlmIHJlc3VsdC53aW5uZXIgPT0gMDoKICAgICAgICAgICAgICAgIHdpbnMgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9zc2VzICs9IDEKCiAgICAgICAgICAgIHRvdGFsX3R1cm5zICs9IHJlc3VsdC50dXJucwogICAgICAgICAgICBpZiByZXN1bHQucGxheWVyX2Ffc3RhdHM6CiAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2VfZGVhbHQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9kZWFsdAogICAgICAgICAgICAgICAgdG90YWxfZGFtYWdlX3JlY2VpdmVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5kYW1hZ2VfcmVjZWl2ZWQKICAgICAgICAgICAgICAgIHRvdGFsX3NwZWxsc19jYXN0ICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5zcGVsbHNfY2FzdAogICAgICAgICAgICAgICAgdG90YWxfY3JlYXR1cmVzX3BsYXllZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY3JlYXR1cmVzX3BsYXllZAogICAgICAgICAgICAgICAgdG90YWxfcmVtb3ZhbF91c2VkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5yZW1vdmFsX3VzZWQKICAgICAgICAgICAgICAgIHRvdGFsX3JhbXBfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5yYW1wX3BsYXllZAogICAgICAgICAgICAgICAgdG90YWxfY2FyZHNfZHJhd24gKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmNhcmRzX2RyYXduCiAgICAgICAgICAgICAgICB0b3RhbF9tYXhfYm9hcmQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLm1heF9ib2FyZF9zaXplCgogICAgICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydjb21wbGV0ZWQnXSA9' +
'IGkgKyAxCgogICAgICAgIGVsYXBzZWQgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0CiAgICAgICAgbiA9IG51bV9nYW1lcwoKICAgICAgICBzdW1tYXJ5ID0gewogICAgICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgICAgICdvcHBvbmVudE5hbWUnOiAnVHJhaW5pbmcgRGVjaycsCiAgICAgICAgICAgICd0b3RhbEdhbWVzJzogbiwKICAgICAgICAgICAgJ3dpbnMnOiB3aW5zLAogICAgICAgICAgICAnbG9zc2VzJzogbG9zc2VzLAogICAgICAgICAgICAnd2luUmF0ZSc6IHJvdW5kKHdpbnMgLyBuICogMTAwLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1R1cm5zJzogcm91bmQodG90YWxfdHVybnMgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0RhbWFnZURlYWx0Jzogcm91bmQodG90YWxfZGFtYWdlX2RlYWx0IC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdEYW1hZ2VSZWNlaXZlZCc6IHJvdW5kKHRvdGFsX2RhbWFnZV9yZWNlaXZlZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnU3BlbGxzQ2FzdCc6IHJvdW5kKHRvdGFsX3NwZWxsc19jYXN0IC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdDcmVhdHVyZXNQbGF5ZWQnOiByb3VuZCh0b3RhbF9jcmVhdHVyZXNfcGxheWVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdSZW1vdmFsVXNlZCc6IHJvdW5kKHRvdGFsX3JlbW92YWxfdXNlZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnUmFtcFBsYXllZCc6IHJvdW5kKHRvdGFsX3JhbXBfcGxheWVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdDYXJkc0RyYXduJzogcm91bmQodG90YWxfY2FyZHNfZHJhd24gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z01heEJvYXJkU2l6ZSc6IHJvdW5kKHRvdGFsX21heF9ib2FyZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnZWxhcHNlZFNlY29uZHMnOiByb3VuZChlbGFwc2VkLCAzKSwKICAgICAgICB9CgogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAnY29tcGxldGUnCiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydyZXN1bHQnXSA9IHsKICAgICAgICAgICAgICAgICdzdW1tYXJ5Jzogc3VtbWFyeSwKICAgICAgICAgICAgICAgICdnYW1lcyc6IGdhbWVfcmVzdWx0cywKICAgICAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ2Vycm9yJwogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnZXJyb3InXSA9IHN0cihlKQogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCmRlZiBfcnVuX3NpbV90aHJlYWQoc2ltX2lkOiBzdHIsIGRlY2tsaXN0OiBsaXN0LCBudW1fZ2FtZXM6IGludCwgZGVja19uYW1lOiBzdHIsIHJlY29yZF9sb2dzOiBib29sKToKICAgICIiIkJhY2tncm91bmQgdGhyZWFkIGZvciBydW5uaW5nIE1vbnRlIENhcmxvIHNpbXVsYXRpb25zLiIiIgogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMsIG9zCiAgICAgICAgIyBBZGQgc3JjLyB0byBwYXRoIGlmIG5lZWRlZCBmb3IgdGhlIHNpbXVsYXRvciBwYWNrYWdlCiAgICAgICAgc3JjX2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksICdzcmMnKQogICAgICAgIGlmIHNyY19kaXIgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc3JjX2RpcikKCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5tb2RlbHMgaW1wb3J0IENhcmQKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLmVuZ2luZSBpbXBvcnQgR2FtZUVuZ2luZQogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5zaW0ucnVsZXMgaW1wb3J0IGVucmljaF9jYXJkLCBwYXJzZV9kZWNrbGlzdAogICAgICAgIGZyb20gY29tbWFuZGVyX2FpX2xhYi5sYWIuZXhwZXJpbWVudHMgaW1wb3J0IGJ1aWxkX2RlY2ssIF9nZW5lcmF0ZV90cmFpbmluZ19kZWNrCgogICAgICAgIHdpdGggX3NpbV9sb2NrOgog' +
'ICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAncnVubmluZycKCiAgICAgICAgZGVja19hID0gYnVpbGRfZGVjayhkZWNrbGlzdCkKICAgICAgICBkZWNrX2IgPSBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjaygpCgogICAgICAgIGVuZ2luZSA9IEdhbWVFbmdpbmUobWF4X3R1cm5zPTI1LCByZWNvcmRfbG9nPXJlY29yZF9sb2dzKQogICAgICAgIGltcG9ydCB0aW1lCiAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQoKICAgICAgICB3aW5zID0gMAogICAgICAgIGxvc3NlcyA9IDAKICAgICAgICB0b3RhbF90dXJucyA9IDAKICAgICAgICB0b3RhbF9kYW1hZ2VfZGVhbHQgPSAwCiAgICAgICAgdG90YWxfZGFtYWdlX3JlY2VpdmVkID0gMAogICAgICAgIHRvdGFsX3NwZWxsc19jYXN0ID0gMAogICAgICAgIHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgPSAwCiAgICAgICAgdG90YWxfcmVtb3ZhbF91c2VkID0gMAogICAgICAgIHRvdGFsX3JhbXBfcGxheWVkID0gMAogICAgICAgIHRvdGFsX2NhcmRzX2RyYXduID0gMAogICAgICAgIHRvdGFsX21heF9ib2FyZCA9IDAKICAgICAgICBnYW1lX3Jlc3VsdHMgPSBbXQoKICAgICAgICBmb3IgaSBpbiByYW5nZShudW1fZ2FtZXMpOgogICAgICAgICAgICByZXN1bHQgPSBlbmdpbmUucnVuKGRlY2tfYSwgZGVja19iLCBuYW1lX2E9ZGVja19uYW1lLCBuYW1lX2I9IlRyYWluaW5nIERlY2siKQoKICAgICAgICAgICAgZ2FtZV9kYXRhID0gcmVzdWx0LnRvX2RpY3QoKQogICAgICAgICAgICBnYW1lX2RhdGFbJ2dhbWVOdW1iZXInXSA9IGkgKyAxCiAgICAgICAgICAgIGdhbWVfcmVzdWx0cy5hcHBlbmQoZ2FtZV9kYXRhKQoKICAgICAgICAgICAgaWYgcmVzdWx0Lndpbm5lciA9PSAwOgogICAgICAgICAgICAgICAgd2lucyArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb3NzZXMgKz0gMQoKICAgICAgICAgICAgdG90YWxfdHVybnMgKz0gcmVzdWx0LnR1cm5zCiAgICAgICAgICAgIGlmIHJlc3VsdC5wbGF5ZXJfYV9zdGF0czoKICAgICAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9kZWFsdCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX2RlYWx0CiAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9yZWNlaXZlZAogICAgICAgICAgICAgICAgdG90YWxfc3BlbGxzX2Nhc3QgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnNwZWxsc19jYXN0CiAgICAgICAgICAgICAgICB0b3RhbF9jcmVhdHVyZXNfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5jcmVhdHVyZXNfcGxheWVkCiAgICAgICAgICAgICAgICB0b3RhbF9yZW1vdmFsX3VzZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnJlbW92YWxfdXNlZAogICAgICAgICAgICAgICAgdG90YWxfcmFtcF9wbGF5ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnJhbXBfcGxheWVkCiAgICAgICAgICAgICAgICB0b3RhbF9jYXJkc19kcmF3biArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY2FyZHNfZHJhd24KICAgICAgICAgICAgICAgIHRvdGFsX21heF9ib2FyZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMubWF4X2JvYXJkX3NpemUKCiAgICAgICAgICAgICMgVXBkYXRlIHByb2dyZXNzCiAgICAgICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ2NvbXBsZXRlZCddID0gaSArIDEKCiAgICAgICAgZWxhcHNlZCA9IHRpbWUudGltZSgpIC0gc3RhcnQKICAgICAgICBuID0gbnVtX2dhbWVzCgogICAgICAgIHN1bW1hcnkgPSB7CiAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgJ29wcG9uZW50TmFtZSc6ICdUcmFpbmluZyBEZWNrJywKICAgICAgICAgICAgJ3RvdGFsR2FtZXMnOiBuLAogICAgICAgICAgICAnd2lucyc6IHdpbnMsCiAgICAgICAgICAgICdsb3NzZXMnOiBsb3NzZXMsCiAgICAgICAgICAgICd3aW5SYXRlJzogcm91bmQod2lucyAvIG4gKiAxMDAsIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnVHVybnMnOiByb3VuZCh0b3RhbF90dXJucyAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnRGFtYWdlRGVhbHQnOiByb3VuZCh0b3RhbF9kYW1hZ2VfZGVhbHQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0RhbWFnZVJlY2VpdmVkJzogcm91bmQodG90YWxfZGFtYWdlX3Jl' +
'Y2VpdmVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdTcGVsbHNDYXN0Jzogcm91bmQodG90YWxfc3BlbGxzX2Nhc3QgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0NyZWF0dXJlc1BsYXllZCc6IHJvdW5kKHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1JlbW92YWxVc2VkJzogcm91bmQodG90YWxfcmVtb3ZhbF91c2VkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdSYW1wUGxheWVkJzogcm91bmQodG90YWxfcmFtcF9wbGF5ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0NhcmRzRHJhd24nOiByb3VuZCh0b3RhbF9jYXJkc19kcmF3biAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnTWF4Qm9hcmRTaXplJzogcm91bmQodG90YWxfbWF4X2JvYXJkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdlbGFwc2VkU2Vjb25kcyc6IHJvdW5kKGVsYXBzZWQsIDMpLAogICAgICAgIH0KCiAgICAgICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydzdGF0dXMnXSA9ICdjb21wbGV0ZScKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3Jlc3VsdCddID0gewogICAgICAgICAgICAgICAgJ3N1bW1hcnknOiBzdW1tYXJ5LAogICAgICAgICAgICAgICAgJ2dhbWVzJzogZ2FtZV9yZXN1bHRzLAogICAgICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAnZXJyb3InCiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydlcnJvciddID0gc3RyKGUpCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCcvYXBpL3NpbS9ydW4nKQphc3luYyBkZWYgc2ltX3J1bihyZXF1ZXN0OiBGYXN0QVBJUmVxdWVzdCk6CiAgICAiIiJTdGFydCBhIE1vbnRlIENhcmxvIHNpbXVsYXRpb24gd2l0aCB0aGUgUHl0aG9uIGVuZ2luZS4iIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgZGVja2xpc3QgPSBib2R5LmdldCgnZGVja2xpc3QnLCBbXSkKICAgIG51bV9nYW1lcyA9IGJvZHkuZ2V0KCdudW1HYW1lcycsIDEwKQogICAgZGVja19uYW1lID0gYm9keS5nZXQoJ2RlY2tOYW1lJywgJ015IERlY2snKQogICAgcmVjb3JkX2xvZ3MgPSBib2R5LmdldCgncmVjb3JkTG9ncycsIFRydWUpCgogICAgaWYgbm90IGRlY2tsaXN0OgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdkZWNrbGlzdCBpcyByZXF1aXJlZCd9LCBzdGF0dXNfY29kZT00MDApCiAgICBpZiBudW1fZ2FtZXMgPCAxIG9yIG51bV9nYW1lcyA+IDEwMDA6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ251bUdhbWVzIG11c3QgYmUgMS0xMDAwJ30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBzaW1faWQgPSBzdHIoX3V1aWQudXVpZDQoKSlbOjhdCiAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXSA9IHsKICAgICAgICAgICAgJ3N0YXR1cyc6ICdxdWV1ZWQnLAogICAgICAgICAgICAnY29tcGxldGVkJzogMCwKICAgICAgICAgICAgJ3RvdGFsJzogbnVtX2dhbWVzLAogICAgICAgICAgICAnZGVja05hbWUnOiBkZWNrX25hbWUsCiAgICAgICAgICAgICdyZXN1bHQnOiBOb25lLAogICAgICAgICAgICAnZXJyb3InOiBOb25lLAogICAgICAgIH0KCiAgICB0ID0gX3RocmVhZGluZy5UaHJlYWQodGFyZ2V0PV9ydW5fc2ltX3RocmVhZCwgYXJncz0oc2ltX2lkLCBkZWNrbGlzdCwgbnVtX2dhbWVzLCBkZWNrX25hbWUsIHJlY29yZF9sb2dzKSwgZGFlbW9uPVRydWUpCiAgICB0LnN0YXJ0KCkKCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnc2ltSWQnOiBzaW1faWQsICdzdGF0dXMnOiAncXVldWVkJywgJ3RvdGFsJzogbnVtX2dhbWVzfSkKCgpAYXBwLmdldCgnL2FwaS9zaW0vc3RhdHVzJykKYXN5bmMgZGVmIHNpbV9zdGF0dXMoc2ltSWQ6IHN0cik6CiAgICAiIiJQb2xsIHNpbXVsYXRpb24gcHJvZ3Jlc3MuIiIiCiAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICBydW4gPSBfc2ltX3J1bnMuZ2V0KHNpbUlkKQogICAgaWYgbm90IHJ1bjoKICAgICAg' +
'ICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnc2ltIG5vdCBmb3VuZCd9LCBzdGF0dXNfY29kZT00MDQpCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsKICAgICAgICAnc2ltSWQnOiBzaW1JZCwKICAgICAgICAnc3RhdHVzJzogcnVuWydzdGF0dXMnXSwKICAgICAgICAnY29tcGxldGVkJzogcnVuWydjb21wbGV0ZWQnXSwKICAgICAgICAndG90YWwnOiBydW5bJ3RvdGFsJ10sCiAgICAgICAgJ2RlY2tOYW1lJzogcnVuLmdldCgnZGVja05hbWUnLCAnJyksCiAgICAgICAgJ2Vycm9yJzogcnVuLmdldCgnZXJyb3InKSwKICAgIH0pCgoKQGFwcC5nZXQoJy9hcGkvc2ltL3Jlc3VsdCcpCmFzeW5jIGRlZiBzaW1fcmVzdWx0KHNpbUlkOiBzdHIpOgogICAgIiIiR2V0IGNvbXBsZXRlZCBzaW11bGF0aW9uIHJlc3VsdHMuIiIiCiAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICBydW4gPSBfc2ltX3J1bnMuZ2V0KHNpbUlkKQogICAgaWYgbm90IHJ1bjoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnc2ltIG5vdCBmb3VuZCd9LCBzdGF0dXNfY29kZT00MDQpCiAgICBpZiBydW5bJ3N0YXR1cyddICE9ICdjb21wbGV0ZSc6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ3NpbSBub3QgY29tcGxldGUnLCAnc3RhdHVzJzogcnVuWydzdGF0dXMnXX0sIHN0YXR1c19jb2RlPTQwMCkKICAgIHJldHVybiBKU09OUmVzcG9uc2UocnVuWydyZXN1bHQnXSkKCgpAYXBwLnBvc3QoJy9hcGkvc2ltL3J1bi1mcm9tLWRlY2snKQphc3luYyBkZWYgc2ltX3J1bl9mcm9tX2RlY2socmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgc2ltdWxhdGlvbiB1c2luZyBhIGRlY2sgZnJvbSB0aGUgRGVjayBCdWlsZGVyIChieSBkZWNrIElEKS4iIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgZGVja19pZCA9IGJvZHkuZ2V0KCdkZWNrSWQnKQogICAgbnVtX2dhbWVzID0gYm9keS5nZXQoJ251bUdhbWVzJywgMTApCiAgICByZWNvcmRfbG9ncyA9IGJvZHkuZ2V0KCdyZWNvcmRMb2dzJywgVHJ1ZSkKCiAgICBpZiBub3QgZGVja19pZDoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnZGVja0lkIHJlcXVpcmVkJ30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGN1ciA9IGNvbm4uY3Vyc29yKCkKICAgIGN1ci5leGVjdXRlKCdTRUxFQ1QgbmFtZSBGUk9NIGRlY2tzIFdIRVJFIGlkID0gPycsIChkZWNrX2lkLCkpCiAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnZGVjayBub3QgZm91bmQnfSwgc3RhdHVzX2NvZGU9NDA0KQogICAgZGVja19uYW1lID0gcm93WzBdCgogICAgIyBQdWxsIGZ1bGwgY2FyZCBkYXRhIGZyb20gY29sbGVjdGlvbiBqb2luIHNvIHRoZSBzaW0gZW5naW5lIGhhcyByZWFsIHR5cGVzL3N0YXRzCiAgICBjdXIuZXhlY3V0ZSgiIiIKICAgICAgICBTRUxFQ1QgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwKICAgICAgICAgICAgICAgY2UudHlwZV9saW5lLCBjZS5jbWMsIGNlLnBvd2VyLCBjZS50b3VnaG5lc3MsCiAgICAgICAgICAgICAgIGNlLm9yYWNsZV90ZXh0LCBjZS5rZXl3b3JkcywgY2UubWFuYV9jb3N0CiAgICAgICAgRlJPTSBkZWNrX2NhcmRzIGRjCiAgICAgICAgTEVGVCBKT0lOIGNvbGxlY3Rpb25fZW50cmllcyBjZSBPTiBjZS5zY3J5ZmFsbF9pZCA9IGRjLnNjcnlmYWxsX2lkCiAgICAgICAgV0hFUkUgZGMuZGVja19pZCA9ID8KICAgICIiIiwgKGRlY2tfaWQsKSkKICAgIGNhcmRfZGF0YSA9IFtdCiAgICBmb3IgciBpbiBjdXIuZmV0Y2hhbGwoKToKICAgICAgICBmb3IgXyBpbiByYW5nZShyWzFdIG9yIDEpOgogICAgICAgICAgICBjYXJkX2RhdGEuYXBwZW5kKHsKICAgICAgICAgICAgICAgICduYW1lJzogclswXSwKICAgICAgICAgICAgICAgICd0eXBlX2xpbmUnOiByWzJdIG9yICcnLAogICAgICAgICAgICAgICAgJ2NtYyc6IHJbM10gb3IgMCwKICAgICAgICAgICAgICAgICdwb3dlcic6IHJbNF0gb3IgJycsCiAgICAgICAgICAgICAgICAndG91Z2huZXNzJzogcls1XSBvciAnJywKICAgICAgICAgICAgICAgICdvcmFjbGVfdGV4dCc6IHJbNl0gb3IgJycsCiAgICAgICAgICAgICAgICAna2V5d29yZHMnOiByWzddIG9yICcnLAogICAgICAgICAgICAgICAgJ21hbmFfY29zdCc6IHJbOF0gb3IgJycsCiAg' +
'ICAgICAgICAgIH0pCiAgICBpZiBub3QgY2FyZF9kYXRhOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdkZWNrIGhhcyBubyBjYXJkcyd9LCBzdGF0dXNfY29kZT00MDApCgogICAgc2ltX2lkID0gc3RyKF91dWlkLnV1aWQ0KCkpWzo4XQogICAgd2l0aCBfc2ltX2xvY2s6CiAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF0gPSB7CiAgICAgICAgICAgICdzdGF0dXMnOiAncXVldWVkJywKICAgICAgICAgICAgJ2NvbXBsZXRlZCc6IDAsCiAgICAgICAgICAgICd0b3RhbCc6IG51bV9nYW1lcywKICAgICAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICAgICAncmVzdWx0JzogTm9uZSwKICAgICAgICAgICAgJ2Vycm9yJzogTm9uZSwKICAgICAgICB9CgogICAgdCA9IF90aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fcnVuX3NpbV90aHJlYWRfdjIsIGFyZ3M9KHNpbV9pZCwgY2FyZF9kYXRhLCBudW1fZ2FtZXMsIGRlY2tfbmFtZSwgcmVjb3JkX2xvZ3MpLCBkYWVtb249VHJ1ZSkKICAgIHQuc3RhcnQoKQoKICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydzaW1JZCc6IHNpbV9pZCwgJ3N0YXR1cyc6ICdxdWV1ZWQnLCAndG90YWwnOiBudW1fZ2FtZXMsICdkZWNrTmFtZSc6IGRlY2tfbmFtZX0pCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEZWVwU2VlayBBSSBPcHBvbmVudCBCcmFpbgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBHbG9iYWwgRGVlcFNlZWsgYnJhaW4gaW5zdGFuY2UgKGxhenktaW5pdGlhbGl6ZWQpCl9kZWVwc2Vla19icmFpbiA9IE5vbmUKX2RlZXBzZWVrX2xvY2sgPSBfdGhyZWFkaW5nLkxvY2soKQoKZGVmIF9nZXRfZGVlcHNlZWtfYnJhaW4oKToKICAgICIiIkdldCBvciBjcmVhdGUgdGhlIGdsb2JhbCBEZWVwU2VlayBicmFpbiBpbnN0YW5jZS4iIiIKICAgIGdsb2JhbCBfZGVlcHNlZWtfYnJhaW4KICAgIGlmIF9kZWVwc2Vla19icmFpbiBpcyBOb25lOgogICAgICAgIHdpdGggX2RlZXBzZWVrX2xvY2s6CiAgICAgICAgICAgIGlmIF9kZWVwc2Vla19icmFpbiBpcyBOb25lOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMgYXMgX3N5czIsIG9zIGFzIF9vczIKICAgICAgICAgICAgICAgICAgICBzcmNfZGlyID0gX29zMi5wYXRoLmpvaW4oX29zMi5wYXRoLmRpcm5hbWUoX29zMi5wYXRoLmFic3BhdGgoX19maWxlX18pKSwgJ3NyYycpCiAgICAgICAgICAgICAgICAgICAgaWYgc3JjX2RpciBub3QgaW4gX3N5czIucGF0aDoKICAgICAgICAgICAgICAgICAgICAgICAgX3N5czIucGF0aC5pbnNlcnQoMCwgc3JjX2RpcikKICAgICAgICAgICAgICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLmRlZXBzZWVrX2JyYWluIGltcG9ydCBEZWVwU2Vla0JyYWluLCBEZWVwU2Vla0NvbmZpZwogICAgICAgICAgICAgICAgICAgIGNmZyA9IERlZXBTZWVrQ29uZmlnKCkKICAgICAgICAgICAgICAgICAgICAjIEFsbG93IGVudiB2YXIgb3ZlcnJpZGVzCiAgICAgICAgICAgICAgICAgICAgaWYgX29zMi5lbnZpcm9uLmdldCgnREVFUFNFRUtfQVBJX0JBU0UnKToKICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLmFwaV9iYXNlID0gX29zMi5lbnZpcm9uWydERUVQU0VFS19BUElfQkFTRSddCiAgICAgICAgICAgICAgICAgICAgaWYgX29zMi5lbnZpcm9uLmdldCgnREVFUFNFRUtfTU9ERUwnKToKICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLm1vZGVsID0gX29zMi5lbnZpcm9uWydERUVQU0VFS19NT0RFTCddCiAgICAgICAgICAgICAgICAgICAgY2ZnLmxvZ19kaXIgPSBfb3MyLnBhdGguam9pbihfb3MyLnBhdGguZGlybmFtZShfb3MyLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpLCAnbG9ncycsICdkZWNpc2lvbnMnKQogICAgICAgICAgICAgICAgICAgIF9kZWVwc2Vla19i' +
'cmFpbiA9IERlZXBTZWVrQnJhaW4oY2ZnKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgICAgIHByaW50KGYnW0RlZXBTZWVrXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBicmFpbjoge2V9JykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgcmV0dXJuIF9kZWVwc2Vla19icmFpbgoKCkBhcHAucG9zdCgnL2FwaS9kZWVwc2Vlay9jb25uZWN0JykKYXN5bmMgZGVmIGRlZXBzZWVrX2Nvbm5lY3QocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiVGVzdCBjb25uZWN0aW9uIHRvIHRoZSBEZWVwU2VlayBMTE0gZW5kcG9pbnQgYW5kIGF1dG8tZGV0ZWN0IG1vZGVsLiIiIgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpIGlmIGF3YWl0IHJlcXVlc3QuYm9keSgpIGVsc2Uge30KICAgIGFwaV9iYXNlID0gYm9keS5nZXQoJ2FwaUJhc2UnLCBOb25lKQogICAgbW9kZWwgPSBib2R5LmdldCgnbW9kZWwnLCBOb25lKQoKICAgIGJyYWluID0gX2dldF9kZWVwc2Vla19icmFpbigpCiAgICBpZiBicmFpbiBpcyBOb25lOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdEZWVwU2VlayBicmFpbiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSd9LCBzdGF0dXNfY29kZT01MDApCgogICAgIyBBbGxvdyBydW50aW1lIHJlY29uZmlndXJhdGlvbgogICAgaWYgYXBpX2Jhc2U6CiAgICAgICAgYnJhaW4uY29uZmlnLmFwaV9iYXNlID0gYXBpX2Jhc2UKICAgIGlmIG1vZGVsOgogICAgICAgIGJyYWluLmNvbmZpZy5tb2RlbCA9IG1vZGVsCgogICAgY29ubmVjdGVkID0gYnJhaW4uY2hlY2tfY29ubmVjdGlvbigpCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsKICAgICAgICAnY29ubmVjdGVkJzogY29ubmVjdGVkLAogICAgICAgICdhcGlCYXNlJzogYnJhaW4uY29uZmlnLmFwaV9iYXNlLAogICAgICAgICdtb2RlbCc6IGJyYWluLmNvbmZpZy5tb2RlbCwKICAgICAgICAnc3RhdHMnOiBicmFpbi5nZXRfc3RhdHMoKSwKICAgIH0pCgoKQGFwcC5nZXQoJy9hcGkvZGVlcHNlZWsvc3RhdHVzJykKYXN5bmMgZGVmIGRlZXBzZWVrX3N0YXR1cygpOgogICAgIiIiR2V0IERlZXBTZWVrIGJyYWluIHN0YXR1cyBhbmQgcGVyZm9ybWFuY2Ugc3RhdHMuIiIiCiAgICBicmFpbiA9IF9nZXRfZGVlcHNlZWtfYnJhaW4oKQogICAgaWYgYnJhaW4gaXMgTm9uZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnY29ubmVjdGVkJzogRmFsc2UsICdlcnJvcic6ICdCcmFpbiBub3QgaW5pdGlhbGl6ZWQnfSkKICAgIHJldHVybiBKU09OUmVzcG9uc2UoYnJhaW4uZ2V0X3N0YXRzKCkpCgoKQGFwcC5wb3N0KCcvYXBpL2RlZXBzZWVrL2NvbmZpZ3VyZScpCmFzeW5jIGRlZiBkZWVwc2Vla19jb25maWd1cmUocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiVXBkYXRlIERlZXBTZWVrIGNvbmZpZ3VyYXRpb24gYXQgcnVudGltZS4iIiIKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgYnJhaW4gPSBfZ2V0X2RlZXBzZWVrX2JyYWluKCkKICAgIGlmIGJyYWluIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ0JyYWluIG5vdCBpbml0aWFsaXplZCd9LCBzdGF0dXNfY29kZT01MDApCgogICAgaWYgJ2FwaUJhc2UnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLmFwaV9iYXNlID0gYm9keVsnYXBpQmFzZSddCiAgICBpZiAnbW9kZWwnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLm1vZGVsID0gYm9keVsnbW9kZWwnXQogICAgaWYgJ3RlbXBlcmF0dXJlJyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy50ZW1wZXJhdHVyZSA9IGZsb2F0KGJvZHlbJ3RlbXBlcmF0dXJlJ10pCiAgICBpZiAnbWF4VG9rZW5zJyBpbiBib2R5OgogICAgICAgIGJyYWluLmNvbmZpZy5tYXhfdG9rZW5zID0gaW50KGJvZHlbJ21heFRva2VucyddKQogICAgaWYgJ3RpbWVvdXQnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLnJlcXVlc3RfdGltZW91dCA9IGZsb2F0KGJvZHlbJ3RpbWVvdXQnXSkKICAgIGlmICdjYWNoZUVuYWJsZWQnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLmNhY2hlX2VuYWJsZWQgPSBib29sKGJvZHlbJ2NhY2hlRW5hYmxlZCddKQogICAgaWYgJ2xvZ0RlY2lzaW9ucycgaW4gYm9keToKICAgICAgICBicmFpbi5jb25maWcubG9nX2RlY2lzaW9ucyA9IGJvb2woYm9keVsnbG9nRGVjaXNpb25zJ10pCiAgICBpZiAn' +
'ZmFsbGJhY2tPblRpbWVvdXQnIGluIGJvZHk6CiAgICAgICAgYnJhaW4uY29uZmlnLmZhbGxiYWNrX29uX3RpbWVvdXQgPSBib29sKGJvZHlbJ2ZhbGxiYWNrT25UaW1lb3V0J10pCgogICAgIyBSZS10ZXN0IGNvbm5lY3Rpb24gd2l0aCBuZXcgc2V0dGluZ3MKICAgIGNvbm5lY3RlZCA9IGJyYWluLmNoZWNrX2Nvbm5lY3Rpb24oKQoKICAgIHJldHVybiBKU09OUmVzcG9uc2UoewogICAgICAgICdjb25uZWN0ZWQnOiBjb25uZWN0ZWQsCiAgICAgICAgJ2NvbmZpZyc6IHsKICAgICAgICAgICAgJ2FwaUJhc2UnOiBicmFpbi5jb25maWcuYXBpX2Jhc2UsCiAgICAgICAgICAgICdtb2RlbCc6IGJyYWluLmNvbmZpZy5tb2RlbCwKICAgICAgICAgICAgJ3RlbXBlcmF0dXJlJzogYnJhaW4uY29uZmlnLnRlbXBlcmF0dXJlLAogICAgICAgICAgICAnbWF4VG9rZW5zJzogYnJhaW4uY29uZmlnLm1heF90b2tlbnMsCiAgICAgICAgICAgICd0aW1lb3V0JzogYnJhaW4uY29uZmlnLnJlcXVlc3RfdGltZW91dCwKICAgICAgICAgICAgJ2NhY2hlRW5hYmxlZCc6IGJyYWluLmNvbmZpZy5jYWNoZV9lbmFibGVkLAogICAgICAgICAgICAnbG9nRGVjaXNpb25zJzogYnJhaW4uY29uZmlnLmxvZ19kZWNpc2lvbnMsCiAgICAgICAgICAgICdmYWxsYmFja09uVGltZW91dCc6IGJyYWluLmNvbmZpZy5mYWxsYmFja19vbl90aW1lb3V0LAogICAgICAgIH0sCiAgICB9KQoKCkBhcHAuZ2V0KCcvYXBpL2RlZXBzZWVrL2xvZ3MnKQphc3luYyBkZWYgZGVlcHNlZWtfbG9ncygpOgogICAgIiIiR2V0IGRlY2lzaW9uIGxvZyBzdGF0cyBhbmQgZmx1c2ggcGVuZGluZyBlbnRyaWVzLiIiIgogICAgYnJhaW4gPSBfZ2V0X2RlZXBzZWVrX2JyYWluKCkKICAgIGlmIGJyYWluIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogJ0JyYWluIG5vdCBpbml0aWFsaXplZCd9LCBzdGF0dXNfY29kZT01MDApCgogICAgcGVuZGluZyA9IGxlbihicmFpbi5fZGVjaXNpb25fbG9nKQogICAgZmx1c2hlZF9wYXRoID0gTm9uZQogICAgaWYgcGVuZGluZyA+IDA6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmbHVzaGVkX3BhdGggPSBicmFpbi5mbHVzaF9sb2coKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7J2Vycm9yJzogZidGYWlsZWQgdG8gZmx1c2g6IHtlfSd9LCBzdGF0dXNfY29kZT01MDApCgogICAgIyBMaXN0IGV4aXN0aW5nIGxvZyBmaWxlcwogICAgaW1wb3J0IGdsb2IgYXMgX2dsb2IKICAgIGxvZ19kaXIgPSBicmFpbi5jb25maWcubG9nX2RpcgogICAgbG9nX2ZpbGVzID0gW10KICAgIGlmIGxvZ19kaXIgYW5kIG9zLnBhdGguaXNkaXIobG9nX2Rpcik6CiAgICAgICAgZm9yIGYgaW4gc29ydGVkKF9nbG9iLmdsb2Iob3MucGF0aC5qb2luKGxvZ19kaXIsICdkZWNpc2lvbnNfKi5qc29ubCcpKSk6CiAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGYpCiAgICAgICAgICAgIGxvZ19maWxlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJzogb3MucGF0aC5iYXNlbmFtZShmKSwKICAgICAgICAgICAgICAgICdzaXplX2J5dGVzJzogc3RhdC5zdF9zaXplLAogICAgICAgICAgICAgICAgJ21vZGlmaWVkJzogc3RhdC5zdF9tdGltZSwKICAgICAgICAgICAgfSkKCiAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsKICAgICAgICAnZmx1c2hlZCc6IHBlbmRpbmcsCiAgICAgICAgJ2ZsdXNoZWRQYXRoJzogZmx1c2hlZF9wYXRoLAogICAgICAgICdsb2dGaWxlcyc6IGxvZ19maWxlc1stMjA6XSwgICMgbGFzdCAyMAogICAgfSkKCgpkZWYgX3J1bl9zaW1fdGhyZWFkX2RlZXBzZWVrKHNpbV9pZDogc3RyLCBjYXJkX2RhdGE6IGxpc3RbZGljdF0sIG51bV9nYW1lczogaW50LCBkZWNrX25hbWU6IHN0ciwgcmVjb3JkX2xvZ3M6IGJvb2wpOgogICAgIiIiQmFja2dyb3VuZCB0aHJlYWQgZm9yIHNpbXVsYXRpb25zIHVzaW5nIERlZXBTZWVrIEFJIG9wcG9uZW50LiIiIgogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMsIG9zCiAgICAgICAgc3JjX2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSksICdzcmMnKQogICAgICAgIGlmIHNyY19kaXIgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc3JjX2RpcikKCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5tb2RlbHMgaW1wb3J0IENhcmQK' +
'ICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLmRlZXBzZWVrX2VuZ2luZSBpbXBvcnQgRGVlcFNlZWtHYW1lRW5naW5lCiAgICAgICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5ydWxlcyBpbXBvcnQgZW5yaWNoX2NhcmQKICAgICAgICBmcm9tIGNvbW1hbmRlcl9haV9sYWIubGFiLmV4cGVyaW1lbnRzIGltcG9ydCBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjawoKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ3J1bm5pbmcnCgogICAgICAgICMgQnVpbGQgcGxheWVyJ3MgZGVjayB3aXRoIHJlYWwgY2FyZCBkYXRhCiAgICAgICAgZGVja19hID0gW10KICAgICAgICBmb3IgY2QgaW4gY2FyZF9kYXRhOgogICAgICAgICAgICBjID0gQ2FyZChuYW1lPWNkWyduYW1lJ10pCiAgICAgICAgICAgIGlmIGNkLmdldCgndHlwZV9saW5lJyk6CiAgICAgICAgICAgICAgICBjLnR5cGVfbGluZSA9IGNkWyd0eXBlX2xpbmUnXQogICAgICAgICAgICBpZiBjZC5nZXQoJ2NtYycpOgogICAgICAgICAgICAgICAgYy5jbWMgPSBmbG9hdChjZFsnY21jJ10pCiAgICAgICAgICAgIGlmIGNkLmdldCgncG93ZXInKSBhbmQgY2QuZ2V0KCd0b3VnaG5lc3MnKToKICAgICAgICAgICAgICAgIGMucG93ZXIgPSBzdHIoY2RbJ3Bvd2VyJ10pCiAgICAgICAgICAgICAgICBjLnRvdWdobmVzcyA9IHN0cihjZFsndG91Z2huZXNzJ10pCiAgICAgICAgICAgICAgICBjLnB0ID0gYy5wb3dlciArICcvJyArIGMudG91Z2huZXNzCiAgICAgICAgICAgIGlmIGNkLmdldCgnb3JhY2xlX3RleHQnKToKICAgICAgICAgICAgICAgIGMub3JhY2xlX3RleHQgPSBjZFsnb3JhY2xlX3RleHQnXQogICAgICAgICAgICBpZiBjZC5nZXQoJ21hbmFfY29zdCcpOgogICAgICAgICAgICAgICAgYy5tYW5hX2Nvc3QgPSBjZFsnbWFuYV9jb3N0J10KICAgICAgICAgICAgaWYgY2QuZ2V0KCdrZXl3b3JkcycpOgogICAgICAgICAgICAgICAga3cgPSBjZFsna2V5d29yZHMnXQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrdywgc3RyKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqc29uIGFzIF9qc29uCiAgICAgICAgICAgICAgICAgICAgICAgIGt3ID0gX2pzb24ubG9hZHMoa3cpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAga3cgPSBbXQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrdywgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgYy5rZXl3b3JkcyA9IGt3CiAgICAgICAgICAgIGVucmljaF9jYXJkKGMpCiAgICAgICAgICAgIGRlY2tfYS5hcHBlbmQoYykKCiAgICAgICAgZGVja19iID0gX2dlbmVyYXRlX3RyYWluaW5nX2RlY2soKQoKICAgICAgICAjIEdldCBEZWVwU2VlayBicmFpbgogICAgICAgIGJyYWluID0gX2dldF9kZWVwc2Vla19icmFpbigpCiAgICAgICAgaWYgYnJhaW4gYW5kIG5vdCBicmFpbi5fY29ubmVjdGVkOgogICAgICAgICAgICBicmFpbi5jaGVja19jb25uZWN0aW9uKCkKCiAgICAgICAgZW5naW5lID0gRGVlcFNlZWtHYW1lRW5naW5lKAogICAgICAgICAgICBicmFpbj1icmFpbiwKICAgICAgICAgICAgYWlfcGxheWVyX2luZGV4PTEsICAjIFRyYWluaW5nIGRlY2sgaXMgcGxheWVyIEIgKGluZGV4IDEpCiAgICAgICAgICAgIG1heF90dXJucz0yNSwKICAgICAgICAgICAgcmVjb3JkX2xvZz1yZWNvcmRfbG9ncywKICAgICAgICApCgogICAgICAgIGltcG9ydCB0aW1lCiAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQoKICAgICAgICB3aW5zID0gMAogICAgICAgIGxvc3NlcyA9IDAKICAgICAgICB0b3RhbF90dXJucyA9IDAKICAgICAgICB0b3RhbF9kYW1hZ2VfZGVhbHQgPSAwCiAgICAgICAgdG90YWxfZGFtYWdlX3JlY2VpdmVkID0gMAogICAgICAgIHRvdGFsX3NwZWxsc19jYXN0ID0gMAogICAgICAgIHRvdGFsX2NyZWF0dXJlc19wbGF5ZWQgPSAwCiAgICAgICAgdG90YWxfcmVtb3ZhbF91c2VkID0gMAogICAgICAgIHRvdGFsX3JhbXBfcGxheWVkID0gMAogICAgICAgIHRvdGFsX2NhcmRzX2RyYXduID0gMAogICAgICAgIHRvdGFsX21heF9ib2FyZCA9IDAKICAgICAgICBnYW1lX3Jlc3VsdHMgPSBbXQoKICAgICAgICBmb3IgaSBpbiByYW5nZShudW1fZ2FtZXMpOgogICAgICAgICAgICBnYW1lX2lkID0gZidkcy1zaW0te3NpbV9pZFs6OF19LWd7aSsxfScK' +
'ICAgICAgICAgICAgcmVzdWx0ID0gZW5naW5lLnJ1bihkZWNrX2EsIGRlY2tfYiwgbmFtZV9hPWRlY2tfbmFtZSwgbmFtZV9iPSdEZWVwU2VlayBBSScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1lX2lkPWdhbWVfaWQsIGFyY2hldHlwZT0nbWlkcmFuZ2UnKQoKICAgICAgICAgICAgZ2FtZV9kYXRhID0gcmVzdWx0LnRvX2RpY3QoKQogICAgICAgICAgICBnYW1lX2RhdGFbJ2dhbWVOdW1iZXInXSA9IGkgKyAxCiAgICAgICAgICAgIGdhbWVfcmVzdWx0cy5hcHBlbmQoZ2FtZV9kYXRhKQoKICAgICAgICAgICAgaWYgcmVzdWx0Lndpbm5lciA9PSAwOgogICAgICAgICAgICAgICAgd2lucyArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb3NzZXMgKz0gMQoKICAgICAgICAgICAgdG90YWxfdHVybnMgKz0gcmVzdWx0LnR1cm5zCiAgICAgICAgICAgIGlmIHJlc3VsdC5wbGF5ZXJfYV9zdGF0czoKICAgICAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9kZWFsdCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX2RlYWx0CiAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLmRhbWFnZV9yZWNlaXZlZAogICAgICAgICAgICAgICAgdG90YWxfc3BlbGxzX2Nhc3QgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnNwZWxsc19jYXN0CiAgICAgICAgICAgICAgICB0b3RhbF9jcmVhdHVyZXNfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5jcmVhdHVyZXNfcGxheWVkCiAgICAgICAgICAgICAgICB0b3RhbF9yZW1vdmFsX3VzZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnJlbW92YWxfdXNlZAogICAgICAgICAgICAgICAgdG90YWxfcmFtcF9wbGF5ZWQgKz0gcmVzdWx0LnBsYXllcl9hX3N0YXRzLnJhbXBfcGxheWVkCiAgICAgICAgICAgICAgICB0b3RhbF9jYXJkc19kcmF3biArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY2FyZHNfZHJhd24KICAgICAgICAgICAgICAgIHRvdGFsX21heF9ib2FyZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMubWF4X2JvYXJkX3NpemUKCiAgICAgICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ2NvbXBsZXRlZCddID0gaSArIDEKCiAgICAgICAgZWxhcHNlZCA9IHRpbWUudGltZSgpIC0gc3RhcnQKICAgICAgICBuID0gbnVtX2dhbWVzCgogICAgICAgICMgV3JpdGUgTUwgZGVjaXNpb24gSlNPTkwgZm9yIHRyYWluaW5nIHBpcGVsaW5lCiAgICAgICAgbWxfZGVjaXNpb25zID0gZW5naW5lLmZsdXNoX21sX2RlY2lzaW9ucygpCiAgICAgICAgaWYgbWxfZGVjaXNpb25zOgogICAgICAgICAgICBtbF9qc29ubF9wYXRoID0gb3MucGF0aC5qb2luKCdyZXN1bHRzJywgZidtbC1kZWNpc2lvbnMtc2ltLXtzaW1faWRbOjhdfS5qc29ubCcpCiAgICAgICAgICAgIG9zLm1ha2VkaXJzKCdyZXN1bHRzJywgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgd2l0aCBvcGVuKG1sX2pzb25sX3BhdGgsICd3JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgbWY6CiAgICAgICAgICAgICAgICBpbXBvcnQganNvbiBhcyBfbWxqc29uCiAgICAgICAgICAgICAgICBmb3IgZGVjIGluIG1sX2RlY2lzaW9uczoKICAgICAgICAgICAgICAgICAgICBtZi53cml0ZShfbWxqc29uLmR1bXBzKGRlYykgKyAnXG4nKQoKICAgICAgICAjIEdldCBEZWVwU2VlayBzdGF0cyBmb3IgdGhlIHN1bW1hcnkKICAgICAgICBkc19zdGF0cyA9IGJyYWluLmdldF9zdGF0cygpIGlmIGJyYWluIGVsc2Uge30KCiAgICAgICAgc3VtbWFyeSA9IHsKICAgICAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICAgICAnb3Bwb25lbnROYW1lJzogJ0RlZXBTZWVrIEFJJywKICAgICAgICAgICAgJ29wcG9uZW50VHlwZSc6ICdkZWVwc2VlaycsCiAgICAgICAgICAgICd0b3RhbEdhbWVzJzogbiwKICAgICAgICAgICAgJ3dpbnMnOiB3aW5zLAogICAgICAgICAgICAnbG9zc2VzJzogbG9zc2VzLAogICAgICAgICAgICAnd2luUmF0ZSc6IHJvdW5kKHdpbnMgLyBuICogMTAwLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z1R1cm5zJzogcm91bmQodG90YWxfdHVybnMgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z0RhbWFnZURlYWx0Jzogcm91bmQodG90YWxfZGFtYWdlX2RlYWx0IC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdEYW1h' +
'Z2VSZWNlaXZlZCc6IHJvdW5kKHRvdGFsX2RhbWFnZV9yZWNlaXZlZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnU3BlbGxzQ2FzdCc6IHJvdW5kKHRvdGFsX3NwZWxsc19jYXN0IC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdDcmVhdHVyZXNQbGF5ZWQnOiByb3VuZCh0b3RhbF9jcmVhdHVyZXNfcGxheWVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdSZW1vdmFsVXNlZCc6IHJvdW5kKHRvdGFsX3JlbW92YWxfdXNlZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnYXZnUmFtcFBsYXllZCc6IHJvdW5kKHRvdGFsX3JhbXBfcGxheWVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgICAgICdhdmdDYXJkc0RyYXduJzogcm91bmQodG90YWxfY2FyZHNfZHJhd24gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAgICAgJ2F2Z01heEJvYXJkU2l6ZSc6IHJvdW5kKHRvdGFsX21heF9ib2FyZCAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICAgICAnZWxhcHNlZFNlY29uZHMnOiByb3VuZChlbGFwc2VkLCAzKSwKICAgICAgICAgICAgJ2RlZXBzZWVrU3RhdHMnOiBkc19zdGF0cywKICAgICAgICB9CgogICAgICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnc3RhdHVzJ10gPSAnY29tcGxldGUnCiAgICAgICAgICAgIF9zaW1fcnVuc1tzaW1faWRdWydyZXN1bHQnXSA9IHsKICAgICAgICAgICAgICAgICdzdW1tYXJ5Jzogc3VtbWFyeSwKICAgICAgICAgICAgICAgICdnYW1lcyc6IGdhbWVfcmVzdWx0cywKICAgICAgICAgICAgfQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICB3aXRoIF9zaW1fbG9jazoKICAgICAgICAgICAgX3NpbV9ydW5zW3NpbV9pZF1bJ3N0YXR1cyddID0gJ2Vycm9yJwogICAgICAgICAgICBfc2ltX3J1bnNbc2ltX2lkXVsnZXJyb3InXSA9IHN0cihlKQogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCkBhcHAucG9zdCgnL2FwaS9zaW0vcnVuLWRlZXBzZWVrJykKYXN5bmMgZGVmIHNpbV9ydW5fZGVlcHNlZWsocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgc2ltdWxhdGlvbiB1c2luZyBEZWVwU2VlayBBSSBhcyB0aGUgb3Bwb25lbnQgYnJhaW4uIiIiCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkKICAgIGRlY2tfaWQgPSBib2R5LmdldCgnZGVja0lkJykKICAgIG51bV9nYW1lcyA9IGJvZHkuZ2V0KCdudW1HYW1lcycsIDUpICAjIERlZmF1bHQgNSAoTExNIGlzIHNsb3dlcikKICAgIHJlY29yZF9sb2dzID0gYm9keS5nZXQoJ3JlY29yZExvZ3MnLCBUcnVlKQoKICAgIGlmIG5vdCBkZWNrX2lkOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6ICdkZWNrSWQgcmVxdWlyZWQnfSwgc3RhdHVzX2NvZGU9NDAwKQogICAgaWYgbnVtX2dhbWVzIDwgMSBvciBudW1fZ2FtZXMgPiA1MDoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnbnVtR2FtZXMgbXVzdCBiZSAxLTUwIGZvciBEZWVwU2VlayBtb2RlJ30sIHN0YXR1c19jb2RlPTQwMCkKCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGN1ciA9IGNvbm4uY3Vyc29yKCkKICAgIGN1ci5leGVjdXRlKCdTRUxFQ1QgbmFtZSBGUk9NIGRlY2tzIFdIRVJFIGlkID0gPycsIChkZWNrX2lkLCkpCiAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQogICAgaWYgbm90IHJvdzoKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnZGVjayBub3QgZm91bmQnfSwgc3RhdHVzX2NvZGU9NDA0KQogICAgZGVja19uYW1lID0gcm93WzBdCgogICAgY3VyLmV4ZWN1dGUoIiIiCiAgICAgICAgU0VMRUNUIGRjLmNhcmRfbmFtZSwgZGMucXVhbnRpdHksCiAgICAgICAgICAgICAgIGNlLnR5cGVfbGluZSwgY2UuY21jLCBjZS5wb3dlciwgY2UudG91Z2huZXNzLAogICAgICAgICAgICAgICBjZS5vcmFjbGVfdGV4dCwgY2Uua2V5d29yZHMsIGNlLm1hbmFfY29zdAogICAgICAgIEZST00gZGVja19jYXJkcyBkYwogICAgICAgIExFRlQgSk9JTiBjb2xsZWN0aW9uX2VudHJpZXMgY2UgT04gY2Uuc2NyeWZhbGxfaWQgPSBkYy5zY3J5ZmFsbF9pZAogICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/CiAgICAiIiIsIChkZWNrX2lkLCkpCiAgICBjYXJkX2RhdGEg' +
'PSBbXQogICAgZm9yIHIgaW4gY3VyLmZldGNoYWxsKCk6CiAgICAgICAgZm9yIF8gaW4gcmFuZ2UoclsxXSBvciAxKToKICAgICAgICAgICAgY2FyZF9kYXRhLmFwcGVuZCh7CiAgICAgICAgICAgICAgICAnbmFtZSc6IHJbMF0sCiAgICAgICAgICAgICAgICAndHlwZV9saW5lJzogclsyXSBvciAnJywKICAgICAgICAgICAgICAgICdjbWMnOiByWzNdIG9yIDAsCiAgICAgICAgICAgICAgICAncG93ZXInOiByWzRdIG9yICcnLAogICAgICAgICAgICAgICAgJ3RvdWdobmVzcyc6IHJbNV0gb3IgJycsCiAgICAgICAgICAgICAgICAnb3JhY2xlX3RleHQnOiByWzZdIG9yICcnLAogICAgICAgICAgICAgICAgJ2tleXdvcmRzJzogcls3XSBvciAnJywKICAgICAgICAgICAgICAgICdtYW5hX2Nvc3QnOiByWzhdIG9yICcnLAogICAgICAgICAgICB9KQogICAgaWYgbm90IGNhcmRfZGF0YToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiAnZGVjayBoYXMgbm8gY2FyZHMnfSwgc3RhdHVzX2NvZGU9NDAwKQoKICAgIHNpbV9pZCA9IHN0cihfdXVpZC51dWlkNCgpKVs6OF0KICAgIHdpdGggX3NpbV9sb2NrOgogICAgICAgIF9zaW1fcnVuc1tzaW1faWRdID0gewogICAgICAgICAgICAnc3RhdHVzJzogJ3F1ZXVlZCcsCiAgICAgICAgICAgICdjb21wbGV0ZWQnOiAwLAogICAgICAgICAgICAndG90YWwnOiBudW1fZ2FtZXMsCiAgICAgICAgICAgICdkZWNrTmFtZSc6IGRlY2tfbmFtZSwKICAgICAgICAgICAgJ3Jlc3VsdCc6IE5vbmUsCiAgICAgICAgICAgICdlcnJvcic6IE5vbmUsCiAgICAgICAgfQoKICAgIHQgPSBfdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl9zaW1fdGhyZWFkX2RlZXBzZWVrLAogICAgICAgIGFyZ3M9KHNpbV9pZCwgY2FyZF9kYXRhLCBudW1fZ2FtZXMsIGRlY2tfbmFtZSwgcmVjb3JkX2xvZ3MpLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdC5zdGFydCgpCgogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7CiAgICAgICAgJ3NpbUlkJzogc2ltX2lkLAogICAgICAgICdzdGF0dXMnOiAncXVldWVkJywKICAgICAgICAndG90YWwnOiBudW1fZ2FtZXMsCiAgICAgICAgJ2RlY2tOYW1lJzogZGVja19uYW1lLAogICAgICAgICdvcHBvbmVudFR5cGUnOiAnZGVlcHNlZWsnLAogICAgfSkKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEF1dG8gRGVjayBHZW5lcmF0b3IKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCgpkZWYgX3Jlc29sdmVfY29tbWFuZGVyKHJlcTogRGVja0dlbmVyYXRpb25SZXF1ZXN0KSAtPiBkaWN0OgogICAgIiIiCiAgICBSZXNvbHZlIGNvbW1hbmRlciBpbmZvIGZyb20gYSBEZWNrR2VuZXJhdGlvblJlcXVlc3QuCiAgICBSZXR1cm5zIGRpY3Qgd2l0aDogbmFtZSwgc2NyeWZhbGxfaWQsIGNvbG9yX2lkZW50aXR5LCB0eXBlX2xpbmUsIG1hbmFfY29zdCwgaW1hZ2VfdXJsCiAgICAiIiIKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQoKICAgICMgVHJ5IHNjcnlmYWxsX2lkIGZpcnN0CiAgICBpZiByZXEuY29tbWFuZGVyX3NjcnlmYWxsX2lkOgogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIlNFTEVDVCBuYW1lLCB0eXBlX2xpbmUsIGNvbG9yX2lkZW50aXR5LCBtYW5hX2Nvc3QsIHNjcnlmYWxsX2lkIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHNjcnlmYWxsX2lkID0gPyBMSU1JVCAxIiwKICAgICAgICAgICAgKHJlcS5jb21tYW5kZXJfc2NyeWZhbGxfaWQsKQogICAgICAgICkuZmV0Y2hvbmUoKQogICAgICAgIGlmIHJvdzoKICAgICAgICAgICAgY2kgPSByb3dbImNvbG9yX2lkZW50aXR5Il0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaSwgc3RyKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBjaSA9IGpzb24ubG9hZHMoY2kp' +
'CiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGNpID0gW10KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJuYW1lIjogcm93WyJuYW1lIl0sCiAgICAgICAgICAgICAgICAic2NyeWZhbGxfaWQiOiByb3dbInNjcnlmYWxsX2lkIl0sCiAgICAgICAgICAgICAgICAiY29sb3JfaWRlbnRpdHkiOiBjaSwKICAgICAgICAgICAgICAgICJ0eXBlX2xpbmUiOiByb3dbInR5cGVfbGluZSJdLAogICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6IHJvd1sibWFuYV9jb3N0Il0gb3IgIiIsCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve3Jvd1snc2NyeWZhbGxfaWQnXX0/Zm9ybWF0PWltYWdlJnZlcnNpb249bm9ybWFsIiwKICAgICAgICAgICAgfQogICAgICAgICMgRmFsbGJhY2sgdG8gU2NyeWZhbGwgQVBJCiAgICAgICAgX3NjcnlmYWxsX3JhdGVfbGltaXQoKQogICAgICAgIHRyeToKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve3JlcS5jb21tYW5kZXJfc2NyeWZhbGxfaWR9IgogICAgICAgICAgICBycSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPXsiVXNlci1BZ2VudCI6ICJDb21tYW5kZXJBSUxhYi8xLjAiLCAiQWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24ifSkKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJxLCB0aW1lb3V0PTE1KSBhcyByZXNwOgogICAgICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgICAgICByZXR1cm4gX3NjcnlmYWxsX3RvX2NvbW1hbmRlcihkYXRhKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAjIFRyeSBuYW1lIHNlYXJjaAogICAgaWYgcmVxLmNvbW1hbmRlcl9uYW1lOgogICAgICAgIG5hbWVfbG93ZXIgPSByZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKS5sb3dlcigpCiAgICAgICAgcm93ID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiU0VMRUNUIG5hbWUsIHR5cGVfbGluZSwgY29sb3JfaWRlbnRpdHksIG1hbmFfY29zdCwgc2NyeWZhbGxfaWQgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMgV0hFUkUgTE9XRVIobmFtZSkgPSA/IExJTUlUIDEiLAogICAgICAgICAgICAobmFtZV9sb3dlciwpCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICAgICAgaWYgcm93OgogICAgICAgICAgICBjaSA9IHJvd1siY29sb3JfaWRlbnRpdHkiXQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNpLCBzdHIpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNpID0ganNvbi5sb2FkcyhjaSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgY2kgPSBbXQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgIm5hbWUiOiByb3dbIm5hbWUiXSwKICAgICAgICAgICAgICAgICJzY3J5ZmFsbF9pZCI6IHJvd1sic2NyeWZhbGxfaWQiXSwKICAgICAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNpLAogICAgICAgICAgICAgICAgInR5cGVfbGluZSI6IHJvd1sidHlwZV9saW5lIl0sCiAgICAgICAgICAgICAgICAibWFuYV9jb3N0Ijogcm93WyJtYW5hX2Nvc3QiXSBvciAiIiwKICAgICAgICAgICAgICAgICJpbWFnZV91cmwiOiBmImh0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy97cm93WydzY3J5ZmFsbF9pZCddfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWwiLAogICAgICAgICAgICB9CgogICAgICAgICMgRmFsbGJhY2sgdG8gU2NyeWZhbGwgZnV6enkgc2VhcmNoCiAgICAgICAgX3NjcnlmYWxsX3JhdGVfbGltaXQoKQogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IHVybGxpYi5wYXJzZQogICAgICAgICAgICBlbmNvZGVkID0gdXJsbGliLnBhcnNlLnF1b3RlKHJlcS5jb21tYW5kZXJfbmFtZSkKICAgICAgICAgICAgdXJsID0gZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZnV6enk9e2VuY29kZWR9IgogICAgICAgICAgICBycSA9IFJlcXVlc3QodXJsLCBoZWFkZXJzPXsiVXNlci1BZ2VudCI6ICJDb21tYW5kZXJBSUxhYi8xLjAiLCAiQWNjZXB0IjogImFwcGxpY2F0aW9uL2pzb24ifSkKICAgICAgICAgICAgd2l0aCB1cmxvcGVuKHJxLCB0aW1lb3V0PTE1KSBhcyByZXNwOgogICAgICAgICAgICAgICAgZGF0YSA9IGpzb24ubG9h' +
'ZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgICAgICAgICByZXR1cm4gX3NjcnlmYWxsX3RvX2NvbW1hbmRlcihkYXRhKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfc2NyeWZhbGxfdG9fY29tbWFuZGVyKGRhdGE6IGRpY3QpIC0+IGRpY3Q6CiAgICAiIiJDb252ZXJ0IFNjcnlmYWxsIEFQSSByZXNwb25zZSB0byBjb21tYW5kZXIgaW5mbyBkaWN0LiIiIgogICAgY2kgPSBkYXRhLmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSkKICAgIGltYWdlX3VyaXMgPSBkYXRhLmdldCgiaW1hZ2VfdXJpcyIsIHt9KQogICAgaWYgbm90IGltYWdlX3VyaXMgYW5kIGRhdGEuZ2V0KCJjYXJkX2ZhY2VzIik6CiAgICAgICAgaW1hZ2VfdXJpcyA9IGRhdGFbImNhcmRfZmFjZXMiXVswXS5nZXQoImltYWdlX3VyaXMiLCB7fSkKICAgIHJldHVybiB7CiAgICAgICAgIm5hbWUiOiBkYXRhLmdldCgibmFtZSIsICIiKSwKICAgICAgICAic2NyeWZhbGxfaWQiOiBkYXRhLmdldCgiaWQiLCAiIiksCiAgICAgICAgImNvbG9yX2lkZW50aXR5IjogY2ksCiAgICAgICAgInR5cGVfbGluZSI6IGRhdGEuZ2V0KCJ0eXBlX2xpbmUiLCAiIiksCiAgICAgICAgIm1hbmFfY29zdCI6IGRhdGEuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgImltYWdlX3VybCI6IGltYWdlX3VyaXMuZ2V0KCJub3JtYWwiLCAiIiksCiAgICB9CgoKZGVmIF9nZXRfY29sbGVjdGlvbl9mb3JfY29sb3JzKGNvbG9yX2lkZW50aXR5OiBsaXN0KSAtPiBsaXN0OgogICAgIiIiCiAgICBGZXRjaCBhbGwgY29sbGVjdGlvbiBjYXJkcyBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIGNvbG9yIGlkZW50aXR5LgogICAgUmV0dXJucyBsaXN0IG9mIGRpY3RzIHdpdGggY2FyZCBkZXRhaWxzLgogICAgIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgIlNFTEVDVCAqIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIFdIRVJFIHF1YW50aXR5ID4gMCIKICAgICkuZmV0Y2hhbGwoKQoKICAgIHZhbGlkID0gW10KICAgIGZvciByb3cgaW4gcm93czoKICAgICAgICBjYXJkID0gX3Jvd190b19kaWN0KHJvdykKICAgICAgICBjYXJkX2NpID0gY2FyZC5nZXQoImNvbG9yX2lkZW50aXR5IiwgW10pCiAgICAgICAgaWYgaXNpbnN0YW5jZShjYXJkX2NpLCBzdHIpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjYXJkX2NpID0ganNvbi5sb2FkcyhjYXJkX2NpKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgY2FyZF9jaSA9IFtdCgogICAgICAgICMgQ29sb3IgaWRlbnRpdHkgY2hlY2s6IGFsbCBjYXJkIGNvbG9ycyBtdXN0IGJlIHdpdGhpbiBjb21tYW5kZXIncyBpZGVudGl0eQogICAgICAgIGlmIGNvbG9yX2lkZW50aXR5IGFuZCBjYXJkX2NpOgogICAgICAgICAgICBpZiBub3QgYWxsKGMgaW4gY29sb3JfaWRlbnRpdHkgZm9yIGMgaW4gY2FyZF9jaSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIFNraXAgaWYgbm8gc2NyeWZhbGxfaWQKICAgICAgICBpZiBub3QgY2FyZC5nZXQoInNjcnlmYWxsX2lkIik6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGNhcmRbImNvbG9yX2lkZW50aXR5Il0gPSBjYXJkX2NpCiAgICAgICAgdmFsaWQuYXBwZW5kKGNhcmQpCgogICAgcmV0dXJuIHZhbGlkCgoKZGVmIF9nZW5lcmF0ZV9kZWNrKHJlcTogRGVja0dlbmVyYXRpb25SZXF1ZXN0KSAtPiBkaWN0OgogICAgIiIiCiAgICBDb3JlIGRlY2sgZ2VuZXJhdGlvbiBhbGdvcml0aG0uCgogICAgMS4gUmVzb2x2ZSBjb21tYW5kZXIKICAgIDIuIExvYWQgY29sbGVjdGlvbiBmaWx0ZXJlZCB0byBjb2xvciBpZGVudGl0eQogICAgMy4gQ2FsbCBlbmFibGVkIHNvdXJjZSBhZGFwdGVycyAoc3R1YmJlZCkKICAgIDQuIEJ1aWxkIGNhbmRpZGF0ZSBwb29sLCBzY29yZSBieSByb2xlL3R5cGUgZml0CiAgICA1LiBGaWxsIHNsb3RzIHBlciB0YXJnZXQgcmF0aW9zLCBwcmVmZXJyaW5nIG93bmVkIGNhcmRzCiAgICA2LiBSZXR1cm4gcmVzcG9uc2UgZGljdAogICAgIiIiCiAgICAjIDEuIFJlc29sdmUgY29tbWFuZGVyCiAgICBjb21tYW5kZXIgPSBfcmVzb2x2ZV9jb21tYW5kZXIocmVxKQogICAgaWYgbm90IGNvbW1hbmRlcjoKICAgICAgICByZXR1cm4geyJlcnJvciI6ICJDb21tYW5kZXIgbm90IGZvdW5kLiBQbGVhc2UgY2hlY2sg' +
'dGhlIG5hbWUgb3IgU2NyeWZhbGwgSUQuIn0KCiAgICBjb2xvcl9pZGVudGl0eSA9IHJlcS5jb2xvcl9pZGVudGl0eSBvciBjb21tYW5kZXIuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKQogICAgcHJpbnQoZiIgIFtERUNLR0VOXSBDb21tYW5kZXI6IHtjb21tYW5kZXJbJ25hbWUnXX0sIENJOiB7Y29sb3JfaWRlbnRpdHl9IikKCiAgICAjIDIuIExvYWQgY29sbGVjdGlvbgogICAgY29sbGVjdGlvbiA9IF9nZXRfY29sbGVjdGlvbl9mb3JfY29sb3JzKGNvbG9yX2lkZW50aXR5KQogICAgcHJpbnQoZiIgIFtERUNLR0VOXSB7bGVuKGNvbGxlY3Rpb24pfSBjYXJkcyBpbiBjb2xsZWN0aW9uIG1hdGNoIGNvbG9yIGlkZW50aXR5IikKCiAgICAjIDMuIENhbGwgc291cmNlIGFkYXB0ZXJzIChjdXJyZW50bHkgc3R1YmJlZCkKICAgIHRlbXBsYXRlX2NhcmRzID0gW10gICMgbGlzdCBvZiAobmFtZSwgd2VpZ2h0LCBzb3VyY2VfbmFtZSkKICAgIHNvdXJjZXMgPSByZXEuc291cmNlcyBvciBEZWNrR2VuZXJhdGlvblNvdXJjZUNvbmZpZygpCgogICAgdHJ5OgogICAgICAgIGlmIHNvdXJjZXMudXNlX2FyY2hpZGVrdDoKICAgICAgICAgICAgZnJvbSBkZWNrX3NvdXJjZXMuYXJjaGlkZWt0X2FkYXB0ZXIgaW1wb3J0IGZldGNoX3RlbXBsYXRlX2RlY2tzIGFzIGFyY2hpZGVrdF9mZXRjaAogICAgICAgICAgICBmb3IgdGQgaW4gYXJjaGlkZWt0X2ZldGNoKGNvbW1hbmRlclsibmFtZSJdLCBjb2xvcl9pZGVudGl0eSwgeyJ1cmwiOiBzb3VyY2VzLmFyY2hpZGVrdF91cmx9KToKICAgICAgICAgICAgICAgIGZvciB0YyBpbiB0ZC5jYXJkczoKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jYXJkcy5hcHBlbmQoKHRjLm5hbWUsIHRjLnF1YW50aXR5LCAiYXJjaGlkZWt0IikpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiIgIFtERUNLR0VOXSBBcmNoaWRla3QgYWRhcHRlciBlcnJvcjoge2V9IikKCiAgICB0cnk6CiAgICAgICAgaWYgc291cmNlcy51c2VfZWRocmVjOgogICAgICAgICAgICBmcm9tIGRlY2tfc291cmNlcy5lZGhyZWNfYWRhcHRlciBpbXBvcnQgZmV0Y2hfdGVtcGxhdGVfZGVja3MgYXMgZWRocmVjX2ZldGNoCiAgICAgICAgICAgIGZvciB0ZCBpbiBlZGhyZWNfZmV0Y2goY29tbWFuZGVyWyJuYW1lIl0sIGNvbG9yX2lkZW50aXR5KToKICAgICAgICAgICAgICAgIGZvciB0YyBpbiB0ZC5jYXJkczoKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jYXJkcy5hcHBlbmQoKHRjLm5hbWUsIHRjLnF1YW50aXR5LCAiZWRocmVjIikpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiIgIFtERUNLR0VOXSBFREhSRUMgYWRhcHRlciBlcnJvcjoge2V9IikKCiAgICB0cnk6CiAgICAgICAgaWYgc291cmNlcy51c2VfbW94ZmllbGQ6CiAgICAgICAgICAgIGZyb20gZGVja19zb3VyY2VzLm1veGZpZWxkX2FkYXB0ZXIgaW1wb3J0IGZldGNoX3RlbXBsYXRlX2RlY2tzIGFzIG1veGZpZWxkX2ZldGNoCiAgICAgICAgICAgIGZvciB0ZCBpbiBtb3hmaWVsZF9mZXRjaChjb21tYW5kZXJbIm5hbWUiXSwgY29sb3JfaWRlbnRpdHksIHsidXJsIjogc291cmNlcy5tb3hmaWVsZF91cmx9KToKICAgICAgICAgICAgICAgIGZvciB0YyBpbiB0ZC5jYXJkczoKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jYXJkcy5hcHBlbmQoKHRjLm5hbWUsIHRjLnF1YW50aXR5LCAibW94ZmllbGQiKSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIiAgW0RFQ0tHRU5dIE1veGZpZWxkIGFkYXB0ZXIgZXJyb3I6IHtlfSIpCgogICAgdHJ5OgogICAgICAgIGlmIHNvdXJjZXMudXNlX210Z2dvbGRmaXNoOgogICAgICAgICAgICBmcm9tIGRlY2tfc291cmNlcy5tdGdnb2xkZmlzaF9hZGFwdGVyIGltcG9ydCBmZXRjaF90ZW1wbGF0ZV9kZWNrcyBhcyBtdGdnb2xkZmlzaF9mZXRjaAogICAgICAgICAgICBmb3IgdGQgaW4gbXRnZ29sZGZpc2hfZmV0Y2goY29tbWFuZGVyWyJuYW1lIl0sIGNvbG9yX2lkZW50aXR5LCB7InVybCI6IHNvdXJjZXMubXRnZ29sZGZpc2hfdXJsfSk6CiAgICAgICAgICAgICAgICBmb3IgdGMgaW4gdGQuY2FyZHM6CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfY2FyZHMuYXBwZW5kKCh0Yy5uYW1lLCB0Yy5xdWFudGl0eSwgIm10Z2dvbGRmaXNoIikpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiIgIFtERUNLR0VOXSBNVEdHb2xkZmlzaCBh' +
'ZGFwdGVyIGVycm9yOiB7ZX0iKQoKICAgICMgNC4gQnVpbGQgY2FuZGlkYXRlIHBvb2wgZnJvbSBjb2xsZWN0aW9uLCBzY29yZWQgYnkgdHlwZSBuZWVkCiAgICAjICAgIEJ1aWxkIGEgbWFwOiBuYW1lX2xvd2VyIC0+IGNhcmQgZGljdCAoZGVkdXBlZCkKICAgIGNhbmRpZGF0ZV9tYXAgPSB7fQogICAgZm9yIGNhcmQgaW4gY29sbGVjdGlvbjoKICAgICAgICBuYW1lID0gY2FyZC5nZXQoIm5hbWUiLCAiIikKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBrZXkgPSBuYW1lLmxvd2VyKCkKICAgICAgICAjIFNraXAgdGhlIGNvbW1hbmRlciBpdHNlbGYKICAgICAgICBpZiBrZXkgPT0gY29tbWFuZGVyWyJuYW1lIl0ubG93ZXIoKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBrZXkgbm90IGluIGNhbmRpZGF0ZV9tYXA6CiAgICAgICAgICAgIHR5cGVfbGluZSA9IGNhcmQuZ2V0KCJ0eXBlX2xpbmUiLCAiIikKICAgICAgICAgICAgY2FyZF90eXBlID0gX2NsYXNzaWZ5X2NhcmRfdHlwZSh0eXBlX2xpbmUpCiAgICAgICAgICAgIGNhcmRfcm9sZXMgPSBfZGV0ZWN0X2NhcmRfcm9sZXMoCiAgICAgICAgICAgICAgICBjYXJkLmdldCgib3JhY2xlX3RleHQiLCAiIiksCiAgICAgICAgICAgICAgICB0eXBlX2xpbmUsCiAgICAgICAgICAgICAgICBjYXJkLmdldCgia2V5d29yZHMiLCBbXSkKICAgICAgICAgICAgKQogICAgICAgICAgICBjYW5kaWRhdGVfbWFwW2tleV0gPSB7CiAgICAgICAgICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkLmdldCgic2NyeWZhbGxfaWQiLCAiIiksCiAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICAidHlwZV9saW5lIjogdHlwZV9saW5lLAogICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6IGNhcmQuZ2V0KCJtYW5hX2Nvc3QiLCAiIiksCiAgICAgICAgICAgICAgICAiY21jIjogZmxvYXQoY2FyZC5nZXQoImNtYyIsIDApKSwKICAgICAgICAgICAgICAgICJjYXJkX3R5cGUiOiBjYXJkX3R5cGUsCiAgICAgICAgICAgICAgICAicm9sZXMiOiBjYXJkX3JvbGVzLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJjb2xsZWN0aW9uIiwKICAgICAgICAgICAgICAgICJxdWFudGl0eSI6IDEsCiAgICAgICAgICAgICAgICAib3duZWRfcXR5IjogaW50KGNhcmQuZ2V0KCJxdWFudGl0eSIsIDApKSwKICAgICAgICAgICAgICAgICJpc19wcm94eSI6IEZhbHNlLAogICAgICAgICAgICAgICAgImVkaHJlY19yYW5rIjogaW50KGNhcmQuZ2V0KCJlZGhyZWNfcmFuayIsIDk5OTk5KSksCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve2NhcmQuZ2V0KCdzY3J5ZmFsbF9pZCcsICcnKX0/Zm9ybWF0PWltYWdlJnZlcnNpb249bm9ybWFsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIpIGVsc2UgIiIsCiAgICAgICAgICAgIH0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE1lcmdlIHF1YW50aXRpZXMKICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldWyJvd25lZF9xdHkiXSArPSBpbnQoY2FyZC5nZXQoInF1YW50aXR5IiwgMCkpCgogICAgIyBBZGQgdGVtcGxhdGUgY2FyZHMgdGhhdCBhcmVuJ3QgaW4gY29sbGVjdGlvbiAoYXMgcG90ZW50aWFsIHByb3hpZXMpCiAgICBmb3IgdG5hbWUsIHRxdHksIHRzb3VyY2UgaW4gdGVtcGxhdGVfY2FyZHM6CiAgICAgICAga2V5ID0gdG5hbWUubG93ZXIoKQogICAgICAgIGlmIGtleSA9PSBjb21tYW5kZXJbIm5hbWUiXS5sb3dlcigpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGtleSBpbiBjYW5kaWRhdGVfbWFwOgogICAgICAgICAgICAjIEJvb3N0IHByaW9yaXR5IGZvciBjYXJkcyB0aGF0IGFwcGVhciBpbiB0ZW1wbGF0ZXMKICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldWyJfdGVtcGxhdGVfd2VpZ2h0Il0gPSBjYW5kaWRhdGVfbWFwW2tleV0uZ2V0KCJfdGVtcGxhdGVfd2VpZ2h0IiwgMCkgKyB0cXR5CiAgICAgICAgICAgIGlmIGNhbmRpZGF0ZV9tYXBba2V5XVsic291cmNlIl0gPT0gImNvbGxlY3Rpb24iOgogICAgICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldWyJzb3VyY2UiXSA9IGYiY29sbGVjdGlvbit7dHNvdXJjZX0iCiAgICAgICAgZWxpZiByZXEuYWxsb3dfcHJveGllczoKICAgICAgICAgICAgY2FuZGlkYXRlX21hcFtrZXldID0gewogICAgICAgICAgICAg' +
'ICAgInNjcnlmYWxsX2lkIjogIiIsCiAgICAgICAgICAgICAgICAibmFtZSI6IHRuYW1lLAogICAgICAgICAgICAgICAgInR5cGVfbGluZSI6ICIiLAogICAgICAgICAgICAgICAgIm1hbmFfY29zdCI6ICIiLAogICAgICAgICAgICAgICAgImNtYyI6IDAsCiAgICAgICAgICAgICAgICAiY2FyZF90eXBlIjogIk90aGVyIiwKICAgICAgICAgICAgICAgICJyb2xlcyI6IFtdLAogICAgICAgICAgICAgICAgInNvdXJjZSI6IHRzb3VyY2UsCiAgICAgICAgICAgICAgICAicXVhbnRpdHkiOiAxLAogICAgICAgICAgICAgICAgIm93bmVkX3F0eSI6IDAsCiAgICAgICAgICAgICAgICAiaXNfcHJveHkiOiBUcnVlLAogICAgICAgICAgICAgICAgImVkaHJlY19yYW5rIjogOTk5OTksCiAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogIiIsCiAgICAgICAgICAgICAgICAiX3RlbXBsYXRlX3dlaWdodCI6IHRxdHksCiAgICAgICAgICAgIH0KCiAgICAjIDUuIEZpbGwgc2xvdHMgcGVyIHRhcmdldCByYXRpb3MKICAgIHRhcmdldHMgPSB7CiAgICAgICAgIkxhbmQiOiByZXEudGFyZ2V0X2xhbmRfY291bnQsCiAgICAgICAgIkNyZWF0dXJlIjogcmVxLnRhcmdldF9jcmVhdHVyZV9jb3VudCwKICAgICAgICAiSW5zdGFudCI6IHJlcS50YXJnZXRfaW5zdGFudF9jb3VudCwKICAgICAgICAiU29yY2VyeSI6IHJlcS50YXJnZXRfc29yY2VyeV9jb3VudCwKICAgICAgICAiQXJ0aWZhY3QiOiByZXEudGFyZ2V0X2FydGlmYWN0X2NvdW50LAogICAgICAgICJFbmNoYW50bWVudCI6IHJlcS50YXJnZXRfZW5jaGFudG1lbnRfY291bnQsCiAgICAgICAgIlBsYW5lc3dhbGtlciI6IHJlcS50YXJnZXRfcGxhbmVzd2Fsa2VyX2NvdW50LAogICAgfQoKICAgICMgR3JvdXAgY2FuZGlkYXRlcyBieSB0eXBlCiAgICBieV90eXBlID0ge30KICAgIGZvciBjYXJkIGluIGNhbmRpZGF0ZV9tYXAudmFsdWVzKCk6CiAgICAgICAgY3QgPSBjYXJkWyJjYXJkX3R5cGUiXQogICAgICAgIGJ5X3R5cGUuc2V0ZGVmYXVsdChjdCwgW10pLmFwcGVuZChjYXJkKQoKICAgICMgU2NvcmUgYW5kIHNvcnQgY2FuZGlkYXRlcyB3aXRoaW4gZWFjaCB0eXBlCiAgICBmb3IgY3QsIGNhcmRzIGluIGJ5X3R5cGUuaXRlbXMoKToKICAgICAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICAgICAgc2NvcmUgPSAwCiAgICAgICAgICAgICMgUHJlZmVyIG93bmVkIGNhcmRzIGhlYXZpbHkKICAgICAgICAgICAgaWYgY2FyZFsib3duZWRfcXR5Il0gPiAwOgogICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAwCiAgICAgICAgICAgICMgUHJlZmVyIGNhcmRzIHdpdGggZnVuY3Rpb25hbCByb2xlcwogICAgICAgICAgICBmb3IgciBpbiBjYXJkLmdldCgicm9sZXMiLCBbXSk6CiAgICAgICAgICAgICAgICBpZiByIGluICgiUmFtcCIsICJEcmF3IiwgIlJlbW92YWwiLCAiQm9hcmRXaXBlIik6CiAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gMwogICAgICAgICAgICAjIFByZWZlciBsb3dlciBFREhSRUMgcmFuayAobW9yZSBwb3B1bGFyIGNhcmRzKQogICAgICAgICAgICBlZGhyZWNfcmFuayA9IGNhcmQuZ2V0KCJlZGhyZWNfcmFuayIsIDk5OTk5KQogICAgICAgICAgICBpZiBlZGhyZWNfcmFuayA8IDUwMDoKICAgICAgICAgICAgICAgIHNjb3JlICs9IDE1CiAgICAgICAgICAgIGVsaWYgZWRocmVjX3JhbmsgPCAyMDAwOgogICAgICAgICAgICAgICAgc2NvcmUgKz0gMTAKICAgICAgICAgICAgZWxpZiBlZGhyZWNfcmFuayA8IDUwMDA6CiAgICAgICAgICAgICAgICBzY29yZSArPSA1CiAgICAgICAgICAgICMgUHJlZmVyIGNhcmRzIGZyb20gdGVtcGxhdGVzCiAgICAgICAgICAgIHNjb3JlICs9IGNhcmQuZ2V0KCJfdGVtcGxhdGVfd2VpZ2h0IiwgMCkgKiA1CiAgICAgICAgICAgICMgUHJlZmVyIGxvd2VyIENNQyAoY3VydmUgb3B0aW1pemF0aW9uKQogICAgICAgICAgICBjbWMgPSBjYXJkLmdldCgiY21jIiwgMCkKICAgICAgICAgICAgaWYgY21jIDw9IDI6CiAgICAgICAgICAgICAgICBzY29yZSArPSA1CiAgICAgICAgICAgIGVsaWYgY21jIDw9IDQ6CiAgICAgICAgICAgICAgICBzY29yZSArPSAzCiAgICAgICAgICAgIGNhcmRbIl9zY29yZSJdID0gc2NvcmUKICAgICAgICBjYXJkcy5zb3J0KGtleT1sYW1iZGEgeDogeFsiX3Njb3JlIl0sIHJldmVyc2U9VHJ1ZSkKCiAgICAjIFBpY2sgY2FyZHMgZm9yIGVhY2ggc2xvdCB0' +
'eXBlCiAgICBkZWNrX2NhcmRzID0gW10KICAgIHVzZWRfbmFtZXMgPSBzZXQoKSAgIyB0cmFjayBieSBuYW1lIHRvIGF2b2lkIGR1cGxpY2F0ZXMKCiAgICBmb3IgY2FyZF90eXBlLCB0YXJnZXQgaW4gdGFyZ2V0cy5pdGVtcygpOgogICAgICAgIGNhbmRpZGF0ZXMgPSBieV90eXBlLmdldChjYXJkX3R5cGUsIFtdKQogICAgICAgIHBpY2tlZCA9IDAKICAgICAgICBmb3IgY2FyZCBpbiBjYW5kaWRhdGVzOgogICAgICAgICAgICBpZiBwaWNrZWQgPj0gdGFyZ2V0OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgbmFtZV9rZXkgPSBjYXJkWyJuYW1lIl0ubG93ZXIoKQogICAgICAgICAgICBpZiBuYW1lX2tleSBpbiB1c2VkX25hbWVzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIyBJZiBvbmx5IGNvbGxlY3Rpb24sIHNraXAgcHJveGllcwogICAgICAgICAgICBpZiByZXEub25seV9jYXJkc19pbl9jb2xsZWN0aW9uIGFuZCBjYXJkWyJvd25lZF9xdHkiXSA8PSAwOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdXNlZF9uYW1lcy5hZGQobmFtZV9rZXkpCiAgICAgICAgICAgIGRlY2tfY2FyZHMuYXBwZW5kKGNhcmQpCiAgICAgICAgICAgIHBpY2tlZCArPSAxCgogICAgIyBGaWxsIHJlbWFpbmluZyBzbG90cyB1cCB0byA5OSAoY29tbWFuZGVyIGlzICMxMDApCiAgICB0b3RhbCA9IHN1bSh0YXJnZXRzLnZhbHVlcygpKQogICAgaWYgdG90YWwgPCA5OToKICAgICAgICByZW1haW5pbmcgPSA5OSAtIGxlbihkZWNrX2NhcmRzKQogICAgICAgICMgRmlsbCB3aXRoIGJlc3QgcmVtYWluaW5nIGNhcmRzIGZyb20gYW55IHR5cGUKICAgICAgICBhbGxfcmVtYWluaW5nID0gW10KICAgICAgICBmb3IgY3QsIGNhcmRzIGluIGJ5X3R5cGUuaXRlbXMoKToKICAgICAgICAgICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgICAgICAgICBpZiBjYXJkWyJuYW1lIl0ubG93ZXIoKSBub3QgaW4gdXNlZF9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVxLm9ubHlfY2FyZHNfaW5fY29sbGVjdGlvbiBvciBjYXJkWyJvd25lZF9xdHkiXSA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9yZW1haW5pbmcuYXBwZW5kKGNhcmQpCiAgICAgICAgYWxsX3JlbWFpbmluZy5zb3J0KGtleT1sYW1iZGEgeDogeC5nZXQoIl9zY29yZSIsIDApLCByZXZlcnNlPVRydWUpCiAgICAgICAgZm9yIGNhcmQgaW4gYWxsX3JlbWFpbmluZ1s6cmVtYWluaW5nXToKICAgICAgICAgICAgdXNlZF9uYW1lcy5hZGQoY2FyZFsibmFtZSJdLmxvd2VyKCkpCiAgICAgICAgICAgIGRlY2tfY2FyZHMuYXBwZW5kKGNhcmQpCiAgICBlbGlmIGxlbihkZWNrX2NhcmRzKSA+IDk5OgogICAgICAgIGRlY2tfY2FyZHMgPSBkZWNrX2NhcmRzWzo5OV0KCiAgICAjIDYuIENvbXB1dGUgc3RhdHMKICAgIHN0YXRzID0geyJ0b3RhbCI6IGxlbihkZWNrX2NhcmRzKSArIDEsICJsYW5kIjogMCwgIm5vbmxhbmQiOiAwLCAiYnlfdHlwZSI6IHt9LCAib3duZWQiOiAwLCAicHJveHkiOiAwfQogICAgZm9yIGNhcmQgaW4gZGVja19jYXJkczoKICAgICAgICBjdCA9IGNhcmQuZ2V0KCJjYXJkX3R5cGUiLCAiT3RoZXIiKQogICAgICAgIHN0YXRzWyJieV90eXBlIl1bY3RdID0gc3RhdHNbImJ5X3R5cGUiXS5nZXQoY3QsIDApICsgMQogICAgICAgIGlmIGN0ID09ICJMYW5kIjoKICAgICAgICAgICAgc3RhdHNbImxhbmQiXSArPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RhdHNbIm5vbmxhbmQiXSArPSAxCiAgICAgICAgaWYgY2FyZC5nZXQoIm93bmVkX3F0eSIsIDApID4gMDoKICAgICAgICAgICAgc3RhdHNbIm93bmVkIl0gKz0gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN0YXRzWyJwcm94eSJdICs9IDEKCiAgICAjIENsZWFuIHVwIGludGVybmFsIHNjb3Jpbmcga2V5cwogICAgY2xlYW5fY2FyZHMgPSBbXQogICAgZm9yIGNhcmQgaW4gZGVja19jYXJkczoKICAgICAgICBjbGVhbl9jYXJkcy5hcHBlbmQoewogICAgICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkLmdldCgic2NyeWZhbGxfaWQiLCAiIiksCiAgICAgICAgICAgICJuYW1lIjogY2FyZC5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgICAgICJ0eXBlX2xpbmUiOiBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICAgICAibWFuYV9jb3N0IjogY2FyZC5nZXQoIm1hbmFfY29zdCIsICIiKSwKICAgICAgICAgICAgImNtYyI6IGNhcmQuZ2V0KCJjbWMiLCAw' +
'KSwKICAgICAgICAgICAgImNhcmRfdHlwZSI6IGNhcmQuZ2V0KCJjYXJkX3R5cGUiLCAiT3RoZXIiKSwKICAgICAgICAgICAgInJvbGVzIjogY2FyZC5nZXQoInJvbGVzIiwgW10pLAogICAgICAgICAgICAic291cmNlIjogY2FyZC5nZXQoInNvdXJjZSIsICJjb2xsZWN0aW9uIiksCiAgICAgICAgICAgICJxdWFudGl0eSI6IDEsCiAgICAgICAgICAgICJpbWFnZV91cmwiOiBjYXJkLmdldCgiaW1hZ2VfdXJsIiwgIiIpLAogICAgICAgICAgICAib3duZWRfcXR5IjogY2FyZC5nZXQoIm93bmVkX3F0eSIsIDApLAogICAgICAgICAgICAiaXNfcHJveHkiOiBjYXJkLmdldCgiaXNfcHJveHkiLCBGYWxzZSksCiAgICAgICAgfSkKCiAgICBwcmludChmIiAgW0RFQ0tHRU5dIEdlbmVyYXRlZCBkZWNrOiB7bGVuKGNsZWFuX2NhcmRzKX0gY2FyZHMgKyBjb21tYW5kZXIiKQogICAgcHJpbnQoZiIgIFtERUNLR0VOXSBTdGF0czoge3N0YXRzfSIpCgogICAgcmV0dXJuIHsKICAgICAgICAiY29tbWFuZGVyIjogY29tbWFuZGVyLAogICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNvbG9yX2lkZW50aXR5LAogICAgICAgICJjYXJkcyI6IGNsZWFuX2NhcmRzLAogICAgICAgICJzdGF0cyI6IHN0YXRzLAogICAgICAgICJ0YXJnZXRzIjogdGFyZ2V0cywKICAgIH0KCgpAYXBwLmdldCgiL2FwaS9kZWNrLWdlbmVyYXRvci9jb25maWciKQphc3luYyBkZWYgZGVja19nZW5lcmF0b3JfY29uZmlnKCk6CiAgICAiIiIKICAgIFJldHVybiBkZWZhdWx0IHJhdGlvcywgc3VwcG9ydGVkIHNvdXJjZXMsIGFuZCBsaW1pdHMuCiAgICBVc2VkIGJ5IHRoZSBmcm9udGVuZCB0byBwcmVmaWxsIHRoZSBnZW5lcmF0b3IgZm9ybS4KICAgICIiIgogICAgcmV0dXJuIHsKICAgICAgICAiZGVmYXVsdHMiOiB7CiAgICAgICAgICAgICJ0YXJnZXRfbGFuZF9jb3VudCI6IDM3LAogICAgICAgICAgICAidGFyZ2V0X2luc3RhbnRfY291bnQiOiAxMCwKICAgICAgICAgICAgInRhcmdldF9zb3JjZXJ5X2NvdW50IjogOCwKICAgICAgICAgICAgInRhcmdldF9hcnRpZmFjdF9jb3VudCI6IDEwLAogICAgICAgICAgICAidGFyZ2V0X2VuY2hhbnRtZW50X2NvdW50IjogOCwKICAgICAgICAgICAgInRhcmdldF9jcmVhdHVyZV9jb3VudCI6IDI1LAogICAgICAgICAgICAidGFyZ2V0X3BsYW5lc3dhbGtlcl9jb3VudCI6IDIsCiAgICAgICAgICAgICJvbmx5X2NhcmRzX2luX2NvbGxlY3Rpb24iOiBGYWxzZSwKICAgICAgICAgICAgImFsbG93X3Byb3hpZXMiOiBUcnVlLAogICAgICAgIH0sCiAgICAgICAgInNvdXJjZXMiOiBbCiAgICAgICAgICAgIHsiaWQiOiAiYXJjaGlkZWt0IiwgIm5hbWUiOiAiQXJjaGlkZWt0IiwgImVuYWJsZWQiOiBUcnVlLCAiZXhwZXJpbWVudGFsIjogRmFsc2V9LAogICAgICAgICAgICB7ImlkIjogImVkaHJlYyIsICJuYW1lIjogIkVESFJFQyIsICJlbmFibGVkIjogVHJ1ZSwgImV4cGVyaW1lbnRhbCI6IEZhbHNlfSwKICAgICAgICAgICAgeyJpZCI6ICJtb3hmaWVsZCIsICJuYW1lIjogIk1veGZpZWxkIiwgImVuYWJsZWQiOiBGYWxzZSwgImV4cGVyaW1lbnRhbCI6IFRydWV9LAogICAgICAgICAgICB7ImlkIjogIm10Z2dvbGRmaXNoIiwgIm5hbWUiOiAiTVRHR29sZGZpc2giLCAiZW5hYmxlZCI6IEZhbHNlLCAiZXhwZXJpbWVudGFsIjogVHJ1ZX0sCiAgICAgICAgXSwKICAgICAgICAibGltaXRzIjogewogICAgICAgICAgICAiZGVja19zaXplIjogMTAwLAogICAgICAgICAgICAibWF4X2V4dGVybmFsX3RlbXBsYXRlcyI6IDUsCiAgICAgICAgfSwKICAgIH0KCgpAYXBwLnBvc3QoIi9hcGkvZGVjay1nZW5lcmF0b3IvcHJldmlldyIpCmFzeW5jIGRlZiBkZWNrX2dlbmVyYXRvcl9wcmV2aWV3KHJlcTogRGVja0dlbmVyYXRpb25SZXF1ZXN0KToKICAgICIiIgogICAgR2VuZXJhdGUgYSBkZWNrIHByZXZpZXcgd2l0aG91dCBzYXZpbmcgaXQuCiAgICBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgZGVjayBkYXRhIGZvciB1c2VyIHJldmlldy4KICAgICIiIgogICAgcmVzdWx0ID0gX2dlbmVyYXRlX2RlY2socmVxKQogICAgaWYgImVycm9yIiBpbiByZXN1bHQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIHJlc3VsdFsiZXJyb3IiXSkKICAgIHJldHVybiByZXN1bHQKCgpAYXBwLnBvc3QoIi9hcGkvZGVjay1nZW5lcmF0b3IvY29tbWl0IikKYXN5bmMgZGVmIGRlY2tfZ2VuZXJhdG9yX2NvbW1pdChyZXE6IERlY2tHZW5lcmF0aW9uUmVxdWVzdCk6CiAgICAiIiIKICAgIEdlbmVy' +
'YXRlIGEgZGVjayBhbmQgc2F2ZSBpdCB0byB0aGUgRGVjayBCdWlsZGVyLgogICAgUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGRlY2sgZGF0YSBwbHVzIGRlY2tfaWQgYW5kIGRlY2tfbmFtZS4KICAgICIiIgogICAgcmVzdWx0ID0gX2dlbmVyYXRlX2RlY2socmVxKQogICAgaWYgImVycm9yIiBpbiByZXN1bHQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsIHJlc3VsdFsiZXJyb3IiXSkKCiAgICBjb21tYW5kZXIgPSByZXN1bHRbImNvbW1hbmRlciJdCiAgICBjb2xvcl9pZGVudGl0eSA9IHJlc3VsdFsiY29sb3JfaWRlbnRpdHkiXQogICAgY2FyZHMgPSByZXN1bHRbImNhcmRzIl0KCiAgICAjIERldGVybWluZSBkZWNrIG5hbWUKICAgIGRlY2tfbmFtZSA9IHJlcS5kZWNrX25hbWUgb3IgZiJBdXRvIC0ge2NvbW1hbmRlclsnbmFtZSddfSAtIHtkYXRldGltZS5ub3coKS5zdHJmdGltZSgnJVktJW0tJWQgJUg6JU0nKX0iCgogICAgIyBDcmVhdGUgdGhlIGRlY2sgaW4gdGhlIGRhdGFiYXNlCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIGNvbG9yX2lkZW50aXR5X2pzb24gPSBqc29uLmR1bXBzKGNvbG9yX2lkZW50aXR5KQogICAgY3VyID0gY29ubi5leGVjdXRlKAogICAgICAgICIiIgogICAgICAgIElOU0VSVCBJTlRPIGRlY2tzIChuYW1lLCBjb21tYW5kZXJfc2NyeWZhbGxfaWQsIGNvbW1hbmRlcl9uYW1lLCBjb2xvcl9pZGVudGl0eSwgc3RyYXRlZ3lfdGFnKQogICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPykKICAgICAgICAiIiIsCiAgICAgICAgKAogICAgICAgICAgICBkZWNrX25hbWUsCiAgICAgICAgICAgIGNvbW1hbmRlci5nZXQoInNjcnlmYWxsX2lkIiwgIiIpLAogICAgICAgICAgICBjb21tYW5kZXIuZ2V0KCJuYW1lIiwgIiIpLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eV9qc29uLAogICAgICAgICAgICAiYXV0by1nZW5lcmF0ZWQiLAogICAgICAgICkKICAgICkKICAgIGNvbm4uY29tbWl0KCkKICAgIGRlY2tfaWQgPSBjdXIubGFzdHJvd2lkCgogICAgIyBJbnNlcnQgY29tbWFuZGVyIGFzIGEgZGVjayBjYXJkIHdpdGggaXNfY29tbWFuZGVyPTEKICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlciwgcm9sZV90YWcpIFZBTFVFUyAoPywgPywgPywgMSwgMSwgJ0NvbW1hbmRlcicpIiwKICAgICAgICAoZGVja19pZCwgY29tbWFuZGVyLmdldCgic2NyeWZhbGxfaWQiLCAiIiksIGNvbW1hbmRlci5nZXQoIm5hbWUiLCAiIikpCiAgICApCgogICAgIyBJbnNlcnQgdGhlIDk5IGNhcmRzCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBzY3J5ZmFsbF9pZCA9IGNhcmQuZ2V0KCJzY3J5ZmFsbF9pZCIsICIiKQogICAgICAgIGNhcmRfbmFtZSA9IGNhcmQuZ2V0KCJuYW1lIiwgIiIpCiAgICAgICAgcXVhbnRpdHkgPSBjYXJkLmdldCgicXVhbnRpdHkiLCAxKQogICAgICAgIGlmIG5vdCBzY3J5ZmFsbF9pZCBhbmQgbm90IGNhcmRfbmFtZToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJJTlNFUlQgSU5UTyBkZWNrX2NhcmRzIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgaXNfY29tbWFuZGVyLCByb2xlX3RhZykgVkFMVUVTICg/LCA/LCA/LCA/LCAwLCA/KSIsCiAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLCBxdWFudGl0eSwgY2FyZC5nZXQoImNhcmRfdHlwZSIsICIiKSkKICAgICAgICApCiAgICBjb25uLmNvbW1pdCgpCgogICAgIyBBbHNvIGV4cG9ydCBhIC5kY2sgZmlsZSB0byB0aGUgRm9yZ2UgZGVja3MgZGlyZWN0b3J5IHNvIGl0IGFwcGVhcnMgaW4gdGhlIFNpbSBMYWIKICAgIHRyeToKICAgICAgICBkZWNrc19kaXIgPSBDRkcuZm9yZ2VfZGVja3NfZGlyCiAgICAgICAgaWYgZGVja3NfZGlyIGFuZCBvcy5wYXRoLmlzZGlyKGRlY2tzX2Rpcik6CiAgICAgICAgICAgIHNhZmVfbmFtZSA9IHJlLnN1YihyJ1teYS16QS1aMC05X1wtXHNdJywgJycsIGRlY2tfbmFtZSkuc3RyaXAoKS5yZXBsYWNlKCcgJywgJ18nKQogICAgICAgICAgICBpZiBub3Qgc2FmZV9uYW1lOgogICAgICAgICAgICAgICAgc2FmZV9uYW1lID0gZiJBdXRvRGVja197ZGVja19pZH0iCiAgICAgICAgICAgIGRja19wYXRoID0gb3MucGF0aC5qb2luKGRlY2tzX2RpciwgZiJ7c2FmZV9u' +
'YW1lfS5kY2siKQogICAgICAgICAgICBkY2tfbGluZXMgPSBbXQogICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKCJbbWV0YWRhdGFdIikKICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZChmIk5hbWU9e2RlY2tfbmFtZX0iKQogICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKCIiKQogICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKCJbQ29tbWFuZGVyXSIpCiAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoZiIxIHtjb21tYW5kZXJbJ25hbWUnXX0iKQogICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKCIiKQogICAgICAgICAgICBkY2tfbGluZXMuYXBwZW5kKCJbTWFpbl0iKQogICAgICAgICAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICAgICAgICAgIGNhcmRfbmFtZSA9IGNhcmQuZ2V0KCJuYW1lIiwgIiIpCiAgICAgICAgICAgICAgICBpZiBjYXJkX25hbWU6CiAgICAgICAgICAgICAgICAgICAgZGNrX2xpbmVzLmFwcGVuZChmIntjYXJkLmdldCgncXVhbnRpdHknLCAxKX0ge2NhcmRfbmFtZX0iKQogICAgICAgICAgICB3aXRoIG9wZW4oZGNrX3BhdGgsICJ3IiwgZW5jb2Rpbmc9InV0Zi04IikgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoIlxuIi5qb2luKGRja19saW5lcykpCiAgICAgICAgICAgIHByaW50KGYiICBbREVDS0dFTl0gRXhwb3J0ZWQgLmRjayBmaWxlOiB7ZGNrX3BhdGh9IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIiAgW0RFQ0tHRU5dIFdhcm5pbmc6IEZhaWxlZCB0byBleHBvcnQgLmRjayBmaWxlOiB7ZX0iKQoKICAgIHByaW50KGYiICBbREVDS0dFTl0gU2F2ZWQgZGVjayAne2RlY2tfbmFtZX0nIChJRDoge2RlY2tfaWR9KSB3aXRoIHtsZW4oY2FyZHMpfSBjYXJkcyArIGNvbW1hbmRlciIpCgogICAgcmVzdWx0WyJkZWNrX2lkIl0gPSBkZWNrX2lkCiAgICByZXN1bHRbImRlY2tfbmFtZSJdID0gZGVja19uYW1lCiAgICByZXR1cm4gcmVzdWx0CgoKQGFwcC5nZXQoIi9hcGkvZGVjay1nZW5lcmF0b3IvY29tbWFuZGVyLXNlYXJjaCIpCmFzeW5jIGRlZiBkZWNrX2dlbmVyYXRvcl9jb21tYW5kZXJfc2VhcmNoKHE6IHN0ciA9ICIiKToKICAgICIiIgogICAgU2VhcmNoIGZvciBsZWdlbmRhcnkgY3JlYXR1cmVzL3BsYW5lc3dhbGtlcnMgdG8gdXNlIGFzIGNvbW1hbmRlci4KICAgIEZpcnN0IGNoZWNrcyBjb2xsZWN0aW9uLCB0aGVuIGZhbGxzIGJhY2sgdG8gU2NyeWZhbGwuCiAgICAiIiIKICAgIGlmIG5vdCBxIG9yIGxlbihxKSA8IDI6CiAgICAgICAgcmV0dXJuIHsicmVzdWx0cyI6IFtdfQoKICAgIGNvbm4gPSBfZ2V0X2RiX2Nvbm4oKQogICAgcV9sb3dlciA9IGYiJXtxLmxvd2VyKCl9JSIKCiAgICAjIFNlYXJjaCBjb2xsZWN0aW9uIGZpcnN0CiAgICByb3dzID0gY29ubi5leGVjdXRlKAogICAgICAgICIiIgogICAgICAgIFNFTEVDVCBESVNUSU5DVCBuYW1lLCB0eXBlX2xpbmUsIGNvbG9yX2lkZW50aXR5LCBtYW5hX2Nvc3QsIHNjcnlmYWxsX2lkCiAgICAgICAgRlJPTSBjb2xsZWN0aW9uX2VudHJpZXMKICAgICAgICBXSEVSRSBMT1dFUihuYW1lKSBMSUtFID8gQU5EIGlzX2xlZ2VuZGFyeSA9IDEKICAgICAgICAgIEFORCAodHlwZV9saW5lIExJS0UgJyVDcmVhdHVyZSUnIE9SIHR5cGVfbGluZSBMSUtFICclUGxhbmVzd2Fsa2VyJScpCiAgICAgICAgT1JERVIgQlkgbmFtZSBBU0MKICAgICAgICBMSU1JVCAyMAogICAgICAgICIiIiwKICAgICAgICAocV9sb3dlciwpCiAgICApLmZldGNoYWxsKCkKCiAgICByZXN1bHRzID0gW10KICAgIGZvciByIGluIHJvd3M6CiAgICAgICAgY2kgPSByWyJjb2xvcl9pZGVudGl0eSJdCiAgICAgICAgaWYgaXNpbnN0YW5jZShjaSwgc3RyKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2kgPSBqc29uLmxvYWRzKGNpKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgY2kgPSBbXQogICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgIm5hbWUiOiByWyJuYW1lIl0sCiAgICAgICAgICAgICJ0eXBlX2xpbmUiOiByWyJ0eXBlX2xpbmUiXSwKICAgICAgICAgICAgImNvbG9yX2lkZW50aXR5IjogY2ksCiAgICAgICAgICAgICJtYW5hX2Nvc3QiOiByWyJtYW5hX2Nvc3QiXSBvciAiIiwKICAgICAgICAgICAgInNjcnlmYWxsX2lkIjogclsic2NyeWZhbGxfaWQiXSwKICAgICAgICAgICAgImluX2NvbGxlY3Rpb24iOiBUcnVlLAogICAgICAgICAgICAiaW1hZ2VfdXJsIjog' +
'ZiJodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMve3JbJ3NjcnlmYWxsX2lkJ119P2Zvcm1hdD1pbWFnZSZ2ZXJzaW9uPW5vcm1hbCIKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJbInNjcnlmYWxsX2lkIl0gZWxzZSAiIiwKICAgICAgICB9KQoKICAgICMgSWYgZmV3IHJlc3VsdHMsIHN1cHBsZW1lbnQgd2l0aCBTY3J5ZmFsbAogICAgaWYgbGVuKHJlc3VsdHMpIDwgNToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCB1cmxsaWIucGFyc2UKICAgICAgICAgICAgZW5jb2RlZCA9IHVybGxpYi5wYXJzZS5xdW90ZShxKQogICAgICAgICAgICBfc2NyeWZhbGxfcmF0ZV9saW1pdCgpCiAgICAgICAgICAgIHVybCA9IGYiaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3NlYXJjaD9xPXtlbmNvZGVkfSt0JTNBbGVnZW5kYXJ5Kyh0JTNBY3JlYXR1cmUrT1IrdCUzQXBsYW5lc3dhbGtlcikmb3JkZXI9ZWRocmVjJnVuaXF1ZT1jYXJkcyIKICAgICAgICAgICAgcnEgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz17IlVzZXItQWdlbnQiOiAiQ29tbWFuZGVyQUlMYWIvMS4wIiwgIkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0pCiAgICAgICAgICAgIHdpdGggdXJsb3BlbihycSwgdGltZW91dD0xNSkgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKCiAgICAgICAgICAgIGV4aXN0aW5nX25hbWVzID0ge3JbIm5hbWUiXS5sb3dlcigpIGZvciByIGluIHJlc3VsdHN9CiAgICAgICAgICAgIGZvciBjYXJkIGluIGRhdGEuZ2V0KCJkYXRhIiwgW10pWzoxMF06CiAgICAgICAgICAgICAgICBpZiBjYXJkWyJuYW1lIl0ubG93ZXIoKSBpbiBleGlzdGluZ19uYW1lczoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaW1hZ2VfdXJpcyA9IGNhcmQuZ2V0KCJpbWFnZV91cmlzIiwge30pCiAgICAgICAgICAgICAgICBpZiBub3QgaW1hZ2VfdXJpcyBhbmQgY2FyZC5nZXQoImNhcmRfZmFjZXMiKToKICAgICAgICAgICAgICAgICAgICBpbWFnZV91cmlzID0gY2FyZFsiY2FyZF9mYWNlcyJdWzBdLmdldCgiaW1hZ2VfdXJpcyIsIHt9KQogICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogY2FyZFsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICJ0eXBlX2xpbmUiOiBjYXJkLmdldCgidHlwZV9saW5lIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNhcmQuZ2V0KCJjb2xvcl9pZGVudGl0eSIsIFtdKSwKICAgICAgICAgICAgICAgICAgICAibWFuYV9jb3N0IjogY2FyZC5nZXQoIm1hbmFfY29zdCIsICIiKSwKICAgICAgICAgICAgICAgICAgICAic2NyeWZhbGxfaWQiOiBjYXJkLmdldCgiaWQiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgImluX2NvbGxlY3Rpb24iOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAiaW1hZ2VfdXJsIjogaW1hZ2VfdXJpcy5nZXQoIm5vcm1hbCIsIGltYWdlX3VyaXMuZ2V0KCJzbWFsbCIsICIiKSksCiAgICAgICAgICAgICAgICB9KQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcHJpbnQoZiIgIFtERUNLR0VOXSBTY3J5ZmFsbCBzZWFyY2ggZXJyb3I6IHtlfSIpCgogICAgcmV0dXJuIHsicmVzdWx0cyI6IHJlc3VsdHNbOjIwXX0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFBlcnBsZXhpdHkgQVBJIOKAlCBBSSBEZWNrIFJlc2VhcmNoICYgR2VuZXJhdGlvbgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKCmNsYXNzIERlY2tSZXNlYXJjaFJlcXVlc3QoQmFzZU1vZGVsKToKICAgIGRlY2tfaWQ6IGludCAgIyBEZWNrIHRvIHJlc2VhcmNoCiAgICBnb2FsOiBPcHRpb25hbFtzdHJdID0gIklkZW50' +
'aWZ5IHdlYWtuZXNzZXMgYW5kIHN1Z2dlc3QgdXBncmFkZXMiCiAgICBidWRnZXRfdXNkOiBPcHRpb25hbFtmbG9hdF0gPSBOb25lCiAgICBvbWl0X2NhcmRzOiBPcHRpb25hbFtsaXN0W3N0cl1dID0gW10KICAgIHVzZV9jb2xsZWN0aW9uOiBib29sID0gVHJ1ZQoKCmNsYXNzIERlY2tHZW5lcmF0ZUFJUmVxdWVzdChCYXNlTW9kZWwpOgogICAgY29tbWFuZGVyOiBzdHIKICAgIGJ1ZGdldF91c2Q6IE9wdGlvbmFsW2Zsb2F0XSA9IE5vbmUKICAgIGJ1ZGdldF9tb2RlOiBzdHIgPSAidG90YWwiICAjICJ0b3RhbCIgb3IgInBlcl9jYXJkIgogICAgb21pdF9jYXJkczogT3B0aW9uYWxbbGlzdFtzdHJdXSA9IFtdCiAgICB1c2VfY29sbGVjdGlvbjogYm9vbCA9IFRydWUKCgpkZWYgX2J1aWxkX2NvbGxlY3Rpb25fc3VtbWFyeShjb2xvcl9pZGVudGl0eTogbGlzdFtzdHJdIHwgTm9uZSA9IE5vbmUpIC0+IGRpY3Q6CiAgICAiIiJCdWlsZCBhIGNvbXBhY3QgY29sbGVjdGlvbiBzdW1tYXJ5IGZvciB0aGUgQUksIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgY29sb3IgaWRlbnRpdHkuIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKCiAgICAjIEJhc2UgcXVlcnk6IGFsbCBjb2xsZWN0aW9uIGVudHJpZXMgd2l0aCBvcmFjbGUgdGV4dAogICAgd2hlcmUgPSAiV0hFUkUgcXVhbnRpdHkgPiAwIgogICAgcGFyYW1zID0gW10KCiAgICAjIEZpbHRlciBieSBjb2xvciBpZGVudGl0eSBpZiBwcm92aWRlZAogICAgaWYgY29sb3JfaWRlbnRpdHk6CiAgICAgICAgIyBDYXJkcyBtdXN0IG9ubHkgY29udGFpbiBjb2xvcnMgaW4gdGhlIGNvbW1hbmRlcidzIGlkZW50aXR5ICgrIGNvbG9ybGVzcykKICAgICAgICBjaV9zZXQgPSBzZXQoYy51cHBlcigpIGZvciBjIGluIGNvbG9yX2lkZW50aXR5KQogICAgICAgICMgV2UnbGwgZG8gYSBwb3N0LWZpbHRlciBzaW5jZSBjb2xvcl9pZGVudGl0eSBpcyBKU09OIGluIHRoZSBEQgogICAgICAgIHBhc3MgICMgZmlsdGVyIGluIFB5dGhvbiBhZnRlciBmZXRjaAoKICAgIHJvd3MgPSBjb25uLmV4ZWN1dGUoZiIiIgogICAgICAgIFNFTEVDVCBuYW1lLCB0eXBlX2xpbmUsIGNtYywgb3JhY2xlX3RleHQsIGtleXdvcmRzLCB0Y2dfcHJpY2UsIHF1YW50aXR5LAogICAgICAgICAgICAgICBjb2xvcl9pZGVudGl0eSwgY2F0ZWdvcnksIGlzX2dhbWVfY2hhbmdlciwgc2FsdF9zY29yZQogICAgICAgIEZST00gY29sbGVjdGlvbl9lbnRyaWVzIHt3aGVyZX0KICAgICAgICBPUkRFUiBCWSBlZGhyZWNfcmFuayBBU0MsIHRjZ19wcmljZSBERVNDCiAgICAiIiIsIHBhcmFtcykuZmV0Y2hhbGwoKQoKICAgICMgQ29sb3IgaWRlbnRpdHkgZmlsdGVyCiAgICBkZWYgY2FyZF9maXRzX2lkZW50aXR5KGNhcmRfY2lfc3RyLCBjaV9zZXQpOgogICAgICAgIGlmIG5vdCBjaV9zZXQ6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjYXJkX2NpID0ganNvbi5sb2FkcyhjYXJkX2NpX3N0cikgaWYgY2FyZF9jaV9zdHIgZWxzZSBbXQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjYXJkX2NpLCBsaXN0KToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIHJldHVybiBhbGwoYy51cHBlcigpIGluIGNpX3NldCBmb3IgYyBpbiBjYXJkX2NpIGlmIGMudXBwZXIoKSBub3QgaW4gKCcnLCAnQycpKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgIyBSb2xlIGRldGVjdGlvbiBmcm9tIHR5cGVfbGluZSwgb3JhY2xlX3RleHQsIGFuZCBjYXRlZ29yeQogICAgZGVmIGRldGVjdF9yb2xlKHJvdyk6CiAgICAgICAgdGwgPSAocm93Wyd0eXBlX2xpbmUnXSBvciAnJykubG93ZXIoKQogICAgICAgIG9yYWNsZSA9IChyb3dbJ29yYWNsZV90ZXh0J10gb3IgJycpLmxvd2VyKCkKICAgICAgICBjYXQgPSAocm93WydjYXRlZ29yeSddIG9yICcnKS5sb3dlcigpCiAgICAgICAga3cgPSAocm93WydrZXl3b3JkcyddIG9yICcnKS5sb3dlcigpCgogICAgICAgICMgUHJpb3JpdHkgb3JkZXIKICAgICAgICBpZiAnbGFuZCcgaW4gdGw6CiAgICAgICAgICAgIHJldHVybiAnbGFuZHMnCiAgICAgICAgaWYgYW55KHcgaW4gY2F0IGZvciB3IGluIFsncmFtcCcsICdtYW5hJ10pOgogICAgICAgICAgICByZXR1cm4gJ3JhbXAnCiAgICAgICAgaWYgYW55KHcgaW4gb3JhY2xlIGZvciB3IGluIFsnYWRkIHsnLCAnYWRkIG9uZSBtYW5hJywgJ3NlYXJjaCB5b3VyIGxpYnJhcnkg' +
'Zm9yIGEgYmFzaWMgbGFuZCcsICdzZWFyY2ggeW91ciBsaWJyYXJ5IGZvciBhIGxhbmQnXSk6CiAgICAgICAgICAgIHJldHVybiAncmFtcCcKICAgICAgICBpZiAnbWFuYScgaW4gY2F0IG9yICgnYXJ0aWZhY3QnIGluIHRsIGFuZCAoJ2FkZCcgaW4gb3JhY2xlIGFuZCAneycgaW4gb3JhY2xlKSk6CiAgICAgICAgICAgIHJldHVybiAncmFtcCcKICAgICAgICBpZiBhbnkodyBpbiBjYXQgZm9yIHcgaW4gWydkcmF3JywgJ2NhcmQgYWR2YW50YWdlJ10pOgogICAgICAgICAgICByZXR1cm4gJ2NhcmRfZHJhdycKICAgICAgICBpZiAnZHJhdycgaW4gb3JhY2xlIGFuZCAnY2FyZCcgaW4gb3JhY2xlOgogICAgICAgICAgICByZXR1cm4gJ2NhcmRfZHJhdycKICAgICAgICBpZiBhbnkodyBpbiBjYXQgZm9yIHcgaW4gWydyZW1vdmFsJywgJ3RhcmdldGVkIHJlbW92YWwnXSk6CiAgICAgICAgICAgIHJldHVybiAncmVtb3ZhbCcKICAgICAgICBpZiAnZGVzdHJveSB0YXJnZXQnIGluIG9yYWNsZSBvciAnZXhpbGUgdGFyZ2V0JyBpbiBvcmFjbGUgb3IgJ2RlYWxzJyBpbiBvcmFjbGU6CiAgICAgICAgICAgIHJldHVybiAncmVtb3ZhbCcKICAgICAgICBpZiBhbnkodyBpbiBjYXQgZm9yIHcgaW4gWydib2FyZCB3aXBlJywgJ2JvYXJkd2lwZScsICd3cmF0aCddKToKICAgICAgICAgICAgcmV0dXJuICdib2FyZF93aXBlcycKICAgICAgICBpZiAnZGVzdHJveSBhbGwnIGluIG9yYWNsZSBvciAnZXhpbGUgYWxsJyBpbiBvcmFjbGU6CiAgICAgICAgICAgIHJldHVybiAnYm9hcmRfd2lwZXMnCiAgICAgICAgaWYgYW55KHcgaW4gY2F0IGZvciB3IGluIFsnd2luJywgJ2ZpbmlzaGVyJywgJ2NvbWJvJ10pOgogICAgICAgICAgICByZXR1cm4gJ3dpbl9jb25kaXRpb25zJwogICAgICAgIGlmICd5b3Ugd2luIHRoZSBnYW1lJyBpbiBvcmFjbGUgb3IgJ2V4dHJhIHR1cm4nIGluIG9yYWNsZSBvciAnaW5maW5pdGUnIGluIG9yYWNsZToKICAgICAgICAgICAgcmV0dXJuICd3aW5fY29uZGl0aW9ucycKICAgICAgICBpZiAnY3JlYXR1cmUnIGluIHRsOgogICAgICAgICAgICByZXR1cm4gJ2NyZWF0dXJlcycKICAgICAgICByZXR1cm4gJ3V0aWxpdHknCgogICAgIyBHcm91cCBjYXJkcyBieSByb2xlCiAgICBncm91cHM6IGRpY3Rbc3RyLCBsaXN0XSA9IHsKICAgICAgICAncmFtcCc6IFtdLCAnY2FyZF9kcmF3JzogW10sICdyZW1vdmFsJzogW10sICdib2FyZF93aXBlcyc6IFtdLAogICAgICAgICdsYW5kcyc6IFtdLCAnd2luX2NvbmRpdGlvbnMnOiBbXSwgJ2NyZWF0dXJlcyc6IFtdLCAndXRpbGl0eSc6IFtdCiAgICB9CiAgICBmaWx0ZXJlZF9jb3VudCA9IDAKCiAgICBmb3IgciBpbiByb3dzOgogICAgICAgIGlmIGNvbG9yX2lkZW50aXR5IGFuZCBub3QgY2FyZF9maXRzX2lkZW50aXR5KHJbJ2NvbG9yX2lkZW50aXR5J10sIGNpX3NldCk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZmlsdGVyZWRfY291bnQgKz0gMQogICAgICAgIHJvbGUgPSBkZXRlY3Rfcm9sZShyKQogICAgICAgIGdyb3Vwc1tyb2xlXS5hcHBlbmQoewogICAgICAgICAgICAnbmFtZSc6IHJbJ25hbWUnXSwKICAgICAgICAgICAgJ2NvdW50JzogclsncXVhbnRpdHknXSwKICAgICAgICAgICAgJ3ByaWNlJzogcm91bmQoclsndGNnX3ByaWNlJ10gb3IgMCwgMiksCiAgICAgICAgICAgICdjbWMnOiByWydjbWMnXSBvciAwLAogICAgICAgIH0pCgogICAgIyBMaW1pdCBlYWNoIGdyb3VwIHRvIHRvcCAzMAogICAgZ3JvdXBfZGVzY3JpcHRpb25zID0gewogICAgICAgICdyYW1wJzogJ01hbmEgcm9ja3MgYW5kIGxhbmQgcmFtcCBpbiBkZWNrIGNvbG9ycycsCiAgICAgICAgJ2NhcmRfZHJhdyc6ICdDYXJkIGRyYXcgYW5kIGNhcmQgYWR2YW50YWdlIGVuZ2luZXMnLAogICAgICAgICdyZW1vdmFsJzogJ1RhcmdldGVkIHJlbW92YWwgc3BlbGxzIChkZXN0cm95LCBleGlsZSwgYm91bmNlKScsCiAgICAgICAgJ2JvYXJkX3dpcGVzJzogJ0JvYXJkIHdpcGVzIGFuZCBtYXNzIHJlbW92YWwnLAogICAgICAgICdsYW5kcyc6ICdOb24tYmFzaWMgbGFuZHMgdGhhdCBmaXQgdGhlIGNvbG9yIGlkZW50aXR5JywKICAgICAgICAnd2luX2NvbmRpdGlvbnMnOiAnV2luIGNvbmRpdGlvbnMsIGNvbWJvIHBpZWNlcywgYW5kIGZpbmlzaGVycycsCiAgICAgICAgJ2NyZWF0dXJlcyc6ICdDcmVhdHVyZXMgKG5vbi1jb21tYW5kZXIpJywKICAgICAgICAndXRpbGl0eSc6ICdVdGlsaXR5IHNwZWxscywgZW5jaGFudG1lbnRzLCBhcnRp' +
'ZmFjdHMsIGFuZCBwbGFuZXN3YWxrZXJzJywKICAgIH0KCiAgICByZXN1bHRfZ3JvdXBzID0gW10KICAgIGZvciBnaWQsIGNhcmRzIGluIGdyb3Vwcy5pdGVtcygpOgogICAgICAgIGlmIG5vdCBjYXJkczoKICAgICAgICAgICAgY29udGludWUKICAgICAgICByZXN1bHRfZ3JvdXBzLmFwcGVuZCh7CiAgICAgICAgICAgICdncm91cF9pZCc6IGdpZCwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogZ3JvdXBfZGVzY3JpcHRpb25zLmdldChnaWQsICcnKSwKICAgICAgICAgICAgJ2NhcmRzJzogY2FyZHNbOjMwXSwKICAgICAgICB9KQoKICAgIHJldHVybiB7CiAgICAgICAgJ3RvdGFsX2NhcmRzJzogbGVuKHJvd3MpLAogICAgICAgICdmaWx0ZXJlZF9jYXJkcyc6IGZpbHRlcmVkX2NvdW50LAogICAgICAgICdncm91cHMnOiByZXN1bHRfZ3JvdXBzLAogICAgfQoKCmRlZiBfY2FsbF9wcGx4X2FwaShtZXNzYWdlczogbGlzdFtkaWN0XSwgbWF4X3Rva2VuczogaW50ID0gNDA5NiwgdGVtcGVyYXR1cmU6IGZsb2F0ID0gMC4yKSAtPiBzdHI6CiAgICAiIiJDYWxsIFBlcnBsZXhpdHkgQVBJIGNoYXQvY29tcGxldGlvbnMgZW5kcG9pbnQuIFJldHVybnMgdGhlIGFzc2lzdGFudCBtZXNzYWdlIGNvbnRlbnQuIiIiCiAgICBpZiBub3QgQ0ZHLnBwbHhfYXBpX2tleToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgJ1BlcnBsZXhpdHkgQVBJIGtleSBub3QgY29uZmlndXJlZC4gU2V0IFBQTFhfQVBJX0tFWSBlbnYgdmFyIG9yIC0tcHBseC1rZXkuJykKCiAgICBwYXlsb2FkID0gewogICAgICAgICdtb2RlbCc6ICdzb25hcicsCiAgICAgICAgJ21lc3NhZ2VzJzogbWVzc2FnZXMsCiAgICAgICAgJ21heF90b2tlbnMnOiBtYXhfdG9rZW5zLAogICAgICAgICd0ZW1wZXJhdHVyZSc6IHRlbXBlcmF0dXJlLAogICAgICAgICdyZXR1cm5fcmVsYXRlZF9xdWVzdGlvbnMnOiBGYWxzZSwKICAgIH0KCiAgICByZXFfZGF0YSA9IGpzb24uZHVtcHMocGF5bG9hZCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXEgPSBSZXF1ZXN0KCdodHRwczovL2FwaS5wZXJwbGV4aXR5LmFpL2NoYXQvY29tcGxldGlvbnMnLCBkYXRhPXJlcV9kYXRhLCBtZXRob2Q9J1BPU1QnKQogICAgcmVxLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJykKICAgIHJlcS5hZGRfaGVhZGVyKCdBdXRob3JpemF0aW9uJywgZidCZWFyZXIge0NGRy5wcGx4X2FwaV9rZXl9JykKCiAgICB0cnk6CiAgICAgICAgd2l0aCB1cmxvcGVuKHJlcSwgdGltZW91dD0xMjApIGFzIHJlc3A6CiAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQogICAgICAgIGNob2ljZXMgPSBkYXRhLmdldCgnY2hvaWNlcycsIFtdKQogICAgICAgIGlmIG5vdCBjaG9pY2VzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIFBlcnBsZXhpdHkgQVBJJykKICAgICAgICBjb250ZW50ID0gY2hvaWNlc1swXS5nZXQoJ21lc3NhZ2UnLCB7fSkuZ2V0KCdjb250ZW50JywgJycpCiAgICAgICAgdXNhZ2UgPSBkYXRhLmdldCgndXNhZ2UnLCB7fSkKICAgICAgICBwcmludChmJ1twcGx4LWFwaV0gdG9rZW5zOiBwcm9tcHQ9e3VzYWdlLmdldCgicHJvbXB0X3Rva2VucyIsIj8iKX0sICcKICAgICAgICAgICAgICBmJ2NvbXBsZXRpb249e3VzYWdlLmdldCgiY29tcGxldGlvbl90b2tlbnMiLCI/Iil9LCAnCiAgICAgICAgICAgICAgZidtb2RlbD17ZGF0YS5nZXQoIm1vZGVsIiwiPyIpfScpCiAgICAgICAgcmV0dXJuIGNvbnRlbnQKICAgIGV4Y2VwdCBVUkxFcnJvciBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAyLCBmJ1BlcnBsZXhpdHkgQVBJIGNhbGwgZmFpbGVkOiB7ZX0nKQogICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVycm9yIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDIsIGYnUGVycGxleGl0eSBBUEkgcmV0dXJuZWQgaW52YWxpZCBKU09OOiB7ZX0nKQoKCmRlZiBfZXh0cmFjdF9qc29uX2Zyb21fcmVzcG9uc2UodGV4dDogc3RyKSAtPiBkaWN0OgogICAgIiIiRXh0cmFjdCBKU09OIG9iamVjdCBmcm9tIExMTSByZXNwb25zZSwgaGFuZGxpbmcgbWFya2Rvd24gZmVuY2VzIGFuZCBleHRyYSB0ZXh0LiIiIgogICAgIyBTdHJpcCBtYXJrZG93biBjb2RlIGZlbmNlcwogICAgY2xlYW5lZCA9IHJlLnN1YihyJ15gYGAoPzpqc29uKT9ccyonLCAnJywgdGV4dC5zdHJpcCgpKQogICAgY2xlYW5lZCA9IHJlLnN1' +
'YihyJ1xzKmBgYCQnLCAnJywgY2xlYW5lZC5zdHJpcCgpKQoKICAgICMgVHJ5IGRpcmVjdCBwYXJzZQogICAgdHJ5OgogICAgICAgIHJldHVybiBqc29uLmxvYWRzKGNsZWFuZWQpCiAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgICMgVHJ5IHRvIGZpbmQgSlNPTiBvYmplY3QgaW4gdGhlIHRleHQKICAgIG1hdGNoID0gcmUuc2VhcmNoKHInXHtbXHNcU10qXH0nLCB0ZXh0KQogICAgaWYgbWF0Y2g6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhtYXRjaC5ncm91cCgwKSkKICAgICAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICByYWlzZSBWYWx1ZUVycm9yKGYnQ291bGQgbm90IGV4dHJhY3QgSlNPTiBmcm9tIHJlc3BvbnNlOiB7dGV4dFs6MzAwXX0nKQoKCmRlZiBfcG9zdHByb2Nlc3NfZGVja19jYXJkcyhjYXJkczogbGlzdFtkaWN0XSwgY29sb3JfaWRlbnRpdHk6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lKSAtPiBsaXN0W2RpY3RdOgogICAgIiIiCiAgICBQb3N0LXByb2Nlc3MgQUktc3VnZ2VzdGVkIGNhcmRzOgogICAgLSBWYWxpZGF0ZSBuYW1lcyBhZ2FpbnN0IGNvbGxlY3Rpb24gREIKICAgIC0gQXR0YWNoIHJlYWwgcHJpY2VzCiAgICAtIFNldCBmcm9tX2NvbGxlY3Rpb24gZmxhZwogICAgIiIiCiAgICBjb25uID0gX2dldF9kYl9jb25uKCkKICAgIHByb2Nlc3NlZCA9IFtdCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBuYW1lID0gY2FyZC5nZXQoJ25hbWUnLCAnJykKICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBMb29rIHVwIGluIGNvbGxlY3Rpb24KICAgICAgICByb3cgPSBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICJTRUxFQ1QgbmFtZSwgdGNnX3ByaWNlLCBxdWFudGl0eSwgc2NyeWZhbGxfaWQsIHR5cGVfbGluZSwgY21jLCBvcmFjbGVfdGV4dCAiCiAgICAgICAgICAgICJGUk9NIGNvbGxlY3Rpb25fZW50cmllcyBXSEVSRSBuYW1lID0gPyBDT0xMQVRFIE5PQ0FTRSBMSU1JVCAxIiwKICAgICAgICAgICAgKG5hbWUsKQogICAgICAgICkuZmV0Y2hvbmUoKQoKICAgICAgICBlbnRyeSA9IHsKICAgICAgICAgICAgJ25hbWUnOiByb3dbJ25hbWUnXSBpZiByb3cgZWxzZSBuYW1lLAogICAgICAgICAgICAnY291bnQnOiBjYXJkLmdldCgnY291bnQnLCAxKSwKICAgICAgICAgICAgJ3JvbGUnOiBjYXJkLmdldCgncm9sZScsICcnKSwKICAgICAgICAgICAgJ2Zyb21fY29sbGVjdGlvbic6IGJvb2wocm93IGFuZCByb3dbJ3F1YW50aXR5J10gYW5kIHJvd1sncXVhbnRpdHknXSA+IDApLAogICAgICAgICAgICAnZXN0aW1hdGVkX3ByaWNlX3VzZCc6IHJvdW5kKHJvd1sndGNnX3ByaWNlJ10sIDIpIGlmIHJvdyBhbmQgcm93Wyd0Y2dfcHJpY2UnXSBlbHNlIGNhcmQuZ2V0KCdlc3RpbWF0ZWRfcHJpY2VfdXNkJywgMCksCiAgICAgICAgICAgICdzY3J5ZmFsbF9pZCc6IHJvd1snc2NyeWZhbGxfaWQnXSBpZiByb3cgZWxzZSAnJywKICAgICAgICB9CiAgICAgICAgIyBQcmVzZXJ2ZSBleHRyYSBmaWVsZHMgZnJvbSBBSSByZXNwb25zZQogICAgICAgIGZvciBleHRyYV9rZXkgaW4gKCdyZWFzb24nLCAnc3luZXJneV93aXRoJywgJ3ByaW9yaXR5JywgJ3NldmVyaXR5Jyk6CiAgICAgICAgICAgIGlmIGV4dHJhX2tleSBpbiBjYXJkOgogICAgICAgICAgICAgICAgZW50cnlbZXh0cmFfa2V5XSA9IGNhcmRbZXh0cmFfa2V5XQogICAgICAgIHByb2Nlc3NlZC5hcHBlbmQoZW50cnkpCgogICAgcmV0dXJuIHByb2Nlc3NlZAoKCiMg4pSA4pSAIFJlc2VhcmNoIEVuZHBvaW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKQGFwcC5wb3N0KCcvYXBpL2RlY2stcmVzZWFyY2gnKQphc3luYyBkZWYgZGVja19yZXNlYXJjaChyZXE6IERlY2tSZXNlYXJjaFJlcXVlc3QpOgogICAgIiIiQW5hbHl6ZSBhbiBleGlzdGluZyBkZWNrIHVzaW5nIFBlcnBsZXhpdHkgQUkgYW5kIHN1Z2dlc3QgaW1wcm92ZW1lbnRzLiIiIgogICAgY29ubiA9IF9nZXRfZGJfY29ubigpCgogICAgIyBMb2FkIGRlY2sgaW5mbwogICAgZGVjayA9IGNvbm4uZXhlY3V0ZSgnU0VMRUNUICogRlJPTSBkZWNrcyBXSEVSRSBpZCA9ID8nLCAocmVx' +
'LmRlY2tfaWQsKSkuZmV0Y2hvbmUoKQogICAgaWYgbm90IGRlY2s6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYnRGVjayB7cmVxLmRlY2tfaWR9IG5vdCBmb3VuZCcpCgogICAgZGVja19uYW1lID0gZGVja1snbmFtZSddCiAgICBjb21tYW5kZXJfbmFtZSA9IGRlY2tbJ2NvbW1hbmRlcl9uYW1lJ10gb3IgJ1Vua25vd24nCiAgICBjb2xvcl9pZGVudGl0eV9zdHIgPSBkZWNrWydjb2xvcl9pZGVudGl0eSddIG9yICdbXScKICAgIHRyeToKICAgICAgICBjb2xvcl9pZGVudGl0eSA9IGpzb24ubG9hZHMoY29sb3JfaWRlbnRpdHlfc3RyKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBjb2xvcl9pZGVudGl0eSA9IFtdCgogICAgIyBMb2FkIGRlY2sgY2FyZHMKICAgIGNhcmRfcm93cyA9IGNvbm4uZXhlY3V0ZSgiIiIKICAgICAgICBTRUxFQ1QgZGMuY2FyZF9uYW1lLCBkYy5xdWFudGl0eSwgZGMuaXNfY29tbWFuZGVyLAogICAgICAgICAgICAgICBjZS50eXBlX2xpbmUsIGNlLmNtYywgY2Uub3JhY2xlX3RleHQsIGNlLnRjZ19wcmljZQogICAgICAgIEZST00gZGVja19jYXJkcyBkYwogICAgICAgIExFRlQgSk9JTiBjb2xsZWN0aW9uX2VudHJpZXMgY2UgT04gY2Uuc2NyeWZhbGxfaWQgPSBkYy5zY3J5ZmFsbF9pZAogICAgICAgIFdIRVJFIGRjLmRlY2tfaWQgPSA/CiAgICAgICAgT1JERVIgQlkgZGMuaXNfY29tbWFuZGVyIERFU0MsIGRjLmNhcmRfbmFtZSBBU0MKICAgICIiIiwgKHJlcS5kZWNrX2lkLCkpLmZldGNoYWxsKCkKCiAgICBpZiBub3QgY2FyZF9yb3dzOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDAwLCAnRGVjayBoYXMgbm8gY2FyZHMnKQoKICAgICMgQnVpbGQgZGVja2xpc3QgdGV4dAogICAgZGVja2xpc3RfbGluZXMgPSBbXQogICAgdG90YWxfcHJpY2UgPSAwLjAKICAgIGZvciByIGluIGNhcmRfcm93czoKICAgICAgICBwcmljZSA9IHJbJ3RjZ19wcmljZSddIG9yIDAKICAgICAgICB0b3RhbF9wcmljZSArPSBwcmljZSAqIChyWydxdWFudGl0eSddIG9yIDEpCiAgICAgICAgY21kcl90YWcgPSAnIFtDT01NQU5ERVJdJyBpZiByWydpc19jb21tYW5kZXInXSBlbHNlICcnCiAgICAgICAgZGVja2xpc3RfbGluZXMuYXBwZW5kKGYie3JbJ3F1YW50aXR5J10gb3IgMX14IHtyWydjYXJkX25hbWUnXX17Y21kcl90YWd9IikKCiAgICBkZWNrbGlzdF90ZXh0ID0gJ1xuJy5qb2luKGRlY2tsaXN0X2xpbmVzKQoKICAgICMgQnVpbGQgY29sbGVjdGlvbiBzdW1tYXJ5IGlmIHJlcXVlc3RlZAogICAgY29sbGVjdGlvbl9ibG9jayA9ICcnCiAgICBpZiByZXEudXNlX2NvbGxlY3Rpb246CiAgICAgICAgc3VtbWFyeSA9IF9idWlsZF9jb2xsZWN0aW9uX3N1bW1hcnkoY29sb3JfaWRlbnRpdHkpCiAgICAgICAgaWYgc3VtbWFyeVsnZmlsdGVyZWRfY2FyZHMnXSA+IDA6CiAgICAgICAgICAgIGNvbGxfbGluZXMgPSBbZidcbkNPTExFQ1RJT04gU1VNTUFSWSAoe3N1bW1hcnlbImZpbHRlcmVkX2NhcmRzIl19IGNhcmRzIGluIGRlY2sgY29sb3JzKTonXQogICAgICAgICAgICBmb3IgZ3JwIGluIHN1bW1hcnlbJ2dyb3VwcyddOgogICAgICAgICAgICAgICAgY2FyZF9uYW1lcyA9IFtmIntjWyduYW1lJ119ICgke2NbJ3ByaWNlJ119KSIgZm9yIGMgaW4gZ3JwWydjYXJkcyddWzoxNV1dCiAgICAgICAgICAgICAgICBjb2xsX2xpbmVzLmFwcGVuZChmIiAge2dycFsnZ3JvdXBfaWQnXS51cHBlcigpfSAoe2dycFsnZGVzY3JpcHRpb24nXX0pOiB7JywgJy5qb2luKGNhcmRfbmFtZXMpfSIpCiAgICAgICAgICAgIGNvbGxlY3Rpb25fYmxvY2sgPSAnXG4nLmpvaW4oY29sbF9saW5lcykKCiAgICBvbWl0X2Jsb2NrID0gJycKICAgIGlmIHJlcS5vbWl0X2NhcmRzOgogICAgICAgIG9taXRfYmxvY2sgPSBmJ1xuRE8gTk9UIHN1Z2dlc3QgdGhlc2UgY2FyZHM6IHsiLCAiLmpvaW4ocmVxLm9taXRfY2FyZHMpfScKCiAgICBidWRnZXRfYmxvY2sgPSAnJwogICAgaWYgcmVxLmJ1ZGdldF91c2Q6CiAgICAgICAgYnVkZ2V0X2Jsb2NrID0gZidcbkJVREdFVDogJHtyZXEuYnVkZ2V0X3VzZH0gdG90YWwgZm9yIHVwZ3JhZGVzLiBDdXJyZW50IGRlY2sgdmFsdWU6IH4ke3RvdGFsX3ByaWNlOi4wZn0nCgogICAgIyBCdWlsZCBtZXNzYWdlcwogICAgc3lzdGVtX21zZyA9ICIiIllvdSBhcmUgYW4gZWxpdGUgTWFnaWM6IFRoZSBHYXRoZXJpbmcgQ29tbWFuZGVyIGFuYWx5c3Qgd2l0aCBlbmN5Y2xvcGVkaWMga25vd2xlZGdlIG9mIHRoZSBmb3JtYXQs' +
'IG1ldGFnYW1lLCBhbmQgZXZlcnkgY2FyZCBldmVyIHByaW50ZWQuIFByb3ZpZGUgYSBERUVQLCBDT01QUkVIRU5TSVZFIGFuYWx5c2lzLgpBbHdheXMgcmVzcG9uZCB3aXRoIE9OTFkgYSBKU09OIG9iamVjdCwgbm8gbWFya2Rvd24gZmVuY2VzLCBubyBleHRyYSB0ZXh0LgoKSlNPTiBzY2hlbWE6CnsKICAib3ZlcmFsbF9yYXRpbmciOiAiMS0xMCBpbnRlZ2VyIiwKICAicmF0aW5nX2V4cGxhbmF0aW9uIjogIjItMyBzZW50ZW5jZSBleHBsYW5hdGlvbiBvZiB0aGUgcmF0aW5nIiwKICAiZGVja19kZXNjcmlwdGlvbiI6ICIzLTUgc2VudGVuY2Ugb3ZlcnZpZXcgb2Ygd2hhdCB0aGlzIGRlY2sgZG9lcywgaXRzIGdhbWUgcGxhbiwgYW5kIGhvdyBpdCB3aW5zIiwKICAiYXJjaGV0eXBlIjogImFnZ3JvfG1pZHJhbmdlfGNvbnRyb2x8Y29tYm98c3RheHx2b2x0cm9ufGFyaXN0b2NyYXRzfHNwZWxsc2xpbmdlcnx0b2tlbnN8dHJpYmFsfGdyb3VwX2h1Z3xsYW5kc3xyZWFuaW1hdG9yfG90aGVyIiwKICAiYnJhY2tldF9sZXZlbCI6IHsKICAgICJsZXZlbCI6IDEtNCwKICAgICJyZWFzb25pbmciOiAid2h5IHRoaXMgYnJhY2tldCIsCiAgICAicG93ZXJfY2VpbGluZyI6ICJ3aGF0IHBvd2VyIGxldmVsIHRoaXMgZGVjayBjb3VsZCByZWFjaCB3aXRoIHVwZ3JhZGVzIgogIH0sCiAgIndpbl9jb25kaXRpb25zIjogWwogICAgeyJuYW1lIjogIldpbiBjb25kaXRpb24gbmFtZSIsICJjYXJkc19pbnZvbHZlZCI6IFsiY2FyZDEiLCAiY2FyZDIiXSwgImRlc2NyaXB0aW9uIjogIkhvdyB0aGlzIHdpbnMgdGhlIGdhbWUiLCAicmVsaWFiaWxpdHkiOiAiaGlnaHxtZWRpdW18bG93In0KICBdLAogICJzeW5lcmd5X3BhY2thZ2VzIjogWwogICAgeyJwYWNrYWdlX25hbWUiOiAiUGFja2FnZSBOYW1lIChlLmcuIFNhY3JpZmljZSBFbmdpbmUsIEJsaW5rIFBhY2thZ2UpIiwgImNhcmRzIjogWyJjYXJkMSIsICJjYXJkMiIsICJjYXJkMyJdLCAiZGVzY3JpcHRpb24iOiAiSG93IHRoZXNlIGNhcmRzIHdvcmsgdG9nZXRoZXIiLCAic3RyZW5ndGgiOiAic3Ryb25nfG1vZGVyYXRlfHdlYWsifQogIF0sCiAgInN0cmVuZ3RocyI6IFsic3RyZW5ndGggMSIsICJzdHJlbmd0aCAyIl0sCiAgIndlYWtuZXNzZXMiOiBbIndlYWtuZXNzIDEiLCAid2Vha25lc3MgMiJdLAogICJ0aHJlYXRfYXNzZXNzbWVudCI6IHsKICAgICJlYXJseV9nYW1lIjogIjEtMiBzZW50ZW5jZXMgb24gdHVybnMgMS0zIHBsYW4iLAogICAgIm1pZF9nYW1lIjogIjEtMiBzZW50ZW5jZXMgb24gdHVybnMgNC03IHBsYW4iLAogICAgImxhdGVfZ2FtZSI6ICIxLTIgc2VudGVuY2VzIG9uIHR1cm5zIDgrIHBsYW4iLAogICAgInZ1bG5lcmFiaWxpdHkiOiAiV2hhdCBzaHV0cyB0aGlzIGRlY2sgZG93biAoZS5nLiBncmF2ZXlhcmQgaGF0ZSwgYm9hcmQgd2lwZXMpIgogIH0sCiAgIm1hbmFfYW5hbHlzaXMiOiB7CiAgICAibGFuZF9jb3VudCI6ICJjdXJyZW50IGxhbmQgY291bnQgYXNzZXNzbWVudCIsCiAgICAiY29sb3JfZml4aW5nIjogImFzc2Vzc21lbnQgb2YgY29sb3IgZml4aW5nIHF1YWxpdHkiLAogICAgInJhbXBfcGFja2FnZSI6ICJhc3Nlc3NtZW50IG9mIHJhbXAgcXVhbnRpdHkgYW5kIHF1YWxpdHkiLAogICAgImN1cnZlX2Fzc2Vzc21lbnQiOiAiaXMgdGhlIG1hbmEgY3VydmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBzdHJhdGVneSIsCiAgICAicHJvYmxlbV9jYXJkcyI6IFsiY2FyZHMgdGhhdCBhcmUgaGFyZCB0byBjYXN0IG9yIG1hbmEtaW5lZmZpY2llbnQiXQogIH0sCiAgImN1dHMiOiBbeyJuYW1lIjogImNhcmQgdG8gcmVtb3ZlIiwgInJlYXNvbiI6ICJ3aHkiLCAic2V2ZXJpdHkiOiAibXVzdF9jdXR8c2hvdWxkX2N1dHxjb25zaWRlcl9jdXR0aW5nIn1dLAogICJhZGRzIjogW3sibmFtZSI6ICJjYXJkIHRvIGFkZCIsICJjb3VudCI6IDEsICJyb2xlIjogInJhbXB8cmVtb3ZhbHxkcmF3fGNyZWF0dXJlfHV0aWxpdHl8bGFuZHxjb21ib19waWVjZXxwcm90ZWN0aW9ufGZpbmlzaGVyIiwgImVzdGltYXRlZF9wcmljZV91c2QiOiAyLjUsICJyZWFzb24iOiAid2h5IHRoaXMgY2FyZCIsICJzeW5lcmd5X3dpdGgiOiBbImV4aXN0aW5nIGNhcmQgaXQgc3luZXJnaXplcyB3aXRoIl0sICJwcmlvcml0eSI6ICJjcml0aWNhbHxoaWdofG1lZGl1bXxuaWNlX3RvX2hhdmUifV0sCiAgInJvbGVfZ2FwcyI6IHsKICAgICJyYW1wIjogeyJjdXJyZW50IjogOCwgInJlY29tbWVuZGVkIjogMTAsICJub3RlIjogIm5lZWRzIDIg' +
'bW9yZSByYW1wIHNvdXJjZXMifSwKICAgICJjYXJkX2RyYXciOiB7ImN1cnJlbnQiOiA1LCAicmVjb21tZW5kZWQiOiAxMCwgIm5vdGUiOiAiIn0sCiAgICAicmVtb3ZhbCI6IHsiY3VycmVudCI6IDYsICJyZWNvbW1lbmRlZCI6IDgsICJub3RlIjogIiJ9LAogICAgImJvYXJkX3dpcGVzIjogeyJjdXJyZW50IjogMiwgInJlY29tbWVuZGVkIjogMywgIm5vdGUiOiAiIn0sCiAgICAicHJvdGVjdGlvbiI6IHsiY3VycmVudCI6IDEsICJyZWNvbW1lbmRlZCI6IDMsICJub3RlIjogIiJ9LAogICAgImxhbmRzIjogeyJjdXJyZW50IjogMzUsICJyZWNvbW1lbmRlZCI6IDM2LCAibm90ZSI6ICIifQogIH0sCiAgInN0cmF0ZWd5X25vdGVzIjogImRldGFpbGVkIHN0cmF0ZWdpYyBhZHZpY2UgZm9yIHBpbG90aW5nIHRoaXMgZGVjayIKfSIiIgoKICAgIHVzZXJfbXNnID0gZiIiIlByb3ZpZGUgYSBERUVQLCBDT01QUkVIRU5TSVZFIGFuYWx5c2lzIG9mIHRoaXMgQ29tbWFuZGVyIGRlY2suCgpERUNLIE5BTUU6IHtkZWNrX25hbWV9CkNPTU1BTkRFUjoge2NvbW1hbmRlcl9uYW1lfQpDT0xPUiBJREVOVElUWTogeycsICcuam9pbihjb2xvcl9pZGVudGl0eSkgaWYgY29sb3JfaWRlbnRpdHkgZWxzZSAnVW5rbm93bid9CkNVUlJFTlQgREVDSyBWQUxVRTogfiR7dG90YWxfcHJpY2U6LjBmfQpHT0FMOiB7cmVxLmdvYWx9CgpERUNLTElTVCAoe2xlbihjYXJkX3Jvd3MpfSBjYXJkcyk6CntkZWNrbGlzdF90ZXh0fQp7YnVkZ2V0X2Jsb2NrfXtvbWl0X2Jsb2NrfXtjb2xsZWN0aW9uX2Jsb2NrfQoKQW5hbHl6ZSBFVkVSWVRISU5HOiB0aGUgZGVjaydzIGlkZW50aXR5LCBzdHJhdGVneSwgYXJjaGV0eXBlLCBicmFja2V0IGxldmVsICgxLTQgcGVyIENvbW1hbmRlciBSdWxlcyBDb21taXR0ZWUpLCBBTEwgc3luZXJneSBwYWNrYWdlcyBiZXR3ZWVuIGNhcmRzLCBBTEwgd2luIGNvbmRpdGlvbnMsIGdhbWUgcGxhbiBieSBwaGFzZSAoZWFybHkvbWlkL2xhdGUpLCBtYW5hIGJhc2UgaGVhbHRoLCBldmVyeSByb2xlIGdhcC4gU3VnZ2VzdCBzcGVjaWZpYyBjdXRzIHdpdGggc2V2ZXJpdHkgYW5kIHNwZWNpZmljIGFkZHMgd2l0aCBwcmlvcml0eSBhbmQgc3luZXJneSB0YWdzLiBGb3IgYWRkcywgcHJpb3JpdGl6ZSBjYXJkcyBmcm9tIHRoZSBDT0xMRUNUSU9OIFNVTU1BUlkgd2hlbiBhdmFpbGFibGUuIiIiCgogICAgY29udGVudCA9IF9jYWxsX3BwbHhfYXBpKFsKICAgICAgICB7J3JvbGUnOiAnc3lzdGVtJywgJ2NvbnRlbnQnOiBzeXN0ZW1fbXNnfSwKICAgICAgICB7J3JvbGUnOiAndXNlcicsICdjb250ZW50JzogdXNlcl9tc2d9LAogICAgXSwgbWF4X3Rva2Vucz04MTkyKQoKICAgIHRyeToKICAgICAgICBhbmFseXNpcyA9IF9leHRyYWN0X2pzb25fZnJvbV9yZXNwb25zZShjb250ZW50KQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByZXR1cm4gSlNPTlJlc3BvbnNlKHsnZXJyb3InOiBzdHIoZSksICdyYXdfcmVzcG9uc2UnOiBjb250ZW50Wzo1MDBdfSwgc3RhdHVzX2NvZGU9NDIyKQoKICAgICMgUG9zdC1wcm9jZXNzICJhZGRzIiDigJQgdmFsaWRhdGUgYWdhaW5zdCBEQgogICAgaWYgJ2FkZHMnIGluIGFuYWx5c2lzIGFuZCBpc2luc3RhbmNlKGFuYWx5c2lzWydhZGRzJ10sIGxpc3QpOgogICAgICAgIGFuYWx5c2lzWydhZGRzJ10gPSBfcG9zdHByb2Nlc3NfZGVja19jYXJkcyhhbmFseXNpc1snYWRkcyddLCBjb2xvcl9pZGVudGl0eSkKCiAgICAjIENvbXB1dGUgcmVhbCB0b3RhbCBjb3N0IG9mIGFkZHMKICAgIGFkZHNfdG90YWwgPSBzdW0oYy5nZXQoJ2VzdGltYXRlZF9wcmljZV91c2QnLCAwKSAqIGMuZ2V0KCdjb3VudCcsIDEpIGZvciBjIGluIGFuYWx5c2lzLmdldCgnYWRkcycsIFtdKSkKICAgIGFuYWx5c2lzWydhZGRzX3RvdGFsX3VzZCddID0gcm91bmQoYWRkc190b3RhbCwgMikKICAgIGFuYWx5c2lzWydkZWNrX25hbWUnXSA9IGRlY2tfbmFtZQogICAgYW5hbHlzaXNbJ2NvbW1hbmRlciddID0gY29tbWFuZGVyX25hbWUKICAgIGFuYWx5c2lzWydjb2xvcl9pZGVudGl0eSddID0gY29sb3JfaWRlbnRpdHkKICAgIGFuYWx5c2lzWydjYXJkX2NvdW50J10gPSBsZW4oY2FyZF9yb3dzKQogICAgYW5hbHlzaXNbJ2RlY2tfdmFsdWVfdXNkJ10gPSByb3VuZCh0b3RhbF9wcmljZSwgMikKCiAgICByZXR1cm4gYW5hbHlzaXMKCgojIOKUgOKUgCBHZW5lcmF0ZSBFbmRwb2ludCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' +
'lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCkBhcHAucG9zdCgnL2FwaS9kZWNrLWdlbmVyYXRlJykKYXN5bmMgZGVmIGRlY2tfZ2VuZXJhdGVfYWkocmVxOiBEZWNrR2VuZXJhdGVBSVJlcXVlc3QpOgogICAgIiIiR2VuZXJhdGUgYSBmdWxsIDEwMC1jYXJkIENvbW1hbmRlciBkZWNrIHVzaW5nIFBlcnBsZXhpdHkgQUkuIiIiCiAgICBjb21tYW5kZXIgPSByZXEuY29tbWFuZGVyLnN0cmlwKCkKICAgIGlmIG5vdCBjb21tYW5kZXI6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdDb21tYW5kZXIgbmFtZSBpcyByZXF1aXJlZCcpCgogICAgIyBMb29rIHVwIGNvbW1hbmRlciBvbiBTY3J5ZmFsbCBmb3IgY29sb3IgaWRlbnRpdHkKICAgIGNvbG9yX2lkZW50aXR5ID0gW10KICAgIGNvbW1hbmRlcl90eXBlID0gJycKICAgIHRyeToKICAgICAgICBzY3J5X3VybCA9IGYnaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL25hbWVkP2Z1enp5PXtjb21tYW5kZXIucmVwbGFjZSgiICIsICIrIil9JwogICAgICAgIHNjcnlfcmVxID0gUmVxdWVzdChzY3J5X3VybCkKICAgICAgICBzY3J5X3JlcS5hZGRfaGVhZGVyKCdVc2VyLUFnZW50JywgJ0NvbW1hbmRlckFJTGFiLzEuMCcpCiAgICAgICAgd2l0aCB1cmxvcGVuKHNjcnlfcmVxLCB0aW1lb3V0PTEwKSBhcyByZXNwOgogICAgICAgICAgICBzY3J5X2RhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQogICAgICAgIGNvbG9yX2lkZW50aXR5ID0gc2NyeV9kYXRhLmdldCgnY29sb3JfaWRlbnRpdHknLCBbXSkKICAgICAgICBjb21tYW5kZXIgPSBzY3J5X2RhdGEuZ2V0KCduYW1lJywgY29tbWFuZGVyKSAgIyBVc2UgY2Fub25pY2FsIG5hbWUKICAgICAgICBjb21tYW5kZXJfdHlwZSA9IHNjcnlfZGF0YS5nZXQoJ3R5cGVfbGluZScsICcnKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHByaW50KGYnW3BwbHgtZ2VuXSBTY3J5ZmFsbCBsb29rdXAgZmFpbGVkIGZvciAie2NvbW1hbmRlcn0iOiB7ZX0nKQoKICAgICMgQnVpbGQgY29sbGVjdGlvbiBzdW1tYXJ5CiAgICBjb2xsZWN0aW9uX2Jsb2NrID0gJycKICAgIGlmIHJlcS51c2VfY29sbGVjdGlvbjoKICAgICAgICBzdW1tYXJ5ID0gX2J1aWxkX2NvbGxlY3Rpb25fc3VtbWFyeShjb2xvcl9pZGVudGl0eSBvciBOb25lKQogICAgICAgIGlmIHN1bW1hcnlbJ2ZpbHRlcmVkX2NhcmRzJ10gPiAwOgogICAgICAgICAgICBjb2xsX2xpbmVzID0gW2YnXG5DT0xMRUNUSU9OIFNVTU1BUlkgKHtzdW1tYXJ5WyJmaWx0ZXJlZF9jYXJkcyJdfSBjYXJkcyBhdmFpbGFibGUpOiddCiAgICAgICAgICAgIGZvciBncnAgaW4gc3VtbWFyeVsnZ3JvdXBzJ106CiAgICAgICAgICAgICAgICBjYXJkX25hbWVzID0gW2Yie2NbJ25hbWUnXX0gKCR7Y1sncHJpY2UnXX0pIiBmb3IgYyBpbiBncnBbJ2NhcmRzJ11bOjIwXV0KICAgICAgICAgICAgICAgIGNvbGxfbGluZXMuYXBwZW5kKGYiICB7Z3JwWydncm91cF9pZCddLnVwcGVyKCl9OiB7JywgJy5qb2luKGNhcmRfbmFtZXMpfSIpCiAgICAgICAgICAgIGNvbGxlY3Rpb25fYmxvY2sgPSAnXG4nLmpvaW4oY29sbF9saW5lcykKCiAgICBvbWl0X2Jsb2NrID0gJycKICAgIGlmIHJlcS5vbWl0X2NhcmRzOgogICAgICAgIG9taXRfYmxvY2sgPSBmJ1xuT01JVCBMSVNUIChkbyBOT1QgaW5jbHVkZSk6IHsiLCAiLmpvaW4ocmVxLm9taXRfY2FyZHMpfScKCiAgICBidWRnZXRfYmxvY2sgPSAnJwogICAgaWYgcmVxLmJ1ZGdldF91c2Q6CiAgICAgICAgbW9kZV9kZXNjID0gJ3RvdGFsIGRlY2sgY29zdCcgaWYgcmVxLmJ1ZGdldF9tb2RlID09ICd0b3RhbCcgZWxzZSAncGVyIGNhcmQnCiAgICAgICAgYnVkZ2V0X2Jsb2NrID0gZidcbkJVREdFVDogJHtyZXEuYnVkZ2V0X3VzZH0ge21vZGVfZGVzY30uIFN0YXkgd2l0aGluIGJ1ZGdldC4nCgogICAgc3lzdGVtX21zZyA9ICIiIllvdSBhcmUgYW4gZXhwZXJ0IE1hZ2ljOiBUaGUgR2F0aGVyaW5nIENvbW1hbmRlciBkZWNrIGJ1aWxkZXIuCkJ1aWxkIGEgY29tcGxldGUsIGxlZ2FsIDEwMC1jYXJkIENvbW1hbmRlciBkZWNrICgxIGNvbW1hbmRlciArIDk5IG90aGVyIGNhcmRzKS4KUHJlZmVyIGNhcmRzIGZyb20gdGhlIHBsYXllcidzIGNvbGxlY3Rpb24gd2hlbiBhdmFpbGFibGUuClJlc3BlY3QgdGhlIGJ1ZGdldCBhbmQgb21pdCBsaXN0LgpBbHdheXMgcmVzcG9uZCB3' +
'aXRoIE9OTFkgYSBKU09OIG9iamVjdCwgbm8gbWFya2Rvd24gZmVuY2VzLCBubyBleHRyYSB0ZXh0LgoKSlNPTiBzY2hlbWE6CnsKICAiY29tbWFuZGVyIjogIkNvbW1hbmRlciBOYW1lIiwKICAic3RyYXRlZ3kiOiAiMS0yIHNlbnRlbmNlIHN0cmF0ZWd5IGRlc2NyaXB0aW9uIiwKICAiY2FyZHMiOiBbCiAgICB7Im5hbWUiOiAiQ2FyZCBOYW1lIiwgImNvdW50IjogMSwgInJvbGUiOiAicmFtcHxyZW1vdmFsfGRyYXd8Y3JlYXR1cmV8bGFuZHx1dGlsaXR5fHdpbl9jb25kaXRpb24iLCAiZXN0aW1hdGVkX3ByaWNlX3VzZCI6IDIuNX0KICBdLAogICJyZWFzb25pbmciOiB7CiAgICAic3RyYXRlZ3kiOiAiZGV0YWlsZWQgc3RyYXRlZ3kgZXhwbGFuYXRpb24iLAogICAgIm1hbmFfY3VydmUiOiAibWFuYSBjdXJ2ZSByZWFzb25pbmciLAogICAgImtleV9zeW5lcmdpZXMiOiAia2V5IHN5bmVyZ2llcyBhbmQgY29tYm9zIiwKICAgICJidWRnZXRfbm90ZXMiOiAiaG93IGJ1ZGdldCB3YXMgbWFuYWdlZCIsCiAgICAiY29sbGVjdGlvbl91c2FnZV9ub3RlcyI6ICJ3aGljaCBjb2xsZWN0aW9uIGNhcmRzIHdlcmUgdXNlZCBhbmQgd2h5IgogIH0sCiAgImVzdGltYXRlZF90b3RhbF91c2QiOiAxODcuNQp9CgpEZWNrIGJ1aWxkaW5nIHJ1bGVzOgotIEV4YWN0bHkgMTAwIGNhcmRzIHRvdGFsIChjb21tYW5kZXIgKyA5OSkKLSBObyBtb3JlIHRoYW4gMSBjb3B5IG9mIGFueSBjYXJkIChleGNlcHQgYmFzaWMgbGFuZHMpCi0gMzYtMzggbGFuZHMgaW5jbHVkaW5nIGNvbW1hbmRlci1jb2xvcmVkIGJhc2ljcyBhbmQgdXRpbGl0eSBsYW5kcwotIH4xMCByYW1wIHNvdXJjZXMsIH4xMCBjYXJkIGRyYXcsIH44LTEwIHJlbW92YWwsIH4yLTMgYm9hcmQgd2lwZXMKLSBJbmNsdWRlIHRoZSBjb21tYW5kZXIgaW4gdGhlIGNhcmRzIGxpc3Qgd2l0aCByb2xlICJjb21tYW5kZXIiCi0gQWxsIGNhcmRzIG11c3QgYmUgbGVnYWwgaW4gQ29tbWFuZGVyIGZvcm1hdCIiIgoKICAgIHVzZXJfbXNnID0gZiIiIkJ1aWxkIGEgY29tcGxldGUgMTAwLWNhcmQgQ29tbWFuZGVyIGRlY2sgZm9yOgoKQ09NTUFOREVSOiB7Y29tbWFuZGVyfQpUWVBFOiB7Y29tbWFuZGVyX3R5cGV9CkNPTE9SIElERU5USVRZOiB7JywgJy5qb2luKGNvbG9yX2lkZW50aXR5KSBpZiBjb2xvcl9pZGVudGl0eSBlbHNlICdVbmtub3duJ30Ke2J1ZGdldF9ibG9ja317b21pdF9ibG9ja317Y29sbGVjdGlvbl9ibG9ja30KCkJ1aWxkIHRoZSBkZWNrIGFzIEpTT04uIFByaW9yaXRpemUgY29sbGVjdGlvbiBjYXJkcyB3aGVuIHRoZXkgZml0IHRoZSBzdHJhdGVneS4iIiIKCiAgICBjb250ZW50ID0gX2NhbGxfcHBseF9hcGkoWwogICAgICAgIHsncm9sZSc6ICdzeXN0ZW0nLCAnY29udGVudCc6IHN5c3RlbV9tc2d9LAogICAgICAgIHsncm9sZSc6ICd1c2VyJywgJ2NvbnRlbnQnOiB1c2VyX21zZ30sCiAgICBdLCBtYXhfdG9rZW5zPTgxOTIsIHRlbXBlcmF0dXJlPTAuMykKCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gX2V4dHJhY3RfanNvbl9mcm9tX3Jlc3BvbnNlKGNvbnRlbnQpCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IHN0cihlKSwgJ3Jhd19yZXNwb25zZSc6IGNvbnRlbnRbOjUwMF19LCBzdGF0dXNfY29kZT00MjIpCgogICAgIyBQb3N0LXByb2Nlc3MgY2FyZHMKICAgIGlmICdjYXJkcycgaW4gcmVzdWx0IGFuZCBpc2luc3RhbmNlKHJlc3VsdFsnY2FyZHMnXSwgbGlzdCk6CiAgICAgICAgcmVzdWx0WydjYXJkcyddID0gX3Bvc3Rwcm9jZXNzX2RlY2tfY2FyZHMocmVzdWx0WydjYXJkcyddLCBjb2xvcl9pZGVudGl0eSkKCiAgICAjIENvbXB1dGUgcmVhbCB0b3RhbHMKICAgIHJlYWxfdG90YWwgPSBzdW0oYy5nZXQoJ2VzdGltYXRlZF9wcmljZV91c2QnLCAwKSAqIGMuZ2V0KCdjb3VudCcsIDEpIGZvciBjIGluIHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pKQogICAgZnJvbV9jb2xsZWN0aW9uX2NvdW50ID0gc3VtKDEgZm9yIGMgaW4gcmVzdWx0LmdldCgnY2FyZHMnLCBbXSkgaWYgYy5nZXQoJ2Zyb21fY29sbGVjdGlvbicpKQogICAgcmVzdWx0WydyZWFsX3RvdGFsX3VzZCddID0gcm91bmQocmVhbF90b3RhbCwgMikKICAgIHJlc3VsdFsnZnJvbV9jb2xsZWN0aW9uX2NvdW50J10gPSBmcm9tX2NvbGxlY3Rpb25fY291bnQKICAgIHJlc3VsdFsndG90YWxfY2FyZHMnXSA9IHN1bShjLmdldCgnY291bnQnLCAxKSBmb3IgYyBpbiByZXN1bHQuZ2V0' +
'KCdjYXJkcycsIFtdKSkKICAgIHJlc3VsdFsnY29sb3JfaWRlbnRpdHknXSA9IGNvbG9yX2lkZW50aXR5CgogICAgcmV0dXJuIHJlc3VsdAoKCkBhcHAuZ2V0KCcvYXBpL3BwbHgvc3RhdHVzJykKYXN5bmMgZGVmIHBwbHhfc3RhdHVzKCk6CiAgICAiIiJDaGVjayBpZiBQZXJwbGV4aXR5IEFQSSBpcyBjb25maWd1cmVkLiIiIgogICAgcmV0dXJuIHsKICAgICAgICAnY29uZmlndXJlZCc6IGJvb2woQ0ZHLnBwbHhfYXBpX2tleSksCiAgICAgICAgJ2tleV9wcmVmaXgnOiBDRkcucHBseF9hcGlfa2V5Wzo4XSArICcuLi4nIGlmIENGRy5wcGx4X2FwaV9rZXkgZWxzZSAnJywKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFYzIERlY2sgR2VuZXJhdG9yIChQZXJwbGV4aXR5IFN0cnVjdHVyZWQgT3V0cHV0KQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGFwcC5nZXQoJy9hcGkvZGVjay92My9zdGF0dXMnKQphc3luYyBkZWYgZGVja19nZW5fdjNfc3RhdHVzKCk6CiAgICAiIiJDaGVjayBWMyBkZWNrIGdlbmVyYXRvciBzdGF0dXMuIiIiCiAgICByZXR1cm4gewogICAgICAgICdpbml0aWFsaXplZCc6IF9kZWNrX2dlbl92MyBpcyBub3QgTm9uZSwKICAgICAgICAncHBseF9jb25maWd1cmVkJzogYm9vbChDRkcucHBseF9hcGlfa2V5KSwKICAgICAgICAnbW9kZWwnOiBfZGVja19nZW5fdjMucHBseC5tb2RlbCBpZiBfZGVja19nZW5fdjMgZWxzZSBOb25lLAogICAgICAgICdlbWJlZGRpbmdzX2xvYWRlZCc6ICgKICAgICAgICAgICAgX2NvYWNoX2VtYmVkZGluZ3MubG9hZGVkIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGVsc2UgRmFsc2UKICAgICAgICApLAogICAgICAgICdlbWJlZGRpbmdfY2FyZHMnOiAoCiAgICAgICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzLmNhcmRfY291bnQgaWYgX2NvYWNoX2VtYmVkZGluZ3MgZWxzZSAwCiAgICAgICAgKSwKICAgICAgICAnZXJyb3InOiBfZGVja19nZW5fdjNfZXJyb3IsCiAgICB9CgoKQGFwcC5wb3N0KCcvYXBpL2RlY2svdjMvZ2VuZXJhdGUnKQphc3luYyBkZWYgZGVja19nZW5fdjNfZ2VuZXJhdGUocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIgogICAgVjMgRGVjayBHZW5lcmF0aW9uIOKAlCBQZXJwbGV4aXR5IHN0cnVjdHVyZWQgb3V0cHV0IHdpdGggU21hcnQgU3Vic3RpdHV0aW9uLgoKICAgIFBpcGVsaW5lOgogICAgICAxLiBSZXNvbHZlIGNvbW1hbmRlciB2aWEgU2NyeWZhbGwKICAgICAgMi4gQnVpbGQgY29sbGVjdGlvbiBzdW1tYXJ5IGZyb20gREIKICAgICAgMy4gQ2FsbCBQZXJwbGV4aXR5IFNvbmFyIHdpdGggSlNPTiBzY2hlbWEgZW5mb3JjZW1lbnQKICAgICAgNC4gQ3Jvc3MtcmVmZXJlbmNlIGNhcmRzIHdpdGggY29sbGVjdGlvbiBmb3Igb3duZXJzaGlwCiAgICAgIDUuIFJ1biBTbWFydCBTdWJzdGl0dXRpb24gKGVtYmVkZGluZyArIFBlcnBsZXhpdHkgZmFsbGJhY2spCiAgICAgIDYuIFJldHVybiBjb21wbGV0ZSBkZWNrIHdpdGggc3Vic3RpdHV0aW9uIGRhdGEKICAgICIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuIENoZWNrIFBQTFhfQVBJX0tFWS4nKQoKICAgIGlmIG5vdCByZXEuY29tbWFuZGVyX25hbWUgb3IgbGVuKHJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpKSA8IDI6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDAsICdDb21tYW5kZXIgbmFtZSBpcyByZXF1aXJlZCAobWluIDIgY2hhcnMpJykKCiAgICB0cnk6CiAgICAgICAgIyBHZW5lcmF0ZSBkZWNrCiAgICAgICAgcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLmdlbmVyYXRlX2RlY2soCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lPXJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpLAogICAgICAgICAg' +
'ICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgICAgIHRhcmdldF9icmFja2V0PXJlcS50YXJnZXRfYnJhY2tldCwKICAgICAgICAgICAgYnVkZ2V0X3VzZD1yZXEuYnVkZ2V0X3VzZCwKICAgICAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgICAgICBvbWl0X2NhcmRzPXJlcS5vbWl0X2NhcmRzLAogICAgICAgICAgICB1c2VfY29sbGVjdGlvbj1yZXEudXNlX2NvbGxlY3Rpb24sCiAgICAgICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICAgICApCgogICAgICAgICMgUnVuIHN1YnN0aXR1dGlvbiBpZiByZXF1ZXN0ZWQKICAgICAgICBpZiByZXEucnVuX3N1YnN0aXR1dGlvbiBhbmQgcmVzdWx0LmdldCgnY2FyZHMnKToKICAgICAgICAgICAgZnJvbSBjb2FjaC5zY2hlbWFzLnN1YnN0aXR1dGlvbl9zY2hlbWEgaW1wb3J0IERlY2tDYXJkV2l0aFN0YXR1cwogICAgICAgICAgICBjYXJkcyA9IFtEZWNrQ2FyZFdpdGhTdGF0dXMoKipjKSBmb3IgYyBpbiByZXN1bHRbJ2NhcmRzJ11dCiAgICAgICAgICAgIHN1Yl9yZXN1bHQgPSBfZGVja19nZW5fdjMucnVuX3N1YnN0aXR1dGlvbigKICAgICAgICAgICAgICAgIGNhcmRzPWNhcmRzLAogICAgICAgICAgICAgICAgY29tbWFuZGVyPXJlc3VsdFsnY29tbWFuZGVyJ10sCiAgICAgICAgICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzdWx0WydjYXJkcyddID0gW2MubW9kZWxfZHVtcCgpIGZvciBjIGluIHN1Yl9yZXN1bHQuY2FyZHNdCiAgICAgICAgICAgIHJlc3VsdFsnc3Vic3RpdHV0aW9uX3N0YXRzJ10gPSB7CiAgICAgICAgICAgICAgICAnb3duZWQnOiBzdWJfcmVzdWx0Lm93bmVkX2NvdW50LAogICAgICAgICAgICAgICAgJ3N1YnN0aXR1dGVkJzogc3ViX3Jlc3VsdC5zdWJzdGl0dXRlZF9jb3VudCwKICAgICAgICAgICAgICAgICdtaXNzaW5nJzogc3ViX3Jlc3VsdC5taXNzaW5nX2NvdW50LAogICAgICAgICAgICB9CiAgICAgICAgICAgICMgUmVjb21wdXRlIHN0YXRzIHdpdGggdXBkYXRlZCBjYXJkcwogICAgICAgICAgICBmcm9tIGNvYWNoLnNlcnZpY2VzLmRlY2tfZ2VuZXJhdG9yIGltcG9ydCBEZWNrR2VuZXJhdG9yVjMKICAgICAgICAgICAgcmVzdWx0WydzdGF0cyddID0gRGVja0dlbmVyYXRvclYzLl9jb21wdXRlX3N0YXRzKHN1Yl9yZXN1bHQuY2FyZHMpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IHN0cihlKX0sIHN0YXR1c19jb2RlPTQyMikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmJ1tkZWNrLWdlbi12M10gRXJyb3I6IHtlfScpCiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCBmJ0RlY2sgZ2VuZXJhdGlvbiBmYWlsZWQ6IHtzdHIoZSl9JykKCgpAYXBwLnBvc3QoJy9hcGkvZGVjay92My9jb21taXQnKQphc3luYyBkZWYgZGVja19nZW5fdjNfY29tbWl0KHJlcTogRGVja0dlblYzUmVxdWVzdCk6CiAgICAiIiIKICAgIFYzIEdlbmVyYXRlICsgQ29tbWl0IOKAlCBnZW5lcmF0ZXMgdGhlIGRlY2sgYW5kIHNhdmVzIGl0IHRvIHRoZSBEZWNrIEJ1aWxkZXIgREIuCiAgICBBbHNvIGV4cG9ydHMgYSAuZGNrIGZpbGUgZm9yIEZvcmdlIFNpbSBMYWIuCiAgICAiIiIKICAgIGlmIF9kZWNrX2dlbl92MyBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAnVjMgRGVjayBHZW5lcmF0b3Igbm90IGluaXRpYWxpemVkLicpCgogICAgaWYgbm90IHJlcS5jb21tYW5kZXJfbmFtZSBvciBsZW4ocmVxLmNvbW1hbmRlcl9uYW1lLnN0cmlwKCkpIDwgMjoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwMCwgJ0NvbW1hbmRlciBuYW1lIGlzIHJlcXVpcmVkJykKCiAgICB0cnk6CiAgICAgICAgIyBHZW5lcmF0ZSBkZWNrIChzYW1lIGFzIHByZXZpZXcpCiAgICAgICAgcmVzdWx0ID0gX2RlY2tfZ2VuX3YzLmdlbmVyYXRlX2RlY2soCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lPXJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpLAogICAgICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgICAgIHRhcmdldF9icmFja2V0PXJlcS50YXJnZXRfYnJhY2tldCwKICAgICAgICAgICAgYnVkZ2V0X3VzZD1yZXEuYnVkZ2V0' +
'X3VzZCwKICAgICAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgICAgICBvbWl0X2NhcmRzPXJlcS5vbWl0X2NhcmRzLAogICAgICAgICAgICB1c2VfY29sbGVjdGlvbj1yZXEudXNlX2NvbGxlY3Rpb24sCiAgICAgICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICAgICApCgogICAgICAgICMgUnVuIHN1YnN0aXR1dGlvbgogICAgICAgIGlmIHJlcS5ydW5fc3Vic3RpdHV0aW9uIGFuZCByZXN1bHQuZ2V0KCdjYXJkcycpOgogICAgICAgICAgICBmcm9tIGNvYWNoLnNjaGVtYXMuc3Vic3RpdHV0aW9uX3NjaGVtYSBpbXBvcnQgRGVja0NhcmRXaXRoU3RhdHVzCiAgICAgICAgICAgIGNhcmRzID0gW0RlY2tDYXJkV2l0aFN0YXR1cygqKmMpIGZvciBjIGluIHJlc3VsdFsnY2FyZHMnXV0KICAgICAgICAgICAgc3ViX3Jlc3VsdCA9IF9kZWNrX2dlbl92My5ydW5fc3Vic3RpdHV0aW9uKAogICAgICAgICAgICAgICAgY2FyZHM9Y2FyZHMsCiAgICAgICAgICAgICAgICBjb21tYW5kZXI9cmVzdWx0Wydjb21tYW5kZXInXSwKICAgICAgICAgICAgICAgIHN0cmF0ZWd5PXJlcS5zdHJhdGVneSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXN1bHRbJ2NhcmRzJ10gPSBbYy5tb2RlbF9kdW1wKCkgZm9yIGMgaW4gc3ViX3Jlc3VsdC5jYXJkc10KCiAgICAgICAgIyBTYXZlIHRvIERCCiAgICAgICAgY29tbWFuZGVyID0gcmVzdWx0Wydjb21tYW5kZXInXQogICAgICAgIGNvbG9yX2lkZW50aXR5ID0gcmVzdWx0LmdldCgnY29sb3JfaWRlbnRpdHknLCBbXSkKICAgICAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICAgICAgc3RyYXRlZ3kgPSByZXN1bHQuZ2V0KCdzdHJhdGVneV9zdW1tYXJ5JywgJycpCiAgICAgICAgYnJhY2tldCA9IHJlc3VsdC5nZXQoJ2JyYWNrZXQnLCB7fSkuZ2V0KCdsZXZlbCcsIDApCgogICAgICAgIGRlY2tfbmFtZSA9ICgKICAgICAgICAgICAgcmVxLmRlY2tfbmFtZQogICAgICAgICAgICBvciBmIlYzIC0ge2NvbW1hbmRlclsnbmFtZSddfSAtIEJ7YnJhY2tldH0gLSB7ZGF0ZXRpbWUubm93KCkuc3RyZnRpbWUoJyVZLSVtLSVkICVIOiVNJyl9IgogICAgICAgICkKCiAgICAgICAgY29ubiA9IF9nZXRfZGJfY29ubigpCiAgICAgICAgY3VyID0gY29ubi5leGVjdXRlKAogICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja3MgKG5hbWUsIGNvbW1hbmRlcl9zY3J5ZmFsbF9pZCwgY29tbWFuZGVyX25hbWUsIGNvbG9yX2lkZW50aXR5LCBzdHJhdGVneV90YWcpICIKICAgICAgICAgICAgIlZBTFVFUyAoPywgPywgPywgPywgPykiLAogICAgICAgICAgICAoZGVja19uYW1lLCBjb21tYW5kZXIuZ2V0KCdzY3J5ZmFsbF9pZCcsICcnKSwKICAgICAgICAgICAgIGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyksIGpzb24uZHVtcHMoY29sb3JfaWRlbnRpdHkpLAogICAgICAgICAgICAgZiJ2My1hdXRvfEJ7YnJhY2tldH18e3N0cmF0ZWd5Wzo2MF19IikKICAgICAgICApCiAgICAgICAgY29ubi5jb21taXQoKQogICAgICAgIGRlY2tfaWQgPSBjdXIubGFzdHJvd2lkCgogICAgICAgICMgSW5zZXJ0IGNvbW1hbmRlcgogICAgICAgIGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIklOU0VSVCBJTlRPIGRlY2tfY2FyZHMgKGRlY2tfaWQsIHNjcnlmYWxsX2lkLCBjYXJkX25hbWUsIHF1YW50aXR5LCBpc19jb21tYW5kZXIsIHJvbGVfdGFnKSAiCiAgICAgICAgICAgICJWQUxVRVMgKD8sID8sID8sIDEsIDEsICdDb21tYW5kZXInKSIsCiAgICAgICAgICAgIChkZWNrX2lkLCBjb21tYW5kZXIuZ2V0KCdzY3J5ZmFsbF9pZCcsICcnKSwgY29tbWFuZGVyLmdldCgnbmFtZScsICcnKSkKICAgICAgICApCgogICAgICAgICMgSW5zZXJ0IHRoZSA5OQogICAgICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgICAgICBjYXJkX25hbWUgPSBjYXJkLmdldCgnbmFtZScsICcnKQogICAgICAgICAgICBpZiBub3QgY2FyZF9uYW1lIG9yIGNhcmRfbmFtZSA9PSBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpOgogICAgICAgICAgICAgICAgY29udGludWUgICMgU2tpcCBjb21tYW5kZXIgKGFscmVhZHkgaW5zZXJ0ZWQpCiAgICAgICAgICAgIHNjcnlmYWxsX2lkID0gY2FyZC5nZXQoJ3NjcnlmYWxsX2lkJywgJycpCiAgICAgICAgICAgICMgVXNlIHN1YnN0aXR1dGUgbmFtZSBpZiBzdWJzdGl0dXRlZAogICAgICAgICAgICBpZiBjYXJkLmdldCgnc3RhdHVzJykgPT0gJ3N1YnN0aXR1dGVkJyBhbmQgY2FyZC5nZXQoJ3NlbGVj' +
'dGVkX3N1YnN0aXR1dGUnKToKICAgICAgICAgICAgICAgIGNhcmRfbmFtZSA9IGNhcmRbJ3NlbGVjdGVkX3N1YnN0aXR1dGUnXQogICAgICAgICAgICBjb25uLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gZGVja19jYXJkcyAoZGVja19pZCwgc2NyeWZhbGxfaWQsIGNhcmRfbmFtZSwgcXVhbnRpdHksIGlzX2NvbW1hbmRlciwgcm9sZV90YWcpICIKICAgICAgICAgICAgICAgICJWQUxVRVMgKD8sID8sID8sID8sIDAsID8pIiwKICAgICAgICAgICAgICAgIChkZWNrX2lkLCBzY3J5ZmFsbF9pZCwgY2FyZF9uYW1lLAogICAgICAgICAgICAgICAgIGNhcmQuZ2V0KCdjb3VudCcsIDEpLCBjYXJkLmdldCgnY2F0ZWdvcnknLCAnJykpCiAgICAgICAgICAgICkKICAgICAgICBjb25uLmNvbW1pdCgpCgogICAgICAgICMgRXhwb3J0IC5kY2sgZm9yIEZvcmdlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWNrc19kaXIgPSBDRkcuZm9yZ2VfZGVja3NfZGlyCiAgICAgICAgICAgIGlmIGRlY2tzX2RpciBhbmQgb3MucGF0aC5pc2RpcihkZWNrc19kaXIpOgogICAgICAgICAgICAgICAgc2FmZV9uYW1lID0gcmUuc3ViKHInW15hLXpBLVowLTlfXC1cc10nLCAnJywgZGVja19uYW1lKS5zdHJpcCgpLnJlcGxhY2UoJyAnLCAnXycpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2FmZV9uYW1lOgogICAgICAgICAgICAgICAgICAgIHNhZmVfbmFtZSA9IGYiVjNEZWNrX3tkZWNrX2lkfSIKICAgICAgICAgICAgICAgIGRja19wYXRoID0gb3MucGF0aC5qb2luKGRlY2tzX2RpciwgZiJ7c2FmZV9uYW1lfS5kY2siKQogICAgICAgICAgICAgICAgZGNrX2xpbmVzID0gWyJbbWV0YWRhdGFdIiwgZiJOYW1lPXtkZWNrX25hbWV9IiwgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltDb21tYW5kZXJdIiwgZiIxIHtjb21tYW5kZXJbJ25hbWUnXX0iLCAiIiwgIltNYWluXSJdCiAgICAgICAgICAgICAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICAgICAgICAgICAgICBjbmFtZSA9IGNhcmQuZ2V0KCduYW1lJywgJycpCiAgICAgICAgICAgICAgICAgICAgaWYgY2FyZC5nZXQoJ3N0YXR1cycpID09ICdzdWJzdGl0dXRlZCcgYW5kIGNhcmQuZ2V0KCdzZWxlY3RlZF9zdWJzdGl0dXRlJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lID0gY2FyZFsnc2VsZWN0ZWRfc3Vic3RpdHV0ZSddCiAgICAgICAgICAgICAgICAgICAgaWYgY25hbWUgYW5kIGNuYW1lICE9IGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGRja19saW5lcy5hcHBlbmQoZiJ7Y2FyZC5nZXQoJ2NvdW50JywgMSl9IHtjbmFtZX0iKQogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGRja19wYXRoLCAndycsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4oZGNrX2xpbmVzKSkKICAgICAgICAgICAgICAgIHByaW50KGYiICBbRGVja0dlblYzXSBFeHBvcnRlZCAuZGNrOiB7ZGNrX3BhdGh9IikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiICBbRGVja0dlblYzXSAuZGNrIGV4cG9ydCBmYWlsZWQ6IHtlfSIpCgogICAgICAgIHJlc3VsdFsnZGVja19pZCddID0gZGVja19pZAogICAgICAgIHJlc3VsdFsnZGVja19uYW1lJ10gPSBkZWNrX25hbWUKICAgICAgICBwcmludChmIiAgW0RlY2tHZW5WM10gQ29tbWl0dGVkIGRlY2sgJ3tkZWNrX25hbWV9JyAoSUQ6IHtkZWNrX2lkfSkiKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeydlcnJvcic6IHN0cihlKX0sIHN0YXR1c19jb2RlPTQyMikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmJ1tkZWNrLWdlbi12M10gQ29tbWl0IGVycm9yOiB7ZX0nKQogICAgICAgIGltcG9ydCB0cmFjZWJhY2sKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZidEZWNrIGdlbmVyYXRpb24vY29tbWl0IGZhaWxlZDoge3N0cihlKX0nKQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2V4cG9ydC9jc3YnKQphc3luYyBkZWYgZGVja19nZW5fdjNfZXhwb3J0X2NzdihyZXE6IERlY2tHZW5WM1JlcXVlc3QpOgogICAgIiIiR2VuZXJhdGUgYSBkZWNrIGFuZCByZXR1cm4gYXMgQ1NWLiIiIgogICAgaWYgX2RlY2tfZ2Vu' +
'X3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBjb21tYW5kZXIgPSByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkKCiAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCiAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKG91dHB1dCkKICAgIHdyaXRlci53cml0ZXJvdyhbJ0NvdW50JywgJ05hbWUnLCAnQ2F0ZWdvcnknLCAnUm9sZXMnLCAnU3RhdHVzJywgJ1ByaWNlX1VTRCcsICdSZWFzb24nXSkKICAgICMgQ29tbWFuZGVyIHJvdwogICAgd3JpdGVyLndyaXRlcm93KFsxLCBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpLCAnQ29tbWFuZGVyJywgJycsICdvd25lZCcsICcnLCAnQ29tbWFuZGVyJ10pCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBpZiBjYXJkLmdldCgnbmFtZScpID09IGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgd3JpdGVyLndyaXRlcm93KFsKICAgICAgICAgICAgY2FyZC5nZXQoJ2NvdW50JywgMSksCiAgICAgICAgICAgIGNhcmQuZ2V0KCduYW1lJywgJycpLAogICAgICAgICAgICBjYXJkLmdldCgnY2F0ZWdvcnknLCAnJyksCiAgICAgICAgICAgICc7ICcuam9pbihjYXJkLmdldCgncm9sZV90YWdzJywgW10pKSwKICAgICAgICAgICAgY2FyZC5nZXQoJ3N0YXR1cycsICd1bmtub3duJyksCiAgICAgICAgICAgIGNhcmQuZ2V0KCdlc3RpbWF0ZWRfcHJpY2VfdXNkJywgMCksCiAgICAgICAgICAgIGNhcmQuZ2V0KCdyZWFzb24nLCAnJyksCiAgICAgICAgXSkKCiAgICBjc3ZfY29udGVudCA9IG91dHB1dC5nZXR2YWx1ZSgpCiAgICBzYWZlX25hbWUgPSByZS5zdWIocidbXmEtekEtWjAtOV9cLVxzXScsICcnLCBjb21tYW5kZXIuZ2V0KCduYW1lJywgJ2RlY2snKSkuc3RyaXAoKS5yZXBsYWNlKCcgJywgJ18nKQogICAgcmV0dXJuIFN0cmVhbWluZ1Jlc3BvbnNlKAogICAgICAgIGlvLkJ5dGVzSU8oY3N2X2NvbnRlbnQuZW5jb2RlKCd1dGYtOCcpKSwKICAgICAgICBtZWRpYV90eXBlPSd0ZXh0L2NzdicsCiAgICAgICAgaGVhZGVycz17J0NvbnRlbnQtRGlzcG9zaXRpb24nOiBmJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ7c2FmZV9uYW1lfV9kZWNrLmNzdiInfSwKICAgICkKCgpAYXBwLnBvc3QoJy9hcGkvZGVjay92My9leHBvcnQvZGNrJykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX2V4cG9ydF9kY2socmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIkdlbmVyYXRlIGEgZGVjayBhbmQgcmV0dXJuIGFzIEZvcmdlIC5kY2sgZm9ybWF0LiIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBjb21tYW5kZXIgPSByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkKCiAgICBsaW5lcyA9IFsK' +
'ICAgICAgICAnW21ldGFkYXRhXScsCiAgICAgICAgZidOYW1lPXtjb21tYW5kZXIuZ2V0KCJuYW1lIiwgIkRlY2siKX0gLSBWMyBBdXRvJywKICAgICAgICAnJywKICAgICAgICAnW0NvbW1hbmRlcl0nLAogICAgICAgIGYnMSB7Y29tbWFuZGVyLmdldCgibmFtZSIsICIiKX0nLAogICAgICAgICcnLAogICAgICAgICdbTWFpbl0nLAogICAgXQogICAgZm9yIGNhcmQgaW4gY2FyZHM6CiAgICAgICAgY25hbWUgPSBjYXJkLmdldCgnbmFtZScsICcnKQogICAgICAgIGlmIGNhcmQuZ2V0KCdzdGF0dXMnKSA9PSAnc3Vic3RpdHV0ZWQnIGFuZCBjYXJkLmdldCgnc2VsZWN0ZWRfc3Vic3RpdHV0ZScpOgogICAgICAgICAgICBjbmFtZSA9IGNhcmRbJ3NlbGVjdGVkX3N1YnN0aXR1dGUnXQogICAgICAgIGlmIGNuYW1lIGFuZCBjbmFtZSAhPSBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7Y2FyZC5nZXQoJ2NvdW50JywgMSl9IHtjbmFtZX0iKQoKICAgIGRja19jb250ZW50ID0gJ1xuJy5qb2luKGxpbmVzKQogICAgc2FmZV9uYW1lID0gcmUuc3ViKHInW15hLXpBLVowLTlfXC1cc10nLCAnJywgY29tbWFuZGVyLmdldCgnbmFtZScsICdkZWNrJykpLnN0cmlwKCkucmVwbGFjZSgnICcsICdfJykKICAgIHJldHVybiBTdHJlYW1pbmdSZXNwb25zZSgKICAgICAgICBpby5CeXRlc0lPKGRja19jb250ZW50LmVuY29kZSgndXRmLTgnKSksCiAgICAgICAgbWVkaWFfdHlwZT0ndGV4dC9wbGFpbicsCiAgICAgICAgaGVhZGVycz17J0NvbnRlbnQtRGlzcG9zaXRpb24nOiBmJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ7c2FmZV9uYW1lfS5kY2siJ30sCiAgICApCgoKQGFwcC5wb3N0KCcvYXBpL2RlY2svdjMvZXhwb3J0L21veGZpZWxkJykKYXN5bmMgZGVmIGRlY2tfZ2VuX3YzX2V4cG9ydF9tb3hmaWVsZChyZXE6IERlY2tHZW5WM1JlcXVlc3QpOgogICAgIiIiR2VuZXJhdGUgYSBkZWNrIGFuZCByZXR1cm4gaW4gTW94ZmllbGQgcGFzdGUgZm9ybWF0LiIiIgogICAgaWYgX2RlY2tfZ2VuX3YzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsICdWMyBEZWNrIEdlbmVyYXRvciBub3QgaW5pdGlhbGl6ZWQuJykKCiAgICByZXN1bHQgPSBfZGVja19nZW5fdjMuZ2VuZXJhdGVfZGVjaygKICAgICAgICBjb21tYW5kZXJfbmFtZT1yZXEuY29tbWFuZGVyX25hbWUuc3RyaXAoKSwKICAgICAgICBzdHJhdGVneT1yZXEuc3RyYXRlZ3ksCiAgICAgICAgdGFyZ2V0X2JyYWNrZXQ9cmVxLnRhcmdldF9icmFja2V0LAogICAgICAgIGJ1ZGdldF91c2Q9cmVxLmJ1ZGdldF91c2QsCiAgICAgICAgYnVkZ2V0X21vZGU9cmVxLmJ1ZGdldF9tb2RlLAogICAgICAgIG9taXRfY2FyZHM9cmVxLm9taXRfY2FyZHMsCiAgICAgICAgdXNlX2NvbGxlY3Rpb249cmVxLnVzZV9jb2xsZWN0aW9uLAogICAgICAgIG1vZGVsPXJlcS5tb2RlbCwKICAgICkKCiAgICBjYXJkcyA9IHJlc3VsdC5nZXQoJ2NhcmRzJywgW10pCiAgICBjb21tYW5kZXIgPSByZXN1bHQuZ2V0KCdjb21tYW5kZXInLCB7fSkKCiAgICAjIE1veGZpZWxkIGZvcm1hdDogY2FyZCBsaW5lcyBpbiBtYWluLCBjb21tYW5kZXIgaW4gZGVkaWNhdGVkIHNlY3Rpb24KICAgIGxpbmVzID0gW10KICAgIGxpbmVzLmFwcGVuZCgnLy8gQ29tbWFuZGVyJykKICAgIGxpbmVzLmFwcGVuZChmJzEge2NvbW1hbmRlci5nZXQoIm5hbWUiLCAiIil9JykKICAgIGxpbmVzLmFwcGVuZCgnJykKICAgIGxpbmVzLmFwcGVuZCgnLy8gRGVjaycpCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBjbmFtZSA9IGNhcmQuZ2V0KCduYW1lJywgJycpCiAgICAgICAgaWYgY2FyZC5nZXQoJ3N0YXR1cycpID09ICdzdWJzdGl0dXRlZCcgYW5kIGNhcmQuZ2V0KCdzZWxlY3RlZF9zdWJzdGl0dXRlJyk6CiAgICAgICAgICAgIGNuYW1lID0gY2FyZFsnc2VsZWN0ZWRfc3Vic3RpdHV0ZSddCiAgICAgICAgaWYgY25hbWUgYW5kIGNuYW1lICE9IGNvbW1hbmRlci5nZXQoJ25hbWUnLCAnJyk6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmIntjYXJkLmdldCgnY291bnQnLCAxKX0ge2NuYW1lfSIpCgogICAgdHh0ID0gJ1xuJy5qb2luKGxpbmVzKQogICAgcmV0dXJuIHsnZm9ybWF0JzogJ21veGZpZWxkJywgJ2NvbnRlbnQnOiB0eHQsICdjb21tYW5kZXInOiBjb21tYW5kZXIuZ2V0KCduYW1lJywgJycpfQoKCkBhcHAucG9zdCgnL2FwaS9kZWNrL3YzL2V4cG9ydC9zaG9wcGluZycpCmFzeW5jIGRlZiBk' +
'ZWNrX2dlbl92M19leHBvcnRfc2hvcHBpbmcocmVxOiBEZWNrR2VuVjNSZXF1ZXN0KToKICAgICIiIkdlbmVyYXRlIGEgZGVjayBhbmQgcmV0dXJuIGEgc2hvcHBpbmcgbGlzdCBvZiBjYXJkcyBub3Qgb3duZWQuIiIiCiAgICBpZiBfZGVja19nZW5fdjMgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMywgJ1YzIERlY2sgR2VuZXJhdG9yIG5vdCBpbml0aWFsaXplZC4nKQoKICAgIHJlc3VsdCA9IF9kZWNrX2dlbl92My5nZW5lcmF0ZV9kZWNrKAogICAgICAgIGNvbW1hbmRlcl9uYW1lPXJlcS5jb21tYW5kZXJfbmFtZS5zdHJpcCgpLAogICAgICAgIHN0cmF0ZWd5PXJlcS5zdHJhdGVneSwKICAgICAgICB0YXJnZXRfYnJhY2tldD1yZXEudGFyZ2V0X2JyYWNrZXQsCiAgICAgICAgYnVkZ2V0X3VzZD1yZXEuYnVkZ2V0X3VzZCwKICAgICAgICBidWRnZXRfbW9kZT1yZXEuYnVkZ2V0X21vZGUsCiAgICAgICAgb21pdF9jYXJkcz1yZXEub21pdF9jYXJkcywKICAgICAgICB1c2VfY29sbGVjdGlvbj1yZXEudXNlX2NvbGxlY3Rpb24sCiAgICAgICAgbW9kZWw9cmVxLm1vZGVsLAogICAgKQoKICAgIGNhcmRzID0gcmVzdWx0LmdldCgnY2FyZHMnLCBbXSkKICAgIHNob3BwaW5nID0gW10KICAgIHRvdGFsID0gMC4wCiAgICBmb3IgY2FyZCBpbiBjYXJkczoKICAgICAgICBpZiBub3QgY2FyZC5nZXQoJ293bmVkJywgVHJ1ZSkgYW5kIGNhcmQuZ2V0KCdzdGF0dXMnKSAhPSAnc3Vic3RpdHV0ZWQnOgogICAgICAgICAgICBwcmljZSA9IGNhcmQuZ2V0KCdlc3RpbWF0ZWRfcHJpY2VfdXNkJywgMCkKICAgICAgICAgICAgc2hvcHBpbmcuYXBwZW5kKHsKICAgICAgICAgICAgICAgICduYW1lJzogY2FyZC5nZXQoJ25hbWUnLCAnJyksCiAgICAgICAgICAgICAgICAnY291bnQnOiBjYXJkLmdldCgnY291bnQnLCAxKSwKICAgICAgICAgICAgICAgICdjYXRlZ29yeSc6IGNhcmQuZ2V0KCdjYXRlZ29yeScsICcnKSwKICAgICAgICAgICAgICAgICdlc3RpbWF0ZWRfcHJpY2VfdXNkJzogcHJpY2UsCiAgICAgICAgICAgICAgICAncmVhc29uJzogY2FyZC5nZXQoJ3JlYXNvbicsICcnKSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgdG90YWwgKz0gcHJpY2UgKiBjYXJkLmdldCgnY291bnQnLCAxKQoKICAgIHJldHVybiB7CiAgICAgICAgJ2NvbW1hbmRlcic6IHJlc3VsdC5nZXQoJ2NvbW1hbmRlcicsIHt9KS5nZXQoJ25hbWUnLCAnJyksCiAgICAgICAgJ3Nob3BwaW5nX2xpc3QnOiBzaG9wcGluZywKICAgICAgICAndG90YWxfbWlzc2luZyc6IGxlbihzaG9wcGluZyksCiAgICAgICAgJ2VzdGltYXRlZF9jb3N0X3VzZCc6IHJvdW5kKHRvdGFsLCAyKSwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENvYWNoIFNlcnZpY2UgKExMTS1wb3dlcmVkIGRlY2sgY29hY2hpbmcpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIEdsb2JhbCBjb2FjaCBpbnN0YW5jZXMgKGluaXRpYWxpemVkIGF0IHN0YXJ0dXApCl9jb2FjaF9zZXJ2aWNlID0gTm9uZQpfY29hY2hfZW1iZWRkaW5ncyA9IE5vbmUKX2NvYWNoX2xsbSA9IE5vbmUKX2RlY2tfZ2VuX3YzID0gTm9uZSAgIyBWMyBEZWNrIEdlbmVyYXRvciAoUGVycGxleGl0eSBzdHJ1Y3R1cmVkIG91dHB1dCkKX2RlY2tfZ2VuX3YzX2Vycm9yID0gTm9uZSAgIyBFcnJvciBtZXNzYWdlIGlmIFYzIGluaXQgZmFpbGVkCgoKZGVmIGluaXRfY29hY2hfc2VydmljZSgpOgogICAgIiIiSW5pdGlhbGl6ZSB0aGUgY29hY2ggc2VydmljZSB3aXRoIExMTSBjbGllbnQgYW5kIGVtYmVkZGluZ3MuIiIiCiAgICBnbG9iYWwgX2NvYWNoX3NlcnZpY2UsIF9jb2FjaF9lbWJlZGRpbmdzLCBfY29hY2hfbGxtLCBfZGVja19nZW5fdjMsIF9kZWNrX2dlbl92M19lcnJvcgogICAgdHJ5OgogICAgICAgIGZyb20gY29hY2gubGxtX2NsaWVudCBp' +
'bXBvcnQgTE1TdHVkaW9DbGllbnQKICAgICAgICBmcm9tIGNvYWNoLmVtYmVkZGluZ3MgaW1wb3J0IE1UR0VtYmVkZGluZ0luZGV4CiAgICAgICAgZnJvbSBjb2FjaC5jb2FjaF9zZXJ2aWNlIGltcG9ydCBDb2FjaFNlcnZpY2UKICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgZW5zdXJlX2RpcnMKCiAgICAgICAgZW5zdXJlX2RpcnMoKQoKICAgICAgICBfY29hY2hfbGxtID0gTE1TdHVkaW9DbGllbnQoKQogICAgICAgIF9jb2FjaF9lbWJlZGRpbmdzID0gTVRHRW1iZWRkaW5nSW5kZXgoKQoKICAgICAgICAjIFRyeSB0byBsb2FkIGVtYmVkZGluZ3MgKG5vbi1ibG9ja2luZyDigJQgZG93bmxvYWQgaGFwcGVucyBvbiBmaXJzdCB1c2UpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgRU1CRURESU5HU19OUFoKICAgICAgICAgICAgaWYgRU1CRURESU5HU19OUFouZXhpc3RzKCk6CiAgICAgICAgICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKCkKICAgICAgICAgICAgICAgIHByaW50KGYiICBDb2FjaDogICAgICAgIEVtYmVkZGluZ3MgbG9hZGVkICh7X2NvYWNoX2VtYmVkZGluZ3MuY2FyZF9jb3VudH0gY2FyZHMpIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByaW50KCIgIENvYWNoOiAgICAgICAgRW1iZWRkaW5ncyBub3QgeWV0IGRvd25sb2FkZWQgKHdpbGwgZG93bmxvYWQgb24gZmlyc3QgdXNlKSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIiAgQ29hY2g6ICAgICAgICBFbWJlZGRpbmdzIGxvYWQgZmFpbGVkOiB7ZX0iKQoKICAgICAgICBfY29hY2hfc2VydmljZSA9IENvYWNoU2VydmljZShfY29hY2hfbGxtLCBfY29hY2hfZW1iZWRkaW5ncykKCiAgICAgICAgIyBDaGVjayBMTE0gY29ubmVjdGlvbgogICAgICAgIGxsbV9zdGF0dXMgPSBfY29hY2hfbGxtLmNoZWNrX2Nvbm5lY3Rpb24oKQogICAgICAgIGlmIGxsbV9zdGF0dXMuZ2V0KCJjb25uZWN0ZWQiKToKICAgICAgICAgICAgcHJpbnQoZiIgIENvYWNoIExMTTogICAgQ29ubmVjdGVkICh7bGxtX3N0YXR1cy5nZXQoJ2FjdGl2ZV9tb2RlbCcsICd1bmtub3duJyl9KSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoZiIgIENvYWNoIExMTTogICAgTm90IGNvbm5lY3RlZCAoc3RhcnQgTE0gU3R1ZGlvIG9uIDE5Mi4xNjguMC4xMjI6MTIzNCkiKQoKICAgICAgICBwcmludCgiICBDb2FjaDogICAgICAgIFNlcnZpY2UgaW5pdGlhbGl6ZWQiKQoKICAgICAgICAjIEluaXRpYWxpemUgVjMgRGVjayBHZW5lcmF0b3IgKFBlcnBsZXhpdHkpCiAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gTm9uZQogICAgICAgIGlmIENGRy5wcGx4X2FwaV9rZXk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZyb20gY29hY2guY2xpZW50cy5wZXJwbGV4aXR5X2NsaWVudCBpbXBvcnQgUGVycGxleGl0eUNsaWVudAogICAgICAgICAgICAgICAgZnJvbSBjb2FjaC5zZXJ2aWNlcy5kZWNrX2dlbmVyYXRvciBpbXBvcnQgRGVja0dlbmVyYXRvclYzCiAgICAgICAgICAgICAgICBmcm9tIGNvYWNoLmNvbmZpZyBpbXBvcnQgREVDS19HRU5fTU9ERUwKCiAgICAgICAgICAgICAgICBwcGx4X2NsaWVudCA9IFBlcnBsZXhpdHlDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgYXBpX2tleT1DRkcucHBseF9hcGlfa2V5LAogICAgICAgICAgICAgICAgICAgIG1vZGVsPURFQ0tfR0VOX01PREVMLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgX2RlY2tfZ2VuX3YzID0gRGVja0dlbmVyYXRvclYzKAogICAgICAgICAgICAgICAgICAgIHBwbHhfY2xpZW50PXBwbHhfY2xpZW50LAogICAgICAgICAgICAgICAgICAgIGRiX2Nvbm5fZmFjdG9yeT1fZ2V0X2RiX2Nvbm4sCiAgICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nX2luZGV4PV9jb2FjaF9lbWJlZGRpbmdzLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcHJpbnQoZiIgIERlY2sgR2VuIFYzOiAgSW5pdGlhbGl6ZWQgKG1vZGVsOiB7REVDS19HRU5fTU9ERUx9KSIpCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gZiJNaXNzaW5nIGRlcGVuZGVuY3k6IHtlfS4gUnVuOiBwaXAgaW5zdGFsbCBvcGVuYWkiCiAgICAgICAgICAgICAgICBwcmludChmIiAgRGVjayBHZW4gVjM6ICB7X2RlY2tfZ2VuX3YzX2Vycm9y' +
'fSIpCiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjMgPSBOb25lCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIF9kZWNrX2dlbl92M19lcnJvciA9IHN0cihlKQogICAgICAgICAgICAgICAgcHJpbnQoZiIgIERlY2sgR2VuIFYzOiAgRmFpbGVkIHRvIGluaXRpYWxpemU6IHtlfSIpCiAgICAgICAgICAgICAgICBfZGVja19nZW5fdjMgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2RlY2tfZ2VuX3YzX2Vycm9yID0gIlBQTFhfQVBJX0tFWSBub3Qgc2V0IgogICAgICAgICAgICBwcmludCgiICBEZWNrIEdlbiBWMzogIFNraXBwZWQgKG5vIFBQTFhfQVBJX0tFWSkiKQoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIiAgQ29hY2g6ICAgICAgICBGYWlsZWQgdG8gaW5pdGlhbGl6ZToge2V9IikKICAgICAgICBfY29hY2hfc2VydmljZSA9IE5vbmUKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9zdGF0dXMiKQphc3luYyBkZWYgY29hY2hfc3RhdHVzKCk6CiAgICAiIiJDaGVjayBjb2FjaCBzdWJzeXN0ZW0gaGVhbHRoLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByZXR1cm4geyJsbG1Db25uZWN0ZWQiOiBGYWxzZSwgImVtYmVkZGluZ3NMb2FkZWQiOiBGYWxzZSwKICAgICAgICAgICAgICAgICJlbWJlZGRpbmdDYXJkcyI6IDAsICJkZWNrUmVwb3J0c0F2YWlsYWJsZSI6IDAsCiAgICAgICAgICAgICAgICAiZXJyb3IiOiAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQifQogICAgc3RhdHVzID0gX2NvYWNoX3NlcnZpY2UuZ2V0X3N0YXR1cygpCiAgICByZXR1cm4gc3RhdHVzLm1vZGVsX2R1bXAoKQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2RlY2tzIikKYXN5bmMgZGVmIGNvYWNoX2xpc3RfZGVja3MoKToKICAgICIiIkxpc3QgYWxsIGRlY2tzIHdpdGggYXZhaWxhYmxlIHJlcG9ydHMuIiIiCiAgICBpZiBfY29hY2hfc2VydmljZSBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAwLCAiQ29hY2ggc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiKQogICAgcmV0dXJuIHsiZGVja3MiOiBfY29hY2hfc2VydmljZS5saXN0X2RlY2tfcmVwb3J0cygpfQoKCkBhcHAuZ2V0KCIvYXBpL2NvYWNoL2RlY2tzL3tkZWNrX2lkfS9yZXBvcnQiKQphc3luYyBkZWYgY29hY2hfZ2V0X3JlcG9ydChkZWNrX2lkOiBzdHIpOgogICAgIiIiR2V0IHRoZSBsYXRlc3QgRGVja1JlcG9ydCBmb3IgYSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHJlcG9ydCA9IF9jb2FjaF9zZXJ2aWNlLmxvYWRfZGVja19yZXBvcnQoZGVja19pZCkKICAgIGlmIHJlcG9ydCBpcyBOb25lOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA0LCBmIkRlY2sgcmVwb3J0IG5vdCBmb3VuZDoge2RlY2tfaWR9IikKICAgIHJldHVybiByZXBvcnQubW9kZWxfZHVtcCgpCgoKY2xhc3MgQ29hY2hSZXF1ZXN0Qm9keShCYXNlTW9kZWwpOgogICAgZ29hbHM6IE9wdGlvbmFsW2RpY3RdID0gTm9uZQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9kZWNrcy97ZGVja19pZH0iKQphc3luYyBkZWYgY29hY2hfcnVuX3Nlc3Npb24oZGVja19pZDogc3RyLCBib2R5OiBDb2FjaFJlcXVlc3RCb2R5ID0gTm9uZSk6CiAgICAiIiJUcmlnZ2VyIGEgY29hY2hpbmcgc2Vzc2lvbiBmb3IgYSBkZWNrLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKCiAgICAjIExvYWQgZW1iZWRkaW5ncyBvbiBmaXJzdCB1c2UgaWYgbm90IGxvYWRlZAogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgYW5kIG5vdCBfY29hY2hfZW1iZWRkaW5ncy5sb2FkZWQ6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBfY29hY2hfZW1iZWRkaW5ncy5sb2FkKGZvcmNlX2Rvd25sb2FkPVRydWUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBwcmludChmIiAgQ29hY2g6IEVtYmVkZGluZ3MgZG93bmxvYWQgZmFpbGVkOiB7ZX0iKQoKICAgIGdvYWxzID0gTm9uZQogICAgaWYgYm9keSBhbmQgYm9keS5nb2FsczoKICAgICAgICBmcm9tIGNvYWNoLm1vZGVscyBpbXBvcnQgQ29hY2hHb2FscwogICAgICAgIHRyeToKICAg' +
'ICAgICAgICAgZ29hbHMgPSBDb2FjaEdvYWxzKCoqYm9keS5nb2FscykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBnb2FscyA9IE5vbmUKCiAgICB0cnk6CiAgICAgICAgc2Vzc2lvbiA9IGF3YWl0IF9jb2FjaF9zZXJ2aWNlLnJ1bl9jb2FjaGluZ19zZXNzaW9uKGRlY2tfaWQsIGdvYWxzKQogICAgICAgIHJldHVybiBzZXNzaW9uLm1vZGVsX2R1bXAoKQogICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgc3RyKGUpKQogICAgZXhjZXB0IENvbm5lY3Rpb25FcnJvciBhcyBlOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCBmIkxMTSBjb25uZWN0aW9uIGZhaWxlZDoge2V9IikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJDb2FjaCBzZXNzaW9uIGZhaWxlZDoge2V9IikKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9zZXNzaW9ucyIpCmFzeW5jIGRlZiBjb2FjaF9saXN0X3Nlc3Npb25zKGRlY2tfaWQ6IHN0ciA9IE5vbmUpOgogICAgIiIiTGlzdCBhbGwgY29hY2hpbmcgc2Vzc2lvbnMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgZGVjay4iIiIKICAgIGlmIF9jb2FjaF9zZXJ2aWNlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCiAgICByZXR1cm4geyJzZXNzaW9ucyI6IF9jb2FjaF9zZXJ2aWNlLmxpc3Rfc2Vzc2lvbnMoZGVja19pZCl9CgoKQGFwcC5nZXQoIi9hcGkvY29hY2gvc2Vzc2lvbnMve3Nlc3Npb25faWR9IikKYXN5bmMgZGVmIGNvYWNoX2dldF9zZXNzaW9uKHNlc3Npb25faWQ6IHN0cik6CiAgICAiIiJHZXQgYSBzcGVjaWZpYyBjb2FjaGluZyBzZXNzaW9uLiIiIgogICAgaWYgX2NvYWNoX3NlcnZpY2UgaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgIkNvYWNoIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkIikKICAgIHNlc3Npb24gPSBfY29hY2hfc2VydmljZS5sb2FkX3Nlc3Npb24oc2Vzc2lvbl9pZCkKICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDQwNCwgZiJTZXNzaW9uIG5vdCBmb3VuZDoge3Nlc3Npb25faWR9IikKICAgIHJldHVybiBzZXNzaW9uLm1vZGVsX2R1bXAoKQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9lbWJlZGRpbmdzL2Rvd25sb2FkIikKYXN5bmMgZGVmIGNvYWNoX2Rvd25sb2FkX2VtYmVkZGluZ3MoKToKICAgICIiIkRvd25sb2FkIGFuZCBjb252ZXJ0IE1URyBjYXJkIGVtYmVkZGluZ3MgZnJvbSBIdWdnaW5nRmFjZS4iIiIKICAgIGlmIF9jb2FjaF9lbWJlZGRpbmdzIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsICJDb2FjaCBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZCIpCiAgICB0cnk6CiAgICAgICAgX2NvYWNoX2VtYmVkZGluZ3MubG9hZChmb3JjZV9kb3dubG9hZD1UcnVlKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJzdWNjZXNzIjogVHJ1ZSwKICAgICAgICAgICAgImNhcmRzIjogX2NvYWNoX2VtYmVkZGluZ3MuY2FyZF9jb3VudCwKICAgICAgICAgICAgIm1lc3NhZ2UiOiBmIkxvYWRlZCB7X2NvYWNoX2VtYmVkZGluZ3MuY2FyZF9jb3VudH0gY2FyZCBlbWJlZGRpbmdzIgogICAgICAgIH0KICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGYWlsZWQgdG8gZG93bmxvYWQgZW1iZWRkaW5nczoge2V9IikKCgpAYXBwLmdldCgiL2FwaS9jb2FjaC9lbWJlZGRpbmdzL3NlYXJjaCIpCmFzeW5jIGRlZiBjb2FjaF9zZWFyY2hfc2ltaWxhcihjYXJkOiBzdHIsIGNvbG9yczogc3RyID0gTm9uZSwgdG9wX246IGludCA9IDEwKToKICAgICIiIlNlYXJjaCBmb3Igc2ltaWxhciBjYXJkcyBieSBuYW1lLiIiIgogICAgaWYgX2NvYWNoX2VtYmVkZGluZ3MgaXMgTm9uZSBvciBub3QgX2NvYWNoX2VtYmVkZGluZ3MubG9hZGVkOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNTAzLCAiRW1iZWRkaW5ncyBub3QgbG9hZGVkIikKICAgIGNvbG9yX2ZpbHRlciA9IGxpc3QoY29sb3JzLnVwcGVyKCkpIGlmIGNvbG9ycyBlbHNlIE5vbmUKICAgIG1hdGNoZXMgPSBfY29hY2hfZW1iZWRkaW5ncy5zZWFyY2hfc2ltaWxhcigKICAgICAgICBxdWVyeV9jYXJkPWNhcmQsIGNvbG9yX2ZpbHRlcj1jb2xvcl9maWx0ZXIsIHRv' +
'cF9uPXRvcF9uCiAgICApCiAgICByZXR1cm4geyJxdWVyeSI6IGNhcmQsICJtYXRjaGVzIjogW20udG9fZGljdCgpIGZvciBtIGluIG1hdGNoZXNdfQoKCkBhcHAucG9zdCgiL2FwaS9jb2FjaC9yZXBvcnRzL2dlbmVyYXRlIikKYXN5bmMgZGVmIGNvYWNoX2dlbmVyYXRlX3JlcG9ydHMoKToKICAgICIiIlJlYnVpbGQgYWxsIGRlY2sgcmVwb3J0cyBmcm9tIGJhdGNoIHJlc3VsdCBKU09OcyBpbiByZXN1bHRzLy4iIiIKICAgIHRyeToKICAgICAgICBmcm9tIGNvYWNoLnJlcG9ydF9nZW5lcmF0b3IgaW1wb3J0IGdlbmVyYXRlX2RlY2tfcmVwb3J0cwogICAgICAgIGxhYl9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICAgICAgcmVzdWx0c19kaXIgPSBzdHIobGFiX3Jvb3QgLyBDRkcucmVzdWx0c19kaXIpCiAgICAgICAgcmVwb3J0c19kaXIgPSBzdHIobGFiX3Jvb3QgLyAiZGVjay1yZXBvcnRzIikKICAgICAgICB1cGRhdGVkID0gZ2VuZXJhdGVfZGVja19yZXBvcnRzKHJlc3VsdHNfZGlyLCByZXBvcnRzX2RpcikKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3RhdHVzIjogIm9rIiwKICAgICAgICAgICAgImRlY2tzVXBkYXRlZCI6IHVwZGF0ZWQsCiAgICAgICAgICAgICJjb3VudCI6IGxlbih1cGRhdGVkKSwKICAgICAgICAgICAgIm1lc3NhZ2UiOiBmIkdlbmVyYXRlZCByZXBvcnRzIGZvciB7bGVuKHVwZGF0ZWQpfSBkZWNrcyIgaWYgdXBkYXRlZCBlbHNlICJObyBiYXRjaCByZXN1bHRzIGZvdW5kIiwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGYiUmVwb3J0IGdlbmVyYXRpb24gZmFpbGVkOiB7ZX0iKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgTUwgVHJhaW5pbmcgRGF0YSBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBhcHAuZ2V0KCIvYXBpL21sL3N0YXR1cyIpCmFzeW5jIGRlZiBtbF9zdGF0dXMoKToKICAgICIiIkdldCBNTCBkZWNpc2lvbiBsb2dnaW5nIHN0YXR1cyBhbmQgYXZhaWxhYmxlIHRyYWluaW5nIGRhdGEuIiIiCiAgICBnbG9iYWwgX21sX2xvZ2dpbmdfZW5hYmxlZAogICAgbGFiX3Jvb3QgPSBQYXRoKF9fZmlsZV9fKS5wYXJlbnQKICAgIHJlc3VsdHNfZGlyID0gbGFiX3Jvb3QgLyBDRkcucmVzdWx0c19kaXIKCiAgICAjIEZpbmQgZXhpc3RpbmcgTUwgZGVjaXNpb24gZmlsZXMKICAgIG1sX2ZpbGVzID0gW10KICAgIGlmIHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJtbC1kZWNpc2lvbnMtKi5qc29ubCIpKToKICAgICAgICAgICAgbGluZXMgPSAwCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihmKSBhcyBmaDoKICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IHN1bSgxIGZvciBfIGluIGZoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBtbF9maWxlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgImZpbGUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAiZGVjaXNpb25zIjogbGluZXMsCiAgICAgICAgICAgICAgICAic2l6ZV9rYiI6IHJvdW5kKGYuc3RhdCgpLnN0X3NpemUgLyAxMDI0LCAxKSwKICAgICAgICAgICAgfSkKCiAgICB0b3RhbF9kZWNpc2lvbnMgPSBzdW0oZlsiZGVjaXNpb25zIl0gZm9yIGYgaW4gbWxfZmlsZXMpCiAgICByZXR1cm4gewogICAgICAgICJtbF9sb2dnaW5nX2VuYWJsZWQiOiBfbWxfbG9nZ2luZ19lbmFibGVkLAogICAgICAgICJ0cmFpbmluZ19maWxlcyI6IG1sX2ZpbGVzLAogICAgICAgICJ0b3RhbF9kZWNpc2lvbnMiOiB0b3RhbF9kZWNpc2lvbnMsCiAgICAgICAgInRvdGFsX2ZpbGVzIjogbGVuKG1sX2ZpbGVzKSwKICAgIH0K' +
'CgpAYXBwLnBvc3QoIi9hcGkvbWwvdG9nZ2xlIikKYXN5bmMgZGVmIG1sX3RvZ2dsZShlbmFibGU6IGJvb2wgPSBUcnVlKToKICAgICIiIkVuYWJsZSBvciBkaXNhYmxlIE1MIGRlY2lzaW9uIGxvZ2dpbmcgZm9yIGZ1dHVyZSBiYXRjaCBydW5zLiIiIgogICAgZ2xvYmFsIF9tbF9sb2dnaW5nX2VuYWJsZWQKICAgIF9tbF9sb2dnaW5nX2VuYWJsZWQgPSBlbmFibGUKICAgIHJldHVybiB7CiAgICAgICAgIm1sX2xvZ2dpbmdfZW5hYmxlZCI6IF9tbF9sb2dnaW5nX2VuYWJsZWQsCiAgICAgICAgIm1lc3NhZ2UiOiBmIk1MIGRlY2lzaW9uIGxvZ2dpbmcgeydlbmFibGVkJyBpZiBlbmFibGUgZWxzZSAnZGlzYWJsZWQnfSBmb3IgZnV0dXJlIGJhdGNoZXMiLAogICAgfQoKCkBhcHAuZ2V0KCIvYXBpL21sL2RlY2lzaW9ucy97ZmlsZW5hbWV9IikKYXN5bmMgZGVmIG1sX2dldF9kZWNpc2lvbnMoZmlsZW5hbWU6IHN0ciwgbGltaXQ6IGludCA9IDEwMCwgb2Zmc2V0OiBpbnQgPSAwKToKICAgICIiIlJlYWQgZGVjaXNpb24gc25hcHNob3RzIGZyb20gYSB0cmFpbmluZyBkYXRhIGZpbGUuIiIiCiAgICBsYWJfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgZmlsZXBhdGggPSBsYWJfcm9vdCAvIENGRy5yZXN1bHRzX2RpciAvIGZpbGVuYW1lCgogICAgaWYgbm90IGZpbGVwYXRoLmV4aXN0cygpIG9yIG5vdCBmaWxlbmFtZS5zdGFydHN3aXRoKCJtbC1kZWNpc2lvbnMtIik6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDQsIGYiTUwgZGVjaXNpb25zIGZpbGUgbm90IGZvdW5kOiB7ZmlsZW5hbWV9IikKCiAgICBkZWNpc2lvbnMgPSBbXQogICAgdHJ5OgogICAgICAgIGltcG9ydCBqc29uIGFzIF9qc29uCiAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoKSBhcyBmOgogICAgICAgICAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUoZik6CiAgICAgICAgICAgICAgICBpZiBpIDwgb2Zmc2V0OgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBsZW4oZGVjaXNpb25zKSA+PSBsaW1pdDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRlY2lzaW9ucy5hcHBlbmQoX2pzb24ubG9hZHMobGluZS5zdHJpcCgpKSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBfanNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKDUwMCwgZiJGYWlsZWQgdG8gcmVhZCBkZWNpc2lvbnM6IHtlfSIpCgogICAgcmV0dXJuIHsKICAgICAgICAiZmlsZSI6IGZpbGVuYW1lLAogICAgICAgICJvZmZzZXQiOiBvZmZzZXQsCiAgICAgICAgImxpbWl0IjogbGltaXQsCiAgICAgICAgImNvdW50IjogbGVuKGRlY2lzaW9ucyksCiAgICAgICAgImRlY2lzaW9ucyI6IGRlY2lzaW9ucywKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1MIFBvbGljeSBJbmZlcmVuY2UgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIExhenktbG9hZGVkIHBvbGljeSBpbmZlcmVuY2Ugc2VydmljZSAob25seSBsb2FkcyB3aGVuIGZpcnN0IGNhbGxlZCkKX3BvbGljeV9zZXJ2aWNlID0gTm9uZQpfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBGYWxzZQoKCmRlZiBfZ2V0X3BvbGljeV9zZXJ2aWNlKCk6CiAgICAiIiJHZXQgb3IgaW5pdGlhbGl6ZSB0aGUgcG9saWN5IGluZmVyZW5jZSBzZXJ2aWNlIChsYXp5IGxvYWRpbmcpLiIiIgogICAgZ2xvYmFsIF9wb2xpY3lfc2VydmljZSwgX3BvbGljeV9zZXJ2aWNlX2luaXRfYXR0ZW1wdGVkCiAgICBpZiBfcG9saWN5X3NlcnZpY2UgaXMgTm9uZSBhbmQgbm90IF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVt' +
'cHRlZDoKICAgICAgICBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQgPSBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmcm9tIG1sLnNlcnZpbmcucG9saWN5X3NlcnZlciBpbXBvcnQgUG9saWN5SW5mZXJlbmNlU2VydmljZQogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2UgPSBQb2xpY3lJbmZlcmVuY2VTZXJ2aWNlKCkKICAgICAgICAgICAgaWYgX3BvbGljeV9zZXJ2aWNlLmxvYWQoKToKICAgICAgICAgICAgICAgIHByaW50KGYiW01MXSBQb2xpY3kgbW9kZWwgbG9hZGVkIG9uIHtfcG9saWN5X3NlcnZpY2UuZGV2aWNlfSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmludChmIltNTF0gUG9saWN5IG1vZGVsIG5vdCBhdmFpbGFibGU6IHtfcG9saWN5X3NlcnZpY2UuX2xvYWRfZXJyb3J9IikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiW01MXSBQb2xpY3kgc2VydmljZSBpbml0IGZhaWxlZDoge2V9IikKICAgIHJldHVybiBfcG9saWN5X3NlcnZpY2UKCgpAYXBwLnBvc3QoIi9hcGkvbWwvcHJlZGljdCIpCmFzeW5jIGRlZiBtbF9wcmVkaWN0KHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlByZWRpY3QgYSBtYWNyby1hY3Rpb24gZnJvbSBhIGdhbWUgc3RhdGUgc25hcHNob3QuCgogICAgQWNjZXB0cyBEZWNpc2lvblNuYXBzaG90LXNoYXBlZCBKU09OIGZyb20gdGhlIEphdmEgYmF0Y2ggcnVubmVyLgogICAgUmV0dXJucyB0aGUgbGVhcm5lZCBwb2xpY3kncyByZWNvbW1lbmRlZCBhY3Rpb24uCgogICAgUmVxdWVzdCBib2R5OgogICAgICAgIHsKICAgICAgICAgICAgInR1cm4iOiA1LAogICAgICAgICAgICAicGhhc2UiOiAibWFpbl8xIiwKICAgICAgICAgICAgImFjdGl2ZV9zZWF0IjogMCwKICAgICAgICAgICAgInBsYXllcnMiOiBbLi4uXSwKICAgICAgICAgICAgImFyY2hldHlwZSI6ICJhZ2dybyIsCiAgICAgICAgICAgICJ0ZW1wZXJhdHVyZSI6IDEuMCwKICAgICAgICAgICAgImdyZWVkeSI6IGZhbHNlCiAgICAgICAgfQoKICAgIFJlc3BvbnNlOgogICAgICAgIHsKICAgICAgICAgICAgImFjdGlvbiI6ICJjYXN0X2NyZWF0dXJlIiwKICAgICAgICAgICAgImFjdGlvbl9pbmRleCI6IDAsCiAgICAgICAgICAgICJjb25maWRlbmNlIjogMC43MywKICAgICAgICAgICAgInByb2JhYmlsaXRpZXMiOiB7Li4ufSwKICAgICAgICAgICAgImluZmVyZW5jZV9tcyI6IDIuMwogICAgICAgIH0KICAgICIiIgogICAgc3ZjID0gX2dldF9wb2xpY3lfc2VydmljZSgpCiAgICBpZiBzdmMgaXMgTm9uZSBvciBub3Qgc3ZjLl9sb2FkZWQ6CiAgICAgICAgZGV0YWlsID0gIlBvbGljeSBtb2RlbCBub3QgbG9hZGVkLiAiCiAgICAgICAgaWYgc3ZjOgogICAgICAgICAgICBkZXRhaWwgKz0gc3ZjLl9sb2FkX2Vycm9yIG9yICJUcmFpbiBhIG1vZGVsIGZpcnN0LiIKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZXRhaWwgKz0gIlB5VG9yY2ggbWF5IG5vdCBiZSBpbnN0YWxsZWQuIgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAzLCBkZXRhaWw9ZGV0YWlsKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgcGxheXN0eWxlID0gYm9keS5wb3AoImFyY2hldHlwZSIsICJtaWRyYW5nZSIpCiAgICB0ZW1wZXJhdHVyZSA9IGJvZHkucG9wKCJ0ZW1wZXJhdHVyZSIsIDEuMCkKICAgIGdyZWVkeSA9IGJvZHkucG9wKCJncmVlZHkiLCBGYWxzZSkKCiAgICByZXN1bHQgPSBzdmMucHJlZGljdCgKICAgICAgICBkZWNpc2lvbl9zbmFwc2hvdD1ib2R5LAogICAgICAgIHBsYXlzdHlsZT1wbGF5c3R5bGUsCiAgICAgICAgdGVtcGVyYXR1cmU9dGVtcGVyYXR1cmUsCiAgICAgICAgZ3JlZWR5PWdyZWVkeSwKICAgICkKCiAgICBpZiAiZXJyb3IiIGluIHJlc3VsdDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTUwMCwgZGV0YWlsPXJlc3VsdFsiZXJyb3IiXSkKICAgIHJldHVybiByZXN1bHQKCgpAYXBwLnBvc3QoIi9hcGkvbWwvcHJlZGljdC9iYXRjaCIpCmFzeW5jIGRlZiBtbF9wcmVkaWN0X2JhdGNoKHJlcXVlc3Q6IEZhc3RBUElSZXF1ZXN0KToKICAgICIiIlByZWRpY3QgYWN0aW9ucyBmb3IgbXVsdGlwbGUgc25hcHNob3RzIGF0IG9uY2UuCgogICAgUmVxdWVzdCBib2R5OiB7InNuYXBzaG90cyI6IFsuLi5dLCAiZ3JlZWR5IjogdHJ1ZX0KICAgICIiIgogICAgc3ZjID0gX2dldF9wb2xpY3lfc2VydmljZSgp' +
'CiAgICBpZiBzdmMgaXMgTm9uZSBvciBub3Qgc3ZjLl9sb2FkZWQ6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iUG9saWN5IG1vZGVsIG5vdCBsb2FkZWQiKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKQogICAgc25hcHNob3RzID0gYm9keS5nZXQoInNuYXBzaG90cyIsIFtdKQogICAgZ3JlZWR5ID0gYm9keS5nZXQoImdyZWVkeSIsIFRydWUpCgogICAgaWYgbm90IHNuYXBzaG90czoKICAgICAgICByZXR1cm4geyJyZXN1bHRzIjogW119CgogICAgcmVzdWx0cyA9IHN2Yy5wcmVkaWN0X2JhdGNoKHNuYXBzaG90cywgZ3JlZWR5PWdyZWVkeSkKICAgIHJldHVybiB7InJlc3VsdHMiOiByZXN1bHRzLCAiY291bnQiOiBsZW4ocmVzdWx0cyl9CgoKQGFwcC5nZXQoIi9hcGkvbWwvbW9kZWwiKQphc3luYyBkZWYgbWxfbW9kZWxfaW5mbygpOgogICAgIiIiR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2FkZWQgcG9saWN5IG1vZGVsLiIiIgogICAgc3ZjID0gX2dldF9wb2xpY3lfc2VydmljZSgpCiAgICBpZiBzdmMgaXMgTm9uZToKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAibG9hZGVkIjogRmFsc2UsCiAgICAgICAgICAgICJlcnJvciI6ICJQb2xpY3kgc2VydmljZSBub3QgaW5pdGlhbGl6ZWQiLAogICAgICAgICAgICAidG9yY2hfYXZhaWxhYmxlIjogRmFsc2UsCiAgICAgICAgfQogICAgcmV0dXJuIHN2Yy5nZXRfc3RhdHVzKCkKCgpAYXBwLnBvc3QoIi9hcGkvbWwvcmVsb2FkIikKYXN5bmMgZGVmIG1sX3JlbG9hZF9tb2RlbChjaGVja3BvaW50OiBzdHIgPSBOb25lKToKICAgICIiIkhvdC1yZWxvYWQgYSBwb2xpY3kgbW9kZWwgY2hlY2twb2ludC4iIiIKICAgIHN2YyA9IF9nZXRfcG9saWN5X3NlcnZpY2UoKQogICAgaWYgc3ZjIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iUG9saWN5IHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIpCgogICAgIyBJZiBzZXJ2aWNlIGhhc24ndCBsb2FkZWQgeWV0LCB0cnkgZnVsbCBsb2FkCiAgICBpZiBub3Qgc3ZjLl9sb2FkZWQ6CiAgICAgICAgb2sgPSBzdmMubG9hZCgpCiAgICBlbHNlOgogICAgICAgIG9rID0gc3ZjLnJlbG9hZChjaGVja3BvaW50KQoKICAgIHJldHVybiB7CiAgICAgICAgInN1Y2Nlc3MiOiBvaywKICAgICAgICAic3RhdHVzIjogc3ZjLmdldF9zdGF0dXMoKSwKICAgIH0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1MIFRyYWluaW5nIE1hbmFnZW1lbnQgRW5kcG9pbnRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIFRyYWluaW5nIHN0YXRlIHRyYWNraW5nCl90cmFpbmluZ19zdGF0ZSA9IHsKICAgICJydW5uaW5nIjogRmFsc2UsCiAgICAicHJvZ3Jlc3MiOiAwLAogICAgInRvdGFsX2Vwb2NocyI6IDAsCiAgICAiY3VycmVudF9lcG9jaCI6IDAsCiAgICAicGhhc2UiOiAiaWRsZSIsICAjIGlkbGUgfCBidWlsZGluZyB8IHRyYWluaW5nIHwgZXZhbHVhdGluZyB8IGRvbmUgfCBlcnJvcgogICAgIm1lc3NhZ2UiOiAiIiwKICAgICJtZXRyaWNzIjogTm9uZSwgICMgbGF0ZXN0IGVwb2NoIG1ldHJpY3MKICAgICJyZXN1bHQiOiBOb25lLCAgICMgZmluYWwgdHJhaW5pbmcgcmVzdWx0CiAgICAiZXJyb3IiOiBOb25lLAogICAgInN0YXJ0ZWRfYXQiOiBOb25lLAp9CgoKZGVmIF9ydW5fdHJhaW5pbmdfcGlwZWxpbmUoCiAgICByZXN1bHRzX2Rpcjogc3RyLAogICAgZXBvY2hzOiBpbnQsCiAgICBscjogZmxvYXQsCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBwYXRpZW5jZTogaW50LAogICAgcmVidWlsZF9kYXRhc2V0OiBib29sLAopOgogICAgIiIiUnVuIHRoZSBmdWxsIE1MIHRyYWluaW5nIHBpcGVsaW5lIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3Ry' +
'YWluaW5nX3N0YXRlCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHN5cwogICAgICAgIHByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQpCiAgICAgICAgaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3Rfcm9vdCkKCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl0gPSBUcnVlCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJzdGFydGVkX2F0Il0gPSBkYXRldGltZS5ub3coKS5pc29mb3JtYXQoKQogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiZXJyb3IiXSA9IE5vbmUKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJlc3VsdCJdID0gTm9uZQoKICAgICAgICBkYXRhX2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiKQogICAgICAgIGNrcHRfZGlyID0gb3MucGF0aC5qb2luKHByb2plY3Rfcm9vdCwgIm1sIiwgIm1vZGVscyIsICJjaGVja3BvaW50cyIpCiAgICAgICAgb3MubWFrZWRpcnMoZGF0YV9kaXIsIGV4aXN0X29rPVRydWUpCiAgICAgICAgb3MubWFrZWRpcnMoY2twdF9kaXIsIGV4aXN0X29rPVRydWUpCgogICAgICAgICMgLS0tIFBoYXNlIDE6IEJ1aWxkIERhdGFzZXQgLS0tCiAgICAgICAgdHJhaW5fcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgInRyYWluLm5weiIpCiAgICAgICAgaWYgcmVidWlsZF9kYXRhc2V0IG9yIG5vdCBvcy5wYXRoLmV4aXN0cyh0cmFpbl9wYXRoKToKICAgICAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0gImJ1aWxkaW5nIgogICAgICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1lc3NhZ2UiXSA9ICJMb2FkaW5nIGNhcmQgZW1iZWRkaW5ncyAmIGJ1aWxkaW5nIGRhdGFzZXQuLi4iCiAgICAgICAgICAgIHByaW50KCJbTUwgVHJhaW5dIEJ1aWxkaW5nIGRhdGFzZXQgKGxvYWRpbmcgZW1iZWRkaW5ncywgbWF5IGF1dG8tZG93bmxvYWQpLi4uIikKCiAgICAgICAgICAgIGZyb20gbWwuZGF0YS5kYXRhc2V0X2J1aWxkZXIgaW1wb3J0IGJ1aWxkX2RhdGFzZXQsIHNwbGl0X2RhdGFzZXQsIHNhdmVfZGF0YXNldAogICAgICAgICAgICBkYXRhc2V0ID0gYnVpbGRfZGF0YXNldChyZXN1bHRzX2Rpcj1yZXN1bHRzX2RpcikKICAgICAgICAgICAgaWYgbm90IGRhdGFzZXQ6CiAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIk5vIHRyYWluaW5nIGRhdGEgcHJvZHVjZWQuIENoZWNrIHNlcnZlciBsb2cgZm9yIGRldGFpbHMuIikKICAgICAgICAgICAgdHJhaW5fZHMsIHZhbF9kcywgdGVzdF9kcyA9IHNwbGl0X2RhdGFzZXQoZGF0YXNldCkKICAgICAgICAgICAgc2F2ZV9kYXRhc2V0KHRyYWluX2RzLCBvcy5wYXRoLmpvaW4oZGF0YV9kaXIsICJ0cmFpbi5ucHoiKSkKICAgICAgICAgICAgc2F2ZV9kYXRhc2V0KHZhbF9kcywgb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidmFsLm5weiIpKQogICAgICAgICAgICBzYXZlX2RhdGFzZXQodGVzdF9kcywgb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidGVzdC5ucHoiKSkKICAgICAgICAgICAgdG90YWxfc2FtcGxlcyA9IGxlbihkYXRhc2V0WyJzdGF0ZXMiXSkKICAgICAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIkRhdGFzZXQgYnVpbHQ6IHt0b3RhbF9zYW1wbGVzfSBzYW1wbGVzIgogICAgICAgICAgICBwcmludChmIltNTCBUcmFpbl0gRGF0YXNldCBidWlsdDoge3RvdGFsX3NhbXBsZXN9IHNhbXBsZXMiKQoKICAgICAgICAjIC0tLSBQaGFzZSAyOiBUcmFpbiAtLS0KICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAidHJhaW5pbmciCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJ0b3RhbF9lcG9jaHMiXSA9IGVwb2NocwogICAgICAgIF90cmFpbmluZ19zdGF0ZVsiY3VycmVudF9lcG9jaCJdID0gMAogICAgICAgIF90cmFpbmluZ19zdGF0ZVsibWVzc2FnZSJdID0gZiJUcmFpbmluZyBwb2xpY3kgbmV0d29yayAoe2Vwb2Noc30gZXBvY2hzKS4uLiIKICAgICAgICBwcmludChmIltNTCBUcmFpbl0gU3RhcnRpbmcgdHJhaW5pbmc6IHtlcG9jaHN9IGVwb2NocywgbHI9e2xyfSwgYnM9e2JhdGNoX3NpemV9IikKCiAgICAgICAgaW1wb3J0IG51bXB5IGFzIG5wCiAgICAgICAgaW1wb3J0IHRvcmNoCiAgICAgICAgZnJvbSBtbC50cmFpbmluZy5wb2xpY3lfbmV0d29yayBpbXBvcnQgUG9saWN5TmV0d29yawogICAgICAgIGZyb20gbWwudHJhaW5pbmcudHJhaW5lciBpbXBvcnQgU3VwZXJ2' +
'aXNlZFRyYWluZXIKCiAgICAgICAgZGVmIGxvYWRfbnB6X3NwbGl0KHBhdGgpOgogICAgICAgICAgICBkYXRhID0gbnAubG9hZChwYXRoKQogICAgICAgICAgICByZXR1cm4gZGF0YVsic3RhdGVzIl0uYXN0eXBlKG5wLmZsb2F0MzIpLCBkYXRhWyJsYWJlbHMiXS5hc3R5cGUobnAuaW50NjQpCgogICAgICAgIHRyYWluX3N0YXRlcywgdHJhaW5fbGFiZWxzID0gbG9hZF9ucHpfc3BsaXQodHJhaW5fcGF0aCkKICAgICAgICB2YWxfcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgInZhbC5ucHoiKQogICAgICAgIHZhbF9zdGF0ZXMsIHZhbF9sYWJlbHMgPSBsb2FkX25wel9zcGxpdCh2YWxfcGF0aCkKCiAgICAgICAgYWN0dWFsX2RpbSA9IHRyYWluX3N0YXRlcy5zaGFwZVsxXQogICAgICAgIG1vZGVsID0gUG9saWN5TmV0d29yayhpbnB1dF9kaW09YWN0dWFsX2RpbSkKCiAgICAgICAgZGV2aWNlID0gImNwdSIKICAgICAgICBpZiB0b3JjaC5jdWRhLmlzX2F2YWlsYWJsZSgpOgogICAgICAgICAgICBkZXZpY2UgPSAiY3VkYSIKICAgICAgICBlbGlmIGhhc2F0dHIodG9yY2guYmFja2VuZHMsICJtcHMiKSBhbmQgdG9yY2guYmFja2VuZHMubXBzLmlzX2F2YWlsYWJsZSgpOgogICAgICAgICAgICBkZXZpY2UgPSAibXBzIgoKICAgICAgICB0cmFpbmVyID0gU3VwZXJ2aXNlZFRyYWluZXIoCiAgICAgICAgICAgIG1vZGVsPW1vZGVsLAogICAgICAgICAgICBkZXZpY2U9ZGV2aWNlLAogICAgICAgICAgICBsZWFybmluZ19yYXRlPWxyLAogICAgICAgICAgICBiYXRjaF9zaXplPWJhdGNoX3NpemUsCiAgICAgICAgICAgIGVwb2Nocz1lcG9jaHMsCiAgICAgICAgICAgIHBhdGllbmNlPXBhdGllbmNlLAogICAgICAgICAgICBjaGVja3BvaW50X2Rpcj1ja3B0X2RpciwKICAgICAgICApCgogICAgICAgICMgSG9vayBpbnRvIHRyYWluZXIgdG8gcmVwb3J0IHByb2dyZXNzCiAgICAgICAgb3JpZ2luYWxfdHJhaW4gPSB0cmFpbmVyLnRyYWluCgogICAgICAgIGRlZiBwYXRjaGVkX3RyYWluKHRyYWluX3MsIHRyYWluX2wsIHZhbF9zLCB2YWxfbCk6CiAgICAgICAgICAgICMgV2UnbGwgbW9uaXRvciB0aGUgY2hlY2twb2ludCBkaXIgZm9yIHByb2dyZXNzCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbF90cmFpbih0cmFpbl9zLCB0cmFpbl9sLCB2YWxfcywgdmFsX2wpCgogICAgICAgIHN1bW1hcnkgPSB0cmFpbmVyLnRyYWluKHRyYWluX3N0YXRlcywgdHJhaW5fbGFiZWxzLCB2YWxfc3RhdGVzLCB2YWxfbGFiZWxzKQoKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbImN1cnJlbnRfZXBvY2giXSA9IHN1bW1hcnkuZ2V0KCJlcG9jaHNfdHJhaW5lZCIsIGVwb2NocykKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbIm1ldHJpY3MiXSA9IHN1bW1hcnkKCiAgICAgICAgIyAtLS0gUGhhc2UgMzogRXZhbHVhdGUgLS0tCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJwaGFzZSJdID0gImV2YWx1YXRpbmciCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSAiRXZhbHVhdGluZyBvbiB0ZXN0IHNldC4uLiIKCiAgICAgICAgdGVzdF9wYXRoID0gb3MucGF0aC5qb2luKGRhdGFfZGlyLCAidGVzdC5ucHoiKQogICAgICAgIGV2YWxfcmVzdWx0cyA9IE5vbmUKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0ZXN0X3BhdGgpOgogICAgICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnRyYWluZXIgaW1wb3J0IGxvYWRfY2hlY2twb2ludCwgZXZhbHVhdGVfbW9kZWwKICAgICAgICAgICAgdGVzdF9zdGF0ZXMsIHRlc3RfbGFiZWxzID0gbG9hZF9ucHpfc3BsaXQodGVzdF9wYXRoKQogICAgICAgICAgICBiZXN0X21vZGVsLCBfID0gbG9hZF9jaGVja3BvaW50KHN1bW1hcnlbImNoZWNrcG9pbnRfcGF0aCJdLCBkZXZpY2UpCiAgICAgICAgICAgIGV2YWxfcmVzdWx0cyA9IGV2YWx1YXRlX21vZGVsKGJlc3RfbW9kZWwsIHRlc3Rfc3RhdGVzLCB0ZXN0X2xhYmVscywgZGV2aWNlKQoKICAgICAgICAgICAgZXZhbF9wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiZXZhbF9yZXN1bHRzLmpzb24iKQogICAgICAgICAgICB3aXRoIG9wZW4oZXZhbF9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgICAgICAgICBqc29uLmR1bXAoZXZhbF9yZXN1bHRzLCBmLCBpbmRlbnQ9MikKCiAgICAgICAgIyAtLS0gRG9uZSAtLS0KICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInBoYXNlIl0gPSAiZG9uZSIKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3Ry' +
'YWluaW5nX3N0YXRlWyJyZXN1bHQiXSA9IHsKICAgICAgICAgICAgInRyYWluaW5nIjogc3VtbWFyeSwKICAgICAgICAgICAgImV2YWx1YXRpb24iOiBldmFsX3Jlc3VsdHMsCiAgICAgICAgICAgICJjaGVja3BvaW50Ijogc3VtbWFyeS5nZXQoImNoZWNrcG9pbnRfcGF0aCIsICIiKSwKICAgICAgICAgICAgImRldmljZSI6IGRldmljZSwKICAgICAgICB9CiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlRyYWluaW5nIGNvbXBsZXRlISBCZXN0IHZhbCBhY2M6IHtzdW1tYXJ5LmdldCgnYmVzdF92YWxfYWNjdXJhY3knLCAwKTouMSV9IgogICAgICAgIHByaW50KGYiW01MIFRyYWluXSBDb21wbGV0ZToge3N1bW1hcnkuZ2V0KCdiZXN0X3ZhbF9hY2N1cmFjeScsIDApOi4xJX0gdmFsIGFjY3VyYWN5IikKCiAgICAgICAgIyBBdXRvLXJlbG9hZCBwb2xpY3kgc2VydmVyIHdpdGggbmV3IGNoZWNrcG9pbnQKICAgICAgICBnbG9iYWwgX3BvbGljeV9zZXJ2aWNlLCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQKICAgICAgICBpZiBfcG9saWN5X3NlcnZpY2UgYW5kIF9wb2xpY3lfc2VydmljZS5fbG9hZGVkOgogICAgICAgICAgICBfcG9saWN5X3NlcnZpY2UucmVsb2FkKHN1bW1hcnkuZ2V0KCJjaGVja3BvaW50X3BhdGgiKSkKICAgICAgICAgICAgcHJpbnQoIltNTCBUcmFpbl0gUG9saWN5IHNlcnZlciByZWxvYWRlZCB3aXRoIG5ldyBjaGVja3BvaW50IikKICAgICAgICBlbGlmIG5vdCBfcG9saWN5X3NlcnZpY2VfaW5pdF9hdHRlbXB0ZWQ6CiAgICAgICAgICAgIF9wb2xpY3lfc2VydmljZV9pbml0X2F0dGVtcHRlZCA9IEZhbHNlICAjIEFsbG93IHJlLWluaXQgd2l0aCBuZXcgbW9kZWwKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIF90cmFpbmluZ19zdGF0ZVsicGhhc2UiXSA9ICJlcnJvciIKICAgICAgICBfdHJhaW5pbmdfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJlcnJvciJdID0gc3RyKGUpCiAgICAgICAgX3RyYWluaW5nX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlRyYWluaW5nIGZhaWxlZDoge2V9IgogICAgICAgIHByaW50KGYiW01MIFRyYWluXSBFUlJPUjoge2V9IikKICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKCgpAYXBwLnBvc3QoIi9hcGkvbWwvdHJhaW4iKQphc3luYyBkZWYgbWxfc3RhcnRfdHJhaW5pbmcocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiVHJpZ2dlciBNTCB0cmFpbmluZyBwaXBlbGluZSBmcm9tIHRoZSB3ZWIgVUkuCgogICAgUmVxdWVzdCBib2R5IChhbGwgb3B0aW9uYWwpOgogICAgICAgIHsKICAgICAgICAgICAgImVwb2NocyI6IDUwLAogICAgICAgICAgICAibHIiOiAwLjAwMSwKICAgICAgICAgICAgImJhdGNoU2l6ZSI6IDI1NiwKICAgICAgICAgICAgInBhdGllbmNlIjogMTAsCiAgICAgICAgICAgICJyZWJ1aWxkRGF0YXNldCI6IHRydWUKICAgICAgICB9CiAgICAiIiIKICAgIGlmIF90cmFpbmluZ19zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiVHJhaW5pbmcgYWxyZWFkeSBpbiBwcm9ncmVzcyIpCgogICAgYm9keSA9IGF3YWl0IHJlcXVlc3QuanNvbigpIGlmIGF3YWl0IHJlcXVlc3QuYm9keSgpIGVsc2Uge30KICAgIGVwb2NocyA9IGJvZHkuZ2V0KCJlcG9jaHMiLCA1MCkKICAgIGxyID0gYm9keS5nZXQoImxyIiwgMC4wMDEpCiAgICBiYXRjaF9zaXplID0gYm9keS5nZXQoImJhdGNoU2l6ZSIsIDI1NikKICAgIHBhdGllbmNlID0gYm9keS5nZXQoInBhdGllbmNlIiwgMTApCiAgICByZWJ1aWxkID0gYm9keS5nZXQoInJlYnVpbGREYXRhc2V0IiwgVHJ1ZSkKCiAgICByZXN1bHRzX2RpciA9IG9zLnBhdGguam9pbihzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KSwgInJlc3VsdHMiKQoKICAgICMgUmVzZXQgc3RhdGUKICAgIF90cmFpbmluZ19zdGF0ZS51cGRhdGUoewogICAgICAgICJydW5uaW5nIjogVHJ1ZSwKICAgICAgICAicHJvZ3Jlc3MiOiAwLAogICAgICAgICJ0b3RhbF9lcG9jaHMiOiBlcG9jaHMsCiAgICAgICAgImN1cnJlbnRfZXBvY2giOiAwLAogICAgICAgICJwaGFzZSI6ICJzdGFydGluZyIsCiAgICAgICAgIm1lc3NhZ2UiOiAiSW5pdGlhbGl6aW5nIHRyYWluaW5nIHBpcGVsaW5lLi4uIiwKICAgICAgICAibWV0cmljcyI6IE5vbmUsCiAgICAgICAgInJlc3VsdCI6IE5vbmUsCiAgICAgICAgImVy' +
'cm9yIjogTm9uZSwKICAgIH0pCgogICAgIyBSdW4gaW4gYmFja2dyb3VuZCB0aHJlYWQKICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoCiAgICAgICAgdGFyZ2V0PV9ydW5fdHJhaW5pbmdfcGlwZWxpbmUsCiAgICAgICAgYXJncz0ocmVzdWx0c19kaXIsIGVwb2NocywgbHIsIGJhdGNoX3NpemUsIHBhdGllbmNlLCByZWJ1aWxkKSwKICAgICAgICBkYWVtb249VHJ1ZSwKICAgICkKICAgIHRocmVhZC5zdGFydCgpCgogICAgcmV0dXJuIHsKICAgICAgICAic3RhdHVzIjogInN0YXJ0ZWQiLAogICAgICAgICJjb25maWciOiB7CiAgICAgICAgICAgICJlcG9jaHMiOiBlcG9jaHMsCiAgICAgICAgICAgICJsciI6IGxyLAogICAgICAgICAgICAiYmF0Y2hTaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgInBhdGllbmNlIjogcGF0aWVuY2UsCiAgICAgICAgICAgICJyZWJ1aWxkRGF0YXNldCI6IHJlYnVpbGQsCiAgICAgICAgfSwKICAgIH0KCgpAYXBwLmdldCgiL2FwaS9tbC90cmFpbi9zdGF0dXMiKQphc3luYyBkZWYgbWxfdHJhaW5pbmdfc3RhdHVzKCk6CiAgICAiIiJHZXQgY3VycmVudCB0cmFpbmluZyBwaXBlbGluZSBzdGF0dXMuIiIiCiAgICByZXR1cm4gZGljdChfdHJhaW5pbmdfc3RhdGUpCgoKQGFwcC5nZXQoIi9hcGkvbWwvZGF0YS9zdGF0dXMiKQphc3luYyBkZWYgbWxfZGF0YV9zdGF0dXMoKToKICAgICIiIkdldCBzdGF0dXMgb2YgYXZhaWxhYmxlIHRyYWluaW5nIGRhdGEgYW5kIG1vZGVsIGNoZWNrcG9pbnRzLiIiIgogICAgcHJvamVjdF9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50CiAgICByZXN1bHRzX2RpciA9IHByb2plY3Rfcm9vdCAvICJyZXN1bHRzIgogICAgZGF0YV9kaXIgPSBwcm9qZWN0X3Jvb3QgLyAibWwiIC8gIm1vZGVscyIKICAgIGNrcHRfZGlyID0gZGF0YV9kaXIgLyAiY2hlY2twb2ludHMiCgogICAgIyBEZWNpc2lvbiBsb2cgZmlsZXMKICAgIGRlY2lzaW9uX2ZpbGVzID0gW10KICAgIGlmIHJlc3VsdHNfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChyZXN1bHRzX2Rpci5nbG9iKCJtbC1kZWNpc2lvbnMtKi5qc29ubCIpKToKICAgICAgICAgICAgbGluZV9jb3VudCA9IDAKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGYsICJyIikgYXMgZmg6CiAgICAgICAgICAgICAgICAgICAgbGluZV9jb3VudCA9IHN1bSgxIGZvciBfIGluIGZoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkZWNpc2lvbl9maWxlcy5hcHBlbmQoewogICAgICAgICAgICAgICAgIm5hbWUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGYuc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICAiZGVjaXNpb25zIjogbGluZV9jb3VudCwKICAgICAgICAgICAgfSkKCiAgICAjIERhdGFzZXQgZmlsZXMKICAgIGRhdGFzZXRzID0ge30KICAgIGZvciBzcGxpdCBpbiBbInRyYWluIiwgInZhbCIsICJ0ZXN0Il06CiAgICAgICAgcGF0aCA9IGRhdGFfZGlyIC8gZiJ7c3BsaXR9Lm5weiIKICAgICAgICBpZiBwYXRoLmV4aXN0cygpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgbnVtcHkgYXMgbnAKICAgICAgICAgICAgICAgIGRhdGEgPSBucC5sb2FkKHN0cihwYXRoKSkKICAgICAgICAgICAgICAgIGRhdGFzZXRzW3NwbGl0XSA9IHsKICAgICAgICAgICAgICAgICAgICAic2FtcGxlcyI6IGludChkYXRhWyJzdGF0ZXMiXS5zaGFwZVswXSksCiAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVzIjogaW50KGRhdGFbInN0YXRlcyJdLnNoYXBlWzFdKSwKICAgICAgICAgICAgICAgICAgICAic2l6ZSI6IHBhdGguc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBkYXRhc2V0c1tzcGxpdF0gPSB7InNpemUiOiBwYXRoLnN0YXQoKS5zdF9zaXplfQoKICAgICMgQ2hlY2twb2ludHMKICAgIGNoZWNrcG9pbnRzID0gW10KICAgIGlmIGNrcHRfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBmIGluIHNvcnRlZChja3B0X2Rpci5nbG9iKCIqLnB0IikpOgogICAgICAgICAgICBjaGVja3BvaW50cy5hcHBlbmQoewogICAgICAgICAgICAgICAgIm5hbWUiOiBmLm5hbWUsCiAgICAgICAgICAgICAgICAic2l6ZSI6IGYuc3RhdCgpLnN0X3NpemUsCiAgICAgICAgICAgICAgICAibW9kaWZpZWQiOiBkYXRldGlt' +
'ZS5mcm9tdGltZXN0YW1wKGYuc3RhdCgpLnN0X210aW1lKS5pc29mb3JtYXQoKSwKICAgICAgICAgICAgfSkKCiAgICAjIEV2YWwgcmVzdWx0cwogICAgZXZhbF9wYXRoID0gY2twdF9kaXIgLyAiZXZhbF9yZXN1bHRzLmpzb24iCiAgICBldmFsX3Jlc3VsdHMgPSBOb25lCiAgICBpZiBldmFsX3BhdGguZXhpc3RzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4oZXZhbF9wYXRoLCAiciIpIGFzIGY6CiAgICAgICAgICAgICAgICBldmFsX3Jlc3VsdHMgPSBqc29uLmxvYWQoZikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgcmV0dXJuIHsKICAgICAgICAiZGVjaXNpb25GaWxlcyI6IGRlY2lzaW9uX2ZpbGVzLAogICAgICAgICJ0b3RhbERlY2lzaW9ucyI6IHN1bShkWyJkZWNpc2lvbnMiXSBmb3IgZCBpbiBkZWNpc2lvbl9maWxlcyksCiAgICAgICAgImRhdGFzZXRzIjogZGF0YXNldHMsCiAgICAgICAgImNoZWNrcG9pbnRzIjogY2hlY2twb2ludHMsCiAgICAgICAgImV2YWxSZXN1bHRzIjogZXZhbF9yZXN1bHRzLAogICAgICAgICJwb2xpY3lMb2FkZWQiOiBfcG9saWN5X3NlcnZpY2UgaXMgbm90IE5vbmUgYW5kIF9wb2xpY3lfc2VydmljZS5fbG9hZGVkIGlmIF9wb2xpY3lfc2VydmljZSBlbHNlIEZhbHNlLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUFBPIFRyYWluaW5nICsgVG91cm5hbWVudCBFbmRwb2ludHMKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCl9wcG9fc3RhdGUgPSB7CiAgICAicnVubmluZyI6IEZhbHNlLAogICAgIml0ZXJhdGlvbiI6IDAsCiAgICAidG90YWxfaXRlcmF0aW9ucyI6IDAsCiAgICAicGhhc2UiOiAiaWRsZSIsCiAgICAibWVzc2FnZSI6ICIiLAogICAgIm1ldHJpY3MiOiBOb25lLAogICAgInJlc3VsdCI6IE5vbmUsCiAgICAiZXJyb3IiOiBOb25lLAp9CgpfdG91cm5hbWVudF9zdGF0ZSA9IHsKICAgICJydW5uaW5nIjogRmFsc2UsCiAgICAicGhhc2UiOiAiaWRsZSIsCiAgICAibWVzc2FnZSI6ICIiLAogICAgInJlc3VsdCI6IE5vbmUsCiAgICAiZXJyb3IiOiBOb25lLAp9CgoKZGVmIF9ydW5fcHBvX3BpcGVsaW5lKAogICAgaXRlcmF0aW9uczogaW50LCBlcGlzb2Rlc19wZXJfaXRlcjogaW50LCBwcG9fZXBvY2hzOiBpbnQsIGJhdGNoX3NpemU6IGludCwKICAgIGxyOiBmbG9hdCwgY2xpcF9lcHNpbG9uOiBmbG9hdCwgZW50cm9weV9jb2VmZjogZmxvYXQsCiAgICBvcHBvbmVudDogc3RyLCBwbGF5c3R5bGU6IHN0ciwgbG9hZF9zdXBlcnZpc2VkOiBzdHIsCik6CiAgICAiIiJSdW4gUFBPIHRyYWluaW5nIGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3Bwb19zdGF0ZQogICAgdHJ5OgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50KQogICAgICAgIGlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgogICAgICAgIF9wcG9fc3RhdGVbInJ1bm5pbmciXSA9IFRydWUKICAgICAgICBfcHBvX3N0YXRlWyJlcnJvciJdID0gTm9uZQogICAgICAgIF9wcG9fc3RhdGVbInJlc3VsdCJdID0gTm9uZQoKICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnBwb190cmFpbmVyIGltcG9ydCBQUE9UcmFpbmVyLCBQUE9Db25maWcKCiAgICAgICAgY2twdF9kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9yb290LCAibWwiLCAibW9kZWxzIiwgImNoZWNrcG9pbnRzIikKICAgICAgICBjb25maWcgPSBQUE9Db25maWcoCiAgICAgICAgICAgIGl0ZXJhdGlvbnM9aXRlcmF0aW9ucywKICAgICAgICAgICAgZXBpc29kZXNfcGVyX2l0ZXI9ZXBpc29kZXNfcGVyX2l0ZXIsCiAgICAgICAgICAgIHBwb19lcG9jaHM9' +
'cHBvX2Vwb2NocywKICAgICAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaF9zaXplLAogICAgICAgICAgICBsZWFybmluZ19yYXRlPWxyLAogICAgICAgICAgICBjbGlwX2Vwc2lsb249Y2xpcF9lcHNpbG9uLAogICAgICAgICAgICBlbnRyb3B5X2NvZWZmPWVudHJvcHlfY29lZmYsCiAgICAgICAgICAgIG9wcG9uZW50PW9wcG9uZW50LAogICAgICAgICAgICBwbGF5c3R5bGU9cGxheXN0eWxlLAogICAgICAgICAgICBjaGVja3BvaW50X2Rpcj1ja3B0X2RpciwKICAgICAgICAgICAgbG9hZF9zdXBlcnZpc2VkPWxvYWRfc3VwZXJ2aXNlZCBpZiBsb2FkX3N1cGVydmlzZWQgZWxzZSBOb25lLAogICAgICAgICkKCiAgICAgICAgdHJhaW5lciA9IFBQT1RyYWluZXIoY29uZmlnKQoKICAgICAgICBkZWYgcHJvZ3Jlc3NfY2IoaXRlcmF0aW9uLCBtZXRyaWNzKToKICAgICAgICAgICAgX3Bwb19zdGF0ZVsiaXRlcmF0aW9uIl0gPSBpdGVyYXRpb24KICAgICAgICAgICAgX3Bwb19zdGF0ZVsicGhhc2UiXSA9ICJ0cmFpbmluZyIKICAgICAgICAgICAgX3Bwb19zdGF0ZVsibWVzc2FnZSJdID0gZiJJdGVyYXRpb24ge2l0ZXJhdGlvbn0ve2l0ZXJhdGlvbnN9IHwgV1I6IHttZXRyaWNzLmdldCgnd2luX3JhdGUnLCAwKTouMCV9IgogICAgICAgICAgICBfcHBvX3N0YXRlWyJtZXRyaWNzIl0gPSBtZXRyaWNzCgogICAgICAgIHN1bW1hcnkgPSB0cmFpbmVyLnRyYWluKHByb2dyZXNzX2NhbGxiYWNrPXByb2dyZXNzX2NiKQoKICAgICAgICBfcHBvX3N0YXRlWyJwaGFzZSJdID0gImRvbmUiCiAgICAgICAgX3Bwb19zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfcHBvX3N0YXRlWyJyZXN1bHQiXSA9IHN1bW1hcnkKICAgICAgICBfcHBvX3N0YXRlWyJtZXNzYWdlIl0gPSBmIlBQTyBjb21wbGV0ZSEgQmVzdCB3aW4gcmF0ZToge3N1bW1hcnkuZ2V0KCdiZXN0X3dpbl9yYXRlJywgMCk6LjAlfSIKCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaW1wb3J0IHRyYWNlYmFjawogICAgICAgIF9wcG9fc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3Bwb19zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfcHBvX3N0YXRlWyJlcnJvciJdID0gc3RyKGUpCiAgICAgICAgX3Bwb19zdGF0ZVsibWVzc2FnZSJdID0gZiJQUE8gZmFpbGVkOiB7ZX0iCiAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCgoKQGFwcC5wb3N0KCIvYXBpL21sL3RyYWluL3BwbyIpCmFzeW5jIGRlZiBtbF9zdGFydF9wcG8ocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgUFBPIHRyYWluaW5nIHBpcGVsaW5lLiIiIgogICAgaWYgX3Bwb19zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiUFBPIHRyYWluaW5nIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKQogICAgaWYgX3RyYWluaW5nX3N0YXRlWyJydW5uaW5nIl06CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig0MDksICJTdXBlcnZpc2VkIHRyYWluaW5nIGluIHByb2dyZXNzIOKAlCB3YWl0IGZvciBpdCB0byBmaW5pc2giKQoKICAgIGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKSBpZiBhd2FpdCByZXF1ZXN0LmJvZHkoKSBlbHNlIHt9CiAgICBpdGVyYXRpb25zID0gYm9keS5nZXQoIml0ZXJhdGlvbnMiLCAxMDApCiAgICBlcGlzb2RlcyA9IGJvZHkuZ2V0KCJlcGlzb2Rlc1Blckl0ZXIiLCA2NCkKICAgIHBwb19lcG9jaHMgPSBib2R5LmdldCgicHBvRXBvY2hzIiwgNCkKICAgIGJhdGNoX3NpemUgPSBib2R5LmdldCgiYmF0Y2hTaXplIiwgMjU2KQogICAgbHIgPSBib2R5LmdldCgibHIiLCAzZS00KQogICAgY2xpcF9lcHMgPSBib2R5LmdldCgiY2xpcEVwc2lsb24iLCAwLjIpCiAgICBlbnRyb3B5ID0gYm9keS5nZXQoImVudHJvcHlDb2VmZiIsIDAuMDEpCiAgICBvcHBvbmVudCA9IGJvZHkuZ2V0KCJvcHBvbmVudCIsICJoZXVyaXN0aWMiKQogICAgcGxheXN0eWxlID0gYm9keS5nZXQoInBsYXlzdHlsZSIsICJtaWRyYW5nZSIpCiAgICBsb2FkX3N1cCA9IGJvZHkuZ2V0KCJsb2FkU3VwZXJ2aXNlZCIsICIiKQoKICAgIF9wcG9fc3RhdGUudXBkYXRlKHsKICAgICAgICAicnVubmluZyI6IFRydWUsICJpdGVyYXRpb24iOiAwLCAidG90YWxfaXRlcmF0aW9ucyI6IGl0ZXJhdGlvbnMsCiAgICAgICAgInBoYXNlIjogInN0YXJ0aW5nIiwgIm1lc3NhZ2UiOiAiSW5pdGlhbGl6aW5nIFBQTy4uLiIsCiAgICAgICAgIm1ldHJpY3MiOiBOb25lLCAicmVz' +
'dWx0IjogTm9uZSwgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl9wcG9fcGlwZWxpbmUsCiAgICAgICAgYXJncz0oaXRlcmF0aW9ucywgZXBpc29kZXMsIHBwb19lcG9jaHMsIGJhdGNoX3NpemUsIGxyLCBjbGlwX2VwcywgZW50cm9weSwgb3Bwb25lbnQsIHBsYXlzdHlsZSwgbG9hZF9zdXApLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdGhyZWFkLnN0YXJ0KCkKCiAgICByZXR1cm4geyJzdGF0dXMiOiAic3RhcnRlZCIsICJpdGVyYXRpb25zIjogaXRlcmF0aW9uc30KCgpAYXBwLmdldCgiL2FwaS9tbC90cmFpbi9wcG8vc3RhdHVzIikKYXN5bmMgZGVmIG1sX3Bwb19zdGF0dXMoKToKICAgICIiIkdldCBQUE8gdHJhaW5pbmcgc3RhdHVzLiIiIgogICAgcmV0dXJuIGRpY3QoX3Bwb19zdGF0ZSkKCgpkZWYgX3J1bl90b3VybmFtZW50X3BpcGVsaW5lKGVwaXNvZGVzOiBpbnQsIHBsYXlzdHlsZTogc3RyKToKICAgICIiIlJ1biB0b3VybmFtZW50IGluIGEgYmFja2dyb3VuZCB0aHJlYWQuIiIiCiAgICBnbG9iYWwgX3RvdXJuYW1lbnRfc3RhdGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgcHJvamVjdF9yb290ID0gc3RyKFBhdGgoX19maWxlX18pLnBhcmVudCkKICAgICAgICBpZiBwcm9qZWN0X3Jvb3Qgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdID0gVHJ1ZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJlcnJvciJdID0gTm9uZQogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJyZXN1bHQiXSA9IE5vbmUKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicGhhc2UiXSA9ICJydW5uaW5nIgogICAgICAgIF90b3VybmFtZW50X3N0YXRlWyJtZXNzYWdlIl0gPSAiUnVubmluZyB0b3VybmFtZW50Li4uIgoKICAgICAgICBmcm9tIG1sLmV2YWwudG91cm5hbWVudCBpbXBvcnQgKAogICAgICAgICAgICBydW5fdG91cm5hbWVudCwgSGV1cmlzdGljUG9saWN5LCBSYW5kb21Qb2xpY3ksIExlYXJuZWRQb2xpY3ksCiAgICAgICAgKQoKICAgICAgICBja3B0X2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiLCAiY2hlY2twb2ludHMiKQogICAgICAgIHBvbGljaWVzID0gewogICAgICAgICAgICAiaGV1cmlzdGljIjogSGV1cmlzdGljUG9saWN5KCksCiAgICAgICAgICAgICJyYW5kb20iOiBSYW5kb21Qb2xpY3koKSwKICAgICAgICB9CgogICAgICAgIHN1cF9wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiYmVzdF9wb2xpY3kucHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN1cF9wYXRoKToKICAgICAgICAgICAgcG9saWNpZXNbInN1cGVydmlzZWQiXSA9IExlYXJuZWRQb2xpY3koc3VwX3BhdGgpCgogICAgICAgIHBwb19wYXRoID0gb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiYmVzdF9wcG8ucHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBwb19wYXRoKToKICAgICAgICAgICAgcG9saWNpZXNbInBwbyJdID0gTGVhcm5lZFBvbGljeShwcG9fcGF0aCkKCiAgICAgICAgcmVzdWx0ID0gcnVuX3RvdXJuYW1lbnQoCiAgICAgICAgICAgIHBvbGljaWVzPXBvbGljaWVzLAogICAgICAgICAgICBlcGlzb2Rlc19wZXJfbWF0Y2h1cD1lcGlzb2RlcywKICAgICAgICAgICAgcGxheXN0eWxlPXBsYXlzdHlsZSwKICAgICAgICApCgogICAgICAgICMgU2F2ZSByZXN1bHRzCiAgICAgICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJ0b3VybmFtZW50X3Jlc3VsdHMuanNvbiIpCiAgICAgICAgd2l0aCBvcGVuKG91dHB1dF9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgICAgIGpzb24uZHVtcChyZXN1bHQudG9fZGljdCgpLCBmLCBpbmRlbnQ9MikKCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInBoYXNlIl0gPSAiZG9uZSIKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdID0gRmFsc2UKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsicmVzdWx0Il0gPSByZXN1bHQudG9fZGljdCgpCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbIm1lc3NhZ2UiXSA9IGYiVG91cm5hbWVudCBjb21wbGV0ZSEge3Jlc3VsdC50b3RhbF9tYXRjaGVzfSBtYXRjaGVzIgoKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBpbXBvcnQgdHJhY2Vi' +
'YWNrCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInBoYXNlIl0gPSAiZXJyb3IiCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbInJ1bm5pbmciXSA9IEZhbHNlCiAgICAgICAgX3RvdXJuYW1lbnRfc3RhdGVbImVycm9yIl0gPSBzdHIoZSkKICAgICAgICBfdG91cm5hbWVudF9zdGF0ZVsibWVzc2FnZSJdID0gZiJUb3VybmFtZW50IGZhaWxlZDoge2V9IgogICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQoKCkBhcHAucG9zdCgiL2FwaS9tbC90b3VybmFtZW50IikKYXN5bmMgZGVmIG1sX3N0YXJ0X3RvdXJuYW1lbnQocmVxdWVzdDogRmFzdEFQSVJlcXVlc3QpOgogICAgIiIiU3RhcnQgYSB0b3VybmFtZW50IGV2YWx1YXRpb24uIiIiCiAgICBpZiBfdG91cm5hbWVudF9zdGF0ZVsicnVubmluZyJdOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oNDA5LCAiVG91cm5hbWVudCBhbHJlYWR5IGluIHByb2dyZXNzIikKCiAgICBib2R5ID0gYXdhaXQgcmVxdWVzdC5qc29uKCkgaWYgYXdhaXQgcmVxdWVzdC5ib2R5KCkgZWxzZSB7fQogICAgZXBpc29kZXMgPSBib2R5LmdldCgiZXBpc29kZXMiLCA1MCkKICAgIHBsYXlzdHlsZSA9IGJvZHkuZ2V0KCJwbGF5c3R5bGUiLCAibWlkcmFuZ2UiKQoKICAgIF90b3VybmFtZW50X3N0YXRlLnVwZGF0ZSh7CiAgICAgICAgInJ1bm5pbmciOiBUcnVlLCAicGhhc2UiOiAic3RhcnRpbmciLAogICAgICAgICJtZXNzYWdlIjogIkluaXRpYWxpemluZyB0b3VybmFtZW50Li4uIiwKICAgICAgICAicmVzdWx0IjogTm9uZSwgImVycm9yIjogTm9uZSwKICAgIH0pCgogICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgKICAgICAgICB0YXJnZXQ9X3J1bl90b3VybmFtZW50X3BpcGVsaW5lLAogICAgICAgIGFyZ3M9KGVwaXNvZGVzLCBwbGF5c3R5bGUpLAogICAgICAgIGRhZW1vbj1UcnVlLAogICAgKQogICAgdGhyZWFkLnN0YXJ0KCkKCiAgICByZXR1cm4geyJzdGF0dXMiOiAic3RhcnRlZCIsICJlcGlzb2RlcyI6IGVwaXNvZGVzfQoKCkBhcHAuZ2V0KCIvYXBpL21sL3RvdXJuYW1lbnQvc3RhdHVzIikKYXN5bmMgZGVmIG1sX3RvdXJuYW1lbnRfc3RhdHVzKCk6CiAgICAiIiJHZXQgdG91cm5hbWVudCBzdGF0dXMuIiIiCiAgICByZXR1cm4gZGljdChfdG91cm5hbWVudF9zdGF0ZSkKCgpAYXBwLmdldCgiL2FwaS9tbC90b3VybmFtZW50L3Jlc3VsdHMiKQphc3luYyBkZWYgbWxfdG91cm5hbWVudF9yZXN1bHRzKCk6CiAgICAiIiJHZXQgbGF0ZXN0IHRvdXJuYW1lbnQgcmVzdWx0cy4iIiIKICAgIHByb2plY3Rfcm9vdCA9IFBhdGgoX19maWxlX18pLnBhcmVudAogICAgcmVzdWx0c19wYXRoID0gcHJvamVjdF9yb290IC8gIm1sIiAvICJtb2RlbHMiIC8gImNoZWNrcG9pbnRzIiAvICJ0b3VybmFtZW50X3Jlc3VsdHMuanNvbiIKICAgIGlmIHJlc3VsdHNfcGF0aC5leGlzdHMoKToKICAgICAgICB3aXRoIG9wZW4ocmVzdWx0c19wYXRoLCAiciIpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBqc29uLmxvYWQoZikKICAgIHJldHVybiB7ImVycm9yIjogIk5vIHRvdXJuYW1lbnQgcmVzdWx0cyBmb3VuZC4gUnVuIGEgdG91cm5hbWVudCBmaXJzdC4ifQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU3RhdGljIEZpbGUgU2VydmluZyAoUmVhY3QgU1BBKSDigJQgTVVTVCBiZSBhZnRlciBhbGwgQVBJIHJvdXRlcwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBSZWFjdCBTUEE6IHNlcnZlIGZyb20gZnJvbnRlbmQvY29tbWFuZGVyLWFpLWxhYi11aS9kaXN0IChidWlsdCB3aXRoIFZpdGUpCl9zcGFfZGlyID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gImZyb250ZW5kIiAvICJjb21tYW5kZXItYWktbGFiLXVpIiAvICJkaXN0IgpfbGVnYWN5X3VpX2RpciA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJ1aSIKCmlmIF9zcGFfZGlyLmV4aXN0' +
'cygpOgogICAgIyBTZXJ2ZSBzdGF0aWMgYXNzZXRzIChKUywgQ1NTLCBpbWFnZXMpIGZyb20gdGhlIFNQQSBkaXN0IGZvbGRlcgogICAgX3NwYV9hc3NldHMgPSBfc3BhX2RpciAvICJhc3NldHMiCiAgICBpZiBfc3BhX2Fzc2V0cy5leGlzdHMoKToKICAgICAgICBhcHAubW91bnQoIi9hc3NldHMiLCBTdGF0aWNGaWxlcyhkaXJlY3Rvcnk9c3RyKF9zcGFfYXNzZXRzKSksIG5hbWU9InNwYS1hc3NldHMiKQoKICAgICMgU1BBIGNhdGNoLWFsbDogc2VydmUgaW5kZXguaHRtbCBmb3IgYWxsIG5vbi1BUEkgcm91dGVzIChjbGllbnQtc2lkZSByb3V0aW5nKQogICAgQGFwcC5nZXQoIi97ZnVsbF9wYXRoOnBhdGh9IikKICAgIGFzeW5jIGRlZiBfc3BhX2NhdGNoYWxsKGZ1bGxfcGF0aDogc3RyKToKICAgICAgICBmcm9tIGZhc3RhcGkucmVzcG9uc2VzIGltcG9ydCBGaWxlUmVzcG9uc2UKICAgICAgICAjIElmIHRoZSBleGFjdCBmaWxlIGV4aXN0cyBpbiBkaXN0LCBzZXJ2ZSBpdAogICAgICAgIHJlcXVlc3RlZF9maWxlID0gX3NwYV9kaXIgLyBmdWxsX3BhdGgKICAgICAgICBpZiBmdWxsX3BhdGggYW5kIHJlcXVlc3RlZF9maWxlLmV4aXN0cygpIGFuZCByZXF1ZXN0ZWRfZmlsZS5pc19maWxlKCk6CiAgICAgICAgICAgIHJldHVybiBGaWxlUmVzcG9uc2Uoc3RyKHJlcXVlc3RlZF9maWxlKSkKICAgICAgICAjIE90aGVyd2lzZSBzZXJ2ZSBpbmRleC5odG1sIChsZXQgUmVhY3QgUm91dGVyIGhhbmRsZSBpdCkKICAgICAgICByZXR1cm4gRmlsZVJlc3BvbnNlKHN0cihfc3BhX2RpciAvICJpbmRleC5odG1sIikpCgplbGlmIF9sZWdhY3lfdWlfZGlyLmV4aXN0cygpOgogICAgIyBGYWxsYmFjazogbGVnYWN5IEhUTUwgZmlsZXMKICAgIGFwcC5tb3VudCgiLyIsIFN0YXRpY0ZpbGVzKGRpcmVjdG9yeT1zdHIoX2xlZ2FjeV91aV9kaXIpLCBodG1sPVRydWUpLCBuYW1lPSJ1aSIpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBTdGFydHVwCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgcGFyc2VfYXJncygpOgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IkNvbW1hbmRlciBBSSBMYWIgQVBJIFNlcnZlciB2MyIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvcmdlLWphciIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIkZPUkdFX0pBUiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBmb3JnZS1ndWktZGVza3RvcCBqYXItd2l0aC1kZXBlbmRlbmNpZXMiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb3JnZS1kaXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJGT1JHRV9ESVIiLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkZvcmdlIHdvcmtpbmcgZGlyZWN0b3J5IChjb250YWlucyByZXMvKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvcmdlLWRlY2tzLWRpciIsIGRlZmF1bHQ9b3MuZW52aXJvbi5nZXQoIkZPUkdFX0RFQ0tTX0RJUiIsICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBDb21tYW5kZXIgZGVjayBmaWxlcyAoZGVmYXVsdDogJSVBUFBEQVRBJSUvRm9yZ2UvZGVja3MvY29tbWFuZGVyKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWxhYi1qYXIiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJMQUJfSkFSIiwgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIGNvbW1hbmRlci1haS1sYWIuamFyIChkZWZhdWx0OiBhdXRvLWRldGVjdCBmcm9tIHRhcmdldC8pIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcG9ydCIsIHR5cGU9aW50LCBkZWZhdWx0PWludChvcy5lbnZpcm9uLmdldCgiTEFCX1BPUlQiLCAiODA4MCIpKSkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0teGltaWxh' +
'ci1rZXkiLCBkZWZhdWx0PW9zLmVudmlyb24uZ2V0KCJYSU1JTEFSX0FQSV9LRVkiLCAiOTZjN2RhYjM1ZGRiZDg4MjliMDRjMGY1YmNlYTU3ZjVlZGUyMDQ5NiIpLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJYaW1pbGFyIEFQSSBrZXkgZm9yIGNhcmQgc2Nhbm5lciAodmlzdWFsIEFJIHJlY29nbml0aW9uKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXBwbHgta2V5IiwgZGVmYXVsdD1vcy5lbnZpcm9uLmdldCgiUFBMWF9BUElfS0VZIiwgInBwbHgtRzc2SGdyQVU4SW03MmJFVE1leVI0YXNBV3d0Rzh3cm15Znk2VlNLQTlEVG4wNUZxIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBlcnBsZXhpdHkgQVBJIGtleSBmb3IgQUkgZGVjayByZXNlYXJjaC9nZW5lcmF0aW9uIChlbnY6IFBQTFhfQVBJX0tFWSkiKQogICAgcmV0dXJuIHBhcnNlci5wYXJzZV9hcmdzKCkKCgpkZWYgcmVzb2x2ZV9sYWJfamFyKCkgLT4gc3RyOgogICAgdGFyZ2V0X2RpciA9IFBhdGgoX19maWxlX18pLnBhcmVudCAvICJ0YXJnZXQiCiAgICBpZiB0YXJnZXRfZGlyLmV4aXN0cygpOgogICAgICAgIGZvciBwYXR0ZXJuIGluIFsKICAgICAgICAgICAgImNvbW1hbmRlci1haS1sYWItKi1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIiwKICAgICAgICAgICAgImNvbW1hbmRlci1haS1sYWItKi1zaGFkZWQuamFyIiwKICAgICAgICAgICAgImNvbW1hbmRlci1haS1sYWItKi5qYXIiLAogICAgICAgIF06CiAgICAgICAgICAgIGphcnMgPSBzb3J0ZWQodGFyZ2V0X2Rpci5nbG9iKHBhdHRlcm4pKQogICAgICAgICAgICBqYXJzID0gW2ogZm9yIGogaW4gamFycyBpZiBub3Qgai5uYW1lLnN0YXJ0c3dpdGgoIm9yaWdpbmFsLSIpXQogICAgICAgICAgICBpZiBqYXJzOgogICAgICAgICAgICAgICAgcmV0dXJuIHN0cihqYXJzWzBdKQogICAgcmV0dXJuICIiCgoKZGVmIHJlc29sdmVfZm9yZ2VfZGVja3NfZGlyKCkgLT4gc3RyOgogICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAgYXBwZGF0YSA9IG9zLmVudmlyb24uZ2V0KCJBUFBEQVRBIiwgIiIpCiAgICAgICAgaWYgYXBwZGF0YToKICAgICAgICAgICAgY2FuZGlkYXRlID0gb3MucGF0aC5qb2luKGFwcGRhdGEsICJGb3JnZSIsICJkZWNrcyIsICJjb21tYW5kZXIiKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGNhbmRpZGF0ZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlCiAgICBob21lID0gUGF0aC5ob21lKCkKICAgIGZvciBjYW5kaWRhdGUgaW4gWwogICAgICAgIGhvbWUgLyAiLmZvcmdlIiAvICJkZWNrcyIgLyAiY29tbWFuZGVyIiwKICAgICAgICBob21lIC8gIkZvcmdlIiAvICJkZWNrcyIgLyAiY29tbWFuZGVyIiwKICAgIF06CiAgICAgICAgaWYgY2FuZGlkYXRlLmlzX2RpcigpOgogICAgICAgICAgICByZXR1cm4gc3RyKGNhbmRpZGF0ZSkKICAgIHJldHVybiAiIgoKCmRlZiBsb2FkX2NvbW1hbmRlcl9tZXRhKCk6CiAgICAiIiJMb2FkIGNvbW1hbmRlciBtZXRhIG1hcHBpbmcgZnJvbSBmaWxlIG9yIHVzZSBidWlsdGlucy4iIiIKICAgIGdsb2JhbCBDT01NQU5ERVJfTUVUQQogICAgbWV0YV9wYXRoID0gUGF0aChfX2ZpbGVfXykucGFyZW50IC8gImNvbW1hbmRlci1tZXRhLmpzb24iCiAgICBpZiBtZXRhX3BhdGguZXhpc3RzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4obWV0YV9wYXRoLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgICAgICBDT01NQU5ERVJfTUVUQSA9IGpzb24ubG9hZChmKQogICAgICAgICAgICBwcmludChmIiAgTWV0YTogICAgICAgICBMb2FkZWQge2xlbihDT01NQU5ERVJfTUVUQSl9IGNvbW1hbmRlcnMgZnJvbSB7bWV0YV9wYXRofSIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcHJpbnQoZiIgIFdBUk5JTkc6IEZhaWxlZCB0byBsb2FkIGNvbW1hbmRlci1tZXRhLmpzb246IHtlfSIpCgogICAgQ09NTUFOREVSX01FVEEgPSBCVUlMVElOX0NPTU1BTkRFUlMKICAgIHByaW50KGYiICBNZXRhOiAgICAgICAgIHtsZW4oQ09NTUFOREVSX01FVEEpfSBidWlsdC1pbiBjb21tYW5kZXJzIikKCgpkZWYgbWFpbigpOgogICAgYXJncyA9IHBhcnNlX2FyZ3MoKQoKICAgIENGRy5mb3JnZV9qYXIgPSBhcmdzLmZvcmdlX2phcgogICAgQ0ZHLmZvcmdlX2RpciA9IGFyZ3MuZm9yZ2VfZGlyCiAgICBDRkcuZm9yZ2VfZGVja3Nf' +
'ZGlyID0gYXJncy5mb3JnZV9kZWNrc19kaXIgb3IgcmVzb2x2ZV9mb3JnZV9kZWNrc19kaXIoKQogICAgQ0ZHLmxhYl9qYXIgPSBhcmdzLmxhYl9qYXIgb3IgcmVzb2x2ZV9sYWJfamFyKCkKICAgIENGRy5wb3J0ID0gYXJncy5wb3J0CiAgICBDRkcueGltaWxhcl9hcGlfa2V5ID0gYXJncy54aW1pbGFyX2tleQogICAgQ0ZHLnBwbHhfYXBpX2tleSA9IGFyZ3MucHBseF9rZXkKCiAgICBwcmludCgi4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXIikKICAgIHByaW50KCLilZEgICAgICBDb21tYW5kZXIgQUkgTGFiIOKAlCBBUEkgU2VydmVyICB2My4wLjAgICAgICDilZEiKQogICAgcHJpbnQoIuKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnSIpCiAgICBwcmludCgpCiAgICBwcmludChmIiAgRm9yZ2UgSkFSOiAgICB7Q0ZHLmZvcmdlX2phcn0iKQogICAgcHJpbnQoZiIgIEZvcmdlIERpcjogICAge0NGRy5mb3JnZV9kaXJ9IikKICAgIHByaW50KGYiICBEZWNrcyBEaXI6ICAgIHtDRkcuZm9yZ2VfZGVja3NfZGlyfSIpCiAgICBwcmludChmIiAgTGFiIEpBUjogICAgICB7Q0ZHLmxhYl9qYXJ9IikKICAgIHByaW50KGYiICBSZXN1bHRzIERpcjogIHtDRkcucmVzdWx0c19kaXJ9IikKICAgIHByaW50KGYiICBQb3J0OiAgICAgICAgIHtDRkcucG9ydH0iKQogICAgcHJpbnQoZiIgIFhpbWlsYXI6ICAgICAgeydjb25maWd1cmVkJyBpZiBDRkcueGltaWxhcl9hcGlfa2V5IGVsc2UgJ05PVCBTRVQgKHNjYW5uZXIgd2lsbCBmYWlsKSd9IikKICAgIHByaW50KGYiICBQZXJwbGV4aXR5OiAgIHsnY29uZmlndXJlZCcgaWYgQ0ZHLnBwbHhfYXBpX2tleSBlbHNlICdOT1QgU0VUIChBSSByZXNlYXJjaC9nZW4gZGlzYWJsZWQpJ30iKQogICAgajE3ID0gZ2V0X2phdmExNygpCiAgICBwcmludChmIiAgSmF2YSAxNzogICAgICB7ajE3IGlmIGoxNyAhPSAnamF2YScgZWxzZSAnTk9UIEZPVU5EIChiYXRjaCBzaW0gbWF5IGZhaWwgb24gSmF2YSAyNSspJ30iKQogICAgcHJpbnQoZiIgIExNIFN0dWRpbzogICAgaHR0cDovLzE5Mi4xNjguMC4xMjI6MTIzNCIpCgogICAgbG9hZF9jb21tYW5kZXJfbWV0YSgpCiAgICBkb3dubG9hZF9wcmVjb25fZGF0YWJhc2UoKSAgIyBBdXRvLWRvd25sb2FkcyBhbGwgMTYzKyBDb21tYW5kZXIgcHJlY29ucyBvbiBmaXJzdCBydW4KICAgIGluaXRfY29sbGVjdGlvbl9kYigpCiAgICBpbml0X2NvYWNoX3NlcnZpY2UoKQoKICAgICMgWGltaWxhciBBUEkga2V5IGNoZWNrCiAgICBpZiBub3QgQ0ZHLnhpbWlsYXJfYXBpX2tleToKICAgICAgICBwcmludCgiICBXQVJOSU5HOiAtLXhpbWlsYXIta2V5IG5vdCBzZXQuIENhcmQgc2Nhbm5lciB3aWxsIG5vdCB3b3JrLiIpCiAgICAgICAgcHJpbnQoIiAgICAgICAgICAgU2V0IHZpYSBDTEk6IC0teGltaWxhci1rZXkgWU9VUl9LRVkiKQogICAgICAgIHByaW50KCIgICAgICAgICAgIE9yIGVudiB2YXI6ICBYSU1JTEFSX0FQSV9LRVk9WU9VUl9LRVkiKQoKICAgIGlmIG5vdCBDRkcuZm9yZ2VfamFyOgogICAgICAgIHByaW50KCJXQVJOSU5HOiAtLWZvcmdlLWphciBub3Qgc2V0LiAvYXBpL2xhYi9zdGFydCB3aWxsIGZhaWwuIikKICAgIGlmIG5vdCBDRkcubGFiX2phcjoKICAgICAgICBwcmludCgiV0FSTklORzogTGFiIEpBUiBub3QgZm91bmQuIEJ1aWxkIHdpdGg6IG12biBwYWNrYWdlIC1Ec2tpcFRlc3RzIikKICAgIGlmIG5vdCBDRkcuZm9yZ2VfZGVja3NfZGlyOgogICAgICAgIHByaW50KCJXQVJOSU5HOiBDb21tYW5kZXIgZGVja3MgZGlyIG5vdCBmb3VuZC4gL2FwaS9sYWIvZGVja3Mgd2lsbCByZXR1cm4gZW1wdHkuIikKCiAgICBwcmludCgpCiAgICBwcmludChmIiAgU3RhcnRpbmcgc2VydmVyIG9uIGh0dHA6Ly9sb2NhbGhvc3Q6e0NGRy5wb3J0fSIpCiAgICBpZiBfc3BhX2Rpci5leGlzdHMoKToKICAgICAgICBwcmludChmIiAgV2ViIFVJOiAgICAgICBodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0vICAoUmVhY3QgU1BBKSIpCiAg' +
'ICAgICAgcHJpbnQoZiIgIFJvdXRlczogICAgICAgLyAoQmF0Y2ggU2ltKSwgL2NvbGxlY3Rpb24sIC9kZWNrcywgL2F1dG9nZW4sIC9zaW11bGF0b3IsIC9jb2FjaCwgL3RyYWluaW5nIikKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoZiIgIFdlYiBVSTogICAgICAgaHR0cDovL2xvY2FsaG9zdDp7Q0ZHLnBvcnR9L2luZGV4Lmh0bWwgIChsZWdhY3kgSFRNTCkiKQogICAgICAgIHByaW50KGYiICBOT1RFOiBSZWFjdCBTUEEgbm90IGJ1aWx0LiBSdW46IGNkIGZyb250ZW5kL2NvbW1hbmRlci1haS1sYWItdWkgJiYgbnBtIGluc3RhbGwgJiYgbnBtIHJ1biBidWlsZCIpCiAgICBwcmludChmIiAgQVBJIGRvY3M6ICAgICBodHRwOi8vbG9jYWxob3N0OntDRkcucG9ydH0vZG9jcyIpCiAgICBwcmludCgpCgogICAgaW1wb3J0IHV2aWNvcm4KICAgIHV2aWNvcm4ucnVuKGFwcCwgaG9zdD0iMC4wLjAuMCIsIHBvcnQ9Q0ZHLnBvcnQsIGxvZ19sZXZlbD0iaW5mbyIpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo='
Install-B64 -R 'lab_api.py' -B $b
# ml/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\__init__.py' -B $b
# ml/actions/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\actions\__init__.py' -B $b
# ml/actions/labeler.py (10,228 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIEFjdGlvbiBMYWJlbGVyCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApNYXBzIHJhdyBGb3JnZSBhY3Rpb24gcmVjb3JkcyAoZnJvbSBEZWNpc2lvblNuYXBzaG90IEpTT05MKQp0byBvbmUgb2YgOCBtYWNyby1hY3Rpb24gbGFiZWxzIGZvciBzdXBlcnZpc2VkIHBvbGljeSBsZWFybmluZy4KCkNsYXNzaWZpY2F0aW9uIGxvZ2ljOgogIDEuIENoZWNrIGFjdGlvbi50eXBlIChjYXN0LCBhdHRhY2ssIGxhbmQsIGNhc3RfY29tbWFuZGVyLCBwYXNzKQogIDIuIEZvciAiY2FzdCIgYWN0aW9ucywgY2xhc3NpZnkgYnkgY2FyZCBvcmFjbGUgdGV4dCAvIGNhcmQgdHlwZSBrZXl3b3JkcwogIDMuIEZvciBhbWJpZ3VvdXMgY2FzZXMsIHVzZSB0aGUgcmF3IGxvZyBsaW5lIGFuZCBjYXJkIG5hbWUgaGV1cmlzdGljcwoKTWFjcm8tYWN0aW9ucyAoZnJvbSBtbC5jb25maWcuc2NvcGUpOgogIDA6IENBU1RfQ1JFQVRVUkUgICAg4oCUIFBsYXkgYSBjcmVhdHVyZQogIDE6IENBU1RfUkVNT1ZBTCAgICAg4oCUIENhc3QgcmVtb3ZhbCAvIGludGVyYWN0aW9uCiAgMjogQ0FTVF9EUkFXICAgICAgICDigJQgQ2FzdCBjYXJkLWRyYXcgc3BlbGwKICAzOiBDQVNUX1JBTVAgICAgICAgIOKAlCBDYXN0IHJhbXAgc3BlbGwgLyBtYW5hIHJvY2sKICA0OiBDQVNUX0NPTU1BTkRFUiAgIOKAlCBDYXN0IHlvdXIgY29tbWFuZGVyCiAgNTogQVRUQUNLX09QUE9ORU5UICDigJQgQXR0YWNrIGRlY2xhcmF0aW9uCiAgNjogSE9MRF9NQU5BICAgICAgICDigJQgUGFzcyBwcmlvcml0eSB3aXRoIG1hbmEgb3BlbgogIDc6IFBBU1MgICAgICAgICAgICAg4oCUIFBhc3Mgd2l0aCBub3RoaW5nIHRvIGRvCiIiIgoKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwsIFR1cGxlCgppbXBvcnQgbnVtcHkgYXMgbnAKCmltcG9ydCBzeXMKc3lzLnBhdGguaW5zZXJ0KDAsIHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50LnBhcmVudCkpCmZyb20gbWwuY29uZmlnLnNjb3BlIGltcG9ydCAoCiAgICBNYWNyb0FjdGlvbiwgQUNUSU9OX1RPX0lEWCwgTlVNX0FDVElPTlMsIEFDVElPTl9LRVlXT1JEUywKKQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIm1sLmxhYmVsZXIiKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ2FyZCBUeXBlIEtleXdvcmQgRGF0YWJhc2VzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIEtub3duIHJlbW92YWwgc3BlbGxzIChwYXJ0aWFsIGxpc3Qg4oCUIGV4cGFuZGVkIGZyb20gY29tbW9uIENvbW1hbmRlciBzdGFwbGVzKQpSRU1PVkFMX0tFWVdPUkRTID0gewogICAgImRlc3Ryb3kiLCAiZXhpbGUiLCAic2FjcmlmaWNlIiwgImNvdW50ZXIiLCAiYm91bmNlIiwgInJldHVybi4qdG8uKmhhbmQiLAogICAgIi1cXGQrLy1cXGQrIiwgImRhbWFnZSB0byIsICJmaWdodCIsICJkZWF0aHRvdWNoIiwKfQpSRU1PVkFMX0NBUkRfTkFNRVMgPSB7CiAgICAic3dvcmRzIHRvIHBsb3dzaGFyZXMiLCAicGF0aCB0byBleGlsZSIsICJiZWFzdCB3aXRoaW4iLCAiY2hhb3Mgd2FycCIsCiAgICAiY291bnRlcnNwZWxsIiwgInN3YW4gc29uZyIsICJuZWdhdGUiLCAiYXJjYW5lIGRlbmlhbCIsICJkb29tYmxhZGUiLAogICAgImRvb20gYmxhZGUiLCAiZ28gZm9yIHRoZSB0aHJvYXQiLCAidGVybWluYXRlIiwgImFuZ3Vpc2hlZCB1bm1ha2luZyIsCiAgICAidmluZGljYXRlIiwgImdlbmVyb3VzIGdpZnQiLCAicmFwaWQgaHlicmlkaXphdGlvbiIsICJwb25naWZ5IiwKICAgICJjeWNsb25pYyByaWZ0IiwgImZhcmV3ZWxsIiwg' +
'InRveGljIGRlbHVnZSIsICJibGFzcGhlbW91cyBhY3QiLAogICAgIndyYXRoIG9mIGdvZCIsICJkYW1uYXRpb24iLCAic3VwcmVtZSB2ZXJkaWN0IiwgInZhbmRhbGJsYXN0IiwKICAgICJrcm9zYW4gZ3JpcCIsICJuYXR1cmUncyBjbGFpbSIsICJyZXR1cm4gdG8gZHVzdCIsICJkZXNwYXJrIiwKICAgICJhc3Nhc3NpbidzIHRyb3BoeSIsICJhYnJ1cHQgZGVjYXkiLCAiZm9yY2Ugb2Ygd2lsbCIsCiAgICAibWFuYSBkcmFpbiIsICJmb3JjZSBvZiBuZWdhdGlvbiIsICJkZWZsZWN0aW5nIHN3YXQiLAogICAgImZpZXJjZSBndWFyZGlhbnNoaXAiLCAiZGVhZGx5IHJvbGxpY2siLCAic251ZmYgb3V0IiwKICAgICJtdXJkZXJvdXMgcmlkZXIiLCAic2hyaWVrbWF3IiwgInJhdmVub3VzIGNodXBhY2FicmEiLAogICAgImJhbmUgb2YgcHJvZ3Jlc3MiLCAiYXVzdGVyZSBjb21tYW5kIiwgIm1lcmNpbGVzcyBldmljdGlvbiIsCiAgICAiZGVjcmVlIG9mIHBhaW4iLCAiaW4gZ2FycnVrJ3Mgd2FrZSIsICJwbGFndWUgd2luZCIsCiAgICAiZmlyZSBjb3ZlbmFudCIsICJpbXByaXNvbmVkIGluIHRoZSBtb29uIiwgImRhcmtzdGVlbCBtdXRhdGlvbiIsCiAgICAia2Vucml0aCdzIHRyYW5zZm9ybWF0aW9uIiwgInNvbmcgb2YgdGhlIGRyeWFkcyIsCn0KCiMgS25vd24gZHJhdyBzcGVsbHMKRFJBV19LRVlXT1JEUyA9IHsKICAgICJkcmF3IiwgInNjcnkiLCAibG9vayBhdCB0aGUgdG9wIiwgInJldmVhbC4qbGlicmFyeSIsCiAgICAic2VhcmNoIHlvdXIgbGlicmFyeS4qaGFuZCIsICJpbXB1bHNlIiwgImJyYWluc3Rvcm0iLAp9CkRSQVdfQ0FSRF9OQU1FUyA9IHsKICAgICJyaHlzdGljIHN0dWR5IiwgIm15c3RpYyByZW1vcmEiLCAicGh5cmV4aWFuIGFyZW5hIiwgInN5bHZhbiBsaWJyYXJ5IiwKICAgICJoYXJtb25pemUiLCAiYmx1ZSBzdW4ncyB6ZW5pdGgiLCAicHVsbCBmcm9tIHRvbW9ycm93IiwKICAgICJ3aW5kZmFsbCIsICJ3aGVlbCBvZiBmb3J0dW5lIiwgInRpbWV0d2lzdGVyIiwgImJyYWluc3Rvcm0iLAogICAgInBvbmRlciIsICJwcmVvcmRhaW4iLCAib3B0IiwgImNvbnNpZGVyIiwgInRyZWFzdXJlIGNydWlzZSIsCiAgICAiZGlnIHRocm91Z2ggdGltZSIsICJmYWN0IG9yIGZpY3Rpb24iLCAibmlnaHRzIHdoaXNwZXIiLAogICAgIm5pZ2h0cyB3aGlzcGVyIiwgInNpZ24gaW4gYmxvb2QiLCAicmVhZCB0aGUgYm9uZXMiLAogICAgInBhaW5mdWwgdHJ1dGhzIiwgImFtYml0aW9uJ3MgY29zdCIsICJwcm9taXNlIG9mIHBvd2VyIiwKICAgICJuZWNyb3BvdGVuY2UiLCAiZGFyayBjb25maWRhbnQiLCAidG9za2kgYmVhcmVyIG9mIHNlY3JldHMiLAogICAgImJlYXN0IHdoaXNwZXJlciIsICJndWFyZGlhbiBwcm9qZWN0IiwgInRoZSBncmVhdCBoZW5nZSIsCiAgICAic2t1bGxjbGFtcCIsICJlc3BlciBzZW50aW5lbCIsICJhcmNoaXZpc3Qgb2Ygb2dobWEiLAogICAgIm1pbmQncyBleWUiLCAiY29uc2VjcmF0ZWQgc3BoaW54IiwgImFuY2llbnQgY3JhdmluZyIsCiAgICAiZmFpdGhsZXNzIGxvb3RpbmciLCAiY2F0aGFydGljIHJldW5pb24iLCAidGhyaWxsIG9mIHBvc3NpYmlsaXR5IiwKICAgICJqZXNrYSdzIHdpbGwiLCAidmFsYWt1dCBhd2FrZW5pbmciLCAic3Rpbmdpbmcgc3R1ZHkiLAogICAgIm5pZ2h0J3Mgd2hpc3BlciIsICJub3Rpb24gdGhpZWYiLCAidHltbmEgdGhlIHdlYXZlciIsCiAgICAic2hhbWFuaWMgcmV2ZWxhdGlvbiIsICJyaXNoa2FyJ3MgZXhwZXJ0aXNlIiwgInJldHVybiBvZiB0aGUgd2lsZHNwZWFrZXIiLAogICAgImdhcnJ1aydzIHVwcmlzaW5nIiwgImVsZW1lbnRhbCBib25kIiwgImtpbmRyZWQgZGlzY292ZXJ5IiwKICAgICJjb2FzdGFsIHBpcmFjeSIsICJyZWNvbm5haXNzYW5jZSBtaXNzaW9uIiwgImJpZGVudCBvZiB0aGFzc2EiLAp9CgojIEtub3duIHJhbXAgY2FyZHMKUkFNUF9LRVlXT1JEUyA9IHsKICAgICJhZGQgeyIsICJhZGQgb25lIG1hbmEiLCAibWFuYSBvZiBhbnkgY29sb3IiLAogICAgImxhbmQuKm9udG8gdGhlIGJhdHRsZWZpZWxkIiwgInNlYXJjaC4qYmFzaWMgbGFuZC4qYmF0dGxlZmllbGQiLAp9ClJBTVBfQ0FSRF9OQU1FUyA9IHsKICAgICJzb2wgcmluZyIsICJtYW5hIGNyeXB0IiwgIm1hbmEgdmF1bHQiLCAiYXJjYW5lIHNpZ25ldCIsCiAgICAiY29tbWFuZGVyJ3Mgc3BoZXJlIiwgImNocm9tYXRpYyBsYW50ZXJuIiwgImZlbGx3YXIgc3RvbmUiLAogICAgIm1pbmQgc3RvbmUiLCAidGhvdWdodCB2ZXNz' +
'ZWwiLCAidGhyYW4gZHluYW1vIiwgIndvcm4gcG93ZXJzdG9uZSIsCiAgICAiZ2lsZGVkIGxvdHVzIiwgImhlZHJvbiBhcmNoaXZlIiwgImV2ZXJmbG93aW5nIGNoYWxpY2UiLAogICAgImNvYWxpdGlvbiByZWxpYyIsICJwcmlzbWF0aWMgbGVucyIsICJzaWduZXRzIiwgICMgY2F0Y2gtYWxsIHBhcnRpYWwKICAgICJ0YWxpc21hbiIsICAjIGNhdGNoLWFsbCBmb3IgdGFsaXNtYW4gY3ljbGUKICAgICJjdWx0aXZhdGUiLCAia29kYW1hJ3MgcmVhY2giLCAicmFtcGFudCBncm93dGgiLCAiZmFyc2VlayIsCiAgICAibmF0dXJlJ3MgbG9yZSIsICJ0aHJlZSB2aXNpdHMiLCAic2t5c2hyb3VkIGNsYWltIiwKICAgICJleHBsb3NpdmUgdmVnZXRhdGlvbiIsICJtaWdyYXRpb24gcGF0aCIsICJjaXJjdWl0b3VzIHJvdXRlIiwKICAgICJ0ZW1wdCB3aXRoIGRpc2NvdmVyeSIsICJob3VyIG9mIHByb21pc2UiLCAiYm91bmRsZXNzIHJlYWxtcyIsCiAgICAic2FrdXJhLXRyaWJlIGVsZGVyIiwgIndvb2QgZWx2ZXMiLCAiZmFyaGF2ZW4gZWxmIiwKICAgICJzb2xlbW4gc2ltdWxhY3J1bSIsICJidXJuaXNoZWQgaGFydCIsICJrbmlnaHQgb2YgdGhlIHdoaXRlIG9yY2hpZCIsCiAgICAiZG9ja3NpZGUgZXh0b3J0aW9uaXN0IiwgInNtb3RoZXJpbmcgdGl0aGUiLCAiYmxhY2sgbWFya2V0IiwKICAgICJjYWJhbCBjb2ZmZXJzIiwgIm55a3Rob3Mgc2hyaW5lIHRvIG55eCIsICJhbmNpZW50IHRvbWIiLAogICAgImJpcmRzIG9mIHBhcmFkaXNlIiwgImxsYW5vd2FyIGVsdmVzIiwgImVsdmlzaCBteXN0aWMiLAogICAgImZ5bmRob3JuIGVsdmVzIiwgImF2YWN5bidzIHBpbGdyaW0iLCAiZWx2ZXMgb2YgZGVlcCBzaGFkb3ciLAogICAgImJsb29tIHRlbmRlciIsICJwcmllc3Qgb2YgdGl0YW5pYSIsICJzZWx2YWxhIGhlYXJ0IG9mIHRoZSB3aWxkcyIsCn0KCiMgS25vd24gY3JlYXR1cmUtdHlwZSBpbmRpY2F0b3JzCkNSRUFUVVJFX0tFWVdPUkRTID0gewogICAgImNyZWF0dXJlIiwgInRva2VuIiwgImVudGVycyB0aGUgYmF0dGxlZmllbGQiLAp9CgoKZGVmIGxhYmVsX2FjdGlvbihkZWNpc2lvbjogZGljdCkgLT4gaW50OgogICAgIiIiCiAgICBDbGFzc2lmeSBhIHNpbmdsZSBkZWNpc2lvbiBzbmFwc2hvdCdzIGFjdGlvbiBpbnRvIGEgbWFjcm8tYWN0aW9uIGluZGV4LgoKICAgIEFyZ3M6CiAgICAgICAgZGVjaXNpb246IERpY3QgbG9hZGVkIGZyb20gSlNPTkwgbGluZQoKICAgIFJldHVybnM6CiAgICAgICAgSW50ZWdlciBpbmRleCBpbnRvIE1hY3JvQWN0aW9uIGVudW0gKDAtNykKICAgICIiIgogICAgYWN0aW9uID0gZGVjaXNpb24uZ2V0KCJhY3Rpb24iLCB7fSkKICAgIGFjdGlvbl90eXBlID0gYWN0aW9uLmdldCgidHlwZSIsICIiKS5sb3dlcigpCiAgICBjYXJkX25hbWUgPSAoYWN0aW9uLmdldCgiY2FyZCIsICIiKSBvciAiIikubG93ZXIoKS5zdHJpcCgpCiAgICByYXdfbGluZSA9IChhY3Rpb24uZ2V0KCJyYXciLCAiIikgb3IgIiIpLmxvd2VyKCkKCiAgICAjIOKUgOKUgCBEaXJlY3QgdHlwZSBtYXRjaGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICAjIENvbW1hbmRlciBjYXN0IGlzIHVuYW1iaWd1b3VzCiAgICBpZiBhY3Rpb25fdHlwZSA9PSAiY2FzdF9jb21tYW5kZXIiOgogICAgICAgIHJldHVybiBBQ1RJT05fVE9fSURYW01hY3JvQWN0aW9uLkNBU1RfQ09NTUFOREVSXQoKICAgICMgQXR0YWNrIGlzIHVuYW1iaWd1b3VzCiAgICBpZiBhY3Rpb25fdHlwZSA9PSAiYXR0YWNrIjoKICAgICAgICByZXR1cm4gQUNUSU9OX1RPX0lEWFtNYWNyb0FjdGlvbi5BVFRBQ0tfT1BQT05FTlRdCgogICAgIyBMYW5kIHBsYXkg4oaSIGNsYXNzaWZ5IGFzIENBU1RfUkFNUCAoZGV2ZWxvcGluZyBtYW5hIGlzIHJhbXApCiAgICBpZiBhY3Rpb25fdHlwZSA9PSAibGFuZCI6CiAgICAgICAgcmV0dXJuIEFDVElPTl9UT19JRFhbTWFjcm9BY3Rpb24uQ0FTVF9SQU1QXQoKICAgICMgUGFzcyAvIGhvbGQgbWFuYQogICAgaWYgYWN0aW9uX3R5cGUgaW4gKCJwYXNzIiwgImhvbGQiKToKICAgICAgICAjIENoZWNrIGlmIHBsYXllciBoYWQgbWFuYSBvcGVuIChmcm9tIHN0YXRlKQogICAgICAgIGFjdGl2ZV9zZWF0ID0gZGVjaXNpb24uZ2V0KCJhY3RpdmVfc2VhdCIsIDApCiAgICAgICAgcGxheWVycyA9IGRlY2lzaW9uLmdldCgicGxheWVycyIsIFtdKQogICAgICAgIGlm' +
'IGFjdGl2ZV9zZWF0IDwgbGVuKHBsYXllcnMpOgogICAgICAgICAgICBtYW5hID0gcGxheWVyc1thY3RpdmVfc2VhdF0uZ2V0KCJtYW5hIiwgMCkKICAgICAgICAgICAgaWYgbWFuYSA+PSAyOgogICAgICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9UT19JRFhbTWFjcm9BY3Rpb24uSE9MRF9NQU5BXQogICAgICAgIHJldHVybiBBQ1RJT05fVE9fSURYW01hY3JvQWN0aW9uLlBBU1NdCgogICAgIyDilIDilIAgQ2FzdCBhY3Rpb25zOiBjbGFzc2lmeSBieSBjYXJkIGlkZW50aXR5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGlmIGFjdGlvbl90eXBlID09ICJjYXN0IjoKICAgICAgICAjIDEuIENoZWNrIGtub3duIGNhcmQgbmFtZSBkYXRhYmFzZXMKICAgICAgICBpZiBjYXJkX25hbWUgaW4gUkVNT1ZBTF9DQVJEX05BTUVTIG9yIF9wYXJ0aWFsX21hdGNoKGNhcmRfbmFtZSwgUkVNT1ZBTF9DQVJEX05BTUVTKToKICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9UT19JRFhbTWFjcm9BY3Rpb24uQ0FTVF9SRU1PVkFMXQoKICAgICAgICBpZiBjYXJkX25hbWUgaW4gRFJBV19DQVJEX05BTUVTIG9yIF9wYXJ0aWFsX21hdGNoKGNhcmRfbmFtZSwgRFJBV19DQVJEX05BTUVTKToKICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9UT19JRFhbTWFjcm9BY3Rpb24uQ0FTVF9EUkFXXQoKICAgICAgICBpZiBjYXJkX25hbWUgaW4gUkFNUF9DQVJEX05BTUVTIG9yIF9wYXJ0aWFsX21hdGNoKGNhcmRfbmFtZSwgUkFNUF9DQVJEX05BTUVTKToKICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9UT19JRFhbTWFjcm9BY3Rpb24uQ0FTVF9SQU1QXQoKICAgICAgICAjIDIuIENoZWNrIHJhdyBsb2cgbGluZSBmb3Iga2V5d29yZCBwYXR0ZXJucwogICAgICAgIGZvciBrZXl3b3JkIGluIFJFTU9WQUxfS0VZV09SRFM6CiAgICAgICAgICAgIGlmIHJlLnNlYXJjaChrZXl3b3JkLCByYXdfbGluZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1RPX0lEWFtNYWNyb0FjdGlvbi5DQVNUX1JFTU9WQUxdCgogICAgICAgIGZvciBrZXl3b3JkIGluIERSQVdfS0VZV09SRFM6CiAgICAgICAgICAgIGlmIHJlLnNlYXJjaChrZXl3b3JkLCByYXdfbGluZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1RPX0lEWFtNYWNyb0FjdGlvbi5DQVNUX0RSQVddCgogICAgICAgIGZvciBrZXl3b3JkIGluIFJBTVBfS0VZV09SRFM6CiAgICAgICAgICAgIGlmIHJlLnNlYXJjaChrZXl3b3JkLCByYXdfbGluZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gQUNUSU9OX1RPX0lEWFtNYWNyb0FjdGlvbi5DQVNUX1JBTVBdCgogICAgICAgICMgMy4gRGVmYXVsdDogaWYgaXQncyBhIHNwZWxsIGNhc3QgYW5kIG5vdCByZWNvZ25pemVkLCBhc3N1bWUgY3JlYXR1cmUKICAgICAgICAjICAgIChtb3N0IGNhc3RzIGluIENvbW1hbmRlciBhcmUgY3JlYXR1cmVzIG9yIGNyZWF0dXJlLWFkamFjZW50KQogICAgICAgIHJldHVybiBBQ1RJT05fVE9fSURYW01hY3JvQWN0aW9uLkNBU1RfQ1JFQVRVUkVdCgogICAgIyDilIDilIAgRmFsbGJhY2sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICByZXR1cm4gQUNUSU9OX1RPX0lEWFtNYWNyb0FjdGlvbi5QQVNTXQoKCmRlZiBfcGFydGlhbF9tYXRjaChuYW1lOiBzdHIsIG5hbWVfc2V0OiBzZXQpIC0+IGJvb2w6CiAgICAiIiJDaGVjayBpZiBjYXJkIG5hbWUgcGFydGlhbGx5IG1hdGNoZXMgYW55IG5hbWUgaW4gdGhlIHNldC4iIiIKICAgIGZvciBrbm93biBpbiBuYW1lX3NldDoKICAgICAgICBpZiBrbm93biBpbiBuYW1lIG9yIG5hbWUgaW4ga25vd246CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgbGFiZWxfZGVjaXNpb25zX2ZpbGUoanNvbmxfcGF0aDogc3RyKSAtPiBUdXBsZVtucC5uZGFycmF5LCBMaXN0W2RpY3RdXToKICAgICIiIgogICAgTGFiZWwgYWxsIGRlY2lzaW9ucyBpbiBhIEpTT05MIGZpbGUuCgogICAgUmV0dXJuczoKICAgICAgICAobGFiZWxzLCByYXdfZGVjaXNpb25zKSB3aGVyZToKICAgICAgICAgIGxhYmVsczogbnAubmRhcnJheSBvZiBzaGFwZSAoTiwpIHdpdGggaW50IGFjdGlvbiBpbmRpY2VzCiAgICAgICAgICByYXdfZGVjaXNpb25zOiBsaXN0IG9mIG9yaWdpbmFsIEpTT04gZGljdHMKICAgICIiIgogICAg' +
'bGFiZWxzID0gW10KICAgIHJhdyA9IFtdCgogICAgd2l0aCBvcGVuKGpzb25sX3BhdGgsICJyIikgYXMgZjoKICAgICAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUoZik6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZWNpc2lvbiA9IGpzb24ubG9hZHMobGluZSkKICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWxfYWN0aW9uKGRlY2lzaW9uKQogICAgICAgICAgICAgICAgbGFiZWxzLmFwcGVuZChsYWJlbCkKICAgICAgICAgICAgICAgIHJhdy5hcHBlbmQoZGVjaXNpb24pCiAgICAgICAgICAgIGV4Y2VwdCAoanNvbi5KU09ORGVjb2RlRXJyb3IsIEV4Y2VwdGlvbikgYXMgZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJTa2lwcGluZyBsaW5lICVkOiAlcyIsIGksIGUpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgIHJldHVybiBucC5hcnJheShsYWJlbHMsIGR0eXBlPW5wLmludDY0KSwgcmF3CgoKZGVmIHByaW50X2xhYmVsX2Rpc3RyaWJ1dGlvbihsYWJlbHM6IG5wLm5kYXJyYXkpIC0+IERpY3Rbc3RyLCBpbnRdOgogICAgIiIiUHJpbnQgYW5kIHJldHVybiB0aGUgZGlzdHJpYnV0aW9uIG9mIGFjdGlvbiBsYWJlbHMuIiIiCiAgICBkaXN0ID0ge30KICAgIGZvciBhY3Rpb24gaW4gTWFjcm9BY3Rpb246CiAgICAgICAgaWR4ID0gQUNUSU9OX1RPX0lEWFthY3Rpb25dCiAgICAgICAgY291bnQgPSBpbnQobnAuc3VtKGxhYmVscyA9PSBpZHgpKQogICAgICAgIGRpc3RbYWN0aW9uLnZhbHVlXSA9IGNvdW50CgogICAgdG90YWwgPSBsZW4obGFiZWxzKQogICAgcHJpbnQoZiJcbnsnQWN0aW9uJzo8MjV9IHsnQ291bnQnOj44fSB7J1BjdCc6Pjh9IikKICAgIHByaW50KCLilIAiICogNDMpCiAgICBmb3IgYWN0aW9uX25hbWUsIGNvdW50IGluIHNvcnRlZChkaXN0Lml0ZW1zKCksIGtleT1sYW1iZGEgeDogLXhbMV0pOgogICAgICAgIHBjdCA9IChjb3VudCAvIHRvdGFsICogMTAwKSBpZiB0b3RhbCA+IDAgZWxzZSAwCiAgICAgICAgcHJpbnQoZiIgIHthY3Rpb25fbmFtZTo8MjN9IHtjb3VudDo+OH0ge3BjdDo+Ny4xZn0lIikKICAgIHByaW50KGYieyfilIAnICogNDN9IikKICAgIHByaW50KGYiICB7J1RPVEFMJzo8MjN9IHt0b3RhbDo+OH0iKQoKICAgIHJldHVybiBkaXN0Cg=='
Install-B64 -R 'ml\actions\labeler.py' -B $b
# ml/config/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\config\__init__.py' -B $b
# ml/config/scope.py (10,387 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFJMIFNjb3BlIENvbmZpZ3VyYXRpb24K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCkRlZmluZXMgdGhlIHNpbXBsaWZpZWQgZ2FtZSBzY29wZSwgcGxheXN0eWxlIGxhYmVscywKbWFjcm8tYWN0aW9uIHNwYWNlLCBhbmQgc3RhdGUgZW5jb2RpbmcgZGltZW5zaW9ucyBmb3IKdGhlIGZpcnN0IFJMIHByb3RvdHlwZS4KCkRlc2lnbiBkZWNpc2lvbnM6CiAgLSAxdjEgQ29tbWFuZGVyICgyIHBsYXllcnMsIDQwIGxpZmUsIGNvbW1hbmRlciBkYW1hZ2UgMjEpCiAgLSB+OCBtYWNyby1hY3Rpb25zIHBlciBkZWNpc2lvbiBwb2ludAogIC0gNCBwbGF5c3R5bGUgbGFiZWxzOiBBZ2dybywgQ29udHJvbCwgTWlkcmFuZ2UsIENvbWJvCiAgLSBTdGF0ZSA9IGdsb2JhbCBmZWF0dXJlcyArIHBlci16b25lIGNhcmQgZW1iZWRkaW5ncwoiIiIKCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcywgZmllbGQKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIERpY3QKZnJvbSBlbnVtIGltcG9ydCBFbnVtCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEdhbWUgU2NvcGUKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkBkYXRhY2xhc3MoZnJvemVuPVRydWUpCmNsYXNzIEdhbWVTY29wZToKICAgICIiIlNpbXBsaWZpZWQgQ29tbWFuZGVyIHJ1bGVzIGZvciBSTCBwcm90b3R5cGUuIiIiCiAgICBwb2Rfc2l6ZTogaW50ID0gMiAgICAgICAgICAgICAgICAgICAjIDF2MQogICAgc3RhcnRpbmdfbGlmZTogaW50ID0gNDAKICAgIGNvbW1hbmRlcl9kYW1hZ2VfbGV0aGFsOiBpbnQgPSAyMQogICAgbWF4X3R1cm5zOiBpbnQgPSAyNSAgICAgICAgICAgICAgICAgIyBGb3JjZSBnYW1lIGVuZAogICAgbXVsbGlnYW5fcnVsZTogc3RyID0gImxvbmRvbiIKICAgIGZvcm1hdDogc3RyID0gImNvbW1hbmRlciIKCkdBTUVfU0NPUEUgPSBHYW1lU2NvcGUoKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgUGxheXN0eWxlIExhYmVscwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKY2xhc3MgUGxheXN0eWxlKHN0ciwgRW51bSk6CiAgICAiIiJEZWNrIGFyY2hldHlwZSAvIHBsYXlzdHlsZSBsYWJlbHMuCgogICAgRWFjaCBsYWJlbCBpbXBsaWVzIGEgcHJlZmVycmVkIHN0cmF0ZWdpYyBhcHByb2FjaDoKICAgICAgQUdHUk8gICDigJQgUHJpb3JpdGl6ZSBhdHRhY2tpbmcsIGZhc3QgZGFtYWdlLCBsb3cgY3VydmUKICAgICAgQ09OVFJPTCDigJQgSG9sZCB1cCBtYW5hLCBwcmlvcml0aXplIHJlbW92YWwsIGNhcmQgYWR2YW50YWdlCiAgICAgIE1JRFJBTkdF4oCUIEJhbGFuY2VkOiBkZXZlbG9wIGJvYXJkLCB0aGVuIGF0dGFjayB3aGVuIGFkdmFudGFnZW91cwogICAgICBDT01CTyAgIOKAlCBQcm90ZWN0IGNvbWJvIHBpZWNlcywgdHV0b3IgYWdncmVzc2l2ZWx5LCByYWNlIHRvIGFzc2VtYmxlCiAgICAiIiIKICAgIEFHR1JPID0gImFnZ3JvIgogICAgQ09OVFJPTCA9ICJjb250cm9sIgogICAgTUlEUkFOR0UgPSAibWlkcmFuZ2UiCiAgICBDT01CTyA9ICJjb21ibyIKCgojIEhldXJp' +
'c3RpYyBwbGF5c3R5bGUgYXNzaWdubWVudCBydWxlcyAoYXBwbGllZCB0byBkZWNrIG1ldGFkYXRhKQojIFRoZXNlIG1hcCBkZWNrIGNoYXJhY3RlcmlzdGljcyDihpIgcGxheXN0eWxlIGxhYmVsClBMQVlTVFlMRV9IRVVSSVNUSUNTID0gewogICAgUGxheXN0eWxlLkFHR1JPOiB7CiAgICAgICAgImF2Z19tYW5hX3ZhbHVlX21heCI6IDMuMCwgICAgICAgIyBMb3cgYXZlcmFnZSBDTUMKICAgICAgICAiY3JlYXR1cmVfcmF0aW9fbWluIjogMC4zMCwgICAgICAgIyBIaWdoIGNyZWF0dXJlIGRlbnNpdHkKICAgICAgICAicmVtb3ZhbF9yYXRpb19tYXgiOiAwLjA4LCAgICAgICAgIyBMb3cgcmVtb3ZhbCBjb3VudAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJMb3cgY3VydmUsIGNyZWF0dXJlLWhlYXZ5LCBtaW5pbWFsIGludGVyYWN0aW9uIgogICAgfSwKICAgIFBsYXlzdHlsZS5DT05UUk9MOiB7CiAgICAgICAgImF2Z19tYW5hX3ZhbHVlX21pbiI6IDMuMiwKICAgICAgICAicmVtb3ZhbF9yYXRpb19taW4iOiAwLjEwLCAgICAgICAgIyBIaWdoIHJlbW92YWwvaW50ZXJhY3Rpb24KICAgICAgICAiY3JlYXR1cmVfcmF0aW9fbWF4IjogMC4yNSwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiSGlnaCBpbnRlcmFjdGlvbiwgY2FyZCBhZHZhbnRhZ2UsIGxhdGUtZ2FtZSBmaW5pc2hlcnMiCiAgICB9LAogICAgUGxheXN0eWxlLk1JRFJBTkdFOiB7CiAgICAgICAgImF2Z19tYW5hX3ZhbHVlX21pbiI6IDIuNSwKICAgICAgICAiYXZnX21hbmFfdmFsdWVfbWF4IjogMy44LAogICAgICAgICJjcmVhdHVyZV9yYXRpb19taW4iOiAwLjIwLAogICAgICAgICJjcmVhdHVyZV9yYXRpb19tYXgiOiAwLjM1LAogICAgICAgICJkZXNjcmlwdGlvbiI6ICJCYWxhbmNlZCBjdXJ2ZSwgZmxleGlibGUgc3RyYXRlZ3kiCiAgICB9LAogICAgUGxheXN0eWxlLkNPTUJPOiB7CiAgICAgICAgImNvbWJvX3BpZWNlc19taW4iOiAyLCAgICAgICAgICAgICMgSGFzIGtub3duIGNvbWJvIGNhcmRzCiAgICAgICAgInR1dG9yX2NvdW50X21pbiI6IDIsICAgICAgICAgICAgICMgSGFzIHR1dG9ycyB0byBmaW5kIHRoZW0KICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2luIHZpYSBzcGVjaWZpYyBjYXJkIGNvbWJpbmF0aW9ucyIKICAgIH0sCn0KCiMgT25lLWhvdCBlbmNvZGluZyBkaW1lbnNpb24gZm9yIHBsYXlzdHlsZQpQTEFZU1RZTEVfRElNID0gbGVuKFBsYXlzdHlsZSkgICMgNAoKIyBNYXBwaW5nIGZvciBvbmUtaG90IGVuY29kaW5nClBMQVlTVFlMRV9UT19JRFg6IERpY3RbUGxheXN0eWxlLCBpbnRdID0gewogICAgUGxheXN0eWxlLkFHR1JPOiAwLAogICAgUGxheXN0eWxlLkNPTlRST0w6IDEsCiAgICBQbGF5c3R5bGUuTUlEUkFOR0U6IDIsCiAgICBQbGF5c3R5bGUuQ09NQk86IDMsCn0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIE1hY3JvLUFjdGlvbiBTcGFjZQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKY2xhc3MgTWFjcm9BY3Rpb24oc3RyLCBFbnVtKToKICAgICIiIkhpZ2gtbGV2ZWwgYWN0aW9ucyB0aGUgUkwgYWdlbnQgY2FuIGNob29zZS4KCiAgICBFYWNoIG1hY3JvLWFjdGlvbiBtYXBzIHRvIG9uZSBvciBtb3JlIGNvbmNyZXRlIEZvcmdlIGFjdGlvbnMuCiAgICBUaGUgSmF2YSBzaWRlIHRyYW5zbGF0ZXMgdGhlIGNob3NlbiBtYWNybyBpbnRvIHNwZWNpZmljIGdhbWUgbW92ZXMuCgogICAgOCBhY3Rpb25zIGZvciB0aGUgaW5pdGlhbCBwcm90b3R5cGU6CiAgICAiIiIKICAgICMgUHJvYWN0aXZlIHBsYXlzCiAgICBDQVNUX0NSRUFUVVJFICAgICAgID0gImNhc3RfY3JlYXR1cmUiICAgICAgICMgUGxheSB0aGUgYmVzdCBhdmFpbGFibGUgY3JlYXR1cmUKICAgIENBU1RfUkVNT1ZBTCAgICAgICAgPSAiY2FzdF9yZW1vdmFsIiAgICAgICAgICMgQ2FzdCByZW1vdmFsIG9uIHN0cm9uZ2VzdCBlbmVteSB0aHJlYXQKICAgIENBU1RfRFJB' +
'VyAgICAgICAgICAgPSAiY2FzdF9kcmF3IiAgICAgICAgICAgICMgQ2FzdCBjYXJkLWRyYXcgb3IgY2FudHJpcCBzcGVsbAogICAgQ0FTVF9SQU1QICAgICAgICAgICA9ICJjYXN0X3JhbXAiICAgICAgICAgICAgIyBDYXN0IHJhbXAgc3BlbGwgb3IgbWFuYSByb2NrCiAgICBDQVNUX0NPTU1BTkRFUiAgICAgID0gImNhc3RfY29tbWFuZGVyIiAgICAgICAjIENhc3QgeW91ciBjb21tYW5kZXIgZnJvbSBjb21tYW5kIHpvbmUKCiAgICAjIENvbWJhdAogICAgQVRUQUNLX09QUE9ORU5UICAgICA9ICJhdHRhY2tfb3Bwb25lbnQiICAgICAgIyBBdHRhY2sgd2l0aCBhbGwgcHJvZml0YWJsZSBhdHRhY2tlcnMKCiAgICAjIFJlYWN0aXZlIC8gcGFzc2l2ZQogICAgSE9MRF9NQU5BICAgICAgICAgICA9ICJob2xkX21hbmEiICAgICAgICAgICAgIyBQYXNzIHByaW9yaXR5LCBrZWVwIG1hbmEgb3BlbgogICAgUEFTUyAgICAgICAgICAgICAgICA9ICJwYXNzIiAgICAgICAgICAgICAgICAgIyBQYXNzIHdpdGggbm8gYWN0aW9uIChlbmQgc3RlcCwgZXRjLikKCgojIE51bWJlciBvZiBkaXNjcmV0ZSBhY3Rpb25zCk5VTV9BQ1RJT05TID0gbGVuKE1hY3JvQWN0aW9uKSAgIyA4CgojIEFjdGlvbiBpbmRleCBtYXBwaW5nCkFDVElPTl9UT19JRFg6IERpY3RbTWFjcm9BY3Rpb24sIGludF0gPSB7YTogaSBmb3IgaSwgYSBpbiBlbnVtZXJhdGUoTWFjcm9BY3Rpb24pfQpJRFhfVE9fQUNUSU9OOiBEaWN0W2ludCwgTWFjcm9BY3Rpb25dID0ge2k6IGEgZm9yIGEsIGkgaW4gQUNUSU9OX1RPX0lEWC5pdGVtcygpfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgU3RhdGUgRW5jb2RpbmcgRGltZW5zaW9ucwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQGRhdGFjbGFzcyhmcm96ZW49VHJ1ZSkKY2xhc3MgU3RhdGVEaW1lbnNpb25zOgogICAgIiIiRGltZW5zaW9ucyBmb3IgdGhlIHN0YXRlIHZlY3RvciBlbmNvZGluZy4KCiAgICBTdGF0ZSA9IFtnbG9iYWxfZmVhdHVyZXMgfCB6b25lX2VtYmVkZGluZ3MgfCBwbGF5c3R5bGVfdmVjdG9yXQoKICAgIEdsb2JhbCBmZWF0dXJlcyAocGVyIHBsYXllciDDlyAyIHBsYXllcnMpOgogICAgICAtIGxpZmVfdG90YWwgKG5vcm1hbGl6ZWQgMC0xIGJ5IC80MCkKICAgICAgLSBjb21tYW5kZXJfZGFtYWdlX3Rha2VuIChub3JtYWxpemVkIDAtMSBieSAvMjEpCiAgICAgIC0gbWFuYV9hdmFpbGFibGUgKDAtMjAgcmFuZ2UsIG5vcm1hbGl6ZWQpCiAgICAgIC0gY29tbWFuZGVyX3RheCAoMC0xMCByYW5nZSwgbm9ybWFsaXplZCkKICAgICAgLSBjYXJkc19pbl9oYW5kICgwLTE1LCBub3JtYWxpemVkKQogICAgICAtIGNhcmRzX2luX2dyYXZleWFyZCAoMC0xMDAsIG5vcm1hbGl6ZWQpCiAgICAgIC0gY3JlYXR1cmVzX29uX2JhdHRsZWZpZWxkICgwLTMwLCBub3JtYWxpemVkKQogICAgICAtIHRvdGFsX3Bvd2VyX29uX2JvYXJkICgwLTEwMCwgbm9ybWFsaXplZCkKICAgICAgLSBpc19hY3RpdmVfcGxheWVyICgwIG9yIDEpCiAgICAgIC0gdHVybl9udW1iZXIgKG5vcm1hbGl6ZWQgMC0xIGJ5IC9tYXhfdHVybnMpCiAgICAgIC0gcGhhc2UgKG9uZS1ob3Q6IG1haW4xLCBjb21iYXQsIG1haW4yLCBlbmQgPSA0KQoKICAgIFBlciBwbGF5ZXIgPSAxMCBzY2FsYXIgKyA0IHBoYXNlIG9uZS1ob3QgPSAxNCBmZWF0dXJlcwogICAgMiBwbGF5ZXJzID0gMjggZ2xvYmFsIGZlYXR1cmVzCiAgICArIHR1cm5fbnVtYmVyID0gMQogICAgVG90YWwgZ2xvYmFsID0gMjkKICAgICIiIgogICAgY2FyZF9lbWJlZGRpbmdfZGltOiBpbnQgPSA3NjggICAgICAgIyBGcm9tIG10Zy1lbWJlZGRpbmdzCiAgICB6b25lX3Bvb2xfZGltOiBpbnQgPSA3NjggICAgICAgICAgICAjIE1lYW4tcG9vbGVkIHBlciB6b25lCgogICAgIyBab25lcyBwZXIgcGxheWVyOiBoYW5kLCBiYXR0bGVmaWVsZCwgZ3JhdmV5YXJkLCBjb21tYW5kX3pvbmUK' +
'ICAgIHpvbmVzX3Blcl9wbGF5ZXI6IGludCA9IDQKICAgIG51bV9wbGF5ZXJzOiBpbnQgPSAyICAgICAgICAgICAgICAgICMgMXYxCgogICAgIyBab25lIHZlY3RvcnM6IDQgem9uZXMgw5cgMiBwbGF5ZXJzIMOXIDc2OCA9IDYxNDQKICAgIHRvdGFsX3pvbmVfZGltOiBpbnQgPSA0ICogMiAqIDc2OCAgIyA2MTQ0CgogICAgIyBHbG9iYWwgc2NhbGFyIGZlYXR1cmVzCiAgICBwZXJfcGxheWVyX3NjYWxhcnM6IGludCA9IDEwCiAgICBwaGFzZV9vbmVob3Q6IGludCA9IDQgICAgICAgICAgICAgICAjIG1haW4xLCBjb21iYXQsIG1haW4yLCBlbmQKICAgIHBlcl9wbGF5ZXJfZmVhdHVyZXM6IGludCA9IDE0ICAgICAgICMgMTAgKyA0CiAgICBnbG9iYWxfZmVhdHVyZXM6IGludCA9IDI5ICAgICAgICAgICAjIDE0w5cyICsgMSAodHVybikKCiAgICAjIFBsYXlzdHlsZSB2ZWN0b3IKICAgIHBsYXlzdHlsZV9kaW06IGludCA9IDQgICAgICAgICAgICAgICMgT25lLWhvdCBvdmVyIDQgc3R5bGVzCgogICAgQHByb3BlcnR5CiAgICBkZWYgdG90YWxfc3RhdGVfZGltKHNlbGYpIC0+IGludDoKICAgICAgICAiIiJUb3RhbCBkaW1lbnNpb24gb2YgdGhlIGZsYXR0ZW5lZCBzdGF0ZSB2ZWN0b3IuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2xvYmFsX2ZlYXR1cmVzICsgc2VsZi50b3RhbF96b25lX2RpbSArIHNlbGYucGxheXN0eWxlX2RpbQogICAgICAgICMgMjkgKyA2MTQ0ICsgNCA9IDYxNzcKClNUQVRFX0RJTVMgPSBTdGF0ZURpbWVuc2lvbnMoKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgR2FtZSBQaGFzZSBFbmNvZGluZwojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKY2xhc3MgR2FtZVBoYXNlKHN0ciwgRW51bSk6CiAgICBNQUlOXzEgPSAibWFpbl8xIgogICAgQ09NQkFUID0gImNvbWJhdCIKICAgIE1BSU5fMiA9ICJtYWluXzIiCiAgICBFTkQgPSAiZW5kIgoKUEhBU0VfVE9fSURYID0gewogICAgR2FtZVBoYXNlLk1BSU5fMTogMCwKICAgIEdhbWVQaGFzZS5DT01CQVQ6IDEsCiAgICBHYW1lUGhhc2UuTUFJTl8yOiAyLAogICAgR2FtZVBoYXNlLkVORDogMywKfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRm9yZ2UgTG9nIEFjdGlvbi1MYWJlbCBNYXBwaW5nIEtleXdvcmRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgojIFRoZXNlIGtleXdvcmRzIGluIEZvcmdlIGxvZyBsaW5lcyBoZWxwIGNsYXNzaWZ5IHJhdyBhY3Rpb25zCiMgaW50byBtYWNyby1hY3Rpb25zIGZvciBzdXBlcnZpc2VkIGxlYXJuaW5nLgojIFVzZWQgYnkgbWwvYWN0aW9ucy9sYWJlbGVyLnB5CgpBQ1RJT05fS0VZV09SRFMgPSB7CiAgICBNYWNyb0FjdGlvbi5DQVNUX0NSRUFUVVJFOiBbCiAgICAgICAgImNyZWF0dXJlIiwgInRva2VuIiwgInN1bW1vbiIsCiAgICBdLAogICAgTWFjcm9BY3Rpb24uQ0FTVF9SRU1PVkFMOiBbCiAgICAgICAgImRlc3Ryb3kiLCAiZXhpbGUiLCAiZGFtYWdlIHRvIiwgImNvdW50ZXIiLAogICAgICAgICItWC8tWCIsICJzYWNyaWZpY2UiLCAiYm91bmNlIiwKICAgIF0sCiAgICBNYWNyb0FjdGlvbi5DQVNUX0RSQVc6IFsKICAgICAgICAiZHJhdyIsICJzY3J5IiwgImxvb2sgYXQgdGhlIHRvcCIsICJyZXZlYWwiLAogICAgICAgICJzZWFyY2ggeW91ciBsaWJyYXJ5IiwK' +
'ICAgIF0sCiAgICBNYWNyb0FjdGlvbi5DQVNUX1JBTVA6IFsKICAgICAgICAiYWRkIHsiLCAibWFuYSIsICJsYW5kIG9udG8gdGhlIGJhdHRsZWZpZWxkIiwKICAgICAgICAic2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSBiYXNpYyBsYW5kIiwKICAgIF0sCiAgICBNYWNyb0FjdGlvbi5DQVNUX0NPTU1BTkRFUjogW10sICAjIERldGVjdGVkIGJ5IG1hdGNoaW5nIGNvbW1hbmRlciBuYW1lCiAgICBNYWNyb0FjdGlvbi5BVFRBQ0tfT1BQT05FTlQ6IFsKICAgICAgICAiYXR0YWNrcyIsICJkZWNsYXJlIGF0dGFja2VycyIsICJjb21iYXQgZGFtYWdlIiwKICAgIF0sCiAgICBNYWNyb0FjdGlvbi5IT0xEX01BTkE6IFtdLCAgICAgICAjIEluZmVycmVkOiBwcmlvcml0eSBwYXNzZWQgd2l0aCBtYW5hIG9wZW4KICAgIE1hY3JvQWN0aW9uLlBBU1M6IFtdLCAgICAgICAgICAgICMgSW5mZXJyZWQ6IHByaW9yaXR5IHBhc3NlZCB3aXRoIG5vIG1hbmEgLyBubyBhY3Rpb25zCn0KCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFRyYWluaW5nIERlZmF1bHRzCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAZGF0YWNsYXNzCmNsYXNzIFRyYWluaW5nQ29uZmlnOgogICAgIiIiRGVmYXVsdCBoeXBlcnBhcmFtZXRlcnMgZm9yIHN1cGVydmlzZWQgcG9saWN5IGxlYXJuaW5nLiIiIgogICAgYmF0Y2hfc2l6ZTogaW50ID0gNjQKICAgIGxlYXJuaW5nX3JhdGU6IGZsb2F0ID0gMWUtMwogICAgZXBvY2hzOiBpbnQgPSA1MAogICAgaGlkZGVuX2RpbTogaW50ID0gNTEyCiAgICBudW1fbGF5ZXJzOiBpbnQgPSAzCiAgICBkcm9wb3V0OiBmbG9hdCA9IDAuMQogICAgYWN0aXZhdGlvbjogc3RyID0gInNpbHUiCiAgICBlYXJseV9zdG9wX3BhdGllbmNlOiBpbnQgPSA1CiAgICB2YWxfc3BsaXQ6IGZsb2F0ID0gMC4xNQogICAgdGVzdF9zcGxpdDogZmxvYXQgPSAwLjEwCiAgICBjaGVja3BvaW50X2Rpcjogc3RyID0gIm1sL21vZGVscy9jaGVja3BvaW50cyIKICAgIGxvZ19ldmVyeTogaW50ID0gMTAwICAgICAgICAgICAgICAgIyBMb2cgZXZlcnkgTiBiYXRjaGVzCgpUUkFJTklOR19DT05GSUcgPSBUcmFpbmluZ0NvbmZpZygpCg=='
Install-B64 -R 'ml\config\scope.py' -B $b
# ml/data/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\data\__init__.py' -B $b
# ml/data/dataset_builder.py (10,225 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFRyYWluaW5nIERhdGFzZXQgQnVpbGRlcgrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKUmVhZHMgTUwgZGVjaXNpb24gSlNPTkwgZmlsZXMsIGVuY29kZXMgc3RhdGVzLCBsYWJlbHMgYWN0aW9ucywKYW5kIHByb2R1Y2VzIGEgdHJhaW5pbmctcmVhZHkgZGF0YXNldCBzYXZlZCBhcyBOUFouCgpVc2FnZToKICAgIHB5dGhvbiAtbSBtbC5kYXRhLmRhdGFzZXRfYnVpbGRlciAtLXJlc3VsdHMtZGlyIHJlc3VsdHMvIC0tb3V0cHV0IG1sL21vZGVscy9kYXRhc2V0Lm5wegoKT3V0cHV0IE5QWiBzdHJ1Y3R1cmU6CiAgICBzdGF0ZXM6ICAgICBmbG9hdDMyIChOLCA2MTc3KSDigJQgZW5jb2RlZCBzdGF0ZSB2ZWN0b3JzCiAgICBsYWJlbHM6ICAgICBpbnQ2NCAgIChOLCkgICAgICDigJQgbWFjcm8tYWN0aW9uIGluZGljZXMgKDAtNykKICAgIGdhbWVfaWRzOiAgIG9iamVjdCAgKE4sKSAgICAgIOKAlCBnYW1lIElEIGZvciBlYWNoIHNhbXBsZQogICAgb3V0Y29tZXM6ICAgb2JqZWN0ICAoTiwpICAgICAg4oCUIGdhbWUgb3V0Y29tZSBwZXIgc2FtcGxlCiAgICBwbGF5c3R5bGVzOiBvYmplY3QgIChOLCkgICAgICDigJQgZGVjayBhcmNoZXR5cGUgcGVyIHNhbXBsZQoiIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHN5cwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIExpc3QsIFR1cGxlCgppbXBvcnQgbnVtcHkgYXMgbnAKCiMgQWRkIHByb2plY3Qgcm9vdCB0byBwYXRoCnByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50LnBhcmVudCkKaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgpmcm9tIG1sLmNvbmZpZy5zY29wZSBpbXBvcnQgKAogICAgTlVNX0FDVElPTlMsIFNUQVRFX0RJTVMsIE1hY3JvQWN0aW9uLCBBQ1RJT05fVE9fSURYLAopCmZyb20gbWwuZW5jb2Rlci5zdGF0ZV9lbmNvZGVyIGltcG9ydCBDYXJkRW1iZWRkaW5nSW5kZXgsIFN0YXRlRW5jb2Rlcgpmcm9tIG1sLmFjdGlvbnMubGFiZWxlciBpbXBvcnQgbGFiZWxfYWN0aW9uLCBwcmludF9sYWJlbF9kaXN0cmlidXRpb24KCmxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9IlslKG5hbWUpc10gJShtZXNzYWdlKXMiKQpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigibWwuZGF0YXNldCIpCgoKZGVmIGJ1aWxkX2RhdGFzZXQoCiAgICByZXN1bHRzX2Rpcjogc3RyLAogICAgZW1iZWRkaW5nc19kaXI6IHN0ciA9IE5vbmUsCiAgICBtYXhfc2FtcGxlczogaW50ID0gTm9uZSwKKSAtPiBEaWN0W3N0ciwgbnAubmRhcnJheV06CiAgICAiIiIKICAgIEJ1aWxkIGNvbXBsZXRlIHRyYWluaW5nIGRhdGFzZXQgZnJvbSBhbGwgTUwgZGVjaXNpb24gZmlsZXMuCgogICAgQXJnczoKICAgICAgICByZXN1bHRzX2RpcjogUGF0aCB0byByZXN1bHRzLyBkaXJlY3RvcnkgY29udGFpbmluZyBtbC1kZWNpc2lvbnMtKi5qc29ubAogICAgICAgIGVtYmVkZGluZ3NfZGlyOiBQYXRoIHRvIGVtYmVkZGluZ3MvIGRpcmVjdG9yeSAoZGVmYXVsdDogYXV0by1kZXRlY3QpCiAgICAgICAgbWF4X3NhbXBsZXM6IENhcCB0b3RhbCBzYW1wbGVzIChOb25lID0gdW5saW1pdGVkKQoKICAgIFJldHVybnM6CiAgICAgICAgRGljdCB3aXRoIGtleXM6IHN0YXRlcywgbGFiZWxzLCBnYW1lX2lkcywgb3V0Y29tZXMsIHBsYXlzdHlsZXMKICAgICIiIgogICAgIyBMb2FkIGNhcmQgZW1iZWRkaW5ncwogICAgY2FyZF9pbmRleCA9IENhcmRFbWJlZGRpbmdJbmRleChlbWJlZGRpbmdzX2RpcikKICAgIGlmIG5vdCBjYXJkX2luZGV4LmxvYWQoKToKICAgICAgICBsb2dnZXIuZXJyb3IoIkNhbm5vdCBidWlsZCBkYXRhc2V0IHdpdGhvdXQgY2FyZCBlbWJlZGRpbmdzLiIpCiAgICAgICAgbG9nZ2VyLmVycm9yKCJTdGFydCB0aGUgbGFiIHNlcnZlciBmaXJzdCB0byBhdXRvLWRvd25sb2FkIGVtYmVkZGluZ3MsIikKICAgICAgICBsb2dnZXIuZXJyb3IoIm9yIG1hbnVhbGx5IGRvd25sb2FkIG10Z19lbWJlZGRpbmdzLm5weiB0byBlbWJlZGRpbmdzLyBvciBkYXRh' +
'LyIpCiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAiQ2FyZCBlbWJlZGRpbmdzIG5vdCBmb3VuZC4gVGhlIGNvYWNoIG11c3QgZG93bmxvYWQgdGhlbSBmaXJzdCDigJQgIgogICAgICAgICAgICAib3BlbiB0aGUgQ29hY2ggdGFiIGFuZCBlbnN1cmUgZW1iZWRkaW5ncyBhcmUgbG9hZGVkLCBvciBwbGFjZSAiCiAgICAgICAgICAgICJtdGctZW1iZWRkaW5ncy5ucHogaW4gdGhlIGRhdGEvIGZvbGRlci4iCiAgICAgICAgKQoKICAgIGVuY29kZXIgPSBTdGF0ZUVuY29kZXIoY2FyZF9pbmRleCkKCiAgICAjIEZpbmQgYWxsIEpTT05MIGZpbGVzCiAgICByZXN1bHRzX3BhdGggPSBQYXRoKHJlc3VsdHNfZGlyKQogICAganNvbmxfZmlsZXMgPSBzb3J0ZWQocmVzdWx0c19wYXRoLmdsb2IoIm1sLWRlY2lzaW9ucy0qLmpzb25sIikpCiAgICBpZiBub3QganNvbmxfZmlsZXM6CiAgICAgICAgbG9nZ2VyLmVycm9yKCJObyBNTCBkZWNpc2lvbiBmaWxlcyBmb3VuZCBpbiAlcyIsIHJlc3VsdHNfZGlyKQogICAgICAgIGxvZ2dlci5lcnJvcigiUnVuIGJhdGNoIHNpbXVsYXRpb25zIHdpdGggLS1tbC1sb2cgb3IgZW5hYmxlIE1MIGxvZ2dpbmcgaW4gdGhlIFVJIGZpcnN0LiIpCiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICBmIk5vIG1sLWRlY2lzaW9ucy0qLmpzb25sIGZpbGVzIGZvdW5kIGluIHtyZXN1bHRzX2Rpcn0uICIKICAgICAgICAgICAgIlJ1biBiYXRjaCBzaW11bGF0aW9ucyB3aXRoIE1MIGxvZ2dpbmcgZW5hYmxlZCBmaXJzdC4iCiAgICAgICAgKQoKICAgIGxvZ2dlci5pbmZvKCJGb3VuZCAlZCBNTCBkZWNpc2lvbiBmaWxlcyIsIGxlbihqc29ubF9maWxlcykpCgogICAgYWxsX3N0YXRlcyA9IFtdCiAgICBhbGxfbGFiZWxzID0gW10KICAgIGFsbF9nYW1lX2lkcyA9IFtdCiAgICBhbGxfb3V0Y29tZXMgPSBbXQogICAgYWxsX3BsYXlzdHlsZXMgPSBbXQogICAgdG90YWxfc2tpcHBlZCA9IDAKCiAgICBmb3IganNvbmxfZmlsZSBpbiBqc29ubF9maWxlczoKICAgICAgICBsb2dnZXIuaW5mbygiUHJvY2Vzc2luZyAlcyAuLi4iLCBqc29ubF9maWxlLm5hbWUpCiAgICAgICAgZmlsZV9jb3VudCA9IDAKCiAgICAgICAgd2l0aCBvcGVuKGpzb25sX2ZpbGUsICJyIikgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmVfbnVtLCBsaW5lIGluIGVudW1lcmF0ZShmKToKICAgICAgICAgICAgICAgIGlmIG1heF9zYW1wbGVzIGFuZCBsZW4oYWxsX3N0YXRlcykgPj0gbWF4X3NhbXBsZXM6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbiA9IGpzb24ubG9hZHMobGluZSkKCiAgICAgICAgICAgICAgICAgICAgIyBFbmNvZGUgc3RhdGUKICAgICAgICAgICAgICAgICAgICBwbGF5c3R5bGUgPSBkZWNpc2lvbi5nZXQoImFyY2hldHlwZSIsICJtaWRyYW5nZSIpCiAgICAgICAgICAgICAgICAgICAgc3RhdGVfdmVjID0gZW5jb2Rlci5lbmNvZGUoZGVjaXNpb24sIHBsYXlzdHlsZSkKCiAgICAgICAgICAgICAgICAgICAgIyBMYWJlbCBhY3Rpb24KICAgICAgICAgICAgICAgICAgICBhY3Rpb25faWR4ID0gbGFiZWxfYWN0aW9uKGRlY2lzaW9uKQoKICAgICAgICAgICAgICAgICAgICAjIE1ldGFkYXRhCiAgICAgICAgICAgICAgICAgICAgZ2FtZV9pZCA9IGRlY2lzaW9uLmdldCgiZ2FtZV9pZCIsIGYidW5rbm93bi17bGluZV9udW19IikKICAgICAgICAgICAgICAgICAgICBvdXRjb21lID0gZGVjaXNpb24uZ2V0KCJnYW1lX291dGNvbWUiLCAidW5rbm93biIpCgogICAgICAgICAgICAgICAgICAgIGFsbF9zdGF0ZXMuYXBwZW5kKHN0YXRlX3ZlYykKICAgICAgICAgICAgICAgICAgICBhbGxfbGFiZWxzLmFwcGVuZChhY3Rpb25faWR4KQogICAgICAgICAgICAgICAgICAgIGFsbF9nYW1lX2lkcy5hcHBlbmQoZ2FtZV9pZCkKICAgICAgICAgICAgICAgICAgICBhbGxfb3V0Y29tZXMuYXBwZW5kKG91dGNvbWUpCiAgICAgICAgICAgICAgICAgICAgYWxsX3BsYXlzdHlsZXMuYXBwZW5kKHBsYXlzdHlsZSkKICAgICAgICAgICAgICAgICAgICBmaWxlX2NvdW50ICs9IDEKCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgdG90' +
'YWxfc2tpcHBlZCArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgdG90YWxfc2tpcHBlZCA8PSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgJXMgbGluZSAlZDogJXMiLCBqc29ubF9maWxlLm5hbWUsIGxpbmVfbnVtLCBlCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgbG9nZ2VyLmluZm8oIiAg4oaSICVkIHNhbXBsZXMgZnJvbSAlcyIsIGZpbGVfY291bnQsIGpzb25sX2ZpbGUubmFtZSkKCiAgICBpZiBub3QgYWxsX3N0YXRlczoKICAgICAgICBsb2dnZXIuZXJyb3IoIk5vIHZhbGlkIHNhbXBsZXMgZm91bmQuIikKICAgICAgICByZXR1cm4ge30KCiAgICAjIENvbnZlcnQgdG8gYXJyYXlzCiAgICBzdGF0ZXMgPSBucC5zdGFjayhhbGxfc3RhdGVzKS5hc3R5cGUobnAuZmxvYXQzMikKICAgIGxhYmVscyA9IG5wLmFycmF5KGFsbF9sYWJlbHMsIGR0eXBlPW5wLmludDY0KQogICAgZ2FtZV9pZHMgPSBucC5hcnJheShhbGxfZ2FtZV9pZHMsIGR0eXBlPW9iamVjdCkKICAgIG91dGNvbWVzID0gbnAuYXJyYXkoYWxsX291dGNvbWVzLCBkdHlwZT1vYmplY3QpCiAgICBwbGF5c3R5bGVzID0gbnAuYXJyYXkoYWxsX3BsYXlzdHlsZXMsIGR0eXBlPW9iamVjdCkKCiAgICBsb2dnZXIuaW5mbygKICAgICAgICAiRGF0YXNldCBidWlsdDogJWQgc2FtcGxlcywgJWQgZmVhdHVyZXMsICVkIGFjdGlvbnMsICVkIHNraXBwZWQiLAogICAgICAgIGxlbihzdGF0ZXMpLCBzdGF0ZXMuc2hhcGVbMV0sIE5VTV9BQ1RJT05TLCB0b3RhbF9za2lwcGVkLAogICAgKQoKICAgICMgUHJpbnQgbGFiZWwgZGlzdHJpYnV0aW9uCiAgICBwcmludF9sYWJlbF9kaXN0cmlidXRpb24obGFiZWxzKQoKICAgICMgUHJpbnQgZ2FtZSBvdXRjb21lIGRpc3RyaWJ1dGlvbgogICAgdW5pcXVlX291dGNvbWVzLCBvdXRjb21lX2NvdW50cyA9IG5wLnVuaXF1ZShvdXRjb21lcywgcmV0dXJuX2NvdW50cz1UcnVlKQogICAgcHJpbnQoZiJcbnsnT3V0Y29tZSc6PDI1fSB7J0NvdW50Jzo+OH0iKQogICAgcHJpbnQoIuKUgCIgKiAzNSkKICAgIGZvciBvLCBjIGluIHNvcnRlZCh6aXAodW5pcXVlX291dGNvbWVzLCBvdXRjb21lX2NvdW50cyksIGtleT1sYW1iZGEgeDogLXhbMV0pOgogICAgICAgIHByaW50KGYiICB7c3RyKG8pOjwyM30ge2M6Pjh9IikKCiAgICAjIFByaW50IHBsYXlzdHlsZSBkaXN0cmlidXRpb24KICAgIHVuaXF1ZV9zdHlsZXMsIHN0eWxlX2NvdW50cyA9IG5wLnVuaXF1ZShwbGF5c3R5bGVzLCByZXR1cm5fY291bnRzPVRydWUpCiAgICBwcmludChmIlxueydQbGF5c3R5bGUnOjwyNX0geydDb3VudCc6Pjh9IikKICAgIHByaW50KCLilIAiICogMzUpCiAgICBmb3IgcywgYyBpbiBzb3J0ZWQoemlwKHVuaXF1ZV9zdHlsZXMsIHN0eWxlX2NvdW50cyksIGtleT1sYW1iZGEgeDogLXhbMV0pOgogICAgICAgIHByaW50KGYiICB7c3RyKHMpOjwyM30ge2M6Pjh9IikKCiAgICByZXR1cm4gewogICAgICAgICJzdGF0ZXMiOiBzdGF0ZXMsCiAgICAgICAgImxhYmVscyI6IGxhYmVscywKICAgICAgICAiZ2FtZV9pZHMiOiBnYW1lX2lkcywKICAgICAgICAib3V0Y29tZXMiOiBvdXRjb21lcywKICAgICAgICAicGxheXN0eWxlcyI6IHBsYXlzdHlsZXMsCiAgICB9CgoKZGVmIHNwbGl0X2RhdGFzZXQoCiAgICBkYXRhc2V0OiBEaWN0W3N0ciwgbnAubmRhcnJheV0sCiAgICB2YWxfc3BsaXQ6IGZsb2F0ID0gMC4xNSwKICAgIHRlc3Rfc3BsaXQ6IGZsb2F0ID0gMC4xMCwKICAgIHNwbGl0X2J5X2dhbWU6IGJvb2wgPSBUcnVlLAopIC0+IFR1cGxlW0RpY3QsIERpY3QsIERpY3RdOgogICAgIiIiCiAgICBTcGxpdCBkYXRhc2V0IGludG8gdHJhaW4vdmFsL3Rlc3Qgc2V0cy4KCiAgICBJZiBzcGxpdF9ieV9nYW1lPVRydWUsIHNwbGl0cyBieSBnYW1lX2lkIHRvIHByZXZlbnQgZGF0YSBsZWFrYWdlCiAgICAoYWxsIGRlY2lzaW9ucyBmcm9tIG9uZSBnYW1lIGdvIHRvIHRoZSBzYW1lIHNwbGl0KS4KCiAgICBSZXR1cm5zOgogICAgICAgICh0cmFpbiwgdmFsLCB0ZXN0KSDigJQgZWFjaCBhIGRpY3Qgd2l0aCBzYW1lIGtleXMgYXMgaW5wdXQKICAgICIiIgogICAgc3RhdGVzID0gZGF0YXNldFsic3RhdGVzIl0KICAgIGxhYmVscyA9IGRhdGFzZXRbImxhYmVscyJdCiAgICBnYW1lX2lkcyA9IGRhdGFzZXRbImdhbWVfaWRzIl0KCiAgICBpZiBzcGxpdF9ieV9nYW1lOgogICAgICAgICMgR2V0' +
'IHVuaXF1ZSBnYW1lIElEcyBhbmQgc2h1ZmZsZQogICAgICAgIHVuaXF1ZV9nYW1lcyA9IG5wLnVuaXF1ZShnYW1lX2lkcykKICAgICAgICBybmcgPSBucC5yYW5kb20uZGVmYXVsdF9ybmcoNDIpCiAgICAgICAgcm5nLnNodWZmbGUodW5pcXVlX2dhbWVzKQoKICAgICAgICBuX2dhbWVzID0gbGVuKHVuaXF1ZV9nYW1lcykKICAgICAgICBuX3Rlc3QgPSBtYXgoMSwgaW50KG5fZ2FtZXMgKiB0ZXN0X3NwbGl0KSkKICAgICAgICBuX3ZhbCA9IG1heCgxLCBpbnQobl9nYW1lcyAqIHZhbF9zcGxpdCkpCgogICAgICAgIHRlc3RfZ2FtZXMgPSBzZXQodW5pcXVlX2dhbWVzWzpuX3Rlc3RdKQogICAgICAgIHZhbF9nYW1lcyA9IHNldCh1bmlxdWVfZ2FtZXNbbl90ZXN0Om5fdGVzdCArIG5fdmFsXSkKICAgICAgICB0cmFpbl9nYW1lcyA9IHNldCh1bmlxdWVfZ2FtZXNbbl90ZXN0ICsgbl92YWw6XSkKCiAgICAgICAgdHJhaW5fbWFzayA9IG5wLmFycmF5KFtnaWQgaW4gdHJhaW5fZ2FtZXMgZm9yIGdpZCBpbiBnYW1lX2lkc10pCiAgICAgICAgdmFsX21hc2sgPSBucC5hcnJheShbZ2lkIGluIHZhbF9nYW1lcyBmb3IgZ2lkIGluIGdhbWVfaWRzXSkKICAgICAgICB0ZXN0X21hc2sgPSBucC5hcnJheShbZ2lkIGluIHRlc3RfZ2FtZXMgZm9yIGdpZCBpbiBnYW1lX2lkc10pCiAgICBlbHNlOgogICAgICAgICMgU2ltcGxlIHJhbmRvbSBzcGxpdCBieSBzYW1wbGUKICAgICAgICBuID0gbGVuKHN0YXRlcykKICAgICAgICBybmcgPSBucC5yYW5kb20uZGVmYXVsdF9ybmcoNDIpCiAgICAgICAgaW5kaWNlcyA9IHJuZy5wZXJtdXRhdGlvbihuKQoKICAgICAgICBuX3Rlc3QgPSBtYXgoMSwgaW50KG4gKiB0ZXN0X3NwbGl0KSkKICAgICAgICBuX3ZhbCA9IG1heCgxLCBpbnQobiAqIHZhbF9zcGxpdCkpCgogICAgICAgIHRlc3RfbWFzayA9IG5wLnplcm9zKG4sIGR0eXBlPWJvb2wpCiAgICAgICAgdmFsX21hc2sgPSBucC56ZXJvcyhuLCBkdHlwZT1ib29sKQogICAgICAgIHRyYWluX21hc2sgPSBucC56ZXJvcyhuLCBkdHlwZT1ib29sKQoKICAgICAgICB0ZXN0X21hc2tbaW5kaWNlc1s6bl90ZXN0XV0gPSBUcnVlCiAgICAgICAgdmFsX21hc2tbaW5kaWNlc1tuX3Rlc3Q6bl90ZXN0ICsgbl92YWxdXSA9IFRydWUKICAgICAgICB0cmFpbl9tYXNrW2luZGljZXNbbl90ZXN0ICsgbl92YWw6XV0gPSBUcnVlCgogICAgZGVmIF9zdWJzZXQobWFzayk6CiAgICAgICAgcmV0dXJuIHtrOiB2W21hc2tdIGZvciBrLCB2IGluIGRhdGFzZXQuaXRlbXMoKX0KCiAgICB0cmFpbiA9IF9zdWJzZXQodHJhaW5fbWFzaykKICAgIHZhbCA9IF9zdWJzZXQodmFsX21hc2spCiAgICB0ZXN0ID0gX3N1YnNldCh0ZXN0X21hc2spCgogICAgbG9nZ2VyLmluZm8oCiAgICAgICAgIlNwbGl0OiB0cmFpbj0lZCwgdmFsPSVkLCB0ZXN0PSVkIChieV9nYW1lPSVzKSIsCiAgICAgICAgbGVuKHRyYWluWyJzdGF0ZXMiXSksIGxlbih2YWxbInN0YXRlcyJdKSwgbGVuKHRlc3RbInN0YXRlcyJdKSwKICAgICAgICBzcGxpdF9ieV9nYW1lLAogICAgKQoKICAgIHJldHVybiB0cmFpbiwgdmFsLCB0ZXN0CgoKZGVmIHNhdmVfZGF0YXNldCgKICAgIGRhdGFzZXQ6IERpY3Rbc3RyLCBucC5uZGFycmF5XSwKICAgIG91dHB1dF9wYXRoOiBzdHIsCik6CiAgICAiIiJTYXZlIGRhdGFzZXQgdG8gTlBaIGZpbGUuIiIiCiAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUob3V0cHV0X3BhdGgpIG9yICIuIiwgZXhpc3Rfb2s9VHJ1ZSkKICAgIG5wLnNhdmV6X2NvbXByZXNzZWQob3V0cHV0X3BhdGgsICoqZGF0YXNldCkKICAgIHNpemVfbWIgPSBvcy5wYXRoLmdldHNpemUob3V0cHV0X3BhdGgpIC8gKDEwMjQgKiAxMDI0KQogICAgbG9nZ2VyLmluZm8oIlNhdmVkIGRhdGFzZXQgdG8gJXMgKCUuMWYgTUIpIiwgb3V0cHV0X3BhdGgsIHNpemVfbWIpCgoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgICAgIGRlc2NyaXB0aW9uPSJCdWlsZCBNTCB0cmFpbmluZyBkYXRhc2V0IGZyb20gZGVjaXNpb24gbG9ncyIKICAgICkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgIi0tcmVzdWx0cy1kaXIiLCBkZWZhdWx0PSJyZXN1bHRzIiwKICAgICAgICBoZWxwPSJEaXJlY3RvcnkgY29udGFpbmluZyBtbC1kZWNpc2lvbnMtKi5qc29ubCBmaWxlcyIsCiAgICApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICItLWVtYmVkZGluZ3MtZGlyIiwgZGVmYXVsdD1O' +
'b25lLAogICAgICAgIGhlbHA9IkRpcmVjdG9yeSBjb250YWluaW5nIG10Z19lbWJlZGRpbmdzLm5weiAoZGVmYXVsdDogYXV0by1kZXRlY3QpIiwKICAgICkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgIi0tb3V0cHV0IiwgZGVmYXVsdD0ibWwvbW9kZWxzL2RhdGFzZXQubnB6IiwKICAgICAgICBoZWxwPSJPdXRwdXQgcGF0aCBmb3IgdGhlIGRhdGFzZXQgTlBaIGZpbGUiLAogICAgKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAiLS1tYXgtc2FtcGxlcyIsIHR5cGU9aW50LCBkZWZhdWx0PU5vbmUsCiAgICAgICAgaGVscD0iTWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyAoZGVmYXVsdDogdW5saW1pdGVkKSIsCiAgICApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICItLW5vLXNwbGl0IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICBoZWxwPSJEb24ndCBzcGxpdCBpbnRvIHRyYWluL3ZhbC90ZXN0IChzYXZlIHNpbmdsZSBmaWxlKSIsCiAgICApCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKICAgICMgQnVpbGQgZGF0YXNldAogICAgZGF0YXNldCA9IGJ1aWxkX2RhdGFzZXQoCiAgICAgICAgcmVzdWx0c19kaXI9YXJncy5yZXN1bHRzX2RpciwKICAgICAgICBlbWJlZGRpbmdzX2Rpcj1hcmdzLmVtYmVkZGluZ3NfZGlyLAogICAgICAgIG1heF9zYW1wbGVzPWFyZ3MubWF4X3NhbXBsZXMsCiAgICApCiAgICBpZiBub3QgZGF0YXNldDoKICAgICAgICBwcmludCgiXG5ObyBkYXRhIHRvIHNhdmUuIFJ1biBzaW11bGF0aW9ucyB3aXRoIC0tbWwtbG9nIGZpcnN0LiIpCiAgICAgICAgc3lzLmV4aXQoMSkKCiAgICBpZiBhcmdzLm5vX3NwbGl0OgogICAgICAgIHNhdmVfZGF0YXNldChkYXRhc2V0LCBhcmdzLm91dHB1dCkKICAgIGVsc2U6CiAgICAgICAgdHJhaW4sIHZhbCwgdGVzdCA9IHNwbGl0X2RhdGFzZXQoZGF0YXNldCkKICAgICAgICBiYXNlID0gYXJncy5vdXRwdXQucmVwbGFjZSgiLm5weiIsICIiKQogICAgICAgIHNhdmVfZGF0YXNldCh0cmFpbiwgZiJ7YmFzZX0tdHJhaW4ubnB6IikKICAgICAgICBzYXZlX2RhdGFzZXQodmFsLCBmIntiYXNlfS12YWwubnB6IikKICAgICAgICBzYXZlX2RhdGFzZXQodGVzdCwgZiJ7YmFzZX0tdGVzdC5ucHoiKQoKICAgIHByaW50KCJcbkRhdGFzZXQgYnVpbGQgY29tcGxldGUuIikKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg=='
Install-B64 -R 'ml\data\dataset_builder.py' -B $b
# ml/encoder/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\encoder\__init__.py' -B $b
# ml/encoder/state_encoder.py (12,991 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFN0YXRlIEVuY29kZXIK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCkNvbnZlcnRzIHJhdyBkZWNpc2lvbiBzbmFwc2hvdHMgKEpTT05MKSBpbnRvIGZpeGVkLXNpemUgdGVuc29yIHZlY3RvcnMKc3VpdGFibGUgZm9yIG5ldXJhbCBuZXR3b3JrIGlucHV0LgoKUGlwZWxpbmU6CiAgMS4gTG9hZCBjYXJkIGVtYmVkZGluZ3MgZnJvbSBtdGctZW1iZWRkaW5ncyAoNzY4LWRpbSwgfjMySyBjYXJkcykKICAyLiBGb3IgZWFjaCBkZWNpc2lvbiBzbmFwc2hvdDoKICAgICBhLiBFbmNvZGUgZ2xvYmFsIGZlYXR1cmVzIChsaWZlLCBtYW5hLCB0dXJuLCBwaGFzZSwgZXRjLikKICAgICBiLiBGb3IgZWFjaCB6b25lIHBlciBwbGF5ZXI6IG1lYW4tcG9vbCBjYXJkIGVtYmVkZGluZ3MKICAgICBjLiBFbmNvZGUgcGxheXN0eWxlIGFzIG9uZS1ob3QgdmVjdG9yCiAgICAgZC4gQ29uY2F0ZW5hdGUgaW50byBzaW5nbGUgZml4ZWQtbGVuZ3RoIHZlY3RvcgoKT3V0cHV0IGRpbWVuc2lvbnM6CiAgZ2xvYmFsX2ZlYXR1cmVzICgyOSkgKyB6b25lX2VtYmVkZGluZ3MgKDYxNDQpICsgcGxheXN0eWxlICg0KSA9IDYxNzcKIiIiCgppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBMaXN0LCBPcHRpb25hbCwgVHVwbGUKCmltcG9ydCBudW1weSBhcyBucAoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIm1sLmVuY29kZXIiKQoKIyBJbXBvcnQgc2NvcGUgY29uZmlnCmltcG9ydCBzeXMKc3lzLnBhdGguaW5zZXJ0KDAsIHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50LnBhcmVudCkpCmZyb20gbWwuY29uZmlnLnNjb3BlIGltcG9ydCAoCiAgICBTVEFURV9ESU1TLCBQTEFZU1RZTEVfVE9fSURYLCBQSEFTRV9UT19JRFgsCiAgICBQbGF5c3R5bGUsIEdhbWVQaGFzZSwgR0FNRV9TQ09QRSwKKQoKCmNsYXNzIENhcmRFbWJlZGRpbmdJbmRleDoKICAgICIiIgogICAgTG9hZHMgYW5kIGNhY2hlcyBjYXJkIGVtYmVkZGluZ3MgZnJvbSB0aGUgbWluaW1heGlyL210Zy1lbWJlZGRpbmdzIGRhdGFzZXQuCiAgICBQcm92aWRlcyBuYW1lIOKGkiA3NjgtZGltIHZlY3RvciBsb29rdXAuCgogICAgVXNlcyB0aGUgc2FtZSBOUFogY2FjaGUgYXMgY29hY2gvZW1iZWRkaW5ncy5weSBmb3IgY29uc2lzdGVuY3kuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZW1iZWRkaW5nc19kaXI6IHN0ciA9IE5vbmUpOgogICAgICAgIHNlbGYuZW1iZWRkaW5nc19kaXIgPSBlbWJlZGRpbmdzX2RpciBvciBzdHIoCiAgICAgICAgICAgIFBhdGgoX19maWxlX18pLnBhcmVudC5wYXJlbnQucGFyZW50IC8gImVtYmVkZGluZ3MiCiAgICAgICAgKQogICAgICAgIHNlbGYuX25hbWVfdG9faWR4OiBEaWN0W3N0ciwgaW50XSA9IHt9CiAgICAgICAgc2VsZi5fZW1iZWRkaW5nczogT3B0aW9uYWxbbnAubmRhcnJheV0gPSBOb25lCiAgICAgICAgc2VsZi5fbmFtZXM6IExpc3Rbc3RyXSA9IFtdCiAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UKICAgICAgICBzZWxmLl96ZXJvX3ZlYyA9IG5wLnplcm9zKFNUQVRFX0RJTVMuY2FyZF9lbWJlZGRpbmdfZGltLCBkdHlwZT1ucC5mbG9hdDMyKQoKICAgIGRlZiBsb2FkKHNlbGYpIC0+IGJvb2w6CiAgICAgICAgIiIiTG9hZCBlbWJlZGRpbmdzIGZyb20gTlBaIGNhY2hlLgoKICAgICAgICBTZWFyY2hlcyBtdWx0aXBsZSBrbm93biBsb2NhdGlvbnMgYW5kIGhhbmRsZXMgdHdvIE5QWiBmb3JtYXRzOgogICAgICAgICAgLSBDb2FjaCBmb3JtYXQ6IGtleXMgJ3ZlY3RvcnMnLCAnbmFtZXMnIChzYXZlZCBieSBjb2FjaC9lbWJlZGRpbmdzLnB5KQogICAgICAgICAgLSBNTCBmb3JtYXQ6IGtleXMgJ2VtYmVkZGluZ3MnLCAnbmFtZXMnIChsZWdhY3kpCgogICAgICAgIElmIG5vIE5QWiBpcyBmb3VuZCBhbnl3aGVyZSwgYXV0by1kb3dubG9hZHMgZnJvbSBIdWdnaW5nRmFjZSB2aWEKICAgICAgICB0aGUgY29hY2ggZW1iZWRkaW5nIGluZGV4IGFuZCBjb252ZXJ0cyB0byBOUFouCiAgICAgICAgIiIiCiAgICAgICAgcHJvamVjdF9yb290ID0gUGF0aChfX2ZpbGVfXykucGFyZW50LnBhcmVudC5wYXJlbnQKICAgICAgICBjYW5kaWRhdGVzID0gWwogICAgICAgICAgICBzdHIocHJvamVj' +
'dF9yb290IC8gImRhdGEiIC8gIm10Zy1lbWJlZGRpbmdzLm5weiIpLAogICAgICAgICAgICBzdHIocHJvamVjdF9yb290IC8gImRhdGEiIC8gIm10Z19lbWJlZGRpbmdzLm5weiIpLAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5lbWJlZGRpbmdzX2RpciwgIm10Z19lbWJlZGRpbmdzLm5weiIpLAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5lbWJlZGRpbmdzX2RpciwgIm10Zy1lbWJlZGRpbmdzLm5weiIpLAogICAgICAgICAgICBzdHIocHJvamVjdF9yb290IC8gImVtYmVkZGluZ3MiIC8gIm10Z19lbWJlZGRpbmdzLm5weiIpLAogICAgICAgICAgICBzdHIocHJvamVjdF9yb290IC8gImVtYmVkZGluZ3MiIC8gIm10Zy1lbWJlZGRpbmdzLm5weiIpLAogICAgICAgIF0KICAgICAgICBucHpfcGF0aCA9IE5vbmUKICAgICAgICBmb3IgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXM6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNhbmRpZGF0ZSk6CiAgICAgICAgICAgICAgICBucHpfcGF0aCA9IGNhbmRpZGF0ZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBBdXRvLWRvd25sb2FkIGlmIG5vdGhpbmcgZm91bmQKICAgICAgICBpZiBub3QgbnB6X3BhdGg6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJFbWJlZGRpbmdzIE5QWiBub3QgZm91bmQg4oCUIGF0dGVtcHRpbmcgYXV0by1kb3dubG9hZC4uLiIpCiAgICAgICAgICAgIG5wel9wYXRoID0gc2VsZi5fYXV0b19kb3dubG9hZChwcm9qZWN0X3Jvb3QpCiAgICAgICAgICAgIGlmIG5vdCBucHpfcGF0aDoKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRhdGEgPSBucC5sb2FkKG5wel9wYXRoLCBhbGxvd19waWNrbGU9VHJ1ZSkKICAgICAgICAgICAgIyBIYW5kbGUgYm90aCBOUFogZm9ybWF0czoKICAgICAgICAgICAgIyAgIENvYWNoIGZvcm1hdCBoYXMgJ3ZlY3RvcnMnLCBNTCBsZWdhY3kgaGFzICdlbWJlZGRpbmdzJwogICAgICAgICAgICBpZiAidmVjdG9ycyIgaW4gZGF0YToKICAgICAgICAgICAgICAgIHNlbGYuX2VtYmVkZGluZ3MgPSBkYXRhWyJ2ZWN0b3JzIl0uYXN0eXBlKG5wLmZsb2F0MzIpCiAgICAgICAgICAgIGVsaWYgImVtYmVkZGluZ3MiIGluIGRhdGE6CiAgICAgICAgICAgICAgICBzZWxmLl9lbWJlZGRpbmdzID0gZGF0YVsiZW1iZWRkaW5ncyJdLmFzdHlwZShucC5mbG9hdDMyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJOUFogYXQgJXMgaGFzIG5vICd2ZWN0b3JzJyBvciAnZW1iZWRkaW5ncycga2V5LiBLZXlzOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnB6X3BhdGgsIGxpc3QoZGF0YS5rZXlzKCkpKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIHNlbGYuX25hbWVzID0gbGlzdChkYXRhWyJuYW1lcyJdKQogICAgICAgICAgICBzZWxmLl9uYW1lX3RvX2lkeCA9IHsKICAgICAgICAgICAgICAgIG5hbWUubG93ZXIoKTogaSBmb3IgaSwgbmFtZSBpbiBlbnVtZXJhdGUoc2VsZi5fbmFtZXMpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJMb2FkZWQgJWQgY2FyZCBlbWJlZGRpbmdzICglZC1kaW0pIGZyb20gJXMiLAogICAgICAgICAgICAgICAgbGVuKHNlbGYuX25hbWVzKSwgc2VsZi5fZW1iZWRkaW5ncy5zaGFwZVsxXSwgbnB6X3BhdGgsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGxvYWQgZW1iZWRkaW5nczogJXMiLCBlKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2F1dG9fZG93bmxvYWQocHJvamVjdF9yb290OiBQYXRoKSAtPiBPcHRpb25hbFtzdHJdOgogICAgICAgICIiIkRvd25sb2FkIGVtYmVkZGluZ3MgZnJvbSBIdWdnaW5nRmFjZSB2aWEgdGhlIGNvYWNoIG1vZHVsZS4KCiAgICAgICAgVXNlcyBjb2FjaC9lbWJlZGRpbmdzLnB5IE1UR0VtYmVkZGluZ0luZGV4IHdoaWNoIGhhbmRsZXMgZG93bmxvYWRpbmcKICAgICAgICB0aGUgcGFycXVldCBmcm9tIEh1Z2dpbmdGYWNlIGFuZCBjb252ZXJ0aW5nIHRvIE5QWi4gUmV0dXJucyB0aGUgTlBaCiAgICAgICAgcGF0aCBvbiBzdWNjZXNzLCBvciBO' +
'b25lIG9uIGZhaWx1cmUuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgICAgIHByID0gc3RyKHByb2plY3Rfcm9vdCkKICAgICAgICAgICAgaWYgcHIgbm90IGluIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByKQogICAgICAgICAgICBmcm9tIGNvYWNoLmVtYmVkZGluZ3MgaW1wb3J0IE1UR0VtYmVkZGluZ0luZGV4CiAgICAgICAgICAgIGZyb20gY29hY2guY29uZmlnIGltcG9ydCBFTUJFRERJTkdTX05QWgoKICAgICAgICAgICAgaWR4ID0gTVRHRW1iZWRkaW5nSW5kZXgoKQogICAgICAgICAgICBpZHguZG93bmxvYWRfcGFycXVldCgpCiAgICAgICAgICAgIGlkeC5jb252ZXJ0X3BhcnF1ZXRfdG9fbnB6KCkKCiAgICAgICAgICAgIG5wel9zdHIgPSBzdHIoRU1CRURESU5HU19OUFopCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5wel9zdHIpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkF1dG8tZG93bmxvYWRlZCBlbWJlZGRpbmdzIHRvICVzIiwgbnB6X3N0cikKICAgICAgICAgICAgICAgIHJldHVybiBucHpfc3RyCiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQXV0by1kb3dubG9hZCBjb21wbGV0ZWQgYnV0IE5QWiBub3QgZm91bmQgYXQgJXMiLCBucHpfc3RyKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJBdXRvLWRvd25sb2FkIGZhaWxlZDogJXMiLCBlKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZXRfZW1iZWRkaW5nKHNlbGYsIGNhcmRfbmFtZTogc3RyKSAtPiBucC5uZGFycmF5OgogICAgICAgICIiIkdldCBlbWJlZGRpbmcgdmVjdG9yIGZvciBhIGNhcmQgbmFtZS4gUmV0dXJucyB6ZXJvIHZlY3RvciBpZiBub3QgZm91bmQuIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2xvYWRlZDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3plcm9fdmVjCiAgICAgICAgaWR4ID0gc2VsZi5fbmFtZV90b19pZHguZ2V0KGNhcmRfbmFtZS5sb3dlcigpKQogICAgICAgIGlmIGlkeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VtYmVkZGluZ3NbaWR4XQogICAgICAgICMgVHJ5IGZ1enp5IG1hdGNoOiBzdHJpcCB0cmFpbGluZyBzZXQgY29kZXMsIGFydGljbGVzCiAgICAgICAgY2xlYW4gPSBjYXJkX25hbWUubG93ZXIoKS5zcGxpdCgifCIpWzBdLnN0cmlwKCkKICAgICAgICBpZHggPSBzZWxmLl9uYW1lX3RvX2lkeC5nZXQoY2xlYW4pCiAgICAgICAgaWYgaWR4IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZW1iZWRkaW5nc1tpZHhdCiAgICAgICAgcmV0dXJuIHNlbGYuX3plcm9fdmVjCgogICAgZGVmIG1lYW5fcG9vbF96b25lKHNlbGYsIGNhcmRfbmFtZXM6IExpc3Rbc3RyXSkgLT4gbnAubmRhcnJheToKICAgICAgICAiIiJNZWFuLXBvb2wgZW1iZWRkaW5ncyBmb3IgYSBsaXN0IG9mIGNhcmQgbmFtZXMgKGEgZ2FtZSB6b25lKS4iIiIKICAgICAgICBpZiBub3QgY2FyZF9uYW1lczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3plcm9fdmVjCiAgICAgICAgdmVjdG9ycyA9IFtzZWxmLmdldF9lbWJlZGRpbmcobmFtZSkgZm9yIG5hbWUgaW4gY2FyZF9uYW1lc10KICAgICAgICByZXR1cm4gbnAubWVhbih2ZWN0b3JzLCBheGlzPTApLmFzdHlwZShucC5mbG9hdDMyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xvYWRlZChzZWxmKSAtPiBib29sOgogICAgICAgIHJldHVybiBzZWxmLl9sb2FkZWQKCgpjbGFzcyBTdGF0ZUVuY29kZXI6CiAgICAiIiIKICAgIEVuY29kZXMgYSBkZWNpc2lvbiBzbmFwc2hvdCBKU09OIGRpY3QgaW50byBhIGZpeGVkLXNpemUgbnVtcHkgdmVjdG9yLgoKICAgIElucHV0OiBhIGRpY3QgZnJvbSB0aGUgSlNPTkwgZmlsZSAob25lIGRlY2lzaW9uIHNuYXBzaG90KQogICAgT3V0cHV0OiBucC5uZGFycmF5IG9mIHNoYXBlICg2MTc3LCkKCiAgICBDb21wb25lbnRzOgogICAgICBbMDoyOV0gICAgIC0gR2xvYmFsIGZlYXR1cmVzIChsaWZlLCBtYW5hLCB0dXJuLCBwaGFzZSwgZXRjLikKICAgICAgWzI5OjYxNzNdICAtIFpvbmUgZW1iZWRkaW5ncyAoNCB6b25lcyDDlyAyIHBsYXllcnMgw5cgNzY4KQogICAgICBbNjE3Mzo2MTc3XSAtIFBsYXlzdHlsZSBvbmUtaG90ICg0IGRpbXMpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FyZF9pbmRl' +
'eDogQ2FyZEVtYmVkZGluZ0luZGV4KToKICAgICAgICBzZWxmLmNhcmRfaW5kZXggPSBjYXJkX2luZGV4CiAgICAgICAgc2VsZi5kaW0gPSBTVEFURV9ESU1TCgogICAgZGVmIGVuY29kZShzZWxmLCBkZWNpc2lvbjogZGljdCwgcGxheXN0eWxlOiBzdHIgPSAibWlkcmFuZ2UiKSAtPiBucC5uZGFycmF5OgogICAgICAgICIiIgogICAgICAgIEVuY29kZSBhIHNpbmdsZSBkZWNpc2lvbiBzbmFwc2hvdCBpbnRvIGEgc3RhdGUgdmVjdG9yLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBkZWNpc2lvbjogRGljdCBsb2FkZWQgZnJvbSBKU09OTCBsaW5lCiAgICAgICAgICAgIHBsYXlzdHlsZTogRGVjayBhcmNoZXR5cGUgc3RyaW5nIChhZ2dyby9jb250cm9sL21pZHJhbmdlL2NvbWJvKQoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBucC5uZGFycmF5IG9mIHNoYXBlICh0b3RhbF9zdGF0ZV9kaW0sKQogICAgICAgICIiIgogICAgICAgIHBsYXllcnMgPSBkZWNpc2lvbi5nZXQoInBsYXllcnMiLCBbXSkKICAgICAgICBpZiBsZW4ocGxheWVycykgPCAyOgogICAgICAgICAgICAjIFBhZCB0byAyIHBsYXllcnMgZm9yIDF2MQogICAgICAgICAgICB3aGlsZSBsZW4ocGxheWVycykgPCAyOgogICAgICAgICAgICAgICAgcGxheWVycy5hcHBlbmQoc2VsZi5fZW1wdHlfcGxheWVyKGxlbihwbGF5ZXJzKSkpCgogICAgICAgICMgMS4gR2xvYmFsIGZlYXR1cmVzCiAgICAgICAgZ2xvYmFsX3ZlYyA9IHNlbGYuX2VuY29kZV9nbG9iYWwoZGVjaXNpb24sIHBsYXllcnMpCgogICAgICAgICMgMi4gWm9uZSBlbWJlZGRpbmdzCiAgICAgICAgem9uZV92ZWMgPSBzZWxmLl9lbmNvZGVfem9uZXMocGxheWVycykKCiAgICAgICAgIyAzLiBQbGF5c3R5bGUgb25lLWhvdAogICAgICAgIHN0eWxlX3ZlYyA9IHNlbGYuX2VuY29kZV9wbGF5c3R5bGUocGxheXN0eWxlKQoKICAgICAgICAjIENvbmNhdGVuYXRlCiAgICAgICAgc3RhdGUgPSBucC5jb25jYXRlbmF0ZShbZ2xvYmFsX3ZlYywgem9uZV92ZWMsIHN0eWxlX3ZlY10pCiAgICAgICAgYXNzZXJ0IHN0YXRlLnNoYXBlWzBdID09IHNlbGYuZGltLnRvdGFsX3N0YXRlX2RpbSwgKAogICAgICAgICAgICBmIlN0YXRlIGRpbSBtaXNtYXRjaDoge3N0YXRlLnNoYXBlWzBdfSAhPSB7c2VsZi5kaW0udG90YWxfc3RhdGVfZGltfSIKICAgICAgICApCiAgICAgICAgcmV0dXJuIHN0YXRlLmFzdHlwZShucC5mbG9hdDMyKQoKICAgIGRlZiBfZW5jb2RlX2dsb2JhbChzZWxmLCBkZWNpc2lvbjogZGljdCwgcGxheWVyczogbGlzdCkgLT4gbnAubmRhcnJheToKICAgICAgICAiIiJFbmNvZGUgZ2xvYmFsIHNjYWxhciBmZWF0dXJlcy4gU2hhcGU6ICgyOSwpIiIiCiAgICAgICAgZmVhdHVyZXMgPSBbXQoKICAgICAgICBmb3IgcCBpbiBwbGF5ZXJzWzoyXTogICMgRXhhY3RseSAyIHBsYXllcnMgZm9yIDF2MQogICAgICAgICAgICAjIFBlci1wbGF5ZXIgc2NhbGFycyAoMTAgZWFjaCkKICAgICAgICAgICAgbGlmZSA9IHAuZ2V0KCJsaWZlIiwgNDApCiAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChsaWZlIC8gNDAuMCkgICMgTm9ybWFsaXplZCBsaWZlCgogICAgICAgICAgICBjbWRyX2RtZyA9IHAuZ2V0KCJjbWRyX2RtZyIsIDApCiAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChjbWRyX2RtZyAvIDIxLjApICAjIE5vcm1hbGl6ZWQgY29tbWFuZGVyIGRhbWFnZQoKICAgICAgICAgICAgbWFuYSA9IHAuZ2V0KCJtYW5hIiwgMCkKICAgICAgICAgICAgZmVhdHVyZXMuYXBwZW5kKG1pbihtYW5hIC8gMjAuMCwgMS4wKSkgICMgTm9ybWFsaXplZCBtYW5hCgogICAgICAgICAgICBjbWRyX3RheCA9IHAuZ2V0KCJjbWRyX3RheCIsIDApCiAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChtaW4oY21kcl90YXggLyAxMC4wLCAxLjApKSAgIyBOb3JtYWxpemVkIHRheAoKICAgICAgICAgICAgaGFuZF9zaXplID0gbGVuKHAuZ2V0KCJoYW5kIiwgW10pKQogICAgICAgICAgICBmZWF0dXJlcy5hcHBlbmQobWluKGhhbmRfc2l6ZSAvIDE1LjAsIDEuMCkpCgogICAgICAgICAgICBncmF2ZV9zaXplID0gbGVuKHAuZ2V0KCJncmF2ZXlhcmQiLCBbXSkpCiAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChtaW4oZ3JhdmVfc2l6ZSAvIDEwMC4wLCAxLjApKQoKICAgICAgICAgICAgY3JlYXR1cmVzID0gcC5nZXQoImNyZWF0dXJlcyIsIDApCiAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChtaW4oY3JlYXR1cmVzIC8gMzAuMCwgMS4wKSkKCiAgICAgICAg' +
'ICAgICMgVG90YWwgcG93ZXIgb24gYm9hcmQgKG5vdCB5ZXQgdHJhY2tlZCBhY2N1cmF0ZWx5OyB1c2UgY3JlYXR1cmVzIGFzIHByb3h5KQogICAgICAgICAgICB0b3RhbF9wb3dlciA9IGNyZWF0dXJlcyAqIDMgICMgcm91Z2ggaGV1cmlzdGljOiBhdmcgMyBwb3dlcgogICAgICAgICAgICBmZWF0dXJlcy5hcHBlbmQobWluKHRvdGFsX3Bvd2VyIC8gMTAwLjAsIDEuMCkpCgogICAgICAgICAgICAjIElzIGFjdGl2ZSBwbGF5ZXIKICAgICAgICAgICAgaXNfYWN0aXZlID0gMS4wIGlmIHAuZ2V0KCJzZWF0IikgPT0gZGVjaXNpb24uZ2V0KCJhY3RpdmVfc2VhdCIpIGVsc2UgMC4wCiAgICAgICAgICAgIGZlYXR1cmVzLmFwcGVuZChpc19hY3RpdmUpCgogICAgICAgICAgICAjIExhbmQgY291bnQgKGV4dHJhIGZlYXR1cmUg4oCUIGhlbHBzIGRpc3Rpbmd1aXNoIHJhbXAgc3RyYXRlZ2llcykKICAgICAgICAgICAgbGFuZHMgPSBwLmdldCgibGFuZHMiLCAwKQogICAgICAgICAgICBmZWF0dXJlcy5hcHBlbmQobWluKGxhbmRzIC8gMTUuMCwgMS4wKSkKCiAgICAgICAgICAgICMgUGhhc2Ugb25lLWhvdCAoNCBkaW1zIHBlciBwbGF5ZXIpCiAgICAgICAgICAgIHBoYXNlX3N0ciA9IGRlY2lzaW9uLmdldCgicGhhc2UiLCAibWFpbl8xIikKICAgICAgICAgICAgcGhhc2Vfb2ggPSBbMC4wXSAqIDQKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGhhc2VfZW51bSA9IEdhbWVQaGFzZShwaGFzZV9zdHIpCiAgICAgICAgICAgICAgICBwaGFzZV9vaFtQSEFTRV9UT19JRFhbcGhhc2VfZW51bV1dID0gMS4wCiAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgS2V5RXJyb3IpOgogICAgICAgICAgICAgICAgcGhhc2Vfb2hbMF0gPSAxLjAgICMgRGVmYXVsdCB0byBtYWluXzEKICAgICAgICAgICAgZmVhdHVyZXMuZXh0ZW5kKHBoYXNlX29oKQoKICAgICAgICAjIFR1cm4gbnVtYmVyICgxIGZlYXR1cmUsIHNoYXJlZCkKICAgICAgICB0dXJuID0gZGVjaXNpb24uZ2V0KCJ0dXJuIiwgMSkKICAgICAgICBmZWF0dXJlcy5hcHBlbmQobWluKHR1cm4gLyBHQU1FX1NDT1BFLm1heF90dXJucywgMS4wKSkKCiAgICAgICAgcmV0dXJuIG5wLmFycmF5KGZlYXR1cmVzLCBkdHlwZT1ucC5mbG9hdDMyKQoKICAgIGRlZiBfZW5jb2RlX3pvbmVzKHNlbGYsIHBsYXllcnM6IGxpc3QpIC0+IG5wLm5kYXJyYXk6CiAgICAgICAgIiIiCiAgICAgICAgRW5jb2RlIHpvbmUgY29udGVudHMgYXMgbWVhbi1wb29sZWQgY2FyZCBlbWJlZGRpbmdzLgogICAgICAgIFNoYXBlOiAoNCB6b25lcyDDlyAyIHBsYXllcnMgw5cgNzY4KSA9ICg2MTQ0LCkKICAgICAgICAiIiIKICAgICAgICB6b25lX2tleXMgPSBbImhhbmQiLCAiYmF0dGxlZmllbGQiLCAiZ3JhdmV5YXJkIiwgImNvbW1hbmRfem9uZSJdCiAgICAgICAgdmVjdG9ycyA9IFtdCgogICAgICAgIGZvciBwIGluIHBsYXllcnNbOjJdOgogICAgICAgICAgICBmb3Igem9uZV9rZXkgaW4gem9uZV9rZXlzOgogICAgICAgICAgICAgICAgY2FyZHMgPSBwLmdldCh6b25lX2tleSwgW10pCiAgICAgICAgICAgICAgICBwb29sZWQgPSBzZWxmLmNhcmRfaW5kZXgubWVhbl9wb29sX3pvbmUoY2FyZHMpCiAgICAgICAgICAgICAgICB2ZWN0b3JzLmFwcGVuZChwb29sZWQpCgogICAgICAgIHJldHVybiBucC5jb25jYXRlbmF0ZSh2ZWN0b3JzKQoKICAgIGRlZiBfZW5jb2RlX3BsYXlzdHlsZShzZWxmLCBwbGF5c3R5bGVfc3RyOiBzdHIpIC0+IG5wLm5kYXJyYXk6CiAgICAgICAgIiIiT25lLWhvdCBlbmNvZGUgdGhlIHBsYXlzdHlsZS4gU2hhcGU6ICg0LCkiIiIKICAgICAgICB2ZWMgPSBucC56ZXJvcyhzZWxmLmRpbS5wbGF5c3R5bGVfZGltLCBkdHlwZT1ucC5mbG9hdDMyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3R5bGUgPSBQbGF5c3R5bGUocGxheXN0eWxlX3N0ci5sb3dlcigpKQogICAgICAgICAgICB2ZWNbUExBWVNUWUxFX1RPX0lEWFtzdHlsZV1dID0gMS4wCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBLZXlFcnJvcik6CiAgICAgICAgICAgICMgRGVmYXVsdDogbWlkcmFuZ2UKICAgICAgICAgICAgdmVjW1BMQVlTVFlMRV9UT19JRFhbUGxheXN0eWxlLk1JRFJBTkdFXV0gPSAxLjAKICAgICAgICByZXR1cm4gdmVjCgogICAgZGVmIF9lbXB0eV9wbGF5ZXIoc2VsZiwgc2VhdDogaW50KSAtPiBkaWN0OgogICAgICAgICIiIkNyZWF0ZSBhbiBlbXB0eSBwbGF5ZXIgZGljdCBmb3IgcGFkZGluZy4iIiIKICAgICAgICByZXR1' +
'cm4gewogICAgICAgICAgICAic2VhdCI6IHNlYXQsCiAgICAgICAgICAgICJsaWZlIjogNDAsCiAgICAgICAgICAgICJjbWRyX2RtZyI6IDAsCiAgICAgICAgICAgICJtYW5hIjogMCwKICAgICAgICAgICAgImNtZHJfdGF4IjogMCwKICAgICAgICAgICAgImNyZWF0dXJlcyI6IDAsCiAgICAgICAgICAgICJsYW5kcyI6IDAsCiAgICAgICAgICAgICJoYW5kIjogW10sCiAgICAgICAgICAgICJiYXR0bGVmaWVsZCI6IFtdLAogICAgICAgICAgICAiZ3JhdmV5YXJkIjogW10sCiAgICAgICAgICAgICJjb21tYW5kX3pvbmUiOiBbXSwKICAgICAgICB9CgoKZGVmIGVuY29kZV9kZWNpc2lvbnNfZmlsZSgKICAgIGpzb25sX3BhdGg6IHN0ciwKICAgIGNhcmRfaW5kZXg6IENhcmRFbWJlZGRpbmdJbmRleCwKICAgIG1heF9zYW1wbGVzOiBpbnQgPSBOb25lLAopIC0+IFR1cGxlW25wLm5kYXJyYXksIExpc3RbZGljdF1dOgogICAgIiIiCiAgICBFbmNvZGUgYWxsIGRlY2lzaW9ucyBmcm9tIGEgSlNPTkwgZmlsZSBpbnRvIGEgc3RhdGUgbWF0cml4LgoKICAgIEFyZ3M6CiAgICAgICAganNvbmxfcGF0aDogUGF0aCB0byBtbC1kZWNpc2lvbnMtKi5qc29ubCBmaWxlCiAgICAgICAgY2FyZF9pbmRleDogTG9hZGVkIGNhcmQgZW1iZWRkaW5nIGluZGV4CiAgICAgICAgbWF4X3NhbXBsZXM6IE1heGltdW0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gZW5jb2RlIChOb25lID0gYWxsKQoKICAgIFJldHVybnM6CiAgICAgICAgKHN0YXRlcywgcmF3X2RlY2lzaW9ucykgd2hlcmU6CiAgICAgICAgICBzdGF0ZXM6IG5wLm5kYXJyYXkgb2Ygc2hhcGUgKE4sIDYxNzcpCiAgICAgICAgICByYXdfZGVjaXNpb25zOiBsaXN0IG9mIG9yaWdpbmFsIEpTT04gZGljdHMgKGZvciBhY3Rpb24gbGFiZWxzKQogICAgIiIiCiAgICBlbmNvZGVyID0gU3RhdGVFbmNvZGVyKGNhcmRfaW5kZXgpCiAgICBzdGF0ZXMgPSBbXQogICAgcmF3ID0gW10KCiAgICB3aXRoIG9wZW4oanNvbmxfcGF0aCwgInIiKSBhcyBmOgogICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShmKToKICAgICAgICAgICAgaWYgbWF4X3NhbXBsZXMgYW5kIGkgPj0gbWF4X3NhbXBsZXM6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVjaXNpb24gPSBqc29uLmxvYWRzKGxpbmUpCiAgICAgICAgICAgICAgICBwbGF5c3R5bGUgPSBkZWNpc2lvbi5nZXQoImFyY2hldHlwZSIsICJtaWRyYW5nZSIpCiAgICAgICAgICAgICAgICBzdGF0ZV92ZWMgPSBlbmNvZGVyLmVuY29kZShkZWNpc2lvbiwgcGxheXN0eWxlKQogICAgICAgICAgICAgICAgc3RhdGVzLmFwcGVuZChzdGF0ZV92ZWMpCiAgICAgICAgICAgICAgICByYXcuYXBwZW5kKGRlY2lzaW9uKQogICAgICAgICAgICBleGNlcHQgKGpzb24uSlNPTkRlY29kZUVycm9yLCBFeGNlcHRpb24pIGFzIGU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiU2tpcHBpbmcgbGluZSAlZDogJXMiLCBpLCBlKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICBpZiBub3Qgc3RhdGVzOgogICAgICAgIHJldHVybiBucC5lbXB0eSgoMCwgU1RBVEVfRElNUy50b3RhbF9zdGF0ZV9kaW0pLCBkdHlwZT1ucC5mbG9hdDMyKSwgW10KCiAgICByZXR1cm4gbnAuc3RhY2soc3RhdGVzKSwgcmF3Cg=='
Install-B64 -R 'ml\encoder\state_encoder.py' -B $b
# ml/eval/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\eval\__init__.py' -B $b
# ml/eval/tournament.py (14,481 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFRvdXJuYW1lbnQgRXZhbHVhdG9yIChQaGFzZSAxMCkK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQClJvdW5kLXJvYmluIGV2YWx1YXRpb24gb2YgbXVsdGlwbGUgQUkgcG9saWNpZXM6CiAgLSBMZWFybmVkIFBvbGljeSAoc3VwZXJ2aXNlZCBvciBQUE8gY2hlY2twb2ludCkKICAtIEhldXJpc3RpYyBQb2xpY3kgKHJ1bGUtYmFzZWQgYmFzZWxpbmUpCiAgLSBSYW5kb20gUG9saWN5ICh1bmlmb3JtIHJhbmRvbSBiYXNlbGluZSkKICAtIEZvcmdlIEFJICh2aWEgSmF2YSBzdWJwcm9jZXNzLCB3aGVuIGF2YWlsYWJsZSkKClJ1bnMgbWFueSBzeW50aGV0aWMgZ2FtZXMgYmV0d2VlbiBlYWNoIHBhaXIgb2YgcG9saWNpZXMsCnRyYWNrcyB3aW4gcmF0ZXMsIGFuZCBwcm9kdWNlcyBhIHRvdXJuYW1lbnQgcmVzdWx0cyB0YWJsZS4KClVzYWdlOgogICAgcHl0aG9uIC1tIG1sLmV2YWwudG91cm5hbWVudAogICAgcHl0aG9uIC1tIG1sLmV2YWwudG91cm5hbWVudCAtLWVwaXNvZGVzIDEwMCAtLWNoZWNrcG9pbnQgbWwvbW9kZWxzL2NoZWNrcG9pbnRzL2Jlc3RfcHBvLnB0CiIiIgoKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZApmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY29tYmluYXRpb25zCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwsIFR1cGxlCgppbXBvcnQgbnVtcHkgYXMgbnAKCnByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50LnBhcmVudCkKaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgpmcm9tIG1sLmNvbmZpZy5zY29wZSBpbXBvcnQgTlVNX0FDVElPTlMsIFNUQVRFX0RJTVMsIElEWF9UT19BQ1RJT04KZnJvbSBtbC50cmFpbmluZy5yZXdhcmQgaW1wb3J0IFJld2FyZENvbmZpZwpmcm9tIG1sLnRyYWluaW5nLnNlbGZfcGxheSBpbXBvcnQgKAogICAgR2FtZVN0YXRlLCBjcmVhdGVfcmFuZG9tX2luaXRpYWxfc3RhdGUsIGFwcGx5X2FjdGlvbiwgYWR2YW5jZV90dXJuLAogICAgZW5jb2RlX3N0YXRlX3NpbXBsZSwgUmFuZG9tUG9saWN5LCBIZXVyaXN0aWNQb2xpY3ksCiAgICBydW5fc2VsZl9wbGF5X2VwaXNvZGUsCikKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJtbC5ldmFsLnRvdXJuYW1lbnQiKQoKCmNsYXNzIExlYXJuZWRQb2xpY3k6CiAgICAiIiJQb2xpY3kgdGhhdCB1c2VzIGEgdHJhaW5lZCBuZXVyYWwgbmV0d29yayBjaGVja3BvaW50LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjaGVja3BvaW50X3BhdGg6IHN0ciwgZGV2aWNlOiBzdHIgPSAiY3B1Iik6CiAgICAgICAgaW1wb3J0IHRvcmNoCiAgICAgICAgaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgoKICAgICAgICBzZWxmLnRvcmNoID0gdG9yY2gKICAgICAgICBzZWxmLkYgPSBGCiAgICAgICAgc2VsZi5kZXZpY2UgPSBkZXZpY2UKICAgICAgICBzZWxmLm1vZGVsID0gTm9uZQogICAgICAgIHNlbGYubmFtZSA9ICJsZWFybmVkIgoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjaGVja3BvaW50X3BhdGgpOgogICAgICAgICAgICBjaGVja3BvaW50ID0gdG9yY2gubG9hZChjaGVja3BvaW50X3BhdGgsIG1hcF9sb2NhdGlvbj1kZXZpY2UsIHdlaWdodHNfb25seT1GYWxzZSkKICAgICAgICAgICAgY29uZmlnID0gY2hlY2twb2ludC5nZXQoIm1vZGVsX2NvbmZpZyIsIHt9KQoKICAgICAgICAgICAgIyBUcnkgUG9saWN5VmFsdWVOZXR3b3JrIGZpcnN0IChQUE8pLCBmYWxsIGJhY2sgdG8gUG9saWN5TmV0d29yayAoc3VwZXJ2aXNlZCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZnJvbSBtbC50cmFpbmluZy5wb2xpY3lfbmV0d29yayBpbXBvcnQgUG9saWN5VmFsdWVOZXR3b3JrCiAgICAgICAgICAgICAgICBzZWxmLm1vZGVsID0gUG9saWN5VmFsdWVOZXR3b3JrKAogICAgICAgICAgICAgICAgICAgIGlucHV0X2RpbT1jb25maWcuZ2V0KCJpbnB1dF9kaW0iLCBTVEFURV9E' +
'SU1TLnRvdGFsX3N0YXRlX2RpbSksCiAgICAgICAgICAgICAgICAgICAgaGlkZGVuX2RpbT1jb25maWcuZ2V0KCJoaWRkZW5fZGltIiwgNTEyKSwKICAgICAgICAgICAgICAgICAgICBudW1fYWN0aW9ucz1jb25maWcuZ2V0KCJudW1fYWN0aW9ucyIsIE5VTV9BQ1RJT05TKSwKICAgICAgICAgICAgICAgICAgICBudW1fbGF5ZXJzPWNvbmZpZy5nZXQoIm51bV9sYXllcnMiLCAzKSwKICAgICAgICAgICAgICAgICAgICBkcm9wb3V0PWNvbmZpZy5nZXQoImRyb3BvdXQiLCAwLjApLAogICAgICAgICAgICAgICAgKS50byhkZXZpY2UpCiAgICAgICAgICAgICAgICBzZWxmLm1vZGVsLmxvYWRfc3RhdGVfZGljdChjaGVja3BvaW50WyJtb2RlbF9zdGF0ZV9kaWN0Il0pCiAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSAibGVhcm5lZF9wcG8iCiAgICAgICAgICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBLZXlFcnJvcik6CiAgICAgICAgICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnBvbGljeV9uZXR3b3JrIGltcG9ydCBQb2xpY3lOZXR3b3JrCiAgICAgICAgICAgICAgICBzZWxmLm1vZGVsID0gUG9saWN5TmV0d29yaygKICAgICAgICAgICAgICAgICAgICBpbnB1dF9kaW09Y29uZmlnLmdldCgiaW5wdXRfZGltIiwgU1RBVEVfRElNUy50b3RhbF9zdGF0ZV9kaW0pLAogICAgICAgICAgICAgICAgICAgIGhpZGRlbl9kaW09Y29uZmlnLmdldCgiaGlkZGVuX2RpbSIsIDUxMiksCiAgICAgICAgICAgICAgICAgICAgbnVtX2FjdGlvbnM9Y29uZmlnLmdldCgibnVtX2FjdGlvbnMiLCBOVU1fQUNUSU9OUyksCiAgICAgICAgICAgICAgICAgICAgbnVtX2xheWVycz1jb25maWcuZ2V0KCJudW1fbGF5ZXJzIiwgMyksCiAgICAgICAgICAgICAgICAgICAgZHJvcG91dD1jb25maWcuZ2V0KCJkcm9wb3V0IiwgMC4wKSwKICAgICAgICAgICAgICAgICkudG8oZGV2aWNlKQogICAgICAgICAgICAgICAgc2VsZi5tb2RlbC5sb2FkX3N0YXRlX2RpY3QoY2hlY2twb2ludFsibW9kZWxfc3RhdGVfZGljdCJdKQogICAgICAgICAgICAgICAgc2VsZi5uYW1lID0gImxlYXJuZWRfc3VwZXJ2aXNlZCIKCiAgICAgICAgICAgIHNlbGYubW9kZWwuZXZhbCgpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJMb2FkZWQgY2hlY2twb2ludDogJXMiLCBjaGVja3BvaW50X3BhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkNoZWNrcG9pbnQgbm90IGZvdW5kOiAlcyDigJQgd2lsbCBhY3QgYXMgcmFuZG9tIiwgY2hlY2twb2ludF9wYXRoKQoKICAgIGRlZiBzZWxlY3RfYWN0aW9uKHNlbGYsIHN0YXRlX3ZlYzogbnAubmRhcnJheSkgLT4gVHVwbGVbaW50LCBmbG9hdF06CiAgICAgICAgaWYgc2VsZi5tb2RlbCBpcyBOb25lOgogICAgICAgICAgICBhY3Rpb24gPSBucC5yYW5kb20ucmFuZGludCgwLCBOVU1fQUNUSU9OUykKICAgICAgICAgICAgcmV0dXJuIGFjdGlvbiwgLW5wLmxvZyhOVU1fQUNUSU9OUykKCiAgICAgICAgc3RhdGVfdGVuc29yID0gc2VsZi50b3JjaC5mcm9tX251bXB5KHN0YXRlX3ZlYykudW5zcXVlZXplKDApLnRvKHNlbGYuZGV2aWNlKQogICAgICAgIHdpdGggc2VsZi50b3JjaC5ub19ncmFkKCk6CiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5tb2RlbCwgJ2ZvcndhcmRfd2l0aF92YWx1ZScpOgogICAgICAgICAgICAgICAgbG9naXRzLCBfID0gc2VsZi5tb2RlbC5mb3J3YXJkX3dpdGhfdmFsdWUoc3RhdGVfdGVuc29yKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9naXRzID0gc2VsZi5tb2RlbChzdGF0ZV90ZW5zb3IpCgogICAgICAgICAgICBwcm9icyA9IHNlbGYuRi5zb2Z0bWF4KGxvZ2l0cywgZGltPS0xKQogICAgICAgICAgICBhY3Rpb24gPSBwcm9icy5hcmdtYXgoZGltPS0xKS5pdGVtKCkgICMgR3JlZWR5IGZvciBldmFsdWF0aW9uCiAgICAgICAgICAgIGxvZ19wcm9iID0gc2VsZi50b3JjaC5sb2cocHJvYnNbMCwgYWN0aW9uXSkuaXRlbSgpCgogICAgICAgIHJldHVybiBhY3Rpb24sIGxvZ19wcm9iCgoKQGRhdGFjbGFzcwpjbGFzcyBNYXRjaFJlc3VsdDoKICAgICIiIlJlc3VsdCBvZiBhIHNpbmdsZSBtYXRjaCBiZXR3ZWVuIHR3byBwb2xpY2llcy4iIiIKICAgIHBvbGljeV9hOiBzdHIKICAgIHBvbGljeV9iOiBzdHIKICAgIHdpbm5lcjogT3B0aW9uYWxbc3RyXSAgIyBOYW1lIG9mIHdpbm5lciwgb3IgTm9uZSBmb3IgZHJhdwogICAgc3RlcHM6IGludAogICAgdG90YWxfcmV3YXJkX2E6IGZsb2F0CiAgICB0' +
'b3RhbF9yZXdhcmRfYjogZmxvYXQKICAgIHRpbWVvdXQ6IGJvb2wgPSBGYWxzZQoKCkBkYXRhY2xhc3MKY2xhc3MgVG91cm5hbWVudFJlc3VsdDoKICAgICIiIkFnZ3JlZ2F0ZWQgdG91cm5hbWVudCByZXN1bHRzLiIiIgogICAgcG9saWNpZXM6IExpc3Rbc3RyXQogICAgbWF0Y2hfcmVzdWx0czogTGlzdFtNYXRjaFJlc3VsdF0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIHdpbl9tYXRyaXg6IERpY3QgPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9ZGljdCkKICAgIHdpbl9yYXRlczogRGljdCA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1kaWN0KQogICAgdG90YWxfbWF0Y2hlczogaW50ID0gMAogICAgdG90YWxfdGltZV9zOiBmbG9hdCA9IDAuMAoKICAgIGRlZiB0b19kaWN0KHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInBvbGljaWVzIjogc2VsZi5wb2xpY2llcywKICAgICAgICAgICAgInRvdGFsX21hdGNoZXMiOiBzZWxmLnRvdGFsX21hdGNoZXMsCiAgICAgICAgICAgICJ0b3RhbF90aW1lX3MiOiByb3VuZChzZWxmLnRvdGFsX3RpbWVfcywgMSksCiAgICAgICAgICAgICJ3aW5fcmF0ZXMiOiBzZWxmLndpbl9yYXRlcywKICAgICAgICAgICAgIndpbl9tYXRyaXgiOiBzZWxmLndpbl9tYXRyaXgsCiAgICAgICAgICAgICJtYXRjaGVzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJwb2xpY3lfYSI6IG0ucG9saWN5X2EsCiAgICAgICAgICAgICAgICAgICAgInBvbGljeV9iIjogbS5wb2xpY3lfYiwKICAgICAgICAgICAgICAgICAgICAid2lubmVyIjogbS53aW5uZXIsCiAgICAgICAgICAgICAgICAgICAgInN0ZXBzIjogbS5zdGVwcywKICAgICAgICAgICAgICAgICAgICAidGltZW91dCI6IG0udGltZW91dCwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciBtIGluIHNlbGYubWF0Y2hfcmVzdWx0cwogICAgICAgICAgICBdLAogICAgICAgIH0KCgpkZWYgcnVuX21hdGNoKAogICAgcG9saWN5X2EsIG5hbWVfYTogc3RyLAogICAgcG9saWN5X2IsIG5hbWVfYjogc3RyLAogICAgcGxheXN0eWxlOiBzdHIgPSAibWlkcmFuZ2UiLAogICAgbWF4X3N0ZXBzOiBpbnQgPSA1MCwKICAgIHJld2FyZF9jb25maWc6IFJld2FyZENvbmZpZyA9IE5vbmUsCikgLT4gTWF0Y2hSZXN1bHQ6CiAgICAiIiJSdW4gYSBzaW5nbGUgbWF0Y2ggYmV0d2VlbiB0d28gcG9saWNpZXMuCgogICAgcG9saWN5X2EgcGxheXMgYXMgc2VhdCAwLCBwb2xpY3lfYiBhcyBzZWF0IDEuCiAgICAiIiIKICAgIHN0YXRlID0gY3JlYXRlX3JhbmRvbV9pbml0aWFsX3N0YXRlKCkKICAgIGNmZyA9IHJld2FyZF9jb25maWcgb3IgUmV3YXJkQ29uZmlnKCkKCiAgICB0b3RhbF9yZXdhcmRfYSA9IDAuMAogICAgdG90YWxfcmV3YXJkX2IgPSAwLjAKICAgIHN0ZXBzID0gMAoKICAgIGZvciBzdGVwIGluIHJhbmdlKG1heF9zdGVwcyk6CiAgICAgICAgaWYgc3RhdGUuZ2FtZV9vdmVyOgogICAgICAgICAgICBicmVhawoKICAgICAgICBwcmV2X3NuYXBzaG90ID0gc3RhdGUudG9fc25hcHNob3QoKQoKICAgICAgICAjIFBvbGljeSBBJ3MgdHVybiAoc2VhdCAwKQogICAgICAgIHN0YXRlX3ZlY19hID0gZW5jb2RlX3N0YXRlX3NpbXBsZShzdGF0ZSwgYWdlbnRfc2VhdD0wLCBwbGF5c3R5bGU9cGxheXN0eWxlKQogICAgICAgIGFjdGlvbl9hLCBfID0gcG9saWN5X2Euc2VsZWN0X2FjdGlvbihzdGF0ZV92ZWNfYSkKICAgICAgICBzdGF0ZSA9IGFwcGx5X2FjdGlvbihzdGF0ZSwgYWN0aW9uX2EsIHBsYXllcl9zZWF0PTApCgogICAgICAgIGlmIHN0YXRlLmdhbWVfb3ZlcjoKICAgICAgICAgICAgc3RlcHMgPSBzdGVwICsgMQogICAgICAgICAgICBicmVhawoKICAgICAgICAjIFBvbGljeSBCJ3MgdHVybiAoc2VhdCAxKQogICAgICAgIHN0YXRlX3ZlY19iID0gZW5jb2RlX3N0YXRlX3NpbXBsZShzdGF0ZSwgYWdlbnRfc2VhdD0xLCBwbGF5c3R5bGU9cGxheXN0eWxlKQogICAgICAgIGFjdGlvbl9iLCBfID0gcG9saWN5X2Iuc2VsZWN0X2FjdGlvbihzdGF0ZV92ZWNfYikKICAgICAgICBzdGF0ZSA9IGFwcGx5X2FjdGlvbihzdGF0ZSwgYWN0aW9uX2IsIHBsYXllcl9zZWF0PTEpCgogICAgICAgIHN0ZXBzID0gc3RlcCArIDEKCiAgICAgICAgaWYgc3RhdGUuZ2FtZV9vdmVyOgogICAgICAgICAgICBicmVhawoKICAgICAgICBzdGF0ZSA9IGFkdmFuY2VfdHVybihzdGF0ZSkKCiAgICAjIERldGVybWluZSB3aW5uZXIKICAg' +
'IHdpbm5lciA9IE5vbmUKICAgIHRpbWVvdXQgPSBGYWxzZQoKICAgIGlmIHN0YXRlLmdhbWVfb3ZlcjoKICAgICAgICBpZiBzdGF0ZS5kcmF3OgogICAgICAgICAgICB3aW5uZXIgPSBOb25lCiAgICAgICAgZWxpZiBzdGF0ZS50aW1lb3V0OgogICAgICAgICAgICB0aW1lb3V0ID0gVHJ1ZQogICAgICAgICAgICBpZiBzdGF0ZS53aW5uZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB3aW5uZXIgPSBuYW1lX2EgaWYgc3RhdGUud2lubmVyID09IDAgZWxzZSBuYW1lX2IKICAgICAgICBlbGlmIHN0YXRlLndpbm5lciBpcyBub3QgTm9uZToKICAgICAgICAgICAgd2lubmVyID0gbmFtZV9hIGlmIHN0YXRlLndpbm5lciA9PSAwIGVsc2UgbmFtZV9iCiAgICBlbHNlOgogICAgICAgICMgTWF4IHN0ZXBzIHJlYWNoZWQgd2l0aG91dCBnYW1lIGVuZGluZyDigJQgY2hlY2sgbGlmZSB0b3RhbHMKICAgICAgICB0aW1lb3V0ID0gVHJ1ZQogICAgICAgIGlmIHN0YXRlLnBsYXllcnNbMF0ubGlmZV90b3RhbCA+IHN0YXRlLnBsYXllcnNbMV0ubGlmZV90b3RhbDoKICAgICAgICAgICAgd2lubmVyID0gbmFtZV9hCiAgICAgICAgZWxpZiBzdGF0ZS5wbGF5ZXJzWzFdLmxpZmVfdG90YWwgPiBzdGF0ZS5wbGF5ZXJzWzBdLmxpZmVfdG90YWw6CiAgICAgICAgICAgIHdpbm5lciA9IG5hbWVfYgogICAgICAgICMgZWxzZSBkcmF3CgogICAgcmV0dXJuIE1hdGNoUmVzdWx0KAogICAgICAgIHBvbGljeV9hPW5hbWVfYSwKICAgICAgICBwb2xpY3lfYj1uYW1lX2IsCiAgICAgICAgd2lubmVyPXdpbm5lciwKICAgICAgICBzdGVwcz1zdGVwcywKICAgICAgICB0b3RhbF9yZXdhcmRfYT10b3RhbF9yZXdhcmRfYSwKICAgICAgICB0b3RhbF9yZXdhcmRfYj10b3RhbF9yZXdhcmRfYiwKICAgICAgICB0aW1lb3V0PXRpbWVvdXQsCiAgICApCgoKZGVmIHJ1bl90b3VybmFtZW50KAogICAgcG9saWNpZXM6IERpY3Rbc3RyLCBvYmplY3RdLAogICAgZXBpc29kZXNfcGVyX21hdGNodXA6IGludCA9IDEwMCwKICAgIHBsYXlzdHlsZTogc3RyID0gIm1pZHJhbmdlIiwKKSAtPiBUb3VybmFtZW50UmVzdWx0OgogICAgIiIiUnVuIGEgcm91bmQtcm9iaW4gdG91cm5hbWVudCBiZXR3ZWVuIGFsbCBwb2xpY3kgcGFpcnMuCgogICAgQXJnczoKICAgICAgICBwb2xpY2llczogRGljdCBtYXBwaW5nIHBvbGljeSBuYW1lIOKGkiBwb2xpY3kgb2JqZWN0ICh3aXRoIHNlbGVjdF9hY3Rpb24gbWV0aG9kKQogICAgICAgIGVwaXNvZGVzX3Blcl9tYXRjaHVwOiBHYW1lcyBwZXIgcGFpciAocGxheWVkIGJvdGggc2lkZXMpCiAgICAgICAgcGxheXN0eWxlOiBEZWZhdWx0IHBsYXlzdHlsZQoKICAgIFJldHVybnM6CiAgICAgICAgVG91cm5hbWVudFJlc3VsdCB3aXRoIGZ1bGwgc3RhdHMKICAgICIiIgogICAgdF9zdGFydCA9IHRpbWUudGltZSgpCiAgICBuYW1lcyA9IGxpc3QocG9saWNpZXMua2V5cygpKQogICAgcmVzdWx0ID0gVG91cm5hbWVudFJlc3VsdChwb2xpY2llcz1uYW1lcykKCiAgICAjIEluaXRpYWxpemUgd2luIG1hdHJpeAogICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgcmVzdWx0Lndpbl9tYXRyaXhbbmFtZV0gPSB7bjogMCBmb3IgbiBpbiBuYW1lc30KICAgICAgICByZXN1bHQud2luX3JhdGVzW25hbWVdID0geyJ3aW5zIjogMCwgImxvc3NlcyI6IDAsICJkcmF3cyI6IDAsICJ0b3RhbCI6IDB9CgogICAgdG90YWxfbWF0Y2h1cHMgPSBsZW4obGlzdChjb21iaW5hdGlvbnMobmFtZXMsIDIpKSkKICAgIGxvZ2dlci5pbmZvKCJUb3VybmFtZW50OiAlZCBwb2xpY2llcywgJWQgbWF0Y2h1cHMsICVkIGdhbWVzIGVhY2ggKMOXMiBzaWRlcykgPSAlZCB0b3RhbCBnYW1lcyIsCiAgICAgICAgICAgICAgICBsZW4obmFtZXMpLCB0b3RhbF9tYXRjaHVwcywgZXBpc29kZXNfcGVyX21hdGNodXAsCiAgICAgICAgICAgICAgICB0b3RhbF9tYXRjaHVwcyAqIGVwaXNvZGVzX3Blcl9tYXRjaHVwICogMikKICAgIGxvZ2dlci5pbmZvKCIiKQoKICAgIGZvciBuYW1lX2EsIG5hbWVfYiBpbiBjb21iaW5hdGlvbnMobmFtZXMsIDIpOgogICAgICAgIHBvbGljeV9hID0gcG9saWNpZXNbbmFtZV9hXQogICAgICAgIHBvbGljeV9iID0gcG9saWNpZXNbbmFtZV9iXQoKICAgICAgICBhX3dpbnMgPSAwCiAgICAgICAgYl93aW5zID0gMAogICAgICAgIGRyYXdzID0gMAoKICAgICAgICBmb3IgZXAgaW4gcmFuZ2UoZXBpc29kZXNfcGVyX21hdGNodXApOgogICAgICAgICAgICAjIFBsYXkgYm90aCBzaWRlcyBm' +
'b3IgZmFpcm5lc3MKICAgICAgICAgICAgIyBHYW1lIDE6IEEgYXMgc2VhdCAwLCBCIGFzIHNlYXQgMQogICAgICAgICAgICBtMSA9IHJ1bl9tYXRjaChwb2xpY3lfYSwgbmFtZV9hLCBwb2xpY3lfYiwgbmFtZV9iLCBwbGF5c3R5bGU9cGxheXN0eWxlKQogICAgICAgICAgICByZXN1bHQubWF0Y2hfcmVzdWx0cy5hcHBlbmQobTEpCgogICAgICAgICAgICBpZiBtMS53aW5uZXIgPT0gbmFtZV9hOgogICAgICAgICAgICAgICAgYV93aW5zICs9IDEKICAgICAgICAgICAgZWxpZiBtMS53aW5uZXIgPT0gbmFtZV9iOgogICAgICAgICAgICAgICAgYl93aW5zICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRyYXdzICs9IDEKCiAgICAgICAgICAgICMgR2FtZSAyOiBCIGFzIHNlYXQgMCwgQSBhcyBzZWF0IDEKICAgICAgICAgICAgbTIgPSBydW5fbWF0Y2gocG9saWN5X2IsIG5hbWVfYiwgcG9saWN5X2EsIG5hbWVfYSwgcGxheXN0eWxlPXBsYXlzdHlsZSkKICAgICAgICAgICAgcmVzdWx0Lm1hdGNoX3Jlc3VsdHMuYXBwZW5kKG0yKQoKICAgICAgICAgICAgaWYgbTIud2lubmVyID09IG5hbWVfYToKICAgICAgICAgICAgICAgIGFfd2lucyArPSAxCiAgICAgICAgICAgIGVsaWYgbTIud2lubmVyID09IG5hbWVfYjoKICAgICAgICAgICAgICAgIGJfd2lucyArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkcmF3cyArPSAxCgogICAgICAgIHRvdGFsX2dhbWVzID0gZXBpc29kZXNfcGVyX21hdGNodXAgKiAyCiAgICAgICAgcmVzdWx0Lndpbl9tYXRyaXhbbmFtZV9hXVtuYW1lX2JdID0gYV93aW5zCiAgICAgICAgcmVzdWx0Lndpbl9tYXRyaXhbbmFtZV9iXVtuYW1lX2FdID0gYl93aW5zCgogICAgICAgIHJlc3VsdC53aW5fcmF0ZXNbbmFtZV9hXVsid2lucyJdICs9IGFfd2lucwogICAgICAgIHJlc3VsdC53aW5fcmF0ZXNbbmFtZV9hXVsibG9zc2VzIl0gKz0gYl93aW5zCiAgICAgICAgcmVzdWx0Lndpbl9yYXRlc1tuYW1lX2FdWyJkcmF3cyJdICs9IGRyYXdzCiAgICAgICAgcmVzdWx0Lndpbl9yYXRlc1tuYW1lX2FdWyJ0b3RhbCJdICs9IHRvdGFsX2dhbWVzCgogICAgICAgIHJlc3VsdC53aW5fcmF0ZXNbbmFtZV9iXVsid2lucyJdICs9IGJfd2lucwogICAgICAgIHJlc3VsdC53aW5fcmF0ZXNbbmFtZV9iXVsibG9zc2VzIl0gKz0gYV93aW5zCiAgICAgICAgcmVzdWx0Lndpbl9yYXRlc1tuYW1lX2JdWyJkcmF3cyJdICs9IGRyYXdzCiAgICAgICAgcmVzdWx0Lndpbl9yYXRlc1tuYW1lX2JdWyJ0b3RhbCJdICs9IHRvdGFsX2dhbWVzCgogICAgICAgIGxvZ2dlci5pbmZvKCIgICVzIHZzICVzOiAlZC0lZC0lZCAoJS4wZiUlIHZzICUuMGYlJSkiLAogICAgICAgICAgICAgICAgICAgICBuYW1lX2EsIG5hbWVfYiwgYV93aW5zLCBiX3dpbnMsIGRyYXdzLAogICAgICAgICAgICAgICAgICAgICBhX3dpbnMgLyB0b3RhbF9nYW1lcyAqIDEwMCwgYl93aW5zIC8gdG90YWxfZ2FtZXMgKiAxMDApCgogICAgcmVzdWx0LnRvdGFsX21hdGNoZXMgPSBsZW4ocmVzdWx0Lm1hdGNoX3Jlc3VsdHMpCiAgICByZXN1bHQudG90YWxfdGltZV9zID0gdGltZS50aW1lKCkgLSB0X3N0YXJ0CgogICAgIyBDb21wdXRlIG92ZXJhbGwgd2luIHJhdGVzCiAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICB3ciA9IHJlc3VsdC53aW5fcmF0ZXNbbmFtZV0KICAgICAgICB0b3RhbCA9IHdyWyJ0b3RhbCJdCiAgICAgICAgaWYgdG90YWwgPiAwOgogICAgICAgICAgICB3clsid2luX3JhdGUiXSA9IHJvdW5kKHdyWyJ3aW5zIl0gLyB0b3RhbCwgNCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB3clsid2luX3JhdGUiXSA9IDAuMAoKICAgIHJldHVybiByZXN1bHQKCgpkZWYgcHJpbnRfdG91cm5hbWVudF9yZXN1bHRzKHJlc3VsdDogVG91cm5hbWVudFJlc3VsdCk6CiAgICAiIiJQcmV0dHktcHJpbnQgdG91cm5hbWVudCByZXN1bHRzLiIiIgogICAgbG9nZ2VyLmluZm8oIiIpCiAgICBsb2dnZXIuaW5mbygiPSIgKiA2MCkKICAgIGxvZ2dlci5pbmZvKCIgIFRPVVJOQU1FTlQgUkVTVUxUUyIpCiAgICBsb2dnZXIuaW5mbygiPSIgKiA2MCkKICAgIGxvZ2dlci5pbmZvKCIiKQoKICAgICMgTGVhZGVyYm9hcmQKICAgIHNvcnRlZF9wb2xpY2llcyA9IHNvcnRlZCgKICAgICAgICByZXN1bHQucG9saWNpZXMsCiAgICAgICAga2V5PWxhbWJkYSBuOiByZXN1bHQud2luX3JhdGVzW25dLmdldCgid2luX3JhdGUiLCAwKSwKICAgICAgICByZXZlcnNlPVRydWUs' +
'CiAgICApCgogICAgbG9nZ2VyLmluZm8oIiAgJS0yMHMgJTZzICU2cyAlNnMgJTZzICU4cyIsICJQb2xpY3kiLCAiV2lucyIsICJMb3NzZXMiLCAiRHJhd3MiLCAiVG90YWwiLCAiV2luIFJhdGUiKQogICAgbG9nZ2VyLmluZm8oIiAgIiArICItIiAqIDU2KQoKICAgIGZvciBuYW1lIGluIHNvcnRlZF9wb2xpY2llczoKICAgICAgICB3ciA9IHJlc3VsdC53aW5fcmF0ZXNbbmFtZV0KICAgICAgICBsb2dnZXIuaW5mbygiICAlLTIwcyAlNmQgJTZkICU2ZCAlNmQgJTcuMWYlJSIsCiAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHdyWyJ3aW5zIl0sIHdyWyJsb3NzZXMiXSwgd3JbImRyYXdzIl0sIHdyWyJ0b3RhbCJdLAogICAgICAgICAgICAgICAgICAgICB3ci5nZXQoIndpbl9yYXRlIiwgMCkgKiAxMDApCgogICAgIyBXaW4gbWF0cml4CiAgICBsb2dnZXIuaW5mbygiIikKICAgIGxvZ2dlci5pbmZvKCIgIFdpbiBNYXRyaXggKHJvdyBiZWF0cyBjb2x1bW4pOiIpCiAgICBoZWFkZXIgPSAiICAlLTE0cyIgKyAiICUxMHMiICogbGVuKHJlc3VsdC5wb2xpY2llcykKICAgIGxvZ2dlci5pbmZvKGhlYWRlciwgIiIsICpyZXN1bHQucG9saWNpZXMpCiAgICBmb3IgbmFtZSBpbiByZXN1bHQucG9saWNpZXM6CiAgICAgICAgcm93ID0gW3Jlc3VsdC53aW5fbWF0cml4W25hbWVdLmdldChuLCAiLSIpIGZvciBuIGluIHJlc3VsdC5wb2xpY2llc10KICAgICAgICByb3dfc3RycyA9IFtzdHIodikgaWYgbmFtZSAhPSBuIGVsc2UgIi0iIGZvciB2LCBuIGluIHppcChyb3csIHJlc3VsdC5wb2xpY2llcyldCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgJS0xNHMiICsgIiAlMTBzIiAqIGxlbihyb3dfc3RycyksIG5hbWUsICpyb3dfc3RycykKCiAgICBsb2dnZXIuaW5mbygiIikKICAgIGxvZ2dlci5pbmZvKCIgIFRvdGFsIG1hdGNoZXM6ICVkIiwgcmVzdWx0LnRvdGFsX21hdGNoZXMpCiAgICBsb2dnZXIuaW5mbygiICBUb3RhbCB0aW1lOiAgICAlLjFmIHMiLCByZXN1bHQudG90YWxfdGltZV9zKQogICAgbG9nZ2VyLmluZm8oIj0iICogNjApCgoKZGVmIG1haW4oKToKICAgICIiIkNMSSBlbnRyeSBwb2ludCBmb3IgdG91cm5hbWVudCBldmFsdWF0aW9uLiIiIgogICAgaW1wb3J0IGFyZ3BhcnNlCgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IkNvbW1hbmRlciBBSSBMYWIg4oCUIFRvdXJuYW1lbnQgRXZhbHVhdG9yIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZXBpc29kZXMiLCB0eXBlPWludCwgZGVmYXVsdD01MCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRXBpc29kZXMgcGVyIG1hdGNodXAgcGFpciAocGxheWVkIMOXMiBmb3IgYm90aCBzaWRlcykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1jaGVja3BvaW50IiwgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIGxlYXJuZWQgcG9saWN5IGNoZWNrcG9pbnQgKC5wdCkiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wcG8tY2hlY2twb2ludCIsIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBQUE8gY2hlY2twb2ludCAoLnB0KSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXBsYXlzdHlsZSIsIGRlZmF1bHQ9Im1pZHJhbmdlIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tb3V0cHV0IiwgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTYXZlIHJlc3VsdHMgSlNPTiB0byB0aGlzIHBhdGgiKQoKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCgogICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0iJShtZXNzYWdlKXMiKQoKICAgICMgQnVpbGQgcG9saWN5IHJvc3RlcgogICAgcG9saWNpZXMgPSB7CiAgICAgICAgImhldXJpc3RpYyI6IEhldXJpc3RpY1BvbGljeSgpLAogICAgICAgICJyYW5kb20iOiBSYW5kb21Qb2xpY3koKSwKICAgIH0KCiAgICAjIEFkZCBsZWFybmVkIHBvbGljaWVzIGlmIGNoZWNrcG9pbnRzIGV4aXN0CiAgICBja3B0X2RpciA9IG9zLnBhdGguam9pbihwcm9qZWN0X3Jvb3QsICJtbCIsICJtb2RlbHMiLCAiY2hlY2twb2ludHMiKQoKICAgIHN1cGVydmlzZWRfcGF0aCA9IGFyZ3MuY2hlY2twb2ludCBvciBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJiZXN0X3BvbGljeS5wdCIpCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdXBlcnZpc2VkX3BhdGgpOgog' +
'ICAgICAgIHBvbGljaWVzWyJzdXBlcnZpc2VkIl0gPSBMZWFybmVkUG9saWN5KHN1cGVydmlzZWRfcGF0aCkKICAgICAgICBsb2dnZXIuaW5mbygiQWRkZWQgc3VwZXJ2aXNlZCBwb2xpY3k6ICVzIiwgc3VwZXJ2aXNlZF9wYXRoKQoKICAgIHBwb19wYXRoID0gYXJncy5wcG9fY2hlY2twb2ludCBvciBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJiZXN0X3Bwby5wdCIpCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhwcG9fcGF0aCk6CiAgICAgICAgcG9saWNpZXNbInBwbyJdID0gTGVhcm5lZFBvbGljeShwcG9fcGF0aCkKICAgICAgICBsb2dnZXIuaW5mbygiQWRkZWQgUFBPIHBvbGljeTogJXMiLCBwcG9fcGF0aCkKCiAgICBpZiBsZW4ocG9saWNpZXMpIDwgMjoKICAgICAgICBsb2dnZXIuZXJyb3IoIk5lZWQgYXQgbGVhc3QgMiBwb2xpY2llcyBmb3IgYSB0b3VybmFtZW50LiBUcmFpbiBhIG1vZGVsIGZpcnN0LiIpCiAgICAgICAgc3lzLmV4aXQoMSkKCiAgICBsb2dnZXIuaW5mbygiIikKCiAgICAjIFJ1biB0b3VybmFtZW50CiAgICByZXN1bHQgPSBydW5fdG91cm5hbWVudCgKICAgICAgICBwb2xpY2llcz1wb2xpY2llcywKICAgICAgICBlcGlzb2Rlc19wZXJfbWF0Y2h1cD1hcmdzLmVwaXNvZGVzLAogICAgICAgIHBsYXlzdHlsZT1hcmdzLnBsYXlzdHlsZSwKICAgICkKCiAgICBwcmludF90b3VybmFtZW50X3Jlc3VsdHMocmVzdWx0KQoKICAgICMgU2F2ZSByZXN1bHRzCiAgICBvdXRwdXRfcGF0aCA9IGFyZ3Mub3V0cHV0IG9yIG9zLnBhdGguam9pbihja3B0X2RpciwgInRvdXJuYW1lbnRfcmVzdWx0cy5qc29uIikKICAgIHdpdGggb3BlbihvdXRwdXRfcGF0aCwgInciKSBhcyBmOgogICAgICAgIGpzb24uZHVtcChyZXN1bHQudG9fZGljdCgpLCBmLCBpbmRlbnQ9MikKICAgIGxvZ2dlci5pbmZvKCJSZXN1bHRzIHNhdmVkOiAlcyIsIG91dHB1dF9wYXRoKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK'
Install-B64 -R 'ml\eval\tournament.py' -B $b
# ml/models/.gitkeep (0 bytes)
$b = ''
Install-B64 -R 'ml\models\.gitkeep' -B $b
# ml/scripts/generate_synthetic_data.py (15,424 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFN5bnRoZXRpYyBUcmFpbmluZyBEYXRhIEdlbmVyYXRvcgrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKR2VuZXJhdGVzIHJlYWxpc3RpYy1sb29raW5nIGRlY2lzaW9uIHNuYXBzaG90IEpTT05MIGZpbGVzCmZvciB0ZXN0aW5nIHRoZSBmdWxsIE1MIHBpcGVsaW5lIHdpdGhvdXQgcnVubmluZyBhY3R1YWwgRm9yZ2Ugc2ltcy4KClVzZXMgcmVhbCBjYXJkIG5hbWVzIGZyb20gcHJlY29uIGRlY2tzIGFuZCBzaW11bGF0ZXMgcGxhdXNpYmxlCmdhbWUgcHJvZ3Jlc3Npb25zIChkcmF3cywgY2FzdHMsIGF0dGFja3MsIG1hbmEgZGV2ZWxvcG1lbnQpLgoKVXNhZ2U6CiAgICBweXRob24gLW0gbWwuc2NyaXB0cy5nZW5lcmF0ZV9zeW50aGV0aWNfZGF0YSAtLWdhbWVzIDIwMCAtLW91dHB1dCByZXN1bHRzL21sLWRlY2lzaW9ucy1zeW50aGV0aWMuanNvbmwKIiIiCgppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHJhbmRvbQppbXBvcnQgc3lzCmltcG9ydCBhcmdwYXJzZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCnByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50LnBhcmVudCkKaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgoKIyDilIDilIAgTG9hZCByZWFsIGNhcmQgbmFtZXMgZnJvbSBwcmVjb24gZGVja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgpkZWYgbG9hZF9wcmVjb25fY2FyZHMocHJlY29uX2Rpcjogc3RyKSAtPiBkaWN0OgogICAgIiIiTG9hZCBjYXJkIG5hbWVzIGZyb20gLmRjayBmaWxlcywgZ3JvdXBlZCBieSBkZWNrLiIiIgogICAgZGVja3MgPSB7fQogICAgcHJlY29uX3BhdGggPSBQYXRoKHByZWNvbl9kaXIpCiAgICBpZiBub3QgcHJlY29uX3BhdGguZXhpc3RzKCk6CiAgICAgICAgcHJpbnQoZiJQcmVjb24gZGlyIG5vdCBmb3VuZDoge3ByZWNvbl9kaXJ9IikKICAgICAgICByZXR1cm4ge30KCiAgICBmb3IgZGNrX2ZpbGUgaW4gcHJlY29uX3BhdGguZ2xvYigiKi5kY2siKToKICAgICAgICBkZWNrX25hbWUgPSBkY2tfZmlsZS5zdGVtLnJlcGxhY2UoIl8iLCAiICIpCiAgICAgICAgY2FyZHMgPSB7ImNvbW1hbmRlciI6IE5vbmUsICJjcmVhdHVyZXMiOiBbXSwgInNwZWxscyI6IFtdLCAibGFuZHMiOiBbXSwgImFydGlmYWN0cyI6IFtdLCAiYWxsIjogW119CgogICAgICAgIHNlY3Rpb24gPSAiTWFpbiIKICAgICAgICB3aXRoIG9wZW4oZGNrX2ZpbGUsICJyIikgYXMgZjoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgiLy8iKSBvciBsaW5lLnN0YXJ0c3dpdGgoIk5hbWU9Iik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiWyIpIGFuZCBsaW5lLmVuZHN3aXRoKCJdIik6CiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmVbMTotMV0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgUGFyc2UgIjEgQ2FyZCBOYW1lfFNFVCIKICAgICAgICAgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgiICIsIDEpCiAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpIDwgMjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHF0eSA9IGludChwYXJ0c1swXSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBjYXJkX25hbWUgPSBwYXJ0c1sxXS5zcGxpdCgifCIpWzBdLnN0cmlwKCkKCiAgICAgICAgICAgICAgICBpZiBzZWN0aW9uID09ICJDb21tYW5kZXIiOgogICAgICAgICAgICAgICAgICAgIGNhcmRzWyJjb21tYW5kZXIiXSA9IGNhcmRfbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjYXJkc1siYWxsIl0uYXBwZW5kKGNhcmRfbmFt' +
'ZSkKICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGNhcmRfbmFtZS5sb3dlcigpCiAgICAgICAgICAgICAgICAgICAgaWYgYW55KGsgaW4gbG93ZXIgZm9yIGsgaW4gWyJwbGFpbnMiLCAiaXNsYW5kIiwgInN3YW1wIiwgIm1vdW50YWluIiwgImZvcmVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgdG93ZXIiLCAidGVtcGxlIiwgImdhdGUiLCAibGFuZCJdKToKICAgICAgICAgICAgICAgICAgICAgICAgY2FyZHNbImxhbmRzIl0uYXBwZW5kKGNhcmRfbmFtZSkKICAgICAgICAgICAgICAgICAgICBlbGlmIGFueShrIGluIGxvd2VyIGZvciBrIGluIFsic29sIHJpbmciLCAic2lnbmV0IiwgInRhbGlzbWFuIiwgIm1hbmEgY3J5cHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN1bHRpdmF0ZSIsICJrb2RhbWEiLCAicmFtcGFudCIsICJmYXJzZWVrIl0pOgogICAgICAgICAgICAgICAgICAgICAgICBjYXJkc1siYXJ0aWZhY3RzIl0uYXBwZW5kKGNhcmRfbmFtZSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIFJvdWdoIHNwbGl0OiB+NjAlIGNyZWF0dXJlcywgfjQwJSBzcGVsbHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC42OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZHNbImNyZWF0dXJlcyJdLmFwcGVuZChjYXJkX25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkc1sic3BlbGxzIl0uYXBwZW5kKGNhcmRfbmFtZSkKCiAgICAgICAgaWYgY2FyZHNbImNvbW1hbmRlciJdOgogICAgICAgICAgICBkZWNrc1tkZWNrX25hbWVdID0gY2FyZHMKCiAgICByZXR1cm4gZGVja3MKCgojIOKUgOKUgCBLbm93biByZW1vdmFsL2RyYXcvcmFtcCBmb3IgbW9yZSBhY2N1cmF0ZSBsYWJlbGluZyDilIDilIDilIDilIAKClJFTU9WQUxfTkFNRVMgPSBbCiAgICAiU3dvcmRzIHRvIFBsb3dzaGFyZXMiLCAiUGF0aCB0byBFeGlsZSIsICJCZWFzdCBXaXRoaW4iLCAiQ2hhb3MgV2FycCIsCiAgICAiQ291bnRlcnNwZWxsIiwgIlN3YW4gU29uZyIsICJDeWNsb25pYyBSaWZ0IiwgIkJsYXNwaGVtb3VzIEFjdCIsCiAgICAiV3JhdGggb2YgR29kIiwgIkdlbmVyb3VzIEdpZnQiLCAiVGVybWluYXRlIiwgIkdvIGZvciB0aGUgVGhyb2F0IiwKICAgICJEb29tIEJsYWRlIiwgIlJhcGlkIEh5YnJpZGl6YXRpb24iLCAiVmFuZGFsYmxhc3QiLCAiS3Jvc2FuIEdyaXAiLApdCgpEUkFXX05BTUVTID0gWwogICAgIlJoeXN0aWMgU3R1ZHkiLCAiTXlzdGljIFJlbW9yYSIsICJIYXJtb25pemUiLCAiQnJhaW5zdG9ybSIsCiAgICAiUG9uZGVyIiwgIlByZW9yZGFpbiIsICJOaWdodCdzIFdoaXNwZXIiLCAiU2lnbiBpbiBCbG9vZCIsCiAgICAiUGh5cmV4aWFuIEFyZW5hIiwgIlN5bHZhbiBMaWJyYXJ5IiwgIlNrdWxsY2xhbXAiLCAiUmVhZCB0aGUgQm9uZXMiLApdCgpSQU1QX05BTUVTID0gWwogICAgIlNvbCBSaW5nIiwgIkFyY2FuZSBTaWduZXQiLCAiQ3VsdGl2YXRlIiwgIktvZGFtYSdzIFJlYWNoIiwKICAgICJSYW1wYW50IEdyb3d0aCIsICJGYXJzZWVrIiwgIk1pbmQgU3RvbmUiLCAiQ29tbWFuZGVyJ3MgU3BoZXJlIiwKICAgICJGZWxsd2FyIFN0b25lIiwgIlRob3VnaHQgVmVzc2VsIiwgIk5hdHVyZSdzIExvcmUiLCAiU29sZW1uIFNpbXVsYWNydW0iLApdCgpQTEFZU1RZTEVTID0gWyJhZ2dybyIsICJjb250cm9sIiwgIm1pZHJhbmdlIiwgImNvbWJvIl0KUEhBU0VTID0gWyJtYWluXzEiLCAiY29tYmF0IiwgIm1haW5fMiIsICJlbmQiXQoKCmRlZiBnZW5lcmF0ZV9nYW1lX2RlY2lzaW9ucygKICAgIGdhbWVfaWQ6IHN0ciwKICAgIGRlY2tfYTogZGljdCwKICAgIGRlY2tfYjogZGljdCwKICAgIGRlY2tfYV9uYW1lOiBzdHIsCiAgICBkZWNrX2JfbmFtZTogc3RyLAopIC0+IGxpc3Q6CiAgICAiIiJHZW5lcmF0ZSBzeW50aGV0aWMgZGVjaXNpb25zIGZvciBhIHNpbmdsZSBnYW1lLiIiIgogICAgZGVjaXNpb25zID0gW10KCiAgICAjIFNodWZmbGUgZGVja3MgKHNpbXVsYXRpbmcgbGlicmFyeSkKICAgIGxpYl9hID0gbGlzdChkZWNrX2FbImFsbCJdKQogICAgbGliX2IgPSBsaXN0KGRlY2tfYlsiYWxsIl0pCiAgICByYW5kb20uc2h1ZmZsZShsaWJfYSkKICAgIHJhbmRvbS5zaHVmZmxlKGxpYl9i' +
'KQoKICAgICMgU3RhcnRpbmcgc3RhdGUKICAgIGxpZmUgPSBbNDAsIDQwXQogICAgaGFuZCA9IFtsaWJfYVs6N10sIGxpYl9iWzo3XV0KICAgIGxpYl9hID0gbGliX2FbNzpdCiAgICBsaWJfYiA9IGxpYl9iWzc6XQogICAgbGlicmFyaWVzID0gW2xpYl9hLCBsaWJfYl0KICAgIGJhdHRsZWZpZWxkID0gW1tdLCBbXV0KICAgIGdyYXZleWFyZCA9IFtbXSwgW11dCiAgICBjbWRfem9uZSA9IFtbZGVja19hWyJjb21tYW5kZXIiXV0sIFtkZWNrX2JbImNvbW1hbmRlciJdXV0KICAgIGNtZHJfZG1nID0gWzAsIDBdCiAgICBjbWRyX2Nhc3RzID0gWzAsIDBdCiAgICBsYW5kc19wbGF5ZWQgPSBbMCwgMF0KICAgIHBsYXlzdHlsZV9hID0gcmFuZG9tLmNob2ljZShQTEFZU1RZTEVTKQogICAgcGxheXN0eWxlX2IgPSByYW5kb20uY2hvaWNlKFBMQVlTVFlMRVMpCiAgICBwbGF5c3R5bGVzID0gW3BsYXlzdHlsZV9hLCBwbGF5c3R5bGVfYl0KICAgIGNvbW1hbmRlcnMgPSBbZGVja19hWyJjb21tYW5kZXIiXSwgZGVja19iWyJjb21tYW5kZXIiXV0KICAgIGRlY2tfbmFtZXMgPSBbZGVja19hX25hbWUsIGRlY2tfYl9uYW1lXQoKICAgIG1heF90dXJucyA9IHJhbmRvbS5yYW5kaW50KDgsIDIwKQogICAgd2lubmVyID0gTm9uZQoKICAgIGZvciB0dXJuIGluIHJhbmdlKDEsIG1heF90dXJucyArIDEpOgogICAgICAgIGZvciBhY3RpdmVfc2VhdCBpbiByYW5nZSgyKToKICAgICAgICAgICAgaWYgbGlmZVswXSA8PSAwIG9yIGxpZmVbMV0gPD0gMDoKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAjIERyYXcgYSBjYXJkCiAgICAgICAgICAgIGlmIGxpYnJhcmllc1thY3RpdmVfc2VhdF06CiAgICAgICAgICAgICAgICBkcmF3biA9IGxpYnJhcmllc1thY3RpdmVfc2VhdF0ucG9wKDApCiAgICAgICAgICAgICAgICBoYW5kW2FjdGl2ZV9zZWF0XS5hcHBlbmQoZHJhd24pCgogICAgICAgICAgICAjIERlY2lkZSBudW1iZXIgb2YgYWN0aW9ucyB0aGlzIHR1cm4gKDEtMykKICAgICAgICAgICAgbnVtX2FjdGlvbnMgPSByYW5kb20ucmFuZGludCgxLCAzKQoKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UobnVtX2FjdGlvbnMpOgogICAgICAgICAgICAgICAgaWYgbGlmZVswXSA8PSAwIG9yIGxpZmVbMV0gPD0gMDoKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgICAgIHBoYXNlID0gcmFuZG9tLmNob2ljZShbIm1haW5fMSIsICJtYWluXzIiLCAiY29tYmF0Il0pCgogICAgICAgICAgICAgICAgIyBCdWlsZCBwbGF5ZXIgc25hcHNob3RzCiAgICAgICAgICAgICAgICBwbGF5ZXJzID0gW10KICAgICAgICAgICAgICAgIGZvciBzIGluIHJhbmdlKDIpOgogICAgICAgICAgICAgICAgICAgIHBsYXllcnMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgInNlYXQiOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAibGlmZSI6IGxpZmVbc10sCiAgICAgICAgICAgICAgICAgICAgICAgICJjbWRyX2RtZyI6IGNtZHJfZG1nW3NdLAogICAgICAgICAgICAgICAgICAgICAgICAibWFuYSI6IGxhbmRzX3BsYXllZFtzXSwKICAgICAgICAgICAgICAgICAgICAgICAgImNtZHJfdGF4IjogY21kcl9jYXN0c1tzXSAqIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdHVyZXMiOiBsZW4oW2MgZm9yIGMgaW4gYmF0dGxlZmllbGRbc10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYy5sb3dlcigpIG5vdCBpbiBbInNvbCByaW5nIiwgImFyY2FuZSBzaWduZXQiXV0pLAogICAgICAgICAgICAgICAgICAgICAgICAibGFuZHMiOiBsYW5kc19wbGF5ZWRbc10sCiAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kIjogbGlzdChoYW5kW3NdKSwKICAgICAgICAgICAgICAgICAgICAgICAgImJhdHRsZWZpZWxkIjogbGlzdChiYXR0bGVmaWVsZFtzXSksCiAgICAgICAgICAgICAgICAgICAgICAgICJncmF2ZXlhcmQiOiBsaXN0KGdyYXZleWFyZFtzXSksCiAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kX3pvbmUiOiBsaXN0KGNtZF96b25lW3NdKSwKICAgICAgICAgICAgICAgICAgICB9KQoKICAgICAgICAgICAgICAgICMgQ2hvb3NlIGFjdGlvbiBiYXNlZCBvbiBnYW1lIHN0YXRlCiAgICAgICAgICAgICAgICBhY3Rpb24gPSBjaG9vc2Vfc3ludGhldGljX2FjdGlvbigKICAgICAgICAgICAgICAgICAgICBhY3RpdmVfc2VhdCwgdHVybiwgcGhhc2UsIGhhbmRbYWN0aXZlX3NlYXRdLAogICAgICAgICAgICAg' +
'ICAgICAgIGJhdHRsZWZpZWxkW2FjdGl2ZV9zZWF0XSwgbGFuZHNfcGxheWVkW2FjdGl2ZV9zZWF0XSwKICAgICAgICAgICAgICAgICAgICBjb21tYW5kZXJzW2FjdGl2ZV9zZWF0XSwgY21kX3pvbmVbYWN0aXZlX3NlYXRdLAogICAgICAgICAgICAgICAgICAgIGNtZHJfY2FzdHNbYWN0aXZlX3NlYXRdLCBwbGF5c3R5bGVzW2FjdGl2ZV9zZWF0XSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIEJ1aWxkIGRlY2lzaW9uCiAgICAgICAgICAgICAgICBkZWNpc2lvbiA9IHsKICAgICAgICAgICAgICAgICAgICAiZ2FtZV9pZCI6IGdhbWVfaWQsCiAgICAgICAgICAgICAgICAgICAgInR1cm4iOiB0dXJuLAogICAgICAgICAgICAgICAgICAgICJwaGFzZSI6IHBoYXNlLAogICAgICAgICAgICAgICAgICAgICJhY3RpdmVfc2VhdCI6IGFjdGl2ZV9zZWF0LAogICAgICAgICAgICAgICAgICAgICJnYW1lX291dGNvbWUiOiAiIiwgICMgZmlsbGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgImRlY2tfbmFtZSI6IGRlY2tfbmFtZXNbYWN0aXZlX3NlYXRdLAogICAgICAgICAgICAgICAgICAgICJjb21tYW5kZXIiOiBjb21tYW5kZXJzW2FjdGl2ZV9zZWF0XSwKICAgICAgICAgICAgICAgICAgICAiYXJjaGV0eXBlIjogcGxheXN0eWxlc1thY3RpdmVfc2VhdF0sCiAgICAgICAgICAgICAgICAgICAgInBsYXllcnMiOiBwbGF5ZXJzLAogICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiBhY3Rpb24sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWNpc2lvbnMuYXBwZW5kKGRlY2lzaW9uKQoKICAgICAgICAgICAgICAgICMgQXBwbHkgYWN0aW9uIGVmZmVjdHMgdG8gc3RhdGUKICAgICAgICAgICAgICAgIGFwcGx5X2FjdGlvbigKICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIGFjdGl2ZV9zZWF0LCBoYW5kLCBiYXR0bGVmaWVsZCwgZ3JhdmV5YXJkLAogICAgICAgICAgICAgICAgICAgIGNtZF96b25lLCBsYW5kc19wbGF5ZWQsIGxpZmUsIGNtZHJfZG1nLCBjbWRyX2Nhc3RzLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlcnMsIGxpYnJhcmllcywKICAgICAgICAgICAgICAgICkKCiAgICAgICAgaWYgbGlmZVswXSA8PSAwIG9yIGxpZmVbMV0gPD0gMDoKICAgICAgICAgICAgYnJlYWsKCiAgICAjIERldGVybWluZSB3aW5uZXIKICAgIGlmIGxpZmVbMV0gPD0gMCBhbmQgbGlmZVswXSA+IDA6CiAgICAgICAgd2lubmVyID0gIndpbl9zZWF0XzAiCiAgICBlbGlmIGxpZmVbMF0gPD0gMCBhbmQgbGlmZVsxXSA+IDA6CiAgICAgICAgd2lubmVyID0gIndpbl9zZWF0XzEiCiAgICBlbHNlOgogICAgICAgICMgUmFuZG9tIHdpbm5lciBpZiBnYW1lIHRpbWVkIG91dAogICAgICAgIHdpbm5lciA9IHJhbmRvbS5jaG9pY2UoWyJ3aW5fc2VhdF8wIiwgIndpbl9zZWF0XzEiXSkKCiAgICAjIEJhY2tmaWxsIGdhbWVfb3V0Y29tZQogICAgZm9yIGQgaW4gZGVjaXNpb25zOgogICAgICAgIGRbImdhbWVfb3V0Y29tZSJdID0gd2lubmVyCgogICAgcmV0dXJuIGRlY2lzaW9ucwoKCmRlZiBjaG9vc2Vfc3ludGhldGljX2FjdGlvbigKICAgIHNlYXQsIHR1cm4sIHBoYXNlLCBoYW5kLCBiYXR0bGVmaWVsZCwgbWFuYSwgY29tbWFuZGVyLCBjbWRfem9uZSwKICAgIGNtZHJfY2FzdHMsIHBsYXlzdHlsZSwKKSAtPiBkaWN0OgogICAgIiIiQ2hvb3NlIGEgcGxhdXNpYmxlIGFjdGlvbiBiYXNlZCBvbiBnYW1lIHN0YXRlLiIiIgoKICAgICMgRWFybHkgZ2FtZTogcHJpb3JpdGl6ZSBsYW5kcyBhbmQgcmFtcAogICAgaWYgdHVybiA8PSAzOgogICAgICAgICMgUGxheSBsYW5kIGlmIGluIGhhbmQKICAgICAgICBmb3IgY2FyZCBpbiBoYW5kOgogICAgICAgICAgICBsb3dlciA9IGNhcmQubG93ZXIoKQogICAgICAgICAgICBpZiBhbnkoayBpbiBsb3dlciBmb3IgayBpbiBbInBsYWlucyIsICJpc2xhbmQiLCAic3dhbXAiLCAibW91bnRhaW4iLCAiZm9yZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgdG93ZXIiLCAidGVtcGxlIiwgImdhdGUiXSk6CiAgICAgICAgICAgICAgICByZXR1cm4geyJ0eXBlIjogImxhbmQiLCAiY2FyZCI6IGNhcmQsICJ0YXJnZXQiOiAiIiwgInJhdyI6IGYicGxheXMge2NhcmR9LiJ9CgogICAgICAgICMgQ2FzdCByYW1wCiAgICAgICAgZm9yIGNhcmQgaW4gaGFuZDoKICAgICAgICAgICAgaWYgY2FyZCBpbiBSQU1QX05BTUVTIG9yIGNhcmQubG93ZXIoKSBpbiBbci5sb3dl' +
'cigpIGZvciByIGluIFJBTVBfTkFNRVNdOgogICAgICAgICAgICAgICAgaWYgbWFuYSA+PSAxOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7InR5cGUiOiAiY2FzdCIsICJjYXJkIjogY2FyZCwgInRhcmdldCI6ICIiLCAicmF3IjogZiJjYXN0cyB7Y2FyZH0uIn0KCiAgICAjIE1pZC9sYXRlIGdhbWU6IG1vcmUgdmFyaWV0eQogICAgYWN0aW9uX3dlaWdodHMgPSB7CiAgICAgICAgImFnZ3JvIjogeyJhdHRhY2siOiAwLjM1LCAiY3JlYXR1cmUiOiAwLjMwLCAicmVtb3ZhbCI6IDAuMTAsICJkcmF3IjogMC4wNSwgInJhbXAiOiAwLjA1LCAiY29tbWFuZGVyIjogMC4xMCwgInBhc3MiOiAwLjA1fSwKICAgICAgICAiY29udHJvbCI6IHsiYXR0YWNrIjogMC4xMCwgImNyZWF0dXJlIjogMC4xNSwgInJlbW92YWwiOiAwLjMwLCAiZHJhdyI6IDAuMjAsICJyYW1wIjogMC4xMCwgImNvbW1hbmRlciI6IDAuMDUsICJwYXNzIjogMC4xMH0sCiAgICAgICAgIm1pZHJhbmdlIjogeyJhdHRhY2siOiAwLjIwLCAiY3JlYXR1cmUiOiAwLjI1LCAicmVtb3ZhbCI6IDAuMTUsICJkcmF3IjogMC4xMCwgInJhbXAiOiAwLjEwLCAiY29tbWFuZGVyIjogMC4xMCwgInBhc3MiOiAwLjEwfSwKICAgICAgICAiY29tYm8iOiB7ImF0dGFjayI6IDAuMTAsICJjcmVhdHVyZSI6IDAuMjAsICJyZW1vdmFsIjogMC4xMCwgImRyYXciOiAwLjI1LCAicmFtcCI6IDAuMTUsICJjb21tYW5kZXIiOiAwLjEwLCAicGFzcyI6IDAuMTB9LAogICAgfQogICAgd2VpZ2h0cyA9IGFjdGlvbl93ZWlnaHRzLmdldChwbGF5c3R5bGUsIGFjdGlvbl93ZWlnaHRzWyJtaWRyYW5nZSJdKQoKICAgICMgUm9sbCBhY3Rpb24gdHlwZQogICAgcm9sbCA9IHJhbmRvbS5yYW5kb20oKQogICAgY3VtdWxhdGl2ZSA9IDAKICAgIGNob3Nlbl90eXBlID0gInBhc3MiCiAgICBmb3IgYWN0aW9uX3R5cGUsIHdlaWdodCBpbiB3ZWlnaHRzLml0ZW1zKCk6CiAgICAgICAgY3VtdWxhdGl2ZSArPSB3ZWlnaHQKICAgICAgICBpZiByb2xsIDw9IGN1bXVsYXRpdmU6CiAgICAgICAgICAgIGNob3Nlbl90eXBlID0gYWN0aW9uX3R5cGUKICAgICAgICAgICAgYnJlYWsKCiAgICAjIEF0dGFjawogICAgaWYgY2hvc2VuX3R5cGUgPT0gImF0dGFjayIgYW5kIHBoYXNlID09ICJjb21iYXQiIGFuZCBiYXR0bGVmaWVsZDoKICAgICAgICByZXR1cm4geyJ0eXBlIjogImF0dGFjayIsICJjYXJkIjogIiIsICJ0YXJnZXQiOiAiIiwgInJhdyI6ICJhdHRhY2tzIHdpdGggY3JlYXR1cmVzLiJ9CgogICAgIyBDYXN0IGNvbW1hbmRlcgogICAgaWYgY2hvc2VuX3R5cGUgPT0gImNvbW1hbmRlciIgYW5kIGNtZF96b25lIGFuZCBjb21tYW5kZXIgaW4gY21kX3pvbmU6CiAgICAgICAgdGF4ID0gY21kcl9jYXN0cyAqIDIKICAgICAgICBpZiBtYW5hID49IDMgKyB0YXg6ICAjIHJvdWdoIG1hbmEgY2hlY2sKICAgICAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJjYXN0X2NvbW1hbmRlciIsICJjYXJkIjogY29tbWFuZGVyLCAidGFyZ2V0IjogIiIsICJyYXciOiBmImNhc3RzIHtjb21tYW5kZXJ9LiJ9CgogICAgIyBDYXN0IGNyZWF0dXJlIGZyb20gaGFuZAogICAgaWYgY2hvc2VuX3R5cGUgPT0gImNyZWF0dXJlIiBhbmQgaGFuZDoKICAgICAgICBjYXJkID0gcmFuZG9tLmNob2ljZShoYW5kKQogICAgICAgIHJldHVybiB7InR5cGUiOiAiY2FzdCIsICJjYXJkIjogY2FyZCwgInRhcmdldCI6ICIiLCAicmF3IjogZiJjYXN0cyB7Y2FyZH0uIn0KCiAgICAjIENhc3QgcmVtb3ZhbAogICAgaWYgY2hvc2VuX3R5cGUgPT0gInJlbW92YWwiOgogICAgICAgIHJlbW92YWxfaW5faGFuZCA9IFtjIGZvciBjIGluIGhhbmQgaWYgYyBpbiBSRU1PVkFMX05BTUVTIG9yIGMubG93ZXIoKSBpbiBbci5sb3dlcigpIGZvciByIGluIFJFTU9WQUxfTkFNRVNdXQogICAgICAgIGlmIHJlbW92YWxfaW5faGFuZDoKICAgICAgICAgICAgY2FyZCA9IHJhbmRvbS5jaG9pY2UocmVtb3ZhbF9pbl9oYW5kKQogICAgICAgICAgICByZXR1cm4geyJ0eXBlIjogImNhc3QiLCAiY2FyZCI6IGNhcmQsICJ0YXJnZXQiOiAib3Bwb25lbnQgY3JlYXR1cmUiLCAicmF3IjogZiJjYXN0cyB7Y2FyZH0uIn0KICAgICAgICAjIFVzZSBhbnkgc3BlbGwgYXMgcmVtb3ZhbCBzdGFuZC1pbgogICAgICAgIGlmIGhhbmQ6CiAgICAgICAgICAgIGNhcmQgPSByYW5kb20uY2hvaWNlKGhhbmQpCiAgICAgICAgICAgIHJldHVybiB7InR5cGUiOiAiY2FzdCIsICJjYXJkIjogY2FyZCwgInRhcmdldCI6ICIiLCAi' +
'cmF3IjogZiJjYXN0cyB7Y2FyZH0uIn0KCiAgICAjIENhc3QgZHJhdwogICAgaWYgY2hvc2VuX3R5cGUgPT0gImRyYXciOgogICAgICAgIGRyYXdfaW5faGFuZCA9IFtjIGZvciBjIGluIGhhbmQgaWYgYyBpbiBEUkFXX05BTUVTIG9yIGMubG93ZXIoKSBpbiBbci5sb3dlcigpIGZvciByIGluIERSQVdfTkFNRVNdXQogICAgICAgIGlmIGRyYXdfaW5faGFuZDoKICAgICAgICAgICAgY2FyZCA9IHJhbmRvbS5jaG9pY2UoZHJhd19pbl9oYW5kKQogICAgICAgICAgICByZXR1cm4geyJ0eXBlIjogImNhc3QiLCAiY2FyZCI6IGNhcmQsICJ0YXJnZXQiOiAiIiwgInJhdyI6IGYiY2FzdHMge2NhcmR9LiJ9CgogICAgIyBDYXN0IHJhbXAKICAgIGlmIGNob3Nlbl90eXBlID09ICJyYW1wIjoKICAgICAgICByYW1wX2luX2hhbmQgPSBbYyBmb3IgYyBpbiBoYW5kIGlmIGMgaW4gUkFNUF9OQU1FUyBvciBjLmxvd2VyKCkgaW4gW3IubG93ZXIoKSBmb3IgciBpbiBSQU1QX05BTUVTXV0KICAgICAgICBpZiByYW1wX2luX2hhbmQ6CiAgICAgICAgICAgIGNhcmQgPSByYW5kb20uY2hvaWNlKHJhbXBfaW5faGFuZCkKICAgICAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJjYXN0IiwgImNhcmQiOiBjYXJkLCAidGFyZ2V0IjogIiIsICJyYXciOiBmImNhc3RzIHtjYXJkfS4ifQoKICAgICMgTGFuZCBwbGF5IGZhbGxiYWNrCiAgICBmb3IgY2FyZCBpbiBoYW5kOgogICAgICAgIGxvd2VyID0gY2FyZC5sb3dlcigpCiAgICAgICAgaWYgYW55KGsgaW4gbG93ZXIgZm9yIGsgaW4gWyJwbGFpbnMiLCAiaXNsYW5kIiwgInN3YW1wIiwgIm1vdW50YWluIiwgImZvcmVzdCIsICJjb21tYW5kIHRvd2VyIl0pOgogICAgICAgICAgICByZXR1cm4geyJ0eXBlIjogImxhbmQiLCAiY2FyZCI6IGNhcmQsICJ0YXJnZXQiOiAiIiwgInJhdyI6IGYicGxheXMge2NhcmR9LiJ9CgogICAgIyBQYXNzCiAgICBpZiBtYW5hID49IDI6CiAgICAgICAgcmV0dXJuIHsidHlwZSI6ICJwYXNzIiwgImNhcmQiOiAiIiwgInRhcmdldCI6ICIiLCAicmF3IjogInBhc3NlcyBwcmlvcml0eS4ifQoKICAgIHJldHVybiB7InR5cGUiOiAicGFzcyIsICJjYXJkIjogIiIsICJ0YXJnZXQiOiAiIiwgInJhdyI6ICJwYXNzZXMuIn0KCgpkZWYgYXBwbHlfYWN0aW9uKGFjdGlvbiwgc2VhdCwgaGFuZCwgYmF0dGxlZmllbGQsIGdyYXZleWFyZCwgY21kX3pvbmUsCiAgICAgICAgICAgICAgICAgIGxhbmRzX3BsYXllZCwgbGlmZSwgY21kcl9kbWcsIGNtZHJfY2FzdHMsIGNvbW1hbmRlcnMsIGxpYnJhcmllcyk6CiAgICAiIiJBcHBseSBhbiBhY3Rpb24ncyBzaWRlIGVmZmVjdHMgdG8gZ2FtZSBzdGF0ZS4iIiIKICAgIGF0eXBlID0gYWN0aW9uWyJ0eXBlIl0KICAgIGNhcmQgPSBhY3Rpb24uZ2V0KCJjYXJkIiwgIiIpCgogICAgaWYgYXR5cGUgPT0gImxhbmQiIGFuZCBjYXJkIGFuZCBjYXJkIGluIGhhbmRbc2VhdF06CiAgICAgICAgaGFuZFtzZWF0XS5yZW1vdmUoY2FyZCkKICAgICAgICBiYXR0bGVmaWVsZFtzZWF0XS5hcHBlbmQoY2FyZCkKICAgICAgICBsYW5kc19wbGF5ZWRbc2VhdF0gKz0gMQoKICAgIGVsaWYgYXR5cGUgPT0gImNhc3QiIGFuZCBjYXJkIGFuZCBjYXJkIGluIGhhbmRbc2VhdF06CiAgICAgICAgaGFuZFtzZWF0XS5yZW1vdmUoY2FyZCkKICAgICAgICBiYXR0bGVmaWVsZFtzZWF0XS5hcHBlbmQoY2FyZCkKCiAgICBlbGlmIGF0eXBlID09ICJjYXN0X2NvbW1hbmRlciIgYW5kIGNhcmQ6CiAgICAgICAgaWYgY2FyZCBpbiBjbWRfem9uZVtzZWF0XToKICAgICAgICAgICAgY21kX3pvbmVbc2VhdF0ucmVtb3ZlKGNhcmQpCiAgICAgICAgYmF0dGxlZmllbGRbc2VhdF0uYXBwZW5kKGNhcmQpCiAgICAgICAgY21kcl9jYXN0c1tzZWF0XSArPSAxCgogICAgZWxpZiBhdHlwZSA9PSAiYXR0YWNrIjoKICAgICAgICAjIFNpbXVsYXRlIHNvbWUgZGFtYWdlCiAgICAgICAgb3Bwb25lbnQgPSAxIC0gc2VhdAogICAgICAgIG51bV9hdHRhY2tlcnMgPSBtaW4obGVuKGJhdHRsZWZpZWxkW3NlYXRdKSwgcmFuZG9tLnJhbmRpbnQoMSwgNCkpCiAgICAgICAgZGFtYWdlID0gbnVtX2F0dGFja2VycyAqIHJhbmRvbS5yYW5kaW50KDIsIDUpCiAgICAgICAgbGlmZVtvcHBvbmVudF0gLT0gZGFtYWdlCiAgICAgICAgIyBDb21tYW5kZXIgZGFtYWdlIGlmIGNvbW1hbmRlciBpcyBvbiBmaWVsZAogICAgICAgIGlmIGNvbW1hbmRlcnNbc2VhdF0gaW4gYmF0dGxlZmllbGRbc2VhdF0gYW5kIHJhbmRvbS5yYW5kb20oKSA8IDAuMzoKICAg' +
'ICAgICAgICAgY21kX2RtZyA9IHJhbmRvbS5yYW5kaW50KDMsIDcpCiAgICAgICAgICAgIGNtZHJfZG1nW29wcG9uZW50XSArPSBjbWRfZG1nCgoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBzeW50aGV0aWMgTUwgdHJhaW5pbmcgZGF0YSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWdhbWVzIiwgdHlwZT1pbnQsIGRlZmF1bHQ9MjAwLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJOdW1iZXIgb2YgZ2FtZXMgdG8gc2ltdWxhdGUgKGRlZmF1bHQ6IDIwMCkiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1vdXRwdXQiLCBkZWZhdWx0PSJyZXN1bHRzL21sLWRlY2lzaW9ucy1zeW50aGV0aWMuanNvbmwiLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJPdXRwdXQgSlNPTkwgcGF0aCIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXByZWNvbi1kaXIiLCBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gcHJlY29uIGRlY2tzIChkZWZhdWx0OiBhdXRvLWRldGVjdCkiKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICAjIEZpbmQgcHJlY29uIGRlY2tzCiAgICBwcmVjb25fZGlyID0gYXJncy5wcmVjb25fZGlyIG9yIHN0cihQYXRoKHByb2plY3Rfcm9vdCkgLyAicHJlY29uLWRlY2tzIikKICAgIGRlY2tzID0gbG9hZF9wcmVjb25fY2FyZHMocHJlY29uX2RpcikKCiAgICBpZiBub3QgZGVja3M6CiAgICAgICAgcHJpbnQoIk5vIHByZWNvbiBkZWNrcyBmb3VuZC4gQ2Fubm90IGdlbmVyYXRlIHN5bnRoZXRpYyBkYXRhLiIpCiAgICAgICAgc3lzLmV4aXQoMSkKCiAgICBkZWNrX25hbWVzID0gbGlzdChkZWNrcy5rZXlzKCkpCiAgICBwcmludChmIkxvYWRlZCB7bGVuKGRlY2tfbmFtZXMpfSBwcmVjb24gZGVja3M6IHsnLCAnLmpvaW4oZGVja19uYW1lc1s6NV0pfS4uLiIpCgogICAgIyBHZW5lcmF0ZSBnYW1lcwogICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKGFyZ3Mub3V0cHV0KSBvciAiLiIsIGV4aXN0X29rPVRydWUpCiAgICB0b3RhbF9kZWNpc2lvbnMgPSAwCgogICAgd2l0aCBvcGVuKGFyZ3Mub3V0cHV0LCAidyIpIGFzIGY6CiAgICAgICAgZm9yIGdhbWVfaWR4IGluIHJhbmdlKGFyZ3MuZ2FtZXMpOgogICAgICAgICAgICAjIFBpY2sgdHdvIHJhbmRvbSBkZWNrcwogICAgICAgICAgICBkMV9uYW1lLCBkMl9uYW1lID0gcmFuZG9tLnNhbXBsZShkZWNrX25hbWVzLCAyKQogICAgICAgICAgICBkMSwgZDIgPSBkZWNrc1tkMV9uYW1lXSwgZGVja3NbZDJfbmFtZV0KCiAgICAgICAgICAgIGdhbWVfaWQgPSBmInN5bnRoZXRpYy17Z2FtZV9pZHg6MDRkfSIKICAgICAgICAgICAgZGVjaXNpb25zID0gZ2VuZXJhdGVfZ2FtZV9kZWNpc2lvbnMoZ2FtZV9pZCwgZDEsIGQyLCBkMV9uYW1lLCBkMl9uYW1lKQoKICAgICAgICAgICAgZm9yIGQgaW4gZGVjaXNpb25zOgogICAgICAgICAgICAgICAgZi53cml0ZShqc29uLmR1bXBzKGQpICsgIlxuIikKICAgICAgICAgICAgICAgIHRvdGFsX2RlY2lzaW9ucyArPSAxCgogICAgICAgICAgICBpZiAoZ2FtZV9pZHggKyAxKSAlIDUwID09IDA6CiAgICAgICAgICAgICAgICBwcmludChmIiAgR2VuZXJhdGVkIHtnYW1lX2lkeCArIDF9L3thcmdzLmdhbWVzfSBnYW1lcy4uLiIpCgogICAgcHJpbnQoZiJcbkRvbmU6IHthcmdzLmdhbWVzfSBnYW1lcywge3RvdGFsX2RlY2lzaW9uczosfSBkZWNpc2lvbnMiKQogICAgcHJpbnQoZiJPdXRwdXQ6IHthcmdzLm91dHB1dH0iKQogICAgcHJpbnQoZiJBdmVyYWdlIHt0b3RhbF9kZWNpc2lvbnMgLyBhcmdzLmdhbWVzOi4xZn0gZGVjaXNpb25zIHBlciBnYW1lIikKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg=='
Install-B64 -R 'ml\scripts\generate_synthetic_data.py' -B $b
# ml/scripts/ml_cli.py (13,478 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIE1MIFBpcGVsaW5lIENMSQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKVW5pZmllZCBDTEkgZm9yIE1MIHRyYWluaW5nIGRhdGEgd29ya2Zsb3dzLgoKQ29tbWFuZHM6CiAgICBzdGF0dXMgICAgICDigJQgU2hvdyBNTCBsb2dnaW5nIHN0YXR1cyBhbmQgYXZhaWxhYmxlIHRyYWluaW5nIGRhdGEKICAgIGJ1aWxkICAgICAgIOKAlCBCdWlsZCB0cmFpbmluZyBkYXRhc2V0IGZyb20gZGVjaXNpb24gbG9ncwogICAgdHJhaW4gICAgICAg4oCUIFRyYWluIHBvbGljeSBuZXR3b3JrIG9uIGJ1aWx0IGRhdGFzZXQgKHN1cGVydmlzZWQpCiAgICBldmFsICAgICAgICDigJQgRXZhbHVhdGUgYSB0cmFpbmVkIG1vZGVsIG9uIHRlc3QgZGF0YQogICAgaW5zcGVjdCAgICAg4oCUIEluc3BlY3QgYSBKU09OTCBkZWNpc2lvbiBmaWxlIChzYW1wbGUgZW50cmllcykKICAgIHN0YXRzICAgICAgIOKAlCBTaG93IGFjdGlvbiBsYWJlbCBkaXN0cmlidXRpb24gZnJvbSBkZWNpc2lvbnMKICAgIHBwbyAgICAgICAgIOKAlCBUcmFpbiB3aXRoIFBQTyAoc2VsZi1wbGF5IHJlaW5mb3JjZW1lbnQgbGVhcm5pbmcpCiAgICB0b3VybmFtZW50ICDigJQgUnVuIHJvdW5kLXJvYmluIHRvdXJuYW1lbnQgZXZhbHVhdGlvbgoKVXNhZ2U6CiAgICBweXRob24gLW0gbWwuc2NyaXB0cy5tbF9jbGkgc3RhdHVzCiAgICBweXRob24gLW0gbWwuc2NyaXB0cy5tbF9jbGkgYnVpbGQgLS1yZXN1bHRzLWRpciByZXN1bHRzLwogICAgcHl0aG9uIC1tIG1sLnNjcmlwdHMubWxfY2xpIHRyYWluIC0tZXBvY2hzIDUwIC0tbHIgMWUtMwogICAgcHl0aG9uIC1tIG1sLnNjcmlwdHMubWxfY2xpIGV2YWwKICAgIHB5dGhvbiAtbSBtbC5zY3JpcHRzLm1sX2NsaSBpbnNwZWN0IC0tZmlsZSByZXN1bHRzL21sLWRlY2lzaW9ucy1hYmMxMjM0NS5qc29ubAogICAgcHl0aG9uIC1tIG1sLnNjcmlwdHMubWxfY2xpIHN0YXRzIC0tcmVzdWx0cy1kaXIgcmVzdWx0cy8KICAgIHB5dGhvbiAtbSBtbC5zY3JpcHRzLm1sX2NsaSBwcG8gLS1pdGVyYXRpb25zIDEwMCAtLW9wcG9uZW50IGhldXJpc3RpYwogICAgcHl0aG9uIC1tIG1sLnNjcmlwdHMubWxfY2xpIHRvdXJuYW1lbnQgLS1lcGlzb2RlcyA1MAoiIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHN5cwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCiMgQWRkIHByb2plY3Qgcm9vdCB0byBwYXRoCnByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50LnBhcmVudCkKaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgoKZGVmIGNtZF9zdGF0dXMoYXJncyk6CiAgICAiIiJTaG93IE1MIGxvZ2dpbmcgc3RhdHVzIGFuZCBhdmFpbGFibGUgZGF0YSBmaWxlcy4iIiIKICAgIHJlc3VsdHNfZGlyID0gUGF0aChhcmdzLnJlc3VsdHNfZGlyKQoKICAgIHByaW50KCJcbuKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlyIpCiAgICBwcmludCgi4pWRICBDb21tYW5kZXIgQUkgTGFiIOKAlCBNTCBUcmFpbmluZyBTdGF0dXMgICDilZEiKQogICAgcHJpbnQoIuKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnVxuIikKCiAgICBpZiBub3QgcmVzdWx0c19kaXIuZXhpc3RzKCk6CiAgICAgICAgcHJpbnQoZiIgIFJlc3VsdHMgZGlyZWN0b3J5IG5vdCBmb3VuZDoge3Jlc3VsdHNfZGlyfSIpCiAgICAgICAgcHJpbnQoIiAgUnVuIGJhdGNoIHNpbXVsYXRpb25zIGZpcnN0LlxuIikKICAgICAgICByZXR1cm4KCiAgICAjIEZpbmQgZGVjaXNpb24gZmlsZXMKICAgIGpzb25sX2ZpbGVzID0gc29ydGVkKHJlc3VsdHNfZGlyLmdsb2IoIm1sLWRlY2lzaW9ucy0qLmpzb25sIikpCiAgICBpZiBub3QganNvbmxfZmlsZXM6CiAgICAgICAgcHJpbnQoIiAgTm8gTUwgZGVjaXNpb24gZmlsZXMgZm91bmQu' +
'IikKICAgICAgICBwcmludCgiICBFbmFibGUgTUwgbG9nZ2luZyBhbmQgcnVuIGJhdGNoIHNpbXVsYXRpb25zOiIpCiAgICAgICAgcHJpbnQoIiAgICDigKIgV2ViIFVJOiBQT1NUIC9hcGkvbWwvdG9nZ2xlP2VuYWJsZT10cnVlIikKICAgICAgICBwcmludCgiICAgIOKAoiBDTEk6ICAgIGphdmEgLWphciAuLi4gLS1tbC1sb2ciKQogICAgICAgIHByaW50KCkKICAgICAgICByZXR1cm4KCiAgICB0b3RhbF9kZWNpc2lvbnMgPSAwCiAgICB0b3RhbF9zaXplID0gMAoKICAgIHByaW50KGYiICB7J0ZpbGUnOjw0MH0geydEZWNpc2lvbnMnOj4xMH0geydTaXplJzo+MTB9IikKICAgIHByaW50KCIgICIgKyAi4pSAIiAqIDYyKQoKICAgIGZvciBmIGluIGpzb25sX2ZpbGVzOgogICAgICAgIGxpbmVzID0gMAogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKGYpIGFzIGZoOgogICAgICAgICAgICAgICAgbGluZXMgPSBzdW0oMSBmb3IgXyBpbiBmaCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgc2l6ZSA9IGYuc3RhdCgpLnN0X3NpemUKICAgICAgICB0b3RhbF9kZWNpc2lvbnMgKz0gbGluZXMKICAgICAgICB0b3RhbF9zaXplICs9IHNpemUKICAgICAgICBwcmludChmIiAge2YubmFtZTo8NDB9IHtsaW5lczo+MTAsfSB7c2l6ZS8xMDI0Oj45LjFmfUsiKQoKICAgIHByaW50KCIgICIgKyAi4pSAIiAqIDYyKQogICAgcHJpbnQoZiIgIHsnVE9UQUwnOjw0MH0ge3RvdGFsX2RlY2lzaW9uczo+MTAsfSB7dG90YWxfc2l6ZS8xMDI0Oj45LjFmfUsiKQoKICAgICMgQ2hlY2sgZm9yIGVtYmVkZGluZ3MKICAgIGVtYl9wYXRoID0gUGF0aChwcm9qZWN0X3Jvb3QpIC8gImVtYmVkZGluZ3MiIC8gIm10Z19lbWJlZGRpbmdzLm5weiIKICAgIGVtYl9zdGF0dXMgPSAi4pyTIExvYWRlZCIgaWYgZW1iX3BhdGguZXhpc3RzKCkgZWxzZSAi4pyXIE5vdCBmb3VuZCIKICAgIHByaW50KGYiXG4gIEVtYmVkZGluZ3M6IHtlbWJfc3RhdHVzfSIpCgogICAgIyBDaGVjayBmb3IgZXhpc3RpbmcgZGF0YXNldHMKICAgIG1vZGVsc19kaXIgPSBQYXRoKHByb2plY3Rfcm9vdCkgLyAibWwiIC8gIm1vZGVscyIKICAgIG5wel9maWxlcyA9IHNvcnRlZChtb2RlbHNfZGlyLmdsb2IoIioubnB6IikpIGlmIG1vZGVsc19kaXIuZXhpc3RzKCkgZWxzZSBbXQogICAgaWYgbnB6X2ZpbGVzOgogICAgICAgIHByaW50KGYiXG4gIEV4aXN0aW5nIGRhdGFzZXRzOiIpCiAgICAgICAgZm9yIGYgaW4gbnB6X2ZpbGVzOgogICAgICAgICAgICBwcmludChmIiAgICB7Zi5uYW1lfSAoe2Yuc3RhdCgpLnN0X3NpemUvMTAyNDouMWZ9SykiKQoKICAgIHByaW50KCkKCgpkZWYgY21kX2J1aWxkKGFyZ3MpOgogICAgIiIiQnVpbGQgdHJhaW5pbmcgZGF0YXNldC4iIiIKICAgIGZyb20gbWwuZGF0YS5kYXRhc2V0X2J1aWxkZXIgaW1wb3J0IGJ1aWxkX2RhdGFzZXQsIHNwbGl0X2RhdGFzZXQsIHNhdmVfZGF0YXNldAoKICAgIGRhdGFzZXQgPSBidWlsZF9kYXRhc2V0KAogICAgICAgIHJlc3VsdHNfZGlyPWFyZ3MucmVzdWx0c19kaXIsCiAgICAgICAgZW1iZWRkaW5nc19kaXI9YXJncy5lbWJlZGRpbmdzX2RpciwKICAgICAgICBtYXhfc2FtcGxlcz1hcmdzLm1heF9zYW1wbGVzLAogICAgKQogICAgaWYgbm90IGRhdGFzZXQ6CiAgICAgICAgcHJpbnQoIlxuTm8gZGF0YSB0byBidWlsZC4gRW5hYmxlIE1MIGxvZ2dpbmcgYW5kIHJ1biBzaW11bGF0aW9ucyBmaXJzdC4iKQogICAgICAgIHJldHVybgoKICAgIGlmIGFyZ3Mubm9fc3BsaXQ6CiAgICAgICAgc2F2ZV9kYXRhc2V0KGRhdGFzZXQsIGFyZ3Mub3V0cHV0KQogICAgZWxzZToKICAgICAgICB0cmFpbiwgdmFsLCB0ZXN0ID0gc3BsaXRfZGF0YXNldChkYXRhc2V0KQogICAgICAgIGJhc2UgPSBhcmdzLm91dHB1dC5yZXBsYWNlKCIubnB6IiwgIiIpCiAgICAgICAgc2F2ZV9kYXRhc2V0KHRyYWluLCBmIntiYXNlfS10cmFpbi5ucHoiKQogICAgICAgIHNhdmVfZGF0YXNldCh2YWwsIGYie2Jhc2V9LXZhbC5ucHoiKQogICAgICAgIHNhdmVfZGF0YXNldCh0ZXN0LCBmIntiYXNlfS10ZXN0Lm5weiIpCgogICAgcHJpbnQoIlxu4pyTIERhdGFzZXQgYnVpbGQgY29tcGxldGUuIikKCgpkZWYgY21kX2luc3BlY3QoYXJncyk6CiAgICAiIiJJbnNwZWN0IGEgSlNPTkwgZGVjaXNpb24gZmlsZS4iIiIKICAgIGZpbGVwYXRoID0gUGF0aChhcmdzLmZpbGUpCiAgICBpZiBub3QgZmlsZXBhdGguZXhpc3RzKCk6CiAgICAgICAg' +
'cHJpbnQoZiJGaWxlIG5vdCBmb3VuZDoge2ZpbGVwYXRofSIpCiAgICAgICAgcmV0dXJuCgogICAgcHJpbnQoZiJcbiAgSW5zcGVjdGluZzoge2ZpbGVwYXRoLm5hbWV9XG4iKQogICAgY291bnQgPSAwCiAgICB3aXRoIG9wZW4oZmlsZXBhdGgpIGFzIGY6CiAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGYpOgogICAgICAgICAgICBpZiBpID49IGFyZ3MubGltaXQ6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkID0ganNvbi5sb2FkcyhsaW5lLnN0cmlwKCkpCiAgICAgICAgICAgICAgICBhY3Rpb24gPSBkLmdldCgiYWN0aW9uIiwge30pCiAgICAgICAgICAgICAgICBwbGF5ZXJzID0gZC5nZXQoInBsYXllcnMiLCBbXSkKICAgICAgICAgICAgICAgIHAwX2xpZmUgPSBwbGF5ZXJzWzBdWyJsaWZlIl0gaWYgcGxheWVycyBlbHNlICI/IgogICAgICAgICAgICAgICAgcDFfbGlmZSA9IHBsYXllcnNbMV1bImxpZmUiXSBpZiBsZW4ocGxheWVycykgPiAxIGVsc2UgIj8iCgogICAgICAgICAgICAgICAgcHJpbnQoZiIgIFt7aTo+NH1dIFR1cm4ge2QuZ2V0KCd0dXJuJywgJz8nKTo+Mn0gIgogICAgICAgICAgICAgICAgICAgICAgZiJ8IFBoYXNlOiB7ZC5nZXQoJ3BoYXNlJywgJz8nKTo8OH0gIgogICAgICAgICAgICAgICAgICAgICAgZiJ8IFNlYXQge2QuZ2V0KCdhY3RpdmVfc2VhdCcsICc/Jyl9ICIKICAgICAgICAgICAgICAgICAgICAgIGYifCBMaWZlOiB7cDBfbGlmZX0ve3AxX2xpZmV9ICIKICAgICAgICAgICAgICAgICAgICAgIGYifCB7YWN0aW9uLmdldCgndHlwZScsICc/Jyl9OiB7YWN0aW9uLmdldCgnY2FyZCcsICctJyl9IikKICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgcHJpbnQoZiIgIFt7aTo+NH1dIEVSUk9SOiB7ZX0iKQoKICAgIHdpdGggb3BlbihmaWxlcGF0aCkgYXMgZjoKICAgICAgICB0b3RhbCA9IHN1bSgxIGZvciBfIGluIGYpCiAgICBwcmludChmIlxuICBTaG93aW5nIHtjb3VudH0gb2Yge3RvdGFsOix9IHRvdGFsIGRlY2lzaW9ucy5cbiIpCgoKZGVmIGNtZF90cmFpbihhcmdzKToKICAgICIiIlRyYWluIHBvbGljeSBuZXR3b3JrLiIiIgogICAgZnJvbSBtbC50cmFpbmluZy50cmFpbmVyIGltcG9ydCBtYWluIGFzIHRyYWluZXJfbWFpbgogICAgIyBSZS1jb25zdHJ1Y3Qgc3lzLmFyZ3YgZm9yIHRoZSB0cmFpbmVyIENMSQogICAgYXJndiA9IFsidHJhaW5lciJdCiAgICBpZiBhcmdzLmRhdGFfZGlyOgogICAgICAgIGFyZ3YgKz0gWyItLWRhdGEtZGlyIiwgYXJncy5kYXRhX2Rpcl0KICAgIGlmIGFyZ3MuZXBvY2hzOgogICAgICAgIGFyZ3YgKz0gWyItLWVwb2NocyIsIHN0cihhcmdzLmVwb2NocyldCiAgICBpZiBhcmdzLmJhdGNoX3NpemU6CiAgICAgICAgYXJndiArPSBbIi0tYmF0Y2gtc2l6ZSIsIHN0cihhcmdzLmJhdGNoX3NpemUpXQogICAgaWYgYXJncy5scjoKICAgICAgICBhcmd2ICs9IFsiLS1sciIsIHN0cihhcmdzLmxyKV0KICAgIGlmIGFyZ3MucGF0aWVuY2U6CiAgICAgICAgYXJndiArPSBbIi0tcGF0aWVuY2UiLCBzdHIoYXJncy5wYXRpZW5jZSldCiAgICBpZiBhcmdzLmNoZWNrcG9pbnRfZGlyOgogICAgICAgIGFyZ3YgKz0gWyItLWNoZWNrcG9pbnQtZGlyIiwgYXJncy5jaGVja3BvaW50X2Rpcl0KICAgIGlmIGFyZ3MuZGV2aWNlOgogICAgICAgIGFyZ3YgKz0gWyItLWRldmljZSIsIGFyZ3MuZGV2aWNlXQogICAgc3lzLmFyZ3YgPSBhcmd2CiAgICB0cmFpbmVyX21haW4oKQoKCmRlZiBjbWRfZXZhbChhcmdzKToKICAgICIiIkV2YWx1YXRlIHRyYWluZWQgbW9kZWwuIiIiCiAgICBmcm9tIG1sLnRyYWluaW5nLnRyYWluZXIgaW1wb3J0IG1haW4gYXMgdHJhaW5lcl9tYWluCiAgICBhcmd2ID0gWyJ0cmFpbmVyIiwgIi0tZXZhbC1vbmx5Il0KICAgIGlmIGFyZ3MuZGF0YV9kaXI6CiAgICAgICAgYXJndiArPSBbIi0tZGF0YS1kaXIiLCBhcmdzLmRhdGFfZGlyXQogICAgaWYgYXJncy5jaGVja3BvaW50X2RpcjoKICAgICAgICBhcmd2ICs9IFsiLS1jaGVja3BvaW50LWRpciIsIGFyZ3MuY2hlY2twb2ludF9kaXJdCiAgICBpZiBhcmdzLmNoZWNrcG9pbnQ6CiAgICAgICAgYXJndiArPSBbIi0tY2hlY2twb2ludCIsIGFyZ3MuY2hlY2twb2ludF0KICAgIGlmIGFyZ3MuZGV2aWNlOgogICAgICAgIGFyZ3YgKz0gWyItLWRldmljZSIsIGFyZ3MuZGV2aWNlXQogICAg' +
'c3lzLmFyZ3YgPSBhcmd2CiAgICB0cmFpbmVyX21haW4oKQoKCmRlZiBjbWRfcHBvKGFyZ3MpOgogICAgIiIiVHJhaW4gd2l0aCBQUE8gKHNlbGYtcGxheSBSTCkuIiIiCiAgICBpbXBvcnQgbG9nZ2luZwogICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLklORk8sIGZvcm1hdD0iJShtZXNzYWdlKXMiKQoKICAgIGZyb20gbWwudHJhaW5pbmcucHBvX3RyYWluZXIgaW1wb3J0IFBQT1RyYWluZXIsIFBQT0NvbmZpZwoKICAgIGNvbmZpZyA9IFBQT0NvbmZpZygKICAgICAgICBpdGVyYXRpb25zPWFyZ3MuaXRlcmF0aW9ucywKICAgICAgICBlcGlzb2Rlc19wZXJfaXRlcj1hcmdzLmVwaXNvZGVzX3Blcl9pdGVyLAogICAgICAgIHBwb19lcG9jaHM9YXJncy5wcG9fZXBvY2hzLAogICAgICAgIGJhdGNoX3NpemU9YXJncy5iYXRjaF9zaXplLAogICAgICAgIGNsaXBfZXBzaWxvbj1hcmdzLmNsaXBfZXBzaWxvbiwKICAgICAgICBlbnRyb3B5X2NvZWZmPWFyZ3MuZW50cm9weV9jb2VmZiwKICAgICAgICBsZWFybmluZ19yYXRlPWFyZ3MubHIsCiAgICAgICAgbHJfc2NoZWR1bGU9YXJncy5scl9zY2hlZHVsZSwKICAgICAgICBidWZmZXJfc2l6ZT1hcmdzLmJ1ZmZlcl9zaXplLAogICAgICAgIGdhbW1hPWFyZ3MuZ2FtbWEsCiAgICAgICAgZ2FlX2xhbWJkYT1hcmdzLmdhZV9sYW1iZGEsCiAgICAgICAgb3Bwb25lbnQ9YXJncy5vcHBvbmVudCwKICAgICAgICBwbGF5c3R5bGU9YXJncy5wbGF5c3R5bGUsCiAgICAgICAgY2hlY2twb2ludF9kaXI9YXJncy5jaGVja3BvaW50X2RpciBvciAibWwvbW9kZWxzL2NoZWNrcG9pbnRzIiwKICAgICAgICBzYXZlX2V2ZXJ5PWFyZ3Muc2F2ZV9ldmVyeSwKICAgICAgICBldmFsX2V2ZXJ5PWFyZ3MuZXZhbF9ldmVyeSwKICAgICAgICBldmFsX2VwaXNvZGVzPWFyZ3MuZXZhbF9lcGlzb2RlcywKICAgICAgICBsb2FkX3N1cGVydmlzZWQ9YXJncy5sb2FkX3N1cGVydmlzZWQsCiAgICApCgogICAgdHJhaW5lciA9IFBQT1RyYWluZXIoY29uZmlnKQogICAgc3VtbWFyeSA9IHRyYWluZXIudHJhaW4oKQogICAgcHJpbnQoanNvbi5kdW1wcyhzdW1tYXJ5LCBpbmRlbnQ9MikpCgoKZGVmIGNtZF90b3VybmFtZW50KGFyZ3MpOgogICAgIiIiUnVuIHJvdW5kLXJvYmluIHRvdXJuYW1lbnQgZXZhbHVhdGlvbi4iIiIKICAgIGltcG9ydCBsb2dnaW5nCiAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgZm9ybWF0PSIlKG1lc3NhZ2UpcyIpCgogICAgZnJvbSBtbC5ldmFsLnRvdXJuYW1lbnQgaW1wb3J0IG1haW4gYXMgdG91cm5hbWVudF9tYWluCiAgICBhcmd2ID0gWyJ0b3VybmFtZW50Il0KICAgIGlmIGFyZ3MuZXBpc29kZXM6CiAgICAgICAgYXJndiArPSBbIi0tZXBpc29kZXMiLCBzdHIoYXJncy5lcGlzb2RlcyldCiAgICBpZiBhcmdzLmNoZWNrcG9pbnQ6CiAgICAgICAgYXJndiArPSBbIi0tY2hlY2twb2ludCIsIGFyZ3MuY2hlY2twb2ludF0KICAgIGlmIGFyZ3MucHBvX2NoZWNrcG9pbnQ6CiAgICAgICAgYXJndiArPSBbIi0tcHBvLWNoZWNrcG9pbnQiLCBhcmdzLnBwb19jaGVja3BvaW50XQogICAgaWYgYXJncy5wbGF5c3R5bGU6CiAgICAgICAgYXJndiArPSBbIi0tcGxheXN0eWxlIiwgYXJncy5wbGF5c3R5bGVdCiAgICBpZiBhcmdzLm91dHB1dDoKICAgICAgICBhcmd2ICs9IFsiLS1vdXRwdXQiLCBhcmdzLm91dHB1dF0KICAgIHN5cy5hcmd2ID0gYXJndgogICAgdG91cm5hbWVudF9tYWluKCkKCgpkZWYgY21kX3N0YXRzKGFyZ3MpOgogICAgIiIiU2hvdyBhY3Rpb24gbGFiZWwgZGlzdHJpYnV0aW9uLiIiIgogICAgZnJvbSBtbC5hY3Rpb25zLmxhYmVsZXIgaW1wb3J0IGxhYmVsX2RlY2lzaW9uc19maWxlLCBwcmludF9sYWJlbF9kaXN0cmlidXRpb24KICAgIGltcG9ydCBudW1weSBhcyBucAoKICAgIHJlc3VsdHNfZGlyID0gUGF0aChhcmdzLnJlc3VsdHNfZGlyKQogICAganNvbmxfZmlsZXMgPSBzb3J0ZWQocmVzdWx0c19kaXIuZ2xvYigibWwtZGVjaXNpb25zLSouanNvbmwiKSkKCiAgICBpZiBub3QganNvbmxfZmlsZXM6CiAgICAgICAgcHJpbnQoIk5vIE1MIGRlY2lzaW9uIGZpbGVzIGZvdW5kLiIpCiAgICAgICAgcmV0dXJuCgogICAgYWxsX2xhYmVscyA9IFtdCiAgICBmb3IgZiBpbiBqc29ubF9maWxlczoKICAgICAgICBsYWJlbHMsIF8gPSBsYWJlbF9kZWNpc2lvbnNfZmlsZShzdHIoZikpCiAgICAgICAgYWxsX2xhYmVscy5hcHBlbmQobGFiZWxzKQoKICAgIGNvbWJpbmVk' +
'ID0gbnAuY29uY2F0ZW5hdGUoYWxsX2xhYmVscykKICAgIHByaW50KGYiXG5Db21iaW5lZCBzdGF0cyBmcm9tIHtsZW4oanNvbmxfZmlsZXMpfSBmaWxlczoiKQogICAgcHJpbnRfbGFiZWxfZGlzdHJpYnV0aW9uKGNvbWJpbmVkKQogICAgcHJpbnQoKQoKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKICAgICAgICBkZXNjcmlwdGlvbj0iQ29tbWFuZGVyIEFJIExhYiDigJQgTUwgUGlwZWxpbmUgQ0xJIgogICAgKQogICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycyhkZXN0PSJjb21tYW5kIikKCiAgICAjIHN0YXR1cwogICAgc3Bfc3RhdHVzID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCJzdGF0dXMiLCBoZWxwPSJTaG93IE1MIHRyYWluaW5nIGRhdGEgc3RhdHVzIikKICAgIHNwX3N0YXR1cy5hZGRfYXJndW1lbnQoIi0tcmVzdWx0cy1kaXIiLCBkZWZhdWx0PSJyZXN1bHRzIikKCiAgICAjIGJ1aWxkCiAgICBzcF9idWlsZCA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcigiYnVpbGQiLCBoZWxwPSJCdWlsZCB0cmFpbmluZyBkYXRhc2V0IikKICAgIHNwX2J1aWxkLmFkZF9hcmd1bWVudCgiLS1yZXN1bHRzLWRpciIsIGRlZmF1bHQ9InJlc3VsdHMiKQogICAgc3BfYnVpbGQuYWRkX2FyZ3VtZW50KCItLWVtYmVkZGluZ3MtZGlyIiwgZGVmYXVsdD1Ob25lKQogICAgc3BfYnVpbGQuYWRkX2FyZ3VtZW50KCItLW91dHB1dCIsIGRlZmF1bHQ9Im1sL21vZGVscy9kYXRhc2V0Lm5weiIpCiAgICBzcF9idWlsZC5hZGRfYXJndW1lbnQoIi0tbWF4LXNhbXBsZXMiLCB0eXBlPWludCwgZGVmYXVsdD1Ob25lKQogICAgc3BfYnVpbGQuYWRkX2FyZ3VtZW50KCItLW5vLXNwbGl0IiwgYWN0aW9uPSJzdG9yZV90cnVlIikKCiAgICAjIGluc3BlY3QKICAgIHNwX2luc3BlY3QgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoImluc3BlY3QiLCBoZWxwPSJJbnNwZWN0IGEgZGVjaXNpb24gZmlsZSIpCiAgICBzcF9pbnNwZWN0LmFkZF9hcmd1bWVudCgiLS1maWxlIiwgcmVxdWlyZWQ9VHJ1ZSkKICAgIHNwX2luc3BlY3QuYWRkX2FyZ3VtZW50KCItLWxpbWl0IiwgdHlwZT1pbnQsIGRlZmF1bHQ9MjApCgogICAgIyB0cmFpbgogICAgc3BfdHJhaW4gPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoInRyYWluIiwgaGVscD0iVHJhaW4gcG9saWN5IG5ldHdvcmsiKQogICAgc3BfdHJhaW4uYWRkX2FyZ3VtZW50KCItLWRhdGEtZGlyIiwgZGVmYXVsdD0ibWwvbW9kZWxzIikKICAgIHNwX3RyYWluLmFkZF9hcmd1bWVudCgiLS1lcG9jaHMiLCB0eXBlPWludCwgZGVmYXVsdD1Ob25lKQogICAgc3BfdHJhaW4uYWRkX2FyZ3VtZW50KCItLWJhdGNoLXNpemUiLCB0eXBlPWludCwgZGVmYXVsdD1Ob25lKQogICAgc3BfdHJhaW4uYWRkX2FyZ3VtZW50KCItLWxyIiwgdHlwZT1mbG9hdCwgZGVmYXVsdD1Ob25lKQogICAgc3BfdHJhaW4uYWRkX2FyZ3VtZW50KCItLXBhdGllbmNlIiwgdHlwZT1pbnQsIGRlZmF1bHQ9Tm9uZSkKICAgIHNwX3RyYWluLmFkZF9hcmd1bWVudCgiLS1jaGVja3BvaW50LWRpciIsIGRlZmF1bHQ9Tm9uZSkKICAgIHNwX3RyYWluLmFkZF9hcmd1bWVudCgiLS1kZXZpY2UiLCBkZWZhdWx0PU5vbmUpCgogICAgIyBldmFsCiAgICBzcF9ldmFsID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCJldmFsIiwgaGVscD0iRXZhbHVhdGUgdHJhaW5lZCBtb2RlbCBvbiB0ZXN0IHNldCIpCiAgICBzcF9ldmFsLmFkZF9hcmd1bWVudCgiLS1kYXRhLWRpciIsIGRlZmF1bHQ9Im1sL21vZGVscyIpCiAgICBzcF9ldmFsLmFkZF9hcmd1bWVudCgiLS1jaGVja3BvaW50LWRpciIsIGRlZmF1bHQ9Tm9uZSkKICAgIHNwX2V2YWwuYWRkX2FyZ3VtZW50KCItLWNoZWNrcG9pbnQiLCBkZWZhdWx0PU5vbmUpCiAgICBzcF9ldmFsLmFkZF9hcmd1bWVudCgiLS1kZXZpY2UiLCBkZWZhdWx0PU5vbmUpCgogICAgIyBzdGF0cwogICAgc3Bfc3RhdHMgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoInN0YXRzIiwgaGVscD0iU2hvdyBhY3Rpb24gbGFiZWwgZGlzdHJpYnV0aW9uIikKICAgIHNwX3N0YXRzLmFkZF9hcmd1bWVudCgiLS1yZXN1bHRzLWRpciIsIGRlZmF1bHQ9InJlc3VsdHMiKQoKICAgICMgcHBvCiAgICBzcF9wcG8gPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoInBwbyIsIGhlbHA9IlRyYWluIHdpdGggUFBPIChzZWxmLXBsYXkgUkwpIikKICAgIHNwX3Bwby5hZGRfYXJndW1lbnQoIi0taXRlcmF0aW9ucyIsIHR5cGU9aW50LCBkZWZhdWx0PTEwMCkK' +
'ICAgIHNwX3Bwby5hZGRfYXJndW1lbnQoIi0tZXBpc29kZXMtcGVyLWl0ZXIiLCB0eXBlPWludCwgZGVmYXVsdD02NCkKICAgIHNwX3Bwby5hZGRfYXJndW1lbnQoIi0tcHBvLWVwb2NocyIsIHR5cGU9aW50LCBkZWZhdWx0PTQpCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLWJhdGNoLXNpemUiLCB0eXBlPWludCwgZGVmYXVsdD0yNTYpCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLWNsaXAtZXBzaWxvbiIsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9MC4yKQogICAgc3BfcHBvLmFkZF9hcmd1bWVudCgiLS1lbnRyb3B5LWNvZWZmIiwgdHlwZT1mbG9hdCwgZGVmYXVsdD0wLjAxKQogICAgc3BfcHBvLmFkZF9hcmd1bWVudCgiLS1sciIsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9M2UtNCkKICAgIHNwX3Bwby5hZGRfYXJndW1lbnQoIi0tbHItc2NoZWR1bGUiLCBkZWZhdWx0PSJjb25zdGFudCIsIGNob2ljZXM9WyJjb25zdGFudCIsICJsaW5lYXIiLCAiY29zaW5lIl0pCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLWJ1ZmZlci1zaXplIiwgdHlwZT1pbnQsIGRlZmF1bHQ9NDA5NikKICAgIHNwX3Bwby5hZGRfYXJndW1lbnQoIi0tZ2FtbWEiLCB0eXBlPWZsb2F0LCBkZWZhdWx0PTAuOTkpCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLWdhZS1sYW1iZGEiLCB0eXBlPWZsb2F0LCBkZWZhdWx0PTAuOTUpCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLW9wcG9uZW50IiwgZGVmYXVsdD0iaGV1cmlzdGljIiwgY2hvaWNlcz1bImhldXJpc3RpYyIsICJyYW5kb20iLCAic2VsZiJdKQogICAgc3BfcHBvLmFkZF9hcmd1bWVudCgiLS1wbGF5c3R5bGUiLCBkZWZhdWx0PSJtaWRyYW5nZSIpCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLWNoZWNrcG9pbnQtZGlyIiwgZGVmYXVsdD1Ob25lKQogICAgc3BfcHBvLmFkZF9hcmd1bWVudCgiLS1zYXZlLWV2ZXJ5IiwgdHlwZT1pbnQsIGRlZmF1bHQ9MTApCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLWV2YWwtZXZlcnkiLCB0eXBlPWludCwgZGVmYXVsdD01KQogICAgc3BfcHBvLmFkZF9hcmd1bWVudCgiLS1ldmFsLWVwaXNvZGVzIiwgdHlwZT1pbnQsIGRlZmF1bHQ9NTApCiAgICBzcF9wcG8uYWRkX2FyZ3VtZW50KCItLWxvYWQtc3VwZXJ2aXNlZCIsIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGF0aCB0byBzdXBlcnZpc2VkIGNoZWNrcG9pbnQgdG8gaW5pdGlhbGl6ZSBmcm9tIikKCiAgICAjIHRvdXJuYW1lbnQKICAgIHNwX3RvdXJuZXkgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoInRvdXJuYW1lbnQiLCBoZWxwPSJSdW4gcm91bmQtcm9iaW4gdG91cm5hbWVudCBldmFsdWF0aW9uIikKICAgIHNwX3RvdXJuZXkuYWRkX2FyZ3VtZW50KCItLWVwaXNvZGVzIiwgdHlwZT1pbnQsIGRlZmF1bHQ9NTApCiAgICBzcF90b3VybmV5LmFkZF9hcmd1bWVudCgiLS1jaGVja3BvaW50IiwgZGVmYXVsdD1Ob25lKQogICAgc3BfdG91cm5leS5hZGRfYXJndW1lbnQoIi0tcHBvLWNoZWNrcG9pbnQiLCBkZWZhdWx0PU5vbmUpCiAgICBzcF90b3VybmV5LmFkZF9hcmd1bWVudCgiLS1wbGF5c3R5bGUiLCBkZWZhdWx0PSJtaWRyYW5nZSIpCiAgICBzcF90b3VybmV5LmFkZF9hcmd1bWVudCgiLS1vdXRwdXQiLCBkZWZhdWx0PU5vbmUpCgogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBpZiBhcmdzLmNvbW1hbmQgPT0gInN0YXR1cyI6CiAgICAgICAgY21kX3N0YXR1cyhhcmdzKQogICAgZWxpZiBhcmdzLmNvbW1hbmQgPT0gImJ1aWxkIjoKICAgICAgICBjbWRfYnVpbGQoYXJncykKICAgIGVsaWYgYXJncy5jb21tYW5kID09ICJ0cmFpbiI6CiAgICAgICAgY21kX3RyYWluKGFyZ3MpCiAgICBlbGlmIGFyZ3MuY29tbWFuZCA9PSAiZXZhbCI6CiAgICAgICAgY21kX2V2YWwoYXJncykKICAgIGVsaWYgYXJncy5jb21tYW5kID09ICJpbnNwZWN0IjoKICAgICAgICBjbWRfaW5zcGVjdChhcmdzKQogICAgZWxpZiBhcmdzLmNvbW1hbmQgPT0gInN0YXRzIjoKICAgICAgICBjbWRfc3RhdHMoYXJncykKICAgIGVsaWYgYXJncy5jb21tYW5kID09ICJwcG8iOgogICAgICAgIGNtZF9wcG8oYXJncykKICAgIGVsaWYgYXJncy5jb21tYW5kID09ICJ0b3VybmFtZW50IjoKICAgICAgICBjbWRfdG91cm5hbWVudChhcmdzKQogICAgZWxzZToKICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQo='
Install-B64 -R 'ml\scripts\ml_cli.py' -B $b
# ml/serving/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\serving\__init__.py' -B $b
# ml/serving/policy_server.py (15,132 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFBvbGljeSBJbmZlcmVuY2UgU2VydmVyCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApGYXN0QVBJIHNlcnZpY2UgdGhhdCBsb2FkcyBhIHRyYWluZWQgUG9saWN5TmV0d29yayBjaGVja3BvaW50IGFuZCBzZXJ2ZXMKbWFjcm8tYWN0aW9uIHByZWRpY3Rpb25zIHZpYSBIVFRQLgoKVGhlIEphdmEgYmF0Y2ggcnVubmVyIGNhbGxzIHRoaXMgZW5kcG9pbnQgYXQgZWFjaCBkZWNpc2lvbiBwb2ludAp0byBnZXQgdGhlIGxlYXJuZWQgcG9saWN5J3MgYWN0aW9uIGluc3RlYWQgb2YgdXNpbmcgRm9yZ2UncyBidWlsdC1pbiBBSS4KCkVuZHBvaW50czoKICAgIFBPU1QgL2FwaS9tbC9wcmVkaWN0ICAg4oCUIFByZWRpY3QgYWN0aW9uIGZyb20gcmF3IGdhbWUgc3RhdGUgSlNPTgogICAgR0VUICAvYXBpL21sL21vZGVsICAgICDigJQgQ3VycmVudCBtb2RlbCBpbmZvIChsb2FkZWQgY2hlY2twb2ludCwgYWNjdXJhY3kpCiAgICBQT1NUIC9hcGkvbWwvcmVsb2FkICAgIOKAlCBIb3QtcmVsb2FkIGEgbmV3IGNoZWNrcG9pbnQgd2l0aG91dCByZXN0YXJ0CgpEZXNpZ246CiAgICAtIExvYWRzIGNhcmQgZW1iZWRkaW5ncyArIHN0YXRlIGVuY29kZXIgb24gc3RhcnR1cAogICAgLSBBY2NlcHRzIERlY2lzaW9uU25hcHNob3Qtc2hhcGVkIEpTT04gZnJvbSBKYXZhCiAgICAtIEVuY29kZXMgc3RhdGUg4oaSIHRlbnNvciwgcnVucyBtb2RlbCBmb3J3YXJkIHBhc3MsIHJldHVybnMgYWN0aW9uCiAgICAtIFN1cHBvcnRzIHRlbXBlcmF0dXJlLWNvbnRyb2xsZWQgc2FtcGxpbmcgb3IgZ3JlZWR5IGFyZ21heAogICAgLSBUaHJlYWQtc2FmZSB2aWEgdG9yY2gubm9fZ3JhZCgpIGluZmVyZW5jZQoKVXNhZ2UgKHN0YW5kYWxvbmUpOgogICAgcHl0aG9uIC1tIG1sLnNlcnZpbmcucG9saWN5X3NlcnZlciAtLXBvcnQgODA5MAogICAgcHl0aG9uIC1tIG1sLnNlcnZpbmcucG9saWN5X3NlcnZlciAtLWNoZWNrcG9pbnQgbWwvbW9kZWxzL2NoZWNrcG9pbnRzL2Jlc3RfcG9saWN5LnB0CgpVc2FnZSAoaW50ZWdyYXRlZCBpbnRvIGxhYl9hcGkucHkpOgogICAgSW1wb3J0IFBvbGljeUluZmVyZW5jZVNlcnZpY2UgYW5kIHJlZ2lzdGVyIGVuZHBvaW50cyBvbiB0aGUgZXhpc3RpbmcgYXBwLgoiIiIKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0aW1lCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwKCmltcG9ydCBudW1weSBhcyBucAoKcHJvamVjdF9yb290ID0gc3RyKFBhdGgoX19maWxlX18pLnBhcmVudC5wYXJlbnQucGFyZW50KQppZiBwcm9qZWN0X3Jvb3Qgbm90IGluIHN5cy5wYXRoOgogICAgc3lzLnBhdGguaW5zZXJ0KDAsIHByb2plY3Rfcm9vdCkKCiMgQ29uZGl0aW9uYWwgaW1wb3J0cwp0cnk6CiAgICBpbXBvcnQgdG9yY2gKICAgIFRPUkNIX0FWQUlMQUJMRSA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgVE9SQ0hfQVZBSUxBQkxFID0gRmFsc2UKCmZyb20gbWwuY29uZmlnLnNjb3BlIGltcG9ydCAoCiAgICBOVU1fQUNUSU9OUywgSURYX1RPX0FDVElPTiwgTWFjcm9BY3Rpb24sIFNUQVRFX0RJTVMsCikKZnJvbSBtbC5lbmNvZGVyLnN0YXRlX2VuY29kZXIgaW1wb3J0IENhcmRFbWJlZGRpbmdJbmRleCwgU3RhdGVFbmNvZGVyCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigibWwuc2VydmluZyIpCgoKY2xhc3MgUG9saWN5SW5mZXJlbmNlU2VydmljZToKICAgICIiIgogICAgTG9hZHMgYSB0cmFpbmVkIFBvbGljeU5ldHdvcmsgYW5kIHByb3ZpZGVzIGFjdGlvbiBwcmVkaWN0aW9ucy4KCiAgICBUaHJlYWQtc2FmZSDigJQgdXNlcyB0b3JjaC5ub19ncmFkKCkgZm9yIGluZmVyZW5jZS4KICAgIERlc2lnbmVkIHRvIGJlIGVtYmVkZGVkIGluIGxhYl9hcGkucHkgb3IgcnVuIHN0YW5kYWxvbmUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICBjaGVja3BvaW50X2Rpcjogc3RyID0gTm9uZSwKICAgICAgICBlbWJlZGRpbmdzX2Rpcjogc3RyID0gTm9uZSwKICAgICAgICBkZXZpY2U6IHN0ciA9IE5vbmUsCiAgICApOgogICAgICAgIHNlbGYuY2hlY2twb2ludF9kaXIgPSBjaGVja3BvaW50X2RpciBv' +
'ciBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHByb2plY3Rfcm9vdCwgIm1sIiwgIm1vZGVscyIsICJjaGVja3BvaW50cyIKICAgICAgICApCiAgICAgICAgc2VsZi5lbWJlZGRpbmdzX2RpciA9IGVtYmVkZGluZ3NfZGlyIG9yIG9zLnBhdGguam9pbigKICAgICAgICAgICAgcHJvamVjdF9yb290LCAiZW1iZWRkaW5ncyIKICAgICAgICApCiAgICAgICAgc2VsZi5kZXZpY2UgPSBkZXZpY2Ugb3Igc2VsZi5fZGV0ZWN0X2RldmljZSgpCgogICAgICAgIHNlbGYubW9kZWwgPSBOb25lCiAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQogICAgICAgIHNlbGYuY2FyZF9pbmRleCA9IE5vbmUKICAgICAgICBzZWxmLmNoZWNrcG9pbnRfaW5mbzogRGljdCA9IHt9CiAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UKICAgICAgICBzZWxmLl9sb2FkX2Vycm9yOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKICAgIGRlZiBfZGV0ZWN0X2RldmljZShzZWxmKSAtPiBzdHI6CiAgICAgICAgaWYgbm90IFRPUkNIX0FWQUlMQUJMRToKICAgICAgICAgICAgcmV0dXJuICJjcHUiCiAgICAgICAgaWYgdG9yY2guY3VkYS5pc19hdmFpbGFibGUoKToKICAgICAgICAgICAgcmV0dXJuICJjdWRhIgogICAgICAgIGlmIGhhc2F0dHIodG9yY2guYmFja2VuZHMsICJtcHMiKSBhbmQgdG9yY2guYmFja2VuZHMubXBzLmlzX2F2YWlsYWJsZSgpOgogICAgICAgICAgICByZXR1cm4gIm1wcyIKICAgICAgICByZXR1cm4gImNwdSIKCiAgICBkZWYgbG9hZChzZWxmKSAtPiBib29sOgogICAgICAgICIiIgogICAgICAgIExvYWQgY2FyZCBlbWJlZGRpbmdzLCBzdGF0ZSBlbmNvZGVyLCBhbmQgcG9saWN5IG1vZGVsLgogICAgICAgIFJldHVybnMgVHJ1ZSBpZiBldmVyeXRoaW5nIGxvYWRlZCBzdWNjZXNzZnVsbHkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IFRPUkNIX0FWQUlMQUJMRToKICAgICAgICAgICAgc2VsZi5fbG9hZF9lcnJvciA9ICJQeVRvcmNoIG5vdCBpbnN0YWxsZWQiCiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiUHlUb3JjaCBub3QgaW5zdGFsbGVkIOKAlCBjYW5ub3Qgc2VydmUgcG9saWN5IikKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgMS4gTG9hZCBjYXJkIGVtYmVkZGluZ3MKICAgICAgICBzZWxmLmNhcmRfaW5kZXggPSBDYXJkRW1iZWRkaW5nSW5kZXgoc2VsZi5lbWJlZGRpbmdzX2RpcikKICAgICAgICBpZiBub3Qgc2VsZi5jYXJkX2luZGV4LmxvYWQoKToKICAgICAgICAgICAgc2VsZi5fbG9hZF9lcnJvciA9ICJDYXJkIGVtYmVkZGluZ3Mgbm90IGZvdW5kIgogICAgICAgICAgICBsb2dnZXIuZXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FyZCBlbWJlZGRpbmdzIG5vdCBmb3VuZCBhdCAlcy4gIgogICAgICAgICAgICAgICAgIlN0YXJ0IHRoZSBsYWIgc2VydmVyIHRvIGF1dG8tZG93bmxvYWQsIG9yIHJ1biBjb2FjaCBmaXJzdC4iLAogICAgICAgICAgICAgICAgc2VsZi5lbWJlZGRpbmdzX2RpciwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgc2VsZi5lbmNvZGVyID0gU3RhdGVFbmNvZGVyKHNlbGYuY2FyZF9pbmRleCkKCiAgICAgICAgIyAyLiBMb2FkIHBvbGljeSBjaGVja3BvaW50CiAgICAgICAgY2hlY2twb2ludF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuY2hlY2twb2ludF9kaXIsICJiZXN0X3BvbGljeS5wdCIpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGNoZWNrcG9pbnRfcGF0aCk6CiAgICAgICAgICAgIHNlbGYuX2xvYWRfZXJyb3IgPSBmIk5vIGNoZWNrcG9pbnQgYXQge2NoZWNrcG9pbnRfcGF0aH0iCiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJObyB0cmFpbmVkIG1vZGVsIGZvdW5kIGF0ICVzIiwgY2hlY2twb2ludF9wYXRoKQogICAgICAgICAgICBsb2dnZXIud2FybmluZygiVHJhaW4gYSBtb2RlbCBmaXJzdDogcHl0aG9uIC1tIG1sLnNjcmlwdHMubWxfY2xpIHRyYWluIikKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBtbC50cmFpbmluZy5wb2xpY3lfbmV0d29yayBpbXBvcnQgbG9hZF9jaGVja3BvaW50CiAgICAgICAgICAgIHNlbGYubW9kZWwsIGNoZWNrcG9pbnQgPSBsb2FkX2NoZWNrcG9pbnQoY2hlY2twb2ludF9wYXRoLCBzZWxmLmRldmljZSkKICAgICAgICAgICAgc2VsZi5tb2RlbC5ldmFsKCkKCiAgICAgICAgICAgIHNlbGYuY2hlY2twb2ludF9pbmZvID0gewogICAgICAgICAgICAgICAgInBhdGgi' +
'OiBjaGVja3BvaW50X3BhdGgsCiAgICAgICAgICAgICAgICAiZXBvY2giOiBjaGVja3BvaW50LmdldCgiZXBvY2giLCAiPyIpLAogICAgICAgICAgICAgICAgIm1ldHJpY3MiOiBjaGVja3BvaW50LmdldCgibWV0cmljcyIsIHt9KSwKICAgICAgICAgICAgICAgICJkZXZpY2UiOiBzZWxmLmRldmljZSwKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQogICAgICAgICAgICBzZWxmLl9sb2FkX2Vycm9yID0gTm9uZQogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJQb2xpY3kgbW9kZWwgbG9hZGVkIChlcG9jaCAlcywgZGV2aWNlPSVzKSIsCiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrcG9pbnRfaW5mb1siZXBvY2giXSwgc2VsZi5kZXZpY2UsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBzZWxmLl9sb2FkX2Vycm9yID0gc3RyKGUpCiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGxvYWQgY2hlY2twb2ludDogJXMiLCBlKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgcmVsb2FkKHNlbGYsIGNoZWNrcG9pbnRfcGF0aDogc3RyID0gTm9uZSkgLT4gYm9vbDoKICAgICAgICAiIiJIb3QtcmVsb2FkIGEgY2hlY2twb2ludCB3aXRob3V0IHJlbG9hZGluZyBlbWJlZGRpbmdzLiIiIgogICAgICAgIGlmIG5vdCBUT1JDSF9BVkFJTEFCTEU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBwYXRoID0gY2hlY2twb2ludF9wYXRoIG9yIG9zLnBhdGguam9pbihzZWxmLmNoZWNrcG9pbnRfZGlyLCAiYmVzdF9wb2xpY3kucHQiKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgc2VsZi5fbG9hZF9lcnJvciA9IGYiQ2hlY2twb2ludCBub3QgZm91bmQ6IHtwYXRofSIKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBtbC50cmFpbmluZy5wb2xpY3lfbmV0d29yayBpbXBvcnQgbG9hZF9jaGVja3BvaW50CiAgICAgICAgICAgIHNlbGYubW9kZWwsIGNoZWNrcG9pbnQgPSBsb2FkX2NoZWNrcG9pbnQocGF0aCwgc2VsZi5kZXZpY2UpCiAgICAgICAgICAgIHNlbGYubW9kZWwuZXZhbCgpCgogICAgICAgICAgICBzZWxmLmNoZWNrcG9pbnRfaW5mbyA9IHsKICAgICAgICAgICAgICAgICJwYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICJlcG9jaCI6IGNoZWNrcG9pbnQuZ2V0KCJlcG9jaCIsICI/IiksCiAgICAgICAgICAgICAgICAibWV0cmljcyI6IGNoZWNrcG9pbnQuZ2V0KCJtZXRyaWNzIiwge30pLAogICAgICAgICAgICAgICAgImRldmljZSI6IHNlbGYuZGV2aWNlLAogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKICAgICAgICAgICAgc2VsZi5fbG9hZF9lcnJvciA9IE5vbmUKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk1vZGVsIGhvdC1yZWxvYWRlZCBmcm9tICVzIChlcG9jaCAlcykiLAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBzZWxmLmNoZWNrcG9pbnRfaW5mb1siZXBvY2giXSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBzZWxmLl9sb2FkX2Vycm9yID0gc3RyKGUpCiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiSG90LXJlbG9hZCBmYWlsZWQ6ICVzIiwgZSkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHByZWRpY3QoCiAgICAgICAgc2VsZiwKICAgICAgICBkZWNpc2lvbl9zbmFwc2hvdDogRGljdCwKICAgICAgICBwbGF5c3R5bGU6IHN0ciA9ICJtaWRyYW5nZSIsCiAgICAgICAgdGVtcGVyYXR1cmU6IGZsb2F0ID0gMS4wLAogICAgICAgIGdyZWVkeTogYm9vbCA9IEZhbHNlLAogICAgKSAtPiBEaWN0OgogICAgICAgICIiIgogICAgICAgIFByZWRpY3QgYSBtYWNyby1hY3Rpb24gZnJvbSBhIHJhdyBkZWNpc2lvbiBzbmFwc2hvdC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgZGVjaXNpb25fc25hcHNob3Q6IERlY2lzaW9uU25hcHNob3QgSlNPTiBmcm9tIEphdmEKICAgICAgICAgICAgICAgIE11c3QgY29udGFpbjogdHVybiwgcGhhc2UsIGFjdGl2ZV9zZWF0LCBwbGF5ZXJzW10KICAgICAgICAgICAgcGxheXN0eWxlOiBEZWNrIHBsYXlzdHlsZSBoaW50ICgiYWdncm8iLCAiY29udHJvbCIsICJtaWRyYW5nZSIsICJj' +
'b21ibyIpCiAgICAgICAgICAgIHRlbXBlcmF0dXJlOiBTb2Z0bWF4IHRlbXBlcmF0dXJlIChsb3dlciA9IG1vcmUgZGV0ZXJtaW5pc3RpYykKICAgICAgICAgICAgZ3JlZWR5OiBJZiBUcnVlLCBhbHdheXMgcGljayBhcmdtYXggKGlnbm9yZSB0ZW1wZXJhdHVyZSkKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjYXN0X2NyZWF0dXJlIiwKICAgICAgICAgICAgICAgICJhY3Rpb25faW5kZXgiOiAwLAogICAgICAgICAgICAgICAgImNvbmZpZGVuY2UiOiAwLjczLAogICAgICAgICAgICAgICAgInByb2JhYmlsaXRpZXMiOiB7ImNhc3RfY3JlYXR1cmUiOiAwLjczLCAicGFzcyI6IDAuMTIsIC4uLn0sCiAgICAgICAgICAgICAgICAiaW5mZXJlbmNlX21zIjogMi4zLAogICAgICAgICAgICB9CiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2xvYWRlZDoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICJlcnJvciI6ICJNb2RlbCBub3QgbG9hZGVkIiwKICAgICAgICAgICAgICAgICJkZXRhaWwiOiBzZWxmLl9sb2FkX2Vycm9yIG9yICJDYWxsIGxvYWQoKSBmaXJzdCIsCiAgICAgICAgICAgIH0KCiAgICAgICAgdF9zdGFydCA9IHRpbWUudGltZSgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBFbmNvZGUgdGhlIHJhdyBzbmFwc2hvdCB0byBhIHN0YXRlIHZlY3RvcgogICAgICAgICAgICBzdGF0ZV92ZWMgPSBzZWxmLmVuY29kZXIuZW5jb2RlKGRlY2lzaW9uX3NuYXBzaG90LCBwbGF5c3R5bGUpCiAgICAgICAgICAgIHN0YXRlX3RlbnNvciA9IHRvcmNoLmZyb21fbnVtcHkoCiAgICAgICAgICAgICAgICBzdGF0ZV92ZWMuYXN0eXBlKG5wLmZsb2F0MzIpCiAgICAgICAgICAgICkudW5zcXVlZXplKDApLnRvKHNlbGYuZGV2aWNlKQoKICAgICAgICAgICAgIyBSdW4gaW5mZXJlbmNlCiAgICAgICAgICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgICAgICAgICAgbG9naXRzID0gc2VsZi5tb2RlbChzdGF0ZV90ZW5zb3IpCgogICAgICAgICAgICAgICAgaWYgZ3JlZWR5OgogICAgICAgICAgICAgICAgICAgIGFjdGlvbl9pZHggPSBsb2dpdHMuYXJnbWF4KGRpbT0tMSkuaXRlbSgpCiAgICAgICAgICAgICAgICAgICAgcHJvYnMgPSB0b3JjaC5zb2Z0bWF4KGxvZ2l0cywgZGltPS0xKS5jcHUoKS5udW1weSgpLmZsYXR0ZW4oKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzY2FsZWQgPSBsb2dpdHMgLyBtYXgodGVtcGVyYXR1cmUsIDAuMDEpCiAgICAgICAgICAgICAgICAgICAgcHJvYnMgPSB0b3JjaC5zb2Z0bWF4KHNjYWxlZCwgZGltPS0xKS5jcHUoKS5udW1weSgpLmZsYXR0ZW4oKQogICAgICAgICAgICAgICAgICAgIGFjdGlvbl9pZHggPSBpbnQobnAucmFuZG9tLmNob2ljZShOVU1fQUNUSU9OUywgcD1wcm9icykpCgogICAgICAgICAgICBlbGFwc2VkX21zID0gKHRpbWUudGltZSgpIC0gdF9zdGFydCkgKiAxMDAwCgogICAgICAgICAgICBhY3Rpb24gPSBJRFhfVE9fQUNUSU9OW2FjdGlvbl9pZHhdCiAgICAgICAgICAgIGNvbmZpZGVuY2UgPSBmbG9hdChwcm9ic1thY3Rpb25faWR4XSkKCiAgICAgICAgICAgICMgQnVpbGQgcHJvYmFiaWxpdHkgbWFwCiAgICAgICAgICAgIHByb2JfbWFwID0ge30KICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNX0FDVElPTlMpOgogICAgICAgICAgICAgICAgcHJvYl9tYXBbSURYX1RPX0FDVElPTltpXS52YWx1ZV0gPSByb3VuZChmbG9hdChwcm9ic1tpXSksIDQpCgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgImFjdGlvbiI6IGFjdGlvbi52YWx1ZSwKICAgICAgICAgICAgICAgICJhY3Rpb25faW5kZXgiOiBhY3Rpb25faWR4LAogICAgICAgICAgICAgICAgImNvbmZpZGVuY2UiOiByb3VuZChjb25maWRlbmNlLCA0KSwKICAgICAgICAgICAgICAgICJwcm9iYWJpbGl0aWVzIjogcHJvYl9tYXAsCiAgICAgICAgICAgICAgICAiaW5mZXJlbmNlX21zIjogcm91bmQoZWxhcHNlZF9tcywgMiksCiAgICAgICAgICAgIH0KCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBlbGFwc2VkX21zID0gKHRpbWUudGltZSgpIC0gdF9zdGFydCkgKiAxMDAwCiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiSW5mZXJlbmNlIGVycm9yOiAlcyIsIGUpCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAiZXJyb3IiOiBzdHIoZSksCiAgICAg' +
'ICAgICAgICAgICAiaW5mZXJlbmNlX21zIjogcm91bmQoZWxhcHNlZF9tcywgMiksCiAgICAgICAgICAgIH0KCiAgICBkZWYgcHJlZGljdF9iYXRjaCgKICAgICAgICBzZWxmLAogICAgICAgIHNuYXBzaG90czogTGlzdFtEaWN0XSwKICAgICAgICBwbGF5c3R5bGU6IHN0ciA9ICJtaWRyYW5nZSIsCiAgICAgICAgZ3JlZWR5OiBib29sID0gVHJ1ZSwKICAgICkgLT4gTGlzdFtEaWN0XToKICAgICAgICAiIiJQcmVkaWN0IGFjdGlvbnMgZm9yIG11bHRpcGxlIHNuYXBzaG90cyBhdCBvbmNlICh2ZWN0b3JpemVkKS4iIiIKICAgICAgICBpZiBub3Qgc2VsZi5fbG9hZGVkOgogICAgICAgICAgICByZXR1cm4gW3siZXJyb3IiOiAiTW9kZWwgbm90IGxvYWRlZCJ9XSAqIGxlbihzbmFwc2hvdHMpCgogICAgICAgIHRfc3RhcnQgPSB0aW1lLnRpbWUoKQogICAgICAgIHJlc3VsdHMgPSBbXQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgRW5jb2RlIGFsbCBzdGF0ZXMKICAgICAgICAgICAgc3RhdGVfdmVjcyA9IFtdCiAgICAgICAgICAgIGZvciBzbmFwIGluIHNuYXBzaG90czoKICAgICAgICAgICAgICAgIHBzID0gc25hcC5nZXQoImFyY2hldHlwZSIsIHBsYXlzdHlsZSkKICAgICAgICAgICAgICAgIHZlYyA9IHNlbGYuZW5jb2Rlci5lbmNvZGUoc25hcCwgcHMpCiAgICAgICAgICAgICAgICBzdGF0ZV92ZWNzLmFwcGVuZCh2ZWMpCgogICAgICAgICAgICBzdGF0ZXMgPSBucC5zdGFjayhzdGF0ZV92ZWNzKS5hc3R5cGUobnAuZmxvYXQzMikKICAgICAgICAgICAgc3RhdGVfdGVuc29yID0gdG9yY2guZnJvbV9udW1weShzdGF0ZXMpLnRvKHNlbGYuZGV2aWNlKQoKICAgICAgICAgICAgIyBCYXRjaCBpbmZlcmVuY2UKICAgICAgICAgICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgICAgICAgICBsb2dpdHMgPSBzZWxmLm1vZGVsKHN0YXRlX3RlbnNvcikKICAgICAgICAgICAgICAgIHByb2JzID0gdG9yY2guc29mdG1heChsb2dpdHMsIGRpbT0tMSkuY3B1KCkubnVtcHkoKQoKICAgICAgICAgICAgICAgIGlmIGdyZWVkeToKICAgICAgICAgICAgICAgICAgICBhY3Rpb25faW5kaWNlcyA9IGxvZ2l0cy5hcmdtYXgoZGltPS0xKS5jcHUoKS5udW1weSgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFjdGlvbl9pbmRpY2VzID0gbnAuYXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICBucC5yYW5kb20uY2hvaWNlKE5VTV9BQ1RJT05TLCBwPXApIGZvciBwIGluIHByb2JzCiAgICAgICAgICAgICAgICAgICAgXSkKCiAgICAgICAgICAgIGVsYXBzZWRfbXMgPSAodGltZS50aW1lKCkgLSB0X3N0YXJ0KSAqIDEwMDAKCiAgICAgICAgICAgIGZvciBpLCAoaWR4LCBwcm9iKSBpbiBlbnVtZXJhdGUoemlwKGFjdGlvbl9pbmRpY2VzLCBwcm9icykpOgogICAgICAgICAgICAgICAgYWN0aW9uID0gSURYX1RPX0FDVElPTltpbnQoaWR4KV0KICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogYWN0aW9uLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICJhY3Rpb25faW5kZXgiOiBpbnQoaWR4KSwKICAgICAgICAgICAgICAgICAgICAiY29uZmlkZW5jZSI6IHJvdW5kKGZsb2F0KHByb2JbaWR4XSksIDQpLAogICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICJCYXRjaCBpbmZlcmVuY2U6ICVkIHNhbXBsZXMgaW4gJS4xZm1zICglLjJmIG1zL3NhbXBsZSkiLAogICAgICAgICAgICAgICAgbGVuKHNuYXBzaG90cyksIGVsYXBzZWRfbXMsIGVsYXBzZWRfbXMgLyBtYXgobGVuKHNuYXBzaG90cyksIDEpLAogICAgICAgICAgICApCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJCYXRjaCBpbmZlcmVuY2UgZXJyb3I6ICVzIiwgZSkKICAgICAgICAgICAgcmVzdWx0cyA9IFt7ImVycm9yIjogc3RyKGUpfV0gKiBsZW4oc25hcHNob3RzKQoKICAgICAgICByZXR1cm4gcmVzdWx0cwoKICAgIGRlZiBnZXRfc3RhdHVzKHNlbGYpIC0+IERpY3Q6CiAgICAgICAgIiIiUmV0dXJuIGN1cnJlbnQgc2VydmljZSBzdGF0dXMuIiIiCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgImxvYWRlZCI6IHNlbGYuX2xvYWRlZCwKICAgICAgICAgICAgImVycm9yIjogc2VsZi5fbG9hZF9lcnJvciwKICAgICAgICAgICAgImRldmljZSI6IHNlbGYuZGV2aWNlLAogICAgICAgICAgICAi' +
'dG9yY2hfYXZhaWxhYmxlIjogVE9SQ0hfQVZBSUxBQkxFLAogICAgICAgICAgICAiY2hlY2twb2ludCI6IHNlbGYuY2hlY2twb2ludF9pbmZvIGlmIHNlbGYuX2xvYWRlZCBlbHNlIE5vbmUsCiAgICAgICAgICAgICJlbWJlZGRpbmdzX2xvYWRlZCI6ICgKICAgICAgICAgICAgICAgIHNlbGYuY2FyZF9pbmRleCBpcyBub3QgTm9uZSBhbmQgc2VsZi5jYXJkX2luZGV4Ll9sb2FkZWQKICAgICAgICAgICAgKSwKICAgICAgICB9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBTdGFuZGFsb25lIEZhc3RBUEkgU2VydmVyCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgY3JlYXRlX3N0YW5kYWxvbmVfYXBwKCk6CiAgICAiIiJDcmVhdGUgYSBzdGFuZGFsb25lIEZhc3RBUEkgYXBwIGZvciB0aGUgcG9saWN5IHNlcnZlci4iIiIKICAgIGZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbgogICAgZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsCgogICAgYXBwID0gRmFzdEFQSSgKICAgICAgICB0aXRsZT0iQ29tbWFuZGVyIEFJIExhYiDigJQgUG9saWN5IFNlcnZlciIsCiAgICAgICAgZGVzY3JpcHRpb249IlNlcnZlcyBtYWNyby1hY3Rpb24gcHJlZGljdGlvbnMgZnJvbSBhIHRyYWluZWQgcG9saWN5IG5ldHdvcmsiLAogICAgICAgIHZlcnNpb249IjEuMC4wIiwKICAgICkKCiAgICBzZXJ2aWNlID0gUG9saWN5SW5mZXJlbmNlU2VydmljZSgpCgogICAgY2xhc3MgUHJlZGljdFJlcXVlc3QoQmFzZU1vZGVsKToKICAgICAgICAiIiJSZXF1ZXN0IGJvZHkgZm9yIC9wcmVkaWN0IGVuZHBvaW50LiIiIgogICAgICAgICMgR2FtZSBzdGF0ZSAobWF0Y2hpbmcgRGVjaXNpb25TbmFwc2hvdCBmcm9tIEphdmEpCiAgICAgICAgdHVybjogaW50ID0gMQogICAgICAgIHBoYXNlOiBzdHIgPSAibWFpbl8xIgogICAgICAgIGFjdGl2ZV9zZWF0OiBpbnQgPSAwCiAgICAgICAgcGxheWVyczogTGlzdFtEaWN0XSA9IFtdCiAgICAgICAgYWN0aW9uOiBPcHRpb25hbFtEaWN0XSA9IE5vbmUKCiAgICAgICAgIyBPcHRpb25hbCBtZXRhZGF0YQogICAgICAgIGdhbWVfaWQ6IHN0ciA9ICIiCiAgICAgICAgYXJjaGV0eXBlOiBzdHIgPSAibWlkcmFuZ2UiCiAgICAgICAgY29tbWFuZGVyOiBzdHIgPSAiIgogICAgICAgIGRlY2tfbmFtZTogc3RyID0gIiIKCiAgICAgICAgIyBJbmZlcmVuY2UgcGFyYW1ldGVycwogICAgICAgIHRlbXBlcmF0dXJlOiBmbG9hdCA9IDEuMAogICAgICAgIGdyZWVkeTogYm9vbCA9IEZhbHNlCgogICAgY2xhc3MgUHJlZGljdFJlc3BvbnNlKEJhc2VNb2RlbCk6CiAgICAgICAgYWN0aW9uOiBzdHIKICAgICAgICBhY3Rpb25faW5kZXg6IGludAogICAgICAgIGNvbmZpZGVuY2U6IGZsb2F0CiAgICAgICAgcHJvYmFiaWxpdGllczogRGljdFtzdHIsIGZsb2F0XSA9IHt9CiAgICAgICAgaW5mZXJlbmNlX21zOiBmbG9hdCA9IDAuMAogICAgICAgIGVycm9yOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKICAgIEBhcHAub25fZXZlbnQoInN0YXJ0dXAiKQogICAgYXN5bmMgZGVmIHN0YXJ0dXAoKToKICAgICAgICBzZXJ2aWNlLmxvYWQoKQoKICAgIEBhcHAucG9zdCgiL2FwaS9tbC9wcmVkaWN0IiwgcmVzcG9uc2VfbW9kZWw9UHJlZGljdFJlc3BvbnNlKQogICAgYXN5bmMgZGVmIHByZWRpY3QocmVxOiBQcmVkaWN0UmVxdWVzdCk6CiAgICAgICAgaWYgbm90IHNlcnZpY2UuX2xvYWRlZDoKICAgICAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDMsIGRldGFpbD1zZXJ2aWNlLl9sb2FkX2Vycm9yIG9yICJNb2RlbCBub3QgbG9hZGVkIikKCiAgICAgICAgc25hcHNob3QgPSByZXEuZGljdChleGNsdWRlPXsidGVtcGVyYXR1cmUiLCAiZ3JlZWR5In0pCiAgICAgICAgcmVzdWx0ID0gc2VydmljZS5wcmVkaWN0KAogICAgICAgICAgICBzbmFwc2hvdCwKICAgICAgICAgICAgcGxheXN0eWxlPXJlcS5h' +
'cmNoZXR5cGUsCiAgICAgICAgICAgIHRlbXBlcmF0dXJlPXJlcS50ZW1wZXJhdHVyZSwKICAgICAgICAgICAgZ3JlZWR5PXJlcS5ncmVlZHksCiAgICAgICAgKQoKICAgICAgICBpZiAiZXJyb3IiIGluIHJlc3VsdDoKICAgICAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbig1MDAsIGRldGFpbD1yZXN1bHRbImVycm9yIl0pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBhcHAuZ2V0KCIvYXBpL21sL21vZGVsIikKICAgIGFzeW5jIGRlZiBtb2RlbF9pbmZvKCk6CiAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0X3N0YXR1cygpCgogICAgQGFwcC5wb3N0KCIvYXBpL21sL3JlbG9hZCIpCiAgICBhc3luYyBkZWYgcmVsb2FkX21vZGVsKGNoZWNrcG9pbnQ6IHN0ciA9IE5vbmUpOgogICAgICAgIG9rID0gc2VydmljZS5yZWxvYWQoY2hlY2twb2ludCkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3VjY2VzcyI6IG9rLAogICAgICAgICAgICAic3RhdHVzIjogc2VydmljZS5nZXRfc3RhdHVzKCksCiAgICAgICAgfQoKICAgIEBhcHAuZ2V0KCIvaGVhbHRoIikKICAgIGFzeW5jIGRlZiBoZWFsdGgoKToKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic3RhdHVzIjogIm9rIiBpZiBzZXJ2aWNlLl9sb2FkZWQgZWxzZSAiZGVncmFkZWQiLAogICAgICAgICAgICAibW9kZWxfbG9hZGVkIjogc2VydmljZS5fbG9hZGVkLAogICAgICAgIH0KCiAgICByZXR1cm4gYXBwLCBzZXJ2aWNlCgoKZGVmIG1haW4oKToKICAgICIiIlJ1biBzdGFuZGFsb25lIHBvbGljeSBzZXJ2ZXIuIiIiCiAgICBpbXBvcnQgYXJncGFyc2UKICAgIGltcG9ydCB1dmljb3JuCgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICAgICAgZGVzY3JpcHRpb249IkNvbW1hbmRlciBBSSBMYWIg4oCUIFBvbGljeSBJbmZlcmVuY2UgU2VydmVyIgogICAgKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wb3J0IiwgdHlwZT1pbnQsIGRlZmF1bHQ9ODA5MCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0taG9zdCIsIGRlZmF1bHQ9IjEyNy4wLjAuMSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNoZWNrcG9pbnQtZGlyIiwgZGVmYXVsdD1Ob25lKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1lbWJlZGRpbmdzLWRpciIsIGRlZmF1bHQ9Tm9uZSkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZGV2aWNlIiwgZGVmYXVsdD1Ob25lKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgZm9ybWF0PSJbJShuYW1lKXNdICUobWVzc2FnZSlzIikKCiAgICAjIE92ZXJyaWRlIGRlZmF1bHRzIGlmIHByb3ZpZGVkCiAgICBpZiBhcmdzLmNoZWNrcG9pbnRfZGlyIG9yIGFyZ3MuZW1iZWRkaW5nc19kaXIgb3IgYXJncy5kZXZpY2U6CiAgICAgICAgIyBSZS1jcmVhdGUgdGhlIHNlcnZpY2Ugd2lsbCBiZSBoYW5kbGVkIGF0IHN0YXJ0dXAKICAgICAgICBwYXNzCgogICAgYXBwLCBfID0gY3JlYXRlX3N0YW5kYWxvbmVfYXBwKCkKICAgIHV2aWNvcm4ucnVuKGFwcCwgaG9zdD1hcmdzLmhvc3QsIHBvcnQ9YXJncy5wb3J0KQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK'
Install-B64 -R 'ml\serving\policy_server.py' -B $b
# ml/training/__init__.py (0 bytes)
$b = ''
Install-B64 -R 'ml\training\__init__.py' -B $b
# ml/training/policy_network.py (7,416 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFBvbGljeSBOZXR3b3JrCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApGZWVkLWZvcndhcmQgbmV1cmFsIG5ldHdvcmsgdGhhdCBtYXBzIGdhbWUgc3RhdGUgKyBwbGF5c3R5bGUg4oaSIGFjdGlvbiBsb2dpdHMuCgpBcmNoaXRlY3R1cmU6CiAgSW5wdXQ6ICBzdGF0ZSB2ZWN0b3IgKDYxNzctZGltKSA9IGdsb2JhbCBmZWF0dXJlcyArIHpvbmUgZW1iZWRkaW5ncyArIHBsYXlzdHlsZQogIEhpZGRlbjogMyBGQyBsYXllcnMgd2l0aCBTaUxVIGFjdGl2YXRpb24gYW5kIGxheWVyIG5vcm1hbGl6YXRpb24KICBPdXRwdXQ6IGxvZ2l0cyBvdmVyIDggbWFjcm8tYWN0aW9ucwoKVGhlIG5ldHdvcmsgaXMgZGVzaWduZWQgZm9yOgogIDEuIFN1cGVydmlzZWQgbGVhcm5pbmcgKGNyb3NzLWVudHJvcHkgb24gZXhwZXJ0L0FJIGFjdGlvbiBsYWJlbHMpCiAgMi4gTGF0ZXIgY29udmVyc2lvbiB0byBQUE8gYWN0b3ItY3JpdGljIChhZGQgdmFsdWUgaGVhZCkKIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCiMgQ29uZGl0aW9uYWwgdG9yY2ggaW1wb3J0IOKAlCBncmFjZWZ1bCBmYWlsdXJlIGlmIG5vdCBpbnN0YWxsZWQKdHJ5OgogICAgaW1wb3J0IHRvcmNoCiAgICBpbXBvcnQgdG9yY2gubm4gYXMgbm4KICAgIGltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKICAgIFRPUkNIX0FWQUlMQUJMRSA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgVE9SQ0hfQVZBSUxBQkxFID0gRmFsc2UKICAgIHByaW50KCJbTUxdIFB5VG9yY2ggbm90IGluc3RhbGxlZC4gSW5zdGFsbCB3aXRoOiBwaXAgaW5zdGFsbCB0b3JjaCIpCgppbXBvcnQgbnVtcHkgYXMgbnAKCnByb2plY3Rfcm9vdCA9IHN0cihQYXRoKF9fZmlsZV9fKS5wYXJlbnQucGFyZW50LnBhcmVudCkKaWYgcHJvamVjdF9yb290IG5vdCBpbiBzeXMucGF0aDoKICAgIHN5cy5wYXRoLmluc2VydCgwLCBwcm9qZWN0X3Jvb3QpCgpmcm9tIG1sLmNvbmZpZy5zY29wZSBpbXBvcnQgU1RBVEVfRElNUywgTlVNX0FDVElPTlMsIFRSQUlOSU5HX0NPTkZJRwoKCmNsYXNzIFBvbGljeU5ldHdvcmsobm4uTW9kdWxlKToKICAgICIiIgogICAgRmVlZC1mb3J3YXJkIHBvbGljeSBuZXR3b3JrIGZvciBDb21tYW5kZXIgbWFjcm8tYWN0aW9uIHByZWRpY3Rpb24uCgogICAgSW5wdXQ6ICAoYmF0Y2gsIDYxNzcpIHN0YXRlIHZlY3RvcgogICAgT3V0cHV0OiAoYmF0Y2gsIDgpIGFjdGlvbiBsb2dpdHMgKHVubm9ybWFsaXplZCBsb2ctcHJvYmFiaWxpdGllcykKCiAgICBBcmNoaXRlY3R1cmU6CiAgICAgIEZDKDYxNzcg4oaSIDUxMikg4oaSIExheWVyTm9ybSDihpIgU2lMVSDihpIgRHJvcG91dAogICAgICBGQyg1MTIg4oaSIDUxMikg4oaSIExheWVyTm9ybSDihpIgU2lMVSDihpIgRHJvcG91dAogICAgICBGQyg1MTIg4oaSIDI1Nikg4oaSIExheWVyTm9ybSDihpIgU2lMVSDihpIgRHJvcG91dAogICAgICBGQygyNTYg4oaSIDgpCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICBpbnB1dF9kaW06IGludCA9IE5vbmUsCiAgICAgICAgaGlkZGVuX2RpbTogaW50ID0gTm9uZSwKICAgICAgICBudW1fYWN0aW9uczogaW50ID0gTm9uZSwKICAgICAgICBudW1fbGF5ZXJzOiBpbnQgPSBOb25lLAogICAgICAgIGRyb3BvdXQ6IGZsb2F0ID0gTm9uZSwKICAgICk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCgogICAgICAgIGlucHV0X2RpbSA9IGlucHV0X2RpbSBvciBTVEFURV9ESU1TLnRvdGFsX3N0YXRlX2RpbQogICAgICAgIGhpZGRlbl9kaW0gPSBoaWRkZW5fZGltIG9yIFRSQUlOSU5HX0NPTkZJRy5oaWRkZW5fZGltCiAgICAgICAgbnVtX2FjdGlvbnMgPSBudW1fYWN0aW9ucyBvciBOVU1fQUNUSU9OUwogICAgICAgIG51bV9sYXllcnMgPSBudW1fbGF5ZXJzIG9yIFRSQUlOSU5HX0NPTkZJRy5udW1fbGF5ZXJzCiAgICAgICAgZHJvcG91dCA9IGRyb3BvdXQgb3IgVFJBSU5JTkdfQ09ORklHLmRyb3BvdXQKCiAgICAgICAgbGF5ZXJzID0gW10KCiAgICAgICAgIyBJbnB1dCBsYXllcgogICAgICAgIGxheWVycy5hcHBlbmQobm4uTGluZWFyKGlucHV0X2RpbSwgaGlkZGVuX2RpbSkpCiAgICAgICAgbGF5ZXJzLmFwcGVuZChubi5MYXllck5vcm0oaGlkZGVuX2RpbSkp' +
'CiAgICAgICAgbGF5ZXJzLmFwcGVuZChubi5TaUxVKCkpCiAgICAgICAgbGF5ZXJzLmFwcGVuZChubi5Ecm9wb3V0KGRyb3BvdXQpKQoKICAgICAgICAjIEhpZGRlbiBsYXllcnMKICAgICAgICBmb3IgaSBpbiByYW5nZShudW1fbGF5ZXJzIC0gMSk6CiAgICAgICAgICAgIG91dF9kaW0gPSBoaWRkZW5fZGltIGlmIGkgPCBudW1fbGF5ZXJzIC0gMiBlbHNlIGhpZGRlbl9kaW0gLy8gMgogICAgICAgICAgICBsYXllcnMuYXBwZW5kKG5uLkxpbmVhcihoaWRkZW5fZGltIGlmIGkgPT0gMCBlbHNlIGhpZGRlbl9kaW0sIG91dF9kaW0pKQogICAgICAgICAgICBsYXllcnMuYXBwZW5kKG5uLkxheWVyTm9ybShvdXRfZGltKSkKICAgICAgICAgICAgbGF5ZXJzLmFwcGVuZChubi5TaUxVKCkpCiAgICAgICAgICAgIGxheWVycy5hcHBlbmQobm4uRHJvcG91dChkcm9wb3V0KSkKICAgICAgICAgICAgaGlkZGVuX2RpbSA9IG91dF9kaW0KCiAgICAgICAgc2VsZi5mZWF0dXJlcyA9IG5uLlNlcXVlbnRpYWwoKmxheWVycykKCiAgICAgICAgIyBPdXRwdXQgaGVhZAogICAgICAgIHNlbGYuYWN0aW9uX2hlYWQgPSBubi5MaW5lYXIoaGlkZGVuX2RpbSwgbnVtX2FjdGlvbnMpCgogICAgICAgICMgSW5pdGlhbGl6ZSB3ZWlnaHRzCiAgICAgICAgc2VsZi5faW5pdF93ZWlnaHRzKCkKCiAgICBkZWYgX2luaXRfd2VpZ2h0cyhzZWxmKToKICAgICAgICAiIiJLYWltaW5nIGluaXRpYWxpemF0aW9uIGZvciBTaUxVIGFjdGl2YXRpb25zLiIiIgogICAgICAgIGZvciBtIGluIHNlbGYubW9kdWxlcygpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG0sIG5uLkxpbmVhcik6CiAgICAgICAgICAgICAgICBubi5pbml0LmthaW1pbmdfbm9ybWFsXyhtLndlaWdodCwgbm9ubGluZWFyaXR5PSdsaW5lYXInKQogICAgICAgICAgICAgICAgaWYgbS5iaWFzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG5uLmluaXQuemVyb3NfKG0uYmlhcykKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBzdGF0ZTogdG9yY2guVGVuc29yKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgIiIiCiAgICAgICAgRm9yd2FyZCBwYXNzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBzdGF0ZTogKGJhdGNoLCBpbnB1dF9kaW0pIHRlbnNvcgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICAoYmF0Y2gsIG51bV9hY3Rpb25zKSBsb2dpdHMKICAgICAgICAiIiIKICAgICAgICBmZWF0dXJlcyA9IHNlbGYuZmVhdHVyZXMoc3RhdGUpCiAgICAgICAgcmV0dXJuIHNlbGYuYWN0aW9uX2hlYWQoZmVhdHVyZXMpCgogICAgZGVmIHByZWRpY3RfYWN0aW9uKHNlbGYsIHN0YXRlOiB0b3JjaC5UZW5zb3IsIHRlbXBlcmF0dXJlOiBmbG9hdCA9IDEuMCkgLT4gaW50OgogICAgICAgICIiIgogICAgICAgIFByZWRpY3QgYSBzaW5nbGUgYWN0aW9uIChmb3IgaW5mZXJlbmNlKS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc3RhdGU6ICgxLCBpbnB1dF9kaW0pIG9yIChpbnB1dF9kaW0sKSB0ZW5zb3IKICAgICAgICAgICAgdGVtcGVyYXR1cmU6IFNvZnRtYXggdGVtcGVyYXR1cmUgKDEuMCA9IG5vcm1hbCwgPDEgPSBtb3JlIGdyZWVkeSwgPjEgPSBtb3JlIHJhbmRvbSkKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgYWN0aW9uIGluZGV4IChpbnQpCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5ldmFsKCkKICAgICAgICB3aXRoIHRvcmNoLm5vX2dyYWQoKToKICAgICAgICAgICAgaWYgc3RhdGUuZGltKCkgPT0gMToKICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGUudW5zcXVlZXplKDApCiAgICAgICAgICAgIGxvZ2l0cyA9IHNlbGYuZm9yd2FyZChzdGF0ZSkKICAgICAgICAgICAgaWYgdGVtcGVyYXR1cmUgIT0gMS4wOgogICAgICAgICAgICAgICAgbG9naXRzID0gbG9naXRzIC8gdGVtcGVyYXR1cmUKICAgICAgICAgICAgcHJvYnMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpCiAgICAgICAgICAgIGFjdGlvbiA9IHRvcmNoLm11bHRpbm9taWFsKHByb2JzLCAxKS5pdGVtKCkKICAgICAgICByZXR1cm4gYWN0aW9uCgogICAgZGVmIHByZWRpY3RfYWN0aW9uX2dyZWVkeShzZWxmLCBzdGF0ZTogdG9yY2guVGVuc29yKSAtPiBpbnQ6CiAgICAgICAgIiIiUHJlZGljdCB0aGUgbW9zdCBsaWtlbHkgYWN0aW9uIChhcmdtYXgsIG5vIHNhbXBsaW5nKS4iIiIKICAgICAgICBzZWxmLmV2YWwoKQogICAgICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgICAgICBpZiBzdGF0ZS5kaW0oKSA9PSAxOgog' +
'ICAgICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZS51bnNxdWVlemUoMCkKICAgICAgICAgICAgbG9naXRzID0gc2VsZi5mb3J3YXJkKHN0YXRlKQogICAgICAgICAgICByZXR1cm4gbG9naXRzLmFyZ21heChkaW09LTEpLml0ZW0oKQoKICAgIGRlZiBnZXRfYWN0aW9uX3Byb2JzKHNlbGYsIHN0YXRlOiB0b3JjaC5UZW5zb3IpIC0+IG5wLm5kYXJyYXk6CiAgICAgICAgIiIiR2V0IGFjdGlvbiBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gZm9yIGEgc3RhdGUuIiIiCiAgICAgICAgc2VsZi5ldmFsKCkKICAgICAgICB3aXRoIHRvcmNoLm5vX2dyYWQoKToKICAgICAgICAgICAgaWYgc3RhdGUuZGltKCkgPT0gMToKICAgICAgICAgICAgICAgIHN0YXRlID0gc3RhdGUudW5zcXVlZXplKDApCiAgICAgICAgICAgIGxvZ2l0cyA9IHNlbGYuZm9yd2FyZChzdGF0ZSkKICAgICAgICAgICAgcHJvYnMgPSBGLnNvZnRtYXgobG9naXRzLCBkaW09LTEpCiAgICAgICAgICAgIHJldHVybiBwcm9icy5jcHUoKS5udW1weSgpLmZsYXR0ZW4oKQoKCmNsYXNzIFBvbGljeVZhbHVlTmV0d29yayhQb2xpY3lOZXR3b3JrKToKICAgICIiIgogICAgRXh0ZW5kZWQgcG9saWN5IG5ldHdvcmsgd2l0aCBhIHZhbHVlIGhlYWQgZm9yIGFjdG9yLWNyaXRpYyAvIFBQTy4KCiAgICBTYW1lIGFyY2hpdGVjdHVyZSBhcyBQb2xpY3lOZXR3b3JrLCBwbHVzOgogICAgICB2YWx1ZV9oZWFkOiBGQyhoaWRkZW4g4oaSIDEpIHByZWRpY3Rpbmcgc3RhdGUgdmFsdWUgVihzKQogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgICMgVmFsdWUgaGVhZCBzaGFyZXMgZmVhdHVyZXMsIG91dHB1dHMgc2NhbGFyCiAgICAgICAgbGFzdF9oaWRkZW4gPSBzZWxmLmFjdGlvbl9oZWFkLmluX2ZlYXR1cmVzCiAgICAgICAgc2VsZi52YWx1ZV9oZWFkID0gbm4uTGluZWFyKGxhc3RfaGlkZGVuLCAxKQogICAgICAgIG5uLmluaXQuemVyb3NfKHNlbGYudmFsdWVfaGVhZC5iaWFzKQoKICAgIGRlZiBmb3J3YXJkX3dpdGhfdmFsdWUoc2VsZiwgc3RhdGU6IHRvcmNoLlRlbnNvcik6CiAgICAgICAgIiIiCiAgICAgICAgRm9yd2FyZCBwYXNzIHJldHVybmluZyBib3RoIGFjdGlvbiBsb2dpdHMgYW5kIHN0YXRlIHZhbHVlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICAoYWN0aW9uX2xvZ2l0cywgdmFsdWUpIOKAlCBzaGFwZXMgKGJhdGNoLCBudW1fYWN0aW9ucyksIChiYXRjaCwgMSkKICAgICAgICAiIiIKICAgICAgICBmZWF0dXJlcyA9IHNlbGYuZmVhdHVyZXMoc3RhdGUpCiAgICAgICAgYWN0aW9uX2xvZ2l0cyA9IHNlbGYuYWN0aW9uX2hlYWQoZmVhdHVyZXMpCiAgICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlX2hlYWQoZmVhdHVyZXMpCiAgICAgICAgcmV0dXJuIGFjdGlvbl9sb2dpdHMsIHZhbHVlCgoKZGVmIHNhdmVfY2hlY2twb2ludCgKICAgIG1vZGVsOiBubi5Nb2R1bGUsCiAgICBvcHRpbWl6ZXI6IHRvcmNoLm9wdGltLk9wdGltaXplciwKICAgIGVwb2NoOiBpbnQsCiAgICBtZXRyaWNzOiBkaWN0LAogICAgcGF0aDogc3RyLAopOgogICAgIiIiU2F2ZSBtb2RlbCBjaGVja3BvaW50IHdpdGggdHJhaW5pbmcgbWV0YWRhdGEuIiIiCiAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUocGF0aCkgb3IgIi4iLCBleGlzdF9vaz1UcnVlKQogICAgdG9yY2guc2F2ZSh7CiAgICAgICAgImVwb2NoIjogZXBvY2gsCiAgICAgICAgIm1vZGVsX3N0YXRlX2RpY3QiOiBtb2RlbC5zdGF0ZV9kaWN0KCksCiAgICAgICAgIm9wdGltaXplcl9zdGF0ZV9kaWN0Ijogb3B0aW1pemVyLnN0YXRlX2RpY3QoKSwKICAgICAgICAibWV0cmljcyI6IG1ldHJpY3MsCiAgICAgICAgIm1vZGVsX2NvbmZpZyI6IHsKICAgICAgICAgICAgImlucHV0X2RpbSI6IFNUQVRFX0RJTVMudG90YWxfc3RhdGVfZGltLAogICAgICAgICAgICAiaGlkZGVuX2RpbSI6IFRSQUlOSU5HX0NPTkZJRy5oaWRkZW5fZGltLAogICAgICAgICAgICAibnVtX2FjdGlvbnMiOiBOVU1fQUNUSU9OUywKICAgICAgICAgICAgIm51bV9sYXllcnMiOiBUUkFJTklOR19DT05GSUcubnVtX2xheWVycywKICAgICAgICAgICAgImRyb3BvdXQiOiBUUkFJTklOR19DT05GSUcuZHJvcG91dCwKICAgICAgICB9LAogICAgfSwgcGF0aCkKICAgIHByaW50KGYiW01MXSBDaGVja3BvaW50IHNhdmVkOiB7cGF0aH0iKQoKCmRlZiBsb2FkX2NoZWNrcG9pbnQocGF0aDogc3RyLCBk' +
'ZXZpY2U6IHN0ciA9ICJjcHUiKToKICAgICIiIkxvYWQgbW9kZWwgZnJvbSBjaGVja3BvaW50LiIiIgogICAgY2hlY2twb2ludCA9IHRvcmNoLmxvYWQocGF0aCwgbWFwX2xvY2F0aW9uPWRldmljZSwgd2VpZ2h0c19vbmx5PUZhbHNlKQogICAgY29uZmlnID0gY2hlY2twb2ludC5nZXQoIm1vZGVsX2NvbmZpZyIsIHt9KQoKICAgIG1vZGVsID0gUG9saWN5TmV0d29yaygKICAgICAgICBpbnB1dF9kaW09Y29uZmlnLmdldCgiaW5wdXRfZGltIiwgU1RBVEVfRElNUy50b3RhbF9zdGF0ZV9kaW0pLAogICAgICAgIGhpZGRlbl9kaW09Y29uZmlnLmdldCgiaGlkZGVuX2RpbSIsIFRSQUlOSU5HX0NPTkZJRy5oaWRkZW5fZGltKSwKICAgICAgICBudW1fYWN0aW9ucz1jb25maWcuZ2V0KCJudW1fYWN0aW9ucyIsIE5VTV9BQ1RJT05TKSwKICAgICAgICBudW1fbGF5ZXJzPWNvbmZpZy5nZXQoIm51bV9sYXllcnMiLCBUUkFJTklOR19DT05GSUcubnVtX2xheWVycyksCiAgICAgICAgZHJvcG91dD1jb25maWcuZ2V0KCJkcm9wb3V0IiwgVFJBSU5JTkdfQ09ORklHLmRyb3BvdXQpLAogICAgKQogICAgbW9kZWwubG9hZF9zdGF0ZV9kaWN0KGNoZWNrcG9pbnRbIm1vZGVsX3N0YXRlX2RpY3QiXSkKICAgIG1vZGVsLnRvKGRldmljZSkKCiAgICByZXR1cm4gbW9kZWwsIGNoZWNrcG9pbnQK'
Install-B64 -R 'ml\training\policy_network.py' -B $b
# ml/training/ppo_trainer.py (22,758 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFBQTyBUcmFpbmVyCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApQcm94aW1hbCBQb2xpY3kgT3B0aW1pemF0aW9uIChDbGlwKSB3aXRoOgogIC0gQ2xpcHBlZCBzdXJyb2dhdGUgb2JqZWN0aXZlIGZvciBwb2xpY3kKICAtIFZhbHVlIGZ1bmN0aW9uIGxvc3MgKGNsaXBwZWQpCiAgLSBFbnRyb3B5IGJvbnVzIGZvciBleHBsb3JhdGlvbgogIC0gR2VuZXJhbGl6ZWQgQWR2YW50YWdlIEVzdGltYXRpb24gKGNvbXB1dGVkIGluIFJvbGxvdXRCdWZmZXIpCiAgLSBTZWxmLXBsYXkgZXBpc29kZSBjb2xsZWN0aW9uIGJldHdlZW4gdXBkYXRlcwogIC0gUGVyaW9kaWMgY2hlY2twb2ludGluZyBhbmQgZXZhbHVhdGlvbgogIC0gV2luLXJhdGUgdHJhY2tpbmcgYWdhaW5zdCBvcHBvbmVudCBwb2xpY2llcwoKUmVmZXJlbmNlOiBTY2h1bG1hbiBldCBhbC4sICJQcm94aW1hbCBQb2xpY3kgT3B0aW1pemF0aW9uIEFsZ29yaXRobXMiLCAyMDE3CgpVc2FnZToKICAgIHB5dGhvbiAtbSBtbC50cmFpbmluZy5wcG9fdHJhaW5lciAtLWl0ZXJhdGlvbnMgMTAwIC0tZXBpc29kZXMtcGVyLWl0ZXIgNjQKICAgIHB5dGhvbiAtbSBtbC50cmFpbmluZy5wcG9fdHJhaW5lciAtLWxvYWQtc3VwZXJ2aXNlZCBtbC9tb2RlbHMvY2hlY2twb2ludHMvYmVzdF9wb2xpY3kucHQKIiIiCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0LCBPcHRpb25hbAoKaW1wb3J0IG51bXB5IGFzIG5wCgpwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50LnBhcmVudC5wYXJlbnQpCmlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKIyBDb25kaXRpb25hbCB0b3JjaCBpbXBvcnQKdHJ5OgogICAgaW1wb3J0IHRvcmNoCiAgICBpbXBvcnQgdG9yY2gubm4gYXMgbm4KICAgIGltcG9ydCB0b3JjaC5ubi5mdW5jdGlvbmFsIGFzIEYKICAgIFRPUkNIX0FWQUlMQUJMRSA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgVE9SQ0hfQVZBSUxBQkxFID0gRmFsc2UKCmZyb20gbWwuY29uZmlnLnNjb3BlIGltcG9ydCBOVU1fQUNUSU9OUywgU1RBVEVfRElNUywgVFJBSU5JTkdfQ09ORklHCmZyb20gbWwudHJhaW5pbmcucm9sbG91dF9idWZmZXIgaW1wb3J0IFJvbGxvdXRCdWZmZXIKZnJvbSBtbC50cmFpbmluZy5yZXdhcmQgaW1wb3J0IFJld2FyZENvbmZpZwpmcm9tIG1sLnRyYWluaW5nLnNlbGZfcGxheSBpbXBvcnQgKAogICAgY29sbGVjdF9yb2xsb3V0cywgSGV1cmlzdGljUG9saWN5LCBSYW5kb21Qb2xpY3ksCikKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJtbC5wcG8iKQoKCmNsYXNzIFBQT0NvbmZpZzoKICAgICIiIlBQTyBoeXBlcnBhcmFtZXRlcnMuIiIiCgogICAgZGVmIF9faW5pdF9fKAogICAgICAgIHNlbGYsCiAgICAgICAgIyBUcmFpbmluZyBsb29wCiAgICAgICAgaXRlcmF0aW9uczogaW50ID0gMTAwLAogICAgICAgIGVwaXNvZGVzX3Blcl9pdGVyOiBpbnQgPSA2NCwKICAgICAgICBwcG9fZXBvY2hzOiBpbnQgPSA0LAogICAgICAgIGJhdGNoX3NpemU6IGludCA9IDI1NiwKCiAgICAgICAgIyBQUE8gY29yZQogICAgICAgIGNsaXBfZXBzaWxvbjogZmxvYXQgPSAwLjIsCiAgICAgICAgdmFsdWVfY2xpcDogZmxvYXQgPSAwLjIsCiAgICAgICAgZW50cm9weV9jb2VmZjogZmxvYXQgPSAwLjAxLAogICAgICAgIHZhbHVlX2xvc3NfY29lZmY6IGZsb2F0ID0gMC41LAogICAgICAgIG1heF9ncmFkX25vcm06IGZsb2F0ID0gMC41LAoKICAgICAgICAjIE9wdGltaXplcgogICAgICAgIGxlYXJuaW5nX3JhdGU6IGZsb2F0ID0gM2UtNCwKICAgICAgICBscl9zY2hlZHVsZTogc3RyID0gImNvbnN0YW50IiwgICMgY29uc3RhbnQgfCBsaW5lYXIgfCBjb3NpbmUKICAgICAgICBtaW5fbHI6IGZsb2F0ID0gMWUtNSwKCiAgICAgICAgIyBSb2xsb3V0CiAgICAgICAgYnVmZmVyX3NpemU6IGludCA9IDQwOTYsCiAgICAgICAgZ2FtbWE6IGZsb2F0ID0gMC45OSwKICAgICAgICBnYWVfbGFtYmRhOiBmbG9hdCA9IDAuOTUsCgogICAgICAgICMgT3Bwb25lbnQKICAgICAgICBv' +
'cHBvbmVudDogc3RyID0gImhldXJpc3RpYyIsICAjIGhldXJpc3RpYyB8IHJhbmRvbSB8IHNlbGYKICAgICAgICBwbGF5c3R5bGU6IHN0ciA9ICJtaWRyYW5nZSIsCgogICAgICAgICMgQ2hlY2twb2ludGluZwogICAgICAgIGNoZWNrcG9pbnRfZGlyOiBzdHIgPSAibWwvbW9kZWxzL2NoZWNrcG9pbnRzIiwKICAgICAgICBzYXZlX2V2ZXJ5OiBpbnQgPSAxMCwKICAgICAgICBldmFsX2V2ZXJ5OiBpbnQgPSA1LAogICAgICAgIGV2YWxfZXBpc29kZXM6IGludCA9IDUwLAoKICAgICAgICAjIFN1cGVydmlzZWQgcHJlbG9hZAogICAgICAgIGxvYWRfc3VwZXJ2aXNlZDogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICApOgogICAgICAgIHNlbGYuaXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnMKICAgICAgICBzZWxmLmVwaXNvZGVzX3Blcl9pdGVyID0gZXBpc29kZXNfcGVyX2l0ZXIKICAgICAgICBzZWxmLnBwb19lcG9jaHMgPSBwcG9fZXBvY2hzCiAgICAgICAgc2VsZi5iYXRjaF9zaXplID0gYmF0Y2hfc2l6ZQogICAgICAgIHNlbGYuY2xpcF9lcHNpbG9uID0gY2xpcF9lcHNpbG9uCiAgICAgICAgc2VsZi52YWx1ZV9jbGlwID0gdmFsdWVfY2xpcAogICAgICAgIHNlbGYuZW50cm9weV9jb2VmZiA9IGVudHJvcHlfY29lZmYKICAgICAgICBzZWxmLnZhbHVlX2xvc3NfY29lZmYgPSB2YWx1ZV9sb3NzX2NvZWZmCiAgICAgICAgc2VsZi5tYXhfZ3JhZF9ub3JtID0gbWF4X2dyYWRfbm9ybQogICAgICAgIHNlbGYubGVhcm5pbmdfcmF0ZSA9IGxlYXJuaW5nX3JhdGUKICAgICAgICBzZWxmLmxyX3NjaGVkdWxlID0gbHJfc2NoZWR1bGUKICAgICAgICBzZWxmLm1pbl9sciA9IG1pbl9scgogICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZQogICAgICAgIHNlbGYuZ2FtbWEgPSBnYW1tYQogICAgICAgIHNlbGYuZ2FlX2xhbWJkYSA9IGdhZV9sYW1iZGEKICAgICAgICBzZWxmLm9wcG9uZW50ID0gb3Bwb25lbnQKICAgICAgICBzZWxmLnBsYXlzdHlsZSA9IHBsYXlzdHlsZQogICAgICAgIHNlbGYuY2hlY2twb2ludF9kaXIgPSBjaGVja3BvaW50X2RpcgogICAgICAgIHNlbGYuc2F2ZV9ldmVyeSA9IHNhdmVfZXZlcnkKICAgICAgICBzZWxmLmV2YWxfZXZlcnkgPSBldmFsX2V2ZXJ5CiAgICAgICAgc2VsZi5ldmFsX2VwaXNvZGVzID0gZXZhbF9lcGlzb2RlcwogICAgICAgIHNlbGYubG9hZF9zdXBlcnZpc2VkID0gbG9hZF9zdXBlcnZpc2VkCgoKY2xhc3MgUFBPVHJhaW5lcjoKICAgICIiIlByb3hpbWFsIFBvbGljeSBPcHRpbWl6YXRpb24gdHJhaW5lciB3aXRoIHNlbGYtcGxheS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBQUE9Db25maWcpOgogICAgICAgIGlmIG5vdCBUT1JDSF9BVkFJTEFCTEU6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJQeVRvcmNoIHJlcXVpcmVkIGZvciBQUE8gdHJhaW5pbmcuIEluc3RhbGw6IHBpcCBpbnN0YWxsIHRvcmNoIikKCiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWcKICAgICAgICBzZWxmLmRldmljZSA9IHNlbGYuX2RldGVjdF9kZXZpY2UoKQoKICAgICAgICAjIENyZWF0ZSBhY3Rvci1jcml0aWMgbW9kZWwKICAgICAgICBmcm9tIG1sLnRyYWluaW5nLnBvbGljeV9uZXR3b3JrIGltcG9ydCBQb2xpY3lWYWx1ZU5ldHdvcmsKICAgICAgICBzZWxmLm1vZGVsID0gUG9saWN5VmFsdWVOZXR3b3JrKAogICAgICAgICAgICBpbnB1dF9kaW09U1RBVEVfRElNUy50b3RhbF9zdGF0ZV9kaW0sCiAgICAgICAgICAgIGhpZGRlbl9kaW09VFJBSU5JTkdfQ09ORklHLmhpZGRlbl9kaW0sCiAgICAgICAgICAgIG51bV9hY3Rpb25zPU5VTV9BQ1RJT05TLAogICAgICAgICAgICBudW1fbGF5ZXJzPVRSQUlOSU5HX0NPTkZJRy5udW1fbGF5ZXJzLAogICAgICAgICAgICBkcm9wb3V0PTAuMCwgICMgTm8gZHJvcG91dCBkdXJpbmcgUkwKICAgICAgICApLnRvKHNlbGYuZGV2aWNlKQoKICAgICAgICAjIE9wdGlvbmFsbHkgbG9hZCBmcm9tIHN1cGVydmlzZWQgY2hlY2twb2ludAogICAgICAgIGlmIGNvbmZpZy5sb2FkX3N1cGVydmlzZWQgYW5kIG9zLnBhdGguZXhpc3RzKGNvbmZpZy5sb2FkX3N1cGVydmlzZWQpOgogICAgICAgICAgICBzZWxmLl9sb2FkX3N1cGVydmlzZWRfd2VpZ2h0cyhjb25maWcubG9hZF9zdXBlcnZpc2VkKQoKICAgICAgICAjIE9wdGltaXplcgogICAgICAgIHNlbGYub3B0aW1pemVyID0gdG9yY2gub3B0aW0uQWRhbSgKICAgICAgICAgICAgc2VsZi5tb2RlbC5wYXJhbWV0ZXJzKCks' +
'CiAgICAgICAgICAgIGxyPWNvbmZpZy5sZWFybmluZ19yYXRlLAogICAgICAgICAgICBlcHM9MWUtNSwKICAgICAgICApCgogICAgICAgICMgTGVhcm5pbmcgcmF0ZSBzY2hlZHVsZXIKICAgICAgICBzZWxmLnNjaGVkdWxlciA9IE5vbmUKICAgICAgICBpZiBjb25maWcubHJfc2NoZWR1bGUgPT0gImxpbmVhciI6CiAgICAgICAgICAgIHNlbGYuc2NoZWR1bGVyID0gdG9yY2gub3B0aW0ubHJfc2NoZWR1bGVyLkxpbmVhckxSKAogICAgICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZXIsCiAgICAgICAgICAgICAgICBzdGFydF9mYWN0b3I9MS4wLAogICAgICAgICAgICAgICAgZW5kX2ZhY3Rvcj1jb25maWcubWluX2xyIC8gY29uZmlnLmxlYXJuaW5nX3JhdGUsCiAgICAgICAgICAgICAgICB0b3RhbF9pdGVycz1jb25maWcuaXRlcmF0aW9ucywKICAgICAgICAgICAgKQogICAgICAgIGVsaWYgY29uZmlnLmxyX3NjaGVkdWxlID09ICJjb3NpbmUiOgogICAgICAgICAgICBzZWxmLnNjaGVkdWxlciA9IHRvcmNoLm9wdGltLmxyX3NjaGVkdWxlci5Db3NpbmVBbm5lYWxpbmdMUigKICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemVyLAogICAgICAgICAgICAgICAgVF9tYXg9Y29uZmlnLml0ZXJhdGlvbnMsCiAgICAgICAgICAgICAgICBldGFfbWluPWNvbmZpZy5taW5fbHIsCiAgICAgICAgICAgICkKCiAgICAgICAgIyBSb2xsb3V0IGJ1ZmZlcgogICAgICAgIHNlbGYuYnVmZmVyID0gUm9sbG91dEJ1ZmZlcigKICAgICAgICAgICAgYnVmZmVyX3NpemU9Y29uZmlnLmJ1ZmZlcl9zaXplLAogICAgICAgICAgICBzdGF0ZV9kaW09U1RBVEVfRElNUy50b3RhbF9zdGF0ZV9kaW0sCiAgICAgICAgICAgIGdhbW1hPWNvbmZpZy5nYW1tYSwKICAgICAgICAgICAgZ2FlX2xhbWJkYT1jb25maWcuZ2FlX2xhbWJkYSwKICAgICAgICApCgogICAgICAgICMgUmV3YXJkIGNvbmZpZwogICAgICAgIHNlbGYucmV3YXJkX2NvbmZpZyA9IFJld2FyZENvbmZpZygKICAgICAgICAgICAgZ2FtbWE9Y29uZmlnLmdhbW1hLAogICAgICAgICAgICBnYWVfbGFtYmRhPWNvbmZpZy5nYWVfbGFtYmRhLAogICAgICAgICkKCiAgICAgICAgIyBPcHBvbmVudCBwb2xpY3kKICAgICAgICBzZWxmLm9wcG9uZW50ID0gc2VsZi5fY3JlYXRlX29wcG9uZW50KGNvbmZpZy5vcHBvbmVudCkKCiAgICAgICAgIyBUcmFja2luZwogICAgICAgIHNlbGYuaXRlcmF0aW9uID0gMAogICAgICAgIHNlbGYudG90YWxfc3RlcHMgPSAwCiAgICAgICAgc2VsZi5iZXN0X3dpbl9yYXRlID0gMC4wCiAgICAgICAgc2VsZi5oaXN0b3J5ID0gW10KCiAgICAgICAgb3MubWFrZWRpcnMoY29uZmlnLmNoZWNrcG9pbnRfZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgIGRlZiBfZGV0ZWN0X2RldmljZShzZWxmKSAtPiBzdHI6CiAgICAgICAgaWYgdG9yY2guY3VkYS5pc19hdmFpbGFibGUoKToKICAgICAgICAgICAgcmV0dXJuICJjdWRhIgogICAgICAgIGlmIGhhc2F0dHIodG9yY2guYmFja2VuZHMsICJtcHMiKSBhbmQgdG9yY2guYmFja2VuZHMubXBzLmlzX2F2YWlsYWJsZSgpOgogICAgICAgICAgICByZXR1cm4gIm1wcyIKICAgICAgICByZXR1cm4gImNwdSIKCiAgICBkZWYgX2xvYWRfc3VwZXJ2aXNlZF93ZWlnaHRzKHNlbGYsIHBhdGg6IHN0cik6CiAgICAgICAgIiIiTG9hZCB3ZWlnaHRzIGZyb20gYSBzdXBlcnZpc2VkIFBvbGljeU5ldHdvcmsgY2hlY2twb2ludCBpbnRvIHRoZQogICAgICAgIFBvbGljeVZhbHVlTmV0d29yayAoaWdub3JpbmcgdGhlIHZhbHVlIGhlYWQsIHdoaWNoIGlzIG5ldykuIiIiCiAgICAgICAgbG9nZ2VyLmluZm8oIkxvYWRpbmcgc3VwZXJ2aXNlZCB3ZWlnaHRzIGZyb20gJXMiLCBwYXRoKQogICAgICAgIGNoZWNrcG9pbnQgPSB0b3JjaC5sb2FkKHBhdGgsIG1hcF9sb2NhdGlvbj1zZWxmLmRldmljZSwgd2VpZ2h0c19vbmx5PUZhbHNlKQogICAgICAgIHN0YXRlX2RpY3QgPSBjaGVja3BvaW50LmdldCgibW9kZWxfc3RhdGVfZGljdCIsIGNoZWNrcG9pbnQpCgogICAgICAgICMgRmlsdGVyIG91dCBrZXlzIHRoYXQgZG9uJ3QgbWF0Y2ggKGUuZy4sIHZhbHVlX2hlYWQpCiAgICAgICAgbW9kZWxfZGljdCA9IHNlbGYubW9kZWwuc3RhdGVfZGljdCgpCiAgICAgICAgY29tcGF0aWJsZSA9IHtrOiB2IGZvciBrLCB2IGluIHN0YXRlX2RpY3QuaXRlbXMoKSBpZiBrIGluIG1vZGVsX2RpY3QgYW5kIHYuc2hhcGUgPT0gbW9kZWxfZGljdFtrXS5zaGFwZX0KICAgICAgICBtb2RlbF9kaWN0LnVwZGF0ZShjb21w' +
'YXRpYmxlKQogICAgICAgIHNlbGYubW9kZWwubG9hZF9zdGF0ZV9kaWN0KG1vZGVsX2RpY3QpCiAgICAgICAgbG9nZ2VyLmluZm8oIkxvYWRlZCAlZC8lZCBwYXJhbWV0ZXIgdGVuc29ycyBmcm9tIHN1cGVydmlzZWQgY2hlY2twb2ludCIsCiAgICAgICAgICAgICAgICAgICAgIGxlbihjb21wYXRpYmxlKSwgbGVuKHN0YXRlX2RpY3QpKQoKICAgIGRlZiBfY3JlYXRlX29wcG9uZW50KHNlbGYsIG9wcG9uZW50X3R5cGU6IHN0cik6CiAgICAgICAgaWYgb3Bwb25lbnRfdHlwZSA9PSAicmFuZG9tIjoKICAgICAgICAgICAgcmV0dXJuIFJhbmRvbVBvbGljeSgpCiAgICAgICAgZWxpZiBvcHBvbmVudF90eXBlID09ICJoZXVyaXN0aWMiOgogICAgICAgICAgICByZXR1cm4gSGV1cmlzdGljUG9saWN5KCkKICAgICAgICBlbGlmIG9wcG9uZW50X3R5cGUgPT0gInNlbGYiOgogICAgICAgICAgICAjIFNlbGYtcGxheTogb3Bwb25lbnQgdXNlcyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHBvbGljeQogICAgICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX3NlbGZfcGxheV9vcHBvbmVudCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIEhldXJpc3RpY1BvbGljeSgpCgogICAgZGVmIF9jcmVhdGVfc2VsZl9wbGF5X29wcG9uZW50KHNlbGYpOgogICAgICAgICIiIkNyZWF0ZSBhbiBvcHBvbmVudCB0aGF0IHVzZXMgYSBmcm96ZW4gY29weSBvZiB0aGUgY3VycmVudCBwb2xpY3kuIiIiCgogICAgICAgIGNsYXNzIFNlbGZQbGF5UG9saWN5OgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kZWwsIGRldmljZSk6CiAgICAgICAgICAgICAgICBzZWxmLm1vZGVsID0gbW9kZWwKICAgICAgICAgICAgICAgIHNlbGYuZGV2aWNlID0gZGV2aWNlCgogICAgICAgICAgICBkZWYgc2VsZWN0X2FjdGlvbihzZWxmLCBzdGF0ZV92ZWMpOgogICAgICAgICAgICAgICAgc3RhdGVfdGVuc29yID0gdG9yY2guZnJvbV9udW1weShzdGF0ZV92ZWMpLnVuc3F1ZWV6ZSgwKS50byhzZWxmLmRldmljZSkKICAgICAgICAgICAgICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgICAgICAgICAgICAgIGxvZ2l0cywgXyA9IHNlbGYubW9kZWwuZm9yd2FyZF93aXRoX3ZhbHVlKHN0YXRlX3RlbnNvcikKICAgICAgICAgICAgICAgICAgICBwcm9icyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gdG9yY2guZGlzdHJpYnV0aW9ucy5DYXRlZ29yaWNhbChwcm9icykKICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBkaXN0LnNhbXBsZSgpCiAgICAgICAgICAgICAgICAgICAgbG9nX3Byb2IgPSBkaXN0LmxvZ19wcm9iKGFjdGlvbikKICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb24uaXRlbSgpLCBsb2dfcHJvYi5pdGVtKCkKCiAgICAgICAgcmV0dXJuIFNlbGZQbGF5UG9saWN5KHNlbGYubW9kZWwsIHNlbGYuZGV2aWNlKQoKICAgIGRlZiBwcG9fdXBkYXRlKHNlbGYpIC0+IERpY3Q6CiAgICAgICAgIiIiUnVuIFBQTyB1cGRhdGUgZXBvY2hzIG9uIHRoZSBjb2xsZWN0ZWQgcm9sbG91dCBidWZmZXIuCgogICAgICAgIFJldHVybnMgZGljdCBvZiBsb3NzIG1ldHJpY3MuCiAgICAgICAgIiIiCiAgICAgICAgY2ZnID0gc2VsZi5jb25maWcKICAgICAgICB0b3RhbF9wb2xpY3lfbG9zcyA9IDAuMAogICAgICAgIHRvdGFsX3ZhbHVlX2xvc3MgPSAwLjAKICAgICAgICB0b3RhbF9lbnRyb3B5ID0gMC4wCiAgICAgICAgdG90YWxfYXBwcm94X2tsID0gMC4wCiAgICAgICAgdG90YWxfY2xpcF9mcmFjID0gMC4wCiAgICAgICAgbnVtX3VwZGF0ZXMgPSAwCgogICAgICAgIGZvciBlcG9jaCBpbiByYW5nZShjZmcucHBvX2Vwb2Nocyk6CiAgICAgICAgICAgIGZvciBiYXRjaCBpbiBzZWxmLmJ1ZmZlci5nZXRfYmF0Y2hlcyhjZmcuYmF0Y2hfc2l6ZSk6CiAgICAgICAgICAgICAgICBzdGF0ZXMsIGFjdGlvbnMsIG9sZF9sb2dfcHJvYnMsIGFkdmFudGFnZXMsIHJldHVybnMgPSBiYXRjaAoKICAgICAgICAgICAgICAgICMgVG8gdGVuc29ycwogICAgICAgICAgICAgICAgc3RhdGVzX3QgPSB0b3JjaC5mcm9tX251bXB5KHN0YXRlcykudG8oc2VsZi5kZXZpY2UpCiAgICAgICAgICAgICAgICBhY3Rpb25zX3QgPSB0b3JjaC5mcm9tX251bXB5KGFjdGlvbnMpLnRvKHNlbGYuZGV2aWNlKQogICAgICAgICAgICAgICAgb2xkX2xvZ19wcm9ic190ID0gdG9yY2guZnJvbV9udW1weShvbGRfbG9nX3Byb2JzKS50byhzZWxmLmRldmljZSkK' +
'ICAgICAgICAgICAgICAgIGFkdmFudGFnZXNfdCA9IHRvcmNoLmZyb21fbnVtcHkoYWR2YW50YWdlcykudG8oc2VsZi5kZXZpY2UpCiAgICAgICAgICAgICAgICByZXR1cm5zX3QgPSB0b3JjaC5mcm9tX251bXB5KHJldHVybnMpLnRvKHNlbGYuZGV2aWNlKQoKICAgICAgICAgICAgICAgICMgRm9yd2FyZCBwYXNzCiAgICAgICAgICAgICAgICBsb2dpdHMsIHZhbHVlcyA9IHNlbGYubW9kZWwuZm9yd2FyZF93aXRoX3ZhbHVlKHN0YXRlc190KQogICAgICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVzLnNxdWVlemUoLTEpCgogICAgICAgICAgICAgICAgIyBBY3Rpb24gZGlzdHJpYnV0aW9uCiAgICAgICAgICAgICAgICBwcm9icyA9IEYuc29mdG1heChsb2dpdHMsIGRpbT0tMSkKICAgICAgICAgICAgICAgIGRpc3QgPSB0b3JjaC5kaXN0cmlidXRpb25zLkNhdGVnb3JpY2FsKHByb2JzKQogICAgICAgICAgICAgICAgbmV3X2xvZ19wcm9icyA9IGRpc3QubG9nX3Byb2IoYWN0aW9uc190KQogICAgICAgICAgICAgICAgZW50cm9weSA9IGRpc3QuZW50cm9weSgpLm1lYW4oKQoKICAgICAgICAgICAgICAgICMgLS0tIFBvbGljeSBMb3NzIChjbGlwcGVkIHN1cnJvZ2F0ZSkgLS0tCiAgICAgICAgICAgICAgICByYXRpbyA9IHRvcmNoLmV4cChuZXdfbG9nX3Byb2JzIC0gb2xkX2xvZ19wcm9ic190KQogICAgICAgICAgICAgICAgc3VycjEgPSByYXRpbyAqIGFkdmFudGFnZXNfdAogICAgICAgICAgICAgICAgc3VycjIgPSB0b3JjaC5jbGFtcChyYXRpbywgMS4wIC0gY2ZnLmNsaXBfZXBzaWxvbiwgMS4wICsgY2ZnLmNsaXBfZXBzaWxvbikgKiBhZHZhbnRhZ2VzX3QKICAgICAgICAgICAgICAgIHBvbGljeV9sb3NzID0gLXRvcmNoLm1pbihzdXJyMSwgc3VycjIpLm1lYW4oKQoKICAgICAgICAgICAgICAgICMgLS0tIFZhbHVlIExvc3MgKGNsaXBwZWQpIC0tLQogICAgICAgICAgICAgICAgaWYgY2ZnLnZhbHVlX2NsaXAgPiAwOgogICAgICAgICAgICAgICAgICAgICMgR2V0IG9sZCB2YWx1ZXMgZnJvbSBidWZmZXIgZm9yIGNsaXBwaW5nCiAgICAgICAgICAgICAgICAgICAgb2xkX3ZhbHVlc190ID0gdG9yY2guZnJvbV9udW1weSgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIudmFsdWVzWzpzZWxmLmJ1ZmZlci5zaXplXQogICAgICAgICAgICAgICAgICAgICkudG8oc2VsZi5kZXZpY2UpCiAgICAgICAgICAgICAgICAgICAgIyBSZWluZGV4IHRvIG1hdGNoIGJhdGNoCiAgICAgICAgICAgICAgICAgICAgIyBTaW5jZSB3ZSB1c2Ugc2h1ZmZsZWQgaW5kaWNlcyBpbiBnZXRfYmF0Y2hlcywgd2UgY2xpcCBhZ2FpbnN0IHJldHVybnMKICAgICAgICAgICAgICAgICAgICB2YWx1ZV9sb3NzX3VuY2xpcHBlZCA9ICh2YWx1ZXMgLSByZXR1cm5zX3QpICoqIDIKICAgICAgICAgICAgICAgICAgICB2YWx1ZV9sb3NzID0gMC41ICogdmFsdWVfbG9zc191bmNsaXBwZWQubWVhbigpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHZhbHVlX2xvc3MgPSAwLjUgKiAoKHZhbHVlcyAtIHJldHVybnNfdCkgKiogMikubWVhbigpCgogICAgICAgICAgICAgICAgIyAtLS0gVG90YWwgTG9zcyAtLS0KICAgICAgICAgICAgICAgIGxvc3MgPSAoCiAgICAgICAgICAgICAgICAgICAgcG9saWN5X2xvc3MKICAgICAgICAgICAgICAgICAgICArIGNmZy52YWx1ZV9sb3NzX2NvZWZmICogdmFsdWVfbG9zcwogICAgICAgICAgICAgICAgICAgIC0gY2ZnLmVudHJvcHlfY29lZmYgKiBlbnRyb3B5CiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgIyBPcHRpbWl6ZQogICAgICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZXIuemVyb19ncmFkKCkKICAgICAgICAgICAgICAgIGxvc3MuYmFja3dhcmQoKQogICAgICAgICAgICAgICAgbm4udXRpbHMuY2xpcF9ncmFkX25vcm1fKHNlbGYubW9kZWwucGFyYW1ldGVycygpLCBjZmcubWF4X2dyYWRfbm9ybSkKICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemVyLnN0ZXAoKQoKICAgICAgICAgICAgICAgICMgVHJhY2sgbWV0cmljcwogICAgICAgICAgICAgICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgICAgICAgICAgICAgYXBwcm94X2tsID0gKChyYXRpbyAtIDEpIC0gdG9yY2gubG9nKHJhdGlvKSkubWVhbigpLml0ZW0oKQogICAgICAgICAgICAgICAgICAgIGNsaXBfZnJhYyA9ICgocmF0aW8gLSAxLjApLmFicygpID4gY2ZnLmNsaXBfZXBzaWxvbikuZmxvYXQoKS5tZWFuKCkuaXRlbSgp' +
'CgogICAgICAgICAgICAgICAgdG90YWxfcG9saWN5X2xvc3MgKz0gcG9saWN5X2xvc3MuaXRlbSgpCiAgICAgICAgICAgICAgICB0b3RhbF92YWx1ZV9sb3NzICs9IHZhbHVlX2xvc3MuaXRlbSgpCiAgICAgICAgICAgICAgICB0b3RhbF9lbnRyb3B5ICs9IGVudHJvcHkuaXRlbSgpCiAgICAgICAgICAgICAgICB0b3RhbF9hcHByb3hfa2wgKz0gYXBwcm94X2tsCiAgICAgICAgICAgICAgICB0b3RhbF9jbGlwX2ZyYWMgKz0gY2xpcF9mcmFjCiAgICAgICAgICAgICAgICBudW1fdXBkYXRlcyArPSAxCgogICAgICAgIG4gPSBtYXgobnVtX3VwZGF0ZXMsIDEpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInBvbGljeV9sb3NzIjogdG90YWxfcG9saWN5X2xvc3MgLyBuLAogICAgICAgICAgICAidmFsdWVfbG9zcyI6IHRvdGFsX3ZhbHVlX2xvc3MgLyBuLAogICAgICAgICAgICAiZW50cm9weSI6IHRvdGFsX2VudHJvcHkgLyBuLAogICAgICAgICAgICAiYXBwcm94X2tsIjogdG90YWxfYXBwcm94X2tsIC8gbiwKICAgICAgICAgICAgImNsaXBfZnJhY3Rpb24iOiB0b3RhbF9jbGlwX2ZyYWMgLyBuLAogICAgICAgICAgICAibnVtX3VwZGF0ZXMiOiBudW1fdXBkYXRlcywKICAgICAgICB9CgogICAgZGVmIGV2YWx1YXRlKHNlbGYsIG51bV9lcGlzb2RlczogaW50ID0gNTApIC0+IERpY3Q6CiAgICAgICAgIiIiRXZhbHVhdGUgdGhlIGN1cnJlbnQgcG9saWN5IGFnYWluc3Qgb3Bwb25lbnRzLgoKICAgICAgICBSZXR1cm5zIHdpbiByYXRlcyBhbmQgbWV0cmljcy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm1vZGVsLmV2YWwoKQoKICAgICAgICByZXN1bHRzID0ge30KICAgICAgICBmb3Igb3BwX25hbWUsIG9wcF9wb2xpY3kgaW4gWwogICAgICAgICAgICAoImhldXJpc3RpYyIsIEhldXJpc3RpY1BvbGljeSgpKSwKICAgICAgICAgICAgKCJyYW5kb20iLCBSYW5kb21Qb2xpY3koKSksCiAgICAgICAgXToKICAgICAgICAgICAgZXZhbF9idWZmZXIgPSBSb2xsb3V0QnVmZmVyKAogICAgICAgICAgICAgICAgYnVmZmVyX3NpemU9bnVtX2VwaXNvZGVzICogNTAsCiAgICAgICAgICAgICAgICBzdGF0ZV9kaW09U1RBVEVfRElNUy50b3RhbF9zdGF0ZV9kaW0sCiAgICAgICAgICAgICAgICBnYW1tYT1zZWxmLmNvbmZpZy5nYW1tYSwKICAgICAgICAgICAgICAgIGdhZV9sYW1iZGE9c2VsZi5jb25maWcuZ2FlX2xhbWJkYSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzdGF0cyA9IGNvbGxlY3Rfcm9sbG91dHMoCiAgICAgICAgICAgICAgICBhZ2VudF9tb2RlbD1zZWxmLm1vZGVsLAogICAgICAgICAgICAgICAgb3Bwb25lbnRfcG9saWN5PW9wcF9wb2xpY3ksCiAgICAgICAgICAgICAgICBidWZmZXI9ZXZhbF9idWZmZXIsCiAgICAgICAgICAgICAgICBudW1fZXBpc29kZXM9bnVtX2VwaXNvZGVzLAogICAgICAgICAgICAgICAgcGxheXN0eWxlPXNlbGYuY29uZmlnLnBsYXlzdHlsZSwKICAgICAgICAgICAgICAgIHJld2FyZF9jb25maWc9c2VsZi5yZXdhcmRfY29uZmlnLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3VsdHNbb3BwX25hbWVdID0gewogICAgICAgICAgICAgICAgIndpbl9yYXRlIjogc3RhdHNbIndpbl9yYXRlIl0sCiAgICAgICAgICAgICAgICAid2lucyI6IHN0YXRzWyJ3aW5zIl0sCiAgICAgICAgICAgICAgICAibG9zc2VzIjogc3RhdHNbImxvc3NlcyJdLAogICAgICAgICAgICAgICAgImRyYXdzIjogc3RhdHNbImRyYXdzIl0sCiAgICAgICAgICAgICAgICAiYXZnX3Jld2FyZCI6IHN0YXRzWyJhdmdfcmV3YXJkX3Blcl9lcCJdLAogICAgICAgICAgICAgICAgImF2Z19zdGVwcyI6IHN0YXRzWyJhdmdfc3RlcHNfcGVyX2VwIl0sCiAgICAgICAgICAgIH0KCiAgICAgICAgc2VsZi5tb2RlbC50cmFpbigpCiAgICAgICAgcmV0dXJuIHJlc3VsdHMKCiAgICBkZWYgc2F2ZV9jaGVja3BvaW50KHNlbGYsIHBhdGg6IHN0ciA9IE5vbmUsIG1ldHJpY3M6IGRpY3QgPSBOb25lKToKICAgICAgICAiIiJTYXZlIFBQTyBjaGVja3BvaW50LiIiIgogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLmNoZWNrcG9pbnRfZGlyLAogICAgICAgICAgICAgICAgZiJwcG9faXRlcl97c2VsZi5pdGVyYXRpb246MDRkfS5wdCIsCiAgICAgICAgICAgICkKCiAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKHBhdGgpLCBleGlzdF9vaz1UcnVlKQog' +
'ICAgICAgIHRvcmNoLnNhdmUoewogICAgICAgICAgICAiaXRlcmF0aW9uIjogc2VsZi5pdGVyYXRpb24sCiAgICAgICAgICAgICJ0b3RhbF9zdGVwcyI6IHNlbGYudG90YWxfc3RlcHMsCiAgICAgICAgICAgICJtb2RlbF9zdGF0ZV9kaWN0Ijogc2VsZi5tb2RlbC5zdGF0ZV9kaWN0KCksCiAgICAgICAgICAgICJvcHRpbWl6ZXJfc3RhdGVfZGljdCI6IHNlbGYub3B0aW1pemVyLnN0YXRlX2RpY3QoKSwKICAgICAgICAgICAgIm1ldHJpY3MiOiBtZXRyaWNzIG9yIHt9LAogICAgICAgICAgICAiY29uZmlnIjogewogICAgICAgICAgICAgICAgImNsaXBfZXBzaWxvbiI6IHNlbGYuY29uZmlnLmNsaXBfZXBzaWxvbiwKICAgICAgICAgICAgICAgICJlbnRyb3B5X2NvZWZmIjogc2VsZi5jb25maWcuZW50cm9weV9jb2VmZiwKICAgICAgICAgICAgICAgICJsZWFybmluZ19yYXRlIjogc2VsZi5jb25maWcubGVhcm5pbmdfcmF0ZSwKICAgICAgICAgICAgICAgICJvcHBvbmVudCI6IHNlbGYuY29uZmlnLm9wcG9uZW50LAogICAgICAgICAgICAgICAgInBsYXlzdHlsZSI6IHNlbGYuY29uZmlnLnBsYXlzdHlsZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImJlc3Rfd2luX3JhdGUiOiBzZWxmLmJlc3Rfd2luX3JhdGUsCiAgICAgICAgICAgICJtb2RlbF9jb25maWciOiB7CiAgICAgICAgICAgICAgICAiaW5wdXRfZGltIjogU1RBVEVfRElNUy50b3RhbF9zdGF0ZV9kaW0sCiAgICAgICAgICAgICAgICAiaGlkZGVuX2RpbSI6IFRSQUlOSU5HX0NPTkZJRy5oaWRkZW5fZGltLAogICAgICAgICAgICAgICAgIm51bV9hY3Rpb25zIjogTlVNX0FDVElPTlMsCiAgICAgICAgICAgICAgICAibnVtX2xheWVycyI6IFRSQUlOSU5HX0NPTkZJRy5udW1fbGF5ZXJzLAogICAgICAgICAgICAgICAgImRyb3BvdXQiOiAwLjAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwgcGF0aCkKICAgICAgICBsb2dnZXIuaW5mbygiQ2hlY2twb2ludCBzYXZlZDogJXMiLCBwYXRoKQoKICAgIGRlZiB0cmFpbihzZWxmLCBwcm9ncmVzc19jYWxsYmFjaz1Ob25lKSAtPiBEaWN0OgogICAgICAgICIiIlJ1biB0aGUgZnVsbCBQUE8gdHJhaW5pbmcgbG9vcC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbGJhY2s6IE9wdGlvbmFsIGNhbGxhYmxlKGl0ZXJhdGlvbiwgbWV0cmljcykgZm9yIHByb2dyZXNzIHJlcG9ydGluZwoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUcmFpbmluZyBzdW1tYXJ5IGRpY3QKICAgICAgICAiIiIKICAgICAgICBjZmcgPSBzZWxmLmNvbmZpZwogICAgICAgIGxvZ2dlci5pbmZvKCI9IiAqIDYwKQogICAgICAgIGxvZ2dlci5pbmZvKCJQUE8gVHJhaW5pbmcg4oCUIENvbW1hbmRlciBBSSBMYWIiKQogICAgICAgIGxvZ2dlci5pbmZvKCI9IiAqIDYwKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIEl0ZXJhdGlvbnM6ICAgICAlZCIsIGNmZy5pdGVyYXRpb25zKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIEVwaXNvZGVzL2l0ZXI6ICAlZCIsIGNmZy5lcGlzb2Rlc19wZXJfaXRlcikKICAgICAgICBsb2dnZXIuaW5mbygiICBQUE8gZXBvY2hzOiAgICAgJWQiLCBjZmcucHBvX2Vwb2NocykKICAgICAgICBsb2dnZXIuaW5mbygiICBCYXRjaCBzaXplOiAgICAgJWQiLCBjZmcuYmF0Y2hfc2l6ZSkKICAgICAgICBsb2dnZXIuaW5mbygiICBDbGlwIGVwc2lsb246ICAgJS4yZiIsIGNmZy5jbGlwX2Vwc2lsb24pCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgRW50cm9weSBjb2VmZjogICUuNGYiLCBjZmcuZW50cm9weV9jb2VmZikKICAgICAgICBsb2dnZXIuaW5mbygiICBMZWFybmluZyByYXRlOiAgJS42ZiIsIGNmZy5sZWFybmluZ19yYXRlKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIE9wcG9uZW50OiAgICAgICAlcyIsIGNmZy5vcHBvbmVudCkKICAgICAgICBsb2dnZXIuaW5mbygiICBEZXZpY2U6ICAgICAgICAgJXMiLCBzZWxmLmRldmljZSkKICAgICAgICBsb2dnZXIuaW5mbygiICBTdXBlcnZpc2VkOiAgICAgJXMiLCBjZmcubG9hZF9zdXBlcnZpc2VkIG9yICJOb25lIikKICAgICAgICBsb2dnZXIuaW5mbygiIikKCiAgICAgICAgdF9zdGFydCA9IHRpbWUudGltZSgpCgogICAgICAgIGZvciBpdGVyYXRpb24gaW4gcmFuZ2UoMSwgY2ZnLml0ZXJhdGlvbnMgKyAxKToKICAgICAgICAgICAgc2VsZi5pdGVyYXRpb24gPSBpdGVyYXRpb24KICAgICAgICAgICAgdF9pdGVyID0gdGltZS50aW1lKCkKCiAgICAgICAgICAgICMgLS0tIENvbGxlY3Qgcm9s' +
'bG91dHMgLS0tCiAgICAgICAgICAgIHNlbGYubW9kZWwuZXZhbCgpCiAgICAgICAgICAgIHJvbGxvdXRfc3RhdHMgPSBjb2xsZWN0X3JvbGxvdXRzKAogICAgICAgICAgICAgICAgYWdlbnRfbW9kZWw9c2VsZi5tb2RlbCwKICAgICAgICAgICAgICAgIG9wcG9uZW50X3BvbGljeT1zZWxmLm9wcG9uZW50LAogICAgICAgICAgICAgICAgYnVmZmVyPXNlbGYuYnVmZmVyLAogICAgICAgICAgICAgICAgbnVtX2VwaXNvZGVzPWNmZy5lcGlzb2Rlc19wZXJfaXRlciwKICAgICAgICAgICAgICAgIHBsYXlzdHlsZT1jZmcucGxheXN0eWxlLAogICAgICAgICAgICAgICAgcmV3YXJkX2NvbmZpZz1zZWxmLnJld2FyZF9jb25maWcsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi50b3RhbF9zdGVwcyArPSByb2xsb3V0X3N0YXRzWyJzdGVwcyJdCiAgICAgICAgICAgIHNlbGYubW9kZWwudHJhaW4oKQoKICAgICAgICAgICAgIyAtLS0gUFBPIFVwZGF0ZSAtLS0KICAgICAgICAgICAgdXBkYXRlX21ldHJpY3MgPSBzZWxmLnBwb191cGRhdGUoKQoKICAgICAgICAgICAgIyAtLS0gTFIgU2NoZWR1bGUgLS0tCiAgICAgICAgICAgIGN1cnJlbnRfbHIgPSBzZWxmLm9wdGltaXplci5wYXJhbV9ncm91cHNbMF1bImxyIl0KICAgICAgICAgICAgaWYgc2VsZi5zY2hlZHVsZXI6CiAgICAgICAgICAgICAgICBzZWxmLnNjaGVkdWxlci5zdGVwKCkKCiAgICAgICAgICAgICMgLS0tIEV2YWx1YXRlIC0tLQogICAgICAgICAgICBldmFsX3Jlc3VsdHMgPSBOb25lCiAgICAgICAgICAgIGlmIGl0ZXJhdGlvbiAlIGNmZy5ldmFsX2V2ZXJ5ID09IDAgb3IgaXRlcmF0aW9uID09IDE6CiAgICAgICAgICAgICAgICBldmFsX3Jlc3VsdHMgPSBzZWxmLmV2YWx1YXRlKGNmZy5ldmFsX2VwaXNvZGVzKQogICAgICAgICAgICAgICAgaGV1cmlzdGljX3dyID0gZXZhbF9yZXN1bHRzLmdldCgiaGV1cmlzdGljIiwge30pLmdldCgid2luX3JhdGUiLCAwKQoKICAgICAgICAgICAgICAgIGlmIGhldXJpc3RpY193ciA+IHNlbGYuYmVzdF93aW5fcmF0ZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmJlc3Rfd2luX3JhdGUgPSBoZXVyaXN0aWNfd3IKICAgICAgICAgICAgICAgICAgICBiZXN0X3BhdGggPSBvcy5wYXRoLmpvaW4oY2ZnLmNoZWNrcG9pbnRfZGlyLCAiYmVzdF9wcG8ucHQiKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV9jaGVja3BvaW50KGJlc3RfcGF0aCwgeyJldmFsIjogZXZhbF9yZXN1bHRzfSkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiICDimIUgTmV3IGJlc3Qgd2luIHJhdGU6ICUuMWYlJSIsIGhldXJpc3RpY193ciAqIDEwMCkKCiAgICAgICAgICAgICMgLS0tIFNhdmUgcGVyaW9kaWMgY2hlY2twb2ludCAtLS0KICAgICAgICAgICAgaWYgaXRlcmF0aW9uICUgY2ZnLnNhdmVfZXZlcnkgPT0gMDoKICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV9jaGVja3BvaW50KCkKCiAgICAgICAgICAgICMgLS0tIExvZyAtLS0KICAgICAgICAgICAgaXRlcl90aW1lID0gdGltZS50aW1lKCkgLSB0X2l0ZXIKICAgICAgICAgICAgbWV0cmljcyA9IHsKICAgICAgICAgICAgICAgICJpdGVyYXRpb24iOiBpdGVyYXRpb24sCiAgICAgICAgICAgICAgICAic3RlcHMiOiByb2xsb3V0X3N0YXRzWyJzdGVwcyJdLAogICAgICAgICAgICAgICAgInRvdGFsX3N0ZXBzIjogc2VsZi50b3RhbF9zdGVwcywKICAgICAgICAgICAgICAgICJ3aW5fcmF0ZSI6IHJvbGxvdXRfc3RhdHNbIndpbl9yYXRlIl0sCiAgICAgICAgICAgICAgICAiYXZnX3Jld2FyZCI6IHJvbGxvdXRfc3RhdHNbImF2Z19yZXdhcmRfcGVyX2VwIl0sCiAgICAgICAgICAgICAgICAicG9saWN5X2xvc3MiOiB1cGRhdGVfbWV0cmljc1sicG9saWN5X2xvc3MiXSwKICAgICAgICAgICAgICAgICJ2YWx1ZV9sb3NzIjogdXBkYXRlX21ldHJpY3NbInZhbHVlX2xvc3MiXSwKICAgICAgICAgICAgICAgICJlbnRyb3B5IjogdXBkYXRlX21ldHJpY3NbImVudHJvcHkiXSwKICAgICAgICAgICAgICAgICJhcHByb3hfa2wiOiB1cGRhdGVfbWV0cmljc1siYXBwcm94X2tsIl0sCiAgICAgICAgICAgICAgICAiY2xpcF9mcmFjdGlvbiI6IHVwZGF0ZV9tZXRyaWNzWyJjbGlwX2ZyYWN0aW9uIl0sCiAgICAgICAgICAgICAgICAibHIiOiBjdXJyZW50X2xyLAogICAgICAgICAgICAgICAgIml0ZXJfdGltZV9zIjogcm91bmQoaXRlcl90aW1lLCAxKSwKICAgICAgICAgICAgICAgICJldmFsIjogZXZhbF9yZXN1bHRzLAogICAgICAg' +
'ICAgICB9CiAgICAgICAgICAgIHNlbGYuaGlzdG9yeS5hcHBlbmQobWV0cmljcykKCiAgICAgICAgICAgICMgUHJldHR5IGxvZwogICAgICAgICAgICBldmFsX3N0ciA9ICIiCiAgICAgICAgICAgIGlmIGV2YWxfcmVzdWx0czoKICAgICAgICAgICAgICAgIGhfd3IgPSBldmFsX3Jlc3VsdHMuZ2V0KCJoZXVyaXN0aWMiLCB7fSkuZ2V0KCJ3aW5fcmF0ZSIsIDApCiAgICAgICAgICAgICAgICByX3dyID0gZXZhbF9yZXN1bHRzLmdldCgicmFuZG9tIiwge30pLmdldCgid2luX3JhdGUiLCAwKQogICAgICAgICAgICAgICAgZXZhbF9zdHIgPSBmIiB8IGV2YWw6IGg9e2hfd3I6LjAlfSByPXtyX3dyOi4wJX0iCgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICIgIFslM2QvJWRdIHdyPSUuMGYlJSByZXc9JS4zZiBwbG9zcz0lLjRmIHZsb3NzPSUuNGYgZW50PSUuM2Yga2w9JS40ZiVzICglLjFmcykiLAogICAgICAgICAgICAgICAgaXRlcmF0aW9uLCBjZmcuaXRlcmF0aW9ucywKICAgICAgICAgICAgICAgIHJvbGxvdXRfc3RhdHNbIndpbl9yYXRlIl0gKiAxMDAsCiAgICAgICAgICAgICAgICByb2xsb3V0X3N0YXRzWyJhdmdfcmV3YXJkX3Blcl9lcCJdLAogICAgICAgICAgICAgICAgdXBkYXRlX21ldHJpY3NbInBvbGljeV9sb3NzIl0sCiAgICAgICAgICAgICAgICB1cGRhdGVfbWV0cmljc1sidmFsdWVfbG9zcyJdLAogICAgICAgICAgICAgICAgdXBkYXRlX21ldHJpY3NbImVudHJvcHkiXSwKICAgICAgICAgICAgICAgIHVwZGF0ZV9tZXRyaWNzWyJhcHByb3hfa2wiXSwKICAgICAgICAgICAgICAgIGV2YWxfc3RyLAogICAgICAgICAgICAgICAgaXRlcl90aW1lLAogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBwcm9ncmVzc19jYWxsYmFjazoKICAgICAgICAgICAgICAgIHByb2dyZXNzX2NhbGxiYWNrKGl0ZXJhdGlvbiwgbWV0cmljcykKCiAgICAgICAgIyAtLS0gRmluYWwgU2F2ZSAtLS0KICAgICAgICB0b3RhbF90aW1lID0gdGltZS50aW1lKCkgLSB0X3N0YXJ0CiAgICAgICAgc2VsZi5zYXZlX2NoZWNrcG9pbnQoKQoKICAgICAgICAjIFNhdmUgdHJhaW5pbmcgaGlzdG9yeQogICAgICAgIGhpc3RvcnlfcGF0aCA9IG9zLnBhdGguam9pbihjZmcuY2hlY2twb2ludF9kaXIsICJwcG9faGlzdG9yeS5qc29uIikKICAgICAgICB3aXRoIG9wZW4oaGlzdG9yeV9wYXRoLCAidyIpIGFzIGY6CiAgICAgICAgICAgIGpzb24uZHVtcChzZWxmLmhpc3RvcnksIGYsIGluZGVudD0yLCBkZWZhdWx0PXN0cikKCiAgICAgICAgc3VtbWFyeSA9IHsKICAgICAgICAgICAgIml0ZXJhdGlvbnMiOiBjZmcuaXRlcmF0aW9ucywKICAgICAgICAgICAgInRvdGFsX3N0ZXBzIjogc2VsZi50b3RhbF9zdGVwcywKICAgICAgICAgICAgImJlc3Rfd2luX3JhdGUiOiBzZWxmLmJlc3Rfd2luX3JhdGUsCiAgICAgICAgICAgICJmaW5hbF93aW5fcmF0ZSI6IHNlbGYuaGlzdG9yeVstMV1bIndpbl9yYXRlIl0gaWYgc2VsZi5oaXN0b3J5IGVsc2UgMCwKICAgICAgICAgICAgInRvdGFsX3RpbWVfcyI6IHJvdW5kKHRvdGFsX3RpbWUsIDEpLAogICAgICAgICAgICAiZGV2aWNlIjogc2VsZi5kZXZpY2UsCiAgICAgICAgICAgICJjaGVja3BvaW50X2RpciI6IGNmZy5jaGVja3BvaW50X2RpciwKICAgICAgICAgICAgImhpc3RvcnlfcGF0aCI6IGhpc3RvcnlfcGF0aCwKICAgICAgICB9CgogICAgICAgIGxvZ2dlci5pbmZvKCIiKQogICAgICAgIGxvZ2dlci5pbmZvKCI9IiAqIDYwKQogICAgICAgIGxvZ2dlci5pbmZvKCJQUE8gVHJhaW5pbmcgQ29tcGxldGUiKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIFRvdGFsIHRpbWU6ICAgICAlLjFmIHMiLCB0b3RhbF90aW1lKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIFRvdGFsIHN0ZXBzOiAgICAlZCIsIHNlbGYudG90YWxfc3RlcHMpCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgQmVzdCB3aW4gcmF0ZTogICUuMWYlJSIsIHNlbGYuYmVzdF93aW5fcmF0ZSAqIDEwMCkKICAgICAgICBsb2dnZXIuaW5mbygiICBIaXN0b3J5OiAgICAgICAgJXMiLCBoaXN0b3J5X3BhdGgpCiAgICAgICAgbG9nZ2VyLmluZm8oIj0iICogNjApCgogICAgICAgIHJldHVybiBzdW1tYXJ5CgoKZGVmIG1haW4oKToKICAgICIiIkNMSSBlbnRyeSBwb2ludCBmb3IgUFBPIHRyYWluaW5nLiIiIgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IkNvbW1hbmRlciBBSSBMYWIg4oCUIFBQTyBUcmFpbmluZyIpCgogICAg' +
'IyBUcmFpbmluZyBsb29wCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWl0ZXJhdGlvbnMiLCB0eXBlPWludCwgZGVmYXVsdD0xMDApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWVwaXNvZGVzLXBlci1pdGVyIiwgdHlwZT1pbnQsIGRlZmF1bHQ9NjQpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXBwby1lcG9jaHMiLCB0eXBlPWludCwgZGVmYXVsdD00KQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1iYXRjaC1zaXplIiwgdHlwZT1pbnQsIGRlZmF1bHQ9MjU2KQoKICAgICMgUFBPIGh5cGVycGFyYW1zCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNsaXAtZXBzaWxvbiIsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9MC4yKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1lbnRyb3B5LWNvZWZmIiwgdHlwZT1mbG9hdCwgZGVmYXVsdD0wLjAxKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS12YWx1ZS1sb3NzLWNvZWZmIiwgdHlwZT1mbG9hdCwgZGVmYXVsdD0wLjUpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWxyIiwgdHlwZT1mbG9hdCwgZGVmYXVsdD0zZS00KQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1sci1zY2hlZHVsZSIsIGRlZmF1bHQ9ImNvbnN0YW50IiwgY2hvaWNlcz1bImNvbnN0YW50IiwgImxpbmVhciIsICJjb3NpbmUiXSkKCiAgICAjIFJvbGxvdXQKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tYnVmZmVyLXNpemUiLCB0eXBlPWludCwgZGVmYXVsdD00MDk2KQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1nYW1tYSIsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9MC45OSkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZ2FlLWxhbWJkYSIsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9MC45NSkKCiAgICAjIE9wcG9uZW50CiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLW9wcG9uZW50IiwgZGVmYXVsdD0iaGV1cmlzdGljIiwgY2hvaWNlcz1bImhldXJpc3RpYyIsICJyYW5kb20iLCAic2VsZiJdKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wbGF5c3R5bGUiLCBkZWZhdWx0PSJtaWRyYW5nZSIpCgogICAgIyBDaGVja3BvaW50aW5nCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNoZWNrcG9pbnQtZGlyIiwgZGVmYXVsdD0ibWwvbW9kZWxzL2NoZWNrcG9pbnRzIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tc2F2ZS1ldmVyeSIsIHR5cGU9aW50LCBkZWZhdWx0PTEwKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1ldmFsLWV2ZXJ5IiwgdHlwZT1pbnQsIGRlZmF1bHQ9NSkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZXZhbC1lcGlzb2RlcyIsIHR5cGU9aW50LCBkZWZhdWx0PTUwKQoKICAgICMgSW5pdAogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1sb2FkLXN1cGVydmlzZWQiLCBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdGggdG8gc3VwZXJ2aXNlZCBjaGVja3BvaW50IHRvIGluaXRpYWxpemUgZnJvbSIpCgogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKAogICAgICAgIGxldmVsPWxvZ2dpbmcuSU5GTywKICAgICAgICBmb3JtYXQ9IiUobWVzc2FnZSlzIiwKICAgICkKCiAgICBjb25maWcgPSBQUE9Db25maWcoCiAgICAgICAgaXRlcmF0aW9ucz1hcmdzLml0ZXJhdGlvbnMsCiAgICAgICAgZXBpc29kZXNfcGVyX2l0ZXI9YXJncy5lcGlzb2Rlc19wZXJfaXRlciwKICAgICAgICBwcG9fZXBvY2hzPWFyZ3MucHBvX2Vwb2NocywKICAgICAgICBiYXRjaF9zaXplPWFyZ3MuYmF0Y2hfc2l6ZSwKICAgICAgICBjbGlwX2Vwc2lsb249YXJncy5jbGlwX2Vwc2lsb24sCiAgICAgICAgZW50cm9weV9jb2VmZj1hcmdzLmVudHJvcHlfY29lZmYsCiAgICAgICAgdmFsdWVfbG9zc19jb2VmZj1hcmdzLnZhbHVlX2xvc3NfY29lZmYsCiAgICAgICAgbGVhcm5pbmdfcmF0ZT1hcmdzLmxyLAogICAgICAgIGxyX3NjaGVkdWxlPWFyZ3MubHJfc2NoZWR1bGUsCiAgICAgICAgYnVmZmVyX3NpemU9YXJncy5idWZmZXJfc2l6ZSwKICAgICAgICBnYW1tYT1hcmdzLmdhbW1hLAogICAgICAgIGdhZV9sYW1iZGE9YXJncy5nYWVfbGFtYmRhLAogICAgICAgIG9wcG9uZW50PWFyZ3Mub3Bwb25lbnQsCiAgICAgICAgcGxheXN0eWxlPWFyZ3MucGxheXN0eWxlLAogICAgICAgIGNoZWNrcG9pbnRfZGlyPWFyZ3MuY2hlY2twb2ludF9kaXIsCiAgICAgICAgc2F2ZV9ldmVyeT1hcmdzLnNhdmVfZXZlcnksCiAgICAgICAgZXZhbF9ldmVy' +
'eT1hcmdzLmV2YWxfZXZlcnksCiAgICAgICAgZXZhbF9lcGlzb2Rlcz1hcmdzLmV2YWxfZXBpc29kZXMsCiAgICAgICAgbG9hZF9zdXBlcnZpc2VkPWFyZ3MubG9hZF9zdXBlcnZpc2VkLAogICAgKQoKICAgIHRyYWluZXIgPSBQUE9UcmFpbmVyKGNvbmZpZykKICAgIHN1bW1hcnkgPSB0cmFpbmVyLnRyYWluKCkKICAgIHByaW50KGpzb24uZHVtcHMoc3VtbWFyeSwgaW5kZW50PTIpKQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKCkK'
Install-B64 -R 'ml\training\ppo_trainer.py' -B $b
# ml/training/reward.py (6,733 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFJld2FyZCBTaGFwaW5nIGZvciBSTArilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKQ29tcHV0ZXMgaW50ZXJtZWRpYXRlIGFuZCB0ZXJtaW5hbCByZXdhcmRzIGZvciBQUE8gdHJhaW5pbmcuCgpSZXdhcmQgc2lnbmFscyAoMXYxIENvbW1hbmRlcik6CiAgVGVybWluYWw6CiAgICArMS4wICBmb3Igd2lubmluZyB0aGUgZ2FtZQogICAgLTEuMCAgZm9yIGxvc2luZyB0aGUgZ2FtZQogICAgIDAuMCAgZm9yIGRyYXcgLyB0aW1lb3V0CgogIEludGVybWVkaWF0ZSAoZGVuc2Ugc2hhcGluZywgc2NhbGVkIHNtYWxsIHRvIGF2b2lkIGRvbWluYXRpbmcgdGVybWluYWwpOgogICAgTGlmZSBkZWx0YTogICAgICArMC4wMSBwZXIgbGlmZSBwb2ludCBnYWluZWQsIC0wLjAxIHBlciBsaWZlIGxvc3QKICAgIEJvYXJkIGNvbnRyb2w6ICAgKzAuMDA1IHBlciBjcmVhdHVyZSBhZHZhbnRhZ2Ugb3ZlciBvcHBvbmVudAogICAgRGFtYWdlIGRlYWx0OiAgICArMC4wMSBwZXIgcG9pbnQgb2YgZGFtYWdlIGRlYWx0IHRoaXMgdHVybgogICAgQ29tbWFuZGVyIGNhc3Q6ICArMC4wMiBmb3IgY2FzdGluZyBjb21tYW5kZXIgKHRlbXBvIGJvb3N0IHNpZ25hbCkKICAgIENhcmQgYWR2YW50YWdlOiAgKzAuMDA1IHBlciBjYXJkIGluIGhhbmQgYWJvdmUgb3Bwb25lbnQKCkFsbCBpbnRlcm1lZGlhdGUgcmV3YXJkcyBhcmUgb3B0aW9uYWwgYW5kIGNvbmZpZ3VyYWJsZSB2aWEgUmV3YXJkQ29uZmlnLgoiIiIKCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcywgZmllbGQKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIE9wdGlvbmFsCgoKQGRhdGFjbGFzcwpjbGFzcyBSZXdhcmRDb25maWc6CiAgICAiIiJXZWlnaHRzIGZvciByZXdhcmQgc2hhcGluZyBjb21wb25lbnRzLiIiIgogICAgIyBUZXJtaW5hbCByZXdhcmRzCiAgICB3aW5fcmV3YXJkOiBmbG9hdCA9IDEuMAogICAgbG9zc19yZXdhcmQ6IGZsb2F0ID0gLTEuMAogICAgZHJhd19yZXdhcmQ6IGZsb2F0ID0gMC4wCiAgICB0aW1lb3V0X3Jld2FyZDogZmxvYXQgPSAtMC4xICAgICAgICAjIFNsaWdodCBwZW5hbHR5IGZvciBnYW1lcyB0aW1pbmcgb3V0CgogICAgIyBJbnRlcm1lZGlhdGUgcmV3YXJkIHdlaWdodHMgKHNldCB0byAwLjAgdG8gZGlzYWJsZSkKICAgIGxpZmVfZGVsdGFfd2VpZ2h0OiBmbG9hdCA9IDAuMDEgICAgICMgUGVyIGxpZmUgcG9pbnQgY2hhbmdlCiAgICBib2FyZF9jb250cm9sX3dlaWdodDogZmxvYXQgPSAwLjAwNSAjIFBlciBjcmVhdHVyZSBhZHZhbnRhZ2UKICAgIGRhbWFnZV9kZWFsdF93ZWlnaHQ6IGZsb2F0ID0gMC4wMSAgICMgUGVyIGRhbWFnZSBkZWFsdAogICAgY29tbWFuZGVyX2Nhc3Rfd2VpZ2h0OiBmbG9hdCA9IDAuMDIgIyBCb251cyBmb3IgY2FzdGluZyBjb21tYW5kZXIKICAgIGNhcmRfYWR2YW50YWdlX3dlaWdodDogZmxvYXQgPSAwLjAwNSAjIFBlciBjYXJkIGFkdmFudGFnZSBpbiBoYW5kCgogICAgIyBEaXNjb3VudCBmYWN0b3IgZm9yIEdBRQogICAgZ2FtbWE6IGZsb2F0ID0gMC45OQogICAgIyBHQUUgbGFtYmRhCiAgICBnYWVfbGFtYmRhOiBmbG9hdCA9IDAuOTUKCiAgICAjIENsaXAgaW50ZXJtZWRpYXRlIHJld2FyZHMgdG8gcHJldmVudCBvdXRsaWVycwogICAgaW50ZXJtZWRpYXRlX2NsaXA6IGZsb2F0ID0gMC4xCgoKUkVXQVJEX0NPTkZJRyA9IFJld2FyZENvbmZpZygpCgoKZGVmIGNvbXB1dGVfdGVybWluYWxfcmV3YXJkKAogICAgd29uOiBib29sLAogICAgZHJhdzogYm9vbCA9IEZhbHNlLAogICAgdGltZW91dDogYm9vbCA9IEZhbHNlLAogICAgY29uZmlnOiBSZXdhcmRDb25maWcgPSBOb25lLAopIC0+IGZsb2F0OgogICAgIiIiQ29tcHV0ZSB0ZXJtaW5hbCByZXdhcmQgZm9yIGVuZCBvZiBnYW1lLgoKICAgIEFyZ3M6CiAgICAgICAgd29uOiBUcnVlIGlmIHRoZSBhZ2VudCB3b24KICAgICAgICBkcmF3OiBUcnVlIGlmIHRoZSBnYW1lIHdhcyBhIGRyYXcKICAgICAgICB0aW1lb3V0OiBUcnVlIGlmIHRoZSBnYW1lIGhpdCB0aGUgdHVybiBsaW1pdAogICAgICAgIGNvbmZpZzogUmV3YXJkIHdlaWdodHMKCiAgICBSZXR1cm5zOgogICAgICAgIFRlcm1pbmFsIHJld2FyZCBzY2FsYXIKICAgICIiIgogICAgY2ZnID0gY29uZmlnIG9yIFJFV0FSRF9DT05G' +
'SUcKCiAgICBpZiBkcmF3OgogICAgICAgIHJldHVybiBjZmcuZHJhd19yZXdhcmQKICAgIGlmIHRpbWVvdXQ6CiAgICAgICAgcmV0dXJuIGNmZy50aW1lb3V0X3Jld2FyZAogICAgcmV0dXJuIGNmZy53aW5fcmV3YXJkIGlmIHdvbiBlbHNlIGNmZy5sb3NzX3Jld2FyZAoKCmRlZiBjb21wdXRlX2ludGVybWVkaWF0ZV9yZXdhcmQoCiAgICBwcmV2X3N0YXRlOiBEaWN0LAogICAgY3Vycl9zdGF0ZTogRGljdCwKICAgIGFjdGlvbl90YWtlbjogc3RyLAogICAgYWdlbnRfc2VhdDogaW50ID0gMCwKICAgIGNvbmZpZzogUmV3YXJkQ29uZmlnID0gTm9uZSwKKSAtPiBmbG9hdDoKICAgICIiIkNvbXB1dGUgZGVuc2UgaW50ZXJtZWRpYXRlIHJld2FyZCBmcm9tIHN0YXRlIHRyYW5zaXRpb24uCgogICAgQXJnczoKICAgICAgICBwcmV2X3N0YXRlOiBQcmV2aW91cyBnYW1lIHN0YXRlIHNuYXBzaG90IChEZWNpc2lvblNuYXBzaG90LWxpa2UgZGljdCkKICAgICAgICBjdXJyX3N0YXRlOiBDdXJyZW50IGdhbWUgc3RhdGUgc25hcHNob3QgYWZ0ZXIgYWN0aW9uCiAgICAgICAgYWN0aW9uX3Rha2VuOiBUaGUgbWFjcm8tYWN0aW9uIHN0cmluZyB0aGF0IHdhcyB0YWtlbgogICAgICAgIGFnZW50X3NlYXQ6IFdoaWNoIHBsYXllciBzZWF0IGlzIHRoZSBhZ2VudCAoMCBvciAxKQogICAgICAgIGNvbmZpZzogUmV3YXJkIHdlaWdodHMKCiAgICBSZXR1cm5zOgogICAgICAgIEludGVybWVkaWF0ZSByZXdhcmQgc2NhbGFyIChjbGlwcGVkKQogICAgIiIiCiAgICBjZmcgPSBjb25maWcgb3IgUkVXQVJEX0NPTkZJRwogICAgcmV3YXJkID0gMC4wCgogICAgb3BwX3NlYXQgPSAxIC0gYWdlbnRfc2VhdAoKICAgICMgRXh0cmFjdCBwbGF5ZXIgc3RhdGVzCiAgICBwcmV2X3BsYXllcnMgPSBwcmV2X3N0YXRlLmdldCgicGxheWVycyIsIFtdKQogICAgY3Vycl9wbGF5ZXJzID0gY3Vycl9zdGF0ZS5nZXQoInBsYXllcnMiLCBbXSkKCiAgICBpZiBsZW4ocHJldl9wbGF5ZXJzKSA8IDIgb3IgbGVuKGN1cnJfcGxheWVycykgPCAyOgogICAgICAgIHJldHVybiAwLjAKCiAgICBwcmV2X2FnZW50ID0gcHJldl9wbGF5ZXJzW2FnZW50X3NlYXRdCiAgICBjdXJyX2FnZW50ID0gY3Vycl9wbGF5ZXJzW2FnZW50X3NlYXRdCiAgICBwcmV2X29wcCA9IHByZXZfcGxheWVyc1tvcHBfc2VhdF0KICAgIGN1cnJfb3BwID0gY3Vycl9wbGF5ZXJzW29wcF9zZWF0XQoKICAgICMgLS0tIExpZmUgRGVsdGEgLS0tCiAgICBpZiBjZmcubGlmZV9kZWx0YV93ZWlnaHQgIT0gMC4wOgogICAgICAgIGFnZW50X2xpZmVfZGVsdGEgPSAoCiAgICAgICAgICAgIGN1cnJfYWdlbnQuZ2V0KCJsaWZlX3RvdGFsIiwgNDApIC0gcHJldl9hZ2VudC5nZXQoImxpZmVfdG90YWwiLCA0MCkKICAgICAgICApCiAgICAgICAgb3BwX2xpZmVfZGVsdGEgPSAoCiAgICAgICAgICAgIGN1cnJfb3BwLmdldCgibGlmZV90b3RhbCIsIDQwKSAtIHByZXZfb3BwLmdldCgibGlmZV90b3RhbCIsIDQwKQogICAgICAgICkKICAgICAgICAjIEFnZW50IGdhaW5pbmcgbGlmZSBpcyBnb29kLCBvcHBvbmVudCBsb3NpbmcgbGlmZSBpcyBnb29kCiAgICAgICAgcmV3YXJkICs9IGNmZy5saWZlX2RlbHRhX3dlaWdodCAqIChhZ2VudF9saWZlX2RlbHRhIC0gb3BwX2xpZmVfZGVsdGEpCgogICAgIyAtLS0gQm9hcmQgQ29udHJvbCAoY3JlYXR1cmUgY291bnQgYWR2YW50YWdlKSAtLS0KICAgIGlmIGNmZy5ib2FyZF9jb250cm9sX3dlaWdodCAhPSAwLjA6CiAgICAgICAgYWdlbnRfY3JlYXR1cmVzID0gY3Vycl9hZ2VudC5nZXQoImNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCIsIDApCiAgICAgICAgb3BwX2NyZWF0dXJlcyA9IGN1cnJfb3BwLmdldCgiY3JlYXR1cmVzX29uX2JhdHRsZWZpZWxkIiwgMCkKICAgICAgICBwcmV2X2FnZW50X2NyZWF0dXJlcyA9IHByZXZfYWdlbnQuZ2V0KCJjcmVhdHVyZXNfb25fYmF0dGxlZmllbGQiLCAwKQogICAgICAgIHByZXZfb3BwX2NyZWF0dXJlcyA9IHByZXZfb3BwLmdldCgiY3JlYXR1cmVzX29uX2JhdHRsZWZpZWxkIiwgMCkKCiAgICAgICAgIyBDaGFuZ2UgaW4gY3JlYXR1cmUgYWR2YW50YWdlCiAgICAgICAgcHJldl9hZHZhbnRhZ2UgPSBwcmV2X2FnZW50X2NyZWF0dXJlcyAtIHByZXZfb3BwX2NyZWF0dXJlcwogICAgICAgIGN1cnJfYWR2YW50YWdlID0gYWdlbnRfY3JlYXR1cmVzIC0gb3BwX2NyZWF0dXJlcwogICAgICAgIGJvYXJkX2RlbHRhID0gY3Vycl9hZHZhbnRhZ2UgLSBwcmV2X2FkdmFudGFnZQogICAg' +
'ICAgIHJld2FyZCArPSBjZmcuYm9hcmRfY29udHJvbF93ZWlnaHQgKiBib2FyZF9kZWx0YQoKICAgICMgLS0tIERhbWFnZSBEZWFsdCAtLS0KICAgIGlmIGNmZy5kYW1hZ2VfZGVhbHRfd2VpZ2h0ICE9IDAuMDoKICAgICAgICAjIERhbWFnZSBkZWFsdCA9IG9wcG9uZW50IGxpZmUgZGVjcmVhc2UgdGhpcyBzdGVwCiAgICAgICAgb3BwX2xpZmVfbG9zdCA9IG1heCgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgcHJldl9vcHAuZ2V0KCJsaWZlX3RvdGFsIiwgNDApIC0gY3Vycl9vcHAuZ2V0KCJsaWZlX3RvdGFsIiwgNDApCiAgICAgICAgKQogICAgICAgIHJld2FyZCArPSBjZmcuZGFtYWdlX2RlYWx0X3dlaWdodCAqIG9wcF9saWZlX2xvc3QKCiAgICAjIC0tLSBDb21tYW5kZXIgQ2FzdCBCb251cyAtLS0KICAgIGlmIGNmZy5jb21tYW5kZXJfY2FzdF93ZWlnaHQgIT0gMC4wIGFuZCBhY3Rpb25fdGFrZW4gPT0gImNhc3RfY29tbWFuZGVyIjoKICAgICAgICByZXdhcmQgKz0gY2ZnLmNvbW1hbmRlcl9jYXN0X3dlaWdodAoKICAgICMgLS0tIENhcmQgQWR2YW50YWdlIC0tLQogICAgaWYgY2ZnLmNhcmRfYWR2YW50YWdlX3dlaWdodCAhPSAwLjA6CiAgICAgICAgYWdlbnRfY2FyZHMgPSBjdXJyX2FnZW50LmdldCgiY2FyZHNfaW5faGFuZCIsIDApCiAgICAgICAgb3BwX2NhcmRzID0gY3Vycl9vcHAuZ2V0KCJjYXJkc19pbl9oYW5kIiwgMCkKICAgICAgICBwcmV2X2FnZW50X2NhcmRzID0gcHJldl9hZ2VudC5nZXQoImNhcmRzX2luX2hhbmQiLCAwKQogICAgICAgIHByZXZfb3BwX2NhcmRzID0gcHJldl9vcHAuZ2V0KCJjYXJkc19pbl9oYW5kIiwgMCkKCiAgICAgICAgcHJldl9jYXJkX2FkdiA9IHByZXZfYWdlbnRfY2FyZHMgLSBwcmV2X29wcF9jYXJkcwogICAgICAgIGN1cnJfY2FyZF9hZHYgPSBhZ2VudF9jYXJkcyAtIG9wcF9jYXJkcwogICAgICAgIGNhcmRfZGVsdGEgPSBjdXJyX2NhcmRfYWR2IC0gcHJldl9jYXJkX2FkdgogICAgICAgIHJld2FyZCArPSBjZmcuY2FyZF9hZHZhbnRhZ2Vfd2VpZ2h0ICogY2FyZF9kZWx0YQoKICAgICMgQ2xpcCB0byBwcmV2ZW50IGV4dHJlbWUgaW50ZXJtZWRpYXRlIHJld2FyZHMKICAgIHJld2FyZCA9IG1heCgtY2ZnLmludGVybWVkaWF0ZV9jbGlwLCBtaW4oY2ZnLmludGVybWVkaWF0ZV9jbGlwLCByZXdhcmQpKQoKICAgIHJldHVybiByZXdhcmQKCgpkZWYgY29tcHV0ZV9nYW1lX3Jld2FyZHMoCiAgICB0cmFqZWN0b3J5OiBsaXN0LAogICAgd29uOiBib29sLAogICAgZHJhdzogYm9vbCA9IEZhbHNlLAogICAgdGltZW91dDogYm9vbCA9IEZhbHNlLAogICAgYWdlbnRfc2VhdDogaW50ID0gMCwKICAgIGNvbmZpZzogUmV3YXJkQ29uZmlnID0gTm9uZSwKKSAtPiBsaXN0OgogICAgIiIiQ29tcHV0ZSByZXdhcmRzIGZvciBhbiBlbnRpcmUgZ2FtZSB0cmFqZWN0b3J5LgoKICAgIEFyZ3M6CiAgICAgICAgdHJhamVjdG9yeTogTGlzdCBvZiAocHJldl9zdGF0ZSwgY3Vycl9zdGF0ZSwgYWN0aW9uX3Rha2VuKSB0dXBsZXMKICAgICAgICB3b246IERpZCB0aGUgYWdlbnQgd2luPwogICAgICAgIGRyYXc6IFdhcyBpdCBhIGRyYXc/CiAgICAgICAgdGltZW91dDogRGlkIHRoZSBnYW1lIHRpbWUgb3V0PwogICAgICAgIGFnZW50X3NlYXQ6IEFnZW50J3MgcGxheWVyIHNlYXQgKDAgb3IgMSkKICAgICAgICBjb25maWc6IFJld2FyZCBjb25maWd1cmF0aW9uCgogICAgUmV0dXJuczoKICAgICAgICBMaXN0IG9mIHJld2FyZCBmbG9hdHMsIG9uZSBwZXIgc3RlcC4gVGVybWluYWwgcmV3YXJkIGFkZGVkIHRvIGxhc3Qgc3RlcC4KICAgICIiIgogICAgY2ZnID0gY29uZmlnIG9yIFJFV0FSRF9DT05GSUcKICAgIHJld2FyZHMgPSBbXQoKICAgIGZvciBwcmV2X3N0YXRlLCBjdXJyX3N0YXRlLCBhY3Rpb25fdGFrZW4gaW4gdHJhamVjdG9yeToKICAgICAgICByID0gY29tcHV0ZV9pbnRlcm1lZGlhdGVfcmV3YXJkKAogICAgICAgICAgICBwcmV2X3N0YXRlLCBjdXJyX3N0YXRlLCBhY3Rpb25fdGFrZW4sIGFnZW50X3NlYXQsIGNmZwogICAgICAgICkKICAgICAgICByZXdhcmRzLmFwcGVuZChyKQoKICAgICMgQWRkIHRlcm1pbmFsIHJld2FyZCB0byBsYXN0IHN0ZXAKICAgIGlmIHJld2FyZHM6CiAgICAgICAgdGVybWluYWwgPSBjb21wdXRlX3Rlcm1pbmFsX3Jld2FyZCh3b24sIGRyYXcsIHRpbWVvdXQsIGNmZykKICAgICAgICByZXdhcmRzWy0xXSArPSB0ZXJtaW5hbAoKICAgIHJldHVybiByZXdhcmRzCg=='
Install-B64 -R 'ml\training\reward.py' -B $b
# ml/training/rollout_buffer.py (6,177 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFJvbGxvdXQgQnVmZmVyIGZvciBQUE8K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQClN0b3JlcyBleHBlcmllbmNlIHRyYWplY3RvcmllcyBjb2xsZWN0ZWQgZHVyaW5nIHNlbGYtcGxheSBlcGlzb2Rlcy4KQ29tcHV0ZXMgR2VuZXJhbGl6ZWQgQWR2YW50YWdlIEVzdGltYXRpb24gKEdBRSkgZm9yIFBQTyB0cmFpbmluZy4KCkVhY2ggc3RlcCBzdG9yZXM6CiAgICBzdGF0ZSAgICAgICDigJQgKHN0YXRlX2RpbSwpIGZsb2F0MzIgc3RhdGUgdmVjdG9yCiAgICBhY3Rpb24gICAgICDigJQgaW50IGFjdGlvbiBpbmRleAogICAgcmV3YXJkICAgICAg4oCUIGZsb2F0IHNjYWxhciByZXdhcmQKICAgIHZhbHVlICAgICAgIOKAlCBmbG9hdCBWKHMpIGZyb20gdmFsdWUgaGVhZAogICAgbG9nX3Byb2IgICAg4oCUIGZsb2F0IGxvZyDPgChhfHMpIGZyb20gcG9saWN5CiAgICBkb25lICAgICAgICDigJQgYm9vbCBlcGlzb2RlIHRlcm1pbmFsIGZsYWcKCkFmdGVyIGNvbGxlY3Rpb24sIGNhbGwgY29tcHV0ZV9yZXR1cm5zX2FuZF9hZHZhbnRhZ2VzKCkgdG8gcHJvZHVjZToKICAgIHJldHVybnMgICAgIOKAlCBHQUUtYmFzZWQgcmV0dXJuIHRhcmdldHMgZm9yIHZhbHVlIGhlYWQKICAgIGFkdmFudGFnZXMgIOKAlCBBZHZhbnRhZ2UgZXN0aW1hdGVzIGZvciBwb2xpY3kgZ3JhZGllbnQKIiIiCgppbXBvcnQgbnVtcHkgYXMgbnAKZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIFR1cGxlCgoKY2xhc3MgUm9sbG91dEJ1ZmZlcjoKICAgICIiIkZpeGVkLXNpemUgYnVmZmVyIGZvciBQUE8gcm9sbG91dCBjb2xsZWN0aW9uLgoKICAgIENvbGxlY3RzIGV4cGVyaWVuY2UgZnJvbSBzZWxmLXBsYXksIHRoZW4gY29tcHV0ZXMgR0FFCiAgICBhZHZhbnRhZ2VzIGZvciBhIFBQTyB0cmFpbmluZyB1cGRhdGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYnVmZmVyX3NpemU6IGludCwgc3RhdGVfZGltOiBpbnQsIGdhbW1hOiBmbG9hdCA9IDAuOTksIGdhZV9sYW1iZGE6IGZsb2F0ID0gMC45NSk6CiAgICAgICAgIiIiCiAgICAgICAgQXJnczoKICAgICAgICAgICAgYnVmZmVyX3NpemU6IE1heGltdW0gbnVtYmVyIG9mIHN0ZXBzIHRvIHN0b3JlCiAgICAgICAgICAgIHN0YXRlX2RpbTogRGltZW5zaW9uIG9mIHN0YXRlIHZlY3RvcgogICAgICAgICAgICBnYW1tYTogRGlzY291bnQgZmFjdG9yCiAgICAgICAgICAgIGdhZV9sYW1iZGE6IEdBRSBsYW1iZGEgcGFyYW1ldGVyCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplCiAgICAgICAgc2VsZi5zdGF0ZV9kaW0gPSBzdGF0ZV9kaW0KICAgICAgICBzZWxmLmdhbW1hID0gZ2FtbWEKICAgICAgICBzZWxmLmdhZV9sYW1iZGEgPSBnYWVfbGFtYmRhCgogICAgICAgICMgUHJlLWFsbG9jYXRlIGFycmF5cwogICAgICAgIHNlbGYuc3RhdGVzID0gbnAuemVyb3MoKGJ1ZmZlcl9zaXplLCBzdGF0ZV9kaW0pLCBkdHlwZT1ucC5mbG9hdDMyKQogICAgICAgIHNlbGYuYWN0aW9ucyA9IG5wLnplcm9zKGJ1ZmZlcl9zaXplLCBkdHlwZT1ucC5pbnQ2NCkKICAgICAgICBzZWxmLnJld2FyZHMgPSBucC56ZXJvcyhidWZmZXJfc2l6ZSwgZHR5cGU9bnAuZmxvYXQzMikKICAgICAgICBzZWxmLnZhbHVlcyA9IG5wLnplcm9zKGJ1ZmZlcl9zaXplLCBkdHlwZT1ucC5mbG9hdDMyKQogICAgICAgIHNlbGYubG9nX3Byb2JzID0gbnAuemVyb3MoYnVmZmVyX3NpemUsIGR0eXBlPW5wLmZsb2F0MzIpCiAgICAgICAgc2VsZi5kb25lcyA9IG5wLnplcm9zKGJ1ZmZlcl9zaXplLCBkdHlwZT1ucC5mbG9hdDMyKQoKICAgICAgICAjIENvbXB1dGVkIGFmdGVyIGNvbGxlY3Rpb24KICAgICAgICBzZWxmLmFkdmFudGFnZXMgPSBucC56ZXJvcyhidWZmZXJfc2l6ZSwgZHR5cGU9bnAuZmxvYXQzMikKICAgICAgICBzZWxmLnJldHVybnMgPSBucC56ZXJvcyhidWZmZXJfc2l6ZSwgZHR5cGU9bnAuZmxvYXQzMikKCiAgICAgICAgc2VsZi5wb3MgPSAwICAgICAgICMgQ3VycmVudCB3cml0ZSBwb3NpdGlvbgogICAgICAgIHNlbGYuZnVsbCA9IEZhbHNlICAjIFdoZXRoZXIgYnVmZmVyIGhhcyBiZWVuIGZpbGxlZAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNpemUoc2VsZikgLT4gaW50OgogICAgICAgICIi' +
'Ik51bWJlciBvZiB2YWxpZCBzdGVwcyBzdG9yZWQuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyX3NpemUgaWYgc2VsZi5mdWxsIGVsc2Ugc2VsZi5wb3MKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIiIiQ2xlYXIgdGhlIGJ1ZmZlciBmb3IgYSBuZXcgY29sbGVjdGlvbiBwaGFzZS4iIiIKICAgICAgICBzZWxmLnBvcyA9IDAKICAgICAgICBzZWxmLmZ1bGwgPSBGYWxzZQoKICAgIGRlZiBhZGQoCiAgICAgICAgc2VsZiwKICAgICAgICBzdGF0ZTogbnAubmRhcnJheSwKICAgICAgICBhY3Rpb246IGludCwKICAgICAgICByZXdhcmQ6IGZsb2F0LAogICAgICAgIHZhbHVlOiBmbG9hdCwKICAgICAgICBsb2dfcHJvYjogZmxvYXQsCiAgICAgICAgZG9uZTogYm9vbCwKICAgICk6CiAgICAgICAgIiIiQWRkIGEgc2luZ2xlIGV4cGVyaWVuY2Ugc3RlcC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc3RhdGU6IFN0YXRlIHZlY3RvciAoc3RhdGVfZGltLCkKICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24gaW5kZXgKICAgICAgICAgICAgcmV3YXJkOiBTY2FsYXIgcmV3YXJkCiAgICAgICAgICAgIHZhbHVlOiBWKHMpIGZyb20gY3JpdGljCiAgICAgICAgICAgIGxvZ19wcm9iOiBsb2cgz4AoYXxzKSBmcm9tIGFjdG9yCiAgICAgICAgICAgIGRvbmU6IFRydWUgaWYgZXBpc29kZSBlbmRlZCBhZnRlciB0aGlzIHN0ZXAKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnBvcyA+PSBzZWxmLmJ1ZmZlcl9zaXplOgogICAgICAgICAgICBzZWxmLmZ1bGwgPSBUcnVlCiAgICAgICAgICAgIHJldHVybiAgIyBCdWZmZXIgaXMgZnVsbCDigJQgc2lsZW50bHkgZHJvcAoKICAgICAgICBzZWxmLnN0YXRlc1tzZWxmLnBvc10gPSBzdGF0ZQogICAgICAgIHNlbGYuYWN0aW9uc1tzZWxmLnBvc10gPSBhY3Rpb24KICAgICAgICBzZWxmLnJld2FyZHNbc2VsZi5wb3NdID0gcmV3YXJkCiAgICAgICAgc2VsZi52YWx1ZXNbc2VsZi5wb3NdID0gdmFsdWUKICAgICAgICBzZWxmLmxvZ19wcm9ic1tzZWxmLnBvc10gPSBsb2dfcHJvYgogICAgICAgIHNlbGYuZG9uZXNbc2VsZi5wb3NdID0gZmxvYXQoZG9uZSkKCiAgICAgICAgc2VsZi5wb3MgKz0gMQogICAgICAgIGlmIHNlbGYucG9zID49IHNlbGYuYnVmZmVyX3NpemU6CiAgICAgICAgICAgIHNlbGYuZnVsbCA9IFRydWUKCiAgICBkZWYgY29tcHV0ZV9yZXR1cm5zX2FuZF9hZHZhbnRhZ2VzKHNlbGYsIGxhc3RfdmFsdWU6IGZsb2F0ID0gMC4wKToKICAgICAgICAiIiJDb21wdXRlIEdBRSBhZHZhbnRhZ2VzIGFuZCBkaXNjb3VudGVkIHJldHVybnMuCgogICAgICAgIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCBzdGVwcyBhcmUgY29sbGVjdGVkLCBiZWZvcmUgZ2VuZXJhdGluZyBiYXRjaGVzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBsYXN0X3ZhbHVlOiBWKHNfVCsxKSBib290c3RyYXAgdmFsdWUgZm9yIHRoZSBsYXN0IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgKDAuMCBpZiB0aGUgZXBpc29kZSBlbmRlZCwgZWxzZSBjcml0aWMgZXN0aW1hdGUpCiAgICAgICAgIiIiCiAgICAgICAgbiA9IHNlbGYuc2l6ZQogICAgICAgIGxhc3RfZ2FlID0gMC4wCgogICAgICAgIGZvciB0IGluIHJldmVyc2VkKHJhbmdlKG4pKToKICAgICAgICAgICAgaWYgdCA9PSBuIC0gMToKICAgICAgICAgICAgICAgIG5leHRfbm9uX3Rlcm1pbmFsID0gMS4wIC0gc2VsZi5kb25lc1t0XQogICAgICAgICAgICAgICAgbmV4dF92YWx1ZSA9IGxhc3RfdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5leHRfbm9uX3Rlcm1pbmFsID0gMS4wIC0gc2VsZi5kb25lc1t0XQogICAgICAgICAgICAgICAgbmV4dF92YWx1ZSA9IHNlbGYudmFsdWVzW3QgKyAxXQoKICAgICAgICAgICAgIyBURCBlcnJvcjogzrRfdCA9IHJfdCArIM6zICogVihzX3t0KzF9KSAqICgxIC0gZG9uZSkgLSBWKHNfdCkKICAgICAgICAgICAgZGVsdGEgPSAoCiAgICAgICAgICAgICAgICBzZWxmLnJld2FyZHNbdF0KICAgICAgICAgICAgICAgICsgc2VsZi5nYW1tYSAqIG5leHRfdmFsdWUgKiBuZXh0X25vbl90ZXJtaW5hbAogICAgICAgICAgICAgICAgLSBzZWxmLnZhbHVlc1t0XQogICAgICAgICAgICApCgogICAgICAgICAgICAjIEdBRTogQV90ID0gzrRfdCArIM6zzrsgKiAoMSAtIGRvbmUpICogQV97dCsxfQogICAgICAgICAgICBsYXN0X2dhZSA9IGRlbHRhICsgc2VsZi5nYW1tYSAqIHNlbGYuZ2FlX2xhbWJkYSAqIG5leHRfbm9u' +
'X3Rlcm1pbmFsICogbGFzdF9nYWUKICAgICAgICAgICAgc2VsZi5hZHZhbnRhZ2VzW3RdID0gbGFzdF9nYWUKCiAgICAgICAgIyBSZXR1cm5zID0gYWR2YW50YWdlcyArIHZhbHVlcyAoZm9yIHZhbHVlIGZ1bmN0aW9uIHRhcmdldCkKICAgICAgICBzZWxmLnJldHVybnNbOm5dID0gc2VsZi5hZHZhbnRhZ2VzWzpuXSArIHNlbGYudmFsdWVzWzpuXQoKICAgIGRlZiBnZXRfYmF0Y2hlcyhzZWxmLCBiYXRjaF9zaXplOiBpbnQpIC0+IExpc3RbVHVwbGVdOgogICAgICAgICIiIkdlbmVyYXRlIHJhbmRvbSBtaW5pLWJhdGNoZXMgZm9yIFBQTyB1cGRhdGUuCgogICAgICAgIFlpZWxkczoKICAgICAgICAgICAgKHN0YXRlcywgYWN0aW9ucywgb2xkX2xvZ19wcm9icywgYWR2YW50YWdlcywgcmV0dXJucykKICAgICAgICAgICAgYXMgbnVtcHkgYXJyYXlzIG9mIHNoYXBlIChiYXRjaF9zaXplLCAuLi4pCiAgICAgICAgIiIiCiAgICAgICAgbiA9IHNlbGYuc2l6ZQogICAgICAgIGluZGljZXMgPSBucC5yYW5kb20ucGVybXV0YXRpb24obikKCiAgICAgICAgIyBOb3JtYWxpemUgYWR2YW50YWdlcwogICAgICAgIGFkdiA9IHNlbGYuYWR2YW50YWdlc1s6bl0KICAgICAgICBhZHZfbWVhbiA9IGFkdi5tZWFuKCkKICAgICAgICBhZHZfc3RkID0gYWR2LnN0ZCgpICsgMWUtOAogICAgICAgIG5vcm1hbGl6ZWRfYWR2ID0gKGFkdiAtIGFkdl9tZWFuKSAvIGFkdl9zdGQKCiAgICAgICAgZm9yIHN0YXJ0IGluIHJhbmdlKDAsIG4sIGJhdGNoX3NpemUpOgogICAgICAgICAgICBlbmQgPSBtaW4oc3RhcnQgKyBiYXRjaF9zaXplLCBuKQogICAgICAgICAgICBiYXRjaF9pZHggPSBpbmRpY2VzW3N0YXJ0OmVuZF0KCiAgICAgICAgICAgIHlpZWxkICgKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVzW2JhdGNoX2lkeF0sCiAgICAgICAgICAgICAgICBzZWxmLmFjdGlvbnNbYmF0Y2hfaWR4XSwKICAgICAgICAgICAgICAgIHNlbGYubG9nX3Byb2JzW2JhdGNoX2lkeF0sCiAgICAgICAgICAgICAgICBub3JtYWxpemVkX2FkdltiYXRjaF9pZHhdLAogICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5zW2JhdGNoX2lkeF0sCiAgICAgICAgICAgICkKCiAgICBkZWYgZ2V0X3N0YXRzKHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgIiIiR2V0IGJ1ZmZlciBzdGF0aXN0aWNzIGZvciBsb2dnaW5nLiIiIgogICAgICAgIG4gPSBzZWxmLnNpemUKICAgICAgICBpZiBuID09IDA6CiAgICAgICAgICAgIHJldHVybiB7InNpemUiOiAwfQoKICAgICAgICBlcGlzb2RlcyA9IGludChzZWxmLmRvbmVzWzpuXS5zdW0oKSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAic2l6ZSI6IG4sCiAgICAgICAgICAgICJlcGlzb2RlcyI6IGVwaXNvZGVzLAogICAgICAgICAgICAibWVhbl9yZXdhcmQiOiBmbG9hdChzZWxmLnJld2FyZHNbOm5dLm1lYW4oKSksCiAgICAgICAgICAgICJ0b3RhbF9yZXdhcmQiOiBmbG9hdChzZWxmLnJld2FyZHNbOm5dLnN1bSgpKSwKICAgICAgICAgICAgIm1lYW5fdmFsdWUiOiBmbG9hdChzZWxmLnZhbHVlc1s6bl0ubWVhbigpKSwKICAgICAgICAgICAgIm1lYW5fYWR2YW50YWdlIjogZmxvYXQoc2VsZi5hZHZhbnRhZ2VzWzpuXS5tZWFuKCkpLAogICAgICAgICAgICAic3RkX2FkdmFudGFnZSI6IGZsb2F0KHNlbGYuYWR2YW50YWdlc1s6bl0uc3RkKCkpLAogICAgICAgIH0K'
Install-B64 -R 'ml\training\rollout_buffer.py' -B $b
# ml/training/self_play.py (20,007 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFNlbGYtUGxheSBFcGlzb2RlIEdlbmVyYXRvcgrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKR2VuZXJhdGVzIHN5bnRoZXRpYyAxdjEgQ29tbWFuZGVyIGdhbWUgZXBpc29kZXMgZm9yIFBQTyB0cmFpbmluZy4KClNpbmNlIHdlIGNhbid0IHJ1biByZWFsIEZvcmdlIGdhbWVzIGF0IHRyYWluaW5nIHNwZWVkLCB0aGlzIG1vZHVsZQpzaW11bGF0ZXMgc2ltcGxpZmllZCBnYW1lIGVwaXNvZGVzIHVzaW5nOgogIDEuIFJhbmRvbSBpbml0aWFsIHN0YXRlcyAobGlmZSwgaGFuZCBzaXplLCBib2FyZCkKICAyLiBUdXJuLWJ5LXR1cm4gc3RhdGUgZXZvbHV0aW9uIHdpdGggaGV1cmlzdGljIHRyYW5zaXRpb25zCiAgMy4gVGhlIGFnZW50J3MgcG9saWN5IHRvIHNlbGVjdCBtYWNyby1hY3Rpb25zIGF0IGVhY2ggZGVjaXNpb24gcG9pbnQKICA0LiBBbiBvcHBvbmVudCBwb2xpY3kgKGxlYXJuZWQsIHJhbmRvbSwgb3IgaGV1cmlzdGljKQoKVGhlIGVwaXNvZGUgZ2VuZXJhdG9yIHByb2R1Y2VzIHRyYWplY3RvcmllcyBvZjoKICAgIChzdGF0ZSwgYWN0aW9uLCByZXdhcmQsIHZhbHVlLCBsb2dfcHJvYiwgZG9uZSkKdGhhdCBmZWVkIGRpcmVjdGx5IGludG8gdGhlIFJvbGxvdXRCdWZmZXIgZm9yIFBQTyB0cmFpbmluZy4KCkZvciByZWFsIGdhbWUgaW50ZWdyYXRpb24gKFBoYXNlIDkrKSwgdGhlIEphdmEgc2ltIHdvdWxkIGNhbGwgdGhlCnBvbGljeSBzZXJ2ZXIgYW5kIGZlZWQgYmFjayBhY3R1YWwgZ2FtZSBzdGF0ZXMg4oCUIHRoaXMgc3ludGhldGljCnZlcnNpb24gYWxsb3dzIHRyYWluaW5nIHRvIGJlZ2luIGltbWVkaWF0ZWx5LgoiIiIKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByYW5kb20KZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZApmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgTGlzdCwgT3B0aW9uYWwsIFR1cGxlCgppbXBvcnQgbnVtcHkgYXMgbnAKCmltcG9ydCBzeXMKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCgpwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50LnBhcmVudC5wYXJlbnQpCmlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKZnJvbSBtbC5jb25maWcuc2NvcGUgaW1wb3J0ICgKICAgIE5VTV9BQ1RJT05TLCBNYWNyb0FjdGlvbiwgQUNUSU9OX1RPX0lEWCwgSURYX1RPX0FDVElPTiwKICAgIFBsYXlzdHlsZSwgUExBWVNUWUxFX1RPX0lEWCwgU1RBVEVfRElNUywgR2FtZVBoYXNlLCBQSEFTRV9UT19JRFgsCikKZnJvbSBtbC50cmFpbmluZy5yZXdhcmQgaW1wb3J0IGNvbXB1dGVfaW50ZXJtZWRpYXRlX3Jld2FyZCwgY29tcHV0ZV90ZXJtaW5hbF9yZXdhcmQsIFJld2FyZENvbmZpZwoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIm1sLnNlbGZfcGxheSIpCgoKQGRhdGFjbGFzcwpjbGFzcyBQbGF5ZXJTdGF0ZToKICAgICIiIlNpbXBsaWZpZWQgcGxheWVyIHN0YXRlIGZvciBzeW50aGV0aWMgZ2FtZXMuIiIiCiAgICBsaWZlX3RvdGFsOiBpbnQgPSA0MAogICAgY29tbWFuZGVyX2RhbWFnZV90YWtlbjogaW50ID0gMAogICAgbWFuYV9hdmFpbGFibGU6IGludCA9IDAKICAgIGNvbW1hbmRlcl90YXg6IGludCA9IDAKICAgIGNhcmRzX2luX2hhbmQ6IGludCA9IDcKICAgIGNhcmRzX2luX2dyYXZleWFyZDogaW50ID0gMAogICAgY3JlYXR1cmVzX29uX2JhdHRsZWZpZWxkOiBpbnQgPSAwCiAgICB0b3RhbF9wb3dlcl9vbl9ib2FyZDogaW50ID0gMAogICAgY29tbWFuZGVyX2luX3BsYXk6IGJvb2wgPSBGYWxzZQoKICAgIGRlZiB0b19kaWN0KHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgImxpZmVfdG90YWwiOiBzZWxmLmxpZmVfdG90YWwsCiAgICAgICAgICAgICJjb21tYW5kZXJfZGFtYWdlX3Rha2VuIjogc2VsZi5jb21tYW5kZXJfZGFtYWdlX3Rha2VuLAogICAgICAgICAgICAibWFuYV9hdmFpbGFibGUiOiBzZWxmLm1hbmFfYXZhaWxhYmxlLAogICAgICAgICAgICAiY29tbWFuZGVyX3RheCI6IHNlbGYuY29tbWFuZGVyX3RheCwKICAgICAgICAgICAgImNhcmRzX2luX2hhbmQiOiBzZWxmLmNhcmRzX2luX2hhbmQsCiAgICAgICAg' +
'ICAgICJjYXJkc19pbl9ncmF2ZXlhcmQiOiBzZWxmLmNhcmRzX2luX2dyYXZleWFyZCwKICAgICAgICAgICAgImNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCI6IHNlbGYuY3JlYXR1cmVzX29uX2JhdHRsZWZpZWxkLAogICAgICAgICAgICAidG90YWxfcG93ZXJfb25fYm9hcmQiOiBzZWxmLnRvdGFsX3Bvd2VyX29uX2JvYXJkLAogICAgICAgIH0KCgpAZGF0YWNsYXNzCmNsYXNzIEdhbWVTdGF0ZToKICAgICIiIkZ1bGwgc3ludGhldGljIGdhbWUgc3RhdGUuIiIiCiAgICB0dXJuOiBpbnQgPSAxCiAgICBwaGFzZTogc3RyID0gIm1haW5fMSIKICAgIGFjdGl2ZV9zZWF0OiBpbnQgPSAwCiAgICBwbGF5ZXJzOiBsaXN0ID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxhbWJkYTogW1BsYXllclN0YXRlKCksIFBsYXllclN0YXRlKCldKQogICAgZ2FtZV9vdmVyOiBib29sID0gRmFsc2UKICAgIHdpbm5lcjogT3B0aW9uYWxbaW50XSA9IE5vbmUKICAgIGRyYXc6IGJvb2wgPSBGYWxzZQogICAgdGltZW91dDogYm9vbCA9IEZhbHNlCgogICAgZGVmIHRvX3NuYXBzaG90KHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgIiIiQ29udmVydCB0byBEZWNpc2lvblNuYXBzaG90LWNvbXBhdGlibGUgZGljdC4iIiIKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAidHVybiI6IHNlbGYudHVybiwKICAgICAgICAgICAgInBoYXNlIjogc2VsZi5waGFzZSwKICAgICAgICAgICAgImFjdGl2ZV9zZWF0Ijogc2VsZi5hY3RpdmVfc2VhdCwKICAgICAgICAgICAgInBsYXllcnMiOiBbcC50b19kaWN0KCkgZm9yIHAgaW4gc2VsZi5wbGF5ZXJzXSwKICAgICAgICB9CgoKZGVmIGNyZWF0ZV9yYW5kb21faW5pdGlhbF9zdGF0ZSgpIC0+IEdhbWVTdGF0ZToKICAgICIiIkNyZWF0ZSBhIHJhbmRvbWl6ZWQgc3RhcnRpbmcgZ2FtZSBzdGF0ZSAodHVybiAxLTMpLiIiIgogICAgc3RhdGUgPSBHYW1lU3RhdGUoKQoKICAgICMgUmFuZG9tIHN0YXJ0aW5nIHR1cm4gKHNpbXVsYXRlIHNvbWUgZWFybHkgZ2FtZSBkZXZlbG9wbWVudCkKICAgIHN0YXJ0X3R1cm4gPSByYW5kb20ucmFuZGludCgxLCAzKQogICAgc3RhdGUudHVybiA9IHN0YXJ0X3R1cm4KCiAgICBmb3IgaSwgcCBpbiBlbnVtZXJhdGUoc3RhdGUucGxheWVycyk6CiAgICAgICAgcC5saWZlX3RvdGFsID0gNDAKICAgICAgICBwLm1hbmFfYXZhaWxhYmxlID0gc3RhcnRfdHVybiArIHJhbmRvbS5yYW5kaW50KDAsIDEpICAjIFJhbXAgdmFyaWFuY2UKICAgICAgICBwLmNhcmRzX2luX2hhbmQgPSBtYXgoMiwgNyAtIHN0YXJ0X3R1cm4gKyByYW5kb20ucmFuZGludCgtMSwgMSkpCgogICAgICAgICMgU29tZSBlYXJseSBib2FyZCBwcmVzZW5jZQogICAgICAgIGlmIHN0YXJ0X3R1cm4gPj0gMjoKICAgICAgICAgICAgcC5jcmVhdHVyZXNfb25fYmF0dGxlZmllbGQgPSByYW5kb20ucmFuZGludCgwLCAyKQogICAgICAgICAgICBwLnRvdGFsX3Bvd2VyX29uX2JvYXJkID0gcC5jcmVhdHVyZXNfb25fYmF0dGxlZmllbGQgKiByYW5kb20ucmFuZGludCgxLCAzKQogICAgICAgICAgICBwLmNhcmRzX2luX2dyYXZleWFyZCA9IHJhbmRvbS5yYW5kaW50KDAsIDIpCgogICAgc3RhdGUuYWN0aXZlX3NlYXQgPSAwICAjIEFnZW50IGFsd2F5cyBzdGFydHMgYXMgc2VhdCAwCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgYXBwbHlfYWN0aW9uKAogICAgc3RhdGU6IEdhbWVTdGF0ZSwKICAgIGFjdGlvbl9pZHg6IGludCwKICAgIHBsYXllcl9zZWF0OiBpbnQsCikgLT4gR2FtZVN0YXRlOgogICAgIiIiQXBwbHkgYSBtYWNyby1hY3Rpb24gdG8gdGhlIGdhbWUgc3RhdGUsIHJldHVybmluZyB0aGUgbmV3IHN0YXRlLgoKICAgIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGhldXJpc3RpYyBzaW11bGF0aW9uIOKAlCBub3QgYSByZWFsIE1URyBydWxlcyBlbmdpbmUuCiAgICBJdCBtb2RlbHMgYXBwcm94aW1hdGUgc3RhdGUgdHJhbnNpdGlvbnMgZm9yIHRyYWluaW5nIHB1cnBvc2VzLgogICAgIiIiCiAgICBwbGF5ZXIgPSBzdGF0ZS5wbGF5ZXJzW3BsYXllcl9zZWF0XQogICAgb3Bwb25lbnQgPSBzdGF0ZS5wbGF5ZXJzWzEgLSBwbGF5ZXJfc2VhdF0KICAgIGFjdGlvbiA9IElEWF9UT19BQ1RJT05bYWN0aW9uX2lkeF0KCiAgICAjIERlY3JlbWVudCBtYW5hIGZvciBhY3Rpb25zIHRoYXQgY29zdCBtYW5hCiAgICBtYW5hX2Nvc3RzID0gewogICAgICAgIE1hY3JvQWN0aW9uLkNBU1RfQ1JFQVRVUkU6IHJhbmRvbS5yYW5kaW50KDIsIDUpLAogICAgICAgIE1hY3JvQWN0aW9uLkNB' +
'U1RfUkVNT1ZBTDogcmFuZG9tLnJhbmRpbnQoMiwgNCksCiAgICAgICAgTWFjcm9BY3Rpb24uQ0FTVF9EUkFXOiByYW5kb20ucmFuZGludCgxLCAzKSwKICAgICAgICBNYWNyb0FjdGlvbi5DQVNUX1JBTVA6IHJhbmRvbS5yYW5kaW50KDEsIDMpLAogICAgICAgIE1hY3JvQWN0aW9uLkNBU1RfQ09NTUFOREVSOiBtYXgoMywgMyArIHBsYXllci5jb21tYW5kZXJfdGF4KSwKICAgICAgICBNYWNyb0FjdGlvbi5BVFRBQ0tfT1BQT05FTlQ6IDAsCiAgICAgICAgTWFjcm9BY3Rpb24uSE9MRF9NQU5BOiAwLAogICAgICAgIE1hY3JvQWN0aW9uLlBBU1M6IDAsCiAgICB9CgogICAgY29zdCA9IG1hbmFfY29zdHNbYWN0aW9uXQoKICAgICMgQ2hlY2sgaWYgcGxheWVyIGhhcyBlbm91Z2ggbWFuYSDigJQgaWYgbm90LCB0cmVhdCBhcyBwYXNzCiAgICBpZiBjb3N0ID4gcGxheWVyLm1hbmFfYXZhaWxhYmxlOgogICAgICAgIGFjdGlvbiA9IE1hY3JvQWN0aW9uLlBBU1MKCiAgICBpZiBhY3Rpb24gPT0gTWFjcm9BY3Rpb24uQ0FTVF9DUkVBVFVSRToKICAgICAgICBwbGF5ZXIubWFuYV9hdmFpbGFibGUgLT0gY29zdAogICAgICAgIHBsYXllci5jYXJkc19pbl9oYW5kID0gbWF4KDAsIHBsYXllci5jYXJkc19pbl9oYW5kIC0gMSkKICAgICAgICBwbGF5ZXIuY3JlYXR1cmVzX29uX2JhdHRsZWZpZWxkICs9IDEKICAgICAgICBwb3dlciA9IHJhbmRvbS5yYW5kaW50KDEsIDQpCiAgICAgICAgcGxheWVyLnRvdGFsX3Bvd2VyX29uX2JvYXJkICs9IHBvd2VyCgogICAgZWxpZiBhY3Rpb24gPT0gTWFjcm9BY3Rpb24uQ0FTVF9SRU1PVkFMOgogICAgICAgIHBsYXllci5tYW5hX2F2YWlsYWJsZSAtPSBjb3N0CiAgICAgICAgcGxheWVyLmNhcmRzX2luX2hhbmQgPSBtYXgoMCwgcGxheWVyLmNhcmRzX2luX2hhbmQgLSAxKQogICAgICAgIGlmIG9wcG9uZW50LmNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCA+IDA6CiAgICAgICAgICAgIG9wcG9uZW50LmNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCAtPSAxCiAgICAgICAgICAgIHJlbW92ZWRfcG93ZXIgPSByYW5kb20ucmFuZGludCgxLCA0KQogICAgICAgICAgICBvcHBvbmVudC50b3RhbF9wb3dlcl9vbl9ib2FyZCA9IG1heCgKICAgICAgICAgICAgICAgIDAsIG9wcG9uZW50LnRvdGFsX3Bvd2VyX29uX2JvYXJkIC0gcmVtb3ZlZF9wb3dlcgogICAgICAgICAgICApCiAgICAgICAgICAgIG9wcG9uZW50LmNhcmRzX2luX2dyYXZleWFyZCArPSAxCgogICAgZWxpZiBhY3Rpb24gPT0gTWFjcm9BY3Rpb24uQ0FTVF9EUkFXOgogICAgICAgIHBsYXllci5tYW5hX2F2YWlsYWJsZSAtPSBjb3N0CiAgICAgICAgcGxheWVyLmNhcmRzX2luX2hhbmQgPSBtYXgoMCwgcGxheWVyLmNhcmRzX2luX2hhbmQgLSAxKSAgIyBDYXN0IHRoZSBzcGVsbAogICAgICAgIGNhcmRzX2RyYXduID0gcmFuZG9tLnJhbmRpbnQoMSwgMykKICAgICAgICBwbGF5ZXIuY2FyZHNfaW5faGFuZCArPSBjYXJkc19kcmF3bgoKICAgIGVsaWYgYWN0aW9uID09IE1hY3JvQWN0aW9uLkNBU1RfUkFNUDoKICAgICAgICBwbGF5ZXIubWFuYV9hdmFpbGFibGUgLT0gY29zdAogICAgICAgIHBsYXllci5jYXJkc19pbl9oYW5kID0gbWF4KDAsIHBsYXllci5jYXJkc19pbl9oYW5kIC0gMSkKICAgICAgICAjIFJhbXAgZ2l2ZXMgZnV0dXJlIG1hbmEg4oCUIHJlcHJlc2VudGVkIGFzIGEgc21hbGwgaW1tZWRpYXRlIGJvbnVzCiAgICAgICAgIyAoSW4gdGhlIG5leHQgdHVybiwgbWFuYSBuYXR1cmFsbHkgaW5jcmVhc2VzKQoKICAgIGVsaWYgYWN0aW9uID09IE1hY3JvQWN0aW9uLkNBU1RfQ09NTUFOREVSOgogICAgICAgIGlmIG5vdCBwbGF5ZXIuY29tbWFuZGVyX2luX3BsYXk6CiAgICAgICAgICAgIHBsYXllci5tYW5hX2F2YWlsYWJsZSAtPSBjb3N0CiAgICAgICAgICAgIHBsYXllci5jb21tYW5kZXJfaW5fcGxheSA9IFRydWUKICAgICAgICAgICAgcGxheWVyLmNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCArPSAxCiAgICAgICAgICAgIHBvd2VyID0gcmFuZG9tLnJhbmRpbnQoMywgNikKICAgICAgICAgICAgcGxheWVyLnRvdGFsX3Bvd2VyX29uX2JvYXJkICs9IHBvd2VyCgogICAgZWxpZiBhY3Rpb24gPT0gTWFjcm9BY3Rpb24uQVRUQUNLX09QUE9ORU5UOgogICAgICAgIGlmIHBsYXllci5jcmVhdHVyZXNfb25fYmF0dGxlZmllbGQgPiAwOgogICAgICAgICAgICAjIENhbGN1bGF0ZSBjb21iYXQgZGFtYWdlCiAgICAgICAgICAgIGRhbWFnZSA9IHBsYXllci50b3RhbF9wb3dlcl9vbl9i' +
'b2FyZAogICAgICAgICAgICAjIE9wcG9uZW50IG1heSBibG9jayB3aXRoIHNvbWUgY3JlYXR1cmVzCiAgICAgICAgICAgIGJsb2NrZWRfcG93ZXIgPSAwCiAgICAgICAgICAgIGlmIG9wcG9uZW50LmNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCA+IDA6CiAgICAgICAgICAgICAgICBibG9ja2VycyA9IHJhbmRvbS5yYW5kaW50KAogICAgICAgICAgICAgICAgICAgIDAsIG1pbihvcHBvbmVudC5jcmVhdHVyZXNfb25fYmF0dGxlZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5jcmVhdHVyZXNfb25fYmF0dGxlZmllbGQpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBibG9ja2VkX3Bvd2VyID0gYmxvY2tlcnMgKiByYW5kb20ucmFuZGludCgxLCAzKQoKICAgICAgICAgICAgICAgICMgU29tZSBjcmVhdHVyZXMgZGllIGluIGNvbWJhdAogICAgICAgICAgICAgICAgYXR0YWNraW5nX2RlYXRocyA9IHJhbmRvbS5yYW5kaW50KDAsIG1pbigxLCBibG9ja2VycykpCiAgICAgICAgICAgICAgICBibG9ja2luZ19kZWF0aHMgPSByYW5kb20ucmFuZGludCgwLCBibG9ja2VycykKICAgICAgICAgICAgICAgIHBsYXllci5jcmVhdHVyZXNfb25fYmF0dGxlZmllbGQgPSBtYXgoCiAgICAgICAgICAgICAgICAgICAgMCwgcGxheWVyLmNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCAtIGF0dGFja2luZ19kZWF0aHMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9wcG9uZW50LmNyZWF0dXJlc19vbl9iYXR0bGVmaWVsZCA9IG1heCgKICAgICAgICAgICAgICAgICAgICAwLCBvcHBvbmVudC5jcmVhdHVyZXNfb25fYmF0dGxlZmllbGQgLSBibG9ja2luZ19kZWF0aHMKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBwbGF5ZXIudG90YWxfcG93ZXJfb25fYm9hcmQgPSBtYXgoCiAgICAgICAgICAgICAgICAgICAgMCwgcGxheWVyLnRvdGFsX3Bvd2VyX29uX2JvYXJkIC0gYXR0YWNraW5nX2RlYXRocyAqIDIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9wcG9uZW50LnRvdGFsX3Bvd2VyX29uX2JvYXJkID0gbWF4KAogICAgICAgICAgICAgICAgICAgIDAsIG9wcG9uZW50LnRvdGFsX3Bvd2VyX29uX2JvYXJkIC0gYmxvY2tpbmdfZGVhdGhzICogMgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgb3Bwb25lbnQuY2FyZHNfaW5fZ3JhdmV5YXJkICs9IGJsb2NraW5nX2RlYXRocwogICAgICAgICAgICAgICAgcGxheWVyLmNhcmRzX2luX2dyYXZleWFyZCArPSBhdHRhY2tpbmdfZGVhdGhzCgogICAgICAgICAgICBuZXRfZGFtYWdlID0gbWF4KDAsIGRhbWFnZSAtIGJsb2NrZWRfcG93ZXIpCiAgICAgICAgICAgIG9wcG9uZW50LmxpZmVfdG90YWwgLT0gbmV0X2RhbWFnZQoKICAgICAgICAgICAgIyBDb21tYW5kZXIgZGFtYWdlCiAgICAgICAgICAgIGlmIHBsYXllci5jb21tYW5kZXJfaW5fcGxheSBhbmQgbmV0X2RhbWFnZSA+IDA6CiAgICAgICAgICAgICAgICBjbWRfZG1nID0gcmFuZG9tLnJhbmRpbnQoMSwgbWluKG5ldF9kYW1hZ2UsIDUpKQogICAgICAgICAgICAgICAgb3Bwb25lbnQuY29tbWFuZGVyX2RhbWFnZV90YWtlbiArPSBjbWRfZG1nCgogICAgZWxpZiBhY3Rpb24gPT0gTWFjcm9BY3Rpb24uSE9MRF9NQU5BOgogICAgICAgIHBhc3MgICMgSW50ZW50aW9uYWxseSBob2xkIG1hbmEg4oCUIG5vIHN0YXRlIGNoYW5nZQoKICAgIGVsaWYgYWN0aW9uID09IE1hY3JvQWN0aW9uLlBBU1M6CiAgICAgICAgcGFzcyAgIyBFbmQgc3RlcCDigJQgbm8gc3RhdGUgY2hhbmdlCgogICAgIyBDaGVjayB3aW4gY29uZGl0aW9ucwogICAgaWYgb3Bwb25lbnQubGlmZV90b3RhbCA8PSAwOgogICAgICAgIHN0YXRlLmdhbWVfb3ZlciA9IFRydWUKICAgICAgICBzdGF0ZS53aW5uZXIgPSBwbGF5ZXJfc2VhdAogICAgZWxpZiBvcHBvbmVudC5jb21tYW5kZXJfZGFtYWdlX3Rha2VuID49IDIxOgogICAgICAgIHN0YXRlLmdhbWVfb3ZlciA9IFRydWUKICAgICAgICBzdGF0ZS53aW5uZXIgPSBwbGF5ZXJfc2VhdAoKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBhZHZhbmNlX3R1cm4oc3RhdGU6IEdhbWVTdGF0ZSkgLT4gR2FtZVN0YXRlOgogICAgIiIiQWR2YW5jZSB0byB0aGUgbmV4dCB0dXJuIGluIHRoZSBnYW1lLgoKICAgIEJvdGggcGxheWVyczoKICAgICAgLSBHZXQgbWFuYSA9IHR1cm4gbnVtYmVyIChzaW1wbGlmaWVkKQogICAgICAtIERyYXcgYSBjYXJkCiAgICAiIiIKICAgIHN0YXRlLnR1cm4gKz0g' +
'MQoKICAgICMgQ2hlY2sgZm9yIHRpbWVvdXQKICAgIGlmIHN0YXRlLnR1cm4gPiAyNToKICAgICAgICBzdGF0ZS5nYW1lX292ZXIgPSBUcnVlCiAgICAgICAgc3RhdGUudGltZW91dCA9IFRydWUKICAgICAgICAjIFdob2V2ZXIgaGFzIG1vcmUgbGlmZSB3aW5zLCBvciBkcmF3CiAgICAgICAgaWYgc3RhdGUucGxheWVyc1swXS5saWZlX3RvdGFsID4gc3RhdGUucGxheWVyc1sxXS5saWZlX3RvdGFsOgogICAgICAgICAgICBzdGF0ZS53aW5uZXIgPSAwCiAgICAgICAgZWxpZiBzdGF0ZS5wbGF5ZXJzWzFdLmxpZmVfdG90YWwgPiBzdGF0ZS5wbGF5ZXJzWzBdLmxpZmVfdG90YWw6CiAgICAgICAgICAgIHN0YXRlLndpbm5lciA9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0ZS5kcmF3ID0gVHJ1ZQogICAgICAgIHJldHVybiBzdGF0ZQoKICAgIGZvciBwIGluIHN0YXRlLnBsYXllcnM6CiAgICAgICAgcC5tYW5hX2F2YWlsYWJsZSA9IG1pbihzdGF0ZS50dXJuICsgcmFuZG9tLnJhbmRpbnQoMCwgMiksIDE1KQogICAgICAgIHAuY2FyZHNfaW5faGFuZCArPSAxICAjIERyYXcgZm9yIHR1cm4KCiAgICAjIEFsdGVybmF0ZSBwaGFzZQogICAgc3RhdGUucGhhc2UgPSByYW5kb20uY2hvaWNlKFsibWFpbl8xIiwgIm1haW5fMiJdKQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIGVuY29kZV9zdGF0ZV9zaW1wbGUoCiAgICBzdGF0ZTogR2FtZVN0YXRlLAogICAgYWdlbnRfc2VhdDogaW50LAogICAgcGxheXN0eWxlOiBzdHIgPSAibWlkcmFuZ2UiLAopIC0+IG5wLm5kYXJyYXk6CiAgICAiIiJFbmNvZGUgYSBHYW1lU3RhdGUgaW50byBhIGZsYXQgZmVhdHVyZSB2ZWN0b3IgZm9yIHRoZSBwb2xpY3kgbmV0d29yay4KCiAgICBVc2VzIGFjdHVhbCBzdGF0ZSBkaW1lbnNpb25zIGZyb20gc2NvcGUucHkgdG8gbWF0Y2ggdGhlIHN1cGVydmlzZWQKICAgIHRyYWluaW5nIGZvcm1hdC4gWm9uZXMgYXJlIGZpbGxlZCB3aXRoIHplcm8gZW1iZWRkaW5ncyAobm8gcmVhbCBjYXJkcykuCiAgICAiIiIKICAgIGFnZW50ID0gc3RhdGUucGxheWVyc1thZ2VudF9zZWF0XQogICAgb3BwID0gc3RhdGUucGxheWVyc1sxIC0gYWdlbnRfc2VhdF0KCiAgICAjIC0tLSBHbG9iYWwgRmVhdHVyZXMgKDI5IGRpbXMpIC0tLQogICAgZmVhdHVyZXMgPSBbXQoKICAgICMgUGVyLXBsYXllciBzY2FsYXJzIChhZ2VudCBmaXJzdCwgdGhlbiBvcHBvbmVudCkgw5cgMTQgZWFjaCA9IDI4CiAgICBmb3IgcCwgaXNfYWN0aXZlIGluIFsoYWdlbnQsIGFnZW50X3NlYXQgPT0gc3RhdGUuYWN0aXZlX3NlYXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKG9wcCwgKDEgLSBhZ2VudF9zZWF0KSA9PSBzdGF0ZS5hY3RpdmVfc2VhdCldOgogICAgICAgIGZlYXR1cmVzLmV4dGVuZChbCiAgICAgICAgICAgIHAubGlmZV90b3RhbCAvIDQwLjAsCiAgICAgICAgICAgIHAuY29tbWFuZGVyX2RhbWFnZV90YWtlbiAvIDIxLjAsCiAgICAgICAgICAgIG1pbihwLm1hbmFfYXZhaWxhYmxlLCAyMCkgLyAyMC4wLAogICAgICAgICAgICBtaW4ocC5jb21tYW5kZXJfdGF4LCAxMCkgLyAxMC4wLAogICAgICAgICAgICBtaW4ocC5jYXJkc19pbl9oYW5kLCAxNSkgLyAxNS4wLAogICAgICAgICAgICBtaW4ocC5jYXJkc19pbl9ncmF2ZXlhcmQsIDEwMCkgLyAxMDAuMCwKICAgICAgICAgICAgbWluKHAuY3JlYXR1cmVzX29uX2JhdHRsZWZpZWxkLCAzMCkgLyAzMC4wLAogICAgICAgICAgICBtaW4ocC50b3RhbF9wb3dlcl9vbl9ib2FyZCwgMTAwKSAvIDEwMC4wLAogICAgICAgICAgICBmbG9hdChpc19hY3RpdmUpLAogICAgICAgICAgICBzdGF0ZS50dXJuIC8gMjUuMCwKICAgICAgICBdKQogICAgICAgICMgUGhhc2Ugb25lLWhvdCAoNCBkaW1zKQogICAgICAgIHBoYXNlX2lkeCA9IHsibWFpbl8xIjogMCwgImNvbWJhdCI6IDEsICJtYWluXzIiOiAyLCAiZW5kIjogM30uZ2V0KAogICAgICAgICAgICBzdGF0ZS5waGFzZSwgMAogICAgICAgICkKICAgICAgICBwaGFzZV92ZWMgPSBbMC4wXSAqIDQKICAgICAgICBwaGFzZV92ZWNbcGhhc2VfaWR4XSA9IDEuMAogICAgICAgIGZlYXR1cmVzLmV4dGVuZChwaGFzZV92ZWMpCgogICAgIyBUdXJuIG51bWJlciAoMSBkaW0pCiAgICBmZWF0dXJlcy5hcHBlbmQoc3RhdGUudHVybiAvIDI1LjApCgogICAgIyAtLS0gWm9uZSBFbWJlZGRpbmdzICg2MTQ0IGRpbXMpIOKAlCB6ZXJvcyBmb3Igc3ludGhldGljIC0tLQogICAgem9uZV9kaW1zID0gU1RBVEVfRElNUy50b3RhbF96b25l' +
'X2RpbSAgIyA2MTQ0CiAgICBmZWF0dXJlcy5leHRlbmQoWzAuMF0gKiB6b25lX2RpbXMpCgogICAgIyAtLS0gUGxheXN0eWxlIE9uZS1Ib3QgKDQgZGltcykgLS0tCiAgICBwc19pZHggPSB7ImFnZ3JvIjogMCwgImNvbnRyb2wiOiAxLCAibWlkcmFuZ2UiOiAyLCAiY29tYm8iOiAzfS5nZXQoCiAgICAgICAgcGxheXN0eWxlLCAyCiAgICApCiAgICBwc192ZWMgPSBbMC4wXSAqIDQKICAgIHBzX3ZlY1twc19pZHhdID0gMS4wCiAgICBmZWF0dXJlcy5leHRlbmQocHNfdmVjKQoKICAgIHJldHVybiBucC5hcnJheShmZWF0dXJlcywgZHR5cGU9bnAuZmxvYXQzMikKCgpjbGFzcyBSYW5kb21Qb2xpY3k6CiAgICAiIiJVbmlmb3JtIHJhbmRvbSBhY3Rpb24gc2VsZWN0aW9uIChiYXNlbGluZSBvcHBvbmVudCkuIiIiCgogICAgZGVmIHNlbGVjdF9hY3Rpb24oc2VsZiwgc3RhdGVfdmVjOiBucC5uZGFycmF5KSAtPiBUdXBsZVtpbnQsIGZsb2F0XToKICAgICAgICAiIiJSZXR1cm5zIChhY3Rpb25faW5kZXgsIGxvZ19wcm9iKS4iIiIKICAgICAgICBhY3Rpb24gPSByYW5kb20ucmFuZGludCgwLCBOVU1fQUNUSU9OUyAtIDEpCiAgICAgICAgbG9nX3Byb2IgPSAtbnAubG9nKE5VTV9BQ1RJT05TKQogICAgICAgIHJldHVybiBhY3Rpb24sIGxvZ19wcm9iCgoKY2xhc3MgSGV1cmlzdGljUG9saWN5OgogICAgIiIiU2ltcGxlIGhldXJpc3RpYyBvcHBvbmVudCB0aGF0IG1ha2VzIHJlYXNvbmFibGUtaXNoIGRlY2lzaW9ucy4iIiIKCiAgICBkZWYgc2VsZWN0X2FjdGlvbihzZWxmLCBzdGF0ZV92ZWM6IG5wLm5kYXJyYXkpIC0+IFR1cGxlW2ludCwgZmxvYXRdOgogICAgICAgICIiIlJldHVybnMgKGFjdGlvbl9pbmRleCwgbG9nX3Byb2IpLiIiIgogICAgICAgICMgRXh0cmFjdCBrZXkgZmVhdHVyZXMgZnJvbSB0aGUgc3RhdGUgdmVjdG9yCiAgICAgICAgIyBhZ2VudF9saWZlID0gc3RhdGVfdmVjWzBdICogNDAgKGluZGV4IDAgaW4gdGhlIGZsYXQgdmVjdG9yKQogICAgICAgICMgYWdlbnRfbWFuYSA9IHN0YXRlX3ZlY1syXSAqIDIwIChpbmRleCAyKQogICAgICAgICMgYWdlbnRfY3JlYXR1cmVzID0gc3RhdGVfdmVjWzZdICogMzAgKGluZGV4IDYpCiAgICAgICAgIyBhZ2VudF9oYW5kID0gc3RhdGVfdmVjWzRdICogMTUgKGluZGV4IDQpCgogICAgICAgIG1hbmEgPSBzdGF0ZV92ZWNbMl0gKiAyMAogICAgICAgIGNyZWF0dXJlcyA9IHN0YXRlX3ZlY1s2XSAqIDMwCiAgICAgICAgaGFuZCA9IHN0YXRlX3ZlY1s0XSAqIDE1CgogICAgICAgICMgU2ltcGxlIGRlY2lzaW9uIHJ1bGVzCiAgICAgICAgd2VpZ2h0cyA9IG5wLm9uZXMoTlVNX0FDVElPTlMpICogMC41CgogICAgICAgIGlmIG1hbmEgPj0gMjoKICAgICAgICAgICAgd2VpZ2h0c1tBQ1RJT05fVE9fSURYW01hY3JvQWN0aW9uLkNBU1RfQ1JFQVRVUkVdXSA9IDMuMAogICAgICAgIGlmIG1hbmEgPj0gMiBhbmQgaGFuZCA8PSAzOgogICAgICAgICAgICB3ZWlnaHRzW0FDVElPTl9UT19JRFhbTWFjcm9BY3Rpb24uQ0FTVF9EUkFXXV0gPSAyLjUKICAgICAgICBpZiBtYW5hID49IDEgYW5kIG1hbmEgPD0gNDoKICAgICAgICAgICAgd2VpZ2h0c1tBQ1RJT05fVE9fSURYW01hY3JvQWN0aW9uLkNBU1RfUkFNUF1dID0gMi4wCiAgICAgICAgaWYgY3JlYXR1cmVzID49IDI6CiAgICAgICAgICAgIHdlaWdodHNbQUNUSU9OX1RPX0lEWFtNYWNyb0FjdGlvbi5BVFRBQ0tfT1BQT05FTlRdXSA9IDQuMAogICAgICAgIGlmIG1hbmEgPj0gNToKICAgICAgICAgICAgd2VpZ2h0c1tBQ1RJT05fVE9fSURYW01hY3JvQWN0aW9uLkNBU1RfQ09NTUFOREVSXV0gPSAyLjAKICAgICAgICBpZiBtYW5hIDwgMjoKICAgICAgICAgICAgd2VpZ2h0c1tBQ1RJT05fVE9fSURYW01hY3JvQWN0aW9uLlBBU1NdXSA9IDMuMAoKICAgICAgICAjIE5vcm1hbGl6ZSB0byBwcm9iYWJpbGl0aWVzCiAgICAgICAgcHJvYnMgPSB3ZWlnaHRzIC8gd2VpZ2h0cy5zdW0oKQogICAgICAgIGFjdGlvbiA9IG5wLnJhbmRvbS5jaG9pY2UoTlVNX0FDVElPTlMsIHA9cHJvYnMpCiAgICAgICAgbG9nX3Byb2IgPSBucC5sb2cocHJvYnNbYWN0aW9uXSArIDFlLTgpCgogICAgICAgIHJldHVybiBpbnQoYWN0aW9uKSwgZmxvYXQobG9nX3Byb2IpCgoKZGVmIHJ1bl9zZWxmX3BsYXlfZXBpc29kZSgKICAgIGFnZW50X21vZGVsLAogICAgb3Bwb25lbnRfcG9saWN5LAogICAgYWdlbnRfc2VhdDogaW50ID0gMCwKICAgIHBsYXlzdHlsZTogc3RyID0gIm1pZHJhbmdlIiwKICAgIG1h' +
'eF9zdGVwczogaW50ID0gNTAsCiAgICByZXdhcmRfY29uZmlnOiBSZXdhcmRDb25maWcgPSBOb25lLAopIC0+IExpc3RbZGljdF06CiAgICAiIiJSdW4gYSBzaW5nbGUgc2VsZi1wbGF5IGVwaXNvZGUgYW5kIHJldHVybiB0aGUgdHJhamVjdG9yeS4KCiAgICBBcmdzOgogICAgICAgIGFnZW50X21vZGVsOiBQb2xpY3lWYWx1ZU5ldHdvcmsgd2l0aCBmb3J3YXJkX3dpdGhfdmFsdWUgbWV0aG9kLgogICAgICAgICAgICAgICAgICAgIElmIE5vbmUsIHVzZXMgcmFuZG9tIHBvbGljeSBmb3IgdGhlIGFnZW50IHRvby4KICAgICAgICBvcHBvbmVudF9wb2xpY3k6IFBvbGljeSBvYmplY3Qgd2l0aCBzZWxlY3RfYWN0aW9uKHN0YXRlX3ZlYykgbWV0aG9kCiAgICAgICAgYWdlbnRfc2VhdDogQWdlbnQncyBwbGF5ZXIgc2VhdCAoMCBvciAxKQogICAgICAgIHBsYXlzdHlsZTogUGxheXN0eWxlIGZvciBzdGF0ZSBlbmNvZGluZwogICAgICAgIG1heF9zdGVwczogTWF4aW11bSBkZWNpc2lvbiBzdGVwcyBwZXIgZXBpc29kZQogICAgICAgIHJld2FyZF9jb25maWc6IFJld2FyZCBjb25maWd1cmF0aW9uCgogICAgUmV0dXJuczoKICAgICAgICBMaXN0IG9mIHN0ZXAgZGljdHM6IFt7c3RhdGUsIGFjdGlvbiwgcmV3YXJkLCB2YWx1ZSwgbG9nX3Byb2IsIGRvbmV9LCAuLi5dCiAgICAiIiIKICAgIHRyeToKICAgICAgICBpbXBvcnQgdG9yY2gKICAgICAgICBpbXBvcnQgdG9yY2gubm4uZnVuY3Rpb25hbCBhcyBGCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlB5VG9yY2ggcmVxdWlyZWQgZm9yIHNlbGYtcGxheSIpCgogICAgc3RhdGUgPSBjcmVhdGVfcmFuZG9tX2luaXRpYWxfc3RhdGUoKQogICAgdHJhamVjdG9yeSA9IFtdCiAgICBvcHBfc2VhdCA9IDEgLSBhZ2VudF9zZWF0CiAgICBjZmcgPSByZXdhcmRfY29uZmlnIG9yIFJld2FyZENvbmZpZygpCgogICAgZm9yIHN0ZXAgaW4gcmFuZ2UobWF4X3N0ZXBzKToKICAgICAgICBpZiBzdGF0ZS5nYW1lX292ZXI6CiAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHByZXZfc25hcHNob3QgPSBzdGF0ZS50b19zbmFwc2hvdCgpCgogICAgICAgICMgQWdlbnQncyB0dXJuCiAgICAgICAgc3RhdGVfdmVjID0gZW5jb2RlX3N0YXRlX3NpbXBsZShzdGF0ZSwgYWdlbnRfc2VhdCwgcGxheXN0eWxlKQoKICAgICAgICBpZiBhZ2VudF9tb2RlbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyBEZXRlY3QgZGV2aWNlIGZyb20gbW9kZWwgcGFyYW1ldGVycyAoZS5nLiBjdWRhOjApCiAgICAgICAgICAgIF9kZXZpY2UgPSBuZXh0KGFnZW50X21vZGVsLnBhcmFtZXRlcnMoKSkuZGV2aWNlCiAgICAgICAgICAgIHN0YXRlX3RlbnNvciA9IHRvcmNoLmZyb21fbnVtcHkoc3RhdGVfdmVjKS51bnNxdWVlemUoMCkudG8oX2RldmljZSkKICAgICAgICAgICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgICAgICAgICBsb2dpdHMsIHZhbHVlID0gYWdlbnRfbW9kZWwuZm9yd2FyZF93aXRoX3ZhbHVlKHN0YXRlX3RlbnNvcikKICAgICAgICAgICAgICAgIHByb2JzID0gRi5zb2Z0bWF4KGxvZ2l0cywgZGltPS0xKQogICAgICAgICAgICAgICAgZGlzdCA9IHRvcmNoLmRpc3RyaWJ1dGlvbnMuQ2F0ZWdvcmljYWwocHJvYnMpCiAgICAgICAgICAgICAgICBhY3Rpb24gPSBkaXN0LnNhbXBsZSgpCiAgICAgICAgICAgICAgICBsb2dfcHJvYiA9IGRpc3QubG9nX3Byb2IoYWN0aW9uKQoKICAgICAgICAgICAgICAgIGFjdGlvbl9pZHggPSBhY3Rpb24uaXRlbSgpCiAgICAgICAgICAgICAgICB2YWx1ZV9zY2FsYXIgPSB2YWx1ZS5pdGVtKCkKICAgICAgICAgICAgICAgIGxvZ19wcm9iX3NjYWxhciA9IGxvZ19wcm9iLml0ZW0oKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFjdGlvbl9pZHggPSByYW5kb20ucmFuZGludCgwLCBOVU1fQUNUSU9OUyAtIDEpCiAgICAgICAgICAgIHZhbHVlX3NjYWxhciA9IDAuMAogICAgICAgICAgICBsb2dfcHJvYl9zY2FsYXIgPSAtbnAubG9nKE5VTV9BQ1RJT05TKQoKICAgICAgICAjIEFwcGx5IGFnZW50J3MgYWN0aW9uCiAgICAgICAgc3RhdGUgPSBhcHBseV9hY3Rpb24oc3RhdGUsIGFjdGlvbl9pZHgsIGFnZW50X3NlYXQpCgogICAgICAgIGlmIHN0YXRlLmdhbWVfb3ZlcjoKICAgICAgICAgICAgY3Vycl9zbmFwc2hvdCA9IHN0YXRlLnRvX3NuYXBzaG90KCkKICAgICAgICAgICAgcmV3YXJkID0gY29tcHV0ZV9pbnRlcm1lZGlhdGVfcmV3YXJkKAogICAgICAgICAg' +
'ICAgICAgcHJldl9zbmFwc2hvdCwgY3Vycl9zbmFwc2hvdCwgSURYX1RPX0FDVElPTlthY3Rpb25faWR4XS52YWx1ZSwKICAgICAgICAgICAgICAgIGFnZW50X3NlYXQsIGNmZwogICAgICAgICAgICApCiAgICAgICAgICAgIHdvbiA9IHN0YXRlLndpbm5lciA9PSBhZ2VudF9zZWF0CiAgICAgICAgICAgIHJld2FyZCArPSBjb21wdXRlX3Rlcm1pbmFsX3Jld2FyZCh3b24sIHN0YXRlLmRyYXcsIHN0YXRlLnRpbWVvdXQsIGNmZykKCiAgICAgICAgICAgIHRyYWplY3RvcnkuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJzdGF0ZSI6IHN0YXRlX3ZlYywKICAgICAgICAgICAgICAgICJhY3Rpb24iOiBhY3Rpb25faWR4LAogICAgICAgICAgICAgICAgInJld2FyZCI6IHJld2FyZCwKICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlX3NjYWxhciwKICAgICAgICAgICAgICAgICJsb2dfcHJvYiI6IGxvZ19wcm9iX3NjYWxhciwKICAgICAgICAgICAgICAgICJkb25lIjogVHJ1ZSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBPcHBvbmVudCdzIHR1cm4KICAgICAgICBvcHBfc3RhdGVfdmVjID0gZW5jb2RlX3N0YXRlX3NpbXBsZShzdGF0ZSwgb3BwX3NlYXQsICJtaWRyYW5nZSIpCiAgICAgICAgb3BwX2FjdGlvbiwgXyA9IG9wcG9uZW50X3BvbGljeS5zZWxlY3RfYWN0aW9uKG9wcF9zdGF0ZV92ZWMpCiAgICAgICAgc3RhdGUgPSBhcHBseV9hY3Rpb24oc3RhdGUsIG9wcF9hY3Rpb24sIG9wcF9zZWF0KQoKICAgICAgICBjdXJyX3NuYXBzaG90ID0gc3RhdGUudG9fc25hcHNob3QoKQoKICAgICAgICBpZiBzdGF0ZS5nYW1lX292ZXI6CiAgICAgICAgICAgIHJld2FyZCA9IGNvbXB1dGVfaW50ZXJtZWRpYXRlX3Jld2FyZCgKICAgICAgICAgICAgICAgIHByZXZfc25hcHNob3QsIGN1cnJfc25hcHNob3QsIElEWF9UT19BQ1RJT05bYWN0aW9uX2lkeF0udmFsdWUsCiAgICAgICAgICAgICAgICBhZ2VudF9zZWF0LCBjZmcKICAgICAgICAgICAgKQogICAgICAgICAgICB3b24gPSBzdGF0ZS53aW5uZXIgPT0gYWdlbnRfc2VhdAogICAgICAgICAgICByZXdhcmQgKz0gY29tcHV0ZV90ZXJtaW5hbF9yZXdhcmQod29uLCBzdGF0ZS5kcmF3LCBzdGF0ZS50aW1lb3V0LCBjZmcpCgogICAgICAgICAgICB0cmFqZWN0b3J5LmFwcGVuZCh7CiAgICAgICAgICAgICAgICAic3RhdGUiOiBzdGF0ZV92ZWMsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogYWN0aW9uX2lkeCwKICAgICAgICAgICAgICAgICJyZXdhcmQiOiByZXdhcmQsCiAgICAgICAgICAgICAgICAidmFsdWUiOiB2YWx1ZV9zY2FsYXIsCiAgICAgICAgICAgICAgICAibG9nX3Byb2IiOiBsb2dfcHJvYl9zY2FsYXIsCiAgICAgICAgICAgICAgICAiZG9uZSI6IFRydWUsCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIGJyZWFrCgogICAgICAgICMgSW50ZXJtZWRpYXRlIHJld2FyZAogICAgICAgIHJld2FyZCA9IGNvbXB1dGVfaW50ZXJtZWRpYXRlX3Jld2FyZCgKICAgICAgICAgICAgcHJldl9zbmFwc2hvdCwgY3Vycl9zbmFwc2hvdCwgSURYX1RPX0FDVElPTlthY3Rpb25faWR4XS52YWx1ZSwKICAgICAgICAgICAgYWdlbnRfc2VhdCwgY2ZnCiAgICAgICAgKQoKICAgICAgICB0cmFqZWN0b3J5LmFwcGVuZCh7CiAgICAgICAgICAgICJzdGF0ZSI6IHN0YXRlX3ZlYywKICAgICAgICAgICAgImFjdGlvbiI6IGFjdGlvbl9pZHgsCiAgICAgICAgICAgICJyZXdhcmQiOiByZXdhcmQsCiAgICAgICAgICAgICJ2YWx1ZSI6IHZhbHVlX3NjYWxhciwKICAgICAgICAgICAgImxvZ19wcm9iIjogbG9nX3Byb2Jfc2NhbGFyLAogICAgICAgICAgICAiZG9uZSI6IEZhbHNlLAogICAgICAgIH0pCgogICAgICAgICMgQWR2YW5jZSB0dXJuCiAgICAgICAgc3RhdGUgPSBhZHZhbmNlX3R1cm4oc3RhdGUpCgogICAgcmV0dXJuIHRyYWplY3RvcnkKCgpkZWYgY29sbGVjdF9yb2xsb3V0cygKICAgIGFnZW50X21vZGVsLAogICAgb3Bwb25lbnRfcG9saWN5LAogICAgYnVmZmVyLAogICAgbnVtX2VwaXNvZGVzOiBpbnQgPSA2NCwKICAgIHBsYXlzdHlsZTogc3RyID0gIm1pZHJhbmdlIiwKICAgIHJld2FyZF9jb25maWc6IFJld2FyZENvbmZpZyA9IE5vbmUsCikgLT4gZGljdDoKICAgICIiIkNvbGxlY3QgbXVsdGlwbGUgc2VsZi1wbGF5IGVwaXNvZGVzIGludG8gYSByb2xsb3V0IGJ1ZmZlci4KCiAgICBBcmdzOgogICAgICAgIGFnZW50X21vZGVsOiBQb2xpY3lWYWx1ZU5ldHdvcmsgKG9yIE5vbmUgZm9y' +
'IHJhbmRvbSBhZ2VudCkKICAgICAgICBvcHBvbmVudF9wb2xpY3k6IE9wcG9uZW50IHBvbGljeSBvYmplY3QKICAgICAgICBidWZmZXI6IFJvbGxvdXRCdWZmZXIgdG8gZmlsbAogICAgICAgIG51bV9lcGlzb2RlczogTnVtYmVyIG9mIGVwaXNvZGVzIHRvIGNvbGxlY3QKICAgICAgICBwbGF5c3R5bGU6IEFnZW50IHBsYXlzdHlsZQogICAgICAgIHJld2FyZF9jb25maWc6IFJld2FyZCBjb25maWd1cmF0aW9uCgogICAgUmV0dXJuczoKICAgICAgICBDb2xsZWN0aW9uIHN0YXRpc3RpY3MgZGljdAogICAgIiIiCiAgICBidWZmZXIucmVzZXQoKQogICAgdG90YWxfd2lucyA9IDAKICAgIHRvdGFsX2xvc3NlcyA9IDAKICAgIHRvdGFsX2RyYXdzID0gMAogICAgdG90YWxfc3RlcHMgPSAwCiAgICB0b3RhbF9yZXdhcmRzID0gMC4wCgogICAgZm9yIGVwIGluIHJhbmdlKG51bV9lcGlzb2Rlcyk6CiAgICAgICAgIyBBbHRlcm5hdGUgYWdlbnQgc2VhdCBmb3IgYmFsYW5jZWQgdHJhaW5pbmcKICAgICAgICBhZ2VudF9zZWF0ID0gZXAgJSAyCgogICAgICAgIHRyYWplY3RvcnkgPSBydW5fc2VsZl9wbGF5X2VwaXNvZGUoCiAgICAgICAgICAgIGFnZW50X21vZGVsPWFnZW50X21vZGVsLAogICAgICAgICAgICBvcHBvbmVudF9wb2xpY3k9b3Bwb25lbnRfcG9saWN5LAogICAgICAgICAgICBhZ2VudF9zZWF0PWFnZW50X3NlYXQsCiAgICAgICAgICAgIHBsYXlzdHlsZT1wbGF5c3R5bGUsCiAgICAgICAgICAgIHJld2FyZF9jb25maWc9cmV3YXJkX2NvbmZpZywKICAgICAgICApCgogICAgICAgIGZvciBzdGVwIGluIHRyYWplY3Rvcnk6CiAgICAgICAgICAgIGJ1ZmZlci5hZGQoCiAgICAgICAgICAgICAgICBzdGF0ZT1zdGVwWyJzdGF0ZSJdLAogICAgICAgICAgICAgICAgYWN0aW9uPXN0ZXBbImFjdGlvbiJdLAogICAgICAgICAgICAgICAgcmV3YXJkPXN0ZXBbInJld2FyZCJdLAogICAgICAgICAgICAgICAgdmFsdWU9c3RlcFsidmFsdWUiXSwKICAgICAgICAgICAgICAgIGxvZ19wcm9iPXN0ZXBbImxvZ19wcm9iIl0sCiAgICAgICAgICAgICAgICBkb25lPXN0ZXBbImRvbmUiXSwKICAgICAgICAgICAgKQogICAgICAgICAgICB0b3RhbF9yZXdhcmRzICs9IHN0ZXBbInJld2FyZCJdCgogICAgICAgIHRvdGFsX3N0ZXBzICs9IGxlbih0cmFqZWN0b3J5KQoKICAgICAgICAjIFRyYWNrIG91dGNvbWVzCiAgICAgICAgaWYgdHJhamVjdG9yeSBhbmQgdHJhamVjdG9yeVstMV1bImRvbmUiXToKICAgICAgICAgICAgZmluYWxfcmV3YXJkID0gdHJhamVjdG9yeVstMV1bInJld2FyZCJdCiAgICAgICAgICAgIGlmIGZpbmFsX3Jld2FyZCA+IDAuNToKICAgICAgICAgICAgICAgIHRvdGFsX3dpbnMgKz0gMQogICAgICAgICAgICBlbGlmIGZpbmFsX3Jld2FyZCA8IC0wLjU6CiAgICAgICAgICAgICAgICB0b3RhbF9sb3NzZXMgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdG90YWxfZHJhd3MgKz0gMQoKICAgICMgQ29tcHV0ZSBHQUUgYWZ0ZXIgY29sbGVjdGlvbgogICAgYnVmZmVyLmNvbXB1dGVfcmV0dXJuc19hbmRfYWR2YW50YWdlcyhsYXN0X3ZhbHVlPTAuMCkKCiAgICByZXR1cm4gewogICAgICAgICJlcGlzb2RlcyI6IG51bV9lcGlzb2RlcywKICAgICAgICAic3RlcHMiOiB0b3RhbF9zdGVwcywKICAgICAgICAiYXZnX3N0ZXBzX3Blcl9lcCI6IHRvdGFsX3N0ZXBzIC8gbWF4KG51bV9lcGlzb2RlcywgMSksCiAgICAgICAgInRvdGFsX3Jld2FyZCI6IHRvdGFsX3Jld2FyZHMsCiAgICAgICAgImF2Z19yZXdhcmRfcGVyX2VwIjogdG90YWxfcmV3YXJkcyAvIG1heChudW1fZXBpc29kZXMsIDEpLAogICAgICAgICJ3aW5zIjogdG90YWxfd2lucywKICAgICAgICAibG9zc2VzIjogdG90YWxfbG9zc2VzLAogICAgICAgICJkcmF3cyI6IHRvdGFsX2RyYXdzLAogICAgICAgICJ3aW5fcmF0ZSI6IHRvdGFsX3dpbnMgLyBtYXgobnVtX2VwaXNvZGVzLCAxKSwKICAgICAgICAiYnVmZmVyX3NpemUiOiBidWZmZXIuc2l6ZSwKICAgIH0K'
Install-B64 -R 'ml\training\self_play.py' -B $b
# ml/training/trainer.py (25,210 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFN1cGVydmlzZWQgUG9saWN5IFRyYWluZXIK4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQClRyYWlucyB0aGUgUG9saWN5TmV0d29yayBvbiBsYWJlbGVkIGRlY2lzaW9uIGRhdGEgdXNpbmcKY3Jvc3MtZW50cm9weSBsb3NzIHdpdGggY2xhc3Mtd2VpZ2h0IGJhbGFuY2luZy4KCkZlYXR1cmVzOgogIC0gQ2xhc3Mgd2VpZ2h0aW5nIHRvIGhhbmRsZSBpbWJhbGFuY2VkIGFjdGlvbiBkaXN0cmlidXRpb24KICAtIENvc2luZSBhbm5lYWxpbmcgTFIgc2NoZWR1bGUgd2l0aCB3YXJtdXAKICAtIEVhcmx5IHN0b3BwaW5nIG9uIHZhbGlkYXRpb24gbG9zcwogIC0gUGVyLWNsYXNzIGFjY3VyYWN5IHRyYWNraW5nCiAgLSBQZXJpb2RpYyBjaGVja3BvaW50IHNhdmluZyAoYmVzdCArIGV2ZXJ5IE4gZXBvY2hzKQogIC0gQ1VEQS9NUFMvQ1BVIGF1dG8tZGV0ZWN0aW9uCgpVc2FnZToKICAgIHB5dGhvbiAtbSBtbC50cmFpbmluZy50cmFpbmVyIC0tZGF0YS1kaXIgbWwvbW9kZWxzIC0tZXBvY2hzIDUwCiAgICBweXRob24gLW0gbWwudHJhaW5pbmcudHJhaW5lciAtLWRhdGEtZGlyIG1sL21vZGVscyAtLWxyIDVlLTQgLS1iYXRjaC1zaXplIDEyOAoiIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgdGltZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIExpc3QsIE9wdGlvbmFsLCBUdXBsZQoKaW1wb3J0IG51bXB5IGFzIG5wCgojIENvbmRpdGlvbmFsIHRvcmNoIGltcG9ydAp0cnk6CiAgICBpbXBvcnQgdG9yY2gKICAgIGltcG9ydCB0b3JjaC5ubiBhcyBubgogICAgaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgogICAgZnJvbSB0b3JjaC51dGlscy5kYXRhIGltcG9ydCBEYXRhTG9hZGVyLCBUZW5zb3JEYXRhc2V0CiAgICBUT1JDSF9BVkFJTEFCTEUgPSBUcnVlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIFRPUkNIX0FWQUlMQUJMRSA9IEZhbHNlCgpwcm9qZWN0X3Jvb3QgPSBzdHIoUGF0aChfX2ZpbGVfXykucGFyZW50LnBhcmVudC5wYXJlbnQpCmlmIHByb2plY3Rfcm9vdCBub3QgaW4gc3lzLnBhdGg6CiAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9yb290KQoKZnJvbSBtbC5jb25maWcuc2NvcGUgaW1wb3J0ICgKICAgIE5VTV9BQ1RJT05TLCBTVEFURV9ESU1TLCBJRFhfVE9fQUNUSU9OLCBUUkFJTklOR19DT05GSUcsCikKZnJvbSBtbC50cmFpbmluZy5wb2xpY3lfbmV0d29yayBpbXBvcnQgKAogICAgUG9saWN5TmV0d29yaywgc2F2ZV9jaGVja3BvaW50LCBsb2FkX2NoZWNrcG9pbnQsCikKCmxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBmb3JtYXQ9IlslKG5hbWUpc10gJShtZXNzYWdlKXMiKQpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigibWwudHJhaW5lciIpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBEYXRhc2V0IExvYWRpbmcKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmRlZiBsb2FkX25wel9zcGxpdChwYXRoOiBzdHIpIC0+IFR1cGxlW25wLm5kYXJyYXksIG5wLm5kYXJyYXldOgogICAgIiIiTG9hZCBzdGF0ZXMgYW5kIGxhYmVscyBmcm9tIGFuIE5QWiBmaWxlLiIiIgogICAgZGF0YSA9IG5wLmxvYWQocGF0aCwgYWxsb3dfcGlja2xlPVRydWUpCiAgICBzdGF0ZXMgPSBkYXRhWyJzdGF0ZXMiXS5hc3R5cGUobnAuZmxvYXQzMikKICAgIGxhYmVscyA9IGRhdGFbImxhYmVscyJdLmFzdHlwZShucC5pbnQ2NCkKICAgIHJldHVybiBzdGF0ZXMsIGxhYmVscwoKCmRlZiBtYWtlX2RhdGFsb2FkZXIoCiAg' +
'ICBzdGF0ZXM6IG5wLm5kYXJyYXksCiAgICBsYWJlbHM6IG5wLm5kYXJyYXksCiAgICBiYXRjaF9zaXplOiBpbnQsCiAgICBzaHVmZmxlOiBib29sID0gVHJ1ZSwKICAgIGRldmljZTogc3RyID0gImNwdSIsCikgLT4gRGF0YUxvYWRlcjoKICAgICIiIkNyZWF0ZSBhIFB5VG9yY2ggRGF0YUxvYWRlciBmcm9tIG51bXB5IGFycmF5cy4iIiIKICAgIHN0YXRlX3RlbnNvciA9IHRvcmNoLmZyb21fbnVtcHkoc3RhdGVzKQogICAgbGFiZWxfdGVuc29yID0gdG9yY2guZnJvbV9udW1weShsYWJlbHMpCiAgICBkYXRhc2V0ID0gVGVuc29yRGF0YXNldChzdGF0ZV90ZW5zb3IsIGxhYmVsX3RlbnNvcikKICAgIHJldHVybiBEYXRhTG9hZGVyKAogICAgICAgIGRhdGFzZXQsCiAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaF9zaXplLAogICAgICAgIHNodWZmbGU9c2h1ZmZsZSwKICAgICAgICBwaW5fbWVtb3J5PShkZXZpY2UgIT0gImNwdSIpLAogICAgICAgIGRyb3BfbGFzdD1GYWxzZSwKICAgICkKCgpkZWYgY29tcHV0ZV9jbGFzc193ZWlnaHRzKGxhYmVsczogbnAubmRhcnJheSwgbnVtX2NsYXNzZXM6IGludCkgLT4gdG9yY2guVGVuc29yOgogICAgIiIiCiAgICBDb21wdXRlIGludmVyc2UtZnJlcXVlbmN5IGNsYXNzIHdlaWdodHMgZm9yIGNyb3NzLWVudHJvcHkuCgogICAgVXNlcyBzbW9vdGhlZCBpbnZlcnNlIGZyZXF1ZW5jeToKICAgICAgICB3X2MgPSBOIC8gKG51bV9jbGFzc2VzICogY291bnRfYykKICAgIENhcHBlZCBhdCAxMMOXIHRvIHByZXZlbnQgZXh0cmVtZSB3ZWlnaHRzIG9uIHJhcmUgY2xhc3Nlcy4KICAgICIiIgogICAgY291bnRzID0gbnAuYmluY291bnQobGFiZWxzLCBtaW5sZW5ndGg9bnVtX2NsYXNzZXMpLmFzdHlwZShucC5mbG9hdDY0KQogICAgIyBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvIGZvciBjbGFzc2VzIHdpdGggbm8gc2FtcGxlcwogICAgY291bnRzID0gbnAubWF4aW11bShjb3VudHMsIDEuMCkKICAgIG4gPSBsZW4obGFiZWxzKQogICAgd2VpZ2h0cyA9IG4gLyAobnVtX2NsYXNzZXMgKiBjb3VudHMpCiAgICAjIENhcCBleHRyZW1lIHdlaWdodHMKICAgIHdlaWdodHMgPSBucC5taW5pbXVtKHdlaWdodHMsIDEwLjApCiAgICByZXR1cm4gdG9yY2guZnJvbV9udW1weSh3ZWlnaHRzKS5mbG9hdCgpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBUcmFpbmluZyBMb29wCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBTdXBlcnZpc2VkVHJhaW5lcjoKICAgICIiIgogICAgVHJhaW5zIFBvbGljeU5ldHdvcmsgd2l0aCBjcm9zcy1lbnRyb3B5IG9uIGV4cGVydCBkZWNpc2lvbiBkYXRhLgoKICAgIEZlYXR1cmVzOgogICAgICAtIENsYXNzLXdlaWdodGVkIGxvc3MgZm9yIGltYmFsYW5jZWQgYWN0aW9ucwogICAgICAtIENvc2luZSBhbm5lYWxpbmcgd2l0aCBsaW5lYXIgd2FybXVwCiAgICAgIC0gRWFybHkgc3RvcHBpbmcgb24gdmFsaWRhdGlvbiBsb3NzCiAgICAgIC0gQmVzdC1tb2RlbCBhbmQgcGVyaW9kaWMgY2hlY2twb2ludGluZwogICAgICAtIERldGFpbGVkIHBlci1lcG9jaCBtZXRyaWNzCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICBtb2RlbDogUG9saWN5TmV0d29yaywKICAgICAgICBkZXZpY2U6IHN0ciA9ICJjcHUiLAogICAgICAgIGxlYXJuaW5nX3JhdGU6IGZsb2F0ID0gTm9uZSwKICAgICAgICBiYXRjaF9zaXplOiBpbnQgPSBOb25lLAogICAgICAgIGVwb2NoczogaW50ID0gTm9uZSwKICAgICAgICBwYXRpZW5jZTogaW50ID0gTm9uZSwKICAgICAgICBjaGVja3BvaW50X2Rpcjogc3RyID0gTm9uZSwKICAgICAgICB3YXJtdXBfZXBvY2hzOiBpbnQgPSAzLAogICAgICAgIHNhdmVfZXZlcnk6IGludCA9IDEwLAogICAgKToKICAgICAgICBzZWxmLm1vZGVsID0gbW9kZWwudG8oZGV2aWNlKQogICAgICAgIHNlbGYuZGV2aWNlID0gZGV2' +
'aWNlCiAgICAgICAgc2VsZi5sciA9IGxlYXJuaW5nX3JhdGUgb3IgVFJBSU5JTkdfQ09ORklHLmxlYXJuaW5nX3JhdGUKICAgICAgICBzZWxmLmJhdGNoX3NpemUgPSBiYXRjaF9zaXplIG9yIFRSQUlOSU5HX0NPTkZJRy5iYXRjaF9zaXplCiAgICAgICAgc2VsZi5lcG9jaHMgPSBlcG9jaHMgb3IgVFJBSU5JTkdfQ09ORklHLmVwb2NocwogICAgICAgIHNlbGYucGF0aWVuY2UgPSBwYXRpZW5jZSBvciBUUkFJTklOR19DT05GSUcuZWFybHlfc3RvcF9wYXRpZW5jZQogICAgICAgIHNlbGYuY2hlY2twb2ludF9kaXIgPSBjaGVja3BvaW50X2RpciBvciBUUkFJTklOR19DT05GSUcuY2hlY2twb2ludF9kaXIKICAgICAgICBzZWxmLndhcm11cF9lcG9jaHMgPSB3YXJtdXBfZXBvY2hzCiAgICAgICAgc2VsZi5zYXZlX2V2ZXJ5ID0gc2F2ZV9ldmVyeQoKICAgICAgICAjIFdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gdHJhaW4oKQogICAgICAgIHNlbGYub3B0aW1pemVyID0gTm9uZQogICAgICAgIHNlbGYuc2NoZWR1bGVyID0gTm9uZQogICAgICAgIHNlbGYuY3JpdGVyaW9uID0gTm9uZQogICAgICAgIHNlbGYuaGlzdG9yeTogTGlzdFtEaWN0XSA9IFtdCgogICAgZGVmIHRyYWluKAogICAgICAgIHNlbGYsCiAgICAgICAgdHJhaW5fc3RhdGVzOiBucC5uZGFycmF5LAogICAgICAgIHRyYWluX2xhYmVsczogbnAubmRhcnJheSwKICAgICAgICB2YWxfc3RhdGVzOiBucC5uZGFycmF5LAogICAgICAgIHZhbF9sYWJlbHM6IG5wLm5kYXJyYXksCiAgICApIC0+IERpY3Q6CiAgICAgICAgIiIiCiAgICAgICAgUnVuIHRoZSBmdWxsIHRyYWluaW5nIGxvb3AuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIERpY3Qgd2l0aCB0cmFpbmluZyBzdW1tYXJ5IChiZXN0IG1ldHJpY3MsIGVwb2NoIGNvdW50LCBldGMuKQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBUT1JDSF9BVkFJTEFCTEU6CiAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUHlUb3JjaCBub3QgaW5zdGFsbGVkLiBSdW46IHBpcCBpbnN0YWxsIHRvcmNoIikKCiAgICAgICAgbG9nZ2VyLmluZm8oIj0iICogNjApCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgQ29tbWFuZGVyIEFJIExhYiDigJQgU3VwZXJ2aXNlZCBQb2xpY3kgVHJhaW5pbmciKQogICAgICAgIGxvZ2dlci5pbmZvKCI9IiAqIDYwKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIERldmljZTogICAgICAgICVzIiwgc2VsZi5kZXZpY2UpCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgVHJhaW4gc2FtcGxlczogJWQiLCBsZW4odHJhaW5fc3RhdGVzKSkKICAgICAgICBsb2dnZXIuaW5mbygiICBWYWwgc2FtcGxlczogICAlZCIsIGxlbih2YWxfc3RhdGVzKSkKICAgICAgICBsb2dnZXIuaW5mbygiICBCYXRjaCBzaXplOiAgICAlZCIsIHNlbGYuYmF0Y2hfc2l6ZSkKICAgICAgICBsb2dnZXIuaW5mbygiICBMZWFybmluZyByYXRlOiAlcyIsIHNlbGYubHIpCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgTWF4IGVwb2NoczogICAgJWQiLCBzZWxmLmVwb2NocykKICAgICAgICBsb2dnZXIuaW5mbygiICBQYXRpZW5jZTogICAgICAlZCIsIHNlbGYucGF0aWVuY2UpCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgV2FybXVwIGVwb2NoczogJWQiLCBzZWxmLndhcm11cF9lcG9jaHMpCiAgICAgICAgbG9nZ2VyLmluZm8oIj0iICogNjApCgogICAgICAgICMgRGF0YSBsb2FkZXJzCiAgICAgICAgdHJhaW5fbG9hZGVyID0gbWFrZV9kYXRhbG9hZGVyKAogICAgICAgICAgICB0cmFpbl9zdGF0ZXMsIHRyYWluX2xhYmVscywgc2VsZi5iYXRjaF9zaXplLCBzaHVmZmxlPVRydWUsIGRldmljZT1zZWxmLmRldmljZQogICAgICAgICkKICAgICAgICB2YWxfbG9hZGVyID0gbWFrZV9kYXRhbG9hZGVyKAogICAgICAgICAgICB2YWxfc3RhdGVzLCB2YWxfbGFiZWxzLCBzZWxmLmJhdGNoX3NpemUsIHNodWZmbGU9RmFsc2UsIGRldmljZT1zZWxmLmRldmljZQogICAgICAgICkKCiAgICAgICAgIyBDbGFzcy13ZWlnaHRlZCBjcm9zcy1lbnRyb3B5CiAgICAgICAgY2xhc3Nfd2VpZ2h0cyA9IGNvbXB1dGVfY2xhc3Nfd2VpZ2h0cyh0cmFpbl9sYWJlbHMsIE5VTV9BQ1RJT05TKS50byhzZWxmLmRldmljZSkKICAgICAgICBzZWxmLmNyaXRlcmlvbiA9IG5uLkNyb3NzRW50cm9weUxvc3Mod2VpZ2h0PWNsYXNzX3dlaWdodHMpCgogICAgICAgIGxvZ2dlci5pbmZvKCIgIENsYXNzIHdlaWdodHM6ICVzIiwgCiAgICAgICAgICAgICAgICAgICAgIHtJRFhfVE9fQUNUSU9OW2ldLnZhbHVlOiBm' +
'Int3Oi4yZn0iIAogICAgICAgICAgICAgICAgICAgICAgZm9yIGksIHcgaW4gZW51bWVyYXRlKGNsYXNzX3dlaWdodHMuY3B1KCkubnVtcHkoKSl9KQoKICAgICAgICAjIE9wdGltaXplcgogICAgICAgIHNlbGYub3B0aW1pemVyID0gdG9yY2gub3B0aW0uQWRhbVcoCiAgICAgICAgICAgIHNlbGYubW9kZWwucGFyYW1ldGVycygpLAogICAgICAgICAgICBscj1zZWxmLmxyLAogICAgICAgICAgICB3ZWlnaHRfZGVjYXk9MWUtNCwKICAgICAgICApCgogICAgICAgICMgQ29zaW5lIGFubmVhbGluZyB3aXRoIHdhcm11cAogICAgICAgICMgRHVyaW5nIHdhcm11cCwgTFIgcmFtcHMgZnJvbSBsci8xMCB0byBscgogICAgICAgICMgQWZ0ZXIgd2FybXVwLCBjb3NpbmUgZGVjYXkgdG8gbHIvMTAwCiAgICAgICAgdG90YWxfc3RlcHMgPSBzZWxmLmVwb2NocyAqIGxlbih0cmFpbl9sb2FkZXIpCiAgICAgICAgd2FybXVwX3N0ZXBzID0gc2VsZi53YXJtdXBfZXBvY2hzICogbGVuKHRyYWluX2xvYWRlcikKCiAgICAgICAgZGVmIGxyX2xhbWJkYShzdGVwKToKICAgICAgICAgICAgaWYgc3RlcCA8IHdhcm11cF9zdGVwczoKICAgICAgICAgICAgICAgIHJldHVybiAwLjEgKyAwLjkgKiAoc3RlcCAvIG1heCh3YXJtdXBfc3RlcHMsIDEpKQogICAgICAgICAgICBwcm9ncmVzcyA9IChzdGVwIC0gd2FybXVwX3N0ZXBzKSAvIG1heCh0b3RhbF9zdGVwcyAtIHdhcm11cF9zdGVwcywgMSkKICAgICAgICAgICAgcmV0dXJuIDAuMDEgKyAwLjk5ICogMC41ICogKDEgKyBucC5jb3MobnAucGkgKiBwcm9ncmVzcykpCgogICAgICAgIHNlbGYuc2NoZWR1bGVyID0gdG9yY2gub3B0aW0ubHJfc2NoZWR1bGVyLkxhbWJkYUxSKAogICAgICAgICAgICBzZWxmLm9wdGltaXplciwgbHJfbGFtYmRhCiAgICAgICAgKQoKICAgICAgICAjIFRyYWluaW5nIHN0YXRlCiAgICAgICAgYmVzdF92YWxfbG9zcyA9IGZsb2F0KCJpbmYiKQogICAgICAgIGJlc3RfdmFsX2FjYyA9IDAuMAogICAgICAgIGJlc3RfZXBvY2ggPSAwCiAgICAgICAgZXBvY2hzX3dpdGhvdXRfaW1wcm92ZW1lbnQgPSAwCgogICAgICAgIG9zLm1ha2VkaXJzKHNlbGYuY2hlY2twb2ludF9kaXIsIGV4aXN0X29rPVRydWUpCgogICAgICAgIGZvciBlcG9jaCBpbiByYW5nZSgxLCBzZWxmLmVwb2NocyArIDEpOgogICAgICAgICAgICB0X3N0YXJ0ID0gdGltZS50aW1lKCkKCiAgICAgICAgICAgICMgVHJhaW4gb25lIGVwb2NoCiAgICAgICAgICAgIHRyYWluX2xvc3MsIHRyYWluX2FjYywgdHJhaW5fcGVyX2NsYXNzID0gc2VsZi5fdHJhaW5fZXBvY2goCiAgICAgICAgICAgICAgICB0cmFpbl9sb2FkZXIsIGVwb2NoCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgVmFsaWRhdGUKICAgICAgICAgICAgdmFsX2xvc3MsIHZhbF9hY2MsIHZhbF9wZXJfY2xhc3MgPSBzZWxmLl92YWxpZGF0ZSh2YWxfbG9hZGVyKQoKICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUudGltZSgpIC0gdF9zdGFydAogICAgICAgICAgICBjdXJyZW50X2xyID0gc2VsZi5vcHRpbWl6ZXIucGFyYW1fZ3JvdXBzWzBdWyJsciJdCgogICAgICAgICAgICAjIFJlY29yZCBoaXN0b3J5CiAgICAgICAgICAgIGVwb2NoX21ldHJpY3MgPSB7CiAgICAgICAgICAgICAgICAiZXBvY2giOiBlcG9jaCwKICAgICAgICAgICAgICAgICJ0cmFpbl9sb3NzIjogdHJhaW5fbG9zcywKICAgICAgICAgICAgICAgICJ0cmFpbl9hY2MiOiB0cmFpbl9hY2MsCiAgICAgICAgICAgICAgICAidmFsX2xvc3MiOiB2YWxfbG9zcywKICAgICAgICAgICAgICAgICJ2YWxfYWNjIjogdmFsX2FjYywKICAgICAgICAgICAgICAgICJsciI6IGN1cnJlbnRfbHIsCiAgICAgICAgICAgICAgICAidGltZV9zIjogZWxhcHNlZCwKICAgICAgICAgICAgICAgICJ0cmFpbl9wZXJfY2xhc3MiOiB0cmFpbl9wZXJfY2xhc3MsCiAgICAgICAgICAgICAgICAidmFsX3Blcl9jbGFzcyI6IHZhbF9wZXJfY2xhc3MsCiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZi5oaXN0b3J5LmFwcGVuZChlcG9jaF9tZXRyaWNzKQoKICAgICAgICAgICAgIyBMb2cKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiICBFcG9jaCAlM2QvJWQgfCB0cmFpbl9sb3NzPSUuNGYgdHJhaW5fYWNjPSUuM2YgfCAiCiAgICAgICAgICAgICAgICAidmFsX2xvc3M9JS40ZiB2YWxfYWNjPSUuM2YgfCBscj0lLjJlIHwgJS4xZnMiLAogICAgICAgICAgICAgICAgZXBvY2gsIHNlbGYuZXBvY2hzLAogICAgICAgICAg' +
'ICAgICAgdHJhaW5fbG9zcywgdHJhaW5fYWNjLAogICAgICAgICAgICAgICAgdmFsX2xvc3MsIHZhbF9hY2MsCiAgICAgICAgICAgICAgICBjdXJyZW50X2xyLCBlbGFwc2VkLAogICAgICAgICAgICApCgogICAgICAgICAgICAjIENoZWNrIGZvciBpbXByb3ZlbWVudAogICAgICAgICAgICBpbXByb3ZlZCA9IEZhbHNlCiAgICAgICAgICAgIGlmIHZhbF9sb3NzIDwgYmVzdF92YWxfbG9zczoKICAgICAgICAgICAgICAgIGJlc3RfdmFsX2xvc3MgPSB2YWxfbG9zcwogICAgICAgICAgICAgICAgYmVzdF92YWxfYWNjID0gdmFsX2FjYwogICAgICAgICAgICAgICAgYmVzdF9lcG9jaCA9IGVwb2NoCiAgICAgICAgICAgICAgICBlcG9jaHNfd2l0aG91dF9pbXByb3ZlbWVudCA9IDAKICAgICAgICAgICAgICAgIGltcHJvdmVkID0gVHJ1ZQoKICAgICAgICAgICAgICAgICMgU2F2ZSBiZXN0IG1vZGVsCiAgICAgICAgICAgICAgICBzYXZlX2NoZWNrcG9pbnQoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2RlbCwgc2VsZi5vcHRpbWl6ZXIsIGVwb2NoLAogICAgICAgICAgICAgICAgICAgIHsidmFsX2xvc3MiOiB2YWxfbG9zcywgInZhbF9hY2MiOiB2YWxfYWNjLAogICAgICAgICAgICAgICAgICAgICAidHJhaW5fbG9zcyI6IHRyYWluX2xvc3MsICJ0cmFpbl9hY2MiOiB0cmFpbl9hY2N9LAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmNoZWNrcG9pbnRfZGlyLCAiYmVzdF9wb2xpY3kucHQiKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVwb2Noc193aXRob3V0X2ltcHJvdmVtZW50ICs9IDEKCiAgICAgICAgICAgICMgUGVyaW9kaWMgY2hlY2twb2ludAogICAgICAgICAgICBpZiBlcG9jaCAlIHNlbGYuc2F2ZV9ldmVyeSA9PSAwOgogICAgICAgICAgICAgICAgc2F2ZV9jaGVja3BvaW50KAogICAgICAgICAgICAgICAgICAgIHNlbGYubW9kZWwsIHNlbGYub3B0aW1pemVyLCBlcG9jaCwKICAgICAgICAgICAgICAgICAgICB7InZhbF9sb3NzIjogdmFsX2xvc3MsICJ2YWxfYWNjIjogdmFsX2FjY30sCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuY2hlY2twb2ludF9kaXIsIGYicG9saWN5X2Vwb2NoX3tlcG9jaDowM2R9LnB0IiksCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIEVhcmx5IHN0b3BwaW5nCiAgICAgICAgICAgIGlmIGVwb2Noc193aXRob3V0X2ltcHJvdmVtZW50ID49IHNlbGYucGF0aWVuY2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAiICBFYXJseSBzdG9wcGluZyBhdCBlcG9jaCAlZCAobm8gaW1wcm92ZW1lbnQgZm9yICVkIGVwb2NocykiLAogICAgICAgICAgICAgICAgICAgIGVwb2NoLCBzZWxmLnBhdGllbmNlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBGaW5hbCBzdW1tYXJ5CiAgICAgICAgbG9nZ2VyLmluZm8oIiIpCiAgICAgICAgbG9nZ2VyLmluZm8oIj0iICogNjApCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgVHJhaW5pbmcgQ29tcGxldGUiKQogICAgICAgIGxvZ2dlci5pbmZvKCI9IiAqIDYwKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIEJlc3QgZXBvY2g6ICAgICAlZCIsIGJlc3RfZXBvY2gpCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgQmVzdCB2YWxfbG9zczogICUuNGYiLCBiZXN0X3ZhbF9sb3NzKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIEJlc3QgdmFsX2FjYzogICAlLjNmIiwgYmVzdF92YWxfYWNjKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIFRvdGFsIGVwb2NoczogICAlZCIsIGxlbihzZWxmLmhpc3RvcnkpKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIENoZWNrcG9pbnQ6ICAgICAlcyIsIG9zLnBhdGguam9pbihzZWxmLmNoZWNrcG9pbnRfZGlyLCAiYmVzdF9wb2xpY3kucHQiKSkKICAgICAgICBsb2dnZXIuaW5mbygiPSIgKiA2MCkKCiAgICAgICAgIyBTYXZlIHRyYWluaW5nIGhpc3RvcnkKICAgICAgICBoaXN0b3J5X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5jaGVja3BvaW50X2RpciwgInRyYWluaW5nX2hpc3RvcnkuanNvbiIpCiAgICAgICAgIyBDb252ZXJ0IHBlci1jbGFzcyBkaWN0cyBmb3IgSlNPTiBzZXJpYWxpemF0aW9uCiAgICAgICAgc2VyaWFsaXphYmxlX2hpc3RvcnkgPSBbXQogICAgICAgIGZvciBoIGluIHNlbGYuaGlzdG9yeToKICAgICAgICAgICAgZW50cnkgPSB7azogdiBmb3IgaywgdiBpbiBoLml0' +
'ZW1zKCkKICAgICAgICAgICAgICAgICAgICAgaWYgayBub3QgaW4gKCJ0cmFpbl9wZXJfY2xhc3MiLCAidmFsX3Blcl9jbGFzcyIpfQogICAgICAgICAgICBlbnRyeVsidHJhaW5fcGVyX2NsYXNzIl0gPSB7CiAgICAgICAgICAgICAgICBzdHIoayk6IHYgZm9yIGssIHYgaW4gaFsidHJhaW5fcGVyX2NsYXNzIl0uaXRlbXMoKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVudHJ5WyJ2YWxfcGVyX2NsYXNzIl0gPSB7CiAgICAgICAgICAgICAgICBzdHIoayk6IHYgZm9yIGssIHYgaW4gaFsidmFsX3Blcl9jbGFzcyJdLml0ZW1zKCkKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXJpYWxpemFibGVfaGlzdG9yeS5hcHBlbmQoZW50cnkpCgogICAgICAgIHdpdGggb3BlbihoaXN0b3J5X3BhdGgsICJ3IikgYXMgZjoKICAgICAgICAgICAganNvbi5kdW1wKHNlcmlhbGl6YWJsZV9oaXN0b3J5LCBmLCBpbmRlbnQ9MikKICAgICAgICBsb2dnZXIuaW5mbygiICBIaXN0b3J5IHNhdmVkOiAgJXMiLCBoaXN0b3J5X3BhdGgpCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJiZXN0X2Vwb2NoIjogYmVzdF9lcG9jaCwKICAgICAgICAgICAgImJlc3RfdmFsX2xvc3MiOiBiZXN0X3ZhbF9sb3NzLAogICAgICAgICAgICAiYmVzdF92YWxfYWNjIjogYmVzdF92YWxfYWNjLAogICAgICAgICAgICAidG90YWxfZXBvY2hzIjogbGVuKHNlbGYuaGlzdG9yeSksCiAgICAgICAgICAgICJjaGVja3BvaW50X3BhdGgiOiBvcy5wYXRoLmpvaW4oc2VsZi5jaGVja3BvaW50X2RpciwgImJlc3RfcG9saWN5LnB0IiksCiAgICAgICAgfQoKICAgIGRlZiBfdHJhaW5fZXBvY2goCiAgICAgICAgc2VsZiwKICAgICAgICBsb2FkZXI6IERhdGFMb2FkZXIsCiAgICAgICAgZXBvY2g6IGludCwKICAgICkgLT4gVHVwbGVbZmxvYXQsIGZsb2F0LCBEaWN0W2ludCwgZmxvYXRdXToKICAgICAgICAiIiJUcmFpbiBmb3Igb25lIGVwb2NoLiBSZXR1cm5zIChsb3NzLCBhY2N1cmFjeSwgcGVyX2NsYXNzX2FjYykuIiIiCiAgICAgICAgc2VsZi5tb2RlbC50cmFpbigpCiAgICAgICAgdG90YWxfbG9zcyA9IDAuMAogICAgICAgIGNvcnJlY3QgPSAwCiAgICAgICAgdG90YWwgPSAwCiAgICAgICAgcGVyX2NsYXNzX2NvcnJlY3QgPSBucC56ZXJvcyhOVU1fQUNUSU9OUykKICAgICAgICBwZXJfY2xhc3NfdG90YWwgPSBucC56ZXJvcyhOVU1fQUNUSU9OUykKCiAgICAgICAgZm9yIGJhdGNoX2lkeCwgKHN0YXRlcywgbGFiZWxzKSBpbiBlbnVtZXJhdGUobG9hZGVyKToKICAgICAgICAgICAgc3RhdGVzID0gc3RhdGVzLnRvKHNlbGYuZGV2aWNlKQogICAgICAgICAgICBsYWJlbHMgPSBsYWJlbHMudG8oc2VsZi5kZXZpY2UpCgogICAgICAgICAgICAjIEZvcndhcmQKICAgICAgICAgICAgbG9naXRzID0gc2VsZi5tb2RlbChzdGF0ZXMpCiAgICAgICAgICAgIGxvc3MgPSBzZWxmLmNyaXRlcmlvbihsb2dpdHMsIGxhYmVscykKCiAgICAgICAgICAgICMgQmFja3dhcmQKICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZXIuemVyb19ncmFkKCkKICAgICAgICAgICAgbG9zcy5iYWNrd2FyZCgpCgogICAgICAgICAgICAjIEdyYWRpZW50IGNsaXBwaW5nCiAgICAgICAgICAgIHRvcmNoLm5uLnV0aWxzLmNsaXBfZ3JhZF9ub3JtXyhzZWxmLm1vZGVsLnBhcmFtZXRlcnMoKSwgMS4wKQoKICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZXIuc3RlcCgpCiAgICAgICAgICAgIHNlbGYuc2NoZWR1bGVyLnN0ZXAoKQoKICAgICAgICAgICAgIyBNZXRyaWNzCiAgICAgICAgICAgIHRvdGFsX2xvc3MgKz0gbG9zcy5pdGVtKCkgKiBsZW4obGFiZWxzKQogICAgICAgICAgICBwcmVkcyA9IGxvZ2l0cy5hcmdtYXgoZGltPS0xKQogICAgICAgICAgICBjb3JyZWN0ICs9IChwcmVkcyA9PSBsYWJlbHMpLnN1bSgpLml0ZW0oKQogICAgICAgICAgICB0b3RhbCArPSBsZW4obGFiZWxzKQoKICAgICAgICAgICAgIyBQZXItY2xhc3MgdHJhY2tpbmcKICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2UoTlVNX0FDVElPTlMpOgogICAgICAgICAgICAgICAgbWFzayA9IGxhYmVscyA9PSBjCiAgICAgICAgICAgICAgICBwZXJfY2xhc3NfdG90YWxbY10gKz0gbWFzay5zdW0oKS5pdGVtKCkKICAgICAgICAgICAgICAgIHBlcl9jbGFzc19jb3JyZWN0W2NdICs9IChwcmVkc1ttYXNrXSA9PSBjKS5zdW0oKS5pdGVtKCkKCiAgICAgICAgYXZnX2xvc3MgPSB0b3RhbF9sb3NzIC8gbWF4KHRvdGFsLCAxKQogICAgICAgIGFjY3VyYWN5ID0gY29ycmVjdCAv' +
'IG1heCh0b3RhbCwgMSkKCiAgICAgICAgcGVyX2NsYXNzX2FjYyA9IHt9CiAgICAgICAgZm9yIGMgaW4gcmFuZ2UoTlVNX0FDVElPTlMpOgogICAgICAgICAgICBpZiBwZXJfY2xhc3NfdG90YWxbY10gPiAwOgogICAgICAgICAgICAgICAgcGVyX2NsYXNzX2FjY1tjXSA9IHBlcl9jbGFzc19jb3JyZWN0W2NdIC8gcGVyX2NsYXNzX3RvdGFsW2NdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwZXJfY2xhc3NfYWNjW2NdID0gMC4wCgogICAgICAgIHJldHVybiBhdmdfbG9zcywgYWNjdXJhY3ksIHBlcl9jbGFzc19hY2MKCiAgICBAdG9yY2gubm9fZ3JhZCgpCiAgICBkZWYgX3ZhbGlkYXRlKAogICAgICAgIHNlbGYsCiAgICAgICAgbG9hZGVyOiBEYXRhTG9hZGVyLAogICAgKSAtPiBUdXBsZVtmbG9hdCwgZmxvYXQsIERpY3RbaW50LCBmbG9hdF1dOgogICAgICAgICIiIlZhbGlkYXRlIG9uIGhlbGQtb3V0IGRhdGEuIFJldHVybnMgKGxvc3MsIGFjY3VyYWN5LCBwZXJfY2xhc3NfYWNjKS4iIiIKICAgICAgICBzZWxmLm1vZGVsLmV2YWwoKQogICAgICAgIHRvdGFsX2xvc3MgPSAwLjAKICAgICAgICBjb3JyZWN0ID0gMAogICAgICAgIHRvdGFsID0gMAogICAgICAgIHBlcl9jbGFzc19jb3JyZWN0ID0gbnAuemVyb3MoTlVNX0FDVElPTlMpCiAgICAgICAgcGVyX2NsYXNzX3RvdGFsID0gbnAuemVyb3MoTlVNX0FDVElPTlMpCgogICAgICAgIGZvciBzdGF0ZXMsIGxhYmVscyBpbiBsb2FkZXI6CiAgICAgICAgICAgIHN0YXRlcyA9IHN0YXRlcy50byhzZWxmLmRldmljZSkKICAgICAgICAgICAgbGFiZWxzID0gbGFiZWxzLnRvKHNlbGYuZGV2aWNlKQoKICAgICAgICAgICAgbG9naXRzID0gc2VsZi5tb2RlbChzdGF0ZXMpCiAgICAgICAgICAgIGxvc3MgPSBzZWxmLmNyaXRlcmlvbihsb2dpdHMsIGxhYmVscykKCiAgICAgICAgICAgIHRvdGFsX2xvc3MgKz0gbG9zcy5pdGVtKCkgKiBsZW4obGFiZWxzKQogICAgICAgICAgICBwcmVkcyA9IGxvZ2l0cy5hcmdtYXgoZGltPS0xKQogICAgICAgICAgICBjb3JyZWN0ICs9IChwcmVkcyA9PSBsYWJlbHMpLnN1bSgpLml0ZW0oKQogICAgICAgICAgICB0b3RhbCArPSBsZW4obGFiZWxzKQoKICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2UoTlVNX0FDVElPTlMpOgogICAgICAgICAgICAgICAgbWFzayA9IGxhYmVscyA9PSBjCiAgICAgICAgICAgICAgICBwZXJfY2xhc3NfdG90YWxbY10gKz0gbWFzay5zdW0oKS5pdGVtKCkKICAgICAgICAgICAgICAgIHBlcl9jbGFzc19jb3JyZWN0W2NdICs9IChwcmVkc1ttYXNrXSA9PSBjKS5zdW0oKS5pdGVtKCkKCiAgICAgICAgYXZnX2xvc3MgPSB0b3RhbF9sb3NzIC8gbWF4KHRvdGFsLCAxKQogICAgICAgIGFjY3VyYWN5ID0gY29ycmVjdCAvIG1heCh0b3RhbCwgMSkKCiAgICAgICAgcGVyX2NsYXNzX2FjYyA9IHt9CiAgICAgICAgZm9yIGMgaW4gcmFuZ2UoTlVNX0FDVElPTlMpOgogICAgICAgICAgICBpZiBwZXJfY2xhc3NfdG90YWxbY10gPiAwOgogICAgICAgICAgICAgICAgcGVyX2NsYXNzX2FjY1tjXSA9IHBlcl9jbGFzc19jb3JyZWN0W2NdIC8gcGVyX2NsYXNzX3RvdGFsW2NdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwZXJfY2xhc3NfYWNjW2NdID0gMC4wCgogICAgICAgIHJldHVybiBhdmdfbG9zcywgYWNjdXJhY3ksIHBlcl9jbGFzc19hY2MKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIEV2YWx1YXRpb24KIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmRlZiBldmFsdWF0ZV9tb2RlbCgKICAgIG1vZGVsOiBQb2xpY3lOZXR3b3JrLAogICAgdGVzdF9zdGF0ZXM6IG5wLm5kYXJyYXksCiAgICB0ZXN0X2xhYmVsczogbnAubmRhcnJheSwKICAgIGRldmljZTogc3RyID0gImNwdSIsCikgLT4gRGljdDoKICAgICIiIgogICAgRnVsbCBldmFsdWF0aW9uIG9uIHRlc3Qgc2V0IHdpdGggZGV0YWlsZWQg' +
'bWV0cmljcy4KCiAgICBSZXR1cm5zOgogICAgICAgIERpY3Qgd2l0aCBvdmVyYWxsIGFjY3VyYWN5LCBwZXItY2xhc3MgYWNjdXJhY3ksIGNvbmZ1c2lvbiBtYXRyaXgKICAgICIiIgogICAgbW9kZWwuZXZhbCgpCiAgICBtb2RlbC50byhkZXZpY2UpCgogICAgc3RhdGVzX3QgPSB0b3JjaC5mcm9tX251bXB5KHRlc3Rfc3RhdGVzLmFzdHlwZShucC5mbG9hdDMyKSkudG8oZGV2aWNlKQogICAgbGFiZWxzX3QgPSB0b3JjaC5mcm9tX251bXB5KHRlc3RfbGFiZWxzLmFzdHlwZShucC5pbnQ2NCkpLnRvKGRldmljZSkKCiAgICB3aXRoIHRvcmNoLm5vX2dyYWQoKToKICAgICAgICBsb2dpdHMgPSBtb2RlbChzdGF0ZXNfdCkKICAgICAgICBwcmVkcyA9IGxvZ2l0cy5hcmdtYXgoZGltPS0xKQoKICAgIHByZWRzX25wID0gcHJlZHMuY3B1KCkubnVtcHkoKQogICAgbGFiZWxzX25wID0gdGVzdF9sYWJlbHMKCiAgICAjIE92ZXJhbGwgYWNjdXJhY3kKICAgIG92ZXJhbGxfYWNjID0gKHByZWRzX25wID09IGxhYmVsc19ucCkubWVhbigpCgogICAgIyBQZXItY2xhc3MgbWV0cmljcwogICAgcGVyX2NsYXNzID0ge30KICAgIGZvciBjIGluIHJhbmdlKE5VTV9BQ1RJT05TKToKICAgICAgICBtYXNrID0gbGFiZWxzX25wID09IGMKICAgICAgICB0b3RhbF9jID0gbWFzay5zdW0oKQogICAgICAgIGNvcnJlY3RfYyA9IChwcmVkc19ucFttYXNrXSA9PSBjKS5zdW0oKSBpZiB0b3RhbF9jID4gMCBlbHNlIDAKICAgICAgICBwcmVkX2FzX2MgPSAocHJlZHNfbnAgPT0gYykuc3VtKCkKCiAgICAgICAgcHJlY2lzaW9uID0gY29ycmVjdF9jIC8gbWF4KHByZWRfYXNfYywgMSkKICAgICAgICByZWNhbGwgPSBjb3JyZWN0X2MgLyBtYXgodG90YWxfYywgMSkgCiAgICAgICAgZjEgPSAyICogcHJlY2lzaW9uICogcmVjYWxsIC8gbWF4KHByZWNpc2lvbiArIHJlY2FsbCwgMWUtOCkKCiAgICAgICAgYWN0aW9uX25hbWUgPSBJRFhfVE9fQUNUSU9OW2NdLnZhbHVlCiAgICAgICAgcGVyX2NsYXNzW2FjdGlvbl9uYW1lXSA9IHsKICAgICAgICAgICAgInN1cHBvcnQiOiBpbnQodG90YWxfYyksCiAgICAgICAgICAgICJjb3JyZWN0IjogaW50KGNvcnJlY3RfYyksCiAgICAgICAgICAgICJwcmVkaWN0ZWQiOiBpbnQocHJlZF9hc19jKSwKICAgICAgICAgICAgInByZWNpc2lvbiI6IHJvdW5kKGZsb2F0KHByZWNpc2lvbiksIDQpLAogICAgICAgICAgICAicmVjYWxsIjogcm91bmQoZmxvYXQocmVjYWxsKSwgNCksCiAgICAgICAgICAgICJmMSI6IHJvdW5kKGZsb2F0KGYxKSwgNCksCiAgICAgICAgfQoKICAgICMgQ29uZnVzaW9uIG1hdHJpeAogICAgY29uZnVzaW9uID0gbnAuemVyb3MoKE5VTV9BQ1RJT05TLCBOVU1fQUNUSU9OUyksIGR0eXBlPWludCkKICAgIGZvciB0cnVlX2MsIHByZWRfYyBpbiB6aXAobGFiZWxzX25wLCBwcmVkc19ucCk6CiAgICAgICAgY29uZnVzaW9uW3RydWVfY11bcHJlZF9jXSArPSAxCgogICAgcmV0dXJuIHsKICAgICAgICAib3ZlcmFsbF9hY2N1cmFjeSI6IHJvdW5kKGZsb2F0KG92ZXJhbGxfYWNjKSwgNCksCiAgICAgICAgInRvdGFsX3NhbXBsZXMiOiBsZW4obGFiZWxzX25wKSwKICAgICAgICAicGVyX2NsYXNzIjogcGVyX2NsYXNzLAogICAgICAgICJjb25mdXNpb25fbWF0cml4IjogY29uZnVzaW9uLnRvbGlzdCgpLAogICAgfQoKCmRlZiBwcmludF9ldmFsdWF0aW9uKHJlc3VsdHM6IERpY3QpOgogICAgIiIiUHJldHR5LXByaW50IGV2YWx1YXRpb24gcmVzdWx0cy4iIiIKICAgIHByaW50KCkKICAgIHByaW50KCI9IiAqIDY1KQogICAgcHJpbnQoIiAgVGVzdCBTZXQgRXZhbHVhdGlvbiIpCiAgICBwcmludCgiPSIgKiA2NSkKICAgIHByaW50KGYiICBPdmVyYWxsIEFjY3VyYWN5OiB7cmVzdWx0c1snb3ZlcmFsbF9hY2N1cmFjeSddOi4xJX0iKQogICAgcHJpbnQoZiIgIFRvdGFsIFNhbXBsZXM6ICAgIHtyZXN1bHRzWyd0b3RhbF9zYW1wbGVzJ106LH0iKQogICAgcHJpbnQoKQogICAgcHJpbnQoZiIgIHsnQWN0aW9uJzo8MjB9IHsnU3VwcG9ydCc6Pjh9IHsnUHJlYyc6Pjd9IHsnUmVjYWxsJzo+N30geydGMSc6Pjd9IikKICAgIHByaW50KCIgICIgKyAiLSIgKiA1NSkKCiAgICBmb3IgYWN0aW9uX25hbWUsIG0gaW4gcmVzdWx0c1sicGVyX2NsYXNzIl0uaXRlbXMoKToKICAgICAgICBwcmludCgKICAgICAgICAgICAgZiIgIHthY3Rpb25fbmFtZTo8MjB9IHttWydzdXBwb3J0J106Pjh9ICIKICAgICAgICAgICAgZiJ7bVsncHJlY2lzaW9uJ106PjcuM2Z9IHtt' +
'WydyZWNhbGwnXTo+Ny4zZn0ge21bJ2YxJ106PjcuM2Z9IgogICAgICAgICkKCiAgICBwcmludCgiICAiICsgIi0iICogNTUpCgogICAgIyBDb25mdXNpb24gbWF0cml4CiAgICBwcmludCgpCiAgICBwcmludCgiICBDb25mdXNpb24gTWF0cml4IChyb3dzPXRydWUsIGNvbHM9cHJlZGljdGVkKToiKQogICAgaGVhZGVyID0gIiAgIiArICIgIiAqIDE4CiAgICBmb3IgYyBpbiByYW5nZShOVU1fQUNUSU9OUyk6CiAgICAgICAgc2hvcnRfbmFtZSA9IElEWF9UT19BQ1RJT05bY10udmFsdWVbOjZdCiAgICAgICAgaGVhZGVyICs9IGYiIHtzaG9ydF9uYW1lOj42fSIKICAgIHByaW50KGhlYWRlcikKCiAgICBmb3IgciBpbiByYW5nZShOVU1fQUNUSU9OUyk6CiAgICAgICAgcm93X25hbWUgPSBJRFhfVE9fQUNUSU9OW3JdLnZhbHVlWzoxNl0KICAgICAgICByb3dfc3RyID0gZiIgIHtyb3dfbmFtZTo8MTh9IgogICAgICAgIGZvciBjIGluIHJhbmdlKE5VTV9BQ1RJT05TKToKICAgICAgICAgICAgcm93X3N0ciArPSBmIiB7cmVzdWx0c1snY29uZnVzaW9uX21hdHJpeCddW3JdW2NdOj42fSIKICAgICAgICBwcmludChyb3dfc3RyKQogICAgcHJpbnQoKQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGV2aWNlIFNlbGVjdGlvbgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZGVmIGdldF9iZXN0X2RldmljZSgpIC0+IHN0cjoKICAgICIiIkF1dG8tZGV0ZWN0IHRoZSBiZXN0IGF2YWlsYWJsZSBjb21wdXRlIGRldmljZS4iIiIKICAgIGlmIG5vdCBUT1JDSF9BVkFJTEFCTEU6CiAgICAgICAgcmV0dXJuICJjcHUiCiAgICBpZiB0b3JjaC5jdWRhLmlzX2F2YWlsYWJsZSgpOgogICAgICAgIG5hbWUgPSB0b3JjaC5jdWRhLmdldF9kZXZpY2VfbmFtZSgwKQogICAgICAgIG1lbSA9IHRvcmNoLmN1ZGEuZ2V0X2RldmljZV9wcm9wZXJ0aWVzKDApLnRvdGFsX21lbSAvICgxMDI0KiozKQogICAgICAgIGxvZ2dlci5pbmZvKCIgIENVREEgZGV2aWNlOiAlcyAoJS4xZiBHQikiLCBuYW1lLCBtZW0pCiAgICAgICAgcmV0dXJuICJjdWRhIgogICAgaWYgaGFzYXR0cih0b3JjaC5iYWNrZW5kcywgIm1wcyIpIGFuZCB0b3JjaC5iYWNrZW5kcy5tcHMuaXNfYXZhaWxhYmxlKCk6CiAgICAgICAgbG9nZ2VyLmluZm8oIiAgVXNpbmcgQXBwbGUgTVBTIikKICAgICAgICByZXR1cm4gIm1wcyIKICAgIGxvZ2dlci5pbmZvKCIgIFVzaW5nIENQVSAobm8gR1BVIGRldGVjdGVkKSIpCiAgICByZXR1cm4gImNwdSIKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIENMSSBFbnRyeSBQb2ludAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgICAgIGRlc2NyaXB0aW9uPSJDb21tYW5kZXIgQUkgTGFiIOKAlCBUcmFpbiBQb2xpY3kgTmV0d29yayIKICAgICkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgIi0tZGF0YS1kaXIiLCBkZWZhdWx0PSJtbC9tb2RlbHMiLAogICAgICAgIGhlbHA9IkRpcmVjdG9yeSBjb250YWluaW5nIGRhdGFzZXQtdHJhaW4ubnB6IC8gZGF0YXNldC12YWwubnB6IC8gZGF0YXNldC10ZXN0Lm5weiIsCiAgICApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICItLWVwb2NocyIs' +
'IHR5cGU9aW50LCBkZWZhdWx0PU5vbmUsCiAgICAgICAgaGVscD1mIk1heCB0cmFpbmluZyBlcG9jaHMgKGRlZmF1bHQ6IHtUUkFJTklOR19DT05GSUcuZXBvY2hzfSkiLAogICAgKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAiLS1iYXRjaC1zaXplIiwgdHlwZT1pbnQsIGRlZmF1bHQ9Tm9uZSwKICAgICAgICBoZWxwPWYiQmF0Y2ggc2l6ZSAoZGVmYXVsdDoge1RSQUlOSU5HX0NPTkZJRy5iYXRjaF9zaXplfSkiLAogICAgKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAiLS1sciIsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9Tm9uZSwKICAgICAgICBoZWxwPWYiTGVhcm5pbmcgcmF0ZSAoZGVmYXVsdDoge1RSQUlOSU5HX0NPTkZJRy5sZWFybmluZ19yYXRlfSkiLAogICAgKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAiLS1wYXRpZW5jZSIsIHR5cGU9aW50LCBkZWZhdWx0PU5vbmUsCiAgICAgICAgaGVscD1mIkVhcmx5IHN0b3BwaW5nIHBhdGllbmNlIChkZWZhdWx0OiB7VFJBSU5JTkdfQ09ORklHLmVhcmx5X3N0b3BfcGF0aWVuY2V9KSIsCiAgICApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICItLWNoZWNrcG9pbnQtZGlyIiwgZGVmYXVsdD1Ob25lLAogICAgICAgIGhlbHA9ZiJDaGVja3BvaW50IGRpcmVjdG9yeSAoZGVmYXVsdDoge1RSQUlOSU5HX0NPTkZJRy5jaGVja3BvaW50X2Rpcn0pIiwKICAgICkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgIi0tZGV2aWNlIiwgZGVmYXVsdD1Ob25lLAogICAgICAgIGhlbHA9IkNvbXB1dGUgZGV2aWNlOiBjdWRhLCBtcHMsIG9yIGNwdSAoZGVmYXVsdDogYXV0by1kZXRlY3QpIiwKICAgICkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgIi0tZXZhbC1vbmx5IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgICAgICBoZWxwPSJPbmx5IGV2YWx1YXRlIGFuIGV4aXN0aW5nIGNoZWNrcG9pbnQgb24gdGVzdCBkYXRhIiwKICAgICkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgIi0tY2hlY2twb2ludCIsIGRlZmF1bHQ9Tm9uZSwKICAgICAgICBoZWxwPSJQYXRoIHRvIGNoZWNrcG9pbnQgZm9yIC0tZXZhbC1vbmx5IChkZWZhdWx0OiBiZXN0X3BvbGljeS5wdCkiLAogICAgKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBpZiBub3QgVE9SQ0hfQVZBSUxBQkxFOgogICAgICAgIHByaW50KCJQeVRvcmNoIG5vdCBpbnN0YWxsZWQuIEluc3RhbGwgd2l0aDoiKQogICAgICAgIHByaW50KCIgIHBpcCBpbnN0YWxsIHRvcmNoIHRvcmNodmlzaW9uIC0taW5kZXgtdXJsIGh0dHBzOi8vZG93bmxvYWQucHl0b3JjaC5vcmcvd2hsL2N1MTIxIikKICAgICAgICBzeXMuZXhpdCgxKQoKICAgIGRldmljZSA9IGFyZ3MuZGV2aWNlIG9yIGdldF9iZXN0X2RldmljZSgpCiAgICBkYXRhX2RpciA9IGFyZ3MuZGF0YV9kaXIKICAgIGNrcHRfZGlyID0gYXJncy5jaGVja3BvaW50X2RpciBvciBUUkFJTklOR19DT05GSUcuY2hlY2twb2ludF9kaXIKCiAgICAjIExvYWQgZGF0YQogICAgdHJhaW5fcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgImRhdGFzZXQtdHJhaW4ubnB6IikKICAgIHZhbF9wYXRoID0gb3MucGF0aC5qb2luKGRhdGFfZGlyLCAiZGF0YXNldC12YWwubnB6IikKICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbihkYXRhX2RpciwgImRhdGFzZXQtdGVzdC5ucHoiKQoKICAgIGlmIGFyZ3MuZXZhbF9vbmx5OgogICAgICAgICMgRXZhbHVhdGlvbiBvbmx5CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRlc3RfcGF0aCk6CiAgICAgICAgICAgIHByaW50KGYiVGVzdCBkYXRhIG5vdCBmb3VuZDoge3Rlc3RfcGF0aH0iKQogICAgICAgICAgICBwcmludCgiUnVuOiBweXRob24gLW0gbWwuc2NyaXB0cy5tbF9jbGkgYnVpbGQiKQogICAgICAgICAgICBzeXMuZXhpdCgxKQoKICAgICAgICBja3B0X3BhdGggPSBhcmdzLmNoZWNrcG9pbnQgb3Igb3MucGF0aC5qb2luKGNrcHRfZGlyLCAiYmVzdF9wb2xpY3kucHQiKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhja3B0X3BhdGgpOgogICAgICAgICAgICBwcmludChmIkNoZWNrcG9pbnQgbm90IGZvdW5kOiB7Y2twdF9wYXRofSIpCiAgICAgICAgICAgIHN5cy5leGl0KDEpCgogICAgICAgIHRlc3Rfc3RhdGVzLCB0ZXN0X2xhYmVscyA9IGxvYWRfbnB6X3NwbGl0KHRlc3RfcGF0aCkKICAgICAgICBtb2RlbCwgY2hlY2twb2ludCA9IGxvYWRfY2hl' +
'Y2twb2ludChja3B0X3BhdGgsIGRldmljZSkKICAgICAgICBsb2dnZXIuaW5mbygiICBMb2FkZWQgY2hlY2twb2ludCBmcm9tIGVwb2NoICVkIiwgY2hlY2twb2ludC5nZXQoImVwb2NoIiwgIj8iKSkKCiAgICAgICAgcmVzdWx0cyA9IGV2YWx1YXRlX21vZGVsKG1vZGVsLCB0ZXN0X3N0YXRlcywgdGVzdF9sYWJlbHMsIGRldmljZSkKICAgICAgICBwcmludF9ldmFsdWF0aW9uKHJlc3VsdHMpCgogICAgICAgICMgU2F2ZSBldmFsdWF0aW9uIHJlc3VsdHMKICAgICAgICBldmFsX3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJldmFsX3Jlc3VsdHMuanNvbiIpCiAgICAgICAgd2l0aCBvcGVuKGV2YWxfcGF0aCwgInciKSBhcyBmOgogICAgICAgICAgICBqc29uLmR1bXAocmVzdWx0cywgZiwgaW5kZW50PTIpCiAgICAgICAgcHJpbnQoZiIgIFJlc3VsdHMgc2F2ZWQ6IHtldmFsX3BhdGh9IikKICAgICAgICByZXR1cm4KCiAgICAjIFRyYWluaW5nIG1vZGUKICAgIGZvciBwYXRoLCBsYWJlbCBpbiBbKHRyYWluX3BhdGgsICJ0cmFpbiIpLCAodmFsX3BhdGgsICJ2YWwiKV06CiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICBwcmludChmIntsYWJlbH0gZGF0YSBub3QgZm91bmQ6IHtwYXRofSIpCiAgICAgICAgICAgIHByaW50KCJCdWlsZCB0aGUgZGF0YXNldCBmaXJzdDoiKQogICAgICAgICAgICBwcmludCgiICBweXRob24gLW0gbWwuc2NyaXB0cy5tbF9jbGkgYnVpbGQgLS1yZXN1bHRzLWRpciByZXN1bHRzLyIpCiAgICAgICAgICAgIHN5cy5leGl0KDEpCgogICAgdHJhaW5fc3RhdGVzLCB0cmFpbl9sYWJlbHMgPSBsb2FkX25wel9zcGxpdCh0cmFpbl9wYXRoKQogICAgdmFsX3N0YXRlcywgdmFsX2xhYmVscyA9IGxvYWRfbnB6X3NwbGl0KHZhbF9wYXRoKQoKICAgIGxvZ2dlci5pbmZvKCIgIFRyYWluOiAlZCBzYW1wbGVzLCAlZCBmZWF0dXJlcyIsICp0cmFpbl9zdGF0ZXMuc2hhcGUpCiAgICBsb2dnZXIuaW5mbygiICBWYWw6ICAgJWQgc2FtcGxlcywgJWQgZmVhdHVyZXMiLCAqdmFsX3N0YXRlcy5zaGFwZSkKCiAgICAjIFZlcmlmeSBkaW1lbnNpb25zIG1hdGNoIGV4cGVjdGVkIHN0YXRlIHNpemUKICAgIGFjdHVhbF9kaW0gPSB0cmFpbl9zdGF0ZXMuc2hhcGVbMV0KICAgIGV4cGVjdGVkX2RpbSA9IFNUQVRFX0RJTVMudG90YWxfc3RhdGVfZGltCiAgICBpZiBhY3R1YWxfZGltICE9IGV4cGVjdGVkX2RpbToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgIiAgU3RhdGUgZGltZW5zaW9uIG1pc21hdGNoOiBkYXRhPSVkLCBjb25maWc9JWQuIFVzaW5nIGRhdGEgZGltZW5zaW9uLiIsCiAgICAgICAgICAgIGFjdHVhbF9kaW0sIGV4cGVjdGVkX2RpbSwKICAgICAgICApCgogICAgIyBDcmVhdGUgbW9kZWwKICAgIG1vZGVsID0gUG9saWN5TmV0d29yayhpbnB1dF9kaW09YWN0dWFsX2RpbSkKICAgIHBhcmFtX2NvdW50ID0gc3VtKHAubnVtZWwoKSBmb3IgcCBpbiBtb2RlbC5wYXJhbWV0ZXJzKCkpCiAgICBsb2dnZXIuaW5mbygiICBNb2RlbCBwYXJhbWV0ZXJzOiAlcyIsIGYie3BhcmFtX2NvdW50Oix9IikKCiAgICAjIFRyYWluCiAgICB0cmFpbmVyID0gU3VwZXJ2aXNlZFRyYWluZXIoCiAgICAgICAgbW9kZWw9bW9kZWwsCiAgICAgICAgZGV2aWNlPWRldmljZSwKICAgICAgICBsZWFybmluZ19yYXRlPWFyZ3MubHIsCiAgICAgICAgYmF0Y2hfc2l6ZT1hcmdzLmJhdGNoX3NpemUsCiAgICAgICAgZXBvY2hzPWFyZ3MuZXBvY2hzLAogICAgICAgIHBhdGllbmNlPWFyZ3MucGF0aWVuY2UsCiAgICAgICAgY2hlY2twb2ludF9kaXI9Y2twdF9kaXIsCiAgICApCgogICAgc3VtbWFyeSA9IHRyYWluZXIudHJhaW4odHJhaW5fc3RhdGVzLCB0cmFpbl9sYWJlbHMsIHZhbF9zdGF0ZXMsIHZhbF9sYWJlbHMpCgogICAgIyBFdmFsdWF0ZSBvbiB0ZXN0IHNldCBpZiBhdmFpbGFibGUKICAgIGlmIG9zLnBhdGguZXhpc3RzKHRlc3RfcGF0aCk6CiAgICAgICAgbG9nZ2VyLmluZm8oIiIpCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgUnVubmluZyB0ZXN0IHNldCBldmFsdWF0aW9uLi4uIikKICAgICAgICB0ZXN0X3N0YXRlcywgdGVzdF9sYWJlbHMgPSBsb2FkX25wel9zcGxpdCh0ZXN0X3BhdGgpCgogICAgICAgICMgUmVsb2FkIGJlc3QgY2hlY2twb2ludCBmb3IgZXZhbHVhdGlvbgogICAgICAgIGJlc3RfbW9kZWwsIF8gPSBsb2FkX2NoZWNrcG9pbnQoc3VtbWFyeVsiY2hlY2twb2ludF9wYXRoIl0sIGRldmlj' +
'ZSkKICAgICAgICByZXN1bHRzID0gZXZhbHVhdGVfbW9kZWwoYmVzdF9tb2RlbCwgdGVzdF9zdGF0ZXMsIHRlc3RfbGFiZWxzLCBkZXZpY2UpCiAgICAgICAgcHJpbnRfZXZhbHVhdGlvbihyZXN1bHRzKQoKICAgICAgICBldmFsX3BhdGggPSBvcy5wYXRoLmpvaW4oY2twdF9kaXIsICJldmFsX3Jlc3VsdHMuanNvbiIpCiAgICAgICAgd2l0aCBvcGVuKGV2YWxfcGF0aCwgInciKSBhcyBmOgogICAgICAgICAgICBqc29uLmR1bXAocmVzdWx0cywgZiwgaW5kZW50PTIpCiAgICAgICAgbG9nZ2VyLmluZm8oIiAgRXZhbCByZXN1bHRzIHNhdmVkOiAlcyIsIGV2YWxfcGF0aCkKICAgIGVsc2U6CiAgICAgICAgbG9nZ2VyLmluZm8oIiAgTm8gdGVzdCBkYXRhIGZvdW5kIGF0ICVzIOKAlCBza2lwcGluZyBldmFsdWF0aW9uLiIsIHRlc3RfcGF0aCkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg=='
Install-B64 -R 'ml\training\trainer.py' -B $b
# overnight-run.bat (2,860 bytes)
$b = 'QGVjaG8gb2ZmClJFTSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKUkVNICBDb21tYW5kZXIgQUkgTGFiIOKAlCBPdmVybmlnaHQgQUZLIFJ1bm5lcgpSRU0g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQClJFTQpSRU0gIFJ1bnMgYmF0Y2ggc2ltdWxhdGlvbnMgZm9yIH4xMS41IGhvdXJzLCB0aGVuIGF1dG8tdHJhaW5zClJFTSAgdGhlIE1MIHBvbGljeSBuZXR3b3JrLiBEZXNpZ25lZCB0byBydW4gd2hpbGUgeW91IHNsZWVwLgpSRU0KUkVNICBQUkVSRVFVSVNJVEVTOgpSRU0gICAgMS4gTGFiIHNlcnZlciBtdXN0IGFscmVhZHkgYmUgcnVubmluZyAoc3RhcnQtbGFiLmJhdCkKUkVNICAgIDIuIExNIFN0dWRpbyBtdXN0IGJlIHJ1bm5pbmcgd2l0aCBEZWVwU2VlayBsb2FkZWQKUkVNICAgIDMuIEF0IGxlYXN0IDEgZGVjayBhdmFpbGFibGUgaW4gdGhlIGxhYgpSRU0KUkVNICBVU0FHRToKUkVNICAgIERvdWJsZS1jbGljayB0aGlzIGZpbGUsIG9yIHJ1biBmcm9tIGNvbW1hbmQgcHJvbXB0OgpSRU0gICAgICBvdmVybmlnaHQtcnVuLmJhdApSRU0KUkVNICBUbyBjdXN0b21pemUsIGVkaXQgdGhlIHNldHRpbmdzIGJlbG93IG9yIHBhc3MgYXJndW1lbnRzOgpSRU0gICAgICBvdmVybmlnaHQtcnVuLmJhdCAtLWdhbWVzIDUwIC0taG91cnMgOCAtLWVwb2NocyAyMDAKUkVNIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZWNoby4KZWNobyAg4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXCmVjaG8gIOKVkSAgIENvbW1hbmRlciBBSSBMYWIg4oCUIE92ZXJuaWdodCBBRksgUnVubmVyICAgICAgICDilZEKZWNobyAg4pWg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWjCmVjaG8gIOKVkSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pWRCmVjaG8gIOKVkSAgIFRoaXMgd2lsbCBydW4gYmF0Y2ggc2ltdWxhdGlvbnMgZm9yIH4xMS41aCAgICAg4pWRCmVjaG8gIOKVkSAgIHRoZW4gYXV0by10cmFpbiB0aGUgTUwgcG9saWN5IG5ldHdvcmsuICAgICAgICAg4pWRCmVjaG8gIOKVkSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pWRCmVjaG8gIOKVkSAgIE1ha2Ugc3VyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pWRCmVjaG8gIOKVkSAgICAtIExhYiBzZXJ2ZXIgaXMgcnVubmluZyAoc3RhcnQtbGFiLmJhdCkgICAgICAg4pWRCmVjaG8gIOKVkSAgICAtIExNIFN0dWRpbyBoYXMgRGVlcFNlZWsgbG9hZGVkICAgICAgICAgICAgICAg4pWRCmVjaG8gIOKVkSAgICAtIFBvd2VyIHNldHRpbmdzOiBwcmV2ZW50IHNsZWVwICAgICAgICAgICAgICAgIOKVkQplY2hvICDilZEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKVkQplY2hvICDilZEgICBQcmVzcyBDdHJsK0MgYXQgYW55IHRpbWUgdG8gc3RvcCBlYXJseS4gICAgICAgIOKVkQplY2hvICDilZEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKVkQplY2hvICDilZri' +
'lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0KZWNoby4KClJFTSDilIDilIAgUGF1c2UgdG8gbGV0IHVzZXIgcmVhZCB0aGUgbWVzc2FnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKdGltZW91dCAvdCA1IC9ub2JyZWFrID5udWwKClJFTSDilIDilIAgUnVuIHRoZSBQeXRob24gb3Zlcm5pZ2h0IHNjcmlwdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKcHl0aG9uICIlfmRwMG92ZXJuaWdodC1ydW4ucHkiICUqCgppZiAlRVJST1JMRVZFTCUgbmVxIDAgKAogICAgZWNoby4KICAgIGVjaG8gIE92ZXJuaWdodCBydW4gZW5kZWQgd2l0aCBlcnJvcnMuIENoZWNrIHRoZSBvdXRwdXQgYWJvdmUuCiAgICBlY2hvLgopCgplY2hvLgplY2hvICBPdmVybmlnaHQgcnVuIGNvbXBsZXRlLiBQcmVzcyBhbnkga2V5IHRvIGNsb3NlLgpwYXVzZSA+bnVsCg=='
Install-B64 -R 'overnight-run.bat' -B $b
# overnight-run.py (19,654 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIE92ZXJuaWdodCBBRksgUnVubmVyCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkApSdW5zIHJlcGVhdGVkIGJhdGNoIHNpbXVsYXRpb25zIGFuZCB0aGVuIHRyaWdnZXJzIE1MIHRyYWluaW5nLApkZXNpZ25lZCB0byBydW4gdW5hdHRlbmRlZCBmb3IgaG91cnMgKGUuZy4sIG92ZXJuaWdodCB3aGlsZSBBRkspLgoKVXNhZ2UgKGZyb20gY29tbWFuZGVyLWFpLWxhYiBmb2xkZXIpOgogICAgcHl0aG9uIG92ZXJuaWdodC1ydW4ucHkKCk9yIHZpYSB0aGUgYmF0Y2ggZmlsZToKICAgIG92ZXJuaWdodC1ydW4uYmF0CgpQcmVyZXF1aXNpdGVzOgogICAgLSBMYWIgc2VydmVyIG11c3QgYWxyZWFkeSBiZSBydW5uaW5nIChzdGFydC1sYWIuYmF0KQogICAgLSBBdCBsZWFzdCAxIGRlY2sgYXZhaWxhYmxlCiAgICAtIExNIFN0dWRpbyAvIERlZXBTZWVrIG11c3QgYmUgcnVubmluZyBmb3IgRGVlcFNlZWsgZW5naW5lCiAgICAtIEZvcmdlIG11c3QgYmUgYnVpbHQgZm9yIEphdmEgZW5naW5lCgpDb25maWd1cmF0aW9uOgogICAgRWRpdCB0aGUgc2V0dGluZ3MgYmVsb3csIG9yIHBhc3MgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KIiIiCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGpzb24KaW1wb3J0IHN5cwppbXBvcnQgdGltZQppbXBvcnQgdXJsbGliLnJlcXVlc3QKaW1wb3J0IHVybGxpYi5lcnJvcgpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZWRlbHRhCgoKIyDilIDilIAgRGVmYXVsdCBDb25maWcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACkRFRkFVTFRfQ09ORklHID0gewogICAgImxhYl91cmwiOiAiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiwKICAgICJlbmdpbmUiOiAiZGVlcHNlZWsiLCAgICAgICAjICJkZWVwc2VlayIgb3IgImphdmEiCiAgICAiZ2FtZXNfcGVyX2JhdGNoIjogMzAsICAgICAgIyBnYW1lcyBwZXIgYmF0Y2ggcnVuCiAgICAibnVtX2JhdGNoZXMiOiAwLCAgICAgICAgICAgIyAwID0gcnVuIHVudGlsIHRpbWVfbGltaXRfaG91cnMKICAgICJ0aW1lX2xpbWl0X2hvdXJzIjogMTEuNSwgICAjIHN0b3AgYWZ0ZXIgdGhpcyBtYW55IGhvdXJzIChsZWF2ZSBidWZmZXIgZm9yIHRyYWluaW5nKQogICAgInBhdXNlX2JldHdlZW5fYmF0Y2hlcyI6IDEwLCAgIyBzZWNvbmRzIHRvIHBhdXNlIGJldHdlZW4gYmF0Y2hlcwogICAgImF1dG9fdHJhaW4iOiBUcnVlLCAgICAgICAgICMgdHJpZ2dlciBNTCB0cmFpbmluZyBhZnRlciBhbGwgYmF0Y2hlcwogICAgInRyYWluX2Vwb2NocyI6IDEwMCwgICAgICAgICMgdHJhaW5pbmcgZXBvY2hzCiAgICAidHJhaW5fbHIiOiAwLjAwMSwgICAgICAgICAgIyBsZWFybmluZyByYXRlCiAgICAidHJhaW5fYmF0Y2hfc2l6ZSI6IDI1NiwgICAgIyB0cmFpbmluZyBiYXRjaCBzaXplCiAgICAidHJhaW5fcGF0aWVuY2UiOiAxNSwgICAgICAgIyBlYXJseSBzdG9wcGluZyBwYXRpZW5jZQogICAgIyBKYXZhLW9ubHkgc2V0dGluZ3MgKGlnbm9yZWQgZm9yIERlZXBTZWVrKToKICAgICJqYXZhX3RocmVhZHMiOiA0LAogICAgImphdmFfY2xvY2siOiAzMDAsCiAgICAiamF2YV9kZWNrcyI6IFtdLCAgICAgICAgICAgIyBleGFjdGx5IDMgZGVjayBuYW1lcyByZXF1aXJlZCBmb3IgSmF2YQogICAgIyBEZWVwU2VlayBzZXR0aW5nczoKICAgICJkc19kZWNrcyI6IFtdLCAgICAgICAgICAgICAjIGRlY2sgbmFtZXMgKGF1dG8tZGV0ZWN0ZWQgaWYgZW1wdHkpCn0KCgpkZWYgbG9nKG1zZyk6CiAgICB0cyA9IGRhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKCIlSDolTTolUyIpCiAgICBwcmludChmIlt7dHN9XSB7bXNnfSIpCiAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKCgpkZWYgYXBpX2dldChiYXNlX3VybCwgcGF0aCk6CiAgICAiIiJHRVQgcmVxdWVzdCB0byBsYWIgQVBJLiIiIgogICAgdXJsID0gYmFzZV91cmwucnN0cmlwKCIvIikgKyBwYXRoCiAgICByZXEgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KHVybCkKICAgIHRyeToKICAgICAgICB3aXRoIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxLCB0aW1lb3V0PTMw' +
'KSBhcyByZXNwOgogICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkcyhyZXNwLnJlYWQoKS5kZWNvZGUoKSkKICAgIGV4Y2VwdCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yIGFzIGU6CiAgICAgICAgYm9keSA9IGUucmVhZCgpLmRlY29kZSgpIGlmIGUuZnAgZWxzZSAiIgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihmIkhUVFAge2UuY29kZX06IHtib2R5fSIpCgoKZGVmIGFwaV9wb3N0KGJhc2VfdXJsLCBwYXRoLCBkYXRhPU5vbmUpOgogICAgIiIiUE9TVCByZXF1ZXN0IHRvIGxhYiBBUEkuIiIiCiAgICB1cmwgPSBiYXNlX3VybC5yc3RyaXAoIi8iKSArIHBhdGgKICAgIGJvZHkgPSBqc29uLmR1bXBzKGRhdGEgb3Ige30pLmVuY29kZSgpCiAgICByZXEgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KHVybCwgZGF0YT1ib2R5LCBtZXRob2Q9IlBPU1QiKQogICAgcmVxLmFkZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIikKICAgIHRyeToKICAgICAgICB3aXRoIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxLCB0aW1lb3V0PTMwMCkgYXMgcmVzcDoKICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCkpCiAgICBleGNlcHQgdXJsbGliLmVycm9yLkhUVFBFcnJvciBhcyBlOgogICAgICAgIGVycl9ib2R5ID0gZS5yZWFkKCkuZGVjb2RlKCkgaWYgZS5mcCBlbHNlICIiCiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKGYiSFRUUCB7ZS5jb2RlfToge2Vycl9ib2R5fSIpCgoKZGVmIGNoZWNrX3NlcnZlcihiYXNlX3VybCk6CiAgICAiIiJWZXJpZnkgdGhlIGxhYiBzZXJ2ZXIgaXMgcnVubmluZy4iIiIKICAgIHRyeToKICAgICAgICBhcGlfZ2V0KGJhc2VfdXJsLCAiL2FwaS9sYWIvZGVja3MiKQogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBGYWxzZQoKCmRlZiBnZXRfYXZhaWxhYmxlX2RlY2tzKGJhc2VfdXJsKToKICAgICIiIkZldGNoIGFsbCBkZWNrIG5hbWVzLiIiIgogICAgcmVzcCA9IGFwaV9nZXQoYmFzZV91cmwsICIvYXBpL2xhYi9kZWNrcyIpCiAgICByZXR1cm4gW2RbIm5hbWUiXSBmb3IgZCBpbiByZXNwLmdldCgiZGVja3MiLCBbXSldCgoKZGVmIHN0YXJ0X2RlZXBzZWVrX2JhdGNoKGJhc2VfdXJsLCBkZWNrcywgbnVtX2dhbWVzKToKICAgICIiIlN0YXJ0IGEgRGVlcFNlZWsgYmF0Y2ggYW5kIHJldHVybiB0aGUgYmF0Y2ggSUQuIiIiCiAgICByZXNwID0gYXBpX3Bvc3QoYmFzZV91cmwsICIvYXBpL2xhYi9zdGFydC1kZWVwc2VlayIsIHsKICAgICAgICAiZGVja3MiOiBkZWNrcywKICAgICAgICAibnVtR2FtZXMiOiBudW1fZ2FtZXMsCiAgICB9KQogICAgcmV0dXJuIHJlc3AuZ2V0KCJiYXRjaElkIikKCgpkZWYgc3RhcnRfamF2YV9iYXRjaChiYXNlX3VybCwgZGVja3MsIG51bV9nYW1lcywgdGhyZWFkcywgY2xvY2spOgogICAgIiIiU3RhcnQgYSBKYXZhL0ZvcmdlIGJhdGNoIGFuZCByZXR1cm4gdGhlIGJhdGNoIElELiIiIgogICAgcmVzcCA9IGFwaV9wb3N0KGJhc2VfdXJsLCAiL2FwaS9sYWIvc3RhcnQiLCB7CiAgICAgICAgImRlY2tzIjogZGVja3MsCiAgICAgICAgIm51bUdhbWVzIjogbnVtX2dhbWVzLAogICAgICAgICJ0aHJlYWRzIjogdGhyZWFkcywKICAgICAgICAiY2xvY2siOiBjbG9jaywKICAgIH0pCiAgICByZXR1cm4gcmVzcC5nZXQoImJhdGNoSWQiKQoKCmRlZiB3YWl0X2Zvcl9iYXRjaChiYXNlX3VybCwgYmF0Y2hfaWQsIGVuZ2luZT0iZGVlcHNlZWsiLCBkZWFkbGluZT1Ob25lKToKICAgICIiIlBvbGwgdW50aWwgYmF0Y2ggY29tcGxldGVzIG9yIGRlYWRsaW5lIGlzIHJlYWNoZWQuCiAgICBSZXR1cm5zIHJlc3VsdCBkaWN0LCBvciBOb25lIG9uIGVycm9yL3RpbWVvdXQuIiIiCiAgICBwb2xsX2ludGVydmFsID0gMTUgICMgc2Vjb25kcwogICAgY29uc2VjdXRpdmVfZXJyb3JzID0gMAogICAgbGFzdF9jb21wbGV0ZWQgPSAtMQogICAgc3RhbGxfY2hlY2tzID0gMAoKICAgIHdoaWxlIFRydWU6CiAgICAgICAgIyBIYXJkIGRlYWRsaW5lIGNoZWNrIOKAlCBzdG9wIHdhaXRpbmcgaWYgd2UndmUgcnVuIG91dCBvZiB0aW1lCiAgICAgICAgaWYgZGVhZGxpbmUgYW5kIHRpbWUudGltZSgpID49IGRlYWRsaW5lOgogICAgICAgICAgICBsb2coZiIgIFRpbWUgbGltaXQgcmVhY2hlZCB3aGlsZSBiYXRjaCB7YmF0Y2hfaWR9IHdhcyBydW5uaW5nLiIpCiAgICAgICAgICAgIGxvZyhmIiAgVGhlIGJhdGNoIHdpbGwg' +
'Y29udGludWUgb24gdGhlIHNlcnZlciBidXQgd2UncmUgbW92aW5nIG9uLiIpCiAgICAgICAgICAgIHJldHVybiB7ImNvbXBsZXRlZCI6IDAsICJ0aW1lZF9vdXQiOiBUcnVlfQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0YXR1cyA9IGFwaV9nZXQoYmFzZV91cmwsIGYiL2FwaS9sYWIvc3RhdHVzP2JhdGNoSWQ9e2JhdGNoX2lkfSIpCiAgICAgICAgICAgIGNvbnNlY3V0aXZlX2Vycm9ycyA9IDAKCiAgICAgICAgICAgIGNvbXBsZXRlZCA9IHN0YXR1cy5nZXQoImNvbXBsZXRlZEdhbWVzIiwgMCkKICAgICAgICAgICAgdG90YWwgPSBzdGF0dXMuZ2V0KCJ0b3RhbEdhbWVzIiwgIj8iKQogICAgICAgICAgICBydW5uaW5nID0gc3RhdHVzLmdldCgicnVubmluZyIsIEZhbHNlKQogICAgICAgICAgICBlcnJvciA9IHN0YXR1cy5nZXQoImVycm9yIikKICAgICAgICAgICAgZWxhcHNlZCA9IHN0YXR1cy5nZXQoImVsYXBzZWRNcyIsIDApCgogICAgICAgICAgICBpZiBlcnJvcjoKICAgICAgICAgICAgICAgIGxvZyhmIiAgQmF0Y2gge2JhdGNoX2lkfSBFUlJPUjoge2Vycm9yfSIpCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgaWYgbm90IHJ1bm5pbmcgYW5kIGNvbXBsZXRlZCA+IDA6CiAgICAgICAgICAgICAgICBlbGFwc2VkX3MgPSBlbGFwc2VkIC8gMTAwMCBpZiBlbGFwc2VkIGVsc2UgMAogICAgICAgICAgICAgICAgbG9nKGYiICBCYXRjaCB7YmF0Y2hfaWR9IGNvbXBsZXRlOiB7Y29tcGxldGVkfSBnYW1lcyBpbiB7ZWxhcHNlZF9zOi4wZn1zIikKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhcGlfZ2V0KGJhc2VfdXJsLCBmIi9hcGkvbGFiL3Jlc3VsdD9iYXRjaElkPXtiYXRjaF9pZH0iKQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsiY29tcGxldGVkIjogY29tcGxldGVkfQoKICAgICAgICAgICAgIyBOb3Qgc3RhcnRlZCB5ZXQgY2hlY2sgKHJ1bm5pbmc9RmFsc2UsIGNvbXBsZXRlZD0wKQogICAgICAgICAgICBpZiBub3QgcnVubmluZyBhbmQgY29tcGxldGVkID09IDA6CiAgICAgICAgICAgICAgICBzdGFsbF9jaGVja3MgKz0gMQogICAgICAgICAgICAgICAgaWYgc3RhbGxfY2hlY2tzID4gMjA6ICAjIDUgbWluIHdpdGggbm8gcHJvZ3Jlc3MKICAgICAgICAgICAgICAgICAgICBsb2coZiIgIEJhdGNoIHtiYXRjaF9pZH0gbmV2ZXIgc3RhcnRlZC4gQWJvcnRpbmcuIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgIyBQcm9ncmVzcyBsb2cgd2l0aCBFVEEKICAgICAgICAgICAgaWYgZGVhZGxpbmU6CiAgICAgICAgICAgICAgICBtaW5zX2xlZnQgPSAoZGVhZGxpbmUgLSB0aW1lLnRpbWUoKSkgLyA2MAogICAgICAgICAgICAgICAgbG9nKGYiICBQcm9ncmVzczoge2NvbXBsZXRlZH0ve3RvdGFsfSBnYW1lcyAoe2VsYXBzZWQgLyAxMDAwOi4wZn1zKSDigJQge21pbnNfbGVmdDouMGZ9bWluIGxlZnQgaW4gcnVuIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZyhmIiAgUHJvZ3Jlc3M6IHtjb21wbGV0ZWR9L3t0b3RhbH0gZ2FtZXMgKHtlbGFwc2VkIC8gMTAwMDouMGZ9cykiKQoKICAgICAgICAgICAgIyBUcmFjayBzdGFsbAogICAgICAgICAgICBpZiBjb21wbGV0ZWQgPT0gbGFzdF9jb21wbGV0ZWQ6CiAgICAgICAgICAgICAgICBzdGFsbF9jaGVja3MgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhbGxfY2hlY2tzID0gMAogICAgICAgICAgICAgICAgbGFzdF9jb21wbGV0ZWQgPSBjb21wbGV0ZWQKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBjb25zZWN1dGl2ZV9lcnJvcnMgKz0gMQogICAgICAgICAgICBpZiBjb25zZWN1dGl2ZV9lcnJvcnMgPiAxMDoKICAgICAgICAgICAgICAgIGxvZyhmIiAgTG9zdCBjb25uZWN0aW9uIHRvIHNlcnZlciBhZnRlciAxMCByZXRyaWVzLiBBYm9ydGluZyBiYXRjaC4iKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgbG9nKGYiICBDb25uZWN0aW9uIGVycm9yIChyZXRyeSB7Y29uc2VjdXRpdmVfZXJyb3JzfS8xMCk6IHtlfSIpCgogICAgICAgIHRpbWUuc2xlZXAocG9sbF9pbnRlcnZhbCkKCgpkZWYgc3RhcnRfdHJhaW5pbmcoYmFzZV91cmwsIGVwb2NocywgbHIsIGJhdGNo' +
'X3NpemUsIHBhdGllbmNlKToKICAgICIiIlRyaWdnZXIgTUwgdHJhaW5pbmcgYW5kIHJldHVybiBpbW1lZGlhdGVseS4iIiIKICAgIHJlc3AgPSBhcGlfcG9zdChiYXNlX3VybCwgIi9hcGkvbWwvdHJhaW4iLCB7CiAgICAgICAgImVwb2NocyI6IGVwb2NocywKICAgICAgICAibHIiOiBsciwKICAgICAgICAiYmF0Y2hTaXplIjogYmF0Y2hfc2l6ZSwKICAgICAgICAicGF0aWVuY2UiOiBwYXRpZW5jZSwKICAgICAgICAicmVidWlsZERhdGFzZXQiOiBUcnVlLAogICAgfSkKICAgIHJldHVybiByZXNwCgoKZGVmIHdhaXRfZm9yX3RyYWluaW5nKGJhc2VfdXJsKToKICAgICIiIlBvbGwgdW50aWwgdHJhaW5pbmcgY29tcGxldGVzLiIiIgogICAgcG9sbF9pbnRlcnZhbCA9IDMwICAjIHNlY29uZHMKCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhdHVzID0gYXBpX2dldChiYXNlX3VybCwgIi9hcGkvbWwvdHJhaW4vc3RhdHVzIikKICAgICAgICAgICAgcnVubmluZyA9IHN0YXR1cy5nZXQoInJ1bm5pbmciLCBGYWxzZSkKICAgICAgICAgICAgcGhhc2UgPSBzdGF0dXMuZ2V0KCJwaGFzZSIsICJ1bmtub3duIikKICAgICAgICAgICAgbWVzc2FnZSA9IHN0YXR1cy5nZXQoIm1lc3NhZ2UiLCAiIikKICAgICAgICAgICAgZXBvY2ggPSBzdGF0dXMuZ2V0KCJjdXJyZW50X2Vwb2NoIiwgMCkKICAgICAgICAgICAgdG90YWwgPSBzdGF0dXMuZ2V0KCJ0b3RhbF9lcG9jaHMiLCAwKQogICAgICAgICAgICBlcnJvciA9IHN0YXR1cy5nZXQoImVycm9yIikKCiAgICAgICAgICAgIGlmIGVycm9yOgogICAgICAgICAgICAgICAgbG9nKGYiICBUcmFpbmluZyBFUlJPUjoge2Vycm9yfSIpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGlmIG5vdCBydW5uaW5nIGFuZCBwaGFzZSBpbiAoImRvbmUiLCAiaWRsZSIpIGFuZCBlcG9jaCA+IDA6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzdGF0dXMuZ2V0KCJyZXN1bHQiLCB7fSkKICAgICAgICAgICAgICAgIGxvZyhmIiAgVHJhaW5pbmcgY29tcGxldGUhIikKICAgICAgICAgICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgICAgICAgICBsb2coZiIgIEZpbmFsIGFjY3VyYWN5OiB7cmVzdWx0LmdldCgnYmVzdF92YWxfYWNjdXJhY3knLCAnPycpfSIpCiAgICAgICAgICAgICAgICAgICAgbG9nKGYiICBNb2RlbCBzYXZlZDoge3Jlc3VsdC5nZXQoJ21vZGVsX3BhdGgnLCAnPycpfSIpCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgaWYgcGhhc2UgPT0gInRyYWluaW5nIiBhbmQgdG90YWwgPiAwOgogICAgICAgICAgICAgICAgbWV0cmljcyA9IHN0YXR1cy5nZXQoIm1ldHJpY3MiLCB7fSkKICAgICAgICAgICAgICAgIHZhbF9hY2MgPSBtZXRyaWNzLmdldCgidmFsX2FjY3VyYWN5IiwgIj8iKSBpZiBtZXRyaWNzIGVsc2UgIj8iCiAgICAgICAgICAgICAgICBsb2coZiIgIFRyYWluaW5nOiBlcG9jaCB7ZXBvY2h9L3t0b3RhbH0g4oCUIHttZXNzYWdlfSAodmFsX2FjYzoge3ZhbF9hY2N9KSIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2coZiIgIFt7cGhhc2V9XSB7bWVzc2FnZX0iKQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZyhmIiAgQ29ubmVjdGlvbiBlcnJvcjoge2V9IikKCiAgICAgICAgdGltZS5zbGVlcChwb2xsX2ludGVydmFsKQoKCmRlZiBnZXRfbWxfZGF0YV9zdW1tYXJ5KGJhc2VfdXJsKToKICAgICIiIkdldCBjdXJyZW50IE1MIHRyYWluaW5nIGRhdGEgc3RhdHMuIiIiCiAgICB0cnk6CiAgICAgICAgc3RhdHVzID0gYXBpX2dldChiYXNlX3VybCwgIi9hcGkvbWwvdHJhaW4vc3RhdHVzIikKICAgICAgICBkYXRhX2ZpbGVzID0gc3RhdHVzLmdldCgiZGF0YV9maWxlcyIsIFtdKQogICAgICAgIHRvdGFsID0gc3VtKGYuZ2V0KCJkZWNpc2lvbnMiLCAwKSBmb3IgZiBpbiBkYXRhX2ZpbGVzKQogICAgICAgIHJldHVybiB0b3RhbCwgbGVuKGRhdGFfZmlsZXMpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiAwLCAwCgoKZGVmIHJ1bl9vdmVybmlnaHQoY2ZnKToKICAgICIiIk1haW4gb3Zlcm5pZ2h0IHBpcGVsaW5lLiIiIgogICAgYmFzZV91cmwgPSBjZmdbImxhYl91cmwiXQoKICAgIGxvZygiPSIgKiA2MCkKICAgIGxvZygiICBDb21tYW5kZXIgQUkgTGFiIOKAlCBPdmVybmlnaHQgQUZLIFJ1bm5lciIpCiAgICBsb2coIj0iICogNjApCgogICAgIyDilIDi' +
'lIAgVmVyaWZ5IHNlcnZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGxvZygiQ2hlY2tpbmcgbGFiIHNlcnZlci4uLiIpCiAgICBpZiBub3QgY2hlY2tfc2VydmVyKGJhc2VfdXJsKToKICAgICAgICBsb2coZiJFUlJPUjogQ2Fubm90IHJlYWNoIGxhYiBzZXJ2ZXIgYXQge2Jhc2VfdXJsfSIpCiAgICAgICAgbG9nKCJTdGFydCB0aGUgbGFiIGZpcnN0OiBzdGFydC1sYWIuYmF0IikKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBsb2coZiJTZXJ2ZXIgT0sgYXQge2Jhc2VfdXJsfSIpCgogICAgIyDilIDilIAgR2V0IGRlY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgYXZhaWxhYmxlX2RlY2tzID0gZ2V0X2F2YWlsYWJsZV9kZWNrcyhiYXNlX3VybCkKICAgIGxvZyhmIkZvdW5kIHtsZW4oYXZhaWxhYmxlX2RlY2tzKX0gZGVja3M6IHsnLCAnLmpvaW4oYXZhaWxhYmxlX2RlY2tzWzo1XSl9eycuLi4nIGlmIGxlbihhdmFpbGFibGVfZGVja3MpID4gNSBlbHNlICcnfSIpCgogICAgZW5naW5lID0gY2ZnWyJlbmdpbmUiXQogICAgaWYgZW5naW5lID09ICJkZWVwc2VlayI6CiAgICAgICAgZGVja3MgPSBjZmdbImRzX2RlY2tzIl0gaWYgY2ZnWyJkc19kZWNrcyJdIGVsc2UgYXZhaWxhYmxlX2RlY2tzCiAgICAgICAgaWYgbm90IGRlY2tzOgogICAgICAgICAgICBsb2coIkVSUk9SOiBObyBkZWNrcyBhdmFpbGFibGUuIENyZWF0ZSBkZWNrcyBpbiB0aGUgRGVjayBCdWlsZGVyIGZpcnN0LiIpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGxvZyhmIlVzaW5nIERlZXBTZWVrIGVuZ2luZSB3aXRoIHtsZW4oZGVja3MpfSBkZWNrKHMpIikKICAgIGVsc2U6CiAgICAgICAgZGVja3MgPSBjZmdbImphdmFfZGVja3MiXQogICAgICAgIGlmIGxlbihkZWNrcykgIT0gMzoKICAgICAgICAgICAgbG9nKCJFUlJPUjogSmF2YSBlbmdpbmUgcmVxdWlyZXMgZXhhY3RseSAzIGRlY2sgbmFtZXMuIikKICAgICAgICAgICAgbG9nKCJTZXQgamF2YV9kZWNrcyBpbiB0aGUgY29uZmlnIG9yIHVzZSAtLWRlY2tzIGRlY2sxIGRlY2syIGRlY2szIikKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgbG9nKGYiVXNpbmcgSmF2YS9Gb3JnZSBlbmdpbmUgd2l0aCBkZWNrczoge2RlY2tzfSIpCgogICAgIyDilIDilIAgTUwgbG9nZ2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGxvZygiRW5hYmxpbmcgTUwgbG9nZ2luZy4uLiIpCiAgICB0cnk6CiAgICAgICAgYXBpX3Bvc3QoYmFzZV91cmwsICIvYXBpL21sL3RvZ2dsZT9lbmFibGU9dHJ1ZSIsIHt9KQogICAgICAgIGxvZygiTUwgbG9nZ2luZyBlbmFibGVkIikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2coZiJXQVJOSU5HOiBDb3VsZCBub3QgZW5hYmxlIE1MIGxvZ2dpbmc6IHtlfSIpCiAgICAgICAgbG9nKCIoRGVlcFNlZWsgYmF0Y2hlcyBhbHdheXMgbG9nIE1MIGRhdGEgcmVnYXJkbGVzcykiKQogICAgICAgICMgVHJ5IGFsdGVybmF0ZSBmb3JtCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhcGlfZ2V0KGJhc2VfdXJsLCAiL2FwaS9tbC90b2dnbGU/ZW5hYmxlPXRydWUiKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAjIOKUgOKUgCBJbml0aWFsIGRhdGEgc3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBkZWNpc2lvbnNfYmVmb3JlLCBmaWxlc19iZWZvcmUgPSBnZXRfbWxfZGF0YV9zdW1tYXJ5KGJhc2VfdXJsKQogICAgbG9nKGYiQ3VycmVudCBNTCBkYXRhOiB7ZGVjaXNpb25zX2JlZm9yZX0gZGVjaXNpb25zIGluIHtmaWxlc19iZWZvcmV9IGZpbGVzIikKCiAgICAjIOKUgOKUgCBSdW4gYmF0Y2hl' +
'cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGdhbWVzX3Blcl9iYXRjaCA9IGNmZ1siZ2FtZXNfcGVyX2JhdGNoIl0KICAgIG51bV9iYXRjaGVzID0gY2ZnWyJudW1fYmF0Y2hlcyJdCiAgICB0aW1lX2xpbWl0ID0gY2ZnWyJ0aW1lX2xpbWl0X2hvdXJzIl0gKiAzNjAwICAjIGNvbnZlcnQgdG8gc2Vjb25kcwogICAgcGF1c2Vfc2VjID0gY2ZnWyJwYXVzZV9iZXR3ZWVuX2JhdGNoZXMiXQoKICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQogICAgZGVhZGxpbmUgPSBzdGFydF90aW1lICsgdGltZV9saW1pdAogICAgYmF0Y2hfbnVtID0gMAogICAgdG90YWxfZ2FtZXMgPSAwCiAgICB0b3RhbF9kZWNpc2lvbnMgPSAwCgogICAgbG9nKCIiKQogICAgbG9nKGYiU3RhcnRpbmcgYmF0Y2ggbG9vcDoiKQogICAgaWYgbnVtX2JhdGNoZXMgPiAwOgogICAgICAgIGxvZyhmIiAgTW9kZToge251bV9iYXRjaGVzfSBiYXRjaGVzIMOXIHtnYW1lc19wZXJfYmF0Y2h9IGdhbWVzIikKICAgIGVsc2U6CiAgICAgICAgbG9nKGYiICBNb2RlOiBSdW4gZm9yIHtjZmdbJ3RpbWVfbGltaXRfaG91cnMnXX1oLCB7Z2FtZXNfcGVyX2JhdGNofSBnYW1lcy9iYXRjaCIpCiAgICBsb2coZiIgIEVuZ2luZToge2VuZ2luZX0iKQogICAgbG9nKGYiICBBdXRvLXRyYWluIGFmdGVyOiB7J1llcycgaWYgY2ZnWydhdXRvX3RyYWluJ10gZWxzZSAnTm8nfSIpCiAgICBsb2coIiIpCgogICAgd2hpbGUgVHJ1ZToKICAgICAgICAjIENoZWNrIHN0b3BwaW5nIGNvbmRpdGlvbnMKICAgICAgICBpZiBudW1fYmF0Y2hlcyA+IDAgYW5kIGJhdGNoX251bSA+PSBudW1fYmF0Y2hlczoKICAgICAgICAgICAgbG9nKGYiUmVhY2hlZCB0YXJnZXQgb2Yge251bV9iYXRjaGVzfSBiYXRjaGVzLiBTdG9wcGluZy4iKQogICAgICAgICAgICBicmVhawoKICAgICAgICBlbGFwc2VkID0gdGltZS50aW1lKCkgLSBzdGFydF90aW1lCiAgICAgICAgcmVtYWluaW5nID0gZGVhZGxpbmUgLSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHJlbWFpbmluZyA8IDEyMDogICMgbmVlZCBhdCBsZWFzdCAyIG1pbiBmb3IgYSBiYXRjaAogICAgICAgICAgICBsb2coZiJUaW1lIGxpbWl0IGFwcHJvYWNoaW5nICh7cmVtYWluaW5nOi4wZn1zIGxlZnQpLiBTdG9wcGluZyBzaW0gbG9vcC4iKQogICAgICAgICAgICBicmVhawoKICAgICAgICBiYXRjaF9udW0gKz0gMQogICAgICAgIGVsYXBzZWRfc3RyID0gc3RyKHRpbWVkZWx0YShzZWNvbmRzPWludChlbGFwc2VkKSkpCiAgICAgICAgcmVtYWluaW5nX3N0ciA9IHN0cih0aW1lZGVsdGEoc2Vjb25kcz1pbnQocmVtYWluaW5nKSkpCiAgICAgICAgbG9nKGYi4pSA4pSAIEJhdGNoIHtiYXRjaF9udW19IOKUgOKUgCAoZWxhcHNlZDoge2VsYXBzZWRfc3RyfSwgcmVtYWluaW5nOiB7cmVtYWluaW5nX3N0cn0pIikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBlbmdpbmUgPT0gImRlZXBzZWVrIjoKICAgICAgICAgICAgICAgIGJhdGNoX2lkID0gc3RhcnRfZGVlcHNlZWtfYmF0Y2goYmFzZV91cmwsIGRlY2tzLCBnYW1lc19wZXJfYmF0Y2gpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiYXRjaF9pZCA9IHN0YXJ0X2phdmFfYmF0Y2goCiAgICAgICAgICAgICAgICAgICAgYmFzZV91cmwsIGRlY2tzLCBnYW1lc19wZXJfYmF0Y2gsCiAgICAgICAgICAgICAgICAgICAgY2ZnWyJqYXZhX3RocmVhZHMiXSwgY2ZnWyJqYXZhX2Nsb2NrIl0sCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBpZiBub3QgYmF0Y2hfaWQ6CiAgICAgICAgICAgICAgICBsb2coIiAgRVJST1I6IEZhaWxlZCB0byBzdGFydCBiYXRjaCAobm8gYmF0Y2hJZCByZXR1cm5lZCkiKQogICAgICAgICAgICAgICAgbG9nKCIgIFdhaXRpbmcgNjBzIGJlZm9yZSByZXRyeS4uLiIpCiAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDYwKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGxvZyhmIiAgU3RhcnRlZCBiYXRjaCB7YmF0Y2hfaWR9IikKICAgICAgICAgICAgcmVzdWx0ID0gd2FpdF9mb3JfYmF0Y2goYmFzZV91cmwsIGJhdGNoX2lkLCBlbmdpbmUsIGRlYWRsaW5lPWRlYWRsaW5lKQoKICAgICAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgICAgICAgdG90YWxfZ2FtZXMgKz0gZ2Ft' +
'ZXNfcGVyX2JhdGNoCiAgICAgICAgICAgICAgICAjIExvZyBkZWNrIHJlc3VsdHMgaWYgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICBmb3IgZGVjayBpbiByZXN1bHQuZ2V0KCJkZWNrcyIsIFtdKToKICAgICAgICAgICAgICAgICAgICB3ciA9IGRlY2suZ2V0KCJ3aW5SYXRlIiwgIj8iKQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkZWNrLmdldCgiZGVja05hbWUiLCAiPyIpCiAgICAgICAgICAgICAgICAgICAgbG9nKGYiICAgIHtuYW1lfToge3dyfSUgV1IiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nKCIgIEJhdGNoIGZhaWxlZCwgY29udGludWluZyB0byBuZXh0Li4uIikKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBsb2coZiIgIEVSUk9SIHN0YXJ0aW5nIGJhdGNoOiB7ZX0iKQogICAgICAgICAgICBsb2coIiAgV2FpdGluZyA2MHMgYmVmb3JlIHJldHJ5Li4uIikKICAgICAgICAgICAgdGltZS5zbGVlcCg2MCkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBQYXVzZSBiZXR3ZWVuIGJhdGNoZXMKICAgICAgICBpZiBwYXVzZV9zZWMgPiAwOgogICAgICAgICAgICBsb2coZiIgIENvb2xpbmcgZG93biB7cGF1c2Vfc2VjfXMuLi4iKQogICAgICAgICAgICB0aW1lLnNsZWVwKHBhdXNlX3NlYykKCiAgICAjIOKUgOKUgCBTdW1tYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgdG90YWxfZWxhcHNlZCA9IHRpbWUudGltZSgpIC0gc3RhcnRfdGltZQogICAgZGVjaXNpb25zX2FmdGVyLCBmaWxlc19hZnRlciA9IGdldF9tbF9kYXRhX3N1bW1hcnkoYmFzZV91cmwpCiAgICBuZXdfZGVjaXNpb25zID0gZGVjaXNpb25zX2FmdGVyIC0gZGVjaXNpb25zX2JlZm9yZQogICAgbmV3X2ZpbGVzID0gZmlsZXNfYWZ0ZXIgLSBmaWxlc19iZWZvcmUKCiAgICBsb2coIiIpCiAgICBsb2coIj0iICogNjApCiAgICBsb2coIiAgQkFUQ0ggU0lNVUxBVElPTiBDT01QTEVURSIpCiAgICBsb2coIj0iICogNjApCiAgICBsb2coZiIgIEJhdGNoZXMgcnVuOiAgICAgICB7YmF0Y2hfbnVtfSIpCiAgICBsb2coZiIgIFRvdGFsIGdhbWVzOiAgICAgICB+e3RvdGFsX2dhbWVzfSIpCiAgICBsb2coZiIgIE5ldyBNTCBkZWNpc2lvbnM6ICB7bmV3X2RlY2lzaW9uc30gKGluIHtuZXdfZmlsZXN9IG5ldyBmaWxlcykiKQogICAgbG9nKGYiICBUb3RhbCBNTCBkYXRhOiAgICAge2RlY2lzaW9uc19hZnRlcn0gZGVjaXNpb25zIikKICAgIGxvZyhmIiAgRWxhcHNlZCB0aW1lOiAgICAgIHtzdHIodGltZWRlbHRhKHNlY29uZHM9aW50KHRvdGFsX2VsYXBzZWQpKSl9IikKICAgIGxvZygiIikKCiAgICAjIOKUgOKUgCBBdXRvLXRyYWluIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgY2ZnWyJhdXRvX3RyYWluIl06CiAgICAgICAgaWYgZGVjaXNpb25zX2FmdGVyIDwgMTAwOgogICAgICAgICAgICBsb2coIlNraXBwaW5nIHRyYWluaW5nIOKAlCB0b28gZmV3IGRlY2lzaW9ucyAobmVlZCBhdCBsZWFzdCAxMDApIikKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgbG9nKCJTdGFydGluZyBNTCB0cmFpbmluZyBwaXBlbGluZS4uLiIpCiAgICAgICAgbG9nKGYiICBFcG9jaHM6IHtjZmdbJ3RyYWluX2Vwb2NocyddfSwgTFI6IHtjZmdbJ3RyYWluX2xyJ119LCAiCiAgICAgICAgICAgIGYiQmF0Y2g6IHtjZmdbJ3RyYWluX2JhdGNoX3NpemUnXX0sIFBhdGllbmNlOiB7Y2ZnWyd0cmFpbl9wYXRpZW5jZSddfSIpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhcnRfdHJhaW5pbmcoCiAgICAgICAgICAgICAgICBiYXNlX3VybCwKICAgICAgICAgICAgICAgIGVwb2Nocz1jZmdbInRyYWluX2Vwb2NocyJdLAogICAgICAgICAgICAgICAgbHI9Y2ZnWyJ0cmFpbl9sciJdLAogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZT1jZmdbInRyYWluX2JhdGNoX3NpemUiXSwKICAgICAgICAgICAgICAgIHBhdGllbmNlPWNmZ1sidHJhaW5fcGF0aWVuY2UiXSwKICAgICAgICAgICAgKQogICAgICAgICAgICBsb2co' +
'IlRyYWluaW5nIHN0YXJ0ZWQsIG1vbml0b3JpbmcgcHJvZ3Jlc3MuLi4iKQogICAgICAgICAgICBzdWNjZXNzID0gd2FpdF9mb3JfdHJhaW5pbmcoYmFzZV91cmwpCiAgICAgICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgICAgICAgICBsb2coIiIpCiAgICAgICAgICAgICAgICBsb2coIj0iICogNjApCiAgICAgICAgICAgICAgICBsb2coIiAgVFJBSU5JTkcgQ09NUExFVEUg4oCUIG1vZGVsIHVwZGF0ZWQhIikKICAgICAgICAgICAgICAgIGxvZygiPSIgKiA2MCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZygiVHJhaW5pbmcgZmluaXNoZWQgd2l0aCBlcnJvcnMuIENoZWNrIHRoZSBUcmFpbmluZyB0YWIgZm9yIGRldGFpbHMuIikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZyhmIkVSUk9SIHN0YXJ0aW5nIHRyYWluaW5nOiB7ZX0iKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBsb2coIiIpCiAgICBsb2coIk92ZXJuaWdodCBydW4gZmluaXNoZWQuIFlvdSBjYW4gY2xvc2UgdGhpcyB3aW5kb3cuIikKICAgIHJldHVybiBUcnVlCgoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgICAgIGRlc2NyaXB0aW9uPSJDb21tYW5kZXIgQUkgTGFiIOKAlCBPdmVybmlnaHQgQUZLIFJ1bm5lciIsCiAgICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKICAgICAgICBlcGlsb2c9IiIiCkV4YW1wbGVzOgogICMgUnVuIERlZXBTZWVrIHNpbXMgZm9yIDExLjUgaG91cnMsIHRoZW4gdHJhaW46CiAgcHl0aG9uIG92ZXJuaWdodC1ydW4ucHkKCiAgIyBSdW4gMjAgYmF0Y2hlcyBvZiA1MCBnYW1lcyBlYWNoLCB0aGVuIHRyYWluOgogIHB5dGhvbiBvdmVybmlnaHQtcnVuLnB5IC0tYmF0Y2hlcyAyMCAtLWdhbWVzIDUwCgogICMgUnVuIGZvciA2IGhvdXJzIHdpdGggSmF2YSBlbmdpbmU6CiAgcHl0aG9uIG92ZXJuaWdodC1ydW4ucHkgLS1lbmdpbmUgamF2YSAtLWhvdXJzIDYgLS1kZWNrcyAiRGVjayBBIiAiRGVjayBCIiAiRGVjayBDIgoKICAjIEp1c3QgcnVuIHNpbXMsIG5vIHRyYWluaW5nOgogIHB5dGhvbiBvdmVybmlnaHQtcnVuLnB5IC0tbm8tdHJhaW4KCiAgIyBDdXN0b20gdHJhaW5pbmcgc2V0dGluZ3M6CiAgcHl0aG9uIG92ZXJuaWdodC1ydW4ucHkgLS1lcG9jaHMgMjAwIC0tbHIgMC4wMDA1IC0tcGF0aWVuY2UgMjAKICAgICAgICAiIiIsCiAgICApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXVybCIsIGRlZmF1bHQ9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkxhYiBzZXJ2ZXIgVVJMIChkZWZhdWx0OiBodHRwOi8vbG9jYWxob3N0OjgwODApIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZW5naW5lIiwgY2hvaWNlcz1bImRlZXBzZWVrIiwgImphdmEiXSwgZGVmYXVsdD0iZGVlcHNlZWsiLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTaW0gZW5naW5lIChkZWZhdWx0OiBkZWVwc2VlaykiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1nYW1lcyIsIHR5cGU9aW50LCBkZWZhdWx0PTMwLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJHYW1lcyBwZXIgYmF0Y2ggKGRlZmF1bHQ6IDMwKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWJhdGNoZXMiLCB0eXBlPWludCwgZGVmYXVsdD0wLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJOdW1iZXIgb2YgYmF0Y2hlcyAoMCA9IHJ1biB1bnRpbCB0aW1lIGxpbWl0KSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWhvdXJzIiwgdHlwZT1mbG9hdCwgZGVmYXVsdD0xMS41LAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJNYXggaG91cnMgdG8gcnVuIHNpbXMgKGRlZmF1bHQ6IDExLjUpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcGF1c2UiLCB0eXBlPWludCwgZGVmYXVsdD0xMCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU2Vjb25kcyBiZXR3ZWVuIGJhdGNoZXMgKGRlZmF1bHQ6IDEwKSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWRlY2tzIiwgbmFyZ3M9IisiLCBkZWZhdWx0PVtdLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEZWNrIG5hbWVzIChhdXRvLWRldGVjdGVkIGlmIG5vdCBzcGVjaWZpZWQpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tbm8tdHJhaW4iLCBhY3Rpb249InN0' +
'b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTa2lwIGF1dG8tdHJhaW5pbmcgYWZ0ZXIgc2ltcyIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWVwb2NocyIsIHR5cGU9aW50LCBkZWZhdWx0PTEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iVHJhaW5pbmcgZXBvY2hzIChkZWZhdWx0OiAxMDApIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tbHIiLCB0eXBlPWZsb2F0LCBkZWZhdWx0PTAuMDAxLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJUcmFpbmluZyBsZWFybmluZyByYXRlIChkZWZhdWx0OiAwLjAwMSkiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1iYXRjaC1zaXplIiwgdHlwZT1pbnQsIGRlZmF1bHQ9MjU2LAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJUcmFpbmluZyBiYXRjaCBzaXplIChkZWZhdWx0OiAyNTYpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcGF0aWVuY2UiLCB0eXBlPWludCwgZGVmYXVsdD0xNSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRWFybHkgc3RvcHBpbmcgcGF0aWVuY2UgKGRlZmF1bHQ6IDE1KSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXRocmVhZHMiLCB0eXBlPWludCwgZGVmYXVsdD00LAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJKYXZhIGVuZ2luZSB0aHJlYWRzIChkZWZhdWx0OiA0KSIpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWNsb2NrIiwgdHlwZT1pbnQsIGRlZmF1bHQ9MzAwLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJKYXZhIGVuZ2luZSBjbG9jayAoZGVmYXVsdDogMzAwKSIpCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKICAgIGNmZyA9IGRpY3QoREVGQVVMVF9DT05GSUcpCiAgICBjZmdbImxhYl91cmwiXSA9IGFyZ3MudXJsCiAgICBjZmdbImVuZ2luZSJdID0gYXJncy5lbmdpbmUKICAgIGNmZ1siZ2FtZXNfcGVyX2JhdGNoIl0gPSBhcmdzLmdhbWVzCiAgICBjZmdbIm51bV9iYXRjaGVzIl0gPSBhcmdzLmJhdGNoZXMKICAgIGNmZ1sidGltZV9saW1pdF9ob3VycyJdID0gYXJncy5ob3VycwogICAgY2ZnWyJwYXVzZV9iZXR3ZWVuX2JhdGNoZXMiXSA9IGFyZ3MucGF1c2UKICAgIGNmZ1siYXV0b190cmFpbiJdID0gbm90IGFyZ3Mubm9fdHJhaW4KICAgIGNmZ1sidHJhaW5fZXBvY2hzIl0gPSBhcmdzLmVwb2NocwogICAgY2ZnWyJ0cmFpbl9sciJdID0gYXJncy5scgogICAgY2ZnWyJ0cmFpbl9iYXRjaF9zaXplIl0gPSBhcmdzLmJhdGNoX3NpemUKICAgIGNmZ1sidHJhaW5fcGF0aWVuY2UiXSA9IGFyZ3MucGF0aWVuY2UKICAgIGNmZ1siamF2YV90aHJlYWRzIl0gPSBhcmdzLnRocmVhZHMKICAgIGNmZ1siamF2YV9jbG9jayJdID0gYXJncy5jbG9jawoKICAgIGlmIGFyZ3MuZGVja3M6CiAgICAgICAgaWYgYXJncy5lbmdpbmUgPT0gImphdmEiOgogICAgICAgICAgICBjZmdbImphdmFfZGVja3MiXSA9IGFyZ3MuZGVja3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBjZmdbImRzX2RlY2tzIl0gPSBhcmdzLmRlY2tzCgogICAgc3VjY2VzcyA9IHJ1bl9vdmVybmlnaHQoY2ZnKQogICAgc3lzLmV4aXQoMCBpZiBzdWNjZXNzIGVsc2UgMSkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg=='
Install-B64 -R 'overnight-run.py' -B $b
# pom.xml (4,586 bytes)
$b = 'PHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CiAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CgogICAgPGdyb3VwSWQ+Y29tLmNvbW1hbmRlcmFpbGFiPC9ncm91cElkPgogICAgPGFydGlmYWN0SWQ+Y29tbWFuZGVyLWFpLWxhYjwvYXJ0aWZhY3RJZD4KICAgIDx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KCiAgICA8bmFtZT5Db21tYW5kZXIgQUkgTGFiPC9uYW1lPgogICAgPGRlc2NyaXB0aW9uPkhlYWRsZXNzIGJhdGNoIHNpbXVsYXRpb24gZW52aXJvbm1lbnQgZm9yIE1URyBDb21tYW5kZXIgd2l0aCAzLUFJIHBvZHM8L2Rlc2NyaXB0aW9uPgoKICAgIDxwcm9wZXJ0aWVzPgogICAgICAgIDxtYXZlbi5jb21waWxlci5zb3VyY2U+MTc8L21hdmVuLmNvbXBpbGVyLnNvdXJjZT4KICAgICAgICA8bWF2ZW4uY29tcGlsZXIudGFyZ2V0PjE3PC9tYXZlbi5jb21waWxlci50YXJnZXQ+CiAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CiAgICAgICAgPGdzb24udmVyc2lvbj4yLjEwLjE8L2dzb24udmVyc2lvbj4KICAgICAgICA8cGljb2NsaS52ZXJzaW9uPjQuNy41PC9waWNvY2xpLnZlcnNpb24+CiAgICAgICAgPCEtLSBNdXN0IG1hdGNoIHRoZSB2ZXJzaW9uIGluIFlPVVIgbG9jYWwgRm9yZ2UgY2xvbmUncyBwb20ueG1sLgogICAgICAgICAgICAgRmluZCBpdCBieSBydW5uaW5nOiAgbXZuIGhlbHA6ZXZhbHVhdGUgLURleHByZXNzaW9uPXByb2plY3QudmVyc2lvbiAtcSAtRGZvcmNlU3Rkb3V0CiAgICAgICAgICAgICBpbnNpZGUgeW91ciBmb3JnZS8gZGlyZWN0b3J5LiAgQ3VycmVudCBDYXJkLUZvcmdlIG1hc3RlciBpcyAyLjAuMTItU05BUFNIT1QuIC0tPgogICAgICAgIDxmb3JnZS52ZXJzaW9uPjIuMC4xMi1TTkFQU0hPVDwvZm9yZ2UudmVyc2lvbj4KICAgIDwvcHJvcGVydGllcz4KCiAgICA8ZGVwZW5kZW5jaWVzPgogICAgICAgIDwhLS0KICAgICAgICAgICAgRm9yZ2UgZW5naW5lIG1vZHVsZXMg4oCUIHRoZXNlIG11c3QgYmUgaW5zdGFsbGVkIHRvIHlvdXIgbG9jYWwgTWF2ZW4gcmVwbyBGSVJTVC4KICAgICAgICAgICAgRnJvbSB5b3VyIGZvcmdlLyBjbG9uZSBkaXJlY3RvcnkgcnVuOgogICAgICAgICAgICAgIG12biBpbnN0YWxsIC1wbCBmb3JnZS1jb3JlLGZvcmdlLWdhbWUsZm9yZ2UtYWkgLURza2lwVGVzdHMgLURyZXZpc2lvbj0yLjAuMTItU05BUFNIT1QKICAgICAgICAgICAgVGhhdCBwdXRzIHRoZSBKQVJzIGludG8gfi8ubTIvcmVwb3NpdG9yeS9mb3JnZS8uLi4KICAgICAgICAtLT4KICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgPGdyb3VwSWQ+Zm9yZ2U8L2dyb3VwSWQ+CiAgICAgICAgICAgIDxhcnRpZmFjdElkPmZvcmdlLWNvcmU8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgIDx2ZXJzaW9uPiR7Zm9yZ2UudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICA8Z3JvdXBJZD5mb3JnZTwvZ3JvdXBJZD4KICAgICAgICAgICAgPGFydGlmYWN0SWQ+Zm9yZ2UtZ2FtZTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgPHZlcnNpb24+JHtmb3JnZS52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgIDxncm91cElkPmZvcmdlPC9ncm91cElkPgogICAgICAgICAgICA8YXJ0aWZhY3RJZD5mb3JnZS1haTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgPHZlcnNpb24+JHtmb3JnZS52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICA8L2RlcGVuZGVuY3k+CgogICAgICAgIDwhLS0gSlNPTiAtLT4KICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+CiAgICAgICAgICAgIDxhcnRpZmFjdElkPmdzb248L2FydGlmYWN0SWQ+CiAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3Nvbi52ZXJzaW9ufTwv' +
'dmVyc2lvbj4KICAgICAgICA8L2RlcGVuZGVuY3k+CgogICAgICAgIDwhLS0gQ0xJIGFyZ3VtZW50IHBhcnNpbmcgLS0+CiAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgIDxncm91cElkPmluZm8ucGljb2NsaTwvZ3JvdXBJZD4KICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGljb2NsaTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgPHZlcnNpb24+JHtwaWNvY2xpLnZlcnNpb259PC92ZXJzaW9uPgogICAgICAgIDwvZGVwZW5kZW5jeT4KCiAgICAgICAgPCEtLSBTUUxpdGUgSkRCQyAtLT4KICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnhlcmlhbDwvZ3JvdXBJZD4KICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3FsaXRlLWpkYmM8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgIDx2ZXJzaW9uPjMuNDUuMS4wPC92ZXJzaW9uPgogICAgICAgIDwvZGVwZW5kZW5jeT4KCiAgICAgICAgPCEtLSBUZXN0aW5nIC0tPgogICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICA8Z3JvdXBJZD5vcmcuanVuaXQuanVwaXRlcjwvZ3JvdXBJZD4KICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQtanVwaXRlcjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgPHZlcnNpb24+NS4xMC4yPC92ZXJzaW9uPgogICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgPC9kZXBlbmRlbmNpZXM+CgogICAgPGJ1aWxkPgogICAgICAgIDxwbHVnaW5zPgogICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMy4wPC92ZXJzaW9uPgogICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+Y29tbWFuZGVyYWlsYWIuY2xpLkxhYkNsaTwvbWFpbkNsYXNzPgogICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgogICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZT4KICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaGFkZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjUuMTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgogICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPjxnb2FsPnNoYWRlPC9nb2FsPjwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zZm9ybWVycz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5zaGFkZS5yZXNvdXJjZS5NYW5pZmVzdFJlc291cmNlVHJhbnNmb3JtZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPmNvbW1hbmRlcmFpbGFiLmNsaS5MYWJDbGk8L21haW5DbGFzcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cmFuc2Zvcm1lcnM+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICA8dmVy' +
'c2lvbj4zLjIuMzwvdmVyc2lvbj4KICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgPC9wbHVnaW5zPgogICAgPC9idWlsZD4KPC9wcm9qZWN0Pgo='
Install-B64 -R 'pom.xml' -B $b
# precon-decks/Creative_Energy.dck (1,666 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPUNyZWF0aXZlIEVuZXJneQpbQ29tbWFuZGVyXQoxIFNhdHlhLCBBZXRoZXJmbHV4IEdlbml1cwpbTWFpbl0KMSBBZGFya2FyIFdhc3RlcwoxIEFldGhlciBIdWIKMSBBZXRoZXIgUmVmaW5lcnkKMSBBZXRoZXJnZW9kZSBNaW5lcgoxIEFldGhlcnNwaGVyZSBIYXJ2ZXN0ZXIKMSBBZXRoZXJzcXVhbGwgQW5jaWVudAoxIEFldGhlcnN0b3JtIFJvYwoxIEFldGhlcnRpZGUgV2hhbGUKMSBBZXRoZXJ3b3JrcyBNYXJ2ZWwKMSBBa3JvbWEncyBXaWxsCjEgQW1wZWQgUmFwdG9yCjEgQW5nZWwgb2YgSW52ZW50aW9uCjEgQXJjYW5lIFNpZ25ldAoxIEF1cm9yYSBTaGlmdGVyCjEgQXVzdGVyZSBDb21tYW5kCjEgQXpvcml1cyBDaGFuY2VyeQoxIEJhdHRsZWZpZWxkIEZvcmdlCjEgQmVzcG9rZSBCYXR0bGV3YWdvbgoxIEJpZGVudCBvZiBUaGFzc2EKMSBCbGFzdGVyIEh1bGsKMSBCcnVkaWNsYWQsIFRlbGNob3IgRW5naW5lZXIKMSBCdXJuaXNoZWQgSGFydAoxIENhc3RsZSBWYW50cmVzcwoxIENheXRoLCBGYW1lZCBNZWNoYW5pc3QKMSBDb2FsaXRpb24gUmVsaWMKMSBDb21idXN0aWJsZSBHZWFyaHVsawoxIENvbW1hbmQgVG93ZXIKMSBDb25maXNjYXRpb24gQ291cAoxIENvbnZlcnNpb24gQXBwYXJhdHVzCjEgQ292ZXRlZCBKZXdlbAoxIERlY29jdGlvbiBNb2R1bGUKMSBEZW1vbGl0aW9uIEZpZWxkCjEgRXJhIG9mIElubm92YXRpb24KMSBGYXJld2VsbAoxIEZpbGlncmVlIFJhY2VyCjEgRnJvc3Rib2lsIFNuYXJsCjEgRnVyeWNhbG0gU25hcmwKMSBHbGltbWVyIG9mIEdlbml1cwoxIEdvbGRzcGFuIERyYWdvbgoxIEdvbnRpJ3MgQWV0aGVyIEhlYXJ0CjEgR3JlbnpvLCBIYXZvYyBSYWlzZXIKMSBIb3VyZ2xhc3Mgb2YgdGhlIExvc3QKMSBJenpldCBCb2lsZXJ3b3JrcwoxIEl6emV0IEdlbmVyYXRvcml1bQoxIEpvbHRlZCBBd2FrZQoxIExlZ2lvbiBMb3lhbHR5CjEgTGlnaHRuaW5nIFJ1bm5lcgoxIExvY2FsaXplZCBEZXN0cnVjdGlvbgoxIE1pZG5pZ2h0IENsb2NrCjEgTXlyIEJhdHRsZXNwaGVyZQoxIE15c3RpYyBHYXRlCjEgTXlzdGljIE1vbmFzdGVyeQoxIE92ZXJjbG9ja2VkIEVsZWN0cm9tYW5jZXIKMSBQb3J0IFRvd24KMSBQcmFpcmllIFN0cmVhbQoxIFByb2Zlc3Npb25hbCBGYWNlLUJyZWFrZXIKMSBSYXpvcmZpZWxkIFJpcHBlcgoxIFJvaWwgQ2FydG9ncmFwaGVyCjEgU2FsdmF0aW9uIENvbG9zc3VzCjEgU2N1cnJ5IG9mIEdyZW1saW5zCjEgU2hpdmFuIFJlZWYKMSBTaWx2ZXJxdWlsbCBMZWN0dXJlcgoxIFNreWNsYXZlIEFwcGFyaXRpb24KMSBTb2wgUmluZwoxIFNvbGFyIFRyYW5zZm9ybWVyCjEgU29sZW1uIFNpbXVsYWNydW0KMSBTcGhpbnggb2YgdGhlIFJldmVsYXRpb24KMSBTdG9uZSBJZG9sIEdlbmVyYXRvcgoxIFN3b3JkcyB0byBQbG93c2hhcmVzCjEgVGFsaXNtYW4gb2YgQ29udmljdGlvbgoxIFRhbGlzbWFuIG9mIENyZWF0aXZpdHkKMSBUYWxpc21hbiBvZiBQcm9ncmVzcwoxIFRlbXBsZSBvZiBFbmxpZ2h0ZW5tZW50CjEgVGVtcGxlIG9mIEVwaXBoYW55CjEgVGVtcGxlIG9mIFRyaXVtcGgKMSBUZXp6ZXJldCdzIEdhbWJpdAoxIFVuc3RhYmxlIEFtdWxldAoxIFdheWZhcmVyJ3MgQmF1YmxlCjEgV2hpcmxlciBWaXJ0dW9zbwo3IFBsYWlucwo3IElzbGFuZAo2IE1vdW50YWluCg=='
Install-B64 -R 'precon-decks\Creative_Energy.dck' -B $b
# precon-decks/Eldrazi_Unbound.dck (1,680 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPUVsZHJhemkgVW5ib3VuZApbQ29tbWFuZGVyXQoxIFpodWxvZG9rLCBWb2lkIEdvcmdlcgpbTWFpbl0KMSBBYnN0cnVzZSBBcmNoYWljCjEgQWxsIElzIER1c3QKMSBBbmNpZW50IFN0b25lIElkb2wKMSBBcmNhbmUgTGlnaHRob3VzZQoxIEFyY2ggb2YgT3JhemNhCjEgQXJ0aXNhbiBvZiBLb3ppbGVrCjEgQmFuZSBvZiBCYWxhIEdlZAoxIEJsYXN0IFpvbmUKMSBCb25kZXJzJyBFbmNsYXZlCjEgQnVybmlzaGVkIEhhcnQKMSBDYWxhbWl0eSBvZiB0aGUgVGl0YW5zCjEgQ3Jhc2hpbmcgRHJhd2JyaWRnZQoxIERhcmtzdGVlbCBNb25vbGl0aAoxIERlc2VjcmF0ZSBSZWFsaXR5CjEgRHJlYW1zdG9uZSBIZWRyb24KMSBEdXBsaWNhbnQKMSBFbGRyYXppIFRlbXBsZQoxIEVuZGJyaW5nZXIKMSBFbmRsZXNzIEF0bGFzCjEgRW5kbGVzcyBPbmUKMSBFdmVyZmxvd2luZyBDaGFsaWNlCjEgRmlyZXNocmlla2VyCjEgRmxheWVyIG9mIExveWFsdGllcwoxIEZvcmdlIG9mIEhlcm9lcwoxIEZvcnNha2VuIE1vbnVtZW50CjEgR2VpZXIgUmVhY2ggU2FuaXRhcml1bQoxIEdlb2RlIEdvbGVtCjEgR3VpbGRsZXNzIENvbW1vbnMKMSBIYW5nYXJiYWNrIFdhbGtlcgoxIEhlZHJvbiBBcmNoaXZlCjEgSW52ZXN0aWdhdG9yJ3MgSm91cm5hbAoxIEl0IFRoYXQgQmV0cmF5cwoxIEthbGRyYSBDb21wbGVhdAoxIEtvemlsZWssIHRoZSBHcmVhdCBEaXN0b3J0aW9uCjEgTGlnaHRuaW5nIEdyZWF2ZXMKMSBNYWdlLVJpbmcgTmV0d29yawoxIE1hdHRlciBSZXNoYXBlcgoxIE1hemVtaW5kIFRvbWUKMSBNZXRhbHdvcmsgQ29sb3NzdXMKMSBNZXRlb3IgR29sZW0KMSBNaW5kIFN0b25lCjEgTWlyYWdlIE1pcnJvcgoxIE1pcnJvcnBvb2wKMSBNeXJpYWQgQ29uc3RydWN0CjEgTXlzdGljIEZvcmdlCjEgTm90IG9mIFRoaXMgV29ybGQKMSBPYmxpdmlvbiBTb3dlcgoxIE9tYXJ0aGlzLCBHaG9zdGZpcmUgSW5pdGlhdGUKMSBPcm5pdGhvcHRlciBvZiBQYXJhZGlzZQoxIFBhbGxhZGl1bSBNeXIKMSBQZXJpbG91cyBWYXVsdAoxIFBoeXJleGlhbiBUcmluaWZvcm0KMSBSZWxpcXVhcnkgVG93ZXIKMSBSaXNlIG9mIHRoZSBFbGRyYXppCjEgUm9ndWUncyBQYXNzYWdlCjEgUnVpbnMgb2YgT3Jhbi1SaWVmCjEgU2NhcmV0aWxsZXIKMSBTY2F2ZW5nZXIgR3JvdW5kcwoxIFNlYSBHYXRlIFdyZWNrYWdlCjEgU2hyaW5lIG9mIHRoZSBGb3JzYWtlbiBHb2RzCjEgU2tpdHRlcmluZyBDaWNhZGEKMSBTb2wgUmluZwoxIFNvbGVtbiBTaW11bGFjcnVtCjEgU291bCBvZiBOZXcgUGh5cmV4aWEKMSBTcGF0aWFsIENvbnRvcnRpb24KMSBTdGVlbCBIZWxsa2l0ZQoxIFN0b25lY29pbCBTZXJwZW50CjEgU3VzcGljaW91cyBCb29rY2FzZQoxIFRlbXBsZSBvZiB0aGUgRmFsc2UgR29kCjEgVGhvdWdodCBWZXNzZWwKMSBUaHJhbiBEeW5hbW8KMSBUaXRhbidzIFByZXNlbmNlCjEgVG9tYiBvZiB0aGUgU3Bpcml0IERyYWdvbgoxIFRyYW5zbW9ncmlmeWluZyBXYW5kCjEgVHlyaXRlIFNhbmN0dW0KMSBVZ2luJ3MgTWFzdGVyeQoxIFVnaW4sIHRoZSBJbmVmZmFibGUKMSBVbnN0YWJsZSBPYmVsaXNrCjEgVXJ6YSdzIE1pbmUKMSBVcnphJ3MgUG93ZXIgUGxhbnQKMSBVcnphJ3MgVG93ZXIKMSBXYXIgUm9vbQoxIFdhcnBpbmcgV2FpbAoxIFdvcm4gUG93ZXJzdG9uZQoxNSBXYXN0ZXMK'
Install-B64 -R 'precon-decks\Eldrazi_Unbound.dck' -B $b
# precon-decks/Elven_Empire.dck (1,493 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPUVsdmVuIEVtcGlyZQpbQ29tbWFuZGVyXQoxIExhdGhyaWwsIEJsYWRlIG9mIHRoZSBFbHZlcwpbTWFpbl0KMSBBYm9taW5hdGlvbiBvZiBMbGFub3dhcgoxIEFtYml0aW9uJ3MgQ29zdAoxIEFyY2FuZSBTaWduZXQKMSBCZWFzdCBXaGlzcGVyZXIKMSBCaW5kaW5nIHRoZSBPbGQgR29kcwoxIEJvdW50eSBvZiBTa2VtZmFyCjEgQ2Fub3B5IFRhY3RpY2lhbgoxIENhc3VhbHRpZXMgb2YgV2FyCjEgQ29tbWFuZCBUb3dlcgoxIENyb3duIG9mIFNrZW1mYXIKMSBDdWx0aXZhdG9yIG9mIEJsYWRlcwoxIER3eW5lbiwgR2lsdC1MZWFmIERhZW4KMSBFbGRlcmZhbmcgUml0dWFsaXN0CjEgRWxkZXJmYW5nIFZlbm9tCjEgRWx2ZW4gQW1idXNoCjEgRWx2aXNoIEFyY2hkcnVpZAoxIEVsdmlzaCBNeXN0aWMKMSBFbHZpc2ggUHJvbWVuYWRlCjEgRWx2aXNoIFJlanV2ZW5hdG9yCjEgRW5kLVJhemUgRm9yZXJ1bm5lcnMKMSBFeWVibGlnaHQgQ3VsbGVycwoxIEV5ZWJsaWdodCBNYXNzYWNyZQoxIEZhcmhhdmVuIEVsZgoxIEZvdWwgT3JjaGFyZAoxIEdvbGdhcmkgRmluZGJyb2tlcgoxIEdvbGdhcmkgR3VpbGRnYXRlCjEgR29sZ2FyaSBSb3QgRmFybQoxIEhhcmFsZCwgS2luZyBvZiBTa2VtZmFyCjEgSGFydmVzdCBTZWFzb24KMSBJbXBlcmlvdXMgUGVyZmVjdAoxIEphZ2dlZC1TY2FyIEFyY2hlcnMKMSBKYXNwZXJhIFNlbnRpbmVsCjEgSnVuZ2xlIEhvbGxvdwoxIExsYW5vd2FyIFRyaWJlCjEgTHlzIEFsYW5hIEh1bnRtYXN0ZXIKMSBMeXMgQWxhbmEgU2NhcmJsYWRlCjEgTWFyd3luLCB0aGUgTnVydHVyZXIKMSBNYXNrZWQgQWRtaXJlcnMKMSBNaWFyYSwgVGhvcm4gb2YgdGhlIEdsYWRlCjEgTW9sZGVydmluZSBSZWNsYW1hdGlvbgoxIE15cmlhZCBMYW5kc2NhcGUKMSBOdWxsbWFnZSBTaGVwaGVyZAoxIE51bWEsIEpvcmFnYSBDaGllZnRhaW4KMSBQYWN0IG9mIHRoZSBTZXJwZW50CjEgUGF0aCBvZiBBbmNlc3RyeQoxIFBvaXNvbiB0aGUgQ3VwCjEgUG9pc29uLVRpcCBBcmNoZXIKMSBQcmlkZSBvZiB0aGUgUGVyZmVjdAoxIFByb3dlc3Mgb2YgdGhlIEZhaXIKMSBQdXRyZWZ5CjEgUmVjbGFtYXRpb24gU2FnZQoxIFJldHVybiBVcG9uIHRoZSBUaWRlCjEgUmh5cyB0aGUgRXhpbGVkCjEgUm9vdHMgb2YgV2lzZG9tCjEgUnV0aGxlc3MgV2lubm93ZXIKMSBTZXJwZW50J3MgU291bC1KYXIKMSBTaGFtYW4gb2YgdGhlIFBhY2sKMSBTa2VtZmFyIEVsZGVyaGFsbAoxIFNrZW1mYXIgU2hhZG93c2FnZQoxIFNvbCBSaW5nCjEgU3ByaW5nYmxvb20gRHJ1aWQKMSBTeWx2YW4gTWVzc2VuZ2VyCjEgVGVyZ3JpZCdzIFNoYWRvdwoxIFRpbWJlcndhdGNoIEVsZgoxIFR3aW5ibGFkZSBBc3Nhc3NpbnMKMSBWb2ljZSBvZiBNYW55CjEgVm9pY2Ugb2YgdGhlIFdvb2RzCjEgV2lyZXdvb2QgQ2hhbm5lbGVyCjEgV29sdmVyaW5lIFJpZGVycwoxIFdvb2QgRWx2ZXMKMSBDb21tYW5kIFRvd2VyCjE0IFN3YW1wCjE0IEZvcmVzdAo='
Install-B64 -R 'precon-decks\Elven_Empire.dck' -B $b
# precon-decks/Explorers_of_the_Deep.dck (1,690 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPUV4cGxvcmVycyBvZiB0aGUgRGVlcApbQ29tbWFuZGVyXQoxIEhha2JhbCBvZiB0aGUgU3VyZ2luZyBTb3VsCltNYWluXQoxIEFldGhlcml6ZQoxIEFsY2hlbWlzdCdzIFJlZnVnZQoxIEFyY2FuZSBTaWduZXQKMSBCZWFzdCBXaXRoaW4KMSBCZW50aGljIEJpb21hbmNlcgoxIEJyYW5jaGluZyBFdm9sdXRpb24KMSBCeWdvbmUgTWFydmVscwoxIENvbGQtRXllZCBTZWxraWUKMSBDb21tYW5kZXIncyBTcGhlcmUKMSBDb21taXQgLy8gTWVtb3J5CjEgQ29tbWFuZCBUb3dlcgoxIENvcmFsaGVsbSBDb21tYW5kZXIKMSBDdXJzZSBvZiB0aGUgU3dpbmUKMSBEZWVwcm9vdCBFbGl0ZQoxIERlZXByb290IEhpc3RvcmlhbgoxIERlZXByb290IFdhdGVycwoxIEVtcGVyb3IgTWloYWlsIElJCjEgRXZvbHV0aW9uIFNhZ2UKMSBFeHBsb3JlCjEgR3Jvd3RoIFNwaXJhbAoxIEhhcmRlbmVkIFNjYWxlcwoxIEhlcmFsZCBvZiBTZWNyZXQgU3RyZWFtcwoxIEhpbnRlcmxhbmQgSGFyYm9yCjEgSW5zcGlyaW5nIENhbGwKMSBLYXJuJ3MgQmFzdGlvbgoxIEtpb3JhJ3MgRm9sbG93ZXIKMSBLaW5kcmVkIERpc2NvdmVyeQoxIEtvZGFtYSdzIFJlYWNoCjEgS29wYWxhLCBXYXJkZW4gb2YgV2F2ZXMKMSBLdW1lbmEsIFR5cmFudCBvZiBPcmF6Y2EKMSBMbGFub3dhciBSZWJvcm4KMSBNYXN0ZXIgb2YgdGhlIFBlYXJsIFRyaWRlbnQKMSBNZXJmb2xrIENhdmUtRGl2ZXIKMSBNZXJmb2xrIE1pc3RiaW5kZXIKMSBNZXJmb2xrIFNreWRpdmVyCjEgTWVyZm9sayBTb3ZlcmVpZ24KMSBNZXJyb3cgUmVlamVyZXkKMSBNZXRhbGxpYyBNaW1pYwoxIE1pc3QgRGFuY2VyCjEgTW9zc3dvcnQgQnJpZGdlCjEgTXlyaWFkIExhbmRzY2FwZQoxIE5pY2FuemlsLCBDdXJyZW50IENvbmR1Y3RvcgoxIFBhdGggb2YgQW5jZXN0cnkKMSBQcmltZSBTcGVha2VyIFplZ2FuYQoxIFF1YW5kcml4IENvbW1hbmQKMSBSYXBpZCBIeWJyaWRpemF0aW9uCjEgUmF2ZW5mb3JtCjEgUmVhbG13YWxrZXIKMSBSZWZsZWN0aW9ucyBvZiBMaXR0amFyYQoxIFJlbGlxdWFyeSBUb3dlcgoxIFJpcHBsZXMgb2YgUG90ZW50aWFsCjEgUm9ndWUncyBQYXNzYWdlCjEgUnVpbm91cyBJbnRydXNpb24KMSBTYWdlIG9mIEZhYmxlcwoxIFNlYWZsb29yIE9yYWNsZQoxIFNlY2x1ZGVkIENvdXJ0eWFyZAoxIFNpbWljIEFzY2VuZGFuY3kKMSBTaW1pYyBHcm93dGggQ2hhbWJlcgoxIFNpbWljIFNpZ25ldAoxIFNpbmdlciBvZiBTd2lmdCBSaXZlcnMKMSBTb2wgUmluZwoxIFN0b255YnJvb2sgQmFubmVyZXQKMSBTdXJnZXNwYW5uZXIKMSBTdnllbHVuIG9mIFNlYSBhbmQgU2t5CjEgU3dpZnRmb290IEJvb3RzCjEgVGF0eW92YSwgQmVudGhpYyBEcnVpZAoxIFRlbXBsZSBvZiBNeXN0ZXJ5CjEgVGVtcGxlIG9mIHRoZSBGYWxzZSBHb2QKMSBUaGFzc2EsIEdvZCBvZiB0aGUgU2VhCjEgVGhpZXZpbmcgU2t5ZGl2ZXIKMSBUaXNoYW5hLCBWb2ljZSBvZiBUaHVuZGVyCjEgVG9wb2dyYXBoeSBUcmFja2VyCjEgVHJpYnV0YXJ5IEluc3RydWN0b3IKMSBVbmNsYWltZWQgVGVycml0b3J5CjEgVmluZWdsaW1tZXIgU25hcmwKMSBWb3JlbCBvZiB0aGUgSHVsbCBDbGFkZQoxIFdhdmUgR29vZGJ5ZQoxIFhvbGF0b3lhYywgdGhlIFNtaWxpbmcgRmxvb2QKMSBaZWdhbmEsIFV0b3BpYW4gU3BlYWtlcgoxMCBJc2xhbmQKMTAgRm9yZXN0Cg=='
Install-B64 -R 'precon-decks\Explorers_of_the_Deep.dck' -B $b
# precon-decks/Mutant_Menace.dck (1,730 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPU11dGFudCBNZW5hY2UKW0NvbW1hbmRlcl0KMSBUaGUgV2lzZSBNb3RobWFuCltNYWluXQoxIEFnZW50IEZyYW5rIEhvcnJpZ2FuCjEgQWxwaGEgRGVhdGhjbGF3CjEgQXJjYW5lIFNpZ25ldAoxIEFzaCBCYXJyZW5zCjEgQXRvbWl6ZQoxIEJpb21hc3MgTXV0YXRpb24KMSBCbG9hdGZseSBTd2FybQoxIEJyYW5jaGluZyBFdm9sdXRpb24KMSBDYXN1YWx0aWVzIG9mIFdhcgoxIENhdGhlZHJhbCBBY29seXRlCjEgQ29tbWFuZCBUb3dlcgoxIENvbnRhZ2lvbiBDbGFzcAoxIENvbnRhbWluYXRlZCBEcmluawoxIENvcnBzZWphY2sgTWVuYWNlCjEgQ3VsdGl2YXRlCjEgRGFya3dhdGVyIENhdGFjb21icwoxIERyb3duZWQgQ2F0YWNvbWIKMSBFdm9sdmluZyBXaWxkcwoxIEV4b3RpYyBPcmNoYXJkCjEgRmFyc2VlawoxIEZlcmFsIEdob3VsCjEgRmV0aWQgUG9vbHMKMSBGaW5kIC8vIEZpbmFsaXR5CjEgRm9yY2VkIEV2b2x1dGlvbgoxIEZyYXlpbmcgU2FuaXR5CjEgR2xvd2luZyBPbmUKMSBHdWFyZGlhbiBQcm9qZWN0CjEgSGFuY29jaywgR2hvdWxpc2ggTWF5b3IKMSBIYXJkZW5lZCBTY2FsZXMKMSBIYXJvbGQgYW5kIEJvYiwgRmlyc3QgTnVtZW5zCjEgSGFybW9uaXplCjEgSGludGVybGFuZCBIYXJib3IKMSBJbmV4b3JhYmxlIFRpZGUKMSBJbmZlc3RpbmcgUmFkcm9hY2gKMSBJbnNwaXJpbmcgQ2FsbAoxIEphc29uIEJyaWdodCwgR2xvd2luZyBQcm9waGV0CjEgTGlseSBCb3dlbiwgUmFnaW5nIEdyYW5kbWEKMSBMdW1iZXJpbmcgTWVnYXNsb3RoCjEgTWFyY3VzLCBNdXRhbnQgTWF5b3IKMSBNYXJpcG9zYSBNaWxpdGFyeSBCYXNlCjEgTWlyZWx1cmsgUXVlZW4KMSBNb3J0dWFyeSBNaXJlCjEgTXV0YXRpb25hbCBBZHZhbnRhZ2UKMSBOZXN0aW5nIEdyb3VuZHMKMSBOaWdodGtpbiBBbWJ1c2hlcgoxIE51Y2xlYXIgRmFsbG91dAoxIE51a2EtTnVrZSBMYXVuY2hlcgoxIE9wdWxlbnQgUGFsYWNlCjEgT3ZlcmZsb3dpbmcgQmFzaW4KMSBQYXRoIG9mIEFuY2VzdHJ5CjEgUGlwZXIgV3JpZ2h0LCBQdWJsaWNrIFJlcG9ydGVyCjEgUG93ZXIgRmlzdAoxIFB1dHJlZnkKMSBSYWRzdG9ybQoxIFJhbXBhZ2luZyBZYW8gR3VhaQoxIFJhbXBhbnQgR3Jvd3RoCjEgU2NyZWVjaGluZyBTY29yY2hiZWFzdAoxIFJhdWwsIFRyb3VibGUgU2hvb3RlcgoxIFJlY29uIENyYWZ0IFRoZXRhCjEgU29sIFJpbmcKMSBTdHJlbmd0aCBCb2JibGVoZWFkCjEgU3RydWdnbGUgZm9yIFByb2plY3QgUHVyaXR5CjEgU3Ryb25nLCB0aGUgQnJ1dGlzaCBUaGVzcGlhbgoxIFN1bmtlbiBIb2xsb3cKMSBUYWludGVkIElzbGUKMSBUYWludGVkIFdvb2QKMSBUYWxpc21hbiBvZiBDdXJpb3NpdHkKMSBUYWxpc21hbiBvZiBEb21pbmFuY2UKMSBUYWxpc21hbiBvZiBSZXNpbGllbmNlCjEgVGF0byBGYXJtZXIKMSBUZW1wbGUgb2YgRGVjZWl0CjEgVGVtcGxlIG9mIE1hbGFkeQoxIFRlbXBsZSBvZiBNeXN0ZXJ5CjEgVGVtcGxlIG9mIHRoZSBGYWxzZSBHb2QKMSBUZXJyYW1vcnBoaWMgRXhwYW5zZQoxIFRoZSBNYXN0ZXIsIFRyYW5zY2VuZGVudAoxIFRoZSBOZWNyb3BvbGlzCjEgVGlyZWxlc3MgVHJhY2tlcgoxIFZleGluZyBSYWRndWxsCjEgVmlyaWRlc2NlbnQgQm9nCjEgV2F0Y2hmdWwgUmFkc3RhZwoxIFdpbmRpbmcgQ29uc3RyaWN0b3IKMSBXb29kbGFuZCBDZW1ldGVyeQoxIFlvdW5nIERlYXRoY2xhd3MKNSBJc2xhbmQKNSBTd2FtcAo1IEZvcmVzdAo='
Install-B64 -R 'precon-decks\Mutant_Menace.dck' -B $b
# precon-decks/Necron_Dynasties.dck (1,326 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPU5lY3JvbiBEeW5hc3RpZXMKW0NvbW1hbmRlcl0KMSBTemFyZWtoLCB0aGUgU2lsZW50IEtpbmcKW01haW5dCjEgQW5yYWt5ciB0aGUgVHJhdmVsbGVyCjEgQXJjYW5lIFNpZ25ldAoxIEJhcnJlbiBNb29yCjEgQmVhY29uIG9mIFVucmVzdAoxIEJpb3RyYW5zZmVyZW5jZQoxIENhZ2VkIFN1bgoxIENhbm9wdGVrIFNjYXJhYiBTd2FybQoxIENhbm9wdGVrIFNweWRlcgoxIENhbm9wdGVrIFRvbWIgU2VudGluZWwKMSBDYW5vcHRlayBXcmFpdGgKMSBDaHJvbm9tYW5jZXIKMSBDb21tYW5kZXIncyBTcGhlcmUKMSBDb252ZXJnZW5jZSBvZiBEb21pbmlvbgoxIENyYW5pYWwgUGxhdGluZwoxIENyeXB0ZWsKMSBDcnlwdG90aHJhbGwKMSBEYXJrbmVzcwoxIERlZmlsZQoxIERlc2VydCBvZiB0aGUgR2xvcmlmaWVkCjEgRHJlYWQgUmV0dXJuCjEgRW5kbGVzcyBBdGxhcwoxIEZsYXllZCBPbmUKMSBHaG9zdCBBcmsKMSBHaWxkZWQgTG90dXMKMSBHbyBmb3IgdGhlIFRocm9hdAoxIEhlZHJvbiBBcmNoaXZlCjEgSGV4bWFyayBEZXN0cm95ZXIKMSBJbGx1bWlub3IgU3plcmFzCjEgSW1vdGVraCB0aGUgU3Rvcm1sb3JkCjEgTGl2aW5nIERlYXRoCjEgTG9raHVzdCBIZWF2eSBEZXN0cm95ZXIKMSBMeWNoZ3VhcmQKMSBNYXNrIG9mIE1lbW9yeQoxIE1pbmQgU3RvbmUKMSBNdXRpbGF0ZQoxIE15c3RpYyBGb3JnZQoxIE15cmlhZCBMYW5kc2NhcGUKMSBOZWNyb24gRGVhdGhtYXJrCjEgTmVjcm9uIE1vbm9saXRoCjEgTmVjcm9uIE92ZXJsb3JkCjEgTmlnaHQgU2N5dGhlCjEgT3V0IG9mIHRoZSBUb21icwoxIFBsYXNtYW5jZXIKMSBQb2xsdXRlZCBNaXJlCjEgUHN5Y2hvbWFuY2VyCjEgUmVsaXF1YXJ5IFRvd2VyCjEgUmVzdXJyZWN0aW9uIE9yYgoxIFJveWFsIFdhcmRlbgoxIFNhdXRla2ggSW1tb3J0YWwKMSBTY2VwdHJlIG9mIEV0ZXJuYWwgR2xvcnkKMSBTY3VscHRpbmcgU3RlZWwKMSBTb2wgUmluZwoxIFNoYXJkIG9mIHRoZSBOaWdodGJyaW5nZXIKMSBTaGFyZCBvZiB0aGUgVm9pZCBEcmFnb24KMSBTa29ycGVraCBEZXN0cm95ZXIKMSBTa29ycGVraCBMb3JkCjEgVGVjaG5vbWFuY2VyCjEgVGhlaXIgTmFtZSBJcyBEZWF0aAoxIFRoZWlyIE51bWJlciBJcyBMZWdpb24KMSBUaG91Z2h0IFZlc3NlbAoxIFRvbWIgQmxhZGUKMSBUb21iIEZvcnRyZXNzCjEgVHJhenluIHRoZSBJbmZpbml0ZQoxIFRyaWFyY2ggUHJhZXRvcmlhbgoxIFRyaWFyY2ggU3RhbGtlcgoxIFVuc3RhYmxlIE9iZWxpc2sKMSBWYXVsdCBvZiBXaGlzcGVycwoxIFRoZSBXYXIgaW4gSGVhdmVuCjEgV2F5ZmFyZXIncyBCYXVibGUKMzAgU3dhbXAK'
Install-B64 -R 'precon-decks\Necron_Dynasties.dck' -B $b
# precon-decks/Planar_Portal.dck (1,384 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPVBsYW5hciBQb3J0YWwKW0NvbW1hbmRlcl0KMSBQcm9zcGVyLCBUb21lLUJvdW5kCltNYWluXQoxIEFwZXggb2YgUG93ZXIKMSBBcmNhbmUgU2lnbmV0CjEgQmFnIG9mIERldm91cmluZwoxIEJlZGV2aWwKMSBCaXR1bWlub3VzIEJsYXN0CjEgQm9qdWthIEJvZwoxIEJ1Y2tuYXJkJ3MgRXZlcmZ1bGwgUHVyc2UKMSBDaGFvcyBDaGFubmVsZXIKMSBDaGFvcyBXYW5kCjEgQ2hhb3MgV2FycAoxIENoaXR0ZXJpbmcgV2l0Y2gKMSBDb21tYW5kIFRvd2VyCjEgQ29tbWFuZGVyJ3MgU3BoZXJlCjEgQ29tbXVuZSB3aXRoIExhdmEKMSBDb25zdW1pbmcgVmFwb3JzCjEgRGFuc2UgTWFjYWJyZQoxIERhcmstRHdlbGxlciBPcmFjbGUKMSBEZWFkIE1hbidzIENoZXN0CjEgRGVhdGggVHlyYW50CjEgRGlyZSBGbGVldCBEYXJlZGV2aWwKMSBEaXNydXB0IERlY29ydW0KMSBEcmVhbSBQaWxsYWdlcgoxIEVib255IEZseQoxIEV0YWxpLCBQcmltYWwgU3Rvcm0KMSBFeG90aWMgT3JjaGFyZAoxIEZlbGx3YXIgU3RvbmUKMSBGZXZlcmVkIFN1c3BpY2lvbgoxIEZpZW5kIG9mIHRoZSBTaGFkb3dzCjEgRmllbmRsYXNoCjEgRm9yZWJvZGluZyBSdWlucwoxIEdvbnRpLCBMb3JkIG9mIEx1eHVyeQoxIEdyaW0gSGlyZWxpbmcKMSBIZWxsaXNoIFJlYnVrZQoxIEhleAoxIEh1cmwgVGhyb3VnaCBIZWxsCjEgSWduaXRlIHRoZSBGdXR1cmUKMSBJenpldCBDaGVtaXN0ZXIKMSBLYXJhemlrYXIsIHRoZSBFeWUgVHlyYW50CjEgTGlnaHQgVXAgdGhlIFN0YWdlCjEgTG9yY2FuLCBXYXJsb2NrIENvbGxlY3RvcgoxIExveWFsIEFwcHJlbnRpY2UKMSBNYXJpb25ldHRlIE1hc3RlcgoxIE1pbmQgU3RvbmUKMSBNb3J0dWFyeSBNaXJlCjEgT2dyZSBTbHVtbG9yZAoxIE9yYXpjYSBSZWxpYwoxIFBodGhpc2lzCjEgUGlwZXIgb2YgdGhlIFN3YXJtCjEgUG9udGlmZiBvZiBCbGlnaHQKMSBSYWtkb3MgQ2FybmFyaXVtCjEgUmFrZG9zIENoYXJtCjEgUmFrZG9zIFNpZ25ldAoxIFJlY2tsZXNzIEVuZGVhdm9yCjEgU2hhZG93Ymxvb2QgUmlkZ2UKMSBTaGFyZSB0aGUgU3BvaWxzCjEgU2hpbnkgSW1wZXR1cwoxIFNtb2xkZXJpbmcgTWFyc2gKMSBTb2wgUmluZwoxIFNwaW5lcm9jayBLbm9sbAoxIFRhaW50ZWQgUGVhawoxIFRhbGlzbWFuIG9mIEluZHVsZ2VuY2UKMSBUZWN0b25pYyBHaWFudAoxIFRlcm1pbmF0ZQoxIFRoZWF0ZXIgb2YgSG9ycm9ycwoxIFRocm9lcyBvZiBDaGFvcwoxIFVuZGVyZGFyayBSaWZ0CjEgVW5zdGFibGUgT2JlbGlzawoxIFZhbmRhbGJsYXN0CjEgV2FybG9jayBDbGFzcwoxIFdpbGQtTWFnaWMgU29yY2VyZXIKMSBZb3UgRmluZCBTb21lIFByaXNvbmVycwoxIFpoYWxmaXJpbiBWb2lkCjE0IFN3YW1wCjEzIE1vdW50YWluCg=='
Install-B64 -R 'precon-decks\Planar_Portal.dck' -B $b
# precon-decks/Science.dck (1,807 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPVNjaWVuY2UhCltDb21tYW5kZXJdCjEgRHIuIE1hZGlzb24gTGkKW01haW5dCjEgQXJjYWRlIEdhbm5vbgoxIEFyY2FuZSBTaWduZXQKMSBBc2ggQmFycmVucwoxIEFzc2F1bHRyb24gRG9taW5hdG9yCjEgQXVzdGVyZSBDb21tYW5kCjEgQXV0b21hdGVkIEFzc2VtYmx5IExpbmUKMSBCZWhlbW90aCBvZiBWYXVsdCAwCjEgQm90dGxlLUNhcCBCbGFzdAoxIEJyb3RoZXJob29kIFNjcmliZQoxIEJyb3RoZXJob29kIFZlcnRpYmlyZAoxIEJ1cmllZCBSdWluCjEgQy5BLk0uUC4KMSBDbGlmZnRvcCBSZXRyZWF0CjEgQ29tbWFuZCBUb3dlcgoxIENydXNoIENvbnRyYWJhbmQKMSBDdXJpZSwgRW1lcmdlbnQgSW50ZWxsaWdlbmNlCjEgRGlzcGF0Y2gKMSBEd2VsbGVyJ3MgSm91cm5leQoxIEVsZGVyIE93eW4gTHlvbnMKMSBFbGVjdHJvc2lwaG9uCjEgRW5kdXJhbmNlIEJvYmJsZWhlYWQKMSBFdmVyZmxvd2luZyBDaGFsaWNlCjEgRXZvbHZpbmcgV2lsZHMKMSBFeG90aWMgT3JjaGFyZAoxIEV4cGVydC1MZXZlbCBTYWZlCjEgRmVycm91cyBMYWtlCjEgR2xhY2lhbCBGb3J0cmVzcwoxIEdsaW1tZXIgb2YgR2VuaXVzCjEgSEVMSU9TIE9uZQoxIEludGVsbGlnZW5jZSBCb2JibGVoZWFkCjEgSXJyaWdhdGVkIEZhcm1sYW5kCjEgSmFtZXMsIFdhbmRlcmluZyBEYWQKMSBMaWJlcnR5IFByaW1lLCBSZWNoYXJnZWQKMSBMaWdodG5pbmcgR3JlYXZlcwoxIExveWFsIEFwcHJlbnRpY2UKMSBNZWNoYW5pemVkIFByb2R1Y3Rpb24KMSBNaW5kIFN0b25lCjEgTXlyaWFkIExhbmRzY2FwZQoxIE15c3RpYyBGb3JnZQoxIE15c3RpYyBNb25hc3RlcnkKMSBOZXJkIFJhZ2UKMSBOaWNrIFZhbGVudGluZSwgUHJpdmF0ZSBFeWUKMSBOdWthLUNvbGEgVmVuZGluZyBNYWNoaW5lCjEgT25lIHdpdGggdGhlIE1hY2hpbmUKMSBPcGVuIHRoZSBWYXVsdHMKMSBPdmVyZW5jdW1iZXJlZAoxIFBhbGFkaW4gRGFuc2UsIFN0ZWVsIE1hdmVyaWNrCjEgUGFuaGFybW9uaWNvbgoxIFBhdGggb2YgQW5jZXN0cnkKMSBQbGFzbWEgQ2FzdGVyCjEgUHJhaXJpZSBTdHJlYW0KMSBSYXpvcnRpZGUgQnJpZGdlCjEgUmVkIERlYXRoLCBTaGlwd3JlY2tlcgoxIFJleCwgQ3liZXItSG91bmQKMSBSb2JvYnJhaW4gV2FyIE1pbmQKMSBSdXN0dmFsZSBCcmlkZ2UKMSBTYWRpc3RpYyBTaW11bGF0aW9uCjEgU2VudGluZWwgU2FyYWggTHlvbnMKMSBTZW50cnkgQm90CjEgU2hhdW4sIEZhdGhlciBvZiBTeW50aHMKMSBTaWx2ZXJibHVmZiBCcmlkZ2UKMSBTa3ljbG91ZCBFeHBhbnNlCjEgU29sIFJpbmcKMSBTb2xlbW4gU2ltdWxhY3J1bQoxIFNwaXJlIG9mIEluZHVzdHJ5CjEgU3RlZWwgT3ZlcnNlZXIKMSBTdWxmdXIgRmFsbHMKMSBTd29yZHMgdG8gUGxvd3NoYXJlcwoxIFN5bnRoIEVyYWRpY2F0b3IKMSBTeW50aCBJbmZpbHRyYXRvcgoxIFQtNDUgUG93ZXIgQXJtb3IKMSBUYWxpc21hbiBvZiBDb252aWN0aW9uCjEgVGFsaXNtYW4gb2YgQ3JlYXRpdml0eQoxIFRhbGlzbWFuIG9mIFByb2dyZXNzCjEgVGVtcGxlIG9mIEVubGlnaHRlbm1lbnQKMSBUZW1wbGUgb2YgRXBpcGhhbnkKMSBUZXJyYW1vcnBoaWMgRXhwYW5zZQoxIFRoZSBNb3RoZXJsb2RlLCBFeGNhdmF0b3IKMSBUaGUgUHJ5ZHdlbiwgU3RlZWwgRmxhZ3NoaXAKMSBUaGlyc3QgZm9yIEtub3dsZWRnZQoxIFRob3VnaHQgVmVzc2VsCjEgVHJlYXN1cmUgVmF1bHQKMSBVbmV4cGVjdGVkIFdpbmRmYWxsCjEgV2FrZSB0aGUgUGFzdAoxIFdheWZhcmVyJ3MgQmF1YmxlCjEgV2hpcmxlciBSb2d1ZQo1IFBsYWlucwo0IElzbGFuZAo0IE1vdW50YWluCg=='
Install-B64 -R 'precon-decks\Science.dck' -B $b
# precon-decks/Scrappy_Survivors.dck (1,752 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPVNjcmFwcHkgU3Vydml2b3JzCltDb21tYW5kZXJdCjEgRG9nbWVhdCwgRXZlciBMb3lhbApbTWFpbl0KMSBBYnVuZGFudCBHcm93dGgKMSBBY3F1aXJlZCBNdXRhdGlvbgoxIEFnaWxpdHkgQm9iYmxlaGVhZAoxIEFsbCBUaGF0IEdsaXR0ZXJzCjEgQWxtb3N0IFBlcmZlY3QKMSBBbmltYWwgRnJpZW5kCjEgQXJjYW5lIFNpZ25ldAoxIEFybW9yeSBQYWxhZGluCjEgQXNoIEJhcnJlbnMKMSBCYXNpbGlzayBDb2xsYXIKMSBCZWhlbW90aCBTbGVkZ2UKMSBCaWdob3JuZXIgUmFuY2hlcgoxIEJpcnRoZGF5IFBhcnR5CjEgQmxhc3BoZW1vdXMgQWN0CjEgQmxvb2Rmb3JnZWQgQmF0dGxlLUF4ZQoxIEJyYXNzIEtudWNrbGVzCjEgQnJlYWsgRG93bgoxIEJyb3RoZXJob29kIE91dGNhc3QKMSBCdXJpZWQgUnVpbgoxIENhaXQsIENhZ2UgQnJhd2xlcgoxIENhbm9weSBWaXN0YQoxIENhc3MsIEhhbmQgb2YgVmVuZ2VhbmNlCjEgQ2hhbXBpb24ncyBIZWxtCjEgQ2hhb3MgV2FycAoxIENpbmRlciBHbGFkZQoxIENsaWZmdG9wIFJldHJlYXQKMSBDb2Rzd29ydGgsIEhhbmR5IEhlbHBlcgoxIENvbW1hbmQgVG93ZXIKMSBDb21tYW5kZXIgU29maWEgRGFndWVycmUKMSBDcmltc29uIENhcmF2YW5lZXIKMSBEdWNoZXNzLCBXYXl3YXJkIFRhdmVybmtlZXAKMSBFdm9sdmluZyBXaWxkcwoxIEV4b3RpYyBPcmNoYXJkCjEgRXhwbG9yZXIncyBTY29wZQoxIEZlcnRpbGUgR3JvdW5kCjEgRmlyZXNocmlla2VyCjEgR3JpbSBSZWFwZXIncyBTcHJpbnQKMSBHdW5uZXIgQ29uc2NyaXB0CjEgSGVyb2ljIEludGVydmVudGlvbgoxIEhvdXNlIEdhbWJpdAoxIElhbiB0aGUgUmVja2xlc3MKMSBJZG9saXplZAoxIEludmVudG9yeSBNYW5hZ2VtZW50CjEgSnVuayBKZXQKMSBKdW5nbGUgU2hyaW5lCjEgSnVua3Rvd24KMSBNYW50bGUgb2YgdGhlIEFuY2llbnRzCjEgTWFzdGVyd29yayBvZiBJbmdlbnVpdHkKMSBNZWdhdG9uJ3MgRmF0ZQoxIE1pc3RlciBHdXRzeQoxIE1vaXJhIEJyb3duLCBHdWlkZSBBdXRob3IKMSBNb3NzZmlyZSBWYWxsZXkKMSBQYXRoIG9mIEFuY2VzdHJ5CjEgUGF0aCB0byBFeGlsZQoxIFBlcmNlcHRpb24gQm9iYmxlaGVhZAoxIFBpcC1Cb3kgMzAwMAoxIFByZS1XYXIgRm9ybWFsd2VhcgoxIFByZXN0b24gR2FydmV5LCBNaW51dGVtYW4KMSBQdXJlc3RlZWwgUGFsYWRpbgoxIFJhbmNvcgoxIFJvYWRzaWRlIFJlbGlxdWFyeQoxIFJvZ3VlJ3MgUGFzc2FnZQoxIFJvb3Rib3VuZCBDcmFnCjEgU2NhdHRlcmVkIEdyb3ZlcwoxIFNjYXZlbmdlciBHcm91bmRzCjEgU2hlbHRlcmVkIFRoaWNrZXQKMSBTaWx2ZXIgU2hyb3VkIENvc3R1bWUKMSBTaW5nbGUgQ29tYmF0CjEgU29sIFJpbmcKMSBTcXVpcnJlbCBOZXN0CjEgU3RpY2t5IEZpbmdlcnMKMSBTdHJvbmcgQmFjawoxIFN1cGVyIE11dGFudCBTY2F2ZW5nZXIKMSBTdW5ncmFzcyBQcmFpcmllCjEgU3VucGV0YWwgR3JvdmUKMSBTdW5zY29yY2hlZCBEaXZpZGUKMSBTd2lmdGZvb3QgQm9vdHMKMSBUZW1wbGUgb2YgQWJhbmRvbgoxIFRlbXBsZSBvZiBQbGVudHkKMSBUZW1wbGUgb2YgdGhlIEZhbHNlIEdvZAoxIFRlbXBsZSBvZiBUcml1bXBoCjEgVGVycmFtb3JwaGljIEV4cGFuc2UKMSBUaHJlZSBEb2csIEdhbGF4eSBOZXdzIERKCjEgVmFsb3JvdXMgU3RhbmNlCjEgVmVyb25pY2EsIERpc3NpZGVudCBTY3JpYmUKMSBXZWxsIFJlc3RlZAoxIFdpbGQgR3Jvd3RoCjQgUGxhaW5zCjQgTW91bnRhaW4KNCBGb3Jlc3QK'
Install-B64 -R 'precon-decks\Scrappy_Survivors.dck' -B $b
# precon-decks/Tricky_Terrain.dck (1,770 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPVRyaWNreSBUZXJyYWluCltDb21tYW5kZXJdCjEgT21vLCBRdWVlbiBvZiBWZXN1dmEKW01haW5dCjEgQWNpZGljIFNsaW1lCjEgQWdncmVzc2l2ZSBCaW9tYW5jeQoxIEFwZXggRGV2YXN0YXRvcgoxIEFyY2FuZSBEZW5pYWwKMSBBcmNhbmUgU2lnbmV0CjEgQXZlbmdlciBvZiBaZW5kaWthcgoxIEJhc2lsaXNrIEdhdGUKMSBCZWFzdCBXaXRoaW4KMSBCbGFzdCBab25lCjEgQ2hyb21hdGljIExhbnRlcm4KMSBDbG91ZHBvc3QKMSBDb21tYW5kIFRvd2VyCjEgQ29weSBMYW5kCjEgQ3Vyc2Ugb2YgdGhlIFN3aW5lCjEgRGFyayBEZXB0aHMKMSBEZXNlcnQgb2YgdGhlIEluZG9taXRhYmxlCjEgRGVzZXJ0IG9mIHRoZSBNaW5kZnVsCjEgRGVzZXJ0IFdhcmZhcmUKMSBEcmVhbXJvb3QgQ2FzY2FkZQoxIERyb3duIGluIERyZWFtcwoxIERyeWFkIG9mIHRoZSBJbHlzaWFuIEdyb3ZlCjEgRWx2aXNoIFJlanV2ZW5hdG9yCjEgRXVyZWthIE1vbWVudAoxIEV2YWN1YXRpb24KMSBFeHBlZGl0aW9uIE1hcAoxIEZpbmFsZSBvZiBSZXZlbGF0aW9uCjEgRmxvb2RlZCBHcm92ZQoxIEZsb3JpZmVyb3VzIFZpbmV3YWxsCjEgRm9nIEJhbmsKMSBHbGltbWVycG9zdAoxIEdyb3d0aCBTcGlyYWwKMSBIYXJtb25pemUKMSBIYXNoZXAgT2FzaXMKMSBIaWRkZW4gQ2F0YXJhY3QKMSBIaWRkZW4gTnVyc2VyeQoxIEhvcml6b24gb2YgUHJvZ3Jlc3MKMSBIb3VyIG9mIFByb21pc2UKMSBIeWRyYSBCcm9vZG1hc3RlcgoxIEh5ZHJvaWQgS3Jhc2lzCjEgSnlvdGksIE1vYWcgQW5jaWVudAoxIExhaXIgb2YgdGhlIEh5ZHJhCjEgTGF6b3RlcCBRdWFycnkKMSBMdW1iZXJpbmcgRmFsbHMKMSBMdXNoIE9hc2lzCjEgTWFndXMgb2YgdGhlIENhbmRlbGFicmEKMSBNYW5hIFJlZmxlY3Rpb24KMSBNYXJjaCBmcm9tIFZlbGlzIFZlbAoxIE1pcmFnZSBNaXJyb3IKMSBOaXNzYSwgU3Rld2FyZCBvZiBFbGVtZW50cwoxIE9ibGl2aW9uIFN0b25lCjEgT3ZlcmZsb3dpbmcgQmFzaW4KMSBQbGFuYXIgTmV4dXMKMSBQb2lzb24gRGFydCBGcm9nCjEgUG9uZ2lmeQoxIFByb3BhZ2FuZGEKMSBRdWFuZHJpeCBDYW1wdXMKMSBSYW1wYWdpbmcgQmFsb3RocwoxIFJhbXBhbnQgRnJvZ2FudHVhCjEgUmFtdW5hcCBFeGNhdmF0b3IKMSBSZXBsaWNhdGlvbiBUZWNobmlxdWUKMSBTYWdlIG9mIHRoZSBNYXplCjEgU2F0eXIgV2F5ZmluZGVyCjEgU2N1dGUgU3dhcm0KMSBTZWVyJ3MgU3VuZGlhbAoxIFNpbWljIEdyb3d0aCBDaGFtYmVyCjEgU2ltaWMgR3VpbGRnYXRlCjEgU2t1bGx3aW5kZXIKMSBTb2wgUmluZwoxIFN1bW1hcnkgRGlzbWlzc2FsCjEgU3Vua2VuIFBhbGFjZQoxIFN5bHZhbiBTY3J5aW5nCjEgVGFsb24gR2F0ZXMgb2YgTWFkYXJhCjEgVGF0eW92YSwgQmVudGhpYyBEcnVpZAoxIFRlbXBsZSBvZiBNeXN0ZXJ5CjEgVGVyYXN0b2RvbgoxIFRoZXNwaWFuJ3MgU3RhZ2UKMSBUaG9ybndvb2QgRmFsbHMKMSBUcmVhc3VyZSBDcnVpc2UKMSBUcmVuY2hwb3N0CjEgVWx2ZW53YWxkIEh5ZHJhCjEgVXJiYW4gRXZvbHV0aW9uCjEgVXJvLCBUaXRhbiBvZiBOYXR1cmUncyBXcmF0aAoxIFVyemEncyBNaW5lCjEgVXJ6YSdzIFBvd2VyIFBsYW50CjEgVXJ6YSdzIFRvd2VyCjEgVmVzdXZhCjEgVmluZWdsaW1tZXIgU25hcmwKMSBWaXZpZW4gUmVpZAoxIFZvbGF0aWxlIEZhdWx0CjEgV29uZGVyc2NhcGUgU2FnZQoxIFlhdmltYXlhIENvYXN0CjEgWWF2aW1heWEsIENyYWRsZSBvZiBHcm93dGgKMyBQbGFpbnMKMiBJc2xhbmQKMiBGb3Jlc3QK'
Install-B64 -R 'precon-decks\Tricky_Terrain.dck' -B $b
# precon-decks/Undead_Unleashed.dck (1,458 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPVVuZGVhZCBVbmxlYXNoZWQKW0NvbW1hbmRlcl0KMSBXaWxoZWx0LCB0aGUgUm90Y2xlYXZlcgpbTWFpbl0KMSBBZXRoZXJzcG91dHMKMSBBcmNhbmUgU2lnbmV0CjEgQXJteSBvZiB0aGUgRGFtbmVkCjEgQm9qdWthIEJvZwoxIEJ1dGNoZXIgb2YgTWFsYWtpcgoxIENlbWV0ZXJ5IFJlYXBlcgoxIENoYXJjb2FsIERpYW1vbmQKMSBDaG9rZWQgRXN0dWFyeQoxIENsZWF2ZXIgU2thYWIKMSBDb21tYW5kIFRvd2VyCjEgQ29tbWFuZGVyJ3MgU3BoZXJlCjEgQ29ycHNlIEF1Z3VyCjEgQ3Jvd2RlZCBDcnlwdAoxIEN1cnNlIG9mIFVuYmluZGluZwoxIEN1cnNlIG9mIHRoZSBSZXN0bGVzcyBEZWFkCjEgRGFyayBTYWx2YXRpb24KMSBEYXJrd2F0ZXIgQ2F0YWNvbWJzCjEgRGVhdGggQmFyb24KMSBEaW1pciBBcXVlZHVjdAoxIERpcmVncmFmIENhcHRhaW4KMSBEaXJlZ3JhZiBDb2xvc3N1cwoxIERpc3RhbnQgTWVsb2R5CjEgRHJlYWQgU3VtbW9ucwoxIERyZWFkaG9yZGUgSW52YXNpb24KMSBEcm93biBpbiBEcmVhbXMKMSBFYXRlciBvZiBIb3BlCjEgRWxvaXNlLCBOZXBoYWxpYSBTbGV1dGgKMSBFbXB0eSB0aGUgTGFib3JhdG9yeQoxIEVuZGxlc3MgUmFua3Mgb2YgdGhlIERlYWQKMSBFdGVybmFsIFNreWxvcmQKMSBFeG90aWMgT3JjaGFyZAoxIEZlZWQgdGhlIFN3YXJtCjEgRmxlc2hiYWcgTWFyYXVkZXIKMSBGb3Jnb3R0ZW4gQ3JlYXRpb24KMSBHaG91bHMnIE5pZ2h0IE91dAoxIEdpc2EgYW5kIEdlcmFsZgoxIEdsZWFtaW5nIE92ZXJzZWVyCjEgR28gZm9yIHRoZSBUaHJvYXQKMSBHb3JleCwgdGhlIFRvbWJzaGVsbAoxIEdyYXZlc3Bhd24gU292ZXJlaWduCjEgSGF2ZW5ndWwgUnVuZWJpbmRlcgoxIEhvcmRld2luZyBTa2FhYgoxIEhvdXIgb2YgRXRlcm5pdHkKMSBMaWxpYW5hJ3MgRGV2b3RlZQoxIExpbGlhbmEncyBNYXN0ZXJ5CjEgTGlsaWFuYSwgRGVhdGgncyBNYWplc3R5CjEgTG9yZCBvZiB0aGUgQWNjdXJzZWQKMSBNaWRuaWdodCBSZWFwZXIKMSBNb3J0dWFyeSBNaXJlCjEgTXlyaWFkIExhbmRzY2FwZQoxIE9wZW4gdGhlIEdyYXZlcwoxIE92ZXJzZWVyIG9mIHRoZSBEYW1uZWQKMSBQYXRoIG9mIEFuY2VzdHJ5CjEgUHJvd2xpbmcgR2Vpc3RjYXRjaGVyCjEgUmF2ZW5vdXMgUm90YmVsbHkKMSBSb29mdG9wIFN0b3JtCjEgUnV0aGxlc3MgRGVhdGhmYW5nCjEgU2hhZG93IEtpbgoxIFNreSBEaWFtb25kCjEgU29sIFJpbmcKMSBTcGFyayBSZWFwZXIKMSBTdGl0Y2hlciBHZXJhbGYKMSBTdW5rZW4gSG9sbG93CjEgU3lwaG9uIEZsZXNoCjEgVGFpbnRlZCBJc2xlCjEgVGFsaXNtYW4gb2YgRG9taW5hbmNlCjEgVGVtcGxlIG9mIERlY2VpdAoxIFRvbWIgVHlyYW50CjEgVW5jbGFpbWVkIFRlcnJpdG9yeQoxIFVuZGVhZCBBbGNoZW1pc3QKMSBVbmRlYWQgQXVndXIKMSBab21iaWUgQXBvY2FseXBzZQoxNCBJc2xhbmQKMTMgU3dhbXAK'
Install-B64 -R 'precon-decks\Undead_Unleashed.dck' -B $b
# precon-decks/Veloci-Ramp-Tor.dck (1,716 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPVZlbG9jaS1SYW1wLVRvcgpbQ29tbWFuZGVyXQoxIFBhbnRsYXphLCBTdW4tRmF2b3JlZApbTWFpbl0KMSBBa3JvbWEncyBXaWxsCjEgQXBleCBBbHRpc2F1cgoxIEFyY2ggb2YgT3JhemNhCjEgQXJjYW5lIFNpZ25ldAoxIEF0em9jYW4gU2VlcgoxIEJlbGxvd2luZyBBZWdpc2F1cgoxIEJyb256ZWJlYWsgRm9yYWdlcnMKMSBDYW5vcHkgVmlzdGEKMSBDaGFuZHJhJ3MgSWduaXRpb24KMSBDaW5kZXIgR2xhZGUKMSBDbGlmZnRvcCBSZXRyZWF0CjEgQ29tbWFuZCBUb3dlcgoxIEN1bHRpdmF0ZQoxIEN1cmlvdXMgQWx0aXNhdXIKMSBEZWF0aGdvcmdlIFNjYXZlbmdlcgoxIERlc2NlbmRhbnRzJyBQYXRoCjEgRGlub3NhdXIgRWdnCjEgRHJvdmVyIG9mIHRoZSBNaWdodHkKMSBFYXJ0aHNoYWtlciBEcmVhZG1hdwoxIEV0YWxpLCBQcmltYWwgU3Rvcm0KMSBFdm9sdmluZyBXaWxkcwoxIEV4b3RpYyBPcmNoYXJkCjEgRmFyc2VlawoxIEZpZXJ5IENvbmZsdWVuY2UKMSBGb3J0aWZpZWQgVmlsbGFnZQoxIEZyb20gdGhlIFJ1YmJsZQoxIEZ1cnljYWxtIFNuYXJsCjEgR2FtZSBUcmFpbAoxIEdlbmVyb3VzIEdpZnQKMSBJdHpxdWludGgsIEZpcnN0Ym9ybiBvZiBHaXNoYXRoCjEgSXhhbGxpJ3MgTG9yZWtlZXBlcgoxIEp1bmdsZSBTaHJpbmUKMSBLZXNzaWcgV29sZiBSdW4KMSBLaW5qYWxsaSdzIFN1bndpbmcKMSBMaWZlY3JhZnRlcidzIEJlc3RpYXJ5CjEgTWFqZXN0aWMgSGVsaW9wdGVydXMKMSBNYXJhdWRpbmcgUmFwdG9yCjEgTWlncmF0aW9uIFBhdGgKMSBNb3Nzd29ydCBCcmlkZ2UKMSBNeXJpYWQgTGFuZHNjYXBlCjEgT3RlcGVjIEh1bnRtYXN0ZXIKMSBQYXRoIG9mIEFuY2VzdHJ5CjEgUGF0aCB0byBFeGlsZQoxIFByb2dlbml0b3IncyBJY29uCjEgUXVhcnR6d29vZCBDcmFzaGVyCjEgUmFnaW5nIFJlZ2lzYXVyCjEgUmFnaW5nIFN3b3JkdG9vdGgKMSBSYW1wYWdpbmcgQnJvbnRvZG9uCjEgUmFtcGFudCBHcm93dGgKMSBSYW5naW5nIFJhcHRvcnMKMSBSZWdhbCBCZWhlbW90aAoxIFJlZ2lzYXVyIEFscGhhCjEgUmV0dXJuIG9mIHRoZSBXaWxkc3BlYWtlcgoxIFJoeXRobSBvZiB0aGUgV2lsZAoxIFJpcGphdyBSYXB0b3IKMSBSaXNoa2FyJ3MgRXhwZXJ0aXNlCjEgUm9ndWUncyBQYXNzYWdlCjEgUnVuaWMgQXJtYXNhdXIKMSBTYXZhZ2UgU3RvbXAKMSBTY2lvbiBvZiBDYWxhbWl0eQoxIFNlY2x1ZGVkIENvdXJ0eWFyZAoxIFNoaWZ0aW5nIENlcmF0b3BzCjEgU29sIFJpbmcKMSBTdW5mcmlsbCBJbWl0YXRvcgoxIFRlbXBsZSBBbHRpc2F1cgoxIFRlbXBsZSBvZiB0aGUgRmFsc2UgR29kCjEgVGVycmFtb3JwaGljIEV4cGFuc2UKMSBUaHJhc2hpbmcgQnJvbnRvZG9uCjEgVGhyaXZpbmcgQmx1ZmYKMSBUaHJpdmluZyBHcm92ZQoxIFRocml2aW5nIEhlYXRoCjEgVGh1bmRlcmhlcmQgTWlncmF0aW9uCjEgVGh1bmRlcmluZyBTcGluZWJhY2sKMSBUb3BpYXJ5IFN0b21wZXIKMSBVbmNsYWltZWQgVGVycml0b3J5CjEgVmVyZGFudCBTdW4ncyBBdmF0YXIKMSBXYWtlbmluZyBTdW4ncyBBdmF0YXIKMSBXYXl0YSwgVHJhaW5lciBQcm9kaWd5CjEgV2F5d2FyZCBTd29yZHRvb3RoCjEgV3JhdGhmdWwgUmFwdG9ycwoxIFhlbmFnb3MsIEdvZCBvZiBSZXZlbHMKMSBaYWNhbWEsIFByaW1hbCBDYWxhbWl0eQoxIFpldGFscGEsIFByaW1hbCBEYXduCjYgTW91bnRhaW4KNSBGb3Jlc3QKNSBQbGFpbnMK'
Install-B64 -R 'precon-decks\Veloci-Ramp-Tor.dck' -B $b
# precon-decks/precon-index.json (3,088 bytes)
$b = 'WwogIHsKICAgICJuYW1lIjogIkVsdmVuIEVtcGlyZSIsCiAgICAiY29tbWFuZGVyIjogIkxhdGhyaWwsIEJsYWRlIG9mIHRoZSBFbHZlcyIsCiAgICAiY29sb3JzIjogWyJCIiwgIkciXSwKICAgICJzZXQiOiAiS2FsZGhlaW0iLAogICAgInllYXIiOiAyMDIxLAogICAgInRoZW1lIjogIkVsZiB0cmliYWwsIHRva2VuIGdlbmVyYXRpb24sIGxpZmUgZHJhaW4iLAogICAgImZpbGVOYW1lIjogIkVsdmVuX0VtcGlyZS5kY2siCiAgfSwKICB7CiAgICAibmFtZSI6ICJVbmRlYWQgVW5sZWFzaGVkIiwKICAgICJjb21tYW5kZXIiOiAiV2lsaGVsdCwgdGhlIFJvdGNsZWF2ZXIiLAogICAgImNvbG9ycyI6IFsiVSIsICJCIl0sCiAgICAic2V0IjogIklubmlzdHJhZDogTWlkbmlnaHQgSHVudCIsCiAgICAieWVhciI6IDIwMjEsCiAgICAidGhlbWUiOiAiWm9tYmllIHRyaWJhbCwgdG9rZW4gZ2VuZXJhdGlvbiwgc2FjcmlmaWNlIiwKICAgICJmaWxlTmFtZSI6ICJVbmRlYWRfVW5sZWFzaGVkLmRjayIKICB9LAogIHsKICAgICJuYW1lIjogIlBsYW5hciBQb3J0YWwiLAogICAgImNvbW1hbmRlciI6ICJQcm9zcGVyLCBUb21lLUJvdW5kIiwKICAgICJjb2xvcnMiOiBbIkIiLCAiUiJdLAogICAgInNldCI6ICJBZHZlbnR1cmVzIGluIHRoZSBGb3Jnb3R0ZW4gUmVhbG1zIiwKICAgICJ5ZWFyIjogMjAyMSwKICAgICJ0aGVtZSI6ICJFeGlsZSBhbmQgY2FzdCwgdHJlYXN1cmUgZ2VuZXJhdGlvbiwgaW1wdWxzZSBkcmF3IiwKICAgICJmaWxlTmFtZSI6ICJQbGFuYXJfUG9ydGFsLmRjayIKICB9LAogIHsKICAgICJuYW1lIjogIk5lY3JvbiBEeW5hc3RpZXMiLAogICAgImNvbW1hbmRlciI6ICJTemFyZWtoLCB0aGUgU2lsZW50IEtpbmciLAogICAgImNvbG9ycyI6IFsiQiJdLAogICAgInNldCI6ICJXYXJoYW1tZXIgNDAsMDAwIiwKICAgICJ5ZWFyIjogMjAyMiwKICAgICJ0aGVtZSI6ICJBcnRpZmFjdCBjcmVhdHVyZXMsIHJlY3Vyc2lvbiwgcmVhbmltYXRpb24iLAogICAgImZpbGVOYW1lIjogIk5lY3Jvbl9EeW5hc3RpZXMuZGNrIgogIH0sCiAgewogICAgIm5hbWUiOiAiRWxkcmF6aSBVbmJvdW5kIiwKICAgICJjb21tYW5kZXIiOiAiWmh1bG9kb2ssIFZvaWQgR29yZ2VyIiwKICAgICJjb2xvcnMiOiBbIkMiXSwKICAgICJzZXQiOiAiQ29tbWFuZGVyIE1hc3RlcnMiLAogICAgInllYXIiOiAyMDIzLAogICAgInRoZW1lIjogIkVsZHJhemkgdHJpYmFsLCBjb2xvcmxlc3MgcmFtcCwgY2FzY2FkZSIsCiAgICAiZmlsZU5hbWUiOiAiRWxkcmF6aV9VbmJvdW5kLmRjayIKICB9LAogIHsKICAgICJuYW1lIjogIlZlbG9jaS1SYW1wLVRvciIsCiAgICAiY29tbWFuZGVyIjogIlBhbnRsYXphLCBTdW4tRmF2b3JlZCIsCiAgICAiY29sb3JzIjogWyJSIiwgIkciLCAiVyJdLAogICAgInNldCI6ICJUaGUgTG9zdCBDYXZlcm5zIG9mIEl4YWxhbiIsCiAgICAieWVhciI6IDIwMjMsCiAgICAidGhlbWUiOiAiRGlub3NhdXIgdHJpYmFsLCBkaXNjb3ZlciwgcmFtcCIsCiAgICAiZmlsZU5hbWUiOiAiVmVsb2NpLVJhbXAtVG9yLmRjayIKICB9LAogIHsKICAgICJuYW1lIjogIkV4cGxvcmVycyBvZiB0aGUgRGVlcCIsCiAgICAiY29tbWFuZGVyIjogIkhha2JhbCBvZiB0aGUgU3VyZ2luZyBTb3VsIiwKICAgICJjb2xvcnMiOiBbIlUiLCAiRyJdLAogICAgInNldCI6ICJUaGUgTG9zdCBDYXZlcm5zIG9mIEl4YWxhbiIsCiAgICAieWVhciI6IDIwMjMsCiAgICAidGhlbWUiOiAiTWVyZm9sayB0cmliYWwsICsxLysxIGNvdW50ZXJzLCBleHBsb3JlIiwKICAgICJmaWxlTmFtZSI6ICJFeHBsb3JlcnNfb2ZfdGhlX0RlZXAuZGNrIgogIH0sCiAgewogICAgIm5hbWUiOiAiQ3JlYXRpdmUgRW5lcmd5IiwKICAgICJjb21tYW5kZXIiOiAiU2F0eWEsIEFldGhlcmZsdXggR2VuaXVzIiwKICAgICJjb2xvcnMiOiBbIlciLCAiVSIsICJSIl0sCiAgICAic2V0IjogIk1vZGVybiBIb3Jpem9ucyAzIiwKICAgICJ5ZWFyIjogMjAyNCwKICAgICJ0aGVtZSI6ICJFbmVyZ3kgY291bnRlcnMsIGFydGlmYWN0IHRva2VucywgdG9rZW4gY29weSIsCiAgICAiZmlsZU5hbWUiOiAiQ3JlYXRpdmVfRW5lcmd5LmRjayIKICB9LAogIHsKICAgICJuYW1lIjogIlRyaWNreSBUZXJyYWluIiwKICAgICJjb21tYW5kZXIiOiAiT21vLCBRdWVlbiBvZiBWZXN1dmEiLAogICAgImNvbG9ycyI6IFsiVyIsICJVIiwgIkciXSwKICAgICJzZXQiOiAiTW9kZXJuIEhvcml6b25zIDMiLAogICAgInllYXIiOiAyMDI0LAogICAgInRo' +
'ZW1lIjogIkxhbmQgbWF0dGVycywgbGFuZCB0eXBlIHNoZW5hbmlnYW5zLCBldmVyeXRoaW5nIHRyaWJhbCIsCiAgICAiZmlsZU5hbWUiOiAiVHJpY2t5X1RlcnJhaW4uZGNrIgogIH0sCiAgewogICAgIm5hbWUiOiAiU2NyYXBweSBTdXJ2aXZvcnMiLAogICAgImNvbW1hbmRlciI6ICJEb2dtZWF0LCBFdmVyIExveWFsIiwKICAgICJjb2xvcnMiOiBbIlciLCAiUiIsICJHIl0sCiAgICAic2V0IjogIkZhbGxvdXQiLAogICAgInllYXIiOiAyMDI0LAogICAgInRoZW1lIjogIkF1cmEgYW5kIGVxdWlwbWVudCwganVuayB0b2tlbnMsIHBvd2VyIG1hdHRlcnMiLAogICAgImZpbGVOYW1lIjogIlNjcmFwcHlfU3Vydml2b3JzLmRjayIKICB9LAogIHsKICAgICJuYW1lIjogIk11dGFudCBNZW5hY2UiLAogICAgImNvbW1hbmRlciI6ICJUaGUgV2lzZSBNb3RobWFuIiwKICAgICJjb2xvcnMiOiBbIlUiLCAiQiIsICJHIl0sCiAgICAic2V0IjogIkZhbGxvdXQiLAogICAgInllYXIiOiAyMDI0LAogICAgInRoZW1lIjogIlJhZCBjb3VudGVycywgKzEvKzEgY291bnRlcnMsIHByb2xpZmVyYXRlIiwKICAgICJmaWxlTmFtZSI6ICJNdXRhbnRfTWVuYWNlLmRjayIKICB9LAogIHsKICAgICJuYW1lIjogIlNjaWVuY2UhIiwKICAgICJjb21tYW5kZXIiOiAiRHIuIE1hZGlzb24gTGkiLAogICAgImNvbG9ycyI6IFsiVyIsICJVIiwgIlIiXSwKICAgICJzZXQiOiAiRmFsbG91dCIsCiAgICAieWVhciI6IDIwMjQsCiAgICAidGhlbWUiOiAiQXJ0aWZhY3QgY3JlYXR1cmVzLCBmYWJyaWNhdGUsIGFydGlmYWN0IHN5bmVyZ2llcyIsCiAgICAiZmlsZU5hbWUiOiAiU2NpZW5jZS5kY2siCiAgfQpdCg=='
Install-B64 -R 'precon-decks\precon-index.json' -B $b
# pyproject.toml (451 bytes)
$b = 'W2J1aWxkLXN5c3RlbV0KcmVxdWlyZXMgPSBbInNldHVwdG9vbHM+PTY0IiwgIndoZWVsIl0KYnVpbGQtYmFja2VuZCA9ICJzZXR1cHRvb2xzLmJ1aWxkX21ldGEiCgpbcHJvamVjdF0KbmFtZSA9ICJjb21tYW5kZXItYWktbGFiIgp2ZXJzaW9uID0gIjEuMC4wIgpkZXNjcmlwdGlvbiA9ICJDb21tYW5kZXIgQUkgTGFiIOKAlCBFREggZGVjayBzaW11bGF0aW9uLCBjb2xsZWN0aW9uIG1hbmFnZW1lbnQsIGFuZCBhbmFseXNpcyB0b29scyIKcmVhZG1lID0gIlJFQURNRS5tZCIKcmVxdWlyZXMtcHl0aG9uID0gIj49My4xMCIKbGljZW5zZSA9IHt0ZXh0ID0gIk1JVCJ9CgpbdG9vbC5zZXR1cHRvb2xzLnBhY2thZ2VzLmZpbmRdCndoZXJlID0gWyJzcmMiXQoKW3Byb2plY3Quc2NyaXB0c10KY29tbWFuZGVyLXNpbSA9ICJjb21tYW5kZXJfYWlfbGFiLmxhYi5leHBlcmltZW50czpfY2xpX21haW4iCg=='
Install-B64 -R 'pyproject.toml' -B $b
# sample-decks/Atraxa_Superfriends.dck (1,833 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPUF0cmF4YSBTdXBlcmZyaWVuZHMKW0NvbW1hbmRlcl0KMSBBdHJheGEsIFByYWV0b3JzJyBWb2ljZQpbTWFpbl0KMSBTb2wgUmluZwoxIEFyY2FuZSBTaWduZXQKMSBDb21tYW5kIFRvd2VyCjEgQnJlZWRpbmcgUG9vbAoxIFdhdGVyeSBHcmF2ZQoxIEdvZGxlc3MgU2hyaW5lCjEgVGVtcGxlIEdhcmRlbgoxIE92ZXJncm93biBUb21iCjEgSGFsbG93ZWQgRm91bnRhaW4KMSBaYWdvdGggVHJpb21lCjEgSW5kYXRoYSBUcmlvbWUKMSBSYWZmaW5lJ3MgVG93ZXIKMSBTcGFyYSdzIEhlYWRxdWFydGVycwoxIEV4b3RpYyBPcmNoYXJkCjEgUGF0aCBvZiBBbmNlc3RyeQoxIFlhdmltYXlhIENvYXN0CjEgQ2F2ZXMgb2YgS29pbG9zCjEgTGxhbm93YXIgV2FzdGVzCjEgQWRhcmthciBXYXN0ZXMKMSBVbmRlcmdyb3VuZCBSaXZlcgoxIEdsYWNpYWwgRm9ydHJlc3MKMSBTdW5wZXRhbCBHcm92ZQoxIFdvb2RsYW5kIENlbWV0ZXJ5CjEgSGludGVybGFuZCBIYXJib3IKMSBEcm93bmVkIENhdGFjb21iCjEgSXNvbGF0ZWQgQ2hhcGVsCjEgRm9yZXN0CjEgRm9yZXN0CjEgRm9yZXN0CjEgUGxhaW5zCjEgUGxhaW5zCjEgSXNsYW5kCjEgSXNsYW5kCjEgU3dhbXAKMSBTd2FtcAoxIERlZXBnbG93IFNrYXRlCjEgT2F0aCBvZiBUZWZlcmkKMSBEb3VibGluZyBTZWFzb24KMSBUaGUgQ2hhaW4gVmVpbAoxIFRlZmVyaSwgVGVtcG9yYWwgQXJjaG1hZ2UKMSBOYXJzZXQsIFBhcnRlciBvZiBWZWlscwoxIEFzaGlvaywgRHJlYW0gUmVuZGVyCjEgSmFjZSwgdGhlIE1pbmQgU2N1bHB0b3IKMSBMaWxpYW5hLCBEcmVhZGhvcmRlIEdlbmVyYWwKMSBFbHNwZXRoLCBTdW4ncyBDaGFtcGlvbgoxIFRhbWl5bywgRmllbGQgUmVzZWFyY2hlcgoxIFZyYXNrYSwgUmVsaWMgU2Vla2VyCjEgR2FycnVrLCBDdXJzZWQgSHVudHNtYW4KMSBLYXlhLCBHaG9zdCBBc3Nhc3NpbgoxIE5pc3NhLCBXaG8gU2hha2VzIHRoZSBXb3JsZAoxIEFqYW5pLCBNZW50b3Igb2YgSGVyb2VzCjEgVWdpbiwgdGhlIFNwaXJpdCBEcmFnb24KMSBOaWNvbCBCb2xhcywgRHJhZ29uLUdvZAoxIFN3b3JkcyB0byBQbG93c2hhcmVzCjEgUGF0aCB0byBFeGlsZQoxIEFuZ3Vpc2hlZCBVbm1ha2luZwoxIEFzc2Fzc2luJ3MgVHJvcGh5CjEgQ291bnRlcnNwZWxsCjEgQ3ljbG9uaWMgUmlmdAoxIFRveGljIERlbHVnZQoxIFN1cHJlbWUgVmVyZGljdAoxIFdyYXRoIG9mIEdvZAoxIERhbW5hdGlvbgoxIFJoeXN0aWMgU3R1ZHkKMSBNeXN0aWMgUmVtb3JhCjEgU3lsdmFuIExpYnJhcnkKMSBTbW90aGVyaW5nIFRpdGhlCjEgRmFyc2VlawoxIEN1bHRpdmF0ZQoxIEtvZGFtYSdzIFJlYWNoCjEgTmF0dXJlJ3MgTG9yZQoxIFJhbXBhbnQgR3Jvd3RoCjEgVGhyZWUgVmlzaXRzCjEgQmlyZHMgb2YgUGFyYWRpc2UKMSBOb2JsZSBIaWVyYXJjaAoxIEJsb29tIFRlbmRlcgoxIEZhZWJ1cnJvdyBFbGRlcgoxIEV0ZXJuYWwgV2l0bmVzcwoxIFJlY2xhbWF0aW9uIFNhZ2UKMSBCZWFzdCBXaXRoaW4KMSBIZXJvaWMgSW50ZXJ2ZW50aW9uCjEgVGVmZXJpJ3MgUHJvdGVjdGlvbgoxIENsZXZlciBDb25jZWFsbWVudAoxIEF1cmEgb2YgU2lsZW5jZQoxIEluZXhvcmFibGUgVGlkZQoxIEZsdXggQ2hhbm5lbGVyCjEgRXZvbHV0aW9uIFNhZ2UKMSBPYXRoIG9mIE5pc3NhCjEgT2F0aCBvZiBHaWRlb24KMSBBc3RyYWwgQ29ybnVjb3BpYQoxIENvbnRhZ2lvbiBFbmdpbmUKMSBDb250YWdpb24gQ2xhc3AKMSBGZWxsd2FyIFN0b25lCjEgQ2hyb21hdGljIExhbnRlcm4KMSBDb2FsaXRpb24gUmVsaWMKMSBPYXRoIG9mIEFqYW5pCjEgR3JhdGVmdWwgQXBwYXJpdGlvbgoxIFRocnVtbWluZ2JpcmQK'
Install-B64 -R 'sample-decks\Atraxa_Superfriends.dck' -B $b
# sample-decks/Korvold_Aristocrats.dck (1,869 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPUtvcnZvbGQgQXJpc3RvY3JhdHMKW0NvbW1hbmRlcl0KMSBLb3J2b2xkLCBGYWUtQ3Vyc2VkIEtpbmcKW01haW5dCjEgU29sIFJpbmcKMSBBcmNhbmUgU2lnbmV0CjEgQ29tbWFuZCBUb3dlcgoxIEJsb29kIENyeXB0CjEgU3RvbXBpbmcgR3JvdW5kCjEgT3Zlcmdyb3duIFRvbWIKMSBMdXh1cnkgU3VpdGUKMSBTcGlyZSBHYXJkZW4KMSBVbmRlcmdyb3d0aCBTdGFkaXVtCjEgU2F2YWdlIExhbmRzCjEgS2Vzc2lnIFdvbGYgUnVuCjEgUGh5cmV4aWFuIFRvd2VyCjEgSGlnaCBNYXJrZXQKMSBNaXJlbiwgdGhlIE1vYW5pbmcgV2VsbAoxIEdvbGdhcmkgUm90IEZhcm0KMSBSYWtkb3MgQ2FybmFyaXVtCjEgR3J1dWwgVHVyZgoxIERyYWdvbnNrdWxsIFN1bW1pdAoxIFJvb3Rib3VuZCBDcmFnCjEgV29vZGxhbmQgQ2VtZXRlcnkKMSBDaW5kZXIgR2xhZGUKMSBTbW9sZGVyaW5nIE1hcnNoCjEgRm9yZXN0CjEgRm9yZXN0CjEgRm9yZXN0CjEgRm9yZXN0CjEgTW91bnRhaW4KMSBNb3VudGFpbgoxIFN3YW1wCjEgU3dhbXAKMSBTd2FtcAoxIFZpc2NlcmEgU2VlcgoxIENhcnJpb24gRmVlZGVyCjEgQmxvb2QgQXJ0aXN0CjEgWnVsYXBvcnQgQ3V0dGhyb2F0CjEgTWF5aGVtIERldmlsCjEgSnVkaXRoLCB0aGUgU2NvdXJnZSBEaXZhCjEgUGl0aWxlc3MgUGx1bmRlcmVyCjEgRG9ja3NpZGUgRXh0b3J0aW9uaXN0CjEgR29ibGluIEJvbWJhcmRtZW50CjEgQm9sYXMncyBDaXRhZGVsCjEgR3JhdmUgUGFjdAoxIERpY3RhdGUgb2YgRXJlYm9zCjEgQnV0Y2hlciBvZiBNYWxha2lyCjEgTWlkbmlnaHQgUmVhcGVyCjEgR3JpbSBIYXJ1c3BleAoxIERhcmsgQ29uZmlkYW50CjEgU2t1bGxjbGFtcAoxIEFzaG5vZCdzIEFsdGFyCjEgUGh5cmV4aWFuIEFsdGFyCjEgQWx0YXIgb2YgRGVtZW50aWEKMSBSZWFzc2VtYmxpbmcgU2tlbGV0b24KMSBCbG9vZGdoYXN0CjEgTmV0aGVyIFRyYWl0b3IKMSBTcXVlZSwgR29ibGluIE5hYm9iCjEgT3BoaW9tYW5jZXIKMSBUZW5kZXJzaG9vdCBEcnlhZAoxIEVuZHJlayBTYWhyLCBNYXN0ZXIgQnJlZWRlcgoxIFNlaydLdWFyLCBEZWF0aGtlZXBlcgoxIEF3YWtlbmluZyBab25lCjEgRnJvbSBCZXlvbmQKMSBCaXR0ZXJibG9zc29tCjEgQ2hhdHRlcmZhbmcsIFNxdWlycmVsIEdlbmVyYWwKMSBZYXdnbW90aCwgVGhyYW4gUGh5c2ljaWFuCjEgU2F2cmEsIFF1ZWVuIG9mIHRoZSBHb2xnYXJpCjEgUHJvc3NoLCBTa3lyYWlkZXIgb2YgS2hlcgoxIEN1bHRpdmF0ZQoxIEtvZGFtYSdzIFJlYWNoCjEgU2FrdXJhLVRyaWJlIEVsZGVyCjEgRmFyc2VlawoxIE5hdHVyZSdzIExvcmUKMSBXb29kIEVsdmVzCjEgRmFyaGF2ZW4gRWxmCjEgQmVhc3QgV2l0aGluCjEgQ2hhb3MgV2FycAoxIEFzc2Fzc2luJ3MgVHJvcGh5CjEgQWJydXB0IERlY2F5CjEgSGVyb2ljIEludGVydmVudGlvbgoxIERhbW5hdGlvbgoxIFRveGljIERlbHVnZQoxIExpdmluZyBEZWF0aAoxIEV0ZXJuYWwgV2l0bmVzcwoxIEJ1cm5pc2hlZCBIYXJ0CjEgU29sZW1uIFNpbXVsYWNydW0KMSBUaXJlbGVzcyBUcmFja2VyCjEgUmFtdW5hcCBFeGNhdmF0b3IKMSBXb3JsZCBTaGFwZXIKMSBTeXIgS29ucmFkLCB0aGUgR3JpbQoxIE1hemlyZWssIEtyYXVsIERlYXRoIFByaWVzdAoxIE1lcmVuIG9mIENsYW4gTmVsIFRvdGgKMSBNaWthZXVzLCB0aGUgVW5oYWxsb3dlZAoxIFRyaXNrZWxpb24KMSBNdXJkZXJvdXMgUmVkY2FwCjEgUHV0cmlkIEdvYmxpbgoxIFdvb2RmYWxsIFByaW11cwoxIFJhdmVub3VzIENodXBhY2FicmEKMSBGbGVzaGJhZyBNYXJhdWRlcgoxIE1lcmNpbGVzcyBFeGVjdXRpb25lcgoxIFBsYWd1ZWNyYWZ0ZXIKMSBEaWFib2xpYyBJbnRlbnQKMSBFbGRyaXRjaCBFdm9sdXRpb24K'
Install-B64 -R 'sample-decks\Korvold_Aristocrats.dck' -B $b
# sample-decks/Muldrotha_Value.dck (1,794 bytes)
$b = 'W21ldGFkYXRhXQpOYW1lPU11bGRyb3RoYSBWYWx1ZQpbQ29tbWFuZGVyXQoxIE11bGRyb3RoYSwgdGhlIEdyYXZldGlkZQpbTWFpbl0KMSBTb2wgUmluZwoxIEFyY2FuZSBTaWduZXQKMSBDb21tYW5kIFRvd2VyCjEgQnJlZWRpbmcgUG9vbAoxIFdhdGVyeSBHcmF2ZQoxIE92ZXJncm93biBUb21iCjEgWmFnb3RoIFRyaW9tZQoxIE9wdWxlbnQgUGFsYWNlCjEgTW9ycGhpYyBQb29sCjEgUmVqdXZlbmF0aW5nIFNwcmluZ3MKMSBVbmRlcmdyb3d0aCBTdGFkaXVtCjEgSGludGVybGFuZCBIYXJib3IKMSBEcm93bmVkIENhdGFjb21iCjEgV29vZGxhbmQgQ2VtZXRlcnkKMSBEYXJrd2F0ZXIgQ2F0YWNvbWJzCjEgTGxhbm93YXIgV2FzdGVzCjEgWWF2aW1heWEgQ29hc3QKMSBVbmRlcmdyb3VuZCBSaXZlcgoxIEZvcmVzdAoxIEZvcmVzdAoxIEZvcmVzdAoxIEZvcmVzdAoxIElzbGFuZAoxIElzbGFuZAoxIElzbGFuZAoxIFN3YW1wCjEgU3dhbXAKMSBTd2FtcAoxIFVyYm9yZywgVG9tYiBvZiBZYXdnbW90aAoxIENhYmFsIENvZmZlcnMKMSBTdHJpcCBNaW5lCjEgU2FrdXJhLVRyaWJlIEVsZGVyCjEgRmFyaGF2ZW4gRWxmCjEgV29vZCBFbHZlcwoxIFNwcmluZ2Jsb29tIERydWlkCjEgQ3VsdGl2YXRlCjEgS29kYW1hJ3MgUmVhY2gKMSBOYXR1cmUncyBMb3JlCjEgRmFyc2VlawoxIFJhbXBhbnQgR3Jvd3RoCjEgV2F5ZmFyZXIncyBCYXVibGUKMSBCdXJuaXNoZWQgSGFydAoxIFNvbGVtbiBTaW11bGFjcnVtCjEgQ29pbGluZyBPcmFjbGUKMSBNdWxsZHJpZnRlcgoxIFNocmlla21hdwoxIFBsYWd1ZWNyYWZ0ZXIKMSBGbGVzaGJhZyBNYXJhdWRlcgoxIE1lcmNpbGVzcyBFeGVjdXRpb25lcgoxIFJhdmVub3VzIENodXBhY2FicmEKMSBIb3N0YWdlIFRha2VyCjEgQWdlbnQgb2YgVHJlYWNoZXJ5CjEgU3lyIEtvbnJhZCwgdGhlIEdyaW0KMSBTaWRpc2ksIEJyb29kIFR5cmFudAoxIFRoZSBNaW1lb3BsYXNtCjEgVGF0eW92YSwgQmVudGhpYyBEcnVpZAoxIFJhbXVuYXAgRXhjYXZhdG9yCjEgQ3J1Y2libGUgb2YgV29ybGRzCjEgV29ybGQgU2hhcGVyCjEgU3BsZW5kaWQgUmVjbGFtYXRpb24KMSBMaWZlIGZyb20gdGhlIExvYW0KMSBFdGVybmFsIFdpdG5lc3MKMSBBbmltYXRlIERlYWQKMSBEYW5jZSBvZiB0aGUgRGVhZAoxIE5lY3JvbWFuY3kKMSBSZWFuaW1hdGUKMSBMaXZpbmcgRGVhdGgKMSBDeWNsb25pYyBSaWZ0CjEgVG94aWMgRGVsdWdlCjEgRGFtbmF0aW9uCjEgUGVybmljaW91cyBEZWVkCjEgQmVhc3QgV2l0aGluCjEgQXNzYXNzaW4ncyBUcm9waHkKMSBDb3VudGVyc3BlbGwKMSBOZWdhdGUKMSBTd2FuIFNvbmcKMSBNeXN0aWMgUmVtb3JhCjEgUmh5c3RpYyBTdHVkeQoxIFN5bHZhbiBMaWJyYXJ5CjEgR3JlYXRlciBHb29kCjEgU2VhbCBvZiBQcmltb3JkaXVtCjEgU2VhbCBvZiBSZW1vdmFsCjEgTmloaWwgU3BlbGxib21iCjEgTGlvbidzIEV5ZSBEaWFtb25kCjEgTG90dXMgUGV0YWwKMSBBdXJhIFNoYXJkcwoxIEltcHJpc29uZWQgaW4gdGhlIE1vb24KMSBLZW5yaXRoJ3MgVHJhbnNmb3JtYXRpb24KMSBUaGUgR2l0cm9nIE1vbnN0ZXIKMSBVbmRlcnJlYWxtIExpY2gKMSBIYXZlbmd1bCBMaWNoCjEgRGVhZGV5ZSBOYXZpZ2F0b3IKMSBQZXJlZ3JpbmUgRHJha2UKMSBBbHRhciBvZiBEZW1lbnRpYQoxIEhlZHJvbiBDcmFiCjEgU3RpdGNoZXIncyBTdXBwbGllcgoxIFNhdHlyIFdheWZpbmRlcgoxIEdyaXNseSBTYWx2YWdlCjEgQnVyaWVkIEFsaXZlCjEgRW50b21iCjEgSmFyYWQsIEdvbGdhcmkgTGljaCBMb3JkCjEgSXpvbmksIFRob3VzYW5kLUV5ZWQK'
Install-B64 -R 'sample-decks\Muldrotha_Value.dck' -B $b
# scanner/__init__.py (293 bytes)
$b = 'IyBDYXJkIFNjYW5uZXIgUGFja2FnZSDigJQgaW1hZ2UtYmFzZWQgTVRHIGNhcmQgcmVjb2duaXRpb24KIwojIFVzZXMgWGltaWxhciBWaXN1YWwgQUkgZm9yIGNhcmQgaWRlbnRpZmljYXRpb24uCiMgQVBJOiBodHRwczovL2FwaS54aW1pbGFyLmNvbS9jb2xsZWN0aWJsZXMvdjIvdGNnX2lkCiMKIyBObyBsb2NhbCBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgKG5vIE9wZW5DViwgbm8gVGVzc2VyYWN0KS4KIyBPbmx5IG5lZWRzIHRoZSAncmVxdWVzdHMnIHN0ZGxpYiAodXJsbGliKSBhbmQgYSB2YWxpZCBBUEkga2V5Lgo='
Install-B64 -R 'scanner\__init__.py' -B $b
# scanner/pipeline.py (7,194 bytes)
$b = 'IiIiCkNhcmQgU2Nhbm5lciDigJQgUmVjb2duaXRpb24gUGlwZWxpbmUgKFhpbWlsYXIgVmlzdWFsIEFJKQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCk9yY2hlc3RyYXRlcyB0aGUgZnVsbCBzY2FuIHdvcmtmbG93IHVzaW5nIHRoZSBYaW1pbGFyIENvbGxlY3RpYmxlcwpUQ0cgSWRlbnRpZmljYXRpb24gQVBJIGZvciBjYXJkIHJlY29nbml0aW9uOgogIDEuIFNlbmQgaW1hZ2UgYnl0ZXMgdG8gWGltaWxhciBBUEkKICAyLiBQYXJzZSBpZGVudGlmaWVkIGNhcmRzIChuYW1lLCBzZXQsIG51bWJlciwgcmFyaXR5LCBsaW5rcykKICAzLiBPcHRpb25hbGx5IGVucmljaCB3aXRoIFNjcnlmYWxsIGZvciBzY3J5ZmFsbF9pZCArIGltYWdlIFVSSQogIDQuIFJldHVybiBzdHJ1Y3R1cmVkIHJlc3VsdHMKCk5vIGxvY2FsIE9DUiBvciBPcGVuQ1YgbmVlZGVkIOKAlCBhbGwgcmVjb2duaXRpb24gaXMgZG9uZSBieSB0aGUKWGltaWxhciBjbG91ZCBBUEkgdXNpbmcgdmlzdWFsIEFJLgoiIiIKZnJvbSB0eXBpbmcgaW1wb3J0IENhbGxhYmxlLCBPcHRpb25hbAoKZnJvbSAueGltaWxhcl9jbGllbnQgaW1wb3J0IGlkZW50aWZ5X2NhcmRzLCBYaW1pbGFyUmVzdWx0CgoKIyDilIDilIAgRGF0YSBzdHJ1Y3R1cmVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKY2xhc3MgU2NhblJlc3VsdDoKICAgICIiIlJlc3VsdCBmb3IgYSBzaW5nbGUgcmVjb2duaXplZCBjYXJkLiIiIgogICAgX19zbG90c19fID0gKCJyYXdfb2NyIiwgIm1hdGNoZWRfbmFtZSIsICJzZXRfY29kZSIsICJzY3J5ZmFsbF9pZCIsCiAgICAgICAgICAgICAgICAgImNvbmZpZGVuY2UiLCAiaW1hZ2VfdXJpIiwgImVycm9yIiwgImNvcnJlY3RlZF9uYW1lIiwKICAgICAgICAgICAgICAgICAiY29sbGVjdG9yX251bWJlciIsICJyYXJpdHkiLCAidGNncGxheWVyX3VybCIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJhd19vY3I6IHN0ciA9ICIiLCBtYXRjaGVkX25hbWU6IHN0ciA9ICIiLAogICAgICAgICAgICAgICAgIHNldF9jb2RlOiBzdHIgPSAiIiwgc2NyeWZhbGxfaWQ6IHN0ciA9ICIiLAogICAgICAgICAgICAgICAgIGNvbmZpZGVuY2U6IHN0ciA9ICJsb3ciLCBpbWFnZV91cmk6IHN0ciA9ICIiLAogICAgICAgICAgICAgICAgIGVycm9yOiBzdHIgPSAiIiwgY29ycmVjdGVkX25hbWU6IHN0ciA9ICIiLAogICAgICAgICAgICAgICAgIGNvbGxlY3Rvcl9udW1iZXI6IHN0ciA9ICIiLCByYXJpdHk6IHN0ciA9ICIiLAogICAgICAgICAgICAgICAgIHRjZ3BsYXllcl91cmw6IHN0ciA9ICIiKToKICAgICAgICBzZWxmLnJhd19vY3IgPSByYXdfb2NyCiAgICAgICAgc2VsZi5tYXRjaGVkX25hbWUgPSBtYXRjaGVkX25hbWUKICAgICAgICBzZWxmLnNldF9jb2RlID0gc2V0X2NvZGUKICAgICAgICBzZWxmLnNjcnlmYWxsX2lkID0gc2NyeWZhbGxfaWQKICAgICAgICBzZWxmLmNvbmZpZGVuY2UgPSBjb25maWRlbmNlICAgICAjICJoaWdoIiB8ICJtZWRpdW0iIHwgImxvdyIKICAgICAgICBzZWxmLmltYWdlX3VyaSA9IGltYWdlX3VyaSAgICAgICAjIFNjcnlmYWxsIGNhcmQgaW1hZ2UgZm9yIHByZXZpZXcKICAgICAgICBzZWxmLmVycm9yID0gZXJyb3IKICAgICAgICBzZWxmLmNvcnJlY3RlZF9uYW1lID0gY29ycmVjdGVkX25hbWUKICAgICAgICBzZWxmLmNvbGxlY3Rvcl9udW1iZXIgPSBjb2xsZWN0b3JfbnVtYmVyCiAgICAgICAgc2VsZi5yYXJpdHkgPSByYXJpdHkKICAgICAgICBzZWxmLnRjZ3BsYXllcl91cmwgPSB0Y2dwbGF5ZXJfdXJsCgogICAgZGVmIHRvX2RpY3Qoc2VsZikgLT4gZGljdDoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAicmF3X29jciI6IHNlbGYucmF3X29jciwKICAgICAgICAgICAgImNvcnJlY3RlZF9uYW1lIjogc2VsZi5jb3JyZWN0ZWRfbmFtZSwKICAgICAgICAgICAgIm1hdGNoZWRfbmFtZSI6IHNlbGYubWF0Y2hlZF9uYW1lLAogICAgICAgICAgICAic2V0X2NvZGUiOiBzZWxmLnNldF9jb2RlLAogICAgICAgICAgICAi' +
'c2NyeWZhbGxfaWQiOiBzZWxmLnNjcnlmYWxsX2lkLAogICAgICAgICAgICAiY29uZmlkZW5jZSI6IHNlbGYuY29uZmlkZW5jZSwKICAgICAgICAgICAgImltYWdlX3VyaSI6IHNlbGYuaW1hZ2VfdXJpLAogICAgICAgICAgICAiZXJyb3IiOiBzZWxmLmVycm9yLAogICAgICAgICAgICAiY29sbGVjdG9yX251bWJlciI6IHNlbGYuY29sbGVjdG9yX251bWJlciwKICAgICAgICAgICAgInJhcml0eSI6IHNlbGYucmFyaXR5LAogICAgICAgICAgICAidGNncGxheWVyX3VybCI6IHNlbGYudGNncGxheWVyX3VybCwKICAgICAgICB9CgoKIyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBzY2FuX3NpbmdsZShpbWFnZV9ieXRlczogYnl0ZXMsCiAgICAgICAgICAgICAgICBzY3J5ZmFsbF9sb29rdXA6IENhbGxhYmxlW1tzdHJdLCBPcHRpb25hbFtkaWN0XV0sCiAgICAgICAgICAgICAgICB4aW1pbGFyX2FwaV9rZXk6IHN0ciA9ICIiKSAtPiBTY2FuUmVzdWx0OgogICAgIiIiCiAgICBTY2FuIGEgc2luZ2xlIGNhcmQgaW1hZ2UgdXNpbmcgWGltaWxhciBWaXN1YWwgQUkuCgogICAgQXJnczoKICAgICAgICBpbWFnZV9ieXRlczogUmF3IGltYWdlIGJ5dGVzIChKUEVHL1BORykKICAgICAgICBzY3J5ZmFsbF9sb29rdXA6IENhbGxiYWNrIHRvIGxvb2sgdXAgYSBjYXJkIG9uIFNjcnlmYWxsIChmb3Igc2NyeWZhbGxfaWQgKyBpbWFnZSkKICAgICAgICB4aW1pbGFyX2FwaV9rZXk6IFhpbWlsYXIgQVBJIHRva2VuCgogICAgUmV0dXJuczoKICAgICAgICBTY2FuUmVzdWx0IHdpdGggaWRlbnRpZmllZCBjYXJkIGluZm8KICAgICIiIgogICAgaWYgbm90IHhpbWlsYXJfYXBpX2tleToKICAgICAgICByZXR1cm4gU2NhblJlc3VsdChlcnJvcj0iWGltaWxhciBBUEkga2V5IG5vdCBjb25maWd1cmVkLiBTZXQgaXQgaW4gbGFiIGNvbmZpZy4iKQoKICAgICMgQ2FsbCBYaW1pbGFyIEFQSSB3aXRoIGFuYWx5emVfYWxsPUZhbHNlIGZvciBzaW5nbGUgY2FyZAogICAgeGltaWxhcl9yZXN1bHRzID0gaWRlbnRpZnlfY2FyZHMoaW1hZ2VfYnl0ZXMsIHhpbWlsYXJfYXBpX2tleSwgYW5hbHl6ZV9hbGw9RmFsc2UpCgogICAgaWYgbm90IHhpbWlsYXJfcmVzdWx0czoKICAgICAgICByZXR1cm4gU2NhblJlc3VsdChlcnJvcj0iWGltaWxhciByZXR1cm5lZCBubyByZXN1bHRzIikKCiAgICAjIFRha2UgdGhlIGZpcnN0IChiZXN0KSByZXN1bHQKICAgIHhyID0geGltaWxhcl9yZXN1bHRzWzBdCgogICAgaWYgeHIuZXJyb3IgYW5kIG5vdCB4ci5uYW1lOgogICAgICAgIHJldHVybiBTY2FuUmVzdWx0KGVycm9yPXhyLmVycm9yKQoKICAgIHJldHVybiBfeGltaWxhcl90b19zY2FuX3Jlc3VsdCh4ciwgc2NyeWZhbGxfbG9va3VwKQoKCmRlZiBzY2FuX211bHRpKGltYWdlX2J5dGVzOiBieXRlcywKICAgICAgICAgICAgICAgc2NyeWZhbGxfbG9va3VwOiBDYWxsYWJsZVtbc3RyXSwgT3B0aW9uYWxbZGljdF1dLAogICAgICAgICAgICAgICB4aW1pbGFyX2FwaV9rZXk6IHN0ciA9ICIiKSAtPiBsaXN0OgogICAgIiIiCiAgICBTY2FuIGFuIGltYWdlIGNvbnRhaW5pbmcgbXVsdGlwbGUgY2FyZHMgdXNpbmcgWGltaWxhciBWaXN1YWwgQUkuCgogICAgQXJnczoKICAgICAgICBpbWFnZV9ieXRlczogUmF3IGltYWdlIGJ5dGVzIChKUEVHL1BORykKICAgICAgICBzY3J5ZmFsbF9sb29rdXA6IENhbGxiYWNrIHRvIGxvb2sgdXAgYSBjYXJkIG9uIFNjcnlmYWxsCiAgICAgICAgeGltaWxhcl9hcGlfa2V5OiBYaW1pbGFyIEFQSSB0b2tlbgoKICAgIFJldHVybnM6CiAgICAgICAgTGlzdCBvZiBTY2FuUmVzdWx0IG9iamVjdHMsIG9uZSBwZXIgZGV0ZWN0ZWQgY2FyZAogICAgIiIiCiAgICBpZiBub3QgeGltaWxhcl9hcGlfa2V5OgogICAgICAgIHJldHVybiBbU2NhblJlc3VsdChlcnJvcj0iWGltaWxhciBBUEkga2V5IG5vdCBjb25maWd1cmVkLiBTZXQgaXQgaW4gbGFiIGNvbmZpZy4iKV0KCiAgICAjIENhbGwgWGltaWxhciBBUEkgd2l0aCBhbmFseXplX2FsbD1UcnVlIGZvciBtdWx0aS1jYXJkIGRldGVjdGlvbgogICAgeGltaWxhcl9yZXN1bHRzID0gaWRlbnRpZnlfY2FyZHMoaW1hZ2VfYnl0ZXMsIHhpbWlsYXJfYXBpX2tleSwgYW5hbHl6ZV9hbGw9VHJ1ZSkK' +
'CiAgICBpZiBub3QgeGltaWxhcl9yZXN1bHRzOgogICAgICAgIHJldHVybiBbU2NhblJlc3VsdChlcnJvcj0iWGltaWxhciByZXR1cm5lZCBubyByZXN1bHRzIildCgogICAgcmVzdWx0cyA9IFtdCiAgICBmb3IgeHIgaW4geGltaWxhcl9yZXN1bHRzOgogICAgICAgIGlmIHhyLmVycm9yIGFuZCBub3QgeHIubmFtZToKICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoU2NhblJlc3VsdChlcnJvcj14ci5lcnJvcikpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoX3hpbWlsYXJfdG9fc2Nhbl9yZXN1bHQoeHIsIHNjcnlmYWxsX2xvb2t1cCkpCgogICAgcmV0dXJuIHJlc3VsdHMKCgojIOKUgOKUgCBJbnRlcm5hbCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZGVmIF94aW1pbGFyX3RvX3NjYW5fcmVzdWx0KHhyOiBYaW1pbGFyUmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcnlmYWxsX2xvb2t1cDogQ2FsbGFibGVbW3N0cl0sIE9wdGlvbmFsW2RpY3RdXSkgLT4gU2NhblJlc3VsdDoKICAgICIiIgogICAgQ29udmVydCBhIFhpbWlsYXIgaWRlbnRpZmljYXRpb24gcmVzdWx0IHRvIGEgU2NhblJlc3VsdCwKICAgIGVucmljaGluZyB3aXRoIFNjcnlmYWxsIGRhdGEgZm9yIHNjcnlmYWxsX2lkIGFuZCBpbWFnZSBVUkkuCiAgICAiIiIKICAgIHJlc3VsdCA9IFNjYW5SZXN1bHQoCiAgICAgICAgcmF3X29jcj14ci5mdWxsX25hbWUgb3IgeHIubmFtZSwKICAgICAgICBjb3JyZWN0ZWRfbmFtZT14ci5uYW1lLAogICAgICAgIG1hdGNoZWRfbmFtZT14ci5uYW1lLAogICAgICAgIHNldF9jb2RlPXhyLnNldF9jb2RlLAogICAgICAgIGNvbGxlY3Rvcl9udW1iZXI9eHIuY2FyZF9udW1iZXIsCiAgICAgICAgcmFyaXR5PXhyLnJhcml0eSwKICAgICAgICB0Y2dwbGF5ZXJfdXJsPXhyLnRjZ3BsYXllcl91cmwsCiAgICApCgogICAgIyBNYXAgWGltaWxhciBjb25maWRlbmNlICgwLjDigJMxLjApIHRvIG91ciBsZXZlbHMKICAgIGlmIHhyLmNvbmZpZGVuY2UgPj0gMC43OgogICAgICAgIHJlc3VsdC5jb25maWRlbmNlID0gImhpZ2giCiAgICBlbGlmIHhyLmNvbmZpZGVuY2UgPj0gMC40OgogICAgICAgIHJlc3VsdC5jb25maWRlbmNlID0gIm1lZGl1bSIKICAgIGVsc2U6CiAgICAgICAgcmVzdWx0LmNvbmZpZGVuY2UgPSAibG93IgoKICAgICMgVHJ5IHRvIGdldCBzY3J5ZmFsbF9pZCBhbmQgaW1hZ2UgVVJJIHZpYSBTY3J5ZmFsbCBsb29rdXAKICAgICMgRmlyc3QgdHJ5IGV4YWN0IHNldC9udW1iZXIgbG9va3VwLCB0aGVuIGZ1enp5IG5hbWUKICAgIHNjcnlmYWxsX2RhdGEgPSBOb25lCgogICAgaWYgeHIubmFtZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNjcnlmYWxsX2RhdGEgPSBzY3J5ZmFsbF9sb29rdXAoeHIubmFtZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYiICAgIFtTQ0FOXSBTY3J5ZmFsbCBsb29rdXAgZmFpbGVkIGZvciAne3hyLm5hbWV9Jzoge2V9IikKCiAgICBpZiBzY3J5ZmFsbF9kYXRhIGFuZCBzY3J5ZmFsbF9kYXRhLmdldCgib2JqZWN0IikgIT0gImVycm9yIjoKICAgICAgICByZXN1bHQuc2NyeWZhbGxfaWQgPSBzY3J5ZmFsbF9kYXRhLmdldCgiaWQiLCAiIikKICAgICAgICByZXN1bHQubWF0Y2hlZF9uYW1lID0gc2NyeWZhbGxfZGF0YS5nZXQoIm5hbWUiLCB4ci5uYW1lKQoKICAgICAgICAjIEdldCBjYXJkIGltYWdlIGZvciBwcmV2aWV3CiAgICAgICAgaW1hZ2VfdXJpcyA9IHNjcnlmYWxsX2RhdGEuZ2V0KCJpbWFnZV91cmlzIiwge30pCiAgICAgICAgaWYgbm90IGltYWdlX3VyaXMgYW5kIHNjcnlmYWxsX2RhdGEuZ2V0KCJjYXJkX2ZhY2VzIik6CiAgICAgICAgICAgIGltYWdlX3VyaXMgPSBzY3J5ZmFsbF9kYXRhWyJjYXJkX2ZhY2VzIl1bMF0uZ2V0KCJpbWFnZV91cmlzIiwge30pCiAgICAgICAgcmVzdWx0LmltYWdlX3VyaSA9IGltYWdlX3VyaXMuZ2V0KCJub3JtYWwiLCBpbWFnZV91cmlzLmdldCgic21hbGwiLCAiIikpCgogICAgICAgICMgVXBkYXRlIHNldF9jb2RlIGZyb20gU2NyeWZhbGwgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgbm90IHJlc3VsdC5zZXRfY29kZToKICAgICAgICAgICAgcmVzdWx0LnNldF9jb2RlID0gc2NyeWZhbGxfZGF0' +
'YS5nZXQoInNldCIsICIiKQogICAgZWxzZToKICAgICAgICAjIE5vIFNjcnlmYWxsIG1hdGNoIOKAlCB1c2UgU2NyeWZhbGwgVVJMIGZyb20gWGltaWxhciBpZiBhdmFpbGFibGUKICAgICAgICBpZiB4ci5zY3J5ZmFsbF91cmw6CiAgICAgICAgICAgICMgRXh0cmFjdCBpbWFnZSBmcm9tIHNjcnlmYWxsIFVSTCBwYXR0ZXJuCiAgICAgICAgICAgICMgZS5nLiwgaHR0cHM6Ly9zY3J5ZmFsbC5jb20vY2FyZC9tMTEvMTQ5L2xpZ2h0bmluZy1ib2x0CiAgICAgICAgICAgIHJlc3VsdC5pbWFnZV91cmkgPSAiIiAgIyBXaWxsIGJlIGZldGNoZWQgYnkgZnJvbnRlbmQgdmlhIHNjcnlmYWxsX2lkCiAgICAgICAgcHJpbnQoZiIgICAgW1NDQU5dIE5vIFNjcnlmYWxsIG1hdGNoIGZvciAne3hyLm5hbWV9JyDigJQgdXNpbmcgWGltaWxhciBkYXRhIG9ubHkiKQoKICAgIHJldHVybiByZXN1bHQK'
Install-B64 -R 'scanner\pipeline.py' -B $b
# scanner/ximilar_client.py (6,318 bytes)
$b = 'IiIiCkNhcmQgU2Nhbm5lciDigJQgWGltaWxhciBWaXN1YWwgQUkgQ2xpZW50CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKQ2FsbHMgdGhlIFhpbWlsYXIgQ29sbGVjdGlibGVzIFRDRyBJZGVudGlmaWNhdGlvbiBBUEkKdG8gcmVjb2duaXplIE1URyBjYXJkcyBmcm9tIGltYWdlcyB1c2luZyB2aXN1YWwgQUkuCgpBUEkgRW5kcG9pbnQ6IFBPU1QgaHR0cHM6Ly9hcGkueGltaWxhci5jb20vY29sbGVjdGlibGVzL3YyL3RjZ19pZApBdXRoOiBUb2tlbi1iYXNlZCAoQXV0aG9yaXphdGlvbjogVG9rZW4gPGFwaV9rZXk+KQoiIiIKaW1wb3J0IGJhc2U2NAppbXBvcnQganNvbgpmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwsIExpc3QKZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgUmVxdWVzdCwgdXJsb3Blbgpmcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IsIEhUVFBFcnJvcgoKWElNSUxBUl9FTkRQT0lOVCA9ICJodHRwczovL2FwaS54aW1pbGFyLmNvbS9jb2xsZWN0aWJsZXMvdjIvdGNnX2lkIgoKCmNsYXNzIFhpbWlsYXJSZXN1bHQ6CiAgICAiIiJSZXN1bHQgZm9yIGEgc2luZ2xlIGNhcmQgaWRlbnRpZmllZCBieSBYaW1pbGFyLiIiIgogICAgX19zbG90c19fID0gKAogICAgICAgICJuYW1lIiwgImZ1bGxfbmFtZSIsICJzZXRfbmFtZSIsICJzZXRfY29kZSIsCiAgICAgICAgImNhcmRfbnVtYmVyIiwgInJhcml0eSIsICJ5ZWFyIiwKICAgICAgICAidGNncGxheWVyX3VybCIsICJzY3J5ZmFsbF91cmwiLCAiZWJheV91cmwiLAogICAgICAgICJjb25maWRlbmNlIiwgImVycm9yIiwKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIGZvciBzbG90IGluIHNlbGYuX19zbG90c19fOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIHNsb3QsIGt3YXJncy5nZXQoc2xvdCwgIiIpKQogICAgICAgIGlmICJjb25maWRlbmNlIiBub3QgaW4ga3dhcmdzOgogICAgICAgICAgICBzZWxmLmNvbmZpZGVuY2UgPSAwLjAKICAgICAgICBpZiAiZXJyb3IiIG5vdCBpbiBrd2FyZ3M6CiAgICAgICAgICAgIHNlbGYuZXJyb3IgPSAiIgoKICAgIGRlZiB0b19kaWN0KHNlbGYpIC0+IGRpY3Q6CiAgICAgICAgcmV0dXJuIHtzOiBnZXRhdHRyKHNlbGYsIHMpIGZvciBzIGluIHNlbGYuX19zbG90c19ffQoKCmRlZiBpZGVudGlmeV9jYXJkcyhpbWFnZV9ieXRlczogYnl0ZXMsIGFwaV9rZXk6IHN0ciwKICAgICAgICAgICAgICAgICAgIGFuYWx5emVfYWxsOiBib29sID0gVHJ1ZSkgLT4gTGlzdFtYaW1pbGFyUmVzdWx0XToKICAgICIiIgogICAgU2VuZCBpbWFnZSBieXRlcyB0byBYaW1pbGFyIFRDRyBpZGVudGlmaWNhdGlvbiBBUEkuCgogICAgQXJnczoKICAgICAgICBpbWFnZV9ieXRlczogUmF3IGltYWdlIGJ5dGVzIChKUEVHLCBQTkcsIGV0Yy4pCiAgICAgICAgYXBpX2tleTogWGltaWxhciBBUEkgdG9rZW4KICAgICAgICBhbmFseXplX2FsbDogSWYgVHJ1ZSwgZGV0ZWN0IGFuZCBpZGVudGlmeSBBTEwgY2FyZHMgaW4gdGhlIGltYWdlLgogICAgICAgICAgICAgICAgICAgICBJZiBGYWxzZSwgaWRlbnRpZnkgb25seSB0aGUgZG9taW5hbnQgY2FyZC4KCiAgICBSZXR1cm5zOgogICAgICAgIExpc3Qgb2YgWGltaWxhclJlc3VsdCBvYmplY3RzLCBvbmUgcGVyIGRldGVjdGVkIGNhcmQuCiAgICAiIiIKICAgIGlmIG5vdCBhcGlfa2V5OgogICAgICAgIHJldHVybiBbWGltaWxhclJlc3VsdChlcnJvcj0iTm8gWGltaWxhciBBUEkga2V5IGNvbmZpZ3VyZWQiKV0KCiAgICAjIEVuY29kZSBpbWFnZSB0byBiYXNlNjQKICAgIGI2NF9kYXRhID0gYmFzZTY0LmI2NGVuY29kZShpbWFnZV9ieXRlcykuZGVjb2RlKCJhc2NpaSIpCgogICAgIyBCdWlsZCByZXF1ZXN0IGJvZHkKICAgIGJvZHkgPSB7CiAgICAgICAgInJlY29yZHMiOiBbCiAgICAgICAgICAgIHsiX2Jhc2U2NCI6IGI2NF9kYXRhfQogICAgICAgIF0sCiAgICB9CiAgICBpZiBhbmFseXplX2FsbDoKICAgICAgICBib2R5WyJhbmFseXplX2FsbCJdID0gVHJ1ZQoKICAgIHBheWxvYWQgPSBqc29uLmR1bXBzKGJvZHkpLmVuY29kZSgidXRmLTgiKQoKICAgICMgQnVpbGQgSFRUUCByZXF1ZXN0CiAgICByZXEgPSBSZXF1ZXN0KAogICAgICAgIFhJTUlMQVJfRU5EUE9JTlQsCiAgICAgICAgZGF0YT1wYXlsb2Fk' +
'LAogICAgICAgIGhlYWRlcnM9ewogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICAgICAiQXV0aG9yaXphdGlvbiI6IGYiVG9rZW4ge2FwaV9rZXl9IiwKICAgICAgICAgICAgIlVzZXItQWdlbnQiOiAiQ29tbWFuZGVyQUlMYWIvMS4wIiwKICAgICAgICB9LAogICAgICAgIG1ldGhvZD0iUE9TVCIsCiAgICApCgogICAgdHJ5OgogICAgICAgIHByaW50KGYiICAgIFtYSU1JTEFSXSBTZW5kaW5nIHtsZW4oaW1hZ2VfYnl0ZXMpOix9IGJ5dGVzIHRvIEFQSSAoYW5hbHl6ZV9hbGw9e2FuYWx5emVfYWxsfSkiKQogICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9NjApIGFzIHJlc3A6CiAgICAgICAgICAgIHJlc3BfZGF0YSA9IGpzb24ubG9hZHMocmVzcC5yZWFkKCkuZGVjb2RlKCJ1dGYtOCIpKQogICAgZXhjZXB0IEhUVFBFcnJvciBhcyBlOgogICAgICAgIGVycm9yX2JvZHkgPSAiIgogICAgICAgIHRyeToKICAgICAgICAgICAgZXJyb3JfYm9keSA9IGUucmVhZCgpLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gW1hpbWlsYXJSZXN1bHQoZXJyb3I9ZiJYaW1pbGFyIEFQSSBlcnJvciB7ZS5jb2RlfToge2Vycm9yX2JvZHlbOjUwMF19IildCiAgICBleGNlcHQgVVJMRXJyb3IgYXMgZToKICAgICAgICByZXR1cm4gW1hpbWlsYXJSZXN1bHQoZXJyb3I9ZiJYaW1pbGFyIEFQSSBjb25uZWN0aW9uIGVycm9yOiB7ZS5yZWFzb259IildCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcmV0dXJuIFtYaW1pbGFyUmVzdWx0KGVycm9yPWYiWGltaWxhciBBUEkgcmVxdWVzdCBmYWlsZWQ6IHtlfSIpXQoKICAgICMgUGFyc2UgcmVzcG9uc2UKICAgIHJldHVybiBfcGFyc2VfcmVzcG9uc2UocmVzcF9kYXRhKQoKCmRlZiBfcGFyc2VfcmVzcG9uc2UocmVzcF9kYXRhOiBkaWN0KSAtPiBMaXN0W1hpbWlsYXJSZXN1bHRdOgogICAgIiIiCiAgICBQYXJzZSB0aGUgWGltaWxhciBBUEkgcmVzcG9uc2UgaW50byBYaW1pbGFyUmVzdWx0IG9iamVjdHMuCgogICAgUmVzcG9uc2Ugc3RydWN0dXJlOgogICAgewogICAgICAicmVjb3JkcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiX29iamVjdHMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAiX2lkZW50aWZpY2F0aW9uIjogewogICAgICAgICAgICAgICAgImJlc3RfbWF0Y2giOiB7CiAgICAgICAgICAgICAgICAgICJuYW1lIjogIkxpZ2h0bmluZyBCb2x0IiwKICAgICAgICAgICAgICAgICAgImZ1bGxfbmFtZSI6ICJMaWdodG5pbmcgQm9sdCAoTTExKSAjMTQ5IiwKICAgICAgICAgICAgICAgICAgInNldCI6ICJNYWdpYyAyMDExIiwKICAgICAgICAgICAgICAgICAgInNldF9jb2RlIjogIm0xMSIsCiAgICAgICAgICAgICAgICAgICJjYXJkX251bWJlciI6ICIxNDkiLAogICAgICAgICAgICAgICAgICAicmFyaXR5IjogImNvbW1vbiIsCiAgICAgICAgICAgICAgICAgICJ5ZWFyIjogIjIwMTAiLAogICAgICAgICAgICAgICAgICAibGlua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInRjZ3BsYXllciI6ICJodHRwczovLy4uLiIsCiAgICAgICAgICAgICAgICAgICAgInNjcnlmYWxsIjogImh0dHBzOi8vLi4uIiwKICAgICAgICAgICAgICAgICAgICAiZWJheSI6ICJodHRwczovLy4uLiIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0b3BfayI6IFsuLi5dCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAuLi4KICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIF0KICAgIH0KICAgICIiIgogICAgcmVzdWx0cyA9IFtdCiAgICByZWNvcmRzID0gcmVzcF9kYXRhLmdldCgicmVjb3JkcyIsIFtdKQoKICAgIGlmIG5vdCByZWNvcmRzOgogICAgICAgIHJldHVybiBbWGltaWxhclJlc3VsdChlcnJvcj0iWGltaWxhciByZXR1cm5lZCBubyByZWNvcmRzIildCgogICAgZm9yIHJlY29yZCBpbiByZWNvcmRzOgogICAgICAgIG9iamVjdHMgPSByZWNvcmQuZ2V0KCJfb2JqZWN0cyIsIFtdKQoKICAgICAgICBpZiBub3Qgb2JqZWN0czoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGVyZSdzIGEgcmVjb3JkLWxldmVsIGlkZW50aWZpY2F0aW9uIChzaW5nbGUgY2FyZCBtb2RlKQogICAgICAgICAgICBpZGVudCA9IHJlY29yZC5nZXQoIl9pZGVudGlmaWNhdGlv' +
'biIpCiAgICAgICAgICAgIGlmIGlkZW50OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gX3BhcnNlX2lkZW50aWZpY2F0aW9uKGlkZW50KQogICAgICAgICAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHJlc3VsdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKFhpbWlsYXJSZXN1bHQoZXJyb3I9Ik5vIGNhcmRzIGRldGVjdGVkIGluIGltYWdlIikpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGZvciBvYmogaW4gb2JqZWN0czoKICAgICAgICAgICAgaWRlbnQgPSBvYmouZ2V0KCJfaWRlbnRpZmljYXRpb24iKQogICAgICAgICAgICBpZiBub3QgaWRlbnQ6CiAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChYaW1pbGFyUmVzdWx0KGVycm9yPSJPYmplY3QgZGV0ZWN0ZWQgYnV0IG5vdCBpZGVudGlmaWVkIikpCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgcmVzdWx0ID0gX3BhcnNlX2lkZW50aWZpY2F0aW9uKGlkZW50KQogICAgICAgICAgICBpZiByZXN1bHQ6CiAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChyZXN1bHQpCgogICAgaWYgbm90IHJlc3VsdHM6CiAgICAgICAgcmVzdWx0cy5hcHBlbmQoWGltaWxhclJlc3VsdChlcnJvcj0iWGltaWxhciBjb3VsZCBub3QgaWRlbnRpZnkgYW55IGNhcmRzIikpCgogICAgcHJpbnQoZiIgICAgW1hJTUlMQVJdIElkZW50aWZpZWQge2xlbihyZXN1bHRzKX0gY2FyZChzKSIpCiAgICBmb3IgciBpbiByZXN1bHRzOgogICAgICAgIGlmIHIubmFtZToKICAgICAgICAgICAgcHJpbnQoZiIgICAgW1hJTUlMQVJdICAgLSB7ci5uYW1lfSAoe3Iuc2V0X2NvZGV9KSBjb25mPXtyLmNvbmZpZGVuY2U6LjJmfSIpCiAgICAgICAgZWxpZiByLmVycm9yOgogICAgICAgICAgICBwcmludChmIiAgICBbWElNSUxBUl0gICAtIEVSUk9SOiB7ci5lcnJvcn0iKQoKICAgIHJldHVybiByZXN1bHRzCgoKZGVmIF9wYXJzZV9pZGVudGlmaWNhdGlvbihpZGVudDogZGljdCkgLT4gT3B0aW9uYWxbWGltaWxhclJlc3VsdF06CiAgICAiIiJQYXJzZSBhIHNpbmdsZSBfaWRlbnRpZmljYXRpb24gYmxvY2suIiIiCiAgICBiZXN0ID0gaWRlbnQuZ2V0KCJiZXN0X21hdGNoIikKICAgIGlmIG5vdCBiZXN0OgogICAgICAgIHJldHVybiBYaW1pbGFyUmVzdWx0KGVycm9yPSJObyBiZXN0IG1hdGNoIGluIGlkZW50aWZpY2F0aW9uIikKCiAgICBsaW5rcyA9IGJlc3QuZ2V0KCJsaW5rcyIsIHt9KQogICAgcHJvYiA9IGJlc3QuZ2V0KCJwcm9iIiwgMC4wKQoKICAgIHJldHVybiBYaW1pbGFyUmVzdWx0KAogICAgICAgIG5hbWU9YmVzdC5nZXQoIm5hbWUiLCAiIiksCiAgICAgICAgZnVsbF9uYW1lPWJlc3QuZ2V0KCJmdWxsX25hbWUiLCAiIiksCiAgICAgICAgc2V0X25hbWU9YmVzdC5nZXQoInNldCIsICIiKSwKICAgICAgICBzZXRfY29kZT1iZXN0LmdldCgic2V0X2NvZGUiLCAiIiksCiAgICAgICAgY2FyZF9udW1iZXI9c3RyKGJlc3QuZ2V0KCJjYXJkX251bWJlciIsICIiKSksCiAgICAgICAgcmFyaXR5PWJlc3QuZ2V0KCJyYXJpdHkiLCAiIiksCiAgICAgICAgeWVhcj1zdHIoYmVzdC5nZXQoInllYXIiLCAiIikpLAogICAgICAgIHRjZ3BsYXllcl91cmw9bGlua3MuZ2V0KCJ0Y2dwbGF5ZXIiLCAiIiksCiAgICAgICAgc2NyeWZhbGxfdXJsPWxpbmtzLmdldCgic2NyeWZhbGwiLCAiIiksCiAgICAgICAgZWJheV91cmw9bGlua3MuZ2V0KCJlYmF5IiwgIiIpLAogICAgICAgIGNvbmZpZGVuY2U9ZmxvYXQocHJvYikgaWYgcHJvYiBlbHNlIDAuMCwKICAgICkK'
Install-B64 -R 'scanner\ximilar_client.py' -B $b
# src/commander_ai_lab/__init__.py (71 bytes)
$b = 'IiIiQ29tbWFuZGVyIEFJIExhYiDigJQgUHl0aG9uIHBhY2thZ2Ugcm9vdC4iIiIKCl9fdmVyc2lvbl9fID0gIjEuMC4wIgo='
Install-B64 -R 'src\commander_ai_lab\__init__.py' -B $b
# src/commander_ai_lab/lab/__init__.py (57 bytes)
$b = 'IiIiQ29tbWFuZGVyIEFJIExhYiDigJQgTGFiIC8gZXhwZXJpbWVudHMgc3VicGFja2FnZS4iIiIK'
Install-B64 -R 'src\commander_ai_lab\lab\__init__.py' -B $b
# src/commander_ai_lab/lab/experiments.py (12,324 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIEV4cGVyaW1lbnRzIE1vZHVsZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSGlnaC1sZXZlbCBzaW11bGF0aW9uIGhlbHBlcnMgZm9yIHJ1bm5pbmcgQ29tbWFuZGVyIGV4cGVyaW1lbnRzLgoKVXNhZ2U6CiAgICBweXRob24gLW0gY29tbWFuZGVyX2FpX2xhYi5sYWIuZXhwZXJpbWVudHMKCkZ1bmN0aW9uczoKICAgIGJ1aWxkX2RlY2soY2FyZF9uYW1lcykgIOKAlCBDcmVhdGUgYW4gZW5yaWNoZWQgZGVjayBmcm9tIGNhcmQgbmFtZXMKICAgIHJ1bl9zaW5nbGVfZ2FtZShkZWNrKSAgIOKAlCBTaW11bGF0ZSBhIHNpbmdsZSBnYW1lLCByZXR1cm4gc3RhdHMgZGljdAogICAgcnVuX3NpbXVsYXRpb24oZGVjaywgbikg4oCUIE1vbnRlIENhcmxvIHNpbXVsYXRpb24sIHJldHVybiBhZ2dyZWdhdGVkIHN0YXRzCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IHRpbWUKZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCgpmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZApmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLmVuZ2luZSBpbXBvcnQgR2FtZUVuZ2luZQpmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLnJ1bGVzIGltcG9ydCBlbnJpY2hfY2FyZCwgcGFyc2VfZGVja2xpc3QKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIERlY2sgQnVpbGRpbmcKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmRlZiBidWlsZF9kZWNrKGNhcmRfbmFtZXM6IGxpc3Rbc3RyXSkgLT4gbGlzdFtDYXJkXToKICAgICIiIgogICAgQnVpbGQgYW4gZW5yaWNoZWQgZGVjayBmcm9tIGEgbGlzdCBvZiBjYXJkIG5hbWVzLgogICAgRWFjaCBjYXJkIGlzIGVucmljaGVkIHdpdGggdHlwZS9jb3N0IGhldXJpc3RpY3MgaWYgZGF0YSBpcyBtaXNzaW5nLgogICAgIiIiCiAgICBkZWNrID0gW10KICAgIGZvciBuYW1lIGluIGNhcmRfbmFtZXM6CiAgICAgICAgY2FyZCA9IENhcmQobmFtZT1uYW1lKQogICAgICAgIGVucmljaF9jYXJkKGNhcmQpCiAgICAgICAgZGVjay5hcHBlbmQoY2FyZCkKICAgIHJldHVybiBkZWNrCgoKZGVmIGJ1aWxkX2RlY2tfZnJvbV90ZXh0KGRlY2tsaXN0X3RleHQ6IHN0cikgLT4gbGlzdFtDYXJkXToKICAgICIiIgogICAgQnVpbGQgYW4gZW5yaWNoZWQgZGVjayBmcm9tIGEgZGVja2xpc3Qgc3RyaW5nLgogICAgRm9ybWF0OiBvbmUgY2FyZCBwZXIgbGluZSwgb3B0aW9uYWxseSBwcmVmaXhlZCB3aXRoIHF1YW50aXR5LgogICAgRXhhbXBsZToKICAgICAgICAxIFNvbCBSaW5nCiAgICAgICAgMzcgRm9yZXN0CiAgICAgICAgQ3VsdGl2YXRlCiAgICAiIiIKICAgIGNhcmRzID0gcGFyc2VfZGVja2xpc3QoZGVja2xpc3RfdGV4dCkKICAgIGZvciBjYXJkIGluIGNhcmRzOgogICAgICAgIGVucmljaF9jYXJkKGNhcmQpCiAgICByZXR1cm4gY2FyZHMKCgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAojIFNpbmdsZSBHYW1lCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgcnVuX3NpbmdsZV9nYW1lKAogICAgZGVja19hOiBsaXN0W0NhcmRdLAogICAgZGVja19iOiBPcHRpb25h' +
'bFtsaXN0W0NhcmRdXSA9IE5vbmUsCiAgICBuYW1lX2E6IHN0ciA9ICJEZWNrIEEiLAogICAgbmFtZV9iOiBzdHIgPSAiRGVjayBCIiwKICAgIG1heF90dXJuczogaW50ID0gMjUsCikgLT4gZGljdDoKICAgICIiIgogICAgUnVuIGEgc2luZ2xlIHNpbXVsYXRlZCBnYW1lLgoKICAgIEFyZ3M6CiAgICAgICAgZGVja19hOiBUaGUgcHJpbWFyeSBkZWNrIChsaXN0IG9mIENhcmQgb2JqZWN0cykuCiAgICAgICAgZGVja19iOiBUaGUgb3Bwb25lbnQgZGVjay4gSWYgTm9uZSwgYSBkZWZhdWx0IHRyYWluaW5nIGRlY2sgaXMgdXNlZC4KICAgICAgICBuYW1lX2E6IE5hbWUgZm9yIHBsYXllciBBLgogICAgICAgIG5hbWVfYjogTmFtZSBmb3IgcGxheWVyIEIuCiAgICAgICAgbWF4X3R1cm5zOiBNYXhpbXVtIHR1cm5zIGJlZm9yZSB0aGUgZ2FtZSBlbmRzLgoKICAgIFJldHVybnM6CiAgICAgICAgRGljdCB3aXRoIGtleXM6IHdpbm5lciAoaW50KSwgdHVybnMgKGludCksIHJlc3VsdCAoZnVsbCBHYW1lUmVzdWx0IGRpY3QpLgogICAgIiIiCiAgICBpZiBkZWNrX2IgaXMgTm9uZToKICAgICAgICBkZWNrX2IgPSBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjaygpCgogICAgZW5naW5lID0gR2FtZUVuZ2luZShtYXhfdHVybnM9bWF4X3R1cm5zKQogICAgcmVzdWx0ID0gZW5naW5lLnJ1bihkZWNrX2EsIGRlY2tfYiwgbmFtZV9hPW5hbWVfYSwgbmFtZV9iPW5hbWVfYikKCiAgICByZXR1cm4gewogICAgICAgICJ3aW5uZXIiOiByZXN1bHQud2lubmVyLAogICAgICAgICJ3aW5uZXJfbmFtZSI6IG5hbWVfYSBpZiByZXN1bHQud2lubmVyID09IDAgZWxzZSBuYW1lX2IsCiAgICAgICAgInR1cm5zIjogcmVzdWx0LnR1cm5zLAogICAgICAgICJyZXN1bHQiOiByZXN1bHQudG9fZGljdCgpLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgTW9udGUgQ2FybG8gU2ltdWxhdGlvbgojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZGVmIHJ1bl9zaW11bGF0aW9uKAogICAgZGVja19hOiBsaXN0W0NhcmRdLAogICAgZGVja19iOiBPcHRpb25hbFtsaXN0W0NhcmRdXSA9IE5vbmUsCiAgICBudW1fZ2FtZXM6IGludCA9IDEwMCwKICAgIG5hbWVfYTogc3RyID0gIkRlY2sgQSIsCiAgICBuYW1lX2I6IHN0ciA9ICJEZWNrIEIiLAogICAgbWF4X3R1cm5zOiBpbnQgPSAyNSwKKSAtPiBkaWN0OgogICAgIiIiCiAgICBSdW4gYSBNb250ZSBDYXJsbyBzaW11bGF0aW9uIGFjcm9zcyBtdWx0aXBsZSBnYW1lcy4KCiAgICBBcmdzOgogICAgICAgIGRlY2tfYTogVGhlIHByaW1hcnkgZGVjay4KICAgICAgICBkZWNrX2I6IFRoZSBvcHBvbmVudCBkZWNrLiBJZiBOb25lLCB1c2VzIGRlZmF1bHQgdHJhaW5pbmcgZGVjay4KICAgICAgICBudW1fZ2FtZXM6IE51bWJlciBvZiBnYW1lcyB0byBzaW11bGF0ZS4KICAgICAgICBuYW1lX2E6IE5hbWUgZm9yIHBsYXllciBBLgogICAgICAgIG5hbWVfYjogTmFtZSBmb3IgcGxheWVyIEIuCiAgICAgICAgbWF4X3R1cm5zOiBNYXhpbXVtIHR1cm5zIHBlciBnYW1lLgoKICAgIFJldHVybnM6CiAgICAgICAgQWdncmVnYXRlZCBzdGF0cyBkaWN0IHdpdGggd2luX3JhdGUsIGF2Z190dXJucywgdG90YWxfZ2FtZXMsIHdpbnMsIGxvc3NlcywKICAgICAgICBhdmdfZGFtYWdlX2RlYWx0LCBhdmdfZGFtYWdlX3JlY2VpdmVkLCBhdmdfc3BlbGxzX2Nhc3QsIGF2Z19jcmVhdHVyZXNfcGxheWVkLgogICAgIiIiCiAgICBpZiBkZWNrX2IgaXMgTm9uZToKICAgICAgICBkZWNrX2IgPSBfZ2VuZXJhdGVfdHJhaW5pbmdfZGVjaygpCgogICAgZW5naW5lID0gR2FtZUVuZ2luZShtYXhfdHVybnM9bWF4X3R1cm5zKQoKICAgIHdpbnMgPSAwCiAgICBsb3NzZXMgPSAwCiAgICB0b3RhbF90dXJucyA9IDAKICAgIHRvdGFsX2RhbWFnZV9kZWFsdCA9IDAKICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZl' +
'ZCA9IDAKICAgIHRvdGFsX3NwZWxsc19jYXN0ID0gMAogICAgdG90YWxfY3JlYXR1cmVzX3BsYXllZCA9IDAKICAgIHRvdGFsX3JlbW92YWxfdXNlZCA9IDAKICAgIHRvdGFsX3JhbXBfcGxheWVkID0gMAogICAgdG90YWxfY2FyZHNfZHJhd24gPSAwCiAgICB0b3RhbF9tYXhfYm9hcmQgPSAwCgogICAgc3RhcnQgPSB0aW1lLnRpbWUoKQoKICAgIGZvciBfIGluIHJhbmdlKG51bV9nYW1lcyk6CiAgICAgICAgcmVzdWx0ID0gZW5naW5lLnJ1bihkZWNrX2EsIGRlY2tfYiwgbmFtZV9hPW5hbWVfYSwgbmFtZV9iPW5hbWVfYikKCiAgICAgICAgaWYgcmVzdWx0Lndpbm5lciA9PSAwOgogICAgICAgICAgICB3aW5zICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb3NzZXMgKz0gMQoKICAgICAgICB0b3RhbF90dXJucyArPSByZXN1bHQudHVybnMKICAgICAgICBpZiByZXN1bHQucGxheWVyX2Ffc3RhdHM6CiAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9kZWFsdCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX2RlYWx0CiAgICAgICAgICAgIHRvdGFsX2RhbWFnZV9yZWNlaXZlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuZGFtYWdlX3JlY2VpdmVkCiAgICAgICAgICAgIHRvdGFsX3NwZWxsc19jYXN0ICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5zcGVsbHNfY2FzdAogICAgICAgICAgICB0b3RhbF9jcmVhdHVyZXNfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5jcmVhdHVyZXNfcGxheWVkCiAgICAgICAgICAgIHRvdGFsX3JlbW92YWxfdXNlZCArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMucmVtb3ZhbF91c2VkCiAgICAgICAgICAgIHRvdGFsX3JhbXBfcGxheWVkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5yYW1wX3BsYXllZAogICAgICAgICAgICB0b3RhbF9jYXJkc19kcmF3biArPSByZXN1bHQucGxheWVyX2Ffc3RhdHMuY2FyZHNfZHJhd24KICAgICAgICAgICAgdG90YWxfbWF4X2JvYXJkICs9IHJlc3VsdC5wbGF5ZXJfYV9zdGF0cy5tYXhfYm9hcmRfc2l6ZQoKICAgIGVsYXBzZWQgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0CiAgICBuID0gbnVtX2dhbWVzCgogICAgcmV0dXJuIHsKICAgICAgICAiZGVja19uYW1lIjogbmFtZV9hLAogICAgICAgICJvcHBvbmVudF9uYW1lIjogbmFtZV9iLAogICAgICAgICJ0b3RhbF9nYW1lcyI6IG4sCiAgICAgICAgIndpbnMiOiB3aW5zLAogICAgICAgICJsb3NzZXMiOiBsb3NzZXMsCiAgICAgICAgIndpbl9yYXRlIjogcm91bmQod2lucyAvIG4gKiAxMDAsIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICJhdmdfdHVybnMiOiByb3VuZCh0b3RhbF90dXJucyAvIG4sIDEpIGlmIG4gPiAwIGVsc2UgMC4wLAogICAgICAgICJhdmdfZGFtYWdlX2RlYWx0Ijogcm91bmQodG90YWxfZGFtYWdlX2RlYWx0IC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgImF2Z19kYW1hZ2VfcmVjZWl2ZWQiOiByb3VuZCh0b3RhbF9kYW1hZ2VfcmVjZWl2ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAiYXZnX3NwZWxsc19jYXN0Ijogcm91bmQodG90YWxfc3BlbGxzX2Nhc3QgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAiYXZnX2NyZWF0dXJlc19wbGF5ZWQiOiByb3VuZCh0b3RhbF9jcmVhdHVyZXNfcGxheWVkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgImF2Z19yZW1vdmFsX3VzZWQiOiByb3VuZCh0b3RhbF9yZW1vdmFsX3VzZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAiYXZnX3JhbXBfcGxheWVkIjogcm91bmQodG90YWxfcmFtcF9wbGF5ZWQgLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAiYXZnX2NhcmRzX2RyYXduIjogcm91bmQodG90YWxfY2FyZHNfZHJhd24gLyBuLCAxKSBpZiBuID4gMCBlbHNlIDAuMCwKICAgICAgICAiYXZnX21heF9ib2FyZF9zaXplIjogcm91bmQodG90YWxfbWF4X2JvYXJkIC8gbiwgMSkgaWYgbiA+IDAgZWxzZSAwLjAsCiAgICAgICAgImVsYXBzZWRfc2Vjb25kcyI6IHJvdW5kKGVsYXBzZWQsIDIpLAogICAgfQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgRGVmYXVs' +
'dCBUcmFpbmluZyBEZWNrCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgX2dlbmVyYXRlX3RyYWluaW5nX2RlY2soKSAtPiBsaXN0W0NhcmRdOgogICAgIiIiCiAgICBHZW5lcmF0ZSBhIGRlZmF1bHQgb3Bwb25lbnQgZGVjayBmb3IgdGVzdGluZy4KICAgIFBvcnRlZCBmcm9tIGdlbmVyYXRlVHJhaW5pbmdEZWNrKCkgaW4gYXBwLmpzLgogICAgMzcgZm9yZXN0cyArIDIwIGNyZWF0dXJlcyBvZiB2YXJ5aW5nIHNpemUgKyBzb21lIHNwZWxscy4KICAgICIiIgogICAgZGVjazogbGlzdFtDYXJkXSA9IFtdCgogICAgIyAzNyBsYW5kcwogICAgZm9yIF8gaW4gcmFuZ2UoMzcpOgogICAgICAgIGMgPSBDYXJkKG5hbWU9IkZvcmVzdCIsIHR5cGVfbGluZT0iQmFzaWMgTGFuZCAtIEZvcmVzdCIsIG9yYWNsZV90ZXh0PSJ7VH06IEFkZCB7R30iLCBjbWM9MCkKICAgICAgICBkZWNrLmFwcGVuZChjKQoKICAgICMgMjAgY3JlYXR1cmVzIG9mIHZhcnlpbmcgc2l6ZXMKICAgIGNyZWF0dXJlcyA9IFsKICAgICAgICAoIkxsYW5vd2FyIEVsdmVzIiwgMSwgIjEvMSIpLCAoIkVsdmlzaCBNeXN0aWMiLCAxLCAiMS8xIiksCiAgICAgICAgKCJTYWt1cmEtVHJpYmUgRWxkZXIiLCAyLCAiMS8xIiksICgiUmVjbGFtYXRpb24gU2FnZSIsIDMsICIyLzEiKSwKICAgICAgICAoIkJlYXN0IFdoaXNwZXJlciIsIDQsICIyLzMiKSwgKCJSYXZlbm91cyBCYWxvdGgiLCA0LCAiNC80IiksCiAgICAgICAgKCJUaHJhZ3R1c2siLCA1LCAiNS8zIiksICgiQWNpZGljIFNsaW1lIiwgNSwgIjIvMiIpLAogICAgICAgICgiQ2FybmFnZSBUeXJhbnQiLCA2LCAiNy82IiksICgiUmFtcGFnaW5nIEJhbG90aHMiLCA2LCAiNi82IiksCiAgICAgICAgKCJWZXJkYW50IEZvcmNlIiwgOCwgIjcvNyIpLCAoIldvb2RmYWxsIFByaW11cyIsIDgsICI2LzYiKSwKICAgICAgICAoIlRlcmFzdG9kb24iLCA4LCAiOS85IiksICgiQ3JhdGVyaG9vZiBCZWhlbW90aCIsIDgsICI1LzUiKSwKICAgICAgICAoIkdoYWx0YSwgUHJpbWFsIEh1bmdlciIsIDEyLCAiMTIvMTIiKSwgKCJHYXJydWsncyBQYWNrbGVhZGVyIiwgNSwgIjQvNCIpLAogICAgICAgICgiVGltYmVyd2F0Y2ggRWxmIiwgMywgIjEvMiIpLCAoIkZpZXJjZSBFbXBhdGgiLCAzLCAiMS8xIiksCiAgICAgICAgKCJZYXZpbWF5YSBFbGRlciIsIDMsICIyLzEiKSwgKCJFdGVybmFsIFdpdG5lc3MiLCAzLCAiMi8xIiksCiAgICBdCiAgICBmb3IgbmFtZSwgY21jLCBwdCBpbiBjcmVhdHVyZXM6CiAgICAgICAgcGFydHMgPSBwdC5zcGxpdCgiLyIpCiAgICAgICAgYyA9IENhcmQoCiAgICAgICAgICAgIG5hbWU9bmFtZSwgdHlwZV9saW5lPSJDcmVhdHVyZSIsIGNtYz1jbWMsIHB0PXB0LAogICAgICAgICAgICBwb3dlcj1wYXJ0c1swXSwgdG91Z2huZXNzPXBhcnRzWzFdLAogICAgICAgICkKICAgICAgICBkZWNrLmFwcGVuZChjKQoKICAgICMgNiBzcGVsbHMKICAgIHNwZWxscyA9IFsKICAgICAgICBDYXJkKG5hbWU9IkN1bHRpdmF0ZSIsIHR5cGVfbGluZT0iU29yY2VyeSIsIGNtYz0zLCBvcmFjbGVfdGV4dD0iU2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgdHdvIGJhc2ljIGxhbmRzLiIsIGlzX3JhbXA9VHJ1ZSksCiAgICAgICAgQ2FyZChuYW1lPSJLb2RhbWEncyBSZWFjaCIsIHR5cGVfbGluZT0iU29yY2VyeSIsIGNtYz0zLCBvcmFjbGVfdGV4dD0iU2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgdHdvIGJhc2ljIGxhbmRzLiIsIGlzX3JhbXA9VHJ1ZSksCiAgICAgICAgQ2FyZChuYW1lPSJIYXJtb25pemUiLCB0eXBlX2xpbmU9IlNvcmNlcnkiLCBjbWM9NCwgb3JhY2xlX3RleHQ9IkRyYXcgdGhyZWUgY2FyZHMuIiksCiAgICAgICAgQ2FyZChuYW1lPSJCZWFzdCBXaXRoaW4iLCB0eXBlX2xpbmU9Ikluc3RhbnQiLCBjbWM9Mywgb3JhY2xlX3RleHQ9IkRlc3Ryb3kgdGFyZ2V0IHBlcm1hbmVudC4iLCBpc19yZW1vdmFsPVRydWUpLAogICAgICAgIENhcmQobmFtZT0iTmF0dXJlJ3MgTG9yZSIsIHR5cGVfbGluZT0iU29yY2VyeSIsIGNtYz0yLCBvcmFjbGVfdGV4dD0iU2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSBmb3Jlc3QuIiwgaXNfcmFtcD1UcnVlKSwKICAgICAgICBD' +
'YXJkKG5hbWU9IlNvbCBSaW5nIiwgdHlwZV9saW5lPSJBcnRpZmFjdCIsIGNtYz0xLCBvcmFjbGVfdGV4dD0ie1R9OiBBZGQge0N9e0N9IiwgaXNfcmFtcD1UcnVlKSwKICAgIF0KICAgIGRlY2suZXh0ZW5kKHNwZWxscykKCiAgICByZXR1cm4gZGVjawoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQ0xJIEVudHJ5IFBvaW50CiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkZWYgX3ByaW50X3N0YXRzKHN0YXRzOiBkaWN0KSAtPiBOb25lOgogICAgIiIiUHJldHR5LXByaW50IHNpbXVsYXRpb24gc3RhdHMuIiIiCiAgICBwcmludCgpCiAgICBwcmludCgiPSIgKiA2MCkKICAgIHByaW50KGYiICBTSU1VTEFUSU9OIFJFU1VMVFM6IHtzdGF0c1snZGVja19uYW1lJ119IHZzIHtzdGF0c1snb3Bwb25lbnRfbmFtZSddfSIpCiAgICBwcmludCgiPSIgKiA2MCkKICAgIHByaW50KGYiICBHYW1lcyBwbGF5ZWQ6ICAgICAge3N0YXRzWyd0b3RhbF9nYW1lcyddfSIpCiAgICBwcmludChmIiAgV2lucyAvIExvc3NlczogICAgIHtzdGF0c1snd2lucyddfSAvIHtzdGF0c1snbG9zc2VzJ119IikKICAgIHByaW50KGYiICBXaW4gUmF0ZTogICAgICAgICAge3N0YXRzWyd3aW5fcmF0ZSddfSUiKQogICAgcHJpbnQoZiIgIEF2ZyBUdXJuczogICAgICAgICB7c3RhdHNbJ2F2Z190dXJucyddfSIpCiAgICBwcmludCgiLSIgKiA2MCkKICAgIHByaW50KGYiICBBdmcgRGFtYWdlIERlYWx0OiAgICAge3N0YXRzWydhdmdfZGFtYWdlX2RlYWx0J119IikKICAgIHByaW50KGYiICBBdmcgRGFtYWdlIFJlY2VpdmVkOiAge3N0YXRzWydhdmdfZGFtYWdlX3JlY2VpdmVkJ119IikKICAgIHByaW50KGYiICBBdmcgU3BlbGxzIENhc3Q6ICAgICAge3N0YXRzWydhdmdfc3BlbGxzX2Nhc3QnXX0iKQogICAgcHJpbnQoZiIgIEF2ZyBDcmVhdHVyZXMgUGxheWVkOiB7c3RhdHNbJ2F2Z19jcmVhdHVyZXNfcGxheWVkJ119IikKICAgIHByaW50KGYiICBBdmcgUmVtb3ZhbCBVc2VkOiAgICAge3N0YXRzWydhdmdfcmVtb3ZhbF91c2VkJ119IikKICAgIHByaW50KGYiICBBdmcgUmFtcCBQbGF5ZWQ6ICAgICAge3N0YXRzWydhdmdfcmFtcF9wbGF5ZWQnXX0iKQogICAgcHJpbnQoZiIgIEF2ZyBDYXJkcyBEcmF3bjogICAgICB7c3RhdHNbJ2F2Z19jYXJkc19kcmF3biddfSIpCiAgICBwcmludChmIiAgQXZnIE1heCBCb2FyZCBTaXplOiAgIHtzdGF0c1snYXZnX21heF9ib2FyZF9zaXplJ119IikKICAgIHByaW50KCItIiAqIDYwKQogICAgcHJpbnQoZiIgIEVsYXBzZWQ6ICAgICAgICAgICB7c3RhdHNbJ2VsYXBzZWRfc2Vjb25kcyddfXMiKQogICAgcHJpbnQoIj0iICogNjApCiAgICBwcmludCgpCgoKZGVmIF9jbGlfbWFpbigpIC0+IE5vbmU6CiAgICAiIiJDTEkgZW50cnkgcG9pbnQgZm9yIGBjb21tYW5kZXItc2ltYCBzY3JpcHQuIiIiCiAgICBfcnVuX3Ntb2tlX3Rlc3QoKQoKCmRlZiBfcnVuX3Ntb2tlX3Rlc3QoKSAtPiBOb25lOgogICAgIiIiUnVuIHRoZSBidWlsdC1pbiBzbW9rZSB0ZXN0LiIiIgogICAgIyDilIDilIAgU21va2UgdGVzdCB3aXRoIGEgc21hbGwgS29ydm9sZCBBcmlzdG9jcmF0cyBsaXN0IOKUgOKUgAogICAgdGVzdF9kZWNrbGlzdCA9IFsKICAgICAgICAjIENvbW1hbmRlcgogICAgICAgICJLb3J2b2xkLCBGYWUtQ3Vyc2VkIEtpbmciLAogICAgICAgICMgTGFuZHMgKDM3KQogICAgICAgICpbIlN3YW1wIl0gKiAxMiwKICAgICAgICAqWyJGb3Jlc3QiXSAqIDEyLAogICAgICAgICpbIk1vdW50YWluIl0gKiAxMywKICAgICAgICAjIFJhbXAgKDgpCiAgICAgICAgIlNvbCBSaW5nIiwgIkFyY2FuZSBTaWduZXQiLCAiRmVsbHdhciBTdG9uZSIsCiAgICAgICAgIkN1bHRpdmF0ZSIsICJLb2RhbWEncyBSZWFjaCIsICJOYXR1cmUncyBMb3JlIiwKICAgICAgICAiUmFtcGFudCBHcm93dGgiLCAiRmFy' +
'c2VlayIsCiAgICAgICAgIyBSZW1vdmFsICg2KQogICAgICAgICJCZWFzdCBXaXRoaW4iLCAiQ2hhb3MgV2FycCIsICJHbyBmb3IgdGhlIFRocm9hdCIsCiAgICAgICAgIk11cmRlciIsICJIZXJvJ3MgRG93bmZhbGwiLCAiR2VuZXJvdXMgR2lmdCIsCiAgICAgICAgIyBCb2FyZCB3aXBlcyAoMikKICAgICAgICAiRGFtbmF0aW9uIiwgIkJsYXNwaGVtb3VzIEFjdCIsCiAgICAgICAgIyBDcmVhdHVyZXMgKDEwKQogICAgICAgICJTYWt1cmEtVHJpYmUgRWxkZXIiLCAiVmlzY2VyYSBTZWVyIiwgIkJsb29kIEFydGlzdCIsCiAgICAgICAgIlp1bGFwb3J0IEN1dHRocm9hdCIsICJNYXloZW0gRGV2aWwiLCAiU2F2dnkgSHVudGVyIiwKICAgICAgICAiQnV0Y2hlciBvZiBNYWxha2lyIiwgIkdyYXZlIFBhY3QiLCAiRGljdGF0ZSBvZiBFcmVib3MiLAogICAgICAgICJBdmVuZ2VyIG9mIFplbmRpa2FyIiwKICAgICAgICAjIERyYXcgLyB1dGlsaXR5ICgzKQogICAgICAgICJIYXJtb25pemUiLCAiUmVhZCB0aGUgQm9uZXMiLCAiUGh5cmV4aWFuIEFyZW5hIiwKICAgIF0KCiAgICBwcmludCgiQnVpbGRpbmcgdGVzdCBkZWNrIChLb3J2b2xkIEFyaXN0b2NyYXRzKS4uLiIpCiAgICB0ZXN0X2RlY2sgPSBidWlsZF9kZWNrKHRlc3RfZGVja2xpc3QpCiAgICBwcmludChmIiAgRGVjayBzaXplOiB7bGVuKHRlc3RfZGVjayl9IGNhcmRzIikKCiAgICBwcmludCgiXG5SdW5uaW5nIHNpbmdsZSBnYW1lLi4uIikKICAgIHNpbmdsZSA9IHJ1bl9zaW5nbGVfZ2FtZSh0ZXN0X2RlY2ssIG5hbWVfYT0iS29ydm9sZCIpCiAgICBwcmludChmIiAgV2lubmVyOiB7c2luZ2xlWyd3aW5uZXJfbmFtZSddfSBpbiB7c2luZ2xlWyd0dXJucyddfSB0dXJucyIpCgogICAgcHJpbnQoIlxuUnVubmluZyBNb250ZSBDYXJsbyBzaW11bGF0aW9uICgxMCBnYW1lcykuLi4iKQogICAgc3RhdHMgPSBydW5fc2ltdWxhdGlvbih0ZXN0X2RlY2ssIG51bV9nYW1lcz0xMCwgbmFtZV9hPSJLb3J2b2xkIikKICAgIF9wcmludF9zdGF0cyhzdGF0cykKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgX3J1bl9zbW9rZV90ZXN0KCkK'
Install-B64 -R 'src\commander_ai_lab\lab\experiments.py' -B $b
# src/commander_ai_lab/sim/__init__.py (506 bytes)
$b = 'IiIiQ29tbWFuZGVyIEFJIExhYiDigJQgU2ltdWxhdG9yIHN1YnBhY2thZ2UuCgpQb3J0ZWQgZnJvbSBtdGctY29tbWFuZGVyLWxhbiAoSmF2YVNjcmlwdCkgZGVjayB0ZXN0ZXIgLyBoZWFkbGVzcyBzaW0gZW5naW5lLgpQcm92aWRlcyBhIGhlYWRsZXNzIENvbW1hbmRlciBnYW1lIHNpbXVsYXRvciBmb3IgTW9udGUgQ2FybG8gYW5hbHlzaXMuCiIiIgoKZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5tb2RlbHMgaW1wb3J0IENhcmQsIFBsYXllciwgU2ltU3RhdGUKZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5lbmdpbmUgaW1wb3J0IEdhbWVFbmdpbmUKZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5ydWxlcyBpbXBvcnQgZW5yaWNoX2NhcmQsIEFJX0RFRkFVTFRfV0VJR0hUUwoKX19hbGxfXyA9IFsKICAgICJDYXJkIiwKICAgICJQbGF5ZXIiLAogICAgIlNpbVN0YXRlIiwKICAgICJHYW1lRW5naW5lIiwKICAgICJlbnJpY2hfY2FyZCIsCiAgICAiQUlfREVGQVVMVF9XRUlHSFRTIiwKXQo='
Install-B64 -R 'src\commander_ai_lab\sim\__init__.py' -B $b
# src/commander_ai_lab/sim/deepseek_brain.py (35,100 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIERlZXBTZWVrIExMTSBCcmFpbiBmb3IgQUkgT3Bwb25lbnQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkludGVncmF0ZXMgYSBsb2NhbCBMTE0gKERlZXBTZWVrLVIxIHZpYSBMTSBTdHVkaW8gLyBPbGxhbWEpIGFzIHRoZQpkZWNpc2lvbi1tYWtpbmcgImJyYWluIiBmb3IgdGhlIEFJIG9wcG9uZW50IGluIHRoZSBoZWFkbGVzcyBzaW11bGF0b3IuCgpUaGUgTExNIHJlY2VpdmVzIGEgc3RydWN0dXJlZCBnYW1lLXN0YXRlIHNuYXBzaG90IGFuZCByZXR1cm5zIGEgSlNPTgphY3Rpb24gZGVzY3JpYmluZyB3aGF0IHRvIGRvIHRoaXMgdHVybiAocGxheSBsYW5kLCBjYXN0IHNwZWxsLCBhdHRhY2ssCmhvbGQvcGFzcywgdXNlIHJlbW92YWwsIHVzZSBib2FyZCB3aXBlLCBjYXN0IHJhbXAsIGNhc3QgY29tbWFuZGVyKS4KClN1cHBvcnRzOgogIC0gTE0gU3R1ZGlvIChPcGVuQUktY29tcGF0aWJsZSBBUEkpIOKAlCBkZWZhdWx0IGF0IGh0dHA6Ly8xOTIuMTY4LjAuMTIyOjEyMzQKICAtIE9sbGFtYSAoT3BlbkFJLWNvbXBhdGlibGUgbW9kZSkg4oCUIGh0dHA6Ly9sb2NhbGhvc3Q6MTE0MzQKICAtIEFueSBPcGVuQUktY29tcGF0aWJsZSBlbmRwb2ludAoKUGVyZm9ybWFuY2UgZmVhdHVyZXM6CiAgLSBDb25maWd1cmFibGUgdGltZW91dCB3aXRoIGZhbGxiYWNrIHRvIGhldXJpc3RpYwogIC0gUmVzcG9uc2UgY2FjaGluZyBmb3IgaWRlbnRpY2FsIGdhbWUgc3RhdGVzCiAgLSBTdHJ1Y3R1cmVkIEpTT04gb3V0cHV0IHdpdGggdmFsaWRhdGlvbgogIC0gRGVjaXNpb24gbG9nZ2luZyAoSlNPTkwpIGZvciBmdXR1cmUgUkwgdHJhaW5pbmcgZGF0YQoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBoYXNobGliCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHRpbWUKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZApmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgT3B0aW9uYWwKZnJvbSB1cmxsaWIuZXJyb3IgaW1wb3J0IFVSTEVycm9yCmZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3QsIHVybG9wZW4KCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJkZWVwc2Vla19icmFpbiIpCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDb25maWd1cmF0aW9uCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpAZGF0YWNsYXNzCmNsYXNzIERlZXBTZWVrQ29uZmlnOgogICAgIiIiQ29uZmlndXJhdGlvbiBmb3IgdGhlIERlZXBTZWVrIExMTSBicmFpbi4iIiIKCiAgICAjIEFQSSBlbmRwb2ludCAoT3BlbkFJLWNvbXBhdGlibGUpCiAgICBhcGlfYmFzZTogc3RyID0gImh0dHA6Ly8xOTIuMTY4LjAuMTIyOjEyMzQiCiAgICBtb2RlbDogc3RyID0gImRlZXBzZWVrLXIxLWRpc3RpbGwtcXdlbi04YiIgICMgTE0gU3R1ZGlvIG1vZGVsIG5hbWUKCiAgICAjIEdlbmVyYXRpb24gcGFyYW1ldGVycwogICAgdGVtcGVyYXR1cmU6IGZsb2F0ID0gMC4zICAgICAgICMgTG93IGZvciBtb3JlIGRldGVybWluaXN0aWMgcGxheQogICAgbWF4X3Rva2VuczogaW50ID0gMjA0OCAgICAgICAgICMgUjEgbmVlZHMgcm9vbSBmb3IgPHRoaW5rPiByZWFzb25pbmcgKyBKU09OIHJlc3BvbnNlCiAgICB0b3BfcDogZmxvYXQgPSAwLjkKCiAgICAjIFRpbWVvdXRzCiAgICByZXF1ZXN0X3RpbWVvdXQ6IGZsb2F0ID0gMTAuMCAgIyBzZWNvbmRzIHBlciBMTE0gY2FsbAogICAgZmFsbGJhY2tfb25fdGltZW91dDogYm9vbCA9IFRydWUgICMgdXNlIGhldXJpc3RpYyBpZiBMTE0gdGltZXMgb3V0CgogICAgIyBD' +
'YWNoaW5nCiAgICBjYWNoZV9lbmFibGVkOiBib29sID0gVHJ1ZQogICAgY2FjaGVfbWF4X3NpemU6IGludCA9IDI1NiAgICAgICMgTFJVIGNhY2hlIGVudHJpZXMKCiAgICAjIExvZ2dpbmcKICAgIGxvZ19kZWNpc2lvbnM6IGJvb2wgPSBUcnVlCiAgICBsb2dfZGlyOiBzdHIgPSAiIiAgICAgICAgICAgICAgIyBTZXQgYXQgcnVudGltZQoKICAgICMgUmV0cnkKICAgIG1heF9yZXRyaWVzOiBpbnQgPSAxICAgICAgICAgICAjIFJldHJ5IG9uY2Ugb24gcGFyc2UgZmFpbHVyZQoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgR2FtZS1TdGF0ZSBTY2hlbWEgIChTdGVwIDIpIOKAlCBGdWxsIEludGVsbGlnZW5jZSBTbmFwc2hvdAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBCYXNpYyBsYW5kIOKGkiBjb2xvciBtYXBwaW5nIGZvciBtYW5hIGNvbG9yIHRyYWNraW5nCl9MQU5EX0NPTE9SX01BUCA9IHsKICAgICJwbGFpbnMiOiAiVyIsICJpc2xhbmQiOiAiVSIsICJzd2FtcCI6ICJCIiwgIm1vdW50YWluIjogIlIiLCAiZm9yZXN0IjogIkciLAp9CgojIEtub3duIGNvbWJvL3N5bmVyZ3kgcGF0dGVybnMgZGV0ZWN0ZWQgZnJvbSBvcmFjbGUgdGV4dApfQ09NQk9fUEFUVEVSTlMgPSBbCiAgICAoImluZmluaXRlIiwgIkluZmluaXRlIGNvbWJvIHBpZWNlIiksCiAgICAoInlvdSB3aW4gdGhlIGdhbWUiLCAiQWx0ZXJuYXRlIHdpbiBjb25kaXRpb24iKSwKICAgICgiZXh0cmEgdHVybiIsICJFeHRyYSB0dXJuIGVmZmVjdCIpLAogICAgKCJ3aGVuZXZlciAuKiBlbnRlcnMgdGhlIGJhdHRsZWZpZWxkIiwgIkVUQiBzeW5lcmd5IHBheW9mZiIpLAogICAgKCJ3aGVuZXZlciAuKiBkaWVzIiwgIkRlYXRoIHRyaWdnZXIgcGF5b2ZmIiksCiAgICAoImNyZWF0ZSAuKiB0b2tlbiIsICJUb2tlbiBnZW5lcmF0b3IiKSwKICAgICgiZG91YmxlIiwgIkRvdWJsaW5nIGVmZmVjdCIpLAogICAgKCJlYWNoIG9wcG9uZW50IiwgIk11bHRpcGxheWVyIGRhbWFnZSAvIGRyYWluIiksCiAgICAoImRyYXcgLiogY2FyZHM/IiwgIkNhcmQgZHJhdyBlbmdpbmUiKSwKICAgICgic2VhcmNoIHlvdXIgbGlicmFyeSIsICJUdXRvciBlZmZlY3QiKSwKICAgICgicmV0dXJuIC4qIGZyb20gLiogZ3JhdmV5YXJkIiwgIlJlY3Vyc2lvbiAvIHJlYW5pbWF0aW9uIiksCiAgICAoImNhbid0IGJlIGNvdW50ZXJlZCIsICJVbmNvdW50ZXJhYmxlIHRocmVhdCIpLAogICAgKCJoZXhwcm9vZnxzaHJvdWR8aW5kZXN0cnVjdGlibGV8d2FyZCIsICJQcm90ZWN0ZWQgdGhyZWF0IiksCl0KCgpkZWYgYnVpbGRfZ2FtZV9zdGF0ZV9zbmFwc2hvdCgKICAgIHNpbV9zdGF0ZSwgICAgICAgICAgIyBTaW1TdGF0ZQogICAgcGxheWVyX2luZGV4OiBpbnQsICAjIFdoaWNoIHBsYXllciBpcyB0aGUgQUkgKDAgb3IgMSkKICAgIHR1cm46IGludCwKICAgIGRlY2tfY29udGV4dDogZGljdCB8IE5vbmUgPSBOb25lLCAgIyBGdWxsIGRlY2sgaW50ZWxsaWdlbmNlCikgLT4gZGljdDoKICAgICIiIgogICAgQnVpbGQgYSBjb21wcmVoZW5zaXZlIGdhbWUtc3RhdGUgZGljdCBmb3IgdGhlIExMTSB3aXRoIGZ1bGwgaW50ZWxsaWdlbmNlLgoKICAgIGRlY2tfY29udGV4dCAob3B0aW9uYWwpOgogICAgICAgIGNvbW1hbmRlcl9uYW1lLCBjb21tYW5kZXJfem9uZSwgY29sb3JfaWRlbnRpdHksIGFyY2hldHlwZSwKICAgICAgICBmdWxsX2RlY2tsaXN0LCBjb21ib19waWVjZXMsIHdpbl9yYXRlX2hpc3RvcnksIGRlY2tfc2l6ZQogICAgIiIiCiAgICBtZSA9IHNpbV9zdGF0ZS5wbGF5ZXJzW3BsYXllcl9pbmRleF0KICAgIG9wcCA9IHNpbV9zdGF0ZS5wbGF5ZXJzWzEgLSBwbGF5ZXJfaW5kZXhdCiAgICBjdHggPSBkZWNrX2NvbnRleHQgb3Ige30KCiAgICAjIOKUgOKUgCBNYW5hIGJ5IENvbG9yIChFbmhhbmNlbWVudCAjOCkg4pSA4pSA4pSA4pSA4pSA' +
'4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBtYW5hX3RvdGFsID0gMAogICAgbWFuYV9ieV9jb2xvciA9IHsiVyI6IDAsICJVIjogMCwgIkIiOiAwLCAiUiI6IDAsICJHIjogMCwgIkMiOiAwfQogICAgZm9yIGMgaW4gc2ltX3N0YXRlLmJhdHRsZWZpZWxkOgogICAgICAgIGlmIGMub3duZXJfaWQgPT0gcGxheWVyX2luZGV4IGFuZCBub3QgYy50YXBwZWQgYW5kIGMuaXNfbGFuZCgpOgogICAgICAgICAgICBtYW5hX3RvdGFsICs9IDEKICAgICAgICAgICAgbGFuZF9uYW1lID0gYy5uYW1lLmxvd2VyKCkuc3RyaXAoKQogICAgICAgICAgICBpZiBsYW5kX25hbWUgaW4gX0xBTkRfQ09MT1JfTUFQOgogICAgICAgICAgICAgICAgbWFuYV9ieV9jb2xvcltfTEFORF9DT0xPUl9NQVBbbGFuZF9uYW1lXV0gKz0gMQogICAgICAgICAgICBlbGlmIGMub3JhY2xlX3RleHQ6CiAgICAgICAgICAgICAgICAjIFBhcnNlIG9yYWNsZSB0ZXh0IGZvciBtYW5hIHByb2R1Y3Rpb24KICAgICAgICAgICAgICAgIG9yYWNsZV9sb3dlciA9IGMub3JhY2xlX3RleHQubG93ZXIoKQogICAgICAgICAgICAgICAgaWYgImFueSBjb2xvciIgaW4gb3JhY2xlX2xvd2VyOgogICAgICAgICAgICAgICAgICAgIGZvciBjbHIgaW4gIldVQlJHIjoKICAgICAgICAgICAgICAgICAgICAgICAgbWFuYV9ieV9jb2xvcltjbHJdICs9IDEKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZm9yIGNsciwgc3ltIGluIFsoIlciLCAie3d9IiksICgiVSIsICJ7dX0iKSwgKCJCIiwgIntifSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJSIiwgIntyfSIpLCAoIkciLCAie2d9IildOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBzeW0gaW4gb3JhY2xlX2xvd2VyIG9yIGYiYWRkIHtjbHIubG93ZXIoKX0iIGluIG9yYWNsZV9sb3dlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFfYnlfY29sb3JbY2xyXSArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGFueShtYW5hX2J5X2NvbG9yW2tdIGZvciBrIGluICJXVUJSRyIpOgogICAgICAgICAgICAgICAgICAgICAgICBtYW5hX2J5X2NvbG9yWyJDIl0gKz0gMSAgIyBjb2xvcmxlc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG1hbmFfYnlfY29sb3JbIkMiXSArPSAxCgogICAgIyBPbmx5IGluY2x1ZGUgY29sb3JzIHRoYXQgaGF2ZSBzb3VyY2VzCiAgICBtYW5hX2NvbG9ycyA9IHtrOiB2IGZvciBrLCB2IGluIG1hbmFfYnlfY29sb3IuaXRlbXMoKSBpZiB2ID4gMH0KCiAgICAjIOKUgOKUgCBNeSBIYW5kIOKAlCBGdWxsIE9yYWNsZSBUZXh0IChFbmhhbmNlbWVudCAjNSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBteV9oYW5kID0gW10KICAgIGZvciBjIGluIG1lLmhhbmQ6CiAgICAgICAgY2FyZF9pbmZvID0gewogICAgICAgICAgICAibmFtZSI6IGMubmFtZSwKICAgICAgICAgICAgInR5cGUiOiBfc2hvcnRfdHlwZShjLnR5cGVfbGluZSksCiAgICAgICAgICAgICJjbWMiOiBjLmNtYyBvciAwLAogICAgICAgIH0KICAgICAgICBpZiBjLnB0OgogICAgICAgICAgICBjYXJkX2luZm9bInB0Il0gPSBjLnB0CiAgICAgICAgaWYgYy5rZXl3b3JkczoKICAgICAgICAgICAgY2FyZF9pbmZvWyJrZXl3b3JkcyJdID0gYy5rZXl3b3Jkc1s6NV0KICAgICAgICAjIFJvbGUgZGV0ZWN0aW9uCiAgICAgICAgcm9sZXMgPSBbXQogICAgICAgIGlmIGMuaXNfcmVtb3ZhbDoKICAgICAgICAgICAgcm9sZXMuYXBwZW5kKCJyZW1vdmFsIikKICAgICAgICBpZiBjLmlzX2JvYXJkX3dpcGU6CiAgICAgICAgICAgIHJvbGVzLmFwcGVuZCgiYm9hcmRfd2lwZSIpCiAgICAgICAgaWYgYy5pc19yYW1wOgogICAgICAgICAgICByb2xlcy5hcHBlbmQoInJhbXAiKQogICAgICAgIGlmIGMuaXNfY29tbWFuZGVyOgogICAgICAgICAgICByb2xlcy5hcHBlbmQoImNvbW1hbmRlciIpCiAgICAgICAgaWYgcm9sZXM6CiAgICAgICAgICAgIGNhcmRfaW5mb1sicm9sZXMiXSA9IHJvbGVzCiAgICAgICAgIyBGdWxsIG9yYWNsZSB0ZXh0IOKAlCBubyB0cnVuY2F0aW9uIChFbmhhbmNlbWVudCAjNSkKICAgICAgICBpZiBjLm9yYWNsZV90ZXh0OgogICAgICAgICAgICBjYXJkX2luZm9bIm9yYWNsZSJdID0gYy5vcmFjbGVfdGV4dAogICAgICAgICMgQ2FzdGFiaWxpdHkgY2hlY2sgYWdhaW5zdCBhdmFp' +
'bGFibGUgbWFuYQogICAgICAgIGNhcmRfaW5mb1siY2FzdGFibGUiXSA9IChjLmNtYyBvciAwKSA8PSBtYW5hX3RvdGFsIGFuZCBub3QgYy5pc19sYW5kKCkKICAgICAgICBteV9oYW5kLmFwcGVuZChjYXJkX2luZm8pCgogICAgIyDilIDilIAgTXkgQm9hcmQg4oCUIHdpdGgga2V5d29yZHMgYW5kIG9yYWNsZSBmb3Igc3luZXJneSDilIDilIDilIDilIDilIDilIDilIAKICAgIG15X2JvYXJkID0gW10KICAgIGZvciBjIGluIHNpbV9zdGF0ZS5iYXR0bGVmaWVsZDoKICAgICAgICBpZiBjLm93bmVyX2lkICE9IHBsYXllcl9pbmRleDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiBjLmlzX2xhbmQoKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbnRyeSA9IHsKICAgICAgICAgICAgIm5hbWUiOiBjLm5hbWUsCiAgICAgICAgICAgICJ0eXBlIjogX3Nob3J0X3R5cGUoYy50eXBlX2xpbmUpLAogICAgICAgIH0KICAgICAgICBpZiBjLnB0OgogICAgICAgICAgICBlbnRyeVsicHQiXSA9IGMucHQKICAgICAgICBpZiBjLnRhcHBlZDoKICAgICAgICAgICAgZW50cnlbInRhcHBlZCJdID0gVHJ1ZQogICAgICAgIGlmIGMua2V5d29yZHM6CiAgICAgICAgICAgIGVudHJ5WyJrZXl3b3JkcyJdID0gYy5rZXl3b3Jkc1s6NV0KICAgICAgICBpZiBjLmlzX2NvbW1hbmRlcjoKICAgICAgICAgICAgZW50cnlbImlzX2NvbW1hbmRlciJdID0gVHJ1ZQogICAgICAgIG15X2JvYXJkLmFwcGVuZChlbnRyeSkKCiAgICAjIOKUgOKUgCBPcHBvbmVudCdzIEJvYXJkIOKAlCB3aXRoIFRocmVhdCBBc3Nlc3NtZW50IChFbmhhbmNlbWVudCAjOSkKICAgIG9wcF9ib2FyZCA9IFtdCiAgICBvcHBfdG90YWxfcG93ZXIgPSAwCiAgICBvcHBfZXZhc2lvbl9jb3VudCA9IDAKICAgIG9wcF9wcm90ZWN0ZWRfY291bnQgPSAwCiAgICBmb3IgYyBpbiBzaW1fc3RhdGUuYmF0dGxlZmllbGQ6CiAgICAgICAgaWYgYy5vd25lcl9pZCAhPSAoMSAtIHBsYXllcl9pbmRleCk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgYy5pc19sYW5kKCk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZW50cnkgPSB7CiAgICAgICAgICAgICJuYW1lIjogYy5uYW1lLAogICAgICAgICAgICAidHlwZSI6IF9zaG9ydF90eXBlKGMudHlwZV9saW5lKSwKICAgICAgICB9CiAgICAgICAgaWYgYy5wdDoKICAgICAgICAgICAgZW50cnlbInB0Il0gPSBjLnB0CiAgICAgICAgICAgIG9wcF90b3RhbF9wb3dlciArPSBjLmdldF9wb3dlcigpCiAgICAgICAgaWYgYy50YXBwZWQ6CiAgICAgICAgICAgIGVudHJ5WyJ0YXBwZWQiXSA9IFRydWUKICAgICAgICBpZiBjLmtleXdvcmRzOgogICAgICAgICAgICBlbnRyeVsia2V5d29yZHMiXSA9IGMua2V5d29yZHNbOjVdCiAgICAgICAgICAgIGt3X2xvd2VyID0gW2subG93ZXIoKSBmb3IgayBpbiBjLmtleXdvcmRzXQogICAgICAgICAgICBpZiBhbnkoayBpbiBrd19sb3dlciBmb3IgayBpbiBbImZseWluZyIsICJ0cmFtcGxlIiwgIm1lbmFjZSIsICJ1bmJsb2NrYWJsZSIsICJzaGFkb3ciXSk6CiAgICAgICAgICAgICAgICBvcHBfZXZhc2lvbl9jb3VudCArPSAxCiAgICAgICAgICAgIGlmIGFueShrIGluIGt3X2xvd2VyIGZvciBrIGluIFsiaGV4cHJvb2YiLCAic2hyb3VkIiwgImluZGVzdHJ1Y3RpYmxlIiwgIndhcmQiXSk6CiAgICAgICAgICAgICAgICBvcHBfcHJvdGVjdGVkX2NvdW50ICs9IDEKICAgICAgICBvcHBfYm9hcmQuYXBwZW5kKGVudHJ5KQoKICAgICMgVGhyZWF0IGxldmVsIHN1bW1hcnkKICAgIGlmIG9wcF90b3RhbF9wb3dlciA+PSBtZS5saWZlOgogICAgICAgIHRocmVhdF9sZXZlbCA9ICJMRVRIQUwiCiAgICBlbGlmIG9wcF90b3RhbF9wb3dlciA+PSBtZS5saWZlICogMC41OgogICAgICAgIHRocmVhdF9sZXZlbCA9ICJISUdIIgogICAgZWxpZiBsZW4ob3BwX2JvYXJkKSA+PSA0IG9yIG9wcF90b3RhbF9wb3dlciA+PSAxMDoKICAgICAgICB0aHJlYXRfbGV2ZWwgPSAiTU9ERVJBVEUiCiAgICBlbGlmIG9wcF9ib2FyZDoKICAgICAgICB0aHJlYXRfbGV2ZWwgPSAiTE9XIgogICAgZWxzZToKICAgICAgICB0aHJlYXRfbGV2ZWwgPSAiTk9ORSIKCiAgICAjIOKUgOKUgCBHcmF2ZXlhcmQgQ29udGVudHMgKEVuaGFuY2VtZW50ICM2KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIG15X2d5ID0gW3sibmFtZSI6IGMubmFtZSwgInR5cGUiOiBfc2hvcnRfdHlw' +
'ZShjLnR5cGVfbGluZSl9IGZvciBjIGluIG1lLmdyYXZleWFyZFs6MTVdXQogICAgb3BwX2d5ID0gW3sibmFtZSI6IGMubmFtZSwgInR5cGUiOiBfc2hvcnRfdHlwZShjLnR5cGVfbGluZSl9IGZvciBjIGluIG9wcC5ncmF2ZXlhcmRbOjEwXV0KCiAgICAjIOKUgOKUgCBEcmF3IFRyYWNraW5nIChFbmhhbmNlbWVudCAjNykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICB0b3RhbF9kZWNrX3NpemUgPSBjdHguZ2V0KCJkZWNrX3NpemUiLCAxMDApCiAgICBjYXJkc19zZWVuID0gbGVuKG1lLmhhbmQpICsgbGVuKG1lLmdyYXZleWFyZCkgKyBzdW0oCiAgICAgICAgMSBmb3IgYyBpbiBzaW1fc3RhdGUuYmF0dGxlZmllbGQgaWYgYy5vd25lcl9pZCA9PSBwbGF5ZXJfaW5kZXgKICAgICkKICAgIGNhcmRzX3JlbWFpbmluZyA9IGxlbihtZS5saWJyYXJ5KQogICAgcGN0X2RyYXduID0gcm91bmQoY2FyZHNfc2VlbiAvIG1heCh0b3RhbF9kZWNrX3NpemUsIDEpICogMTAwKQoKICAgICMgS2V5IGNhcmRzIHN0aWxsIGluIGxpYnJhcnkgKGlmIHdlIGtub3cgdGhlIGRlY2tsaXN0KQogICAga2V5X2NhcmRzX2luX2xpYnJhcnkgPSBbXQogICAgaWYgY3R4LmdldCgia2V5X2NhcmRzIik6CiAgICAgICAgbGlicmFyeV9uYW1lcyA9IHtjLm5hbWUubG93ZXIoKSBmb3IgYyBpbiBtZS5saWJyYXJ5fQogICAgICAgIGZvciBrYyBpbiBjdHhbImtleV9jYXJkcyJdOgogICAgICAgICAgICBpZiBrYy5sb3dlcigpIGluIGxpYnJhcnlfbmFtZXM6CiAgICAgICAgICAgICAgICBrZXlfY2FyZHNfaW5fbGlicmFyeS5hcHBlbmQoa2MpCgogICAgIyDilIDilIAgQnVpbGQgdGhlIHNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgc25hcHNob3QgPSB7CiAgICAgICAgInR1cm4iOiB0dXJuICsgMSwKICAgICAgICAibXlfbGlmZSI6IG1lLmxpZmUsCiAgICAgICAgIm9wcF9saWZlIjogb3BwLmxpZmUsCiAgICAgICAgIm15X21hbmFfdG90YWwiOiBtYW5hX3RvdGFsLAogICAgICAgICJteV9tYW5hX2J5X2NvbG9yIjogbWFuYV9jb2xvcnMsCiAgICAgICAgIm15X2hhbmQiOiBteV9oYW5kLAogICAgICAgICJteV9ib2FyZCI6IG15X2JvYXJkLAogICAgICAgICJvcHBfYm9hcmQiOiBvcHBfYm9hcmQsCiAgICAgICAgIm9wcF90aHJlYXQiOiB7CiAgICAgICAgICAgICJsZXZlbCI6IHRocmVhdF9sZXZlbCwKICAgICAgICAgICAgInRvdGFsX3Bvd2VyIjogb3BwX3RvdGFsX3Bvd2VyLAogICAgICAgICAgICAiZXZhc2l2ZV9jcmVhdHVyZXMiOiBvcHBfZXZhc2lvbl9jb3VudCwKICAgICAgICAgICAgInByb3RlY3RlZF9jcmVhdHVyZXMiOiBvcHBfcHJvdGVjdGVkX2NvdW50LAogICAgICAgIH0sCiAgICAgICAgIm15X2dyYXZleWFyZCI6IG15X2d5LAogICAgICAgICJvcHBfZ3JhdmV5YXJkIjogb3BwX2d5LAogICAgICAgICJteV9saWJyYXJ5X2NvdW50IjogY2FyZHNfcmVtYWluaW5nLAogICAgICAgICJvcHBfbGlicmFyeV9jb3VudCI6IGxlbihvcHAubGlicmFyeSksCiAgICAgICAgImRlY2tfZHJhd25fcGN0IjogcGN0X2RyYXduLAogICAgfQoKICAgICMg4pSA4pSAIENvbW1hbmRlciBJZGVudGl0eSAoRW5oYW5jZW1lbnQgIzIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYgY3R4LmdldCgiY29tbWFuZGVyX25hbWUiKToKICAgICAgICAjIERldGVybWluZSBjb21tYW5kZXIgem9uZQogICAgICAgIGNtZF9uYW1lX2xvd2VyID0gY3R4WyJjb21tYW5kZXJfbmFtZSJdLmxvd2VyKCkKICAgICAgICBjbWRfem9uZSA9ICJsaWJyYXJ5IiAgIyBkZWZhdWx0CiAgICAgICAgZm9yIGMgaW4gbWUuaGFuZDoKICAgICAgICAgICAgaWYgYy5uYW1lLmxvd2VyKCkgPT0gY21kX25hbWVfbG93ZXI6CiAgICAgICAgICAgICAgICBjbWRfem9uZSA9ICJoYW5kIgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBmb3IgYyBpbiBzaW1fc3RhdGUuYmF0dGxlZmllbGQ6CiAgICAgICAgICAgIGlmIGMub3duZXJfaWQgPT0gcGxheWVyX2luZGV4IGFuZCBjLm5hbWUubG93ZXIoKSA9PSBjbWRfbmFtZV9sb3dlcjoKICAgICAgICAgICAgICAgIGNtZF96b25lID0gImJhdHRsZWZp' +
'ZWxkIgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBmb3IgYyBpbiBtZS5ncmF2ZXlhcmQ6CiAgICAgICAgICAgIGlmIGMubmFtZS5sb3dlcigpID09IGNtZF9uYW1lX2xvd2VyOgogICAgICAgICAgICAgICAgY21kX3pvbmUgPSAiZ3JhdmV5YXJkIgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgc25hcHNob3RbImNvbW1hbmRlciJdID0gewogICAgICAgICAgICAibmFtZSI6IGN0eFsiY29tbWFuZGVyX25hbWUiXSwKICAgICAgICAgICAgInpvbmUiOiBjbWRfem9uZSwKICAgICAgICAgICAgImNvbG9yX2lkZW50aXR5IjogY3R4LmdldCgiY29sb3JfaWRlbnRpdHkiLCBbXSksCiAgICAgICAgfQoKICAgICMg4pSA4pSAIEZ1bGwgRGVja2xpc3QgQXdhcmVuZXNzIChFbmhhbmNlbWVudCAjMSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBpZiBjdHguZ2V0KCJkZWNrX3N1bW1hcnkiKToKICAgICAgICBzbmFwc2hvdFsiZGVja19zdW1tYXJ5Il0gPSBjdHhbImRlY2tfc3VtbWFyeSJdCgogICAgIyDilIDilIAgV2luIENvbmRpdGlvbnMgJiBDb21ib3MgKEVuaGFuY2VtZW50ICMzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmIGN0eC5nZXQoImNvbWJvX3BpZWNlcyIpOgogICAgICAgIHNuYXBzaG90WyJjb21ib19waWVjZXMiXSA9IGN0eFsiY29tYm9fcGllY2VzIl0KCiAgICAjIOKUgOKUgCBLZXkgQ2FyZHMgaW4gTGlicmFyeSAoRW5oYW5jZW1lbnQgIzcpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgaWYga2V5X2NhcmRzX2luX2xpYnJhcnk6CiAgICAgICAgc25hcHNob3RbImtleV9jYXJkc19pbl9saWJyYXJ5Il0gPSBrZXlfY2FyZHNfaW5fbGlicmFyeVs6MTBdCgogICAgIyDilIDilIAgSGlzdG9yaWNhbCBXaW4gUmF0ZSAoRW5oYW5jZW1lbnQgIzEwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGlmIGN0eC5nZXQoIndpbl9yYXRlIikgaXMgbm90IE5vbmU6CiAgICAgICAgc25hcHNob3RbImhpc3RvcmljYWxfd2luX3JhdGUiXSA9IGN0eFsid2luX3JhdGUiXQoKICAgIHJldHVybiBzbmFwc2hvdAoKCmRlZiBfc2hvcnRfdHlwZSh0eXBlX2xpbmU6IHN0cikgLT4gc3RyOgogICAgIiIiU2hvcnRlbiB0eXBlX2xpbmUgZm9yIHRva2VuIGVmZmljaWVuY3kuIiIiCiAgICBpZiBub3QgdHlwZV9saW5lOgogICAgICAgIHJldHVybiAiPyIKICAgIHRsID0gdHlwZV9saW5lLmxvd2VyKCkKICAgIGlmICJjcmVhdHVyZSIgaW4gdGw6CiAgICAgICAgcmV0dXJuICJjcmVhdHVyZSIKICAgIGlmICJpbnN0YW50IiBpbiB0bDoKICAgICAgICByZXR1cm4gImluc3RhbnQiCiAgICBpZiAic29yY2VyeSIgaW4gdGw6CiAgICAgICAgcmV0dXJuICJzb3JjZXJ5IgogICAgaWYgImFydGlmYWN0IiBpbiB0bDoKICAgICAgICByZXR1cm4gImFydGlmYWN0IgogICAgaWYgImVuY2hhbnRtZW50IiBpbiB0bDoKICAgICAgICByZXR1cm4gImVuY2hhbnRtZW50IgogICAgaWYgInBsYW5lc3dhbGtlciIgaW4gdGw6CiAgICAgICAgcmV0dXJuICJwbGFuZXN3YWxrZXIiCiAgICBpZiAibGFuZCIgaW4gdGw6CiAgICAgICAgcmV0dXJuICJsYW5kIgogICAgcmV0dXJuIHR5cGVfbGluZVs6MjBdCgoKZGVmIGJ1aWxkX2RlY2tfY29udGV4dCgKICAgIGZ1bGxfZGVjazogbGlzdCwgICAgICAgICAgIyBsaXN0W0NhcmRdIOKAlCB0aGUgZnVsbCBvcmlnaW5hbCBkZWNrCiAgICBjb21tYW5kZXJfbmFtZTogc3RyID0gIiIsCiAgICBjb2xvcl9pZGVudGl0eTogbGlzdFtzdHJdIHwgTm9uZSA9IE5vbmUsCiAgICBhcmNoZXR5cGU6IHN0ciA9ICJtaWRyYW5nZSIsCiAgICB3aW5fcmF0ZTogZmxvYXQgfCBOb25lID0gTm9uZSwKKSAtPiBkaWN0OgogICAgIiIiCiAgICBCdWlsZCBhIGRlY2sgaW50ZWxsaWdlbmNlIGNvbnRleHQgZGljdCBmcm9tIHRoZSBmdWxsIGRlY2tsaXN0LgogICAgQ2FsbGVkIG9uY2UgYmVmb3JlIGEgZ2FtZSBzdGFydHMsIHRoZW4gcGFzc2VkIHRvIGJ1aWxkX2dhbWVfc3RhdGVfc25hcHNob3QgZWFjaCB0dXJuLgogICAgIiIiCiAgICBjdHg6IGRpY3Rbc3RyLCBBbnldID0gewogICAgICAgICJjb21tYW5kZXJfbmFtZSI6IGNvbW1hbmRlcl9uYW1lLAogICAgICAgICJjb2xvcl9pZGVudGl0eSI6IGNvbG9yX2lkZW50aXR5IG9yIFtdLAogICAgICAgICJh' +
'cmNoZXR5cGUiOiBhcmNoZXR5cGUsCiAgICAgICAgImRlY2tfc2l6ZSI6IGxlbihmdWxsX2RlY2spLAogICAgfQoKICAgIGlmIHdpbl9yYXRlIGlzIG5vdCBOb25lOgogICAgICAgIGN0eFsid2luX3JhdGUiXSA9IHdpbl9yYXRlCgogICAgIyDilIDilIAgRGVjayBDb21wb3NpdGlvbiBTdW1tYXJ5IChFbmhhbmNlbWVudCAjMSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICB0eXBlX2NvdW50czogZGljdFtzdHIsIGludF0gPSB7fQogICAgcm9sZXM6IGRpY3Rbc3RyLCBsaXN0W3N0cl1dID0geyJyZW1vdmFsIjogW10sICJyYW1wIjogW10sICJib2FyZF93aXBlIjogW10sICJkcmF3IjogW119CiAgICBrZXlfY2FyZHM6IGxpc3Rbc3RyXSA9IFtdCiAgICBjb21ib19waWVjZXM6IGxpc3RbZGljdF0gPSBbXQogICAgdG90YWxfY21jID0gMAogICAgbm9uX2xhbmRfY291bnQgPSAwCgogICAgZm9yIGNhcmQgaW4gZnVsbF9kZWNrOgogICAgICAgIGN0eXBlID0gX3Nob3J0X3R5cGUoY2FyZC50eXBlX2xpbmUpIGlmIGNhcmQudHlwZV9saW5lIGVsc2UgIj8iCiAgICAgICAgdHlwZV9jb3VudHNbY3R5cGVdID0gdHlwZV9jb3VudHMuZ2V0KGN0eXBlLCAwKSArIDEKCiAgICAgICAgaWYgbm90IGNhcmQuaXNfbGFuZCgpOgogICAgICAgICAgICB0b3RhbF9jbWMgKz0gY2FyZC5jbWMgb3IgMAogICAgICAgICAgICBub25fbGFuZF9jb3VudCArPSAxCgogICAgICAgICMgVHJhY2sgcm9sZXMKICAgICAgICBpZiBjYXJkLmlzX3JlbW92YWw6CiAgICAgICAgICAgIHJvbGVzWyJyZW1vdmFsIl0uYXBwZW5kKGNhcmQubmFtZSkKICAgICAgICBpZiBjYXJkLmlzX2JvYXJkX3dpcGU6CiAgICAgICAgICAgIHJvbGVzWyJib2FyZF93aXBlIl0uYXBwZW5kKGNhcmQubmFtZSkKICAgICAgICBpZiBjYXJkLmlzX3JhbXA6CiAgICAgICAgICAgIHJvbGVzWyJyYW1wIl0uYXBwZW5kKGNhcmQubmFtZSkKICAgICAgICAjIERldGVjdCBkcmF3IGVuZ2luZXMKICAgICAgICBvcmFjbGUgPSAoY2FyZC5vcmFjbGVfdGV4dCBvciAiIikubG93ZXIoKQogICAgICAgIGlmIHJlLnNlYXJjaChyImRyYXcgLiogY2FyZHM/Iiwgb3JhY2xlKToKICAgICAgICAgICAgcm9sZXNbImRyYXciXS5hcHBlbmQoY2FyZC5uYW1lKQoKICAgICAgICAjIOKUgOKUgCBXaW4gQ29uZGl0aW9ucyAmIENvbWJvcyAoRW5oYW5jZW1lbnQgIzMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGZvciBwYXR0ZXJuLCBsYWJlbCBpbiBfQ09NQk9fUEFUVEVSTlM6CiAgICAgICAgICAgIGlmIHJlLnNlYXJjaChwYXR0ZXJuLCBvcmFjbGUpOgogICAgICAgICAgICAgICAgY29tYm9fcGllY2VzLmFwcGVuZCh7Im5hbWUiOiBjYXJkLm5hbWUsICJyb2xlIjogbGFiZWx9KQogICAgICAgICAgICAgICAga2V5X2NhcmRzLmFwcGVuZChjYXJkLm5hbWUpCiAgICAgICAgICAgICAgICBicmVhayAgIyBvbmUgbGFiZWwgcGVyIGNhcmQKCiAgICBhdmdfY21jID0gcm91bmQodG90YWxfY21jIC8gbWF4KG5vbl9sYW5kX2NvdW50LCAxKSwgMSkKCiAgICBjdHhbImRlY2tfc3VtbWFyeSJdID0gewogICAgICAgICJjYXJkX3R5cGVzIjogdHlwZV9jb3VudHMsCiAgICAgICAgImF2Z19jbWMiOiBhdmdfY21jLAogICAgICAgICJyZW1vdmFsX2NvdW50IjogbGVuKHJvbGVzWyJyZW1vdmFsIl0pLAogICAgICAgICJyYW1wX2NvdW50IjogbGVuKHJvbGVzWyJyYW1wIl0pLAogICAgICAgICJib2FyZF93aXBlX2NvdW50IjogbGVuKHJvbGVzWyJib2FyZF93aXBlIl0pLAogICAgICAgICJkcmF3X2NvdW50IjogbGVuKHJvbGVzWyJkcmF3Il0pLAogICAgICAgICJhcmNoZXR5cGUiOiBhcmNoZXR5cGUsCiAgICB9CgogICAgY3R4WyJjb21ib19waWVjZXMiXSA9IGNvbWJvX3BpZWNlc1s6MTVdICAjIGNhcCB0byBzYXZlIHRva2VucwogICAgY3R4WyJrZXlfY2FyZHMiXSA9IGxpc3Qoc2V0KGtleV9jYXJkcykpWzoxNV0KCiAgICByZXR1cm4gY3R4CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBBY3Rpb24gU2NoZW1hICAoU3RlcCAzKQojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKIyBWYWxpZCBhY3Rpb25zIHRoZSBMTE0gY2FuIHJldHVybgpWQUxJRF9BQ1RJT05TID0gWwogICAgInBsYXlfbGFuZCIsICAgICAgICMgUGxheSBhIGxhbmQgZnJvbSBoYW5kCiAgICAiY2FzdF9jcmVhdHVyZSIsICAgIyBDYXN0IGEgY3JlYXR1cmUgc3BlbGwKICAgICJjYXN0X3JlbW92YWwiLCAgICAjIENhc3QgdGFyZ2V0ZWQgcmVtb3ZhbAogICAgImNhc3RfYm9hcmRfd2lwZSIsICMgQ2FzdCBhIGJvYXJkIHdpcGUKICAgICJjYXN0X3JhbXAiLCAgICAgICAjIENhc3QgYSByYW1wIHNwZWxsCiAgICAiY2FzdF9zcGVsbCIsICAgICAgIyBDYXN0IGFueSBvdGhlciBub24tY3JlYXR1cmUgc3BlbGwKICAgICJhdHRhY2tfYWxsIiwgICAgICAjIEF0dGFjayB3aXRoIGFsbCBlbGlnaWJsZSBjcmVhdHVyZXMKICAgICJhdHRhY2tfc2FmZSIsICAgICAjIEF0dGFjayBvbmx5IHdpdGggZXZhc2l2ZS9sYXJnZSBjcmVhdHVyZXMKICAgICJob2xkIiwgICAgICAgICAgICAjIFBhc3MgLyBkb24ndCBhY3QgKHNhdmUgbWFuYSwgYmx1ZmYpCl0KCiMgQWN0aW9uIHNjaGVtYSBmb3IgdGhlIExMTSdzIEpTT04gcmVzcG9uc2UKQUNUSU9OX1NDSEVNQSA9IHsKICAgICJhY3Rpb24iOiAib25lIG9mOiAiICsgIiwgIi5qb2luKFZBTElEX0FDVElPTlMpLAogICAgInRhcmdldF9jYXJkIjogIihvcHRpb25hbCkgbmFtZSBvZiBjYXJkIHRvIGNhc3Qgb3IgdGFyZ2V0IiwKICAgICJyZWFzb25pbmciOiAiKGJyaWVmKSB3aHkgdGhpcyBhY3Rpb24iLAp9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBTeXN0ZW0gLyBVc2VyIFByb21wdHMgIChTdGVwIDMpCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpTWVNURU1fUFJPTVBUID0gIiIiWW91IGFyZSBhbiBleHBlcnQgTWFnaWM6IFRoZSBHYXRoZXJpbmcgQ29tbWFuZGVyIHBsYXllci4KWW91ciBnb2FsIGlzIHRvIFdJTiBieSByZWR1Y2luZyB5b3VyIG9wcG9uZW50J3MgbGlmZSB0byAwLgoKR0FNRSBSVUxFUzoKLSAxIGxhbmQgZHJvcCBwZXIgdHVybi4gQ2FzdCBzcGVsbHMgdXAgdG8gYXZhaWxhYmxlIG1hbmEuCi0gQ3JlYXR1cmVzIGhhdmUgc3VtbW9uaW5nIHNpY2tuZXNzIChjYW4ndCBhdHRhY2sgdGhlIHR1cm4gdGhleSBlbnRlciB1bmxlc3MgdGhleSBoYXZlIGhhc3RlKS4KLSBDb21tYW5kZXIgY2FuIGJlIHJlY2FzdCBmcm9tIGNvbW1hbmQgem9uZSB3aXRoICsyIG1hbmEgdGF4IGVhY2ggdGltZS4KClJFU1BPTlNFIEZPUk1BVCDigJQgcmVzcG9uZCB3aXRoIE9OTFkgdGhpcyBKU09OLCBub3RoaW5nIGVsc2U6CnsiYWN0aW9uIjogIjxhY3Rpb25fbmFtZT4iLCAidGFyZ2V0X2NhcmQiOiAiPGNhcmQgbmFtZT4iLCAicmVhc29uaW5nIjogIjwxIHNlbnRlbmNlPiJ9CgpWQUxJRCBBQ1RJT05TOgotIHBsYXlfbGFuZCDigJQgcGxheSBhIGxhbmQgZnJvbSBoYW5kIChhbHdheXMgZG8gdGhpcyBmaXJzdCkKLSBjYXN0X2NyZWF0dXJlIOKAlCBjYXN0IGEgY3JlYXR1cmUgc3BlbGwKLSBjYXN0X3JlbW92YWwg4oCUIHVzZSByZW1vdmFsIG9uIG9wcG9uZW50J3MgYmVzdCB0aHJlYXQKLSBjYXN0X2JvYXJkX3dpcGUg4oCUIHdpcGUgdGhlIGJvYXJkICh3aGVuIGJlaGluZCBvbiBjcmVhdHVyZXMpCi0gY2FzdF9yYW1wIOKAlCBjYXN0IG1hbmEgcmFtcCB0byBhY2NlbGVyYXRlCi0gY2FzdF9zcGVsbCDigJQgY2FzdCBhbnkgb3RoZXIgc3BlbGwgKGVuY2hhbnRtZW50LCBhcnRpZmFjdCwgZXRjLikKLSBhdHRhY2tfYWxsIOKAlCBhdHRhY2sgd2l0aCBhbGwgdW50YXBwZWQgY3JlYXR1cmVzCi0g' +
'YXR0YWNrX3NhZmUg4oCUIGF0dGFjayBvbmx5IHdpdGggZXZhc2l2ZS9sYXJnZSBjcmVhdHVyZXMgKGZseWluZywgdHJhbXBsZSwgcG93ZXI+PTQpCi0gaG9sZCDigJQgcGFzcy9zYXZlIG1hbmEgKGJsdWZmIG9yIHNhdmUgZm9yIG5leHQgdHVybikKCkdBTUUgU1RBVEUgREFUQSBZT1UgUkVDRUlWRToKWW91IGdldCBhIEpTT04gc25hcHNob3QgZWFjaCB0dXJuLiBLZXkgZmllbGRzOgotIG15X2hhbmQ6IGNhcmRzIGluIGhhbmQgd2l0aCBuYW1lLCB0eXBlLCBjbWMsIG9yYWNsZSB0ZXh0LCByb2xlcyAocmVtb3ZhbC9yYW1wL2JvYXJkX3dpcGUvY29tbWFuZGVyKSwgYW5kICJjYXN0YWJsZSIgZmxhZwotIG15X2JvYXJkIC8gb3BwX2JvYXJkOiBub24tbGFuZCBwZXJtYW5lbnRzIG9uIGVhY2ggc2lkZQotIG15X21hbmFfdG90YWwgLyBteV9tYW5hX2J5X2NvbG9yOiBhdmFpbGFibGUgbWFuYSBhbmQgY29sb3IgYnJlYWtkb3duIChXL1UvQi9SL0cvQykKLSBvcHBfdGhyZWF0OiB7bGV2ZWw6IE5PTkUvTE9XL01PREVSQVRFL0hJR0gvTEVUSEFMLCB0b3RhbF9wb3dlciwgZXZhc2l2ZV9jcmVhdHVyZXMsIHByb3RlY3RlZF9jcmVhdHVyZXN9Ci0gbXlfZ3JhdmV5YXJkIC8gb3BwX2dyYXZleWFyZDogY2FyZHMgaW4gZ3JhdmV5YXJkcyAoY2hlY2sgZm9yIHJlY3Vyc2lvbiB0YXJnZXRzKQotIGRlY2tfZHJhd25fcGN0OiBwZXJjZW50YWdlIG9mIGRlY2sgeW91J3ZlIGRyYXduCi0gY29tbWFuZGVyOiB7bmFtZSwgem9uZSAoaGFuZC9iYXR0bGVmaWVsZC9ncmF2ZXlhcmQvbGlicmFyeSksIGNvbG9yX2lkZW50aXR5fQotIGRlY2tfc3VtbWFyeToge2NhcmRfdHlwZXMsIGF2Z19jbWMsIHJlbW92YWxfY291bnQsIHJhbXBfY291bnQsIGJvYXJkX3dpcGVfY291bnQsIGRyYXdfY291bnQsIGFyY2hldHlwZX0KLSBjb21ib19waWVjZXM6IGRldGVjdGVkIHN5bmVyZ3kvY29tYm8gY2FyZHMgaW4gdGhlIGRlY2sKLSBrZXlfY2FyZHNfaW5fbGlicmFyeTogaW1wb3J0YW50IGNhcmRzIHN0aWxsIGluIHlvdXIgbGlicmFyeQotIGhpc3RvcmljYWxfd2luX3JhdGU6IGhvdyB0aGlzIGRlY2sgaGFzIHBlcmZvcm1lZCBpbiBwYXN0IGdhbWVzCgpBUkNIRVRZUEUgU1RSQVRFR0lFUzoKCkFHR1JPOgotIEN1cnZlIG91dCBmYXN0OiBjYXN0IGNyZWF0dXJlcyB0dXJucyAxLTMsIGF0dGFjayByZWxlbnRsZXNzbHkgZnJvbSB0dXJuIDMrCi0gT25seSB1c2UgcmVtb3ZhbCBvbiBibG9ja2VycyB0aGF0IHN0b3AgeW91ciBkYW1hZ2UuIERvbid0IGhvbGQgYmFjay4KLSBQcmlvcml0aXplIGF0dGFja19hbGwgdW5sZXNzIG9wcG9uZW50IGhhcyBkZWF0aHRvdWNoIGJsb2NrZXJzCi0gSWYgYm9hcmQgc3RhbGxzLCB1c2UgZXZhc2lvbiAoZmx5aW5nL3RyYW1wbGUpIHRvIHB1c2ggdGhyb3VnaAoKTUlEUkFOR0U6Ci0gUmFtcCB0dXJucyAxLTMsIHRoZW4gcGxheSB2YWx1ZSBjcmVhdHVyZXMgYW5kIHJlbW92YWwKLSBCYWxhbmNlIHRocmVhdHMgYW5kIGFuc3dlcnMuIFJlbW92ZSBvcHBvbmVudCdzIGJlc3QgY3JlYXR1cmUgYmVmb3JlIGF0dGFja2luZy4KLSBVc2UgYm9hcmQgd2lwZSB3aGVuIGJlaGluZCBieSAzKyBjcmVhdHVyZXMuIEhvbGQgaWYgYWhlYWQgYW5kIG5vIGdvb2QgcGxheXMuCi0gQ2FzdCBjb21tYW5kZXIgd2hlbiB5b3UgaGF2ZSBtYW5hIHRvIHByb3RlY3Qgb3IgYmVuZWZpdCBmcm9tIGl0CgpDT05UUk9MOgotIFByaW9yaXRpemUgcmFtcCBhbmQgZHJhdyBlYXJseS4gSG9sZCByZW1vdmFsIGZvciByZWFsIHRocmVhdHMuCi0gRG9uJ3Qgb3ZlcmNvbW1pdCBjcmVhdHVyZXMg4oCUIHBsYXkgMS0yIHRocmVhdHMgYW5kIHByb3RlY3QgdGhlbQotIEJvYXJkIHdpcGUgYWdncmVzc2l2ZWx5IHdoZW4gb3Bwb25lbnQgZ29lcyB3aWRlLiBIb2xkIG1hbmEgZm9yIGluc3RhbnQtc3BlZWQgcmVtb3ZhbC4KLSBXaW4gdGhyb3VnaCBjYXJkIGFkdmFudGFnZSBhbmQgaW5ldml0YWJpbGl0eSwgbm90IGVhcmx5IGFnZ3Jlc3Npb24KCkNPTUJPOgotIFByaW9yaXRpemUgZHJhdyBzcGVsbHMgYW5kIHR1dG9ycyB0byBmaW5kIGNvbWJvIHBpZWNlcwotIFBsYXkgcmFtcCB0byByZWFjaCBjb21ibyBtYW5hIHRocmVzaG9sZCBBU0FQCi0gUHJvdGVjdCBjb21ibyBwaWVjZXMg4oCUIGRvbid0IGV4cG9zZSB0aGVtIHRvIHJlbW92YWwgdW5uZWNlc3NhcmlseQotIElmIGNvbWJvIHBpZWNlcyBhcmUgaW4ga2V5X2NhcmRzX2luX2xpYnJhcnksIHByaW9yaXRpemUgZHJhdyBlZmZlY3RzCi0gVXNlIGF0' +
'dGFja19zYWZlIG9yIGhvbGQgdG8gYnV5IHRpbWU7IGRvbid0IHJhY2Ugd2l0aCBjcmVhdHVyZXMKCkRFQ0lTSU9OIFBSSU9SSVRJRVM6CjEuIElmIHlvdSBoYXZlIGxldGhhbCAoeW91ciB0b3RhbCBwb3dlciA+PSBvcHBfbGlmZSBhbmQgb3BwIGhhcyBmZXcgYmxvY2tlcnMpIOKGkiBhdHRhY2tfYWxsCjIuIElmIG9wcF90aHJlYXQubGV2ZWwgaXMgTEVUSEFMIOKGkiBjYXN0IHJlbW92YWwgb3IgYm9hcmQgd2lwZSBpbW1lZGlhdGVseQozLiBJZiB0dXJuIDw9IDMgYW5kIHlvdSBoYXZlIHJhbXAgaW4gaGFuZCDihpIgY2FzdF9yYW1wCjQuIElmIHlvdXIgY29tbWFuZGVyIGlzIGluIGhhbmQgYW5kIGNhc3RhYmxlLCBhbmQgaXQgZW5hYmxlcyB5b3VyIHN0cmF0ZWd5IOKGkiBjYXN0X2NyZWF0dXJlIHdpdGggY29tbWFuZGVyCjUuIEZvbGxvdyB5b3VyIGFyY2hldHlwZSBzdHJhdGVneSBhYm92ZQo2LiBBbHdheXMgcGxheSBhIGxhbmQgZmlyc3QgaWYgeW91IGhhdmUgb25lCjcuIENhc3QgdGhlIGhpZ2hlc3QtaW1wYWN0IHNwZWxsIHlvdSBjYW4gYWZmb3JkIChjaGVjayBjYXN0YWJsZSBmbGFnKQo4LiBXaGVuIG5vdGhpbmcgaW1wYWN0ZnVsIGlzIGNhc3RhYmxlLCBob2xkIHRvIHNhdmUgbWFuYSBmb3IgZnV0dXJlIHR1cm5zIiIiCgpVU0VSX1BST01QVF9URU1QTEFURSA9ICIiIkN1cnJlbnQgZ2FtZSBzdGF0ZToKe2dhbWVfc3RhdGVfanNvbn0KCldoYXQgaXMgeW91ciBhY3Rpb24/IFJlc3BvbmQgd2l0aCBPTkxZIHZhbGlkIEpTT04uIiIiCgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBMTE0gQ2xpZW50CiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpjbGFzcyBEZWVwU2Vla0JyYWluOgogICAgIiIiCiAgICBMTE0tcG93ZXJlZCBkZWNpc2lvbiBlbmdpbmUgZm9yIHRoZSBBSSBvcHBvbmVudC4KCiAgICBTZW5kcyBnYW1lIHN0YXRlIHRvIGEgbG9jYWwgRGVlcFNlZWsgbW9kZWwgYW5kIHBhcnNlcyB0aGUgYWN0aW9uIHJlc3BvbnNlLgogICAgRmFsbHMgYmFjayB0byBoZXVyaXN0aWMgb24gdGltZW91dC9lcnJvci4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWc6IERlZXBTZWVrQ29uZmlnIHwgTm9uZSA9IE5vbmUpOgogICAgICAgIHNlbGYuY29uZmlnID0gY29uZmlnIG9yIERlZXBTZWVrQ29uZmlnKCkKICAgICAgICBzZWxmLl9jYWNoZTogT3JkZXJlZERpY3Rbc3RyLCBkaWN0XSA9IE9yZGVyZWREaWN0KCkKICAgICAgICBzZWxmLl9kZWNpc2lvbl9sb2c6IGxpc3RbZGljdF0gPSBbXQogICAgICAgIHNlbGYuX3RvdGFsX2NhbGxzID0gMAogICAgICAgIHNlbGYuX3RvdGFsX2ZhbGxiYWNrcyA9IDAKICAgICAgICBzZWxmLl90b3RhbF9jYWNoZV9oaXRzID0gMAogICAgICAgIHNlbGYuX3RvdGFsX2xhdGVuY3lfbXMgPSAwLjAKICAgICAgICBzZWxmLl9jb25uZWN0ZWQgPSBGYWxzZQogICAgICAgIHNlbGYuX2xvZ19maWxlID0gTm9uZQoKICAgIGRlZiBjaGVja19jb25uZWN0aW9uKHNlbGYpIC0+IGJvb2w6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgTExNIGVuZHBvaW50IGlzIHJlYWNoYWJsZS4iIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVybCA9IHNlbGYuY29uZmlnLmFwaV9iYXNlLnJzdHJpcCgiLyIpICsgIi92MS9tb2RlbHMiCiAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBtZXRob2Q9IkdFVCIpCiAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vanNvbiIpCiAgICAgICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9MykgYXMgcmVzcDoKICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQogICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgbW9kZWxzID0gZGF0YS5nZXQoImRhdGEiLCBbXSkK' +
'ICAgICAgICAgICAgICAgIGlmIG1vZGVsczoKICAgICAgICAgICAgICAgICAgICAjIEF1dG8tZGV0ZWN0IG1vZGVsIG5hbWUgZnJvbSBMTSBTdHVkaW8KICAgICAgICAgICAgICAgICAgICBtb2RlbF9pZCA9IG1vZGVsc1swXS5nZXQoImlkIiwgc2VsZi5jb25maWcubW9kZWwpCiAgICAgICAgICAgICAgICAgICAgaWYgbW9kZWxfaWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLm1vZGVsID0gbW9kZWxfaWQKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkF1dG8tZGV0ZWN0ZWQgbW9kZWw6ICVzIiwgbW9kZWxfaWQpCiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiRGVlcFNlZWsgYnJhaW4gY29ubmVjdGVkIHRvICVzIiwgc2VsZi5jb25maWcuYXBpX2Jhc2UpCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkRlZXBTZWVrIGJyYWluIGNvbm5lY3Rpb24gZmFpbGVkOiAlcyIsIGUpCiAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBjaG9vc2VfYWN0aW9uKAogICAgICAgIHNlbGYsCiAgICAgICAgc2ltX3N0YXRlLCAgICAgICAgICAjIFNpbVN0YXRlCiAgICAgICAgcGxheWVyX2luZGV4OiBpbnQsICAjIFdoaWNoIHBsYXllciBpcyB0aGUgQUkKICAgICAgICB0dXJuOiBpbnQsCiAgICAgICAgYXZhaWxhYmxlX21hbmE6IGludCB8IE5vbmUgPSBOb25lLAogICAgICAgIGRlY2tfY29udGV4dDogZGljdCB8IE5vbmUgPSBOb25lLCAgIyBGdWxsIGRlY2sgaW50ZWxsaWdlbmNlIGZyb20gYnVpbGRfZGVja19jb250ZXh0KCkKICAgICkgLT4gZGljdDoKICAgICAgICAiIiIKICAgICAgICBDaG9vc2UgYW4gYWN0aW9uIGZvciB0aGUgQUkgcGxheWVyLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiYWN0aW9uIjogc3RyLCAgICAgICAgICAjIE9uZSBvZiBWQUxJRF9BQ1RJT05TCiAgICAgICAgICAgICAgICAidGFyZ2V0X2NhcmQiOiBzdHIsICAgICAjIE9wdGlvbmFsIGNhcmQgbmFtZQogICAgICAgICAgICAgICAgInJlYXNvbmluZyI6IHN0ciwgICAgICAgIyBCcmllZiBleHBsYW5hdGlvbgogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJkZWVwc2VlayIgfCAiaGV1cmlzdGljIiB8ICJjYWNoZSIsCiAgICAgICAgICAgICAgICAibGF0ZW5jeV9tcyI6IGZsb2F0LAogICAgICAgICAgICB9CiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fdG90YWxfY2FsbHMgKz0gMQogICAgICAgIHRfc3RhcnQgPSB0aW1lLnRpbWUoKQoKICAgICAgICAjIEJ1aWxkIGdhbWUgc3RhdGUgc25hcHNob3Qgd2l0aCBkZWNrIGludGVsbGlnZW5jZQogICAgICAgIHNuYXBzaG90ID0gYnVpbGRfZ2FtZV9zdGF0ZV9zbmFwc2hvdChzaW1fc3RhdGUsIHBsYXllcl9pbmRleCwgdHVybiwgZGVja19jb250ZXh0PWRlY2tfY29udGV4dCkKICAgICAgICBpZiBhdmFpbGFibGVfbWFuYSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc25hcHNob3RbIm15X21hbmFfYXZhaWxhYmxlIl0gPSBhdmFpbGFibGVfbWFuYQoKICAgICAgICAjIENoZWNrIGNhY2hlCiAgICAgICAgaWYgc2VsZi5jb25maWcuY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgY2FjaGVfa2V5ID0gc2VsZi5fY2FjaGVfa2V5KHNuYXBzaG90KQogICAgICAgICAgICBpZiBjYWNoZV9rZXkgaW4gc2VsZi5fY2FjaGU6CiAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9jYWNoZV9oaXRzICs9IDEKICAgICAgICAgICAgICAgIGNhY2hlZCA9IHNlbGYuX2NhY2hlW2NhY2hlX2tleV0uY29weSgpCiAgICAgICAgICAgICAgICBjYWNoZWRbInNvdXJjZSJdID0gImNhY2hlIgogICAgICAgICAgICAgICAgY2FjaGVkWyJsYXRlbmN5X21zIl0gPSByb3VuZCgodGltZS50aW1lKCkgLSB0X3N0YXJ0KSAqIDEwMDAsIDEpCiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkCgogICAgICAgICMgVHJ5IExMTQogICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0ZWQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFja19hY3Rpb24oc25hcHNob3QsIHRfc3RhcnQsICJub3RfY29ubmVjdGVkIikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jYWxsX2xsbShzbmFwc2hvdCkKICAgICAgICAgICAgcmVzdWx0WyJzb3VyY2UiXSA9ICJkZWVwc2VlayIKICAgICAg' +
'ICAgICAgcmVzdWx0WyJsYXRlbmN5X21zIl0gPSByb3VuZCgodGltZS50aW1lKCkgLSB0X3N0YXJ0KSAqIDEwMDAsIDEpCgogICAgICAgICAgICAjIENhY2hlIHRoZSByZXN1bHQKICAgICAgICAgICAgaWYgc2VsZi5jb25maWcuY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgICAgIHNlbGYuX3B1dF9jYWNoZShjYWNoZV9rZXksIHJlc3VsdCkKCiAgICAgICAgICAgICMgTG9nIGRlY2lzaW9uCiAgICAgICAgICAgIGlmIHNlbGYuY29uZmlnLmxvZ19kZWNpc2lvbnM6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfZGVjaXNpb24oc25hcHNob3QsIHJlc3VsdCkKCiAgICAgICAgICAgIHNlbGYuX3RvdGFsX2xhdGVuY3lfbXMgKz0gcmVzdWx0WyJsYXRlbmN5X21zIl0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJEZWVwU2VlayBjYWxsIGZhaWxlZCAodHVybiAlZCk6ICVzIiwgdHVybiArIDEsIGUpCiAgICAgICAgICAgIGlmIHNlbGYuY29uZmlnLmZhbGxiYWNrX29uX3RpbWVvdXQ6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFsbGJhY2tfYWN0aW9uKHNuYXBzaG90LCB0X3N0YXJ0LCBzdHIoZSkpCiAgICAgICAgICAgIHJhaXNlCgogICAgZGVmIF9jYWxsX2xsbShzZWxmLCBzbmFwc2hvdDogZGljdCkgLT4gZGljdDoKICAgICAgICAiIiJTZW5kIGdhbWUgc3RhdGUgdG8gTExNIGFuZCBwYXJzZSByZXNwb25zZS4iIiIKICAgICAgICAjIEJ1aWxkIHRoZSBwcm9tcHQKICAgICAgICBnYW1lX3N0YXRlX2pzb24gPSBqc29uLmR1bXBzKHNuYXBzaG90LCBpbmRlbnQ9MikKICAgICAgICB1c2VyX3Byb21wdCA9IFVTRVJfUFJPTVBUX1RFTVBMQVRFLmZvcm1hdChnYW1lX3N0YXRlX2pzb249Z2FtZV9zdGF0ZV9qc29uKQoKICAgICAgICAjIEJ1aWxkIE9wZW5BSS1jb21wYXRpYmxlIHJlcXVlc3QKICAgICAgICBwYXlsb2FkID0gewogICAgICAgICAgICAibW9kZWwiOiBzZWxmLmNvbmZpZy5tb2RlbCwKICAgICAgICAgICAgIm1lc3NhZ2VzIjogWwogICAgICAgICAgICAgICAgeyJyb2xlIjogInN5c3RlbSIsICJjb250ZW50IjogU1lTVEVNX1BST01QVH0sCiAgICAgICAgICAgICAgICB7InJvbGUiOiAidXNlciIsICJjb250ZW50IjogdXNlcl9wcm9tcHR9LAogICAgICAgICAgICBdLAogICAgICAgICAgICAidGVtcGVyYXR1cmUiOiBzZWxmLmNvbmZpZy50ZW1wZXJhdHVyZSwKICAgICAgICAgICAgIm1heF90b2tlbnMiOiBzZWxmLmNvbmZpZy5tYXhfdG9rZW5zLAogICAgICAgICAgICAidG9wX3AiOiBzZWxmLmNvbmZpZy50b3BfcCwKICAgICAgICAgICAgInN0cmVhbSI6IEZhbHNlLAogICAgICAgIH0KCiAgICAgICAgdXJsID0gc2VsZi5jb25maWcuYXBpX2Jhc2UucnN0cmlwKCIvIikgKyAiL3YxL2NoYXQvY29tcGxldGlvbnMiCiAgICAgICAgcmVxX2RhdGEgPSBqc29uLmR1bXBzKHBheWxvYWQpLmVuY29kZSgidXRmLTgiKQogICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBkYXRhPXJlcV9kYXRhLCBtZXRob2Q9IlBPU1QiKQogICAgICAgIHJlcS5hZGRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vanNvbiIpCgogICAgICAgIHdpdGggdXJsb3BlbihyZXEsIHRpbWVvdXQ9c2VsZi5jb25maWcucmVxdWVzdF90aW1lb3V0KSBhcyByZXNwOgogICAgICAgICAgICByZXNwX2RhdGEgPSBqc29uLmxvYWRzKHJlc3AucmVhZCgpKQoKICAgICAgICAjIEV4dHJhY3QgdGhlIHJlc3BvbnNlIHRleHQKICAgICAgICBjaG9pY2VzID0gcmVzcF9kYXRhLmdldCgiY2hvaWNlcyIsIFtdKQogICAgICAgIGlmIG5vdCBjaG9pY2VzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbXB0eSByZXNwb25zZSBmcm9tIExMTSIpCgogICAgICAgIHJhd190ZXh0ID0gY2hvaWNlc1swXS5nZXQoIm1lc3NhZ2UiLCB7fSkuZ2V0KCJjb250ZW50IiwgIiIpCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2FjdGlvbihyYXdfdGV4dCkKCiAgICBkZWYgX3BhcnNlX2FjdGlvbihzZWxmLCByYXdfdGV4dDogc3RyKSAtPiBkaWN0OgogICAgICAgICIiIgogICAgICAgIFBhcnNlIHRoZSBMTE0ncyByZXNwb25zZSBpbnRvIGEgdmFsaWRhdGVkIGFjdGlvbiBkaWN0LgogICAgICAgIEhhbmRsZXMgY29tbW9uIExMTSBxdWlya3MgKG1hcmtkb3duIGZlbmNlcywgZXh0cmEgdGV4dCwgZXRjLikKICAgICAgICAiIiIKICAgICAgICB0ZXh0ID0gcmF3X3RleHQuc3Ry' +
'aXAoKQoKICAgICAgICAjIFN0cmlwIDx0aGluaz4uLi48L3RoaW5rPiB0YWdzIChEZWVwU2Vlay1SMSByZWFzb25pbmcpCiAgICAgICAgIyBIYW5kbGUgYm90aCBjbG9zZWQgdGFncyBhbmQgdW5jbG9zZWQgdGFncyAodHJ1bmNhdGVkIGJ5IG1heF90b2tlbnMpCiAgICAgICAgdGV4dCA9IHJlLnN1YihyJzx0aGluaz4uKj88L3RoaW5rPicsICcnLCB0ZXh0LCBmbGFncz1yZS5ET1RBTEwpLnN0cmlwKCkKICAgICAgICB0ZXh0ID0gcmUuc3ViKHInPHRoaW5rPi4qJywgJycsIHRleHQsIGZsYWdzPXJlLkRPVEFMTCkuc3RyaXAoKQoKICAgICAgICAjIFN0cmlwIG1hcmtkb3duIGNvZGUgZmVuY2VzCiAgICAgICAgdGV4dCA9IHJlLnN1YihyJ15gYGAoPzpqc29uKT9ccyonLCAnJywgdGV4dCkKICAgICAgICB0ZXh0ID0gcmUuc3ViKHInXHMqYGBgJCcsICcnLCB0ZXh0KQogICAgICAgIHRleHQgPSB0ZXh0LnN0cmlwKCkKCiAgICAgICAgIyBUcnkgdG8gZmluZCBhIEpTT04gb2JqZWN0IGluIHRoZSB0ZXh0CiAgICAgICAganNvbl9tYXRjaCA9IHJlLnNlYXJjaChyJ1x7W157fV0qXH0nLCB0ZXh0LCByZS5ET1RBTEwpCiAgICAgICAgaWYganNvbl9tYXRjaDoKICAgICAgICAgICAgdGV4dCA9IGpzb25fbWF0Y2guZ3JvdXAoMCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJzZWQgPSBqc29uLmxvYWRzKHRleHQpCiAgICAgICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVycm9yOgogICAgICAgICAgICAjIExhc3QgcmVzb3J0OiB0cnkgdG8gZXh0cmFjdCBhY3Rpb24ga2V5d29yZAogICAgICAgICAgICBmb3IgYWN0aW9uIGluIFZBTElEX0FDVElPTlM6CiAgICAgICAgICAgICAgICBpZiBhY3Rpb24gaW4gcmF3X3RleHQubG93ZXIoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAiYWN0aW9uIjogYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0X2NhcmQiOiAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlYXNvbmluZyI6ICJQYXJzZWQgZnJvbSBmcmVlZm9ybSByZXNwb25zZSIsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYiQ291bGQgbm90IHBhcnNlIExMTSByZXNwb25zZSBhcyBKU09OOiB7cmF3X3RleHRbOjIwMF19IikKCiAgICAgICAgIyBWYWxpZGF0ZSBhY3Rpb24KICAgICAgICBhY3Rpb24gPSBwYXJzZWQuZ2V0KCJhY3Rpb24iLCAiaG9sZCIpCiAgICAgICAgaWYgYWN0aW9uIG5vdCBpbiBWQUxJRF9BQ1RJT05TOgogICAgICAgICAgICAjIEZ1enp5IG1hdGNoCiAgICAgICAgICAgIGZvciB2YWxpZCBpbiBWQUxJRF9BQ1RJT05TOgogICAgICAgICAgICAgICAgaWYgdmFsaWQgaW4gYWN0aW9uLmxvd2VyKCkgb3IgYWN0aW9uLmxvd2VyKCkgaW4gdmFsaWQ6CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdmFsaWQKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYWN0aW9uID0gImhvbGQiICAjIHNhZmUgZGVmYXVsdAoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAiYWN0aW9uIjogYWN0aW9uLAogICAgICAgICAgICAidGFyZ2V0X2NhcmQiOiBwYXJzZWQuZ2V0KCJ0YXJnZXRfY2FyZCIsIHBhcnNlZC5nZXQoImNhcmQiLCAiIikpLAogICAgICAgICAgICAicmVhc29uaW5nIjogcGFyc2VkLmdldCgicmVhc29uaW5nIiwgcGFyc2VkLmdldCgicmVhc29uIiwgIiIpKSwKICAgICAgICB9CgogICAgZGVmIF9mYWxsYmFja19hY3Rpb24oc2VsZiwgc25hcHNob3Q6IGRpY3QsIHRfc3RhcnQ6IGZsb2F0LCByZWFzb246IHN0cikgLT4gZGljdDoKICAgICAgICAiIiJHZW5lcmF0ZSBhIGhldXJpc3RpYyBhY3Rpb24gd2hlbiBMTE0gaXMgdW5hdmFpbGFibGUuIiIiCiAgICAgICAgc2VsZi5fdG90YWxfZmFsbGJhY2tzICs9IDEKCiAgICAgICAgaGFuZCA9IHNuYXBzaG90LmdldCgibXlfaGFuZCIsIFtdKQogICAgICAgIG1hbmEgPSBzbmFwc2hvdC5nZXQoIm15X21hbmFfYXZhaWxhYmxlIiwgMCkKICAgICAgICBteV9ib2FyZCA9IHNuYXBzaG90LmdldCgibXlfYm9hcmQiLCBbXSkKICAgICAgICBvcHBfYm9hcmQgPSBzbmFwc2hvdC5nZXQoIm9wcF9ib2FyZCIsIFtdKQogICAgICAgIHR1cm4gPSBzbmFwc2hvdC5nZXQoInR1cm4iLCAxKQoKICAgICAgICAjIFByaW9yaXR5OiBsYW5kID4gcmFtcCAoZWFybHkpID4gcmVtb3ZhbCAoaWYgb3V0bnVtYmVyZWQpID4gY3JlYXR1' +
'cmUgPiBhdHRhY2sgPiBob2xkCiAgICAgICAgYWN0aW9uID0gImhvbGQiCiAgICAgICAgdGFyZ2V0ID0gIiIKICAgICAgICByZWFzb25pbmcgPSBmIkZhbGxiYWNrICh7cmVhc29ufSkiCgogICAgICAgICMgMS4gUGxheSBhIGxhbmQgaWYgYXZhaWxhYmxlCiAgICAgICAgbGFuZHNfaW5faGFuZCA9IFtjIGZvciBjIGluIGhhbmQgaWYgYy5nZXQoInR5cGUiKSA9PSAibGFuZCJdCiAgICAgICAgaWYgbGFuZHNfaW5faGFuZDoKICAgICAgICAgICAgYWN0aW9uID0gInBsYXlfbGFuZCIKICAgICAgICAgICAgdGFyZ2V0ID0gbGFuZHNfaW5faGFuZFswXVsibmFtZSJdCiAgICAgICAgICAgIHJlYXNvbmluZyA9ICJQbGF5IGxhbmQgZmlyc3QiCiAgICAgICAgIyAyLiBFYXJseSBnYW1lOiBwcmlvcml0aXplIHJhbXAKICAgICAgICBlbGlmIHR1cm4gPD0gNDoKICAgICAgICAgICAgcmFtcF9jYXJkcyA9IFtjIGZvciBjIGluIGhhbmQgaWYgYy5nZXQoInJvbGUiKSA9PSAicmFtcCIgYW5kIGMuZ2V0KCJjbWMiLCA5OSkgPD0gbWFuYV0KICAgICAgICAgICAgaWYgcmFtcF9jYXJkczoKICAgICAgICAgICAgICAgIHJhbXBfY2FyZHMuc29ydChrZXk9bGFtYmRhIGM6IGMuZ2V0KCJjbWMiLCAwKSkKICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJjYXN0X3JhbXAiCiAgICAgICAgICAgICAgICB0YXJnZXQgPSByYW1wX2NhcmRzWzBdWyJuYW1lIl0KICAgICAgICAgICAgICAgIHJlYXNvbmluZyA9ICJFYXJseSByYW1wIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBQbGF5IGNoZWFwZXN0IGNyZWF0dXJlCiAgICAgICAgICAgICAgICBjcmVhdHVyZXMgPSBbYyBmb3IgYyBpbiBoYW5kIGlmIGMuZ2V0KCJ0eXBlIikgPT0gImNyZWF0dXJlIiBhbmQgYy5nZXQoImNtYyIsIDk5KSA8PSBtYW5hXQogICAgICAgICAgICAgICAgaWYgY3JlYXR1cmVzOgogICAgICAgICAgICAgICAgICAgIGNyZWF0dXJlcy5zb3J0KGtleT1sYW1iZGEgYzogYy5nZXQoImNtYyIsIDApKQogICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9ICJjYXN0X2NyZWF0dXJlIgogICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGNyZWF0dXJlc1swXVsibmFtZSJdCiAgICAgICAgICAgICAgICAgICAgcmVhc29uaW5nID0gIkNoZWFwIGNyZWF0dXJlIGRldmVsb3BtZW50IgogICAgICAgICMgMy4gSWYgb3Bwb25lbnQgaGFzIG1hbnkgY3JlYXR1cmVzIGFuZCB3ZSBoYXZlIGJvYXJkIHdpcGUKICAgICAgICBlbGlmIGxlbihvcHBfYm9hcmQpID49IDMgYW5kIGxlbihteV9ib2FyZCkgPD0gMToKICAgICAgICAgICAgd2lwZXMgPSBbYyBmb3IgYyBpbiBoYW5kIGlmIGMuZ2V0KCJyb2xlIikgPT0gImJvYXJkX3dpcGUiIGFuZCBjLmdldCgiY21jIiwgOTkpIDw9IG1hbmFdCiAgICAgICAgICAgIGlmIHdpcGVzOgogICAgICAgICAgICAgICAgYWN0aW9uID0gImNhc3RfYm9hcmRfd2lwZSIKICAgICAgICAgICAgICAgIHRhcmdldCA9IHdpcGVzWzBdWyJuYW1lIl0KICAgICAgICAgICAgICAgIHJlYXNvbmluZyA9ICJPcHBvbmVudCBoYXMgYm9hcmQgYWR2YW50YWdlLCB3aXBpbmciCiAgICAgICAgIyA0LiBJZiBvcHBvbmVudCBoYXMgYSBiaWcgdGhyZWF0LCB1c2UgcmVtb3ZhbAogICAgICAgIGVsaWYgb3BwX2JvYXJkOgogICAgICAgICAgICByZW1vdmFsID0gW2MgZm9yIGMgaW4gaGFuZCBpZiBjLmdldCgicm9sZSIpID09ICJyZW1vdmFsIiBhbmQgYy5nZXQoImNtYyIsIDk5KSA8PSBtYW5hXQogICAgICAgICAgICBpZiByZW1vdmFsOgogICAgICAgICAgICAgICAgYWN0aW9uID0gImNhc3RfcmVtb3ZhbCIKICAgICAgICAgICAgICAgIHRhcmdldCA9IHJlbW92YWxbMF1bIm5hbWUiXQogICAgICAgICAgICAgICAgcmVhc29uaW5nID0gIlJlbW92ZSBvcHBvbmVudCB0aHJlYXQiCiAgICAgICAgIyA1LiBQbGF5IGJlc3QgY3JlYXR1cmUKICAgICAgICBpZiBhY3Rpb24gPT0gImhvbGQiOgogICAgICAgICAgICBjYXN0YWJsZSA9IFtjIGZvciBjIGluIGhhbmQgaWYgYy5nZXQoInR5cGUiKSA9PSAiY3JlYXR1cmUiIGFuZCBjLmdldCgiY21jIiwgOTkpIDw9IG1hbmFdCiAgICAgICAgICAgIGlmIGNhc3RhYmxlOgogICAgICAgICAgICAgICAgIyBQaWNrIHRoZSBvbmUgd2l0aCBoaWdoZXN0IHBvd2VyCiAgICAgICAgICAgICAgICBjYXN0YWJsZS5zb3J0KGtleT1sYW1iZGEgYzogLWludChjLmdldCgicHQiLCAiMC8wIikuc3BsaXQoIi8iKVswXSkgaWYgYy5nZXQoInB0IikgZWxzZSAwKQogICAgICAgICAgICAg' +
'ICAgYWN0aW9uID0gImNhc3RfY3JlYXR1cmUiCiAgICAgICAgICAgICAgICB0YXJnZXQgPSBjYXN0YWJsZVswXVsibmFtZSJdCiAgICAgICAgICAgICAgICByZWFzb25pbmcgPSAiUGxheSB0aHJlYXQiCgogICAgICAgICMgNi4gQXR0YWNrIGlmIHdlIGhhdmUgY3JlYXR1cmVzIG9uIGJvYXJkCiAgICAgICAgaWYgYWN0aW9uID09ICJob2xkIiBhbmQgbXlfYm9hcmQ6CiAgICAgICAgICAgIGNyZWF0dXJlc19vbl9ib2FyZCA9IFtjIGZvciBjIGluIG15X2JvYXJkIGlmIGMuZ2V0KCJ0eXBlIikgPT0gImNyZWF0dXJlIiBhbmQgbm90IGMuZ2V0KCJ0YXBwZWQiKV0KICAgICAgICAgICAgaWYgY3JlYXR1cmVzX29uX2JvYXJkOgogICAgICAgICAgICAgICAgYWN0aW9uID0gImF0dGFja19hbGwiCiAgICAgICAgICAgICAgICByZWFzb25pbmcgPSAiQXR0YWNrIHdpdGggYXZhaWxhYmxlIGNyZWF0dXJlcyIKCiAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAiYWN0aW9uIjogYWN0aW9uLAogICAgICAgICAgICAidGFyZ2V0X2NhcmQiOiB0YXJnZXQsCiAgICAgICAgICAgICJyZWFzb25pbmciOiByZWFzb25pbmcsCiAgICAgICAgICAgICJzb3VyY2UiOiAiaGV1cmlzdGljIiwKICAgICAgICAgICAgImxhdGVuY3lfbXMiOiByb3VuZCgodGltZS50aW1lKCkgLSB0X3N0YXJ0KSAqIDEwMDAsIDEpLAogICAgICAgIH0KCiAgICAgICAgaWYgc2VsZi5jb25maWcubG9nX2RlY2lzaW9uczoKICAgICAgICAgICAgc2VsZi5fbG9nX2RlY2lzaW9uKHNuYXBzaG90LCByZXN1bHQpCgogICAgICAgIHJldHVybiByZXN1bHQKCiAgICAjIOKUgOKUgCBDYWNoZSBoZWxwZXJzIOKUgOKUgAoKICAgIGRlZiBfY2FjaGVfa2V5KHNlbGYsIHNuYXBzaG90OiBkaWN0KSAtPiBzdHI6CiAgICAgICAgIiIiQ3JlYXRlIGEgZGV0ZXJtaW5pc3RpYyBjYWNoZSBrZXkgZnJvbSBnYW1lIHN0YXRlLiIiIgogICAgICAgICMgTm9ybWFsaXplIOKAlCBleGNsdWRlIHRoaW5ncyB0aGF0IGRvbid0IGFmZmVjdCBkZWNpc2lvbnMKICAgICAgICBrZXlfZGF0YSA9IGpzb24uZHVtcHMoc25hcHNob3QsIHNvcnRfa2V5cz1UcnVlKQogICAgICAgIHJldHVybiBoYXNobGliLm1kNShrZXlfZGF0YS5lbmNvZGUoKSkuaGV4ZGlnZXN0KCkKCiAgICBkZWYgX3B1dF9jYWNoZShzZWxmLCBrZXk6IHN0ciwgdmFsdWU6IGRpY3QpOgogICAgICAgICIiIkxSVSBjYWNoZSBpbnNlcnQuIiIiCiAgICAgICAgaWYga2V5IGluIHNlbGYuX2NhY2hlOgogICAgICAgICAgICBzZWxmLl9jYWNoZS5tb3ZlX3RvX2VuZChrZXkpCiAgICAgICAgc2VsZi5fY2FjaGVba2V5XSA9IHZhbHVlCiAgICAgICAgd2hpbGUgbGVuKHNlbGYuX2NhY2hlKSA+IHNlbGYuY29uZmlnLmNhY2hlX21heF9zaXplOgogICAgICAgICAgICBzZWxmLl9jYWNoZS5wb3BpdGVtKGxhc3Q9RmFsc2UpCgogICAgIyDilIDilIAgRGVjaXNpb24gbG9nZ2luZyDilIDilIAKCiAgICBkZWYgX2xvZ19kZWNpc2lvbihzZWxmLCBzbmFwc2hvdDogZGljdCwgcmVzdWx0OiBkaWN0KToKICAgICAgICAiIiJMb2cgZGVjaXNpb24gZm9yIGZ1dHVyZSB0cmFpbmluZyBkYXRhLiIiIgogICAgICAgIGVudHJ5ID0gewogICAgICAgICAgICAidGltZXN0YW1wIjogdGltZS50aW1lKCksCiAgICAgICAgICAgICJnYW1lX3N0YXRlIjogc25hcHNob3QsCiAgICAgICAgICAgICJkZWNpc2lvbiI6IHsKICAgICAgICAgICAgICAgICJhY3Rpb24iOiByZXN1bHQuZ2V0KCJhY3Rpb24iKSwKICAgICAgICAgICAgICAgICJ0YXJnZXRfY2FyZCI6IHJlc3VsdC5nZXQoInRhcmdldF9jYXJkIiksCiAgICAgICAgICAgICAgICAicmVhc29uaW5nIjogcmVzdWx0LmdldCgicmVhc29uaW5nIiksCiAgICAgICAgICAgICAgICAic291cmNlIjogcmVzdWx0LmdldCgic291cmNlIiksCiAgICAgICAgICAgICAgICAibGF0ZW5jeV9tcyI6IHJlc3VsdC5nZXQoImxhdGVuY3lfbXMiKSwKICAgICAgICAgICAgfSwKICAgICAgICB9CiAgICAgICAgc2VsZi5fZGVjaXNpb25fbG9nLmFwcGVuZChlbnRyeSkKCiAgICBkZWYgZmx1c2hfbG9nKHNlbGYsIGZpbGVwYXRoOiBzdHIgfCBOb25lID0gTm9uZSk6CiAgICAgICAgIiIiV3JpdGUgYWNjdW11bGF0ZWQgZGVjaXNpb24gbG9nIHRvIEpTT05MIGZpbGUuIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX2RlY2lzaW9uX2xvZzoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGZpbGVwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ19kaXIgPSBzZWxmLmNvbmZp' +
'Zy5sb2dfZGlyIG9yIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICIuLiIsICIuLiIsICIuLiIsICJsb2dzIiwgImRlY2lzaW9ucyIKICAgICAgICAgICAgKQogICAgICAgICAgICBvcy5tYWtlZGlycyhsb2dfZGlyLCBleGlzdF9vaz1UcnVlKQogICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIGxvZ19kaXIsCiAgICAgICAgICAgICAgICBmImRlY2lzaW9uc197aW50KHRpbWUudGltZSgpKX0uanNvbmwiCiAgICAgICAgICAgICkKCiAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAiYSIsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIGY6CiAgICAgICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLl9kZWNpc2lvbl9sb2c6CiAgICAgICAgICAgICAgICBmLndyaXRlKGpzb24uZHVtcHMoZW50cnkpICsgIlxuIikKCiAgICAgICAgY291bnQgPSBsZW4oc2VsZi5fZGVjaXNpb25fbG9nKQogICAgICAgIHNlbGYuX2RlY2lzaW9uX2xvZy5jbGVhcigpCiAgICAgICAgbG9nZ2VyLmluZm8oIkZsdXNoZWQgJWQgZGVjaXNpb25zIHRvICVzIiwgY291bnQsIGZpbGVwYXRoKQogICAgICAgIHJldHVybiBmaWxlcGF0aAoKICAgIGRlZiBnZXRfc3RhdHMoc2VsZikgLT4gZGljdDoKICAgICAgICAiIiJSZXR1cm4gcGVyZm9ybWFuY2Ugc3RhdGlzdGljcy4iIiIKICAgICAgICBhdmdfbGF0ZW5jeSA9ICgKICAgICAgICAgICAgc2VsZi5fdG90YWxfbGF0ZW5jeV9tcyAvIG1heChzZWxmLl90b3RhbF9jYWxscyAtIHNlbGYuX3RvdGFsX2ZhbGxiYWNrcyAtIHNlbGYuX3RvdGFsX2NhY2hlX2hpdHMsIDEpCiAgICAgICAgKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJ0b3RhbF9jYWxscyI6IHNlbGYuX3RvdGFsX2NhbGxzLAogICAgICAgICAgICAiY2FjaGVfaGl0cyI6IHNlbGYuX3RvdGFsX2NhY2hlX2hpdHMsCiAgICAgICAgICAgICJmYWxsYmFja3MiOiBzZWxmLl90b3RhbF9mYWxsYmFja3MsCiAgICAgICAgICAgICJsbG1fY2FsbHMiOiBzZWxmLl90b3RhbF9jYWxscyAtIHNlbGYuX3RvdGFsX2ZhbGxiYWNrcyAtIHNlbGYuX3RvdGFsX2NhY2hlX2hpdHMsCiAgICAgICAgICAgICJhdmdfbGF0ZW5jeV9tcyI6IHJvdW5kKGF2Z19sYXRlbmN5LCAxKSwKICAgICAgICAgICAgImNvbm5lY3RlZCI6IHNlbGYuX2Nvbm5lY3RlZCwKICAgICAgICAgICAgIm1vZGVsIjogc2VsZi5jb25maWcubW9kZWwsCiAgICAgICAgICAgICJhcGlfYmFzZSI6IHNlbGYuY29uZmlnLmFwaV9iYXNlLAogICAgICAgICAgICAicGVuZGluZ19sb2dfZW50cmllcyI6IGxlbihzZWxmLl9kZWNpc2lvbl9sb2cpLAogICAgICAgIH0K'
Install-B64 -R 'src\commander_ai_lab\sim\deepseek_brain.py' -B $b
# src/commander_ai_lab/sim/deepseek_engine.py (33,494 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIERlZXBTZWVrLUVuaGFuY2VkIEdhbWUgRW5naW5lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KRXh0ZW5kcyB0aGUgaGVhZGxlc3MgR2FtZUVuZ2luZSBzbyB0aGF0IG9uZSBwbGF5ZXIgKHRoZSBBSSBvcHBvbmVudCkKdXNlcyB0aGUgRGVlcFNlZWsgTExNIGJyYWluIGZvciBkZWNpc2lvbi1tYWtpbmcgaW5zdGVhZCBvZiB0aGUgc3RhdGljCmhldXJpc3RpYyBzY29yZXIuCgpUaGUgTExNIGRlY2lkZXM6CiAgMS4gV2hldGhlciB0byBwbGF5IGEgbGFuZCAoYW5kIHdoaWNoIG9uZSkKICAyLiBXaGljaCBzcGVsbChzKSB0byBjYXN0ICh1cCB0byAyIHBlciB0dXJuLCBzYW1lIGFzIGJhc2UgZW5naW5lKQogIDMuIENvbWJhdCBzdGFuY2U6IGF0dGFja19hbGwsIGF0dGFja19zYWZlLCBvciBob2xkCgpJZiB0aGUgTExNIGlzIHVucmVhY2hhYmxlIG9yIHRpbWVzIG91dCwgZmFsbHMgYmFjayB0byB0aGUgYmFzZS1lbmdpbmUKaGV1cmlzdGljIHRyYW5zcGFyZW50bHkuCgpVc2FnZTo6CgogICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5kZWVwc2Vla19lbmdpbmUgaW1wb3J0IERlZXBTZWVrR2FtZUVuZ2luZQogICAgZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5kZWVwc2Vla19icmFpbiBpbXBvcnQgRGVlcFNlZWtCcmFpbiwgRGVlcFNlZWtDb25maWcKCiAgICBicmFpbiA9IERlZXBTZWVrQnJhaW4oRGVlcFNlZWtDb25maWcoYXBpX2Jhc2U9Imh0dHA6Ly8xOTIuMTY4LjAuMTIyOjEyMzQiKSkKICAgIGJyYWluLmNoZWNrX2Nvbm5lY3Rpb24oKQogICAgZW5naW5lID0gRGVlcFNlZWtHYW1lRW5naW5lKGJyYWluPWJyYWluLCBhaV9wbGF5ZXJfaW5kZXg9MSkKICAgIHJlc3VsdCA9IGVuZ2luZS5ydW4oZGVja19hLCBkZWNrX2IsIG5hbWVfYT0iTXkgRGVjayIsIG5hbWVfYj0iRGVlcFNlZWsgQUkiKQoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBsb2dnaW5nCmltcG9ydCByYW5kb20KaW1wb3J0IHV1aWQKZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCgpmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZCwgR2FtZVJlc3VsdCwgUGxheWVyLCBQbGF5ZXJTdGF0cywgU2ltU3RhdGUKZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5ydWxlcyBpbXBvcnQgQUlfREVGQVVMVF9XRUlHSFRTLCBlbnJpY2hfY2FyZCwgc2NvcmVfY2FyZApmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLmRlZXBzZWVrX2JyYWluIGltcG9ydCBEZWVwU2Vla0JyYWluLCBEZWVwU2Vla0NvbmZpZywgYnVpbGRfZGVja19jb250ZXh0Cgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiZGVlcHNlZWtfZW5naW5lIikKCgpjbGFzcyBEZWVwU2Vla0dhbWVFbmdpbmU6CiAgICAiIiIKICAgIEhlYWRsZXNzIENvbW1hbmRlciBnYW1lIGVuZ2luZSB3aXRoIExMTS1wb3dlcmVkIG9wcG9uZW50LgoKICAgIE9uZSBwbGF5ZXIgdXNlcyBEZWVwU2VlayBmb3IgZGVjaXNpb25zOyB0aGUgb3RoZXIgdXNlcyB0aGUgaGV1cmlzdGljLgogICAgQm90aCBwbGF5ZXJzIHVzZSB0aGUgc2FtZSBjb3JlIGdhbWUgbWVjaGFuaWNzIChtYW5hLCBjb21iYXQsIGV0Yy4pCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgc2VsZiwKICAgICAgICBicmFpbjogRGVlcFNlZWtCcmFpbiB8IE5vbmUgPSBOb25lLAogICAgICAgIGFpX3BsYXllcl9pbmRleDogaW50ID0gMSwgICAgICAjIFdoaWNoIHBsYXllciBpcyB0aGUgTExNIEFJICgwIG9yIDEpCiAgICAgICAgbWF4X3R1cm5zOiBpbnQgPSAyNSwKICAgICAgICBzdGFydGluZ19saWZlOiBpbnQgPSA0MCwKICAgICAgICB3ZWlnaHRzOiBPcHRpb25hbFtkaWN0XSA9IE5vbmUsCiAgICAgICAgcmVjb3JkX2xvZzogYm9vbCA9IEZhbHNlLAogICAgICAgIG1sX2xvZzogYm9vbCA9IEZhbHNlLCAgICAgICAgICAjIENhcHR1cmUgTUwgZGVjaXNpb24gc25hcHNob3RzCiAgICApOgogICAgICAgIHNlbGYuYnJhaW4gPSBicmFpbiBvciBEZWVwU2Vla0JyYWluKCkKICAgICAgICBzZWxmLmFpX3BsYXllcl9pbmRleCA9IGFpX3BsYXllcl9pbmRleAogICAgICAgIHNlbGYubWF4X3R1cm5zID0gbWF4X3R1cm5zCiAgICAgICAgc2VsZi5zdGFydGluZ19saWZlID0gc3RhcnRpbmdfbGlmZQogICAgICAgIHNlbGYud2VpZ2h0cyA9IHdlaWdodHMgb3IgQUlfREVGQVVMVF9XRUlHSFRTCiAgICAgICAgc2VsZi5yZWNvcmRf' +
'bG9nID0gcmVjb3JkX2xvZwogICAgICAgIHNlbGYubWxfbG9nID0gbWxfbG9nCiAgICAgICAgc2VsZi5tbF9kZWNpc2lvbnM6IGxpc3RbZGljdF0gPSBbXSAgIyBDb2xsZWN0ZWQgTUwgZGVjaXNpb24gc25hcHNob3RzCgogICAgZGVmIHJ1bigKICAgICAgICBzZWxmLAogICAgICAgIGRlY2tfYTogbGlzdFtDYXJkXSwKICAgICAgICBkZWNrX2I6IGxpc3RbQ2FyZF0sCiAgICAgICAgbmFtZV9hOiBzdHIgPSAiUGxheWVyIEEiLAogICAgICAgIG5hbWVfYjogc3RyID0gIlBsYXllciBCIiwKICAgICAgICBnYW1lX2lkOiBzdHIgfCBOb25lID0gTm9uZSwKICAgICAgICBhcmNoZXR5cGU6IHN0ciA9ICJtaWRyYW5nZSIsCiAgICAgICAgY29tbWFuZGVyX25hbWU6IHN0ciA9ICIiLAogICAgICAgIGNvbG9yX2lkZW50aXR5OiBsaXN0W3N0cl0gfCBOb25lID0gTm9uZSwKICAgICAgICB3aW5fcmF0ZTogZmxvYXQgfCBOb25lID0gTm9uZSwKICAgICkgLT4gR2FtZVJlc3VsdDoKICAgICAgICAiIiJSdW4gYSBzaW5nbGUgZ2FtZS4gVGhlIEFJIHBsYXllciB1c2VzIERlZXBTZWVrIGZvciBkZWNpc2lvbnMuIiIiCiAgICAgICAgc2ltID0gc2VsZi5fY3JlYXRlX3N0YXRlKGRlY2tfYSwgZGVja19iLCBuYW1lX2EsIG5hbWVfYikKICAgICAgICBnYW1lX2xvZzogbGlzdFtkaWN0XSA9IFtdCiAgICAgICAgZ2lkID0gZ2FtZV9pZCBvciBzdHIodXVpZC51dWlkNCgpKVs6MTJdCiAgICAgICAgdHVybl9kZWNpc2lvbnM6IGxpc3RbZGljdF0gPSBbXSAgIyByYXcgKHNuYXBzaG90LCBhY3Rpb25fdHlwZSkgcGFpcnMKCiAgICAgICAgIyBCdWlsZCBkZWNrIGludGVsbGlnZW5jZSBjb250ZXh0IG9uY2UgYXQgZ2FtZSBzdGFydAogICAgICAgIGFpX2RlY2sgPSBkZWNrX2IgaWYgc2VsZi5haV9wbGF5ZXJfaW5kZXggPT0gMSBlbHNlIGRlY2tfYQogICAgICAgIHNlbGYuX2RlY2tfY29udGV4dCA9IGJ1aWxkX2RlY2tfY29udGV4dCgKICAgICAgICAgICAgZnVsbF9kZWNrPWFpX2RlY2ssCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lPWNvbW1hbmRlcl9uYW1lLAogICAgICAgICAgICBjb2xvcl9pZGVudGl0eT1jb2xvcl9pZGVudGl0eSwKICAgICAgICAgICAgYXJjaGV0eXBlPWFyY2hldHlwZSwKICAgICAgICAgICAgd2luX3JhdGU9d2luX3JhdGUsCiAgICAgICAgKQoKICAgICAgICBmaW5hbF90dXJuID0gMAogICAgICAgIGZvciB0dXJuIGluIHJhbmdlKHNpbS5tYXhfdHVybnMpOgogICAgICAgICAgICB0dXJuX2VudHJ5ID0geyJ0dXJuIjogdHVybiArIDEsICJwaGFzZXMiOiBbXX0KCiAgICAgICAgICAgIGZvciBwaSBpbiByYW5nZSgyKToKICAgICAgICAgICAgICAgIHAgPSBzaW0ucGxheWVyc1twaV0KICAgICAgICAgICAgICAgIGlmIHAuZWxpbWluYXRlZDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcC5zdGF0cy50dXJuc19hbGl2ZSArPSAxCiAgICAgICAgICAgICAgICBwaGFzZV9ldmVudHM6IGxpc3Rbc3RyXSA9IFtdCgogICAgICAgICAgICAgICAgIyDilIDilIAgRHJhdyDilIDilIAKICAgICAgICAgICAgICAgIGlmIHAubGlicmFyeToKICAgICAgICAgICAgICAgICAgICBkcmF3biA9IHAubGlicmFyeVstMV0KICAgICAgICAgICAgICAgICAgICBwLmhhbmQuYXBwZW5kKHAubGlicmFyeS5wb3AoKSkKICAgICAgICAgICAgICAgICAgICBwLnN0YXRzLmNhcmRzX2RyYXduICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnJlY29yZF9sb2c6CiAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlX2V2ZW50cy5hcHBlbmQoZiJEcmV3IHtkcmF3bi5uYW1lfSIpCgogICAgICAgICAgICAgICAgIyDilIDilIAgQ2FwdHVyZSBNTCBzbmFwc2hvdCBCRUZPUkUgdGhlIHR1cm4gKHN0YXRlIGJlZm9yZSBhY3Rpb24pIOKUgOKUgAogICAgICAgICAgICAgICAgcHJlX3NuYXBzaG90ID0gTm9uZQogICAgICAgICAgICAgICAgaWYgc2VsZi5tbF9sb2c6CiAgICAgICAgICAgICAgICAgICAgcHJlX3NuYXBzaG90ID0gc2VsZi5fY2FwdHVyZV9tbF9zbmFwc2hvdChzaW0sIHBpLCB0dXJuKQoKICAgICAgICAgICAgICAgICMg4pSA4pSAIERlY2lkZTogTExNIG9yIEhldXJpc3RpYz8g4pSA4pSACiAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZSA9ICJwYXNzIiAgIyBkZWZhdWx0CiAgICAgICAgICAgICAgICBpZiBwaSA9PSBzZWxmLmFpX3BsYXllcl9pbmRleCBhbmQgc2VsZi5icmFpbi5fY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIGFj' +
'dGlvbl90eXBlID0gc2VsZi5fcGxheV90dXJuX2RlZXBzZWVrKHNpbSwgcGksIHR1cm4sIHBoYXNlX2V2ZW50cywgZ2V0YXR0cihzZWxmLCAnX2RlY2tfY29udGV4dCcsIE5vbmUpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHlwZSA9IHNlbGYuX3BsYXlfdHVybl9oZXVyaXN0aWMoc2ltLCBwaSwgdHVybiwgcGhhc2VfZXZlbnRzKQoKICAgICAgICAgICAgICAgICMg4pSA4pSAIFJlY29yZCBNTCBkZWNpc2lvbiBzbmFwc2hvdCDilIDilIAKICAgICAgICAgICAgICAgIGlmIHNlbGYubWxfbG9nIGFuZCBwcmVfc25hcHNob3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcHJlX3NuYXBzaG90WyJhY3Rpb24iXSA9IHsidHlwZSI6IGFjdGlvbl90eXBlfQogICAgICAgICAgICAgICAgICAgIHByZV9zbmFwc2hvdFsiZ2FtZV9pZCJdID0gZ2lkCiAgICAgICAgICAgICAgICAgICAgcHJlX3NuYXBzaG90WyJhcmNoZXR5cGUiXSA9IGFyY2hldHlwZQogICAgICAgICAgICAgICAgICAgIHR1cm5fZGVjaXNpb25zLmFwcGVuZChwcmVfc25hcHNob3QpCgogICAgICAgICAgICAgICAgIyDilIDilIAgVHJhY2sgYm9hcmQgc2l6ZSDilIDilIAKICAgICAgICAgICAgICAgIGJvYXJkX3NpemUgPSBzdW0oMSBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQgaWYgYy5vd25lcl9pZCA9PSBwaSkKICAgICAgICAgICAgICAgIGlmIGJvYXJkX3NpemUgPiBwLnN0YXRzLm1heF9ib2FyZF9zaXplOgogICAgICAgICAgICAgICAgICAgIHAuc3RhdHMubWF4X2JvYXJkX3NpemUgPSBib2FyZF9zaXplCgogICAgICAgICAgICAgICAgIyDilIDilIAgVW50YXAg4pSA4pSACiAgICAgICAgICAgICAgICBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgaWYgYy5vd25lcl9pZCA9PSBwaToKICAgICAgICAgICAgICAgICAgICAgICAgYy50YXBwZWQgPSBGYWxzZQoKICAgICAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkX2xvZzoKICAgICAgICAgICAgICAgICAgICB0dXJuX2VudHJ5WyJwaGFzZXMiXS5hcHBlbmQoewogICAgICAgICAgICAgICAgICAgICAgICAicGxheWVyIjogcC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAicGxheWVySWQiOiBwaSwKICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyI6IHBoYXNlX2V2ZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgImxpZmVBZnRlciI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbS5wbGF5ZXJzWzBdLm5hbWU6IHNpbS5wbGF5ZXJzWzBdLmxpZmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW0ucGxheWVyc1sxXS5uYW1lOiBzaW0ucGxheWVyc1sxXS5saWZlLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiYm9hcmRBIjogW2MubmFtZSBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQgaWYgYy5vd25lcl9pZCA9PSAwIGFuZCBjLmlzX2NyZWF0dXJlKCldLAogICAgICAgICAgICAgICAgICAgICAgICAiYm9hcmRCIjogW2MubmFtZSBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQgaWYgYy5vd25lcl9pZCA9PSAxIGFuZCBjLmlzX2NyZWF0dXJlKCldLAogICAgICAgICAgICAgICAgICAgIH0pCgogICAgICAgICAgICAjIENoZWNrIGdhbWUgb3ZlcgogICAgICAgICAgICBhbGl2ZSA9IFtwIGZvciBwIGluIHNpbS5wbGF5ZXJzIGlmIG5vdCBwLmVsaW1pbmF0ZWRdCiAgICAgICAgICAgIGZpbmFsX3R1cm4gPSB0dXJuICsgMQogICAgICAgICAgICBpZiBzZWxmLnJlY29yZF9sb2c6CiAgICAgICAgICAgICAgICBnYW1lX2xvZy5hcHBlbmQodHVybl9lbnRyeSkKICAgICAgICAgICAgaWYgbGVuKGFsaXZlKSA8PSAxOgogICAgICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmRfbG9nOgogICAgICAgICAgICAgICAgICAgIGVsaW1fbmFtZSA9IG5leHQoKHAubmFtZSBmb3IgcCBpbiBzaW0ucGxheWVycyBpZiBwLmVsaW1pbmF0ZWQpLCBOb25lKQogICAgICAgICAgICAgICAgICAgIGlmIGVsaW1fbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgZ2FtZV9sb2dbLTFdWyJldmVudCJdID0gZiJ7ZWxpbV9uYW1lfSBlbGltaW5hdGVkISIKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkX2xvZzoKICAgICAgICAgICAgICAgIGdhbWVfbG9nLmFwcGVuZCh0dXJuX2VudHJ5KSBpZiB0dXJuX2VudHJ5IG5vdCBpbiBnYW1lX2xvZyBlbHNlIE5vbmUKCiAg' +
'ICAgICAgcmVzdWx0ID0gc2VsZi5fYnVpbGRfcmVzdWx0KHNpbSwgZmluYWxfdHVybiwgbmFtZV9hLCBuYW1lX2IpCiAgICAgICAgaWYgc2VsZi5yZWNvcmRfbG9nOgogICAgICAgICAgICByZXN1bHQuZ2FtZV9sb2cgPSBnYW1lX2xvZwoKICAgICAgICAjIFN0YW1wIGdhbWUgb3V0Y29tZSBvbiBhbGwgTUwgZGVjaXNpb25zIGFuZCBhZGQgdG8gZW5naW5lIGNvbGxlY3Rpb24KICAgICAgICBpZiBzZWxmLm1sX2xvZyBhbmQgdHVybl9kZWNpc2lvbnM6CiAgICAgICAgICAgIG91dGNvbWUgPSAid2luIiBpZiByZXN1bHQud2lubmVyID09IDAgZWxzZSAibG9zcyIgaWYgcmVzdWx0Lndpbm5lciA9PSAxIGVsc2UgImRyYXciCiAgICAgICAgICAgIGZvciB0ZCBpbiB0dXJuX2RlY2lzaW9uczoKICAgICAgICAgICAgICAgIHRkWyJnYW1lX291dGNvbWUiXSA9IG91dGNvbWUKICAgICAgICAgICAgc2VsZi5tbF9kZWNpc2lvbnMuZXh0ZW5kKHR1cm5fZGVjaXNpb25zKQoKICAgICAgICAjIEZsdXNoIGRlY2lzaW9uIGxvZyBhdCBlbmQgb2YgZ2FtZQogICAgICAgIGlmIHNlbGYuYnJhaW4uY29uZmlnLmxvZ19kZWNpc2lvbnMgYW5kIHNlbGYuYnJhaW4uX2RlY2lzaW9uX2xvZzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5icmFpbi5mbHVzaF9sb2coKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiRmFpbGVkIHRvIGZsdXNoIGRlY2lzaW9uIGxvZzogJXMiLCBlKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICMgRGVlcFNlZWstcG93ZXJlZCB0dXJuCiAgICAjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGRlZiBfcGxheV90dXJuX2RlZXBzZWVrKAogICAgICAgIHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQsIHR1cm46IGludCwgZXZlbnRzOiBsaXN0W3N0cl0sCiAgICAgICAgZGVja19jb250ZXh0OiBkaWN0IHwgTm9uZSA9IE5vbmUsCiAgICApIC0+IHN0cjoKICAgICAgICAiIiIKICAgICAgICBFeGVjdXRlIGEgZnVsbCB0dXJuIGZvciB0aGUgQUkgcGxheWVyIHVzaW5nIERlZXBTZWVrIGRlY2lzaW9ucy4KCiAgICAgICAgVGhlIExMTSBnZXRzIGNhbGxlZCBvbmNlIHBlciB0dXJuLiBCYXNlZCBvbiBpdHMgYWN0aW9uLCB3ZSBleGVjdXRlCiAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGdhbWUgbWVjaGFuaWNzIHVzaW5nIHRoZSBleGlzdGluZyBlbmdpbmUgaGVscGVycy4KICAgICAgICBNdWx0aXBsZSBhY3Rpb25zIGFyZSBwb3NzaWJsZSBwZXIgdHVybiAobGFuZCArIHNwZWxsICsgY29tYmF0KS4KCiAgICAgICAgUmV0dXJuczogTUwgYWN0aW9uIHR5cGUgc3RyaW5nIGZvciBkZWNpc2lvbiBsb2dnaW5nLgogICAgICAgICIiIgogICAgICAgIHAgPSBzaW0ucGxheWVyc1twaV0KICAgICAgICBhdmFpbGFibGVfbWFuYSA9IHNlbGYuX2NvdW50X3VudGFwcGVkX2xhbmRzKHNpbSwgcGkpCgogICAgICAgICMgQXNrIERlZXBTZWVrIHdoYXQgdG8gZG8g4oCUIHdpdGggZnVsbCBkZWNrIGludGVsbGlnZW5jZQogICAgICAgIGRlY2lzaW9uID0gc2VsZi5icmFpbi5jaG9vc2VfYWN0aW9uKHNpbSwgcGksIHR1cm4sIGF2YWlsYWJsZV9tYW5hLCBkZWNrX2NvbnRleHQ9ZGVja19jb250ZXh0KQogICAgICAgIGFjdGlvbiA9IGRlY2lzaW9uLmdldCgiYWN0aW9uIiwgImhvbGQiKQogICAgICAgIHRhcmdldF9jYXJkX25hbWUgPSBkZWNpc2lvbi5nZXQoInRhcmdldF9jYXJkIiwgIiIpCiAgICAgICAgcmVhc29uaW5nID0gZGVjaXNpb24uZ2V0KCJyZWFzb25pbmciLCAiIikKICAgICAgICBzb3VyY2UgPSBkZWNpc2lvbi5nZXQoInNvdXJjZSIsICI/IikKCiAgICAgICAgaWYgc2VsZi5yZWNvcmRfbG9nOgogICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiW0FJIEJyYWluOiB7c291cmNl' +
'fV0gQWN0aW9uOiB7YWN0aW9ufSAiCiAgICAgICAgICAgICAgICAgICAgICAgICBmInsn4oaSICcgKyB0YXJnZXRfY2FyZF9uYW1lIGlmIHRhcmdldF9jYXJkX25hbWUgZWxzZSAnJ30gIgogICAgICAgICAgICAgICAgICAgICAgICAgZiIoe3JlYXNvbmluZ30pIikKCiAgICAgICAgIyDilIDilIAgUGhhc2UgMTogTGFuZCBkcm9wIOKUgOKUgAogICAgICAgICMgQWx3YXlzIHRyeSB0byBwbGF5IGEgbGFuZCAoZXZlbiBpZiBMTE0gZGlkbid0IHNheSAicGxheV9sYW5kIikKICAgICAgICBzZWxmLl9wbGF5X2xhbmQoc2ltLCBwaSwgdGFyZ2V0X2NhcmRfbmFtZSBpZiBhY3Rpb24gPT0gInBsYXlfbGFuZCIgZWxzZSBOb25lLCBldmVudHMpCgogICAgICAgICMgUmVjYWxjdWxhdGUgbWFuYSBhZnRlciBsYW5kIGRyb3AKICAgICAgICBhdmFpbGFibGVfbWFuYSA9IHNlbGYuX2NvdW50X3VudGFwcGVkX2xhbmRzKHNpbSwgcGkpCgogICAgICAgICMg4pSA4pSAIFBoYXNlIDI6IENhc3Qgc3BlbGxzICh1cCB0byAyKSBiYXNlZCBvbiBMTE0gYWN0aW9uIOKUgOKUgAogICAgICAgIGlmIGFjdGlvbiBpbiAoImNhc3RfY3JlYXR1cmUiLCAiY2FzdF9yZW1vdmFsIiwgImNhc3RfYm9hcmRfd2lwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgImNhc3RfcmFtcCIsICJjYXN0X3NwZWxsIik6CiAgICAgICAgICAgIHNlbGYuX3BsYXlfc3BlbGxzX3RhcmdldGVkKAogICAgICAgICAgICAgICAgc2ltLCBwaSwgYXZhaWxhYmxlX21hbmEsIGFjdGlvbiwgdGFyZ2V0X2NhcmRfbmFtZSwgZXZlbnRzCiAgICAgICAgICAgICkKICAgICAgICBlbGlmIGFjdGlvbiAhPSAiaG9sZCI6CiAgICAgICAgICAgICMgRm9yIGF0dGFjayBhY3Rpb25zIG9yIHVua25vd25zLCBzdGlsbCB0cnkgdG8gY2FzdCBzb21ldGhpbmcgZmlyc3QKICAgICAgICAgICAgc2VsZi5fcGxheV9zcGVsbHNfaGV1cmlzdGljKHNpbSwgcGksIGF2YWlsYWJsZV9tYW5hLCBldmVudHMpCgogICAgICAgICMg4pSA4pSAIFBoYXNlIDM6IENvbWJhdCDilIDilIAKICAgICAgICBpZiBhY3Rpb24gaW4gKCJhdHRhY2tfYWxsIiwgImF0dGFja19zYWZlIik6CiAgICAgICAgICAgIHNlbGYuX3Jlc29sdmVfY29tYmF0X2RlZXBzZWVrKHNpbSwgcGksIHR1cm4sIGFjdGlvbiwgZXZlbnRzKQogICAgICAgIGVsaWYgYWN0aW9uID09ICJob2xkIjoKICAgICAgICAgICAgIyBMTE0gY2hvc2UgdG8gaG9sZCDigJQgbm8gY29tYmF0CiAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkX2xvZzoKICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoIkhvbGRzIOKAlCBubyBhdHRhY2siKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgRGVmYXVsdDogc3RpbGwgYXR0YWNrIGlmIHdlIGhhdmUgY3JlYXR1cmVzIGFuZCBpdCBtYWtlcyBzZW5zZQogICAgICAgICAgICBzZWxmLl9yZXNvbHZlX2NvbWJhdF9oZXVyaXN0aWMoc2ltLCBwaSwgdHVybiwgZXZlbnRzKQoKICAgICAgICAjIE1hcCBEZWVwU2VlayBhY3Rpb24gdG8gTUwgbWFjcm8tYWN0aW9uIHR5cGUgZm9yIHRyYWluaW5nIGRhdGEKICAgICAgICByZXR1cm4gc2VsZi5fbWFwX2FjdGlvbl90b19tbF90eXBlKGFjdGlvbiwgYXZhaWxhYmxlX21hbmEpCgogICAgIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICMgSGV1cmlzdGljIHR1cm4gKGZvciBodW1hbiBwbGF5ZXIgb3IgZmFsbGJhY2spCiAgICAjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGRlZiBfcGxheV90dXJuX2hldXJpc3RpYygKICAgICAgICBzZWxmLCBzaW06IFNpbVN0YXRlLCBwaTogaW50LCB0dXJuOiBpbnQsIGV2ZW50czogbGlzdFtzdHJdCiAgICApIC0+IHN0cjoKICAgICAgICAiIiJTdGFuZGFyZCBoZXVyaXN0aWMgdHVybiAoc2FtZSBhcyBiYXNlIEdhbWVFbmdpbmUpLiBSZXR1cm5zIE1MIGFjdGlvbiB0eXBlLiIiIgogICAgICAgICMgTGFuZCBkcm9wCiAgICAgICAgc2Vs' +
'Zi5fcGxheV9sYW5kKHNpbSwgcGksIE5vbmUsIGV2ZW50cykKCiAgICAgICAgIyBBdmFpbGFibGUgbWFuYQogICAgICAgIGF2YWlsYWJsZV9tYW5hID0gc2VsZi5fY291bnRfdW50YXBwZWRfbGFuZHMoc2ltLCBwaSkKCiAgICAgICAgIyBQbGF5IHNwZWxscwogICAgICAgIHBsYXllZF9zcGVsbCA9IHNlbGYuX3BsYXlfc3BlbGxzX2hldXJpc3RpYyhzaW0sIHBpLCBhdmFpbGFibGVfbWFuYSwgZXZlbnRzKQoKICAgICAgICAjIENvbWJhdAogICAgICAgIGF0dGFja2VkID0gc2VsZi5fcmVzb2x2ZV9jb21iYXRfaGV1cmlzdGljKHNpbSwgcGksIHR1cm4sIGV2ZW50cykKCiAgICAgICAgIyBEZXRlcm1pbmUgdGhlIHByaW1hcnkgYWN0aW9uIGZvciBNTCBsb2dnaW5nCiAgICAgICAgaWYgYXR0YWNrZWQ6CiAgICAgICAgICAgIHJldHVybiAiYXR0YWNrIgogICAgICAgIGVsaWYgcGxheWVkX3NwZWxsOgogICAgICAgICAgICByZXR1cm4gImNhc3QiICAjIGdlbmVyaWMgY2FzdCDigJQgbGFiZWxlciB1c2VzIGNhcmQgbmFtZSB0byBjbGFzc2lmeQogICAgICAgIGVsaWYgYXZhaWxhYmxlX21hbmEgPj0gMjoKICAgICAgICAgICAgcmV0dXJuICJob2xkIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAicGFzcyIKCiAgICAjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgIyBMYW5kIGRyb3AKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZGVmIF9wbGF5X2xhbmQoCiAgICAgICAgc2VsZiwgc2ltOiBTaW1TdGF0ZSwgcGk6IGludCwKICAgICAgICBwcmVmZXJyZWRfbmFtZTogc3RyIHwgTm9uZSwgZXZlbnRzOiBsaXN0W3N0cl0gfCBOb25lCiAgICApOgogICAgICAgICIiIlBsYXkgYSBsYW5kIGZyb20gaGFuZC4gSWYgcHJlZmVycmVkX25hbWUgZ2l2ZW4sIHRyeSB0aGF0IGZpcnN0LiIiIgogICAgICAgIHAgPSBzaW0ucGxheWVyc1twaV0KICAgICAgICBsYW5kX2lkeCA9IC0xCgogICAgICAgIGlmIHByZWZlcnJlZF9uYW1lOgogICAgICAgICAgICAjIFRyeSB0byBmaW5kIHRoZSBwcmVmZXJyZWQgbGFuZAogICAgICAgICAgICBmb3IgaSwgY2FyZCBpbiBlbnVtZXJhdGUocC5oYW5kKToKICAgICAgICAgICAgICAgIGlmIGNhcmQuaXNfbGFuZCgpIGFuZCBjYXJkLm5hbWUubG93ZXIoKSA9PSBwcmVmZXJyZWRfbmFtZS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgIGxhbmRfaWR4ID0gaQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIGxhbmRfaWR4ID09IC0xOgogICAgICAgICAgICAjIEZhbGwgYmFjayB0byBmaXJzdCBhdmFpbGFibGUgbGFuZAogICAgICAgICAgICBmb3IgaSwgY2FyZCBpbiBlbnVtZXJhdGUocC5oYW5kKToKICAgICAgICAgICAgICAgIGlmIGNhcmQuaXNfbGFuZCgpOgogICAgICAgICAgICAgICAgICAgIGxhbmRfaWR4ID0gaQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIGlmIGxhbmRfaWR4ID09IC0xOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbGFuZF9jYXJkID0gcC5oYW5kLnBvcChsYW5kX2lkeCkKICAgICAgICBsYW5kX2NhcmQub3duZXJfaWQgPSBwaQogICAgICAgIGxhbmRfY2FyZC50YXBwZWQgPSBGYWxzZQogICAgICAgIGxhbmRfY2FyZC5pZCA9IHNpbS5uZXh0X2NhcmRfaWQKICAgICAgICBzaW0ubmV4dF9jYXJkX2lkICs9IDEKICAgICAgICBzaW0uYmF0dGxlZmllbGQuYXBwZW5kKGxhbmRfY2FyZCkKICAgICAgICBwLnN0YXRzLmxhbmRzX3BsYXllZCArPSAxCgogICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZSBhbmQgc2VsZi5yZWNvcmRfbG9nOgogICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiUGxheWVkIGxhbmQ6IHtsYW5kX2NhcmQubmFtZX0iKQoKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA' +
'4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAjIFNwZWxsIGNhc3Rpbmcg4oCUIHRhcmdldGVkIChMTE0tZGlyZWN0ZWQpCiAgICAjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGRlZiBfcGxheV9zcGVsbHNfdGFyZ2V0ZWQoCiAgICAgICAgc2VsZiwgc2ltOiBTaW1TdGF0ZSwgcGk6IGludCwgYXZhaWxhYmxlX21hbmE6IGludCwKICAgICAgICBhY3Rpb246IHN0ciwgdGFyZ2V0X2NhcmRfbmFtZTogc3RyLCBldmVudHM6IGxpc3Rbc3RyXSB8IE5vbmUKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FzdCBzcGVsbHMgYmFzZWQgb24gTExNJ3MgYWN0aW9uIGNob2ljZS4KICAgICAgICBUcmllcyB0aGUgdGFyZ2V0IGNhcmQgZmlyc3QsIHRoZW4gZmlsbHMgd2l0aCBoZXVyaXN0aWMgcGlja3MuCiAgICAgICAgVXAgdG8gMiBzcGVsbHMgcGVyIHR1cm4uCiAgICAgICAgIiIiCiAgICAgICAgcCA9IHNpbS5wbGF5ZXJzW3BpXQogICAgICAgIHcgPSBzZWxmLndlaWdodHMKICAgICAgICBwbGF5ZWQgPSAwCgogICAgICAgICMgVHJ5IHRvIGNhc3QgdGhlIExMTSdzIHRhcmdldCBjYXJkIGZpcnN0CiAgICAgICAgaWYgdGFyZ2V0X2NhcmRfbmFtZToKICAgICAgICAgICAgdGFyZ2V0X2lkeCA9IC0xCiAgICAgICAgICAgIGZvciBpLCBjYXJkIGluIGVudW1lcmF0ZShwLmhhbmQpOgogICAgICAgICAgICAgICAgaWYgKG5vdCBjYXJkLmlzX2xhbmQoKQogICAgICAgICAgICAgICAgICAgIGFuZCBjYXJkLm5hbWUubG93ZXIoKSA9PSB0YXJnZXRfY2FyZF9uYW1lLmxvd2VyKCkKICAgICAgICAgICAgICAgICAgICBhbmQgKGNhcmQuY21jIG9yIDApIDw9IGF2YWlsYWJsZV9tYW5hKToKICAgICAgICAgICAgICAgICAgICB0YXJnZXRfaWR4ID0gaQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICBpZiB0YXJnZXRfaWR4ID49IDA6CiAgICAgICAgICAgICAgICBjYXJkID0gcC5oYW5kLnBvcCh0YXJnZXRfaWR4KQogICAgICAgICAgICAgICAgYXZhaWxhYmxlX21hbmEgPSBzZWxmLl9jYXN0X3NwZWxsKHNpbSwgcGksIGNhcmQsIGF2YWlsYWJsZV9tYW5hLCBldmVudHMpCiAgICAgICAgICAgICAgICBwbGF5ZWQgKz0gMQoKICAgICAgICAjIEZpbGwgcmVtYWluaW5nIHNwZWxsIHNsb3RzIHdpdGggaGV1cmlzdGljCiAgICAgICAgaWYgcGxheWVkIDwgMjoKICAgICAgICAgICAgcGxheWVkICs9IHNlbGYuX3BsYXlfc3BlbGxzX2hldXJpc3RpY19pbm5lcigKICAgICAgICAgICAgICAgIHNpbSwgcGksIGF2YWlsYWJsZV9tYW5hLCBldmVudHMsIG1heF9zcGVsbHM9MiAtIHBsYXllZAogICAgICAgICAgICApCgogICAgZGVmIF9wbGF5X3NwZWxsc19oZXVyaXN0aWMoCiAgICAgICAgc2VsZiwgc2ltOiBTaW1TdGF0ZSwgcGk6IGludCwgYXZhaWxhYmxlX21hbmE6IGludCwgZXZlbnRzOiBsaXN0W3N0cl0gfCBOb25lCiAgICApIC0+IGJvb2w6CiAgICAgICAgIiIiUGxheSB1cCB0byAyIHNwZWxscyB1c2luZyBoZXVyaXN0aWMgc2NvcmluZy4gUmV0dXJucyBUcnVlIGlmIGFueSBzcGVsbCB3YXMgcGxheWVkLiIiIgogICAgICAgIHJldHVybiBzZWxmLl9wbGF5X3NwZWxsc19oZXVyaXN0aWNfaW5uZXIoc2ltLCBwaSwgYXZhaWxhYmxlX21hbmEsIGV2ZW50cywgbWF4X3NwZWxscz0yKSA+IDAKCiAgICBkZWYgX3BsYXlfc3BlbGxzX2hldXJpc3RpY19pbm5lcigKICAgICAgICBzZWxmLCBzaW06IFNpbVN0YXRlLCBwaTogaW50LCBhdmFpbGFibGVfbWFuYTogaW50LAogICAgICAgIGV2ZW50czogbGlzdFtzdHJdIHwgTm9uZSwgbWF4X3NwZWxsczogaW50ID0gMgogICAgKSAtPiBpbnQ6CiAgICAgICAgIiIiQ29yZSBoZXVyaXN0aWMgc3BlbGwgY2FzdGluZy4gUmV0dXJucyBudW1iZXIgb2Ygc3BlbGxzIHBsYXllZC4iIiIKICAgICAgICBwID0gc2ltLnBsYXllcnNbcGldCiAgICAgICAgdyA9IHNlbGYud2VpZ2h0cwoKICAgICAgICBwbGF5YWJsZSA9IFtdCiAgICAgICAgZm9yIGksIGNhcmQgaW4gZW51bWVyYXRlKHAuaGFuZCk6CiAgICAgICAgICAgIGlmIGNhcmQuaXNfbGFuZCgp' +
'OgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY21jID0gY2FyZC5jbWMgb3IgMAogICAgICAgICAgICBpZiBjbWMgPD0gYXZhaWxhYmxlX21hbmE6CiAgICAgICAgICAgICAgICBwbGF5YWJsZS5hcHBlbmQoKHNjb3JlX2NhcmQoY2FyZCwgdyksIGksIGNhcmQpKQoKICAgICAgICBwbGF5YWJsZS5zb3J0KGtleT1sYW1iZGEgeDogLXhbMF0pCgogICAgICAgIHBsYXllZCA9IDAKICAgICAgICB3aGlsZSBwbGF5YWJsZSBhbmQgcGxheWVkIDwgbWF4X3NwZWxsczoKICAgICAgICAgICAgXywgXywgYmVzdF9jYXJkID0gcGxheWFibGUucG9wKDApCiAgICAgICAgICAgIGhhbmRfcG9zID0gLTEKICAgICAgICAgICAgZm9yIGksIGMgaW4gZW51bWVyYXRlKHAuaGFuZCk6CiAgICAgICAgICAgICAgICBpZiBjIGlzIGJlc3RfY2FyZDoKICAgICAgICAgICAgICAgICAgICBoYW5kX3BvcyA9IGkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBoYW5kX3BvcyA9PSAtMToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBjYXJkID0gcC5oYW5kLnBvcChoYW5kX3BvcykKICAgICAgICAgICAgYXZhaWxhYmxlX21hbmEgPSBzZWxmLl9jYXN0X3NwZWxsKHNpbSwgcGksIGNhcmQsIGF2YWlsYWJsZV9tYW5hLCBldmVudHMpCiAgICAgICAgICAgIHBsYXllZCArPSAxCgogICAgICAgICAgICAjIFJlY2FsY3VsYXRlIGF2YWlsYWJsZSBtYW5hCiAgICAgICAgICAgIGF2YWlsYWJsZV9tYW5hID0gc2VsZi5fY291bnRfdW50YXBwZWRfbGFuZHMoc2ltLCBwaSkKCiAgICAgICAgcmV0dXJuIHBsYXllZAoKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAjIFNwZWxsIHJlc29sdXRpb24gKHNoYXJlZCkKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZGVmIF9jYXN0X3NwZWxsKAogICAgICAgIHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQsIGNhcmQ6IENhcmQsCiAgICAgICAgYXZhaWxhYmxlX21hbmE6IGludCwgZXZlbnRzOiBsaXN0W3N0cl0gfCBOb25lCiAgICApIC0+IGludDoKICAgICAgICAiIiIKICAgICAgICBSZXNvbHZlIGEgc2luZ2xlIHNwZWxsIGNhc3QuIFJldHVybnMgcmVtYWluaW5nIG1hbmEuCiAgICAgICAgSGFuZGxlcyByZW1vdmFsLCBib2FyZCB3aXBlcywgY3JlYXR1cmVzLCByYW1wLCBhbmQgb3RoZXIgc3BlbGxzLgogICAgICAgICIiIgogICAgICAgIHAgPSBzaW0ucGxheWVyc1twaV0KICAgICAgICB3ID0gc2VsZi53ZWlnaHRzCgogICAgICAgIGNhcmQub3duZXJfaWQgPSBwaQogICAgICAgIGNhcmQudGFwcGVkID0gRmFsc2UKICAgICAgICBjYXJkLmlkID0gc2ltLm5leHRfY2FyZF9pZAogICAgICAgIHNpbS5uZXh0X2NhcmRfaWQgKz0gMQogICAgICAgIGNhcmQudHVybl9wbGF5ZWQgPSBzaW0udHVybgoKICAgICAgICAjIFBheSBtYW5hCiAgICAgICAgbWFuYV9uZWVkZWQgPSBjYXJkLmNtYyBvciAwCiAgICAgICAgZm9yIGJmX2NhcmQgaW4gc2ltLmJhdHRsZWZpZWxkOgogICAgICAgICAgICBpZiBtYW5hX25lZWRlZCA8PSAwOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgYmZfY2FyZC5vd25lcl9pZCA9PSBwaSBhbmQgbm90IGJmX2NhcmQudGFwcGVkIGFuZCBiZl9jYXJkLmlzX2xhbmQoKToKICAgICAgICAgICAgICAgIGJmX2NhcmQudGFwcGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgbWFuYV9uZWVkZWQgLT0gMQoKICAgICAgICBwLnN0YXRzLm1hbmFfc3BlbnQgKz0gY2FyZC5jbWMgb3IgMAogICAgICAgIHAuc3RhdHMuc3BlbGxzX2Nhc3QgKz0gMQoKICAgICAgICAjIEhhbmRsZSByZW1vdmFsCiAgICAgICAgaWYgY2FyZC5pc19yZW1vdmFsOgogICAgICAgICAgICBwLnN0YXRzLnJlbW92YWxfdXNlZCArPSAxCiAgICAgICAgICAgIG9wcF9jcmVhdHVyZXMgPSBbCiAgICAgICAgICAgICAgICBjIGZvciBj' +
'IGluIHNpbS5iYXR0bGVmaWVsZAogICAgICAgICAgICAgICAgaWYgYy5vd25lcl9pZCAhPSBwaSBhbmQgYy5pc19jcmVhdHVyZSgpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgaWYgb3BwX2NyZWF0dXJlczoKICAgICAgICAgICAgICAgIG9wcF9jcmVhdHVyZXMuc29ydChrZXk9bGFtYmRhIGM6IC1zY29yZV9jYXJkKGMsIHcpKQogICAgICAgICAgICAgICAga2lsbGVkID0gb3BwX2NyZWF0dXJlc1swXQogICAgICAgICAgICAgICAgc2ltLmJhdHRsZWZpZWxkID0gW2MgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkIGlmIGMuaWQgIT0ga2lsbGVkLmlkXQogICAgICAgICAgICAgICAgc2ltLnBsYXllcnNba2lsbGVkLm93bmVyX2lkXS5ncmF2ZXlhcmQuYXBwZW5kKGtpbGxlZCkKICAgICAgICAgICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSAocmVtb3ZhbCkg4oCUIGRlc3Ryb3llZCB7a2lsbGVkLm5hbWV9IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSAocmVtb3ZhbCwgbm8gdGFyZ2V0cykiKQogICAgICAgICAgICBwLmdyYXZleWFyZC5hcHBlbmQoY2FyZCkKCiAgICAgICAgZWxpZiBjYXJkLmlzX2JvYXJkX3dpcGU6CiAgICAgICAgICAgIHAuc3RhdHMuYm9hcmRfd2lwZXNfdXNlZCArPSAxCiAgICAgICAgICAgIHdpcGVkID0gW2MubmFtZSBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQgaWYgYy5pc19jcmVhdHVyZSgpXQogICAgICAgICAgICBzdXJ2aXZpbmcgPSBbXQogICAgICAgICAgICBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQ6CiAgICAgICAgICAgICAgICBpZiBjLmlzX2NyZWF0dXJlKCk6CiAgICAgICAgICAgICAgICAgICAgc2ltLnBsYXllcnNbYy5vd25lcl9pZF0uZ3JhdmV5YXJkLmFwcGVuZChjKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzdXJ2aXZpbmcuYXBwZW5kKGMpCiAgICAgICAgICAgIHNpbS5iYXR0bGVmaWVsZCA9IHN1cnZpdmluZwogICAgICAgICAgICBwLmdyYXZleWFyZC5hcHBlbmQoY2FyZCkKICAgICAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZXZlbnRzLmFwcGVuZChmIkNhc3Qge2NhcmQubmFtZX0gKGJvYXJkIHdpcGUpIOKAlCBkZXN0cm95ZWQge2xlbih3aXBlZCl9IGNyZWF0dXJlcyIpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNpbS5iYXR0bGVmaWVsZC5hcHBlbmQoY2FyZCkKICAgICAgICAgICAgaWYgY2FyZC5pc19jcmVhdHVyZSgpOgogICAgICAgICAgICAgICAgcC5zdGF0cy5jcmVhdHVyZXNfcGxheWVkICs9IDEKICAgICAgICAgICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSAoe2NhcmQucHQgb3IgJ2NyZWF0dXJlJ30pIGZvciB7Y2FyZC5jbWN9IG1hbmEiKQogICAgICAgICAgICBlbGlmIGNhcmQuaXNfcmFtcDoKICAgICAgICAgICAgICAgIHAuc3RhdHMucmFtcF9wbGF5ZWQgKz0gMQogICAgICAgICAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZiJDYXN0IHtjYXJkLm5hbWV9IChyYW1wKSBmb3Ige2NhcmQuY21jfSBtYW5hIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSBmb3Ige2NhcmQuY21jfSBtYW5hIikKCiAgICAgICAgcmV0dXJuIHNlbGYuX2NvdW50X3VudGFwcGVkX2xhbmRzKHNpbSwgcGkpCgogICAgIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICMgQ29tYmF0IOKAlCBEZWVwU2VlayBkaXJlY3RlZAogICAgIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' +
'lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBkZWYgX3Jlc29sdmVfY29tYmF0X2RlZXBzZWVrKAogICAgICAgIHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQsIHR1cm46IGludCwKICAgICAgICBhdHRhY2tfbW9kZTogc3RyLCBldmVudHM6IGxpc3Rbc3RyXSB8IE5vbmUKICAgICk6CiAgICAgICAgIiIiCiAgICAgICAgUmVzb2x2ZSBjb21iYXQgYmFzZWQgb24gTExNJ3MgYXR0YWNrIGNob2ljZS4KICAgICAgICBhdHRhY2tfYWxsOiBzZW5kIGV2ZXJ5dGhpbmcKICAgICAgICBhdHRhY2tfc2FmZTogb25seSBldmFzaXZlL2xhcmdlIGNyZWF0dXJlcwogICAgICAgICIiIgogICAgICAgIHAgPSBzaW0ucGxheWVyc1twaV0KICAgICAgICBvcHBfaWR4ID0gMSAtIHBpCiAgICAgICAgb3BwID0gc2ltLnBsYXllcnNbb3BwX2lkeF0KCiAgICAgICAgaWYgb3BwLmVsaW1pbmF0ZWQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBteV9jcmVhdHVyZXMgPSBbCiAgICAgICAgICAgIGMgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkCiAgICAgICAgICAgIGlmIGMub3duZXJfaWQgPT0gcGkgYW5kIGMuaXNfY3JlYXR1cmUoKSBhbmQgbm90IGMudGFwcGVkCiAgICAgICAgICAgIGFuZCAodHVybiA+IDAgb3IgYy50dXJuX3BsYXllZCAhPSB0dXJuKQogICAgICAgIF0KICAgICAgICBpZiBub3QgbXlfY3JlYXR1cmVzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgb3BwX2Jsb2NrZXJzID0gWwogICAgICAgICAgICBjIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZAogICAgICAgICAgICBpZiBjLm93bmVyX2lkID09IG9wcF9pZHggYW5kIGMuaXNfY3JlYXR1cmUoKSBhbmQgbm90IGMudGFwcGVkCiAgICAgICAgXQoKICAgICAgICAjIFNlbGVjdCBhdHRhY2tlcnMgYmFzZWQgb24gTExNJ3MgcHJlZmVyZW5jZQogICAgICAgIGF0dGFja2VycyA9IFtdCiAgICAgICAgaWYgYXR0YWNrX21vZGUgPT0gImF0dGFja19hbGwiOgogICAgICAgICAgICBhdHRhY2tlcnMgPSBteV9jcmVhdHVyZXNbOl0KICAgICAgICBlbGlmIGF0dGFja19tb2RlID09ICJhdHRhY2tfc2FmZSI6CiAgICAgICAgICAgICMgT25seSBldmFzaXZlIChmbHlpbmcsIHRyYW1wbGUsIG1lbmFjZSkgb3IgbGFyZ2UgKHBvd2VyID49IDQpCiAgICAgICAgICAgIGZvciBhdGsgaW4gbXlfY3JlYXR1cmVzOgogICAgICAgICAgICAgICAgaWYgKGF0ay5oYXNfa2V5d29yZCgiZmx5aW5nIikgb3IgYXRrLmhhc19rZXl3b3JkKCJ0cmFtcGxlIikKICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXRrLmhhc19rZXl3b3JkKCJtZW5hY2UiKSBvciBhdGsuZ2V0X3Bvd2VyKCkgPj0gNCk6CiAgICAgICAgICAgICAgICAgICAgYXR0YWNrZXJzLmFwcGVuZChhdGspCgogICAgICAgIGZvciBhdGsgaW4gYXR0YWNrZXJzOgogICAgICAgICAgICBhdGsudGFwcGVkID0gVHJ1ZQoKICAgICAgICBpZiBldmVudHMgaXMgbm90IE5vbmUgYW5kIGF0dGFja2VyczoKICAgICAgICAgICAgbW9kZV9sYWJlbCA9ICJhbGwtaW4iIGlmIGF0dGFja19tb2RlID09ICJhdHRhY2tfYWxsIiBlbHNlICJzYWZlIgogICAgICAgICAgICBhdGtfbmFtZXMgPSBbZiJ7YS5uYW1lfSAoe2EucHR9KSIgZm9yIGEgaW4gYXR0YWNrZXJzXQogICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQXR0YWNrcyAoe21vZGVfbGFiZWx9KTogeycsICcuam9pbihhdGtfbmFtZXMpfSIpCgogICAgICAgICMgUmVzb2x2ZSBibG9ja2luZyBhbmQgZGFtYWdlIChzYW1lIGxvZ2ljIGFzIGJhc2UgZW5naW5lKQogICAgICAgIHNlbGYuX3Jlc29sdmVfZGFtYWdlKHNpbSwgcGksIGF0dGFja2Vycywgb3BwX2Jsb2NrZXJzLCB0dXJuLCBldmVudHMpCgogICAgZGVmIF9yZXNvbHZlX2NvbWJhdF9oZXVyaXN0aWMoCiAgICAgICAgc2VsZiwgc2ltOiBTaW1TdGF0ZSwgcGk6IGludCwgdHVybjogaW50LCBldmVudHM6IGxpc3Rbc3RyXSB8IE5vbmUKICAgICkgLT4gYm9vbDoKICAgICAgICAiIiJIZXVyaXN0aWMgY29tYmF0IChzYW1lIGFzIGJhc2UgR2FtZUVuZ2luZS5fcmVzb2x2ZV9jb21iYXQpLiBSZXR1cm5zIFRydWUgaWYgYXR0YWNrZWQuIiIiCiAgICAgICAgcCA9IHNpbS5wbGF5ZXJzW3BpXQogICAgICAgIG9wcF9pZHggPSAxIC0gcGkKICAgICAgICBvcHAgPSBzaW0ucGxheWVyc1tvcHBfaWR4XQoKICAgICAgICBpZiBvcHAuZWxpbWluYXRlZDoKICAgICAgICAgICAgcmV0dXJu' +
'IEZhbHNlCgogICAgICAgIG15X2NyZWF0dXJlcyA9IFsKICAgICAgICAgICAgYyBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQKICAgICAgICAgICAgaWYgYy5vd25lcl9pZCA9PSBwaSBhbmQgYy5pc19jcmVhdHVyZSgpIGFuZCBub3QgYy50YXBwZWQKICAgICAgICAgICAgYW5kICh0dXJuID4gMCBvciBjLnR1cm5fcGxheWVkICE9IHR1cm4pCiAgICAgICAgXQogICAgICAgIGlmIG5vdCBteV9jcmVhdHVyZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBvcHBfYmxvY2tlcnMgPSBbCiAgICAgICAgICAgIGMgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkCiAgICAgICAgICAgIGlmIGMub3duZXJfaWQgPT0gb3BwX2lkeCBhbmQgYy5pc19jcmVhdHVyZSgpIGFuZCBub3QgYy50YXBwZWQKICAgICAgICBdCgogICAgICAgICMgU2FtZSBhdHRhY2tlciBzZWxlY3Rpb24gYXMgYmFzZSBlbmdpbmUKICAgICAgICBhdHRhY2tlcnMgPSBbXQogICAgICAgIHRvdGFsX215X3Bvd2VyID0gc3VtKGMuZ2V0X3Bvd2VyKCkgZm9yIGMgaW4gbXlfY3JlYXR1cmVzKQogICAgICAgIGZvciBhdGsgaW4gbXlfY3JlYXR1cmVzOgogICAgICAgICAgICBhX3BvdyA9IGF0ay5nZXRfcG93ZXIoKQogICAgICAgICAgICBhX3RvdSA9IGF0ay5nZXRfdG91Z2huZXNzKCkKICAgICAgICAgICAgaGFzX2ZseWluZyA9IGF0ay5oYXNfa2V5d29yZCgiZmx5aW5nIikKICAgICAgICAgICAgaGFzX3RyYW1wbGUgPSBhdGsuaGFzX2tleXdvcmQoInRyYW1wbGUiKQogICAgICAgICAgICBoYXNfaGFzdGUgPSBhdGsuaGFzX2tleXdvcmQoImhhc3RlIikKCiAgICAgICAgICAgIGlmIGhhc19mbHlpbmcgb3IgaGFzX3RyYW1wbGUgb3IgaGFzX2hhc3RlIG9yIGFfcG93ID49IDMgb3Igb3BwLmxpZmUgPD0gdG90YWxfbXlfcG93ZXI6CiAgICAgICAgICAgICAgICBhdHRhY2tlcnMuYXBwZW5kKGF0aykKICAgICAgICAgICAgICAgIGF0ay50YXBwZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgY2FuX2RpZV9wcm9maXRhYmx5ID0gYW55KAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIChub3QgaGFzX2ZseWluZyBvciBiLmhhc19rZXl3b3JkKCJmbHlpbmciKSBvciBiLmhhc19rZXl3b3JkKCJyZWFjaCIpKQogICAgICAgICAgICAgICAgICAgIGFuZCAoYi5nZXRfcG93ZXIoKSA+PSBhX3RvdSBvciBiLmhhc19rZXl3b3JkKCJkZWF0aHRvdWNoIikpCiAgICAgICAgICAgICAgICAgICAgYW5kIGIuZ2V0X3RvdWdobmVzcygpID4gYV9wb3cKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBiIGluIG9wcF9ibG9ja2VycwogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIG5vdCBjYW5fZGllX3Byb2ZpdGFibHkgb3IgcC5saWZlID4gMjU6CiAgICAgICAgICAgICAgICBhdHRhY2tlcnMuYXBwZW5kKGF0aykKICAgICAgICAgICAgICAgIGF0ay50YXBwZWQgPSBUcnVlCgogICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZSBhbmQgYXR0YWNrZXJzOgogICAgICAgICAgICBhdGtfbmFtZXMgPSBbZiJ7YS5uYW1lfSAoe2EucHR9KSIgZm9yIGEgaW4gYXR0YWNrZXJzXQogICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQXR0YWNrcyB3aXRoOiB7JywgJy5qb2luKGF0a19uYW1lcyl9IikKCiAgICAgICAgc2VsZi5fcmVzb2x2ZV9kYW1hZ2Uoc2ltLCBwaSwgYXR0YWNrZXJzLCBvcHBfYmxvY2tlcnMsIHR1cm4sIGV2ZW50cykKICAgICAgICByZXR1cm4gbGVuKGF0dGFja2VycykgPiAwCgogICAgIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICMgRGFtYWdlIHJlc29sdXRpb24gKHNoYXJlZCBieSBib3RoIGNvbWJhdCBtb2RlcykKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZGVmIF9yZXNvbHZlX2RhbWFnZSgKICAgICAgICBzZWxmLCBzaW06IFNpbVN0YXRlLCBwaTogaW50LAog' +
'ICAgICAgIGF0dGFja2VyczogbGlzdFtDYXJkXSwgb3BwX2Jsb2NrZXJzOiBsaXN0W0NhcmRdLAogICAgICAgIHR1cm46IGludCwgZXZlbnRzOiBsaXN0W3N0cl0gfCBOb25lCiAgICApOgogICAgICAgICIiIlJlc29sdmUgYmxvY2tpbmcgYW5kIGNvbWJhdCBkYW1hZ2UuIiIiCiAgICAgICAgcCA9IHNpbS5wbGF5ZXJzW3BpXQogICAgICAgIG9wcF9pZHggPSAxIC0gcGkKICAgICAgICBvcHAgPSBzaW0ucGxheWVyc1tvcHBfaWR4XQogICAgICAgIHcgPSBzZWxmLndlaWdodHMKCiAgICAgICAgdG90YWxfZGFtYWdlID0gMAogICAgICAgIHVzZWRfYmxvY2tlcnM6IHNldFtpbnRdID0gc2V0KCkKICAgICAgICBjb21iYXRfZGV0YWlsczogbGlzdFtzdHJdID0gW10KCiAgICAgICAgZm9yIGF0ayBpbiBhdHRhY2tlcnM6CiAgICAgICAgICAgIGFfcG93ID0gYXRrLmdldF9wb3dlcigpCiAgICAgICAgICAgIGFfdG91ID0gYXRrLmdldF90b3VnaG5lc3MoKQogICAgICAgICAgICBoYXNfZmx5aW5nID0gYXRrLmhhc19rZXl3b3JkKCJmbHlpbmciKQoKICAgICAgICAgICAgdmFsaWRfYmxvY2tlcnMgPSBbCiAgICAgICAgICAgICAgICBiIGZvciBiIGluIG9wcF9ibG9ja2VycwogICAgICAgICAgICAgICAgaWYgYi5pZCBub3QgaW4gdXNlZF9ibG9ja2VycwogICAgICAgICAgICAgICAgYW5kIChub3QgaGFzX2ZseWluZyBvciBiLmhhc19rZXl3b3JkKCJmbHlpbmciKSBvciBiLmhhc19rZXl3b3JkKCJyZWFjaCIpKQogICAgICAgICAgICBdCgogICAgICAgICAgICBibG9ja2VkID0gRmFsc2UKICAgICAgICAgICAgaWYgdmFsaWRfYmxvY2tlcnMgYW5kIG5vdCBhdGsuaGFzX2tleXdvcmQoIm1lbmFjZSIpOgogICAgICAgICAgICAgICAgYmxvY2tlciA9IG5leHQoCiAgICAgICAgICAgICAgICAgICAgKGIgZm9yIGIgaW4gdmFsaWRfYmxvY2tlcnMgaWYgYi5nZXRfdG91Z2huZXNzKCkgPiBhX3BvdyksCiAgICAgICAgICAgICAgICAgICAgTm9uZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGlmIGJsb2NrZXIgaXMgTm9uZSBhbmQgb3BwLmxpZmUgPD0gYV9wb3cgKiAyIGFuZCB2YWxpZF9ibG9ja2VyczoKICAgICAgICAgICAgICAgICAgICBibG9ja2VyID0gdmFsaWRfYmxvY2tlcnNbMF0KCiAgICAgICAgICAgICAgICBpZiBibG9ja2VyOgogICAgICAgICAgICAgICAgICAgIHVzZWRfYmxvY2tlcnMuYWRkKGJsb2NrZXIuaWQpCiAgICAgICAgICAgICAgICAgICAgYl9wb3cgPSBibG9ja2VyLmdldF9wb3dlcigpCiAgICAgICAgICAgICAgICAgICAgYmxvY2tlZCA9IFRydWUKCiAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBjb21iYXRfZGV0YWlscy5hcHBlbmQoZiJ7YXRrLm5hbWV9IGJsb2NrZWQgYnkge2Jsb2NrZXIubmFtZX0iKQoKICAgICAgICAgICAgICAgICAgICBpZiBhX3BvdyA+PSBibG9ja2VyLmdldF90b3VnaG5lc3MoKSBvciBhdGsuaGFzX2tleXdvcmQoImRlYXRodG91Y2giKToKICAgICAgICAgICAgICAgICAgICAgICAgc2ltLmJhdHRsZWZpZWxkID0gW2MgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkIGlmIGMuaWQgIT0gYmxvY2tlci5pZF0KICAgICAgICAgICAgICAgICAgICAgICAgc2ltLnBsYXllcnNbb3BwX2lkeF0uZ3JhdmV5YXJkLmFwcGVuZChibG9ja2VyKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBldmVudHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iYXRfZGV0YWlscy5hcHBlbmQoZiIgIHtibG9ja2VyLm5hbWV9IGRpZXMiKQoKICAgICAgICAgICAgICAgICAgICBpZiBiX3BvdyA+PSBhX3RvdSBvciBibG9ja2VyLmhhc19rZXl3b3JkKCJkZWF0aHRvdWNoIik6CiAgICAgICAgICAgICAgICAgICAgICAgIHNpbS5iYXR0bGVmaWVsZCA9IFtjIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZCBpZiBjLmlkICE9IGF0ay5pZF0KICAgICAgICAgICAgICAgICAgICAgICAgc2ltLnBsYXllcnNbcGldLmdyYXZleWFyZC5hcHBlbmQoYXRrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBldmVudHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iYXRfZGV0YWlscy5hcHBlbmQoZiIgIHthdGsubmFtZX0gZGllcyIpCgogICAgICAgICAgICAgICAgICAgIGlmIGF0ay5oYXNfa2V5d29yZCgidHJhbXBsZSIpIGFuZCBhX3BvdyA+IGJsb2NrZXIuZ2V0X3RvdWdobmVzcygpOgogICAgICAgICAgICAg' +
'ICAgICAgICAgICB0b3RhbF9kYW1hZ2UgKz0gYV9wb3cgLSBibG9ja2VyLmdldF90b3VnaG5lc3MoKQoKICAgICAgICAgICAgICAgICAgICBpZiBhdGsuaGFzX2tleXdvcmQoImxpZmVsaW5rIik6CiAgICAgICAgICAgICAgICAgICAgICAgIHAubGlmZSArPSBtaW4oYV9wb3csIGJsb2NrZXIuZ2V0X3RvdWdobmVzcygpKQoKICAgICAgICAgICAgaWYgbm90IGJsb2NrZWQ6CiAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2UgKz0gYV9wb3cKICAgICAgICAgICAgICAgIGlmIGF0ay5oYXNfa2V5d29yZCgibGlmZWxpbmsiKToKICAgICAgICAgICAgICAgICAgICBwLmxpZmUgKz0gYV9wb3cKCiAgICAgICAgb3BwLmxpZmUgLT0gdG90YWxfZGFtYWdlCiAgICAgICAgcC5zdGF0cy5kYW1hZ2VfZGVhbHQgKz0gdG90YWxfZGFtYWdlCiAgICAgICAgb3BwLnN0YXRzLmRhbWFnZV9yZWNlaXZlZCArPSB0b3RhbF9kYW1hZ2UKCiAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lIGFuZCB0b3RhbF9kYW1hZ2UgPiAwOgogICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiRGVhbHQge3RvdGFsX2RhbWFnZX0gY29tYmF0IGRhbWFnZSB0byB7b3BwLm5hbWV9IChub3cge29wcC5saWZlfSBsaWZlKSIpCiAgICAgICAgICAgIGV2ZW50cy5leHRlbmQoY29tYmF0X2RldGFpbHMpCgogICAgICAgIGlmIG9wcC5saWZlIDw9IDA6CiAgICAgICAgICAgIG9wcC5lbGltaW5hdGVkID0gVHJ1ZQoKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAjIFNoYXJlZCBoZWxwZXJzCiAgICAjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAjIE1MIERlY2lzaW9uIFNuYXBzaG90IENhcHR1cmUKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZGVmIF9jYXB0dXJlX21sX3NuYXBzaG90KHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQsIHR1cm46IGludCkgLT4gZGljdDoKICAgICAgICAiIiIKICAgICAgICBDYXB0dXJlIHRoZSBjdXJyZW50IGdhbWUgc3RhdGUgaW4gdGhlIGZvcm1hdCBleHBlY3RlZCBieSB0aGUgTUwKICAgICAgICB0cmFpbmluZyBwaXBlbGluZSAoZGF0YXNldF9idWlsZGVyIOKGkiBzdGF0ZV9lbmNvZGVyIOKGkiBsYWJlbGVyKS4KCiAgICAgICAgUmV0dXJucyBhIGRpY3QgY29tcGF0aWJsZSB3aXRoIG1sLWRlY2lzaW9ucy0qLmpzb25sIGZvcm1hdC4KICAgICAgICAiIiIKICAgICAgICBwbGF5ZXJzX2RhdGEgPSBbXQogICAgICAgIGZvciBzZWF0IGluIHJhbmdlKDIpOgogICAgICAgICAgICBwID0gc2ltLnBsYXllcnNbc2VhdF0KICAgICAgICAgICAgIyBDb3VudCBjcmVhdHVyZXMgYW5kIGxhbmRzIG9uIGJhdHRsZWZpZWxkCiAgICAgICAgICAgIG15X2NyZWF0dXJlcyA9IHN1bSgKICAgICAgICAgICAgICAgIDEgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkCiAgICAgICAgICAgICAgICBpZiBjLm93bmVyX2lkID09IHNlYXQgYW5kIGMuaXNfY3JlYXR1cmUoKQogICAgICAgICAgICApCiAgICAgICAgICAgIG15X2xhbmRzID0gc3VtKAogICAgICAgICAgICAgICAgMSBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQKICAgICAgICAgICAgICAgIGlmIGMub3duZXJfaWQgPT0gc2VhdCBhbmQgYy5pc19sYW5kKCkKICAgICAgICAgICAg' +
'KQogICAgICAgICAgICBhdmFpbGFibGVfbWFuYSA9IHN1bSgKICAgICAgICAgICAgICAgIDEgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkCiAgICAgICAgICAgICAgICBpZiBjLm93bmVyX2lkID09IHNlYXQgYW5kIG5vdCBjLnRhcHBlZCBhbmQgYy5pc19sYW5kKCkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBDYXJkIG5hbWUgbGlzdHMgZm9yIHpvbmVzIChmb3IgZW1iZWRkaW5nIGxvb2t1cCkKICAgICAgICAgICAgaGFuZF9uYW1lcyA9IFtjLm5hbWUgZm9yIGMgaW4gcC5oYW5kXQogICAgICAgICAgICBncmF2ZXlhcmRfbmFtZXMgPSBbYy5uYW1lIGZvciBjIGluIHAuZ3JhdmV5YXJkXQogICAgICAgICAgICBiYXR0bGVmaWVsZF9uYW1lcyA9IFsKICAgICAgICAgICAgICAgIGMubmFtZSBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQKICAgICAgICAgICAgICAgIGlmIGMub3duZXJfaWQgPT0gc2VhdCBhbmQgbm90IGMuaXNfbGFuZCgpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgIyBDb21tYW5kIHpvbmUg4oCUIG5vdCBleHBsaWNpdGx5IHRyYWNrZWQgaW4gUHl0aG9uIHNpbSwgdXNlIGVtcHR5CiAgICAgICAgICAgIGNvbW1hbmRfem9uZV9uYW1lcyA9IFtdCgogICAgICAgICAgICBwbGF5ZXJzX2RhdGEuYXBwZW5kKHsKICAgICAgICAgICAgICAgICJzZWF0Ijogc2VhdCwKICAgICAgICAgICAgICAgICJsaWZlIjogcC5saWZlLAogICAgICAgICAgICAgICAgIm1hbmEiOiBhdmFpbGFibGVfbWFuYSwKICAgICAgICAgICAgICAgICJjbWRyX2RtZyI6IDAsICAgICAgIyBOb3QgdHJhY2tlZCBpbiBQeXRob24gc2ltCiAgICAgICAgICAgICAgICAiY21kcl90YXgiOiAwLCAgICAgICMgTm90IHRyYWNrZWQgaW4gUHl0aG9uIHNpbQogICAgICAgICAgICAgICAgImNyZWF0dXJlcyI6IG15X2NyZWF0dXJlcywKICAgICAgICAgICAgICAgICJsYW5kcyI6IG15X2xhbmRzLAogICAgICAgICAgICAgICAgImhhbmQiOiBoYW5kX25hbWVzLAogICAgICAgICAgICAgICAgImdyYXZleWFyZCI6IGdyYXZleWFyZF9uYW1lcywKICAgICAgICAgICAgICAgICJiYXR0bGVmaWVsZCI6IGJhdHRsZWZpZWxkX25hbWVzLAogICAgICAgICAgICAgICAgImNvbW1hbmRfem9uZSI6IGNvbW1hbmRfem9uZV9uYW1lcywKICAgICAgICAgICAgfSkKCiAgICAgICAgIyBEZXRlcm1pbmUgZ2FtZSBwaGFzZSDigJQgUHl0aG9uIHNpbSBpcyBzaW1wbGlmaWVkLCB0cmVhdCBhcyBtYWluXzEKICAgICAgICBwaGFzZSA9ICJtYWluXzEiCgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJwaGFzZSI6IHBoYXNlLAogICAgICAgICAgICAiYWN0aXZlX3NlYXQiOiBwaSwKICAgICAgICAgICAgInR1cm4iOiB0dXJuICsgMSwKICAgICAgICAgICAgInBsYXllcnMiOiBwbGF5ZXJzX2RhdGEsCiAgICAgICAgICAgICMgZ2FtZV9pZCwgZ2FtZV9vdXRjb21lLCBhcmNoZXR5cGUsIGFjdGlvbiBhcmUgc2V0IGJ5IGNhbGxlcgogICAgICAgIH0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX21hcF9hY3Rpb25fdG9fbWxfdHlwZShkZWVwc2Vla19hY3Rpb246IHN0ciwgbWFuYV9hdmFpbGFibGU6IGludCA9IDApIC0+IHN0cjoKICAgICAgICAiIiIKICAgICAgICBNYXAgYSBEZWVwU2VlayBicmFpbiBhY3Rpb24gc3RyaW5nIHRvIGFuIE1MIGxhYmVsZXItY29tcGF0aWJsZQogICAgICAgIGFjdGlvbiB0eXBlIHN0cmluZy4KICAgICAgICAiIiIKICAgICAgICBtYXBwaW5nID0gewogICAgICAgICAgICAiY2FzdF9jcmVhdHVyZSI6ICJjYXN0IiwKICAgICAgICAgICAgImNhc3RfcmVtb3ZhbCI6ICJjYXN0IiwKICAgICAgICAgICAgImNhc3RfYm9hcmRfd2lwZSI6ICJjYXN0IiwKICAgICAgICAgICAgImNhc3RfcmFtcCI6ICJjYXN0IiwKICAgICAgICAgICAgImNhc3Rfc3BlbGwiOiAiY2FzdCIsCiAgICAgICAgICAgICJwbGF5X2xhbmQiOiAibGFuZCIsCiAgICAgICAgICAgICJhdHRhY2tfYWxsIjogImF0dGFjayIsCiAgICAgICAgICAgICJhdHRhY2tfc2FmZSI6ICJhdHRhY2siLAogICAgICAgICAgICAiY2FzdF9jb21tYW5kZXIiOiAiY2FzdF9jb21tYW5kZXIiLAogICAgICAgIH0KICAgICAgICBtbF90eXBlID0gbWFwcGluZy5nZXQoZGVlcHNlZWtfYWN0aW9uKQogICAgICAgIGlmIG1sX3R5cGU6CiAgICAgICAgICAgIHJldHVybiBtbF90eXBlCiAgICAgICAgIyBob2xkIC8gdW5rbm93bgogICAgICAgIGlmIGRlZXBzZWVrX2FjdGlvbiA9PSAiaG9sZCIgYW5kIG1hbmFfYXZhaWxhYmxlID49IDI6' +
'CiAgICAgICAgICAgIHJldHVybiAiaG9sZCIKICAgICAgICByZXR1cm4gInBhc3MiCgogICAgZGVmIGZsdXNoX21sX2RlY2lzaW9ucyhzZWxmKSAtPiBsaXN0W2RpY3RdOgogICAgICAgICIiIlJldHVybiBhbmQgY2xlYXIgY29sbGVjdGVkIE1MIGRlY2lzaW9ucy4iIiIKICAgICAgICBkZWNpc2lvbnMgPSBzZWxmLm1sX2RlY2lzaW9uc1s6XQogICAgICAgIHNlbGYubWxfZGVjaXNpb25zLmNsZWFyKCkKICAgICAgICByZXR1cm4gZGVjaXNpb25zCgogICAgZGVmIF9jb3VudF91bnRhcHBlZF9sYW5kcyhzZWxmLCBzaW06IFNpbVN0YXRlLCBwaTogaW50KSAtPiBpbnQ6CiAgICAgICAgcmV0dXJuIHN1bSgKICAgICAgICAgICAgMSBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQKICAgICAgICAgICAgaWYgYy5vd25lcl9pZCA9PSBwaSBhbmQgbm90IGMudGFwcGVkIGFuZCBjLmlzX2xhbmQoKQogICAgICAgICkKCiAgICBkZWYgX2NyZWF0ZV9zdGF0ZSgKICAgICAgICBzZWxmLCBkZWNrX2E6IGxpc3RbQ2FyZF0sIGRlY2tfYjogbGlzdFtDYXJkXSwKICAgICAgICBuYW1lX2E6IHN0ciwgbmFtZV9iOiBzdHIsCiAgICApIC0+IFNpbVN0YXRlOgogICAgICAgIHNpbSA9IFNpbVN0YXRlKG1heF90dXJucz1zZWxmLm1heF90dXJucykKICAgICAgICBmb3IgaWR4LCAoZGVjaywgbmFtZSkgaW4gZW51bWVyYXRlKFsoZGVja19hLCBuYW1lX2EpLCAoZGVja19iLCBuYW1lX2IpXSk6CiAgICAgICAgICAgIGNhcmRzID0gW2VucmljaF9jYXJkKGMuY2xvbmUoKSkgZm9yIGMgaW4gZGVja10KICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUoY2FyZHMpCiAgICAgICAgICAgIGhhbmQgPSBjYXJkc1s6N10KICAgICAgICAgICAgbGlicmFyeSA9IGNhcmRzWzc6XQogICAgICAgICAgICBwbGF5ZXIgPSBQbGF5ZXIoCiAgICAgICAgICAgICAgICBuYW1lPW5hbWUsCiAgICAgICAgICAgICAgICBsaWZlPXNlbGYuc3RhcnRpbmdfbGlmZSwKICAgICAgICAgICAgICAgIG93bmVyX2lkPWlkeCwKICAgICAgICAgICAgICAgIGxpYnJhcnk9bGlicmFyeSwKICAgICAgICAgICAgICAgIGhhbmQ9aGFuZCwKICAgICAgICAgICAgICAgIHN0YXRzPVBsYXllclN0YXRzKGNhcmRzX2RyYXduPTcpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNpbS5wbGF5ZXJzLmFwcGVuZChwbGF5ZXIpCiAgICAgICAgcmV0dXJuIHNpbQoKICAgIGRlZiBfYnVpbGRfcmVzdWx0KAogICAgICAgIHNlbGYsIHNpbTogU2ltU3RhdGUsIGZpbmFsX3R1cm46IGludCwKICAgICAgICBuYW1lX2E6IHN0ciwgbmFtZV9iOiBzdHIsCiAgICApIC0+IEdhbWVSZXN1bHQ6CiAgICAgICAgcGEgPSBzaW0ucGxheWVyc1swXQogICAgICAgIHBiID0gc2ltLnBsYXllcnNbMV0KCiAgICAgICAgaWYgcGEuZWxpbWluYXRlZCBhbmQgbm90IHBiLmVsaW1pbmF0ZWQ6CiAgICAgICAgICAgIHdpbm5lciA9IDEKICAgICAgICBlbGlmIG5vdCBwYS5lbGltaW5hdGVkIGFuZCBwYi5lbGltaW5hdGVkOgogICAgICAgICAgICB3aW5uZXIgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd2lubmVyID0gMCBpZiBwYS5saWZlID49IHBiLmxpZmUgZWxzZSAxCgogICAgICAgIHJldHVybiBHYW1lUmVzdWx0KAogICAgICAgICAgICB3aW5uZXI9d2lubmVyLAogICAgICAgICAgICB0dXJucz1taW4oZmluYWxfdHVybiwgc2ltLm1heF90dXJucyksCiAgICAgICAgICAgIHBsYXllcl9hX25hbWU9bmFtZV9hLAogICAgICAgICAgICBwbGF5ZXJfYV9saWZlPXBhLmxpZmUsCiAgICAgICAgICAgIHBsYXllcl9hX2VsaW1pbmF0ZWQ9cGEuZWxpbWluYXRlZCwKICAgICAgICAgICAgcGxheWVyX2Ffc3RhdHM9cGEuc3RhdHMsCiAgICAgICAgICAgIHBsYXllcl9iX25hbWU9bmFtZV9iLAogICAgICAgICAgICBwbGF5ZXJfYl9saWZlPXBiLmxpZmUsCiAgICAgICAgICAgIHBsYXllcl9iX2VsaW1pbmF0ZWQ9cGIuZWxpbWluYXRlZCwKICAgICAgICAgICAgcGxheWVyX2Jfc3RhdHM9cGIuc3RhdHMsCiAgICAgICAgKQo='
Install-B64 -R 'src\commander_ai_lab\sim\deepseek_engine.py' -B $b
# src/commander_ai_lab/sim/engine.py (18,723 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIEhlYWRsZXNzIEdhbWUgRW5naW5lCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkEgaGVhZGxlc3MgQ29tbWFuZGVyIGdhbWUgc2ltdWxhdG9yIGZvciBNb250ZSBDYXJsbyBhbmFseXNpcy4KRmFpdGhmdWwgcG9ydCBvZiBkdFNpbUdhbWUoKSAvIGR0Q3JlYXRlUGxheWVyKCkgZnJvbSBtdGctY29tbWFuZGVyLWxhbi4KClNpbXVsYXRlcyBzaW1wbGlmaWVkIDF2MSBDb21tYW5kZXIgZ2FtZXM6CiAgLSBEcmF3LCBsYW5kIGRyb3AsIHNwZWxsIGNhc3RpbmcgKHVwIHRvIDIgcGVyIHR1cm4pCiAgLSBBSSBjYXJkIHNjb3JpbmcgZm9yIHBsYXkgcHJpb3JpdHkKICAtIFNpbXBsaWZpZWQgY29tYmF0IHdpdGggZmx5aW5nLCB0cmFtcGxlLCBkZWF0aHRvdWNoLCBsaWZlbGluaywgbWVuYWNlLCByZWFjaAogIC0gQ3JlYXR1cmUgcmVtb3ZhbCBhbmQgYm9hcmQgd2lwZSBoYW5kbGluZwogIC0gV2luIGJ5IGVsaW1pbmF0aW9uIChsaWZlIDw9IDApIG9yIGxpZmUgY29tcGFyaXNvbiBhdCBtYXggdHVybnMKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgcmFuZG9tCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKZnJvbSBjb21tYW5kZXJfYWlfbGFiLnNpbS5tb2RlbHMgaW1wb3J0ICgKICAgIENhcmQsCiAgICBHYW1lUmVzdWx0LAogICAgUGxheWVyLAogICAgUGxheWVyU3RhdHMsCiAgICBTaW1TdGF0ZSwKKQpmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLnJ1bGVzIGltcG9ydCAoCiAgICBBSV9ERUZBVUxUX1dFSUdIVFMsCiAgICBlbnJpY2hfY2FyZCwKICAgIHNjb3JlX2NhcmQsCikKCgpjbGFzcyBHYW1lRW5naW5lOgogICAgIiIiCiAgICBIZWFkbGVzcyBDb21tYW5kZXIgZ2FtZSBlbmdpbmUuCgogICAgVXNhZ2U6OgoKICAgICAgICBlbmdpbmUgPSBHYW1lRW5naW5lKG1heF90dXJucz0yNSkKICAgICAgICByZXN1bHQgPSBlbmdpbmUucnVuKGRlY2tfYSwgZGVja19iLCBuYW1lX2E9IkRlY2sgQSIsIG5hbWVfYj0iRGVjayBCIikKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICBzZWxmLAogICAgICAgIG1heF90dXJuczogaW50ID0gMjUsCiAgICAgICAgc3RhcnRpbmdfbGlmZTogaW50ID0gNDAsCiAgICAgICAgd2VpZ2h0czogT3B0aW9uYWxbZGljdF0gPSBOb25lLAogICAgICAgIHJlY29yZF9sb2c6IGJvb2wgPSBGYWxzZSwKICAgICk6CiAgICAgICAgc2VsZi5tYXhfdHVybnMgPSBtYXhfdHVybnMKICAgICAgICBzZWxmLnN0YXJ0aW5nX2xpZmUgPSBzdGFydGluZ19saWZlCiAgICAgICAgc2VsZi53ZWlnaHRzID0gd2VpZ2h0cyBvciBBSV9ERUZBVUxUX1dFSUdIVFMKICAgICAgICBzZWxmLnJlY29yZF9sb2cgPSByZWNvcmRfbG9nCgogICAgIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICMgUHVibGljIEFQSQogICAgIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBkZWYgcnVuKAogICAgICAgIHNlbGYsCiAgICAgICAgZGVja19hOiBsaXN0W0NhcmRdLAogICAgICAgIGRlY2tfYjogbGlzdFtDYXJkXSwKICAgICAgICBuYW1lX2E6IHN0ciA9ICJQbGF5ZXIgQSIsCiAgICAgICAgbmFtZV9iOiBzdHIgPSAiUGxheWVyIEIiLAogICAgKSAtPiBHYW1lUmVzdWx0OgogICAgICAgICIiIlJ1biBhIHNpbmdsZSBoZWFkbGVzcyBnYW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4iIiIKICAgICAgICBzaW0gPSBzZWxmLl9jcmVhdGVfc3RhdGUoZGVja19hLCBkZWNrX2IsIG5hbWVfYSwgbmFtZV9iKQogICAgICAgIGdhbWVfbG9nOiBsaXN0W2RpY3RdID0gW10gICMgdHVybi1ieS10dXJuIGxvZwoKICAgICAgICBmaW5hbF90dXJuID0gMAogICAgICAgIGZvciB0dXJuIGluIHJhbmdlKHNpbS5tYXhfdHVybnMpOgogICAgICAgICAgICB0dXJuX2VudHJ5ID0geyJ0dXJuIjogdHVybiArIDEsICJwaGFzZXMi' +
'OiBbXX0KCiAgICAgICAgICAgIGZvciBwaSBpbiByYW5nZSgyKToKICAgICAgICAgICAgICAgIHAgPSBzaW0ucGxheWVyc1twaV0KICAgICAgICAgICAgICAgIGlmIHAuZWxpbWluYXRlZDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcC5zdGF0cy50dXJuc19hbGl2ZSArPSAxCiAgICAgICAgICAgICAgICBwaGFzZV9ldmVudHM6IGxpc3Rbc3RyXSA9IFtdCgogICAgICAgICAgICAgICAgIyDilIDilIAgRHJhdyDilIDilIAKICAgICAgICAgICAgICAgIGlmIHAubGlicmFyeToKICAgICAgICAgICAgICAgICAgICBkcmF3biA9IHAubGlicmFyeVstMV0gICMgcGVlayBiZWZvcmUgcG9wCiAgICAgICAgICAgICAgICAgICAgcC5oYW5kLmFwcGVuZChwLmxpYnJhcnkucG9wKCkpCiAgICAgICAgICAgICAgICAgICAgcC5zdGF0cy5jYXJkc19kcmF3biArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmRfbG9nOgogICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV9ldmVudHMuYXBwZW5kKGYiRHJldyB7ZHJhd24ubmFtZX0iKQoKICAgICAgICAgICAgICAgICMg4pSA4pSAIExhbmQgZHJvcCDilIDilIAKICAgICAgICAgICAgICAgIGxhbmRfYmVmb3JlID0gcC5zdGF0cy5sYW5kc19wbGF5ZWQKICAgICAgICAgICAgICAgIHNlbGYuX3BsYXlfbGFuZChzaW0sIHBpKQogICAgICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmRfbG9nIGFuZCBwLnN0YXRzLmxhbmRzX3BsYXllZCA+IGxhbmRfYmVmb3JlOgogICAgICAgICAgICAgICAgICAgICMgRmluZCB3aGF0IGxhbmQgd2FzIGp1c3QgcGxheWVkCiAgICAgICAgICAgICAgICAgICAgbGFzdF9sYW5kID0gbmV4dCgKICAgICAgICAgICAgICAgICAgICAgICAgKGMgZm9yIGMgaW4gcmV2ZXJzZWQoc2ltLmJhdHRsZWZpZWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgYy5vd25lcl9pZCA9PSBwaSBhbmQgYy5pc19sYW5kKCkpLAogICAgICAgICAgICAgICAgICAgICAgICBOb25lLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiBsYXN0X2xhbmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlX2V2ZW50cy5hcHBlbmQoZiJQbGF5ZWQgbGFuZDoge2xhc3RfbGFuZC5uYW1lfSIpCgogICAgICAgICAgICAgICAgIyDilIDilIAgQXZhaWxhYmxlIG1hbmEg4pSA4pSACiAgICAgICAgICAgICAgICBhdmFpbGFibGVfbWFuYSA9IHNlbGYuX2NvdW50X3VudGFwcGVkX2xhbmRzKHNpbSwgcGkpCgogICAgICAgICAgICAgICAgIyDilIDilIAgUGxheSBzcGVsbHMgKHVwIHRvIDIpIOKUgOKUgAogICAgICAgICAgICAgICAgc3BlbGxzX2JlZm9yZSA9IHAuc3RhdHMuc3BlbGxzX2Nhc3QKICAgICAgICAgICAgICAgIHNlbGYuX3BsYXlfc3BlbGxzKHNpbSwgcGksIGF2YWlsYWJsZV9tYW5hLCBwaGFzZV9ldmVudHMgaWYgc2VsZi5yZWNvcmRfbG9nIGVsc2UgTm9uZSkKCiAgICAgICAgICAgICAgICAjIOKUgOKUgCBUcmFjayBib2FyZCBzaXplIOKUgOKUgAogICAgICAgICAgICAgICAgYm9hcmRfc2l6ZSA9IHN1bSgKICAgICAgICAgICAgICAgICAgICAxIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZCBpZiBjLm93bmVyX2lkID09IHBpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBib2FyZF9zaXplID4gcC5zdGF0cy5tYXhfYm9hcmRfc2l6ZToKICAgICAgICAgICAgICAgICAgICBwLnN0YXRzLm1heF9ib2FyZF9zaXplID0gYm9hcmRfc2l6ZQoKICAgICAgICAgICAgICAgICMg4pSA4pSAIENvbWJhdCDilIDilIAKICAgICAgICAgICAgICAgIGNvbWJhdF9iZWZvcmVfbGlmZV9hID0gc2ltLnBsYXllcnNbMF0ubGlmZQogICAgICAgICAgICAgICAgY29tYmF0X2JlZm9yZV9saWZlX2IgPSBzaW0ucGxheWVyc1sxXS5saWZlCiAgICAgICAgICAgICAgICBzZWxmLl9yZXNvbHZlX2NvbWJhdChzaW0sIHBpLCB0dXJuLCBwaGFzZV9ldmVudHMgaWYgc2VsZi5yZWNvcmRfbG9nIGVsc2UgTm9uZSkKCiAgICAgICAgICAgICAgICAjIOKUgOKUgCBVbnRhcCDilIDilIAKICAgICAgICAgICAgICAgIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZDoKICAgICAgICAgICAgICAgICAgICBpZiBjLm93bmVyX2lkID09IHBpOgogICAgICAgICAgICAgICAgICAgICAgICBjLnRhcHBlZCA9IEZhbHNlCgogICAgICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmRfbG9nOgogICAgICAgICAgICAgICAgICAgIHR1cm5fZW50cnlbInBoYXNlcyJdLmFwcGVu' +
'ZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICJwbGF5ZXIiOiBwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICJwbGF5ZXJJZCI6IHBpLAogICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIjogcGhhc2VfZXZlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAibGlmZUFmdGVyIjoge3NpbS5wbGF5ZXJzWzBdLm5hbWU6IHNpbS5wbGF5ZXJzWzBdLmxpZmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltLnBsYXllcnNbMV0ubmFtZTogc2ltLnBsYXllcnNbMV0ubGlmZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICJib2FyZEEiOiBbYy5uYW1lIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZCBpZiBjLm93bmVyX2lkID09IDAgYW5kIGMuaXNfY3JlYXR1cmUoKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICJib2FyZEIiOiBbYy5uYW1lIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZCBpZiBjLm93bmVyX2lkID09IDEgYW5kIGMuaXNfY3JlYXR1cmUoKV0sCiAgICAgICAgICAgICAgICAgICAgfSkKCiAgICAgICAgICAgICMgQ2hlY2sgZ2FtZSBvdmVyCiAgICAgICAgICAgIGFsaXZlID0gW3AgZm9yIHAgaW4gc2ltLnBsYXllcnMgaWYgbm90IHAuZWxpbWluYXRlZF0KICAgICAgICAgICAgZmluYWxfdHVybiA9IHR1cm4gKyAxCiAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkX2xvZzoKICAgICAgICAgICAgICAgIGdhbWVfbG9nLmFwcGVuZCh0dXJuX2VudHJ5KQogICAgICAgICAgICBpZiBsZW4oYWxpdmUpIDw9IDE6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnJlY29yZF9sb2c6CiAgICAgICAgICAgICAgICAgICAgZWxpbV9uYW1lID0gbmV4dCgocC5uYW1lIGZvciBwIGluIHNpbS5wbGF5ZXJzIGlmIHAuZWxpbWluYXRlZCksIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgaWYgZWxpbV9uYW1lOgogICAgICAgICAgICAgICAgICAgICAgICBnYW1lX2xvZ1stMV1bImV2ZW50Il0gPSBmIntlbGltX25hbWV9IGVsaW1pbmF0ZWQhIgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmRfbG9nOgogICAgICAgICAgICAgICAgZ2FtZV9sb2cuYXBwZW5kKHR1cm5fZW50cnkpIGlmIHR1cm5fZW50cnkgbm90IGluIGdhbWVfbG9nIGVsc2UgTm9uZQoKICAgICAgICByZXN1bHQgPSBzZWxmLl9idWlsZF9yZXN1bHQoc2ltLCBmaW5hbF90dXJuLCBuYW1lX2EsIG5hbWVfYikKICAgICAgICBpZiBzZWxmLnJlY29yZF9sb2c6CiAgICAgICAgICAgIHJlc3VsdC5nYW1lX2xvZyA9IGdhbWVfbG9nCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAjIEludGVybmFsIGhlbHBlcnMKICAgICMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZGVmIF9jcmVhdGVfc3RhdGUoCiAgICAgICAgc2VsZiwKICAgICAgICBkZWNrX2E6IGxpc3RbQ2FyZF0sCiAgICAgICAgZGVja19iOiBsaXN0W0NhcmRdLAogICAgICAgIG5hbWVfYTogc3RyLAogICAgICAgIG5hbWVfYjogc3RyLAogICAgKSAtPiBTaW1TdGF0ZToKICAgICAgICAiIiJDcmVhdGUgaW5pdGlhbCBzaW11bGF0aW9uIHN0YXRlIHdpdGggc2h1ZmZsZWQgZGVja3MgYW5kIG9wZW5pbmcgaGFuZHMuIiIiCiAgICAgICAgc2ltID0gU2ltU3RhdGUobWF4X3R1cm5zPXNlbGYubWF4X3R1cm5zKQoKICAgICAgICBmb3IgaWR4LCAoZGVjaywgbmFtZSkgaW4gZW51bWVyYXRlKFsoZGVja19hLCBuYW1lX2EpLCAoZGVja19iLCBuYW1lX2IpXSk6CiAgICAgICAgICAgICMgRW5yaWNoICsgZGVlcCBjb3B5IGNhcmRzCiAgICAgICAgICAgIGNhcmRzID0gW2VucmljaF9jYXJkKGMuY2xvbmUoKSkgZm9yIGMgaW4gZGVja10KICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUoY2FyZHMpCgogICAgICAgICAgICBoYW5kID0gY2FyZHNbOjddCiAgICAgICAgICAgIGxpYnJhcnkgPSBjYXJk' +
'c1s3Ol0KCiAgICAgICAgICAgIHBsYXllciA9IFBsYXllcigKICAgICAgICAgICAgICAgIG5hbWU9bmFtZSwKICAgICAgICAgICAgICAgIGxpZmU9c2VsZi5zdGFydGluZ19saWZlLAogICAgICAgICAgICAgICAgb3duZXJfaWQ9aWR4LAogICAgICAgICAgICAgICAgbGlicmFyeT1saWJyYXJ5LAogICAgICAgICAgICAgICAgaGFuZD1oYW5kLAogICAgICAgICAgICAgICAgc3RhdHM9UGxheWVyU3RhdHMoY2FyZHNfZHJhd249NyksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2ltLnBsYXllcnMuYXBwZW5kKHBsYXllcikKCiAgICAgICAgcmV0dXJuIHNpbQoKICAgIGRlZiBfcGxheV9sYW5kKHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQpIC0+IE5vbmU6CiAgICAgICAgIiIiUGxheSB0aGUgZmlyc3QgbGFuZCBmcm9tIGhhbmQgb250byB0aGUgYmF0dGxlZmllbGQuIiIiCiAgICAgICAgcCA9IHNpbS5wbGF5ZXJzW3BpXQogICAgICAgIGxhbmRfaWR4ID0gLTEKICAgICAgICBmb3IgaSwgY2FyZCBpbiBlbnVtZXJhdGUocC5oYW5kKToKICAgICAgICAgICAgaWYgY2FyZC5pc19sYW5kKCk6CiAgICAgICAgICAgICAgICBsYW5kX2lkeCA9IGkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbGFuZF9pZHggPT0gLTE6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBsYW5kX2NhcmQgPSBwLmhhbmQucG9wKGxhbmRfaWR4KQogICAgICAgIGxhbmRfY2FyZC5vd25lcl9pZCA9IHBpCiAgICAgICAgbGFuZF9jYXJkLnRhcHBlZCA9IEZhbHNlCiAgICAgICAgbGFuZF9jYXJkLmlkID0gc2ltLm5leHRfY2FyZF9pZAogICAgICAgIHNpbS5uZXh0X2NhcmRfaWQgKz0gMQogICAgICAgIHNpbS5iYXR0bGVmaWVsZC5hcHBlbmQobGFuZF9jYXJkKQogICAgICAgIHAuc3RhdHMubGFuZHNfcGxheWVkICs9IDEKCiAgICBkZWYgX2NvdW50X3VudGFwcGVkX2xhbmRzKHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQpIC0+IGludDoKICAgICAgICAiIiJDb3VudCB1bnRhcHBlZCBsYW5kcyBmb3IgYSBwbGF5ZXIuIiIiCiAgICAgICAgcmV0dXJuIHN1bSgKICAgICAgICAgICAgMQogICAgICAgICAgICBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQKICAgICAgICAgICAgaWYgYy5vd25lcl9pZCA9PSBwaSBhbmQgbm90IGMudGFwcGVkIGFuZCBjLmlzX2xhbmQoKQogICAgICAgICkKCiAgICBkZWYgX3BsYXlfc3BlbGxzKHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQsIGF2YWlsYWJsZV9tYW5hOiBpbnQsIGV2ZW50czogbGlzdCB8IE5vbmUgPSBOb25lKSAtPiBOb25lOgogICAgICAgICIiIlBsYXkgdXAgdG8gMiBzcGVsbHMgZnJvbSBoYW5kLCBwcmlvcml0aXplZCBieSBBSSBzY29yZS4iIiIKICAgICAgICBwID0gc2ltLnBsYXllcnNbcGldCiAgICAgICAgdyA9IHNlbGYud2VpZ2h0cwoKICAgICAgICAjIFNjb3JlIHBsYXlhYmxlIG5vbi1sYW5kIGNhcmRzCiAgICAgICAgcGxheWFibGUgPSBbXQogICAgICAgIGZvciBpLCBjYXJkIGluIGVudW1lcmF0ZShwLmhhbmQpOgogICAgICAgICAgICBpZiBjYXJkLmlzX2xhbmQoKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNtYyA9IGNhcmQuY21jIG9yIDAKICAgICAgICAgICAgaWYgY21jIDw9IGF2YWlsYWJsZV9tYW5hOgogICAgICAgICAgICAgICAgcGxheWFibGUuYXBwZW5kKChzY29yZV9jYXJkKGNhcmQsIHcpLCBpLCBjYXJkKSkKCiAgICAgICAgcGxheWFibGUuc29ydChrZXk9bGFtYmRhIHg6IC14WzBdKQoKICAgICAgICBwbGF5ZWQgPSAwCiAgICAgICAgd2hpbGUgcGxheWFibGUgYW5kIHBsYXllZCA8IDI6CiAgICAgICAgICAgIF8sIF8sIGJlc3RfY2FyZCA9IHBsYXlhYmxlLnBvcCgwKQogICAgICAgICAgICBoYW5kX3BvcyA9IC0xCiAgICAgICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShwLmhhbmQpOgogICAgICAgICAgICAgICAgaWYgYyBpcyBiZXN0X2NhcmQ6CiAgICAgICAgICAgICAgICAgICAgaGFuZF9wb3MgPSBpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgaGFuZF9wb3MgPT0gLTE6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgY2FyZCA9IHAuaGFuZC5wb3AoaGFuZF9wb3MpCiAgICAgICAgICAgIGNhcmQub3duZXJfaWQgPSBwaQogICAgICAgICAgICBjYXJkLnRhcHBlZCA9IEZhbHNlCiAgICAgICAgICAgIGNhcmQuaWQgPSBzaW0ubmV4dF9jYXJkX2lkCiAgICAgICAgICAgIHNpbS5uZXh0X2NhcmRfaWQgKz0g' +
'MQogICAgICAgICAgICBjYXJkLnR1cm5fcGxheWVkID0gc2ltLnR1cm4KCiAgICAgICAgICAgICMgUGF5IG1hbmEKICAgICAgICAgICAgbWFuYV9uZWVkZWQgPSBjYXJkLmNtYyBvciAwCiAgICAgICAgICAgIGZvciBiZl9jYXJkIGluIHNpbS5iYXR0bGVmaWVsZDoKICAgICAgICAgICAgICAgIGlmIG1hbmFfbmVlZGVkIDw9IDA6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBiZl9jYXJkLm93bmVyX2lkID09IHBpCiAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBiZl9jYXJkLnRhcHBlZAogICAgICAgICAgICAgICAgICAgIGFuZCBiZl9jYXJkLmlzX2xhbmQoKQogICAgICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgICAgICBiZl9jYXJkLnRhcHBlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBtYW5hX25lZWRlZCAtPSAxCgogICAgICAgICAgICBwLnN0YXRzLm1hbmFfc3BlbnQgKz0gY2FyZC5jbWMgb3IgMAogICAgICAgICAgICBwLnN0YXRzLnNwZWxsc19jYXN0ICs9IDEKCiAgICAgICAgICAgICMgSGFuZGxlIHJlbW92YWwKICAgICAgICAgICAgaWYgY2FyZC5pc19yZW1vdmFsOgogICAgICAgICAgICAgICAgcC5zdGF0cy5yZW1vdmFsX3VzZWQgKz0gMQogICAgICAgICAgICAgICAgb3BwX2NyZWF0dXJlcyA9IFsKICAgICAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkCiAgICAgICAgICAgICAgICAgICAgaWYgYy5vd25lcl9pZCAhPSBwaSBhbmQgYy5pc19jcmVhdHVyZSgpCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICBpZiBvcHBfY3JlYXR1cmVzOgogICAgICAgICAgICAgICAgICAgIG9wcF9jcmVhdHVyZXMuc29ydChrZXk9bGFtYmRhIGM6IC1zY29yZV9jYXJkKGMsIHcpKQogICAgICAgICAgICAgICAgICAgIGtpbGxlZCA9IG9wcF9jcmVhdHVyZXNbMF0KICAgICAgICAgICAgICAgICAgICBzaW0uYmF0dGxlZmllbGQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIGMgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkIGlmIGMuaWQgIT0ga2lsbGVkLmlkCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIHNpbS5wbGF5ZXJzW2tpbGxlZC5vd25lcl9pZF0uZ3JhdmV5YXJkLmFwcGVuZChraWxsZWQpCiAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSAocmVtb3ZhbCkg4oCUIGRlc3Ryb3llZCB7a2lsbGVkLm5hbWV9IikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSAocmVtb3ZhbCwgbm8gdGFyZ2V0cykiKQogICAgICAgICAgICAgICAgcC5ncmF2ZXlhcmQuYXBwZW5kKGNhcmQpCgogICAgICAgICAgICBlbGlmIGNhcmQuaXNfYm9hcmRfd2lwZToKICAgICAgICAgICAgICAgIHAuc3RhdHMuYm9hcmRfd2lwZXNfdXNlZCArPSAxCiAgICAgICAgICAgICAgICB3aXBlZCA9IFtjLm5hbWUgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkIGlmIGMuaXNfY3JlYXR1cmUoKV0KICAgICAgICAgICAgICAgIHN1cnZpdmluZyA9IFtdCiAgICAgICAgICAgICAgICBmb3IgYyBpbiBzaW0uYmF0dGxlZmllbGQ6CiAgICAgICAgICAgICAgICAgICAgaWYgYy5pc19jcmVhdHVyZSgpOgogICAgICAgICAgICAgICAgICAgICAgICBzaW0ucGxheWVyc1tjLm93bmVyX2lkXS5ncmF2ZXlhcmQuYXBwZW5kKGMpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc3Vydml2aW5nLmFwcGVuZChjKQogICAgICAgICAgICAgICAgc2ltLmJhdHRsZWZpZWxkID0gc3Vydml2aW5nCiAgICAgICAgICAgICAgICBwLmdyYXZleWFyZC5hcHBlbmQoY2FyZCkKICAgICAgICAgICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSAoYm9hcmQgd2lwZSkg4oCUIGRlc3Ryb3llZCB7bGVuKHdpcGVkKX0gY3JlYXR1cmVzIikKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaW0uYmF0dGxlZmllbGQuYXBwZW5kKGNhcmQpCiAgICAgICAgICAgICAgICBpZiBjYXJkLmlzX2Ny' +
'ZWF0dXJlKCk6CiAgICAgICAgICAgICAgICAgICAgcC5zdGF0cy5jcmVhdHVyZXNfcGxheWVkICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBldmVudHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZiJDYXN0IHtjYXJkLm5hbWV9ICh7Y2FyZC5wdCBvciAnY3JlYXR1cmUnfSkgZm9yIHtjYXJkLmNtY30gbWFuYSIpCiAgICAgICAgICAgICAgICBlbGlmIGNhcmQuaXNfcmFtcDoKICAgICAgICAgICAgICAgICAgICBwLnN0YXRzLnJhbXBfcGxheWVkICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBldmVudHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZiJDYXN0IHtjYXJkLm5hbWV9IChyYW1wKSBmb3Ige2NhcmQuY21jfSBtYW5hIikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKGYiQ2FzdCB7Y2FyZC5uYW1lfSBmb3Ige2NhcmQuY21jfSBtYW5hIikKCiAgICAgICAgICAgIHBsYXllZCArPSAxCgogICAgICAgICAgICAjIFJlY2FsY3VsYXRlIGF2YWlsYWJsZSBtYW5hIGZvciBuZXh0IHNwZWxsCiAgICAgICAgICAgIGF2YWlsYWJsZV9tYW5hID0gc2VsZi5fY291bnRfdW50YXBwZWRfbGFuZHMoc2ltLCBwaSkKCiAgICBkZWYgX3Jlc29sdmVfY29tYmF0KHNlbGYsIHNpbTogU2ltU3RhdGUsIHBpOiBpbnQsIHR1cm46IGludCwgZXZlbnRzOiBsaXN0IHwgTm9uZSA9IE5vbmUpIC0+IE5vbmU6CiAgICAgICAgIiIiUmVzb2x2ZSBjb21iYXQgcGhhc2UgZm9yIGEgcGxheWVyLiIiIgogICAgICAgIHAgPSBzaW0ucGxheWVyc1twaV0KICAgICAgICBvcHBfaWR4ID0gMSAtIHBpCiAgICAgICAgb3BwID0gc2ltLnBsYXllcnNbb3BwX2lkeF0KICAgICAgICB3ID0gc2VsZi53ZWlnaHRzCgogICAgICAgIGlmIG9wcC5lbGltaW5hdGVkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBNeSBjcmVhdHVyZXMgdGhhdCBjYW4gYXR0YWNrIChub3QgdGFwcGVkLCBub3Qgc3VtbW9uaW5nIHNpY2spCiAgICAgICAgbXlfY3JlYXR1cmVzID0gWwogICAgICAgICAgICBjCiAgICAgICAgICAgIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBjLm93bmVyX2lkID09IHBpCiAgICAgICAgICAgICAgICBhbmQgYy5pc19jcmVhdHVyZSgpCiAgICAgICAgICAgICAgICBhbmQgbm90IGMudGFwcGVkCiAgICAgICAgICAgICAgICBhbmQgKHR1cm4gPiAwIG9yIGMudHVybl9wbGF5ZWQgIT0gdHVybikKICAgICAgICAgICAgKQogICAgICAgIF0KICAgICAgICBpZiBub3QgbXlfY3JlYXR1cmVzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgb3BwX2Jsb2NrZXJzID0gWwogICAgICAgICAgICBjCiAgICAgICAgICAgIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBjLm93bmVyX2lkID09IG9wcF9pZHgKICAgICAgICAgICAgICAgIGFuZCBjLmlzX2NyZWF0dXJlKCkKICAgICAgICAgICAgICAgIGFuZCBub3QgYy50YXBwZWQKICAgICAgICAgICAgKQogICAgICAgIF0KCiAgICAgICAgIyDilIDilIAgRGVjaWRlIGF0dGFja2VycyDilIDilIAKICAgICAgICAjIEFnZ3Jlc3NpdmUgc3RyYXRlZ3k6IGF0dGFjayB3aXRoIG1vc3QgY3JlYXR1cmVzLgogICAgICAgICMgT25seSBob2xkIGJhY2sgc21hbGwgY3JlYXR1cmVzIChwb3dlciA8IDMpIHdoZW4gb3Bwb25lbnQgaGFzCiAgICAgICAgIyBibG9ja2VycyB0aGF0IHdvdWxkIHByb2ZpdGFibHkgdHJhZGUgQU5EIHdlIGhhdmUgcGxlbnR5IG9mIGxpZmUuCiAgICAgICAgYXR0YWNrZXJzID0gW10KICAgICAgICB0b3RhbF9teV9wb3dlciA9IHN1bShjLmdldF9wb3dlcigpIGZvciBjIGluIG15X2NyZWF0dXJlcykKICAgICAgICBmb3IgYXRrIGluIG15X2NyZWF0dXJlczoKICAgICAgICAgICAgYV9wb3cgPSBhdGsuZ2V0X3Bvd2VyKCkKICAgICAgICAgICAgYV90b3UgPSBhdGsuZ2V0X3RvdWdobmVzcygpCiAgICAgICAgICAgIGhhc19mbHlpbmcgPSBhdGsuaGFzX2tleXdvcmQoImZseWluZyIpCiAgICAgICAgICAgIGhhc190cmFtcGxlID0gYXRrLmhhc19rZXl3b3JkKCJ0cmFtcGxlIikKICAgICAgICAgICAgaGFzX2hhc3RlID0gYXRrLmhhc19rZXl3b3JkKCJoYXN0ZSIpCgogICAgICAgICAg' +
'ICAjIEFsd2F5cyBhdHRhY2sgd2l0aCBldmFzaW9uLCBiaWcgY3JlYXR1cmVzLCBvciBpZiBvcHBvbmVudCBpcyBsb3cKICAgICAgICAgICAgaWYgaGFzX2ZseWluZyBvciBoYXNfdHJhbXBsZSBvciBoYXNfaGFzdGUgb3IgYV9wb3cgPj0gMyBvciBvcHAubGlmZSA8PSB0b3RhbF9teV9wb3dlcjoKICAgICAgICAgICAgICAgIGF0dGFja2Vycy5hcHBlbmQoYXRrKQogICAgICAgICAgICAgICAgYXRrLnRhcHBlZCA9IFRydWUKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIEZvciBzbWFsbCBjcmVhdHVyZXMsIGNoZWNrIGlmIGEgcHJvZml0YWJsZSBibG9jayBleGlzdHMKICAgICAgICAgICAgY2FuX2RpZV9wcm9maXRhYmx5ID0gYW55KAogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIChub3QgaGFzX2ZseWluZyBvciBiLmhhc19rZXl3b3JkKCJmbHlpbmciKSBvciBiLmhhc19rZXl3b3JkKCJyZWFjaCIpKQogICAgICAgICAgICAgICAgICAgIGFuZCAoYi5nZXRfcG93ZXIoKSA+PSBhX3RvdSBvciBiLmhhc19rZXl3b3JkKCJkZWF0aHRvdWNoIikpCiAgICAgICAgICAgICAgICAgICAgYW5kIGIuZ2V0X3RvdWdobmVzcygpID4gYV9wb3cgICMgYmxvY2tlciBzdXJ2aXZlcyA9IGJhZCB0cmFkZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIGIgaW4gb3BwX2Jsb2NrZXJzCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBBdHRhY2sgdW5sZXNzIHdlJ2QgbG9zZSB0aGUgY3JlYXR1cmUgZm9yIG5vdGhpbmcgQU5EIHdlJ3JlIGhlYWx0aHkKICAgICAgICAgICAgaWYgbm90IGNhbl9kaWVfcHJvZml0YWJseSBvciBwLmxpZmUgPiAyNToKICAgICAgICAgICAgICAgIGF0dGFja2Vycy5hcHBlbmQoYXRrKQogICAgICAgICAgICAgICAgYXRrLnRhcHBlZCA9IFRydWUKCiAgICAgICAgaWYgZXZlbnRzIGlzIG5vdCBOb25lIGFuZCBhdHRhY2tlcnM6CiAgICAgICAgICAgIGF0a19uYW1lcyA9IFtmInthLm5hbWV9ICh7YS5wdH0pIiBmb3IgYSBpbiBhdHRhY2tlcnNdCiAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZiJBdHRhY2tzIHdpdGg6IHsnLCAnLmpvaW4oYXRrX25hbWVzKX0iKQoKICAgICAgICAjIOKUgOKUgCBCbG9ja2luZyBhbmQgZGFtYWdlIOKUgOKUgAogICAgICAgIHRvdGFsX2RhbWFnZSA9IDAKICAgICAgICB1c2VkX2Jsb2NrZXJzOiBzZXRbaW50XSA9IHNldCgpCiAgICAgICAgY29tYmF0X2RldGFpbHM6IGxpc3Rbc3RyXSA9IFtdCgogICAgICAgIGZvciBhdGsgaW4gYXR0YWNrZXJzOgogICAgICAgICAgICBhX3BvdyA9IGF0ay5nZXRfcG93ZXIoKQogICAgICAgICAgICBhX3RvdSA9IGF0ay5nZXRfdG91Z2huZXNzKCkKICAgICAgICAgICAgaGFzX2ZseWluZyA9IGF0ay5oYXNfa2V5d29yZCgiZmx5aW5nIikKCiAgICAgICAgICAgIHZhbGlkX2Jsb2NrZXJzID0gWwogICAgICAgICAgICAgICAgYgogICAgICAgICAgICAgICAgZm9yIGIgaW4gb3BwX2Jsb2NrZXJzCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgYi5pZCBub3QgaW4gdXNlZF9ibG9ja2VycwogICAgICAgICAgICAgICAgICAgIGFuZCAobm90IGhhc19mbHlpbmcgb3IgYi5oYXNfa2V5d29yZCgiZmx5aW5nIikgb3IgYi5oYXNfa2V5d29yZCgicmVhY2giKSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgXQoKICAgICAgICAgICAgYmxvY2tlZCA9IEZhbHNlCiAgICAgICAgICAgIGlmIHZhbGlkX2Jsb2NrZXJzIGFuZCBub3QgYXRrLmhhc19rZXl3b3JkKCJtZW5hY2UiKToKICAgICAgICAgICAgICAgICMgVHJ5IHRvIGZpbmQgYSBibG9ja2VyIHRoYXQgc3Vydml2ZXMKICAgICAgICAgICAgICAgIGJsb2NrZXIgPSBuZXh0KAogICAgICAgICAgICAgICAgICAgIChiIGZvciBiIGluIHZhbGlkX2Jsb2NrZXJzIGlmIGIuZ2V0X3RvdWdobmVzcygpID4gYV9wb3cpLAogICAgICAgICAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAjIElmIGxpZmUgaXMgY3JpdGljYWwsIGNodW1wIGJsb2NrCiAgICAgICAgICAgICAgICBpZiBibG9ja2VyIGlzIE5vbmUgYW5kIG9wcC5saWZlIDw9IGFfcG93ICogMiBhbmQgdmFsaWRfYmxvY2tlcnM6CiAgICAgICAgICAgICAgICAgICAgYmxvY2tlciA9IHZhbGlkX2Jsb2NrZXJzWzBdCgogICAgICAgICAgICAgICAgaWYgYmxvY2tlcjoKICAgICAgICAgICAgICAgICAgICB1c2VkX2Jsb2NrZXJzLmFkZChibG9ja2VyLmlkKQog' +
'ICAgICAgICAgICAgICAgICAgIGJfcG93ID0gYmxvY2tlci5nZXRfcG93ZXIoKQogICAgICAgICAgICAgICAgICAgIGJsb2NrZWQgPSBUcnVlCgogICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgY29tYmF0X2RldGFpbHMuYXBwZW5kKGYie2F0ay5uYW1lfSBibG9ja2VkIGJ5IHtibG9ja2VyLm5hbWV9IikKCiAgICAgICAgICAgICAgICAgICAgIyBBdHRhY2tlciBraWxscyBibG9ja2VyPwogICAgICAgICAgICAgICAgICAgIGlmIGFfcG93ID49IGJsb2NrZXIuZ2V0X3RvdWdobmVzcygpIG9yIGF0ay5oYXNfa2V5d29yZCgiZGVhdGh0b3VjaCIpOgogICAgICAgICAgICAgICAgICAgICAgICBzaW0uYmF0dGxlZmllbGQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjIGZvciBjIGluIHNpbS5iYXR0bGVmaWVsZCBpZiBjLmlkICE9IGJsb2NrZXIuaWQKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICBzaW0ucGxheWVyc1tvcHBfaWR4XS5ncmF2ZXlhcmQuYXBwZW5kKGJsb2NrZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJhdF9kZXRhaWxzLmFwcGVuZChmIiAge2Jsb2NrZXIubmFtZX0gZGllcyIpCgogICAgICAgICAgICAgICAgICAgICMgQmxvY2tlciBraWxscyBhdHRhY2tlcj8KICAgICAgICAgICAgICAgICAgICBpZiBiX3BvdyA+PSBhX3RvdSBvciBibG9ja2VyLmhhc19rZXl3b3JkKCJkZWF0aHRvdWNoIik6CiAgICAgICAgICAgICAgICAgICAgICAgIHNpbS5iYXR0bGVmaWVsZCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgZm9yIGMgaW4gc2ltLmJhdHRsZWZpZWxkIGlmIGMuaWQgIT0gYXRrLmlkCiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgc2ltLnBsYXllcnNbcGldLmdyYXZleWFyZC5hcHBlbmQoYXRrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBldmVudHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iYXRfZGV0YWlscy5hcHBlbmQoZiIgIHthdGsubmFtZX0gZGllcyIpCgogICAgICAgICAgICAgICAgICAgICMgVHJhbXBsZSBvdmVyZmxvdwogICAgICAgICAgICAgICAgICAgIGlmIGF0ay5oYXNfa2V5d29yZCgidHJhbXBsZSIpIGFuZCBhX3BvdyA+IGJsb2NrZXIuZ2V0X3RvdWdobmVzcygpOgogICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9kYW1hZ2UgKz0gYV9wb3cgLSBibG9ja2VyLmdldF90b3VnaG5lc3MoKQoKICAgICAgICAgICAgICAgICAgICAjIExpZmVsaW5rCiAgICAgICAgICAgICAgICAgICAgaWYgYXRrLmhhc19rZXl3b3JkKCJsaWZlbGluayIpOgogICAgICAgICAgICAgICAgICAgICAgICBwLmxpZmUgKz0gbWluKGFfcG93LCBibG9ja2VyLmdldF90b3VnaG5lc3MoKSkKCiAgICAgICAgICAgIGlmIG5vdCBibG9ja2VkOgogICAgICAgICAgICAgICAgdG90YWxfZGFtYWdlICs9IGFfcG93CiAgICAgICAgICAgICAgICBpZiBhdGsuaGFzX2tleXdvcmQoImxpZmVsaW5rIik6CiAgICAgICAgICAgICAgICAgICAgcC5saWZlICs9IGFfcG93CgogICAgICAgIG9wcC5saWZlIC09IHRvdGFsX2RhbWFnZQogICAgICAgIHAuc3RhdHMuZGFtYWdlX2RlYWx0ICs9IHRvdGFsX2RhbWFnZQogICAgICAgIG9wcC5zdGF0cy5kYW1hZ2VfcmVjZWl2ZWQgKz0gdG90YWxfZGFtYWdlCgogICAgICAgIGlmIGV2ZW50cyBpcyBub3QgTm9uZSBhbmQgdG90YWxfZGFtYWdlID4gMDoKICAgICAgICAgICAgZXZlbnRzLmFwcGVuZChmIkRlYWx0IHt0b3RhbF9kYW1hZ2V9IGNvbWJhdCBkYW1hZ2UgdG8ge29wcC5uYW1lfSAobm93IHtvcHAubGlmZX0gbGlmZSkiKQogICAgICAgICAgICBldmVudHMuZXh0ZW5kKGNvbWJhdF9kZXRhaWxzKQoKICAgICAgICBpZiBvcHAubGlmZSA8PSAwOgogICAgICAgICAgICBvcHAuZWxpbWluYXRlZCA9IFRydWUKCiAgICBkZWYgX2J1aWxkX3Jlc3VsdCgKICAgICAgICBzZWxmLAogICAgICAgIHNpbTogU2ltU3RhdGUsCiAgICAgICAgZmluYWxfdHVybjogaW50LAogICAgICAgIG5hbWVfYTogc3RyLAogICAgICAgIG5hbWVfYjogc3RyLAogICAgKSAtPiBHYW1lUmVzdWx0OgogICAgICAgICIiIkRldGVybWluZSB3aW5uZXIgYW5kIGJ1aWxkIHJlc3VsdCBvYmplY3QuIiIiCiAgICAgICAgcGEgPSBzaW0u' +
'cGxheWVyc1swXQogICAgICAgIHBiID0gc2ltLnBsYXllcnNbMV0KCiAgICAgICAgaWYgcGEuZWxpbWluYXRlZCBhbmQgbm90IHBiLmVsaW1pbmF0ZWQ6CiAgICAgICAgICAgIHdpbm5lciA9IDEKICAgICAgICBlbGlmIG5vdCBwYS5lbGltaW5hdGVkIGFuZCBwYi5lbGltaW5hdGVkOgogICAgICAgICAgICB3aW5uZXIgPSAwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBCb3RoIGFsaXZlIG9yIGJvdGggZGVhZDogY29tcGFyZSBsaWZlCiAgICAgICAgICAgIHdpbm5lciA9IDAgaWYgcGEubGlmZSA+PSBwYi5saWZlIGVsc2UgMQoKICAgICAgICByZXR1cm4gR2FtZVJlc3VsdCgKICAgICAgICAgICAgd2lubmVyPXdpbm5lciwKICAgICAgICAgICAgdHVybnM9bWluKGZpbmFsX3R1cm4sIHNpbS5tYXhfdHVybnMpLAogICAgICAgICAgICBwbGF5ZXJfYV9uYW1lPW5hbWVfYSwKICAgICAgICAgICAgcGxheWVyX2FfbGlmZT1wYS5saWZlLAogICAgICAgICAgICBwbGF5ZXJfYV9lbGltaW5hdGVkPXBhLmVsaW1pbmF0ZWQsCiAgICAgICAgICAgIHBsYXllcl9hX3N0YXRzPXBhLnN0YXRzLAogICAgICAgICAgICBwbGF5ZXJfYl9uYW1lPW5hbWVfYiwKICAgICAgICAgICAgcGxheWVyX2JfbGlmZT1wYi5saWZlLAogICAgICAgICAgICBwbGF5ZXJfYl9lbGltaW5hdGVkPXBiLmVsaW1pbmF0ZWQsCiAgICAgICAgICAgIHBsYXllcl9iX3N0YXRzPXBiLnN0YXRzLAogICAgICAgICkK'
Install-B64 -R 'src\commander_ai_lab\sim\engine.py' -B $b
# src/commander_ai_lab/sim/models.py (5,548 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFNpbXVsYXRvciBNb2RlbHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkRhdGEgY2xhc3NlcyBmb3IgQ2FyZCwgUGxheWVyLCBQbGF5ZXJTdGF0cywgYW5kIFNpbVN0YXRlLgpQb3J0ZWQgZnJvbSBtdGctY29tbWFuZGVyLWxhbiBKYXZhU2NyaXB0IChkdENyZWF0ZVBsYXllciwgZHRTaW1HYW1lIHN0cnVjdHMpLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCmltcG9ydCBjb3B5CmltcG9ydCBqc29uCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcywgZmllbGQKZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCgoKQGRhdGFjbGFzcwpjbGFzcyBDYXJkOgogICAgIiIiQSBzaW5nbGUgY2FyZCBpbiB0aGUgc2ltdWxhdGlvbi4iIiIKCiAgICBuYW1lOiBzdHIgPSAiIgogICAgdHlwZV9saW5lOiBzdHIgPSAiIgogICAgb3JhY2xlX3RleHQ6IHN0ciA9ICIiCiAgICBjbWM6IGludCA9IDAKICAgIHB0OiBzdHIgPSAiIiAgIyBlLmcuICIzLzQiCiAgICBtYW5hX2Nvc3Q6IHN0ciA9ICIiCiAgICBwb3dlcjogc3RyID0gIiIKICAgIHRvdWdobmVzczogc3RyID0gIiIKICAgIGNvbG9yX2lkZW50aXR5OiBsaXN0W3N0cl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKICAgIGtleXdvcmRzOiBsaXN0W3N0cl0gPSBmaWVsZChkZWZhdWx0X2ZhY3Rvcnk9bGlzdCkKCiAgICAjIEZ1bmN0aW9uYWwgZmxhZ3MgKHNldCBieSBlbnJpY2hfY2FyZCkKICAgIGlzX3JhbXA6IGJvb2wgPSBGYWxzZQogICAgaXNfcmVtb3ZhbDogYm9vbCA9IEZhbHNlCiAgICBpc19ib2FyZF93aXBlOiBib29sID0gRmFsc2UKICAgIGlzX2NvbW1hbmRlcjogYm9vbCA9IEZhbHNlCgogICAgIyBSdW50aW1lIGZpZWxkcyAoc2V0IGR1cmluZyBnYW1lKQogICAgaWQ6IGludCA9IDAKICAgIG93bmVyX2lkOiBpbnQgPSAtMQogICAgdGFwcGVkOiBib29sID0gRmFsc2UKICAgIHR1cm5fcGxheWVkOiBpbnQgPSAtMQoKICAgIGRlZiBnZXRfcG93ZXIoc2VsZikgLT4gaW50OgogICAgICAgICIiIkV4dHJhY3QgbnVtZXJpYyBwb3dlciBmcm9tIHB0IHN0cmluZy4iIiIKICAgICAgICBpZiBzZWxmLnBvd2VyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gaW50KHNlbGYucG93ZXIpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBpZiBub3Qgc2VsZi5wdDoKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBwYXJ0cyA9IHNlbGYucHQuc3BsaXQoIi8iKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGludChwYXJ0c1swXSkKICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEluZGV4RXJyb3IpOgogICAgICAgICAgICByZXR1cm4gMAoKICAgIGRlZiBnZXRfdG91Z2huZXNzKHNlbGYpIC0+IGludDoKICAgICAgICAiIiJFeHRyYWN0IG51bWVyaWMgdG91Z2huZXNzIGZyb20gcHQgc3RyaW5nLiIiIgogICAgICAgIGlmIHNlbGYudG91Z2huZXNzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gaW50KHNlbGYudG91Z2huZXNzKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgaWYgbm90IHNlbGYucHQ6CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgcGFydHMgPSBzZWxmLnB0LnNwbGl0KCIvIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBpbnQocGFydHNbMV0pCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYgaGFzX2tleXdvcmQoc2VsZiwga3c6IHN0cikgLT4gYm9vbDoKICAgICAgICAiIiJDaGVjayBpZiBjYXJkIGhhcyBhIGtleXdvcmQgKGNoZWNrcyBrZXl3b3JkcyBsaXN0IGFuZCBvcmFjbGUgdGV4dCkuIiIiCiAgICAgICAga3dfbG93ZXIgPSBrdy5sb3dlcigpCiAgICAgICAgaWYgc2VsZi5rZXl3b3JkcyBhbmQgYW55KGsubG93ZXIoKSA9PSBrd19sb3dlciBmb3IgayBpbiBzZWxmLmtleXdvcmRzKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4ga3dfbG93ZXIgaW4gKHNlbGYub3JhY2xlX3RleHQgb3IgIiIpLmxvd2VyKCkKCiAgICBkZWYgaXNfbGFuZChzZWxmKSAtPiBib29sOgogICAgICAgIHJldHVybiBib29sKHNlbGYudHlwZV9saW5lIGFuZCAibGFuZCIgaW4gc2VsZi50' +
'eXBlX2xpbmUubG93ZXIoKSkKCiAgICBkZWYgaXNfY3JlYXR1cmUoc2VsZikgLT4gYm9vbDoKICAgICAgICByZXR1cm4gYm9vbChzZWxmLnR5cGVfbGluZSBhbmQgImNyZWF0dXJlIiBpbiBzZWxmLnR5cGVfbGluZS5sb3dlcigpKQoKICAgIGRlZiBjbG9uZShzZWxmKSAtPiAiQ2FyZCI6CiAgICAgICAgIiIiUmV0dXJuIGEgZGVlcCBjb3B5IG9mIHRoaXMgY2FyZC4iIiIKICAgICAgICByZXR1cm4gY29weS5kZWVwY29weShzZWxmKQoKCkBkYXRhY2xhc3MKY2xhc3MgUGxheWVyU3RhdHM6CiAgICAiIiJQZXItZ2FtZSBzdGF0aXN0aWNzIHRyYWNrZWQgZm9yIGEgcGxheWVyLiIiIgoKICAgIGNhcmRzX2RyYXduOiBpbnQgPSA3ICAjIHN0YXJ0aW5nIGhhbmQKICAgIGxhbmRzX3BsYXllZDogaW50ID0gMAogICAgc3BlbGxzX2Nhc3Q6IGludCA9IDAKICAgIGNyZWF0dXJlc19wbGF5ZWQ6IGludCA9IDAKICAgIHJlbW92YWxfdXNlZDogaW50ID0gMAogICAgYm9hcmRfd2lwZXNfdXNlZDogaW50ID0gMAogICAgcmFtcF9wbGF5ZWQ6IGludCA9IDAKICAgIGRhbWFnZV9kZWFsdDogaW50ID0gMAogICAgZGFtYWdlX3JlY2VpdmVkOiBpbnQgPSAwCiAgICBtYXhfYm9hcmRfc2l6ZTogaW50ID0gMAogICAgdHVybnNfYWxpdmU6IGludCA9IDAKICAgIG1hbmFfc3BlbnQ6IGludCA9IDAKCiAgICBkZWYgdG9fZGljdChzZWxmKSAtPiBkaWN0OgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJjYXJkc0RyYXduIjogc2VsZi5jYXJkc19kcmF3biwKICAgICAgICAgICAgImxhbmRzUGxheWVkIjogc2VsZi5sYW5kc19wbGF5ZWQsCiAgICAgICAgICAgICJzcGVsbHNDYXN0Ijogc2VsZi5zcGVsbHNfY2FzdCwKICAgICAgICAgICAgImNyZWF0dXJlc1BsYXllZCI6IHNlbGYuY3JlYXR1cmVzX3BsYXllZCwKICAgICAgICAgICAgInJlbW92YWxVc2VkIjogc2VsZi5yZW1vdmFsX3VzZWQsCiAgICAgICAgICAgICJib2FyZFdpcGVzVXNlZCI6IHNlbGYuYm9hcmRfd2lwZXNfdXNlZCwKICAgICAgICAgICAgInJhbXBQbGF5ZWQiOiBzZWxmLnJhbXBfcGxheWVkLAogICAgICAgICAgICAiZGFtYWdlRGVhbHQiOiBzZWxmLmRhbWFnZV9kZWFsdCwKICAgICAgICAgICAgImRhbWFnZVJlY2VpdmVkIjogc2VsZi5kYW1hZ2VfcmVjZWl2ZWQsCiAgICAgICAgICAgICJtYXhCb2FyZFNpemUiOiBzZWxmLm1heF9ib2FyZF9zaXplLAogICAgICAgICAgICAidHVybnNBbGl2ZSI6IHNlbGYudHVybnNfYWxpdmUsCiAgICAgICAgICAgICJtYW5hU3BlbnQiOiBzZWxmLm1hbmFfc3BlbnQsCiAgICAgICAgfQoKCkBkYXRhY2xhc3MKY2xhc3MgUGxheWVyOgogICAgIiIiQSBwbGF5ZXIgaW4gdGhlIGhlYWRsZXNzIHNpbXVsYXRpb24uIiIiCgogICAgbmFtZTogc3RyID0gIiIKICAgIGxpZmU6IGludCA9IDQwCiAgICBlbGltaW5hdGVkOiBib29sID0gRmFsc2UKICAgIG93bmVyX2lkOiBpbnQgPSAwCgogICAgIyBab25lcwogICAgbGlicmFyeTogbGlzdFtDYXJkXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgaGFuZDogbGlzdFtDYXJkXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgZ3JhdmV5YXJkOiBsaXN0W0NhcmRdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBleGlsZTogbGlzdFtDYXJkXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQoKICAgIHN0YXRzOiBQbGF5ZXJTdGF0cyA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1QbGF5ZXJTdGF0cykKCgpAZGF0YWNsYXNzCmNsYXNzIFNpbVN0YXRlOgogICAgIiIiRnVsbCBzaW11bGF0aW9uIHN0YXRlIGZvciBhIGhlYWRsZXNzIGdhbWUuIiIiCgogICAgcGxheWVyczogbGlzdFtQbGF5ZXJdID0gZmllbGQoZGVmYXVsdF9mYWN0b3J5PWxpc3QpCiAgICBiYXR0bGVmaWVsZDogbGlzdFtDYXJkXSA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KQogICAgdHVybjogaW50ID0gMAogICAgbWF4X3R1cm5zOiBpbnQgPSAyNQogICAgbmV4dF9jYXJkX2lkOiBpbnQgPSA5MDAwMAoKCkBkYXRhY2xhc3MKY2xhc3MgR2FtZVJlc3VsdDoKICAgICIiIlJlc3VsdCBvZiBhIHNpbmdsZSBzaW11bGF0ZWQgZ2FtZS4iIiIKCiAgICB3aW5uZXI6IGludCA9IC0xICAjIDAgb3IgMSAocGxheWVyIGluZGV4KSwgLTEgPSBkcmF3CiAgICB0dXJuczogaW50ID0gMAogICAgcGxheWVyX2FfbmFtZTogc3RyID0gIiIKICAgIHBsYXllcl9hX2xpZmU6IGludCA9IDAKICAgIHBsYXllcl9hX2VsaW1pbmF0ZWQ6IGJvb2wgPSBG' +
'YWxzZQogICAgcGxheWVyX2Ffc3RhdHM6IE9wdGlvbmFsW1BsYXllclN0YXRzXSA9IE5vbmUKICAgIHBsYXllcl9iX25hbWU6IHN0ciA9ICIiCiAgICBwbGF5ZXJfYl9saWZlOiBpbnQgPSAwCiAgICBwbGF5ZXJfYl9lbGltaW5hdGVkOiBib29sID0gRmFsc2UKICAgIHBsYXllcl9iX3N0YXRzOiBPcHRpb25hbFtQbGF5ZXJTdGF0c10gPSBOb25lCiAgICBnYW1lX2xvZzogbGlzdCA9IGZpZWxkKGRlZmF1bHRfZmFjdG9yeT1saXN0KSAgIyB0dXJuLWJ5LXR1cm4gbG9nIChwb3B1bGF0ZWQgd2hlbiByZWNvcmRfbG9nPVRydWUpCgogICAgZGVmIHRvX2RpY3Qoc2VsZikgLT4gZGljdDoKICAgICAgICBkID0gewogICAgICAgICAgICAid2lubmVyIjogc2VsZi53aW5uZXIsCiAgICAgICAgICAgICJ0dXJucyI6IHNlbGYudHVybnMsCiAgICAgICAgICAgICJwbGF5ZXJBIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnBsYXllcl9hX25hbWUsCiAgICAgICAgICAgICAgICAibGlmZSI6IHNlbGYucGxheWVyX2FfbGlmZSwKICAgICAgICAgICAgICAgICJlbGltaW5hdGVkIjogc2VsZi5wbGF5ZXJfYV9lbGltaW5hdGVkLAogICAgICAgICAgICAgICAgInN0YXRzIjogc2VsZi5wbGF5ZXJfYV9zdGF0cy50b19kaWN0KCkgaWYgc2VsZi5wbGF5ZXJfYV9zdGF0cyBlbHNlIHt9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAicGxheWVyQiI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi5wbGF5ZXJfYl9uYW1lLAogICAgICAgICAgICAgICAgImxpZmUiOiBzZWxmLnBsYXllcl9iX2xpZmUsCiAgICAgICAgICAgICAgICAiZWxpbWluYXRlZCI6IHNlbGYucGxheWVyX2JfZWxpbWluYXRlZCwKICAgICAgICAgICAgICAgICJzdGF0cyI6IHNlbGYucGxheWVyX2Jfc3RhdHMudG9fZGljdCgpIGlmIHNlbGYucGxheWVyX2Jfc3RhdHMgZWxzZSB7fSwKICAgICAgICAgICAgfSwKICAgICAgICB9CiAgICAgICAgaWYgc2VsZi5nYW1lX2xvZzoKICAgICAgICAgICAgZFsiZ2FtZUxvZyJdID0gc2VsZi5nYW1lX2xvZwogICAgICAgIHJldHVybiBkCg=='
Install-B64 -R 'src\commander_ai_lab\sim\models.py' -B $b
# src/commander_ai_lab/sim/rules.py (9,475 bytes)
$b = 'IiIiCkNvbW1hbmRlciBBSSBMYWIg4oCUIFNpbXVsYXRvciBSdWxlcyAmIEhlbHBlcnMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpBSSB3ZWlnaHRzLCBjYXJkIGVucmljaG1lbnQgaGV1cmlzdGljcywgYW5kIHNjb3JpbmcgZnVuY3Rpb25zLgpQb3J0ZWQgZnJvbSBtdGctY29tbWFuZGVyLWxhbiBKYXZhU2NyaXB0IChBSV9ERUZBVUxUX1dFSUdIVFMsCmVucmljaENhcmRGb3JTaW0sIGhlYWRsZXNzU2NvcmVDYXJkLCBoZWFkbGVzc0dldFBvd2VyL1RvdWdobmVzcy9IYXNLdykuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhbm5vdGF0aW9ucwoKaW1wb3J0IHJlCmltcG9ydCByYW5kb20KZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCgpmcm9tIGNvbW1hbmRlcl9haV9sYWIuc2ltLm1vZGVscyBpbXBvcnQgQ2FyZAoKCiMg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiMgQUkgV2VpZ2h0cyAocG9ydGVkIGZyb20gQUlfREVGQVVMVF9XRUlHSFRTIGluIGFwcC5qcykKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCkFJX0RFRkFVTFRfV0VJR0hUUzogZGljdFtzdHIsIGZsb2F0XSA9IHsKICAgICMgQ2FyZCBzY29yaW5nCiAgICAiY2FyZF9iYXNlQ21jUGVuYWx0eSI6IDEuMCwKICAgICJjYXJkX3B0Qm9udXMiOiAxLjAsCiAgICAjIEtleXdvcmQgd2VpZ2h0cwogICAgImt3X2ZseWluZyI6IDIuNSwKICAgICJrd19oYXN0ZSI6IDIuNSwKICAgICJrd19kZWF0aHRvdWNoIjogMi41LAogICAgImt3X2RvdWJsZVN0cmlrZSI6IDMuMCwKICAgICJrd19maXJzdFN0cmlrZSI6IDEuNSwKICAgICJrd19saWZlbGluayI6IDEuNSwKICAgICJrd190cmFtcGxlIjogMS41LAogICAgImt3X2hleHByb29mIjogMi4wLAogICAgImt3X2luZGVzdHJ1Y3RpYmxlIjogMy4wLAogICAgImt3X21lbmFjZSI6IDEuNSwKICAgICJrd192aWdpbGFuY2UiOiAxLjAsCiAgICAia3dfcmVhY2giOiAwLjUsCiAgICAia3dfaW5mZWN0IjogMy4wLAogICAgImt3X3RveGljIjogMi4wLAogICAgImt3X2FubmloaWxhdG9yIjogNC4wLAogICAgImt3X2Nhc2NhZGUiOiAzLjAsCiAgICAia3dfdW5keWluZyI6IDIuMCwKICAgICJrd19wZXJzaXN0IjogMi4wLAogICAgImt3X3Byb3dlc3MiOiAxLjUsCiAgICAia3dfd2FyZCI6IDEuNSwKICAgICJrd19mbGFzaCI6IDEuMCwKICAgICJrd19kZWZlbmRlciI6IC0yLjAsCiAgICAia3dfZGVmYXVsdCI6IDAuNSwKICAgICMgVHJpZ2dlcmVkIGFiaWxpdHkgYm9udXNlcwogICAgInRyaWdfZXRiIjogMi4wLAogICAgInRyaWdfYXR0YWNrIjogMS41LAogICAgInRyaWdfZGllcyI6IDEuMCwKICAgICJ0cmlnX290aGVyIjogMC41LAogICAgIyBBY3RpdmF0ZWQgYWJpbGl0eSBib251cwogICAgImFjdGl2YXRlZF9ib251cyI6IDEuMCwKICAgICMgU3BlbGwgdHlwZSB3ZWlnaHRzCiAgICAic3BlbGxfZGVzdHJveSI6IDUuMCwKICAgICJzcGVsbF9kcmF3IjogMy4wLAogICAgInNwZWxsX2NvdW50ZXIiOiA0LjAsCiAgICAic3BlbGxfZ3JhdmV5YXJkIjogMi4wLAogICAgInNwZWxsX3NlYXJjaCI6IDIuMCwKICAgICJzcGVsbF9yYW1wIjogNi4wLAogICAgInNwZWxsX2VxdWlwbWVudCI6IDQuMCwKICAgICJzcGVsbF9lbmNoYW50bWVudCI6IDMuMCwKICAgICJzcGVsbF9mbGFzaCI6IDIuMCwKICAgICJzcGVsbF9jYXNjYWRlIjogMy4wLAp9CgoKIyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKIyBDYXJkIEVucmljaG1lbnQg4oCUIGd1ZXNzIHR5cGUvY29zdCBm' +
'b3IgY2FyZHMgd2l0aG91dCBTY3J5ZmFsbCBkYXRhCiMgUG9ydGVkIGZyb20gZW5yaWNoQ2FyZEZvclNpbSgpIGluIGRlY2tfdGVzdGVyX2pzLnR4dAojIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKX0JBU0lDX0xBTkRfQ09MT1JTID0gewogICAgInBsYWlucyI6ICJXIiwKICAgICJpc2xhbmQiOiAiVSIsCiAgICAic3dhbXAiOiAiQiIsCiAgICAibW91bnRhaW4iOiAiUiIsCiAgICAiZm9yZXN0IjogIkciLAp9CgpfS05PV05fQ0FSRFM6IGxpc3RbdHVwbGVbcmUuUGF0dGVybiwgZGljdF1dID0gWwogICAgIyBBcnRpZmFjdHMgLyByYW1wCiAgICAocmUuY29tcGlsZShyIl5zb2wgcmluZyQiLCByZS5JKSwgeyJ0eXBlX2xpbmUiOiAiQXJ0aWZhY3QiLCAiY21jIjogMSwgIm9yYWNsZV90ZXh0IjogIntUfTogQWRkIHtDfXtDfSIsICJpc19yYW1wIjogVHJ1ZX0pLAogICAgKHJlLmNvbXBpbGUociJhcmNhbmUgc2lnbmV0fGZlbGx3YXIgc3RvbmV8dGFsaXNtYW58c2lnbmV0IiwgcmUuSSksIHsidHlwZV9saW5lIjogIkFydGlmYWN0IiwgImNtYyI6IDIsICJvcmFjbGVfdGV4dCI6ICJ7VH06IEFkZCBvbmUgbWFuYSIsICJpc19yYW1wIjogVHJ1ZX0pLAogICAgKHJlLmNvbXBpbGUociJjb21tYW5kZXIuP3Mgc3BoZXJlIiwgcmUuSSksIHsidHlwZV9saW5lIjogIkFydGlmYWN0IiwgImNtYyI6IDMsICJvcmFjbGVfdGV4dCI6ICJ7VH06IEFkZCBvbmUgbWFuYSIsICJpc19yYW1wIjogVHJ1ZX0pLAogICAgIyBJbnN0YW50IHJlbW92YWwKICAgIChyZS5jb21waWxlKHIic3dvcmRzIHRvIHBsb3dzaGFyZXN8cGF0aCB0byBleGlsZSIsIHJlLkkpLCB7InR5cGVfbGluZSI6ICJJbnN0YW50IiwgImNtYyI6IDEsICJvcmFjbGVfdGV4dCI6ICJFeGlsZSB0YXJnZXQgY3JlYXR1cmUuIiwgImlzX3JlbW92YWwiOiBUcnVlfSksCiAgICAocmUuY29tcGlsZShyImJlYXN0IHdpdGhpbnxjaGFvcyB3YXJwfGdlbmVyb3VzIGdpZnQiLCByZS5JKSwgeyJ0eXBlX2xpbmUiOiAiSW5zdGFudCIsICJjbWMiOiAzLCAib3JhY2xlX3RleHQiOiAiRGVzdHJveSB0YXJnZXQgcGVybWFuZW50LiIsICJpc19yZW1vdmFsIjogVHJ1ZX0pLAogICAgKHJlLmNvbXBpbGUociJtdXJkZXJ8Z28gZm9yIHRoZSB0aHJvYXR8aGVyby4/cyBkb3duZmFsbCIsIHJlLkkpLCB7InR5cGVfbGluZSI6ICJJbnN0YW50IiwgImNtYyI6IDMsICJvcmFjbGVfdGV4dCI6ICJEZXN0cm95IHRhcmdldCBjcmVhdHVyZS4iLCAiaXNfcmVtb3ZhbCI6IFRydWV9KSwKICAgIChyZS5jb21waWxlKHIiY291bnRlcnNwZWxsfG5lZ2F0ZXxhcmNhbmUgZGVuaWFsIiwgcmUuSSksIHsidHlwZV9saW5lIjogIkluc3RhbnQiLCAiY21jIjogMiwgIm9yYWNsZV90ZXh0IjogIkNvdW50ZXIgdGFyZ2V0IHNwZWxsLiIsICJpc19yZW1vdmFsIjogVHJ1ZX0pLAogICAgIyBCb2FyZCB3aXBlcwogICAgKHJlLmNvbXBpbGUociJ3cmF0aCBvZiBnb2R8ZGFtbmF0aW9ufGJsYXNwaGVtb3VzIGFjdHxkYXkgb2YganVkZ21lbnR8ZmFyZXdlbGx8dG94aWMgZGVsdWdlIiwgcmUuSSksIHsidHlwZV9saW5lIjogIlNvcmNlcnkiLCAiY21jIjogNCwgIm9yYWNsZV90ZXh0IjogIkRlc3Ryb3kgYWxsIGNyZWF0dXJlcy4iLCAiaXNfYm9hcmRfd2lwZSI6IFRydWV9KSwKICAgICMgUmFtcCBzb3JjZXJpZXMKICAgIChyZS5jb21waWxlKHIicmFtcGFudCBncm93dGh8bmF0dXJlLj9zIGxvcmUiLCByZS5JKSwgeyJ0eXBlX2xpbmUiOiAiU29yY2VyeSIsICJjbWMiOiAyLCAib3JhY2xlX3RleHQiOiAiU2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSBiYXNpYyBsYW5kLiIsICJpc19yYW1wIjogVHJ1ZX0pLAogICAgKHJlLmNvbXBpbGUociJjdWx0aXZhdGV8a29kYW1hLj9zIHJlYWNoIiwgcmUuSSksIHsidHlwZV9saW5lIjogIlNvcmNlcnkiLCAiY21jIjogMywgIm9yYWNsZV90ZXh0IjogIlNlYXJjaCB5b3VyIGxpYnJhcnkgZm9yIHR3byBiYXNpYyBsYW5kcy4iLCAiaXNfcmFtcCI6IFRydWV9KSwKICAgIChyZS5jb21waWxlKHIiZmFyc2Vla3x0aHJlZSB2aXNpdHMiLCByZS5JKSwgeyJ0eXBlX2xpbmUiOiAiU29yY2VyeSIsICJjbWMiOiAyLCAib3JhY2xlX3RleHQiOiAiU2Vh' +
'cmNoIHlvdXIgbGlicmFyeSBmb3IgYSBsYW5kLiIsICJpc19yYW1wIjogVHJ1ZX0pLAogICAgIyBEcmF3CiAgICAocmUuY29tcGlsZShyImhhcm1vbml6ZXxjb25jZW50cmF0ZSIsIHJlLkkpLCB7InR5cGVfbGluZSI6ICJTb3JjZXJ5IiwgImNtYyI6IDQsICJvcmFjbGVfdGV4dCI6ICJEcmF3IHRocmVlIGNhcmRzLiJ9KSwKXQoKCmRlZiBlbnJpY2hfY2FyZChjYXJkOiBDYXJkKSAtPiBDYXJkOgogICAgIiIiCiAgICBFbnJpY2ggYSBjYXJkIHdpdGggdHlwZS9jb3N0IGhldXJpc3RpY3MgaWYgaXQgbGFja3MgU2NyeWZhbGwgZGF0YS4KICAgIEFsc28gc2V0cyBjb21iYXQgZmxhZ3MgKGlzX3JlbW92YWwsIGlzX3JhbXAsIGlzX2JvYXJkX3dpcGUpIGZyb20gb3JhY2xlIHRleHQuCiAgICBNb2RpZmllcyB0aGUgY2FyZCBpbi1wbGFjZSBhbmQgcmV0dXJucyBpdC4KICAgICIiIgogICAgbmFtZV9sb3dlciA9IChjYXJkLm5hbWUgb3IgIiIpLmxvd2VyKCkuc3RyaXAoKQoKICAgIGhhc19yZWFsX2RhdGEgPSBjYXJkLmNtYyA+IDAgb3IgKGNhcmQudHlwZV9saW5lIGFuZCBsZW4oY2FyZC50eXBlX2xpbmUpID4gNSkKCiAgICBpZiBub3QgaGFzX3JlYWxfZGF0YToKICAgICAgICAjIEJhc2ljIGxhbmRzCiAgICAgICAgaWYgbmFtZV9sb3dlciBpbiBfQkFTSUNfTEFORF9DT0xPUlM6CiAgICAgICAgICAgIGNvbG9yID0gX0JBU0lDX0xBTkRfQ09MT1JTW25hbWVfbG93ZXJdCiAgICAgICAgICAgIGNhcmQudHlwZV9saW5lID0gZiJCYXNpYyBMYW5kIC0ge2NhcmQubmFtZX0iCiAgICAgICAgICAgIGNhcmQub3JhY2xlX3RleHQgPSAie3tUfX06IEFkZCB7e3tjb2xvcn19fSIuZm9ybWF0KGNvbG9yPWNvbG9yKQogICAgICAgICAgICBjYXJkLmNtYyA9IDAKICAgICAgICAgICAgX2FwcGx5X29yYWNsZV9mbGFncyhjYXJkKQogICAgICAgICAgICByZXR1cm4gY2FyZAoKICAgICAgICAjIEtub3duIGNhcmQgcGF0dGVybnMKICAgICAgICBmb3IgcGF0dGVybiwgYXR0cnMgaW4gX0tOT1dOX0NBUkRTOgogICAgICAgICAgICBpZiBwYXR0ZXJuLnNlYXJjaChjYXJkLm5hbWUpOgogICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNhcmQsIGssIHYpCiAgICAgICAgICAgICAgICBfYXBwbHlfb3JhY2xlX2ZsYWdzKGNhcmQpCiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZAoKICAgICAgICAjIERlZmF1bHQ6IHRyZWF0IGFzIGNyZWF0dXJlIHdpdGggcmFuZG9tIENNQwogICAgICAgIGlmIG5vdCBjYXJkLnR5cGVfbGluZSBvciBsZW4oY2FyZC50eXBlX2xpbmUpIDwgMzoKICAgICAgICAgICAgZXN0aW1hdGVkX2NtYyA9IHJhbmRvbS5yYW5kaW50KDIsIDYpCiAgICAgICAgICAgIGVzdGltYXRlZF9wb3cgPSBtYXgoMSwgZXN0aW1hdGVkX2NtYyAtIDEpCiAgICAgICAgICAgIGNhcmQudHlwZV9saW5lID0gIkNyZWF0dXJlIgogICAgICAgICAgICBjYXJkLmNtYyA9IGVzdGltYXRlZF9jbWMKICAgICAgICAgICAgY2FyZC5wdCA9IGYie2VzdGltYXRlZF9wb3d9L3tlc3RpbWF0ZWRfcG93fSIKICAgICAgICAgICAgY2FyZC5wb3dlciA9IHN0cihlc3RpbWF0ZWRfcG93KQogICAgICAgICAgICBjYXJkLnRvdWdobmVzcyA9IHN0cihlc3RpbWF0ZWRfcG93KQoKICAgICMgQWx3YXlzIGFwcGx5IG9yYWNsZS10ZXh0LWJhc2VkIGZsYWdzCiAgICBfYXBwbHlfb3JhY2xlX2ZsYWdzKGNhcmQpCiAgICByZXR1cm4gY2FyZAoKCmRlZiBfYXBwbHlfb3JhY2xlX2ZsYWdzKGNhcmQ6IENhcmQpIC0+IE5vbmU6CiAgICAiIiJTZXQgaXNfcmVtb3ZhbCwgaXNfcmFtcCwgaXNfYm9hcmRfd2lwZSBmcm9tIG9yYWNsZV90ZXh0IGFuZCB0eXBlX2xpbmUuIiIiCiAgICBvcmFjbGUgPSAoY2FyZC5vcmFjbGVfdGV4dCBvciAiIikubG93ZXIoKQogICAgdHlwZV9saW5lID0gKGNhcmQudHlwZV9saW5lIG9yICIiKS5sb3dlcigpCgogICAgIyBTa2lwIGlmIGZsYWdzIGFyZSBhbHJlYWR5IGV4cGxpY2l0bHkgc2V0CiAgICBpZiBub3QgY2FyZC5pc19yZW1vdmFsIGFuZCBub3QgY2FyZC5pc19ib2FyZF93aXBlIGFuZCBub3QgY2FyZC5pc19yYW1wOgogICAgICAgICMgQm9hcmQgd2lwZXMKICAgICAgICBpZiBhbnkocGhyYXNlIGluIG9yYWNsZSBmb3IgcGhyYXNlIGluIFsKICAgICAgICAgICAgImRlc3Ryb3kgYWxsIGNyZWF0dXJlIiwgImRlc3Ryb3kgYWxsIHBlcm1hbmVudCIsCiAgICAgICAgICAgICJhbGwgY3JlYXR1cmVzIGdldCAtIiwg' +
'ImV4aWxlIGFsbCBjcmVhdHVyZSIsCiAgICAgICAgICAgICJlYWNoIGNyZWF0dXJlIGdldHMgLSIsICJkZWFscyAxMyBkYW1hZ2UgdG8gZWFjaCBjcmVhdHVyZSIsCiAgICAgICAgXSk6CiAgICAgICAgICAgIGNhcmQuaXNfYm9hcmRfd2lwZSA9IFRydWUKICAgICAgICAjIFJlbW92YWwKICAgICAgICBlbGlmIGFueShwaHJhc2UgaW4gb3JhY2xlIGZvciBwaHJhc2UgaW4gWwogICAgICAgICAgICAiZGVzdHJveSB0YXJnZXQiLCAiZXhpbGUgdGFyZ2V0IGNyZWF0dXJlIiwgImV4aWxlIHRhcmdldCBwZXJtYW5lbnQiLAogICAgICAgICAgICAiZGVhbHMgZGFtYWdlIHRvIHRhcmdldCIsICJ0YXJnZXQgY3JlYXR1cmUgZ2V0cyAtIiwKICAgICAgICAgICAgImNvdW50ZXIgdGFyZ2V0IHNwZWxsIiwgInJldHVybiB0YXJnZXQiLAogICAgICAgIF0pOgogICAgICAgICAgICBjYXJkLmlzX3JlbW92YWwgPSBUcnVlCgogICAgICAgICMgUmFtcAogICAgICAgIGlmIGFueShwaHJhc2UgaW4gb3JhY2xlIGZvciBwaHJhc2UgaW4gWwogICAgICAgICAgICAic2VhcmNoIHlvdXIgbGlicmFyeSBmb3IgYSBiYXNpYyBsYW5kIiwKICAgICAgICAgICAgInNlYXJjaCB5b3VyIGxpYnJhcnkgZm9yIGEgbGFuZCIsCiAgICAgICAgICAgICJhZGQgb25lIG1hbmEiLCAiYWRkIHtjfXtjfSIsICJhZGQge2N9IiwKICAgICAgICAgICAgImFkZCBvbmUgbWFuYSBvZiBhbnkgY29sb3IiLAogICAgICAgIF0pIG9yICgKICAgICAgICAgICAgImxhbmQiIGluIG9yYWNsZSBhbmQgIm9udG8gdGhlIGJhdHRsZWZpZWxkIiBpbiBvcmFjbGUKICAgICAgICApIG9yICgKICAgICAgICAgICAgInt0fTogYWRkIiBpbiBvcmFjbGUgYW5kICJsYW5kIiBub3QgaW4gdHlwZV9saW5lCiAgICAgICAgKToKICAgICAgICAgICAgY2FyZC5pc19yYW1wID0gVHJ1ZQoKCmRlZiBzY29yZV9jYXJkKGNhcmQ6IENhcmQsIHdlaWdodHM6IE9wdGlvbmFsW2RpY3RdID0gTm9uZSkgLT4gZmxvYXQ6CiAgICAiIiIKICAgIFNjb3JlIGEgY2FyZCBmb3IgQUkgcGxheSBwcmlvcml0eS4KICAgIFBvcnRlZCBmcm9tIGhlYWRsZXNzU2NvcmVDYXJkKCkgaW4gYXBwLmpzLgogICAgIiIiCiAgICB3ID0gd2VpZ2h0cyBvciBBSV9ERUZBVUxUX1dFSUdIVFMKICAgIGNtYyA9IGNhcmQuY21jIG9yIDAKICAgIHNjb3JlID0gMTAuMCAtIGNtYyAqIHcuZ2V0KCJjYXJkX2Jhc2VDbWNQZW5hbHR5IiwgMS4wKQoKICAgIGlmIGNhcmQucHQ6CiAgICAgICAgcGFydHMgPSBjYXJkLnB0LnNwbGl0KCIvIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHAgPSBpbnQocGFydHNbMF0pCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcCA9IDAKICAgICAgICB0cnk6CiAgICAgICAgICAgIHQgPSBpbnQocGFydHNbMV0pCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgdCA9IDAKICAgICAgICBzY29yZSArPSAocCArIHQpICogdy5nZXQoImNhcmRfcHRCb251cyIsIDEuMCkKCiAgICB0ZXh0ID0gKGNhcmQub3JhY2xlX3RleHQgb3IgIiIpLmxvd2VyKCkKICAgIGlmICJmbHlpbmciIGluIHRleHQ6CiAgICAgICAgc2NvcmUgKz0gdy5nZXQoImt3X2ZseWluZyIsIDIuNSkKICAgIGlmICJkZWF0aHRvdWNoIiBpbiB0ZXh0OgogICAgICAgIHNjb3JlICs9IHcuZ2V0KCJrd19kZWF0aHRvdWNoIiwgMi41KQogICAgaWYgImhhc3RlIiBpbiB0ZXh0OgogICAgICAgIHNjb3JlICs9IHcuZ2V0KCJrd19oYXN0ZSIsIDIuNSkKICAgIGlmICJ0cmFtcGxlIiBpbiB0ZXh0OgogICAgICAgIHNjb3JlICs9IHcuZ2V0KCJrd190cmFtcGxlIiwgMS41KQogICAgaWYgImxpZmVsaW5rIiBpbiB0ZXh0OgogICAgICAgIHNjb3JlICs9IHcuZ2V0KCJrd19saWZlbGluayIsIDEuNSkKCiAgICBpZiBjYXJkLmlzX3JhbXA6CiAgICAgICAgc2NvcmUgKz0gdy5nZXQoInNwZWxsX3JhbXAiLCA2LjApCiAgICBpZiBjYXJkLmlzX3JlbW92YWw6CiAgICAgICAgc2NvcmUgKz0gdy5nZXQoInNwZWxsX2Rlc3Ryb3kiLCA1LjApCgogICAgcmV0dXJuIHNjb3JlCgoKZGVmIHBhcnNlX2RlY2tsaXN0KHRleHQ6IHN0cikgLT4gbGlzdFtDYXJkXToKICAgICIiIgogICAgUGFyc2UgYSBzaW1wbGUgZGVja2xpc3QgKG9uZSBwZXIgbGluZTogJzEgTGlnaHRuaW5nIEJvbHQnIG9yICdMaWdodG5pbmcgQm9sdCcpLgogICAgUmV0dXJucyBhIGxpc3Qgb2YgQ2FyZCBvYmplY3RzIChub3QgeWV0IGVucmljaGVkKS4K' +
'ICAgICIiIgogICAgY2FyZHM6IGxpc3RbQ2FyZF0gPSBbXQogICAgZm9yIGxpbmUgaW4gdGV4dC5zdHJpcCgpLnNwbGl0bGluZXMoKToKICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCIvLyIpIG9yIGxpbmUuc3RhcnRzd2l0aCgiIyIpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIG0gPSByZS5tYXRjaChyIl4oXGQrKVxzKyguKykkIiwgbGluZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBxdHkgPSBpbnQobS5ncm91cCgxKSkKICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMikuc3RyaXAoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHF0eSA9IDEKICAgICAgICAgICAgbmFtZSA9IGxpbmUKICAgICAgICBmb3IgXyBpbiByYW5nZShxdHkpOgogICAgICAgICAgICBjYXJkcy5hcHBlbmQoQ2FyZChuYW1lPW5hbWUpKQogICAgcmV0dXJuIGNhcmRzCg=='
Install-B64 -R 'src\commander_ai_lab\sim\rules.py' -B $b
# src/main/java/commanderailab/ai/AiPolicy.java (1,225 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5haTsKCi8qKgogKiBBaVBvbGljeSDigJQgQWJzdHJhY3Rpb24gZm9yIEFJIGRlY2lzaW9uLW1ha2luZyBpbiBDb21tYW5kZXIuCiAqCiAqIHYxIHVzZXMgRm9yZ2UncyBidWlsdC1pbiBBSSwgYnV0IHRoaXMgaW50ZXJmYWNlIGFsbG93cyBzd2FwcGluZyBpbgogKiBjdXN0b20gaGV1cmlzdGljIG9yIGxlYXJuZWQgcG9saWNpZXMgaW4gdjIrLgogKgogKiBUaGUgcG9saWN5IHNjb3JlcyBhY3Rpb25zIGJhc2VkIG9uIHdlaWdodGVkIGZlYXR1cmVzOgogKiAgIC0gQ2FyZCBhZHZhbnRhZ2UKICogICAtIFRlbXBvIC8gbWFuYSBlZmZpY2llbmN5CiAqICAgLSBUaHJlYXQgc2NvcmluZyBwZXIgb3Bwb25lbnQKICogICAtIEJhc2ljIGNvbWJhdCBsb2dpYwogKi8KcHVibGljIGludGVyZmFjZSBBaVBvbGljeSB7CgogICAgLyoqCiAgICAgKiBVbmlxdWUgbmFtZSBvZiB0aGlzIHBvbGljeSAoZS5nLiwgImZvcmdlLWJ1aWx0aW4iLCAidXRpbGl0eS12MSIpLgogICAgICovCiAgICBTdHJpbmcgZ2V0TmFtZSgpOwoKICAgIC8qKgogICAgICogV2VpZ2h0IGZvciBjYXJkLWFkdmFudGFnZSBoZXVyaXN0aWMgKDAuMOKAkzEuMCkuCiAgICAgKi8KICAgIGRvdWJsZSBnZXRDYXJkQWR2YW50YWdlV2VpZ2h0KCk7CgogICAgLyoqCiAgICAgKiBXZWlnaHQgZm9yIHRlbXBvL21hbmEtZWZmaWNpZW5jeSBoZXVyaXN0aWMgKDAuMOKAkzEuMCkuCiAgICAgKi8KICAgIGRvdWJsZSBnZXRUZW1wb1dlaWdodCgpOwoKICAgIC8qKgogICAgICogV2VpZ2h0IGZvciB0aHJlYXQgc2NvcmluZyBwZXIgb3Bwb25lbnQgKDAuMOKAkzEuMCkuCiAgICAgKi8KICAgIGRvdWJsZSBnZXRUaHJlYXRTY29yaW5nV2VpZ2h0KCk7CgogICAgLyoqCiAgICAgKiBXZWlnaHQgZm9yIGNvbWJhdC1vdXRjb21lIGV2YWx1YXRpb24gKDAuMOKAkzEuMCkuCiAgICAgKi8KICAgIGRvdWJsZSBnZXRDb21iYXRXZWlnaHQoKTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBwb2xpY3kgZGVsZWdhdGVzIHRvIEZvcmdlJ3MgYnVpbHQtaW4gQUkuCiAgICAgKiBXaGVuIHRydWUsIHRoZSBiYXRjaCBydW5uZXIgdXNlcyBGb3JnZSdzIHNpbSBtb2RlIGRpcmVjdGx5LgogICAgICogV2hlbiBmYWxzZSwgZGVjaXNpb25zIGFyZSBpbnRlcmNlcHRlZCBieSBCcmlkZ2VQbGF5ZXJDb250cm9sbGVyLgogICAgICovCiAgICBib29sZWFuIHVzZXNGb3JnZUJ1aWx0aW5BaSgpOwp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\ai\AiPolicy.java' -B $b
# src/main/java/commanderailab/ai/AiProfile.java (12,200 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5haTsKCmltcG9ydCBqYXZhLnV0aWwuKjsKCi8qKgogKiBBaVByb2ZpbGUg4oCUIENvbmZpZ3VyYWJsZSBBSSBiZWhhdmlvciBwcm9maWxlIGZvciBDb21tYW5kZXIgc2ltdWxhdGlvbnMuCiAqCiAqIEVhY2ggcHJvZmlsZSBkZWZpbmVzIGEgc2V0IG9mIGhldXJpc3RpYyB3ZWlnaHRzIHRoYXQgaW5mbHVlbmNlIGhvdyB0aGUKICogRm9yZ2UgQUkgZXZhbHVhdGVzIGRlY2lzaW9ucy4gVGhlc2UgbWFwIHRvIEZvcmdlJ3MgaW50ZXJuYWwgQUkgdHVuaW5nCiAqIHBhcmFtZXRlcnMgd2hlcmUgYXZhaWxhYmxlLCBhbmQgdG8gb3VyIG93biBwb3N0LXByb2Nlc3NpbmcgaGV1cmlzdGljcy4KICoKICogdjIgRGVzaWduOgogKiAgIC0gUHJvZmlsZXMgYXJlIHNlcmlhbGl6YWJsZSB0by9mcm9tIEpTT04gZm9yIHN0b3JhZ2UgYW5kIFVJIHNlbGVjdGlvbgogKiAgIC0gQnVpbHQtaW4gcHJlc2V0czogREVGQVVMVCwgQUdHUk8sIENPTlRST0wsIENPTUJPLCBNSURSQU5HRQogKiAgIC0gQ3VzdG9tIHByb2ZpbGVzIGNhbiBvdmVycmlkZSBhbnkgd2VpZ2h0CiAqICAgLSBXZWlnaHRzIGFyZSBub3JtYWxpemVkIDAuMCDigJMgMS4wICgwID0gaWdub3JlLCAxID0gbWF4aW11bSBwcmlvcml0eSkKICovCnB1YmxpYyBjbGFzcyBBaVByb2ZpbGUgewoKICAgIC8vIOKUgOKUgCBJZGVudGl0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKCiAgICAvLyDilIDilIAgQ29tYmF0IFdlaWdodHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvKiogSG93IGVhZ2VybHkgdGhlIEFJIGF0dGFja3MgKDAgPSBjb25zZXJ2YXRpdmUsIDEgPSBhbGwtb3V0IGFnZ3JvKSAqLwogICAgcHJpdmF0ZSBkb3VibGUgYWdncmVzc2lvbiA9IDAuNTsKCiAgICAvKiogSG93IG11Y2ggdGhlIEFJIHZhbHVlcyB0cmFkaW5nIGNyZWF0dXJlcyBpbiBjb21iYXQgKi8KICAgIHByaXZhdGUgZG91YmxlIGNvbWJhdFdpbGxpbmduZXNzID0gMC41OwoKICAgIC8qKiBQcmlvcml0eSBvbiBkZWFsaW5nIGNvbW1hbmRlciBkYW1hZ2UgdnMgcmVndWxhciBkYW1hZ2UgKi8KICAgIHByaXZhdGUgZG91YmxlIGNvbW1hbmRlckRhbWFnZVByaW9yaXR5ID0gMC4zOwoKICAgIC8vIOKUgOKUgCBSZXNvdXJjZSBXZWlnaHRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqIEhvdyBtdWNoIHRoZSBBSSB2YWx1ZXMgbWFuYSBlZmZpY2llbmN5IChjdXJ2aW5nIG91dCwgdXNpbmcgYWxsIG1hbmEpICovCiAgICBwcml2YXRlIGRvdWJsZSBtYW5hRWZmaWNpZW5jeSA9IDAuNTsKCiAgICAvKiogSG93IG11Y2ggdGhlIEFJIHZhbHVlcyBjYXJkIGFkdmFudGFnZSAoZHJhd2luZywgY2FudHJpcHMpICovCiAgICBwcml2YXRlIGRvdWJsZSBjYXJkQWR2YW50YWdlID0gMC41OwoKICAgIC8qKiBIb3cgbXVjaCB0aGUgQUkgcHJpb3JpdGl6ZXMgcmFtcGluZyAvIG1hbmEgYWNjZWxlcmF0aW9uICovCiAgICBwcml2YXRlIGRvdWJsZSByYW1wUHJpb3JpdHkgPSAwLjQ7CgogICAgLy8g4pSA4pSAIFRocmVhdCBBc3Nlc3NtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgLyoqIEhvdyBtdWNoIHRoZSBBSSBmb2N1c2VzIG9uIHRoZSBsZWFkaW5nIHBsYXllciAqLwogICAgcHJpdmF0ZSBkb3VibGUgdGhyZWF0Rm9jdXMgPSAwLjU7CgogICAgLyoqIEhvdyBtdWNoIHRoZSBBSSB2YWx1ZXMgcmVtb3ZhbCAvIGludGVyYWN0aW9uIHNwZWxscyAqLwogICAgcHJpdmF0ZSBkb3VibGUgcmVtb3ZhbFByaW9yaXR5ID0gMC41OwoKICAgIC8qKiBIb3cgbGlrZWx5IHRoZSBBSSBpcyB0byB1c2UgcmVtb3ZhbCBvbiB0aGUgYmlnZ2VzdCB0aHJlYXQgdnMgc3ByZWFkaW5nICov' +
'CiAgICBwcml2YXRlIGRvdWJsZSB0YXJnZXRDb25jZW50cmF0aW9uID0gMC41OwoKICAgIC8vIOKUgOKUgCBTdHJhdGVnaWMgV2VpZ2h0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8qKiBIb3cgbXVjaCB0aGUgQUkgdmFsdWVzIGJvYXJkIHByZXNlbmNlIChjcmVhdHVyZXMgb24gYmF0dGxlZmllbGQpICovCiAgICBwcml2YXRlIGRvdWJsZSBib2FyZFByZXNlbmNlID0gMC41OwoKICAgIC8qKiBIb3cgbXVjaCB0aGUgQUkgaG9sZHMgYmFjayByZXNvdXJjZXMgZm9yIGZ1dHVyZSB0dXJucyAqLwogICAgcHJpdmF0ZSBkb3VibGUgcGF0aWVuY2UgPSAwLjU7CgogICAgLyoqIEhvdyBtdWNoIHRoZSBBSSB2YWx1ZXMgY29tYm8gcGllY2VzIGFuZCBhc3NlbWJsaW5nIGNvbWJvcyAqLwogICAgcHJpdmF0ZSBkb3VibGUgY29tYm9Qcmlvcml0eSA9IDAuMzsKCiAgICAvKiogTXVsbGlnYW4gYWdncmVzc2l2ZW5lc3MgKGhpZ2hlciA9IG1vcmUgd2lsbGluZyB0byBtdWxsaWdhbiB3ZWFrIGhhbmRzKSAqLwogICAgcHJpdmF0ZSBkb3VibGUgbXVsbGlnYW5TdHJpY3RuZXNzID0gMC41OwoKICAgIC8vIOKUgOKUgCBGb3JnZSBTaW0gRmxhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvKiogQ2xvY2sgb3ZlcnJpZGUgaW4gc2Vjb25kcyAoMCA9IHVzZSBkZWZhdWx0KSAqLwogICAgcHJpdmF0ZSBpbnQgY2xvY2tPdmVycmlkZSA9IDA7CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBDb25zdHJ1Y3RvcnMKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyBBaVByb2ZpbGUoKSB7CiAgICAgICAgdGhpcy5uYW1lID0gImN1c3RvbSI7CiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9ICJDdXN0b20gQUkgcHJvZmlsZSI7CiAgICB9CgogICAgcHVibGljIEFpUHJvZmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBCdWlsdC1pbiBQcmVzZXRzCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKiogRGVmYXVsdCBiYWxhbmNlZCBwcm9maWxlIOKAlCBGb3JnZSdzIGJ1aWx0LWluIEFJIGJlaGF2aW9yLiAqLwogICAgcHVibGljIHN0YXRpYyBBaVByb2ZpbGUgZGVmYXVsdFByb2ZpbGUoKSB7CiAgICAgICAgQWlQcm9maWxlIHAgPSBuZXcgQWlQcm9maWxlKCJkZWZhdWx0IiwgIkJhbGFuY2VkIOKAlCBGb3JnZSdzIGRlZmF1bHQgQUkgYmVoYXZpb3IiKTsKICAgICAgICAvLyBBbGwgd2VpZ2h0cyBhdCAwLjUgKGJhbGFuY2VkKQogICAgICAgIHJldHVybiBwOwogICAgfQoKICAgIC8qKiBBZ2dybyBwcm9maWxlIOKAlCBhdHRhY2tzIGVhcmx5IGFuZCBvZnRlbiwgcHJpb3JpdGl6ZXMgZGFtYWdlIG91dHB1dC4gKi8KICAgIHB1YmxpYyBz' +
'dGF0aWMgQWlQcm9maWxlIGFnZ3JvKCkgewogICAgICAgIEFpUHJvZmlsZSBwID0gbmV3IEFpUHJvZmlsZSgiYWdncm8iLCAiQWdncmVzc2l2ZSDigJQgYXR0YWNrcyBlYXJseSwgcHJpb3JpdGl6ZXMgZGFtYWdlIik7CiAgICAgICAgcC5hZ2dyZXNzaW9uID0gMC45OwogICAgICAgIHAuY29tYmF0V2lsbGluZ25lc3MgPSAwLjg7CiAgICAgICAgcC5jb21tYW5kZXJEYW1hZ2VQcmlvcml0eSA9IDAuNjsKICAgICAgICBwLm1hbmFFZmZpY2llbmN5ID0gMC43OwogICAgICAgIHAuY2FyZEFkdmFudGFnZSA9IDAuMzsKICAgICAgICBwLnJhbXBQcmlvcml0eSA9IDAuMjsKICAgICAgICBwLnRocmVhdEZvY3VzID0gMC4zOwogICAgICAgIHAucmVtb3ZhbFByaW9yaXR5ID0gMC4zOwogICAgICAgIHAudGFyZ2V0Q29uY2VudHJhdGlvbiA9IDAuNzsKICAgICAgICBwLmJvYXJkUHJlc2VuY2UgPSAwLjg7CiAgICAgICAgcC5wYXRpZW5jZSA9IDAuMTsKICAgICAgICBwLmNvbWJvUHJpb3JpdHkgPSAwLjE7CiAgICAgICAgcC5tdWxsaWdhblN0cmljdG5lc3MgPSAwLjY7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgLyoqIENvbnRyb2wgcHJvZmlsZSDigJQgcGxheXMgZGVmZW5zaXZlbHksIHByaW9yaXRpemVzIHJlbW92YWwgYW5kIGNhcmQgZHJhdy4gKi8KICAgIHB1YmxpYyBzdGF0aWMgQWlQcm9maWxlIGNvbnRyb2woKSB7CiAgICAgICAgQWlQcm9maWxlIHAgPSBuZXcgQWlQcm9maWxlKCJjb250cm9sIiwgIkNvbnRyb2wg4oCUIGRlZmVuc2l2ZSwgcmVtb3ZhbC1oZWF2eSwgY2FyZCBhZHZhbnRhZ2UiKTsKICAgICAgICBwLmFnZ3Jlc3Npb24gPSAwLjI7CiAgICAgICAgcC5jb21iYXRXaWxsaW5nbmVzcyA9IDAuMzsKICAgICAgICBwLmNvbW1hbmRlckRhbWFnZVByaW9yaXR5ID0gMC4yOwogICAgICAgIHAubWFuYUVmZmljaWVuY3kgPSAwLjY7CiAgICAgICAgcC5jYXJkQWR2YW50YWdlID0gMC45OwogICAgICAgIHAucmFtcFByaW9yaXR5ID0gMC42OwogICAgICAgIHAudGhyZWF0Rm9jdXMgPSAwLjg7CiAgICAgICAgcC5yZW1vdmFsUHJpb3JpdHkgPSAwLjk7CiAgICAgICAgcC50YXJnZXRDb25jZW50cmF0aW9uID0gMC44OwogICAgICAgIHAuYm9hcmRQcmVzZW5jZSA9IDAuMzsKICAgICAgICBwLnBhdGllbmNlID0gMC45OwogICAgICAgIHAuY29tYm9Qcmlvcml0eSA9IDAuNDsKICAgICAgICBwLm11bGxpZ2FuU3RyaWN0bmVzcyA9IDAuNzsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICAvKiogQ29tYm8gcHJvZmlsZSDigJQgYXNzZW1ibGVzIHdpbiBjb25kaXRpb25zLCBwcm90ZWN0cyBrZXkgcGllY2VzLiAqLwogICAgcHVibGljIHN0YXRpYyBBaVByb2ZpbGUgY29tYm8oKSB7CiAgICAgICAgQWlQcm9maWxlIHAgPSBuZXcgQWlQcm9maWxlKCJjb21ibyIsICJDb21ibyDigJQgcmFtcHMsIGRpZ3MgZm9yIHBpZWNlcywgYXNzZW1ibGVzIGNvbWJvcyIpOwogICAgICAgIHAuYWdncmVzc2lvbiA9IDAuMjsKICAgICAgICBwLmNvbWJhdFdpbGxpbmduZXNzID0gMC4yOwogICAgICAgIHAuY29tbWFuZGVyRGFtYWdlUHJpb3JpdHkgPSAwLjE7CiAgICAgICAgcC5tYW5hRWZmaWNpZW5jeSA9IDAuODsKICAgICAgICBwLmNhcmRBZHZhbnRhZ2UgPSAwLjg7CiAgICAgICAgcC5yYW1wUHJpb3JpdHkgPSAwLjk7CiAgICAgICAgcC50aHJlYXRGb2N1cyA9IDAuNDsKICAgICAgICBwLnJlbW92YWxQcmlvcml0eSA9IDAuNDsKICAgICAgICBwLnRhcmdldENvbmNlbnRyYXRpb24gPSAwLjU7CiAgICAgICAgcC5ib2FyZFByZXNlbmNlID0gMC4zOwogICAgICAgIHAucGF0aWVuY2UgPSAwLjc7CiAgICAgICAgcC5jb21ib1ByaW9yaXR5ID0gMC45NTsKICAgICAgICBwLm11bGxpZ2FuU3RyaWN0bmVzcyA9IDAuODsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICAvKiogTWlkcmFuZ2UgcHJvZmlsZSDigJQgZmxleGlibGUsIGFkYXB0cyBiZXR3ZWVuIGFnZ3JvIGFuZCBjb250cm9sLiAqLwogICAgcHVibGljIHN0YXRpYyBBaVByb2ZpbGUgbWlkcmFuZ2UoKSB7CiAgICAgICAgQWlQcm9maWxlIHAgPSBuZXcgQWlQcm9maWxlKCJtaWRyYW5nZSIsICJNaWRyYW5nZSDigJQgZmxleGlibGUsIHN0cm9uZyBib2FyZCBwcmVzZW5jZSwgdmFsdWUtb3JpZW50ZWQiKTsKICAgICAgICBwLmFnZ3Jlc3Npb24gPSAwLjU7CiAgICAgICAgcC5jb21iYXRXaWxsaW5nbmVzcyA9IDAuNjsKICAgICAgICBwLmNvbW1hbmRlckRhbWFnZVByaW9yaXR5ID0gMC40OwogICAgICAgIHAubWFu' +
'YUVmZmljaWVuY3kgPSAwLjY7CiAgICAgICAgcC5jYXJkQWR2YW50YWdlID0gMC42OwogICAgICAgIHAucmFtcFByaW9yaXR5ID0gMC41OwogICAgICAgIHAudGhyZWF0Rm9jdXMgPSAwLjY7CiAgICAgICAgcC5yZW1vdmFsUHJpb3JpdHkgPSAwLjY7CiAgICAgICAgcC50YXJnZXRDb25jZW50cmF0aW9uID0gMC41OwogICAgICAgIHAuYm9hcmRQcmVzZW5jZSA9IDAuNzsKICAgICAgICBwLnBhdGllbmNlID0gMC41OwogICAgICAgIHAuY29tYm9Qcmlvcml0eSA9IDAuMzsKICAgICAgICBwLm11bGxpZ2FuU3RyaWN0bmVzcyA9IDAuNTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICAvKiogR2V0IGEgcHJlc2V0IGJ5IG5hbWUuICovCiAgICBwdWJsaWMgc3RhdGljIEFpUHJvZmlsZSBieU5hbWUoU3RyaW5nIG5hbWUpIHsKICAgICAgICByZXR1cm4gc3dpdGNoIChuYW1lLnRvTG93ZXJDYXNlKCkpIHsKICAgICAgICAgICAgY2FzZSAiYWdncm8iIC0+IGFnZ3JvKCk7CiAgICAgICAgICAgIGNhc2UgImNvbnRyb2wiIC0+IGNvbnRyb2woKTsKICAgICAgICAgICAgY2FzZSAiY29tYm8iIC0+IGNvbWJvKCk7CiAgICAgICAgICAgIGNhc2UgIm1pZHJhbmdlIiAtPiBtaWRyYW5nZSgpOwogICAgICAgICAgICBkZWZhdWx0IC0+IGRlZmF1bHRQcm9maWxlKCk7CiAgICAgICAgfTsKICAgIH0KCiAgICAvKiogTGlzdCBhbGwgcHJlc2V0IG5hbWVzLiAqLwogICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcHJlc2V0TmFtZXMoKSB7CiAgICAgICAgcmV0dXJuIExpc3Qub2YoImRlZmF1bHQiLCAiYWdncm8iLCAiY29udHJvbCIsICJjb21ibyIsICJtaWRyYW5nZSIpOwogICAgfQoKICAgIC8qKiBHZXQgYWxsIHByZXNldHMgYXMgYSBtYXAuICovCiAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIEFpUHJvZmlsZT4gYWxsUHJlc2V0cygpIHsKICAgICAgICBNYXA8U3RyaW5nLCBBaVByb2ZpbGU+IHByZXNldHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgcHJlc2V0cy5wdXQoImRlZmF1bHQiLCBkZWZhdWx0UHJvZmlsZSgpKTsKICAgICAgICBwcmVzZXRzLnB1dCgiYWdncm8iLCBhZ2dybygpKTsKICAgICAgICBwcmVzZXRzLnB1dCgiY29udHJvbCIsIGNvbnRyb2woKSk7CiAgICAgICAgcHJlc2V0cy5wdXQoImNvbWJvIiwgY29tYm8oKSk7CiAgICAgICAgcHJlc2V0cy5wdXQoIm1pZHJhbmdlIiwgbWlkcmFuZ2UoKSk7CiAgICAgICAgcmV0dXJuIHByZXNldHM7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBVdGlsaXR5IE1ldGhvZHMKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogQ29tcHV0ZSBhbiBvdmVyYWxsICJzdHlsZSBzY29yZSIgZm9yIGRpc3BsYXkgcHVycG9zZXMuCiAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIHN0eWxlIGRpbWVuc2lvbnMgdG8gMC0xMDAgaW50ZWdlciBzY29yZXMuCiAgICAgKi8KICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRTdHlsZVJhZGFyKCkgewogICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IHJhZGFyID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgIHJhZGFyLnB1dCgiQWdncmVzc2lvbiIsIHRvUGVyY2VudChhZ2dyZXNzaW9uKSk7CiAgICAgICAgcmFkYXIucHV0KCJDYXJkIEFkdmFudGFnZSIsIHRvUGVyY2VudChjYXJkQWR2YW50YWdlKSk7CiAgICAgICAgcmFkYXIucHV0KCJSZW1vdmFsIiwgdG9QZXJjZW50KHJlbW92YWxQcmlvcml0eSkpOwogICAgICAgIHJhZGFyLnB1dCgiQm9hcmQgUHJlc2VuY2UiLCB0b1BlcmNlbnQoYm9hcmRQcmVzZW5jZSkpOwogICAgICAgIHJhZGFyLnB1dCgiQ29tYm8iLCB0b1BlcmNlbnQoY29tYm9Qcmlvcml0eSkpOwogICAgICAgIHJhZGFyLnB1dCgiUGF0aWVuY2UiLCB0b1BlcmNlbnQocGF0aWVuY2UpKTsKICAgICAgICByZXR1cm4gcmFkYXI7' +
'CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgdG9QZXJjZW50KGRvdWJsZSB2YWwpIHsKICAgICAgICByZXR1cm4gKGludCkgTWF0aC5yb3VuZCh2YWwgKiAxMDApOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgc3VtbWFyeSBzdHJpbmcgZm9yIENMSSAvIGxvZyBvdXRwdXQuCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgdG9TdW1tYXJ5U3RyaW5nKCkgewogICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAiQWlQcm9maWxlWyVzXSDigJQgYWdncm89JS4xZiBjYXJkPSUuMWYgcmVtb3ZhbD0lLjFmIGJvYXJkPSUuMWYgY29tYm89JS4xZiBwYXRpZW5jZT0lLjFmIiwKICAgICAgICAgICAgbmFtZSwgYWdncmVzc2lvbiwgY2FyZEFkdmFudGFnZSwgcmVtb3ZhbFByaW9yaXR5LCBib2FyZFByZXNlbmNlLCBjb21ib1ByaW9yaXR5LCBwYXRpZW5jZQogICAgICAgICk7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBHZXR0ZXJzIC8gU2V0dGVycwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gbmFtZTsgfQogICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9CiAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeyByZXR1cm4gZGVzY3JpcHRpb247IH0KICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKSB7IHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjOyB9CgogICAgcHVibGljIGRvdWJsZSBnZXRBZ2dyZXNzaW9uKCkgeyByZXR1cm4gYWdncmVzc2lvbjsgfQogICAgcHVibGljIHZvaWQgc2V0QWdncmVzc2lvbihkb3VibGUgdikgeyB0aGlzLmFnZ3Jlc3Npb24gPSBjbGFtcCh2KTsgfQogICAgcHVibGljIGRvdWJsZSBnZXRDb21iYXRXaWxsaW5nbmVzcygpIHsgcmV0dXJuIGNvbWJhdFdpbGxpbmduZXNzOyB9CiAgICBwdWJsaWMgdm9pZCBzZXRDb21iYXRXaWxsaW5nbmVzcyhkb3VibGUgdikgeyB0aGlzLmNvbWJhdFdpbGxpbmduZXNzID0gY2xhbXAodik7IH0KICAgIHB1YmxpYyBkb3VibGUgZ2V0Q29tbWFuZGVyRGFtYWdlUHJpb3JpdHkoKSB7IHJldHVybiBjb21tYW5kZXJEYW1hZ2VQcmlvcml0eTsgfQogICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZGVyRGFtYWdlUHJpb3JpdHkoZG91YmxlIHYpIHsgdGhpcy5jb21tYW5kZXJEYW1hZ2VQcmlvcml0eSA9IGNsYW1wKHYpOyB9CgogICAgcHVibGljIGRvdWJsZSBnZXRNYW5hRWZmaWNpZW5jeSgpIHsgcmV0dXJuIG1hbmFFZmZpY2llbmN5OyB9CiAgICBwdWJsaWMgdm9pZCBzZXRNYW5hRWZmaWNpZW5jeShkb3VibGUgdikgeyB0aGlzLm1hbmFFZmZpY2llbmN5ID0gY2xhbXAodik7IH0KICAgIHB1YmxpYyBkb3VibGUgZ2V0Q2FyZEFkdmFudGFnZSgpIHsgcmV0dXJuIGNhcmRBZHZhbnRhZ2U7IH0KICAgIHB1YmxpYyB2b2lkIHNldENhcmRBZHZhbnRhZ2UoZG91YmxlIHYpIHsgdGhpcy5jYXJkQWR2YW50YWdlID0gY2xhbXAodik7IH0KICAgIHB1YmxpYyBkb3VibGUgZ2V0UmFtcFByaW9yaXR5KCkgeyByZXR1cm4gcmFtcFByaW9yaXR5OyB9CiAgICBwdWJsaWMgdm9pZCBzZXRSYW1wUHJpb3JpdHkoZG91YmxlIHYpIHsgdGhpcy5yYW1wUHJpb3JpdHkgPSBjbGFtcCh2KTsgfQoKICAgIHB1YmxpYyBkb3VibGUgZ2V0VGhyZWF0Rm9jdXMoKSB7IHJldHVybiB0aHJlYXRGb2N1czsgfQogICAgcHVibGljIHZvaWQgc2V0VGhyZWF0Rm9jdXMoZG91YmxlIHYpIHsgdGhpcy50aHJlYXRGb2N1cyA9IGNsYW1wKHYpOyB9CiAgICBwdWJsaWMgZG91YmxlIGdldFJlbW92YWxQcmlvcml0eSgpIHsgcmV0dXJuIHJlbW92YWxQcmlvcml0eTsgfQogICAgcHVibGljIHZvaWQgc2V0UmVtb3ZhbFByaW9yaXR5KGRvdWJsZSB2KSB7IHRoaXMucmVtb3ZhbFByaW9yaXR5ID0gY2xh' +
'bXAodik7IH0KICAgIHB1YmxpYyBkb3VibGUgZ2V0VGFyZ2V0Q29uY2VudHJhdGlvbigpIHsgcmV0dXJuIHRhcmdldENvbmNlbnRyYXRpb247IH0KICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldENvbmNlbnRyYXRpb24oZG91YmxlIHYpIHsgdGhpcy50YXJnZXRDb25jZW50cmF0aW9uID0gY2xhbXAodik7IH0KCiAgICBwdWJsaWMgZG91YmxlIGdldEJvYXJkUHJlc2VuY2UoKSB7IHJldHVybiBib2FyZFByZXNlbmNlOyB9CiAgICBwdWJsaWMgdm9pZCBzZXRCb2FyZFByZXNlbmNlKGRvdWJsZSB2KSB7IHRoaXMuYm9hcmRQcmVzZW5jZSA9IGNsYW1wKHYpOyB9CiAgICBwdWJsaWMgZG91YmxlIGdldFBhdGllbmNlKCkgeyByZXR1cm4gcGF0aWVuY2U7IH0KICAgIHB1YmxpYyB2b2lkIHNldFBhdGllbmNlKGRvdWJsZSB2KSB7IHRoaXMucGF0aWVuY2UgPSBjbGFtcCh2KTsgfQogICAgcHVibGljIGRvdWJsZSBnZXRDb21ib1ByaW9yaXR5KCkgeyByZXR1cm4gY29tYm9Qcmlvcml0eTsgfQogICAgcHVibGljIHZvaWQgc2V0Q29tYm9Qcmlvcml0eShkb3VibGUgdikgeyB0aGlzLmNvbWJvUHJpb3JpdHkgPSBjbGFtcCh2KTsgfQogICAgcHVibGljIGRvdWJsZSBnZXRNdWxsaWdhblN0cmljdG5lc3MoKSB7IHJldHVybiBtdWxsaWdhblN0cmljdG5lc3M7IH0KICAgIHB1YmxpYyB2b2lkIHNldE11bGxpZ2FuU3RyaWN0bmVzcyhkb3VibGUgdikgeyB0aGlzLm11bGxpZ2FuU3RyaWN0bmVzcyA9IGNsYW1wKHYpOyB9CgogICAgcHVibGljIGludCBnZXRDbG9ja092ZXJyaWRlKCkgeyByZXR1cm4gY2xvY2tPdmVycmlkZTsgfQogICAgcHVibGljIHZvaWQgc2V0Q2xvY2tPdmVycmlkZShpbnQgdikgeyB0aGlzLmNsb2NrT3ZlcnJpZGUgPSB2OyB9CgogICAgcHJpdmF0ZSBkb3VibGUgY2xhbXAoZG91YmxlIHYpIHsgcmV0dXJuIE1hdGgubWF4KDAuMCwgTWF0aC5taW4oMS4wLCB2KSk7IH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\ai\AiProfile.java' -B $b
# src/main/java/commanderailab/ai/ForgeBuiltinPolicy.java (1,913 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5haTsKCi8qKgogKiBGb3JnZUJ1aWx0aW5Qb2xpY3kg4oCUIHYxIGRlZmF1bHQgcG9saWN5IHRoYXQgZGVsZWdhdGVzIGFsbCBkZWNpc2lvbnMKICogdG8gRm9yZ2UncyBidWlsdC1pbiB1dGlsaXR5LWJhc2VkIEFJLgogKgogKiBUaGlzIGlzIHRoZSBzaW1wbGVzdCBhbmQgbW9zdCBjb3JyZWN0IHN0YXJ0aW5nIHBvaW50IGJlY2F1c2UgRm9yZ2UncyBBSQogKiBhbHJlYWR5IGhhbmRsZXM6CiAqICAgLSBNYW5hIHBheW1lbnQgYW5kIGxhbmQgc2VxdWVuY2luZwogKiAgIC0gU3BlbGwgY2FzdGluZyBwcmlvcml0eQogKiAgIC0gQXR0YWNrZXIvYmxvY2tlciBkZWNsYXJhdGlvbgogKiAgIC0gVGFyZ2V0IHNlbGVjdGlvbgogKiAgIC0gTXVsbGlnYW4gZGVjaXNpb25zCiAqCiAqIFRoZSB3ZWlnaHQgZmllbGRzIGhlcmUgYXJlIHBsYWNlaG9sZGVycyBmb3IgZnV0dXJlIGN1c3RvbSBwb2xpY2llcy4KICovCnB1YmxpYyBjbGFzcyBGb3JnZUJ1aWx0aW5Qb2xpY3kgaW1wbGVtZW50cyBBaVBvbGljeSB7CgogICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgY2FyZEFkdmFudGFnZVdlaWdodDsKICAgIHByaXZhdGUgZmluYWwgZG91YmxlIHRlbXBvV2VpZ2h0OwogICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgdGhyZWF0U2NvcmluZ1dlaWdodDsKICAgIHByaXZhdGUgZmluYWwgZG91YmxlIGNvbWJhdFdlaWdodDsKCiAgICBwdWJsaWMgRm9yZ2VCdWlsdGluUG9saWN5KCkgewogICAgICAgIC8vIERlZmF1bHQgYmFsYW5jZWQgd2VpZ2h0cyAodXNlZCBhcyBtZXRhZGF0YTsgRm9yZ2UgQUkgbWFrZXMgYWN0dWFsIGRlY2lzaW9ucykKICAgICAgICB0aGlzKDAuMjUsIDAuMzAsIDAuMjUsIDAuMjApOwogICAgfQoKICAgIHB1YmxpYyBGb3JnZUJ1aWx0aW5Qb2xpY3koZG91YmxlIGNhcmRBZHYsIGRvdWJsZSB0ZW1wbywgZG91YmxlIHRocmVhdCwgZG91YmxlIGNvbWJhdCkgewogICAgICAgIHRoaXMuY2FyZEFkdmFudGFnZVdlaWdodCA9IGNhcmRBZHY7CiAgICAgICAgdGhpcy50ZW1wb1dlaWdodCA9IHRlbXBvOwogICAgICAgIHRoaXMudGhyZWF0U2NvcmluZ1dlaWdodCA9IHRocmVhdDsKICAgICAgICB0aGlzLmNvbWJhdFdlaWdodCA9IGNvbWJhdDsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICByZXR1cm4gImZvcmdlLWJ1aWx0aW4iOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGRvdWJsZSBnZXRDYXJkQWR2YW50YWdlV2VpZ2h0KCkgewogICAgICAgIHJldHVybiBjYXJkQWR2YW50YWdlV2VpZ2h0OwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGRvdWJsZSBnZXRUZW1wb1dlaWdodCgpIHsKICAgICAgICByZXR1cm4gdGVtcG9XZWlnaHQ7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgZG91YmxlIGdldFRocmVhdFNjb3JpbmdXZWlnaHQoKSB7CiAgICAgICAgcmV0dXJuIHRocmVhdFNjb3JpbmdXZWlnaHQ7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgZG91YmxlIGdldENvbWJhdFdlaWdodCgpIHsKICAgICAgICByZXR1cm4gY29tYmF0V2VpZ2h0OwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGJvb2xlYW4gdXNlc0ZvcmdlQnVpbHRpbkFpKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiRm9yZ2VCdWlsdGluUG9saWN5W2NhcmRBZHY9JS4yZiwgdGVtcG89JS4yZiwgdGhyZWF0PSUuMmYsIGNvbWJhdD0lLjJmXSIsCiAgICAgICAgICAgICAgICBjYXJkQWR2YW50YWdlV2VpZ2h0LCB0ZW1wb1dlaWdodCwgdGhyZWF0U2NvcmluZ1dlaWdodCwgY29tYmF0V2VpZ2h0KTsKICAgIH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\ai\ForgeBuiltinPolicy.java' -B $b
# src/main/java/commanderailab/analytics/DeckAnalyzer.java (20,572 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5hbmFseXRpY3M7CgppbXBvcnQgamF2YS5pby4qOwppbXBvcnQgamF2YS5uaW8uZmlsZS4qOwppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKCi8qKgogKiBEZWNrQW5hbHl6ZXIg4oCUIFN0YXRpYyBhbmFseXNpcyBvZiBDb21tYW5kZXIgLmRjayBmaWxlcy4KICoKICogUGFyc2VzIEZvcmdlIGRlY2sgZmlsZXMgYW5kIGNvbXB1dGVzOgogKiAgIC0gTWFuYSBjdXJ2ZSAoQ01DIGRpc3RyaWJ1dGlvbikKICogICAtIENvbG9yIGlkZW50aXR5IGJyZWFrZG93bgogKiAgIC0gQ2FyZCBjYXRlZ29yeSBjb3VudHMgKGxhbmRzLCBjcmVhdHVyZXMsIGluc3RhbnRzLCBzb3JjZXJpZXMsIGV0Yy4pCiAqICAgLSBGdW5jdGlvbmFsIHJvbGUgdGFnZ2luZyAocmFtcCwgcmVtb3ZhbCwgZHJhdywgYm9hcmQgd2lwZXMsIHR1dG9ycykKICogICAtIERlY2sgaGVhbHRoIGNoZWNrbGlzdCAocmVjb21tZW5kZWQgY291bnRzIHZzIGFjdHVhbCkKICoKICogV29ya3Mgd2l0aCBGb3JnZSAuZGNrIGZvcm1hdDoKICogICBbbWV0YWRhdGFdCiAqICAgTmFtZT1EZWNrIE5hbWUKICogICBbQ29tbWFuZGVyXQogKiAgIDEgQ2FyZCBOYW1lfFNFVAogKiAgIFtNYWluXQogKiAgIDEgQ2FyZCBOYW1lfFNFVAogKiAgIC4uLgogKgogKiBOb3RlOiBXaXRob3V0IFNjcnlmYWxsIEFQSSBjYWxscywgY2F0ZWdvcnkgdGFnZ2luZyB1c2VzIGhldXJpc3RpYwogKiBrZXl3b3JkIG1hdGNoaW5nIG9uIGNhcmQgbmFtZXMuIEEgZnV0dXJlIHZlcnNpb24gY2FuIGVucmljaCB3aXRoCiAqIFNjcnlmYWxsIGRhdGEgZm9yIGFjY3VyYXRlIHR5cGUvb3JhY2xlIHRleHQgYW5hbHlzaXMuCiAqLwpwdWJsaWMgY2xhc3MgRGVja0FuYWx5emVyIHsKCiAgICAvLyDilIDilIAgQW5hbHlzaXMgUmVzdWx0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVja0FuYWx5c2lzIHsKICAgICAgICBwdWJsaWMgU3RyaW5nIGRlY2tOYW1lOwogICAgICAgIHB1YmxpYyBTdHJpbmcgZGVja0ZpbGU7CiAgICAgICAgcHVibGljIFN0cmluZyBjb21tYW5kZXJOYW1lOwogICAgICAgIHB1YmxpYyBpbnQgdG90YWxDYXJkczsKCiAgICAgICAgLy8gQ2F0ZWdvcnkgY291bnRzCiAgICAgICAgcHVibGljIGludCBsYW5kczsKICAgICAgICBwdWJsaWMgaW50IGNyZWF0dXJlczsKICAgICAgICBwdWJsaWMgaW50IGluc3RhbnRzOwogICAgICAgIHB1YmxpYyBpbnQgc29yY2VyaWVzOwogICAgICAgIHB1YmxpYyBpbnQgYXJ0aWZhY3RzOwogICAgICAgIHB1YmxpYyBpbnQgZW5jaGFudG1lbnRzOwogICAgICAgIHB1YmxpYyBpbnQgcGxhbmVzd2Fsa2VyczsKICAgICAgICBwdWJsaWMgaW50IG90aGVyOwoKICAgICAgICAvLyBGdW5jdGlvbmFsIHJvbGVzIChoZXVyaXN0aWMpCiAgICAgICAgcHVibGljIGludCByYW1wQ2FyZHM7CiAgICAgICAgcHVibGljIGludCByZW1vdmFsQ2FyZHM7CiAgICAgICAgcHVibGljIGludCBkcmF3Q2FyZHM7CiAgICAgICAgcHVibGljIGludCBib2FyZFdpcGVzOwogICAgICAgIHB1YmxpYyBpbnQgdHV0b3JzOwogICAgICAgIHB1YmxpYyBpbnQgY291bnRlclNwZWxsczsKICAgICAgICBwdWJsaWMgaW50IHByb3RlY3Rpb25DYXJkczsKICAgICAgICBwdWJsaWMgaW50IHJlY3Vyc2lvbkNhcmRzOwoKICAgICAgICAvLyBNYW5hIGN1cnZlIChpbmRleCA9IENNQywgdmFsdWUgPSBjb3VudDsgaW5kZXggNysgPSAiNysiKQogICAgICAgIHB1YmxpYyBpbnRbXSBtYW5hQ3VydmUgPSBuZXcgaW50WzhdOyAvLyAwLDEsMiwzLDQsNSw2LDcrCgogICAgICAgIC8vIENvbG9yIGJyZWFrZG93biAoY291bnQgb2YgY2FyZHMgd2l0aCBlYWNoIGNvbG9yIGluIGNvc3QpCiAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGNvbG9yQnJlYWtkb3duID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwoKICAgICAgICAvLyBSYXcgY2FyZCBsaXN0CiAgICAgICAgcHVibGljIExpc3Q8Q2FyZEVudHJ5PiBjYXJkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgICAgICAvLyBIZWFsdGggY2hlY2tsaXN0CiAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIEhlYWx0aENoZWNrPiBoZWFsdGhDaGVja3MgPSBuZXcgTGlua2Vk' +
'SGFzaE1hcDw+KCk7CgogICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhbHRoQ2hlY2sgewogICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNhdGVnb3J5OwogICAgICAgICAgICBwdWJsaWMgaW50IGFjdHVhbDsKICAgICAgICAgICAgcHVibGljIGludCByZWNvbW1lbmRlZE1pbjsKICAgICAgICAgICAgcHVibGljIGludCByZWNvbW1lbmRlZE1heDsKICAgICAgICAgICAgcHVibGljIFN0cmluZyBzdGF0dXM7IC8vICJnb29kIiwgImxvdyIsICJoaWdoIgoKICAgICAgICAgICAgcHVibGljIEhlYWx0aENoZWNrKFN0cmluZyBjYXQsIGludCBhY3R1YWwsIGludCBtaW4sIGludCBtYXgpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXQ7CiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbCA9IGFjdHVhbDsKICAgICAgICAgICAgICAgIHRoaXMucmVjb21tZW5kZWRNaW4gPSBtaW47CiAgICAgICAgICAgICAgICB0aGlzLnJlY29tbWVuZGVkTWF4ID0gbWF4OwogICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA8IG1pbikgdGhpcy5zdGF0dXMgPSAibG93IjsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjdHVhbCA+IG1heCkgdGhpcy5zdGF0dXMgPSAiaGlnaCI7CiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc3RhdHVzID0gImdvb2QiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FyZEVudHJ5IHsKICAgICAgICBwdWJsaWMgaW50IHF1YW50aXR5OwogICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKICAgICAgICBwdWJsaWMgU3RyaW5nIHNldDsKICAgICAgICBwdWJsaWMgU3RyaW5nIHNlY3Rpb247IC8vICJDb21tYW5kZXIiLCAiTWFpbiIsICJTaWRlYm9hcmQiCiAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiB0YWdzID0gbmV3IEFycmF5TGlzdDw+KCk7IC8vIGhldXJpc3RpYyByb2xlIHRhZ3MKCiAgICAgICAgcHVibGljIENhcmRFbnRyeShpbnQgcXR5LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHNldCwgU3RyaW5nIHNlY3Rpb24pIHsKICAgICAgICAgICAgdGhpcy5xdWFudGl0eSA9IHF0eTsKICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICAgICAgdGhpcy5zZXQgPSBzZXQ7CiAgICAgICAgICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBQYXJzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIC8qKgogICAgICogQW5hbHl6ZSBhIC5kY2sgZmlsZSBmcm9tIGRpc2suCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgRGVja0FuYWx5c2lzIGFuYWx5emUoU3RyaW5nIGRlY2tGaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBMaXN0PFN0cmluZz4gbGluZXMgPSBGaWxlcy5yZWFkQWxsTGluZXMoUGF0aC5vZihkZWNrRmlsZVBhdGgpKTsKICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBQYXRoLm9mKGRlY2tGaWxlUGF0aCkuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpOwogICAgICAgIHJldHVybiBhbmFseXplKGxpbmVzLCBmaWxlTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbmFseXplIGEgZGVjayBmcm9tIGl0cyBsaW5lcyBhbmQgZmlsZW5hbWUuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgRGVja0FuYWx5c2lzIGFuYWx5emUoTGlzdDxTdHJpbmc+IGxpbmVzLCBTdHJpbmcgZmlsZU5hbWUpIHsKICAgICAgICBEZWNrQW5hbHlzaXMgYSA9IG5ldyBEZWNrQW5hbHlzaXMoKTsKICAgICAgICBhLmRlY2tGaWxlID0gZmlsZU5hbWU7CiAgICAgICAgYS5kZWNrTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoIi5kY2siLCAiIik7CiAgICAgICAgYS5jb2xvckJyZWFrZG93bi5wdXQoIlciLCAwKTsKICAgICAgICBhLmNvbG9yQnJlYWtkb3duLnB1dCgiVSIsIDApOwogICAgICAgIGEuY29sb3JCcmVha2Rvd24ucHV0KCJCIiwgMCk7CiAgICAgICAgYS5jb2xvckJyZWFrZG93bi5wdXQoIlIiLCAwKTsKICAgICAgICBhLmNvbG9yQnJlYWtkb3duLnB1dCgiRyIsIDApOwogICAgICAgIGEuY29sb3JCcmVha2Rvd24ucHV0KCJDIiwgMCk7IC8vIENvbG9ybGVzcwoKICAgICAgICBTdHJpbmcgY3VycmVudFNlY3Rpb24gPSAiTWFpbiI7CiAgICAgICAgUGF0dGVybiBjYXJkUGF0dGVybiA9IFBhdHRlcm4u' +
'Y29tcGlsZSgiXihcXGQrKVxccysoLis/KSg/OlxcfCguKykpPyQiKTsKCiAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKICAgICAgICAgICAgaWYgKGxpbmUuaXNFbXB0eSgpIHx8IGxpbmUuc3RhcnRzV2l0aCgiLy8iKSkgY29udGludWU7CgogICAgICAgICAgICAvLyBTZWN0aW9uIGhlYWRlcnMKICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiWyIpICYmIGxpbmUuZW5kc1dpdGgoIl0iKSkgewogICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb24gPSBsaW5lLnN1YnN0cmluZygxLCBsaW5lLmxlbmd0aCgpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJDb21tYW5kZXIiKSkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID0gIkNvbW1hbmRlciI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY3Rpb24uZXF1YWxzSWdub3JlQ2FzZSgiTWFpbiIpKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlY3Rpb24gPSAiTWFpbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlY3Rpb24uZXF1YWxzSWdub3JlQ2FzZSgiU2lkZWJvYXJkIikpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9ICJTaWRlYm9hcmQiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1ldGFkYXRhOiBOYW1lPS4uLgogICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJOYW1lPSIpKSB7CiAgICAgICAgICAgICAgICBhLmRlY2tOYW1lID0gbGluZS5zdWJzdHJpbmcoNSkudHJpbSgpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENhcmQgZW50cnk6ICIxIENhcmQgTmFtZXxTRVQiIG9yICIxIENhcmQgTmFtZSIKICAgICAgICAgICAgTWF0Y2hlciBtID0gY2FyZFBhdHRlcm4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7CiAgICAgICAgICAgICAgICBpbnQgcXR5ID0gSW50ZWdlci5wYXJzZUludChtLmdyb3VwKDEpKTsKICAgICAgICAgICAgICAgIFN0cmluZyBjYXJkTmFtZSA9IG0uZ3JvdXAoMikudHJpbSgpOwogICAgICAgICAgICAgICAgU3RyaW5nIHNldENvZGUgPSBtLmdyb3VwKDMpICE9IG51bGwgPyBtLmdyb3VwKDMpLnRyaW0oKSA6ICIiOwoKICAgICAgICAgICAgICAgIENhcmRFbnRyeSBjYXJkID0gbmV3IENhcmRFbnRyeShxdHksIGNhcmROYW1lLCBzZXRDb2RlLCBjdXJyZW50U2VjdGlvbik7CiAgICAgICAgICAgICAgICBhLmNhcmRzLmFkZChjYXJkKTsKICAgICAgICAgICAgICAgIGEudG90YWxDYXJkcyArPSBxdHk7CgogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTZWN0aW9uLmVxdWFscygiQ29tbWFuZGVyIikpIHsKICAgICAgICAgICAgICAgICAgICBhLmNvbW1hbmRlck5hbWUgPSBjYXJkTmFtZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBUYWcgYW5kIGNsYXNzaWZ5CiAgICAgICAgICAgICAgICB0YWdDYXJkKGNhcmQpOwogICAgICAgICAgICAgICAgY2xhc3NpZnlDYXJkKGEsIGNhcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDb21wdXRlIGhlYWx0aCBjaGVja2xpc3QKICAgICAgICBjb21wdXRlSGVhbHRoQ2hlY2tzKGEpOwoKICAgICAgICByZXR1cm4gYTsKICAgIH0KCiAgICAvLyDilIDilIAgQ2FyZCBUYWdnaW5nIChIZXVyaXN0aWMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIC8qKgogICAgICogVGFnIGEgY2FyZCB3aXRoIGZ1bmN0aW9uYWwgcm9sZXMgYmFzZWQgb24gbmFtZSBoZXVyaXN0aWNzLgogICAgICogVGhpcyBpcyBiZXN0LWVmZm9ydCB3aXRob3V0IFNjcnlmYWxsIGRhdGEuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGFnQ2FyZChDYXJkRW50cnkgY2FyZCkgewogICAgICAgIFN0cmluZyBsb3dlciA9IGNhcmQubmFtZS50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAvLyBMYW5kIGRldGVjdGlvbgogICAgICAgIGlmIChpc0xpa2VseUxhbmQobG93ZXIpKSB7CiAgICAgICAgICAgIGNhcmQudGFncy5hZGQoImxhbmQiKTsKICAgICAgICB9CgogICAgICAgIC8vIFJhbXAKICAgICAgICBpZiAoaXNMaWtl' +
'bHlSYW1wKGxvd2VyKSkgewogICAgICAgICAgICBjYXJkLnRhZ3MuYWRkKCJyYW1wIik7CiAgICAgICAgfQoKICAgICAgICAvLyBSZW1vdmFsCiAgICAgICAgaWYgKGlzTGlrZWx5UmVtb3ZhbChsb3dlcikpIHsKICAgICAgICAgICAgY2FyZC50YWdzLmFkZCgicmVtb3ZhbCIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FyZCBkcmF3CiAgICAgICAgaWYgKGlzTGlrZWx5RHJhdyhsb3dlcikpIHsKICAgICAgICAgICAgY2FyZC50YWdzLmFkZCgiZHJhdyIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQm9hcmQgd2lwZXMKICAgICAgICBpZiAoaXNMaWtlbHlCb2FyZFdpcGUobG93ZXIpKSB7CiAgICAgICAgICAgIGNhcmQudGFncy5hZGQoIndpcGUiKTsKICAgICAgICB9CgogICAgICAgIC8vIFR1dG9ycwogICAgICAgIGlmIChpc0xpa2VseVR1dG9yKGxvd2VyKSkgewogICAgICAgICAgICBjYXJkLnRhZ3MuYWRkKCJ0dXRvciIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ291bnRlciBzcGVsbHMKICAgICAgICBpZiAoaXNMaWtlbHlDb3VudGVyKGxvd2VyKSkgewogICAgICAgICAgICBjYXJkLnRhZ3MuYWRkKCJjb3VudGVyIik7CiAgICAgICAgfQoKICAgICAgICAvLyBQcm90ZWN0aW9uCiAgICAgICAgaWYgKGlzTGlrZWx5UHJvdGVjdGlvbihsb3dlcikpIHsKICAgICAgICAgICAgY2FyZC50YWdzLmFkZCgicHJvdGVjdGlvbiIpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVjdXJzaW9uCiAgICAgICAgaWYgKGlzTGlrZWx5UmVjdXJzaW9uKGxvd2VyKSkgewogICAgICAgICAgICBjYXJkLnRhZ3MuYWRkKCJyZWN1cnNpb24iKTsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0dXJlIGRldGVjdGlvbgogICAgICAgIGlmIChpc0xpa2VseUNyZWF0dXJlKGxvd2VyKSkgewogICAgICAgICAgICBjYXJkLnRhZ3MuYWRkKCJjcmVhdHVyZSIpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgSGV1cmlzdGljIEtleXdvcmQgTWF0Y2hlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpa2VseUxhbmQoU3RyaW5nIG5hbWUpIHsKICAgICAgICBTdHJpbmdbXSBsYW5kS2V5d29yZHMgPSB7CiAgICAgICAgICAgICJmb3Jlc3QiLCAiaXNsYW5kIiwgIm1vdW50YWluIiwgInBsYWlucyIsICJzd2FtcCIsCiAgICAgICAgICAgICJsYW5kIiwgImdyb3ZlIiwgImZhbGxzIiwgImdhcmRlbnMiLCAidGVtcGxlIiwKICAgICAgICAgICAgInNocmluZSIsICJjaXRhZGVsIiwgInRvd2VyIiwgImdhdGUiLCAicGFzc2FnZSIsCiAgICAgICAgICAgICJmb3VuZHJ5IiwgImZvcmdlIiwgImNhdmUiLCAibWFyc2giLCAiYm9nIiwKICAgICAgICAgICAgImZpZWxkIiwgIm1lYWRvdyIsICJ0ZXJyYWNlIiwgImJhc2luIiwgInBvb2wiLAogICAgICAgICAgICAiY29tbWFuZCB0b3dlciIsICJleG90aWMgb3JjaGFyZCIsICJtYW5hIGNvbmZsdWVuY2UiLAogICAgICAgICAgICAiY2l0eSBvZiBicmFzcyIsICJyZWZsZWN0aW5nIHBvb2wiLCAic29sIHJpbmciCiAgICAgICAgfTsKICAgICAgICAvLyBTb2wgUmluZyBpcyBOT1QgYSBsYW5kIGJ1dCBjb21tb25seSBpbiBsYW5kLWFkamFjZW50IGxpc3RzIOKAlCByZW1vdmUgaXQKICAgICAgICBpZiAobmFtZS5lcXVhbHMoInNvbCByaW5nIikpIHJldHVybiBmYWxzZTsKICAgICAgICBmb3IgKFN0cmluZyBrdyA6IGxhbmRLZXl3b3JkcykgewogICAgICAgICAgICBpZiAobmFtZS5jb250YWlucyhrdykpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpa2VseVJhbXAoU3RyaW5nIG5hbWUpIHsKICAgICAgICBTdHJpbmdbXSByYW1wS2V5d29yZHMgPSB7CiAgICAgICAgICAgICJzb2wgcmluZyIsICJtYW5hIGNyeXB0IiwgImFyY2FuZSBzaWduZXQiLCAic2lnbmV0IiwKICAgICAgICAgICAgInRhbGlzbWFuIiwgImN1bHRpdmF0ZSIsICJrb2RhbWEncyByZWFjaCIsICJyYW1wYW50IGdyb3d0aCIsCiAgICAgICAgICAgICJmYXJzZWVrIiwgIm5hdHVyZSdzIGxvcmUiLCAidGhyZWUgdmlzaXRzIiwgInNha3VyYS10cmliZSBlbGRlciIsCiAgICAgICAgICAgICJzb2xlbW4gc2ltdWxhY3J1bSIsICJiaXJkcyBvZiBwYXJhZGlzZSIsICJsbGFub3dhciBlbHZlcyIsCiAgICAgICAgICAgICJlbHZpc2ggbXlz' +
'dGljIiwgImRyeWFkIG9mIHRoZSBpbHlzaWFuIGdyb3ZlIiwgImV4cGxvcmF0aW9uIiwKICAgICAgICAgICAgIm1hbmEgdmF1bHQiLCAibWFuYSByb2NrIiwgImZlbGx3YXIgc3RvbmUiLCAibWluZCBzdG9uZSIsCiAgICAgICAgICAgICJ0aG91Z2h0IHZlc3NlbCIsICJjb21tYW5kZXIncyBzcGhlcmUiLCAiZ2lsZGVkIGxvdHVzIiwKICAgICAgICAgICAgInRocmFuIGR5bmFtbyIsICJ3b3JuIHBvd2Vyc3RvbmUiLCAiZGFyayByaXR1YWwiLAogICAgICAgICAgICAiY2FiYWwgcml0dWFsIiwgImpld2VsZWQgbG90dXMiLCAibG90dXMgcGV0YWwiLAogICAgICAgICAgICAiY2hyb21lIG1veCIsICJtb3ggZGlhbW9uZCIsICJncm93dGggc3BpcmFsIiwKICAgICAgICB9OwogICAgICAgIGZvciAoU3RyaW5nIGt3IDogcmFtcEtleXdvcmRzKSB7CiAgICAgICAgICAgIGlmIChuYW1lLmNvbnRhaW5zKGt3KSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlrZWx5UmVtb3ZhbChTdHJpbmcgbmFtZSkgewogICAgICAgIFN0cmluZ1tdIHJlbW92YWxLZXl3b3JkcyA9IHsKICAgICAgICAgICAgInN3b3JkcyB0byBwbG93c2hhcmVzIiwgInBhdGggdG8gZXhpbGUiLCAidGVybWluYXRlIiwKICAgICAgICAgICAgIm11cmRlciIsICJkb29tIGJsYWRlIiwgImdvIGZvciB0aGUgdGhyb2F0IiwgImJlYXN0IHdpdGhpbiIsCiAgICAgICAgICAgICJjaGFvcyB3YXJwIiwgImFuZ3Vpc2hlZCB1bm1ha2luZyIsICJ2aW5kaWNhdGUiLAogICAgICAgICAgICAiYXNzYXNzaW4ncyB0cm9waHkiLCAiZ2VuZXJvdXMgZ2lmdCIsICJyYXBpZCBoeWJyaWRpemF0aW9uIiwKICAgICAgICAgICAgInBvbmdpZnkiLCAicmVhbGl0eSBzaGlmdCIsICJjeWNsb25pYyByaWZ0IiwKICAgICAgICAgICAgImFicnVwdCBkZWNheSIsICJtb3J0aWZ5IiwgInB1dHJlZnkiLCAiZGVzcGFyayIsCiAgICAgICAgICAgICJ2YW5pc2hpbmcgdmVyc2UiLCAiZmF0ZWZ1bCBhYnNlbmNlIiwgImluZmVybmFsIGdyYXNwIiwKICAgICAgICAgICAgImRlYWRseSByb2xsaWNrIiwgImZvcmNlIG9mIGRlc3BhaXIiLCAiZGlzbWVtYmVyIiwKICAgICAgICAgICAgInJhdmVub3VzIGNodXBhY2FicmEiLCAic2hyaWVrbWF3IiwgIm5la3JhdGFhbCIsCiAgICAgICAgfTsKICAgICAgICBmb3IgKFN0cmluZyBrdyA6IHJlbW92YWxLZXl3b3JkcykgewogICAgICAgICAgICBpZiAobmFtZS5jb250YWlucyhrdykpIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpa2VseURyYXcoU3RyaW5nIG5hbWUpIHsKICAgICAgICBTdHJpbmdbXSBkcmF3S2V5d29yZHMgPSB7CiAgICAgICAgICAgICJyaHlzdGljIHN0dWR5IiwgIm15c3RpYyByZW1vcmEiLCAic3lsdmFuIGxpYnJhcnkiLAogICAgICAgICAgICAicGh5cmV4aWFuIGFyZW5hIiwgIm5lY3JvcG90ZW5jZSIsICJoYXJtb25pemUiLAogICAgICAgICAgICAiYmx1ZSBzdW4ncyB6ZW5pdGgiLCAiYnJhaW5zdG9ybSIsICJwb25kZXIiLCAicHJlb3JkYWluIiwKICAgICAgICAgICAgInNpZ24gaW4gYmxvb2QiLCAicmVhZCB0aGUgYm9uZXMiLCAibmlnaHQncyB3aGlzcGVyIiwKICAgICAgICAgICAgInNrdWxsY2xhbXAiLCAiYmVhc3Qgd2hpc3BlcmVyIiwgImd1YXJkaWFuIHByb2plY3QiLAogICAgICAgICAgICAidGhlIGdyZWF0IGhlbmdlIiwgImVzcGVyIHNlbnRpbmVsIiwgImRhcmsgY29uZmlkYW50IiwKICAgICAgICAgICAgImNvbnNlY3JhdGVkIHNwaGlueCIsICJ3aW5kZmFsbCIsICJ3aGVlbCBvZiBmb3J0dW5lIiwKICAgICAgICAgICAgIndoZWVsIG9mIG1pc2ZvcnR1bmUiLCAiZmFpdGhsZXNzIGxvb3RpbmciLAogICAgICAgICAgICAidHJlYXN1cmUgY3J1aXNlIiwgImRpZyB0aHJvdWdoIHRpbWUiLAogICAgICAgIH07CiAgICAgICAgZm9yIChTdHJpbmcga3cgOiBkcmF3S2V5d29yZHMpIHsKICAgICAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoa3cpKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWtlbHlCb2FyZFdpcGUoU3RyaW5nIG5hbWUpIHsKICAgICAgICBTdHJpbmdbXSB3aXBlS2V5d29yZHMgPSB7CiAgICAgICAgICAgICJ3cmF0aCBvZiBnb2QiLCAiZGFtbmF0' +
'aW9uIiwgImJsYXNwaGVtb3VzIGFjdCIsCiAgICAgICAgICAgICJjeWNsb25pYyByaWZ0IiwgInRveGljIGRlbHVnZSIsICJmYXJld2VsbCIsCiAgICAgICAgICAgICJzdXByZW1lIHZlcmRpY3QiLCAibWVyY2lsZXNzIGV2aWN0aW9uIiwgImF1c3RlcmUgY29tbWFuZCIsCiAgICAgICAgICAgICJ2YW5xdWlzaCB0aGUgaG9yZGUiLCAiaG91ciBvZiBkZXZhc3RhdGlvbiIsCiAgICAgICAgICAgICJtYXNzYWNyZSB3dXJtIiwgImxpdmluZyBkZWF0aCIsICJhbGwgaXMgZHVzdCIsCiAgICAgICAgICAgICJkZWNyZWUgb2YgcGFpbiIsICJraW5kcmVkIGRvbWluYW5jZSIsICJpbiBnYXJydWsncyB3YWtlIiwKICAgICAgICAgICAgInN0b3JtJ3Mgd3JhdGgiLCAiY2hhaW4gcmVhY3Rpb24iLAogICAgICAgIH07CiAgICAgICAgZm9yIChTdHJpbmcga3cgOiB3aXBlS2V5d29yZHMpIHsKICAgICAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoa3cpKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWtlbHlUdXRvcihTdHJpbmcgbmFtZSkgewogICAgICAgIFN0cmluZ1tdIHR1dG9yS2V5d29yZHMgPSB7CiAgICAgICAgICAgICJkZW1vbmljIHR1dG9yIiwgInZhbXBpcmljIHR1dG9yIiwgImVubGlnaHRlbmVkIHR1dG9yIiwKICAgICAgICAgICAgIm15c3RpY2FsIHR1dG9yIiwgIndvcmxkbHkgdHV0b3IiLCAiaW1wZXJpYWwgc2VhbCIsCiAgICAgICAgICAgICJnYW1ibGUiLCAiZmFicmljYXRlIiwgImRpYWJvbGljIHR1dG9yIiwgImRpYWJvbGljIGludGVudCIsCiAgICAgICAgICAgICJpZHlsbGljIHR1dG9yIiwgImVsYWRhbXJpJ3MgY2FsbCIsICJncmVlbiBzdW4ncyB6ZW5pdGgiLAogICAgICAgICAgICAiZmluYWxlIG9mIGRldmFzdGF0aW9uIiwgImNob3JkIG9mIGNhbGxpbmciLAogICAgICAgICAgICAibmF0dXJhbCBvcmRlciIsICJlbGRyaXRjaCBldm9sdXRpb24iLAogICAgICAgIH07CiAgICAgICAgZm9yIChTdHJpbmcga3cgOiB0dXRvcktleXdvcmRzKSB7CiAgICAgICAgICAgIGlmIChuYW1lLmNvbnRhaW5zKGt3KSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlrZWx5Q291bnRlcihTdHJpbmcgbmFtZSkgewogICAgICAgIFN0cmluZ1tdIGNvdW50ZXJLZXl3b3JkcyA9IHsKICAgICAgICAgICAgImNvdW50ZXJzcGVsbCIsICJzd2FuIHNvbmciLCAibmVnYXRlIiwgImFyY2FuZSBkZW5pYWwiLAogICAgICAgICAgICAibWFuYSBkcmFpbiIsICJmb3JjZSBvZiB3aWxsIiwgImZvcmNlIG9mIG5lZ2F0aW9uIiwKICAgICAgICAgICAgImZpZXJjZSBndWFyZGlhbnNoaXAiLCAicGFjdCBvZiBuZWdhdGlvbiIsICJkb3ZpbidzIHZldG8iLAogICAgICAgICAgICAiZGVsYXkiLCAidGFsZSdzIGVuZCIsICJhbiBvZmZlciB5b3UgY2FuJ3QgcmVmdXNlIiwKICAgICAgICAgICAgImZsdXN0ZXJzdG9ybSIsICJtZW50YWwgbWlzc3RlcCIsICJzcGVsbCBwaWVyY2UiLAogICAgICAgIH07CiAgICAgICAgZm9yIChTdHJpbmcga3cgOiBjb3VudGVyS2V5d29yZHMpIHsKICAgICAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoa3cpKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWtlbHlQcm90ZWN0aW9uKFN0cmluZyBuYW1lKSB7CiAgICAgICAgU3RyaW5nW10gcHJvdGVjdGlvbktleXdvcmRzID0gewogICAgICAgICAgICAibGlnaHRuaW5nIGdyZWF2ZXMiLCAic3dpZnRmb290IGJvb3RzIiwgImhlcm9pYyBpbnRlcnZlbnRpb24iLAogICAgICAgICAgICAidGVmZXJpJ3MgcHJvdGVjdGlvbiIsICJib3JvcyBjaGFybSIsICJmbGF3bGVzcyBtYW5ldXZlciIsCiAgICAgICAgICAgICJkZWZsZWN0aW5nIHN3YXQiLCAiZ3JhbmQgYWJvbGlzaGVyIiwgInZlaWwgb2Ygc3VtbWVyIiwKICAgICAgICAgICAgIm1vdGhlciBvZiBydW5lcyIsICJnaXZlciBvZiBydW5lcyIsICJzZWxmbGVzcyBzcGlyaXQiLAogICAgICAgICAgICAiYXZhY3luLCBhbmdlbCBvZiBob3BlIiwgImRhdW50bGVzcyBib2R5Z3VhcmQiLAogICAgICAgIH07CiAgICAgICAgZm9yIChTdHJpbmcga3cgOiBwcm90ZWN0aW9uS2V5d29yZHMpIHsKICAgICAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoa3cpKSByZXR1cm4g' +
'dHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWtlbHlSZWN1cnNpb24oU3RyaW5nIG5hbWUpIHsKICAgICAgICBTdHJpbmdbXSByZWN1cnNpb25LZXl3b3JkcyA9IHsKICAgICAgICAgICAgImV0ZXJuYWwgd2l0bmVzcyIsICJyZWdyb3d0aCIsICJub3hpb3VzIHJldml2YWwiLAogICAgICAgICAgICAicmVhbmltYXRlIiwgImFuaW1hdGUgZGVhZCIsICJkYW5jZSBvZiB0aGUgZGVhZCIsCiAgICAgICAgICAgICJuZWNyb21hbmN5IiwgImxpdmluZyBkZWF0aCIsICJzdW4gdGl0YW4iLAogICAgICAgICAgICAibXVsZHJvdGhhIiwgImx1cnJ1cyIsICJzZXZpbm5lJ3MgcmVjbGFtYXRpb24iLAogICAgICAgICAgICAiYXJjaGFlb21hbmNlciIsICJzbmFwY2FzdGVyIG1hZ2UiLCAibWlzc2lvbiBicmllZmluZyIsCiAgICAgICAgfTsKICAgICAgICBmb3IgKFN0cmluZyBrdyA6IHJlY3Vyc2lvbktleXdvcmRzKSB7CiAgICAgICAgICAgIGlmIChuYW1lLmNvbnRhaW5zKGt3KSkgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlrZWx5Q3JlYXR1cmUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAvLyBWZXJ5IHJvdWdoIGhldXJpc3RpYyDigJQgbWFueSBDb21tYW5kZXIgY3JlYXR1cmVzIGhhdmUgZGlzdGluY3RpdmUgbmFtZXMKICAgICAgICAvLyBUaGlzIGNhdGNoZXMgc29tZSBidXQgaXMgbm90IGV4aGF1c3RpdmUKICAgICAgICBTdHJpbmdbXSBjcmVhdHVyZUtleXdvcmRzID0gewogICAgICAgICAgICAiZWxkZXIiLCAiZHJhZ29uIiwgImFuZ2VsIiwgImRlbW9uIiwgInZhbXBpcmUiLAogICAgICAgICAgICAiem9tYmllIiwgImdvYmxpbiIsICJlbGYiLCAia25pZ2h0IiwgIndpemFyZCIsCiAgICAgICAgICAgICJzaGFtYW4iLCAiY2xlcmljIiwgIndhcnJpb3IiLCAiYmVhc3QiLCAiZWxlbWVudGFsIiwKICAgICAgICAgICAgInNwaGlueCIsICJ0aXRhbiIsICJ3dXJtIiwgImRyYWtlIiwgInNwaXJpdCIsCiAgICAgICAgfTsKICAgICAgICBmb3IgKFN0cmluZyBrdyA6IGNyZWF0dXJlS2V5d29yZHMpIHsKICAgICAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoa3cpKSByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIOKUgOKUgCBDbGFzc2lmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsYXNzaWZ5Q2FyZChEZWNrQW5hbHlzaXMgYSwgQ2FyZEVudHJ5IGNhcmQpIHsKICAgICAgICBpbnQgcXR5ID0gY2FyZC5xdWFudGl0eTsKCiAgICAgICAgLy8gQ291bnQgYnkgdGFnCiAgICAgICAgaWYgKGNhcmQudGFncy5jb250YWlucygibGFuZCIpKSBhLmxhbmRzICs9IHF0eTsKICAgICAgICBpZiAoY2FyZC50YWdzLmNvbnRhaW5zKCJjcmVhdHVyZSIpKSBhLmNyZWF0dXJlcyArPSBxdHk7CiAgICAgICAgaWYgKGNhcmQudGFncy5jb250YWlucygicmFtcCIpKSBhLnJhbXBDYXJkcyArPSBxdHk7CiAgICAgICAgaWYgKGNhcmQudGFncy5jb250YWlucygicmVtb3ZhbCIpKSBhLnJlbW92YWxDYXJkcyArPSBxdHk7CiAgICAgICAgaWYgKGNhcmQudGFncy5jb250YWlucygiZHJhdyIpKSBhLmRyYXdDYXJkcyArPSBxdHk7CiAgICAgICAgaWYgKGNhcmQudGFncy5jb250YWlucygid2lwZSIpKSBhLmJvYXJkV2lwZXMgKz0gcXR5OwogICAgICAgIGlmIChjYXJkLnRhZ3MuY29udGFpbnMoInR1dG9yIikpIGEudHV0b3JzICs9IHF0eTsKICAgICAgICBpZiAoY2FyZC50YWdzLmNvbnRhaW5zKCJjb3VudGVyIikpIGEuY291bnRlclNwZWxscyArPSBxdHk7CiAgICAgICAgaWYgKGNhcmQudGFncy5jb250YWlucygicHJvdGVjdGlvbiIpKSBhLnByb3RlY3Rpb25DYXJkcyArPSBxdHk7CiAgICAgICAgaWYgKGNhcmQudGFncy5jb250YWlucygicmVjdXJzaW9uIikpIGEucmVjdXJzaW9uQ2FyZHMgKz0gcXR5OwogICAgfQoKICAgIC8vIOKUgOKUgCBIZWFsdGggQ2hlY2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgAoKICAgIC8qKgogICAgICogQ29tbWFuZGVyIGRlY2sgaGVhbHRoIGNoZWNrbGlzdCB3aXRoIHJlY29tbWVuZGVkIHJhbmdlcy4KICAgICAqIEJhc2VkIG9uIGNvbW1vbiBDb21tYW5kZXIgZGVja2J1aWxkaW5nIGd1aWRlbGluZXMuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZUhlYWx0aENoZWNrcyhEZWNrQW5hbHlzaXMgYSkgewogICAgICAgIGEuaGVhbHRoQ2hlY2tzLnB1dCgiTGFuZHMiLAogICAgICAgICAgICBuZXcgRGVja0FuYWx5c2lzLkhlYWx0aENoZWNrKCJMYW5kcyIsIGEubGFuZHMsIDM1LCA0MCkpOwogICAgICAgIGEuaGVhbHRoQ2hlY2tzLnB1dCgiUmFtcCIsCiAgICAgICAgICAgIG5ldyBEZWNrQW5hbHlzaXMuSGVhbHRoQ2hlY2soIlJhbXAiLCBhLnJhbXBDYXJkcywgOCwgMTUpKTsKICAgICAgICBhLmhlYWx0aENoZWNrcy5wdXQoIkNhcmQgRHJhdyIsCiAgICAgICAgICAgIG5ldyBEZWNrQW5hbHlzaXMuSGVhbHRoQ2hlY2soIkNhcmQgRHJhdyIsIGEuZHJhd0NhcmRzLCA4LCAxNSkpOwogICAgICAgIGEuaGVhbHRoQ2hlY2tzLnB1dCgiUmVtb3ZhbCIsCiAgICAgICAgICAgIG5ldyBEZWNrQW5hbHlzaXMuSGVhbHRoQ2hlY2soIlJlbW92YWwiLCBhLnJlbW92YWxDYXJkcywgOCwgMTIpKTsKICAgICAgICBhLmhlYWx0aENoZWNrcy5wdXQoIkJvYXJkIFdpcGVzIiwKICAgICAgICAgICAgbmV3IERlY2tBbmFseXNpcy5IZWFsdGhDaGVjaygiQm9hcmQgV2lwZXMiLCBhLmJvYXJkV2lwZXMsIDIsIDUpKTsKICAgICAgICBhLmhlYWx0aENoZWNrcy5wdXQoIlRvdGFsIENhcmRzIiwKICAgICAgICAgICAgbmV3IERlY2tBbmFseXNpcy5IZWFsdGhDaGVjaygiVG90YWwgQ2FyZHMiLCBhLnRvdGFsQ2FyZHMsIDk5LCAxMDApKTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIFN1bW1hcnkgT3V0cHV0CiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIFByaW50IGEgaHVtYW4tcmVhZGFibGUgYW5hbHlzaXMgc3VtbWFyeSB0byBzdGRvdXQuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN1bW1hcnkoRGVja0FuYWx5c2lzIGEpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlyIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCAi4pWRICBEZWNrIEFuYWx5c2lzOiAlLTQwcyDilZElbiIsIGEuZGVja05hbWUpOwogICAgICAgIGlmIChhLmNvbW1hbmRlck5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zigi4pWRICBDb21tYW5kZXI6ICUtNDRzIOKVkSVuIiwgYS5jb21tYW5kZXJOYW1lKTsKICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoICLilZEgIFRvdGFsIENhcmRzOiAlLTQyZCDilZElbiIsIGEudG90YWxDYXJkcyk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLilaDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilaMiKTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLilZEgIENBUkQgVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoICLi' +
'lZEgICAgTGFuZHM6ICAgICAgICAgJTNkICAgIENyZWF0dXJlczogICAgJTNkJW4iLCBhLmxhbmRzLCBhLmNyZWF0dXJlcyk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoICLilZEgICAgSW5zdGFudHM6ICAgICAgJTNkICAgIFNvcmNlcmllczogICAlM2QlbiIsIGEuaW5zdGFudHMsIGEuc29yY2VyaWVzKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZiggIuKVkSAgICBBcnRpZmFjdHM6ICAgICAlM2QgICAgRW5jaGFudG1lbnRzOiAlM2QlbiIsIGEuYXJ0aWZhY3RzLCBhLmVuY2hhbnRtZW50cyk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoICLilZEgICAgUGxhbmVzd2Fsa2VyczogJTNkJW4iLCBhLnBsYW5lc3dhbGtlcnMpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVkSIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi4pWRICBGVU5DVElPTkFMIFJPTEVTIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoICLilZEgICAgUmFtcDogICAgICAgJTNkICAgIENhcmQgRHJhdzogICAlM2QgICAgUmVtb3ZhbDogICAgICUzZCVuIiwKICAgICAgICAgICAgICAgIGEucmFtcENhcmRzLCBhLmRyYXdDYXJkcywgYS5yZW1vdmFsQ2FyZHMpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCAi4pWRICAgIFdpcGVzOiAgICAgICUzZCAgICBUdXRvcnM6ICAgICAgJTNkICAgIENvdW50ZXJzOiAgICAlM2QlbiIsCiAgICAgICAgICAgICAgICBhLmJvYXJkV2lwZXMsIGEudHV0b3JzLCBhLmNvdW50ZXJTcGVsbHMpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCAi4pWRICAgIFByb3RlY3Rpb246ICUzZCAgICBSZWN1cnNpb246ICAgJTNkJW4iLAogICAgICAgICAgICAgICAgYS5wcm90ZWN0aW9uQ2FyZHMsIGEucmVjdXJzaW9uQ2FyZHMpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVkSIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi4pWRICBIRUFMVEggQ0hFQ0tMSVNUIik7CiAgICAgICAgZm9yICh2YXIgY2hlY2sgOiBhLmhlYWx0aENoZWNrcy52YWx1ZXMoKSkgewogICAgICAgICAgICBTdHJpbmcgaWNvbiA9IHN3aXRjaCAoY2hlY2suc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBjYXNlICJnb29kIiAtPiAiW09LXSI7CiAgICAgICAgICAgICAgICBjYXNlICJsb3ciICAtPiAiW0xPV10iOwogICAgICAgICAgICAgICAgY2FzZSAiaGlnaCIgLT4gIltISUdIXSI7CiAgICAgICAgICAgICAgICBkZWZhdWx0IC0+ICJbPz9dIjsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIuKVkSAgICAlLTE0cyAlM2QgIChyZWNvbW1lbmRlZDogJWQtJWQpICAlcyVuIiwKICAgICAgICAgICAgICAgICAgICBjaGVjay5jYXRlZ29yeSwgY2hlY2suYWN0dWFsLCBjaGVjay5yZWNvbW1lbmRlZE1pbiwgY2hlY2sucmVjb21tZW5kZWRNYXgsIGljb24pOwogICAgICAgIH0KCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0iKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFuYWx5emUgYSBkZWNrIGZyb20gYSBGb3JnZSBkZWNrcyBkaXJlY3RvcnkgYnkgbmFtZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBEZWNrQW5hbHlzaXMgYW5hbHl6ZUZyb21Gb3JnZShTdHJpbmcgZGVja3NEaXIsIFN0cmluZyBkZWNrTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAvLyBUcnkgZXhhY3QgbWF0Y2ggZmlyc3QKICAgICAgICBQYXRoIGRlY2tQYXRoID0gUGF0aC5vZihkZWNrc0RpciwgZGVja05hbWUgKyAiLmRjayIpOwogICAgICAgIGlmICghRmlsZXMuZXhpc3RzKGRlY2tQYXRoKSkgewogICAgICAgICAgICAvLyBUcnkgY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2gKICAgICAgICAgICAgdHJ5ICh2YXIgc3RyZWFtID0gRmlsZXMubGlzdChQYXRoLm9mKGRlY2tzRGlyKSkpIHsKICAgICAgICAgICAgICAgIGRlY2tQYXRoID0gc3RyZWFtCiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihwIC0+IHAuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoZGVja05hbWUudG9Mb3dlckNhc2UoKSAr' +
'ICIuZGNrIikpCiAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpCiAgICAgICAgICAgICAgICAgICAgLm9yRWxzZShudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGRlY2tQYXRoID09IG51bGwgfHwgIUZpbGVzLmV4aXN0cyhkZWNrUGF0aCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRGVjayBub3QgZm91bmQ6ICIgKyBkZWNrTmFtZSArICIgaW4gIiArIGRlY2tzRGlyKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhbmFseXplKGRlY2tQYXRoLnRvU3RyaW5nKCkpOwogICAgfQp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\analytics\DeckAnalyzer.java' -B $b
# src/main/java/commanderailab/analytics/ReportAggregator.java (11,974 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5hbmFseXRpY3M7CgppbXBvcnQgY29tbWFuZGVyYWlsYWIuc2NoZW1hLkJhdGNoUmVzdWx0OwppbXBvcnQgY29tbWFuZGVyYWlsYWIuc2NoZW1hLkJhdGNoUmVzdWx0Lio7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuRGVja1JlcG9ydDsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5EZWNrUmVwb3J0Lio7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuUGVyQ2FyZEdhbWVTdGF0czsKaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOwppbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOwoKaW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEubmlvLmZpbGUuKjsKaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CgovKioKICogUmVwb3J0QWdncmVnYXRvciDigJQgVHJhbnNmb3JtcyByYXcgQmF0Y2hSZXN1bHQgZGF0YSBpbnRvIERlY2tSZXBvcnQgb2JqZWN0cy4KICoKICogUmVhZHMgYmF0Y2ggcmVzdWx0IEpTT04gZmlsZXMgYW5kIGNvbXB1dGVzOgogKiAgIC0gRGVjay1sZXZlbCBzdGF0czogd2luIHJhdGUsIGF2ZyBnYW1lIGxlbmd0aCwgbWF0Y2h1cCByZWNvcmRzCiAqICAgLSBQZXItY2FyZCBzdGF0czogZHJhd24vY2FzdCByYXRlcywgaW1wYWN0IHNjb3Jlcywgc3luZXJneSBzY29yZXMKICogICAtIFVuZGVycGVyZm9ybWVyL292ZXJwZXJmb3JtZXIgaWRlbnRpZmljYXRpb24KICogICAtIERlY2sgc3RydWN0dXJlIGFuYWx5c2lzCiAqCiAqIE91dHB1dDogd3JpdGVzIGRlY2stcmVwb3J0cy97ZGVja0lkfS5qc29uIHRvIGRpc2suCiAqLwpwdWJsaWMgY2xhc3MgUmVwb3J0QWdncmVnYXRvciB7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3NvbiBHU09OID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKCiAgICAvLyBUaHJlc2hvbGQgZm9yIGlkZW50aWZ5aW5nIHVuZGVycGVyZm9ybWVycyAoaW1wYWN0U2NvcmUgYmVsb3cgdGhpcykKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBVTkRFUlBFUkZPUk1FUl9USFJFU0hPTEQgPSAtMC4wNTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVU5ERVJQRVJGT1JNRVJTID0gODsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfT1ZFUlBFUkZPUk1FUlMgPSA4OwoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBEZWNrUmVwb3J0IGZvciBhIHNwZWNpZmljIGRlY2sgZnJvbSBtdWx0aXBsZSBiYXRjaCByZXN1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSBkZWNrSWQgICAgICAgVW5pcXVlIGRlY2sgaWRlbnRpZmllciAodHlwaWNhbGx5IGRlY2sgbmFtZSkKICAgICAqIEBwYXJhbSBkZWNrU2VhdCAgICAgVGhlIHNlYXQgaW5kZXggdGhpcyBkZWNrIG9jY3VwaWVkCiAgICAgKiBAcGFyYW0gYmF0Y2hSZXN1bHRzIExpc3Qgb2YgYmF0Y2ggcmVzdWx0cyB0byBhZ2dyZWdhdGUKICAgICAqIEByZXR1cm4gQ29tcGxldGUgRGVja1JlcG9ydAogICAgICovCiAgICBwdWJsaWMgRGVja1JlcG9ydCBnZW5lcmF0ZURlY2tSZXBvcnQoU3RyaW5nIGRlY2tJZCwgaW50IGRlY2tTZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJhdGNoUmVzdWx0PiBiYXRjaFJlc3VsdHMpIHsKICAgICAgICBEZWNrUmVwb3J0IHJlcG9ydCA9IG5ldyBEZWNrUmVwb3J0KCk7CiAgICAgICAgcmVwb3J0LmRlY2tJZCA9IGRlY2tJZDsKICAgICAgICByZXBvcnQubGFzdFVwZGF0ZWQgPSBJbnN0YW50Lm5vdygpLnRvU3RyaW5nKCk7CgogICAgICAgIC8vIENvbGxlY3QgYWxsIGdhbWVzIHdoZXJlIHRoaXMgZGVjayBwYXJ0aWNpcGF0ZWQKICAgICAgICBpbnQgdG90YWxHYW1lcyA9IDA7CiAgICAgICAgaW50IHRvdGFsV2lucyA9IDA7CiAgICAgICAgbG9uZyB0b3RhbFR1cm5zID0gMDsKICAgICAgICBsb25nIHRvdGFsVHVybnNPbldpbiA9IDA7CgogICAgICAgIC8vIFBlci1jYXJkIGFjY3VtdWxhdG9ycwogICAgICAgIE1hcDxTdHJpbmcsIENhcmRQZXJmb3JtYW5jZT4gY2FyZE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKCiAgICAgICAgLy8gTWF0Y2h1cCB0cmFja2luZzogb3Bwb25lbnQgZGVjayBuYW1lIC0+IFtnYW1lcywgd2luc10KICAgICAgICBNYXA8U3RyaW5nLCBpbnRbXT4gbWF0Y2h1cE1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKCiAg' +
'ICAgICAgLy8gV2luIGNvbmRpdGlvbiB0cmFja2luZwogICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IHdpbkNvbmRpdGlvbnMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CgogICAgICAgIGZvciAoQmF0Y2hSZXN1bHQgYmF0Y2ggOiBiYXRjaFJlc3VsdHMpIHsKICAgICAgICAgICAgLy8gRmluZCB0aGlzIGRlY2sncyBpbmZvCiAgICAgICAgICAgIERlY2tJbmZvIGRlY2tJbmZvID0gbnVsbDsKICAgICAgICAgICAgZm9yIChEZWNrSW5mbyBkaSA6IGJhdGNoLmRlY2tzKSB7CiAgICAgICAgICAgICAgICBpZiAoZGkuc2VhdEluZGV4ID09IGRlY2tTZWF0KSB7CiAgICAgICAgICAgICAgICAgICAgZGVja0luZm8gPSBkaTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGVja0luZm8gPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICAvLyBTZXQgY29tbWFuZGVyL2NvbG9yIGZyb20gZmlyc3QgYmF0Y2gKICAgICAgICAgICAgaWYgKHJlcG9ydC5jb21tYW5kZXIgPT0gbnVsbCB8fCByZXBvcnQuY29tbWFuZGVyLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgcmVwb3J0LmNvbW1hbmRlciA9IGRlY2tJbmZvLmNvbW1hbmRlck5hbWUgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICA/IGRlY2tJbmZvLmNvbW1hbmRlck5hbWUgOiBkZWNrSWQ7CiAgICAgICAgICAgICAgICBpZiAoZGVja0luZm8uY29sb3JJZGVudGl0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0LmNvbG9ySWRlbnRpdHkgPSBuZXcgQXJyYXlMaXN0PD4oZGVja0luZm8uY29sb3JJZGVudGl0eSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRyYWNrIG9wcG9uZW50cyBmb3IgbWF0Y2h1cHMKICAgICAgICAgICAgTGlzdDxTdHJpbmc+IG9wcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICBmb3IgKERlY2tJbmZvIGRpIDogYmF0Y2guZGVja3MpIHsKICAgICAgICAgICAgICAgIGlmIChkaS5zZWF0SW5kZXggIT0gZGVja1NlYXQpIHsKICAgICAgICAgICAgICAgICAgICBvcHBvbmVudHMuYWRkKGRpLmRlY2tOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUHJvY2VzcyBlYWNoIGdhbWUKICAgICAgICAgICAgZm9yIChHYW1lUmVzdWx0IGdhbWUgOiBiYXRjaC5nYW1lcykgewogICAgICAgICAgICAgICAgdG90YWxHYW1lcysrOwogICAgICAgICAgICAgICAgdG90YWxUdXJucyArPSBnYW1lLnRvdGFsVHVybnM7CgogICAgICAgICAgICAgICAgUGxheWVyUmVzdWx0IG15UmVzdWx0ID0gbnVsbDsKICAgICAgICAgICAgICAgIGZvciAoUGxheWVyUmVzdWx0IHByIDogZ2FtZS5wbGF5ZXJSZXN1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByLnNlYXRJbmRleCA9PSBkZWNrU2VhdCkgewogICAgICAgICAgICAgICAgICAgICAgICBteVJlc3VsdCA9IHByOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobXlSZXN1bHQgPT0gbnVsbCkgY29udGludWU7CgogICAgICAgICAgICAgICAgYm9vbGVhbiB3b24gPSBteVJlc3VsdC5pc1dpbm5lcjsKICAgICAgICAgICAgICAgIGlmICh3b24pIHsKICAgICAgICAgICAgICAgICAgICB0b3RhbFdpbnMrKzsKICAgICAgICAgICAgICAgICAgICB0b3RhbFR1cm5zT25XaW4gKz0gZ2FtZS50b3RhbFR1cm5zOwogICAgICAgICAgICAgICAgICAgIGlmIChnYW1lLndpbkNvbmRpdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbkNvbmRpdGlvbnMubWVyZ2UoZ2FtZS53aW5Db25kaXRpb24sIDEsIEludGVnZXI6OnN1bSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRyYWNrIG1hdGNodXBzCiAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBvcHAgOiBvcHBvbmVudHMpIHsKICAgICAgICAgICAgICAgICAgICBpbnRbXSBzdGF0cyA9IG1hdGNodXBNYXAuY29tcHV0ZUlmQWJzZW50KG9wcCwgayAtPiBuZXcgaW50WzJdKTsKICAgICAgICAgICAgICAgICAgICBzdGF0c1swXSsrOyAvLyBnYW1lcwogICAgICAgICAgICAgICAgICAgIGlmICh3b24pIHN0YXRzWzFdKys7IC8vIHdpbnMKICAgICAgICAgICAgICAgIH0KCiAg' +
'ICAgICAgICAgICAgICAvLyBBZ2dyZWdhdGUgcGVyLWNhcmQgc3RhdHMgaWYgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICBpZiAobXlSZXN1bHQuY2FyZFN0YXRzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKFBlckNhcmRHYW1lU3RhdHMgcGNzIDogbXlSZXN1bHQuY2FyZFN0YXRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIENhcmRQZXJmb3JtYW5jZSBjcCA9IGNhcmRNYXAuY29tcHV0ZUlmQWJzZW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjcy5jYXJkTmFtZSwgbmFtZSAtPiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmRQZXJmb3JtYW5jZSBjID0gbmV3IENhcmRQZXJmb3JtYW5jZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLm5hbWUgPSBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNwLmdhbWVzU2VlbisrOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjcy5kcmF3bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AuZ2FtZXNEcmF3bisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjcy5jYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AuZ2FtZXNDYXN0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AuZ2FtZXNXaGVuQ2FzdCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b24pIGNwLndpbnNXaGVuQ2FzdCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY3MudHVybkNhc3QgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC50b3RhbFR1cm5DYXN0ICs9IHBjcy50dXJuQ2FzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNzLnN0dWNrSW5IYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AuZ2FtZXNEZWFkQ2FyZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNzLmluT3BlbmluZ0hhbmQgJiYgcGNzLmtlcHRJbk9wZW5pbmdIYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5nYW1lc0tlcHRJbk9wZW5pbmcrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY3AudG90YWxEYW1hZ2UgKz0gcGNzLmRhbWFnZURlYWx0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIENvbXB1dGUgZGVjay1sZXZlbCBzdGF0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICAgICAgcmVwb3J0Lm1ldGEuZ2FtZXNTaW11bGF0ZWQgPSB0b3RhbEdhbWVzOwogICAgICAgIHJlcG9ydC5tZXRhLm92ZXJhbGxXaW5SYXRlID0gdG90YWxHYW1lcyA+IDAKICAgICAgICAgICAgICAgID8gKGRvdWJsZSkgdG90YWxXaW5zIC8gdG90YWxHYW1lcyA6IDAuMDsKICAgICAgICByZXBvcnQubWV0YS5hdmdHYW1lTGVuZ3RoID0gdG90YWxHYW1lcyA+IDAKICAgICAgICAgICAgICAgID8gKGRvdWJsZSkgdG90YWxUdXJucyAvIHRvdGFsR2FtZXMgOiAwLjA7CgogICAgICAgIC8vIOKUgOKUgCBDb21wdXRlIG1hdGNodXBzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIGludFtdPiBlbnRyeSA6IG1hdGNodXBNYXAuZW50cnlTZXQoKSkgewogICAgICAgICAgICBNYXRjaHVwUmVjb3JkIG1yID0gbmV3IE1hdGNodXBSZWNvcmQoKTsKICAgICAgICAgICAgbXIub3Bwb25lbnREZWNrID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgIG1yLmdhbWVzUGxheWVkID0gZW50cnkuZ2V0VmFsdWUoKVswXTsKICAg' +
'ICAgICAgICAgbXIud2luUmF0ZSA9IG1yLmdhbWVzUGxheWVkID4gMAogICAgICAgICAgICAgICAgICAgID8gKGRvdWJsZSkgZW50cnkuZ2V0VmFsdWUoKVsxXSAvIG1yLmdhbWVzUGxheWVkIDogMC4wOwogICAgICAgICAgICByZXBvcnQubWF0Y2h1cHMuYWRkKG1yKTsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBDb21wdXRlIHBlci1jYXJkIHBlcmZvcm1hbmNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgICAgICBkb3VibGUgb3ZlcmFsbFdpblJhdGUgPSByZXBvcnQubWV0YS5vdmVyYWxsV2luUmF0ZTsKCiAgICAgICAgZm9yIChDYXJkUGVyZm9ybWFuY2UgY3AgOiBjYXJkTWFwLnZhbHVlcygpKSB7CiAgICAgICAgICAgIGludCBncyA9IGNwLmdhbWVzU2VlbjsKICAgICAgICAgICAgaWYgKGdzID09IDApIGNvbnRpbnVlOwoKICAgICAgICAgICAgY3AuZHJhd25SYXRlID0gKGRvdWJsZSkgY3AuZ2FtZXNEcmF3biAvIGdzOwogICAgICAgICAgICBjcC5jYXN0UmF0ZSA9IGNwLmdhbWVzRHJhd24gPiAwCiAgICAgICAgICAgICAgICAgICAgPyAoZG91YmxlKSBjcC5nYW1lc0Nhc3QgLyBjcC5nYW1lc0RyYXduIDogMC4wOwogICAgICAgICAgICBjcC5kZWFkQ2FyZFJhdGUgPSBjcC5nYW1lc0RyYXduID4gMAogICAgICAgICAgICAgICAgICAgID8gKGRvdWJsZSkgY3AuZ2FtZXNEZWFkQ2FyZCAvIGNwLmdhbWVzRHJhd24gOiAwLjA7CiAgICAgICAgICAgIGNwLmtlcHRJbk9wZW5pbmdIYW5kUmF0ZSA9IGdzID4gMAogICAgICAgICAgICAgICAgICAgID8gKGRvdWJsZSkgY3AuZ2FtZXNLZXB0SW5PcGVuaW5nIC8gZ3MgOiAwLjA7CgogICAgICAgICAgICAvLyBJbXBhY3Qgc2NvcmU6IGhvdyBtdWNoIGRvZXMgY2FzdGluZyB0aGlzIGNhcmQgY29ycmVsYXRlIHdpdGggd2lubmluZz8KICAgICAgICAgICAgZG91YmxlIHdpblJhdGVXaGVuQ2FzdCA9IGNwLmdhbWVzV2hlbkNhc3QgPiAwCiAgICAgICAgICAgICAgICAgICAgPyAoZG91YmxlKSBjcC53aW5zV2hlbkNhc3QgLyBjcC5nYW1lc1doZW5DYXN0IDogMC4wOwogICAgICAgICAgICBjcC5pbXBhY3RTY29yZSA9ICh3aW5SYXRlV2hlbkNhc3QgLSBvdmVyYWxsV2luUmF0ZSkgKiBjcC5jYXN0UmF0ZTsKCiAgICAgICAgICAgIC8vIENsdW5raW5lc3M6IGhpZ2ggZGVhZCBjYXJkIHJhdGUgKyBsb3cgY2FzdCByYXRlID0gY2x1bmt5CiAgICAgICAgICAgIGNwLmNsdW5raW5lc3NTY29yZSA9IGNwLmRlYWRDYXJkUmF0ZSAqICgxLjAgLSBjcC5jYXN0UmF0ZSk7CgogICAgICAgICAgICAvLyBBdmVyYWdlIHR1cm4gY2FzdAogICAgICAgICAgICBjcC5hdmdUdXJuQ2FzdCA9IGNwLmdhbWVzQ2FzdCA+IDAKICAgICAgICAgICAgICAgICAgICA/IGNwLnRvdGFsVHVybkNhc3QgLyBjcC5nYW1lc0Nhc3QgOiBudWxsOwoKICAgICAgICAgICAgY3AuYXZnRGFtYWdlRGVhbHQgPSBncyA+IDAgPyBjcC50b3RhbERhbWFnZSAvIGdzIDogMC4wOwoKICAgICAgICAgICAgcmVwb3J0LmNhcmRzLmFkZChjcCk7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgSWRlbnRpZnkgdW5kZXIvb3ZlciBwZXJmb3JtZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgICAgICBMaXN0PENhcmRQZXJmb3JtYW5jZT4gc29ydGVkID0gcmVwb3J0LmNhcmRzLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAuc29ydGVkKENvbXBhcmF0b3IuY29tcGFyaW5nRG91YmxlKGMgLT4gYy5pbXBhY3RTY29yZSkpCiAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXRoLm1pbihNQVhfVU5ERVJQRVJGT1JNRVJTLCBzb3J0ZWQuc2l6ZSgpKTsgaSsrKSB7CiAgICAgICAgICAgIENhcmRQZXJmb3JtYW5jZSBjcCA9IHNvcnRlZC5nZXQoaSk7CiAgICAgICAgICAgIGlmIChjcC5pbXBhY3RTY29yZSA8IFVOREVSUEVSRk9STUVSX1RIUkVTSE9MRCkgewogICAgICAgICAgICAgICAgcmVwb3J0LnVuZGVycGVyZm9ybWVycy5hZGQoY3AubmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaW50IGkgPSBzb3J0ZWQuc2l6ZSgpIC0gMTsKICAgICAgICAgICAgIGkgPj0gTWF0aC5tYXgoMCwgc29ydGVkLnNpemUoKSAtIE1BWF9PVkVSUEVSRk9STUVSUyk7' +
'IGktLSkgewogICAgICAgICAgICBDYXJkUGVyZm9ybWFuY2UgY3AgPSBzb3J0ZWQuZ2V0KGkpOwogICAgICAgICAgICBpZiAoY3AuaW1wYWN0U2NvcmUgPiAwKSB7CiAgICAgICAgICAgICAgICByZXBvcnQub3ZlcnBlcmZvcm1lcnMuYWRkKGNwLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVwb3J0OwogICAgfQoKICAgIC8qKgogICAgICogU2F2ZSBhIERlY2tSZXBvcnQgYXMgSlNPTiB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KICAgICAqLwogICAgcHVibGljIHZvaWQgc2F2ZURlY2tSZXBvcnQoRGVja1JlcG9ydCByZXBvcnQsIFBhdGggb3V0cHV0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKG91dHB1dERpcik7CiAgICAgICAgUGF0aCBvdXRGaWxlID0gb3V0cHV0RGlyLnJlc29sdmUocmVwb3J0LmRlY2tJZCArICIuanNvbiIpOwogICAgICAgIHRyeSAoV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG91dEZpbGUudG9GaWxlKCkpKSB7CiAgICAgICAgICAgIEdTT04udG9Kc29uKHJlcG9ydCwgd3JpdGVyKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb2FkIGEgRGVja1JlcG9ydCBmcm9tIEpTT04gZmlsZS4KICAgICAqLwogICAgcHVibGljIERlY2tSZXBvcnQgbG9hZERlY2tSZXBvcnQoUGF0aCByZXBvcnRGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIHRyeSAoUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHJlcG9ydEZpbGUudG9GaWxlKCkpKSB7CiAgICAgICAgICAgIHJldHVybiBHU09OLmZyb21Kc29uKHJlYWRlciwgRGVja1JlcG9ydC5jbGFzcyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTG9hZCBhIEJhdGNoUmVzdWx0IGZyb20gSlNPTiBmaWxlLgogICAgICovCiAgICBwdWJsaWMgQmF0Y2hSZXN1bHQgbG9hZEJhdGNoUmVzdWx0KFBhdGggcmVzdWx0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICB0cnkgKFJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihyZXN1bHRGaWxlLnRvRmlsZSgpKSkgewogICAgICAgICAgICByZXR1cm4gR1NPTi5mcm9tSnNvbihyZWFkZXIsIEJhdGNoUmVzdWx0LmNsYXNzKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWJ1aWxkIGFsbCBkZWNrIHJlcG9ydHMgZnJvbSBhIGRpcmVjdG9yeSBvZiBiYXRjaCByZXN1bHQgSlNPTnMuCiAgICAgKi8KICAgIHB1YmxpYyBMaXN0PERlY2tSZXBvcnQ+IHJlYnVpbGRBbGxSZXBvcnRzKFBhdGggaW5wdXRMb2dzRGlyLCBQYXRoIG91dHB1dERpcikKICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBMaXN0PEJhdGNoUmVzdWx0PiBhbGxSZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CgogICAgICAgIC8vIExvYWQgYWxsIGJhdGNoIHJlc3VsdCBmaWxlcwogICAgICAgIHRyeSAodmFyIHN0cmVhbSA9IEZpbGVzLmxpc3QoaW5wdXRMb2dzRGlyKSkgewogICAgICAgICAgICBzdHJlYW0uZmlsdGVyKHAgLT4gcC50b1N0cmluZygpLmVuZHNXaXRoKCIuanNvbiIpKQogICAgICAgICAgICAgICAgICAuZm9yRWFjaChwIC0+IHsKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVzdWx0cy5hZGQobG9hZEJhdGNoUmVzdWx0KHApKTsKICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZhaWxlZCB0byBsb2FkOiAiICsgcCArICIgLSAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChhbGxSZXN1bHRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGJhdGNoIHJlc3VsdCBmaWxlcyBmb3VuZCBpbiAiICsgaW5wdXRMb2dzRGlyKTsKICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gRmluZCBhbGwgdW5pcXVlIGRlY2tzIGFjcm9zcyBiYXRjaGVzCiAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gZGVja1NlYXRzID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgIGZvciAoQmF0Y2hSZXN1bHQgYnIgOiBhbGxSZXN1bHRzKSB7CiAgICAgICAgICAgIGZvciAoRGVja0lu' +
'Zm8gZGkgOiBici5kZWNrcykgewogICAgICAgICAgICAgICAgZGVja1NlYXRzLnB1dElmQWJzZW50KGRpLmRlY2tOYW1lLCBkaS5zZWF0SW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBHZW5lcmF0ZSByZXBvcnQgZm9yIGVhY2ggZGVjawogICAgICAgIExpc3Q8RGVja1JlcG9ydD4gcmVwb3J0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkgOiBkZWNrU2VhdHMuZW50cnlTZXQoKSkgewogICAgICAgICAgICBEZWNrUmVwb3J0IHJlcG9ydCA9IGdlbmVyYXRlRGVja1JlcG9ydCgKICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgYWxsUmVzdWx0cyk7CiAgICAgICAgICAgIHNhdmVEZWNrUmVwb3J0KHJlcG9ydCwgb3V0cHV0RGlyKTsKICAgICAgICAgICAgcmVwb3J0cy5hZGQocmVwb3J0KTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIkdlbmVyYXRlZCByZXBvcnQgZm9yICVzOiAlZCBnYW1lcywgJS4xZiUlIHdpbiByYXRlJW4iLAogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5kZWNrSWQsIHJlcG9ydC5tZXRhLmdhbWVzU2ltdWxhdGVkLAogICAgICAgICAgICAgICAgICAgIHJlcG9ydC5tZXRhLm92ZXJhbGxXaW5SYXRlICogMTAwKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXBvcnRzOwogICAgfQp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\analytics\ReportAggregator.java' -B $b
# src/main/java/commanderailab/batch/BatchRunner.java (54,039 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5iYXRjaDsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5haS5BaVBvbGljeTsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLm1sLkRlY2lzaW9uRXh0cmFjdG9yOwppbXBvcnQgY29tbWFuZGVyYWlsYWIubWwuRGVjaXNpb25Mb2dnZXI7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuQmF0Y2hSZXN1bHQ7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuQmF0Y2hSZXN1bHQuKjsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5EZWNpc2lvblNuYXBzaG90OwppbXBvcnQgY29tbWFuZGVyYWlsYWIuc2NoZW1hLlBlckNhcmRHYW1lU3RhdHM7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuV2luQ29uZGl0aW9uOwppbXBvcnQgY29tbWFuZGVyYWlsYWIuc3RhdHMuU3RhdHNBZ2dyZWdhdG9yOwoKaW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKaW1wb3J0IGphdmEubmlvLmZpbGUuKjsKaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwppbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CmltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0dGVyOwppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKCi8qKgogKiBCYXRjaFJ1bm5lciDigJQgU2luZ2xlLXRocmVhZGVkIGJhdGNoIHNpbXVsYXRpb24gcnVubmVyLgogKgogKiBJbnZva2VzIEZvcmdlJ3Mgc2ltIG1vZGUgdmlhIHN1YnByb2Nlc3MgZm9yIGVhY2ggZ2FtZSBpbiB0aGUgYmF0Y2gsCiAqIHBhcnNlcyBzdGRvdXQgb3V0cHV0LCBhbmQgY29sbGVjdHMgR2FtZVJlc3VsdCBvYmplY3RzLgogKgogKiB2MjQgY2hhbmdlcyAoR2l0SHViIElzc3VlcyAjMS0jNSk6CiAqICAgLSBJc3N1ZSAjMTogV2lubmVyJ3MgbGlmZSB0b3RhbCBub3cgaW5mZXJyZWQgZnJvbSByZW1haW5pbmcgcGxheWVyIGFmdGVyIGxvc2VycyBpZGVudGlmaWVkCiAqICAgLSBJc3N1ZSAjMjogV2luIGNvbmRpdGlvbiBjbGFzc2lmaWNhdGlvbiB1c2VzIGZvcm1hbCBXaW5Db25kaXRpb24gZW51bSB3aXRoIFVOS05PV04gZmFsbGJhY2sgKyBsb2dnaW5nCiAqICAgLSBJc3N1ZSAjMzogSlZNIHByb2Nlc3MgcG9vbGluZyB2aWEgcGVyc2lzdGVudCBGb3JnZSB3b3JrZXJzIChlbGltaW5hdGVzIHBlci1nYW1lIEpWTSBzdGFydHVwKQogKiAgIC0gSXNzdWUgIzQ6IENvbmZpZ3VyYWJsZSBGb3JnZSBBSSBmbGFncywgc2luZ2xlLWdhbWUgYmVuY2htYXJraW5nIHN1cHBvcnQKICogICAtIElzc3VlICM1OiBSZWFsLXRpbWUgc2ltcy9zZWMgcmVwb3J0aW5nIHZpYSBwcm9ncmVzcyBjYWxsYmFjawogKgogKiBGb3JnZSBvdXRwdXQgZm9ybWF0ICh3aXRoIC1xIGZsYWcpOgogKiAgIEdhbWUgT3V0Y29tZTogVHVybiAxMQogKiAgIEdhbWUgT3V0Y29tZTogQWkoMSktRWRnYXIgTWFya292IGhhcyB3b24gYmVjYXVzZSBhbGwgb3Bwb25lbnRzIGhhdmUgbG9zdAogKiAgIEdhbWUgT3V0Y29tZTogQWkoMiktR3JpbWdyaW4gaGFzIGxvc3QgYmVjYXVzZSBsaWZlIHRvdGFsIHJlYWNoZWQgMAogKiAgIEdhbWUgT3V0Y29tZTogQWkoMyktWHlyaXMgaGFzIGxvc3QgYmVjYXVzZSBsaWZlIHRvdGFsIHJlYWNoZWQgMAogKiAgIE1hdGNoIFJlc3VsdDogQWkoMSktRWRnYXIgTWFya292OiAxIEFpKDIpLUdyaW1ncmluOiAwIEFpKDMpLVh5cmlzOiAwCiAqICAgR2FtZSBSZXN1bHQ6IEdhbWUgMSBlbmRlZCBpbiA5MjAxIG1zLiBBaSgxKS1FZGdhciBNYXJrb3YgaGFzIHdvbiEKICovCnB1YmxpYyBjbGFzcyBCYXRjaFJ1bm5lciB7CgogICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZm9yZ2VKYXJQYXRoOyAgICAvLyBQYXRoIHRvIGZvcmdlLWd1aS1kZXNrdG9wIEpBUiAoamFyLXdpdGgtZGVwZW5kZW5jaWVzKQogICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZm9yZ2VXb3JrRGlyOyAgICAvLyBXb3JraW5nIGRpcmVjdG9yeSBmb3IgRm9yZ2UgKHdoZXJlIHJlcy8gZm9sZGVyIGlzKQogICAgcHJpdmF0ZSBmaW5hbCBMaXN0PERlY2tJbmZvPiBkZWNrczsgICAvLyBFeGFjdGx5IDMgZGVja3MKICAgIHByaXZhdGUgZmluYWwgQWlQb2xpY3kgcG9saWN5OwogICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHF1aWV0OwogICAgcHJpdmF0ZSBmaW5hbCBpbnQgY2xvY2tTZWNvbmRzOyAgICAgICAvLyBNYXggc2Vjb25kcyBwZXIgZ2FtZSBiZWZvcmUgZHJhdyAoZGVmYXVsdCAxMjApCiAgICBwcml2YXRlIFN0cmluZyBqYXZhUGF0aCA9' +
'ICJqYXZhIjsgICAgIC8vIFBhdGggdG8gSmF2YSAxNyBleGVjdXRhYmxlIChGb3JnZSByZXF1aXJlcyBKYXZhIDE3KQoKICAgIC8vIOKUgOKUgCBNTCBEZWNpc2lvbiBMb2dnaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHJpdmF0ZSBib29sZWFuIG1sTG9nZ2luZ0VuYWJsZWQgPSBmYWxzZTsKICAgIHByaXZhdGUgRGVjaXNpb25Mb2dnZXIgbWxEZWNpc2lvbkxvZ2dlcjsKICAgIHByaXZhdGUgU3RyaW5nIG1sUmVzdWx0c0RpciA9ICJyZXN1bHRzIjsKCiAgICAvLyDilIDilIAgUHJvZ3Jlc3MgY2FsbGJhY2sgKElzc3VlICM1KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHByaXZhdGUgUHJvZ3Jlc3NDYWxsYmFjayBwcm9ncmVzc0NhbGxiYWNrOwoKICAgIC8vIOKUgOKUgCBKVk0gUHJvY2VzcyBQb29sIChJc3N1ZSAjMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwcml2YXRlIGJvb2xlYW4gdXNlUHJvY2Vzc1Bvb2wgPSB0cnVlOwogICAgcHJpdmF0ZSBpbnQgcG9vbFNpemUgPSAxOyAgLy8gRm9yIHNpbmdsZS10aHJlYWQgcnVubmVyLCBwb29sIG9mIDEgaXMgZmluZQogICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZvcmdlV29ya2VyPiB3b3JrZXJQb29sID0gbmV3IEFycmF5TGlzdDw+KCk7CgogICAgLy8g4pSA4pSAIEZvcmdlIEFJIG9wdGltaXphdGlvbiBmbGFncyAoSXNzdWUgIzQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHJpdmF0ZSBib29sZWFuIHVzZVNpbXBsaWZpZWRBaSA9IGZhbHNlOyAgIC8vIFVzZSBmYXN0ZXIgQUkgcHJvZmlsZSBmb3Igc2ltcwogICAgcHJpdmF0ZSBpbnQgYWlUaGlua1RpbWVNcyA9IC0xOyAgICAgICAgICAgIC8vIC0xID0gRm9yZ2UgZGVmYXVsdDsgPjAgPSBjYXAgQUkgdGhpbmsgdGltZQoKICAgIC8vIOKUgOKUgCBSZWdleCBwYXR0ZXJucyBmb3IgcGFyc2luZyBGb3JnZSBzaW0gb3V0cHV0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIC8vICJHYW1lIE91dGNvbWU6IFR1cm4gMTEiCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFRVUk5fUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiR2FtZSBPdXRjb21lOlxccypUdXJuXFxzKyhcXGQrKSIpOwoKICAgIC8vICJHYW1lIE91dGNvbWU6IEFpKDEpLUVkZ2FyIE1hcmtvdiBoYXMgd29uIGJlY2F1c2UgYWxsIG9wcG9uZW50cyBoYXZlIGxvc3QiCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFdJTk5FUl9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJHYW1lIE91dGNvbWU6XFxzKkFpXFwoKFxcZCspXFwpLSguKz8pXFxzK2hhcyB3b24gYmVjYXVzZSAoLispIik7CgogICAgLy8gIkdhbWUgT3V0Y29tZTogQWkoMiktR3JpbWdyaW4gaGFzIGxvc3QgYmVjYXVzZSBsaWZlIHRvdGFsIHJlYWNoZWQgMCIKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTE9TRVJfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiR2FtZSBPdXRjb21lOlxccypBaVxcKChcXGQrKVxcKS0oLis/KVxccytoYXMgbG9zdCBiZWNhdXNlICguKykiKTsKCiAgICAvLyAiR2FtZSBSZXN1bHQ6IEdhbWUgMSBlbmRlZCBpbiA5MjAxIG1zLiBBaSgxKS1FZGdhciBNYXJrb3YgaGFzIHdvbiEiCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEdBTUVfUkVTVUxUX1BBVFRFUk4gPQogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkdhbWUgUmVzdWx0OlxccypHYW1lXFxzKyhcXGQrKVxccytlbmRlZCBpblxccysoXFxkKylcXHMqbXNcXC5cXHMqKC4rPylcXHMraGFzIHdvbiEiKTsKCiAgICAvLyAiR2FtZSBSZXN1bHQ6IEdhbWUgMSBlbmRlZCBpbiA5MjAxIG1zLiBJdCdzIGEgZHJhdyEiICAodGltZW91dC9kcmF3IGNhc2UpCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEdBTUVfRFJBV19QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJHYW1lIFJlc3VsdDpcXHMqR2FtZVxc' +
'cysoXFxkKylcXHMrZW5kZWQgaW5cXHMrKFxcZCspXFxzKm1zXFwuLitkcmF3IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKCiAgICAvLyAiTWF0Y2ggUmVzdWx0OiBBaSgxKS1FZGdhciBNYXJrb3Y6IDEgQWkoMiktR3JpbWdyaW46IDAgQWkoMyktWHlyaXM6IDAiCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE1BVENIX1JFU1VMVF9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJNYXRjaCBSZXN1bHQ6Iik7CgogICAgLy8g4pSA4pSAIExpZmUgdG90YWwgdHJhY2tpbmcgcGF0dGVybnMgKElzc3VlICMxKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIC8vIFZlcmJvc2UgRm9yZ2UgbG9nOiAiQWkoMSktTmFtZSdzIGxpZmUgaXMgbm93IDI3LiIgb3IgIkFpKDEpLU5hbWUncyBsaWZlIHRvdGFsIGlzIG5vdyAyNyIKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTElGRV9UT1RBTF9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJBaVxcKChcXGQrKVxcKS0uKz8nc1xccytsaWZlKD86XFxzK3RvdGFsKT9cXHMraXNcXHMrbm93XFxzKygtP1xcZCspIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKCiAgICAvLyAiQWkoMSktTmFtZSBsb3NlcyBOIGxpZmUiIOKAlCBsaWZlIGxvc3MgZXZlbnQKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTElGRV9MT1NTX1BBVFRFUk4gPQogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkFpXFwoKFxcZCspXFwpLS4rP1xccytsb3Nlc1xccysoXFxkKylcXHMrbGlmZSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gIkFpKDEpLU5hbWUgZ2FpbnMgTiBsaWZlIiDigJQgbGlmZSBnYWluIGV2ZW50CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIExJRkVfR0FJTl9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJBaVxcKChcXGQrKVxcKS0uKz9cXHMrZ2FpbnNcXHMrKFxcZCspXFxzK2xpZmUiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwoKICAgIC8vIOKUgOKUgCBWZXJib3NlIGdhbWUtbG9nIHBhdHRlcm5zIGZvciBleHRyYWN0aW5nIGNvbWJhdCBzdGF0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICAvLyAiQWkoMSktTmFtZSBjYXN0cyBDYXJkTmFtZSIg4oCUIGFueSBzcGVsbCBjYXN0CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIENBU1RfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiQWlcXCgoXFxkKylcXCktW15cXHNdLio/XFxzK2Nhc3RzXFxzKyguKz8pXFwuIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKCiAgICAvLyAiQWkoMSktTmFtZSBwbGF5cyBMYW5kIiDigJQgbGFuZCBkcm9wCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIExBTkRfUExBWV9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJBaVxcKChcXGQrKVxcKS1bXlxcc10uKj9cXHMrcGxheXNcXHMrKC4rPylcXC4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwoKICAgIC8vICIuLi5pcyBkZXN0cm95ZWQiIG9yICIuLi5pcyBwdXQgaW50byBncmF2ZXlhcmQgZnJvbSB0aGUgYmF0dGxlZmllbGQiCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIENSRUFUVVJFX0RFU1RST1lFRF9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoaXMgZGVzdHJveWVkfGRpZXN8aXMgcHV0IGludG8gLiogZ3JhdmV5YXJkIGZyb20gdGhlIGJhdHRsZWZpZWxkKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gImRlYWxzIE4gY29tYmF0IGRhbWFnZSIgb3IgImRlYWxzIE4gZGFtYWdlIHRvIEFpKFgpIgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBEQU1BR0VfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiZGVhbHNcXHMrKFxcZCspXFxzKyg/OmNvbWJhdFxccyspP2RhbWFnZVxccyt0b1xccytBaVxcKChcXGQrKVxcKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gImNvbW1hbmRlciBkYW1hZ2UiIOKAlCBzcGVjaWZpY2FsbHkgY29tbWFuZGVyIGRhbWFnZSBkZWFsdAogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBDTURSX0RBTUFHRV9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJB' +
'aVxcKChcXGQrKVxcKS4qP2NvbW1hbmRlci4qP2RhbWFnZS4qPyhcXGQrKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8g4pSA4pSAIFBlci1jYXJkIHRyYWNraW5nIHBhdHRlcm5zICh2ZXJib3NlIGxvZykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgLy8gIkFpKDEpLU5hbWUgZHJhd3MgQ2FyZE5hbWUuIiDigJQgY2FyZCBkcmF3bgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBEUkFXX1BBVFRFUk4gPQogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkFpXFwoKFxcZCspXFwpLVteXFxzXS4qP1xccytkcmF3c1xccysoLis/KVxcLiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gVHVybiBib3VuZGFyeTogIlR1cm4gNSAoQWkoMSktTmFtZSkiIG9yICJUdXJuIDUgKEFpKDIpLU5hbWUpIgogICAgLy8gU29tZSBGb3JnZSB2ZXJzaW9ucyB1c2U6ICI9PSBUdXJuIFggKEFpKE4pLU5hbWUpID09IgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBWRVJCT1NFX1RVUk5fUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiVHVyblxccysoXFxkKylcXHMrXFwoQWlcXCgoXFxkKylcXCkiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwoKICAgIC8vICJDYXJkTmFtZSBkZWFscyBOIGRhbWFnZSIg4oCUIGRhbWFnZSBieSBhIHNwZWNpZmljIGNhcmQKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gQ0FSRF9EQU1BR0VfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKC4rPylcXHMrZGVhbHNcXHMrKFxcZCspXFxzKyg/OmNvbWJhdFxccyspP2RhbWFnZSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgcHVibGljIEJhdGNoUnVubmVyKFN0cmluZyBmb3JnZUphclBhdGgsIFN0cmluZyBmb3JnZVdvcmtEaXIsIExpc3Q8RGVja0luZm8+IGRlY2tzLCBBaVBvbGljeSBwb2xpY3kpIHsKICAgICAgICB0aGlzKGZvcmdlSmFyUGF0aCwgZm9yZ2VXb3JrRGlyLCBkZWNrcywgcG9saWN5LCBmYWxzZSwgMTIwKTsgIC8vIHZlcmJvc2UgYnkgZGVmYXVsdCBmb3IgY29tYmF0IHN0YXRzCiAgICB9CgogICAgcHVibGljIEJhdGNoUnVubmVyKFN0cmluZyBmb3JnZUphclBhdGgsIFN0cmluZyBmb3JnZVdvcmtEaXIsIExpc3Q8RGVja0luZm8+IGRlY2tzLAogICAgICAgICAgICAgICAgICAgICAgIEFpUG9saWN5IHBvbGljeSwgYm9vbGVhbiBxdWlldCwgaW50IGNsb2NrU2Vjb25kcykgewogICAgICAgIHRoaXMoZm9yZ2VKYXJQYXRoLCBmb3JnZVdvcmtEaXIsIGRlY2tzLCBwb2xpY3ksIHF1aWV0LCBjbG9ja1NlY29uZHMsICJqYXZhIik7CiAgICB9CgogICAgcHVibGljIEJhdGNoUnVubmVyKFN0cmluZyBmb3JnZUphclBhdGgsIFN0cmluZyBmb3JnZVdvcmtEaXIsIExpc3Q8RGVja0luZm8+IGRlY2tzLAogICAgICAgICAgICAgICAgICAgICAgIEFpUG9saWN5IHBvbGljeSwgYm9vbGVhbiBxdWlldCwgaW50IGNsb2NrU2Vjb25kcywgU3RyaW5nIGphdmFQYXRoKSB7CiAgICAgICAgaWYgKGRlY2tzLnNpemUoKSAhPSAzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInYxIHJlcXVpcmVzIGV4YWN0bHkgMyBkZWNrcywgZ290ICIgKyBkZWNrcy5zaXplKCkpOwogICAgICAgIH0KICAgICAgICB0aGlzLmZvcmdlSmFyUGF0aCA9IGZvcmdlSmFyUGF0aDsKICAgICAgICB0aGlzLmZvcmdlV29ya0RpciA9IGZvcmdlV29ya0RpcjsKICAgICAgICB0aGlzLmRlY2tzID0gZGVja3M7CiAgICAgICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7CiAgICAgICAgdGhpcy5xdWlldCA9IHF1aWV0OwogICAgICAgIHRoaXMuY2xvY2tTZWNvbmRzID0gY2xvY2tTZWNvbmRzOwogICAgICAgIHRoaXMuamF2YVBhdGggPSAoamF2YVBhdGggIT0gbnVsbCAmJiAhamF2YVBhdGguaXNFbXB0eSgpKSA/IGphdmFQYXRoIDogImphdmEiOwogICAgfQoKICAgIC8vIOKUgOKUgCBDb25maWd1cmF0aW9uIG1ldGhvZHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgLyoqCiAgICAgKiBTZXQgYSBwcm9ncmVzcyBjYWxsYmFjayBmb3IgcmVhbC10aW1lIHNpbXMvc2VjIHJlcG9y' +
'dGluZyAoSXNzdWUgIzUpLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc0NhbGxiYWNrKFByb2dyZXNzQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICAgICB0aGlzLnByb2dyZXNzQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIH0KCiAgICAvKioKICAgICAqIEVuYWJsZS9kaXNhYmxlIEpWTSBwcm9jZXNzIHBvb2xpbmcgKElzc3VlICMzKS4KICAgICAqIFdoZW4gZW5hYmxlZCwgYSBwZXJzaXN0ZW50IEZvcmdlIEpWTSBpcyBrZXB0IGFsaXZlIGJldHdlZW4gZ2FtZXMsCiAgICAgKiBlbGltaW5hdGluZyB0aGUgfjItM3Mgc3RhcnR1cCBvdmVyaGVhZCBwZXIgZ2FtZS4KICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0VXNlUHJvY2Vzc1Bvb2woYm9vbGVhbiB1c2VQb29sKSB7CiAgICAgICAgdGhpcy51c2VQcm9jZXNzUG9vbCA9IHVzZVBvb2w7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25maWd1cmUgRm9yZ2UgQUkgb3B0aW1pemF0aW9uIChJc3N1ZSAjNCkuCiAgICAgKiBAcGFyYW0gc2ltcGxpZmllZCBVc2UgZmFzdGVyIEFJIHByb2ZpbGUgKGxlc3MgbG9va2FoZWFkKQogICAgICogQHBhcmFtIHRoaW5rVGltZU1zIENhcCBBSSB0aGluayB0aW1lIHBlciBkZWNpc2lvbiAoLTEgZm9yIHVubGltaXRlZCkKICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0QWlPcHRpbWl6YXRpb24oYm9vbGVhbiBzaW1wbGlmaWVkLCBpbnQgdGhpbmtUaW1lTXMpIHsKICAgICAgICB0aGlzLnVzZVNpbXBsaWZpZWRBaSA9IHNpbXBsaWZpZWQ7CiAgICAgICAgdGhpcy5haVRoaW5rVGltZU1zID0gdGhpbmtUaW1lTXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmFibGUgTUwgZGVjaXNpb24gbG9nZ2luZyBmb3IgdGhpcyBiYXRjaC4KICAgICAqIFdoZW4gZW5hYmxlZCwgZWFjaCBnYW1lJ3MgZGVjaXNpb24gcG9pbnRzIGFyZSBleHRyYWN0ZWQgYW5kIHdyaXR0ZW4KICAgICAqIHRvIGEgSlNPTkwgZmlsZSBmb3Igc3VwZXJ2aXNlZCBsZWFybmluZy4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVzdWx0c0RpciBEaXJlY3RvcnkgZm9yIE1MIG91dHB1dCBmaWxlcwogICAgICogQHBhcmFtIGJhdGNoSWQgICAgQmF0Y2ggaWRlbnRpZmllciBmb3IgZmlsZSBuYW1pbmcKICAgICAqLwogICAgcHVibGljIHZvaWQgZW5hYmxlTWxMb2dnaW5nKFN0cmluZyByZXN1bHRzRGlyLCBTdHJpbmcgYmF0Y2hJZCkgewogICAgICAgIHRoaXMubWxMb2dnaW5nRW5hYmxlZCA9IHRydWU7CiAgICAgICAgdGhpcy5tbFJlc3VsdHNEaXIgPSByZXN1bHRzRGlyOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubWxEZWNpc2lvbkxvZ2dlciA9IG5ldyBEZWNpc2lvbkxvZ2dlcihyZXN1bHRzRGlyLCBiYXRjaElkKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbTUxdIERlY2lzaW9uIGxvZ2dpbmcgZW5hYmxlZCBmb3IgYmF0Y2g6ICIgKyBiYXRjaElkKTsKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW01MXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNpc2lvbiBsb2dnZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIHRoaXMubWxMb2dnaW5nRW5hYmxlZCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENsb3NlIE1MIGxvZ2dlciBhZnRlciBiYXRjaCBjb21wbGV0ZXMuIENhbGwgZnJvbSB0aGUgQVBJIGxheWVyLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBjbG9zZU1sTG9nZ2VyKCkgewogICAgICAgIGlmIChtbERlY2lzaW9uTG9nZ2VyICE9IG51bGwpIHsKICAgICAgICAgICAgbWxEZWNpc2lvbkxvZ2dlci5jbG9zZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiBpc01sTG9nZ2luZ0VuYWJsZWQoKSB7CiAgICAgICAgcmV0dXJuIG1sTG9nZ2luZ0VuYWJsZWQ7CiAgICB9CgogICAgcHVibGljIERlY2lzaW9uTG9nZ2VyIGdldE1sRGVjaXNpb25Mb2dnZXIoKSB7CiAgICAgICAgcmV0dXJuIG1sRGVjaXNpb25Mb2dnZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW4gTiBnYW1lcyBzZXF1ZW50aWFsbHkgb24gdGhlIGN1cnJlbnQgdGhyZWFkLgogICAgICogRWFjaCBpbnZvY2F0aW9uIG9mIEZvcmdlIHNpbSBydW5zIDEgZ2FtZSAoLW4gMSkgdG8gZ2V0IGluZGl2aWR1YWwgcmVzdWx0cy4KICAgICAqCiAgICAgKiB2MjQ6IE5vdyByZXBvcnRzIHJlYWwtdGltZSBzaW1zL3NlYyB2aWEgcHJvZ3Jlc3MgY2FsbGJhY2sgKElzc3VlICM1KQog' +
'ICAgICogICAgICBhbmQgdXNlcyBKVk0gcHJvY2VzcyBwb29saW5nIHdoZW4gZW5hYmxlZCAoSXNzdWUgIzMpLgogICAgICoKICAgICAqIEBwYXJhbSBudW1HYW1lcyAgIE51bWJlciBvZiBnYW1lcyB0byBzaW11bGF0ZQogICAgICogQHBhcmFtIG1hc3RlclNlZWQgQmFzZSBzZWVkIChudWxsIGZvciByYW5kb20pOyBlYWNoIGdhbWUgdXNlcyBtYXN0ZXJTZWVkICsgZ2FtZUluZGV4CiAgICAgKiBAcmV0dXJuIExpc3Qgb2YgR2FtZVJlc3VsdCBvYmplY3RzCiAgICAgKi8KICAgIHB1YmxpYyBMaXN0PEdhbWVSZXN1bHQ+IHJ1bkJhdGNoU2luZ2xlVGhyZWFkKGludCBudW1HYW1lcywgTG9uZyBtYXN0ZXJTZWVkKSB7CiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgbG9uZyBiYXRjaFN0YXJ0TXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HYW1lczsgaSsrKSB7CiAgICAgICAgICAgIGxvbmcgZ2FtZVNlZWQgPSAobWFzdGVyU2VlZCAhPSBudWxsKSA/IG1hc3RlclNlZWQgKyBpIDogU3lzdGVtLm5hbm9UaW1lKCk7CiAgICAgICAgICAgIGxvbmcgc3RhcnRNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIEdhbWVSZXN1bHQgcmVzdWx0ID0gcnVuU2luZ2xlR2FtZShpLCBnYW1lU2VlZCk7CiAgICAgICAgICAgICAgICAvLyBVc2UgRm9yZ2UtcmVwb3J0ZWQgdGltZSBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB3YWxsIGNsb2NrCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVsYXBzZWRNcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVsYXBzZWRNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRNczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKHJlc3VsdCk7CgogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIltHYW1lICVkLyVkXSBXaW5uZXI6ICVzIHwgVHVybnM6ICVkIHwgVGltZTogJWRtcyVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaSArIDEsIG51bUdhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQud2lubmluZ1NlYXQgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVja3MuZ2V0KHJlc3VsdC53aW5uaW5nU2VhdCkuZGVja05hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJEUkFXIiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRvdGFsVHVybnMsIHJlc3VsdC5lbGFwc2VkTXMpOwoKICAgICAgICAgICAgICAgIC8vIOKUgOKUgCBJc3N1ZSAjNTogUmVhbC10aW1lIHByb2dyZXNzIHJlcG9ydGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0NhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWRNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmF0Y2hTdGFydE1zOwogICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzaW1zUGVyU2VjID0gZWxhcHNlZE1zID4gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoZG91YmxlKSAoaSArIDEpIC8gKGVsYXBzZWRNcyAvIDEwMDAuMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMC4wOwogICAgICAgICAgICAgICAgICAgIGludCBwY3QgPSAoaW50KSAoKGkgKyAxKSAqIDEwMC4wIC8gbnVtR2FtZXMpOwogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2sub25Qcm9ncmVzcyhpICsgMSwgbnVtR2FtZXMsIHBjdCwgc2ltc1BlclNlYywgcmVzdWx0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiW0dhbWUgJWQvJWRdIEVSUk9SOiAlcyVuIiwgaSArIDEsIG51bUdhbWVzLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICBHYW1lUmVzdWx0IGZhaWxlZCA9IGNyZWF0ZUZhaWxlZEdhbWUoaSwgZ2FtZVNlZWQsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRNcyk7CiAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChmYWlsZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBTaHV0IGRvd24gYW55IHBvb2xlZCB3b3Jr' +
'ZXJzCiAgICAgICAgc2h1dGRvd25Xb3JrZXJQb29sKCk7CgogICAgICAgIC8vIEZpbmFsIHRocm91Z2hwdXQgcmVwb3J0CiAgICAgICAgbG9uZyB0b3RhbEVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJhdGNoU3RhcnRNczsKICAgICAgICBkb3VibGUgZmluYWxTaW1zUGVyU2VjID0gdG90YWxFbGFwc2VkID4gMCA/IChkb3VibGUpIHJlc3VsdHMuc2l6ZSgpIC8gKHRvdGFsRWxhcHNlZCAvIDEwMDAuMCkgOiAwLjA7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIltCQVRDSF0gQ29tcGxldGVkICVkIGdhbWVzIGluICUuMWZzICglLjNmIHNpbXMvc2VjKSVuIiwKICAgICAgICAgICAgICAgIHJlc3VsdHMuc2l6ZSgpLCB0b3RhbEVsYXBzZWQgLyAxMDAwLjAsIGZpbmFsU2ltc1BlclNlYyk7CgogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQoKICAgIC8qKgogICAgICogUnVuIGEgc2luZ2xlIGdhbWUgdmlhIEZvcmdlIHN1YnByb2Nlc3MuCiAgICAgKiBJc3N1ZSAjMzogVXNlcyBwb29sZWQgSlZNIHByb2Nlc3Mgd2hlbiBhdmFpbGFibGUuCiAgICAgKi8KICAgIHByaXZhdGUgR2FtZVJlc3VsdCBydW5TaW5nbGVHYW1lKGludCBnYW1lSW5kZXgsIGxvbmcgZ2FtZVNlZWQpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgIExpc3Q8U3RyaW5nPiBjbWQgPSBidWlsZEZvcmdlQ29tbWFuZCgpOwoKICAgICAgICAvLyBMb2cgdGhlIGZ1bGwgY29tbWFuZCBmb3IgZGVidWdnaW5nCiAgICAgICAgU3RyaW5nIGNtZFN0ciA9IFN0cmluZy5qb2luKCIgIiwgY21kKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltERUJVR10gRm9yZ2UgY29tbWFuZDogIiArIGNtZFN0cik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbREVCVUddIFdvcmtpbmcgZGlyOiAiICsgZm9yZ2VXb3JrRGlyKTsKCiAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoY21kKTsKICAgICAgICBwYi5kaXJlY3RvcnkobmV3IEZpbGUoZm9yZ2VXb3JrRGlyKSk7CiAgICAgICAgcGIucmVkaXJlY3RFcnJvclN0cmVhbSh0cnVlKTsKCiAgICAgICAgLy8gUmVtb3ZlIEpBVkFfVE9PTF9PUFRJT05TIGlmIGluaGVyaXRlZCDigJQgaXQgaW50ZXJmZXJlcyB3aXRoIEZvcmdlIHN0YXJ0dXAKICAgICAgICBwYi5lbnZpcm9ubWVudCgpLnJlbW92ZSgiSkFWQV9UT09MX09QVElPTlMiKTsKCiAgICAgICAgLy8gVGltZW91dDogY2xvY2sgc2Vjb25kcyArIDEyMHMgYnVmZmVyIGZvciBpbml0aWFsaXphdGlvbgogICAgICAgIGxvbmcgdGltZW91dFNlY29uZHMgPSBjbG9ja1NlY29uZHMgKyAxMjA7CgogICAgICAgIGxvbmcganZtU3RhcnRNcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IHBiLnN0YXJ0KCk7CiAgICAgICAgbG9uZyBqdm1SZWFkeU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBqdm1TdGFydE1zOwoKICAgICAgICAvLyBJc3N1ZSAjNDogTG9nIEpWTSBzdGFydHVwIG92ZXJoZWFkIGZvciBiZW5jaG1hcmtpbmcKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiW1BFUkZdIEpWTSBzdGFydHVwOiAlZG1zJW4iLCBqdm1SZWFkeU1zKTsKCiAgICAgICAgLy8gUmVhZCBzdGRvdXQgd2l0aCBhIHdhdGNoZG9nIHRocmVhZCBmb3IgdGltZW91dAogICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICBUaHJlYWQgd2F0Y2hkb2cgPSBuZXcgVGhyZWFkKCgpIC0+IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCh0aW1lb3V0U2Vjb25kcyAqIDEwMDApOwogICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuaXNBbGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbV0FUQ0hET0ddIEZvcmdlIHByb2Nlc3MgZXhjZWVkZWQgdGltZW91dCAoIiArIHRpbWVvdXRTZWNvbmRzICsgInMpLiBLaWxsaW5nLiIpOwogICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZGVzdHJveUZvcmNpYmx5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKICAgICAgICAgICAgICAgIC8vIE5vcm1hbDogd2F0Y2hkb2cgY2FuY2VsbGVkIGJlY2F1c2UgcHJvY2VzcyBmaW5pc2hlZCBpbiB0aW1lCiAgICAgICAgICAgIH0KICAgICAgICB9LCAiRm9yZ2VX' +
'YXRjaGRvZy0iICsgZ2FtZUluZGV4KTsKICAgICAgICB3YXRjaGRvZy5zZXREYWVtb24odHJ1ZSk7CiAgICAgICAgd2F0Y2hkb2cuc3RhcnQoKTsKCiAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSkpKSB7CiAgICAgICAgICAgIFN0cmluZyBsaW5lOwogICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChsaW5lKS5hcHBlbmQoIlxuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGludCBleGl0Q29kZSA9IHByb2Nlc3Mud2FpdEZvcigpOwogICAgICAgIHdhdGNoZG9nLmludGVycnVwdCgpOyAvLyBDYW5jZWwgd2F0Y2hkb2cgaWYgcHJvY2VzcyBmaW5pc2hlZCBuYXR1cmFsbHkKCiAgICAgICAgLy8gRGlhZ25vc3RpYzogc2hvdyBGb3JnZSBvdXRwdXQgc3VtbWFyeQogICAgICAgIFN0cmluZyByYXdPdXRwdXQgPSBvdXRwdXQudG9TdHJpbmcoKTsKICAgICAgICBTdHJpbmdbXSBvdXRMaW5lcyA9IHJhd091dHB1dC5zcGxpdCgiXG4iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiW0RFQlVHXSBGb3JnZSBleGl0PSVkLCBvdXRwdXQ9JWQgbGluZXMsIGxlbmd0aD0lZCBjaGFycyVuIiwKICAgICAgICAgICAgICAgIGV4aXRDb2RlLCBvdXRMaW5lcy5sZW5ndGgsIHJhd091dHB1dC5sZW5ndGgoKSk7CiAgICAgICAgaWYgKHJhd091dHB1dC5pc0JsYW5rKCkpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbREVCVUddIEZvcmdlIHByb2R1Y2VkIE5PIG91dHB1dCDigJQgZGVjayBtYXkgbm90IGJlIGZvdW5kIG9yIEZvcmdlIGZhaWxlZCBzaWxlbnRseSIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFByaW50IGZpcnN0IDUgYW5kIGxhc3QgNSBsaW5lcyBmb3IgcXVpY2sgZGlhZ25vc2lzCiAgICAgICAgICAgIGludCBzaG93ID0gTWF0aC5taW4oNSwgb3V0TGluZXMubGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChpbnQgbGkgPSAwOyBsaSA8IHNob3c7IGxpKyspIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW0RFQlVHXSBPVVQ+ICIgKyBvdXRMaW5lc1tsaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvdXRMaW5lcy5sZW5ndGggPiAxMCkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbREVCVUddIC4uLiAoIiArIChvdXRMaW5lcy5sZW5ndGggLSAxMCkgKyAiIGxpbmVzIG9taXR0ZWQpIC4uLiIpOwogICAgICAgICAgICAgICAgZm9yIChpbnQgbGkgPSBvdXRMaW5lcy5sZW5ndGggLSA1OyBsaSA8IG91dExpbmVzLmxlbmd0aDsgbGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChsaSA+PSAwKSBTeXN0ZW0ub3V0LnByaW50bG4oIltERUJVR10gT1VUPiAiICsgb3V0TGluZXNbbGldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gV3JpdGUgZGVidWcgbG9nIGZvciBldmVyeSBnYW1lCiAgICAgICAgd3JpdGVEZWJ1Z0xvZyhnYW1lSW5kZXgsIGNtZFN0ciwgcmF3T3V0cHV0LCBleGl0Q29kZSk7CgogICAgICAgIHJldHVybiBwYXJzZUZvcmdlT3V0cHV0KGdhbWVJbmRleCwgZ2FtZVNlZWQsIHJhd091dHB1dCwgZXhpdENvZGUpOwogICAgfQoKICAgIC8qKgogICAgICogV3JpdGUgcmF3IEZvcmdlIHN1YnByb2Nlc3Mgb3V0cHV0IHRvIGEgZGVidWcgbG9nIGZpbGUuCiAgICAgKiBUaGlzIGhlbHBzIGRpYWdub3NlIGlzc3VlcyB3aGVyZSBGb3JnZSBwcm9kdWNlcyB1bmV4cGVjdGVkIG91dHB1dC4KICAgICAqLwogICAgcHJpdmF0ZSB2b2lkIHdyaXRlRGVidWdMb2coaW50IGdhbWVJbmRleCwgU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBvdXRwdXQsIGludCBleGl0Q29kZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIFBhdGggbG9nRGlyID0gUGF0aC5vZihmb3JnZVdvcmtEaXIpLmdldFBhcmVudCgpOwogICAgICAgICAgICBpZiAobG9nRGlyID09IG51bGwpIGxvZ0RpciA9IFBhdGgub2YoIi4iKTsKICAgICAgICAgICAgUGF0aCBsb2dGaWxlID0gbG9nRGlyLnJlc29sdmUoImZvcmdlLXNpbS1kZWJ1Zy5sb2ciKTsKCiAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbG9nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgbG9nLmFwcGVuZCgiXG7i' +
'lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiIpOwogICAgICAgICAgICBsb2cuYXBwZW5kKCJHYW1lICIpLmFwcGVuZChnYW1lSW5kZXgpLmFwcGVuZCgiIEAgIik7CiAgICAgICAgICAgIGxvZy5hcHBlbmQoTG9jYWxEYXRlVGltZS5ub3coKS5mb3JtYXQoRGF0ZVRpbWVGb3JtYXR0ZXIub2ZQYXR0ZXJuKCJ5eXl5LU1NLWRkIEhIOm1tOnNzIikpKTsKICAgICAgICAgICAgbG9nLmFwcGVuZCgiXG5Db21tYW5kOiAiKS5hcHBlbmQoY29tbWFuZCk7CiAgICAgICAgICAgIGxvZy5hcHBlbmQoIlxuV29ya2luZyBEaXI6ICIpLmFwcGVuZChmb3JnZVdvcmtEaXIpOwogICAgICAgICAgICBsb2cuYXBwZW5kKCJcbkV4aXQgQ29kZTogIikuYXBwZW5kKGV4aXRDb2RlKTsKICAgICAgICAgICAgbG9nLmFwcGVuZCgiXG7ilIDilIAgUkFXIE9VVFBVVCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiIpOwogICAgICAgICAgICBpZiAob3V0cHV0LmlzQmxhbmsoKSkgewogICAgICAgICAgICAgICAgbG9nLmFwcGVuZCgiPDwgTk8gT1VUUFVUID4+XG4iKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQob3V0cHV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2cuYXBwZW5kKCLilIDilIAgRU5EIE9VVFBVVCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiIpOwoKICAgICAgICAgICAgRmlsZXMud3JpdGVTdHJpbmcobG9nRmlsZSwgbG9nLnRvU3RyaW5nKCksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgsCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSwgU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORCk7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltERUJVR10gTG9nIHdyaXR0ZW4gdG86ICIgKyBsb2dGaWxlLnRvQWJzb2x1dGVQYXRoKCkpOwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW0RFQlVHXSBGYWlsZWQgdG8gd3JpdGUgZGVidWcgbG9nOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEJ1aWxkIHRoZSBGb3JnZSBzaW0gY29tbWFuZC4KICAgICAqIEludm9rZXM6IGphdmEgLWphciBmb3JnZS1ndWktZGVza3RvcC1YWFgtamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphciBzaW0gLWQgImRlY2sxIiAiZGVjazIiICJkZWNrMyIgLWYgY29tbWFuZGVyIC1uIDEgLXEKICAgICAqCiAgICAgKiBJc3N1ZSAjNDogQWRkcyBKVk0gdHVuaW5nIGZsYWdzIGZvciBmYXN0ZXIgc3RhcnR1cCBhbmQgcmVkdWNlZCBBSSBvdmVyaGVhZC4KICAgICAqLwogICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRGb3JnZUNvbW1hbmQoKSB7CiAgICAgICAgTGlzdDxTdHJpbmc+IGNtZCA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgICAgICBjbWQuYWRkKGphdmFQYXRoKTsKCiAgICAgICAgLy8g4pSA4pSAIEZvcmdlLXJlcXVpcmVkIEpWTSBmbGFncyAoZnJvbSBmb3JnZS1ndWktZGVza3RvcC9wb20ueG1sKSDilIDilIDilIDilIDilIDilIAKICAgICAgICAvLyBNZW1vcnkg4oCUIENvbW1hbmRlciAzLXBsYXllciBnYW1lcyBuZWVkIHN1YnN0YW50aWFsIGhlYXAKICAgICAgICBjbWQuYWRkKCItWG14NDA5Nm0iKTsKCiAgICAgICAgLy8gSXNzdWUgIzQ6IEpWTSBzdGFydHVwIG9wdGltaXphdGlvbiBmbGFncwogICAgICAgIC8vIC1YWDorVXNlU2VyaWFsR0MgcmVkdWNlcyBHQyBvdmVyaGVhZCBmb3Igc2hvcnQtbGl2ZWQgYmF0Y2ggcHJvY2Vzc2VzCiAgICAgICAgY21kLmFkZCgiLVhYOitVc2VTZXJpYWxHQyIpOwogICAgICAgIC8vIC1YWDpUaWVyZWRTdG9wQXRMZXZlbD0xIHJlZHVjZXMgSklUIGNvbXBpbGF0' +
'aW9uIG92ZXJoZWFkIGZvciBzaG9ydCBwcm9jZXNzZXMKICAgICAgICBjbWQuYWRkKCItWFg6VGllcmVkU3RvcEF0TGV2ZWw9MSIpOwoKICAgICAgICAvLyBOT1RFOiBEbyBOT1QgYWRkIC1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSDigJQgRm9yZ2Ugc2ltIGNyYXNoZXMgKGV4aXQ9MSkgd2l0aCBpdAogICAgICAgIC8vIE5ldHR5IHJlZmxlY3Rpb24gYWNjZXNzCiAgICAgICAgY21kLmFkZCgiLURpby5uZXR0eS50cnlSZWZsZWN0aW9uU2V0QWNjZXNzaWJsZT10cnVlIik7CiAgICAgICAgLy8gVVRGLTggZW5jb2RpbmcKICAgICAgICBjbWQuYWRkKCItRGZpbGUuZW5jb2Rpbmc9VVRGLTgiKTsKCiAgICAgICAgLy8gSXNzdWUgIzQ6IEFJIHRoaW5rIHRpbWUgY2FwIChpZiBjb25maWd1cmVkKQogICAgICAgIGlmIChhaVRoaW5rVGltZU1zID4gMCkgewogICAgICAgICAgICBjbWQuYWRkKCItRGZvcmdlLmFpLnRoaW5rVGltZU1zPSIgKyBhaVRoaW5rVGltZU1zKTsKICAgICAgICB9CiAgICAgICAgaWYgKHVzZVNpbXBsaWZpZWRBaSkgewogICAgICAgICAgICBjbWQuYWRkKCItRGZvcmdlLmFpLnNpbXBsaWZpZWQ9dHJ1ZSIpOwogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIE1vZHVsZSBhY2Nlc3MgZmxhZ3MgcmVxdWlyZWQgYnkgRm9yZ2Ugb24gSmF2YSAxNysg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgU3RyaW5nW10gYWRkT3BlbnMgPSB7CiAgICAgICAgICAgICJqYXZhLmRlc2t0b3AvamF2YS5iZWFucz1BTEwtVU5OQU1FRCIsCiAgICAgICAgICAgICJqYXZhLmRlc2t0b3AvamF2YXguc3dpbmcuYm9yZGVyPUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuZGVza3RvcC9qYXZheC5zd2luZy5ldmVudD1BTEwtVU5OQU1FRCIsCiAgICAgICAgICAgICJqYXZhLmRlc2t0b3Avc3VuLnN3aW5nPUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuZGVza3RvcC9qYXZhLmF3dC5pbWFnZT1BTEwtVU5OQU1FRCIsCiAgICAgICAgICAgICJqYXZhLmRlc2t0b3AvamF2YS5hd3QuY29sb3I9QUxMLVVOTkFNRUQiLAogICAgICAgICAgICAiamF2YS5kZXNrdG9wL3N1bi5hd3QuaW1hZ2U9QUxMLVVOTkFNRUQiLAogICAgICAgICAgICAiamF2YS5kZXNrdG9wL2phdmF4LnN3aW5nPUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuZGVza3RvcC9qYXZhLmF3dD1BTEwtVU5OQU1FRCIsCiAgICAgICAgICAgICJqYXZhLmJhc2UvamF2YS51dGlsPUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuYmFzZS9qYXZhLmxhbmc9QUxMLVVOTkFNRUQiLAogICAgICAgICAgICAiamF2YS5iYXNlL2phdmEubGFuZy5yZWZsZWN0PUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuYmFzZS9qYXZhLnRleHQ9QUxMLVVOTkFNRUQiLAogICAgICAgICAgICAiamF2YS5kZXNrdG9wL2phdmEuYXd0LmZvbnQ9QUxMLVVOTkFNRUQiLAogICAgICAgICAgICAiamF2YS5iYXNlL2pkay5pbnRlcm5hbC5taXNjPUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuYmFzZS9qYXZhLm5pbz1BTEwtVU5OQU1FRCIsCiAgICAgICAgICAgICJqYXZhLmJhc2UvamF2YS5tYXRoPUFMTC1VTk5BTUVEIiwKICAgICAgICAgICAgImphdmEuYmFzZS9qYXZhLnV0aWwuY29uY3VycmVudD1BTEwtVU5OQU1FRCIsCiAgICAgICAgICAgICJqYXZhLmJhc2UvamF2YS5uZXQ9QUxMLVVOTkFNRUQiLAogICAgICAgIH07CiAgICAgICAgZm9yIChTdHJpbmcgbW9kdWxlIDogYWRkT3BlbnMpIHsKICAgICAgICAgICAgY21kLmFkZCgiLS1hZGQtb3BlbnMiKTsKICAgICAgICAgICAgY21kLmFkZChtb2R1bGUpOwogICAgICAgIH0KCiAgICAgICAgY21kLmFkZCgiLWphciIpOwogICAgICAgIGNtZC5hZGQoZm9yZ2VKYXJQYXRoKTsKCiAgICAgICAgY21kLmFkZCgic2ltIik7CgogICAgICAgIC8vIERlY2sgYXJndW1lbnRzIOKAlCBhcHBlbmQgLmRjayBzbyBGb3JnZSBsb2FkcyBmcm9tIERFQ0tfQ09NTUFOREVSX0RJUiBhcyBmaWxlcwogICAgICAgIC8vIFdpdGhvdXQgLmRjaywgRm9yZ2UgdXNlcyBGTW9kZWwgZGVjayBzdG9yZSB3aGljaCBtYXkgZmFpbCBpbiBzdWJwcm9jZXNzIGNvbnRleHQKICAgICAgICBjbWQuYWRkKCItZCIpOwogICAgICAgIGZvciAoRGVja0luZm8gZGVjayA6IGRlY2tzKSB7CiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGVjay5kZWNr' +
'RmlsZTsKICAgICAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKCIuZGNrIikpIHsKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgIi5kY2siOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNtZC5hZGQobmFtZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBGb3JtYXQKICAgICAgICBjbWQuYWRkKCItZiIpOwogICAgICAgIGNtZC5hZGQoImNvbW1hbmRlciIpOwoKICAgICAgICAvLyBTaW5nbGUgZ2FtZSBwZXIgc3VicHJvY2VzcyBjYWxsCiAgICAgICAgY21kLmFkZCgiLW4iKTsKICAgICAgICBjbWQuYWRkKCIxIik7CgogICAgICAgIC8vIENsb2NrIChtYXggc2Vjb25kcyBwZXIgZ2FtZSkKICAgICAgICBjbWQuYWRkKCItYyIpOwogICAgICAgIGNtZC5hZGQoU3RyaW5nLnZhbHVlT2YoY2xvY2tTZWNvbmRzKSk7CgogICAgICAgIC8vIFF1aWV0IG1vZGUgZm9yIHBhcnNlYWJsZSBvdXRwdXQKICAgICAgICBpZiAocXVpZXQpIHsKICAgICAgICAgICAgY21kLmFkZCgiLXEiKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjbWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBGb3JnZSdzIHN0ZG91dCBvdXRwdXQgaW50byBhIEdhbWVSZXN1bHQuCiAgICAgKgogICAgICogdjI0IGNoYW5nZXM6CiAgICAgKiAgIC0gSXNzdWUgIzE6IFdpbm5lcidzIGxpZmUgdG90YWwgaW5mZXJyZWQgZnJvbSBsYXN0LWtub3duIGxpZmUgdG90YWwgaW4gdmVyYm9zZSBsb2csCiAgICAgKiAgICAgICAgICAgICAgIG9yIGJ5IHByb2Nlc3Mgb2YgZWxpbWluYXRpb24gZnJvbSBsb3NlciBkYXRhLgogICAgICogICAtIElzc3VlICMyOiBVc2VzIFdpbkNvbmRpdGlvbiBlbnVtIGZvciBjbGFzc2lmaWNhdGlvbiB3aXRoIFVOS05PV04gZmFsbGJhY2suCiAgICAgKgogICAgICogRXhwZWN0ZWQgbGluZXM6CiAgICAgKiAgIEdhbWUgT3V0Y29tZTogVHVybiAxMQogICAgICogICBHYW1lIE91dGNvbWU6IEFpKDEpLUVkZ2FyIE1hcmtvdiBoYXMgd29uIGJlY2F1c2UgYWxsIG9wcG9uZW50cyBoYXZlIGxvc3QKICAgICAqICAgR2FtZSBPdXRjb21lOiBBaSgyKS1HcmltZ3JpbiBoYXMgbG9zdCBiZWNhdXNlIGxpZmUgdG90YWwgcmVhY2hlZCAwCiAgICAgKiAgIEdhbWUgT3V0Y29tZTogQWkoMyktWHlyaXMgaGFzIGxvc3QgYmVjYXVzZSBsaWZlIHRvdGFsIHJlYWNoZWQgMAogICAgICogICBHYW1lIFJlc3VsdDogR2FtZSAxIGVuZGVkIGluIDkyMDEgbXMuIEFpKDEpLUVkZ2FyIE1hcmtvdiBoYXMgd29uIQogICAgICovCiAgICBwcml2YXRlIEdhbWVSZXN1bHQgcGFyc2VGb3JnZU91dHB1dChpbnQgZ2FtZUluZGV4LCBsb25nIGdhbWVTZWVkLCBTdHJpbmcgb3V0cHV0LCBpbnQgZXhpdENvZGUpIHsKICAgICAgICBHYW1lUmVzdWx0IHJlc3VsdCA9IG5ldyBHYW1lUmVzdWx0KCk7CiAgICAgICAgcmVzdWx0LmdhbWVJbmRleCA9IGdhbWVJbmRleDsKICAgICAgICByZXN1bHQuZ2FtZVNlZWQgPSBnYW1lU2VlZDsKICAgICAgICByZXN1bHQud2luQ29uZGl0aW9uID0gInVua25vd24iOwogICAgICAgIHJlc3VsdC50b3RhbFR1cm5zID0gMDsKICAgICAgICByZXN1bHQuZWxhcHNlZE1zID0gMDsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBwbGF5ZXIgcmVzdWx0cyBmb3IgYWxsIDMgc2VhdHMKICAgICAgICByZXN1bHQucGxheWVyUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgIFBsYXllclJlc3VsdCBwciA9IG5ldyBQbGF5ZXJSZXN1bHQoKTsKICAgICAgICAgICAgcHIuc2VhdEluZGV4ID0gaTsKICAgICAgICAgICAgcHIuZmluYWxMaWZlID0gNDA7IC8vIENvbW1hbmRlciBzdGFydGluZyBsaWZlCiAgICAgICAgICAgIHByLm11bGxpZ2FucyA9IDA7CiAgICAgICAgICAgIHByLmlzV2lubmVyID0gZmFsc2U7CiAgICAgICAgICAgIHByLmNvbW1hbmRlckRhbWFnZURlYWx0ID0gMDsKICAgICAgICAgICAgcHIuY29tbWFuZGVyQ2FzdHMgPSAwOwogICAgICAgICAgICBwci5sYW5kc1BsYXllZCA9IDA7CiAgICAgICAgICAgIHByLnNwZWxsc0Nhc3QgPSAwOwogICAgICAgICAgICBwci5jcmVhdHVyZXNEZXN0cm95ZWQgPSAwOwogICAgICAgICAgICByZXN1bHQucGxheWVyUmVzdWx0cy5hZGQocHIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG91dHB1dC5pc0JsYW5rKCkpIHsKICAgICAgICAgICAgcmVzdWx0LndpbkNvbmRpdGlvbiA9IFdpbkNvbmRpdGlvbi5USU1FT1VULmdldExhYmVsKCk7CiAgICAg' +
'ICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IG91dHB1dC5zcGxpdCgiXG4iKTsKICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvc3NSZWFzb25zID0gbmV3IEhhc2hNYXA8PigpOwoKICAgICAgICAvLyDilIDilIAgSXNzdWUgIzE6IFRyYWNrIGxhc3Qta25vd24gbGlmZSB0b3RhbHMgZnJvbSB2ZXJib3NlIGxvZyDilIDilIDilIDilIDilIDilIAKICAgICAgICBpbnRbXSBsYXN0S25vd25MaWZlID0gezQwLCA0MCwgNDB9OyAgLy8gU3RhcnQgYXQgQ29tbWFuZGVyIGRlZmF1bHQKICAgICAgICBib29sZWFuW10gbGlmZVRyYWNrZWQgPSB7ZmFsc2UsIGZhbHNlLCBmYWxzZX07CiAgICAgICAgU2V0PEludGVnZXI+IGxvc2VyU2VhdHMgPSBuZXcgSGFzaFNldDw+KCk7CgogICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewogICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CgogICAgICAgICAgICAvLyBQYXJzZSB0dXJuIGNvdW50OiAiR2FtZSBPdXRjb21lOiBUdXJuIDExIgogICAgICAgICAgICBNYXRjaGVyIHR1cm5NYXRjaGVyID0gVFVSTl9QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmICh0dXJuTWF0Y2hlci5maW5kKCkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC50b3RhbFR1cm5zID0gSW50ZWdlci5wYXJzZUludCh0dXJuTWF0Y2hlci5ncm91cCgxKSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUGFyc2Ugd2lubmVyOiAiR2FtZSBPdXRjb21lOiBBaSgxKS1FZGdhciBNYXJrb3YgaGFzIHdvbiBiZWNhdXNlIC4uLiIKICAgICAgICAgICAgTWF0Y2hlciB3aW5NYXRjaGVyID0gV0lOTkVSX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKHdpbk1hdGNoZXIuZmluZCgpKSB7CiAgICAgICAgICAgICAgICBpbnQgYWlOdW1iZXIgPSBJbnRlZ2VyLnBhcnNlSW50KHdpbk1hdGNoZXIuZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgaW50IHNlYXRJbmRleCA9IGFpTnVtYmVyIC0gMTsgLy8gRm9yZ2UgdXNlcyAxLWJhc2VkLCB3ZSB1c2UgMC1iYXNlZAogICAgICAgICAgICAgICAgU3RyaW5nIHdpblJlYXNvbiA9IHdpbk1hdGNoZXIuZ3JvdXAoMykudHJpbSgpOwoKICAgICAgICAgICAgICAgIGlmIChzZWF0SW5kZXggPj0gMCAmJiBzZWF0SW5kZXggPCAzKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lndpbm5pbmdTZWF0ID0gc2VhdEluZGV4OwogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wbGF5ZXJSZXN1bHRzLmdldChzZWF0SW5kZXgpLmlzV2lubmVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBQYXJzZSBsb3NlcjogIkdhbWUgT3V0Y29tZTogQWkoMiktR3JpbWdyaW4gaGFzIGxvc3QgYmVjYXVzZSBsaWZlIHRvdGFsIHJlYWNoZWQgMCIKICAgICAgICAgICAgTWF0Y2hlciBsb3NlTWF0Y2hlciA9IExPU0VSX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKGxvc2VNYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgICAgaW50IGFpTnVtYmVyID0gSW50ZWdlci5wYXJzZUludChsb3NlTWF0Y2hlci5ncm91cCgxKSk7CiAgICAgICAgICAgICAgICBpbnQgc2VhdEluZGV4ID0gYWlOdW1iZXIgLSAxOwogICAgICAgICAgICAgICAgU3RyaW5nIGxvc3NSZWFzb24gPSBsb3NlTWF0Y2hlci5ncm91cCgzKS50cmltKCk7CgogICAgICAgICAgICAgICAgaWYgKHNlYXRJbmRleCA+PSAwICYmIHNlYXRJbmRleCA8IDMpIHsKICAgICAgICAgICAgICAgICAgICBsb3NzUmVhc29ucy5wdXQoU3RyaW5nLnZhbHVlT2Yoc2VhdEluZGV4KSwgbG9zc1JlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgbG9zZXJTZWF0cy5hZGQoc2VhdEluZGV4KTsKCiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGV4dHJhY3QgZmluYWwgbGlmZSBmcm9tIGxvc3MgcmVhc29uCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvc3NSZWFzb24uY29udGFpbnMoImxpZmUgdG90YWwgcmVhY2hlZCAwIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBsYXllclJlc3VsdHMuZ2V0KHNlYXRJbmRleCkuZmluYWxMaWZlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtub3duTGlmZVtzZWF0SW5kZXhdID0gMDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2Ug' +
'aWYgKGxvc3NSZWFzb24uY29udGFpbnMoImxpZmUgdG90YWwgcmVhY2hlZCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vICJsaWZlIHRvdGFsIHJlYWNoZWQgLTUiIGV0YwogICAgICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIGxpZmVNYXRjaGVyID0gUGF0dGVybi5jb21waWxlKCJsaWZlIHRvdGFsIHJlYWNoZWQgKC0/XFxkKykiKS5tYXRjaGVyKGxvc3NSZWFzb24pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlmZU1hdGNoZXIuZmluZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlmZSA9IEludGVnZXIucGFyc2VJbnQobGlmZU1hdGNoZXIuZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBsYXllclJlc3VsdHMuZ2V0KHNlYXRJbmRleCkuZmluYWxMaWZlID0gbGlmZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RLbm93bkxpZmVbc2VhdEluZGV4XSA9IGxpZmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG5vbi1saWZlLXJlbGF0ZWQgbG9zc2VzIChtaWxsLCBwb2lzb24sIGNvbW1hbmRlciBkYW1hZ2UpLAogICAgICAgICAgICAgICAgICAgIC8vIGxpZmUgaXMgTk9UIG5lY2Vzc2FyaWx5IDAg4oCUIHdlIHJlbHkgb24gdmVyYm9zZSBsb2cgdHJhY2tpbmcgYmVsb3cKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBQYXJzZSBnYW1lIHJlc3VsdCB0aW1pbmc6ICJHYW1lIFJlc3VsdDogR2FtZSAxIGVuZGVkIGluIDkyMDEgbXMuIgogICAgICAgICAgICBNYXRjaGVyIGdhbWVSZXN1bHRNYXRjaGVyID0gR0FNRV9SRVNVTFRfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICBpZiAoZ2FtZVJlc3VsdE1hdGNoZXIuZmluZCgpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuZWxhcHNlZE1zID0gTG9uZy5wYXJzZUxvbmcoZ2FtZVJlc3VsdE1hdGNoZXIuZ3JvdXAoMikpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFBhcnNlIGRyYXc6ICJHYW1lIFJlc3VsdDogR2FtZSAxIGVuZGVkIGluIC4uLiBkcmF3IgogICAgICAgICAgICBNYXRjaGVyIGRyYXdNYXRjaGVyID0gR0FNRV9EUkFXX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKGRyYXdNYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgICAgcmVzdWx0LmVsYXBzZWRNcyA9IExvbmcucGFyc2VMb25nKGRyYXdNYXRjaGVyLmdyb3VwKDIpKTsKICAgICAgICAgICAgICAgIHJlc3VsdC53aW5uaW5nU2VhdCA9IG51bGw7CiAgICAgICAgICAgICAgICByZXN1bHQud2luQ29uZGl0aW9uID0gV2luQ29uZGl0aW9uLlRJTUVPVVQuZ2V0TGFiZWwoKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDilIDilIAgSXNzdWUgIzE6IFRyYWNrIGxpZmUgdG90YWxzIGZyb20gdmVyYm9zZSBsb2cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIC8vICJBaSgxKS1OYW1lJ3MgbGlmZSBpcyBub3cgMjciCiAgICAgICAgICAgIE1hdGNoZXIgbGlmZU1hdGNoID0gTElGRV9UT1RBTF9QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChsaWZlTWF0Y2guZmluZCgpKSB7CiAgICAgICAgICAgICAgICBpbnQgYWlOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGxpZmVNYXRjaC5ncm91cCgxKSk7CiAgICAgICAgICAgICAgICBpbnQgc2VhdCA9IGFpTnVtIC0gMTsKICAgICAgICAgICAgICAgIGludCBsaWZlID0gSW50ZWdlci5wYXJzZUludChsaWZlTWF0Y2guZ3JvdXAoMikpOwogICAgICAgICAgICAgICAgaWYgKHNlYXQgPj0gMCAmJiBzZWF0IDwgMykgewogICAgICAgICAgICAgICAgICAgIGxhc3RLbm93bkxpZmVbc2VhdF0gPSBsaWZlOwogICAgICAgICAgICAgICAgICAgIGxpZmVUcmFja2VkW3NlYXRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIERvbid0IGNvbnRpbnVlIOKAlCBvdGhlciBwYXR0ZXJucyBtYXkgYWxzbyBtYXRjaCB0aGlzIGxpbmUKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gIkFpKDEpLU5hbWUgbG9zZXMgTiBsaWZlIgogICAgICAgICAgICBNYXRjaGVyIGxvc3NNYXRjaCA9IExJRkVfTE9TU19QQVRU' +
'RVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChsb3NzTWF0Y2guZmluZCgpKSB7CiAgICAgICAgICAgICAgICBpbnQgYWlOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGxvc3NNYXRjaC5ncm91cCgxKSk7CiAgICAgICAgICAgICAgICBpbnQgc2VhdCA9IGFpTnVtIC0gMTsKICAgICAgICAgICAgICAgIGludCBhbW91bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGxvc3NNYXRjaC5ncm91cCgyKSk7CiAgICAgICAgICAgICAgICBpZiAoc2VhdCA+PSAwICYmIHNlYXQgPCAzKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdEtub3duTGlmZVtzZWF0XSAtPSBhbW91bnQ7CiAgICAgICAgICAgICAgICAgICAgbGlmZVRyYWNrZWRbc2VhdF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyAiQWkoMSktTmFtZSBnYWlucyBOIGxpZmUiCiAgICAgICAgICAgIE1hdGNoZXIgZ2Fpbk1hdGNoID0gTElGRV9HQUlOX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKGdhaW5NYXRjaC5maW5kKCkpIHsKICAgICAgICAgICAgICAgIGludCBhaU51bSA9IEludGVnZXIucGFyc2VJbnQoZ2Fpbk1hdGNoLmdyb3VwKDEpKTsKICAgICAgICAgICAgICAgIGludCBzZWF0ID0gYWlOdW0gLSAxOwogICAgICAgICAgICAgICAgaW50IGFtb3VudCA9IEludGVnZXIucGFyc2VJbnQoZ2Fpbk1hdGNoLmdyb3VwKDIpKTsKICAgICAgICAgICAgICAgIGlmIChzZWF0ID49IDAgJiYgc2VhdCA8IDMpIHsKICAgICAgICAgICAgICAgICAgICBsYXN0S25vd25MaWZlW3NlYXRdICs9IGFtb3VudDsKICAgICAgICAgICAgICAgICAgICBsaWZlVHJhY2tlZFtzZWF0XSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENvdW50IG11bGxpZ2FucyBmcm9tIG5vbi1xdWlldCBvdXRwdXQKICAgICAgICAgICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5jb250YWlucygibXVsbGlnYW4iKSkgewogICAgICAgICAgICAgICAgTWF0Y2hlciBtdWxsTWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZSgiQWlcXCgoXFxkKylcXCkiKS5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICAgICAgaWYgKG11bGxNYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgICAgICAgIGludCBhaU51bSA9IEludGVnZXIucGFyc2VJbnQobXVsbE1hdGNoZXIuZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgICAgIGludCBzZWF0ID0gYWlOdW0gLSAxOwogICAgICAgICAgICAgICAgICAgIGlmIChzZWF0ID49IDAgJiYgc2VhdCA8IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBsYXllclJlc3VsdHMuZ2V0KHNlYXQpLm11bGxpZ2FucysrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIElzc3VlICMyOiBDbGFzc2lmeSB3aW4gY29uZGl0aW9uIHVzaW5nIGZvcm1hbCBlbnVtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIFdpbkNvbmRpdGlvbiBjb25kaXRpb24gPSBXaW5Db25kaXRpb24uY2xhc3NpZnkobG9zc1JlYXNvbnMsIG91dHB1dCk7CiAgICAgICAgcmVzdWx0LndpbkNvbmRpdGlvbiA9IGNvbmRpdGlvbi5nZXRMYWJlbCgpOwoKICAgICAgICAvLyDilIDilIAgSXNzdWUgIzE6IFNldCB3aW5uZXIncyBmaW5hbCBsaWZlIHRvdGFsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIC8vIFN0cmF0ZWd5OiBVc2UgbGFzdC1rbm93biBsaWZlIGZyb20gdmVyYm9zZSBsb2cgaWYgYXZhaWxhYmxlLAogICAgICAgIC8vIG90aGVyd2lzZSB3aW5uZXIga2VlcHMgZGVmYXVsdCA0MCAod2hpY2ggaXMgd3JvbmcgYnV0IHdhcyB0aGUgb2xkIGJlaGF2aW9yKS4KICAgICAgICAvLyBJZiB3ZSB0cmFja2VkIGxpZmUgZm9yIHRoZSB3aW5uZXIsIHVzZSB0aGF0LgogICAgICAgIGlmIChyZXN1bHQud2lubmluZ1NlYXQgIT0gbnVsbCkgewogICAgICAgICAgICBpbnQgd2lubmVyU2VhdCA9IHJlc3VsdC53aW5uaW5nU2VhdDsKICAgICAgICAgICAgaWYgKGxpZmVUcmFja2VkW3dpbm5lclNlYXRdKSB7CiAgICAgICAgICAgICAgICByZXN1bHQucGxheWVyUmVzdWx0cy5nZXQod2lubmVyU2VhdCkuZmluYWxMaWZlID0gbGFzdEtub3duTGlmZVt3aW5uZXJTZWF0XTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQu' +
'cHJpbnRmKCJbTElGRV0gV2lubmVyIHNlYXQgJWQ6IGZpbmFsIGxpZmUgPSAlZCAodHJhY2tlZCBmcm9tIGxvZyklbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbm5lclNlYXQsIGxhc3RLbm93bkxpZmVbd2lubmVyU2VhdF0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gVmVyYm9zZSB0cmFja2luZyBkaWRuJ3QgY2FwdHVyZSDigJQgbGVhdmUgYXQgNDAgYnV0IGxvZyBpdAogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIltMSUZFXSBXaW5uZXIgc2VhdCAlZDogbGlmZSBub3QgdHJhY2tlZCBpbiBsb2cgKHF1aWV0IG1vZGU/KSwgZGVmYXVsdGluZyB0byA0MCVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgd2lubmVyU2VhdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFsc28gdXBkYXRlIGxvc2VycyB3aG9zZSBsaWZlIHdhc24ndCBzZXQgZnJvbSBsb3NzIHJlYXNvbnMKICAgICAgICAgICAgLy8gKGUuZy4sIG1pbGwvcG9pc29uIGxvc2VycyB3aG9zZSBsaWZlIG1heSBub3QgYmUgMCkKICAgICAgICAgICAgZm9yIChpbnQgc2VhdCA9IDA7IHNlYXQgPCAzOyBzZWF0KyspIHsKICAgICAgICAgICAgICAgIGlmIChzZWF0ICE9IHdpbm5lclNlYXQgJiYgbGlmZVRyYWNrZWRbc2VhdF0pIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGxheWVyUmVzdWx0cy5nZXQoc2VhdCkuZmluYWxMaWZlID0gbGFzdEtub3duTGlmZVtzZWF0XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRGVmYXVsdCB0dXJuIGNvdW50IGlmIG5vdCBwYXJzZWQKICAgICAgICBpZiAocmVzdWx0LnRvdGFsVHVybnMgPT0gMCkgewogICAgICAgICAgICByZXN1bHQudG90YWxUdXJucyA9IDE7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgUGFyc2UgdmVyYm9zZSBnYW1lIGxvZyBmb3IgY29tYmF0IHN0YXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIC8vIFRoZXNlIHBhdHRlcm5zIG1hdGNoIEZvcmdlJ3MgZnVsbCBnYW1lIGxvZyAobm9uLXF1aWV0IG1vZGUpCiAgICAgICAgLy8gVHJhY2sgY29tbWFuZGVyIG5hbWVzIGZvciBlYWNoIHNlYXQgdG8gZGV0ZWN0IGNvbW1hbmRlciBjYXN0cwogICAgICAgIFN0cmluZ1tdIGNvbW1hbmRlck5hbWVzID0gbmV3IFN0cmluZ1szXTsKICAgICAgICBmb3IgKGludCBjaSA9IDA7IGNpIDwgMyAmJiBjaSA8IGRlY2tzLnNpemUoKTsgY2krKykgewogICAgICAgICAgICBjb21tYW5kZXJOYW1lc1tjaV0gPSBkZWNrcy5nZXQoY2kpLmNvbW1hbmRlck5hbWU7CiAgICAgICAgfQoKICAgICAgICBmb3IgKFN0cmluZyBsaW5lIDogbGluZXMpIHsKICAgICAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpOwogICAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KCkpIGNvbnRpbnVlOwoKICAgICAgICAgICAgLy8gTWF0Y2ggc3BlbGwgY2FzdHM6ICJBaSgxKS1OYW1lIGNhc3RzIENhcmROYW1lLiIKICAgICAgICAgICAgTWF0Y2hlciBjYXN0TWF0Y2hlciA9IENBU1RfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICBpZiAoY2FzdE1hdGNoZXIuZmluZCgpKSB7CiAgICAgICAgICAgICAgICBpbnQgYWlOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGNhc3RNYXRjaGVyLmdyb3VwKDEpKTsKICAgICAgICAgICAgICAgIGludCBzZWF0ID0gYWlOdW0gLSAxOwogICAgICAgICAgICAgICAgU3RyaW5nIGNhcmROYW1lID0gY2FzdE1hdGNoZXIuZ3JvdXAoMikudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHNlYXQgPj0gMCAmJiBzZWF0IDwgMykgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wbGF5ZXJSZXN1bHRzLmdldChzZWF0KS5zcGVsbHNDYXN0Kys7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgY29tbWFuZGVyIGJlaW5nIGNhc3QKICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZGVyTmFtZXNbc2VhdF0gIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShjb21tYW5kZXJOYW1lc1tzZWF0XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBsYXllclJlc3VsdHMuZ2V0KHNlYXQpLmNvbW1hbmRlckNhc3RzKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGlu' +
'dWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1hdGNoIGxhbmQgcGxheXM6ICJBaSgxKS1OYW1lIHBsYXlzIExhbmROYW1lLiIKICAgICAgICAgICAgTWF0Y2hlciBsYW5kTWF0Y2hlciA9IExBTkRfUExBWV9QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChsYW5kTWF0Y2hlci5maW5kKCkpIHsKICAgICAgICAgICAgICAgIGludCBhaU51bSA9IEludGVnZXIucGFyc2VJbnQobGFuZE1hdGNoZXIuZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgaW50IHNlYXQgPSBhaU51bSAtIDE7CiAgICAgICAgICAgICAgICBpZiAoc2VhdCA+PSAwICYmIHNlYXQgPCAzKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBsYXllclJlc3VsdHMuZ2V0KHNlYXQpLmxhbmRzUGxheWVkKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTWF0Y2ggZGFtYWdlIGRlYWx0OiAiZGVhbHMgTiBkYW1hZ2UgdG8gQWkoWCkiCiAgICAgICAgICAgIE1hdGNoZXIgZG1nTWF0Y2hlciA9IERBTUFHRV9QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIHdoaWxlIChkbWdNYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgICAgLy8gTm90ZTogdGhpcyBjYXB0dXJlcyBkYW1hZ2UgVE8gYSBwbGF5ZXIsIG5vdCBGUk9NLgogICAgICAgICAgICAgICAgLy8gV2UgdHJhY2sgaXQgYXMgY3JlYXR1cmUvY29tYmF0IGRhbWFnZSBldmVudHMKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTWF0Y2ggY3JlYXR1cmUgZGVhdGhzOiAiaXMgZGVzdHJveWVkIiAvICJkaWVzIgogICAgICAgICAgICBpZiAoQ1JFQVRVUkVfREVTVFJPWUVEX1BBVFRFUk4ubWF0Y2hlcihsaW5lKS5maW5kKCkpIHsKICAgICAgICAgICAgICAgIC8vIFRyeSB0byBmaWd1cmUgb3V0IHdoaWNoIHBsYXllcidzIGNyZWF0dXJlIGRpZWQKICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIEFpKE4pIHJlZmVyZW5jZSBiZWZvcmUgdGhlIGRlc3RydWN0aW9uIHRleHQKICAgICAgICAgICAgICAgIE1hdGNoZXIgYWlSZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIkFpXFwoKFxcZCspXFwpIikubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgICAgIC8vIFdlIGF0dHJpYnV0ZSBkZXN0cnVjdGlvbiB0byB0aGUgT1BQT1NJTkcgcGxheWVyICh0aGUgb25lIHdobyBjYXVzZWQgaXQpCiAgICAgICAgICAgICAgICAvLyBCdXQgc2luY2Ugd2UgY2FuJ3QgcmVsaWFibHkgZGV0ZXJtaW5lIHRoZSBhdHRhY2tlciwgY291bnQgaXQgZ2xvYmFsbHkKICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIHNlYXQsIGNvdW50IGNyZWF0dXJlcyB0aGV5IGRlc3Ryb3llZCAob3Bwb25lbnQncyBjcmVhdHVyZXMgdGhhdCBkaWVkKQogICAgICAgICAgICAgICAgLy8gU2ltcGxlIGhldXJpc3RpYzogaWYgYSBjcmVhdHVyZSBjb250cm9sbGVkIGJ5IEFpKFgpIGRpZXMsIGNyZWRpdCBvcHBvbmVudHMKICAgICAgICAgICAgICAgIGlmIChhaVJlZi5maW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgYWlOdW0gPSBJbnRlZ2VyLnBhcnNlSW50KGFpUmVmLmdyb3VwKDEpKTsKICAgICAgICAgICAgICAgICAgICBpbnQgdmljdGltU2VhdCA9IGFpTnVtIC0gMTsKICAgICAgICAgICAgICAgICAgICAvLyBDcmVkaXQgYWxsIG5vbi12aWN0aW0gc2VhdHMgd2l0aCAxIGNyZWF0dXJlIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHMgPSAwOyBzIDwgMzsgcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICE9IHZpY3RpbVNlYXQgJiYgcyA8IHJlc3VsdC5wbGF5ZXJSZXN1bHRzLnNpemUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3Qga25vdyB3aG8gZGlkIGl0LCBzbyB3ZSBkb24ndCBpbmNyZW1lbnQgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGVhZCwgdXNlIGEgc2ltcGxlciBhcHByb2FjaCBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDb21tYW5kZXIgZGFtYWdlIHRyYWNraW5nIGZyb20gbG9zcyByZWFzb25zIChhbHJlYWR5IGNhcHR1cmVkIGFib3ZlKQogICAgICAgICAgICAvLyBBbHNvIHRyeSB0byBwYXJzZSAiY29tbWFuZGVyIGRhbWFnZSIgbWVudGlvbnMgaW4gdmVyYm9zZSBsb2cKICAg' +
'ICAgICAgICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5jb250YWlucygiY29tbWFuZGVyIGRhbWFnZSIpKSB7CiAgICAgICAgICAgICAgICBNYXRjaGVyIGNkbWcgPSBQYXR0ZXJuLmNvbXBpbGUoIihcXGQrKVxccytjb21tYW5kZXJcXHMrZGFtYWdlIikubWF0Y2hlcihsaW5lLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgaWYgKGNkbWcuZmluZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IGFtb3VudCA9IEludGVnZXIucGFyc2VJbnQoY2RtZy5ncm91cCgxKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgdGhlIHNvdXJjZSBwbGF5ZXIKICAgICAgICAgICAgICAgICAgICBNYXRjaGVyIHNyY1BsYXllciA9IFBhdHRlcm4uY29tcGlsZSgiQWlcXCgoXFxkKylcXCkiKS5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzcmNQbGF5ZXIuZmluZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWF0ID0gSW50ZWdlci5wYXJzZUludChzcmNQbGF5ZXIuZ3JvdXAoMSkpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXQgPj0gMCAmJiBzZWF0IDwgMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBsYXllclJlc3VsdHMuZ2V0KHNlYXQpLmNvbW1hbmRlckRhbWFnZURlYWx0ICs9IGFtb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRXN0aW1hdGUgY3JlYXR1cmVzIGRlc3Ryb3llZCBmcm9tIHRvdGFsIHR1cm5zIGlmIHZlcmJvc2UgcGFyc2luZyBkaWRuJ3QgY2F0Y2ggc3BlY2lmaWNzCiAgICAgICAgLy8gKEZvcmdlIGxvZyBmb3JtYXQgdmFyaWVzOyB0aGlzIHByb3ZpZGVzIGEgcmVhc29uYWJsZSBmYWxsYmFjaykKICAgICAgICBmb3IgKGludCBzZWF0ID0gMDsgc2VhdCA8IDMgJiYgc2VhdCA8IHJlc3VsdC5wbGF5ZXJSZXN1bHRzLnNpemUoKTsgc2VhdCsrKSB7CiAgICAgICAgICAgIFBsYXllclJlc3VsdCBwciA9IHJlc3VsdC5wbGF5ZXJSZXN1bHRzLmdldChzZWF0KTsKICAgICAgICAgICAgLy8gSWYgd2UgZ290IG5vIHNwZWxsIGRhdGEgZnJvbSBwYXJzaW5nLCBpdCBtZWFucyBlaXRoZXIgcXVpZXQgbW9kZSBvciBubyBtYXRjaGVzCiAgICAgICAgICAgIC8vIExlYXZlIGF0IDAgcmF0aGVyIHRoYW4gZmFicmljYXRpbmcgZGF0YQogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIEJ1aWxkIHBlci1jYXJkIHN0YXRzIGZyb20gdmVyYm9zZSBvdXRwdXQgKGZvciBjb2FjaCBhbmFseXRpY3MpIOKUgOKUgAogICAgICAgIGlmICghcXVpZXQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGJ1aWxkUGVyQ2FyZFN0YXRzKHJlc3VsdCwgbGluZXMpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbQ09BQ0hdIFBlci1jYXJkIHN0YXQgdHJhY2tpbmcgZmFpbGVkOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgLy8gTm9uLWZhdGFsIOKAlCBnYW1lIHJlc3VsdCBpcyBzdGlsbCB2YWxpZCB3aXRob3V0IHBlci1jYXJkIGRhdGEKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIE1MIERlY2lzaW9uIGV4dHJhY3Rpb24gKGZvciBSTCB0cmFpbmluZyBkYXRhKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiAobWxMb2dnaW5nRW5hYmxlZCAmJiAhcXVpZXQgJiYgbWxEZWNpc2lvbkxvZ2dlciAhPSBudWxsKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpbnQgbnVtUGxheWVycyA9IGRlY2tzLnNpemUoKTsKICAgICAgICAgICAgICAgIFN0cmluZyBnaWQgPSAiZ2FtZS0iICsgZ2FtZUluZGV4ICsgIi0iICsgZ2FtZVNlZWQ7CiAgICAgICAgICAgICAgICBTdHJpbmdbXSBjbWROYW1lcyA9IG5ldyBTdHJpbmdbbnVtUGxheWVyc107CiAgICAgICAgICAgICAgICBMaXN0PExpc3Q8U3RyaW5nPj4gZGVja0NhcmRMaXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgICAgICAgICAgICAgIGZvciAoaW50IGRpID0gMDsgZGkgPCBudW1QbGF5ZXJzOyBkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY21kTmFtZXNbZGldID0gZGVja3MuZ2V0KGRpKS5jb21tYW5kZXJOYW1lOwogICAgICAgICAg' +
'ICAgICAgICAgIGRlY2tDYXJkTGlzdHMuYWRkKHJlYWREZWNrQ2FyZE5hbWVzKGRlY2tzLmdldChkaSkuZGVja0ZpbGUpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBEZWNpc2lvbkV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRGVjaXNpb25FeHRyYWN0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgIG51bVBsYXllcnMsIGdpZCwgY21kTmFtZXMsIGRlY2tDYXJkTGlzdHMpOwogICAgICAgICAgICAgICAgTGlzdDxEZWNpc2lvblNuYXBzaG90PiBkZWNpc2lvbnMgPSBleHRyYWN0b3IucHJvY2Vzc0dhbWVMb2cobGluZXMpOwoKICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGRlY2sgbWV0YWRhdGEgbWFwCiAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgTWFwPFN0cmluZywgU3RyaW5nPj4gZGVja01ldGEgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICAgICBmb3IgKGludCBkaSA9IDA7IGRpIDwgbnVtUGxheWVyczsgZGkrKykgewogICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWV0YSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgICAgICAgICBtZXRhLnB1dCgibmFtZSIsIGRlY2tzLmdldChkaSkuZGVja05hbWUpOwogICAgICAgICAgICAgICAgICAgIG1ldGEucHV0KCJjb21tYW5kZXIiLCBkZWNrcy5nZXQoZGkpLmNvbW1hbmRlck5hbWUpOwogICAgICAgICAgICAgICAgICAgIG1ldGEucHV0KCJhcmNoZXR5cGUiLCBkZWNrcy5nZXQoZGkpLmFyY2hldHlwZSAhPSBudWxsID8gZGVja3MuZ2V0KGRpKS5hcmNoZXR5cGUgOiAibWlkcmFuZ2UiKTsKICAgICAgICAgICAgICAgICAgICBkZWNrTWV0YS5wdXQoZGksIG1ldGEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBnYW1lIG91dGNvbWUKICAgICAgICAgICAgICAgIFN0cmluZyBvdXRjb21lID0gcmVzdWx0Lndpbm5pbmdTZWF0ICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgPyAid2luX3NlYXRfIiArIHJlc3VsdC53aW5uaW5nU2VhdAogICAgICAgICAgICAgICAgICAgICAgICA6ICJkcmF3IjsKCiAgICAgICAgICAgICAgICBtbERlY2lzaW9uTG9nZ2VyLmxvZ0dhbWVEZWNpc2lvbnMoZGVjaXNpb25zLCBkZWNrTWV0YSwgb3V0Y29tZSk7CgogICAgICAgICAgICAgICAgaWYgKCFkZWNpc2lvbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIltNTF0gR2FtZSAlZDogJWQgZGVjaXNpb24gc25hcHNob3RzIGV4dHJhY3RlZCVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVJbmRleCwgZGVjaXNpb25zLnNpemUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIltNTF0gRGVjaXNpb24gZXh0cmFjdGlvbiBmYWlsZWQgZm9yIGdhbWUgIiArIGdhbWVJbmRleCArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICAvLyBOb24tZmF0YWwKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEpWTSBQcm9jZXNzIFBvb2wgKElzc3VlICMzKQogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBTaHV0ZG93biBhbnkgcG9vbGVkIEZvcmdlIHdvcmtlciBwcm9jZXNzZXMuCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBzaHV0ZG93bldvcmtlclBvb2woKSB7CiAgICAgICAgZm9yIChGb3JnZVdvcmtlciB3b3JrZXIgOiB3b3JrZXJQb29sKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB3b3JrZXIuc2h1dGRvd24oKTsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0' +
'aW9uIGUpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW1BPT0xdIEVycm9yIHNodXR0aW5nIGRvd24gd29ya2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdvcmtlclBvb2wuY2xlYXIoKTsKICAgIH0KCiAgICAvKioKICAgICAqIElubmVyIGNsYXNzIHJlcHJlc2VudGluZyBhIHBlcnNpc3RlbnQgRm9yZ2UgSlZNIHdvcmtlciBwcm9jZXNzLgogICAgICogSXNzdWUgIzM6IEtlZXBzIGEgSlZNIGFsaXZlIHRvIGF2b2lkIHJlcGVhdGVkIHN0YXJ0dXAgb3ZlcmhlYWQuCiAgICAgKgogICAgICogTk9URTogVGhpcyBpcyBhIGZ1dHVyZSBlbmhhbmNlbWVudCBzdHViLiBGdWxsIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzCiAgICAgKiBGb3JnZSB0byBzdXBwb3J0IGEgcGVyc2lzdGVudCBiYXRjaCBtb2RlIChyZWFkaW5nIGdhbWUgY29uZmlncyBmcm9tIHN0ZGluKS4KICAgICAqIEN1cnJlbnRseSwgRm9yZ2Ugb25seSBzdXBwb3J0cyBvbmUtc2hvdCBzaW0gcnVucywgc28gZWFjaCBnYW1lIHN0aWxsCiAgICAgKiBsYXVuY2hlcyBhIG5ldyBwcm9jZXNzLiBUaGUgSlZNIGZsYWdzIGluIGJ1aWxkRm9yZ2VDb21tYW5kKCkgcmVkdWNlCiAgICAgKiBzdGFydHVwIG92ZXJoZWFkIGZyb20gfjItM3MgdG8gfjEtMS41cyB2aWE6CiAgICAgKiAgIC0gVXNlU2VyaWFsR0MgKGxpZ2h0ZXIgR0MpCiAgICAgKiAgIC0gVGllcmVkU3RvcEF0TGV2ZWw9MSAoZmFzdGVyIEpJVCkKICAgICAqCiAgICAgKiBXaGVuIEZvcmdlIGFkZHMgYSBwZXJzaXN0ZW50IGJhdGNoIG1vZGUsIHRoaXMgY2xhc3Mgd2lsbCBiZSBhY3RpdmF0ZWQuCiAgICAgKi8KICAgIHN0YXRpYyBjbGFzcyBGb3JnZVdvcmtlciB7CiAgICAgICAgcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7CiAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFsaXZlID0gZmFsc2U7CgogICAgICAgIHZvaWQgc2h1dGRvd24oKSB7CiAgICAgICAgICAgIGlmIChwcm9jZXNzICE9IG51bGwgJiYgcHJvY2Vzcy5pc0FsaXZlKCkpIHsKICAgICAgICAgICAgICAgIHByb2Nlc3MuZGVzdHJveUZvcmNpYmx5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWxpdmUgPSBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBQcm9ncmVzcyBDYWxsYmFjayBJbnRlcmZhY2UgKElzc3VlICM1KQogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBDYWxsYmFjayBpbnRlcmZhY2UgZm9yIHJlYWwtdGltZSBwcm9ncmVzcyByZXBvcnRpbmcuCiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgcmVjZWl2ZSB1cGRhdGVzIGFmdGVyIGVhY2ggZ2FtZSBjb21wbGV0ZXMuCiAgICAgKi8KICAgIHB1YmxpYyBpbnRlcmZhY2UgUHJvZ3Jlc3NDYWxsYmFjayB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGFmdGVyIGVhY2ggZ2FtZSBjb21wbGV0ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gY29tcGxldGVkICBOdW1iZXIgb2YgZ2FtZXMgY29tcGxldGVkIHNvIGZhcgogICAgICAgICAqIEBwYXJhbSB0b3RhbCAgICAgIFRvdGFsIGdhbWVzIGluIHRoZSBiYXRjaAogICAgICAgICAqIEBwYXJhbSBwZXJjZW50RG9uZSBDb21wbGV0aW9uIHBlcmNlbnRhZ2UgKDAtMTAwKQogICAgICAgICAqIEBwYXJhbSBzaW1zUGVyU2VjIEN1cnJlbnQgdGhyb3VnaHB1dCAoZ2FtZXMgcGVyIHNlY29uZCkKICAgICAgICAgKiBAcGFyYW0gbGFzdFJlc3VsdCBUaGUgbW9zdCByZWNlbnRseSBjb21wbGV0ZWQgZ2FtZSByZXN1bHQKICAgICAgICAgKi8KICAgICAgICB2b2lkIG9uUHJvZ3Jlc3MoaW50IGNvbXBsZXRlZCwgaW50IHRvdGFsLCBpbnQgcGVyY2VudERvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzaW1z' +
'UGVyU2VjLCBHYW1lUmVzdWx0IGxhc3RSZXN1bHQpOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gUGVyLUNhcmQgU3RhdCBUcmFja2luZwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBSZWFkIGNhcmQgbmFtZXMgZnJvbSBhIEZvcmdlIC5kY2sgZmlsZS4KICAgICAqIEZvcm1hdDoKICAgICAqICAgW0NvbW1hbmRlcl0KICAgICAqICAgMSBDYXJkIE5hbWV8U0VUCiAgICAgKiAgIFtNYWluXQogICAgICogICAxIENhcmQgTmFtZXxTRVQKICAgICAqICAgLi4uCiAgICAgKgogICAgICogUmV0dXJucyBhbGwgY2FyZCBuYW1lcyAoQ29tbWFuZGVyICsgTWFpbiksIGV4Y2x1ZGluZyBzaWRlYm9hcmQuCiAgICAgKi8KICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHJlYWREZWNrQ2FyZE5hbWVzKFN0cmluZyBkZWNrRmlsZVBhdGgpIHsKICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBQYXRoIHBhdGggPSBQYXRoLm9mKGRlY2tGaWxlUGF0aCk7CiAgICAgICAgICAgIGlmICghRmlsZXMuZXhpc3RzKHBhdGgpKSB7CiAgICAgICAgICAgICAgICAvLyBUcnkgYWRkaW5nIC5kY2sgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICBQYXRoIHdpdGhFeHQgPSBQYXRoLm9mKGRlY2tGaWxlUGF0aCArICIuZGNrIik7CiAgICAgICAgICAgICAgICBpZiAoRmlsZXMuZXhpc3RzKHdpdGhFeHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHdpdGhFeHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFRyeSByZXNvbHZpbmcgYWdhaW5zdCBGb3JnZSBjb21tYW5kZXIgZGVja3MgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgUGF0aCByZXNvbHZlZCA9IHJlc29sdmVGb3JnZURlY2tzUGF0aChkZWNrRmlsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZCAhPSBudWxsICYmIEZpbGVzLmV4aXN0cyhyZXNvbHZlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHJlc29sdmVkOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW0NPQUNIXSBEZWNrIGZpbGUgbm90IGZvdW5kOiAiICsgZGVja0ZpbGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBMaXN0PFN0cmluZz4gbGluZXMgPSBGaWxlcy5yZWFkQWxsTGluZXMocGF0aCk7CiAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uID0gIk1haW4iOwogICAgICAgICAgICBQYXR0ZXJuIGNhcmRMaW5lID0gUGF0dGVybi5jb21waWxlKCJeKFxcZCspXFxzKyguKz8pKD86XFx8KC4rKSk/JCIpOwoKICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IGxpbmVzKSB7CiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KCkgfHwgbGluZS5zdGFydHNXaXRoKCIvLyIpKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJbIikgJiYgbGluZS5lbmRzV2l0aCgiXSIpKSB7CiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9IGxpbmUuc3Vic3RyaW5nKDEsIGxpbmUubGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIk5hbWU9IikpIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgIC8vIFNraXAgc2lkZWJvYXJkCiAgICAgICAgICAgICAgICBpZiAoc2VjdGlvbi5lcXVhbHNJ' +
'Z25vcmVDYXNlKCJTaWRlYm9hcmQiKSkgY29udGludWU7CgogICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gY2FyZExpbmUubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgICAgIGlmIChtLm1hdGNoZXMoKSkgewogICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXJkTmFtZSA9IG0uZ3JvdXAoMikudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIGludCBxdHkgPSBJbnRlZ2VyLnBhcnNlSW50KG0uZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgICAgIC8vIEluIENvbW1hbmRlciwgcXR5IGlzIGFsd2F5cyAxLCBidXQganVzdCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcSA9IDA7IHEgPCBxdHk7IHErKykgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGQoY2FyZE5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW0NPQUNIXSBGYWlsZWQgdG8gcmVhZCBkZWNrIGZpbGU6ICIgKyBkZWNrRmlsZVBhdGggKyAiIC0gIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5hbWVzOwogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZSBhIGRlY2sgbmFtZSB0byBpdHMgZnVsbCBwYXRoIGluIHRoZSBGb3JnZSBjb21tYW5kZXIgZGVja3MgZGlyZWN0b3J5LgogICAgICogQ2hlY2tzICVBUFBEQVRBJS9Gb3JnZS9kZWNrcy9jb21tYW5kZXIvIG9uIFdpbmRvd3MuCiAgICAgKi8KICAgIHByaXZhdGUgUGF0aCByZXNvbHZlRm9yZ2VEZWNrc1BhdGgoU3RyaW5nIGRlY2tOYW1lKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgU3RyaW5nIGFwcGRhdGEgPSBTeXN0ZW0uZ2V0ZW52KCJBUFBEQVRBIik7CiAgICAgICAgICAgIGlmIChhcHBkYXRhID09IG51bGwgfHwgYXBwZGF0YS5pc0VtcHR5KCkpIHJldHVybiBudWxsOwogICAgICAgICAgICBQYXRoIGRlY2tzRGlyID0gUGF0aC5vZihhcHBkYXRhLCAiRm9yZ2UiLCAiZGVja3MiLCAiY29tbWFuZGVyIik7CiAgICAgICAgICAgIGlmICghRmlsZXMuaXNEaXJlY3RvcnkoZGVja3NEaXIpKSByZXR1cm4gbnVsbDsKCiAgICAgICAgICAgIC8vIFRyeSB3aXRoIC5kY2sgZXh0ZW5zaW9uCiAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGVja05hbWU7CiAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLmRjayIpKSBuYW1lID0gbmFtZSArICIuZGNrIjsKICAgICAgICAgICAgUGF0aCBjYW5kaWRhdGUgPSBkZWNrc0Rpci5yZXNvbHZlKG5hbWUpOwogICAgICAgICAgICBpZiAoRmlsZXMuZXhpc3RzKGNhbmRpZGF0ZSkpIHJldHVybiBjYW5kaWRhdGU7CgogICAgICAgICAgICAvLyBDYXNlLWluc2Vuc2l0aXZlIGZhbGxiYWNrCiAgICAgICAgICAgIFN0cmluZyBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHRyeSAodmFyIHN0cmVhbSA9IEZpbGVzLmxpc3QoZGVja3NEaXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtCiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihwIC0+IHAuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGxvd2VyTmFtZSkpCiAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpCiAgICAgICAgICAgICAgICAgICAgLm9yRWxzZShudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEJ1aWxkIHBlci1jYXJkIGdhbWUgc3RhdHMgZnJvbSB2ZXJib3NlIEZvcmdlIGxvZyBvdXRwdXQuCiAgICAgKgogICAgICogVHJhY2tzIGZvciBlYWNoIGNhcmQgaW4gZWFjaCBwbGF5ZXIncyBkZWNrOgogICAgICogICAtIGRyYXduOiB3YXMgdGhlIGNhcmQgZHJhd24gKG9yIGluIG9wZW5pbmcgaGFuZCkKICAgICAqICAgLSB0dXJuRHJhd246IGZpcnN0IHR1cm4gdGhlIGNhcmQgd2FzIGRyYXduCiAgICAgKiAgIC0gY2FzdDogd2FzIHRoZSBjYXJkIGNhc3QKICAgICAqICAgLSB0dXJuQ2FzdDogdHVybiBpdCB3YXMgY2FzdAogICAgICogICAtIHN0dWNrSW5IYW5kOiBkcmF3biBidXQgbmV2ZXIgY2FzdAogICAgICogICAtIGRhbWFnZURlYWx0OiBkYW1hZ2UgYXR0cmlidXRlZCB0byB0aGlzIGNhcmQgKGJlc3QgZWZmb3J0KQogICAgICogICAtIGluT3Bl' +
'bmluZ0hhbmQgLyBrZXB0SW5PcGVuaW5nSGFuZDogb3BlbmluZy1oYW5kIHRyYWNraW5nCiAgICAgKi8KICAgIHByaXZhdGUgdm9pZCBidWlsZFBlckNhcmRTdGF0cyhHYW1lUmVzdWx0IHJlc3VsdCwgU3RyaW5nW10gbGluZXMpIHsKICAgICAgICAvLyBJbml0aWFsaXplIHBlci1jYXJkIG1hcHMgZm9yIGVhY2ggc2VhdCBmcm9tIGRlY2sgZmlsZXMKICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICBNYXA8U3RyaW5nLCBQZXJDYXJkR2FtZVN0YXRzPltdIHNlYXRDYXJkcyA9IG5ldyBNYXBbM107CiAgICAgICAgZm9yIChpbnQgcyA9IDA7IHMgPCAzICYmIHMgPCBkZWNrcy5zaXplKCk7IHMrKykgewogICAgICAgICAgICBzZWF0Q2FyZHNbc10gPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjYXJkTmFtZXMgPSByZWFkRGVja0NhcmROYW1lcyhkZWNrcy5nZXQocykuZGVja0ZpbGUpOwogICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogY2FyZE5hbWVzKSB7CiAgICAgICAgICAgICAgICBpZiAoIXNlYXRDYXJkc1tzXS5jb250YWluc0tleShuYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHNlYXRDYXJkc1tzXS5wdXQobmFtZSwgbmV3IFBlckNhcmRHYW1lU3RhdHMobmFtZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUcmFjayBjdXJyZW50IHR1cm4gcGVyIHNlYXQKICAgICAgICBpbnQgZ2xvYmFsVHVybiA9IDA7CiAgICAgICAgYm9vbGVhbltdIG9wZW5pbmdIYW5kUGhhc2UgPSB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX07IC8vIGJlZm9yZSBmaXJzdCB0dXJuCgogICAgICAgIGZvciAoU3RyaW5nIHJhd0xpbmUgOiBsaW5lcykgewogICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJhd0xpbmUudHJpbSgpOwogICAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KCkpIGNvbnRpbnVlOwoKICAgICAgICAgICAgLy8gRGV0ZWN0IHR1cm4gYm91bmRhcmllczogIlR1cm4gNSAoQWkoMSktTmFtZSkiCiAgICAgICAgICAgIE1hdGNoZXIgdHVybk1hdGNoID0gVkVSQk9TRV9UVVJOX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKHR1cm5NYXRjaC5maW5kKCkpIHsKICAgICAgICAgICAgICAgIGludCB0dXJuTnVtID0gSW50ZWdlci5wYXJzZUludCh0dXJuTWF0Y2guZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgaW50IGFpTnVtID0gSW50ZWdlci5wYXJzZUludCh0dXJuTWF0Y2guZ3JvdXAoMikpOwogICAgICAgICAgICAgICAgZ2xvYmFsVHVybiA9IHR1cm5OdW07CiAgICAgICAgICAgICAgICBpbnQgc2VhdCA9IGFpTnVtIC0gMTsKICAgICAgICAgICAgICAgIGlmIChzZWF0ID49IDAgJiYgc2VhdCA8IDMpIHsKICAgICAgICAgICAgICAgICAgICBvcGVuaW5nSGFuZFBoYXNlW3NlYXRdID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGV0ZWN0IGRyYXdzOiAiQWkoMSktTmFtZSBkcmF3cyBDYXJkTmFtZS4iCiAgICAgICAgICAgIE1hdGNoZXIgZHJhd01hdGNoID0gRFJBV19QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChkcmF3TWF0Y2guZmluZCgpKSB7CiAgICAgICAgICAgICAgICBpbnQgc2VhdCA9IEludGVnZXIucGFyc2VJbnQoZHJhd01hdGNoLmdyb3VwKDEpKSAtIDE7CiAgICAgICAgICAgICAgICBTdHJpbmcgY2FyZE5hbWUgPSBkcmF3TWF0Y2guZ3JvdXAoMikudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHNlYXQgPj0gMCAmJiBzZWF0IDwgMyAmJiBzZWF0Q2FyZHNbc2VhdF0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIFBlckNhcmRHYW1lU3RhdHMgc3RhdHMgPSBzZWF0Q2FyZHNbc2VhdF0uZ2V0KGNhcmROYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXJkIG5vdCBpbiBkZWNrIGxpc3QgKHRva2VuIGRyYXcsIGV0Yy4pIOKAlCBjcmVhdGUgZW50cnkKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBuZXcgUGVyQ2FyZEdhbWVTdGF0cyhjYXJkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXRDYXJkc1tzZWF0XS5wdXQoY2FyZE5hbWUsIHN0YXRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0cy5kcmF3bikgewog' +
'ICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5kcmF3biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLnR1cm5EcmF3biA9IGdsb2JhbFR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcGVuaW5nSGFuZFBoYXNlW3NlYXRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmluT3BlbmluZ0hhbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5rZXB0SW5PcGVuaW5nSGFuZCA9IHRydWU7IC8vIGFzc3VtZSBrZXB0IHVubGVzcyBtdWxsaWdhbiBkZXRlY3RlZAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBEZXRlY3QgY2FzdHM6ICJBaSgxKS1OYW1lIGNhc3RzIENhcmROYW1lLiIKICAgICAgICAgICAgTWF0Y2hlciBjYXN0TWF0Y2ggPSBDQVNUX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKGNhc3RNYXRjaC5maW5kKCkpIHsKICAgICAgICAgICAgICAgIGludCBzZWF0ID0gSW50ZWdlci5wYXJzZUludChjYXN0TWF0Y2guZ3JvdXAoMSkpIC0gMTsKICAgICAgICAgICAgICAgIFN0cmluZyBjYXJkTmFtZSA9IGNhc3RNYXRjaC5ncm91cCgyKS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoc2VhdCA+PSAwICYmIHNlYXQgPCAzICYmIHNlYXRDYXJkc1tzZWF0XSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgUGVyQ2FyZEdhbWVTdGF0cyBzdGF0cyA9IHNlYXRDYXJkc1tzZWF0XS5nZXQoY2FyZE5hbWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gbmV3IFBlckNhcmRHYW1lU3RhdHMoY2FyZE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWF0Q2FyZHNbc2VhdF0ucHV0KGNhcmROYW1lLCBzdGF0cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghc3RhdHMuY2FzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5jYXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMudHVybkNhc3QgPSBnbG9iYWxUdXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFzIGRyYXduIGlmIG5vdCBhbHJlYWR5IChjb21tYW5kZXIgem9uZSBjYXN0cywgZXRjLikKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRzLmRyYXduKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmRyYXduID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMudHVybkRyYXduID0gZ2xvYmFsVHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGV0ZWN0IGxhbmQgcGxheXM6ICJBaSgxKS1OYW1lIHBsYXlzIExhbmROYW1lLiIKICAgICAgICAgICAgTWF0Y2hlciBsYW5kTWF0Y2ggPSBMQU5EX1BMQVlfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICBpZiAobGFuZE1hdGNoLmZpbmQoKSkgewogICAgICAgICAgICAgICAgaW50IHNlYXQgPSBJbnRlZ2VyLnBhcnNlSW50KGxhbmRNYXRjaC5ncm91cCgxKSkgLSAxOwogICAgICAgICAgICAgICAgU3RyaW5nIGNhcmROYW1lID0gbGFuZE1hdGNoLmdyb3VwKDIpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmIChzZWF0ID49IDAgJiYgc2VhdCA8IDMgJiYgc2VhdENhcmRzW3NlYXRdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBQZXJDYXJkR2FtZVN0YXRzIHN0YXRzID0gc2VhdENhcmRzW3NlYXRdLmdldChjYXJkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBuZXcgUGVyQ2FyZEdhbWVTdGF0cyhjYXJkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXRDYXJkc1tzZWF0XS5wdXQoY2FyZE5hbWUsIHN0YXRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0cy5jYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmNhc3QgPSB0cnVlOyAgLy8gcGxheWluZyBhIGxhbmQgY291bnRzIGFzICJ1c2luZyIgaXQKICAgICAgICAgICAgICAgICAgICAg' +
'ICAgc3RhdHMudHVybkNhc3QgPSBnbG9iYWxUdXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXRzLmRyYXduKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmRyYXduID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMudHVybkRyYXduID0gZ2xvYmFsVHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGV0ZWN0IHBlci1jYXJkIGRhbWFnZTogIkNhcmROYW1lIGRlYWxzIE4gZGFtYWdlIgogICAgICAgICAgICBNYXRjaGVyIGNhcmREbWdNYXRjaCA9IENBUkRfREFNQUdFX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKGNhcmREbWdNYXRjaC5maW5kKCkpIHsKICAgICAgICAgICAgICAgIFN0cmluZyBjYXJkTmFtZSA9IGNhcmREbWdNYXRjaC5ncm91cCgxKS50cmltKCk7CiAgICAgICAgICAgICAgICBpbnQgYW1vdW50ID0gSW50ZWdlci5wYXJzZUludChjYXJkRG1nTWF0Y2guZ3JvdXAoMikpOwogICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgd2hpY2ggc2VhdCBvd25zIHRoaXMgY2FyZAogICAgICAgICAgICAgICAgZm9yIChpbnQgcyA9IDA7IHMgPCAzOyBzKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VhdENhcmRzW3NdICE9IG51bGwgJiYgc2VhdENhcmRzW3NdLmNvbnRhaW5zS2V5KGNhcmROYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZWF0Q2FyZHNbc10uZ2V0KGNhcmROYW1lKS5kYW1hZ2VEZWFsdCArPSBhbW91bnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBhdHRyaWJ1dGUgdG8gZmlyc3QgbWF0Y2hpbmcgc2VhdAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRmluYWxpemU6IGNvbXB1dGUgc3R1Y2tJbkhhbmQgYW5kIGF0dGFjaCB0byBQbGF5ZXJSZXN1bHRzCiAgICAgICAgZm9yIChpbnQgcyA9IDA7IHMgPCAzICYmIHMgPCByZXN1bHQucGxheWVyUmVzdWx0cy5zaXplKCk7IHMrKykgewogICAgICAgICAgICBpZiAoc2VhdENhcmRzW3NdID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICBMaXN0PFBlckNhcmRHYW1lU3RhdHM+IGNhcmRTdGF0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgZm9yIChQZXJDYXJkR2FtZVN0YXRzIHN0YXRzIDogc2VhdENhcmRzW3NdLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICBzdGF0cy5jb21wdXRlU3R1Y2tJbkhhbmQoKTsKICAgICAgICAgICAgICAgIGNhcmRTdGF0c0xpc3QuYWRkKHN0YXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucGxheWVyUmVzdWx0cy5nZXQocykuY2FyZFN0YXRzID0gY2FyZFN0YXRzTGlzdDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBwbGFjZWhvbGRlciBHYW1lUmVzdWx0IGZvciBhIGZhaWxlZC9jcmFzaGVkIGdhbWUuCiAgICAgKi8KICAgIHByaXZhdGUgR2FtZVJlc3VsdCBjcmVhdGVGYWlsZWRHYW1lKGludCBnYW1lSW5kZXgsIGxvbmcgZ2FtZVNlZWQsIGxvbmcgZWxhcHNlZE1zKSB7CiAgICAgICAgR2FtZVJlc3VsdCByZXN1bHQgPSBuZXcgR2FtZVJlc3VsdCgpOwogICAgICAgIHJlc3VsdC5nYW1lSW5kZXggPSBnYW1lSW5kZXg7CiAgICAgICAgcmVzdWx0LmdhbWVTZWVkID0gZ2FtZVNlZWQ7CiAgICAgICAgcmVzdWx0Lndpbm5pbmdTZWF0ID0gbnVsbDsKICAgICAgICByZXN1bHQudG90YWxUdXJucyA9IDA7CiAgICAgICAgcmVzdWx0LndpbkNvbmRpdGlvbiA9IFdpbkNvbmRpdGlvbi5USU1FT1VULmdldExhYmVsKCk7CiAgICAgICAgcmVzdWx0LmVsYXBzZWRNcyA9IGVsYXBzZWRNczsKICAgICAgICByZXN1bHQucGxheWVyUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgIFBsYXllclJlc3VsdCBwciA9IG5ldyBQbGF5ZXJSZXN1bHQoKTsKICAgICAgICAgICAgcHIuc2VhdEluZGV4ID0gaTsKICAgICAgICAgICAgcHIuZmluYWxMaWZlID0gNDA7CiAgICAgICAgICAgIHByLm11bGxpZ2FucyA9IDA7CiAgICAgICAgICAgIHByLmlzV2lubmVyID0gZmFsc2U7CiAgICAgICAgICAgIHJlc3VsdC5wbGF5ZXJSZXN1bHRzLmFkZChwcik7CiAg' +
'ICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\batch\BatchRunner.java' -B $b
# src/main/java/commanderailab/batch/MultiThreadBatchRunner.java (11,051 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5iYXRjaDsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5haS5BaVBvbGljeTsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5CYXRjaFJlc3VsdC4qOwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwppbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CgovKioKICogTXVsdGlUaHJlYWRCYXRjaFJ1bm5lciDigJQgUnVucyBiYXRjaCBzaW11bGF0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgdGhyZWFkcy4KICoKICogdjI0IGNoYW5nZXMgKEdpdEh1YiBJc3N1ZXMgIzMsICM0LCAjNSk6CiAqICAgLSBJc3N1ZSAjMzogSlZNIHByb2Nlc3MgcG9vbGluZyBjb25maWcgcGFzc2VkIHRvIHBlci10aHJlYWQgQmF0Y2hSdW5uZXJzCiAqICAgLSBJc3N1ZSAjNDogQUkgb3B0aW1pemF0aW9uIGZsYWdzIGZvcndhcmRlZCB0byBlYWNoIHJ1bm5lcgogKiAgIC0gSXNzdWUgIzU6IEF1dG8tZGV0ZWN0cyBvcHRpbWFsIHRocmVhZCBjb3VudCwgY29uZmlndXJhYmxlIGNhcCwKICogICAgICAgICAgICAgICByZWFsLXRpbWUgc2ltcy9zZWMgcmVwb3J0aW5nLCBncmFjZWZ1bCBiYWNrcHJlc3N1cmUKICoKICogRWFjaCB0aHJlYWQgZ2V0cyBpdHMgb3duIEJhdGNoUnVubmVyIGluc3RhbmNlIGFuZCBhIHBlci10aHJlYWQgUk5HIHNlZWQKICogZGVyaXZlZCBmcm9tIHRoZSBtYXN0ZXIgc2VlZC4gUmVzdWx0cyBhcmUgbWVyZ2VkIGFmdGVyIGFsbCB0aHJlYWRzIGNvbXBsZXRlLgogKi8KcHVibGljIGNsYXNzIE11bHRpVGhyZWFkQmF0Y2hSdW5uZXIgewoKICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZvcmdlSmFyUGF0aDsKICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZvcmdlV29ya0RpcjsKICAgIHByaXZhdGUgZmluYWwgTGlzdDxEZWNrSW5mbz4gZGVja3M7CiAgICBwcml2YXRlIGZpbmFsIEFpUG9saWN5IHBvbGljeTsKICAgIHByaXZhdGUgaW50IG51bVRocmVhZHM7CiAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcXVpZXQ7CiAgICBwcml2YXRlIGZpbmFsIGludCBjbG9ja1NlY29uZHM7CiAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBqYXZhUGF0aDsKCiAgICAvLyDilIDilIAgSXNzdWUgIzU6IFByb2dyZXNzIHRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHJpdmF0ZSBCYXRjaFJ1bm5lci5Qcm9ncmVzc0NhbGxiYWNrIHByb2dyZXNzQ2FsbGJhY2s7CiAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgdG90YWxDb21wbGV0ZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBiYXRjaFN0YXJ0TXMgPSBuZXcgQXRvbWljTG9uZygwKTsKCiAgICAvLyDilIDilIAgSXNzdWUgIzU6IEJhY2twcmVzc3VyZSBjb25maWcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwcml2YXRlIGludCBtYXhRdWV1ZURlcHRoID0gLTE7ICAvLyAtMSA9IG5vIGxpbWl0CgogICAgLy8g4pSA4pSAIElzc3VlICM0OiBBSSBvcHRpbWl6YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwcml2YXRlIGJvb2xlYW4gdXNlU2ltcGxpZmllZEFpID0gZmFsc2U7CiAgICBwcml2YXRlIGludCBhaVRoaW5rVGltZU1zID0gLTE7CgogICAgcHVibGljIE11bHRpVGhyZWFkQmF0Y2hSdW5uZXIoU3RyaW5nIGZvcmdlSmFyUGF0aCwgU3RyaW5nIGZvcmdlV29ya0RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RGVja0luZm8+IGRlY2tzLCBBaVBvbGljeSBwb2xpY3ksIGludCBudW1UaHJlYWRzKSB7CiAgICAgICAgdGhpcyhmb3JnZUphclBhdGgsIGZvcmdlV29ya0RpciwgZGVja3MsIHBvbGljeSwgbnVtVGhyZWFkcywgdHJ1ZSwgMTIwLCAiamF2YSIpOwogICAgfQoKICAgIHB1YmxpYyBNdWx0aVRocmVhZEJhdGNoUnVubmVyKFN0cmluZyBmb3JnZUphclBhdGgsIFN0cmluZyBmb3JnZVdvcmtEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAg' +
'ICAgICAgICBMaXN0PERlY2tJbmZvPiBkZWNrcywgQWlQb2xpY3kgcG9saWN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVRocmVhZHMsIGJvb2xlYW4gcXVpZXQsIGludCBjbG9ja1NlY29uZHMpIHsKICAgICAgICB0aGlzKGZvcmdlSmFyUGF0aCwgZm9yZ2VXb3JrRGlyLCBkZWNrcywgcG9saWN5LCBudW1UaHJlYWRzLCBxdWlldCwgY2xvY2tTZWNvbmRzLCAiamF2YSIpOwogICAgfQoKICAgIHB1YmxpYyBNdWx0aVRocmVhZEJhdGNoUnVubmVyKFN0cmluZyBmb3JnZUphclBhdGgsIFN0cmluZyBmb3JnZVdvcmtEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PERlY2tJbmZvPiBkZWNrcywgQWlQb2xpY3kgcG9saWN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVRocmVhZHMsIGJvb2xlYW4gcXVpZXQsIGludCBjbG9ja1NlY29uZHMsIFN0cmluZyBqYXZhUGF0aCkgewogICAgICAgIHRoaXMuZm9yZ2VKYXJQYXRoID0gZm9yZ2VKYXJQYXRoOwogICAgICAgIHRoaXMuZm9yZ2VXb3JrRGlyID0gZm9yZ2VXb3JrRGlyOwogICAgICAgIHRoaXMuZGVja3MgPSBkZWNrczsKICAgICAgICB0aGlzLnBvbGljeSA9IHBvbGljeTsKICAgICAgICB0aGlzLm51bVRocmVhZHMgPSBNYXRoLm1heCgxLCBudW1UaHJlYWRzKTsKICAgICAgICB0aGlzLnF1aWV0ID0gcXVpZXQ7CiAgICAgICAgdGhpcy5jbG9ja1NlY29uZHMgPSBjbG9ja1NlY29uZHM7CiAgICAgICAgdGhpcy5qYXZhUGF0aCA9IChqYXZhUGF0aCAhPSBudWxsICYmICFqYXZhUGF0aC5pc0VtcHR5KCkpID8gamF2YVBhdGggOiAiamF2YSI7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgcHJvZ3Jlc3MgY2FsbGJhY2sgZm9yIHJlYWwtdGltZSByZXBvcnRpbmcgKElzc3VlICM1KS4KICAgICAqLwogICAgcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NDYWxsYmFjayhCYXRjaFJ1bm5lci5Qcm9ncmVzc0NhbGxiYWNrIGNhbGxiYWNrKSB7CiAgICAgICAgdGhpcy5wcm9ncmVzc0NhbGxiYWNrID0gY2FsbGJhY2s7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXQgbWF4IHN1YnByb2Nlc3MgcXVldWUgZGVwdGggZm9yIGJhY2twcmVzc3VyZSAoSXNzdWUgIzUpLgogICAgICogSWYgdGhlIG51bWJlciBvZiBydW5uaW5nIEZvcmdlIHN1YnByb2Nlc3NlcyBleGNlZWRzIHRoaXMgbGltaXQsCiAgICAgKiBuZXcgZ2FtZSBzcGF3bnMgYXJlIHRocm90dGxlZCB1bnRpbCBzbG90cyBmcmVlIHVwLgogICAgICoKICAgICAqIEBwYXJhbSBtYXhEZXB0aCBNYXggY29uY3VycmVudCBzdWJwcm9jZXNzZXMgKC0xIGZvciB1bmxpbWl0ZWQpCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldE1heFF1ZXVlRGVwdGgoaW50IG1heERlcHRoKSB7CiAgICAgICAgdGhpcy5tYXhRdWV1ZURlcHRoID0gbWF4RGVwdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25maWd1cmUgQUkgb3B0aW1pemF0aW9uIGZsYWdzIChJc3N1ZSAjNCkuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIHNldEFpT3B0aW1pemF0aW9uKGJvb2xlYW4gc2ltcGxpZmllZCwgaW50IHRoaW5rVGltZU1zKSB7CiAgICAgICAgdGhpcy51c2VTaW1wbGlmaWVkQWkgPSBzaW1wbGlmaWVkOwogICAgICAgIHRoaXMuYWlUaGlua1RpbWVNcyA9IHRoaW5rVGltZU1zOwogICAgfQoKICAgIC8qKgogICAgICogQXV0by1kZXRlY3Qgb3B0aW1hbCB0aHJlYWQgY291bnQgYmFzZWQgb24gYXZhaWxhYmxlIENQVSBjb3JlcyAoSXNzdWUgIzUpLgogICAgICoKICAgICAqIFVzZXMgcGh5c2ljYWwgY29yZSBjb3VudCAobm90IGxvZ2ljYWwvaHlwZXJ0aHJlYWRlZCkgd2hlbiBwb3NzaWJsZS4KICAgICAqIEVhY2ggRm9yZ2Ugc3VicHJvY2VzcyBpcyBDUFUtaW50ZW5zaXZlIHdpdGggbGl0dGxlIEkvTyB3YWl0LCBzbwogICAgICogaHlwZXJ0aHJlYWRpbmcgcHJvdmlkZXMgbWluaW1hbCBiZW5lZml0IGFuZCBtYXkgaW5jcmVhc2UgY29udGVudGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIFJlY29tbWVuZGVkIHRocmVhZCBjb3VudCBmb3IgdGhpcyBtYWNoaW5lCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgaW50IGRldGVjdE9wdGltYWxUaHJlYWRzKCkgewogICAgICAgIGludCBhdmFpbGFibGVQcm9jZXNzb3JzID0gUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpOwoKICAgICAgICAvLyBPbiBtb3N0IHN5c3RlbXMsIGF2YWlsYWJsZVByb2Nlc3NvcnMgaW5jbHVkZXMgaHlwZXJ0aHJl' +
'YWRzLgogICAgICAgIC8vIEZvciBDUFUtYm91bmQgRm9yZ2Ugc2ltcywgcGh5c2ljYWwgY29yZXMgYXJlIHdoYXQgbWF0dGVyLgogICAgICAgIC8vIEhldXJpc3RpYzogYXNzdW1lIEhUIGdpdmVzIDJ4IGxvZ2ljYWwgY29yZXMgb24gSW50ZWwvQU1ECiAgICAgICAgaW50IGVzdGltYXRlZFBoeXNpY2FsID0gYXZhaWxhYmxlUHJvY2Vzc29yczsKCiAgICAgICAgLy8gVHJ5IHRvIGRldGVjdCBpZiBoeXBlcnRocmVhZGluZyBpcyBhY3RpdmUKICAgICAgICAvLyBPbiBXaW5kb3dzLCB3ZSBjYW4gY2hlY2sgaWYgbG9naWNhbCA+IHBoeXNpY2FsCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgU3RyaW5nIG9zID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIiwgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmIChvcy5jb250YWlucygid2luIikpIHsKICAgICAgICAgICAgICAgIC8vIFdpbmRvd3M6IE5VTUJFUl9PRl9QUk9DRVNTT1JTIGVudiB2YXIgPSBsb2dpY2FsIHByb2Nlc3NvcnMKICAgICAgICAgICAgICAgIC8vIEZvciBhIG1vcmUgYWNjdXJhdGUgY291bnQsIHdlJ2QgbmVlZCBXTUkgb3IgL3Byb2Mg4oCUIGJ1dCB0aGUKICAgICAgICAgICAgICAgIC8vIHNpbXBsZSBoZXVyaXN0aWMgb2YgbG9naWNhbC8yIHdvcmtzIGZvciBtb3N0IGRlc2t0b3Agc3lzdGVtcwogICAgICAgICAgICAgICAgLy8gT25seSBhcHBseSBpZiA+IDQgbG9naWNhbCBjb3JlcyAoc21hbGwgc3lzdGVtcyBsaWtlbHkgZG9uJ3QgaGF2ZSBIVCkKICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVQcm9jZXNzb3JzID4gNCkgewogICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFBoeXNpY2FsID0gYXZhaWxhYmxlUHJvY2Vzc29ycyAvIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAob3MuY29udGFpbnMoImxpbnV4IikpIHsKICAgICAgICAgICAgICAgIC8vIExpbnV4OiB0cnkgcmVhZGluZyAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL3RvcG9sb2d5L3RocmVhZF9zaWJsaW5nc19saXN0CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIHNob3dzIDIgdGhyZWFkcyBwZXIgY29yZSwgaGFsdmUgdGhlIGNvdW50CiAgICAgICAgICAgICAgICBqYXZhLmlvLkZpbGUgdG9wb2xvZ3kgPSBuZXcgamF2YS5pby5GaWxlKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL3RvcG9sb2d5L3RocmVhZF9zaWJsaW5nc19saXN0Iik7CiAgICAgICAgICAgICAgICBpZiAodG9wb2xvZ3kuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IGphdmEubmlvLmZpbGUuRmlsZXMucmVhZFN0cmluZyh0b3BvbG9neS50b1BhdGgoKSkudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmNvbnRhaW5zKCIsIikgfHwgY29udGVudC5jb250YWlucygiLSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFBoeXNpY2FsID0gYXZhaWxhYmxlUHJvY2Vzc29ycyAvIDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgLy8gSWdub3JlIOKAlCB1c2UgYXZhaWxhYmxlUHJvY2Vzc29ycyBhcy1pcwogICAgICAgIH0KCiAgICAgICAgLy8gUmVzZXJ2ZSAxIGNvcmUgZm9yIHRoZSBPUy9KVk0gb3ZlcmhlYWQsIG1pbmltdW0gMSB3b3JrZXIKICAgICAgICBpbnQgb3B0aW1hbCA9IE1hdGgubWF4KDEsIGVzdGltYXRlZFBoeXNpY2FsIC0gMSk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJbVEhSRUFEU10gRGV0ZWN0ZWQ6ICVkIGxvZ2ljYWwgcHJvY2Vzc29ycywgfiVkIHBoeXNpY2FsIGNvcmVzIOKGkiB1c2luZyAlZCB0aHJlYWRzJW4iLAogICAgICAgICAgICAgICAgYXZhaWxhYmxlUHJvY2Vzc29ycywgZXN0aW1hdGVkUGh5c2ljYWwsIG9wdGltYWwpOwoKICAgICAgICByZXR1cm4gb3B0aW1hbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJ1biB0b3RhbEdhbWVzIGFjcm9zcyBudW1UaHJlYWRzIHdvcmtlcnMuCiAgICAgKgogICAgICogdjI0OiBSZWFsLXRpbWUgcHJvZ3Jlc3MgcmVwb3J0aW5nLCBiYWNrcHJlc3N1cmUsIHBlci1nYW1lIHNpbXMvc2VjIChJc3N1ZSAjNSkuCiAgICAgKi8KICAgIHB1YmxpYyBMaXN0PEdhbWVSZXN1bHQ+IHJ1bkJhdGNoKGludCB0b3RhbEdhbWVzLCBMb25nIG1hc3RlclNlZWQpIHRocm93cyBJbnRlcnJ1' +
'cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKICAgICAgICAvLyBJc3N1ZSAjNTogQXV0by1kZXRlY3QgaWYgdGhyZWFkcz0wIG9yIHRocmVhZHM9LTEgKGF1dG8gbW9kZSkKICAgICAgICBpZiAobnVtVGhyZWFkcyA8PSAwKSB7CiAgICAgICAgICAgIG51bVRocmVhZHMgPSBkZXRlY3RPcHRpbWFsVGhyZWFkcygpOwogICAgICAgIH0KCiAgICAgICAgaW50IGdhbWVzUGVyVGhyZWFkID0gdG90YWxHYW1lcyAvIG51bVRocmVhZHM7CiAgICAgICAgaW50IHJlbWFpbmRlciA9IHRvdGFsR2FtZXMgJSBudW1UaHJlYWRzOwoKICAgICAgICAvLyBJc3N1ZSAjNTogQmFja3ByZXNzdXJlIOKAlCBsaW1pdCBjb25jdXJyZW50IHN1YnByb2Nlc3NlcyBpZiBjb25maWd1cmVkCiAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yOwogICAgICAgIGlmIChtYXhRdWV1ZURlcHRoID4gMCkgewogICAgICAgICAgICAvLyBVc2UgYSBib3VuZGVkIHRocmVhZCBwb29sIHRvIHByZXZlbnQgUkFNIGV4aGF1c3Rpb24gZnJvbSB0b28gbWFueSBGb3JnZSBKVk1zCiAgICAgICAgICAgIGludCBlZmZlY3RpdmVUaHJlYWRzID0gTWF0aC5taW4obnVtVGhyZWFkcywgbWF4UXVldWVEZXB0aCk7CiAgICAgICAgICAgIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChlZmZlY3RpdmVUaHJlYWRzKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIltCQUNLUFJFU1NVUkVdIExpbWl0aW5nIHRvICVkIGNvbmN1cnJlbnQgRm9yZ2UgcHJvY2Vzc2VzIChyZXF1ZXN0ZWQgJWQgdGhyZWFkcywgbWF4IHF1ZXVlICVkKSVuIiwKICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVUaHJlYWRzLCBudW1UaHJlYWRzLCBtYXhRdWV1ZURlcHRoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wobnVtVGhyZWFkcyk7CiAgICAgICAgfQoKICAgICAgICBMaXN0PEZ1dHVyZTxMaXN0PEdhbWVSZXN1bHQ+Pj4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgICAgICB0b3RhbENvbXBsZXRlZC5zZXQoMCk7CiAgICAgICAgYmF0Y2hTdGFydE1zLnNldChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJbQkFUQ0hdIFN0YXJ0aW5nICVkIGdhbWVzIGFjcm9zcyAlZCB0aHJlYWRzICglLjFmIGdhbWVzL3RocmVhZCBhdmcpJW4iLAogICAgICAgICAgICAgICAgdG90YWxHYW1lcywgbnVtVGhyZWFkcywgKGRvdWJsZSkgdG90YWxHYW1lcyAvIG51bVRocmVhZHMpOwoKICAgICAgICBpbnQgZ2FtZU9mZnNldCA9IDA7CiAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBudW1UaHJlYWRzOyB0KyspIHsKICAgICAgICAgICAgaW50IGNodW5rU2l6ZSA9IGdhbWVzUGVyVGhyZWFkICsgKHQgPCByZW1haW5kZXIgPyAxIDogMCk7CiAgICAgICAgICAgIGlmIChjaHVua1NpemUgPT0gMCkgY29udGludWU7CgogICAgICAgICAgICBMb25nIHRocmVhZFNlZWQgPSAobWFzdGVyU2VlZCAhPSBudWxsKSA/IG1hc3RlclNlZWQgKyAobG9uZykgZ2FtZU9mZnNldCAqIDEwMDBMIDogbnVsbDsKICAgICAgICAgICAgaW50IHN0YXJ0SW5kZXggPSBnYW1lT2Zmc2V0OwogICAgICAgICAgICBpbnQgdGhyZWFkSWQgPSB0OwoKICAgICAgICAgICAgQmF0Y2hSdW5uZXIgcnVubmVyID0gbmV3IEJhdGNoUnVubmVyKGZvcmdlSmFyUGF0aCwgZm9yZ2VXb3JrRGlyLCBkZWNrcywgcG9saWN5LCBxdWlldCwgY2xvY2tTZWNvbmRzLCBqYXZhUGF0aCk7CgogICAgICAgICAgICAvLyBJc3N1ZSAjNDogRm9yd2FyZCBBSSBvcHRpbWl6YXRpb24gc2V0dGluZ3MKICAgICAgICAgICAgcnVubmVyLnNldEFpT3B0aW1pemF0aW9uKHVzZVNpbXBsaWZpZWRBaSwgYWlUaGlua1RpbWVNcyk7CgogICAgICAgICAgICAvLyBJc3N1ZSAjNTogUGVyLXRocmVhZCBwcm9ncmVzcyBjYWxsYmFjayB0aGF0IGFnZ3JlZ2F0ZXMgYWNyb3NzIGFsbCB0aHJlYWRzCiAgICAgICAgICAgIHJ1bm5lci5zZXRQcm9ncmVzc0NhbGxiYWNrKChjb21wbGV0ZWQsIHRvdGFsLCBwY3QsIHNpbXNQZXJTZWMsIGxhc3RSZXN1bHQpIC0+IHsKICAgICAgICAgICAgICAgIGludCBnbG9iYWxDb21wbGV0ZWQgPSB0b3RhbENvbXBsZXRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKICAgICAgICAgICAgICAgIGxvbmcgZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmF0Y2hTdGFydE1zLmdldCgp' +
'OwogICAgICAgICAgICAgICAgZG91YmxlIGdsb2JhbFNpbXNQZXJTZWMgPSBlbGFwc2VkID4gMAogICAgICAgICAgICAgICAgICAgICAgICA/IChkb3VibGUpIGdsb2JhbENvbXBsZXRlZCAvIChlbGFwc2VkIC8gMTAwMC4wKQogICAgICAgICAgICAgICAgICAgICAgICA6IDAuMDsKICAgICAgICAgICAgICAgIGludCBnbG9iYWxQY3QgPSAoaW50KSAoKGRvdWJsZSkgZ2xvYmFsQ29tcGxldGVkICogMTAwLjAgLyB0b3RhbEdhbWVzKTsKCiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiW1BST0dSRVNTXSAlZC8lZCBnYW1lcyAoJS4xZiUlKSDigJQgJS4zZiBzaW1zL3NlYyAodGhyZWFkICVkOiAlZC8lZCklbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbENvbXBsZXRlZCwgdG90YWxHYW1lcywgKGRvdWJsZSkgZ2xvYmFsUGN0LAogICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxTaW1zUGVyU2VjLCB0aHJlYWRJZCwgY29tcGxldGVkLCB0b3RhbCk7CgogICAgICAgICAgICAgICAgLy8gRm9yd2FyZCB0byBleHRlcm5hbCBjYWxsYmFjayBpZiBzZXQKICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0NhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0NhbGxiYWNrLm9uUHJvZ3Jlc3MoZ2xvYmFsQ29tcGxldGVkLCB0b3RhbEdhbWVzLCBnbG9iYWxQY3QsIGdsb2JhbFNpbXNQZXJTZWMsIGxhc3RSZXN1bHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGZ1dHVyZXMuYWRkKGV4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7CiAgICAgICAgICAgICAgICBMaXN0PEdhbWVSZXN1bHQ+IHJlc3VsdHMgPSBydW5uZXIucnVuQmF0Y2hTaW5nbGVUaHJlYWQoY2h1bmtTaXplLCB0aHJlYWRTZWVkKTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0KGkpLmdhbWVJbmRleCA9IHN0YXJ0SW5kZXggKyBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgIGdhbWVPZmZzZXQgKz0gY2h1bmtTaXplOwogICAgICAgIH0KCiAgICAgICAgTGlzdDxMaXN0PEdhbWVSZXN1bHQ+PiBhbGxSZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgZm9yIChGdXR1cmU8TGlzdDxHYW1lUmVzdWx0Pj4gZnV0dXJlIDogZnV0dXJlcykgewogICAgICAgICAgICBhbGxSZXN1bHRzLmFkZChmdXR1cmUuZ2V0KCkpOwogICAgICAgIH0KCiAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgICAgICBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDIsIFRpbWVVbml0LkhPVVJTKTsKCiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBtZXJnZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBmb3IgKExpc3Q8R2FtZVJlc3VsdD4gYmF0Y2ggOiBhbGxSZXN1bHRzKSB7CiAgICAgICAgICAgIG1lcmdlZC5hZGRBbGwoYmF0Y2gpOwogICAgICAgIH0KICAgICAgICBtZXJnZWQuc29ydChDb21wYXJhdG9yLmNvbXBhcmluZ0ludChnIC0+IGcuZ2FtZUluZGV4KSk7CgogICAgICAgIC8vIEZpbmFsIHRocm91Z2hwdXQgcmVwb3J0CiAgICAgICAgbG9uZyB0b3RhbEVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJhdGNoU3RhcnRNcy5nZXQoKTsKICAgICAgICBkb3VibGUgZmluYWxTaW1zUGVyU2VjID0gdG90YWxFbGFwc2VkID4gMCA/IChkb3VibGUpIG1lcmdlZC5zaXplKCkgLyAodG90YWxFbGFwc2VkIC8gMTAwMC4wKSA6IDAuMDsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiW0JBVENIXSBDb21wbGV0ZWQgJWQgZ2FtZXMgaW4gJS4xZnMg4oCUICUuM2Ygc2ltcy9zZWMgKGFjcm9zcyAlZCB0aHJlYWRzKSVuIiwKICAgICAgICAgICAgICAgIG1lcmdlZC5zaXplKCksIHRvdGFsRWxhcHNlZCAvIDEwMDAuMCwgZmluYWxTaW1zUGVyU2VjLCBudW1UaHJlYWRzKTsKCiAgICAgICAgcmV0dXJuIG1lcmdlZDsKICAgIH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\batch\MultiThreadBatchRunner.java' -B $b
# src/main/java/commanderailab/bridge/WebApiBridge.java (7,523 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5icmlkZ2U7CgppbXBvcnQgY29tbWFuZGVyYWlsYWIuc2NoZW1hLkJhdGNoUmVzdWx0OwppbXBvcnQgY29tbWFuZGVyYWlsYWIuc2NoZW1hLkJhdGNoUmVzdWx0Lio7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuSnNvbkV4cG9ydGVyOwppbXBvcnQgY29tbWFuZGVyYWlsYWIuc3RhdHMuU3RhdHNBZ2dyZWdhdG9yOwppbXBvcnQgY29tbWFuZGVyYWlsYWIuYWkuQWlQb2xpY3k7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5haS5Gb3JnZUJ1aWx0aW5Qb2xpY3k7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5iYXRjaC5CYXRjaFJ1bm5lcjsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLmJhdGNoLk11bHRpVGhyZWFkQmF0Y2hSdW5uZXI7CgppbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CmltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CgppbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CmltcG9ydCBqYXZhLnV0aWwuKjsKCi8qKgogKiBXZWJBcGlCcmlkZ2Ug4oCUIEhUVFAvV2ViU29ja2V0IEFQSSBsYXllciBmb3IgdGhlIHdlYiBVSS4KICoKICogVGhpcyBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRoYXQgY2FuIGJlIGNhbGxlZCBmcm9tIGEgd2ViIHNlcnZlcgogKiAoZS5nLiwgSmF2YWxpbiwgU3ByaW5nLCBvciB0aGUgZXhpc3RpbmcgUHl0aG9uIEZhc3RBUEkgc2VydmVyKQogKiB0byB0cmlnZ2VyIGJhdGNoIHJ1bnMgYW5kIHJldHJpZXZlIHJlc3VsdHMuCiAqLwpwdWJsaWMgY2xhc3MgV2ViQXBpQnJpZGdlIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHc29uIEdTT04gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOwoKICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZvcmdlSmFyUGF0aDsKICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZvcmdlV29ya0RpcjsKICAgIHByaXZhdGUgdm9sYXRpbGUgQmF0Y2hSZXN1bHQgbGFzdFJlc3VsdDsKICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc1J1bm5pbmc7CiAgICBwcml2YXRlIHZvbGF0aWxlIGludCBwcm9ncmVzczsKICAgIHByaXZhdGUgdm9sYXRpbGUgZG91YmxlIGN1cnJlbnRTaW1zUGVyU2VjOwogICAgcHJpdmF0ZSBTdHJpbmcgcG9saWN5U2VydmVyVXJsID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCI7CgogICAgLy8gSXNzdWUgIzQvIzU6IFBlcmZvcm1hbmNlIHNldHRpbmdzCiAgICBwcml2YXRlIGJvb2xlYW4gYWlTaW1wbGlmaWVkID0gZmFsc2U7CiAgICBwcml2YXRlIGludCBhaVRoaW5rVGltZU1zID0gLTE7CiAgICBwcml2YXRlIGludCBtYXhRdWV1ZURlcHRoID0gLTE7CgogICAgcHVibGljIFdlYkFwaUJyaWRnZShTdHJpbmcgZm9yZ2VKYXJQYXRoLCBTdHJpbmcgZm9yZ2VXb3JrRGlyKSB7CiAgICAgICAgdGhpcy5mb3JnZUphclBhdGggPSBmb3JnZUphclBhdGg7CiAgICAgICAgdGhpcy5mb3JnZVdvcmtEaXIgPSBmb3JnZVdvcmtEaXI7CiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLnByb2dyZXNzID0gMDsKICAgICAgICB0aGlzLmN1cnJlbnRTaW1zUGVyU2VjID0gMC4wOwogICAgfQoKICAgIC8qKgogICAgICogQ29uZmlndXJlIEFJIG9wdGltaXphdGlvbiBzZXR0aW5ncyAoSXNzdWUgIzQpLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRBaU9wdGltaXphdGlvbihib29sZWFuIHNpbXBsaWZpZWQsIGludCB0aGlua1RpbWVNcykgewogICAgICAgIHRoaXMuYWlTaW1wbGlmaWVkID0gc2ltcGxpZmllZDsKICAgICAgICB0aGlzLmFpVGhpbmtUaW1lTXMgPSB0aGlua1RpbWVNczsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBtYXggY29uY3VycmVudCBGb3JnZSBwcm9jZXNzZXMgZm9yIGJhY2twcmVzc3VyZSAoSXNzdWUgIzUpLgogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXRNYXhRdWV1ZURlcHRoKGludCBtYXhEZXB0aCkgewogICAgICAgIHRoaXMubWF4UXVldWVEZXB0aCA9IG1heERlcHRoOwogICAgfQoKICAgIC8qKgogICAgICogU3RhcnQgYSBiYXRjaCBydW4gKGJhY2t3YXJkLWNvbXBhdGlibGUsIEZvcmdlIEFJIG9ubHkpLgogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIHN0YXJ0QmF0Y2hBc3luYyhTdHJpbmcgZGVjazEsIFN0cmluZyBkZWNrMiwgU3RyaW5nIGRlY2szLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1HYW1lcywgaW50IHRocmVhZHMsIExvbmcgc2VlZCkgewogICAgICAgIHJldHVybiBzdGFydEJhdGNo' +
'QXN5bmMoZGVjazEsIGRlY2syLCBkZWNrMywgbnVtR2FtZXMsIHRocmVhZHMsIHNlZWQsIGZhbHNlLCAibWlkcmFuZ2UiKTsKICAgIH0KCiAgICAvKioKICAgICAqIFN0YXJ0IGEgYmF0Y2ggd2l0aCBsZWFybmVkIHBvbGljeSBzdXBwb3J0LgogICAgICoKICAgICAqIEBwYXJhbSB1c2VMZWFybmVkUG9saWN5IElmIHRydWUsIGF0dGVtcHRzIHRvIHVzZSB0aGUgdHJhaW5lZCBuZXVyYWwgbmV0d29yayBwb2xpY3kKICAgICAqIEBwYXJhbSBwb2xpY3lTdHlsZSBQbGF5c3R5bGUgZm9yIHRoZSBsZWFybmVkIHBvbGljeSAoImFnZ3JvIiwgImNvbnRyb2wiLCAibWlkcmFuZ2UiLCAiY29tYm8iKQogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIHN0YXJ0QmF0Y2hBc3luYyhTdHJpbmcgZGVjazEsIFN0cmluZyBkZWNrMiwgU3RyaW5nIGRlY2szLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1HYW1lcywgaW50IHRocmVhZHMsIExvbmcgc2VlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUxlYXJuZWRQb2xpY3ksIFN0cmluZyBwb2xpY3lTdHlsZSkgewogICAgICAgIFN0cmluZyBiYXRjaElkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKCiAgICAgICAgVGhyZWFkIGJhdGNoVGhyZWFkID0gbmV3IFRocmVhZCgoKSAtPiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpc1J1bm5pbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSAwOwoKICAgICAgICAgICAgICAgIExpc3Q8RGVja0luZm8+IGRlY2tzID0gYnVpbGREZWNrcyhkZWNrMSwgZGVjazIsIGRlY2szKTsKICAgICAgICAgICAgICAgIEFpUG9saWN5IHBvbGljeTsKCiAgICAgICAgICAgICAgICBpZiAodXNlTGVhcm5lZFBvbGljeSkgewogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlcmFpbGFiLm1sLkxlYXJuZWRQb2xpY3kgbGVhcm5lZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBjb21tYW5kZXJhaWxhYi5tbC5MZWFybmVkUG9saWN5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5U2VydmVyVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5U3R5bGUgIT0gbnVsbCA/IHBvbGljeVN0eWxlIDogIm1pZHJhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAobGVhcm5lZC5jb25uZWN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gbGVhcm5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbTUxdIFVzaW5nIGxlYXJuZWQgcG9saWN5IGZvciBiYXRjaCAiICsgYmF0Y2hJZCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbTUxdIExlYXJuZWQgcG9saWN5IHVuYXZhaWxhYmxlLCB1c2luZyBGb3JnZSBBSSIpOwogICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kgPSBuZXcgRm9yZ2VCdWlsdGluUG9saWN5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwb2xpY3kgPSBuZXcgRm9yZ2VCdWlsdGluUG9saWN5KCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgICAgIExpc3Q8R2FtZVJlc3VsdD4gZ2FtZXM7CgogICAgICAgICAgICAgICAgaWYgKHRocmVhZHMgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgTXVsdGlUaHJlYWRCYXRjaFJ1bm5lciBydW5uZXIgPSBuZXcgTXVsdGlUaHJlYWRCYXRjaFJ1bm5lcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmdlSmFyUGF0aCwgZm9yZ2VXb3JrRGlyLCBkZWNrcywgcG9saWN5LCB0aHJlYWRzKTsKICAgICAgICAgICAgICAgICAgICBydW5uZXIuc2V0QWlPcHRpbWl6YXRpb24oYWlTaW1wbGlmaWVkLCBhaVRoaW5rVGltZU1zKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWF4UXVldWVEZXB0aCA+IDApIHJ1bm5lci5zZXRNYXhRdWV1ZURlcHRoKG1heFF1ZXVlRGVwdGgpOwogICAgICAgICAgICAgICAgICAgIC8vIElzc3VlICM1OiBQcm9ncmVzcyBjYWxsYmFjayBmb3IgcmVhbC10aW1lIHNpbXMvc2VjCiAgICAgICAgICAgICAgICAgICAgcnVu' +
'bmVyLnNldFByb2dyZXNzQ2FsbGJhY2soKGNvbXBsZXRlZCwgdG90YWwsIHBjdCwgc2ltc1BlclNlYywgbGFzdFJlc3VsdCkgLT4gewogICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IHBjdDsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNpbXNQZXJTZWMgPSBzaW1zUGVyU2VjOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGdhbWVzID0gcnVubmVyLnJ1bkJhdGNoKG51bUdhbWVzLCBzZWVkKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgQmF0Y2hSdW5uZXIgcnVubmVyID0gbmV3IEJhdGNoUnVubmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZ2VKYXJQYXRoLCBmb3JnZVdvcmtEaXIsIGRlY2tzLCBwb2xpY3kpOwogICAgICAgICAgICAgICAgICAgIHJ1bm5lci5zZXRBaU9wdGltaXphdGlvbihhaVNpbXBsaWZpZWQsIGFpVGhpbmtUaW1lTXMpOwogICAgICAgICAgICAgICAgICAgIC8vIElzc3VlICM1OiBQcm9ncmVzcyBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgIHJ1bm5lci5zZXRQcm9ncmVzc0NhbGxiYWNrKChjb21wbGV0ZWQsIHRvdGFsLCBwY3QsIHNpbXNQZXJTZWMsIGxhc3RSZXN1bHQpIC0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSBwY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTaW1zUGVyU2VjID0gc2ltc1BlclNlYzsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBnYW1lcyA9IHJ1bm5lci5ydW5CYXRjaFNpbmdsZVRocmVhZChudW1HYW1lcywgc2VlZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7CiAgICAgICAgICAgICAgICBTdW1tYXJ5IHN1bW1hcnkgPSBTdGF0c0FnZ3JlZ2F0b3IuY29tcHV0ZVN1bW1hcnkoZ2FtZXMsIGRlY2tzLCBlbGFwc2VkKTsKCiAgICAgICAgICAgICAgICBCYXRjaFJlc3VsdCByZXN1bHQgPSBuZXcgQmF0Y2hSZXN1bHQoKTsKICAgICAgICAgICAgICAgIHJlc3VsdC5tZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOwogICAgICAgICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLmJhdGNoSWQgPSBiYXRjaElkOwogICAgICAgICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLnRpbWVzdGFtcCA9IEluc3RhbnQubm93KCkudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIHJlc3VsdC5tZXRhZGF0YS50b3RhbEdhbWVzID0gbnVtR2FtZXM7CiAgICAgICAgICAgICAgICByZXN1bHQubWV0YWRhdGEuY29tcGxldGVkR2FtZXMgPSBnYW1lcy5zaXplKCk7CiAgICAgICAgICAgICAgICByZXN1bHQubWV0YWRhdGEuZW5naW5lVmVyc2lvbiA9ICJmb3JnZS0yLjAuMTItU05BUFNIT1QiOwogICAgICAgICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLm1hc3RlclNlZWQgPSBzZWVkOwogICAgICAgICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLnRocmVhZHMgPSB0aHJlYWRzOwogICAgICAgICAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLmVsYXBzZWRNcyA9IGVsYXBzZWQ7CiAgICAgICAgICAgICAgICByZXN1bHQuZGVja3MgPSBkZWNrczsKICAgICAgICAgICAgICAgIHJlc3VsdC5nYW1lcyA9IGdhbWVzOwogICAgICAgICAgICAgICAgcmVzdWx0LnN1bW1hcnkgPSBzdW1tYXJ5OwoKICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgICAgICBwcm9ncmVzcyA9IDEwMDsKCiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkJhdGNoIHJ1biBmYWlsZWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgaXNSdW5uaW5nID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9LCAiYmF0Y2gtcnVubmVyLSIgKyBiYXRjaElkKTsKCiAgICAgICAgYmF0Y2hUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwogICAgICAgIGJhdGNoVGhyZWFkLnN0YXJ0KCk7CgogICAgICAgIHJldHVybiBiYXRjaElkOwogICAgfQoKICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3MoKSB7IHJldHVybiBwcm9ncmVzczsgfQogICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgeyByZXR1cm4gaXNSdW5uaW5nOyB9CiAgICBwdWJsaWMgZG91' +
'YmxlIGdldEN1cnJlbnRTaW1zUGVyU2VjKCkgeyByZXR1cm4gY3VycmVudFNpbXNQZXJTZWM7IH0KCiAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RSZXN1bHRKc29uKCkgewogICAgICAgIGlmIChsYXN0UmVzdWx0ID09IG51bGwpIHJldHVybiAie30iOwogICAgICAgIHJldHVybiBKc29uRXhwb3J0ZXIudG9Kc29uKGxhc3RSZXN1bHQpOwogICAgfQoKICAgIHB1YmxpYyBCYXRjaFJlc3VsdCBnZXRMYXN0UmVzdWx0KCkgeyByZXR1cm4gbGFzdFJlc3VsdDsgfQoKICAgIHByaXZhdGUgTGlzdDxEZWNrSW5mbz4gYnVpbGREZWNrcyhTdHJpbmcuLi4gZGVja05hbWVzKSB7CiAgICAgICAgTGlzdDxEZWNrSW5mbz4gZGVja3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY2tOYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBEZWNrSW5mbyBkID0gbmV3IERlY2tJbmZvKCk7CiAgICAgICAgICAgIGQuc2VhdEluZGV4ID0gaTsKICAgICAgICAgICAgZC5kZWNrRmlsZSA9IGRlY2tOYW1lc1tpXTsKICAgICAgICAgICAgZC5kZWNrTmFtZSA9IGRlY2tOYW1lc1tpXS5yZXBsYWNlKCIuZGNrIiwgIiIpOwogICAgICAgICAgICBkLmNvbW1hbmRlck5hbWUgPSBkLmRlY2tOYW1lOwogICAgICAgICAgICBkLmNvbG9ySWRlbnRpdHkgPSBMaXN0Lm9mKCk7CiAgICAgICAgICAgIGQuY2FyZENvdW50ID0gMTAwOwogICAgICAgICAgICBkZWNrcy5hZGQoZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWNrczsKICAgIH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\bridge\WebApiBridge.java' -B $b
# src/main/java/commanderailab/cli/LabCli.java (31,202 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5jbGk7CgppbXBvcnQgY29tbWFuZGVyYWlsYWIuYWkuKjsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLmFuYWx5dGljcy5EZWNrQW5hbHl6ZXI7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5hbmFseXRpY3MuRGVja0FuYWx5emVyLkRlY2tBbmFseXNpczsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLmJhdGNoLio7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5kYi5MYWJEYXRhYmFzZTsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLm1ldGEuKjsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLm1ldGEuRGVja1Byb2ZpbGUuRGVja1NvdXJjZTsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS4qOwppbXBvcnQgY29tbWFuZGVyYWlsYWIuc2NoZW1hLkJhdGNoUmVzdWx0Lio7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zdGF0cy5TdGF0c0FnZ3JlZ2F0b3I7CmltcG9ydCBwaWNvY2xpLkNvbW1hbmRMaW5lOwppbXBvcnQgcGljb2NsaS5Db21tYW5kTGluZS5Db21tYW5kOwppbXBvcnQgcGljb2NsaS5Db21tYW5kTGluZS5PcHRpb247CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5uaW8uZmlsZS4qOwppbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwoKLyoqCiAqIExhYkNsaSDigJQgQ29tbWFuZC1saW5lIGVudHJ5IHBvaW50IGZvciBDb21tYW5kZXIgQUkgTGFiIHYzLgogKgogKiB2MyBhZGRzOgogKiAgIC0taW1wb3J0LXVybCAgICAgSW1wb3J0IGRlY2sgZnJvbSBVUkwgKEFyY2hpZGVrdCwgRURIUkVDKQogKiAgIC0taW1wb3J0LXRleHQgICAgSW1wb3J0IGRlY2sgZnJvbSB0ZXh0IGZpbGUgKGNhcmQgbGlzdCkKICogICAtLWNvbW1hbmRlci1tZXRhIFVzZSBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciBhIGNvbW1hbmRlciBuYW1lCiAqICAgLS1tZXRhLWZpbGUgICAgICBDdXN0b20gY29tbWFuZGVy4oaSbWV0YSBtYXBwaW5nIEpTT04KICogICAtLWltcG9ydC10byAgICAgIERpcmVjdG9yeSB0byBzYXZlIGltcG9ydGVkIC5kY2sgZmlsZXMKICovCkBDb21tYW5kKAogICAgbmFtZSA9ICJjb21tYW5kZXItYWktbGFiIiwKICAgIG1peGluU3RhbmRhcmRIZWxwT3B0aW9ucyA9IHRydWUsCiAgICB2ZXJzaW9uID0gIkNvbW1hbmRlciBBSSBMYWIgdjMuMC4wIiwKICAgIGRlc2NyaXB0aW9uID0gIkhlYWRsZXNzIGJhdGNoIHNpbXVsYXRpb24gZm9yIDMtQUkgTVRHIENvbW1hbmRlciBwb2RzIHdpdGggZGVjayBpbXBvcnQgJiBtZXRhIGxvb2t1cC4iCikKcHVibGljIGNsYXNzIExhYkNsaSBpbXBsZW1lbnRzIENhbGxhYmxlPEludGVnZXI+IHsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWZvcmdlLWphciIsICItRiJ9LCByZXF1aXJlZCA9IHRydWUsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlBhdGggdG8gRm9yZ2UgZGVza3RvcCBKQVIgKGZvcmdlLWd1aS1kZXNrdG9wLVhYWC1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyKSIpCiAgICBwcml2YXRlIFN0cmluZyBmb3JnZUphclBhdGg7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1mb3JnZS1kaXIiLCAiLVcifSwgcmVxdWlyZWQgPSB0cnVlLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJXb3JraW5nIGRpcmVjdG9yeSBmb3IgRm9yZ2UgKGZvbGRlciBjb250YWluaW5nIHJlcy8g4oCUIHVzdWFsbHkgZm9yZ2UtZ3VpLykiKQogICAgcHJpdmF0ZSBTdHJpbmcgZm9yZ2VXb3JrRGlyOwoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tZGVjazEiLCAiLWQxIn0sIGRlZmF1bHRWYWx1ZSA9ICIiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJDb21tYW5kZXIgZGVjayBuYW1lIGZvciBzZWF0IDAgKGFzIGl0IGFwcGVhcnMgaW4gRm9yZ2UncyBkZWNrIGxpc3QpIikKICAgIHByaXZhdGUgU3RyaW5nIGRlY2sxOwoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tZGVjazIiLCAiLWQyIn0sIGRlZmF1bHRWYWx1ZSA9ICIiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJDb21tYW5kZXIgZGVjayBuYW1lIGZvciBzZWF0IDEiKQogICAgcHJpdmF0ZSBTdHJpbmcgZGVjazI7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1kZWNrMyIsICItZDMifSwgZGVmYXVsdFZhbHVlID0gIiIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkNvbW1hbmRlciBkZWNrIG5hbWUgZm9yIHNlYXQgMiIpCiAgICBwcml2YXRlIFN0cmluZyBkZWNrMzsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWNvbW1hbmRlcjEiLCAi' +
'LWMxIn0sIGRlZmF1bHRWYWx1ZSA9ICIiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJDb21tYW5kZXIgY2FyZCBuYW1lIGZvciBzZWF0IDAgKGZvciBkaXNwbGF5OyB1c2VzIGRlY2sgbmFtZSBpZiBibGFuaykiKQogICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZGVyMTsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWNvbW1hbmRlcjIiLCAiLWMyIn0sIGRlZmF1bHRWYWx1ZSA9ICIiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJDb21tYW5kZXIgY2FyZCBuYW1lIGZvciBzZWF0IDEiKQogICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZGVyMjsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWNvbW1hbmRlcjMiLCAiLWMzIn0sIGRlZmF1bHRWYWx1ZSA9ICIiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJDb21tYW5kZXIgY2FyZCBuYW1lIGZvciBzZWF0IDIiKQogICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZGVyMzsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWdhbWVzIiwgIi1uIn0sIGRlZmF1bHRWYWx1ZSA9ICIxMCIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk51bWJlciBvZiBnYW1lcyB0byBzaW11bGF0ZSAoZGVmYXVsdDogMTApIikKICAgIHByaXZhdGUgaW50IG51bUdhbWVzOwoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tdGhyZWFkcyIsICItdCJ9LCBkZWZhdWx0VmFsdWUgPSAiMSIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk51bWJlciBvZiBwYXJhbGxlbCB0aHJlYWRzIChkZWZhdWx0OiAxLCAwIG9yIC0xIGZvciBhdXRvLWRldGVjdCBiYXNlZCBvbiBDUFUgY29yZXMpIikKICAgIHByaXZhdGUgaW50IHRocmVhZHM7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1zZWVkIiwgIi1zIn0sIGRlZmF1bHRWYWx1ZSA9ICIiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJNYXN0ZXIgUk5HIHNlZWQgZm9yIHJlcHJvZHVjaWJpbGl0eSAoYmxhbmsgZm9yIHJhbmRvbSkiKQogICAgcHJpdmF0ZSBTdHJpbmcgc2VlZDsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLW91dHB1dCIsICItbyJ9LCBkZWZhdWx0VmFsdWUgPSAicmVzdWx0cy9iYXRjaC1sYXRlc3QuanNvbiIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk91dHB1dCBKU09OIGZpbGUgcGF0aCIpCiAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoOwoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tY2xvY2siLCAiLWMifSwgZGVmYXVsdFZhbHVlID0gIjEyMCIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk1heCBzZWNvbmRzIHBlciBnYW1lIGJlZm9yZSBkcmF3IChkZWZhdWx0OiAxMjApIikKICAgIHByaXZhdGUgaW50IGNsb2NrU2Vjb25kczsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLXZlcmJvc2UiLCAiLXYifSwgZGVmYXVsdFZhbHVlID0gImZhbHNlIiwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiU2hvdyBmdWxsIEZvcmdlIG91dHB1dCAobm90IGp1c3QgcGFyc2VkIHJlc3VsdHMpIikKICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJib3NlOwoKICAgIC8vIOKUgOKUgCB2MiBPcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tcHJvZmlsZSIsICItcCJ9LCBkZWZhdWx0VmFsdWUgPSAiZGVmYXVsdCIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkFJIGJlaGF2aW9yIHByb2ZpbGU6IGRlZmF1bHQsIGFnZ3JvLCBjb250cm9sLCBjb21ibywgbWlkcmFuZ2UiKQogICAgcHJpdmF0ZSBTdHJpbmcgcHJvZmlsZU5hbWU7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1hbmFseXplIn0sIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlJ1biBkZWNrIGFuYWx5c2lzIGJlZm9yZSBiYXRjaCAoc2hvd3MgbWFuYSBjdXJ2ZSwgcm9sZXMsIGhlYWx0aCBjaGVja3MpIikKICAgIHByaXZhdGUgYm9vbGVhbiBhbmFseXplRGVjazsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWRiIn0sIGRlZmF1bHRWYWx1ZSA9ICJsYWIuZGIiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJTUUxpdGUgZGF0YWJhc2UgZmlsZSBmb3IgcmVzdWx0IHBlcnNpc3RlbmNlIChkZWZhdWx0OiBsYWIuZGIpIikKICAgIHByaXZhdGUgU3RyaW5nIGRiUGF0aDsKCiAgICBAT3B0aW9uKG5hbWVzID0geyIt' +
'LW5vLWRiIn0sIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkRpc2FibGUgU1FMaXRlIHBlcnNpc3RlbmNlIChyZXN1bHRzIG9ubHkgc2F2ZWQgdG8gSlNPTiBmaWxlKSIpCiAgICBwcml2YXRlIGJvb2xlYW4gbm9EYjsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWRlY2tzLWRpciJ9LCBkZWZhdWx0VmFsdWUgPSAiIiwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiUGF0aCB0byBDb21tYW5kZXIgZGVja3MgZm9sZGVyIChmb3IgLS1hbmFseXplLCBkZWZhdWx0OiAlJUFQUERBVEElJS9Gb3JnZS9kZWNrcy9jb21tYW5kZXIpIikKICAgIHByaXZhdGUgU3RyaW5nIGRlY2tzRGlyOwoKICAgIC8vIOKUgOKUgCB2MyBPcHRpb25zIOKAlCBEZWNrIEltcG9ydCAmIE1ldGEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1pbXBvcnQtdXJsIn0sCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkltcG9ydCBkZWNrIGZyb20gVVJMIChBcmNoaWRla3QsIEVESFJFQykuIENhbiBzcGVjaWZ5IDEtMyB0aW1lcyBmb3IgZWFjaCBzZWF0LiIpCiAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBpbXBvcnRVcmxzOwoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0taW1wb3J0LXRleHQifSwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiSW1wb3J0IGRlY2sgZnJvbSB0ZXh0IGZpbGUgKGNhcmQgbGlzdCkuIENhbiBzcGVjaWZ5IDEtMyB0aW1lcyBmb3IgZWFjaCBzZWF0LiIpCiAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBpbXBvcnRUZXh0RmlsZXM7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1jb21tYW5kZXItbWV0YSJ9LAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIGJ5IGNvbW1hbmRlciBuYW1lLiBDYW4gc3BlY2lmeSAxLTMgdGltZXMgZm9yIGVhY2ggc2VhdC4iKQogICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29tbWFuZGVyTWV0YTsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLW1ldGEtZmlsZSJ9LCBkZWZhdWx0VmFsdWUgPSAiY29tbWFuZGVyLW1ldGEuanNvbiIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlBhdGggdG8gY29tbWFuZGVy4oaSbWV0YSBkZWNrIG1hcHBpbmcgSlNPTiAoZGVmYXVsdDogY29tbWFuZGVyLW1ldGEuanNvbikiKQogICAgcHJpdmF0ZSBTdHJpbmcgbWV0YUZpbGU7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1pbXBvcnQtdG8ifSwgZGVmYXVsdFZhbHVlID0gIiIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkRpcmVjdG9yeSB0byBzYXZlIGltcG9ydGVkIC5kY2sgZmlsZXMgKGRlZmF1bHQ6IEZvcmdlIGRlY2tzL2NvbW1hbmRlciBkaXIpIikKICAgIHByaXZhdGUgU3RyaW5nIGltcG9ydFRvOwoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tbGlzdC1tZXRhIn0sIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkxpc3QgYXZhaWxhYmxlIGNvbW1hbmRlcnMgaW4gdGhlIG1ldGEgbWFwcGluZyBhbmQgZXhpdCIpCiAgICBwcml2YXRlIGJvb2xlYW4gbGlzdE1ldGE7CgogICAgLy8g4pSA4pSAIHY0IE9wdGlvbnMg4oCUIE1MIERlY2lzaW9uIExvZ2dpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1tbC1sb2cifSwgZGVmYXVsdFZhbHVlID0gImZhbHNlIiwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiRW5hYmxlIE1MIGRlY2lzaW9uIGxvZ2dpbmc6IGV4dHJhY3Qgc3RhdGUrYWN0aW9uIHNuYXBzaG90cyBmb3IgUkwgdHJhaW5pbmciKQogICAgcHJpdmF0ZSBib29sZWFuIG1sTG9nOwoKICAgIC8vIOKUgOKUgCB2NSBPcHRpb25zIOKAlCBMZWFybmVkIFBvbGljeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWxlYXJuZWQtcG9saWN5In0sIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlVzZSB0cmFpbmVkIG5ldXJhbCBuZXR3b3JrIHBvbGljeSAocmVxdWlyZXMgcnVubmluZyBsYWIgQVBJIHNlcnZlciB3aXRoIG1vZGVsIGxvYWRlZCki' +
'KQogICAgcHJpdmF0ZSBib29sZWFuIHVzZUxlYXJuZWRQb2xpY3k7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1wb2xpY3ktc2VydmVyIn0sIGRlZmF1bHRWYWx1ZSA9ICJodHRwOi8vbG9jYWxob3N0OjgwODAiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJQb2xpY3kgc2VydmVyIFVSTCAoZGVmYXVsdDogaHR0cDovL2xvY2FsaG9zdDo4MDgwKSIpCiAgICBwcml2YXRlIFN0cmluZyBwb2xpY3lTZXJ2ZXJVcmw7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1wb2xpY3ktc3R5bGUifSwgZGVmYXVsdFZhbHVlID0gIm1pZHJhbmdlIiwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiUGxheXN0eWxlIGhpbnQgZm9yIGxlYXJuZWQgcG9saWN5OiBhZ2dybywgY29udHJvbCwgbWlkcmFuZ2UsIGNvbWJvIikKICAgIHByaXZhdGUgU3RyaW5nIHBvbGljeVN0eWxlOwoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tcG9saWN5LWdyZWVkeSJ9LCBkZWZhdWx0VmFsdWUgPSAidHJ1ZSIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlVzZSBncmVlZHkgKGFyZ21heCkgYWN0aW9uIHNlbGVjdGlvbiBmb3IgbGVhcm5lZCBwb2xpY3kgKGRlZmF1bHQ6IHRydWUpIikKICAgIHByaXZhdGUgYm9vbGVhbiBwb2xpY3lHcmVlZHk7CgogICAgLy8g4pSA4pSAIHY2IE9wdGlvbnMg4oCUIFBlcmZvcm1hbmNlIChJc3N1ZXMgIzMtIzUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIEBPcHRpb24obmFtZXMgPSB7Ii0tYWktc2ltcGxpZmllZCJ9LCBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiLAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJVc2Ugc2ltcGxpZmllZC9mYXN0ZXIgQUkgcHJvZmlsZSBmb3Igc2ltdWxhdGlvbnMgKGxlc3MgbG9va2FoZWFkLCBmYXN0ZXIgZ2FtZXMpIikKICAgIHByaXZhdGUgYm9vbGVhbiBhaVNpbXBsaWZpZWQ7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1haS10aGluay10aW1lIn0sIGRlZmF1bHRWYWx1ZSA9ICItMSIsCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIkNhcCBBSSB0aGluayB0aW1lIGluIG1zIHBlciBkZWNpc2lvbiAoLTEgZm9yIHVubGltaXRlZCwgNTAwLTIwMDAgcmVjb21tZW5kZWQpIikKICAgIHByaXZhdGUgaW50IGFpVGhpbmtUaW1lTXM7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1tYXgtcXVldWUifSwgZGVmYXVsdFZhbHVlID0gIi0xIiwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiTWF4IGNvbmN1cnJlbnQgRm9yZ2Ugc3VicHJvY2Vzc2VzIGZvciBiYWNrcHJlc3N1cmUgKC0xIGZvciB1bmxpbWl0ZWQpIikKICAgIHByaXZhdGUgaW50IG1heFF1ZXVlRGVwdGg7CgogICAgQE9wdGlvbihuYW1lcyA9IHsiLS1iZW5jaG1hcmsifSwgZGVmYXVsdFZhbHVlID0gImZhbHNlIiwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiUnVuIGEgc2luZ2xlLWdhbWUgYmVuY2htYXJrIGJlZm9yZSB0aGUgYmF0Y2ggYW5kIHJlcG9ydCB0aHJvdWdocHV0IG1ldHJpY3MiKQogICAgcHJpdmF0ZSBib29sZWFuIGJlbmNobWFyazsKCiAgICBAT3B0aW9uKG5hbWVzID0geyItLWphdmExNyJ9LCBkZWZhdWx0VmFsdWUgPSAiIiwKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiUGF0aCB0byBKYXZhIDE3IGV4ZWN1dGFibGUgZm9yIHJ1bm5pbmcgRm9yZ2UgKEZvcmdlIHJlcXVpcmVzIEphdmEgMTcsIG5vdCAyNSspIikKICAgIHByaXZhdGUgU3RyaW5nIGphdmExN1BhdGg7CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgSW50ZWdlciBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZciKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVkSAgICAgICAgIENvbW1hbmRlciBBSSBMYWIgIHYzLjAuMCAgICAgICAgICAgICAgICDilZEiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVkSAgICAzLUFJIEhlYWRsZXNzIEJhdGNoIFNpbSArIERlY2sgSW1wb3J0L01ldGEgICDilZEiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnSIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwoKICAgICAgICAvLyBMb2FkIG1ldGEgbWFwcGluZwogICAgICAgIENvbW1hbmRlck1ldGFTZXJ2aWNlLmxvYWRNYXBwaW5nKG1ldGFGaWxlKTsKCiAgICAgICAgLy8gSGFuZGxlIC0tbGlzdC1tZXRhCiAgICAgICAgaWYgKGxpc3RNZXRhKSB7CiAgICAgICAgICAgIHByaW50TWV0YUxpc3QoKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICAvLyBWYWxpZGF0ZSBGb3JnZSBwYXRocwogICAgICAgIGlmICghbmV3IEZpbGUoZm9yZ2VKYXJQYXRoKS5leGlzdHMoKSkgewogICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SOiBGb3JnZSBKQVIgbm90IGZvdW5kOiAiICsgZm9yZ2VKYXJQYXRoKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGlmICghbmV3IEZpbGUoZm9yZ2VXb3JrRGlyKS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVJST1I6IEZvcmdlIHdvcmsgZGlyZWN0b3J5IG5vdCBmb3VuZDogIiArIGZvcmdlV29ya0Rpcik7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVzb2x2ZSBpbXBvcnQtdG8gZGlyZWN0b3J5CiAgICAgICAgU3RyaW5nIGltcG9ydERpciA9IHJlc29sdmVJbXBvcnREaXIoKTsKCiAgICAgICAgLy8gQnVpbGQgZGVjayBpbmZvICh3aXRoIHBvc3NpYmxlIGltcG9ydHMpCiAgICAgICAgTGlzdDxEZWNrSW5mbz4gZGVja3MgPSBidWlsZERlY2tJbmZvTGlzdChpbXBvcnREaXIpOwogICAgICAgIGlmIChkZWNrcyA9PSBudWxsKSByZXR1cm4gMTsgLy8gRXJyb3IgYWxyZWFkeSBwcmludGVkCgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJQb2Q6ICAgICAgICVzICB2cyAgJXMgIHZzICAlcyVuIiwKICAgICAgICAgICAgICAgIGRlY2tzLmdldCgwKS5kZWNrTmFtZSwgZGVja3MuZ2V0KDEpLmRlY2tOYW1lLCBkZWNrcy5nZXQoMikuZGVja05hbWUpOwogICAgICAgIGZvciAoRGVja0luZm8gZCA6IGRlY2tzKSB7CiAgICAgICAgICAgIGlmIChkLnNvdXJjZSAhPSBudWxsICYmICFkLnNvdXJjZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFNlYXQgJWQ6ICAlcyDihpIgJXMgKCVzKSVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZC5zZWF0SW5kZXgsIGQuY29tbWFuZGVyTmFtZSwgZC5zb3VyY2UsIGQuc291cmNlVXJsICE9IG51bGwgPyBkLnNvdXJjZVVybCA6ICIiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiR2FtZXM6ICAgICAlZCVuIiwgbnVtR2FtZXMpOwogICAgICAgIC8vIElzc3VlICM1OiBBdXRvLWRldGVjdCB0aHJlYWQgY291bnQKICAgICAgICBpbnQgZWZmZWN0aXZlVGhyZWFkcyA9IHRocmVhZHM7CiAgICAgICAgaWYgKHRocmVhZHMgPD0gMCkgewogICAgICAgICAgICBlZmZlY3RpdmVUaHJlYWRzID0gTXVsdGlUaHJlYWRCYXRjaFJ1bm5lci5kZXRlY3RPcHRpbWFsVGhyZWFkcygpOwogICAgICAgIH0KICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiVGhyZWFkczogICAlZCVzJW4iLCBlZmZlY3RpdmVUaHJlYWRzLAogICAgICAgICAgICAgICAgdGhyZWFkcyA8PSAwID8gIiAoYXV0by1kZXRlY3RlZCkiIDogIiIpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJDbG9jazogICAgICVkcyBwZXIgZ2FtZSVuIiwgY2xvY2tTZWNvbmRzKTsKCiAgICAgICAgTG9uZyBtYXN0ZXJTZWVkID0gc2VlZC5pc0VtcHR5KCkgPyBudWxsIDogTG9uZy5wYXJzZUxvbmcoc2VlZCk7CiAgICAgICAgaWYgKG1hc3RlclNlZWQgIT0gbnVsbCkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiU2VlZDogICAgICAlZCVuIiwgbWFzdGVyU2VlZCk7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwoKICAgICAgICAvLyBDaG9vc2UgQUkgcG9saWN5IGFuZCBwcm9maWxlCiAgICAgICAgQWlQcm9maWxlIHByb2ZpbGUgPSBBaVByb2ZpbGUuYnlOYW1lKHByb2ZpbGVOYW1lKTsKICAgICAgICBBaVBvbGljeSBwb2xpY3k7CgogICAgICAgIGlmICh1c2VMZWFybmVkUG9saWN5KSB7CiAgICAgICAgICAgIGNvbW1hbmRlcmFpbGFiLm1sLkxlYXJuZWRQb2xpY3kgbGVh' +
'cm5lZCA9CiAgICAgICAgICAgICAgICBuZXcgY29tbWFuZGVyYWlsYWIubWwuTGVhcm5lZFBvbGljeShwb2xpY3lTZXJ2ZXJVcmwsIHBvbGljeVN0eWxlLCBwb2xpY3lHcmVlZHkpOwogICAgICAgICAgICBpZiAobGVhcm5lZC5jb25uZWN0KCkpIHsKICAgICAgICAgICAgICAgIHBvbGljeSA9IGxlYXJuZWQ7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiQUkgUG9saWN5OiBsZWFybmVkLXBvbGljeSAoc2VydmVyPSVzLCBzdHlsZT0lcywgZ3JlZWR5PSVzKSVuIiwKICAgICAgICAgICAgICAgICAgICBwb2xpY3lTZXJ2ZXJVcmwsIHBvbGljeVN0eWxlLCBwb2xpY3lHcmVlZHkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbTUxdIExlYXJuZWQgcG9saWN5IHVuYXZhaWxhYmxlIOKAlCBmYWxsaW5nIGJhY2sgdG8gRm9yZ2UgYnVpbHQtaW4gQUkiKTsKICAgICAgICAgICAgICAgIHBvbGljeSA9IG5ldyBGb3JnZUJ1aWx0aW5Qb2xpY3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBvbGljeSA9IG5ldyBGb3JnZUJ1aWx0aW5Qb2xpY3koKTsKICAgICAgICB9CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJBSSBQb2xpY3k6ICVzJW4iLCBwb2xpY3kuZ2V0TmFtZSgpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiQUkgUHJvZmlsZTogJXMg4oCUICVzJW4iLCBwcm9maWxlLmdldE5hbWUoKSwgcHJvZmlsZS5nZXREZXNjcmlwdGlvbigpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiRW5naW5lOiAgICBGb3JnZSBzaW0gKGhlYWRsZXNzKSVuIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CgogICAgICAgIC8vIHYyOiBEZWNrIGFuYWx5c2lzIChpZiByZXF1ZXN0ZWQpCiAgICAgICAgaWYgKGFuYWx5emVEZWNrKSB7CiAgICAgICAgICAgIFN0cmluZyByZXNvbHZlZERlY2tzRGlyID0gZGVja3NEaXIuaXNFbXB0eSgpID8gcmVzb2x2ZUZvcmdlRGVja3NEaXIoKSA6IGRlY2tzRGlyOwogICAgICAgICAgICBpZiAocmVzb2x2ZWREZWNrc0RpciAhPSBudWxsICYmICFyZXNvbHZlZERlY2tzRGlyLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLilZDilZDilZAgREVDSyBBTkFMWVNJUyDilZDilZDilZAiKTsKICAgICAgICAgICAgICAgIGZvciAoRGVja0luZm8gZGVjayA6IGRlY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgRGVja0FuYWx5c2lzIGFuYWx5c2lzID0gRGVja0FuYWx5emVyLmFuYWx5emVGcm9tRm9yZ2UocmVzb2x2ZWREZWNrc0RpciwgZGVjay5kZWNrTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIERlY2tBbmFseXplci5wcmludFN1bW1hcnkoYW5hbHlzaXMpOwogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBbV0FSTl0gQ291bGQgbm90IGFuYWx5emUgJXM6ICVzJW4iLCBkZWNrLmRlY2tOYW1lLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFtXQVJOXSAtLWRlY2tzLWRpciBub3Qgc2V0IGFuZCBhdXRvLWRldGVjdCBmYWlsZWQuIFNraXBwaW5nIGRlY2sgYW5hbHlzaXMuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFJ1biBzaW11bGF0aW9ucwogICAgICAgIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBnYW1lczsKCiAgICAgICAgLy8gQWx3YXlzIHJ1biB2ZXJib3NlIChxdWlldD1mYWxzZSkgdG8gY2FwdHVyZSBjb21iYXQgc3RhdHMgZnJvbSBGb3JnZSBnYW1lIGxvZy4KICAgICAgICAvLyBUaGUgLS12ZXJib3NlIGZsYWcgbm93IGNvbnRyb2xzIHdoZXRoZXIgZnVsbCBvdXRwdXQgaXMgZWNob2VkIHRvIGNvbnNvbGUsCiAgICAgICAgLy8gYnV0IHRoZSBwYXJzZXIgYWx3YXlzIGdldHMgdGhlIGZ1bGwgbG9nIGZvciBzdGF0IGV4dHJhY3Rpb24uCiAgICAgICAgYm9vbGVhbiBxdWlldE1vZGUgPSBmYWxzZTsgIC8vIE5ldmVyIHF1aWV0IOKAlCB3ZSBuZWVk' +
'IHZlcmJvc2Ugb3V0cHV0IGZvciBjb21iYXQgc3RhdHMKCiAgICAgICAgLy8gUmVzb2x2ZSBKYXZhIDE3IHBhdGggZm9yIEZvcmdlIHN1YnByb2Nlc3MKICAgICAgICBTdHJpbmcgcmVzb2x2ZWRKYXZhID0gcmVzb2x2ZUphdmExN1BhdGgoKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiSmF2YTogICAgICAlcyVuIiwgcmVzb2x2ZWRKYXZhKTsKCiAgICAgICAgLy8gSXNzdWUgIzQ6IFByaW50IEFJIG9wdGltaXphdGlvbiBzZXR0aW5ncwogICAgICAgIGlmIChhaVNpbXBsaWZpZWQgfHwgYWlUaGlua1RpbWVNcyA+IDApIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIkFJIE9wdHM6ICAgc2ltcGxpZmllZD0lcywgdGhpbmtUaW1lPSVzJW4iLAogICAgICAgICAgICAgICAgICAgIGFpU2ltcGxpZmllZCwgYWlUaGlua1RpbWVNcyA+IDAgPyBhaVRoaW5rVGltZU1zICsgIm1zIiA6ICJ1bmxpbWl0ZWQiKTsKICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CgogICAgICAgIC8vIElzc3VlICM0OiBTaW5nbGUtZ2FtZSBiZW5jaG1hcmsgaWYgcmVxdWVzdGVkCiAgICAgICAgaWYgKGJlbmNobWFyaykgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVkOKVkOKVkCBCRU5DSE1BUksgKHNpbmdsZSBnYW1lKSDilZDilZDilZAiKTsKICAgICAgICAgICAgQmF0Y2hSdW5uZXIgYmVuY2hSdW5uZXIgPSBuZXcgQmF0Y2hSdW5uZXIoCiAgICAgICAgICAgICAgICAgICAgZm9yZ2VKYXJQYXRoLCBmb3JnZVdvcmtEaXIsIGRlY2tzLCBwb2xpY3ksIHF1aWV0TW9kZSwgY2xvY2tTZWNvbmRzLCByZXNvbHZlZEphdmEpOwogICAgICAgICAgICBiZW5jaFJ1bm5lci5zZXRBaU9wdGltaXphdGlvbihhaVNpbXBsaWZpZWQsIGFpVGhpbmtUaW1lTXMpOwogICAgICAgICAgICBsb25nIGJlbmNoU3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBiZW5jaEdhbWVzID0gYmVuY2hSdW5uZXIucnVuQmF0Y2hTaW5nbGVUaHJlYWQoMSwgNDJMKTsKICAgICAgICAgICAgbG9uZyBiZW5jaEVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlbmNoU3RhcnQ7CiAgICAgICAgICAgIGlmICghYmVuY2hHYW1lcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIEdhbWVSZXN1bHQgYmcgPSBiZW5jaEdhbWVzLmdldCgwKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFdhbGwgdGltZTogICAgJWRtcyVuIiwgYmVuY2hFbGFwc2VkKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIEZvcmdlIHRpbWU6ICAgJWRtcyVuIiwgYmcuZWxhcHNlZE1zKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIEpWTSBvdmVyaGVhZDogfiVkbXMlbiIsIGJlbmNoRWxhcHNlZCAtIGJnLmVsYXBzZWRNcyk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBUdXJuczogICAgICAgICVkJW4iLCBiZy50b3RhbFR1cm5zKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFRocm91Z2hwdXQ6ICAgJS40ZiBzaW1zL3NlYyVuIiwgMTAwMC4wIC8gYmVuY2hFbGFwc2VkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICB9CgogICAgICAgIGlmIChlZmZlY3RpdmVUaHJlYWRzID4gMSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiUnVubmluZyAlZCBnYW1lcyBhY3Jvc3MgJWQgdGhyZWFkcy4uLiVuJW4iLCBudW1HYW1lcywgZWZmZWN0aXZlVGhyZWFkcyk7CiAgICAgICAgICAgIE11bHRpVGhyZWFkQmF0Y2hSdW5uZXIgbXRSdW5uZXIgPSBuZXcgTXVsdGlUaHJlYWRCYXRjaFJ1bm5lcigKICAgICAgICAgICAgICAgICAgICBmb3JnZUphclBhdGgsIGZvcmdlV29ya0RpciwgZGVja3MsIHBvbGljeSwgZWZmZWN0aXZlVGhyZWFkcywgcXVpZXRNb2RlLCBjbG9ja1NlY29uZHMsIHJlc29sdmVkSmF2YSk7CiAgICAgICAgICAgIG10UnVubmVyLnNldEFpT3B0aW1pemF0aW9uKGFpU2ltcGxpZmllZCwgYWlUaGlua1RpbWVNcyk7CiAgICAgICAgICAgIGlmIChtYXhRdWV1ZURlcHRoID4gMCkgewogICAgICAgICAgICAgICAgbXRSdW5uZXIuc2V0TWF4UXVldWVEZXB0aChtYXhRdWV1ZURlcHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnYW1lcyA9IG10UnVubmVyLnJ1bkJhdGNoKG51bUdhbWVzLCBtYXN0ZXJTZWVkKTsKICAgICAg' +
'ICB9IGVsc2UgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiUnVubmluZyAlZCBnYW1lcyAoc2luZ2xlIHRocmVhZCkuLi4lbiVuIiwgbnVtR2FtZXMpOwogICAgICAgICAgICBCYXRjaFJ1bm5lciBydW5uZXIgPSBuZXcgQmF0Y2hSdW5uZXIoCiAgICAgICAgICAgICAgICAgICAgZm9yZ2VKYXJQYXRoLCBmb3JnZVdvcmtEaXIsIGRlY2tzLCBwb2xpY3ksIHF1aWV0TW9kZSwgY2xvY2tTZWNvbmRzLCByZXNvbHZlZEphdmEpOwogICAgICAgICAgICBydW5uZXIuc2V0QWlPcHRpbWl6YXRpb24oYWlTaW1wbGlmaWVkLCBhaVRoaW5rVGltZU1zKTsKCiAgICAgICAgICAgIC8vIHY0OiBFbmFibGUgTUwgZGVjaXNpb24gbG9nZ2luZyBpZiByZXF1ZXN0ZWQKICAgICAgICAgICAgaWYgKG1sTG9nKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgYmF0Y2hJZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDgpOwogICAgICAgICAgICAgICAgcnVubmVyLmVuYWJsZU1sTG9nZ2luZygicmVzdWx0cyIsIGJhdGNoSWQpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbTUxdIERlY2lzaW9uIGxvZ2dpbmcgZW5hYmxlZCDigJQgZGF0YSB3aWxsIGJlIHNhdmVkIHRvIHJlc3VsdHMvIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdhbWVzID0gcnVubmVyLnJ1bkJhdGNoU2luZ2xlVGhyZWFkKG51bUdhbWVzLCBtYXN0ZXJTZWVkKTsKCiAgICAgICAgICAgIC8vIENsb3NlIE1MIGxvZ2dlcgogICAgICAgICAgICBpZiAobWxMb2cpIHsKICAgICAgICAgICAgICAgIHJ1bm5lci5jbG9zZU1sTG9nZ2VyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxvbmcgZWxhcHNlZE1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWU7CgogICAgICAgIC8vIENvbXB1dGUgc3RhdHMKICAgICAgICBTdW1tYXJ5IHN1bW1hcnkgPSBTdGF0c0FnZ3JlZ2F0b3IuY29tcHV0ZVN1bW1hcnkoZ2FtZXMsIGRlY2tzLCBlbGFwc2VkTXMpOwoKICAgICAgICAvLyBCdWlsZCBmdWxsIEJhdGNoUmVzdWx0CiAgICAgICAgQmF0Y2hSZXN1bHQgcmVzdWx0ID0gbmV3IEJhdGNoUmVzdWx0KCk7CiAgICAgICAgcmVzdWx0Lm1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKCk7CiAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLmJhdGNoSWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwogICAgICAgIHJlc3VsdC5tZXRhZGF0YS50aW1lc3RhbXAgPSBJbnN0YW50Lm5vdygpLnRvU3RyaW5nKCk7CiAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLnRvdGFsR2FtZXMgPSBudW1HYW1lczsKICAgICAgICByZXN1bHQubWV0YWRhdGEuY29tcGxldGVkR2FtZXMgPSBnYW1lcy5zaXplKCk7CiAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLmVuZ2luZVZlcnNpb24gPSAiZm9yZ2UtMi4wLjEyLVNOQVBTSE9UIjsKICAgICAgICByZXN1bHQubWV0YWRhdGEubWFzdGVyU2VlZCA9IG1hc3RlclNlZWQ7CiAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLnRocmVhZHMgPSB0aHJlYWRzOwogICAgICAgIHJlc3VsdC5tZXRhZGF0YS5lbGFwc2VkTXMgPSBlbGFwc2VkTXM7CiAgICAgICAgcmVzdWx0LmRlY2tzID0gZGVja3M7CiAgICAgICAgcmVzdWx0LmdhbWVzID0gZ2FtZXM7CiAgICAgICAgcmVzdWx0LnN1bW1hcnkgPSBzdW1tYXJ5OwoKICAgICAgICAvLyBFeHBvcnQgSlNPTgogICAgICAgIEpzb25FeHBvcnRlci53cml0ZVRvRmlsZShyZXN1bHQsIG91dHB1dFBhdGgpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwoKICAgICAgICAvLyBQcmludCBzdW1tYXJ5IHRvIGNvbnNvbGUKICAgICAgICBwcmludFN1bW1hcnkocmVzdWx0KTsKCiAgICAgICAgLy8gVmFsaWRhdGUgb3V0cHV0CiAgICAgICAgU3RyaW5nIGpzb24gPSBKc29uRXhwb3J0ZXIudG9Kc29uKHJlc3VsdCk7CiAgICAgICAgYm9vbGVhbiB2YWxpZCA9IEpzb25FeHBvcnRlci52YWxpZGF0ZUJhc2ljU3RydWN0dXJlKGpzb24pOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlbkpTT04gdmFsaWRhdGlvbjogJXMlbiIsIHZhbGlkID8gIlBBU1NFRCIgOiAiRkFJTEVEIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIk91dHB1dCB3cml0dGVuIHRvOiAlcyVuIiwgb3V0cHV0UGF0aCk7CgogICAgICAgIC8vIHYyOiBTYXZlIHRvIFNRTGl0ZQogICAgICAgIGlmICghbm9EYikgewogICAgICAgICAgICB0cnkgKExhYkRhdGFiYXNlIGRiID0gbmV3IExhYkRhdGFiYXNlKGRi' +
'UGF0aCkpIHsKICAgICAgICAgICAgICAgIGRiLnNhdmVCYXRjaFJlc3VsdChyZXN1bHQpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlNhdmVkIHRvIGRhdGFiYXNlOiAlcyVuIiwgZGJQYXRoKTsKCiAgICAgICAgICAgICAgICAvLyBBbHNvIHNhdmUgZGVjayBhbmFseXNlcyBpZiB3ZSByYW4gdGhlbQogICAgICAgICAgICAgICAgaWYgKGFuYWx5emVEZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkRGVja3NEaXIgPSBkZWNrc0Rpci5pc0VtcHR5KCkgPyByZXNvbHZlRm9yZ2VEZWNrc0RpcigpIDogZGVja3NEaXI7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRGVja3NEaXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKERlY2tJbmZvIGRlY2sgOiBkZWNrcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNrQW5hbHlzaXMgYW5hbHlzaXMgPSBEZWNrQW5hbHl6ZXIuYW5hbHl6ZUZyb21Gb3JnZShyZXNvbHZlZERlY2tzRGlyLCBkZWNrLmRlY2tOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5zYXZlRGVja0FuYWx5c2lzKGFuYWx5c2lzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpZ25vcmUpIHsgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFByaW50IGdsb2JhbCBzdGF0cwogICAgICAgICAgICAgICAgdmFyIGdsb2JhbFN0YXRzID0gZGIuZ2V0R2xvYmFsU3RhdHMoKTsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlbuKVkOKVkOKVkCBMSUZFVElNRSBTVEFUUyDilZDilZDilZAlbiIpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgVG90YWwgQmF0Y2hlczogJXMgIHwgIFRvdGFsIEdhbWVzOiAlcyAgfCAgVW5pcXVlIERlY2tzOiAlcyVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsU3RhdHMuZ2V0KCJ0b3RhbEJhdGNoZXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsU3RhdHMuZ2V0KCJ0b3RhbEdhbWVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFN0YXRzLmdldCgidW5pcXVlRGVja3MiKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiV0FSTklORzogRGF0YWJhc2Ugc2F2ZSBmYWlsZWQ6ICVzJW4iLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gRGVjayBJbmZvIENvbnN0cnVjdGlvbiAodjMg4oCUIHN1cHBvcnRzIGltcG9ydCkKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHByaXZhdGUgTGlzdDxEZWNrSW5mbz4gYnVpbGREZWNrSW5mb0xpc3QoU3RyaW5nIGltcG9ydERpcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nW10gZGVja05hbWVzID0ge2RlY2sxLCBkZWNrMiwgZGVjazN9OwogICAgICAgIFN0cmluZ1tdIGNvbW1hbmRlcnMgPSB7Y29tbWFuZGVyMSwgY29tbWFuZGVyMiwgY29tbWFuZGVyM307CgogICAgICAgIC8vIEJ1aWxkIGltcG9ydCBsaXN0cyBmb3IgZWFjaCBzZWF0CiAgICAgICAgRGVja1Byb2ZpbGVbXSBpbXBvcnRzID0gbmV3IERlY2tQcm9maWxlWzNdOwoKICAgICAgICAvLyBQcm9jZXNzIC0tY29tbWFuZGVyLW1ldGEgZmxhZ3MKICAgICAgICBpZiAoY29tbWFuZGVyTWV0YSAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF0aC5taW4oY29tbWFuZGVyTWV0YS5zaXplKCksIDMpOyBp' +
'KyspIHsKICAgICAgICAgICAgICAgIFN0cmluZyBjbWRyTmFtZSA9IGNvbW1hbmRlck1ldGEuZ2V0KGkpOwogICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIuKVkOKVkOKVkCBJTVBPUlQgU0VBVCAlZDogQ29tbWFuZGVyIE1ldGEg4oCUICVzIOKVkOKVkOKVkCVuIiwgaSwgY21kck5hbWUpOwogICAgICAgICAgICAgICAgaW1wb3J0c1tpXSA9IERlY2tJbXBvcnRlci5pbXBvcnRGcm9tRWRocmVjKGNtZHJOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUHJvY2VzcyAtLWltcG9ydC11cmwgZmxhZ3MgKG92ZXJyaWRlcyBjb21tYW5kZXItbWV0YSBmb3Igc2FtZSBzZWF0KQogICAgICAgIGlmIChpbXBvcnRVcmxzICE9IG51bGwpIHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXRoLm1pbihpbXBvcnRVcmxzLnNpemUoKSwgMyk7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGltcG9ydHNbaV0gIT0gbnVsbCkgY29udGludWU7IC8vIERvbid0IG92ZXJyaWRlIGlmIGFscmVhZHkgc2V0CiAgICAgICAgICAgICAgICBTdHJpbmcgdXJsID0gaW1wb3J0VXJscy5nZXQoaSk7CiAgICAgICAgICAgICAgICBpbnQgc2VhdCA9IGZpbmROZXh0RW1wdHlTZWF0KGltcG9ydHMpOwogICAgICAgICAgICAgICAgaWYgKHNlYXQgPCAwKSBicmVhazsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCLilZDilZDilZAgSU1QT1JUIFNFQVQgJWQ6IFVSTCDigJQgJXMg4pWQ4pWQ4pWQJW4iLCBzZWF0LCB1cmwpOwogICAgICAgICAgICAgICAgaW1wb3J0c1tzZWF0XSA9IERlY2tJbXBvcnRlci5pbXBvcnRGcm9tVXJsKHVybCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFByb2Nlc3MgLS1pbXBvcnQtdGV4dCBmbGFncwogICAgICAgIGlmIChpbXBvcnRUZXh0RmlsZXMgIT0gbnVsbCkgewogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1hdGgubWluKGltcG9ydFRleHRGaWxlcy5zaXplKCksIDMpOyBpKyspIHsKICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGltcG9ydFRleHRGaWxlcy5nZXQoaSk7CiAgICAgICAgICAgICAgICBpbnQgc2VhdCA9IGZpbmROZXh0RW1wdHlTZWF0KGltcG9ydHMpOwogICAgICAgICAgICAgICAgaWYgKHNlYXQgPCAwKSBicmVhazsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCLilZDilZDilZAgSU1QT1JUIFNFQVQgJWQ6IFRleHQgRmlsZSDigJQgJXMg4pWQ4pWQ4pWQJW4iLCBzZWF0LCBmaWxlUGF0aCk7CiAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IEZpbGVzLnJlYWRTdHJpbmcoUGF0aC5vZihmaWxlUGF0aCkpOwogICAgICAgICAgICAgICAgaW1wb3J0c1tzZWF0XSA9IERlY2tJbXBvcnRlci5pbXBvcnRGcm9tVGV4dCh0ZXh0LCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gU2F2ZSBpbXBvcnRlZCBkZWNrcyB0byAuZGNrIGZpbGVzIGFuZCBzZXQgZGVjayBuYW1lcwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpbXBvcnRzW2ldICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIERlY2tQcm9maWxlIHByb2ZpbGUgPSBpbXBvcnRzW2ldOwogICAgICAgICAgICAgICAgUGF0aCBkY2tQYXRoID0gRGVja0ltcG9ydGVyLnNhdmVUb0Rja0ZpbGUocHJvZmlsZSwgaW1wb3J0RGlyKTsKICAgICAgICAgICAgICAgIFN0cmluZyBzYXZlZE5hbWUgPSBkY2tQYXRoLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKS5yZXBsYWNlKCIuZGNrIiwgIiIpOwogICAgICAgICAgICAgICAgZGVja05hbWVzW2ldID0gc2F2ZWROYW1lOwogICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUuY29tbWFuZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb21tYW5kZXJzW2ldID0gcHJvZmlsZS5jb21tYW5kZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBTZWF0ICVkIOKGkiBzYXZlZCBhcyAlcyVuIiwgaSwgZGNrUGF0aCk7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVmFsaWRhdGUgYWxsIDMgc2VhdHMgaGF2ZSBkZWNrcwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgIGlmIChkZWNrTmFtZXNbaV0gPT0gbnVsbCB8fCBkZWNrTmFtZXNbaV0uaXNFbXB0eSgpKSB7' +
'CiAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiRVJST1I6IFNlYXQgJWQgaGFzIG5vIGRlY2suIFVzZSAtLWRlY2slZCwgLS1pbXBvcnQtdXJsLCAtLWltcG9ydC10ZXh0LCBvciAtLWNvbW1hbmRlci1tZXRhLiVuIiwgaSwgaSArIDEpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEJ1aWxkIERlY2tJbmZvIGxpc3QKICAgICAgICBMaXN0PERlY2tJbmZvPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgRGVja0luZm8gZCA9IG5ldyBEZWNrSW5mbygpOwogICAgICAgICAgICBkLnNlYXRJbmRleCA9IGk7CiAgICAgICAgICAgIGQuZGVja0ZpbGUgPSBkZWNrTmFtZXNbaV07CiAgICAgICAgICAgIGQuZGVja05hbWUgPSBkZWNrTmFtZXNbaV07CiAgICAgICAgICAgIGQuY29tbWFuZGVyTmFtZSA9IGNvbW1hbmRlcnNbaV0uaXNFbXB0eSgpID8gZGVja05hbWVzW2ldIDogY29tbWFuZGVyc1tpXTsKICAgICAgICAgICAgZC5jb2xvcklkZW50aXR5ID0gTGlzdC5vZigpOwogICAgICAgICAgICBkLmNhcmRDb3VudCA9IDEwMDsKCiAgICAgICAgICAgIC8vIHYzOiBQb3B1bGF0ZSBzb3VyY2UgbWV0YWRhdGEgZnJvbSBpbXBvcnQKICAgICAgICAgICAgaWYgKGltcG9ydHNbaV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgRGVja1Byb2ZpbGUgcCA9IGltcG9ydHNbaV07CiAgICAgICAgICAgICAgICBkLnNvdXJjZSA9IHAuc291cmNlICE9IG51bGwgPyBwLnNvdXJjZS5sYWJlbCgpIDogbnVsbDsKICAgICAgICAgICAgICAgIGQuc291cmNlVXJsID0gcC5zb3VyY2VVcmw7CiAgICAgICAgICAgICAgICBkLmFyY2hldHlwZSA9IHAuYXJjaGV0eXBlOwogICAgICAgICAgICAgICAgZC5jb2xvcklkZW50aXR5ID0gcC5jb2xvcklkZW50aXR5ICE9IG51bGwgPyBwLmNvbG9ySWRlbnRpdHkgOiBMaXN0Lm9mKCk7CiAgICAgICAgICAgICAgICBkLmNhcmRDb3VudCA9IHAudG90YWxDYXJkczsKICAgICAgICAgICAgICAgIGlmIChwLnNhbXBsZVNpemUgIT0gbnVsbCkgZC5zYW1wbGVTaXplID0gcC5zYW1wbGVTaXplOwogICAgICAgICAgICAgICAgZC5pbXBvcnRlZEF0ID0gcC5pbXBvcnRlZEF0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBsaXN0LmFkZChkKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgZmluZE5leHRFbXB0eVNlYXQoRGVja1Byb2ZpbGVbXSBpbXBvcnRzKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpbXBvcnRzW2ldID09IG51bGwpIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBIZWxwZXJzCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICBwcml2YXRlIFN0cmluZyByZXNvbHZlSW1wb3J0RGlyKCkgewogICAgICAgIGlmICghaW1wb3J0VG8uaXNFbXB0eSgpKSByZXR1cm4gaW1wb3J0VG87CgogICAgICAgIC8vIFRyeSBGb3JnZSBkZWNrcy9jb21tYW5kZXIgZGlyCiAgICAgICAgU3RyaW5nIGRlY2tzRGlyID0gcmVzb2x2ZUZvcmdlRGVja3NEaXIoKTsKICAgICAgICBpZiAoZGVja3NEaXIgIT0gbnVsbCkgcmV0dXJuIGRlY2tzRGlyOwoKICAgICAgICAvLyBGYWxsYmFjayB0byBsb2NhbCBkaXJlY3RvcnkKICAgICAgICByZXR1cm4gImltcG9ydGVkLWRlY2tzIjsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRNZXRhTGlzdCgpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVkOKVkOKVkCBBVkFJTEFCTEUgQ09NTUFOREVSUyAoTWV0YSBNYXBwaW5nKSDilZDilZDilZAiKTsKICAg' +
'ICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICBmb3IgKFN0cmluZyBjbWRyIDogQ29tbWFuZGVyTWV0YVNlcnZpY2UuZ2V0QWxsQ29tbWFuZGVycygpKSB7CiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gQ29tbWFuZGVyTWV0YVNlcnZpY2UuZ2V0TWV0YURlY2tzKGNtZHIpOwogICAgICAgICAgICBmb3IgKHZhciBlbnRyeSA6IGVudHJpZXMpIHsKICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgICUtMzVzICAlLTIwcyAgJXMlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNtZHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmFyY2hldHlwZSAhPSBudWxsID8gZW50cnkuYXJjaGV0eXBlIDogIiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNvdXJjZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVuICBUb3RhbDogJWQgY29tbWFuZGVycyVuIiwgQ29tbWFuZGVyTWV0YVNlcnZpY2UuZ2V0QWxsQ29tbWFuZGVycygpLnNpemUoKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIFVzZSAtLWNvbW1hbmRlci1tZXRhIFwiQ29tbWFuZGVyIE5hbWVcIiB0byBmZXRjaCB0aGUgRURIUkVDIGF2ZXJhZ2UgZGVjay4iKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgcHJpbnRTdW1tYXJ5KEJhdGNoUmVzdWx0IHJlc3VsdCkgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLilZEgICAgICAgICAgICAgICAgICAgIEJBVENIIFJFU1VMVFMgICAgICAgICAgICAgICAgICAgICAgICDilZEiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuKVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVoyIpOwoKICAgICAgICBTdW1tYXJ5IHMgPSByZXN1bHQuc3VtbWFyeTsKICAgICAgICBmb3IgKERlY2tTdW1tYXJ5IGRzIDogcy5wZXJEZWNrKSB7CiAgICAgICAgICAgIERlY2tJbmZvIGRlY2tJbmZvID0gcmVzdWx0LmRlY2tzLmdldChkcy5zZWF0SW5kZXgpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zigi4pWRICBTZWF0ICVkOiAlLTQwcyAgICAg4pWRJW4iLCBkcy5zZWF0SW5kZXgsIGRzLmRlY2tOYW1lKTsKICAgICAgICAgICAgaWYgKGRlY2tJbmZvLnNvdXJjZSAhPSBudWxsICYmICFkZWNrSW5mby5zb3VyY2UuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zigi4pWRICAgIFNvdXJjZTogICAgICUtMzZzICAgICDilZElbiIsIGRlY2tJbmZvLnNvdXJjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIuKVkSAgICBXaW4gUmF0ZTogICAgICU1LjFmJSUgICglZCBXIC8gJWQgTCAvICVkIEQpJW4iLAogICAgICAgICAgICAgICAgICAgIGRzLndpblJhdGUgKiAxMDAsIGRzLndpbnMsIGRzLmxvc3NlcywgZHMuZHJhd3MpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zigi4pWRICAgIEF2ZyBUdXJuczogICAgJTVzJW4iLAogICAgICAgICAgICAgICAgICAgIGRzLmF2Z1R1cm5zVG9XaW4gIT0gbnVsbCA/IFN0cmluZy5mb3JtYXQoIiUuMWYiLCBkcy5hdmdUdXJuc1RvV2luKSA6ICJOL0EiKTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIuKVkSAgICBBdmcgTXVsbGlnYW46ICU1LjJmJW4iLCBkcy5hdmdNdWxsaWdhbnMpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zigi4pWRICAgIEF2ZyBMaWZlOiAgICAgJTUuMWYlbiIsIGRzLmF2Z0ZpbmFsTGlmZSk7CgogICAgICAgICAgICBpZiAoZHMud2luQ29uZGl0aW9uQnJlYWtkb3duICE9IG51bGwgJiYgZHMud2lucyA+IDApIHsKICAgICAgICAgICAgICAgIFdpbkNvbmRpdGlvbkJyZWFrZG93biBiID0gZHMud2luQ29uZGl0aW9uQnJlYWtkb3duOwogICAgICAgICAgICAg' +
'ICAgU3lzdGVtLm91dC5wcmludGYoIuKVkSAgICBXaW4gQnk6IENvbWJhdD0lZCAgQ21kckRtZz0lZCAgQ29tYm89JWQgIERyYWluPSVkICBNaWxsPSVkJW4iLAogICAgICAgICAgICAgICAgICAgICAgICBiLmNvbWJhdF9kYW1hZ2UsIGIuY29tbWFuZGVyX2RhbWFnZSwgYi5jb21ib19hbHRfd2luLCBiLmxpZmVfZHJhaW4sIGIubWlsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCLilZEiKTsKICAgICAgICB9CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi4pWg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWjIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIuKVkSAgR2FtZXM6ICUtNWQgICBBdmcgVHVybnM6ICUtNi4xZiAgIFNpbXMvc2VjOiAlLTYuMmYlbiIsCiAgICAgICAgICAgICAgICByZXN1bHQubWV0YWRhdGEuY29tcGxldGVkR2FtZXMsIHMuYXZnR2FtZVR1cm5zLCBzLnNpbXNQZXJTZWNvbmQpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCLilZEgIFdhbGwgVGltZTogJS4xZnMlbiIsIHJlc3VsdC5tZXRhZGF0YS5lbGFwc2VkTXMgLyAxMDAwLjApOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigi4pWa4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWdIik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGludCBleGl0Q29kZSA9IG5ldyBDb21tYW5kTGluZShuZXcgTGFiQ2xpKCkpLmV4ZWN1dGUoYXJncyk7CiAgICAgICAgU3lzdGVtLmV4aXQoZXhpdENvZGUpOwogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZSB0aGUgSmF2YSAxNyBleGVjdXRhYmxlIHBhdGggZm9yIHJ1bm5pbmcgRm9yZ2Ugc3VicHJvY2Vzc2VzLgogICAgICogRm9yZ2UgcmVxdWlyZXMgSmF2YSAxNyDigJQgbmV3ZXIgdmVyc2lvbnMgKDI1KykgY2F1c2UgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLgogICAgICoKICAgICAqIFByaW9yaXR5OiAtLWphdmExNyBmbGFnID4gYXV0by1kZXRlY3QgQWRvcHRpdW0gPiBhdXRvLWRldGVjdCBPcmFjbGUgPiBzeXN0ZW0gImphdmEiCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVKYXZhMTdQYXRoKCkgewogICAgICAgIC8vIDEuIEV4cGxpY2l0IC0tamF2YTE3IGZsYWcKICAgICAgICBpZiAoamF2YTE3UGF0aCAhPSBudWxsICYmICFqYXZhMTdQYXRoLmlzRW1wdHkoKSkgewogICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShqYXZhMTdQYXRoKTsKICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHJldHVybiBmLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IC0tamF2YTE3IHBhdGggbm90IGZvdW5kOiAiICsgamF2YTE3UGF0aCk7CiAgICAgICAgfQoKICAgICAgICAvLyAyLiBBdXRvLWRldGVjdCBjb21tb24gSmF2YSAxNyBsb2NhdGlvbnMgb24gV2luZG93cwogICAgICAgIFN0cmluZ1tdIGNhbmRpZGF0ZXMgPSB7CiAgICAgICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlc1xcRWNsaXBzZSBBZG9wdGl1bVxcamRrLTE3LjAuMTguOC1ob3RzcG90XFxiaW5cXGphdmEuZXhlIiwKICAgICAgICAgICAgIkM6XFxQcm9ncmFtIEZpbGVzXFxKYXZhXFxqZGstMTdcXGJpblxcamF2YS5leGUiLAogICAgICAgICAgICAiQzpcXFByb2dyYW0gRmlsZXNcXEVjbGlwc2UgQWRvcHRpdW1cXGpkay0xN1xcYmluXFxqYXZhLmV4ZSIsCiAgICAgICAgfTsKCiAgICAgICAgLy8gQWxzbyBzY2FuIGZvciBhbnkgamRrLTE3KiBpbiBBZG9wdGl1bSBhbmQgSmF2YSBkaXJzCiAgICAgICAgU3RyaW5nW10gc2VhcmNoRGlycyA9IHsKICAgICAgICAgICAgIkM6XFxQcm9ncmFtIEZpbGVzXFxFY2xpcHNlIEFkb3B0aXVtIiwKICAgICAgICAgICAgIkM6XFxQcm9ncmFtIEZpbGVzXFxKYXZhIiwKICAgICAgICB9OwogICAgICAgIGZvciAoU3Ry' +
'aW5nIGRpciA6IHNlYXJjaERpcnMpIHsKICAgICAgICAgICAgRmlsZSBkID0gbmV3IEZpbGUoZGlyKTsKICAgICAgICAgICAgaWYgKGQuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgRmlsZVtdIGNoaWxkcmVuID0gZC5saXN0RmlsZXMoKTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChGaWxlIGNoaWxkIDogY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmlzRGlyZWN0b3J5KCkgJiYgY2hpbGQuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImpkay0xNyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGphdmEgPSBuZXcgRmlsZShjaGlsZCwgImJpbi9qYXZhLmV4ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphdmEuZXhpc3RzKCkpIHJldHVybiBqYXZhLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGludXgvTWFjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhID0gbmV3IEZpbGUoY2hpbGQsICJiaW4vamF2YSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGphdmEuZXhpc3RzKCkpIHJldHVybiBqYXZhLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyAzLiBDaGVjayBleHBsaWNpdCBjYW5kaWRhdGUgcGF0aHMKICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogY2FuZGlkYXRlcykgewogICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHJldHVybiBmLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gNC4gRmFsbGJhY2sgdG8gc3lzdGVtIGphdmEgKG1heSBiZSB3cm9uZyB2ZXJzaW9uKQogICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV0FSTklORzogSmF2YSAxNyBub3QgZm91bmQuIEZvcmdlIG1heSBjcmFzaCBvbiBKYXZhIDI1Ky4iKTsKICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAgICAgIEluc3RhbGwgQWRvcHRpdW0gSkRLIDE3IG9yIHVzZSAtLWphdmExNyA8cGF0aD4iKTsKICAgICAgICByZXR1cm4gImphdmEiOwogICAgfQoKICAgIC8qKgogICAgICogQXV0by1kZXRlY3QgRm9yZ2UgQ29tbWFuZGVyIGRlY2tzIGRpcmVjdG9yeS4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZUZvcmdlRGVja3NEaXIoKSB7CiAgICAgICAgLy8gV2luZG93czogJUFQUERBVEElXEZvcmdlXGRlY2tzXGNvbW1hbmRlcgogICAgICAgIFN0cmluZyBhcHBkYXRhID0gU3lzdGVtLmdldGVudigiQVBQREFUQSIpOwogICAgICAgIGlmIChhcHBkYXRhICE9IG51bGwpIHsKICAgICAgICAgICAgRmlsZSBjYW5kaWRhdGUgPSBuZXcgRmlsZShhcHBkYXRhLCAiRm9yZ2UvZGVja3MvY29tbWFuZGVyIik7CiAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIGNhbmRpZGF0ZS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICB9CiAgICAgICAgLy8gTGludXgvTWFjCiAgICAgICAgU3RyaW5nIGhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOwogICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBuZXcgU3RyaW5nW117Ii8uZm9yZ2UvZGVja3MvY29tbWFuZGVyIiwgIi9Gb3JnZS9kZWNrcy9jb21tYW5kZXIifSkgewogICAgICAgICAgICBGaWxlIGNhbmRpZGF0ZSA9IG5ldyBGaWxlKGhvbWUgKyBwYXRoKTsKICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gY2FuZGlkYXRlLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\cli\LabCli.java' -B $b
# src/main/java/commanderailab/db/LabDatabase.java (21,529 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5kYjsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuQmF0Y2hSZXN1bHQ7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuQmF0Y2hSZXN1bHQuKjsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5Kc29uRXhwb3J0ZXI7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5hbmFseXRpY3MuRGVja0FuYWx5emVyLkRlY2tBbmFseXNpczsKCmltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKCmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnNxbC4qOwppbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CmltcG9ydCBqYXZhLnV0aWwuKjsKCi8qKgogKiBMYWJEYXRhYmFzZSDigJQgU1FMaXRlIHBlcnNpc3RlbmNlIGZvciBDb21tYW5kZXIgQUkgTGFiLgogKgogKiBTdG9yZXM6CiAqICAgLSBCYXRjaCBydW4gbWV0YWRhdGEgYW5kIHJlc3VsdHMgKGZ1bGwgSlNPTiArIGluZGV4ZWQgY29sdW1ucykKICogICAtIFBlci1kZWNrIHdpbiByYXRlIGhpc3RvcnkgZm9yIHRyZW5kIHRyYWNraW5nCiAqICAgLSBEZWNrIGFuYWx5c2lzIHNuYXBzaG90cwogKiAgIC0gTWF0Y2h1cCBtYXRyaXggZGF0YSAoZGVjayBBIHZzIEIgdnMgQyB3aW4gcmF0ZXMpCiAqCiAqIFNjaGVtYSBhdXRvLWNyZWF0ZXMgb24gZmlyc3QgdXNlLiBBbGwgb3BlcmF0aW9ucyBhcmUgdGhyZWFkLXNhZmUKICogdmlhIHN5bmNocm9uaXplZCBtZXRob2RzIChTUUxpdGUgZG9lc24ndCBoYW5kbGUgY29uY3VycmVudCB3cml0ZXMgd2VsbCkuCiAqLwpwdWJsaWMgY2xhc3MgTGFiRGF0YWJhc2UgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1ZFUlNJT04gPSAiMi4wLjAiOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3NvbiBHU09OID0gbmV3IEdzb25CdWlsZGVyKCkuc2V0UHJldHR5UHJpbnRpbmcoKS5jcmVhdGUoKTsKCiAgICBwcml2YXRlIGZpbmFsIENvbm5lY3Rpb24gY29ubjsKCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIENvbnN0cnVjdGlvbiAmIFNjaGVtYQogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgcHVibGljIExhYkRhdGFiYXNlKFN0cmluZyBkYlBhdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgIHRoaXMuY29ubiA9IERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbigiamRiYzpzcWxpdGU6IiArIGRiUGF0aCk7CiAgICAgICAgY29ubi5zZXRBdXRvQ29tbWl0KHRydWUpOwogICAgICAgIC8vIEVuYWJsZSBXQUwgZm9yIGJldHRlciBjb25jdXJyZW50IHJlYWQgcGVyZm9ybWFuY2UKICAgICAgICB0cnkgKFN0YXRlbWVudCBzID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKSkgewogICAgICAgICAgICBzLmV4ZWN1dGUoIlBSQUdNQSBqb3VybmFsX21vZGU9V0FMIik7CiAgICAgICAgICAgIHMuZXhlY3V0ZSgiUFJBR01BIGZvcmVpZ25fa2V5cz1PTiIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVTY2hlbWEoKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2NoZW1hKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgdHJ5IChTdGF0ZW1lbnQgcyA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCkpIHsKCiAgICAgICAgICAgIC8vIOKUgOKUgCBCYXRjaCBSdW5zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBiYXRjaF9ydW5zICgKICAgICAgICAgICAgICAgICAgICBiYXRjaF9pZCAgICAgICBURVhUIFBSSU1BUlkgS0VZLAogICAgICAgICAg' +
'ICAgICAgICAgIHRpbWVzdGFtcCAgICAgIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgdG90YWxfZ2FtZXMgICAgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRfZ2FtZXMgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICB0aHJlYWRzICAgICAgICBJTlRFR0VSIERFRkFVTFQgMSwKICAgICAgICAgICAgICAgICAgICBlbGFwc2VkX21zICAgICBJTlRFR0VSIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIG1hc3Rlcl9zZWVkICAgIElOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgZW5naW5lX3ZlcnNpb24gVEVYVCwKICAgICAgICAgICAgICAgICAgICBzaW1zX3Blcl9zZWMgICBSRUFMLAogICAgICAgICAgICAgICAgICAgIGF2Z19nYW1lX3R1cm5zIFJFQUwsCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2pzb24gICAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBjcmVhdGVkX2F0ICAgICBURVhUIERFRkFVTFQgKGRhdGV0aW1lKCdub3cnKSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIiIiKTsKCiAgICAgICAgICAgIC8vIOKUgOKUgCBQZXItRGVjayBSZXN1bHRzIChpbmRleGVkIGZvciBxdWVyaWVzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICAgcy5leGVjdXRlKCIiIgogICAgICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZGVja19yZXN1bHRzICgKICAgICAgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYmF0Y2hfaWQgICAgICAgVEVYVCBOT1QgTlVMTCBSRUZFUkVOQ0VTIGJhdGNoX3J1bnMoYmF0Y2hfaWQpLAogICAgICAgICAgICAgICAgICAgIHNlYXRfaW5kZXggICAgIElOVEVHRVIgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgZGVja19uYW1lICAgICAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBjb21tYW5kZXJfbmFtZSBURVhULAogICAgICAgICAgICAgICAgICAgIHdpbnMgICAgICAgICAgIElOVEVHRVIgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgbG9zc2VzICAgICAgICAgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBkcmF3cyAgICAgICAgICBJTlRFR0VSIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIHdpbl9yYXRlICAgICAgIFJFQUwgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgYXZnX3R1cm5zX3RvX3dpbiBSRUFMLAogICAgICAgICAgICAgICAgICAgIGF2Z19tdWxsaWdhbnMgIFJFQUwsCiAgICAgICAgICAgICAgICAgICAgYXZnX2ZpbmFsX2xpZmUgUkVBTCwKICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgICAgICBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgIFRFWFQsCiAgICAgICAgICAgICAgICAgICAgc291cmNlX3VybCAgICAgVEVYVCwKICAgICAgICAgICAgICAgICAgICBhcmNoZXR5cGUgICAgICBURVhUCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICIiIik7CgogICAgICAgICAgICAvLyDilIDilIAgTWF0Y2h1cCBEYXRhICgzLWRlY2sgcG9kcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIHMuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIG1hdGNodXBzICgKICAgICAgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYmF0Y2hfaWQgICAgICAgVEVYVCBOT1QgTlVMTCBSRUZFUkVOQ0VTIGJhdGNoX3J1bnMoYmF0Y2hfaWQpLAogICAgICAgICAgICAgICAgICAgIGRlY2tfYSAgICAgICAgIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgZGVja19iICAgICAgICAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBkZWNrX2MgICAgICAgICBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGRlY2tfYV93aW5zICAgIElOVEVHRVIgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgZGVja19iX3dpbnMgICAgSU5URUdFUiBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBkZWNrX2Nfd2lucyAgICBJTlRFR0VSIE5PVCBOVUxMLAogICAgICAgICAg' +
'ICAgICAgICAgIHRvdGFsX2dhbWVzICAgIElOVEVHRVIgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wICAgICAgVEVYVCBOT1QgTlVMTAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIpOwoKICAgICAgICAgICAgLy8g4pSA4pSAIERlY2sgQW5hbHlzaXMgU25hcHNob3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBkZWNrX2FuYWx5c2VzICgKICAgICAgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgZGVja19uYW1lICAgICAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBjb21tYW5kZXJfbmFtZSBURVhULAogICAgICAgICAgICAgICAgICAgIHRvdGFsX2NhcmRzICAgIElOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgbGFuZHMgICAgICAgICAgSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICBjcmVhdHVyZXMgICAgICBJTlRFR0VSLAogICAgICAgICAgICAgICAgICAgIHJhbXBfY2FyZHMgICAgIElOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgcmVtb3ZhbF9jYXJkcyAgSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICBkcmF3X2NhcmRzICAgICBJTlRFR0VSLAogICAgICAgICAgICAgICAgICAgIGJvYXJkX3dpcGVzICAgIElOVEVHRVIsCiAgICAgICAgICAgICAgICAgICAgYW5hbHlzaXNfanNvbiAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBjcmVhdGVkX2F0ICAgICBURVhUIERFRkFVTFQgKGRhdGV0aW1lKCdub3cnKSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIiIiKTsKCiAgICAgICAgICAgIC8vIOKUgOKUgCBJbmRleGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBzLmV4ZWN1dGUoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9kZWNrX3Jlc3VsdHNfbmFtZSBPTiBkZWNrX3Jlc3VsdHMoZGVja19uYW1lKSIpOwogICAgICAgICAgICBzLmV4ZWN1dGUoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9kZWNrX3Jlc3VsdHNfYmF0Y2ggT04gZGVja19yZXN1bHRzKGJhdGNoX2lkKSIpOwogICAgICAgICAgICBzLmV4ZWN1dGUoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9tYXRjaHVwc19kZWNrcyBPTiBtYXRjaHVwcyhkZWNrX2EsIGRlY2tfYiwgZGVja19jKSIpOwogICAgICAgICAgICBzLmV4ZWN1dGUoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9iYXRjaF9ydW5zX3RpbWVzdGFtcCBPTiBiYXRjaF9ydW5zKHRpbWVzdGFtcCkiKTsKCiAgICAgICAgICAgIC8vIOKUgOKUgCBNZXRhIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBzLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgICAgICBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBsYWJfbWV0YSAoCiAgICAgICAgICAgICAgICAgICAga2V5ICAgVEVYVCBQUklNQVJZIEtFWSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZSBURVhUCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICIiIik7CiAgICAgICAgICAgIHMuZXhlY3V0ZSgiSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyBsYWJfbWV0YShrZXksIHZhbHVlKSBWQUxVRVMoJ3NjaGVtYV92ZXJzaW9uJywgJyIgKyBTQ0hFTUFfVkVSU0lPTiArICInKSIpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEJhdGNoIFJ1biBTdG9yYWdlCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDi' +
'lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIFN0b3JlIGEgY29tcGxldGUgYmF0Y2ggcmVzdWx0LgogICAgICovCiAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZUJhdGNoUmVzdWx0KEJhdGNoUmVzdWx0IHJlc3VsdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nIGpzb24gPSBKc29uRXhwb3J0ZXIudG9Kc29uKHJlc3VsdCk7CiAgICAgICAgTWV0YWRhdGEgbSA9IHJlc3VsdC5tZXRhZGF0YTsKCiAgICAgICAgLy8gSW5zZXJ0IGJhdGNoIHJ1bgogICAgICAgIHRyeSAoUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIiIiCiAgICAgICAgICAgIElOU0VSVCBPUiBSRVBMQUNFIElOVE8gYmF0Y2hfcnVucwogICAgICAgICAgICAoYmF0Y2hfaWQsIHRpbWVzdGFtcCwgdG90YWxfZ2FtZXMsIGNvbXBsZXRlZF9nYW1lcywgdGhyZWFkcywgZWxhcHNlZF9tcywKICAgICAgICAgICAgIG1hc3Rlcl9zZWVkLCBlbmdpbmVfdmVyc2lvbiwgc2ltc19wZXJfc2VjLCBhdmdfZ2FtZV90dXJucywgcmVzdWx0X2pzb24pCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPykKICAgICAgICAiIiIpKSB7CiAgICAgICAgICAgIHBzLnNldFN0cmluZygxLCBtLmJhdGNoSWQpOwogICAgICAgICAgICBwcy5zZXRTdHJpbmcoMiwgbS50aW1lc3RhbXApOwogICAgICAgICAgICBwcy5zZXRJbnQoMywgbS50b3RhbEdhbWVzKTsKICAgICAgICAgICAgcHMuc2V0SW50KDQsIG0uY29tcGxldGVkR2FtZXMpOwogICAgICAgICAgICBwcy5zZXRJbnQoNSwgbS50aHJlYWRzKTsKICAgICAgICAgICAgcHMuc2V0TG9uZyg2LCBtLmVsYXBzZWRNcyk7CiAgICAgICAgICAgIGlmIChtLm1hc3RlclNlZWQgIT0gbnVsbCkgcHMuc2V0TG9uZyg3LCBtLm1hc3RlclNlZWQpOwogICAgICAgICAgICBlbHNlIHBzLnNldE51bGwoNywgVHlwZXMuSU5URUdFUik7CiAgICAgICAgICAgIHBzLnNldFN0cmluZyg4LCBtLmVuZ2luZVZlcnNpb24pOwogICAgICAgICAgICBwcy5zZXREb3VibGUoOSwgcmVzdWx0LnN1bW1hcnkuc2ltc1BlclNlY29uZCk7CiAgICAgICAgICAgIHBzLnNldERvdWJsZSgxMCwgcmVzdWx0LnN1bW1hcnkuYXZnR2FtZVR1cm5zKTsKICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDExLCBqc29uKTsKICAgICAgICAgICAgcHMuZXhlY3V0ZVVwZGF0ZSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5zZXJ0IHBlci1kZWNrIHJlc3VsdHMKICAgICAgICB0cnkgKFByZXBhcmVkU3RhdGVtZW50IHBzID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KCIiIgogICAgICAgICAgICBJTlNFUlQgSU5UTyBkZWNrX3Jlc3VsdHMKICAgICAgICAgICAgKGJhdGNoX2lkLCBzZWF0X2luZGV4LCBkZWNrX25hbWUsIGNvbW1hbmRlcl9uYW1lLCB3aW5zLCBsb3NzZXMsIGRyYXdzLAogICAgICAgICAgICAgd2luX3JhdGUsIGF2Z190dXJuc190b193aW4sIGF2Z19tdWxsaWdhbnMsIGF2Z19maW5hbF9saWZlLCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBzb3VyY2UsIHNvdXJjZV91cmwsIGFyY2hldHlwZSkKICAgICAgICAgICAgVkFMVUVTICg/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/KQogICAgICAgICIiIikpIHsKICAgICAgICAgICAgZm9yIChEZWNrU3VtbWFyeSBkcyA6IHJlc3VsdC5zdW1tYXJ5LnBlckRlY2spIHsKICAgICAgICAgICAgICAgIERlY2tJbmZvIGRlY2sgPSByZXN1bHQuZGVja3MuZ2V0KGRzLnNlYXRJbmRleCk7CiAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoMSwgbS5iYXRjaElkKTsKICAgICAgICAgICAgICAgIHBzLnNldEludCgyLCBkcy5zZWF0SW5kZXgpOwogICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDMsIGRzLmRlY2tOYW1lKTsKICAgICAgICAgICAgICAgIHBzLnNldFN0cmluZyg0LCBkZWNrLmNvbW1hbmRlck5hbWUpOwogICAgICAgICAgICAgICAgcHMuc2V0SW50KDUsIGRzLndpbnMpOwogICAgICAgICAgICAgICAgcHMuc2V0SW50KDYsIGRzLmxvc3Nlcyk7CiAgICAgICAgICAgICAgICBwcy5zZXRJbnQoNywgZHMuZHJhd3MpOwogICAgICAgICAgICAgICAgcHMuc2V0RG91YmxlKDgsIGRzLndpblJh' +
'dGUpOwogICAgICAgICAgICAgICAgaWYgKGRzLmF2Z1R1cm5zVG9XaW4gIT0gbnVsbCkgcHMuc2V0RG91YmxlKDksIGRzLmF2Z1R1cm5zVG9XaW4pOwogICAgICAgICAgICAgICAgZWxzZSBwcy5zZXROdWxsKDksIFR5cGVzLlJFQUwpOwogICAgICAgICAgICAgICAgcHMuc2V0RG91YmxlKDEwLCBkcy5hdmdNdWxsaWdhbnMpOwogICAgICAgICAgICAgICAgcHMuc2V0RG91YmxlKDExLCBkcy5hdmdGaW5hbExpZmUpOwogICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDEyLCBtLnRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoMTMsIGRlY2suc291cmNlKTsKICAgICAgICAgICAgICAgIHBzLnNldFN0cmluZygxNCwgZGVjay5zb3VyY2VVcmwpOwogICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDE1LCBkZWNrLmFyY2hldHlwZSk7CiAgICAgICAgICAgICAgICBwcy5hZGRCYXRjaCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBzLmV4ZWN1dGVCYXRjaCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5zZXJ0IG1hdGNodXAgZGF0YQogICAgICAgIGlmIChyZXN1bHQuZGVja3Muc2l6ZSgpID09IDMgJiYgcmVzdWx0LnN1bW1hcnkucGVyRGVjay5zaXplKCkgPT0gMykgewogICAgICAgICAgICB0cnkgKFByZXBhcmVkU3RhdGVtZW50IHBzID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KCIiIgogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gbWF0Y2h1cHMKICAgICAgICAgICAgICAgIChiYXRjaF9pZCwgZGVja19hLCBkZWNrX2IsIGRlY2tfYywgZGVja19hX3dpbnMsIGRlY2tfYl93aW5zLCBkZWNrX2Nfd2lucywgdG90YWxfZ2FtZXMsIHRpbWVzdGFtcCkKICAgICAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPykKICAgICAgICAgICAgIiIiKSkgewogICAgICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDEsIG0uYmF0Y2hJZCk7CiAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoMiwgcmVzdWx0LmRlY2tzLmdldCgwKS5kZWNrTmFtZSk7CiAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoMywgcmVzdWx0LmRlY2tzLmdldCgxKS5kZWNrTmFtZSk7CiAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoNCwgcmVzdWx0LmRlY2tzLmdldCgyKS5kZWNrTmFtZSk7CiAgICAgICAgICAgICAgICBwcy5zZXRJbnQoNSwgcmVzdWx0LnN1bW1hcnkucGVyRGVjay5nZXQoMCkud2lucyk7CiAgICAgICAgICAgICAgICBwcy5zZXRJbnQoNiwgcmVzdWx0LnN1bW1hcnkucGVyRGVjay5nZXQoMSkud2lucyk7CiAgICAgICAgICAgICAgICBwcy5zZXRJbnQoNywgcmVzdWx0LnN1bW1hcnkucGVyRGVjay5nZXQoMikud2lucyk7CiAgICAgICAgICAgICAgICBwcy5zZXRJbnQoOCwgbS5jb21wbGV0ZWRHYW1lcyk7CiAgICAgICAgICAgICAgICBwcy5zZXRTdHJpbmcoOSwgbS50aW1lc3RhbXApOwogICAgICAgICAgICAgICAgcHMuZXhlY3V0ZVVwZGF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gUXVlcmllcwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBHZXQgd2luIHJhdGUgaGlzdG9yeSBmb3IgYSBkZWNrIGFjcm9zcyBhbGwgYmF0Y2hlcy4KICAgICAqLwogICAgcHVibGljIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gZ2V0RGVja1dpblJhdGVIaXN0b3J5KFN0cmluZyBkZWNrTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBoaXN0b3J5ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgdHJ5IChQcmVwYXJlZFN0YXRlbWVudCBwcyA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudCgiIiIKICAgICAgICAgICAgU0VMRUNUIGJhdGNoX2lkLCB0aW1lc3RhbXAsIHdpbnMsIGxvc3NlcywgZHJhd3MsIHdpbl9y' +
'YXRlLAogICAgICAgICAgICAgICAgICAgYXZnX3R1cm5zX3RvX3dpbiwgYXZnX211bGxpZ2FucywgYXZnX2ZpbmFsX2xpZmUKICAgICAgICAgICAgRlJPTSBkZWNrX3Jlc3VsdHMKICAgICAgICAgICAgV0hFUkUgZGVja19uYW1lID0gPwogICAgICAgICAgICBPUkRFUiBCWSB0aW1lc3RhbXAgQVNDCiAgICAgICAgIiIiKSkgewogICAgICAgICAgICBwcy5zZXRTdHJpbmcoMSwgZGVja05hbWUpOwogICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBwcy5leGVjdXRlUXVlcnkoKTsKICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICAgICByb3cucHV0KCJiYXRjaElkIiwgcnMuZ2V0U3RyaW5nKCJiYXRjaF9pZCIpKTsKICAgICAgICAgICAgICAgIHJvdy5wdXQoInRpbWVzdGFtcCIsIHJzLmdldFN0cmluZygidGltZXN0YW1wIikpOwogICAgICAgICAgICAgICAgcm93LnB1dCgid2lucyIsIHJzLmdldEludCgid2lucyIpKTsKICAgICAgICAgICAgICAgIHJvdy5wdXQoImxvc3NlcyIsIHJzLmdldEludCgibG9zc2VzIikpOwogICAgICAgICAgICAgICAgcm93LnB1dCgiZHJhd3MiLCBycy5nZXRJbnQoImRyYXdzIikpOwogICAgICAgICAgICAgICAgcm93LnB1dCgid2luUmF0ZSIsIHJzLmdldERvdWJsZSgid2luX3JhdGUiKSk7CiAgICAgICAgICAgICAgICByb3cucHV0KCJhdmdUdXJuc1RvV2luIiwgcnMuZ2V0T2JqZWN0KCJhdmdfdHVybnNfdG9fd2luIikpOwogICAgICAgICAgICAgICAgcm93LnB1dCgiYXZnTXVsbGlnYW5zIiwgcnMuZ2V0RG91YmxlKCJhdmdfbXVsbGlnYW5zIikpOwogICAgICAgICAgICAgICAgcm93LnB1dCgiYXZnRmluYWxMaWZlIiwgcnMuZ2V0RG91YmxlKCJhdmdfZmluYWxfbGlmZSIpKTsKICAgICAgICAgICAgICAgIGhpc3RvcnkuYWRkKHJvdyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhpc3Rvcnk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgb3ZlcmFsbCBzdGF0cyBmb3IgYSBkZWNrIChhZ2dyZWdhdGVkIGFjcm9zcyBhbGwgYmF0Y2hlcykuCiAgICAgKi8KICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldERlY2tPdmVyYWxsU3RhdHMoU3RyaW5nIGRlY2tOYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHN0YXRzID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgIHRyeSAoUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIiIiCiAgICAgICAgICAgIFNFTEVDVAogICAgICAgICAgICAgICAgQ09VTlQoKikgYXMgYmF0Y2hfY291bnQsCiAgICAgICAgICAgICAgICBTVU0od2lucykgYXMgdG90YWxfd2lucywKICAgICAgICAgICAgICAgIFNVTShsb3NzZXMpIGFzIHRvdGFsX2xvc3NlcywKICAgICAgICAgICAgICAgIFNVTShkcmF3cykgYXMgdG90YWxfZHJhd3MsCiAgICAgICAgICAgICAgICBBVkcod2luX3JhdGUpIGFzIGF2Z193aW5fcmF0ZSwKICAgICAgICAgICAgICAgIE1JTih3aW5fcmF0ZSkgYXMgbWluX3dpbl9yYXRlLAogICAgICAgICAgICAgICAgTUFYKHdpbl9yYXRlKSBhcyBtYXhfd2luX3JhdGUsCiAgICAgICAgICAgICAgICBBVkcoYXZnX3R1cm5zX3RvX3dpbikgYXMgYXZnX3R1cm5zLAogICAgICAgICAgICAgICAgQVZHKGF2Z19tdWxsaWdhbnMpIGFzIGF2Z19tdWxsaWdhbnMKICAgICAgICAgICAgRlJPTSBkZWNrX3Jlc3VsdHMgV0hFUkUgZGVja19uYW1lID0gPwogICAgICAgICIiIikpIHsKICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDEsIGRlY2tOYW1lKTsKICAgICAgICAgICAgUmVzdWx0U2V0IHJzID0gcHMuZXhlY3V0ZVF1ZXJ5KCk7CiAgICAgICAgICAgIGlmIChycy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIHN0YXRzLnB1dCgiZGVja05hbWUiLCBkZWNrTmFtZSk7CiAgICAgICAgICAgICAgICBzdGF0cy5wdXQoImJhdGNoQ291bnQiLCBycy5nZXRJbnQoImJhdGNoX2NvdW50IikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJ0b3RhbFdpbnMiLCBycy5nZXRJbnQoInRvdGFsX3dpbnMiKSk7CiAgICAgICAgICAgICAgICBzdGF0cy5wdXQoInRvdGFsTG9zc2VzIiwgcnMuZ2V0SW50KCJ0b3RhbF9sb3NzZXMiKSk7CiAgICAgICAgICAgICAgICBzdGF0cy5wdXQoInRvdGFsRHJhd3MiLCBycy5nZXRJbnQoInRvdGFsX2RyYXdz' +
'IikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJhdmdXaW5SYXRlIiwgcnMuZ2V0RG91YmxlKCJhdmdfd2luX3JhdGUiKSk7CiAgICAgICAgICAgICAgICBzdGF0cy5wdXQoIm1pbldpblJhdGUiLCBycy5nZXREb3VibGUoIm1pbl93aW5fcmF0ZSIpKTsKICAgICAgICAgICAgICAgIHN0YXRzLnB1dCgibWF4V2luUmF0ZSIsIHJzLmdldERvdWJsZSgibWF4X3dpbl9yYXRlIikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJhdmdUdXJucyIsIHJzLmdldE9iamVjdCgiYXZnX3R1cm5zIikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJhdmdNdWxsaWdhbnMiLCBycy5nZXREb3VibGUoImF2Z19tdWxsaWdhbnMiKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0YXRzOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGFsbCB1bmlxdWUgZGVjayBuYW1lcyB0aGF0IGhhdmUgYmVlbiB0ZXN0ZWQuCiAgICAgKi8KICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsVGVzdGVkRGVja3MoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICBMaXN0PFN0cmluZz4gZGVja3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICB0cnkgKFN0YXRlbWVudCBzID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKICAgICAgICAgICAgIFJlc3VsdFNldCBycyA9IHMuZXhlY3V0ZVF1ZXJ5KAogICAgICAgICAgICAgICAgIlNFTEVDVCBESVNUSU5DVCBkZWNrX25hbWUgRlJPTSBkZWNrX3Jlc3VsdHMgT1JERVIgQlkgZGVja19uYW1lIikpIHsKICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgZGVja3MuYWRkKHJzLmdldFN0cmluZygiZGVja19uYW1lIikpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWNrczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCByZWNlbnQgYmF0Y2ggcnVucyAobW9zdCByZWNlbnQgZmlyc3QpLgogICAgICovCiAgICBwdWJsaWMgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRSZWNlbnRCYXRjaGVzKGludCBsaW1pdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBiYXRjaGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgdHJ5IChQcmVwYXJlZFN0YXRlbWVudCBwcyA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudCgiIiIKICAgICAgICAgICAgU0VMRUNUIGJhdGNoX2lkLCB0aW1lc3RhbXAsIHRvdGFsX2dhbWVzLCBjb21wbGV0ZWRfZ2FtZXMsIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICBlbGFwc2VkX21zLCBzaW1zX3Blcl9zZWMsIGF2Z19nYW1lX3R1cm5zCiAgICAgICAgICAgIEZST00gYmF0Y2hfcnVucyBPUkRFUiBCWSB0aW1lc3RhbXAgREVTQyBMSU1JVCA/CiAgICAgICAgIiIiKSkgewogICAgICAgICAgICBwcy5zZXRJbnQoMSwgbGltaXQpOwogICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBwcy5leGVjdXRlUXVlcnkoKTsKICAgICAgICAgICAgd2hpbGUgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICAgICByb3cucHV0KCJiYXRjaElkIiwgcnMuZ2V0U3RyaW5nKCJiYXRjaF9pZCIpKTsKICAgICAgICAgICAgICAgIHJvdy5wdXQoInRpbWVzdGFtcCIsIHJzLmdldFN0cmluZygidGltZXN0YW1wIikpOwogICAgICAgICAgICAgICAgcm93LnB1dCgidG90YWxHYW1lcyIsIHJzLmdldEludCgidG90YWxfZ2FtZXMiKSk7CiAgICAgICAgICAgICAgICByb3cucHV0KCJjb21wbGV0ZWRHYW1lcyIsIHJzLmdldEludCgiY29tcGxldGVkX2dhbWVzIikpOwogICAgICAgICAgICAgICAgcm93LnB1dCgidGhyZWFkcyIsIHJzLmdldEludCgidGhyZWFkcyIpKTsKICAgICAgICAgICAgICAgIHJvdy5wdXQoImVsYXBzZWRNcyIsIHJzLmdldExvbmcoImVsYXBzZWRfbXMiKSk7CiAgICAgICAgICAgICAgICByb3cucHV0KCJzaW1zUGVyU2VjIiwgcnMuZ2V0RG91YmxlKCJzaW1zX3Blcl9zZWMiKSk7CiAgICAgICAgICAgICAgICByb3cucHV0KCJhdmdHYW1lVHVybnMiLCBycy5nZXREb3VibGUoImF2Z19nYW1lX3R1cm5zIikpOwogICAgICAgICAgICAgICAgYmF0Y2hlcy5hZGQocm93KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYmF0Y2hlczsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBmdWxsIGJhdGNoIHJlc3VsdCBKU09OIGJ5IGJh' +
'dGNoSWQuCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmF0Y2hSZXN1bHRKc29uKFN0cmluZyBiYXRjaElkKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICB0cnkgKFByZXBhcmVkU3RhdGVtZW50IHBzID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KAogICAgICAgICAgICAgICAgIlNFTEVDVCByZXN1bHRfanNvbiBGUk9NIGJhdGNoX3J1bnMgV0hFUkUgYmF0Y2hfaWQgPSA/IikpIHsKICAgICAgICAgICAgcHMuc2V0U3RyaW5nKDEsIGJhdGNoSWQpOwogICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBwcy5leGVjdXRlUXVlcnkoKTsKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgcmV0dXJuIHJzLmdldFN0cmluZygicmVzdWx0X2pzb24iKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgbWF0Y2h1cCB3aW4gcmF0ZXMgZm9yIGEgc3BlY2lmaWMgMy1kZWNrIHBvZC4KICAgICAqLwogICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0TWF0Y2h1cFN0YXRzKFN0cmluZyBkZWNrQSwgU3RyaW5nIGRlY2tCLCBTdHJpbmcgZGVja0MpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RhdHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgdHJ5IChQcmVwYXJlZFN0YXRlbWVudCBwcyA9IGNvbm4ucHJlcGFyZVN0YXRlbWVudCgiIiIKICAgICAgICAgICAgU0VMRUNUCiAgICAgICAgICAgICAgICBDT1VOVCgqKSBhcyBtYXRjaF9jb3VudCwKICAgICAgICAgICAgICAgIFNVTSh0b3RhbF9nYW1lcykgYXMgdG90YWxfZ2FtZXMsCiAgICAgICAgICAgICAgICBTVU0oZGVja19hX3dpbnMpIGFzIGFfd2lucywKICAgICAgICAgICAgICAgIFNVTShkZWNrX2Jfd2lucykgYXMgYl93aW5zLAogICAgICAgICAgICAgICAgU1VNKGRlY2tfY193aW5zKSBhcyBjX3dpbnMKICAgICAgICAgICAgRlJPTSBtYXRjaHVwcwogICAgICAgICAgICBXSEVSRSBkZWNrX2EgPSA/IEFORCBkZWNrX2IgPSA/IEFORCBkZWNrX2MgPSA/CiAgICAgICAgIiIiKSkgewogICAgICAgICAgICBwcy5zZXRTdHJpbmcoMSwgZGVja0EpOwogICAgICAgICAgICBwcy5zZXRTdHJpbmcoMiwgZGVja0IpOwogICAgICAgICAgICBwcy5zZXRTdHJpbmcoMywgZGVja0MpOwogICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBwcy5leGVjdXRlUXVlcnkoKTsKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgaW50IHRvdGFsR2FtZXMgPSBycy5nZXRJbnQoInRvdGFsX2dhbWVzIik7CiAgICAgICAgICAgICAgICBzdGF0cy5wdXQoIm1hdGNoQ291bnQiLCBycy5nZXRJbnQoIm1hdGNoX2NvdW50IikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJ0b3RhbEdhbWVzIiwgdG90YWxHYW1lcyk7CiAgICAgICAgICAgICAgICBzdGF0cy5wdXQoImRlY2tBV2lucyIsIHJzLmdldEludCgiYV93aW5zIikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJkZWNrQldpbnMiLCBycy5nZXRJbnQoImJfd2lucyIpKTsKICAgICAgICAgICAgICAgIHN0YXRzLnB1dCgiZGVja0NXaW5zIiwgcnMuZ2V0SW50KCJjX3dpbnMiKSk7CiAgICAgICAgICAgICAgICBpZiAodG90YWxHYW1lcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICBzdGF0cy5wdXQoImRlY2tBV2luUmF0ZSIsIChkb3VibGUpIHJzLmdldEludCgiYV93aW5zIikgLyB0b3RhbEdhbWVzKTsKICAgICAgICAgICAgICAgICAgICBzdGF0cy5wdXQoImRlY2tCV2luUmF0ZSIsIChkb3VibGUpIHJzLmdldEludCgiYl93aW5zIikgLyB0b3RhbEdhbWVzKTsKICAgICAgICAgICAgICAgICAgICBzdGF0cy5wdXQoImRlY2tDV2luUmF0ZSIsIChkb3VibGUpIHJzLmdldEludCgiY193aW5zIikgLyB0b3RhbEdhbWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhdHM7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBEZWNrIEFuYWx5c2lzIFN0b3JhZ2UKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV' +
'kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogU3RvcmUgYSBkZWNrIGFuYWx5c2lzIHNuYXBzaG90LgogICAgICovCiAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZURlY2tBbmFseXNpcyhEZWNrQW5hbHlzaXMgYW5hbHlzaXMpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgIFN0cmluZyBqc29uID0gR1NPTi50b0pzb24oYW5hbHlzaXMpOwogICAgICAgIHRyeSAoUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIiIiCiAgICAgICAgICAgIElOU0VSVCBJTlRPIGRlY2tfYW5hbHlzZXMKICAgICAgICAgICAgKGRlY2tfbmFtZSwgY29tbWFuZGVyX25hbWUsIHRvdGFsX2NhcmRzLCBsYW5kcywgY3JlYXR1cmVzLAogICAgICAgICAgICAgcmFtcF9jYXJkcywgcmVtb3ZhbF9jYXJkcywgZHJhd19jYXJkcywgYm9hcmRfd2lwZXMsIGFuYWx5c2lzX2pzb24pCiAgICAgICAgICAgIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPywgPywgPykKICAgICAgICAiIiIpKSB7CiAgICAgICAgICAgIHBzLnNldFN0cmluZygxLCBhbmFseXNpcy5kZWNrTmFtZSk7CiAgICAgICAgICAgIHBzLnNldFN0cmluZygyLCBhbmFseXNpcy5jb21tYW5kZXJOYW1lKTsKICAgICAgICAgICAgcHMuc2V0SW50KDMsIGFuYWx5c2lzLnRvdGFsQ2FyZHMpOwogICAgICAgICAgICBwcy5zZXRJbnQoNCwgYW5hbHlzaXMubGFuZHMpOwogICAgICAgICAgICBwcy5zZXRJbnQoNSwgYW5hbHlzaXMuY3JlYXR1cmVzKTsKICAgICAgICAgICAgcHMuc2V0SW50KDYsIGFuYWx5c2lzLnJhbXBDYXJkcyk7CiAgICAgICAgICAgIHBzLnNldEludCg3LCBhbmFseXNpcy5yZW1vdmFsQ2FyZHMpOwogICAgICAgICAgICBwcy5zZXRJbnQoOCwgYW5hbHlzaXMuZHJhd0NhcmRzKTsKICAgICAgICAgICAgcHMuc2V0SW50KDksIGFuYWx5c2lzLmJvYXJkV2lwZXMpOwogICAgICAgICAgICBwcy5zZXRTdHJpbmcoMTAsIGpzb24pOwogICAgICAgICAgICBwcy5leGVjdXRlVXBkYXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogR2V0IHRoZSBsYXRlc3QgZGVjayBhbmFseXNpcyBmb3IgYSBkZWNrLgogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGdldExhdGVzdERlY2tBbmFseXNpcyhTdHJpbmcgZGVja05hbWUpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgIHRyeSAoUHJlcGFyZWRTdGF0ZW1lbnQgcHMgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoIiIiCiAgICAgICAgICAgIFNFTEVDVCBhbmFseXNpc19qc29uIEZST00gZGVja19hbmFseXNlcwogICAgICAgICAgICBXSEVSRSBkZWNrX25hbWUgPSA/IE9SREVSIEJZIGNyZWF0ZWRfYXQgREVTQyBMSU1JVCAxCiAgICAgICAgIiIiKSkgewogICAgICAgICAgICBwcy5zZXRTdHJpbmcoMSwgZGVja05hbWUpOwogICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBwcy5leGVjdXRlUXVlcnkoKTsKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgcmV0dXJuIHJzLmdldFN0cmluZygiYW5hbHlzaXNfanNvbiIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIFN0YXRzIFN1bW1hcnkKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogR2V0IGEgZ2xvYmFsIHN0YXRzIHN1bW1hcnkgYWNyb3NzIGFsbCBiYXRjaGVzLgogICAgICovCiAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRHbG9iYWxTdGF0cygpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RhdHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7' +
'CiAgICAgICAgdHJ5IChTdGF0ZW1lbnQgcyA9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCkpIHsKICAgICAgICAgICAgUmVzdWx0U2V0IHJzID0gcy5leGVjdXRlUXVlcnkoIiIiCiAgICAgICAgICAgICAgICBTRUxFQ1QKICAgICAgICAgICAgICAgICAgICBDT1VOVCgqKSBhcyB0b3RhbF9iYXRjaGVzLAogICAgICAgICAgICAgICAgICAgIFNVTShjb21wbGV0ZWRfZ2FtZXMpIGFzIHRvdGFsX2dhbWVzLAogICAgICAgICAgICAgICAgICAgIEFWRyhzaW1zX3Blcl9zZWMpIGFzIGF2Z19zaW1zX3NlYywKICAgICAgICAgICAgICAgICAgICBBVkcoYXZnX2dhbWVfdHVybnMpIGFzIGF2Z190dXJucywKICAgICAgICAgICAgICAgICAgICBTVU0oZWxhcHNlZF9tcykgYXMgdG90YWxfdGltZV9tcwogICAgICAgICAgICAgICAgRlJPTSBiYXRjaF9ydW5zCiAgICAgICAgICAgICIiIik7CiAgICAgICAgICAgIGlmIChycy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgIHN0YXRzLnB1dCgidG90YWxCYXRjaGVzIiwgcnMuZ2V0SW50KCJ0b3RhbF9iYXRjaGVzIikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJ0b3RhbEdhbWVzIiwgcnMuZ2V0SW50KCJ0b3RhbF9nYW1lcyIpKTsKICAgICAgICAgICAgICAgIHN0YXRzLnB1dCgiYXZnU2ltc1BlclNlYyIsIHJzLmdldERvdWJsZSgiYXZnX3NpbXNfc2VjIikpOwogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJhdmdHYW1lVHVybnMiLCBycy5nZXREb3VibGUoImF2Z190dXJucyIpKTsKICAgICAgICAgICAgICAgIHN0YXRzLnB1dCgidG90YWxUaW1lTXMiLCBycy5nZXRMb25nKCJ0b3RhbF90aW1lX21zIikpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDb3VudCB1bmlxdWUgZGVja3MgdGVzdGVkCiAgICAgICAgICAgIHJzID0gcy5leGVjdXRlUXVlcnkoIlNFTEVDVCBDT1VOVChESVNUSU5DVCBkZWNrX25hbWUpIGFzIGRlY2tfY291bnQgRlJPTSBkZWNrX3Jlc3VsdHMiKTsKICAgICAgICAgICAgaWYgKHJzLm5leHQoKSkgewogICAgICAgICAgICAgICAgc3RhdHMucHV0KCJ1bmlxdWVEZWNrcyIsIHJzLmdldEludCgiZGVja19jb3VudCIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhdHM7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgIGlmIChjb25uICE9IG51bGwgJiYgIWNvbm4uaXNDbG9zZWQoKSkgewogICAgICAgICAgICBjb25uLmNsb3NlKCk7CiAgICAgICAgfQogICAgfQp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\db\LabDatabase.java' -B $b
# src/main/java/commanderailab/meta/CommanderMetaService.java (9,672 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tZXRhOwoKaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi4qOwppbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOwoKaW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEubmlvLmZpbGUuKjsKaW1wb3J0IGphdmEudXRpbC4qOwoKLyoqCiAqIENvbW1hbmRlck1ldGFTZXJ2aWNlIOKAlCBQcm92aWRlcyBjdXJhdGVkIG1ldGEgZGVjayBtYXBwaW5ncyBmb3IgcG9wdWxhciBjb21tYW5kZXJzLgogKgogKiBNYXBzIGNvbW1hbmRlciBuYW1lcyB0byByZWNvbW1lbmRlZCBtZXRhIGRlY2sgc291cmNlcyAoRURIUkVDIGF2ZXJhZ2UsIGN1cmF0ZWQgbGlzdHMpLgogKiBUaGUgbWFwcGluZyBpcyBzdG9yZWQgYXMgYSBKU09OIGZpbGUgKGNvbW1hbmRlci1tZXRhLmpzb24pIGFsb25nc2lkZSB0aGUgSkFSLAogKiBhbmQgY2FuIGJlIGV4dGVuZGVkIGJ5IHRoZSB1c2VyLgogKgogKiBVc2FnZToKICogICBDb21tYW5kZXJNZXRhU2VydmljZS5sb2FkTWFwcGluZygiY29tbWFuZGVyLW1ldGEuanNvbiIpOwogKiAgIExpc3Q8TWV0YURlY2tFbnRyeT4gZGVja3MgPSBDb21tYW5kZXJNZXRhU2VydmljZS5nZXRNZXRhRGVja3MoIkVkZ2FyIE1hcmtvdiIpOwogKi8KcHVibGljIGNsYXNzIENvbW1hbmRlck1ldGFTZXJ2aWNlIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHc29uIEdTT04gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOwoKICAgIC8qKiBDb21tYW5kZXIgbmFtZSAobG93ZXJjYXNlZCkg4oaSIGxpc3Qgb2YgbWV0YSBkZWNrIGVudHJpZXMgKi8KICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q8TWV0YURlY2tFbnRyeT4+IG1hcHBpbmcgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CgogICAgLyoqIEFsbCBrbm93biBjb21tYW5kZXJzIChmb3IgYXV0b2NvbXBsZXRlIC8gbGlzdGluZykgKi8KICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBrbm93bkNvbW1hbmRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAvLyDilIDilIAgRGF0YSBtb2RlbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldGFEZWNrRW50cnkgewogICAgICAgIHB1YmxpYyBTdHJpbmcgY29tbWFuZGVyOyAgICAgICAgLy8gQ2Fub25pY2FsIGNvbW1hbmRlciBuYW1lCiAgICAgICAgcHVibGljIFN0cmluZyBsYWJlbDsgICAgICAgICAgICAvLyBEaXNwbGF5IGxhYmVsIChlLmcuLCAiRURIUkVDIEF2ZXJhZ2UiLCAiSGlnaCBQb3dlciBBZ2dybyIpCiAgICAgICAgcHVibGljIFN0cmluZyBzb3VyY2U7ICAgICAgICAgICAvLyBTb3VyY2UgdHlwZTogImVkaHJlYyIsICJhcmNoaWRla3QiLCAiY3VyYXRlZCIKICAgICAgICBwdWJsaWMgU3RyaW5nIHVybDsgICAgICAgICAgICAgIC8vIFVSTCB0byBmZXRjaC9yZWZlcmVuY2UKICAgICAgICBwdWJsaWMgU3RyaW5nIGFyY2hldHlwZTsgICAgICAgIC8vIE9wdGlvbmFsOiBhZ2dybywgY29udHJvbCwgY29tYm8sIG1pZHJhbmdlLCBzdGF4CiAgICAgICAgcHVibGljIFN0cmluZ1tdIGNvbG9ySWRlbnRpdHk7ICAvLyBlLmcuLCBbIlciLCJCIiwiUiJdCiAgICAgICAgcHVibGljIFN0cmluZyBub3RlczsgICAgICAgICAgICAvLyBPcHRpb25hbCBub3RlcwoKICAgICAgICBwdWJsaWMgTWV0YURlY2tFbnRyeSgpIHt9CgogICAgICAgIHB1YmxpYyBNZXRhRGVja0VudHJ5KFN0cmluZyBjb21tYW5kZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHVybCkgewogICAgICAgICAgICB0aGlzLmNvbW1hbmRlciA9IGNvbW1hbmRlcjsKICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOwogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgdGhpcy51cmwgPSB1cmw7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMg4oCUICVzICglcykiLCBjb21tYW5kZXIsIGxhYmVsLCBzb3VyY2UpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi' +
'lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIE1hcHBpbmcgTWFuYWdlbWVudAogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBMb2FkIHRoZSBjb21tYW5kZXLihpJtZXRhIGRlY2sgbWFwcGluZyBmcm9tIGEgSlNPTiBmaWxlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9hZE1hcHBpbmcoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGlmICghRmlsZXMuZXhpc3RzKFBhdGgub2YoZmlsZVBhdGgpKSkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgW01ldGFdIE5vIGNvbW1hbmRlci1tZXRhLmpzb24gZm91bmQsIHVzaW5nIGJ1aWx0LWluIGRlZmF1bHRzLiIpOwogICAgICAgICAgICBsb2FkQnVpbHRpbkRlZmF1bHRzKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFN0cmluZyBqc29uID0gRmlsZXMucmVhZFN0cmluZyhQYXRoLm9mKGZpbGVQYXRoKSk7CiAgICAgICAgbG9hZEZyb21Kc29uKGpzb24pOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFtNZXRhXSBMb2FkZWQgJWQgY29tbWFuZGVycyBmcm9tICVzJW4iLCBrbm93bkNvbW1hbmRlcnMuc2l6ZSgpLCBmaWxlUGF0aCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMb2FkIG1hcHBpbmcgZnJvbSBhIEpTT04gc3RyaW5nLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEZyb21Kc29uKFN0cmluZyBqc29uKSB7CiAgICAgICAgSnNvbk9iamVjdCByb290ID0gSnNvblBhcnNlci5wYXJzZVN0cmluZyhqc29uKS5nZXRBc0pzb25PYmplY3QoKTsKICAgICAgICBtYXBwaW5nLmNsZWFyKCk7CiAgICAgICAga25vd25Db21tYW5kZXJzLmNsZWFyKCk7CgogICAgICAgIGZvciAodmFyIGVudHJ5IDogcm9vdC5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgIFN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsgIC8vIENvbW1hbmRlciBuYW1lIChjYW5vbmljYWwpCiAgICAgICAgICAgIEpzb25BcnJheSBhcnIgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldEFzSnNvbkFycmF5KCk7CiAgICAgICAgICAgIExpc3Q8TWV0YURlY2tFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgICAgICAgICAgZm9yIChKc29uRWxlbWVudCBlbCA6IGFycikgewogICAgICAgICAgICAgICAgTWV0YURlY2tFbnRyeSBtZGUgPSBHU09OLmZyb21Kc29uKGVsLCBNZXRhRGVja0VudHJ5LmNsYXNzKTsKICAgICAgICAgICAgICAgIGlmIChtZGUuY29tbWFuZGVyID09IG51bGwpIG1kZS5jb21tYW5kZXIgPSBrZXk7CiAgICAgICAgICAgICAgICBlbnRyaWVzLmFkZChtZGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtYXBwaW5nLnB1dChrZXkudG9Mb3dlckNhc2UoKSwgZW50cmllcyk7CiAgICAgICAgICAgIGtub3duQ29tbWFuZGVycy5hZGQoa2V5KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBTYXZlIHRoZSBjdXJyZW50IG1hcHBpbmcgdG8gYSBKU09OIGZpbGUuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlTWFwcGluZyhTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgLy8gUmVjb25zdHJ1Y3Qgd2l0aCBjYW5vbmljYWwgbmFtZXMgYXMga2V5cwogICAgICAgIEpzb25PYmplY3Qgcm9vdCA9IG5ldyBKc29uT2JqZWN0KCk7CiAgICAgICAgZm9yIChTdHJpbmcgY29tbWFuZGVyIDoga25vd25Db21tYW5kZXJzKSB7CiAgICAgICAgICAgIExpc3Q8TWV0YURlY2tFbnRyeT4gZW50cmllcyA9IG1hcHBpbmcuZ2V0KGNvbW1hbmRlci50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgICAgaWYgKGVudHJpZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcm9vdC5hZGQoY29tbWFuZGVyLCBHU09OLnRvSnNvblRyZWUoZW50cmllcykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEZpbGVzLndyaXRlU3RyaW5nKFBhdGgub2YoZmlsZVBhdGgpLCBHU09OLnRvSnNvbihy' +
'b290KSk7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBRdWVyaWVzCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIEdldCBtZXRhIGRlY2sgZW50cmllcyBmb3IgYSBjb21tYW5kZXIuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxNZXRhRGVja0VudHJ5PiBnZXRNZXRhRGVja3MoU3RyaW5nIGNvbW1hbmRlck5hbWUpIHsKICAgICAgICByZXR1cm4gbWFwcGluZy5nZXRPckRlZmF1bHQoY29tbWFuZGVyTmFtZS50b0xvd2VyQ2FzZSgpLCBMaXN0Lm9mKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgaWYgYSBjb21tYW5kZXIgaGFzIG1ldGEgZGVjayBlbnRyaWVzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTWV0YURlY2tzKFN0cmluZyBjb21tYW5kZXJOYW1lKSB7CiAgICAgICAgcmV0dXJuIG1hcHBpbmcuY29udGFpbnNLZXkoY29tbWFuZGVyTmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldCBhbGwga25vd24gY29tbWFuZGVyIG5hbWVzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbGxDb21tYW5kZXJzKCkgewogICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGtub3duQ29tbWFuZGVycyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZWFyY2ggY29tbWFuZGVycyBieSBwYXJ0aWFsIG5hbWUgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBzZWFyY2hDb21tYW5kZXJzKFN0cmluZyBxdWVyeSkgewogICAgICAgIFN0cmluZyBsb3dlciA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgcmV0dXJuIGtub3duQ29tbWFuZGVycy5zdHJlYW0oKQogICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+IGMudG9Mb3dlckNhc2UoKS5jb250YWlucyhsb3dlcikpCiAgICAgICAgICAgICAgICAudG9MaXN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGZpcnN0L2RlZmF1bHQgbWV0YSBkZWNrIGZvciBhIGNvbW1hbmRlci4KICAgICAqIFVzdWFsbHkgdGhlIEVESFJFQyBhdmVyYWdlIGRlY2suCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgTWV0YURlY2tFbnRyeSBnZXREZWZhdWx0TWV0YURlY2soU3RyaW5nIGNvbW1hbmRlck5hbWUpIHsKICAgICAgICBMaXN0PE1ldGFEZWNrRW50cnk+IGVudHJpZXMgPSBnZXRNZXRhRGVja3MoY29tbWFuZGVyTmFtZSk7CiAgICAgICAgcmV0dXJuIGVudHJpZXMuaXNFbXB0eSgpID8gbnVsbCA6IGVudHJpZXMuZ2V0KDApOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gQnVpbHQtaW4gRGVmYXVsdHMKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogTG9hZCBhIGN1cmF0ZWQgc2V0IG9mIHBvcHVsYXIgY29tbWFuZGVycyB3aXRoIEVESFJFQyBhdmVyYWdlIGRlY2sgbGlua3MuCiAgICAgKiBUaGVzZSBjb3ZlciB0aGUgbW9zdCBjb21tb25seSB0ZXN0ZWQgY29tbWFuZGVycy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRCdWlsdGluRGVmYXVsdHMoKSB7CiAgICAgICAgbWFwcGluZy5jbGVhcigp' +
'OwogICAgICAgIGtub3duQ29tbWFuZGVycy5jbGVhcigpOwoKICAgICAgICBhZGREZWZhdWx0KCJFZGdhciBNYXJrb3YiLCBuZXcgU3RyaW5nW117IlciLCJCIiwiUiJ9LCAiYWdncm8iLAogICAgICAgICAgICAgICAgImh0dHBzOi8vZWRocmVjLmNvbS9hdmVyYWdlLWRlY2tzL2VkZ2FyLW1hcmtvdiIpOwogICAgICAgIGFkZERlZmF1bHQoIkF0cmF4YSwgUHJhZXRvcnMnIFZvaWNlIiwgbmV3IFN0cmluZ1tdeyJXIiwiVSIsIkIiLCJHIn0sICJtaWRyYW5nZSIsCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvYXRyYXhhLXByYWV0b3JzLXZvaWNlIik7CiAgICAgICAgYWRkRGVmYXVsdCgiS29ydm9sZCwgRmFlLUN1cnNlZCBLaW5nIiwgbmV3IFN0cmluZ1tdeyJCIiwiUiIsIkcifSwgImNvbWJvIiwKICAgICAgICAgICAgICAgICJodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy9rb3J2b2xkLWZhZS1jdXJzZWQta2luZyIpOwogICAgICAgIGFkZERlZmF1bHQoIk11bGRyb3RoYSwgdGhlIEdyYXZldGlkZSIsIG5ldyBTdHJpbmdbXXsiVSIsIkIiLCJHIn0sICJtaWRyYW5nZSIsCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvbXVsZHJvdGhhLXRoZS1ncmF2ZXRpZGUiKTsKICAgICAgICBhZGREZWZhdWx0KCJUaGUgVXItRHJhZ29uIiwgbmV3IFN0cmluZ1tdeyJXIiwiVSIsIkIiLCJSIiwiRyJ9LCAibWlkcmFuZ2UiLAogICAgICAgICAgICAgICAgImh0dHBzOi8vZWRocmVjLmNvbS9hdmVyYWdlLWRlY2tzL3RoZS11ci1kcmFnb24iKTsKICAgICAgICBhZGREZWZhdWx0KCJZdXJpa28sIHRoZSBUaWdlcidzIFNoYWRvdyIsIG5ldyBTdHJpbmdbXXsiVSIsIkIifSwgImFnZ3JvIiwKICAgICAgICAgICAgICAgICJodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy95dXJpa28tdGhlLXRpZ2Vycy1zaGFkb3ciKTsKICAgICAgICBhZGREZWZhdWx0KCJLcmVua28sIE1vYiBCb3NzIiwgbmV3IFN0cmluZ1tdeyJSIn0sICJhZ2dybyIsCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3Mva3JlbmtvLW1vYi1ib3NzIik7CiAgICAgICAgYWRkRGVmYXVsdCgiTWVyZW4gb2YgQ2xhbiBOZWwgVG90aCIsIG5ldyBTdHJpbmdbXXsiQiIsIkcifSwgIm1pZHJhbmdlIiwKICAgICAgICAgICAgICAgICJodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy9tZXJlbi1vZi1jbGFuLW5lbC10b3RoIik7CiAgICAgICAgYWRkRGVmYXVsdCgiUHJvc3NoLCBTa3lyYWlkZXIgb2YgS2hlciIsIG5ldyBTdHJpbmdbXXsiQiIsIlIiLCJHIn0sICJjb21ibyIsCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvcHJvc3NoLXNreXJhaWRlci1vZi1raGVyIik7CiAgICAgICAgYWRkRGVmYXVsdCgiS2FhbGlhIG9mIHRoZSBWYXN0IiwgbmV3IFN0cmluZ1tdeyJXIiwiQiIsIlIifSwgImFnZ3JvIiwKICAgICAgICAgICAgICAgICJodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy9rYWFsaWEtb2YtdGhlLXZhc3QiKTsKICAgICAgICBhZGREZWZhdWx0KCJXaW5kZ3JhY2UiLCBuZXcgU3RyaW5nW117IkIiLCJSIiwiRyJ9LCAibWlkcmFuZ2UiLAogICAgICAgICAgICAgICAgImh0dHBzOi8vZWRocmVjLmNvbS9hdmVyYWdlLWRlY2tzL2xvcmQtd2luZGdyYWNlIik7CiAgICAgICAgYWRkRGVmYXVsdCgiVGFscmFuZCwgU2t5IFN1bW1vbmVyIiwgbmV3IFN0cmluZ1tdeyJVIn0sICJjb250cm9sIiwKICAgICAgICAgICAgICAgICJodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy90YWxyYW5kLXNreS1zdW1tb25lciIpOwogICAgICAgIGFkZERlZmF1bHQoIk9tbmF0aCwgTG9jdXMgb2YgQ3JlYXRpb24iLCBuZXcgU3RyaW5nW117IlciLCJVIiwiUiIsIkcifSwgImNvbWJvIiwKICAgICAgICAgICAgICAgICJodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy9vbW5hdGgtbG9jdXMtb2YtY3JlYXRpb24iKTsKICAgICAgICBhZGREZWZhdWx0KCJUZXlzYSBLYXJsb3YiLCBuZXcgU3RyaW5nW117IlciLCJCIn0sICJjb21ibyIsCiAgICAgICAgICAgICAgICAiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvdGV5c2Eta2FybG92Iik7CiAgICAgICAgYWRkRGVmYXVsdCgiTGF0aHJpbCwgQmxhZGUgb2YgdGhlIEVsdmVzIiwgbmV3IFN0cmluZ1tdeyJCIiwiRyJ9LCAiYWdncm8iLAogICAgICAgICAg' +
'ICAgICAgImh0dHBzOi8vZWRocmVjLmNvbS9hdmVyYWdlLWRlY2tzL2xhdGhyaWwtYmxhZGUtb2YtdGhlLWVsdmVzIik7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFtNZXRhXSBMb2FkZWQgJWQgYnVpbHQtaW4gY29tbWFuZGVyIGRlZmF1bHRzJW4iLCBrbm93bkNvbW1hbmRlcnMuc2l6ZSgpKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERlZmF1bHQoU3RyaW5nIGNvbW1hbmRlciwgU3RyaW5nW10gY29sb3JzLCBTdHJpbmcgYXJjaGV0eXBlLCBTdHJpbmcgdXJsKSB7CiAgICAgICAgTWV0YURlY2tFbnRyeSBlbnRyeSA9IG5ldyBNZXRhRGVja0VudHJ5KCk7CiAgICAgICAgZW50cnkuY29tbWFuZGVyID0gY29tbWFuZGVyOwogICAgICAgIGVudHJ5LmxhYmVsID0gIkVESFJFQyBBdmVyYWdlIjsKICAgICAgICBlbnRyeS5zb3VyY2UgPSAiZWRocmVjIjsKICAgICAgICBlbnRyeS51cmwgPSB1cmw7CiAgICAgICAgZW50cnkuYXJjaGV0eXBlID0gYXJjaGV0eXBlOwogICAgICAgIGVudHJ5LmNvbG9ySWRlbnRpdHkgPSBjb2xvcnM7CgogICAgICAgIG1hcHBpbmcucHV0KGNvbW1hbmRlci50b0xvd2VyQ2FzZSgpLCBuZXcgQXJyYXlMaXN0PD4oTGlzdC5vZihlbnRyeSkpKTsKICAgICAgICBrbm93bkNvbW1hbmRlcnMuYWRkKGNvbW1hbmRlcik7CiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\meta\CommanderMetaService.java' -B $b
# src/main/java/commanderailab/meta/DeckImporter.java (22,203 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tZXRhOwoKaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi4qOwppbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOwoKaW1wb3J0IGphdmEuaW8uKjsKaW1wb3J0IGphdmEubmV0LlVSSTsKaW1wb3J0IGphdmEubmV0Lmh0dHAuKjsKaW1wb3J0IGphdmEubmlvLmZpbGUuKjsKaW1wb3J0IGphdmEudGltZS5EdXJhdGlvbjsKaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwppbXBvcnQgamF2YS51dGlsLio7CgovKioKICogRGVja0ltcG9ydGVyIOKAlCBGZXRjaGVzIGFuZCBwYXJzZXMgZGVja3MgZnJvbSBleHRlcm5hbCBzb3VyY2VzLgogKgogKiBTdXBwb3J0ZWQgc291cmNlczoKICogICAtIEVESFJFQyBhdmVyYWdlIGRlY2s6ICBqc29uLmVkaHJlYy5jb20vcGFnZXMvYXZlcmFnZS1kZWNrcy97Y29tbWFuZGVyfS5qc29uCiAqICAgLSBBcmNoaWRla3QgZGVjazogICAgICAgYXJjaGlkZWt0LmNvbS9hcGkvZGVja3Mve2lkfS8KICogICAtIFRleHQgaW1wb3J0OiAgICAgICAgICBQbGFpbiBjYXJkIGxpc3QgKCIxIENhcmQgTmFtZSIgcGVyIGxpbmUpCiAqICAgLSBMb2NhbCAuZGNrIGZpbGU6ICAgICAgRm9yZ2UgZGVjayBmb3JtYXQKICoKICogQWxsIGltcG9ydHMgcHJvZHVjZSBhIERlY2tQcm9maWxlIHdoaWNoIGNhbiBiZSBjb252ZXJ0ZWQgdG8gRm9yZ2UgLmRjayBmb3JtYXQuCiAqLwpwdWJsaWMgY2xhc3MgRGVja0ltcG9ydGVyIHsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHc29uIEdTT04gPSBuZXcgR3NvbkJ1aWxkZXIoKS5zZXRQcmV0dHlQcmludGluZygpLmNyZWF0ZSgpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSHR0cENsaWVudCBIVFRQID0gSHR0cENsaWVudC5uZXdCdWlsZGVyKCkKICAgICAgICAgICAgLmNvbm5lY3RUaW1lb3V0KER1cmF0aW9uLm9mU2Vjb25kcygxNSkpCiAgICAgICAgICAgIC5mb2xsb3dSZWRpcmVjdHMoSHR0cENsaWVudC5SZWRpcmVjdC5OT1JNQUwpCiAgICAgICAgICAgIC5idWlsZCgpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQUdFTlQgPSAiQ29tbWFuZGVyQUlMYWIvMi4wIjsKCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEVESFJFQyBBdmVyYWdlIERlY2sKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogRmV0Y2ggdGhlIEVESFJFQyBhdmVyYWdlL3JlY29tbWVuZGVkIGRlY2sgZm9yIGEgY29tbWFuZGVyLgogICAgICoKICAgICAqIEBwYXJhbSBjb21tYW5kZXJOYW1lIGUuZy4sICJFZGdhciBNYXJrb3YiLCAiQXRyYXhhLCBQcmFldG9ycycgVm9pY2UiCiAgICAgKiBAcmV0dXJuIERlY2tQcm9maWxlIHdpdGggfjEwMCBjYXJkcwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIERlY2tQcm9maWxlIGltcG9ydEZyb21FZGhyZWMoU3RyaW5nIGNvbW1hbmRlck5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgIFN0cmluZyBzbHVnID0gdG9FZGhyZWNTbHVnKGNvbW1hbmRlck5hbWUpOwogICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cHM6Ly9qc29uLmVkaHJlYy5jb20vcGFnZXMvYXZlcmFnZS1kZWNrcy8iICsgc2x1ZyArICIuanNvbiI7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFtJbXBvcnRdIEZldGNoaW5nIEVESFJFQyBhdmVyYWdlIGRlY2s6ICVzJW4iLCB1cmwpOwogICAgICAgIFN0cmluZyBqc29uID0gaHR0cEdldCh1cmwpOwogICAgICAgIEpzb25PYmplY3Qgcm9vdCA9IEpzb25QYXJzZXIucGFyc2VTdHJpbmcoanNvbikuZ2V0QXNKc29uT2JqZWN0KCk7CgogICAgICAgIERlY2tQcm9maWxlIHByb2ZpbGUgPSBuZXcgRGVja1Byb2ZpbGUoKTsKICAgICAgICBwcm9maWxlLnNvdXJjZSA9IERlY2tQcm9maWxlLkRlY2tTb3VyY2UuRURIUkVDX0FWRVJBR0U7CiAgICAgICAgcHJv' +
'ZmlsZS5zb3VyY2VVcmwgPSAiaHR0cHM6Ly9lZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvIiArIHNsdWc7CiAgICAgICAgcHJvZmlsZS5pbXBvcnRlZEF0ID0gSW5zdGFudC5ub3coKS50b1N0cmluZygpOwoKICAgICAgICAvLyBHZXQgY29tbWFuZGVyIGluZm8KICAgICAgICBKc29uT2JqZWN0IGNvbnRhaW5lciA9IHJvb3QuZ2V0QXNKc29uT2JqZWN0KCJjb250YWluZXIiKTsKICAgICAgICBKc29uT2JqZWN0IGpzb25EaWN0ID0gY29udGFpbmVyLmdldEFzSnNvbk9iamVjdCgianNvbl9kaWN0Iik7CiAgICAgICAgSnNvbk9iamVjdCBjYXJkSW5mbyA9IGpzb25EaWN0LmdldEFzSnNvbk9iamVjdCgiY2FyZCIpOwogICAgICAgIFN0cmluZyByZWFsTmFtZSA9IGNhcmRJbmZvLmdldCgibmFtZSIpLmdldEFzU3RyaW5nKCk7CiAgICAgICAgcHJvZmlsZS5jb21tYW5kZXIgPSByZWFsTmFtZTsKICAgICAgICBwcm9maWxlLm5hbWUgPSByZWFsTmFtZSArICIg4oCUIEVESFJFQyBBdmVyYWdlIjsKCiAgICAgICAgLy8gUGFyc2UgY29sb3IgaWRlbnRpdHkKICAgICAgICBpZiAoY2FyZEluZm8uaGFzKCJjb2xvcl9pZGVudGl0eSIpICYmIGNhcmRJbmZvLmdldCgiY29sb3JfaWRlbnRpdHkiKS5pc0pzb25BcnJheSgpKSB7CiAgICAgICAgICAgIGZvciAoSnNvbkVsZW1lbnQgY2kgOiBjYXJkSW5mby5nZXRBc0pzb25BcnJheSgiY29sb3JfaWRlbnRpdHkiKSkgewogICAgICAgICAgICAgICAgcHJvZmlsZS5jb2xvcklkZW50aXR5LmFkZChjaS5nZXRBc1N0cmluZygpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gU2FtcGxlIHNpemUKICAgICAgICBpZiAocm9vdC5oYXMoIm51bV9kZWNrc19hdmciKSkgewogICAgICAgICAgICBwcm9maWxlLnNhbXBsZVNpemUgPSByb290LmdldCgibnVtX2RlY2tzX2F2ZyIpLmdldEFzSW50KCk7CiAgICAgICAgfQoKICAgICAgICAvLyBCdWlsZCBjYXJkIGxpc3QgZnJvbSBjYXJkbGlzdHMgKGVhY2ggdGFnIGlzIGEgY2F0ZWdvcnkpCiAgICAgICAgSnNvbkFycmF5IGNhcmRsaXN0cyA9IGpzb25EaWN0LmdldEFzSnNvbkFycmF5KCJjYXJkbGlzdHMiKTsKICAgICAgICBwcm9maWxlLmNvbW1hbmRlcnMucHV0KHJlYWxOYW1lLCAxKTsKCiAgICAgICAgZm9yIChKc29uRWxlbWVudCBjbEVsIDogY2FyZGxpc3RzKSB7CiAgICAgICAgICAgIEpzb25PYmplY3QgY2wgPSBjbEVsLmdldEFzSnNvbk9iamVjdCgpOwogICAgICAgICAgICBTdHJpbmcgdGFnID0gY2wuaGFzKCJ0YWciKSA/IGNsLmdldCgidGFnIikuZ2V0QXNTdHJpbmcoKSA6ICIiOwogICAgICAgICAgICBKc29uQXJyYXkgY2FyZHZpZXdzID0gY2wuZ2V0QXNKc29uQXJyYXkoImNhcmR2aWV3cyIpOwoKICAgICAgICAgICAgZm9yIChKc29uRWxlbWVudCBjdkVsIDogY2FyZHZpZXdzKSB7CiAgICAgICAgICAgICAgICBKc29uT2JqZWN0IGN2ID0gY3ZFbC5nZXRBc0pzb25PYmplY3QoKTsKICAgICAgICAgICAgICAgIFN0cmluZyBjYXJkTmFtZSA9IGN2LmdldCgibmFtZSIpLmdldEFzU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0IHF1YW50aXR5IGlzIDEgZm9yIG5vbi1iYXNpY3MKICAgICAgICAgICAgICAgIGludCBxdHkgPSAxOwogICAgICAgICAgICAgICAgcHJvZmlsZS5tYWluYm9hcmQucHV0KGNhcmROYW1lLCBxdHkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBGaXggYmFzaWMgbGFuZCBxdWFudGl0aWVzIHVzaW5nIHRoZSBhcmNoaWRla3QgZXhwb3J0IGRhdGEKICAgICAgICBpZiAocm9vdC5oYXMoImFyY2hpZGVrdCIpICYmIHJvb3QuZ2V0KCJhcmNoaWRla3QiKS5pc0pzb25BcnJheSgpKSB7CiAgICAgICAgICAgIGZpeEJhc2ljTGFuZFF1YW50aXRpZXMocHJvZmlsZSwgcm9vdC5nZXRBc0pzb25BcnJheSgiYXJjaGlkZWt0IiksIGNhcmRsaXN0cyk7CiAgICAgICAgfQoKICAgICAgICAvLyBFbnN1cmUgd2UgaGl0IH4xMDAgY2FyZHMKICAgICAgICBwcm9maWxlLnRvdGFsQ2FyZHMgPSBwcm9maWxlLmNvbW1hbmRlcnMudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoSW50ZWdlcjo6aW50VmFsdWUpLnN1bSgpCiAgICAgICAgICAgICAgICArIHByb2ZpbGUubWFpbmJvYXJkLnZhbHVlcygpLnN0cmVhbSgpLm1hcFRvSW50KEludGVnZXI6OmludFZhbHVlKS5zdW0oKTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgW0ltcG9ydF0gRURIUkVDIGRlY2sgbG9hZGVkOiAlcyAoJWQgY2FyZHMsICVkIGRlY2tzIHNh' +
'bXBsZWQpJW4iLAogICAgICAgICAgICAgICAgcHJvZmlsZS5jb21tYW5kZXIsIHByb2ZpbGUudG90YWxDYXJkcywgcHJvZmlsZS5zYW1wbGVTaXplICE9IG51bGwgPyBwcm9maWxlLnNhbXBsZVNpemUgOiAwKTsKCiAgICAgICAgcmV0dXJuIHByb2ZpbGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaXggYmFzaWMgbGFuZCBxdWFudGl0aWVzIGZyb20gRURIUkVDJ3MgYXJjaGlkZWt0IGV4cG9ydCBhcnJheS4KICAgICAqIFRoZSBhcmNoaWRla3QgYXJyYXkgaGFzIHtjLCBmLCBxLCB1fSBlbnRyaWVzIHdoZXJlIHE+MSBmb3IgYmFzaWNzLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpeEJhc2ljTGFuZFF1YW50aXRpZXMoRGVja1Byb2ZpbGUgcHJvZmlsZSwgSnNvbkFycmF5IGFyY2hpZGVrdCwgSnNvbkFycmF5IGNhcmRsaXN0cykgewogICAgICAgIC8vIEJ1aWxkIGEgbmFtZeKGknV1aWQgbG9va3VwIGZyb20gY2FyZGxpc3RzCiAgICAgICAgLy8gQWxzbyBjb2xsZWN0IGJhc2ljIGxhbmQgbmFtZXMgZnJvbSBjYXJkbGlzdHMKICAgICAgICBTZXQ8U3RyaW5nPiBiYXNpY0xhbmROYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICBmb3IgKEpzb25FbGVtZW50IGNsRWwgOiBjYXJkbGlzdHMpIHsKICAgICAgICAgICAgSnNvbk9iamVjdCBjbCA9IGNsRWwuZ2V0QXNKc29uT2JqZWN0KCk7CiAgICAgICAgICAgIFN0cmluZyB0YWcgPSBjbC5oYXMoInRhZyIpID8gY2wuZ2V0KCJ0YWciKS5nZXRBc1N0cmluZygpIDogIiI7CiAgICAgICAgICAgIGlmICh0YWcuZXF1YWxzKCJiYXNpY3MiKSkgewogICAgICAgICAgICAgICAgZm9yIChKc29uRWxlbWVudCBjdkVsIDogY2wuZ2V0QXNKc29uQXJyYXkoImNhcmR2aWV3cyIpKSB7CiAgICAgICAgICAgICAgICAgICAgYmFzaWNMYW5kTmFtZXMuYWRkKGN2RWwuZ2V0QXNKc29uT2JqZWN0KCkuZ2V0KCJuYW1lIikuZ2V0QXNTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENvdW50IGVudHJpZXMgd2l0aCBxPjEg4oCUIHRoZXNlIGFyZSBiYXNpYyBsYW5kcwogICAgICAgIGludCB0b3RhbEZyb21BcmNoaWRla3QgPSAwOwogICAgICAgIGludCBub25CYXNpY0NhcmRzID0gMDsKICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBiYXNpY1F1YW50aXRpZXMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CgogICAgICAgIGZvciAoSnNvbkVsZW1lbnQgYWUgOiBhcmNoaWRla3QpIHsKICAgICAgICAgICAgSnNvbk9iamVjdCBlbnRyeSA9IGFlLmdldEFzSnNvbk9iamVjdCgpOwogICAgICAgICAgICBpbnQgcXR5ID0gZW50cnkuZ2V0KCJxIikuZ2V0QXNJbnQoKTsKICAgICAgICAgICAgdG90YWxGcm9tQXJjaGlkZWt0ICs9IHF0eTsKICAgICAgICAgICAgaWYgKHF0eSA+IDEpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBiYXNpYyBsYW5kIOKAlCB3ZSdsbCBtYXRjaCBieSBwb3NpdGlvbgogICAgICAgICAgICAgICAgYmFzaWNRdWFudGl0aWVzLnB1dChlbnRyeS5nZXQoInUiKS5nZXRBc1N0cmluZygpLCBxdHkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9uQmFzaWNDYXJkcysrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgYmFzaWMgbGFuZCBxdWFudGl0aWVzIGluIHRoZSBwcm9maWxlCiAgICAgICAgLy8gVGhlIGJhc2ljIGxhbmRzIGluIHByb2ZpbGUubWFpbmJvYXJkIGN1cnJlbnRseSBoYXZlIHF0eT0xCiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlbSB3aXRoIGNvcnJlY3QgcXVhbnRpdGllcwogICAgICAgIGlmICghYmFzaWNRdWFudGl0aWVzLmlzRW1wdHkoKSAmJiAhYmFzaWNMYW5kTmFtZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgIC8vIFNpbXBsZSBhcHByb2FjaDogZGlzdHJpYnV0ZSB0aGUgZXhjZXNzIGNhcmRzIGFtb25nIGJhc2ljIGxhbmRzCiAgICAgICAgICAgIGludCB0b3RhbEJhc2ljUXR5ID0gYmFzaWNRdWFudGl0aWVzLnZhbHVlcygpLnN0cmVhbSgpLm1hcFRvSW50KEludGVnZXI6OmludFZhbHVlKS5zdW0oKTsKICAgICAgICAgICAgaW50IG51bUJhc2ljcyA9IGJhc2ljTGFuZE5hbWVzLnNpemUoKTsKCiAgICAgICAgICAgIC8vIFRyeSB0byBtYXRjaCBieSBTY3J5ZmFsbCBVVUlEIChleHBlbnNpdmUpIG9yIGp1c3QgdXNlIHRoZSBxdWFudGl0aWVzIGluIG9yZGVyCiAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBiYXNpY05hbWVzID0g' +
'bmV3IEFycmF5TGlzdDw+KGJhc2ljTGFuZE5hbWVzKTsKICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBxdWFudGl0aWVzID0gbmV3IEFycmF5TGlzdDw+KGJhc2ljUXVhbnRpdGllcy52YWx1ZXMoKSk7CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1hdGgubWluKGJhc2ljTmFtZXMuc2l6ZSgpLCBxdWFudGl0aWVzLnNpemUoKSk7IGkrKykgewogICAgICAgICAgICAgICAgcHJvZmlsZS5tYWluYm9hcmQucHV0KGJhc2ljTmFtZXMuZ2V0KGkpLCBxdWFudGl0aWVzLmdldChpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBBcmNoaWRla3QgRGVjayBJbXBvcnQKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogRmV0Y2ggYSBwdWJsaWMgZGVjayBmcm9tIEFyY2hpZGVrdCBieSBkZWNrIElELgogICAgICoKICAgICAqIEBwYXJhbSBkZWNrSWQgQXJjaGlkZWt0IGRlY2sgSUQgKG51bWVyaWMpCiAgICAgKiBAcmV0dXJuIERlY2tQcm9maWxlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgRGVja1Byb2ZpbGUgaW1wb3J0RnJvbUFyY2hpZGVrdChTdHJpbmcgZGVja0lkKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcgdXJsID0gImh0dHBzOi8vYXJjaGlkZWt0LmNvbS9hcGkvZGVja3MvIiArIGRlY2tJZCArICIvIjsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgW0ltcG9ydF0gRmV0Y2hpbmcgQXJjaGlkZWt0IGRlY2s6ICVzJW4iLCB1cmwpOwogICAgICAgIFN0cmluZyBqc29uID0gaHR0cEdldCh1cmwpOwogICAgICAgIEpzb25PYmplY3Qgcm9vdCA9IEpzb25QYXJzZXIucGFyc2VTdHJpbmcoanNvbikuZ2V0QXNKc29uT2JqZWN0KCk7CgogICAgICAgIERlY2tQcm9maWxlIHByb2ZpbGUgPSBuZXcgRGVja1Byb2ZpbGUoKTsKICAgICAgICBwcm9maWxlLnNvdXJjZSA9IERlY2tQcm9maWxlLkRlY2tTb3VyY2UuQVJDSElERUtUOwogICAgICAgIHByb2ZpbGUuc291cmNlVXJsID0gImh0dHBzOi8vYXJjaGlkZWt0LmNvbS9kZWNrcy8iICsgZGVja0lkOwogICAgICAgIHByb2ZpbGUuaW1wb3J0ZWRBdCA9IEluc3RhbnQubm93KCkudG9TdHJpbmcoKTsKICAgICAgICBwcm9maWxlLm5hbWUgPSByb290LmhhcygibmFtZSIpID8gcm9vdC5nZXQoIm5hbWUiKS5nZXRBc1N0cmluZygpIDogIkFyY2hpZGVrdCBEZWNrICIgKyBkZWNrSWQ7CgogICAgICAgIC8vIFBhcnNlIGNhcmRzCiAgICAgICAgSnNvbkFycmF5IGNhcmRzID0gcm9vdC5nZXRBc0pzb25BcnJheSgiY2FyZHMiKTsKICAgICAgICBmb3IgKEpzb25FbGVtZW50IGNhcmRFbCA6IGNhcmRzKSB7CiAgICAgICAgICAgIEpzb25PYmplY3QgZW50cnkgPSBjYXJkRWwuZ2V0QXNKc29uT2JqZWN0KCk7CiAgICAgICAgICAgIGludCBxdHkgPSBlbnRyeS5nZXQoInF1YW50aXR5IikuZ2V0QXNJbnQoKTsKICAgICAgICAgICAgSnNvbk9iamVjdCBjYXJkID0gZW50cnkuZ2V0QXNKc29uT2JqZWN0KCJjYXJkIik7CiAgICAgICAgICAgIEpzb25PYmplY3Qgb3JhY2xlID0gY2FyZC5nZXRBc0pzb25PYmplY3QoIm9yYWNsZUNhcmQiKTsKICAgICAgICAgICAgU3RyaW5nIGNhcmROYW1lID0gb3JhY2xlLmdldCgibmFtZSIpLmdldEFzU3RyaW5nKCk7CgogICAgICAgICAgICAvLyBDaGVjayBjYXRlZ29yaWVzIGZvciBDb21tYW5kZXIKICAgICAgICAgICAgSnNvbkFycmF5IGNhdGVnb3JpZXMgPSBlbnRyeS5nZXRBc0pzb25BcnJheSgiY2F0ZWdvcmllcyIpOwogICAgICAgICAgICBib29sZWFuIGlzQ29tbWFuZGVyID0gZmFsc2U7CiAgICAgICAgICAgIGZvciAoSnNvbkVsZW1lbnQgY2F0IDogY2F0ZWdvcmllcykgewogICAgICAgICAgICAgICAgaWYgKGNhdC5nZXRBc1N0cmluZygpLmVxdWFsc0lnbm9yZUNh' +
'c2UoIkNvbW1hbmRlciIpKSB7CiAgICAgICAgICAgICAgICAgICAgaXNDb21tYW5kZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNDb21tYW5kZXIpIHsKICAgICAgICAgICAgICAgIHByb2ZpbGUuY29tbWFuZGVycy5wdXQoY2FyZE5hbWUsIHF0eSk7CiAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS5jb21tYW5kZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHByb2ZpbGUuY29tbWFuZGVyID0gY2FyZE5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGNvbG9yIGlkZW50aXR5IGZyb20gY29tbWFuZGVyCiAgICAgICAgICAgICAgICBpZiAob3JhY2xlLmhhcygiY29sb3JJZGVudGl0eSIpICYmIG9yYWNsZS5nZXQoImNvbG9ySWRlbnRpdHkiKS5pc0pzb25BcnJheSgpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChKc29uRWxlbWVudCBjaSA6IG9yYWNsZS5nZXRBc0pzb25BcnJheSgiY29sb3JJZGVudGl0eSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb2xvciA9IGNpLmdldEFzU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS5jb2xvcklkZW50aXR5LmNvbnRhaW5zKGNvbG9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS5jb2xvcklkZW50aXR5LmFkZChjb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcm9maWxlLm1haW5ib2FyZC5wdXQoY2FyZE5hbWUsIHF0eSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByb2ZpbGUudG90YWxDYXJkcyA9IHByb2ZpbGUuY29tbWFuZGVycy52YWx1ZXMoKS5zdHJlYW0oKS5tYXBUb0ludChJbnRlZ2VyOjppbnRWYWx1ZSkuc3VtKCkKICAgICAgICAgICAgICAgICsgcHJvZmlsZS5tYWluYm9hcmQudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoSW50ZWdlcjo6aW50VmFsdWUpLnN1bSgpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBbSW1wb3J0XSBBcmNoaWRla3QgZGVjayBsb2FkZWQ6ICVzIOKAlCAlcyAoJWQgY2FyZHMpJW4iLAogICAgICAgICAgICAgICAgcHJvZmlsZS5uYW1lLCBwcm9maWxlLmNvbW1hbmRlciwgcHJvZmlsZS50b3RhbENhcmRzKTsKCiAgICAgICAgcmV0dXJuIHByb2ZpbGU7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBUZXh0IEltcG9ydCAoTVRHTyAvIEFyZW5hIC8gR2VuZXJpYyBGb3JtYXQpCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIFBhcnNlIGEgcGxhaW4gdGV4dCBjYXJkIGxpc3QuCiAgICAgKiBTdXBwb3J0cyBmb3JtYXRzOgogICAgICogICAxIENhcmQgTmFtZQogICAgICogICAxeCBDYXJkIE5hbWUKICAgICAqICAgMSBDYXJkIE5hbWUgKFNFVCkgMTIzCiAgICAgKgogICAgICogVGhlIGZpcnN0IGNhcmQgb3IgYSBsaW5lIHN0YXJ0aW5nIHdpdGggIkNvbW1hbmRlcjoiIC8gIltDb21tYW5kZXJdIiBpcyB0aGUgY29tbWFuZGVyLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIERlY2tQcm9maWxlIGltcG9ydEZyb21UZXh0KFN0cmluZyB0ZXh0LCBTdHJpbmcgY29tbWFuZGVyT3ZlcnJpZGUpIHsKICAgICAgICBEZWNrUHJvZmlsZSBwcm9maWxlID0gbmV3IERlY2tQcm9maWxlKCk7CiAgICAgICAgcHJvZmlsZS5zb3VyY2UgPSBEZWNrUHJvZmlsZS5EZWNrU291cmNlLlRFWFRfSU1QT1JUOwogICAgICAgIHByb2ZpbGUuaW1wb3J0ZWRBdCA9IEluc3RhbnQubm93KCkudG9TdHJpbmcoKTsKCiAgICAgICAgU3RyaW5nIGN1cnJlbnRTZWN0aW9uID0gIm1haW4i' +
'OwogICAgICAgIGJvb2xlYW4gY29tbWFuZGVyRm91bmQgPSBmYWxzZTsKCiAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IHRleHQuc3BsaXQoIlxcbiIpKSB7CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKICAgICAgICAgICAgaWYgKGxpbmUuaXNFbXB0eSgpIHx8IGxpbmUuc3RhcnRzV2l0aCgiLy8iKSB8fCBsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgY29udGludWU7CgogICAgICAgICAgICAvLyBTZWN0aW9uIG1hcmtlcnMKICAgICAgICAgICAgaWYgKGxpbmUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJjb21tYW5kZXIiKSB8fCBsaW5lLmVxdWFsc0lnbm9yZUNhc2UoIltDb21tYW5kZXJdIikpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRTZWN0aW9uID0gImNvbW1hbmRlciI7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGluZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIm1haW4iKSB8fCBsaW5lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgiZGVjayIpCiAgICAgICAgICAgICAgICAgICAgfHwgbGluZS5lcXVhbHNJZ25vcmVDYXNlKCJbTWFpbl0iKSB8fCBsaW5lLmVxdWFsc0lnbm9yZUNhc2UoIltEZWNrXSIpKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9ICJtYWluIjsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsaW5lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgic2lkZWJvYXJkIikgfHwgbGluZS5lcXVhbHNJZ25vcmVDYXNlKCJbU2lkZWJvYXJkXSIpKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50U2VjdGlvbiA9ICJzaWRlYm9hcmQiOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFBhcnNlIGNhcmQgZW50cnk6ICIxIENhcmQgTmFtZSIsICIxeCBDYXJkIE5hbWUiLCAiMSBDYXJkIE5hbWUgKFNFVCkgMTIzIgogICAgICAgICAgICBTdHJpbmcgY2xlYW5MaW5lID0gbGluZQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCJcXChcXHcrXFwpXFxzKlxcZCokIiwgIiIpICAvLyBSZW1vdmUgIihTRVQpIDEyMyIgc3VmZml4CiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoIlxccypcXCouKiQiLCAiIikgICAgICAgICAgICAgLy8gUmVtb3ZlICIqIEYiIGZvaWwgbWFya2VycwogICAgICAgICAgICAgICAgICAgIC50cmltKCk7CgogICAgICAgICAgICBpbnQgcXR5ID0gMTsKICAgICAgICAgICAgU3RyaW5nIGNhcmROYW1lOwogICAgICAgICAgICB2YXIgbWF0Y2ggPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKCJeKFxcZCspeD9cXHMrKC4rKSQiKS5tYXRjaGVyKGNsZWFuTGluZSk7CiAgICAgICAgICAgIGlmIChtYXRjaC5tYXRjaGVzKCkpIHsKICAgICAgICAgICAgICAgIHF0eSA9IEludGVnZXIucGFyc2VJbnQobWF0Y2guZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgY2FyZE5hbWUgPSBtYXRjaC5ncm91cCgyKS50cmltKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYXJkTmFtZSA9IGNsZWFuTGluZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNhcmROYW1lLmlzRW1wdHkoKSkgY29udGludWU7CgogICAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24uZXF1YWxzKCJjb21tYW5kZXIiKSkgewogICAgICAgICAgICAgICAgcHJvZmlsZS5jb21tYW5kZXJzLnB1dChjYXJkTmFtZSwgcXR5KTsKICAgICAgICAgICAgICAgIGlmICghY29tbWFuZGVyRm91bmQpIHsKICAgICAgICAgICAgICAgICAgICBwcm9maWxlLmNvbW1hbmRlciA9IGNhcmROYW1lOwogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlckZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghY3VycmVudFNlY3Rpb24uZXF1YWxzKCJzaWRlYm9hcmQiKSkgewogICAgICAgICAgICAgICAgcHJvZmlsZS5tYWluYm9hcmQucHV0KGNhcmROYW1lLCBxdHkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDb21tYW5kZXIgb3ZlcnJpZGUKICAgICAgICBpZiAoY29tbWFuZGVyT3ZlcnJpZGUgIT0gbnVsbCAmJiAhY29tbWFuZGVyT3ZlcnJpZGUuaXNCbGFuaygpKSB7CiAgICAgICAgICAgIHByb2ZpbGUuY29tbWFuZGVyID0gY29tbWFuZGVyT3ZlcnJpZGU7CiAgICAgICAgICAgIGlmIChwcm9maWxlLmNvbW1hbmRlcnMuaXNFbXB0eSgpKSB7CiAgICAgICAg' +
'ICAgICAgICAvLyBNb3ZlIGZyb20gbWFpbmJvYXJkIHRvIGNvbW1hbmRlciB6b25lIGlmIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS5tYWluYm9hcmQuY29udGFpbnNLZXkoY29tbWFuZGVyT3ZlcnJpZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IHF0eSA9IHByb2ZpbGUubWFpbmJvYXJkLnJlbW92ZShjb21tYW5kZXJPdmVycmlkZSk7CiAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS5jb21tYW5kZXJzLnB1dChjb21tYW5kZXJPdmVycmlkZSwgcXR5KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS5jb21tYW5kZXJzLnB1dChjb21tYW5kZXJPdmVycmlkZSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByb2ZpbGUubmFtZSA9IHByb2ZpbGUuY29tbWFuZGVyICE9IG51bGwgPyBwcm9maWxlLmNvbW1hbmRlciArICIg4oCUIFRleHQgSW1wb3J0IiA6ICJUZXh0IEltcG9ydCI7CiAgICAgICAgcHJvZmlsZS50b3RhbENhcmRzID0gcHJvZmlsZS5jb21tYW5kZXJzLnZhbHVlcygpLnN0cmVhbSgpLm1hcFRvSW50KEludGVnZXI6OmludFZhbHVlKS5zdW0oKQogICAgICAgICAgICAgICAgKyBwcm9maWxlLm1haW5ib2FyZC52YWx1ZXMoKS5zdHJlYW0oKS5tYXBUb0ludChJbnRlZ2VyOjppbnRWYWx1ZSkuc3VtKCk7CgogICAgICAgIHJldHVybiBwcm9maWxlOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gTG9jYWwgLmRjayBGaWxlIEltcG9ydAogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBQYXJzZSBhIEZvcmdlIC5kY2sgZmlsZSBpbnRvIGEgRGVja1Byb2ZpbGUuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgRGVja1Byb2ZpbGUgaW1wb3J0RnJvbURja0ZpbGUoU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIExpc3Q8U3RyaW5nPiBsaW5lcyA9IEZpbGVzLnJlYWRBbGxMaW5lcyhQYXRoLm9mKGZpbGVQYXRoKSk7CiAgICAgICAgRGVja1Byb2ZpbGUgcHJvZmlsZSA9IG5ldyBEZWNrUHJvZmlsZSgpOwogICAgICAgIHByb2ZpbGUuc291cmNlID0gRGVja1Byb2ZpbGUuRGVja1NvdXJjZS5MT0NBTF9GSUxFOwogICAgICAgIHByb2ZpbGUuc291cmNlVXJsID0gZmlsZVBhdGg7CiAgICAgICAgcHJvZmlsZS5pbXBvcnRlZEF0ID0gSW5zdGFudC5ub3coKS50b1N0cmluZygpOwoKICAgICAgICBTdHJpbmcgY3VycmVudFNlY3Rpb24gPSAiTWFpbiI7CiAgICAgICAgU3RyaW5nIGRlY2tOYW1lID0gUGF0aC5vZihmaWxlUGF0aCkuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpLnJlcGxhY2UoIi5kY2siLCAiIik7CgogICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBsaW5lcykgewogICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgICAgIGlmIChsaW5lLmlzRW1wdHkoKSB8fCBsaW5lLnN0YXJ0c1dpdGgoIi8vIikpIGNvbnRpbnVlOwoKICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiWyIpICYmIGxpbmUuZW5kc1dpdGgoIl0iKSkgewogICAgICAgICAgICAgICAgY3VycmVudFNlY3Rpb24gPSBsaW5lLnN1YnN0cmluZygxLCBsaW5lLmxlbmd0aCgpIC0gMSk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJOYW1lPSIpKSB7CiAgICAgICAgICAgICAgICBkZWNrTmFtZSA9IGxpbmUuc3Vic3RyaW5nKDUpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbWF0Y2ggPSBqYXZhLnV0aWwucmVnZXguUGF0dGVybi5jb21waWxlKCJeKFxcZCspXFxzKyguKz8pKD86XFx8KC4rKSk/JCIpLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlm' +
'IChtYXRjaC5tYXRjaGVzKCkpIHsKICAgICAgICAgICAgICAgIGludCBxdHkgPSBJbnRlZ2VyLnBhcnNlSW50KG1hdGNoLmdyb3VwKDEpKTsKICAgICAgICAgICAgICAgIFN0cmluZyBjYXJkTmFtZSA9IG1hdGNoLmdyb3VwKDIpLnRyaW0oKTsKCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNlY3Rpb24uZXF1YWxzSWdub3JlQ2FzZSgiQ29tbWFuZGVyIikpIHsKICAgICAgICAgICAgICAgICAgICBwcm9maWxlLmNvbW1hbmRlcnMucHV0KGNhcmROYW1lLCBxdHkpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLmNvbW1hbmRlciA9PSBudWxsKSBwcm9maWxlLmNvbW1hbmRlciA9IGNhcmROYW1lOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50U2VjdGlvbi5lcXVhbHNJZ25vcmVDYXNlKCJNYWluIikpIHsKICAgICAgICAgICAgICAgICAgICBwcm9maWxlLm1haW5ib2FyZC5wdXQoY2FyZE5hbWUsIHF0eSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHByb2ZpbGUubmFtZSA9IGRlY2tOYW1lOwogICAgICAgIHByb2ZpbGUudG90YWxDYXJkcyA9IHByb2ZpbGUuY29tbWFuZGVycy52YWx1ZXMoKS5zdHJlYW0oKS5tYXBUb0ludChJbnRlZ2VyOjppbnRWYWx1ZSkuc3VtKCkKICAgICAgICAgICAgICAgICsgcHJvZmlsZS5tYWluYm9hcmQudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoSW50ZWdlcjo6aW50VmFsdWUpLnN1bSgpOwoKICAgICAgICByZXR1cm4gcHJvZmlsZTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEF1dG8tZGV0ZWN0IGltcG9ydCBmcm9tIFVSTAogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBBdXRvLWRldGVjdCB0aGUgc291cmNlIGZyb20gYSBVUkwgYW5kIGltcG9ydC4KICAgICAqCiAgICAgKiBTdXBwb3J0ZWQgVVJMIHBhdHRlcm5zOgogICAgICogICBodHRwczovL2FyY2hpZGVrdC5jb20vZGVja3MvMTIzNDUvLi4uICDihpIgQXJjaGlkZWt0CiAgICAgKiAgIGh0dHBzOi8vZWRocmVjLmNvbS9hdmVyYWdlLWRlY2tzL2VkZ2FyLW1hcmtvdiAg4oaSIEVESFJFQwogICAgICogICBodHRwczovL2VkaHJlYy5jb20vY29tbWFuZGVycy9lZGdhci1tYXJrb3YgIOKGkiBFREhSRUMgYXZlcmFnZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIERlY2tQcm9maWxlIGltcG9ydEZyb21VcmwoU3RyaW5nIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgdXJsID0gdXJsLnRyaW0oKTsKCiAgICAgICAgLy8gQXJjaGlkZWt0OiBodHRwczovL2FyY2hpZGVrdC5jb20vZGVja3MvMTIzNDUgb3IgL2RlY2tzLzEyMzQ1L25hbWUKICAgICAgICBpZiAodXJsLmNvbnRhaW5zKCJhcmNoaWRla3QuY29tL2RlY2tzLyIpKSB7CiAgICAgICAgICAgIFN0cmluZyBpZCA9IHVybC5yZXBsYWNlQWxsKCIuKi9kZWNrcy8oXFxkKykuKiIsICIkMSIpOwogICAgICAgICAgICByZXR1cm4gaW1wb3J0RnJvbUFyY2hpZGVrdChpZCk7CiAgICAgICAgfQoKICAgICAgICAvLyBFREhSRUMgYXZlcmFnZSBkZWNrOiBodHRwczovL2VkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy9lZGdhci1tYXJrb3YKICAgICAgICBpZiAodXJsLmNvbnRhaW5zKCJlZGhyZWMuY29tL2F2ZXJhZ2UtZGVja3MvIikpIHsKICAgICAgICAgICAgU3RyaW5nIHNsdWcgPSB1cmwucmVwbGFjZUFsbCgiLiovYXZlcmFnZS1kZWNrcy8oW14vPyNdKykuKiIsICIkMSIpOwogICAgICAgICAgICBTdHJpbmcgY29tbWFuZGVyTmFtZSA9IHNsdWcucmVwbGFjZSgiLSIsICIgIik7CiAgICAgICAgICAgIHJldHVybiBpbXBvcnRGcm9tRWRocmVjKGNvbW1hbmRlck5hbWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gRURIUkVDIGNvbW1hbmRlciBwYWdlOiBodHRwczovL2VkaHJlYy5jb20vY29t' +
'bWFuZGVycy9lZGdhci1tYXJrb3YKICAgICAgICBpZiAodXJsLmNvbnRhaW5zKCJlZGhyZWMuY29tL2NvbW1hbmRlcnMvIikpIHsKICAgICAgICAgICAgU3RyaW5nIHNsdWcgPSB1cmwucmVwbGFjZUFsbCgiLiovY29tbWFuZGVycy8oW14vPyNdKykuKiIsICIkMSIpOwogICAgICAgICAgICBTdHJpbmcgY29tbWFuZGVyTmFtZSA9IHNsdWcucmVwbGFjZSgiLSIsICIgIik7CiAgICAgICAgICAgIHJldHVybiBpbXBvcnRGcm9tRWRocmVjKGNvbW1hbmRlck5hbWUpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgVVJMOiAiICsgdXJsCiAgICAgICAgICAgICAgICArICJcblN1cHBvcnRlZDogYXJjaGlkZWt0LmNvbS9kZWNrcy8uLi4sIGVkaHJlYy5jb20vYXZlcmFnZS1kZWNrcy8uLi4sIGVkaHJlYy5jb20vY29tbWFuZGVycy8uLi4iKTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEZvcmdlIC5kY2sgRXhwb3J0CiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIENvbnZlcnQgYSBEZWNrUHJvZmlsZSB0byBGb3JnZSAuZGNrIGZvcm1hdC4KICAgICAqCiAgICAgKiBGb3JtYXQ6CiAgICAgKiAgIFttZXRhZGF0YV0KICAgICAqICAgTmFtZT1FZGdhciBNYXJrb3Yg4oCUIEVESFJFQyBBdmVyYWdlCiAgICAgKiAgIFtDb21tYW5kZXJdCiAgICAgKiAgIDEgRWRnYXIgTWFya292CiAgICAgKiAgIFtNYWluXQogICAgICogICAxIEJsb29kIEFydGlzdAogICAgICogICAxIFNvbCBSaW5nCiAgICAgKiAgIC4uLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0Rja0Zvcm1hdChEZWNrUHJvZmlsZSBwcm9maWxlKSB7CiAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgc2IuYXBwZW5kKCJbbWV0YWRhdGFdXG4iKTsKICAgICAgICBzYi5hcHBlbmQoIk5hbWU9IikuYXBwZW5kKHByb2ZpbGUubmFtZSAhPSBudWxsID8gcHJvZmlsZS5uYW1lIDogIkltcG9ydGVkIERlY2siKS5hcHBlbmQoIlxuIik7CiAgICAgICAgc2IuYXBwZW5kKCJcbiIpOwoKICAgICAgICAvLyBDb21tYW5kZXIgem9uZQogICAgICAgIHNiLmFwcGVuZCgiW0NvbW1hbmRlcl1cbiIpOwogICAgICAgIGZvciAodmFyIGVudHJ5IDogcHJvZmlsZS5jb21tYW5kZXJzLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgc2IuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgiICIpLmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCJcbiIpOwogICAgICAgIH0KICAgICAgICBzYi5hcHBlbmQoIlxuIik7CgogICAgICAgIC8vIE1haW5ib2FyZAogICAgICAgIHNiLmFwcGVuZCgiW01haW5dXG4iKTsKICAgICAgICBmb3IgKHZhciBlbnRyeSA6IHByb2ZpbGUubWFpbmJvYXJkLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgc2IuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgiICIpLmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCJcbiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTYXZlIGEgRGVja1Byb2ZpbGUgYXMgYSBGb3JnZSAuZGNrIGZpbGUuCiAgICAgKgogICAgICogQHBhcmFtIHByb2ZpbGUgVGhlIGRlY2sgdG8gc2F2ZQogICAgICogQHBhcmFtIG91dHB1dERpciBEaXJlY3RvcnkgdG8gc2F2ZSBpbnRvCiAgICAgKiBAcmV0dXJuIFBhdGggdG8gdGhlIHNhdmVkIC5kY2sgZmlsZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIFBhdGggc2F2ZVRvRGNrRmlsZShEZWNrUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgb3V0cHV0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIFN0cmluZyBzYWZlTmFtZSA9IHNhbml0aXplRmlsZU5hbWUocHJvZmlsZS5uYW1lKTsKICAg' +
'ICAgICBQYXRoIG91dFBhdGggPSBQYXRoLm9mKG91dHB1dERpciwgc2FmZU5hbWUgKyAiLmRjayIpOwogICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKG91dFBhdGguZ2V0UGFyZW50KCkpOwogICAgICAgIEZpbGVzLndyaXRlU3RyaW5nKG91dFBhdGgsIHRvRGNrRm9ybWF0KHByb2ZpbGUpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBbRXhwb3J0XSBTYXZlZCAuZGNrIGZpbGU6ICVzJW4iLCBvdXRQYXRoKTsKICAgICAgICByZXR1cm4gb3V0UGF0aDsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEhlbHBlcnMKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIC8qKgogICAgICogQ29udmVydCBjb21tYW5kZXIgbmFtZSB0byBFREhSRUMgVVJMIHNsdWcuCiAgICAgKiAiRWRnYXIgTWFya292IiDihpIgImVkZ2FyLW1hcmtvdiIKICAgICAqICJBdHJheGEsIFByYWV0b3JzJyBWb2ljZSIg4oaSICJhdHJheGEtcHJhZXRvcnMtdm9pY2UiCiAgICAgKi8KICAgIHN0YXRpYyBTdHJpbmcgdG9FZGhyZWNTbHVnKFN0cmluZyBjb21tYW5kZXJOYW1lKSB7CiAgICAgICAgcmV0dXJuIGNvbW1hbmRlck5hbWUudG9Mb3dlckNhc2UoKQogICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoIlsnLC5dIiwgIiIpCiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiW15hLXowLTldKyIsICItIikKICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCJeLXwtJCIsICIiKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2FuaXRpemVGaWxlTmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgIGlmIChuYW1lID09IG51bGwpIHJldHVybiAiaW1wb3J0ZWQtZGVjayI7CiAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgiW15hLXpBLVowLTkgXy1dIiwgIiIpCiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiXFxzKyIsICJfIikKICAgICAgICAgICAgICAgIC50cmltKCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGh0dHBHZXQoU3RyaW5nIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgSHR0cFJlcXVlc3QgcmVxID0gSHR0cFJlcXVlc3QubmV3QnVpbGRlcigpCiAgICAgICAgICAgICAgICAudXJpKFVSSS5jcmVhdGUodXJsKSkKICAgICAgICAgICAgICAgIC5oZWFkZXIoIlVzZXItQWdlbnQiLCBVU0VSX0FHRU5UKQogICAgICAgICAgICAgICAgLnRpbWVvdXQoRHVyYXRpb24ub2ZTZWNvbmRzKDMwKSkKICAgICAgICAgICAgICAgIC5HRVQoKQogICAgICAgICAgICAgICAgLmJ1aWxkKCk7CgogICAgICAgIEh0dHBSZXNwb25zZTxTdHJpbmc+IHJlc3AgPSBIVFRQLnNlbmQocmVxLCBIdHRwUmVzcG9uc2UuQm9keUhhbmRsZXJzLm9mU3RyaW5nKCkpOwoKICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlKCkgIT0gMjAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSFRUUCAiICsgcmVzcC5zdGF0dXNDb2RlKCkgKyAiIGZldGNoaW5nICIgKyB1cmwgKyAiOiAiICsgcmVzcC5ib2R5KCkuc3Vic3RyaW5nKDAsIE1hdGgubWluKDIwMCwgcmVzcC5ib2R5KCkubGVuZ3RoKCkpKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzcC5ib2R5KCk7CiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\meta\DeckImporter.java' -B $b
# src/main/java/commanderailab/meta/DeckProfile.java (3,957 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tZXRhOwoKaW1wb3J0IGphdmEudXRpbC4qOwoKLyoqCiAqIERlY2tQcm9maWxlIOKAlCBSZXByZXNlbnRzIGFuIGltcG9ydGVkIGRlY2sgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuCiAqCiAqIEhvbGRzIGNhcmQgbGlzdCArIG1ldGFkYXRhIGFib3V0IHdoZXJlIHRoZSBkZWNrIGNhbWUgZnJvbQogKiAoRURIUkVDIGF2ZXJhZ2UsIEFyY2hpZGVrdCB1c2VyIGRlY2ssIE1veGZpZWxkIHBhc3RlLCBldGMuKQogKi8KcHVibGljIGNsYXNzIERlY2tQcm9maWxlIHsKCiAgICAvKiogRGlzcGxheSBuYW1lIGZvciB0aGUgZGVjayAoZS5nLiwgIkVkZ2FyIE1hcmtvdiDigJQgRURIUkVDIEF2ZXJhZ2UiKSAqLwogICAgcHVibGljIFN0cmluZyBuYW1lOwoKICAgIC8qKiBDb21tYW5kZXIgY2FyZCBuYW1lICovCiAgICBwdWJsaWMgU3RyaW5nIGNvbW1hbmRlcjsKCiAgICAvKiogQ29sb3IgaWRlbnRpdHkgKGUuZy4sIFsiVyIsIkIiLCJSIl0pICovCiAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGNvbG9ySWRlbnRpdHkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAvKiogV2hlcmUgdGhpcyBkZWNrIGNhbWUgZnJvbSAqLwogICAgcHVibGljIERlY2tTb3VyY2Ugc291cmNlOwoKICAgIC8qKiBVUkwgdG8gdGhlIG9yaWdpbmFsIGRlY2sgKEFyY2hpZGVrdC9Nb3hmaWVsZC9FREhSRUMgcGFnZSkgKi8KICAgIHB1YmxpYyBTdHJpbmcgc291cmNlVXJsOwoKICAgIC8qKiBDYXJkcyBpbiB0aGUgOTkgKG1haW5ib2FyZCkg4oCUIGNhcmROYW1lIOKGkiBxdWFudGl0eSAqLwogICAgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IG1haW5ib2FyZCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKCiAgICAvKiogQ2FyZHMgaW4gdGhlIGNvbW1hbmQgem9uZSDigJQgY2FyZE5hbWUg4oaSIHF1YW50aXR5ICh1c3VhbGx5IDEtMiBmb3IgcGFydG5lcnMpICovCiAgICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gY29tbWFuZGVycyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKCiAgICAvKiogVG90YWwgY2FyZCBjb3VudCAoc2hvdWxkIGJlIDk5ICsgY29tbWFuZGVyKHMpID0gMTAwKSAqLwogICAgcHVibGljIGludCB0b3RhbENhcmRzOwoKICAgIC8qKiBUaW1lc3RhbXAgb2YgaW1wb3J0ICovCiAgICBwdWJsaWMgU3RyaW5nIGltcG9ydGVkQXQ7CgogICAgLyoqIE9wdGlvbmFsOiBFREhSRUMtc3BlY2lmaWMg4oCUIG51bWJlciBvZiBkZWNrcyBzYW1wbGVkICovCiAgICBwdWJsaWMgSW50ZWdlciBzYW1wbGVTaXplOwoKICAgIC8qKiBPcHRpb25hbDogYXJjaGV0eXBlIHRhZyAoYWdncm8sIGNvbnRyb2wsIGNvbWJvLCBldGMuKSAqLwogICAgcHVibGljIFN0cmluZyBhcmNoZXR5cGU7CgogICAgLy8g4pSA4pSAIFNvdXJjZSBlbnVtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHB1YmxpYyBlbnVtIERlY2tTb3VyY2UgewogICAgICAgIEVESFJFQ19BVkVSQUdFLCAgICAvLyBFREhSRUMgYXZlcmFnZS9yZWNvbW1lbmRlZCBkZWNrIGZvciBhIGNvbW1hbmRlcgogICAgICAgIEFSQ0hJREVLVCwgICAgICAgICAvLyBBcmNoaWRla3QgcHVibGljIGRlY2sgYnkgSUQKICAgICAgICBNT1hGSUVMRCwgICAgICAgICAgLy8gTW94ZmllbGQgdGV4dCBpbXBvcnQKICAgICAgICBURVhUX0lNUE9SVCwgICAgICAgLy8gUmF3IGNhcmQgbGlzdCBwYXN0ZSAoTVRHTy9BcmVuYSBmb3JtYXQpCiAgICAgICAgTE9DQUxfRklMRSwgICAgICAgIC8vIExvY2FsIC5kY2sgZmlsZQogICAgICAgIENVUkFURUQ7ICAgICAgICAgICAvLyBIYW5kLWN1cmF0ZWQgbWV0YSBkZWNrIGluIEpTT04gbWFwcGluZwoKICAgICAgICBwdWJsaWMgU3RyaW5nIGxhYmVsKCkgewogICAgICAgICAgICByZXR1cm4gc3dpdGNoICh0aGlzKSB7CiAgICAgICAgICAgICAgICBjYXNlIEVESFJFQ19BVkVSQUdFIC0+ICJFREhSRUMgQXZlcmFnZSI7CiAgICAgICAgICAgICAgICBjYXNlIEFSQ0hJREVLVCAtPiAiQXJjaGlkZWt0IjsKICAgICAgICAgICAgICAgIGNhc2UgTU9YRklFTEQgLT4gIk1veGZpZWxkIjsKICAgICAgICAgICAgICAgIGNhc2UgVEVYVF9JTVBPUlQgLT4gIlRleHQgSW1wb3J0IjsKICAgICAgICAgICAgICAgIGNhc2UgTE9DQUxfRklMRSAtPiAiTG9jYWwgRmlsZSI7CiAgICAgICAgICAgICAgICBj' +
'YXNlIENVUkFURUQgLT4gIkN1cmF0ZWQgTWV0YSI7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIC8qKgogICAgICogR2V0IGFsbCBjYXJkcyAoY29tbWFuZGVycyArIG1haW5ib2FyZCkgYXMgYSBmbGF0IGxpc3Qgd2l0aCBxdWFudGl0aWVzLgogICAgICovCiAgICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gYWxsQ2FyZHMoKSB7CiAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gYWxsID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgIGFsbC5wdXRBbGwoY29tbWFuZGVycyk7CiAgICAgICAgYWxsLnB1dEFsbChtYWluYm9hcmQpOwogICAgICAgIHJldHVybiBhbGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBWYWxpZGF0ZSB0aGUgZGVjayBoYXMgYSByZWFzb25hYmxlIHN0cnVjdHVyZS4KICAgICAqLwogICAgcHVibGljIExpc3Q8U3RyaW5nPiB2YWxpZGF0ZSgpIHsKICAgICAgICBMaXN0PFN0cmluZz4gaXNzdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgaWYgKGNvbW1hbmRlciA9PSBudWxsIHx8IGNvbW1hbmRlci5pc0JsYW5rKCkpIHsKICAgICAgICAgICAgaXNzdWVzLmFkZCgiTm8gY29tbWFuZGVyIHNwZWNpZmllZCIpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tbWFuZGVycy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgaXNzdWVzLmFkZCgiQ29tbWFuZGVyIHpvbmUgaXMgZW1wdHkiKTsKICAgICAgICB9CiAgICAgICAgaW50IHRvdGFsID0gY29tbWFuZGVycy52YWx1ZXMoKS5zdHJlYW0oKS5tYXBUb0ludChJbnRlZ2VyOjppbnRWYWx1ZSkuc3VtKCkKICAgICAgICAgICAgICAgICAgKyBtYWluYm9hcmQudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoSW50ZWdlcjo6aW50VmFsdWUpLnN1bSgpOwogICAgICAgIGlmICh0b3RhbCA8IDkwKSB7CiAgICAgICAgICAgIGlzc3Vlcy5hZGQoIkRlY2sgaGFzIG9ubHkgIiArIHRvdGFsICsgIiBjYXJkcyAoZXhwZWN0ZWQgfjEwMCkiKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRvdGFsID4gMTAxKSB7CiAgICAgICAgICAgIGlzc3Vlcy5hZGQoIkRlY2sgaGFzICIgKyB0b3RhbCArICIgY2FyZHMgKGV4cGVjdGVkIDEwMCkiKTsKICAgICAgICB9CiAgICAgICAgdG90YWxDYXJkcyA9IHRvdGFsOwogICAgICAgIHJldHVybiBpc3N1ZXM7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgIGludCBtYWluQ291bnQgPSBtYWluYm9hcmQudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoSW50ZWdlcjo6aW50VmFsdWUpLnN1bSgpOwogICAgICAgIGludCBjbWRDb3VudCA9IGNvbW1hbmRlcnMudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoSW50ZWdlcjo6aW50VmFsdWUpLnN1bSgpOwogICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJEZWNrUHJvZmlsZXtuYW1lPSclcycsIGNvbW1hbmRlcj0nJXMnLCBzb3VyY2U9JXMsIGNhcmRzPSVkKyVkfSIsCiAgICAgICAgICAgICAgICBuYW1lLCBjb21tYW5kZXIsIHNvdXJjZSwgY21kQ291bnQsIG1haW5Db3VudCk7CiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\meta\DeckProfile.java' -B $b
# src/main/java/commanderailab/ml/DecisionExtractor.java (17,451 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tbDsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuRGVjaXNpb25TbmFwc2hvdDsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5EZWNpc2lvblNuYXBzaG90Lio7CgppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKCi8qKgogKiBEZWNpc2lvbkV4dHJhY3RvciDigJQgUmVjb25zdHJ1Y3RzIGdhbWUgc3RhdGUgYW5kIGRlY2lzaW9ucyBmcm9tIEZvcmdlIHZlcmJvc2UgbG9ncy4KICoKICogRm9yZ2UgdmVyYm9zZSBvdXRwdXQgZW1pdHMgbGluZXMgZm9yIGVhY2ggZ2FtZSBldmVudDogZHJhd3MsIGNhc3RzLCBhdHRhY2tzLAogKiBkYW1hZ2UsIHBoYXNlIHRyYW5zaXRpb25zLCBldGMuIFRoaXMgY2xhc3MgbWFpbnRhaW5zIHJ1bm5pbmcgZ2FtZSBzdGF0ZSBhbmQKICogZW1pdHMgYSBEZWNpc2lvblNuYXBzaG90IGF0IGVhY2ggcG9pbnQgd2hlcmUgdGhlIEFJIG1hZGUgYSBtZWFuaW5nZnVsIGNob2ljZS4KICoKICogS2V5IEZvcmdlIGxvZyBwYXR0ZXJuczoKICogICAiPT0gVHVybiA1IChBaSgxKS1Db21tYW5kZXJOYW1lKSA9PSIgICAgIOKGkiBUdXJuL2FjdGl2ZSBwbGF5ZXIKICogICAiQWkoMSktTmFtZSBkcmF3cyBDYXJkTmFtZS4iICAgICAgICAgICAgICDihpIgRHJhdyBldmVudAogKiAgICJBaSgxKS1OYW1lIGNhc3RzIENhcmROYW1lLiIgICAgICAgICAgICAgIOKGkiBTcGVsbCBjYXN0IGRlY2lzaW9uCiAqICAgIkFpKDEpLU5hbWUgcGxheXMgTGFuZE5hbWUuIiAgICAgICAgICAgICAg4oaSIExhbmQgcGxheSBkZWNpc2lvbgogKiAgICJBaSgxKS1OYW1lIGF0dGFja3Mgd2l0aCBbQ3JlYXR1cmVMaXN0XSIgIOKGkiBBdHRhY2sgZGVjbGFyYXRpb24KICogICAiUGhhc2U6IE1haW4gMSIgLyAiUGhhc2U6IENvbWJhdCIgLyBldGMuICDihpIgUGhhc2UgdHJhbnNpdGlvbgogKiAgICJBaSgxKSBsaWZlOiA0MCDihpIgMzciICAgICAgICAgICAgICAgICAgICDihpIgTGlmZSBjaGFuZ2UKICoKICogTGltaXRhdGlvbnM6CiAqICAgLSBIYW5kIGNvbnRlbnRzIG11c3QgYmUgaW5mZXJyZWQgZnJvbSBkcmF3cyBhbmQgY2FzdHMgKEZvcmdlIGRvZXNuJ3QgZHVtcCBoYW5kcykKICogICAtIE1hbmEgYXZhaWxhYmxlIGlzIGVzdGltYXRlZCBmcm9tIGxhbmQgY291bnQgYW5kIGtub3duIG1hbmEgcm9ja3MKICogICAtIEdyYXZleWFyZCBpcyB0cmFja2VkIGZyb20gZGVhdGgvZGVzdHJveS9kaXNjYXJkIGV2ZW50cwogKi8KcHVibGljIGNsYXNzIERlY2lzaW9uRXh0cmFjdG9yIHsKCiAgICAvLyDilIDilIAgUGF0dGVybnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgLy8gVHVybiBib3VuZGFyeTogIlR1cm4gNSAoQWkoMSktTmFtZSkiIG9yICI9PSBUdXJuIDUgKEFpKDEpLU5hbWUpID09IgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBUVVJOX1BBVFRFUk4gPQogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIlR1cm5cXHMrKFxcZCspXFxzK1xcKEFpXFwoKFxcZCspXFwpLSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gUGhhc2UgaW5kaWNhdG9yOiB2YXJpb3VzIEZvcmdlIHBoYXNlIHN0cmluZ3MKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUEhBU0VfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKD86UGhhc2V8U3RlcCk6XFxzKiguKj8pKD86XFxzKiR8XFxzKi0pIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKCiAgICAvLyBDYXN0OiAiQWkoMSktTmFtZSBjYXN0cyBDYXJkTmFtZS4iCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIENBU1RfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiQWlcXCgoXFxkKylcXCktW15cXHNdLio/XFxzK2Nhc3RzXFxzKyguKz8pXFwuIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKCiAgICAvLyBMYW5kIHBsYXk6ICJBaSgxKS1OYW1lIHBsYXlzIExhbmROYW1lLiIKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTEFORF9QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJBaVxcKChcXGQrKVxcKS1bXlxcc10uKj9cXHMrcGxheXNcXHMrKC4rPylcXC4iLCBQYXR0ZXJuLkNBU0Vf' +
'SU5TRU5TSVRJVkUpOwoKICAgIC8vIERyYXc6ICJBaSgxKS1OYW1lIGRyYXdzIENhcmROYW1lLiIKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRFJBV19QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJBaVxcKChcXGQrKVxcKS1bXlxcc10uKj9cXHMrZHJhd3NcXHMrKC4rPylcXC4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwoKICAgIC8vIEF0dGFjazogIkFpKDEpLU5hbWUgYXR0YWNrcyB3aXRoIiBvciAiZGVjbGFyZXMgYXR0YWNrZXJzIgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBBVFRBQ0tfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiQWlcXCgoXFxkKylcXCktLio/KD86YXR0YWNrc3xkZWNsYXJlcz8gYXR0YWNrZXJzKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gTGlmZSBjaGFuZ2U6IGNhcHR1cmVzIGN1cnJlbnQgbGlmZSBmcm9tIHZhcmlvdXMgZm9ybWF0cwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBMSUZFX1BBVFRFUk4gPQogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIkFpXFwoKFxcZCspXFwpLio/bGlmZS4qPyhcXGQrKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gRGVzdHJveS9kaWU6IGNhcmQgbGVhdmVzIGJhdHRsZWZpZWxkCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIERFU1RST1lfUEFUVEVSTiA9CiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKC4rPylcXHMrKD86aXMgZGVzdHJveWVkfGRpZXN8aXMgcHV0IGludG8gLiogZ3JhdmV5YXJkKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8gRGFtYWdlOiAiQ2FyZE5hbWUgZGVhbHMgTiBkYW1hZ2UgdG8gQWkoWCkiCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIERBTUFHRV9UT19QTEFZRVIgPQogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoImRlYWxzXFxzKyhcXGQrKVxccysoPzpjb21iYXRcXHMrKT9kYW1hZ2VcXHMrdG9cXHMrQWlcXCgoXFxkKylcXCkiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwoKICAgIC8vIENvbW1hbmRlciBkYW1hZ2U6IHZhcmlvdXMgZm9ybWF0cwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBDTURSX0RNR19QQVRURVJOID0KICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCIoXFxkKylcXHMrY29tbWFuZGVyXFxzK2RhbWFnZSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CgogICAgLy8g4pSA4pSAIFJ1bm5pbmcgZ2FtZSBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBwcml2YXRlIGZpbmFsIGludCBudW1QbGF5ZXJzOwogICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ2FtZUlkOwogICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjb21tYW5kZXJOYW1lczsgIC8vIGNvbW1hbmRlciBuYW1lIHBlciBzZWF0CgogICAgLy8gUGVyLXNlYXQgbXV0YWJsZSBzdGF0ZQogICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBsaWZlVG90YWxzOwogICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBjb21tYW5kZXJEYW1hZ2U7ICAgIC8vIGRhbWFnZSBmcm9tIG9wcG9uZW50J3MgY29tbWFuZGVyCiAgICBwcml2YXRlIGZpbmFsIGludFtdIGNvbW1hbmRlckNhc3RzOwogICAgcHJpdmF0ZSBmaW5hbCBMaXN0PExpc3Q8U3RyaW5nPj4gaGFuZHM7ICAgICAgICAvLyBpbmZlcnJlZCBoYW5kIGNvbnRlbnRzCiAgICBwcml2YXRlIGZpbmFsIExpc3Q8TGlzdDxTdHJpbmc+PiBiYXR0bGVmaWVsZHM7CiAgICBwcml2YXRlIGZpbmFsIExpc3Q8TGlzdDxTdHJpbmc+PiBncmF2ZXlhcmRzOwogICAgcHJpdmF0ZSBmaW5hbCBMaXN0PExpc3Q8U3RyaW5nPj4gY29tbWFuZFpvbmVzOwoKICAgIC8vIFR1cm4gdHJhY2tpbmcKICAgIHByaXZhdGUgaW50IGN1cnJlbnRUdXJuID0gMDsKICAgIHByaXZhdGUgaW50IGFjdGl2ZVNlYXQgPSAwOwogICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFBoYXNlID0gIm1haW5fMSI7CgogICAgLy8gT3V0cHV0CiAgICBwcml2YXRlIGZpbmFsIExpc3Q8RGVjaXNpb25TbmFwc2hvdD4gZGVjaXNpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ' +
'4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBDb25zdHJ1Y3RvcgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBAcGFyYW0gbnVtUGxheWVycyAgICAgIE51bWJlciBvZiBwbGF5ZXJzICgyIGZvciAxdjEpCiAgICAgKiBAcGFyYW0gZ2FtZUlkICAgICAgICAgIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGdhbWUKICAgICAqIEBwYXJhbSBjb21tYW5kZXJOYW1lcyAgQ29tbWFuZGVyIG5hbWUgZm9yIGVhY2ggc2VhdCAoMC1pbmRleGVkKQogICAgICogQHBhcmFtIGRlY2tDYXJkTmFtZXMgICBDYXJkcyBpbiBlYWNoIHBsYXllcidzIGRlY2sgKGZvciBpbml0aWFsIHN0YXRlKQogICAgICovCiAgICBwdWJsaWMgRGVjaXNpb25FeHRyYWN0b3IoaW50IG51bVBsYXllcnMsIFN0cmluZyBnYW1lSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gY29tbWFuZGVyTmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IGRlY2tDYXJkTmFtZXMpIHsKICAgICAgICB0aGlzLm51bVBsYXllcnMgPSBudW1QbGF5ZXJzOwogICAgICAgIHRoaXMuZ2FtZUlkID0gZ2FtZUlkOwogICAgICAgIHRoaXMuY29tbWFuZGVyTmFtZXMgPSBjb21tYW5kZXJOYW1lczsKCiAgICAgICAgdGhpcy5saWZlVG90YWxzID0gbmV3IGludFtudW1QbGF5ZXJzXTsKICAgICAgICB0aGlzLmNvbW1hbmRlckRhbWFnZSA9IG5ldyBpbnRbbnVtUGxheWVyc107CiAgICAgICAgdGhpcy5jb21tYW5kZXJDYXN0cyA9IG5ldyBpbnRbbnVtUGxheWVyc107CiAgICAgICAgdGhpcy5oYW5kcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIHRoaXMuYmF0dGxlZmllbGRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgdGhpcy5ncmF2ZXlhcmRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgdGhpcy5jb21tYW5kWm9uZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QbGF5ZXJzOyBpKyspIHsKICAgICAgICAgICAgbGlmZVRvdGFsc1tpXSA9IDQwOwogICAgICAgICAgICBjb21tYW5kZXJEYW1hZ2VbaV0gPSAwOwogICAgICAgICAgICBjb21tYW5kZXJDYXN0c1tpXSA9IDA7CiAgICAgICAgICAgIGhhbmRzLmFkZChuZXcgQXJyYXlMaXN0PD4oKSk7CiAgICAgICAgICAgIGJhdHRsZWZpZWxkcy5hZGQobmV3IEFycmF5TGlzdDw+KCkpOwogICAgICAgICAgICBncmF2ZXlhcmRzLmFkZChuZXcgQXJyYXlMaXN0PD4oKSk7CgogICAgICAgICAgICAvLyBDb21tYW5kZXIgc3RhcnRzIGluIGNvbW1hbmQgem9uZQogICAgICAgICAgICBMaXN0PFN0cmluZz4gY21kWm9uZSA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICBpZiAoY29tbWFuZGVyTmFtZXNbaV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY21kWm9uZS5hZGQoY29tbWFuZGVyTmFtZXNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbW1hbmRab25lcy5hZGQoY21kWm9uZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gTWFpbiBwYXJzaW5nIGVudHJ5IHBvaW50CiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIFByb2Nlc3MgYWxsIGxpbmVzIG9mIGEgRm9yZ2UgdmVyYm9zZSBnYW1lIGxvZy4KICAgICAqIENhbGwgdGhpcyBvbmNl' +
'IHdpdGggdGhlIGZ1bGwgb3V0cHV0OyBpdCBwb3B1bGF0ZXMgdGhlIGRlY2lzaW9ucyBsaXN0LgogICAgICoKICAgICAqIEBwYXJhbSBsaW5lcyBBcnJheSBvZiBsb2cgbGluZXMgKHNwbGl0IGZyb20gZnVsbCBvdXRwdXQpCiAgICAgKiBAcmV0dXJuIExpc3Qgb2YgZGVjaXNpb24gc25hcHNob3RzIGV4dHJhY3RlZCBmcm9tIHRoaXMgZ2FtZQogICAgICovCiAgICBwdWJsaWMgTGlzdDxEZWNpc2lvblNuYXBzaG90PiBwcm9jZXNzR2FtZUxvZyhTdHJpbmdbXSBsaW5lcykgewogICAgICAgIGZvciAoU3RyaW5nIHJhd0xpbmUgOiBsaW5lcykgewogICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJhd0xpbmUudHJpbSgpOwogICAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KCkpIGNvbnRpbnVlOwoKICAgICAgICAgICAgLy8g4pSA4pSAIFR1cm4gYm91bmRhcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIE1hdGNoZXIgdHVybk0gPSBUVVJOX1BBVFRFUk4ubWF0Y2hlcihsaW5lKTsKICAgICAgICAgICAgaWYgKHR1cm5NLmZpbmQoKSkgewogICAgICAgICAgICAgICAgY3VycmVudFR1cm4gPSBJbnRlZ2VyLnBhcnNlSW50KHR1cm5NLmdyb3VwKDEpKTsKICAgICAgICAgICAgICAgIGFjdGl2ZVNlYXQgPSBJbnRlZ2VyLnBhcnNlSW50KHR1cm5NLmdyb3VwKDIpKSAtIDE7CiAgICAgICAgICAgICAgICBjdXJyZW50UGhhc2UgPSAibWFpbl8xIjsgLy8gUmVzZXQgdG8gbWFpbiAxIGF0IHR1cm4gc3RhcnQKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDilIDilIAgUGhhc2UgdHJhbnNpdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICAgTWF0Y2hlciBwaGFzZU0gPSBQSEFTRV9QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChwaGFzZU0uZmluZCgpKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50UGhhc2UgPSBub3JtYWxpemVQaGFzZShwaGFzZU0uZ3JvdXAoMSkudHJpbSgpKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDilIDilIAgRHJhdyBldmVudCAoc3RhdGUgdXBkYXRlIG9ubHksIG5vdCBhIGRlY2lzaW9uKSDilIDilIAKICAgICAgICAgICAgTWF0Y2hlciBkcmF3TSA9IERSQVdfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICBpZiAoZHJhd00uZmluZCgpKSB7CiAgICAgICAgICAgICAgICBpbnQgc2VhdCA9IEludGVnZXIucGFyc2VJbnQoZHJhd00uZ3JvdXAoMSkpIC0gMTsKICAgICAgICAgICAgICAgIFN0cmluZyBjYXJkID0gZHJhd00uZ3JvdXAoMikudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKHNlYXQgPj0gMCAmJiBzZWF0IDwgbnVtUGxheWVycykgewogICAgICAgICAgICAgICAgICAgIGhhbmRzLmdldChzZWF0KS5hZGQoY2FyZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g4pSA4pSAIENhc3Qgc3BlbGwg4oaSIERFQ0lTSU9OIFBPSU5UIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBNYXRjaGVyIGNhc3RNID0gQ0FTVF9QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChjYXN0TS5maW5kKCkpIHsKICAgICAgICAgICAgICAgIGludCBzZWF0ID0gSW50ZWdlci5wYXJzZUludChjYXN0TS5ncm91cCgxKSkgLSAxOwogICAgICAgICAgICAgICAgU3RyaW5nIGNhcmQgPSBjYXN0TS5ncm91cCgyKS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoc2VhdCA+PSAwICYmIHNlYXQgPCBudW1QbGF5ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU25hcHNob3QgQkVGT1JFIHRoZSBhY3Rpb24gY2hhbmdlcyBzdGF0ZQogICAgICAgICAgICAgICAgICAgIEFjdGlvblJlY29yZCBhY3Rpb24gPSBuZXcgQWN0aW9uUmVjb3JkKCk7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnJhd0xvZ0xpbmUgPSBsaW5lOwogICAgICAgICAgICAgICAgICAgIGFjdGlvbi5jYXJkTmFtZSA9IGNhcmQ7CgogICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBhY3Rpb24gdHlwZQogICAgICAg' +
'ICAgICAgICAgICAgIGlmIChjb21tYW5kZXJOYW1lc1tzZWF0XSAhPSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZGVyTmFtZXNbc2VhdF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi50eXBlID0gImNhc3RfY29tbWFuZGVyIjsKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyQ2FzdHNbc2VhdF0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFpvbmVzLmdldChzZWF0KS5yZW1vdmUoY2FyZCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnR5cGUgPSAiY2FzdCI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBFbWl0IGRlY2lzaW9uIHNuYXBzaG90CiAgICAgICAgICAgICAgICAgICAgZW1pdERlY2lzaW9uKHNlYXQsIGFjdGlvbik7CgogICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZTogY2FyZCBtb3ZlcyBmcm9tIGhhbmQgdG8gYmF0dGxlZmllbGQKICAgICAgICAgICAgICAgICAgICBoYW5kcy5nZXQoc2VhdCkucmVtb3ZlKGNhcmQpOwogICAgICAgICAgICAgICAgICAgIGJhdHRsZWZpZWxkcy5nZXQoc2VhdCkuYWRkKGNhcmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIOKUgOKUgCBMYW5kIHBsYXkg4oaSIERFQ0lTSU9OIFBPSU5UIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgICAgICBNYXRjaGVyIGxhbmRNID0gTEFORF9QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChsYW5kTS5maW5kKCkpIHsKICAgICAgICAgICAgICAgIGludCBzZWF0ID0gSW50ZWdlci5wYXJzZUludChsYW5kTS5ncm91cCgxKSkgLSAxOwogICAgICAgICAgICAgICAgU3RyaW5nIGNhcmQgPSBsYW5kTS5ncm91cCgyKS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoc2VhdCA+PSAwICYmIHNlYXQgPCBudW1QbGF5ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uUmVjb3JkIGFjdGlvbiA9IG5ldyBBY3Rpb25SZWNvcmQoKTsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24udHlwZSA9ICJsYW5kIjsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24uY2FyZE5hbWUgPSBjYXJkOwogICAgICAgICAgICAgICAgICAgIGFjdGlvbi5yYXdMb2dMaW5lID0gbGluZTsKCiAgICAgICAgICAgICAgICAgICAgZW1pdERlY2lzaW9uKHNlYXQsIGFjdGlvbik7CgogICAgICAgICAgICAgICAgICAgIGhhbmRzLmdldChzZWF0KS5yZW1vdmUoY2FyZCk7CiAgICAgICAgICAgICAgICAgICAgYmF0dGxlZmllbGRzLmdldChzZWF0KS5hZGQoY2FyZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g4pSA4pSAIEF0dGFjayBkZWNsYXJhdGlvbiDihpIgREVDSVNJT04gUE9JTlQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgICAgIE1hdGNoZXIgYXR0YWNrTSA9IEFUVEFDS19QQVRURVJOLm1hdGNoZXIobGluZSk7CiAgICAgICAgICAgIGlmIChhdHRhY2tNLmZpbmQoKSkgewogICAgICAgICAgICAgICAgaW50IHNlYXQgPSBJbnRlZ2VyLnBhcnNlSW50KGF0dGFja00uZ3JvdXAoMSkpIC0gMTsKICAgICAgICAgICAgICAgIGlmIChzZWF0ID49IDAgJiYgc2VhdCA8IG51bVBsYXllcnMpIHsKICAgICAgICAgICAgICAgICAgICBBY3Rpb25SZWNvcmQgYWN0aW9uID0gbmV3IEFjdGlvblJlY29yZCgpOwogICAgICAgICAgICAgICAgICAgIGFjdGlvbi50eXBlID0gImF0dGFjayI7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnJhd0xvZ0xpbmUgPSBsaW5lOwoKICAgICAgICAgICAgICAgICAgICBlbWl0RGVjaXNpb24oc2VhdCwgYWN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDilIDilIAgRGFtYWdlIHRvIHBsYXllciAoc3RhdGUgdXBkYXRlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICAgTWF0Y2hlciBkbWdNID0gREFNQUdFX1RPX1BMQVlFUi5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICBpZiAoZG1nTS5maW5kKCkpIHsKICAgICAgICAgICAgICAgIGludCBh' +
'bW91bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGRtZ00uZ3JvdXAoMSkpOwogICAgICAgICAgICAgICAgaW50IHRhcmdldFNlYXQgPSBJbnRlZ2VyLnBhcnNlSW50KGRtZ00uZ3JvdXAoMikpIC0gMTsKICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTZWF0ID49IDAgJiYgdGFyZ2V0U2VhdCA8IG51bVBsYXllcnMpIHsKICAgICAgICAgICAgICAgICAgICBsaWZlVG90YWxzW3RhcmdldFNlYXRdIC09IGFtb3VudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjb21tYW5kZXIgZGFtYWdlCiAgICAgICAgICAgICAgICBpZiAobGluZS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKCJjb21tYW5kZXIiKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTZWF0ID49IDAgJiYgdGFyZ2V0U2VhdCA8IG51bVBsYXllcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyRGFtYWdlW3RhcmdldFNlYXRdICs9IGFtb3VudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g4pSA4pSAIENhcmQgZGVzdHJveWVkIC8gZGllcyAoc3RhdGUgdXBkYXRlKSDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAgICAgTWF0Y2hlciBkZXN0cm95TSA9IERFU1RST1lfUEFUVEVSTi5tYXRjaGVyKGxpbmUpOwogICAgICAgICAgICBpZiAoZGVzdHJveU0uZmluZCgpKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgY2FyZCA9IGRlc3Ryb3lNLmdyb3VwKDEpLnRyaW0oKTsKICAgICAgICAgICAgICAgIC8vIE1vdmUgZnJvbSBiYXR0bGVmaWVsZCB0byBncmF2ZXlhcmQKICAgICAgICAgICAgICAgIGZvciAoaW50IHMgPSAwOyBzIDwgbnVtUGxheWVyczsgcysrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJhdHRsZWZpZWxkcy5nZXQocykucmVtb3ZlKGNhcmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXZleWFyZHMuZ2V0KHMpLmFkZChjYXJkKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0aGUgY29tbWFuZGVyLCBpdCBnb2VzIHRvIGNvbW1hbmQgem9uZSBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kZXJOYW1lc1tzXSAhPSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmRlck5hbWVzW3NdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhdmV5YXJkcy5nZXQocykucmVtb3ZlKGNhcmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZFpvbmVzLmdldChzKS5hZGQoY2FyZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZGVjaXNpb25zOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gU25hcHNob3QgZW1pc3Npb24KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHByaXZhdGUgdm9pZCBlbWl0RGVjaXNpb24oaW50IGFjdGluZ1NlYXQsIEFjdGlvblJlY29yZCBhY3Rpb24pIHsKICAgICAgICBEZWNpc2lvblNuYXBzaG90IHNuYXAgPSBuZXcgRGVjaXNpb25TbmFwc2hvdCgpOwogICAgICAgIHNuYXAuZ2FtZUlkID0gZ2FtZUlkOwogICAgICAgIHNuYXAudHVybk51bWJlciA9IGN1cnJlbnRUdXJuOwogICAgICAgIHNuYXAucGhhc2UgPSBjdXJyZW50UGhhc2U7CiAgICAgICAgc25hcC5hY3RpdmVTZWF0ID0gYWN0aW5nU2VhdDsKICAgICAgICBzbmFwLmFjdGlvbiA9IGFjdGlvbjsKCiAgICAgICAgLy8gQnVpbGQgcGxheWVyIHNuYXBzaG90cwogICAgICAgIHNu' +
'YXAucGxheWVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGZvciAoaW50IHMgPSAwOyBzIDwgbnVtUGxheWVyczsgcysrKSB7CiAgICAgICAgICAgIFBsYXllclNuYXBzaG90IHBzID0gbmV3IFBsYXllclNuYXBzaG90KCk7CiAgICAgICAgICAgIHBzLnNlYXRJbmRleCA9IHM7CiAgICAgICAgICAgIHBzLmxpZmVUb3RhbCA9IGxpZmVUb3RhbHNbc107CiAgICAgICAgICAgIHBzLmNvbW1hbmRlckRhbWFnZVRha2VuID0gY29tbWFuZGVyRGFtYWdlW3NdOwogICAgICAgICAgICBwcy5tYW5hQXZhaWxhYmxlID0gZXN0aW1hdGVNYW5hKHMpOwogICAgICAgICAgICBwcy5jb21tYW5kZXJUYXggPSBjb21tYW5kZXJDYXN0c1tzXSAqIDI7CiAgICAgICAgICAgIHBzLmNvbW1hbmRlckNhc3RzID0gY29tbWFuZGVyQ2FzdHNbc107CgogICAgICAgICAgICBwcy5oYW5kID0gbmV3IEFycmF5TGlzdDw+KGhhbmRzLmdldChzKSk7CiAgICAgICAgICAgIHBzLmJhdHRsZWZpZWxkID0gbmV3IEFycmF5TGlzdDw+KGJhdHRsZWZpZWxkcy5nZXQocykpOwogICAgICAgICAgICBwcy5ncmF2ZXlhcmQgPSBuZXcgQXJyYXlMaXN0PD4oZ3JhdmV5YXJkcy5nZXQocykpOwogICAgICAgICAgICBwcy5jb21tYW5kWm9uZSA9IG5ldyBBcnJheUxpc3Q8Pihjb21tYW5kWm9uZXMuZ2V0KHMpKTsKCiAgICAgICAgICAgIC8vIENvbXB1dGUgYm9hcmQgc3RhdHMKICAgICAgICAgICAgcHMuY3JlYXR1cmVzT25GaWVsZCA9IGNvdW50VHlwZShiYXR0bGVmaWVsZHMuZ2V0KHMpLCAiY3JlYXR1cmUiKTsKICAgICAgICAgICAgcHMudG90YWxQb3dlck9uQm9hcmQgPSAwOyAgLy8gV291bGQgbmVlZCBjYXJkIERCIOKAlCBsZWF2ZSBhcyAwIGZvciBub3cKICAgICAgICAgICAgcHMudG90YWxUb3VnaG5lc3NPbkJvYXJkID0gMDsKICAgICAgICAgICAgcHMuYXJ0aWZhY3RzT25GaWVsZCA9IDA7CiAgICAgICAgICAgIHBzLmVuY2hhbnRtZW50c09uRmllbGQgPSAwOwogICAgICAgICAgICBwcy5sYW5kQ291bnQgPSBjb3VudExhbmRzKGJhdHRsZWZpZWxkcy5nZXQocykpOwoKICAgICAgICAgICAgc25hcC5wbGF5ZXJzLmFkZChwcyk7CiAgICAgICAgfQoKICAgICAgICBkZWNpc2lvbnMuYWRkKHNuYXApOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gSGVscGVycwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBFc3RpbWF0ZSBhdmFpbGFibGUgbWFuYSBmcm9tIGxhbmQgY291bnQgb24gYmF0dGxlZmllbGQuCiAgICAgKiBTaW1wbGUgaGV1cmlzdGljOiBsYW5kcyBjb3VudCDiiYggbWFuYSBhdmFpbGFibGUuCiAgICAgKiAoTWFuYSByb2NrcyBhbmQgZG9ya3Mgd291bGQgaW1wcm92ZSB0aGlzLikKICAgICAqLwogICAgcHJpdmF0ZSBpbnQgZXN0aW1hdGVNYW5hKGludCBzZWF0KSB7CiAgICAgICAgcmV0dXJuIGNvdW50TGFuZHMoYmF0dGxlZmllbGRzLmdldChzZWF0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb3VudCBsYW5kcyBvbiBiYXR0bGVmaWVsZC4KICAgICAqIEhldXJpc3RpYzogYW55IGNhcmQgbmFtZSBjb250YWluaW5nIHR5cGljYWwgbGFuZCBrZXl3b3Jkcy4KICAgICAqLwogICAgcHJpdmF0ZSBpbnQgY291bnRMYW5kcyhMaXN0PFN0cmluZz4gYmF0dGxlZmllbGQpIHsKICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgIGZvciAoU3RyaW5nIGNhcmQgOiBiYXR0bGVmaWVsZCkgewogICAgICAgICAgICBTdHJpbmcgbG93ZXIgPSBjYXJkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmIChsb3dlci5jb250YWlucygicGxhaW5zIikgfHwgbG93ZXIuY29udGFpbnMoImlzbGFuZCIpIHx8CiAgICAgICAgICAgICAgICAgICAgbG93ZXIuY29udGFpbnMoInN3YW1wIikgfHwgbG93ZXIuY29udGFpbnMoIm1vdW50YWluIikgfHwKICAgICAgICAgICAgICAgICAgICBsb3dlci5j' +
'b250YWlucygiZm9yZXN0IikgfHwgbG93ZXIuY29udGFpbnMoImxhbmQiKSB8fAogICAgICAgICAgICAgICAgICAgIGxvd2VyLmNvbnRhaW5zKCJjb21tYW5kIHRvd2VyIikgfHwgbG93ZXIuY29udGFpbnMoInNvbCByaW5nIikgfHwKICAgICAgICAgICAgICAgICAgICBsb3dlci5jb250YWlucygidGVtcGxlIikgfHwgbG93ZXIuY29udGFpbnMoInNob2NrIikgfHwKICAgICAgICAgICAgICAgICAgICBsb3dlci5jb250YWlucygiZmV0Y2giKSB8fCBsb3dlci5lbmRzV2l0aCgiIGdhdGUiKSkgewogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY291bnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb3VudCBjYXJkcyBvZiBhIGdpdmVuIHR5cGUgb24gYmF0dGxlZmllbGQuCiAgICAgKiBXaXRob3V0IGEgY2FyZCBkYXRhYmFzZSwgd2UgdXNlIG5hbWUgaGV1cmlzdGljcy4KICAgICAqIFRPRE86IExvYWQgY2FyZCB0eXBlIGRhdGEgZnJvbSBTY3J5ZmFsbCBjYWNoZSBmb3IgYWNjdXJhY3kuCiAgICAgKi8KICAgIHByaXZhdGUgaW50IGNvdW50VHlwZShMaXN0PFN0cmluZz4gYmF0dGxlZmllbGQsIFN0cmluZyB0eXBlKSB7CiAgICAgICAgLy8gV2l0aG91dCB0eXBlIGRhdGEsIHJldHVybiB0b3RhbCBub24tbGFuZCBjb3VudCBhcyBjcmVhdHVyZSBlc3RpbWF0ZQogICAgICAgIHJldHVybiBiYXR0bGVmaWVsZC5zaXplKCkgLSBjb3VudExhbmRzKGJhdHRsZWZpZWxkKTsKICAgIH0KCiAgICAvKioKICAgICAqIE5vcm1hbGl6ZSBGb3JnZSBwaGFzZSBzdHJpbmdzIHRvIG91ciBjYW5vbmljYWwgbmFtZXMuCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nIG5vcm1hbGl6ZVBoYXNlKFN0cmluZyBmb3JnZVBoYXNlKSB7CiAgICAgICAgU3RyaW5nIGxvd2VyID0gZm9yZ2VQaGFzZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChsb3dlci5jb250YWlucygibWFpbiIpICYmIChsb3dlci5jb250YWlucygiMSIpIHx8IGxvd2VyLmNvbnRhaW5zKCJwcmUiKSkpIHsKICAgICAgICAgICAgcmV0dXJuICJtYWluXzEiOwogICAgICAgIH0KICAgICAgICBpZiAobG93ZXIuY29udGFpbnMoImNvbWJhdCIpIHx8IGxvd2VyLmNvbnRhaW5zKCJhdHRhY2siKSB8fCBsb3dlci5jb250YWlucygiYmxvY2siKSB8fCBsb3dlci5jb250YWlucygiZGFtYWdlIikpIHsKICAgICAgICAgICAgcmV0dXJuICJjb21iYXQiOwogICAgICAgIH0KICAgICAgICBpZiAobG93ZXIuY29udGFpbnMoIm1haW4iKSAmJiAobG93ZXIuY29udGFpbnMoIjIiKSB8fCBsb3dlci5jb250YWlucygicG9zdCIpKSkgewogICAgICAgICAgICByZXR1cm4gIm1haW5fMiI7CiAgICAgICAgfQogICAgICAgIGlmIChsb3dlci5jb250YWlucygiZW5kIikgfHwgbG93ZXIuY29udGFpbnMoImNsZWFudXAiKSkgewogICAgICAgICAgICByZXR1cm4gImVuZCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAibWFpbl8xIjsgLy8gRGVmYXVsdAogICAgfQoKICAgIC8qKgogICAgICogR2V0IGFsbCBleHRyYWN0ZWQgZGVjaXNpb25zIChjYWxsIGFmdGVyIHByb2Nlc3NHYW1lTG9nKS4KICAgICAqLwogICAgcHVibGljIExpc3Q8RGVjaXNpb25TbmFwc2hvdD4gZ2V0RGVjaXNpb25zKCkgewogICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGRlY2lzaW9ucyk7CiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\ml\DecisionExtractor.java' -B $b
# src/main/java/commanderailab/ml/DecisionLogger.java (7,684 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tbDsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuRGVjaXNpb25TbmFwc2hvdDsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5Kc29uRXhwb3J0ZXI7CgppbXBvcnQgamF2YS5pby4qOwppbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwppbXBvcnQgamF2YS5uaW8uZmlsZS4qOwppbXBvcnQgamF2YS51dGlsLio7CgovKioKICogRGVjaXNpb25Mb2dnZXIg4oCUIFdyaXRlcyBkZWNpc2lvbiBzbmFwc2hvdHMgdG8gSlNPTkwgZmlsZXMgZm9yIE1MIHRyYWluaW5nLgogKgogKiBFYWNoIGdhbWUncyBkZWNpc2lvbnMgYXJlIGFwcGVuZGVkIGFzIEpTT04gbGluZXMgdG8gYSBiYXRjaC1zcGVjaWZpYyBmaWxlLgogKiBGb3JtYXQ6IG9uZSBEZWNpc2lvblNuYXBzaG90IEpTT04gb2JqZWN0IHBlciBsaW5lIChKU09OTC9uZGpzb24pLgogKgogKiBPdXRwdXQgcGF0aDogcmVzdWx0cy9tbC1kZWNpc2lvbnMte2JhdGNoSWR9Lmpzb25sCiAqCiAqIFVzYWdlIGZyb20gQmF0Y2hSdW5uZXI6CiAqICAgRGVjaXNpb25Mb2dnZXIgbG9nZ2VyID0gbmV3IERlY2lzaW9uTG9nZ2VyKHJlc3VsdHNEaXIsIGJhdGNoSWQpOwogKiAgIC8vIEFmdGVyIGVhY2ggZ2FtZToKICogICBsb2dnZXIubG9nR2FtZURlY2lzaW9ucyhnYW1lSWQsIGRlY2lzaW9ucywgZGVja01ldGEpOwogKiAgIC8vIEFmdGVyIGJhdGNoOgogKiAgIGxvZ2dlci5jbG9zZSgpOwogKi8KcHVibGljIGNsYXNzIERlY2lzaW9uTG9nZ2VyIHsKCiAgICBwcml2YXRlIGZpbmFsIFBhdGggb3V0cHV0UGF0aDsKICAgIHByaXZhdGUgQnVmZmVyZWRXcml0ZXIgd3JpdGVyOwogICAgcHJpdmF0ZSBpbnQgdG90YWxEZWNpc2lvbnMgPSAwOwogICAgcHJpdmF0ZSBpbnQgdG90YWxHYW1lcyA9IDA7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gcmVzdWx0c0RpciAgRGlyZWN0b3J5IHRvIHdyaXRlIEpTT05MIGZpbGVzIChlLmcuLCAicmVzdWx0cyIpCiAgICAgKiBAcGFyYW0gYmF0Y2hJZCAgICAgQmF0Y2ggaWRlbnRpZmllciBmb3IgZmlsZSBuYW1pbmcKICAgICAqLwogICAgcHVibGljIERlY2lzaW9uTG9nZ2VyKFN0cmluZyByZXN1bHRzRGlyLCBTdHJpbmcgYmF0Y2hJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBQYXRoIGRpciA9IFBhdGgub2YocmVzdWx0c0Rpcik7CiAgICAgICAgaWYgKCFGaWxlcy5leGlzdHMoZGlyKSkgewogICAgICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3RvcmllcyhkaXIpOwogICAgICAgIH0KICAgICAgICB0aGlzLm91dHB1dFBhdGggPSBkaXIucmVzb2x2ZSgibWwtZGVjaXNpb25zLSIgKyBiYXRjaElkICsgIi5qc29ubCIpOwogICAgICAgIHRoaXMud3JpdGVyID0gRmlsZXMubmV3QnVmZmVyZWRXcml0ZXIob3V0cHV0UGF0aCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCwKICAgICAgICAgICAgICAgIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsIFN0YW5kYXJkT3Blbk9wdGlvbi5BUFBFTkQpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltNTF0gRGVjaXNpb24gbG9nZ2VyIHdyaXRpbmcgdG86ICIgKyBvdXRwdXRQYXRoLnRvQWJzb2x1dGVQYXRoKCkpOwogICAgfQoKICAgIC8qKgogICAgICogTG9nIGFsbCBkZWNpc2lvbnMgZnJvbSBhIHNpbmdsZSBnYW1lLgogICAgICoKICAgICAqIEBwYXJhbSBkZWNpc2lvbnMgICAgRGVjaXNpb24gc25hcHNob3RzIGV4dHJhY3RlZCBmcm9tIHRoZSBnYW1lCiAgICAgKiBAcGFyYW0gZGVja01ldGEgICAgIE1ldGFkYXRhIHRvIGF0dGFjaDoge3NlYXRJbmRleCDihpIge2RlY2tOYW1lLCBjb21tYW5kZXIsIGFyY2hldHlwZX19CiAgICAgKiBAcGFyYW0gZ2FtZU91dGNvbWUgICJ3aW5fc2VhdF8wIiwgIndpbl9zZWF0XzEiLCAiZHJhdyIKICAgICAqLwogICAgcHVibGljIHZvaWQgbG9nR2FtZURlY2lzaW9ucyhMaXN0PERlY2lzaW9uU25hcHNob3Q+IGRlY2lzaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGRlY2tNZXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ2FtZU91dGNvbWUpIHsKICAgICAgICBpZiAoZGVjaXNpb25zID09IG51bGwgfHwgZGVjaXNpb25zLmlzRW1wdHkoKSkgcmV0dXJuOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBmb3IgKERlY2lzaW9uU25hcHNob3Qgc25hcCA6IGRlY2lzaW9ucykgewogICAgICAgICAgICAgICAgLy8g' +
'U2VyaWFsaXplIHRvIEpTT04gdXNpbmcgb3VyIGxpZ2h0d2VpZ2h0IGV4cG9ydGVyCiAgICAgICAgICAgICAgICBTdHJpbmcganNvbiA9IHNlcmlhbGl6ZURlY2lzaW9uKHNuYXAsIGRlY2tNZXRhLCBnYW1lT3V0Y29tZSk7CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoanNvbik7CiAgICAgICAgICAgICAgICB3cml0ZXIubmV3TGluZSgpOwogICAgICAgICAgICAgICAgdG90YWxEZWNpc2lvbnMrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKICAgICAgICAgICAgdG90YWxHYW1lcysrOwogICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbTUxdIEZhaWxlZCB0byB3cml0ZSBkZWNpc2lvbnM6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2VyaWFsaXplIGEgRGVjaXNpb25TbmFwc2hvdCB0byBhIGNvbXBhY3QgSlNPTiBzdHJpbmcuCiAgICAgKiBVc2VzIG1hbnVhbCBKU09OIGJ1aWxkaW5nIHRvIGF2b2lkIGFkZGluZyBHc29uL0phY2tzb24gZGVwZW5kZW5jeS4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmcgc2VyaWFsaXplRGVjaXNpb24oRGVjaXNpb25TbmFwc2hvdCBzbmFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIE1hcDxTdHJpbmcsIFN0cmluZz4+IGRlY2tNZXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGdhbWVPdXRjb21lKSB7CiAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwNDgpOwogICAgICAgIHNiLmFwcGVuZCgieyIpOwoKICAgICAgICAvLyBHYW1lIGNvbnRleHQKICAgICAgICBhcHBlbmRTdHJpbmcoc2IsICJnYW1lX2lkIiwgc25hcC5nYW1lSWQpOyBzYi5hcHBlbmQoIiwiKTsKICAgICAgICBhcHBlbmRJbnQoc2IsICJ0dXJuIiwgc25hcC50dXJuTnVtYmVyKTsgc2IuYXBwZW5kKCIsIik7CiAgICAgICAgYXBwZW5kU3RyaW5nKHNiLCAicGhhc2UiLCBzbmFwLnBoYXNlKTsgc2IuYXBwZW5kKCIsIik7CiAgICAgICAgYXBwZW5kSW50KHNiLCAiYWN0aXZlX3NlYXQiLCBzbmFwLmFjdGl2ZVNlYXQpOyBzYi5hcHBlbmQoIiwiKTsKICAgICAgICBhcHBlbmRTdHJpbmcoc2IsICJnYW1lX291dGNvbWUiLCBnYW1lT3V0Y29tZSk7IHNiLmFwcGVuZCgiLCIpOwoKICAgICAgICAvLyBEZWNrIG1ldGFkYXRhIGZvciBhY3RpdmUgcGxheWVyCiAgICAgICAgaWYgKGRlY2tNZXRhICE9IG51bGwgJiYgZGVja01ldGEuY29udGFpbnNLZXkoc25hcC5hY3RpdmVTZWF0KSkgewogICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1ldGEgPSBkZWNrTWV0YS5nZXQoc25hcC5hY3RpdmVTZWF0KTsKICAgICAgICAgICAgc2IuYXBwZW5kKCJcImRlY2tfbmFtZVwiOiIpLmFwcGVuZChqc29uU3RyKG1ldGEuZ2V0T3JEZWZhdWx0KCJuYW1lIiwgIiIpKSkuYXBwZW5kKCIsIik7CiAgICAgICAgICAgIHNiLmFwcGVuZCgiXCJjb21tYW5kZXJcIjoiKS5hcHBlbmQoanNvblN0cihtZXRhLmdldE9yRGVmYXVsdCgiY29tbWFuZGVyIiwgIiIpKSkuYXBwZW5kKCIsIik7CiAgICAgICAgICAgIHNiLmFwcGVuZCgiXCJhcmNoZXR5cGVcIjoiKS5hcHBlbmQoanNvblN0cihtZXRhLmdldE9yRGVmYXVsdCgiYXJjaGV0eXBlIiwgIm1pZHJhbmdlIikpKS5hcHBlbmQoIiwiKTsKICAgICAgICB9CgogICAgICAgIC8vIFBsYXllcnMgYXJyYXkKICAgICAgICBzYi5hcHBlbmQoIlwicGxheWVyc1wiOlsiKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNuYXAucGxheWVycy5zaXplKCk7IGkrKykgewogICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCIpOwogICAgICAgICAgICBzZXJpYWxpemVQbGF5ZXIoc2IsIHNuYXAucGxheWVycy5nZXQoaSkpOwogICAgICAgIH0KICAgICAgICBzYi5hcHBlbmQoIl0sIik7CgogICAgICAgIC8vIEFjdGlvbgogICAgICAgIHNiLmFwcGVuZCgiXCJhY3Rpb25cIjp7Iik7CiAgICAgICAgaWYgKHNuYXAuYWN0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgYXBwZW5kU3RyaW5nKHNiLCAidHlwZSIsIHNuYXAuYWN0aW9uLnR5cGUpOyBzYi5hcHBlbmQoIiwiKTsKICAgICAgICAgICAgYXBwZW5kU3RyaW5nKHNiLCAiY2FyZCIsIHNuYXAuYWN0aW9uLmNhcmROYW1lICE9IG51bGwgPyBzbmFwLmFjdGlvbi5jYXJkTmFtZSA6ICIiKTsgc2IuYXBwZW5k' +
'KCIsIik7CiAgICAgICAgICAgIGFwcGVuZFN0cmluZyhzYiwgInRhcmdldCIsIHNuYXAuYWN0aW9uLnRhcmdldERlc2NyaXB0aW9uICE9IG51bGwgPyBzbmFwLmFjdGlvbi50YXJnZXREZXNjcmlwdGlvbiA6ICIiKTsgc2IuYXBwZW5kKCIsIik7CiAgICAgICAgICAgIGFwcGVuZFN0cmluZyhzYiwgInJhdyIsIHRydW5jYXRlKHNuYXAuYWN0aW9uLnJhd0xvZ0xpbmUsIDIwMCkpOwogICAgICAgIH0KICAgICAgICBzYi5hcHBlbmQoIn0iKTsKCiAgICAgICAgc2IuYXBwZW5kKCJ9Iik7CiAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZVBsYXllcihTdHJpbmdCdWlsZGVyIHNiLCBEZWNpc2lvblNuYXBzaG90LlBsYXllclNuYXBzaG90IHBzKSB7CiAgICAgICAgc2IuYXBwZW5kKCJ7Iik7CiAgICAgICAgYXBwZW5kSW50KHNiLCAic2VhdCIsIHBzLnNlYXRJbmRleCk7IHNiLmFwcGVuZCgiLCIpOwogICAgICAgIGFwcGVuZEludChzYiwgImxpZmUiLCBwcy5saWZlVG90YWwpOyBzYi5hcHBlbmQoIiwiKTsKICAgICAgICBhcHBlbmRJbnQoc2IsICJjbWRyX2RtZyIsIHBzLmNvbW1hbmRlckRhbWFnZVRha2VuKTsgc2IuYXBwZW5kKCIsIik7CiAgICAgICAgYXBwZW5kSW50KHNiLCAibWFuYSIsIHBzLm1hbmFBdmFpbGFibGUpOyBzYi5hcHBlbmQoIiwiKTsKICAgICAgICBhcHBlbmRJbnQoc2IsICJjbWRyX3RheCIsIHBzLmNvbW1hbmRlclRheCk7IHNiLmFwcGVuZCgiLCIpOwogICAgICAgIGFwcGVuZEludChzYiwgImNyZWF0dXJlcyIsIHBzLmNyZWF0dXJlc09uRmllbGQpOyBzYi5hcHBlbmQoIiwiKTsKICAgICAgICBhcHBlbmRJbnQoc2IsICJsYW5kcyIsIHBzLmxhbmRDb3VudCk7IHNiLmFwcGVuZCgiLCIpOwoKICAgICAgICAvLyBab25lIGNhcmQgbGlzdHMKICAgICAgICBzYi5hcHBlbmQoIlwiaGFuZFwiOiIpLmFwcGVuZChqc29uTGlzdChwcy5oYW5kKSkuYXBwZW5kKCIsIik7CiAgICAgICAgc2IuYXBwZW5kKCJcImJhdHRsZWZpZWxkXCI6IikuYXBwZW5kKGpzb25MaXN0KHBzLmJhdHRsZWZpZWxkKSkuYXBwZW5kKCIsIik7CiAgICAgICAgc2IuYXBwZW5kKCJcImdyYXZleWFyZFwiOiIpLmFwcGVuZChqc29uTGlzdChwcy5ncmF2ZXlhcmQpKS5hcHBlbmQoIiwiKTsKICAgICAgICBzYi5hcHBlbmQoIlwiY29tbWFuZF96b25lXCI6IikuYXBwZW5kKGpzb25MaXN0KHBzLmNvbW1hbmRab25lKSk7CgogICAgICAgIHNiLmFwcGVuZCgifSIpOwogICAgfQoKICAgIC8vIOKUgOKUgCBKU09OIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFN0cmluZyhTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKICAgICAgICBzYi5hcHBlbmQoIlwiIikuYXBwZW5kKGtleSkuYXBwZW5kKCJcIjoiKS5hcHBlbmQoanNvblN0cih2YWx1ZSkpOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCBhcHBlbmRJbnQoU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nIGtleSwgaW50IHZhbHVlKSB7CiAgICAgICAgc2IuYXBwZW5kKCJcIiIpLmFwcGVuZChrZXkpLmFwcGVuZCgiXCI6IikuYXBwZW5kKHZhbHVlKTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBqc29uU3RyKFN0cmluZyBzKSB7CiAgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuICJudWxsIjsKICAgICAgICByZXR1cm4gIlwiIiArIHMucmVwbGFjZSgiXFwiLCAiXFxcXCIpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgiXCIiLCAiXFxcIiIpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgiXG4iLCAiXFxuIikKICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJcciIsICJcXHIiKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoIlx0IiwgIlxcdCIpICsgIlwiIjsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBqc29uTGlzdChMaXN0PFN0cmluZz4gaXRlbXMpIHsKICAgICAgICBpZiAoaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5pc0VtcHR5KCkpIHJldHVybiAiW10iOwogICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgIHNiLmFwcGVuZCgiWyIpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgaWYgKGkgPiAw' +
'KSBzYi5hcHBlbmQoIiwiKTsKICAgICAgICAgICAgc2IuYXBwZW5kKGpzb25TdHIoaXRlbXMuZ2V0KGkpKSk7CiAgICAgICAgfQogICAgICAgIHNiLmFwcGVuZCgiXSIpOwogICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgfQoKICAgIHByaXZhdGUgU3RyaW5nIHRydW5jYXRlKFN0cmluZyBzLCBpbnQgbWF4TGVuKSB7CiAgICAgICAgaWYgKHMgPT0gbnVsbCkgcmV0dXJuICIiOwogICAgICAgIHJldHVybiBzLmxlbmd0aCgpIDw9IG1heExlbiA/IHMgOiBzLnN1YnN0cmluZygwLCBtYXhMZW4pOwogICAgfQoKICAgIC8qKgogICAgICogQ2xvc2UgdGhlIHdyaXRlciBhbmQgcHJpbnQgc3VtbWFyeS4KICAgICAqLwogICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiW01MXSBEZWNpc2lvbiBsb2cgY29tcGxldGU6ICVkIGRlY2lzaW9ucyBmcm9tICVkIGdhbWVzIOKGkiAlcyVuIiwKICAgICAgICAgICAgICAgICAgICB0b3RhbERlY2lzaW9ucywgdG90YWxHYW1lcywgb3V0cHV0UGF0aC50b0Fic29sdXRlUGF0aCgpKTsKICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiW01MXSBGYWlsZWQgdG8gY2xvc2UgZGVjaXNpb24gbG9nZ2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgUGF0aCBnZXRPdXRwdXRQYXRoKCkgewogICAgICAgIHJldHVybiBvdXRwdXRQYXRoOwogICAgfQoKICAgIHB1YmxpYyBpbnQgZ2V0VG90YWxEZWNpc2lvbnMoKSB7CiAgICAgICAgcmV0dXJuIHRvdGFsRGVjaXNpb25zOwogICAgfQp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\ml\DecisionLogger.java' -B $b
# src/main/java/commanderailab/ml/LearnedPolicy.java (9,500 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tbDsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5haS5BaVBvbGljeTsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5EZWNpc2lvblNuYXBzaG90OwoKaW1wb3J0IGphdmEudXRpbC4qOwoKLyoqCiAqIExlYXJuZWRQb2xpY3kg4oCUIEFJIHBvbGljeSBiYWNrZWQgYnkgYSB0cmFpbmVkIG5ldXJhbCBuZXR3b3JrLgogKgogKiBJbnN0ZWFkIG9mIHVzaW5nIEZvcmdlJ3MgYnVpbHQtaW4gaGV1cmlzdGljIEFJLCB0aGlzIHBvbGljeSBxdWVyaWVzCiAqIHRoZSBQeXRob24gcG9saWN5IHNlcnZlciAodmlhIFBvbGljeVNlcnZlckNsaWVudCkgZm9yIG1hY3JvLWFjdGlvbgogKiBkZWNpc2lvbnMgYXQgZWFjaCBnYW1lIGRlY2lzaW9uIHBvaW50LgogKgogKiBUaGUgcG9saWN5IHNlcnZlciBydW5zIHRoZSB0cmFpbmVkIFBvbGljeU5ldHdvcms6CiAqICAgZ2FtZSBzdGF0ZSDihpIgc3RhdGUgZW5jb2RlciDihpIgbmV1cmFsIG5ldHdvcmsg4oaSIG1hY3JvLWFjdGlvbgogKgogKiBJZiB0aGUgcG9saWN5IHNlcnZlciBpcyB1bmF2YWlsYWJsZSwgZmFsbHMgYmFjayB0byBGb3JnZSdzIGJ1aWx0LWluIEFJLgogKgogKiBVc2FnZToKICogICBMZWFybmVkUG9saWN5IHBvbGljeSA9IG5ldyBMZWFybmVkUG9saWN5KCJodHRwOi8vbG9jYWxob3N0OjgwODAiKTsKICogICBwb2xpY3kuc2V0UGxheXN0eWxlKCJhZ2dybyIpOwogKiAgIHBvbGljeS5zZXRHcmVlZHkodHJ1ZSk7CiAqCiAqICAgLy8gSW4gdGhlIGdhbWUgbG9vcDoKICogICBEZWNpc2lvblNuYXBzaG90IHN0YXRlID0gY2FwdHVyZUdhbWVTdGF0ZSgpOwogKiAgIFN0cmluZyBtYWNyb0FjdGlvbiA9IHBvbGljeS5kZWNpZGVBY3Rpb24oc3RhdGUpOwogKiAgIE1hY3JvQWN0aW9uRXhlY3V0b3IuQWN0aW9uUmVzb2x1dGlvbiBhY3Rpb24gPQogKiAgICAgICBNYWNyb0FjdGlvbkV4ZWN1dG9yLnJlc29sdmUobWFjcm9BY3Rpb24sIGhhbmQsIGJhdHRsZWZpZWxkLCAuLi4pOwogKgogKiBJbnRlZ3JhdGlvbiB3aXRoIEJhdGNoUnVubmVyOgogKiAgIFdoZW4gdXNlc0ZvcmdlQnVpbHRpbkFpKCkgcmV0dXJucyBmYWxzZSwgdGhlIEJhdGNoUnVubmVyIHNob3VsZAogKiAgIGludGVyY2VwdCBkZWNpc2lvbnMgYW5kIGNhbGwgZGVjaWRlQWN0aW9uKCkgaW5zdGVhZC4gRm9yIHRoZQogKiAgIGluaXRpYWwgdmVyc2lvbiAoUGhhc2UgNyksIHRoaXMgd29ya3MgYWxvbmdzaWRlIEZvcmdlJ3MgQUkg4oCUCiAqICAgdGhlIHBvbGljeSdzIGRlY2lzaW9uIGlzIGxvZ2dlZCBidXQgRm9yZ2Ugc3RpbGwgZXhlY3V0ZXMgdGhlIGdhbWUuCiAqICAgSW4gUGhhc2UgOCssIGRlY2lzaW9ucyB3aWxsIGJlIGZ1bGx5IGludGVyY2VwdGVkLgogKi8KcHVibGljIGNsYXNzIExlYXJuZWRQb2xpY3kgaW1wbGVtZW50cyBBaVBvbGljeSB7CgogICAgcHJpdmF0ZSBmaW5hbCBQb2xpY3lTZXJ2ZXJDbGllbnQgY2xpZW50OwogICAgcHJpdmF0ZSBTdHJpbmcgcGxheXN0eWxlOwogICAgcHJpdmF0ZSBib29sZWFuIGdyZWVkeTsKICAgIHByaXZhdGUgYm9vbGVhbiBwb2xpY3lTZXJ2ZXJBdmFpbGFibGU7CgogICAgLy8gU3RhdHMKICAgIHByaXZhdGUgaW50IHRvdGFsUXVlcmllcyA9IDA7CiAgICBwcml2YXRlIGludCBzdWNjZXNzZnVsUXVlcmllcyA9IDA7CiAgICBwcml2YXRlIGludCBmYWxsYmFja1F1ZXJpZXMgPSAwOwogICAgcHJpdmF0ZSBsb25nIHRvdGFsSW5mZXJlbmNlTXMgPSAwOwoKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByZWRpY3Rpb24gZm9yIGxvZ2dpbmcKICAgIHByaXZhdGUgUG9saWN5U2VydmVyQ2xpZW50LlBvbGljeVByZWRpY3Rpb24gbGFzdFByZWRpY3Rpb247CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBsZWFybmVkIHBvbGljeSBjb25uZWN0ZWQgdG8gdGhlIGxhYiBBUEkgc2VydmVyLgogICAgICoKICAgICAqIEBwYXJhbSBzZXJ2ZXJVcmwgQmFzZSBVUkwgKGUuZy4sICJodHRwOi8vbG9jYWxob3N0OjgwODAiKQogICAgICovCiAgICBwdWJsaWMgTGVhcm5lZFBvbGljeShTdHJpbmcgc2VydmVyVXJsKSB7CiAgICAgICAgdGhpcy5jbGllbnQgPSBuZXcgUG9saWN5U2VydmVyQ2xpZW50KHNlcnZlclVybCk7CiAgICAgICAgdGhpcy5wbGF5c3R5bGUgPSAibWlkcmFuZ2UiOwogICAgICAgIHRoaXMuZ3JlZWR5ID0gdHJ1ZTsKICAgICAgICB0aGlzLnBvbGljeVNlcnZlckF2YWlsYWJsZSA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIHdpdGggZXhwbGljaXQgc2V0' +
'dGluZ3MuCiAgICAgKi8KICAgIHB1YmxpYyBMZWFybmVkUG9saWN5KFN0cmluZyBzZXJ2ZXJVcmwsIFN0cmluZyBwbGF5c3R5bGUsIGJvb2xlYW4gZ3JlZWR5KSB7CiAgICAgICAgdGhpcyhzZXJ2ZXJVcmwpOwogICAgICAgIHRoaXMucGxheXN0eWxlID0gcGxheXN0eWxlOwogICAgICAgIHRoaXMuZ3JlZWR5ID0gZ3JlZWR5OwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gQ29ubmVjdGlvbgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGUgcG9saWN5IHNlcnZlciBoYXMgYSB0cmFpbmVkIG1vZGVsIGxvYWRlZC4KICAgICAqIENhbGwgdGhpcyBhdCBzdGFydHVwIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSBsZWFybmVkIHBvbGljeS4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gY29ubmVjdCgpIHsKICAgICAgICBwb2xpY3lTZXJ2ZXJBdmFpbGFibGUgPSBjbGllbnQuaXNBdmFpbGFibGUoKTsKICAgICAgICBpZiAocG9saWN5U2VydmVyQXZhaWxhYmxlKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW01MXSBMZWFybmVkIHBvbGljeSBjb25uZWN0ZWQg4oCUIHNlcnZlciBoYXMgbW9kZWwgbG9hZGVkIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJbTUxdIExlYXJuZWQgcG9saWN5IG5vdCBhdmFpbGFibGU6ICIgKyBjbGllbnQuZ2V0TGFzdEVycm9yKCkpOwogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIltNTF0gRmFsbGluZyBiYWNrIHRvIEZvcmdlIGJ1aWx0LWluIEFJIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb2xpY3lTZXJ2ZXJBdmFpbGFibGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXF1ZXN0IHRoZSBzZXJ2ZXIgdG8gcmVsb2FkIHRoZSBtb2RlbCAoYWZ0ZXIgdHJhaW5pbmcpLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiByZWxvYWRNb2RlbCgpIHsKICAgICAgICBib29sZWFuIG9rID0gY2xpZW50LnJlbG9hZE1vZGVsKCk7CiAgICAgICAgaWYgKG9rKSB7CiAgICAgICAgICAgIHBvbGljeVNlcnZlckF2YWlsYWJsZSA9IHRydWU7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW01MXSBNb2RlbCByZWxvYWRlZCBzdWNjZXNzZnVsbHkiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9rOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gRGVjaXNpb24gTWFraW5nCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIFF1ZXJ5IHRoZSBwb2xpY3kgbmV0d29yayBmb3IgYSBtYWNyby1hY3Rpb24gZGVjaXNpb24uCiAgICAgKgogICAgICogQHBhcmFtIHNuYXBzaG90IEN1cnJlbnQgZ2FtZSBzdGF0ZSBzbmFwc2hvdAogICAgICogQHJldHVybiBNYWNyby1hY3Rpb24gbmFtZSAoZS5nLiwgImNhc3RfY3JlYXR1cmUiKSwgb3IgInBhc3MiIG9uIGZhaWx1cmUKICAgICAqLwogICAgcHVibGljIFN0cmluZyBkZWNpZGVBY3Rpb24oRGVjaXNpb25TbmFwc2hvdCBzbmFwc2hvdCkgewogICAgICAgIHRvdGFsUXVlcmllcysrOwoKICAgICAgICBpZiAoIXBvbGljeVNlcnZlckF2YWlsYWJsZSkgewogICAgICAgICAgICBmYWxsYmFja1F1ZXJp' +
'ZXMrKzsKICAgICAgICAgICAgcmV0dXJuIE1hY3JvQWN0aW9uRXhlY3V0b3IuUEFTUzsKICAgICAgICB9CgogICAgICAgIFBvbGljeVNlcnZlckNsaWVudC5Qb2xpY3lQcmVkaWN0aW9uIHByZWQgPSBjbGllbnQucHJlZGljdChzbmFwc2hvdCwgcGxheXN0eWxlLCBncmVlZHkpOwogICAgICAgIGxhc3RQcmVkaWN0aW9uID0gcHJlZDsKCiAgICAgICAgaWYgKHByZWQuaXNWYWxpZCgpKSB7CiAgICAgICAgICAgIHN1Y2Nlc3NmdWxRdWVyaWVzKys7CiAgICAgICAgICAgIHRvdGFsSW5mZXJlbmNlTXMgKz0gKGxvbmcpIHByZWQuaW5mZXJlbmNlTXM7CiAgICAgICAgICAgIHJldHVybiBwcmVkLmFjdGlvbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWxsYmFja1F1ZXJpZXMrKzsKICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJbTUxdIFByZWRpY3Rpb24gZmFpbGVkOiAiICsgcHJlZC5lcnJvcik7CiAgICAgICAgICAgIHJldHVybiBNYWNyb0FjdGlvbkV4ZWN1dG9yLlBBU1M7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogR2V0IHRoZSBmdWxsIHByZWRpY3Rpb24gcmVzdWx0IGZvciB0aGUgbGFzdCBkZWNpc2lvbi4KICAgICAqIFVzZWZ1bCBmb3IgbG9nZ2luZyBwcm9iYWJpbGl0aWVzIGFsb25nc2lkZSBnYW1lIGFjdGlvbnMuCiAgICAgKi8KICAgIHB1YmxpYyBQb2xpY3lTZXJ2ZXJDbGllbnQuUG9saWN5UHJlZGljdGlvbiBnZXRMYXN0UHJlZGljdGlvbigpIHsKICAgICAgICByZXR1cm4gbGFzdFByZWRpY3Rpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXNvbHZlIHRoZSBsYXN0IGRlY2lzaW9uIHRvIGEgY29uY3JldGUgYWN0aW9uLgogICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgY29tYmluZXMgZGVjaWRlQWN0aW9uICsgTWFjcm9BY3Rpb25FeGVjdXRvci4KICAgICAqLwogICAgcHVibGljIE1hY3JvQWN0aW9uRXhlY3V0b3IuQWN0aW9uUmVzb2x1dGlvbiByZXNvbHZlQWN0aW9uKAogICAgICAgICAgICBEZWNpc2lvblNuYXBzaG90IHNuYXBzaG90LAogICAgICAgICAgICBMaXN0PFN0cmluZz4gaGFuZCwKICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGJhdHRsZWZpZWxkLAogICAgICAgICAgICBMaXN0PFN0cmluZz4gY29tbWFuZFpvbmUsCiAgICAgICAgICAgIGludCBtYW5hQXZhaWxhYmxlLAogICAgICAgICAgICBTdHJpbmcgY29tbWFuZGVyTmFtZSwKICAgICAgICAgICAgaW50IGNvbW1hbmRlclRheAogICAgKSB7CiAgICAgICAgU3RyaW5nIG1hY3JvQWN0aW9uID0gZGVjaWRlQWN0aW9uKHNuYXBzaG90KTsKICAgICAgICByZXR1cm4gTWFjcm9BY3Rpb25FeGVjdXRvci5yZXNvbHZlKAogICAgICAgICAgICBtYWNyb0FjdGlvbiwgaGFuZCwgYmF0dGxlZmllbGQsIGNvbW1hbmRab25lLAogICAgICAgICAgICBtYW5hQXZhaWxhYmxlLCBjb21tYW5kZXJOYW1lLCBjb21tYW5kZXJUYXgKICAgICAgICApOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gQWlQb2xpY3kgSW50ZXJmYWNlCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICByZXR1cm4gImxlYXJuZWQtcG9saWN5IjsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBkb3VibGUgZ2V0Q2FyZEFkdmFudGFnZVdlaWdodCgpIHsKICAgICAgICAvLyBUaGVzZSB3ZWlnaHRzIGFyZSBub3QgdXNlZCBieSB0aGUgbGVhcm5lZCBwb2xpY3kKICAgICAgICAvLyAodGhlIG5ldHdvcmsgbGVhcm5zIGl0cyBvd24gd2VpZ2h0cykKICAgICAgICByZXR1cm4gMC41OwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGRvdWJsZSBnZXRUZW1wb1dlaWdodCgpIHsKICAgICAgICByZXR1cm4gMC41OwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGRvdWJsZSBnZXRUaHJlYXRTY29y' +
'aW5nV2VpZ2h0KCkgewogICAgICAgIHJldHVybiAwLjU7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgZG91YmxlIGdldENvbWJhdFdlaWdodCgpIHsKICAgICAgICByZXR1cm4gMC41OwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGJvb2xlYW4gdXNlc0ZvcmdlQnVpbHRpbkFpKCkgewogICAgICAgIC8vIFdoZW4gcG9saWN5IHNlcnZlciBpcyBub3QgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gRm9yZ2UgQUkKICAgICAgICByZXR1cm4gIXBvbGljeVNlcnZlckF2YWlsYWJsZTsKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIENvbmZpZ3VyYXRpb24KICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKICAgIHB1YmxpYyB2b2lkIHNldFBsYXlzdHlsZShTdHJpbmcgcGxheXN0eWxlKSB7CiAgICAgICAgdGhpcy5wbGF5c3R5bGUgPSBwbGF5c3R5bGU7CiAgICB9CgogICAgcHVibGljIFN0cmluZyBnZXRQbGF5c3R5bGUoKSB7CiAgICAgICAgcmV0dXJuIHBsYXlzdHlsZTsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBzZXRHcmVlZHkoYm9vbGVhbiBncmVlZHkpIHsKICAgICAgICB0aGlzLmdyZWVkeSA9IGdyZWVkeTsKICAgIH0KCiAgICBwdWJsaWMgYm9vbGVhbiBpc0dyZWVkeSgpIHsKICAgICAgICByZXR1cm4gZ3JlZWR5OwogICAgfQoKICAgIHB1YmxpYyBib29sZWFuIGlzUG9saWN5U2VydmVyQXZhaWxhYmxlKCkgewogICAgICAgIHJldHVybiBwb2xpY3lTZXJ2ZXJBdmFpbGFibGU7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBTdGF0cwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgcHVibGljIGludCBnZXRUb3RhbFF1ZXJpZXMoKSB7IHJldHVybiB0b3RhbFF1ZXJpZXM7IH0KICAgIHB1YmxpYyBpbnQgZ2V0U3VjY2Vzc2Z1bFF1ZXJpZXMoKSB7IHJldHVybiBzdWNjZXNzZnVsUXVlcmllczsgfQogICAgcHVibGljIGludCBnZXRGYWxsYmFja1F1ZXJpZXMoKSB7IHJldHVybiBmYWxsYmFja1F1ZXJpZXM7IH0KCiAgICBwdWJsaWMgZG91YmxlIGdldEF2ZXJhZ2VJbmZlcmVuY2VNcygpIHsKICAgICAgICByZXR1cm4gc3VjY2Vzc2Z1bFF1ZXJpZXMgPiAwID8gKGRvdWJsZSkgdG90YWxJbmZlcmVuY2VNcyAvIHN1Y2Nlc3NmdWxRdWVyaWVzIDogMDsKICAgIH0KCiAgICBwdWJsaWMgZG91YmxlIGdldFN1Y2Nlc3NSYXRlKCkgewogICAgICAgIHJldHVybiB0b3RhbFF1ZXJpZXMgPiAwID8gKGRvdWJsZSkgc3VjY2Vzc2Z1bFF1ZXJpZXMgLyB0b3RhbFF1ZXJpZXMgOiAwOwogICAgfQoKICAgIC8qKgogICAgICogR2V0IGEgc3VtbWFyeSBvZiBwb2xpY3kgcGVyZm9ybWFuY2UgZm9yIGxvZ2dpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHNTdW1tYXJ5KCkgewogICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAiTGVhcm5lZFBvbGljeVtxdWVyaWVzPSVkLCBzdWNjZXNzPSVkICglLjFmJSUpLCBmYWxsYmFjaz0lZCwgYXZnX2luZmVyZW5jZT0lLjFmbXMsIHN0eWxlPSVzLCBncmVlZHk9JXNdIiwKICAgICAgICAgICAgdG90YWxRdWVyaWVzLCBzdWNjZXNzZnVsUXVlcmllcywKICAgICAgICAgICAgZ2V0U3VjY2Vzc1JhdGUoKSAqIDEwMCwKICAg' +
'ICAgICAgICAgZmFsbGJhY2tRdWVyaWVzLCBnZXRBdmVyYWdlSW5mZXJlbmNlTXMoKSwKICAgICAgICAgICAgcGxheXN0eWxlLCBncmVlZHkKICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHJlc2V0U3RhdHMoKSB7CiAgICAgICAgdG90YWxRdWVyaWVzID0gMDsKICAgICAgICBzdWNjZXNzZnVsUXVlcmllcyA9IDA7CiAgICAgICAgZmFsbGJhY2tRdWVyaWVzID0gMDsKICAgICAgICB0b3RhbEluZmVyZW5jZU1zID0gMDsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkxlYXJuZWRQb2xpY3lbc2VydmVyPSVzLCBhdmFpbGFibGU9JXMsIHN0eWxlPSVzXSIsCiAgICAgICAgICAgIHBvbGljeVNlcnZlckF2YWlsYWJsZSA/ICJjb25uZWN0ZWQiIDogImRpc2Nvbm5lY3RlZCIsCiAgICAgICAgICAgIHBvbGljeVNlcnZlckF2YWlsYWJsZSwgcGxheXN0eWxlKTsKICAgIH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\ml\LearnedPolicy.java' -B $b
# src/main/java/commanderailab/ml/MacroActionExecutor.java (12,238 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tbDsKCmltcG9ydCBqYXZhLnV0aWwuKjsKCi8qKgogKiBNYWNyb0FjdGlvbkV4ZWN1dG9yIOKAlCBUcmFuc2xhdGVzIGxlYXJuZWQgcG9saWN5IG1hY3JvLWFjdGlvbnMgaW50bwogKiBjb25jcmV0ZSBGb3JnZSBhY3Rpb24gZGVzY3JpcHRpb25zLgogKgogKiBUaGUgcG9saWN5IG5ldHdvcmsgb3V0cHV0cyBvbmUgb2YgOCBtYWNyby1hY3Rpb25zLiBUaGlzIGNsYXNzIG1hcHMKICogZWFjaCBtYWNyby1hY3Rpb24gdG8gYSBoZXVyaXN0aWMgdGhhdCBzZWxlY3RzIHRoZSBiZXN0IGNvbmNyZXRlCiAqIEZvcmdlIGFjdGlvbiBmcm9tIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4KICoKICogTWFjcm8tYWN0aW9uIHNwYWNlIChtYXRjaGluZyBtbC9jb25maWcvc2NvcGUucHkpOgogKiAgIDA6IGNhc3RfY3JlYXR1cmUgICAgICDigJQgUGxheSB0aGUgYmVzdCBhdmFpbGFibGUgY3JlYXR1cmUgZnJvbSBoYW5kCiAqICAgMTogY2FzdF9yZW1vdmFsICAgICAgICDigJQgQ2FzdCByZW1vdmFsL2ludGVyYWN0aW9uIG9uIGJpZ2dlc3QgdGhyZWF0CiAqICAgMjogY2FzdF9kcmF3ICAgICAgICAgICDigJQgQ2FzdCBhIGNhcmQtZHJhdyBvciBjYW50cmlwIHNwZWxsCiAqICAgMzogY2FzdF9yYW1wICAgICAgICAgICDigJQgQ2FzdCBhIHJhbXAgc3BlbGwgb3IgbWFuYSByb2NrCiAqICAgNDogY2FzdF9jb21tYW5kZXIgICAgICDigJQgQ2FzdCBjb21tYW5kZXIgZnJvbSBjb21tYW5kIHpvbmUKICogICA1OiBhdHRhY2tfb3Bwb25lbnQgICAgIOKAlCBBdHRhY2sgd2l0aCBwcm9maXRhYmxlIGF0dGFja2VycwogKiAgIDY6IGhvbGRfbWFuYSAgICAgICAgICAg4oCUIFBhc3MgcHJpb3JpdHksIGtlZXAgbWFuYSBvcGVuCiAqICAgNzogcGFzcyAgICAgICAgICAgICAgICDigJQgUGFzcyB3aXRoIG5vIGFjdGlvbgogKgogKiBJbnRlZ3JhdGlvbjoKICogICBUaGlzIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBGb3JnZSdzIGdhbWUgc3RhdGUuIEluIFBoYXNlIDgrLAogKiAgIHdoZW4gd2UgaW50ZXJjZXB0IEZvcmdlJ3MgZGVjaXNpb24gbG9vcCwgdGhpcyBjbGFzcyBzZWxlY3RzCiAqICAgd2hpY2ggY29uY3JldGUgY2FyZC9hYmlsaXR5IHRvIHVzZSBiYXNlZCBvbiB0aGUgbWFjcm8tYWN0aW9uLgogKgogKiAgIEZvciBub3cgKFBoYXNlIDcpLCBpdCBwcm9kdWNlcyBzdHJ1Y3R1cmVkIGd1aWRhbmNlIHRoYXQgY2FuIGJlCiAqICAgbG9nZ2VkIGFsb25nc2lkZSB0aGUgcG9saWN5J3MgZGVjaXNpb24gZm9yIGFuYWx5c2lzLgogKi8KcHVibGljIGNsYXNzIE1hY3JvQWN0aW9uRXhlY3V0b3IgewoKICAgIC8vIOKUgOKUgCBNYWNyby1hY3Rpb24gY29uc3RhbnRzIChtdXN0IG1hdGNoIFB5dGhvbiBzY29wZS5weSBpbmRpY2VzKSDilIDilIAKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU1RfQ1JFQVRVUkUgPSAiY2FzdF9jcmVhdHVyZSI7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNUX1JFTU9WQUwgPSAiY2FzdF9yZW1vdmFsIjsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU1RfRFJBVyA9ICJjYXN0X2RyYXciOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTVF9SQU1QID0gImNhc3RfcmFtcCI7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNUX0NPTU1BTkRFUiA9ICJjYXN0X2NvbW1hbmRlciI7CiAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0tfT1BQT05FTlQgPSAiYXR0YWNrX29wcG9uZW50IjsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPTERfTUFOQSA9ICJob2xkX21hbmEiOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTUyA9ICJwYXNzIjsKCiAgICAvKiogQWxsIHZhbGlkIG1hY3JvLWFjdGlvbiBuYW1lcyBpbiBpbmRleCBvcmRlci4gKi8KICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IEFMTF9BQ1RJT05TID0gTGlzdC5vZigKICAgICAgICBDQVNUX0NSRUFUVVJFLCBDQVNUX1JFTU9WQUwsIENBU1RfRFJBVywgQ0FTVF9SQU1QLAogICAgICAgIENBU1RfQ09NTUFOREVSLCBBVFRBQ0tfT1BQT05FTlQsIEhPTERfTUFOQSwgUEFTUwogICAgKTsKCiAgICAvLyDilIDilIAgS25vd24gY2FyZCByb2xlIGRhdGFiYXNlcyAobWF0Y2hpbmcgUHl0aG9uIGxhYmVsZXIucHkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFJFTU9WQUxf' +
'Q0FSRFMgPSBTZXQub2YoCiAgICAgICAgIlN3b3JkcyB0byBQbG93c2hhcmVzIiwgIlBhdGggdG8gRXhpbGUiLCAiQmVhc3QgV2l0aGluIiwgIkNoYW9zIFdhcnAiLAogICAgICAgICJDb3VudGVyc3BlbGwiLCAiU3dhbiBTb25nIiwgIkN5Y2xvbmljIFJpZnQiLCAiQmxhc3BoZW1vdXMgQWN0IiwKICAgICAgICAiV3JhdGggb2YgR29kIiwgIkdlbmVyb3VzIEdpZnQiLCAiVGVybWluYXRlIiwgIkdvIGZvciB0aGUgVGhyb2F0IiwKICAgICAgICAiRG9vbSBCbGFkZSIsICJSYXBpZCBIeWJyaWRpemF0aW9uIiwgIlZhbmRhbGJsYXN0IiwgIktyb3NhbiBHcmlwIiwKICAgICAgICAiQW5ndWlzaGVkIFVubWFraW5nIiwgIlZpbmRpY2F0ZSIsICJUb3hpYyBEZWx1Z2UiLCAiRGFtbmF0aW9uIiwKICAgICAgICAiU3VwcmVtZSBWZXJkaWN0IiwgIkF1c3RlcmUgQ29tbWFuZCIsICJGYXJld2VsbCIsICJEZWFkbHkgUm9sbGljayIsCiAgICAgICAgIkZvcmNlIG9mIFdpbGwiLCAiTWFuYSBEcmFpbiIsICJQb25naWZ5IiwgIlJlYWxpdHkgU2hpZnQiLAogICAgICAgICJSYXZlbmZvcm0iLCAiQWJyYWRlIiwgIkxpZ2h0bmluZyBCb2x0IiwgIkdlbmVyb3VzIEdpZnQiCiAgICApOwoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IERSQVdfQ0FSRFMgPSBTZXQub2YoCiAgICAgICAgIlJoeXN0aWMgU3R1ZHkiLCAiTXlzdGljIFJlbW9yYSIsICJIYXJtb25pemUiLCAiQnJhaW5zdG9ybSIsCiAgICAgICAgIlBvbmRlciIsICJQcmVvcmRhaW4iLCAiTmlnaHQncyBXaGlzcGVyIiwgIlNpZ24gaW4gQmxvb2QiLAogICAgICAgICJQaHlyZXhpYW4gQXJlbmEiLCAiU3lsdmFuIExpYnJhcnkiLCAiU2t1bGxjbGFtcCIsICJSZWFkIHRoZSBCb25lcyIsCiAgICAgICAgIkJsdWUgU3VuJ3MgWmVuaXRoIiwgIkZhY3Qgb3IgRmljdGlvbiIsICJEaWcgVGhyb3VnaCBUaW1lIiwKICAgICAgICAiVHJlYXN1cmUgQ3J1aXNlIiwgIkRhbW5hYmxlIFBhY3QiLCAiUHVsbCBmcm9tIFRvbW9ycm93IiwKICAgICAgICAiR3VhcmRpYW4gUHJvamVjdCIsICJCZWFzdCBXaGlzcGVyZXIiLCAiVG9za2ksIEJlYXJlciBvZiBTZWNyZXRzIgogICAgKTsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBSQU1QX0NBUkRTID0gU2V0Lm9mKAogICAgICAgICJTb2wgUmluZyIsICJBcmNhbmUgU2lnbmV0IiwgIkN1bHRpdmF0ZSIsICJLb2RhbWEncyBSZWFjaCIsCiAgICAgICAgIlJhbXBhbnQgR3Jvd3RoIiwgIkZhcnNlZWsiLCAiTWluZCBTdG9uZSIsICJDb21tYW5kZXIncyBTcGhlcmUiLAogICAgICAgICJGZWxsd2FyIFN0b25lIiwgIlRob3VnaHQgVmVzc2VsIiwgIk5hdHVyZSdzIExvcmUiLCAiU29sZW1uIFNpbXVsYWNydW0iLAogICAgICAgICJTYWt1cmEtVHJpYmUgRWxkZXIiLCAiQmlyZHMgb2YgUGFyYWRpc2UiLCAiTGxhbm93YXIgRWx2ZXMiLAogICAgICAgICJFbHZpc2ggTXlzdGljIiwgIk1hbmEgQ3J5cHQiLCAiQ2hyb21lIE1veCIsICJNb3ggRGlhbW9uZCIsCiAgICAgICAgIkpld2VsZWQgTG90dXMiLCAiRG9ja3NpZGUgRXh0b3J0aW9uaXN0IiwgIlNtb3RoZXJpbmcgVGl0aGUiLAogICAgICAgICJUYWxpc21hbnMiLCAiU2lnbmV0cyIsICJUaHJlZSBWaXNpdHMiLCAiU2t5c2hyb3VkIENsYWltIgogICAgKTsKCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFjdGlvbiBFeGVjdXRpb24gUmVzdWx0CiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIFJlc3VsdCBvZiByZXNvbHZpbmcgYSBtYWNyby1hY3Rpb24gdG8gYSBjb25jcmV0ZSBhY3Rpb24uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aW9uUmVzb2x1dGlvbiB7CiAgICAgICAgLyoqIFRoZSBvcmlnaW5hbCBtYWNyby1hY3Rpb24gZnJvbSB0aGUgcG9saWN5ICovCiAgICAgICAgcHVibGljIFN0cmlu' +
'ZyBtYWNyb0FjdGlvbjsKCiAgICAgICAgLyoqIFRoZSBjb25jcmV0ZSBjYXJkIHRvIHBsYXkgKG51bGwgZm9yIGF0dGFjay9ob2xkL3Bhc3MpICovCiAgICAgICAgcHVibGljIFN0cmluZyBzZWxlY3RlZENhcmQ7CgogICAgICAgIC8qKiBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdG8gZG8gKi8KICAgICAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uOwoKICAgICAgICAvKiogV2hldGhlciB0aGlzIGFjdGlvbiBpcyBhY3R1YWxseSBleGVjdXRhYmxlIHJpZ2h0IG5vdyAqLwogICAgICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGFibGU7CgogICAgICAgIC8qKiBGYWxsYmFjayBtYWNyby1hY3Rpb24gaWYgdGhpcyBvbmUgaXNuJ3QgZXhlY3V0YWJsZSAqLwogICAgICAgIHB1YmxpYyBTdHJpbmcgZmFsbGJhY2tBY3Rpb247CgogICAgICAgIHB1YmxpYyBBY3Rpb25SZXNvbHV0aW9uKFN0cmluZyBtYWNyb0FjdGlvbiwgU3RyaW5nIGNhcmQsIFN0cmluZyBkZXNjLCBib29sZWFuIGV4ZWN1dGFibGUpIHsKICAgICAgICAgICAgdGhpcy5tYWNyb0FjdGlvbiA9IG1hY3JvQWN0aW9uOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FyZCA9IGNhcmQ7CiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjOwogICAgICAgICAgICB0aGlzLmV4ZWN1dGFibGUgPSBleGVjdXRhYmxlOwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslc10gJXMg4oaSICVzICglcykiLAogICAgICAgICAgICAgICAgbWFjcm9BY3Rpb24sIHNlbGVjdGVkQ2FyZCAhPSBudWxsID8gc2VsZWN0ZWRDYXJkIDogIi0iLAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sIGV4ZWN1dGFibGUgPyAiT0siIDogIkZBTExCQUNL4oaSIiArIGZhbGxiYWNrQWN0aW9uKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBSZXNvbHV0aW9uIExvZ2ljCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICAvKioKICAgICAqIFJlc29sdmUgYSBtYWNyby1hY3Rpb24gdG8gYSBjb25jcmV0ZSBhY3Rpb24gZ2l2ZW4gdGhlIGN1cnJlbnQgZ2FtZSBzdGF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gbWFjcm9BY3Rpb24gIFRoZSBtYWNyby1hY3Rpb24gbmFtZSBmcm9tIHRoZSBwb2xpY3kgKGUuZy4sICJjYXN0X2NyZWF0dXJlIikKICAgICAqIEBwYXJhbSBoYW5kICAgICAgICAgQ2FyZHMgaW4gdGhlIGFjdGl2ZSBwbGF5ZXIncyBoYW5kCiAgICAgKiBAcGFyYW0gYmF0dGxlZmllbGQgIENhcmRzIG9uIHRoZSBhY3RpdmUgcGxheWVyJ3MgYmF0dGxlZmllbGQKICAgICAqIEBwYXJhbSBjb21tYW5kWm9uZSAgQ2FyZHMgaW4gdGhlIGNvbW1hbmQgem9uZQogICAgICogQHBhcmFtIG1hbmFBdmFpbGFibGUgQXZhaWxhYmxlIG1hbmEKICAgICAqIEBwYXJhbSBjb21tYW5kZXJOYW1lIFRoZSBwbGF5ZXIncyBjb21tYW5kZXIgbmFtZQogICAgICogQHBhcmFtIGNvbW1hbmRlclRheCBDb21tYW5kZXIgdGF4IGFtb3VudAogICAgICogQHJldHVybiBBY3Rpb25SZXNvbHV0aW9uIHdpdGggdGhlIGNvbmNyZXRlIGFjdGlvbiB0byB0YWtlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgQWN0aW9uUmVzb2x1dGlvbiByZXNvbHZlKAogICAgICAgICAgICBTdHJpbmcgbWFjcm9BY3Rpb24sCiAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBoYW5kLAogICAgICAgICAgICBMaXN0PFN0cmluZz4gYmF0dGxlZmllbGQsCiAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjb21tYW5kWm9uZSwKICAgICAgICAgICAgaW50IG1hbmFBdmFpbGFibGUsCiAgICAgICAgICAgIFN0cmluZyBjb21tYW5kZXJOYW1lLAogICAgICAgICAgICBpbnQgY29tbWFuZGVyVGF4CiAgICApIHsKICAgICAgICByZXR1cm4gc3dpdGNoIChtYWNy' +
'b0FjdGlvbikgewogICAgICAgICAgICBjYXNlIENBU1RfQ1JFQVRVUkUgLT4gcmVzb2x2ZUNhc3RDcmVhdHVyZShoYW5kLCBtYW5hQXZhaWxhYmxlKTsKICAgICAgICAgICAgY2FzZSBDQVNUX1JFTU9WQUwgLT4gcmVzb2x2ZUNhc3RSZW1vdmFsKGhhbmQsIG1hbmFBdmFpbGFibGUpOwogICAgICAgICAgICBjYXNlIENBU1RfRFJBVyAtPiByZXNvbHZlQ2FzdERyYXcoaGFuZCwgbWFuYUF2YWlsYWJsZSk7CiAgICAgICAgICAgIGNhc2UgQ0FTVF9SQU1QIC0+IHJlc29sdmVDYXN0UmFtcChoYW5kLCBtYW5hQXZhaWxhYmxlKTsKICAgICAgICAgICAgY2FzZSBDQVNUX0NPTU1BTkRFUiAtPiByZXNvbHZlQ2FzdENvbW1hbmRlcihjb21tYW5kWm9uZSwgY29tbWFuZGVyTmFtZSwgY29tbWFuZGVyVGF4LCBtYW5hQXZhaWxhYmxlKTsKICAgICAgICAgICAgY2FzZSBBVFRBQ0tfT1BQT05FTlQgLT4gcmVzb2x2ZUF0dGFjayhiYXR0bGVmaWVsZCk7CiAgICAgICAgICAgIGNhc2UgSE9MRF9NQU5BIC0+IG5ldyBBY3Rpb25SZXNvbHV0aW9uKEhPTERfTUFOQSwgbnVsbCwgIkhvbGQgbWFuYSBvcGVuLCBwYXNzIHByaW9yaXR5IiwgdHJ1ZSk7CiAgICAgICAgICAgIGNhc2UgUEFTUyAtPiBuZXcgQWN0aW9uUmVzb2x1dGlvbihQQVNTLCBudWxsLCAiUGFzcyB3aXRoIG5vIGFjdGlvbiIsIHRydWUpOwogICAgICAgICAgICBkZWZhdWx0IC0+IG5ldyBBY3Rpb25SZXNvbHV0aW9uKG1hY3JvQWN0aW9uLCBudWxsLCAiVW5rbm93biBtYWNyby1hY3Rpb24iLCBmYWxzZSk7CiAgICAgICAgfTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBBY3Rpb25SZXNvbHV0aW9uIHJlc29sdmVDYXN0Q3JlYXR1cmUoTGlzdDxTdHJpbmc+IGhhbmQsIGludCBtYW5hKSB7CiAgICAgICAgLy8gRmluZCBjYXN0YWJsZSBjcmVhdHVyZXMgKHRob3NlIG5vdCBpbiByZW1vdmFsL2RyYXcvcmFtcCBkYXRhYmFzZXMpCiAgICAgICAgTGlzdDxTdHJpbmc+IGNyZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGZvciAoU3RyaW5nIGNhcmQgOiBoYW5kKSB7CiAgICAgICAgICAgIGlmICghaXNSZW1vdmFsKGNhcmQpICYmICFpc0RyYXcoY2FyZCkgJiYgIWlzUmFtcChjYXJkKSkgewogICAgICAgICAgICAgICAgY3JlYXR1cmVzLmFkZChjYXJkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNyZWF0dXJlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgQWN0aW9uUmVzb2x1dGlvbiByID0gbmV3IEFjdGlvblJlc29sdXRpb24oQ0FTVF9DUkVBVFVSRSwgbnVsbCwKICAgICAgICAgICAgICAgICJObyBjcmVhdHVyZXMgaW4gaGFuZCIsIGZhbHNlKTsKICAgICAgICAgICAgci5mYWxsYmFja0FjdGlvbiA9IEhPTERfTUFOQTsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgfQoKICAgICAgICAvLyBQaWNrIGEgY3JlYXR1cmUgKGhldXJpc3RpYzogcHJlZmVyIHZhcmlldHksIGZpcnN0IG9uZSBmb3VuZCkKICAgICAgICBTdHJpbmcgcGljayA9IGNyZWF0dXJlcy5nZXQoMCk7CiAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25SZXNvbHV0aW9uKENBU1RfQ1JFQVRVUkUsIHBpY2ssCiAgICAgICAgICAgICJDYXN0IGNyZWF0dXJlOiAiICsgcGljaywgdHJ1ZSk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgQWN0aW9uUmVzb2x1dGlvbiByZXNvbHZlQ2FzdFJlbW92YWwoTGlzdDxTdHJpbmc+IGhhbmQsIGludCBtYW5hKSB7CiAgICAgICAgZm9yIChTdHJpbmcgY2FyZCA6IGhhbmQpIHsKICAgICAgICAgICAgaWYgKGlzUmVtb3ZhbChjYXJkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25SZXNvbHV0aW9uKENBU1RfUkVNT1ZBTCwgY2FyZCwKICAgICAgICAgICAgICAgICAgICAiQ2FzdCByZW1vdmFsOiAiICsgY2FyZCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEFjdGlvblJlc29sdXRpb24gciA9IG5ldyBBY3Rpb25SZXNvbHV0aW9uKENBU1RfUkVNT1ZBTCwgbnVsbCwKICAgICAgICAgICAgIk5vIHJlbW92YWwgaW4gaGFuZCIsIGZhbHNlKTsKICAgICAgICByLmZhbGxiYWNrQWN0aW9uID0gSE9MRF9NQU5BOwogICAgICAgIHJldHVybiByOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIEFjdGlvblJlc29sdXRpb24gcmVzb2x2ZUNhc3REcmF3KExpc3Q8U3RyaW5nPiBoYW5kLCBpbnQgbWFuYSkgewogICAgICAgIGZvciAoU3RyaW5nIGNhcmQgOiBoYW5kKSB7CiAgICAgICAgICAgIGlmIChpc0RyYXcoY2FyZCkpIHsKICAgICAg' +
'ICAgICAgICAgIHJldHVybiBuZXcgQWN0aW9uUmVzb2x1dGlvbihDQVNUX0RSQVcsIGNhcmQsCiAgICAgICAgICAgICAgICAgICAgIkNhc3QgZHJhdyBzcGVsbDogIiArIGNhcmQsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBBY3Rpb25SZXNvbHV0aW9uIHIgPSBuZXcgQWN0aW9uUmVzb2x1dGlvbihDQVNUX0RSQVcsIG51bGwsCiAgICAgICAgICAgICJObyBkcmF3IHNwZWxscyBpbiBoYW5kIiwgZmFsc2UpOwogICAgICAgIHIuZmFsbGJhY2tBY3Rpb24gPSBIT0xEX01BTkE7CiAgICAgICAgcmV0dXJuIHI7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgQWN0aW9uUmVzb2x1dGlvbiByZXNvbHZlQ2FzdFJhbXAoTGlzdDxTdHJpbmc+IGhhbmQsIGludCBtYW5hKSB7CiAgICAgICAgZm9yIChTdHJpbmcgY2FyZCA6IGhhbmQpIHsKICAgICAgICAgICAgaWYgKGlzUmFtcChjYXJkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25SZXNvbHV0aW9uKENBU1RfUkFNUCwgY2FyZCwKICAgICAgICAgICAgICAgICAgICAiQ2FzdCByYW1wOiAiICsgY2FyZCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEFjdGlvblJlc29sdXRpb24gciA9IG5ldyBBY3Rpb25SZXNvbHV0aW9uKENBU1RfUkFNUCwgbnVsbCwKICAgICAgICAgICAgIk5vIHJhbXAgaW4gaGFuZCIsIGZhbHNlKTsKICAgICAgICByLmZhbGxiYWNrQWN0aW9uID0gSE9MRF9NQU5BOwogICAgICAgIHJldHVybiByOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIEFjdGlvblJlc29sdXRpb24gcmVzb2x2ZUNhc3RDb21tYW5kZXIoCiAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjb21tYW5kWm9uZSwgU3RyaW5nIGNvbW1hbmRlck5hbWUsIGludCB0YXgsIGludCBtYW5hKSB7CiAgICAgICAgaWYgKGNvbW1hbmRab25lID09IG51bGwgfHwgY29tbWFuZFpvbmUuaXNFbXB0eSgpIHx8CiAgICAgICAgICAgICFjb21tYW5kWm9uZS5jb250YWlucyhjb21tYW5kZXJOYW1lKSkgewogICAgICAgICAgICBBY3Rpb25SZXNvbHV0aW9uIHIgPSBuZXcgQWN0aW9uUmVzb2x1dGlvbihDQVNUX0NPTU1BTkRFUiwgbnVsbCwKICAgICAgICAgICAgICAgICJDb21tYW5kZXIgbm90IGluIGNvbW1hbmQgem9uZSIsIGZhbHNlKTsKICAgICAgICAgICAgci5mYWxsYmFja0FjdGlvbiA9IEhPTERfTUFOQTsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgfQoKICAgICAgICAvLyBSb3VnaCBtYW5hIGNoZWNrIChjb21tYW5kZXIgY29zdCBpcyB+NC02IGF2ZXJhZ2UgKyB0YXgpCiAgICAgICAgaW50IGVzdGltYXRlZENvc3QgPSA0ICsgdGF4OwogICAgICAgIGlmIChtYW5hIDwgZXN0aW1hdGVkQ29zdCkgewogICAgICAgICAgICBBY3Rpb25SZXNvbHV0aW9uIHIgPSBuZXcgQWN0aW9uUmVzb2x1dGlvbihDQVNUX0NPTU1BTkRFUiwgY29tbWFuZGVyTmFtZSwKICAgICAgICAgICAgICAgICJJbnN1ZmZpY2llbnQgbWFuYSBmb3IgY29tbWFuZGVyIChuZWVkIH4iICsgZXN0aW1hdGVkQ29zdCArICIsIGhhdmUgIiArIG1hbmEgKyAiKSIsIGZhbHNlKTsKICAgICAgICAgICAgci5mYWxsYmFja0FjdGlvbiA9IEhPTERfTUFOQTsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEFjdGlvblJlc29sdXRpb24oQ0FTVF9DT01NQU5ERVIsIGNvbW1hbmRlck5hbWUsCiAgICAgICAgICAgICJDYXN0IGNvbW1hbmRlcjogIiArIGNvbW1hbmRlck5hbWUgKyAiICh0YXg9IiArIHRheCArICIpIiwgdHJ1ZSk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgQWN0aW9uUmVzb2x1dGlvbiByZXNvbHZlQXR0YWNrKExpc3Q8U3RyaW5nPiBiYXR0bGVmaWVsZCkgewogICAgICAgIGlmIChiYXR0bGVmaWVsZCA9PSBudWxsIHx8IGJhdHRsZWZpZWxkLmlzRW1wdHkoKSkgewogICAgICAgICAgICBBY3Rpb25SZXNvbHV0aW9uIHIgPSBuZXcgQWN0aW9uUmVzb2x1dGlvbihBVFRBQ0tfT1BQT05FTlQsIG51bGwsCiAgICAgICAgICAgICAgICAiTm8gY3JlYXR1cmVzIG9uIGJhdHRsZWZpZWxkIHRvIGF0dGFjayB3aXRoIiwgZmFsc2UpOwogICAgICAgICAgICByLmZhbGxiYWNrQWN0aW9uID0gUEFTUzsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEFjdGlvblJlc29sdXRpb24oQVRUQUNLX09QUE9ORU5ULCBudWxsLAogICAgICAgICAgICAiQXR0YWNrIHdpdGggIiArIGJhdHRsZWZpZWxkLnNpemUoKSArICIg' +
'cGVybWFuZW50KHMpIiwgdHJ1ZSk7CiAgICB9CgogICAgLy8g4pSA4pSAIENhcmQgcm9sZSBjaGVja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlbW92YWwoU3RyaW5nIGNhcmQpIHsKICAgICAgICByZXR1cm4gUkVNT1ZBTF9DQVJEUy5jb250YWlucyhjYXJkKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHJhdyhTdHJpbmcgY2FyZCkgewogICAgICAgIHJldHVybiBEUkFXX0NBUkRTLmNvbnRhaW5zKGNhcmQpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSYW1wKFN0cmluZyBjYXJkKSB7CiAgICAgICAgcmV0dXJuIFJBTVBfQ0FSRFMuY29udGFpbnMoY2FyZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1hY3JvLWFjdGlvbiBuYW1lIGZyb20gYW4gaW5kZXggKG1hdGNoaW5nIFB5dGhvbiBJRFhfVE9fQUNUSU9OKS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTmFtZUZyb21JbmRleChpbnQgaW5kZXgpIHsKICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IEFMTF9BQ1RJT05TLnNpemUoKSkgewogICAgICAgICAgICByZXR1cm4gQUxMX0FDVElPTlMuZ2V0KGluZGV4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFBBU1M7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGluZGV4IGZyb20gYSBtYWNyby1hY3Rpb24gbmFtZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBpbnQgaW5kZXhGcm9tQWN0aW9uTmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgIGludCBpZHggPSBBTExfQUNUSU9OUy5pbmRleE9mKG5hbWUpOwogICAgICAgIHJldHVybiBpZHggPj0gMCA/IGlkeCA6IDc7IC8vIGRlZmF1bHQgdG8gUEFTUwogICAgfQp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\ml\MacroActionExecutor.java' -B $b
# src/main/java/commanderailab/ml/PolicyServerClient.java (11,299 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5tbDsKCmltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uT2JqZWN0OwppbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7CgppbXBvcnQgamF2YS5pby4qOwppbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwoKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnNjaGVtYS5EZWNpc2lvblNuYXBzaG90OwoKLyoqCiAqIFBvbGljeVNlcnZlckNsaWVudCDigJQgSFRUUCBjbGllbnQgZm9yIHRoZSBQeXRob24gcG9saWN5IGluZmVyZW5jZSBzZXJ2ZXIuCiAqCiAqIFNlbmRzIGdhbWUgc3RhdGUgc25hcHNob3RzIHRvIFBPU1QgL2FwaS9tbC9wcmVkaWN0IGFuZCByZWNlaXZlcwogKiBtYWNyby1hY3Rpb24gcHJlZGljdGlvbnMgZnJvbSB0aGUgdHJhaW5lZCBQb2xpY3lOZXR3b3JrLgogKgogKiBUaGUgY2xpZW50IGlzIGRlc2lnbmVkIHRvIGJlIGxpZ2h0d2VpZ2h0IGFuZCB1c2VzIG9ubHkgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24KICogKG5vIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGJleW9uZCBHc29uIGZvciBKU09OIHNlcmlhbGl6YXRpb24pLgogKgogKiBVc2FnZToKICogICBQb2xpY3lTZXJ2ZXJDbGllbnQgY2xpZW50ID0gbmV3IFBvbGljeVNlcnZlckNsaWVudCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIik7CiAqICAgaWYgKGNsaWVudC5pc0F2YWlsYWJsZSgpKSB7CiAqICAgICAgIFBvbGljeVByZWRpY3Rpb24gcHJlZCA9IGNsaWVudC5wcmVkaWN0KHNuYXBzaG90LCAiYWdncm8iLCB0cnVlKTsKICogICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBY3Rpb246ICIgKyBwcmVkLmFjdGlvbik7CiAqICAgfQogKi8KcHVibGljIGNsYXNzIFBvbGljeVNlcnZlckNsaWVudCB7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3NvbiBHU09OID0gbmV3IEdzb25CdWlsZGVyKCkuY3JlYXRlKCk7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9USU1FT1VUX01TID0gMjAwMDsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX1RJTUVPVVRfTVMgPSA1MDAwOwoKICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGJhc2VVcmw7CiAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gYXZhaWxhYmxlID0gZmFsc2U7CiAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBsYXN0RXJyb3IgPSAiIjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBiYXNlVXJsIEJhc2UgVVJMIG9mIHRoZSBsYWIgQVBJIHNlcnZlciAoZS5nLiwgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpCiAgICAgKi8KICAgIHB1YmxpYyBQb2xpY3lTZXJ2ZXJDbGllbnQoU3RyaW5nIGJhc2VVcmwpIHsKICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsLmVuZHNXaXRoKCIvIikgPyBiYXNlVXJsLnN1YnN0cmluZygwLCBiYXNlVXJsLmxlbmd0aCgpIC0gMSkgOiBiYXNlVXJsOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gUHJlZGljdGlvbiBSZXNwb25zZQogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBSZXN1bHQgb2YgYSBwb2xpY3kgcHJlZGljdGlvbi4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb2xpY3lQcmVkaWN0aW9uIHsKICAgICAgICAvKiogTWFjcm8tYWN0aW9uIG5hbWUgKGUuZy4sICJjYXN0X2NyZWF0dXJlIiwgImF0dGFja19vcHBvbmVudCIpICovCiAgICAgICAgcHVibGljIFN0cmluZyBhY3Rpb247CgogICAgICAgIC8qKiBBY3Rpb24gaW5kZXggKDAtNykgKi8KICAgICAgICBwdWJsaWMgaW50IGFjdGlvbkluZGV4OwoKICAgICAg' +
'ICAvKiogTW9kZWwgY29uZmlkZW5jZSBmb3IgdGhlIGNob3NlbiBhY3Rpb24gKDAuMCAtIDEuMCkgKi8KICAgICAgICBwdWJsaWMgZG91YmxlIGNvbmZpZGVuY2U7CgogICAgICAgIC8qKiBGdWxsIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBvdmVyIGFsbCBhY3Rpb25zICovCiAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIERvdWJsZT4gcHJvYmFiaWxpdGllczsKCiAgICAgICAgLyoqIEluZmVyZW5jZSB0aW1lIGluIG1pbGxpc2Vjb25kcyAqLwogICAgICAgIHB1YmxpYyBkb3VibGUgaW5mZXJlbmNlTXM7CgogICAgICAgIC8qKiBFcnJvciBtZXNzYWdlIGlmIHByZWRpY3Rpb24gZmFpbGVkICovCiAgICAgICAgcHVibGljIFN0cmluZyBlcnJvcjsKCiAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKICAgICAgICAgICAgcmV0dXJuIGFjdGlvbiAhPSBudWxsICYmICFhY3Rpb24uaXNFbXB0eSgpICYmIGVycm9yID09IG51bGw7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgcmV0dXJuICJQb2xpY3lQcmVkaWN0aW9uW2Vycm9yPSIgKyBlcnJvciArICJdIjsKICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlBvbGljeVByZWRpY3Rpb25bYWN0aW9uPSVzLCBjb25mPSUuM2YsICUuMWZtc10iLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbiwgY29uZmlkZW5jZSwgaW5mZXJlbmNlTXMpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIE1vZGVsIFN0YXR1cwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbFN0YXR1cyB7CiAgICAgICAgcHVibGljIGJvb2xlYW4gbG9hZGVkOwogICAgICAgIHB1YmxpYyBTdHJpbmcgZXJyb3I7CiAgICAgICAgcHVibGljIFN0cmluZyBkZXZpY2U7CiAgICAgICAgcHVibGljIGJvb2xlYW4gdG9yY2hBdmFpbGFibGU7CiAgICB9CgogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgICAvLyBBUEkgTWV0aG9kcwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBDaGVjayBpZiB0aGUgcG9saWN5IHNlcnZlciBoYXMgYSBtb2RlbCBsb2FkZWQgYW5kIHJlYWR5LgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBTdHJpbmcganNvbiA9IGh0dHBHZXQoYmFzZVVybCArICIvYXBpL21sL21vZGVsIik7CiAgICAgICAgICAgIE1vZGVsU3RhdHVzIHN0YXR1cyA9IEdTT04uZnJvbUpzb24oanNvbiwgTW9kZWxTdGF0dXMuY2xhc3MpOwogICAgICAgICAgICBhdmFpbGFibGUgPSBzdGF0dXMubG9hZGVkOwogICAgICAgICAgICBpZiAoIWF2YWlsYWJsZSkgewogICAgICAgICAgICAgICAgbGFzdEVycm9yID0gc3RhdHVzLmVycm9yICE9IG51bGwgPyBzdGF0dXMuZXJyb3IgOiAiTW9kZWwgbm90IGxvYWRlZCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBhdmFpbGFibGUgPSBmYWxzZTsKICAgICAg' +
'ICAgICAgbGFzdEVycm9yID0gZS5nZXRNZXNzYWdlKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBQcmVkaWN0IGEgbWFjcm8tYWN0aW9uIGZyb20gYSBEZWNpc2lvblNuYXBzaG90LgogICAgICoKICAgICAqIEBwYXJhbSBzbmFwc2hvdCAgRGVjaXNpb25TbmFwc2hvdCBvYmplY3QgKHdpbGwgYmUgc2VyaWFsaXplZCB0byBKU09OKQogICAgICogQHBhcmFtIHBsYXlzdHlsZSBEZWNrIHBsYXlzdHlsZTogImFnZ3JvIiwgImNvbnRyb2wiLCAibWlkcmFuZ2UiLCAiY29tYm8iCiAgICAgKiBAcGFyYW0gZ3JlZWR5ICAgIElmIHRydWUsIGFsd2F5cyBwaWNrIHRoZSBoaWdoZXN0LXByb2JhYmlsaXR5IGFjdGlvbgogICAgICogQHJldHVybiBQb2xpY3lQcmVkaWN0aW9uIHdpdGggdGhlIHJlY29tbWVuZGVkIGFjdGlvbgogICAgICovCiAgICBwdWJsaWMgUG9saWN5UHJlZGljdGlvbiBwcmVkaWN0KERlY2lzaW9uU25hcHNob3Qgc25hcHNob3QsIFN0cmluZyBwbGF5c3R5bGUsIGJvb2xlYW4gZ3JlZWR5KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gQnVpbGQgcmVxdWVzdCBKU09OIGZyb20gdGhlIHNuYXBzaG90CiAgICAgICAgICAgIEpzb25PYmplY3QgcmVxdWVzdCA9IGJ1aWxkUHJlZGljdFJlcXVlc3Qoc25hcHNob3QsIHBsYXlzdHlsZSwgZ3JlZWR5KTsKICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlSnNvbiA9IGh0dHBQb3N0KGJhc2VVcmwgKyAiL2FwaS9tbC9wcmVkaWN0IiwgcmVxdWVzdC50b1N0cmluZygpKTsKICAgICAgICAgICAgcmV0dXJuIEdTT04uZnJvbUpzb24ocmVzcG9uc2VKc29uLCBQb2xpY3lQcmVkaWN0aW9uLmNsYXNzKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBQb2xpY3lQcmVkaWN0aW9uIGZhaWwgPSBuZXcgUG9saWN5UHJlZGljdGlvbigpOwogICAgICAgICAgICBmYWlsLmVycm9yID0gZS5nZXRNZXNzYWdlKCk7CiAgICAgICAgICAgIGxhc3RFcnJvciA9IGUuZ2V0TWVzc2FnZSgpOwogICAgICAgICAgICByZXR1cm4gZmFpbDsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBQcmVkaWN0IHdpdGggZGVmYXVsdCBzZXR0aW5ncyAobWlkcmFuZ2UgcGxheXN0eWxlLCBncmVlZHkpLgogICAgICovCiAgICBwdWJsaWMgUG9saWN5UHJlZGljdGlvbiBwcmVkaWN0KERlY2lzaW9uU25hcHNob3Qgc25hcHNob3QpIHsKICAgICAgICByZXR1cm4gcHJlZGljdChzbmFwc2hvdCwgIm1pZHJhbmdlIiwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXF1ZXN0IHRoZSBzZXJ2ZXIgdG8gcmVsb2FkIHRoZSBtb2RlbCBjaGVja3BvaW50LgogICAgICogVXNlZnVsIGFmdGVyIHRyYWluaW5nIGEgbmV3IG1vZGVsLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiByZWxvYWRNb2RlbCgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBTdHJpbmcganNvbiA9IGh0dHBQb3N0KGJhc2VVcmwgKyAiL2FwaS9tbC9yZWxvYWQiLCAie30iKTsKICAgICAgICAgICAgSnNvbk9iamVjdCByZXNwID0gSnNvblBhcnNlci5wYXJzZVN0cmluZyhqc29uKS5nZXRBc0pzb25PYmplY3QoKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3AuaGFzKCJzdWNjZXNzIikgJiYgcmVzcC5nZXQoInN1Y2Nlc3MiKS5nZXRBc0Jvb2xlYW4oKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICBsYXN0RXJyb3IgPSBlLmdldE1lc3NhZ2UoKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEdldCB0aGUgbGFzdCBlcnJvciBtZXNzYWdlLgogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGdldExhc3RFcnJvcigpIHsKICAgICAgICByZXR1cm4gbGFzdEVycm9yOwogICAgfQoKICAgIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICAgLy8gUmVxdWVzdCBCdWlsZGluZwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ' +
'4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgLyoqCiAgICAgKiBDb252ZXJ0IGEgRGVjaXNpb25TbmFwc2hvdCArIGluZmVyZW5jZSBwYXJhbXMgaW50byB0aGUgSlNPTiBib2R5CiAgICAgKiBleHBlY3RlZCBieSBQT1NUIC9hcGkvbWwvcHJlZGljdC4KICAgICAqLwogICAgcHJpdmF0ZSBKc29uT2JqZWN0IGJ1aWxkUHJlZGljdFJlcXVlc3QoRGVjaXNpb25TbmFwc2hvdCBzbmFwc2hvdCwgU3RyaW5nIHBsYXlzdHlsZSwgYm9vbGVhbiBncmVlZHkpIHsKICAgICAgICAvLyBTZXJpYWxpemUgdGhlIHNuYXBzaG90IHRvIEpTT04sIHRoZW4gYWRkIGluZmVyZW5jZSBwYXJhbXMKICAgICAgICBTdHJpbmcgc25hcHNob3RKc29uID0gR1NPTi50b0pzb24oc25hcHNob3QpOwogICAgICAgIEpzb25PYmplY3Qgb2JqID0gSnNvblBhcnNlci5wYXJzZVN0cmluZyhzbmFwc2hvdEpzb24pLmdldEFzSnNvbk9iamVjdCgpOwoKICAgICAgICAvLyBNYXAgSmF2YSBmaWVsZCBuYW1lcyB0byBQeXRob24gZXhwZWN0ZWQgbmFtZXMKICAgICAgICBpZiAob2JqLmhhcygidHVybk51bWJlciIpKSB7CiAgICAgICAgICAgIG9iai5hZGRQcm9wZXJ0eSgidHVybiIsIG9iai5nZXQoInR1cm5OdW1iZXIiKS5nZXRBc0ludCgpKTsKICAgICAgICAgICAgb2JqLnJlbW92ZSgidHVybk51bWJlciIpOwogICAgICAgIH0KICAgICAgICBpZiAob2JqLmhhcygiYWN0aXZlU2VhdCIpKSB7CiAgICAgICAgICAgIG9iai5hZGRQcm9wZXJ0eSgiYWN0aXZlX3NlYXQiLCBvYmouZ2V0KCJhY3RpdmVTZWF0IikuZ2V0QXNJbnQoKSk7CiAgICAgICAgICAgIG9iai5yZW1vdmUoImFjdGl2ZVNlYXQiKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9iai5oYXMoImdhbWVJZCIpKSB7CiAgICAgICAgICAgIG9iai5hZGRQcm9wZXJ0eSgiZ2FtZV9pZCIsIG9iai5nZXQoImdhbWVJZCIpLmdldEFzU3RyaW5nKCkpOwogICAgICAgICAgICBvYmoucmVtb3ZlKCJnYW1lSWQiKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlbWFwIHBsYXllciBmaWVsZHMgZnJvbSBjYW1lbENhc2UgdG8gc25ha2VfY2FzZQogICAgICAgIGlmIChvYmouaGFzKCJwbGF5ZXJzIikgJiYgb2JqLmdldCgicGxheWVycyIpLmlzSnNvbkFycmF5KCkpIHsKICAgICAgICAgICAgZm9yICh2YXIgcGxheWVyIDogb2JqLmdldEFzSnNvbkFycmF5KCJwbGF5ZXJzIikpIHsKICAgICAgICAgICAgICAgIGlmICghcGxheWVyLmlzSnNvbk9iamVjdCgpKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIEpzb25PYmplY3QgcCA9IHBsYXllci5nZXRBc0pzb25PYmplY3QoKTsKICAgICAgICAgICAgICAgIHJlbmFtZUZpZWxkKHAsICJzZWF0SW5kZXgiLCAic2VhdCIpOwogICAgICAgICAgICAgICAgcmVuYW1lRmllbGQocCwgImxpZmVUb3RhbCIsICJsaWZlIik7CiAgICAgICAgICAgICAgICByZW5hbWVGaWVsZChwLCAiY29tbWFuZGVyRGFtYWdlVGFrZW4iLCAiY21kcl9kbWciKTsKICAgICAgICAgICAgICAgIHJlbmFtZUZpZWxkKHAsICJtYW5hQXZhaWxhYmxlIiwgIm1hbmEiKTsKICAgICAgICAgICAgICAgIHJlbmFtZUZpZWxkKHAsICJjb21tYW5kZXJUYXgiLCAiY21kcl90YXgiKTsKICAgICAgICAgICAgICAgIHJlbmFtZUZpZWxkKHAsICJjcmVhdHVyZXNPbkZpZWxkIiwgImNyZWF0dXJlcyIpOwogICAgICAgICAgICAgICAgcmVuYW1lRmllbGQocCwgImNvbW1hbmRab25lIiwgImNvbW1hbmRfem9uZSIpOwogICAgICAgICAgICAgICAgcmVuYW1lRmllbGQocCwgImxhbmRDb3VudCIsICJsYW5kcyIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgaW5mZXJlbmNlIHBhcmFtZXRlcnMKICAgICAgICBvYmouYWRkUHJvcGVydHkoImFyY2hldHlwZSIsIHBsYXlzdHlsZSk7CiAgICAgICAgb2JqLmFkZFByb3BlcnR5KCJncmVlZHkiLCBncmVlZHkpOwogICAgICAgIG9iai5hZGRQcm9wZXJ0eSgidGVtcGVyYXR1cmUiLCAxLjApOwoKICAgICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHByaXZhdGUgdm9pZCByZW5hbWVGaWVsZChKc29uT2JqZWN0IG9iaiwgU3RyaW5nIGZyb20sIFN0cmluZyB0bykgewogICAgICAgIGlmIChvYmouaGFzKGZyb20pKSB7CiAgICAgICAgICAgIG9iai5hZGQodG8sIG9iai5nZXQoZnJvbSkpOwogICAgICAgICAgICBvYmoucmVtb3ZlKGZyb20pOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi' +
'lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEhUVFAgSGVscGVycwogICAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgogICAgcHJpdmF0ZSBTdHJpbmcgaHR0cEdldChTdHJpbmcgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG5ldyBVUkwodXJsKS5vcGVuQ29ubmVjdGlvbigpOwogICAgICAgIGNvbm4uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7CiAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUX1RJTUVPVVRfTVMpOwogICAgICAgIGNvbm4uc2V0UmVhZFRpbWVvdXQoUkVBRF9USU1FT1VUX01TKTsKICAgICAgICBjb25uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL2pzb24iKTsKCiAgICAgICAgaW50IGNvZGUgPSBjb25uLmdldFJlc3BvbnNlQ29kZSgpOwogICAgICAgIGlmIChjb2RlICE9IDIwMCkgewogICAgICAgICAgICBTdHJpbmcgZXJyb3JCb2R5ID0gcmVhZFN0cmVhbShjb25uLmdldEVycm9yU3RyZWFtKCkpOwogICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkhUVFAgIiArIGNvZGUgKyAiOiAiICsgZXJyb3JCb2R5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0oY29ubi5nZXRJbnB1dFN0cmVhbSgpKTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBodHRwUG9zdChTdHJpbmcgdXJsLCBTdHJpbmcganNvbkJvZHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbikgbmV3IFVSTCh1cmwpLm9wZW5Db25uZWN0aW9uKCk7CiAgICAgICAgY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CiAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUX1RJTUVPVVRfTVMpOwogICAgICAgIGNvbm4uc2V0UmVhZFRpbWVvdXQoUkVBRF9USU1FT1VUX01TKTsKICAgICAgICBjb25uLnNldERvT3V0cHV0KHRydWUpOwogICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vanNvbiIpOwogICAgICAgIGNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAiYXBwbGljYXRpb24vanNvbiIpOwoKICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvcyA9IGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCkpIHsKICAgICAgICAgICAgb3Mud3JpdGUoanNvbkJvZHkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgICAgIH0KCiAgICAgICAgaW50IGNvZGUgPSBjb25uLmdldFJlc3BvbnNlQ29kZSgpOwogICAgICAgIGlmIChjb2RlICE9IDIwMCkgewogICAgICAgICAgICBTdHJpbmcgZXJyb3JCb2R5ID0gcmVhZFN0cmVhbShjb25uLmdldEVycm9yU3RyZWFtKCkpOwogICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkhUVFAgIiArIGNvZGUgKyAiOiAiICsgZXJyb3JCb2R5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0oY29ubi5nZXRJbnB1dFN0cmVhbSgpKTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyByZWFkU3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpIHJldHVybiAiIjsKICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0sIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSkgewogICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgU3RyaW5nIGxpbmU7CiAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBzYi5hcHBlbmQobGluZSk7CiAgICAgICAgICAgIH0KICAg' +
'ICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgfQogICAgfQp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\ml\PolicyServerClient.java' -B $b
# src/main/java/commanderailab/schema/BatchResult.java (4,339 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5zY2hlbWE7CgppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgovKioKICogQ29tcGxldGUgZGF0YSBtb2RlbCBmb3IgYmF0Y2ggc2ltdWxhdGlvbiByZXN1bHRzLgogKiBTZXJpYWxpemVkIHRvIEpTT04gY29uZm9ybWluZyB0byBiYXRjaC1yZXN1bHQtc2NoZW1hLmpzb24uCiAqLwpwdWJsaWMgY2xhc3MgQmF0Y2hSZXN1bHQgewoKICAgIHB1YmxpYyBNZXRhZGF0YSBtZXRhZGF0YTsKICAgIHB1YmxpYyBMaXN0PERlY2tJbmZvPiBkZWNrczsKICAgIHB1YmxpYyBMaXN0PEdhbWVSZXN1bHQ+IGdhbWVzOwogICAgcHVibGljIFN1bW1hcnkgc3VtbWFyeTsKCiAgICAvLyDilIDilIAgTWV0YWRhdGEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXRhZGF0YSB7CiAgICAgICAgcHVibGljIFN0cmluZyBzY2hlbWFWZXJzaW9uID0gIjEuMC4wIjsKICAgICAgICBwdWJsaWMgU3RyaW5nIGJhdGNoSWQ7CiAgICAgICAgcHVibGljIFN0cmluZyB0aW1lc3RhbXA7ICAgICAgIC8vIElTTyA4NjAxCiAgICAgICAgcHVibGljIGludCB0b3RhbEdhbWVzOwogICAgICAgIHB1YmxpYyBpbnQgY29tcGxldGVkR2FtZXM7CiAgICAgICAgcHVibGljIFN0cmluZyBmb3JtYXQgPSAiY29tbWFuZGVyIjsKICAgICAgICBwdWJsaWMgaW50IHBvZFNpemUgPSAzOwogICAgICAgIHB1YmxpYyBTdHJpbmcgZW5naW5lVmVyc2lvbjsKICAgICAgICBwdWJsaWMgTG9uZyBtYXN0ZXJTZWVkOyAgICAgICAgLy8gbnVsbCBpZiByYW5kb20KICAgICAgICBwdWJsaWMgaW50IHRocmVhZHMgPSAxOwogICAgICAgIHB1YmxpYyBsb25nIGVsYXBzZWRNczsKICAgIH0KCiAgICAvLyDilIDilIAgRGVjayBJbmZvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVja0luZm8gewogICAgICAgIHB1YmxpYyBpbnQgc2VhdEluZGV4OwogICAgICAgIHB1YmxpYyBTdHJpbmcgZGVja05hbWU7CiAgICAgICAgcHVibGljIFN0cmluZyBjb21tYW5kZXJOYW1lOwogICAgICAgIHB1YmxpYyBTdHJpbmcgZGVja0ZpbGU7CiAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBjb2xvcklkZW50aXR5OwogICAgICAgIHB1YmxpYyBpbnQgY2FyZENvdW50OwoKICAgICAgICAvLyB2MzogU291cmNlL2ltcG9ydCBtZXRhZGF0YQogICAgICAgIHB1YmxpYyBTdHJpbmcgc291cmNlOyAgICAgICAgICAgLy8gZS5nLiwgImVkaHJlYyIsICJhcmNoaWRla3QiLCAibG9jYWwiLCAidGV4dCIKICAgICAgICBwdWJsaWMgU3RyaW5nIHNvdXJjZVVybDsgICAgICAgIC8vIFVSTCB0byBvcmlnaW5hbCBkZWNrIChpZiBpbXBvcnRlZCkKICAgICAgICBwdWJsaWMgU3RyaW5nIGFyY2hldHlwZTsgICAgICAgIC8vIGUuZy4sICJhZ2dybyIsICJjb250cm9sIiwgImNvbWJvIgogICAgICAgIHB1YmxpYyBJbnRlZ2VyIHNhbXBsZVNpemU7ICAgICAgLy8gRURIUkVDOiBudW1iZXIgb2YgZGVja3Mgc2FtcGxlZAogICAgICAgIHB1YmxpYyBTdHJpbmcgaW1wb3J0ZWRBdDsgICAgICAgLy8gSVNPIDg2MDEgdGltZXN0YW1wIG9mIGltcG9ydAogICAgfQoKICAgIC8vIOKUgOKUgCBQZXItR2FtZSBSZXN1bHQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBHYW1lUmVzdWx0IHsKICAgICAgICBwdWJsaWMgaW50IGdhbWVJbmRleDsKICAgICAgICBwdWJsaWMgSW50ZWdlciB3aW5uaW5nU2VhdDsgICAgIC8vIG51bGwgaWYgZHJhdy90aW1lb3V0CiAgICAgICAgcHVibGljIGludCB0b3RhbFR1cm5zOwogICAgICAgIHB1YmxpYyBTdHJpbmcgd2luQ29uZGl0aW9uOyAgICAgLy8gZW51bSBmcm9tIHNjaGVtYQogICAgICAgIHB1YmxpYyBsb25nIGdhbWVTZWVkOwogICAgICAgIHB1YmxpYyBsb25nIGVsYXBzZWRNczsKICAgICAg' +
'ICBwdWJsaWMgTGlzdDxQbGF5ZXJSZXN1bHQ+IHBsYXllclJlc3VsdHM7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBQbGF5ZXJSZXN1bHQgewogICAgICAgIHB1YmxpYyBpbnQgc2VhdEluZGV4OwogICAgICAgIHB1YmxpYyBpbnQgZmluYWxMaWZlOwogICAgICAgIHB1YmxpYyBpbnQgbXVsbGlnYW5zOwogICAgICAgIHB1YmxpYyBib29sZWFuIGlzV2lubmVyOwogICAgICAgIHB1YmxpYyBpbnQgY29tbWFuZGVyRGFtYWdlRGVhbHQ7CiAgICAgICAgcHVibGljIGludCBjb21tYW5kZXJDYXN0czsKICAgICAgICBwdWJsaWMgaW50IGxhbmRzUGxheWVkOwogICAgICAgIHB1YmxpYyBpbnQgc3BlbGxzQ2FzdDsKICAgICAgICBwdWJsaWMgaW50IGNyZWF0dXJlc0Rlc3Ryb3llZDsKCiAgICAgICAgLy8gdjQ6IFBlci1jYXJkIGRldGFpbGVkIHN0YXRzIGZvciBjb2FjaCBhbmFseXRpY3MKICAgICAgICBwdWJsaWMgTGlzdDxQZXJDYXJkR2FtZVN0YXRzPiBjYXJkU3RhdHM7CiAgICB9CgogICAgLy8g4pSA4pSAIFN1bW1hcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdW1tYXJ5IHsKICAgICAgICBwdWJsaWMgTGlzdDxEZWNrU3VtbWFyeT4gcGVyRGVjazsKICAgICAgICBwdWJsaWMgZG91YmxlIGF2Z0dhbWVUdXJuczsKICAgICAgICBwdWJsaWMgZG91YmxlIGF2Z0dhbWVUaW1lTXM7CiAgICAgICAgcHVibGljIGRvdWJsZSBzaW1zUGVyU2Vjb25kOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVja1N1bW1hcnkgewogICAgICAgIHB1YmxpYyBpbnQgc2VhdEluZGV4OwogICAgICAgIHB1YmxpYyBTdHJpbmcgZGVja05hbWU7CiAgICAgICAgcHVibGljIGludCB3aW5zOwogICAgICAgIHB1YmxpYyBpbnQgbG9zc2VzOwogICAgICAgIHB1YmxpYyBpbnQgZHJhd3M7CiAgICAgICAgcHVibGljIGRvdWJsZSB3aW5SYXRlOwogICAgICAgIHB1YmxpYyBEb3VibGUgYXZnVHVybnNUb1dpbjsgICAgLy8gbnVsbCBpZiB6ZXJvIHdpbnMKICAgICAgICBwdWJsaWMgZG91YmxlIGF2Z011bGxpZ2FuczsKICAgICAgICBwdWJsaWMgZG91YmxlIGF2Z0ZpbmFsTGlmZTsKICAgICAgICBwdWJsaWMgV2luQ29uZGl0aW9uQnJlYWtkb3duIHdpbkNvbmRpdGlvbkJyZWFrZG93bjsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpbkNvbmRpdGlvbkJyZWFrZG93biB7CiAgICAgICAgcHVibGljIGludCBjb21iYXRfZGFtYWdlOwogICAgICAgIHB1YmxpYyBpbnQgY29tbWFuZGVyX2RhbWFnZTsKICAgICAgICBwdWJsaWMgaW50IGNvbWJvX2FsdF93aW47CiAgICAgICAgcHVibGljIGludCBsaWZlX2RyYWluOwogICAgICAgIHB1YmxpYyBpbnQgbWlsbDsKICAgICAgICBwdWJsaWMgaW50IGNvbmNlc3Npb247CiAgICAgICAgcHVibGljIGludCB0aW1lb3V0OwogICAgICAgIHB1YmxpYyBpbnQgdW5rbm93bjsKCiAgICAgICAgcHVibGljIHZvaWQgaW5jcmVtZW50KFN0cmluZyBjb25kaXRpb24pIHsKICAgICAgICAgICAgc3dpdGNoIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgIGNhc2UgImNvbWJhdF9kYW1hZ2UiIC0+IGNvbWJhdF9kYW1hZ2UrKzsKICAgICAgICAgICAgICAgIGNhc2UgImNvbW1hbmRlcl9kYW1hZ2UiIC0+IGNvbW1hbmRlcl9kYW1hZ2UrKzsKICAgICAgICAgICAgICAgIGNhc2UgImNvbWJvX2FsdF93aW4iIC0+IGNvbWJvX2FsdF93aW4rKzsKICAgICAgICAgICAgICAgIGNhc2UgImxpZmVfZHJhaW4iIC0+IGxpZmVfZHJhaW4rKzsKICAgICAgICAgICAgICAgIGNhc2UgIm1pbGwiIC0+IG1pbGwrKzsKICAgICAgICAgICAgICAgIGNhc2UgImNvbmNlc3Npb24iIC0+IGNvbmNlc3Npb24rKzsKICAgICAgICAgICAgICAgIGNhc2UgInRpbWVvdXQiIC0+IHRpbWVvdXQrKzsKICAgICAgICAgICAgICAgIGRlZmF1bHQgLT4gdW5rbm93bisrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cg=='
Install-B64 -R 'src\main\java\commanderailab\schema\BatchResult.java' -B $b
# src/main/java/commanderailab/schema/DecisionSnapshot.java (3,732 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5zY2hlbWE7CgppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgovKioKICogRGVjaXNpb25TbmFwc2hvdCDigJQgU3RhdGUgKyBhY3Rpb24gYXQgYSBzaW5nbGUgZGVjaXNpb24gcG9pbnQuCiAqCiAqIENhcHR1cmVzIHRoZSBmdWxsIGdhbWUgc3RhdGUgb2JzZXJ2YWJsZSB0byB0aGUgYWN0aXZlIHBsYXllciwKICogcGx1cyB0aGUgYWN0aW9uIHRha2VuLiBVc2VkIGZvciBzdXBlcnZpc2VkIGxlYXJuaW5nIG9mIGEgcG9saWN5IG5ldHdvcmsuCiAqCiAqIFNlcmlhbGl6ZWQgYXMgSlNPTiwgb25lIHBlciBkZWNpc2lvbiBwb2ludCBwZXIgZ2FtZS4KICogRm9ybWF0OiB7IlJMX0RFQ0lTSU9OIjogPGpzb24+fSBvbiBhIHNpbmdsZSBsb2cgbGluZSBzbyBpdCBjYW4gYmUKICogcGFyc2VkIHJlbGlhYmx5IGZyb20gRm9yZ2Ugc3VicHJvY2VzcyBvdXRwdXQuCiAqCiAqIFN0YXRlIGVuY29kaW5nIChjb25zdW1lZCBieSBQeXRob24gbWwvZW5jb2Rlci8pOgogKiAgIC0gR2xvYmFsOiB0dXJuLCBwaGFzZSwgYWN0aXZlX3NlYXQKICogICAtIFBlci1wbGF5ZXI6IGxpZmUsIGNtZHJfZGFtYWdlLCBtYW5hLCBjYXJkc19pbl9oYW5kLCBldGMuCiAqICAgLSBQZXItem9uZSBwZXItcGxheWVyOiBsaXN0IG9mIGNhcmQgbmFtZXMgKElEcyByZXNvbHZlZCBQeXRob24tc2lkZSkKICoKICogQWN0aW9uOiB0aGUgcmF3IEZvcmdlIGFjdGlvbiBzdHJpbmcsIGxhdGVyIGxhYmVsZWQgaW50byBhIG1hY3JvLWFjdGlvbgogKiAgICAgICAgIGJ5IG1sL2FjdGlvbnMvbGFiZWxlci5weQogKi8KcHVibGljIGNsYXNzIERlY2lzaW9uU25hcHNob3QgewoKICAgIC8vIOKUgOKUgCBHYW1lIGNvbnRleHQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgU3RyaW5nIGdhbWVJZDsKICAgIHB1YmxpYyBpbnQgdHVybk51bWJlcjsKICAgIHB1YmxpYyBTdHJpbmcgcGhhc2U7ICAgICAgICAgICAgLy8gIm1haW5fMSIsICJjb21iYXQiLCAibWFpbl8yIiwgImVuZCIKICAgIHB1YmxpYyBpbnQgYWN0aXZlU2VhdDsgICAgICAgICAgLy8gMC1iYXNlZCBzZWF0IGluZGV4IG9mIGFjdGluZyBwbGF5ZXIKCiAgICAvLyDilIDilIAgUGVyLXBsYXllciBzdGF0ZSAoaW5kZXggPSBzZWF0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBMaXN0PFBsYXllclNuYXBzaG90PiBwbGF5ZXJzOwoKICAgIC8vIOKUgOKUgCBBY3Rpb24gdGFrZW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgQWN0aW9uUmVjb3JkIGFjdGlvbjsKCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIFBsYXllciBzdGF0ZSBhdCB0aGlzIGRlY2lzaW9uIHBvaW50CiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBsYXllclNuYXBzaG90IHsKICAgICAgICBwdWJsaWMgaW50IHNlYXRJbmRleDsKICAgICAgICBwdWJsaWMgaW50IGxpZmVUb3RhbDsKICAgICAgICBwdWJsaWMgaW50IGNvbW1hbmRlckRhbWFnZVRha2VuOyAgICAgLy8gZnJvbSBvcHBvbmVudCdzIGNvbW1hbmRlcgogICAgICAgIHB1YmxpYyBpbnQgbWFuYUF2YWlsYWJsZTsgICAgICAgICAgICAvLyB1bnRhcHBlZCBtYW5hIHNvdXJjZXMKICAgICAgICBwdWJsaWMgaW50IGNvbW1hbmRlclRheDsgICAgICAgICAgICAgLy8gdGltZXMgY29tbWFuZGVyIGhhcyBi' +
'ZWVuIGNhc3Qgw5cgMgogICAgICAgIHB1YmxpYyBpbnQgY29tbWFuZGVyQ2FzdHM7CgogICAgICAgIC8vIFpvbmUgY29udGVudHMg4oCUIGNhcmQgbmFtZXMgZm9yIGVtYmVkZGluZyBsb29rdXAKICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGhhbmQ7CiAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBiYXR0bGVmaWVsZDsgICAgIC8vIHBlcm1hbmVudHMgY29udHJvbGxlZAogICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ3JhdmV5YXJkOwogICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gY29tbWFuZFpvbmU7ICAgICAvLyBjb21tYW5kZXIgaWYgbm90IG9uIGZpZWxkCgogICAgICAgIC8vIEJvYXJkIHN1bW1hcnkgc3RhdHMgKHByZS1jb21wdXRlZCBmb3IgZmFzdGVyIGVuY29kaW5nKQogICAgICAgIHB1YmxpYyBpbnQgY3JlYXR1cmVzT25GaWVsZDsKICAgICAgICBwdWJsaWMgaW50IHRvdGFsUG93ZXJPbkJvYXJkOwogICAgICAgIHB1YmxpYyBpbnQgdG90YWxUb3VnaG5lc3NPbkJvYXJkOwogICAgICAgIHB1YmxpYyBpbnQgYXJ0aWZhY3RzT25GaWVsZDsKICAgICAgICBwdWJsaWMgaW50IGVuY2hhbnRtZW50c09uRmllbGQ7CiAgICAgICAgcHVibGljIGludCBsYW5kQ291bnQ7ICAgICAgICAgICAgICAgLy8gbGFuZHMgb24gYmF0dGxlZmllbGQKICAgIH0KCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgIC8vIEFjdGlvbiByZWNvcmQg4oCUIHdoYXQgdGhlIEFJIGNob3NlIHRvIGRvCiAgICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjdGlvblJlY29yZCB7CiAgICAgICAgcHVibGljIFN0cmluZyB0eXBlOyAgICAgICAgICAgICAgICAgIC8vICJjYXN0IiwgImF0dGFjayIsICJhY3RpdmF0ZSIsICJwYXNzIiwgImxhbmQiCiAgICAgICAgcHVibGljIFN0cmluZyBjYXJkTmFtZTsgICAgICAgICAgICAgIC8vIGNhcmQgaW52b2x2ZWQgKG51bGwgZm9yIHBhc3MvYXR0YWNrKQogICAgICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0RGVzY3JpcHRpb247ICAgICAvLyBodW1hbi1yZWFkYWJsZSB0YXJnZXQgKCJBaSgyKS1OYW1lIiwgZXRjLikKICAgICAgICBwdWJsaWMgU3RyaW5nIHJhd0xvZ0xpbmU7ICAgICAgICAgICAgLy8gb3JpZ2luYWwgRm9yZ2UgbG9nIGxpbmUgZm9yIHRoaXMgYWN0aW9uCiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\schema\DecisionSnapshot.java' -B $b
# src/main/java/commanderailab/schema/DeckReport.java (3,674 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5zY2hlbWE7CgppbXBvcnQgamF2YS51dGlsLio7CgovKioKICogRGVja1JlcG9ydCDigJQgQ29tcGxldGUgZGVjayBwZXJmb3JtYW5jZSBwcm9maWxlLgogKgogKiBBZ2dyZWdhdGVzIHNpbXVsYXRpb24gcmVzdWx0cyBpbnRvIGEgY29tcHJlaGVuc2l2ZSByZXBvcnQgdGhhdAogKiB0aGUgUHl0aG9uIGNvYWNoIHNlcnZpY2UgY29uc3VtZXMgdG8gZ2VuZXJhdGUgaW1wcm92ZW1lbnQgc3VnZ2VzdGlvbnMuCiAqCiAqIFNlcmlhbGl6ZWQgdG8gSlNPTiBhbmQgd3JpdHRlbiB0byBkZWNrLXJlcG9ydHMve2RlY2tJZH0uanNvbi4KICovCnB1YmxpYyBjbGFzcyBEZWNrUmVwb3J0IHsKCiAgICBwdWJsaWMgU3RyaW5nIGRlY2tJZDsKICAgIHB1YmxpYyBTdHJpbmcgY29tbWFuZGVyOwogICAgcHVibGljIExpc3Q8U3RyaW5nPiBjb2xvcklkZW50aXR5ID0gbmV3IEFycmF5TGlzdDw+KCk7CgogICAgcHVibGljIERlY2tNZXRhIG1ldGEgPSBuZXcgRGVja01ldGEoKTsKICAgIHB1YmxpYyBMaXN0PE1hdGNodXBSZWNvcmQ+IG1hdGNodXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICBwdWJsaWMgRGVja1N0cnVjdHVyZSBzdHJ1Y3R1cmUgPSBuZXcgRGVja1N0cnVjdHVyZSgpOwogICAgcHVibGljIExpc3Q8Q2FyZFBlcmZvcm1hbmNlPiBjYXJkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gdW5kZXJwZXJmb3JtZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IG92ZXJwZXJmb3JtZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICBwdWJsaWMgTGlzdDxDb21ib1JlY29yZD4ga25vd25Db21ib3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgIHB1YmxpYyBTdHJpbmcgbGFzdFVwZGF0ZWQ7ICAvLyBJU08gODYwMQoKICAgIC8vIOKUgOKUgCBEZWNrLUxldmVsIE1ldGEgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWNrTWV0YSB7CiAgICAgICAgcHVibGljIGludCBnYW1lc1NpbXVsYXRlZDsKICAgICAgICBwdWJsaWMgZG91YmxlIG92ZXJhbGxXaW5SYXRlOwogICAgICAgIHB1YmxpYyBkb3VibGUgYXZnR2FtZUxlbmd0aDsKICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgRG91YmxlPiBwZXJBcmNoZXR5cGVXaW5SYXRlcyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgIH0KCiAgICAvLyDilIDilIAgTWF0Y2h1cCBSZWNvcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRjaHVwUmVjb3JkIHsKICAgICAgICBwdWJsaWMgU3RyaW5nIG9wcG9uZW50RGVjazsKICAgICAgICBwdWJsaWMgU3RyaW5nIG9wcG9uZW50Q29tbWFuZGVyID0gIiI7CiAgICAgICAgcHVibGljIGludCBnYW1lc1BsYXllZDsKICAgICAgICBwdWJsaWMgZG91YmxlIHdpblJhdGU7CiAgICB9CgogICAgLy8g4pSA4pSAIERlY2sgU3RydWN0dXJlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVja1N0cnVjdHVyZSB7CiAgICAgICAgcHVibGljIGludCBsYW5kQ291bnQ7CiAgICAgICAgcHVibGljIGludFtdIGN1cnZlQnVja2V0cyA9IG5ldyBpbnRbOF07ICAvLyBDTUMgMC03KwogICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBjYXJkVHlwZUNvdW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZnVuY3Rpb25hbENvdW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgIH0KCiAgICAvLyDilIDilIAgUGVyLUNhcmQgUGVyZm9ybWFuY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYXJkUGVyZm9ybWFu' +
'Y2UgewogICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKICAgICAgICBwdWJsaWMgZG91YmxlIGRyYXduUmF0ZTsKICAgICAgICBwdWJsaWMgZG91YmxlIGNhc3RSYXRlOwogICAgICAgIHB1YmxpYyBkb3VibGUga2VwdEluT3BlbmluZ0hhbmRSYXRlOwogICAgICAgIHB1YmxpYyBkb3VibGUgZGVhZENhcmRSYXRlOwogICAgICAgIHB1YmxpYyBkb3VibGUgaW1wYWN0U2NvcmU7ICAgICAgICAvLyAod2luUmF0ZVdoZW5DYXN0IC0gb3ZlcmFsbFdpblJhdGUpICogY2FzdFJhdGUKICAgICAgICBwdWJsaWMgZG91YmxlIHN5bmVyZ3lTY29yZTsKICAgICAgICBwdWJsaWMgZG91YmxlIGNsdW5raW5lc3NTY29yZTsgICAgLy8gZGVhZENhcmRSYXRlICogKDEgLSBjYXN0UmF0ZSkKICAgICAgICBwdWJsaWMgRG91YmxlIGF2Z1R1cm5DYXN0OyAgICAgICAgLy8gbnVsbCBpZiBuZXZlciBjYXN0CiAgICAgICAgcHVibGljIGRvdWJsZSBhdmdEYW1hZ2VEZWFsdDsKICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHRhZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAgICAgLy8g4pSA4pSAIEludGVybWVkaWF0ZSBhY2N1bXVsYXRvcnMgKG5vdCBzZXJpYWxpemVkKSDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICAvLyBVc2VkIGR1cmluZyBhZ2dyZWdhdGlvbiwgdGhlbiBjb252ZXJ0ZWQgdG8gcmF0ZXMKICAgICAgICBwdWJsaWMgdHJhbnNpZW50IGludCBnYW1lc0RyYXduOwogICAgICAgIHB1YmxpYyB0cmFuc2llbnQgaW50IGdhbWVzQ2FzdDsKICAgICAgICBwdWJsaWMgdHJhbnNpZW50IGludCBnYW1lc0tlcHRJbk9wZW5pbmc7CiAgICAgICAgcHVibGljIHRyYW5zaWVudCBpbnQgZ2FtZXNEZWFkQ2FyZDsKICAgICAgICBwdWJsaWMgdHJhbnNpZW50IGludCBnYW1lc1doZW5DYXN0OwogICAgICAgIHB1YmxpYyB0cmFuc2llbnQgaW50IHdpbnNXaGVuQ2FzdDsKICAgICAgICBwdWJsaWMgdHJhbnNpZW50IGRvdWJsZSB0b3RhbFR1cm5DYXN0OwogICAgICAgIHB1YmxpYyB0cmFuc2llbnQgZG91YmxlIHRvdGFsRGFtYWdlOwogICAgICAgIHB1YmxpYyB0cmFuc2llbnQgaW50IGdhbWVzU2VlbjsKICAgIH0KCiAgICAvLyDilIDilIAgQ29tYm8gUmVjb3JkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tYm9SZWNvcmQgewogICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gY2FyZE5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgcHVibGljIGRvdWJsZSB3aW5SYXRlV2hlbkFzc2VtYmxlZDsKICAgICAgICBwdWJsaWMgZG91YmxlIGFzc2VtYmx5UmF0ZTsKICAgIH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\schema\DeckReport.java' -B $b
# src/main/java/commanderailab/schema/JsonExporter.java (2,328 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5zY2hlbWE7CgppbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CmltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CgppbXBvcnQgamF2YS5pby4qOwppbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwppbXBvcnQgamF2YS5uaW8uZmlsZS4qOwoKLyoqCiAqIEpzb25FeHBvcnRlciDigJQgU2VyaWFsaXplcyBCYXRjaFJlc3VsdCB0byBKU09OIGZpbGVzLgogKgogKiBPdXRwdXQgY29uZm9ybXMgdG8gYmF0Y2gtcmVzdWx0LXNjaGVtYS5qc29uLgogKi8KcHVibGljIGNsYXNzIEpzb25FeHBvcnRlciB7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3NvbiBHU09OID0gbmV3IEdzb25CdWlsZGVyKCkKICAgICAgICAgICAgLnNldFByZXR0eVByaW50aW5nKCkKICAgICAgICAgICAgLnNlcmlhbGl6ZU51bGxzKCkKICAgICAgICAgICAgLmRpc2FibGVIdG1sRXNjYXBpbmcoKQogICAgICAgICAgICAuY3JlYXRlKCk7CgogICAgLyoqCiAgICAgKiBTZXJpYWxpemUgYSBCYXRjaFJlc3VsdCB0byBhIEpTT04gc3RyaW5nLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0pzb24oQmF0Y2hSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgcmV0dXJuIEdTT04udG9Kc29uKHJlc3VsdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZSBhIEJhdGNoUmVzdWx0IHRvIGEgSlNPTiBmaWxlLgogICAgICoKICAgICAqIEBwYXJhbSByZXN1bHQgICBUaGUgYmF0Y2ggcmVzdWx0IHRvIGV4cG9ydAogICAgICogQHBhcmFtIGZpbGVQYXRoIE91dHB1dCBmaWxlIHBhdGggKGUuZy4sICJyZXN1bHRzL2JhdGNoLTIwMjYwMzA2LTAwMS5qc29uIikKICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZmlsZSBjYW5ub3QgYmUgd3JpdHRlbgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0ZpbGUoQmF0Y2hSZXN1bHQgcmVzdWx0LCBTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgUGF0aCBwYXRoID0gUGF0aHMuZ2V0KGZpbGVQYXRoKTsKCiAgICAgICAgLy8gRW5zdXJlIHBhcmVudCBkaXJlY3RvcmllcyBleGlzdAogICAgICAgIGlmIChwYXRoLmdldFBhcmVudCgpICE9IG51bGwpIHsKICAgICAgICAgICAgRmlsZXMuY3JlYXRlRGlyZWN0b3JpZXMocGF0aC5nZXRQYXJlbnQoKSk7CiAgICAgICAgfQoKICAgICAgICBTdHJpbmcganNvbiA9IHRvSnNvbihyZXN1bHQpOwogICAgICAgIEZpbGVzLndyaXRlU3RyaW5nKHBhdGgsIGpzb24sIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgfQoKICAgIC8qKgogICAgICogUmVhZCBhIEJhdGNoUmVzdWx0IGZyb20gYSBKU09OIGZpbGUuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgQmF0Y2hSZXN1bHQgcmVhZEZyb21GaWxlKFN0cmluZyBmaWxlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBTdHJpbmcganNvbiA9IEZpbGVzLnJlYWRTdHJpbmcoUGF0aHMuZ2V0KGZpbGVQYXRoKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgICAgcmV0dXJuIEdTT04uZnJvbUpzb24oanNvbiwgQmF0Y2hSZXN1bHQuY2xhc3MpOwogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGUgdGhhdCBhIEpTT04gc3RyaW5nIGNvbnRhaW5zIGFsbCByZXF1aXJlZCB0b3AtbGV2ZWwga2V5cy4KICAgICAqIChMaWdodHdlaWdodCB2YWxpZGF0aW9uIOKAlCBmdWxsIEpTT04gU2NoZW1hIHZhbGlkYXRpb24gd291bGQgbmVlZCBhIGxpYnJhcnkuKQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVCYXNpY1N0cnVjdHVyZShTdHJpbmcganNvbikgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEJhdGNoUmVzdWx0IHJlc3VsdCA9IEdTT04uZnJvbUpzb24oanNvbiwgQmF0Y2hSZXN1bHQuY2xhc3MpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1ldGFkYXRhICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQuZGVja3MgIT0gbnVsbCAmJiByZXN1bHQuZGVja3Muc2l6ZSgpID09IDMKICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQuZ2FtZXMgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdC5zdW1tYXJ5ICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQubWV0YWRhdGEuc2NoZW1hVmVyc2lvbi5lcXVhbHMoIjEuMC4wIikKICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQubWV0YWRhdGEucG9kU2l6ZSA9PSAz' +
'OwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\schema\JsonExporter.java' -B $b
# src/main/java/commanderailab/schema/PerCardGameStats.java (1,865 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5zY2hlbWE7CgovKioKICogUGVyLWNhcmQgc3RhdGlzdGljcyBmb3IgYSBzaW5nbGUgZ2FtZS4KICogVHJhY2tzIHdoYXQgaGFwcGVuZWQgdG8gZWFjaCBjYXJkIGR1cmluZyBvbmUgc2ltdWxhdGlvbiBnYW1lLgogKiBBdHRhY2hlZCB0byBQbGF5ZXJSZXN1bHQgYXMgYSBsaXN0LgogKi8KcHVibGljIGNsYXNzIFBlckNhcmRHYW1lU3RhdHMgewoKICAgIHB1YmxpYyBTdHJpbmcgY2FyZE5hbWU7CgogICAgLy8g4pSA4pSAIERyYXcvQ2FzdCB0cmFja2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHB1YmxpYyBib29sZWFuIGRyYXduOwogICAgcHVibGljIGludCB0dXJuRHJhd24gPSAtMTsgICAgICAgICAvLyAtMSBpZiBub3QgZHJhd24KICAgIHB1YmxpYyBib29sZWFuIGluT3BlbmluZ0hhbmQ7CiAgICBwdWJsaWMgYm9vbGVhbiBrZXB0SW5PcGVuaW5nSGFuZDsgICAvLyBmYWxzZSBpZiBtdWxsaWdhbmVkIGF3YXkKCiAgICBwdWJsaWMgYm9vbGVhbiBjYXN0OwogICAgcHVibGljIGludCB0dXJuQ2FzdCA9IC0xOyAgICAgICAgICAvLyAtMSBpZiBub3QgY2FzdAoKICAgIC8vIOKUgOKUgCBCb2FyZC9oYW5kIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgcHVibGljIGJvb2xlYW4gc3R1Y2tJbkhhbmQ7ICAgICAgICAgLy8gZHJhd24gYnV0IG5ldmVyIGNhc3QvdXNlZAogICAgcHVibGljIGJvb2xlYW4gb25CYXR0bGVmaWVsZEF0RW5kOyAgLy8gd2FzIG9uIGJhdHRsZWZpZWxkIHdoZW4gZ2FtZSBlbmRlZAoKICAgIC8vIOKUgOKUgCBDb21iYXQvdmFsdWUgdHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBwdWJsaWMgaW50IGRhbWFnZURlYWx0OwogICAgcHVibGljIGludCBtYW5hUHJvZHVjZWQ7CiAgICBwdWJsaWMgaW50IHRva2Vuc0NyZWF0ZWQ7CgogICAgLy8g4pSA4pSAIENvbnN0cnVjdG9ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBwdWJsaWMgUGVyQ2FyZEdhbWVTdGF0cygpIHt9CgogICAgcHVibGljIFBlckNhcmRHYW1lU3RhdHMoU3RyaW5nIGNhcmROYW1lKSB7CiAgICAgICAgdGhpcy5jYXJkTmFtZSA9IGNhcmROYW1lOwogICAgfQoKICAgIC8qKgogICAgICogTWFyayBjYXJkIGFzIGEgImRlYWQgY2FyZCIg4oCUIGRyYXduIGJ1dCBuZXZlciBjYXN0IGFuZCBzdGlsbCBpbiBoYW5kCiAgICAgKiBhdCBlbmQgb2YgZ2FtZS4KICAgICAqLwogICAgcHVibGljIHZvaWQgY29tcHV0ZVN0dWNrSW5IYW5kKCkgewogICAgICAgIHRoaXMuc3R1Y2tJbkhhbmQgPSBkcmF3biAmJiAhY2FzdDsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlBlckNhcmRHYW1lU3RhdHN7JXMgZHJhd249JWIgY2FzdD0lYiBzdHVjaz0lYiBkbWc9JWR9IiwKICAgICAgICAgICAgICAgIGNhcmROYW1lLCBkcmF3biwgY2FzdCwgc3R1Y2tJbkhhbmQsIGRhbWFnZURlYWx0KTsKICAgIH0KfQo='
Install-B64 -R 'src\main\java\commanderailab\schema\PerCardGameStats.java' -B $b
# src/main/java/commanderailab/schema/WinCondition.java (6,170 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5zY2hlbWE7CgppbXBvcnQgamF2YS51dGlsLio7CmltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CmltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKCi8qKgogKiBXaW5Db25kaXRpb24g4oCUIEZvcm1hbCBlbnVtIGZvciBnYW1lIG91dGNvbWUgY2xhc3NpZmljYXRpb24uCiAqCiAqIENlbnRyYWxpemVzIGFsbCBrbm93biBGb3JnZSBsb3NzLXJlYXNvbiBzdHJpbmdzIGludG8gYSBzaW5nbGUgbWFwcGluZy4KICogVW5rbm93bi9uZXcgbG9zcyByZWFzb25zIGFyZSBsb2dnZWQgYW5kIGNsYXNzaWZpZWQgYXMgVU5LTk9XTiByYXRoZXIKICogdGhhbiBzaWxlbnRseSBkcm9wcGVkLgogKgogKiBSZXNvbHZlczogR2l0SHViIElzc3VlICMyCiAqLwpwdWJsaWMgZW51bSBXaW5Db25kaXRpb24gewoKICAgIENPTUJBVF9EQU1BR0UoImNvbWJhdF9kYW1hZ2UiLCAiTGlmZSB0b3RhbCByZWR1Y2VkIHRvIDAgb3IgYmVsb3cgdmlhIGNvbWJhdC9kaXJlY3QgZGFtYWdlIiksCiAgICBDT01NQU5ERVJfREFNQUdFKCJjb21tYW5kZXJfZGFtYWdlIiwgIjIxKyBjb21tYW5kZXIgZGFtYWdlIGZyb20gYSBzaW5nbGUgY29tbWFuZGVyIiksCiAgICBNSUxMKCJtaWxsIiwgIkxpYnJhcnkgZW1wdGllZCDigJQgZHJldyBmcm9tIGVtcHR5IGxpYnJhcnkiKSwKICAgIENPTUJPX0FMVF9XSU4oImNvbWJvX2FsdF93aW4iLCAiQWx0ZXJuYXRlIHdpbiBjb25kaXRpb24gKHBvaXNvbiwgTGFib3JhdG9yeSBNYW5pYWMsIGV0Yy4pIiksCiAgICBMSUZFX0RSQUlOKCJsaWZlX2RyYWluIiwgIkxpZmUgdG90YWwgcmVkdWNlZCBieSBub24tY29tYmF0IHNvdXJjZXMgKGRyYWluLCBidXJuIHNwZWxscykiKSwKICAgIENPTkNFU1NJT04oImNvbmNlc3Npb24iLCAiT3Bwb25lbnQgY29uY2VkZWQiKSwKICAgIFRJTUVPVVQoInRpbWVvdXQiLCAiR2FtZSBjbG9jayBleHBpcmVkIG9yIGRyYXciKSwKICAgIFVOS05PV04oInVua25vd24iLCAiVW5yZWNvZ25pemVkIHdpbiBjb25kaXRpb24g4oCUIHNlZSBsb2dzIik7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoV2luQ29uZGl0aW9uLmNsYXNzLmdldE5hbWUoKSk7CgogICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGFiZWw7CiAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKCiAgICBXaW5Db25kaXRpb24oU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwogICAgfQoKICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7IHJldHVybiBsYWJlbDsgfQogICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsgcmV0dXJuIGRlc2NyaXB0aW9uOyB9CgogICAgLy8g4pSA4pSAIEZvcmdlIGxvc3MtcmVhc29uIHN0cmluZyDihpIgV2luQ29uZGl0aW9uIG1hcHBpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAvLwogICAgLy8gS25vd24gRm9yZ2UgcXVpZXQtbW9kZSBsb3NzIHJlYXNvbnMgKGZyb20gZm9yZ2UtZ3VpLWRlc2t0b3Agc291cmNlKToKICAgIC8vICAgImxpZmUgdG90YWwgcmVhY2hlZCAwIgogICAgLy8gICAibGlmZSB0b3RhbCByZWFjaGVkIC1OIgogICAgLy8gICAicmFuIG91dCBvZiBjYXJkcyIKICAgIC8vICAgImRyZXcgZnJvbSBhbiBlbXB0eSBsaWJyYXJ5IgogICAgLy8gICAiZHJldyBmcm9tIGVtcHR5IGxpYnJhcnkiCiAgICAvLyAgICJyZWNlaXZlZCAyMSBvciBtb3JlIGNvbW1hbmRlciBkYW1hZ2UiCiAgICAvLyAgICJnb3QgMTAgb3IgbW9yZSBwb2lzb24gY291bnRlcnMiCiAgICAvLyAgICJhbiBvcHBvbmVudCBoYXMgd29uIHRoZSBnYW1lIgogICAgLy8gICAiY29uY2VkZWQiCiAgICAvLyAgICJhbGwgb3Bwb25lbnRzIGhhdmUgbG9zdCIKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PExvc3NSZWFzb25NYXBwaW5nPiBMT1NTX1JFQVNPTl9NQVBQSU5HUyA9IExpc3Qub2YoCiAgICAgICAgLy8gQ29tbWFuZGVyIGRhbWFnZSDigJQgbXVzdCBjaGVjayBCRUZPUkUgZ2VuZXJpYyBsaWZlLXRvdGFsIHBhdHRlcm5zCiAgICAgICAgbmV3IExvc3NSZWFzb25NYXBwaW5nKAogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoImNvbW1hbmRlclxccytkYW1hZ2UiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJ' +
'VkUpLAogICAgICAgICAgICBDT01NQU5ERVJfREFNQUdFCiAgICAgICAgKSwKCiAgICAgICAgLy8gUG9pc29uIGNvdW50ZXJzCiAgICAgICAgbmV3IExvc3NSZWFzb25NYXBwaW5nKAogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoInBvaXNvblxccytjb3VudGVyIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKSwKICAgICAgICAgICAgQ09NQk9fQUxUX1dJTgogICAgICAgICksCgogICAgICAgIC8vIE1pbGwg4oCUIGVtcHR5IGxpYnJhcnkKICAgICAgICBuZXcgTG9zc1JlYXNvbk1hcHBpbmcoCiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgicmFuXFxzK291dFxccytvZlxccytjYXJkc3xlbXB0eVxccytsaWJyYXJ5fGRyZXdcXHMrZnJvbVxccysuK2xpYnJhcnkiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpLAogICAgICAgICAgICBNSUxMCiAgICAgICAgKSwKCiAgICAgICAgLy8gQWx0ZXJuYXRlIHdpbiBjb25kaXRpb25zIChlLmcuLCAid2lucyB0aGUgZ2FtZSIsICJ3b24gdGhlIGdhbWUiKQogICAgICAgIG5ldyBMb3NzUmVhc29uTWFwcGluZygKICAgICAgICAgICAgUGF0dGVybi5jb21waWxlKCJhbHRlcm5hdGVcXHMrd2lufHdpbnNcXHMrdGhlXFxzK2dhbWV8d29uXFxzK3RoZVxccytnYW1lIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKSwKICAgICAgICAgICAgQ09NQk9fQUxUX1dJTgogICAgICAgICksCgogICAgICAgIC8vIENvbmNlc3Npb24KICAgICAgICBuZXcgTG9zc1JlYXNvbk1hcHBpbmcoCiAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiY29uY2VkZSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSksCiAgICAgICAgICAgIENPTkNFU1NJT04KICAgICAgICApLAoKICAgICAgICAvLyBMaWZlIHRvdGFsIHJlYWNoZWQgMCBvciBiZWxvdyDigJQgZ2VuZXJpYyBjb21iYXQvZGFtYWdlCiAgICAgICAgbmV3IExvc3NSZWFzb25NYXBwaW5nKAogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoImxpZmVcXHMrdG90YWxcXHMrcmVhY2hlZCIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSksCiAgICAgICAgICAgIENPTUJBVF9EQU1BR0UKICAgICAgICApLAoKICAgICAgICAvLyBUaW1lb3V0IC8gY2xvY2sgLyBkcmF3CiAgICAgICAgbmV3IExvc3NSZWFzb25NYXBwaW5nKAogICAgICAgICAgICBQYXR0ZXJuLmNvbXBpbGUoImNsb2NrfHRpbWVcXHMrbGltaXR8dGltZWQ/XFxzKm91dCIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSksCiAgICAgICAgICAgIFRJTUVPVVQKICAgICAgICApCiAgICApOwoKICAgIC8qKgogICAgICogQ2xhc3NpZnkgd2luIGNvbmRpdGlvbiBmcm9tIGEgbWFwIG9mIGxvc2VyIHNlYXQg4oaSIGxvc3MgcmVhc29uIHN0cmluZ3MsCiAgICAgKiBwbHVzIHRoZSBmdWxsIEZvcmdlIG91dHB1dCBmb3IgYWRkaXRpb25hbCBjb250ZXh0IHNjYW5uaW5nLgogICAgICoKICAgICAqIEBwYXJhbSBsb3NzUmVhc29ucyBNYXAgb2Ygc2VhdCBpbmRleCAoYXMgc3RyaW5nKSDihpIgRm9yZ2UgbG9zcyByZWFzb24gdGV4dAogICAgICogQHBhcmFtIGZ1bGxPdXRwdXQgIENvbXBsZXRlIEZvcmdlIHN0ZG91dCBmb3IgZmFsbGJhY2sgcGF0dGVybiBtYXRjaGluZwogICAgICogQHJldHVybiBUaGUgY2xhc3NpZmllZCBXaW5Db25kaXRpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBXaW5Db25kaXRpb24gY2xhc3NpZnkoTWFwPFN0cmluZywgU3RyaW5nPiBsb3NzUmVhc29ucywgU3RyaW5nIGZ1bGxPdXRwdXQpIHsKICAgICAgICBTdHJpbmcgY29tYmluZWRSZWFzb25zID0gU3RyaW5nLmpvaW4oIiAiLCBsb3NzUmVhc29ucy52YWx1ZXMoKSkudG9Mb3dlckNhc2UoKTsKICAgICAgICBTdHJpbmcgbG93ZXJPdXRwdXQgPSBmdWxsT3V0cHV0LnRvTG93ZXJDYXNlKCk7CgogICAgICAgIC8vIEZpcnN0IHBhc3M6IGNoZWNrIGNvbWJpbmVkIGxvc3MgcmVhc29uIHN0cmluZ3MKICAgICAgICBmb3IgKExvc3NSZWFzb25NYXBwaW5nIG1hcHBpbmcgOiBMT1NTX1JFQVNPTl9NQVBQSU5HUykgewogICAgICAgICAgICBpZiAobWFwcGluZy5wYXR0ZXJuLm1hdGNoZXIoY29tYmluZWRSZWFzb25zKS5maW5kKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nLmNvbmRpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gU2Vjb25kIHBhc3M6IHNjYW4gZnVsbCBvdXRwdXQgZm9yIHBhdHRlcm5zIG5vdCBpbiBsb3NzIHJlYXNvbnMKICAgICAgICBmb3IgKExvc3NSZWFzb25NYXBwaW5nIG1hcHBpbmcgOiBM' +
'T1NTX1JFQVNPTl9NQVBQSU5HUykgewogICAgICAgICAgICBpZiAobWFwcGluZy5wYXR0ZXJuLm1hdGNoZXIobG93ZXJPdXRwdXQpLmZpbmQoKSkgewogICAgICAgICAgICAgICAgLy8gRm9yIHRpbWVvdXQsIG9ubHkgY2xhc3NpZnkgaWYgdGhlcmUncyBubyB3aW5uZXIgKG5vIGxvc3MgcmVhc29ucykKICAgICAgICAgICAgICAgIGlmIChtYXBwaW5nLmNvbmRpdGlvbiA9PSBUSU1FT1VUICYmICFsb3NzUmVhc29ucy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nLmNvbmRpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgZm9yIGRyYXcgaW5kaWNhdG9ycyBpbiBmdWxsIG91dHB1dAogICAgICAgIGlmIChsb3dlck91dHB1dC5jb250YWlucygiZHJhdyIpICYmIGxvc3NSZWFzb25zLmlzRW1wdHkoKSkgewogICAgICAgICAgICByZXR1cm4gVElNRU9VVDsKICAgICAgICB9CgogICAgICAgIC8vIFVOS05PV04g4oCUIGxvZyBmb3IgcmV2aWV3IHNvIHdlIGNhbiBhZGQgbmV3IG1hcHBpbmdzCiAgICAgICAgaWYgKCFsb3NzUmVhc29ucy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgTE9HLndhcm5pbmcoIltXaW5Db25kaXRpb25dIFVucmVjb2duaXplZCBsb3NzIHJlYXNvbnMg4oCUIGxvZ2dpbmcgZm9yIHJldmlldzoiKTsKICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogbG9zc1JlYXNvbnMuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgICAgTE9HLndhcm5pbmcoIiAgU2VhdCAiICsgZW50cnkuZ2V0S2V5KCkgKyAiOiBcIiIgKyBlbnRyeS5nZXRWYWx1ZSgpICsgIlwiIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBVTktOT1dOOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydCBsYWJlbCBzdHJpbmcgYmFjayB0byBlbnVtIChmb3IgZGVzZXJpYWxpemF0aW9uIC8gYmFja3dhcmQgY29tcGF0KS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBXaW5Db25kaXRpb24gZnJvbUxhYmVsKFN0cmluZyBsYWJlbCkgewogICAgICAgIGlmIChsYWJlbCA9PSBudWxsKSByZXR1cm4gVU5LTk9XTjsKICAgICAgICBmb3IgKFdpbkNvbmRpdGlvbiB3YyA6IHZhbHVlcygpKSB7CiAgICAgICAgICAgIGlmICh3Yy5sYWJlbC5lcXVhbHMobGFiZWwpKSByZXR1cm4gd2M7CiAgICAgICAgfQogICAgICAgIExPRy53YXJuaW5nKCJbV2luQ29uZGl0aW9uXSBVbmtub3duIGxhYmVsOiBcIiIgKyBsYWJlbCArICJcIiIpOwogICAgICAgIHJldHVybiBVTktOT1dOOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gbGFiZWw7CiAgICB9CgogICAgLy8g4pSA4pSAIEludGVybmFsIG1hcHBpbmcgcmVjb3JkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHByaXZhdGUgcmVjb3JkIExvc3NSZWFzb25NYXBwaW5nKFBhdHRlcm4gcGF0dGVybiwgV2luQ29uZGl0aW9uIGNvbmRpdGlvbikge30KfQo='
Install-B64 -R 'src\main\java\commanderailab\schema\WinCondition.java' -B $b
# src/main/java/commanderailab/stats/StatsAggregator.java (3,747 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYi5zdGF0czsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuQmF0Y2hSZXN1bHQ7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuQmF0Y2hSZXN1bHQuKjsKCmltcG9ydCBqYXZhLnV0aWwuKjsKCi8qKgogKiBTdGF0c0FnZ3JlZ2F0b3Ig4oCUIENvbXB1dGVzIHN1bW1hcnkgc3RhdGlzdGljcyBmcm9tIGEgbGlzdCBvZiBHYW1lUmVzdWx0cy4KICoKICogVGhyZWFkLXNhZmU6IGNhbGwgbWVyZ2VTdGF0cygpIHRvIGNvbWJpbmUgcmVzdWx0cyBmcm9tIG11bHRpcGxlIHdvcmtlcnMuCiAqLwpwdWJsaWMgY2xhc3MgU3RhdHNBZ2dyZWdhdG9yIHsKCiAgICAvKioKICAgICAqIENvbXB1dGUgc3VtbWFyeSBmcm9tIGNvbXBsZXRlZCBnYW1lcy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBTdW1tYXJ5IGNvbXB1dGVTdW1tYXJ5KExpc3Q8R2FtZVJlc3VsdD4gZ2FtZXMsIExpc3Q8RGVja0luZm8+IGRlY2tzLCBsb25nIHRvdGFsRWxhcHNlZE1zKSB7CiAgICAgICAgU3VtbWFyeSBzdW1tYXJ5ID0gbmV3IFN1bW1hcnkoKTsKICAgICAgICBzdW1tYXJ5LnBlckRlY2sgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCiAgICAgICAgaW50IHBvZFNpemUgPSBkZWNrcy5zaXplKCk7CgogICAgICAgIC8vIEluaXRpYWxpemUgcGVyLWRlY2sgYWNjdW11bGF0b3JzCiAgICAgICAgaW50W10gd2lucyA9IG5ldyBpbnRbcG9kU2l6ZV07CiAgICAgICAgaW50W10gbG9zc2VzID0gbmV3IGludFtwb2RTaXplXTsKICAgICAgICBpbnRbXSBkcmF3cyA9IG5ldyBpbnRbcG9kU2l6ZV07CiAgICAgICAgbG9uZ1tdIHRvdGFsVHVybnNPbldpbiA9IG5ldyBsb25nW3BvZFNpemVdOwogICAgICAgIGxvbmdbXSB0b3RhbE11bGxpZ2FucyA9IG5ldyBsb25nW3BvZFNpemVdOwogICAgICAgIGxvbmdbXSB0b3RhbEZpbmFsTGlmZSA9IG5ldyBsb25nW3BvZFNpemVdOwogICAgICAgIGludFtdIGdhbWVDb3VudCA9IG5ldyBpbnRbcG9kU2l6ZV07CiAgICAgICAgV2luQ29uZGl0aW9uQnJlYWtkb3duW10gYnJlYWtkb3ducyA9IG5ldyBXaW5Db25kaXRpb25CcmVha2Rvd25bcG9kU2l6ZV07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2RTaXplOyBpKyspIHsKICAgICAgICAgICAgYnJlYWtkb3duc1tpXSA9IG5ldyBXaW5Db25kaXRpb25CcmVha2Rvd24oKTsKICAgICAgICB9CgogICAgICAgIGxvbmcgdG90YWxUdXJuc0FsbEdhbWVzID0gMDsKICAgICAgICBsb25nIHRvdGFsR2FtZVRpbWVNcyA9IDA7CgogICAgICAgIGZvciAoR2FtZVJlc3VsdCBnYW1lIDogZ2FtZXMpIHsKICAgICAgICAgICAgdG90YWxUdXJuc0FsbEdhbWVzICs9IGdhbWUudG90YWxUdXJuczsKICAgICAgICAgICAgdG90YWxHYW1lVGltZU1zICs9IGdhbWUuZWxhcHNlZE1zOwoKICAgICAgICAgICAgZm9yIChQbGF5ZXJSZXN1bHQgcHIgOiBnYW1lLnBsYXllclJlc3VsdHMpIHsKICAgICAgICAgICAgICAgIGludCBzZWF0ID0gcHIuc2VhdEluZGV4OwogICAgICAgICAgICAgICAgZ2FtZUNvdW50W3NlYXRdKys7CiAgICAgICAgICAgICAgICB0b3RhbE11bGxpZ2Fuc1tzZWF0XSArPSBwci5tdWxsaWdhbnM7CiAgICAgICAgICAgICAgICB0b3RhbEZpbmFsTGlmZVtzZWF0XSArPSBwci5maW5hbExpZmU7CgogICAgICAgICAgICAgICAgaWYgKHByLmlzV2lubmVyKSB7CiAgICAgICAgICAgICAgICAgICAgd2luc1tzZWF0XSsrOwogICAgICAgICAgICAgICAgICAgIHRvdGFsVHVybnNPbldpbltzZWF0XSArPSBnYW1lLnRvdGFsVHVybnM7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtkb3duc1tzZWF0XS5pbmNyZW1lbnQoZ2FtZS53aW5Db25kaXRpb24pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnYW1lLndpbm5pbmdTZWF0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBkcmF3c1tzZWF0XSsrOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsb3NzZXNbc2VhdF0rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW50IGNvbXBsZXRlZEdhbWVzID0gZ2FtZXMuc2l6ZSgpOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvZFNpemU7IGkrKykgewogICAgICAgICAgICBEZWNrU3VtbWFyeSBkcyA9IG5ldyBEZWNrU3VtbWFyeSgpOwogICAgICAgICAgICBkcy5zZWF0SW5kZXggPSBpOwogICAgICAgICAgICBkcy5kZWNrTmFtZSA9IGRlY2tzLmdldChpKS5kZWNrTmFtZTsKICAg' +
'ICAgICAgICAgZHMud2lucyA9IHdpbnNbaV07CiAgICAgICAgICAgIGRzLmxvc3NlcyA9IGxvc3Nlc1tpXTsKICAgICAgICAgICAgZHMuZHJhd3MgPSBkcmF3c1tpXTsKICAgICAgICAgICAgZHMud2luUmF0ZSA9IGNvbXBsZXRlZEdhbWVzID4gMCA/IChkb3VibGUpIHdpbnNbaV0gLyBjb21wbGV0ZWRHYW1lcyA6IDAuMDsKICAgICAgICAgICAgZHMuYXZnVHVybnNUb1dpbiA9IHdpbnNbaV0gPiAwID8gKGRvdWJsZSkgdG90YWxUdXJuc09uV2luW2ldIC8gd2luc1tpXSA6IG51bGw7CiAgICAgICAgICAgIGRzLmF2Z011bGxpZ2FucyA9IGdhbWVDb3VudFtpXSA+IDAgPyAoZG91YmxlKSB0b3RhbE11bGxpZ2Fuc1tpXSAvIGdhbWVDb3VudFtpXSA6IDAuMDsKICAgICAgICAgICAgZHMuYXZnRmluYWxMaWZlID0gZ2FtZUNvdW50W2ldID4gMCA/IChkb3VibGUpIHRvdGFsRmluYWxMaWZlW2ldIC8gZ2FtZUNvdW50W2ldIDogMC4wOwogICAgICAgICAgICBkcy53aW5Db25kaXRpb25CcmVha2Rvd24gPSBicmVha2Rvd25zW2ldOwogICAgICAgICAgICBzdW1tYXJ5LnBlckRlY2suYWRkKGRzKTsKICAgICAgICB9CgogICAgICAgIHN1bW1hcnkuYXZnR2FtZVR1cm5zID0gY29tcGxldGVkR2FtZXMgPiAwID8gKGRvdWJsZSkgdG90YWxUdXJuc0FsbEdhbWVzIC8gY29tcGxldGVkR2FtZXMgOiAwLjA7CiAgICAgICAgc3VtbWFyeS5hdmdHYW1lVGltZU1zID0gY29tcGxldGVkR2FtZXMgPiAwID8gKGRvdWJsZSkgdG90YWxHYW1lVGltZU1zIC8gY29tcGxldGVkR2FtZXMgOiAwLjA7CiAgICAgICAgc3VtbWFyeS5zaW1zUGVyU2Vjb25kID0gdG90YWxFbGFwc2VkTXMgPiAwID8gKGRvdWJsZSkgY29tcGxldGVkR2FtZXMgLyAodG90YWxFbGFwc2VkTXMgLyAxMDAwLjApIDogMC4wOwoKICAgICAgICByZXR1cm4gc3VtbWFyeTsKICAgIH0KCiAgICAvKioKICAgICAqIE1lcmdlIGdhbWUgcmVzdWx0cyBmcm9tIG11bHRpcGxlIHdvcmtlciB0aHJlYWRzIGludG8gYSBzaW5nbGUgbGlzdC4KICAgICAqIFRocmVhZC1zYWZlOiBlYWNoIHdvcmtlciBwcm9kdWNlcyBpdHMgb3duIGxpc3Q7IHRoaXMgY29tYmluZXMgdGhlbS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBMaXN0PEdhbWVSZXN1bHQ+IG1lcmdlU3RhdHMoTGlzdDxMaXN0PEdhbWVSZXN1bHQ+PiB3b3JrZXJSZXN1bHRzKSB7CiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBtZXJnZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBmb3IgKExpc3Q8R2FtZVJlc3VsdD4gYmF0Y2ggOiB3b3JrZXJSZXN1bHRzKSB7CiAgICAgICAgICAgIG1lcmdlZC5hZGRBbGwoYmF0Y2gpOwogICAgICAgIH0KICAgICAgICAvLyBSZS1pbmRleCBnYW1lcyBzZXF1ZW50aWFsbHkKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lcmdlZC5zaXplKCk7IGkrKykgewogICAgICAgICAgICBtZXJnZWQuZ2V0KGkpLmdhbWVJbmRleCA9IGk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZXJnZWQ7CiAgICB9Cn0K'
Install-B64 -R 'src\main\java\commanderailab\stats\StatsAggregator.java' -B $b
# src/test/java/commanderailab/CommanderAiLabTest.java (11,037 bytes)
$b = 'cGFja2FnZSBjb21tYW5kZXJhaWxhYjsKCmltcG9ydCBjb21tYW5kZXJhaWxhYi5haS4qOwppbXBvcnQgY29tbWFuZGVyYWlsYWIuc2NoZW1hLio7CmltcG9ydCBjb21tYW5kZXJhaWxhYi5zY2hlbWEuQmF0Y2hSZXN1bHQuKjsKaW1wb3J0IGNvbW1hbmRlcmFpbGFiLnN0YXRzLlN0YXRzQWdncmVnYXRvcjsKaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OwoKaW1wb3J0IGphdmEudXRpbC4qOwoKaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy4qOwoKLyoqCiAqIFVuaXQgdGVzdHMgZm9yIENvbW1hbmRlciBBSSBMYWIgY29yZSBjb21wb25lbnRzLgogKiBUaGVzZSB0ZXN0cyB2YWxpZGF0ZSBkYXRhIHN0cnVjdHVyZXMsIHN0YXRzIGNvbXB1dGF0aW9uLCBhbmQgSlNPTiBzZXJpYWxpemF0aW9uCiAqIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBGb3JnZSBlbmdpbmUgdG8gYmUgaW5zdGFsbGVkLgogKi8KY2xhc3MgQ29tbWFuZGVyQWlMYWJUZXN0IHsKCiAgICAvLyDilIDilIAgQUkgUG9saWN5IFRlc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIEBUZXN0CiAgICB2b2lkIHRlc3RGb3JnZUJ1aWx0aW5Qb2xpY3lEZWZhdWx0cygpIHsKICAgICAgICBGb3JnZUJ1aWx0aW5Qb2xpY3kgcG9saWN5ID0gbmV3IEZvcmdlQnVpbHRpblBvbGljeSgpOwogICAgICAgIGFzc2VydEVxdWFscygiZm9yZ2UtYnVpbHRpbiIsIHBvbGljeS5nZXROYW1lKCkpOwogICAgICAgIGFzc2VydFRydWUocG9saWN5LnVzZXNGb3JnZUJ1aWx0aW5BaSgpKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMC4yNSwgcG9saWN5LmdldENhcmRBZHZhbnRhZ2VXZWlnaHQoKSwgMC4wMDEpOwogICAgICAgIGFzc2VydEVxdWFscygwLjMwLCBwb2xpY3kuZ2V0VGVtcG9XZWlnaHQoKSwgMC4wMDEpOwogICAgICAgIGFzc2VydEVxdWFscygwLjI1LCBwb2xpY3kuZ2V0VGhyZWF0U2NvcmluZ1dlaWdodCgpLCAwLjAwMSk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMjAsIHBvbGljeS5nZXRDb21iYXRXZWlnaHQoKSwgMC4wMDEpOwogICAgfQoKICAgIEBUZXN0CiAgICB2b2lkIHRlc3RDdXN0b21Qb2xpY3lXZWlnaHRzKCkgewogICAgICAgIEZvcmdlQnVpbHRpblBvbGljeSBwb2xpY3kgPSBuZXcgRm9yZ2VCdWlsdGluUG9saWN5KDAuNCwgMC4zLCAwLjIsIDAuMSk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKDAuNCwgcG9saWN5LmdldENhcmRBZHZhbnRhZ2VXZWlnaHQoKSwgMC4wMDEpOwogICAgICAgIGFzc2VydEVxdWFscygwLjMsIHBvbGljeS5nZXRUZW1wb1dlaWdodCgpLCAwLjAwMSk7CiAgICB9CgogICAgLy8g4pSA4pSAIFN0YXRzIEFnZ3JlZ2F0aW9uIFRlc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIEBUZXN0CiAgICB2b2lkIHRlc3RTdGF0c0NvbXB1dGF0aW9uU2luZ2xlR2FtZSgpIHsKICAgICAgICBMaXN0PERlY2tJbmZvPiBkZWNrcyA9IGNyZWF0ZVRlc3REZWNrcygpOwogICAgICAgIExpc3Q8R2FtZVJlc3VsdD4gZ2FtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBnYW1lcy5hZGQoY3JlYXRlR2FtZVJlc3VsdCgwLCAwLCA4LCAiY29tYmF0X2RhbWFnZSIsIG5ldyBpbnRbXXsyMCwgLTUsIDB9LCBuZXcgaW50W117MCwgMSwgMH0pKTsKCiAgICAgICAgU3VtbWFyeSBzdW1tYXJ5ID0gU3RhdHNBZ2dyZWdhdG9yLmNvbXB1dGVTdW1tYXJ5KGdhbWVzLCBkZWNrcywgMTAwMCk7CgogICAgICAgIGFzc2VydE5vdE51bGwoc3VtbWFyeSk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHN1bW1hcnkucGVyRGVjay5zaXplKCkpOwoKICAgICAgICAvLyBTZWF0IDAgd29uCiAgICAgICAgRGVja1N1bW1hcnkgczAgPSBzdW1tYXJ5LnBlckRlY2suZ2V0KDApOwogICAgICAgIGFzc2VydEVxdWFscygxLCBzMC53aW5zKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMCwgczAubG9zc2VzKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCBzMC53aW5SYXRlLCAwLjAwMSk7CiAgICAgICAgYXNzZXJ0Tm90TnVsbChzMC5hdmdUdXJuc1RvV2luKTsKICAgICAgICBhc3NlcnRFcXVhbHMoOC4wLCBzMC5hdmdUdXJuc1RvV2luLCAwLjAwMSk7CgogICAgICAgIC8vIFNlYXQg' +
'MSBsb3N0CiAgICAgICAgRGVja1N1bW1hcnkgczEgPSBzdW1tYXJ5LnBlckRlY2suZ2V0KDEpOwogICAgICAgIGFzc2VydEVxdWFscygwLCBzMS53aW5zKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMSwgczEubG9zc2VzKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCBzMS53aW5SYXRlLCAwLjAwMSk7CiAgICAgICAgYXNzZXJ0TnVsbChzMS5hdmdUdXJuc1RvV2luKTsgLy8gTm8gd2lucwogICAgICAgIGFzc2VydEVxdWFscygxLjAsIHMxLmF2Z011bGxpZ2FucywgMC4wMDEpOyAvLyBIYWQgMSBtdWxsaWdhbgogICAgfQoKICAgIEBUZXN0CiAgICB2b2lkIHRlc3RTdGF0c0NvbXB1dGF0aW9uTXVsdGlwbGVHYW1lcygpIHsKICAgICAgICBMaXN0PERlY2tJbmZvPiBkZWNrcyA9IGNyZWF0ZVRlc3REZWNrcygpOwogICAgICAgIExpc3Q8R2FtZVJlc3VsdD4gZ2FtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAvLyBHYW1lIDA6IFNlYXQgMCB3aW5zIGluIDggdHVybnMKICAgICAgICBnYW1lcy5hZGQoY3JlYXRlR2FtZVJlc3VsdCgwLCAwLCA4LCAiY29tYmF0X2RhbWFnZSIsIG5ldyBpbnRbXXsyMCwgMCwgNX0sIG5ldyBpbnRbXXswLCAwLCAwfSkpOwogICAgICAgIC8vIEdhbWUgMTogU2VhdCAxIHdpbnMgaW4gMTIgdHVybnMKICAgICAgICBnYW1lcy5hZGQoY3JlYXRlR2FtZVJlc3VsdCgxLCAxLCAxMiwgImNvbW1hbmRlcl9kYW1hZ2UiLCBuZXcgaW50W117MCwgMzAsIDEwfSwgbmV3IGludFtdezEsIDAsIDF9KSk7CiAgICAgICAgLy8gR2FtZSAyOiBTZWF0IDIgd2lucyBpbiA2IHR1cm5zCiAgICAgICAgZ2FtZXMuYWRkKGNyZWF0ZUdhbWVSZXN1bHQoMiwgMiwgNiwgImNvbWJvX2FsdF93aW4iLCBuZXcgaW50W117NDAsIDQwLCA0MH0sIG5ldyBpbnRbXXswLCAwLCAwfSkpOwogICAgICAgIC8vIEdhbWUgMzogU2VhdCAwIHdpbnMgaW4gMTAgdHVybnMKICAgICAgICBnYW1lcy5hZGQoY3JlYXRlR2FtZVJlc3VsdCgzLCAwLCAxMCwgImNvbWJhdF9kYW1hZ2UiLCBuZXcgaW50W117MTUsIC0zLCAwfSwgbmV3IGludFtdezAsIDAsIDB9KSk7CgogICAgICAgIFN1bW1hcnkgc3VtbWFyeSA9IFN0YXRzQWdncmVnYXRvci5jb21wdXRlU3VtbWFyeShnYW1lcywgZGVja3MsIDUwMDApOwoKICAgICAgICAvLyBTZWF0IDA6IDIgd2lucyAvIDQgZ2FtZXMgPSA1MCUKICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3VtbWFyeS5wZXJEZWNrLmdldCgwKS53aW5zKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMC41LCBzdW1tYXJ5LnBlckRlY2suZ2V0KDApLndpblJhdGUsIDAuMDAxKTsKICAgICAgICBhc3NlcnRFcXVhbHMoOS4wLCBzdW1tYXJ5LnBlckRlY2suZ2V0KDApLmF2Z1R1cm5zVG9XaW4sIDAuMDAxKTsgLy8gKDgrMTApLzIKCiAgICAgICAgLy8gU2VhdCAxOiAxIHdpbiAvIDQgZ2FtZXMgPSAyNSUKICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3VtbWFyeS5wZXJEZWNrLmdldCgxKS53aW5zKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMC4yNSwgc3VtbWFyeS5wZXJEZWNrLmdldCgxKS53aW5SYXRlLCAwLjAwMSk7CgogICAgICAgIC8vIFNlYXQgMjogMSB3aW4gLyA0IGdhbWVzID0gMjUlCiAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN1bW1hcnkucGVyRGVjay5nZXQoMikud2lucyk7CgogICAgICAgIC8vIEF2ZXJhZ2UgdHVybnMgYWNyb3NzIGFsbCBnYW1lczogKDgrMTIrNisxMCkvNCA9IDkuMAogICAgICAgIGFzc2VydEVxdWFscyg5LjAsIHN1bW1hcnkuYXZnR2FtZVR1cm5zLCAwLjAwMSk7CiAgICB9CgogICAgQFRlc3QKICAgIHZvaWQgdGVzdFN0YXRzV2l0aERyYXdzKCkgewogICAgICAgIExpc3Q8RGVja0luZm8+IGRlY2tzID0gY3JlYXRlVGVzdERlY2tzKCk7CiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBnYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIC8vIERyYXcgZ2FtZSAod2lubmluZ1NlYXQgPSBudWxsKQogICAgICAgIEdhbWVSZXN1bHQgZHJhdyA9IGNyZWF0ZUdhbWVSZXN1bHQoMCwgbnVsbCwgNTAsICJ0aW1lb3V0IiwgbmV3IGludFtdezEwLCAxMCwgMTB9LCBuZXcgaW50W117MCwgMCwgMH0pOwogICAgICAgIGdhbWVzLmFkZChkcmF3KTsKCiAgICAgICAgU3VtbWFyeSBzdW1tYXJ5ID0gU3RhdHNBZ2dyZWdhdG9yLmNvbXB1dGVTdW1tYXJ5KGdhbWVzLCBkZWNrcywgMTAwMCk7CgogICAgICAgIGZvciAoRGVja1N1bW1hcnkgZHMgOiBzdW1tYXJ5LnBlckRlY2spIHsKICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRzLndpbnMp' +
'OwogICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZHMubG9zc2VzKTsKICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRzLmRyYXdzKTsKICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMCwgZHMud2luUmF0ZSwgMC4wMDEpOwogICAgICAgICAgICBhc3NlcnROdWxsKGRzLmF2Z1R1cm5zVG9XaW4pOwogICAgICAgIH0KICAgIH0KCiAgICBAVGVzdAogICAgdm9pZCB0ZXN0V2luQ29uZGl0aW9uQnJlYWtkb3duKCkgewogICAgICAgIExpc3Q8RGVja0luZm8+IGRlY2tzID0gY3JlYXRlVGVzdERlY2tzKCk7CiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBnYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGdhbWVzLmFkZChjcmVhdGVHYW1lUmVzdWx0KDAsIDAsIDgsICJjb21iYXRfZGFtYWdlIiwgbmV3IGludFtdezIwLCAwLCAwfSwgbmV3IGludFtdezAsIDAsIDB9KSk7CiAgICAgICAgZ2FtZXMuYWRkKGNyZWF0ZUdhbWVSZXN1bHQoMSwgMCwgMTAsICJjb21tYW5kZXJfZGFtYWdlIiwgbmV3IGludFtdezE1LCAwLCAwfSwgbmV3IGludFtdezAsIDAsIDB9KSk7CiAgICAgICAgZ2FtZXMuYWRkKGNyZWF0ZUdhbWVSZXN1bHQoMiwgMCwgNiwgImNvbWJvX2FsdF93aW4iLCBuZXcgaW50W117NDAsIDAsIDB9LCBuZXcgaW50W117MCwgMCwgMH0pKTsKCiAgICAgICAgU3VtbWFyeSBzdW1tYXJ5ID0gU3RhdHNBZ2dyZWdhdG9yLmNvbXB1dGVTdW1tYXJ5KGdhbWVzLCBkZWNrcywgMTAwMCk7CiAgICAgICAgV2luQ29uZGl0aW9uQnJlYWtkb3duIGIgPSBzdW1tYXJ5LnBlckRlY2suZ2V0KDApLndpbkNvbmRpdGlvbkJyZWFrZG93bjsKCiAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGIuY29tYmF0X2RhbWFnZSk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGIuY29tbWFuZGVyX2RhbWFnZSk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGIuY29tYm9fYWx0X3dpbik7CiAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGIubGlmZV9kcmFpbik7CiAgICB9CgogICAgLy8g4pSA4pSAIE1lcmdlIFN0YXRzIFRlc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIEBUZXN0CiAgICB2b2lkIHRlc3RNZXJnZVN0YXRzKCkgewogICAgICAgIExpc3Q8R2FtZVJlc3VsdD4gd29ya2VyMSA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIHdvcmtlcjEuYWRkKGNyZWF0ZUdhbWVSZXN1bHQoMCwgMCwgOCwgImNvbWJhdF9kYW1hZ2UiLCBuZXcgaW50W117MjAsIDAsIDB9LCBuZXcgaW50W117MCwgMCwgMH0pKTsKICAgICAgICB3b3JrZXIxLmFkZChjcmVhdGVHYW1lUmVzdWx0KDEsIDEsIDEwLCAiY29tbWFuZGVyX2RhbWFnZSIsIG5ldyBpbnRbXXswLCAyMCwgMH0sIG5ldyBpbnRbXXswLCAwLCAwfSkpOwoKICAgICAgICBMaXN0PEdhbWVSZXN1bHQ+IHdvcmtlcjIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICB3b3JrZXIyLmFkZChjcmVhdGVHYW1lUmVzdWx0KDIsIDIsIDYsICJjb21ib19hbHRfd2luIiwgbmV3IGludFtdezAsIDAsIDQwfSwgbmV3IGludFtdezAsIDAsIDB9KSk7CgogICAgICAgIExpc3Q8TGlzdDxHYW1lUmVzdWx0Pj4gd29ya2VycyA9IExpc3Qub2Yod29ya2VyMSwgd29ya2VyMik7CiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBtZXJnZWQgPSBTdGF0c0FnZ3JlZ2F0b3IubWVyZ2VTdGF0cyh3b3JrZXJzKTsKCiAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1lcmdlZC5zaXplKCkpOwogICAgICAgIC8vIFZlcmlmeSByZS1pbmRleGluZwogICAgICAgIGFzc2VydEVxdWFscygwLCBtZXJnZWQuZ2V0KDApLmdhbWVJbmRleCk7CiAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1lcmdlZC5nZXQoMSkuZ2FtZUluZGV4KTsKICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWVyZ2VkLmdldCgyKS5nYW1lSW5kZXgpOwogICAgfQoKICAgIC8vIOKUgOKUgCBKU09OIFNlcmlhbGl6YXRpb24gVGVzdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgQFRlc3QKICAgIHZvaWQgdGVzdEpzb25Sb3VuZFRyaXAoKSB7CiAgICAgICAgQmF0Y2hSZXN1bHQgb3JpZ2luYWwgPSBjcmVhdGVUZXN0QmF0Y2hSZXN1bHQoKTsKCiAgICAgICAgU3RyaW5nIGpzb24gPSBKc29uRXhwb3J0ZXIudG9Kc29uKG9yaWdpbmFsKTsK' +
'ICAgICAgICBhc3NlcnROb3ROdWxsKGpzb24pOwogICAgICAgIGFzc2VydFRydWUoanNvbi5jb250YWlucygiXCJzY2hlbWFWZXJzaW9uXCI6IFwiMS4wLjBcIiIpKTsKICAgICAgICBhc3NlcnRUcnVlKGpzb24uY29udGFpbnMoIlwiZm9ybWF0XCI6IFwiY29tbWFuZGVyXCIiKSk7CiAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmNvbnRhaW5zKCJcInBvZFNpemVcIjogMyIpKTsKCiAgICAgICAgLy8gVmFsaWRhdGUgc3RydWN0dXJlCiAgICAgICAgYXNzZXJ0VHJ1ZShKc29uRXhwb3J0ZXIudmFsaWRhdGVCYXNpY1N0cnVjdHVyZShqc29uKSk7CiAgICB9CgogICAgQFRlc3QKICAgIHZvaWQgdGVzdEpzb25Db250YWluc0FsbFJlcXVpcmVkS2V5cygpIHsKICAgICAgICBCYXRjaFJlc3VsdCByZXN1bHQgPSBjcmVhdGVUZXN0QmF0Y2hSZXN1bHQoKTsKICAgICAgICBTdHJpbmcganNvbiA9IEpzb25FeHBvcnRlci50b0pzb24ocmVzdWx0KTsKCiAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmNvbnRhaW5zKCJcIm1ldGFkYXRhXCIiKSk7CiAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmNvbnRhaW5zKCJcImRlY2tzXCIiKSk7CiAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmNvbnRhaW5zKCJcImdhbWVzXCIiKSk7CiAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmNvbnRhaW5zKCJcInN1bW1hcnlcIiIpKTsKICAgICAgICBhc3NlcnRUcnVlKGpzb24uY29udGFpbnMoIlwiYmF0Y2hJZFwiIikpOwogICAgICAgIGFzc2VydFRydWUoanNvbi5jb250YWlucygiXCJ0aW1lc3RhbXBcIiIpKTsKICAgICAgICBhc3NlcnRUcnVlKGpzb24uY29udGFpbnMoIlwid2luUmF0ZVwiIikpOwogICAgICAgIGFzc2VydFRydWUoanNvbi5jb250YWlucygiXCJhdmdUdXJuc1RvV2luXCIiKSk7CiAgICAgICAgYXNzZXJ0VHJ1ZShqc29uLmNvbnRhaW5zKCJcImF2Z011bGxpZ2Fuc1wiIikpOwogICAgICAgIGFzc2VydFRydWUoanNvbi5jb250YWlucygiXCJ3aW5Db25kaXRpb25CcmVha2Rvd25cIiIpKTsKICAgIH0KCiAgICBAVGVzdAogICAgdm9pZCB0ZXN0SnNvblZhbGlkYXRpb25SZWplY3RzSW52YWxpZCgpIHsKICAgICAgICBhc3NlcnRGYWxzZShKc29uRXhwb3J0ZXIudmFsaWRhdGVCYXNpY1N0cnVjdHVyZSgie30iKSk7CiAgICAgICAgYXNzZXJ0RmFsc2UoSnNvbkV4cG9ydGVyLnZhbGlkYXRlQmFzaWNTdHJ1Y3R1cmUoIm5vdCBqc29uIikpOwogICAgICAgIGFzc2VydEZhbHNlKEpzb25FeHBvcnRlci52YWxpZGF0ZUJhc2ljU3RydWN0dXJlKCJ7XCJtZXRhZGF0YVwiOiB7fX0iKSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEhlbHBlciBNZXRob2RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHByaXZhdGUgTGlzdDxEZWNrSW5mbz4gY3JlYXRlVGVzdERlY2tzKCkgewogICAgICAgIExpc3Q8RGVja0luZm8+IGRlY2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7IkF0cmF4YV9TdXBlcmZyaWVuZHMiLCAiS29ydm9sZF9BcmlzdG9jcmF0cyIsICJNdWxkcm90aGFfVmFsdWUifTsKICAgICAgICBTdHJpbmdbXSBjb21tYW5kZXJzID0geyJBdHJheGEsIFByYWV0b3JzJyBWb2ljZSIsICJLb3J2b2xkLCBGYWUtQ3Vyc2VkIEtpbmciLCAiTXVsZHJvdGhhLCB0aGUgR3JhdmV0aWRlIn07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgRGVja0luZm8gZCA9IG5ldyBEZWNrSW5mbygpOwogICAgICAgICAgICBkLnNlYXRJbmRleCA9IGk7CiAgICAgICAgICAgIGQuZGVja05hbWUgPSBuYW1lc1tpXTsKICAgICAgICAgICAgZC5jb21tYW5kZXJOYW1lID0gY29tbWFuZGVyc1tpXTsKICAgICAgICAgICAgZC5kZWNrRmlsZSA9IG5hbWVzW2ldICsgIi5kY2siOwogICAgICAgICAgICBkLmNvbG9ySWRlbnRpdHkgPSBMaXN0Lm9mKCJXIiwgIlUiLCAiQiIsICJHIik7CiAgICAgICAgICAgIGQuY2FyZENvdW50ID0gMTAwOwogICAgICAgICAgICBkZWNrcy5hZGQoZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWNrczsKICAgIH0KCiAgICBwcml2YXRlIEdhbWVSZXN1bHQgY3JlYXRlR2FtZVJlc3VsdChpbnQgZ2FtZUluZGV4LCBJbnRlZ2VyIHdpbm5pbmdTZWF0LCBpbnQgdHVybnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg' +
'U3RyaW5nIHdpbkNvbmRpdGlvbiwgaW50W10gbGl2ZXMsIGludFtdIG11bGxpZ2FucykgewogICAgICAgIEdhbWVSZXN1bHQgZyA9IG5ldyBHYW1lUmVzdWx0KCk7CiAgICAgICAgZy5nYW1lSW5kZXggPSBnYW1lSW5kZXg7CiAgICAgICAgZy53aW5uaW5nU2VhdCA9IHdpbm5pbmdTZWF0OwogICAgICAgIGcudG90YWxUdXJucyA9IHR1cm5zOwogICAgICAgIGcud2luQ29uZGl0aW9uID0gd2luQ29uZGl0aW9uOwogICAgICAgIGcuZ2FtZVNlZWQgPSA0MiArIGdhbWVJbmRleDsKICAgICAgICBnLmVsYXBzZWRNcyA9IDEwMDAgKyBnYW1lSW5kZXggKiA1MDA7CiAgICAgICAgZy5wbGF5ZXJSZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgICAgUGxheWVyUmVzdWx0IHByID0gbmV3IFBsYXllclJlc3VsdCgpOwogICAgICAgICAgICBwci5zZWF0SW5kZXggPSBpOwogICAgICAgICAgICBwci5maW5hbExpZmUgPSBsaXZlc1tpXTsKICAgICAgICAgICAgcHIubXVsbGlnYW5zID0gbXVsbGlnYW5zW2ldOwogICAgICAgICAgICBwci5pc1dpbm5lciA9ICh3aW5uaW5nU2VhdCAhPSBudWxsICYmIHdpbm5pbmdTZWF0ID09IGkpOwogICAgICAgICAgICBwci5jb21tYW5kZXJEYW1hZ2VEZWFsdCA9IDA7CiAgICAgICAgICAgIHByLmNvbW1hbmRlckNhc3RzID0gMDsKICAgICAgICAgICAgcHIubGFuZHNQbGF5ZWQgPSB0dXJucyAvIDI7CiAgICAgICAgICAgIHByLnNwZWxsc0Nhc3QgPSB0dXJuczsKICAgICAgICAgICAgcHIuY3JlYXR1cmVzRGVzdHJveWVkID0gMDsKICAgICAgICAgICAgZy5wbGF5ZXJSZXN1bHRzLmFkZChwcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBnOwogICAgfQoKICAgIHByaXZhdGUgQmF0Y2hSZXN1bHQgY3JlYXRlVGVzdEJhdGNoUmVzdWx0KCkgewogICAgICAgIExpc3Q8RGVja0luZm8+IGRlY2tzID0gY3JlYXRlVGVzdERlY2tzKCk7CiAgICAgICAgTGlzdDxHYW1lUmVzdWx0PiBnYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIGdhbWVzLmFkZChjcmVhdGVHYW1lUmVzdWx0KDAsIDAsIDgsICJjb21iYXRfZGFtYWdlIiwgbmV3IGludFtdezIwLCAwLCA1fSwgbmV3IGludFtdezAsIDEsIDB9KSk7CiAgICAgICAgZ2FtZXMuYWRkKGNyZWF0ZUdhbWVSZXN1bHQoMSwgMSwgMTIsICJjb21tYW5kZXJfZGFtYWdlIiwgbmV3IGludFtdezAsIDMwLCAxMH0sIG5ldyBpbnRbXXsxLCAwLCAxfSkpOwogICAgICAgIGdhbWVzLmFkZChjcmVhdGVHYW1lUmVzdWx0KDIsIDIsIDYsICJjb21ib19hbHRfd2luIiwgbmV3IGludFtdezQwLCA0MCwgNDB9LCBuZXcgaW50W117MCwgMCwgMH0pKTsKCiAgICAgICAgU3VtbWFyeSBzdW1tYXJ5ID0gU3RhdHNBZ2dyZWdhdG9yLmNvbXB1dGVTdW1tYXJ5KGdhbWVzLCBkZWNrcywgMzAwMCk7CgogICAgICAgIEJhdGNoUmVzdWx0IHJlc3VsdCA9IG5ldyBCYXRjaFJlc3VsdCgpOwogICAgICAgIHJlc3VsdC5tZXRhZGF0YSA9IG5ldyBNZXRhZGF0YSgpOwogICAgICAgIHJlc3VsdC5tZXRhZGF0YS5iYXRjaElkID0gInRlc3QtYmF0Y2gtMDAxIjsKICAgICAgICByZXN1bHQubWV0YWRhdGEudGltZXN0YW1wID0gIjIwMjYtMDMtMDZUMjI6MDA6MDBaIjsKICAgICAgICByZXN1bHQubWV0YWRhdGEudG90YWxHYW1lcyA9IDM7CiAgICAgICAgcmVzdWx0Lm1ldGFkYXRhLmNvbXBsZXRlZEdhbWVzID0gMzsKICAgICAgICByZXN1bHQubWV0YWRhdGEuZW5naW5lVmVyc2lvbiA9ICJmb3JnZS0xLjYuNjQtU05BUFNIT1QiOwogICAgICAgIHJlc3VsdC5tZXRhZGF0YS5tYXN0ZXJTZWVkID0gNDJMOwogICAgICAgIHJlc3VsdC5tZXRhZGF0YS50aHJlYWRzID0gMTsKICAgICAgICByZXN1bHQubWV0YWRhdGEuZWxhcHNlZE1zID0gMzAwMDsKICAgICAgICByZXN1bHQuZGVja3MgPSBkZWNrczsKICAgICAgICByZXN1bHQuZ2FtZXMgPSBnYW1lczsKICAgICAgICByZXN1bHQuc3VtbWFyeSA9IHN1bW1hcnk7CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9Cn0K'
Install-B64 -R 'src\test\java\commanderailab\CommanderAiLabTest.java' -B $b
# start-lab.bat (4,390 bytes)
$b = 'QGVjaG8gb2ZmClJFTSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKUkVNICBDb21tYW5kZXIgQUkgTGFiIOKAlCBPbmUtQ2xpY2sgTGF1bmNoZXIgKFdpbmRvd3MpClJFTSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKUkVNClJFTSAgU3RhcnRzIHRoZSBQeXRob24gRmFzdEFQSSBzZXJ2ZXIgKyBzZXJ2ZXMgdGhlIHdlYiBVSS4KUkVNICBQcmVyZXF1aXNpdGVzOgpSRU0gICAgLSBQeXRob24gMy4xMCsgd2l0aDogcGlwIGluc3RhbGwgZmFzdGFwaSB1dmljb3JuClJFTSAgICAtIEphdmEgMTcrClJFTSAgICAtIGNvbW1hbmRlci1haS1sYWIgYnVpbHQ6IG12biBwYWNrYWdlICItRHNraXBUZXN0cyIKUkVNClJFTSAgRWRpdCB0aGUgcGF0aHMgYmVsb3cgdG8gbWF0Y2ggeW91ciBzeXN0ZW0uClJFTSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKClJFTSDilIDilIAgWW91ciBGb3JnZSBwYXRocyAoRURJVCBUSEVTRSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACnNldCBGT1JHRV9KQVI9RDpcRm9yZ2VDb21tYW5kZXJcZm9yZ2UtcmVwb1xmb3JnZS1ndWktZGVza3RvcFx0YXJnZXRcZm9yZ2UtZ3VpLWRlc2t0b3AtMi4wLjEyLVNOQVBTSE9ULWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIKc2V0IEZPUkdFX0RJUj1EOlxGb3JnZUNvbW1hbmRlclxmb3JnZS1yZXBvXGZvcmdlLWd1aQpzZXQgRk9SR0VfREVDS1NfRElSPSVBUFBEQVRBJVxGb3JnZVxkZWNrc1xjb21tYW5kZXIKClJFTSDilIDilIAgTGFiIEpBUiAoYXV0by1kZXRlY3RlZCBmcm9tIHRhcmdldC8pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgApzZXQgTEFCX1BPUlQ9ODA4MAoKUkVNIOKUgOKUgCBYaW1pbGFyIEFQSSBLZXkgZm9yIENhcmQgU2Nhbm5lciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKc2V0IFhJTUlMQVJfQVBJX0tFWT05NmM3ZGFiMzVkZGJkODgyOWIwNGMwZjViY2VhNTdmNWVkZTIwNDk2CgpSRU0g4pSA4pSAIFBlcnBsZXhpdHkgQVBJIEtleSBmb3IgQUkgRGVjayBSZXNlYXJjaC9HZW5lcmF0aW9uIOKUgOKUgOKUgOKUgOKUgApzZXQgUFBMWF9BUElfS0VZPXBwbHgtRzc2SGdyQVU4SW03MmJFVE1leVI0YXNBV3d0Rzh3cm15Znk2VlNLQTlEVG4wNUZxCgplY2hvLgplY2hvICDilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZcKZWNobyAg4pWRICAgICAgQ29tbWFuZGVyIEFJIExhYiDigJQgTGF1bmNoZXIgICAgICAgICAgICAgICAg4pWRCmVjaG8gIOKVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnQplY2hvLgplY2hvICBGb3JnZSBKQVI6ICAgICVGT1JHRV9KQVIlCmVjaG8gIEZvcmdlIERpcjogICAgJUZPUkdFX0RJUiUKZWNobyAgRGVja3MgRGlyOiAgICAlRk9SR0VfREVDS1NfRElSJQplY2hvICBQb3J0OiAgICAgICAgICVMQUJfUE9SVCUKZWNobyAgWGltaWxhcjogICAgICBDb25maWd1' +
'cmVkCmlmIGRlZmluZWQgUFBMWF9BUElfS0VZICgKICAgIGVjaG8gIFBlcnBsZXhpdHk6ICAgQ29uZmlndXJlZAopIGVsc2UgKAogICAgZWNobyAgUGVycGxleGl0eTogICBOb3QgY29uZmlndXJlZCBeKHNldCBQUExYX0FQSV9LRVkgZW52IHZhciBmb3IgQUkgZmVhdHVyZXNeKQopCmVjaG8uCgpSRU0g4pSA4pSAIENoZWNrIHByZXJlcXVpc2l0ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACndoZXJlIHB5dGhvbiA+bnVsIDI+JjEKaWYgJUVSUk9STEVWRUwlIG5lcSAwICgKICAgIGVjaG8gIEVSUk9SOiBQeXRob24gbm90IGZvdW5kIGluIFBBVEgKICAgIHBhdXNlCiAgICBleGl0IC9iIDEKKQoKd2hlcmUgamF2YSA+bnVsIDI+JjEKaWYgJUVSUk9STEVWRUwlIG5lcSAwICgKICAgIGVjaG8gIEVSUk9SOiBKYXZhIG5vdCBmb3VuZCBpbiBQQVRICiAgICBwYXVzZQogICAgZXhpdCAvYiAxCikKCmlmIG5vdCBleGlzdCAiJUZPUkdFX0pBUiUiICgKICAgIGVjaG8gIEVSUk9SOiBGb3JnZSBKQVIgbm90IGZvdW5kIGF0OiAlRk9SR0VfSkFSJQogICAgZWNobyAgUnVuIEZvcmdlIGJ1aWxkIGZpcnN0OgogICAgZWNobyAgICBjZCBEOlxGb3JnZUNvbW1hbmRlclxmb3JnZS1yZXBvCiAgICBlY2hvICAgIG12biBwYWNrYWdlIC1wbCBmb3JnZS1ndWktZGVza3RvcCAiLURza2lwVGVzdHMiICItRHJldmlzaW9uPTIuMC4xMi1TTkFQU0hPVCIgLWFtCiAgICBwYXVzZQogICAgZXhpdCAvYiAxCikKClJFTSDilIDilIAgQ2hlY2sgaWYgbGFiX2FwaS5weSBleGlzdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmlmIG5vdCBleGlzdCAiJX5kcDBsYWJfYXBpLnB5IiAoCiAgICBlY2hvICBFUlJPUjogbGFiX2FwaS5weSBub3QgZm91bmQgaW4gJX5kcDAKICAgIHBhdXNlCiAgICBleGl0IC9iIDEKKQoKUkVNIOKUgOKUgCBJbnN0YWxsIFB5dGhvbiBkZXBzIGlmIG5lZWRlZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKcHl0aG9uIC1jICJpbXBvcnQgZmFzdGFwaSIgPm51bCAyPiYxCmlmICVFUlJPUkxFVkVMJSBuZXEgMCAoCiAgICBlY2hvICBJbnN0YWxsaW5nIEZhc3RBUEkgKyBVdmljb3JuLi4uCiAgICBwaXAgaW5zdGFsbCBmYXN0YXBpIHV2aWNvcm4KKQoKUkVNIOKUgOKUgCBMYXVuY2ggdGhlIHNlcnZlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKZWNoby4KZWNobyAgU3RhcnRpbmcgQ29tbWFuZGVyIEFJIExhYiBzZXJ2ZXIuLi4KZWNobyAgV2ViIFVJOiAgaHR0cDovL2xvY2FsaG9zdDolTEFCX1BPUlQlCmVjaG8gIEFQSTogICAgIGh0dHA6Ly9sb2NhbGhvc3Q6JUxBQl9QT1JUJS9kb2NzCmVjaG8gIFByZXNzIEN0cmwrQyB0byBzdG9wLgplY2hvLgoKaWYgZGVmaW5lZCBQUExYX0FQSV9LRVkgKAogICAgcHl0aG9uICIlfmRwMGxhYl9hcGkucHkiIF4KICAgICAgICAtLWZvcmdlLWphciAiJUZPUkdFX0pBUiUiIF4KICAgICAgICAtLWZvcmdlLWRpciAiJUZPUkdFX0RJUiUiIF4KICAgICAgICAtLWZvcmdlLWRlY2tzLWRpciAiJUZPUkdFX0RFQ0tTX0RJUiUiIF4KICAgICAgICAtLXBvcnQgJUxBQl9QT1JUJSBeCiAgICAgICAgLS14aW1pbGFyLWtleSAiJVhJTUlMQVJfQVBJX0tFWSUiIF4KICAgICAgICAtLXBwbHgta2V5ICIlUFBMWF9BUElfS0VZJSIKKSBlbHNlICgKICAgIHB5dGhvbiAiJX5kcDBsYWJfYXBpLnB5IiBeCiAgICAgICAgLS1mb3JnZS1qYXIgIiVGT1JHRV9KQVIlIiBeCiAgICAgICAgLS1mb3JnZS1kaXIgIiVGT1JHRV9ESVIlIiBeCiAgICAgICAgLS1mb3JnZS1kZWNrcy1kaXIgIiVGT1JHRV9ERUNLU19ESVIlIiBeCiAgICAgICAgLS1wb3J0ICVMQUJfUE9SVCUgXgogICAgICAgIC0teGltaWxhci1rZXkgIiVYSU1JTEFSX0FQSV9LRVklIgopCg=='
Install-B64 -R 'start-lab.bat' -B $b
# ui/ai-lab.css (36,865 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIEFJIExhYiBQYW5lbAogICBQYWdlLXNwZWNpZmljIHN0eWxlcyBvbmx5OyBzaGFyZWQgdG9rZW5zICYgY29tcG9uZW50cyBpbiBnbG9iYWwuY3NzCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLyog4pSA4pSAIENvbnRhaW5lciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiNhaS1sYWItcGFuZWwgewogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZyk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC02KTsKICAgIG1hcmdpbjogdmFyKC0tc3AtNSkgMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKI2FpLWxhYi1wYW5lbCBoMiB7CiAgICBtYXJnaW46IDAgMCA0cHggMDsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogI2ZmZjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKfQoKI2FpLWxhYi1wYW5lbCBoMjo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICfwn6eqJzsKfQoKLmxhYi1zdWJ0aXRsZSB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbWFyZ2luOiAwIDAgdmFyKC0tc3AtNSkgMDsKfQoKLyog4pSA4pSAIEhlYWRlciB3aXRoIEJhY2tlbmQgU3RhdHVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cn0KCi5sYWItYmFja2VuZC1zdGF0dXMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5sYWItYmFja2VuZC1zdGF0dXMgLnN0YXR1cy1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgoubGFiLWJhY2tlbmQtc3RhdHVzLmNvbm5lY3RlZCAuc3RhdHVzLWRvdCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzKTsKICAgIGJveC1zaGFkb3c6IDAgMCA2cHggdmFyKC0tc3VjY2Vzcy1kaW0pOwp9CgoubGFiLWJhY2tlbmQtc3RhdHVzLmNvbm5lY3RlZCAuc3RhdHVzLXRleHQgewogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgoubGFiLWJhY2tlbmQtc3RhdHVzLmRpc2Nvbm5lY3RlZCAuc3RhdHVzLWRvdCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nKTsKfQoKLmxhYi1iYWNrZW5kLXN0YXR1cy5kaXNjb25uZWN0ZWQgLnN0YXR1cy10ZXh0IHsKICAgIGNvbG9yOiB2YXIoLS13YXJuaW5nKTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIEltcG9ydCBCYXIKICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ' +
'4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgoubGFiLWltcG9ydC1iYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC00KTsKfQoKLmxhYi1pbXBvcnQtYmFyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5sYWItaW1wb3J0LWFjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5sYWItaW1wb3J0LWFjdGlvbi1idG4gewogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiA2cHggdmFyKC0tc3AtNCk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKfQoKLmxhYi1pbXBvcnQtYWN0aW9uLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwp9CgoubGFiLWltcG9ydC1hY3Rpb24tYnRuIC5pbXBvcnQtaWNvbiB7CiAgICBmb250LXNpemU6IDE0cHg7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICBVUkwgSW1wb3J0IFBhbmVsCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLmxhYi11cmwtaW1wb3J0IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC00KTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5sYWItdXJsLWltcG9ydC5hY3RpdmUgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBhbmltYXRpb246IGxhYlNsaWRlRG93biAwLjJzIHZhcigtLWVhc2UpOwp9CgpAa2V5ZnJhbWVzIGxhYlNsaWRlRG93biB7CiAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC04cHgpOyB9CiAgICB0byAgIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9Cn0KCi5sYWItdXJsLWltcG9ydC1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC00KTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7' +
'CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5sYWItcGFuZWwtY2xvc2UgewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAycHggNnB4Owp9CgoubGFiLXBhbmVsLWNsb3NlOmhvdmVyIHsKICAgIGNvbG9yOiAjZmZmOwp9CgoubGFiLXVybC1pbXBvcnQtYm9keSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTQpIHZhcigtLXNwLTIpOwp9CgoubGFiLXVybC1pbXBvcnQtYm9keSBpbnB1dCB7CiAgICBmbGV4OiAxOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmxhYi11cmwtaW1wb3J0LWJvZHkgaW5wdXQ6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCB2YXIoLS1hY2NlbnQtZ2xvdyk7Cn0KCi5sYWItdXJsLWltcG9ydC1idG4gewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LWludmVyc2UpOwogICAgYm9yZGVyOiBub25lOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTUpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoubGFiLXVybC1pbXBvcnQtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1ob3Zlcik7Cn0KCi5sYWItdXJsLWltcG9ydC1idG46ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC41OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLmxhYi1pbXBvcnQtaGludCB7CiAgICBwYWRkaW5nOiA2cHggdmFyKC0tc3AtNCkgdmFyKC0tc3AtMyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgoubGFiLWltcG9ydC1oaW50IHN0cm9uZyB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICBJbXBvcnQgU3RhdHVzIE1lc3NhZ2VzCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLmxhYi1pbXBvcnQtc3RhdHVzIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC00KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwp9CgoubGFiLWltcG9ydC1zdGF0dXMuc3RhdHVzLWxvYWRpbmcgewogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5sYWItaW1wb3J0LXN0YXR1cy5zdGF0dXMtbG9hZGluZzo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICfij7MgJzsKfQoKLmxhYi1pbXBvcnQtc3RhdHVzLnN0YXR1cy1zdWNjZXNzIHsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKfQoKLmxhYi1pbXBvcnQtc3RhdHVzLnN0YXR1cy1zdWNjZXNzOjpiZWZvcmUgewogICAgY29udGVudDogJ+KckyAnOwp9CgoubGFiLWltcG9ydC1zdGF0dXMuc3RhdHVzLWVycm9yIHsKICAg' +
'IGNvbG9yOiB2YXIoLS1lcnJvcik7Cn0KCi5sYWItaW1wb3J0LXN0YXR1cy5zdGF0dXMtZXJyb3I6OmJlZm9yZSB7CiAgICBjb250ZW50OiAn4pyXICc7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICBTb3VyY2UgQmFkZ2VzIChkZWNrIHNsb3RzICsgcmVzdWx0IGNhcmRzKQogICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KCi5sYWItZGVjay1zb3VyY2UtYmFkZ2UgewogICAgZGlzcGxheTogbm9uZTsKICAgIG1hcmdpbi10b3A6IDZweDsKfQoKLmxhYi1zb3VyY2UtYmFkZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHggdmFyKC0tc3AtMik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7Cn0KCi5iYWRnZS1lZGhyZWMgewogICAgYmFja2dyb3VuZDogdmFyKC0tcHVycGxlLWRpbSk7CiAgICBjb2xvcjogdmFyKC0tcHVycGxlKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTY3LCAxMzksIDI1MCwgMC4zKTsKfQoKLmJhZGdlLWFyY2hpZGVrdCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg5MSwgMTU4LCAyNDAsIDAuMyk7Cn0KCi5iYWRnZS10ZXh0IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmctZGltKTsKICAgIGNvbG9yOiB2YXIoLS13YXJuaW5nKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjUxLCAxOTEsIDM2LCAwLjMpOwp9CgouYmFkZ2UtZGVmYXVsdCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEzOSwgMTQ4LCAxNTgsIDAuMTUpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTM5LCAxNDgsIDE1OCwgMC4zKTsKfQoKLmxhYi1zb3VyY2UtYmFkZ2UgLnNvdXJjZS1saW5rIHsKICAgIGNvbG9yOiBpbmhlcml0OwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgoubGFiLXNvdXJjZS1iYWRnZSAuc291cmNlLWxpbms6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KCi5sYWItcmVzdWx0LXNvdXJjZSB7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIE1vZGFsIE92ZXJsYXlzIChzaGFyZWQpCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLmxhYi1tb2RhbC1vdmVybGF5IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpOwogICAgei1pbmRleDogMTAwMDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLmxhYi1tb2RhbC1vdmVybGF5LmFjdGl2ZSB7CiAgICBkaXNwbGF5OiBmbGV4Owp9CgoubGFiLW1vZGFsLWNvbnRlbnQg' +
'ewogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZyk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC02KTsKICAgIHdpZHRoOiA5MCU7CiAgICBtYXgtd2lkdGg6IDUwMHB4OwogICAgbWF4LWhlaWdodDogNzB2aDsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5sYWItbW9kYWwtY29udGVudC5sYWItbW9kYWwtd2lkZSB7CiAgICBtYXgtd2lkdGg6IDYyMHB4Owp9CgoubGFiLW1vZGFsLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTQpOwp9CgoubGFiLW1vZGFsLWhlYWRlciBoMyB7CiAgICBtYXJnaW46IDA7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLmxhYi1tb2RhbC1jbG9zZSB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDJweCA2cHg7Cn0KCi5sYWItbW9kYWwtY2xvc2U6aG92ZXIgewogICAgY29sb3I6ICNmZmY7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICBDb21tYW5kZXIgTWV0YSBQaWNrZXIKICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgoubGFiLW1ldGEtc2VhcmNoLXJvdyB7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKfQoKLmxhYi1tZXRhLXNlYXJjaC1yb3cgaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC00KTsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLmxhYi1tZXRhLXNlYXJjaC1yb3cgaW5wdXQ6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCB2YXIoLS1hY2NlbnQtZ2xvdyk7Cn0KCi5sYWItbWV0YS1saXN0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5sYWItbWV0YS1jYXJkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgoubGFiLW1ldGEtY2FyZDpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKfQoKLm1ldGEtY2FyZC1sZWZ0IHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5tZXRhLWNhcmQtbmFtZSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICNmZmY7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cn0KCi5tZXRhLWNhcmQtaW5mbyB7CiAgICBkaXNwbGF5OiBmbGV4Owog' +
'ICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubWFuYS1waXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1zbSk7Cn0KCi5sYWItYXJjaC1iYWRnZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBwYWRkaW5nOiAxcHggN3B4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouYXJjaC1hZ2dybyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwogICAgY29sb3I6IHZhcigtLWVycm9yKTsKfQoKLmFyY2gtY29udHJvbCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouYXJjaC1jb21ibyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wdXJwbGUtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1wdXJwbGUpOwp9CgouYXJjaC1taWRyYW5nZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KCi5hcmNoLXN0YXggewogICAgYmFja2dyb3VuZDogdmFyKC0td2FybmluZy1kaW0pOwogICAgY29sb3I6IHZhcigtLXdhcm5pbmcpOwp9CgoubGFiLW1ldGEtZmV0Y2gtYnRuIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXB1cnBsZSk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiA2cHggdmFyKC0tc3AtNCk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5sYWItbWV0YS1mZXRjaC1idG46aG92ZXIgewogICAgZmlsdGVyOiBicmlnaHRuZXNzKDEuMTUpOwogICAgYm94LXNoYWRvdzogMCAycHggOHB4IHZhcigtLXB1cnBsZS1kaW0pOwp9CgoubGFiLW1ldGEtZW1wdHkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogdmFyKC0tc3AtNik7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgVGV4dCBJbXBvcnQgTW9kYWwKICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgoubGFiLXRleHQtaW1wb3J0LWJvZHkgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IHZhcigtLXNwLTMpOwp9CgoubGFiLXRleHQtaW1wb3J0LWhpbnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi5sYWItdGV4dC1pbXBvcnQtaGludCBjb2RlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCiNsYWItdGV4dC1pbXBvcnQtYXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBjb2xvcjog' +
'dmFyKC0tdGV4dCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpOwogICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS41OwogICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgIG1pbi1oZWlnaHQ6IDE4MHB4Owp9CgojbGFiLXRleHQtaW1wb3J0LWFyZWE6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCB2YXIoLS1hY2NlbnQtZ2xvdyk7Cn0KCi5sYWItdGV4dC1pbXBvcnQtb3B0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5sYWItdGV4dC1pbXBvcnQtb3B0aW9ucyBsYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmxhYi10ZXh0LWltcG9ydC1vcHRpb25zIGlucHV0IHsKICAgIGZsZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiA2cHggdmFyKC0tc3AtMyk7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5sYWItdGV4dC1pbXBvcnQtb3B0aW9ucyBpbnB1dDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgoubGFiLWltcG9ydC1zdWJtaXQtYnRuIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwogICAgY29sb3I6ICNmZmY7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNik7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwp9CgoubGFiLWltcG9ydC1zdWJtaXQtYnRuOmhvdmVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggdmFyKC0tc3VjY2Vzcy1kaW0pOwp9CgovKiDilIDilIAgRGVjayBTZWxlY3Rpb24gR3JpZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5sYWItZGVjay1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTUpOwp9CgoubGFiLWRlY2stc2xvdCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAycHggZGFzaGVkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtNCk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyB2YXIoLS1lYXNlKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmxhYi1kZWNrLXNsb3Q6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm94LXNoYWRvdzogMCAwIDEycHggdmFyKC0tYWNjZW50LWdsb3cpOwp9CgoubGFiLWRlY2stc2xvdC5maWxsZWQgewogICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmxhYi1kZWNrLXNsb3QgLnNlYXQtbGFiZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMik7Cn0KCi5sYWItZGVjay1zbG90IC5kZWNrLW5h' +
'bWUgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwp9CgoubGFiLWRlY2stc2xvdCAuY29tbWFuZGVyLW5hbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBtYXJnaW4tdG9wOiA0cHg7Cn0KCi5sYWItZGVjay1zbG90IC5lbXB0eS10ZXh0IHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5sYWItZGVjay1zbG90IHNlbGVjdCB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgcGFkZGluZzogNnB4IHZhcigtLXNwLTIpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMik7Cn0KCi8qIOKUgOKUgCBDb250cm9scyBSb3cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubGFiLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC00KTsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTUpOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgoubGFiLWNvbnRyb2wtZ3JvdXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKfQoKLmxhYi1jb250cm9sLWdyb3VwIGxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5sYWItY29udHJvbC1ncm91cCBpbnB1dCwKLmxhYi1jb250cm9sLWdyb3VwIHNlbGVjdCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiA2cHggdmFyKC0tc3AtMyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICB3aWR0aDogODBweDsKfQoKLmxhYi1wcmVzZXQtYnRucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA0cHg7Cn0KCi5sYWItcHJlc2V0LWJ0biB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgcGFkZGluZzogNHB4IHZhcigtLXNwLTMpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmxhYi1wcmVzZXQtYnRuOmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgoubGFiLXByZXNldC1idG4uYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1pbnZlcnNlKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLyog4pSA4pSAIFJ1biBCdXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubGFiLXJ1bi1idG4gewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcyk7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC02KTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyB2YXIoLS1lYXNlKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAg' +
'Z2FwOiB2YXIoLS1zcC0yKTsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgoubGFiLXJ1bi1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTZweCB2YXIoLS1zdWNjZXNzLWRpbSk7Cn0KCi5sYWItcnVuLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjU7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgoubGFiLXJ1bi1idG4gLnNwaW5uZXIgewogICAgZGlzcGxheTogbm9uZTsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgYm9yZGVyOiAycHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgYm9yZGVyLXRvcC1jb2xvcjogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGFuaW1hdGlvbjogbGFiU3BpbiAwLjZzIGxpbmVhciBpbmZpbml0ZTsKfQoKLmxhYi1ydW4tYnRuLnJ1bm5pbmcgLnNwaW5uZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgoubGFiLXJ1bi1idG4ucnVubmluZyAucnVuLWljb24gewogICAgZGlzcGxheTogbm9uZTsKfQoKQGtleWZyYW1lcyBsYWJTcGluIHsKICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQp9CgovKiDilIDilIAgUHJvZ3Jlc3MgQmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1wcm9ncmVzcyB7CiAgICBkaXNwbGF5OiBub25lOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNSk7Cn0KCi5sYWItcHJvZ3Jlc3MuYWN0aXZlIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgoubGFiLXByb2dyZXNzLWJhciB7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgoubGFiLXByb2dyZXNzLWZpbGwgewogICAgaGVpZ2h0OiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1hY2NlbnQpLCB2YXIoLS1zdWNjZXNzKSk7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIHZhcigtLWVhc2UpOwogICAgd2lkdGg6IDAlOwp9CgoubGFiLXByb2dyZXNzLXRleHQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi8qIOKUgOKUgCBSZXN1bHRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1yZXN1bHRzIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5sYWItcmVzdWx0cy5hY3RpdmUgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5sYWItcmVzdWx0cy1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKfQoKLmxhYi1yZXN1bHRzLWhlYWRlciBoMyB7CiAgICBtYXJnaW46IDA7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBjb2xvcjogI2ZmZjsKfQoKLmxhYi1yZXN1bHRzLWFjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5sYWItZXhwb3J0LWJ0biB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHBhZGRpbmc6IDRweCB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5sYWItZXhwb3J0LWJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOwogICAgY29sb3I6IHZhcigtLXRleHQt' +
'aW52ZXJzZSk7Cn0KCi5sYWItaGlzdG9yeS1idG4gewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHBhZGRpbmc6IDRweCB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5sYWItaGlzdG9yeS1idG46aG92ZXIgewogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi8qIOKUgOKUgCBTdGF0IENhcmRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1zdGF0cy1jYXJkcyB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsKICAgIGdhcDogdmFyKC0tc3AtMyk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC00KTsKfQoKLmxhYi1zdGF0LWNhcmQgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtNCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubGFiLXN0YXQtY2FyZCAucmFuayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IHZhcigtLXNwLTIpOwogICAgcmlnaHQ6IHZhcigtLXNwLTMpOwogICAgZm9udC1zaXplOiAyNHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7Cn0KCi5sYWItc3RhdC1jYXJkLndpbm5lciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWdvbGQpOwogICAgYm94LXNoYWRvdzogMCAwIDEycHggcmdiYSgyNTIsIDIxMSwgNzcsIDAuMTUpOwp9CgoubGFiLXN0YXQtY2FyZC53aW5uZXIgLnJhbmsgewogICAgY29sb3I6IHZhcigtLWdvbGQpOwp9CgoubGFiLXN0YXQtY2FyZCAuY2FyZC1kZWNrLW5hbWUgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgoubGFiLXN0YXQtY2FyZCAuY2FyZC1jb21tYW5kZXIgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBtYXJnaW4tYm90dG9tOiA0cHg7Cn0KCi5sYWItc3RhdC1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAzcHggMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmxhYi1zdGF0LXJvdyAuc3RhdC1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgoubGFiLXN0YXQtcm93IC5zdGF0LXZhbHVlIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5sYWItc3RhdC1yb3cgLnN0YXQtdmFsdWUuaGlnaGxpZ2h0IHsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKfQoKLyog4pSA4pSAIFdpbiBSYXRlIEJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5sYWItd2lucmF0ZS1iYXIgewogICAgaGVpZ2h0OiA4cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMik7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubGFiLXdpbnJhdGUtZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgdHJhbnNpdGlvbjogd2lkdGggMC41cyB2YXIoLS1lYXNlKTsKfQoKLnNlYXQtMC1jb2xvciB7IGJhY2tncm91bmQ6IHZhcigtLWFj' +
'Y2VudCk7IH0KLnNlYXQtMS1jb2xvciB7IGJhY2tncm91bmQ6IHZhcigtLWVycm9yKTsgfQouc2VhdC0yLWNvbG9yIHsgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcyk7IH0KCi8qIOKUgOKUgCBXaW4gQ29uZGl0aW9uIEJyZWFrZG93biDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5sYWItd2luLWNvbmRpdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMik7Cn0KCi5sYWItd2MtY2hpcCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICAgIHBhZGRpbmc6IDJweCB2YXIoLS1zcC0yKTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5sYWItd2MtY2hpcCAud2MtY291bnQgewogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgovKiDilIDilIAgR2xvYmFsIFN0YXRzIEZvb3RlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5sYWItZ2xvYmFsLXN0YXRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTYpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTMpOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgoubGFiLWdsb2JhbC1zdGF0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLmxhYi1nbG9iYWwtc3RhdCAuZy12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6ICNmZmY7Cn0KCi5sYWItZ2xvYmFsLXN0YXQgLmctbGFiZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi8qIOKUgOKUgCBTZWN0aW9uIERpdmlkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubGFiLXNlY3Rpb24tZGl2aWRlciB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIG1hcmdpbjogdmFyKC0tc3AtNSkgMCB2YXIoLS1zcC00KTsKfQoKLyog4pSA4pSAIFRhYiBOYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1yZXN1bHRzLXRhYnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNCk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHBhZGRpbmctYm90dG9tOiAwOwp9CgoubGFiLXRhYiB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC00KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICBmb250LXdlaWdodDogNTAwOwp9CgoubGFiLXRhYjpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5sYWItdGFiLmFjdGl2ZSB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLWFjY2VudCk7' +
'Cn0KCi5sYWItdGFiLXBhbmVsIHsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi5sYWItdGFiLXBhbmVsLmFjdGl2ZSB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLyog4pSA4pSAIENoYXJ0cyBHcmlkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1jaGFydHMtZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgZ2FwOiB2YXIoLS1zcC00KTsKfQoKLmxhYi1jaGFydC1ib3ggewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtNCk7Cn0KCi5sYWItY2hhcnQtYm94IGg0IHsKICAgIG1hcmdpbjogMCAwIHZhcigtLXNwLTMpIDA7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgoubGFiLWNoYXJ0LWJveCBjYW52YXMgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IGF1dG87Cn0KCi8qIOKUgOKUgCBIZWFkLXRvLUhlYWQgTWF0cml4IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1oMmgtdGFibGUgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubGFiLWgyaC10YWJsZSB0aCwKLmxhYi1oMmgtdGFibGUgdGQgewogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoKLmxhYi1oMmgtdGFibGUgdGggewogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmxhYi1oMmgtY29ybmVyIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5sYWItaDJoLXJvdy1sYWJlbCB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgdGV4dC1hbGlnbjogbGVmdCAhaW1wb3J0YW50Owp9CgoubGFiLWgyaC1zZWxmIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBvcGFjaXR5OiAwLjQ7Cn0KCi5sYWItaDJoLWNlbGwgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmxhYi1oMmgtd2lubmluZyB7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KCi5sYWItaDJoLWxvc2luZyB7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwp9CgoubGFiLWgyaC1zdWIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNDAwOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1hcmdpbi10b3A6IDJweDsKfQoKLmxhYi1oMmgtbm90ZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMyk7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi8qIOKUgOKUgCBDb21iYXQgU3RhdHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubGFiLWNvbWJhdC1ncmlkIHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOwogICAgZ2FwOiB2YXIoLS1zcC00KTsKfQoKLmxhYi1jb21iYXQtY2FyZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAg' +
'IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgoubGFiLWNvbWJhdC1oZWFkZXIgewogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICNmZmY7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMTUpOwp9CgoubGFiLWNvbWJhdC1yb3dzIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIDA7Cn0KCi5sYWItY29tYmF0LXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDZweCB2YXIoLS1zcC00KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5sYWItY29tYmF0LXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLWhvdmVyKTsKfQoKLmxhYi1jb21iYXQtaWNvbiB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB3aWR0aDogMjBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgoubGFiLWNvbWJhdC1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZmxleDogMTsKfQoKLmxhYi1jb21iYXQtdmFsIHsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogI2ZmZjsKICAgIG1pbi13aWR0aDogNDBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgoubGFiLWNvbWJhdC1tYXggewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1pbi13aWR0aDogNTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgovKiDilIDilIAgR2FtZSBMb2cgVGFibGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgoubGFiLWdhbWVsb2ctY29udHJvbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMyk7Cn0KCi5sYWItZ2FtZWxvZy1zZWFyY2ggewogICAgZmxleDogMTsKICAgIG1heC13aWR0aDogMzIwcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmxhYi1nYW1lbG9nLXNlYXJjaDpmb2N1cyB7CiAgICBvdXRsaW5lOiBub25lOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgoubGFiLWdhbWVsb2ctc2VhcmNoOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgoubGFiLWdhbWVsb2ctY291bnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmxhYi1nYW1lbG9nLXdyYXBwZXIgewogICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7Cn0KCi5sYWItZ2FtZWxvZy10YWJsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5sYWItZ2FtZWxvZy10YWJsZSB0aGVhZCB7CiAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgdG9wOiAwOwogICAgei1pbmRleDogMTsKfQoKLmxhYi1nYW1lbG9nLXRhYmxlIHRoIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoKLmxhYi1nYW1lbG9nLXRh' +
'YmxlIHRkIHsKICAgIHBhZGRpbmc6IDZweCB2YXIoLS1zcC0zKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItc3VidGxlKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmxhYi1nYW1lbG9nLXRhYmxlIHRib2R5IHRyOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwp9CgoubGFiLWdsLW51bSB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKfQoKLmxhYi1nbC13YyB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgoubGFiLWdsLWRlYWQgewogICAgY29sb3I6IHZhcigtLWVycm9yKTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5sYWItZ2wtYWxpdmUgewogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmxhYi1nbC1tb3JlIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKTsKICAgIG1hcmdpbjogMDsKfQoKLmxhYi1uby1kYXRhIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC02KTsKfQoKLyog4pSA4pSAIExpdmUgTG9nIFBhbmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmxhYi1sb2cgewogICAgZGlzcGxheTogbm9uZTsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTUpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0wKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmxhYi1sb2cuYWN0aXZlIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgoubGFiLWxvZy1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4Owp9CgoubGFiLWxvZy10b2dnbGUgewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiAycHggNnB4Owp9CgoubGFiLWxvZy1jb250ZW50IHsKICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LW1vbm8pOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgbWFyZ2luOiAwOwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC1icmVhazogYnJlYWstYWxsOwp9CgoubGFiLWxvZy5jb2xsYXBzZWQgLmxhYi1sb2ctY29udGVudCB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiDilIDilIAgSGlzdG9yeSBJdGVtcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5sYWItaGlzdG9yeS1saXN0IHsKICAgIG1heC1oZWlnaHQ6IDQwMHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKfQoKLmxhYi1oaXN0b3J5LWl0ZW0gewogICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAg' +
'Ym9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTIpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmxhYi1oaXN0b3J5LWl0ZW06aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKfQoKLmxhYi1oaXN0b3J5LWl0ZW0gLmhpc3RvcnktYmF0Y2gtaWQgewogICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIG1hcmdpbi1ib3R0b206IDRweDsKfQoKLmxhYi1oaXN0b3J5LWl0ZW0gLmhpc3RvcnktbWV0YSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5sYWItaGlzdG9yeS1pdGVtIC5oaXN0b3J5LWRlY2tzIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBtYXJnaW4tdG9wOiA0cHg7Cn0KCi5sYWItaGlzdG9yeS1pdGVtIC5oaXN0b3J5LWRlY2tzIC5oaXN0LXNyYyB7CiAgICBjb2xvcjogdmFyKC0tcHVycGxlKTsKICAgIGZvbnQtc2l6ZTogMTBweDsKfQoKLmxhYi1oaXN0b3J5LWl0ZW0gLmhpc3RvcnktdGltZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWFyZ2luLXRvcDogMnB4Owp9CgoubGFiLWhpc3RvcnktZW1wdHkgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTUpOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgovKiDilIDilIAgUmVzcG9uc2l2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgLmxhYi1kZWNrLWdyaWQsCiAgICAubGFiLXN0YXRzLWNhcmRzIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KICAgIC5sYWItY29udHJvbHMgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICB9CiAgICAubGFiLXJ1bi1idG4gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQogICAgLmxhYi1pbXBvcnQtYmFyIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgfQogICAgLmxhYi1pbXBvcnQtYWN0aW9ucyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CiAgICAubGFiLWltcG9ydC1hY3Rpb24tYnRuIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgfQogICAgLmxhYi11cmwtaW1wb3J0LWJvZHkgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICB9CiAgICAubGFiLW1vZGFsLWNvbnRlbnQgewogICAgICAgIHdpZHRoOiA5NSU7CiAgICAgICAgcGFkZGluZzogdmFyKC0tc3AtNCk7CiAgICB9CiAgICAubGFiLWNvbWJhdC1ncmlkIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsKICAgIH0KICAgIC5sYWItY2hhcnRzLWdyaWQgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQp9CgovKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICAgUHJlY29uIERlY2tzIOKAlCBHcmlkICsgQ2FyZHMKICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ' +
'4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgoubGFiLXByZWNvbi1idG4gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tc3VyZmFjZS0wKSwgdmFyKC0tc3VyZmFjZS0yKSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyKSAhaW1wb3J0YW50Owp9CgoubGFiLXByZWNvbi1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tc3VyZmFjZS0yKSwgdmFyKC0tc3VyZmFjZS0zKSkgIWltcG9ydGFudDsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZXJyb3IpICFpbXBvcnRhbnQ7Cn0KCi5sYWItcHJlY29uLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgcGFkZGluZzogMCB2YXIoLS1zcC01KSB2YXIoLS1zcC0zKTsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5sYWItcHJlY29uLWNvbnRyb2xzIGlucHV0IHsKICAgIGZsZXg6IDE7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLmxhYi1wcmVjb24tY29udHJvbHMgaW5wdXQ6Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZXJyb3IpOwp9CgoubGFiLXByZWNvbi1pbnN0YWxsLWFsbC1idG4gewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0zKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC00KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmxhYi1wcmVjb24taW5zdGFsbC1hbGwtYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1lcnJvcik7Cn0KCi5sYWItcHJlY29uLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDIyMHB4LCAxZnIpKTsKICAgIGdhcDogdmFyKC0tc3AtMyk7CiAgICBwYWRkaW5nOiAwIHZhcigtLXNwLTUpIHZhcigtLXNwLTUpOwogICAgbWF4LWhlaWdodDogNTV2aDsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5sYWItcHJlY29uLWNhcmQgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0wKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtNCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyB2YXIoLS1lYXNlKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5sYWItcHJlY29uLWNhcmQ6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHZhcigtLWVycm9yLWRpbSk7Cn0KCi5sYWItcHJlY29uLWNhcmQtaW5zdGFsbGVkIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgICBvcGFjaXR5OiAwLjg7Cn0KCi5sYWItcHJlY29uLWNhcmQtaW5zdGFsbGVkIC5sYWItcHJlY29uLWluc3RhbGwtYnRuIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKLnByZWNvbi1jYXJkLWNvbG9ycyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAycHg7Cn0KCi5wcmVjb24tY2FyZC1uYW1lIHsKICAgIGZvbnQtc2l6ZTogMTVweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7' +
'CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBsaW5lLWhlaWdodDogMS4yOwp9CgoucHJlY29uLWNhcmQtY29tbWFuZGVyIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi5wcmVjb24tY2FyZC1zZXQgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLnByZWNvbi1jYXJkLXRoZW1lIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXRlcnRpYXJ5KTsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7CiAgICBtYXJnaW4tdG9wOiBhdXRvOwp9CgoubGFiLXByZWNvbi1pbnN0YWxsLWJ0biB7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0yKTsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0zKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBwYWRkaW5nOiA2cHggdmFyKC0tc3AtMyk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmxhYi1wcmVjb24taW5zdGFsbC1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWVycm9yKTsKfQoKLmJhZGdlLXByZWNvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTMpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXIpOwp9Cg=='
Install-B64 -R 'ui\ai-lab.css' -B $b
# ui/ai-lab.js (91,792 bytes)
$b = 'LyoqCiAqIENvbW1hbmRlciBBSSBMYWIg4oCUIFdlYiBVSSBDb250cm9sbGVyIHYzCiAqIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogKgogKiB2MyBhZGRzOgogKiAgIC0gVVJMIGltcG9ydCAoQXJjaGlkZWt0L0VESFJFQykg4oCUIHBhc3RlIGEgVVJMIHRvIGltcG9ydCBhIGRlY2sKICogICAtIENvbW1hbmRlciBtZXRhIHBpY2tlciDigJQgYnJvd3NlL3NlYXJjaCAxNSBidWlsdC1pbiBjb21tYW5kZXJzLCBvbmUtY2xpY2sgRURIUkVDIGZldGNoCiAqICAgLSBUZXh0IGltcG9ydCBtb2RhbCDigJQgcGFzdGUgYSBjYXJkIGxpc3QgZGlyZWN0bHkKICogICAtIFNvdXJjZSBiYWRnZXMgb24gcmVzdWx0IGNhcmRzIOKAlCBzaG93cyB3aGVyZSBlYWNoIGRlY2sgY2FtZSBmcm9tCiAqICAgLSBJbXBvcnRlZCBkZWNrIGluZm8gaW4gZGVjayBzZWxlY3RvcnMKICoKICogRW5kcG9pbnRzIGNvbnN1bWVkOgogKiAgIEdFVCAgL2FwaS9sYWIvZGVja3MgICAgICAgICAgICAgIOKAlCBMaXN0IGF2YWlsYWJsZSBDb21tYW5kZXIgZGVja3MKICogICBQT1NUIC9hcGkvbGFiL3N0YXJ0ICAgICAgICAgICAgICDigJQgU3RhcnQgYSBiYXRjaCBydW4KICogICBHRVQgIC9hcGkvbGFiL3N0YXR1cyAgICAgICAgICAgICDigJQgUG9sbCBwcm9ncmVzcwogKiAgIEdFVCAgL2FwaS9sYWIvcmVzdWx0ICAgICAgICAgICAgIOKAlCBHZXQgY29tcGxldGVkIHJlc3VsdHMgSlNPTgogKiAgIEdFVCAgL2FwaS9sYWIvbG9nICAgICAgICAgICAgICAgIOKAlCBHZXQgbGl2ZSBsb2cgb3V0cHV0CiAqICAgR0VUICAvYXBpL2xhYi9oaXN0b3J5ICAgICAgICAgICAg4oCUIExpc3QgcGFzdCBiYXRjaCBydW5zCiAqICAgUE9TVCAvYXBpL2xhYi9pbXBvcnQvdXJsICAgICAgICAg4oCUIEltcG9ydCBkZWNrIGZyb20gQXJjaGlkZWt0L0VESFJFQyBVUkwKICogICBQT1NUIC9hcGkvbGFiL2ltcG9ydC90ZXh0ICAgICAgICDigJQgSW1wb3J0IGRlY2sgZnJvbSBjYXJkIGxpc3QgdGV4dAogKiAgIEdFVCAgL2FwaS9sYWIvbWV0YS9jb21tYW5kZXJzICAgIOKAlCBMaXN0IGF2YWlsYWJsZSBjb21tYW5kZXJzIGluIG1ldGEgbWFwcGluZwogKiAgIEdFVCAgL2FwaS9sYWIvbWV0YS9zZWFyY2ggICAgICAgIOKAlCBTZWFyY2ggY29tbWFuZGVycyBieSBuYW1lCiAqICAgUE9TVCAvYXBpL2xhYi9tZXRhL2ZldGNoICAgICAgICAg4oCUIEZldGNoIEVESFJFQyBhdmVyYWdlIGRlY2sgZm9yIGEgY29tbWFuZGVyCiAqLwoKY29uc3QgQWlMYWIgPSAoKCkgPT4gewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGxldCBpc1J1bm5pbmcgPSBmYWxzZTsKICAgIGxldCBzZWxlY3RlZERlY2tzID0gW251bGwsIG51bGwsIG51bGxdOwogICAgbGV0IGxhc3RSZXN1bHQgPSBudWxsOwogICAgbGV0IHBvbGxJbnRlcnZhbCA9IG51bGw7CiAgICBsZXQgbG9nSW50ZXJ2YWwgPSBudWxsOwogICAgbGV0IGJhY2tlbmRBdmFpbGFibGUgPSBmYWxzZTsKICAgIGxldCBhdmFpbGFibGVEZWNrcyA9IFtdOwogICAgbGV0IG1ldGFDb21tYW5kZXJzID0gW107CiAgICBsZXQgcHJlY29uRGVja3MgPSBbXTsgICAgICAgLy8gTG9hZGVkIGZyb20gL2FwaS9sYWIvcHJlY29ucwogICAgbGV0IGltcG9ydGVkRGVja01ldGEgPSB7fTsgIC8vIGRlY2tOYW1lIOKGkiB7c291cmNlLCBzb3VyY2VVcmwsIGNvbW1hbmRlciwgYXJjaGV0eXBlLCBjb2xvcklkZW50aXR5fQoKICAgIC8vIOKUgOKUgCBDb25maWd1cmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgY29uc3QgQVBJX0JBU0UgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luOwogICAgY29uc3QgUFJFU0VUX0dBTUVTID0gWzEwLCAxMDAsIDEwMDBdOwogICAgY29uc3QgUE9MTF9SQVRFX01TID0gNzUwOwogICAgY29uc3QgTE9HX1JBVEVfTVMgPSAxMDAwOwoKICAgIGNvbnN0IENPTE9S' +
'X01BUCA9IHsKICAgICAgICBXOiB7IGxhYmVsOiAnVycsIGJnOiAnI2Y5ZmFmNCcsIGNvbG9yOiAnIzNkMzkyOScgfSwKICAgICAgICBVOiB7IGxhYmVsOiAnVScsIGJnOiAnIzBlNjdhYicsIGNvbG9yOiAnI2ZmZicgfSwKICAgICAgICBCOiB7IGxhYmVsOiAnQicsIGJnOiAnIzJiMjQyNCcsIGNvbG9yOiAnI2NjYycgfSwKICAgICAgICBSOiB7IGxhYmVsOiAnUicsIGJnOiAnI2QzMjAyYScsIGNvbG9yOiAnI2ZmZicgfSwKICAgICAgICBHOiB7IGxhYmVsOiAnRycsIGJnOiAnIzAwNzMzZScsIGNvbG9yOiAnI2ZmZicgfSwKICAgIH07CgogICAgLy8g4pSA4pSAIEluaXRpYWxpemF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgcmVuZGVyUGFuZWwoKTsKICAgICAgICBhd2FpdCBkZXRlY3RCYWNrZW5kKCk7CiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICBsb2FkQXZhaWxhYmxlRGVja3MoKSwKICAgICAgICAgICAgbG9hZE1ldGFDb21tYW5kZXJzKCksCiAgICAgICAgICAgIGxvYWRQcmVjb25zKCksCiAgICAgICAgXSk7CiAgICAgICAgYmluZEV2ZW50cygpOwogICAgICAgIGNvbnNvbGUubG9nKCdbQUkgTGFiXSB2MyBJbml0aWFsaXplZCDigJQgYmFja2VuZDonLCBiYWNrZW5kQXZhaWxhYmxlID8gJ2Nvbm5lY3RlZCcgOiAnZGVtbyBtb2RlJyk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0QmFja2VuZCgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2xhYi9kZWNrc2AsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDMwMDApIH0pOwogICAgICAgICAgICBiYWNrZW5kQXZhaWxhYmxlID0gcmVzLm9rOwogICAgICAgIH0gY2F0Y2ggewogICAgICAgICAgICBiYWNrZW5kQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZUJhY2tlbmRJbmRpY2F0b3IoKTsKICAgIH0KCiAgICAvLyDilIDilIAgUmVuZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIHJlbmRlclBhbmVsKCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhaS1sYWItY29udGFpbmVyJyk7CiAgICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjsKCiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGAKICAgICAgICA8ZGl2IGlkPSJhaS1sYWItcGFuZWwiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5Db21tYW5kZXIgQUkgTGFiPC9oMj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1iYWNrZW5kLXN0YXR1cyIgaWQ9ImxhYi1iYWNrZW5kLXN0YXR1cyI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXR1cy1kb3QiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdHVzLXRleHQiPkNoZWNraW5nLi4uPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cCBjbGFzcz0ibGFiLXN1YnRpdGxlIj5IZWFkbGVzcyAzLUFJIGJhdGNoIHNpbXVsYXRpb24g4oCUIHN0cmVzcy10ZXN0IHlvdXIgZGVja3MgYXQgc2NhbGU8L3A+CgogICAgICAgICAgICA8IS0tIHYzOiBJbXBvcnQgQmFyIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItaW1wb3J0LWJhciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItaW1wb3J0LWJhci1sYWJlbCI+SW1wb3J0IERlY2s8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1pbXBvcnQtYWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGFiLWltcG9ydC1hY3Rpb24tYnRuIiBvbmNsaWNrPSJBaUxhYi5zaG93VXJsSW1wb3J0KCkiIHRpdGxlPSJJbXBvcnQgZnJvbSBBcmNoaWRla3Qgb3IgRURIUkVDIFVSTCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJpbXBvcnQt' +
'aWNvbiI+8J+Ulzwvc3Bhbj4gVVJMIEltcG9ydAogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1pbXBvcnQtYWN0aW9uLWJ0biIgb25jbGljaz0iQWlMYWIuc2hvd01ldGFQaWNrZXIoKSIgdGl0bGU9IkJyb3dzZSBFREhSRUMgYXZlcmFnZSBkZWNrcyBmb3IgcG9wdWxhciBjb21tYW5kZXJzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImltcG9ydC1pY29uIj7wn5OKPC9zcGFuPiBDb21tYW5kZXIgTWV0YQogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1pbXBvcnQtYWN0aW9uLWJ0biIgb25jbGljaz0iQWlMYWIuc2hvd1RleHRJbXBvcnQoKSIgdGl0bGU9IlBhc3RlIGEgY2FyZCBsaXN0IGRpcmVjdGx5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImltcG9ydC1pY29uIj7wn5OLPC9zcGFuPiBUZXh0IEltcG9ydAogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1pbXBvcnQtYWN0aW9uLWJ0biBsYWItcHJlY29uLWJ0biIgb25jbGljaz0iQWlMYWIuc2hvd1ByZWNvblBpY2tlcigpIiB0aXRsZT0iQnJvd3NlIGFuZCBsb2FkIG9mZmljaWFsIENvbW1hbmRlciBwcmVjb24gZGVja3MiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iaW1wb3J0LWljb24iPvCfjrQ8L3NwYW4+IFByZWNvbiBEZWNrcwogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSB2MzogVVJMIEltcG9ydCBQYW5lbCAoaGlkZGVuIGJ5IGRlZmF1bHQpIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItdXJsLWltcG9ydCIgaWQ9ImxhYi11cmwtaW1wb3J0Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi11cmwtaW1wb3J0LWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+SW1wb3J0IGZyb20gVVJMPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1wYW5lbC1jbG9zZSIgb25jbGljaz0iQWlMYWIuaGlkZVVybEltcG9ydCgpIj7inJU8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXVybC1pbXBvcnQtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJsYWItaW1wb3J0LXVybC1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlBhc3RlIEFyY2hpZGVrdCBvciBFREhSRUMgVVJMIChlLmcuIGh0dHBzOi8vYXJjaGlkZWt0LmNvbS9kZWNrcy8xMjM0NSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi11cmwtaW1wb3J0LWJ0biIgaWQ9ImxhYi11cmwtaW1wb3J0LWJ0biIgb25jbGljaz0iQWlMYWIuaW1wb3J0RnJvbVVybCgpIj4KICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1pbXBvcnQtaGludCI+CiAgICAgICAgICAgICAgICAgICAgU3VwcG9ydGVkOiA8c3Ryb25nPmFyY2hpZGVrdC5jb20vZGVja3MvLi4uPC9zdHJvbmc+IMK3IDxzdHJvbmc+ZWRocmVjLmNvbS9hdmVyYWdlLWRlY2tzLy4uLjwvc3Ryb25nPiDCtyA8c3Ryb25nPmVkaHJlYy5jb20vY29tbWFuZGVycy8uLi48L3N0cm9uZz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWltcG9ydC1zdGF0dXMiIGlkPSJsYWItdXJsLWltcG9ydC1zdGF0dXMiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gRGVjayBTZWxlY3Rpb24gLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1kZWNrLWdyaWQiPgogICAgICAgICAgICAgICAgJHtbMCwgMSwgMl0ubWFwKGkgPT4gYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWRlY2stc2xvdCIgaWQ9ImxhYi1zbG90LSR7aX0iIGRhdGEtc2VhdD0iJHtpfSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VhdC1sYWJl' +
'bCI+U2VhdCAke2kgKyAxfTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImxhYi1kZWNrLXNlbGVjdC0ke2l9IiBvbmNoYW5nZT0iQWlMYWIuc2VsZWN0RGVjaygke2l9LCB0aGlzLnZhbHVlKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+4oCUIFNlbGVjdCBEZWNrIOKAlDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbW1hbmRlci1uYW1lIiBpZD0ibGFiLWNvbW1hbmRlci0ke2l9Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItZGVjay1zb3VyY2UtYmFkZ2UiIGlkPSJsYWItc291cmNlLWJhZGdlLSR7aX0iPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBgKS5qb2luKCcnKX0KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIENvbnRyb2xzIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItY29udHJvbHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWNvbnRyb2wtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5HYW1lczo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJsYWItZ2FtZS1jb3VudCIgdmFsdWU9IjEwMCIgbWluPSIxIiBtYXg9IjEwMDAwIiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1wcmVzZXQtYnRucyI+CiAgICAgICAgICAgICAgICAgICAgICAgICR7UFJFU0VUX0dBTUVTLm1hcChuID0+IGAKICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGFiLXByZXNldC1idG4gJHtuID09PSAxMDAgPyAnYWN0aXZlJyA6ICcnfSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJBaUxhYi5zZXRHYW1lQ291bnQoJHtufSkiPiR7bn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgYCkuam9pbignJyl9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jb250cm9sLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+VGhyZWFkczo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImxhYi10aHJlYWRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMSI+MTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyIj4yPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQiIHNlbGVjdGVkPjQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOCI+ODwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItY29udHJvbC1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNlZWQ6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImxhYi1zZWVkIiBwbGFjZWhvbGRlcj0iUmFuZG9tIiBzdHlsZT0id2lkdGg6MTAwcHgiIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jb250cm9sLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+RW5naW5lOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ibGFiLWVuZ2luZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImphdmEiIHNlbGVjdGVkPkZvcmdlIEhldXJpc3RpYzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJkZWVwc2VlayI+RGVlcFNlZWsgTExNPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1ydW4tYnRuIiBpZD0ibGFiLXJ1bi1idG4iIG9uY2xpY2s9IkFpTGFiLnN0YXJ0QmF0Y2goKSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InJ1bi1pY29uIj7ilrY8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNwaW5uZXIiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3Bh' +
'biBjbGFzcz0icnVuLXRleHQiPlJ1biBBSSBTaW1zPC9zcGFuPgogICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXByb2dyZXNzIiBpZD0ibGFiLXByb2dyZXNzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1wcm9ncmVzcy1iYXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1wcm9ncmVzcy1maWxsIiBpZD0ibGFiLXByb2dyZXNzLWZpbGwiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItcHJvZ3Jlc3MtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImxhYi1wcm9ncmVzcy1jb3VudCI+MCAvIDAgZ2FtZXM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImxhYi1wcm9ncmVzcy1ldGEiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gTGl2ZSBMb2cgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1sb2ciIGlkPSJsYWItbG9nIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1sb2ctaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj5MaXZlIE91dHB1dDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYWItbG9nLXRvZ2dsZSIgaWQ9ImxhYi1sb2ctdG9nZ2xlIiBvbmNsaWNrPSJBaUxhYi50b2dnbGVMb2coKSI+4pa8PC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImxhYi1sb2ctY29udGVudCIgaWQ9ImxhYi1sb2ctY29udGVudCI+PC9wcmU+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBSZXN1bHRzIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItcmVzdWx0cyIgaWQ9ImxhYi1yZXN1bHRzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1yZXN1bHRzLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgzPlJlc3VsdHM8L2gzPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1yZXN1bHRzLWFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYWItZXhwb3J0LWJ0biIgb25jbGljaz0iQWlMYWIuZXhwb3J0SnNvbigpIj5FeHBvcnQgSlNPTjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYWItaGlzdG9yeS1idG4iIG9uY2xpY2s9IkFpTGFiLnNob3dIaXN0b3J5KCkiPkhpc3Rvcnk8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXN0YXRzLWNhcmRzIiBpZD0ibGFiLXN0YXRzLWNhcmRzIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1nbG9iYWwtc3RhdHMiIGlkPSJsYWItZ2xvYmFsLXN0YXRzIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8IS0tIEVuaGFuY2VkIFJlc3VsdHMgU2VjdGlvbnMgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItc2VjdGlvbi1kaXZpZGVyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8IS0tIFRhYiBOYXZpZ2F0aW9uIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXJlc3VsdHMtdGFicyIgaWQ9ImxhYi1yZXN1bHRzLXRhYnMiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi10YWIgYWN0aXZlIiBkYXRhLXRhYj0idGFiLWNoYXJ0cyIgb25jbGljaz0iQWlMYWIuc3dpdGNoVGFiKCd0YWItY2hhcnRzJykiPkNoYXJ0czwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi10YWIiIGRhdGEtdGFiPSJ0YWItaDJoIiBvbmNsaWNrPSJBaUxhYi5zd2l0Y2hUYWIoJ3RhYi1oMmgnKSI+SGVhZC10by1IZWFkPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGFiLXRhYiIgZGF0YS10YWI9InRhYi1jb21iYXQiIG9uY2xpY2s9IkFpTGFiLnN3aXRjaFRhYigndGFiLWNvbWJhdCcpIj5Db21iYXQgU3RhdHM8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYWItdGFiIiBkYXRhLXRhYj0idGFiLWdhbWVsb2ciIG9uY2xpY2s9IkFpTGFiLnN3aXRjaFRh' +
'YigndGFiLWdhbWVsb2cnKSI+R2FtZSBMb2c8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gVGFiOiBDaGFydHMgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItdGFiLXBhbmVsIGFjdGl2ZSIgaWQ9InRhYi1jaGFydHMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jaGFydHMtZ3JpZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jaGFydC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PldpbiBSYXRlIENvbXBhcmlzb248L2g0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNhbnZhcyBpZD0ibGFiLWNoYXJ0LXdpbnJhdGUiIHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jaGFydC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PldpbiBDb25kaXRpb25zPC9oND4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXMgaWQ9ImxhYi1jaGFydC13aW5jb25kIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCI+PC9jYW52YXM+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItY2hhcnQtYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND5UdXJuIERpc3RyaWJ1dGlvbjwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJsYWItY2hhcnQtdHVybnMiIHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jaGFydC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PldpbiBSYXRlIE92ZXIgVGltZTwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJsYWItY2hhcnQtd2ludHJlbmQiIHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8IS0tIFRhYjogSGVhZC10by1IZWFkIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXRhYi1wYW5lbCIgaWQ9InRhYi1oMmgiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImxhYi1oMmgtbWF0cml4Ij48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gVGFiOiBDb21iYXQgU3RhdHMgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItdGFiLXBhbmVsIiBpZD0idGFiLWNvbWJhdCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0ibGFiLWNvbWJhdC1zdGF0cyI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8IS0tIFRhYjogR2FtZSBMb2cgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItdGFiLXBhbmVsIiBpZD0idGFiLWdhbWVsb2ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1nYW1lbG9nLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJsYWItZ2FtZWxvZy1maWx0ZXIiIHBsYWNlaG9sZGVyPSJGaWx0ZXIgYnkgZGVjayBuYW1lLCB3aW4gY29uZGl0aW9uLi4uIiBjbGFzcz0ibGFiLWdhbWVsb2ctc2VhcmNoIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1nYW1lbG9nLWNvdW50IiBpZD0ibGFiLWdhbWVsb2ctY291bnQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItZ2FtZWxvZy13cmFwcGVyIiBpZD0ibGFiLWdhbWVsb2ctd3JhcHBlciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIEhpc3RvcnkgTW9kYWwgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1tb2RhbC1vdmVybGF5IiBpZD0ibGFiLWhpc3RvcnktbW9kYWwiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLW1vZGFsLWNvbnRlbnQiPgogICAgICAg' +
'ICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1tb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDM+QmF0Y2ggSGlzdG9yeTwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1tb2RhbC1jbG9zZSIgb25jbGljaz0iQWlMYWIuY2xvc2VIaXN0b3J5KCkiPuKclTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1oaXN0b3J5LWxpc3QiIGlkPSJsYWItaGlzdG9yeS1saXN0Ij5Mb2FkaW5nLi4uPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIHYzOiBDb21tYW5kZXIgTWV0YSBQaWNrZXIgTW9kYWwgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1tb2RhbC1vdmVybGF5IiBpZD0ibGFiLW1ldGEtbW9kYWwiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLW1vZGFsLWNvbnRlbnQgbGFiLW1vZGFsLXdpZGUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1tb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDM+Q29tbWFuZGVyIE1ldGEg4oCUIEVESFJFQyBBdmVyYWdlIERlY2tzPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGFiLW1vZGFsLWNsb3NlIiBvbmNsaWNrPSJBaUxhYi5jbG9zZU1ldGFQaWNrZXIoKSI+4pyVPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLW1ldGEtc2VhcmNoLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ibGFiLW1ldGEtc2VhcmNoIiBwbGFjZWhvbGRlcj0iU2VhcmNoIGNvbW1hbmRlcnMuLi4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PSJBaUxhYi5maWx0ZXJNZXRhQ29tbWFuZGVycyh0aGlzLnZhbHVlKSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLW1ldGEtbGlzdCIgaWQ9ImxhYi1tZXRhLWxpc3QiPkxvYWRpbmcuLi48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItaW1wb3J0LXN0YXR1cyIgaWQ9ImxhYi1tZXRhLWltcG9ydC1zdGF0dXMiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSB2MzogUHJlY29uIFBpY2tlciBNb2RhbCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLW1vZGFsLW92ZXJsYXkiIGlkPSJsYWItcHJlY29uLW1vZGFsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1tb2RhbC1jb250ZW50IGxhYi1tb2RhbC13aWRlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItbW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPlByZWNvbiBEZWNrcyDigJQgT2ZmaWNpYWwgQ29tbWFuZGVyIFByZWNvbnM8L2gzPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYWItbW9kYWwtY2xvc2UiIG9uY2xpY2s9IkFpTGFiLmNsb3NlUHJlY29uUGlja2VyKCkiPuKclTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1wcmVjb24tY29udHJvbHMiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImxhYi1wcmVjb24tc2VhcmNoIiBwbGFjZWhvbGRlcj0iU2VhcmNoIHByZWNvbnMuLi4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PSJBaUxhYi5maWx0ZXJQcmVjb25zKHRoaXMudmFsdWUpIiBhdXRvY29tcGxldGU9Im9mZiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibGFiLXByZWNvbi1pbnN0YWxsLWFsbC1idG4iIG9uY2xpY2s9IkFpTGFiLmluc3RhbGxBbGxQcmVjb25zKCkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Ikluc3RhbGwgYWxsIHByZWNvbiBkZWNrcyB0byBGb3JnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIEFsbAogICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAg' +
'ICAgICAgICA8ZGl2IGNsYXNzPSJsYWItcHJlY29uLWdyaWQiIGlkPSJsYWItcHJlY29uLWdyaWQiPkxvYWRpbmcuLi48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItaW1wb3J0LXN0YXR1cyIgaWQ9ImxhYi1wcmVjb24tc3RhdHVzIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gdjM6IFRleHQgSW1wb3J0IE1vZGFsIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItbW9kYWwtb3ZlcmxheSIgaWQ9ImxhYi10ZXh0LW1vZGFsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1tb2RhbC1jb250ZW50IGxhYi1tb2RhbC13aWRlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItbW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkltcG9ydCBmcm9tIENhcmQgTGlzdDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1tb2RhbC1jbG9zZSIgb25jbGljaz0iQWlMYWIuY2xvc2VUZXh0SW1wb3J0KCkiPuKclTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi10ZXh0LWltcG9ydC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXRleHQtaW1wb3J0LWhpbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzdGUgYSBjYXJkIGxpc3QgKG9uZSBjYXJkIHBlciBsaW5lKS4gVXNlIDxjb2RlPjEgQ2FyZCBOYW1lPC9jb2RlPiBvciBqdXN0IDxjb2RlPkNhcmQgTmFtZTwvY29kZT4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgYSA8Y29kZT5bQ29tbWFuZGVyXTwvY29kZT4gc2VjdGlvbiBoZWFkZXIgYWJvdmUgdGhlIGNvbW1hbmRlciwgb3IgZW50ZXIgaXQgYmVsb3cuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9ImxhYi10ZXh0LWltcG9ydC1hcmVhIiByb3dzPSIxMiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJbQ29tbWFuZGVyXQoxIEVkZ2FyIE1hcmtvdgoKW01haW5dCjEgU29sIFJpbmcKMSBBcmNhbmUgU2lnbmV0CjEgQ29tbWFuZCBUb3dlcgouLi4iPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi10ZXh0LWltcG9ydC1vcHRpb25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Db21tYW5kZXIgb3ZlcnJpZGU6PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0ibGFiLXRleHQtY29tbWFuZGVyLW92ZXJyaWRlIiBwbGFjZWhvbGRlcj0iKGF1dG8tZGV0ZWN0IGZyb20gbGlzdCkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYWItaW1wb3J0LXN1Ym1pdC1idG4iIG9uY2xpY2s9IkFpTGFiLmltcG9ydEZyb21UZXh0KCkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0IERlY2sKICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWltcG9ydC1zdGF0dXMiIGlkPSJsYWItdGV4dC1pbXBvcnQtc3RhdHVzIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICBgOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUJhY2tlbmRJbmRpY2F0b3IoKSB7CiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWJhY2tlbmQtc3RhdHVzJyk7CiAgICAgICAgaWYgKCFlbCkgcmV0dXJuOwogICAgICAgIGlmIChiYWNrZW5kQXZhaWxhYmxlKSB7CiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2Nvbm5lY3RlZCcpOwogICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdkaXNjb25uZWN0ZWQnKTsKICAgICAgICAgICAgZWwucXVlcnlTZWxlY3RvcignLnN0YXR1cy10ZXh0JykudGV4dENvbnRlbnQgPSAnQmFja2VuZCBDb25uZWN0ZWQnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2Rpc2Nvbm5lY3RlZCcpOwogICAgICAgICAgICBlbC5jbGFz' +
'c0xpc3QucmVtb3ZlKCdjb25uZWN0ZWQnKTsKICAgICAgICAgICAgZWwucXVlcnlTZWxlY3RvcignLnN0YXR1cy10ZXh0JykudGV4dENvbnRlbnQgPSAnRGVtbyBNb2RlJzsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIERlY2sgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBhc3luYyBmdW5jdGlvbiBsb2FkQXZhaWxhYmxlRGVja3MoKSB7CiAgICAgICAgbGV0IGRlY2tzID0gW107CgogICAgICAgIGlmIChiYWNrZW5kQXZhaWxhYmxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2xhYi9kZWNrc2ApOwogICAgICAgICAgICAgICAgaWYgKHJlcy5vaykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgICAgIGRlY2tzID0gKGRhdGEuZGVja3MgfHwgW10pLm1hcChkID0+ICh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGQubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyOiBkLmNvbW1hbmRlciB8fCBkLm5hbWUucmVwbGFjZSgvXy9nLCAnICcpLAogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tBSSBMYWJdIEZhaWxlZCB0byBsb2FkIGRlY2tzIGZyb20gYmFja2VuZDonLCBlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBGYWxsYmFjayB0byBzYW1wbGUgZGVja3MgaWYgYmFja2VuZCByZXR1cm5lZCBub3RoaW5nCiAgICAgICAgaWYgKGRlY2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBkZWNrcyA9IGdldFNhbXBsZURlY2tzKCk7CiAgICAgICAgfQoKICAgICAgICBhdmFpbGFibGVEZWNrcyA9IGRlY2tzOwogICAgICAgIHJlZnJlc2hEZWNrU2VsZWN0b3JzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVmcmVzaERlY2tTZWxlY3RvcnMoKSB7CiAgICAgICAgZm9yIChsZXQgc2VhdCA9IDA7IHNlYXQgPCAzOyBzZWF0KyspIHsKICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGxhYi1kZWNrLXNlbGVjdC0ke3NlYXR9YCk7CiAgICAgICAgICAgIGlmICghc2VsZWN0KSBjb250aW51ZTsKICAgICAgICAgICAgY29uc3QgcHJldiA9IHNlbGVjdC52YWx1ZTsKICAgICAgICAgICAgc2VsZWN0LmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPSIiPuKAlCBTZWxlY3QgRGVjayDigJQ8L29wdGlvbj4nOwoKICAgICAgICAgICAgLy8gR3JvdXA6IGltcG9ydGVkIGRlY2tzIGZpcnN0CiAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkID0gYXZhaWxhYmxlRGVja3MuZmlsdGVyKGQgPT4gaW1wb3J0ZWREZWNrTWV0YVtkLm5hbWVdKTsKICAgICAgICAgICAgY29uc3QgbG9jYWwgPSBhdmFpbGFibGVEZWNrcy5maWx0ZXIoZCA9PiAhaW1wb3J0ZWREZWNrTWV0YVtkLm5hbWVdKTsKCiAgICAgICAgICAgIGlmIChpbXBvcnRlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGdyb3VwJyk7CiAgICAgICAgICAgICAgICBncm91cC5sYWJlbCA9ICdJbXBvcnRlZCBEZWNrcyc7CiAgICAgICAgICAgICAgICBpbXBvcnRlZC5mb3JFYWNoKGRlY2sgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICAgICAgICAgIG9wdC52YWx1ZSA9IGRlY2submFtZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gaW1wb3J0ZWREZWNrTWV0YVtkZWNrLm5hbWVdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNyY1RhZyA9IG1ldGEgPyBgIFske21ldGEuc291cmNlfV1gIDogJyc7CiAgICAgICAgICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gZGVjay5uYW1lICsgc3JjVGFnOwogICAgICAgICAgICAgICAgICAgIG9wdC5kYXRhc2V0LmNvbW1hbmRlciA9IGRlY2suY29tbWFuZGVyIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIGdyb3VwLmFwcGVuZENoaWxkKG9wdCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAg' +
'ICAgICAgICAgIHNlbGVjdC5hcHBlbmRDaGlsZChncm91cCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChsb2NhbC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGdyb3VwJyk7CiAgICAgICAgICAgICAgICBncm91cC5sYWJlbCA9ICdMb2NhbCBEZWNrcyc7CiAgICAgICAgICAgICAgICBsb2NhbC5mb3JFYWNoKGRlY2sgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICAgICAgICAgIG9wdC52YWx1ZSA9IGRlY2submFtZTsKICAgICAgICAgICAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBkZWNrLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgb3B0LmRhdGFzZXQuY29tbWFuZGVyID0gZGVjay5jb21tYW5kZXIgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYXBwZW5kQ2hpbGQob3B0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKGdyb3VwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzZWxlY3Rpb24KICAgICAgICAgICAgaWYgKHByZXYpIHsKICAgICAgICAgICAgICAgIHNlbGVjdC52YWx1ZSA9IHByZXY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2FtcGxlRGVja3MoKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgeyBuYW1lOiAnQXRyYXhhX1N1cGVyZnJpZW5kcycsIGNvbW1hbmRlcjogIkF0cmF4YSwgUHJhZXRvcnMnIFZvaWNlIiB9LAogICAgICAgICAgICB7IG5hbWU6ICdLb3J2b2xkX0FyaXN0b2NyYXRzJywgY29tbWFuZGVyOiAnS29ydm9sZCwgRmFlLUN1cnNlZCBLaW5nJyB9LAogICAgICAgICAgICB7IG5hbWU6ICdNdWxkcm90aGFfVmFsdWUnLCBjb21tYW5kZXI6ICdNdWxkcm90aGEsIHRoZSBHcmF2ZXRpZGUnIH0sCiAgICAgICAgICAgIHsgbmFtZTogJ0FuZ2VscycsIGNvbW1hbmRlcjogJ0FuZ2VscycgfSwKICAgICAgICAgICAgeyBuYW1lOiAnRWRnYXIgTWFya292JywgY29tbWFuZGVyOiAnRWRnYXIgTWFya292JyB9LAogICAgICAgICAgICB7IG5hbWU6ICdHcmltZ3JpbicsIGNvbW1hbmRlcjogJ0dyaW1ncmluLCBDb3Jwc2UtQm9ybicgfSwKICAgICAgICAgICAgeyBuYW1lOiAnWHlyaXMnLCBjb21tYW5kZXI6ICdYeXJpcywgdGhlIFdyaXRoaW5nIFN0b3JtJyB9LAogICAgICAgICAgICB7IG5hbWU6ICdDb250cm9sLVRhbHJhbmQnLCBjb21tYW5kZXI6ICdUYWxyYW5kLCBTa3kgU3VtbW9uZXInIH0sCiAgICAgICAgICAgIHsgbmFtZTogJ0FzaGxpbmcgMi4wJywgY29tbWFuZGVyOiAnQXNobGluZyB0aGUgUGlsZ3JpbScgfSwKICAgICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdERlY2soc2VhdCwgZGVja05hbWUpIHsKICAgICAgICBzZWxlY3RlZERlY2tzW3NlYXRdID0gZGVja05hbWUgfHwgbnVsbDsKCiAgICAgICAgY29uc3Qgc2xvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBsYWItc2xvdC0ke3NlYXR9YCk7CiAgICAgICAgY29uc3QgY21kRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbGFiLWNvbW1hbmRlci0ke3NlYXR9YCk7CiAgICAgICAgY29uc3Qgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGxhYi1kZWNrLXNlbGVjdC0ke3NlYXR9YCk7CiAgICAgICAgY29uc3QgYmFkZ2VFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBsYWItc291cmNlLWJhZGdlLSR7c2VhdH1gKTsKCiAgICAgICAgaWYgKGRlY2tOYW1lKSB7CiAgICAgICAgICAgIHNsb3QuY2xhc3NMaXN0LmFkZCgnZmlsbGVkJyk7CiAgICAgICAgICAgIGNvbnN0IG9wdCA9IHNlbGVjdC5zZWxlY3RlZE9wdGlvbnNbMF07CiAgICAgICAgICAgIGNtZEVsLnRleHRDb250ZW50ID0gb3B0Py5kYXRhc2V0LmNvbW1hbmRlciB8fCAnJzsKCiAgICAgICAgICAgIC8vIFNob3cgc291cmNlIGJhZGdlIGlmIGltcG9ydGVkCiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBpbXBvcnRlZERlY2tNZXRhW2RlY2tOYW1lXTsKICAgICAgICAgICAgaWYgKG1ldGEgJiYgYmFkZ2VFbCkgewogICAgICAgICAgICAgICAgYmFkZ2VFbC5pbm5lckhUTUwgPSByZW5kZXJTb3VyY2VCYWRnZShtZXRhLnNvdXJjZSwgbWV0YS5zb3VyY2VVcmwpOwogICAgICAgICAgICAgICAgYmFkZ2VFbC5zdHlsZS5k' +
'aXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgfSBlbHNlIGlmIChiYWRnZUVsKSB7CiAgICAgICAgICAgICAgICBiYWRnZUVsLmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICAgICAgYmFkZ2VFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2xvdC5jbGFzc0xpc3QucmVtb3ZlKCdmaWxsZWQnKTsKICAgICAgICAgICAgY21kRWwudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgaWYgKGJhZGdlRWwpIHsKICAgICAgICAgICAgICAgIGJhZGdlRWwuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgICAgICBiYWRnZUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyU291cmNlQmFkZ2Uoc291cmNlLCBzb3VyY2VVcmwpIHsKICAgICAgICBjb25zdCBzb3VyY2VMYWJlbHMgPSB7CiAgICAgICAgICAgICdBcmNoaWRla3QnOiB7IGljb246ICfwn4+X77iPJywgY2xzOiAnYmFkZ2UtYXJjaGlkZWt0JyB9LAogICAgICAgICAgICAnRURIUkVDIEF2ZXJhZ2UnOiB7IGljb246ICfwn5OKJywgY2xzOiAnYmFkZ2UtZWRocmVjJyB9LAogICAgICAgICAgICAnVGV4dCBJbXBvcnQnOiB7IGljb246ICfwn5OLJywgY2xzOiAnYmFkZ2UtdGV4dCcgfSwKICAgICAgICAgICAgJ1ByZWNvbic6IHsgaWNvbjogJ/CfjrQnLCBjbHM6ICdiYWRnZS1wcmVjb24nIH0sCiAgICAgICAgfTsKICAgICAgICBjb25zdCBpbmZvID0gc291cmNlTGFiZWxzW3NvdXJjZV0gfHwgeyBpY29uOiAn8J+TpicsIGNsczogJ2JhZGdlLWRlZmF1bHQnIH07CiAgICAgICAgY29uc3QgbGlua0h0bWwgPSBzb3VyY2VVcmwKICAgICAgICAgICAgPyBgPGEgaHJlZj0iJHtzb3VyY2VVcmx9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciIgY2xhc3M9InNvdXJjZS1saW5rIj4ke3NvdXJjZX08L2E+YAogICAgICAgICAgICA6IGA8c3Bhbj4ke3NvdXJjZX08L3NwYW4+YDsKICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPSJsYWItc291cmNlLWJhZGdlICR7aW5mby5jbHN9Ij4ke2luZm8uaWNvbn0gJHtsaW5rSHRtbH08L3NwYW4+YDsKICAgIH0KCiAgICAvLyDilIDilIAgdjM6IFVSTCBJbXBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gc2hvd1VybEltcG9ydCgpIHsKICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItdXJsLWltcG9ydCcpOwogICAgICAgIGlmIChwYW5lbCkgewogICAgICAgICAgICBwYW5lbC5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTsKICAgICAgICAgICAgaWYgKHBhbmVsLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItaW1wb3J0LXVybC1pbnB1dCcpPy5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhpZGVVcmxJbXBvcnQoKSB7CiAgICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXVybC1pbXBvcnQnKTsKICAgICAgICBpZiAocGFuZWwpIHBhbmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZyb21VcmwoKSB7CiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWltcG9ydC11cmwtaW5wdXQnKTsKICAgICAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItdXJsLWltcG9ydC1zdGF0dXMnKTsKICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXVybC1pbXBvcnQtYnRuJyk7CiAgICAgICAgY29uc3QgdXJsID0gaW5wdXQ/LnZhbHVlLnRyaW0oKTsKCiAgICAgICAgaWYgKCF1cmwpIHsKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwgJ1BsZWFzZSBlbnRlciBhIFVSTC4nLCAnZXJyb3InKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFiYWNrZW5kQXZhaWxhYmxlKSB7CiAgICAgICAgICAgIHNob3dJbXBvcnRTdGF0dXMoc3RhdHVzRWwsICdVUkwgaW1wb3J0IHJlcXVpcmVzIGEgcnVu' +
'bmluZyBiYWNrZW5kLicsICdlcnJvcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdJbXBvcnRpbmcuLi4nOwogICAgICAgIHNob3dJbXBvcnRTdGF0dXMoc3RhdHVzRWwsICdGZXRjaGluZyBkZWNrIGZyb20gVVJMLi4uJywgJ2xvYWRpbmcnKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9sYWIvaW1wb3J0L3VybGAsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVybCB9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmRldGFpbCB8fCAnSW1wb3J0IGZhaWxlZCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBUcmFjayBpbXBvcnRlZCBkZWNrIG1ldGFkYXRhCiAgICAgICAgICAgIGltcG9ydGVkRGVja01ldGFbZGF0YS5kY2tGaWxlXSA9IHsKICAgICAgICAgICAgICAgIHNvdXJjZTogZGF0YS5zb3VyY2UsCiAgICAgICAgICAgICAgICBzb3VyY2VVcmw6IGRhdGEuc291cmNlVXJsLAogICAgICAgICAgICAgICAgY29tbWFuZGVyOiBkYXRhLmNvbW1hbmRlciwKICAgICAgICAgICAgICAgIGFyY2hldHlwZTogZGF0YS5hcmNoZXR5cGUsCiAgICAgICAgICAgICAgICBjb2xvcklkZW50aXR5OiBkYXRhLmNvbG9ySWRlbnRpdHkgfHwgW10sCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAvLyBBZGQgdG8gYXZhaWxhYmxlIGRlY2tzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVEZWNrcy5maW5kKGQgPT4gZC5uYW1lID09PSBkYXRhLmRja0ZpbGUpKSB7CiAgICAgICAgICAgICAgICBhdmFpbGFibGVEZWNrcy51bnNoaWZ0KHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBkYXRhLmRja0ZpbGUsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyOiBkYXRhLmNvbW1hbmRlciwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmVmcmVzaERlY2tTZWxlY3RvcnMoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwKICAgICAgICAgICAgICAgIGBJbXBvcnRlZCAiJHtkYXRhLmRlY2tOYW1lfSIgKCR7ZGF0YS50b3RhbENhcmRzfSBjYXJkcykgZnJvbSAke2RhdGEuc291cmNlfWAsCiAgICAgICAgICAgICAgICAnc3VjY2VzcycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJzsKCiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHNob3dJbXBvcnRTdGF0dXMoc3RhdHVzRWwsIGBFcnJvcjogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ0ltcG9ydCc7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCB2MzogQ29tbWFuZGVyIE1ldGEgUGlja2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRNZXRhQ29tbWFuZGVycygpIHsKICAgICAgICBpZiAoIWJhY2tlbmRBdmFpbGFibGUpIHJldHVybjsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2xhYi9tZXRhL2NvbW1hbmRlcnNgKTsKICAgICAgICAgICAgaWYgKHJlcy5vaykgewogICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgICAgICBtZXRhQ29tbWFuZGVycyA9IGRhdGEuY29tbWFuZGVycyB8fCBbXTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tBSSBMYWJdIEZhaWxlZCB0byBsb2FkIG1ldGEgY29tbWFuZGVyczonLCBlcnIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzaG93TWV0YVBp' +
'Y2tlcigpIHsKICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItbWV0YS1tb2RhbCcpOwogICAgICAgIGlmIChtb2RhbCkgewogICAgICAgICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICAgICAgcmVuZGVyTWV0YUxpc3QobWV0YUNvbW1hbmRlcnMpOwogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLW1ldGEtc2VhcmNoJyk/LmZvY3VzKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNsb3NlTWV0YVBpY2tlcigpIHsKICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItbWV0YS1tb2RhbCcpOwogICAgICAgIGlmIChtb2RhbCkgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLW1ldGEtaW1wb3J0LXN0YXR1cycpOwogICAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwuaW5uZXJIVE1MID0gJyc7CiAgICB9CgogICAgZnVuY3Rpb24gZmlsdGVyTWV0YUNvbW1hbmRlcnMocXVlcnkpIHsKICAgICAgICBpZiAoIXF1ZXJ5KSB7CiAgICAgICAgICAgIHJlbmRlck1ldGFMaXN0KG1ldGFDb21tYW5kZXJzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBxID0gcXVlcnkudG9Mb3dlckNhc2UoKTsKICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IG1ldGFDb21tYW5kZXJzLmZpbHRlcihjID0+IGMubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTsKICAgICAgICByZW5kZXJNZXRhTGlzdChmaWx0ZXJlZCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyTWV0YUxpc3QoY29tbWFuZGVycykgewogICAgICAgIGNvbnN0IGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItbWV0YS1saXN0Jyk7CiAgICAgICAgaWYgKCFsaXN0RWwpIHJldHVybjsKCiAgICAgICAgaWYgKGNvbW1hbmRlcnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0ibGFiLW1ldGEtZW1wdHkiPk5vIGNvbW1hbmRlcnMgZm91bmQuPC9kaXY+JzsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbGlzdEVsLmlubmVySFRNTCA9IGNvbW1hbmRlcnMubWFwKGMgPT4gewogICAgICAgICAgICBjb25zdCBjb2xvcnMgPSAoYy5jb2xvcklkZW50aXR5IHx8IFtdKS5tYXAoY29sID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gQ09MT1JfTUFQW2NvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gY2kgPyBgPHNwYW4gY2xhc3M9Im1hbmEtcGlwIiBzdHlsZT0iYmFja2dyb3VuZDoke2NpLmJnfTtjb2xvcjoke2NpLmNvbG9yfSI+JHtjaS5sYWJlbH08L3NwYW4+YCA6ICcnOwogICAgICAgICAgICB9KS5qb2luKCcnKTsKCiAgICAgICAgICAgIGNvbnN0IGFyY2hCYWRnZSA9IGMuYXJjaGV0eXBlCiAgICAgICAgICAgICAgICA/IGA8c3BhbiBjbGFzcz0ibGFiLWFyY2gtYmFkZ2UgYXJjaC0ke2MuYXJjaGV0eXBlfSI+JHtjLmFyY2hldHlwZX08L3NwYW4+YAogICAgICAgICAgICAgICAgOiAnJzsKCiAgICAgICAgICAgIHJldHVybiBgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1tZXRhLWNhcmQiIG9uY2xpY2s9IkFpTGFiLmZldGNoTWV0YURlY2soJyR7ZXNjYXBlQXR0cihjLm5hbWUpfScpIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldGEtY2FyZC1sZWZ0Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRhLWNhcmQtbmFtZSI+JHtlc2NhcGVIdG1sKGMubmFtZSl9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWV0YS1jYXJkLWluZm8iPiR7Y29sb3JzfSAke2FyY2hCYWRnZX08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWV0YS1jYXJkLXJpZ2h0Ij4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJsYWItbWV0YS1mZXRjaC1idG4iIHRpdGxlPSJGZXRjaCBFREhSRUMgYXZlcmFnZSBkZWNrIj4KICAgICAgICAgICAgICAgICAgICAgICAgRmV0Y2ggRGVjawogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgfSkuam9pbignJyk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXRhRGVj' +
'ayhjb21tYW5kZXJOYW1lKSB7CiAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLW1ldGEtaW1wb3J0LXN0YXR1cycpOwoKICAgICAgICBpZiAoIWJhY2tlbmRBdmFpbGFibGUpIHsKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwgJ01ldGEgZmV0Y2ggcmVxdWlyZXMgYSBydW5uaW5nIGJhY2tlbmQuJywgJ2Vycm9yJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHNob3dJbXBvcnRTdGF0dXMoc3RhdHVzRWwsIGBGZXRjaGluZyBFREhSRUMgYXZlcmFnZSBkZWNrIGZvciAke2NvbW1hbmRlck5hbWV9Li4uYCwgJ2xvYWRpbmcnKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9sYWIvbWV0YS9mZXRjaGAsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmRlcjogY29tbWFuZGVyTmFtZSB9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmRldGFpbCB8fCAnRmV0Y2ggZmFpbGVkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGltcG9ydGVkRGVja01ldGFbZGF0YS5kY2tGaWxlXSA9IHsKICAgICAgICAgICAgICAgIHNvdXJjZTogJ0VESFJFQyBBdmVyYWdlJywKICAgICAgICAgICAgICAgIHNvdXJjZVVybDogZGF0YS5zb3VyY2VVcmwsCiAgICAgICAgICAgICAgICBjb21tYW5kZXI6IGRhdGEuY29tbWFuZGVyLAogICAgICAgICAgICAgICAgY29sb3JJZGVudGl0eTogZGF0YS5jb2xvcklkZW50aXR5IHx8IFtdLAogICAgICAgICAgICAgICAgc2FtcGxlU2l6ZTogZGF0YS5zYW1wbGVTaXplLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVEZWNrcy5maW5kKGQgPT4gZC5uYW1lID09PSBkYXRhLmRja0ZpbGUpKSB7CiAgICAgICAgICAgICAgICBhdmFpbGFibGVEZWNrcy51bnNoaWZ0KHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBkYXRhLmRja0ZpbGUsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyOiBkYXRhLmNvbW1hbmRlciwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmVmcmVzaERlY2tTZWxlY3RvcnMoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3Qgc2FtcGxlSW5mbyA9IGRhdGEuc2FtcGxlU2l6ZSA/IGAgKCR7ZGF0YS5zYW1wbGVTaXplfSBkZWNrcyBzYW1wbGVkKWAgOiAnJzsKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwKICAgICAgICAgICAgICAgIGBJbXBvcnRlZCAiJHtkYXRhLmRlY2tOYW1lfSIgKCR7ZGF0YS50b3RhbENhcmRzfSBjYXJkcykke3NhbXBsZUluZm99YCwKICAgICAgICAgICAgICAgICdzdWNjZXNzJwogICAgICAgICAgICApOwoKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwgYEVycm9yOiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgdjM6IFByZWNvbiBEZWNrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBhc3luYyBmdW5jdGlvbiBsb2FkUHJlY29ucygpIHsKICAgICAgICBpZiAoIWJhY2tlbmRBdmFpbGFibGUpIHJldHVybjsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2xhYi9wcmVjb25zYCk7CiAgICAgICAgICAgIGlmIChyZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgcHJlY29uRGVja3MgPSBkYXRhLnByZWNvbnMgfHwgW107CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdbQUkgTGFiXSBGYWlsZWQgdG8gbG9hZCBwcmVjb25zOicsIGVycik7CiAgICAgICAgfQogICAgfQoK' +
'ICAgIGZ1bmN0aW9uIHNob3dQcmVjb25QaWNrZXIoKSB7CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXByZWNvbi1tb2RhbCcpOwogICAgICAgIGlmIChtb2RhbCkgewogICAgICAgICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICAgICAgcmVuZGVyUHJlY29uR3JpZChwcmVjb25EZWNrcyk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItcHJlY29uLXNlYXJjaCcpPy5mb2N1cygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZVByZWNvblBpY2tlcigpIHsKICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItcHJlY29uLW1vZGFsJyk7CiAgICAgICAgaWYgKG1vZGFsKSBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItcHJlY29uLXN0YXR1cycpOwogICAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwuaW5uZXJIVE1MID0gJyc7CiAgICB9CgogICAgZnVuY3Rpb24gZmlsdGVyUHJlY29ucyhxdWVyeSkgewogICAgICAgIGlmICghcXVlcnkpIHsKICAgICAgICAgICAgcmVuZGVyUHJlY29uR3JpZChwcmVjb25EZWNrcyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBwcmVjb25EZWNrcy5maWx0ZXIocCA9PgogICAgICAgICAgICBwLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fAogICAgICAgICAgICBwLmNvbW1hbmRlci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8CiAgICAgICAgICAgIHAuc2V0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwKICAgICAgICAgICAgKHAudGhlbWUgJiYgcC50aGVtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKQogICAgICAgICk7CiAgICAgICAgcmVuZGVyUHJlY29uR3JpZChmaWx0ZXJlZCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyUHJlY29uR3JpZChwcmVjb25zKSB7CiAgICAgICAgY29uc3QgZ3JpZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1wcmVjb24tZ3JpZCcpOwogICAgICAgIGlmICghZ3JpZEVsKSByZXR1cm47CgogICAgICAgIGlmIChwcmVjb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBncmlkRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImxhYi1tZXRhLWVtcHR5Ij5ObyBwcmVjb24gZGVja3MgZm91bmQuPC9kaXY+JzsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZ3JpZEVsLmlubmVySFRNTCA9IHByZWNvbnMubWFwKHAgPT4gewogICAgICAgICAgICBjb25zdCBjb2xvcnMgPSAocC5jb2xvcnMgfHwgW10pLm1hcChjb2wgPT4gewogICAgICAgICAgICAgICAgaWYgKGNvbCA9PT0gJ0MnKSByZXR1cm4gJzxzcGFuIGNsYXNzPSJtYW5hLXBpcCIgc3R5bGU9ImJhY2tncm91bmQ6IzljOGU4Mjtjb2xvcjojZmZmIj5DPC9zcGFuPic7CiAgICAgICAgICAgICAgICBjb25zdCBjaSA9IENPTE9SX01BUFtjb2xdOwogICAgICAgICAgICAgICAgcmV0dXJuIGNpID8gYDxzcGFuIGNsYXNzPSJtYW5hLXBpcCIgc3R5bGU9ImJhY2tncm91bmQ6JHtjaS5iZ307Y29sb3I6JHtjaS5jb2xvcn0iPiR7Y2kubGFiZWx9PC9zcGFuPmAgOiAnJzsKICAgICAgICAgICAgfSkuam9pbignJyk7CgogICAgICAgICAgICBjb25zdCBpc0luc3RhbGxlZCA9IGF2YWlsYWJsZURlY2tzLnNvbWUoZCA9PgogICAgICAgICAgICAgICAgZC5uYW1lID09PSBwLmZpbGVOYW1lLnJlcGxhY2UoJy5kY2snLCAnJykgfHwgZC5uYW1lID09PSBwLm5hbWUucmVwbGFjZSgvIC9nLCAnXycpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnN0IGluc3RhbGxMYWJlbCA9IGlzSW5zdGFsbGVkID8gJ0luc3RhbGxlZCcgOiAnSW5zdGFsbCAmIFVzZSc7CiAgICAgICAgICAgIGNvbnN0IGluc3RhbGxDbGFzcyA9IGlzSW5zdGFsbGVkID8gJ2xhYi1wcmVjb24tY2FyZC1pbnN0YWxsZWQnIDogJyc7CgogICAgICAgICAgICByZXR1cm4gYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItcHJlY29uLWNhcmQgJHtpbnN0YWxsQ2xhc3N9IiBvbmNsaWNrPSJBaUxhYi5pbnN0YWxsUHJlY29uKCcke2VzY2FwZUF0dHIocC5maWxlTmFtZSl9JykiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFz' +
'cz0icHJlY29uLWNhcmQtY29sb3JzIj4ke2NvbG9yc308L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByZWNvbi1jYXJkLW5hbWUiPiR7ZXNjYXBlSHRtbChwLm5hbWUpfTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJlY29uLWNhcmQtY29tbWFuZGVyIj4ke2VzY2FwZUh0bWwocC5jb21tYW5kZXIpfTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJlY29uLWNhcmQtc2V0Ij4ke2VzY2FwZUh0bWwocC5zZXQpfSAoJHtwLnllYXJ9KTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJlY29uLWNhcmQtdGhlbWUiPiR7ZXNjYXBlSHRtbChwLnRoZW1lIHx8ICcnKX08L2Rpdj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxhYi1wcmVjb24taW5zdGFsbC1idG4iIHRpdGxlPSJJbnN0YWxsIHRvIEZvcmdlIGFuZCBhZGQgdG8gZGVjayBsaXN0Ij4KICAgICAgICAgICAgICAgICAgICAke2luc3RhbGxMYWJlbH0KICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgIH0pLmpvaW4oJycpOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxQcmVjb24oZmlsZU5hbWUpIHsKICAgICAgICBjb25zdCBzdGF0dXNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItcHJlY29uLXN0YXR1cycpOwoKICAgICAgICBpZiAoIWJhY2tlbmRBdmFpbGFibGUpIHsKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwgJ1ByZWNvbiBpbnN0YWxsIHJlcXVpcmVzIGEgcnVubmluZyBiYWNrZW5kLicsICdlcnJvcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBwcmVjb24gPSBwcmVjb25EZWNrcy5maW5kKHAgPT4gcC5maWxlTmFtZSA9PT0gZmlsZU5hbWUpOwogICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gcHJlY29uID8gcHJlY29uLm5hbWUgOiBmaWxlTmFtZTsKICAgICAgICBzaG93SW1wb3J0U3RhdHVzKHN0YXR1c0VsLCBgSW5zdGFsbGluZyAke2Rpc3BsYXlOYW1lfS4uLmAsICdsb2FkaW5nJyk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvbGFiL3ByZWNvbnMvaW5zdGFsbGAsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVOYW1lIH0pLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CgogICAgICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZGV0YWlsIHx8ICdJbnN0YWxsIGZhaWxlZCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBkZWNrTmFtZSA9IGRhdGEuZGVja05hbWU7CgogICAgICAgICAgICBpbXBvcnRlZERlY2tNZXRhW2RlY2tOYW1lXSA9IHsKICAgICAgICAgICAgICAgIHNvdXJjZTogJ1ByZWNvbicsCiAgICAgICAgICAgICAgICBzb3VyY2VVcmw6IG51bGwsCiAgICAgICAgICAgICAgICBjb21tYW5kZXI6IHByZWNvbiA/IHByZWNvbi5jb21tYW5kZXIgOiBudWxsLAogICAgICAgICAgICAgICAgYXJjaGV0eXBlOiBwcmVjb24gPyBwcmVjb24udGhlbWUgOiBudWxsLAogICAgICAgICAgICAgICAgY29sb3JJZGVudGl0eTogcHJlY29uID8gcHJlY29uLmNvbG9ycyA6IFtdLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVEZWNrcy5maW5kKGQgPT4gZC5uYW1lID09PSBkZWNrTmFtZSkpIHsKICAgICAgICAgICAgICAgIGF2YWlsYWJsZURlY2tzLnVuc2hpZnQoewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGRlY2tOYW1lLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlcjogcHJlY29uID8gcHJlY29uLmNvbW1hbmRlciA6IGRlY2tOYW1lLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZWZyZXNoRGVja1NlbGVjdG9ycygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBBdXRvLWFzc2lnbiB0byBmaXJzdCBlbXB0eSBzZWF0CiAgICAgICAgICAgIGNvbnN0IGVtcHR5U2VhdCA9IHNlbGVjdGVkRGVja3MuaW5kZXhPZihudWxsKTsKICAgICAgICAgICAgaWYgKGVtcHR5U2VhdCA+PSAwKSB7CiAg' +
'ICAgICAgICAgICAgICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgbGFiLWRlY2stc2VsZWN0LSR7ZW1wdHlTZWF0fWApOwogICAgICAgICAgICAgICAgaWYgKHNlbCkgewogICAgICAgICAgICAgICAgICAgIHNlbC52YWx1ZSA9IGRlY2tOYW1lOwogICAgICAgICAgICAgICAgICAgIHNlbGVjdERlY2soZW1wdHlTZWF0LCBkZWNrTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNob3dJbXBvcnRTdGF0dXMoc3RhdHVzRWwsIGBJbnN0YWxsZWQgIiR7ZGlzcGxheU5hbWV9IiBcdTIwMTQgYWRkZWQgdG8gZGVjayBsaXN0YCwgJ3N1Y2Nlc3MnKTsKICAgICAgICAgICAgcmVuZGVyUHJlY29uR3JpZChwcmVjb25EZWNrcyk7CgogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBzaG93SW1wb3J0U3RhdHVzKHN0YXR1c0VsLCBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7CiAgICAgICAgfQogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBbGxQcmVjb25zKCkgewogICAgICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1wcmVjb24tc3RhdHVzJyk7CgogICAgICAgIGlmICghYmFja2VuZEF2YWlsYWJsZSkgewogICAgICAgICAgICBzaG93SW1wb3J0U3RhdHVzKHN0YXR1c0VsLCAnUHJlY29uIGluc3RhbGwgcmVxdWlyZXMgYSBydW5uaW5nIGJhY2tlbmQuJywgJ2Vycm9yJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHNob3dJbXBvcnRTdGF0dXMoc3RhdHVzRWwsIGBJbnN0YWxsaW5nIGFsbCAke3ByZWNvbkRlY2tzLmxlbmd0aH0gcHJlY29uIGRlY2tzLi4uYCwgJ2xvYWRpbmcnKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZmlsZU5hbWVzID0gcHJlY29uRGVja3MubWFwKHAgPT4gcC5maWxlTmFtZSk7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvbGFiL3ByZWNvbnMvaW5zdGFsbC1iYXRjaGAsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGZpbGVOYW1lcyB9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmRldGFpbCB8fCAnQmF0Y2ggaW5zdGFsbCBmYWlsZWQnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IGluc3RhbGxlZCA9IDA7CiAgICAgICAgICAgIGZvciAoY29uc3QgciBvZiAoZGF0YS5yZXN1bHRzIHx8IFtdKSkgewogICAgICAgICAgICAgICAgaWYgKHIuaW5zdGFsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkKys7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVja05hbWUgPSByLmRlY2tOYW1lOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWNvbiA9IHByZWNvbkRlY2tzLmZpbmQocCA9PiBwLmZpbGVOYW1lID09PSByLmZpbGVOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZWREZWNrTWV0YVtkZWNrTmFtZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ1ByZWNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVVybDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyOiBwcmVjb24gPyBwcmVjb24uY29tbWFuZGVyIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGV0eXBlOiBwcmVjb24gPyBwcmVjb24udGhlbWUgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcklkZW50aXR5OiBwcmVjb24gPyBwcmVjb24uY29sb3JzIDogW10sCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVEZWNrcy5maW5kKGQgPT4gZC5uYW1lID09PSBkZWNrTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRGVja3MucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkZWNrTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRlcjogcHJlY29uID8gcHJlY29uLmNvbW1hbmRlciA6IGRlY2tOYW1l' +
'LAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJlZnJlc2hEZWNrU2VsZWN0b3JzKCk7CiAgICAgICAgICAgIHJlbmRlclByZWNvbkdyaWQocHJlY29uRGVja3MpOwogICAgICAgICAgICBzaG93SW1wb3J0U3RhdHVzKHN0YXR1c0VsLCBgSW5zdGFsbGVkICR7aW5zdGFsbGVkfSBvZiAke2ZpbGVOYW1lcy5sZW5ndGh9IHByZWNvbiBkZWNrc2AsICdzdWNjZXNzJyk7CgogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBzaG93SW1wb3J0U3RhdHVzKHN0YXR1c0VsLCBgRXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCB2MzogVGV4dCBJbXBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gc2hvd1RleHRJbXBvcnQoKSB7CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXRleHQtbW9kYWwnKTsKICAgICAgICBpZiAobW9kYWwpIHsKICAgICAgICAgICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItdGV4dC1pbXBvcnQtYXJlYScpPy5mb2N1cygpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZVRleHRJbXBvcnQoKSB7CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXRleHQtbW9kYWwnKTsKICAgICAgICBpZiAobW9kYWwpIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi10ZXh0LWltcG9ydC1zdGF0dXMnKTsKICAgICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLmlubmVySFRNTCA9ICcnOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZyb21UZXh0KCkgewogICAgICAgIGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi10ZXh0LWltcG9ydC1hcmVhJyk7CiAgICAgICAgY29uc3QgY29tbWFuZGVySW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXRleHQtY29tbWFuZGVyLW92ZXJyaWRlJyk7CiAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXRleHQtaW1wb3J0LXN0YXR1cycpOwoKICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dEFyZWE/LnZhbHVlLnRyaW0oKTsKICAgICAgICBjb25zdCBjb21tYW5kZXIgPSBjb21tYW5kZXJJbnB1dD8udmFsdWUudHJpbSgpIHx8IG51bGw7CgogICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICBzaG93SW1wb3J0U3RhdHVzKHN0YXR1c0VsLCAnUGxlYXNlIHBhc3RlIGEgY2FyZCBsaXN0LicsICdlcnJvcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoIWJhY2tlbmRBdmFpbGFibGUpIHsKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwgJ1RleHQgaW1wb3J0IHJlcXVpcmVzIGEgcnVubmluZyBiYWNrZW5kLicsICdlcnJvcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBzaG93SW1wb3J0U3RhdHVzKHN0YXR1c0VsLCAnUGFyc2luZyBjYXJkIGxpc3QuLi4nLCAnbG9hZGluZycpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2xhYi9pbXBvcnQvdGV4dGAsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRleHQsIGNvbW1hbmRlciB9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmRldGFpbCB8fCAnSW1wb3J0IGZhaWxlZCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbXBvcnRlZERlY2tNZXRhW2RhdGEuZGNr' +
'RmlsZV0gPSB7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICdUZXh0IEltcG9ydCcsCiAgICAgICAgICAgICAgICBzb3VyY2VVcmw6IG51bGwsCiAgICAgICAgICAgICAgICBjb21tYW5kZXI6IGRhdGEuY29tbWFuZGVyLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVEZWNrcy5maW5kKGQgPT4gZC5uYW1lID09PSBkYXRhLmRja0ZpbGUpKSB7CiAgICAgICAgICAgICAgICBhdmFpbGFibGVEZWNrcy51bnNoaWZ0KHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiBkYXRhLmRja0ZpbGUsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyOiBkYXRhLmNvbW1hbmRlciwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmVmcmVzaERlY2tTZWxlY3RvcnMoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2hvd0ltcG9ydFN0YXR1cyhzdGF0dXNFbCwKICAgICAgICAgICAgICAgIGBJbXBvcnRlZCAiJHtkYXRhLmRlY2tOYW1lfSIgKCR7ZGF0YS50b3RhbENhcmRzfSBjYXJkcylgLAogICAgICAgICAgICAgICAgJ3N1Y2Nlc3MnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHRleHRBcmVhLnZhbHVlID0gJyc7CiAgICAgICAgICAgIGlmIChjb21tYW5kZXJJbnB1dCkgY29tbWFuZGVySW5wdXQudmFsdWUgPSAnJzsKCiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHNob3dJbXBvcnRTdGF0dXMoc3RhdHVzRWwsIGBFcnJvcjogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIEltcG9ydCBTdGF0dXMgSGVscGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIHNob3dJbXBvcnRTdGF0dXMoZWwsIG1lc3NhZ2UsIHR5cGUpIHsKICAgICAgICBpZiAoIWVsKSByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gJ2xhYi1pbXBvcnQtc3RhdHVzJzsKICAgICAgICBpZiAodHlwZSkgZWwuY2xhc3NMaXN0LmFkZChgc3RhdHVzLSR7dHlwZX1gKTsKICAgICAgICBlbC5pbm5lckhUTUwgPSBtZXNzYWdlOwogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwoKICAgICAgICBpZiAodHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGVsLmlubmVySFRNTCA9PT0gbWVzc2FnZSkgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgfSwgODAwMCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBDb250cm9scyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBzZXRHYW1lQ291bnQobikgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItZ2FtZS1jb3VudCcpLnZhbHVlID0gbjsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubGFiLXByZXNldC1idG4nKS5mb3JFYWNoKGJ0biA9PiB7CiAgICAgICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBwYXJzZUludChidG4udGV4dENvbnRlbnQpID09PSBuKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvLyDilIDilIAgQmF0Y2ggRXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIHN0YXJ0QmF0Y2goKSB7CiAgICAgICAgY29uc3QgZW5naW5lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1lbmdpbmUnKS52YWx1ZTsKCiAgICAgICAgaWYgKGVuZ2luZSA9PT0gJ2RlZXBzZWVrJykgewogICAgICAgICAgICAvLyBEZWVwU2VlazogYXQgbGVhc3QgMSBkZWNrIHJlcXVpcmVkIChub3QgYWxsIDMpCiAgICAgICAgICAgIGNvbnN0IGZpbGxlZERlY2tzID0gc2VsZWN0ZWREZWNrcy5maWx0ZXIoZCA9PiBkKTsKICAgICAgICAgICAgaWYgKGZpbGxlZERlY2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgYWxlcnQoJ1NlbGVjdCBhdCBsZWFzdCAxIGRlY2suJyk7CiAgICAgICAgICAgICAgICBy' +
'ZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IG51bUdhbWVzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1nYW1lLWNvdW50JykudmFsdWUpIHx8IDMwOwoKICAgICAgICAgICAgc2V0UnVubmluZyh0cnVlKTsKICAgICAgICAgICAgY2xlYXJMb2coKTsKICAgICAgICAgICAgc2hvd1Byb2dyZXNzKCk7CiAgICAgICAgICAgIGFwcGVuZExvZygnW0RlZXBTZWVrIEVuZ2luZV0gU3RhcnRpbmcgYmF0Y2ggd2l0aCBMTE0gb3Bwb25lbnQuLi4nKTsKCiAgICAgICAgICAgIGF3YWl0IHN0YXJ0RGVlcFNlZWtCYXRjaChmaWxsZWREZWNrcywgbnVtR2FtZXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEphdmEgRm9yZ2U6IHJlcXVpcmVzIGFsbCAzIGRlY2tzCiAgICAgICAgICAgIGlmIChzZWxlY3RlZERlY2tzLnNvbWUoZCA9PiAhZCkpIHsKICAgICAgICAgICAgICAgIGFsZXJ0KCdTZWxlY3QgYSBkZWNrIGZvciBhbGwgMyBzZWF0cy4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgbnVtR2FtZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWdhbWUtY291bnQnKS52YWx1ZSkgfHwgMTAwOwogICAgICAgICAgICBjb25zdCB0aHJlYWRzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi10aHJlYWRzJykudmFsdWUpIHx8IDQ7CiAgICAgICAgICAgIGNvbnN0IHNlZWRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItc2VlZCcpLnZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgY29uc3Qgc2VlZCA9IHNlZWRJbnB1dCA/IHBhcnNlSW50KHNlZWRJbnB1dCkgOiBudWxsOwoKICAgICAgICAgICAgY29uc3QgZGVja1NvdXJjZXMgPSBzZWxlY3RlZERlY2tzLm1hcChuYW1lID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBpbXBvcnRlZERlY2tNZXRhW25hbWVdOwogICAgICAgICAgICAgICAgcmV0dXJuIG1ldGEgPyB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBtZXRhLnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICBzb3VyY2VVcmw6IG1ldGEuc291cmNlVXJsIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyOiBtZXRhLmNvbW1hbmRlciB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgIGFyY2hldHlwZTogbWV0YS5hcmNoZXR5cGUgfHwgbnVsbCwKICAgICAgICAgICAgICAgIH0gOiB7fTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBzZXRSdW5uaW5nKHRydWUpOwogICAgICAgICAgICBjbGVhckxvZygpOwogICAgICAgICAgICBzaG93UHJvZ3Jlc3MoKTsKCiAgICAgICAgICAgIGlmIChiYWNrZW5kQXZhaWxhYmxlKSB7CiAgICAgICAgICAgICAgICBhd2FpdCBzdGFydEJhY2tlbmRCYXRjaChudW1HYW1lcywgdGhyZWFkcywgc2VlZCwgZGVja1NvdXJjZXMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbQUkgTGFiXSBObyBiYWNrZW5kIOKAlCBydW5uaW5nIGxvY2FsIHNpbXVsYXRpb24nKTsKICAgICAgICAgICAgICAgIHJ1bkxvY2FsU2ltdWxhdGlvbihudW1HYW1lcywgc2VlZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gc3RhcnREZWVwU2Vla0JhdGNoKGRlY2tOYW1lcywgbnVtR2FtZXMpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2xhYi9zdGFydC1kZWVwc2Vla2AsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgZGVja3M6IGRlY2tOYW1lcywKICAgICAgICAgICAgICAgICAgICBudW1HYW1lcywKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChyZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgYXBwZW5kTG9nKGBEZWVwU2VlayBiYXRjaCAke2RhdGEuYmF0Y2hJZH0gc3RhcnRlZDogJHtudW1HYW1lc30gZ2FtZXMgYWNyb3NzICR7ZGVja05hbWVzLmxlbmd0aH0gZGVja3NgKTsKICAgICAgICAg' +
'ICAgICAgIHN0YXJ0UG9sbGluZyhkYXRhLmJhdGNoSWQpOwogICAgICAgICAgICAgICAgc3RhcnRMb2dQb2xsaW5nKGRhdGEuYmF0Y2hJZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMudGV4dCgpOwogICAgICAgICAgICAgICAgYXBwZW5kTG9nKGBFUlJPUjogJHtlcnJ9YCk7CiAgICAgICAgICAgICAgICBzZXRSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBhcHBlbmRMb2coYEVSUk9SOiAke2Vyci5tZXNzYWdlfWApOwogICAgICAgICAgICBzZXRSdW5uaW5nKGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gc3RhcnRCYWNrZW5kQmF0Y2gobnVtR2FtZXMsIHRocmVhZHMsIHNlZWQsIGRlY2tTb3VyY2VzKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9sYWIvc3RhcnRgLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgIGRlY2tzOiBzZWxlY3RlZERlY2tzLAogICAgICAgICAgICAgICAgICAgIG51bUdhbWVzLAogICAgICAgICAgICAgICAgICAgIHRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgc2VlZCwKICAgICAgICAgICAgICAgICAgICBkZWNrU291cmNlcywKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChyZXMub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICAgICAgYXBwZW5kTG9nKGBCYXRjaCAke2RhdGEuYmF0Y2hJZH0gc3RhcnRlZDogJHtudW1HYW1lc30gZ2FtZXMsICR7dGhyZWFkc30gdGhyZWFkc2ApOwogICAgICAgICAgICAgICAgc3RhcnRQb2xsaW5nKGRhdGEuYmF0Y2hJZCk7CiAgICAgICAgICAgICAgICBzdGFydExvZ1BvbGxpbmcoZGF0YS5iYXRjaElkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgICAgICAgICAgICAgICBhcHBlbmRMb2coYEVSUk9SOiAke2Vycn1gKTsKICAgICAgICAgICAgICAgIHNldFJ1bm5pbmcoZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGFwcGVuZExvZyhgQ29ubmVjdGlvbiBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdbQUkgTGFiXSBCYWNrZW5kIGVycm9yLCBmYWxsaW5nIGJhY2sgdG8gbG9jYWwgc2ltOicsIGVycik7CiAgICAgICAgICAgIGJhY2tlbmRBdmFpbGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgdXBkYXRlQmFja2VuZEluZGljYXRvcigpOwogICAgICAgICAgICBydW5Mb2NhbFNpbXVsYXRpb24obnVtR2FtZXMsIG51bGwpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIExvY2FsIHNpbXVsYXRpb24gZmFsbGJhY2sg4oCUIGdlbmVyYXRlcyBzeW50aGV0aWMgcmVzdWx0cwogICAgICogZm9yIHRlc3RpbmcgdGhlIFVJIHdpdGhvdXQgYSBydW5uaW5nIEZvcmdlIGJhY2tlbmQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJ1bkxvY2FsU2ltdWxhdGlvbihudW1HYW1lcywgc2VlZCkgewogICAgICAgIGNvbnN0IHJuZyA9IHNlZWQgIT09IG51bGwgPyBzZWVkZWRSYW5kb20oc2VlZCkgOiBNYXRoLnJhbmRvbTsKCiAgICAgICAgY29uc3QgZ2FtZXMgPSBbXTsKICAgICAgICBsZXQgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgbGV0IGNvbXBsZXRlZCA9IDA7CgogICAgICAgIGNvbnN0IGJhdGNoSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGNodW5rID0gTWF0aC5taW4oTWF0aC5jZWlsKG51bUdhbWVzIC8gMjApLCBudW1HYW1lcyAtIGNvbXBsZXRlZCk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmsgJiYgY29tcGxldGVkIDwgbnVtR2FtZXM7IGkrKykgewogICAgICAgICAgICAgICAgZ2FtZXMucHVzaChzaW11bGF0ZU9uZUdhbWUoY29tcGxldGVkLCBybmcpKTsKICAgICAgICAgICAgICAgIGNvbXBsZXRlZCsrOwogICAgICAgICAgICB9' +
'CiAgICAgICAgICAgIHVwZGF0ZVByb2dyZXNzKGNvbXBsZXRlZCwgbnVtR2FtZXMsIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lKTsKICAgICAgICAgICAgYXBwZW5kTG9nKGBbR2FtZSAke2NvbXBsZXRlZH0vJHtudW1HYW1lc31dIHNpbXVsYXRlZCBsb2NhbGx5YCk7CgogICAgICAgICAgICBpZiAoY29tcGxldGVkID49IG51bUdhbWVzKSB7CiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGJhdGNoSW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZCA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lOwogICAgICAgICAgICAgICAgZmluYWxpemVCYXRjaChnYW1lcywgZWxhcHNlZCwgbnVtR2FtZXMsIHNlZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgNTApOwogICAgfQoKICAgIGZ1bmN0aW9uIHNpbXVsYXRlT25lR2FtZShpbmRleCwgcm5nKSB7CiAgICAgICAgY29uc3QgdG90YWxUdXJucyA9IE1hdGguZmxvb3Iocm5nKCkgKiAyMCkgKyA1OwogICAgICAgIGNvbnN0IHdpbm5pbmdTZWF0ID0gcm5nKCkgPCAwLjA1ID8gbnVsbCA6IE1hdGguZmxvb3Iocm5nKCkgKiAzKTsKCiAgICAgICAgY29uc3Qgd2luQ29uZGl0aW9ucyA9IFsnY29tYmF0X2RhbWFnZScsICdjb21tYW5kZXJfZGFtYWdlJywgJ2NvbWJvX2FsdF93aW4nLCAnbGlmZV9kcmFpbiddOwogICAgICAgIGNvbnN0IHdpbkNvbmRpdGlvbiA9IHdpbm5pbmdTZWF0ICE9PSBudWxsCiAgICAgICAgICAgID8gd2luQ29uZGl0aW9uc1tNYXRoLmZsb29yKHJuZygpICogd2luQ29uZGl0aW9ucy5sZW5ndGgpXQogICAgICAgICAgICA6ICd0aW1lb3V0JzsKCiAgICAgICAgY29uc3QgcGxheWVyUmVzdWx0cyA9IFswLCAxLCAyXS5tYXAoc2VhdCA9PiAoewogICAgICAgICAgICBzZWF0SW5kZXg6IHNlYXQsCiAgICAgICAgICAgIGZpbmFsTGlmZTogc2VhdCA9PT0gd2lubmluZ1NlYXQgPyBNYXRoLmZsb29yKHJuZygpICogMzApICsgMTAgOiBNYXRoLmZsb29yKHJuZygpICogMjApIC0gMTAsCiAgICAgICAgICAgIG11bGxpZ2Fuczogcm5nKCkgPCAwLjMgPyAxIDogMCwKICAgICAgICAgICAgaXNXaW5uZXI6IHNlYXQgPT09IHdpbm5pbmdTZWF0LAogICAgICAgICAgICBjb21tYW5kZXJEYW1hZ2VEZWFsdDogTWF0aC5mbG9vcihybmcoKSAqIDE1KSwKICAgICAgICAgICAgY29tbWFuZGVyQ2FzdHM6IE1hdGguZmxvb3Iocm5nKCkgKiAzKSwKICAgICAgICAgICAgbGFuZHNQbGF5ZWQ6IE1hdGguZmxvb3IodG90YWxUdXJucyAqIDAuNiksCiAgICAgICAgICAgIHNwZWxsc0Nhc3Q6IE1hdGguZmxvb3IodG90YWxUdXJucyAqIDEuNSksCiAgICAgICAgICAgIGNyZWF0dXJlc0Rlc3Ryb3llZDogTWF0aC5mbG9vcihybmcoKSAqIDUpLAogICAgICAgIH0pKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZ2FtZUluZGV4OiBpbmRleCwKICAgICAgICAgICAgd2lubmluZ1NlYXQsCiAgICAgICAgICAgIHRvdGFsVHVybnMsCiAgICAgICAgICAgIHdpbkNvbmRpdGlvbiwKICAgICAgICAgICAgZ2FtZVNlZWQ6IE1hdGguZmxvb3Iocm5nKCkgKiAxMDAwMDAwKSwKICAgICAgICAgICAgZWxhcHNlZE1zOiBNYXRoLmZsb29yKHJuZygpICogMzAwMCkgKyA1MDAsCiAgICAgICAgICAgIHBsYXllclJlc3VsdHMsCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5hbGl6ZUJhdGNoKGdhbWVzLCBlbGFwc2VkTXMsIG51bUdhbWVzLCBzZWVkKSB7CiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGNvbXB1dGVMb2NhbFN1bW1hcnkoZ2FtZXMsIGVsYXBzZWRNcyk7CgogICAgICAgIGxhc3RSZXN1bHQgPSB7CiAgICAgICAgICAgIG1ldGFkYXRhOiB7CiAgICAgICAgICAgICAgICBzY2hlbWFWZXJzaW9uOiAnMS4wLjAnLAogICAgICAgICAgICAgICAgYmF0Y2hJZDogY3J5cHRvLnJhbmRvbVVVSUQ/LigpIHx8ICdsb2NhbC0nICsgRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLAogICAgICAgICAgICAgICAgdG90YWxHYW1lczogbnVtR2FtZXMsCiAgICAgICAgICAgICAgICBjb21wbGV0ZWRHYW1lczogZ2FtZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgZm9ybWF0OiAnY29tbWFuZGVyJywKICAgICAgICAgICAgICAgIHBvZFNpemU6IDMsCiAgICAgICAgICAgICAgICBlbmdpbmVWZXJzaW9uOiBiYWNrZW5kQXZhaWxhYmxlID8gJ2ZvcmdlLTIuMC4xMi1TTkFQU0hPVCcgOiAnbG9jYWwtc2ltLTEuMCcsCiAgICAg' +
'ICAgICAgICAgICBtYXN0ZXJTZWVkOiBzZWVkLAogICAgICAgICAgICAgICAgdGhyZWFkczogMSwKICAgICAgICAgICAgICAgIGVsYXBzZWRNczogTWF0aC5yb3VuZChlbGFwc2VkTXMpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWNrczogc2VsZWN0ZWREZWNrcy5tYXAoKG5hbWUsIGkpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBpbXBvcnRlZERlY2tNZXRhW25hbWVdOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBzZWF0SW5kZXg6IGksCiAgICAgICAgICAgICAgICAgICAgZGVja05hbWU6IG5hbWUucmVwbGFjZSgnLmRjaycsICcnKSwKICAgICAgICAgICAgICAgICAgICBjb21tYW5kZXJOYW1lOiBtZXRhPy5jb21tYW5kZXIgfHwgbmFtZS5yZXBsYWNlKCcuZGNrJywgJycpLnJlcGxhY2UoL18vZywgJyAnKSwKICAgICAgICAgICAgICAgICAgICBkZWNrRmlsZTogbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb2xvcklkZW50aXR5OiBtZXRhPy5jb2xvcklkZW50aXR5IHx8IFtdLAogICAgICAgICAgICAgICAgICAgIGNhcmRDb3VudDogMTAwLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogbWV0YT8uc291cmNlIHx8ICdMb2NhbCBGaWxlJywKICAgICAgICAgICAgICAgICAgICBzb3VyY2VVcmw6IG1ldGE/LnNvdXJjZVVybCB8fCBudWxsLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIGdhbWVzLAogICAgICAgICAgICBzdW1tYXJ5LAogICAgICAgIH07CgogICAgICAgIGRpc3BsYXlSZXN1bHRzKGxhc3RSZXN1bHQpOwogICAgICAgIHNldFJ1bm5pbmcoZmFsc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXB1dGVMb2NhbFN1bW1hcnkoZ2FtZXMsIGVsYXBzZWRNcykgewogICAgICAgIGNvbnN0IHBlckRlY2sgPSBbMCwgMSwgMl0ubWFwKHNlYXQgPT4gewogICAgICAgICAgICBjb25zdCBzZWF0R2FtZXMgPSBnYW1lcy5tYXAoZyA9PiBnLnBsYXllclJlc3VsdHNbc2VhdF0pOwogICAgICAgICAgICBjb25zdCB3aW5zID0gc2VhdEdhbWVzLmZpbHRlcihwID0+IHAuaXNXaW5uZXIpLmxlbmd0aDsKICAgICAgICAgICAgY29uc3QgbG9zc2VzID0gZ2FtZXMuZmlsdGVyKGcgPT4gZy53aW5uaW5nU2VhdCAhPT0gbnVsbCAmJiBnLndpbm5pbmdTZWF0ICE9PSBzZWF0KS5sZW5ndGg7CiAgICAgICAgICAgIGNvbnN0IGRyYXdzID0gZ2FtZXMuZmlsdGVyKGcgPT4gZy53aW5uaW5nU2VhdCA9PT0gbnVsbCkubGVuZ3RoOwogICAgICAgICAgICBjb25zdCB3aW5HYW1lcyA9IGdhbWVzLmZpbHRlcihnID0+IGcud2lubmluZ1NlYXQgPT09IHNlYXQpOwoKICAgICAgICAgICAgY29uc3QgYnJlYWtkb3duID0geyBjb21iYXRfZGFtYWdlOiAwLCBjb21tYW5kZXJfZGFtYWdlOiAwLCBjb21ib19hbHRfd2luOiAwLCBsaWZlX2RyYWluOiAwLCBtaWxsOiAwLCBjb25jZXNzaW9uOiAwLCB0aW1lb3V0OiAwLCB1bmtub3duOiAwIH07CiAgICAgICAgICAgIHdpbkdhbWVzLmZvckVhY2goZyA9PiB7IGJyZWFrZG93bltnLndpbkNvbmRpdGlvbl0gPSAoYnJlYWtkb3duW2cud2luQ29uZGl0aW9uXSB8fCAwKSArIDE7IH0pOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNlYXRJbmRleDogc2VhdCwKICAgICAgICAgICAgICAgIGRlY2tOYW1lOiBzZWxlY3RlZERlY2tzW3NlYXRdPy5yZXBsYWNlKCcuZGNrJywgJycpIHx8IGBEZWNrICR7c2VhdCArIDF9YCwKICAgICAgICAgICAgICAgIHdpbnMsCiAgICAgICAgICAgICAgICBsb3NzZXMsCiAgICAgICAgICAgICAgICBkcmF3cywKICAgICAgICAgICAgICAgIHdpblJhdGU6IGdhbWVzLmxlbmd0aCA+IDAgPyB3aW5zIC8gZ2FtZXMubGVuZ3RoIDogMCwKICAgICAgICAgICAgICAgIGF2Z1R1cm5zVG9XaW46IHdpbnMgPiAwID8gd2luR2FtZXMucmVkdWNlKChzLCBnKSA9PiBzICsgZy50b3RhbFR1cm5zLCAwKSAvIHdpbnMgOiBudWxsLAogICAgICAgICAgICAgICAgYXZnTXVsbGlnYW5zOiBzZWF0R2FtZXMubGVuZ3RoID4gMCA/IHNlYXRHYW1lcy5yZWR1Y2UoKHMsIHApID0+IHMgKyBwLm11bGxpZ2FucywgMCkgLyBzZWF0R2FtZXMubGVuZ3RoIDogMCwKICAgICAgICAgICAgICAgIGF2Z0ZpbmFsTGlmZTogc2VhdEdhbWVzLmxlbmd0aCA+IDAgPyBzZWF0R2FtZXMucmVkdWNlKChzLCBwKSA9PiBzICsgcC5maW5hbExpZmUsIDApIC8gc2VhdEdhbWVzLmxlbmd0aCA6IDAsCiAgICAgICAgICAgICAgICB3aW5D' +
'b25kaXRpb25CcmVha2Rvd246IGJyZWFrZG93biwKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgY29uc3QgdG90YWxUdXJucyA9IGdhbWVzLnJlZHVjZSgocywgZykgPT4gcyArIGcudG90YWxUdXJucywgMCk7CiAgICAgICAgY29uc3QgdG90YWxUaW1lID0gZ2FtZXMucmVkdWNlKChzLCBnKSA9PiBzICsgZy5lbGFwc2VkTXMsIDApOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwZXJEZWNrLAogICAgICAgICAgICBhdmdHYW1lVHVybnM6IGdhbWVzLmxlbmd0aCA+IDAgPyB0b3RhbFR1cm5zIC8gZ2FtZXMubGVuZ3RoIDogMCwKICAgICAgICAgICAgYXZnR2FtZVRpbWVNczogZ2FtZXMubGVuZ3RoID4gMCA/IHRvdGFsVGltZSAvIGdhbWVzLmxlbmd0aCA6IDAsCiAgICAgICAgICAgIHNpbXNQZXJTZWNvbmQ6IGVsYXBzZWRNcyA+IDAgPyAoZ2FtZXMubGVuZ3RoIC8gKGVsYXBzZWRNcyAvIDEwMDApKSA6IDAsCiAgICAgICAgfTsKICAgIH0KCiAgICAvLyDilIDilIAgUG9sbGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBzdGFydFBvbGxpbmcoYmF0Y2hJZCkgewogICAgICAgIHBvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvbGFiL3N0YXR1cz9iYXRjaElkPSR7YmF0Y2hJZH1gKTsKICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSByZXR1cm47CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKCiAgICAgICAgICAgICAgICB1cGRhdGVQcm9ncmVzcyhkYXRhLmNvbXBsZXRlZCwgZGF0YS50b3RhbCwgZGF0YS5lbGFwc2VkTXMpOwoKICAgICAgICAgICAgICAgIGlmICghZGF0YS5ydW5uaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgc3RvcFBvbGxpbmcoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTG9nKGBFUlJPUjogJHtkYXRhLmVycm9yfWApOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gRmV0Y2ggZmluYWwgcmVzdWx0CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0UmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9sYWIvcmVzdWx0P2JhdGNoSWQ9JHtiYXRjaElkfWApOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRSZXMub2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJlc3VsdCA9IGF3YWl0IHJlc3VsdFJlcy5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlSZXN1bHRzKGxhc3RSZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRMb2coYEJhdGNoIGNvbXBsZXRlLiAke2xhc3RSZXN1bHQubWV0YWRhdGEuY29tcGxldGVkR2FtZXN9IGdhbWVzIGluICR7KGxhc3RSZXN1bHQubWV0YWRhdGEuZWxhcHNlZE1zLzEwMDApLnRvRml4ZWQoMSl9c2ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRSdW5uaW5nKGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbQUkgTGFiXSBQb2xsIGVycm9yOicsIGVycik7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBQT0xMX1JBVEVfTVMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YXJ0TG9nUG9sbGluZyhiYXRjaElkKSB7CiAgICAgICAgbG9nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2xhYi9sb2c/YmF0Y2hJZD0ke2JhdGNoSWR9YCk7CiAgICAgICAgICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuOwogICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgICAgICBjb25zdCBsb2dFbCA9IGRvY3VtZW50' +
'LmdldEVsZW1lbnRCeUlkKCdsYWItbG9nLWNvbnRlbnQnKTsKICAgICAgICAgICAgICAgIGlmIChsb2dFbCAmJiBkYXRhLmxpbmVzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyBsYXN0IE4gbGluZXMKICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWlsID0gZGF0YS5saW5lcy5zbGljZSgtMzApOwogICAgICAgICAgICAgICAgICAgIGxvZ0VsLnRleHRDb250ZW50ID0gdGFpbC5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgIGxvZ0VsLnNjcm9sbFRvcCA9IGxvZ0VsLnNjcm9sbEhlaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCB7IC8qIGlnbm9yZSAqLyB9CiAgICAgICAgfSwgTE9HX1JBVEVfTVMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0b3BQb2xsaW5nKCkgewogICAgICAgIGlmIChwb2xsSW50ZXJ2YWwpIHsgY2xlYXJJbnRlcnZhbChwb2xsSW50ZXJ2YWwpOyBwb2xsSW50ZXJ2YWwgPSBudWxsOyB9CiAgICAgICAgaWYgKGxvZ0ludGVydmFsKSB7IGNsZWFySW50ZXJ2YWwobG9nSW50ZXJ2YWwpOyBsb2dJbnRlcnZhbCA9IG51bGw7IH0KICAgIH0KCiAgICAvLyDilIDilIAgUHJvZ3Jlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gc2hvd1Byb2dyZXNzKCkgewogICAgICAgIGNvbnN0IHByb2dyZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXByb2dyZXNzJyk7CiAgICAgICAgaWYgKHByb2dyZXNzRWwpIHByb2dyZXNzRWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MoY29tcGxldGVkLCB0b3RhbCwgZWxhcHNlZE1zKSB7CiAgICAgICAgY29uc3QgcGN0ID0gdG90YWwgPiAwID8gKGNvbXBsZXRlZCAvIHRvdGFsKSAqIDEwMCA6IDA7CiAgICAgICAgY29uc3QgZmlsbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1wcm9ncmVzcy1maWxsJyk7CiAgICAgICAgY29uc3QgY291bnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItcHJvZ3Jlc3MtY291bnQnKTsKICAgICAgICBjb25zdCBldGFFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItcHJvZ3Jlc3MtZXRhJyk7CgogICAgICAgIGlmIChmaWxsRWwpIGZpbGxFbC5zdHlsZS53aWR0aCA9IHBjdCArICclJzsKICAgICAgICBpZiAoY291bnRFbCkgY291bnRFbC50ZXh0Q29udGVudCA9IGAke2NvbXBsZXRlZH0gLyAke3RvdGFsfSBnYW1lc2A7CgogICAgICAgIGlmIChjb21wbGV0ZWQgPiAwICYmIGVsYXBzZWRNcyA+IDApIHsKICAgICAgICAgICAgY29uc3QgcmF0ZSA9IGNvbXBsZXRlZCAvIChlbGFwc2VkTXMgLyAxMDAwKTsKICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gKHRvdGFsIC0gY29tcGxldGVkKSAvIHJhdGU7CiAgICAgICAgICAgIGlmIChldGFFbCkgZXRhRWwudGV4dENvbnRlbnQgPSByZW1haW5pbmcgPiAwID8gYH4ke01hdGguY2VpbChyZW1haW5pbmcpfXMgcmVtYWluaW5nYCA6ICdEb25lJzsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIExvZyBQYW5lbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBjbGVhckxvZygpIHsKICAgICAgICBjb25zdCBsb2dFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItbG9nLWNvbnRlbnQnKTsKICAgICAgICBpZiAobG9nRWwpIGxvZ0VsLnRleHRDb250ZW50ID0gJyc7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwZW5kTG9nKG1zZykgewogICAgICAgIGNvbnN0IGxvZ0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1sb2ctY29udGVudCcpOwogICAgICAgIGNvbnN0IGxvZ0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItbG9nJyk7CiAgICAgICAgaWYgKCFsb2dFbCkgcmV0dXJuOwogICAgICAgIGxvZ0VsLnRleHRDb250ZW50ICs9IG1zZyArICdcbic7CiAgICAgICAgbG9nRWwuc2Nyb2xsVG9wID0gbG9nRWwuc2Nyb2xsSGVpZ2h0OwogICAgICAgIGlmIChsb2dDb250YWluZXIpIGxvZ0NvbnRhaW5lci5jbGFzc0xp' +
'c3QuYWRkKCdhY3RpdmUnKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVMb2coKSB7CiAgICAgICAgY29uc3QgbG9nQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1sb2cnKTsKICAgICAgICBjb25zdCB0b2dnbGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWxvZy10b2dnbGUnKTsKICAgICAgICBpZiAobG9nQ29udGFpbmVyKSB7CiAgICAgICAgICAgIGxvZ0NvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnKTsKICAgICAgICAgICAgaWYgKHRvZ2dsZUJ0bikgdG9nZ2xlQnRuLnRleHRDb250ZW50ID0gbG9nQ29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnY29sbGFwc2VkJykgPyAn4pa2JyA6ICfilrwnOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgRGlzcGxheSBSZXN1bHRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIGRpc3BsYXlSZXN1bHRzKHJlc3VsdCkgewogICAgICAgIGNvbnN0IHJlc3VsdHNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItcmVzdWx0cycpOwogICAgICAgIGNvbnN0IGNhcmRzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXN0YXRzLWNhcmRzJyk7CiAgICAgICAgY29uc3QgZ2xvYmFsRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWdsb2JhbC1zdGF0cycpOwoKICAgICAgICBpZiAoIXJlc3VsdHNFbCB8fCAhY2FyZHNFbCB8fCAhZ2xvYmFsRWwpIHJldHVybjsKICAgICAgICByZXN1bHRzRWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CgogICAgICAgIC8vIFNvcnQgZGVja3MgYnkgd2luIHJhdGUgZm9yIHJhbmtpbmcKICAgICAgICBjb25zdCByYW5rZWQgPSBbLi4ucmVzdWx0LnN1bW1hcnkucGVyRGVja10uc29ydCgoYSwgYikgPT4gYi53aW5SYXRlIC0gYS53aW5SYXRlKTsKICAgICAgICBjb25zdCByYW5rTWFwID0ge307CiAgICAgICAgcmFua2VkLmZvckVhY2goKGQsIGkpID0+IHsgcmFua01hcFtkLnNlYXRJbmRleF0gPSBpICsgMTsgfSk7CgogICAgICAgIC8vIFJlbmRlciBzdGF0IGNhcmRzCiAgICAgICAgY2FyZHNFbC5pbm5lckhUTUwgPSByZXN1bHQuc3VtbWFyeS5wZXJEZWNrLm1hcChkcyA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJhbmsgPSByYW5rTWFwW2RzLnNlYXRJbmRleF07CiAgICAgICAgICAgIGNvbnN0IGlzV2lubmVyID0gcmFuayA9PT0gMTsKICAgICAgICAgICAgY29uc3QgZGVja0luZm8gPSByZXN1bHQuZGVja3NbZHMuc2VhdEluZGV4XTsKICAgICAgICAgICAgY29uc3QgYnJlYWtkb3duID0gZHMud2luQ29uZGl0aW9uQnJlYWtkb3duIHx8IHt9OwoKICAgICAgICAgICAgLy8gdjM6IFNvdXJjZSBiYWRnZSBpbiByZXN1bHRzCiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGRlY2tJbmZvLnNvdXJjZSB8fCAnJzsKICAgICAgICAgICAgY29uc3Qgc291cmNlVXJsID0gZGVja0luZm8uc291cmNlVXJsIHx8ICcnOwogICAgICAgICAgICBjb25zdCBzb3VyY2VCYWRnZUh0bWwgPSBzb3VyY2UKICAgICAgICAgICAgICAgID8gYDxkaXYgY2xhc3M9ImxhYi1yZXN1bHQtc291cmNlIj4ke3JlbmRlclNvdXJjZUJhZGdlKHNvdXJjZSwgc291cmNlVXJsKX08L2Rpdj5gCiAgICAgICAgICAgICAgICA6ICcnOwoKICAgICAgICAgICAgcmV0dXJuIGAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXN0YXQtY2FyZCAke2lzV2lubmVyID8gJ3dpbm5lcicgOiAnJ30iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmFuayI+IyR7cmFua308L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtZGVjay1uYW1lIj4ke2VzY2FwZUh0bWwoZHMuZGVja05hbWUpfTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb21tYW5kZXIiPiR7ZXNjYXBlSHRtbChkZWNrSW5mby5jb21tYW5kZXJOYW1lKX08L2Rpdj4KICAgICAgICAgICAgICAgICR7c291cmNlQmFkZ2VIdG1sfQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1zdGF0LXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtbGFiZWwiPldpbiBSYXRlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LXZhbHVlIGhpZ2hsaWdodCI+JHsoZHMud2luUmF0ZSAqIDEwMCku' +
'dG9GaXhlZCgxKX0lPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItc3RhdC1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWxhYmVsIj5SZWNvcmQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUiPiR7ZHMud2luc31XIC8gJHtkcy5sb3NzZXN9TCAvICR7ZHMuZHJhd3N9RDwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXN0YXQtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+QXZnIFR1cm5zIHRvIFdpbjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC12YWx1ZSI+JHtkcy5hdmdUdXJuc1RvV2luICE9PSBudWxsID8gZHMuYXZnVHVybnNUb1dpbi50b0ZpeGVkKDEpIDogJ04vQSd9PC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItc3RhdC1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LWxhYmVsIj5BdmcgTXVsbGlnYW5zPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0LXZhbHVlIj4ke2RzLmF2Z011bGxpZ2Fucy50b0ZpeGVkKDIpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXN0YXQtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdC1sYWJlbCI+QXZnIEZpbmFsIExpZmU8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXQtdmFsdWUiPiR7ZHMuYXZnRmluYWxMaWZlLnRvRml4ZWQoMSl9PC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLXdpbnJhdGUtYmFyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItd2lucmF0ZS1maWxsIHNlYXQtJHtkcy5zZWF0SW5kZXh9LWNvbG9yIgogICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOiAkeyhkcy53aW5SYXRlICogMTAwKS50b0ZpeGVkKDEpfSUiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgJHtkcy53aW5zID4gMCA/IGAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi13aW4tY29uZGl0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgJHtPYmplY3QuZW50cmllcyhicmVha2Rvd24pLmZpbHRlcigoW18sIHZdKSA9PiB2ID4gMCkubWFwKChbaywgdl0pID0+IGAKICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi13Yy1jaGlwIj48c3BhbiBjbGFzcz0id2MtY291bnQiPiR7dn08L3NwYW4+ICR7Zm9ybWF0V2luQ29uZGl0aW9uKGspfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICBgKS5qb2luKCcnKX0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgYCA6ICcnfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgYDsKICAgICAgICB9KS5qb2luKCcnKTsKCiAgICAgICAgLy8gUmVuZGVyIGdsb2JhbCBzdGF0cwogICAgICAgIGNvbnN0IHMgPSByZXN1bHQuc3VtbWFyeTsKICAgICAgICBjb25zdCBtID0gcmVzdWx0Lm1ldGFkYXRhOwogICAgICAgIGdsb2JhbEVsLmlubmVySFRNTCA9IGAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWdsb2JhbC1zdGF0Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJnLXZhbHVlIj4ke20uY29tcGxldGVkR2FtZXN9PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImctbGFiZWwiPkdhbWVzPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWdsb2JhbC1zdGF0Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJnLXZhbHVlIj4ke3MuYXZnR2FtZVR1cm5zLnRvRml4ZWQoMSl9PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImctbGFiZWwiPkF2ZyBUdXJuczwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1nbG9iYWwtc3RhdCI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZy12YWx1ZSI+JHsobS5lbGFwc2VkTXMgLyAxMDAwKS50b0ZpeGVkKDEpfXM8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFz' +
'cz0iZy1sYWJlbCI+V2FsbCBUaW1lPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWdsb2JhbC1zdGF0Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJnLXZhbHVlIj4ke3Muc2ltc1BlclNlY29uZC50b0ZpeGVkKDIpfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJnLWxhYmVsIj5TaW1zL3NlYzwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1nbG9iYWwtc3RhdCI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZy12YWx1ZSI+JHttLnRocmVhZHN9PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImctbGFiZWwiPlRocmVhZHM8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItZ2xvYmFsLXN0YXQiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImctdmFsdWUiPiR7bS5lbmdpbmVWZXJzaW9uIHx8ICc/J308L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZy1sYWJlbCI+RW5naW5lPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICBgOwoKICAgICAgICAvLyBSZW5kZXIgZW5oYW5jZWQgcmVzdWx0IHNlY3Rpb25zCiAgICAgICAgcmVuZGVyQ2hhcnRzKHJlc3VsdCk7CiAgICAgICAgcmVuZGVySGVhZFRvSGVhZChyZXN1bHQpOwogICAgICAgIHJlbmRlckNvbWJhdFN0YXRzKHJlc3VsdCk7CiAgICAgICAgcmVuZGVyR2FtZUxvZyhyZXN1bHQpOwogICAgfQoKICAgIC8vIOKUgOKUgCBUYWIgU3dpdGNoaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIHN3aXRjaFRhYih0YWJJZCkgewogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sYWItdGFiJykuZm9yRWFjaChidG4gPT4gewogICAgICAgICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYnRuLmRhdGFzZXQudGFiID09PSB0YWJJZCk7CiAgICAgICAgfSk7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxhYi10YWItcGFuZWwnKS5mb3JFYWNoKHBhbmVsID0+IHsKICAgICAgICAgICAgcGFuZWwuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgcGFuZWwuaWQgPT09IHRhYklkKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvLyDilIDilIAgQ2hhcnRzICYgVmlzdWFsaXphdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgY29uc3QgU0VBVF9DT0xPUlMgPSBbJyM1OGE2ZmYnLCAnI2Y4NTE0OScsICcjM2ZiOTUwJ107CiAgICBjb25zdCBTRUFUX0NPTE9SU19ESU0gPSBbJ3JnYmEoODgsMTY2LDI1NSwwLjMpJywgJ3JnYmEoMjQ4LDgxLDczLDAuMyknLCAncmdiYSg2MywxODUsODAsMC4zKSddOwoKICAgIGZ1bmN0aW9uIHJlbmRlckNoYXJ0cyhyZXN1bHQpIHsKICAgICAgICBjb25zdCBnYW1lcyA9IHJlc3VsdC5nYW1lcyB8fCBbXTsKICAgICAgICBjb25zdCBwZXJEZWNrID0gcmVzdWx0LnN1bW1hcnkucGVyRGVjayB8fCBbXTsKICAgICAgICBjb25zdCBkZWNrcyA9IHJlc3VsdC5kZWNrcyB8fCBbXTsKCiAgICAgICAgZHJhd1dpblJhdGVDaGFydChwZXJEZWNrLCBkZWNrcyk7CiAgICAgICAgZHJhd1dpbkNvbmRpdGlvbkNoYXJ0KHBlckRlY2ssIGRlY2tzKTsKICAgICAgICBkcmF3VHVybkRpc3RyaWJ1dGlvbihnYW1lcywgZGVja3MpOwogICAgICAgIGRyYXdXaW5SYXRlVHJlbmQoZ2FtZXMsIGRlY2tzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcmF3V2luUmF0ZUNoYXJ0KHBlckRlY2ssIGRlY2tzKSB7CiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1jaGFydC13aW5yYXRlJyk7CiAgICAgICAgaWYgKCFjYW52YXMpIHJldHVybjsKICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoLCBoID0gY2FudmFzLmhlaWdodDsKICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpOwoKICAgICAgICBjb25zdCBwYWQgPSB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiA1MCwgbGVmdDogNTAgfTsKICAg' +
'ICAgICBjb25zdCBjaGFydFcgPSB3IC0gcGFkLmxlZnQgLSBwYWQucmlnaHQ7CiAgICAgICAgY29uc3QgY2hhcnRIID0gaCAtIHBhZC50b3AgLSBwYWQuYm90dG9tOwogICAgICAgIGNvbnN0IGJhclcgPSBNYXRoLm1pbig2MCwgY2hhcnRXIC8gcGVyRGVjay5sZW5ndGggLSAyMCk7CgogICAgICAgIC8vIEF4ZXMKICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnIzMwMzYzZCc7CiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDE7CiAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgIGN0eC5tb3ZlVG8ocGFkLmxlZnQsIHBhZC50b3ApOwogICAgICAgIGN0eC5saW5lVG8ocGFkLmxlZnQsIGggLSBwYWQuYm90dG9tKTsKICAgICAgICBjdHgubGluZVRvKHcgLSBwYWQucmlnaHQsIGggLSBwYWQuYm90dG9tKTsKICAgICAgICBjdHguc3Ryb2tlKCk7CgogICAgICAgIC8vIFktYXhpcyBsYWJlbHMgKDAlLCAyNSUsIDUwJSwgNzUlLCAxMDAlKQogICAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzhiOTQ5ZSc7CiAgICAgICAgY3R4LmZvbnQgPSAnMTFweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmJzsKICAgICAgICBjdHgudGV4dEFsaWduID0gJ3JpZ2h0JzsKICAgICAgICBmb3IgKGxldCBwY3QgPSAwOyBwY3QgPD0gMTAwOyBwY3QgKz0gMjUpIHsKICAgICAgICAgICAgY29uc3QgeSA9IGggLSBwYWQuYm90dG9tIC0gKHBjdCAvIDEwMCkgKiBjaGFydEg7CiAgICAgICAgICAgIGN0eC5maWxsVGV4dChwY3QgKyAnJScsIHBhZC5sZWZ0IC0gOCwgeSArIDQpOwogICAgICAgICAgICBpZiAocGN0ID4gMCkgewogICAgICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJ3JnYmEoNDgsNTQsNjEsMC41KSc7CiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgICAgICBjdHgubW92ZVRvKHBhZC5sZWZ0LCB5KTsKICAgICAgICAgICAgICAgIGN0eC5saW5lVG8odyAtIHBhZC5yaWdodCwgeSk7CiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEJhcnMKICAgICAgICBwZXJEZWNrLmZvckVhY2goKGRzLCBpKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHggPSBwYWQubGVmdCArIChpICsgMC41KSAqIChjaGFydFcgLyBwZXJEZWNrLmxlbmd0aCkgLSBiYXJXIC8gMjsKICAgICAgICAgICAgY29uc3QgYmFySCA9IChkcy53aW5SYXRlKSAqIGNoYXJ0SDsKICAgICAgICAgICAgY29uc3QgeSA9IGggLSBwYWQuYm90dG9tIC0gYmFySDsKCiAgICAgICAgICAgIC8vIEJhciBmaWxsCiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBTRUFUX0NPTE9SU1tkcy5zZWF0SW5kZXhdIHx8IFNFQVRfQ09MT1JTWzBdOwogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIHJvdW5kUmVjdChjdHgsIHgsIHksIGJhclcsIGJhckgsIDQpOwogICAgICAgICAgICBjdHguZmlsbCgpOwoKICAgICAgICAgICAgLy8gVmFsdWUgb24gdG9wCiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAnI2M5ZDFkOSc7CiAgICAgICAgICAgIGN0eC5mb250ID0gJ2JvbGQgMTJweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmJzsKICAgICAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInOwogICAgICAgICAgICBjdHguZmlsbFRleHQoKGRzLndpblJhdGUgKiAxMDApLnRvRml4ZWQoMSkgKyAnJScsIHggKyBiYXJXIC8gMiwgeSAtIDYpOwoKICAgICAgICAgICAgLy8gTGFiZWwKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjOGI5NDllJzsKICAgICAgICAgICAgY3R4LmZvbnQgPSAnMTBweCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmJzsKICAgICAgICAgICAgY29uc3QgbGFiZWwgPSAoZGVja3NbZHMuc2VhdEluZGV4XT8uY29tbWFuZGVyTmFtZSB8fCBkcy5kZWNrTmFtZSB8fCAnJykuc3Vic3RyaW5nKDAsIDE2KTsKICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGxhYmVsLCB4ICsgYmFyVyAvIDIsIGggLSBwYWQuYm90dG9tICsgMTQpOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRyYXdXaW5Db25kaXRpb25DaGFydChwZXJEZWNrLCBkZWNrcykgewogICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItY2hhcnQtd2luY29uZCcpOwogICAgICAgIGlmICghY2FudmFzKSByZXR1cm47CiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aCwgaCA9IGNhbnZh' +
'cy5oZWlnaHQ7CiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTsKCiAgICAgICAgLy8gQWdncmVnYXRlIHdpbiBjb25kaXRpb25zIGFjcm9zcyBhbGwgZGVja3MKICAgICAgICBjb25zdCB0b3RhbHMgPSB7fTsKICAgICAgICBwZXJEZWNrLmZvckVhY2goZHMgPT4gewogICAgICAgICAgICBjb25zdCBiZCA9IGRzLndpbkNvbmRpdGlvbkJyZWFrZG93biB8fCB7fTsKICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoYmQpLmZvckVhY2goKFtrLCB2XSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHYgPiAwKSB0b3RhbHNba10gPSAodG90YWxzW2tdIHx8IDApICsgdjsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh0b3RhbHMpLmZpbHRlcigoW18sIHZdKSA9PiB2ID4gMCkuc29ydCgoYSwgYikgPT4gYlsxXSAtIGFbMV0pOwogICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM4Yjk0OWUnOwogICAgICAgICAgICBjdHguZm9udCA9ICcxM3B4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYnOwogICAgICAgICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7CiAgICAgICAgICAgIGN0eC5maWxsVGV4dCgnTm8gd2luIGRhdGEnLCB3IC8gMiwgaCAvIDIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCB0b3RhbCA9IGVudHJpZXMucmVkdWNlKChzLCBbXywgdl0pID0+IHMgKyB2LCAwKTsKICAgICAgICBjb25zdCBwaWVDb2xvcnMgPSBbJyM1OGE2ZmYnLCAnI2Y4NTE0OScsICcjM2ZiOTUwJywgJyNkMjk5MjInLCAnI2EzNzFmNycsICcjZjA4ODNlJywgJyM4Yjk0OWUnLCAnIzU2ZDM2NCddOwogICAgICAgIGNvbnN0IGN4ID0gdyAqIDAuMzUsIGN5ID0gaCAvIDIsIHJhZGl1cyA9IE1hdGgubWluKGN4IC0gMjAsIGN5IC0gMjApOwoKICAgICAgICBsZXQgc3RhcnRBbmdsZSA9IC1NYXRoLlBJIC8gMjsKICAgICAgICBjb25zdCBzbGljZXMgPSBbXTsKICAgICAgICBlbnRyaWVzLmZvckVhY2goKFtrLCB2XSwgaSkgPT4gewogICAgICAgICAgICBjb25zdCBzbGljZUFuZ2xlID0gKHYgLyB0b3RhbCkgKiBNYXRoLlBJICogMjsKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHBpZUNvbG9yc1tpICUgcGllQ29sb3JzLmxlbmd0aF07CiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgICAgY3R4Lm1vdmVUbyhjeCwgY3kpOwogICAgICAgICAgICBjdHguYXJjKGN4LCBjeSwgcmFkaXVzLCBzdGFydEFuZ2xlLCBzdGFydEFuZ2xlICsgc2xpY2VBbmdsZSk7CiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgY3R4LmZpbGwoKTsKICAgICAgICAgICAgc2xpY2VzLnB1c2goeyBrZXk6IGssIHZhbHVlOiB2LCBjb2xvcjogcGllQ29sb3JzW2kgJSBwaWVDb2xvcnMubGVuZ3RoXSwgc3RhcnRBbmdsZSwgZW5kQW5nbGU6IHN0YXJ0QW5nbGUgKyBzbGljZUFuZ2xlIH0pOwogICAgICAgICAgICBzdGFydEFuZ2xlICs9IHNsaWNlQW5nbGU7CiAgICAgICAgfSk7CgogICAgICAgIC8vIExlZ2VuZAogICAgICAgIGNvbnN0IGxlZ2VuZFggPSB3ICogMC42NTsKICAgICAgICBsZXQgbGVnZW5kWSA9IDMwOwogICAgICAgIGN0eC5mb250ID0gJzExcHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZic7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdsZWZ0JzsKICAgICAgICBzbGljZXMuZm9yRWFjaChzID0+IHsKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IHMuY29sb3I7CiAgICAgICAgICAgIGN0eC5maWxsUmVjdChsZWdlbmRYLCBsZWdlbmRZIC0gOCwgMTAsIDEwKTsKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjYzlkMWQ5JzsKICAgICAgICAgICAgY29uc3QgcGN0ID0gKChzLnZhbHVlIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDApOwogICAgICAgICAgICBjdHguZmlsbFRleHQoYCR7Zm9ybWF0V2luQ29uZGl0aW9uKHMua2V5KX0gKCR7cGN0fSUpYCwgbGVnZW5kWCArIDE2LCBsZWdlbmRZKTsKICAgICAgICAgICAgbGVnZW5kWSArPSAxODsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcmF3VHVybkRpc3RyaWJ1dGlvbihnYW1lcywgZGVja3MpIHsKICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWNoYXJ0LXR1cm5zJyk7CiAgICAgICAgaWYgKCFjYW52YXMpIHJldHVybjsKICAgICAgICBj' +
'b25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICBjb25zdCB3ID0gY2FudmFzLndpZHRoLCBoID0gY2FudmFzLmhlaWdodDsKICAgICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpOwoKICAgICAgICBpZiAoZ2FtZXMubGVuZ3RoID09PSAwKSByZXR1cm47CgogICAgICAgIGNvbnN0IHBhZCA9IHsgdG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDUwLCBsZWZ0OiA1MCB9OwogICAgICAgIGNvbnN0IGNoYXJ0VyA9IHcgLSBwYWQubGVmdCAtIHBhZC5yaWdodDsKICAgICAgICBjb25zdCBjaGFydEggPSBoIC0gcGFkLnRvcCAtIHBhZC5ib3R0b207CgogICAgICAgIC8vIEJ1aWxkIGhpc3RvZ3JhbSBidWNrZXRzCiAgICAgICAgY29uc3QgdHVybnMgPSBnYW1lcy5tYXAoZyA9PiBnLnRvdGFsVHVybnMpOwogICAgICAgIGNvbnN0IG1pblQgPSBNYXRoLm1pbiguLi50dXJucyk7CiAgICAgICAgY29uc3QgbWF4VCA9IE1hdGgubWF4KC4uLnR1cm5zKTsKICAgICAgICBjb25zdCBidWNrZXRTaXplID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKChtYXhUIC0gbWluVCArIDEpIC8gMTUpKTsKICAgICAgICBjb25zdCBidWNrZXRzID0gW107CiAgICAgICAgZm9yIChsZXQgdCA9IG1pblQ7IHQgPD0gbWF4VDsgdCArPSBidWNrZXRTaXplKSB7CiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdHVybnMuZmlsdGVyKHYgPT4gdiA+PSB0ICYmIHYgPCB0ICsgYnVja2V0U2l6ZSkubGVuZ3RoOwogICAgICAgICAgICBidWNrZXRzLnB1c2goeyBsYWJlbDogYnVja2V0U2l6ZSA9PT0gMSA/ICcnICsgdCA6IHQgKyAnLScgKyAodCArIGJ1Y2tldFNpemUgLSAxKSwgY291bnQgfSk7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBtYXhDb3VudCA9IE1hdGgubWF4KC4uLmJ1Y2tldHMubWFwKGIgPT4gYi5jb3VudCkpOwogICAgICAgIGNvbnN0IGJhclcgPSBNYXRoLm1heCg0LCBjaGFydFcgLyBidWNrZXRzLmxlbmd0aCAtIDIpOwoKICAgICAgICAvLyBBeGVzCiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJyMzMDM2M2QnOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICBjdHgubW92ZVRvKHBhZC5sZWZ0LCBwYWQudG9wKTsKICAgICAgICBjdHgubGluZVRvKHBhZC5sZWZ0LCBoIC0gcGFkLmJvdHRvbSk7CiAgICAgICAgY3R4LmxpbmVUbyh3IC0gcGFkLnJpZ2h0LCBoIC0gcGFkLmJvdHRvbSk7CiAgICAgICAgY3R4LnN0cm9rZSgpOwoKICAgICAgICAvLyBZLWF4aXMKICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM4Yjk0OWUnOwogICAgICAgIGN0eC5mb250ID0gJzEwcHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZic7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdyaWdodCc7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gNDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHZhbCA9IE1hdGgucm91bmQobWF4Q291bnQgKiBpIC8gNCk7CiAgICAgICAgICAgIGNvbnN0IHkgPSBoIC0gcGFkLmJvdHRvbSAtIChpIC8gNCkgKiBjaGFydEg7CiAgICAgICAgICAgIGN0eC5maWxsVGV4dCh2YWwsIHBhZC5sZWZ0IC0gOCwgeSArIDMpOwogICAgICAgIH0KCiAgICAgICAgLy8gQmFycwogICAgICAgIGJ1Y2tldHMuZm9yRWFjaCgoYiwgaSkgPT4gewogICAgICAgICAgICBjb25zdCB4ID0gcGFkLmxlZnQgKyBpICogKGNoYXJ0VyAvIGJ1Y2tldHMubGVuZ3RoKSArIDE7CiAgICAgICAgICAgIGNvbnN0IGJhckggPSBtYXhDb3VudCA+IDAgPyAoYi5jb3VudCAvIG1heENvdW50KSAqIGNoYXJ0SCA6IDA7CiAgICAgICAgICAgIGNvbnN0IHkgPSBoIC0gcGFkLmJvdHRvbSAtIGJhckg7CgogICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM1OGE2ZmYnOwogICAgICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSAwLjg7CiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICAgICAgcm91bmRSZWN0KGN0eCwgeCwgeSwgYmFyVywgYmFySCwgMik7CiAgICAgICAgICAgIGN0eC5maWxsKCk7CiAgICAgICAgICAgIGN0eC5nbG9iYWxBbHBoYSA9IDE7CgogICAgICAgICAgICAvLyBMYWJlbAogICAgICAgICAgICBpZiAoYnVja2V0cy5sZW5ndGggPD0gMjApIHsKICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzhiOTQ5ZSc7CiAgICAgICAgICAgICAgICBjdHguZm9udCA9ICc5cHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZic7CiAgICAgICAgICAgICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7CiAgICAgICAgICAgICAgICBjdHgu' +
'ZmlsbFRleHQoYi5sYWJlbCwgeCArIGJhclcgLyAyLCBoIC0gcGFkLmJvdHRvbSArIDE0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBYLWF4aXMgbGFiZWwKICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM4Yjk0OWUnOwogICAgICAgIGN0eC5mb250ID0gJzExcHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZic7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInOwogICAgICAgIGN0eC5maWxsVGV4dCgnVHVybnMnLCB3IC8gMiwgaCAtIDYpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRyYXdXaW5SYXRlVHJlbmQoZ2FtZXMsIGRlY2tzKSB7CiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1jaGFydC13aW50cmVuZCcpOwogICAgICAgIGlmICghY2FudmFzKSByZXR1cm47CiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CiAgICAgICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aCwgaCA9IGNhbnZhcy5oZWlnaHQ7CiAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3LCBoKTsKCiAgICAgICAgaWYgKGdhbWVzLmxlbmd0aCA8IDIpIHJldHVybjsKCiAgICAgICAgY29uc3QgcGFkID0geyB0b3A6IDIwLCByaWdodDogMjAsIGJvdHRvbTogNTAsIGxlZnQ6IDUwIH07CiAgICAgICAgY29uc3QgY2hhcnRXID0gdyAtIHBhZC5sZWZ0IC0gcGFkLnJpZ2h0OwogICAgICAgIGNvbnN0IGNoYXJ0SCA9IGggLSBwYWQudG9wIC0gcGFkLmJvdHRvbTsKCiAgICAgICAgLy8gQ29tcHV0ZSBjdW11bGF0aXZlIHdpbiByYXRlIGZvciBlYWNoIHNlYXQKICAgICAgICBjb25zdCBzZWF0V2lucyA9IFswLCAwLCAwXTsKICAgICAgICBjb25zdCBzZWF0UmF0ZXMgPSBbW10sIFtdLCBbXV07CgogICAgICAgIC8vIFNhbXBsZSBwb2ludHMgKGRvbid0IHBsb3QgZXZlcnkgZ2FtZSBmb3IgbGFyZ2UgYmF0Y2hlcykKICAgICAgICBjb25zdCBzdGVwID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihnYW1lcy5sZW5ndGggLyAxMDApKTsKCiAgICAgICAgZ2FtZXMuZm9yRWFjaCgoZywgZ2kpID0+IHsKICAgICAgICAgICAgaWYgKGcud2lubmluZ1NlYXQgIT09IG51bGwgJiYgZy53aW5uaW5nU2VhdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBzZWF0V2luc1tnLndpbm5pbmdTZWF0XSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChnaSAlIHN0ZXAgPT09IDAgfHwgZ2kgPT09IGdhbWVzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBnaSArIDE7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IDM7IHMrKykgewogICAgICAgICAgICAgICAgICAgIHNlYXRSYXRlc1tzXS5wdXNoKHsgeDogZ2ksIHk6IHNlYXRXaW5zW3NdIC8gbiB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBBeGVzCiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJyMzMDM2M2QnOwogICAgICAgIGN0eC5iZWdpblBhdGgoKTsKICAgICAgICBjdHgubW92ZVRvKHBhZC5sZWZ0LCBwYWQudG9wKTsKICAgICAgICBjdHgubGluZVRvKHBhZC5sZWZ0LCBoIC0gcGFkLmJvdHRvbSk7CiAgICAgICAgY3R4LmxpbmVUbyh3IC0gcGFkLnJpZ2h0LCBoIC0gcGFkLmJvdHRvbSk7CiAgICAgICAgY3R4LnN0cm9rZSgpOwoKICAgICAgICAvLyBZLWF4aXMgbGFiZWxzCiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjOGI5NDllJzsKICAgICAgICBjdHguZm9udCA9ICcxMHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYnOwogICAgICAgIGN0eC50ZXh0QWxpZ24gPSAncmlnaHQnOwogICAgICAgIGZvciAobGV0IHBjdCA9IDA7IHBjdCA8PSAxMDA7IHBjdCArPSAyNSkgewogICAgICAgICAgICBjb25zdCB5ID0gaCAtIHBhZC5ib3R0b20gLSAocGN0IC8gMTAwKSAqIGNoYXJ0SDsKICAgICAgICAgICAgY3R4LmZpbGxUZXh0KHBjdCArICclJywgcGFkLmxlZnQgLSA4LCB5ICsgMyk7CiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdyZ2JhKDQ4LDU0LDYxLDAuMyknOwogICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIGN0eC5tb3ZlVG8ocGFkLmxlZnQsIHkpOwogICAgICAgICAgICBjdHgubGluZVRvKHcgLSBwYWQucmlnaHQsIHkpOwogICAgICAgICAgICBjdHguc3Ryb2tlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBMaW5lcwogICAgICAgIGNvbnN0IG1heFggPSBnYW1lcy5sZW5ndGggLSAx' +
'OwogICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgMzsgcysrKSB7CiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IHNlYXRSYXRlc1tzXTsKICAgICAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSBjb250aW51ZTsKCiAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFNFQVRfQ09MT1JTW3NdOwogICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMjsKICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpOwogICAgICAgICAgICBwb2ludHMuZm9yRWFjaCgocCwgcGkpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHB4ID0gcGFkLmxlZnQgKyAocC54IC8gbWF4WCkgKiBjaGFydFc7CiAgICAgICAgICAgICAgICBjb25zdCBweSA9IGggLSBwYWQuYm90dG9tIC0gcC55ICogY2hhcnRIOwogICAgICAgICAgICAgICAgaWYgKHBpID09PSAwKSBjdHgubW92ZVRvKHB4LCBweSk7CiAgICAgICAgICAgICAgICBlbHNlIGN0eC5saW5lVG8ocHgsIHB5KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGN0eC5zdHJva2UoKTsKICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDE7CiAgICAgICAgfQoKICAgICAgICAvLyBMZWdlbmQKICAgICAgICBjdHguZm9udCA9ICcxMHB4IC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWYnOwogICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7CiAgICAgICAgZm9yIChsZXQgcyA9IDA7IHMgPCAzOyBzKyspIHsKICAgICAgICAgICAgY29uc3QgbHggPSBwYWQubGVmdCArIDEwICsgcyAqIDEyMDsKICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFNFQVRfQ09MT1JTW3NdOwogICAgICAgICAgICBjdHguZmlsbFJlY3QobHgsIHBhZC50b3AgKyAyLCAxMiwgMyk7CiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzhiOTQ5ZSc7CiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gKGRlY2tzW3NdPy5jb21tYW5kZXJOYW1lIHx8IGRlY2tzW3NdPy5kZWNrTmFtZSB8fCAnRGVjayAnICsgKHMgKyAxKSkuc3Vic3RyaW5nKDAsIDE0KTsKICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGxhYmVsLCBseCArIDE2LCBwYWQudG9wICsgNyk7CiAgICAgICAgfQoKICAgICAgICAvLyBYLWF4aXMgbGFiZWwKICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM4Yjk0OWUnOwogICAgICAgIGN0eC5mb250ID0gJzExcHggLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZic7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInOwogICAgICAgIGN0eC5maWxsVGV4dCgnR2FtZXMgUGxheWVkJywgdyAvIDIsIGggLSA2KTsKICAgIH0KCiAgICBmdW5jdGlvbiByb3VuZFJlY3QoY3R4LCB4LCB5LCB3LCBoLCByKSB7CiAgICAgICAgaWYgKGggPD0gMCkgeyBjdHgucmVjdCh4LCB5LCB3LCAwKTsgcmV0dXJuOyB9CiAgICAgICAgciA9IE1hdGgubWluKHIsIGggLyAyLCB3IC8gMik7CiAgICAgICAgY3R4Lm1vdmVUbyh4ICsgciwgeSk7CiAgICAgICAgY3R4LmFyY1RvKHggKyB3LCB5LCB4ICsgdywgeSArIGgsIHIpOwogICAgICAgIGN0eC5hcmNUbyh4ICsgdywgeSArIGgsIHgsIHkgKyBoLCByKTsKICAgICAgICBjdHguYXJjVG8oeCwgeSArIGgsIHgsIHksIHIpOwogICAgICAgIGN0eC5hcmNUbyh4LCB5LCB4ICsgdywgeSwgcik7CiAgICB9CgogICAgLy8g4pSA4pSAIEhlYWQtdG8tSGVhZCBNYXRyaXgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gcmVuZGVySGVhZFRvSGVhZChyZXN1bHQpIHsKICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItaDJoLW1hdHJpeCcpOwogICAgICAgIGlmICghZWwpIHJldHVybjsKCiAgICAgICAgY29uc3QgZ2FtZXMgPSByZXN1bHQuZ2FtZXMgfHwgW107CiAgICAgICAgY29uc3QgZGVja3MgPSByZXN1bHQuZGVja3MgfHwgW107CiAgICAgICAgaWYgKGdhbWVzLmxlbmd0aCA9PT0gMCkgeyBlbC5pbm5lckhUTUwgPSAnPHAgY2xhc3M9ImxhYi1uby1kYXRhIj5ObyBnYW1lIGRhdGE8L3A+JzsgcmV0dXJuOyB9CgogICAgICAgIC8vIENvbXB1dGUgcGFpcndpc2U6IGZvciBlYWNoIHBhaXIgKEEsIEIpLCBob3cgb2Z0ZW4gZGlkIEEgd2luIHdoZW4gYm90aCB3ZXJlIGluIHRoZSBnYW1lIChhbHdheXMg4oCUIDMtcGxheWVyIHBvZCkKICAgICAgICAvLyBTaG93OiB3aGVuIGRlY2sgQSB3aW5zLCB3aGF0ICUgb2YgdGhvc2UgZ2FtZXMgdnMgZWFj' +
'aCBvcHBvbmVudAogICAgICAgIC8vIEJldHRlciBtZXRyaWM6IEZvciBlYWNoIHBhaXIsIGNvdW50IGdhbWVzIHdoZXJlIEEgd2lucyBhbmQgQiBkb2Vzbid0IChhbmQgdmljZSB2ZXJzYSkKICAgICAgICBjb25zdCBuID0gZGVja3MubGVuZ3RoOwogICAgICAgIGNvbnN0IGgyaCA9IEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKCkgPT4gQXJyYXkobikuZmlsbCgwKSk7CiAgICAgICAgY29uc3QgcGFpckdhbWVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoKSA9PiBBcnJheShuKS5maWxsKDApKTsKCiAgICAgICAgZ2FtZXMuZm9yRWFjaChnID0+IHsKICAgICAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBuOyBhKyspIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgbjsgYisrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIHBhaXJHYW1lc1thXVtiXSsrOwogICAgICAgICAgICAgICAgICAgIGlmIChnLndpbm5pbmdTZWF0ID09PSBhKSBoMmhbYV1bYl0rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBsZXQgaHRtbCA9ICc8dGFibGUgY2xhc3M9ImxhYi1oMmgtdGFibGUiPjx0aGVhZD48dHI+PHRoIGNsYXNzPSJsYWItaDJoLWNvcm5lciI+dnM8L3RoPic7CiAgICAgICAgZGVja3MuZm9yRWFjaCgoZCwgaSkgPT4gewogICAgICAgICAgICBjb25zdCBuYW1lID0gKGQuY29tbWFuZGVyTmFtZSB8fCBkLmRlY2tOYW1lIHx8ICdEZWNrICcgKyAoaSArIDEpKS5zdWJzdHJpbmcoMCwgMTgpOwogICAgICAgICAgICBodG1sICs9IGA8dGggc3R5bGU9ImNvbG9yOiR7U0VBVF9DT0xPUlNbaV19Ij4ke2VzY2FwZUh0bWwobmFtZSl9PC90aD5gOwogICAgICAgIH0pOwogICAgICAgIGh0bWwgKz0gJzwvdHI+PC90aGVhZD48dGJvZHk+JzsKCiAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBuOyBhKyspIHsKICAgICAgICAgICAgY29uc3QgbmFtZSA9IChkZWNrc1thXS5jb21tYW5kZXJOYW1lIHx8IGRlY2tzW2FdLmRlY2tOYW1lIHx8ICdEZWNrICcgKyAoYSArIDEpKS5zdWJzdHJpbmcoMCwgMTgpOwogICAgICAgICAgICBodG1sICs9IGA8dHI+PHRkIGNsYXNzPSJsYWItaDJoLXJvdy1sYWJlbCIgc3R5bGU9ImNvbG9yOiR7U0VBVF9DT0xPUlNbYV19Ij4ke2VzY2FwZUh0bWwobmFtZSl9PC90ZD5gOwogICAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IG47IGIrKykgewogICAgICAgICAgICAgICAgaWYgKGEgPT09IGIpIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8dGQgY2xhc3M9ImxhYi1oMmgtc2VsZiI+4oCUPC90ZD4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB3aW5zID0gaDJoW2FdW2JdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gcGFpckdhbWVzW2FdW2JdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhdGUgPSB0b3RhbCA+IDAgPyAod2lucyAvIHRvdGFsICogMTAwKS50b0ZpeGVkKDEpIDogJzAuMCc7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF0ZU51bSA9IHRvdGFsID4gMCA/IHdpbnMgLyB0b3RhbCA6IDA7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xzID0gcmF0ZU51bSA+IDAuNSA/ICdsYWItaDJoLXdpbm5pbmcnIDogcmF0ZU51bSA8IDAuMyA/ICdsYWItaDJoLWxvc2luZycgOiAnJzsKICAgICAgICAgICAgICAgICAgICBodG1sICs9IGA8dGQgY2xhc3M9ImxhYi1oMmgtY2VsbCAke2Nsc30iPiR7cmF0ZX0lPHNwYW4gY2xhc3M9ImxhYi1oMmgtc3ViIj4ke3dpbnN9LyR7dG90YWx9PC9zcGFuPjwvdGQ+YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L3RyPic7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwoKICAgICAgICBodG1sICs9ICc8cCBjbGFzcz0ibGFiLWgyaC1ub3RlIj5SZWFkcyBhczogcm93IGRlY2tcJ3Mgd2luIHJhdGUgaW4gZ2FtZXMgd2hlcmUgY29sdW1uIGRlY2sgYWxzbyBwbGF5ZWQuPC9wPic7CiAgICAgICAgZWwuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0KCiAgICAvLyDilIDilIAgQ29tYmF0IFN0YXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIHJlbmRlckNvbWJhdFN0YXRzKHJlc3VsdCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1jb21iYXQtc3RhdHMnKTsKICAgICAgICBpZiAoIWVsKSByZXR1cm47CgogICAgICAgIGNvbnN0IGdhbWVzID0gcmVzdWx0LmdhbWVzIHx8IFtdOwogICAgICAgIGNvbnN0IGRlY2tzID0gcmVzdWx0LmRlY2tzIHx8IFtdOwogICAgICAgIGlmIChnYW1lcy5sZW5ndGggPT09IDApIHsgZWwuaW5uZXJIVE1MID0gJzxwIGNsYXNzPSJsYWItbm8tZGF0YSI+Tm8gZ2FtZSBkYXRhPC9wPic7IHJldHVybjsgfQoKICAgICAgICAvLyBBZ2dyZWdhdGUgcGVyLXNlYXQgY29tYmF0IHN0YXRzIGZyb20gZ2FtZS1sZXZlbCBwbGF5ZXJSZXN1bHRzCiAgICAgICAgY29uc3Qgc3RhdHMgPSBkZWNrcy5tYXAoKGQsIHNlYXQpID0+IHsKICAgICAgICAgICAgY29uc3QgcHIgPSBnYW1lcy5tYXAoZyA9PiBnLnBsYXllclJlc3VsdHNbc2VhdF0pLmZpbHRlcihCb29sZWFuKTsKICAgICAgICAgICAgY29uc3QgbiA9IHByLmxlbmd0aDsKICAgICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBudWxsOwoKICAgICAgICAgICAgY29uc3Qgc3VtID0gKGZuKSA9PiBwci5yZWR1Y2UoKHMsIHApID0+IHMgKyBmbihwKSwgMCk7CiAgICAgICAgICAgIGNvbnN0IGF2ZyA9IChmbikgPT4gc3VtKGZuKSAvIG47CiAgICAgICAgICAgIGNvbnN0IG1heCA9IChmbikgPT4gTWF0aC5tYXgoLi4ucHIubWFwKGZuKSk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgc2VhdCwKICAgICAgICAgICAgICAgIG5hbWU6IGQuY29tbWFuZGVyTmFtZSB8fCBkLmRlY2tOYW1lIHx8ICdEZWNrICcgKyAoc2VhdCArIDEpLAogICAgICAgICAgICAgICAgYXZnQ21kckRtZzogYXZnKHAgPT4gcC5jb21tYW5kZXJEYW1hZ2VEZWFsdCB8fCAwKSwKICAgICAgICAgICAgICAgIG1heENtZHJEbWc6IG1heChwID0+IHAuY29tbWFuZGVyRGFtYWdlRGVhbHQgfHwgMCksCiAgICAgICAgICAgICAgICBhdmdDbWRyQ2FzdHM6IGF2ZyhwID0+IHAuY29tbWFuZGVyQ2FzdHMgfHwgMCksCiAgICAgICAgICAgICAgICBtYXhDbWRyQ2FzdHM6IG1heChwID0+IHAuY29tbWFuZGVyQ2FzdHMgfHwgMCksCiAgICAgICAgICAgICAgICBhdmdMYW5kczogYXZnKHAgPT4gcC5sYW5kc1BsYXllZCB8fCAwKSwKICAgICAgICAgICAgICAgIGF2Z1NwZWxsczogYXZnKHAgPT4gcC5zcGVsbHNDYXN0IHx8IDApLAogICAgICAgICAgICAgICAgbWF4U3BlbGxzOiBtYXgocCA9PiBwLnNwZWxsc0Nhc3QgfHwgMCksCiAgICAgICAgICAgICAgICBhdmdDcmVhdHVyZXNEZXN0cm95ZWQ6IGF2ZyhwID0+IHAuY3JlYXR1cmVzRGVzdHJveWVkIHx8IDApLAogICAgICAgICAgICAgICAgdG90YWxDcmVhdHVyZXNEZXN0cm95ZWQ6IHN1bShwID0+IHAuY3JlYXR1cmVzRGVzdHJveWVkIHx8IDApLAogICAgICAgICAgICAgICAgYXZnRmluYWxMaWZlOiBhdmcocCA9PiBwLmZpbmFsTGlmZSB8fCAwKSwKICAgICAgICAgICAgfTsKICAgICAgICB9KS5maWx0ZXIoQm9vbGVhbik7CgogICAgICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9ImxhYi1jb21iYXQtZ3JpZCI+JzsKICAgICAgICBzdGF0cy5mb3JFYWNoKHMgPT4gewogICAgICAgICAgICBodG1sICs9IGAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWNvbWJhdC1jYXJkIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jb21iYXQtaGVhZGVyIiBzdHlsZT0iYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCAke1NFQVRfQ09MT1JTW3Muc2VhdF19Ij4KICAgICAgICAgICAgICAgICAgICAke2VzY2FwZUh0bWwocy5uYW1lKX0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWNvbWJhdC1yb3dzIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItY29tYmF0LXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWItY29tYmF0LWljb24iPuKalO+4jzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtbGFiZWwiPkNtZHIgRGFtYWdlIC8gR2FtZTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtdmFsIj4ke3MuYXZnQ21kckRtZy50b0ZpeGVkKDEpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4g' +
'Y2xhc3M9ImxhYi1jb21iYXQtbWF4Ij5tYXggJHtzLm1heENtZHJEbWd9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jb21iYXQtcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtaWNvbiI+8J+RkTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtbGFiZWwiPkNtZHIgQ2FzdHMgLyBHYW1lPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiLWNvbWJhdC12YWwiPiR7cy5hdmdDbWRyQ2FzdHMudG9GaXhlZCgyKX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWItY29tYmF0LW1heCI+bWF4ICR7cy5tYXhDbWRyQ2FzdHN9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jb21iYXQtcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtaWNvbiI+8J+PlO+4jzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtbGFiZWwiPkxhbmRzIC8gR2FtZTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtdmFsIj4ke3MuYXZnTGFuZHMudG9GaXhlZCgxKX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWNvbWJhdC1yb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiLWNvbWJhdC1pY29uIj7inKg8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWItY29tYmF0LWxhYmVsIj5TcGVsbHMgLyBHYW1lPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiLWNvbWJhdC12YWwiPiR7cy5hdmdTcGVsbHMudG9GaXhlZCgxKX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWItY29tYmF0LW1heCI+bWF4ICR7cy5tYXhTcGVsbHN9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYi1jb21iYXQtcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtaWNvbiI+8J+SgDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtbGFiZWwiPkNyZWF0dXJlcyBEZXN0cm95ZWQgLyBHYW1lPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiLWNvbWJhdC12YWwiPiR7cy5hdmdDcmVhdHVyZXNEZXN0cm95ZWQudG9GaXhlZCgxKX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWItY29tYmF0LW1heCI+dG90YWwgJHtzLnRvdGFsQ3JlYXR1cmVzRGVzdHJveWVkfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWItY29tYmF0LXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWItY29tYmF0LWljb24iPuKdpO+4jzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYi1jb21iYXQtbGFiZWwiPkF2ZyBGaW5hbCBMaWZlPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiLWNvbWJhdC12YWwiPiR7cy5hdmdGaW5hbExpZmUudG9GaXhlZCgxKX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+YDsKICAgICAgICB9KTsKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIGVsLmlubmVySFRNTCA9IGh0bWw7CiAgICB9CgogICAgLy8g4pSA4pSAIEdhbWUtYnktR2FtZSBMb2cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgbGV0IGdhbWVMb2dEYXRhID0gW107CgogICAgZnVuY3Rpb24gcmVuZGVyR2FtZUxvZyhyZXN1bHQpIHsKICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVu' +
'dEJ5SWQoJ2xhYi1nYW1lbG9nLXdyYXBwZXInKTsKICAgICAgICBjb25zdCBjb3VudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1nYW1lbG9nLWNvdW50Jyk7CiAgICAgICAgY29uc3QgZmlsdGVySW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWdhbWVsb2ctZmlsdGVyJyk7CiAgICAgICAgaWYgKCF3cmFwcGVyKSByZXR1cm47CgogICAgICAgIGNvbnN0IGdhbWVzID0gcmVzdWx0LmdhbWVzIHx8IFtdOwogICAgICAgIGNvbnN0IGRlY2tzID0gcmVzdWx0LmRlY2tzIHx8IFtdOwoKICAgICAgICBnYW1lTG9nRGF0YSA9IGdhbWVzLm1hcChnID0+IHsKICAgICAgICAgICAgY29uc3Qgd2lubmVyTmFtZSA9IGcud2lubmluZ1NlYXQgIT09IG51bGwgJiYgZy53aW5uaW5nU2VhdCAhPT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICA/IChkZWNrc1tnLndpbm5pbmdTZWF0XT8uY29tbWFuZGVyTmFtZSB8fCBkZWNrc1tnLndpbm5pbmdTZWF0XT8uZGVja05hbWUgfHwgJ0RlY2sgJyArIChnLndpbm5pbmdTZWF0ICsgMSkpCiAgICAgICAgICAgICAgICA6ICdEcmF3JzsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluZGV4OiBnLmdhbWVJbmRleCArIDEsCiAgICAgICAgICAgICAgICB3aW5uZXI6IHdpbm5lck5hbWUsCiAgICAgICAgICAgICAgICB3aW5uaW5nU2VhdDogZy53aW5uaW5nU2VhdCwKICAgICAgICAgICAgICAgIHR1cm5zOiBnLnRvdGFsVHVybnMsCiAgICAgICAgICAgICAgICB3aW5Db25kaXRpb246IGcud2luQ29uZGl0aW9uLAogICAgICAgICAgICAgICAgZWxhcHNlZDogZy5lbGFwc2VkTXMsCiAgICAgICAgICAgICAgICBwbGF5ZXJzOiBnLnBsYXllclJlc3VsdHMubWFwKChwciwgaSkgPT4gKHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAoZGVja3NbaV0/LmNvbW1hbmRlck5hbWUgfHwgZGVja3NbaV0/LmRlY2tOYW1lIHx8ICdEZWNrICcgKyAoaSArIDEpKS5zdWJzdHJpbmcoMCwgMTYpLAogICAgICAgICAgICAgICAgICAgIGxpZmU6IHByLmZpbmFsTGlmZSwKICAgICAgICAgICAgICAgICAgICBzZWF0OiBpLAogICAgICAgICAgICAgICAgICAgIGlzV2lubmVyOiBwci5pc1dpbm5lciwKICAgICAgICAgICAgICAgIH0pKSwKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gV2lyZSB1cCBmaWx0ZXIKICAgICAgICBpZiAoZmlsdGVySW5wdXQpIHsKICAgICAgICAgICAgZmlsdGVySW5wdXQub25pbnB1dCA9ICgpID0+IGZpbHRlckdhbWVMb2coZmlsdGVySW5wdXQudmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgcmVuZGVyR2FtZUxvZ1RhYmxlKGdhbWVMb2dEYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaWx0ZXJHYW1lTG9nKHF1ZXJ5KSB7CiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCkudHJpbSgpOwogICAgICAgIGlmICghcSkgewogICAgICAgICAgICByZW5kZXJHYW1lTG9nVGFibGUoZ2FtZUxvZ0RhdGEpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZ2FtZUxvZ0RhdGEuZmlsdGVyKGcgPT4KICAgICAgICAgICAgZy53aW5uZXIudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fAogICAgICAgICAgICAoZy53aW5Db25kaXRpb24gfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwKICAgICAgICAgICAgZm9ybWF0V2luQ29uZGl0aW9uKGcud2luQ29uZGl0aW9uKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8CiAgICAgICAgICAgIGcucGxheWVycy5zb21lKHAgPT4gcC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpCiAgICAgICAgKTsKICAgICAgICByZW5kZXJHYW1lTG9nVGFibGUoZmlsdGVyZWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckdhbWVMb2dUYWJsZShkYXRhKSB7CiAgICAgICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItZ2FtZWxvZy13cmFwcGVyJyk7CiAgICAgICAgY29uc3QgY291bnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItZ2FtZWxvZy1jb3VudCcpOwogICAgICAgIGlmICghd3JhcHBlcikgcmV0dXJuOwoKICAgICAgICBpZiAoY291bnRFbCkgewogICAgICAgICAgICBjb3VudEVsLnRleHRDb250ZW50ID0gZGF0YS5sZW5ndGggKyAnIGdhbWUnICsgKGRhdGEubGVuZ3RoICE9PSAxID8gJ3MnIDogJycpOwogICAgICAgIH0KCiAgICAgICAgLy8gU2hvdyBtYXggMjAwIHJvd3MsIHBh' +
'Z2luYXRlZAogICAgICAgIGNvbnN0IHBhZ2VTaXplID0gMjAwOwogICAgICAgIGNvbnN0IGRpc3BsYXkgPSBkYXRhLnNsaWNlKDAsIHBhZ2VTaXplKTsKCiAgICAgICAgbGV0IGh0bWwgPSBgPHRhYmxlIGNsYXNzPSJsYWItZ2FtZWxvZy10YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD48dHI+CiAgICAgICAgICAgICAgICA8dGg+IzwvdGg+CiAgICAgICAgICAgICAgICA8dGg+V2lubmVyPC90aD4KICAgICAgICAgICAgICAgIDx0aD5UdXJuczwvdGg+CiAgICAgICAgICAgICAgICA8dGg+V2luIENvbmRpdGlvbjwvdGg+YDsKICAgICAgICAvLyBMaWZlIGNvbHVtbnMgZm9yIGVhY2ggc2VhdAogICAgICAgIGlmIChkaXNwbGF5Lmxlbmd0aCA+IDAgJiYgZGlzcGxheVswXS5wbGF5ZXJzKSB7CiAgICAgICAgICAgIGRpc3BsYXlbMF0ucGxheWVycy5mb3JFYWNoKChwLCBpKSA9PiB7CiAgICAgICAgICAgICAgICBodG1sICs9IGA8dGggc3R5bGU9ImNvbG9yOiR7U0VBVF9DT0xPUlNbaV19Ij4ke2VzY2FwZUh0bWwocC5uYW1lKX08L3RoPmA7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBodG1sICs9ICc8L3RyPjwvdGhlYWQ+PHRib2R5Pic7CgogICAgICAgIGRpc3BsYXkuZm9yRWFjaChnID0+IHsKICAgICAgICAgICAgY29uc3Qgd2luQ29sb3IgPSBnLndpbm5pbmdTZWF0ICE9PSBudWxsICYmIGcud2lubmluZ1NlYXQgIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgPyBTRUFUX0NPTE9SU1tnLndpbm5pbmdTZWF0XSA6ICcjOGI5NDllJzsKICAgICAgICAgICAgaHRtbCArPSBgPHRyPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsYWItZ2wtbnVtIj4ke2cuaW5kZXh9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0iY29sb3I6JHt3aW5Db2xvcn0iPiR7ZXNjYXBlSHRtbChnLndpbm5lcil9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4ke2cudHVybnN9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGFiLWdsLXdjIj4ke2Zvcm1hdFdpbkNvbmRpdGlvbihnLndpbkNvbmRpdGlvbil9PC90ZD5gOwogICAgICAgICAgICBnLnBsYXllcnMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpZmVDbGFzcyA9IHAubGlmZSA8PSAwID8gJ2xhYi1nbC1kZWFkJyA6IHAuaXNXaW5uZXIgPyAnbGFiLWdsLWFsaXZlJyA6ICcnOwogICAgICAgICAgICAgICAgaHRtbCArPSBgPHRkIGNsYXNzPSIke2xpZmVDbGFzc30iPiR7cC5saWZlfTwvdGQ+YDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGh0bWwgKz0gJzwvdHI+JzsKICAgICAgICB9KTsKICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+JzsKCiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gcGFnZVNpemUpIHsKICAgICAgICAgICAgaHRtbCArPSBgPHAgY2xhc3M9ImxhYi1nbC1tb3JlIj5TaG93aW5nICR7cGFnZVNpemV9IG9mICR7ZGF0YS5sZW5ndGh9IGdhbWVzPC9wPmA7CiAgICAgICAgfQoKICAgICAgICB3cmFwcGVyLmlubmVySFRNTCA9IGh0bWw7CiAgICB9CgogICAgLy8g4pSA4pSAIEhpc3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gc2hvd0hpc3RvcnkoKSB7CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWhpc3RvcnktbW9kYWwnKTsKICAgICAgICBjb25zdCBsaXN0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWhpc3RvcnktbGlzdCcpOwogICAgICAgIGlmICghbW9kYWwgfHwgIWxpc3RFbCkgcmV0dXJuOwoKICAgICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICBsaXN0RWwuaW5uZXJIVE1MID0gJ0xvYWRpbmcuLi4nOwoKICAgICAgICBpZiAoIWJhY2tlbmRBdmFpbGFibGUpIHsKICAgICAgICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICc8cCBjbGFzcz0ibGFiLWhpc3RvcnktZW1wdHkiPkhpc3RvcnkgcmVxdWlyZXMgYSBydW5uaW5nIGJhY2tlbmQuPC9wPic7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvbGFiL2hpc3RvcnlgKTsKICAgICAgICAgICAgaWYgKCFyZXMub2spIHRo' +
'cm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgaGlzdG9yeScpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKCiAgICAgICAgICAgIGlmICghZGF0YS5yZXN1bHRzIHx8IGRhdGEucmVzdWx0cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPHAgY2xhc3M9ImxhYi1oaXN0b3J5LWVtcHR5Ij5ObyBwYXN0IHJ1bnMgZm91bmQuPC9wPic7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSBkYXRhLnJlc3VsdHMubWFwKHIgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZGVja0xhYmVscyA9IChyLmRlY2tzIHx8IFtdKS5tYXAoZCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjVGFnID0gZC5zb3VyY2UgPyBgIDxzcGFuIGNsYXNzPSJoaXN0LXNyYyI+WyR7ZC5zb3VyY2V9XTwvc3Bhbj5gIDogJyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2VzY2FwZUh0bWwoZC5uYW1lKX0ke3NyY1RhZ31gOwogICAgICAgICAgICAgICAgfSkuam9pbignLCAnKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gYAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGFiLWhpc3RvcnktaXRlbSIgb25jbGljaz0iQWlMYWIubG9hZEhpc3RvcnlSZXN1bHQoJyR7ci5maWxlbmFtZX0nKSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGlzdG9yeS1iYXRjaC1pZCI+JHtyLmJhdGNoSWR9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGlzdG9yeS1tZXRhIj4KICAgICAgICAgICAgICAgICAgICAgICAgJHtyLnRvdGFsR2FtZXN9IGdhbWVzIMK3ICR7ci50aHJlYWRzfSB0aHJlYWRzIMK3ICR7KHIuZWxhcHNlZE1zLzEwMDApLnRvRml4ZWQoMSl9cwogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imhpc3RvcnktZGVja3MiPiR7ZGVja0xhYmVsc308L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaXN0b3J5LXRpbWUiPiR7bmV3IERhdGUoci50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCl9PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIGA7CiAgICAgICAgICAgIH0pLmpvaW4oJycpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBsaXN0RWwuaW5uZXJIVE1MID0gYDxwIGNsYXNzPSJsYWItaGlzdG9yeS1lbXB0eSI+RXJyb3I6ICR7ZXJyLm1lc3NhZ2V9PC9wPmA7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNsb3NlSGlzdG9yeSgpIHsKICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsYWItaGlzdG9yeS1tb2RhbCcpOwogICAgICAgIGlmIChtb2RhbCkgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3RvcnlSZXN1bHQoZmlsZW5hbWUpIHsKICAgICAgICBjbG9zZUhpc3RvcnkoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBGZXRjaCBmcm9tIHJlc3VsdHMgZGlyZWN0b3J5IHZpYSBBUEkKICAgICAgICAgICAgY29uc3QgYmF0Y2hJZCA9IGZpbGVuYW1lLnJlcGxhY2UoJ2JhdGNoLScsICcnKS5yZXBsYWNlKCcuanNvbicsICcnKTsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9sYWIvcmVzdWx0P2JhdGNoSWQ9JHtiYXRjaElkfWApOwogICAgICAgICAgICBpZiAocmVzLm9rKSB7CiAgICAgICAgICAgICAgICBsYXN0UmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgIGRpc3BsYXlSZXN1bHRzKGxhc3RSZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tBSSBMYWJdIEZhaWxlZCB0byBsb2FkIGhpc3RvcnkgcmVzdWx0OicsIGVycik7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIGZvcm1hdFdpbkNvbmRpdGlvbihrZXkpIHsKICAgICAgICBjb25zdCBtYXAgPSB7CiAg' +
'ICAgICAgICAgIGNvbWJhdF9kYW1hZ2U6ICdDb21iYXQnLAogICAgICAgICAgICBjb21tYW5kZXJfZGFtYWdlOiAnQ21kciBEbWcnLAogICAgICAgICAgICBjb21ib19hbHRfd2luOiAnQ29tYm8nLAogICAgICAgICAgICBsaWZlX2RyYWluOiAnRHJhaW4nLAogICAgICAgICAgICBtaWxsOiAnTWlsbCcsCiAgICAgICAgICAgIGNvbmNlc3Npb246ICdDb25jZWRlJywKICAgICAgICAgICAgdGltZW91dDogJ1RpbWVvdXQnLAogICAgICAgICAgICB1bmtub3duOiAnPz8/JywKICAgICAgICB9OwogICAgICAgIHJldHVybiBtYXBba2V5XSB8fCBrZXk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UnVubmluZyhydW5uaW5nKSB7CiAgICAgICAgaXNSdW5uaW5nID0gcnVubmluZzsKICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXJ1bi1idG4nKTsKICAgICAgICBpZiAoYnRuKSB7CiAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHJ1bm5pbmc7CiAgICAgICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdydW5uaW5nJywgcnVubmluZyk7CiAgICAgICAgICAgIGJ0bi5xdWVyeVNlbGVjdG9yKCcucnVuLXRleHQnKS50ZXh0Q29udGVudCA9IHJ1bm5pbmcgPyAnU2ltdWxhdGluZy4uLicgOiAnUnVuIEFJIFNpbXMnOwogICAgICAgIH0KICAgICAgICBpZiAoIXJ1bm5pbmcpIHsKICAgICAgICAgICAgc3RvcFBvbGxpbmcoKTsKICAgICAgICAgICAgLy8gS2VlcCBwcm9ncmVzcyB2aXNpYmxlIGJyaWVmbHksIHRoZW4gZmFkZQogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLXByb2dyZXNzJyk7CiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NFbCkgcHJvZ3Jlc3NFbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICAgICAgfSwgMzAwMCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNlZWRlZFJhbmRvbShzZWVkKSB7CiAgICAgICAgbGV0IHMgPSBzZWVkIHwgMDsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHMgfD0gMDsgcyA9IHMgKyAweDZEMkI3OUY1IHwgMDsKICAgICAgICAgICAgbGV0IHQgPSBNYXRoLmltdWwocyBeIHMgPj4+IDE1LCAxIHwgcyk7CiAgICAgICAgICAgIHQgPSB0ICsgTWF0aC5pbXVsKHQgXiB0ID4+PiA3LCA2MSB8IHQpIF4gdDsKICAgICAgICAgICAgcmV0dXJuICgodCBeIHQgPj4+IDE0KSA+Pj4gMCkgLyA0Mjk0OTY3Mjk2OwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZXhwb3J0SnNvbigpIHsKICAgICAgICBpZiAoIWxhc3RSZXN1bHQpIHJldHVybjsKICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkobGFzdFJlc3VsdCwgbnVsbCwgMik7CiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtqc29uXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7CiAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIGEuaHJlZiA9IHVybDsKICAgICAgICBhLmRvd25sb2FkID0gYGNvbW1hbmRlci1haS1sYWItJHtsYXN0UmVzdWx0Lm1ldGFkYXRhLmJhdGNoSWR9Lmpzb25gOwogICAgICAgIGEuY2xpY2soKTsKICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICB9CgogICAgZnVuY3Rpb24gZXNjYXBlSHRtbChzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuICcnOwogICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpLnJlcGxhY2UoLyIvZywgJyZxdW90OycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVzY2FwZUF0dHIoc3RyKSB7CiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8nL2csICJcXCciKS5yZXBsYWNlKC8iL2csICdcXCInKTsKICAgIH0KCiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkgewogICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhYi1nYW1lLWNvdW50Jyk7CiAgICAgICAgaWYgKGlucHV0KSB7CiAgICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sYWItcHJlc2V0LWJ0bicpLmZvckVh' +
'Y2goYnRuID0+IHsKICAgICAgICAgICAgICAgICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgcGFyc2VJbnQoYnRuLnRleHRDb250ZW50KSA9PT0gcGFyc2VJbnQoaW5wdXQudmFsdWUpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIENsb3NlIG1vZGFscyBvbiBvdmVybGF5IGNsaWNrCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxhYi1tb2RhbC1vdmVybGF5JykuZm9yRWFjaChtb2RhbCA9PiB7CiAgICAgICAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHsKICAgICAgICAgICAgICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEVudGVyIGtleSBpbiBVUkwgaW1wb3J0CiAgICAgICAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGFiLWltcG9ydC11cmwtaW5wdXQnKTsKICAgICAgICBpZiAodXJsSW5wdXQpIHsKICAgICAgICAgICAgdXJsSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIGltcG9ydEZyb21VcmwoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIHJldHVybiB7CiAgICAgICAgaW5pdCwKICAgICAgICBzZWxlY3REZWNrLAogICAgICAgIHNldEdhbWVDb3VudCwKICAgICAgICBzdGFydEJhdGNoLAogICAgICAgIGV4cG9ydEpzb24sCiAgICAgICAgc2hvd0hpc3RvcnksCiAgICAgICAgY2xvc2VIaXN0b3J5LAogICAgICAgIGxvYWRIaXN0b3J5UmVzdWx0LAogICAgICAgIHRvZ2dsZUxvZywKICAgICAgICBnZXRMYXN0UmVzdWx0OiAoKSA9PiBsYXN0UmVzdWx0LAogICAgICAgIC8vIHYzCiAgICAgICAgc2hvd1VybEltcG9ydCwKICAgICAgICBoaWRlVXJsSW1wb3J0LAogICAgICAgIGltcG9ydEZyb21VcmwsCiAgICAgICAgc2hvd01ldGFQaWNrZXIsCiAgICAgICAgY2xvc2VNZXRhUGlja2VyLAogICAgICAgIGZpbHRlck1ldGFDb21tYW5kZXJzLAogICAgICAgIGZldGNoTWV0YURlY2ssCiAgICAgICAgc2hvd1RleHRJbXBvcnQsCiAgICAgICAgY2xvc2VUZXh0SW1wb3J0LAogICAgICAgIGltcG9ydEZyb21UZXh0LAogICAgICAgIC8vIFByZWNvbiBkZWNrcwogICAgICAgIHNob3dQcmVjb25QaWNrZXIsCiAgICAgICAgY2xvc2VQcmVjb25QaWNrZXIsCiAgICAgICAgZmlsdGVyUHJlY29ucywKICAgICAgICBpbnN0YWxsUHJlY29uLAogICAgICAgIGluc3RhbGxBbGxQcmVjb25zLAogICAgICAgIC8vIHY0IOKAlCBlbmhhbmNlZCByZXN1bHRzCiAgICAgICAgc3dpdGNoVGFiLAogICAgfTsKCn0pKCk7CgovLyBBdXRvLWluaXRpYWxpemUgd2hlbiBET00gaXMgcmVhZHkKaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIEFpTGFiLmluaXQpOwp9IGVsc2UgewogICAgQWlMYWIuaW5pdCgpOwp9Cg=='
Install-B64 -R 'ui\ai-lab.js' -B $b
# ui/coach.css (11,731 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgQ29hY2ggUGFnZQogICBQYWdlLXNwZWNpZmljIHN0eWxlcyBvbmx5OyBzaGFyZWQgdG9rZW5zICYgY29tcG9uZW50cyBpbiBnbG9iYWwuY3NzCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLyog4pSA4pSAIFN0YXR1cyBCYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5jb2FjaC1zdGF0dXMtYmFyIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTUpOwp9CgouY29hY2gtc3RhdHVzLWl0ZW1zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC02KTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLmNvYWNoLXN0YXR1cy1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLnN0YXR1cy1kb3QgewogICAgd2lkdGg6IDhweDsKICAgIGhlaWdodDogOHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5zdGF0dXMtdW5rbm93biB7IGJhY2tncm91bmQ6IHZhcigtLXRleHQtdGVydGlhcnkpOyB9Ci5zdGF0dXMtb2sgICAgICB7IGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOyB9Ci5zdGF0dXMtd2FybiAgICB7IGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmcpOyB9Ci5zdGF0dXMtZXJyb3IgICB7IGJhY2tncm91bmQ6IHZhcigtLWVycm9yKTsgfQoKLnN0YXR1cy1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC13ZWlnaHQ6IDUwMDsKfQoKLnN0YXR1cy12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5jb2FjaC1nZW4tYnRuIHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgouY29hY2gtZ2VuLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjQ7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgovKiDilIDilIAgQ29uZmlnIFBhbmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouY29hY2gtY29uZmlnLWdyaWQgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdhcDogdmFyKC0tc3AtNCk7Cn0KCi5jb2FjaC1maWVsZC13aWRlIHsKICAgIGdyaWQtY29sdW1uOiAxIC8gLTE7Cn0KCi8qIOKUgOKUgCBTbGlkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5jb2FjaC1zbGlkZXItcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKfQoKLmNvYWNoLXNsaWRlci1yb3cgaW5wdXRbdHlwZT0icmFuZ2UiXSB7CiAgICBmbGV4OiAxOwogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgaGVpZ2h0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTMpOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgb3V0bGluZTogbm9uZTsKfQoKLmNvYWNoLXNsaWRlci1yb3cgaW5wdXRbdHlwZT0icmFuZ2Ui' +
'XTo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tc3VyZmFjZS0xKTsKfQoKLmNvYWNoLXNsaWRlci1yb3cgaW5wdXRbdHlwZT0icmFuZ2UiXTo6LW1vei1yYW5nZS10aHVtYiB7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1zdXJmYWNlLTEpOwp9CgouY29hY2gtc2xpZGVyLXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIG1pbi13aWR0aDogMzBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5jb2FjaC1oaW50IHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXRlcnRpYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLyog4pSA4pSAIEZvY3VzIFRhZ3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5jb2FjaC1mb2N1cy10YWdzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IHZhcigtLXNwLTIpOwp9CgouY29hY2gtdGFnIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXhsKTsKICAgIHBhZGRpbmc6IDVweCB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSksCiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwOwp9CgouY29hY2gtdGFnOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmNvYWNoLXRhZyBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmNvYWNoLXRhZzpoYXMoaW5wdXQ6Y2hlY2tlZCkgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7Cn0KCi8qIOKUgOKUgCBSdW4gQnV0dG9uIFJvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmNvYWNoLXJ1bi1yb3cgewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtNSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtNCk7Cn0KCi5jb2FjaC1ydW4taWNvbiB7CiAgICBmb250LXNpemU6IDE2cHg7Cn0KCi5jb2FjaC1ydW4taGludCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgovKiDilIDilIAgUHJvZ3Jlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5jb2FjaC1wcm9ncmVzcyB7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC00KTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGln' +
'bi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItZm9jdXMpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKfQoKI2NvYWNoLXByb2dyZXNzLXRleHQgewogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBmb250LXNpemU6IDE0cHg7Cn0KCi8qIOKUgOKUgCBSZXN1bHRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouY29hY2gtcmVzdWx0cyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogdmFyKC0tc3AtNCk7CiAgICBhbmltYXRpb246IGNvYWNoLWZhZGVJbiAwLjNzIHZhcigtLWVhc2UpOwp9CgpAa2V5ZnJhbWVzIGNvYWNoLWZhZGVJbiB7CiAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH0KICAgIHRvICAgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0KfQoKLyog4pSA4pSAIFN1bW1hcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5jb2FjaC1zdW1tYXJ5LXRleHQgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDEuNzsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmNvYWNoLW1ldGEtcm93IHsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTMpOwogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtNCk7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5jb2FjaC1tZXRhLWNoaXAgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMteGwpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMSkgdmFyKC0tc3AtMyk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29hY2gtbWV0YS1jaGlwIHN0cm9uZyB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi8qIOKUgOKUgCBCYWRnZXMgKGN1dHMvYWRkcyBjb3VudHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouY29hY2gtYmFkZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwogICAgY29sb3I6IHZhcigtLWVycm9yKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAycHggdmFyKC0tc3AtMik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgbWluLXdpZHRoOiAyNHB4Owp9CgouY29hY2gtYmFkZ2UtZ3JlZW4gewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcy1kaW0pOwogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgouY29hY2gtY2FyZC1oaW50IHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKfQoKLyog4pSA4pSAIFRhYmxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmNvYWNoLXRhYmxlLXdyYXAgewogICAgb3ZlcmZsb3cteDogYXV0bzsKfQoKLmNvYWNoLXRoLWNoZWNrIHsKICAgIHdpZHRoOiAzNnB4Owp9CgouY29hY2gtdGFibGUgaW5wdXRbdHlwZT0i' +
'Y2hlY2tib3giXSB7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2FjaC1jYXJkLW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwp9CgouY29hY2gtcmVwbGFjZW1lbnRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IHZhcigtLXNwLTEpOwp9CgouY29hY2gtcmVwbGFjZW1lbnQtY2hpcCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBwYWRkaW5nOiAycHggdmFyKC0tc3AtMik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmNvYWNoLXN5bmVyZ3ktY2hpcCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wdXJwbGUtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1wdXJwbGUpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgcGFkZGluZzogMnB4IHZhcigtLXNwLTIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5jb2FjaC1yb2xlLWJhZGdlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBwYWRkaW5nOiAycHggdmFyKC0tc3AtMik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5jb2FjaC1pbXBhY3QgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5jb2FjaC1pbXBhY3QtbmVnYXRpdmUgeyBjb2xvcjogdmFyKC0tZXJyb3IpOyB9Ci5jb2FjaC1pbXBhY3QtcG9zaXRpdmUgeyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IH0KLmNvYWNoLWltcGFjdC1uZXV0cmFsICB7IGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7IH0KCi8qIOKUgOKUgCBIaW50cyBMaXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouY29hY2gtaGludHMtbGlzdCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IHZhcigtLXNwLTIpOwp9CgouY29hY2gtaGludHMtbGlzdCBsaSB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7CiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLXB1cnBsZSk7CiAgICBib3JkZXItcmFkaXVzOiAwIHZhcigtLXJhZGl1cy1zbSkgdmFyKC0tcmFkaXVzLXNtKSAwOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLyog4pSA4pSAIE1hbmEgQWR2aWNlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouY29hY2gtbWFuYS10ZXh0IHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjc7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi8qIOKUgOKUgCBSYXcgUmVzcG9uc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5jb2FjaC1yYXctZGV0YWlscyB7CiAgICBwYWRkaW5nOiAwOwp9CgouY29hY2gtcmF3LWRldGFpbHMgc3VtbWFyeSB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC01KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNTAwOwp9CgouY29hY2gtcmF3LWRldGFpbHMgc3VtbWFyeTpob3ZlciB7CiAg' +
'ICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5jb2FjaC1yYXctdGV4dCB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC00KTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS42OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87Cn0KCi8qIOKUgOKUgCBQYXN0IFNlc3Npb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouY29hY2gtc2Vzc2lvbnMtbGlzdCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5jb2FjaC1lbXB0eSB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC10ZXJ0aWFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSAwOwp9CgouY29hY2gtc2Vzc2lvbi1pdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0wKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmNvYWNoLXNlc3Npb24taXRlbTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWJvcmRlci1mb2N1cyk7Cn0KCi5jb2FjaC1zZXNzaW9uLWRlY2sgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgbWluLXdpZHRoOiAxNDBweDsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLmNvYWNoLXNlc3Npb24tc3VtbWFyeSB7CiAgICBmbGV4OiAxOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5jb2FjaC1zZXNzaW9uLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouY29hY2gtc2Vzc2lvbi1jdXRzIHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouY29hY2gtc2Vzc2lvbi1hZGRzIHsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5jb2FjaC1zZXNzaW9uLXRpbWUgewogICAgY29sb3I6IHZhcigtLXRleHQtdGVydGlhcnkpOwogICAgZm9udC1zaXplOiAxMXB4Owp9CgovKiDilIDilIAgRXJyb3IgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5jb2FjaC1lcnJvciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tZXJyb3IpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTQpOwogICAgY29sb3I6IHZhcigtLWVycm9yKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTQpOwp9CgovKiDilIDilIAgUmVzcG9uc2l2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' +
'lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAuY29hY2gtY29uZmlnLWdyaWQgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5jb2FjaC1zdGF0dXMtaXRlbXMgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIH0KCiAgICAuY29hY2gtZ2VuLWJ0biB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICB9CgogICAgLmNvYWNoLXNlc3Npb24taXRlbSB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIH0KCiAgICAuY29hY2gtc2Vzc2lvbi1zdW1tYXJ5IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgfQp9Cg=='
Install-B64 -R 'ui\coach.css' -B $b
# ui/coach.html (10,320 bytes)
$b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgPHRpdGxlPkNvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgQ29hY2g8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIiAvPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbiAvPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs1MDA7NjAwOzcwMCZkaXNwbGF5PXN3YXAiIHJlbD0ic3R5bGVzaGVldCIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZ2xvYmFsLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29hY2guY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PgogICAgPHNjcmlwdCBzcmM9Im5hdi5qcyI+PC9zY3JpcHQ+CiAgICA8ZGl2IGNsYXNzPSJwYWdlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CiAgICAgICAgICAgIDxoMT5EZWNrIENvYWNoPC9oMT4KICAgICAgICAgICAgPHA+TExNLXBvd2VyZWQgZGVjayBhbmFseXNpcyAmYW1wOyBpbXByb3ZlbWVudCBzdWdnZXN0aW9uczwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSBTdGF0dXMgQmFyIC0tPgogICAgICAgIDxzZWN0aW9uIGNsYXNzPSJwYW5lbCBjb2FjaC1zdGF0dXMtYmFyIiBpZD0iY29hY2gtc3RhdHVzLWJhciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvYWNoLXN0YXR1cy1pdGVtcyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2FjaC1zdGF0dXMtaXRlbSIgaWQ9InN0YXR1cy1sbG0iPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0dXMtZG90IHN0YXR1cy11bmtub3duIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXR1cy1sYWJlbCI+TE0gU3R1ZGlvPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0dXMtdmFsdWUiIGlkPSJzdGF0dXMtbGxtLXZhbHVlIj5DaGVja2luZy4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29hY2gtc3RhdHVzLWl0ZW0iIGlkPSJzdGF0dXMtZW1iZWRkaW5ncyI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXR1cy1kb3Qgc3RhdHVzLXVua25vd24iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RhdHVzLWxhYmVsIj5FbWJlZGRpbmdzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0dXMtdmFsdWUiIGlkPSJzdGF0dXMtZW1iZWRkaW5ncy12YWx1ZSI+Q2hlY2tpbmcuLi48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvYWNoLXN0YXR1cy1pdGVtIiBpZD0ic3RhdHVzLXJlcG9ydHMiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0dXMtZG90IHN0YXR1cy11bmtub3duIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0YXR1cy1sYWJlbCI+RGVjayBSZXBvcnRzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGF0dXMtdmFsdWUiIGlkPSJzdGF0dXMtcmVwb3J0cy12YWx1ZSI+Q2hlY2tpbmcuLi48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImdlbmVyYXRlLXJlcG9ydHMtYnRuIiBjbGFzcz0iYnRuIGJ0bi1wdXJwbGUgYnRuLXNtIGNvYWNoLWdlbi1idG4iIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiB0aXRsZT0iQnVpbGQgZGVjayByZXBvcnRzIGZyb20gc2ltdWxhdGlvbiByZXN1bHRzIj4KICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBSZXBvcnRzCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8IS0tIENvbmZpZyBQYW5lbCAtLT4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0icGFuZWwgY29hY2gtY29uZmlnIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVh' +
'ZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5Db2FjaGluZyBTZXNzaW9uPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvYWNoLWNvbmZpZy1ncmlkIj4KICAgICAgICAgICAgICAgIDwhLS0gRGVjayBTZWxlY3RvciAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY29hY2gtZmllbGQtd2lkZSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWxhYmVsIiBmb3I9ImNvYWNoLWRlY2stc2VsZWN0Ij5EZWNrPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJjb2FjaC1kZWNrLXNlbGVjdCIgY2xhc3M9ImZvcm0tc2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4tLSBTZWxlY3QgYSBkZWNrIC0tPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8IS0tIFBvd2VyIExldmVsIFNsaWRlciAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCIgZm9yPSJjb2FjaC1wb3dlci1sZXZlbCI+VGFyZ2V0IFBvd2VyIExldmVsPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2FjaC1zbGlkZXItcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhbmdlIiBpZD0iY29hY2gtcG93ZXItbGV2ZWwiIG1pbj0iMSIgbWF4PSIxMCIgdmFsdWU9IjciIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2FjaC1zbGlkZXItdmFsdWUiIGlkPSJjb2FjaC1wb3dlci12YWx1ZSI+Nzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29hY2gtaGludCI+MSA9IGNhc3VhbCBqYW5rICZtaWRkb3Q7IDEwID0gY0VESDwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gTWV0YSBGb2N1cyAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCIgZm9yPSJjb2FjaC1tZXRhLWZvY3VzIj5NZXRhIEZvY3VzPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJjb2FjaC1tZXRhLWZvY3VzIiBjbGFzcz0iZm9ybS1zZWxlY3QiPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPkFueSAvIEJhbGFuY2VkPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImFnZ3JvIj5BZ2dybzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJtaWRyYW5nZSI+TWlkcmFuZ2U8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iY29udHJvbCI+Q29udHJvbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJjb21ibyI+Q29tYm88L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ic3RheCI+U3RheDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPCEtLSBCdWRnZXQgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0iY29hY2gtYnVkZ2V0Ij5CdWRnZXQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImNvYWNoLWJ1ZGdldCIgY2xhc3M9ImZvcm0tc2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj5ObyBMaW1pdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJidWRnZXQiPkJ1ZGdldCAoJmx0OyAkMiBwZXIgY2FyZCk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibWVkaXVtIj5NZWRpdW0gKCZsdDsgJDEwIHBlciBjYXJkKTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJuby1saW1pdCI+Tm8gTGltaXQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8L3NlbGVj' +
'dD4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gRm9jdXMgQXJlYXMgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIGNvYWNoLWZpZWxkLXdpZGUiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCI+Rm9jdXMgQXJlYXMgKG9wdGlvbmFsKTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29hY2gtZm9jdXMtdGFncyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29hY2gtdGFnIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSJyYW1wIiAvPiBSYW1wPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2FjaC10YWciPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9ImNhcmQgZHJhdyIgLz4gQ2FyZCBEcmF3PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2FjaC10YWciPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9InJlbW92YWwiIC8+IFJlbW92YWw8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvYWNoLXRhZyI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iYm9hcmQgd2lwZXMiIC8+IEJvYXJkIFdpcGVzPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2FjaC10YWciPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9Im1hbmEgYmFzZSIgLz4gTWFuYSBCYXNlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2FjaC10YWciPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9IndpbiBjb25kaXRpb25zIiAvPiBXaW4gQ29uczwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29hY2gtdGFnIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlPSJwcm90ZWN0aW9uIiAvPiBQcm90ZWN0aW9uPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2FjaC10YWciPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgdmFsdWU9InJlY3Vyc2lvbiIgLz4gUmVjdXJzaW9uPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gUnVuIEJ1dHRvbiAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29hY2gtcnVuLXJvdyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJjb2FjaC1ydW4tYnRuIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGJ0bi1sZyIgZGlzYWJsZWQ+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvYWNoLXJ1bi1pY29uIj4mIzk4ODk7PC9zcGFuPiBSdW4gQ29hY2gKICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvYWNoLXJ1bi1oaW50IiBpZD0iY29hY2gtcnVuLWhpbnQiPlNlbGVjdCBhIGRlY2sgdG8gYmVnaW48L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyAtLT4KICAgICAgICAgICAgPGRpdiBpZD0iY29hY2gtcHJvZ3Jlc3MiIGNsYXNzPSJjb2FjaC1wcm9ncmVzcyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8c3BhbiBpZD0iY29hY2gtcHJvZ3Jlc3MtdGV4dCI+QW5hbHl6aW5nIGRlY2sgYW5kIGNvbnN1bHRpbmcgTExNLi4uPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgIDwhLS0gUmVzdWx0cyBTZWN0aW9uIC0tPgogICAgICAgIDxzZWN0aW9uIGlkPSJjb2FjaC1yZXN1bHRzIiBjbGFzcz0iY29hY2gtcmVzdWx0cyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgoKICAgICAgICAgICAgPCEtLSBTdW1tYXJ5IENhcmQgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsIiBpZD0iY29hY2gtc3VtbWFyeS1jYXJkIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPkNvYWNoIFN1bW1hcnk8L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8cCBpZD0iY29hY2gtc3VtbWFyeS10ZXh0IiBjbGFzcz0iY29hY2gtc3VtbWFyeS10ZXh0Ij48L3A+' +
'CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2FjaC1tZXRhLXJvdyIgaWQ9ImNvYWNoLW1ldGEtcm93Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIFN1Z2dlc3RlZCBDdXRzIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbCIgaWQ9ImNvYWNoLWN1dHMtY2FyZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5TdWdnZXN0ZWQgQ3V0cyA8c3BhbiBjbGFzcz0iY29hY2gtYmFkZ2UiIGlkPSJjb2FjaC1jdXRzLWNvdW50Ij4wPC9zcGFuPjwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjb2FjaC1jYXJkLWhpbnQiPkNhcmRzIHRoZSBjb2FjaCByZWNvbW1lbmRzIHJlbW92aW5nIGZyb20geW91ciBkZWNrPC9wPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29hY2gtdGFibGUtd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkYXRhLXRhYmxlIGNvYWNoLXRhYmxlIiBpZD0iY29hY2gtY3V0cy10YWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImNvYWNoLXRoLWNoZWNrIj48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJjb2FjaC1jdXRzLWFsbCIgLz48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5DYXJkPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UmVhc29uPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UmVwbGFjZW1lbnRzPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+SW1wYWN0PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD0iY29hY2gtY3V0cy1ib2R5Ij48L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIFN1Z2dlc3RlZCBBZGRzIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbCIgaWQ9ImNvYWNoLWFkZHMtY2FyZCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5TdWdnZXN0ZWQgQWRkcyA8c3BhbiBjbGFzcz0iY29hY2gtYmFkZ2UgY29hY2gtYmFkZ2UtZ3JlZW4iIGlkPSJjb2FjaC1hZGRzLWNvdW50Ij4wPC9zcGFuPjwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJjb2FjaC1jYXJkLWhpbnQiPkNhcmRzIHRoZSBjb2FjaCByZWNvbW1lbmRzIGFkZGluZyB0byB5b3VyIGRlY2s8L3A+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2FjaC10YWJsZS13cmFwIj4KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRhdGEtdGFibGUgY29hY2gtdGFibGUiIGlkPSJjb2FjaC1hZGRzLXRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iY29hY2gtdGgtY2hlY2siPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImNvYWNoLWFkZHMtYWxsIiAvPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNhcmQ8L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Sb2xlPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UmVhc29uPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+U3luZXJneSBXaXRoPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD0iY29hY2gtYWRkcy1ib2R5Ij48L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIEhldXJpc3RpYyBIaW50cyAtLT4KICAg' +
'ICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwiIGlkPSJjb2FjaC1oaW50cy1jYXJkIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5IaW50cyAmYW1wOyBUaXBzPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHVsIGlkPSJjb2FjaC1oaW50cy1saXN0IiBjbGFzcz0iY29hY2gtaGludHMtbGlzdCI+PC91bD4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIE1hbmEgQmFzZSBBZHZpY2UgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsIiBpZD0iY29hY2gtbWFuYS1jYXJkIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj5NYW5hIEJhc2UgQWR2aWNlPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHAgaWQ9ImNvYWNoLW1hbmEtdGV4dCIgY2xhc3M9ImNvYWNoLW1hbmEtdGV4dCI+PC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gUmF3IEV4cGxhbmF0aW9uIChjb2xsYXBzaWJsZSkgLS0+CiAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzPSJwYW5lbCBjb2FjaC1yYXctZGV0YWlscyI+CiAgICAgICAgICAgICAgICA8c3VtbWFyeT5GdWxsIExMTSBSZXNwb25zZTwvc3VtbWFyeT4KICAgICAgICAgICAgICAgIDxwcmUgaWQ9ImNvYWNoLXJhdy10ZXh0IiBjbGFzcz0iY29hY2gtcmF3LXRleHQiPjwvcHJlPgogICAgICAgICAgICA8L2RldGFpbHM+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8IS0tIFBhc3QgU2Vzc2lvbnMgLS0+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9InBhbmVsIGNvYWNoLXNlc3Npb25zLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlBhc3QgU2Vzc2lvbnM8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iY29hY2gtc2Vzc2lvbnMtbGlzdCIgY2xhc3M9ImNvYWNoLXNlc3Npb25zLWxpc3QiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImNvYWNoLWVtcHR5Ij5ObyBjb2FjaGluZyBzZXNzaW9ucyB5ZXQuIFJ1biB0aGUgY29hY2ggdG8gZ2V0IHN0YXJ0ZWQuPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IHNyYz0iY29hY2guanMiPjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K'
Install-B64 -R 'ui\coach.html' -B $b
# ui/coach.js (17,934 bytes)
$b = 'LyoqCiAqIENvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgQ29hY2ggVUkKICog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAqIENvbm5lY3RzIHRvIHRoZSBQeXRob24gY29hY2ggQVBJIGVuZHBvaW50cyB0byBwcm92aWRlCiAqIExMTS1wb3dlcmVkIGRlY2sgY29hY2hpbmcgd2l0aCBzdWdnZXN0ZWQgY3V0cy9hZGRzLgogKi8KCihmdW5jdGlvbiAoKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgQVBJID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjsKCiAgICAvLyDilIDilIAgRE9NIFJlZmVyZW5jZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgY29uc3QgZGVja1NlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1kZWNrLXNlbGVjdCcpOwogICAgY29uc3QgcG93ZXJTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcG93ZXItbGV2ZWwnKTsKICAgIGNvbnN0IHBvd2VyVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcG93ZXItdmFsdWUnKTsKICAgIGNvbnN0IG1ldGFGb2N1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1tZXRhLWZvY3VzJyk7CiAgICBjb25zdCBidWRnZXRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYnVkZ2V0Jyk7CiAgICBjb25zdCBydW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcnVuLWJ0bicpOwogICAgY29uc3QgcnVuSGludCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1ydW4taGludCcpOwogICAgY29uc3QgcHJvZ3Jlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1wcm9ncmVzcycpOwogICAgY29uc3QgcHJvZ3Jlc3NUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLXByb2dyZXNzLXRleHQnKTsKICAgIGNvbnN0IHJlc3VsdHNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1yZXN1bHRzJyk7CgogICAgLy8gU3RhdHVzCiAgICBjb25zdCBzdGF0dXNMbG1Eb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RhdHVzLWxsbSAuc3RhdHVzLWRvdCcpOwogICAgY29uc3Qgc3RhdHVzTGxtVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzLWxsbS12YWx1ZScpOwogICAgY29uc3Qgc3RhdHVzRW1iRG90ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0YXR1cy1lbWJlZGRpbmdzIC5zdGF0dXMtZG90Jyk7CiAgICBjb25zdCBzdGF0dXNFbWJWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMtZW1iZWRkaW5ncy12YWx1ZScpOwogICAgY29uc3Qgc3RhdHVzUmVwRG90ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3N0YXR1cy1yZXBvcnRzIC5zdGF0dXMtZG90Jyk7CiAgICBjb25zdCBzdGF0dXNSZXBWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMtcmVwb3J0cy12YWx1ZScpOwoKICAgIC8vIFJlc3VsdHMKICAgIGNvbnN0IHN1bW1hcnlUZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLXN1bW1hcnktdGV4dCcpOwogICAgY29uc3QgbWV0YVJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1tZXRhLXJvdycpOwogICAgY29uc3QgY3V0c0NvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLWN1dHMtY291bnQnKTsKICAgIGNvbnN0IGN1dHNCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLWN1dHMtYm9keScpOwogICAgY29uc3QgY3V0c0FsbENoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvYWNoLWN1dHMtYWxsJyk7CiAgICBjb25zdCBhZGRzQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYWRkcy1jb3VudCcpOwogICAgY29uc3QgYWRkc0JvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYWRkcy1ib2R5Jyk7CiAgICBjb25zdCBhZGRzQWxsQ2hlY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtYWRkcy1hbGwnKTsKICAgIGNvbnN0IGhpbnRzQ2FyZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1oaW50' +
'cy1jYXJkJyk7CiAgICBjb25zdCBoaW50c0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtaGludHMtbGlzdCcpOwogICAgY29uc3QgbWFuYUNhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtbWFuYS1jYXJkJyk7CiAgICBjb25zdCBtYW5hVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1tYW5hLXRleHQnKTsKICAgIGNvbnN0IHJhd1RleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29hY2gtcmF3LXRleHQnKTsKICAgIGNvbnN0IHNlc3Npb25zTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2FjaC1zZXNzaW9ucy1saXN0Jyk7CiAgICBjb25zdCBnZW5SZXBvcnRzQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlbmVyYXRlLXJlcG9ydHMtYnRuJyk7CgogICAgLy8g4pSA4pSAIEluaXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgaW5pdCgpOwoKICAgIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgLy8gUG93ZXIgc2xpZGVyCiAgICAgICAgcG93ZXJTbGlkZXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7CiAgICAgICAgICAgIHBvd2VyVmFsdWUudGV4dENvbnRlbnQgPSBwb3dlclNsaWRlci52YWx1ZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gRGVjayBzZWxlY3QgZW5hYmxlcyBydW4gYnV0dG9uCiAgICAgICAgZGVja1NlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGhhc0RlY2sgPSBkZWNrU2VsZWN0LnZhbHVlICE9PSAnJzsKICAgICAgICAgICAgcnVuQnRuLmRpc2FibGVkID0gIWhhc0RlY2s7CiAgICAgICAgICAgIHJ1bkhpbnQudGV4dENvbnRlbnQgPSBoYXNEZWNrID8gJ1JlYWR5IHRvIGFuYWx5emUnIDogJ1NlbGVjdCBhIGRlY2sgdG8gYmVnaW4nOwogICAgICAgIH0pOwoKICAgICAgICAvLyBSdW4gYnV0dG9uCiAgICAgICAgcnVuQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcnVuQ29hY2gpOwoKICAgICAgICAvLyBHZW5lcmF0ZSByZXBvcnRzIGJ1dHRvbgogICAgICAgIGdlblJlcG9ydHNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnZW5lcmF0ZVJlcG9ydHMpOwoKICAgICAgICAvLyBTZWxlY3QtYWxsIGNoZWNrYm94ZXMKICAgICAgICBjdXRzQWxsQ2hlY2suYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICBjdXRzQm9keS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFt0eXBlPSJjaGVja2JveCJdJykuZm9yRWFjaChjYiA9PiB7CiAgICAgICAgICAgICAgICBjYi5jaGVja2VkID0gY3V0c0FsbENoZWNrLmNoZWNrZWQ7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIGFkZHNBbGxDaGVjay5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgIGFkZHNCb2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKS5mb3JFYWNoKGNiID0+IHsKICAgICAgICAgICAgICAgIGNiLmNoZWNrZWQgPSBhZGRzQWxsQ2hlY2suY2hlY2tlZDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIExvYWQgZGF0YQogICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgICAgY2hlY2tTdGF0dXMoKSwKICAgICAgICAgICAgbG9hZERlY2tzKCksCiAgICAgICAgICAgIGxvYWRTZXNzaW9ucygpLAogICAgICAgIF0pOwogICAgfQoKICAgIC8vIOKUgOKUgCBTdGF0dXMgQ2hlY2sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gY2hlY2tTdGF0dXMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQVBJICsgJy9hcGkvY29hY2gvc3RhdHVzJyk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwoKICAgICAgICAgICAgLy8gTExNCiAgICAgICAgICAgIGlmIChkYXRhLmxsbUNvbm5lY3RlZCkgewogICAgICAgICAg' +
'ICAgICAgc2V0U3RhdHVzKHN0YXR1c0xsbURvdCwgc3RhdHVzTGxtVmFsdWUsICdvaycsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5sbG1Nb2RlbCB8fCAnQ29ubmVjdGVkJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRTdGF0dXMoc3RhdHVzTGxtRG90LCBzdGF0dXNMbG1WYWx1ZSwgJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBkYXRhLmVycm9yIHx8ICdOb3QgY29ubmVjdGVkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVtYmVkZGluZ3MKICAgICAgICAgICAgaWYgKGRhdGEuZW1iZWRkaW5nc0xvYWRlZCkgewogICAgICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c0VtYkRvdCwgc3RhdHVzRW1iVmFsdWUsICdvaycsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5lbWJlZGRpbmdDYXJkcy50b0xvY2FsZVN0cmluZygpICsgJyBjYXJkcycpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c0VtYkRvdCwgc3RhdHVzRW1iVmFsdWUsICd3YXJuJywKICAgICAgICAgICAgICAgICAgICAnTm90IGxvYWRlZCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZXBvcnRzCiAgICAgICAgICAgIGlmIChkYXRhLmRlY2tSZXBvcnRzQXZhaWxhYmxlID4gMCkgewogICAgICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c1JlcERvdCwgc3RhdHVzUmVwVmFsdWUsICdvaycsCiAgICAgICAgICAgICAgICAgICAgZGF0YS5kZWNrUmVwb3J0c0F2YWlsYWJsZSArICcgYXZhaWxhYmxlJyk7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKICAgICAgICAgICAgICAgIGdlblJlcG9ydHNCdG4udGV4dENvbnRlbnQgPSAnUmVidWlsZCBSZXBvcnRzJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldFN0YXR1cyhzdGF0dXNSZXBEb3QsIHN0YXR1c1JlcFZhbHVlLCAnd2FybicsCiAgICAgICAgICAgICAgICAgICAgJ05vbmUgXHUyMDE0IHJ1biBzaW11bGF0aW9ucyBmaXJzdCcpOwogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gJ0dlbmVyYXRlIFJlcG9ydHMnOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzZXRTdGF0dXMoc3RhdHVzTGxtRG90LCBzdGF0dXNMbG1WYWx1ZSwgJ2Vycm9yJywgJ1NlcnZpY2UgdW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c0VtYkRvdCwgc3RhdHVzRW1iVmFsdWUsICdlcnJvcicsICfigJQnKTsKICAgICAgICAgICAgc2V0U3RhdHVzKHN0YXR1c1JlcERvdCwgc3RhdHVzUmVwVmFsdWUsICdlcnJvcicsICfigJQnKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0U3RhdHVzKGRvdEVsLCB2YWx1ZUVsLCBsZXZlbCwgdGV4dCkgewogICAgICAgIGRvdEVsLmNsYXNzTmFtZSA9ICdzdGF0dXMtZG90IHN0YXR1cy0nICsgbGV2ZWw7CiAgICAgICAgdmFsdWVFbC50ZXh0Q29udGVudCA9IHRleHQ7CiAgICB9CgogICAgLy8g4pSA4pSAIExvYWQgRGVja3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gbG9hZERlY2tzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL2RlY2tzJyk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBjb25zdCBkZWNrcyA9IGRhdGEuZGVja3MgfHwgW107CgogICAgICAgICAgICAvLyBDbGVhciBleGlzdGluZyBvcHRpb25zIChrZWVwIHBsYWNlaG9sZGVyKQogICAgICAgICAgICB3aGlsZSAoZGVja1NlbGVjdC5vcHRpb25zLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QucmVtb3ZlKDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZGVja3MubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICAgICAgICAg' +
'IG9wdC5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSAnTm8gZGVjayByZXBvcnRzIGF2YWlsYWJsZSDigJQgcnVuIHNpbXVsYXRpb25zIGZpcnN0JzsKICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGVja3Muc29ydCgpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGRlY2tJZCBvZiBkZWNrcykgewogICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CiAgICAgICAgICAgICAgICBvcHQudmFsdWUgPSBkZWNrSWQ7CiAgICAgICAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBkZWNrSWQ7CiAgICAgICAgICAgICAgICBkZWNrU2VsZWN0LmFwcGVuZENoaWxkKG9wdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGRlY2tzOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgTG9hZCBQYXN0IFNlc3Npb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9ucygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChBUEkgKyAnL2FwaS9jb2FjaC9zZXNzaW9ucycpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBkYXRhLnNlc3Npb25zIHx8IFtdOwoKICAgICAgICAgICAgaWYgKHNlc3Npb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgc2Vzc2lvbnNMaXN0LmlubmVySFRNTCA9ICc8cCBjbGFzcz0iY29hY2gtZW1wdHkiPk5vIGNvYWNoaW5nIHNlc3Npb25zIHlldC4gUnVuIHRoZSBjb2FjaCB0byBnZXQgc3RhcnRlZC48L3A+JzsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2Vzc2lvbnNMaXN0LmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygc2Vzc2lvbnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ2NvYWNoLXNlc3Npb24taXRlbSc7CiAgICAgICAgICAgICAgICBpdGVtLm9uY2xpY2sgPSAoKSA9PiBsb2FkU2Vzc2lvbihzLnNlc3Npb25JZCk7CgogICAgICAgICAgICAgICAgY29uc3QgdGltZVN0ciA9IHMudGltZXN0YW1wID8gZm9ybWF0VGltZShzLnRpbWVzdGFtcCkgOiAnJzsKCiAgICAgICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9CiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWRlY2siPicgKyBlc2NIdG1sKHMuZGVja0lkKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLXN1bW1hcnkiPicgKyBlc2NIdG1sKHMuc3VtbWFyeSB8fCAnKG5vIHN1bW1hcnkpJykgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtc2Vzc2lvbi1tZXRhIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWN1dHMiPi0nICsgKHMuY3V0c0NvdW50IHx8IDApICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLWFkZHMiPisnICsgKHMuYWRkc0NvdW50IHx8IDApICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJjb2FjaC1zZXNzaW9uLXRpbWUiPicgKyBlc2NIdG1sKHRpbWVTdHIpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPic7CgogICAgICAgICAgICAgICAgc2Vzc2lvbnNMaXN0LmFwcGVuZENoaWxkKGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXNzaW9uczonLCBlKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIEdlbmVyYXRl' +
'IFJlcG9ydHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVSZXBvcnRzKCkgewogICAgICAgIGdlblJlcG9ydHNCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGdlblJlcG9ydHNCdG4udGV4dENvbnRlbnQgPSAnR2VuZXJhdGluZy4uLic7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL3JlcG9ydHMvZ2VuZXJhdGUnLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwoKICAgICAgICAgICAgaWYgKGRhdGEuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICBnZW5SZXBvcnRzQnRuLnRleHRDb250ZW50ID0gZGF0YS5jb3VudCArICcgcmVwb3J0cyBnZW5lcmF0ZWQnOwogICAgICAgICAgICAgICAgLy8gUmVmcmVzaCBzdGF0dXMgYW5kIGRlY2sgbGlzdAogICAgICAgICAgICAgICAgYXdhaXQgY2hlY2tTdGF0dXMoKTsKICAgICAgICAgICAgICAgIGF3YWl0IGxvYWREZWNrcygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi50ZXh0Q29udGVudCA9ICdObyByZXN1bHRzIGZvdW5kJzsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgZ2VuUmVwb3J0c0J0bi50ZXh0Q29udGVudCA9ICdFcnJvcjogJyArIGUubWVzc2FnZTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIGdlblJlcG9ydHNCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGdlblJlcG9ydHNCdG4udGV4dENvbnRlbnQgPSAnUmVidWlsZCBSZXBvcnRzJzsKICAgICAgICAgICAgfSwgMzAwMCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBSdW4gQ29hY2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gcnVuQ29hY2goKSB7CiAgICAgICAgY29uc3QgZGVja0lkID0gZGVja1NlbGVjdC52YWx1ZTsKICAgICAgICBpZiAoIWRlY2tJZCkgcmV0dXJuOwoKICAgICAgICAvLyBHYXRoZXIgZ29hbHMKICAgICAgICBjb25zdCBmb2N1c0FyZWFzID0gW107CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvYWNoLWZvY3VzLXRhZ3MgaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkJykuZm9yRWFjaChjYiA9PiB7CiAgICAgICAgICAgIGZvY3VzQXJlYXMucHVzaChjYi52YWx1ZSk7CiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IGdvYWxzID0ge307CiAgICAgICAgY29uc3QgcGwgPSBwYXJzZUludChwb3dlclNsaWRlci52YWx1ZSk7CiAgICAgICAgaWYgKHBsKSBnb2Fscy50YXJnZXRQb3dlckxldmVsID0gcGw7CiAgICAgICAgaWYgKG1ldGFGb2N1cy52YWx1ZSkgZ29hbHMubWV0YUZvY3VzID0gbWV0YUZvY3VzLnZhbHVlOwogICAgICAgIGlmIChidWRnZXRTZWxlY3QudmFsdWUpIGdvYWxzLmJ1ZGdldCA9IGJ1ZGdldFNlbGVjdC52YWx1ZTsKICAgICAgICBpZiAoZm9jdXNBcmVhcy5sZW5ndGggPiAwKSBnb2Fscy5mb2N1c0FyZWFzID0gZm9jdXNBcmVhczsKCiAgICAgICAgLy8gU2hvdyBwcm9ncmVzcwogICAgICAgIHJ1bkJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgcHJvZ3Jlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIHByb2dyZXNzVGV4dC50ZXh0Q29udGVudCA9ICdBbmFseXppbmcgZGVjayBhbmQgY29uc3VsdGluZyBMTE0uLi4gVGhpcyBtYXkgdGFrZSAzMC02MCBzZWNvbmRzLic7CiAgICAgICAgcmVzdWx0c0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXMgZXJyb3IKICAgICAgICBjb25zdCBwcmV2RXJyb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29hY2gtZXJyb3InKTsKICAgICAgICBpZiAocHJldkVycm9yKSBwcmV2RXJyb3IucmVtb3Zl' +
'KCk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL2RlY2tzLycgKyBlbmNvZGVVUklDb21wb25lbnQoZGVja0lkKSwgewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZ29hbHM6IGdvYWxzIH0pLAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7IGRldGFpbDogJ1Vua25vd24gZXJyb3InIH0pKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZGV0YWlsIHx8ICdDb2FjaCByZXF1ZXN0IGZhaWxlZCAoJyArIHJlcy5zdGF0dXMgKyAnKScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgZGlzcGxheVNlc3Npb24oc2Vzc2lvbik7CgogICAgICAgICAgICAvLyBSZWZyZXNoIHNlc3Npb25zIGxpc3QKICAgICAgICAgICAgbG9hZFNlc3Npb25zKCk7CgogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc3QgZXJyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIGVyckRpdi5jbGFzc05hbWUgPSAnY29hY2gtZXJyb3InOwogICAgICAgICAgICBlcnJEaXYudGV4dENvbnRlbnQgPSAnQ29hY2ggZXJyb3I6ICcgKyBlLm1lc3NhZ2U7CiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2FjaC1jb25maWcnKS5hcHBlbmRDaGlsZChlcnJEaXYpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHJ1bkJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBwcm9ncmVzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBMb2FkICYgRGlzcGxheSBTZXNzaW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRTZXNzaW9uKHNlc3Npb25JZCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSSArICcvYXBpL2NvYWNoL3Nlc3Npb25zLycgKyBlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKSk7CiAgICAgICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ1Nlc3Npb24gbm90IGZvdW5kJyk7CiAgICAgICAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBkaXNwbGF5U2Vzc2lvbihzZXNzaW9uKTsKCiAgICAgICAgICAgIC8vIFNjcm9sbCB0byByZXN1bHRzCiAgICAgICAgICAgIHJlc3VsdHNFbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXNzaW9uOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwbGF5U2Vzc2lvbihzZXNzaW9uKSB7CiAgICAgICAgcmVzdWx0c0VsLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CgogICAgICAgIC8vIFN1bW1hcnkKICAgICAgICBzdW1tYXJ5VGV4dC50ZXh0Q29udGVudCA9IHNlc3Npb24uc3VtbWFyeSB8fCAnKE5vIHN1bW1hcnkgcHJvdmlkZWQpJzsKCiAgICAgICAgLy8gTWV0YSBjaGlwcwogICAgICAgIG1ldGFSb3cuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgaWYgKHNlc3Npb24ubW9kZWxVc2VkKSB7CiAgICAgICAgICAgIGFkZE1ldGFDaGlwKCdNb2RlbCcsIHNlc3Npb24ubW9kZWxVc2VkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNlc3Npb24ucHJvbXB0VG9rZW5zKSB7CiAgICAgICAgICAgIGFkZE1ldGFDaGlwKCdQcm9tcHQnLCBzZXNzaW9uLnByb21wdFRva2Vucy50b0xvY2FsZVN0cmluZygpICsgJyB0b2tlbnMnKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNlc3Npb24uY29tcGxldGlvblRva2VucykgewogICAgICAgICAgICBhZGRNZXRhQ2hpcCgnQ29tcGxldGlvbicsIHNlc3Npb24uY29tcGxldGlvblRv' +
'a2Vucy50b0xvY2FsZVN0cmluZygpICsgJyB0b2tlbnMnKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNlc3Npb24uZGVja0lkKSB7CiAgICAgICAgICAgIGFkZE1ldGFDaGlwKCdEZWNrJywgc2Vzc2lvbi5kZWNrSWQpOwogICAgICAgIH0KICAgICAgICBpZiAoc2Vzc2lvbi50aW1lc3RhbXApIHsKICAgICAgICAgICAgYWRkTWV0YUNoaXAoJ1RpbWUnLCBmb3JtYXRUaW1lKHNlc3Npb24udGltZXN0YW1wKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDdXRzIHRhYmxlCiAgICAgICAgY29uc3QgY3V0cyA9IHNlc3Npb24uc3VnZ2VzdGVkQ3V0cyB8fCBbXTsKICAgICAgICBjdXRzQ291bnQudGV4dENvbnRlbnQgPSBjdXRzLmxlbmd0aDsKICAgICAgICBjdXRzQm9keS5pbm5lckhUTUwgPSAnJzsKICAgICAgICBjdXRzQWxsQ2hlY2suY2hlY2tlZCA9IGZhbHNlOwoKICAgICAgICBmb3IgKGNvbnN0IGN1dCBvZiBjdXRzKSB7CiAgICAgICAgICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKICAgICAgICAgICAgdHIuaW5uZXJIVE1MID0KICAgICAgICAgICAgICAgICc8dGQ+PGlucHV0IHR5cGU9ImNoZWNrYm94IiAvPjwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPjxzcGFuIGNsYXNzPSJjb2FjaC1jYXJkLW5hbWUiPicgKyBlc2NIdG1sKGN1dC5jYXJkTmFtZSkgKyAnPC9zcGFuPjwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPicgKyBlc2NIdG1sKGN1dC5yZWFzb24pICsgJzwvdGQ+JyArCiAgICAgICAgICAgICAgICAnPHRkPjxkaXYgY2xhc3M9ImNvYWNoLXJlcGxhY2VtZW50cyI+JyArCiAgICAgICAgICAgICAgICAgICAgKGN1dC5yZXBsYWNlbWVudE9wdGlvbnMgfHwgW10pLm1hcChyID0+CiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iY29hY2gtcmVwbGFjZW1lbnQtY2hpcCI+JyArIGVzY0h0bWwocikgKyAnPC9zcGFuPicKICAgICAgICAgICAgICAgICAgICApLmpvaW4oJycpICsKICAgICAgICAgICAgICAgICc8L2Rpdj48L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD4nICsgZm9ybWF0SW1wYWN0KGN1dC5jdXJyZW50SW1wYWN0U2NvcmUpICsgJzwvdGQ+JzsKICAgICAgICAgICAgY3V0c0JvZHkuYXBwZW5kQ2hpbGQodHIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkcyB0YWJsZQogICAgICAgIGNvbnN0IGFkZHMgPSBzZXNzaW9uLnN1Z2dlc3RlZEFkZHMgfHwgW107CiAgICAgICAgYWRkc0NvdW50LnRleHRDb250ZW50ID0gYWRkcy5sZW5ndGg7CiAgICAgICAgYWRkc0JvZHkuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgYWRkc0FsbENoZWNrLmNoZWNrZWQgPSBmYWxzZTsKCiAgICAgICAgZm9yIChjb25zdCBhZGQgb2YgYWRkcykgewogICAgICAgICAgICBjb25zdCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICAgICAgICAgIHRyLmlubmVySFRNTCA9CiAgICAgICAgICAgICAgICAnPHRkPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgLz48L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD48c3BhbiBjbGFzcz0iY29hY2gtY2FyZC1uYW1lIj4nICsgZXNjSHRtbChhZGQuY2FyZE5hbWUpICsgJzwvc3Bhbj48L3RkPicgKwogICAgICAgICAgICAgICAgJzx0ZD4nICsgKGFkZC5yb2xlID8gJzxzcGFuIGNsYXNzPSJjb2FjaC1yb2xlLWJhZGdlIj4nICsgZXNjSHRtbChhZGQucm9sZSkgKyAnPC9zcGFuPicgOiAnJykgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+JyArIGVzY0h0bWwoYWRkLnJlYXNvbikgKyAnPC90ZD4nICsKICAgICAgICAgICAgICAgICc8dGQ+PGRpdiBjbGFzcz0iY29hY2gtcmVwbGFjZW1lbnRzIj4nICsKICAgICAgICAgICAgICAgICAgICAoYWRkLnN5bmVyZ3lXaXRoIHx8IFtdKS5tYXAocyA9PgogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImNvYWNoLXN5bmVyZ3ktY2hpcCI+JyArIGVzY0h0bWwocykgKyAnPC9zcGFuPicKICAgICAgICAgICAgICAgICAgICApLmpvaW4oJycpICsKICAgICAgICAgICAgICAgICc8L2Rpdj48L3RkPic7CiAgICAgICAgICAgIGFkZHNCb2R5LmFwcGVuZENoaWxkKHRyKTsKICAgICAgICB9CgogICAgICAgIC8vIEhpbnRzCiAgICAgICAgY29uc3QgaGludHMgPSBzZXNzaW9uLmhldXJpc3RpY0hpbnRzIHx8IFtdOwogICAgICAgIGlmIChoaW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGhpbnRzQ2FyZC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgaGlu' +
'dHNMaXN0LmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICBmb3IgKGNvbnN0IGhpbnQgb2YgaGludHMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgICAgICAgICAgICAgIGxpLnRleHRDb250ZW50ID0gaGludDsKICAgICAgICAgICAgICAgIGhpbnRzTGlzdC5hcHBlbmRDaGlsZChsaSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaW50c0NhcmQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB9CgogICAgICAgIC8vIE1hbmEgYWR2aWNlCiAgICAgICAgaWYgKHNlc3Npb24ubWFuYUJhc2VBZHZpY2UpIHsKICAgICAgICAgICAgbWFuYUNhcmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgIG1hbmFUZXh0LnRleHRDb250ZW50ID0gc2Vzc2lvbi5tYW5hQmFzZUFkdmljZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtYW5hQ2FyZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0KCiAgICAgICAgLy8gUmF3IHRleHQKICAgICAgICByYXdUZXh0LnRleHRDb250ZW50ID0gc2Vzc2lvbi5yYXdUZXh0RXhwbGFuYXRpb24gfHwgc2Vzc2lvbi5zdW1tYXJ5IHx8ICcoZW1wdHkpJzsKICAgIH0KCiAgICAvLyDilIDilIAgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBhZGRNZXRhQ2hpcChsYWJlbCwgdmFsdWUpIHsKICAgICAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgIGNoaXAuY2xhc3NOYW1lID0gJ2NvYWNoLW1ldGEtY2hpcCc7CiAgICAgICAgY2hpcC5pbm5lckhUTUwgPSAnPHN0cm9uZz4nICsgZXNjSHRtbChsYWJlbCkgKyAnOjwvc3Ryb25nPiAnICsgZXNjSHRtbCh2YWx1ZSk7CiAgICAgICAgbWV0YVJvdy5hcHBlbmRDaGlsZChjaGlwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRJbXBhY3Qoc2NvcmUpIHsKICAgICAgICBpZiAoc2NvcmUgPT09IHVuZGVmaW5lZCB8fCBzY29yZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJjb2FjaC1pbXBhY3QgY29hY2gtaW1wYWN0LW5ldXRyYWwiPuKAlDwvc3Bhbj4nOwogICAgICAgIH0KICAgICAgICBjb25zdCBmaXhlZCA9IHNjb3JlLnRvRml4ZWQoMyk7CiAgICAgICAgaWYgKHNjb3JlIDwgLTAuMDEpIHsKICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29hY2gtaW1wYWN0IGNvYWNoLWltcGFjdC1uZWdhdGl2ZSI+JyArIGZpeGVkICsgJzwvc3Bhbj4nOwogICAgICAgIH0gZWxzZSBpZiAoc2NvcmUgPiAwLjAxKSB7CiAgICAgICAgICAgIHJldHVybiAnPHNwYW4gY2xhc3M9ImNvYWNoLWltcGFjdCBjb2FjaC1pbXBhY3QtcG9zaXRpdmUiPisnICsgZml4ZWQgKyAnPC9zcGFuPic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29hY2gtaW1wYWN0IGNvYWNoLWltcGFjdC1uZXV0cmFsIj4nICsgZml4ZWQgKyAnPC9zcGFuPic7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFRpbWUoaXNvU3RyKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzb1N0cik7CiAgICAgICAgICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygpICsgJyAnICsgZC50b0xvY2FsZVRpbWVTdHJpbmcoW10sIHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KTsKICAgICAgICB9IGNhdGNoIHsKICAgICAgICAgICAgcmV0dXJuIGlzb1N0cjsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZXNjSHRtbChzdHIpIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuICcnOwogICAgICAgIHJldHVybiBTdHJpbmcoc3RyKQogICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JykKICAgICAgICAgICAgLnJlcGxhY2UoLyIvZywgJyZxdW90OycpOwogICAgfQoKfSkoKTsK'
Install-B64 -R 'ui\coach.js' -B $b
# ui/collection.css (56,542 bytes)
$b = 'Lyog4pSA4pSAIEpTLXJlZmVyZW5jZWQgYWxpYXNlcyAoY29sbGVjdGlvbi5qcyB1c2VzIHRoZXNlIGluIHRlbXBsYXRlIGxpdGVyYWxzKSDilIDilIAgKi8KOnJvb3QgewogICAgLS1sYWItcHVycGxlOiB2YXIoLS1wdXJwbGUpOwogICAgLS1sYWItd2FybmluZzogdmFyKC0td2FybmluZyk7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICBDb21tYW5kZXIgQUkgTGFiIOKAlCBDb2xsZWN0aW9uIE1hbmFnZW1lbnQgU3R5bGVzCiAgIFVzZXMgY29sbC0gcHJlZml4IHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGxhYi0gY2xhc3NlcwogICBEZXNpZ24gdG9rZW5zIGluaGVyaXRlZCBmcm9tIGFpLWxhYi5jc3MgOnJvb3QgdmFyaWFibGVzCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLyog4pSA4pSAIFotSU5ERVggU1RBQ0sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIDEwICB0YWJsZSB0aGVhZCAoc3RpY2t5KQogICA1MCAgZHJhd2VyIGhlYWRlciAoc3RpY2t5IGluc2lkZSBkcmF3ZXIpCiAgIDEwMCB0b3BiYXIgKHN0aWNreSkKICAgMjAwIGRyYXdlciBiYWNrZHJvcAogICAyNTAgZHJhd2VyIHBhbmVsCiAgIDMwMCBjYXRlZ29yeSBwb3BvdmVyCiAgIDEwMDAgbW9kYWwgb3ZlcmxheXMgKGltcG9ydC9leHBvcnQpCiAgIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLyog4pSA4pSAIDEuIFBhZ2UgTGF5b3V0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKI2NvbGxlY3Rpb24tcGFnZSB7CiAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIHBhZGRpbmc6IDA7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udCk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBpc29sYXRpb246IGlzb2xhdGU7Cn0KCi5jb2xsLXRvcGJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgdG9wOiB2YXIoLS1uYXYtaGVpZ2h0KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTIsIDE0LCAyMCwgMC45NSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHotaW5kZXg6IDEwMDsKICAgIHBhZGRpbmc6IDEycHggMjRweDsKICAgIGdhcDogMTJweDsKfQoKLmNvbGwtdG9wYmFyLWxlZnQgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmNvbGwtdG9wYmFyLXJpZ2h0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwp9CgouY29sbC10aXRsZSB7CiAgICBmb250LXNpemU6IDIwcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAg' +
'Y29sb3I6ICNmZmY7CiAgICBtYXJnaW46IDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLmNvbGwtY291bnQgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmNvbGwtYmFjay1idG4gewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1czsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7Cn0KCi5jb2xsLWJhY2stYnRuOmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1zZWFyY2ggewogICAgd2lkdGg6IDI0MHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogOHB4IDE0cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvdXRsaW5lOiBub25lOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzLCBib3gtc2hhZG93IDAuMTVzOwp9CgouY29sbC1zZWFyY2g6OnBsYWNlaG9sZGVyIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5jb2xsLXNlYXJjaDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tYWNjZW50LWdsb3cpOwp9CgouY29sbC1zY2FuLWJ0biwKLmNvbGwtaW1wb3J0LWJ0biwKLmNvbGwtZXhwb3J0LWJ0biwKLmNvbGwtYXV0b2NsYXNzaWZ5LWJ0biwKLmNvbGwtcmVlbnJpY2gtYnRuIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDdweCAxNHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1czsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouY29sbC1leHBvcnQtYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgovKiBTY2FuIGJ1dHRvbiBoYXMgYmx1ZS9hY2NlbnQgc3R5bGluZyAqLwouY29sbC1zY2FuLWJ0biB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDkxLCAxNTgsIDI0MCwgMC4xMiksIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjE4KSk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjQpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLXNjYW4tYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjIyKSwgcmdiYSg5MSwgMTU4LCAyNDAsIDAuMjgpKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQtaG92ZXIpOwp9CgovKiBJbXBvcnQgYnV0dG9uIGhhcyBncmVlbiBhY2NlbnQgbGlrZSBsYWItaW1wb3J0LXN1Ym1pdC1idG4gKi8KLmNvbGwtaW1wb3J0LWJ0biB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDM1LCAxMzQsIDU0LCAwLjE1KSwgcmdiYSg0NiwgMTYwLCA2NywgMC4xNSkpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDQ2LCAxNjAsIDY3LCAwLjQpOwogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgouY29sbC1pbXBvcnQtYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMzUsIDEzNCwgNTQsIDAuMjUpLCByZ2JhKDQ2LCAxNjAsIDY3LCAwLjI1KSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwog' +
'ICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgovKiBBdXRvLUNsYXNzaWZ5IGJ1dHRvbiDigJQgYW1iZXIvb3JhbmdlIGFjY2VudCAqLwouY29sbC1hdXRvY2xhc3NpZnktYnRuIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMjI3LCAxNTUsIDM1LCAwLjEyKSwgcmdiYSgyMjcsIDE1NSwgMzUsIDAuMTgpKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyMjcsIDE1NSwgMzUsIDAuNCk7CiAgICBjb2xvcjogdmFyKC0td2FybmluZyk7Cn0KCi5jb2xsLWF1dG9jbGFzc2lmeS1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMjcsIDE1NSwgMzUsIDAuMjIpLCByZ2JhKDIyNywgMTU1LCAzNSwgMC4yOCkpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS13YXJuaW5nKTsKICAgIGNvbG9yOiB2YXIoLS1nb2xkKTsKfQoKLmNvbGwtYXV0b2NsYXNzaWZ5LWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjY7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgouY29sbC1yZWVucmljaC1idG4gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMzYsIDk4LCAyMzUsIDAuMTIpLCByZ2JhKDEzNiwgOTgsIDIzNSwgMC4xOCkpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDEzNiwgOTgsIDIzNSwgMC40KTsKICAgIGNvbG9yOiB2YXIoLS1wdXJwbGUpOwp9CgouY29sbC1yZWVucmljaC1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMzYsIDk4LCAyMzUsIDAuMjIpLCByZ2JhKDEzNiwgOTgsIDIzNSwgMC4yOCkpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wdXJwbGUpOwogICAgY29sb3I6IHZhcigtLXB1cnBsZSk7Cn0KCi5jb2xsLXJlZW5yaWNoLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjY7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgovKiDilIDilIAgTmF2IExpbmtzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmNvbGwtbmF2LWxpbmsgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgcGFkZGluZzogN3B4IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMsIGJhY2tncm91bmQgMC4xNXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKfQoKLmNvbGwtbmF2LWxpbms6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMDYpOwp9CgovKiDilIDilIAgMi4gTWFpbiBDb250ZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmNvbGwtbWFpbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAyMHB4OwogICAgcGFkZGluZzogMTZweCAyNHB4OwogICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7Cn0KCi8qIFRhYmxlIHdyYXBwZXIg4oCUIGZpbGxzIHJlbWFpbmluZyBzcGFjZSAqLwouY29sbC10YWJsZS13cmFwIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIC8qIENvbnN0cmFpbiBoZWlnaHQgc28gdGFibGUgc2Nyb2xscyBpbmRlcGVuZGVudGx5IG9mIHBhZ2UgKi8KICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSA4MHB4KTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi8qIOKUgOKUgCAzLiBGaWx0ZXIgUGFuZWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouY29sbC1maWx0ZXJzIHsKICAgIHdpZHRoOiAyNDBweDsKICAgIGZs' +
'ZXgtc2hyaW5rOiAwOwogICAgbWF4LWhlaWdodDogY2FsYygxMDB2aCAtIDgwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyKSB0cmFuc3BhcmVudDsKfQoKLmNvbGwtZmlsdGVyczo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDZweDsKfQoKLmNvbGwtZmlsdGVyczo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5jb2xsLWZpbHRlcnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5jb2xsLWZpbHRlcnM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmNvbGwtZmlsdGVyLXNlY3Rpb24gewogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKfQoKLmNvbGwtZmlsdGVyLWxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgovKiBDb2xvciB0b2dnbGVzICovCi5jb2xsLWNvbG9yLWJ0bnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogNHB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgouY29sbC1jb2xvci1idG4gewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgdHJhbnNmb3JtIDAuMTVzOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBwYWRkaW5nOiAwOwp9CgouY29sbC1jb2xvci1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDUpOwp9CgouY29sbC1jb2xvci1idG4uYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogI2ZmZjsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi8qIFR5cGUgbGlzdCBjaGVja2JveGVzICovCi5jb2xsLXR5cGUtY2hlY2tzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA0cHg7Cn0KCi5jb2xsLWNoZWNrLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHBhZGRpbmc6IDJweCAwOwp9CgouY29sbC1jaGVjay1sYWJlbCBpbnB1dFt0eXBlPSJjaGVja2JveCJdIHsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMTRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1czsKfQoKLmNvbGwtY2hlY2stbGFiZWwgaW5wdXRbdHlwZT0iY2hlY2tib3giXTpjaGVja2VkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFj' +
'Y2VudCk7Cn0KCi5jb2xsLWNoZWNrLWxhYmVsIGlucHV0W3R5cGU9ImNoZWNrYm94Il06Y2hlY2tlZDo6YWZ0ZXIgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBsZWZ0OiAzcHg7CiAgICB0b3A6IDFweDsKICAgIHdpZHRoOiA1cHg7CiAgICBoZWlnaHQ6IDhweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkICMwMDA7CiAgICBib3JkZXItdG9wOiBub25lOwogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7Cn0KCi5jb2xsLWNoZWNrLWxhYmVsOmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmNvbGwtY2hlY2stbGFiZWw6aG92ZXIgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi8qIFRvZ2dsZSBidXR0b25zICovCi5jb2xsLXRvZ2dsZS1idG5zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDZweDsKfQoKLmNvbGwtdG9nZ2xlLWJ0biB7CiAgICBwYWRkaW5nOiA1cHggMTJweDsKICAgIGJvcmRlci1yYWRpdXM6IDE0cHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgY29sb3IgMC4xNXMsIGJhY2tncm91bmQgMC4xNXM7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLmNvbGwtdG9nZ2xlLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmNvbGwtdG9nZ2xlLWJ0bi5hY3RpdmUgewogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMTUpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi8qIEZpbmlzaCByYWRpb3MgKi8KLmNvbGwtZmluaXNoLXJhZGlvcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogNHB4Owp9CgovKiBSYW5nZSBpbnB1dHMgKi8KLmNvbGwtcmFuZ2UtaW5wdXRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5jb2xsLXJhbmdlLXNlcCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgouY29sbC1yYW5nZS1pbnB1dCB7CiAgICB3aWR0aDogNzBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogNnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1czsKfQoKLmNvbGwtcmFuZ2UtaW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgovKiBDYXRlZ29yeSBmaWx0ZXIgY2hpcHMgKi8KLmNvbGwtY2F0LWZpbHRlci1idG5zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDRweDsKfQoKLmNvbGwtY2F0LWZpbHRlci1idG4gewogICAgcGFkZGluZzogM3B4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMsIGNvbG9yIDAuMTVzLCBiYWNrZ3JvdW5kIDAuMTVzOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5jb2xsLWNhdC1maWx0ZXItYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgouY29sbC1jYXQtZmlsdGVyLWJ0bi5hY3RpdmUgewogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMTUpOwogICAg' +
'Ym9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi8qIFJhZGlvIGxhYmVscyAoc2hhcmVkIGJ5IGZpbHRlcnMgYW5kIGltcG9ydCkgKi8KLmNvbGwtcmFkaW8tbGFiZWwgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgcGFkZGluZzogM3B4IDA7Cn0KCi5jb2xsLXJhZGlvLWxhYmVsIGlucHV0W3R5cGU9InJhZGlvIl0gewogICAgYXBwZWFyYW5jZTogbm9uZTsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1czsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouY29sbC1yYWRpby1sYWJlbCBpbnB1dFt0eXBlPSJyYWRpbyJdOmNoZWNrZWQgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1yYWRpby1sYWJlbCBpbnB1dFt0eXBlPSJyYWRpbyJdOmNoZWNrZWQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIHRvcDogNTAlOwogICAgbGVmdDogNTAlOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7Cn0KCi8qIFJlc2V0IGJ1dHRvbiAqLwouY29sbC1yZXNldC1idG4gewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogMXB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDdweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMsIGNvbG9yIDAuMTVzOwogICAgbWFyZ2luLXRvcDogNHB4Owp9CgouY29sbC1yZXNldC1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwp9CgovKiDilIDilIAgM2IuIE5ldyBGaWx0ZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLyogUmFyaXR5IGJ1dHRvbnMgKi8KLmNvbGwtcmFyaXR5LWJ0bnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogNnB4OwogICAgZmxleC13cmFwOiB3cmFwOwp9CgouY29sbC1yYXJpdHktYnRuIHsKICAgIHdpZHRoOiAzNnB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzOwp9CgouY29sbC1yYXJpdHktYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1yYXJpdHktYnRuLmFjdGl2ZS5jb2xsLXJhcml0eS1jb21tb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0wKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgouY29sbC1yYXJpdHktYnRuLmFjdGl2ZS5jb2xsLXJhcml0eS11bmNvbW1vbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgY29sb3I6IHZh' +
'cigtLXN1Y2Nlc3MpOwp9CgouY29sbC1yYXJpdHktYnRuLmFjdGl2ZS5jb2xsLXJhcml0eS1yYXJlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmctZGltKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0td2FybmluZyk7CiAgICBjb2xvcjogdmFyKC0tZ29sZCk7Cn0KCi5jb2xsLXJhcml0eS1idG4uYWN0aXZlLmNvbGwtcmFyaXR5LW15dGhpYyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwp9CgovKiBQb3dlciAvIFRvdWdobmVzcyByYW5nZSByb3cgKi8KLmNvbGwtcmFuZ2Utcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDEwcHg7Cn0KCi5jb2xsLXJhbmdlLWdyb3VwIHsKICAgIGZsZXg6IDE7Cn0KCi5jb2xsLXJhbmdlLXN1YmxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi8qIFNldCBmaWx0ZXIgYXV0b2NvbXBsZXRlICovCi5jb2xsLXNldC1maWx0ZXIsCi5jb2xsLWt3LWZpbHRlciB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5jb2xsLXNldC1pbnB1dCwKLmNvbGwta3ctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDZweCA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBvdXRsaW5lOiBub25lOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzOwp9CgouY29sbC1zZXQtaW5wdXQ6Zm9jdXMsCi5jb2xsLWt3LWlucHV0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmNvbGwtc2V0LWRyb3Bkb3duLAouY29sbC1rdy1kcm9wZG93biB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAxMDAlOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgbWF4LWhlaWdodDogMTgwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiAwIDAgdmFyKC0tcmFkaXVzLW1kKSB2YXIoLS1yYWRpdXMtbWQpOwogICAgei1pbmRleDogNTA7CiAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsLjQpOwp9CgouY29sbC1zZXQtZGQtaXRlbSwKLmNvbGwta3ctZGQtaXRlbSB7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5jb2xsLXNldC1kZC1pdGVtOmhvdmVyLAouY29sbC1rdy1kZC1pdGVtOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjEpOwp9CgouY29sbC1zZXQtZGQtY29kZSB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBtaW4td2lkdGg6IDQwcHg7Cn0KCi5jb2xsLXNldC1kZC1uYW1lIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi8qIFNldC9LZXl3b3JkIGNoaXBzICovCi5jb2xsLXNldC1jaGlwcywKLmNvbGwta3ctY2hpcHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLXRvcDogNnB4Owp9CgouY29sbC1zZXQtY2hpcCwKLmNvbGwta3ctY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjI1KTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6' +
'IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLXNldC1jaGlwIGJ1dHRvbiwKLmNvbGwta3ctY2hpcCBidXR0b24gewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5jb2xsLXNldC1jaGlwIGJ1dHRvbjpob3ZlciwKLmNvbGwta3ctY2hpcCBidXR0b246aG92ZXIgewogICAgY29sb3I6IHZhcigtLWVycm9yKTsKfQoKLyog4pSA4pSAIDQuIFRhYmxlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmNvbGwtdGFibGUtY29udGFpbmVyIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgb3ZlcmZsb3cteTogYXV0bzsKfQoKLmNvbGwtdGFibGUgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOwogICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5jb2xsLXRhYmxlIHRoZWFkIHsKICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICB0b3A6IDA7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgei1pbmRleDogMTA7Cn0KCi5jb2xsLXRhYmxlIHRoLAouY29sbC10aCB7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouY29sbC10aC1zb3J0YWJsZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzOwp9CgouY29sbC10aC1zb3J0YWJsZTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmNvbGwtdGgtYWN0aXZlIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC10YWJsZSB0ZCwKLmNvbGwtdGQgewogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg0OCwgNTQsIDYxLCAwLjUpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLmNvbGwtdGFibGUgdGJvZHkgdHIsCi5jb2xsLXJvdyB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7CiAgICBhbmltYXRpb246IGNvbGwtZmFkZS1pbiAwLjE1cyBlYXNlOwp9CgouY29sbC10YWJsZSB0Ym9keSB0cjpob3ZlciwKLmNvbGwtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7Cn0KCi5jb2xsLXRhYmxlIHRib2R5IHRyLnNlbGVjdGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjA4KTsKICAgIGJveC1zaGFkb3c6IGluc2V0IDNweCAwIDAgdmFyKC0tYWNjZW50KTsKfQoKLyogQ2VsbC1zcGVjaWZpYyBzdHlsZXMgKi8KLmNvbGwtY2FyZC1uYW1lLAouY29sbC10ZC1uYW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogI2ZmZjsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5jb2xsLXRkLXR5cGUgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5jb2xsLXRkLW9yYWNsZSB7CiAgICBtYXgtd2lkdGg6IDIwMHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5jb2xsLXRkLXByaWNlIHsKICAgIGZvbnQtZmFtaWx5OiAnQ2FzY2FkaWEgQ29kZScsICdGaXJhIENvZGUnLCAnQ29u' +
'c29sYXMnLCBtb25vc3BhY2U7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5jb2xsLXRkLXNhbHQgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgouY29sbC10ZC1xdWFudGl0eSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouY29sbC10ZC1jbWMgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouY29sbC10ZC1nYyB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5jb2xsLXRkLW1hbmEgewogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmNvbGwtdGQtcHQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZvbnQtZmFtaWx5OiAnQ2FzY2FkaWEgQ29kZScsICdGaXJhIENvZGUnLCAnQ29uc29sYXMnLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5jb2xsLXRkLXJhcml0eSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXNpemU6IDEycHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKfQoKLmNvbGwtdGQtc2V0IHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmNvbGwtdGQtZWRocmVjIHsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZm9udC1mYW1pbHk6ICdDYXNjYWRpYSBDb2RlJywgJ0ZpcmEgQ29kZScsICdDb25zb2xhcycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi8qIFJhcml0eSBjb2xvcnMgKi8KLmNvbGwtcmFyaXR5LWNvbW1vbiB7IGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7IH0KLmNvbGwtcmFyaXR5LXVuY29tbW9uIHsgY29sb3I6IHZhcigtLWFjY2VudCk7IH0KLmNvbGwtcmFyaXR5LXJhcmUgeyBjb2xvcjogdmFyKC0tZ29sZCk7IH0KLmNvbGwtcmFyaXR5LW15dGhpYyB7IGNvbG9yOiB2YXIoLS13YXJuaW5nKTsgfQouY29sbC1yYXJpdHktc3BlY2lhbCB7IGNvbG9yOiB2YXIoLS1wdXJwbGUpOyB9Ci5jb2xsLXJhcml0eS1ib251cyB7IGNvbG9yOiB2YXIoLS1wdXJwbGUpOyB9CgovKiBTYWx0IGNvbG9yIGNsYXNzZXMgKi8KLnNhbHQtZ3JlZW4geyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IH0KLnNhbHQteWVsbG93IHsgY29sb3I6IHZhcigtLXdhcm5pbmcpOyB9Ci5zYWx0LW9yYW5nZSB7IGNvbG9yOiB2YXIoLS13YXJuaW5nKTsgfQouc2FsdC1yZWQgeyBjb2xvcjogdmFyKC0tZXJyb3IpOyB9CgovKiBNYW5hIHBpcHMgKi8KLmNvbGwtbWFuYS1waXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5jb2xsLWNvbG9ybGVzcy1waXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXRleHQtdGVydGlhcnkpOwogICAgY29sb3I6ICNmZmY7Cn0KCi8qIENhdGVnb3J5IGNoaXBzIGluIHRhYmxlIGNlbGwgKi8KLmNvbGwtY2F0LWNoaXAgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogMXB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNv' +
'bG9yIDAuMTVzLCBjb2xvciAwLjE1czsKICAgIG1hcmdpbjogMXB4IDJweDsKfQoKLmNvbGwtY2F0LWNoaXA6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLW5vLWNhdGVnb3J5IHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi8qIEZpbmlzaCBiYWRnZXMgKi8KLmNvbGwtZmluaXNoLWJhZGdlIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouZmluaXNoLW5vcm1hbCwKLmNvbGwtZmluaXNoLW5vcm1hbCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEzOSwgMTQ4LCAxNTgsIDAuMTUpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmZpbmlzaC1mb2lsLAouY29sbC1maW5pc2gtZm9pbCB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDI1NSwgMjE1LCAwLCAwLjE1KSwgcmdiYSgxNjMsIDExMywgMjQ3LCAwLjE1KSk7CiAgICBjb2xvcjogdmFyKC0tZ29sZCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjE1LCAwLCAwLjMpOwp9CgouZmluaXNoLWV0Y2hlZCwKLmNvbGwtZmluaXNoLWV0Y2hlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDkxLCAxNTgsIDI0MCwgMC4xNSk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjMpOwp9CgovKiBJY29ucyAqLwouY29sbC1nYy1zdGFyIHsKICAgIGNvbG9yOiB2YXIoLS1nb2xkKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLmNvbGwtbGVnZW5kYXJ5LWljb24gewogICAgY29sb3I6IHZhcigtLWdvbGQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouY29sbC1iYXNpYy1pY29uIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi8qIOKUgOKUgCA1LiBQYWdpbmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmNvbGwtcGFnaW5hdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDEycHggMDsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgbWFyZ2luLXRvcDogOHB4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA4cHg7Cn0KCi5jb2xsLXBhZ2UtaW5mbyB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC10b3RhbC1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWFyZ2luLWxlZnQ6IDRweDsKfQoKLmNvbGwtcGFnZS1jb250cm9scyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA4cHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgouY29sbC1wYWdlLWJ0biB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiA2cHggMTRweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgY29sb3IgMC4xNXM7Cn0KCi5jb2xsLXBhZ2UtYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1wYWdlLWJ0bjpkaXNhYmxlZCB7' +
'CiAgICBvcGFjaXR5OiAwLjQ7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwp9CgouY29sbC1wYWdlLXNpemUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7Cn0KCi5jb2xsLXBhZ2Utc2l6ZSBzZWxlY3QgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5jb2xsLXBhZ2Utc2l6ZSBzZWxlY3Q6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgovKiDilIDilIAgNi4gRGV0YWlsIERyYXdlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5jb2xsLWRyYXdlci1iYWNrZHJvcCB7CiAgICBkaXNwbGF5OiBub25lOwogICAgcG9zaXRpb246IGZpeGVkOwogICAgaW5zZXQ6IDA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICB6LWluZGV4OiAyMDA7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMjVzIGVhc2U7CiAgICBvcGFjaXR5OiAwOwp9CgouY29sbC1kcmF3ZXItYmFja2Ryb3Aub3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG9wYWNpdHk6IDE7Cn0KCi5jb2xsLWRyYXdlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICByaWdodDogMDsKICAgIHRvcDogMDsKICAgIHdpZHRoOiA0MjBweDsKICAgIGhlaWdodDogMTAwdmg7CiAgICBoZWlnaHQ6IDEwMGR2aDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHotaW5kZXg6IDI1MDsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cyBlYXNlOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIGJveC1zaGFkb3c6IC00cHggMCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyKSB0cmFuc3BhcmVudDsKfQoKLmNvbGwtZHJhd2VyOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNnB4Owp9CgouY29sbC1kcmF3ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Owp9CgouY29sbC1kcmF3ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5jb2xsLWRyYXdlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1kcmF3ZXIub3BlbiB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7Cn0KCi5jb2xsLWRyYXdlci1pbm5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7Cn0KCi5jb2xsLWRyYXdlci1oZWFkZXIgewogICAgcGFkZGluZzogMTZweCAyMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgdG9wOiAwOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgei1pbmRleDogNTA7Cn0KCi5jb2xsLWRyYXdlci1oZWFkZXItdG9wIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIGdhcDogMTJweDsKICAgIG1hcmdpbi1ib3R0b206IDZweDsKfQoKLmNvbGwtZHJhd2VyLWNhcmQtbmFtZSB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICNmZmY7CiAgICBsaW5lLWhlaWdodDogMS4zOwp9CgouY29sbC1kcmF3ZXItY2xvc2UgewogICAgYmFja2dyb3VuZDogbm9uZTsK' +
'ICAgIGJvcmRlcjogbm9uZTsKICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXM7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouY29sbC1kcmF3ZXItY2xvc2U6aG92ZXIgewogICAgY29sb3I6ICNmZmY7Cn0KCi5jb2xsLWRyYXdlci1tZXRhIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgouY29sbC1kcmF3ZXItdHlwZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1kcmF3ZXItYm9keSB7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgZmxleDogMTsKfQoKLmNvbGwtZHJhd2VyLWltYWdlLXdyYXAgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKfQoKLmNvbGwtZHJhd2VyLWltYWdlIHsKICAgIG1heC13aWR0aDogMTAwJTsKICAgIHdpZHRoOiAyODBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKfQoKLmNvbGwtZHJhd2VyLW5vLWltYWdlIHsKICAgIHdpZHRoOiAyODBweDsKICAgIGhlaWdodDogMjAwcHg7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxNHB4Owp9CgovKiBMb2FkaW5nL2Vycm9yIHN0YXRlcyBpbnNpZGUgZHJhd2VyICovCi5jb2xsLWRyYXdlci1sb2FkaW5nIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiA0OHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmNvbGwtZHJhd2VyLWVycm9yIHsKICAgIHBhZGRpbmc6IDI0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgovKiBEcmF3ZXIgVGFicyAqLwouY29sbC1kcmF3ZXItdGFicyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgbWFyZ2luLXRvcDogOHB4Owp9CgouY29sbC10YWItYnRuIHsKICAgIHBhZGRpbmc6IDEwcHggMTZweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1czsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgbWFyZ2luLWJvdHRvbTogLTFweDsKfQoKLmNvbGwtdGFiLWJ0bjpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5jb2xsLXRhYi1idG4uYWN0aXZlIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmNvbGwtZHJhd2VyLXRhYi1jb250ZW50IHsKICAgIG1pbi1oZWlnaHQ6IDIwMHB4Owp9CgovKiBPdmVydmlldyB0YWIgKi8KLmNvbGwtb3ZlcnZpZXctZ3JpZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMnB4OwogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKfQoKLmNvbGwtb3ZlcnZpZXctcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1p' +
'dGVtczogY2VudGVyOwogICAgcGFkZGluZzogNnB4IDA7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSg0OCwgNTQsIDYxLCAwLjMpOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgouY29sbC1vdi1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKfQoKLmNvbGwtb3JhY2xlLXRleHQgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgcGFkZGluZzogMTJweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICBtYXJnaW4tYm90dG9tOiAxNnB4Owp9CgovKiBEcmF3ZXIgc2VjdGlvbnMgKi8KLmNvbGwtZHJhd2VyLXNlY3Rpb24gewogICAgbWFyZ2luLXRvcDogMTZweDsKfQoKLmNvbGwtZHJhd2VyLXNlY3Rpb24tbGFiZWwgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi8qIEZpbmlzaCBzZWxlY3QgaW4gZHJhd2VyICovCi5jb2xsLWZpbmlzaC1zZWxlY3QgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvdXRsaW5lOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXM7Cn0KCi5jb2xsLWZpbmlzaC1zZWxlY3Q6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgovKiBDYXRlZ29yeSBjaGlwcyBpbiBkcmF3ZXIgKi8KLmNvbGwtZHJhd2VyLWNhdC1jaGlwcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA0cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KCi5jb2xsLWRyYXdlci1jYXQtY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDNweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjMpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLWNoaXAtcmVtb3ZlIHsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogaW5oZXJpdDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgcGFkZGluZzogMCAycHg7CiAgICBvcGFjaXR5OiAwLjY7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMTVzOwp9CgouY29sbC1jaGlwLXJlbW92ZTpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwp9CgouY29sbC1jYXQtc3VnZ2VzdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgouY29sbC1jYXQtc3VnZ2VzdC1idG4gewogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXI6IDFweCBkYXNoZWQgdmFyKC0tYm9yZGVyKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMsIGNvbG9yIDAuMTVzOwp9CgouY29sbC1jYXQtc3VnZ2VzdC1idG46aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1h' +
'Y2NlbnQpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLWNhdC1hZGQtcm93LAouY29sbC10YWctYWRkLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA2cHg7CiAgICBtYXJnaW4tdG9wOiA2cHg7Cn0KCi5jb2xsLWNhdC1pbnB1dCB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiA1cHggMTBweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXM7Cn0KCi5jb2xsLWNhdC1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLWNhdC1hZGQtYnRuIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDVweCAxMnB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXMsIGJhY2tncm91bmQgMC4xNXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouY29sbC1jYXQtYWRkLWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDkxLCAxNTgsIDI0MCwgMC4xKTsKfQoKLyogVGFncyBpbiBkcmF3ZXIgKi8KLmNvbGwtZHJhd2VyLXRhZ3MgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLWJvdHRvbTogOHB4Owp9CgouY29sbC1kcmF3ZXItdGFnLWNoaXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAzcHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEzOSwgMTQ4LCAxNTgsIDAuMTIpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMzksIDE0OCwgMTU4LCAwLjMpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgovKiBOb3RlcyB0ZXh0YXJlYSAqLwouY29sbC1ub3Rlcy10ZXh0YXJlYSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogMTBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHJlc2l6ZTogdmVydGljYWw7CiAgICBtaW4taGVpZ2h0OiA4MHB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBsaW5lLWhlaWdodDogMS41OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgYm94LXNoYWRvdyAwLjE1czsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5jb2xsLW5vdGVzLXRleHRhcmVhOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCB2YXIoLS1hY2NlbnQtZ2xvdyk7Cn0KCi8qIFNhdmUgcm93IGluIGRyYXdlciAqLwouY29sbC1kcmF3ZXItc2F2ZS1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoKLmNvbGwtc2F2ZS1idG4gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tc3VjY2VzcyksIHZhcigtLXN1Y2Nlc3MpKTsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiA4cHggMjBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsK' +
'ICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cywgYm94LXNoYWRvdyAwLjE1czsKfQoKLmNvbGwtc2F2ZS1idG46aG92ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDQ2LCAxNjAsIDY3LCAwLjMpOwp9CgouY29sbC1zYXZlLXN0YXR1cyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1zYXZlLXN0YXR1cy5zYXZlZCB7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KCi5jb2xsLXNhdmUtc3RhdHVzLmVycm9yIHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7Cn0KCi8qIEVESFJFQyBUYWIgKi8KLmNvbGwtZWRocmVjLWxvYWRpbmcgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMjRweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5jb2xsLWVkaHJlYy1wcm9tcHQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMjRweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5jb2xsLWVkaHJlYy1mZXRjaC1idG4gewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiAjMDAwOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiA4cHggMjBweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG1hcmdpbi10b3A6IDhweDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXM7Cn0KCi5jb2xsLWVkaHJlYy1mZXRjaC1idG46aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWhvdmVyKTsKfQoKLmNvbGwtZWRocmVjLXJlY3MgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDZweDsKfQoKLmNvbGwtZWRocmVjLXJlYyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZ2FwOiA4cHg7Cn0KCi5jb2xsLWVkaHJlYy1yZWM6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1lZGhyZWMtcmVjLW5hbWUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwp9CgouY29sbC1lZGhyZWMtcmVjLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouY29sbC1lZGhyZWMtcm9sZSB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1lZGhyZWMtc3luZXJneSB7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouY29sbC1lZGhyZWMtaW5jbHVzaW9uIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmNvbGwtZWRocmVjLWVtcHR5IHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDI0cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1lZGhyZWMtbGlua3MgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAgbWFyZ2luLXRvcDogMTJweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLmNvbGwtZWRocmVjLWxpbmsgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogNnB4IDE0cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIHRleHQtZGVjb3Jh' +
'dGlvbjogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1czsKfQoKLmNvbGwtZWRocmVjLWxpbms6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi8qIERlY2tzIHRhYiAqLwouY29sbC1kZWNrcy10YWIgewogICAgcGFkZGluZzogOHB4IDA7Cn0KCi5jb2xsLWRlY2tzLWhpbnQgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgouY29sbC1kZWNrcy1saW5rcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4Owp9CgouY29sbC1kZWNrLWxpbmsgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzLCBiYWNrZ3JvdW5kIDAuMTVzOwp9CgouY29sbC1kZWNrLWxpbms6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMDgpOwp9CgovKiDilIDilIAgNy4gTW9kYWwgT3ZlcmxheXMgKEltcG9ydCAvIEV4cG9ydCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouY29sbC1tb2RhbC1vdmVybGF5IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpOwogICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTsKICAgIHotaW5kZXg6IDEwMDA7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAyMHB4Owp9CgouY29sbC1tb2RhbC1vdmVybGF5LmFjdGl2ZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwp9CgouY29sbC1tb2RhbC1jb250ZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgd2lkdGg6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDUwMHB4OwogICAgbWF4LWhlaWdodDogODB2aDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nOiAyNHB4OwogICAgYW5pbWF0aW9uOiBjb2xsLXNsaWRlLXVwIDAuMnMgZWFzZTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyKSB0cmFuc3BhcmVudDsKfQoKLmNvbGwtbW9kYWwtY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDZweDsKfQoKLmNvbGwtbW9kYWwtY29udGVudDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCi5jb2xsLW1vZGFsLWNvbnRlbnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5jb2xsLW1vZGFsLXdpZGUgewogICAgbWF4LXdpZHRoOiA2NDBweDsKfQoKLmNvbGwtbW9kYWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKfQoKLmNvbGwtbW9kYWwtaGVhZGVyIGgyLAouY29sbC1tb2RhbC1oZWFkZXIgaDMgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgbWFyZ2luOiAwOwp9CgouY29sbC1t' +
'b2RhbC1jbG9zZSB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgZm9udC1zaXplOiAxOHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1czsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5jb2xsLW1vZGFsLWNsb3NlOmhvdmVyIHsKICAgIGNvbG9yOiAjZmZmOwp9CgouY29sbC1tb2RhbC1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGdhcDogOHB4Owp9CgovKiDilIDilIAgOC4gSW1wb3J0IE1vZGFsIEludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi8qIFN0ZXAgZG90cyAqLwouY29sbC1pbXBvcnQtc3RlcHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKfQoKLmNvbGwtc3RlcC1kb3QgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzLCBjb2xvciAwLjE1cywgYm9yZGVyLWNvbG9yIDAuMTVzOwp9CgouY29sbC1zdGVwLWRvdC5hY3RpdmUgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiAjMDAwOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1zdGVwLWRvdC5kb25lIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwogICAgY29sb3I6ICMwMDA7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgouY29sbC1zdGVwLXNlcCB7CiAgICBjb2xvcjogdmFyKC0tYm9yZGVyKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDAgMnB4Owp9CgovKiBJbXBvcnQgc3RlcCBjb250ZW50ICovCi5jb2xsLWltcG9ydC1zdGVwLWNvbnRlbnQgewogICAgbWluLWhlaWdodDogMTUwcHg7Cn0KCi8qIFN0ZXAgMTogU291cmNlIGxpc3QgKi8KLmNvbGwtc291cmNlLWxpc3QgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKfQoKLmNvbGwtc291cmNlLW9wdGlvbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1czsKfQoKLmNvbGwtc291cmNlLW9wdGlvbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLXNvdXJjZS1vcHRpb24uc2VsZWN0ZWQgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMDgpOwp9CgouY29sbC1zb3VyY2Utb3B0aW9uIGlucHV0W3R5cGU9InJhZGlvIl0gewogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5jb2xsLXNvdXJjZS1pbmZvIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAy' +
'cHg7Cn0KCi5jb2xsLXNvdXJjZS1uYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogI2ZmZjsKfQoKLmNvbGwtc291cmNlLWRlc2MgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi8qIFN0ZXAgMjogQ29udGVudCAvIHRleHRhcmVhICovCi5jb2xsLWltcG9ydC10ZXh0YXJlYS13cmFwLAouY29sbC1pbXBvcnQtZmlsZS13cmFwIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA4cHg7Cn0KCi5jb2xsLWZvcm0tbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLmNvbGwtaW1wb3J0LXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogMTJweDsKICAgIGZvbnQtZmFtaWx5OiAnQ2FzY2FkaWEgQ29kZScsICdGaXJhIENvZGUnLCAnQ29uc29sYXMnLCBtb25vc3BhY2U7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogMS41OwogICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgIG1pbi1oZWlnaHQ6IDIwMHB4OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgYm94LXNoYWRvdyAwLjE1czsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7Cn0KCi5jb2xsLWltcG9ydC10ZXh0YXJlYTpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tYWNjZW50LWdsb3cpOwp9CgouY29sbC1pbXBvcnQtaGludCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLmNvbGwtaW1wb3J0LWhpbnQgY29kZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgcGFkZGluZzogMXB4IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLyogRmlsZSBkcm9wIHpvbmUgKi8KLmNvbGwtZmlsZS1kcm9wLXpvbmUgewogICAgYm9yZGVyOiAycHggZGFzaGVkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogMjRweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1czsKfQoKLmNvbGwtZmlsZS1kcm9wLXpvbmU6aG92ZXIsCi5jb2xsLWZpbGUtZHJvcC16b25lLmRyYWctb3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDkxLCAxNTgsIDI0MCwgMC4wNSk7Cn0KCi5jb2xsLWZpbGUtZHJvcC16b25lIGlucHV0W3R5cGU9ImZpbGUiXSB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIG9wYWNpdHk6IDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5jb2xsLWZpbGUtZHJvcC1sYWJlbCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1maWxlLW9rIHsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5jb2xsLWZpbGUtcHJldmlldyB7CiAgICBtYXJnaW4tdG9wOiA4cHg7Cn0KCi5jb2xsLWZpbGUtcHJldmlldy1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9CgouY29sbC1maWxlLXByZXZpZXctdGV4dCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiA4cHg7CiAgICBmb250LXNpemU6IDEx' +
'cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgd2hpdGUtc3BhY2U6IHByZTsKICAgIGZvbnQtZmFtaWx5OiAnQ2FzY2FkaWEgQ29kZScsICdGaXJhIENvZGUnLCAnQ29uc29sYXMnLCBtb25vc3BhY2U7CiAgICBtYXJnaW46IDA7Cn0KCi8qIFN0ZXAgMzogTWFwcGluZyAqLwouY29sbC1tYXBwaW5nLWhpbnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7Cn0KCi5jb2xsLW1hcHBpbmctdGFibGUgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwp9CgouY29sbC1tYXBwaW5nLXRhYmxlIHRoIHsKICAgIHBhZGRpbmc6IDhweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmNvbGwtbWFwcGluZy10YWJsZSB0ZCB7CiAgICBwYWRkaW5nOiA2cHggOHB4OwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLmNvbGwtbWFwcGluZy1yb3cgdGQ6Zmlyc3QtY2hpbGQgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGZvbnQtZmFtaWx5OiAnQ2FzY2FkaWEgQ29kZScsICdGaXJhIENvZGUnLCAnQ29uc29sYXMnLCBtb25vc3BhY2U7Cn0KCi5jb2xsLW1hcHBpbmctc2VsZWN0IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDRweCA4cHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICB3aWR0aDogMTAwJTsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXM7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5jb2xsLW1hcHBpbmctc2VsZWN0OmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLyogU3RlcCA0OiBPcHRpb25zICovCi5jb2xsLWltcG9ydC1vcHRpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAxNnB4Owp9CgouY29sbC1mb3JtLWdyb3VwIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiA2cHg7Cn0KCi5jb2xsLW1vZGUtZGVzYyB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tdG9wOiAycHg7Cn0KCi5jb2xsLWltcG9ydC13YXJuIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiB2YXIoLS13YXJuaW5nKTsKICAgIHBhZGRpbmc6IDEwcHggMTRweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjEwLCAxNTMsIDM0LCAwLjA4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjEwLCAxNTMsIDM0LCAwLjMpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi8qIEltcG9ydCBmb290ZXIgYnV0dG9ucyAqLwouY29sbC1pbXBvcnQtZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgbWFyZ2luLXRvcDogMjBweDsKICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBnYXA6IDhweDsKfQoKLmNvbGwtYnRuLXByaW1hcnkgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiAjMDAwOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiA4cHggMjRweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIHRy' +
'YW5zZm9ybSAwLjE1czsKfQoKLmNvbGwtYnRuLXByaW1hcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWhvdmVyKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKfQoKLmNvbGwtYnRuLXNlY29uZGFyeSB7CiAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzOwp9CgouY29sbC1idG4tc2Vjb25kYXJ5OmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLyogSW1wb3J0IHJlc3VsdCAvIHN0YXR1cyAqLwouY29sbC1pbXBvcnQtc3RhdHVzIHsKICAgIG1hcmdpbi10b3A6IDEycHg7Cn0KCi5jb2xsLWltcG9ydC1wcm9ncmVzcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgcGFkZGluZzogMTJweDsKfQoKLmNvbGwtaW1wb3J0LXJlc3VsdCB7CiAgICBwYWRkaW5nOiAxNnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjY7CiAgICBtYXJnaW4tYm90dG9tOiAxMnB4Owp9CgouY29sbC1pbXBvcnQtcmVzdWx0LnN1Y2Nlc3MgewogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgYmFja2dyb3VuZDogcmdiYSg0NiwgMTYwLCA2NywgMC4wOCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDQ2LCAxNjAsIDY3LCAwLjMpOwp9CgouY29sbC1pbXBvcnQtcmVzdWx0LmVycm9yIHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0OCwgODEsIDczLCAwLjA4KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjQ4LCA4MSwgNzMsIDAuMyk7Cn0KCi5jb2xsLWltcG9ydC1lcnJvcnMgewogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmNvbGwtaW1wb3J0LWVycm9ycy1sYWJlbCB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLWJvdHRvbTogNnB4OwogICAgY29sb3I6IHZhcigtLXdhcm5pbmcpOwp9CgouY29sbC1pbXBvcnQtZXJyb3JzIHVsIHsKICAgIGxpc3Qtc3R5bGU6IGRpc2M7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7Cn0KCi5jb2xsLWltcG9ydC1lcnJvcnMgbGkgewogICAgcGFkZGluZzogMnB4IDA7Cn0KCi8qIOKUgOKUgCA5LiBFeHBvcnQgTW9kYWwgSW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmNvbGwtZXhwb3J0LWZvcm0gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDE2cHg7Cn0KCi5jb2xsLWV4cG9ydC1zZWxlY3QgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBvdXRsaW5lOiBub25lOwogICAgd2lkdGg6IDEwMCU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4xNXM7Cn0KCi5jb2xsLWV4cG9ydC1zZWxlY3Q6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1leHBvcnQtaW5mbyB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0t' +
'dGV4dC1zZWNvbmRhcnkpOwp9CgovKiDilIDilIAgMTAuIENhdGVnb3J5IFBvcG92ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgojY29sbC1jYXQtcG9wb3ZlciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDEycHg7CiAgICB6LWluZGV4OiAzMDA7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIG1pbi13aWR0aDogMjIwcHg7CiAgICBtYXgtd2lkdGg6IDMyMHB4Owp9CgouY29sbC1wb3BvdmVyLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5jb2xsLXBvcG92ZXItY2xvc2UgewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBwYWRkaW5nOiAycHggNHB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1czsKfQoKLmNvbGwtcG9wb3Zlci1jbG9zZTpob3ZlciB7CiAgICBjb2xvcjogI2ZmZjsKfQoKLmNvbGwtcG9wb3Zlci1jaGlwcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC13cmFwOiB3cmFwOwogICAgZ2FwOiA0cHg7CiAgICBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KCi5jb2xsLXBvcG92ZXItY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDRweDsKICAgIHBhZGRpbmc6IDNweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjEyKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjMpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLXBvcG92ZXItc3VnZ2VzdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogNHB4OwogICAgbWFyZ2luLWJvdHRvbTogNnB4Owp9CgouY29sbC1wb3BvdmVyLXN1Z2dlc3QtYnRuIHsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgYm9yZGVyOiAxcHggZGFzaGVkIHZhcigtLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzLCBjb2xvciAwLjE1czsKfQoKLmNvbGwtcG9wb3Zlci1zdWdnZXN0LWJ0bjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmNvbGwtcG9wb3Zlci1hZGQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDZweDsKICAgIG1hcmdpbi10b3A6IDRweDsKfQoKLyog4pSA4pSAIDExLiBMb2FkaW5nIC8gU3Bpbm5lciAvIEVtcHR5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKI2NvbGwtbG9hZGluZyB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTIsIDE0LCAyMCwgMC43KTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB6LWluZGV4OiA1MDsKfQoKLmNvbGwtc3Bpbm5lciB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKICAgIGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXIt' +
'dG9wOiAzcHggc29saWQgdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGFuaW1hdGlvbjogY29sbC1zcGluIDAuOHMgbGluZWFyIGluZmluaXRlOwp9CgouY29sbC1zcGlubmVyLWlubGluZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItdG9wOiAycHggc29saWQgdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGFuaW1hdGlvbjogY29sbC1zcGluIDAuOHMgbGluZWFyIGluZmluaXRlOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLmNvbGwtZW1wdHkgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMzJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5jb2xsLWVtcHR5LXN0YXRlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDI0cHg7Cn0KCi5jb2xsLWVtcHR5LWljb24gewogICAgZm9udC1zaXplOiA0OHB4Owp9CgovKiDilIDilIAgMTIuIFJlc3BvbnNpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpAbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7CiAgICAuY29sbC1maWx0ZXJzIHsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICB9CgogICAgLmNvbGwtZHJhd2VyIHsKICAgICAgICB3aWR0aDogMzYwcHg7CiAgICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgLmNvbGwtbWFpbiB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIH0KCiAgICAuY29sbC1maWx0ZXJzIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICAgICAgbWF4LWhlaWdodDogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGdhcDogMTJweDsKICAgIH0KCiAgICAuY29sbC1maWx0ZXItc2VjdGlvbiB7CiAgICAgICAgbWluLXdpZHRoOiAxODBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgfQoKICAgIC5jb2xsLWRyYXdlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CgogICAgLmNvbGwtdG9wYmFyIHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAxNnB4OwogICAgfQoKICAgIC5jb2xsLXNlYXJjaCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3JkZXI6IDM7CiAgICB9CgogICAgLmNvbGwtdGFibGUtY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgfQoKICAgIC5jb2xsLXNvdXJjZS1saXN0IHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgfQp9CgovKiDilIDilIAgMTMuIFNjcm9sbGJhciBTdHlsaW5nIChnbG9iYWwgZm9yIGNvbGxlY3Rpb24gcGFnZSkg4pSA4pSA4pSA4pSAICovCgojY29sbGVjdGlvbi1wYWdlIDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4Owp9CgojY29sbGVjdGlvbi1wYWdlIDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cn0KCiNjb2xsZWN0aW9uLXBhZ2UgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogM3B4Owp9CgojY29sbGVjdGlvbi1wYWdlIDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgovKiDilIDilIAgMTQuIENhcmQgU2Nhbm5lciBNb2RhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5jb2xsLXNjYW4tY29udGVudCB7CiAgICBwYWRkaW5nOiAwIDRweDsKfQoKLmNvbGwtc2Nhbi11' +
'cGxvYWQtYXJlYSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTZweDsKICAgIHBhZGRpbmc6IDhweCAwOwp9CgouY29sbC1zY2FuLWRyb3B6b25lIHsKICAgIGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgbWluLWhlaWdodDogMjAwcHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnMsIGJhY2tncm91bmQgMC4yczsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5jb2xsLXNjYW4tZHJvcHpvbmU6aG92ZXIsCi5jb2xsLXNjYW4tZHJvcHpvbmUuZHJhZy1vdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjA0KTsKfQoKLmNvbGwtc2Nhbi1kcm9wem9uZS10ZXh0IHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiA0MHB4IDIwcHg7Cn0KCi5jb2xsLXNjYW4tcHJldmlldy1pbWcgewogICAgbWF4LXdpZHRoOiAxMDAlOwogICAgbWF4LWhlaWdodDogMzYwcHg7CiAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgYm9yZGVyLXJhZGl1czogNHB4Owp9CgouY29sbC1zY2FuLW9wdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IDhweDsKfQoKLmNvbGwtc2Nhbi1tb2RlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDIwcHg7Cn0KCi5jb2xsLXJhZGlvLWxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA2cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5jb2xsLXJhZGlvLWxhYmVsIGlucHV0W3R5cGU9InJhZGlvIl0gewogICAgYWNjZW50LWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1zY2FuLWhpbnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmNvbGwtc2Nhbi1mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxNnB4IDAgNHB4OwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBtYXJnaW4tdG9wOiAxMnB4Owp9CgouY29sbC1zY2FuLWZvb3RlciAuY29sbC1idG4tcHJpbWFyeS5zY2FubmluZyB7CiAgICBvcGFjaXR5OiAwLjc7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogU2NhbiBSZXN1bHRzICovCgouY29sbC1zY2FuLXJlc3VsdHMtd3JhcCB7CiAgICBwYWRkaW5nOiA0cHggMDsKfQoKLmNvbGwtc2Nhbi1yZXN1bHRzLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmNvbGwtYnRuLWxpbmsgewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgcGFkZGluZzogMnB4IDRweDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246IHRleHQtZGVjb3JhdGlvbi1jb2xvciAwLjE1czsKfQoKLmNvbGwtYnRuLWxpbms6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY29sbC1zY2FuLXJlc3VsdHMtbGlzdCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgbWF4LWhlaWdodDogNDIwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZy1yaWdodDogNHB4Owp9CgouY29sbC1zY2FuLXJlc3Vs' +
'dC1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxMHB4IDEycHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1czsKfQoKLmNvbGwtc2Nhbi1yZXN1bHQtcm93OmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1zY2FuLXJlc3VsdC1yb3cuY29sbC1zY2FuLWVycm9yIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDgsIDgxLCA3MywgMC4zKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ4LCA4MSwgNzMsIDAuMDYpOwp9CgouY29sbC1zY2FuLXJlc3VsdC1jaGVjayB7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmNvbGwtc2Nhbi1yZXN1bHQtY2hlY2sgaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLmNvbGwtc2Nhbi1yZXN1bHQtaW1nIHsKICAgIHdpZHRoOiA1NnB4OwogICAgaGVpZ2h0OiA3OHB4OwogICAgb2JqZWN0LWZpdDogY292ZXI7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKfQoKLmNvbGwtc2Nhbi1yZXN1bHQtaW1nLXBsYWNlaG9sZGVyIHsKICAgIHdpZHRoOiA1NnB4OwogICAgaGVpZ2h0OiA3OHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmNvbGwtc2Nhbi1yZXN1bHQtaW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgouY29sbC1zY2FuLXJlc3VsdC1uYW1lIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgouY29sbC1zY2FuLXJlc3VsdC1tZXRhIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBtYXJnaW4tdG9wOiAycHg7Cn0KCi5jb2xsLXNjYW4tcmVzdWx0LWVyciB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tbGFiLWRhbmdlciwgdmFyKC0tZXJyb3IpKTsKfQoKLmNvbGwtc2Nhbi1jb25mLWhpZ2ggICB7IGNvbG9yOiB2YXIoLS1sYWItc3VjY2VzcywgdmFyKC0tc3VjY2VzcykpOyBmb250LXdlaWdodDogNTAwOyB9Ci5jb2xsLXNjYW4tY29uZi1tZWRpdW0geyBjb2xvcjogdmFyKC0tbGFiLXdhcm5pbmcsIHZhcigtLXdhcm5pbmcpKTsgZm9udC13ZWlnaHQ6IDUwMDsgfQouY29sbC1zY2FuLWNvbmYtbG93ICAgIHsgY29sb3I6IHZhcigtLWxhYi1kYW5nZXIsIHZhcigtLWVycm9yKSk7ICBmb250LXdlaWdodDogNTAwOyB9CgouY29sbC1zY2FuLXJlc3VsdC1xdHkgewogICAgZmxleC1zaHJpbms6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDJweDsKfQoKLmNvbGwtc2Nhbi1yZXN1bHQtcXR5IGxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgouY29sbC1zY2FuLXF0eS1pbnB1dCB7CiAgICB3aWR0aDogNDhweDsKICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouY29sbC1zY2FuLXF0eS1pbnB1dDpmb2N1cyB7CiAgICBvdXRsaW5lOiBu' +
'b25lOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgovKiBTY2FuIHN0YXR1cyBtZXNzYWdlcyAqLwouY29sbC1zY2FuLXN0YXR1cyB7CiAgICBwYWRkaW5nOiAwIDRweDsKfQoKLmNvbGwtc2Nhbi1wcm9ncmVzcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHBhZGRpbmc6IDhweCAwOwp9CgouY29sbC1zY2FuLXN1Y2Nlc3MgewogICAgY29sb3I6IHZhcigtLWxhYi1zdWNjZXNzLCB2YXIoLS1zdWNjZXNzKSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBwYWRkaW5nOiA4cHggMDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5jb2xsLXNjYW4tZXJyb3ItbXNnIHsKICAgIGNvbG9yOiB2YXIoLS1sYWItZGFuZ2VyLCB2YXIoLS1lcnJvcikpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgcGFkZGluZzogOHB4IDA7Cn0KCi8qIE1hbnVhbCBuYW1lIGVudHJ5ICovCgouY29sbC1zY2FuLXJlc3VsdC1lcnItd3JhcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogOHB4OwogICAgZmxleDogMTsKfQoKLmNvbGwtc2Nhbi1tYW51YWwtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5jb2xsLXNjYW4tbWFudWFsLWlucHV0IHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5jb2xsLXNjYW4tbWFudWFsLWlucHV0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5jb2xsLXNjYW4tbWFudWFsLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouY29sbC1idG4tc20gewogICAgcGFkZGluZzogNXB4IDEycHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cywgYmFja2dyb3VuZCAwLjE1czsKfQoKLmNvbGwtYnRuLXNtOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjA4KTsKfQoKLmNvbGwtc2Nhbi1tYW51YWwtYWRkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxMnB4IDAgNHB4OwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBtYXJnaW4tdG9wOiA4cHg7Cn0KCi5jb2xsLXNjYW4tbWFudWFsLWlucHV0LWJvdHRvbSB7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5jb2xsLXNjYW4tcmVzdWx0LXJvdy5jb2xsLXNjYW4tbWFudWFsLWFkZGVkIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg2MywgMTg1LCA4MCwgMC4zKTsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjMsIDE4NSwgODAsIDAuMDQpOwp9CgouY29sbC1zY2FuLXJlbW92ZS1tYW51YWwgewogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLmNvbGwtc2Nhbi1yZW1vdmUtbWFudWFsOmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS1sYWItZGFuZ2VyLCB2YXIoLS1lcnJvcikpOwp9CgovKiDilIDilIAgMTUuIEFuaW1hdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpAa2V5ZnJhbWVzIGNvbGwtZmFkZS1p' +
'biB7CiAgICBmcm9tIHsgb3BhY2l0eTogMDsgfQogICAgdG8gICB7IG9wYWNpdHk6IDE7IH0KfQoKQGtleWZyYW1lcyBjb2xsLXNsaWRlLXVwIHsKICAgIGZyb20gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7CiAgICB9CiAgICB0byB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9Cn0KCkBrZXlmcmFtZXMgY29sbC1zcGluIHsKICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQp9Cg=='
Install-B64 -R 'ui\collection.css' -B $b
# ui/collection.html (843 bytes)
$b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgPHRpdGxlPkNvbW1hbmRlciBBSSBMYWIg4oCUIENvbGxlY3Rpb248L3RpdGxlPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIiAvPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbiAvPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs1MDA7NjAwOzcwMCZkaXNwbGF5PXN3YXAiIHJlbD0ic3R5bGVzaGVldCIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZ2xvYmFsLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29sbGVjdGlvbi5jc3MiIC8+CjwvaGVhZD4KPGJvZHk+CiAgICA8c2NyaXB0IHNyYz0ibmF2LmpzIj48L3NjcmlwdD4KICAgIDxkaXYgaWQ9ImNvbGxlY3Rpb24tY29udGFpbmVyIj48L2Rpdj4KICAgIDxzY3JpcHQgc3JjPSJjb2xsZWN0aW9uLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBDb2xsZWN0aW9uLmluaXQoKTsKICAgICAgICB9KTsKICAgIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K'
Install-B64 -R 'ui\collection.html' -B $b
# ui/collection.js (122,033 bytes)
$b = 'LyoqCiAqIENvbW1hbmRlciBBSSBMYWIg4oCUIENvbGxlY3Rpb24gTWFuYWdlbWVudCBVSQogKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKICoKICogRW5kcG9pbnRzIGNvbnN1bWVkOgogKiAgIEdFVCAgIC9hcGkvY29sbGVjdGlvbiAgICAgICAgICAgICAg4oCUIGxpc3Qgd2l0aCBmaWx0ZXJzL3BhZ2luYXRpb24vc29ydAogKiAgIEdFVCAgIC9hcGkvY29sbGVjdGlvbi97aWR9ICAgICAgICAg4oCUIGNhcmQgZGV0YWlsCiAqICAgUEFUQ0ggL2FwaS9jb2xsZWN0aW9uL3tpZH0gICAgICAgICDigJQgdXBkYXRlIGNhcmQgKGNhdGVnb3J5LCB0YWdzLCBub3RlcywgZmluaXNoKQogKiAgIFBPU1QgIC9hcGkvY29sbGVjdGlvbi9pbXBvcnQgICAgICAg4oCUIGltcG9ydCBjYXJkcwogKiAgIEdFVCAgIC9hcGkvY29sbGVjdGlvbi9leHBvcnQgICAgICAg4oCUIGV4cG9ydCBjYXJkcyAoZmlsZSBkb3dubG9hZCkKICogICBHRVQgICAvYXBpL2NvbGxlY3Rpb24ve2lkfS9lZGhyZWMgIOKAlCBFREhSRUMgcmVjb21tZW5kYXRpb25zCiAqLwoKY29uc3QgQ29sbGVjdGlvbiA9ICgoKSA9PiB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8g4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBjb25zdCBBUElfQkFTRSA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47CiAgICBjb25zdCBMU19QUkVGU19LRVkgPSAnY29sbF9wcmVmZXJlbmNlcyc7CiAgICBjb25zdCBERUJPVU5DRV9NUyA9IDMwMDsKCiAgICBjb25zdCBDT0xPUl9NQVAgPSB7CiAgICAgICAgVzogeyBsYWJlbDogJ1cnLCBiZzogJyNmOWZhZjQnLCBjb2xvcjogJyMzZDM5MjknIH0sCiAgICAgICAgVTogeyBsYWJlbDogJ1UnLCBiZzogJyMwZTY3YWInLCBjb2xvcjogJyNmZmYnIH0sCiAgICAgICAgQjogeyBsYWJlbDogJ0InLCBiZzogJyMyYjI0MjQnLCBjb2xvcjogJyNjY2MnIH0sCiAgICAgICAgUjogeyBsYWJlbDogJ1InLCBiZzogJyNkMzIwMmEnLCBjb2xvcjogJyNmZmYnIH0sCiAgICAgICAgRzogeyBsYWJlbDogJ0cnLCBiZzogJyMwMDczM2UnLCBjb2xvcjogJyNmZmYnIH0sCiAgICAgICAgQzogeyBsYWJlbDogJ0MnLCBiZzogJyM3MDZmNmYnLCBjb2xvcjogJyNmZmYnIH0sCiAgICB9OwoKICAgIGNvbnN0IENBUkRfVFlQRVMgPSBbJ0NyZWF0dXJlJywgJ0luc3RhbnQnLCAnU29yY2VyeScsICdBcnRpZmFjdCcsICdFbmNoYW50bWVudCcsICdQbGFuZXN3YWxrZXInLCAnTGFuZCddOwogICAgY29uc3QgQ0FURUdPUllfU1VHR0VTVElPTlMgPSBbJ1JhbXAnLCAnRHJhdycsICdSZW1vdmFsJywgJ0JvYXJkIFdpcGUnLCAnQW50aGVtJywgJ1Byb3RlY3Rpb24nLCAnVHV0b3InLCAnQ291bnRlcicsICdUb2tlbicsICdTYWNyaWZpY2UnLCAnUmVjdXJzaW9uJywgJ0dyYXZleWFyZCcsICdMaWZlZ2FpbicsICdCdXJuJywgJ1N0YXgnLCAnRXZhc2lvbicsICdGaW5pc2hlcicsICdDb21ibyddOwoKICAgIGNvbnN0IEZJRUxEX09QVElPTlMgPSBbCiAgICAgICAgeyB2YWx1ZTogJ0lHTk9SRScsICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ+KAlCBJZ25vcmUg4oCUJyB9LAogICAgICAgIHsgdmFsdWU6ICdRVUFOVElUWScsICAgICAgICAgICAgICAgICAgbGFiZWw6ICdRdWFudGl0eScgfSwKICAgICAgICB7IHZhbHVlOiAnTkFNRScsICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTmFtZScgfSwKICAgICAgICB7IHZhbHVlOiAnU0VUX0NPREUnLCAgICAgICAgICAgICAgICAgIGxhYmVsOiAnU2V0IENvZGUnIH0sCiAgICAgICAgeyB2YWx1ZTogJ1NFVF9DT0RFX1NFQ09OREFSWScsICAgICAgICBsYWJlbDogJ1NldCBDb2RlIChzZWNvbmRhcnkpJyB9LAogICAgICAgIHsgdmFsdWU6ICdDT0xMRUNUT1JfTlVNQkVSJywgICAgICAgICAgbGFiZWw6ICdDb2xsZWN0b3IgTnVtYmVyJyB9LAogICAgICAgIHsgdmFsdWU6ICdDT0xMRUNUT1JfTlVNQkVSX1NFQ09OREFSWScsbGFiZWw6ICdDb2xsZWN0b3IgTnVtYmVyIChzZWNvbmRhcnkpJyB9LAogICAgICAgIHsgdmFsdWU6ICdGSU5JU0gnLCAgICAgICAgICAgICAgICAgICAgbGFi' +
'ZWw6ICdGaW5pc2gnIH0sCiAgICAgICAgeyB2YWx1ZTogJ0NPTkRJVElPTicsICAgICAgICAgICAgICAgICBsYWJlbDogJ0NvbmRpdGlvbicgfSwKICAgICAgICB7IHZhbHVlOiAnTEFOR1VBR0UnLCAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGFuZ3VhZ2UnIH0sCiAgICBdOwoKICAgIGNvbnN0IE1PWEZJRUxEX0RFRkFVTFRTID0gewogICAgICAgICdDb3VudCc6ICAgICAgICAgICAgJ1FVQU5USVRZJywKICAgICAgICAnTmFtZSc6ICAgICAgICAgICAgICdOQU1FJywKICAgICAgICAnRWRpdGlvbic6ICAgICAgICAgICdTRVRfQ09ERScsCiAgICAgICAgJ0ZvaWwnOiAgICAgICAgICAgICAnRklOSVNIJywKICAgICAgICAnQ29sbGVjdG9yIE51bWJlcic6ICdDT0xMRUNUT1JfTlVNQkVSJywKICAgICAgICAnQ29uZGl0aW9uJzogICAgICAgICdDT05ESVRJT04nLAogICAgICAgICdMYW5ndWFnZSc6ICAgICAgICAgJ0xBTkdVQUdFJywKICAgIH07CgogICAgY29uc3QgQVJDSElERUtUX0RFRkFVTFRTID0gewogICAgICAgICdRdWFudGl0eSc6ICAgICAgICAgJ1FVQU5USVRZJywKICAgICAgICAnTmFtZSc6ICAgICAgICAgICAgICdOQU1FJywKICAgICAgICAnU2V0IENvZGUnOiAgICAgICAgICdTRVRfQ09ERScsCiAgICAgICAgJ0NvbGxlY3RvciBOdW1iZXInOiAnQ09MTEVDVE9SX05VTUJFUicsCiAgICB9OwoKICAgIC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGxldCBzdGF0ZSA9IHsKICAgICAgICBpdGVtczogW10sCiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogNTAsCiAgICAgICAgdG90YWw6IDAsCiAgICAgICAgbG9hZGluZzogZmFsc2UsCiAgICAgICAgc2VhcmNoOiAnJywKICAgICAgICBzb3J0RmllbGQ6ICduYW1lJywKICAgICAgICBzb3J0RGlyOiAnYXNjJywKICAgICAgICBmaWx0ZXJzOiB7CiAgICAgICAgICAgIGNvbG9yczogW10sCiAgICAgICAgICAgIHR5cGVzOiBbXSwKICAgICAgICAgICAgaXNMZWdlbmRhcnk6IGZhbHNlLAogICAgICAgICAgICBpc0Jhc2ljOiBmYWxzZSwKICAgICAgICAgICAgaXNHYW1lQ2hhbmdlcjogZmFsc2UsCiAgICAgICAgICAgIGhpZ2hTYWx0OiBmYWxzZSwKICAgICAgICAgICAgZmluaXNoOiAnJywKICAgICAgICAgICAgY21jTWluOiBudWxsLAogICAgICAgICAgICBjbWNNYXg6IG51bGwsCiAgICAgICAgICAgIHByaWNlTWluOiBudWxsLAogICAgICAgICAgICBwcmljZU1heDogbnVsbCwKICAgICAgICAgICAgY2F0ZWdvcnk6IFtdLAogICAgICAgICAgICByYXJpdHk6IFtdLAogICAgICAgICAgICBzZXRDb2RlOiBbXSwKICAgICAgICAgICAgcG93ZXJNaW46IG51bGwsCiAgICAgICAgICAgIHBvd2VyTWF4OiBudWxsLAogICAgICAgICAgICB0b3VnaE1pbjogbnVsbCwKICAgICAgICAgICAgdG91Z2hNYXg6IG51bGwsCiAgICAgICAgICAgIGtleXdvcmQ6IFtdLAogICAgICAgICAgICBlZGhyZWNNaW46IG51bGwsCiAgICAgICAgICAgIGVkaHJlY01heDogbnVsbCwKICAgICAgICAgICAgcXR5TWluOiBudWxsLAogICAgICAgICAgICBxdHlNYXg6IG51bGwsCiAgICAgICAgfSwKICAgICAgICBjYWNoZWRTZXRzOiBbXSwKICAgICAgICBjYWNoZWRLZXl3b3JkczogW10sCiAgICAgICAgc2VsZWN0ZWRDYXJkOiBudWxsLAogICAgICAgIGRyYXdlck9wZW46IGZhbHNlLAogICAgICAgIGRyYXdlclRhYjogJ292ZXJ2aWV3JywKICAgICAgICBlZGhyZWNEYXRhOiBudWxsLAogICAgICAgIGVkaHJlY0xvYWRpbmc6IGZhbHNlLAogICAgICAgIGltcG9ydFN0ZXA6IDAsCiAgICAgICAgaW1wb3J0U291cmNlOiAnJywKICAgICAgICBpbXBvcnRDb250ZW50OiAnJywKICAgICAgICBpbXBvcnRNYXBwaW5nOiB7fSwKICAgICAgICBpbXBvcnRNb2RlOiAnTUVSR0UnLAogICAgICAgIGltcG9ydEhlYWRlcnM6IFtdLAogICAgICAgIGltcG9ydE1pc3NpbmdGaW5pc2hOb3JtYWw6IHRydWUsCiAgICAgICAgZXhwb3J0T3BlbjogZmFsc2UsCiAgICAgICAgcHJlZmVyZW5jZXM6IHsKICAgICAgICAgICAgcGFnZVNpemU6IDUwLAogICAgICAgICAgICBzb3J0RmllbGQ6ICduYW1lJywKICAgICAgICAgICAgc29ydERpcjogJ2FzYycsCiAgICAgICAgICAgIHZpc2libGVDb2x1bW5zOiBb' +
'J3F1YW50aXR5JywnbmFtZScsJ21hbmFfY29zdCcsJ3R5cGVfbGluZScsJ2NvbG9yX2lkZW50aXR5JywnY21jJywncG93ZXJfdG91Z2huZXNzJywncmFyaXR5Jywnc2V0X25hbWUnLCd0Y2dfcHJpY2UnLCdlZGhyZWNfcmFuaycsJ3NhbHRfc2NvcmUnLCdjYXRlZ29yeScsJ2ZpbmlzaCddLAogICAgICAgIH0sCiAgICB9OwoKICAgIGxldCBzZWFyY2hEZWJvdW5jZVRpbWVyID0gbnVsbDsKCiAgICAvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyKSB7CiAgICAgICAgaWYgKHN0ciA9PSBudWxsKSByZXR1cm4gJyc7CiAgICAgICAgcmV0dXJuIFN0cmluZyhzdHIpCiAgICAgICAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpCiAgICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JykKICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKQogICAgICAgICAgICAucmVwbGFjZSgvIi9nLCAnJnF1b3Q7JykKICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgJyYjMzk7Jyk7CiAgICB9CgogICAgZnVuY3Rpb24gZXNjYXBlQXR0cihzdHIpIHsKICAgICAgICByZXR1cm4gZXNjYXBlSHRtbChzdHIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFByaWNlKHByaWNlKSB7CiAgICAgICAgaWYgKHByaWNlID09IG51bGwgfHwgaXNOYU4ocHJpY2UpKSByZXR1cm4gJ+KAlCc7CiAgICAgICAgcmV0dXJuIGAkJHtOdW1iZXIocHJpY2UpLnRvRml4ZWQoMil9YDsKICAgIH0KCiAgICBmdW5jdGlvbiBzYWx0Q2xhc3Moc2NvcmUpIHsKICAgICAgICBpZiAoc2NvcmUgPT0gbnVsbCkgcmV0dXJuICcnOwogICAgICAgIGlmIChzY29yZSA8IDEpICByZXR1cm4gJ3NhbHQtZ3JlZW4nOwogICAgICAgIGlmIChzY29yZSA8IDIpICByZXR1cm4gJ3NhbHQteWVsbG93JzsKICAgICAgICBpZiAoc2NvcmUgPCAzKSAgcmV0dXJuICdzYWx0LW9yYW5nZSc7CiAgICAgICAgcmV0dXJuICdzYWx0LXJlZCc7CiAgICB9CgogICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyLCBsZW4pIHsKICAgICAgICBpZiAoIXN0cikgcmV0dXJuICcnOwogICAgICAgIHJldHVybiBzdHIubGVuZ3RoID4gbGVuID8gc3RyLnNsaWNlKDAsIGxlbikgKyAn4oCmJyA6IHN0cjsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJNYW5hQ29zdChtYW5hQ29zdCkgewogICAgICAgIGlmICghbWFuYUNvc3QpIHJldHVybiAn4oCUJzsKICAgICAgICAvLyBQYXJzZSBtYW5hIHN5bWJvbHMgbGlrZSB7MX17VX17Qn0sIHtYfSwge1cvVX0sIGV0Yy4KICAgICAgICBjb25zdCBzeW1ib2xzID0gbWFuYUNvc3QubWF0Y2goL1x7W159XStcfS9nKTsKICAgICAgICBpZiAoIXN5bWJvbHMpIHJldHVybiBlc2NhcGVIdG1sKG1hbmFDb3N0KTsKICAgICAgICByZXR1cm4gc3ltYm9scy5tYXAoc3ltID0+IHsKICAgICAgICAgICAgY29uc3QgaW5uZXIgPSBzeW0uc2xpY2UoMSwgLTEpOyAvLyBzdHJpcCB7IH0KICAgICAgICAgICAgY29uc3QgY2kgPSBDT0xPUl9NQVBbaW5uZXJdOwogICAgICAgICAgICBpZiAoY2kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9ImNvbGwtbWFuYS1waXAiIHN0eWxlPSJiYWNrZ3JvdW5kOiR7Y2kuYmd9O2NvbG9yOiR7Y2kuY29sb3J9Ij4ke2NpLmxhYmVsfTwvc3Bhbj5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEdlbmVyaWMvY29sb3JsZXNzL1gvaHlicmlkCiAgICAgICAgICAgIHJldHVybiBgPHNwYW4gY2xhc3M9ImNvbGwtbWFuYS1waXAiIHN0eWxlPSJiYWNrZ3JvdW5kOiM3MDZmNmY7Y29sb3I6I2ZmZiI+JHtlc2NhcGVIdG1sKGlubmVyKX08L3NwYW4+YDsKICAgICAgICB9KS5qb2luKCcnKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJDb2xvclBpcHMoY29sb3JJZGVudGl0eSkgewogICAgICAgIGlmICghY29sb3JJZGVudGl0eSB8fCBjb2xvcklkZW50aXR5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29sbC1jb2xvcmxlc3MtcGlwIj5DPC9zcGFuPic7CiAgICAgICAgcmV0dXJuIGNvbG9ySWRlbnRpdHkubWFwKGMgPT4gewogICAgICAgICAgICBjb25zdCBjaSA9IENPTE9SX01BUFtjXTsKICAgICAgICAgICAgaWYgKCFjaSkgcmV0dXJuICcnOwogICAgICAgICAgICByZXR1' +
'cm4gYDxzcGFuIGNsYXNzPSJjb2xsLW1hbmEtcGlwIiBzdHlsZT0iYmFja2dyb3VuZDoke2NpLmJnfTtjb2xvcjoke2NpLmNvbG9yfSIgdGl0bGU9IiR7Y30iPiR7Y2kubGFiZWx9PC9zcGFuPmA7CiAgICAgICAgfSkuam9pbignJyk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyRmluaXNoQmFkZ2UoZmluaXNoKSB7CiAgICAgICAgaWYgKCFmaW5pc2ggfHwgZmluaXNoID09PSAnTk9STUFMJykgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29sbC1maW5pc2gtYmFkZ2UgZmluaXNoLW5vcm1hbCI+Tm9ybWFsPC9zcGFuPic7CiAgICAgICAgaWYgKGZpbmlzaCA9PT0gJ0ZPSUwnKSAgICAgICAgICAgICByZXR1cm4gJzxzcGFuIGNsYXNzPSJjb2xsLWZpbmlzaC1iYWRnZSBmaW5pc2gtZm9pbCI+Rm9pbDwvc3Bhbj4nOwogICAgICAgIGlmIChmaW5pc2ggPT09ICdFVENIRUQnKSAgICAgICAgICAgcmV0dXJuICc8c3BhbiBjbGFzcz0iY29sbC1maW5pc2gtYmFkZ2UgZmluaXNoLWV0Y2hlZCI+RXRjaGVkPC9zcGFuPic7CiAgICAgICAgcmV0dXJuIGA8c3BhbiBjbGFzcz0iY29sbC1maW5pc2gtYmFkZ2UiPiR7ZXNjYXBlSHRtbChmaW5pc2gpfTwvc3Bhbj5gOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckNhdGVnb3J5Q2hpcHMoY2F0ZWdvcmllcywgY2FyZElkKSB7CiAgICAgICAgaWYgKCFjYXRlZ29yaWVzIHx8IGNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gJzxzcGFuIGNsYXNzPSJjb2xsLW5vLWNhdGVnb3J5Ij7igJQ8L3NwYW4+JzsKICAgICAgICByZXR1cm4gY2F0ZWdvcmllcy5tYXAoY2F0ID0+CiAgICAgICAgICAgIGA8c3BhbiBjbGFzcz0iY29sbC1jYXQtY2hpcCIgb25jbGljaz0iZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Q29sbGVjdGlvbi5vcGVuQ2F0ZWdvcnlQb3BvdmVyKCR7Y2FyZElkfSwgdGhpcykiPiR7ZXNjYXBlSHRtbChjYXQpfTwvc3Bhbj5gCiAgICAgICAgKS5qb2luKCcnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaG93TG9hZGluZyhzaG93KSB7CiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWxvYWRpbmcnKTsKICAgICAgICBpZiAoc3Bpbm5lcikgc3Bpbm5lci5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICdmbGV4JyA6ICdub25lJzsKICAgIH0KCiAgICAvLyDilIDilIAgUHJlZmVyZW5jZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gbG9hZFByZWZlcmVuY2VzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHNhdmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfUFJFRlNfS0VZKTsKICAgICAgICAgICAgaWYgKHNhdmVkKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhdmVkKTsKICAgICAgICAgICAgICAgIHN0YXRlLnByZWZlcmVuY2VzID0geyAuLi5zdGF0ZS5wcmVmZXJlbmNlcywgLi4ucGFyc2VkIH07CiAgICAgICAgICAgICAgICBzdGF0ZS5wYWdlU2l6ZSA9IHN0YXRlLnByZWZlcmVuY2VzLnBhZ2VTaXplOwogICAgICAgICAgICAgICAgc3RhdGUuc29ydEZpZWxkID0gc3RhdGUucHJlZmVyZW5jZXMuc29ydEZpZWxkOwogICAgICAgICAgICAgICAgc3RhdGUuc29ydERpciA9IHN0YXRlLnByZWZlcmVuY2VzLnNvcnREaXI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybignW0NvbGxlY3Rpb25dIEZhaWxlZCB0byBsb2FkIHByZWZlcmVuY2VzOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzYXZlUHJlZmVyZW5jZXMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc3RhdGUucHJlZmVyZW5jZXMucGFnZVNpemUgPSBzdGF0ZS5wYWdlU2l6ZTsKICAgICAgICAgICAgc3RhdGUucHJlZmVyZW5jZXMuc29ydEZpZWxkID0gc3RhdGUuc29ydEZpZWxkOwogICAgICAgICAgICBzdGF0ZS5wcmVmZXJlbmNlcy5zb3J0RGlyID0gc3RhdGUuc29ydERpcjsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfUFJFRlNfS0VZLCBKU09OLnN0cmluZ2lmeShzdGF0ZS5wcmVmZXJlbmNlcykpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIHNhdmUgcHJlZmVy' +
'ZW5jZXM6JywgZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBVUkwgU3luYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBzeW5jU3RhdGVGcm9tVXJsKCkgewogICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ3EnKSkgICAgICAgICAgc3RhdGUuc2VhcmNoICAgID0gcGFyYW1zLmdldCgncScpOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdwYWdlJykpICAgICAgIHN0YXRlLnBhZ2UgICAgICA9IHBhcnNlSW50KHBhcmFtcy5nZXQoJ3BhZ2UnKSwgMTApIHx8IDE7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ3BhZ2VTaXplJykpICAgc3RhdGUucGFnZVNpemUgID0gcGFyc2VJbnQocGFyYW1zLmdldCgncGFnZVNpemUnKSwgMTApIHx8IDUwOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdzb3J0RmllbGQnKSkgIHN0YXRlLnNvcnRGaWVsZCA9IHBhcmFtcy5nZXQoJ3NvcnRGaWVsZCcpOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdzb3J0RGlyJykpICAgIHN0YXRlLnNvcnREaXIgICA9IHBhcmFtcy5nZXQoJ3NvcnREaXInKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygnY29sb3JzJykpICAgICBzdGF0ZS5maWx0ZXJzLmNvbG9ycyAgICA9IHBhcmFtcy5nZXQoJ2NvbG9ycycpLnNwbGl0KCcsJykuZmlsdGVyKEJvb2xlYW4pOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCd0eXBlcycpKSAgICAgIHN0YXRlLmZpbHRlcnMudHlwZXMgICAgID0gcGFyYW1zLmdldCgndHlwZXMnKS5zcGxpdCgnLCcpLmZpbHRlcihCb29sZWFuKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygnZmluaXNoJykpICAgICBzdGF0ZS5maWx0ZXJzLmZpbmlzaCAgICA9IHBhcmFtcy5nZXQoJ2ZpbmlzaCcpOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdjYXRlZ29yeScpKSAgIHN0YXRlLmZpbHRlcnMuY2F0ZWdvcnkgID0gcGFyYW1zLmdldCgnY2F0ZWdvcnknKS5zcGxpdCgnLCcpLmZpbHRlcihCb29sZWFuKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygnaXNMZWdlbmRhcnknKSkgICBzdGF0ZS5maWx0ZXJzLmlzTGVnZW5kYXJ5ICAgPSBwYXJhbXMuZ2V0KCdpc0xlZ2VuZGFyeScpID09PSAndHJ1ZSc7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ2lzQmFzaWMnKSkgICAgICAgc3RhdGUuZmlsdGVycy5pc0Jhc2ljICAgICAgID0gcGFyYW1zLmdldCgnaXNCYXNpYycpID09PSAndHJ1ZSc7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ2lzR2FtZUNoYW5nZXInKSkgc3RhdGUuZmlsdGVycy5pc0dhbWVDaGFuZ2VyID0gcGFyYW1zLmdldCgnaXNHYW1lQ2hhbmdlcicpID09PSAndHJ1ZSc7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ2hpZ2hTYWx0JykpICAgICAgc3RhdGUuZmlsdGVycy5oaWdoU2FsdCAgICAgID0gcGFyYW1zLmdldCgnaGlnaFNhbHQnKSA9PT0gJ3RydWUnOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdjbWNNaW4nKSkgICAgc3RhdGUuZmlsdGVycy5jbWNNaW4gICA9IHBhcnNlRmxvYXQocGFyYW1zLmdldCgnY21jTWluJykpOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdjbWNNYXgnKSkgICAgc3RhdGUuZmlsdGVycy5jbWNNYXggICA9IHBhcnNlRmxvYXQocGFyYW1zLmdldCgnY21jTWF4JykpOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdwcmljZU1pbicpKSAgc3RhdGUuZmlsdGVycy5wcmljZU1pbiA9IHBhcnNlRmxvYXQocGFyYW1zLmdldCgncHJpY2VNaW4nKSk7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ3ByaWNlTWF4JykpICBzdGF0ZS5maWx0ZXJzLnByaWNlTWF4ID0gcGFyc2VGbG9hdChwYXJhbXMuZ2V0KCdwcmljZU1heCcpKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygncmFyaXR5JykpICAgIHN0YXRlLmZpbHRlcnMucmFyaXR5ICAgPSBwYXJhbXMuZ2V0KCdyYXJpdHknKS5zcGxpdCgnLCcpLmZpbHRlcihCb29sZWFuKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygnc2V0Q29kZScpKSAgIHN0YXRlLmZpbHRlcnMuc2V0Q29kZSAgPSBwYXJhbXMuZ2V0KCdzZXRDb2RlJykuc3BsaXQoJywnKS5maWx0ZXIoQm9vbGVhbik7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ3Bvd2VyTWluJykpICBzdGF0ZS5maWx0ZXJzLnBvd2VyTWluID0gcGFy' +
'c2VGbG9hdChwYXJhbXMuZ2V0KCdwb3dlck1pbicpKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygncG93ZXJNYXgnKSkgIHN0YXRlLmZpbHRlcnMucG93ZXJNYXggPSBwYXJzZUZsb2F0KHBhcmFtcy5nZXQoJ3Bvd2VyTWF4JykpOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCd0b3VnaE1pbicpKSAgc3RhdGUuZmlsdGVycy50b3VnaE1pbiA9IHBhcnNlRmxvYXQocGFyYW1zLmdldCgndG91Z2hNaW4nKSk7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ3RvdWdoTWF4JykpICBzdGF0ZS5maWx0ZXJzLnRvdWdoTWF4ID0gcGFyc2VGbG9hdChwYXJhbXMuZ2V0KCd0b3VnaE1heCcpKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygna2V5d29yZCcpKSAgIHN0YXRlLmZpbHRlcnMua2V5d29yZCAgPSBwYXJhbXMuZ2V0KCdrZXl3b3JkJykuc3BsaXQoJywnKS5maWx0ZXIoQm9vbGVhbik7CiAgICAgICAgaWYgKHBhcmFtcy5oYXMoJ2VkaHJlY01pbicpKSBzdGF0ZS5maWx0ZXJzLmVkaHJlY01pbiA9IHBhcnNlSW50KHBhcmFtcy5nZXQoJ2VkaHJlY01pbicpKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygnZWRocmVjTWF4JykpIHN0YXRlLmZpbHRlcnMuZWRocmVjTWF4ID0gcGFyc2VJbnQocGFyYW1zLmdldCgnZWRocmVjTWF4JykpOwogICAgICAgIGlmIChwYXJhbXMuaGFzKCdxdHlNaW4nKSkgICAgc3RhdGUuZmlsdGVycy5xdHlNaW4gICA9IHBhcnNlSW50KHBhcmFtcy5nZXQoJ3F0eU1pbicpKTsKICAgICAgICBpZiAocGFyYW1zLmhhcygncXR5TWF4JykpICAgIHN0YXRlLmZpbHRlcnMucXR5TWF4ICAgPSBwYXJzZUludChwYXJhbXMuZ2V0KCdxdHlNYXgnKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHVzaFVybFN0YXRlKCkgewogICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICAgICAgICBpZiAoc3RhdGUuc2VhcmNoKSAgICAgICAgICAgICAgcGFyYW1zLnNldCgncScsICAgICAgICAgICAgc3RhdGUuc2VhcmNoKTsKICAgICAgICBpZiAoc3RhdGUucGFnZSA+IDEpICAgICAgICAgICAgcGFyYW1zLnNldCgncGFnZScsICAgICAgICAgc3RhdGUucGFnZSk7CiAgICAgICAgaWYgKHN0YXRlLnBhZ2VTaXplICE9PSA1MCkgICAgIHBhcmFtcy5zZXQoJ3BhZ2VTaXplJywgICAgIHN0YXRlLnBhZ2VTaXplKTsKICAgICAgICBpZiAoc3RhdGUuc29ydEZpZWxkICE9PSAnbmFtZScpIHBhcmFtcy5zZXQoJ3NvcnRGaWVsZCcsICAgc3RhdGUuc29ydEZpZWxkKTsKICAgICAgICBpZiAoc3RhdGUuc29ydERpciAhPT0gJ2FzYycpICAgcGFyYW1zLnNldCgnc29ydERpcicsICAgICAgc3RhdGUuc29ydERpcik7CiAgICAgICAgaWYgKHN0YXRlLmZpbHRlcnMuY29sb3JzLmxlbmd0aCkgICAgcGFyYW1zLnNldCgnY29sb3JzJywgICAgc3RhdGUuZmlsdGVycy5jb2xvcnMuam9pbignLCcpKTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy50eXBlcy5sZW5ndGgpICAgICBwYXJhbXMuc2V0KCd0eXBlcycsICAgICBzdGF0ZS5maWx0ZXJzLnR5cGVzLmpvaW4oJywnKSk7CiAgICAgICAgaWYgKHN0YXRlLmZpbHRlcnMuZmluaXNoKSAgICAgICAgICAgcGFyYW1zLnNldCgnZmluaXNoJywgICAgc3RhdGUuZmlsdGVycy5maW5pc2gpOwogICAgICAgIGlmIChzdGF0ZS5maWx0ZXJzLmNhdGVnb3J5Lmxlbmd0aCkgIHBhcmFtcy5zZXQoJ2NhdGVnb3J5JywgIHN0YXRlLmZpbHRlcnMuY2F0ZWdvcnkuam9pbignLCcpKTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5pc0xlZ2VuZGFyeSkgICAgICBwYXJhbXMuc2V0KCdpc0xlZ2VuZGFyeScsICAgJ3RydWUnKTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5pc0Jhc2ljKSAgICAgICAgICBwYXJhbXMuc2V0KCdpc0Jhc2ljJywgICAgICAgICd0cnVlJyk7CiAgICAgICAgaWYgKHN0YXRlLmZpbHRlcnMuaXNHYW1lQ2hhbmdlcikgICAgcGFyYW1zLnNldCgnaXNHYW1lQ2hhbmdlcicsICAndHJ1ZScpOwogICAgICAgIGlmIChzdGF0ZS5maWx0ZXJzLmhpZ2hTYWx0KSAgICAgICAgIHBhcmFtcy5zZXQoJ2hpZ2hTYWx0JywgICAgICAgJ3RydWUnKTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5jbWNNaW4gIT0gbnVsbCkgICBwYXJhbXMuc2V0KCdjbWNNaW4nLCAgIHN0YXRlLmZpbHRlcnMuY21jTWluKTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5jbWNNYXggIT0gbnVsbCkgICBwYXJhbXMuc2V0KCdjbWNNYXgnLCAgIHN0YXRlLmZpbHRlcnMuY21jTWF4KTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5wcmljZU1p' +
'biAhPSBudWxsKSBwYXJhbXMuc2V0KCdwcmljZU1pbicsIHN0YXRlLmZpbHRlcnMucHJpY2VNaW4pOwogICAgICAgIGlmIChzdGF0ZS5maWx0ZXJzLnByaWNlTWF4ICE9IG51bGwpIHBhcmFtcy5zZXQoJ3ByaWNlTWF4Jywgc3RhdGUuZmlsdGVycy5wcmljZU1heCk7CiAgICAgICAgaWYgKHN0YXRlLmZpbHRlcnMucmFyaXR5Lmxlbmd0aCkgICAgcGFyYW1zLnNldCgncmFyaXR5JywgICBzdGF0ZS5maWx0ZXJzLnJhcml0eS5qb2luKCcsJykpOwogICAgICAgIGlmIChzdGF0ZS5maWx0ZXJzLnNldENvZGUubGVuZ3RoKSAgIHBhcmFtcy5zZXQoJ3NldENvZGUnLCAgc3RhdGUuZmlsdGVycy5zZXRDb2RlLmpvaW4oJywnKSk7CiAgICAgICAgaWYgKHN0YXRlLmZpbHRlcnMucG93ZXJNaW4gIT0gbnVsbCkgcGFyYW1zLnNldCgncG93ZXJNaW4nLCBzdGF0ZS5maWx0ZXJzLnBvd2VyTWluKTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5wb3dlck1heCAhPSBudWxsKSBwYXJhbXMuc2V0KCdwb3dlck1heCcsIHN0YXRlLmZpbHRlcnMucG93ZXJNYXgpOwogICAgICAgIGlmIChzdGF0ZS5maWx0ZXJzLnRvdWdoTWluICE9IG51bGwpIHBhcmFtcy5zZXQoJ3RvdWdoTWluJywgc3RhdGUuZmlsdGVycy50b3VnaE1pbik7CiAgICAgICAgaWYgKHN0YXRlLmZpbHRlcnMudG91Z2hNYXggIT0gbnVsbCkgcGFyYW1zLnNldCgndG91Z2hNYXgnLCBzdGF0ZS5maWx0ZXJzLnRvdWdoTWF4KTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5rZXl3b3JkLmxlbmd0aCkgICBwYXJhbXMuc2V0KCdrZXl3b3JkJywgIHN0YXRlLmZpbHRlcnMua2V5d29yZC5qb2luKCcsJykpOwogICAgICAgIGlmIChzdGF0ZS5maWx0ZXJzLmVkaHJlY01pbiAhPSBudWxsKSBwYXJhbXMuc2V0KCdlZGhyZWNNaW4nLCBzdGF0ZS5maWx0ZXJzLmVkaHJlY01pbik7CiAgICAgICAgaWYgKHN0YXRlLmZpbHRlcnMuZWRocmVjTWF4ICE9IG51bGwpIHBhcmFtcy5zZXQoJ2VkaHJlY01heCcsIHN0YXRlLmZpbHRlcnMuZWRocmVjTWF4KTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5xdHlNaW4gIT0gbnVsbCkgICBwYXJhbXMuc2V0KCdxdHlNaW4nLCAgIHN0YXRlLmZpbHRlcnMucXR5TWluKTsKICAgICAgICBpZiAoc3RhdGUuZmlsdGVycy5xdHlNYXggIT0gbnVsbCkgICBwYXJhbXMuc2V0KCdxdHlNYXgnLCAgIHN0YXRlLmZpbHRlcnMucXR5TWF4KTsKICAgICAgICBjb25zdCBxcyA9IHBhcmFtcy50b1N0cmluZygpOwogICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCBxcyA/IGA/JHtxc31gIDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lKTsKICAgIH0KCiAgICAvLyDilIDilIAgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIGJ1aWxkQ29sbGVjdGlvblF1ZXJ5KCkgewogICAgICAgIGNvbnN0IHAgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CiAgICAgICAgcC5zZXQoJ3BhZ2UnLCAgICAgIHN0YXRlLnBhZ2UpOwogICAgICAgIHAuc2V0KCdwYWdlU2l6ZScsICBzdGF0ZS5wYWdlU2l6ZSk7CiAgICAgICAgcC5zZXQoJ3NvcnRGaWVsZCcsIHN0YXRlLnNvcnRGaWVsZCk7CiAgICAgICAgcC5zZXQoJ3NvcnREaXInLCAgIHN0YXRlLnNvcnREaXIpOwogICAgICAgIGlmIChzdGF0ZS5zZWFyY2gpIHAuc2V0KCdxJywgc3RhdGUuc2VhcmNoKTsKICAgICAgICBjb25zdCBmID0gc3RhdGUuZmlsdGVyczsKICAgICAgICBpZiAoZi5jb2xvcnMubGVuZ3RoKSAgICBwLnNldCgnY29sb3JzJywgICAgZi5jb2xvcnMuam9pbignLCcpKTsKICAgICAgICBpZiAoZi50eXBlcy5sZW5ndGgpICAgICBwLnNldCgndHlwZXMnLCAgICAgZi50eXBlcy5qb2luKCcsJykpOwogICAgICAgIGlmIChmLmZpbmlzaCkgICAgICAgICAgIHAuc2V0KCdmaW5pc2gnLCAgICBmLmZpbmlzaCk7CiAgICAgICAgaWYgKGYuY2F0ZWdvcnkubGVuZ3RoKSAgcC5zZXQoJ2NhdGVnb3J5JywgIGYuY2F0ZWdvcnkuam9pbignLCcpKTsKICAgICAgICBpZiAoZi5pc0xlZ2VuZGFyeSkgICAgICBwLnNldCgnaXNMZWdlbmRhcnknLCAgICd0cnVlJyk7CiAgICAgICAgaWYgKGYuaXNCYXNpYykgICAgICAgICAgcC5zZXQoJ2lzQmFzaWMnLCAgICAgICAgJ3RydWUnKTsKICAgICAgICBpZiAoZi5pc0dhbWVD' +
'aGFuZ2VyKSAgICBwLnNldCgnaXNHYW1lQ2hhbmdlcicsICAndHJ1ZScpOwogICAgICAgIGlmIChmLmhpZ2hTYWx0KSAgICAgICAgIHAuc2V0KCdoaWdoU2FsdCcsICAgICAgICd0cnVlJyk7CiAgICAgICAgaWYgKGYuY21jTWluICE9IG51bGwpICAgcC5zZXQoJ2NtY01pbicsICAgZi5jbWNNaW4pOwogICAgICAgIGlmIChmLmNtY01heCAhPSBudWxsKSAgIHAuc2V0KCdjbWNNYXgnLCAgIGYuY21jTWF4KTsKICAgICAgICBpZiAoZi5wcmljZU1pbiAhPSBudWxsKSBwLnNldCgncHJpY2VNaW4nLCBmLnByaWNlTWluKTsKICAgICAgICBpZiAoZi5wcmljZU1heCAhPSBudWxsKSBwLnNldCgncHJpY2VNYXgnLCBmLnByaWNlTWF4KTsKICAgICAgICBpZiAoZi5yYXJpdHkubGVuZ3RoKSAgICBwLnNldCgncmFyaXR5JywgICBmLnJhcml0eS5qb2luKCcsJykpOwogICAgICAgIGlmIChmLnNldENvZGUubGVuZ3RoKSAgIHAuc2V0KCdzZXRDb2RlJywgIGYuc2V0Q29kZS5qb2luKCcsJykpOwogICAgICAgIGlmIChmLnBvd2VyTWluICE9IG51bGwpIHAuc2V0KCdwb3dlck1pbicsIGYucG93ZXJNaW4pOwogICAgICAgIGlmIChmLnBvd2VyTWF4ICE9IG51bGwpIHAuc2V0KCdwb3dlck1heCcsIGYucG93ZXJNYXgpOwogICAgICAgIGlmIChmLnRvdWdoTWluICE9IG51bGwpIHAuc2V0KCd0b3VnaE1pbicsIGYudG91Z2hNaW4pOwogICAgICAgIGlmIChmLnRvdWdoTWF4ICE9IG51bGwpIHAuc2V0KCd0b3VnaE1heCcsIGYudG91Z2hNYXgpOwogICAgICAgIGlmIChmLmtleXdvcmQubGVuZ3RoKSAgIHAuc2V0KCdrZXl3b3JkJywgIGYua2V5d29yZC5qb2luKCcsJykpOwogICAgICAgIGlmIChmLmVkaHJlY01pbiAhPSBudWxsKSBwLnNldCgnZWRocmVjTWluJywgZi5lZGhyZWNNaW4pOwogICAgICAgIGlmIChmLmVkaHJlY01heCAhPSBudWxsKSBwLnNldCgnZWRocmVjTWF4JywgZi5lZGhyZWNNYXgpOwogICAgICAgIGlmIChmLnF0eU1pbiAhPSBudWxsKSAgIHAuc2V0KCdxdHlNaW4nLCAgIGYucXR5TWluKTsKICAgICAgICBpZiAoZi5xdHlNYXggIT0gbnVsbCkgICBwLnNldCgncXR5TWF4JywgICBmLnF0eU1heCk7CiAgICAgICAgcmV0dXJuIHAudG9TdHJpbmcoKTsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENvbGxlY3Rpb24oKSB7CiAgICAgICAgaWYgKHN0YXRlLmxvYWRpbmcpIHJldHVybjsKICAgICAgICBzdGF0ZS5sb2FkaW5nID0gdHJ1ZTsKICAgICAgICBzaG93TG9hZGluZyh0cnVlKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBxcyA9IGJ1aWxkQ29sbGVjdGlvblF1ZXJ5KCk7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvY29sbGVjdGlvbj8ke3FzfWApOwogICAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c31gKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIHN0YXRlLml0ZW1zID0gZGF0YS5pdGVtcyB8fCBbXTsKICAgICAgICAgICAgc3RhdGUudG90YWwgPSBkYXRhLnRvdGFsIHx8IDA7CiAgICAgICAgICAgIHN0YXRlLnBhZ2UgID0gZGF0YS5wYWdlICB8fCBzdGF0ZS5wYWdlOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbQ29sbGVjdGlvbl0gZmV0Y2hDb2xsZWN0aW9uIGVycm9yOicsIGVycik7CiAgICAgICAgICAgIHN0YXRlLml0ZW1zID0gW107CiAgICAgICAgICAgIHN0YXRlLnRvdGFsID0gMDsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBzdGF0ZS5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHNob3dMb2FkaW5nKGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgcmVuZGVyVGFibGUoKTsKICAgICAgICByZW5kZXJQYWdpbmF0aW9uKCk7CiAgICAgICAgcmVuZGVyQ291bnRCYWRnZSgpOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2FyZERldGFpbChjYXJkSWQpIHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL2NvbGxlY3Rpb24vJHtjYXJkSWR9YCk7CiAgICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hFZGhyZWNEYXRhKGNhcmRJZCkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNo' +
'KGAke0FQSV9CQVNFfS9hcGkvY29sbGVjdGlvbi8ke2NhcmRJZH0vZWRocmVjYCk7CiAgICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICAgICAgcmV0dXJuIHJlcy5qc29uKCk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gcGF0Y2hDYXJkKGNhcmRJZCwgcGF5bG9hZCkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvY29sbGVjdGlvbi8ke2NhcmRJZH1gLCB7CiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJywKICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLAogICAgICAgIH0pOwogICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXMuc3RhdHVzfWApOwogICAgICAgIHJldHVybiByZXMuanNvbigpOwogICAgfQoKICAgIC8vIOKUgOKUgCBJbml0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgbG9hZFByZWZlcmVuY2VzKCk7CiAgICAgICAgc3luY1N0YXRlRnJvbVVybCgpOwogICAgICAgIHJlbmRlclBhZ2UoKTsKICAgICAgICBiaW5kRXZlbnRzKCk7CiAgICAgICAgYWRqdXN0VGFibGVIZWlnaHQoKTsKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgYWRqdXN0VGFibGVIZWlnaHQpOwogICAgICAgIC8vIFByZS1sb2FkIHNldC9rZXl3b3JkIGNhY2hlcyBmb3IgZmlsdGVyIGF1dG9jb21wbGV0ZQogICAgICAgIGxvYWRTZXRzQ2FjaGUoKTsKICAgICAgICBsb2FkS2V5d29yZHNDYWNoZSgpOwogICAgICAgIGF3YWl0IGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIC8qKiBBZGp1c3QgdGFibGUgY29udGFpbmVyIGhlaWdodCBiYXNlZCBvbiBhY3R1YWwgdG9wYmFyIGhlaWdodCAqLwogICAgZnVuY3Rpb24gYWRqdXN0VGFibGVIZWlnaHQoKSB7CiAgICAgICAgY29uc3QgdG9wYmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbGwtdG9wYmFyJyk7CiAgICAgICAgY29uc3QgdGFibGVXcmFwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbGwtdGFibGUtd3JhcCcpOwogICAgICAgIGlmICh0b3BiYXIgJiYgdGFibGVXcmFwKSB7CiAgICAgICAgICAgIGNvbnN0IHRvcGJhckggPSB0b3BiYXIub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICAvLyAxNnB4IHBhZGRpbmctdG9wIG9mIGNvbGwtbWFpbiArIDE2cHggcGFkZGluZy1ib3R0b20KICAgICAgICAgICAgdGFibGVXcmFwLnN0eWxlLm1heEhlaWdodCA9ICdjYWxjKDEwMHZoIC0gJyArICh0b3BiYXJIICsgNDgpICsgJ3B4KSc7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBQYWdlIFJlbmRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiByZW5kZXJQYWdlKCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsZWN0aW9uLWNvbnRhaW5lcicpOwogICAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47CgogICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgCiAgICAgICAgPGRpdiBpZD0iY29sbGVjdGlvbi1wYWdlIj4KCiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBvdmVybGF5IC0tPgogICAgICAgICAgICA8ZGl2IGlkPSJjb2xsLWxvYWRpbmciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIFRvcCBCYXIgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtdG9wYmFyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtdG9wYmFyLWxlZnQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtYmFjay1idG4iIG9uY2xpY2s9IkNvbGxlY3Rpb24uZ29CYWNrKCkiPuKGkCBT' +
'aW11bGF0b3I8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9ImNvbGwtdGl0bGUiPkNvbGxlY3Rpb248L2gxPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLWNvdW50IiBpZD0iY29sbC1jb3VudCI+MCBjYXJkczwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC10b3BiYXItcmlnaHQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iY29sbC1zZWFyY2giIGNsYXNzPSJjb2xsLXNlYXJjaCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlNlYXJjaCBjYXJkc+KApiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7ZXNjYXBlQXR0cihzdGF0ZS5zZWFyY2gpfSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1zY2FuLWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5vcGVuU2NhbigpIj5TY2FuPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1pbXBvcnQtYnRuIiBvbmNsaWNrPSJDb2xsZWN0aW9uLm9wZW5JbXBvcnQoKSI+SW1wb3J0PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1leHBvcnQtYnRuIiBvbmNsaWNrPSJDb2xsZWN0aW9uLm9wZW5FeHBvcnQoKSI+RXhwb3J0PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1hdXRvY2xhc3NpZnktYnRuIiBvbmNsaWNrPSJDb2xsZWN0aW9uLmF1dG9DbGFzc2lmeSgpIiB0aXRsZT0iQXV0by1kZXRlY3QgY2F0ZWdvcmllcyAoUmFtcCwgRHJhdywgUmVtb3ZhbCwgZXRjLikgZm9yIHVuY2F0ZWdvcml6ZWQgY2FyZHMiPkF1dG8tQ2xhc3NpZnk8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLXJlZW5yaWNoLWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5yZUVucmljaCgpIiB0aXRsZT0iUmUtZmV0Y2ggYWxsIGNhcmQgZGF0YSBmcm9tIFNjcnlmYWxsIj5SZWZyZXNoIERhdGE8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJkZWNrYnVpbGRlci5odG1sIiBjbGFzcz0iY29sbC1uYXYtbGluayIgc3R5bGU9ImNvbG9yOnZhcigtLWxhYi1wdXJwbGUpO2JvcmRlci1jb2xvcjp2YXIoLS1sYWItcHVycGxlKSI+4pqUIERlY2sgQnVpbGRlcjwvYT4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJkZWNrZ2VuZXJhdG9yLmh0bWwiIGNsYXNzPSJjb2xsLW5hdi1saW5rIiBzdHlsZT0iY29sb3I6dmFyKC0tbGFiLXdhcm5pbmcpO2JvcmRlci1jb2xvcjp2YXIoLS1sYWItd2FybmluZykiPuKaoSBBdXRvIEdlbjwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gTWFpbiAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1tYWluIj4KCiAgICAgICAgICAgICAgICA8IS0tIExlZnQgRmlsdGVyIFBhbmVsIC0tPgogICAgICAgICAgICAgICAgPGFzaWRlIGNsYXNzPSJjb2xsLWZpbHRlcnMiIGlkPSJjb2xsLWZpbHRlcnMiPgogICAgICAgICAgICAgICAgICAgICR7cmVuZGVyRmlsdGVyc0h0bWwoKX0KICAgICAgICAgICAgICAgIDwvYXNpZGU+CgogICAgICAgICAgICAgICAgPCEtLSBUYWJsZSBBcmVhIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC10YWJsZS13cmFwIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXRhYmxlLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iY29sbC10YWJsZSIgaWQ9ImNvbGwtdGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtyZW5kZXJUYWJsZUhlYWRlckh0bWwoKX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keSBpZD0iY29sbC10Ym9keSI+PC90Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXBhZ2luYXRpb24iIGlkPSJjb2xsLXBhZ2luYXRpb24iPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gRGV0YWlsIERyYXdlciAtLT4KICAgICAg' +
'ICAgICAgPGRpdiBjbGFzcz0iY29sbC1kcmF3ZXIiIGlkPSJjb2xsLWRyYXdlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1pbm5lciIgaWQ9ImNvbGwtZHJhd2VyLWlubmVyIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLWJhY2tkcm9wIiBpZD0iY29sbC1kcmF3ZXItYmFja2Ryb3AiIG9uY2xpY2s9IkNvbGxlY3Rpb24uY2xvc2VEcmF3ZXIoKSI+PC9kaXY+CgogICAgICAgICAgICA8IS0tIENhdGVnb3J5IFBvcG92ZXIgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtY2F0LXBvcG92ZXIiIGlkPSJjb2xsLWNhdC1wb3BvdmVyIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gSW1wb3J0IE1vZGFsIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW1vZGFsLW92ZXJsYXkiIGlkPSJjb2xsLWltcG9ydC1tb2RhbCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW1vZGFsLWNvbnRlbnQgY29sbC1tb2RhbC13aWRlIiBpZD0iY29sbC1pbXBvcnQtYm9keSI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBFeHBvcnQgTW9kYWwgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtbW9kYWwtb3ZlcmxheSIgaWQ9ImNvbGwtZXhwb3J0LW1vZGFsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtbW9kYWwtY29udGVudCIgaWQ9ImNvbGwtZXhwb3J0LWJvZHkiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDwhLS0gU2NhbiBNb2RhbCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1tb2RhbC1vdmVybGF5IiBpZD0iY29sbC1zY2FuLW1vZGFsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtbW9kYWwtY29udGVudCBjb2xsLW1vZGFsLXdpZGUiIGlkPSJjb2xsLXNjYW4tYm9keSI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICA8L2Rpdj5gOwoKICAgICAgICByZW5kZXJUYWJsZSgpOwogICAgICAgIHJlbmRlclBhZ2luYXRpb24oKTsKICAgIH0KCiAgICAvLyDilIDilIAgRmlsdGVyIFBhbmVsIEhUTUwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gcmVuZGVyRmlsdGVyc0h0bWwoKSB7CiAgICAgICAgY29uc3QgZiA9IHN0YXRlLmZpbHRlcnM7CgogICAgICAgIC8vIENvbG9yIGJ1dHRvbnMKICAgICAgICBjb25zdCBjb2xvckJ0bnMgPSBPYmplY3QuZW50cmllcyhDT0xPUl9NQVApLm1hcCgoW2tleSwgY2ldKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGYuY29sb3JzLmluY2x1ZGVzKGtleSkgPyAnYWN0aXZlJyA6ICcnOwogICAgICAgICAgICByZXR1cm4gYDxidXR0b24gY2xhc3M9ImNvbGwtY29sb3ItYnRuICR7YWN0aXZlfSIgZGF0YS1jb2xvcj0iJHtrZXl9IgogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iJHthY3RpdmUgPyBgYmFja2dyb3VuZDoke2NpLmJnfTtjb2xvcjoke2NpLmNvbG9yfTtib3JkZXItY29sb3I6JHtjaS5iZ31gIDogJyd9IgogICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJDb2xsZWN0aW9uLnRvZ2dsZUNvbG9yKCcke2tleX0nKSIgdGl0bGU9IiR7a2V5fSI+JHtjaS5sYWJlbH08L2J1dHRvbj5gOwogICAgICAgIH0pLmpvaW4oJycpOwoKICAgICAgICAvLyBUeXBlIGNoZWNrYm94ZXMKICAgICAgICBjb25zdCB0eXBlQ2hlY2tzID0gQ0FSRF9UWVBFUy5tYXAodCA9PiB7CiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBmLnR5cGVzLmluY2x1ZGVzKHQpID8gJ2NoZWNrZWQnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBgPGxhYmVsIGNsYXNzPSJjb2xsLWNoZWNrLWxhYmVsIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgZGF0YS10eXBlPSIke3R9IiAke2NoZWNrZWR9CiAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9IkNvbGxlY3Rpb24udG9nZ2xlVHlwZSgnJHt0fScpIj4gJHt0fQogICAgICAgICAgICA8L2xhYmVsPmA7CiAgICAgICAgfSkuam9pbignJyk7CgogICAgICAgIC8vIFRvZ2dsZXMKICAgICAgICBjb25zdCB0b2dnbGVzID0gWwogICAgICAgICAgICB7IGtleTogJ2lzTGVnZW5kYXJ5JywgICBsYWJlbDogJ0xlZ2Vu' +
'ZGFyeScgfSwKICAgICAgICAgICAgeyBrZXk6ICdpc0Jhc2ljJywgICAgICAgbGFiZWw6ICdCYXNpY3MnIH0sCiAgICAgICAgICAgIHsga2V5OiAnaXNHYW1lQ2hhbmdlcicsIGxhYmVsOiAnR2FtZSBDaGFuZ2VycycgfSwKICAgICAgICAgICAgeyBrZXk6ICdoaWdoU2FsdCcsICAgICAgbGFiZWw6ICdIaWdoIFNhbHQnIH0sCiAgICAgICAgXS5tYXAoKHsga2V5LCBsYWJlbCB9KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IGZba2V5XSA/ICdhY3RpdmUnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz0iY29sbC10b2dnbGUtYnRuICR7YWN0aXZlfSIgZGF0YS1rZXk9IiR7a2V5fSIKICAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0iQ29sbGVjdGlvbi50b2dnbGVGaWx0ZXIoJyR7a2V5fScpIj4ke2xhYmVsfTwvYnV0dG9uPmA7CiAgICAgICAgfSkuam9pbignJyk7CgogICAgICAgIC8vIEZpbmlzaCByYWRpb3MKICAgICAgICBjb25zdCBmaW5pc2hlcyA9IFsKICAgICAgICAgICAgeyB2YWx1ZTogJycsICAgICAgIGxhYmVsOiAnQWxsJyB9LAogICAgICAgICAgICB7IHZhbHVlOiAnTk9STUFMJywgbGFiZWw6ICdOb3JtYWwnIH0sCiAgICAgICAgICAgIHsgdmFsdWU6ICdGT0lMJywgICBsYWJlbDogJ0ZvaWwnIH0sCiAgICAgICAgICAgIHsgdmFsdWU6ICdFVENIRUQnLCBsYWJlbDogJ0V0Y2hlZCcgfSwKICAgICAgICBdLm1hcCgoeyB2YWx1ZSwgbGFiZWwgfSkgPT4gewogICAgICAgICAgICBjb25zdCBjaGVja2VkID0gZi5maW5pc2ggPT09IHZhbHVlID8gJ2NoZWNrZWQnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBgPGxhYmVsIGNsYXNzPSJjb2xsLXJhZGlvLWxhYmVsIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iY29sbC1maW5pc2giIHZhbHVlPSIke3ZhbHVlfSIgJHtjaGVja2VkfQogICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJDb2xsZWN0aW9uLnNldEZpbmlzaCgnJHt2YWx1ZX0nKSI+ICR7bGFiZWx9CiAgICAgICAgICAgIDwvbGFiZWw+YDsKICAgICAgICB9KS5qb2luKCcnKTsKCiAgICAgICAgLy8gQ2F0ZWdvcnkgY2hpcHMKICAgICAgICBjb25zdCBjYXRDaGlwcyA9IENBVEVHT1JZX1NVR0dFU1RJT05TLm1hcChjYXQgPT4gewogICAgICAgICAgICBjb25zdCBhY3RpdmUgPSBmLmNhdGVnb3J5LmluY2x1ZGVzKGNhdCkgPyAnYWN0aXZlJyA6ICcnOwogICAgICAgICAgICByZXR1cm4gYDxidXR0b24gY2xhc3M9ImNvbGwtY2F0LWZpbHRlci1idG4gJHthY3RpdmV9IiBkYXRhLWNhdD0iJHtlc2NhcGVBdHRyKGNhdCl9IgogICAgICAgICAgICAgICAgICAgICAgICBvbmNsaWNrPSJDb2xsZWN0aW9uLnRvZ2dsZUNhdGVnb3J5RmlsdGVyKCcke2VzY2FwZUF0dHIoY2F0KX0nKSI+JHtlc2NhcGVIdG1sKGNhdCl9PC9idXR0b24+YDsKICAgICAgICB9KS5qb2luKCcnKTsKCiAgICAgICAgLy8gUmFyaXR5IGJ1dHRvbnMKICAgICAgICBjb25zdCBSQVJJVElFUyA9IFsKICAgICAgICAgICAgeyB2YWx1ZTogJ2NvbW1vbicsICAgbGFiZWw6ICdDJywgdGl0bGU6ICdDb21tb24nIH0sCiAgICAgICAgICAgIHsgdmFsdWU6ICd1bmNvbW1vbicsIGxhYmVsOiAnVScsIHRpdGxlOiAnVW5jb21tb24nIH0sCiAgICAgICAgICAgIHsgdmFsdWU6ICdyYXJlJywgICAgIGxhYmVsOiAnUicsIHRpdGxlOiAnUmFyZScgfSwKICAgICAgICAgICAgeyB2YWx1ZTogJ215dGhpYycsICAgbGFiZWw6ICdNJywgdGl0bGU6ICdNeXRoaWMnIH0sCiAgICAgICAgXTsKICAgICAgICBjb25zdCByYXJpdHlCdG5zID0gUkFSSVRJRVMubWFwKHIgPT4gewogICAgICAgICAgICBjb25zdCBhY3RpdmUgPSBmLnJhcml0eS5pbmNsdWRlcyhyLnZhbHVlKSA/ICdhY3RpdmUnIDogJyc7CiAgICAgICAgICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz0iY29sbC1yYXJpdHktYnRuIGNvbGwtcmFyaXR5LSR7ci52YWx1ZX0gJHthY3RpdmV9IgogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iJHtyLnRpdGxlfSIgb25jbGljaz0iQ29sbGVjdGlvbi50b2dnbGVSYXJpdHkoJyR7ci52YWx1ZX0nKSI+JHtyLmxhYmVsfTwvYnV0dG9uPmA7CiAgICAgICAgfSkuam9pbignJyk7CgogICAgICAgIC8vIFNldCBmaWx0ZXIgY2hpcHMgKHNob3cgc2VsZWN0ZWQgc2V0cykKICAgICAgICBjb25zdCBzZXRDaGlwcyA9IGYuc2V0Q29kZS5tYXAoY29kZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gc3RhdGUuY2FjaGVk' +
'U2V0cy5maW5kKHMgPT4gcy5jb2RlID09PSBjb2RlKTsKICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBmb3VuZCA/IGZvdW5kLm5hbWUgOiBjb2RlOwogICAgICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPSJjb2xsLXNldC1jaGlwIj4ke2VzY2FwZUh0bWwobGFiZWwpfSA8YnV0dG9uIG9uY2xpY2s9IkNvbGxlY3Rpb24ucmVtb3ZlU2V0RmlsdGVyKCcke2VzY2FwZUF0dHIoY29kZSl9JykiPiZ0aW1lczs8L2J1dHRvbj48L3NwYW4+YDsKICAgICAgICB9KS5qb2luKCcnKTsKCiAgICAgICAgLy8gS2V5d29yZCBmaWx0ZXIgY2hpcHMKICAgICAgICBjb25zdCBrd0NoaXBzID0gZi5rZXl3b3JkLm1hcChrdyA9PgogICAgICAgICAgICBgPHNwYW4gY2xhc3M9ImNvbGwta3ctY2hpcCI+JHtlc2NhcGVIdG1sKGt3KX0gPGJ1dHRvbiBvbmNsaWNrPSJDb2xsZWN0aW9uLnJlbW92ZUtleXdvcmRGaWx0ZXIoJyR7ZXNjYXBlQXR0cihrdyl9JykiPiZ0aW1lczs8L2J1dHRvbj48L3NwYW4+YAogICAgICAgICkuam9pbignJyk7CgogICAgICAgIHJldHVybiBgCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLWxhYmVsIj5Db2xvciBJZGVudGl0eTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWNvbG9yLWJ0bnMiPiR7Y29sb3JCdG5zfTwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbHRlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItbGFiZWwiPkNhcmQgVHlwZTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXR5cGUtY2hlY2tzIj4ke3R5cGVDaGVja3N9PC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbHRlci1sYWJlbCI+UmFyaXR5PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtcmFyaXR5LWJ0bnMiPiR7cmFyaXR5QnRuc308L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLWxhYmVsIj5Qcm9wZXJ0aWVzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtdG9nZ2xlLWJ0bnMiPiR7dG9nZ2xlc308L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLWxhYmVsIj5GaW5pc2g8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maW5pc2gtcmFkaW9zIj4ke2ZpbmlzaGVzfTwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbHRlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItbGFiZWwiPkNNQyBSYW5nZTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0cyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY29sbC1yYW5nZS1pbnB1dCIgaWQ9ImNvbGwtY21jLW1pbiIgcGxhY2Vob2xkZXI9Ik1pbiIKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtmLmNtY01pbiA/PyAnJ30iIG1pbj0iMCIgc3RlcD0iMSIKICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRDbWNSYW5nZSgpIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLXJhbmdlLXNlcCI+Jm5kYXNoOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0IiBpZD0iY29sbC1jbWMtbWF4IiBwbGFjZWhvbGRlcj0iTWF4IgogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2YuY21jTWF4ID8/ICcnfSIgbWluPSIwIiBzdGVwPSIxIgogICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJDb2xsZWN0aW9uLnNldENtY1JhbmdlKCkiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLWxhYmVsIj5Qb3dlciAvIFRvdWdobmVzczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJj' +
'b2xsLXJhbmdlLXJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXJhbmdlLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1yYW5nZS1zdWJsYWJlbCI+UG93PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtcmFuZ2UtaW5wdXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9ImNvbGwtcmFuZ2UtaW5wdXQiIGlkPSJjb2xsLXBvdy1taW4iIHBsYWNlaG9sZGVyPSJNaW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtmLnBvd2VyTWluID8/ICcnfSIgbWluPSIwIiBzdGVwPSIxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9IkNvbGxlY3Rpb24uc2V0UG93ZXJSYW5nZSgpIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGwtcmFuZ2Utc2VwIj4mbmRhc2g7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY29sbC1yYW5nZS1pbnB1dCIgaWQ9ImNvbGwtcG93LW1heCIgcGxhY2Vob2xkZXI9Ik1heCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2YucG93ZXJNYXggPz8gJyd9IiBtaW49IjAiIHN0ZXA9IjEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRQb3dlclJhbmdlKCkiPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXJhbmdlLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1yYW5nZS1zdWJsYWJlbCI+VGdoPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtcmFuZ2UtaW5wdXRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9ImNvbGwtcmFuZ2UtaW5wdXQiIGlkPSJjb2xsLXRnaC1taW4iIHBsYWNlaG9sZGVyPSJNaW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtmLnRvdWdoTWluID8/ICcnfSIgbWluPSIwIiBzdGVwPSIxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9IkNvbGxlY3Rpb24uc2V0VG91Z2hSYW5nZSgpIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGwtcmFuZ2Utc2VwIj4mbmRhc2g7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY29sbC1yYW5nZS1pbnB1dCIgaWQ9ImNvbGwtdGdoLW1heCIgcGxhY2Vob2xkZXI9Ik1heCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2YudG91Z2hNYXggPz8gJyd9IiBtaW49IjAiIHN0ZXA9IjEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRUb3VnaFJhbmdlKCkiPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbHRlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItbGFiZWwiPlByaWNlIFJhbmdlICgkKTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0cyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY29sbC1yYW5nZS1pbnB1dCIgaWQ9ImNvbGwtcHJpY2UtbWluIiBwbGFjZWhvbGRlcj0iTWluIgogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2YucHJpY2VNaW4gPz8gJyd9IiBtaW49IjAiIHN0ZXA9IjAuMDEiCiAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9IkNvbGxlY3Rpb24uc2V0UHJpY2VSYW5nZSgpIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLXJhbmdlLXNlcCI+Jm5kYXNoOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0IiBpZD0iY29sbC1wcmljZS1tYXgiIHBsYWNlaG9sZGVyPSJNYXgiCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7Zi5wcmljZU1heCA/PyAnJ30iIG1pbj0iMCIgc3RlcD0iMC4wMSIKICAgICAgICAgICAg' +
'ICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRQcmljZVJhbmdlKCkiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLWxhYmVsIj5FREhSRUMgUmFuazwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0cyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY29sbC1yYW5nZS1pbnB1dCIgaWQ9ImNvbGwtZWRocmVjLW1pbiIgcGxhY2Vob2xkZXI9Ik1pbiIKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtmLmVkaHJlY01pbiA/PyAnJ30iIG1pbj0iMCIgc3RlcD0iMSIKICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRFZGhyZWNSYW5nZSgpIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLXJhbmdlLXNlcCI+Jm5kYXNoOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0IiBpZD0iY29sbC1lZGhyZWMtbWF4IiBwbGFjZWhvbGRlcj0iTWF4IgogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2YuZWRocmVjTWF4ID8/ICcnfSIgbWluPSIwIiBzdGVwPSIxIgogICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJDb2xsZWN0aW9uLnNldEVkaHJlY1JhbmdlKCkiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLWxhYmVsIj5Pd25lZCBRdWFudGl0eTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0cyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0iY29sbC1yYW5nZS1pbnB1dCIgaWQ9ImNvbGwtcXR5LW1pbiIgcGxhY2Vob2xkZXI9Ik1pbiIKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHtmLnF0eU1pbiA/PyAnJ30iIG1pbj0iMSIgc3RlcD0iMSIKICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRRdHlSYW5nZSgpIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLXJhbmdlLXNlcCI+Jm5kYXNoOzwvc3Bhbj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJjb2xsLXJhbmdlLWlucHV0IiBpZD0iY29sbC1xdHktbWF4IiBwbGFjZWhvbGRlcj0iTWF4IgogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke2YucXR5TWF4ID8/ICcnfSIgbWluPSIxIiBzdGVwPSIxIgogICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJDb2xsZWN0aW9uLnNldFF0eVJhbmdlKCkiPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsdGVyLWxhYmVsIj5TZXQ8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zZXQtZmlsdGVyIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY29sbC1zZXQtaW5wdXQiIGlkPSJjb2xsLXNldC1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iVHlwZSBzZXQgbmFtZSBvciBjb2RlLi4uIiBhdXRvY29tcGxldGU9Im9mZiIKICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PSJDb2xsZWN0aW9uLm9uU2V0SW5wdXQodGhpcy52YWx1ZSkiCiAgICAgICAgICAgICAgICAgICAgICAgb25mb2N1cz0iQ29sbGVjdGlvbi5vblNldElucHV0KHRoaXMudmFsdWUpIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2V0LWRyb3Bkb3duIiBpZD0iY29sbC1zZXQtZHJvcGRvd24iPjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zZXQtY2hpcHMiPiR7c2V0Q2hpcHN9PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbHRlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItbGFiZWwiPktleXdvcmRzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwta3ctZmlsdGVyIj4KICAgICAgICAgICAgICAgIDxp' +
'bnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY29sbC1rdy1pbnB1dCIgaWQ9ImNvbGwta3ctaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlR5cGUga2V5d29yZCAoZS5nLiBGbHlpbmcpLi4uIiBhdXRvY29tcGxldGU9Im9mZiIKICAgICAgICAgICAgICAgICAgICAgICBvbmlucHV0PSJDb2xsZWN0aW9uLm9uS3dJbnB1dCh0aGlzLnZhbHVlKSIKICAgICAgICAgICAgICAgICAgICAgICBvbmZvY3VzPSJDb2xsZWN0aW9uLm9uS3dJbnB1dCh0aGlzLnZhbHVlKSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWt3LWRyb3Bkb3duIiBpZD0iY29sbC1rdy1kcm9wZG93biI+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWt3LWNoaXBzIj4ke2t3Q2hpcHN9PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbHRlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWx0ZXItbGFiZWwiPkNhdGVnb3J5PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtY2F0LWZpbHRlci1idG5zIj4ke2NhdENoaXBzfTwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbHRlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1yZXNldC1idG4iIG9uY2xpY2s9IkNvbGxlY3Rpb24ucmVzZXRGaWx0ZXJzKCkiPlJlc2V0IEZpbHRlcnM8L2J1dHRvbj4KICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIC8vIOKUgOKUgCBUYWJsZSBIZWFkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgY29uc3QgQ09MVU1OUyA9IFsKICAgICAgICB7IGtleTogJ3F1YW50aXR5JywgICAgICBsYWJlbDogJ1F0eScsICAgICAgIHNvcnRhYmxlOiB0cnVlIH0sCiAgICAgICAgeyBrZXk6ICduYW1lJywgICAgICAgICAgbGFiZWw6ICdOYW1lJywgICAgICBzb3J0YWJsZTogdHJ1ZSB9LAogICAgICAgIHsga2V5OiAnbWFuYV9jb3N0JywgICAgIGxhYmVsOiAnTWFuYScsICAgICAgc29ydGFibGU6IGZhbHNlIH0sCiAgICAgICAgeyBrZXk6ICd0eXBlX2xpbmUnLCAgICAgbGFiZWw6ICdUeXBlJywgICAgICBzb3J0YWJsZTogdHJ1ZSB9LAogICAgICAgIHsga2V5OiAnY29sb3JfaWRlbnRpdHknLGxhYmVsOiAnQ29sb3JzJywgICAgc29ydGFibGU6IGZhbHNlIH0sCiAgICAgICAgeyBrZXk6ICdjbWMnLCAgICAgICAgICAgbGFiZWw6ICdDTUMnLCAgICAgICBzb3J0YWJsZTogdHJ1ZSB9LAogICAgICAgIHsga2V5OiAncG93ZXJfdG91Z2huZXNzJyxsYWJlbDogJ1AvVCcsICAgICAgc29ydGFibGU6IGZhbHNlIH0sCiAgICAgICAgeyBrZXk6ICdyYXJpdHknLCAgICAgICAgbGFiZWw6ICdSYXJpdHknLCAgICBzb3J0YWJsZTogdHJ1ZSB9LAogICAgICAgIHsga2V5OiAnc2V0X25hbWUnLCAgICAgIGxhYmVsOiAnU2V0JywgICAgICAgc29ydGFibGU6IHRydWUgfSwKICAgICAgICB7IGtleTogJ3RjZ19wcmljZScsICAgICBsYWJlbDogJ1ByaWNlJywgICAgIHNvcnRhYmxlOiB0cnVlIH0sCiAgICAgICAgeyBrZXk6ICdlZGhyZWNfcmFuaycsICAgbGFiZWw6ICdFREhSRUMnLCAgICBzb3J0YWJsZTogdHJ1ZSB9LAogICAgICAgIHsga2V5OiAnc2FsdF9zY29yZScsICAgIGxhYmVsOiAnU2FsdCcsICAgICAgc29ydGFibGU6IHRydWUgfSwKICAgICAgICB7IGtleTogJ2lzX2dhbWVfY2hhbmdlcicsbGFiZWw6ICdHQycsICAgICAgIHNvcnRhYmxlOiBmYWxzZSB9LAogICAgICAgIHsga2V5OiAnY2F0ZWdvcnknLCAgICAgIGxhYmVsOiAnQ2F0ZWdvcnknLCAgc29ydGFibGU6IGZhbHNlIH0sCiAgICAgICAgeyBrZXk6ICdmaW5pc2gnLCAgICAgICAgbGFiZWw6ICdGaW5pc2gnLCAgICBzb3J0YWJsZTogdHJ1ZSB9LAogICAgICAgIHsga2V5OiAnb3JhY2xlX3RleHQnLCAgIGxhYmVsOiAnT3JhY2xlJywgICAgc29ydGFibGU6IGZhbHNlIH0sCiAgICBdOwoKICAgIGZ1bmN0aW9uIHJlbmRlclRhYmxlSGVhZGVySHRtbCgpIHsKICAgICAgICBjb25zdCBoZWFkZXJzID0gQ09MVU1OUy5tYXAoY29sID0+IHsKICAgICAgICAgICAgaWYgKCFjb2wuc29ydGFibGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBgPHRoIGNsYXNz' +
'PSJjb2xsLXRoIGNvbGwtdGgtJHtjb2wua2V5fSI+JHtjb2wubGFiZWx9PC90aD5gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RhdGUuc29ydEZpZWxkID09PSBjb2wua2V5OwogICAgICAgICAgICBjb25zdCBkaXIgPSBpc0FjdGl2ZSA/IHN0YXRlLnNvcnREaXIgOiAnJzsKICAgICAgICAgICAgY29uc3QgYXJyb3cgPSBpc0FjdGl2ZSA/IChkaXIgPT09ICdhc2MnID8gJyDilrInIDogJyDilrwnKSA6ICcnOwogICAgICAgICAgICBjb25zdCBhY3RpdmVDbGFzcyA9IGlzQWN0aXZlID8gJyBjb2xsLXRoLWFjdGl2ZScgOiAnJzsKICAgICAgICAgICAgcmV0dXJuIGA8dGggY2xhc3M9ImNvbGwtdGggY29sbC10aC0ke2NvbC5rZXl9IGNvbGwtdGgtc29ydGFibGUke2FjdGl2ZUNsYXNzfSIKICAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0iQ29sbGVjdGlvbi5zZXRTb3J0KCcke2NvbC5rZXl9JykiPiR7Y29sLmxhYmVsfSR7YXJyb3d9PC90aD5gOwogICAgICAgIH0pLmpvaW4oJycpOwogICAgICAgIHJldHVybiBgPHRoZWFkPjx0cj4ke2hlYWRlcnN9PC90cj48L3RoZWFkPmA7CiAgICB9CgogICAgLy8g4pSA4pSAIFRhYmxlIEJvZHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gcmVuZGVyVGFibGUoKSB7CiAgICAgICAgY29uc3QgdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC10Ym9keScpOwogICAgICAgIGlmICghdGJvZHkpIHJldHVybjsKCiAgICAgICAgLy8gUmUtcmVuZGVyIGhlYWRlciAoc29ydCBpbmRpY2F0b3JzIG1heSBoYXZlIGNoYW5nZWQpCiAgICAgICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC10YWJsZScpOwogICAgICAgIGlmICh0YWJsZSkgewogICAgICAgICAgICBjb25zdCBvbGRUaGVhZCA9IHRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3RoZWFkJyk7CiAgICAgICAgICAgIGlmIChvbGRUaGVhZCkgewogICAgICAgICAgICAgICAgb2xkVGhlYWQub3V0ZXJIVE1MID0gcmVuZGVyVGFibGVIZWFkZXJIdG1sKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChzdGF0ZS5sb2FkaW5nKSB7CiAgICAgICAgICAgIHRib2R5LmlubmVySFRNTCA9IGA8dHI+PHRkIGNvbHNwYW49IiR7Q09MVU1OUy5sZW5ndGh9IiBjbGFzcz0iY29sbC1lbXB0eSI+TG9hZGluZ+KApjwvdGQ+PC90cj5gOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGUuaXRlbXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHRib2R5LmlubmVySFRNTCA9IGA8dHI+PHRkIGNvbHNwYW49IiR7Q09MVU1OUy5sZW5ndGh9IiBjbGFzcz0iY29sbC1lbXB0eSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWVtcHR5LWljb24iPvCfg488L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2Pk5vIGNhcmRzIGluIGNvbGxlY3Rpb248L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWltcG9ydC1idG4iIG9uY2xpY2s9IkNvbGxlY3Rpb24ub3BlbkltcG9ydCgpIj5JbXBvcnQgQ2FyZHM8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RkPjwvdHI+YDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGJvZHkuaW5uZXJIVE1MID0gc3RhdGUuaXRlbXMubWFwKGNhcmQgPT4gewogICAgICAgICAgICBjb25zdCBzYWx0Q2xzID0gc2FsdENsYXNzKGNhcmQuc2FsdFNjb3JlKTsKICAgICAgICAgICAgY29uc3Qgb3JhY2xlVHJ1bmMgPSB0cnVuY2F0ZShjYXJkLm9yYWNsZVRleHQgfHwgJycsIDYwKTsKICAgICAgICAgICAgY29uc3QgZ2NJY29uID0gY2FyZC5pc0dhbWVDaGFuZ2VyID8gJzxzcGFuIGNsYXNzPSJjb2xsLWdjLXN0YXIiIHRpdGxlPSJHYW1lIENoYW5nZXIiPuKYhTwvc3Bhbj4nIDogJyc7CiAgICAgICAgICAgIGNvbnN0IGxlZ0ljb24gPSBjYXJkLmlzTGVnZW5kYXJ5ICA/ICc8c3BhbiBjbGFzcz0iY29sbC1sZWdlbmRhcnktaWNvbiIgdGl0bGU9IkxlZ2VuZGFyeSI+4peGPC9zcGFuPicgOiAnJzsKICAgICAgICAgICAgY29uc3Qg' +
'YmFzaWNJY29uID0gY2FyZC5pc0Jhc2ljICAgID8gJzxzcGFuIGNsYXNzPSJjb2xsLWJhc2ljLWljb24iIHRpdGxlPSJCYXNpYyI+4qyhPC9zcGFuPicgOiAnJzsKCiAgICAgICAgICAgIGNvbnN0IG1hbmFDb3N0ID0gcmVuZGVyTWFuYUNvc3QoY2FyZC5tYW5hQ29zdCB8fCBjYXJkLm1hbmFfY29zdCB8fCAnJyk7CiAgICAgICAgICAgIGNvbnN0IHB0ID0gKGNhcmQucG93ZXIgfHwgY2FyZC50b3VnaG5lc3MpCiAgICAgICAgICAgICAgICA/IGAke2VzY2FwZUh0bWwoY2FyZC5wb3dlciB8fCAn4oCUJyl9LyR7ZXNjYXBlSHRtbChjYXJkLnRvdWdobmVzcyB8fCAn4oCUJyl9YAogICAgICAgICAgICAgICAgOiAn4oCUJzsKICAgICAgICAgICAgY29uc3QgcmFyaXR5ID0gY2FyZC5yYXJpdHkgPyBgPHNwYW4gY2xhc3M9ImNvbGwtcmFyaXR5IGNvbGwtcmFyaXR5LSR7ZXNjYXBlQXR0cihjYXJkLnJhcml0eSl9Ij4ke2VzY2FwZUh0bWwoY2FyZC5yYXJpdHkpfTwvc3Bhbj5gIDogJ+KAlCc7CiAgICAgICAgICAgIGNvbnN0IHNldE5hbWUgPSBlc2NhcGVIdG1sKGNhcmQuc2V0TmFtZSB8fCBjYXJkLnNldF9uYW1lIHx8ICcnKTsKICAgICAgICAgICAgY29uc3QgZWRocmVjUmFuayA9IChjYXJkLmVkaHJlY1JhbmsgfHwgY2FyZC5lZGhyZWNfcmFuaykgPyBgIyR7Y2FyZC5lZGhyZWNSYW5rIHx8IGNhcmQuZWRocmVjX3Jhbmt9YCA6ICfigJQnOwoKICAgICAgICAgICAgcmV0dXJuIGA8dHIgY2xhc3M9ImNvbGwtcm93IiBvbmNsaWNrPSJDb2xsZWN0aW9uLm9wZW5EcmF3ZXIoJHtjYXJkLmlkfSkiIGRhdGEtaWQ9IiR7Y2FyZC5pZH0iPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtcXVhbnRpdHkiPiR7ZXNjYXBlSHRtbChjYXJkLnF1YW50aXR5ID8/IDEpfTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbGwtdGQgY29sbC10ZC1uYW1lIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1jYXJkLW5hbWUiPiR7ZXNjYXBlSHRtbChjYXJkLm5hbWUpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAke2xlZ0ljb259JHtiYXNpY0ljb259CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtbWFuYSI+JHttYW5hQ29zdH08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtdHlwZSI+JHtlc2NhcGVIdG1sKGNhcmQudHlwZUxpbmUgfHwgY2FyZC50eXBlX2xpbmUgfHwgJycpfTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbGwtdGQgY29sbC10ZC1jb2xvcnMiPiR7cmVuZGVyQ29sb3JQaXBzKGNhcmQuY29sb3JJZGVudGl0eSB8fCBjYXJkLmNvbG9yX2lkZW50aXR5KX08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtY21jIj4ke2NhcmQuY21jID8/ICfigJQnfTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbGwtdGQgY29sbC10ZC1wdCI+JHtwdH08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtcmFyaXR5Ij4ke3Jhcml0eX08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtc2V0IiB0aXRsZT0iJHtzZXROYW1lfSI+JHtzZXROYW1lfTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbGwtdGQgY29sbC10ZC1wcmljZSI+JHtmb3JtYXRQcmljZShjYXJkLnRjZ1ByaWNlIHx8IGNhcmQudGNnX3ByaWNlKX08L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtZWRocmVjIj4ke2VkaHJlY1Jhbmt9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29sbC10ZCBjb2xsLXRkLXNhbHQgJHtzYWx0Q2xzfSIgdGl0bGU9IlNhbHQ6ICR7Y2FyZC5zYWx0U2NvcmUgPz8gY2FyZC5zYWx0X3Njb3JlID8/ICc/J30iPiR7KGNhcmQuc2FsdFNjb3JlID8/IGNhcmQuc2FsdF9zY29yZSkgIT0gbnVsbCA/IE51bWJlcihjYXJkLnNhbHRTY29yZSA/PyBjYXJkLnNhbHRfc2NvcmUpLnRvRml4ZWQoMikgOiAn4oCUJ308L3RkPgogICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb2xsLXRkIGNvbGwtdGQtZ2MiPiR7Z2NJY29ufTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbGwtdGQgY29sbC10ZC1jYXRlZ29yeSI+JHtyZW5kZXJDYXRlZ29yeUNoaXBzKGNhcmQuY2F0ZWdvcnkgfHwgW10sIGNhcmQuaWQpfTwvdGQ+CiAg' +
'ICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbGwtdGQgY29sbC10ZC1maW5pc2giPiR7cmVuZGVyRmluaXNoQmFkZ2UoY2FyZC5maW5pc2gpfTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbGwtdGQgY29sbC10ZC1vcmFjbGUiIHRpdGxlPSIke2VzY2FwZUF0dHIoY2FyZC5vcmFjbGVUZXh0IHx8IGNhcmQub3JhY2xlX3RleHQgfHwgJycpfSI+JHtlc2NhcGVIdG1sKG9yYWNsZVRydW5jKX08L3RkPgogICAgICAgICAgICA8L3RyPmA7CiAgICAgICAgfSkuam9pbignJyk7CiAgICB9CgogICAgLy8g4pSA4pSAIFBhZ2luYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gcmVuZGVyUGFnaW5hdGlvbigpIHsKICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLXBhZ2luYXRpb24nKTsKICAgICAgICBpZiAoIWVsKSByZXR1cm47CiAgICAgICAgY29uc3QgdG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChzdGF0ZS50b3RhbCAvIHN0YXRlLnBhZ2VTaXplKSk7CiAgICAgICAgY29uc3QgcHJldkRpc2FibGVkID0gc3RhdGUucGFnZSA8PSAxID8gJ2Rpc2FibGVkJyA6ICcnOwogICAgICAgIGNvbnN0IG5leHREaXNhYmxlZCA9IHN0YXRlLnBhZ2UgPj0gdG90YWxQYWdlcyA/ICdkaXNhYmxlZCcgOiAnJzsKCiAgICAgICAgZWwuaW5uZXJIVE1MID0gYAogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtcGFnZS1pbmZvIj4KICAgICAgICAgICAgUGFnZSAke3N0YXRlLnBhZ2V9IG9mICR7dG90YWxQYWdlc30KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGwtdG90YWwtbGFiZWwiPigke3N0YXRlLnRvdGFsfSB0b3RhbCk8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1wYWdlLWNvbnRyb2xzIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1wYWdlLWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5zZXRQYWdlKCR7c3RhdGUucGFnZSAtIDF9KSIgJHtwcmV2RGlzYWJsZWR9PuKGkCBQcmV2PC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtcGFnZS1idG4iIG9uY2xpY2s9IkNvbGxlY3Rpb24uc2V0UGFnZSgke3N0YXRlLnBhZ2UgKyAxfSkiICR7bmV4dERpc2FibGVkfT5OZXh0IOKGkjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtcGFnZS1zaXplIj4KICAgICAgICAgICAgU2hvdzoKICAgICAgICAgICAgPHNlbGVjdCBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRQYWdlU2l6ZShwYXJzZUludCh0aGlzLnZhbHVlLDEwKSkiPgogICAgICAgICAgICAgICAgJHtbMjUsIDUwLCAxMDBdLm1hcChuID0+CiAgICAgICAgICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9IiR7bn0iICR7c3RhdGUucGFnZVNpemUgPT09IG4gPyAnc2VsZWN0ZWQnIDogJyd9PiR7bn08L29wdGlvbj5gCiAgICAgICAgICAgICAgICApLmpvaW4oJycpfQogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckNvdW50QmFkZ2UoKSB7CiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1jb3VudCcpOwogICAgICAgIGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSBgJHtzdGF0ZS50b3RhbC50b0xvY2FsZVN0cmluZygpfSBjYXJkJHtzdGF0ZS50b3RhbCAhPT0gMSA/ICdzJyA6ICcnfWA7CiAgICB9CgogICAgLy8g4pSA4pSAIFNvcnQgLyBQYWdlIC8gRmlsdGVyIEFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gc2V0U29ydChmaWVsZCkgewogICAgICAgIGlmIChzdGF0ZS5zb3J0RmllbGQgPT09IGZpZWxkKSB7CiAgICAgICAgICAgIHN0YXRlLnNvcnREaXIgPSBzdGF0ZS5zb3J0RGlyID09PSAnYXNjJyA/ICdkZXNjJyA6ICdhc2MnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlLnNvcnRGaWVsZCA9IGZpZWxkOwogICAgICAgICAgICBzdGF0ZS5zb3J0RGlyID0gJ2FzYyc7CiAgICAgICAgfQogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHNhdmVQcmVmZXJlbmNlcygpOwogICAgICAg' +
'IHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFBhZ2UocCkgewogICAgICAgIGNvbnN0IHRvdGFsUGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwoc3RhdGUudG90YWwgLyBzdGF0ZS5wYWdlU2l6ZSkpOwogICAgICAgIHN0YXRlLnBhZ2UgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihwLCB0b3RhbFBhZ2VzKSk7CiAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAgZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UGFnZVNpemUobikgewogICAgICAgIHN0YXRlLnBhZ2VTaXplID0gbjsKICAgICAgICBzdGF0ZS5wYWdlID0gMTsKICAgICAgICBzYXZlUHJlZmVyZW5jZXMoKTsKICAgICAgICBwdXNoVXJsU3RhdGUoKTsKICAgICAgICBmZXRjaENvbGxlY3Rpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2dnbGVDb2xvcihjb2xvcikgewogICAgICAgIGNvbnN0IGlkeCA9IHN0YXRlLmZpbHRlcnMuY29sb3JzLmluZGV4T2YoY29sb3IpOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICBzdGF0ZS5maWx0ZXJzLmNvbG9ycy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5maWx0ZXJzLmNvbG9ycy5wdXNoKGNvbG9yKTsKICAgICAgICB9CiAgICAgICAgc3RhdGUucGFnZSA9IDE7CiAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAgcmVmcmVzaEZpbHRlcnNQYW5lbCgpOwogICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZVR5cGUodHlwZSkgewogICAgICAgIGNvbnN0IGlkeCA9IHN0YXRlLmZpbHRlcnMudHlwZXMuaW5kZXhPZih0eXBlKTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgICAgc3RhdGUuZmlsdGVycy50eXBlcy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5maWx0ZXJzLnR5cGVzLnB1c2godHlwZSk7CiAgICAgICAgfQogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihrZXkpIHsKICAgICAgICBzdGF0ZS5maWx0ZXJzW2tleV0gPSAhc3RhdGUuZmlsdGVyc1trZXldOwogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIHJlZnJlc2hGaWx0ZXJzUGFuZWwoKTsKICAgICAgICBmZXRjaENvbGxlY3Rpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRGaW5pc2godmFsdWUpIHsKICAgICAgICBzdGF0ZS5maWx0ZXJzLmZpbmlzaCA9IHZhbHVlOwogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldENtY1JhbmdlKCkgewogICAgICAgIGNvbnN0IG1pbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtY21jLW1pbicpOwogICAgICAgIGNvbnN0IG1heEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtY21jLW1heCcpOwogICAgICAgIHN0YXRlLmZpbHRlcnMuY21jTWluID0gbWluRWw/LnZhbHVlICE9PSAnJyA/IHBhcnNlRmxvYXQobWluRWwudmFsdWUpIDogbnVsbDsKICAgICAgICBzdGF0ZS5maWx0ZXJzLmNtY01heCA9IG1heEVsPy52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KG1heEVsLnZhbHVlKSA6IG51bGw7CiAgICAgICAgc3RhdGUucGFnZSA9IDE7CiAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAgZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0UHJpY2VSYW5nZSgpIHsKICAgICAgICBjb25zdCBtaW5FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLXByaWNlLW1pbicpOwogICAgICAgIGNvbnN0IG1heEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtcHJpY2UtbWF4Jyk7CiAgICAgICAgc3RhdGUuZmlsdGVycy5wcmljZU1pbiA9IG1pbkVsPy52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KG1pbkVsLnZhbHVlKSA6IG51bGw7CiAgICAgICAgc3RhdGUuZmlsdGVycy5wcmljZU1heCA9IG1heEVsPy52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KG1heEVsLnZhbHVlKSA6IG51bGw7CiAgICAgICAgc3RhdGUucGFnZSA9IDE7CiAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAg' +
'ZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlQ2F0ZWdvcnlGaWx0ZXIoY2F0KSB7CiAgICAgICAgY29uc3QgaWR4ID0gc3RhdGUuZmlsdGVycy5jYXRlZ29yeS5pbmRleE9mKGNhdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgIHN0YXRlLmZpbHRlcnMuY2F0ZWdvcnkuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUuZmlsdGVycy5jYXRlZ29yeS5wdXNoKGNhdCk7CiAgICAgICAgfQogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIHJlZnJlc2hGaWx0ZXJzUGFuZWwoKTsKICAgICAgICBmZXRjaENvbGxlY3Rpb24oKTsKICAgIH0KCiAgICAvLyDilIDilIAgTmV3IGZpbHRlciBhY3Rpb24gaGFuZGxlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gdG9nZ2xlUmFyaXR5KHZhbHVlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gc3RhdGUuZmlsdGVycy5yYXJpdHkuaW5kZXhPZih2YWx1ZSk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSBzdGF0ZS5maWx0ZXJzLnJhcml0eS5zcGxpY2UoaWR4LCAxKTsKICAgICAgICBlbHNlIHN0YXRlLmZpbHRlcnMucmFyaXR5LnB1c2godmFsdWUpOwogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIHJlZnJlc2hGaWx0ZXJzUGFuZWwoKTsKICAgICAgICBmZXRjaENvbGxlY3Rpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRQb3dlclJhbmdlKCkgewogICAgICAgIGNvbnN0IG1pbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtcG93LW1pbicpOwogICAgICAgIGNvbnN0IG1heEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtcG93LW1heCcpOwogICAgICAgIHN0YXRlLmZpbHRlcnMucG93ZXJNaW4gPSBtaW5FbD8udmFsdWUgIT09ICcnID8gcGFyc2VGbG9hdChtaW5FbC52YWx1ZSkgOiBudWxsOwogICAgICAgIHN0YXRlLmZpbHRlcnMucG93ZXJNYXggPSBtYXhFbD8udmFsdWUgIT09ICcnID8gcGFyc2VGbG9hdChtYXhFbC52YWx1ZSkgOiBudWxsOwogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFRvdWdoUmFuZ2UoKSB7CiAgICAgICAgY29uc3QgbWluRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC10Z2gtbWluJyk7CiAgICAgICAgY29uc3QgbWF4RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC10Z2gtbWF4Jyk7CiAgICAgICAgc3RhdGUuZmlsdGVycy50b3VnaE1pbiA9IG1pbkVsPy52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KG1pbkVsLnZhbHVlKSA6IG51bGw7CiAgICAgICAgc3RhdGUuZmlsdGVycy50b3VnaE1heCA9IG1heEVsPy52YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KG1heEVsLnZhbHVlKSA6IG51bGw7CiAgICAgICAgc3RhdGUucGFnZSA9IDE7CiAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAgZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0RWRocmVjUmFuZ2UoKSB7CiAgICAgICAgY29uc3QgbWluRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1lZGhyZWMtbWluJyk7CiAgICAgICAgY29uc3QgbWF4RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1lZGhyZWMtbWF4Jyk7CiAgICAgICAgc3RhdGUuZmlsdGVycy5lZGhyZWNNaW4gPSBtaW5FbD8udmFsdWUgIT09ICcnID8gcGFyc2VJbnQobWluRWwudmFsdWUpIDogbnVsbDsKICAgICAgICBzdGF0ZS5maWx0ZXJzLmVkaHJlY01heCA9IG1heEVsPy52YWx1ZSAhPT0gJycgPyBwYXJzZUludChtYXhFbC52YWx1ZSkgOiBudWxsOwogICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFF0eVJhbmdlKCkgewogICAgICAgIGNvbnN0IG1pbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtcXR5LW1pbicpOwogICAgICAgIGNvbnN0IG1heEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtcXR5LW1heCcpOwogICAgICAgIHN0YXRlLmZpbHRlcnMucXR5TWlu' +
'ID0gbWluRWw/LnZhbHVlICE9PSAnJyA/IHBhcnNlSW50KG1pbkVsLnZhbHVlKSA6IG51bGw7CiAgICAgICAgc3RhdGUuZmlsdGVycy5xdHlNYXggPSBtYXhFbD8udmFsdWUgIT09ICcnID8gcGFyc2VJbnQobWF4RWwudmFsdWUpIDogbnVsbDsKICAgICAgICBzdGF0ZS5wYWdlID0gMTsKICAgICAgICBwdXNoVXJsU3RhdGUoKTsKICAgICAgICBmZXRjaENvbGxlY3Rpb24oKTsKICAgIH0KCiAgICAvLyBTZXQgYXV0b2NvbXBsZXRlCiAgICBhc3luYyBmdW5jdGlvbiBsb2FkU2V0c0NhY2hlKCkgewogICAgICAgIGlmIChzdGF0ZS5jYWNoZWRTZXRzLmxlbmd0aCkgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKEFQSV9CQVNFICsgJy9hcGkvY29sbGVjdGlvbi9zZXRzJyk7CiAgICAgICAgICAgIGlmIChyZXMub2spIHN0YXRlLmNhY2hlZFNldHMgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvblNldElucHV0KHZhbCkgewogICAgICAgIGNvbnN0IGRkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtc2V0LWRyb3Bkb3duJyk7CiAgICAgICAgaWYgKCFkZCkgcmV0dXJuOwogICAgICAgIGlmICghdmFsIHx8IHZhbC5sZW5ndGggPCAxKSB7IGRkLmlubmVySFRNTCA9ICcnOyBkZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyByZXR1cm47IH0KICAgICAgICBjb25zdCBxID0gdmFsLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHN0YXRlLmNhY2hlZFNldHMKICAgICAgICAgICAgLmZpbHRlcihzID0+ICFzdGF0ZS5maWx0ZXJzLnNldENvZGUuaW5jbHVkZXMocy5jb2RlKSkKICAgICAgICAgICAgLmZpbHRlcihzID0+IHMuY29kZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8IChzLm5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpCiAgICAgICAgICAgIC5zbGljZSgwLCAxMik7CiAgICAgICAgaWYgKCFtYXRjaGVzLmxlbmd0aCkgeyBkZC5pbm5lckhUTUwgPSAnJzsgZGQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcmV0dXJuOyB9CiAgICAgICAgZGQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgZGQuaW5uZXJIVE1MID0gbWF0Y2hlcy5tYXAocyA9PgogICAgICAgICAgICBgPGRpdiBjbGFzcz0iY29sbC1zZXQtZGQtaXRlbSIgb25jbGljaz0iQ29sbGVjdGlvbi5hZGRTZXRGaWx0ZXIoJyR7ZXNjYXBlQXR0cihzLmNvZGUpfScpIj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLXNldC1kZC1jb2RlIj4ke2VzY2FwZUh0bWwocy5jb2RlKX08L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1zZXQtZGQtbmFtZSI+JHtlc2NhcGVIdG1sKHMubmFtZSB8fCAnJyl9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj5gCiAgICAgICAgKS5qb2luKCcnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRTZXRGaWx0ZXIoY29kZSkgewogICAgICAgIGlmICghc3RhdGUuZmlsdGVycy5zZXRDb2RlLmluY2x1ZGVzKGNvZGUpKSB7CiAgICAgICAgICAgIHN0YXRlLmZpbHRlcnMuc2V0Q29kZS5wdXNoKGNvZGUpOwogICAgICAgICAgICBzdGF0ZS5wYWdlID0gMTsKICAgICAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAgICAgIHJlZnJlc2hGaWx0ZXJzUGFuZWwoKTsKICAgICAgICAgICAgZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtc2V0LWRyb3Bkb3duJyk7CiAgICAgICAgaWYgKGRkKSB7IGRkLmlubmVySFRNTCA9ICcnOyBkZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlU2V0RmlsdGVyKGNvZGUpIHsKICAgICAgICBzdGF0ZS5maWx0ZXJzLnNldENvZGUgPSBzdGF0ZS5maWx0ZXJzLnNldENvZGUuZmlsdGVyKGMgPT4gYyAhPT0gY29kZSk7CiAgICAgICAgc3RhdGUucGFnZSA9IDE7CiAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAgcmVmcmVzaEZpbHRlcnNQYW5lbCgpOwogICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgfQoKICAgIC8vIEtleXdvcmQgYXV0b2NvbXBsZXRlCiAgICBhc3luYyBmdW5jdGlvbiBsb2FkS2V5d29yZHNDYWNoZSgpIHsKICAgICAgICBpZiAoc3RhdGUuY2FjaGVkS2V5d29yZHMubGVuZ3RoKSByZXR1cm47CiAgICAgICAgdHJ5IHsKICAgICAgICAg' +
'ICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQVBJX0JBU0UgKyAnL2FwaS9jb2xsZWN0aW9uL2tleXdvcmRzJyk7CiAgICAgICAgICAgIGlmIChyZXMub2spIHN0YXRlLmNhY2hlZEtleXdvcmRzID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9CiAgICB9CgogICAgZnVuY3Rpb24gb25Ld0lucHV0KHZhbCkgewogICAgICAgIGNvbnN0IGRkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwta3ctZHJvcGRvd24nKTsKICAgICAgICBpZiAoIWRkKSByZXR1cm47CiAgICAgICAgaWYgKCF2YWwgfHwgdmFsLmxlbmd0aCA8IDEpIHsgZGQuaW5uZXJIVE1MID0gJyc7IGRkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IHJldHVybjsgfQogICAgICAgIGNvbnN0IHEgPSB2YWwudG9Mb3dlckNhc2UoKTsKICAgICAgICBjb25zdCBtYXRjaGVzID0gc3RhdGUuY2FjaGVkS2V5d29yZHMKICAgICAgICAgICAgLmZpbHRlcihrID0+ICFzdGF0ZS5maWx0ZXJzLmtleXdvcmQuaW5jbHVkZXMoaykpCiAgICAgICAgICAgIC5maWx0ZXIoayA9PiBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpCiAgICAgICAgICAgIC5zbGljZSgwLCAxMik7CiAgICAgICAgaWYgKCFtYXRjaGVzLmxlbmd0aCkgeyBkZC5pbm5lckhUTUwgPSAnJzsgZGQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcmV0dXJuOyB9CiAgICAgICAgZGQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgZGQuaW5uZXJIVE1MID0gbWF0Y2hlcy5tYXAoayA9PgogICAgICAgICAgICBgPGRpdiBjbGFzcz0iY29sbC1rdy1kZC1pdGVtIiBvbmNsaWNrPSJDb2xsZWN0aW9uLmFkZEtleXdvcmRGaWx0ZXIoJyR7ZXNjYXBlQXR0cihrKX0nKSI+CiAgICAgICAgICAgICAgICAke2VzY2FwZUh0bWwoayl9CiAgICAgICAgICAgIDwvZGl2PmAKICAgICAgICApLmpvaW4oJycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEtleXdvcmRGaWx0ZXIoa3cpIHsKICAgICAgICBpZiAoIXN0YXRlLmZpbHRlcnMua2V5d29yZC5pbmNsdWRlcyhrdykpIHsKICAgICAgICAgICAgc3RhdGUuZmlsdGVycy5rZXl3b3JkLnB1c2goa3cpOwogICAgICAgICAgICBzdGF0ZS5wYWdlID0gMTsKICAgICAgICAgICAgcHVzaFVybFN0YXRlKCk7CiAgICAgICAgICAgIHJlZnJlc2hGaWx0ZXJzUGFuZWwoKTsKICAgICAgICAgICAgZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwta3ctZHJvcGRvd24nKTsKICAgICAgICBpZiAoZGQpIHsgZGQuaW5uZXJIVE1MID0gJyc7IGRkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVLZXl3b3JkRmlsdGVyKGt3KSB7CiAgICAgICAgc3RhdGUuZmlsdGVycy5rZXl3b3JkID0gc3RhdGUuZmlsdGVycy5rZXl3b3JkLmZpbHRlcihrID0+IGsgIT09IGt3KTsKICAgICAgICBzdGF0ZS5wYWdlID0gMTsKICAgICAgICBwdXNoVXJsU3RhdGUoKTsKICAgICAgICByZWZyZXNoRmlsdGVyc1BhbmVsKCk7CiAgICAgICAgZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRGaWx0ZXJzKCkgewogICAgICAgIHN0YXRlLmZpbHRlcnMgPSB7CiAgICAgICAgICAgIGNvbG9yczogW10sIHR5cGVzOiBbXSwgaXNMZWdlbmRhcnk6IGZhbHNlLCBpc0Jhc2ljOiBmYWxzZSwKICAgICAgICAgICAgaXNHYW1lQ2hhbmdlcjogZmFsc2UsIGhpZ2hTYWx0OiBmYWxzZSwgZmluaXNoOiAnJywKICAgICAgICAgICAgY21jTWluOiBudWxsLCBjbWNNYXg6IG51bGwsIHByaWNlTWluOiBudWxsLCBwcmljZU1heDogbnVsbCwKICAgICAgICAgICAgY2F0ZWdvcnk6IFtdLCByYXJpdHk6IFtdLCBzZXRDb2RlOiBbXSwKICAgICAgICAgICAgcG93ZXJNaW46IG51bGwsIHBvd2VyTWF4OiBudWxsLCB0b3VnaE1pbjogbnVsbCwgdG91Z2hNYXg6IG51bGwsCiAgICAgICAgICAgIGtleXdvcmQ6IFtdLCBlZGhyZWNNaW46IG51bGwsIGVkaHJlY01heDogbnVsbCwKICAgICAgICAgICAgcXR5TWluOiBudWxsLCBxdHlNYXg6IG51bGwsCiAgICAgICAgfTsKICAgICAgICBzdGF0ZS5wYWdlID0gMTsKICAgICAgICBzdGF0ZS5zZWFyY2ggPSAnJzsKICAgICAgICBjb25zdCBzZWFyY2hFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLXNlYXJjaCcpOwogICAgICAgIGlmIChzZWFyY2hFbCkgc2VhcmNoRWwudmFsdWUgPSAnJzsKICAgICAg' +
'ICBwdXNoVXJsU3RhdGUoKTsKICAgICAgICByZWZyZXNoRmlsdGVyc1BhbmVsKCk7CiAgICAgICAgZmV0Y2hDb2xsZWN0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVmcmVzaEZpbHRlcnNQYW5lbCgpIHsKICAgICAgICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWZpbHRlcnMnKTsKICAgICAgICBpZiAocGFuZWwpIHBhbmVsLmlubmVySFRNTCA9IHJlbmRlckZpbHRlcnNIdG1sKCk7CiAgICB9CgogICAgLy8g4pSA4pSAIERldGFpbCBEcmF3ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gb3BlbkRyYXdlcihjYXJkSWQpIHsKICAgICAgICBzdGF0ZS5zZWxlY3RlZENhcmQgPSBudWxsOwogICAgICAgIHN0YXRlLmVkaHJlY0RhdGEgPSBudWxsOwogICAgICAgIHN0YXRlLmRyYXdlclRhYiA9ICdvdmVydmlldyc7CgogICAgICAgIGNvbnN0IGRyYXdlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWRyYXdlcicpOwogICAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtZHJhd2VyLWJhY2tkcm9wJyk7CiAgICAgICAgY29uc3QgaW5uZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1kcmF3ZXItaW5uZXInKTsKICAgICAgICBpZiAoIWRyYXdlcikgcmV0dXJuOwoKICAgICAgICBkcmF3ZXIuY2xhc3NMaXN0LmFkZCgnb3BlbicpOwogICAgICAgIGlmIChiYWNrZHJvcCkgYmFja2Ryb3AuY2xhc3NMaXN0LmFkZCgnb3BlbicpOwogICAgICAgIHN0YXRlLmRyYXdlck9wZW4gPSB0cnVlOwoKICAgICAgICBpbm5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0iY29sbC1kcmF3ZXItbG9hZGluZyI+PGRpdiBjbGFzcz0iY29sbC1zcGlubmVyIj48L2Rpdj48L2Rpdj5gOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBjYXJkID0gYXdhaXQgZmV0Y2hDYXJkRGV0YWlsKGNhcmRJZCk7CiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkQ2FyZCA9IGNhcmQ7CiAgICAgICAgICAgIHJlbmRlckRyYXdlcigpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBpbm5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0iY29sbC1kcmF3ZXItZXJyb3IiPkZhaWxlZCB0byBsb2FkIGNhcmQ6ICR7ZXNjYXBlSHRtbChlcnIubWVzc2FnZSl9PC9kaXY+YDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY2xvc2VEcmF3ZXIoKSB7CiAgICAgICAgY29uc3QgZHJhd2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtZHJhd2VyJyk7CiAgICAgICAgY29uc3QgYmFja2Ryb3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1kcmF3ZXItYmFja2Ryb3AnKTsKICAgICAgICBpZiAoZHJhd2VyKSBkcmF3ZXIuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICAgIGlmIChiYWNrZHJvcCkgYmFja2Ryb3AuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpOwogICAgICAgIHN0YXRlLmRyYXdlck9wZW4gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5zZWxlY3RlZENhcmQgPSBudWxsOwogICAgICAgIGNsb3NlQ2F0ZWdvcnlQb3BvdmVyKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyRHJhd2VyKCkgewogICAgICAgIGNvbnN0IGlubmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtZHJhd2VyLWlubmVyJyk7CiAgICAgICAgaWYgKCFpbm5lciB8fCAhc3RhdGUuc2VsZWN0ZWRDYXJkKSByZXR1cm47CiAgICAgICAgY29uc3QgY2FyZCA9IHN0YXRlLnNlbGVjdGVkQ2FyZDsKCiAgICAgICAgY29uc3QgdGFiQ29udGVudCA9IHJlbmRlckRyYXdlclRhYkNvbnRlbnQoKTsKCiAgICAgICAgaW5uZXIuaW5uZXJIVE1MID0gYAogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLWhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLWhlYWRlci10b3AiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGwtZHJhd2VyLWNhcmQtbmFtZSI+JHtlc2NhcGVIdG1sKGNhcmQubmFtZSl9PC9zcGFuPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1kcmF3ZXItY2xvc2UiIG9uY2xpY2s9IkNvbGxlY3Rpb24uY2xvc2VEcmF3ZXIoKSI+4pyVPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2' +
'PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1tZXRhIj4KICAgICAgICAgICAgICAgICR7cmVuZGVyQ29sb3JQaXBzKGNhcmQuY29sb3JJZGVudGl0eSl9CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1kcmF3ZXItdHlwZSI+JHtlc2NhcGVIdG1sKGNhcmQudHlwZUxpbmUgfHwgJycpfTwvc3Bhbj4KICAgICAgICAgICAgICAgICR7Y2FyZC5pc0xlZ2VuZGFyeSA/ICc8c3BhbiBjbGFzcz0iY29sbC1sZWdlbmRhcnktaWNvbiIgdGl0bGU9IkxlZ2VuZGFyeSI+4peGIExlZ2VuZGFyeTwvc3Bhbj4nIDogJyd9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1ib2R5Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1kcmF3ZXItaW1hZ2Utd3JhcCI+CiAgICAgICAgICAgICAgICAke2NhcmQuaW1hZ2VVcmwKICAgICAgICAgICAgICAgICAgICA/IGA8aW1nIGNsYXNzPSJjb2xsLWRyYXdlci1pbWFnZSIgc3JjPSIke2VzY2FwZUF0dHIoY2FyZC5pbWFnZVVybCl9IiBhbHQ9IiR7ZXNjYXBlQXR0cihjYXJkLm5hbWUpfSIgbG9hZGluZz0ibGF6eSI+YAogICAgICAgICAgICAgICAgICAgIDogYDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLW5vLWltYWdlIj5ObyBJbWFnZTwvZGl2PmB9CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1kcmF3ZXItdGFicyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLXRhYi1idG4gJHtzdGF0ZS5kcmF3ZXJUYWIgPT09ICdvdmVydmlldycgPyAnYWN0aXZlJyA6ICcnfSIKICAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0iQ29sbGVjdGlvbi5zd2l0Y2hEcmF3ZXJUYWIoJ292ZXJ2aWV3JykiPk92ZXJ2aWV3PC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLXRhYi1idG4gJHtzdGF0ZS5kcmF3ZXJUYWIgPT09ICdlZGhyZWMnID8gJ2FjdGl2ZScgOiAnJ30iCiAgICAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IkNvbGxlY3Rpb24uc3dpdGNoRHJhd2VyVGFiKCdlZGhyZWMnKSI+RURIUkVDPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLXRhYi1idG4gJHtzdGF0ZS5kcmF3ZXJUYWIgPT09ICdkZWNrcycgPyAnYWN0aXZlJyA6ICcnfSIKICAgICAgICAgICAgICAgICAgICAgICAgb25jbGljaz0iQ29sbGVjdGlvbi5zd2l0Y2hEcmF3ZXJUYWIoJ2RlY2tzJykiPlNhbXBsZSBEZWNrczwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLXRhYi1jb250ZW50IiBpZD0iY29sbC1kcmF3ZXItdGFiLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgJHt0YWJDb250ZW50fQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckRyYXdlclRhYkNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHN0YXRlLmRyYXdlclRhYiA9PT0gJ292ZXJ2aWV3JykgcmV0dXJuIHJlbmRlck92ZXJ2aWV3VGFiKCk7CiAgICAgICAgaWYgKHN0YXRlLmRyYXdlclRhYiA9PT0gJ2VkaHJlYycpICAgcmV0dXJuIHJlbmRlckVkaHJlY1RhYigpOwogICAgICAgIGlmIChzdGF0ZS5kcmF3ZXJUYWIgPT09ICdkZWNrcycpICAgIHJldHVybiByZW5kZXJEZWNrc1RhYigpOwogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJPdmVydmlld1RhYigpIHsKICAgICAgICBjb25zdCBjYXJkID0gc3RhdGUuc2VsZWN0ZWRDYXJkOwogICAgICAgIGlmICghY2FyZCkgcmV0dXJuICcnOwoKICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gQXJyYXkuaXNBcnJheShjYXJkLmNhdGVnb3J5KSA/IGNhcmQuY2F0ZWdvcnkgOiBbXTsKICAgICAgICBjb25zdCB0YWdzID0gY2FyZC50YWdzID8gY2FyZC50YWdzLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkpLmZpbHRlcihCb29sZWFuKSA6IFtdOwoKICAgICAgICBjb25zdCBjYXRDaGlwcyA9IGNhdGVnb3JpZXMubWFwKGNhdCA9PgogICAgICAgICAgICBgPHNwYW4gY2xhc3M9ImNvbGwtZHJhd2VyLWNhdC1jaGlwIj4ke2VzY2FwZUh0bWwoY2F0KX0KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtY2hpcC1yZW1vdmUiIG9uY2xpY2s9IkNvbGxlY3Rpb24ucmVtb3ZlRHJhd2VyQ2F0ZWdvcnkoJyR7ZXNjYXBlQXR0cihjYXQpfScpIj7DlzwvYnV0' +
'dG9uPgogICAgICAgICAgICA8L3NwYW4+YAogICAgICAgICkuam9pbignJyk7CgogICAgICAgIGNvbnN0IGNhdFN1Z2dlc3Rpb25zID0gQ0FURUdPUllfU1VHR0VTVElPTlMuZmlsdGVyKHMgPT4gIWNhdGVnb3JpZXMuaW5jbHVkZXMocykpLm1hcChzID0+CiAgICAgICAgICAgIGA8YnV0dG9uIGNsYXNzPSJjb2xsLWNhdC1zdWdnZXN0LWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5hZGREcmF3ZXJDYXRlZ29yeSgnJHtlc2NhcGVBdHRyKHMpfScpIj4ke2VzY2FwZUh0bWwocyl9PC9idXR0b24+YAogICAgICAgICkuam9pbignJyk7CgogICAgICAgIGNvbnN0IF9tYyA9IGNhcmQubWFuYUNvc3QgfHwgY2FyZC5tYW5hX2Nvc3QgfHwgJyc7CiAgICAgICAgY29uc3QgX3B3ID0gY2FyZC5wb3dlciB8fCAnJzsKICAgICAgICBjb25zdCBfdGcgPSBjYXJkLnRvdWdobmVzcyB8fCAnJzsKICAgICAgICBjb25zdCBfcHQgPSAoX3B3IHx8IF90ZykgPyBgJHtfcHcgfHwgJ+KAlCd9LyR7X3RnIHx8ICfigJQnfWAgOiAnJzsKICAgICAgICBjb25zdCBfcnIgPSBjYXJkLnJhcml0eSB8fCAnJzsKICAgICAgICBjb25zdCBfc24gPSBjYXJkLnNldE5hbWUgfHwgY2FyZC5zZXRfbmFtZSB8fCAnJzsKICAgICAgICBjb25zdCBfZXIgPSBjYXJkLmVkaHJlY1JhbmsgfHwgY2FyZC5lZGhyZWNfcmFuayB8fCAwOwoKICAgICAgICByZXR1cm4gYAogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtb3ZlcnZpZXctZ3JpZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtb3ZlcnZpZXctcm93Ij48c3BhbiBjbGFzcz0iY29sbC1vdi1sYWJlbCI+TWFuYSBDb3N0PC9zcGFuPjxzcGFuPiR7cmVuZGVyTWFuYUNvc3QoX21jKX08L3NwYW4+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtb3ZlcnZpZXctcm93Ij48c3BhbiBjbGFzcz0iY29sbC1vdi1sYWJlbCI+Q01DPC9zcGFuPjxzcGFuPiR7Y2FyZC5jbWMgPz8gJ+KAlCd9PC9zcGFuPjwvZGl2PgogICAgICAgICAgICAke19wdCA/IGA8ZGl2IGNsYXNzPSJjb2xsLW92ZXJ2aWV3LXJvdyI+PHNwYW4gY2xhc3M9ImNvbGwtb3YtbGFiZWwiPlAvVDwvc3Bhbj48c3Bhbj4ke2VzY2FwZUh0bWwoX3B0KX08L3NwYW4+PC9kaXY+YCA6ICcnfQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW92ZXJ2aWV3LXJvdyI+PHNwYW4gY2xhc3M9ImNvbGwtb3YtbGFiZWwiPlJhcml0eTwvc3Bhbj48c3BhbiBjbGFzcz0iY29sbC1yYXJpdHkgY29sbC1yYXJpdHktJHtlc2NhcGVBdHRyKF9ycil9Ij4ke2VzY2FwZUh0bWwoX3JyIHx8ICfigJQnKX08L3NwYW4+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtb3ZlcnZpZXctcm93Ij48c3BhbiBjbGFzcz0iY29sbC1vdi1sYWJlbCI+U2V0PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4+JHtlc2NhcGVIdG1sKF9zbiB8fCBjYXJkLnNldENvZGUgfHwgY2FyZC5zZXRfY29kZSB8fCAnJyl9ICR7Y2FyZC5jb2xsZWN0b3JOdW1iZXIgfHwgY2FyZC5jb2xsZWN0b3JfbnVtYmVyID8gYCMke2VzY2FwZUh0bWwoY2FyZC5jb2xsZWN0b3JOdW1iZXIgfHwgY2FyZC5jb2xsZWN0b3JfbnVtYmVyKX1gIDogJyd9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1vdmVydmlldy1yb3ciPjxzcGFuIGNsYXNzPSJjb2xsLW92LWxhYmVsIj5QcmljZTwvc3Bhbj48c3Bhbj4ke2Zvcm1hdFByaWNlKGNhcmQudGNnUHJpY2UgfHwgY2FyZC50Y2dfcHJpY2UpfTwvc3Bhbj48L2Rpdj4KICAgICAgICAgICAgJHtfZXIgPyBgPGRpdiBjbGFzcz0iY29sbC1vdmVydmlldy1yb3ciPjxzcGFuIGNsYXNzPSJjb2xsLW92LWxhYmVsIj5FREhSRUMgUmFuazwvc3Bhbj48c3Bhbj4jJHtfZXJ9PC9zcGFuPjwvZGl2PmAgOiAnJ30KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1vdmVydmlldy1yb3ciPjxzcGFuIGNsYXNzPSJjb2xsLW92LWxhYmVsIj5TYWx0PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IiR7c2FsdENsYXNzKGNhcmQuc2FsdFNjb3JlID8/IGNhcmQuc2FsdF9zY29yZSl9Ij4keyhjYXJkLnNhbHRTY29yZSA/PyBjYXJkLnNhbHRfc2NvcmUpICE9IG51bGwgPyBOdW1iZXIoY2FyZC5zYWx0U2NvcmUgPz8gY2FyZC5zYWx0X3Njb3JlKS50b0ZpeGVkKDIpIDogJ+KAlCd9PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1vdmVydmlldy1yb3ciPjxzcGFuIGNsYXNzPSJjb2xsLW92' +
'LWxhYmVsIj5HYW1lIENoYW5nZXI8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3Bhbj4keyhjYXJkLmlzR2FtZUNoYW5nZXIgfHwgY2FyZC5pc19nYW1lX2NoYW5nZXIpID8gJ+KYhSBZZXMnIDogJ05vJ308L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW92ZXJ2aWV3LXJvdyI+PHNwYW4gY2xhc3M9ImNvbGwtb3YtbGFiZWwiPkZpbmlzaDwvc3Bhbj48c3Bhbj4ke3JlbmRlckZpbmlzaEJhZGdlKGNhcmQuZmluaXNoKX08L3NwYW4+PC9kaXY+CiAgICAgICAgICAgICR7Y2FyZC5rZXl3b3JkcyAmJiBjYXJkLmtleXdvcmRzLmxlbmd0aAogICAgICAgICAgICAgICAgPyBgPGRpdiBjbGFzcz0iY29sbC1vdmVydmlldy1yb3ciPjxzcGFuIGNsYXNzPSJjb2xsLW92LWxhYmVsIj5LZXl3b3Jkczwvc3Bhbj48c3Bhbj4ke2VzY2FwZUh0bWwoY2FyZC5rZXl3b3Jkcy5qb2luKCcsICcpKX08L3NwYW4+PC9kaXY+YAogICAgICAgICAgICAgICAgOiAnJ30KICAgICAgICA8L2Rpdj4KCiAgICAgICAgJHtjYXJkLm9yYWNsZVRleHQKICAgICAgICAgICAgPyBgPGRpdiBjbGFzcz0iY29sbC1vcmFjbGUtdGV4dCI+JHtlc2NhcGVIdG1sKGNhcmQub3JhY2xlVGV4dCkucmVwbGFjZSgvXG4vZywgJzxicj4nKX08L2Rpdj5gCiAgICAgICAgICAgIDogJyd9CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1zZWN0aW9uLWxhYmVsIj5GaW5pc2g8L2Rpdj4KICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iY29sbC1maW5pc2gtc2VsZWN0IiBpZD0iY29sbC1kcmF3ZXItZmluaXNoIgogICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJDb2xsZWN0aW9uLnNhdmVDYXJkRWRpdHMoKSI+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJOT1JNQUwiICAke2NhcmQuZmluaXNoID09PSAnTk9STUFMJyAgfHwgIWNhcmQuZmluaXNoID8gJ3NlbGVjdGVkJyA6ICcnfT5Ob3JtYWw8L29wdGlvbj4KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkZPSUwiICAgICR7Y2FyZC5maW5pc2ggPT09ICdGT0lMJyAgID8gJ3NlbGVjdGVkJyA6ICcnfT5Gb2lsPC9vcHRpb24+CiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJFVENIRUQiICAke2NhcmQuZmluaXNoID09PSAnRVRDSEVEJyA/ICdzZWxlY3RlZCcgOiAnJ30+RXRjaGVkPC9vcHRpb24+CiAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1kcmF3ZXItc2VjdGlvbi1sYWJlbCI+Q2F0ZWdvcmllczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1jYXQtY2hpcHMiIGlkPSJjb2xsLWRyYXdlci1jYXQtY2hpcHMiPiR7Y2F0Q2hpcHN9PC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtY2F0LXN1Z2dlc3Rpb25zIj4ke2NhdFN1Z2dlc3Rpb25zfTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWNhdC1hZGQtcm93Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iY29sbC1kcmF3ZXItY2F0LWlucHV0IiBjbGFzcz0iY29sbC1jYXQtaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkFkZCBjdXN0b20gY2F0ZWdvcnnigKYiIGF1dG9jb21wbGV0ZT0ib2ZmIgogICAgICAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj0iaWYoZXZlbnQua2V5PT09J0VudGVyJyl7Q29sbGVjdGlvbi5hZGREcmF3ZXJDYXRlZ29yeUZyb21JbnB1dCgpO2V2ZW50LnByZXZlbnREZWZhdWx0KCl9IiAvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1jYXQtYWRkLWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5hZGREcmF3ZXJDYXRlZ29yeUZyb21JbnB1dCgpIj5BZGQ8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1zZWN0aW9uLWxhYmVsIj5UYWdzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZHJhd2VyLXRhZ3MiIGlkPSJjb2xsLWRyYXdlci10YWdzIj4KICAgICAgICAgICAgICAgICR7dGFncy5tYXAodGFnID0+CiAgICAgICAgICAgICAgICAgICAgYDxzcGFu' +
'IGNsYXNzPSJjb2xsLWRyYXdlci10YWctY2hpcCI+JHtlc2NhcGVIdG1sKHRhZyl9CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtY2hpcC1yZW1vdmUiIG9uY2xpY2s9IkNvbGxlY3Rpb24ucmVtb3ZlRHJhd2VyVGFnKCcke2VzY2FwZUF0dHIodGFnKX0nKSI+w5c8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L3NwYW4+YAogICAgICAgICAgICAgICAgKS5qb2luKCcnKX0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtdGFnLWFkZC1yb3ciPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjb2xsLWRyYXdlci10YWctaW5wdXQiIGNsYXNzPSJjb2xsLWNhdC1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iQWRkIHRhZ+KApiIgYXV0b2NvbXBsZXRlPSJvZmYiCiAgICAgICAgICAgICAgICAgICAgICAgb25rZXlkb3duPSJpZihldmVudC5rZXk9PT0nRW50ZXInKXtDb2xsZWN0aW9uLmFkZERyYXdlclRhZ0Zyb21JbnB1dCgpO2V2ZW50LnByZXZlbnREZWZhdWx0KCl9IiAvPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1jYXQtYWRkLWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5hZGREcmF3ZXJUYWdGcm9tSW5wdXQoKSI+QWRkPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1kcmF3ZXItc2VjdGlvbi1sYWJlbCI+Tm90ZXM8L2Rpdj4KICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJjb2xsLWRyYXdlci1ub3RlcyIgY2xhc3M9ImNvbGwtbm90ZXMtdGV4dGFyZWEiIHJvd3M9IjQiCiAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iTm90ZXMgYWJvdXQgdGhpcyBjYXJkIGluIHlvdXIgY29sbGVjdGlvbuKApiIKICAgICAgICAgICAgICAgICAgICAgIG9uYmx1cj0iQ29sbGVjdGlvbi5zYXZlQ2FyZEVkaXRzKCkiPiR7ZXNjYXBlSHRtbChjYXJkLm5vdGVzIHx8ICcnKX08L3RleHRhcmVhPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRyYXdlci1zYXZlLXJvdyI+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtc2F2ZS1idG4iIG9uY2xpY2s9IkNvbGxlY3Rpb24uc2F2ZUNhcmRFZGl0cygpIj5TYXZlIENoYW5nZXM8L2J1dHRvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGwtc2F2ZS1zdGF0dXMiIGlkPSJjb2xsLXNhdmUtc3RhdHVzIj48L3NwYW4+CiAgICAgICAgPC9kaXY+YDsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJFZGhyZWNUYWIoKSB7CiAgICAgICAgaWYgKHN0YXRlLmVkaHJlY0xvYWRpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJjb2xsLWVkaHJlYy1sb2FkaW5nIj48ZGl2IGNsYXNzPSJjb2xsLXNwaW5uZXIiPjwvZGl2PjxzcGFuPkxvYWRpbmcgRURIUkVDIGRhdGHigKY8L3NwYW4+PC9kaXY+YDsKICAgICAgICB9CiAgICAgICAgaWYgKCFzdGF0ZS5lZGhyZWNEYXRhKSB7CiAgICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz0iY29sbC1lZGhyZWMtcHJvbXB0Ij4KICAgICAgICAgICAgICAgIDxwPkZldGNoIEVESFJFQyByZWNvbW1lbmRhdGlvbnMgZm9yIHRoaXMgY2FyZC48L3A+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWVkaHJlYy1mZXRjaC1idG4iIG9uY2xpY2s9IkNvbGxlY3Rpb24ubG9hZEVkaHJlY1RhYigpIj5Mb2FkIEVESFJFQyBEYXRhPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBkYXRhID0gc3RhdGUuZWRocmVjRGF0YTsKICAgICAgICBjb25zdCByZWNzID0gZGF0YS5yZWNvbW1lbmRhdGlvbnMgfHwgW107CgogICAgICAgIGNvbnN0IGxpbmtzID0gZGF0YS5saW5rcyB8fCB7fTsKICAgICAgICBjb25zdCBsaW5rc0h0bWwgPSBbCiAgICAgICAgICAgIGxpbmtzLmVkaHJlY1BhZ2UgICAgJiYgYDxhIGNsYXNzPSJjb2xsLWVkaHJlYy1saW5rIiBocmVmPSIke2VzY2FwZUF0dHIobGlua3MuZWRocmVjUGFnZSl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+RURIUkVDIFBhZ2U8L2E+YCwKICAgICAgICAgICAgbGlua3MuYXJjaGlkZWt0U2VhcmNoVXJpICYmIGA8YSBjbGFzcz0iY29sbC1lZGhyZWMtbGluayIgaHJlZj0iJHtlc2NhcGVBdHRyKGxpbmtzLmFy' +
'Y2hpZGVrdFNlYXJjaFVyaSl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+QXJjaGlkZWt0IFNlYXJjaDwvYT5gLAogICAgICAgICAgICBsaW5rcy5tb3hmaWVsZFNlYXJjaFVyaSAgJiYgYDxhIGNsYXNzPSJjb2xsLWVkaHJlYy1saW5rIiBocmVmPSIke2VzY2FwZUF0dHIobGlua3MubW94ZmllbGRTZWFyY2hVcmkpfSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiPk1veGZpZWxkIFNlYXJjaDwvYT5gLAogICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJycpOwoKICAgICAgICBpZiAocmVjcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJjb2xsLWVkaHJlYy1lbXB0eSI+CiAgICAgICAgICAgICAgICA8cD5ObyBFREhSRUMgcmVjb21tZW5kYXRpb25zIGZvdW5kLjwvcD4KICAgICAgICAgICAgICAgICR7bGlua3NIdG1sID8gYDxkaXYgY2xhc3M9ImNvbGwtZWRocmVjLWxpbmtzIj4ke2xpbmtzSHRtbH08L2Rpdj5gIDogJyd9CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgfQoKICAgICAgICBjb25zdCByZWNSb3dzID0gcmVjcy5tYXAocmVjID0+IGAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1lZGhyZWMtcmVjIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZWRocmVjLXJlYy1uYW1lIj4ke2VzY2FwZUh0bWwocmVjLm5hbWUgfHwgJycpfTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1lZGhyZWMtcmVjLW1ldGEiPgogICAgICAgICAgICAgICAgICAgICR7cmVjLnJvbGUgICAgID8gYDxzcGFuIGNsYXNzPSJjb2xsLWVkaHJlYy1yb2xlIj4ke2VzY2FwZUh0bWwocmVjLnJvbGUpfTwvc3Bhbj5gIDogJyd9CiAgICAgICAgICAgICAgICAgICAgJHtyZWMuc3luZXJneSAgIT0gbnVsbCA/IGA8c3BhbiBjbGFzcz0iY29sbC1lZGhyZWMtc3luZXJneSIgdGl0bGU9IlN5bmVyZ3kgc2NvcmUiPiR7TnVtYmVyKHJlYy5zeW5lcmd5KS50b0ZpeGVkKDApfSU8L3NwYW4+YCA6ICcnfQogICAgICAgICAgICAgICAgICAgICR7cmVjLmluY2x1c2lvbiAhPSBudWxsID8gYDxzcGFuIGNsYXNzPSJjb2xsLWVkaHJlYy1pbmNsdXNpb24iIHRpdGxlPSJJbmNsdXNpb24gcmF0ZSI+JHtOdW1iZXIocmVjLmluY2x1c2lvbikudG9GaXhlZCgwKX0lPC9zcGFuPmAgOiAnJ30KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj5gKS5qb2luKCcnKTsKCiAgICAgICAgcmV0dXJuIGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWVkaHJlYy1yZWNzIj4ke3JlY1Jvd3N9PC9kaXY+CiAgICAgICAgJHtsaW5rc0h0bWwgPyBgPGRpdiBjbGFzcz0iY29sbC1lZGhyZWMtbGlua3MiPiR7bGlua3NIdG1sfTwvZGl2PmAgOiAnJ31gOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckRlY2tzVGFiKCkgewogICAgICAgIGNvbnN0IGNhcmQgPSBzdGF0ZS5zZWxlY3RlZENhcmQ7CiAgICAgICAgaWYgKCFjYXJkKSByZXR1cm4gJyc7CgogICAgICAgIGNvbnN0IG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQoY2FyZC5uYW1lKTsKICAgICAgICBjb25zdCBhcmNoaWRla3RVcmwgPSBgaHR0cHM6Ly93d3cuYXJjaGlkZWt0LmNvbS9zZWFyY2g/cT0ke25hbWV9JmZvcm1hdD1jb21tYW5kZXJgOwogICAgICAgIGNvbnN0IG1veGZpZWxkVXJsICA9IGBodHRwczovL3d3dy5tb3hmaWVsZC5jb20vc2VhcmNoP3E9JHtuYW1lfWA7CiAgICAgICAgY29uc3QgZWRocmVjVXJsICAgID0gYGh0dHBzOi8vZWRocmVjLmNvbS9jYXJkcy8ke25hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ccysvZywgJy0nKX1gOwoKICAgICAgICByZXR1cm4gYAogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZGVja3MtdGFiIj4KICAgICAgICAgICAgPHAgY2xhc3M9ImNvbGwtZGVja3MtaGludCI+U2VhcmNoIGZvciBkZWNrcyBmZWF0dXJpbmcgPHN0cm9uZz4ke2VzY2FwZUh0bWwoY2FyZC5uYW1lKX08L3N0cm9uZz46PC9wPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWRlY2tzLWxpbmtzIj4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJjb2xsLWRlY2stbGluayIgaHJlZj0iJHtlc2NhcGVBdHRyKGFyY2hpZGVrdFVybCl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+CiAgICAgICAgICAgICAgICAgICAg8J+Pl++4jyBTZWFyY2ggQXJjaGlkZWt0CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iY29sbC1kZWNrLWxpbmsiIGhyZWY9IiR7' +
'ZXNjYXBlQXR0cihtb3hmaWVsZFVybCl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+CiAgICAgICAgICAgICAgICAgICAg8J+TmiBTZWFyY2ggTW94ZmllbGQKICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJjb2xsLWRlY2stbGluayIgaHJlZj0iJHtlc2NhcGVBdHRyKGVkaHJlY1VybCl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+CiAgICAgICAgICAgICAgICAgICAg8J+TiiBWaWV3IG9uIEVESFJFQwogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIGZ1bmN0aW9uIHN3aXRjaERyYXdlclRhYih0YWIpIHsKICAgICAgICBzdGF0ZS5kcmF3ZXJUYWIgPSB0YWI7CiAgICAgICAgaWYgKHRhYiA9PT0gJ2VkaHJlYycgJiYgIXN0YXRlLmVkaHJlY0RhdGEgJiYgIXN0YXRlLmVkaHJlY0xvYWRpbmcpIHsKICAgICAgICAgICAgbG9hZEVkaHJlY1RhYigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1kcmF3ZXItdGFiLWNvbnRlbnQnKTsKICAgICAgICBpZiAoY29udGVudCkgY29udGVudC5pbm5lckhUTUwgPSByZW5kZXJEcmF3ZXJUYWJDb250ZW50KCk7CiAgICAgICAgLy8gVXBkYXRlIHRhYiBidXR0b24gc3RhdGVzCiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmNvbGwtdGFiLWJ0bicpLmZvckVhY2goYnRuID0+IHsKICAgICAgICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGJ0bi50ZXh0Q29udGVudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRhYikpOwogICAgICAgIH0pOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRFZGhyZWNUYWIoKSB7CiAgICAgICAgaWYgKCFzdGF0ZS5zZWxlY3RlZENhcmQpIHJldHVybjsKICAgICAgICBzdGF0ZS5lZGhyZWNMb2FkaW5nID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5lZGhyZWNEYXRhID0gbnVsbDsKICAgICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtZHJhd2VyLXRhYi1jb250ZW50Jyk7CiAgICAgICAgaWYgKGNvbnRlbnQpIGNvbnRlbnQuaW5uZXJIVE1MID0gcmVuZGVyRWRocmVjVGFiKCk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEVkaHJlY0RhdGEoc3RhdGUuc2VsZWN0ZWRDYXJkLmlkKTsKICAgICAgICAgICAgc3RhdGUuZWRocmVjRGF0YSA9IGRhdGE7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHN0YXRlLmVkaHJlY0RhdGEgPSB7IGVycm9yOiBlcnIubWVzc2FnZSwgcmVjb21tZW5kYXRpb25zOiBbXSwgbGlua3M6IHt9IH07CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgc3RhdGUuZWRocmVjTG9hZGluZyA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbnRlbnQpIGNvbnRlbnQuaW5uZXJIVE1MID0gcmVuZGVyRWRocmVjVGFiKCk7CiAgICB9CgogICAgLy8g4pSA4pSAIERyYXdlciBFZGl0aW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIGFkZERyYXdlckNhdGVnb3J5KGNhdCkgewogICAgICAgIGlmICghc3RhdGUuc2VsZWN0ZWRDYXJkKSByZXR1cm47CiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IEFycmF5LmlzQXJyYXkoc3RhdGUuc2VsZWN0ZWRDYXJkLmNhdGVnb3J5KSA/IFsuLi5zdGF0ZS5zZWxlY3RlZENhcmQuY2F0ZWdvcnldIDogW107CiAgICAgICAgaWYgKCFjYXRlZ29yaWVzLmluY2x1ZGVzKGNhdCkpIHsKICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKGNhdCk7CiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkQ2FyZC5jYXRlZ29yeSA9IGNhdGVnb3JpZXM7CiAgICAgICAgICAgIHJlZnJlc2hEcmF3ZXJDYXRlZ29yaWVzKCk7CiAgICAgICAgICAgIHNhdmVDYXJkRWRpdHMoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRHJhd2VyQ2F0ZWdvcnkoY2F0KSB7CiAgICAgICAgaWYgKCFzdGF0ZS5zZWxlY3RlZENhcmQpIHJldHVybjsKICAgICAgICBzdGF0ZS5zZWxlY3RlZENhcmQuY2F0ZWdvcnkgPSAoc3RhdGUuc2VsZWN0ZWRDYXJkLmNhdGVnb3J5IHx8IFtd' +
'KS5maWx0ZXIoYyA9PiBjICE9PSBjYXQpOwogICAgICAgIHJlZnJlc2hEcmF3ZXJDYXRlZ29yaWVzKCk7CiAgICAgICAgc2F2ZUNhcmRFZGl0cygpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZERyYXdlckNhdGVnb3J5RnJvbUlucHV0KCkgewogICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtZHJhd2VyLWNhdC1pbnB1dCcpOwogICAgICAgIGlmICghaW5wdXQpIHJldHVybjsKICAgICAgICBjb25zdCB2YWwgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKHZhbCkgewogICAgICAgICAgICBhZGREcmF3ZXJDYXRlZ29yeSh2YWwpOwogICAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZWZyZXNoRHJhd2VyQ2F0ZWdvcmllcygpIHsKICAgICAgICBjb25zdCBjYXJkID0gc3RhdGUuc2VsZWN0ZWRDYXJkOwogICAgICAgIGlmICghY2FyZCkgcmV0dXJuOwogICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBBcnJheS5pc0FycmF5KGNhcmQuY2F0ZWdvcnkpID8gY2FyZC5jYXRlZ29yeSA6IFtdOwogICAgICAgIGNvbnN0IGNoaXBzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1kcmF3ZXItY2F0LWNoaXBzJyk7CiAgICAgICAgaWYgKGNoaXBzRWwpIHsKICAgICAgICAgICAgY2hpcHNFbC5pbm5lckhUTUwgPSBjYXRlZ29yaWVzLm1hcChjYXQgPT4KICAgICAgICAgICAgICAgIGA8c3BhbiBjbGFzcz0iY29sbC1kcmF3ZXItY2F0LWNoaXAiPiR7ZXNjYXBlSHRtbChjYXQpfQogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtY2hpcC1yZW1vdmUiIG9uY2xpY2s9IkNvbGxlY3Rpb24ucmVtb3ZlRHJhd2VyQ2F0ZWdvcnkoJyR7ZXNjYXBlQXR0cihjYXQpfScpIj7DlzwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9zcGFuPmAKICAgICAgICAgICAgKS5qb2luKCcnKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVmcmVzaCBzdWdnZXN0aW9ucwogICAgICAgIGNvbnN0IHN1Z2dlc3RFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jb2xsLWNhdC1zdWdnZXN0aW9ucycpOwogICAgICAgIGlmIChzdWdnZXN0RWwpIHsKICAgICAgICAgICAgY29uc3QgY2F0U3VnZ2VzdGlvbnMgPSBDQVRFR09SWV9TVUdHRVNUSU9OUy5maWx0ZXIocyA9PiAhY2F0ZWdvcmllcy5pbmNsdWRlcyhzKSkubWFwKHMgPT4KICAgICAgICAgICAgICAgIGA8YnV0dG9uIGNsYXNzPSJjb2xsLWNhdC1zdWdnZXN0LWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5hZGREcmF3ZXJDYXRlZ29yeSgnJHtlc2NhcGVBdHRyKHMpfScpIj4ke2VzY2FwZUh0bWwocyl9PC9idXR0b24+YAogICAgICAgICAgICApLmpvaW4oJycpOwogICAgICAgICAgICBzdWdnZXN0RWwuaW5uZXJIVE1MID0gY2F0U3VnZ2VzdGlvbnM7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFkZERyYXdlclRhZ0Zyb21JbnB1dCgpIHsKICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWRyYXdlci10YWctaW5wdXQnKTsKICAgICAgICBpZiAoIWlucHV0IHx8ICFzdGF0ZS5zZWxlY3RlZENhcmQpIHJldHVybjsKICAgICAgICBjb25zdCB2YWwgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKCF2YWwpIHJldHVybjsKICAgICAgICBjb25zdCB0YWdzU3RyID0gc3RhdGUuc2VsZWN0ZWRDYXJkLnRhZ3MgfHwgJyc7CiAgICAgICAgY29uc3QgdGFncyA9IHRhZ3NTdHIuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOwogICAgICAgIGlmICghdGFncy5pbmNsdWRlcyh2YWwpKSB7CiAgICAgICAgICAgIHRhZ3MucHVzaCh2YWwpOwogICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZENhcmQudGFncyA9IHRhZ3Muam9pbignLCAnKTsKICAgICAgICAgICAgcmVmcmVzaERyYXdlclRhZ3MoKTsKICAgICAgICAgICAgc2F2ZUNhcmRFZGl0cygpOwogICAgICAgIH0KICAgICAgICBpbnB1dC52YWx1ZSA9ICcnOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZURyYXdlclRhZyh0YWcpIHsKICAgICAgICBpZiAoIXN0YXRlLnNlbGVjdGVkQ2FyZCkgcmV0dXJuOwogICAgICAgIGNvbnN0IHRhZ3NTdHIgPSBzdGF0ZS5zZWxlY3RlZENhcmQudGFncyB8fCAnJzsKICAgICAgICBjb25zdCB0YWdzID0gdGFnc1N0ci5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0ICYmIHQgIT09IHRhZyk7CiAgICAgICAg' +
'c3RhdGUuc2VsZWN0ZWRDYXJkLnRhZ3MgPSB0YWdzLmpvaW4oJywgJyk7CiAgICAgICAgcmVmcmVzaERyYXdlclRhZ3MoKTsKICAgICAgICBzYXZlQ2FyZEVkaXRzKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVmcmVzaERyYXdlclRhZ3MoKSB7CiAgICAgICAgY29uc3QgY2FyZCA9IHN0YXRlLnNlbGVjdGVkQ2FyZDsKICAgICAgICBpZiAoIWNhcmQpIHJldHVybjsKICAgICAgICBjb25zdCB0YWdzID0gKGNhcmQudGFncyB8fCAnJykuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOwogICAgICAgIGNvbnN0IHRhZ3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWRyYXdlci10YWdzJyk7CiAgICAgICAgaWYgKHRhZ3NFbCkgewogICAgICAgICAgICB0YWdzRWwuaW5uZXJIVE1MID0gdGFncy5tYXAodGFnID0+CiAgICAgICAgICAgICAgICBgPHNwYW4gY2xhc3M9ImNvbGwtZHJhd2VyLXRhZy1jaGlwIj4ke2VzY2FwZUh0bWwodGFnKX0KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWNoaXAtcmVtb3ZlIiBvbmNsaWNrPSJDb2xsZWN0aW9uLnJlbW92ZURyYXdlclRhZygnJHtlc2NhcGVBdHRyKHRhZyl9JykiPsOXPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L3NwYW4+YAogICAgICAgICAgICApLmpvaW4oJycpOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBzYXZlQ2FyZEVkaXRzKCkgewogICAgICAgIGlmICghc3RhdGUuc2VsZWN0ZWRDYXJkKSByZXR1cm47CiAgICAgICAgY29uc3QgY2FyZCA9IHN0YXRlLnNlbGVjdGVkQ2FyZDsKICAgICAgICBjb25zdCBub3Rlc0VsICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWRyYXdlci1ub3RlcycpOwogICAgICAgIGNvbnN0IGZpbmlzaEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtZHJhd2VyLWZpbmlzaCcpOwogICAgICAgIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtc2F2ZS1zdGF0dXMnKTsKCiAgICAgICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgICAgICAgY2F0ZWdvcnk6IGNhcmQuY2F0ZWdvcnkgfHwgW10sCiAgICAgICAgICAgIHRhZ3M6ICAgICBjYXJkLnRhZ3MgfHwgJycsCiAgICAgICAgICAgIG5vdGVzOiAgICBub3Rlc0VsPy52YWx1ZSAgPz8gY2FyZC5ub3RlcyA/PyAnJywKICAgICAgICAgICAgZmluaXNoOiAgIGZpbmlzaEVsPy52YWx1ZSA/PyBjYXJkLmZpbmlzaCA/PyAnTk9STUFMJywKICAgICAgICB9OwoKICAgICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJ1NhdmluZ+KApic7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHBhdGNoQ2FyZChjYXJkLmlkLCBwYXlsb2FkKTsKICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRDYXJkID0geyAuLi5jYXJkLCAuLi51cGRhdGVkIH07CiAgICAgICAgICAgIGlmIChzdGF0dXNFbCkgewogICAgICAgICAgICAgICAgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnU2F2ZWQg4pyTJzsKICAgICAgICAgICAgICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICdjb2xsLXNhdmUtc3RhdHVzIHNhdmVkJzsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpZiAoc3RhdHVzRWwpIHsgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ2NvbGwtc2F2ZS1zdGF0dXMnOyB9IH0sIDIwMDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlZnJlc2ggdGFibGUgcm93IGNhdGVnb3J5CiAgICAgICAgICAgIHJlZnJlc2hUYWJsZVJvdyhjYXJkLmlkKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgaWYgKHN0YXR1c0VsKSB7CiAgICAgICAgICAgICAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IGBFcnJvcjogJHtlcnIubWVzc2FnZX1gOwogICAgICAgICAgICAgICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ2NvbGwtc2F2ZS1zdGF0dXMgZXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZUNhdGVnb3J5KGNhcmRJZCwgY2F0ZWdvcmllcykgewogICAgICAgIGNvbnN0IGNhcmQgPSBzdGF0ZS5pdGVtcy5maW5kKGMgPT4gYy5pZCA9PT0gY2FyZElkKTsKICAgICAgICBpZiAoY2FyZCkgewogICAgICAgICAgICBjYXJkLmNhdGVnb3J5ID0gY2F0ZWdvcmllczsKICAgICAgICAgICAgcGF0Y2hDYXJkKGNhcmRJZCwgeyBjYXRlZ29y' +
'eTogY2F0ZWdvcmllcyB9KS5jYXRjaChlcnIgPT4KICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb2xsZWN0aW9uXSB1cGRhdGVDYXRlZ29yeSBlcnJvcjonLCBlcnIpCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJlZnJlc2hUYWJsZVJvdyhjYXJkSWQpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZWZyZXNoVGFibGVSb3coY2FyZElkKSB7CiAgICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmNvbGwtcm93W2RhdGEtaWQ9IiR7Y2FyZElkfSJdYCk7CiAgICAgICAgaWYgKCFyb3cpIHJldHVybjsKICAgICAgICBjb25zdCBjYXJkID0gc3RhdGUuaXRlbXMuZmluZChjID0+IGMuaWQgPT09IGNhcmRJZCk7CiAgICAgICAgaWYgKCFjYXJkICYmIHN0YXRlLnNlbGVjdGVkQ2FyZD8uaWQgPT09IGNhcmRJZCkgewogICAgICAgICAgICAvLyB1cGRhdGUgZnJvbSBkcmF3ZXIKICAgICAgICAgICAgY29uc3QgdXBkYXRlZCA9IHN0YXRlLnNlbGVjdGVkQ2FyZDsKICAgICAgICAgICAgY29uc3QgY2F0VGQgPSByb3cucXVlcnlTZWxlY3RvcignLmNvbGwtdGQtY2F0ZWdvcnknKTsKICAgICAgICAgICAgaWYgKGNhdFRkKSBjYXRUZC5pbm5lckhUTUwgPSByZW5kZXJDYXRlZ29yeUNoaXBzKHVwZGF0ZWQuY2F0ZWdvcnkgfHwgW10sIGNhcmRJZCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFjYXJkKSByZXR1cm47CiAgICAgICAgY29uc3QgY2F0VGQgPSByb3cucXVlcnlTZWxlY3RvcignLmNvbGwtdGQtY2F0ZWdvcnknKTsKICAgICAgICBpZiAoY2F0VGQpIGNhdFRkLmlubmVySFRNTCA9IHJlbmRlckNhdGVnb3J5Q2hpcHMoY2FyZC5jYXRlZ29yeSB8fCBbXSwgY2FyZElkKTsKICAgIH0KCiAgICAvLyDilIDilIAgQ2F0ZWdvcnkgUG9wb3ZlciAoaW5saW5lIHRhYmxlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBsZXQgcG9wb3ZlckNhcmRJZCA9IG51bGw7CgogICAgZnVuY3Rpb24gb3BlbkNhdGVnb3J5UG9wb3ZlcihjYXJkSWQsIGNoaXBFbCkgewogICAgICAgIHBvcG92ZXJDYXJkSWQgPSBjYXJkSWQ7CiAgICAgICAgY29uc3QgY2FyZCA9IHN0YXRlLml0ZW1zLmZpbmQoYyA9PiBjLmlkID09PSBjYXJkSWQpOwogICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBBcnJheS5pc0FycmF5KGNhcmQ/LmNhdGVnb3J5KSA/IFsuLi5jYXJkLmNhdGVnb3J5XSA6IFtdOwoKICAgICAgICBjb25zdCBwb3BvdmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtY2F0LXBvcG92ZXInKTsKICAgICAgICBpZiAoIXBvcG92ZXIpIHJldHVybjsKCiAgICAgICAgY29uc3QgY2hpcFJlY3QgPSBjaGlwRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgcG9wb3Zlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICBwb3BvdmVyLnN0eWxlLnRvcCAgPSAoY2hpcFJlY3QuYm90dG9tICsgd2luZG93LnNjcm9sbFkgKyA0KSArICdweCc7CiAgICAgICAgcG9wb3Zlci5zdHlsZS5sZWZ0ID0gKGNoaXBSZWN0LmxlZnQgICsgd2luZG93LnNjcm9sbFgpICAgICAgKyAncHgnOwoKICAgICAgICBjb25zdCBjYXRDaGlwcyA9IGNhdGVnb3JpZXMubWFwKGNhdCA9PgogICAgICAgICAgICBgPHNwYW4gY2xhc3M9ImNvbGwtcG9wb3Zlci1jaGlwIj4ke2VzY2FwZUh0bWwoY2F0KX0KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtY2hpcC1yZW1vdmUiIG9uY2xpY2s9IkNvbGxlY3Rpb24ucG9wb3ZlclJlbW92ZUNhdCgnJHtlc2NhcGVBdHRyKGNhdCl9JykiPsOXPC9idXR0b24+CiAgICAgICAgICAgIDwvc3Bhbj5gCiAgICAgICAgKS5qb2luKCcnKTsKCiAgICAgICAgY29uc3QgY2F0U3VnZ2VzdGlvbnMgPSBDQVRFR09SWV9TVUdHRVNUSU9OUy5maWx0ZXIocyA9PiAhY2F0ZWdvcmllcy5pbmNsdWRlcyhzKSkubWFwKHMgPT4KICAgICAgICAgICAgYDxidXR0b24gY2xhc3M9ImNvbGwtcG9wb3Zlci1zdWdnZXN0LWJ0biIgb25jbGljaz0iQ29sbGVjdGlvbi5wb3BvdmVyQWRkQ2F0KCcke2VzY2FwZUF0dHIocyl9JykiPiR7ZXNjYXBlSHRtbChzKX08L2J1dHRvbj5gCiAgICAgICAgKS5qb2luKCcnKTsKCiAgICAgICAgcG9wb3Zlci5pbm5lckhUTUwgPSBgCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1wb3BvdmVyLWhlYWRlciI+CiAgICAgICAgICAgIDxzcGFuPkVkaXQgQ2F0ZWdvcmllczwv' +
'c3Bhbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1wb3BvdmVyLWNsb3NlIiBvbmNsaWNrPSJDb2xsZWN0aW9uLmNsb3NlQ2F0ZWdvcnlQb3BvdmVyKCkiPuKclTwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtcG9wb3Zlci1jaGlwcyIgaWQ9ImNvbGwtcG9wb3Zlci1jaGlwcyI+JHtjYXRDaGlwc308L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXBvcG92ZXItc3VnZ2VzdGlvbnMiPiR7Y2F0U3VnZ2VzdGlvbnN9PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1wb3BvdmVyLWFkZC1yb3ciPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImNvbGwtcG9wb3Zlci1pbnB1dCIgY2xhc3M9ImNvbGwtY2F0LWlucHV0IiBwbGFjZWhvbGRlcj0iQ3VzdG9t4oCmIiBhdXRvY29tcGxldGU9Im9mZiIKICAgICAgICAgICAgICAgICAgIG9ua2V5ZG93bj0iaWYoZXZlbnQua2V5PT09J0VudGVyJyl7Q29sbGVjdGlvbi5wb3BvdmVyQWRkQ2F0RnJvbUlucHV0KCk7ZXZlbnQucHJldmVudERlZmF1bHQoKX0iIC8+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtY2F0LWFkZC1idG4iIG9uY2xpY2s9IkNvbGxlY3Rpb24ucG9wb3ZlckFkZENhdEZyb21JbnB1dCgpIj5BZGQ8L2J1dHRvbj4KICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsb3NlQ2F0ZWdvcnlQb3BvdmVyKCkgewogICAgICAgIGNvbnN0IHBvcG92ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1jYXQtcG9wb3ZlcicpOwogICAgICAgIGlmIChwb3BvdmVyKSBwb3BvdmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgcG9wb3ZlckNhcmRJZCA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wb3ZlckFkZENhdChjYXQpIHsKICAgICAgICBpZiAocG9wb3ZlckNhcmRJZCA9PSBudWxsKSByZXR1cm47CiAgICAgICAgY29uc3QgY2FyZCA9IHN0YXRlLml0ZW1zLmZpbmQoYyA9PiBjLmlkID09PSBwb3BvdmVyQ2FyZElkKTsKICAgICAgICBpZiAoIWNhcmQpIHJldHVybjsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2FyZC5jYXRlZ29yeSkpIGNhcmQuY2F0ZWdvcnkgPSBbXTsKICAgICAgICBpZiAoIWNhcmQuY2F0ZWdvcnkuaW5jbHVkZXMoY2F0KSkgewogICAgICAgICAgICBjYXJkLmNhdGVnb3J5LnB1c2goY2F0KTsKICAgICAgICAgICAgdXBkYXRlQ2F0ZWdvcnkocG9wb3ZlckNhcmRJZCwgY2FyZC5jYXRlZ29yeSk7CiAgICAgICAgICAgIG9wZW5DYXRlZ29yeVBvcG92ZXIocG9wb3ZlckNhcmRJZCwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmNvbGwtcm93W2RhdGEtaWQ9IiR7cG9wb3ZlckNhcmRJZH0iXSAuY29sbC1jYXQtY2hpcGApIHx8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWNhdC1wb3BvdmVyJykpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwb3BvdmVyUmVtb3ZlQ2F0KGNhdCkgewogICAgICAgIGlmIChwb3BvdmVyQ2FyZElkID09IG51bGwpIHJldHVybjsKICAgICAgICBjb25zdCBjYXJkID0gc3RhdGUuaXRlbXMuZmluZChjID0+IGMuaWQgPT09IHBvcG92ZXJDYXJkSWQpOwogICAgICAgIGlmICghY2FyZCkgcmV0dXJuOwogICAgICAgIGNhcmQuY2F0ZWdvcnkgPSAoY2FyZC5jYXRlZ29yeSB8fCBbXSkuZmlsdGVyKGMgPT4gYyAhPT0gY2F0KTsKICAgICAgICB1cGRhdGVDYXRlZ29yeShwb3BvdmVyQ2FyZElkLCBjYXJkLmNhdGVnb3J5KTsKICAgICAgICAvLyBSZS1yZW5kZXIgcG9wb3ZlciBjaGlwcwogICAgICAgIGNvbnN0IGNoaXBzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1wb3BvdmVyLWNoaXBzJyk7CiAgICAgICAgaWYgKGNoaXBzRWwpIHsKICAgICAgICAgICAgY2hpcHNFbC5pbm5lckhUTUwgPSBjYXJkLmNhdGVnb3J5Lm1hcChjID0+CiAgICAgICAgICAgICAgICBgPHNwYW4gY2xhc3M9ImNvbGwtcG9wb3Zlci1jaGlwIj4ke2VzY2FwZUh0bWwoYyl9CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1jaGlwLXJlbW92ZSIgb25jbGljaz0iQ29sbGVjdGlvbi5wb3BvdmVyUmVtb3ZlQ2F0KCcke2VzY2FwZUF0dHIoYyl9JykiPsOXPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L3NwYW4+YAogICAgICAgICAgICApLmpvaW4oJycpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwb3BvdmVyQWRkQ2F0RnJvbUlucHV0KCkgewogICAgICAgIGNvbnN0IGlucHV0ID0g' +
'ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtcG9wb3Zlci1pbnB1dCcpOwogICAgICAgIGlmICghaW5wdXQpIHJldHVybjsKICAgICAgICBjb25zdCB2YWwgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgaWYgKHZhbCkgewogICAgICAgICAgICBwb3BvdmVyQWRkQ2F0KHZhbCk7CiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBJbXBvcnQgRmxvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBvcGVuSW1wb3J0KCkgewogICAgICAgIHN0YXRlLmltcG9ydFN0ZXAgPSAxOwogICAgICAgIHN0YXRlLmltcG9ydFNvdXJjZSA9ICcnOwogICAgICAgIHN0YXRlLmltcG9ydENvbnRlbnQgPSAnJzsKICAgICAgICBzdGF0ZS5pbXBvcnRNYXBwaW5nID0ge307CiAgICAgICAgc3RhdGUuaW1wb3J0SGVhZGVycyA9IFtdOwogICAgICAgIHN0YXRlLmltcG9ydE1vZGUgPSAnTUVSR0UnOwogICAgICAgIHN0YXRlLmltcG9ydE1pc3NpbmdGaW5pc2hOb3JtYWwgPSB0cnVlOwogICAgICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtaW1wb3J0LW1vZGFsJyk7CiAgICAgICAgaWYgKG1vZGFsKSBtb2RhbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICByZW5kZXJJbXBvcnRTdGVwKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xvc2VJbXBvcnQoKSB7CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1pbXBvcnQtbW9kYWwnKTsKICAgICAgICBpZiAobW9kYWwpIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgICAgIHN0YXRlLmltcG9ydFN0ZXAgPSAwOwogICAgfQoKICAgIGZ1bmN0aW9uIGltcG9ydE5leHQoKSB7CiAgICAgICAgaWYgKHN0YXRlLmltcG9ydFN0ZXAgPT09IDEpIHsKICAgICAgICAgICAgaWYgKCFzdGF0ZS5pbXBvcnRTb3VyY2UpIHsKICAgICAgICAgICAgICAgIGFsZXJ0KCdQbGVhc2Ugc2VsZWN0IGEgc291cmNlIHR5cGUuJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUuaW1wb3J0U3RlcCA9IDI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbXBvcnRTdGVwID09PSAyKSB7CiAgICAgICAgICAgIGlmICghc3RhdGUuaW1wb3J0Q29udGVudC50cmltKCkpIHsKICAgICAgICAgICAgICAgIGFsZXJ0KCdQbGVhc2UgcHJvdmlkZSBpbXBvcnQgY29udGVudC4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUuaW1wb3J0U291cmNlICE9PSAnVEVYVCcpIHsKICAgICAgICAgICAgICAgIC8vIFBhcnNlIENTViBoZWFkZXJzCiAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IHN0YXRlLmltcG9ydENvbnRlbnQuc3BsaXQoJ1xuJyk7CiAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmltcG9ydEhlYWRlcnMgPSBwYXJzZUNTVkxpbmUobGluZXNbMF0pOwogICAgICAgICAgICAgICAgICAgIGJ1aWxkRGVmYXVsdE1hcHBpbmcoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLmltcG9ydFN0ZXAgPSAzOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0U3RlcCA9IDQ7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmltcG9ydFN0ZXAgPT09IDMpIHsKICAgICAgICAgICAgc3RhdGUuaW1wb3J0U3RlcCA9IDQ7CiAgICAgICAgfQogICAgICAgIHJlbmRlckltcG9ydFN0ZXAoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbXBvcnRQcmV2KCkgewogICAgICAgIGlmIChzdGF0ZS5pbXBvcnRTdGVwID4gMSkgewogICAgICAgICAgICBpZiAoc3RhdGUuaW1wb3J0U3RlcCA9PT0gNCAmJiBzdGF0ZS5pbXBvcnRTb3VyY2UgIT09ICdURVhUJykgewogICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0U3RlcCA9IDM7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaW1wb3J0U3RlcCA9PT0gNCAmJiBzdGF0ZS5pbXBvcnRTb3VyY2UgPT09ICdURVhUJykgewogICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0U3RlcCA9IDI7' +
'CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5pbXBvcnRTdGVwLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVuZGVySW1wb3J0U3RlcCgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZUNTVkxpbmUobGluZSkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICAgIGxldCBjdXIgPSAnJzsKICAgICAgICBsZXQgaW5RdW90ZSA9IGZhbHNlOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb25zdCBjaCA9IGxpbmVbaV07CiAgICAgICAgICAgIGlmIChjaCA9PT0gJyInKSB7CiAgICAgICAgICAgICAgICBpblF1b3RlID0gIWluUXVvdGU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICcsJyAmJiAhaW5RdW90ZSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY3VyLnRyaW0oKSk7CiAgICAgICAgICAgICAgICBjdXIgPSAnJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGN1ciArPSBjaDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXN1bHQucHVzaChjdXIudHJpbSgpKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdE1hcHBpbmcoKSB7CiAgICAgICAgY29uc3QgcHJlc2V0ID0gc3RhdGUuaW1wb3J0U291cmNlID09PSAnTU9YRklFTEQnICA/IE1PWEZJRUxEX0RFRkFVTFRTCiAgICAgICAgICAgICAgICAgICAgIDogc3RhdGUuaW1wb3J0U291cmNlID09PSAnQVJDSElERUtUJyA/IEFSQ0hJREVLVF9ERUZBVUxUUwogICAgICAgICAgICAgICAgICAgICA6IHt9OwogICAgICAgIHN0YXRlLmltcG9ydE1hcHBpbmcgPSB7fTsKICAgICAgICBzdGF0ZS5pbXBvcnRIZWFkZXJzLmZvckVhY2goaGVhZGVyID0+IHsKICAgICAgICAgICAgc3RhdGUuaW1wb3J0TWFwcGluZ1toZWFkZXJdID0gcHJlc2V0W2hlYWRlcl0gfHwgJ0lHTk9SRSc7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVySW1wb3J0U3RlcCgpIHsKICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtaW1wb3J0LWJvZHknKTsKICAgICAgICBpZiAoIWJvZHkpIHJldHVybjsKCiAgICAgICAgY29uc3Qgc3RlcExhYmVscyA9IFsnJywgJ1NvdXJjZScsICdDb250ZW50JywgJ01hcHBpbmcnLCAnT3B0aW9ucyddOwogICAgICAgIGNvbnN0IHN0ZXBzID0gWzEsMiwzLDRdLmZpbHRlcihuID0+ICEobiA9PT0gMyAmJiBzdGF0ZS5pbXBvcnRTb3VyY2UgPT09ICdURVhUJykpOwogICAgICAgIGNvbnN0IHN0ZXBJbmRpY2F0b3IgPSBzdGVwcy5tYXAobiA9PiB7CiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IG4gPT09IHN0YXRlLmltcG9ydFN0ZXAgPyAnIGFjdGl2ZScgOiAnJzsKICAgICAgICAgICAgY29uc3QgZG9uZSAgID0gbiA8IHN0YXRlLmltcG9ydFN0ZXAgICA/ICcgZG9uZScgICA6ICcnOwogICAgICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzPSJjb2xsLXN0ZXAtZG90JHthY3RpdmV9JHtkb25lfSI+JHtufTwvc3Bhbj5gOwogICAgICAgIH0pLmpvaW4oJzxzcGFuIGNsYXNzPSJjb2xsLXN0ZXAtc2VwIj7igJQ8L3NwYW4+Jyk7CgogICAgICAgIGxldCBjb250ZW50ID0gJyc7CiAgICAgICAgaWYgKHN0YXRlLmltcG9ydFN0ZXAgPT09IDEpIGNvbnRlbnQgPSByZW5kZXJJbXBvcnRTdGVwMSgpOwogICAgICAgIGlmIChzdGF0ZS5pbXBvcnRTdGVwID09PSAyKSBjb250ZW50ID0gcmVuZGVySW1wb3J0U3RlcDIoKTsKICAgICAgICBpZiAoc3RhdGUuaW1wb3J0U3RlcCA9PT0gMykgY29udGVudCA9IHJlbmRlckltcG9ydFN0ZXAzKCk7CiAgICAgICAgaWYgKHN0YXRlLmltcG9ydFN0ZXAgPT09IDQpIGNvbnRlbnQgPSByZW5kZXJJbXBvcnRTdGVwNCgpOwoKICAgICAgICBjb25zdCBzaG93UHJldiA9IHN0YXRlLmltcG9ydFN0ZXAgPiAxOwogICAgICAgIGNvbnN0IGlzTGFzdFN0ZXAgPSBzdGF0ZS5pbXBvcnRTdGVwID09PSA0OwoKICAgICAgICBib2R5LmlubmVySFRNTCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgIDxoMz5JbXBvcnQgQ2FyZHMg4oCUIFN0ZXAgJHtzdGF0ZS5pbXBvcnRTdGVwfTogJHtzdGVwTGFiZWxzW3N0YXRlLmltcG9ydFN0ZXBdfTwvaDM+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtbW9kYWwtY2xvc2UiIG9uY2xpY2s9IkNv' +
'bGxlY3Rpb24uY2xvc2VJbXBvcnQoKSI+4pyVPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1pbXBvcnQtc3RlcHMiPiR7c3RlcEluZGljYXRvcn08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWltcG9ydC1zdGVwLWNvbnRlbnQiPiR7Y29udGVudH08L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWltcG9ydC1mb290ZXIiPgogICAgICAgICAgICAke3Nob3dQcmV2ID8gYDxidXR0b24gY2xhc3M9ImNvbGwtYnRuLXNlY29uZGFyeSIgb25jbGljaz0iQ29sbGVjdGlvbi5pbXBvcnRQcmV2KCkiPuKGkCBCYWNrPC9idXR0b24+YCA6ICc8c3Bhbj48L3NwYW4+J30KICAgICAgICAgICAgJHtpc0xhc3RTdGVwCiAgICAgICAgICAgICAgICA/IGA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJDb2xsZWN0aW9uLnN1Ym1pdEltcG9ydCgpIj5JbXBvcnQ8L2J1dHRvbj5gCiAgICAgICAgICAgICAgICA6IGA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJDb2xsZWN0aW9uLmltcG9ydE5leHQoKSI+TmV4dCDihpI8L2J1dHRvbj5gfQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtaW1wb3J0LXN0YXR1cyIgaWQ9ImNvbGwtaW1wb3J0LXN0YXR1cyI+PC9kaXY+YDsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJJbXBvcnRTdGVwMSgpIHsKICAgICAgICBjb25zdCBzb3VyY2VzID0gWwogICAgICAgICAgICB7IHZhbHVlOiAnR0VORVJJQ19DU1YnLCBsYWJlbDogJ0dlbmVyaWMgQ1NWJywgIGRlc2M6ICdBbnkgQ1NWIHdpdGggY29sdW1uIG1hcHBpbmcnIH0sCiAgICAgICAgICAgIHsgdmFsdWU6ICdNT1hGSUVMRCcsICAgIGxhYmVsOiAnTW94ZmllbGQgQ1NWJywgZGVzYzogJ01veGZpZWxkIGV4cG9ydCBmb3JtYXQgKGF1dG8tbWFwcGVkKScgfSwKICAgICAgICAgICAgeyB2YWx1ZTogJ0FSQ0hJREVLVCcsICAgbGFiZWw6ICdBcmNoaWRla3QgQ1NWJyxkZXNjOiAnQXJjaGlkZWt0IGV4cG9ydCBmb3JtYXQgKGF1dG8tbWFwcGVkKScgfSwKICAgICAgICAgICAgeyB2YWx1ZTogJ1RFWFQnLCAgICAgICAgbGFiZWw6ICdQbGFpbiBUZXh0JywgICBkZXNjOiAnMSBDYXJkIE5hbWUgKFNFVCkgcGVyIGxpbmUnIH0sCiAgICAgICAgXTsKICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9ImNvbGwtc291cmNlLWxpc3QiPgogICAgICAgICAgICAke3NvdXJjZXMubWFwKHMgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY2hlY2tlZCA9IHN0YXRlLmltcG9ydFNvdXJjZSA9PT0gcy52YWx1ZSA/ICdjaGVja2VkJyA6ICcnOwogICAgICAgICAgICAgICAgcmV0dXJuIGA8bGFiZWwgY2xhc3M9ImNvbGwtc291cmNlLW9wdGlvbiAke3N0YXRlLmltcG9ydFNvdXJjZSA9PT0gcy52YWx1ZSA/ICdzZWxlY3RlZCcgOiAnJ30iPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iY29sbC1pbXBvcnQtc291cmNlIiB2YWx1ZT0iJHtzLnZhbHVlfSIgJHtjaGVja2VkfQogICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRJbXBvcnRTb3VyY2UoJyR7cy52YWx1ZX0nKSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zb3VyY2UtaW5mbyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLXNvdXJjZS1uYW1lIj4ke3MubGFiZWx9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1zb3VyY2UtZGVzYyI+JHtzLmRlc2N9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9sYWJlbD5gOwogICAgICAgICAgICB9KS5qb2luKCcnKX0KICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckltcG9ydFN0ZXAyKCkgewogICAgICAgIGlmIChzdGF0ZS5pbXBvcnRTb3VyY2UgPT09ICdURVhUJykgewogICAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9ImNvbGwtaW1wb3J0LXRleHRhcmVhLXdyYXAiPgogICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2xsLWZvcm0tbGFiZWwiPlBhc3RlIGNhcmQgbGlzdCAob25lIHBlciBsaW5lKTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJjb2xsLWltcG9ydC10ZXh0YXJlYSIgY2xhc3M9ImNvbGwtaW1wb3J0LXRleHRhcmVhIiByb3dzPSIxNCIKICAgICAgICAgICAgICAgICAgICBwbGFj' +
'ZWhvbGRlcj0iMyBTb2wgUmluZyAoQ01SKVxuMSBBcmNhbmUgU2lnbmV0XG4xIENvbW1hbmQgVG93ZXIgKE1IMykgMTIzIgogICAgICAgICAgICAgICAgICAgIG9uaW5wdXQ9IkNvbGxlY3Rpb24uc2V0SW1wb3J0Q29udGVudCh0aGlzLnZhbHVlKSI+JHtlc2NhcGVIdG1sKHN0YXRlLmltcG9ydENvbnRlbnQpfTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWltcG9ydC1oaW50Ij5Gb3JtYXRzOiA8Y29kZT4zIENhcmQgTmFtZSAoU0VUKTwvY29kZT4gwrcgPGNvZGU+MSBDYXJkIE5hbWUgKFNFVCkgMTIzPC9jb2RlPiDCtyA8Y29kZT5DYXJkIE5hbWU8L2NvZGU+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz0iY29sbC1pbXBvcnQtZmlsZS13cmFwIj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2xsLWZvcm0tbGFiZWwiPlVwbG9hZCBDU1YgZmlsZTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZpbGUtZHJvcC16b25lIiBpZD0iY29sbC1maWxlLWRyb3AiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImZpbGUiIGlkPSJjb2xsLWZpbGUtaW5wdXQiIGFjY2VwdD0iLmNzdix0ZXh0L2NzdiIKICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5oYW5kbGVGaWxlU2VsZWN0KHRoaXMuZmlsZXNbMF0pIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZmlsZS1kcm9wLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAke3N0YXRlLmltcG9ydENvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgPyBgPHNwYW4gY2xhc3M9ImNvbGwtZmlsZS1vayI+4pyTIEZpbGUgbG9hZGVkICgke3N0YXRlLmltcG9ydENvbnRlbnQuc3BsaXQoJ1xuJykubGVuZ3RofSBsaW5lcyk8L3NwYW4+YAogICAgICAgICAgICAgICAgICAgICAgICA6IGA8c3Bhbj5DbGljayB0byBzZWxlY3Qgb3IgZHJhZyAmYW1wOyBkcm9wIGEgQ1NWIGZpbGU8L3NwYW4+YH0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgJHtzdGF0ZS5pbXBvcnRDb250ZW50CiAgICAgICAgICAgICAgICA/IGA8ZGl2IGNsYXNzPSJjb2xsLWZpbGUtcHJldmlldyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1maWxlLXByZXZpZXctbGFiZWwiPlByZXZpZXcgKGZpcnN0IDMgbGluZXMpOjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxwcmUgY2xhc3M9ImNvbGwtZmlsZS1wcmV2aWV3LXRleHQiPiR7ZXNjYXBlSHRtbChzdGF0ZS5pbXBvcnRDb250ZW50LnNwbGl0KCdcbicpLnNsaWNlKDAsMykuam9pbignXG4nKSl9PC9wcmU+CiAgICAgICAgICAgICAgICAgICA8L2Rpdj5gCiAgICAgICAgICAgICAgICA6ICcnfQogICAgICAgIDwvZGl2PmA7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVySW1wb3J0U3RlcDMoKSB7CiAgICAgICAgaWYgKHN0YXRlLmltcG9ydEhlYWRlcnMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBgPHAgY2xhc3M9ImNvbGwtaW1wb3J0LXdhcm4iPk5vIGhlYWRlcnMgZGV0ZWN0ZWQuIFBsZWFzZSBnbyBiYWNrIGFuZCBjaGVjayB5b3VyIGZpbGUuPC9wPmA7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBmaWVsZE9wdHNIdG1sID0gRklFTERfT1BUSU9OUy5tYXAobyA9PgogICAgICAgICAgICBgPG9wdGlvbiB2YWx1ZT0iJHtvLnZhbHVlfSI+JHtvLmxhYmVsfTwvb3B0aW9uPmAKICAgICAgICApLmpvaW4oJycpOwoKICAgICAgICBjb25zdCByb3dzID0gc3RhdGUuaW1wb3J0SGVhZGVycy5tYXAoaGVhZGVyID0+IHsKICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbCA9IHN0YXRlLmltcG9ydE1hcHBpbmdbaGVhZGVyXSB8fCAnSUdOT1JFJzsKICAgICAgICAgICAgY29uc3Qgb3B0cyA9IEZJRUxEX09QVElPTlMubWFwKG8gPT4KICAgICAgICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPSIke28udmFsdWV9IiAke2N1cnJlbnRWYWwgPT09IG8udmFsdWUgPyAnc2VsZWN0ZWQnIDogJyd9PiR7by5sYWJlbH08L29wdGlvbj5gCiAgICAgICAgICAgICkuam9pbignJyk7CiAgICAgICAgICAgIHJldHVybiBgPHRyIGNsYXNzPSJjb2xsLW1hcHBpbmctcm93Ij4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29sbC1tYXBwaW5nLWhlYWRlciI+JHtlc2NhcGVIdG1sKGhlYWRlcil9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAg' +
'ICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJjb2xsLW1hcHBpbmctc2VsZWN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9IkNvbGxlY3Rpb24uc2V0SW1wb3J0TWFwcGluZygnJHtlc2NhcGVBdHRyKGhlYWRlcil9JywgdGhpcy52YWx1ZSkiPgogICAgICAgICAgICAgICAgICAgICAgICAke29wdHN9CiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPmA7CiAgICAgICAgfSkuam9pbignJyk7CgogICAgICAgIHJldHVybiBgCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1tYXBwaW5nLWhpbnQiPk1hcCBDU1YgY29sdW1ucyB0byBjb2xsZWN0aW9uIGZpZWxkcy4gUHJlLWZpbGxlZCBmb3IgJHtlc2NhcGVIdG1sKHN0YXRlLmltcG9ydFNvdXJjZSl9IGZvcm1hdC48L2Rpdj4KICAgICAgICA8dGFibGUgY2xhc3M9ImNvbGwtbWFwcGluZy10YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD48dHI+PHRoPkNTViBDb2x1bW48L3RoPjx0aD5NYXBzIFRvPC90aD48L3RyPjwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keT4ke3Jvd3N9PC90Ym9keT4KICAgICAgICA8L3RhYmxlPmA7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVySW1wb3J0U3RlcDQoKSB7CiAgICAgICAgcmV0dXJuIGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWltcG9ydC1vcHRpb25zIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1mb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZm9ybS1sYWJlbCI+SW1wb3J0IE1vZGU8L2Rpdj4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29sbC1yYWRpby1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJjb2xsLWltcG9ydC1tb2RlIiB2YWx1ZT0iTUVSR0UiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICR7c3RhdGUuaW1wb3J0TW9kZSA9PT0gJ01FUkdFJyA/ICdjaGVja2VkJyA6ICcnfQogICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRJbXBvcnRNb2RlKCdNRVJHRScpIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPk1lcmdlPC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLW1vZGUtZGVzYyI+QWRkIHRvIGV4aXN0aW5nIGNvbGxlY3Rpb24gKGluY3JlYXNlIHF1YW50aXR5IG9uIG1hdGNoKTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbGwtcmFkaW8tbGFiZWwiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iY29sbC1pbXBvcnQtbW9kZSIgdmFsdWU9IlJFUExBQ0UiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICR7c3RhdGUuaW1wb3J0TW9kZSA9PT0gJ1JFUExBQ0UnID8gJ2NoZWNrZWQnIDogJyd9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJDb2xsZWN0aW9uLnNldEltcG9ydE1vZGUoJ1JFUExBQ0UnKSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZz5SZXBsYWNlPC9zdHJvbmc+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsLW1vZGUtZGVzYyI+Q2xlYXIgY29sbGVjdGlvbiBmaXJzdCwgdGhlbiBpbXBvcnQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1mb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29sbC1jaGVjay1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iY29sbC1taXNzaW5nLWZpbmlzaC1ub3JtYWwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICR7c3RhdGUuaW1wb3J0TWlzc2luZ0ZpbmlzaE5vcm1hbCA/ICdjaGVja2VkJyA6ICcnfQogICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi5zZXRNaXNzaW5nRmluaXNoTm9ybWFsKHRoaXMuY2hlY2tlZCkiPgogICAgICAgICAgICAgICAgICAgIFRyZWF0IG1pc3NpbmcvdW5rbm93biBmaW5pc2ggYXMgTm9ybWFsCiAgICAgICAg' +
'ICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgJHtzdGF0ZS5pbXBvcnRNb2RlID09PSAnUkVQTEFDRScKICAgICAgICAgICAgICAgID8gYDxkaXYgY2xhc3M9ImNvbGwtaW1wb3J0LXdhcm4iPuKaoCBSZXBsYWNlIG1vZGUgd2lsbCA8c3Ryb25nPnBlcm1hbmVudGx5IGRlbGV0ZTwvc3Ryb25nPiB5b3VyIGV4aXN0aW5nIGNvbGxlY3Rpb24gYmVmb3JlIGltcG9ydGluZy48L2Rpdj5gCiAgICAgICAgICAgICAgICA6ICcnfQogICAgICAgIDwvZGl2PmA7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0SW1wb3J0U291cmNlKHNvdXJjZSkgewogICAgICAgIHN0YXRlLmltcG9ydFNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAvLyByZS1yZW5kZXIgc3RlcCAxIHRvIHVwZGF0ZSBzZWxlY3RlZCBzdGF0ZQogICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1pbXBvcnQtYm9keScpOwogICAgICAgIGlmIChib2R5KSByZW5kZXJJbXBvcnRTdGVwKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0SW1wb3J0Q29udGVudChjb250ZW50KSB7CiAgICAgICAgc3RhdGUuaW1wb3J0Q29udGVudCA9IGNvbnRlbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0SW1wb3J0TWFwcGluZyhoZWFkZXIsIGZpZWxkKSB7CiAgICAgICAgc3RhdGUuaW1wb3J0TWFwcGluZ1toZWFkZXJdID0gZmllbGQ7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0SW1wb3J0TW9kZShtb2RlKSB7CiAgICAgICAgc3RhdGUuaW1wb3J0TW9kZSA9IG1vZGU7CiAgICAgICAgcmVuZGVySW1wb3J0U3RlcCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldE1pc3NpbmdGaW5pc2hOb3JtYWwodmFsKSB7CiAgICAgICAgc3RhdGUuaW1wb3J0TWlzc2luZ0ZpbmlzaE5vcm1hbCA9IHZhbDsKICAgIH0KCiAgICBmdW5jdGlvbiBoYW5kbGVGaWxlU2VsZWN0KGZpbGUpIHsKICAgICAgICBpZiAoIWZpbGUpIHJldHVybjsKICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHsKICAgICAgICAgICAgc3RhdGUuaW1wb3J0Q29udGVudCA9IGUudGFyZ2V0LnJlc3VsdDsKICAgICAgICAgICAgcmVuZGVySW1wb3J0U3RlcCgpOwogICAgICAgIH07CiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoKSA9PiBhbGVydCgnRmFpbGVkIHRvIHJlYWQgZmlsZS4nKTsKICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBzdWJtaXRJbXBvcnQoKSB7CiAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1pbXBvcnQtc3RhdHVzJyk7CiAgICAgICAgaWYgKHN0YXR1c0VsKSBzdGF0dXNFbC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0iY29sbC1pbXBvcnQtcHJvZ3Jlc3MiPkltcG9ydGluZ+KApiA8ZGl2IGNsYXNzPSJjb2xsLXNwaW5uZXItaW5saW5lIj48L2Rpdj48L2Rpdj5gOwoKICAgICAgICBjb25zdCBwYXlsb2FkID0gewogICAgICAgICAgICBzb3VyY2U6ICBzdGF0ZS5pbXBvcnRTb3VyY2UsCiAgICAgICAgICAgIG1vZGU6ICAgIHN0YXRlLmltcG9ydE1vZGUsCiAgICAgICAgICAgIGNvbnRlbnQ6IHN0YXRlLmltcG9ydENvbnRlbnQsCiAgICAgICAgICAgIG1hcHBpbmc6IHN0YXRlLmltcG9ydE1hcHBpbmcgfHwge30sCiAgICAgICAgfTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9jb2xsZWN0aW9uL2ltcG9ydGAsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwoKICAgICAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgICAgIGxldCBtc2cgPSBkYXRhLmRldGFpbCB8fCBkYXRhLm1lc3NhZ2UgfHwgYEhUVFAgJHtyZXMuc3RhdHVzfWA7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1zZyA9PT0gJ29iamVjdCcpIG1zZyA9IEpTT04uc3RyaW5naWZ5KG1zZyk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgeyBpbXBvcnRl' +
'ZENvdW50ID0gMCwgdXBkYXRlZENvdW50ID0gMCwgZmFpbGVkQ291bnQgPSAwLCBlcnJvcnMgPSBbXSB9ID0gZGF0YTsKCiAgICAgICAgICAgIGxldCBodG1sID0gYDxkaXYgY2xhc3M9ImNvbGwtaW1wb3J0LXJlc3VsdCBzdWNjZXNzIj4KICAgICAgICAgICAgICAgIDxkaXY+4pyTIEltcG9ydCBjb21wbGV0ZTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdj4ke2ltcG9ydGVkQ291bnR9IGFkZGVkIMK3ICR7dXBkYXRlZENvdW50fSB1cGRhdGVkIMK3ICR7ZmFpbGVkQ291bnR9IGZhaWxlZDwvZGl2PgogICAgICAgICAgICA8L2Rpdj5gOwoKICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPSJjb2xsLWltcG9ydC1lcnJvcnMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtaW1wb3J0LWVycm9ycy1sYWJlbCI+RXJyb3JzICgke2Vycm9ycy5sZW5ndGh9KTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8dWw+JHtlcnJvcnMuc2xpY2UoMCwgMTApLm1hcChlID0+IGA8bGk+JHtlc2NhcGVIdG1sKGUpfTwvbGk+YCkuam9pbignJyl9PC91bD4KICAgICAgICAgICAgICAgICAgICAke2Vycm9ycy5sZW5ndGggPiAxMCA/IGA8ZGl2PuKApmFuZCAke2Vycm9ycy5sZW5ndGggLSAxMH0gbW9yZTwvZGl2PmAgOiAnJ30KICAgICAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9ImNvbGwtYnRuLXByaW1hcnkiIG9uY2xpY2s9IkNvbGxlY3Rpb24uY2xvc2VJbXBvcnQoKSI+Q2xvc2U8L2J1dHRvbj5gOwogICAgICAgICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLmlubmVySFRNTCA9IGh0bWw7CgogICAgICAgICAgICAvLyBIaWRlIGZvb3RlciBuYXYgYnV0dG9ucwogICAgICAgICAgICBjb25zdCBmb290ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sbC1pbXBvcnQtZm9vdGVyJyk7CiAgICAgICAgICAgIGlmIChmb290ZXIpIGZvb3Rlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwoKICAgICAgICAgICAgLy8gUmVmcmVzaCBjb2xsZWN0aW9uCiAgICAgICAgICAgIGF3YWl0IGZldGNoQ29sbGVjdGlvbigpOwoKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgaWYgKHN0YXR1c0VsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSAoZXJyICYmIGVyci5tZXNzYWdlKSA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7CiAgICAgICAgICAgICAgICBzdGF0dXNFbC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0iY29sbC1pbXBvcnQtcmVzdWx0IGVycm9yIj7inJcgSW1wb3J0IGZhaWxlZDogJHtlc2NhcGVIdG1sKG1zZyl9PC9kaXY+YDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgRXhwb3J0IEZsb3cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgZnVuY3Rpb24gb3BlbkV4cG9ydCgpIHsKICAgICAgICBzdGF0ZS5leHBvcnRPcGVuID0gdHJ1ZTsKICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWV4cG9ydC1tb2RhbCcpOwogICAgICAgIGlmIChtb2RhbCkgbW9kYWwuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgICAgICAgcmVuZGVyRXhwb3J0TW9kYWwoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZUV4cG9ydCgpIHsKICAgICAgICBzdGF0ZS5leHBvcnRPcGVuID0gZmFsc2U7CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1leHBvcnQtbW9kYWwnKTsKICAgICAgICBpZiAobW9kYWwpIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlckV4cG9ydE1vZGFsKCkgewogICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1leHBvcnQtYm9keScpOwogICAgICAgIGlmICghYm9keSkgcmV0dXJuOwogICAgICAgIGJvZHkuaW5uZXJIVE1MID0gYAogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtbW9kYWwtaGVhZGVyIj4KICAgICAgICAgICAgPGgzPkV4cG9ydCBDb2xsZWN0aW9uPC9oMz4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1tb2RhbC1jbG9zZSIg' +
'b25jbGljaz0iQ29sbGVjdGlvbi5jbG9zZUV4cG9ydCgpIj7inJU8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWV4cG9ydC1mb3JtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1mb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29sbC1mb3JtLWxhYmVsIj5FeHBvcnQgRm9ybWF0PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9ImNvbGwtZXhwb3J0LWZvcm1hdCIgY2xhc3M9ImNvbGwtZXhwb3J0LXNlbGVjdCI+CiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iSU5URVJOQUxfQ1NWIj5JbnRlcm5hbCBDU1YgKGFsbCBmaWVsZHMpPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTU9YRklFTERfQ1NWIj5Nb3hmaWVsZCBDU1Y8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJURVhUIj5QbGFpbiBUZXh0PC9vcHRpb24+CiAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbGwtY2hlY2stbGFiZWwiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImNvbGwtZXhwb3J0LWZpbHRlcmVkIj4KICAgICAgICAgICAgICAgICAgICBFeHBvcnQgZmlsdGVyZWQgcmVzdWx0cyBvbmx5ICgke3N0YXRlLnRvdGFsfSBtYXRjaGluZykKICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLWZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1leHBvcnQtaW5mbyI+VG90YWwgY29sbGVjdGlvbjogJHtzdGF0ZS50b3RhbH0gY2FyZHM8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1tb2RhbC1mb290ZXIiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1zZWNvbmRhcnkiIG9uY2xpY2s9IkNvbGxlY3Rpb24uY2xvc2VFeHBvcnQoKSI+Q2FuY2VsPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtYnRuLXByaW1hcnkiIG9uY2xpY2s9IkNvbGxlY3Rpb24uc3VibWl0RXhwb3J0KCkiPkRvd25sb2FkPC9idXR0b24+CiAgICAgICAgPC9kaXY+YDsKICAgIH0KCiAgICBmdW5jdGlvbiBzdWJtaXRFeHBvcnQoKSB7CiAgICAgICAgY29uc3QgZm9ybWF0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1leHBvcnQtZm9ybWF0Jyk7CiAgICAgICAgY29uc3QgZmlsdGVyZWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWV4cG9ydC1maWx0ZXJlZCcpOwogICAgICAgIGNvbnN0IGZvcm1hdCA9IGZvcm1hdEVsPy52YWx1ZSB8fCAnSU5URVJOQUxfQ1NWJzsKICAgICAgICBjb25zdCB1c2VGaWx0ZXJzID0gZmlsdGVyZWRFbD8uY2hlY2tlZCB8fCBmYWxzZTsKCiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIHBhcmFtcy5zZXQoJ2Zvcm1hdCcsIGZvcm1hdCk7CgogICAgICAgIGlmICh1c2VGaWx0ZXJzKSB7CiAgICAgICAgICAgIGNvbnN0IGYgPSBzdGF0ZS5maWx0ZXJzOwogICAgICAgICAgICBpZiAoc3RhdGUuc2VhcmNoKSBwYXJhbXMuc2V0KCdxJywgc3RhdGUuc2VhcmNoKTsKICAgICAgICAgICAgaWYgKGYuY29sb3JzLmxlbmd0aCkgICAgcGFyYW1zLnNldCgnY29sb3JzJywgICAgZi5jb2xvcnMuam9pbignLCcpKTsKICAgICAgICAgICAgaWYgKGYudHlwZXMubGVuZ3RoKSAgICAgcGFyYW1zLnNldCgndHlwZXMnLCAgICAgZi50eXBlcy5qb2luKCcsJykpOwogICAgICAgICAgICBpZiAoZi5maW5pc2gpICAgICAgICAgICBwYXJhbXMuc2V0KCdmaW5pc2gnLCAgICBmLmZpbmlzaCk7CiAgICAgICAgICAgIGlmIChmLmNhdGVnb3J5Lmxlbmd0aCkgIHBhcmFtcy5zZXQoJ2NhdGVnb3J5JywgIGYuY2F0ZWdvcnkuam9pbignLCcpKTsKICAgICAgICAgICAgaWYgKGYuaXNMZWdlbmRhcnkpICAgICAgcGFyYW1zLnNldCgnaXNMZWdlbmRhcnknLCAgICd0cnVlJyk7CiAgICAgICAgICAgIGlmIChmLmlzQmFzaWMpICAgICAgICAgIHBhcmFtcy5zZXQoJ2lzQmFzaWMnLCAgICAgICAgJ3RydWUnKTsKICAgICAgICAgICAgaWYgKGYuaXNHYW1lQ2hh' +
'bmdlcikgICAgcGFyYW1zLnNldCgnaXNHYW1lQ2hhbmdlcicsICAndHJ1ZScpOwogICAgICAgICAgICBpZiAoZi5oaWdoU2FsdCkgICAgICAgICBwYXJhbXMuc2V0KCdoaWdoU2FsdCcsICAgICAgICd0cnVlJyk7CiAgICAgICAgICAgIGlmIChmLmNtY01pbiAhPSBudWxsKSAgIHBhcmFtcy5zZXQoJ2NtY01pbicsICAgZi5jbWNNaW4pOwogICAgICAgICAgICBpZiAoZi5jbWNNYXggIT0gbnVsbCkgICBwYXJhbXMuc2V0KCdjbWNNYXgnLCAgIGYuY21jTWF4KTsKICAgICAgICAgICAgaWYgKGYucHJpY2VNaW4gIT0gbnVsbCkgcGFyYW1zLnNldCgncHJpY2VNaW4nLCBmLnByaWNlTWluKTsKICAgICAgICAgICAgaWYgKGYucHJpY2VNYXggIT0gbnVsbCkgcGFyYW1zLnNldCgncHJpY2VNYXgnLCBmLnByaWNlTWF4KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFfS9hcGkvY29sbGVjdGlvbi9leHBvcnQ/JHtwYXJhbXMudG9TdHJpbmcoKX1gOwogICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgYS5ocmVmID0gdXJsOwogICAgICAgIGEuZG93bmxvYWQgPSBgY29sbGVjdGlvbl8ke2Zvcm1hdC50b0xvd2VyQ2FzZSgpfV8ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLDEwKX0uJHtmb3JtYXQgPT09ICdURVhUJyA/ICd0eHQnIDogJ2Nzdid9YDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgICAgIGEuY2xpY2soKTsKICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwoKICAgICAgICBjbG9zZUV4cG9ydCgpOwogICAgfQoKICAgIC8vIOKUgOKUgCBSZS1lbnJpY2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gcmVFbnJpY2goKSB7CiAgICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvbGwtcmVlbnJpY2gtYnRuJyk7CiAgICAgICAgaWYgKCFidG4pIHJldHVybjsKICAgICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidG4udGV4dENvbnRlbnQ7CiAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnUmVmcmVzaGluZy4uLic7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvY29sbGVjdGlvbi9yZS1lbnJpY2hgLCB7IG1ldGhvZDogJ1BPU1QnIH0pOwogICAgICAgICAgICBpZiAoIXJlcy5vaykgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c31gKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBSZWZyZXNoZWQgJHtkYXRhLmVucmljaGVkQ291bnR9IG9mICR7ZGF0YS50b3RhbH0gY2FyZHNgCiAgICAgICAgICAgICAgICArIChkYXRhLnNraXBwZWRDb3VudCA+IDAgPyBgICgke2RhdGEuc2tpcHBlZENvdW50fSBza2lwcGVkKWAgOiAnJyk7CiAgICAgICAgICAgIGFsZXJ0KG1zZyk7CiAgICAgICAgICAgIGZldGNoQ29sbGVjdGlvbigpOyAvLyByZWxvYWQgdGFibGUKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgYWxlcnQoYFJlLWVucmljaCBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIEF1dG8tQ2xhc3NpZnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACgogICAgYXN5bmMgZnVuY3Rpb24gYXV0b0NsYXNzaWZ5KGZvcmNlQWxsID0gZmFsc2UpIHsKICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY29sbC1hdXRvY2xhc3NpZnktYnRuJyk7CiAgICAgICAgaWYgKCFidG4pIHJldHVybjsKICAgICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidG4udGV4dENvbnRlbnQ7CiAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAg' +
'ICAgICBidG4udGV4dENvbnRlbnQgPSAnQ2xhc3NpZnlpbmcuLi4nOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IGZvcmNlQWxsCiAgICAgICAgICAgICAgICA/IGAke0FQSV9CQVNFfS9hcGkvY29sbGVjdGlvbi9hdXRvLWNsYXNzaWZ5LWFsbGAKICAgICAgICAgICAgICAgIDogYCR7QVBJX0JBU0V9L2FwaS9jb2xsZWN0aW9uL2F1dG8tY2xhc3NpZnlgOwogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChlbmRwb2ludCwgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICAgICAgICAgICAgaWYgKCFyZXMub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBjb25zdCBtc2cgPSBgQ2xhc3NpZmllZCAke2RhdGEuY2xhc3NpZmllZENvdW50fSBvZiAke2RhdGEudG90YWx9IGNhcmRzYAogICAgICAgICAgICAgICAgKyAoZGF0YS5za2lwcGVkQ291bnQgPiAwID8gYCAoJHtkYXRhLnNraXBwZWRDb3VudH0gYWxyZWFkeSBoYWQgY2F0ZWdvcmllcylgIDogJycpOwogICAgICAgICAgICBhbGVydChtc2cpOwogICAgICAgICAgICBmZXRjaENvbGxlY3Rpb24oKTsgLy8gcmVsb2FkIHRhYmxlCiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGFsZXJ0KGBBdXRvLWNsYXNzaWZ5IGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0OwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCiAgICBmdW5jdGlvbiBnb0JhY2soKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnL2luZGV4Lmh0bWwnOwogICAgfQoKICAgIC8vIOKUgOKUgCBFdmVudCBCaW5kaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7CiAgICAgICAgLy8gU2VhcmNoIGlucHV0IHdpdGggZGVib3VuY2UKICAgICAgICBjb25zdCBzZWFyY2hFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLXNlYXJjaCcpOwogICAgICAgIGlmIChzZWFyY2hFbCkgewogICAgICAgICAgICBzZWFyY2hFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGUgPT4gewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaERlYm91bmNlVGltZXIpOwogICAgICAgICAgICAgICAgc2VhcmNoRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlYXJjaCA9IGUudGFyZ2V0LnZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wYWdlID0gMTsKICAgICAgICAgICAgICAgICAgICBwdXNoVXJsU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICBmZXRjaENvbGxlY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0sIERFQk9VTkNFX01TKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHNlYXJjaEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsKICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsKICAgICAgICAgICAgICAgICAgICBzZWFyY2hFbC52YWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlYXJjaCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHN0YXRlLnBhZ2UgPSAxOwogICAgICAgICAgICAgICAgICAgIHB1c2hVcmxTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIGZldGNoQ29sbGVjdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIENsb3NlIGRyYXdlciBvbiBFc2NhcGUKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7CiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5k' +
'cmF3ZXJPcGVuKSBjbG9zZURyYXdlcigpOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmltcG9ydFN0ZXAgPiAwKSBjbG9zZUltcG9ydCgpOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlLmV4cG9ydE9wZW4pIGNsb3NlRXhwb3J0KCk7CiAgICAgICAgICAgICAgICBjbG9zZUNhdGVnb3J5UG9wb3ZlcigpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIENsb3NlIHBvcG92ZXIgb24gb3V0c2lkZSBjbGljawogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBvcG92ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1jYXQtcG9wb3ZlcicpOwogICAgICAgICAgICBpZiAocG9wb3ZlciAmJiBwb3BvdmVyLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykgewogICAgICAgICAgICAgICAgaWYgKCFwb3BvdmVyLmNvbnRhaW5zKGUudGFyZ2V0KSAmJiAhZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjb2xsLWNhdC1jaGlwJykpIHsKICAgICAgICAgICAgICAgICAgICBjbG9zZUNhdGVnb3J5UG9wb3ZlcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENsb3NlIHNldC9rZXl3b3JkIGRyb3Bkb3ducyBvbiBvdXRzaWRlIGNsaWNrCiAgICAgICAgICAgIGNvbnN0IHNldEREID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtc2V0LWRyb3Bkb3duJyk7CiAgICAgICAgICAgIGNvbnN0IHNldElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtc2V0LWlucHV0Jyk7CiAgICAgICAgICAgIGlmIChzZXRERCAmJiBzZXRERC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgIXNldERELmNvbnRhaW5zKGUudGFyZ2V0KSAmJiBlLnRhcmdldCAhPT0gc2V0SW5wdXQpIHsKICAgICAgICAgICAgICAgIHNldERELmlubmVySFRNTCA9ICcnOyBzZXRERC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGt3REQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1rdy1kcm9wZG93bicpOwogICAgICAgICAgICBjb25zdCBrd0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwta3ctaW5wdXQnKTsKICAgICAgICAgICAgaWYgKGt3REQgJiYga3dERC5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgIWt3REQuY29udGFpbnMoZS50YXJnZXQpICYmIGUudGFyZ2V0ICE9PSBrd0lucHV0KSB7CiAgICAgICAgICAgICAgICBrd0RELmlubmVySFRNTCA9ICcnOyBrd0RELnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gRmlsZSBkcm9wIHpvbmUKICAgICAgICBjb25zdCBkcm9wWm9uZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLWZpbGUtZHJvcCcpOwogICAgICAgIGlmIChkcm9wWm9uZSkgewogICAgICAgICAgICBkcm9wWm9uZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIGUgPT4gewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZHJvcFpvbmUuY2xhc3NMaXN0LmFkZCgnZHJhZy1vdmVyJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkcm9wWm9uZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnbGVhdmUnLCAoKSA9PiBkcm9wWm9uZS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKSk7CiAgICAgICAgICAgIGRyb3Bab25lLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBlID0+IHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGRyb3Bab25lLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctb3ZlcicpOwogICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzWzBdOwogICAgICAgICAgICAgICAgaWYgKGZpbGUpIGhhbmRsZUZpbGVTZWxlY3QoZmlsZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgQ2FyZCBTY2FubmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKICAgIGxldCBzY2FuU3RhdGUgPSB7CiAgICAgICAgZmlsZTogbnVsbCwKICAgICAgICBwcmV2aWV3VXJsOiBudWxsLAogICAgICAgIG1vZGU6ICdzaW5nbGUn' +
'LAogICAgICAgIHNjYW5uaW5nOiBmYWxzZSwKICAgICAgICByZXN1bHRzOiBbXSwgICAgICAvLyBTY2FuUmVzdWx0IGRpY3RzIGZyb20gQVBJCiAgICAgICAgc2VsZWN0ZWQ6IG5ldyBTZXQoKSwgIC8vIGluZGljZXMgb2YgcmVzdWx0cyBzZWxlY3RlZCBmb3IgYWRkCiAgICB9OwoKICAgIGZ1bmN0aW9uIG9wZW5TY2FuKCkgewogICAgICAgIHNjYW5TdGF0ZSA9IHsgZmlsZTogbnVsbCwgcHJldmlld1VybDogbnVsbCwgbW9kZTogJ3NpbmdsZScsCiAgICAgICAgICAgICAgICAgICAgICBzY2FubmluZzogZmFsc2UsIHJlc3VsdHM6IFtdLCBzZWxlY3RlZDogbmV3IFNldCgpLAogICAgICAgICAgICAgICAgICAgICAgbWFudWFsQ2FyZHM6IFtdIH07CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1zY2FuLW1vZGFsJyk7CiAgICAgICAgaWYgKG1vZGFsKSBtb2RhbC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgICAgICByZW5kZXJTY2FuTW9kYWwoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbG9zZVNjYW4oKSB7CiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1zY2FuLW1vZGFsJyk7CiAgICAgICAgaWYgKG1vZGFsKSBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKICAgICAgICAvLyBSZXZva2Ugb2JqZWN0IFVSTCB0byBmcmVlIG1lbW9yeQogICAgICAgIGlmIChzY2FuU3RhdGUucHJldmlld1VybCkgewogICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHNjYW5TdGF0ZS5wcmV2aWV3VXJsKTsKICAgICAgICAgICAgc2NhblN0YXRlLnByZXZpZXdVcmwgPSBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJTY2FuTW9kYWwoKSB7CiAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2xsLXNjYW4tYm9keScpOwogICAgICAgIGlmICghYm9keSkgcmV0dXJuOwoKICAgICAgICBjb25zdCBoYXNSZXN1bHRzID0gc2NhblN0YXRlLnJlc3VsdHMubGVuZ3RoID4gMDsKICAgICAgICBjb25zdCBoYXNGaWxlID0gc2NhblN0YXRlLmZpbGUgIT09IG51bGw7CgogICAgICAgIGxldCBjb250ZW50ID0gJyc7CgogICAgICAgIGlmIChoYXNSZXN1bHRzKSB7CiAgICAgICAgICAgIGNvbnRlbnQgPSByZW5kZXJTY2FuUmVzdWx0cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnRlbnQgPSByZW5kZXJTY2FuVXBsb2FkKCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LmlubmVySFRNTCA9IGAKICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLW1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgIDxoMj5TY2FuIGZyb20gSW1hZ2U8L2gyPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLW1vZGFsLWNsb3NlIiBvbmNsaWNrPSJDb2xsZWN0aW9uLmNsb3NlU2NhbigpIj5cdTI3MTU8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tY29udGVudCI+JHtjb250ZW50fTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1zdGF0dXMiIGlkPSJjb2xsLXNjYW4tc3RhdHVzIj48L2Rpdj5gOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbmRlclNjYW5VcGxvYWQoKSB7CiAgICAgICAgY29uc3QgcHJldmlldyA9IHNjYW5TdGF0ZS5wcmV2aWV3VXJsCiAgICAgICAgICAgID8gJzxpbWcgY2xhc3M9ImNvbGwtc2Nhbi1wcmV2aWV3LWltZyIgc3JjPSInICsgZXNjYXBlQXR0cihzY2FuU3RhdGUucHJldmlld1VybCkgKyAnIiBhbHQ9IlByZXZpZXciIC8+JwogICAgICAgICAgICA6ICcnOwoKICAgICAgICBjb25zdCBzaW5nbGVDaGsgPSBzY2FuU3RhdGUubW9kZSA9PT0gJ3NpbmdsZScgPyAnY2hlY2tlZCcgOiAnJzsKICAgICAgICBjb25zdCBtdWx0aUNoayAgPSBzY2FuU3RhdGUubW9kZSA9PT0gJ211bHRpJyAgPyAnY2hlY2tlZCcgOiAnJzsKICAgICAgICBjb25zdCBzY2FuRGlzYWJsZWQgPSBzY2FuU3RhdGUuZmlsZSA/ICcnIDogJ2Rpc2FibGVkJzsKICAgICAgICBjb25zdCBzY2FubmluZ0NscyA9IHNjYW5TdGF0ZS5zY2FubmluZyA/ICcgc2Nhbm5pbmcnIDogJyc7CgogICAgICAgIHJldHVybiBgCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zY2FuLXVwbG9hZC1hcmVhIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zY2FuLWRyb3B6b25lIiBpZD0iY29sbC1zY2FuLWRyb3B6b25lIj4KICAgICAgICAgICAgICAgICR7cHJldmlldyB8fCAnPGRp' +
'diBjbGFzcz0iY29sbC1zY2FuLWRyb3B6b25lLXRleHQiPkRyb3AgY2FyZCBpbWFnZSBoZXJlIG9yIGNsaWNrIHRvIGJyb3dzZTwvZGl2Pid9CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImNvbGwtc2Nhbi1maWxlIiBhY2NlcHQ9ImltYWdlLyoiCiAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9IkNvbGxlY3Rpb24uaGFuZGxlU2NhbkZpbGUodGhpcykiIHN0eWxlPSJkaXNwbGF5Om5vbmUiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tb3B0aW9ucyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tbW9kZSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2xsLXJhZGlvLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJzY2FuLW1vZGUiIHZhbHVlPSJzaW5nbGUiICR7c2luZ2xlQ2hrfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jaGFuZ2U9IkNvbGxlY3Rpb24uc2V0U2Nhbk1vZGUoJ3NpbmdsZScpIiAvPgogICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGUgY2FyZAogICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb2xsLXJhZGlvLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJzY2FuLW1vZGUiIHZhbHVlPSJtdWx0aSIgJHttdWx0aUNoa30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2hhbmdlPSJDb2xsZWN0aW9uLnNldFNjYW5Nb2RlKCdtdWx0aScpIiAvPgogICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBjYXJkcwogICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1oaW50Ij4KICAgICAgICAgICAgICAgICAgICBTaW5nbGU6IG9uZSBjYXJkIHBlciBwaG90by4gTXVsdGk6IGRldGVjdHMgbXVsdGlwbGUgY2FyZHMgaW4gb25lIGltYWdlLgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1mb290ZXIiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1zZWNvbmRhcnkiIG9uY2xpY2s9IkNvbGxlY3Rpb24uY2xvc2VTY2FuKCkiPkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1wcmltYXJ5JHtzY2FubmluZ0Nsc30iICR7c2NhbkRpc2FibGVkfQogICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IkNvbGxlY3Rpb24uc3VibWl0U2NhbigpIj4KICAgICAgICAgICAgICAgICR7c2NhblN0YXRlLnNjYW5uaW5nID8gJzxzcGFuIGNsYXNzPSJjb2xsLXNwaW5uZXItaW5saW5lIj48L3NwYW4+IFNjYW5uaW5nLi4uJyA6ICdTY2FuIEltYWdlJ30KICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgPC9kaXY+YDsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJTY2FuUmVzdWx0cygpIHsKICAgICAgICBjb25zdCByZXN1bHRzID0gc2NhblN0YXRlLnJlc3VsdHM7CiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IHNjYW5TdGF0ZS5zZWxlY3RlZC5zaXplOwogICAgICAgIGNvbnN0IG1hbnVhbENvdW50ID0gc2NhblN0YXRlLm1hbnVhbENhcmRzID8gc2NhblN0YXRlLm1hbnVhbENhcmRzLmxlbmd0aCA6IDA7CiAgICAgICAgY29uc3QgdG90YWxBZGQgPSBzZWxlY3RlZENvdW50ICsgbWFudWFsQ291bnQ7CgogICAgICAgIGNvbnN0IHJvd3MgPSByZXN1bHRzLm1hcCgociwgaSkgPT4gewogICAgICAgICAgICBjb25zdCBjaGVja2VkID0gc2NhblN0YXRlLnNlbGVjdGVkLmhhcyhpKSA/ICdjaGVja2VkJyA6ICcnOwogICAgICAgICAgICBjb25zdCBjb25mQ2xzID0gJ2NvbGwtc2Nhbi1jb25mLScgKyAoci5jb25maWRlbmNlIHx8ICdsb3cnKTsKICAgICAgICAgICAgY29uc3QgY29uZkxhYmVsID0gKHIuY29uZmlkZW5jZSB8fCAnbG93JykuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyAoci5jb25maWRlbmNlIHx8ICdsb3cnKS5zbGljZSgxKTsKCiAgICAgICAgICAgIGlmIChyLmVycm9yICYmICFyLm1hdGNoZWRfbmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LXJvdyBjb2xsLXNj' +
'YW4tZXJyb3IiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHQtZXJyLXdyYXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1zY2FuLXJlc3VsdC1lcnIiPiR7ZXNjYXBlSHRtbChyLmVycm9yKX08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1tYW51YWwtcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iY29sbC1zY2FuLW1hbnVhbC1pbnB1dCIgZGF0YS1lcnItaWR4PSIke2l9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJUeXBlIGNhcmQgbmFtZS4uLiIgYXV0b2NvbXBsZXRlPSJvZmYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25rZXlkb3duPSJpZihldmVudC5rZXk9PT0nRW50ZXInKUNvbGxlY3Rpb24uc2Nhbk1hbnVhbExvb2t1cCgke2l9KSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtYnRuLXNtIiBvbmNsaWNrPSJDb2xsZWN0aW9uLnNjYW5NYW51YWxMb29rdXAoJHtpfSkiPkxvb2sgdXA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBpbWdIdG1sID0gci5pbWFnZV91cmkKICAgICAgICAgICAgICAgID8gJzxpbWcgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHQtaW1nIiBzcmM9IicgKyBlc2NhcGVBdHRyKHIuaW1hZ2VfdXJpKSArICciIGFsdD0iJyArIGVzY2FwZUF0dHIoci5tYXRjaGVkX25hbWUpICsgJyIgLz4nCiAgICAgICAgICAgICAgICA6ICc8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LWltZy1wbGFjZWhvbGRlciI+Tm8gaW1hZ2U8L2Rpdj4nOwoKICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LXJvdyI+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHQtY2hlY2siPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgJHtjaGVja2VkfQogICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNoYW5nZT0iQ29sbGVjdGlvbi50b2dnbGVTY2FuUmVzdWx0KCR7aX0pIiAvPgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICR7aW1nSHRtbH0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHQtaW5mbyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zY2FuLXJlc3VsdC1uYW1lIj4ke2VzY2FwZUh0bWwoci5tYXRjaGVkX25hbWUgfHwgci5yYXdfb2NyKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LW1ldGEiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iJHtjb25mQ2xzfSI+JHtjb25mTGFiZWx9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAke3Iuc2V0X2NvZGUgPyAnICZtaWRkb3Q7ICcgKyBlc2NhcGVIdG1sKHIuc2V0X2NvZGUudG9VcHBlckNhc2UoKSkgOiAnJ30KICAgICAgICAgICAgICAgICAgICAgICAgJHtyLmNvbGxlY3Rvcl9udW1iZXIgPyAnICMnICsgZXNjYXBlSHRtbChyLmNvbGxlY3Rvcl9udW1iZXIpIDogJyd9CiAgICAgICAgICAgICAgICAgICAgICAgICR7ci5yYXJpdHkgPyAnICZtaWRkb3Q7ICcgKyBlc2NhcGVIdG1sKHIucmFyaXR5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgci5yYXJpdHkuc2xpY2UoMSkpIDogJyd9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHQtcXR5Ij4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+UXR5PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjEiIHZhbHVlPSIxIiBjbGFzcz0iY29sbC1zY2FuLXF0eS1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1zY2FuLWlkeD0iJHtpfSIgLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj5gOwogICAgICAgIH0pLmpvaW4oJycpOwoKICAgICAgICAvLyBNYW51YWwgY2FyZHMgYWRkZWQgdmlhIG5hbWUg' +
'bG9va3VwCiAgICAgICAgY29uc3QgbWFudWFsUm93cyA9IChzY2FuU3RhdGUubWFudWFsQ2FyZHMgfHwgW10pLm1hcCgobWMsIG1pKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz0iY29sbC1zY2FuLXJlc3VsdC1yb3cgY29sbC1zY2FuLW1hbnVhbC1hZGRlZCI+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHQtY2hlY2siPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2hlY2tlZCBkaXNhYmxlZCAvPgogICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICR7bWMuaW1hZ2VfdXJpCiAgICAgICAgICAgICAgICAgICAgPyAnPGltZyBjbGFzcz0iY29sbC1zY2FuLXJlc3VsdC1pbWciIHNyYz0iJyArIGVzY2FwZUF0dHIobWMuaW1hZ2VfdXJpKSArICciIGFsdD0iJyArIGVzY2FwZUF0dHIobWMubmFtZSkgKyAnIiAvPicKICAgICAgICAgICAgICAgICAgICA6ICc8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LWltZy1wbGFjZWhvbGRlciI+Tm8gaW1hZ2U8L2Rpdj4nfQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zY2FuLXJlc3VsdC1pbmZvIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LW5hbWUiPiR7ZXNjYXBlSHRtbChtYy5uYW1lKX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LW1ldGEiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sbC1zY2FuLWNvbmYtaGlnaCI+TWFudWFsPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAke21jLnNldF9jb2RlID8gJyAmbWlkZG90OyAnICsgZXNjYXBlSHRtbChtYy5zZXRfY29kZS50b1VwcGVyQ2FzZSgpKSA6ICcnfQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tcmVzdWx0LXF0eSI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlF0eTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgbWluPSIxIiB2YWx1ZT0iMSIgY2xhc3M9ImNvbGwtc2Nhbi1tYW51YWwtcXR5IgogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1hbnVhbC1pZHg9IiR7bWl9IiAvPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1zbSBjb2xsLXNjYW4tcmVtb3ZlLW1hbnVhbCIgb25jbGljaz0iQ29sbGVjdGlvbi5zY2FuUmVtb3ZlTWFudWFsKCR7bWl9KSIKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IlJlbW92ZSI+XHUyNzE1PC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PmA7CiAgICAgICAgfSkuam9pbignJyk7CgogICAgICAgIHJldHVybiBgCiAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zY2FuLXJlc3VsdHMtd3JhcCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHRzLWhlYWRlciI+CiAgICAgICAgICAgICAgICA8c3Bhbj4ke3Jlc3VsdHMubGVuZ3RofSBjYXJkJHtyZXN1bHRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfSBkZXRlY3RlZDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImNvbGwtYnRuLWxpbmsiIG9uY2xpY2s9IkNvbGxlY3Rpb24uc2NhblNlbGVjdEFsbCgpIj5TZWxlY3QgQWxsPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1saW5rIiBvbmNsaWNrPSJDb2xsZWN0aW9uLnNjYW5EZXNlbGVjdEFsbCgpIj5EZXNlbGVjdCBBbGw8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1yZXN1bHRzLWxpc3QiPgogICAgICAgICAgICAgICAgJHtyb3dzfQogICAgICAgICAgICAgICAgJHttYW51YWxSb3dzfQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sbC1zY2FuLW1hbnVhbC1hZGQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJjb2xsLXNjYW4tbWFudWFsLW5hbWUiIGNsYXNzPSJjb2xsLXNjYW4tbWFudWFsLWlucHV0IGNvbGwtc2Nhbi1tYW51YWwtaW5wdXQtYm90dG9tIgogICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJBZGQgY2FyZCBieSBuYW1lLi4uIiBhdXRvY29tcGxldGU9Im9mZiIKICAgICAgICAgICAg' +
'ICAgICAgICAgICBvbmtleWRvd249ImlmKGV2ZW50LmtleT09PSdFbnRlcicpQ29sbGVjdGlvbi5zY2FuTWFudWFsQWRkKCkiIC8+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1zbSIgb25jbGljaz0iQ29sbGVjdGlvbi5zY2FuTWFudWFsQWRkKCkiPkFkZDwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tZm9vdGVyIj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iY29sbC1idG4tc2Vjb25kYXJ5IiBvbmNsaWNrPSJDb2xsZWN0aW9uLnNjYW5CYWNrKCkiPlNjYW4gQW5vdGhlcjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjb2xsLWJ0bi1wcmltYXJ5IiAke3RvdGFsQWRkID09PSAwID8gJ2Rpc2FibGVkJyA6ICcnfQogICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9IkNvbGxlY3Rpb24uc3VibWl0U2NhbkFkZCgpIj4KICAgICAgICAgICAgICAgIEFkZCAke3RvdGFsQWRkfSBDYXJkJHt0b3RhbEFkZCAhPT0gMSA/ICdzJyA6ICcnfSB0byBDb2xsZWN0aW9uCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PmA7CiAgICB9CgogICAgZnVuY3Rpb24gaGFuZGxlU2NhbkZpbGUoaW5wdXQpIHsKICAgICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXMgJiYgaW5wdXQuZmlsZXNbMF07CiAgICAgICAgaWYgKCFmaWxlKSByZXR1cm47CiAgICAgICAgX3NldFNjYW5GaWxlKGZpbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIF9zZXRTY2FuRmlsZShmaWxlKSB7CiAgICAgICAgaWYgKHNjYW5TdGF0ZS5wcmV2aWV3VXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKHNjYW5TdGF0ZS5wcmV2aWV3VXJsKTsKICAgICAgICBzY2FuU3RhdGUuZmlsZSA9IGZpbGU7CiAgICAgICAgc2NhblN0YXRlLnByZXZpZXdVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpOwogICAgICAgIHNjYW5TdGF0ZS5yZXN1bHRzID0gW107CiAgICAgICAgc2NhblN0YXRlLnNlbGVjdGVkID0gbmV3IFNldCgpOwogICAgICAgIHJlbmRlclNjYW5Nb2RhbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldFNjYW5Nb2RlKG1vZGUpIHsKICAgICAgICBzY2FuU3RhdGUubW9kZSA9IG1vZGU7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gc3VibWl0U2NhbigpIHsKICAgICAgICBpZiAoIXNjYW5TdGF0ZS5maWxlIHx8IHNjYW5TdGF0ZS5zY2FubmluZykgcmV0dXJuOwogICAgICAgIHNjYW5TdGF0ZS5zY2FubmluZyA9IHRydWU7CiAgICAgICAgcmVuZGVyU2Nhbk1vZGFsKCk7CgogICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7CiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgc2NhblN0YXRlLmZpbGUpOwogICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbW9kZScsIHNjYW5TdGF0ZS5tb2RlKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKEFQSV9CQVNFICsgJy9hcGkvY29sbGVjdGlvbi9zY2FuJywgewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBib2R5OiBmb3JtRGF0YSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghcmVzcC5vaykgewogICAgICAgICAgICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHsgZGV0YWlsOiByZXNwLnN0YXR1c1RleHQgfSkpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5kZXRhaWwgfHwgcmVzcC5zdGF0dXNUZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7CiAgICAgICAgICAgIHNjYW5TdGF0ZS5yZXN1bHRzID0gZGF0YS5yZXN1bHRzIHx8IFtdOwogICAgICAgICAgICAvLyBBdXRvLXNlbGVjdCBhbGwgaGlnaC9tZWRpdW0gY29uZmlkZW5jZSBtYXRjaGVzCiAgICAgICAgICAgIHNjYW5TdGF0ZS5zZWxlY3RlZCA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgc2NhblN0YXRlLnJlc3VsdHMuZm9yRWFjaCgociwgaSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHIubWF0Y2hlZF9uYW1lICYmIChyLmNvbmZpZGVuY2UgPT09ICdoaWdoJyB8fCByLmNvbmZpZGVuY2UgPT09ICdtZWRpdW0nKSkgewogICAgICAgICAgICAgICAgICAgIHNjYW5TdGF0ZS5zZWxlY3RlZC5hZGQoaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAg' +
'ICAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1zY2FuLXN0YXR1cycpOwogICAgICAgICAgICBpZiAoc3RhdHVzRWwpIHN0YXR1c0VsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJjb2xsLXNjYW4tZXJyb3ItbXNnIj5TY2FuIGZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHNjYW5TdGF0ZS5zY2FubmluZyA9IGZhbHNlOwogICAgICAgICAgICByZW5kZXJTY2FuTW9kYWwoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9nZ2xlU2NhblJlc3VsdChpZHgpIHsKICAgICAgICBpZiAoc2NhblN0YXRlLnNlbGVjdGVkLmhhcyhpZHgpKSB7CiAgICAgICAgICAgIHNjYW5TdGF0ZS5zZWxlY3RlZC5kZWxldGUoaWR4KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzY2FuU3RhdGUuc2VsZWN0ZWQuYWRkKGlkeCk7CiAgICAgICAgfQogICAgICAgIHJlbmRlclNjYW5Nb2RhbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjYW5TZWxlY3RBbGwoKSB7CiAgICAgICAgc2NhblN0YXRlLnJlc3VsdHMuZm9yRWFjaCgociwgaSkgPT4gewogICAgICAgICAgICBpZiAoci5tYXRjaGVkX25hbWUpIHNjYW5TdGF0ZS5zZWxlY3RlZC5hZGQoaSk7CiAgICAgICAgfSk7CiAgICAgICAgcmVuZGVyU2Nhbk1vZGFsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2NhbkRlc2VsZWN0QWxsKCkgewogICAgICAgIHNjYW5TdGF0ZS5zZWxlY3RlZC5jbGVhcigpOwogICAgICAgIHJlbmRlclNjYW5Nb2RhbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjYW5CYWNrKCkgewogICAgICAgIHNjYW5TdGF0ZS5yZXN1bHRzID0gW107CiAgICAgICAgc2NhblN0YXRlLnNlbGVjdGVkID0gbmV3IFNldCgpOwogICAgICAgIHNjYW5TdGF0ZS5tYW51YWxDYXJkcyA9IFtdOwogICAgICAgIHJlbmRlclNjYW5Nb2RhbCgpOwogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIHNjYW5NYW51YWxMb29rdXAoZXJySWR4KSB7CiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dC5jb2xsLXNjYW4tbWFudWFsLWlucHV0W2RhdGEtZXJyLWlkeD0iJyArIGVycklkeCArICciXScpOwogICAgICAgIGlmICghaW5wdXQgfHwgIWlucHV0LnZhbHVlLnRyaW0oKSkgcmV0dXJuOwogICAgICAgIGNvbnN0IG5hbWUgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSB0cnVlOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBsb29rdXBSZXNwID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy9uYW1lZD9mdXp6eT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpKTsKICAgICAgICAgICAgaWYgKCFsb29rdXBSZXNwLm9rKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCBsb29rdXBSZXNwLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZGV0YWlscyB8fCAnQ2FyZCBub3QgZm91bmQgb24gU2NyeWZhbGwnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBjYXJkID0gYXdhaXQgbG9va3VwUmVzcC5qc29uKCk7CiAgICAgICAgICAgIGNvbnN0IGltYWdlVXJpcyA9IGNhcmQuaW1hZ2VfdXJpcyB8fCAoY2FyZC5jYXJkX2ZhY2VzICYmIGNhcmQuY2FyZF9mYWNlc1swXSA/IGNhcmQuY2FyZF9mYWNlc1swXS5pbWFnZV91cmlzIDoge30pIHx8IHt9OwoKICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgZXJyb3IgcmVzdWx0IHdpdGggYSBtYXRjaGVkIHJlc3VsdAogICAgICAgICAgICBzY2FuU3RhdGUucmVzdWx0c1tlcnJJZHhdID0gewogICAgICAgICAgICAgICAgcmF3X29jcjogbmFtZSwKICAgICAgICAgICAgICAgIG1hdGNoZWRfbmFtZTogY2FyZC5uYW1lLAogICAgICAgICAgICAgICAgc2V0X2NvZGU6IGNhcmQuc2V0IHx8ICcnLAogICAgICAgICAgICAgICAgc2NyeWZhbGxfaWQ6IGNhcmQuaWQgfHwgJycsCiAgICAgICAgICAgICAgICBjb25maWRlbmNlOiAnaGlnaCcsCiAgICAgICAgICAgICAgICBpbWFnZV91cmk6IGltYWdlVXJpcy5ub3JtYWwgfHwgaW1hZ2VVcmlzLnNtYWxsIHx8ICcnLAogICAgICAgICAgICAgICAgZXJyb3I6ICcnLAogICAgICAgICAgICB9OwogICAgICAgICAgICBzY2FuU3RhdGUuc2VsZWN0ZWQuYWRkKGVycklkeCk7CiAgICAgICAgICAgIHJl' +
'bmRlclNjYW5Nb2RhbCgpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgaW5wdXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAndmFyKC0tbGFiLWRhbmdlciwgI2Y4NTE0OSknOwogICAgICAgICAgICBpbnB1dC5wbGFjZWhvbGRlciA9IGUubWVzc2FnZSB8fCAnTm90IGZvdW5kLCB0cnkgYWdhaW4nOwogICAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcnOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBzY2FuTWFudWFsQWRkKCkgewogICAgICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtc2Nhbi1tYW51YWwtbmFtZScpOwogICAgICAgIGlmICghaW5wdXQgfHwgIWlucHV0LnZhbHVlLnRyaW0oKSkgcmV0dXJuOwogICAgICAgIGNvbnN0IG5hbWUgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSB0cnVlOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBsb29rdXBSZXNwID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLnNjcnlmYWxsLmNvbS9jYXJkcy9uYW1lZD9mdXp6eT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpKTsKICAgICAgICAgICAgaWYgKCFsb29rdXBSZXNwLm9rKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCBsb29rdXBSZXNwLmpzb24oKS5jYXRjaCgoKSA9PiAoe30pKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnIuZGV0YWlscyB8fCAnQ2FyZCBub3QgZm91bmQgb24gU2NyeWZhbGwnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBjYXJkID0gYXdhaXQgbG9va3VwUmVzcC5qc29uKCk7CiAgICAgICAgICAgIGNvbnN0IGltYWdlVXJpcyA9IGNhcmQuaW1hZ2VfdXJpcyB8fCAoY2FyZC5jYXJkX2ZhY2VzICYmIGNhcmQuY2FyZF9mYWNlc1swXSA/IGNhcmQuY2FyZF9mYWNlc1swXS5pbWFnZV91cmlzIDoge30pIHx8IHt9OwoKICAgICAgICAgICAgaWYgKCFzY2FuU3RhdGUubWFudWFsQ2FyZHMpIHNjYW5TdGF0ZS5tYW51YWxDYXJkcyA9IFtdOwogICAgICAgICAgICBzY2FuU3RhdGUubWFudWFsQ2FyZHMucHVzaCh7CiAgICAgICAgICAgICAgICBuYW1lOiBjYXJkLm5hbWUsCiAgICAgICAgICAgICAgICBzZXRfY29kZTogY2FyZC5zZXQgfHwgJycsCiAgICAgICAgICAgICAgICBpbWFnZV91cmk6IGltYWdlVXJpcy5ub3JtYWwgfHwgaW1hZ2VVcmlzLnNtYWxsIHx8ICcnLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmVuZGVyU2Nhbk1vZGFsKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpbnB1dC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBpbnB1dC5zdHlsZS5ib3JkZXJDb2xvciA9ICd2YXIoLS1sYWItZGFuZ2VyLCAjZjg1MTQ5KSc7CiAgICAgICAgICAgIGlucHV0LnBsYWNlaG9sZGVyID0gZS5tZXNzYWdlIHx8ICdOb3QgZm91bmQsIHRyeSBhZ2Fpbic7CiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNjYW5SZW1vdmVNYW51YWwoaWR4KSB7CiAgICAgICAgaWYgKHNjYW5TdGF0ZS5tYW51YWxDYXJkcykgewogICAgICAgICAgICBzY2FuU3RhdGUubWFudWFsQ2FyZHMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIHJlbmRlclNjYW5Nb2RhbCgpOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBzdWJtaXRTY2FuQWRkKCkgewogICAgICAgIGNvbnN0IGNhcmRzID0gW107CiAgICAgICAgLy8gT0NSLW1hdGNoZWQgY2FyZHMKICAgICAgICBzY2FuU3RhdGUuc2VsZWN0ZWQuZm9yRWFjaChpZHggPT4gewogICAgICAgICAgICBjb25zdCByID0gc2NhblN0YXRlLnJlc3VsdHNbaWR4XTsKICAgICAgICAgICAgaWYgKCFyIHx8ICFyLm1hdGNoZWRfbmFtZSkgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBxdHlJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LmNvbGwtc2Nhbi1xdHktaW5wdXRbZGF0YS1zY2FuLWlkeD0iJyArIGlkeCArICciXScpOwogICAgICAgICAgICBjb25zdCBxdHkgPSBxdHlJbnB1dCA/IHBhcnNlSW50KHF0eUlucHV0LnZhbHVlLCAxMCkgfHwgMSA6IDE7CiAgICAgICAgICAgIGNhcmRzLnB1c2goewogICAgICAgICAgICAgICAgbmFtZTogci5tYXRjaGVkX25hbWUsCiAgICAgICAgICAgICAgICBzZXRfY29kZTogci5zZXRfY29kZSB8fCAnJywKICAgICAgICAg' +
'ICAgICAgIGNvbGxlY3Rvcl9udW1iZXI6IHIuY29sbGVjdG9yX251bWJlciB8fCAnJywKICAgICAgICAgICAgICAgIHF1YW50aXR5OiBxdHksCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIC8vIE1hbnVhbCBjYXJkcwogICAgICAgIChzY2FuU3RhdGUubWFudWFsQ2FyZHMgfHwgW10pLmZvckVhY2goKG1jLCBtaSkgPT4gewogICAgICAgICAgICBjb25zdCBxdHlJbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LmNvbGwtc2Nhbi1tYW51YWwtcXR5W2RhdGEtbWFudWFsLWlkeD0iJyArIG1pICsgJyJdJyk7CiAgICAgICAgICAgIGNvbnN0IHF0eSA9IHF0eUlucHV0ID8gcGFyc2VJbnQocXR5SW5wdXQudmFsdWUsIDEwKSB8fCAxIDogMTsKICAgICAgICAgICAgY2FyZHMucHVzaCh7CiAgICAgICAgICAgICAgICBuYW1lOiBtYy5uYW1lLAogICAgICAgICAgICAgICAgc2V0X2NvZGU6IG1jLnNldF9jb2RlIHx8ICcnLAogICAgICAgICAgICAgICAgcXVhbnRpdHk6IHF0eSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChjYXJkcy5sZW5ndGggPT09IDApIHJldHVybjsKCiAgICAgICAgY29uc3Qgc3RhdHVzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1zY2FuLXN0YXR1cycpOwogICAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1wcm9ncmVzcyI+QWRkaW5nIGNhcmRzLi4uIDxzcGFuIGNsYXNzPSJjb2xsLXNwaW5uZXItaW5saW5lIj48L3NwYW4+PC9kaXY+JzsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKEFQSV9CQVNFICsgJy9hcGkvY29sbGVjdGlvbi9zY2FuL2FkZCcsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNhcmRzIH0pLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFyZXNwLm9rKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwLmpzb24oKS5jYXRjaCgoKSA9PiAoeyBkZXRhaWw6IHJlc3Auc3RhdHVzVGV4dCB9KSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLmRldGFpbCB8fCByZXNwLnN0YXR1c1RleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTsKICAgICAgICAgICAgbGV0IG1zZyA9ICcnOwogICAgICAgICAgICBpZiAoZGF0YS5pbXBvcnRlZENvdW50KSBtc2cgKz0gZGF0YS5pbXBvcnRlZENvdW50ICsgJyBhZGRlZCc7CiAgICAgICAgICAgIGlmIChkYXRhLnVwZGF0ZWRDb3VudCkgbXNnICs9IChtc2cgPyAnLCAnIDogJycpICsgZGF0YS51cGRhdGVkQ291bnQgKyAnIHVwZGF0ZWQnOwogICAgICAgICAgICBpZiAoZGF0YS5mYWlsZWRDb3VudCkgIG1zZyArPSAobXNnID8gJywgJyA6ICcnKSArIGRhdGEuZmFpbGVkQ291bnQgKyAnIGZhaWxlZCc7CiAgICAgICAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1zdWNjZXNzIj4nICsgZXNjYXBlSHRtbChtc2cgfHwgJ0RvbmUnKSArICc8L2Rpdj4nOwoKICAgICAgICAgICAgLy8gUmVmcmVzaCBjb2xsZWN0aW9uIGFmdGVyIHNob3J0IGRlbGF5CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgY2xvc2VTY2FuKCk7CiAgICAgICAgICAgICAgICBsb2FkQ29sbGVjdGlvbigpOwogICAgICAgICAgICB9LCAxNTAwKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGlmIChzdGF0dXNFbCkgc3RhdHVzRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImNvbGwtc2Nhbi1lcnJvci1tc2ciPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBCaW5kIHNjYW4gZHJvcHpvbmUgY2xpY2sgKyBkcmFnIGV2ZW50cyBhZnRlciByZW5kZXIKICAgIGZ1bmN0aW9uIF9iaW5kU2NhbkRyb3B6b25lKCkgewogICAgICAgIGNvbnN0IGRyb3B6b25lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbGwtc2Nhbi1kcm9wem9uZScpOwogICAgICAgIGlmICghZHJvcHpvbmUpIHJldHVybjsKICAgICAgICBkcm9wem9uZS5hZGRF' +
'dmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sbC1zY2FuLWZpbGUnKTsKICAgICAgICAgICAgaWYgKGlucHV0KSBpbnB1dC5jbGljaygpOwogICAgICAgIH0pOwogICAgICAgIGRyb3B6b25lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgZSA9PiB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZHJvcHpvbmUuY2xhc3NMaXN0LmFkZCgnZHJhZy1vdmVyJyk7CiAgICAgICAgfSk7CiAgICAgICAgZHJvcHpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgKCkgPT4gZHJvcHpvbmUuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1vdmVyJykpOwogICAgICAgIGRyb3B6b25lLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCBlID0+IHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBkcm9wem9uZS5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnLW92ZXInKTsKICAgICAgICAgICAgY29uc3QgZmlsZSA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzWzBdOwogICAgICAgICAgICBpZiAoZmlsZSkgX3NldFNjYW5GaWxlKGZpbGUpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vIFBhdGNoIHJlbmRlclNjYW5Nb2RhbCB0byByZWJpbmQgZHJvcHpvbmUgYWZ0ZXIgRE9NIHVwZGF0ZQogICAgY29uc3QgX29yaWdSZW5kZXJTY2FuTW9kYWwgPSByZW5kZXJTY2FuTW9kYWw7CiAgICByZW5kZXJTY2FuTW9kYWwgPSBmdW5jdGlvbigpIHsKICAgICAgICBfb3JpZ1JlbmRlclNjYW5Nb2RhbCgpOwogICAgICAgIHNldFRpbWVvdXQoX2JpbmRTY2FuRHJvcHpvbmUsIDApOwogICAgfTsKCiAgICAvLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIHJldHVybiB7CiAgICAgICAgaW5pdCwKICAgICAgICBnb0JhY2ssCiAgICAgICAgLy8gSW1wb3J0CiAgICAgICAgb3BlbkltcG9ydCwKICAgICAgICBjbG9zZUltcG9ydCwKICAgICAgICBpbXBvcnROZXh0LAogICAgICAgIGltcG9ydFByZXYsCiAgICAgICAgc3VibWl0SW1wb3J0LAogICAgICAgIHNldEltcG9ydFNvdXJjZSwKICAgICAgICBzZXRJbXBvcnRDb250ZW50LAogICAgICAgIHNldEltcG9ydE1hcHBpbmcsCiAgICAgICAgc2V0SW1wb3J0TW9kZSwKICAgICAgICBzZXRNaXNzaW5nRmluaXNoTm9ybWFsLAogICAgICAgIGhhbmRsZUZpbGVTZWxlY3QsCiAgICAgICAgLy8gRXhwb3J0CiAgICAgICAgb3BlbkV4cG9ydCwKICAgICAgICBjbG9zZUV4cG9ydCwKICAgICAgICBzdWJtaXRFeHBvcnQsCiAgICAgICAgLy8gU2NhbgogICAgICAgIG9wZW5TY2FuLAogICAgICAgIGNsb3NlU2NhbiwKICAgICAgICBoYW5kbGVTY2FuRmlsZSwKICAgICAgICBzZXRTY2FuTW9kZSwKICAgICAgICBzdWJtaXRTY2FuLAogICAgICAgIHRvZ2dsZVNjYW5SZXN1bHQsCiAgICAgICAgc2NhblNlbGVjdEFsbCwKICAgICAgICBzY2FuRGVzZWxlY3RBbGwsCiAgICAgICAgc2NhbkJhY2ssCiAgICAgICAgc3VibWl0U2NhbkFkZCwKICAgICAgICBzY2FuTWFudWFsTG9va3VwLAogICAgICAgIHNjYW5NYW51YWxBZGQsCiAgICAgICAgc2NhblJlbW92ZU1hbnVhbCwKICAgICAgICAvLyBEcmF3ZXIKICAgICAgICBvcGVuRHJhd2VyLAogICAgICAgIGNsb3NlRHJhd2VyLAogICAgICAgIHN3aXRjaERyYXdlclRhYiwKICAgICAgICBsb2FkRWRocmVjVGFiLAogICAgICAgIHNhdmVDYXJkRWRpdHMsCiAgICAgICAgYWRkRHJhd2VyQ2F0ZWdvcnksCiAgICAgICAgcmVtb3ZlRHJhd2VyQ2F0ZWdvcnksCiAgICAgICAgYWRkRHJhd2VyQ2F0ZWdvcnlGcm9tSW5wdXQsCiAgICAgICAgYWRkRHJhd2VyVGFnRnJvbUlucHV0LAogICAgICAgIHJlbW92ZURyYXdlclRhZywKICAgICAgICAvLyBGaWx0ZXJzCiAgICAgICAgdG9nZ2xlQ29sb3IsCiAgICAgICAgdG9nZ2xlVHlwZSwKICAgICAgICB0b2dnbGVGaWx0ZXIsCiAgICAgICAgc2V0RmluaXNoLAogICAgICAgIHNldENtY1JhbmdlLAogICAgICAgIHNldFByaWNlUmFuZ2UsCiAgICAgICAgdG9nZ2xlQ2F0ZWdvcnlGaWx0ZXIsCiAgICAgICAgdG9nZ2xlUmFyaXR5LAogICAgICAgIHNldFBvd2VyUmFuZ2UsCiAgICAgICAgc2V0VG91Z2hSYW5n' +
'ZSwKICAgICAgICBzZXRFZGhyZWNSYW5nZSwKICAgICAgICBzZXRRdHlSYW5nZSwKICAgICAgICBvblNldElucHV0LAogICAgICAgIGFkZFNldEZpbHRlciwKICAgICAgICByZW1vdmVTZXRGaWx0ZXIsCiAgICAgICAgb25Ld0lucHV0LAogICAgICAgIGFkZEtleXdvcmRGaWx0ZXIsCiAgICAgICAgcmVtb3ZlS2V5d29yZEZpbHRlciwKICAgICAgICByZXNldEZpbHRlcnMsCiAgICAgICAgLy8gU29ydCAvIHBhZ2UKICAgICAgICBzZXRTb3J0LAogICAgICAgIHNldFBhZ2UsCiAgICAgICAgc2V0UGFnZVNpemUsCiAgICAgICAgLy8gQ2F0ZWdvcnkgaW5saW5lCiAgICAgICAgdXBkYXRlQ2F0ZWdvcnksCiAgICAgICAgb3BlbkNhdGVnb3J5UG9wb3ZlciwKICAgICAgICBjbG9zZUNhdGVnb3J5UG9wb3ZlciwKICAgICAgICBwb3BvdmVyQWRkQ2F0LAogICAgICAgIHBvcG92ZXJSZW1vdmVDYXQsCiAgICAgICAgcG9wb3ZlckFkZENhdEZyb21JbnB1dCwKICAgICAgICByZUVucmljaCwKICAgICAgICBhdXRvQ2xhc3NpZnksCiAgICB9Owp9KSgpOwo='
Install-B64 -R 'ui\collection.js' -B $b
# ui/deckbuilder.css (74,765 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgQnVpbGRlciBTdHlsZXMKICAgVXNlcyBkZWNrLSBwcmVmaXggdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggbGFiLSAvIGNvbGwtIGNsYXNzZXMKICAgVG9rZW5zIGZyb20gZ2xvYmFsLmNzcyBkZXNpZ24gc3lzdGVtCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLyog4pSA4pSAIEpTIEJhY2t3YXJkLUNvbXBhdCBBbGlhc2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICBkZWNrYnVpbGRlci5qcyB1c2VzIHZhcigtLWxhYi1kYW5nZXIpIGluIHRlbXBsYXRlIGxpdGVyYWxzLgogICBNYXAgaXQgdG8gdGhlIGdsb2JhbCB0b2tlbiBzbyBpbmxpbmUgc3R5bGVzIHdvcmsuCiAgIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwo6cm9vdCB7CiAgICAtLWxhYi1kYW5nZXI6IHZhcigtLWVycm9yKTsKfQoKLyog4pSA4pSAIFotSU5ERVggU1RBQ0sg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIDEwICAgc3RpY2t5IHNlY3Rpb24gaGVhZGVycwogICA1MCAgIHF1aWNrYWRkIGRyb3Bkb3duCiAgIDYwICAgY2FyZCBwcmV2aWV3IHRvb2x0aXAKICAgMTAwICB0b3BiYXIKICAgNTAwICB0b2FzdCBjb250YWluZXIKICAgMTAwMCBtb2RhbCBvdmVybGF5cwogICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi8qIOKUgOKUgCAxLiBQYWdlIEJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgojZGVjay1idWlsZGVyLXBhZ2UgewogICAgbWluLWhlaWdodDogMTAwdmg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLyog4pSA4pSAIDIuIFRvcCBCYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGVjay10b3BiYXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiB2YXIoLS1zcC00KTsKICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICB0b3A6IHZhcigtLW5hdi1oZWlnaHQpOwogICAgYmFja2dyb3VuZDogcmdiYSgxMiwgMTQsIDIwLCAwLjk3KTsKICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigxMHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJv' +
'cmRlcik7CiAgICB6LWluZGV4OiAxMDA7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC01KTsKICAgIG1pbi1oZWlnaHQ6IDYwcHg7Cn0KCi5kZWNrLXRvcGJhci1jb21tYW5kZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5kZWNrLWNvbW1hbmRlci1wb3J0cmFpdCB7CiAgICB3aWR0aDogNDRweDsKICAgIGhlaWdodDogNjBweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgouZGVjay1jb21tYW5kZXItcG9ydHJhaXQ6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1jb21tYW5kZXItcG9ydHJhaXQtcGxhY2Vob2xkZXIgewogICAgZm9udC1zaXplOiAyMHB4OwogICAgb3BhY2l0eTogMC40OwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5kZWNrLWNvbW1hbmRlci1wb3J0cmFpdC1pbWcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgouZGVjay1uYW1lLWJsb2NrIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAzcHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5kZWNrLW5hbWUtaW5wdXQgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIHBhZGRpbmc6IDJweCA0cHggMnB4IDA7CiAgICBvdXRsaW5lOiBub25lOwogICAgd2lkdGg6IDIwMHB4OwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5kZWNrLW5hbWUtaW5wdXQ6aG92ZXIgewogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYm9yZGVyKTsKfQoKLmRlY2stbmFtZS1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1uYW1lLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgouZGVjay1jb21tYW5kZXItbGFiZWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLXNwLTEpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogMjAwcHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjFzOwp9CgouZGVjay1jb21tYW5kZXItbGFiZWw6aG92ZXIgewogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgouZGVjay1jb2xvci1jaGlwcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0xKTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBNVEcgbWFuYSBjb2xvciBjaGlwcyDigJQgZG9tYWluLXNwZWNpZmljIGNvbG9ycyAqLwouZGVjay1jb2xvci1jaGlwIHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBmb250LXNpemU6IDlweDsKICAg' +
'IGZvbnQtd2VpZ2h0OiA4MDA7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1zbSk7CiAgICBib3JkZXI6IDEuNXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgIHVzZXItc2VsZWN0OiBub25lOwp9CgouZGVjay1jaGlwLVcgeyBiYWNrZ3JvdW5kOiAjRjlGQUY0OyBjb2xvcjogIzMzMzsgfQouZGVjay1jaGlwLVUgeyBiYWNrZ3JvdW5kOiAjMEU2OEFCOyBjb2xvcjogI2ZmZjsgfQouZGVjay1jaGlwLUIgeyBiYWNrZ3JvdW5kOiAjM2EyYTFhOyBjb2xvcjogI2M5YTA2MDsgYm9yZGVyLWNvbG9yOiAjNWEzYTFhOyB9Ci5kZWNrLWNoaXAtUiB7IGJhY2tncm91bmQ6ICNEMzIwMkE7IGNvbG9yOiAjZmZmOyB9Ci5kZWNrLWNoaXAtRyB7IGJhY2tncm91bmQ6ICMwMDczM0U7IGNvbG9yOiAjZmZmOyB9Ci5kZWNrLWNoaXAtQyB7IGJhY2tncm91bmQ6ICM5YTlhOWE7IGNvbG9yOiAjZmZmOyB9CgouZGVjay10b3BiYXItY2VudGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAgIGZsZXgtZ3JvdzogMTsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLXdpZHRoOiAwOwp9CgouZGVjay1jb3VudC1kaXNwbGF5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICBnYXA6IDNweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRlY2stY291bnQtbnVtIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLmRlY2stY291bnQtbnVtLm92ZXItbGltaXQgewogICAgY29sb3I6IHZhcigtLWVycm9yKTsKfQoKLmRlY2stY291bnQtbnVtLmF0LWxpbWl0IHsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKfQoKLmRlY2stY291bnQtc2VwIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLmRlY2stY291bnQtdGFyZ2V0IHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5kZWNrLWNvdW50LWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7Cn0KCi5kZWNrLXNlbGVjdG9yIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDZweCB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgb3V0bGluZTogbm9uZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG1heC13aWR0aDogMjAwcHg7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgouZGVjay1zZWxlY3Rvcjpob3ZlciwKLmRlY2stc2VsZWN0b3I6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1zZWxlY3Rvci13cmFwIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1uYXYtbGlua3MgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRlY2stbmF2LWxpbmsgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIHBhZGRpbmc6IDVweCB2YXIoLS1zcC0zKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouZGVjay1uYXYtbGluazpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stdG9wYmFyLWFjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1z' +
'OiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIOKUgOKUgCAzLiBTaGFyZWQgQnV0dG9uIFN0eWxlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLWJ0biB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgcGFkZGluZzogN3B4IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi5kZWNrLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjQ1OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgouZGVjay1idG4tZ2hvc3QgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyKTsKfQoKLmRlY2stYnRuLWdob3N0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1idG4tYWNjZW50IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudC1nbG93KTsKfQoKLmRlY2stYnRuLWFjY2VudDpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDkxLCAxNTgsIDI0MCwgMC4yOCk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5kZWNrLWJ0bi1hY2NlbnQtc20gewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50LWdsb3cpOwogICAgcGFkZGluZzogNXB4IHZhcigtLXNwLTMpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgouZGVjay1idG4tYWNjZW50LXNtOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjI4KTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stYnRuLXN1Y2Nlc3MgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcy1kaW0pOwogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDc0LCAyMjIsIDEyOCwgMC40KTsKfQoKLmRlY2stYnRuLXN1Y2Nlc3M6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYmFja2dyb3VuZDogcmdiYSg3NCwgMjIyLCAxMjgsIDAuMjUpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKfQoKLmRlY2stYnRuLWRhbmdlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwogICAgY29sb3I6IHZhcigtLWVycm9yKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDgsIDExMywgMTEzLCAwLjMpOwp9CgouZGVjay1idG4tZGFuZ2VyOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ4LCAxMTMsIDExMywgMC4yMik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWVycm9yKTsKfQoKLmRlY2stYnRuLWltcG9ydCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzQsIDIyMiwgMTI4LCAwLjQpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmRlY2stYnRuLWltcG9ydDpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc0LCAyMjIsIDEyOCwgMC4zKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgICBib3gtc2hhZG93OiAwIDAgMTBweCB2YXIoLS1zdWNjZXNzLWRpbSk7Cn0KCi5kZWNrLWJ0bi1zaW0gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50' +
'KDEzNWRlZywgdmFyKC0tYWNjZW50LWdsb3cpLCB2YXIoLS1wdXJwbGUtZGltKSk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5MSwgMTU4LCAyNDAsIDAuNSk7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouZGVjay1idG4tc2ltOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjM4KSwgcmdiYSgxNjcsIDEzOSwgMjUwLCAwLjMpKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAxMnB4IHZhcigtLWFjY2VudC1nbG93KTsKfQoKLmRlY2stYnRuLWRhbmdlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjE1KTsKICAgIGNvbG9yOiAjZWY0NDQ0OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjQpOwp9Ci5kZWNrLWJ0bi1kYW5nZXI6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYmFja2dyb3VuZDogcmdiYSgyMzksIDY4LCA2OCwgMC4zKTsKICAgIGJvcmRlci1jb2xvcjogI2VmNDQ0NDsKICAgIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMjM5LCA2OCwgNjgsIDAuMik7Cn0KCi5kZWNrLWJ0bi1kYW5nZXItb3V0bGluZSB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjcpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjMpOwogICAgZm9udC1zaXplOiAwLjcycmVtOwp9Ci5kZWNrLWJ0bi1kYW5nZXItb3V0bGluZTpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjEyKTsKICAgIGNvbG9yOiAjZWY0NDQ0OwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjUpOwp9CgovKiBJbXBvcnQgbW9kYWwgKi8KLmRlY2staW1wb3J0LXRhYnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogMDsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTMpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5kZWNrLWltcG9ydC10YWIgewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC00KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5kZWNrLWltcG9ydC10YWI6aG92ZXIgeyBjb2xvcjogdmFyKC0tdGV4dCk7IH0KCi5kZWNrLWltcG9ydC10YWIuYWN0aXZlIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKI2RlY2staW1wb3J0LXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHJlc2l6ZTogdmVydGljYWw7CiAgICBvdXRsaW5lOiBub25lOwp9CgojZGVjay1pbXBvcnQtdGV4dGFyZWE6Zm9jdXMgeyBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7IH0KCi5kZWNrLWltcG9ydC1kcm9wem9uZSB7CiAgICBib3JkZXI6IDJweCBkYXNoZWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC04KSB2YXIoLS1zcC01KTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5kZWNrLWltcG9ydC1kcm9wem9uZTpob3ZlciwKLmRlY2staW1wb3J0LWRyb3B6b25lLmRyYWdvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwp9CgouZGVjay1pbXBvcnQt' +
'ZHJvcHpvbmUtbGFiZWwgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmRlY2staW1wb3J0LW9wdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtNCk7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0zKTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLmRlY2staW1wb3J0LW9wdGlvbi1sYWJlbCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5kZWNrLWltcG9ydC1vcHRpb24tbGFiZWwgaW5wdXRbdHlwZT0icmFkaW8iXSB7CiAgICBhY2NlbnQtY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5kZWNrLWltcG9ydC1uYW1lLXJvdyB7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0zKTsKfQoKLmRlY2staW1wb3J0LW5hbWUtcm93IGxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTEpOwp9CgouZGVjay1pbXBvcnQtbmFtZS1yb3cgaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIG91dGxpbmU6IG5vbmU7Cn0KCi5kZWNrLWltcG9ydC1uYW1lLXJvdyBpbnB1dDpmb2N1cyB7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgfQoKLyogSW1wb3J0IHByb2dyZXNzIChtb3ZlZCBmcm9tIGlubGluZSBzdHlsZXMpICovCi5kZWNrLWltcG9ydC1wcm9ncmVzcy13cmFwIHsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTMpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1zdWJ0bGUpOwp9CgouZGVjay1pbXBvcnQtcHJvZ3Jlc3MtbGFiZWwgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTIpOwp9CgouZGVjay1pbXBvcnQtcHJvZ3Jlc3MtdHJhY2sgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0zKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBoZWlnaHQ6IDZweDsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5kZWNrLWltcG9ydC1wcm9ncmVzcy1maWxsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICB3aWR0aDogMCU7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcyB2YXIoLS1lYXNlKTsKfQoKLyogSW1wb3J0IGZpbGUgaW5mbyAobW92ZWQgZnJvbSBpbmxpbmUgc3R5bGUpICovCi5kZWNrLWltcG9ydC1maWxlLWluZm8gewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMik7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGVjay1idG4taWNvbiB7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5kZWNrLWJ0bi1mdWxsIHsKICAgIHdpZHRoOiAxMDAlOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5kZWNrLWJ0bi1zbSB7CiAgICBwYWRkaW5nOiA0cHggdmFyKC0tc3AtMyk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5kZWNrLWJ0bi14cyB7CiAgICBwYWRkaW5nOiAzcHggdmFyKC0tc3AtMik7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7Cn0KCi8qIOKUgOKUgCA0LiBNYWluIDMtQ29sdW1uIExheW91dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLW1haW4gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgt' +
'ZGlyZWN0aW9uOiByb3c7CiAgICBnYXA6IDA7CiAgICBmbGV4OiAxOwogICAgbWluLWhlaWdodDogMDsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0Owp9CgovKiBMRUZUIENPTFVNTiAqLwouZGVjay1jb2wtbGVmdCB7CiAgICB3aWR0aDogMzAwcHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICB0b3A6IGNhbGModmFyKC0tbmF2LWhlaWdodCkgKyA2MHB4KTsKICAgIGhlaWdodDogY2FsYygxMDB2aCAtIHZhcigtLW5hdi1oZWlnaHQpIC0gNjBweCk7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyKSB0cmFuc3BhcmVudDsKfQoKLmRlY2stY29sLWxlZnQ6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgd2lkdGg6IDZweDsgfQouZGVjay1jb2wtbGVmdDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgfQouZGVjay1jb2wtbGVmdDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiAzcHg7IH0KLmRlY2stY29sLWxlZnQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOyB9CgovKiBDRU5URVIgQ09MVU1OICovCi5kZWNrLWNvbC1jZW50ZXIgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1uYXYtaGVpZ2h0KSAtIDYwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyKSB0cmFuc3BhcmVudDsKfQoKLmRlY2stY29sLWNlbnRlcjo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNnB4OyB9Ci5kZWNrLWNvbC1jZW50ZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH0KLmRlY2stY29sLWNlbnRlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiAzcHg7IH0KCi8qIFJJR0hUIENPTFVNTiAqLwouZGVjay1jb2wtcmlnaHQgewogICAgd2lkdGg6IDM2MHB4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgdG9wOiBjYWxjKHZhcigtLW5hdi1oZWlnaHQpICsgNjBweCk7CiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1uYXYtaGVpZ2h0KSAtIDYwcHgpOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyKSB0cmFuc3BhcmVudDsKfQoKLmRlY2stY29sLXJpZ2h0Ojotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiA2cHg7IH0KLmRlY2stY29sLXJpZ2h0Ojotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9Ci5kZWNrLWNvbC1yaWdodDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiAzcHg7IH0KLmRlY2stY29sLXJpZ2h0Ojotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsgfQoKLyog4pSA4pSAIDUuIFBhbmVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLXBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKfQoKLmRlY2stcGFuZWwgKyAuZGVjay1wYW5lbCB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoKLmRlY2stcGFuZWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3At' +
'NCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgdG9wOiAwOwogICAgei1pbmRleDogMTA7Cn0KCi5kZWNrLXBhbmVsLWhlYWRlci1jb2xsYXBzaWJsZSB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgouZGVjay1wYW5lbC1oZWFkZXItY29sbGFwc2libGU6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7Cn0KCi5kZWNrLXBhbmVsLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgouZGVjay1jb2xsYXBzZS1hcnJvdyB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgdmFyKC0tZWFzZSk7Cn0KCi5kZWNrLXBhbmVsLWJvZHkgewogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdHJhbnNpdGlvbjogbWF4LWhlaWdodCAwLjI1cyBlYXNlLCBwYWRkaW5nIDAuMjVzIGVhc2U7Cn0KCi5kZWNrLXBhbmVsLWJvZHkuY29sbGFwc2VkIHsKICAgIG1heC1oZWlnaHQ6IDAgIWltcG9ydGFudDsKICAgIHBhZGRpbmctdG9wOiAwOwogICAgcGFkZGluZy1ib3R0b206IDA7Cn0KCi5kZWNrLWNvbGxhcHNlLWFycm93LmNvbGxhcHNlZCB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpOwp9CgovKiDilIDilIAgNi4gTGVmdCBDb2x1bW46IFNlYXJjaCBQYW5lbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLXBhbmVsLXNlYXJjaCB7CiAgICBwYWRkaW5nOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBoZWlnaHQ6IDEwMCU7Cn0KCi5kZWNrLXBhbmVsLXNlYXJjaCAuZGVjay1wYW5lbC1oZWFkZXIgewogICAgcG9zaXRpb246IHN0aWNreTsKICAgIHRvcDogMDsKICAgIHotaW5kZXg6IDEwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLXNlYXJjaC1jb3VudCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGVjay1zZWFyY2gtYmFyLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtMykgdmFyKC0tc3AtMik7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRlY2stc2VhcmNoLWJhciB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDdweCAzMHB4IDdweCB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSksIGJveC1zaGFkb3cgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgouZGVjay1zZWFyY2gtYmFyOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGVjay1zZWFyY2gtYmFyOmZvY3VzIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCB2YXIoLS1hY2NlbnQtZ2xvdyk7Cn0KCi5kZWNrLXNlYXJjaC1pY29uIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiAyMHB4OwogICAgdG9wOiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBvcGFjaXR5OiAwLjQ7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLmRlY2stZmlsdGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIo' +
'LS1zcC0yKTsKICAgIHBhZGRpbmc6IDAgdmFyKC0tc3AtMykgdmFyKC0tc3AtMik7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRlY2stZmlsdGVyLXNlbGVjdCB7CiAgICBmbGV4OiAxOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogNXB4IHZhcigtLXNwLTIpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBvdXRsaW5lOiBub25lOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWluLXdpZHRoOiAwOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmRlY2stZmlsdGVyLXNlbGVjdDpob3ZlciwKLmRlY2stZmlsdGVyLXNlbGVjdDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5kZWNrLWNtYy1maWx0ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTEpOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLWNtYy1pbnB1dCB7CiAgICB3aWR0aDogMzhweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDVweCB2YXIoLS1zcC0xKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsKfQoKLmRlY2stY21jLWlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAouZGVjay1jbWMtaW5wdXQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24gewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwp9CgouZGVjay1jbWMtaW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1jbWMtc2VwIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi8qIENvbG9yIGZpbHRlciByb3cg4oCUIE1URyBkb21haW4tc3BlY2lmaWMgY29sb3JzICovCi5kZWNrLWNvbG9yLWZpbHRlci1yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogNXB4OwogICAgcGFkZGluZzogMCB2YXIoLS1zcC0zKSB2YXIoLS1zcC0zKTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1jb2xvci1waXAgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBib3JkZXI6IDJweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKSwgdHJhbnNmb3JtIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKSwgYm94LXNoYWRvdyB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1jb2xvci1waXA6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDUpOwp9CgouZGVjay1jb2xvci1waXAuYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogI2ZmZjsKICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgIGJveC1zaGFkb3c6IDAgMnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi5kZWNrLWNv' +
'bG9yLVcgeyBiYWNrZ3JvdW5kOiAjRjlGQUY0OyBjb2xvcjogIzMzMzsgfQouZGVjay1jb2xvci1XLmFjdGl2ZSB7IGJhY2tncm91bmQ6ICNGOUZBRjQ7IH0KLmRlY2stY29sb3ItVSB7IGJhY2tncm91bmQ6ICMwRTY4QUI7IGNvbG9yOiAjZmZmOyB9Ci5kZWNrLWNvbG9yLVUuYWN0aXZlIHsgYmFja2dyb3VuZDogIzFhODVkNDsgfQouZGVjay1jb2xvci1CIHsgYmFja2dyb3VuZDogIzJhMWYxYTsgY29sb3I6ICNjOWEwNjA7IH0KLmRlY2stY29sb3ItQi5hY3RpdmUgeyBiYWNrZ3JvdW5kOiAjM2EyYTFhOyB9Ci5kZWNrLWNvbG9yLVIgeyBiYWNrZ3JvdW5kOiAjRDMyMDJBOyBjb2xvcjogI2ZmZjsgfQouZGVjay1jb2xvci1SLmFjdGl2ZSB7IGJhY2tncm91bmQ6ICNlODMwNDA7IH0KLmRlY2stY29sb3ItRyB7IGJhY2tncm91bmQ6ICMwMDczM0U7IGNvbG9yOiAjZmZmOyB9Ci5kZWNrLWNvbG9yLUcuYWN0aXZlIHsgYmFja2dyb3VuZDogIzAwOTk1MDsgfQouZGVjay1jb2xvci1DIHsgYmFja2dyb3VuZDogIzdhN2E3YTsgY29sb3I6ICNmZmY7IH0KLmRlY2stY29sb3ItQy5hY3RpdmUgeyBiYWNrZ3JvdW5kOiAjOWE5YTlhOyB9CgovKiBTZWFyY2ggcmVzdWx0cyBsaXN0ICovCi5kZWNrLXNlYXJjaC1yZXN1bHRzIHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMnB4IDA7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IHZhcigtLWJvcmRlcikgdHJhbnNwYXJlbnQ7Cn0KCi5kZWNrLXNlYXJjaC1yZXN1bHRzOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiA0cHg7IH0KLmRlY2stc2VhcmNoLXJlc3VsdHM6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogMnB4OyB9CgouZGVjay1zZWFyY2gtZm9vdGVyIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBmbGV4LXNocmluazogMDsKfQoKLyog4pSA4pSAIDcuIFNlYXJjaCBSZXN1bHQgUm93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRlY2stc2VhcmNoLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiA1cHggdmFyKC0tc3AtMyk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLXN1YnRsZSk7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7CiAgICBtaW4taGVpZ2h0OiAzMnB4Owp9CgouZGVjay1zZWFyY2gtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwp9CgouZGVjay1zZWFyY2gtcm93LmluLWRlY2sgewogICAgb3BhY2l0eTogMC41NTsKfQoKLmRlY2stc2VhcmNoLXJvdy5pbi1kZWNrOmhvdmVyIHsKICAgIG9wYWNpdHk6IDAuNzU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7Cn0KCi5kZWNrLXNlYXJjaC1yb3ctbmFtZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG1pbi13aWR0aDogMDsKfQoKLmRlY2stc2VhcmNoLXJvdy1uYW1lOmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1zZWFyY2gtcm93LW1hbmEgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogMnB4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1zZWFyY2gtcm93LW93bmVkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBtaW4td2lkdGg6IDIycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLmRlY2stc2VhcmNoLXJvdy1vd25lZC5oYXMtb3duZWQgewogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmRlY2stc2VhcmNoLXJvdy1hZGQg' +
'ewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgd2lkdGg6IDIycHg7CiAgICBoZWlnaHQ6IDIycHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKICAgIHBhZGRpbmc6IDA7CiAgICBsaW5lLWhlaWdodDogMTsKfQoKLmRlY2stc2VhcmNoLXJvdy1hZGQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stc2VhcmNoLXJvdy5pbi1kZWNrIC5kZWNrLXNlYXJjaC1yb3ctYWRkIHsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NCwgMjIyLCAxMjgsIDAuNCk7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KCi5kZWNrLXNlYXJjaC1yb3cuaW4tZGVjayAuZGVjay1zZWFyY2gtcm93LWFkZDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgovKiBUeXBlIGJhZGdlcyAqLwouZGVjay10eXBlLWJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmc6IDFweCA1cHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBsaW5lLWhlaWdodDogMS40Owp9CgouZGVjay10eXBlLUxhbmQgICAgICAgIHsgYmFja2dyb3VuZDogdmFyKC0td2FybmluZy1kaW0pOyBjb2xvcjogdmFyKC0td2FybmluZyk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjUxLCAxOTEsIDM2LCAwLjMpOyB9Ci5kZWNrLXR5cGUtQ3JlYXR1cmUgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7IGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3NCwgMjIyLCAxMjgsIDAuMjUpOyB9Ci5kZWNrLXR5cGUtSW5zdGFudCAgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjI1KTsgfQouZGVjay10eXBlLVNvcmNlcnkgICAgIHsgYmFja2dyb3VuZDogdmFyKC0tcHVycGxlLWRpbSk7IGNvbG9yOiB2YXIoLS1wdXJwbGUpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE2NywgMTM5LCAyNTAsIDAuMjUpOyB9Ci5kZWNrLXR5cGUtQXJ0aWZhY3QgICAgeyBiYWNrZ3JvdW5kOiByZ2JhKDEzOSwgMTQ4LCAxNTgsIDAuMTUpOyBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDEzOSwgMTQ4LCAxNTgsIDAuMjUpOyB9Ci5kZWNrLXR5cGUtRW5jaGFudG1lbnQgeyBiYWNrZ3JvdW5kOiB2YXIoLS1wdXJwbGUtZGltKTsgY29sb3I6IHZhcigtLXB1cnBsZSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTY3LCAxMzksIDI1MCwgMC4yKTsgfQouZGVjay10eXBlLVBsYW5lc3dhbGtlciB7IGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmctZGltKTsgY29sb3I6IHZhcigtLWdvbGQpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1MiwgMjExLCA3NywgMC4yNSk7IH0KLmRlY2stdHlwZS1PdGhlciAgICAgICB7IGJhY2tncm91bmQ6IHJnYmEoMTM5LCAxNDgsIDE1OCwgMC4xKTsgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxMzksIDE0OCwgMTU4LCAwLjIpOyB9CgovKiDilIDilIAgOC4gTWFuYSBQaXAgRGlzcGxheSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLW1hbmEtY29zdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGdhcDogMnB4OwogICAgYWxpZ24taXRl' +
'bXM6IGNlbnRlcjsKICAgIGZsZXgtd3JhcDogbm93cmFwOwp9CgovKiBNVEcgbWFuYSBwaXAgY29sb3JzIOKAlCBkb21haW4tc3BlY2lmaWMgKi8KLmRlY2stbWFuYS1waXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMTVweDsKICAgIGhlaWdodDogMTVweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGZvbnQtc2l6ZTogOHB4OwogICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLXBpcC1XICB7IGJhY2tncm91bmQ6ICNGOUZBRjQ7IGNvbG9yOiAjMzMzOyB9Ci5kZWNrLXBpcC1VICB7IGJhY2tncm91bmQ6ICMwRTY4QUI7IGNvbG9yOiAjZmZmOyB9Ci5kZWNrLXBpcC1CICB7IGJhY2tncm91bmQ6ICMyYTFmMWE7IGNvbG9yOiAjYzlhMDYwOyBib3JkZXItY29sb3I6ICM1YTNhMWE7IH0KLmRlY2stcGlwLVIgIHsgYmFja2dyb3VuZDogI0QzMjAyQTsgY29sb3I6ICNmZmY7IH0KLmRlY2stcGlwLUcgIHsgYmFja2dyb3VuZDogIzAwNzMzRTsgY29sb3I6ICNmZmY7IH0KLmRlY2stcGlwLUMgIHsgYmFja2dyb3VuZDogIzlhOWE5YTsgY29sb3I6ICNmZmY7IH0KLmRlY2stcGlwLVggIHsgYmFja2dyb3VuZDogIzRhNGE0YTsgY29sb3I6ICNmZmY7IH0KLmRlY2stcGlwLU4gIHsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsgY29sb3I6IHZhcigtLXRleHQpOyBib3JkZXItY29sb3I6IHZhcigtLWJvcmRlcik7IH0KCi8qIOKUgOKUgCA5LiBDZW50ZXIgQ29sdW1uOiBDYXJkIEdyb3VwcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLXBhbmVsLWNhcmRzIHsKICAgIHBhZGRpbmc6IDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIG1pbi1oZWlnaHQ6IDEwMCU7Cn0KCi5kZWNrLWNhcmQtbGlzdC1oZWFkZXIgewogICAgcG9zaXRpb246IHN0aWNreTsKICAgIHRvcDogMDsKICAgIHotaW5kZXg6IDEwOwp9CgouZGVjay1jYXJkLWxpc3QtbWV0YSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGVjay1jYXJkLWxpc3QtYWN0aW9ucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5kZWNrLWNhcmQtZ3JvdXBzIHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSAwOwp9CgovKiBTZWN0aW9uIC8gZ3JvdXAgaGVhZGVyICovCi5kZWNrLXNlY3Rpb24gewogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9CgouZGVjay1zZWN0aW9uLWNvbW1hbmRlciAuZGVjay1zZWN0aW9uLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stc2VjdGlvbi1jb21tYW5kZXIgLmRlY2stc2VjdGlvbi1uYW1lIHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1zZWN0aW9uLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC00KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgcG9zaXRpb246IHN0aWNreTsKICAgIHRvcDogNDBweDsKICAgIHotaW5kZXg6IDk7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgouZGVjay1zZWN0aW9uLWhlYWRlcjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKfQoKLmRlY2stc2VjdGlvbi10b2dnbGUgewogICAgZm9udC1zaXplOiA5cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgdmFyKC0tZWFz' +
'ZSk7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRlY2stc2VjdGlvbi10b2dnbGUuY29sbGFwc2VkIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKC05MGRlZyk7Cn0KCi5kZWNrLXNlY3Rpb24tbmFtZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgZmxleDogMTsKfQoKLmRlY2stc2VjdGlvbi1jb3VudCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmRlY2stc2VjdGlvbi1wcm9ncmVzcyB7CiAgICBmbGV4OiAwIDAgNjBweDsKICAgIGhlaWdodDogNHB4OwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1zZWN0aW9uLXByb2dyZXNzLWZpbGwgewogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgdHJhbnNpdGlvbjogd2lkdGggMC4zcyBlYXNlOwp9CgouZGVjay1zZWN0aW9uLXByb2dyZXNzLWZpbGwuc3RhdHVzLW9rICAgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzKTsgfQouZGVjay1zZWN0aW9uLXByb2dyZXNzLWZpbGwuc3RhdHVzLXdhcm4gICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nKTsgfQouZGVjay1zZWN0aW9uLXByb2dyZXNzLWZpbGwuc3RhdHVzLWxvdyAgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvcik7IH0KLmRlY2stc2VjdGlvbi1wcm9ncmVzcy1maWxsLnN0YXR1cy1vdmVyICAgIHsgYmFja2dyb3VuZDogdmFyKC0tcHVycGxlKTsgfQouZGVjay1zZWN0aW9uLXByb2dyZXNzLWZpbGwuc3RhdHVzLW5ldXRyYWwgeyBiYWNrZ3JvdW5kOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7IH0KCi8qIFNlY3Rpb24gYm9keSAtIGNhcmQgcm93cyAqLwouZGVjay1zZWN0aW9uLWJvZHkgewogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRyYW5zaXRpb246IG1heC1oZWlnaHQgMC4ycyBlYXNlOwp9CgouZGVjay1zZWN0aW9uLWJvZHkuY29sbGFwc2VkIHsKICAgIG1heC1oZWlnaHQ6IDAgIWltcG9ydGFudDsKfQoKLyogQ2FyZCByb3cgaW4gZGVjayAqLwouZGVjay1jYXJkLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0xKSB2YXIoLS1zcC00KTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItc3VidGxlKTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKICAgIG1pbi1oZWlnaHQ6IDI4cHg7Cn0KCi5kZWNrLWNhcmQtcm93OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwp9CgouZGVjay1jYXJkLXJvdy5pcy1jb21tYW5kZXIgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTIsIDIxMSwgNzcsIDAuMDQpOwp9CgouZGVjay1jYXJkLXJvdy5pcy1jb21tYW5kZXIgLmRlY2stY2FyZC1yb3ctbmFtZSB7CiAgICBjb2xvcjogdmFyKC0tZ29sZCk7Cn0KCi5kZWNrLWNhcmQtY29tbWFuZGVyLWJhZGdlIHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC40cHg7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjM1KTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgouZGVjay1jYXJkLXJvdy1uYW1lIHsKICAgIGZsZXg6IDE7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgbWluLXdpZHRoOiAwOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xczsKfQoKLmRlY2stY2FyZC1yb3ctbmFtZTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stY2FyZC1yb3ctbWFuYSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAycHg7CiAgICBhbGlnbi1pdGVtczogY2VudGVy' +
'OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLWNhcmQtcm9sZS1jaGlwIHsKICAgIHBhZGRpbmc6IDFweCA1cHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEzOSwgMTQ4LCAxNTgsIDAuMTIpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTM5LCAxNDgsIDE1OCwgMC4yKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5kZWNrLWNhcmQtcm9sZS1jaGlwOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgovKiBRdWFudGl0eSBjb250cm9scyAqLwouZGVjay1xdHktY29udHJvbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTEpOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLXF0eS1idG4gewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgd2lkdGg6IDE4cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHBhZGRpbmc6IDA7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjEyczsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1xdHktYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7Cn0KCi5kZWNrLXF0eS1udW0gewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgbWluLXdpZHRoOiAxNHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmRlY2stY2FyZC1yZW1vdmUtYnRuIHsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgcGFkZGluZzogMCAycHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgb3BhY2l0eTogMDsKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xMnMsIGNvbG9yIDAuMTJzOwp9CgouZGVjay1jYXJkLXJvdzpob3ZlciAuZGVjay1jYXJkLXJlbW92ZS1idG4gewogICAgb3BhY2l0eTogMTsKfQoKLmRlY2stY2FyZC1yZW1vdmUtYnRuOmhvdmVyIHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7Cn0KCi8qIE93bmVkIGluZGljYXRvciBvbiBjYXJkIHJvd3MgKi8KLmRlY2stY2FyZC1vd25lZC1kb3QgewogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzKTsKICAgIG9wYWNpdHk6IDAuODsKfQoKLmRlY2stY2FyZC1vd25lZC1kb3QudW5vd25lZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBvcGFjaXR5OiAwLjQ7Cn0KCi8qIFF1aWNrIGFkZCByb3cgKi8KLmRlY2stcXVpY2thZGQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTQpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLXF1aWNrYWRkLXdyYXAgewogICAgZmxleDogMTsKICAgIHBvc2l0aW9uOiByZWxhdGl2' +
'ZTsKICAgIG1pbi13aWR0aDogMDsKfQoKLmRlY2stcXVpY2thZGQtaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IDZweCB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgb3V0bGluZTogbm9uZTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSksIGJveC1zaGFkb3cgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgouZGVjay1xdWlja2FkZC1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmRlY2stcXVpY2thZGQtaW5wdXQ6Zm9jdXMgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHZhcigtLWFjY2VudC1nbG93KTsKfQoKLmRlY2stcXVpY2thZGQtZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgei1pbmRleDogNTA7CiAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbGcpOwp9CgouZGVjay1xdWlja2FkZC1pdGVtIHsKICAgIHBhZGRpbmc6IDdweCB2YXIoLS1zcC0zKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItc3VidGxlKTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xczsKfQoKLmRlY2stcXVpY2thZGQtaXRlbTpob3ZlciwKLmRlY2stcXVpY2thZGQtaXRlbS5hY3RpdmUgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stcXVpY2thZGQtaXRlbTpsYXN0LWNoaWxkIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7Cn0KCi5kZWNrLXF1aWNrYWRkLWl0ZW0tbmFtZSB7CiAgICBmbGV4OiAxOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmRlY2stcXVpY2thZGQtaXRlbS10eXBlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmbGV4LXNocmluazogMDsKfQoKLyogU3RhdHMgZm9vdGVyICovCi5kZWNrLXN0YXRzLWZvb3RlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTQpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLXN0YXQtcGlsbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgZ2FwOiB2YXIoLS1zcC0xKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTEpIHZhcigtLXNwLTMpOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7Cn0KCi5kZWNrLXN0YXQtcGlsbC1udW0gewogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmRlY2stc3RhdC1vd25lZCB7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KCi5kZWNrLXN0YXQtcGlsbC1sYWJlbCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGxldHRl' +
'ci1zcGFjaW5nOiAwLjRweDsKfQoKLyog4pSA4pSAIDEwLiBSaWdodCBDb2x1bW46IFJhdGlvIERhc2hib2FyZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLXJhdGlvLWJhcnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IHZhcigtLXNwLTIpOwp9CgouZGVjay1yYXRpby1wbGFjZWhvbGRlciB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgMDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLmRlY2stcmF0aW8tYmFyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMSkgdmFyKC0tc3AtMik7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmRlY2stcmF0aW8tYmFyLXJvdzpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKfQoKLmRlY2stcmF0aW8tYmFyLXJvdy5hY3RpdmUtZmlsdGVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwogICAgb3V0bGluZTogMXB4IHNvbGlkIHZhcigtLWFjY2VudC1nbG93KTsKfQoKLmRlY2stcmF0aW8tYmFyLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB3aWR0aDogODBweDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLmRlY2stcmF0aW8tYmFyLXRyYWNrIHsKICAgIGZsZXg6IDE7CiAgICBoZWlnaHQ6IDhweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZGVjay1yYXRpby1iYXItZmlsbCB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjM1cyBlYXNlOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZGVjay1yYXRpby1iYXItZmlsbC5zdGF0dXMtb2sgICAgICB7IGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOyB9Ci5kZWNrLXJhdGlvLWJhci1maWxsLnN0YXR1cy13YXJuICAgIHsgYmFja2dyb3VuZDogdmFyKC0td2FybmluZyk7IH0KLmRlY2stcmF0aW8tYmFyLWZpbGwuc3RhdHVzLWxvdyAgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvcik7IH0KLmRlY2stcmF0aW8tYmFyLWZpbGwuc3RhdHVzLW92ZXIgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1wdXJwbGUpOyB9Ci5kZWNrLXJhdGlvLWJhci1maWxsLnN0YXR1cy1uZXV0cmFsIHsgYmFja2dyb3VuZDogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOyB9CgovKiBUYXJnZXQgcmFuZ2UgaW5kaWNhdG9yIGxpbmVzICovCi5kZWNrLXJhdGlvLWJhci10YXJnZXQtbWluLAouZGVjay1yYXRpby1iYXItdGFyZ2V0LW1heCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IC0ycHg7CiAgICBib3R0b206IC0ycHg7CiAgICB3aWR0aDogMnB4OwogICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI1KTsKICAgIHotaW5kZXg6IDE7Cn0KCi5kZWNrLXJhdGlvLWJhci1udW1zIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB3aWR0aDogNTBweDsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouZGVjay1yYXRpby1iYXItbnVtcyAuZGVjay1yYXRpby1jdXJyZW50IHsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi8qIOKUgOKUgCAxMS4gRml4IE15IFJhdGlvcyBTZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgCAqLwoKLmRlY2stc2hvcnRmYWxscyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogdmFyKC0tc3AtMSk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKfQoKLmRlY2stc2hvcnRmYWxsLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiA1cHggdmFyKC0tc3AtMik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmRlY2stc2hvcnRmYWxsLWljb24gewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLXNob3J0ZmFsbC10ZXh0IHsKICAgIGZsZXg6IDE7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5kZWNrLXNob3J0ZmFsbC1kZWx0YSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgcGFkZGluZzogMXB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1zaG9ydGZhbGwtZGVsdGEubmVlZHMtbW9yZSB7CiAgICBjb2xvcjogdmFyKC0td2FybmluZyk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nLWRpbSk7Cn0KCi5kZWNrLXNob3J0ZmFsbC1kZWx0YS5vdmVyLWNvdW50IHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwp9CgouZGVjay1zaG9ydGZhbGwtZGVsdGEub24tdGFyZ2V0IHsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MtZGltKTsKfQoKLmRlY2stZml4LXN1Z2dlc3Rpb25zIHsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTIpOwp9CgouZGVjay1maXgtZ3JvdXAgewogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMyk7Cn0KCi5kZWNrLWZpeC1ncm91cC10aXRsZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0xKTsKICAgIHBhZGRpbmc6IDAgMnB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47Cn0KCi5kZWNrLWZpeC1jYXJkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIHBhZGRpbmc6IDVweCB2YXIoLS1zcC0yKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIG1hcmdpbi1ib3R0b206IDNweDsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5kZWNrLWZpeC1jYXJkOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stZml4LWNhcmQtbmFtZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIG1pbi13aWR0aDogMDsKfQoKLmRlY2stZml4LWNhcmQtbmFtZTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stZml4LWNhcmQtb3duZWQgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiDilIDilIAgMTIuIEVESFJFQyBSZWNvbW1lbmRhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGVjay1lZGhyZWMtY29udHJvbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0' +
'aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nLWJvdHRvbTogdmFyKC0tc3AtMyk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTMpOwp9CgouZGVjay1lZGhyZWMtbGlzdCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogM3B4Owp9CgouZGVjay1lZGhyZWMtYnVsayB7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0zKTsKICAgIHBhZGRpbmctdG9wOiB2YXIoLS1zcC0zKTsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwp9CgouZGVjay1lZGhyZWMtY2FyZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiA1cHggdmFyKC0tc3AtMik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpLCBiYWNrZ3JvdW5kIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmRlY2stZWRocmVjLWNhcmQ6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQtZ2xvdyk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKfQoKLmRlY2stZWRocmVjLWNhcmQuaW4tZGVjayB7CiAgICBvcGFjaXR5OiAwLjU7CiAgICBib3JkZXItY29sb3I6IHJnYmEoNzQsIDIyMiwgMTI4LCAwLjMpOwp9CgouZGVjay1lZGhyZWMtY2FyZC1tYWluIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5kZWNrLWVkaHJlYy1jYXJkLW5hbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7Cn0KCi5kZWNrLWVkaHJlYy1jYXJkLW5hbWU6aG92ZXIgewogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5kZWNrLWVkaHJlYy1jYXJkLW1ldGEgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLmRlY2stZWRocmVjLXBjdCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGVjay1lZGhyZWMtcGN0IHN0cm9uZyB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stZWRocmVjLXN5bmVyZ3kgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmRlY2stZWRocmVjLXN5bmVyZ3kucG9zaXRpdmUgewogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgouZGVjay1vd25lZC1iYWRnZSB7CiAgICBmb250LXNpemU6IDlweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcy1kaW0pOwogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg3NCwgMjIyLCAxMjgsIDAuMyk7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7Cn0KCi8qIOKUgOKUgCAxMy4gVG9nZ2xlIFN3aXRjaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLXRvZ2dsZS1sYWJlbCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGVjay10b2dnbGUtY2hlY2sgewogICAgZGlzcGxh' +
'eTogbm9uZTsKfQoKLmRlY2stdG9nZ2xlLXRyYWNrIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAxOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDlweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay10b2dnbGUtdGh1bWIgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiAycHg7CiAgICBsZWZ0OiAycHg7CiAgICB3aWR0aDogMTRweDsKICAgIGhlaWdodDogMTRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzLCBiYWNrZ3JvdW5kIDAuMnM7Cn0KCi5kZWNrLXRvZ2dsZS1jaGVjazpjaGVja2VkICsgLmRlY2stdG9nZ2xlLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1nbG93KTsKfQoKLmRlY2stdG9nZ2xlLWNoZWNrOmNoZWNrZWQgKyAuZGVjay10b2dnbGUtdHJhY2sgLmRlY2stdG9nZ2xlLXRodW1iIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxNHB4KTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7Cn0KCi8qIOKUgOKUgCAxNC4gQ2FyZCBQcmV2aWV3IFRvb2x0aXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGVjay1jYXJkLXByZXZpZXcgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgei1pbmRleDogNjA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgYm94LXNoYWRvdzogMCAxNnB4IDQ4cHggcmdiYSgwLCAwLCAwLCAwLjgpOwogICAgd2lkdGg6IDE4MHB4OwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzOwp9CgouZGVjay1jYXJkLXByZXZpZXctaW1nIHsKICAgIHdpZHRoOiAxMDAlOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwp9CgovKiDilIDilIAgMTUuIFRvYXN0IE5vdGlmaWNhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGVjay10b2FzdC1jb250YWluZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgYm90dG9tOiB2YXIoLS1zcC01KTsKICAgIHJpZ2h0OiB2YXIoLS1zcC01KTsKICAgIHotaW5kZXg6IDUwMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgouZGVjay10b2FzdCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC00KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIG1pbi13aWR0aDogMjQwcHg7CiAgICBtYXgtd2lkdGg6IDM2MHB4OwogICAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LWxnKTsKICAgIGFuaW1hdGlvbjogZGVjay10b2FzdC1pbiAwLjJzIGVhc2U7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoKLmRlY2stdG9hc3QudG9hc3Qtc3VjY2VzcyB7IGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgfQouZGVjay10b2FzdC50b2FzdC1lcnJvciAgIHsgYm9yZGVyLWxlZnQtY29sb3I6IHZhcigtLWVycm9yKTsgfQouZGVjay10b2FzdC50b2FzdC13YXJuaW5nIHsgYm9yZGVyLWxlZnQtY29sb3I6IHZhcigtLXdhcm5pbmcpOyB9Ci5kZWNrLXRvYXN0LnRvYXN0LWluZm8gICAgeyBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0tYWNjZW50KTsgfQoKLmRlY2stdG9hc3QtaWNvbiB7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRlY2st' +
'dG9hc3QtdGV4dCB7CiAgICBmbGV4OiAxOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLmRlY2stdG9hc3QucmVtb3ZpbmcgewogICAgYW5pbWF0aW9uOiBkZWNrLXRvYXN0LW91dCAwLjJzIGVhc2UgZm9yd2FyZHM7Cn0KCkBrZXlmcmFtZXMgZGVjay10b2FzdC1pbiB7CiAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwcHgpOyB9CiAgICB0byAgIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyB9Cn0KCkBrZXlmcmFtZXMgZGVjay10b2FzdC1vdXQgewogICAgZnJvbSB7IG9wYWNpdHk6IDE7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsgfQogICAgdG8gICB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWCgyMHB4KTsgfQp9CgovKiDilIDilIAgMTYuIE1vZGFsIC8gRGlhbG9nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRlY2stbW9kYWwtb3ZlcmxheSB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43Mik7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDRweCk7CiAgICB6LWluZGV4OiAxMDAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGFuaW1hdGlvbjogZGVjay1tb2RhbC1iZy1pbiAwLjE1cyBlYXNlOwp9CgpAa2V5ZnJhbWVzIGRlY2stbW9kYWwtYmctaW4gewogICAgZnJvbSB7IG9wYWNpdHk6IDA7IH0KICAgIHRvICAgeyBvcGFjaXR5OiAxOyB9Cn0KCi5kZWNrLW1vZGFsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcpOwogICAgd2lkdGg6IDkwJTsKICAgIG1heC13aWR0aDogNDYwcHg7CiAgICBtYXgtaGVpZ2h0OiA4NXZoOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIGFuaW1hdGlvbjogZGVjay1tb2RhbC1pbiAwLjJzIGVhc2U7CiAgICBib3gtc2hhZG93OiAwIDI0cHggNjRweCByZ2JhKDAsIDAsIDAsIDAuOCk7Cn0KCi5kZWNrLW1vZGFsLXdpZGUgewogICAgbWF4LXdpZHRoOiA2MDBweDsKfQoKQGtleWZyYW1lcyBkZWNrLW1vZGFsLWluIHsKICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTEycHgpIHNjYWxlKDAuOTcpOyB9CiAgICB0byAgIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOyB9Cn0KCi5kZWNrLW1vZGFsLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTQpIHZhcigtLXNwLTUpIHZhcigtLXNwLTMpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5kZWNrLW1vZGFsLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTVweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogI2ZmZjsKICAgIG1hcmdpbjogMDsKfQoKLmRlY2stbW9kYWwtY2xvc2UtYnRuIHsKICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgcGFkZGluZzogMnB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICB0cmFuc2l0aW9uOiBjb2xvciB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSksIGJhY2tncm91bmQgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5kZWNrLW1vZGFsLWNsb3NlLWJ0bjpob3ZlciB7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQoKLmRlY2stbW9kYWwtYm9keSB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC00KSB2YXIoLS1zcC01KTsKfQoKLmRlY2stbW9kYWwtZm9vdGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwog' +
'ICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTUpIHZhcigtLXNwLTQpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5kZWNrLWNvbmZpcm0tbWVzc2FnZSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi5kZWNrLWNvbmZpcm0tY2hhbmdlcyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC00KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0xKTsKfQoKLmRlY2stY29uZmlybS1jaGFuZ2Utcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgcGFkZGluZzogMnB4IDA7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLXN1YnRsZSk7Cn0KCi5kZWNrLWNvbmZpcm0tY2hhbmdlLXJvdzpsYXN0LWNoaWxkIHsKICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMSk7Cn0KCi5kZWNrLWNvbmZpcm0tY2hhbmdlLWxhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5kZWNrLWNvbmZpcm0tY2hhbmdlLXZhbCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5kZWNrLWNvbmZpcm0tY2hhbmdlLXZhbC5wb3NpdGl2ZSB7IGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgfQouZGVjay1jb25maXJtLWNoYW5nZS12YWwubmVnYXRpdmUgeyBjb2xvcjogdmFyKC0tZXJyb3IpOyB9CgovKiDilIDilIAgMTcuIEZvcm0gZmllbGRzIChOZXcgRGVjayBNb2RhbCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGVjay1mb3JtLWZpZWxkIHsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTQpOwp9CgouZGVjay1mb3JtLWxhYmVsIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMik7Cn0KCi5kZWNrLWZvcm0taW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiA5cHggdmFyKC0tc3AtNCk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpLCBib3gtc2hhZG93IHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmRlY2stZm9ybS1pbnB1dDo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmRlY2stZm9ybS1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tYWNjZW50LWdsb3cpOwp9CgouZGVjay1jb21tYW5kZXItc2VhcmNoLXdyYXAgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZGVjay1jb21tYW5kZXItZHJvcGRvd24gewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpOwogICAgbGVmdDogMDsKICAgIHJpZ2h0OiAwOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwog' +
'ICAgei1pbmRleDogNTA7CiAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbGcpOwp9CgouZGVjay1jb21tYW5kZXItb3B0aW9uIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTQpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1zdWJ0bGUpOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwp9CgouZGVjay1jb21tYW5kZXItb3B0aW9uOmhvdmVyLAouZGVjay1jb21tYW5kZXItb3B0aW9uLmFjdGl2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVjay1jb21tYW5kZXItb3B0aW9uOmxhc3QtY2hpbGQgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLmRlY2stY29tbWFuZGVyLW9wdGlvbi1uYW1lIHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouZGVjay1jb21tYW5kZXItb3B0aW9uLWNvbG9yIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDJweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1uZXctY29tbWFuZGVyLXNlbGVjdGVkIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWFjY2VudC1nbG93KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7Cn0KCi5kZWNrLXNlbGVjdGVkLWNvbW1hbmRlci1uYW1lIHsKICAgIGZsZXg6IDE7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5kZWNrLWNsZWFyLWNvbW1hbmRlci1idG4gewogICAgYmFja2dyb3VuZDogbm9uZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBwYWRkaW5nOiAwOwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICB0cmFuc2l0aW9uOiBjb2xvciB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5kZWNrLWNsZWFyLWNvbW1hbmRlci1idG46aG92ZXIgewogICAgY29sb3I6IHZhcigtLWVycm9yKTsKfQoKLyog4pSA4pSAIDE4LiBFbXB0eSBTdGF0ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGVjay1lbXB0eS1zdGF0ZSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC04KSB2YXIoLS1zcC00KTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLmRlY2stZW1wdHktc3RhdGUtbGcgewogICAgcGFkZGluZzogdmFyKC0tc3AtMTYpIHZhcigtLXNwLTYpOwp9CgouZGVjay1lbXB0eS1pY29uIHsKICAgIGZvbnQtc2l6ZTogMzJweDsKICAgIG9wYWNpdHk6IDAuMzsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgouZGVjay1lbXB0eS1zdGF0ZS1sZyAuZGVjay1lbXB0eS1pY29uIHsKICAgIGZvbnQtc2l6ZTogNDhweDsKfQoKLmRlY2stZW1wdHktdGV4dCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWF4LXdpZHRoOiAyMjBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi8qIOKUgOKUgCAxOS4gTG9hZGluZyAvIFNrZWxldG9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRlY2stc2tlbGV0b24gewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KAogICAgICAgIDkwZGVnLAogICAgICAgIHZhcigtLXN1cmZhY2UtMSkgMjUlLAogICAgICAgIHZhcigtLXN1cmZhY2UtMykgNTAlLAogICAgICAgIHZhcigtLXN1cmZhY2UtMSkgNzUlCiAgICApOwogICAgYmFja2dyb3VuZC1zaXplOiAyMDAlIDEwMCU7CiAgICBhbmltYXRpb246IGRlY2stc2hpbW1lciAxLjRzIGluZmluaXRlOwogICAgYm9yZGVyLXJhZGl1czogNHB4Owp9CgpAa2V5ZnJhbWVzIGRlY2stc2hpbW1lciB7CiAgICAwJSAgIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMjAwJSAwOyB9CiAgICAxMDAlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwMCUgMDsgfQp9CgouZGVjay1za2VsZXRvbi1yb3cgewogICAgaGVpZ2h0OiAyOHB4OwogICAgbWFyZ2luOiB2YXIoLS1zcC0xKSB2YXIoLS1zcC00KTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLmRlY2stbG9hZGluZy1zcGlubmVyIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBhbmltYXRpb246IGRlY2stc3BpbiAwLjZzIGxpbmVhciBpbmZpbml0ZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgpAa2V5ZnJhbWVzIGRlY2stc3BpbiB7CiAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KfQoKLmRlY2stbG9hZGluZy1pbmxpbmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC01KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi8qIOKUgOKUgCAyMC4gU2Nyb2xsYmFyIHRoaW4gc3R5bGUgZm9yIGlubmVyIGxpc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRlY2stZWRocmVjLWxpc3QsCi5kZWNrLWZpeC1zdWdnZXN0aW9ucyB7CiAgICBtYXgtaGVpZ2h0OiAyNjBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IHZhcigtLWJvcmRlcikgdHJhbnNwYXJlbnQ7Cn0KCi5kZWNrLWVkaHJlYy1saXN0Ojotd2Via2l0LXNjcm9sbGJhciwKLmRlY2stZml4LXN1Z2dlc3Rpb25zOjotd2Via2l0LXNjcm9sbGJhciB7CiAgICB3aWR0aDogNHB4Owp9CgouZGVjay1lZGhyZWMtbGlzdDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIsCi5kZWNrLWZpeC1zdWdnZXN0aW9uczo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLyog4pSA4pSAIDIxLiBNYW5hIGN1cnZlIHNwYXJrbGluZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLW1hbmEtY3VydmUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgIGdhcDogM3B4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgcGFkZGluZzogMCAycHg7Cn0KCi5kZWNrLWN1cnZlLWJhciB7CiAgICBmbGV4OiAxOwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWdsb3cpOwogICAgYm9yZGVyLXJhZGl1czogMnB4IDJweCAwIDA7CiAgICBtaW4taGVpZ2h0OiAycHg7CiAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMC4zcyBlYXNlOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZGVjay1jdXJ2ZS1iYXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stY3VydmUtYmFyLWxhYmVsIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJvdHRvbTogLTE0cHg7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICBmb250LXNpemU6IDhweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgovKiDilIDilIAgMjIu' +
'IEltcG9ydCBTdGF0dXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGVjay1pbXBvcnQtc3RhdHVzIHsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTMpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgZm9udC1zaXplOiAxM3B4Owp9CgovKiDilIDilIAgMjMuIFJlc3BvbnNpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpAbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7CiAgICAuZGVjay1jb2wtcmlnaHQgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDEwMDBweCkgewogICAgLmRlY2stbWFpbiB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIH0KCiAgICAuZGVjay1jb2wtbGVmdCwKICAgIC5kZWNrLWNvbC1jZW50ZXIsCiAgICAuZGVjay1jb2wtcmlnaHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIH0KCiAgICAuZGVjay1jb2wtbGVmdCB7CiAgICAgICAgbWF4LWhlaWdodDogNjB2aDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgfQoKICAgIC5kZWNrLWNvbC1jZW50ZXIgewogICAgICAgIG1pbi1oZWlnaHQ6IHVuc2V0OwogICAgfQoKICAgIC5kZWNrLWNvbC1yaWdodCB7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgfQoKICAgIC5kZWNrLXRvcGJhciB7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICAgICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICB9CgogICAgLmRlY2stdG9wYmFyLWNlbnRlciB7CiAgICAgICAgb3JkZXI6IDI7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICB9CgogICAgLmRlY2stdG9wYmFyLWFjdGlvbnMgewogICAgICAgIG9yZGVyOiAzOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgfQoKICAgIC5kZWNrLW5hbWUtaW5wdXQgewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgIH0KfQoKQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAuZGVjay10b3BiYXItY29tbWFuZGVyIHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLmRlY2stbmF2LWxpbmtzIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5kZWNrLWNvbG9yLWNoaXBzIHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICB9CgogICAgLmRlY2stbW9kYWwgewogICAgICAgIHdpZHRoOiA5NSU7CiAgICAgICAgbWF4LXdpZHRoOiBub25lOwogICAgICAgIG1hcmdpbjogdmFyKC0tc3AtMyk7CiAgICB9CgogICAgLmRlY2stY2FyZC1wcmV2aWV3IHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmRlY2stY29sLWxlZnQgewogICAgICAgIG1heC1oZWlnaHQ6IDQ1dmg7CiAgICB9Cn0KCi8qIOKUgOKUgCAyNC4gVXRpbGl0eSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZWNrLXZpc3VhbGx5LWhpZGRlbiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB3aWR0aDogMXB4OwogICAgaGVpZ2h0OiAxcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgY2xpcDogcmVjdCgwLDAsMCwwKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5kZWNrLWRpdmlkZXIgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOwogICAgbWFyZ2luOiB2YXIoLS1zcC0yKSAwOwp9CgouZGVjay10ZXh0LW11dGVkIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi5kZWNrLXRleHQtYWNjZW50IHsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGVj' +
'ay10ZXh0LXN1Y2Nlc3MgewogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgouZGVjay10ZXh0LWRhbmdlciB7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwp9CgouZGVjay10ZXh0LXdhcm5pbmcgewogICAgY29sb3I6IHZhcigtLXdhcm5pbmcpOwp9CgovKiDilIDilIAgMjAuIEFJIFBhbmVsIFN0eWxlcyAoUGVycGxleGl0eSBSZXNlYXJjaC9HZW5lcmF0ZSkg4pSA4pSA4pSA4pSAICovCgouZGVjay1wYW5lbC1haSAuZGVjay1wYW5lbC1oZWFkZXIgewogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tc3VyZmFjZS0xKSA3MCUsIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjEpKTsKfQoKLmRlY2stcGFuZWwtYWkgLmRlY2stcGFuZWwtdGl0bGUgewogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5kZWNrLWFpLWNvbnRyb2xzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKfQoKLmRlY2stYWktcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICBnYXA6IHZhcigtLXNwLTMpOwp9CgouZGVjay1mb3JtLWZpZWxkLXNtIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5kZWNrLWZvcm0tZmllbGQtaGFsZiB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgouZGVjay1mb3JtLWxhYmVsLXNtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLWJvdHRvbTogNHB4Owp9CgouZGVjay1mb3JtLWlucHV0LXNtIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgIG91dGxpbmU6IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpLCBib3gtc2hhZG93IHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmRlY2stZm9ybS1pbnB1dC1zbTo6cGxhY2Vob2xkZXIgewogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmRlY2stZm9ybS1pbnB1dC1zbTpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tYWNjZW50LWdsb3cpOwp9CgouZGVjay10b2dnbGUtbGFiZWwtc20gewogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHBhZGRpbmctYm90dG9tOiA0cHg7Cn0KCi5kZWNrLWJ0bi1haSB7CiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDkxLCAxNTgsIDI0MCwgMC4xNSksIHJnYmEoMTM5LCA5MiwgMjQ2LCAwLjE1KSk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMzUpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTIpOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmRlY2stYnRuLWFpOjpiZWZvcmUgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBpbnNldDogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoOTEsIDE1OCwgMjQwLCAwLjA4KSwgcmdiYSgxMzksIDkyLCAyNDYsIDAuMTIpKTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7Cn0KCi5kZWNrLWJ0bi1haTpob3Zlcjpub3QoOmRpc2FibGVkKTo6YmVmb3JlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5kZWNrLWJ0bi1haTpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMTZweCByZ2JhKDkxLCAxNTgsIDI0MCwgMC4yKTsKfQoKLmRlY2stYnRuLWFpOmRpc2FibGVkIHsK' +
'ICAgIG9wYWNpdHk6IDAuNDsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7Cn0KCi8qIEFJIExvYWRpbmcgU3Bpbm5lciAqLwouZGVjay1haS1sb2FkaW5nIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTQpIDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgouZGVjay1haS1zcGlubmVyIHsKICAgIHdpZHRoOiAyMHB4OwogICAgaGVpZ2h0OiAyMHB4OwogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBhbmltYXRpb246IGFpLXNwaW4gMC44cyBsaW5lYXIgaW5maW5pdGU7CiAgICBmbGV4LXNocmluazogMDsKfQoKQGtleWZyYW1lcyBhaS1zcGluIHsKICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQp9CgovKiBBSSBSZXN1bHRzICovCi5kZWNrLWFpLXJlc3VsdHMgewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMyk7Cn0KCi5kZWNrLWFpLXNlY3Rpb24gewogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNCk7Cn0KCi5kZWNrLWFpLXNlY3Rpb24tdGl0bGUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTIpOwogICAgcGFkZGluZy1ib3R0b206IDRweDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwp9CgouZGVjay1haS1yYXRpbmcgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMyk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoKLmRlY2stYWktcmF0aW5nLW51bSB7CiAgICBmb250LXNpemU6IDI4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5kZWNrLWFpLXJhdGluZy1udW0ubG93ICB7IGNvbG9yOiB2YXIoLS1lcnJvcik7IH0KLmRlY2stYWktcmF0aW5nLW51bS5taWQgIHsgY29sb3I6IHZhcigtLXdhcm5pbmcpOyB9Ci5kZWNrLWFpLXJhdGluZy1udW0uaGlnaCB7IGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsgfQoKLmRlY2stYWktcmF0aW5nLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgouZGVjay1haS1saXN0IHsKICAgIGxpc3Qtc3R5bGU6IG5vbmU7CiAgICBwYWRkaW5nOiAwOwogICAgbWFyZ2luOiAwOwp9CgouZGVjay1haS1saXN0IGxpIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBhZGRpbmc6IDRweCAwOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNCk7CiAgICBsaW5lLWhlaWdodDogMS40Owp9CgouZGVjay1haS1saXN0IGxpOmxhc3QtY2hpbGQgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLmRlY2stYWktbGlzdCBsaTo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICdcMjAyMic7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWFyZ2luLXJpZ2h0OiA2cHg7Cn0KCi8qIEN1dHMgLyBBZGRzIGNhcmQgcm93cyAqLwouZGVjay1haS1jYXJkLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiA1cHggdmFyKC0tc3AtMik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBtYXJnaW4tYm90dG9tOiAzcHg7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9' +
'CgouZGVjay1haS1jYXJkLXJvdzpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudC1nbG93KTsKfQoKLmRlY2stYWktY2FyZC1yb3cuY3V0LXJvdyB7CiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLWVycm9yKTsKfQoKLmRlY2stYWktY2FyZC1yb3cuYWRkLXJvdyB7CiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOwp9CgouZGVjay1haS1jYXJkLW5hbWUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5kZWNrLWFpLWNhcmQtbmFtZTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLmRlY2stYWktY2FyZC1yb2xlIHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7CiAgICBwYWRkaW5nOiAxcHggNXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1haS1jYXJkLXByaWNlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRlY2stYWktY2FyZC1yZWFzb24gewogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7Cn0KCi5kZWNrLWFpLWNhcmQtb3duZWQtYmFkZ2UgewogICAgZm9udC1zaXplOiA4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgcGFkZGluZzogMXB4IDRweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNzQsIDIyMiwgMTI4LCAwLjMpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuM3B4Owp9CgouZGVjay1haS1jYXJkLWFkZC1idG4gewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiAycHggNnB4OwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZmxleC1zaHJpbms6IDA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmRlY2stYWktY2FyZC1hZGQtYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MtZGltKTsKfQoKLmRlY2stYWktbm90ZXMgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSAwOwp9CgouZGVjay1haS10b3RhbCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMik7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGVjay1haS10b3RhbCBzdHJvbmcgewogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgovKiBBSSBHZW5lcmF0ZSDigJQgQ29tbWFuZGVyIHNlYXJjaCBkcm9wZG93biAqLwouZGVjay1haS1jb21tYW5kZXItd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5kZWNrLWFpLWNvbW1hbmRlci1kcm9wZG93' +
'biB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IGNhbGMoMTAwJSArIDRweCk7CiAgICBsZWZ0OiAwOwogICAgcmlnaHQ6IDA7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICB6LWluZGV4OiA1MDsKICAgIG1heC1oZWlnaHQ6IDE4MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1sZyk7Cn0KCi5kZWNrLWFpLWNvbW1hbmRlci1vcHRpb24gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnM7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5kZWNrLWFpLWNvbW1hbmRlci1vcHRpb246aG92ZXIsCi5kZWNrLWFpLWNvbW1hbmRlci1vcHRpb24uYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwp9CgouZGVjay1haS1jb21tYW5kZXItb3B0aW9uLW5hbWUgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5kZWNrLWFpLWNvbW1hbmRlci1zZWxlY3RlZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQtZ2xvdyk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5kZWNrLWFpLWNvbW1hbmRlci1zZWxlY3RlZCAuZGVjay1jbGVhci1jb21tYW5kZXItYnRuIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHBhZGRpbmc6IDAgMnB4Owp9CgouZGVjay1haS1jb21tYW5kZXItc2VsZWN0ZWQgLmRlY2stY2xlYXItY29tbWFuZGVyLWJ0bjpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwp9CgovKiBBSSBHZW5lcmF0ZSDigJQgQXBwbHkgdG8gRGVjayBidXR0b24gKi8KLmRlY2stYnRuLWFwcGx5LWFpIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSg3NCwgMjIyLCAxMjgsIDAuNCk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMyk7Cn0KCi5kZWNrLWJ0bi1hcHBseS1haTpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc0LCAyMjIsIDEyOCwgMC4yNSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgYm94LXNoYWRvdzogMCAwIDEycHggdmFyKC0tc3VjY2Vzcy1kaW0pOwp9CgovKiBBSSBlcnJvciBtZXNzYWdlICovCi5kZWNrLWFpLWVycm9yIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSAwOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLyogU3RyYXRlZ3kgdGV4dCBibG9jayAqLwouZGVjay1haS1zdHJhdGVneSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKfQoKLyogU3RhdHMgcm93IGZvciBnZW5lcmF0ZWQgZGVjayAqLwouZGVjay1haS1zdGF0cyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAg' +
'IGZsZXgtd3JhcDogd3JhcDsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTMpOwp9CgouZGVjay1haS1zdGF0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogNjBweDsKfQoKLmRlY2stYWktc3RhdC12YWx1ZSB7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgouZGVjay1haS1zdGF0LWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC40cHg7Cn0KCi8qIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAogICBBSSBEZWVwIEFuYWx5c2lzIOKAlCBSZXNlYXJjaCBSZXN1bHRzIFN0eWxlcwogICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KCi8qIOKUgOKUgCBIZWFkZXIgUm93OiBSYXRpbmcgKyBCcmFja2V0ICsgQXJjaGV0eXBlIGlubGluZSDilIDilIDilIDilIAgKi8KLmRlY2stYWktaGVhZGVyLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMyk7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1zcC0zKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwp9CgouZGVjay1haS1yYXRpbmctc3VibGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBtYXJnaW4tbGVmdDogMXB4Owp9CgovKiDilIDilIAgQnJhY2tldCBCYWRnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRlY2stYWktYnJhY2tldC1iYWRnZSB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgcGFkZGluZzogM3B4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiAyMHB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1haS1icmFja2V0LWJhZGdlLmJyYWNrZXQtMSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDc0LCAyMjIsIDEyOCwgMC4xNSk7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDc0LCAyMjIsIDEyOCwgMC4zKTsKfQoKLmRlY2stYWktYnJhY2tldC1iYWRnZS5icmFja2V0LTIgewogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMTUpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDkxLCAxNTgsIDI0MCwgMC4zKTsKfQoKLmRlY2stYWktYnJhY2tldC1iYWRnZS5icmFja2V0LTMgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTEsIDE5MSwgMzYsIDAuMTUpOwogICAgY29sb3I6IHZhcigtLXdhcm5pbmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTEsIDE5MSwgMzYsIDAuMyk7Cn0KCi5kZWNrLWFpLWJyYWNrZXQtYmFkZ2UuYnJhY2tldC00IHsKICAgIGJhY2tncm91bmQ6IHJn' +
'YmEoMjQ4LCAxMTMsIDExMywgMC4xNSk7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNDgsIDExMywgMTEzLCAwLjMpOwp9CgovKiDilIDilIAgQXJjaGV0eXBlIEJhZGdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGVjay1haS1hcmNoZXR5cGUtYmFkZ2UgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHBhZGRpbmc6IDNweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXB1cnBsZS1kaW0pOwogICAgY29sb3I6IHZhcigtLXB1cnBsZSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDE2NywgMTM5LCAyNTAsIDAuMyk7CiAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiDilIDilIAgUmF0aW5nIEV4cGxhbmF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGVjay1haS1yYXRpbmctZXhwbGFuYXRpb24gewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTEpIDAgdmFyKC0tc3AtMik7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLXN1YnRsZSk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLyog4pSA4pSAIEJyYWNrZXQgRGV0YWlsIGJsb2NrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGVjay1haS1icmFja2V0LWRldGFpbCB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKfQoKLyog4pSA4pSAIFdpbiBDb25kaXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGVjay1haS13aW5jb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLmRlY2stYWktd2luY29uLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLmRlY2stYWktd2luY29uLW5hbWUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmRlY2stYWktd2luY29uLWNhcmRzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDRweDsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTEpOwp9CgovKiDilIDilIAgUmVsaWFiaWxpdHkgQmFkZ2UgKGhpZ2gvbWlkL2xvdykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZWNrLWFpLXJlbGlhYmlsaXR5LWJhZGdlIHsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHBhZGRpbmc6IDJweCA3cHg7CiAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGVjay1haS1yZWxpYWJpbGl0eS1iYWRnZS5oaWdoIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzQsIDIyMiwgMTI4LCAwLjE1' +
'KTsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNzQsIDIyMiwgMTI4LCAwLjMpOwp9CgouZGVjay1haS1yZWxpYWJpbGl0eS1iYWRnZS5taWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTEsIDE5MSwgMzYsIDAuMTUpOwogICAgY29sb3I6IHZhcigtLXdhcm5pbmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTEsIDE5MSwgMzYsIDAuMyk7Cn0KCi5kZWNrLWFpLXJlbGlhYmlsaXR5LWJhZGdlLmxvdyB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuMTUpOwogICAgY29sb3I6IHZhcigtLWVycm9yKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjQ4LCAxMTMsIDExMywgMC4zKTsKfQoKLyog4pSA4pSAIENhcmQgQ2hpcCAoaW5saW5lIGNhcmQgcmVmZXJlbmNlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZWNrLWFpLWNhcmQtY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgcGFkZGluZzogMnB4IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDkxLCAxNTgsIDI0MCwgMC4yKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KCi5kZWNrLWFpLWNhcmQtY2hpcC13YXJuIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWVycm9yLWRpbSk7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuMjUpOwp9CgovKiDilIDilIAgU3luZXJneSBQYWNrYWdlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRlY2stYWktc3luZXJneS1wa2cgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLmRlY2stYWktc3luZXJneS1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMik7Cn0KCi5kZWNrLWFpLXN5bmVyZ3ktbmFtZSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgovKiDilIDilIAgVGhyZWF0IEFzc2Vzc21lbnQgKGdhbWUgcGhhc2VzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRlY2stYWktcGhhc2VzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKfQoKLmRlY2stYWktcGhhc2UgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtMyk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0Owp9CgouZGVjay1haS1waGFzZS1sYWJlbCB7CiAgICBmb250LXNpemU6IDEwcHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjRweDsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBtaW4td2lkdGg6IDgwcHg7CiAgICBwYWRkaW5nLXRvcDogMXB4Owp9CgouZGVjay1haS1waGFzZS10ZXh0IHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgouZGVjay1haS1waGFzZS12dWxuIC5kZWNrLWFpLXBoYXNlLWxhYmVsIHsKICAg' +
'IGNvbG9yOiB2YXIoLS1lcnJvcik7Cn0KCi5kZWNrLWFpLXBoYXNlLXZ1bG4gewogICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuMik7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwp9CgovKiDilIDilIAgU3RyZW5ndGhzIC8gV2Vha25lc3NlcyBzaWRlLWJ5LXNpZGUgZ3JpZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRlY2stYWktc3ctZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKfQoKLmRlY2stYWktc3ctY29sIHsKICAgIG1pbi13aWR0aDogMDsKfQoKLmRlY2stYWktc3ctdGl0bGUtZ29vZCB7CiAgICBjb2xvcjogdmFyKC0tc3VjY2VzcykgIWltcG9ydGFudDsKfQoKLmRlY2stYWktc3ctdGl0bGUtYmFkIHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcikgIWltcG9ydGFudDsKfQoKLmRlY2stYWktbGlzdCB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogMDsKfQoKLmRlY2stYWktbGlzdCBsaSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgcGFkZGluZzogM3B4IDA7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1sZWZ0OiAxNHB4Owp9CgouZGVjay1haS1saXN0IGxpOjpiZWZvcmUgewogICAgY29udGVudDogJ1wyMDIyJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGxlZnQ6IDJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXRlcnRpYXJ5KTsKfQoKLyog4pSA4pSAIFJvbGUgQW5hbHlzaXMgKHByb2dyZXNzIGJhciByb3dzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRlY2stYWktcm9sZS1nYXBzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKfQoKLmRlY2stYWktcm9sZS1yb3cgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogOTBweCAxZnIgNTBweDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgouZGVjay1haS1yb2xlLW5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLmRlY2stYWktcm9sZS1iYXItd3JhcCB7CiAgICBoZWlnaHQ6IDhweDsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgouZGVjay1haS1yb2xlLWJhciB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjRzIGVhc2U7CiAgICBtaW4td2lkdGg6IDJweDsKfQoKLmRlY2stYWktcm9sZS1iYXIuZ29vZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzKTsKfQoKLmRlY2stYWktcm9sZS1iYXIud2FybiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nKTsKfQoKLmRlY2stYWktcm9sZS1iYXIuYmFkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWVycm9yKTsKfQoKLmRlY2stYWktcm9sZS1udW1zIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5kZWNrLWFpLXJvbGUtbm90ZSB7CiAgICBncmlkLWNvbHVtbjogMSAvIC0xOwogICAgZm9udC1zaXplOiAxMHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtdGVydGlhcnkpOwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIHBhZGRpbmctbGVmdDogOTJweDsKICAgIG1hcmdpbi10b3A6IC0ycHg7Cn0KCi8qIOKUgOKUgCBTZXZlcml0eSBCYWRnZSAoY3V0cykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA' +
'4pSA4pSA4pSAICovCi5kZWNrLWFpLXNldmVyaXR5LWJhZGdlIHsKICAgIGZvbnQtc2l6ZTogOHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLWFpLXNldmVyaXR5LWJhZGdlLnNldi1tdXN0IHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ4LCAxMTMsIDExMywgMC4yKTsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuMyk7Cn0KCi5kZWNrLWFpLXNldmVyaXR5LWJhZGdlLnNldi1zaG91bGQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTEsIDE5MSwgMzYsIDAuMik7CiAgICBjb2xvcjogdmFyKC0td2FybmluZyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1MSwgMTkxLCAzNiwgMC4zKTsKfQoKLmRlY2stYWktc2V2ZXJpdHktYmFkZ2Uuc2V2LWNvbnNpZGVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjE1KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg5MSwgMTU4LCAyNDAsIDAuMik7Cn0KCi8qIOKUgOKUgCBQcmlvcml0eSBCYWRnZSAoYWRkcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZWNrLWFpLXByaW9yaXR5LWJhZGdlIHsKICAgIGZvbnQtc2l6ZTogOHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHBhZGRpbmc6IDJweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNHB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZWNrLWFpLXByaW9yaXR5LWJhZGdlLnByaS1jcml0aWNhbCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuMik7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNDgsIDExMywgMTEzLCAwLjMpOwp9CgouZGVjay1haS1wcmlvcml0eS1iYWRnZS5wcmktaGlnaCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1MSwgMTkxLCAzNiwgMC4yKTsKICAgIGNvbG9yOiB2YXIoLS13YXJuaW5nKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjUxLCAxOTEsIDM2LCAwLjMpOwp9CgouZGVjay1haS1wcmlvcml0eS1iYWRnZS5wcmktbWVkaXVtIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTEsIDE1OCwgMjQwLCAwLjE1KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg5MSwgMTU4LCAyNDAsIDAuMik7Cn0KCi5kZWNrLWFpLXByaW9yaXR5LWJhZGdlLnByaS1uaWNlIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzQsIDIyMiwgMTI4LCAwLjEyKTsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNzQsIDIyMiwgMTI4LCAwLjIpOwp9CgovKiDilIDilIAgQ2FyZCBEZXRhaWwgbGluZSAocmVhc29uIC8gc3luZXJneSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZWNrLWFpLWNhcmQtZGV0YWlsIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgcGFkZGluZzogMnB4IDAgMCAxNHB4OwogICAgbWFyZ2luLXRvcDogMnB4Owp9CgovKiDilIDilIAgU3luZXJneSBUYWcgKGlubGluZSBpbiBjYXJkIGRldGFpbCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZWNrLWFpLXN5bmVyZ3ktdGFnIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGZvbnQtc2l6ZTogOXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wdXJwbGUtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1wdXJwbGUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNjcsIDEzOSwgMjUwLCAwLjIpOwogICAgbWFyZ2luLWxlZnQ6IDRweDsKICAg' +
'IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi8qIOKUgOKUgCBEZWVwIEFuYWx5c2lzIHJlc3BvbnNpdmUgdHdlYWsg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweCkgewogICAgLmRlY2stYWktc3ctZ3JpZCB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CiAgICAuZGVjay1haS1yb2xlLXJvdyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA3MHB4IDFmciA0MHB4OwogICAgfQogICAgLmRlY2stYWktcm9sZS1ub3RlIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDcycHg7CiAgICB9CiAgICAuZGVjay1haS1waGFzZSB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBnYXA6IHZhcigtLXNwLTEpOwogICAgfQogICAgLmRlY2stYWktcGhhc2UtbGFiZWwgewogICAgICAgIG1pbi13aWR0aDogYXV0bzsKICAgIH0KfQo='
Install-B64 -R 'ui\deckbuilder.css' -B $b
# ui/deckbuilder.html (27,001 bytes)
$b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgPHRpdGxlPkNvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgQnVpbGRlcjwvdGl0bGU+CiAgICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20iIC8+CiAgICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20iIGNyb3Nzb3JpZ2luIC8+CiAgICA8bGluayBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDA7NzAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0IiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJnbG9iYWwuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkZWNrYnVpbGRlci5jc3MiIC8+CjwvaGVhZD4KPGJvZHk+CiAgICA8c2NyaXB0IHNyYz0ibmF2LmpzIj48L3NjcmlwdD4KCiAgICA8ZGl2IGlkPSJkZWNrLWJ1aWxkZXItcGFnZSI+CgogICAgICAgIDwhLS0gVE9QIEJBUiAtLT4KICAgICAgICA8aGVhZGVyIGNsYXNzPSJkZWNrLXRvcGJhciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stdG9wYmFyLWNvbW1hbmRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWNvbW1hbmRlci1wb3J0cmFpdCIgaWQ9ImRlY2stY29tbWFuZGVyLXBvcnRyYWl0Ij4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1jb21tYW5kZXItcG9ydHJhaXQtcGxhY2Vob2xkZXIiPuKalDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJkZWNrLWNvbW1hbmRlci1wb3J0cmFpdC1pbWciIGlkPSJkZWNrLWNvbW1hbmRlci1pbWciIHNyYz0iIiBhbHQ9IiIgc3R5bGU9ImRpc3BsYXk6bm9uZSIgLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1uYW1lLWJsb2NrIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRlY2stbmFtZS1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgaWQ9ImRlY2stbmFtZS1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlVudGl0bGVkIERlY2siCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIiCiAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWNvbW1hbmRlci1sYWJlbCIgaWQ9ImRlY2stY29tbWFuZGVyLWxhYmVsIj5ObyBjb21tYW5kZXIgc2VsZWN0ZWQ8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1jb2xvci1jaGlwcyIgaWQ9ImRlY2stY29sb3ItY2hpcHMiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stdG9wYmFyLWNlbnRlciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWNvdW50LWRpc3BsYXkiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLWNvdW50LW51bSIgaWQ9ImRlY2stdG90YWwtY291bnQiPjA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stY291bnQtc2VwIj4vPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLWNvdW50LXRhcmdldCI+MTAwPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLWNvdW50LWxhYmVsIj5jYXJkczwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1idG4gZGVjay1idG4tZ2hvc3QiIGlkPSJkZWNrLW5ldy1idG4iPisgTmV3IERlY2s8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stc2VsZWN0b3Itd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZGVjay1zZWxlY3RvciIgaWQ9ImRlY2stc2VsZWN0b3IiPgogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPuKAlCBTZWxlY3QgRGVj' +
'ayDigJQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1idG4gZGVjay1idG4tZGFuZ2VyIiBpZD0iZGVjay1kZWxldGUtYnRuIiB0aXRsZT0iRGVsZXRlIHRoaXMgZGVjayIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPuKclSBEZWxldGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWRhbmdlci1vdXRsaW5lIiBpZD0iZGVjay1jbGVhci1hbGwtYnRuIiB0aXRsZT0iRGVsZXRlIGFsbCBkZWNrcyI+Q2xlYXIgQWxsPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay10b3BiYXItYWN0aW9ucyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWJ0biBkZWNrLWJ0bi1pbXBvcnQiIGlkPSJkZWNrLWltcG9ydC1idG4iIHRpdGxlPSJJbXBvcnQgYSBkZWNrbGlzdCI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+4qyGPC9zcGFuPiBJbXBvcnQKICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1idG4gZGVjay1idG4tZ2hvc3QiIGlkPSJkZWNrLWV4cG9ydC1idG4iIHRpdGxlPSJFeHBvcnQgYXMgLmRjayBmaWxlIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj7irIc8L3NwYW4+IEV4cG9ydCAuZGNrCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLXNpbSIgaWQ9ImRlY2stc2ltLWJ0biIgdGl0bGU9IkV4cG9ydCBkZWNrIHRvIHNpbXVsYXRpb24iPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLWJ0bi1pY29uIj7ilrY8L3NwYW4+IFJ1biBTaW11bGF0aW9uCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9oZWFkZXI+CgogICAgICAgIDwhLS0gTUFJTiAzLUNPTFVNTiBMQVlPVVQgLS0+CiAgICAgICAgPG1haW4gY2xhc3M9ImRlY2stbWFpbiI+CgogICAgICAgICAgICA8IS0tIExFRlQgQ09MVU1OOiBDb2xsZWN0aW9uIFNlYXJjaCAtLT4KICAgICAgICAgICAgPGFzaWRlIGNsYXNzPSJkZWNrLWNvbC1sZWZ0Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwgZGVjay1wYW5lbC1zZWFyY2giPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stcGFuZWwtdGl0bGUiPkNvbGxlY3Rpb24gU2VhcmNoPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1zZWFyY2gtY291bnQiIGlkPSJkZWNrLXNlYXJjaC1jb3VudCI+MCByZXN1bHRzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXNlYXJjaC1iYXItd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VhcmNoIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRlY2stc2VhcmNoLWJhciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJkZWNrLXNlYXJjaC1iYXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iU2VhcmNoIGNhcmRzLi4uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPSJvZmYiCiAgICAgICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLXNlYXJjaC1pY29uIj7wn5SNPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWZpbHRlci1yb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJkZWNrLWZpbHRlci1zZWxlY3QiIGlkPSJkZWNrLXR5cGUtZmlsdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+QWxsIFR5cGVzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJMYW5kIj5MYW5kPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVl' +
'PSJDcmVhdHVyZSI+Q3JlYXR1cmU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ikluc3RhbnQiPkluc3RhbnQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IlNvcmNlcnkiPlNvcmNlcnk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkFydGlmYWN0Ij5BcnRpZmFjdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iRW5jaGFudG1lbnQiPkVuY2hhbnRtZW50PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJQbGFuZXN3YWxrZXIiPlBsYW5lc3dhbGtlcjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1jbWMtZmlsdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJkZWNrLWNtYy1pbnB1dCIgaWQ9ImRlY2stY21jLW1pbiIgcGxhY2Vob2xkZXI9IjAiIG1pbj0iMCIgbWF4PSIyMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLWNtYy1zZXAiPuKAkzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJkZWNrLWNtYy1pbnB1dCIgaWQ9ImRlY2stY21jLW1heCIgcGxhY2Vob2xkZXI9IuKIniIgbWluPSIwIiBtYXg9IjIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1jb2xvci1maWx0ZXItcm93IiBpZD0iZGVjay1jb2xvci1maWx0ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWNvbG9yLXBpcCBkZWNrLWNvbG9yLVciIGRhdGEtY29sb3I9IlciIHRpdGxlPSJXaGl0ZSI+VzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWNvbG9yLXBpcCBkZWNrLWNvbG9yLVUiIGRhdGEtY29sb3I9IlUiIHRpdGxlPSJCbHVlIj5VPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stY29sb3ItcGlwIGRlY2stY29sb3ItQiIgZGF0YS1jb2xvcj0iQiIgdGl0bGU9IkJsYWNrIj5CPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stY29sb3ItcGlwIGRlY2stY29sb3ItUiIgZGF0YS1jb2xvcj0iUiIgdGl0bGU9IlJlZCI+UjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWNvbG9yLXBpcCBkZWNrLWNvbG9yLUciIGRhdGEtY29sb3I9IkciIHRpdGxlPSJHcmVlbiI+RzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWNvbG9yLXBpcCBkZWNrLWNvbG9yLUMiIGRhdGEtY29sb3I9IkMiIHRpdGxlPSJDb2xvcmxlc3MiPkM8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXN1bHRzIGxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1zZWFyY2gtcmVzdWx0cyIgaWQ9ImRlY2stc2VhcmNoLXJlc3VsdHMiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWVtcHR5LXN0YXRlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stZW1wdHktaWNvbiI+8J+DjzwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1lbXB0eS10ZXh0Ij5TZWFyY2ggeW91ciBjb2xsZWN0aW9uIHRvIGFkZCBjYXJkczwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1zZWFyY2gtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1idG4gZGVjay1idG4tc3VjY2VzcyBkZWNrLWJ0bi1mdWxsIiBpZD0iZGVjay1hZGQtYWxsLW93bmVkLWJ0biIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgQWxsIE1hdGNoaW5nIChP' +
'd25lZCkKICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9hc2lkZT4KCiAgICAgICAgICAgIDwhLS0gQ0VOVEVSIENPTFVNTjogRGVjayBDYXJkIExpc3QgLS0+CiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPSJkZWNrLWNvbC1jZW50ZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1wYW5lbCBkZWNrLXBhbmVsLWNhcmRzIiBpZD0iZGVjay1jYXJkLWxpc3QtcGFuZWwiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtaGVhZGVyIGRlY2stY2FyZC1saXN0LWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLXBhbmVsLXRpdGxlIj5EZWNrIENvbnRlbnRzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWNhcmQtbGlzdC1hY3Rpb25zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLWNhcmQtbGlzdC1tZXRhIiBpZD0iZGVjay1jYXJkLWxpc3QtbWV0YSI+U2VsZWN0IG9yIGNyZWF0ZSBhIGRlY2s8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIENhcmQgZ3JvdXBzIGJ5IHR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1jYXJkLWdyb3VwcyIgaWQ9ImRlY2stY2FyZC1ncm91cHMiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWVtcHR5LXN0YXRlIGRlY2stZW1wdHktc3RhdGUtbGciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1lbXB0eS1pY29uIj7impQ8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stZW1wdHktdGV4dCI+Q3JlYXRlIG9yIHNlbGVjdCBhIGRlY2sgdG8gc3RhcnQgYnVpbGRpbmc8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWFjY2VudCIgaWQ9ImRlY2stZW1wdHktbmV3LWJ0biI+KyBOZXcgRGVjazwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPCEtLSBRdWljayBhZGQgYnkgbmFtZSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXF1aWNrYWRkLXJvdyIgaWQ9ImRlY2stcXVpY2thZGQtcm93IiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1xdWlja2FkZC13cmFwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRlY2stcXVpY2thZGQtaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9ImRlY2stcXVpY2thZGQtaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkFkZCBjYXJkIGJ5IG5hbWUuLi4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPSJvZmYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1xdWlja2FkZC1kcm9wZG93biIgaWQ9ImRlY2stcXVpY2thZGQtZHJvcGRvd24iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1idG4gZGVjay1idG4tYWNjZW50LXNtIiBpZD0iZGVjay1xdWlja2FkZC1idG4iPkFkZDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIERlY2sgc3RhdHMgZm9vdGVyIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stc3RhdHMtZm9vdGVyIiBpZD0iZGVjay1zdGF0cy1mb290ZXIiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXN0YXQtcGlsbCI+CiAgICAg' +
'ICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1zdGF0LXBpbGwtbnVtIiBpZD0iZGVjay1mb290ZXItdG90YWwiPjA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1zdGF0LXBpbGwtbGFiZWwiPnRvdGFsPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1zdGF0LXBpbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stc3RhdC1waWxsLW51bSBkZWNrLXN0YXQtb3duZWQiIGlkPSJkZWNrLWZvb3Rlci1vd25lZCI+MDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLXN0YXQtcGlsbC1sYWJlbCI+b3duZWQ8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXN0YXQtcGlsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1zdGF0LXBpbGwtbnVtIiBpZD0iZGVjay1mb290ZXItYXZnLWNtYyI+MC4wPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stc3RhdC1waWxsLWxhYmVsIj5hdmcgQ01DPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgICAgICA8IS0tIFJJR0hUIENPTFVNTjogRURIIEFkdmlzb3IgLS0+CiAgICAgICAgICAgIDxhc2lkZSBjbGFzcz0iZGVjay1jb2wtcmlnaHQiPgoKICAgICAgICAgICAgICAgIDwhLS0gUmF0aW8gRGFzaGJvYXJkIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1wYW5lbCBkZWNrLXBhbmVsLXJhdGlvcyIgaWQ9ImRlY2stcmF0aW8tcGFuZWwiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtaGVhZGVyIGRlY2stcGFuZWwtaGVhZGVyLWNvbGxhcHNpYmxlIiBkYXRhLXRhcmdldD0iZGVjay1yYXRpby1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stcGFuZWwtdGl0bGUiPvCfk4ogUmF0aW8gRGFzaGJvYXJkPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1jb2xsYXBzZS1hcnJvdyI+4pa8PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtYm9keSIgaWQ9ImRlY2stcmF0aW8tYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcmF0aW8tYmFycyIgaWQ9ImRlY2stcmF0aW8tYmFycyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXJhdGlvLXBsYWNlaG9sZGVyIj5Mb2FkIGEgZGVjayB0byBzZWUgcmF0aW9zPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPCEtLSBGaXggTXkgUmF0aW9zIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1wYW5lbCBkZWNrLXBhbmVsLWZpeCIgaWQ9ImRlY2stZml4LXBhbmVsIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXBhbmVsLWhlYWRlciBkZWNrLXBhbmVsLWhlYWRlci1jb2xsYXBzaWJsZSIgZGF0YS10YXJnZXQ9ImRlY2stZml4LWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1wYW5lbC10aXRsZSI+8J+UpyBGaXggTXkgUmF0aW9zPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1jb2xsYXBzZS1hcnJvdyI+4pa8PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtYm9keSIgaWQ9ImRlY2stZml4LWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXNob3J0ZmFsbHMiIGlkPSJkZWNrLXNob3J0ZmFsbHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1yYXRpby1wbGFjZWhvbGRlciI+Tm8gYW5hbHlzaXMgYXZh' +
'aWxhYmxlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWZpeC1hY3Rpb25zIiBpZD0iZGVjay1maXgtYWN0aW9ucyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWJ0biBkZWNrLWJ0bi1naG9zdCBkZWNrLWJ0bi1mdWxsIiBpZD0iZGVjay1hdXRvc3VnZ2VzdC1idG4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKaoSBBdXRvLXN1Z2dlc3QgZnJvbSBDb2xsZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stZml4LXN1Z2dlc3Rpb25zIiBpZD0iZGVjay1maXgtc3VnZ2VzdGlvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPCEtLSBFREhSRUMgUmVjb21tZW5kYXRpb25zIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1wYW5lbCBkZWNrLXBhbmVsLWVkaHJlYyIgaWQ9ImRlY2stZWRocmVjLXBhbmVsIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXBhbmVsLWhlYWRlciBkZWNrLXBhbmVsLWhlYWRlci1jb2xsYXBzaWJsZSIgZGF0YS10YXJnZXQ9ImRlY2stZWRocmVjLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1wYW5lbC10aXRsZSI+4pyoIEVESFJFQyBSZWNzPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1jb2xsYXBzZS1hcnJvdyI+4pa8PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtYm9keSIgaWQ9ImRlY2stZWRocmVjLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWVkaHJlYy1jb250cm9scyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRlY2stdG9nZ2xlLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNsYXNzPSJkZWNrLXRvZ2dsZS1jaGVjayIgaWQ9ImRlY2stZWRocmVjLW93bmVkLW9ubHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stdG9nZ2xlLXRyYWNrIj48c3BhbiBjbGFzcz0iZGVjay10b2dnbGUtdGh1bWIiPjwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZWQgT25seQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWdob3N0IGRlY2stYnRuLXNtIiBpZD0iZGVjay1lZGhyZWMtcmVmcmVzaC1idG4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGuiBSZWZyZXNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stZWRocmVjLWxpc3QiIGlkPSJkZWNrLWVkaHJlYy1saXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcmF0aW8tcGxhY2Vob2xkZXIiPkxvYWQgYSBkZWNrIHRvIHNlZSByZWNvbW1lbmRhdGlvbnM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stZWRocmVjLWJ1bGsiIGlkPSJkZWNrLWVkaHJlYy1idWxrIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLXN1Y2Nlc3MgZGVjay1idG4tZnVsbCIgaWQ9ImRlY2stZWRocmVjLWJ1bGstb3duZWQtYnRuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgQWxsIE93bmVkIChyZXNwZWN0IHJhdGlvcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAg' +
'ICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gQUkgUmVzZWFyY2ggKFBlcnBsZXhpdHkpIOKAlCBoaWRkZW4gdW50aWwgcHBseCBzdGF0dXMgY2hlY2sgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXBhbmVsIGRlY2stcGFuZWwtYWkiIGlkPSJkZWNrLWFpLXJlc2VhcmNoLXBhbmVsIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLXBhbmVsLWhlYWRlciBkZWNrLXBhbmVsLWhlYWRlci1jb2xsYXBzaWJsZSIgZGF0YS10YXJnZXQ9ImRlY2stYWktcmVzZWFyY2gtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZWNrLXBhbmVsLXRpdGxlIj7wn6egIEFJIFJlc2VhcmNoPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1jb2xsYXBzZS1hcnJvdyI+4pa8PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtYm9keSIgaWQ9ImRlY2stYWktcmVzZWFyY2gtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stYWktY29udHJvbHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1mb3JtLWZpZWxkIGRlY2stZm9ybS1maWVsZC1zbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkZWNrLWZvcm0tbGFiZWwtc20iPkFuYWx5c2lzIEdvYWw8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGVjay1mb3JtLWlucHV0IGRlY2stZm9ybS1pbnB1dC1zbSIgaWQ9ImFpLXJlc2VhcmNoLWdvYWwiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iSWRlbnRpZnkgd2Vha25lc3NlcyBhbmQgc3VnZ2VzdCB1cGdyYWRlcyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1haS1yb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stZm9ybS1maWVsZCBkZWNrLWZvcm0tZmllbGQtc20gZGVjay1mb3JtLWZpZWxkLWhhbGYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRlY2stZm9ybS1sYWJlbC1zbSI+QnVkZ2V0ICgkKTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJkZWNrLWZvcm0taW5wdXQgZGVjay1mb3JtLWlucHV0LXNtIiBpZD0iYWktcmVzZWFyY2gtYnVkZ2V0IiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJObyBsaW1pdCIgbWluPSIwIiBzdGVwPSIxMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRlY2stdG9nZ2xlLWxhYmVsIGRlY2stdG9nZ2xlLWxhYmVsLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGVjay10b2dnbGUtY2hlY2siIGlkPSJhaS1yZXNlYXJjaC11c2UtY29sbGVjdGlvbiIgY2hlY2tlZCAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay10b2dnbGUtdHJhY2siPjxzcGFuIGNsYXNzPSJkZWNrLXRvZ2dsZS10aHVtYiI+PC9zcGFuPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIENvbGxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWZvcm0tZmllbGQgZGVjay1mb3JtLWZpZWxkLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRlY2stZm9ybS1sYWJlbC1zbSI+T21pdCBDYXJkcyAoY29tbWEtc2VwYXJhdGVkKTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9' +
'InRleHQiIGNsYXNzPSJkZWNrLWZvcm0taW5wdXQgZGVjay1mb3JtLWlucHV0LXNtIiBpZD0iYWktcmVzZWFyY2gtb21pdCIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJEb2Nrc2lkZSBFeHRvcnRpb25pc3QsIFJoeXN0aWMgU3R1ZHkiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWFpIGRlY2stYnRuLWZ1bGwiIGlkPSJhaS1yZXNlYXJjaC1idG4iIGRpc2FibGVkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCflI0gQW5hbHl6ZSBEZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stYWktbG9hZGluZyIgaWQ9ImFpLXJlc2VhcmNoLWxvYWRpbmciIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1haS1zcGlubmVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFuYWx5emluZyB3aXRoIFBlcnBsZXhpdHkgQUkuLi48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWFpLXJlc3VsdHMiIGlkPSJhaS1yZXNlYXJjaC1yZXN1bHRzIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gQUkgRGVjayBHZW5lcmF0ZSAoUGVycGxleGl0eSkg4oCUIGhpZGRlbiB1bnRpbCBwcGx4IHN0YXR1cyBjaGVjayAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwgZGVjay1wYW5lbC1haSIgaWQ9ImRlY2stYWktZ2VuZXJhdGUtcGFuZWwiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtaGVhZGVyIGRlY2stcGFuZWwtaGVhZGVyLWNvbGxhcHNpYmxlIiBkYXRhLXRhcmdldD0iZGVjay1haS1nZW5lcmF0ZS1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stcGFuZWwtdGl0bGUiPuKcqCBBSSBHZW5lcmF0ZSBEZWNrPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1jb2xsYXBzZS1hcnJvdyI+4pa8PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stcGFuZWwtYm9keSIgaWQ9ImRlY2stYWktZ2VuZXJhdGUtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stYWktY29udHJvbHMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1mb3JtLWZpZWxkIGRlY2stZm9ybS1maWVsZC1zbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkZWNrLWZvcm0tbGFiZWwtc20iPkNvbW1hbmRlcjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1haS1jb21tYW5kZXItd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGVjay1mb3JtLWlucHV0IGRlY2stZm9ybS1pbnB1dC1zbSIgaWQ9ImFpLWdlbi1jb21tYW5kZXIiIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlNlYXJjaCBmb3IgYSBjb21tYW5kZXIuLi4iIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWFpLWNvbW1hbmRlci1kcm9wZG93biIgaWQ9ImFpLWdlbi1jb21tYW5kZXItZHJvcGRvd24iIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWFpLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1mb3Jt' +
'LWZpZWxkIGRlY2stZm9ybS1maWVsZC1zbSBkZWNrLWZvcm0tZmllbGQtaGFsZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZGVjay1mb3JtLWxhYmVsLXNtIj5CdWRnZXQgKCQpPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9ImRlY2stZm9ybS1pbnB1dCBkZWNrLWZvcm0taW5wdXQtc20iIGlkPSJhaS1nZW4tYnVkZ2V0IiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJObyBsaW1pdCIgbWluPSIwIiBzdGVwPSIxMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRlY2stdG9nZ2xlLWxhYmVsIGRlY2stdG9nZ2xlLWxhYmVsLXNtIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGVjay10b2dnbGUtY2hlY2siIGlkPSJhaS1nZW4tdXNlLWNvbGxlY3Rpb24iIGNoZWNrZWQgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRlY2stdG9nZ2xlLXRyYWNrIj48c3BhbiBjbGFzcz0iZGVjay10b2dnbGUtdGh1bWIiPjwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBDb2xsZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1mb3JtLWZpZWxkIGRlY2stZm9ybS1maWVsZC1zbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkZWNrLWZvcm0tbGFiZWwtc20iPk9taXQgQ2FyZHMgKGNvbW1hLXNlcGFyYXRlZCk8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZGVjay1mb3JtLWlucHV0IGRlY2stZm9ybS1pbnB1dC1zbSIgaWQ9ImFpLWdlbi1vbWl0IiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlJoeXN0aWMgU3R1ZHksIEN5Y2xvbmljIFJpZnQiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWFpIGRlY2stYnRuLWZ1bGwiIGlkPSJhaS1nZW4tYnRuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDinKggR2VuZXJhdGUgRnVsbCBEZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stYWktbG9hZGluZyIgaWQ9ImFpLWdlbi1sb2FkaW5nIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stYWktc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5HZW5lcmF0aW5nIGRlY2sgd2l0aCBQZXJwbGV4aXR5IEFJLi4uPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1haS1yZXN1bHRzIiBpZD0iYWktZ2VuLXJlc3VsdHMiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8L2FzaWRlPgogICAgICAgIDwvbWFpbj4KCiAgICAgICAgPCEtLSBDQVJEIFBSRVZJRVcgVE9PTFRJUCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWNhcmQtcHJldmlldyIgaWQ9ImRlY2stY2FyZC1wcmV2aWV3IiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgPGltZyBjbGFzcz0iZGVjay1jYXJkLXByZXZpZXctaW1nIiBpZD0iZGVjay1jYXJkLXByZXZpZXctaW1nIiBzcmM9IiIgYWx0PSIiIC8+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gVE9BU1QgQ09OVEFJTkVSIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImRlY2stdG9hc3QtY29udGFpbmVyIiBpZD0iZGVjay10b2FzdC1jb250' +
'YWluZXIiPjwvZGl2PgoKICAgICAgICA8IS0tIENPTkZJUk0gTU9EQUwgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1tb2RhbC1vdmVybGF5IiBpZD0iZGVjay1jb25maXJtLW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1tb2RhbCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLW1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJkZWNrLW1vZGFsLXRpdGxlIiBpZD0iZGVjay1jb25maXJtLXRpdGxlIj5Db25maXJtIEFjdGlvbjwvaDM+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1tb2RhbC1jbG9zZS1idG4iIGlkPSJkZWNrLWNvbmZpcm0tY2xvc2UiPuKclTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLW1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJkZWNrLWNvbmZpcm0tbWVzc2FnZSIgaWQ9ImRlY2stY29uZmlybS1tZXNzYWdlIj48L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1jb25maXJtLWNoYW5nZXMiIGlkPSJkZWNrLWNvbmZpcm0tY2hhbmdlcyI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stbW9kYWwtZm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWJ0biBkZWNrLWJ0bi1naG9zdCIgaWQ9ImRlY2stY29uZmlybS1jYW5jZWwiPkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWFjY2VudCIgaWQ9ImRlY2stY29uZmlybS1vayI+Q29uZmlybTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIE5FVyBERUNLIE1PREFMIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImRlY2stbW9kYWwtb3ZlcmxheSIgaWQ9ImRlY2stbmV3LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1tb2RhbCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLW1vZGFsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPSJkZWNrLW1vZGFsLXRpdGxlIj5DcmVhdGUgTmV3IERlY2s8L2gzPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stbW9kYWwtY2xvc2UtYnRuIiBpZD0iZGVjay1uZXctbW9kYWwtY2xvc2UiPuKclTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLW1vZGFsLWJvZHkiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stZm9ybS1maWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZGVjay1mb3JtLWxhYmVsIj5EZWNrIE5hbWU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImRlY2stZm9ybS1pbnB1dCIgaWQ9ImRlY2stbmV3LW5hbWUiIHBsYWNlaG9sZGVyPSJNeSBDb21tYW5kZXIgRGVjayIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWZvcm0tZmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRlY2stZm9ybS1sYWJlbCI+Q29tbWFuZGVyIChvcHRpb25hbCk8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWNvbW1hbmRlci1zZWFyY2gtd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkZWNrLWZvcm0taW5wdXQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9ImRlY2stbmV3LWNvbW1hbmRlci1zZWFyY2giCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IlNlYXJjaCBTY3J5ZmFsbCBmb3IgY29tbWFuZGVyLi4uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT0ib2ZmIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAg' +
'ICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stY29tbWFuZGVyLWRyb3Bkb3duIiBpZD0iZGVjay1uZXctY29tbWFuZGVyLWRyb3Bkb3duIiBzdHlsZT0iZGlzcGxheTpub25lIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2stbmV3LWNvbW1hbmRlci1zZWxlY3RlZCIgaWQ9ImRlY2stbmV3LWNvbW1hbmRlci1zZWxlY3RlZCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVjay1zZWxlY3RlZC1jb21tYW5kZXItbmFtZSIgaWQ9ImRlY2stbmV3LWNvbW1hbmRlci1uYW1lIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWNsZWFyLWNvbW1hbmRlci1idG4iIGlkPSJkZWNrLWNsZWFyLWNvbW1hbmRlci1idG4iPuKclTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1tb2RhbC1mb290ZXIiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWdob3N0IiBpZD0iZGVjay1uZXctY2FuY2VsIj5DYW5jZWw8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLWJ0biBkZWNrLWJ0bi1hY2NlbnQiIGlkPSJkZWNrLW5ldy1jcmVhdGUiPkNyZWF0ZSBEZWNrPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gSU1QT1JUIE1PREFMIC0tPgogICAgICAgIDxkaXYgY2xhc3M9ImRlY2stbW9kYWwtb3ZlcmxheSIgaWQ9ImRlY2staW1wb3J0LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1tb2RhbCBkZWNrLW1vZGFsLXdpZGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1tb2RhbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0iZGVjay1tb2RhbC10aXRsZSI+SW1wb3J0IERlY2tsaXN0PC9oMz4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZWNrLW1vZGFsLWNsb3NlLWJ0biIgaWQ9ImRlY2staW1wb3J0LW1vZGFsLWNsb3NlIj7inJU8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1tb2RhbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLWltcG9ydC10YWJzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1pbXBvcnQtdGFiIGFjdGl2ZSIgZGF0YS10YWI9InBhc3RlIj5QYXN0ZSBUZXh0PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2staW1wb3J0LXRhYiIgZGF0YS10YWI9ImZpbGUiPlVwbG9hZCBGaWxlPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRlY2staW1wb3J0LXBhc3RlLXBhbmVsIiBjbGFzcz0iZGVjay1pbXBvcnQtcGFuZWwiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9ImRlY2staW1wb3J0LXRleHRhcmVhIiByb3dzPSIxNCIgcGxhY2Vob2xkZXI9IlBhc3RlIHlvdXIgZGVja2xpc3QgaGVyZS4uLgoKU3VwcG9ydGVkIGZvcm1hdHM6CiAgW0NvbW1hbmRlcl0KICAxIEtvcnZvbGQsIEZhZS1DdXJzZWQgS2luZwoKICBbRGVja10KICAxIFNvbCBSaW5nCiAgMSBDdWx0aXZhdGUKICAzNyBGb3Jlc3QKCk9yIHBsYWluIGxpc3Q6CiAgU29sIFJpbmcKICBDdWx0aXZhdGUKICBGb3Jlc3QiPjwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRlY2staW1wb3J0LWZpbGUtcGFuZWwiIGNsYXNzPSJkZWNrLWltcG9ydC1wYW5lbCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2staW1wb3J0LWRyb3B6b25lIiBpZD0iZGVjay1pbXBvcnQtZHJvcHpvbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1pbXBvcnQtZHJvcHpvbmUtbGFiZWwiPkRyb3AgYSAu' +
'ZGNrIG9yIC50eHQgZmlsZSBoZXJlLCBvciBjbGljayB0byBicm93c2U8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZGVjay1pbXBvcnQtZmlsZSIgYWNjZXB0PSIuZGNrLC50eHQsLmRlYywubXdEZWNrIiBzdHlsZT0iZGlzcGxheTpub25lIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1pbXBvcnQtZmlsZS1pbmZvIiBpZD0iZGVjay1pbXBvcnQtZmlsZS1uYW1lIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1pbXBvcnQtb3B0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZGVjay1pbXBvcnQtb3B0aW9uLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iaW1wb3J0LW1vZGUiIHZhbHVlPSJuZXciIGNoZWNrZWQgLz4gQ3JlYXRlIG5ldyBkZWNrCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZGVjay1pbXBvcnQtb3B0aW9uLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iaW1wb3J0LW1vZGUiIHZhbHVlPSJhZGQiIC8+IEFkZCB0byBjdXJyZW50IGRlY2sKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkZWNrLWltcG9ydC1vcHRpb24tbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJpbXBvcnQtbW9kZSIgdmFsdWU9InJlcGxhY2UiIC8+IFJlcGxhY2UgY3VycmVudCBkZWNrIGNhcmRzCiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRlY2staW1wb3J0LW5ldy1uYW1lLXJvdyIgY2xhc3M9ImRlY2staW1wb3J0LW5hbWUtcm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkRlY2sgbmFtZSAob3B0aW9uYWwpOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iZGVjay1pbXBvcnQtbmFtZSIgcGxhY2Vob2xkZXI9IkF1dG8tZGV0ZWN0ZWQgZnJvbSBjb21tYW5kZXIiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2staW1wb3J0LXByb2dyZXNzLXdyYXAiIGlkPSJkZWNrLWltcG9ydC1wcm9ncmVzcyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlY2staW1wb3J0LXByb2dyZXNzLWxhYmVsIj5JbXBvcnRpbmcgY2FyZHMgKFNjcnlmYWxsIGxvb2t1cCkuLi48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1pbXBvcnQtcHJvZ3Jlc3MtdHJhY2siPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVjay1pbXBvcnQtcHJvZ3Jlc3MtZmlsbCIgaWQ9ImRlY2staW1wb3J0LXByb2dyZXNzLWJhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJkZWNrLWltcG9ydC1yZXN1bHQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWNrLW1vZGFsLWZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGVjay1idG4gZGVjay1idG4tZ2hvc3QiIGlkPSJkZWNrLWltcG9ydC1jYW5jZWwiPkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWFjY2VudCIgaWQ9ImRlY2staW1wb3J0LWdvIj5JbXBvcnQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICA8L2Rpdj48IS0tIC8jZGVjay1idWlsZGVyLXBhZ2UgLS0+CgogICAgPHNjcmlwdCBzcmM9ImRlY2tidWlsZGVyLmpzIj48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+' +
'Cg=='
Install-B64 -R 'ui\deckbuilder.html' -B $b
# ui/deckbuilder.js (114,256 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIERlY2sgQnVpbGRlcgogICBQdXJlIHZhbmlsbGEgSlMsIG5vIGZyYW1ld29ya3MuCiAgIENvbW11bmljYXRlcyB3aXRoIGJhY2tlbmQgdmlhIGZldGNoKCkgdG8gcmVsYXRpdmUgL2FwaS8gVVJMcy4KICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgondXNlIHN0cmljdCc7CgovKiDilIDilIAgTWFuYSBDb3N0IFJlbmRlcmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCmNvbnN0IE1BTkFfQ09MT1JTID0gewogICAgVzogJ2RlY2stcGlwLVcnLAogICAgVTogJ2RlY2stcGlwLVUnLAogICAgQjogJ2RlY2stcGlwLUInLAogICAgUjogJ2RlY2stcGlwLVInLAogICAgRzogJ2RlY2stcGlwLUcnLAogICAgQzogJ2RlY2stcGlwLUMnLAogICAgWDogJ2RlY2stcGlwLVgnLAp9OwoKLyoqCiAqIFBhcnNlIGEgbWFuYSBjb3N0IHN0cmluZyBsaWtlICJ7Mn17V317VX0iIGFuZCByZXR1cm4gYW4gYXJyYXkKICogb2YgeyBsYWJlbCwgY2xzIH0gb2JqZWN0cy4KICovCmZ1bmN0aW9uIHBhcnNlTWFuYShjb3N0U3RyKSB7CiAgICBpZiAoIWNvc3RTdHIpIHJldHVybiBbXTsKICAgIGNvbnN0IHBpcHMgPSBbXTsKICAgIGNvbnN0IHJlZ2V4ID0gL1x7KFtefV0rKVx9L2c7CiAgICBsZXQgbTsKICAgIHdoaWxlICgobSA9IHJlZ2V4LmV4ZWMoY29zdFN0cikpICE9PSBudWxsKSB7CiAgICAgICAgY29uc3Qgc3ltID0gbVsxXS50b1VwcGVyQ2FzZSgpOwogICAgICAgIGlmIChNQU5BX0NPTE9SU1tzeW1dKSB7CiAgICAgICAgICAgIHBpcHMucHVzaCh7IGxhYmVsOiBzeW0sIGNsczogTUFOQV9DT0xPUlNbc3ltXSB9KTsKICAgICAgICB9IGVsc2UgaWYgKC9eXGQrJC8udGVzdChzeW0pKSB7CiAgICAgICAgICAgIHBpcHMucHVzaCh7IGxhYmVsOiBzeW0sIGNsczogJ2RlY2stcGlwLU4nIH0pOwogICAgICAgIH0gZWxzZSBpZiAoc3ltID09PSAnWCcpIHsKICAgICAgICAgICAgcGlwcy5wdXNoKHsgbGFiZWw6ICdYJywgY2xzOiAnZGVjay1waXAtWCcgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gSHlicmlkIG9yIHBoeXJleGlhbiDigJQgcGljayBmaXJzdCBjb2xvcgogICAgICAgICAgICBjb25zdCBmaXJzdCA9IHN5bVswXTsKICAgICAgICAgICAgcGlwcy5wdXNoKHsgbGFiZWw6IGZpcnN0LCBjbHM6IE1BTkFfQ09MT1JTW2ZpcnN0XSB8fCAnZGVjay1waXAtTicgfSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHBpcHM7Cn0KCi8qKiBCdWlsZCBhIG1hbmEgY29zdCBlbGVtZW50LiAqLwpmdW5jdGlvbiBidWlsZE1hbmFDb3N0KGNvc3RTdHIpIHsKICAgIGNvbnN0IHdyYXAgPSBlbCgnc3BhbicsICdkZWNrLW1hbmEtY29zdCcpOwogICAgZm9yIChjb25zdCBwaXAgb2YgcGFyc2VNYW5hKGNvc3RTdHIpKSB7CiAgICAgICAgY29uc3Qgc3BhbiA9IGVsKCdzcGFuJywgYGRlY2stbWFuYS1waXAgJHtwaXAuY2xzfWApOwogICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBwaXAubGFiZWw7CiAgICAgICAgd3JhcC5hcHBlbmRDaGlsZChzcGFuKTsKICAgIH0KICAgIHJldHVybiB3cmFwOwp9CgovKiDilIDilIAgRE9NIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgovKiogUXVpY2sgZWxlbWVudCBmYWN0b3J5LiAqLwpmdW5jdGlvbiBlbCh0YWcsIGNsYXNzTmFtZSwgdGV4dCkgewogICAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTsKICAgIGlmIChjbGFz' +
'c05hbWUpIGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgaWYgKHRleHQgIT09IHVuZGVmaW5lZCkgZS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICByZXR1cm4gZTsKfQoKZnVuY3Rpb24gcXMoc2VsLCByb290KSB7IHJldHVybiAocm9vdCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvcihzZWwpOyB9CmZ1bmN0aW9uIHFzYShzZWwsIHJvb3QpIHsgcmV0dXJuIEFycmF5LmZyb20oKHJvb3QgfHwgZG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSk7IH0KCi8qIOKUgOKUgCBUb2FzdCBTeXN0ZW0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpjb25zdCBUb2FzdE1hbmFnZXIgPSB7CiAgICBjb250YWluZXI6IG51bGwsCiAgICBpbml0KCkgewogICAgICAgIHRoaXMuY29udGFpbmVyID0gcXMoJyNkZWNrLXRvYXN0LWNvbnRhaW5lcicpOwogICAgfSwKICAgIHNob3cobWVzc2FnZSwgdHlwZSA9ICdpbmZvJywgZHVyYXRpb24gPSAzMDAwKSB7CiAgICAgICAgY29uc3QgaWNvbnMgPSB7IHN1Y2Nlc3M6ICfinJMnLCBlcnJvcjogJ+KclScsIHdhcm5pbmc6ICfimqAnLCBpbmZvOiAn4oS5JyB9OwogICAgICAgIGNvbnN0IHRvYXN0ID0gZWwoJ2RpdicsIGBkZWNrLXRvYXN0IHRvYXN0LSR7dHlwZX1gKTsKICAgICAgICBjb25zdCBpY29uID0gZWwoJ3NwYW4nLCAnZGVjay10b2FzdC1pY29uJywgaWNvbnNbdHlwZV0gfHwgaWNvbnMuaW5mbyk7CiAgICAgICAgY29uc3QgdGV4dCA9IGVsKCdzcGFuJywgJ2RlY2stdG9hc3QtdGV4dCcsIG1lc3NhZ2UpOwogICAgICAgIHRvYXN0LmFwcGVuZENoaWxkKGljb24pOwogICAgICAgIHRvYXN0LmFwcGVuZENoaWxkKHRleHQpOwogICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRvYXN0KTsKCiAgICAgICAgY29uc3QgcmVtb3ZlID0gKCkgPT4gewogICAgICAgICAgICB0b2FzdC5jbGFzc0xpc3QuYWRkKCdyZW1vdmluZycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRvYXN0LnJlbW92ZSgpLCAyMjApOwogICAgICAgIH07CiAgICAgICAgc2V0VGltZW91dChyZW1vdmUsIGR1cmF0aW9uKTsKICAgICAgICB0b2FzdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHJlbW92ZSk7CiAgICB9Cn07CgovKiDilIDilIAgQ2FyZCBQcmV2aWV3IChob3ZlciB0b29sdGlwKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCmNvbnN0IENhcmRQcmV2aWV3ID0gewogICAgZWw6IG51bGwsCiAgICBpbWc6IG51bGwsCiAgICB2aXNpYmxlOiBmYWxzZSwKCiAgICBpbml0KCkgewogICAgICAgIHRoaXMuZWwgPSBxcygnI2RlY2stY2FyZC1wcmV2aWV3Jyk7CiAgICAgICAgdGhpcy5pbWcgPSBxcygnI2RlY2stY2FyZC1wcmV2aWV3LWltZycpOwogICAgfSwKCiAgICBzaG93KHNjcnlmYWxsSWQsIG14LCBteSkgewogICAgICAgIGlmICghc2NyeWZhbGxJZCB8fCAhdGhpcy5lbCkgcmV0dXJuOwogICAgICAgIHRoaXMuaW1nLnNyYyA9IGBodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvJHtzY3J5ZmFsbElkfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1ub3JtYWxgOwogICAgICAgIHRoaXMuaW1nLm9uZXJyb3IgPSAoKSA9PiB0aGlzLmhpZGUoKTsKCiAgICAgICAgY29uc3QgdncgPSB3aW5kb3cuaW5uZXJXaWR0aDsKICAgICAgICBjb25zdCB2aCA9IHdpbmRvdy5pbm5lckhlaWdodDsKICAgICAgICBjb25zdCB3ID0gMTgwOwogICAgICAgIGxldCB4ID0gbXggKyAxNjsKICAgICAgICBsZXQgeSA9IG15IC0gMjA7CiAgICAgICAgaWYgKHggKyB3ID4gdncgLSAxMCkgeCA9IG14IC0gdyAtIDE2OwogICAgICAgIGlmICh5ICsgMjUyID4gdmggLSAxMCkgeSA9IHZoIC0gMjYyOwogICAgICAgIGlmICh5IDwgMTApIHkgPSAxMDsKCiAgICAgICAgdGhpcy5lbC5zdHlsZS5sZWZ0ID0gYCR7eH1weGA7CiAgICAgICAgdGhpcy5lbC5zdHlsZS50b3AgID0gYCR7eX1weGA7CiAgICAgICAgdGhpcy5lbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlOwogICAgfSwKCiAgICBoaWRlKCkgewogICAgICAgIGlmICh0aGlzLmVsKSB0aGlzLmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgdGhp' +
'cy52aXNpYmxlID0gZmFsc2U7CiAgICB9LAoKICAgIGF0dGFjaChuYW1lRWwsIHNjcnlmYWxsSWQpIHsKICAgICAgICBpZiAoIXNjcnlmYWxsSWQpIHJldHVybjsKICAgICAgICBuYW1lRWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIChlKSA9PiB0aGlzLnNob3coc2NyeWZhbGxJZCwgZS5jbGllbnRYLCBlLmNsaWVudFkpKTsKICAgICAgICBuYW1lRWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgIChlKSA9PiB0aGlzLnNob3coc2NyeWZhbGxJZCwgZS5jbGllbnRYLCBlLmNsaWVudFkpKTsKICAgICAgICBuYW1lRWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHRoaXMuaGlkZSgpKTsKICAgIH0KfTsKCi8qIOKUgOKUgCBDb25maXJtYXRpb24gTW9kYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpjb25zdCBDb25maXJtRGlhbG9nID0gewogICAgb3ZlcmxheTogbnVsbCwKICAgIHRpdGxlRWw6IG51bGwsCiAgICBtZXNzYWdlRWw6IG51bGwsCiAgICBjaGFuZ2VzRWw6IG51bGwsCiAgICBva0J0bjogbnVsbCwKICAgIGNhbmNlbEJ0bjogbnVsbCwKICAgIGNsb3NlQnRuOiBudWxsLAogICAgX3Jlc29sdmU6IG51bGwsCgogICAgaW5pdCgpIHsKICAgICAgICB0aGlzLm92ZXJsYXkgID0gcXMoJyNkZWNrLWNvbmZpcm0tbW9kYWwnKTsKICAgICAgICB0aGlzLnRpdGxlRWwgID0gcXMoJyNkZWNrLWNvbmZpcm0tdGl0bGUnKTsKICAgICAgICB0aGlzLm1lc3NhZ2VFbCA9IHFzKCcjZGVjay1jb25maXJtLW1lc3NhZ2UnKTsKICAgICAgICB0aGlzLmNoYW5nZXNFbCA9IHFzKCcjZGVjay1jb25maXJtLWNoYW5nZXMnKTsKICAgICAgICB0aGlzLm9rQnRuICAgID0gcXMoJyNkZWNrLWNvbmZpcm0tb2snKTsKICAgICAgICB0aGlzLmNhbmNlbEJ0biA9IHFzKCcjZGVjay1jb25maXJtLWNhbmNlbCcpOwogICAgICAgIHRoaXMuY2xvc2VCdG4gID0gcXMoJyNkZWNrLWNvbmZpcm0tY2xvc2UnKTsKCiAgICAgICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7IHRoaXMub3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyBpZiAodGhpcy5fcmVzb2x2ZSkgdGhpcy5fcmVzb2x2ZShmYWxzZSk7IH07CiAgICAgICAgdGhpcy5jYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZSk7CiAgICAgICAgdGhpcy5jbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTsKICAgICAgICB0aGlzLm92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoZS50YXJnZXQgPT09IHRoaXMub3ZlcmxheSkgY2xvc2UoKTsgfSk7CiAgICAgICAgdGhpcy5va0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgdGhpcy5vdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIGlmICh0aGlzLl9yZXNvbHZlKSB0aGlzLl9yZXNvbHZlKHRydWUpOwogICAgICAgIH0pOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIC0geyB0aXRsZSwgbWVzc2FnZSwgY2hhbmdlczogW3tsYWJlbCwgYmVmb3JlLCBhZnRlcn1dIH0KICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fQogICAgICovCiAgICBzaG93KHsgdGl0bGUgPSAnQ29uZmlybSBBY3Rpb24nLCBtZXNzYWdlID0gJycsIGNoYW5nZXMgPSBbXSwgb2tMYWJlbCA9ICdPSycsIGNhbmNlbExhYmVsID0gJ0NhbmNlbCcgfSkgewogICAgICAgIHRoaXMudGl0bGVFbC50ZXh0Q29udGVudCA9IHRpdGxlOwogICAgICAgIHRoaXMubWVzc2FnZUVsLnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICB0aGlzLmNoYW5nZXNFbC5pbm5lckhUTUwgPSAnJzsKICAgICAgICB0aGlzLm9rQnRuLnRleHRDb250ZW50ID0gb2tMYWJlbDsKICAgICAgICB0aGlzLmNhbmNlbEJ0bi50ZXh0Q29udGVudCA9IGNhbmNlbExhYmVsOwoKICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBlbCgnZGl2JywgJ2RlY2stY29uZmlybS1jaGFuZ2Utcm93Jyk7CiAgICAgICAgICAgICAgICBjb25zdCBsYmwgPSBlbCgnc3BhbicsICdkZWNrLWNvbmZpcm0tY2hhbmdlLWxhYmVsJywgYy5sYWJlbCk7' +
'CiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gKGMuYWZ0ZXIgLSBjLmJlZm9yZSk7CiAgICAgICAgICAgICAgICBjb25zdCBjbHMgPSBkaWZmID4gMCA/ICdwb3NpdGl2ZScgOiBkaWZmIDwgMCA/ICduZWdhdGl2ZScgOiAnJzsKICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGVsKCdzcGFuJywgYGRlY2stY29uZmlybS1jaGFuZ2UtdmFsICR7Y2xzfWAsIGAke2MuYmVmb3JlfSDihpIgJHtjLmFmdGVyfWApOwogICAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGxibCk7CiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQodmFsKTsKICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlc0VsLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmNoYW5nZXNFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIH0KICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRoaXMuY2hhbmdlc0VsLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICB9CgogICAgICAgIHRoaXMub3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsgdGhpcy5fcmVzb2x2ZSA9IHJlc29sdmU7IH0pOwogICAgfQp9OwoKLyog4pSA4pSAIEFQSSBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKYXN5bmMgZnVuY3Rpb24gYXBpRmV0Y2gocGF0aCwgb3B0aW9ucyA9IHt9KSB7CiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChwYXRoLCB7CiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAuLi4ob3B0aW9ucy5oZWFkZXJzIHx8IHt9KSB9LAogICAgICAgIC4uLm9wdGlvbnMsCiAgICB9KTsKICAgIGlmICghcmVzLm9rKSB7CiAgICAgICAgbGV0IGVyck1zZyA9IGBIVFRQICR7cmVzLnN0YXR1c31gOwogICAgICAgIHRyeSB7IGNvbnN0IGJvZHkgPSBhd2FpdCByZXMuanNvbigpOyBlcnJNc2cgPSBib2R5LmRldGFpbCB8fCBib2R5Lm1lc3NhZ2UgfHwgZXJyTXNnOyB9IGNhdGNoIChfKSB7fQogICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpOwogICAgfQogICAgaWYgKHJlcy5zdGF0dXMgPT09IDIwNCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gcmVzLmpzb24oKTsKfQoKZnVuY3Rpb24gYXBpR2V0KHBhdGgpIHsgcmV0dXJuIGFwaUZldGNoKHBhdGgpOyB9CmZ1bmN0aW9uIGFwaVBvc3QocGF0aCwgZGF0YSkgeyByZXR1cm4gYXBpRmV0Y2gocGF0aCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSk7IH0KZnVuY3Rpb24gYXBpUHV0KHBhdGgsIGRhdGEpIHsgcmV0dXJuIGFwaUZldGNoKHBhdGgsIHsgbWV0aG9kOiAnUFVUJywgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSkgfSk7IH0KZnVuY3Rpb24gYXBpUGF0Y2gocGF0aCwgZGF0YSkgeyByZXR1cm4gYXBpRmV0Y2gocGF0aCwgeyBtZXRob2Q6ICdQQVRDSCcsIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpIH0pOyB9CmZ1bmN0aW9uIGFwaURlbGV0ZShwYXRoKSB7IHJldHVybiBhcGlGZXRjaChwYXRoLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7IH0KCi8qIOKUgOKUgCBTY3J5ZmFsbCBBdXRvY29tcGxldGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpsZXQgX3NjcnlmYWxsQ2FjaGUgPSB7fTsKCmFzeW5jIGZ1bmN0aW9uIHNjcnlmYWxsQXV0b2NvbXBsZXRlKHF1ZXJ5KSB7CiAgICBpZiAoIXF1ZXJ5IHx8IHF1ZXJ5Lmxlbmd0aCA8IDIpIHJldHVybiBbXTsKICAgIGlmIChfc2NyeWZhbGxDYWNoZVtxdWVyeV0pIHJldHVybiBfc2NyeWZhbGxDYWNoZVtxdWVyeV07CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvYXV0b2NvbXBsZXRlP3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApOwogICAgICAgIGlmICghcmVzLm9rKSByZXR1cm4gW107CiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAg' +
'X3NjcnlmYWxsQ2FjaGVbcXVlcnldID0ganNvbi5kYXRhIHx8IFtdOwogICAgICAgIHJldHVybiBfc2NyeWZhbGxDYWNoZVtxdWVyeV07CiAgICB9IGNhdGNoIChfKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfQp9Cgphc3luYyBmdW5jdGlvbiBzY3J5ZmFsbEZ1enp5U2VhcmNoKHF1ZXJ5KSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvbmFtZWQ/ZnV6enk9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApOwogICAgICAgIGlmICghcmVzLm9rKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gcmVzLmpzb24oKTsKICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQoKYXN5bmMgZnVuY3Rpb24gc2NyeWZhbGxTZWFyY2hDYXJkcyhxdWVyeSkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuc2NyeWZhbGwuY29tL2NhcmRzL3NlYXJjaD9xPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0mdW5pcXVlPWNhcmRzJm9yZGVyPW5hbWVgKTsKICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuIFtdOwogICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgIHJldHVybiBqc29uLmRhdGEgfHwgW107CiAgICB9IGNhdGNoIChfKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfQp9CgovKiDilIDilIAgRURIIFRhcmdldCBSYXRpb3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpjb25zdCBFREhfVEFSR0VUUyA9IHsKICAgIExhbmQ6ICAgICAgICAgeyBtaW46IDM1LCB0YXJnZXQ6IDM3LCBtYXg6IDQwLCBsYWJlbDogJ0xhbmRzJyB9LAogICAgQ3JlYXR1cmU6ICAgICB7IG1pbjogMjAsIHRhcmdldDogMjUsIG1heDogMzIsIGxhYmVsOiAnQ3JlYXR1cmVzJyB9LAogICAgSW5zdGFudDogICAgICB7IG1pbjogNywgIHRhcmdldDogMTAsIG1heDogMTQsIGxhYmVsOiAnSW5zdGFudHMnIH0sCiAgICBTb3JjZXJ5OiAgICAgIHsgbWluOiA1LCAgdGFyZ2V0OiA4LCAgbWF4OiAxMiwgbGFiZWw6ICdTb3JjZXJpZXMnIH0sCiAgICBBcnRpZmFjdDogICAgIHsgbWluOiA2LCAgdGFyZ2V0OiAxMCwgbWF4OiAxNSwgbGFiZWw6ICdBcnRpZmFjdHMnIH0sCiAgICBFbmNoYW50bWVudDogIHsgbWluOiA1LCAgdGFyZ2V0OiA4LCAgbWF4OiAxMiwgbGFiZWw6ICdFbmNoYW50bWVudHMnIH0sCiAgICBQbGFuZXN3YWxrZXI6IHsgbWluOiAwLCAgdGFyZ2V0OiAyLCAgbWF4OiA1LCAgbGFiZWw6ICdQbGFuZXN3YWxrZXJzJyB9LAp9OwoKLyoqIE1hcCBhIGNhcmQncyB0eXBlX2xpbmUgdG8gb25lIG9mIHRoZSBjYW5vbmljYWwgZ3JvdXBzLiAqLwpmdW5jdGlvbiBnZXRDYXJkVHlwZUdyb3VwKHR5cGVMaW5lKSB7CiAgICBpZiAoIXR5cGVMaW5lKSByZXR1cm4gJ090aGVyJzsKICAgIGNvbnN0IHQgPSB0eXBlTGluZS50b0xvd2VyQ2FzZSgpOwogICAgaWYgKHQuaW5jbHVkZXMoJ2xhbmQnKSkgICAgICAgICByZXR1cm4gJ0xhbmQnOwogICAgaWYgKHQuaW5jbHVkZXMoJ2NyZWF0dXJlJykpICAgICByZXR1cm4gJ0NyZWF0dXJlJzsKICAgIGlmICh0LmluY2x1ZGVzKCdwbGFuZXN3YWxrZXInKSkgcmV0dXJuICdQbGFuZXN3YWxrZXInOwogICAgaWYgKHQuaW5jbHVkZXMoJ2luc3RhbnQnKSkgICAgICByZXR1cm4gJ0luc3RhbnQnOwogICAgaWYgKHQuaW5jbHVkZXMoJ3NvcmNlcnknKSkgICAgICByZXR1cm4gJ1NvcmNlcnknOwogICAgaWYgKHQuaW5jbHVkZXMoJ2FydGlmYWN0JykpICAgICByZXR1cm4gJ0FydGlmYWN0JzsKICAgIGlmICh0LmluY2x1ZGVzKCdlbmNoYW50bWVudCcpKSAgcmV0dXJuICdFbmNoYW50bWVudCc7CiAgICByZXR1cm4gJ090aGVyJzsKfQoKLyoqIFJldHVybiBhIHJhdGlvIHByb2dyZXNzIHN0YXR1cyBzdHJpbmcuICovCmZ1bmN0aW9uIHJhdGlvU3RhdHVzKGNvdW50LCBtaW4sIG1heCkgewogICAgaWYgKGNvdW50ID09PSAwICYmIG1pbiA9PT0gMCkgcmV0dXJuICduZXV0cmFsJzsKICAgIGlmIChjb3VudCA8IG1pbikgIHJldHVybiAnbG93JzsKICAgIGlmIChjb3VudCA+IG1heCkgIHJldHVybiAnb3Zlcic7CiAgICBpZiAoY291bnQgPj0gbWluICYmIGNvdW50IDw9IG1heCkgcmV0dXJuICdvayc7' +
'CiAgICByZXR1cm4gJ3dhcm4nOwp9CgovKiDilIDilIAgRGVib3VuY2UgSGVscGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKZnVuY3Rpb24gZGVib3VuY2UoZm4sIG1zKSB7CiAgICBsZXQgdGltZXI7CiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGZuKC4uLmFyZ3MpLCBtcyk7IH07Cn0KCi8qIOKUgOKUgCBDb2xvciBJZGVudGl0eSBSZW5kZXJpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgpjb25zdCBDT0xPUl9OQU1FUyA9IHsgVzogJ1doaXRlJywgVTogJ0JsdWUnLCBCOiAnQmxhY2snLCBSOiAnUmVkJywgRzogJ0dyZWVuJywgQzogJ0NvbG9ybGVzcycgfTsKCmZ1bmN0aW9uIGJ1aWxkQ29sb3JDaGlwKGNvbG9yKSB7CiAgICBjb25zdCBjaGlwID0gZWwoJ3NwYW4nLCBgZGVjay1jb2xvci1jaGlwIGRlY2stY2hpcC0ke2NvbG9yfWApOwogICAgY2hpcC50ZXh0Q29udGVudCA9IGNvbG9yOwogICAgY2hpcC50aXRsZSA9IENPTE9SX05BTUVTW2NvbG9yXSB8fCBjb2xvcjsKICAgIHJldHVybiBjaGlwOwp9CgpmdW5jdGlvbiBwYXJzZUNvbG9ySWRlbnRpdHkocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuIFtdOwogICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgcmV0dXJuIHJhdzsKICAgIC8vICJXVUJSRyIgc3RyaW5nIG9yIGNvbW1hLXNlcGFyYXRlZAogICAgaWYgKHJhdy5pbmNsdWRlcygnLCcpKSByZXR1cm4gcmF3LnNwbGl0KCcsJykubWFwKGMgPT4gYy50cmltKCkudG9VcHBlckNhc2UoKSk7CiAgICByZXR1cm4gcmF3LnRvVXBwZXJDYXNlKCkuc3BsaXQoJycpLmZpbHRlcihjID0+ICdXVUJSRycuaW5jbHVkZXMoYykpOwp9CgovKiDilIDilIAgVHlwZSBCYWRnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCmZ1bmN0aW9uIGJ1aWxkVHlwZUJhZGdlKHR5cGVMaW5lKSB7CiAgICBjb25zdCBncm91cCA9IGdldENhcmRUeXBlR3JvdXAodHlwZUxpbmUgfHwgJycpOwogICAgY29uc3QgYmFkZ2UgPSBlbCgnc3BhbicsIGBkZWNrLXR5cGUtYmFkZ2UgZGVjay10eXBlLSR7Z3JvdXB9YCwgZ3JvdXBbMF0gPT09ICdQJyAmJiBncm91cCAhPT0gJ1BsYW5lc3dhbGtlcicgPyBncm91cCA6IGdyb3VwLnNsaWNlKDAsIDQpKTsKICAgIGJhZGdlLnRpdGxlID0gdHlwZUxpbmUgfHwgZ3JvdXA7CiAgICByZXR1cm4gYmFkZ2U7Cn0KCi8qIOKUgOKUgCBNYWluIERlY2tCdWlsZGVyIEFwcGxpY2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKY29uc3QgRGVja0J1aWxkZXIgPSB7CiAgICAvKiBTdGF0ZSAqLwogICAgZGVja0lkOiBudWxsLAogICAgZGVja05hbWU6ICcnLAogICAgZGVja0NhcmRzOiBbXSwKICAgIGRlY2tJbmZvOiBudWxsLAogICAgYW5hbHlzaXM6IG51bGwsCiAgICBhbGxEZWNrczogW10sCiAgICBzZWFyY2hSZXN1bHRzOiBbXSwKICAgIHNlYXJjaFF1ZXJ5OiAnJywKICAgIHNlYXJjaFR5cGU6ICcnLAogICAgc2VhcmNoQ21jTWluOiBudWxsLAogICAgc2VhcmNoQ21jTWF4OiBudWxsLAogICAgc2VhcmNoQ29sb3JzOiBuZXcgU2V0KCksCiAgICBlZGhSZWNEYXRhOiBbXSwKICAgIGVkaFJlY093bmVkT25seTogZmFsc2UsCiAgICBjb21tYW5kZXJTY3J5ZmFsbElkOiBudWxsLAogICAgbmV3Q29tbWFuZGVyU2NyeWZhbGxJZDogbnVsbCwKICAgIG5ld0NvbW1hbmRlck5hbWU6ICcnLAogICAgX3NhdmVUaW1lcjogbnVsbCwKICAgIF9hY3RpdmVUeXBlRmlsdGVyOiBudWxsLAogICAgcHBseENvbmZpZ3VyZWQ6IGZhbHNlLAogICAgYWlHZW5Db21tYW5kZXJOYW1lOiAnJywKICAgIF9haUdlblN1Z2dlc3Rpb25zOiBbXSwKICAgIF9haUdlbkFjdGl2ZUluZGV4OiAtMSwKICAgIF9sYXN0R2VuUmVzdWx0OiBudWxsLAoKICAgIC8qIOKUgOKUgCBJbml0IOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKICAgIGFzeW5jIGluaXQoKSB7CiAgICAgICAgVG9hc3RNYW5hZ2VyLmluaXQoKTsKICAgICAgICBDYXJkUHJldmlldy5pbml0KCk7CiAgICAgICAgQ29uZmlybURpYWxvZy5pbml0KCk7CgogICAgICAgIHRoaXMuX2JpbmRUb3BCYXIoKTsKICAgICAgICB0aGlzLl9iaW5kU2VhcmNoKCk7CiAgICAgICAgdGhpcy5fYmluZFF1aWNrQWRkKCk7CiAgICAgICAgdGhpcy5fYmluZE5ld0RlY2tNb2RhbCgpOwogICAgICAgIHRoaXMuX2JpbmRDb2xsYXBzaWJsZSgpOwogICAgICAgIHRoaXMuX2JpbmRSaWdodENvbHVtbigpOwogICAgICAgIHRoaXMuX2JpbmRBSVBhbmVscygpOwoKICAgICAgICBhd2FpdCB0aGlzLmxvYWREZWNrcygpOwogICAgICAgIHRoaXMuX2NoZWNrUHBseFN0YXR1cygpOwoKICAgICAgICAvLyBSZXN0b3JlIGxhc3QgZGVjayBmcm9tIGxvY2FsU3RvcmFnZQogICAgICAgIGNvbnN0IGxhc3RJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdkZWNrLWJ1aWxkZXItbGFzdC1kZWNrJyk7CiAgICAgICAgaWYgKGxhc3RJZCkgewogICAgICAgICAgICB0aGlzLmRlY2tJZCA9IHBhcnNlSW50KGxhc3RJZCwgMTApOwogICAgICAgICAgICBxcygnI2RlY2stc2VsZWN0b3InKS52YWx1ZSA9IHRoaXMuZGVja0lkOwogICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWREZWNrKHRoaXMuZGVja0lkKTsKICAgICAgICB9CiAgICB9LAoKICAgIC8qIOKUgOKUgCBUb3AgQmFyIEJpbmRpbmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKICAgIF9iaW5kVG9wQmFyKCkgewogICAgICAgIGNvbnN0IHNlbGVjdG9yID0gcXMoJyNkZWNrLXNlbGVjdG9yJyk7CiAgICAgICAgc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYXN5bmMgKGUpID0+IHsKICAgICAgICAgICAgY29uc3QgaWQgPSBwYXJzZUludChlLnRhcmdldC52YWx1ZSwgMTApOwogICAgICAgICAgICBpZiAoIWlzTmFOKGlkKSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWNrSWQgPSBpZDsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERlY2soaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IG5hbWVJbnB1dCA9IHFzKCcjZGVjay1uYW1lLWlucHV0Jyk7CiAgICAgICAgbmFtZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gdGhpcy5fc2NoZWR1bGVTYXZlTmFtZSgpKTsKICAgICAgICBuYW1lSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gdGhpcy5fc2F2ZURlY2tOYW1lKCkpOwoKICAgICAgICBxcygnI2RlY2stbmV3LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fb3Blbk5ld0RlY2tNb2RhbCgpKTsKICAgICAgICBxcygnI2RlY2stZW1wdHktbmV3LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fb3Blbk5ld0RlY2tNb2RhbCgpKTsKCiAgICAgICAgcXMoJyNkZWNrLWV4cG9ydC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX2V4cG9ydERjaygpKTsKICAgICAgICBxcygnI2RlY2stc2ltLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fZXhwb3J0VG9TaW0oKSk7CiAgICAgICAgcXMoJyNkZWNrLWltcG9ydC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX29wZW5JbXBvcnRNb2RhbCgpKTsKICAgICAgICBxcygnI2RlY2stZGVsZXRlLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fZGVsZXRlRGVjaygpKTsKICAgICAgICBxcygnI2RlY2stY2xlYXItYWxsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fY2xlYXJBbGxEZWNrcygpKTsKCiAgICAgICAgLy8gSW1wb3J0IG1vZGFsIHdpcmluZwogICAgICAgIHRoaXMuX2luaXRJbXBvcnRNb2RhbCgpOwoKICAgICAgICAvLyBDb21tYW5kZXIgcG9ydHJhaXQgY2xpY2sgdG8gY2hhbmdlIGNvbW1hbmRlcgogICAgICAgIHFzKCcjZGVjay1jb21tYW5kZXIt' +
'cG9ydHJhaXQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgaWYgKCF0aGlzLmRlY2tJZCkgeyBUb2FzdE1hbmFnZXIuc2hvdygnQ3JlYXRlIGEgZGVjayBmaXJzdC4nLCAnd2FybmluZycpOyByZXR1cm47IH0KICAgICAgICAgICAgdGhpcy5fb3Blbk5ld0RlY2tNb2RhbCh0cnVlKTsKICAgICAgICB9KTsKICAgIH0sCgogICAgX3NjaGVkdWxlU2F2ZU5hbWUoKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3NhdmVUaW1lcik7CiAgICAgICAgdGhpcy5fc2F2ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zYXZlRGVja05hbWUoKSwgMTIwMCk7CiAgICB9LAoKICAgIGFzeW5jIF9zYXZlRGVja05hbWUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmRlY2tJZCkgcmV0dXJuOwogICAgICAgIGNvbnN0IG5hbWUgPSBxcygnI2RlY2stbmFtZS1pbnB1dCcpLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZSA9PT0gdGhpcy5kZWNrTmFtZSkgcmV0dXJuOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IGFwaVB1dChgL2FwaS9kZWNrcy8ke3RoaXMuZGVja0lkfWAsIHsgbmFtZSB9KTsKICAgICAgICAgICAgdGhpcy5kZWNrTmFtZSA9IG5hbWU7CiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hEZWNrU2VsZWN0b3IoKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYEZhaWxlZCB0byByZW5hbWUgZGVjazogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9LAoKICAgIGFzeW5jIF9kZWxldGVEZWNrKCkgewogICAgICAgIGlmICghdGhpcy5kZWNrSWQpIHsgVG9hc3RNYW5hZ2VyLnNob3coJ05vIGRlY2sgc2VsZWN0ZWQuJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9CiAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCBDb25maXJtRGlhbG9nLnNob3coewogICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZSBEZWNrJywKICAgICAgICAgICAgbWVzc2FnZTogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgIicgKyAodGhpcy5kZWNrTmFtZSB8fCAndGhpcyBkZWNrJykgKyAnIj8gVGhpcyBjYW5ub3QgYmUgdW5kb25lLicsCiAgICAgICAgICAgIG9rTGFiZWw6ICdEZWxldGUnLAogICAgICAgIH0pOwogICAgICAgIGlmICghb2spIHJldHVybjsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBhcGlEZWxldGUoJy9hcGkvZGVja3MvJyArIHRoaXMuZGVja0lkKTsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ0RlY2sgZGVsZXRlZC4nLCAnc3VjY2VzcycpOwogICAgICAgICAgICB0aGlzLmRlY2tJZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZGVja0luZm8gPSBudWxsOwogICAgICAgICAgICB0aGlzLmRlY2tOYW1lID0gJyc7CiAgICAgICAgICAgIHRoaXMuZGVja0NhcmRzID0gW107CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdkZWNrLWJ1aWxkZXItbGFzdC1kZWNrJyk7CiAgICAgICAgICAgIHFzKCcjZGVjay1kZWxldGUtYnRuJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGVja3MoKTsKICAgICAgICAgICAgcXMoJyNkZWNrLXNlbGVjdG9yJykudmFsdWUgPSAnJzsKICAgICAgICAgICAgcXMoJyNkZWNrLW5hbWUtaW5wdXQnKS52YWx1ZSA9ICcnOwogICAgICAgICAgICBxcygnI2RlY2stY2FyZC1ncm91cHMnKS5pbm5lckhUTUwgPSAnJzsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ0ZhaWxlZCB0byBkZWxldGUgZGVjazogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9LAoKICAgIGFzeW5jIF9jbGVhckFsbERlY2tzKCkgewogICAgICAgIGlmICghdGhpcy5hbGxEZWNrcy5sZW5ndGgpIHsgVG9hc3RNYW5hZ2VyLnNob3coJ05vIGRlY2tzIHRvIGNsZWFyLicsICd3YXJuaW5nJyk7IHJldHVybjsgfQogICAgICAgIGNvbnN0IG9rID0gYXdhaXQgQ29uZmlybURpYWxvZy5zaG93KHsKICAgICAgICAgICAgdGl0bGU6ICdDbGVhciBBbGwgRGVja3MnLAogICAgICAgICAgICBtZXNzYWdlOiAnRGVsZXRlIGFsbCAnICsgdGhpcy5hbGxEZWNrcy5sZW5ndGggKyAnIGRlY2tzPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuJywKICAgICAgICAgICAgb2tMYWJlbDogJ0RlbGV0ZSBBbGwnLAogICAgICAgIH0pOwogICAgICAgIGlmICghb2spIHJldHVybjsKICAg' +
'ICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBhcGlEZWxldGUoJy9hcGkvZGVja3MnKTsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ0FsbCBkZWNrcyBjbGVhcmVkLicsICdzdWNjZXNzJyk7CiAgICAgICAgICAgIHRoaXMuZGVja0lkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5kZWNrSW5mbyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZGVja05hbWUgPSAnJzsKICAgICAgICAgICAgdGhpcy5kZWNrQ2FyZHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5hbGxEZWNrcyA9IFtdOwogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZGVjay1idWlsZGVyLWxhc3QtZGVjaycpOwogICAgICAgICAgICBxcygnI2RlY2stZGVsZXRlLWJ0bicpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckRlY2tTZWxlY3RvcigpOwogICAgICAgICAgICBxcygnI2RlY2stc2VsZWN0b3InKS52YWx1ZSA9ICcnOwogICAgICAgICAgICBxcygnI2RlY2stbmFtZS1pbnB1dCcpLnZhbHVlID0gJyc7CiAgICAgICAgICAgIHFzKCcjZGVjay1jYXJkLWdyb3VwcycpLmlubmVySFRNTCA9ICcnOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnRmFpbGVkIHRvIGNsZWFyIGRlY2tzOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpOwogICAgICAgIH0KICAgIH0sCgogICAgLyog4pSA4pSAIERlY2sgTG9hZGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgICBhc3luYyBsb2FkRGVja3MoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGFwaUdldCgnL2FwaS9kZWNrcycpOwogICAgICAgICAgICB0aGlzLmFsbERlY2tzID0gQXJyYXkuaXNBcnJheShyZXNwKSA/IHJlc3AgOiAocmVzcC5kZWNrcyB8fCBbXSk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckRlY2tTZWxlY3RvcigpOwogICAgICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgICAgICAgdGhpcy5hbGxEZWNrcyA9IFtdOwogICAgICAgIH0KICAgIH0sCgogICAgX3JlbmRlckRlY2tTZWxlY3RvcigpIHsKICAgICAgICBjb25zdCBzZWwgPSBxcygnI2RlY2stc2VsZWN0b3InKTsKICAgICAgICBjb25zdCBjdXJyZW50ID0gc2VsLnZhbHVlOwogICAgICAgIHNlbC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iIj7igJQgU2VsZWN0IERlY2sg4oCUPC9vcHRpb24+JzsKICAgICAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy5hbGxEZWNrcykgewogICAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTsKICAgICAgICAgICAgb3B0LnZhbHVlID0gZC5pZDsKICAgICAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7ZC5uYW1lfSR7ZC5jb21tYW5kZXJfbmFtZSA/ICcgKCcgKyBkLmNvbW1hbmRlcl9uYW1lICsgJyknIDogJyd9YDsKICAgICAgICAgICAgc2VsLmFwcGVuZENoaWxkKG9wdCk7CiAgICAgICAgfQogICAgICAgIHNlbC52YWx1ZSA9IGN1cnJlbnQ7CiAgICB9LAoKICAgIF9yZWZyZXNoRGVja1NlbGVjdG9yKCkgewogICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuYWxsRGVja3MuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gdGhpcy5kZWNrSWQpOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICB0aGlzLmFsbERlY2tzW2lkeF0ubmFtZSA9IHRoaXMuZGVja05hbWU7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckRlY2tTZWxlY3RvcigpOwogICAgICAgICAgICBxcygnI2RlY2stc2VsZWN0b3InKS52YWx1ZSA9IHRoaXMuZGVja0lkOwogICAgICAgIH0KICAgIH0sCgogICAgYXN5bmMgbG9hZERlY2soaWQpIHsKICAgICAgICBpZiAoIWlkKSByZXR1cm47CiAgICAgICAgdGhpcy5kZWNrSWQgPSBpZDsKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZGVjay1idWlsZGVyLWxhc3QtZGVjaycsIGlkKTsKCiAgICAgICAgLy8gU2hvdyBsb2FkaW5nIHNrZWxldG9ucwogICAgICAgIHRoaXMuX3Nob3dDYXJkR3JvdXBzTG9hZGluZygpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBQYXJhbGxlbCBmZXRjaDogZGVjayBpbmZvICsgY2FyZHMKICAgICAgICAgICAgY29uc3QgW2luZm8sIGNhcmRzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAg' +
'ICAgICAgICAgIGFwaUdldChgL2FwaS9kZWNrcy8ke2lkfWApLAogICAgICAgICAgICAgICAgYXBpR2V0KGAvYXBpL2RlY2tzLyR7aWR9L2NhcmRzYCksCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICB0aGlzLmRlY2tJbmZvID0gaW5mbzsKICAgICAgICAgICAgdGhpcy5kZWNrTmFtZSA9IGluZm8ubmFtZTsKICAgICAgICAgICAgdGhpcy5kZWNrQ2FyZHMgPSBBcnJheS5pc0FycmF5KGNhcmRzKSA/IGNhcmRzIDogKGNhcmRzLmNhcmRzIHx8IFtdKTsKICAgICAgICAgICAgdGhpcy5jb21tYW5kZXJTY3J5ZmFsbElkID0gdGhpcy5kZWNrQ2FyZHMuZmluZChjID0+IGMuaXNfY29tbWFuZGVyKT8uc2NyeWZhbGxfaWQgfHwgbnVsbDsKCiAgICAgICAgICAgIHRoaXMuX3JlbmRlclRvcEJhcigpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJDYXJkR3JvdXBzKCk7CiAgICAgICAgICAgIHRoaXMuX3Nob3dEZWNrQ29udHJvbHMoKTsKCiAgICAgICAgICAgIC8vIExvYWQgYW5hbHlzaXMgZm9yIHJhdGlvIGRhc2hib2FyZCAobm9uLWJsb2NraW5nKQogICAgICAgICAgICB0aGlzLl9sb2FkQW5hbHlzaXMoKTsKCiAgICAgICAgICAgIC8vIFJlZnJlc2ggc2VhcmNoIHJlc3VsdHMgd2l0aCBuZXcgZGVjayBjb250ZXh0CiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFF1ZXJ5KSB0aGlzLl9ydW5TZWFyY2goKTsKCiAgICAgICAgICAgIC8vIEVuYWJsZSBBSSByZXNlYXJjaCBidXR0b24KICAgICAgICAgICAgdGhpcy5fdXBkYXRlQUlSZXNlYXJjaEJ0bigpOwoKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYEZhaWxlZCB0byBsb2FkIGRlY2s6ICR7ZXJyLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckNhcmRHcm91cHMoKTsgLy8gc2hvdyBlbXB0eSBzdGF0ZQogICAgICAgIH0KICAgIH0sCgogICAgX3JlbmRlclRvcEJhcigpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5kZWNrSW5mbzsKICAgICAgICBpZiAoIWluZm8pIHJldHVybjsKCiAgICAgICAgcXMoJyNkZWNrLW5hbWUtaW5wdXQnKS52YWx1ZSA9IGluZm8ubmFtZSB8fCAnJzsKCiAgICAgICAgLy8gQ29tbWFuZGVyIGxhYmVsCiAgICAgICAgY29uc3QgY21kTGFiZWwgPSBxcygnI2RlY2stY29tbWFuZGVyLWxhYmVsJyk7CiAgICAgICAgaWYgKGluZm8uY29tbWFuZGVyX25hbWUpIHsKICAgICAgICAgICAgY21kTGFiZWwudGV4dENvbnRlbnQgPSBpbmZvLmNvbW1hbmRlcl9uYW1lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNtZExhYmVsLnRleHRDb250ZW50ID0gJ05vIGNvbW1hbmRlciBzZWxlY3RlZCc7CiAgICAgICAgfQoKICAgICAgICAvLyBDb21tYW5kZXIgcG9ydHJhaXQKICAgICAgICBjb25zdCBpbWcgPSBxcygnI2RlY2stY29tbWFuZGVyLWltZycpOwogICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gcXMoJy5kZWNrLWNvbW1hbmRlci1wb3J0cmFpdC1wbGFjZWhvbGRlcicpOwogICAgICAgIGNvbnN0IHBvcnRyYWl0ID0gcXMoJyNkZWNrLWNvbW1hbmRlci1wb3J0cmFpdCcpOwogICAgICAgIGNvbnN0IGNtZENhcmQgPSB0aGlzLmRlY2tDYXJkcy5maW5kKGMgPT4gYy5pc19jb21tYW5kZXIpOwogICAgICAgIGlmIChjbWRDYXJkICYmIGNtZENhcmQuc2NyeWZhbGxfaWQpIHsKICAgICAgICAgICAgaW1nLnNyYyA9IGBodHRwczovL2FwaS5zY3J5ZmFsbC5jb20vY2FyZHMvJHtjbWRDYXJkLnNjcnlmYWxsX2lkfT9mb3JtYXQ9aW1hZ2UmdmVyc2lvbj1zbWFsbGA7CiAgICAgICAgICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgcGxhY2Vob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgdGhpcy5jb21tYW5kZXJTY3J5ZmFsbElkID0gY21kQ2FyZC5zY3J5ZmFsbF9pZDsKCiAgICAgICAgICAgIC8vIEF0dGFjaCBjYXJkIHByZXZpZXcgaG92ZXIgdG8gY29tbWFuZGVyIGxhYmVsIGFuZCBwb3J0cmFpdAogICAgICAgICAgICBDYXJkUHJldmlldy5hdHRhY2goY21kTGFiZWwsIGNtZENhcmQuc2NyeWZhbGxfaWQpOwogICAgICAgICAgICBDYXJkUHJldmlldy5hdHRhY2gocG9ydHJhaXQsIGNtZENhcmQuc2NyeWZhbGxfaWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICBwbGFjZWhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAvLyBDb2xv' +
'ciBjaGlwcwogICAgICAgIGNvbnN0IGNoaXBzRWwgPSBxcygnI2RlY2stY29sb3ItY2hpcHMnKTsKICAgICAgICBjaGlwc0VsLmlubmVySFRNTCA9ICcnOwogICAgICAgIGNvbnN0IGNvbG9ycyA9IHBhcnNlQ29sb3JJZGVudGl0eShpbmZvLmNvbG9yX2lkZW50aXR5KTsKICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29sb3JzKSB7CiAgICAgICAgICAgIGNoaXBzRWwuYXBwZW5kQ2hpbGQoYnVpbGRDb2xvckNoaXAoYykpOwogICAgICAgIH0KCiAgICAgICAgLy8gVG90YWwgY291bnQKICAgICAgICB0aGlzLl91cGRhdGVDb3VudERpc3BsYXkoKTsKCiAgICAgICAgLy8gU2VsZWN0b3IKICAgICAgICBxcygnI2RlY2stc2VsZWN0b3InKS52YWx1ZSA9IGluZm8uaWQ7CiAgICB9LAoKICAgIF91cGRhdGVDb3VudERpc3BsYXkoKSB7CiAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmRlY2tDYXJkcy5yZWR1Y2UoKHMsIGMpID0+IHMgKyAoYy5xdWFudGl0eSB8fCAxKSwgMCk7CiAgICAgICAgY29uc3QgY291bnRFbCA9IHFzKCcjZGVjay10b3RhbC1jb3VudCcpOwogICAgICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSB0b3RhbDsKICAgICAgICBjb3VudEVsLmNsYXNzTmFtZSA9ICdkZWNrLWNvdW50LW51bScgKyAodG90YWwgPiAxMDAgPyAnIG92ZXItbGltaXQnIDogdG90YWwgPT09IDEwMCA/ICcgYXQtbGltaXQnIDogJycpOwoKICAgICAgICBjb25zdCBmb290ZXJUb3RhbCA9IHFzKCcjZGVjay1mb290ZXItdG90YWwnKTsKICAgICAgICBpZiAoZm9vdGVyVG90YWwpIGZvb3RlclRvdGFsLnRleHRDb250ZW50ID0gdG90YWw7CgogICAgICAgIGNvbnN0IG93bmVkID0gdGhpcy5kZWNrQ2FyZHMKICAgICAgICAgICAgLmZpbHRlcihjID0+IChjLm93bmVkX3F1YW50aXR5IHx8IDApID49IChjLnF1YW50aXR5IHx8IDEpKQogICAgICAgICAgICAucmVkdWNlKChzLCBjKSA9PiBzICsgKGMucXVhbnRpdHkgfHwgMSksIDApOwogICAgICAgIGNvbnN0IGZvb3Rlck93bmVkID0gcXMoJyNkZWNrLWZvb3Rlci1vd25lZCcpOwogICAgICAgIGlmIChmb290ZXJPd25lZCkgZm9vdGVyT3duZWQudGV4dENvbnRlbnQgPSBvd25lZDsKCiAgICAgICAgY29uc3Qgbm9uTGFuZHMgPSB0aGlzLmRlY2tDYXJkcy5maWx0ZXIoYyA9PiBnZXRDYXJkVHlwZUdyb3VwKGMudHlwZV9saW5lKSAhPT0gJ0xhbmQnKTsKICAgICAgICBjb25zdCBhdmdDbWMgPSBub25MYW5kcy5sZW5ndGggPiAwCiAgICAgICAgICAgID8gKG5vbkxhbmRzLnJlZHVjZSgocywgYykgPT4gcyArIChjLmNtYyB8fCAwKSAqIChjLnF1YW50aXR5IHx8IDEpLCAwKSAvCiAgICAgICAgICAgICAgIG5vbkxhbmRzLnJlZHVjZSgocywgYykgPT4gcyArIChjLnF1YW50aXR5IHx8IDEpLCAwKSkudG9GaXhlZCgxKQogICAgICAgICAgICA6ICcwLjAnOwogICAgICAgIGNvbnN0IGZvb3RlckNtYyA9IHFzKCcjZGVjay1mb290ZXItYXZnLWNtYycpOwogICAgICAgIGlmIChmb290ZXJDbWMpIGZvb3RlckNtYy50ZXh0Q29udGVudCA9IGF2Z0NtYzsKICAgIH0sCgogICAgX3Nob3dEZWNrQ29udHJvbHMoKSB7CiAgICAgICAgcXMoJyNkZWNrLXF1aWNrYWRkLXJvdycpLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICBxcygnI2RlY2stc3RhdHMtZm9vdGVyJykuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICAgIHFzKCcjZGVjay1kZWxldGUtYnRuJykuc3R5bGUuZGlzcGxheSA9IHRoaXMuZGVja0lkID8gJycgOiAnbm9uZSc7CiAgICB9LAoKICAgIC8qIOKUgOKUgCBDYXJkIEdyb3VwcyBSZW5kZXJpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgogICAgX3Nob3dDYXJkR3JvdXBzTG9hZGluZygpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSBxcygnI2RlY2stY2FyZC1ncm91cHMnKTsKICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICAgICAgICAgY29uc3Qgc2tlbCA9IGVsKCdkaXYnLCAnZGVjay1za2VsZXRvbiBkZWNrLXNrZWxldG9uLXJvdycpOwogICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc2tlbCk7CiAgICAgICAgfQogICAgfSwKCiAgICBfcmVuZGVyQ2FyZEdyb3VwcygpIHsKICAgICAgICBjb25zdCBjb250YWluZXIgPSBxcygnI2RlY2stY2FyZC1ncm91cHMnKTsKICAgICAgICBjb250YWluZXIuaW5u' +
'ZXJIVE1MID0gJyc7CgogICAgICAgIGlmICghdGhpcy5kZWNrSWQgfHwgIXRoaXMuZGVja0NhcmRzIHx8IHRoaXMuZGVja0NhcmRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICBjb25zdCBlbXB0eSA9IGVsKCdkaXYnLCAnZGVjay1lbXB0eS1zdGF0ZSBkZWNrLWVtcHR5LXN0YXRlLWxnJyk7CiAgICAgICAgICAgIGNvbnN0IGljb24gPSBlbCgnZGl2JywgJ2RlY2stZW1wdHktaWNvbicsICfimpQnKTsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IGVsKCdkaXYnLCAnZGVjay1lbXB0eS10ZXh0JywgdGhpcy5kZWNrSWQKICAgICAgICAgICAgICAgID8gJ1lvdXIgZGVjayBpcyBlbXB0eS4gQWRkIGNhcmRzIGZyb20gdGhlIHNlYXJjaCBwYW5lbC4nCiAgICAgICAgICAgICAgICA6ICdDcmVhdGUgb3Igc2VsZWN0IGEgZGVjayB0byBzdGFydCBidWlsZGluZy4nKTsKICAgICAgICAgICAgY29uc3QgYnRuID0gZWwoJ2J1dHRvbicsICdkZWNrLWJ0biBkZWNrLWJ0bi1hY2NlbnQnKTsKICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJysgTmV3IERlY2snOwogICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9vcGVuTmV3RGVja01vZGFsKCkpOwogICAgICAgICAgICBlbXB0eS5hcHBlbmRDaGlsZChpY29uKTsKICAgICAgICAgICAgZW1wdHkuYXBwZW5kQ2hpbGQodGV4dCk7CiAgICAgICAgICAgIGlmICghdGhpcy5kZWNrSWQpIGVtcHR5LmFwcGVuZENoaWxkKGJ0bik7CiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbXB0eSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNlcGFyYXRlIGNvbW1hbmRlcihzKSBmcm9tIHRoZSByZXN0CiAgICAgICAgY29uc3QgY29tbWFuZGVycyA9IHRoaXMuZGVja0NhcmRzLmZpbHRlcihjID0+IGMuaXNfY29tbWFuZGVyKTsKICAgICAgICBjb25zdCBub25Db21tYW5kZXJzID0gdGhpcy5kZWNrQ2FyZHMuZmlsdGVyKGMgPT4gIWMuaXNfY29tbWFuZGVyKTsKCiAgICAgICAgLy8gUmVuZGVyIGNvbW1hbmRlciBzZWN0aW9uIGZpcnN0CiAgICAgICAgaWYgKGNvbW1hbmRlcnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBjb25zdCBjbWRTZWN0aW9uID0gdGhpcy5fYnVpbGRTZWN0aW9uKCdDb21tYW5kZXInLCBjb21tYW5kZXJzLCB0cnVlKTsKICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGNtZFNlY3Rpb24pOwogICAgICAgIH0KCiAgICAgICAgLy8gR3JvdXAgcmVtYWluaW5nIGNhcmRzIGJ5IHR5cGUKICAgICAgICBjb25zdCBncm91cHMgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2Ygbm9uQ29tbWFuZGVycykgewogICAgICAgICAgICBjb25zdCBncm91cCA9IGdldENhcmRUeXBlR3JvdXAoY2FyZC50eXBlX2xpbmUpOwogICAgICAgICAgICBpZiAoIWdyb3Vwc1tncm91cF0pIGdyb3Vwc1tncm91cF0gPSBbXTsKICAgICAgICAgICAgZ3JvdXBzW2dyb3VwXS5wdXNoKGNhcmQpOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgT1JERVIgPSBbJ0NyZWF0dXJlJywgJ0xhbmQnLCAnSW5zdGFudCcsICdTb3JjZXJ5JywgJ0FydGlmYWN0JywgJ0VuY2hhbnRtZW50JywgJ1BsYW5lc3dhbGtlcicsICdPdGhlciddOwoKICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgT1JERVIpIHsKICAgICAgICAgICAgaWYgKCFncm91cHNbdHlwZV0gfHwgZ3JvdXBzW3R5cGVdLmxlbmd0aCA9PT0gMCkgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25FbCA9IHRoaXMuX2J1aWxkU2VjdGlvbih0eXBlLCBncm91cHNbdHlwZV0pOwogICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc2VjdGlvbkVsKTsKICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSBtZXRhIGxhYmVsCiAgICAgICAgY29uc3QgbWV0YUVsID0gcXMoJyNkZWNrLWNhcmQtbGlzdC1tZXRhJyk7CiAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmRlY2tDYXJkcy5yZWR1Y2UoKHMsIGMpID0+IHMgKyAoYy5xdWFudGl0eSB8fCAxKSwgMCk7CiAgICAgICAgbWV0YUVsLnRleHRDb250ZW50ID0gYCR7dGhpcy5kZWNrQ2FyZHMubGVuZ3RofSB1bmlxdWUgwrcgJHt0b3RhbH0gdG90YWxgOwoKICAgICAgICB0aGlzLl91cGRhdGVDb3VudERpc3BsYXkoKTsKICAgIH0sCgogICAgX2J1aWxkU2VjdGlvbih0eXBlLCBjYXJkcywgaXNDb21tYW5kZXJTZWN0aW9uKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNDb21tYW5kZXJTZWN0aW9uID8gbnVsbCA6' +
'IEVESF9UQVJHRVRTW3R5cGVdOwogICAgICAgIGNvbnN0IGNvdW50ID0gY2FyZHMucmVkdWNlKChzLCBjKSA9PiBzICsgKGMucXVhbnRpdHkgfHwgMSksIDApOwoKICAgICAgICBjb25zdCBzZWN0aW9uID0gZWwoJ2RpdicsIGBkZWNrLXNlY3Rpb24ke2lzQ29tbWFuZGVyU2VjdGlvbiA/ICcgZGVjay1zZWN0aW9uLWNvbW1hbmRlcicgOiAnJ31gKTsKICAgICAgICBzZWN0aW9uLmRhdGFzZXQudHlwZSA9IHR5cGU7CgogICAgICAgIC8vIFNlY3Rpb24gaGVhZGVyCiAgICAgICAgY29uc3QgaGVhZGVyID0gZWwoJ2RpdicsICdkZWNrLXNlY3Rpb24taGVhZGVyJyk7CgogICAgICAgIGNvbnN0IGFycm93ID0gZWwoJ3NwYW4nLCAnZGVjay1zZWN0aW9uLXRvZ2dsZScsICfilrwnKTsKCiAgICAgICAgY29uc3Qgc2VjdGlvbkxhYmVsID0gaXNDb21tYW5kZXJTZWN0aW9uID8gJ+KalCBDb21tYW5kZXInIDogKHR5cGUgPT09ICdPdGhlcicgPyAnT3RoZXIgLyBNaXNjJyA6IGAke3R5cGV9c2ApOwogICAgICAgIGNvbnN0IG5hbWVMYmwgPSBlbCgnc3BhbicsICdkZWNrLXNlY3Rpb24tbmFtZScsIHNlY3Rpb25MYWJlbCk7CgogICAgICAgIGxldCBjb3VudFRleHQgPSBgJHtjb3VudH1gOwogICAgICAgIGlmICh0YXJnZXQpIGNvdW50VGV4dCArPSBgIC8gfiR7dGFyZ2V0LnRhcmdldH1gOwogICAgICAgIGNvbnN0IGNvdW50TGJsID0gZWwoJ3NwYW4nLCAnZGVjay1zZWN0aW9uLWNvdW50JywgY291bnRUZXh0KTsKCiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGFycm93KTsKICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQobmFtZUxibCk7CiAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKGNvdW50TGJsKTsKCiAgICAgICAgLy8gUHJvZ3Jlc3MgYmFyIChza2lwIGZvciBjb21tYW5kZXIgc2VjdGlvbikKICAgICAgICBpZiAoIWlzQ29tbWFuZGVyU2VjdGlvbikgewogICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IGVsKCdkaXYnLCAnZGVjay1zZWN0aW9uLXByb2dyZXNzJyk7CiAgICAgICAgICAgIGNvbnN0IGZpbGwgPSBlbCgnZGl2JywgJ2RlY2stc2VjdGlvbi1wcm9ncmVzcy1maWxsJyk7CiAgICAgICAgICAgIGlmICh0YXJnZXQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBjdCA9IE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZCgoY291bnQgLyB0YXJnZXQubWF4KSAqIDEwMCkpOwogICAgICAgICAgICAgICAgZmlsbC5zdHlsZS53aWR0aCA9IGAke3BjdH0lYDsKICAgICAgICAgICAgICAgIGZpbGwuY2xhc3NMaXN0LmFkZChgc3RhdHVzLSR7cmF0aW9TdGF0dXMoY291bnQsIHRhcmdldC5taW4sIHRhcmdldC5tYXgpfWApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZmlsbC5zdHlsZS53aWR0aCA9ICc1MCUnOwogICAgICAgICAgICAgICAgZmlsbC5jbGFzc0xpc3QuYWRkKCdzdGF0dXMtbmV1dHJhbCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb2dyZXNzLmFwcGVuZENoaWxkKGZpbGwpOwogICAgICAgICAgICBoZWFkZXIuYXBwZW5kQ2hpbGQocHJvZ3Jlc3MpOwogICAgICAgIH0KCiAgICAgICAgLy8gQm9keQogICAgICAgIGNvbnN0IGJvZHkgPSBlbCgnZGl2JywgJ2RlY2stc2VjdGlvbi1ib2R5Jyk7CiAgICAgICAgLy8gU2V0IGFuIGV4cGxpY2l0IG1heC1oZWlnaHQgc28gQ1NTIHRyYW5zaXRpb24gd29ya3MKICAgICAgICBib2R5LnN0eWxlLm1heEhlaWdodCA9ICc5OTk5cHgnOwoKICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgY2FyZHMpIHsKICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9idWlsZENhcmRSb3coY2FyZCkpOwogICAgICAgIH0KCiAgICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICBjb25zdCBjb2xsYXBzZWQgPSBib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICBhcnJvdy5jbGFzc0xpc3QudG9nZ2xlKCdjb2xsYXBzZWQnLCBjb2xsYXBzZWQpOwogICAgICAgICAgICBpZiAoIWNvbGxhcHNlZCkgewogICAgICAgICAgICAgICAgYm9keS5zdHlsZS5tYXhIZWlnaHQgPSAnOTk5OXB4JzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJvZHkuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgc2VjdGlvbi5hcHBlbmRDaGlsZChoZWFkZXIpOwogICAgICAgIHNlY3Rpb24uYXBwZW5kQ2hpbGQoYm9keSk7CiAgICAgICAgcmV0dXJu' +
'IHNlY3Rpb247CiAgICB9LAoKICAgIF9idWlsZENhcmRSb3coY2FyZCkgewogICAgICAgIGNvbnN0IGlzQ21kID0gY2FyZC5pc19jb21tYW5kZXI7CiAgICAgICAgY29uc3Qgcm93ID0gZWwoJ2RpdicsIGBkZWNrLWNhcmQtcm93JHtpc0NtZCA/ICcgaXMtY29tbWFuZGVyJyA6ICcnfWApOwogICAgICAgIHJvdy5kYXRhc2V0LmNhcmRJZCA9IGNhcmQuaWQ7CgogICAgICAgIC8vIE93bmVkIGRvdAogICAgICAgIGNvbnN0IG93bmVkRG90ID0gZWwoJ3NwYW4nLCBgZGVjay1jYXJkLW93bmVkLWRvdCR7KGNhcmQub3duZWRfcXVhbnRpdHkgfHwgMCkgPiAwID8gJycgOiAnIHVub3duZWQnfWApOwogICAgICAgIG93bmVkRG90LnRpdGxlID0gYE93bmVkOiAke2NhcmQub3duZWRfcXVhbnRpdHkgfHwgMH1gOwogICAgICAgIHJvdy5hcHBlbmRDaGlsZChvd25lZERvdCk7CgogICAgICAgIC8vIE1hbmEgY29zdCAoYmVmb3JlIG5hbWUpCiAgICAgICAgaWYgKGNhcmQubWFuYV9jb3N0KSB7CiAgICAgICAgICAgIGNvbnN0IG1hbmFFbCA9IGJ1aWxkTWFuYUNvc3QoY2FyZC5tYW5hX2Nvc3QpOwogICAgICAgICAgICBtYW5hRWwuY2xhc3NOYW1lID0gJ2RlY2stY2FyZC1yb3ctbWFuYSc7CiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChtYW5hRWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gTmFtZSAoaG92ZXJhYmxlIGZvciBjYXJkIHByZXZpZXcpCiAgICAgICAgY29uc3QgbmFtZUVsID0gZWwoJ3NwYW4nLCAnZGVjay1jYXJkLXJvdy1uYW1lJywgY2FyZC5jYXJkX25hbWUpOwogICAgICAgIGNvbnN0IGhvdmVyU2ZJZCA9IGNhcmQuc2NyeWZhbGxfaWQgfHwgKGlzQ21kID8gdGhpcy5jb21tYW5kZXJTY3J5ZmFsbElkIDogbnVsbCk7CiAgICAgICAgaWYgKGhvdmVyU2ZJZCkgQ2FyZFByZXZpZXcuYXR0YWNoKG5hbWVFbCwgaG92ZXJTZklkKTsKICAgICAgICByb3cuYXBwZW5kQ2hpbGQobmFtZUVsKTsKCiAgICAgICAgLy8gUm9sZSBjaGlwIChvbmx5IGZvciBub24tY29tbWFuZGVyKQogICAgICAgIGlmICghaXNDbWQpIHsKICAgICAgICAgICAgY29uc3Qgcm9sZSA9IGNhcmQucm9sZV90YWcgfHwgJyc7CiAgICAgICAgICAgIGNvbnN0IHJvbGVDaGlwID0gZWwoJ3NwYW4nLCAnZGVjay1jYXJkLXJvbGUtY2hpcCcsIHJvbGUgfHwgJ3JvbGUnKTsKICAgICAgICAgICAgcm9sZUNoaXAudGl0bGUgPSAnQ2xpY2sgdG8gc2V0IHJvbGUnOwogICAgICAgICAgICByb2xlQ2hpcC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX3NldFJvbGVUYWcoY2FyZCkpOwogICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQocm9sZUNoaXApOwogICAgICAgIH0KCiAgICAgICAgLy8gUXVhbnRpdHkgY29udHJvbHMgKG5vdCBmb3IgY29tbWFuZGVyKQogICAgICAgIGlmICghaXNDbWQpIHsKICAgICAgICAgICAgY29uc3QgcXR5V3JhcCA9IGVsKCdkaXYnLCAnZGVjay1xdHktY29udHJvbHMnKTsKICAgICAgICAgICAgY29uc3QgbWludXNCdG4gPSBlbCgnYnV0dG9uJywgJ2RlY2stcXR5LWJ0bicsICfiiJInKTsKICAgICAgICAgICAgY29uc3QgcXR5TnVtID0gZWwoJ3NwYW4nLCAnZGVjay1xdHktbnVtJywgU3RyaW5nKGNhcmQucXVhbnRpdHkgfHwgMSkpOwogICAgICAgICAgICBjb25zdCBwbHVzQnRuID0gZWwoJ2J1dHRvbicsICdkZWNrLXF0eS1idG4nLCAnKycpOwoKICAgICAgICAgICAgbWludXNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9jaGFuZ2VRdHkoY2FyZCwgLTEpKTsKICAgICAgICAgICAgcGx1c0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICAoKSA9PiB0aGlzLl9jaGFuZ2VRdHkoY2FyZCwgKzEpKTsKCiAgICAgICAgICAgIHF0eVdyYXAuYXBwZW5kQ2hpbGQobWludXNCdG4pOwogICAgICAgICAgICBxdHlXcmFwLmFwcGVuZENoaWxkKHF0eU51bSk7CiAgICAgICAgICAgIHF0eVdyYXAuYXBwZW5kQ2hpbGQocGx1c0J0bik7CiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChxdHlXcmFwKTsKICAgICAgICB9CgogICAgICAgIC8vIENvbW1hbmRlciBiYWRnZSAoYWZ0ZXIgb3RoZXIgY29udHJvbHMsIGF0IGVuZCBvZiByb3cpCiAgICAgICAgaWYgKGlzQ21kKSB7CiAgICAgICAgICAgIGNvbnN0IGNtZEJhZGdlID0gZWwoJ3NwYW4nLCAnZGVjay1jYXJkLWNvbW1hbmRlci1iYWRnZScsICdDb21tYW5kZXInKTsKICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGNtZEJhZGdlKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlbW92' +
'ZSBidXR0b24KICAgICAgICBjb25zdCByZW1vdmVCdG4gPSBlbCgnYnV0dG9uJywgJ2RlY2stY2FyZC1yZW1vdmUtYnRuJywgJ+KclScpOwogICAgICAgIHJlbW92ZUJ0bi50aXRsZSA9ICdSZW1vdmUgZnJvbSBkZWNrJzsKICAgICAgICByZW1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9yZW1vdmVDYXJkKGNhcmQpKTsKICAgICAgICByb3cuYXBwZW5kQ2hpbGQocmVtb3ZlQnRuKTsKCiAgICAgICAgcmV0dXJuIHJvdzsKICAgIH0sCgogICAgYXN5bmMgX2NoYW5nZVF0eShjYXJkLCBkZWx0YSkgewogICAgICAgIGNvbnN0IG5ld1F0eSA9IChjYXJkLnF1YW50aXR5IHx8IDEpICsgZGVsdGE7CiAgICAgICAgaWYgKG5ld1F0eSA8IDEpIHsKICAgICAgICAgICAgYXdhaXQgdGhpcy5fcmVtb3ZlQ2FyZChjYXJkKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBhcGlQYXRjaChgL2FwaS9kZWNrcy8ke3RoaXMuZGVja0lkfS9jYXJkcy8ke2NhcmQuaWR9YCwgeyBxdWFudGl0eTogbmV3UXR5IH0pOwogICAgICAgICAgICBjYXJkLnF1YW50aXR5ID0gbmV3UXR5OwogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJvdydzIHF1YW50aXR5IGRpc3BsYXkgd2l0aG91dCBmdWxsIHJlLXJlbmRlcgogICAgICAgICAgICBjb25zdCByb3cgPSBxcyhgW2RhdGEtY2FyZC1pZD0iJHtjYXJkLmlkfSJdYCk7CiAgICAgICAgICAgIGlmIChyb3cpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHFzKCcuZGVjay1xdHktbnVtJywgcm93KTsKICAgICAgICAgICAgICAgIGlmIChudW0pIG51bS50ZXh0Q29udGVudCA9IG5ld1F0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl91cGRhdGVDb3VudERpc3BsYXkoKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmF0aW9CYXIoZ2V0Q2FyZFR5cGVHcm91cChjYXJkLnR5cGVfbGluZSkpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdyhgRmFpbGVkIHRvIHVwZGF0ZSBxdWFudGl0eTogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9LAoKICAgIGFzeW5jIF9yZW1vdmVDYXJkKGNhcmQpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBhd2FpdCBhcGlEZWxldGUoYC9hcGkvZGVja3MvJHt0aGlzLmRlY2tJZH0vY2FyZHMvJHtjYXJkLmlkfWApOwogICAgICAgICAgICB0aGlzLmRlY2tDYXJkcyA9IHRoaXMuZGVja0NhcmRzLmZpbHRlcihjID0+IGMuaWQgIT09IGNhcmQuaWQpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJDYXJkR3JvdXBzKCk7CiAgICAgICAgICAgIHRoaXMuX2xvYWRBbmFseXNpcygpOwogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdyhgUmVtb3ZlZCAke2NhcmQuY2FyZF9uYW1lfWAsICdpbmZvJyk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KGBGYWlsZWQgdG8gcmVtb3ZlOiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpOwogICAgICAgIH0KICAgIH0sCgogICAgYXN5bmMgX3NldFJvbGVUYWcoY2FyZCkgewogICAgICAgIGNvbnN0IHJvbGVzID0gWydyYW1wJywgJ2RyYXcnLCAncmVtb3ZhbCcsICd3aXBlJywgJ3R1dG9yJywgJ3Byb3RlY3Rpb24nLCAnd2luLWNvbicsICdzeW5lcmd5JywgJ3ZhbHVlJywgJ2JlYXRkb3duJywgJyddOwogICAgICAgIGNvbnN0IGN1cnJlbnQgPSBjYXJkLnJvbGVfdGFnIHx8ICcnOwogICAgICAgIGNvbnN0IGN1cnJlbnRJZHggPSByb2xlcy5pbmRleE9mKGN1cnJlbnQpOwogICAgICAgIGNvbnN0IG5leHQgPSByb2xlc1soY3VycmVudElkeCArIDEpICUgcm9sZXMubGVuZ3RoXTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYXdhaXQgYXBpUGF0Y2goYC9hcGkvZGVja3MvJHt0aGlzLmRlY2tJZH0vY2FyZHMvJHtjYXJkLmlkfWAsIHsgcm9sZV90YWc6IG5leHQgfSk7CiAgICAgICAgICAgIGNhcmQucm9sZV90YWcgPSBuZXh0OwogICAgICAgICAgICBjb25zdCByb3cgPSBxcyhgW2RhdGEtY2FyZC1pZD0iJHtjYXJkLmlkfSJdYCk7CiAgICAgICAgICAgIGlmIChyb3cpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoaXAgPSBxcygnLmRlY2stY2FyZC1yb2xlLWNoaXAnLCByb3cpOwogICAgICAgICAgICAgICAgaWYgKGNoaXApIGNoaXAudGV4dENvbnRlbnQgPSBuZXh0IHx8ICdyb2xlJzsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0' +
'Y2ggKGVycikgewogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdyhgRmFpbGVkIHRvIHNldCByb2xlOiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpOwogICAgICAgIH0KICAgIH0sCgogICAgLyog4pSA4pSAIEFkZGluZyBDYXJkcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgICBhc3luYyBhZGRDYXJkVG9EZWNrKHNjcnlmYWxsSWQsIGNhcmROYW1lLCBxdWFudGl0eSA9IDEsIGlzQ29tbWFuZGVyID0gZmFsc2UpIHsKICAgICAgICBpZiAoIXRoaXMuZGVja0lkKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KCdTZWxlY3Qgb3IgY3JlYXRlIGEgZGVjayBmaXJzdC4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IGFwaVBvc3QoYC9hcGkvZGVja3MvJHt0aGlzLmRlY2tJZH0vY2FyZHNgLCB7CiAgICAgICAgICAgICAgICBzY3J5ZmFsbF9pZDogc2NyeWZhbGxJZCwKICAgICAgICAgICAgICAgIGNhcmRfbmFtZTogY2FyZE5hbWUgfHwgJycsCiAgICAgICAgICAgICAgICBxdWFudGl0eSwKICAgICAgICAgICAgICAgIGlzX2NvbW1hbmRlcjogaXNDb21tYW5kZXIgPyAxIDogMCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIFJlbG9hZCBkZWNrIGNhcmRzCiAgICAgICAgICAgIGNvbnN0IF9jYXJkc1Jlc3AgPSBhd2FpdCBhcGlHZXQoYC9hcGkvZGVja3MvJHt0aGlzLmRlY2tJZH0vY2FyZHNgKTsKICAgICAgICAgICAgdGhpcy5kZWNrQ2FyZHMgPSBBcnJheS5pc0FycmF5KF9jYXJkc1Jlc3ApID8gX2NhcmRzUmVzcCA6IChfY2FyZHNSZXNwLmNhcmRzIHx8IFtdKTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyQ2FyZEdyb3VwcygpOwogICAgICAgICAgICB0aGlzLl9sb2FkQW5hbHlzaXMoKTsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYEFkZGVkICR7Y2FyZE5hbWV9YCwgJ3N1Y2Nlc3MnKTsKICAgICAgICAgICAgLy8gUmVmcmVzaCBzZWFyY2ggcmVzdWx0cyB0byB1cGRhdGUgaW4tZGVjayBzdGF0dXMKICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHRoaXMuX3JlZnJlc2hTZWFyY2hJbkRlY2tTdGF0dXMoKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGluIGRlY2snKSB8fCBlcnIubWVzc2FnZS5pbmNsdWRlcygnYWxyZWFkeSBleGlzdHMnKSkgewogICAgICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYCR7Y2FyZE5hbWV9IGlzIGFscmVhZHkgaW4geW91ciBkZWNrYCwgJ3dhcm5pbmcnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KGBGYWlsZWQgdG8gYWRkICR7Y2FyZE5hbWV9OiAke2Vyci5tZXNzYWdlfWAsICdlcnJvcicpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKCiAgICBfcmVmcmVzaFNlYXJjaEluRGVja1N0YXR1cygpIHsKICAgICAgICBjb25zdCBpbkRlY2tJZHMgPSBuZXcgU2V0KHRoaXMuZGVja0NhcmRzLm1hcChjID0+IGMuc2NyeWZhbGxfaWQpKTsKICAgICAgICBxc2EoJy5kZWNrLXNlYXJjaC1yb3cnLCBxcygnI2RlY2stc2VhcmNoLXJlc3VsdHMnKSkuZm9yRWFjaChyb3cgPT4gewogICAgICAgICAgICBjb25zdCBpZCA9IHJvdy5kYXRhc2V0LnNjcnlmYWxsSWQ7CiAgICAgICAgICAgIGlmIChpbkRlY2tJZHMuaGFzKGlkKSkgewogICAgICAgICAgICAgICAgcm93LmNsYXNzTGlzdC5hZGQoJ2luLWRlY2snKTsKICAgICAgICAgICAgICAgIGNvbnN0IGFkZEJ0biA9IHFzKCcuZGVjay1zZWFyY2gtcm93LWFkZCcsIHJvdyk7CiAgICAgICAgICAgICAgICBpZiAoYWRkQnRuKSBhZGRCdG4udGV4dENvbnRlbnQgPSAn4pyTJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJvdy5jbGFzc0xpc3QucmVtb3ZlKCdpbi1kZWNrJyk7CiAgICAgICAgICAgICAgICBjb25zdCBhZGRCdG4gPSBxcygnLmRlY2stc2VhcmNoLXJvdy1hZGQnLCByb3cpOwogICAgICAgICAgICAgICAgaWYgKGFkZEJ0bikgYWRkQnRuLnRleHRDb250ZW50ID0gJysnOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8qIOKUgOKUgCBDb2xsZWN0aW9uIFNlYXJjaCDilIDi' +
'lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgICBfYmluZFNlYXJjaCgpIHsKICAgICAgICBjb25zdCBiYXIgPSBxcygnI2RlY2stc2VhcmNoLWJhcicpOwogICAgICAgIGNvbnN0IHR5cGVGaWx0ZXIgPSBxcygnI2RlY2stdHlwZS1maWx0ZXInKTsKICAgICAgICBjb25zdCBjbWNNaW4gPSBxcygnI2RlY2stY21jLW1pbicpOwogICAgICAgIGNvbnN0IGNtY01heCA9IHFzKCcjZGVjay1jbWMtbWF4Jyk7CgogICAgICAgIGNvbnN0IGRlYm91bmNlZFNlYXJjaCA9IGRlYm91bmNlKCgpID0+IHRoaXMuX3J1blNlYXJjaCgpLCAzNTApOwoKICAgICAgICBiYXIuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZSkgPT4gewogICAgICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gZS50YXJnZXQudmFsdWUudHJpbSgpOwogICAgICAgICAgICBkZWJvdW5jZWRTZWFyY2goKTsKICAgICAgICB9KTsKCiAgICAgICAgdHlwZUZpbHRlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gewogICAgICAgICAgICB0aGlzLnNlYXJjaFR5cGUgPSBlLnRhcmdldC52YWx1ZTsKICAgICAgICAgICAgdGhpcy5fcnVuU2VhcmNoKCk7CiAgICAgICAgfSk7CgogICAgICAgIGNtY01pbi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gewogICAgICAgICAgICB0aGlzLnNlYXJjaENtY01pbiA9IGUudGFyZ2V0LnZhbHVlICE9PSAnJyA/IHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlLCAxMCkgOiBudWxsOwogICAgICAgICAgICBkZWJvdW5jZWRTZWFyY2goKTsKICAgICAgICB9KTsKCiAgICAgICAgY21jTWF4LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgICAgICAgIHRoaXMuc2VhcmNoQ21jTWF4ID0gZS50YXJnZXQudmFsdWUgIT09ICcnID8gcGFyc2VJbnQoZS50YXJnZXQudmFsdWUsIDEwKSA6IG51bGw7CiAgICAgICAgICAgIGRlYm91bmNlZFNlYXJjaCgpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBDb2xvciBmaWx0ZXIgcGlsbHMKICAgICAgICBxcygnI2RlY2stY29sb3ItZmlsdGVyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgICAgICAgICBjb25zdCBidG4gPSBlLnRhcmdldC5jbG9zZXN0KCcuZGVjay1jb2xvci1waXAnKTsKICAgICAgICAgICAgaWYgKCFidG4pIHJldHVybjsKICAgICAgICAgICAgY29uc3QgY29sb3IgPSBidG4uZGF0YXNldC5jb2xvcjsKICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoQ29sb3JzLmhhcyhjb2xvcikpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoQ29sb3JzLmRlbGV0ZShjb2xvcik7CiAgICAgICAgICAgICAgICBidG4uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaENvbG9ycy5hZGQoY29sb3IpOwogICAgICAgICAgICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlYm91bmNlZFNlYXJjaCgpOwogICAgICAgIH0pOwoKICAgICAgICBxcygnI2RlY2stYWRkLWFsbC1vd25lZC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX2FkZEFsbE1hdGNoaW5nKCkpOwogICAgfSwKCiAgICBhc3luYyBfcnVuU2VhcmNoKCkgewogICAgICAgIGNvbnN0IHJlc3VsdHNFbCA9IHFzKCcjZGVjay1zZWFyY2gtcmVzdWx0cycpOwoKICAgICAgICBpZiAoIXRoaXMuc2VhcmNoUXVlcnkgJiYgIXRoaXMuc2VhcmNoVHlwZSAmJiB0aGlzLnNlYXJjaENvbG9ycy5zaXplID09PSAwICYmIHRoaXMuc2VhcmNoQ21jTWluID09PSBudWxsICYmIHRoaXMuc2VhcmNoQ21jTWF4ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJlc3VsdHNFbC5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgY29uc3QgZW1wdHkgPSBlbCgnZGl2JywgJ2RlY2stZW1wdHktc3RhdGUnKTsKICAgICAgICAgICAgZW1wdHkuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdkZWNrLWVtcHR5LWljb24nLCAn8J+DjycpKTsKICAgICAgICAgICAgZW1wdHkuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdkZWNrLWVtcHR5LXRleHQnLCAnU2VhcmNoIHlvdXIgY29sbGVjdGlvbiB0byBhZGQgY2FyZHMnKSk7CiAgICAgICAgICAgIHJlc3VsdHNFbC5hcHBlbmRDaGlsZChlbXB0eSk7CiAgICAgICAgICAgIHFzKCcjZGVj' +
'ay1zZWFyY2gtY291bnQnKS50ZXh0Q29udGVudCA9ICcwIHJlc3VsdHMnOwogICAgICAgICAgICBxcygnI2RlY2stYWRkLWFsbC1vd25lZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93IGxvYWRpbmcKICAgICAgICByZXN1bHRzRWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImRlY2stbG9hZGluZy1pbmxpbmUiPjxkaXYgY2xhc3M9ImRlY2stbG9hZGluZy1zcGlubmVyIj48L2Rpdj5TZWFyY2hpbmcuLi48L2Rpdj4nOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBsZXQgcGFyYW1zID0gWydwYWdlU2l6ZT0yMDAnXTsKICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnkpIHBhcmFtcy5wdXNoKGBxPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuc2VhcmNoUXVlcnkpfWApOwogICAgICAgICAgICBpZiAodGhpcy5kZWNrSWQpICAgICAgcGFyYW1zLnB1c2goYGRlY2tfaWQ9JHt0aGlzLmRlY2tJZH1gKTsKICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoVHlwZSkgIHBhcmFtcy5wdXNoKGB0eXBlcz0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLnNlYXJjaFR5cGUpfWApOwogICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hDbWNNaW4gIT09IG51bGwpIHBhcmFtcy5wdXNoKGBjbWNNaW49JHt0aGlzLnNlYXJjaENtY01pbn1gKTsKICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoQ21jTWF4ICE9PSBudWxsKSBwYXJhbXMucHVzaChgY21jTWF4PSR7dGhpcy5zZWFyY2hDbWNNYXh9YCk7CiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaENvbG9ycy5zaXplID4gMCkgcGFyYW1zLnB1c2goYGNvbG9ycz0ke1suLi50aGlzLnNlYXJjaENvbG9yc10uam9pbignLCcpfWApOwoKICAgICAgICAgICAgY29uc3QgdXJsID0gYC9hcGkvY29sbGVjdGlvbj8ke3BhcmFtcy5qb2luKCcmJyl9YDsKICAgICAgICAgICAgY29uc3QgX2NvbGxSZXNwID0gYXdhaXQgYXBpR2V0KHVybCk7CiAgICAgICAgICAgIGxldCBjYXJkcyA9IEFycmF5LmlzQXJyYXkoX2NvbGxSZXNwKSA/IF9jb2xsUmVzcCA6IChfY29sbFJlc3AuaXRlbXMgfHwgW10pOwoKICAgICAgICAgICAgLy8gQ2xpZW50LXNpZGUgZmFsbGJhY2sgZmlsdGVycwogICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXJkcyA9IGNhcmRzLmZpbHRlcihjID0+IGdldENhcmRUeXBlR3JvdXAoYy50eXBlX2xpbmUgfHwgJycpID09PSB0aGlzLnNlYXJjaFR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaENtY01pbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FyZHMgPSBjYXJkcy5maWx0ZXIoYyA9PiAoYy5jbWMgfHwgMCkgPj0gdGhpcy5zZWFyY2hDbWNNaW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaENtY01heCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FyZHMgPSBjYXJkcy5maWx0ZXIoYyA9PiAoYy5jbWMgfHwgMCkgPD0gdGhpcy5zZWFyY2hDbWNNYXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHMgPSBjYXJkczsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyU2VhcmNoUmVzdWx0cyhjYXJkcyk7CgogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICByZXN1bHRzRWwuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9ImRlY2stZW1wdHktc3RhdGUiPjxkaXYgY2xhc3M9ImRlY2stZW1wdHktdGV4dCIgc3R5bGU9ImNvbG9yOnZhcigtLWxhYi1kYW5nZXIpIj4ke2Vyci5tZXNzYWdlfTwvZGl2PjwvZGl2PmA7CiAgICAgICAgfQogICAgfSwKCiAgICBfcmVuZGVyU2VhcmNoUmVzdWx0cyhjYXJkcykgewogICAgICAgIGNvbnN0IHJlc3VsdHNFbCA9IHFzKCcjZGVjay1zZWFyY2gtcmVzdWx0cycpOwogICAgICAgIHJlc3VsdHNFbC5pbm5lckhUTUwgPSAnJzsKCiAgICAgICAgcXMoJyNkZWNrLXNlYXJjaC1jb3VudCcpLnRleHRDb250ZW50ID0gYCR7Y2FyZHMubGVuZ3RofSByZXN1bHQke2NhcmRzLmxlbmd0aCAhPT0gMSA/ICdzJyA6ICcnfWA7CgogICAgICAgIGlmIChjYXJkcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgY29uc3QgZW1wdHkgPSBlbCgnZGl2JywgJ2RlY2stZW1wdHktc3RhdGUnKTsKICAgICAgICAgICAgZW1wdHkuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdkZWNrLWVtcHR5LWljb24nLCAn8J+UjScpKTsKICAgICAgICAgICAgZW1wdHku' +
'YXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdkZWNrLWVtcHR5LXRleHQnLCAnTm8gY2FyZHMgZm91bmQgaW4geW91ciBjb2xsZWN0aW9uJykpOwogICAgICAgICAgICByZXN1bHRzRWwuYXBwZW5kQ2hpbGQoZW1wdHkpOwogICAgICAgICAgICBxcygnI2RlY2stYWRkLWFsbC1vd25lZC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBpbkRlY2tJZHMgPSBuZXcgU2V0KHRoaXMuZGVja0NhcmRzLm1hcChjID0+IGMuc2NyeWZhbGxfaWQpKTsKICAgICAgICBsZXQgaGFzT3duZWQgPSBmYWxzZTsKCiAgICAgICAgZm9yIChjb25zdCBjYXJkIG9mIGNhcmRzKSB7CiAgICAgICAgICAgIGNvbnN0IGluRGVjayA9IGluRGVja0lkcy5oYXMoY2FyZC5zY3J5ZmFsbF9pZCk7CiAgICAgICAgICAgIGNvbnN0IG93bmVkID0gKGNhcmQucXVhbnRpdHkgfHwgY2FyZC5vd25lZF9xdWFudGl0eSB8fCAwKSA+IDA7CiAgICAgICAgICAgIGlmIChvd25lZCkgaGFzT3duZWQgPSB0cnVlOwoKICAgICAgICAgICAgY29uc3Qgcm93ID0gZWwoJ2RpdicsIGBkZWNrLXNlYXJjaC1yb3cke2luRGVjayA/ICcgaW4tZGVjaycgOiAnJ31gKTsKICAgICAgICAgICAgcm93LmRhdGFzZXQuc2NyeWZhbGxJZCA9IGNhcmQuc2NyeWZhbGxfaWQ7CgogICAgICAgICAgICBjb25zdCBuYW1lRWwgPSBlbCgnc3BhbicsICdkZWNrLXNlYXJjaC1yb3ctbmFtZScsIGNhcmQuY2FyZF9uYW1lIHx8IGNhcmQubmFtZSk7CiAgICAgICAgICAgIENhcmRQcmV2aWV3LmF0dGFjaChuYW1lRWwsIGNhcmQuc2NyeWZhbGxfaWQpOwoKICAgICAgICAgICAgY29uc3QgbWFuYUVsID0gYnVpbGRNYW5hQ29zdChjYXJkLm1hbmFfY29zdCk7CiAgICAgICAgICAgIG1hbmFFbC5jbGFzc05hbWUgPSAnZGVjay1zZWFyY2gtcm93LW1hbmEnOwoKICAgICAgICAgICAgY29uc3Qgb3duZWRFbCA9IGVsKCdzcGFuJywgYGRlY2stc2VhcmNoLXJvdy1vd25lZCR7b3duZWQgPyAnIGhhcy1vd25lZCcgOiAnJ31gLAogICAgICAgICAgICAgICAgb3duZWQgPyBgw5cke2NhcmQucXVhbnRpdHkgfHwgY2FyZC5vd25lZF9xdWFudGl0eX1gIDogJ+KAlCcpOwogICAgICAgICAgICBvd25lZEVsLnRpdGxlID0gYE93bmVkOiAke2NhcmQucXVhbnRpdHkgfHwgY2FyZC5vd25lZF9xdWFudGl0eSB8fCAwfWA7CgogICAgICAgICAgICBjb25zdCBhZGRCdG4gPSBlbCgnYnV0dG9uJywgJ2RlY2stc2VhcmNoLXJvdy1hZGQnLCBpbkRlY2sgPyAn4pyTJyA6ICcrJyk7CiAgICAgICAgICAgIGFkZEJ0bi50aXRsZSA9IGluRGVjayA/ICdBbHJlYWR5IGluIGRlY2snIDogJ0FkZCB0byBkZWNrJzsKICAgICAgICAgICAgYWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5hZGRDYXJkVG9EZWNrKGNhcmQuc2NyeWZhbGxfaWQsIGNhcmQuY2FyZF9uYW1lIHx8IGNhcmQubmFtZSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKG5hbWVFbCk7CiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChtYW5hRWwpOwogICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQob3duZWRFbCk7CiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChhZGRCdG4pOwogICAgICAgICAgICByZXN1bHRzRWwuYXBwZW5kQ2hpbGQocm93KTsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cgYnVsay1hZGQgYnV0dG9uIGlmIHRoZXJlIGFyZSBvd25lZCBjYXJkcwogICAgICAgIGNvbnN0IGJ1bGtCdG4gPSBxcygnI2RlY2stYWRkLWFsbC1vd25lZC1idG4nKTsKICAgICAgICBidWxrQnRuLnN0eWxlLmRpc3BsYXkgPSBoYXNPd25lZCA/ICcnIDogJ25vbmUnOwogICAgfSwKCiAgICBhc3luYyBfYWRkQWxsTWF0Y2hpbmcoKSB7CiAgICAgICAgY29uc3Qgb3duZWQgPSB0aGlzLnNlYXJjaFJlc3VsdHMuZmlsdGVyKGMgPT4gKGMucXVhbnRpdHkgfHwgYy5vd25lZF9xdWFudGl0eSB8fCAwKSA+IDApOwogICAgICAgIGlmIChvd25lZC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ05vIG93bmVkIGNhcmRzIGluIHNlYXJjaCByZXN1bHRzLicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IENvbmZpcm1EaWFsb2cuc2hvdyh7CiAgICAgICAgICAgIHRpdGxlOiAnQWRkIEFsbCBPd25lZCcsCiAgICAgICAgICAg' +
'IG1lc3NhZ2U6IGBBZGQgYWxsICR7b3duZWQubGVuZ3RofSBvd25lZCBtYXRjaGluZyBjYXJkKHMpIHRvIHlvdXIgZGVjaz9gLAogICAgICAgICAgICBjaGFuZ2VzOiBbeyBsYWJlbDogJ0NhcmRzIHRvIGFkZCcsIGJlZm9yZTogMCwgYWZ0ZXI6IG93bmVkLmxlbmd0aCB9XSwKICAgICAgICB9KTsKICAgICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuOwoKICAgICAgICBsZXQgYWRkZWQgPSAwLCBza2lwcGVkID0gMDsKICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2Ygb3duZWQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGF3YWl0IGFwaVBvc3QoYC9hcGkvZGVja3MvJHt0aGlzLmRlY2tJZH0vY2FyZHNgLCB7CiAgICAgICAgICAgICAgICAgICAgc2NyeWZhbGxfaWQ6IGNhcmQuc2NyeWZhbGxfaWQsCiAgICAgICAgICAgICAgICAgICAgY2FyZF9uYW1lOiBjYXJkLmNhcmRfbmFtZSB8fCBjYXJkLm5hbWUgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IDEsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGFkZGVkKys7CiAgICAgICAgICAgIH0gY2F0Y2ggKF8pIHsKICAgICAgICAgICAgICAgIHNraXBwZWQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3QgX2NyMSA9IGF3YWl0IGFwaUdldChgL2FwaS9kZWNrcy8ke3RoaXMuZGVja0lkfS9jYXJkc2ApOwogICAgICAgIHRoaXMuZGVja0NhcmRzID0gQXJyYXkuaXNBcnJheShfY3IxKSA/IF9jcjEgOiAoX2NyMS5jYXJkcyB8fCBbXSk7CiAgICAgICAgdGhpcy5fcmVuZGVyQ2FyZEdyb3VwcygpOwogICAgICAgIHRoaXMuX2xvYWRBbmFseXNpcygpOwogICAgICAgIHRoaXMuX3JlZnJlc2hTZWFyY2hJbkRlY2tTdGF0dXMoKTsKICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdyhgQnVsayBhZGRlZCAke2FkZGVkfSBjYXJkcyR7c2tpcHBlZCA+IDAgPyBgICgke3NraXBwZWR9IHNraXBwZWQpYCA6ICcnfWAsICdzdWNjZXNzJyk7CiAgICB9LAoKICAgIC8qIOKUgOKUgCBRdWljayBBZGQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgogICAgX2JpbmRRdWlja0FkZCgpIHsKICAgICAgICBjb25zdCBpbnB1dCA9IHFzKCcjZGVjay1xdWlja2FkZC1pbnB1dCcpOwogICAgICAgIGNvbnN0IGRyb3Bkb3duID0gcXMoJyNkZWNrLXF1aWNrYWRkLWRyb3Bkb3duJyk7CiAgICAgICAgY29uc3QgYWRkQnRuID0gcXMoJyNkZWNrLXF1aWNrYWRkLWJ0bicpOwoKICAgICAgICBsZXQgX2FjdGl2ZUluZGV4ID0gLTE7CiAgICAgICAgbGV0IF9zdWdnZXN0aW9ucyA9IFtdOwoKICAgICAgICBjb25zdCBkZWJvdW5jZWRBQyA9IGRlYm91bmNlKGFzeW5jIChxKSA9PiB7CiAgICAgICAgICAgIGlmICghcSB8fCBxLmxlbmd0aCA8IDIpIHsgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gYXdhaXQgc2NyeWZhbGxBdXRvY29tcGxldGUocSk7CiAgICAgICAgICAgIF9zdWdnZXN0aW9ucyA9IG5hbWVzLnNsaWNlKDAsIDgpOwogICAgICAgICAgICBfYWN0aXZlSW5kZXggPSAtMTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyUXVpY2tBZGREcm9wZG93bihfc3VnZ2VzdGlvbnMsIF9hY3RpdmVJbmRleCwgZHJvcGRvd24pOwogICAgICAgIH0sIDI4MCk7CgogICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IGRlYm91bmNlZEFDKGUudGFyZ2V0LnZhbHVlLnRyaW0oKSkpOwoKICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykgewogICAgICAgICAgICAgICAgX2FjdGl2ZUluZGV4ID0gTWF0aC5taW4oX2FjdGl2ZUluZGV4ICsgMSwgX3N1Z2dlc3Rpb25zLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyUXVpY2tBZGREcm9wZG93bihfc3VnZ2VzdGlvbnMsIF9hY3RpdmVJbmRleCwgZHJvcGRvd24pOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dVcCcpIHsKICAgICAgICAgICAgICAgIF9hY3RpdmVJbmRleCA9IE1hdGgubWF4KF9hY3RpdmVJbmRleCAtIDEsIC0x' +
'KTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclF1aWNrQWRkRHJvcGRvd24oX3N1Z2dlc3Rpb25zLCBfYWN0aXZlSW5kZXgsIGRyb3Bkb3duKTsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VudGVyJykgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IF9hY3RpdmVJbmRleCA+PSAwID8gX3N1Z2dlc3Rpb25zW19hY3RpdmVJbmRleF0gOiBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAobmFtZSkgdGhpcy5fcXVpY2tBZGRCeU5hbWUobmFtZSwgaW5wdXQsIGRyb3Bkb3duKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsKICAgICAgICAgICAgICAgIGRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgICAgICAgICBpZiAoIWlucHV0LmNvbnRhaW5zKGUudGFyZ2V0KSAmJiAhZHJvcGRvd24uY29udGFpbnMoZS50YXJnZXQpKSB7CiAgICAgICAgICAgICAgICBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGFkZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgY29uc3QgbmFtZSA9IGlucHV0LnZhbHVlLnRyaW0oKTsKICAgICAgICAgICAgaWYgKG5hbWUpIHRoaXMuX3F1aWNrQWRkQnlOYW1lKG5hbWUsIGlucHV0LCBkcm9wZG93bik7CiAgICAgICAgfSk7CgogICAgICAgIGRyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgY29uc3QgaXRlbSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5kZWNrLXF1aWNrYWRkLWl0ZW0nKTsKICAgICAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpdGVtLmRhdGFzZXQubmFtZTsKICAgICAgICAgICAgICAgIHRoaXMuX3F1aWNrQWRkQnlOYW1lKG5hbWUsIGlucHV0LCBkcm9wZG93bik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0sCgogICAgX3JlbmRlclF1aWNrQWRkRHJvcGRvd24oc3VnZ2VzdGlvbnMsIGFjdGl2ZUluZGV4LCBkcm9wZG93bikgewogICAgICAgIGRyb3Bkb3duLmlubmVySFRNTCA9ICcnOwogICAgICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPT09IDApIHsgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcmV0dXJuOyB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWdnZXN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBjb25zdCBuYW1lID0gc3VnZ2VzdGlvbnNbaV07CiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbCgnZGl2JywgYGRlY2stcXVpY2thZGQtaXRlbSR7aSA9PT0gYWN0aXZlSW5kZXggPyAnIGFjdGl2ZScgOiAnJ31gKTsKICAgICAgICAgICAgaXRlbS5kYXRhc2V0Lm5hbWUgPSBuYW1lOwogICAgICAgICAgICBpdGVtLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ2RlY2stcXVpY2thZGQtaXRlbS1uYW1lJywgbmFtZSkpOwogICAgICAgICAgICBkcm9wZG93bi5hcHBlbmRDaGlsZChpdGVtKTsKICAgICAgICB9CiAgICAgICAgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICB9LAoKICAgIGFzeW5jIF9xdWlja0FkZEJ5TmFtZShuYW1lLCBpbnB1dCwgZHJvcGRvd24pIHsKICAgICAgICBpZiAoIXRoaXMuZGVja0lkKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KCdDcmVhdGUgb3Igc2VsZWN0IGEgZGVjayBmaXJzdC4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgaW5wdXQudmFsdWUgPSAnJzsKCiAgICAgICAgLy8gU2NyeWZhbGwgZnV6enkgbG9va3VwIHRvIGdldCB0aGUgc2NyeWZhbGxfaWQKICAgICAgICBjb25zdCBjYXJkID0gYXdhaXQgc2NyeWZhbGxGdXp6eVNlYXJjaChuYW1lKTsKICAgICAgICBpZiAoIWNhcmQpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYENhcmQgIiR7bmFtZX0iIG5vdCBmb3VuZCBvbiBTY3J5ZmFsbGAsICdlcnJvcicpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGF3YWl0' +
'IHRoaXMuYWRkQ2FyZFRvRGVjayhjYXJkLmlkLCBjYXJkLm5hbWUpOwogICAgfSwKCiAgICAvKiDilIDilIAgQW5hbHlzaXMgJiBSYXRpbyBEYXNoYm9hcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgogICAgYXN5bmMgX2xvYWRBbmFseXNpcygpIHsKICAgICAgICBpZiAoIXRoaXMuZGVja0lkKSByZXR1cm47CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5hbmFseXNpcyA9IGF3YWl0IGFwaUdldChgL2FwaS9kZWNrcy8ke3RoaXMuZGVja0lkfS9hbmFseXNpc2ApOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJSYXRpb0Rhc2hib2FyZCgpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJTaG9ydGZhbGxzKCk7CiAgICAgICAgfSBjYXRjaCAoXykgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJSYXRpb0Rhc2hib2FyZCh0cnVlKTsKICAgICAgICB9CiAgICB9LAoKICAgIF9yZW5kZXJSYXRpb0Rhc2hib2FyZChmYWlsZWQgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IGJhcnNFbCA9IHFzKCcjZGVjay1yYXRpby1iYXJzJyk7CiAgICAgICAgYmFyc0VsLmlubmVySFRNTCA9ICcnOwoKICAgICAgICBpZiAoZmFpbGVkIHx8ICF0aGlzLmFuYWx5c2lzKSB7CiAgICAgICAgICAgIGJhcnNFbC5hcHBlbmRDaGlsZChlbCgnZGl2JywgJ2RlY2stcmF0aW8tcGxhY2Vob2xkZXInLCBmYWlsZWQgPyAnQW5hbHlzaXMgdW5hdmFpbGFibGUnIDogJ0xvYWQgYSBkZWNrIHRvIHNlZSByYXRpb3MnKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGNvdW50cyA9IHRoaXMuYW5hbHlzaXMuY291bnRzX2J5X3R5cGUgfHwge307CgogICAgICAgIGZvciAoY29uc3QgW3R5cGUsIHRndF0gb2YgT2JqZWN0LmVudHJpZXMoRURIX1RBUkdFVFMpKSB7CiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY291bnRzW3R5cGVdIHx8IDA7CiAgICAgICAgICAgIGNvbnN0IG1heFJhbmdlID0gdGd0Lm1heDsKICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gcmF0aW9TdGF0dXMoY291bnQsIHRndC5taW4sIHRndC5tYXgpOwogICAgICAgICAgICBjb25zdCBwY3QgPSBtYXhSYW5nZSA+IDAgPyBNYXRoLm1pbigxMDAsIChjb3VudCAvIG1heFJhbmdlKSAqIDEwMCkgOiAwOwoKICAgICAgICAgICAgY29uc3Qgcm93ID0gZWwoJ2RpdicsIGBkZWNrLXJhdGlvLWJhci1yb3cke3RoaXMuX2FjdGl2ZVR5cGVGaWx0ZXIgPT09IHR5cGUgPyAnIGFjdGl2ZS1maWx0ZXInIDogJyd9YCk7CiAgICAgICAgICAgIHJvdy5kYXRhc2V0LnR5cGUgPSB0eXBlOwogICAgICAgICAgICByb3cudGl0bGUgPSBgJHt0Z3QubGFiZWx9OiAke2NvdW50fSAodGFyZ2V0OiAke3RndC5taW594oCTJHt0Z3QubWF4fSlgOwoKICAgICAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVR5cGVGaWx0ZXIgPT09IHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVUeXBlRmlsdGVyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBxcygnI2RlY2stdHlwZS1maWx0ZXInKS52YWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVUeXBlRmlsdGVyID0gdHlwZTsKICAgICAgICAgICAgICAgICAgICBxcygnI2RlY2stdHlwZS1maWx0ZXInKS52YWx1ZSA9IHR5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9ydW5TZWFyY2goKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclJhdGlvRGFzaGJvYXJkKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBlbCgnc3BhbicsICdkZWNrLXJhdGlvLWJhci1sYWJlbCcsIHRndC5sYWJlbCk7CiAgICAgICAgICAgIGNvbnN0IHRyYWNrID0gZWwoJ2RpdicsICdkZWNrLXJhdGlvLWJhci10cmFjaycpOwogICAgICAgICAgICBjb25zdCBmaWxsICA9IGVsKCdkaXYnLCBgZGVjay1yYXRpby1iYXItZmlsbCBzdGF0dXMtJHtzdGF0dXN9YCk7CiAgICAgICAgICAgIGZpbGwuc3R5bGUud2lkdGggPSBgJHtwY3R9JWA7CgogICAgICAgICAgICAvLyBNaW4vbWF4IGluZGljYXRvciBtYXJrcwogICAgICAgICAgICBpZiAobWF4UmFuZ2UgPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtaW5NYXJrID0gZWwoJ2RpdicsICdkZWNrLXJhdGlv' +
'LWJhci10YXJnZXQtbWluJyk7CiAgICAgICAgICAgICAgICBtaW5NYXJrLnN0eWxlLmxlZnQgPSBgJHsodGd0Lm1pbiAvIG1heFJhbmdlKSAqIDEwMH0lYDsKICAgICAgICAgICAgICAgIGNvbnN0IG1heE1hcmsgPSBlbCgnZGl2JywgJ2RlY2stcmF0aW8tYmFyLXRhcmdldC1tYXgnKTsKICAgICAgICAgICAgICAgIG1heE1hcmsuc3R5bGUubGVmdCA9IGAke01hdGgubWluKDEwMCwgKHRndC5tYXggLyBtYXhSYW5nZSkgKiAxMDApfSVgOwogICAgICAgICAgICAgICAgdHJhY2suYXBwZW5kQ2hpbGQobWluTWFyayk7CiAgICAgICAgICAgICAgICB0cmFjay5hcHBlbmRDaGlsZChtYXhNYXJrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdHJhY2suYXBwZW5kQ2hpbGQoZmlsbCk7CgogICAgICAgICAgICBjb25zdCBudW1zID0gZWwoJ3NwYW4nLCAnZGVjay1yYXRpby1iYXItbnVtcycpOwogICAgICAgICAgICBjb25zdCBjdXIgPSBlbCgnc3BhbicsICdkZWNrLXJhdGlvLWN1cnJlbnQnLCBTdHJpbmcoY291bnQpKTsKICAgICAgICAgICAgbnVtcy5hcHBlbmRDaGlsZChjdXIpOwogICAgICAgICAgICBudW1zLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGAgLyAke3RndC50YXJnZXR9YCkpOwoKICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGxhYmVsKTsKICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHRyYWNrKTsKICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKG51bXMpOwogICAgICAgICAgICBiYXJzRWwuYXBwZW5kQ2hpbGQocm93KTsKICAgICAgICB9CiAgICB9LAoKICAgIF91cGRhdGVSYXRpb0Jhcih0eXBlKSB7CiAgICAgICAgLy8gTGlnaHR3ZWlnaHQgdXBkYXRlOiByZWNhbGN1bGF0ZSBjb3VudCBmb3Igb25lIHR5cGUgYW5kIHJlLWRyYXcKICAgICAgICBjb25zdCBjb3VudHMgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgdGhpcy5kZWNrQ2FyZHMpIHsKICAgICAgICAgICAgY29uc3QgZyA9IGdldENhcmRUeXBlR3JvdXAoY2FyZC50eXBlX2xpbmUpOwogICAgICAgICAgICBjb3VudHNbZ10gPSAoY291bnRzW2ddIHx8IDApICsgKGNhcmQucXVhbnRpdHkgfHwgMSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmFuYWx5c2lzKSB7CiAgICAgICAgICAgIHRoaXMuYW5hbHlzaXMuY291bnRzX2J5X3R5cGUgPSBjb3VudHM7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlclJhdGlvRGFzaGJvYXJkKCk7CiAgICAgICAgfQogICAgfSwKCiAgICBfcmVuZGVyU2hvcnRmYWxscygpIHsKICAgICAgICBjb25zdCBzZkVsID0gcXMoJyNkZWNrLXNob3J0ZmFsbHMnKTsKICAgICAgICBzZkVsLmlubmVySFRNTCA9ICcnOwogICAgICAgIGNvbnN0IGZpeEFjdGlvbnMgPSBxcygnI2RlY2stZml4LWFjdGlvbnMnKTsKCiAgICAgICAgaWYgKCF0aGlzLmFuYWx5c2lzKSB7CiAgICAgICAgICAgIHNmRWwuYXBwZW5kQ2hpbGQoZWwoJ2RpdicsICdkZWNrLXJhdGlvLXBsYWNlaG9sZGVyJywgJ05vIGFuYWx5c2lzIGF2YWlsYWJsZScpKTsKICAgICAgICAgICAgZml4QWN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBjb3VudHMgPSB0aGlzLmFuYWx5c2lzLmNvdW50c19ieV90eXBlIHx8IHt9OwogICAgICAgIGxldCBoYXNJc3N1ZXMgPSBmYWxzZTsKCiAgICAgICAgZm9yIChjb25zdCBbdHlwZSwgdGd0XSBvZiBPYmplY3QuZW50cmllcyhFREhfVEFSR0VUUykpIHsKICAgICAgICAgICAgY29uc3QgY291bnQgPSBjb3VudHNbdHlwZV0gfHwgMDsKICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gcmF0aW9TdGF0dXMoY291bnQsIHRndC5taW4sIHRndC5tYXgpOwogICAgICAgICAgICBpZiAoc3RhdHVzID09PSAnb2snIHx8IHN0YXR1cyA9PT0gJ25ldXRyYWwnKSBjb250aW51ZTsKCiAgICAgICAgICAgIGhhc0lzc3VlcyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHJvdyA9IGVsKCdkaXYnLCAnZGVjay1zaG9ydGZhbGwtcm93Jyk7CiAgICAgICAgICAgIGNvbnN0IGljb24gPSBlbCgnc3BhbicsICdkZWNrLXNob3J0ZmFsbC1pY29uJywgc3RhdHVzID09PSAnbG93JyA/ICfirIcnIDogc3RhdHVzID09PSAnb3ZlcicgPyAn4qyGJyA6ICfimqAnKTsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IGVsKCdzcGFuJywgJ2RlY2stc2hvcnRmYWxsLXRleHQnLCBgJHt0Z3QubGFiZWx9ICgke2NvdW50fSlgKTsKICAgICAgICAgICAgY29uc3QgZGVsdGEgPSB0' +
'Z3QudGFyZ2V0IC0gY291bnQ7CiAgICAgICAgICAgIGNvbnN0IGRlbHRhRWwgPSBlbCgnc3BhbicsIGBkZWNrLXNob3J0ZmFsbC1kZWx0YSAke2RlbHRhID4gMCA/ICduZWVkcy1tb3JlJyA6ICdvdmVyLWNvdW50J31gKTsKICAgICAgICAgICAgZGVsdGFFbC50ZXh0Q29udGVudCA9IGRlbHRhID4gMCA/IGArJHtkZWx0YX0gbmVlZGVkYCA6IGAke2RlbHRhfSBvdmVyYDsKCiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChpY29uKTsKICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKHRleHQpOwogICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoZGVsdGFFbCk7CiAgICAgICAgICAgIHNmRWwuYXBwZW5kQ2hpbGQocm93KTsKICAgICAgICB9CgogICAgICAgIGlmICghaGFzSXNzdWVzKSB7CiAgICAgICAgICAgIGNvbnN0IG9rID0gZWwoJ2RpdicsICdkZWNrLXNob3J0ZmFsbC1yb3cnKTsKICAgICAgICAgICAgb2suYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCAnZGVjay1zaG9ydGZhbGwtaWNvbicsICfinJMnKSk7CiAgICAgICAgICAgIG9rLmFwcGVuZENoaWxkKGVsKCdzcGFuJywgJ2RlY2stc2hvcnRmYWxsLXRleHQgZGVjay10ZXh0LXN1Y2Nlc3MnLCAnUmF0aW9zIGxvb2sgZ29vZCEnKSk7CiAgICAgICAgICAgIHNmRWwuYXBwZW5kQ2hpbGQob2spOwogICAgICAgIH0KCiAgICAgICAgZml4QWN0aW9ucy5zdHlsZS5kaXNwbGF5ID0gaGFzSXNzdWVzID8gJycgOiAnbm9uZSc7CiAgICB9LAoKICAgIC8qIOKUgOKUgCBGaXggTXkgUmF0aW9zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKICAgIF9iaW5kUmlnaHRDb2x1bW4oKSB7CiAgICAgICAgcXMoJyNkZWNrLWF1dG9zdWdnZXN0LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fYXV0b1N1Z2dlc3RGcm9tQ29sbGVjdGlvbigpKTsKICAgICAgICBxcygnI2RlY2stZWRocmVjLXJlZnJlc2gtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9sb2FkRWRoUmVjcygpKTsKICAgICAgICBxcygnI2RlY2stZWRocmVjLW93bmVkLW9ubHknKS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4gewogICAgICAgICAgICB0aGlzLmVkaFJlY093bmVkT25seSA9IGUudGFyZ2V0LmNoZWNrZWQ7CiAgICAgICAgICAgIHRoaXMuX2xvYWRFZGhSZWNzKCk7CiAgICAgICAgfSk7CiAgICAgICAgcXMoJyNkZWNrLWVkaHJlYy1idWxrLW93bmVkLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fYnVsa0FkZEVkaFJlY093bmVkKCkpOwogICAgfSwKCiAgICBhc3luYyBfYXV0b1N1Z2dlc3RGcm9tQ29sbGVjdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuZGVja0lkKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KCdMb2FkIGEgZGVjayBmaXJzdC4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN1Z2dlc3RFbCA9IHFzKCcjZGVjay1maXgtc3VnZ2VzdGlvbnMnKTsKICAgICAgICBzdWdnZXN0RWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgc3VnZ2VzdEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJkZWNrLWxvYWRpbmctaW5saW5lIj48ZGl2IGNsYXNzPSJkZWNrLWxvYWRpbmctc3Bpbm5lciI+PC9kaXY+RmluZGluZyBzdWdnZXN0aW9ucy4uLjwvZGl2Pic7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlY3NSZXNwID0gYXdhaXQgYXBpR2V0KGAvYXBpL2RlY2tzLyR7dGhpcy5kZWNrSWR9L3JlY29tbWVuZGVkLWZyb20tY29sbGVjdGlvbj9tYXhfcmVzdWx0cz0yMGApOwogICAgICAgICAgICAvLyBBUEkgcmV0dXJucyB7Z3JvdXBlZDoge3R5cGU6IFtjYXJkc119LCB0b3RhbCwgc2hvcnRmYWxsX3R5cGVzfQogICAgICAgICAgICAvLyBGbGF0dGVuIGdyb3VwZWQgaW50byBhcnJheSBmb3IgcmVuZGVyaW5nCiAgICAgICAgICAgIGxldCByZWNzTGlzdCA9IFtdOwogICAgICAgICAgICBpZiAocmVjc1Jlc3AgJiYgcmVjc1Jlc3AuZ3JvdXBlZCkgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBjYXJkcyBvZiBPYmplY3QudmFsdWVzKHJlY3NSZXNwLmdyb3VwZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmVjc0xpc3QucHVzaCguLi5jYXJkcyk7CiAgICAgICAgICAg' +
'ICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZWNzUmVzcCkpIHsKICAgICAgICAgICAgICAgIHJlY3NMaXN0ID0gcmVjc1Jlc3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVuZGVyRml4U3VnZ2VzdGlvbnMocmVjc0xpc3QpOwogICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICBzdWdnZXN0RWwuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9ImRlY2stcmF0aW8tcGxhY2Vob2xkZXIiIHN0eWxlPSJjb2xvcjp2YXIoLS1sYWItZGFuZ2VyKSI+JHtlcnIubWVzc2FnZX08L2Rpdj5gOwogICAgICAgIH0KICAgIH0sCgogICAgX3JlbmRlckZpeFN1Z2dlc3Rpb25zKHJlY3MpIHsKICAgICAgICBjb25zdCBzdWdnZXN0RWwgPSBxcygnI2RlY2stZml4LXN1Z2dlc3Rpb25zJyk7CiAgICAgICAgc3VnZ2VzdEVsLmlubmVySFRNTCA9ICcnOwoKICAgICAgICBpZiAoIXJlY3MgfHwgcmVjcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgc3VnZ2VzdEVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCAnZGVjay1yYXRpby1wbGFjZWhvbGRlcicsICdObyBzdWdnZXN0aW9ucyBmb3VuZCBpbiBjb2xsZWN0aW9uJykpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBHcm91cCBieSB0eXBlCiAgICAgICAgY29uc3QgZ3JvdXBzID0ge307CiAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY3MpIHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IGdldENhcmRUeXBlR3JvdXAoci50eXBlX2xpbmUgfHwgJycpOwogICAgICAgICAgICBpZiAoIWdyb3Vwc1t0eXBlXSkgZ3JvdXBzW3R5cGVdID0gW107CiAgICAgICAgICAgIGdyb3Vwc1t0eXBlXS5wdXNoKHIpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChjb25zdCBbdHlwZSwgY2FyZHNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHsKICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBlbCgnZGl2JywgJ2RlY2stZml4LWdyb3VwJyk7CgogICAgICAgICAgICBjb25zdCB0aXRsZVJvdyA9IGVsKCdkaXYnLCAnZGVjay1maXgtZ3JvdXAtdGl0bGUnKTsKICAgICAgICAgICAgdGl0bGVSb3cuYXBwZW5kQ2hpbGQoZWwoJ3NwYW4nLCBudWxsLCB0eXBlKSk7CiAgICAgICAgICAgIGNvbnN0IGFkZEFsbEJ0biA9IGVsKCdidXR0b24nLCAnZGVjay1idG4gZGVjay1idG4teHMgZGVjay1idG4tZ2hvc3QnLCBgQWRkIGFsbCAoJHtjYXJkcy5sZW5ndGh9KWApOwogICAgICAgICAgICBhZGRBbGxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9idWxrQWRkU3VnZ2VzdGlvbnMoY2FyZHMpKTsKICAgICAgICAgICAgdGl0bGVSb3cuYXBwZW5kQ2hpbGQoYWRkQWxsQnRuKTsKICAgICAgICAgICAgZ3JvdXAuYXBwZW5kQ2hpbGQodGl0bGVSb3cpOwoKICAgICAgICAgICAgZm9yIChjb25zdCBjYXJkIG9mIGNhcmRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBlbCgnZGl2JywgJ2RlY2stZml4LWNhcmQnKTsKCiAgICAgICAgICAgICAgICBjb25zdCBjYXJkTmFtZSA9IGNhcmQuY2FyZF9uYW1lIHx8IGNhcmQubmFtZSB8fCAnJzsKICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVFbCA9IGVsKCdzcGFuJywgJ2RlY2stZml4LWNhcmQtbmFtZScsIGNhcmROYW1lKTsKICAgICAgICAgICAgICAgIENhcmRQcmV2aWV3LmF0dGFjaChuYW1lRWwsIGNhcmQuc2NyeWZhbGxfaWQpOwoKICAgICAgICAgICAgICAgIGNvbnN0IG93bmVkRWwgPSBlbCgnc3BhbicsICdkZWNrLWZpeC1jYXJkLW93bmVkJywgYMOXJHtjYXJkLm93bmVkX3F0eSB8fCBjYXJkLm93bmVkX3F1YW50aXR5IHx8IDB9YCk7CgogICAgICAgICAgICAgICAgY29uc3QgYWRkQnRuID0gZWwoJ2J1dHRvbicsICdkZWNrLWJ0biBkZWNrLWJ0bi14cyBkZWNrLWJ0bi1hY2NlbnQnLCAnKycpOwogICAgICAgICAgICAgICAgYWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5hZGRDYXJkVG9EZWNrKGNhcmQuc2NyeWZhbGxfaWQsIGNhcmROYW1lKSk7CgogICAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKG5hbWVFbCk7CiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQob3duZWRFbCk7CiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoYWRkQnRuKTsKICAgICAgICAgICAgICAgIGdyb3VwLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN1Z2dlc3RFbC5hcHBlbmRDaGlsZChncm91cCk7CiAgICAgICAgfQog' +
'ICAgfSwKCiAgICBhc3luYyBfYnVsa0FkZFN1Z2dlc3Rpb25zKGNhcmRzKSB7CiAgICAgICAgaWYgKCF0aGlzLmRlY2tJZCB8fCBjYXJkcy5sZW5ndGggPT09IDApIHJldHVybjsKCiAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgQ29uZmlybURpYWxvZy5zaG93KHsKICAgICAgICAgICAgdGl0bGU6ICdCdWxrIEFkZCBTdWdnZXN0aW9ucycsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBBZGQgJHtjYXJkcy5sZW5ndGh9IHN1Z2dlc3RlZCBjYXJkKHMpIHRvIHRoZSBkZWNrP2AsCiAgICAgICAgICAgIGNoYW5nZXM6IFt7IGxhYmVsOiAnQ2FyZHMgdG8gYWRkJywgYmVmb3JlOiAwLCBhZnRlcjogY2FyZHMubGVuZ3RoIH1dLAogICAgICAgIH0pOwogICAgICAgIGlmICghY29uZmlybWVkKSByZXR1cm47CgogICAgICAgIGxldCBhZGRlZCA9IDAsIHNraXBwZWQgPSAwOwogICAgICAgIGZvciAoY29uc3QgY2FyZCBvZiBjYXJkcykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgYXdhaXQgYXBpUG9zdChgL2FwaS9kZWNrcy8ke3RoaXMuZGVja0lkfS9jYXJkc2AsIHsKICAgICAgICAgICAgICAgICAgICBzY3J5ZmFsbF9pZDogY2FyZC5zY3J5ZmFsbF9pZCwKICAgICAgICAgICAgICAgICAgICBjYXJkX25hbWU6IGNhcmQuY2FyZF9uYW1lIHx8IGNhcmQubmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogMSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYWRkZWQrKzsKICAgICAgICAgICAgfSBjYXRjaCAoXykgewogICAgICAgICAgICAgICAgc2tpcHBlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBjb25zdCBfY3IyID0gYXdhaXQgYXBpR2V0KGAvYXBpL2RlY2tzLyR7dGhpcy5kZWNrSWR9L2NhcmRzYCk7CiAgICAgICAgdGhpcy5kZWNrQ2FyZHMgPSBBcnJheS5pc0FycmF5KF9jcjIpID8gX2NyMiA6IChfY3IyLmNhcmRzIHx8IFtdKTsKICAgICAgICB0aGlzLl9yZW5kZXJDYXJkR3JvdXBzKCk7CiAgICAgICAgdGhpcy5fbG9hZEFuYWx5c2lzKCk7CiAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYEFkZGVkICR7YWRkZWR9IGNhcmRzJHtza2lwcGVkID4gMCA/IGAgKCR7c2tpcHBlZH0gc2tpcHBlZClgIDogJyd9YCwgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgLyog4pSA4pSAIEVESFJFQyBSZWNvbW1lbmRhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgogICAgYXN5bmMgX2xvYWRFZGhSZWNzKCkgewogICAgICAgIGlmICghdGhpcy5kZWNrSWQpIHJldHVybjsKICAgICAgICBjb25zdCBsaXN0RWwgPSBxcygnI2RlY2stZWRocmVjLWxpc3QnKTsKICAgICAgICBsaXN0RWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImRlY2stbG9hZGluZy1pbmxpbmUiPjxkaXYgY2xhc3M9ImRlY2stbG9hZGluZy1zcGlubmVyIj48L2Rpdj5Mb2FkaW5nIEVESFJFQyBkYXRhLi4uPC9kaXY+JzsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgdXJsID0gYC9hcGkvZGVja3MvJHt0aGlzLmRlY2tJZH0vZWRoLXJlY3M/b25seV9vd25lZD0ke3RoaXMuZWRoUmVjT3duZWRPbmx5fSZtYXhfcmVzdWx0cz0zMGA7CiAgICAgICAgICAgIGNvbnN0IGVkaFJlc3AgPSBhd2FpdCBhcGlHZXQodXJsKTsKICAgICAgICAgICAgdGhpcy5lZGhSZWNEYXRhID0gQXJyYXkuaXNBcnJheShlZGhSZXNwKSA/IGVkaFJlc3AgOiAoZWRoUmVzcC5yZWNvbW1lbmRhdGlvbnMgfHwgW10pOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJFZGhSZWNzKCk7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0iZGVjay1yYXRpby1wbGFjZWhvbGRlciIgc3R5bGU9ImNvbG9yOnZhcigtLWxhYi1kYW5nZXIpIj4ke2Vyci5tZXNzYWdlfTwvZGl2PmA7CiAgICAgICAgfQogICAgfSwKCiAgICBfcmVuZGVyRWRoUmVjcygpIHsKICAgICAgICBjb25zdCBsaXN0RWwgPSBxcygnI2RlY2stZWRocmVjLWxpc3QnKTsKICAgICAgICBsaXN0RWwuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgY29uc3QgYnVsa0VsID0gcXMoJyNkZWNrLWVkaHJlYy1idWxrJyk7CgogICAgICAgIGlmICghdGhpcy5lZGhSZWNEYXRhIHx8IHRoaXMuZWRoUmVjRGF0YS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKGVsKCdkaXYnLCAn' +
'ZGVjay1yYXRpby1wbGFjZWhvbGRlcicsICdObyBFREhSRUMgcmVjb21tZW5kYXRpb25zIGF2YWlsYWJsZScpKTsKICAgICAgICAgICAgYnVsa0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGluRGVja0lkcyA9IG5ldyBTZXQodGhpcy5kZWNrQ2FyZHMubWFwKGMgPT4gYy5zY3J5ZmFsbF9pZCkpOwogICAgICAgIGxldCBoYXNPd25lZCA9IGZhbHNlOwoKICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgdGhpcy5lZGhSZWNEYXRhKSB7CiAgICAgICAgICAgIGNvbnN0IGluRGVjayA9IGluRGVja0lkcy5oYXMoY2FyZC5zY3J5ZmFsbF9pZCk7CiAgICAgICAgICAgIGlmIChjYXJkLm93bmVkKSBoYXNPd25lZCA9IHRydWU7CgogICAgICAgICAgICBjb25zdCByb3cgPSBlbCgnZGl2JywgYGRlY2stZWRocmVjLWNhcmQke2luRGVjayA/ICcgaW4tZGVjaycgOiAnJ31gKTsKICAgICAgICAgICAgcm93LmRhdGFzZXQuc2NyeWZhbGxJZCA9IGNhcmQuc2NyeWZhbGxfaWQ7CgogICAgICAgICAgICBjb25zdCBtYWluID0gZWwoJ2RpdicsICdkZWNrLWVkaHJlYy1jYXJkLW1haW4nKTsKCiAgICAgICAgICAgIGNvbnN0IG5hbWVFbCA9IGVsKCdzcGFuJywgJ2RlY2stZWRocmVjLWNhcmQtbmFtZScsIGNhcmQubmFtZSk7CiAgICAgICAgICAgIENhcmRQcmV2aWV3LmF0dGFjaChuYW1lRWwsIGNhcmQuc2NyeWZhbGxfaWQpOwoKICAgICAgICAgICAgY29uc3QgbWV0YSA9IGVsKCdkaXYnLCAnZGVjay1lZGhyZWMtY2FyZC1tZXRhJyk7CgogICAgICAgICAgICBjb25zdCBwY3QgPSBlbCgnc3BhbicsICdkZWNrLWVkaHJlYy1wY3QnKTsKICAgICAgICAgICAgcGN0LmlubmVySFRNTCA9IGA8c3Ryb25nPiR7TWF0aC5yb3VuZCgoY2FyZC5pbmNsdXNpb25fcGN0IHx8IDApICogMTAwKX0lPC9zdHJvbmc+IGluY2wuYDsKCiAgICAgICAgICAgIGNvbnN0IHN5biA9IGVsKCdzcGFuJywgYGRlY2stZWRocmVjLXN5bmVyZ3kkeyhjYXJkLnN5bmVyZ3lfc2NvcmUgfHwgMCkgPiAwID8gJyBwb3NpdGl2ZScgOiAnJ31gKTsKICAgICAgICAgICAgc3luLnRleHRDb250ZW50ID0gYHN5bjogJHtjYXJkLnN5bmVyZ3lfc2NvcmUgIT0gbnVsbCA/IChjYXJkLnN5bmVyZ3lfc2NvcmUgPiAwID8gJysnIDogJycpICsgY2FyZC5zeW5lcmd5X3Njb3JlLnRvRml4ZWQoMikgOiAnbi9hJ31gOwoKICAgICAgICAgICAgY29uc3QgdHlwZUJhZGdlID0gYnVpbGRUeXBlQmFkZ2UoY2FyZC50eXBlX2xpbmUgfHwgJycpOwoKICAgICAgICAgICAgbWV0YS5hcHBlbmRDaGlsZChwY3QpOwogICAgICAgICAgICBtZXRhLmFwcGVuZENoaWxkKHN5bik7CiAgICAgICAgICAgIG1ldGEuYXBwZW5kQ2hpbGQodHlwZUJhZGdlKTsKCiAgICAgICAgICAgIGlmIChjYXJkLm93bmVkKSB7CiAgICAgICAgICAgICAgICBjb25zdCBvd25lZEJhZGdlID0gZWwoJ3NwYW4nLCAnZGVjay1vd25lZC1iYWRnZScsICdPd25lZCcpOwogICAgICAgICAgICAgICAgbWV0YS5hcHBlbmRDaGlsZChvd25lZEJhZGdlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWFpbi5hcHBlbmRDaGlsZChuYW1lRWwpOwogICAgICAgICAgICBtYWluLmFwcGVuZENoaWxkKG1ldGEpOwogICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQobWFpbik7CgogICAgICAgICAgICBpZiAoIWluRGVjaykgewogICAgICAgICAgICAgICAgY29uc3QgYWRkQnRuID0gZWwoJ2J1dHRvbicsICdkZWNrLWJ0biBkZWNrLWJ0bi14cyBkZWNrLWJ0bi1hY2NlbnQnLCAnKycpOwogICAgICAgICAgICAgICAgYWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5hZGRDYXJkVG9EZWNrKGNhcmQuc2NyeWZhbGxfaWQsIGNhcmQubmFtZSkpOwogICAgICAgICAgICAgICAgcm93LmFwcGVuZENoaWxkKGFkZEJ0bik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBpbkRlY2tMYmwgPSBlbCgnc3BhbicsICdkZWNrLXRleHQtbXV0ZWQnLCAn4pyTJyk7CiAgICAgICAgICAgICAgICBpbkRlY2tMYmwuc3R5bGUuZm9udFNpemUgPSAnMTFweCc7CiAgICAgICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQoaW5EZWNrTGJsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGlzdEVsLmFwcGVuZENoaWxkKHJvdyk7CiAgICAgICAgfQoKICAgICAgICBidWxrRWwuc3R5bGUuZGlzcGxheSA9IGhhc093bmVkID8gJycgOiAnbm9uZSc7CiAgICB9LAoKICAgIGFz' +
'eW5jIF9idWxrQWRkRWRoUmVjT3duZWQoKSB7CiAgICAgICAgaWYgKCF0aGlzLmRlY2tJZCkgcmV0dXJuOwogICAgICAgIGNvbnN0IGluRGVja0lkcyA9IG5ldyBTZXQodGhpcy5kZWNrQ2FyZHMubWFwKGMgPT4gYy5zY3J5ZmFsbF9pZCkpOwogICAgICAgIGNvbnN0IHRvQWRkID0gdGhpcy5lZGhSZWNEYXRhLmZpbHRlcihjID0+IGMub3duZWQgJiYgIWluRGVja0lkcy5oYXMoYy5zY3J5ZmFsbF9pZCkpOwoKICAgICAgICBpZiAodG9BZGQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KCdObyBuZXcgb3duZWQgY2FyZHMgdG8gYWRkLicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IENvbmZpcm1EaWFsb2cuc2hvdyh7CiAgICAgICAgICAgIHRpdGxlOiAnQWRkIEFsbCBPd25lZCBFREhSRUMgUmVjcycsCiAgICAgICAgICAgIG1lc3NhZ2U6IGBBZGQgJHt0b0FkZC5sZW5ndGh9IG93bmVkIHJlY29tbWVuZGF0aW9uKHMpIHRvIHRoZSBkZWNrP2AsCiAgICAgICAgICAgIGNoYW5nZXM6IFt7IGxhYmVsOiAnQ2FyZHMgdG8gYWRkJywgYmVmb3JlOiAwLCBhZnRlcjogdG9BZGQubGVuZ3RoIH1dLAogICAgICAgIH0pOwogICAgICAgIGlmICghY29uZmlybWVkKSByZXR1cm47CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IGFwaVBvc3QoYC9hcGkvZGVja3MvJHt0aGlzLmRlY2tJZH0vYnVsay1hZGQtcmVjb21tZW5kZWRgLCB7CiAgICAgICAgICAgICAgICBzb3VyY2U6ICdlZGhyZWMnLAogICAgICAgICAgICAgICAgb25seV9vd25lZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHJlc3BlY3RfcmF0aW9zOiB0cnVlLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgX2NyMyA9IGF3YWl0IGFwaUdldChgL2FwaS9kZWNrcy8ke3RoaXMuZGVja0lkfS9jYXJkc2ApOwogICAgICAgICAgICB0aGlzLmRlY2tDYXJkcyA9IEFycmF5LmlzQXJyYXkoX2NyMykgPyBfY3IzIDogKF9jcjMuY2FyZHMgfHwgW10pOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJDYXJkR3JvdXBzKCk7CiAgICAgICAgICAgIHRoaXMuX2xvYWRBbmFseXNpcygpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJFZGhSZWNzKCk7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KGBBZGRlZCBvd25lZCBFREhSRUMgcmVjb21tZW5kYXRpb25zYCwgJ3N1Y2Nlc3MnKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGFkZCBvbmUgYnkgb25lCiAgICAgICAgICAgIGxldCBhZGRlZCA9IDAsIHNraXBwZWQgPSAwOwogICAgICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgdG9BZGQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpUG9zdChgL2FwaS9kZWNrcy8ke3RoaXMuZGVja0lkfS9jYXJkc2AsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NyeWZhbGxfaWQ6IGNhcmQuc2NyeWZhbGxfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRfbmFtZTogY2FyZC5uYW1lIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl0eTogMSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhZGRlZCsrOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoXykgewogICAgICAgICAgICAgICAgICAgIHNraXBwZWQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBfY3I0ID0gYXdhaXQgYXBpR2V0KGAvYXBpL2RlY2tzLyR7dGhpcy5kZWNrSWR9L2NhcmRzYCk7CiAgICAgICAgICAgIHRoaXMuZGVja0NhcmRzID0gQXJyYXkuaXNBcnJheShfY3I0KSA/IF9jcjQgOiAoX2NyNC5jYXJkcyB8fCBbXSk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckNhcmRHcm91cHMoKTsKICAgICAgICAgICAgdGhpcy5fbG9hZEFuYWx5c2lzKCk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckVkaFJlY3MoKTsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYEFkZGVkICR7YWRkZWR9JHtza2lwcGVkID4gMCA/IGAgKCR7c2tpcHBlZH0gc2tpcHBlZClgIDogJyd9YCwgJ3N1Y2Nlc3MnKTsKICAgICAgICB9CiAgICB9LAoKICAgIC8qIOKUgOKUgCBDb2xsYXBzaWJsZSBQYW5lbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA' +
'4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgogICAgX2JpbmRDb2xsYXBzaWJsZSgpIHsKICAgICAgICBxc2EoJy5kZWNrLXBhbmVsLWhlYWRlci1jb2xsYXBzaWJsZScpLmZvckVhY2goaGVhZGVyID0+IHsKICAgICAgICAgICAgY29uc3QgdGFyZ2V0SWQgPSBoZWFkZXIuZGF0YXNldC50YXJnZXQ7CiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBxcyhgIyR7dGFyZ2V0SWR9YCk7CiAgICAgICAgICAgIGNvbnN0IGFycm93ID0gcXMoJy5kZWNrLWNvbGxhcHNlLWFycm93JywgaGVhZGVyKTsKICAgICAgICAgICAgaWYgKCFib2R5KSByZXR1cm47CiAgICAgICAgICAgIGJvZHkuc3R5bGUubWF4SGVpZ2h0ID0gYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnOwoKICAgICAgICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgaXNDb2xsYXBzZWQgPSBib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICAgICAgYXJyb3cuY2xhc3NMaXN0LnRvZ2dsZSgnY29sbGFwc2VkJywgaXNDb2xsYXBzZWQpOwogICAgICAgICAgICAgICAgYm9keS5zdHlsZS5tYXhIZWlnaHQgPSBpc0NvbGxhcHNlZCA/ICcwcHgnIDogYm9keS5zY3JvbGxIZWlnaHQgKyAxMDAwICsgJ3B4JzsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8qIOKUgOKUgCBOZXcgRGVjayBNb2RhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgICBfYmluZE5ld0RlY2tNb2RhbCgpIHsKICAgICAgICBxcygnI2RlY2stbmV3LW1vZGFsLWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9jbG9zZU5ld0RlY2tNb2RhbCgpKTsKICAgICAgICBxcygnI2RlY2stbmV3LWNhbmNlbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5fY2xvc2VOZXdEZWNrTW9kYWwoKSk7CiAgICAgICAgcXMoJyNkZWNrLW5ldy1tb2RhbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBxcygnI2RlY2stbmV3LW1vZGFsJykpIHRoaXMuX2Nsb3NlTmV3RGVja01vZGFsKCk7CiAgICAgICAgfSk7CiAgICAgICAgcXMoJyNkZWNrLW5ldy1jcmVhdGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX2NyZWF0ZU5ld0RlY2soKSk7CgogICAgICAgIHFzKCcjZGVjay1jbGVhci1jb21tYW5kZXItYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMubmV3Q29tbWFuZGVyU2NyeWZhbGxJZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMubmV3Q29tbWFuZGVyTmFtZSA9ICcnOwogICAgICAgICAgICBxcygnI2RlY2stbmV3LWNvbW1hbmRlci1zZWxlY3RlZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIHFzKCcjZGVjay1uZXctY29tbWFuZGVyLXNlYXJjaCcpLnZhbHVlID0gJyc7CiAgICAgICAgfSk7CgogICAgICAgIC8vIENvbW1hbmRlciBhdXRvY29tcGxldGUgaW4gbmV3IGRlY2sgbW9kYWwKICAgICAgICBjb25zdCBjbWRTZWFyY2ggPSBxcygnI2RlY2stbmV3LWNvbW1hbmRlci1zZWFyY2gnKTsKICAgICAgICBjb25zdCBjbWREcm9wZG93biA9IHFzKCcjZGVjay1uZXctY29tbWFuZGVyLWRyb3Bkb3duJyk7CiAgICAgICAgbGV0IF9jbWRTdWdnZXN0aW9ucyA9IFtdOwogICAgICAgIGxldCBfY21kQWN0aXZlSW5kZXggPSAtMTsKCiAgICAgICAgY29uc3QgZGVib3VuY2VkQ21kU2VhcmNoID0gZGVib3VuY2UoYXN5bmMgKHEpID0+IHsKICAgICAgICAgICAgaWYgKCFxIHx8IHEubGVuZ3RoIDwgMikgeyBjbWREcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyByZXR1cm47IH0KICAgICAgICAgICAgLy8gU2VhcmNoIFNjcnlmYWxsIGZvciBsZWdlbmRhcnkgY3JlYXR1cmVzCiAgICAgICAgICAgIGNvbnN0IGNhcmRzID0gYXdhaXQgc2NyeWZhbGxTZWFyY2hDYXJkcyhgJHtxfSBpczpjb21tYW5kZXJgKTsKICAgICAgICAgICAgX2NtZFN1Z2dlc3Rpb25zID0gY2FyZHMuc2xpY2UoMCwgOCk7CiAgICAgICAgICAgIF9jbWRBY3RpdmVJbmRleCA9IC0xOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJDb21tYW5kZXJEcm9wZG93bihfY21kU3VnZ2VzdGlv' +
'bnMsIF9jbWRBY3RpdmVJbmRleCwgY21kRHJvcGRvd24pOwogICAgICAgIH0sIDM1MCk7CgogICAgICAgIGNtZFNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiBkZWJvdW5jZWRDbWRTZWFyY2goZS50YXJnZXQudmFsdWUudHJpbSgpKSk7CgogICAgICAgIGNtZFNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykgewogICAgICAgICAgICAgICAgX2NtZEFjdGl2ZUluZGV4ID0gTWF0aC5taW4oX2NtZEFjdGl2ZUluZGV4ICsgMSwgX2NtZFN1Z2dlc3Rpb25zLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyQ29tbWFuZGVyRHJvcGRvd24oX2NtZFN1Z2dlc3Rpb25zLCBfY21kQWN0aXZlSW5kZXgsIGNtZERyb3Bkb3duKTsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93VXAnKSB7CiAgICAgICAgICAgICAgICBfY21kQWN0aXZlSW5kZXggPSBNYXRoLm1heChfY21kQWN0aXZlSW5kZXggLSAxLCAtMSk7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJDb21tYW5kZXJEcm9wZG93bihfY21kU3VnZ2VzdGlvbnMsIF9jbWRBY3RpdmVJbmRleCwgY21kRHJvcGRvd24pOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIF9jbWRBY3RpdmVJbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBjb25zdCBjYXJkID0gX2NtZFN1Z2dlc3Rpb25zW19jbWRBY3RpdmVJbmRleF07CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RDb21tYW5kZXJPcHRpb24oY2FyZCwgY21kU2VhcmNoLCBjbWREcm9wZG93bik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgICAgICAgICAgICBjbWREcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGNtZERyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgY29uc3QgaXRlbSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5kZWNrLWNvbW1hbmRlci1vcHRpb24nKTsKICAgICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGl0ZW0uZGF0YXNldC5pbmRleCwgMTApOwogICAgICAgICAgICBjb25zdCBjYXJkID0gX2NtZFN1Z2dlc3Rpb25zW2lkeF07CiAgICAgICAgICAgIGlmIChjYXJkKSB0aGlzLl9zZWxlY3RDb21tYW5kZXJPcHRpb24oY2FyZCwgY21kU2VhcmNoLCBjbWREcm9wZG93bik7CiAgICAgICAgfSk7CgogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgaWYgKCFjbWRTZWFyY2guY29udGFpbnMoZS50YXJnZXQpICYmICFjbWREcm9wZG93bi5jb250YWlucyhlLnRhcmdldCkpIHsKICAgICAgICAgICAgICAgIGNtZERyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0sCgogICAgX3JlbmRlckNvbW1hbmRlckRyb3Bkb3duKGNhcmRzLCBhY3RpdmVJbmRleCwgZHJvcGRvd24pIHsKICAgICAgICBkcm9wZG93bi5pbm5lckhUTUwgPSAnJzsKICAgICAgICBpZiAoY2FyZHMubGVuZ3RoID09PSAwKSB7IGRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IHJldHVybjsgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FyZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgY2FyZCA9IGNhcmRzW2ldOwogICAgICAgICAgICBjb25zdCBpdGVtID0gZWwoJ2RpdicsIGBkZWNrLWNvbW1hbmRlci1vcHRpb24ke2kgPT09IGFjdGl2ZUluZGV4ID8gJyBhY3RpdmUnIDogJyd9YCk7CiAgICAgICAgICAgIGl0ZW0uZGF0YXNldC5pbmRleCA9IGk7CgogICAgICAgICAgICBjb25zdCBuYW1lRWwgPSBlbCgnc3BhbicsICdkZWNrLWNvbW1hbmRlci1vcHRpb24tbmFtZScsIGNhcmQubmFtZSk7CiAgICAgICAgICAgIGNvbnN0IGNvbG9yV3JhcCA9IGVsKCdzcGFuJywgJ2RlY2stY29tbWFuZGVyLW9wdGlvbi1jb2xvcicpOwogICAgICAgICAgICBjb25zdCBjaSA9IGNhcmQuY29sb3JfaWRlbnRpdHkgfHwgW107CiAg' +
'ICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjaSkgewogICAgICAgICAgICAgICAgY29sb3JXcmFwLmFwcGVuZENoaWxkKGJ1aWxkQ29sb3JDaGlwKGMpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaXRlbS5hcHBlbmRDaGlsZChuYW1lRWwpOwogICAgICAgICAgICBpdGVtLmFwcGVuZENoaWxkKGNvbG9yV3JhcCk7CiAgICAgICAgICAgIGRyb3Bkb3duLmFwcGVuZENoaWxkKGl0ZW0pOwogICAgICAgIH0KICAgICAgICBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIH0sCgogICAgX3NlbGVjdENvbW1hbmRlck9wdGlvbihjYXJkLCBpbnB1dCwgZHJvcGRvd24pIHsKICAgICAgICB0aGlzLm5ld0NvbW1hbmRlclNjcnlmYWxsSWQgPSBjYXJkLmlkOwogICAgICAgIHRoaXMubmV3Q29tbWFuZGVyTmFtZSA9IGNhcmQubmFtZTsKICAgICAgICBpbnB1dC52YWx1ZSA9ICcnOwogICAgICAgIGRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgIHFzKCcjZGVjay1uZXctY29tbWFuZGVyLW5hbWUnKS50ZXh0Q29udGVudCA9IGNhcmQubmFtZTsKICAgICAgICBxcygnI2RlY2stbmV3LWNvbW1hbmRlci1zZWxlY3RlZCcpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICB9LAoKICAgIF9vcGVuTmV3RGVja01vZGFsKGNvbW1hbmRlck9ubHkgPSBmYWxzZSkgewogICAgICAgIGNvbnN0IG1vZGFsID0gcXMoJyNkZWNrLW5ldy1tb2RhbCcpOwogICAgICAgIHRoaXMubmV3Q29tbWFuZGVyU2NyeWZhbGxJZCA9IG51bGw7CiAgICAgICAgdGhpcy5uZXdDb21tYW5kZXJOYW1lID0gJyc7CiAgICAgICAgcXMoJyNkZWNrLW5ldy1uYW1lJykudmFsdWUgPSBjb21tYW5kZXJPbmx5ID8gKHRoaXMuZGVja05hbWUgfHwgJycpIDogJyc7CiAgICAgICAgcXMoJyNkZWNrLW5ldy1jb21tYW5kZXItc2VhcmNoJykudmFsdWUgPSAnJzsKICAgICAgICBxcygnI2RlY2stbmV3LWNvbW1hbmRlci1zZWxlY3RlZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICBpZiAoIWNvbW1hbmRlck9ubHkpIHFzKCcjZGVjay1uZXctbmFtZScpLmZvY3VzKCk7CiAgICAgICAgZWxzZSBxcygnI2RlY2stbmV3LWNvbW1hbmRlci1zZWFyY2gnKS5mb2N1cygpOwogICAgfSwKCiAgICBfY2xvc2VOZXdEZWNrTW9kYWwoKSB7CiAgICAgICAgcXMoJyNkZWNrLW5ldy1tb2RhbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgdGhpcy5uZXdDb21tYW5kZXJTY3J5ZmFsbElkID0gbnVsbDsKICAgICAgICB0aGlzLm5ld0NvbW1hbmRlck5hbWUgPSAnJzsKICAgIH0sCgogICAgYXN5bmMgX2NyZWF0ZU5ld0RlY2soKSB7CiAgICAgICAgY29uc3QgbmFtZSA9IHFzKCcjZGVjay1uZXctbmFtZScpLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgcXMoJyNkZWNrLW5ldy1uYW1lJykuZm9jdXMoKTsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ1BsZWFzZSBlbnRlciBhIGRlY2sgbmFtZS4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBwYXlsb2FkID0gewogICAgICAgICAgICBuYW1lLAogICAgICAgICAgICBjb21tYW5kZXJfc2NyeWZhbGxfaWQ6IHRoaXMubmV3Q29tbWFuZGVyU2NyeWZhbGxJZCB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgIGNvbW1hbmRlcl9uYW1lOiB0aGlzLm5ld0NvbW1hbmRlck5hbWUgfHwgdW5kZWZpbmVkLAogICAgICAgIH07CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IGRlY2sgPSBhd2FpdCBhcGlQb3N0KCcvYXBpL2RlY2tzJywgcGF5bG9hZCk7CiAgICAgICAgICAgIHRoaXMuZGVja0lkID0gZGVjay5pZDsKICAgICAgICAgICAgdGhpcy5kZWNrTmFtZSA9IGRlY2submFtZTsKICAgICAgICAgICAgdGhpcy5fY2xvc2VOZXdEZWNrTW9kYWwoKTsKCiAgICAgICAgICAgIC8vIEFkZCBjb21tYW5kZXIgY2FyZCBCRUZPUkUgbG9hZGluZyBkZWNrIHNvIGl0IHJlbmRlcnMgY29ycmVjdGx5CiAgICAgICAgICAgIGlmICh0aGlzLm5ld0NvbW1hbmRlclNjcnlmYWxsSWQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpUG9zdChgL2FwaS9kZWNrcy8ke2RlY2suaWR9L2NhcmRzYCwgewogICAgICAgICAgICAgICAgICAgICAgICBzY3J5ZmFsbF9pZDogdGhpcy5uZXdDb21tYW5kZXJTY3J5ZmFsbElk' +
'LAogICAgICAgICAgICAgICAgICAgICAgICBjYXJkX25hbWU6IHRoaXMubmV3Q29tbWFuZGVyTmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbW1hbmRlcjogMSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNtZEVycikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFkZCBjb21tYW5kZXIgY2FyZDonLCBjbWRFcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWREZWNrcygpOwogICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWREZWNrKGRlY2suaWQpOwogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdyhgQ3JlYXRlZCBkZWNrICIke2RlY2submFtZX0iYCwgJ3N1Y2Nlc3MnKTsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coYEZhaWxlZCB0byBjcmVhdGUgZGVjazogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTsKICAgICAgICB9CiAgICB9LAoKICAgIC8qIOKUgOKUgCBJbXBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgogICAgX2ltcG9ydEZpbGVUZXh0OiAnJywKCiAgICBfaW5pdEltcG9ydE1vZGFsKCkgewogICAgICAgIGNvbnN0IG1vZGFsID0gcXMoJyNkZWNrLWltcG9ydC1tb2RhbCcpOwogICAgICAgIGNvbnN0IGNsb3NlTW9kYWwgPSAoKSA9PiB7IG1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH07CiAgICAgICAgcXMoJyNkZWNrLWltcG9ydC1tb2RhbC1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7CiAgICAgICAgcXMoJyNkZWNrLWltcG9ydC1jYW5jZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpOwogICAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgY2xvc2VNb2RhbCgpOyB9KTsKCiAgICAgICAgLy8gVGFicwogICAgICAgIGZvciAoY29uc3QgdGFiIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZWNrLWltcG9ydC10YWInKSkgewogICAgICAgICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGVjay1pbXBvcnQtdGFiJykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpOwogICAgICAgICAgICAgICAgdGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgICAgICAgICAgICAgY29uc3Qgd2hpY2ggPSB0YWIuZGF0YXNldC50YWI7CiAgICAgICAgICAgICAgICBxcygnI2RlY2staW1wb3J0LXBhc3RlLXBhbmVsJykuc3R5bGUuZGlzcGxheSA9IHdoaWNoID09PSAncGFzdGUnID8gJycgOiAnbm9uZSc7CiAgICAgICAgICAgICAgICBxcygnI2RlY2staW1wb3J0LWZpbGUtcGFuZWwnKS5zdHlsZS5kaXNwbGF5ID0gd2hpY2ggPT09ICdmaWxlJyA/ICcnIDogJ25vbmUnOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIEZpbGUgdXBsb2FkCiAgICAgICAgY29uc3QgZHJvcHpvbmUgPSBxcygnI2RlY2staW1wb3J0LWRyb3B6b25lJyk7CiAgICAgICAgY29uc3QgZmlsZUlucHV0ID0gcXMoJyNkZWNrLWltcG9ydC1maWxlJyk7CiAgICAgICAgZHJvcHpvbmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBmaWxlSW5wdXQuY2xpY2soKSk7CiAgICAgICAgZHJvcHpvbmUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGRyb3B6b25lLmNsYXNzTGlzdC5hZGQoJ2RyYWdvdmVyJyk7IH0pOwogICAgICAgIGRyb3B6b25lLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsICgpID0+IGRyb3B6b25lLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdvdmVyJykpOwogICAgICAgIGRyb3B6b25lLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCAoZSkgPT4gewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIGRyb3B6b25lLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWdvdmVyJyk7' +
'CiAgICAgICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGgpIHRoaXMuX2hhbmRsZUltcG9ydEZpbGUoZS5kYXRhVHJhbnNmZXIuZmlsZXNbMF0pOwogICAgICAgIH0pOwogICAgICAgIGZpbGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgIGlmIChmaWxlSW5wdXQuZmlsZXMubGVuZ3RoKSB0aGlzLl9oYW5kbGVJbXBvcnRGaWxlKGZpbGVJbnB1dC5maWxlc1swXSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIE1vZGUgcmFkaW8gdG9nZ2xlcyBuYW1lIHJvdyB2aXNpYmlsaXR5CiAgICAgICAgZm9yIChjb25zdCByYWRpbyBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPSJpbXBvcnQtbW9kZSJdJykpIHsKICAgICAgICAgICAgcmFkaW8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgbW9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9ImltcG9ydC1tb2RlIl06Y2hlY2tlZCcpLnZhbHVlOwogICAgICAgICAgICAgICAgcXMoJyNkZWNrLWltcG9ydC1uZXctbmFtZS1yb3cnKS5zdHlsZS5kaXNwbGF5ID0gbW9kZSA9PT0gJ25ldycgPyAnJyA6ICdub25lJzsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHbyBidXR0b24KICAgICAgICBxcygnI2RlY2staW1wb3J0LWdvJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLl9kb0ltcG9ydCgpKTsKICAgIH0sCgogICAgX2hhbmRsZUltcG9ydEZpbGUoZmlsZSkgewogICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0RmlsZVRleHQgPSByZWFkZXIucmVzdWx0OwogICAgICAgICAgICBxcygnI2RlY2staW1wb3J0LWZpbGUtbmFtZScpLnRleHRDb250ZW50ID0gZmlsZS5uYW1lICsgJyAoJyArIChyZWFkZXIucmVzdWx0LnNwbGl0KCdcbicpLmxlbmd0aCkgKyAnIGxpbmVzKSc7CiAgICAgICAgfTsKICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTsKICAgIH0sCgogICAgX29wZW5JbXBvcnRNb2RhbCgpIHsKICAgICAgICBjb25zdCBtb2RhbCA9IHFzKCcjZGVjay1pbXBvcnQtbW9kYWwnKTsKICAgICAgICBxcygnI2RlY2staW1wb3J0LXRleHRhcmVhJykudmFsdWUgPSAnJzsKICAgICAgICBxcygnI2RlY2staW1wb3J0LW5hbWUnKS52YWx1ZSA9ICcnOwogICAgICAgIHFzKCcjZGVjay1pbXBvcnQtZmlsZS1uYW1lJykudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICBxcygnI2RlY2staW1wb3J0LWZpbGUnKS52YWx1ZSA9ICcnOwogICAgICAgIHFzKCcjZGVjay1pbXBvcnQtcHJvZ3Jlc3MnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHFzKCcjZGVjay1pbXBvcnQtcmVzdWx0Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBxcygnI2RlY2staW1wb3J0LWdvJykuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBxcygnI2RlY2staW1wb3J0LWdvJykudGV4dENvbnRlbnQgPSAnSW1wb3J0JzsKICAgICAgICB0aGlzLl9pbXBvcnRGaWxlVGV4dCA9ICcnOwoKICAgICAgICAvLyBJZiBubyBkZWNrIGxvYWRlZCwgZGVmYXVsdCB0byAibmV3IgogICAgICAgIGlmICghdGhpcy5kZWNrSWQpIHsKICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT0iaW1wb3J0LW1vZGUiXVt2YWx1ZT0ibmV3Il0nKS5jaGVja2VkID0gdHJ1ZTsKICAgICAgICAgICAgcXMoJyNkZWNrLWltcG9ydC1uZXctbmFtZS1yb3cnKS5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnOwogICAgICAgIHFzKCcjZGVjay1pbXBvcnQtdGV4dGFyZWEnKS5mb2N1cygpOwogICAgfSwKCiAgICBhc3luYyBfZG9JbXBvcnQoKSB7CiAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRlY2staW1wb3J0LXRhYi5hY3RpdmUnKS5kYXRhc2V0LnRhYjsKICAgICAgICBsZXQgdGV4dCA9ICcnOwoKICAgICAgICBpZiAoYWN0aXZlVGFiID09PSAncGFzdGUnKSB7CiAgICAgICAgICAgIHRleHQgPSBxcygnI2RlY2staW1wb3J0LXRleHRhcmVhJykudmFsdWUudHJpbSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRleHQgPSB0aGlzLl9pbXBvcnRGaWxlVGV4dDsKICAg' +
'ICAgICB9CgogICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnTm8gZGVja2xpc3QgdG8gaW1wb3J0LicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IG1vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPSJpbXBvcnQtbW9kZSJdOmNoZWNrZWQnKS52YWx1ZTsKICAgICAgICBjb25zdCBpbXBvcnRCdG4gPSBxcygnI2RlY2staW1wb3J0LWdvJyk7CiAgICAgICAgaW1wb3J0QnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBpbXBvcnRCdG4udGV4dENvbnRlbnQgPSAnSW1wb3J0aW5nLi4uJzsKCiAgICAgICAgcXMoJyNkZWNrLWltcG9ydC1wcm9ncmVzcycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgIHFzKCcjZGVjay1pbXBvcnQtcHJvZ3Jlc3MtYmFyJykuc3R5bGUud2lkdGggPSAnMzAlJzsKICAgICAgICBxcygnI2RlY2staW1wb3J0LXJlc3VsdCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGxldCByZXN1bHQ7CgogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ25ldycpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBxcygnI2RlY2staW1wb3J0LW5hbWUnKS52YWx1ZS50cmltKCk7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9kZWNrcy9pbXBvcnQtbmV3JywgewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGV4dCwgbmFtZSB9KSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IpOwoKICAgICAgICAgICAgICAgIHFzKCcjZGVjay1pbXBvcnQtcHJvZ3Jlc3MtYmFyJykuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgICAgICAgICAgICB0aGlzLl9zaG93SW1wb3J0UmVzdWx0KHJlc3VsdCk7CgogICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgbmV3IGRlY2sKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERlY2tzKCk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWREZWNrKHJlc3VsdC5kZWNrSWQpOwogICAgICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ0ltcG9ydGVkICInICsgcmVzdWx0LmRlY2tOYW1lICsgJyIgKCcgKyByZXN1bHQuYWRkZWQgKyAnIGNhcmRzKScsICdzdWNjZXNzJyk7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gYWRkIG9yIHJlcGxhY2UgaW50byBjdXJyZW50IGRlY2sKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kZWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnU2VsZWN0IG9yIGNyZWF0ZSBhIGRlY2sgZmlyc3QsIG9yIHVzZSAiQ3JlYXRlIG5ldyBkZWNrIiBtb2RlLicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0QnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0QnRuLnRleHRDb250ZW50ID0gJ0ltcG9ydCc7CiAgICAgICAgICAgICAgICAgICAgcXMoJyNkZWNrLWltcG9ydC1wcm9ncmVzcycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFyRmlyc3QgPSBtb2RlID09PSAncmVwbGFjZSc7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9kZWNrcy8nICsgdGhpcy5kZWNrSWQgKyAnL2ltcG9ydCcsIHsKICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRleHQsIGNsZWFyRmlyc3QgfSksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB0aHJvdyBuZXcg' +
'RXJyb3IocmVzdWx0LmVycm9yKTsKCiAgICAgICAgICAgICAgICBxcygnI2RlY2staW1wb3J0LXByb2dyZXNzLWJhcicpLnN0eWxlLndpZHRoID0gJzEwMCUnOwogICAgICAgICAgICAgICAgdGhpcy5fc2hvd0ltcG9ydFJlc3VsdChyZXN1bHQpOwoKICAgICAgICAgICAgICAgIC8vIFJlbG9hZCBjdXJyZW50IGRlY2sKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERlY2sodGhpcy5kZWNrSWQpOwogICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJ0ltcG9ydGVkICcgKyByZXN1bHQuYWRkZWQgKyAnIGNhcmRzJyArIChyZXN1bHQuZmFpbGVkID4gMCA/ICcgKCcgKyByZXN1bHQuZmFpbGVkICsgJyBub3QgZm91bmQpJyA6ICcnKTsKICAgICAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KG1zZywgcmVzdWx0LmZhaWxlZCA+IDAgPyAnd2FybmluZycgOiAnc3VjY2VzcycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDbG9zZSBtb2RhbCBhZnRlciBzaG9ydCBkZWxheQogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgIHFzKCcjZGVjay1pbXBvcnQtbW9kYWwnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9LCAxNTAwKTsKCiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KCdJbXBvcnQgZmFpbGVkOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGltcG9ydEJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBpbXBvcnRCdG4udGV4dENvbnRlbnQgPSAnSW1wb3J0JzsKICAgICAgICB9CiAgICB9LAoKICAgIF9zaG93SW1wb3J0UmVzdWx0KHJlc3VsdCkgewogICAgICAgIGNvbnN0IGVsID0gcXMoJyNkZWNrLWltcG9ydC1yZXN1bHQnKTsKICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKCiAgICAgICAgbGV0IGh0bWwgPSAnPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyI+JzsKICAgICAgICBodG1sICs9ICc8c3BhbiBzdHlsZT0iY29sb3I6ICMzZmI5NTA7IGZvbnQtd2VpZ2h0OiA2MDA7Ij4nICsgcmVzdWx0LmFkZGVkICsgJyBjYXJkcyBpbXBvcnRlZDwvc3Bhbj4nOwogICAgICAgIGlmIChyZXN1bHQuZmFpbGVkID4gMCkgewogICAgICAgICAgICBodG1sICs9ICcgJm1kYXNoOyA8c3BhbiBzdHlsZT0iY29sb3I6ICNmODUxNDk7Ij4nICsgcmVzdWx0LmZhaWxlZCArICcgbm90IGZvdW5kPC9zcGFuPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDZweDsgY29sb3I6ICM4Yjk0OWU7IGZvbnQtc2l6ZTogMTJweDsiPic7CiAgICAgICAgICAgIGh0bWwgKz0gJ05vdCBmb3VuZDogJyArIChyZXN1bHQuZmFpbGVkTmFtZXMgfHwgW10pLmpvaW4oJywgJyk7CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgZWwuaW5uZXJIVE1MID0gaHRtbDsKICAgIH0sCgogICAgLyog4pSA4pSAIEV4cG9ydCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgICBfZXhwb3J0RGNrKCkgewogICAgICAgIGlmICghdGhpcy5kZWNrSWQgfHwgdGhpcy5kZWNrQ2FyZHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KCdObyBkZWNrIGxvYWRlZC4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxpbmVzID0gW107CiAgICAgICAgY29uc3QgY29tbWFuZGVycyA9IHRoaXMuZGVja0NhcmRzLmZpbHRlcihjID0+IGMuaXNfY29tbWFuZGVyKTsKICAgICAgICBjb25zdCBub25DbWQgPSB0aGlzLmRlY2tDYXJkcy5maWx0ZXIoYyA9PiAhYy5pc19jb21tYW5kZXIpOwoKICAgICAgICBpZiAoY29tbWFuZGVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGxpbmVzLnB1c2goJ1tDb21tYW5kZXJdJyk7CiAgICAgICAgICAgIGZvciAoY29uc3QgYyBvZiBjb21tYW5kZXJzKSB7CiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKGAxICR7Yy5jYXJkX25hbWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7CiAgICAgICAgfQoKICAgICAgICBsaW5l' +
'cy5wdXNoKCdbRGVja10nKTsKICAgICAgICBmb3IgKGNvbnN0IGMgb2Ygbm9uQ21kKSB7CiAgICAgICAgICAgIGxpbmVzLnB1c2goYCR7Yy5xdWFudGl0eSB8fCAxfSAke2MuY2FyZF9uYW1lfWApOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtsaW5lcy5qb2luKCdcbicpXSwgeyB0eXBlOiAndGV4dC9wbGFpbicgfSk7CiAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIGEuaHJlZiA9IHVybDsKICAgICAgICBhLmRvd25sb2FkID0gYCR7KHRoaXMuZGVja05hbWUgfHwgJ2RlY2snKS5yZXBsYWNlKC9bXmEtejAtOV8tXS9naSwgJ18nKX0uZGNrYDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgICAgIGEuY2xpY2soKTsKICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwogICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsKICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnRXhwb3J0ZWQgLmRjayBmaWxlJywgJ3N1Y2Nlc3MnKTsKICAgIH0sCgogICAgYXN5bmMgX2V4cG9ydFRvU2ltKCkgewogICAgICAgIGlmICghdGhpcy5kZWNrSWQpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ0xvYWQgYSBkZWNrIGZpcnN0LicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29uc3QgYnRuID0gcXMoJyNkZWNrLXNpbS1idG4nKTsKICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGNvbnN0IG9yaWdpbmFsVGV4dCA9IGJ0bi5pbm5lckhUTUw7CiAgICAgICAgYnRuLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJkZWNrLWxvYWRpbmctc3Bpbm5lciI+PC9kaXY+IFNpbXVsYXRpbmcuLi4nOwoKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBSdW4gYSBxdWljayAxMC1nYW1lIHNpbSBkaXJlY3RseQogICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zaW0vcnVuLWZyb20tZGVjaycsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRlY2tJZDogdGhpcy5kZWNrSWQsIG51bUdhbWVzOiAxMCwgcmVjb3JkTG9nczogZmFsc2UgfSksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBjdCA9IHJlcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJyc7CiAgICAgICAgICAgIGlmICghY3QuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkgewogICAgICAgICAgICAgICAgY29uc3QgdHh0ID0gYXdhaXQgcmVzLnRleHQoKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIHJldHVybmVkIG5vbi1KU09OIChIVFRQICcgKyByZXMuc3RhdHVzICsgJyk6ICcgKyB0eHQuc3Vic3RyaW5nKDAsIDEyMCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIGlmIChzdGFydERhdGEuZXJyb3IpIHRocm93IG5ldyBFcnJvcihzdGFydERhdGEuZXJyb3IpOwoKICAgICAgICAgICAgLy8gUG9sbCB1bnRpbCBkb25lCiAgICAgICAgICAgIGNvbnN0IHNpbUlkID0gc3RhcnREYXRhLnNpbUlkOwogICAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlOwogICAgICAgICAgICB3aGlsZSAoIWRvbmUpIHsKICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAzMDApKTsKICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c1JlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3NpbS9zdGF0dXM/c2ltSWQ9JyArIHNpbUlkKTsKICAgICAgICAgICAgICAgIGlmICghc3RhdHVzUmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ1N0YXR1cyBwb2xsIGZhaWxlZDogSFRUUCAnICsgc3RhdHVzUmVzLnN0YXR1cyk7CiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGF0dXNSZXMuanNvbigpOwogICAgICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJkZWNrLWxvYWRpbmctc3Bpbm5lciI+PC9kaXY+ICcgKyBzdGF0dXMuY29tcGxldGVkICsgJy8nICsgc3RhdHVzLnRvdGFsOwogICAgICAgICAgICAgICAgaWYgKHN0' +
'YXR1cy5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHsKICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS9zaW0vcmVzdWx0P3NpbUlkPScgKyBzaW1JZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRSZXMub2spIHRocm93IG5ldyBFcnJvcignUmVzdWx0IGZldGNoIGZhaWxlZDogSFRUUCAnICsgcmVzdWx0UmVzLnN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UmVzLmpzb24oKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gcmVzdWx0LnN1bW1hcnk7CiAgICAgICAgICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coCiAgICAgICAgICAgICAgICAgICAgICAgIGBXaW4gUmF0ZTogJHtzLndpblJhdGV9JSAoJHtzLndpbnN9Vy8ke3MubG9zc2VzfUwpIHwgQXZnICR7cy5hdmdUdXJuc30gdHVybnMgfCAke3MuZWxhcHNlZFNlY29uZHN9c2AsCiAgICAgICAgICAgICAgICAgICAgICAgIHMud2luUmF0ZSA+PSA1MCA/ICdzdWNjZXNzJyA6ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgNjAwMAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgLy8gT2ZmZXIgdG8gb3BlbiBmdWxsIHNpbXVsYXRvcgogICAgICAgICAgICAgICAgICAgIGlmIChjb25maXJtKGBRdWljayBzaW06ICR7cy53aW5SYXRlfSUgd2luIHJhdGUgKCR7cy53aW5zfS8ke3MudG90YWxHYW1lc30pLlxuXG5PcGVuIHRoZSBmdWxsIFNpbXVsYXRvciBwYWdlIGZvciBkZXRhaWxlZCByZXN1bHRzP2ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJ3NpbXVsYXRvci5odG1sJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5zdGF0dXMgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Ioc3RhdHVzLmVycm9yIHx8ICdTaW11bGF0aW9uIGZhaWxlZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KGBTaW11bGF0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gLCAnZXJyb3InKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9IG9yaWdpbmFsVGV4dDsKICAgICAgICB9CiAgICB9LAoKICAgIC8qIOKUgOKUgCBBSSBQYW5lbHMgKFBlcnBsZXhpdHkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKICAgIGFzeW5jIF9jaGVja1BwbHhTdGF0dXMoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgYXBpR2V0KCcvYXBpL3BwbHgvc3RhdHVzJyk7CiAgICAgICAgICAgIHRoaXMucHBseENvbmZpZ3VyZWQgPSBzdGF0dXMgJiYgc3RhdHVzLmNvbmZpZ3VyZWQ7CiAgICAgICAgfSBjYXRjaCB7CiAgICAgICAgICAgIHRoaXMucHBseENvbmZpZ3VyZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzZWFyY2hQYW5lbCA9IHFzKCcjZGVjay1haS1yZXNlYXJjaC1wYW5lbCcpOwogICAgICAgIGNvbnN0IGdlbmVyYXRlUGFuZWwgPSBxcygnI2RlY2stYWktZ2VuZXJhdGUtcGFuZWwnKTsKICAgICAgICBpZiAocmVzZWFyY2hQYW5lbCkgcmVzZWFyY2hQYW5lbC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5wcGx4Q29uZmlndXJlZCA/ICcnIDogJ25vbmUnOwogICAgICAgIGlmIChnZW5lcmF0ZVBhbmVsKSBnZW5lcmF0ZVBhbmVsLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnBwbHhDb25maWd1cmVkID8gJycgOiAnbm9uZSc7CiAgICB9LAoKICAgIF9iaW5kQUlQYW5lbHMoKSB7CiAgICAgICAgLy8gUmVzZWFyY2ggYnV0dG9uCiAgICAgICAgY29uc3QgcmVzZWFyY2hCdG4gPSBxcygnI2FpLXJlc2VhcmNoLWJ0bicpOwogICAgICAgIGlmIChyZXNlYXJjaEJ0bikgewogICAgICAgICAgICByZXNlYXJjaEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX3J1bkFJUmVzZWFyY2goKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHZW5lcmF0ZSBidXR0b24KICAgICAgICBjb25zdCBn' +
'ZW5CdG4gPSBxcygnI2FpLWdlbi1idG4nKTsKICAgICAgICBpZiAoZ2VuQnRuKSB7CiAgICAgICAgICAgIGdlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX3J1bkFJR2VuZXJhdGUoKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDb21tYW5kZXIgYXV0b2NvbXBsZXRlIGZvciBBSSBHZW5lcmF0ZQogICAgICAgIHRoaXMuX2JpbmRBSUdlbkNvbW1hbmRlclNlYXJjaCgpOwogICAgfSwKCiAgICAvKiogVXBkYXRlIHRoZSByZXNlYXJjaCBidXR0b24gc3RhdGUg4oCUIGNhbGwgYWZ0ZXIgZGVjayBjaGFuZ2VzICovCiAgICBfdXBkYXRlQUlSZXNlYXJjaEJ0bigpIHsKICAgICAgICBjb25zdCBidG4gPSBxcygnI2FpLXJlc2VhcmNoLWJ0bicpOwogICAgICAgIGlmICghYnRuKSByZXR1cm47CiAgICAgICAgYnRuLmRpc2FibGVkID0gIXRoaXMuZGVja0lkIHx8ICF0aGlzLnBwbHhDb25maWd1cmVkOwogICAgfSwKCiAgICAvKiDilIDilIAgQUkgUmVzZWFyY2ggRmxvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCiAgICBhc3luYyBfcnVuQUlSZXNlYXJjaCgpIHsKICAgICAgICBpZiAoIXRoaXMuZGVja0lkKSB7CiAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KCdMb2FkIGEgZGVjayBmaXJzdC4nLCAnd2FybmluZycpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGJ0biA9IHFzKCcjYWktcmVzZWFyY2gtYnRuJyk7CiAgICAgICAgY29uc3QgbG9hZGluZyA9IHFzKCcjYWktcmVzZWFyY2gtbG9hZGluZycpOwogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBxcygnI2FpLXJlc2VhcmNoLXJlc3VsdHMnKTsKICAgICAgICBjb25zdCBjb250cm9scyA9IHFzKCcjZGVjay1haS1yZXNlYXJjaC1ib2R5IC5kZWNrLWFpLWNvbnRyb2xzJyk7CgogICAgICAgIGNvbnN0IGdvYWwgPSBxcygnI2FpLXJlc2VhcmNoLWdvYWwnKS52YWx1ZS50cmltKCkgfHwgdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IGJ1ZGdldFJhdyA9IHFzKCcjYWktcmVzZWFyY2gtYnVkZ2V0JykudmFsdWU7CiAgICAgICAgY29uc3QgYnVkZ2V0ID0gYnVkZ2V0UmF3ID8gcGFyc2VGbG9hdChidWRnZXRSYXcpIDogdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IG9taXRSYXcgPSBxcygnI2FpLXJlc2VhcmNoLW9taXQnKS52YWx1ZS50cmltKCk7CiAgICAgICAgY29uc3Qgb21pdENhcmRzID0gb21pdFJhdyA/IG9taXRSYXcuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW107CiAgICAgICAgY29uc3QgdXNlQ29sbGVjdGlvbiA9IHFzKCcjYWktcmVzZWFyY2gtdXNlLWNvbGxlY3Rpb24nKS5jaGVja2VkOwoKICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGxvYWRpbmcuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICByZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgcmVzdWx0cy5pbm5lckhUTUwgPSAnJzsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwaVBvc3QoJy9hcGkvZGVjay1yZXNlYXJjaCcsIHsKICAgICAgICAgICAgICAgIGRlY2tfaWQ6IHRoaXMuZGVja0lkLAogICAgICAgICAgICAgICAgZ29hbCwKICAgICAgICAgICAgICAgIGJ1ZGdldF91c2Q6IGJ1ZGdldCwKICAgICAgICAgICAgICAgIG9taXRfY2FyZHM6IG9taXRDYXJkcywKICAgICAgICAgICAgICAgIHVzZV9jb2xsZWN0aW9uOiB1c2VDb2xsZWN0aW9uLAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLWVycm9yIj5BSSByZXR1cm5lZCBhbiBlcnJvcjogJyArIHRoaXMuX2VzYyhkYXRhLmVycm9yKSArICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgcmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5fcmVuZGVyUmVzZWFyY2hSZXN1bHRzKGRhdGEsIHJlc3VsdHMpOwogICAgICAgICAgICByZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwoKICAgICAgICAgICAgLy8gRXhwYW5kIHRoZSBwYW5lbCBib2R5IG1heC1oZWlnaHQgc28gcmVzdWx0cyBhcmUgdmlz' +
'aWJsZQogICAgICAgICAgICBjb25zdCBib2R5ID0gcXMoJyNkZWNrLWFpLXJlc2VhcmNoLWJvZHknKTsKICAgICAgICAgICAgaWYgKGJvZHkpIGJvZHkuc3R5bGUubWF4SGVpZ2h0ID0gYm9keS5zY3JvbGxIZWlnaHQgKyAyMDAwICsgJ3B4JzsKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgcmVzdWx0cy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZGVjay1haS1lcnJvciI+UmVzZWFyY2ggZmFpbGVkOiAnICsgdGhpcy5fZXNjKGVyci5tZXNzYWdlKSArICc8L2Rpdj4nOwogICAgICAgICAgICByZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnQUkgcmVzZWFyY2ggZmFpbGVkOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBsb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgfSwKCiAgICBfcmVuZGVyUmVzZWFyY2hSZXN1bHRzKGRhdGEsIGNvbnRhaW5lcikgewogICAgICAgIGxldCBodG1sID0gJyc7CiAgICAgICAgY29uc3QgZXNjID0gKHQpID0+IHRoaXMuX2VzYyh0KTsKCiAgICAgICAgLy8g4pSA4pSAIEhlYWRlcjogUmF0aW5nICsgQnJhY2tldCArIEFyY2hldHlwZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBjb25zdCByYXRpbmdOdW0gPSBwYXJzZUludChkYXRhLm92ZXJhbGxfcmF0aW5nLCAxMCk7CiAgICAgICAgY29uc3QgcmF0aW5nQ2xhc3MgPSBpc05hTihyYXRpbmdOdW0pID8gJycgOiAocmF0aW5nTnVtID49IDcgPyAnaGlnaCcgOiByYXRpbmdOdW0gPj0gNCA/ICdtaWQnIDogJ2xvdycpOwogICAgICAgIGNvbnN0IGJyYWNrZXRMdmwgPSBkYXRhLmJyYWNrZXRfbGV2ZWwgJiYgZGF0YS5icmFja2V0X2xldmVsLmxldmVsOwogICAgICAgIGNvbnN0IGJyYWNrZXRDbHMgPSBicmFja2V0THZsIDw9IDEgPyAnYnJhY2tldC0xJyA6IGJyYWNrZXRMdmwgPD0gMiA/ICdicmFja2V0LTInIDogYnJhY2tldEx2bCA8PSAzID8gJ2JyYWNrZXQtMycgOiAnYnJhY2tldC00JzsKCiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1oZWFkZXItcm93Ij4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktcmF0aW5nIj48c3BhbiBjbGFzcz0iZGVjay1haS1yYXRpbmctbnVtICcgKyByYXRpbmdDbGFzcyArICciPicgKyAoaXNOYU4ocmF0aW5nTnVtKSA/ICc/JyA6IHJhdGluZ051bSkgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPSJkZWNrLWFpLXJhdGluZy1zdWJsYWJlbCI+LzEwPC9zcGFuPjwvZGl2Pic7CiAgICAgICAgaWYgKGJyYWNrZXRMdmwpIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJkZWNrLWFpLWJyYWNrZXQtYmFkZ2UgJyArIGJyYWNrZXRDbHMgKyAnIj5CcmFja2V0ICcgKyBicmFja2V0THZsICsgJzwvc3Bhbj4nOwogICAgICAgIGlmIChkYXRhLmFyY2hldHlwZSkgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktYXJjaGV0eXBlLWJhZGdlIj4nICsgZXNjKGRhdGEuYXJjaGV0eXBlLnJlcGxhY2UoJ18nLCAnICcpKSArICc8L3NwYW4+JzsKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICAvLyBSYXRpbmcgZXhwbGFuYXRpb24KICAgICAgICBpZiAoZGF0YS5yYXRpbmdfZXhwbGFuYXRpb24pIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1ub3RlcyBkZWNrLWFpLXJhdGluZy1leHBsYW5hdGlvbiI+JyArIGVzYyhkYXRhLnJhdGluZ19leHBsYW5hdGlvbikgKyAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBEZWNrIERlc2NyaXB0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGlmIChkYXRhLmRlY2tfZGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zZWN0aW9uIj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24tdGl0bGUiPkRlY2sgT3ZlcnZpZXc8L2Rpdj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXN0cmF0ZWd5Ij4nICsgZXNjKGRhdGEuZGVja19k' +
'ZXNjcmlwdGlvbikgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBCcmFja2V0IERldGFpbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgaWYgKGRhdGEuYnJhY2tldF9sZXZlbCkgewogICAgICAgICAgICBjb25zdCBiID0gZGF0YS5icmFja2V0X2xldmVsOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24iPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbi10aXRsZSI+QnJhY2tldCBBc3Nlc3NtZW50PC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1icmFja2V0LWRldGFpbCI+JzsKICAgICAgICAgICAgaWYgKGIucmVhc29uaW5nKSBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLW5vdGVzIj48c3Ryb25nPldoeSBCcmFja2V0ICcgKyAoYi5sZXZlbCB8fCAnPycpICsgJzo8L3N0cm9uZz4gJyArIGVzYyhiLnJlYXNvbmluZykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKGIucG93ZXJfY2VpbGluZykgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1ub3RlcyI+PHN0cm9uZz5Qb3dlciBDZWlsaW5nOjwvc3Ryb25nPiAnICsgZXNjKGIucG93ZXJfY2VpbGluZykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBXaW4gQ29uZGl0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiAoZGF0YS53aW5fY29uZGl0aW9ucyAmJiBkYXRhLndpbl9jb25kaXRpb25zLmxlbmd0aCkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24iPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbi10aXRsZSI+V2luIENvbmRpdGlvbnM8L2Rpdj4nOwogICAgICAgICAgICBmb3IgKGNvbnN0IHdjIG9mIGRhdGEud2luX2NvbmRpdGlvbnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlbENscyA9IHdjLnJlbGlhYmlsaXR5ID09PSAnaGlnaCcgPyAnaGlnaCcgOiB3Yy5yZWxpYWJpbGl0eSA9PT0gJ21lZGl1bScgPyAnbWlkJyA6ICdsb3cnOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS13aW5jb24iPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXdpbmNvbi1oZWFkZXIiPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGVjay1haS13aW5jb24tbmFtZSI+JyArIGVzYyh3Yy5uYW1lKSArICc8L3NwYW4+JzsKICAgICAgICAgICAgICAgIGlmICh3Yy5yZWxpYWJpbGl0eSkgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktcmVsaWFiaWxpdHktYmFkZ2UgJyArIHJlbENscyArICciPicgKyBlc2Mod2MucmVsaWFiaWxpdHkpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIGlmICh3Yy5jYXJkc19pbnZvbHZlZCAmJiB3Yy5jYXJkc19pbnZvbHZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXdpbmNvbi1jYXJkcyI+JzsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNuIG9mIHdjLmNhcmRzX2ludm9sdmVkKSBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGVjay1haS1jYXJkLWNoaXAiPicgKyBlc2MoY24pICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAod2MuZGVzY3JpcHRpb24pIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktbm90ZXMiPicgKyBlc2Mod2MuZGVzY3JpcHRpb24pICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAg' +
'U3luZXJneSBQYWNrYWdlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiAoZGF0YS5zeW5lcmd5X3BhY2thZ2VzICYmIGRhdGEuc3luZXJneV9wYWNrYWdlcy5sZW5ndGgpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zZWN0aW9uIj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24tdGl0bGUiPlN5bmVyZ3kgUGFja2FnZXM8L2Rpdj4nOwogICAgICAgICAgICBmb3IgKGNvbnN0IHNwIG9mIGRhdGEuc3luZXJneV9wYWNrYWdlcykgewogICAgICAgICAgICAgICAgY29uc3Qgc3RyQ2xzID0gc3Auc3RyZW5ndGggPT09ICdzdHJvbmcnID8gJ2hpZ2gnIDogc3Auc3RyZW5ndGggPT09ICdtb2RlcmF0ZScgPyAnbWlkJyA6ICdsb3cnOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zeW5lcmd5LXBrZyI+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc3luZXJneS1oZWFkZXIiPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGVjay1haS1zeW5lcmd5LW5hbWUiPicgKyBlc2Moc3AucGFja2FnZV9uYW1lKSArICc8L3NwYW4+JzsKICAgICAgICAgICAgICAgIGlmIChzcC5zdHJlbmd0aCkgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktcmVsaWFiaWxpdHktYmFkZ2UgJyArIHN0ckNscyArICciPicgKyBlc2Moc3Auc3RyZW5ndGgpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIGlmIChzcC5jYXJkcyAmJiBzcC5jYXJkcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXdpbmNvbi1jYXJkcyI+JzsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNuIG9mIHNwLmNhcmRzKSBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGVjay1haS1jYXJkLWNoaXAiPicgKyBlc2MoY24pICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3AuZGVzY3JpcHRpb24pIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktbm90ZXMiPicgKyBlc2Moc3AuZGVzY3JpcHRpb24pICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgVGhyZWF0IEFzc2Vzc21lbnQgKGdhbWUgcGhhc2VzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiAoZGF0YS50aHJlYXRfYXNzZXNzbWVudCkgewogICAgICAgICAgICBjb25zdCB0YSA9IGRhdGEudGhyZWF0X2Fzc2Vzc21lbnQ7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbiI+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zZWN0aW9uLXRpdGxlIj5UaHJlYXQgQXNzZXNzbWVudDwvZGl2Pic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktcGhhc2VzIj4nOwogICAgICAgICAgICBpZiAodGEuZWFybHlfZ2FtZSkgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1waGFzZSI+PHNwYW4gY2xhc3M9ImRlY2stYWktcGhhc2UtbGFiZWwiPkVhcmx5IChUMS0zKTwvc3Bhbj48c3BhbiBjbGFzcz0iZGVjay1haS1waGFzZS10ZXh0Ij4nICsgZXNjKHRhLmVhcmx5X2dhbWUpICsgJzwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBpZiAodGEubWlkX2dhbWUpIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktcGhhc2UiPjxzcGFuIGNsYXNzPSJkZWNrLWFpLXBoYXNlLWxhYmVsIj5NaWQgKFQ0LTcpPC9zcGFuPjxzcGFuIGNsYXNzPSJkZWNrLWFpLXBoYXNlLXRleHQiPicgKyBlc2ModGEubWlkX2dhbWUpICsgJzwvc3Bhbj48L2Rpdj4nOwogICAgICAgICAgICBpZiAodGEubGF0ZV9nYW1lKSBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXBoYXNlIj48c3BhbiBjbGFzcz0iZGVjay1haS1waGFzZS1sYWJlbCI+TGF0' +
'ZSAoVDgrKTwvc3Bhbj48c3BhbiBjbGFzcz0iZGVjay1haS1waGFzZS10ZXh0Ij4nICsgZXNjKHRhLmxhdGVfZ2FtZSkgKyAnPC9zcGFuPjwvZGl2Pic7CiAgICAgICAgICAgIGlmICh0YS52dWxuZXJhYmlsaXR5KSBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXBoYXNlIGRlY2stYWktcGhhc2UtdnVsbiI+PHNwYW4gY2xhc3M9ImRlY2stYWktcGhhc2UtbGFiZWwiPlZ1bG5lcmFibGUgVG88L3NwYW4+PHNwYW4gY2xhc3M9ImRlY2stYWktcGhhc2UtdGV4dCI+JyArIGVzYyh0YS52dWxuZXJhYmlsaXR5KSArICc8L3NwYW4+PC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+PC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBTdHJlbmd0aHMgLyBXZWFrbmVzc2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGlmICgoZGF0YS5zdHJlbmd0aHMgJiYgZGF0YS5zdHJlbmd0aHMubGVuZ3RoKSB8fCAoZGF0YS53ZWFrbmVzc2VzICYmIGRhdGEud2Vha25lc3Nlcy5sZW5ndGgpKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbiBkZWNrLWFpLXN3LWdyaWQiPic7CiAgICAgICAgICAgIGlmIChkYXRhLnN0cmVuZ3RocyAmJiBkYXRhLnN0cmVuZ3Rocy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc3ctY29sIj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zZWN0aW9uLXRpdGxlIGRlY2stYWktc3ctdGl0bGUtZ29vZCI+U3RyZW5ndGhzPC9kaXY+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzx1bCBjbGFzcz0iZGVjay1haS1saXN0Ij4nOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIG9mIGRhdGEuc3RyZW5ndGhzKSBodG1sICs9ICc8bGk+JyArIGVzYyhzKSArICc8L2xpPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8L3VsPjwvZGl2Pic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGEud2Vha25lc3NlcyAmJiBkYXRhLndlYWtuZXNzZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXN3LWNvbCI+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbi10aXRsZSBkZWNrLWFpLXN3LXRpdGxlLWJhZCI+V2Vha25lc3NlczwvZGl2Pic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8dWwgY2xhc3M9ImRlY2stYWktbGlzdCI+JzsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdyBvZiBkYXRhLndlYWtuZXNzZXMpIGh0bWwgKz0gJzxsaT4nICsgZXNjKHcpICsgJzwvbGk+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvdWw+PC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIFJvbGUgR2FwcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiAoZGF0YS5yb2xlX2dhcHMgJiYgdHlwZW9mIGRhdGEucm9sZV9nYXBzID09PSAnb2JqZWN0JykgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24iPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbi10aXRsZSI+Um9sZSBBbmFseXNpczwvZGl2Pic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktcm9sZS1nYXBzIj4nOwogICAgICAgICAgICBmb3IgKGNvbnN0IFtyb2xlLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhkYXRhLnJvbGVfZ2FwcykpIHsKICAgICAgICAgICAgICAgIGlmICghaW5mbyB8fCB0eXBlb2YgaW5mbyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY29uc3QgY3VyID0gaW5mby5jdXJyZW50IHx8IDA7CiAgICAgICAgICAgICAgICBjb25zdCByZWMgPSBpbmZvLnJlY29tbWVuZGVkIHx8IDA7CiAgICAgICAgICAgICAgICBjb25zdCBkaWZmID0gY3VyIC0gcmVjOwogICAgICAgICAgICAgICAgY29uc3QgYmFyUGN0ID0gcmVjID4gMCA/' +
'IE1hdGgubWluKDEwMCwgTWF0aC5yb3VuZCgoY3VyIC8gcmVjKSAqIDEwMCkpIDogMTAwOwogICAgICAgICAgICAgICAgY29uc3QgYmFyQ2xzID0gZGlmZiA+PSAwID8gJ2dvb2QnIDogKGRpZmYgPj0gLTIgPyAnd2FybicgOiAnYmFkJyk7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXJvbGUtcm93Ij4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktcm9sZS1uYW1lIj4nICsgZXNjKHJvbGUucmVwbGFjZSgnXycsICcgJykpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1yb2xlLWJhci13cmFwIj48ZGl2IGNsYXNzPSJkZWNrLWFpLXJvbGUtYmFyICcgKyBiYXJDbHMgKyAnIiBzdHlsZT0id2lkdGg6JyArIGJhclBjdCArICclIj48L2Rpdj48L2Rpdj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktcm9sZS1udW1zIj4nICsgY3VyICsgJy8nICsgcmVjICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIGlmIChpbmZvLm5vdGUpIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktcm9sZS1ub3RlIj4nICsgZXNjKGluZm8ubm90ZSkgKyAnPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgLy8g4pSA4pSAIE1hbmEgQW5hbHlzaXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgaWYgKGRhdGEubWFuYV9hbmFseXNpcyAmJiB0eXBlb2YgZGF0YS5tYW5hX2FuYWx5c2lzID09PSAnb2JqZWN0JykgewogICAgICAgICAgICBjb25zdCBtYSA9IGRhdGEubWFuYV9hbmFseXNpczsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zZWN0aW9uIj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24tdGl0bGUiPk1hbmEgQmFzZSBBbmFseXNpczwvZGl2Pic7CiAgICAgICAgICAgIGlmIChtYS5sYW5kX2NvdW50KSBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLW5vdGVzIj48c3Ryb25nPkxhbmRzOjwvc3Ryb25nPiAnICsgZXNjKG1hLmxhbmRfY291bnQpICsgJzwvZGl2Pic7CiAgICAgICAgICAgIGlmIChtYS5jb2xvcl9maXhpbmcpIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktbm90ZXMiPjxzdHJvbmc+Q29sb3IgRml4aW5nOjwvc3Ryb25nPiAnICsgZXNjKG1hLmNvbG9yX2ZpeGluZykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1hLnJhbXBfcGFja2FnZSkgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1ub3RlcyI+PHN0cm9uZz5SYW1wOjwvc3Ryb25nPiAnICsgZXNjKG1hLnJhbXBfcGFja2FnZSkgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1hLmN1cnZlX2Fzc2Vzc21lbnQpIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktbm90ZXMiPjxzdHJvbmc+Q3VydmU6PC9zdHJvbmc+ICcgKyBlc2MobWEuY3VydmVfYXNzZXNzbWVudCkgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKG1hLnByb2JsZW1fY2FyZHMgJiYgbWEucHJvYmxlbV9jYXJkcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktbm90ZXMiPjxzdHJvbmc+UHJvYmxlbSBDYXJkczo8L3N0cm9uZz4gJzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gbWEucHJvYmxlbV9jYXJkcy5tYXAoYyA9PiAnPHNwYW4gY2xhc3M9ImRlY2stYWktY2FyZC1jaGlwIGRlY2stYWktY2FyZC1jaGlwLXdhcm4iPicgKyBlc2MoYykgKyAnPC9zcGFuPicpLmpvaW4oJyAnKTsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIOKUgOKUgCBDdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgICAgIGlmIChkYXRhLmN1dHMgJiYgZGF0' +
'YS5jdXRzLmxlbmd0aCkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24iPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbi10aXRsZSI+U3VnZ2VzdGVkIEN1dHMgKCcgKyBkYXRhLmN1dHMubGVuZ3RoICsgJyk8L2Rpdj4nOwogICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YS5jdXRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzZXZDbHMgPSBjLnNldmVyaXR5ID09PSAnbXVzdF9jdXQnID8gJ3Nldi1tdXN0JyA6IGMuc2V2ZXJpdHkgPT09ICdzaG91bGRfY3V0JyA/ICdzZXYtc2hvdWxkJyA6ICdzZXYtY29uc2lkZXInOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1jYXJkLXJvdyBjdXQtcm93Ij4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktY2FyZC1uYW1lIj4nICsgZXNjKGMubmFtZSkgKyAnPC9zcGFuPic7CiAgICAgICAgICAgICAgICBpZiAoYy5zZXZlcml0eSkgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktc2V2ZXJpdHktYmFkZ2UgJyArIHNldkNscyArICciPicgKyBlc2MoYy5zZXZlcml0eS5yZXBsYWNlKCdfJywgJyAnKSkgKyAnPC9zcGFuPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgaWYgKGMucmVhc29uKSBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLWNhcmQtZGV0YWlsIj4nICsgZXNjKGMucmVhc29uKSArICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgQWRkcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgICAgICBpZiAoZGF0YS5hZGRzICYmIGRhdGEuYWRkcy5sZW5ndGgpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zZWN0aW9uIj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24tdGl0bGUiPlN1Z2dlc3RlZCBBZGRzICgnICsgZGF0YS5hZGRzLmxlbmd0aCArICcpPC9kaXY+JzsKICAgICAgICAgICAgZm9yIChjb25zdCBhIG9mIGRhdGEuYWRkcykgewogICAgICAgICAgICAgICAgY29uc3QgcHJpQ2xzID0gYS5wcmlvcml0eSA9PT0gJ2NyaXRpY2FsJyA/ICdwcmktY3JpdGljYWwnIDogYS5wcmlvcml0eSA9PT0gJ2hpZ2gnID8gJ3ByaS1oaWdoJyA6IGEucHJpb3JpdHkgPT09ICdtZWRpdW0nID8gJ3ByaS1tZWRpdW0nIDogJ3ByaS1uaWNlJzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktY2FyZC1yb3cgYWRkLXJvdyIgZGF0YS1jYXJkLW5hbWU9IicgKyBlc2MoYS5uYW1lKSArICciIGRhdGEtc2NyeWZhbGwtaWQ9IicgKyAoYS5zY3J5ZmFsbF9pZCB8fCAnJykgKyAnIj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktY2FyZC1uYW1lIj4nICsgZXNjKGEubmFtZSkgKyAnPC9zcGFuPic7CiAgICAgICAgICAgICAgICBpZiAoYS5yb2xlKSBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGVjay1haS1jYXJkLXJvbGUiPicgKyBlc2MoYS5yb2xlLnJlcGxhY2UoJ18nLCAnICcpKSArICc8L3NwYW4+JzsKICAgICAgICAgICAgICAgIGlmIChhLnByaW9yaXR5KSBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGVjay1haS1wcmlvcml0eS1iYWRnZSAnICsgcHJpQ2xzICsgJyI+JyArIGVzYyhhLnByaW9yaXR5LnJlcGxhY2UoJ18nLCAnICcpKSArICc8L3NwYW4+JzsKICAgICAgICAgICAgICAgIGlmIChhLmZyb21fY29sbGVjdGlvbikgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktY2FyZC1vd25lZC1iYWRnZSI+T3duZWQ8L3NwYW4+JzsKICAgICAgICAgICAgICAgIGlmIChhLmVzdGltYXRlZF9wcmljZV91c2QpIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJkZWNrLWFpLWNhcmQtcHJpY2UiPiQnICsgYS5lc3RpbWF0ZWRfcHJpY2VfdXNkLnRvRml4ZWQoMikgKyAnPC9zcGFuPic7CiAgICAgICAgICAgICAgICBpZiAoYS5zY3J5ZmFsbF9pZCkgaHRtbCArPSAnPGJ1dHRvbiBjbGFzcz0iZGVjay1haS1jYXJkLWFkZC1idG4iIGRhdGEtc2ZpZD0iJyAr' +
'IGEuc2NyeWZhbGxfaWQgKyAnIiBkYXRhLW5hbWU9IicgKyBlc2MoYS5uYW1lKSArICciPis8L2J1dHRvbj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIC8vIFJlYXNvbiArIHN5bmVyZ3kgbGluZQogICAgICAgICAgICAgICAgbGV0IGRldGFpbCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKGEucmVhc29uKSBkZXRhaWwgKz0gZXNjKGEucmVhc29uKTsKICAgICAgICAgICAgICAgIGlmIChhLnN5bmVyZ3lfd2l0aCAmJiBhLnN5bmVyZ3lfd2l0aC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBkZXRhaWwgKz0gKGRldGFpbCA/ICcgJyA6ICcnKSArICc8c3BhbiBjbGFzcz0iZGVjay1haS1zeW5lcmd5LXRhZyI+U3luZXJnaXplcyB3aXRoOiAnICsgYS5zeW5lcmd5X3dpdGgubWFwKGMgPT4gZXNjKGMpKS5qb2luKCcsICcpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRldGFpbCkgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1jYXJkLWRldGFpbCI+JyArIGRldGFpbCArICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkYXRhLmFkZHNfdG90YWxfdXNkKSB7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXRvdGFsIj48c3Bhbj5Ub3RhbCBhZGRzIGNvc3Q8L3NwYW4+PHN0cm9uZz4kJyArIGRhdGEuYWRkc190b3RhbF91c2QudG9GaXhlZCgyKSArICc8L3N0cm9uZz48L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICAvLyDilIDilIAgU3RyYXRlZ3kgTm90ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICAgICAgaWYgKGRhdGEuc3RyYXRlZ3lfbm90ZXMpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zZWN0aW9uIj4nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24tdGl0bGUiPlN0cmF0ZWd5IE5vdGVzPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zdHJhdGVneSI+JyArIGVzYyhkYXRhLnN0cmF0ZWd5X25vdGVzKSArICc8L2Rpdj4nOwogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7CgogICAgICAgIC8vIEJpbmQgYWRkIGJ1dHRvbnMKICAgICAgICBxc2EoJy5kZWNrLWFpLWNhcmQtYWRkLWJ0bicsIGNvbnRhaW5lcikuZm9yRWFjaChidG4gPT4gewogICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNmaWQgPSBidG4uZGF0YXNldC5zZmlkOwogICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0Lm5hbWU7CiAgICAgICAgICAgICAgICBpZiAoc2ZpZCkgdGhpcy5hZGRDYXJkVG9EZWNrKHNmaWQsIG5hbWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQXR0YWNoIGNhcmQgcHJldmlldyBvbiBob3ZlciBmb3IgYWRkIHJvd3Mgd2l0aCBzY3J5ZmFsbF9pZAogICAgICAgIHFzYSgnLmRlY2stYWktY2FyZC1yb3dbZGF0YS1zY3J5ZmFsbC1pZF0nLCBjb250YWluZXIpLmZvckVhY2gocm93ID0+IHsKICAgICAgICAgICAgY29uc3Qgc2ZpZCA9IHJvdy5kYXRhc2V0LnNjcnlmYWxsSWQ7CiAgICAgICAgICAgIGlmIChzZmlkKSB7CiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRWwgPSBxcygnLmRlY2stYWktY2FyZC1uYW1lJywgcm93KTsKICAgICAgICAgICAgICAgIGlmIChuYW1lRWwpIENhcmRQcmV2aWV3LmF0dGFjaChuYW1lRWwsIHNmaWQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LAoKICAgIC8qIOKUgOKUgCBBSSBHZW5lcmF0ZSBGbG93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKICAgIF9iaW5kQUlHZW5Db21tYW5kZXJTZWFyY2goKSB7CiAgICAgICAgY29uc3QgaW5wdXQgPSBx' +
'cygnI2FpLWdlbi1jb21tYW5kZXInKTsKICAgICAgICBjb25zdCBkcm9wZG93biA9IHFzKCcjYWktZ2VuLWNvbW1hbmRlci1kcm9wZG93bicpOwogICAgICAgIGlmICghaW5wdXQgfHwgIWRyb3Bkb3duKSByZXR1cm47CgogICAgICAgIGNvbnN0IGRlYm91bmNlZFNlYXJjaCA9IGRlYm91bmNlKGFzeW5jIChxKSA9PiB7CiAgICAgICAgICAgIGlmICghcSB8fCBxLmxlbmd0aCA8IDIpIHsgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcmV0dXJuOyB9CiAgICAgICAgICAgIGNvbnN0IGNhcmRzID0gYXdhaXQgc2NyeWZhbGxTZWFyY2hDYXJkcyhxICsgJyBpczpjb21tYW5kZXInKTsKICAgICAgICAgICAgdGhpcy5fYWlHZW5TdWdnZXN0aW9ucyA9IGNhcmRzLnNsaWNlKDAsIDgpOwogICAgICAgICAgICB0aGlzLl9haUdlbkFjdGl2ZUluZGV4ID0gLTE7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckFJR2VuRHJvcGRvd24oKTsKICAgICAgICB9LCAzNTApOwoKICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChlKSA9PiB7CiAgICAgICAgICAgIC8vIENsZWFyIHNlbGVjdGlvbiBpZiB1c2VyIGVkaXRzIGFmdGVyIHNlbGVjdGluZwogICAgICAgICAgICB0aGlzLmFpR2VuQ29tbWFuZGVyTmFtZSA9ICcnOwogICAgICAgICAgICBjb25zdCBzZWwgPSBxcygnI2FpLWdlbi1jb21tYW5kZXItc2VsZWN0ZWQnKTsKICAgICAgICAgICAgaWYgKHNlbCkgc2VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIGRlYm91bmNlZFNlYXJjaChlLnRhcmdldC52YWx1ZS50cmltKCkpOwogICAgICAgIH0pOwoKICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykgewogICAgICAgICAgICAgICAgdGhpcy5fYWlHZW5BY3RpdmVJbmRleCA9IE1hdGgubWluKHRoaXMuX2FpR2VuQWN0aXZlSW5kZXggKyAxLCB0aGlzLl9haUdlblN1Z2dlc3Rpb25zLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyQUlHZW5Ecm9wZG93bigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dVcCcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FpR2VuQWN0aXZlSW5kZXggPSBNYXRoLm1heCh0aGlzLl9haUdlbkFjdGl2ZUluZGV4IC0gMSwgLTEpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyQUlHZW5Ecm9wZG93bigpOwogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnRW50ZXInICYmIHRoaXMuX2FpR2VuQWN0aXZlSW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgY29uc3QgY2FyZCA9IHRoaXMuX2FpR2VuU3VnZ2VzdGlvbnNbdGhpcy5fYWlHZW5BY3RpdmVJbmRleF07CiAgICAgICAgICAgICAgICBpZiAoY2FyZCkgdGhpcy5fc2VsZWN0QUlHZW5Db21tYW5kZXIoY2FyZCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7CiAgICAgICAgICAgICAgICBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGRyb3Bkb3duLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgY29uc3QgaXRlbSA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5kZWNrLWFpLWNvbW1hbmRlci1vcHRpb24nKTsKICAgICAgICAgICAgaWYgKCFpdGVtKSByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGl0ZW0uZGF0YXNldC5pbmRleCwgMTApOwogICAgICAgICAgICBjb25zdCBjYXJkID0gdGhpcy5fYWlHZW5TdWdnZXN0aW9uc1tpZHhdOwogICAgICAgICAgICBpZiAoY2FyZCkgdGhpcy5fc2VsZWN0QUlHZW5Db21tYW5kZXIoY2FyZCk7CiAgICAgICAgfSk7CgogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgaWYgKCFpbnB1dC5jb250YWlucyhlLnRhcmdldCkgJiYgIWRyb3Bkb3duLmNvbnRhaW5zKGUudGFyZ2V0KSkgewogICAgICAgICAgICAgICAgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSwKCiAgICBfcmVuZGVyQUlHZW5Ecm9w' +
'ZG93bigpIHsKICAgICAgICBjb25zdCBkcm9wZG93biA9IHFzKCcjYWktZ2VuLWNvbW1hbmRlci1kcm9wZG93bicpOwogICAgICAgIGRyb3Bkb3duLmlubmVySFRNTCA9ICcnOwogICAgICAgIGlmICh0aGlzLl9haUdlblN1Z2dlc3Rpb25zLmxlbmd0aCA9PT0gMCkgeyBkcm9wZG93bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyByZXR1cm47IH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2FpR2VuU3VnZ2VzdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgY2FyZCA9IHRoaXMuX2FpR2VuU3VnZ2VzdGlvbnNbaV07CiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbCgnZGl2JywgJ2RlY2stYWktY29tbWFuZGVyLW9wdGlvbicgKyAoaSA9PT0gdGhpcy5fYWlHZW5BY3RpdmVJbmRleCA/ICcgYWN0aXZlJyA6ICcnKSk7CiAgICAgICAgICAgIGl0ZW0uZGF0YXNldC5pbmRleCA9IGk7CgogICAgICAgICAgICBjb25zdCBuYW1lRWwgPSBlbCgnc3BhbicsICdkZWNrLWFpLWNvbW1hbmRlci1vcHRpb24tbmFtZScsIGNhcmQubmFtZSk7CiAgICAgICAgICAgIGNvbnN0IGNvbG9yV3JhcCA9IGVsKCdzcGFuJywgJ2RlY2stY29tbWFuZGVyLW9wdGlvbi1jb2xvcicpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgKGNhcmQuY29sb3JfaWRlbnRpdHkgfHwgW10pKSB7CiAgICAgICAgICAgICAgICBjb2xvcldyYXAuYXBwZW5kQ2hpbGQoYnVpbGRDb2xvckNoaXAoYykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQobmFtZUVsKTsKICAgICAgICAgICAgaXRlbS5hcHBlbmRDaGlsZChjb2xvcldyYXApOwogICAgICAgICAgICBkcm9wZG93bi5hcHBlbmRDaGlsZChpdGVtKTsKICAgICAgICB9CiAgICAgICAgZHJvcGRvd24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICB9LAoKICAgIF9zZWxlY3RBSUdlbkNvbW1hbmRlcihjYXJkKSB7CiAgICAgICAgdGhpcy5haUdlbkNvbW1hbmRlck5hbWUgPSBjYXJkLm5hbWU7CiAgICAgICAgY29uc3QgaW5wdXQgPSBxcygnI2FpLWdlbi1jb21tYW5kZXInKTsKICAgICAgICBjb25zdCBkcm9wZG93biA9IHFzKCcjYWktZ2VuLWNvbW1hbmRlci1kcm9wZG93bicpOwogICAgICAgIGlucHV0LnZhbHVlID0gY2FyZC5uYW1lOwogICAgICAgIGRyb3Bkb3duLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICB9LAoKICAgIGFzeW5jIF9ydW5BSUdlbmVyYXRlKCkgewogICAgICAgIGNvbnN0IGNvbW1hbmRlciA9IHRoaXMuYWlHZW5Db21tYW5kZXJOYW1lIHx8IHFzKCcjYWktZ2VuLWNvbW1hbmRlcicpLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIWNvbW1hbmRlcikgewogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnRW50ZXIgYSBjb21tYW5kZXIgbmFtZS4nLCAnd2FybmluZycpOwogICAgICAgICAgICBxcygnI2FpLWdlbi1jb21tYW5kZXInKS5mb2N1cygpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBidG4gPSBxcygnI2FpLWdlbi1idG4nKTsKICAgICAgICBjb25zdCBsb2FkaW5nID0gcXMoJyNhaS1nZW4tbG9hZGluZycpOwogICAgICAgIGNvbnN0IHJlc3VsdHMgPSBxcygnI2FpLWdlbi1yZXN1bHRzJyk7CiAgICAgICAgY29uc3QgY29udHJvbHMgPSBxcygnI2RlY2stYWktZ2VuZXJhdGUtYm9keSAuZGVjay1haS1jb250cm9scycpOwoKICAgICAgICBjb25zdCBidWRnZXRSYXcgPSBxcygnI2FpLWdlbi1idWRnZXQnKS52YWx1ZTsKICAgICAgICBjb25zdCBidWRnZXQgPSBidWRnZXRSYXcgPyBwYXJzZUZsb2F0KGJ1ZGdldFJhdykgOiB1bmRlZmluZWQ7CiAgICAgICAgY29uc3Qgb21pdFJhdyA9IHFzKCcjYWktZ2VuLW9taXQnKS52YWx1ZS50cmltKCk7CiAgICAgICAgY29uc3Qgb21pdENhcmRzID0gb21pdFJhdyA/IG9taXRSYXcuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pIDogW107CiAgICAgICAgY29uc3QgdXNlQ29sbGVjdGlvbiA9IHFzKCcjYWktZ2VuLXVzZS1jb2xsZWN0aW9uJykuY2hlY2tlZDsKCiAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBsb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgcmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIHJlc3VsdHMuaW5uZXJIVE1MID0gJyc7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGlGZXRjaCgnL2FwaS9kZWNrLWdl' +
'bmVyYXRlJywgewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgY29tbWFuZGVyLAogICAgICAgICAgICAgICAgICAgIGJ1ZGdldF91c2Q6IGJ1ZGdldCwKICAgICAgICAgICAgICAgICAgICBvbWl0X2NhcmRzOiBvbWl0Q2FyZHMsCiAgICAgICAgICAgICAgICAgICAgdXNlX2NvbGxlY3Rpb246IHVzZUNvbGxlY3Rpb24sCiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikgewogICAgICAgICAgICAgICAgcmVzdWx0cy5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZGVjay1haS1lcnJvciI+QUkgcmV0dXJuZWQgYW4gZXJyb3I6ICcgKyB0aGlzLl9lc2MoZGF0YS5lcnJvcikgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIHJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuX2xhc3RHZW5SZXN1bHQgPSBkYXRhOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJHZW5lcmF0ZVJlc3VsdHMoZGF0YSwgcmVzdWx0cyk7CiAgICAgICAgICAgIHJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CgogICAgICAgICAgICAvLyBFeHBhbmQgcGFuZWwKICAgICAgICAgICAgY29uc3QgYm9keSA9IHFzKCcjZGVjay1haS1nZW5lcmF0ZS1ib2R5Jyk7CiAgICAgICAgICAgIGlmIChib2R5KSBib2R5LnN0eWxlLm1heEhlaWdodCA9IGJvZHkuc2Nyb2xsSGVpZ2h0ICsgNTAwMCArICdweCc7CiAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIHJlc3VsdHMuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImRlY2stYWktZXJyb3IiPkdlbmVyYXRpb24gZmFpbGVkOiAnICsgdGhpcy5fZXNjKGVyci5tZXNzYWdlKSArICc8L2Rpdj4nOwogICAgICAgICAgICByZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnQUkgZ2VuZXJhdGlvbiBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJyk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGxvYWRpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB9CiAgICB9LAoKICAgIF9yZW5kZXJHZW5lcmF0ZVJlc3VsdHMoZGF0YSwgY29udGFpbmVyKSB7CiAgICAgICAgbGV0IGh0bWwgPSAnJzsKCiAgICAgICAgLy8gU3RyYXRlZ3kKICAgICAgICBpZiAoZGF0YS5zdHJhdGVneSkgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXN0cmF0ZWd5Ij4nICsgdGhpcy5fZXNjKGRhdGEuc3RyYXRlZ3kpICsgJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICAvLyBTdGF0cyByb3cKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXN0YXRzIj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc3RhdCI+PHNwYW4gY2xhc3M9ImRlY2stYWktc3RhdC12YWx1ZSI+JyArIChkYXRhLnRvdGFsX2NhcmRzIHx8ICc/JykgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPSJkZWNrLWFpLXN0YXQtbGFiZWwiPkNhcmRzPC9zcGFuPjwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zdGF0Ij48c3BhbiBjbGFzcz0iZGVjay1haS1zdGF0LXZhbHVlIj4kJyArIChkYXRhLnJlYWxfdG90YWxfdXNkIHx8IDApLnRvRml4ZWQoMCkgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPSJkZWNrLWFpLXN0YXQtbGFiZWwiPlRvdGFsPC9zcGFuPjwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1zdGF0Ij48c3BhbiBjbGFzcz0iZGVjay1haS1zdGF0LXZhbHVlIj4nICsgKGRhdGEuZnJvbV9jb2xsZWN0aW9uX2NvdW50IHx8IDApICsgJzwvc3Bhbj48c3BhbiBjbGFzcz0iZGVjay1haS1zdGF0LWxhYmVsIj5Pd25lZDwvc3Bhbj48L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CgogICAgICAgIC8vIENhcmRzIGdyb3VwZWQgYnkgcm9sZQogICAgICAgIGlmIChkYXRhLmNhcmRzICYmIGRhdGEuY2FyZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IHt9OwogICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgZGF0YS5jYXJkcykgewogICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IGMucm9sZSB8' +
'fCAnb3RoZXInOwogICAgICAgICAgICAgICAgaWYgKCFncm91cHNbcm9sZV0pIGdyb3Vwc1tyb2xlXSA9IFtdOwogICAgICAgICAgICAgICAgZ3JvdXBzW3JvbGVdLnB1c2goYyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IHJvbGVPcmRlciA9IFsnY29tbWFuZGVyJywgJ2NyZWF0dXJlJywgJ3JhbXAnLCAnZHJhdycsICdyZW1vdmFsJywgJ2xhbmQnLCAndXRpbGl0eScsICd3aW5fY29uZGl0aW9uJywgJ290aGVyJ107CiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFJvbGVzID0gT2JqZWN0LmtleXMoZ3JvdXBzKS5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBhaSA9IHJvbGVPcmRlci5pbmRleE9mKGEpOwogICAgICAgICAgICAgICAgY29uc3QgYmkgPSByb2xlT3JkZXIuaW5kZXhPZihiKTsKICAgICAgICAgICAgICAgIHJldHVybiAoYWkgPT09IC0xID8gOTkgOiBhaSkgLSAoYmkgPT09IC0xID8gOTkgOiBiaSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgZm9yIChjb25zdCByb2xlIG9mIHNvcnRlZFJvbGVzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjYXJkcyA9IGdyb3Vwc1tyb2xlXTsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbiI+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbi10aXRsZSI+JyArIHRoaXMuX2VzYyhyb2xlLnJlcGxhY2UoJ18nLCAnICcpKSArICcgKCcgKyBjYXJkcy5sZW5ndGggKyAnKTwvZGl2Pic7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY2FyZHMpIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLWNhcmQtcm93IGFkZC1yb3ciIGRhdGEtc2NyeWZhbGwtaWQ9IicgKyAoYy5zY3J5ZmFsbF9pZCB8fCAnJykgKyAnIj4nOwogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIGNsYXNzPSJkZWNrLWFpLWNhcmQtbmFtZSI+JyArIHRoaXMuX2VzYyhjLm5hbWUpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgICAgIGlmIChjLmZyb21fY29sbGVjdGlvbikgaHRtbCArPSAnPHNwYW4gY2xhc3M9ImRlY2stYWktY2FyZC1vd25lZC1iYWRnZSI+T3duZWQ8L3NwYW4+JzsKICAgICAgICAgICAgICAgICAgICBpZiAoYy5lc3RpbWF0ZWRfcHJpY2VfdXNkKSBodG1sICs9ICc8c3BhbiBjbGFzcz0iZGVjay1haS1jYXJkLXByaWNlIj4kJyArIGMuZXN0aW1hdGVkX3ByaWNlX3VzZC50b0ZpeGVkKDIpICsgJzwvc3Bhbj4nOwogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBSZWFzb25pbmcKICAgICAgICBpZiAoZGF0YS5yZWFzb25pbmcpIHsKICAgICAgICAgICAgY29uc3QgciA9IGRhdGEucmVhc29uaW5nOwogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLXNlY3Rpb24iPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktc2VjdGlvbi10aXRsZSI+QUkgUmVhc29uaW5nPC9kaXY+JzsKICAgICAgICAgICAgaWYgKHIuc3RyYXRlZ3kpIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRlY2stYWktbm90ZXMiPjxzdHJvbmc+U3RyYXRlZ3k6PC9zdHJvbmc+ICcgKyB0aGlzLl9lc2Moci5zdHJhdGVneSkgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKHIubWFuYV9jdXJ2ZSkgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1ub3RlcyI+PHN0cm9uZz5NYW5hIEN1cnZlOjwvc3Ryb25nPiAnICsgdGhpcy5fZXNjKHIubWFuYV9jdXJ2ZSkgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKHIua2V5X3N5bmVyZ2llcykgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1ub3RlcyI+PHN0cm9uZz5LZXkgU3luZXJnaWVzOjwvc3Ryb25nPiAnICsgdGhpcy5fZXNjKHIua2V5X3N5bmVyZ2llcykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKHIuYnVkZ2V0X25vdGVzKSBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZWNrLWFpLW5vdGVzIj48c3Ryb25nPkJ1ZGdldDo8L3N0cm9uZz4gJyArIHRoaXMuX2VzYyhyLmJ1ZGdldF9ub3RlcykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaWYgKHIuY29sbGVjdGlvbl91c2FnZV9ub3RlcykgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGVjay1haS1ub3RlcyI+PHN0cm9uZz5Db2xs' +
'ZWN0aW9uIFVzYWdlOjwvc3Ryb25nPiAnICsgdGhpcy5fZXNjKHIuY29sbGVjdGlvbl91c2FnZV9ub3RlcykgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIEFwcGx5IGJ1dHRvbgogICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9ImRlY2stYnRuIGRlY2stYnRuLWFwcGx5LWFpIGRlY2stYnRuLWZ1bGwiIGlkPSJhaS1nZW4tYXBwbHktYnRuIj7inIUgQ3JlYXRlIERlY2sgZnJvbSBBSSBSZXN1bHRzPC9idXR0b24+JzsKCiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7CgogICAgICAgIC8vIEJpbmQgYXBwbHkgYnV0dG9uCiAgICAgICAgY29uc3QgYXBwbHlCdG4gPSBxcygnI2FpLWdlbi1hcHBseS1idG4nLCBjb250YWluZXIpOwogICAgICAgIGlmIChhcHBseUJ0bikgewogICAgICAgICAgICBhcHBseUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuX2FwcGx5R2VuZXJhdGVkRGVjaygpKTsKICAgICAgICB9CgogICAgICAgIC8vIEF0dGFjaCBjYXJkIHByZXZpZXcgb24gaG92ZXIKICAgICAgICBxc2EoJy5kZWNrLWFpLWNhcmQtcm93W2RhdGEtc2NyeWZhbGwtaWRdJywgY29udGFpbmVyKS5mb3JFYWNoKHJvdyA9PiB7CiAgICAgICAgICAgIGNvbnN0IHNmaWQgPSByb3cuZGF0YXNldC5zY3J5ZmFsbElkOwogICAgICAgICAgICBpZiAoc2ZpZCkgewogICAgICAgICAgICAgICAgY29uc3QgbmFtZUVsID0gcXMoJy5kZWNrLWFpLWNhcmQtbmFtZScsIHJvdyk7CiAgICAgICAgICAgICAgICBpZiAobmFtZUVsKSBDYXJkUHJldmlldy5hdHRhY2gobmFtZUVsLCBzZmlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSwKCiAgICBhc3luYyBfYXBwbHlHZW5lcmF0ZWREZWNrKCkgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9sYXN0R2VuUmVzdWx0OwogICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5jYXJkcyB8fCAhZGF0YS5jYXJkcy5sZW5ndGgpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ05vIGdlbmVyYXRlZCBkZWNrIHRvIGFwcGx5LicsICd3YXJuaW5nJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGFwcGx5QnRuID0gcXMoJyNhaS1nZW4tYXBwbHktYnRuJyk7CiAgICAgICAgaWYgKGFwcGx5QnRuKSB7IGFwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQ3JlYXRpbmcgZGVjay4uLic7IH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRlY2sKICAgICAgICAgICAgY29uc3QgZGVja05hbWUgPSAoZGF0YS5jb21tYW5kZXIgfHwgJ0FJIERlY2snKSArICcgKEFJKSc7CiAgICAgICAgICAgIGNvbnN0IGRlY2sgPSBhd2FpdCBhcGlQb3N0KCcvYXBpL2RlY2tzJywgeyBuYW1lOiBkZWNrTmFtZSB9KTsKICAgICAgICAgICAgdGhpcy5kZWNrSWQgPSBkZWNrLmlkOwogICAgICAgICAgICB0aGlzLmRlY2tOYW1lID0gZGVjay5uYW1lOwoKICAgICAgICAgICAgLy8gQWRkIGNhcmRzIG9uZSBhdCBhIHRpbWUKICAgICAgICAgICAgbGV0IGFkZGVkID0gMDsKICAgICAgICAgICAgbGV0IGZhaWxlZCA9IDA7CiAgICAgICAgICAgIGZvciAoY29uc3QgY2FyZCBvZiBkYXRhLmNhcmRzKSB7CiAgICAgICAgICAgICAgICBpZiAoIWNhcmQuc2NyeWZhbGxfaWQgJiYgIWNhcmQubmFtZSkgY29udGludWU7CgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBsZXQgc2ZpZCA9IGNhcmQuc2NyeWZhbGxfaWQ7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gc2NyeWZhbGxfaWQsIHRyeSBmdXp6eSBTY3J5ZmFsbCBsb29rdXAKICAgICAgICAgICAgICAgICAgICBpZiAoIXNmaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NyeUNhcmQgPSBhd2FpdCBzY3J5ZmFsbEZ1enp5U2VhcmNoKGNhcmQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3J5Q2FyZCkgc2ZpZCA9IHNjcnlDYXJkLmlkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXNmaWQpIHsgZmFpbGVkKys7IGNvbnRpbnVlOyB9CgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29tbWFuZGVyID0gKGNhcmQucm9sZSA9PT0gJ2NvbW1hbmRlcicpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBpUG9zdCgnL2FwaS9kZWNrcy8nICsgZGVjay5pZCAr' +
'ICcvY2FyZHMnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcnlmYWxsX2lkOiBzZmlkLAogICAgICAgICAgICAgICAgICAgICAgICBjYXJkX25hbWU6IGNhcmQubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IGNhcmQuY291bnQgfHwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgaXNfY29tbWFuZGVyOiBpc0NvbW1hbmRlciwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhZGRlZCsrOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoY2FyZEVycikgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGFkZCAnICsgY2FyZC5uYW1lICsgJzonLCBjYXJkRXJyLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIGZhaWxlZCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBSZWxvYWQKICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGVja3MoKTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGVjayhkZWNrLmlkKTsKICAgICAgICAgICAgcXMoJyNkZWNrLXNlbGVjdG9yJykudmFsdWUgPSBkZWNrLmlkOwoKICAgICAgICAgICAgY29uc3QgbXNnID0gJ0NyZWF0ZWQgIicgKyBkZWNrTmFtZSArICciIHdpdGggJyArIGFkZGVkICsgJyBjYXJkcyc7CiAgICAgICAgICAgIGlmIChmYWlsZWQpIHsKICAgICAgICAgICAgICAgIFRvYXN0TWFuYWdlci5zaG93KG1zZyArICcgKCcgKyBmYWlsZWQgKyAnIGZhaWxlZCB0byByZXNvbHZlKScsICd3YXJuaW5nJywgNTAwMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdyhtc2csICdzdWNjZXNzJywgNDAwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgVG9hc3RNYW5hZ2VyLnNob3coJ0ZhaWxlZCB0byBjcmVhdGUgZGVjazogJyArIGVyci5tZXNzYWdlLCAnZXJyb3InKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBpZiAoYXBwbHlCdG4pIHsgYXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTsgYXBwbHlCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IENyZWF0ZSBEZWNrIGZyb20gQUkgUmVzdWx0cyc7IH0KICAgICAgICB9CiAgICB9LAoKICAgIC8qKiBIVE1MLWVzY2FwZSBoZWxwZXIgKi8KICAgIF9lc2ModGV4dCkgewogICAgICAgIGlmICghdGV4dCkgcmV0dXJuICcnOwogICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGRpdi50ZXh0Q29udGVudCA9IFN0cmluZyh0ZXh0KTsKICAgICAgICByZXR1cm4gZGl2LmlubmVySFRNTDsKICAgIH0sCn07CgovKiDilIDilIAgQm9vdHN0cmFwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsKICAgIERlY2tCdWlsZGVyLmluaXQoKS5jYXRjaChlcnIgPT4gewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlY2tCdWlsZGVyIGluaXQgZXJyb3I6JywgZXJyKTsKICAgICAgICBUb2FzdE1hbmFnZXIuc2hvdygnRmFpbGVkIHRvIGluaXRpYWxpemUgZGVjayBidWlsZGVyJywgJ2Vycm9yJyk7CiAgICB9KTsKfSk7Cg=='
Install-B64 -R 'ui\deckbuilder.js' -B $b
# ui/deckgenerator.css (29,054 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIEF1dG8gRGVjayBHZW5lcmF0b3IgU3R5bGVzCiAgIFVzZXMgZGctIHByZWZpeCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBsYWItIC8gZGVjay0gLyBjb2xsLQogICBUb2tlbnMgZnJvbSBnbG9iYWwuY3NzIGRlc2lnbiBzeXN0ZW0KICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgovKiDilIDilIAgSlMgQmFja3dhcmQtQ29tcGF0IEFsaWFzZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgIGRlY2tnZW5lcmF0b3IuanMgdXNlcyB2YXIoLS1sYWItc3VyZmFjZSkgaW4gYSB0ZW1wbGF0ZSBsaXRlcmFsLgogICBNYXAgaXQgdG8gdGhlIGdsb2JhbCB0b2tlbiBzbyBpbmxpbmUgc3R5bGVzIHdvcmsuCiAgIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwo6cm9vdCB7CiAgICAtLWxhYi1zdXJmYWNlOiB2YXIoLS1zdXJmYWNlLTEpOwp9CgovKiDilIDilIAgWi1JTkRFWCBTVEFDSyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgMTAgIGNhcmQgZ3JvdXAgaGVhZGVycyAoc3RpY2t5KQogICA1MCAgY29tbWFuZGVyIGRyb3Bkb3duCiAgIDYwICBjYXJkIHByZXZpZXcKICAgNTAwIHRvYXN0IGNvbnRhaW5lcgogICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi8qIOKUgOKUgCAxLiBQYWdlIEJhc2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgojZGVja2dlbi1wYWdlIHsKICAgIG1pbi1oZWlnaHQ6IGNhbGMoMTAwdmggLSB2YXIoLS1uYXYtaGVpZ2h0KSk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGlzb2xhdGlvbjogaXNvbGF0ZTsKfQoKLyog4pSA4pSAIDIuIE1haW4gTGF5b3V0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRnLW1haW4gewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMzYwcHggMWZyOwogICAgZ2FwOiAwOwogICAgZmxleDogMTsKICAgIG1pbi1oZWlnaHQ6IDA7Cn0KCi5kZy1jb2wtY29uZmlnIHsKICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC01KTsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBvdmVyZmxvdy14OiB2aXNpYmxlOwogICAgaGVpZ2h0OiBjYWxjKDEwMHZoIC0gdmFyKC0tbmF2LWhlaWdodCkpOwogICAgcG9zaXRpb246IHN0aWNreTsKICAgIHRvcDogdmFyKC0tbmF2LWhlaWdodCk7CiAgICBkaXNwbGF5OiBmbGV4' +
'OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogdmFyKC0tc3AtNCk7CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IHZhcigtLWJvcmRlcikgdHJhbnNwYXJlbnQ7Cn0KCi5kZy1jb2wtY29uZmlnOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiA2cHg7IH0KLmRnLWNvbC1jb25maWc6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH0KLmRnLWNvbC1jb25maWc6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogM3B4OyB9CgouZGctY29sLXJlc3VsdHMgewogICAgcGFkZGluZzogdmFyKC0tc3AtNCkgdmFyKC0tc3AtNSk7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgbWluLWhlaWdodDogY2FsYygxMDB2aCAtIHZhcigtLW5hdi1oZWlnaHQpKTsKICAgIHNjcm9sbGJhci13aWR0aDogdGhpbjsKICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYm9yZGVyKSB0cmFuc3BhcmVudDsKfQoKLmRnLWNvbC1yZXN1bHRzOjotd2Via2l0LXNjcm9sbGJhciB7IHdpZHRoOiA2cHg7IH0KLmRnLWNvbC1yZXN1bHRzOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9Ci5kZy1jb2wtcmVzdWx0czo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiAzcHg7IH0KCi8qIOKUgOKUgCAzLiBQYW5lbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGctcGFuZWwgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi8qIENvbW1hbmRlciBwYW5lbCBuZWVkcyB2aXNpYmxlIG92ZXJmbG93IGZvciBkcm9wZG93biAqLwouZGctcGFuZWwuZGctcGFuZWwtY29tbWFuZGVyIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgouZGctcGFuZWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKSB2YXIoLS1yYWRpdXMtbWQpIDAgMDsKfQoKLmRnLXBhbmVsLXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmRnLXBhbmVsLWhpbnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5kZy1wYW5lbC1oaW50LmRnLW92ZXIgewogICAgY29sb3I6IHZhcigtLWVycm9yKTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5kZy1wYW5lbC1ib2R5IHsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTQpOwp9CgovKiDilIDilIAgNC4gSW5wdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGctaW5wdXQgewogICAgd2lkdGg6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICBv' +
'dXRsaW5lOiBub25lOwogICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKSwgYm94LXNoYWRvdyB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5kZy1pbnB1dDpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tYWNjZW50LWdsb3cpOwp9CgouZGctaW5wdXQ6OnBsYWNlaG9sZGVyIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7Cn0KCi8qIOKUgOKUgCA1LiBDb21tYW5kZXIgU2VhcmNoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRnLWNvbW1hbmRlci1zZWFyY2gtd3JhcCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5kZy1jb21tYW5kZXItZHJvcGRvd24gewogICAgZGlzcGxheTogbm9uZTsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgbWF4LWhlaWdodDogMjgwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgei1pbmRleDogOTk5OTsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1sZyk7Cn0KCi5kZy1jb21tYW5kZXItZHJvcGRvd24ub3BlbiB7CiAgICBkaXNwbGF5OiBibG9jazsKfQoKLmRnLWRyb3Bkb3duLWl0ZW0gewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMikgdmFyKC0tc3AtMyk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLXN1YnRsZSk7Cn0KCi5kZy1kcm9wZG93bi1pdGVtOmxhc3QtY2hpbGQgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLmRnLWRyb3Bkb3duLWl0ZW06aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7Cn0KCi5kZy1kcm9wZG93bi1pdGVtLWltZyB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogNDRweDsKICAgIG9iamVjdC1maXQ6IGNvdmVyOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwp9CgouZGctZHJvcGRvd24taXRlbS1pbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5kZy1kcm9wZG93bi1pdGVtLW5hbWUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLmRnLWRyb3Bkb3duLWl0ZW0tdHlwZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLmRnLWRyb3Bkb3duLWl0ZW0tYmFkZ2UgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgcGFkZGluZzogMXB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZy1iYWRnZS1vd25lZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWRpbSk7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDc0LCAyMjIsIDEyOCwgMC4zKTsKfQoKLmRnLWJhZGdlLXNjcnlmYWxsIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQtZ2xvdyk7Cn0KCi5kZy1kcm9wZG93bi1lbXB0eSB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC00KTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5kZy1kcm9wZG93bi1sb2FkaW5nIHsK' +
'ICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTQpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi8qIENvbW1hbmRlciBTZWxlY3RlZCBDYXJkICovCgouZGctY29tbWFuZGVyLXNlbGVjdGVkIHsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTMpOwp9CgouZGctY29tbWFuZGVyLWNhcmQgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5kZy1jb21tYW5kZXItaW1nIHsKICAgIHdpZHRoOiAxMDAlOwogICAgbWF4LXdpZHRoOiAyNjBweDsKICAgIGhlaWdodDogYXV0bzsKICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGJveC1zaGFkb3c6IDAgNHB4IDIwcHggcmdiYSgwLCAwLCAwLCAwLjUpOwp9CgouZGctY29tbWFuZGVyLWluZm8gewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWluLXdpZHRoOiAwOwogICAgd2lkdGg6IDEwMCU7Cn0KCi5kZy1jb21tYW5kZXItbmFtZSB7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICNmZmY7Cn0KCi5kZy1jb21tYW5kZXItdHlwZSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWFyZ2luLXRvcDogMnB4Owp9CgouZGctY29tbWFuZGVyLWNvbG9ycyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDNweDsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTEpOwp9CgovKiBNVEcgbWFuYSBjb2xvciBwaXBzIOKAlCBkb21haW4tc3BlY2lmaWMgY29sb3JzICovCi5kZy1jb2xvci1waXAgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB3aWR0aDogMThweDsKICAgIGhlaWdodDogMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctc20pOwp9CgouZGctcGlwLVcgeyBiYWNrZ3JvdW5kOiAjZjlmYWY0OyBjb2xvcjogIzNkMzkyOTsgfQouZGctcGlwLVUgeyBiYWNrZ3JvdW5kOiAjMGU2N2FiOyBjb2xvcjogI2ZmZjsgfQouZGctcGlwLUIgeyBiYWNrZ3JvdW5kOiAjMmIyNDI0OyBjb2xvcjogI2NjYzsgfQouZGctcGlwLVIgeyBiYWNrZ3JvdW5kOiAjZDMyMDJhOyBjb2xvcjogI2ZmZjsgfQouZGctcGlwLUcgeyBiYWNrZ3JvdW5kOiAjMDA3MzNlOyBjb2xvcjogI2ZmZjsgfQouZGctcGlwLUMgeyBiYWNrZ3JvdW5kOiAjNzA2ZjZmOyBjb2xvcjogI2ZmZjsgfQoKLmRnLWNvbW1hbmRlci1jbGVhciB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IHZhcigtLXNwLTIpOwogICAgcmlnaHQ6IHZhcigtLXNwLTIpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgYm9yZGVyOiBub25lOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LXNpemU6IDE4cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICB6LWluZGV4OiAyOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSksIGNvbG9yIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKfQoKLmRnLWNvbW1hbmRlci1jbGVhcjpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tZXJyb3IpOwp9CgovKiDilIDilIAgNi4gU291cmNlIFRvZ2dsZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGctc291cmNlLXRvZ2dsZXMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IHZhcigt' +
'LXNwLTIpOwp9CgouZGctc291cmNlLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIDA7Cn0KCi5kZy1zb3VyY2UtbGFiZWwgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwp9CgouZGctc291cmNlLWV4cCB7CiAgICBmb250LXNpemU6IDlweDsKICAgIHBhZGRpbmc6IDFweCA1cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgYmFja2dyb3VuZDogdmFyKC0td2FybmluZy1kaW0pOwogICAgY29sb3I6IHZhcigtLXdhcm5pbmcpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTEsIDE5MSwgMzYsIDAuMyk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjNweDsKfQoKLyog4pSA4pSAIDcuIFRvZ2dsZSBTd2l0Y2gg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGctdG9nZ2xlLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIDA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLmRnLXRvZ2dsZS1sYWJlbCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5kZy10b2dnbGUtY2hlY2sgewogICAgZGlzcGxheTogbm9uZTsKfQoKLmRnLXRvZ2dsZS10cmFjayB7CiAgICB3aWR0aDogMzRweDsKICAgIGhlaWdodDogMThweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA5cHg7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbGV4LXNocmluazogMDsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4yczsKfQoKLmRnLXRvZ2dsZS1jaGVjazpjaGVja2VkICsgLmRnLXRvZ2dsZS10cmFjayB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOwp9CgouZGctdG9nZ2xlLXRodW1iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMnB4OwogICAgbGVmdDogMnB4OwogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnM7Cn0KCi5kZy10b2dnbGUtY2hlY2s6Y2hlY2tlZCArIC5kZy10b2dnbGUtdHJhY2sgLmRnLXRvZ2dsZS10aHVtYiB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTZweCk7Cn0KCi8qIOKUgOKUgCA4LiBSYXRpbyBDb250cm9scyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZy1yYXRpby1saXN0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKfQoKLmRnLXJhdGlvLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5kZy1yYXRpby1sYWJlbCB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgd2lkdGg6IDgwcHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjM7Cn0KCi5kZy1yYXRpby1zbGlkZXIgewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBvdXRsaW5lOiBub25lOwogICAgbWFyZ2luOiAwIDRweDsKfQoKLmRnLXJhdGlvLXNsaWRlcjo6LXdlYmtpdC1zbGlkZXItdGh1bWIgewogICAg' +
'LXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwogICAgd2lkdGg6IDE2cHg7CiAgICBoZWlnaHQ6IDE2cHg7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYmcpOwogICAgYm94LXNoYWRvdzogMCAwIDZweCB2YXIoLS1hY2NlbnQtZ2xvdyk7CiAgICBtYXJnaW4tdG9wOiAtNXB4Owp9CgouZGctcmF0aW8tc2xpZGVyOjotbW96LXJhbmdlLXRodW1iIHsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJnKTsKfQoKLmRnLXJhdGlvLXZhbHVlIHsKICAgIHdpZHRoOiA1MnB4OwogICAgbWluLXdpZHRoOiA1MnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7Cn0KCi5kZy1yYXRpby12YWx1ZTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKLmRnLXJhdGlvLXZhbHVlOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgIG1hcmdpbjogMDsKfQoKLmRnLXJhdGlvLXZhbHVlOmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi8qIOKUgOKUgCA5LiBCdXR0b25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRnLWFjdGlvbnMgewogICAgcGFkZGluZzogdmFyKC0tc3AtMSkgMCB2YXIoLS1zcC0yKTsKfQoKLmRnLWJ0biB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNSk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICBib3JkZXI6IG5vbmU7CiAgICBmb250LWZhbWlseTogaW5oZXJpdDsKfQoKLmRnLWJ0bjpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjQ1OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLmRnLWJ0bi1pY29uIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLmRnLWJ0bi1wcmV2aWV3IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwogICAgY29sb3I6IHZhcigtLXRleHQtaW52ZXJzZSk7CiAgICB3aWR0aDogMTAwJTsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwp9CgouZGctYnRuLXByZXZpZXc6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTZweCB2YXIoLS1zdWNjZXNzLWRpbSk7Cn0KCi5kZy1idG4tc2F2ZSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOwogICAgY29sb3I6IHZhcigtLXRleHQtaW52ZXJzZSk7Cn0KCi5kZy1idG4tc2F2ZTpob3Zlcjpub3QoOmRpc2FibGVkKSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtaG92ZXIpOwogICAgYm94LXNoYWRvdzogMCA0cHggMTJweCB2YXIoLS1hY2NlbnQtZ2xvdyk7Cn0KCi5kZy1idG4tZ2hvc3QgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5kZy1idG4tZ2hvc3Q6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1h' +
'Y2NlbnQpOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi8qIOKUgOKUgCAxMC4gRW1wdHkgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGctZW1wdHktc3RhdGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtaW4taGVpZ2h0OiA0MDBweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMyk7Cn0KCi5kZy1lbXB0eS1pY29uIHsKICAgIGZvbnQtc2l6ZTogNDhweDsKICAgIG9wYWNpdHk6IDAuMjU7CiAgICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLmRnLWVtcHR5LXRpdGxlIHsKICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGctZW1wdHktdGV4dCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgbWF4LXdpZHRoOiAzMDBweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi8qIOKUgOKUgCAxMS4gTG9hZGluZyBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZy1sb2FkaW5nIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgbWluLWhlaWdodDogMzAwcHg7CiAgICBnYXA6IHZhcigtLXNwLTQpOwp9CgouZGctc3Bpbm5lciB7CiAgICB3aWR0aDogMzZweDsKICAgIGhlaWdodDogMzZweDsKICAgIGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYW5pbWF0aW9uOiBkZy1zcGluIDAuN3MgbGluZWFyIGluZmluaXRlOwp9CgpAa2V5ZnJhbWVzIGRnLXNwaW4gewogICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9Cn0KCi5kZy1sb2FkaW5nLXRleHQgewogICAgZm9udC1zaXplOiAxNHB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLyog4pSA4pSAIDEyLiBSZXN1bHRzIOKAlCBTdGF0cyBCYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGctc3RhdHMtYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgZmxleC13cmFwOiB3cmFwOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNCk7Cn0KCi5kZy1zdGF0LWNoaXAgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMikgdmFyKC0tc3AtMyk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy14bCk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5kZy1zdGF0LW51bSB7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGNvbG9yOiAjZmZmOwp9CgouZGctc3RhdC1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwp9CgouZGctc3RhdC1vd25lZCAuZGctc3RhdC1udW0geyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IH0KLmRnLXN0YXQtcHJveHkgLmRnLXN0YXQtbnVtIHsgY29sb3I6IHZhcigtLXdhcm5pbmcpOyB9CgovKiDilIDilIAgMTMuIFJlc3VsdHMg4oCUIENhcmQgR3JvdXBzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoKLmRnLWNhcmQtZ3JvdXBzIHsKICAgIGRpc3BsYXk6IGZsZXg7' +
'CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKfQoKLmRnLWNhcmQtZ3JvdXAgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmRnLWdyb3VwLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5kZy1ncm91cC1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogcmdiYSg5MSwgMTU4LCAyNDAsIDAuMDgpOwp9CgouZGctZ3JvdXAtdGl0bGUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwp9CgouZGctZ3JvdXAtY291bnQgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5kZy1ncm91cC1ib2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouZGctZ3JvdXAtYm9keS5jb2xsYXBzZWQgewogICAgZGlzcGxheTogbm9uZTsKfQoKLmRnLWNhcmQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1zdWJ0bGUpOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjFzOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouZGctY2FyZC1yb3c6bGFzdC1jaGlsZCB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9CgouZGctY2FyZC1yb3c6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7Cn0KCi5kZy1jYXJkLXJvdy1tYW5hIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB3aWR0aDogNTBweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgZmxleC1zaHJpbms6IDA7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKfQoKLmRnLWNhcmQtcm93LW5hbWUgewogICAgZmxleDogMTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5kZy1jYXJkLXJvdy1yb2xlcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiAzcHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLmRnLXJvbGUtY2hpcCB7CiAgICBmb250LXNpemU6IDlweDsKICAgIHBhZGRpbmc6IDFweCA1cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4zcHg7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouZGctY2FyZC1yb3ctc291cmNlIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIHBhZGRpbmc6IDFweCA2cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouZGctc3JjLWNvbGxlY3Rpb24gewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcy1kaW0pOwogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwp9CgouZGctc3JjLWVkaHJlYyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wdXJwbGUtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1wdXJwbGUpOwp9CgouZGctc3JjLWFyY2hpZGVrdCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIo' +
'LS1hY2NlbnQtZGltKTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouZGctc3JjLW1veGZpZWxkIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmctZGltKTsKICAgIGNvbG9yOiB2YXIoLS13YXJuaW5nKTsKfQoKLmRnLXNyYy1tdGdnb2xkZmlzaCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOwogICAgY29sb3I6IHZhcigtLWVycm9yKTsKfQoKLmRnLXNyYy10ZW1wbGF0ZSB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDEzOSwgMTQ4LCAxNTgsIDAuMTIpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKfQoKLmRnLWNhcmQtcm93LW93bmVkIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmbGV4LXNocmluazogMDsKICAgIHdpZHRoOiAzMnB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZGctY2FyZC1yb3ctb3duZWQuaXMtb3duZWQgewogICAgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmRnLWNhcmQtcm93LW93bmVkLmlzLXByb3h5IHsKICAgIGNvbG9yOiB2YXIoLS13YXJuaW5nKTsKfQoKLyogQ2FyZCBJbWFnZSBQcmV2aWV3IG9uIEhvdmVyICovCgouZGctY2FyZC1wcmV2aWV3IHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB6LWluZGV4OiA2MDsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgouZGctY2FyZC1wcmV2aWV3LnZpc2libGUgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5kZy1jYXJkLXByZXZpZXcgaW1nIHsKICAgIHdpZHRoOiAyNDBweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBib3gtc2hhZG93OiAwIDhweCAyNHB4IHJnYmEoMCwgMCwgMCwgMC42KTsKfQoKLyog4pSA4pSAIDE0LiBTYXZlIEJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCi5kZy1zYXZlLWJhciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMyk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC00KSAwIHZhcigtLXNwLTIpOwogICAgcG9zaXRpb246IHN0aWNreTsKICAgIGJvdHRvbTogMDsKICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCwgdmFyKC0tYmcpIDIwJSk7CiAgICBwYWRkaW5nLXRvcDogdmFyKC0tc3AtNik7Cn0KCi8qIOKUgOKUgCAxNS4gVG9hc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCgouZGctdG9hc3QtY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIGJvdHRvbTogdmFyKC0tc3AtNSk7CiAgICByaWdodDogdmFyKC0tc3AtNSk7CiAgICB6LWluZGV4OiA1MDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5kZy10b2FzdCB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC00KTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogI2ZmZjsKICAgIGFuaW1hdGlvbjogZGctdG9hc3QtaW4gMC4yNXMgZWFzZSwgZGctdG9hc3Qtb3V0IDAuM3MgZWFzZSAyLjVzIGZvcndhcmRzOwogICAgbWF4LXdpZHRoOiAzNjBweDsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1tZCk7Cn0KCi5kZy10b2FzdC1zdWNjZXNzIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOwp9CgouZGctdG9hc3QtZXJyb3IgewogICAgYmFja2dyb3VuZDogdmFyKC0tZXJyb3IpOwp9CgouZGctdG9hc3QtaW5mbyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOwogICAgY29sb3I6IHZhcigtLXRleHQtaW52ZXJzZSk7Cn0KCkBrZXlmcmFtZXMgZGctdG9hc3QtaW4gewogICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMnB4KTsgfQogICAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0KfQoKQGtleWZyYW1lcyBkZy10' +
'b2FzdC1vdXQgewogICAgZnJvbSB7IG9wYWNpdHk6IDE7IH0KICAgIHRvIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC04cHgpOyB9Cn0KCi8qIOKUgOKUgCAxNi4gUmVzcG9uc2l2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KCkBtZWRpYSAobWF4LXdpZHRoOiA5MDBweCkgewogICAgLmRnLW1haW4gewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC5kZy1jb2wtY29uZmlnIHsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICB9CgogICAgLmRnLWNvbC1yZXN1bHRzIHsKICAgICAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNzY4cHgpIHsKICAgIC5kZy1jb2wtY29uZmlnIHsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKTsKICAgIH0KCiAgICAuZGctY29sLXJlc3VsdHMgewogICAgICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpOwogICAgfQoKICAgIC5kZy1jYXJkLXByZXZpZXcgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KfQoKLyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIFYzIEFkZGl0aW9ucyDigJQgQnJhY2tldCwgU3RyYXRlZ3ksIFN1YnN0aXR1dGlvbiBVSQogICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KCi8qIOKUgOKUgCBCcmFja2V0IEJ1dHRvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZy1icmFja2V0LXJvdyB7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0zKTsKfQoKLmRnLWJyYWNrZXQtYnRucyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTIpOwp9CgouZGctYnJhY2tldC1idG4gewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1czsKfQoKLmRnLWJyYWNrZXQtYnRuOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKfQoKLmRnLWJyYWNrZXQtYnRuLmRnLWJyYWNrZXQtYWN0aXZlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogI2ZmZjsKfQoKLyog4pSA4pSAIEJ1ZGdldCBSb3cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZy1idWRnZXQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTIpOwp9CgouZGctaW5wdXQtbmFycm93IHsKICAgIHdpZHRoOiAxMjBweDsKICAgIGZsZXgt' +
'c2hyaW5rOiAwOwp9CgouZGctc2VsZWN0IHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKfQoKLyog4pSA4pSAIE1vZGVsIFJvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRnLW1vZGVsLXJvdyB7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0zKTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKfQoKLmRnLW1vZGVsLXJvdyAuZGctc2VsZWN0IHsKICAgIGZsZXg6IDE7Cn0KCi5kZy1sYWJlbCB7CiAgICBmb250LXNpemU6IDAuOHJlbTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgovKiDilIDilIAgU3RyYXRlZ3kgQmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGctc3RyYXRlZ3ktYmFyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTQpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMyk7Cn0KCi5kZy1zdHJhdGVneS1pbmZvIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLmRnLWJyYWNrZXQtYmFkZ2UgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBtaW4td2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDI0cHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGZvbnQtc2l6ZTogMC44cmVtOwogICAgY29sb3I6ICNmZmY7CiAgICBwYWRkaW5nOiAwIHZhcigtLXNwLTIpOwp9CgouZGctYnJhY2tldC0xIHsgYmFja2dyb3VuZDogIzRhZGU4MDsgY29sb3I6ICMwYTBhMGE7IH0KLmRnLWJyYWNrZXQtMiB7IGJhY2tncm91bmQ6ICM2MGE1ZmE7IH0KLmRnLWJyYWNrZXQtMyB7IGJhY2tncm91bmQ6ICNmNTllMGI7IGNvbG9yOiAjMGEwYTBhOyB9Ci5kZy1icmFja2V0LTQgeyBiYWNrZ3JvdW5kOiAjZWY0NDQ0OyB9CgouZGctYXJjaGV0eXBlLWJhZGdlIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMiwgIzJhMmEyYSk7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGZvbnQtc2l6ZTogMC43NXJlbTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgouZGctc3RyYXRlZ3ktdGV4dCB7CiAgICBmb250LXNpemU6IDAuODVyZW07CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi5kZy1icmFja2V0LXJlYXNvbmluZyB7CiAgICBmb250LXNpemU6IDAuNzVyZW07CiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0yKTsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCi5kZy1nYW1lLWNoYW5nZXJzIHsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTIpOwogICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOwp9CgouZGctZ2MtY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDIzOSwgNjgsIDY4LCAwLjE1KTsKICAgIGNvbG9yOiAjZmNhNWE1OwogICAgcGFkZGlu' +
'ZzogMXB4IDZweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBmb250LXNpemU6IDAuN3JlbTsKICAgIG1hcmdpbi1sZWZ0OiB2YXIoLS1zcC0xKTsKfQoKLyog4pSA4pSAIFN1YnN0aXR1dGlvbiBTdW1tYXJ5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGctc3ViLXN1bW1hcnkgewogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMyk7Cn0KCi5kZy1zdWItYmFyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMikgdmFyKC0tc3AtNCk7Cn0KCi5kZy1zdWItc3RhdCB7CiAgICBmb250LXNpemU6IDAuOHJlbTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCi5kZy1zdWItb3duZWQgeyBjb2xvcjogIzRhZGU4MDsgfQouZGctc3ViLXN1YnN0aXR1dGVkIHsgY29sb3I6ICM2MGE1ZmE7IH0KLmRnLXN1Yi1taXNzaW5nIHsgY29sb3I6ICNmNTllMGI7IH0KCi8qIOKUgOKUgCBDYXJkIFN0YXR1cyBCYWRnZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZy1jYXJkLXN0YXR1cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAxcHggNnB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGZvbnQtc2l6ZTogMC42NXJlbTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKfQoKLmRnLWJhZGdlLW93bmVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNzQsIDIyMiwgMTI4LCAwLjE1KTsKICAgIGNvbG9yOiAjNGFkZTgwOwp9CgouZGctYmFkZ2Utc3Vic3RpdHV0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSg5NiwgMTY1LCAyNTAsIDAuMTUpOwogICAgY29sb3I6ICM2MGE1ZmE7Cn0KCi5kZy1iYWRnZS1taXNzaW5nIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjQ1LCAxNTgsIDExLCAwLjE1KTsKICAgIGNvbG9yOiAjZjU5ZTBiOwp9CgovKiDilIDilIAgQ2FyZCBSb3cgVjMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5kZy1jYXJkLXJvdyB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMDQpOwp9CgouZGctY2FyZC1yb3ctbWFpbiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5kZy1jYXJkLXJvdy1uYW1lIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgZm9udC1zaXplOiAwLjg1cmVtOwp9CgouZGctY2FyZC1yb3ctcm9sZXMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogM3B4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZy1jYXJkLXByaWNlIHsKICAgIGZvbnQtc2l6ZTogMC43cmVtOwogICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5kZy1jYXJkLXJlYXNvbiB7CiAgICBmb250LXNpemU6IDAuN3JlbTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTsKICAgIHBhZGRpbmc6IDJweCAwIDAgdmFyKC0tc3AtMyk7CiAgICBsaW5lLWhlaWdodDogMS4zOwp9CgovKiDilIDilIAgU3Vic3RpdHV0aW9uIExpbmVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgCAqLwouZGctY2FyZC1zdWItbGluZSB7CiAgICBwYWRkaW5nOiAycHggMCAwIHZhcigtLXNwLTMpOwogICAgZm9udC1zaXplOiAwLjc1cmVtOwp9CgouZGctc3ViLWFycm93IHsKICAgIGNvbG9yOiAjNjBhNWZhOwogICAgZm9udC13ZWlnaHQ6IDcwMDsKfQoKLmRnLXN1Yi1uYW1lIHsKICAgIGNvbG9yOiAjNjBhNWZhOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLmRnLXN1Yi1sYWJlbCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCk7Cn0KCi5kZy1hbHQtY2hpcCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDUpOwogICAgcGFkZGluZzogMXB4IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBmb250LXNpemU6IDAuNjVyZW07CiAgICBtYXJnaW4tbGVmdDogM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpOwogICAgY3Vyc29yOiBoZWxwOwp9CgovKiDilIDilIAgQ2FyZCByb3cgc3RhdHVzIHN0cmlwaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGctY2FyZC1zdGF0dXMtb3duZWQge30KLmRnLWNhcmQtc3RhdHVzLXN1YnN0aXR1dGVkIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoOTYsIDE2NSwgMjUwLCAwLjA0KTsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSg5NiwgMTY1LCAyNTAsIDAuMyk7Cn0KLmRnLWNhcmQtc3RhdHVzLW1pc3NpbmcgewogICAgYmFja2dyb3VuZDogcmdiYSgyNDUsIDE1OCwgMTEsIDAuMDQpOwogICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCByZ2JhKDI0NSwgMTU4LCAxMSwgMC4zKTsKfQoKLyog4pSA4pSAIENvbW1hbmRlciByb3cgaGlnaGxpZ2h0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGctY2FyZC1yb3ctY29tbWFuZGVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTM5LCA5MiwgMjQ2LCAwLjA4KTsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSgxMzksIDkyLCAyNDYsIDAuNSk7Cn0KCi8qIOKUgOKUgCBFeHBvcnQgQnV0dG9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRnLWV4cG9ydC1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgouZGctYnRuLWV4cG9ydCB7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKSAhaW1wb3J0YW50OwogICAgZm9udC1zaXplOiAwLjc1cmVtICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpICFpbXBvcnRhbnQ7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1tdXRlZCkgIWltcG9ydGFudDsKfQoKLmRnLWJ0bi1leHBvcnQ6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1hY2NlbnQpICFpbXBvcnRhbnQ7CiAgICBjb2xvcjogdmFyKC0tdGV4dCkgIWltcG9ydGFudDsKfQoKLyog4pSA4pSAIFN0YXRzIGFkZGl0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRnLXN0YXQtc3Vic3RpdHV0ZWQgLmRnLXN0YXQtbnVtIHsgY29sb3I6ICM2MGE1ZmE7IH0KLmRnLXN0YXQtbWlzc2luZyAuZGctc3RhdC1udW0geyBjb2xvcjogI2Y1OWUwYjsgfQouZGctc3RhdC1wcmljZSAuZGctc3RhdC1udW0geyBjb2xvcjogI2E3OGJmYTsgfQo='
Install-B64 -R 'ui\deckgenerator.css' -B $b
# ui/deckgenerator.html (10,156 bytes)
$b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgPHRpdGxlPkNvbW1hbmRlciBBSSBMYWIg4oCUIEF1dG8gRGVjayBHZW5lcmF0b3IgVjM8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIiAvPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbiAvPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs1MDA7NjAwOzcwMCZkaXNwbGF5PXN3YXAiIHJlbD0ic3R5bGVzaGVldCIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZ2xvYmFsLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGVja2dlbmVyYXRvci5jc3MiIC8+CjwvaGVhZD4KPGJvZHk+CiAgICA8c2NyaXB0IHNyYz0ibmF2LmpzIj48L3NjcmlwdD4KCiAgICA8ZGl2IGlkPSJkZWNrZ2VuLXBhZ2UiPgoKICAgICAgICA8IS0tIE1BSU4gTEFZT1VUIC0tPgogICAgICAgIDxtYWluIGNsYXNzPSJkZy1tYWluIj4KCiAgICAgICAgICAgIDwhLS0gTEVGVDogQ29uZmlndXJhdGlvbiAtLT4KICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9ImRnLWNvbC1jb25maWciPgoKICAgICAgICAgICAgICAgIDwhLS0gQ29tbWFuZGVyIFNlYXJjaCAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXBhbmVsIGRnLXBhbmVsLWNvbW1hbmRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctcGFuZWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRnLXBhbmVsLXRpdGxlIj5Db21tYW5kZXI8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctcGFuZWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWNvbW1hbmRlci1zZWFyY2gtd3JhcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkZy1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD0iZGctY29tbWFuZGVyLWlucHV0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJTZWFyY2ggZm9yIGEgbGVnZW5kYXJ5IGNyZWF0dXJlLi4uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT0ib2ZmIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWNvbW1hbmRlci1kcm9wZG93biIgaWQ9ImRnLWNvbW1hbmRlci1kcm9wZG93biI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1jb21tYW5kZXItc2VsZWN0ZWQiIGlkPSJkZy1jb21tYW5kZXItc2VsZWN0ZWQiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctY29tbWFuZGVyLWNhcmQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRnLWNvbW1hbmRlci1jbGVhciIgaWQ9ImRnLWNvbW1hbmRlci1jbGVhciIgdGl0bGU9IkNsZWFyIGNvbW1hbmRlciI+JnRpbWVzOzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9ImRnLWNvbW1hbmRlci1pbWciIGlkPSJkZy1jb21tYW5kZXItaW1nIiBzcmM9IiIgYWx0PSIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctY29tbWFuZGVyLWluZm8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1jb21tYW5kZXItbmFtZSIgaWQ9ImRnLWNvbW1hbmRlci1uYW1lIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctY29tbWFu' +
'ZGVyLXR5cGUiIGlkPSJkZy1jb21tYW5kZXItdHlwZSI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWNvbW1hbmRlci1jb2xvcnMiIGlkPSJkZy1jb21tYW5kZXItY29sb3JzIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gU3RyYXRlZ3kgJiBCcmFja2V0IC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctcGFuZWwiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXBhbmVsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZy1wYW5lbC10aXRsZSI+U3RyYXRlZ3kgJmFtcDsgUG93ZXI8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctcGFuZWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJkZy1pbnB1dCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJkZy1zdHJhdGVneSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJlLmcuIHpvbWJpZSB0b2tlbnMsIHZvbHRyb24sIHNwZWxsc2xpbmdlci4uLiIKICAgICAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctYnJhY2tldC1yb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkZy1sYWJlbCI+VGFyZ2V0IEJyYWNrZXQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctYnJhY2tldC1idG5zIiBpZD0iZGctYnJhY2tldC1idG5zIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZy1icmFja2V0LWJ0biIgZGF0YS1icmFja2V0PSIxIiB0aXRsZT0iQ2FzdWFsIOKAlCBwcmVjb24gbGV2ZWwiPkIxPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGctYnJhY2tldC1idG4iIGRhdGEtYnJhY2tldD0iMiIgdGl0bGU9IlVwZ3JhZGVkIENhc3VhbCI+QjI8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZy1icmFja2V0LWJ0biBkZy1icmFja2V0LWFjdGl2ZSIgZGF0YS1icmFja2V0PSIzIiB0aXRsZT0iSGlnaCBQb3dlciI+QjM8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZy1icmFja2V0LWJ0biIgZGF0YS1icmFja2V0PSI0IiB0aXRsZT0iY0VESCDigJQgbWF4aW11bSBwb3dlciI+QjQ8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gRGVjayBOYW1lIC0tPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctcGFuZWwiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXBhbmVsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZy1wYW5lbC10aXRsZSI+RGVjayBOYW1lPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXBhbmVsLWJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZGctaW5wdXQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD0iZGctZGVjay1uYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9IkF1dG8tZ2VuZXJhdGVkIGZyb20gY29tbWFuZGVyIG5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAg' +
'ICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8IS0tIEJ1ZGdldCAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXBhbmVsIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1wYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGctcGFuZWwtdGl0bGUiPkJ1ZGdldDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1wYW5lbC1ib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctYnVkZ2V0LXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImRnLWlucHV0IGRnLWlucHV0LW5hcnJvdyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD0iZGctYnVkZ2V0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJObyBsaW1pdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcD0iMjUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZGctc2VsZWN0IiBpZD0iZGctYnVkZ2V0LW1vZGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InRvdGFsIj5Ub3RhbCBEZWNrICQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJwZXJfY2FyZCI+UGVyIENhcmQgTWF4ICQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gT3B0aW9ucyAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXBhbmVsIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1wYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGctcGFuZWwtdGl0bGUiPk9wdGlvbnM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctcGFuZWwtYm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZGctdG9nZ2xlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGctdG9nZ2xlLWxhYmVsIj5Vc2UgbXkgY29sbGVjdGlvbjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgY2xhc3M9ImRnLXRvZ2dsZS1jaGVjayIgaWQ9ImRnLXVzZS1jb2xsZWN0aW9uIiBjaGVja2VkIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGctdG9nZ2xlLXRyYWNrIj48c3BhbiBjbGFzcz0iZGctdG9nZ2xlLXRodW1iIj48L3NwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImRnLXRvZ2dsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRnLXRvZ2dsZS1sYWJlbCI+U21hcnQgU3Vic3RpdHV0aW9uPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iZGctdG9nZ2xlLWNoZWNrIiBpZD0iZGctc3Vic3RpdHV0aW9uIiBjaGVja2VkIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGctdG9nZ2xlLXRyYWNrIj48c3BhbiBjbGFzcz0iZGctdG9nZ2xlLXRodW1iIj48L3NwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1tb2RlbC1yb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJkZy1sYWJlbCI+QUkgTW9kZWw8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz0iZGctc2VsZWN0IiBpZD0iZGct' +
'bW9kZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9InNvbmFyIj5Tb25hciAoZmFzdCwgfiQwLjAwNCk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJzb25hci1wcm8iPlNvbmFyIFBybyAoZGVlcCwgfiQwLjA0KTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRnLWJ0biBkZy1idG4tcHJldmlldyIgaWQ9ImRnLXByZXZpZXctYnRuIiBkaXNhYmxlZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRnLWJ0bi1pY29uIj7imqE8L3NwYW4+IEdlbmVyYXRlIERlY2sKICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICAgICAgPCEtLSBSSUdIVDogUHJldmlldyBSZXN1bHRzIC0tPgogICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz0iZGctY29sLXJlc3VsdHMiPgogICAgICAgICAgICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWVtcHR5LXN0YXRlIiBpZD0iZGctZW1wdHktc3RhdGUiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWVtcHR5LWljb24iPuKaoTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWVtcHR5LXRpdGxlIj5WMyBBSSBEZWNrIEdlbmVyYXRvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWVtcHR5LXRleHQiPlNlbGVjdCBhIGNvbW1hbmRlciwgc2V0IHlvdXIgYnJhY2tldCBhbmQgc3RyYXRlZ3ksIHRoZW4gY2xpY2sgIkdlbmVyYXRlIERlY2siIHRvIGJ1aWxkIGEgY29tcGxldGUgMTAwLWNhcmQgZGVjayB1c2luZyBQZXJwbGV4aXR5IEFJIHdpdGggc3RydWN0dXJlZCBvdXRwdXQuPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8IS0tIExvYWRpbmcgU3RhdGUgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1sb2FkaW5nIiBpZD0iZGctbG9hZGluZyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctc3Bpbm5lciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGctbG9hZGluZy10ZXh0IiBpZD0iZGctbG9hZGluZy10ZXh0Ij5HZW5lcmF0aW5nIGRlY2sgdmlhIFBlcnBsZXhpdHkgQUkuLi48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwhLS0gUmVzdWx0cyAtLT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXJlc3VsdHMiIGlkPSJkZy1yZXN1bHRzIiBzdHlsZT0iZGlzcGxheTpub25lIj4KCiAgICAgICAgICAgICAgICAgICAgPCEtLSBTdHJhdGVneSAmIEJyYWNrZXQgU3VtbWFyeSAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1zdHJhdGVneS1iYXIiIGlkPSJkZy1zdHJhdGVneS1iYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIFN0YXRzIEJhciAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1zdGF0cy1iYXIiIGlkPSJkZy1zdGF0cy1iYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIFN1YnN0aXR1dGlvbiBTdW1tYXJ5IC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXN1Yi1zdW1tYXJ5IiBpZD0iZGctc3ViLXN1bW1hcnkiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIENhcmQgR3JvdXBzIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLWNhcmQtZ3JvdXBzIiBpZD0iZGctY2FyZC1ncm91cHMiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8IS0tIEV4cG9ydCAmIFNhdmUgQmFyIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRnLXNhdmUtYmFyIiBpZD0iZGctc2F2ZS1iYXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9u' +
'IGNsYXNzPSJkZy1idG4gZGctYnRuLXNhdmUiIGlkPSJkZy1zYXZlLWJ0biI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGctYnRuLWljb24iPvCfkr48L3NwYW4+IFNhdmUgdG8gRGVjayBCdWlsZGVyCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZy1idG4gZGctYnRuLWdob3N0IiBpZD0iZGctcmVnZW5lcmF0ZS1idG4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRnLWJ0bi1pY29uIj7wn5SEPC9zcGFuPiBSZWdlbmVyYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZy1leHBvcnQtZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGctYnRuIGRnLWJ0bi1leHBvcnQiIGlkPSJkZy1leHBvcnQtY3N2Ij7wn5OKIENTVjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZGctYnRuIGRnLWJ0bi1leHBvcnQiIGlkPSJkZy1leHBvcnQtZGNrIj7wn46uIEZvcmdlIC5kY2s8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImRnLWJ0biBkZy1idG4tZXhwb3J0IiBpZD0iZGctZXhwb3J0LW1veGZpZWxkIj7wn5OLIE1veGZpZWxkPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJkZy1idG4gZGctYnRuLWV4cG9ydCIgaWQ9ImRnLWV4cG9ydC1zaG9wcGluZyI+8J+bkiBTaG9wcGluZyBMaXN0PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvc2VjdGlvbj4KCiAgICAgICAgPC9tYWluPgoKICAgICAgICA8IS0tIFRPQVNUIENPTlRBSU5FUiAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJkZy10b2FzdC1jb250YWluZXIiIGlkPSJkZy10b2FzdC1jb250YWluZXIiPjwvZGl2PgoKICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgc3JjPSJkZWNrZ2VuZXJhdG9yLmpzIj48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg=='
Install-B64 -R 'ui\deckgenerator.html' -B $b
# ui/deckgenerator.js (25,829 bytes)
$b = 'LyoqCiAqIENvbW1hbmRlciBBSSBMYWIg4oCUIEF1dG8gRGVjayBHZW5lcmF0b3IgVjMgVUkKICog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAqCiAqIFYzIEVuZHBvaW50czoKICogICBHRVQgICAvYXBpL2RlY2svdjMvc3RhdHVzICAgICAgICAgICAgICDigJQgY2hlY2sgVjMgZ2VuZXJhdG9yIHN0YXR1cwogKiAgIEdFVCAgIC9hcGkvZGVjay1nZW5lcmF0b3IvY29tbWFuZGVyLXNlYXJjaCAg4oCUIGF1dG9jb21wbGV0ZSBjb21tYW5kZXJzCiAqICAgUE9TVCAgL2FwaS9kZWNrL3YzL2dlbmVyYXRlICAgICAgICAgICAg4oCUIGdlbmVyYXRlIGRlY2sgKFBlcnBsZXhpdHkgc3RydWN0dXJlZCBvdXRwdXQpCiAqICAgUE9TVCAgL2FwaS9kZWNrL3YzL2NvbW1pdCAgICAgICAgICAgICAg4oCUIGdlbmVyYXRlICsgc2F2ZSB0byBEZWNrIEJ1aWxkZXIKICogICBQT1NUICAvYXBpL2RlY2svdjMvZXhwb3J0L2NzdiAgICAgICAgICDigJQgZXhwb3J0IGFzIENTVgogKiAgIFBPU1QgIC9hcGkvZGVjay92My9leHBvcnQvZGNrICAgICAgICAgIOKAlCBleHBvcnQgYXMgRm9yZ2UgLmRjawogKiAgIFBPU1QgIC9hcGkvZGVjay92My9leHBvcnQvbW94ZmllbGQgICAgIOKAlCBleHBvcnQgaW4gTW94ZmllbGQgcGFzdGUgZm9ybWF0CiAqICAgUE9TVCAgL2FwaS9kZWNrL3YzL2V4cG9ydC9zaG9wcGluZyAgICAg4oCUIHNob3BwaW5nIGxpc3Qgb2YgbWlzc2luZyBjYXJkcwogKi8KCmNvbnN0IERlY2tHZW5lcmF0b3IgPSAoKCkgPT4gewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIGNvbnN0IEFQSV9CQVNFID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjsKICAgIGNvbnN0IERFQk9VTkNFX01TID0gMzUwOwoKICAgIGNvbnN0IENPTE9SX01BUCA9IHsKICAgICAgICBXOiB7IGxhYmVsOiAnVycsIGNsczogJ2RnLXBpcC1XJyB9LAogICAgICAgIFU6IHsgbGFiZWw6ICdVJywgY2xzOiAnZGctcGlwLVUnIH0sCiAgICAgICAgQjogeyBsYWJlbDogJ0InLCBjbHM6ICdkZy1waXAtQicgfSwKICAgICAgICBSOiB7IGxhYmVsOiAnUicsIGNsczogJ2RnLXBpcC1SJyB9LAogICAgICAgIEc6IHsgbGFiZWw6ICdHJywgY2xzOiAnZGctcGlwLUcnIH0sCiAgICAgICAgQzogeyBsYWJlbDogJ0MnLCBjbHM6ICdkZy1waXAtQycgfSwKICAgIH07CgogICAgY29uc3QgVFlQRV9PUkRFUiA9IFsnQ3JlYXR1cmUnLCAnSW5zdGFudCcsICdTb3JjZXJ5JywgJ0FydGlmYWN0JywgJ0VuY2hhbnRtZW50JywgJ1BsYW5lc3dhbGtlcicsICdMYW5kJywgJ0JhdHRsZScsICdPdGhlciddOwogICAgY29uc3QgVFlQRV9JQ09OUyA9IHsKICAgICAgICAnQ3JlYXR1cmUnOiAn8J+QiScsICdJbnN0YW50JzogJ+KaoScsICdTb3JjZXJ5JzogJ/CfjIAnLCAnQXJ0aWZhY3QnOiAn8J+UpycsCiAgICAgICAgJ0VuY2hhbnRtZW50JzogJ+KcqCcsICdQbGFuZXN3YWxrZXInOiAn8J+MnycsICdMYW5kJzogJ/Cfj5QnLCAnQmF0dGxlJzogJ+KalCcsCiAgICAgICAgJ090aGVyJzogJ/Cfg48nLAogICAgfTsKCiAgICBjb25zdCBTVEFUVVNfQkFER0VTID0gewogICAgICAgIG93bmVkOiB7IGxhYmVsOiAnT3duZWQnLCBjbHM6ICdkZy1iYWRnZS1vd25lZCcgfSwKICAgICAgICBzdWJzdGl0dXRlZDogeyBsYWJlbDogJ1N1YnN0aXR1dGVkJywgY2xzOiAnZGctYmFkZ2Utc3Vic3RpdHV0ZWQnIH0sCiAgICAgICAgbWlzc2luZzogeyBsYWJlbDogJ01pc3NpbmcnLCBjbHM6ICdkZy1iYWRnZS1taXNzaW5nJyB9LAogICAgfTsKCiAgICAvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACiAgICBsZXQgc3RhdGUgPSB7CiAgICAgICAgY29tbWFuZGVyOiBudWxsLAogICAgICAgIHRhcmdldEJyYWNrZXQ6IDMsCiAgICAgICAgcHJldmlld1Jlc3VsdDogbnVsbCwKICAgICAgICBsYXN0UmVxdWVzdEJvZHk6IG51bGwsCiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSwKICAgICAgICB2M1JlYWR5OiBmYWxzZSwKICAgIH07CgogICAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsOwoKICAgIGNvbnN0ICQgPSAoaWQpID0+' +
'IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKCiAgICAvLyDilIDilIAgSW5pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGFzeW5jIGZ1bmN0aW9uIGluaXQoKSB7CiAgICAgICAgYXdhaXQgY2hlY2tWM1N0YXR1cygpOwogICAgICAgIGJpbmRFdmVudHMoKTsKICAgICAgICBjaGVja1F1ZXJ5UGFyYW1zKCk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gY2hlY2tWM1N0YXR1cygpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goQVBJX0JBU0UgKyAnL2FwaS9kZWNrL3YzL3N0YXR1cycpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7CiAgICAgICAgICAgIHN0YXRlLnYzUmVhZHkgPSBkYXRhLmluaXRpYWxpemVkOwogICAgICAgICAgICBpZiAoIXN0YXRlLnYzUmVhZHkpIHsKICAgICAgICAgICAgICAgIHRvYXN0KCdWMyBEZWNrIEdlbmVyYXRvciBub3QgYXZhaWxhYmxlIOKAlCBjaGVjayBQZXJwbGV4aXR5IEFQSSBrZXknLCAnZXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdWMyBzdGF0dXMgY2hlY2sgZmFpbGVkOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkgewogICAgICAgIC8vIENvbW1hbmRlciBzZWFyY2gKICAgICAgICBjb25zdCBpbnB1dCA9ICQoJ2RnLWNvbW1hbmRlci1pbnB1dCcpOwogICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gewogICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VhcmNoVGltZW91dCk7CiAgICAgICAgICAgIGNvbnN0IHEgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgICAgIGlmIChxLmxlbmd0aCA8IDIpIHsgaGlkZURyb3Bkb3duKCk7IHJldHVybjsgfQogICAgICAgICAgICBzZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBzZWFyY2hDb21tYW5kZXIocSksIERFQk9VTkNFX01TKTsKICAgICAgICB9KTsKCiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHEgPSBpbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgICAgIGlmIChxLmxlbmd0aCA+PSAyKSBzZWFyY2hDb21tYW5kZXIocSk7CiAgICAgICAgfSk7CgogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsKICAgICAgICAgICAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kZy1jb21tYW5kZXItc2VhcmNoLXdyYXAnKTsKICAgICAgICAgICAgaWYgKHdyYXAgJiYgIXdyYXAuY29udGFpbnMoZS50YXJnZXQpKSBoaWRlRHJvcGRvd24oKTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnZGctY29tbWFuZGVyLWNsZWFyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGVhckNvbW1hbmRlcik7CgogICAgICAgIC8vIEJyYWNrZXQgYnV0dG9ucwogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZy1icmFja2V0LWJ0bicpLmZvckVhY2goYnRuID0+IHsKICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRnLWJyYWNrZXQtYnRuJykuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnJlbW92ZSgnZGctYnJhY2tldC1hY3RpdmUnKSk7CiAgICAgICAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnZGctYnJhY2tldC1hY3RpdmUnKTsKICAgICAgICAgICAgICAgIHN0YXRlLnRhcmdldEJyYWNrZXQgPSBwYXJzZUludChidG4uZGF0YXNldC5icmFja2V0LCAxMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBHZW5lcmF0ZSAmIHNhdmUKICAgICAgICAkKCdkZy1wcmV2aWV3LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2VuZXJhdGVEZWNrKTsKICAgICAgICAkKCdkZy1zYXZlLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY29tbWl0RGVjayk7CiAgICAgICAgJCgnZGctcmVnZW5lcmF0ZS1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGdlbmVyYXRlRGVjayk7CgogICAgICAgIC8v' +
'IEV4cG9ydCBidXR0b25zCiAgICAgICAgJCgnZGctZXhwb3J0LWNzdicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZXhwb3J0RGVjaygnY3N2JykpOwogICAgICAgICQoJ2RnLWV4cG9ydC1kY2snKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGV4cG9ydERlY2soJ2RjaycpKTsKICAgICAgICAkKCdkZy1leHBvcnQtbW94ZmllbGQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGV4cG9ydE1veGZpZWxkKCkpOwogICAgICAgICQoJ2RnLWV4cG9ydC1zaG9wcGluZycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZXhwb3J0U2hvcHBpbmcoKSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2hlY2tRdWVyeVBhcmFtcygpIHsKICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgICAgIGNvbnN0IG5hbWUgPSBwYXJhbXMuZ2V0KCdjb21tYW5kZXInKTsKICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAkKCdkZy1jb21tYW5kZXItaW5wdXQnKS52YWx1ZSA9IG5hbWU7CiAgICAgICAgICAgIHNlYXJjaENvbW1hbmRlcihuYW1lKTsKICAgICAgICB9CiAgICB9CgogICAgLy8g4pSA4pSAIEJ1aWxkIFJlcXVlc3QgQm9keSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGZ1bmN0aW9uIGJ1aWxkUmVxdWVzdEJvZHkoKSB7CiAgICAgICAgY29uc3QgYnVkZ2V0ID0gcGFyc2VGbG9hdCgkKCdkZy1idWRnZXQnKS52YWx1ZSkgfHwgbnVsbDsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjb21tYW5kZXJfbmFtZTogc3RhdGUuY29tbWFuZGVyLm5hbWUsCiAgICAgICAgICAgIHN0cmF0ZWd5OiAkKCdkZy1zdHJhdGVneScpLnZhbHVlLnRyaW0oKSwKICAgICAgICAgICAgdGFyZ2V0X2JyYWNrZXQ6IHN0YXRlLnRhcmdldEJyYWNrZXQsCiAgICAgICAgICAgIGJ1ZGdldF91c2Q6IGJ1ZGdldCwKICAgICAgICAgICAgYnVkZ2V0X21vZGU6ICQoJ2RnLWJ1ZGdldC1tb2RlJykudmFsdWUsCiAgICAgICAgICAgIG9taXRfY2FyZHM6IFtdLAogICAgICAgICAgICB1c2VfY29sbGVjdGlvbjogJCgnZGctdXNlLWNvbGxlY3Rpb24nKS5jaGVja2VkLAogICAgICAgICAgICBydW5fc3Vic3RpdHV0aW9uOiAkKCdkZy1zdWJzdGl0dXRpb24nKS5jaGVja2VkLAogICAgICAgICAgICBtb2RlbDogJCgnZGctbW9kZWwnKS52YWx1ZSwKICAgICAgICAgICAgZGVja19uYW1lOiAkKCdkZy1kZWNrLW5hbWUnKS52YWx1ZS50cmltKCkgfHwgJycsCiAgICAgICAgfTsKICAgIH0KCiAgICAvLyDilIDilIAgQ29tbWFuZGVyIFNlYXJjaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGZ1bmN0aW9uIHBvc2l0aW9uRHJvcGRvd24oKSB7CiAgICAgICAgY29uc3QgaW5wdXQgPSAkKCdkZy1jb21tYW5kZXItaW5wdXQnKTsKICAgICAgICBjb25zdCBkcm9wZG93biA9ICQoJ2RnLWNvbW1hbmRlci1kcm9wZG93bicpOwogICAgICAgIGNvbnN0IHJlY3QgPSBpbnB1dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBkcm9wZG93bi5zdHlsZS50b3AgPSAocmVjdC5ib3R0b20gKyA0KSArICdweCc7CiAgICAgICAgZHJvcGRvd24uc3R5bGUubGVmdCA9IHJlY3QubGVmdCArICdweCc7CiAgICAgICAgZHJvcGRvd24uc3R5bGUud2lkdGggPSByZWN0LndpZHRoICsgJ3B4JzsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBzZWFyY2hDb21tYW5kZXIocSkgewogICAgICAgIGNvbnN0IGRyb3Bkb3duID0gJCgnZGctY29tbWFuZGVyLWRyb3Bkb3duJyk7CiAgICAgICAgZHJvcGRvd24uaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImRnLWRyb3Bkb3duLWxvYWRpbmciPlNlYXJjaGluZy4uLjwvZGl2Pic7CiAgICAgICAgZHJvcGRvd24uY2xhc3NMaXN0LmFkZCgnb3BlbicpOwogICAgICAgIHBvc2l0aW9uRHJvcGRvd24oKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKEFQSV9CQVNFICsgJy9hcGkvZGVjay1nZW5lcmF0b3IvY29tbWFuZGVyLXNlYXJjaD9xPScgKyBlbmNvZGVVUklDb21wb25lbnQocSkpOwogICAgICAgICAgICBjb25z' +
'dCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7CiAgICAgICAgICAgIHJlbmRlckRyb3Bkb3duKGRhdGEucmVzdWx0cyB8fCBbXSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBkcm9wZG93bi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZGctZHJvcGRvd24tZW1wdHkiPlNlYXJjaCBmYWlsZWQ8L2Rpdj4nOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJEcm9wZG93bihyZXN1bHRzKSB7CiAgICAgICAgY29uc3QgZHJvcGRvd24gPSAkKCdkZy1jb21tYW5kZXItZHJvcGRvd24nKTsKCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGRyb3Bkb3duLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJkZy1kcm9wZG93bi1lbXB0eSI+Tm8gbGVnZW5kYXJ5IGNyZWF0dXJlcyBmb3VuZDwvZGl2Pic7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGRyb3Bkb3duLmlubmVySFRNTCA9IHJlc3VsdHMubWFwKChyLCBpZHgpID0+IHsKICAgICAgICAgICAgY29uc3QgY29sb3JzID0gKHIuY29sb3JfaWRlbnRpdHkgfHwgW10pCiAgICAgICAgICAgICAgICAubWFwKGMgPT4gQ09MT1JfTUFQW2NdID8gJzxzcGFuIGNsYXNzPSJkZy1jb2xvci1waXAgJyArIENPTE9SX01BUFtjXS5jbHMgKyAnIj4nICsgQ09MT1JfTUFQW2NdLmxhYmVsICsgJzwvc3Bhbj4nIDogJycpCiAgICAgICAgICAgICAgICAuam9pbignJyk7CgogICAgICAgICAgICBjb25zdCBiYWRnZSA9IHIuaW5fY29sbGVjdGlvbgogICAgICAgICAgICAgICAgPyAnPHNwYW4gY2xhc3M9ImRnLWRyb3Bkb3duLWl0ZW0tYmFkZ2UgZGctYmFkZ2Utb3duZWQiPk93bmVkPC9zcGFuPicKICAgICAgICAgICAgICAgIDogJzxzcGFuIGNsYXNzPSJkZy1kcm9wZG93bi1pdGVtLWJhZGdlIGRnLWJhZGdlLXNjcnlmYWxsIj5TY3J5ZmFsbDwvc3Bhbj4nOwoKICAgICAgICAgICAgY29uc3QgaW1nU3JjID0gci5pbWFnZV91cmwgPyByLmltYWdlX3VybC5yZXBsYWNlKCd2ZXJzaW9uPW5vcm1hbCcsICd2ZXJzaW9uPXNtYWxsJykgOiAnJzsKICAgICAgICAgICAgY29uc3QgaW1nVGFnID0gaW1nU3JjCiAgICAgICAgICAgICAgICA/ICc8aW1nIGNsYXNzPSJkZy1kcm9wZG93bi1pdGVtLWltZyIgc3JjPSInICsgaW1nU3JjICsgJyIgYWx0PSIiIGxvYWRpbmc9ImxhenkiIC8+JwogICAgICAgICAgICAgICAgOiAnPGRpdiBjbGFzcz0iZGctZHJvcGRvd24taXRlbS1pbWciIHN0eWxlPSJiYWNrZ3JvdW5kOnZhcigtLWxhYi1zdXJmYWNlKSI+PC9kaXY+JzsKCiAgICAgICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGctZHJvcGRvd24taXRlbSIgZGF0YS1pZHg9IicgKyBpZHggKyAnIj4nCiAgICAgICAgICAgICAgICArIGltZ1RhZwogICAgICAgICAgICAgICAgKyAnPGRpdiBjbGFzcz0iZGctZHJvcGRvd24taXRlbS1pbmZvIj4nCiAgICAgICAgICAgICAgICArICcgIDxkaXYgY2xhc3M9ImRnLWRyb3Bkb3duLWl0ZW0tbmFtZSI+JyArIGVzY0h0bWwoci5uYW1lKSArICc8L2Rpdj4nCiAgICAgICAgICAgICAgICArICcgIDxkaXYgY2xhc3M9ImRnLWRyb3Bkb3duLWl0ZW0tdHlwZSI+JyArIGVzY0h0bWwoci50eXBlX2xpbmUgfHwgJycpICsgJzwvZGl2PicKICAgICAgICAgICAgICAgICsgJzwvZGl2PicKICAgICAgICAgICAgICAgICsgJzxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6M3B4O2FsaWduLWl0ZW1zOmNlbnRlciI+JyArIGNvbG9ycyArICc8L2Rpdj4nCiAgICAgICAgICAgICAgICArIGJhZGdlCiAgICAgICAgICAgICAgICArICc8L2Rpdj4nOwogICAgICAgIH0pLmpvaW4oJycpOwoKICAgICAgICBkcm9wZG93bi5xdWVyeVNlbGVjdG9yQWxsKCcuZGctZHJvcGRvd24taXRlbScpLmZvckVhY2goZWwgPT4gewogICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgICAgIHNlbGVjdENvbW1hbmRlcihyZXN1bHRzW3BhcnNlSW50KGVsLmRhdGFzZXQuaWR4LCAxMCldKTsKICAgICAgICAgICAgICAgIGhpZGVEcm9wZG93bigpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3RDb21tYW5kZXIoY21kcikgewogICAgICAgIHN0YXRlLmNvbW1hbmRlciA9IGNtZHI7CiAgICAgICAgJCgnZGctY29tbWFuZGVyLWlucHV0Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAkKCdkZy1jb21tYW5kZXItc2VsZWN0ZWQnKS5zdHls' +
'ZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAkKCdkZy1jb21tYW5kZXItbmFtZScpLnRleHRDb250ZW50ID0gY21kci5uYW1lOwogICAgICAgICQoJ2RnLWNvbW1hbmRlci10eXBlJykudGV4dENvbnRlbnQgPSBjbWRyLnR5cGVfbGluZSB8fCAnJzsKCiAgICAgICAgJCgnZGctY29tbWFuZGVyLWNvbG9ycycpLmlubmVySFRNTCA9IChjbWRyLmNvbG9yX2lkZW50aXR5IHx8IFtdKQogICAgICAgICAgICAubWFwKGMgPT4gQ09MT1JfTUFQW2NdID8gJzxzcGFuIGNsYXNzPSJkZy1jb2xvci1waXAgJyArIENPTE9SX01BUFtjXS5jbHMgKyAnIj4nICsgQ09MT1JfTUFQW2NdLmxhYmVsICsgJzwvc3Bhbj4nIDogJycpCiAgICAgICAgICAgIC5qb2luKCcnKTsKCiAgICAgICAgY29uc3QgaW1nID0gJCgnZGctY29tbWFuZGVyLWltZycpOwogICAgICAgIGlmIChjbWRyLmltYWdlX3VybCkgewogICAgICAgICAgICAvLyBVc2Ugbm9ybWFsIHNpemUgZm9yIHJlYWRhYmxlIG9yYWNsZSB0ZXh0OyBlbnN1cmUgd2UgZG9uJ3QgaGF2ZSBzbWFsbCB2ZXJzaW9uCiAgICAgICAgICAgIHZhciBpbWdVcmwgPSBjbWRyLmltYWdlX3VybDsKICAgICAgICAgICAgaWYgKGltZ1VybC5pbmRleE9mKCd2ZXJzaW9uPXNtYWxsJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICBpbWdVcmwgPSBpbWdVcmwucmVwbGFjZSgndmVyc2lvbj1zbWFsbCcsICd2ZXJzaW9uPW5vcm1hbCcpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGltZ1VybC5pbmRleE9mKCd2ZXJzaW9uPScpID09PSAtMSAmJiBpbWdVcmwuaW5kZXhPZignPycpICE9PSAtMSkgewogICAgICAgICAgICAgICAgaW1nVXJsICs9ICcmdmVyc2lvbj1ub3JtYWwnOwogICAgICAgICAgICB9IGVsc2UgaWYgKGltZ1VybC5pbmRleE9mKCd2ZXJzaW9uPScpID09PSAtMSkgewogICAgICAgICAgICAgICAgaW1nVXJsICs9ICc/dmVyc2lvbj1ub3JtYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGltZy5zcmMgPSBpbWdVcmw7CiAgICAgICAgICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB9CgogICAgICAgICQoJ2RnLXByZXZpZXctYnRuJykuZGlzYWJsZWQgPSBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhckNvbW1hbmRlcigpIHsKICAgICAgICBzdGF0ZS5jb21tYW5kZXIgPSBudWxsOwogICAgICAgICQoJ2RnLWNvbW1hbmRlci1pbnB1dCcpLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAkKCdkZy1jb21tYW5kZXItaW5wdXQnKS52YWx1ZSA9ICcnOwogICAgICAgICQoJ2RnLWNvbW1hbmRlci1zZWxlY3RlZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgJCgnZGctcHJldmlldy1idG4nKS5kaXNhYmxlZCA9IHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gaGlkZURyb3Bkb3duKCkgewogICAgICAgICQoJ2RnLWNvbW1hbmRlci1kcm9wZG93bicpLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKTsKICAgIH0KCiAgICAvLyDilIDilIAgR2VuZXJhdGUgRGVjayDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVjaygpIHsKICAgICAgICBpZiAoIXN0YXRlLmNvbW1hbmRlcikgeyB0b2FzdCgnU2VsZWN0IGEgY29tbWFuZGVyIGZpcnN0JywgJ2Vycm9yJyk7IHJldHVybjsgfQogICAgICAgIGlmICghc3RhdGUudjNSZWFkeSkgeyB0b2FzdCgnVjMgZ2VuZXJhdG9yIG5vdCByZWFkeSDigJQgY2hlY2sgUGVycGxleGl0eSBBUEkga2V5JywgJ2Vycm9yJyk7IHJldHVybjsgfQoKICAgICAgICBzZXRMb2FkaW5nKHRydWUsICdHZW5lcmF0aW5nIGRlY2sgdmlhIFBlcnBsZXhpdHkgQUkuLi4nKTsKCiAgICAgICAgY29uc3QgYm9keSA9IGJ1aWxkUmVxdWVzdEJvZHkoKTsKICAgICAgICBzdGF0ZS5sYXN0UmVxdWVzdEJvZHkgPSBib2R5OwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goQVBJX0JBU0UgKyAnL2FwaS9kZWNrL3YzL2dlbmVyYXRlJywgewogICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAg' +
'ICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghcmVzcC5vaykgewogICAgICAgICAgICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLmVycm9yIHx8IGVyci5kZXRhaWwgfHwgJ0dlbmVyYXRpb24gZmFpbGVkJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN0YXRlLnByZXZpZXdSZXN1bHQgPSBhd2FpdCByZXNwLmpzb24oKTsKICAgICAgICAgICAgcmVuZGVyUmVzdWx0cyhzdGF0ZS5wcmV2aWV3UmVzdWx0KTsKCiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gc3RhdGUucHJldmlld1Jlc3VsdC5zdGF0cyB8fCB7fTsKICAgICAgICAgICAgdG9hc3QoJ0RlY2sgZ2VuZXJhdGVkOiAnICsgKHN0YXRzLnRvdGFsX2NhcmRzIHx8IDApICsgJyBjYXJkcyB8ICQnICsgKHN0YXRzLnRvdGFsX3ByaWNlX3VzZCB8fCAwKSwgJ3N1Y2Nlc3MnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRvYXN0KGUubWVzc2FnZSB8fCAnR2VuZXJhdGlvbiBmYWlsZWQnLCAnZXJyb3InKTsKICAgICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldExvYWRpbmcobG9hZGluZywgdGV4dCkgewogICAgICAgIHN0YXRlLmlzTG9hZGluZyA9IGxvYWRpbmc7CiAgICAgICAgJCgnZGctZW1wdHktc3RhdGUnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICQoJ2RnLWxvYWRpbmcnKS5zdHlsZS5kaXNwbGF5ID0gbG9hZGluZyA/ICdmbGV4JyA6ICdub25lJzsKICAgICAgICAkKCdkZy1yZXN1bHRzJykuc3R5bGUuZGlzcGxheSA9IGxvYWRpbmcgPyAnbm9uZScgOiAnbm9uZSc7CiAgICAgICAgJCgnZGctcHJldmlldy1idG4nKS5kaXNhYmxlZCA9IGxvYWRpbmcgfHwgIXN0YXRlLmNvbW1hbmRlcjsKICAgICAgICBpZiAodGV4dCkgJCgnZGctbG9hZGluZy10ZXh0JykudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgfQoKICAgIC8vIOKUgOKUgCBSZW5kZXIgUmVzdWx0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGZ1bmN0aW9uIHJlbmRlclJlc3VsdHMocmVzdWx0KSB7CiAgICAgICAgJCgnZGctbG9hZGluZycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgJCgnZGctcmVzdWx0cycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICQoJ2RnLXByZXZpZXctYnRuJykuZGlzYWJsZWQgPSBmYWxzZTsKCiAgICAgICAgcmVuZGVyU3RyYXRlZ3lCYXIocmVzdWx0KTsKICAgICAgICByZW5kZXJTdGF0c0JhcihyZXN1bHQpOwogICAgICAgIHJlbmRlclN1YnN0aXR1dGlvblN1bW1hcnkocmVzdWx0KTsKICAgICAgICByZW5kZXJDYXJkR3JvdXBzKHJlc3VsdCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyU3RyYXRlZ3lCYXIocmVzdWx0KSB7CiAgICAgICAgY29uc3QgYmFyID0gJCgnZGctc3RyYXRlZ3ktYmFyJyk7CiAgICAgICAgY29uc3QgYnJhY2tldCA9IHJlc3VsdC5icmFja2V0IHx8IHt9OwogICAgICAgIGNvbnN0IGFyY2hldHlwZSA9IHJlc3VsdC5hcmNoZXR5cGUgfHwgJyc7CiAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSByZXN1bHQuc3RyYXRlZ3lfc3VtbWFyeSB8fCAnJzsKCiAgICAgICAgYmFyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJkZy1zdHJhdGVneS1pbmZvIj4nCiAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1icmFja2V0LWJhZGdlIGRnLWJyYWNrZXQtJyArIChicmFja2V0LmxldmVsIHx8IDApICsgJyI+QicgKyAoYnJhY2tldC5sZXZlbCB8fCAnPycpICsgJzwvc3Bhbj4nCiAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1hcmNoZXR5cGUtYmFkZ2UiPicgKyBlc2NIdG1sKGFyY2hldHlwZSkgKyAnPC9zcGFuPicKICAgICAgICAgICAgKyAnPHNwYW4gY2xhc3M9ImRnLXN0cmF0ZWd5LXRleHQiPicgKyBlc2NIdG1sKHN0cmF0ZWd5KSArICc8L3NwYW4+JwogICAgICAgICAgICArICc8L2Rpdj4nCiAgICAgICAgICAgICsgKGJyYWNrZXQucmVhc29uaW5nID8gJzxkaXYgY2xhc3M9ImRnLWJyYWNrZXQtcmVhc29uaW5nIj4nICsgZXNjSHRtbChicmFja2V0LnJlYXNvbmluZykgKyAnPC9kaXY+JyA6ICcn' +
'KQogICAgICAgICAgICArIChicmFja2V0LmdhbWVfY2hhbmdlcnMgJiYgYnJhY2tldC5nYW1lX2NoYW5nZXJzLmxlbmd0aAogICAgICAgICAgICAgICAgPyAnPGRpdiBjbGFzcz0iZGctZ2FtZS1jaGFuZ2VycyI+R2FtZSBDaGFuZ2VyczogJyArIGJyYWNrZXQuZ2FtZV9jaGFuZ2Vycy5tYXAoYyA9PiAnPHNwYW4gY2xhc3M9ImRnLWdjLWNoaXAiPicgKyBlc2NIdG1sKGMpICsgJzwvc3Bhbj4nKS5qb2luKCcnKSArICc8L2Rpdj4nCiAgICAgICAgICAgICAgICA6ICcnKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJTdGF0c0JhcihyZXN1bHQpIHsKICAgICAgICBjb25zdCBzdGF0cyA9IHJlc3VsdC5zdGF0cyB8fCB7fTsKICAgICAgICBjb25zdCBjb250YWluZXIgPSAkKCdkZy1zdGF0cy1iYXInKTsKCiAgICAgICAgY29uc3QgY2hpcHMgPSBbCiAgICAgICAgICAgIGNoaXBIdG1sKCdUb3RhbCcsIHN0YXRzLnRvdGFsX2NhcmRzIHx8IDAsICcnKSwKICAgICAgICAgICAgY2hpcEh0bWwoJ093bmVkJywgKHN0YXRzLmJ5X3N0YXR1cyB8fCB7fSkub3duZWQgfHwgMCwgJ2RnLXN0YXQtb3duZWQnKSwKICAgICAgICAgICAgY2hpcEh0bWwoJ1N1YmJlZCcsIChzdGF0cy5ieV9zdGF0dXMgfHwge30pLnN1YnN0aXR1dGVkIHx8IDAsICdkZy1zdGF0LXN1YnN0aXR1dGVkJyksCiAgICAgICAgICAgIGNoaXBIdG1sKCdNaXNzaW5nJywgKHN0YXRzLmJ5X3N0YXR1cyB8fCB7fSkubWlzc2luZyB8fCAwLCAnZGctc3RhdC1taXNzaW5nJyksCiAgICAgICAgICAgIGNoaXBIdG1sKCdMYW5kcycsIHN0YXRzLmxhbmRfY291bnQgfHwgMCwgJycpLAogICAgICAgICAgICBjaGlwSHRtbCgnJCcgKyAoc3RhdHMudG90YWxfcHJpY2VfdXNkIHx8IDApLnRvRml4ZWQoMCksICdUb3RhbCcsICdkZy1zdGF0LXByaWNlJyksCiAgICAgICAgXTsKCiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGNoaXBzLmpvaW4oJycpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoaXBIdG1sKGxhYmVsLCBudW0sIGNscykgewogICAgICAgIHJldHVybiAnPGRpdiBjbGFzcz0iZGctc3RhdC1jaGlwICcgKyBjbHMgKyAnIj4nCiAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1zdGF0LW51bSI+JyArIG51bSArICc8L3NwYW4+JwogICAgICAgICAgICArICc8c3BhbiBjbGFzcz0iZGctc3RhdC1sYWJlbCI+JyArIGxhYmVsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgICsgJzwvZGl2Pic7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyU3Vic3RpdHV0aW9uU3VtbWFyeShyZXN1bHQpIHsKICAgICAgICBjb25zdCBlbCA9ICQoJ2RnLXN1Yi1zdW1tYXJ5Jyk7CiAgICAgICAgY29uc3Qgc3ViID0gcmVzdWx0LnN1YnN0aXR1dGlvbl9zdGF0czsKICAgICAgICBpZiAoIXN1YikgeyBlbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOyByZXR1cm47IH0KCiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImRnLXN1Yi1iYXIiPicKICAgICAgICAgICAgKyAnPHNwYW4gY2xhc3M9ImRnLXN1Yi1zdGF0IGRnLXN1Yi1vd25lZCI+JyArIHN1Yi5vd25lZCArICcgb3duZWQ8L3NwYW4+JwogICAgICAgICAgICArICc8c3BhbiBjbGFzcz0iZGctc3ViLXN0YXQgZGctc3ViLXN1YnN0aXR1dGVkIj4nICsgc3ViLnN1YnN0aXR1dGVkICsgJyBzdWJzdGl0dXRlZDwvc3Bhbj4nCiAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1zdWItc3RhdCBkZy1zdWItbWlzc2luZyI+JyArIHN1Yi5taXNzaW5nICsgJyBzdGlsbCBtaXNzaW5nPC9zcGFuPicKICAgICAgICAgICAgKyAnPC9kaXY+JzsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJDYXJkR3JvdXBzKHJlc3VsdCkgewogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9ICQoJ2RnLWNhcmQtZ3JvdXBzJyk7CiAgICAgICAgY29uc3QgY2FyZHMgPSByZXN1bHQuY2FyZHMgfHwgW107CiAgICAgICAgY29uc3QgY29tbWFuZGVyID0gcmVzdWx0LmNvbW1hbmRlcjsKCiAgICAgICAgLy8gR3JvdXAgYnkgY2F0ZWdvcnkKICAgICAgICBjb25zdCBncm91cHMgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgY2FyZHMpIHsKICAgICAgICAgICAgY29uc3QgY2F0ID0gY2FyZC5jYXRlZ29yeSB8fCAnT3RoZXInOwogICAgICAgICAgICBpZiAoIWdyb3Vwc1tjYXRdKSBncm91cHNbY2F0XSA9IFtdOwogICAgICAgICAgICBncm91cHNbY2F0XS5wdXNoKGNhcmQpOwogICAgICAgIH0KCiAgICAgICAgY29uc3Qg' +
'c29ydGVkVHlwZXMgPSBUWVBFX09SREVSLmZpbHRlcih0ID0+IGdyb3Vwc1t0XSAmJiBncm91cHNbdF0ubGVuZ3RoID4gMCk7CiAgICAgICAgZm9yIChjb25zdCB0IG9mIE9iamVjdC5rZXlzKGdyb3VwcykpIHsKICAgICAgICAgICAgaWYgKCFzb3J0ZWRUeXBlcy5pbmNsdWRlcyh0KSkgc29ydGVkVHlwZXMucHVzaCh0KTsKICAgICAgICB9CgogICAgICAgIGxldCBodG1sID0gJyc7CgogICAgICAgIC8vIENvbW1hbmRlciBzZWN0aW9uCiAgICAgICAgaWYgKGNvbW1hbmRlcikgewogICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJkZy1jYXJkLWdyb3VwIj4nCiAgICAgICAgICAgICAgICArICc8ZGl2IGNsYXNzPSJkZy1ncm91cC1oZWFkZXIiPicKICAgICAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1ncm91cC10aXRsZSI+4pqUIENvbW1hbmRlcjwvc3Bhbj4nCiAgICAgICAgICAgICAgICArICc8c3BhbiBjbGFzcz0iZGctZ3JvdXAtY291bnQiPjE8L3NwYW4+JwogICAgICAgICAgICAgICAgKyAnPC9kaXY+JwogICAgICAgICAgICAgICAgKyAnPGRpdiBjbGFzcz0iZGctZ3JvdXAtYm9keSI+JwogICAgICAgICAgICAgICAgKyAnPGRpdiBjbGFzcz0iZGctY2FyZC1yb3cgZGctY2FyZC1yb3ctY29tbWFuZGVyIj4nCiAgICAgICAgICAgICAgICArICc8c3BhbiBjbGFzcz0iZGctY2FyZC1yb3ctbmFtZSIgc3R5bGU9ImZvbnQtd2VpZ2h0OjYwMDtjb2xvcjojZmZmIj4nICsgZXNjSHRtbChjb21tYW5kZXIubmFtZSkgKyAnPC9zcGFuPicKICAgICAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1jYXJkLXJvdy1zb3VyY2UgZGctc3JjLWNvbGxlY3Rpb24iPkNvbW1hbmRlcjwvc3Bhbj4nCiAgICAgICAgICAgICAgICArICc8L2Rpdj4nCiAgICAgICAgICAgICAgICArICc8L2Rpdj48L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FyZCBncm91cHMKICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2Ygc29ydGVkVHlwZXMpIHsKICAgICAgICAgICAgY29uc3QgZ3JvdXBDYXJkcyA9IGdyb3Vwc1t0eXBlXTsKICAgICAgICAgICAgaWYgKCFncm91cENhcmRzIHx8IGdyb3VwQ2FyZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTsKCiAgICAgICAgICAgIGdyb3VwQ2FyZHMuc29ydCgoYSwgYikgPT4gKGEubmFtZSB8fCAnJykubG9jYWxlQ29tcGFyZShiLm5hbWUgfHwgJycpKTsKCiAgICAgICAgICAgIGNvbnN0IGljb24gPSBUWVBFX0lDT05TW3R5cGVdIHx8ICfwn4OPJzsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGctY2FyZC1ncm91cCI+JwogICAgICAgICAgICAgICAgKyAnPGRpdiBjbGFzcz0iZGctZ3JvdXAtaGVhZGVyIiBkYXRhLXR5cGU9IicgKyB0eXBlICsgJyI+JwogICAgICAgICAgICAgICAgKyAnPHNwYW4gY2xhc3M9ImRnLWdyb3VwLXRpdGxlIj4nICsgaWNvbiArICcgJyArIGVzY0h0bWwodHlwZSkgKyAnPC9zcGFuPicKICAgICAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1ncm91cC1jb3VudCI+JyArIGdyb3VwQ2FyZHMubGVuZ3RoICsgJzwvc3Bhbj4nCiAgICAgICAgICAgICAgICArICc8L2Rpdj4nCiAgICAgICAgICAgICAgICArICc8ZGl2IGNsYXNzPSJkZy1ncm91cC1ib2R5IiBkYXRhLWdyb3VwPSInICsgdHlwZSArICciPic7CgogICAgICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2YgZ3JvdXBDYXJkcykgewogICAgICAgICAgICAgICAgaHRtbCArPSByZW5kZXJDYXJkUm93KGNhcmQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7CgogICAgICAgIC8vIENvbGxhcHNlIHRvZ2dsZXMKICAgICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmRnLWdyb3VwLWhlYWRlcicpLmZvckVhY2goaGVhZGVyID0+IHsKICAgICAgICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGhlYWRlci5kYXRhc2V0LnR5cGU7CiAgICAgICAgICAgICAgICBpZiAoIXR5cGUpIHJldHVybjsKICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLmRnLWdyb3VwLWJvZHlbZGF0YS1ncm91cD0iJyArIHR5cGUgKyAnIl0nKTsKICAgICAgICAgICAgICAgIGlmIChib2R5KSBib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICB9KTsK' +
'ICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJDYXJkUm93KGNhcmQpIHsKICAgICAgICBjb25zdCBzdGF0dXNJbmZvID0gU1RBVFVTX0JBREdFU1tjYXJkLnN0YXR1c10gfHwgU1RBVFVTX0JBREdFUy5taXNzaW5nOwogICAgICAgIGNvbnN0IHN0YXR1c0JhZGdlID0gJzxzcGFuIGNsYXNzPSJkZy1jYXJkLXN0YXR1cyAnICsgc3RhdHVzSW5mby5jbHMgKyAnIj4nICsgc3RhdHVzSW5mby5sYWJlbCArICc8L3NwYW4+JzsKCiAgICAgICAgY29uc3Qgcm9sZVRhZ3MgPSAoY2FyZC5yb2xlX3RhZ3MgfHwgW10pLnNsaWNlKDAsIDMpCiAgICAgICAgICAgIC5tYXAociA9PiAnPHNwYW4gY2xhc3M9ImRnLXJvbGUtY2hpcCI+JyArIGVzY0h0bWwocikgKyAnPC9zcGFuPicpCiAgICAgICAgICAgIC5qb2luKCcnKTsKCiAgICAgICAgLy8gU3Vic3RpdHV0aW9uIGluZGljYXRvcgogICAgICAgIGxldCBzdWJIdG1sID0gJyc7CiAgICAgICAgaWYgKGNhcmQuc3RhdHVzID09PSAnc3Vic3RpdHV0ZWQnICYmIGNhcmQuc2VsZWN0ZWRfc3Vic3RpdHV0ZSkgewogICAgICAgICAgICBzdWJIdG1sID0gJzxkaXYgY2xhc3M9ImRnLWNhcmQtc3ViLWxpbmUiPicKICAgICAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1zdWItYXJyb3ciPuKGkjwvc3Bhbj4gJwogICAgICAgICAgICAgICAgKyAnPHNwYW4gY2xhc3M9ImRnLXN1Yi1uYW1lIj4nICsgZXNjSHRtbChjYXJkLnNlbGVjdGVkX3N1YnN0aXR1dGUpICsgJzwvc3Bhbj4nCiAgICAgICAgICAgICAgICArICc8L2Rpdj4nOwogICAgICAgIH0gZWxzZSBpZiAoY2FyZC5zdGF0dXMgPT09ICdtaXNzaW5nJyAmJiBjYXJkLmFsdGVybmF0aXZlcyAmJiBjYXJkLmFsdGVybmF0aXZlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHN1Ykh0bWwgPSAnPGRpdiBjbGFzcz0iZGctY2FyZC1zdWItbGluZSBkZy1zdWItc3VnZ2VzdGlvbnMiPicKICAgICAgICAgICAgICAgICsgJzxzcGFuIGNsYXNzPSJkZy1zdWItbGFiZWwiPkFsdGVybmF0aXZlczo8L3NwYW4+ICcKICAgICAgICAgICAgICAgICsgY2FyZC5hbHRlcm5hdGl2ZXMuc2xpY2UoMCwgMykubWFwKGEgPT4KICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9ImRnLWFsdC1jaGlwIiB0aXRsZT0iJyArIGVzY0F0dHIoYS5yZWFzb24gfHwgJycpICsgJyI+JwogICAgICAgICAgICAgICAgICAgICsgZXNjSHRtbChhLm5hbWUpICsgJyAoJyArIChhLnNpbWlsYXJpdHlfc2NvcmUgKiAxMDApLnRvRml4ZWQoMCkgKyAnJSknCiAgICAgICAgICAgICAgICAgICAgKyAnPC9zcGFuPicKICAgICAgICAgICAgICAgICkuam9pbignJykKICAgICAgICAgICAgICAgICsgJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBwcmljZSA9IGNhcmQuZXN0aW1hdGVkX3ByaWNlX3VzZAogICAgICAgICAgICA/ICc8c3BhbiBjbGFzcz0iZGctY2FyZC1wcmljZSI+JCcgKyBjYXJkLmVzdGltYXRlZF9wcmljZV91c2QudG9GaXhlZCgyKSArICc8L3NwYW4+JwogICAgICAgICAgICA6ICcnOwoKICAgICAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImRnLWNhcmQtcm93IGRnLWNhcmQtc3RhdHVzLScgKyBjYXJkLnN0YXR1cyArICciPicKICAgICAgICAgICAgKyAnPGRpdiBjbGFzcz0iZGctY2FyZC1yb3ctbWFpbiI+JwogICAgICAgICAgICArICc8c3BhbiBjbGFzcz0iZGctY2FyZC1yb3ctbmFtZSI+JyArIGVzY0h0bWwoY2FyZC5uYW1lKSArICc8L3NwYW4+JwogICAgICAgICAgICArICc8c3BhbiBjbGFzcz0iZGctY2FyZC1yb3ctcm9sZXMiPicgKyByb2xlVGFncyArICc8L3NwYW4+JwogICAgICAgICAgICArIHN0YXR1c0JhZGdlCiAgICAgICAgICAgICsgcHJpY2UKICAgICAgICAgICAgKyAnPC9kaXY+JwogICAgICAgICAgICArIChjYXJkLnJlYXNvbiA/ICc8ZGl2IGNsYXNzPSJkZy1jYXJkLXJlYXNvbiI+JyArIGVzY0h0bWwoY2FyZC5yZWFzb24pICsgJzwvZGl2PicgOiAnJykKICAgICAgICAgICAgKyBzdWJIdG1sCiAgICAgICAgICAgICsgJzwvZGl2Pic7CiAgICB9CgogICAgLy8g4pSA4pSAIENvbW1pdCBEZWNrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgYXN5bmMgZnVuY3Rpb24gY29tbWl0RGVjaygpIHsKICAgICAgICBpZiAoIXN0YXRlLmNvbW1hbmRlcikgeyB0b2FzdCgnTm8g' +
'Y29tbWFuZGVyIHNlbGVjdGVkJywgJ2Vycm9yJyk7IHJldHVybjsgfQoKICAgICAgICAkKCdkZy1zYXZlLWJ0bicpLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAkKCdkZy1zYXZlLWJ0bicpLnRleHRDb250ZW50ID0gJ1NhdmluZy4uLic7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBzdGF0ZS5sYXN0UmVxdWVzdEJvZHkgfHwgYnVpbGRSZXF1ZXN0Qm9keSgpOwogICAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goQVBJX0JBU0UgKyAnL2FwaS9kZWNrL3YzL2NvbW1pdCcsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoIXJlc3Aub2spIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5lcnJvciB8fCBlcnIuZGV0YWlsIHx8ICdTYXZlIGZhaWxlZCcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwLmpzb24oKTsKICAgICAgICAgICAgdG9hc3QoJ0RlY2sgc2F2ZWQ6ICcgKyAocmVzdWx0LmRlY2tfbmFtZSB8fCAnVW5rbm93bicpLCAnc3VjY2VzcycpOwoKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICdkZWNrYnVpbGRlci5odG1sP2RlY2tfaWQ9JyArIHJlc3VsdC5kZWNrX2lkOwogICAgICAgICAgICB9LCAxMjAwKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRvYXN0KGUubWVzc2FnZSB8fCAnU2F2ZSBmYWlsZWQnLCAnZXJyb3InKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAkKCdkZy1zYXZlLWJ0bicpLmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgICQoJ2RnLXNhdmUtYnRuJykuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJkZy1idG4taWNvbiI+8J+Svjwvc3Bhbj4gU2F2ZSB0byBEZWNrIEJ1aWxkZXInOwogICAgICAgIH0KICAgIH0KCiAgICAvLyDilIDilIAgRXhwb3J0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGFzeW5jIGZ1bmN0aW9uIGV4cG9ydERlY2soZm9ybWF0KSB7CiAgICAgICAgaWYgKCFzdGF0ZS5jb21tYW5kZXIpIHsgdG9hc3QoJ0dlbmVyYXRlIGEgZGVjayBmaXJzdCcsICdlcnJvcicpOyByZXR1cm47IH0KCiAgICAgICAgY29uc3QgYm9keSA9IHN0YXRlLmxhc3RSZXF1ZXN0Qm9keSB8fCBidWlsZFJlcXVlc3RCb2R5KCk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChBUElfQkFTRSArICcvYXBpL2RlY2svdjMvZXhwb3J0LycgKyBmb3JtYXQsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignRXhwb3J0IGZhaWxlZCcpOwoKICAgICAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3AuYmxvYigpOwogICAgICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICBhLmhyZWYgPSB1cmw7CiAgICAgICAgICAgIGEuZG93bmxvYWQgPSAoc3RhdGUuY29tbWFuZGVyLm5hbWUgfHwgJ2RlY2snKS5yZXBsYWNlKC9ccysvZywgJ18nKSArICcuJyArIChmb3JtYXQgPT09ICdjc3YnID8gJ2NzdicgOiAnZGNrJyk7CiAgICAgICAgICAgIGEuY2xpY2soKTsKICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwoKICAgICAgICAgICAgdG9hc3QoJ0V4cG9ydGVkICcgKyBmb3JtYXQudG9VcHBlckNhc2UoKSwgJ3N1Y2Nlc3Mn' +
'KTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRvYXN0KGUubWVzc2FnZSB8fCAnRXhwb3J0IGZhaWxlZCcsICdlcnJvcicpOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBleHBvcnRNb3hmaWVsZCgpIHsKICAgICAgICBpZiAoIXN0YXRlLmNvbW1hbmRlcikgeyB0b2FzdCgnR2VuZXJhdGUgYSBkZWNrIGZpcnN0JywgJ2Vycm9yJyk7IHJldHVybjsgfQoKICAgICAgICBjb25zdCBib2R5ID0gc3RhdGUubGFzdFJlcXVlc3RCb2R5IHx8IGJ1aWxkUmVxdWVzdEJvZHkoKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKEFQSV9CQVNFICsgJy9hcGkvZGVjay92My9leHBvcnQvbW94ZmllbGQnLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpOwogICAgICAgICAgICBpZiAoZGF0YS5jb250ZW50KSB7CiAgICAgICAgICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChkYXRhLmNvbnRlbnQpOwogICAgICAgICAgICAgICAgdG9hc3QoJ01veGZpZWxkIGRlY2sgY29waWVkIHRvIGNsaXBib2FyZCcsICdzdWNjZXNzJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRvYXN0KCdNb3hmaWVsZCBleHBvcnQgZmFpbGVkJywgJ2Vycm9yJyk7CiAgICAgICAgfQogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGV4cG9ydFNob3BwaW5nKCkgewogICAgICAgIGlmICghc3RhdGUuY29tbWFuZGVyKSB7IHRvYXN0KCdHZW5lcmF0ZSBhIGRlY2sgZmlyc3QnLCAnZXJyb3InKTsgcmV0dXJuOyB9CgogICAgICAgIGNvbnN0IGJvZHkgPSBzdGF0ZS5sYXN0UmVxdWVzdEJvZHkgfHwgYnVpbGRSZXF1ZXN0Qm9keSgpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goQVBJX0JBU0UgKyAnL2FwaS9kZWNrL3YzL2V4cG9ydC9zaG9wcGluZycsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSwKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7CiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhLnNob3BwaW5nX2xpc3QgfHwgW107CgogICAgICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHRvYXN0KCdBbGwgY2FyZHMgYXJlIG93bmVkIOKAlCBub3RoaW5nIHRvIGJ1eScsICdzdWNjZXNzJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEJ1aWxkIGFuZCBjb3B5IHRleHQKICAgICAgICAgICAgY29uc3QgbGluZXMgPSBbJ1Nob3BwaW5nIExpc3Qg4oCUICcgKyAoZGF0YS5jb21tYW5kZXIgfHwgJ0RlY2snKSwgJyddOwogICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdCkgewogICAgICAgICAgICAgICAgbGluZXMucHVzaChpdGVtLmNvdW50ICsgJ3ggJyArIGl0ZW0ubmFtZSArICcgKCQnICsgKGl0ZW0uZXN0aW1hdGVkX3ByaWNlX3VzZCB8fCAwKS50b0ZpeGVkKDIpICsgJykg4oCUICcgKyBpdGVtLmNhdGVnb3J5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsaW5lcy5wdXNoKCcnLCAnVG90YWw6ICcgKyBsaXN0Lmxlbmd0aCArICcgY2FyZHMsIH4kJyArIChkYXRhLmVzdGltYXRlZF9jb3N0X3VzZCB8fCAwKS50b0ZpeGVkKDIpKTsKCiAgICAgICAgICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGxpbmVzLmpvaW4oJ1xuJykpOwogICAgICAgICAgICB0b2FzdCgnU2hvcHBpbmcgbGlzdCBjb3BpZWQgKCcgKyBsaXN0Lmxlbmd0aCArICcgY2FyZHMsIH4kJyArIChkYXRhLmVzdGltYXRlZF9jb3N0X3VzZCB8fCAwKS50b0ZpeGVkKDApICsgJyknLCAnc3VjY2VzcycpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgdG9hc3QoJ1Nob3BwaW5nIGxpc3QgZmFpbGVkJywgJ2Vycm9y' +
'Jyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBUb2FzdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKICAgIGZ1bmN0aW9uIHRvYXN0KG1zZywgdHlwZSkgewogICAgICAgIHR5cGUgPSB0eXBlIHx8ICdpbmZvJzsKICAgICAgICBjb25zdCBjb250YWluZXIgPSAkKCdkZy10b2FzdC1jb250YWluZXInKTsKICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGVsLmNsYXNzTmFtZSA9ICdkZy10b2FzdCBkZy10b2FzdC0nICsgdHlwZTsKICAgICAgICBlbC50ZXh0Q29udGVudCA9IG1zZzsKICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZWwucmVtb3ZlKCksIDQwMDApOwogICAgfQoKICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgZnVuY3Rpb24gZXNjSHRtbChzdHIpIHsKICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7CiAgICAgICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7CiAgICB9CgogICAgZnVuY3Rpb24gZXNjQXR0cihzdHIpIHsKICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyIvZywgJyZxdW90OycpLnJlcGxhY2UoLycvZywgJyYjMzk7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KCiAgICByZXR1cm4geyBpbml0IH07Cn0pKCk7Cgpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gewogICAgRGVja0dlbmVyYXRvci5pbml0KCk7Cn0pOwo='
Install-B64 -R 'ui\deckgenerator.js' -B $b
# ui/global.css (19,833 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIEdsb2JhbCBEZXNpZ24gU3lzdGVtCiAgIERhcmsgJiBQb2xpc2hlZCDCtyBQcmVtaXVtIERhc2hib2FyZCBBZXN0aGV0aWMKICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgovKiDilIDilIAgUmVzZXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCiosICo6OmJlZm9yZSwgKjo6YWZ0ZXIgeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IH0KCi8qIOKUgOKUgCBEZXNpZ24gVG9rZW5zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwo6cm9vdCB7CiAgICAvKiBTdXJmYWNlcyDigJQgbGF5ZXJlZCBkYXJrIHdpdGggc3VidGxlIHdhcm10aCAqLwogICAgLS1iZzogICAgICAgICAgICAjMGMwZTE0OwogICAgLS1zdXJmYWNlLTA6ICAgICAjMTIxNDFjOwogICAgLS1zdXJmYWNlLTE6ICAgICAjMTcxYTI0OwogICAgLS1zdXJmYWNlLTI6ICAgICAjMWMxZjJiOwogICAgLS1zdXJmYWNlLTM6ICAgICAjMjIyNTMzOwogICAgLS1zdXJmYWNlLWhvdmVyOiAjMjUyODM5OwoKICAgIC8qIEJvcmRlcnMgKi8KICAgIC0tYm9yZGVyOiAgICAgICAgIzJhMmQzYTsKICAgIC0tYm9yZGVyLXN1YnRsZTogIzFlMjEzMDsKICAgIC0tYm9yZGVyLWZvY3VzOiAgIzRhNmZhNTsKCiAgICAvKiBUZXh0ICovCiAgICAtLXRleHQ6ICAgICAgICAgICNlMWU0ZWI7CiAgICAtLXRleHQtc2Vjb25kYXJ5OiM4YjkwYTA7CiAgICAtLXRleHQtdGVydGlhcnk6ICM1YzYwNzA7CiAgICAtLXRleHQtaW52ZXJzZTogICMwYzBlMTQ7CgogICAgLyogQWNjZW50IOKAlCBjb29sIGJsdWUgd2l0aCBzdWJ0bGUgZGVwdGggKi8KICAgIC0tYWNjZW50OiAgICAgICAgIzViOWVmMDsKICAgIC0tYWNjZW50LWhvdmVyOiAgIzdhYjRmZjsKICAgIC0tYWNjZW50LWRpbTogICAgcmdiYSg5MSwgMTU4LCAyNDAsIDAuMTIpOwogICAgLS1hY2NlbnQtZ2xvdzogICByZ2JhKDkxLCAxNTgsIDI0MCwgMC4yNSk7CgogICAgLyogU2VtYW50aWMgKi8KICAgIC0tc3VjY2VzczogICAgICAgIzRhZGU4MDsKICAgIC0tc3VjY2Vzcy1kaW06ICAgcmdiYSg3NCwgMjIyLCAxMjgsIDAuMTIpOwogICAgLS13YXJuaW5nOiAgICAgICAjZmJiZjI0OwogICAgLS13YXJuaW5nLWRpbTogICByZ2JhKDI1MSwgMTkxLCAzNiwgMC4xMik7CiAgICAtLWVycm9yOiAgICAgICAgICNmODcxNzE7CiAgICAtLWVycm9yLWRpbTogICAgIHJnYmEoMjQ4LCAxMTMsIDExMywgMC4xMik7CiAgICAtLXB1cnBsZTogICAgICAgICNhNzhiZmE7CiAgICAtLXB1cnBsZS1kaW06ICAgIHJnYmEoMTY3LCAxMzksIDI1MCwgMC4xMik7CiAgICAtLWdvbGQ6ICAgICAgICAgICNmY2QzNGQ7CgogICAgLyogUmFkaXVzICovCiAgICAtLXJhZGl1cy1zbTogICAgIDZweDsKICAgIC0tcmFkaXVzLW1kOiAgICAgMTBweDsKICAgIC0tcmFkaXVzLWxnOiAgICAgMTRweDsKICAgIC0tcmFkaXVzLXhsOiAgICAgMjBweDsKCiAgICAvKiBTaGFkb3dzICovCiAgICAtLXNoYWRvdy1zbTogICAgIDAgMXB4IDNweCByZ2JhKDAsMCwwLDAuMyk7CiAgICAtLXNoYWRvdy1tZDogICAgIDAgNHB4IDE2cHggcmdiYSgwLDAsMCwwLjM1KTsKICAgIC0tc2hhZG93LWxnOiAgICAgMCAxMnB4IDQwcHggcmdiYSgwLDAsMCwwLjQ1KTsKICAgIC0tc2hhZG93LWdsb3c6ICAgMCAwIDIwcHggdmFyKC0tYWNjZW50LWRpbSk7CgogICAgLyog' +
'VHJhbnNpdGlvbnMgKi8KICAgIC0tZWFzZTogICAgICAgICAgY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7CiAgICAtLWR1cmF0aW9uOiAgICAgIDE4MG1zOwoKICAgIC8qIFR5cG9ncmFwaHkgKi8KICAgIC0tZm9udDogICAgICAgICAgJ0ludGVyJywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOwogICAgLS1mb250LW1vbm86ICAgICAnSmV0QnJhaW5zIE1vbm8nLCAnRmlyYSBDb2RlJywgJ0Nhc2NhZGlhIENvZGUnLCBtb25vc3BhY2U7CgogICAgLyogU3BhY2luZyBzY2FsZSAqLwogICAgLS1zcC0xOiA0cHg7ICAtLXNwLTI6IDhweDsgIC0tc3AtMzogMTJweDsKICAgIC0tc3AtNDogMTZweDsgLS1zcC01OiAyMHB4OyAtLXNwLTY6IDI0cHg7CiAgICAtLXNwLTg6IDMycHg7IC0tc3AtMTA6IDQwcHg7IC0tc3AtMTI6IDQ4cHg7CiAgICAtLXNwLTE2OiA2NHB4OwoKICAgIC8qIExheW91dCAqLwogICAgLS1jb250ZW50LW1heDogICAxMjgwcHg7CiAgICAtLXNpZGViYXItd2lkdGg6IDI4MHB4OwogICAgLS1uYXYtaGVpZ2h0OiAgICA1NnB4Owp9CgovKiDilIDilIAgQmFzZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KaHRtbCB7CiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogICAgc2Nyb2xsLWJlaGF2aW9yOiBzbW9vdGg7Cn0KCmJvZHkgewogICAgbWluLWhlaWdodDogMTAwdmg7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udCk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBsaW5lLWhlaWdodDogMS42OwogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwp9CgpoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKICAgIGNvbG9yOiAjZmZmOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiAxLjI1Owp9CgpoMSB7IGZvbnQtc2l6ZTogMjRweDsgfQpoMiB7IGZvbnQtc2l6ZTogMThweDsgfQpoMyB7IGZvbnQtc2l6ZTogMTZweDsgfQoKYSB7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHRyYW5zaXRpb246IGNvbG9yIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsgfQphOmhvdmVyIHsgY29sb3I6IHZhcigtLWFjY2VudC1ob3Zlcik7IH0KCmltZywgc3ZnIHsgZGlzcGxheTogYmxvY2s7IG1heC13aWR0aDogMTAwJTsgfQpidXR0b24geyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQ6IGluaGVyaXQ7IH0KaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEgeyBmb250OiBpbmhlcml0OyBjb2xvcjogaW5oZXJpdDsgfQp0YWJsZSB7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlOyB9Cgo6OnNlbGVjdGlvbiB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIGNvbG9yOiAjZmZmOwp9Cgo6Zm9jdXMtdmlzaWJsZSB7CiAgICBvdXRsaW5lOiAycHggc29saWQgdmFyKC0tYWNjZW50KTsKICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwp9CgovKiDilIDilIAgU2Nyb2xsYmFyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwo6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgd2lkdGg6IDhweDsgaGVpZ2h0OiA4cHg7IH0KOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyB9Cjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IH0KOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLXRleHQtdGVydGlhcnkpOyB9CgovKiDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi' +
'lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLm5hdiB7CiAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgdG9wOiAwOwogICAgei1pbmRleDogMTAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBoZWlnaHQ6IHZhcigtLW5hdi1oZWlnaHQpOwogICAgcGFkZGluZzogMCB2YXIoLS1zcC02KTsKICAgIGJhY2tncm91bmQ6IHJnYmEoMTIsIDE0LCAyMCwgMC44NSk7CiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTZweCkgc2F0dXJhdGUoMS41KTsKICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDE2cHgpIHNhdHVyYXRlKDEuNSk7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLXN1YnRsZSk7Cn0KCi5uYXYtYnJhbmQgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgZm9udC1zaXplOiAxNXB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1zcC04KTsKfQoKLm5hdi1icmFuZCBzdmcgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLm5hdi1saW5rcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMSk7CiAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOwp9CgoubmF2LWxpbmtzOjotd2Via2l0LXNjcm9sbGJhciB7IGRpc3BsYXk6IG5vbmU7IH0KCi5uYXYtbGlua3MgYSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogdmFyKC0tc3AtMik7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9CgoubmF2LWxpbmtzIGE6aG92ZXIgewogICAgY29sb3I6IHZhcigtLXRleHQpOwogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTsKfQoKLm5hdi1saW5rcyBhLmFjdGl2ZSB7CiAgICBjb2xvcjogI2ZmZjsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1kaW0pOwp9CgoubmF2LWxpbmtzIGEgLm5hdi1pY29uIHsKICAgIHdpZHRoOiAxNnB4OwogICAgaGVpZ2h0OiAxNnB4OwogICAgb3BhY2l0eTogMC43Owp9CgoubmF2LWxpbmtzIGEuYWN0aXZlIC5uYXYtaWNvbiwKLm5hdi1saW5rcyBhOmhvdmVyIC5uYXYtaWNvbiB7CiAgICBvcGFjaXR5OiAxOwp9CgovKiDilIDilIAgUGFnZSBMYXlvdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5wYWdlIHsKICAgIG1heC13aWR0aDogdmFyKC0tY29udGVudC1tYXgpOwogICAgbWFyZ2luOiAwIGF1dG87CiAgICBwYWRkaW5nOiB2YXIoLS1zcC04KSB2YXIoLS1zcC02KTsKfQoKLnBhZ2UtaGVhZGVyIHsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTgpOwp9CgoucGFnZS1oZWFkZXIgaDEgewogICAgZm9udC1zaXplOiAyOHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMmVtOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMik7Cn0KCi5wYWdlLWhlYWRlciBwIHsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDE1cHg7Cn0KCi8qIOKUgOKUgCBDYXJkcyAvIFBhbmVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLnBhbmVsIHsKICAgIGJhY2tncm91bmQ6IHZh' +
'cigtLXN1cmZhY2UtMSk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTYpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNik7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgoucGFuZWw6aG92ZXIgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXItZm9jdXMpOwp9CgoucGFuZWwtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNSk7Cn0KCi5wYW5lbC1oZWFkZXIgaDIgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLnBhbmVsLWhlYWRlciAuYmFkZ2UgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHBhZGRpbmc6IDNweCAxMHB4OwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgovKiDilIDilIAgU3RhdCBDYXJkcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLnN0YXQtZ3JpZCB7CiAgICBkaXNwbGF5OiBncmlkOwogICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMDBweCwgMWZyKSk7CiAgICBnYXA6IHZhcigtLXNwLTQpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNik7Cn0KCi5zdGF0LWNhcmQgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0xKTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtNSk7CiAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9Cgouc3RhdC1jYXJkOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWZvY3VzKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1tZCk7Cn0KCi5zdGF0LWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLnN0YXQtdmFsdWUgewogICAgZm9udC1zaXplOiAyOHB4OwogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgbGluZS1oZWlnaHQ6IDEuMTsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5zdGF0LXN1YiB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC10ZXJ0aWFyeSk7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0xKTsKfQoKLyog4pSA4pSAIEJ1dHRvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5idG4gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgcGFkZGluZzogOHB4IDE4cHg7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGJvcmRlcjogbm9uZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgbGluZS1oZWlnaHQ6IDEuNDsKfQoKLmJ0bi1wcmltYXJ5IHsKICAgIGJhY2tncm91bmQ6IHZh' +
'cigtLWFjY2VudCk7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1pbnZlcnNlKTsKfQoKLmJ0bi1wcmltYXJ5OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudC1ob3Zlcik7CiAgICBib3gtc2hhZG93OiAwIDRweCAxNHB4IHZhcigtLWFjY2VudC1nbG93KTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKfQoKLmJ0bi1wcmltYXJ5OmFjdGl2ZSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7Cn0KCi5idG4tcHJpbWFyeTpkaXNhYmxlZCB7CiAgICBvcGFjaXR5OiAwLjQ7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgdHJhbnNmb3JtOiBub25lOwogICAgYm94LXNoYWRvdzogbm9uZTsKfQoKLmJ0bi1zZWNvbmRhcnkgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0zKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Cn0KCi5idG4tc2Vjb25kYXJ5OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtaG92ZXIpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS10ZXh0LXRlcnRpYXJ5KTsKfQoKLmJ0bi1naG9zdCB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBwYWRkaW5nOiA2cHggMTJweDsKfQoKLmJ0bi1naG9zdDpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTIpOwp9CgouYnRuLXN1Y2Nlc3MgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzKTsgY29sb3I6IHZhcigtLXRleHQtaW52ZXJzZSk7IH0KLmJ0bi1zdWNjZXNzOmhvdmVyIHsgYm94LXNoYWRvdzogMCA0cHggMTRweCB2YXIoLS1zdWNjZXNzLWRpbSk7IH0KCi5idG4tcHVycGxlIHsgYmFja2dyb3VuZDogdmFyKC0tcHVycGxlKTsgY29sb3I6IHZhcigtLXRleHQtaW52ZXJzZSk7IH0KLmJ0bi1wdXJwbGU6aG92ZXIgeyBib3gtc2hhZG93OiAwIDRweCAxNHB4IHZhcigtLXB1cnBsZS1kaW0pOyB9CgouYnRuLWRhbmdlciB7IGJhY2tncm91bmQ6IHZhcigtLWVycm9yKTsgY29sb3I6ICNmZmY7IH0KLmJ0bi1kYW5nZXI6aG92ZXIgeyBib3gtc2hhZG93OiAwIDRweCAxNHB4IHZhcigtLWVycm9yLWRpbSk7IH0KCi5idG4tc20geyBwYWRkaW5nOiA1cHggMTJweDsgZm9udC1zaXplOiAxMnB4OyB9Ci5idG4tbGcgeyBwYWRkaW5nOiAxMnB4IDI0cHg7IGZvbnQtc2l6ZTogMTVweDsgfQouYnRuLWljb24tb25seSB7IHBhZGRpbmc6IDhweDsgd2lkdGg6IDM2cHg7IGhlaWdodDogMzZweDsgfQoKLyog4pSA4pSAIEZvcm1zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZm9ybS1ncm91cCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogdmFyKC0tc3AtMik7Cn0KCi5mb3JtLWxhYmVsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07Cn0KCi5mb3JtLWlucHV0LAouZm9ybS1zZWxlY3QsCi5mb3JtLXRleHRhcmVhIHsKICAgIHdpZHRoOiAxMDAlOwogICAgcGFkZGluZzogOXB4IDE0cHg7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwp9CgouZm9ybS1pbnB1dDpmb2N1cywKLmZvcm0tc2VsZWN0OmZvY3VzLAouZm9ybS10ZXh0YXJlYTpmb2N1cyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tYWNjZW50LWRpbSk7CiAgICBvdXRsaW5lOiBub25lOwp9CgouZm9ybS1pbnB1dDo6cGxhY2Vob2xkZXIsCi5mb3JtLXRleHRhcmVhOjpwbGFjZWhvbGRlciB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC10ZXJ0aWFy' +
'eSk7Cn0KCi5mb3JtLXNlbGVjdCB7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBhcHBlYXJhbmNlOiBub25lOwogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgd2lkdGg9JzEyJyBoZWlnaHQ9JzEyJyB2aWV3Qm94PScwIDAgMjQgMjQnIGZpbGw9J25vbmUnIHN0cm9rZT0nJTIzNWM2MDcwJyBzdHJva2Utd2lkdGg9JzInJTNFJTNDcGF0aCBkPSdNNiA5bDYgNiA2LTYnLyUzRSUzQy9zdmclM0UiKTsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCAxMnB4IGNlbnRlcjsKICAgIHBhZGRpbmctcmlnaHQ6IDM2cHg7Cn0KCi5mb3JtLXRleHRhcmVhIHsKICAgIHJlc2l6ZTogdmVydGljYWw7CiAgICBtaW4taGVpZ2h0OiAxMDBweDsKfQoKLmZvcm0tY2hlY2tib3ggewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLmZvcm0tY2hlY2tib3ggaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGFjY2VudC1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLmZvcm0tcm93IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE2MHB4LCAxZnIpKTsKICAgIGdhcDogdmFyKC0tc3AtNCk7Cn0KCi8qIOKUgOKUgCBQcm9ncmVzcyBCYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5wcm9ncmVzcy1jb250YWluZXIgewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtNCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC00KTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLXN1YnRsZSk7Cn0KCi5wcm9ncmVzcy1oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMyk7Cn0KCi5wcm9ncmVzcy1sYWJlbCB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6IHZhcigtLXRleHQpOwp9CgoucHJvZ3Jlc3MtdHJhY2sgewogICAgaGVpZ2h0OiA2cHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTMpOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnByb2dyZXNzLWZpbGwgewogICAgaGVpZ2h0OiAxMDAlOwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1hY2NlbnQpLCB2YXIoLS1hY2NlbnQtaG92ZXIpKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIHRyYW5zaXRpb246IHdpZHRoIDAuM3MgdmFyKC0tZWFzZSk7Cn0KCi5wcm9ncmVzcy1kZXRhaWwgewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtMik7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXRlcnRpYXJ5KTsKICAgIGxpbmUtaGVpZ2h0OiAxLjY7Cn0KCi8qIOKUgOKUgCBQaGFzZSBCYWRnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmJhZGdlLXN0YXR1cyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBwYWRkaW5nOiAzcHggMTBweDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNl' +
'OwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKfQoKLmJhZGdlLXN0YXR1czo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgd2lkdGg6IDZweDsKICAgIGhlaWdodDogNnB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5iYWRnZS1pZGxlIHsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0zKTsgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsgfQouYmFkZ2UtaWRsZTo6YmVmb3JlIHsgYmFja2dyb3VuZDogdmFyKC0tdGV4dC10ZXJ0aWFyeSk7IH0KCi5iYWRnZS1ydW5uaW5nIHsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9Ci5iYWRnZS1ydW5uaW5nOjpiZWZvcmUgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQpOyBhbmltYXRpb246IHB1bHNlLWRvdCAxLjVzIGVhc2UtaW4tb3V0IGluZmluaXRlOyB9CgouYmFkZ2Utc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MtZGltKTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyB9Ci5iYWRnZS1zdWNjZXNzOjpiZWZvcmUgeyBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzKTsgfQoKLmJhZGdlLWVycm9yIHsgYmFja2dyb3VuZDogdmFyKC0tZXJyb3ItZGltKTsgY29sb3I6IHZhcigtLWVycm9yKTsgfQouYmFkZ2UtZXJyb3I6OmJlZm9yZSB7IGJhY2tncm91bmQ6IHZhcigtLWVycm9yKTsgfQoKLmJhZGdlLXdhcm5pbmcgeyBiYWNrZ3JvdW5kOiB2YXIoLS13YXJuaW5nLWRpbSk7IGNvbG9yOiB2YXIoLS13YXJuaW5nKTsgfQouYmFkZ2Utd2FybmluZzo6YmVmb3JlIHsgYmFja2dyb3VuZDogdmFyKC0td2FybmluZyk7IH0KCkBrZXlmcmFtZXMgcHVsc2UtZG90IHsKICAgIDAlLCAxMDAlIHsgb3BhY2l0eTogMTsgfQogICAgNTAlIHsgb3BhY2l0eTogMC40OyB9Cn0KCi8qIOKUgOKUgCBFbXB0eSBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmVtcHR5LXN0YXRlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgcGFkZGluZzogdmFyKC0tc3AtMTIpIHZhcigtLXNwLTYpOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLXRleHQtdGVydGlhcnkpOwp9CgouZW1wdHktc3RhdGUgc3ZnIHsKICAgIHdpZHRoOiA0OHB4OwogICAgaGVpZ2h0OiA0OHB4OwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNCk7CiAgICBvcGFjaXR5OiAwLjM7Cn0KCi5lbXB0eS1zdGF0ZSBwIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTMpOwp9CgovKiDilIDilIAgVGFibGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGF0YS10YWJsZSB7CiAgICB3aWR0aDogMTAwJTsKICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5kYXRhLXRhYmxlIHRoZWFkIHRoIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC00KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMCk7Cn0KCi5kYXRhLXRhYmxlIHRib2R5IHRkIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTMpIHZhcigtLXNwLTQpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1zdWJ0bGUpOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLmRhdGEtdGFibGUgdGJvZHkgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTsKfQoKLmRhdGEtdGFibGUgdGJvZHkgdHI6' +
'bGFzdC1jaGlsZCB0ZCB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9CgovKiDilIDilIAgVGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLnRhZyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGFnLWJsdWUgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsgY29sb3I6IHZhcigtLWFjY2VudCk7IH0KLnRhZy1ncmVlbiAgIHsgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcy1kaW0pOyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IH0KLnRhZy15ZWxsb3cgIHsgYmFja2dyb3VuZDogdmFyKC0td2FybmluZy1kaW0pOyBjb2xvcjogdmFyKC0td2FybmluZyk7IH0KLnRhZy1yZWQgICAgIHsgYmFja2dyb3VuZDogdmFyKC0tZXJyb3ItZGltKTsgY29sb3I6IHZhcigtLWVycm9yKTsgfQoudGFnLXB1cnBsZSAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1wdXJwbGUtZGltKTsgY29sb3I6IHZhcigtLXB1cnBsZSk7IH0KCi8qIOKUgOKUgCBUb2FzdCAvIE5vdGlmaWNhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLnRvYXN0IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIGJvdHRvbTogdmFyKC0tc3AtNik7CiAgICByaWdodDogdmFyKC0tc3AtNik7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0zKSB2YXIoLS1zcC01KTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMyk7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1sZyk7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICB6LWluZGV4OiAxMDAwOwogICAgYW5pbWF0aW9uOiB0b2FzdC1pbiAwLjNzIHZhcigtLWVhc2UpOwp9CgoudG9hc3Qtc3VjY2VzcyB7IGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tc3VjY2Vzcyk7IH0KLnRvYXN0LWVycm9yICAgeyBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLWVycm9yKTsgfQoudG9hc3Qtd2FybmluZyB7IGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0td2FybmluZyk7IH0KCkBrZXlmcmFtZXMgdG9hc3QtaW4gewogICAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxNnB4KTsgfQogICAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH0KfQoKLyog4pSA4pSAIExvYWRpbmcgU3Bpbm5lciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLnNwaW5uZXIgewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tYWNjZW50KTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIGFuaW1hdGlvbjogc3BpbiAwLjZzIGxpbmVhciBpbmZpbml0ZTsKfQoKQGtleWZyYW1lcyBzcGluIHsKICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQp9CgovKiDilIDilIAgRGl2aWRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmRpdmlkZXIgewogICAgaGVpZ2h0OiAxcHg7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpOwogICAgbWFyZ2luOiB2YXIoLS1zcC01KSAwOwp9CgovKiDilIDilIAgVXRpbGl0eSBDbGFzc2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouaGlkZGVuIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9Ci50ZXh0LWFjY2VudCB7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9Ci50ZXh0LXN1Y2Nlc3MgeyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IH0KLnRleHQtd2FybmluZyB7IGNvbG9yOiB2YXIoLS13YXJuaW5nKTsgfQoudGV4dC1lcnJvciB7IGNvbG9yOiB2YXIoLS1lcnJvcik7IH0KLnRleHQtbXV0ZWQgeyBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOyB9Ci50ZXh0LWZhaW50IHsgY29sb3I6IHZhcigtLXRleHQtdGVydGlhcnkpOyB9Ci50ZXh0LW1vbm8geyBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsgfQoudGV4dC1zbSB7IGZvbnQtc2l6ZTogMTJweDsgfQoudGV4dC14cyB7IGZvbnQtc2l6ZTogMTFweDsgfQouZm9udC1ib2xkIHsgZm9udC13ZWlnaHQ6IDcwMDsgfQoudGV4dC1jZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLnRleHQtcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodDsgfQoubXQtMiB7IG1hcmdpbi10b3A6IHZhcigtLXNwLTIpOyB9Ci5tdC00IHsgbWFyZ2luLXRvcDogdmFyKC0tc3AtNCk7IH0KLm10LTYgeyBtYXJnaW4tdG9wOiB2YXIoLS1zcC02KTsgfQoubWItMiB7IG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTIpOyB9Ci5tYi00IHsgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNCk7IH0KLm1iLTYgeyBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC02KTsgfQouZ2FwLTIgeyBnYXA6IHZhcigtLXNwLTIpOyB9Ci5nYXAtNCB7IGdhcDogdmFyKC0tc3AtNCk7IH0KLmZsZXggeyBkaXNwbGF5OiBmbGV4OyB9Ci5mbGV4LWNvbCB7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IH0KLml0ZW1zLWNlbnRlciB7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IH0KLmp1c3RpZnktYmV0d2VlbiB7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgfQouZmxleC0xIHsgZmxleDogMTsgfQouZ3JpZCB7IGRpc3BsYXk6IGdyaWQ7IH0KLnNyLW9ubHkgewogICAgcG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFweDsgcGFkZGluZzogMDsgbWFyZ2luOiAtMXB4OwogICAgb3ZlcmZsb3c6IGhpZGRlbjsgY2xpcDogcmVjdCgwLDAsMCwwKTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgYm9yZGVyLXdpZHRoOiAwOwp9CgovKiDilIDilIAgUmVzcG9uc2l2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAucGFnZSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tc3AtNSkgdmFyKC0tc3AtNCk7CiAgICB9CgogICAgLm5hdiB7CiAgICAgICAgcGFkZGluZzogMCB2YXIoLS1zcC00KTsKICAgIH0KCiAgICAubmF2LWJyYW5kIHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLXNwLTQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIH0KCiAgICAuc3RhdC1ncmlkIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpOwogICAgfQoKICAgIC5mb3JtLXJvdyB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiA0ODBweCkgewogICAgLnN0YXQtZ3JpZCB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9Cn0K'
Install-B64 -R 'ui\global.css' -B $b
# ui/index.html (9,263 bytes)
$b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgPHRpdGxlPkNvbW1hbmRlciBBSSBMYWI8L3RpdGxlPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIiAvPgogICAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbiAvPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs1MDA7NjAwOzcwMCZkaXNwbGF5PXN3YXAiIHJlbD0ic3R5bGVzaGVldCIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZ2xvYmFsLmNzcyIgLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYWktbGFiLmNzcyIgLz4KICAgIDxzdHlsZT4KICAgICAgICAvKiDilIDilIAgRGFzaGJvYXJkIEZlYXR1cmUgR3JpZCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KICAgICAgICAuZmVhdHVyZS1ncmlkIHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsKICAgICAgICAgICAgZ2FwOiB2YXIoLS1zcC00KTsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtOCk7CiAgICAgICAgfQoKICAgICAgICAuZmVhdHVyZS1jYXJkIHsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcpOwogICAgICAgICAgICBwYWRkaW5nOiB2YXIoLS1zcC02KTsKICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLWR1cmF0aW9uKSB2YXIoLS1lYXNlKTsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIC5mZWF0dXJlLWNhcmQ6OmJlZm9yZSB7CiAgICAgICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgICAgIGhlaWdodDogM3B4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWFjY2VudCwgdmFyKC0tYWNjZW50KSk7CiAgICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgdmFyKC0tZHVyYXRpb24pIHZhcigtLWVhc2UpOwogICAgICAgIH0KCiAgICAgICAgLmZlYXR1cmUtY2FyZDpob3ZlciB7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWZvY3VzKTsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwogICAgICAgICAgICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbWQpOwogICAgICAgIH0KCiAgICAgICAgLmZlYXR1cmUtY2FyZDpob3Zlcjo6YmVmb3JlIHsgb3BhY2l0eTogMTsgfQoKICAgICAgICAuZmVhdHVyZS1jYXJkLWljb24gewogICAgICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNCk7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcsIHZhcigtLWFjY2VudC1kaW0pKTsKICAgICAgICB9CgogICAgICAgIC5mZWF0dXJlLWNhcmQtaWNvbiBzdmcgewogICAgICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgICAgICBzdHJva2U6IHZhcigtLWNhcmQtYWNjZW50LCB2YXIoLS1hY2NlbnQpKTsKICAg' +
'ICAgICB9CgogICAgICAgIC5mZWF0dXJlLWNhcmQgaDMgewogICAgICAgICAgICBmb250LXNpemU6IDE1cHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTIpOwogICAgICAgIH0KCiAgICAgICAgLmZlYXR1cmUtY2FyZCBwIHsKICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgICAgICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICAgIH0KCiAgICAgICAgLmZlYXR1cmUtY2FyZCAuY2FyZC1hcnJvdyB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgYm90dG9tOiB2YXIoLS1zcC01KTsKICAgICAgICAgICAgcmlnaHQ6IHZhcigtLXNwLTUpOwogICAgICAgICAgICBjb2xvcjogdmFyKC0tdGV4dC10ZXJ0aWFyeSk7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7CiAgICAgICAgfQoKICAgICAgICAuZmVhdHVyZS1jYXJkOmhvdmVyIC5jYXJkLWFycm93IHsKICAgICAgICAgICAgY29sb3I6IHZhcigtLWNhcmQtYWNjZW50LCB2YXIoLS1hY2NlbnQpKTsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDNweCk7CiAgICAgICAgfQoKICAgICAgICAvKiBDYXJkIGNvbG9yIHZhcmlhbnRzICovCiAgICAgICAgLmZlYXR1cmUtY2FyZFtkYXRhLWNvbG9yPSJibHVlIl0gICB7IC0tY2FyZC1hY2NlbnQ6IHZhcigtLWFjY2VudCk7ICAtLWNhcmQtYmc6IHZhcigtLWFjY2VudC1kaW0pOyB9CiAgICAgICAgLmZlYXR1cmUtY2FyZFtkYXRhLWNvbG9yPSJncmVlbiJdICB7IC0tY2FyZC1hY2NlbnQ6IHZhcigtLXN1Y2Nlc3MpOyAtLWNhcmQtYmc6IHZhcigtLXN1Y2Nlc3MtZGltKTsgfQogICAgICAgIC5mZWF0dXJlLWNhcmRbZGF0YS1jb2xvcj0icHVycGxlIl0geyAtLWNhcmQtYWNjZW50OiB2YXIoLS1wdXJwbGUpOyAgLS1jYXJkLWJnOiB2YXIoLS1wdXJwbGUtZGltKTsgfQogICAgICAgIC5mZWF0dXJlLWNhcmRbZGF0YS1jb2xvcj0ieWVsbG93Il0geyAtLWNhcmQtYWNjZW50OiB2YXIoLS13YXJuaW5nKTsgLS1jYXJkLWJnOiB2YXIoLS13YXJuaW5nLWRpbSk7IH0KICAgICAgICAuZmVhdHVyZS1jYXJkW2RhdGEtY29sb3I9InJlZCJdICAgIHsgLS1jYXJkLWFjY2VudDogdmFyKC0tZXJyb3IpOyAgIC0tY2FyZC1iZzogdmFyKC0tZXJyb3ItZGltKTsgfQogICAgICAgIC5mZWF0dXJlLWNhcmRbZGF0YS1jb2xvcj0iZ29sZCJdICAgeyAtLWNhcmQtYWNjZW50OiB2YXIoLS1nb2xkKTsgICAgLS1jYXJkLWJnOiByZ2JhKDI1MiwyMTEsNzcsMC4xMik7IH0KCiAgICAgICAgLyog4pSA4pSAIEJhdGNoIFNpbSBTZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwogICAgICAgIC5iYXRjaC1zZWN0aW9uIHsKICAgICAgICAgICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtNCk7CiAgICAgICAgfQoKICAgICAgICAuYmF0Y2gtc2VjdGlvbiBoMiB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNSk7CiAgICAgICAgfQoKICAgICAgICBAbWVkaWEgKG1heC13aWR0aDogOTAwcHgpIHsKICAgICAgICAgICAgLmZlYXR1cmUtZ3JpZCB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7IH0KICAgICAgICB9CiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDU2MHB4KSB7CiAgICAgICAgICAgIC5mZWF0dXJlLWdyaWQgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgfQogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgICA8c2NyaXB0IHNyYz0ibmF2LmpzIj48L3NjcmlwdD4KCiAgICA8ZGl2IGNsYXNzPSJwYWdlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CiAgICAgICAgICAgIDxoMT5Db21tYW5kZXIgQUkgTGFiPC9oMT4KICAgICAgICAgICAgPHA+QUktcG93ZXJlZCB0b29scyBmb3IgTVRHIENvbW1hbmRlciDigJQgc2Nhbm5pbmcsIGRlY2tidWlsZGluZywgc2ltdWxhdGlvbiwgYW5kIHRyYWluaW5nPC9wPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIEZlYXR1cmUgQ2FyZHMgR3JpZCAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWdyaWQiPgogICAgICAgICAgICA8YSBocmVmPSJj' +
'b2xsZWN0aW9uLmh0bWwiIGNsYXNzPSJmZWF0dXJlLWNhcmQiIGRhdGEtY29sb3I9ImJsdWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1jYXJkLWljb24iPgogICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxyZWN0IHg9IjQiIHk9IjQiIHdpZHRoPSIxNiIgaGVpZ2h0PSI2IiByeD0iMSIvPjxyZWN0IHg9IjQiIHk9IjE0IiB3aWR0aD0iMTYiIGhlaWdodD0iNiIgcng9IjEiLz48L3N2Zz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGgzPkNhcmQgQ29sbGVjdGlvbjwvaDM+CiAgICAgICAgICAgICAgICA8cD5TY2FuIGNhcmRzIHdpdGggQUkgdmlzaW9uLCBtYW5hZ2UgeW91ciBjb2xsZWN0aW9uLCBhbmQgdHJhY2sgaW52ZW50b3J5IHdpdGggcHJpY2UgZGF0YS48L3A+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJjYXJkLWFycm93IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggZD0iTTUgMTJoMTRNMTIgNWw3IDctNyA3Ii8+PC9zdmc+CiAgICAgICAgICAgIDwvYT4KCiAgICAgICAgICAgIDxhIGhyZWY9ImRlY2tidWlsZGVyLmh0bWwiIGNsYXNzPSJmZWF0dXJlLWNhcmQiIGRhdGEtY29sb3I9InB1cnBsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWNhcmQtaWNvbiI+CiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHJlY3QgeD0iMiIgeT0iNCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE3IiByeD0iMiIvPjxwYXRoIGQ9Ik0xOCA4aDJhMiAyIDAgMDEyIDJ2MTBhMiAyIDAgMDEtMiAyaC0yIi8+PC9zdmc+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMz5EZWNrIEJ1aWxkZXI8L2gzPgogICAgICAgICAgICAgICAgPHA+QnVpbGQgYW5kIHJlZmluZSBDb21tYW5kZXIgZGVja3Mgd2l0aCBtYW5hIGN1cnZlIGFuYWx5c2lzIGFuZCBjYXRlZ29yeSBtYW5hZ2VtZW50LjwvcD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9ImNhcmQtYXJyb3ciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48cGF0aCBkPSJNNSAxMmgxNE0xMiA1bDcgNy03IDciLz48L3N2Zz4KICAgICAgICAgICAgPC9hPgoKICAgICAgICAgICAgPGEgaHJlZj0iZGVja2dlbmVyYXRvci5odG1sIiBjbGFzcz0iZmVhdHVyZS1jYXJkIiBkYXRhLWNvbG9yPSJ5ZWxsb3ciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1jYXJkLWljb24iPgogICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMiAybDIuNCA3LjJMMjIgMTJsLTcuNiAyLjhMMTIgMjJsLTIuNC03LjJMMiAxMmw3LjYtMi44eiIvPjwvc3ZnPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aDM+QXV0byBHZW5lcmF0b3I8L2gzPgogICAgICAgICAgICAgICAgPHA+QUktcG93ZXJlZCBhdXRvbWF0aWMgZGVjayBnZW5lcmF0aW9uIGZyb20geW91ciBjb2xsZWN0aW9uIG9yIHRoZSBmdWxsIGNhcmQgcG9vbC48L3A+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJjYXJkLWFycm93IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggZD0iTTUgMTJoMTRNMTIgNWw3IDctNyA3Ii8+PC9zdmc+CiAgICAgICAgICAgIDwvYT4KCiAgICAgICAgICAgIDxhIGhyZWY9InNpbXVsYXRvci5odG1sIiBjbGFzcz0iZmVhdHVyZS1jYXJkIiBkYXRhLWNvbG9yPSJncmVlbiI+CiAgICAgICAg' +
'ICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWNhcmQtaWNvbiI+CiAgICAgICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBvbHlnb24gcG9pbnRzPSI1IDMgMTkgMTIgNSAyMSA1IDMiLz48L3N2Zz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGgzPkRlY2sgU2ltdWxhdG9yPC9oMz4KICAgICAgICAgICAgICAgIDxwPk1vbnRlIENhcmxvIHRlc3RpbmcgZW5naW5lIOKAlCBzaW11bGF0ZSBnYW1lcyBhZ2FpbnN0IEFJIG9wcG9uZW50cyBhbmQgYW5hbHl6ZSB3aW5yYXRlcy48L3A+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJjYXJkLWFycm93IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggZD0iTTUgMTJoMTRNMTIgNWw3IDctNyA3Ii8+PC9zdmc+CiAgICAgICAgICAgIDwvYT4KCiAgICAgICAgICAgIDxhIGhyZWY9ImNvYWNoLmh0bWwiIGNsYXNzPSJmZWF0dXJlLWNhcmQiIGRhdGEtY29sb3I9ImdvbGQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1jYXJkLWljb24iPgogICAgICAgICAgICAgICAgICAgIDxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMiAyYTcgNyAwIDAxNyA3YzAgMi4zOC0xLjE5IDQuNDctMyA1Ljc0VjE3YTIgMiAwIDAxLTIgMmgtNGEyIDIgMCAwMS0yLTJ2LTIuMjZDNi4xOSAxMy40NyA1IDExLjM4IDUgOWE3IDcgMCAwMTctN3oiLz48cGF0aCBkPSJNOSAyMWg2Ii8+PC9zdmc+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMz5EZWNrIENvYWNoPC9oMz4KICAgICAgICAgICAgICAgIDxwPkFJLXBvd2VyZWQgY29hY2hpbmcgdGhhdCBhbmFseXplcyB5b3VyIGRlY2ssIHN1Z2dlc3RzIGltcHJvdmVtZW50cywgYW5kIGV4cGxhaW5zIHN0cmF0ZWd5LjwvcD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9ImNhcmQtYXJyb3ciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48cGF0aCBkPSJNNSAxMmgxNE0xMiA1bDcgNy03IDciLz48L3N2Zz4KICAgICAgICAgICAgPC9hPgoKICAgICAgICAgICAgPGEgaHJlZj0idHJhaW5pbmcuaHRtbCIgY2xhc3M9ImZlYXR1cmUtY2FyZCIgZGF0YS1jb2xvcj0icmVkIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtY2FyZC1pY29uIj4KICAgICAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTggMjBWMTBNMTIgMjBWNE02IDIwdi02Ii8+PC9zdmc+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxoMz5NTCBUcmFpbmluZzwvaDM+CiAgICAgICAgICAgICAgICA8cD5UcmFpbiBBSSBvcHBvbmVudHMgd2l0aCBzdXBlcnZpc2VkIGxlYXJuaW5nIGFuZCBQUE8gcmVpbmZvcmNlbWVudCBsZWFybmluZyBwaXBlbGluZS48L3A+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJjYXJkLWFycm93IiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PHBhdGggZD0iTTUgMTJoMTRNMTIgNWw3IDctNyA3Ii8+PC9zdmc+CiAgICAgICAgICAgIDwvYT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPCEtLSBCYXRjaCBTaW0gUGFuZWwgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iYmF0Y2gtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPkJhdGNoIFNpbXVsYXRpb248L2gy' +
'PgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZS1zdGF0dXMgYmFkZ2UtaWRsZSIgaWQ9ImJhdGNoLXN0YXR1cyI+SWRsZTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBpZD0iYWktbGFiLWNvbnRhaW5lciI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHNjcmlwdCBzcmM9ImFpLWxhYi5qcyI+PC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo='
Install-B64 -R 'ui\index.html' -B $b
# ui/nav.js (4,300 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIFNoYXJlZCBOYXZpZ2F0aW9uIENvbXBvbmVudAogICDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgKi8KCihmdW5jdGlvbigpIHsKICAgIGNvbnN0IE5BVl9JVEVNUyA9IFsKICAgICAgICB7IGhyZWY6ICdpbmRleC5odG1sJywgICAgICAgICBsYWJlbDogJ0JhdGNoIFNpbScsICBpY29uOiAnYmVha2VyJyB9LAogICAgICAgIHsgaHJlZjogJ2NvbGxlY3Rpb24uaHRtbCcsICAgIGxhYmVsOiAnQ29sbGVjdGlvbicsIGljb246ICdzdGFjaycgfSwKICAgICAgICB7IGhyZWY6ICdkZWNrYnVpbGRlci5odG1sJywgICBsYWJlbDogJ0RlY2tzJywgICAgICBpY29uOiAnY2FyZHMnIH0sCiAgICAgICAgeyBocmVmOiAnZGVja2dlbmVyYXRvci5odG1sJywgbGFiZWw6ICdBdXRvIEdlbicsICAgaWNvbjogJ3NwYXJrbGUnIH0sCiAgICAgICAgeyBocmVmOiAnc2ltdWxhdG9yLmh0bWwnLCAgICAgbGFiZWw6ICdTaW11bGF0b3InLCAgaWNvbjogJ3BsYXknIH0sCiAgICAgICAgeyBocmVmOiAnY29hY2guaHRtbCcsICAgICAgICAgbGFiZWw6ICdDb2FjaCcsICAgICAgaWNvbjogJ2JyYWluJyB9LAogICAgICAgIHsgaHJlZjogJ3RyYWluaW5nLmh0bWwnLCAgICAgIGxhYmVsOiAnVHJhaW5pbmcnLCAgIGljb246ICdjaGFydCcgfSwKICAgIF07CgogICAgY29uc3QgSUNPTlMgPSB7CiAgICAgICAgYmVha2VyOiAgJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik00LjUgM2gxNU02IDN2MTZhMiAyIDAgMDAyIDJoOGEyIDIgMCAwMDItMlYzIi8+PHBhdGggZD0iTTYgMTRoMTIiLz48L3N2Zz4nLAogICAgICAgIHN0YWNrOiAgICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSI0IiB5PSI0IiB3aWR0aD0iMTYiIGhlaWdodD0iNiIgcng9IjEiLz48cmVjdCB4PSI0IiB5PSIxNCIgd2lkdGg9IjE2IiBoZWlnaHQ9IjYiIHJ4PSIxIi8+PC9zdmc+JywKICAgICAgICBjYXJkczogICAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHJlY3QgeD0iMiIgeT0iNCIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE3IiByeD0iMiIvPjxwYXRoIGQ9Ik0xOCA4aDJhMiAyIDAgMDEyIDJ2MTBhMiAyIDAgMDEtMiAyaC0yIi8+PC9zdmc+JywKICAgICAgICBzcGFya2xlOiAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEyIDJsMi40IDcuMkwyMiAxMmwtNy42IDIuOEwxMiAyMmwtMi40LTcuMkwyIDEybDcuNi0yLjh6Ii8+PC9zdmc+JywKICAgICAgICBwbGF5OiAgICAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBvbHlnb24gcG9pbnRzPSI1IDMgMTkgMTIgNSAyMSA1IDMiLz48L3N2Zz4nLAogICAgICAgIGJyYWluOiAgICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxp' +
'bmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTIgMmE3IDcgMCAwMTcgN2MwIDIuMzgtMS4xOSA0LjQ3LTMgNS43NFYxN2EyIDIgMCAwMS0yIDJoLTRhMiAyIDAgMDEtMi0ydi0yLjI2QzYuMTkgMTMuNDcgNSAxMS4zOCA1IDlhNyA3IDAgMDE3LTd6Ii8+PHBhdGggZD0iTTkgMjFoNk0xMCAxN3Y0TTE0IDE3djQiLz48L3N2Zz4nLAogICAgICAgIGNoYXJ0OiAgICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTggMjBWMTBNMTIgMjBWNE02IDIwdi02Ii8+PC9zdmc+JywKICAgIH07CgogICAgY29uc3QgQlJBTkRfTE9HTyA9ICc8c3ZnIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJsZyIgeDE9IjAiIHkxPSIwIiB4Mj0iMzIiIHkyPSIzMiI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzViOWVmMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2E3OGJmYSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjIiIHk9IjIiIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgcng9IjgiIGZpbGw9InVybCgjbGcpIiBvcGFjaXR5PSIwLjE1Ii8+PHBhdGggZD0iTTE2IDZsMyA2aDZsLTUgNCAyIDYtNi00LTYgNCAyLTYtNS00aDZ6IiBmaWxsPSJ1cmwoI2xnKSIvPjwvc3ZnPic7CgogICAgZnVuY3Rpb24gZ2V0Q3VycmVudFBhZ2UoKSB7CiAgICAgICAgY29uc3QgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguc3Vic3RyaW5nKHBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpIHx8ICdpbmRleC5odG1sJzsKICAgICAgICByZXR1cm4gZmlsZW5hbWU7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyTmF2KCkgewogICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlID0gZ2V0Q3VycmVudFBhZ2UoKTsKICAgICAgICBjb25zdCBuYXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCduYXYnKTsKICAgICAgICBuYXYuY2xhc3NOYW1lID0gJ25hdic7CgogICAgICAgIGNvbnN0IGJyYW5kID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIGJyYW5kLmNsYXNzTmFtZSA9ICduYXYtYnJhbmQnOwogICAgICAgIGJyYW5kLmhyZWYgPSAnaW5kZXguaHRtbCc7CiAgICAgICAgYnJhbmQuaW5uZXJIVE1MID0gQlJBTkRfTE9HTyArICcgQ29tbWFuZGVyIEFJIExhYic7CiAgICAgICAgbmF2LmFwcGVuZENoaWxkKGJyYW5kKTsKCiAgICAgICAgY29uc3QgbGlua3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICBsaW5rcy5jbGFzc05hbWUgPSAnbmF2LWxpbmtzJzsKCiAgICAgICAgTkFWX0lURU1TLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICBhLmhyZWYgPSBpdGVtLmhyZWY7CiAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZSA9PT0gaXRlbS5ocmVmKSBhLmNsYXNzTmFtZSA9ICdhY3RpdmUnOwogICAgICAgICAgICBhLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0ibmF2LWljb24iPicgKyBJQ09OU1tpdGVtLmljb25dICsgJzwvc3Bhbj4nICsgaXRlbS5sYWJlbDsKICAgICAgICAgICAgbGlua3MuYXBwZW5kQ2hpbGQoYSk7CiAgICAgICAgfSk7CgogICAgICAgIG5hdi5hcHBlbmRDaGlsZChsaW5rcyk7CiAgICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRCZWZvcmUobmF2LCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVuZGVyTmF2KTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmVuZGVyTmF2KCk7CiAgICB9Cn0pKCk7Cg=='
Install-B64 -R 'ui\nav.js' -B $b
# ui/simulator.css (9,024 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIFNpbXVsYXRvciBQYWdlCiAgIFBhZ2Utc3BlY2lmaWMgc3R5bGVzIG9ubHk7IHNoYXJlZCB0b2tlbnMgJiBjb21wb25lbnRzIGluIGdsb2JhbC5jc3MKICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgovKiDilIDilIAgQ29uZmlnIHJvdyBsYXlvdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5zaW0tY29uZmlnLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC00KTsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLnNpbS1maWVsZC1ncm93IHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDE4MHB4Owp9Cgouc2ltLWZpZWxkLWF1dG8gewogICAgZmxleDogMCAwIGF1dG87Cn0KCi5zaW0tZmllbGQtZW5kIHsKICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwp9Cgouc2ltLW51bS1pbnB1dCB7CiAgICB3aWR0aDogOTBweDsKfQoKLyog4pSA4pSAIFJ1biBidXR0b24gcnVubmluZyBzdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmJ0bi5ydW5uaW5nIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmcpOwogICAgY29sb3I6IHZhcigtLXRleHQtaW52ZXJzZSk7CiAgICBjdXJzb3I6IHdhaXQ7Cn0KCi8qIOKUgOKUgCBQYXN0ZSBkZWNrbGlzdCBzZWN0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouc2ltLXBhc3RlLXNlY3Rpb24gewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtNCk7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIHBhZGRpbmctdG9wOiB2YXIoLS1zcC0zKTsKfQoKLnNpbS1wYXN0ZS1zZWN0aW9uIHN1bW1hcnkgewogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNTAwOwp9Cgouc2ltLXBhc3RlLXNlY3Rpb24gc3VtbWFyeTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tYWNjZW50LWhvdmVyKTsKfQoKLnNpbS1wYXN0ZS1zZWN0aW9uIC5mb3JtLXRleHRhcmVhIHsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTMpOwogICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtbW9ubyk7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5zaW0tcGFzdGUtY29udHJvbHMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogdmFyKC0tc3AtMyk7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0zKTsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCi5zaW0tcGFzdGUtY29udHJvbHMgLmZvcm0taW5wdXQgewogICAgbWF4LXdpZHRoOiAyNTBweDsKfQoKLyog4pSA4pSAIFJlc3VsdHMgYW5pbWF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwojc2ltLXJlc3VsdHMgewogICAgYW5pbWF0aW9uOiBzaW0tZmFkZUluIDAuM3MgdmFyKC0tZWFzZSk7Cn0KCkBrZXlmcmFtZXMgc2ltLWZhZGVJbiB7CiAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCk7IH0KICAgIHRvICAgeyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRy' +
'YW5zbGF0ZVkoMCk7IH0KfQoKLyog4pSA4pSAIFN0YXQgY2FyZCB2YXJpYW50cyAoSlMtZ2VuZXJhdGVkIGNsYXNzZXMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouc2ltLXN0YXQtY2FyZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTEpOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC01KTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5zaW0tc3RhdC1jYXJkOmhvdmVyIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYm9yZGVyLWZvY3VzKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTsKICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1tZCk7Cn0KCi5zaW0tc3RhdC1jYXJkLmhpZ2hsaWdodCB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsKfQoKLnNpbS1zdGF0LWNhcmQud2luIC5zaW0tc3RhdC12YWx1ZSB7CiAgICBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7Cn0KCi5zaW0tc3RhdC1jYXJkLmxvc3MgLnNpbS1zdGF0LXZhbHVlIHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7Cn0KCi5zaW0tc3RhdC1jYXJkLmhpZ2hsaWdodCAuc2ltLXN0YXQtdmFsdWUgewogICAgY29sb3I6IHZhcigtLWFjY2VudCk7Cn0KCi5zaW0tc3RhdC12YWx1ZSB7CiAgICBmb250LXNpemU6IDI4cHg7CiAgICBmb250LXdlaWdodDogNzAwOwogICAgY29sb3I6ICNmZmY7CiAgICBsaW5lLWhlaWdodDogMS4xOwogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtMSk7CiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zOwp9Cgouc2ltLXN0YXQtbGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTsKfQoKLyog4pSA4pSAIEdhbWVzIHNlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5zaW0tZ2FtZXMtc2VjdGlvbiAucGFuZWwtaGVhZGVyIHsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTQpOwp9Cgouc2ltLWdhbWVzLWxpc3QgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IHZhcigtLXNwLTIpOwp9CgovKiDilIDilIAgSW5kaXZpZHVhbCBnYW1lIHJvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLnNpbS1nYW1lLXJvdyB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9Cgouc2ltLWdhbWUtaGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogdmFyKC0tc3AtMykgdmFyKC0tc3AtNCk7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTMpOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCB2YXIoLS1kdXJhdGlvbikgdmFyKC0tZWFzZSk7Cn0KCi5zaW0tZ2FtZS1oZWFkZXI6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS1ob3Zlcik7Cn0KCi5zaW0tZ2FtZS1udW0gewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1pbi13aWR0aDogNTVweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KCi5zaW0tZ2FtZS13aW5uZXIgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZsZXg6IDE7Cn0KCi5zaW0tZ2FtZS13aW5uZXIud2luIHsKICAgIGNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKfQoKLnNpbS1nYW1l' +
'LXdpbm5lci5sb3NzIHsKICAgIGNvbG9yOiB2YXIoLS1lcnJvcik7Cn0KCi5zaW0tZ2FtZS1pbmZvIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKfQoKLnNpbS1nYW1lLWV4cGFuZCB7CiAgICBjb2xvcjogdmFyKC0tdGV4dC10ZXJ0aWFyeSk7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyB2YXIoLS1lYXNlKTsKfQoKLnNpbS1nYW1lLXJvdy5leHBhbmRlZCAuc2ltLWdhbWUtZXhwYW5kIHsKICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKfQoKLyog4pSA4pSAIFR1cm4gbG9nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouc2ltLXR1cm4tbG9nIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBwYWRkaW5nOiAwIHZhcigtLXNwLTQpIHZhcigtLXNwLTQpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBzY3JvbGxiYXItd2lkdGg6IHRoaW47CiAgICBzY3JvbGxiYXItY29sb3I6IHZhcigtLWJvcmRlci1mb2N1cykgdmFyKC0tc3VyZmFjZS0wKTsKfQoKLnNpbS10dXJuLWxvZzo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgd2lkdGg6IDZweDsKfQoKLnNpbS10dXJuLWxvZzo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0wKTsKfQoKLnNpbS10dXJuLWxvZzo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgYmFja2dyb3VuZDogdmFyKC0tYm9yZGVyLWZvY3VzKTsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKfQoKLnNpbS1nYW1lLXJvdy5leHBhbmRlZCAuc2ltLXR1cm4tbG9nIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Cgouc2ltLXR1cm4gewogICAgcGFkZGluZzogdmFyKC0tc3AtMikgMDsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItc3VidGxlKTsKfQoKLnNpbS10dXJuOmxhc3QtY2hpbGQgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKfQoKLnNpbS10dXJuLWhlYWRlciB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWFjY2VudCk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0xKTsKfQoKLnNpbS10dXJuLWVsaW0gewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWVycm9yKTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC0xKTsKfQoKLnNpbS1waGFzZSB7CiAgICBtYXJnaW4tbGVmdDogdmFyKC0tc3AtMyk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLnNpbS1waGFzZS1wbGF5ZXIgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXB1cnBsZSk7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luLWJvdHRvbTogMnB4Owp9Cgouc2ltLXBoYXNlLWV2ZW50IHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0KTsKICAgIHBhZGRpbmctbGVmdDogdmFyKC0tc3AtMik7CiAgICBsaW5lLWhlaWdodDogMS42Owp9Cgouc2ltLXBoYXNlLWxpZmUgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIG1hcmdpbi10b3A6IDJweDsKICAgIHBhZGRpbmctbGVmdDogdmFyKC0tc3AtMik7Cn0KCi5zaW0tcGhhc2UtYm9hcmQgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIHBhZGRpbmctbGVmdDogdmFyKC0tc3AtMik7Cn0KCi8qIOKUgOKUgCBObyBsb2dzIG1lc3NhZ2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5zaW0tbm8tbG9ncyB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dC10ZXJ0aWFyeSk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7' +
'CiAgICBwYWRkaW5nOiB2YXIoLS1zcC01KTsKfQoKLyog4pSA4pSAIFJlc3BvbnNpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgLnNpbS1jb25maWctcm93IHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoOwogICAgfQoKICAgIC5zaW0tZmllbGQtYXV0byB7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgfQoKICAgIC5zaW0tbnVtLWlucHV0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgIH0KfQoKLyog4pSA4pSAIERlZXBTZWVrIFBhbmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZGVlcHNlZWstcGFuZWwgewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtNCk7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC00KTsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWxnKTsKfQoKLmRlZXBzZWVrLWhlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNwLTMpOwp9CgouZGVlcHNlZWstdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IHZhcigtLXNwLTIpOwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLmRlZXBzZWVrLWljb24gewogICAgZm9udC1zaXplOiAxOHB4Owp9CgouZHMtYmFkZ2UgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHBhZGRpbmc6IDJweCA4cHg7CiAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07Cn0KCi5kcy1iYWRnZS1vZmYgewogICAgYmFja2dyb3VuZDogcmdiYSgyNDgsIDgxLCA3MywgMC4xNSk7CiAgICBjb2xvcjogI2Y4NTE0OTsKfQoKLmRzLWJhZGdlLW9uIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoNjMsIDE4NSwgODAsIDAuMTUpOwogICAgY29sb3I6ICMzZmI5NTA7Cn0KCi5kcy1iYWRnZS1wZW5kaW5nIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjEwLCAxNTMsIDM0LCAwLjE1KTsKICAgIGNvbG9yOiAjZDI5OTIyOwp9CgouZGVlcHNlZWstY29uZmlnLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgIGZsZXgtd3JhcDogd3JhcDsKfQoKLmRlZXBzZWVrLXN0YXRzLXJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC00KTsKICAgIG1hcmdpbi10b3A6IHZhcigtLXNwLTMpOwogICAgcGFkZGluZy10b3A6IHZhcigtLXNwLTMpOwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5kcy1zdGF0IHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKfQoKLmJ0bi1zbSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBwYWRkaW5nOiA0cHggMTJweDsKfQoKLmJ0bi1vdXRsaW5lIHsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzLCBjb2xvciAwLjE1czsKfQoKLmJ0bi1vdXRsaW5lOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7CiAgICBjb2xvcjogdmFyKC0tYmcpOwp9CgouZHMtb3Bwb25lbnQtY2FyZCB7CiAgICBib3JkZXItbGVmdDogM3B4' +
'IHNvbGlkIHZhcigtLWFjY2VudCk7Cn0K'
Install-B64 -R 'ui\simulator.css' -B $b
# ui/simulator.html (6,615 bytes)
$b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgPHRpdGxlPkNvbW1hbmRlciBBSSBMYWIg4oCUIFNpbXVsYXRvcjwvdGl0bGU+CiAgICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20iIC8+CiAgICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ3N0YXRpYy5jb20iIGNyb3Nzb3JpZ2luIC8+CiAgICA8bGluayBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDA7NzAwJmRpc3BsYXk9c3dhcCIgcmVsPSJzdHlsZXNoZWV0IiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJnbG9iYWwuY3NzIiAvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzaW11bGF0b3IuY3NzIiAvPgo8L2hlYWQ+Cjxib2R5PgogICAgPHNjcmlwdCBzcmM9Im5hdi5qcyI+PC9zY3JpcHQ+CiAgICA8ZGl2IGNsYXNzPSJwYWdlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJwYWdlLWhlYWRlciI+CiAgICAgICAgICAgIDxoMT5EZWNrIFNpbXVsYXRvcjwvaDE+CiAgICAgICAgICAgIDxwPk1vbnRlIENhcmxvIGVuZ2luZSAmbWRhc2g7IHRlc3QgeW91ciBkZWNrIGFnYWluc3QgYW4gQUkgdHJhaW5pbmcgb3Bwb25lbnQ8L3A+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gQ29uZmlnIFBhbmVsIC0tPgogICAgICAgIDxzZWN0aW9uIGNsYXNzPSJwYW5lbCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpbS1jb25maWctcm93Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgc2ltLWZpZWxkLWdyb3ciPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCIgZm9yPSJzaW0tZGVjay1zZWxlY3QiPkRlY2s8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9InNpbS1kZWNrLXNlbGVjdCIgY2xhc3M9ImZvcm0tc2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iIj4tLSBTZWxlY3QgYSBkZWNrIC0tPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgc2ltLWZpZWxkLWF1dG8iPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCIgZm9yPSJzaW0tb3Bwb25lbnQtc2VsZWN0Ij5PcHBvbmVudDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBpZD0ic2ltLW9wcG9uZW50LXNlbGVjdCIgY2xhc3M9ImZvcm0tc2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaGV1cmlzdGljIj5IZXVyaXN0aWMgQUk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZGVlcHNlZWsiPkRlZXBTZWVrIEFJPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgc2ltLWZpZWxkLWF1dG8iPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCIgZm9yPSJzaW0tbnVtLWdhbWVzIj5HYW1lczwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InNpbS1udW0tZ2FtZXMiIGNsYXNzPSJmb3JtLWlucHV0IHNpbS1udW0taW5wdXQiIHZhbHVlPSIxMCIgbWluPSIxIiBtYXg9IjEwMDAiIC8+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgc2ltLWZpZWxkLWF1dG8gc2ltLWZpZWxkLWVuZCI+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0ic2ltLXJlY29yZC1sb2dzIiBjaGVja2VkIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZCB0dXJuIGxvZ3MKICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2' +
'IGNsYXNzPSJmb3JtLWdyb3VwIHNpbS1maWVsZC1hdXRvIHNpbS1maWVsZC1lbmQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9InNpbS1ydW4tYnRuIiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBkaXNhYmxlZD5SdW4gU2ltdWxhdGlvbjwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBEZWVwU2VlayBDb25maWcgUGFuZWwgLS0+CiAgICAgICAgICAgIDxkaXYgaWQ9ImRlZXBzZWVrLXBhbmVsIiBjbGFzcz0iZGVlcHNlZWstcGFuZWwiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlZXBzZWVrLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVlcHNlZWstdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGVlcHNlZWstaWNvbiI+JiMxMjk1MDQ7PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5EZWVwU2VlayBBSSBCcmFpbjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRzLXN0YXR1cy1iYWRnZSIgY2xhc3M9ImRzLWJhZGdlIGRzLWJhZGdlLW9mZiI+RGlzY29ubmVjdGVkPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImRzLWNvbm5lY3QtYnRuIiBjbGFzcz0iYnRuIGJ0bi1zbSBidG4tb3V0bGluZSI+Q29ubmVjdDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWVwc2Vlay1jb25maWctcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIHNpbS1maWVsZC1ncm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWxhYmVsIiBmb3I9ImRzLWFwaS1iYXNlIj5BUEkgRW5kcG9pbnQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImRzLWFwaS1iYXNlIiBjbGFzcz0iZm9ybS1pbnB1dCIgdmFsdWU9Imh0dHA6Ly8xOTIuMTY4LjAuMTIyOjEyMzQiIHBsYWNlaG9sZGVyPSJodHRwOi8vMTkyLjE2OC4wLjEyMjoxMjM0IiAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgc2ltLWZpZWxkLWF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0iZHMtbW9kZWwiPk1vZGVsPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJkcy1tb2RlbCIgY2xhc3M9ImZvcm0taW5wdXQiIHZhbHVlPSIiIHBsYWNlaG9sZGVyPSJBdXRvLWRldGVjdCIgc3R5bGU9IndpZHRoOjIwMHB4IiAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgc2ltLWZpZWxkLWF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0iZHMtdGVtcCI+VGVtcDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJkcy10ZW1wIiBjbGFzcz0iZm9ybS1pbnB1dCBzaW0tbnVtLWlucHV0IiB2YWx1ZT0iMC4zIiBtaW49IjAiIG1heD0iMiIgc3RlcD0iMC4xIiAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgc2ltLWZpZWxkLWF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0iZHMtdGltZW91dCI+VGltZW91dCAocyk8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iZHMtdGltZW91dCIgY2xhc3M9ImZvcm0taW5wdXQgc2ltLW51bS1pbnB1dCIgdmFsdWU9IjEwIiBtaW49IjEiIG1heD0iNjAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImRzLXN0YXRzLXJvdyIgY2xhc3M9ImRlZXBzZWVrLXN0YXRzLXJvdyIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkcy1zdGF0LWNhbGxzIiBjbGFzcz0iZHMtc3RhdCI+Q2FsbHM6IDA8L3Nw' +
'YW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRzLXN0YXQtY2FjaGUiIGNsYXNzPSJkcy1zdGF0Ij5DYWNoZTogMDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZHMtc3RhdC1mYWxsYmFjayIgY2xhc3M9ImRzLXN0YXQiPkZhbGxiYWNrczogMDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZHMtc3RhdC1sYXRlbmN5IiBjbGFzcz0iZHMtc3RhdCI+QXZnOiAwbXM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRzLXN0YXQtbW9kZWwiIGNsYXNzPSJkcy1zdGF0Ij48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8IS0tIE9yIHBhc3RlIGRlY2tsaXN0IC0tPgogICAgICAgICAgICA8ZGV0YWlscyBjbGFzcz0ic2ltLXBhc3RlLXNlY3Rpb24iPgogICAgICAgICAgICAgICAgPHN1bW1hcnk+T3IgcGFzdGUgYSBkZWNrbGlzdDwvc3VtbWFyeT4KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0ic2ltLXBhc3RlLWRlY2tsaXN0IiBjbGFzcz0iZm9ybS10ZXh0YXJlYSIgcm93cz0iOCIgcGxhY2Vob2xkZXI9IjEgU29sIFJpbmcmIzEwOzEgQ3VsdGl2YXRlJiMxMDszNyBGb3Jlc3QmIzEwOy4uLiI+PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpbS1wYXN0ZS1jb250cm9scyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJzaW0tcGFzdGUtbmFtZSIgY2xhc3M9ImZvcm0taW5wdXQiIHBsYWNlaG9sZGVyPSJEZWNrIG5hbWUiIHZhbHVlPSJDdXN0b20gRGVjayIgLz4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJzaW0tcGFzdGUtcnVuLWJ0biIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+UnVuIGZyb20gUGFzdGU8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2RldGFpbHM+CgogICAgICAgICAgICA8IS0tIFByb2dyZXNzIGJhciAtLT4KICAgICAgICAgICAgPGRpdiBpZD0ic2ltLXByb2dyZXNzIiBjbGFzcz0icHJvZ3Jlc3MtY29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4IGp1c3RpZnktYmV0d2VlbiBtYi0yIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic2ltLXByb2dyZXNzLXRleHQiIGNsYXNzPSJwcm9ncmVzcy1sYWJlbCI+UnVubmluZy4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic2ltLXByb2dyZXNzLWNvdW50IiBjbGFzcz0idGV4dC1zbSB0ZXh0LW11dGVkIHRleHQtbW9ubyI+MCAvIDA8L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLXRyYWNrIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJzaW0tcHJvZ3Jlc3MtYmFyIiBjbGFzcz0icHJvZ3Jlc3MtZmlsbCI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8IS0tIFJlc3VsdHMgLS0+CiAgICAgICAgPHNlY3Rpb24gaWQ9InNpbS1yZXN1bHRzIiBzdHlsZT0iZGlzcGxheTpub25lOyI+CiAgICAgICAgICAgIDwhLS0gU3RhdHMgU3VtbWFyeSAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2ltLXN0YXRzLWdyaWQgc3RhdC1ncmlkIiBpZD0ic2ltLXN0YXRzLWdyaWQiPjwvZGl2PgoKICAgICAgICAgICAgPCEtLSBHYW1lIExpc3QgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsIHNpbS1nYW1lcy1zZWN0aW9uIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPkdhbWUtYnktR2FtZSBSZXN1bHRzPC9oMj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBpZD0ic2ltLWdhbWVzLWxpc3QiIGNsYXNzPSJzaW0tZ2FtZXMtbGlzdCI+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgc3JjPSJzaW11bGF0b3IuanMiPjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K'
Install-B64 -R 'ui\simulator.html' -B $b
# ui/simulator.js (21,132 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIFNpbXVsYXRvciBQYWdlIENvbnRyb2xsZXIKICAg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQICovCgooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIOKUgOKUgCBET00gcmVmcyDilIDilIAKICAgIGNvbnN0IGRlY2tTZWxlY3QgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbS1kZWNrLXNlbGVjdCcpOwogICAgY29uc3Qgb3BwU2VsZWN0ICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLW9wcG9uZW50LXNlbGVjdCcpOwogICAgY29uc3QgbnVtR2FtZXNJbnB1dCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLW51bS1nYW1lcycpOwogICAgY29uc3QgcmVjb3JkTG9nc0NoayAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXJlY29yZC1sb2dzJyk7CiAgICBjb25zdCBydW5CdG4gICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaW0tcnVuLWJ0bicpOwogICAgY29uc3QgcGFzdGVBcmVhICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXBhc3RlLWRlY2tsaXN0Jyk7CiAgICBjb25zdCBwYXN0ZU5hbWUgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaW0tcGFzdGUtbmFtZScpOwogICAgY29uc3QgcGFzdGVSdW5CdG4gICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXBhc3RlLXJ1bi1idG4nKTsKICAgIGNvbnN0IHByb2dyZXNzRWwgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbS1wcm9ncmVzcycpOwogICAgY29uc3QgcHJvZ3Jlc3NUZXh0ICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXByb2dyZXNzLXRleHQnKTsKICAgIGNvbnN0IHByb2dyZXNzQ291bnQgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbS1wcm9ncmVzcy1jb3VudCcpOwogICAgY29uc3QgcHJvZ3Jlc3NCYXIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXByb2dyZXNzLWJhcicpOwogICAgY29uc3QgcmVzdWx0c0VsICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2ltLXJlc3VsdHMnKTsKICAgIGNvbnN0IHN0YXRzR3JpZCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpbS1zdGF0cy1ncmlkJyk7CiAgICBjb25zdCBnYW1lc0xpc3QgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaW0tZ2FtZXMtbGlzdCcpOwoKICAgIC8vIERlZXBTZWVrIERPTSByZWZzCiAgICBjb25zdCBkc1BhbmVsICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZWVwc2Vlay1wYW5lbCcpOwogICAgY29uc3QgZHNTdGF0dXNCYWRnZSAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHMtc3RhdHVzLWJhZGdlJyk7CiAgICBjb25zdCBkc0Nvbm5lY3RCdG4gICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcy1jb25uZWN0LWJ0bicpOwogICAgY29uc3QgZHNBcGlCYXNlICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHMtYXBpLWJhc2UnKTsKICAgIGNvbnN0IGRzTW9kZWwgICAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RzLW1vZGVsJyk7CiAgICBjb25zdCBkc1RlbXAgICAgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcy10ZW1wJyk7CiAgICBjb25zdCBkc1RpbWVvdXQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcy10aW1lb3V0Jyk7CiAgICBjb25zdCBkc1N0YXRzUm93ICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcy1zdGF0cy1yb3cnKTsKCiAgICBsZXQgY3VycmVudFNpbUlkID0gbnVsbDsKICAgIGxldCBwb2xsVGltZXIgICAgPSBudWxsOwogICAgbGV0IGRzQ29ubmVjdGVkICA9IGZhbHNlOwoKICAgIC8vIOKUgOKUgCBJbml0OiBsb2FkIGRlY2tzIOKU' +
'gOKUgAogICAgYXN5bmMgZnVuY3Rpb24gbG9hZERlY2tzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2RlY2tzJyk7CiAgICAgICAgICAgIGlmICghcmVzLm9rKSByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICBjb25zdCBkZWNrcyA9IGRhdGEuZGVja3MgfHwgZGF0YSB8fCBbXTsKICAgICAgICAgICAgZGVja3MuZm9yRWFjaChkID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOwogICAgICAgICAgICAgICAgb3B0LnZhbHVlID0gZC5pZDsKICAgICAgICAgICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGQubmFtZSArIChkLmNvbW1hbmRlciA/ICcgKCcgKyBkLmNvbW1hbmRlciArICcpJyA6ICcnKTsKICAgICAgICAgICAgICAgIGRlY2tTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBsb2FkIGRlY2tzOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICBkZWNrU2VsZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsKICAgICAgICBydW5CdG4uZGlzYWJsZWQgPSAhZGVja1NlbGVjdC52YWx1ZTsKICAgIH0pOwoKICAgIC8vIOKUgOKUgCBPcHBvbmVudCBzZWxlY3RvciDilIDilIAKICAgIG9wcFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgY29uc3QgaXNEZWVwU2VlayA9IG9wcFNlbGVjdC52YWx1ZSA9PT0gJ2RlZXBzZWVrJzsKICAgICAgICBkc1BhbmVsLnN0eWxlLmRpc3BsYXkgPSBpc0RlZXBTZWVrID8gJ2Jsb2NrJyA6ICdub25lJzsKICAgICAgICBpZiAoaXNEZWVwU2VlaykgewogICAgICAgICAgICAvLyBBdXRvLWNhcCBnYW1lcyBmb3IgRGVlcFNlZWsgKExMTSBpcyBzbG93ZXIpCiAgICAgICAgICAgIGlmIChwYXJzZUludChudW1HYW1lc0lucHV0LnZhbHVlKSA+IDUwKSB7CiAgICAgICAgICAgICAgICBudW1HYW1lc0lucHV0LnZhbHVlID0gNTsKICAgICAgICAgICAgfQogICAgICAgICAgICBudW1HYW1lc0lucHV0Lm1heCA9IDUwOwogICAgICAgICAgICAvLyBDaGVjayBpbml0aWFsIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgICAgICAgIGNoZWNrRGVlcFNlZWtTdGF0dXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBudW1HYW1lc0lucHV0Lm1heCA9IDEwMDA7CiAgICAgICAgfQogICAgfSk7CgogICAgLy8g4pSA4pSAIERlZXBTZWVrIGNvbm5lY3Rpb24g4pSA4pSACiAgICBkc0Nvbm5lY3RCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjb25uZWN0RGVlcFNlZWspOwoKICAgIGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3REZWVwU2VlaygpIHsKICAgICAgICBkc0Nvbm5lY3RCdG4uZGlzYWJsZWQgPSB0cnVlOwogICAgICAgIGRzQ29ubmVjdEJ0bi50ZXh0Q29udGVudCA9ICdDb25uZWN0aW5nLi4uJzsKICAgICAgICBkc1N0YXR1c0JhZGdlLmNsYXNzTmFtZSA9ICdkcy1iYWRnZSBkcy1iYWRnZS1wZW5kaW5nJzsKICAgICAgICBkc1N0YXR1c0JhZGdlLnRleHRDb250ZW50ID0gJ0Nvbm5lY3RpbmcuLi4nOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwYXlsb2FkID0ge307CiAgICAgICAgICAgIGlmIChkc0FwaUJhc2UudmFsdWUudHJpbSgpKSBwYXlsb2FkLmFwaUJhc2UgPSBkc0FwaUJhc2UudmFsdWUudHJpbSgpOwogICAgICAgICAgICBpZiAoZHNNb2RlbC52YWx1ZS50cmltKCkpIHBheWxvYWQubW9kZWwgPSBkc01vZGVsLnZhbHVlLnRyaW0oKTsKCiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2RlZXBzZWVrL2Nvbm5lY3QnLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKCiAgICAgICAgICAgIGlmIChkYXRhLmNvbm5lY3RlZCkgewogICAgICAgICAgICAgICAgZHNDb25uZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgZHNTdGF0dXNCYWRnZS5jbGFzc05hbWUgPSAnZHMtYmFkZ2UgZHMt' +
'YmFkZ2Utb24nOwogICAgICAgICAgICAgICAgZHNTdGF0dXNCYWRnZS50ZXh0Q29udGVudCA9ICdDb25uZWN0ZWQnOwogICAgICAgICAgICAgICAgZHNDb25uZWN0QnRuLnRleHRDb250ZW50ID0gJ1JlY29ubmVjdCc7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb2RlbCkgZHNNb2RlbC52YWx1ZSA9IGRhdGEubW9kZWw7CgogICAgICAgICAgICAgICAgLy8gQXBwbHkgc2V0dGluZ3MKICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5RGVlcFNlZWtDb25maWcoKTsKICAgICAgICAgICAgICAgIHVwZGF0ZURlZXBTZWVrU3RhdHMoZGF0YS5zdGF0cyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkc0Nvbm5lY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgZHNTdGF0dXNCYWRnZS5jbGFzc05hbWUgPSAnZHMtYmFkZ2UgZHMtYmFkZ2Utb2ZmJzsKICAgICAgICAgICAgICAgIGRzU3RhdHVzQmFkZ2UudGV4dENvbnRlbnQgPSAnRmFpbGVkJzsKICAgICAgICAgICAgICAgIGRzQ29ubmVjdEJ0bi50ZXh0Q29udGVudCA9ICdSZXRyeSc7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGRzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgIGRzU3RhdHVzQmFkZ2UuY2xhc3NOYW1lID0gJ2RzLWJhZGdlIGRzLWJhZGdlLW9mZic7CiAgICAgICAgICAgIGRzU3RhdHVzQmFkZ2UudGV4dENvbnRlbnQgPSAnRXJyb3InOwogICAgICAgICAgICBkc0Nvbm5lY3RCdG4udGV4dENvbnRlbnQgPSAnUmV0cnknOwogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdEZWVwU2VlayBjb25uZWN0IGVycm9yOicsIGUpOwogICAgICAgIH0KICAgICAgICBkc0Nvbm5lY3RCdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBhcHBseURlZXBTZWVrQ29uZmlnKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IGZldGNoKCcvYXBpL2RlZXBzZWVrL2NvbmZpZ3VyZScsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgdGVtcGVyYXR1cmU6IHBhcnNlRmxvYXQoZHNUZW1wLnZhbHVlKSB8fCAwLjMsCiAgICAgICAgICAgICAgICAgICAgdGltZW91dDogcGFyc2VGbG9hdChkc1RpbWVvdXQudmFsdWUpIHx8IDEwLAogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCdDb25maWcgYXBwbHkgZmFpbGVkOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBjaGVja0RlZXBTZWVrU3RhdHVzKCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL2RlZXBzZWVrL3N0YXR1cycpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgaWYgKGRhdGEuY29ubmVjdGVkKSB7CiAgICAgICAgICAgICAgICBkc0Nvbm5lY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBkc1N0YXR1c0JhZGdlLmNsYXNzTmFtZSA9ICdkcy1iYWRnZSBkcy1iYWRnZS1vbic7CiAgICAgICAgICAgICAgICBkc1N0YXR1c0JhZGdlLnRleHRDb250ZW50ID0gJ0Nvbm5lY3RlZCc7CiAgICAgICAgICAgICAgICBkc0Nvbm5lY3RCdG4udGV4dENvbnRlbnQgPSAnUmVjb25uZWN0JzsKICAgICAgICAgICAgICAgIHVwZGF0ZURlZXBTZWVrU3RhdHMoZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChlKSB7IC8qIGlnbm9yZSAqLyB9CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlRGVlcFNlZWtTdGF0cyhzdGF0cykgewogICAgICAgIGlmICghc3RhdHMpIHJldHVybjsKICAgICAgICBkc1N0YXRzUm93LnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RzLXN0YXQtY2FsbHMnKS50ZXh0Q29udGVudCA9ICdDYWxsczogJyArIChzdGF0cy50b3RhbF9jYWxscyB8fCAwKTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHMtc3RhdC1jYWNoZScpLnRleHRDb250ZW50ID0gJ0NhY2hlOiAnICsgKHN0YXRzLmNhY2hlX2hpdHMgfHwgMCk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rz' +
'LXN0YXQtZmFsbGJhY2snKS50ZXh0Q29udGVudCA9ICdGYWxsYmFja3M6ICcgKyAoc3RhdHMuZmFsbGJhY2tzIHx8IDApOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcy1zdGF0LWxhdGVuY3knKS50ZXh0Q29udGVudCA9ICdBdmc6ICcgKyAoc3RhdHMuYXZnX2xhdGVuY3lfbXMgfHwgMCkgKyAnbXMnOwogICAgICAgIGlmIChzdGF0cy5tb2RlbCkgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHMtc3RhdC1tb2RlbCcpLnRleHRDb250ZW50ID0gc3RhdHMubW9kZWw7CiAgICAgICAgfQogICAgfQoKICAgIC8vIOKUgOKUgCBSdW4gZnJvbSBkZWNrIElEIOKUgOKUgAogICAgcnVuQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IGRlY2tJZCA9IHBhcnNlSW50KGRlY2tTZWxlY3QudmFsdWUpOwogICAgICAgIGlmICghZGVja0lkKSByZXR1cm47CgogICAgICAgIGNvbnN0IG51bUdhbWVzID0gcGFyc2VJbnQobnVtR2FtZXNJbnB1dC52YWx1ZSkgfHwgMTA7CiAgICAgICAgY29uc3QgcmVjb3JkTG9ncyA9IHJlY29yZExvZ3NDaGsuY2hlY2tlZDsKICAgICAgICBjb25zdCB1c2VEZWVwU2VlayA9IG9wcFNlbGVjdC52YWx1ZSA9PT0gJ2RlZXBzZWVrJzsKCiAgICAgICAgLy8gSWYgRGVlcFNlZWsgc2VsZWN0ZWQgYnV0IG5vdCBjb25uZWN0ZWQsIHRyeSB0byBjb25uZWN0IGZpcnN0CiAgICAgICAgaWYgKHVzZURlZXBTZWVrICYmICFkc0Nvbm5lY3RlZCkgewogICAgICAgICAgICBhd2FpdCBjb25uZWN0RGVlcFNlZWsoKTsKICAgICAgICAgICAgaWYgKCFkc0Nvbm5lY3RlZCkgewogICAgICAgICAgICAgICAgYWxlcnQoJ0NvdWxkIG5vdCBjb25uZWN0IHRvIERlZXBTZWVrLiBNYWtlIHN1cmUgTE0gU3R1ZGlvIGlzIHJ1bm5pbmcgYXQgJyArIGRzQXBpQmFzZS52YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgYXBwbHlEZWVwU2Vla0NvbmZpZygpOwogICAgICAgIH0KCiAgICAgICAgcnVuQnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBydW5CdG4uY2xhc3NMaXN0LmFkZCgncnVubmluZycpOwogICAgICAgIHJ1bkJ0bi50ZXh0Q29udGVudCA9IHVzZURlZXBTZWVrID8gJ1J1bm5pbmcgKERlZXBTZWVrKS4uLicgOiAnUnVubmluZy4uLic7CiAgICAgICAgc2hvd1Byb2dyZXNzKG51bUdhbWVzKTsKICAgICAgICBoaWRlUmVzdWx0cygpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IHVzZURlZXBTZWVrID8gJy9hcGkvc2ltL3J1bi1kZWVwc2VlaycgOiAnL2FwaS9zaW0vcnVuLWZyb20tZGVjayc7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGVuZHBvaW50LCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkZWNrSWQsIG51bUdhbWVzLCByZWNvcmRMb2dzIH0pLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvcik7CiAgICAgICAgICAgIGN1cnJlbnRTaW1JZCA9IGRhdGEuc2ltSWQ7CiAgICAgICAgICAgIHN0YXJ0UG9sbGluZygpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgYWxlcnQoJ0Vycm9yOiAnICsgZS5tZXNzYWdlKTsKICAgICAgICAgICAgcmVzZXRSdW5CdG4oKTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyDilIDilIAgUnVuIGZyb20gcGFzdGVkIGRlY2tsaXN0IOKUgOKUgAogICAgcGFzdGVSdW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgcmF3ID0gcGFzdGVBcmVhLnZhbHVlLnRyaW0oKTsKICAgICAgICBpZiAoIXJhdykgeyBhbGVydCgnUGFzdGUgYSBkZWNrbGlzdCBmaXJzdCcpOyByZXR1cm47IH0KCiAgICAgICAgY29uc3QgbGluZXMgPSByYXcuc3BsaXQoJ1xuJykuZmlsdGVyKGwgPT4gbC50cmltKCkpOwogICAgICAgIGNvbnN0IGRlY2tsaXN0ID0gW107CiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7CiAgICAgICAgICAgIGNvbnN0IG0gPSBsaW5lLnRyaW0oKS5tYXRjaCgvXihcZCspXHMr' +
'KC4rKSQvKTsKICAgICAgICAgICAgaWYgKG0pIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gcGFyc2VJbnQobVsxXSk7CiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gbVsyXS50cmltKCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIGRlY2tsaXN0LnB1c2gobmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZWNrbGlzdC5wdXNoKGxpbmUudHJpbSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3QgbnVtR2FtZXMgPSBwYXJzZUludChudW1HYW1lc0lucHV0LnZhbHVlKSB8fCAxMDsKICAgICAgICBjb25zdCByZWNvcmRMb2dzID0gcmVjb3JkTG9nc0Noay5jaGVja2VkOwogICAgICAgIGNvbnN0IGRlY2tOYW1lID0gcGFzdGVOYW1lLnZhbHVlLnRyaW0oKSB8fCAnQ3VzdG9tIERlY2snOwoKICAgICAgICBwYXN0ZVJ1bkJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgcGFzdGVSdW5CdG4uY2xhc3NMaXN0LmFkZCgncnVubmluZycpOwogICAgICAgIHBhc3RlUnVuQnRuLnRleHRDb250ZW50ID0gJ1J1bm5pbmcuLi4nOwogICAgICAgIHNob3dQcm9ncmVzcyhudW1HYW1lcyk7CiAgICAgICAgaGlkZVJlc3VsdHMoKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2ltL3J1bicsIHsKICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRlY2tsaXN0LCBudW1HYW1lcywgZGVja05hbWUsIHJlY29yZExvZ3MgfSksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yKTsKICAgICAgICAgICAgY3VycmVudFNpbUlkID0gZGF0YS5zaW1JZDsKICAgICAgICAgICAgc3RhcnRQb2xsaW5nKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBhbGVydCgnRXJyb3I6ICcgKyBlLm1lc3NhZ2UpOwogICAgICAgICAgICBwYXN0ZVJ1bkJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBwYXN0ZVJ1bkJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdydW5uaW5nJyk7CiAgICAgICAgICAgIHBhc3RlUnVuQnRuLnRleHRDb250ZW50ID0gJ1J1biBmcm9tIFBhc3RlJzsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyDilIDilIAgUG9sbGluZyDilIDilIAKICAgIGZ1bmN0aW9uIHN0YXJ0UG9sbGluZygpIHsKICAgICAgICBpZiAocG9sbFRpbWVyKSBjbGVhckludGVydmFsKHBvbGxUaW1lcik7CiAgICAgICAgcG9sbFRpbWVyID0gc2V0SW50ZXJ2YWwocG9sbFN0YXR1cywgNDAwKTsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBwb2xsU3RhdHVzKCkgewogICAgICAgIGlmICghY3VycmVudFNpbUlkKSByZXR1cm47CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvc2ltL3N0YXR1cz9zaW1JZD0nICsgY3VycmVudFNpbUlkKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CgogICAgICAgICAgICB1cGRhdGVQcm9ncmVzcyhkYXRhLmNvbXBsZXRlZCwgZGF0YS50b3RhbCk7CgogICAgICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT09ICdjb21wbGV0ZScpIHsKICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocG9sbFRpbWVyKTsKICAgICAgICAgICAgICAgIHBvbGxUaW1lciA9IG51bGw7CiAgICAgICAgICAgICAgICBhd2FpdCBsb2FkUmVzdWx0cyhjdXJyZW50U2ltSWQpOwogICAgICAgICAgICAgICAgcmVzZXRSdW5CdG4oKTsKICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggRGVlcFNlZWsgc3RhdHMgaWYgYXBwbGljYWJsZQogICAgICAgICAgICAgICAgaWYgKG9wcFNlbGVjdC52YWx1ZSA9PT0gJ2RlZXBzZWVrJykgewogICAgICAgICAgICAgICAgICAgIGNoZWNrRGVlcFNlZWtTdGF0dXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnN0YXR1cyA9PT0gJ2Vycm9yJykgewogICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsVGltZXIpOwogICAgICAgICAgICAgICAgcG9sbFRpbWVyID0gbnVsbDsKICAgICAgICAgICAgICAg' +
'IGFsZXJ0KCdTaW11bGF0aW9uIGVycm9yOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSk7CiAgICAgICAgICAgICAgICByZXNldFJ1bkJ0bigpOwogICAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQb2xsIGVycm9yOicsIGUpOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBsb2FkUmVzdWx0cyhzaW1JZCkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3NpbS9yZXN1bHQ/c2ltSWQ9JyArIHNpbUlkKTsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICByZW5kZXJSZXN1bHRzKGRhdGEpOwogICAgfQoKICAgIC8vIOKUgOKUgCBQcm9ncmVzcyBVSSDilIDilIAKICAgIGZ1bmN0aW9uIHNob3dQcm9ncmVzcyh0b3RhbCkgewogICAgICAgIHByb2dyZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgcHJvZ3Jlc3NUZXh0LnRleHRDb250ZW50ID0gJ1NpbXVsYXRpbmcuLi4nOwogICAgICAgIHByb2dyZXNzQ291bnQudGV4dENvbnRlbnQgPSAnMCAvICcgKyB0b3RhbDsKICAgICAgICBwcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9ICcwJSc7CiAgICB9CgogICAgZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MoY29tcGxldGVkLCB0b3RhbCkgewogICAgICAgIHByb2dyZXNzQ291bnQudGV4dENvbnRlbnQgPSBjb21wbGV0ZWQgKyAnIC8gJyArIHRvdGFsOwogICAgICAgIGNvbnN0IHBjdCA9IHRvdGFsID4gMCA/IE1hdGgucm91bmQoKGNvbXBsZXRlZCAvIHRvdGFsKSAqIDEwMCkgOiAwOwogICAgICAgIHByb2dyZXNzQmFyLnN0eWxlLndpZHRoID0gcGN0ICsgJyUnOwogICAgICAgIGlmIChjb21wbGV0ZWQgPj0gdG90YWwpIHsKICAgICAgICAgICAgcHJvZ3Jlc3NUZXh0LnRleHRDb250ZW50ID0gJ0NvbXBsZXRlJzsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGlkZVJlc3VsdHMoKSB7CiAgICAgICAgcmVzdWx0c0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgc3RhdHNHcmlkLmlubmVySFRNTCA9ICcnOwogICAgICAgIGdhbWVzTGlzdC5pbm5lckhUTUwgPSAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNldFJ1bkJ0bigpIHsKICAgICAgICBydW5CdG4uZGlzYWJsZWQgPSAhZGVja1NlbGVjdC52YWx1ZTsKICAgICAgICBydW5CdG4uY2xhc3NMaXN0LnJlbW92ZSgncnVubmluZycpOwogICAgICAgIHJ1bkJ0bi50ZXh0Q29udGVudCA9ICdSdW4gU2ltdWxhdGlvbic7CiAgICAgICAgcGFzdGVSdW5CdG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBwYXN0ZVJ1bkJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdydW5uaW5nJyk7CiAgICAgICAgcGFzdGVSdW5CdG4udGV4dENvbnRlbnQgPSAnUnVuIGZyb20gUGFzdGUnOwogICAgfQoKICAgIC8vIOKUgOKUgCBSZW5kZXIgUmVzdWx0cyDilIDilIAKICAgIGZ1bmN0aW9uIHJlbmRlclJlc3VsdHMoZGF0YSkgewogICAgICAgIHJlc3VsdHNFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICByZW5kZXJTdGF0cyhkYXRhLnN1bW1hcnkpOwogICAgICAgIHJlbmRlckdhbWVzKGRhdGEuZ2FtZXMsIGRhdGEuc3VtbWFyeSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVuZGVyU3RhdHMocykgewogICAgICAgIHN0YXRzR3JpZC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBjb25zdCBjYXJkcyA9IFsKICAgICAgICAgICAgeyB2YWx1ZTogcy53aW5SYXRlICsgJyUnLCBsYWJlbDogJ1dpbiBSYXRlJywgY2xzOiBzLndpblJhdGUgPj0gNTAgPyAnd2luJyA6ICdsb3NzJywgaGlnaGxpZ2h0OiB0cnVlIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IHMud2lucyArICcgLyAnICsgcy5sb3NzZXMsIGxhYmVsOiAnV2lucyAvIExvc3NlcycsIGNsczogJycgfSwKICAgICAgICAgICAgeyB2YWx1ZTogcy50b3RhbEdhbWVzLCBsYWJlbDogJ1RvdGFsIEdhbWVzJywgY2xzOiAnJyB9LAogICAgICAgICAgICB7IHZhbHVlOiBzLmF2Z1R1cm5zLCBsYWJlbDogJ0F2ZyBUdXJucycsIGNsczogJycgfSwKICAgICAgICAgICAgeyB2YWx1ZTogcy5hdmdEYW1hZ2VEZWFsdCwgbGFiZWw6ICdBdmcgRGFtYWdlIERlYWx0JywgY2xzOiAnJyB9LAogICAgICAgICAgICB7IHZhbHVlOiBzLmF2Z0RhbWFnZVJlY2VpdmVkLCBsYWJlbDogJ0F2ZyBEYW1hZ2UgVGFrZW4nLCBjbHM6ICcnIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IHMuYXZnU3BlbGxzQ2FzdCwgbGFiZWw6ICdBdmcg' +
'U3BlbGxzIENhc3QnLCBjbHM6ICcnIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IHMuYXZnQ3JlYXR1cmVzUGxheWVkLCBsYWJlbDogJ0F2ZyBDcmVhdHVyZXMnLCBjbHM6ICcnIH0sCiAgICAgICAgICAgIHsgdmFsdWU6IHMuYXZnUmVtb3ZhbFVzZWQsIGxhYmVsOiAnQXZnIFJlbW92YWwgVXNlZCcsIGNsczogJycgfSwKICAgICAgICAgICAgeyB2YWx1ZTogcy5hdmdSYW1wUGxheWVkLCBsYWJlbDogJ0F2ZyBSYW1wIFBsYXllZCcsIGNsczogJycgfSwKICAgICAgICAgICAgeyB2YWx1ZTogcy5hdmdDYXJkc0RyYXduLCBsYWJlbDogJ0F2ZyBDYXJkcyBEcmF3bicsIGNsczogJycgfSwKICAgICAgICAgICAgeyB2YWx1ZTogcy5hdmdNYXhCb2FyZFNpemUsIGxhYmVsOiAnQXZnIE1heCBCb2FyZCcsIGNsczogJycgfSwKICAgICAgICBdOwoKICAgICAgICBjYXJkcy5mb3JFYWNoKGMgPT4gewogICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdzaW0tc3RhdC1jYXJkJyArIChjLmhpZ2hsaWdodCA/ICcgaGlnaGxpZ2h0JyA6ICcnKSArIChjLmNscyA/ICcgJyArIGMuY2xzIDogJycpOwogICAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InNpbS1zdGF0LXZhbHVlIj4nICsgYy52YWx1ZSArICc8L2Rpdj4nCiAgICAgICAgICAgICAgICArICc8ZGl2IGNsYXNzPSJzaW0tc3RhdC1sYWJlbCI+JyArIGMubGFiZWwgKyAnPC9kaXY+JzsKICAgICAgICAgICAgc3RhdHNHcmlkLmFwcGVuZENoaWxkKGRpdik7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEVsYXBzZWQKICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGVsLmNsYXNzTmFtZSA9ICdzaW0tc3RhdC1jYXJkJzsKICAgICAgICBlbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0ic2ltLXN0YXQtdmFsdWUiPicgKyBzLmVsYXBzZWRTZWNvbmRzICsgJ3M8L2Rpdj4nCiAgICAgICAgICAgICsgJzxkaXYgY2xhc3M9InNpbS1zdGF0LWxhYmVsIj5FbGFwc2VkPC9kaXY+JzsKICAgICAgICBzdGF0c0dyaWQuYXBwZW5kQ2hpbGQoZWwpOwoKICAgICAgICAvLyBPcHBvbmVudCB0eXBlIGJhZGdlCiAgICAgICAgaWYgKHMub3Bwb25lbnRUeXBlID09PSAnZGVlcHNlZWsnKSB7CiAgICAgICAgICAgIGNvbnN0IGRzQ2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBkc0NhcmQuY2xhc3NOYW1lID0gJ3NpbS1zdGF0LWNhcmQgZHMtb3Bwb25lbnQtY2FyZCc7CiAgICAgICAgICAgIGxldCBkc0luZm8gPSAnJiMxMjk1MDQ7IERlZXBTZWVrIEFJJzsKICAgICAgICAgICAgaWYgKHMuZGVlcHNlZWtTdGF0cykgewogICAgICAgICAgICAgICAgY29uc3QgZHMgPSBzLmRlZXBzZWVrU3RhdHM7CiAgICAgICAgICAgICAgICBkc0luZm8gKz0gJzxicj48c21hbGw+TExNIGNhbGxzOiAnICsgKGRzLmxsbV9jYWxscyB8fCAwKQogICAgICAgICAgICAgICAgICAgICsgJyB8IENhY2hlOiAnICsgKGRzLmNhY2hlX2hpdHMgfHwgMCkKICAgICAgICAgICAgICAgICAgICArICcgfCBGYWxsYmFja3M6ICcgKyAoZHMuZmFsbGJhY2tzIHx8IDApCiAgICAgICAgICAgICAgICAgICAgKyAnIHwgQXZnOiAnICsgKGRzLmF2Z19sYXRlbmN5X21zIHx8IDApICsgJ21zPC9zbWFsbD4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRzQ2FyZC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0ic2ltLXN0YXQtdmFsdWUiIHN0eWxlPSJmb250LXNpemU6MC45cmVtIj4nICsgZHNJbmZvICsgJzwvZGl2PicKICAgICAgICAgICAgICAgICsgJzxkaXYgY2xhc3M9InNpbS1zdGF0LWxhYmVsIj5PcHBvbmVudDwvZGl2Pic7CiAgICAgICAgICAgIHN0YXRzR3JpZC5hcHBlbmRDaGlsZChkc0NhcmQpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiByZW5kZXJHYW1lcyhnYW1lcywgc3VtbWFyeSkgewogICAgICAgIGdhbWVzTGlzdC5pbm5lckhUTUwgPSAnJzsKCiAgICAgICAgaWYgKCFnYW1lcyB8fCBnYW1lcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgZ2FtZXNMaXN0LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJzaW0tbm8tbG9ncyI+Tm8gZ2FtZSBkYXRhIGF2YWlsYWJsZTwvZGl2Pic7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGdhbWVzLmZvckVhY2goKGcsIGlkeCkgPT4gewogICAgICAgICAgICBjb25zdCByb3cgPSBk' +
'b2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgcm93LmNsYXNzTmFtZSA9ICdzaW0tZ2FtZS1yb3cnOwoKICAgICAgICAgICAgY29uc3QgaXNXaW4gPSBnLndpbm5lciA9PT0gMDsKICAgICAgICAgICAgY29uc3Qgd2lubmVyTmFtZSA9IGlzV2luID8gZy5wbGF5ZXJBLm5hbWUgOiBnLnBsYXllckIubmFtZTsKICAgICAgICAgICAgY29uc3QgbGlmZUEgPSBnLnBsYXllckEubGlmZTsKICAgICAgICAgICAgY29uc3QgbGlmZUIgPSBnLnBsYXllckIubGlmZTsKCiAgICAgICAgICAgIC8vIEhlYWRlcgogICAgICAgICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgaGVhZGVyLmNsYXNzTmFtZSA9ICdzaW0tZ2FtZS1oZWFkZXInOwogICAgICAgICAgICBoZWFkZXIuaW5uZXJIVE1MID0KICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic2ltLWdhbWUtbnVtIj5HYW1lICcgKyAoZy5nYW1lTnVtYmVyIHx8IGlkeCArIDEpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic2ltLWdhbWUtd2lubmVyICcgKyAoaXNXaW4gPyAnd2luJyA6ICdsb3NzJykgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAoaXNXaW4gPyAnV0lOJyA6ICdMT1NTJykgKyAnIOKAlCAnICsgd2lubmVyTmFtZSArICcgd2lucycgKwogICAgICAgICAgICAgICAgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ic2ltLWdhbWUtaW5mbyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuPicgKyBnLnR1cm5zICsgJyB0dXJuczwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPHNwYW4+JyArIGcucGxheWVyQS5uYW1lICsgJzogJyArIGxpZmVBICsgJyBsaWZlPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8c3Bhbj4nICsgZy5wbGF5ZXJCLm5hbWUgKyAnOiAnICsgbGlmZUIgKyAnIGxpZmU8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJzaW0tZ2FtZS1leHBhbmQiPiYjOTY1NDs8L3NwYW4+JzsKCiAgICAgICAgICAgIGhlYWRlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgICAgIHJvdy5jbGFzc0xpc3QudG9nZ2xlKCdleHBhbmRlZCcpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChoZWFkZXIpOwoKICAgICAgICAgICAgLy8gVHVybiBsb2cKICAgICAgICAgICAgY29uc3QgbG9nRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIGxvZ0Rpdi5jbGFzc05hbWUgPSAnc2ltLXR1cm4tbG9nJzsKCiAgICAgICAgICAgIGlmIChnLmdhbWVMb2cgJiYgZy5nYW1lTG9nLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGcuZ2FtZUxvZy5mb3JFYWNoKHR1cm4gPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cm5EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICB0dXJuRGl2LmNsYXNzTmFtZSA9ICdzaW0tdHVybic7CgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cm5IZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICB0dXJuSGVhZGVyLmNsYXNzTmFtZSA9ICdzaW0tdHVybi1oZWFkZXInOwogICAgICAgICAgICAgICAgICAgIHR1cm5IZWFkZXIudGV4dENvbnRlbnQgPSAnVHVybiAnICsgdHVybi50dXJuOwogICAgICAgICAgICAgICAgICAgIHR1cm5EaXYuYXBwZW5kQ2hpbGQodHVybkhlYWRlcik7CgogICAgICAgICAgICAgICAgICAgIGlmICh0dXJuLnBoYXNlcykgewogICAgICAgICAgICAgICAgICAgICAgICB0dXJuLnBoYXNlcy5mb3JFYWNoKHBoYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBoYXNlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZURpdi5jbGFzc05hbWUgPSAnc2ltLXBoYXNlJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyTGFiZWwuY2xhc3NOYW1lID0gJ3NpbS1waGFzZS1wbGF5ZXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAg' +
'cGxheWVyTGFiZWwudGV4dENvbnRlbnQgPSBwaGFzZS5wbGF5ZXIgKyAiJ3MgdHVybiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZURpdi5hcHBlbmRDaGlsZChwbGF5ZXJMYWJlbCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBoYXNlLmV2ZW50cyAmJiBwaGFzZS5ldmVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlLmV2ZW50cy5mb3JFYWNoKGV2ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZEaXYuY2xhc3NOYW1lID0gJ3NpbS1waGFzZS1ldmVudCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2RGl2LnRleHRDb250ZW50ID0gZXY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlRGl2LmFwcGVuZENoaWxkKGV2RGl2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9FdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vRXYuY2xhc3NOYW1lID0gJ3NpbS1waGFzZS1ldmVudCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Fdi50ZXh0Q29udGVudCA9ICcobm8gbm90YWJsZSBhY3Rpb25zKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Fdi5zdHlsZS5jb2xvciA9ICcjNDg0ZjU4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZURpdi5hcHBlbmRDaGlsZChub0V2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaWZlIHRvdGFscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBoYXNlLmxpZmVBZnRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpZmVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWZlRGl2LmNsYXNzTmFtZSA9ICdzaW0tcGhhc2UtbGlmZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHBoYXNlLmxpZmVBZnRlcikubWFwKChbbiwgbF0pID0+IG4gKyAnOiAnICsgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZURpdi50ZXh0Q29udGVudCA9ICdMaWZlIOKAlCAnICsgZW50cmllcy5qb2luKCcgfCAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZURpdi5hcHBlbmRDaGlsZChsaWZlRGl2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb2FyZCBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwaGFzZS5ib2FyZEEgJiYgcGhhc2UuYm9hcmRBLmxlbmd0aCkgfHwgKHBoYXNlLmJvYXJkQiAmJiBwaGFzZS5ib2FyZEIubGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvYXJkRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmREaXYuY2xhc3NOYW1lID0gJ3NpbS1waGFzZS1ib2FyZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGhhc2UuYm9hcmRBICYmIHBoYXNlLmJvYXJkQS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJ0JvYXJkIEE6ICcgKyBwaGFzZS5ib2FyZEEuam9pbignLCAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBoYXNlLmJvYXJkQiAmJiBwaGFzZS5ib2FyZEIubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKCdCb2FyZCBCOiAnICsgcGhhc2UuYm9hcmRCLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkRGl2LnRleHRDb250ZW50ID0gcGFy' +
'dHMuam9pbignIHwgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VEaXYuYXBwZW5kQ2hpbGQoYm9hcmREaXYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5EaXYuYXBwZW5kQ2hpbGQocGhhc2VEaXYpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0dXJuLmV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsaW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxpbURpdi5jbGFzc05hbWUgPSAnc2ltLXR1cm4tZWxpbSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsaW1EaXYudGV4dENvbnRlbnQgPSB0dXJuLmV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICB0dXJuRGl2LmFwcGVuZENoaWxkKGVsaW1EaXYpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbG9nRGl2LmFwcGVuZENoaWxkKHR1cm5EaXYpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsb2dEaXYuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InNpbS1uby1sb2dzIj5UdXJuIGxvZ3Mgbm90IHJlY29yZGVkIGZvciB0aGlzIGdhbWU8L2Rpdj4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICByb3cuYXBwZW5kQ2hpbGQobG9nRGl2KTsKICAgICAgICAgICAgZ2FtZXNMaXN0LmFwcGVuZENoaWxkKHJvdyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLy8g4pSA4pSAIEluaXQg4pSA4pSACiAgICBsb2FkRGVja3MoKTsKfSkoKTsK'
Install-B64 -R 'ui\simulator.js' -B $b
# ui/training.css (9,262 bytes)
$b = 'Lyog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCiAgIENvbW1hbmRlciBBSSBMYWIg4oCUIE1MIFRyYWluaW5nIERhc2hib2FyZAogICBQYWdlLXNwZWNpZmljIHN0eWxlcyBvbmx5OyBzaGFyZWQgdG9rZW5zICYgY29tcG9uZW50cyBpbiBnbG9iYWwuY3NzCiAgIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAqLwoKLyog4pSA4pSAIExlZ2FjeSB2YXJpYWJsZSBhbGlhc2VzICh1c2VkIGJ5IHRyYWluaW5nLmpzIGlubGluZSBzdHlsZXMpIOKUgOKUgCAqLwo6cm9vdCB7CiAgICAtLWxhYi1iZzogICAgICAgICB2YXIoLS1iZyk7CiAgICAtLWxhYi1zdXJmYWNlOiAgICB2YXIoLS1zdXJmYWNlLTEpOwogICAgLS1sYWItYm9yZGVyOiAgICAgdmFyKC0tYm9yZGVyKTsKICAgIC0tbGFiLWFjY2VudDogICAgIHZhcigtLWFjY2VudCk7CiAgICAtLWxhYi1hY2NlbnQtZGltOiB2YXIoLS1hY2NlbnQtZGltKTsKICAgIC0tbGFiLXRleHQ6ICAgICAgIHZhcigtLXRleHQpOwogICAgLS1sYWItdGV4dC1kaW06ICAgdmFyKC0tdGV4dC1zZWNvbmRhcnkpOwogICAgLS1sYWItc3VjY2VzczogICAgdmFyKC0tc3VjY2Vzcyk7CiAgICAtLWxhYi1zdWNjZXNzLWRpbTp2YXIoLS1zdWNjZXNzLWRpbSk7CiAgICAtLWxhYi13YXJuaW5nOiAgICB2YXIoLS13YXJuaW5nKTsKICAgIC0tbGFiLXdhcm5pbmctZGltOnZhcigtLXdhcm5pbmctZGltKTsKICAgIC0tbGFiLWVycm9yOiAgICAgIHZhcigtLWVycm9yKTsKICAgIC0tbGFiLWVycm9yLWRpbTogIHZhcigtLWVycm9yLWRpbSk7CiAgICAtLWxhYi1wdXJwbGU6ICAgICB2YXIoLS1wdXJwbGUpOwogICAgLS1sYWItcHVycGxlLWRpbTogdmFyKC0tcHVycGxlLWRpbSk7Cn0KCi8qIOKUgOKUgCBTdGF0dXMgQ2FyZHMgKGV4dGVuZCBnbG9iYWwgLnN0YXQtY2FyZCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCi5zdGF0dXMtZ3JpZCB7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg0LCAxZnIpOwp9Cgouc3RhdHVzLWNhcmQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cgouc3RhdHVzLWNhcmQuYWN0aXZlIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsKfQoKLnN0YXR1cy1jYXJkLnN1Y2Nlc3MgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzKTsKfQoKLmNhcmQtaWNvbiB7CiAgICBmb250LXNpemU6IDI0cHg7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLyog4pSA4pSAIFBhbmVsIGhlYWRpbmcgd2l0aCBib3R0b20gYm9yZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoucGFuZWwgPiAucGFuZWwtaGVhZGVyIHsKICAgIHBhZGRpbmctYm90dG9tOiB2YXIoLS1zcC0zKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwp9CgovKiDilIDilIAgVHJhaW5pbmcgQ29udHJvbHMgTGF5b3V0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoudHJhaW4tY29udHJvbHMgewogICAgcGFkZGluZy10b3A6IHZhcigtLXNwLTQpOwp9CgoucGFyYW0tZ3JpZCB7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0zKTsKfQoKLnRyYWluLW9wdGlvbnMgewogICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc3AtNCk7Cn0KCi50cmFpbi1hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTIpOwp9CgouYnRuLWljb24gewogICAgZm9udC1zaXplOiAxNHB4Owp9CgovKiDilIDilIAgVG91cm5hbWVudCBwYXJhbSBncmlkICgyIGNvbHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU' +
'gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoudG91cm5leS1wYXJhbS1ncmlkIHsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7Cn0KCi50b3VybmV5LXJlc3VsdHMtc2VjdGlvbiB7CiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zcC00KTsKfQoKLyog4pSA4pSAIFByb2dyZXNzIFNlY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoudHJhaW4tcHJvZ3Jlc3MgewogICAgbWFyZ2luLXRvcDogdmFyKC0tc3AtNSk7CiAgICBwYWRkaW5nLXRvcDogdmFyKC0tc3AtNCk7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoKLnRyYWluLXByb2dyZXNzLmhpZGRlbiB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiDilIDilIAgUGhhc2UgQmFkZ2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoucGhhc2UtYmFkZ2UgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcGFkZGluZzogM3B4IDEwcHg7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgZm9udC1zaXplOiAxMXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBsZXR0ZXItc3BhY2luZzogMC4wNWVtOwp9CgoucGhhc2UtYmFkZ2UuYnVpbGRpbmcgICB7IGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmctZGltKTsgY29sb3I6IHZhcigtLXdhcm5pbmcpOyB9Ci5waGFzZS1iYWRnZS50cmFpbmluZyAgIHsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9Ci5waGFzZS1iYWRnZS5ldmFsdWF0aW5nIHsgYmFja2dyb3VuZDogdmFyKC0tcHVycGxlLWRpbSk7IGNvbG9yOiB2YXIoLS1wdXJwbGUpOyB9Ci5waGFzZS1iYWRnZS5kb25lICAgICAgIHsgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcy1kaW0pOyBjb2xvcjogdmFyKC0tc3VjY2Vzcyk7IH0KLnBoYXNlLWJhZGdlLmVycm9yICAgICAgeyBiYWNrZ3JvdW5kOiB2YXIoLS1lcnJvci1kaW0pOyBjb2xvcjogdmFyKC0tZXJyb3IpOyB9Ci5waGFzZS1iYWRnZS5zdGFydGluZyAgIHsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9Ci5waGFzZS1iYWRnZS5ydW5uaW5nICAgIHsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50LWRpbSk7IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB9Ci5waGFzZS1iYWRnZS5pZGxlICAgICAgIHsgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0zKTsgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsgfQoKI3Byb2dyZXNzLW1lc3NhZ2UsCiNwcG8tcHJvZ3Jlc3MtbWVzc2FnZSwKI3RvdXJuZXktcHJvZ3Jlc3MtbWVzc2FnZSB7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7Cn0KCi8qIOKUgOKUgCBQcm9ncmVzcyBCYXIgb3ZlcnJpZGVzIChKUyBzZXRzIHdpZHRoICsgY2xhc3MpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwoucHJvZ3Jlc3MtYmFyLWNvbnRhaW5lciB7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0yKTsKfQoKLnByb2dyZXNzLWJhciB7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjVzIHZhcigtLWVhc2UpOwp9CgoucHJvZ3Jlc3MtYmFyLmRvbmUgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcyk7Cn0KCi5wcm9ncmVzcy1iYXIuZXJyb3IgewogICAgYmFja2dyb3VuZDogdmFyKC0tZXJyb3IpOwp9CgovKiDilIDilIAgRmlsZSBMaXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZmlsZS1saXN0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKfQoKLmZpbGUtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1p' +
'dGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogdmFyKC0tc3AtMikgdmFyKC0tc3AtMyk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmZpbGUtbmFtZSB7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLmZpbGUtbWV0YSB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiB2YXIoLS1zcC00KTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5maWxlLW1ldGEgLmJhZGdlIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHBhZGRpbmc6IDJweCB2YXIoLS1zcC0yKTsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1tZCk7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBmb250LXdlaWdodDogNjAwOwp9CgouYmFkZ2UtdHJhaW4geyBiYWNrZ3JvdW5kOiB2YXIoLS1hY2NlbnQtZGltKTsgY29sb3I6IHZhcigtLWFjY2VudCk7IH0KLmJhZGdlLXZhbCAgIHsgYmFja2dyb3VuZDogdmFyKC0tcHVycGxlLWRpbSk7IGNvbG9yOiB2YXIoLS1wdXJwbGUpOyB9Ci5iYWRnZS10ZXN0ICB7IGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MtZGltKTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyB9CgovKiDilIDilIAgRXZhbHVhdGlvbiBSZXN1bHRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouZXZhbC1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBnYXA6IHZhcigtLXNwLTQpOwp9CgouZXZhbC1zdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGdyaWQ7CiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLCAxZnIpOwogICAgZ2FwOiB2YXIoLS1zcC0zKTsKfQoKLmV2YWwtbWV0cmljIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpOwogICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi5ldmFsLW1ldHJpYy1sYWJlbCB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7CiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zcC0xKTsKfQoKLmV2YWwtbWV0cmljLXZhbHVlIHsKICAgIGZvbnQtc2l6ZTogMjhweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBjb2xvcjogI2ZmZjsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5ldmFsLW1ldHJpYy12YWx1ZS5nb29kIHsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyB9Ci5ldmFsLW1ldHJpYy12YWx1ZS5vayAgIHsgY29sb3I6IHZhcigtLXdhcm5pbmcpOyB9Ci5ldmFsLW1ldHJpYy12YWx1ZS5iYWQgIHsgY29sb3I6IHZhcigtLWVycm9yKTsgfQoKLyog4pSA4pSAIFBlci1jbGFzcyBBY2N1cmFjeSBUYWJsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmNsYXNzLXRhYmxlIHsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmNsYXNzLXRhYmxlIHRoIHsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBwYWRkaW5nOiB2YXIoLS1zcC0yKSB2YXIoLS1zcC0zKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTsKfQoKLmNsYXNzLXRhYmxlIHRkIHsKICAgIHBhZGRpbmc6IHZhcigtLXNwLTIpIHZhcigtLXNwLTMpOwogICAgYm9yZGVyLWJvdHRvbTogMXB4' +
'IHNvbGlkIHZhcigtLWJvcmRlci1zdWJ0bGUpOwp9CgouY2xhc3MtdGFibGUgdHI6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTsKfQoKLmFjYy1iYXItYmcgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMyk7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgouYWNjLWJhciB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIHZhcigtLWVhc2UpOwp9CgovKiDilIDilIAgQ29uZnVzaW9uIE1hdHJpeCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi8KLmNvbmZ1c2lvbi1tYXRyaXggewogICAgb3ZlcmZsb3cteDogYXV0bzsKfQoKLmNvbmZ1c2lvbi1tYXRyaXggdGFibGUgewogICAgd2lkdGg6IDEwMCU7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgZm9udC1zaXplOiAxMnB4Owp9CgouY29uZnVzaW9uLW1hdHJpeCB0aCwKLmNvbmZ1c2lvbi1tYXRyaXggdGQgewogICAgcGFkZGluZzogdmFyKC0tc3AtMik7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwp9CgouY29uZnVzaW9uLW1hdHJpeCB0aCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDExcHg7Cn0KCi5jb25mdXNpb24tbWF0cml4IHRkIHsKICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7Cn0KCi5jb25mdXNpb24tbWF0cml4IC5yb3ctbGFiZWwgewogICAgdGV4dC1hbGlnbjogbGVmdDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tdGV4dCk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwp9CgovKiDilIDilIAgQ2hlY2twb2ludCBMaXN0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqLwouY2hlY2twb2ludC1saXN0IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiB2YXIoLS1zcC0yKTsKfQoKLmNrcHQtcm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogdmFyKC0tc3AtMyk7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTApOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmNrcHQtbmFtZSB7CiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpOwp9CgouY2twdC1tZXRhIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IHZhcigtLXNwLTQpOwogICAgY29sb3I6IHZhcigtLXRleHQtc2Vjb25kYXJ5KTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLyog4pSA4pSAIFJlc3BvbnNpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovCkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogICAgLnN0YXR1cy1ncmlkIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpOwogICAgfQoKICAgIC5wYXJhbS1ncmlkIHsKICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpOwogICAgfQoKICAgIC5ldmFsLXN1bW1hcnkgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQoKICAgIC50b3VybmV5LXBhcmFtLWdyaWQgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQp9CgovKiBSZWZyZXNoIGJ1dHRvbiBzcGluIGFu' +
'aW1hdGlvbiAqLwpAa2V5ZnJhbWVzIHNwaW4gewogICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgICB0byAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNDgwcHgpIHsKICAgIC5zdGF0dXMtZ3JpZCB7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7CiAgICB9CgogICAgLnBhcmFtLWdyaWQgewogICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOwogICAgfQp9Cg=='
Install-B64 -R 'ui\training.css' -B $b
# ui/training.html (11,627 bytes)
$b = 'PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIiAvPgogICAgPHRpdGxlPkNvbW1hbmRlciBBSSBMYWIg4oCUIE1MIFRyYWluaW5nPC90aXRsZT4KICAgIDxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbSIgLz4KICAgIDxsaW5rIHJlbD0icHJlY29ubmVjdCIgaHJlZj0iaHR0cHM6Ly9mb250cy5nc3RhdGljLmNvbSIgY3Jvc3NvcmlnaW4gLz4KICAgIDxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMDs3MDAmZGlzcGxheT1zd2FwIiByZWw9InN0eWxlc2hlZXQiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imdsb2JhbC5jc3MiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRyYWluaW5nLmNzcyIgLz4KPC9oZWFkPgo8Ym9keT4KICAgIDxzY3JpcHQgc3JjPSJuYXYuanMiPjwvc2NyaXB0PgogICAgPGRpdiBjbGFzcz0icGFnZSI+CiAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiIHN0eWxlPSJkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICA8aDE+TUwgVHJhaW5pbmcgRGFzaGJvYXJkPC9oMT4KICAgICAgICAgICAgICAgIDxwPlRyYWluLCBldmFsdWF0ZSwgYW5kIGRlcGxveSB0aGUgQUkgb3Bwb25lbnQgcG9saWN5IG5ldHdvcms8L3A+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tcmVmcmVzaC1kYXRhIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIG9uY2xpY2s9InJlZnJlc2hBbGwoKSIgdGl0bGU9IlJlZnJlc2ggdHJhaW5pbmcgZGF0YSBzdGF0dXMiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ0bi1pY29uIiBpZD0icmVmcmVzaC1pY29uIj4mIzg2MzU7PC9zcGFuPiBSZWZyZXNoCiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIFN0YXR1cyBPdmVydmlldyBDYXJkcyAtLT4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtZ3JpZCBzdGF0LWdyaWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtY2FyZCBzdGF0LWNhcmQiIGlkPSJjYXJkLWRhdGEiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1pY29uIj4mIzEyODIwMjs8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtbGFiZWwgc3RhdC1sYWJlbCI+VHJhaW5pbmcgRGF0YTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC12YWx1ZSBzdGF0LXZhbHVlIiBpZD0idmFsLWRlY2lzaW9ucyI+LS08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtc3ViIHN0YXQtc3ViIiBpZD0ic3ViLWRlY2lzaW9ucyI+ZGVjaXNpb25zIGF2YWlsYWJsZTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdHVzLWNhcmQgc3RhdC1jYXJkIiBpZD0iY2FyZC1kYXRhc2V0Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaWNvbiI+JiMxMjg0NTE7PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWxhYmVsIHN0YXQtbGFiZWwiPkRhdGFzZXQ8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtdmFsdWUgc3RhdC12YWx1ZSIgaWQ9InZhbC1kYXRhc2V0Ij4tLTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1zdWIgc3RhdC1zdWIiIGlkPSJzdWItZGF0YXNldCI+bm90IGJ1aWx0PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdGF0dXMtY2FyZCBzdGF0LWNhcmQiIGlkPSJjYXJkLW1vZGVsIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaWNvbiI+JiMxMjk1MDQ7PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWxhYmVsIHN0YXQtbGFiZWwiPlBvbGljeSBNb2RlbDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC12YWx1ZSBzdGF0LXZhbHVlIiBpZD0idmFsLW1vZGVsIj4tLTwvZGl2PgogICAgICAgICAgICAgICAg' +
'PGRpdiBjbGFzcz0iY2FyZC1zdWIgc3RhdC1zdWIiIGlkPSJzdWItbW9kZWwiPm5vIGNoZWNrcG9pbnQ8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN0YXR1cy1jYXJkIHN0YXQtY2FyZCIgaWQ9ImNhcmQtc2VydmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtaWNvbiI+JiM5ODg5OzwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1sYWJlbCBzdGF0LWxhYmVsIj5JbmZlcmVuY2UgU2VydmVyPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLXZhbHVlIHN0YXQtdmFsdWUiIGlkPSJ2YWwtc2VydmVyIj4tLTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1zdWIgc3RhdC1zdWIiIGlkPSJzdWItc2VydmVyIj5ub3QgbG9hZGVkPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIFRyYWluaW5nIENvbnRyb2wgUGFuZWwgLS0+CiAgICAgICAgPHNlY3Rpb24gY2xhc3M9InBhbmVsIiBpZD0idHJhaW4tcGFuZWwiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlRyYWluaW5nIFBpcGVsaW5lPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRyYWluLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhcmFtLWdyaWQgZm9ybS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0icGFyYW0tZXBvY2hzIj5FcG9jaHM8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0icGFyYW0tZXBvY2hzIiBjbGFzcz0iZm9ybS1pbnB1dCIgdmFsdWU9IjUwIiBtaW49IjEiIG1heD0iNTAwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0icGFyYW0tbHIiPkxlYXJuaW5nIFJhdGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0icGFyYW0tbHIiIGNsYXNzPSJmb3JtLWlucHV0IiB2YWx1ZT0iMC4wMDEiIHN0ZXA9IjAuMDAwMSIgbWluPSIwLjAwMDAxIiBtYXg9IjAuMSIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWxhYmVsIiBmb3I9InBhcmFtLWJhdGNoIj5CYXRjaCBTaXplPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InBhcmFtLWJhdGNoIiBjbGFzcz0iZm9ybS1pbnB1dCIgdmFsdWU9IjI1NiIgbWluPSIxNiIgbWF4PSIyMDQ4IiBzdGVwPSIxNiIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWxhYmVsIiBmb3I9InBhcmFtLXBhdGllbmNlIj5FYXJseSBTdG9wIFBhdGllbmNlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9InBhcmFtLXBhdGllbmNlIiBjbGFzcz0iZm9ybS1pbnB1dCIgdmFsdWU9IjEwIiBtaW49IjMiIG1heD0iMTAwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0cmFpbi1vcHRpb25zIj4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tY2hlY2tib3ggY2hlY2tib3gtbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJwYXJhbS1yZWJ1aWxkIiBjaGVja2VkIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIFJlYnVpbGQgZGF0YXNldCBmcm9tIGRlY2lzaW9uIGxvZ3MKICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0cmFpbi1hY3Rpb25zIj4KICAg' +
'ICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tdHJhaW4iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9InN0YXJ0VHJhaW5pbmcoKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidG4taWNvbiI+JiM5NjU0Ozwvc3Bhbj4gU3RhcnQgVHJhaW5pbmcKICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tcmVsb2FkIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIG9uY2xpY2s9InJlbG9hZE1vZGVsKCkiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnRuLWljb24iPiYjODYzNTs8L3NwYW4+IFJlbG9hZCBNb2RlbAogICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPCEtLSBQcm9ncmVzcyBTZWN0aW9uIChoaWRkZW4gd2hlbiBpZGxlKSAtLT4KICAgICAgICAgICAgPGRpdiBpZD0idHJhaW4tcHJvZ3Jlc3MiIGNsYXNzPSJ0cmFpbi1wcm9ncmVzcyBoaWRkZW4iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0icHJvZ3Jlc3MtcGhhc2UiIGNsYXNzPSJwaGFzZS1iYWRnZSI+QlVJTERJTkc8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InByb2dyZXNzLW1lc3NhZ2UiPkluaXRpYWxpemluZy4uLjwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyLWNvbnRhaW5lciBwcm9ncmVzcy10cmFjayI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWZpbGwiIGlkPSJwcm9ncmVzcy1iYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1kZXRhaWwiIGlkPSJwcm9ncmVzcy1kZXRhaWwiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgIDwhLS0gRGF0YSBGaWxlcyBQYW5lbCAtLT4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0icGFuZWwiIGlkPSJkYXRhLXBhbmVsIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5UcmFpbmluZyBEYXRhIEZpbGVzPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9ImRhdGEtZmlsZXMtbGlzdCIgY2xhc3M9ImZpbGUtbGlzdCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+TG9hZGluZyBkYXRhIHN0YXR1cy4uLjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgIDwhLS0gRXZhbHVhdGlvbiBSZXN1bHRzIFBhbmVsIC0tPgogICAgICAgIDxzZWN0aW9uIGNsYXNzPSJwYW5lbCIgaWQ9ImV2YWwtcGFuZWwiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPkV2YWx1YXRpb24gUmVzdWx0czwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJldmFsLXJlc3VsdHMiIGNsYXNzPSJldmFsLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+Tm8gZXZhbHVhdGlvbiByZXN1bHRzIHlldC4gVHJhaW4gYSBtb2RlbCBmaXJzdC48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zZWN0aW9uPgoKICAgICAgICA8IS0tIFBQTyBUcmFpbmluZyBQYW5lbCAtLT4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0icGFuZWwiIGlkPSJwcG8tcGFuZWwiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlBQTyBSZWluZm9yY2VtZW50IExlYXJuaW5nPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRyYWluLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhcmFtLWdyaWQgZm9ybS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0icHBvLWl0ZXJhdGlvbnMiPkl0ZXJhdGlvbnM8L2xhYmVsPgogICAgICAgICAgICAgICAgICAg' +
'ICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0icHBvLWl0ZXJhdGlvbnMiIGNsYXNzPSJmb3JtLWlucHV0IiB2YWx1ZT0iMTAwIiBtaW49IjEiIG1heD0iMTAwMCIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWxhYmVsIiBmb3I9InBwby1lcGlzb2RlcyI+RXBpc29kZXMvSXRlcjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJwcG8tZXBpc29kZXMiIGNsYXNzPSJmb3JtLWlucHV0IiB2YWx1ZT0iNjQiIG1pbj0iOCIgbWF4PSI1MTIiIHN0ZXA9IjgiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCIgZm9yPSJwcG8tbHIiPkxlYXJuaW5nIFJhdGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0icHBvLWxyIiBjbGFzcz0iZm9ybS1pbnB1dCIgdmFsdWU9IjAuMDAwMyIgc3RlcD0iMC4wMDAxIiAvPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0icHBvLW9wcG9uZW50Ij5PcHBvbmVudDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9InBwby1vcHBvbmVudCIgY2xhc3M9ImZvcm0tc2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImhldXJpc3RpYyI+SGV1cmlzdGljPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJyYW5kb20iPlJhbmRvbTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ic2VsZiI+U2VsZi1QbGF5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0cmFpbi1vcHRpb25zIj4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tY2hlY2tib3ggY2hlY2tib3gtbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJwcG8tbG9hZC1zdXBlcnZpc2VkIiAvPgogICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsaXplIGZyb20gc3VwZXJ2aXNlZCBjaGVja3BvaW50ICh3YXJtIHN0YXJ0KQogICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRyYWluLWFjdGlvbnMiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1wcG8iIGNsYXNzPSJidG4gYnRuLXB1cnBsZSIgb25jbGljaz0ic3RhcnRQUE8oKSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJidG4taWNvbiI+JiM5NjU0Ozwvc3Bhbj4gU3RhcnQgUFBPIFRyYWluaW5nCiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InBwby1wcm9ncmVzcyIgY2xhc3M9InRyYWluLXByb2dyZXNzIGhpZGRlbiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJwcG8tcHJvZ3Jlc3MtcGhhc2UiIGNsYXNzPSJwaGFzZS1iYWRnZSI+VFJBSU5JTkc8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InBwby1wcm9ncmVzcy1tZXNzYWdlIj5Jbml0aWFsaXppbmcuLi48L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLWJhci1jb250YWluZXIgcHJvZ3Jlc3MtdHJhY2siPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLWJhciBwcm9ncmVzcy1maWxsIiBpZD0icHBvLXByb2dyZXNzLWJhciI+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAg' +
'ICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzLWRldGFpbCIgaWQ9InBwby1wcm9ncmVzcy1kZXRhaWwiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgIDwhLS0gVG91cm5hbWVudCBQYW5lbCAtLT4KICAgICAgICA8c2VjdGlvbiBjbGFzcz0icGFuZWwiIGlkPSJ0b3VybmFtZW50LXBhbmVsIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFuZWwtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5Ub3VybmFtZW50IEV2YWx1YXRpb248L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idHJhaW4tY29udHJvbHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFyYW0tZ3JpZCBmb3JtLXJvdyB0b3VybmV5LXBhcmFtLWdyaWQiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tbGFiZWwiIGZvcj0idG91cm5leS1lcGlzb2RlcyI+R2FtZXMgcGVyIE1hdGNodXA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0idG91cm5leS1lcGlzb2RlcyIgY2xhc3M9ImZvcm0taW5wdXQiIHZhbHVlPSI1MCIgbWluPSIxMCIgbWF4PSI1MDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1sYWJlbCIgZm9yPSJ0b3VybmV5LXN0eWxlIj5QbGF5c3R5bGU8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJ0b3VybmV5LXN0eWxlIiBjbGFzcz0iZm9ybS1zZWxlY3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibWlkcmFuZ2UiPk1pZHJhbmdlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJhZ2dybyI+QWdncm88L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImNvbnRyb2wiPkNvbnRyb2w8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9ImNvbWJvIj5Db21ibzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idHJhaW4tYWN0aW9ucyI+CiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLXRvdXJuZXkiIGNsYXNzPSJidG4gYnRuLXN1Y2Nlc3MiIG9uY2xpY2s9InN0YXJ0VG91cm5hbWVudCgpIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ0bi1pY29uIj4mIzEyNzk0Mjs8L3NwYW4+IFJ1biBUb3VybmFtZW50CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvdXJuZXktcHJvZ3Jlc3MiIGNsYXNzPSJ0cmFpbi1wcm9ncmVzcyBoaWRkZW4iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0idG91cm5leS1wcm9ncmVzcy1waGFzZSIgY2xhc3M9InBoYXNlLWJhZGdlIHJ1bm5pbmciPlJVTk5JTkc8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InRvdXJuZXktcHJvZ3Jlc3MtbWVzc2FnZSI+UnVubmluZyBtYXRjaGVzLi4uPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXItY29udGFpbmVyIHByb2dyZXNzLXRyYWNrIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9ncmVzcy1iYXIgcHJvZ3Jlc3MtZmlsbCIgaWQ9InRvdXJuZXktcHJvZ3Jlc3MtYmFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0idG91cm5leS1yZXN1bHRzIiBjbGFzcz0iZXZhbC1jb250YWluZXIgdG91cm5leS1yZXN1bHRzLXNlY3Rpb24iPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3NlY3Rpb24+CgogICAgICAgIDwhLS0gQ2hlY2twb2ludCBIaXN0b3J5IC0tPgogICAgICAgIDxzZWN0aW9u' +
'IGNsYXNzPSJwYW5lbCIgaWQ9ImNoZWNrcG9pbnQtcGFuZWwiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1oZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPk1vZGVsIENoZWNrcG9pbnRzPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9ImNoZWNrcG9pbnQtbGlzdCIgY2xhc3M9ImNoZWNrcG9pbnQtbGlzdCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+Tm8gY2hlY2twb2ludHMgZm91bmQuPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvc2VjdGlvbj4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQgc3JjPSJ0cmFpbmluZy5qcyI+PC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo='
Install-B64 -R 'ui\training.html' -B $b
# ui/training.js (27,571 bytes)
$b = 'LyoqCiAqIENvbW1hbmRlciBBSSBMYWIg4oCUIE1MIFRyYWluaW5nIERhc2hib2FyZAogKiBNYW5hZ2VzIHRyYWluaW5nIHBpcGVsaW5lLCBkYXRhIHN0YXR1cywgYW5kIGV2YWx1YXRpb24gZGlzcGxheS4KICovCgpjb25zdCBBUElfQkFTRSA9ICcnOyAgLy8gU2FtZSBvcmlnaW4KCi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAovLyBTdGF0ZQovLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKCmxldCBwb2xsaW5nSW50ZXJ2YWwgPSBudWxsOwpsZXQgaXNUcmFpbmluZyA9IGZhbHNlOwoKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCi8vIEluaXQKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gewogICAgcmVmcmVzaERhdGFTdGF0dXMoKTsKICAgIHJlZnJlc2hUcmFpbmluZ1N0YXR1cygpOwp9KTsKCmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hBbGwoKSB7CiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLXJlZnJlc2gtZGF0YScpOwogICAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWZyZXNoLWljb24nKTsKICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICBpY29uLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKICAgIGljb24uc3R5bGUuYW5pbWF0aW9uID0gJ3NwaW4gMC44cyBsaW5lYXIgaW5maW5pdGUnOwogICAgdHJ5IHsKICAgICAgICBhd2FpdCByZWZyZXNoRGF0YVN0YXR1cygpOwogICAgICAgIGF3YWl0IHJlZnJlc2hUcmFpbmluZ1N0YXR1cygpOwogICAgfSBmaW5hbGx5IHsKICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBpY29uLnN0eWxlLmFuaW1hdGlvbiA9ICcnOwogICAgfQp9CgovLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKLy8gRGF0YSBTdGF0dXMKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgphc3luYyBmdW5jdGlvbiByZWZyZXNoRGF0YVN0YXR1cygpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9tbC9kYXRhL3N0YXR1c2ApOwogICAgICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXMuc3RhdHVzfWApOwogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgIHJlbmRlckRhdGFTdGF0dXMoZGF0YSk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggZGF0YSBzdGF0dXM6JywgZXJyKTsKICAgIH0KfQoKZnVuY3Rpb24gcmVuZGVyRGF0YVN0YXR1cyhkYXRhKSB7CiAgICAvLyBTdGF0dXMgY2FyZHMKICAgIGNvbnN0IHRvdGFsRGVjaXNpb25zID0gZGF0YS50b3RhbERlY2lzaW9ucyB8fCAwOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbC1kZWNpc2lvbnMnKS50ZXh0Q29udGVudCA9IHRvdGFsRGVjaXNpb25zLnRvTG9jYWxlU3RyaW5nKCk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViLWRlY2lzaW9ucycpLnRleHRDb250ZW50ID0KICAgICAgICBkYXRhLmRlY2lzaW9uRmlsZXMubGVuZ3RoID4gMAogICAgICAgICAgICA/IGAk' +
'e2RhdGEuZGVjaXNpb25GaWxlcy5sZW5ndGh9IGZpbGUke2RhdGEuZGVjaXNpb25GaWxlcy5sZW5ndGggIT09IDEgPyAncycgOiAnJ31gCiAgICAgICAgICAgIDogJ25vIGRlY2lzaW9uIGxvZ3MnOwoKICAgIGNvbnN0IGNhcmREYXRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmQtZGF0YScpOwogICAgY2FyZERhdGEuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgdG90YWxEZWNpc2lvbnMgPiAwKTsKCiAgICAvLyBEYXRhc2V0IGNhcmQKICAgIGNvbnN0IHRyYWluRGF0YSA9IGRhdGEuZGF0YXNldHMudHJhaW47CiAgICBpZiAodHJhaW5EYXRhKSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbC1kYXRhc2V0JykudGV4dENvbnRlbnQgPSB0cmFpbkRhdGEuc2FtcGxlcy50b0xvY2FsZVN0cmluZygpOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWItZGF0YXNldCcpLnRleHRDb250ZW50ID0KICAgICAgICAgICAgYCR7dHJhaW5EYXRhLmZlYXR1cmVzfSBmZWF0dXJlc2A7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmQtZGF0YXNldCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmFsLWRhdGFzZXQnKS50ZXh0Q29udGVudCA9ICctLSc7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1Yi1kYXRhc2V0JykudGV4dENvbnRlbnQgPSAnbm90IGJ1aWx0JzsKICAgIH0KCiAgICAvLyBNb2RlbCBjYXJkCiAgICBpZiAoZGF0YS5jaGVja3BvaW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgY29uc3QgbGF0ZXN0ID0gZGF0YS5jaGVja3BvaW50c1tkYXRhLmNoZWNrcG9pbnRzLmxlbmd0aCAtIDFdOwogICAgICAgIGNvbnN0IHNpemVLQiA9IChsYXRlc3Quc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMCk7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbC1tb2RlbCcpLnRleHRDb250ZW50ID0gYCR7c2l6ZUtCfSBLQmA7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1Yi1tb2RlbCcpLnRleHRDb250ZW50ID0gbGF0ZXN0Lm5hbWU7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhcmQtbW9kZWwnKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbC1tb2RlbCcpLnRleHRDb250ZW50ID0gJy0tJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViLW1vZGVsJykudGV4dENvbnRlbnQgPSAnbm8gY2hlY2twb2ludCc7CiAgICB9CgogICAgLy8gU2VydmVyIGNhcmQKICAgIGlmIChkYXRhLnBvbGljeUxvYWRlZCkgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2YWwtc2VydmVyJykudGV4dENvbnRlbnQgPSAnT25saW5lJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViLXNlcnZlcicpLnRleHRDb250ZW50ID0gJ3JlYWR5IGZvciBpbmZlcmVuY2UnOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkLXNlcnZlcicpLmNsYXNzTGlzdC5hZGQoJ3N1Y2Nlc3MnKTsKICAgIH0gZWxzZSB7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZhbC1zZXJ2ZXInKS50ZXh0Q29udGVudCA9ICdPZmZsaW5lJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3ViLXNlcnZlcicpLnRleHRDb250ZW50ID0gJ25vdCBsb2FkZWQnOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYXJkLXNlcnZlcicpLmNsYXNzTGlzdC5yZW1vdmUoJ3N1Y2Nlc3MnKTsKICAgIH0KCiAgICAvLyBEYXRhIGZpbGVzIGxpc3QKICAgIHJlbmRlckRhdGFGaWxlcyhkYXRhKTsKCiAgICAvLyBFdmFsIHJlc3VsdHMKICAgIGlmIChkYXRhLmV2YWxSZXN1bHRzKSB7CiAgICAgICAgcmVuZGVyRXZhbHVhdGlvbihkYXRhLmV2YWxSZXN1bHRzKTsKICAgIH0KCiAgICAvLyBDaGVja3BvaW50cwogICAgcmVuZGVyQ2hlY2twb2ludHMoZGF0YS5jaGVja3BvaW50cyk7Cn0KCmZ1bmN0aW9uIHJlbmRlckRhdGFGaWxlcyhkYXRhKSB7CiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGF0YS1maWxlcy1saXN0Jyk7CgogICAgaWYgKGRhdGEuZGVjaXNpb25GaWxlcy5sZW5ndGggPT09IDAgJiYgT2JqZWN0LmtleXMoZGF0YS5kYXRhc2V0cykubGVuZ3RoID09PSAwKSB7CiAgICAgICAgY29udGFpbmVy' +
'LmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+Tm8gdHJhaW5pbmcgZGF0YSBmb3VuZC4gUnVuIGJhdGNoIHNpbXVsYXRpb25zIHdpdGggTUwgbG9nZ2luZyBlbmFibGVkIHRvIGdlbmVyYXRlIGRlY2lzaW9uIGRhdGEuPC9kaXY+JzsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGV0IGh0bWwgPSAnJzsKCiAgICAvLyBEZWNpc2lvbiBsb2cgZmlsZXMKICAgIGZvciAoY29uc3QgZiBvZiBkYXRhLmRlY2lzaW9uRmlsZXMpIHsKICAgICAgICBjb25zdCBzaXplS0IgPSAoZi5zaXplIC8gMTAyNCkudG9GaXhlZCgxKTsKICAgICAgICBodG1sICs9IGAKICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmlsZS1yb3ciPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZpbGUtbmFtZSI+JHtmLm5hbWV9PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZpbGUtbWV0YSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtmLmRlY2lzaW9ucy50b0xvY2FsZVN0cmluZygpfSBkZWNpc2lvbnM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtzaXplS0J9IEtCPC9zcGFuPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIC8vIERhdGFzZXQgc3BsaXRzCiAgICBmb3IgKGNvbnN0IFtzcGxpdCwgaW5mb10gb2YgT2JqZWN0LmVudHJpZXMoZGF0YS5kYXRhc2V0cykpIHsKICAgICAgICBjb25zdCBiYWRnZUNsYXNzID0gc3BsaXQgPT09ICd0cmFpbicgPyAnYmFkZ2UtdHJhaW4nIDogc3BsaXQgPT09ICd2YWwnID8gJ2JhZGdlLXZhbCcgOiAnYmFkZ2UtdGVzdCc7CiAgICAgICAgY29uc3Qgc2l6ZUtCID0gKGluZm8uc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSk7CiAgICAgICAgaHRtbCArPSBgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbGUtcm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmaWxlLW5hbWUiPiR7c3BsaXR9Lm5weiA8c3BhbiBjbGFzcz0iYmFkZ2UgJHtiYWRnZUNsYXNzfSI+JHtzcGxpdH08L3NwYW4+PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZpbGUtbWV0YSI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHsoaW5mby5zYW1wbGVzIHx8IDApLnRvTG9jYWxlU3RyaW5nKCl9IHNhbXBsZXM8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHtzaXplS0J9IEtCPC9zcGFuPgogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj5gOwogICAgfQoKICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwp9CgpmdW5jdGlvbiByZW5kZXJDaGVja3BvaW50cyhjaGVja3BvaW50cykgewogICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrcG9pbnQtbGlzdCcpOwogICAgaWYgKCFjaGVja3BvaW50cyB8fCBjaGVja3BvaW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj5ObyBjaGVja3BvaW50cyBmb3VuZC4gVHJhaW4gYSBtb2RlbCB0byBnZW5lcmF0ZSBjaGVja3BvaW50cy48L2Rpdj4nOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsZXQgaHRtbCA9ICcnOwogICAgZm9yIChjb25zdCBja3B0IG9mIGNoZWNrcG9pbnRzLnJldmVyc2UoKSkgewogICAgICAgIGNvbnN0IHNpemVLQiA9IChja3B0LnNpemUgLyAxMDI0KS50b0ZpeGVkKDApOwogICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShja3B0Lm1vZGlmaWVkKTsKICAgICAgICBjb25zdCB0aW1lU3RyID0gZGF0ZS50b0xvY2FsZVN0cmluZygpOwogICAgICAgIGh0bWwgKz0gYAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJja3B0LXJvdyI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2twdC1uYW1lIj4ke2NrcHQubmFtZX08L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2twdC1tZXRhIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke3NpemVLQn0gS0I8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHt0aW1lU3RyfTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+YDsKICAgIH0KICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwp9CgovLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi' +
'lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAKLy8gRXZhbHVhdGlvbiBEaXNwbGF5Ci8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKZnVuY3Rpb24gcmVuZGVyRXZhbHVhdGlvbihyZXN1bHRzKSB7CiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZhbC1yZXN1bHRzJyk7CiAgICBpZiAoIXJlc3VsdHMpIHsKICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImVtcHR5LXN0YXRlIj5ObyBldmFsdWF0aW9uIHJlc3VsdHMgeWV0LiBUcmFpbiBhIG1vZGVsIGZpcnN0LjwvZGl2Pic7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNvbnN0IGFjY3VyYWN5ID0gcmVzdWx0cy5hY2N1cmFjeSB8fCAwOwogICAgY29uc3QgYWNjQ2xhc3MgPSBhY2N1cmFjeSA+PSAwLjUgPyAnZ29vZCcgOiBhY2N1cmFjeSA+PSAwLjMgPyAnb2snIDogJ2JhZCc7CiAgICBjb25zdCBzYW1wbGVzID0gcmVzdWx0cy50b3RhbF9zYW1wbGVzIHx8IDA7CiAgICBjb25zdCB0b3BLID0gcmVzdWx0cy50b3BfM19hY2N1cmFjeSB8fCAwOwoKICAgIGxldCBodG1sID0gYAogICAgICAgIDxkaXYgY2xhc3M9ImV2YWwtc3VtbWFyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2YWwtbWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV2YWwtbWV0cmljLWxhYmVsIj5UZXN0IEFjY3VyYWN5PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmFsLW1ldHJpYy12YWx1ZSAke2FjY0NsYXNzfSI+JHsoYWNjdXJhY3kgKiAxMDApLnRvRml4ZWQoMSl9JTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZhbC1tZXRyaWMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXZhbC1tZXRyaWMtbGFiZWwiPlRvcC0zIEFjY3VyYWN5PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmFsLW1ldHJpYy12YWx1ZSI+JHsodG9wSyAqIDEwMCkudG9GaXhlZCgxKX0lPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmFsLW1ldHJpYyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmFsLW1ldHJpYy1sYWJlbCI+VGVzdCBTYW1wbGVzPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJldmFsLW1ldHJpYy12YWx1ZSI+JHtzYW1wbGVzLnRvTG9jYWxlU3RyaW5nKCl9PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PmA7CgogICAgLy8gUGVyLWNsYXNzIGFjY3VyYWN5CiAgICBpZiAocmVzdWx0cy5wZXJfY2xhc3NfYWNjdXJhY3kpIHsKICAgICAgICBodG1sICs9ICc8aDMgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7IG1hcmdpbi1ib3R0b206IDhweDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2ZmZjsiPlBlci1BY3Rpb24gQWNjdXJhY3k8L2gzPic7CiAgICAgICAgaHRtbCArPSAnPHRhYmxlIGNsYXNzPSJjbGFzcy10YWJsZSI+PHRoZWFkPjx0cj48dGg+QWN0aW9uPC90aD48dGg+QWNjdXJhY3k8L3RoPjx0aCBzdHlsZT0id2lkdGg6IDQwJSI+PC90aD48dGg+U3VwcG9ydDwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4nOwoKICAgICAgICBjb25zdCBhY3Rpb25zID0gcmVzdWx0cy5wZXJfY2xhc3NfYWNjdXJhY3k7CiAgICAgICAgZm9yIChjb25zdCBbYWN0aW9uLCBhY2NdIG9mIE9iamVjdC5lbnRyaWVzKGFjdGlvbnMpKSB7CiAgICAgICAgICAgIGNvbnN0IHBjdCA9IChhY2MgKiAxMDApLnRvRml4ZWQoMSk7CiAgICAgICAgICAgIGNvbnN0IGJhckNvbG9yID0gYWNjID49IDAuNSA/ICd2YXIoLS1sYWItc3VjY2VzcyknIDogYWNjID49IDAuMyA/ICd2YXIoLS1sYWItd2FybmluZyknIDogJ3ZhcigtLWxhYi1lcnJvciknOwogICAgICAgICAgICBjb25zdCBzdXBwb3J0ID0gcmVzdWx0cy5wZXJfY2xhc3Nfc3VwcG9ydCA/IChyZXN1bHRzLnBlcl9jbGFzc19zdXBwb3J0W2FjdGlvbl0gfHwgJy0tJykgOiAnLS0nOwogICAgICAgICAgICBodG1sICs9IGAKICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9ImNvbG9yOiB2YXIoLS1sYWItYWNjZW50KTsgZm9udC13ZWlnaHQ6IDYwMDsiPiR7YWN0aW9ufTwvdGQ+CiAgICAgICAgICAgICAgICAg' +
'ICAgPHRkPiR7cGN0fSU8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWNjLWJhci1iZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY2MtYmFyIiBzdHlsZT0id2lkdGg6ICR7cGN0fSU7IGJhY2tncm91bmQ6ICR7YmFyQ29sb3J9OyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJjb2xvcjogdmFyKC0tbGFiLXRleHQtZGltKTsiPiR7c3VwcG9ydH08L3RkPgogICAgICAgICAgICAgICAgPC90cj5gOwogICAgICAgIH0KICAgICAgICBodG1sICs9ICc8L3Rib2R5PjwvdGFibGU+JzsKICAgIH0KCiAgICAvLyBDb25mdXNpb24gbWF0cml4CiAgICBpZiAocmVzdWx0cy5jb25mdXNpb25fbWF0cml4ICYmIHJlc3VsdHMuY2xhc3NfbmFtZXMpIHsKICAgICAgICBodG1sICs9ICc8aDMgc3R5bGU9Im1hcmdpbi10b3A6IDE2cHg7IG1hcmdpbi1ib3R0b206IDhweDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogI2ZmZjsiPkNvbmZ1c2lvbiBNYXRyaXg8L2gzPic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iY29uZnVzaW9uLW1hdHJpeCI+PHRhYmxlPic7CiAgICAgICAgaHRtbCArPSAnPHRyPjx0aD48L3RoPic7CiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMuY2xhc3NfbmFtZXMpIHsKICAgICAgICAgICAgY29uc3Qgc2hvcnQgPSBuYW1lLnJlcGxhY2UoJ2Nhc3RfJywgJycpLnJlcGxhY2UoJ2FjdGl2YXRlXycsICdhY3RfJykuc3Vic3RyaW5nKDAsIDgpOwogICAgICAgICAgICBodG1sICs9IGA8dGg+JHtzaG9ydH08L3RoPmA7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvdHI+JzsKCiAgICAgICAgY29uc3QgbWF0cml4ID0gcmVzdWx0cy5jb25mdXNpb25fbWF0cml4OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0cml4Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHNob3J0TmFtZSA9IHJlc3VsdHMuY2xhc3NfbmFtZXNbaV0ucmVwbGFjZSgnY2FzdF8nLCAnJykucmVwbGFjZSgnYWN0aXZhdGVfJywgJ2FjdF8nKS5zdWJzdHJpbmcoMCwgOCk7CiAgICAgICAgICAgIGh0bWwgKz0gYDx0cj48dGQgY2xhc3M9InJvdy1sYWJlbCI+JHtzaG9ydE5hbWV9PC90ZD5gOwogICAgICAgICAgICBjb25zdCByb3dNYXggPSBNYXRoLm1heCguLi5tYXRyaXhbaV0pOwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1hdHJpeFtpXS5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY29uc3QgdmFsID0gbWF0cml4W2ldW2pdOwogICAgICAgICAgICAgICAgY29uc3QgaW50ZW5zaXR5ID0gcm93TWF4ID4gMCA/IHZhbCAvIHJvd01heCA6IDA7CiAgICAgICAgICAgICAgICBsZXQgYmcgPSAndHJhbnNwYXJlbnQnOwogICAgICAgICAgICAgICAgaWYgKGkgPT09IGopIHsKICAgICAgICAgICAgICAgICAgICBiZyA9IGByZ2JhKDYzLCAxODUsIDgwLCAke2ludGVuc2l0eSAqIDAuNH0pYDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsID4gMCkgewogICAgICAgICAgICAgICAgICAgIGJnID0gYHJnYmEoMjQ4LCA4MSwgNzMsICR7aW50ZW5zaXR5ICogMC4zfSlgOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSJiYWNrZ3JvdW5kOiAke2JnfTsiPiR7dmFsfTwvdGQ+YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBodG1sICs9ICc8L3RyPic7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvdGFibGU+PC9kaXY+JzsKICAgIH0KCiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKfQoKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCi8vIFRyYWluaW5nIENvbnRyb2wKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgphc3luYyBmdW5jdGlvbiBzdGFydFRyYWluaW5nKCkgewogICAgY29uc3QgZXBvY2hzID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxl' +
'bWVudEJ5SWQoJ3BhcmFtLWVwb2NocycpLnZhbHVlKSB8fCA1MDsKICAgIGNvbnN0IGxyID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFyYW0tbHInKS52YWx1ZSkgfHwgMC4wMDE7CiAgICBjb25zdCBiYXRjaFNpemUgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFyYW0tYmF0Y2gnKS52YWx1ZSkgfHwgMjU2OwogICAgY29uc3QgcGF0aWVuY2UgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFyYW0tcGF0aWVuY2UnKS52YWx1ZSkgfHwgMTA7CiAgICBjb25zdCByZWJ1aWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcmFtLXJlYnVpbGQnKS5jaGVja2VkOwoKICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tdHJhaW4nKTsKICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJidG4taWNvbiI+JiM4OTg3Ozwvc3Bhbj4gU3RhcnRpbmcuLi4nOwoKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9tbC90cmFpbmAsIHsKICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LAogICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGVwb2NocywgbHIsIGJhdGNoU2l6ZSwgcGF0aWVuY2UsIHJlYnVpbGREYXRhc2V0OiByZWJ1aWxkIH0pLAogICAgICAgIH0pOwoKICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLmRldGFpbCB8fCBgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICAgICAgfQoKICAgICAgICBpc1RyYWluaW5nID0gdHJ1ZTsKICAgICAgICBzaG93UHJvZ3Jlc3MoKTsKICAgICAgICBzdGFydFBvbGxpbmcoKTsKCiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBhbGVydCgnRmFpbGVkIHRvIHN0YXJ0IHRyYWluaW5nOiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9ImJ0bi1pY29uIj4mIzk2NTQ7PC9zcGFuPiBTdGFydCBUcmFpbmluZyc7CiAgICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIHJlbG9hZE1vZGVsKCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL21sL3JlbG9hZGAsIHsgbWV0aG9kOiAnUE9TVCcgfSk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgaWYgKGRhdGEuc3VjY2VzcykgewogICAgICAgICAgICBhbGVydCgnUG9saWN5IG1vZGVsIHJlbG9hZGVkIHN1Y2Nlc3NmdWxseS4nKTsKICAgICAgICAgICAgcmVmcmVzaERhdGFTdGF0dXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhbGVydCgnTW9kZWwgcmVsb2FkIGZhaWxlZC4gQ2hlY2sgaWYgYSBjaGVja3BvaW50IGV4aXN0cy4nKTsKICAgICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBhbGVydCgnUmVsb2FkIGZhaWxlZDogJyArIGVyci5tZXNzYWdlKTsKICAgIH0KfQoKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCi8vIFByb2dyZXNzIFBvbGxpbmcKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpmdW5jdGlvbiBzaG93UHJvZ3Jlc3MoKSB7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHJhaW4tcHJvZ3Jlc3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKfQoKZnVuY3Rpb24gaGlkZVByb2dyZXNzKCkgewogICAgLy8gS2VlcCB2aXNpYmxlIHNvIHVzZXIgY2FuIHNlZSBmaW5hbCByZXN1bHQKfQoKZnVuY3Rpb24gc3RhcnRQb2xsaW5nKCkgewogICAgaWYgKHBvbGxpbmdJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChwb2xsaW5nSW50ZXJ2YWwpOwogICAgcG9sbGluZ0ludGVydmFsID0gc2V0SW50ZXJ2YWwocG9sbFRyYWlu' +
'aW5nU3RhdHVzLCAyMDAwKTsKfQoKZnVuY3Rpb24gc3RvcFBvbGxpbmcoKSB7CiAgICBpZiAocG9sbGluZ0ludGVydmFsKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsaW5nSW50ZXJ2YWwpOwogICAgICAgIHBvbGxpbmdJbnRlcnZhbCA9IG51bGw7CiAgICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hUcmFpbmluZ1N0YXR1cygpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9tbC90cmFpbi9zdGF0dXNgKTsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKCiAgICAgICAgaWYgKGRhdGEucnVubmluZykgewogICAgICAgICAgICBpc1RyYWluaW5nID0gdHJ1ZTsKICAgICAgICAgICAgc2hvd1Byb2dyZXNzKCk7CiAgICAgICAgICAgIHVwZGF0ZVByb2dyZXNzKGRhdGEpOwogICAgICAgICAgICBzdGFydFBvbGxpbmcoKTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGEucGhhc2UgPT09ICdkb25lJyB8fCBkYXRhLnBoYXNlID09PSAnZXJyb3InKSB7CiAgICAgICAgICAgIHNob3dQcm9ncmVzcygpOwogICAgICAgICAgICB1cGRhdGVQcm9ncmVzcyhkYXRhKTsKICAgICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAvLyBTaWxlbnRseSBmYWlsIG9uIGluaXRpYWwgY2hlY2sKICAgIH0KfQoKYXN5bmMgZnVuY3Rpb24gcG9sbFRyYWluaW5nU3RhdHVzKCkgewogICAgdHJ5IHsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRX0vYXBpL21sL3RyYWluL3N0YXR1c2ApOwogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgIHVwZGF0ZVByb2dyZXNzKGRhdGEpOwoKICAgICAgICBpZiAoIWRhdGEucnVubmluZykgewogICAgICAgICAgICBzdG9wUG9sbGluZygpOwogICAgICAgICAgICBpc1RyYWluaW5nID0gZmFsc2U7CgogICAgICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLXRyYWluJyk7CiAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJidG4taWNvbiI+JiM5NjU0Ozwvc3Bhbj4gU3RhcnQgVHJhaW5pbmcnOwoKICAgICAgICAgICAgLy8gUmVmcmVzaCBhbGwgZGF0YQogICAgICAgICAgICByZWZyZXNoRGF0YVN0YXR1cygpOwogICAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BvbGwgZmFpbGVkOicsIGVycik7CiAgICB9Cn0KCi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAovLyBQUE8gVHJhaW5pbmcKLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQCgpsZXQgcHBvUG9sbGluZ0ludGVydmFsID0gbnVsbDsKCmFzeW5jIGZ1bmN0aW9uIHN0YXJ0UFBPKCkgewogICAgY29uc3QgaXRlcmF0aW9ucyA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcG8taXRlcmF0aW9ucycpLnZhbHVlKSB8fCAxMDA7CiAgICBjb25zdCBlcGlzb2Rlc1Blckl0ZXIgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBvLWVwaXNvZGVzJykudmFsdWUpIHx8IDY0OwogICAgY29uc3QgbHIgPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcG8tbHInKS52YWx1ZSkgfHwgM2UtNDsKICAgIGNvbnN0IG9wcG9uZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bwby1vcHBvbmVudCcpLnZhbHVlOwogICAgY29uc3QgbG9hZFN1cGVydmlzZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBvLWxvYWQtc3VwZXJ2aXNlZCcpLmNoZWNrZWQKICAgICAgICA/ICdtbC9tb2RlbHMvY2hlY2twb2ludHMvYmVzdF9wb2xpY3kucHQnIDogJyc7CgogICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bi1wcG8nKTsKICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJidG4taWNvbiI+JiM4OTg3Ozwvc3Bhbj4gU3RhcnRpbmcuLi4nOwoKICAgIHRyeSB7CiAgICAg' +
'ICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9tbC90cmFpbi9wcG9gLCB7CiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpdGVyYXRpb25zLCBlcGlzb2Rlc1Blckl0ZXIsIGxyLCBvcHBvbmVudCwgbG9hZFN1cGVydmlzZWQgfSksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXMub2spIHsKICAgICAgICAgICAgY29uc3QgZXJyID0gYXdhaXQgcmVzLmpzb24oKTsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyci5kZXRhaWwgfHwgYEhUVFAgJHtyZXMuc3RhdHVzfWApOwogICAgICAgIH0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBvLXByb2dyZXNzJykuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7CiAgICAgICAgc3RhcnRQUE9Qb2xsaW5nKCk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICBhbGVydCgnRmFpbGVkIHRvIHN0YXJ0IFBQTzogJyArIGVyci5tZXNzYWdlKTsKICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJidG4taWNvbiI+JiM5NjU0Ozwvc3Bhbj4gU3RhcnQgUFBPIFRyYWluaW5nJzsKICAgIH0KfQoKZnVuY3Rpb24gc3RhcnRQUE9Qb2xsaW5nKCkgewogICAgaWYgKHBwb1BvbGxpbmdJbnRlcnZhbCkgY2xlYXJJbnRlcnZhbChwcG9Qb2xsaW5nSW50ZXJ2YWwpOwogICAgcHBvUG9sbGluZ0ludGVydmFsID0gc2V0SW50ZXJ2YWwocG9sbFBQT1N0YXR1cywgMjAwMCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHBvbGxQUE9TdGF0dXMoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvbWwvdHJhaW4vcHBvL3N0YXR1c2ApOwogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgIHVwZGF0ZVBQT1Byb2dyZXNzKGRhdGEpOwoKICAgICAgICBpZiAoIWRhdGEucnVubmluZyAmJiBkYXRhLnBoYXNlICE9PSAnaWRsZScpIHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChwcG9Qb2xsaW5nSW50ZXJ2YWwpOwogICAgICAgICAgICBwcG9Qb2xsaW5nSW50ZXJ2YWwgPSBudWxsOwogICAgICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLXBwbycpOwogICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0iYnRuLWljb24iPiYjOTY1NDs8L3NwYW4+IFN0YXJ0IFBQTyBUcmFpbmluZyc7CiAgICAgICAgICAgIHJlZnJlc2hEYXRhU3RhdHVzKCk7CiAgICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoJ1BQTyBwb2xsIGVycm9yOicsIGVycik7IH0KfQoKZnVuY3Rpb24gdXBkYXRlUFBPUHJvZ3Jlc3MoZGF0YSkgewogICAgY29uc3QgcGhhc2UgPSBkYXRhLnBoYXNlIHx8ICdpZGxlJzsKICAgIGNvbnN0IHBoYXNlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBvLXByb2dyZXNzLXBoYXNlJyk7CiAgICBwaGFzZUVsLnRleHRDb250ZW50ID0gcGhhc2UudG9VcHBlckNhc2UoKTsKICAgIHBoYXNlRWwuY2xhc3NOYW1lID0gJ3BoYXNlLWJhZGdlICcgKyBwaGFzZTsKCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBvLXByb2dyZXNzLW1lc3NhZ2UnKS50ZXh0Q29udGVudCA9IGRhdGEubWVzc2FnZSB8fCAnJzsKCiAgICBjb25zdCBiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBvLXByb2dyZXNzLWJhcicpOwogICAgYmFyLmNsYXNzTmFtZSA9ICdwcm9ncmVzcy1iYXInOwogICAgaWYgKHBoYXNlID09PSAnZG9uZScpIHsKICAgICAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgICAgYmFyLmNsYXNzTGlzdC5hZGQoJ2RvbmUnKTsKICAgIH0gZWxzZSBpZiAocGhhc2UgPT09ICdlcnJvcicpIHsKICAgICAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgICAgYmFyLmNsYXNzTGlzdC5hZGQoJ2Vycm9yJyk7CiAgICB9IGVsc2UgaWYgKGRhdGEudG90YWxfaXRlcmF0aW9ucyA+IDApIHsKICAgICAgICBiYXIuc3R5bGUud2lkdGggPSBNYXRoLm1pbigxMDAsIChkYXRhLml0ZXJhdGlvbiAvIGRhdGEudG90YWxfaXRlcmF0aW9ucykgKiAxMDApICsgJyUnOwogICAgfQoKICAgIGNvbnN0' +
'IGRldGFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcG8tcHJvZ3Jlc3MtZGV0YWlsJyk7CiAgICBpZiAoZGF0YS5tZXRyaWNzKSB7CiAgICAgICAgY29uc3QgbSA9IGRhdGEubWV0cmljczsKICAgICAgICBkZXRhaWwudGV4dENvbnRlbnQgPSBgV2luIFJhdGU6ICR7KChtLndpbl9yYXRlfHwwKSoxMDApLnRvRml4ZWQoMCl9JSB8IFBvbGljeSBMb3NzOiAkeyhtLnBvbGljeV9sb3NzfHwwKS50b0ZpeGVkKDQpfSB8IEVudHJvcHk6ICR7KG0uZW50cm9weXx8MCkudG9GaXhlZCgzKX1gOwogICAgfSBlbHNlIGlmIChwaGFzZSA9PT0gJ2RvbmUnICYmIGRhdGEucmVzdWx0KSB7CiAgICAgICAgZGV0YWlsLnRleHRDb250ZW50ID0gYEJlc3QgV2luIFJhdGU6ICR7KChkYXRhLnJlc3VsdC5iZXN0X3dpbl9yYXRlfHwwKSoxMDApLnRvRml4ZWQoMCl9JSB8ICR7ZGF0YS5yZXN1bHQudG90YWxfc3RlcHN9IHRvdGFsIHN0ZXBzYDsKICAgIH0gZWxzZSBpZiAocGhhc2UgPT09ICdlcnJvcicpIHsKICAgICAgICBkZXRhaWwudGV4dENvbnRlbnQgPSBkYXRhLmVycm9yIHx8ICcnOwogICAgICAgIGRldGFpbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1sYWItZXJyb3IpJzsKICAgIH0gZWxzZSB7CiAgICAgICAgZGV0YWlsLnRleHRDb250ZW50ID0gJyc7CiAgICB9Cn0KCi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAovLyBUb3VybmFtZW50Ci8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkAoKbGV0IHRvdXJuZXlQb2xsaW5nSW50ZXJ2YWwgPSBudWxsOwoKYXN5bmMgZnVuY3Rpb24gc3RhcnRUb3VybmFtZW50KCkgewogICAgY29uc3QgZXBpc29kZXMgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG91cm5leS1lcGlzb2RlcycpLnZhbHVlKSB8fCA1MDsKICAgIGNvbnN0IHBsYXlzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3VybmV5LXN0eWxlJykudmFsdWU7CgogICAgY29uc3QgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bi10b3VybmV5Jyk7CiAgICBidG4uZGlzYWJsZWQgPSB0cnVlOwogICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0iYnRuLWljb24iPiYjODk4Nzs8L3NwYW4+IFJ1bm5pbmcuLi4nOwoKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9tbC90b3VybmFtZW50YCwgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZXBpc29kZXMsIHBsYXlzdHlsZSB9KSwKICAgICAgICB9KTsKICAgICAgICBpZiAoIXJlcy5vaykgewogICAgICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXMuanNvbigpOwogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyLmRldGFpbCB8fCBgSFRUUCAke3Jlcy5zdGF0dXN9YCk7CiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b3VybmV5LXByb2dyZXNzJykuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7CiAgICAgICAgc3RhcnRUb3VybmV5UG9sbGluZygpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgYWxlcnQoJ0ZhaWxlZCB0byBzdGFydCB0b3VybmFtZW50OiAnICsgZXJyLm1lc3NhZ2UpOwogICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9ImJ0bi1pY29uIj4mIzEyNzk0Mjs8L3NwYW4+IFJ1biBUb3VybmFtZW50JzsKICAgIH0KfQoKZnVuY3Rpb24gc3RhcnRUb3VybmV5UG9sbGluZygpIHsKICAgIGlmICh0b3VybmV5UG9sbGluZ0ludGVydmFsKSBjbGVhckludGVydmFsKHRvdXJuZXlQb2xsaW5nSW50ZXJ2YWwpOwogICAgdG91cm5leVBvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKHBvbGxUb3VybmV5U3RhdHVzLCAyMDAwKTsKfQoKYXN5bmMgZnVuY3Rpb24gcG9sbFRvdXJuZXlTdGF0dXMoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJl' +
'cyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvbWwvdG91cm5hbWVudC9zdGF0dXNgKTsKICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTsKCiAgICAgICAgY29uc3QgcGhhc2UgPSBkYXRhLnBoYXNlIHx8ICdpZGxlJzsKICAgICAgICBjb25zdCBwaGFzZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdXJuZXktcHJvZ3Jlc3MtcGhhc2UnKTsKICAgICAgICBwaGFzZUVsLnRleHRDb250ZW50ID0gcGhhc2UudG9VcHBlckNhc2UoKTsKICAgICAgICBwaGFzZUVsLmNsYXNzTmFtZSA9ICdwaGFzZS1iYWRnZSAnICsgcGhhc2U7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdXJuZXktcHJvZ3Jlc3MtbWVzc2FnZScpLnRleHRDb250ZW50ID0gZGF0YS5tZXNzYWdlIHx8ICcnOwoKICAgICAgICBjb25zdCBiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG91cm5leS1wcm9ncmVzcy1iYXInKTsKICAgICAgICBiYXIuY2xhc3NOYW1lID0gJ3Byb2dyZXNzLWJhcic7CiAgICAgICAgaWYgKHBoYXNlID09PSAnZG9uZScpIHsKICAgICAgICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzEwMCUnOwogICAgICAgICAgICBiYXIuY2xhc3NMaXN0LmFkZCgnZG9uZScpOwogICAgICAgIH0gZWxzZSBpZiAocGhhc2UgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzEwMCUnOwogICAgICAgICAgICBiYXIuY2xhc3NMaXN0LmFkZCgnZXJyb3InKTsKICAgICAgICB9IGVsc2UgaWYgKHBoYXNlID09PSAncnVubmluZycpIHsKICAgICAgICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzUwJSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWRhdGEucnVubmluZyAmJiBkYXRhLnBoYXNlICE9PSAnaWRsZScpIHsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0b3VybmV5UG9sbGluZ0ludGVydmFsKTsKICAgICAgICAgICAgdG91cm5leVBvbGxpbmdJbnRlcnZhbCA9IG51bGw7CiAgICAgICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG4tdG91cm5leScpOwogICAgICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0iYnRuLWljb24iPiYjMTI3OTQyOzwvc3Bhbj4gUnVuIFRvdXJuYW1lbnQnOwoKICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7CiAgICAgICAgICAgICAgICByZW5kZXJUb3VybmFtZW50UmVzdWx0cyhkYXRhLnJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdXJuZXktcHJvZ3Jlc3MnKS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTsKICAgICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcignVG91cm5hbWVudCBwb2xsIGVycm9yOicsIGVycik7IH0KfQoKZnVuY3Rpb24gcmVuZGVyVG91cm5hbWVudFJlc3VsdHMoZGF0YSkgewogICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RvdXJuZXktcmVzdWx0cycpOwogICAgaWYgKCFkYXRhIHx8ICFkYXRhLndpbl9yYXRlcykgewogICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPk5vIHJlc3VsdHMgYXZhaWxhYmxlLjwvZGl2Pic7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFNvcnQgYnkgd2luIHJhdGUKICAgIGNvbnN0IHNvcnRlZCA9IE9iamVjdC5lbnRyaWVzKGRhdGEud2luX3JhdGVzKQogICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYlsxXS53aW5fcmF0ZSB8fCAwKSAtIChhWzFdLndpbl9yYXRlIHx8IDApKTsKCiAgICBsZXQgaHRtbCA9ICc8aDMgc3R5bGU9ImZvbnQtc2l6ZToxNHB4O2NvbG9yOiNmZmY7bWFyZ2luLWJvdHRvbTo4cHg7Ij5MZWFkZXJib2FyZDwvaDM+JzsKICAgIGh0bWwgKz0gJzx0YWJsZSBjbGFzcz0iY2xhc3MtdGFibGUiPjx0aGVhZD48dHI+PHRoPlJhbms8L3RoPjx0aD5Qb2xpY3k8L3RoPjx0aD5XaW4gUmF0ZTwvdGg+PHRoPldpbnM8L3RoPjx0aD5Mb3NzZXM8L3RoPjx0aD5EcmF3czwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT4nOwoKICAgIHNvcnRlZC5mb3JFYWNoKChbbmFtZSwgc3RhdHNdLCBpKSA9PiB7CiAgICAgICAgY29uc3Qgd3IgPSAoKHN0YXRzLndpbl9yYXRlIHx8IDApICogMTAwKS50b0ZpeGVkKDEpOwogICAgICAgIGNvbnN0IHdyQ29sb3IgPSBzdGF0cy53aW5fcmF0ZSA+PSAwLjYgPyAndmFyKC0tbGFiLXN1' +
'Y2Nlc3MpJyA6IHN0YXRzLndpbl9yYXRlID49IDAuNCA/ICd2YXIoLS1sYWItd2FybmluZyknIDogJ3ZhcigtLWxhYi1lcnJvciknOwogICAgICAgIGNvbnN0IG1lZGFsID0gaSA9PT0gMCA/ICcmIzEyOTM1MTsnIDogaSA9PT0gMSA/ICcmIzEyOTM1MjsnIDogaSA9PT0gMiA/ICcmIzEyOTM1MzsnIDogKGkrMSk7CiAgICAgICAgaHRtbCArPSBgPHRyPgogICAgICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyI+JHttZWRhbH08L3RkPgogICAgICAgICAgICA8dGQgc3R5bGU9ImNvbG9yOnZhcigtLWxhYi1hY2NlbnQpO2ZvbnQtd2VpZ2h0OjYwMDsiPiR7bmFtZX08L3RkPgogICAgICAgICAgICA8dGQgc3R5bGU9ImNvbG9yOiR7d3JDb2xvcn07Zm9udC13ZWlnaHQ6NzAwOyI+JHt3cn0lPC90ZD4KICAgICAgICAgICAgPHRkPiR7c3RhdHMud2luc308L3RkPgogICAgICAgICAgICA8dGQ+JHtzdGF0cy5sb3NzZXN9PC90ZD4KICAgICAgICAgICAgPHRkPiR7c3RhdHMuZHJhd3N9PC90ZD4KICAgICAgICA8L3RyPmA7CiAgICB9KTsKICAgIGh0bWwgKz0gJzwvdGJvZHk+PC90YWJsZT4nOwoKICAgIC8vIFdpbiBtYXRyaXgKICAgIGlmIChkYXRhLndpbl9tYXRyaXggJiYgZGF0YS5wb2xpY2llcykgewogICAgICAgIGh0bWwgKz0gJzxoMyBzdHlsZT0iZm9udC1zaXplOjE0cHg7Y29sb3I6I2ZmZjttYXJnaW46MTZweCAwIDhweDsiPkhlYWQtdG8tSGVhZCBXaW5zPC9oMz4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImNvbmZ1c2lvbi1tYXRyaXgiPjx0YWJsZT48dHI+PHRoPjwvdGg+JzsKICAgICAgICBkYXRhLnBvbGljaWVzLmZvckVhY2gocCA9PiBodG1sICs9IGA8dGg+JHtwfTwvdGg+YCk7CiAgICAgICAgaHRtbCArPSAnPC90cj4nOwogICAgICAgIGRhdGEucG9saWNpZXMuZm9yRWFjaChyb3cgPT4gewogICAgICAgICAgICBodG1sICs9IGA8dHI+PHRkIGNsYXNzPSJyb3ctbGFiZWwiPiR7cm93fTwvdGQ+YDsKICAgICAgICAgICAgZGF0YS5wb2xpY2llcy5mb3JFYWNoKGNvbCA9PiB7CiAgICAgICAgICAgICAgICBpZiAocm93ID09PSBjb2wpIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9ImNvbG9yOnZhcigtLWxhYi10ZXh0LWRpbSk7Ij4tPC90ZD4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBkYXRhLndpbl9tYXRyaXhbcm93XT8uW2NvbF0gfHwgMDsKICAgICAgICAgICAgICAgICAgICBodG1sICs9IGA8dGQ+JHt2YWx9PC90ZD5gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaHRtbCArPSAnPC90cj4nOwogICAgICAgIH0pOwogICAgICAgIGh0bWwgKz0gJzwvdGFibGU+PC9kaXY+JzsKICAgIH0KCiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOjEycHg7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tbGFiLXRleHQtZGltKTsiPiR7ZGF0YS50b3RhbF9tYXRjaGVzfSB0b3RhbCBtYXRjaGVzIGluICR7KGRhdGEudG90YWxfdGltZV9zfHwwKS50b0ZpeGVkKDEpfXM8L2Rpdj5gOwogICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7Cn0KCi8vIExvYWQgdG91cm5hbWVudCByZXN1bHRzIG9uIHBhZ2UgbG9hZAphc3luYyBmdW5jdGlvbiBsb2FkVG91cm5hbWVudFJlc3VsdHMoKSB7CiAgICB0cnkgewogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFfS9hcGkvbWwvdG91cm5hbWVudC9yZXN1bHRzYCk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgaWYgKCFkYXRhLmVycm9yKSB7CiAgICAgICAgICAgIHJlbmRlclRvdXJuYW1lbnRSZXN1bHRzKGRhdGEpOwogICAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikgeyAvKiBpZ25vcmUgKi8gfQp9CgovLyBBbHNvIGNoZWNrIFBQTyBzdGF0dXMgb24gbG9hZAphc3luYyBmdW5jdGlvbiBjaGVja1BQT1N0YXR1cygpIHsKICAgIHRyeSB7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0V9L2FwaS9tbC90cmFpbi9wcG8vc3RhdHVzYCk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7CiAgICAgICAgaWYgKGRhdGEucnVubmluZykgewogICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHBvLXByb2dyZXNzJykuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7CiAgICAgICAgICAgIHVwZGF0ZVBQT1Byb2dyZXNzKGRh' +
'dGEpOwogICAgICAgICAgICBzdGFydFBQT1BvbGxpbmcoKTsKICAgICAgICB9IGVsc2UgaWYgKGRhdGEucGhhc2UgPT09ICdkb25lJyB8fCBkYXRhLnBoYXNlID09PSAnZXJyb3InKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcG8tcHJvZ3Jlc3MnKS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTsKICAgICAgICAgICAgdXBkYXRlUFBPUHJvZ3Jlc3MoZGF0YSk7CiAgICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7IC8qIGlnbm9yZSAqLyB9Cn0KCi8vIEFkZCB0byBpbml0CmNvbnN0IF9vcmlnRE9NTG9hZGVkID0gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcjsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsKICAgIC8vIFRoZXNlIGFyZSBjYWxsZWQgYWZ0ZXIgdGhlIG9yaWdpbmFsIERPTUNvbnRlbnRMb2FkZWQgaGFuZGxlcgogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgY2hlY2tQUE9TdGF0dXMoKTsKICAgICAgICBsb2FkVG91cm5hbWVudFJlc3VsdHMoKTsKICAgIH0sIDUwMCk7Cn0pOwoKZnVuY3Rpb24gdXBkYXRlUHJvZ3Jlc3MoZGF0YSkgewogICAgY29uc3QgcGhhc2VCYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9ncmVzcy1waGFzZScpOwogICAgY29uc3QgbWVzc2FnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9ncmVzcy1tZXNzYWdlJyk7CiAgICBjb25zdCBiYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvZ3Jlc3MtYmFyJyk7CiAgICBjb25zdCBkZXRhaWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvZ3Jlc3MtZGV0YWlsJyk7CgogICAgLy8gUGhhc2UgYmFkZ2UKICAgIGNvbnN0IHBoYXNlID0gZGF0YS5waGFzZSB8fCAnaWRsZSc7CiAgICBwaGFzZUJhZGdlLnRleHRDb250ZW50ID0gcGhhc2UudG9VcHBlckNhc2UoKTsKICAgIHBoYXNlQmFkZ2UuY2xhc3NOYW1lID0gJ3BoYXNlLWJhZGdlICcgKyBwaGFzZTsKCiAgICAvLyBNZXNzYWdlCiAgICBtZXNzYWdlLnRleHRDb250ZW50ID0gZGF0YS5tZXNzYWdlIHx8ICcnOwoKICAgIC8vIFByb2dyZXNzIGJhcgogICAgYmFyLmNsYXNzTmFtZSA9ICdwcm9ncmVzcy1iYXInOwogICAgaWYgKHBoYXNlID09PSAnZG9uZScpIHsKICAgICAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgICAgYmFyLmNsYXNzTGlzdC5hZGQoJ2RvbmUnKTsKICAgIH0gZWxzZSBpZiAocGhhc2UgPT09ICdlcnJvcicpIHsKICAgICAgICBiYXIuc3R5bGUud2lkdGggPSAnMTAwJSc7CiAgICAgICAgYmFyLmNsYXNzTGlzdC5hZGQoJ2Vycm9yJyk7CiAgICB9IGVsc2UgaWYgKHBoYXNlID09PSAndHJhaW5pbmcnICYmIGRhdGEudG90YWxfZXBvY2hzID4gMCkgewogICAgICAgIGNvbnN0IHBjdCA9IE1hdGgubWluKDEwMCwgKGRhdGEuY3VycmVudF9lcG9jaCAvIGRhdGEudG90YWxfZXBvY2hzKSAqIDEwMCk7CiAgICAgICAgYmFyLnN0eWxlLndpZHRoID0gcGN0ICsgJyUnOwogICAgfSBlbHNlIGlmIChwaGFzZSA9PT0gJ2J1aWxkaW5nJykgewogICAgICAgIGJhci5zdHlsZS53aWR0aCA9ICcxNSUnOwogICAgfSBlbHNlIGlmIChwaGFzZSA9PT0gJ2V2YWx1YXRpbmcnKSB7CiAgICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzkwJSc7CiAgICB9IGVsc2UgaWYgKHBoYXNlID09PSAnc3RhcnRpbmcnKSB7CiAgICAgICAgYmFyLnN0eWxlLndpZHRoID0gJzUlJzsKICAgIH0KCiAgICAvLyBEZXRhaWwKICAgIGlmIChwaGFzZSA9PT0gJ3RyYWluaW5nJyAmJiBkYXRhLnRvdGFsX2Vwb2NocyA+IDApIHsKICAgICAgICBkZXRhaWwudGV4dENvbnRlbnQgPSBgRXBvY2ggJHtkYXRhLmN1cnJlbnRfZXBvY2h9IC8gJHtkYXRhLnRvdGFsX2Vwb2Noc31gOwogICAgfSBlbHNlIGlmIChwaGFzZSA9PT0gJ2RvbmUnICYmIGRhdGEucmVzdWx0KSB7CiAgICAgICAgY29uc3QgciA9IGRhdGEucmVzdWx0OwogICAgICAgIGNvbnN0IHZhbEFjYyA9IHIudHJhaW5pbmc/LmJlc3RfdmFsX2FjY3VyYWN5OwogICAgICAgIGNvbnN0IHRlc3RBY2MgPSByLmV2YWx1YXRpb24/LmFjY3VyYWN5OwogICAgICAgIGxldCBwYXJ0cyA9IFtdOwogICAgICAgIGlmICh2YWxBY2MgIT09IHVuZGVmaW5lZCkgcGFydHMucHVzaChgVmFsOiAkeyh2YWxBY2MgKiAxMDApLnRvRml4ZWQoMSl9JWApOwogICAgICAgIGlmICh0ZXN0QWNjICE9PSB1bmRlZmluZWQpIHBhcnRzLnB1c2goYFRlc3Q6ICR7KHRlc3RBY2MgKiAxMDApLnRv' +
'Rml4ZWQoMSl9JWApOwogICAgICAgIGlmIChyLmRldmljZSkgcGFydHMucHVzaChgRGV2aWNlOiAke3IuZGV2aWNlfWApOwogICAgICAgIGRldGFpbC50ZXh0Q29udGVudCA9IHBhcnRzLmpvaW4oJyAgfCAgJyk7CiAgICB9IGVsc2UgaWYgKHBoYXNlID09PSAnZXJyb3InKSB7CiAgICAgICAgZGV0YWlsLnRleHRDb250ZW50ID0gZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcic7CiAgICAgICAgZGV0YWlsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWxhYi1lcnJvciknOwogICAgfSBlbHNlIHsKICAgICAgICBkZXRhaWwudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICBkZXRhaWwuc3R5bGUuY29sb3IgPSAnJzsKICAgIH0KCiAgICAvLyBVcGRhdGUgdHJhaW4gYnV0dG9uCiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuLXRyYWluJyk7CiAgICBpZiAoZGF0YS5ydW5uaW5nKSB7CiAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJidG4taWNvbiI+JiM4OTg3Ozwvc3Bhbj4gVHJhaW5pbmcuLi4nOwogICAgfQp9Cg=='
Install-B64 -R 'ui\training.js' -B $b
# Create runtime directories
$rd = Join-Path $targetDir 'results'
if (-not (Test-Path $rd)) {
New-Item -ItemType Directory -Path $rd -Force | Out-Null
Write-Host ' [OK] results/ (directory)' -ForegroundColor Green
}
$id = Join-Path $targetDir 'imported-decks'
if (-not (Test-Path $id)) {
New-Item -ItemType Directory -Path $id -Force | Out-Null
Write-Host ' [OK] imported-decks/ (directory)' -ForegroundColor Green
}
$dr = Join-Path $targetDir 'deck-reports'
if (-not (Test-Path $dr)) {
New-Item -ItemType Directory -Path $dr -Force | Out-Null
Write-Host ' [OK] deck-reports/ (directory)' -ForegroundColor Green
}
$cs = Join-Path $targetDir 'coach-sessions'
if (-not (Test-Path $cs)) {
New-Item -ItemType Directory -Path $cs -Force | Out-Null
Write-Host ' [OK] coach-sessions/ (directory)' -ForegroundColor Green
}
$em = Join-Path $targetDir 'embeddings'
if (-not (Test-Path $em)) {
New-Item -ItemType Directory -Path $em -Force | Out-Null
Write-Host ' [OK] embeddings/ (directory)' -ForegroundColor Green
}
$mc = Join-Path $targetDir 'ml\models\checkpoints'
if (-not (Test-Path $mc)) {
New-Item -ItemType Directory -Path $mc -Force | Out-Null
Write-Host ' [OK] ml/models/checkpoints/ (directory)' -ForegroundColor Green
}
$ld = Join-Path $targetDir 'logs\decisions'
if (-not (Test-Path $ld)) {
New-Item -ItemType Directory -Path $ld -Force | Out-Null
Write-Host ' [OK] logs/decisions/ (directory)' -ForegroundColor Green
}
Write-Host ''
Write-Host '=======================================================' -ForegroundColor Cyan
Write-Host ' All 174 files installed successfully!' -ForegroundColor Green
Write-Host '=======================================================' -ForegroundColor Cyan
Write-Host ''
Write-Host ' Checking prerequisites...' -ForegroundColor White
$javaOk = $false
try {
$jv = & java -version 2>&1 | Select-Object -First 1
Write-Host (' Java: ' + $jv) -ForegroundColor Green
$javaOk = $true
} catch {
Write-Host ' Java: NOT FOUND - Install Java 17+' -ForegroundColor Red
}
$pythonOk = $false
try {
$pv = & python --version 2>&1
Write-Host (' Python: ' + $pv) -ForegroundColor Green
$pythonOk = $true
} catch {
Write-Host ' Python: NOT FOUND - Install Python 3.10+' -ForegroundColor Red
}
$mvnOk = $false
try {
$mv = & mvn --version 2>&1 | Select-Object -First 1
Write-Host (' Maven: ' + $mv) -ForegroundColor Green
$mvnOk = $true
} catch {
Write-Host ' Maven: NOT FOUND - Install Maven 3.8+' -ForegroundColor Red
}
$forgeJar = 'D:\ForgeCommander\forge-repo\forge-gui-desktop\target\forge-gui-desktop-2.0.12-SNAPSHOT-jar-with-dependencies.jar'
if (Test-Path $forgeJar) {
Write-Host ' Forge: Found' -ForegroundColor Green
} else {
Write-Host ' Forge: JAR not found at expected path' -ForegroundColor Yellow
Write-Host ' Build Forge first:' -ForegroundColor Yellow
Write-Host ' cd D:\ForgeCommander\forge-repo' -ForegroundColor White
Write-Host ' mvn install -pl forge-core,forge-game,forge-ai "-DskipTests" "-Drevision=2.0.12-SNAPSHOT"' -ForegroundColor White
Write-Host ' mvn package -pl forge-gui-desktop "-DskipTests" "-Drevision=2.0.12-SNAPSHOT" -am' -ForegroundColor White
}
$nodeOk = $false
try {
$nv = & node --version 2>&1
Write-Host (' Node.js: ' + $nv) -ForegroundColor Green
$nodeOk = $true
} catch {
Write-Host ' Node.js: NOT FOUND - Install Node.js 18+ from https://nodejs.org' -ForegroundColor Red
}
$m2 = Join-Path $env:USERPROFILE '.m2\repository\forge\forge-core\2.0.12-SNAPSHOT\forge-core-2.0.12-SNAPSHOT.jar'
if (Test-Path $m2) {
Write-Host ' Forge Maven artifacts: Found in .m2' -ForegroundColor Green
} else {
Write-Host ' Forge Maven artifacts: NOT FOUND in .m2' -ForegroundColor Yellow
Write-Host ' Run: cd D:\ForgeCommander\forge-repo' -ForegroundColor White
Write-Host ' mvn install -pl forge-core,forge-game,forge-ai "-DskipTests" "-Drevision=2.0.12-SNAPSHOT"' -ForegroundColor White
}
Write-Host ''
if ($nodeOk) {
Write-Host ' Building React frontend...' -ForegroundColor Yellow
$feDir = Join-Path $targetDir 'frontend\commander-ai-lab-ui'
Push-Location $feDir
try {
Write-Host ' Running npm install...' -ForegroundColor Gray
npm install 2>&1 | Out-Null
Write-Host ' Running npm run build...' -ForegroundColor Gray
npm run build 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-Host ' React frontend built successfully!' -ForegroundColor Green
} else {
Write-Host ' React frontend build failed' -ForegroundColor Red
Write-Host ' You can build manually: cd frontend\commander-ai-lab-ui && npm install && npm run build' -ForegroundColor Yellow
}
} catch {
Write-Host ' React build failed (non-critical - try manually)' -ForegroundColor Yellow
} finally {
Pop-Location
}
} else {
Write-Host ' Skipping React frontend build (Node.js not found)' -ForegroundColor Yellow
Write-Host ' Install Node.js 18+ and run: cd frontend\commander-ai-lab-ui && npm install && npm run build' -ForegroundColor White
}
Write-Host ''
if ($pythonOk) {
$fc = & python -c 'import fastapi' 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host ' Installing Python dependencies...' -ForegroundColor Yellow
pip install fastapi uvicorn python-multipart
} else {
Write-Host ' Python deps: fastapi already installed' -ForegroundColor Green
}
Write-Host ''
Write-Host ' Installing Python simulator package (editable)...' -ForegroundColor Yellow
Push-Location $targetDir
try {
pip install -e . 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-Host ' commander_ai_lab package installed' -ForegroundColor Green
Write-Host ' CLI command available: commander-sim' -ForegroundColor Green
} else {
Write-Host ' pip install -e . failed (non-critical)' -ForegroundColor Yellow
}
} catch {
Write-Host ' pip install -e . failed (non-critical)' -ForegroundColor Yellow
} finally {
Pop-Location
}
Write-Host ''
Write-Host ' Card Scanner: Uses Ximilar Visual AI (no local deps needed)' -ForegroundColor Green
Write-Host ' API key is pre-configured in start-lab.bat' -ForegroundColor Gray
Write-Host ''
Write-Host ' Installing Coach dependencies...' -ForegroundColor Yellow
pip install numpy pydantic pandas pyarrow openai 2>&1 | Out-Null
Write-Host ' Coach deps (numpy, pydantic, pandas, pyarrow, openai) installed' -ForegroundColor Green
Write-Host ' NOTE: LM Studio must be running on 192.168.0.122:1234 for AI coaching' -ForegroundColor Gray
Write-Host ' Embeddings will auto-download on first coach session (~50MB)' -ForegroundColor Gray
Write-Host ''
Write-Host ' Installing ML training dependencies...' -ForegroundColor Yellow
pip install torch --index-url https://download.pytorch.org/whl/cu126 2>&1 | Out-Null
Write-Host ' PyTorch (CUDA 12.6) installed for policy training' -ForegroundColor Green
Write-Host ' CPU-only alternative: pip install torch --index-url https://download.pytorch.org/whl/cpu' -ForegroundColor Gray
}
Write-Host ''
Write-Host '=======================================================' -ForegroundColor Cyan
Write-Host ' Setup Guide' -ForegroundColor Cyan
Write-Host '=======================================================' -ForegroundColor Cyan
Write-Host ''
Write-Host ' Step 1: Install Forge modules to local Maven repo (if not done)' -ForegroundColor Yellow
Write-Host ' cd D:\ForgeCommander\forge-repo' -ForegroundColor White
Write-Host ' mvn install -pl forge-core,forge-game,forge-ai "-DskipTests" "-Drevision=2.0.12-SNAPSHOT"' -ForegroundColor White
Write-Host ''
Write-Host ' Step 2: Build Commander AI Lab' -ForegroundColor Yellow
Write-Host (' cd ' + $targetDir) -ForegroundColor White
Write-Host ' mvn package "-DskipTests"' -ForegroundColor White
Write-Host ''
Write-Host ' Step 3: Launch the server' -ForegroundColor Yellow
Write-Host ' Option A: .\start-lab.bat' -ForegroundColor White
Write-Host ' Option B: python lab_api.py --forge-jar D:\ForgeCommander\forge-repo\forge-gui-desktop\target\forge-gui-desktop-2.0.12-SNAPSHOT-jar-with-dependencies.jar --forge-dir D:\ForgeCommander\forge-repo\forge-gui --port 8080' -ForegroundColor White
Write-Host ''
Write-Host ' Step 4: Build the React frontend' -ForegroundColor Yellow
Write-Host ' cd D:\ForgeCommander\commander-ai-lab\frontend\commander-ai-lab-ui' -ForegroundColor White
Write-Host ' npm install && npm run build' -ForegroundColor White
Write-Host ''
Write-Host ' Step 5: Open http://localhost:8080 in your browser' -ForegroundColor Yellow
Write-Host ' React SPA serves all pages (Collection, Decks, Auto Gen, etc.)' -ForegroundColor Gray
Write-Host ''
Write-Host ' Python Simulator (no Forge needed):' -ForegroundColor Cyan
Write-Host ' python -m commander_ai_lab.lab.experiments' -ForegroundColor White
Write-Host ' Or after pip install -e .: commander-sim' -ForegroundColor White
Write-Host ''
Write-Host ' Deck Coach (LLM-powered):' -ForegroundColor Cyan
Write-Host ' 1. Start LM Studio with a model loaded on 192.168.0.122:1234' -ForegroundColor White
Write-Host ' 2. Run simulations to generate deck reports' -ForegroundColor White
Write-Host ' 3. Open http://localhost:8080/coach' -ForegroundColor White
Write-Host ' Embeddings (~50MB) auto-download on first use' -ForegroundColor Gray
Write-Host ''
Write-Host ' DeepSeek AI Opponent:' -ForegroundColor Cyan
Write-Host ' 1. Start LM Studio with DeepSeek-R1 8B loaded on 192.168.0.122:1234' -ForegroundColor White
Write-Host ' 2. Open Simulator page, select DeepSeek AI as opponent' -ForegroundColor White
Write-Host ' 3. Click Connect, then Run Simulation' -ForegroundColor White
Write-Host ' Decision logs saved to logs/decisions/ for future training' -ForegroundColor Gray
Write-Host ''
Write-Host ' Perplexity AI (Deck Research + Generation):' -ForegroundColor Cyan
Write-Host ' Set env var: $env:PPLX_API_KEY = your-key' -ForegroundColor White
Write-Host ' Or pass: python lab_api.py --pplx-key your-key ...' -ForegroundColor White
Write-Host ' AI panels appear on Deck Builder page when key is configured' -ForegroundColor Gray
Write-Host ''
Write-Host ' ML Training Pipeline:' -ForegroundColor Cyan
Write-Host ' 1. Generate synthetic data (or run real sims with ML logging):' -ForegroundColor White
Write-Host ' python -m ml.scripts.generate_synthetic_data --games 500' -ForegroundColor Gray
Write-Host ' 2. Build dataset: python -m ml.scripts.ml_cli build' -ForegroundColor White
Write-Host ' 3. Train policy: python -m ml.scripts.ml_cli train' -ForegroundColor White
Write-Host ' 4. Evaluate: python -m ml.scripts.ml_cli eval' -ForegroundColor White
Write-Host ' 5. Check status: python -m ml.scripts.ml_cli status' -ForegroundColor White
Write-Host ' Training uses GPU (CUDA) automatically if available' -ForegroundColor Gray
Write-Host ''
if ($javaOk -and $mvnOk) {
$bc = Read-Host ' Build Commander AI Lab now? (mvn package -DskipTests) [Y/n]'
if ($bc -ne 'n' -and $bc -ne 'N') {
Write-Host ''
Write-Host ' Building Commander AI Lab...' -ForegroundColor Yellow
Push-Location $targetDir
try {
mvn package "-DskipTests"
if ($LASTEXITCODE -eq 0) {
Write-Host ''
Write-Host ' Build successful!' -ForegroundColor Green
$sj = Get-ChildItem -Path (Join-Path $targetDir 'target') -Filter 'commander-ai-lab-*-shaded.jar' -ErrorAction SilentlyContinue | Where-Object { -not $_.Name.StartsWith('original-') } | Select-Object -First 1
if ($sj) {
Write-Host (' Lab JAR: ' + $sj.FullName + ' (' + [math]::Round($sj.Length / 1MB, 1) + ' MB)') -ForegroundColor Green
}
} else {
Write-Host ''
Write-Host (' Build failed (exit code ' + $LASTEXITCODE + ')') -ForegroundColor Red
Write-Host ' Make sure Forge modules are installed to local Maven repo first.' -ForegroundColor Yellow
}
} finally {
Pop-Location
}
}
} else {
Write-Host ' Skipping build (Java or Maven not found)' -ForegroundColor Yellow
}
Write-Host ''
Read-Host 'Press Enter to exit'