# ============================================================ # VicTool - Ferramenta de Otimizacao Windows em PT-BR # by Victor Schiavinato | victool.com.br # v1.5.1 - Mais tweaks, servicos, hardware detalhado # ============================================================ #Requires -Version 5.1 #Requires -RunAsAdministrator if (-not [Environment]::Is64BitProcess) { throw 'Execute o VicTool no PowerShell de 64 bits.' } if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { throw 'Abra o Windows PowerShell como administrador.' } Import-Module Microsoft.PowerShell.LocalAccounts -ErrorAction Stop Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # ─── Cores ──────────────────────────────────────────────── $corFundo = [System.Drawing.Color]::FromArgb(13, 17, 23) $corPainel = [System.Drawing.Color]::FromArgb(22, 27, 34) $corBorda = [System.Drawing.Color]::FromArgb(48, 54, 61) $corDestaque = [System.Drawing.Color]::FromArgb(0, 122, 204) $corVerde = [System.Drawing.Color]::FromArgb(35, 197, 120) $corAmarelo = [System.Drawing.Color]::FromArgb(255, 189, 46) $corVermelho = [System.Drawing.Color]::FromArgb(248, 81, 73) $corTexto = [System.Drawing.Color]::FromArgb(201, 209, 217) $corTextoClaro = [System.Drawing.Color]::FromArgb(255, 255, 255) $corTextoEscuro = [System.Drawing.Color]::FromArgb(110, 118, 129) $corTabInativa = [System.Drawing.Color]::FromArgb(30, 35, 42) $corTabHover = [System.Drawing.Color]::FromArgb(40, 50, 60) # ─── Dados: Programas ───────────────────────────────────── $programas = @( @{ Nome="Google Chrome"; Winget="Google.Chrome"; Cat="Navegadores" } @{ Nome="Mozilla Firefox"; Winget="Mozilla.Firefox"; Cat="Navegadores" } @{ Nome="Brave Browser"; Winget="Brave.Brave"; Cat="Navegadores" } @{ Nome="VLC"; Winget="VideoLAN.VLC"; Cat="Midia" } @{ Nome="Spotify"; Winget="Spotify.Spotify"; Cat="Midia" } @{ Nome="K-Lite Codec Pack"; Winget="CodecGuide.K-LiteCodecPack.Full"; Cat="Midia" } @{ Nome="7-Zip"; Winget="7zip.7zip"; Cat="Utilitarios" } @{ Nome="Notepad++"; Winget="Notepad++.Notepad++"; Cat="Utilitarios" } @{ Nome="Everything"; Winget="voidtools.Everything"; Cat="Utilitarios" } @{ Nome="WinRAR"; Winget="RARLab.WinRAR"; Cat="Utilitarios" } @{ Nome="PowerToys"; Winget="Microsoft.PowerToys"; Cat="Utilitarios" } @{ Nome="TreeSize Free"; Winget="JAMSoftware.TreeSize.Free"; Cat="Utilitarios" } @{ Nome="VS Code"; Winget="Microsoft.VisualStudioCode"; Cat="Dev" } @{ Nome="Git"; Winget="Git.Git"; Cat="Dev" } @{ Nome="Python 3"; Winget="Python.Python.3"; Cat="Dev" } @{ Nome="Node.js LTS"; Winget="OpenJS.NodeJS.LTS"; Cat="Dev" } @{ Nome="Windows Terminal"; Winget="Microsoft.WindowsTerminal"; Cat="Dev" } @{ Nome="FileZilla"; Winget="TimKosse.FileZilla.Client"; Cat="Dev" } @{ Nome="TeamViewer"; Winget="TeamViewer.TeamViewer"; Cat="Remoto" } @{ Nome="AnyDesk"; Winget="AnyDesk.AnyDesk"; Cat="Remoto" } @{ Nome="RustDesk"; Winget="RustDesk.RustDesk"; Cat="Remoto" } @{ Nome="WinSCP"; Winget="WinSCP.WinSCP"; Cat="Remoto" } @{ Nome="PuTTY"; Winget="PuTTY.PuTTY"; Cat="Remoto" } @{ Nome="Bitwarden"; Winget="Bitwarden.Bitwarden"; Cat="Seguranca" } @{ Nome="Malwarebytes"; Winget="Malwarebytes.Malwarebytes"; Cat="Seguranca" } @{ Nome="KeePassXC"; Winget="KeePassXCTeam.KeePassXC"; Cat="Seguranca" } @{ Nome="OBS Studio"; Winget="OBSProject.OBSStudio"; Cat="Criacao" } @{ Nome="GIMP"; Winget="GIMP.GIMP"; Cat="Criacao" } @{ Nome="HandBrake"; Winget="HandBrake.HandBrake"; Cat="Criacao" } @{ Nome="Zoom"; Winget="Zoom.Zoom"; Cat="Comunicacao" } @{ Nome="Discord"; Winget="Discord.Discord"; Cat="Comunicacao" } @{ Nome="Telegram"; Winget="Telegram.TelegramDesktop"; Cat="Comunicacao" } ) # ─── Dados: Bloatware ───────────────────────────────────── $bloatware = @( @{ Nome="Microsoft Copilot"; Pkg="Microsoft.Copilot"; Risco="Baixo" } @{ Nome="Clipchamp (editor video)"; Pkg="Clipchamp.Clipchamp"; Risco="Baixo" } @{ Nome="Microsoft News"; Pkg="Microsoft.BingNews"; Risco="Baixo" } @{ Nome="Microsoft Weather"; Pkg="Microsoft.BingWeather"; Risco="Baixo" } @{ Nome="Microsoft Bing Search"; Pkg="Microsoft.BingSearch"; Risco="Baixo" } @{ Nome="Xbox App"; Pkg="Microsoft.XboxApp"; Risco="Baixo" } @{ Nome="Xbox Game Bar"; Pkg="Microsoft.XboxGamingOverlay"; Risco="Baixo" } @{ Nome="Xbox Identity Provider"; Pkg="Microsoft.XboxIdentityProvider"; Risco="Baixo" } @{ Nome="Xbox Speech To Text"; Pkg="Microsoft.XboxSpeechToTextOverlay"; Risco="Baixo" } @{ Nome="Xbox Game Speech Window"; Pkg="Microsoft.XboxGameSpeech"; Risco="Baixo" } @{ Nome="Solitaire Collection"; Pkg="Microsoft.MicrosoftSolitaireCollection"; Risco="Baixo" } @{ Nome="Candy Crush Saga"; Pkg="king.com.CandyCrushSaga"; Risco="Baixo" } @{ Nome="Candy Crush Friends"; Pkg="king.com.CandyCrushFriendsSaga"; Risco="Baixo" } @{ Nome="Disney Magic Kingdoms"; Pkg="Disney.DisneyMagicKingdoms"; Risco="Baixo" } @{ Nome="Farmville 3"; Pkg="Zynga.FarmVille3"; Risco="Baixo" } @{ Nome="Microsoft Tips"; Pkg="Microsoft.Getstarted"; Risco="Baixo" } @{ Nome="Feedback Hub"; Pkg="Microsoft.WindowsFeedbackHub"; Risco="Baixo" } @{ Nome="Microsoft To Do"; Pkg="Microsoft.Todos"; Risco="Baixo" } @{ Nome="Skype (legacy)"; Pkg="Microsoft.SkypeApp"; Risco="Baixo" } @{ Nome="Teams (pessoal)"; Pkg="MicrosoftTeams"; Risco="Baixo" } @{ Nome="Microsoft People"; Pkg="Microsoft.People"; Risco="Baixo" } @{ Nome="Mapas do Windows"; Pkg="Microsoft.WindowsMaps"; Risco="Baixo" } @{ Nome="Microsoft Sticky Notes"; Pkg="Microsoft.MicrosoftStickyNotes"; Risco="Baixo" } @{ Nome="Microsoft Power Automate"; Pkg="Microsoft.PowerAutomateDesktop"; Risco="Baixo" } @{ Nome="Widgets (Feed de noticias)"; Pkg="MicrosoftWindows.Client.WebExperience"; Risco="Baixo" } @{ Nome="Mixed Reality Portal"; Pkg="Microsoft.MixedReality.Portal"; Risco="Baixo" } @{ Nome="3D Viewer"; Pkg="Microsoft.Microsoft3DViewer"; Risco="Baixo" } @{ Nome="Paint 3D"; Pkg="Microsoft.MSPaint"; Risco="Baixo" } @{ Nome="Camera do Windows"; Pkg="Microsoft.WindowsCamera"; Risco="Medio" } @{ Nome="Gravador de Voz"; Pkg="Microsoft.WindowsSoundRecorder"; Risco="Medio" } @{ Nome="Alarmes e Relogio"; Pkg="Microsoft.WindowsAlarms"; Risco="Medio" } @{ Nome="Calculadora"; Pkg="Microsoft.WindowsCalculator"; Risco="Medio" } @{ Nome="Fotos"; Pkg="Microsoft.Windows.Photos"; Risco="Medio" } @{ Nome="Filmes e TV"; Pkg="Microsoft.ZuneVideo"; Risco="Medio" } @{ Nome="Groove Musica"; Pkg="Microsoft.ZuneMusic"; Risco="Medio" } @{ Nome="Correio e Calendario"; Pkg="microsoft.windowscommunicationsapps"; Risco="Medio" } @{ Nome="OneNote (Store)"; Pkg="Microsoft.Office.OneNote"; Risco="Medio" } @{ Nome="OneDrive"; Pkg="OneDrive"; Risco="Alto" } @{ Nome="Microsoft 365 (trial)"; Pkg="Microsoft.MicrosoftOfficeHub"; Risco="Alto" } ) # ─── Dados: Tweaks ──────────────────────────────────────── $tweaks = @( # Performance @{ Nome="Desativar Efeitos Visuais"; Cat="Performance"; Acao="perf_visual" } @{ Nome="Plano de Energia: Alto Desempenho"; Cat="Performance"; Acao="perf_energia" } @{ Nome="Plano de Energia: Maximo (Oculto)"; Cat="Performance"; Acao="perf_energia_max" } @{ Nome="Desativar SysMain (Superfetch)"; Cat="Performance"; Acao="perf_sysmain" } @{ Nome="Desativar Search Indexing"; Cat="Performance"; Acao="perf_index" } @{ Nome="Desativar Xbox Game DVR"; Cat="Performance"; Acao="perf_gamedvr" } @{ Nome="Limpar Arquivos Temporarios"; Cat="Performance"; Acao="perf_temp" } @{ Nome="Ajustar Prioridade de CPU para Apps"; Cat="Performance"; Acao="perf_cpu_prio" } @{ Nome="Desativar Hibernacao"; Cat="Performance"; Acao="perf_hibern" } @{ Nome="Otimizar NTFS (desativar 8.3)"; Cat="Performance"; Acao="perf_ntfs" } # Privacidade @{ Nome="Desativar Telemetria"; Cat="Privacidade"; Acao="priv_telemetria" } @{ Nome="Desativar Publicidade Direcionada"; Cat="Privacidade"; Acao="priv_ads" } @{ Nome="Desativar Bing no Menu Iniciar"; Cat="Privacidade"; Acao="priv_bing" } @{ Nome="Desativar Activity History"; Cat="Privacidade"; Acao="priv_activity" } @{ Nome="Desativar Diagnosticos Opcionais"; Cat="Privacidade"; Acao="priv_diag" } @{ Nome="Desativar Cortana"; Cat="Privacidade"; Acao="priv_cortana" } @{ Nome="Desativar Rastreamento de Localizacao";Cat="Privacidade"; Acao="priv_location" } @{ Nome="Desativar Acesso Micro/Camera por Apps";Cat="Privacidade";Acao="priv_devices" } @{ Nome="Desativar Envio de Tinta e Digitacao"; Cat="Privacidade"; Acao="priv_inktyping" } @{ Nome="Desativar WiFi Sense"; Cat="Privacidade"; Acao="priv_wifisense" } @{ Nome="Bloquear Telemetria no Hosts"; Cat="Privacidade"; Acao="priv_hosts" } # Interface @{ Nome="Mostrar Extensoes de Arquivo"; Cat="Interface"; Acao="ui_ext" } @{ Nome="Mostrar Arquivos Ocultos"; Cat="Interface"; Acao="ui_hidden" } @{ Nome="Desativar Notificacoes Inuteis"; Cat="Interface"; Acao="ui_notif" } @{ Nome="Habilitar Encerrar Tarefa na Barra"; Cat="Interface"; Acao="ui_endtask" } @{ Nome="Restaurar Menu Contexto Classico"; Cat="Interface"; Acao="ui_menu" } @{ Nome="Alinhar Barra a Esquerda"; Cat="Interface"; Acao="ui_taskbar" } @{ Nome="Desativar Recomendados no Menu Iniciar";Cat="Interface"; Acao="ui_recstart" } @{ Nome="Desativar Pesquisa Destacada (Bing)"; Cat="Interface"; Acao="ui_searchhl" } @{ Nome="Mostrar Segundos no Relogio"; Cat="Interface"; Acao="ui_clock_sec" } @{ Nome="Desativar Snap Assist Popup"; Cat="Interface"; Acao="ui_snap" } # Servicos @{ Nome="Desativar DiagTrack (Telemetria)"; Cat="Servicos"; Acao="svc_diagtrack" } @{ Nome="Desativar WSearch (Indexacao)"; Cat="Servicos"; Acao="svc_wsearch" } @{ Nome="Desativar SysMain (Superfetch)"; Cat="Servicos"; Acao="svc_sysmain" } @{ Nome="Desativar Print Spooler (sem impr.)"; Cat="Servicos"; Acao="svc_spooler" } @{ Nome="Desativar Fax"; Cat="Servicos"; Acao="svc_fax" } @{ Nome="Desativar Remote Registry"; Cat="Servicos"; Acao="svc_remreg" } @{ Nome="Desativar Tablet Input Service"; Cat="Servicos"; Acao="svc_tablet" } @{ Nome="Desativar Touch Keyboard (sem touch)"; Cat="Servicos"; Acao="svc_touch" } @{ Nome="Desativar Geolocation Service"; Cat="Servicos"; Acao="svc_geoloc" } @{ Nome="Desativar Connected User Experiences"; Cat="Servicos"; Acao="svc_diagsvc" } @{ Nome="Desativar Xbox Live Services (4x)"; Cat="Servicos"; Acao="svc_xbox" } @{ Nome="Desativar WalletService"; Cat="Servicos"; Acao="svc_wallet" } @{ Nome="Desativar MapsBroker"; Cat="Servicos"; Acao="svc_maps" } @{ Nome="Desativar RetailDemo"; Cat="Servicos"; Acao="svc_retail" } @{ Nome="Desativar SharedAccess (ICS)"; Cat="Servicos"; Acao="svc_ics" } @{ Nome="Desativar Distributed Link Tracking"; Cat="Servicos"; Acao="svc_trkwks" } ) # ─── Funcoes Core ───────────────────────────────────────── function Escrever-Log { param([string]$Msg, [string]$Tipo = "INFO") if ($script:previewMode) { return } $linha = "[$(Get-Date -Format 'HH:mm:ss')][$Tipo] $Msg" if ($null -ne $script:logQueue) { $script:logQueue.Enqueue($linha); return } if ($script:logFile) { try { [IO.File]::AppendAllText($script:logFile, "$linha`r`n", [Text.UTF8Encoding]::new($false)) } catch { Write-Warning 'Nao foi possivel gravar o log da sessao.' } } Write-Host $linha if ($script:txtLog -and -not $script:txtLog.IsDisposed) { $script:txtLog.AppendText("$linha`r`n") $script:txtLog.ScrollToCaret() } } function Invoke-NativeChecked { param([string]$FilePath, [string[]]$Arguments, [int[]]$SuccessCodes=@(0)) $command=Get-Command -Name $FilePath -CommandType Application -ErrorAction Stop $previousPreference=$ErrorActionPreference try { $ErrorActionPreference='Continue'; $output = & $command.Source @Arguments 2>&1; $code=$LASTEXITCODE } finally { $ErrorActionPreference=$previousPreference } if ($code -notin $SuccessCodes) { throw "$FilePath falhou (codigo $code): $($output -join ' ')" } if ($code -eq 3010) { Escrever-Log 'Operacao concluida; reinicio do computador necessario.' 'AVISO' } return $output } function Rodar-Async { param([ScriptBlock]$Bloco, [hashtable]$Vars = @{}, [ScriptBlock]$AoFinalizar = $null, [ScriptBlock]$AoProgresso = $null) $owner = [Windows.Forms.Form]::ActiveForm if ($script:operationBusy -and $script:form) { if ($AoFinalizar) { & $AoFinalizar @() ([Management.Automation.ErrorRecord]::new([InvalidOperationException]::new('Aguarde a operacao atual.'), 'Busy', 'ResourceBusy', $null)) } return } if ($script:form) { $script:operationBusy=$true; $script:form.Enabled=$false } if ($owner) { $owner.Enabled=$false } $rs = $null; $ps = $null; $timer = $null try { $rs = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace() $rs.ApartmentState = 'STA'; $rs.ThreadOptions = 'ReuseThread'; $rs.Open() foreach ($k in $Vars.Keys) { $rs.SessionStateProxy.SetVariable($k, $Vars[$k]) } $queue = New-Object 'System.Collections.Concurrent.ConcurrentQueue[string]' $rs.SessionStateProxy.SetVariable('logQueue', $queue) $ps = [System.Management.Automation.PowerShell]::Create(); $ps.Runspace = $rs $progress = New-Object 'System.Collections.Concurrent.ConcurrentQueue[string]' $rs.SessionStateProxy.SetVariable('progressQueue', $progress) $rs.SessionStateProxy.SetVariable('historyRoot', $script:historyRoot) $names = if ($script:workerFunctions) { $script:workerFunctions } else { @('Escrever-Log','RegSet','Svc-Disable','Invoke-NativeChecked') } foreach ($name in $names) { $body = (Get-Item "Function:\$name").ScriptBlock.ToString() $ps.AddScript("function $name { $body }") | Out-Null } $ps.AddScript('$ErrorActionPreference = "Stop"') | Out-Null $ps.AddScript($Bloco.ToString()) | Out-Null $handle = $ps.BeginInvoke() $timer = New-Object System.Windows.Forms.Timer; $timer.Interval = 150 $timer.Tag = @{ PS=$ps; Runspace=$rs; Handle=$handle; Queue=$queue; Callback=$AoFinalizar; Progress=$progress; OnProgress=$AoProgresso; Owner=$owner } if ($null -eq $script:asyncTimers) { $script:asyncTimers = New-Object System.Collections.ArrayList } [void]$script:asyncTimers.Add($timer) $timer.add_Tick({ param($sender, $eventArgs) $state = $sender.Tag; $line = $null while ($state.Queue.TryDequeue([ref]$line)) { Escrever-Log $line 'ASYNC' } $progressText=$null while ($state.Progress.TryDequeue([ref]$progressText)) { if ($state.OnProgress) { try { & $state.OnProgress $progressText } catch { Escrever-Log 'Falha ao atualizar progresso.' 'AVISO' } } } if (-not $state.Handle.IsCompleted) { return } $sender.Stop(); $result = @(); $failure = $null try { $result = @($state.PS.EndInvoke($state.Handle)) } catch { $failure = $_ } finally { while ($state.Queue.TryDequeue([ref]$line)) { Escrever-Log $line 'ASYNC' } $state.PS.Dispose(); $state.Runspace.Dispose() [void]$script:asyncTimers.Remove($sender); $sender.Dispose() } $script:operationBusy=$false if ($script:form -and -not $script:form.IsDisposed) { $script:form.Enabled=$true } if ($state.Owner -and -not $state.Owner.IsDisposed) { $state.Owner.Enabled=$true } if ($failure) { Escrever-Log "Operacao falhou: $failure" 'ERRO' } if ($state.Callback) { try { & $state.Callback $result $failure } catch { Escrever-Log "Erro ao finalizar operacao: $_" 'ERRO' } } }) $timer.Start() } catch { if ($timer) { $timer.Dispose() } if ($ps) { $ps.Dispose() } if ($rs) { $rs.Dispose() } $script:operationBusy=$false if ($script:form -and -not $script:form.IsDisposed) { $script:form.Enabled=$true } if ($owner -and -not $owner.IsDisposed) { $owner.Enabled=$true } Escrever-Log "Nao foi possivel iniciar a operacao: $_" 'ERRO' if ($AoFinalizar) { & $AoFinalizar @() $_ } } } function Inicializar-Sessao { $script:sessionId = Get-Date -Format 'yyyyMMdd-HHmmss-ffff' $script:stateRoot = Join-Path $env:LOCALAPPDATA 'VicTool' $script:historyRoot = Join-Path $script:stateRoot 'history' $script:logFile = Join-Path $script:stateRoot "logs\$($script:sessionId).log" New-Item -ItemType Directory -Path $script:historyRoot,(Split-Path $script:logFile) -Force -ErrorAction Stop | Out-Null $script:operationId = $null } function Iniciar-RegistroOperacao { param([string]$Label) $script:operationId = [guid]::NewGuid().ToString('N') $script:operationLabel = $Label $script:changeCount = 0 } function Salvar-EstadoAnterior { param([hashtable]$State) if (-not $script:historyRoot) { throw 'Historico nao inicializado. Nenhuma alteracao foi feita.' } if (-not $script:operationId) { Iniciar-RegistroOperacao 'Ajuste individual' } $State.Operation = $script:operationId $State.Label = $script:operationLabel $State.Created = [DateTime]::UtcNow $State.Restored = $false $State.Computer = $env:COMPUTERNAME $State.User = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value $path = Join-Path $script:historyRoot ("{0}-{1}.clixml" -f [DateTime]::UtcNow.Ticks, [guid]::NewGuid().ToString('N')) $State | Export-Clixml -LiteralPath "$path.tmp" -Depth 12 -ErrorAction Stop Move-Item -LiteralPath "$path.tmp" -Destination $path -ErrorAction Stop $script:changeCount++ return $path } function RegSet { param([string]$path, [string]$name, $value, [string]$type = 'DWord') $keyExists = Test-Path -LiteralPath $path $exists = $false; $oldValue = $null; $oldType = $null if ($keyExists) { $key = Get-Item -LiteralPath $path -ErrorAction Stop $exists = $key.GetValueNames() -contains $name if ($exists) { $oldType = $key.GetValueKind($name).ToString() $oldValue = $key.GetValue($name, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) $same=(@($oldValue).Count -eq @($value).Count) for ($i=0; $same -and $i -lt @($value).Count; $i++) { if (@($oldValue)[$i] -cne @($value)[$i]) { $same=$false } } if ($oldType -eq $type -and $same) { if ($script:previewMode) { [void]$script:previewItems.Add([pscustomobject]@{Current="$name=$oldValue"; Applied=$true}) } return } } } if ($script:previewMode) { [void]$script:previewItems.Add([pscustomobject]@{Current="${name}: $(if($exists){$oldValue}else{'padrao/ausente'}) -> $value"; Applied=$false}); return } Salvar-EstadoAnterior @{Kind='Registry'; Path=$path; Name=$name; KeyExisted=$keyExists; Existed=$exists; Value=$oldValue; Type=$oldType} | Out-Null if (-not $keyExists) { New-Item -Path $path -Force -ErrorAction Stop | Out-Null } $key=Get-Item -LiteralPath $path -ErrorAction Stop switch ($type) { 'MultiString' { $value=[string[]]$value } 'Binary' { $value=[byte[]]$value } 'None' { $value=[byte[]]$value } 'DWord' { $value=[int]$value } 'QWord' { $value=[long]$value } } [Microsoft.Win32.Registry]::SetValue($key.Name, $name, $value, [Microsoft.Win32.RegistryValueKind]$type) } function Svc-Disable { param([string]$Nome) $svc = Get-Service -Name $Nome -ErrorAction Stop $key = Get-ItemProperty -LiteralPath "HKLM:\SYSTEM\CurrentControlSet\Services\$Nome" -ErrorAction Stop if ($key.Start -eq 4 -and $svc.Status -eq 'Stopped') { return } if ($script:previewMode) { [void]$script:previewItems.Add([pscustomobject]@{Current="$Nome`: $($svc.Status) / $($svc.StartType)"; Applied=$false}); return } Salvar-EstadoAnterior @{Kind='Service'; Name=$Nome; Start=[int]$key.Start; Delayed=$key.DelayedAutoStart; Status=$svc.Status.ToString()} | Out-Null if ($svc.Status -ne 'Stopped') { Stop-Service -Name $Nome -ErrorAction Stop } Set-Service -Name $Nome -StartupType Disabled -ErrorAction Stop Escrever-Log "Servico '$Nome' desativado." 'OK' } function Set-VicDns { param([int]$InterfaceIndex, [string[]]$Servers, [switch]$Automatic) $adapter = Get-NetAdapter -InterfaceIndex $InterfaceIndex -ErrorAction Stop $guid = $adapter.InterfaceGuid.ToString().Trim('{}') $keyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{$guid}" $static = (Get-ItemProperty -LiteralPath $keyPath -ErrorAction Stop).NameServer $dns = Get-DnsClientServerAddress -InterfaceIndex $InterfaceIndex -AddressFamily IPv4 -ErrorAction Stop if ($Automatic -and [string]::IsNullOrWhiteSpace($static)) { return } if (-not $Automatic -and $static -and ($dns.ServerAddresses -join ',') -eq ($Servers -join ',')) { return } Salvar-EstadoAnterior @{Kind='Dns'; Guid=$guid; Automatic=[string]::IsNullOrWhiteSpace($static); Servers=@($dns.ServerAddresses)} | Out-Null if ($Automatic) { $dns | Set-DnsClientServerAddress -ResetServerAddresses -ErrorAction Stop } else { $dns | Set-DnsClientServerAddress -ServerAddresses $Servers -ErrorAction Stop } } function Salvar-ArquivoAnterior { param([string]$Path) Salvar-EstadoAnterior @{Kind='File'; Path=$Path; Bytes=[IO.File]::ReadAllBytes($Path)} | Out-Null } function Get-VicHistory { if (-not (Test-Path -LiteralPath $script:historyRoot)) { return } foreach ($file in Get-ChildItem -LiteralPath $script:historyRoot -Filter '*.clixml' | Sort-Object Name -Descending) { $record = Import-Clixml -LiteralPath $file.FullName -ErrorAction Stop if (-not $record.Restored -and $record.Computer -eq $env:COMPUTERNAME -and $record.User -eq [Security.Principal.WindowsIdentity]::GetCurrent().User.Value) { [pscustomobject]@{File=$file.FullName; State=$record} } } } function Restaurar-UltimaOperacao { $records = @(Get-VicHistory) if (-not $records.Count) { Escrever-Log 'Nenhuma alteracao reversivel pendente.'; return } $operation = $records[0].State.Operation foreach ($record in $records | Where-Object { $_.State.Operation -eq $operation }) { $s = $record.State switch ($s.Kind) { 'Registry' { if ($s.Existed) { if (-not (Test-Path -LiteralPath $s.Path)) { New-Item -Path $s.Path -Force -ErrorAction Stop | Out-Null } $key=Get-Item -LiteralPath $s.Path -ErrorAction Stop switch ($s.Type) { 'MultiString' { $s.Value=[string[]]$s.Value } 'Binary' { $s.Value=[byte[]]$s.Value } 'None' { $s.Value=[byte[]]$s.Value } 'DWord' { $s.Value=[int]$s.Value } 'QWord' { $s.Value=[long]$s.Value } } [Microsoft.Win32.Registry]::SetValue($key.Name, $s.Name, $s.Value, [Microsoft.Win32.RegistryValueKind]$s.Type) } elseif (Test-Path -LiteralPath $s.Path) { $key = Get-Item -LiteralPath $s.Path -ErrorAction Stop if ($key.GetValueNames() -contains $s.Name) { if ($s.Name -eq '') { $hive=if($key.Name.StartsWith('HKEY_CURRENT_USER\')){[Microsoft.Win32.Registry]::CurrentUser}else{[Microsoft.Win32.Registry]::LocalMachine} $writable=$hive.OpenSubKey($key.Name.Substring($key.Name.IndexOf('\')+1),$true) try { $writable.DeleteValue('', $false) } finally { $writable.Dispose() } } else { Remove-ItemProperty -LiteralPath $s.Path -Name $s.Name -ErrorAction Stop } } $key = Get-Item -LiteralPath $s.Path -ErrorAction Stop if (-not $s.KeyExisted -and $key.ValueCount -eq 0 -and $key.SubKeyCount -eq 0) { Remove-Item -LiteralPath $s.Path -ErrorAction Stop } } } 'Service' { $mode = switch ([int]$s.Start) { 2 {'Automatic'} 3 {'Manual'} 4 {'Disabled'} default { throw 'Tipo de servico nao suportado para restauracao.' } } Set-Service -Name $s.Name -StartupType $mode -ErrorAction Stop $path = "HKLM:\SYSTEM\CurrentControlSet\Services\$($s.Name)" if ($null -ne $s.Delayed) { Set-ItemProperty -LiteralPath $path -Name DelayedAutoStart -Value $s.Delayed -ErrorAction Stop } elseif ((Get-Item -LiteralPath $path).GetValueNames() -contains 'DelayedAutoStart') { Remove-ItemProperty -LiteralPath $path -Name DelayedAutoStart -ErrorAction Stop } if ($s.Status -eq 'Running') { Start-Service -Name $s.Name -ErrorAction Stop } else { Stop-Service -Name $s.Name -ErrorAction Stop } } 'Dns' { $adapter = Get-NetAdapter -ErrorAction Stop | Where-Object { $_.InterfaceGuid.ToString().Trim('{}') -eq $s.Guid } | Select-Object -First 1 if (-not $adapter) { throw 'Adaptador original nao encontrado.' } $dns = Get-DnsClientServerAddress -InterfaceIndex $adapter.InterfaceIndex -AddressFamily IPv4 -ErrorAction Stop if ($s.Automatic) { $dns | Set-DnsClientServerAddress -ResetServerAddresses -ErrorAction Stop } else { $dns | Set-DnsClientServerAddress -ServerAddresses $s.Servers -ErrorAction Stop } } 'File' { [IO.File]::WriteAllBytes($s.Path, [byte[]]$s.Bytes) } 'Power' { Invoke-NativeChecked powercfg @('/setactive', $s.Guid) | Out-Null } default { throw "Registro desconhecido: $($s.Kind)" } } $s.Restored = $true $s | Export-Clixml -LiteralPath "$($record.File).tmp" -Depth 12 -ErrorAction Stop Move-Item -LiteralPath "$($record.File).tmp" -Destination $record.File -Force -ErrorAction Stop Escrever-Log "Restaurado: $($s.Label) / $($s.Kind)" 'OK' } Escrever-Log 'Restauracao concluida. Reinicie a sessao ou o computador para ajustes que dependem de reinicio.' 'OK' } function Limpar-Temporarios { $removed = 0; $skipped = 0; $bytes = [long]0 foreach ($path in @($env:TEMP, (Join-Path $env:WINDIR 'Temp')) | Select-Object -Unique) { $base = [IO.Path]::GetFullPath($path).TrimEnd('\') if ($base -eq [IO.Path]::GetPathRoot($base).TrimEnd('\') -or $base -eq $env:WINDIR.TrimEnd('\')) { throw 'Diretorio de limpeza invalido.' } if (-not (Test-Path -LiteralPath $base)) { continue } if ((Get-Item -LiteralPath $base -Force -ErrorAction Stop).Attributes -band [IO.FileAttributes]::ReparsePoint) { $skipped++; continue } # Traverse explicitly, never follow junctions or symbolic links. $pending = New-Object 'System.Collections.Generic.Stack[string]' $pending.Push($base) while ($pending.Count) { $dir = $pending.Pop() try { $children = @(Get-ChildItem -LiteralPath $dir -Force -ErrorAction Stop) } catch { $skipped++; continue } foreach ($item in $children) { if ($item.Attributes -band [IO.FileAttributes]::ReparsePoint) { $skipped++; continue } if ($item.PSIsContainer) { $pending.Push($item.FullName); continue } if ($item.LastWriteTime -gt (Get-Date).AddDays(-1)) { continue } try { $size = $item.Length; Remove-Item -LiteralPath $item.FullName -Force -ErrorAction Stop; $removed++; $bytes += $size } catch { $skipped++ } } } } $script:partialOperation = $skipped -gt 0 Escrever-Log "Limpeza: $removed arquivo(s), $([math]::Round($bytes/1MB, 1)) MB liberados; $skipped item(ns) ignorados ou indisponiveis. Arquivos recentes preservados." $(if($skipped){'AVISO'}else{'OK'}) } function Get-TweakInfo { param($Item) $a = $Item.Acao $build = [int](Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction Stop).CurrentBuildNumber $compatible = $build -ge 10240 $reason = if ($compatible) { 'Disponivel' } else { 'Requer Windows 10 ou superior' } if ($a -in @('ui_menu','ui_taskbar','ui_endtask','ui_clock_sec') -and $build -lt 22000) { $compatible=$false; $reason='Requer Windows 11' } if ($a -eq 'ui_endtask' -and $build -lt 22631) { $compatible=$false; $reason='Requer Windows 11 23H2 ou superior' } $services = @{ perf_sysmain=@('SysMain'); perf_index=@('WSearch'); priv_telemetria=@('DiagTrack','dmwappushservice') svc_diagtrack=@('DiagTrack'); svc_wsearch=@('WSearch'); svc_sysmain=@('SysMain'); svc_spooler=@('Spooler') svc_fax=@('Fax'); svc_remreg=@('RemoteRegistry'); svc_tablet=@('TabletInputService'); svc_touch=@('TouchKeyboardAndHandwritingPanelService') svc_geoloc=@('lfsvc'); svc_diagsvc=@('DiagnosticHub.StandardCollector.Service'); svc_xbox=@('XblAuthManager','XblGameSave','XboxGipSvc','XboxNetApiSvc') svc_wallet=@('WalletService'); svc_maps=@('MapsBroker'); svc_retail=@('RetailDemo'); svc_ics=@('SharedAccess'); svc_trkwks=@('TrkWks') } $state = 'Sera verificado ao aplicar' if ($a -in @('perf_energia','perf_energia_max')) { try { $active=(Invoke-NativeChecked powercfg @('/getactivescheme')) -join ' ' $target=if($a -eq 'perf_energia'){'8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c'}else{'5c1a75d2-8d9a-4f8f-a8ef-60c90e8b8e11'} $state=if($active -match $target){'Ja aplicado'}else{$active.Trim()} } catch { $compatible=$false; $reason='Nao foi possivel consultar o plano de energia.' } } if ($services.ContainsKey($a)) { $states = @(); $allDisabled = $true foreach ($name in $services[$a]) { $svc = Get-Service -Name $name -ErrorAction SilentlyContinue if (-not $svc) { $compatible=$false; $reason="Servico ausente: $name"; $allDisabled=$false; continue } $states += "$name`: $($svc.Status) / $($svc.StartType)" if ($svc.StartType -ne 'Disabled' -or $svc.Status -ne 'Stopped') { $allDisabled=$false } } $state = $states -join '; ' if ($allDisabled -and $a -ne 'priv_telemetria') { $state = 'Ja aplicado' } } $registryChecks = @{ ui_ext=@('HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced','HideFileExt',0) ui_hidden=@('HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced','Hidden',1) ui_taskbar=@('HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced','TaskbarAl',0) ui_clock_sec=@('HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced','ShowSecondsInSystemClock',1) ui_endtask=@('HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings','TaskbarEndTask',1) perf_visual=@('HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects','VisualFXSetting',2) } if ($registryChecks.ContainsKey($a)) { $check = $registryChecks[$a]; $key = Get-Item -LiteralPath $check[0] -ErrorAction SilentlyContinue if ($key -and $key.GetValueNames() -contains $check[1]) { $value = $key.GetValue($check[1]); $state = "Valor atual: $value" if ($value -eq $check[2]) { $state='Ja aplicado' } } else { $state='Configuracao padrao (valor ausente)' } } if ($compatible -and $a -notin @('perf_energia','perf_energia_max','perf_temp','perf_hibern','perf_ntfs','priv_hosts')) { $script:previewItems=New-Object Collections.ArrayList $script:previewMode=$true try { Aplicar-Tweak-Item $a if ($script:previewItems.Count) { $state=($script:previewItems | ForEach-Object { $_.Current }) -join '; ' if (-not @($script:previewItems | Where-Object { -not $_.Applied }).Count) { $state='Ja aplicado' } } } catch { $compatible=$false; $reason=$_.Exception.Message } finally { $script:previewMode=$false; $script:previewItems=$null } } $impacts = @{ perf_index='Desativa a indexacao da pesquisa de arquivos.'; svc_wsearch='Desativa a indexacao da pesquisa de arquivos.' perf_sysmain='Desativa o servico de pre-carregamento de aplicativos.'; svc_sysmain='Desativa o pre-carregamento de aplicativos.' perf_temp='Exclui temporarios com mais de 24 horas. Nao pode desfazer a exclusao.' perf_energia='Ativa Alto Desempenho; pode aumentar consumo e aquecimento.'; perf_energia_max='Ativa Desempenho Maximo; pode aumentar consumo e aquecimento.' perf_hibern='Desativa hibernacao. Reative manualmente com powercfg /hibernate on.' perf_ntfs='Desativa criacao de nomes curtos 8.3. Pode afetar programas legados; ajuste avancado.' perf_cpu_prio='Altera prioridade do agendador. Nao garante ganho de desempenho.' svc_spooler='Impede impressao enquanto o Spooler estiver desativado.' svc_ics='Desativa compartilhamento de internet e pode afetar hotspot.' svc_touch='Pode afetar teclado virtual e entrada por toque.'; svc_tablet='Pode afetar entrada por toque e caneta.' svc_xbox='Pode afetar recursos Xbox e jogos que usam esses servicos.' priv_devices='Bloqueia acesso de aplicativos a microfone e camera.' priv_hosts='Adiciona bloqueios no hosts; os efeitos dependem dos endpoints utilizados.' priv_location='Pode afetar aplicativos que utilizam localizacao.' priv_telemetria='Configura politicas e servicos. O efeito depende da edicao do Windows.' } $impact = if ($impacts.ContainsKey($a)) { $impacts[$a] } else { $Item.Nome + '. O efeito pode depender da versao do Windows.' } $restart = if ($Item.Cat -eq 'Interface') { 'Explorer/sessao' } elseif ($a -in @('perf_cpu_prio','perf_ntfs')) { 'Computador' } else { 'Pode exigir nova sessao' } [pscustomobject]@{Nome=$Item.Nome; Acao=$a; Compativel=$compatible; Compatibilidade=$reason; Estado=$state; Impacto=$impact; Reinicio=$restart; Reversivel=($a -notin @('perf_temp','perf_hibern','perf_ntfs'))} } function Invoke-TweakBatch { param([array]$Items) foreach ($item in $Items) { Iniciar-RegistroOperacao $item.Nome $script:partialOperation = $false try { $info = Get-TweakInfo $item if (-not $info.Compativel) { $status='Ignorado'; $detail=$info.Compatibilidade } elseif ($info.Estado -eq 'Ja aplicado') { $status='Ja aplicado'; $detail=$info.Estado } else { Aplicar-Tweak-Item $item.Acao $status = if ($script:partialOperation) {'Parcial'} elseif ($script:changeCount -eq 0 -and $info.Reversivel) {'Ja aplicado'} else {'Concluido'} $detail = "Reinicio: $($info.Reinicio). Desfazer: $(if($info.Reversivel){'disponivel no historico'}else{'nao automatico'})." } } catch { $status = if ($script:changeCount -gt 0) {'Parcial'} else {'Falhou'} $detail = $_.Exception.Message } Escrever-Log "$($item.Nome): $status - $detail" $(if($status -in @('Falhou','Parcial')){'AVISO'}else{'INFO'}) [pscustomobject]@{Item=$item.Nome; Resultado=$status; Detalhes=$detail} } } function Mostrar-Resultados { param([array]$Results, [string]$Title='Resultados') $dialog = New-Object Windows.Forms.Form $dialog.Text=$Title; $dialog.Size=New-Object Drawing.Size(920,480); $dialog.StartPosition='CenterParent' $grid = New-Object Windows.Forms.DataGridView $grid.Dock='Fill'; $grid.ReadOnly=$true; $grid.AllowUserToAddRows=$false; $grid.AutoSizeColumnsMode='Fill' $grid.AutoSizeRowsMode='AllCells'; $grid.DefaultCellStyle.WrapMode='True' $table = New-Object Data.DataTable if ($Results.Count) { foreach ($p in $Results[0].PSObject.Properties) { [void]$table.Columns.Add($p.Name) } foreach ($result in $Results) { $row=$table.NewRow(); foreach ($p in $result.PSObject.Properties) { $row[$p.Name]=[string]$p.Value }; $table.Rows.Add($row) } } $grid.DataSource=$table; $dialog.Controls.Add($grid) [void]$dialog.ShowDialog($script:form); $dialog.Dispose() } function Invoke-VicNetwork { param([scriptblock]$Work, [hashtable]$Vars=@{}, [string]$Title) Escrever-Log "$Title em andamento..." Rodar-Async -Vars $Vars -Bloco $Work -AoFinalizar { param($results,$failure) if ($failure) { Exibir-RedeOut -titulo 'Falha ou operacao parcial' -texto $failure.Exception.Message; return } $text = ($results | Out-String) Exibir-RedeOut -titulo $Title -texto $text Escrever-Log "$Title concluido." 'OK' }.GetNewClosure() } function Get-WingetResult { param([int]$ExitCode) switch ($ExitCode) { 0 { 'Instalado' } -1978335189 { 'Ja atualizado' } 3010 { 'Instalado; reinicie o computador' } 1641 { 'Instalado; reinicio iniciado' } default { 'Falhou' } } } function Publicar-Progresso { param([string]$Text) if ($script:progressQueue) { $script:progressQueue.Enqueue($Text) } } function Solicitar-DesfazerAjuste { param([string]$Label) try { $history=@(Get-VicHistory) if (-not $history.Count -or $history[0].State.Label -ne $Label) { [Windows.Forms.MessageBox]::Show('Use Historico / Desfazer para restaurar as operacoes mais recentes primeiro. Apenas ajustes feitos nesta versao possuem historico.') | Out-Null return } if ([Windows.Forms.MessageBox]::Show("Restaurar o estado anterior de $Label?",'Desfazer','YesNo','Question') -eq 'Yes') { Rodar-Async -Bloco { Restaurar-UltimaOperacao } } } catch { Escrever-Log 'Falha ao consultar historico.' 'ERRO' } } function Executar-Manutencao { param([string]$Title,[scriptblock]$Work) Escrever-Log "$Title em andamento..." Rodar-Async -Bloco $Work -AoFinalizar { param($results,$failure) if ($failure) { [Windows.Forms.MessageBox]::Show('A operacao falhou ou foi concluida parcialmente. Consulte o log.','Manutencao','OK','Warning') | Out-Null; return } $detail=($results | Out-String).Trim() Escrever-Log "$Title concluido. $detail" 'OK' Mostrar-Resultados @([pscustomobject]@{Operacao=$Title;Resultado='Concluido';Detalhes=$detail}) 'Manutencao' }.GetNewClosure() } # MAS incorporado em Base64 para preservar os bytes do arquivo batch. $script:masSha256 = 'D09770CCBE5D2EB7BFDB6556ECF44ADB69D7A174CBC963295BDB44BBD27B8BB4' $script:masConteudoBase64 = @' QDo6UGxlYXNlIHN0b3AgZmFsc2UtZmxhZ2dpbmcgdGhpcyBzY3JpcHQgb3ZlciBhbmQgb3Zlci4gVGhpcyBpcyB0aGUgM3JkIHRpbWUgSSd2ZSBoYWQgdG8g dXBkYXRlIHRoZSBzY3JpcHQgdG8gZGVhbCB3aXRoIHRoZSBmYWxzZSBwb3NpdGl2ZXMuDQpAOjpOb3RoaW5nIGluIHRoaXMgc2NyaXB0IGlzIG1hbGljaW91 cyBhbmQgaXQgaXMgdXNlZCBieSB0aG91c2FuZHMgb2YgcGVvcGxlICpkYWlseSouDQpAOjpJcyBhIHJlYWwgcGVyc29uIGV2ZW4gdGhlIG9uZSBkZWNpZGlu ZyB0byBmbGFnIHRoaXMgb3IgaXMgaXQgQ29waWxvdCB0b2xkIHRvIGZsYWcgYW55dGhpbmcgaXQgZGVjaWRlcyBub3QgdG8gbGlrZT8NCkA6OklmIGEgY2Ft cGFpZ24gaXMgdXNpbmcgdGhpcyBzY3JpcHQgYXMgYSBjb3ZlciwgcGxlYXNlIGZsYWcgcGFydHMgb2YgdGhlIGNhbXBhaWduIGluc3RlYWQgb2YgdGhlIHNj cmlwdC4gVGhpcyBpc24ndCB0aGUgZmlyc3QgdGltZSB3ZSBleHBlcmllbmNlZCBjb2xsYXRlcmFsIGRhbWFnZSBkdWUgdG8gY2FtcGFpZ25zIGNvbXBsZXRl bHkgdW5yZWxhdGVkIHRvIHVzLg0KQDo6SWYgeW91IGRpc2FncmVlIHRoYXQgTUFTIGlzIG5vdCBtYWxpY2lvdXMsIHdlIHdvdWxkIGFwcHJlY2lhdGUgaWYg eW91IGNvbnRhY3RlZCB1cyB0byBleHBsYWluIHdoYXQgY29uc3RpdHV0ZXMgTUFTIGFzICJTb25ib2tsaSIgYW5kIHdlJ2xsIGxvb2sgaW50byBpdC4gVGhh bmsgeW91LiANCkBzZXQgbWFzdmVyPTMuMTINCkBzZXRsb2NhbCBEaXNhYmxlRGVsYXllZEV4cGFuc2lvbg0KQGVjaG8gb2ZmDQoNCg0KDQo6OiAgRm9yIGNv bW1hbmQgbGluZSBzd2l0Y2hlcywgY2hlY2sgbXt9YXNzZ3JhdmV7ZG90fWRldi9jb21tYW5kX2xpbmVfc3dpdGNoZXMNCjo6ICBJZiB5b3Ugd2FudCB0byBi ZXR0ZXIgdW5kZXJzdGFuZCBzY3JpcHQsIHJlYWQgZnJvbSBzZXBhcmF0ZSBmaWxlcyB2ZXJzaW9uLiANCg0KDQoNCjo6PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KOjoNCjo6ICAgSG9tZXBhZ2U6IG17fWFzc2dyYXZle2Rv dH1kZXYNCjo6DQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Cg0KDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcywg aXQgaGVscHMgaWYgdGhleSBhcmUgbWlzY29uZmlndXJlZCBpbiB0aGUgc3lzdGVtDQoNCnNldGxvY2FsIEVuYWJsZUV4dGVuc2lvbnMNCnNldGxvY2FsIERp c2FibGVEZWxheWVkRXhwYW5zaW9uDQoNCnNldCAiUGF0aEV4dD0uQ09NOy5FWEU7LkJBVDsuQ01EOy5WQlM7LlZCRTsuSlM7LkpTRTsuV1NGOy5XU0g7Lk1T QyINCg0Kc2V0ICJTeXNQYXRoPSVTeXN0ZW1Sb290JVxTeXN0ZW0zMiINCnNldCAiUGF0aD0lU3lzdGVtUm9vdCVcU3lzdGVtMzI7JVN5c3RlbVJvb3QlOyVT eXN0ZW1Sb290JVxTeXN0ZW0zMlxXYmVtOyVTeXN0ZW1Sb290JVxTeXN0ZW0zMlxXaW5kb3dzUG93ZXJTaGVsbFx2MS4wXCINCmlmIGV4aXN0ICIlU3lzdGVt Um9vdCVcU3lzbmF0aXZlXHJlZy5leGUiICgNCnNldCAiU3lzUGF0aD0lU3lzdGVtUm9vdCVcU3lzbmF0aXZlIg0Kc2V0ICJQYXRoPSVTeXN0ZW1Sb290JVxT eXNuYXRpdmU7JVN5c3RlbVJvb3QlOyVTeXN0ZW1Sb290JVxTeXNuYXRpdmVcV2JlbTslU3lzdGVtUm9vdCVcU3lzbmF0aXZlXFdpbmRvd3NQb3dlclNoZWxs XHYxLjBcOyVQYXRoJSINCikNCg0Kc2V0ICJDb21TcGVjPSVTeXNQYXRoJVxjbWQuZXhlIg0Kc2V0ICJQU01vZHVsZVBhdGg9JVByb2dyYW1GaWxlcyVcV2lu ZG93c1Bvd2VyU2hlbGxcTW9kdWxlczslU3lzUGF0aCVcV2luZG93c1Bvd2VyU2hlbGxcdjEuMFxNb2R1bGVzIg0KDQpjZCAvZCAiJVN5c1BhdGglIg0KDQo6 OiBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3Rlcm1pbmFsL2lzc3Vlcy8xNTIxMiwgd2hlbiAlMCBzdGFydHMgd2l0aCBh IHF1b3RlICUwIHBhcmFtZXRlciBleHBhbnNpb24gaXMgbm90IHNwZWNpYWxjYXNlZC4NCjo6IENoYW5naW5nICUwIHRvIHNvbWV0aGluZyB0aGF0IGlzIG5v dCBxdW90ZWQgYnlwYXNzZXMgdGhlIGlzc3VlLg0KZ290byBhcmdfd29ya2Fyb3VuZF9lbmQNCjphcmdfd29ya2Fyb3VuZA0Kc2V0ICJfY21kZj0lfmYwIg0K ZXhpdCAvYg0KOmFyZ193b3JrYXJvdW5kX2VuZA0KDQpjYWxsIDphcmdfd29ya2Fyb3VuZA0KDQpzZXQgcmUxPQ0Kc2V0IHJlMj0NCmZvciAlJSMgaW4gKCUq KSBkbyAoDQppZiAvaSAiJSUjIj09InJlMSIgc2V0IHJlMT0xDQppZiAvaSAiJSUjIj09InJlMiIgc2V0IHJlMj0xDQppZiAvaSAiJSUjIj09Ii1xZWRpdCIg KHNldCByZTE9MSZzZXQgcmUyPTEpDQopDQoNCjo6IFJlLWxhdW5jaCB0aGUgc2NyaXB0IHdpdGggeDY0IHByb2Nlc3MgaWYgaXQgd2FzIGluaXRpYXRlZCBi eSB4ODYgcHJvY2VzcyBvbiB4NjQgYml0IFdpbmRvd3MNCjo6IG9yIHdpdGggQVJNNjQgcHJvY2VzcyBpZiBpdCB3YXMgaW5pdGlhdGVkIGJ5IHg4Ni9BUk0z MiBwcm9jZXNzIG9uIEFSTTY0IFdpbmRvd3MNCg0KaWYgZXhpc3QgJVN5c3RlbVJvb3QlXFN5c25hdGl2ZVxjbWQuZXhlIGlmIG5vdCBkZWZpbmVkIHJlMSAo DQpzZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQpzdGFydCAlU3lzdGVtUm9vdCVcU3lzbmF0aXZlXGNtZC5leGUgL2MgIiIhX2NtZGYhIiAlKiBy ZTEiDQpleGl0IC9iDQopDQoNCjo6IFJlLWxhdW5jaCB0aGUgc2NyaXB0IHdpdGggQVJNMzIgcHJvY2VzcyBpZiBpdCB3YXMgaW5pdGlhdGVkIGJ5IHg2NCBw cm9jZXNzIG9uIEFSTTY0IFdpbmRvd3MNCg0KaWYgZXhpc3QgJVN5c3RlbVJvb3QlXFN5c0FybTMyXGNtZC5leGUgaWYgJVBST0NFU1NPUl9BUkNISVRFQ1RV UkUlPT1BTUQ2NCBpZiBub3QgZGVmaW5lZCByZTIgKA0Kc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0Kc3RhcnQgJVN5c3RlbVJvb3QlXFN5c0Fy bTMyXGNtZC5leGUgL2MgIiIhX2NtZGYhIiAlKiByZTIiDQpleGl0IC9iDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQ0KDQpzZXQgImJsYW5rPSINCnNldCAibWFzPWh0JWJsYW5rJXRwcyVibGFuayU6Ly9tJWJsYW5rJWFzcyVibGFuayVncmF2ZS5kZXYvIg0Kc2V0 ICJnaXRodWI9aHQlYmxhbmsldHBzJWJsYW5rJTovL2dpdGh1Yi5jb20vbSVibGFuayVhc3NncmElYmxhbmsldmVsL01pY3JvJWJsYW5rJXNvZnQtQWN0aSVi bGFuayV2YXRpb24tU2NyaXB0cyINCnNldCAic2VsZmdpdD1odCVibGFuayV0cHMlYmxhbmslOi8vZ2l0LmFjdGklYmxhbmsldmF0ZWQud2luL01pY3IlYmxh bmslb3NvZnQtQWN0JWJsYW5rJWl2YXRpb24tU2NyaXB0cyINCg0KOjogIENoZWNrIGlmIE51bGwgc2VydmljZSBpcyB3b3JraW5nLCBpdCdzIGltcG9ydGFu dCBmb3IgdGhlIGJhdGNoIHNjcmlwdA0KDQpzYyBxdWVyeSBOdWxsIHwgZmluZCAvaSAiUlVOTklORyINCmlmICVlcnJvcmxldmVsJSBORVEgMCAoDQplY2hv Og0KZWNobyBOdWxsIHNlcnZpY2UgaXMgbm90IHJ1bm5pbmcsIHNjcmlwdCBtYXkgY3Jhc2guLi4NCmVjaG86DQplY2hvOg0KZWNobyBDaGVjayB0aGlzIHdl YnBhZ2UgZm9yIGhlbHAgLSAlbWFzJWZpeF9zZXJ2aWNlDQplY2hvOg0KZWNobzoNCnBpbmcgMTI3LjAuMC4xIC1uIDIwDQopDQpjbHMNCg0KOjogIENoZWNr IExGIGxpbmUgZW5kaW5nDQoNCj5udWwgZmluZHN0ciAvdiAiJCIgIiVfY21kZiUiICYmICgNCmVjaG86DQplY2hvIEVycm9yIC0gU2NyaXB0IGVpdGhlciBo YXMgTEYgbGluZSBlbmRpbmcgaXNzdWUgb3IgYW4gZW1wdHkgbGluZSBhdCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQgaXMgbWlzc2luZy4NCmVjaG86DQplY2hv Og0KZWNobyBDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAlbWFzJXRyb3VibGVzaG9vdA0KZWNobzoNCmVjaG86DQpwaW5nIDEyNy4wLjAuMSAtbiAy MCA+bnVsDQpleGl0IC9iDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjbHMNCmNvbG9yIDA3DQp0 aXRsZSAgTWljcm9zb2Z0X0FjdGl2YXRpb25fU2NyaXB0cyAlbWFzdmVyJQ0KDQpzZXQgX2FyZ3M9DQpzZXQgX2VsZXY9DQpzZXQgX3VuYXR0ZW5kZWQ9MA0K DQpzZXQgX2FyZ3M9JSoNCmlmIGRlZmluZWQgX2FyZ3Mgc2V0IF9hcmdzPSVfYXJnczoiPSUNCmlmIGRlZmluZWQgX2FyZ3Mgc2V0IF9hcmdzPSVfYXJnczpy ZTE9JQ0KaWYgZGVmaW5lZCBfYXJncyBzZXQgX2FyZ3M9JV9hcmdzOnJlMj0lDQppZiBkZWZpbmVkIF9hcmdzICgNCmZvciAlJUEgaW4gKCVfYXJncyUpIGRv ICgNCmlmIC9pICIlJUEiPT0iLWVsIiAgICAgICAgICAgICAgICAgICAgc2V0IF9lbGV2PTENCikNCikNCg0KaWYgZGVmaW5lZCBfYXJncyBlY2hvICIlX2Fy Z3MlIiB8IGZpbmQgL2kgIi8iID5udWwgJiYgc2V0IF91bmF0dGVuZGVkPTENCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09DQoNCnNldCAibnVsMT0xPm51bCINCnNldCAibnVsMj0yPm51bCINCnNldCAibnVsNj0yXj5udWwiDQpzZXQgIm51bD0+bnVsIDI+JjEiDQoNCmNh bGwgOmRrX3NldHZhcg0KDQppZiAld2luYnVpbGQlIEVRVSAxICgNCiVlbGluZSUNCmVjaG8gRmFpbGVkIHRvIGRldGVjdCBXaW5kb3dzIGJ1aWxkIG51bWJl ci4NCmVjaG86DQpzZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2FsbCA6ZGtf Y29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCmdvdG8gZGtfZG9u ZQ0KKQ0KDQppZiBleGlzdCAiJVN5c3RlbWRyaXZlJVxVc2Vyc1xXREFHVXRpbGl0eUFjY291bnQiICgNCnNjIHF1ZXJ5IGdjcyB8IGZpbmQgL2kgIlJVTk5J TkciICVudWwlICYmICgNCiVlbGluZSUNCmVjaG8gV2luZG93cyBTYW5kYm94IGRldGVjdGVkOyBhY3RpdmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuDQplY2hv IFRoZSBzY3JpcHQgY2Fubm90IHJ1biBkdWUgdG8gbWlzc2luZyBsaWNlbnNpbmcgY29tcG9uZW50cy4gQWJvcnRpbmcuLi4NCmVjaG86DQpnb3RvIGRrX2Rv bmUNCikNCikNCg0KaWYgJXdpbmJ1aWxkJSBMU1MgNjAwMSAoDQolbmNlbGluZSUNCmVjaG8gVW5zdXBwb3J0ZWQgT1MgdmVyc2lvbiBkZXRlY3RlZCBbJXdp bmJ1aWxkJV0uDQplY2hvIE1BUyBvbmx5IHN1cHBvcnRzIFdpbmRvd3MgVmlzdGEvNy84LzguMS8xMC8xMSBhbmQgdGhlaXIgU2VydmVyIGVxdWl2YWxlbnRz Lg0KaWYgJXdpbmJ1aWxkJSBFUVUgNjAwMCAoDQplY2hvOg0KZWNobyBXaW5kb3dzIFZpc3RhIFJUTSBpcyBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgUG93ZXJz aGVsbCBjYW5ub3QgYmUgaW5zdGFsbGVkLg0KZWNobyBVcGdyYWRlIHRvIFdpbmRvd3MgVmlzdGEgU1AxIG9yIFNQMi4NCikNCmdvdG8gZGtfZG9uZQ0KKQ0K DQppZiAld2luYnVpbGQlIExTUyA3NjAwIGlmIG5vdCBleGlzdCAiJVN5c1BhdGglXFdpbmRvd3NQb3dlclNoZWxsXHYxLjBcTW9kdWxlcyIgKA0KJW5jZWxp bmUlDQppZiBub3QgZXhpc3QgJXBzJSAoDQplY2hvIFBvd2VyU2hlbGwgaXMgbm90IGluc3RhbGxlZCBpbiB5b3VyIHN5c3RlbS4NCikNCmVjaG8gSW5zdGFs bCBQb3dlclNoZWxsIDIuMCB1c2luZyB0aGUgZm9sbG93aW5nIFVSTC4NCmVjaG86DQplY2hvIGh0dHBzOi8vd3d3LmNhdGFsb2cudXBkYXRlLm1pY3Jvc29m dC5jb20vU2VhcmNoLmFzcHg/cT1LQjk2ODkzMA0KaWYgJV91bmF0dGVuZGVkJT09MCBzdGFydCBodHRwczovL3d3dy5jYXRhbG9nLnVwZGF0ZS5taWNyb3Nv ZnQuY29tL1NlYXJjaC5hc3B4P3E9S0I5Njg5MzANCmdvdG8gZGtfZG9uZQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0NCg0KOjogIEZpeCBzcGVjaWFsIGNoYXJhY3RlciBsaW1pdGF0aW9ucyBpbiBwYXRoIG5hbWUNCg0Kc2V0ICJfd29yaz0lfmRwMCINCmlmICIl X3dvcms6fi0xJSI9PSJcIiBzZXQgIl93b3JrPSVfd29yazp+MCwtMSUiDQoNCnNldCAiX2JhdHA9JV9jbWRmOic9JyclIg0KDQpzZXQgX1BTYXJnPSIiIiVf Y21kZiUiIiIgLWVsICVfYXJncyUNCnNldCBfUFNhcmc9JV9QU2FyZzonPScnJQ0KDQpzZXQgIl90dGVtcD0ldXNlcnByb2ZpbGUlXEFwcERhdGFcTG9jYWxc VGVtcCINCg0Kc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0KZWNobyAiIV9jbWRmISIgfCBmaW5kIC9pICIhX3R0ZW1wISIgJW51bDElICYmICgNCmlmIC9pIG5vdCAiIV93b3JrISI9PSIhX3R0ZW1wISIgKA0K JWVsaW5lJQ0KZWNobyBUaGUgc2NyaXB0IHdhcyBsYXVuY2hlZCBmcm9tIHRoZSB0ZW1wIGZvbGRlci4NCmVjaG8gWW91IGFyZSBtb3N0IGxpa2VseSBydW5u aW5nIHRoZSBzY3JpcHQgZGlyZWN0bHkgZnJvbSB0aGUgYXJjaGl2ZSBmaWxlLg0KZWNobzoNCmVjaG8gRXh0cmFjdCB0aGUgYXJjaGl2ZSBmaWxlIGFuZCBs YXVuY2ggdGhlIHNjcmlwdCBmcm9tIHRoZSBleHRyYWN0ZWQgZm9sZGVyLg0KZ290byBka19kb25lDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgRWxldmF0ZSBzY3JpcHQgYXMgYWRtaW4gYW5kIHBhc3MgYXJndW1lbnRzIGFuZCBwcmV2ZW50aW5n IGxvb3ANCg0KJW51bDElIGZsdG1jIHx8ICgNCmlmIG5vdCBkZWZpbmVkIF9lbGV2ICVwc2MlICJzdGFydCBjbWQuZXhlIC1hcmcgJy9jIFwiIV9QU2FyZyFc IicgLXZlcmIgcnVuYXMiICYmIGV4aXQgL2INCiVlbGluZSUNCmVjaG8gVGhpcyBzY3JpcHQgbmVlZHMgYWRtaW4gcmlnaHRzLg0KZWNobyBSaWdodCBjbGlj ayBvbiB0aGlzIHNjcmlwdCBhbmQgc2VsZWN0ICdSdW4gYXMgYWRtaW5pc3RyYXRvcicuDQpnb3RvIGRrX2RvbmUNCikNCg0KOjo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVjayBQb3dlclNoZWxsDQoNCjo6cHN0c3QgJEV4ZWN1dGlvbkNvbnRleHQuU2Vzc2lv blN0YXRlLkxhbmd1YWdlTW9kZSA6cHN0c3QNCg0KZm9yIC9mICJkZWxpbXM9IiAlJWEgaW4gKCclcHNjJSAiaWYgKCRQU1ZlcnNpb25UYWJsZS5QU0VkaXRp b24gLW5lICdDb3JlJykgeyRmPVtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzpwc3RzdCc7LiAoW3NjcmlwdGJsb2NrXTo6Q3Jl YXRlKCRmWzFdKSl9IiAlbnVsNiUnKSBkbyAoc2V0IHRzdHJlc3VsdD0lJWEpDQoNCmlmIC9pIG5vdCAiJXRzdHJlc3VsdCUiPT0iRnVsbExhbmd1YWdlIiAo DQolZWxpbmUlDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIkRXhlY3V0aW9uQ29udGV4dC5TZXNzaW9uU3RhdGUuTGFuZ3VhZ2VNb2RlIiAl bnVsNiUnKSBkbyAoc2V0IHRzdHJlc3VsdDI9JSVhKQ0KZWNobyBUZXN0IDEgLSAldHN0cmVzdWx0JQ0KZWNobyBUZXN0IDIgLSAhdHN0cmVzdWx0MiENCmVj aG86DQoNClJFTSBjaGVjayBMYW5ndWFnZU1vZGUNCg0KZWNobzogIXRzdHJlc3VsdDIhIHwgZmluZHN0ciAvaSAiQ29uc3RyYWluZWRMYW5ndWFnZSBSZXN0 cmljdGVkTGFuZ3VhZ2UgTm9MYW5ndWFnZSIgJW51bDElICYmICgNCmVjaG8gRnVsbExhbmd1YWdlIG1vZGUgbm90IGZvdW5kIGluIFBvd2VyU2hlbGwuIEFi b3J0aW5nLi4uDQplY2hvIElmIHlvdSBoYXZlIGFwcGxpZWQgcmVzdHJpY3Rpb25zIG9uIFBvd2Vyc2hlbGwgdGhlbiB1bmRvIHRob3NlIGNoYW5nZXMuDQpz ZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWZpeF9wb3dlcnNoZWxsDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAg LSAiICVfWWVsbG93JSAiICVtYXMlZml4X3Bvd2Vyc2hlbGwiDQpnb3RvIGRrX2RvbmUNCikNCg0KUkVNIGNoZWNrIFBvd2Vyc2hlbGwgY29yZSB2ZXJzaW9u DQoNCmNtZCAvYyAiJXBzYyUgIiRQU1ZlcnNpb25UYWJsZS5QU0VkaXRpb24iIiB8IGZpbmQgL2kgIkNvcmUiICVudWwxJSAmJiAoDQplY2hvIFdpbmRvd3Mg UG93ZXJzaGVsbCBpcyBuZWVkZWQgZm9yIE1BUyBidXQgaXQgc2VlbXMgdG8gYmUgcmVwbGFjZWQgd2l0aCBQb3dlcnNoZWxsIGNvcmUuIEFib3J0aW5nLi4u DQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBh Z2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlaW4tcGxhY2VfcmVwYWlyX3VwZ3JhZGUiDQpnb3RvIGRrX2RvbmUNCikNCg0KUkVNIGNoZWNrIGZv ciBNYWwtd2FyZSB0aGF0IG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBQb3dlcnNoZWxsDQoNCmZvciAvciAiJVByb2dyYW1GaWxlcyVcIiAlJWYgaW4gKHNlY3Vy ZWJvb3QuZXhlKSBkbyBpZiBleGlzdCAiJSVmIiAoDQplY2hvICIlJWYiDQplY2hvIE1hbCVibGFuayV3YXJlIGZvdW5kLCBQb3dlclNoZWxsIGlzIG5vdCB3 b3JraW5nIHByb3Blcmx5Lg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVyZW1vdmVfbWFsJXcld2FyZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sg dGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXJlbW92ZV9tYWwldyV3YXJlIg0KZ290byBka19kb25lDQopDQoNClJFTSBjaGVj ayBpZiAuTkVUIGlzIHdvcmtpbmcgcHJvcGVybHkNCg0KaWYgL2kgIiF0c3RyZXN1bHQyISI9PSJGdWxsTGFuZ3VhZ2UiICgNCmNtZCAvYyAiJXBzYyUgIiJ0 cnkge1tTeXN0ZW0uQXBwRG9tYWluXTo6Q3VycmVudERvbWFpbi5HZXRBc3NlbWJsaWVzKCk7IFtTeXN0ZW0uTWF0aF06OlNxcnQoMTQ0KX0gY2F0Y2gge0V4 aXQgM30iIiIgJW51bCUNCmlmICFlcnJvcmxldmVsIT09MyAoDQplY2hvIFdpbmRvd3MgUG93ZXJzaGVsbCBmYWlsZWQgdG8gbG9hZCAuTkVUIGNvbW1hbmQu IEFib3J0aW5nLi4uDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVj ayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlaW4tcGxhY2VfcmVwYWlyX3VwZ3JhZGUiDQpnb3RvIGRrX2RvbmUNCikNCikN Cg0KUkVNIGNoZWNrIGFudGl2aXJ1cyBhbmQgb3RoZXIgZXJyb3JzDQoNCmVjaG8gUG93ZXJTaGVsbCBpcyBub3Qgd29ya2luZyBwcm9wZXJseS4gQWJvcnRp bmcuLi4NCg0KaWYgL2kgIiF0c3RyZXN1bHQyISI9PSJGdWxsTGFuZ3VhZ2UiICgNCmVjaG86DQplY2hvIFlvdXIgYW50aXZpcnVzIHNvZnR3YXJlIG1pZ2h0 IGJlIGJsb2NraW5nIHRoZSBzY3JpcHQuDQplY2hvOg0Kc2MgcXVlcnkgc2Vuc2UgfCBmaW5kIC9pICJSVU5OSU5HIiAlbnVsJSAmJiAoDQplY2hvIEluc3Rh bGxlZCBBbnRpdmlydXMgLSBNaWNyb3NvZnQgRGVmZW5kZXIgZm9yIEVuZHBvaW50DQopDQpjbWQgL2MgIiVwc2MlICIiJGF2ID0gR2V0LVdtaU9iamVjdCAt TmFtZXNwYWNlIHJvb3RcU2VjdXJpdHlDZW50ZXIyIC1DbGFzcyBBbnRpVmlydXNQcm9kdWN0OyAkbiA9IEAoKTsgZm9yZWFjaCAoJGkgaW4gJGF2KSB7ICRu ICs9ICRpLmRpc3BsYXlOYW1lIH07IGlmICgkbikgeyBXcml0ZS1Ib3N0ICgnSW5zdGFsbGVkIEFudGl2aXJ1cyAtICcgKyAoJG4gLWpvaW4gJywgJykpfSIi Ig0KKQ0KDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZv ciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCmdvdG8gZGtfZG9uZQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIERpc2FibGUgUXVpY2tFZGl0IGFuZCBsYXVuY2ggZnJvbSBjb25ob3N0LmV4ZSB0byBhdm9pZCBUZXJtaW5h bCBhcHANCg0KaWYgJXdpbmJ1aWxkJSBHRVEgMTc3NjMgKA0Kc2V0IHRlcm1pbmFsPTENCikgZWxzZSAoDQpzZXQgdGVybWluYWw9DQopDQoNCjo6ICBDaGVj ayBpZiBzY3JpcHQgaXMgcnVubmluZyBpbiBUZXJtaW5hbCBhcHANCg0KaWYgZGVmaW5lZCB0ZXJtaW5hbCAoDQpzZXQgbGluZXM9MA0KZm9yIC9mICJza2lw PTMgdG9rZW5zPSogZGVsaW1zPSIgJSVBIGluICgnbW9kZSBjb24nKSBkbyBpZiAiIWxpbmVzISI9PSIwIiAoDQpmb3IgJSVCIGluICglJUEpIGRvIHNldCBs aW5lcz0lJUINCikNCmlmICFsaW5lcyEgR0VRIDEwMCBzZXQgdGVybWluYWw9DQopDQoNCmlmICVfdW5hdHRlbmRlZCU9PTEgZ290byA6c2tpcFFFDQpmb3Ig JSUjIGluICglX2FyZ3MlKSBkbyAoaWYgL2kgIiUlIyI9PSItcWVkaXQiIGdvdG8gOnNraXBRRSkNCg0KOjogIFJlbGF1bmNoIHRvIGRpc2FibGUgUXVpY2tF ZGl0IGluIHRoZSBjdXJyZW50IHNlc3Npb24gYW5kIHVzZSBjb25ob3N0LmV4ZSBpbnN0ZWFkIG9mIHRoZSBUZXJtaW5hbCBhcHANCjo6ICBUaGlzIGNvZGUg ZGlzYWJsZXMgUXVpY2tFZGl0IGZvciB0aGUgY3VycmVudCBjbWQuZXhlIHNlc3Npb24gd2l0aG91dCBtYWtpbmcgcGVybWFuZW50IHJlZ2lzdHJ5IGNoYW5n ZXMNCjo6ICBJdCBpcyBpbmNsdWRlZCBiZWNhdXNlIGNsaWNraW5nIG9uIHRoZSBzY3JpcHQgd2luZG93IGNhbiBwYXVzZSBleGVjdXRpb24sIGNhdXNpbmcg Y29uZnVzaW9uIHRoYXQgdGhlIHNjcmlwdCBoYXMgc3RvcHBlZCBkdWUgdG8gYW4gZXJyb3INCg0Kc2V0IHJlc2V0UUU9MQ0KcmVnIHF1ZXJ5IEhLQ1VcQ29u c29sZSAvdiBRdWlja0VkaXQgJW51bDIlIHwgZmluZCAvaSAiMHgwIiAlbnVsMSUgJiYgc2V0IHJlc2V0UUU9MA0KcmVnIGFkZCBIS0NVXENvbnNvbGUgL3Yg UXVpY2tFZGl0IC90IFJFR19EV09SRCAvZCAwIC9mICVudWwxJQ0KDQppZiBkZWZpbmVkIHRlcm1pbmFsICgNCnN0YXJ0IGNvbmhvc3QuZXhlICIhX2NtZGYh IiAlX2FyZ3MlIC1xZWRpdA0Kc3RhcnQgcmVnIGFkZCBIS0NVXENvbnNvbGUgL3YgUXVpY2tFZGl0IC90IFJFR19EV09SRCAvZCAlcmVzZXRRRSUgL2YgJW51 bDElDQpleGl0IC9iDQopIGVsc2UgaWYgJXJlc2V0UUUlIEVRVSAxICgNCnN0YXJ0IGNtZC5leGUgL2MgIiIhX2NtZGYhIiAlX2FyZ3MlIC1xZWRpdCINCnN0 YXJ0IHJlZyBhZGQgSEtDVVxDb25zb2xlIC92IFF1aWNrRWRpdCAvdCBSRUdfRFdPUkQgL2QgJXJlc2V0UUUlIC9mICVudWwxJQ0KZXhpdCAvYg0KKQ0KDQo6 c2tpcFFFDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgZm9yIHVwZGF0ZXMNCg0Kc2V0 IC09DQpzZXQgb2xkPQ0Kc2V0IHBpbmdwPQ0Kc2V0IHVwdmVyPSVtYXN2ZXI6Lj0lDQoNCmZvciAlJUEgaW4gKA0KYWN0aXYlLSVhdGVkLndpbg0KbWFzcyUt JWdyYXZlLmRldg0KKSBkbyBpZiBub3QgZGVmaW5lZCBwaW5ncCAoDQpmb3IgL2YgImRlbGltcz1bXSB0b2tlbnM9MiIgJSVCIGluICgncGluZyAtbiAxICUl QScpIGRvICgNCmlmIG5vdCAiJSVCIj09IiIgKHNldCBvbGQ9MSYgc2V0IHBpbmdwPTEpDQpmb3IgL2YgImRlbGltcz1bXSB0b2tlbnM9MiIgJSVDIGluICgn cGluZyAtbiAxIHVwZGF0ZWNoZWNrJXVwdmVyJS4lJUEnKSBkbyAoDQppZiBub3QgIiUlQyI9PSIiIHNldCBvbGQ9DQopDQopDQopDQoNCmlmIGRlZmluZWQg b2xkICgNCmVjaG8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQolZWxpbmUlDQplY2hvIFlvdXIgdmVyc2lvbiBv ZiBNQVMgWyVtYXN2ZXIlXSBpcyBvdXRkYXRlZC4NCmVjaG8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQplY2hv Og0KaWYgbm90ICVfdW5hdHRlbmRlZCU9PTEgKA0KZWNobyBbMV0gR2V0IExhdGVzdCBNQVMNCmVjaG8gWzBdIENvbnRpbnVlIEFueXdheQ0KZWNobzoNCmNh bGwgOmRrX2NvbG9yICVfR3JlZW4lICJDaG9vc2UgYSBtZW51IG9wdGlvbiB1c2luZyB5b3VyIGtleWJvYXJkIFsxLDBdIDoiDQpjaG9pY2UgL0M6MTAgL04N CmlmICFlcnJvcmxldmVsIT09MiByZW0NCmlmICFlcnJvcmxldmVsIT09MSAoc3RhcnQgJXNlbGZnaXQlICYgc3RhcnQgJWdpdGh1YiUgJiBzdGFydCAlbWFz JSAmIGV4aXQgL2IpDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQppZiBub3QgZXhpc3QgIiVT eXN0ZW1Sb290JVxUZW1wXCIgbWtkaXIgIiVTeXN0ZW1Sb290JVxUZW1wIiAlbnVsJQ0KDQo6OiAgUnVuIHNjcmlwdCB3aXRoIHBhcmFtZXRlcnMgaW4gdW5h dHRlbmRlZCBtb2RlDQoNCnNldCBfZWxldj0NCmlmIGRlZmluZWQgX2FyZ3MgZWNobyAiJV9hcmdzJSIgfCBmaW5kIC9pICIvUyIgJW51bCUgJiYgKHNldCAi X3NpbGVudD0lbnVsJSIpIHx8IChzZXQgX3NpbGVudD0pDQppZiBkZWZpbmVkIF9hcmdzIGVjaG8gIiVfYXJncyUiIHwgZmluZCAvaSAiLyIgJW51bCUgJiYg KA0KZWNobyAiJV9hcmdzJSIgfCBmaW5kIC9pICIvSFdJRCIgICAlbnVsJSAmJiAoc2V0bG9jYWwgJiBjbHMgJiAoY2FsbCA6SFdJREFjdGl2YXRpb24gICAg JV9hcmdzJSAlX3NpbGVudCUpICYgZW5kbG9jYWwpDQplY2hvICIlX2FyZ3MlIiB8IGZpbmQgL2kgIi9aLSIgICAgICVudWwlICYmIChzZXRsb2NhbCAmIGNs cyAmIChjYWxsIDpUU2ZvcmdlQWN0aXZhdGlvbiAlX2FyZ3MlICVfc2lsZW50JSkgJiBlbmRsb2NhbCkNCmVjaG8gIiVfYXJncyUiIHwgZmluZCAvaSAiL0st IiAgICAgJW51bCUgJiYgKHNldGxvY2FsICYgY2xzICYgKGNhbGwgOktNU0FjdGl2YXRpb24gICAgICVfYXJncyUgJV9zaWxlbnQlKSAmIGVuZGxvY2FsKQ0K ZWNobyAiJV9hcmdzJSIgfCBmaW5kIC9pICIvT2hvb2siICAlbnVsJSAmJiAoc2V0bG9jYWwgJiBjbHMgJiAoY2FsbCA6T2hvb2tBY3RpdmF0aW9uICAgJV9h cmdzJSAlX3NpbGVudCUpICYgZW5kbG9jYWwpDQpleGl0IC9iDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KDQpzZXRsb2NhbCBEaXNhYmxlRGVsYXllZEV4cGFuc2lvbg0KDQo6OiAgQ2hlY2sgZGVza3RvcCBsb2NhdGlvbg0KDQpzZXQgZGVza3RvcD0NCmZvciAv ZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgncmVnIHF1ZXJ5ICJIS0NVXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4 cGxvcmVyXFVzZXIgU2hlbGwgRm9sZGVycyIgL3YgRGVza3RvcCcpIGRvIGNhbGwgc2V0ICJkZXNrdG9wPSUlYiINCmlmIG5vdCBkZWZpbmVkIGRlc2t0b3Ag Zm9yIC9mICJkZWxpbXM9IiAlJWEgaW4gKCclcHNjJSAiJiB7d3JpdGUtaG9zdCAkKFtFbnZpcm9ubWVudF06OkdldEZvbGRlclBhdGgoJ0Rlc2t0b3AnKSl9 IicpIGRvIGNhbGwgc2V0ICJkZXNrdG9wPSUlYSINCnNldCAiX3BkZXNrPSVkZXNrdG9wOic9JyclIg0KDQpzZXRsb2NhbCBFbmFibGVEZWxheWVkRXhwYW5z aW9uDQoNCmlmIG5vdCBkZWZpbmVkIGRlc2t0b3AgKA0KJWVsaW5lJQ0KZWNobyBVbmFibGUgdG8gZGV0ZWN0IERlc2t0b3AgbG9jYXRpb24sIGFib3J0aW5n Li4uDQpnb3RvIGRrX2RvbmUNCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpNYWluTWVudQ0KDQpj bHMNCmNvbG9yIDA3DQp0aXRsZSAgTWljcm9zb2Z0ICVibGFuayVBY3RpdmF0aW9uICVibGFuayVTY3JpcHRzICVtYXN2ZXIlDQppZiBub3QgZGVmaW5lZCB0 ZXJtaW5hbCBtb2RlIDc2LCAzNA0KDQppZiBleGlzdCAiJVN5c3RlbVJvb3QlXFNlcnZpY2luZ1xQYWNrYWdlc1xNaWNyb3NvZnQtV2luZG93cy1TZXJ2ZXIq RWRpdGlvbn4qLm11bSIgc2V0IF9zZXJleGlzdD0xDQppZiBleGlzdCAiJVN5c3RlbVJvb3QlXFNlcnZpY2luZ1xQYWNrYWdlc1xNaWNyb3NvZnQtV2luZG93 cy0qRXZhbEVkaXRpb25+Ki5tdW0iIHNldCBfZXZhbGV4aXN0PTENCmlmIGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2thZ2VzXE1pY3Jvc29m dC1XaW5kb3dzLUVudGVycHJpc2VTKmRpdGlvbn4qLm11bSIgc2V0IF9sdHNjZXhpc3Q9MQ0KaWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxTZXJ2aWNpbmdcUGFj a2FnZXNcTWljcm9zb2Z0LVdpbmRvd3MtRW50ZXJwcmlzZVNOKmRpdGlvbn4qLm11bSIgc2V0IF9sdHNjbmV4aXN0PTENCg0KaWYgJXdpbmJ1aWxkJSBHRVEg MTAyNDAgaWYgbm90IGRlZmluZWQgX3NlcmV4aXN0IGlmIG5vdCBkZWZpbmVkIF9ldmFsZXhpc3Qgc2V0IF9od2lkZ289MQ0KaWYgJXdpbmJ1aWxkJSBHVFIg MTQzOTMgaWYgZGVmaW5lZCBfbHRzY25leGlzdCBzZXQgX2h3aWRnbz0NCmlmIG5vdCBkZWZpbmVkIF9od2lkZ28gc2V0IF90c2ZvcmdlZ289MQ0KDQpzZXQg X29ob29rZ289MQ0KaWYgJXdpbmJ1aWxkJSBHRVEgOTIwMCAoDQppZiAld2luYnVpbGQlIExTUyAxMDI0MCBzZXQgX29ob29rZ289DQppZiAld2luYnVpbGQl IEdFUSAxOTA0MSBpZiAld2luYnVpbGQlIExFUSAxOTA0NSBzZXQgX29ob29rZ289DQppZiBkZWZpbmVkIF9zZXJleGlzdCBzZXQgX29ob29rZ289DQppZiBk ZWZpbmVkIF9ldmFsZXhpc3Qgc2V0IF9vaG9va2dvPQ0KaWYgZGVmaW5lZCBfbHRzY2V4aXN0IHNldCBfb2hvb2tnbz0NCnJlZyBxdWVyeSBIS0xNXFNPRlRX QVJFXE1pY3Jvc29mdFxPZmZpY2VcQ2xpY2tUb1J1blxDb25maWd1cmF0aW9uIC92IFByb2R1Y3RSZWxlYXNlSWRzICVudWwyJSB8IGZpbmQgL2kgIk8zNjUi ICVudWwlICYmIHNldCBfb2hvb2tnbz0xDQpyZWcgcXVlcnkgSEtMTVxTT0ZUV0FSRVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcT2ZmaWNlXENsaWNrVG9SdW5c Q29uZmlndXJhdGlvbiAvdiBQcm9kdWN0UmVsZWFzZUlkcyAlbnVsMiUgfCBmaW5kIC9pICJPMzY1IiAlbnVsJSAmJiBzZXQgX29ob29rZ289MQ0KKQ0KaWYg bm90IGRlZmluZWQgX29ob29rZ28gc2V0IF90c2ZvcmdlZ289MQ0KDQplY2hvOg0KZWNobzoNCmVjaG86DQppZiAld2luYnVpbGQlIEdFUSAxMDI0MCBpZiAl d2luYnVpbGQlIExFUSAxOTA0NSBpZiBub3QgZGVmaW5lZCBfc2VyZXhpc3QgaWYgbm90IGRlZmluZWQgX2V2YWxleGlzdCBpZiBub3QgZGVmaW5lZCBfbHRz Y2V4aXN0ICgNCmNhbGwgOmRrX2NvbG9yMiAlX0dyZWVuJSAiICAgICAgIFRpcDoiICVfV2hpdGUlICIgVG8gYWN0aXZhdGUgRVNVIHVwZGF0ZXMgYWZ0ZXIg VzEwIEVPTCwgdXNlIFRTZm9yZ2Ugb3B0aW9uLiINCikNCmVjaG86DQplY2hvOg0KZWNobzogICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCmVjaG86DQplY2hvOiAgICAgICAgICAgICAgICAgQWN0aXZhdGlvbiBNZXRob2RzOg0KZWNobzoN CmlmIGRlZmluZWQgX2h3aWRnbyAoDQpjYWxsIDpka19jb2xvcjMgJV9XaGl0ZSUgIiAgICAgICAgICAgICBbMV0gIiAlX0dyZWVuJSAiSFdJRCIgJV9XaGl0 ZSUgIiAgICAgICAgICAgICAgICAtIFdpbmRvd3MiDQopIGVsc2UgKA0KZWNobzogICAgICAgICAgICAgWzFdIEhXSUQgICAgICAgICAgICAgICAgLSBXaW5k b3dzDQopDQppZiBkZWZpbmVkIF9vaG9va2dvICgNCmNhbGwgOmRrX2NvbG9yMyAlX1doaXRlJSAiICAgICAgICAgICAgIFsyXSAiICVfR3JlZW4lICJPaG9v ayIgJV9XaGl0ZSUgIiAgICAgICAgICAgICAgIC0gT2ZmaWNlIg0KKSBlbHNlICgNCmVjaG86ICAgICAgICAgICAgIFsyXSBPaG9vayAgICAgICAgICAgICAg IC0gT2ZmaWNlDQopDQppZiBkZWZpbmVkIF90c2ZvcmdlZ28gKA0KY2FsbCA6ZGtfY29sb3IzICVfV2hpdGUlICIgICAgICAgICAgICAgWzNdICIgJV9HcmVl biUgIlRTZm9yZ2UiICVfV2hpdGUlICIgICAgICAgICAgICAgLSBXaW5kb3dzIC8gT2ZmaWNlIC8gRVNVIg0KKSBlbHNlICgNCmVjaG86ICAgICAgICAgICAg IFszXSBUU2ZvcmdlICAgICAgICAgICAgIC0gV2luZG93cyAvIE9mZmljZSAvIEVTVQ0KKQ0KZWNobzogICAgICAgICAgICAgWzRdIE9ubGluZSBLTVMgICAg ICAgICAgLSBXaW5kb3dzIC8gT2ZmaWNlDQplY2hvOiAgICAgICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXyANCmVjaG86DQplY2hvOiAgICAgICAgICAgICBbNV0gQ2hlY2sgQWN0aXZhdGlvbiBTdGF0dXMNCmVjaG86ICAgICAgICAgICAgIFs2XSBDaGFuZ2Ug V2luZG93cyBFZGl0aW9uDQplY2hvOiAgICAgICAgICAgICBbN10gQ2hhbmdlIE9mZmljZSBFZGl0aW9uDQplY2hvOiAgICAgICAgICAgICBfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgICAgIA0KZWNobzoNCmVjaG86ICAgICAgICAgICAgIFs4XSBUcm91Ymxlc2hvb3QN CmVjaG86ICAgICAgICAgICAgIFtFXSBFeHRyYXMNCmVjaG86ICAgICAgICAgICAgIFtIXSBIZWxwDQplY2hvOiAgICAgICAgICAgICBbMF0gRXhpdA0KZWNo bzogICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCmVjaG86DQpjYWxsIDpka19j b2xvcjIgJV9XaGl0ZSUgIiAgICAgICAgICIgJV9HcmVlbiUgIkNob29zZSBhIG1lbnUgb3B0aW9uIHVzaW5nIHlvdXIga2V5Ym9hcmQgWzEsMiwzLi4uRSxI LDBdIDoiDQpjaG9pY2UgL0M6MTIzNDU2NzhFSDAgL04NCnNldCBfZXJsPSVlcnJvcmxldmVsJQ0KDQppZiAlX2VybCU9PTExIGV4aXQgL2INCmlmICVfZXJs JT09MTAgKHN0YXJ0ICVzZWxmZ2l0JSAmIHN0YXJ0ICVnaXRodWIlICYgc3RhcnQgJW1hcyV0cm91Ymxlc2hvb3QgJiBnb3RvIDpNYWluTWVudSkNCmlmICVf ZXJsJT09OSBnb3RvIDpFeHRyYXMNCmlmICVfZXJsJT09OCBzZXRsb2NhbCAmIGNhbGwgOnRyb3VibGVzaG9vdCAgICAgICYgY2xzICYgZW5kbG9jYWwgJiBn b3RvIDpNYWluTWVudQ0KaWYgJV9lcmwlPT03IHNldGxvY2FsICYgY2FsbCA6Y2hhbmdlX29mZmVkaXRpb24gJiBjbHMgJiBlbmRsb2NhbCAmIGdvdG8gOk1h aW5NZW51DQppZiAlX2VybCU9PTYgc2V0bG9jYWwgJiBjYWxsIDpjaGFuZ2Vfd2luZWRpdGlvbiAmIGNscyAmIGVuZGxvY2FsICYgZ290byA6TWFpbk1lbnUN CmlmICVfZXJsJT09NSBzZXRsb2NhbCAmIGNhbGwgOmNoZWNrX2FjdHN0YXR1cyAgICYgY2xzICYgZW5kbG9jYWwgJiBnb3RvIDpNYWluTWVudQ0KaWYgJV9l cmwlPT00IHNldGxvY2FsICYgY2FsbCA6S01TQWN0aXZhdGlvbiAgICAgJiBjbHMgJiBlbmRsb2NhbCAmIGdvdG8gOk1haW5NZW51DQppZiAlX2VybCU9PTMg c2V0bG9jYWwgJiBjYWxsIDpUU2ZvcmdlQWN0aXZhdGlvbiAmIGNscyAmIGVuZGxvY2FsICYgZ290byA6TWFpbk1lbnUNCmlmICVfZXJsJT09MiBzZXRsb2Nh bCAmIGNhbGwgOk9ob29rQWN0aXZhdGlvbiAgICYgY2xzICYgZW5kbG9jYWwgJiBnb3RvIDpNYWluTWVudQ0KaWYgJV9lcmwlPT0xIHNldGxvY2FsICYgY2Fs bCA6SFdJREFjdGl2YXRpb24gICAgJiBjbHMgJiBlbmRsb2NhbCAmIGdvdG8gOk1haW5NZW51DQpnb3RvIDpNYWluTWVudQ0KDQo6ZGtfY29sb3IzDQoNCmlm ICVfTkNTJSBFUVUgMSAoDQplY2hvICVlc2MlWyV+MSV+MiVlc2MlWyV+MyV+NCVlc2MlWyV+NSV+NiVlc2MlWzBtDQopIGVsc2UgKA0KJXBzYyUgd3JpdGUt aG9zdCAtYmFjayAnJTEnIC1mb3JlICclMicgJyUzJyAtTm9OZXdsaW5lOyB3cml0ZS1ob3N0IC1iYWNrICclNCcgLWZvcmUgJyU1JyAnJTYnLU5vTmV3bGlu ZTsgd3JpdGUtaG9zdCAtYmFjayAnJTcnIC1mb3JlICclOCcgJyU5Jw0KKQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCg0KOkV4dHJhcw0KDQpjbHMNCnRpdGxlICBFeHRyYXMNCmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsIG1vZGUgNzYsIDMwDQplY2hv Og0KZWNobzoNCmVjaG86DQplY2hvOg0KZWNobzoNCmVjaG86ICAgICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18NCmVjaG86ICAgICAgICAgICANCmVjaG86ICAgICAgICAgICAgICAgIFsxXSBFeHRyYWN0ICRPRU0kIEZvbGRlcg0KZWNobzogICAgICAg ICAgICAgICAgICANCmVjaG86ICAgICAgICAgICAgICAgIFsyXSBEb3dubG9hZCBHZW51aW5lIFdpbmRvd3MgLyBPZmZpY2UgDQplY2hvOiAgICAgICAgICAg ICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgICAgIA0KZWNobzogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KZWNobzogICAgICAgICAgICAgICAgWzBdIEdvIHRvIE1haW4gTWVudQ0K ZWNobzogICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNobzoNCmNhbGwgOmRrX2Nv bG9yMiAlX1doaXRlJSAiICAgICAgICAgICAgICIgJV9HcmVlbiUgIkNob29zZSBhIG1lbnUgb3B0aW9uIHVzaW5nIHlvdXIga2V5Ym9hcmQgWzEsMiwwXSA6 Ig0KY2hvaWNlIC9DOjEyMCAvTg0Kc2V0IF9lcmw9JWVycm9ybGV2ZWwlDQoNCmlmICVfZXJsJT09MyBnb3RvIDpNYWluTWVudQ0KaWYgJV9lcmwlPT0yIHN0 YXJ0ICVtYXMlZ2VudWluZS1pbnN0YWxsYXRpb24tbWVkaWEgJiBnb3RvIDpFeHRyYXMNCmlmICVfZXJsJT09MSBnb3RvIDpFeHRyYWN0JE9FTSQNCmdvdG8g OkV4dHJhcw0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOkV4dHJhY3QkT0VNJA0KDQpjbHMNCnRpdGxl ICBFeHRyYWN0ICRPRU0kIEZvbGRlcg0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgbW9kZSA3NiwgMzANCg0KaWYgZXhpc3QgIiFkZXNrdG9wIVwkT0VNJFwi ICgNCiVlbGluZSUNCmVjaG8gJE9FTSQgZm9sZGVyIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBEZXNrdG9wLg0KZWNobyBfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiUHJlc3MgWzBdIGtleSB0byAlX2V4aXRt c2clLi4uIg0KY2hvaWNlIC9jIDAgL24NCmdvdG8gOkV4dHJhcw0KKQ0KDQo6RXh0cmFjdCRPRU0kMg0KDQpjbHMNCnRpdGxlICBFeHRyYWN0ICRPRU0kIEZv bGRlcg0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgbW9kZSA3OCwgMzANCmVjaG86DQplY2hvOg0KZWNobzoNCmVjaG86DQplY2hvOiAgICAgICAgICAgICAg ICAgICAgIEV4dHJhY3QgJE9FTSQgZm9sZGVyIG9uIHRoZSBkZXNrdG9wICAgICAgICAgICANCmVjaG86ICAgICAgICAgX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQplY2hvOg0KZWNobzogICAgICAgICAgICBbMV0gSFdJRCAgICAgICBbV2luZG93c10N CmVjaG86ICAgICAgICAgICAgWzJdIE9ob29rICAgICAgW09mZmljZV0NCmVjaG86ICAgICAgICAgICAgWzNdIFRTZm9yZ2UgICAgW1dpbmRvd3MgLyBFU1Ug LyBPZmZpY2VdDQplY2hvOiAgICAgICAgICAgIFs0XSBPbmxpbmUgS01TIFtXaW5kb3dzIC8gT2ZmaWNlXQ0KZWNobzoNCmVjaG86ICAgICAgICAgICAgWzVd IEhXSUQgICAgICAgW1dpbmRvd3NdIF4rIE9ob29rIFtPZmZpY2VdDQplY2hvOiAgICAgICAgICAgIFs2XSBIV0lEICAgICAgIFtXaW5kb3dzXSBeKyBPaG9v ayBbT2ZmaWNlXSBeKyBUU2ZvcmdlIFtFU1VdDQplY2hvOiAgICAgICAgICAgIFs3XSBUU2ZvcmdlICAgIFtXaW5kb3dzIC8gRVNVXSBeKyBPaG9vayBbT2Zm aWNlXQ0KZWNobzoNCmNhbGwgOmRrX2NvbG9yMiAlX1doaXRlJSAiICAgICAgICAgICAgW1JdICIgJV9HcmVlbiUgIlJlYWRNZSINCmVjaG86ICAgICAgICAg ICAgWzBdIEdvIEJhY2sNCmVjaG86ICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f DQplY2hvOiAgDQpjYWxsIDpka19jb2xvcjIgJV9XaGl0ZSUgIiAgICAgICAgICAgICAiICVfR3JlZW4lICJDaG9vc2UgYSBtZW51IG9wdGlvbiB1c2luZyB5 b3VyIGtleWJvYXJkIDoiDQpjaG9pY2UgL0M6MTIzNDU2N1IwIC9ODQpzZXQgX2VybD0lZXJyb3JsZXZlbCUNCg0KaWYgJV9lcmwlPT05IGdvdG86RXh0cmFz DQppZiAlX2VybCU9PTggc3RhcnQgJW1hcyVvZW0tZm9sZGVyICZnb3RvOkV4dHJhY3QkT0VNJDINCmlmICVfZXJsJT09NyAoc2V0ICJfb2VtPVRTZm9yZ2Ug W1dpbmRvd3MgLyBFU1VdICsgT2hvb2sgW09mZmljZV0iICYgc2V0ICJwYXJhPS9aLVdpbmRvd3MgL1otRVNVIC9PaG9vayIgJmdvdG86RXh0cmFjdCRPRU0k MykNCmlmICVfZXJsJT09NiAoc2V0ICJfb2VtPUhXSUQgW1dpbmRvd3NdICsgT2hvb2sgW09mZmljZV0gKyBUU2ZvcmdlIFtFU1VdIiAmIHNldCAicGFyYT0v SFdJRCAvT2hvb2sgL1otRVNVIiAmZ290bzpFeHRyYWN0JE9FTSQzKQ0KaWYgJV9lcmwlPT01IChzZXQgIl9vZW09SFdJRCBbV2luZG93c10gKyBPaG9vayBb T2ZmaWNlXSIgJiBzZXQgInBhcmE9L0hXSUQgL09ob29rIiAmZ290bzpFeHRyYWN0JE9FTSQzKQ0KaWYgJV9lcmwlPT00IChzZXQgIl9vZW09T25saW5lIEtN UyIgJiBzZXQgInBhcmE9L0stV2luZG93c09mZmljZSIgJmdvdG86RXh0cmFjdCRPRU0kMykNCmlmICVfZXJsJT09MyAoc2V0ICJfb2VtPVRTZm9yZ2UiICYg c2V0ICJwYXJhPS9aLVdpbmRvd3NFU1VPZmZpY2UiICZnb3RvOkV4dHJhY3QkT0VNJDMpDQppZiAlX2VybCU9PTIgKHNldCAiX29lbT1PaG9vayIgJiBzZXQg InBhcmE9L09ob29rIiAmZ290bzpFeHRyYWN0JE9FTSQzKQ0KaWYgJV9lcmwlPT0xIChzZXQgIl9vZW09SFdJRCIgJiBzZXQgInBhcmE9L0hXSUQiICZnb3Rv OkV4dHJhY3QkT0VNJDMpDQpnb3RvIDpFeHRyYWN0JE9FTSQyDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K DQo6RXh0cmFjdCRPRU0kMw0KDQpjbHMNCnNldCAiX2Rpcj0hZGVza3RvcCFcJE9FTSRcJCRcU2V0dXBcU2NyaXB0cyINCm1kICIhX2RpciFcIg0KDQo6OiBB ZGQgcmFuZG9tIGRhdGEgb24gdG9wIHRvIGNyZWF0ZSB1bmlxdWUgZmlsZSB3aGljaCBoZWxwcyBpbiBhdm9pZGluZyBBVidzIGRldGVjdGlvbnMNCiVwc2Ml ICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJyk7IFtpby5maWxlXTo6V3JpdGVBbGxUZXh0KCchX3BkZXNrIVwkT0VNJFwkJFxTZXR1cFxT Y3JpcHRzXE1BU19BSU8uY21kJywgJ0A6OlJBTkRPTS0nICsgW0d1aWRdOjpOZXdHdWlkKCkuR3VpZCArIFtFbnZpcm9ubWVudF06Ok5ld0xpbmUgKyAkZiwg W1N5c3RlbS5UZXh0LkVuY29kaW5nXTo6QVNDSUkpIg0KDQooDQplY2hvIEBlY2hvIG9mZg0KZWNobyBmbHRtYyBePm51bCBefF58IGV4aXQgL2INCmVjaG8g Y2FsbCAiJSV+ZHAwTUFTX0FJTy5jbWQiICVwYXJhJQ0KZWNobyBjZCBcDQplY2hvIF4oZ290b14pIDJePm51bCBeJiBeKGlmICIlJX5kcDAiPT0iJSVTeXN0 ZW1Sb290JSVcU2V0dXBcU2NyaXB0c1wiIHJkIC9zIC9xICIlJX5kcDAiXikNCik+IiFfZGlyIVxTZXR1cENvbXBsZXRlLmNtZCINCg0Kc2V0IF9lcnJvcj0N CmlmIG5vdCBleGlzdCAiIV9kaXIhXE1BU19BSU8uY21kIiBzZXQgX2Vycm9yPTENCmlmIG5vdCBleGlzdCAiIV9kaXIhXFNldHVwQ29tcGxldGUuY21kIiBz ZXQgX2Vycm9yPTENCg0KaWYgZGVmaW5lZCBfZXJyb3IgKA0KJWVsaW5lJQ0KZWNobyBUaGUgc2NyaXB0IGZhaWxlZCB0byBjcmVhdGUgdGhlICRPRU0kIGZv bGRlci4NCmlmIGV4aXN0ICIhZGVza3RvcCFcJE9FTSRcLioiIHJtZGlyIC9zIC9xICIhZGVza3RvcCFcJE9FTSRcIiAlbnVsJQ0KKSBlbHNlICgNCmVjaG86 DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIiVfb2VtJSINCmNhbGwgOmRrX2NvbG9yICVHcmVlbiUgIiRPRU0kIGZvbGRlciB3YXMgc3VjY2Vzc2Z1bGx5IGNy ZWF0ZWQgb24geW91ciBEZXNrdG9wLiINCikNCmVjaG8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXw0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiUHJlc3MgWzBdIGtleSB0byAlX2V4aXRtc2clLi4uIg0KY2hvaWNlIC9jIDAg L24NCmdvdG8gRXh0cmFzDQoNCjorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KDQo6SFdJREFjdGl2YXRpb24NCg0K OjogIFRvIGFjdGl2YXRlLCBydW4gdGhlIHNjcmlwdCB3aXRoICIvSFdJRCIgcGFyYW1ldGVyIG9yIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0Kc2V0 IF9hY3Q9MA0KDQo6OiAgVG8gZGlzYWJsZSBjaGFuZ2luZyBlZGl0aW9uIGlmIGN1cnJlbnQgZWRpdGlvbiBkb2Vzbid0IHN1cHBvcnQgSFdJRCBhY3RpdmF0 aW9uLCBjaGFuZ2UgdGhlIHZhbHVlIHRvIDEgZnJvbSAwIG9yIHJ1biB0aGUgc2NyaXB0IHdpdGggIi9IV0lELU5vRWRpdGlvbkNoYW5nZSIgcGFyYW1ldGVy DQpzZXQgX05vRWRpdGlvbkNoYW5nZT0wDQoNCjo6ICBJZiB2YWx1ZSBpcyBjaGFuZ2VkIGluIGFib3ZlIGxpbmVzIG9yIHBhcmFtZXRlciBpcyB1c2VkIHRo ZW4gc2NyaXB0IHdpbGwgcnVuIGluIHVuYXR0ZW5kZWQgbW9kZQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Cg0KY2xzDQpjb2xvciAwNw0KdGl0bGUgIEhXSUQgQWN0aXZhdGlvbiAlbWFzdmVyJQ0KDQpzZXQgX2FyZ3M9DQpzZXQgX2VsZXY9DQpzZXQgX3VuYXR0ZW5k ZWQ9MA0KDQpzZXQgX2FyZ3M9JSoNCmlmIGRlZmluZWQgX2FyZ3Mgc2V0IF9hcmdzPSVfYXJnczoiPSUNCmlmIGRlZmluZWQgX2FyZ3MgKA0KZm9yICUlQSBp biAoJV9hcmdzJSkgZG8gKA0KaWYgL2kgIiUlQSI9PSIvSFdJRCIgICAgICAgICAgICAgICAgICBzZXQgX2FjdD0xDQppZiAvaSAiJSVBIj09Ii9IV0lELU5v RWRpdGlvbkNoYW5nZSIgIHNldCBfTm9FZGl0aW9uQ2hhbmdlPTENCmlmIC9pICIlJUEiPT0iLWVsIiAgICAgICAgICAgICAgICAgICAgc2V0IF9lbGV2PTEN CikNCikNCg0KZm9yICUlQSBpbiAoJV9hY3QlICVfTm9FZGl0aW9uQ2hhbmdlJSkgZG8gKGlmICIlJUEiPT0iMSIgc2V0IF91bmF0dGVuZGVkPTEpDQoNCjo6 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQppZiAld2luYnVpbGQlIExTUyAxMDI0MCAoDQolZWxpbmUlDQplY2hv IFVuc3VwcG9ydGVkIE9TIHZlcnNpb24gZGV0ZWN0ZWQgWyV3aW5idWlsZCVdLg0KZWNobyBIV0lEIEFjdGl2YXRpb24gaXMgb25seSBzdXBwb3J0ZWQgb24g V2luZG93cyAxMC8xMS4NCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiVXNlIFRTZm9yZ2UgYWN0aXZhdGlvbiBvcHRpb24gZnJvbSB0aGUgbWFpbiBtZW51LiIN CmdvdG8gZGtfZG9uZQ0KKQ0KDQppZiBleGlzdCAiJVN5c3RlbVJvb3QlXFNlcnZpY2luZ1xQYWNrYWdlc1xNaWNyb3NvZnQtV2luZG93cy1TZXJ2ZXIqRWRp dGlvbn4qLm11bSIgKA0KJWVsaW5lJQ0KZWNobyBIV0lEIEFjdGl2YXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIFNlcnZlci4NCmNhbGwgOmRr X2NvbG9yICVCbHVlJSAiVXNlIFRTZm9yZ2UgYWN0aXZhdGlvbiBvcHRpb24gZnJvbSB0aGUgbWFpbiBtZW51LiINCmdvdG8gZGtfZG9uZQ0KKQ0KDQpzZXRs b2NhbCBFbmFibGVEZWxheWVkRXhwYW5zaW9uDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjbHMNCmlm IG5vdCBkZWZpbmVkIHRlcm1pbmFsICgNCm1vZGUgMTEwLCAzNA0KaWYgZXhpc3QgIiVTeXNQYXRoJVxzcHBcc3RvcmVfdGVzdFwiIG1vZGUgMTM0LCAzNA0K KQ0KdGl0bGUgIEhXSUQgQWN0aXZhdGlvbiAlbWFzdmVyJQ0KDQplY2hvOg0KZWNobyBJbml0aWFsaXppbmcuLi4NCmNhbGwgOmRrX2Noa21hbA0KDQpmb3Ig JSUjIGluICgNCnNwcHN2Yy5leGUNCkNsaXBVcC5leGUNCikgZG8gKA0KaWYgbm90IGV4aXN0ICVTeXNQYXRoJVwlJSMgKA0KJWVsaW5lJQ0KZWNobyBbJVN5 c1BhdGglXCUlI10gZmlsZSBpcyBtaXNzaW5nLCBhYm9ydGluZy4uLg0KZWNobzoNCmlmIG5vdCBkZWZpbmVkIHJlc3VsdHMgKA0KY2FsbCA6ZGtfY29sb3Ig JUJsdWUlICJHbyBiYWNrIHRvIE1haW4gTWVudSwgc2VsZWN0IFRyb3VibGVzaG9vdCBhbmQgcnVuIERJU00gUmVzdG9yZSBhbmQgU0ZDIFNjYW4gb3B0aW9u cy4iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkFmdGVyIHRoYXQsIHJlc3RhcnQgc3lzdGVtIGFuZCB0cnkgYWN0aXZhdGlvbiBhZ2Fpbi4iDQpzZXQgZml4 ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJJZiBpdCBzdGlsbCBzaG93cyB0aGUgc2Ft ZSBlcnJvciwgZG8gdGhpcyAtICIgJV9ZZWxsb3clICIgJW1hcyVpbi1wbGFjZV9yZXBhaXJfdXBncmFkZSINCikNCmdvdG8gZGtfZG9uZQ0KKQ0KKQ0KDQo6 Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0Kc2V0IHNwcD1Tb2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3QNCnNldCBz cHM9U29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlDQoNCmNhbGwgOmRrX2NrZWNrd21pYw0KY2FsbCA6ZGtfY2hlY2tza3UNCmNhbGwgOmRrX3Byb2R1Y3QNCmNh bGwgOmRrX3NwcGlzc3VlDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgaWYgc3lzdGVt IGlzIHBlcm1hbmVudGx5IGFjdGl2YXRlZCBvciBub3QNCg0KY2FsbCA6ZGtfY2hlY2twZXJtDQppZiBkZWZpbmVkIF9wZXJtICgNCmNscw0KZWNobyBfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQpl Y2hvOg0KY2FsbCA6ZGtfY29sb3IyICVfV2hpdGUlICIgICAgICIgJUdyZWVuJSAiJXdpbm9zJSBpcyBhbHJlYWR5IHBlcm1hbmVudGx5IGFjdGl2YXRlZC4i DQplY2hvIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18NCmlmICVfdW5hdHRlbmRlZCU9PTEgZ290byBka19kb25lDQplY2hvOg0KY2hvaWNlIC9DOjEwIC9OIC9NICI+ICAgIFsxXSBBY3RpdmF0ZSBB bnl3YXkgWzBdICVfZXhpdG1zZyUgOiAiDQppZiBlcnJvcmxldmVsIDIgZXhpdCAvYg0KKQ0KY2xzDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgRXZhbHVhdGlvbiB2ZXJzaW9uDQoNCmlmIGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBh Y2thZ2VzXE1pY3Jvc29mdC1XaW5kb3dzLSpFdmFsRWRpdGlvbn4qLm11bSIgKA0KcmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dz IE5UXEN1cnJlbnRWZXJzaW9uIiAvdiBFZGl0aW9uSUQgJW51bDIlIHwgZmluZCAvaSAiRXZhbCIgJW51bDElICYmICgNCiVlbGluZSUNCmVjaG8gWyV3aW5v cyUgXnwgJXdpbmJ1aWxkJV0NCmVjaG86DQplY2hvIEV2YWx1YXRpb24gZWRpdGlvbnMgY2Fubm90IGJlIGFjdGl2YXRlZCBvdXRzaWRlIG9mIHRoZWlyIGV2 YWx1YXRpb24gcGVyaW9kLg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJVc2UgVFNmb3JnZSBhY3RpdmF0aW9uIG9wdGlvbiBmcm9tIHRoZSBtYWluIG1lbnUg dG8gcmVzZXQgZXZhbHVhdGlvbiBwZXJpb2QuIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVldmFsdWF0aW9uX2VkaXRpb25zDQpjYWxsIDpka19jb2xvcjIg JUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlZXZhbHVhdGlvbl9lZGl0aW9ucyINCmdvdG8gZGtfZG9u ZQ0KKQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0Kc2V0IGVycm9yPQ0KDQpjbHMNCmVjaG86DQpj YWxsIDpka19zaG93b3NpbmZvDQoNCjo6ICBDaGVjayBJbnRlcm5ldCBjb25uZWN0aW9uDQoNCnNldCBfaW50PQ0KZm9yICUlYSBpbiAobC5yb290LXNlcnZl cnMubmV0IHJlc29sdmVyMS5vcGVuZG5zLmNvbSBkb3dubG9hZC53aW5kb3dzdXBkYXRlLmNvbSBnb29nbGUuY29tKSBkbyBpZiBub3QgZGVmaW5lZCBfaW50 ICgNCmZvciAvZiAiZGVsaW1zPVtdIHRva2Vucz0yIiAlJSMgaW4gKCdwaW5nIC1uIDEgJSVhJykgZG8gKGlmIG5vdCAiJSUjIj09IiIgc2V0IF9pbnQ9MSkN CikNCg0KaWYgbm90IGRlZmluZWQgX2ludCAoDQolcHNjJSAiSWYoW0FjdGl2YXRvcl06OkNyZWF0ZUluc3RhbmNlKFtUeXBlXTo6R2V0VHlwZUZyb21DTFNJ RChbR3VpZF0ne0RDQjAwQzAxLTU3MEYtNEE5Qi04RDY5LTE5OUZEQkE1NzIzQn0nKSkuSXNDb25uZWN0ZWRUb0ludGVybmV0KXtFeGl0IDB9RWxzZXtFeGl0 IDF9Ig0KaWYgIWVycm9ybGV2ZWwhPT0wIChzZXQgX2ludD0xJnNldCBwaW5nX2Y9IEJ1dCBQaW5nIEZhaWxlZCkNCikNCg0KaWYgZGVmaW5lZCBfaW50ICgN CmVjaG8gQ2hlY2tpbmcgSW50ZXJuZXQgQ29ubmVjdGlvbiAgICAgICAgICAgIFtDb25uZWN0ZWQlcGluZ19mJV0NCikgZWxzZSAoDQpzZXQgZXJyb3I9MQ0K Y2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEludGVybmV0IENvbm5lY3Rpb24gICAgICAgICAgICBbTm90IENvbm5lY3RlZF0iDQpjYWxsIDpka19j b2xvciAlQmx1ZSUgIkludGVybmV0IGlzIHJlcXVpcmVkIGZvciBIV0lEIGFjdGl2YXRpb24uIg0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCg0KZWNobyBJbml0aWF0aW5nIERpYWdub3N0aWMgVGVzdHMuLi4NCg0Kc2V0ICJfc2Vydj1DbGlwU1ZDIHdsaWRzdmMg c3Bwc3ZjIEtleUlzbyBMaWNlbnNlTWFuYWdlciBXaW5tZ210Ig0KDQo6OiAgQ2xpZW50IExpY2Vuc2UgU2VydmljZSAoQ2xpcFNWQykNCjo6ICBNaWNyb3Nv ZnQgQWNjb3VudCBTaWduLWluIEFzc2lzdGFudA0KOjogIFNvZnR3YXJlIFByb3RlY3Rpb24NCjo6ICBDTkcgS2V5IElzb2xhdGlvbg0KOjogIFdpbmRvd3Mg TGljZW5zZSBNYW5hZ2VyIFNlcnZpY2UNCjo6ICBXaW5kb3dzIE1hbmFnZW1lbnQgSW5zdHJ1bWVudGF0aW9uDQoNCmNhbGwgOmRrX2Vycm9yY2hlY2sNCg0K Ojo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBEZXRlY3QgS2V5DQoNCnNldCBrZXk9DQpzZXQgYWx0a2V5 PQ0Kc2V0IGNoYW5nZWtleT0NCnNldCBhbHRhcHBsaXN0PQ0Kc2V0IGFsdGVkaXRpb249DQpzZXQgbm90d29ya2luZz0NCg0KY2FsbCA6ZGtfYWN0aWRzIDU1 YzkyNzM0LWQ2ODItNGQ3MS05ODNlLWQ2ZWMzZjE2MDU5Zg0KaWYgZGVmaW5lZCBhbGxhcHBzIGNhbGwgOmh3aWRkYXRhIGtleQ0KaWYgbm90IGRlZmluZWQg a2V5ICgNCmZvciAvZiAiZGVsaW1zPSIgJSVhIGluICgnJXBzYyUgIiRmPVtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzpnZXRh Y3RpdmF0aW9uaWRcOi4qJzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKSInKSBkbyAoc2V0IGFsdGFwcGxpc3Q9JSVhKQ0KaWYgZGVmaW5lZCBh bHRhcHBsaXN0IGNhbGwgOmh3aWRkYXRhIGtleQ0KKQ0KDQppZiBkZWZpbmVkIG5vdHdvcmtpbmcgY2FsbCA6aHdpZGZhbGxiYWNrDQppZiBub3QgZGVmaW5l ZCBrZXkgY2FsbCA6aHdpZGZhbGxiYWNrDQoNCmlmIGRlZmluZWQgYWx0a2V5IChzZXQga2V5PSVhbHRrZXklJnNldCBjaGFuZ2VrZXk9MSZzZXQgbm90d29y a2luZz0pDQoNCmlmIGRlZmluZWQgbm90d29ya2luZyBpZiBkZWZpbmVkIG5vdGZvdW5kYWx0YWN0SUQgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNr aW5nIEFsdGVybmF0ZSBFZGl0aW9uIEZvciBIV0lEICAgICBbJWFsdGVkaXRpb24lIEFjdGl2YXRpb24gSUQgTm90IEZvdW5kXSINCikNCg0KaWYgbm90IGRl ZmluZWQga2V5ICgNCiVlbGluZSUNCmVjaG8gWyV3aW5vcyUgXnwgJXdpbmJ1aWxkJSBefCBTS1U6JW9zU0tVJV0NCmlmIG5vdCBkZWZpbmVkIHNrdW5vdGZv dW5kICgNCmVjaG8gVGhpcyBwcm9kdWN0IGRvZXMgbm90IHN1cHBvcnQgSFdJRCBhY3RpdmF0aW9uLg0KZWNobyBNYWtlIHN1cmUgeW91IGFyZSB1c2luZyB0 aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNjcmlwdC4NCmVjaG8gSWYgeW91IGFyZSwgdGhlbiB0cnkgVFNmb3JnZSBhY3RpdmF0aW9uIG9wdGlvbiBmcm9t IHRoZSBtYWluIG1lbnUuDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJQ0KZWNobyAlbWFzJQ0KKSBlbHNlICgNCmVjaG8gUmVxdWlyZWQgbGljZW5zZSBmaWxl cyBub3QgZm91bmQgaW4gJVN5c1BhdGglXHNwcFx0b2tlbnNcc2t1c1wNCnNldCBmaXhlcz0lZml4ZXMlICVtYXMldHJvdWJsZXNob290DQpjYWxsIDpka19j b2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMldHJvdWJsZXNob290Ig0KKQ0KZWNobzoNCmdv dG8gZGtfZG9uZQ0KKQ0KDQppZiBkZWZpbmVkIG5vdHdvcmtpbmcgc2V0IGVycm9yPTENCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQoNCjo6ICBJbnN0YWxsIGtleQ0KDQplY2hvOg0KaWYgZGVmaW5lZCBjaGFuZ2VrZXkgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJb JWFsdGVkaXRpb24lXSBlZGl0aW9uIHByb2R1Y3Qga2V5IHdpbGwgYmUgdXNlZCB0byBlbmFibGUgSFdJRCBhY3RpdmF0aW9uLiINCmVjaG86DQopDQoNCmlm IGRlZmluZWQgd2luc3ViICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiV2luZG93cyBTdWJzY3JpcHRpb24gW1NLVSBJRC0lc2xjU0tVJV0gZGV0ZWN0ZWQu IFNjcmlwdCB3aWxsIGFjdGl2YXRlIGJhc2UgZWRpdGlvbiBbU0tVIElELSVyZWdTS1UlXS4iDQplY2hvOg0KKQ0KDQpzZXQgZ2VuZXJpY2tleT0xDQpjYWxs IDpka19pbnNrZXkgIlsla2V5JV0iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hhbmdlIFdp bmRvd3MgcmVnaW9uIHRvIFVTQSB0byBhdm9pZCBhY3RpdmF0aW9uIGlzc3VlcyBhcyBXaW5kb3dzIHN0b3JlIGxpY2Vuc2UgaXMgbm90IGF2YWlsYWJsZSBp biBtYW55IGNvdW50cmllcyANCg0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCdyZWcgcXVlcnkgIkhLQ1VcQ29udHJvbCBQYW5lbFxJbnRl cm5hdGlvbmFsXEdlbyIgL3YgTmFtZSAlbnVsNiUnKSBkbyBzZXQgIm5hbWU9JSViIg0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCdyZWcg cXVlcnkgIkhLQ1VcQ29udHJvbCBQYW5lbFxJbnRlcm5hdGlvbmFsXEdlbyIgL3YgTmF0aW9uICVudWw2JScpIGRvIHNldCAibmF0aW9uPSUlYiINCg0KOjog IFNraXAgY2hhbmdpbmcgcmVnaW9uIGluIHRvcCBjb3VudHJpZXMNCg0Kc2V0IHJlZ2lvbmNoYW5nZT0xDQpmb3IgJSUjIGluIChVUyBDTiBJTiBCUiBERSBK UCBHQiBGUiBNWCBJRCBJVCBQSyBUUiBLUiBDQSBFUyBBVSBORyBWTiBQTCBQSCBOTCBFRyBBUiBUSCBDTyBTQSBUVyBNWSBDTCkgZG8gaWYgL2kgIiVuYW1l JSI9PSIlJSMiIHNldCByZWdpb25jaGFuZ2U9DQoNCmlmIGRlZmluZWQgcmVnaW9uY2hhbmdlICgNCiVwc2MlICJTZXQtV2luSG9tZUxvY2F0aW9uIC1HZW9J ZCAyNDQiICVudWwlDQppZiAhZXJyb3JsZXZlbCEgRVFVIDAgKA0KZWNobyBDaGFuZ2luZyBXaW5kb3dzIFJlZ2lvbiBUbyBVU0EgICAgICAgICAgW1N1Y2Nl c3NmdWxdIFtTY3JpcHQgd2lsbCBjaGFuZ2UgaXQgYmFja10NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hhbmdpbmcgV2luZG93cyBSZWdp b24gVG8gVVNBICAgICAgICAgIFtGYWlsZWRdIg0KKQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K DQo6OiAgR2VuZXJhdGUgR2VudWluZVRpY2tldC54bWwgYW5kIGFwcGx5DQo6OiAgSW4gc29tZSBjYXNlcyBjbGlwdXAgLXYgLW8gbWV0aG9kIGZhaWxzIGFu ZCBpbiBzb21lIGNhc2VzIHNlcnZpY2UgcmVzdGFydCBtZXRob2QgZmFpbHMgYXMgd2VsbA0KOjogIFRvIG1heGltaXplIHN1Y2Nlc3MgcmF0ZSBhbmQgZ2V0 IGJldHRlciBlcnJvciBkZXRhaWxzLCBzY3JpcHQgd2lsbCBpbnN0YWxsIHRpY2tldHMgdHdvIHRpbWVzIChzZXJ2aWNlIHJlc3RhcnQgKyBjbGlwdXAgLXYg LW8pDQoNCnNldCAidGRpcj0lUHJvZ3JhbURhdGElXE1pY3Jvc29mdFxXaW5kb3dzXENsaXBTVkNcR2VudWluZVRpY2tldCINCmlmIG5vdCBleGlzdCAiJXRk aXIlXCIgbWQgIiV0ZGlyJVwiICVudWwlDQoNCmlmIGV4aXN0ICIldGRpciVcR2VudWluZSoiIGRlbCAvZiAvcSAiJXRkaXIlXEdlbnVpbmUqIiAlbnVsJQ0K aWYgZXhpc3QgIiV0ZGlyJVwqLnhtbCIgZGVsIC9mIC9xICIldGRpciVcKi54bWwiICVudWwlDQppZiBleGlzdCAiJVByb2dyYW1EYXRhJVxNaWNyb3NvZnRc V2luZG93c1xDbGlwU1ZDXEluc3RhbGxcTWlncmF0aW9uXCoiIGRlbCAvZiAvcSAiJVByb2dyYW1EYXRhJVxNaWNyb3NvZnRcV2luZG93c1xDbGlwU1ZDXElu c3RhbGxcTWlncmF0aW9uXCoiICVudWwlDQoNCmNhbGwgOmh3aWRkYXRhIHRpY2tldA0KDQpjb3B5IC95IC9iICIldGRpciVcR2VudWluZVRpY2tldCIgIiV0 ZGlyJVxHZW51aW5lVGlja2V0LnhtbCIgJW51bCUNCg0KaWYgbm90IGV4aXN0ICIldGRpciVcR2VudWluZVRpY2tldC54bWwiICgNCmNhbGwgOmRrX2NvbG9y ICVSZWQlICJHZW5lcmF0aW5nIEdlbnVpbmVUaWNrZXQueG1sICAgICAgICAgICAgW0ZhaWxlZCwgYWJvcnRpbmcuLi5dIg0KZWNobyBbJWVuY29kZWQlXQ0K aWYgZXhpc3QgIiV0ZGlyJVxHZW51aW5lKiIgZGVsIC9mIC9xICIldGRpciVcR2VudWluZSoiICVudWwlDQpnb3RvIDpkbF9maW5hbA0KKSBlbHNlICgNCmVj aG8gR2VuZXJhdGluZyBHZW51aW5lVGlja2V0LnhtbCAgICAgICAgICAgIFtTdWNjZXNzZnVsXQ0KKQ0KDQpzZXQgIl94bWxleGlzdD1pZiBleGlzdCAiJXRk aXIlXEdlbnVpbmVUaWNrZXQueG1sIiINCg0KJV94bWxleGlzdCUgKA0KJXBzYyUgIlN0YXJ0LUpvYiB7IFJlc3RhcnQtU2VydmljZSBDbGlwU1ZDIH0gfCBX YWl0LUpvYiAtVGltZW91dCAyMCB8IE91dC1OdWxsIg0KJV94bWxleGlzdCUgdGltZW91dCAvdCAyICVudWwlDQolX3htbGV4aXN0JSB0aW1lb3V0IC90IDIg JW51bCUNCg0KJV94bWxleGlzdCUgKA0Kc2V0IGVycm9yPTENCmlmIGV4aXN0ICIldGRpciVcKi54bWwiIGRlbCAvZiAvcSAiJXRkaXIlXCoueG1sIiAlbnVs JQ0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJJbnN0YWxsaW5nIEdlbnVpbmVUaWNrZXQueG1sICAgICAgICAgICAgW0ZhaWxlZCB3aXRoIENsaXBTVkMgc2Vy dmljZSByZXN0YXJ0LCB3YWl0Li4uXSINCikNCikNCg0KY29weSAveSAvYiAiJXRkaXIlXEdlbnVpbmVUaWNrZXQiICIldGRpciVcR2VudWluZVRpY2tldC54 bWwiICVudWwlDQpjbGlwdXAgLXYgLW8NCg0Kc2V0IHJlYnVpbGRpbmZvPQ0KDQppZiBub3QgZXhpc3QgJVByb2dyYW1EYXRhJVxNaWNyb3NvZnRcV2luZG93 c1xDbGlwU1ZDXHRva2Vucy5kYXQgKA0Kc2V0IGVycm9yPTENCnNldCByZWJ1aWxkaW5mbz0xDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgQ2xp cFNWQyB0b2tlbnMuZGF0ICAgICAgICAgICAgIFtOb3QgRm91bmRdIg0KKQ0KDQolX3htbGV4aXN0JSAoDQpzZXQgZXJyb3I9MQ0Kc2V0IHJlYnVpbGRpbmZv PTENCmNhbGwgOmRrX2NvbG9yICVSZWQlICJJbnN0YWxsaW5nIEdlbnVpbmVUaWNrZXQueG1sICAgICAgICAgICAgW0ZhaWxlZCBXaXRoIGNsaXB1cCAtdiAt b10iDQopDQoNCmlmIGV4aXN0ICIlUHJvZ3JhbURhdGElXE1pY3Jvc29mdFxXaW5kb3dzXENsaXBTVkNcSW5zdGFsbFxNaWdyYXRpb25cKi54bWwiICgNCnNl dCBlcnJvcj0xDQpzZXQgcmVidWlsZGluZm89MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFRpY2tldCBNaWdyYXRpb24gICAgICAgICAgICAg ICBbRmFpbGVkXSINCikNCg0KaWYgbm90IGRlZmluZWQgYWx0YXBwbGlzdCBpZiBub3QgZGVmaW5lZCBzaG93Zml4IGlmIGRlZmluZWQgcmVidWlsZGluZm8g KA0Kc2V0IHNob3dmaXg9MQ0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQplY2hvOg0KKQ0KDQppZiBleGlzdCAiJXRkaXIlXEdlbnVpbmUq IiBkZWwgL2YgL3EgIiV0ZGlyJVxHZW51aW5lKiIgJW51bCUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Cg0KY2FsbCA6ZGtfcHJvZHVjdA0KDQplY2hvOg0KZWNobyBBY3RpdmF0aW5nLi4uDQoNCmNhbGwgOmRrX2FjdA0KY2FsbCA6ZGtfY2hlY2twZXJtDQppZiBk ZWZpbmVkIF9wZXJtICgNCmVjaG86DQpjYWxsIDpka19jb2xvciAlR3JlZW4lICIld2lub3MlIGlzIHBlcm1hbmVudGx5IGFjdGl2YXRlZCB3aXRoIGEgZGln aXRhbCBsaWNlbnNlLiINCmdvdG8gOmRsX2ZpbmFsDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoN Cjo6ICBDbGVhciBzdG9yZSBJRCByZWxhdGVkIHJlZ2lzdHJ5IHRvIGZpeCBhY3RpdmF0aW9uIGlmIEludGVybmV0IGlzIGNvbm5lY3RlZA0KDQpzZXQgIl9p ZGVudD1IS1VcUy0xLTUtMTlcU09GVFdBUkVcTWljcm9zb2Z0XElkZW50aXR5Q1JMIg0KDQppZiAla2V5ZXJyb3IlIEVRVSAwIGlmIGRlZmluZWQgX2ludCAo DQpyZWcgZGVsZXRlICIlX2lkZW50JSIgL2YgJW51bCUNCmZvciAlJSMgaW4gKHdsaWRzdmMgTGljZW5zZU1hbmFnZXIgc3Bwc3ZjKSBkbyAoJXBzYyUgIlN0 YXJ0LUpvYiB7IFJlc3RhcnQtU2VydmljZSAlJSMgfSB8IFdhaXQtSm9iIC1UaW1lb3V0IDIwIHwgT3V0LU51bGwiKQ0KY2FsbCA6ZGtfcmVmcmVzaA0KY2Fs bCA6ZGtfYWN0DQpjYWxsIDpka19jaGVja3Blcm0NCg0KcmVnIHF1ZXJ5ICIlX2lkZW50JSIgJW51bCUgfHwgKA0Kc2V0IGVycm9yPTENCmVjaG86DQpjYWxs IDpka19jb2xvciAlUmVkJSAiR2VuZXJhdGluZyBOZXcgSWRlbnRpdHlDUkwgUmVnaXN0cnkgICAgIFtGYWlsZWRdIFslX2lkZW50JV0iDQopDQopDQoNCjo6 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBFeHRlbmRlZCBsaWNlbnNpbmcgc2VydmVycyB0ZXN0cyBp bmNhc2UgZXJyb3Igbm90IGZvdW5kIGFuZCBhY3RpdmF0aW9uIGZhaWxlZA0KDQppZiAla2V5ZXJyb3IlIEVRVSAwIGlmIG5vdCBkZWZpbmVkIF9wZXJtIGlm IGRlZmluZWQgX2ludCAoDQppcGNvbmZpZyAvZmx1c2hkbnMgJW51bCUNCnNldCAidGxzPVtOZXQuU2VydmljZVBvaW50TWFuYWdlcl06OlNlY3VyaXR5UHJv dG9jb2w9W05ldC5TZWN1cml0eVByb3RvY29sVHlwZV06OlRsczEyOyINCg0KZm9yICUlIyBpbiAoDQpsaWNlbnNpbmcubXAubWljcm9zb2Z0LmNvbS92Ny4w L2xpY2Vuc2VzL2NvbnRlbnQNCmxvZ2luLmxpdmUuY29tL3Bwc2VjdXJlL2RldmljZWFkZGNyZWRlbnRpYWwuc3JmDQpwdXJjaGFzZS5tcC5taWNyb3NvZnQu Y29tL3Y3LjAvdXNlcnMvbWUvb3JkZXJzDQopIGRvIGlmIG5vdCBkZWZpbmVkIHJlc2ZhaWwgKA0KJXBzYyUgInRyeSB7ICF0bHMhIGlybSBodHRwczovLyUl IyAtTWV0aG9kIFBPU1QgfSBjYXRjaCB7IGlmICgkXy5FeGNlcHRpb24uUmVzcG9uc2UgLWVxICRudWxsKSB7IFdyaXRlLUhvc3QgIiIiIlslJSNdICQoJF8u RXhjZXB0aW9uLk1lc3NhZ2UpIiIiIiAtRm9yZWdyb3VuZENvbG9yIFJlZCAtQmFja2dyb3VuZENvbG9yIEJsYWNrOyBleGl0IDMgfSB9Ig0KaWYgIWVycm9y bGV2ZWwhPT0zIHNldCByZXNmYWlsPTENCikNCikNCg0KaWYgZGVmaW5lZCByZXNmYWlsICgNCnNldCBlcnJvcj0xDQpmb3IgJSUjIGluICgNCmxpdmUuY29t DQptaWNyb3NvZnQuY29tDQpsb2dpbi5saXZlLmNvbQ0KcHVyY2hhc2UubXAubWljcm9zb2Z0LmNvbQ0KbGljZW5zaW5nLm1wLm1pY3Jvc29mdC5jb20NCikg ZG8gKA0KZmluZHN0ciAvaSAiJSUjIiAiJVN5c1BhdGglXGRyaXZlcnNcZXRjXGhvc3RzIiAlbnVsMSUgJiYgc2V0ICJob3NmYWlsPSBbJSUjIEJsb2NrZWQg aW4gSG9zdHNdIg0KKQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIExpY2Vuc2luZyBTZXJ2ZXJzICAgICAgICAgICAgICBbRmFpbGVkIHRvIENv bm5lY3RdIWhvc2ZhaWwhIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVsaWNlbnNpbmctc2VydmVycy1pc3N1ZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAi Q2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJWxpY2Vuc2luZy1zZXJ2ZXJzLWlzc3VlIg0KZWNobzoNCikNCg0KOjo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIFdpbmRvd3MgdXBkYXRlIGFuZCBzdG9yZSBibG9jayBjaGVj aw0KDQppZiAla2V5ZXJyb3IlIEVRVSAwIGlmIG5vdCBkZWZpbmVkIF9wZXJtIGlmIGRlZmluZWQgX2ludCAoDQoNCnJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FS RVxQb2xpY2llc1xNaWNyb3NvZnRcV2luZG93c1xXaW5kb3dzVXBkYXRlIiAvdiBEaXNhYmxlV2luZG93c1VwZGF0ZUFjY2VzcyAlbnVsMiUgfCBmaW5kIC9p ICIweDEiICVudWwlICYmIHNldCB3dWJsb2NrPTENCnJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxQb2xpY2llc1xNaWNyb3NvZnRcV2luZG93c1xXaW5kb3dz VXBkYXRlIiAvdiBEb05vdENvbm5lY3RUb1dpbmRvd3NVcGRhdGVJbnRlcm5ldExvY2F0aW9ucyAlbnVsMiUgfCBmaW5kIC9pICIweDEiICVudWwlICYmIHNl dCB3dWJsb2NrPTENCmlmIGRlZmluZWQgd3VibG9jayAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgVXBkYXRlIEJsb2NrZXIgSW4gUmVnaXN0 cnkgICAgIFtGb3VuZF0iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkhXSUQgYWN0aXZhdGlvbiBuZWVkcyB3b3JraW5nIFdpbmRvd3MgdXBkYXRlcywgaWYg eW91IGhhdmUgdXNlZCBhbnkgdG9vbCB0byBibG9jayB1cGRhdGVzLCB1bmRvIGl0LiINCmVjaG86DQopDQoNCnJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxQ b2xpY2llc1xNaWNyb3NvZnRcV2luZG93c1N0b3JlIiAvdiBEaXNhYmxlU3RvcmVBcHBzICVudWwyJSB8IGZpbmQgL2kgIjB4MSIgJW51bCUgJiYgKA0Kc2V0 IHN0b3JlYmxvY2s9MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFN0b3JlIEJsb2NrZXIgSW4gUmVnaXN0cnkgICAgICBbRm91bmRdIg0KY2Fs bCA6ZGtfY29sb3IgJUJsdWUlICJJZiB5b3UgaGF2ZSB1c2VkIGFueSB0b29sIHRvIGJsb2NrIFN0b3JlLCB1bmRvIGl0LiINCmVjaG86DQopDQoNCnNldCB3 Y291bnQ9MA0KZm9yICUlRyBpbiAoRGVwZW5kT25TZXJ2aWNlIERlc2NyaXB0aW9uIERpc3BsYXlOYW1lIEVycm9yQ29udHJvbCBJbWFnZVBhdGggT2JqZWN0 TmFtZSBTdGFydCBUeXBlIFNlcnZpY2VTaWRUeXBlIFJlcXVpcmVkUHJpdmlsZWdlcyBGYWlsdXJlQWN0aW9ucykgZG8gKA0KcmVnIHF1ZXJ5IEhLTE1cU1lT VEVNXEN1cnJlbnRDb250cm9sU2V0XFNlcnZpY2VzXHd1YXVzZXJ2IC92ICUlRyAlbnVsJSB8fCAoc2V0IHd1Y29ycnVwdD0xJnNldCAvYSB3Y291bnQrPTEp DQopDQoNCmZvciAlJUcgaW4gKFBhcmFtZXRlcnMgU2VjdXJpdHkpIGRvICgNCnJlZyBxdWVyeSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxTZXJ2 aWNlc1x3dWF1c2VydlwlJUcgJW51bCUgfHwgKHNldCB3dWNvcnJ1cHQ9MSZzZXQgL2Egd2NvdW50Kz0xKQ0KKQ0KDQppZiBkZWZpbmVkIHd1Y29ycnVwdCAo DQpzZXQgZXJyb3I9MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFdpbmRvd3MgVXBkYXRlIFJlZ2lzdHJ5ICAgICAgICBbQ29ycnVwdGlvbiBG b3VuZF0iDQppZiAhd2NvdW50ISBHVFIgMiAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiV2luZG93cyBzZWVtcyB0byBiZSBpbmZlY3RlZCB3aXRoIE1hbCV3 JXdhcmUuIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVyZW1vdmVfbWFsJXcld2FyZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJw YWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXJlbW92ZV9tYWwldyV3YXJlIg0KZWNobzoNCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlQmx1 ZSUgIkhXSUQgYWN0aXZhdGlvbiBuZWVkcyB3b3JraW5nIFdpbmRvd3MgdXBkYXRlcywgaWYgeW91IGhhdmUgdXNlZCBhbnkgdG9vbCB0byBibG9jayB1cGRh dGVzLCB1bmRvIGl0LiINCmVjaG86DQopDQopIGVsc2UgKA0KJXBzYyUgIlN0YXJ0LUpvYiB7IFN0YXJ0LVNlcnZpY2Ugd3VhdXNlcnYgfSB8IFdhaXQtSm9i IC1UaW1lb3V0IDIwIHwgT3V0LU51bGwiDQpzYyBxdWVyeSB3dWF1c2VydiB8IGZpbmQgL2kgIlJVTk5JTkciICVudWwlIHx8ICgNCnNldCBlcnJvcj0xDQpz ZXQgd3VlcnJvcj0xDQpzYyBzdGFydCB3dWF1c2VydiAlbnVsJQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlN0YXJ0aW5nIFdpbmRvd3MgVXBkYXRlIFNlcnZp Y2UgICAgICAgICBbRmFpbGVkXSBbIWVycm9ybGV2ZWwhXSINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiSFdJRCBhY3RpdmF0aW9uIG5lZWRzIHdvcmtpbmcg V2luZG93cyB1cGRhdGVzLCBpZiB5b3UgaGF2ZSB1c2VkIGFueSB0b29sIHRvIGJsb2NrIHVwZGF0ZXMsIHVuZG8gaXQuIg0KZWNobzoNCikNCikNCikNCg0K Ojo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIEludGVybmV0IHJlbGF0ZWQgZXJyb3IgY29k ZXMNCg0KaWYgJWtleWVycm9yJSBFUVUgMCBpZiBub3QgZGVmaW5lZCBfcGVybSBpZiBkZWZpbmVkIF9pbnQgKA0KaWYgbm90IGRlZmluZWQgd3Vjb3JydXB0 IGlmIG5vdCBkZWZpbmVkIHd1YmxvY2sgaWYgbm90IGRlZmluZWQgd3VlcnJvciBpZiBub3QgZGVmaW5lZCBzdG9yZWJsb2NrIGlmIG5vdCBkZWZpbmVkIHJl c2ZhaWwgKA0KZWNobyAiJWVycm9yX2NvZGUlIiB8IGZpbmRzdHIgL2kgIjB4ODAwNzJlIDB4ODAwNzJmIDB4ODAwNzA0Y2YgMHg4N2UxMGJjZiAweDgwMDcw NWI0IiAlbnVsJSAmJiAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgSW50ZXJuZXQgSXNzdWVzICAgICAgICAgICAgICAgIFtGb3VuZF0gJWVy cm9yX2NvZGUlIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVsaWNlbnNpbmctc2VydmVycy1pc3N1ZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sg dGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJWxpY2Vuc2luZy1zZXJ2ZXJzLWlzc3VlIg0KZWNobzoNCikNCikNCikNCg0KOjo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KZWNobzoNCmlmIGRlZmluZWQgX3Blcm0gKA0KY2FsbCA6ZGtfY29s b3IgJUdyZWVuJSAiJXdpbm9zJSBpcyBwZXJtYW5lbnRseSBhY3RpdmF0ZWQgd2l0aCBhIGRpZ2l0YWwgbGljZW5zZS4iDQopIGVsc2UgKA0KY2FsbCA6ZGtf Y29sb3IgJVJlZCUgIkFjdGl2YXRpb24gRmFpbGVkICVlcnJvcl9jb2RlJSINCmlmIGRlZmluZWQgbm90d29ya2luZyAoDQpjYWxsIDpka19jb2xvciAlQmx1 ZSUgIkF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIEhXSUQgQWN0aXZhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHByb2R1Y3QuIg0KY2FsbCA6ZGtf Y29sb3IgJUJsdWUlICJVc2UgVFNmb3JnZSBhY3RpdmF0aW9uIG9wdGlvbiBmcm9tIHRoZSBtYWluIG1lbnUgaW5zdGVhZC4iDQopIGVsc2UgKA0KaWYgbm90 IGRlZmluZWQgZXJyb3IgY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2Fs bCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCikNCikN Cg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpkbF9maW5hbA0KDQplY2hvOg0KDQppZiBkZWZpbmVkIHJl Z2lvbmNoYW5nZSAoDQolcHNjJSAiU2V0LVdpbkhvbWVMb2NhdGlvbiAtR2VvSWQgJW5hdGlvbiUiICVudWwlDQppZiAhZXJyb3JsZXZlbCEgRVFVIDAgKA0K ZWNobyBSZXN0b3JpbmcgV2luZG93cyBSZWdpb24gICAgICAgICAgICAgICAgW1N1Y2Nlc3NmdWxdDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUg IlJlc3RvcmluZyBXaW5kb3dzIFJlZ2lvbiAgICAgICAgICAgICAgICBbRmFpbGVkXSBbJW5hbWUlIC0gJW5hdGlvbiVdIg0KKQ0KKQ0KDQpSRU0gaWYgJW9z U0tVJT09MTc1IGNhbGwgOmRrX2NvbG9yICVSZWQlICIld2lub3MlIGRvZXMgbm90IHN1cHBvcnQgYWN0aXZhdGlvbiBvbiBub24tYXp1cmUgcGxhdGZvcm1z LiINCg0KOjogIFRyaWdnZXIgcmVldmFsdWF0aW9uIG9mIFNQUCdzIFNjaGVkdWxlZCBUYXNrcw0KDQppZiBkZWZpbmVkIF9wZXJtICgNCmNhbGwgOmRrX3Jl ZXZhbCAlbnVsJQ0KKQ0KZ290byA6ZGtfZG9uZQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIFNl dCB2YXJpYWJsZXMNCg0KOmRrX3NldHZhcg0KDQpzZXQgcHM9JVN5c1BhdGglXFdpbmRvd3NQb3dlclNoZWxsXHYxLjBccG93ZXJzaGVsbC5leGUNCnNldCBw c2M9JXBzJSAtbm9wIC1jDQpzZXQgd2luYnVpbGQ9MQ0KZm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9W10iICUlRyBpbiAoJ3ZlcicpIGRvIGZvciAvZiAidG9r ZW5zPTIsMyw0IGRlbGltcz0uICIgJSVIIGluICgiJSV+RyIpIGRvIHNldCAid2luYnVpbGQ9JSVKIg0KDQpzZXQgX3NsZXhlPXNwcHN2Yy5leGUmIHNldCBf c2xzZXI9c3Bwc3ZjDQppZiAld2luYnVpbGQlIExFUSA2MzAwIChzZXQgX3NsZXhlPVNMc3ZjLmV4ZSYgc2V0IF9zbHNlcj1TTHN2YykNCmlmICV3aW5idWls ZCUgTFNTIDc2MDAgaWYgZXhpc3QgIiVTeXNQYXRoJVxTTHN2Yy5leGUiIChzZXQgX3NsZXhlPVNMc3ZjLmV4ZSYgc2V0IF9zbHNlcj1TTHN2YykNCmlmICVf c2xleGUlPT1TTHN2Yy5leGUgc2V0IF92aXM9MQ0KDQpzZXQgX05DUz0xDQppZiAld2luYnVpbGQlIExTUyAxMDU4NiBzZXQgX05DUz0wDQppZiAld2luYnVp bGQlIEdFUSAxMDU4NiByZWcgcXVlcnkgIkhLQ1VcQ29uc29sZSIgL3YgRm9yY2VWMiAlbnVsMiUgfCBmaW5kIC9pICIweDAiICVudWwxJSAmJiAoc2V0IF9O Q1M9MCkNCg0KZWNobyAiJVBST0NFU1NPUl9BUkNISVRFQ1RVUkUlICVQUk9DRVNTT1JfQVJDSElURVc2NDMyJSIgfCBmaW5kIC9pICJBUk02NCIgJW51bDEl ICYmIChpZiAld2luYnVpbGQlIExTUyAyMTI3NyBzZXQgcHMzMm9uQXJtPTEpDQoNCmlmICVfTkNTJSBFUVUgMSAoDQpmb3IgL0YgJSVhIGluICgnZWNobyBw cm9tcHQgJEUgXnwgY21kJykgZG8gc2V0ICJlc2M9JSVhIg0Kc2V0ICAgICAiUmVkPSI0MTs5N20iIg0Kc2V0ICAgICJHcmF5PSIxMDA7OTdtIiINCnNldCAg ICJHcmVlbj0iNDI7OTdtIiINCnNldCAgICAiQmx1ZT0iNDQ7OTdtIiINCnNldCAgICJXaGl0ZT0iMTA3OzkxbSIiDQpzZXQgICAgIl9SZWQ9IjQwOzkxbSIi DQpzZXQgICJfV2hpdGU9IjQwOzM3bSIiDQpzZXQgICJfR3JlZW49IjQwOzkybSIiDQpzZXQgIl9ZZWxsb3c9IjQwOzkzbSIiDQopIGVsc2UgKA0Kc2V0ICAg ICAiUmVkPSJSZWQiICJ3aGl0ZSIiDQpzZXQgICAgIkdyYXk9IkRhcmtncmF5IiAid2hpdGUiIg0Kc2V0ICAgIkdyZWVuPSJEYXJrR3JlZW4iICJ3aGl0ZSIi DQpzZXQgICAgIkJsdWU9IkJsdWUiICJ3aGl0ZSIiDQpzZXQgICAiV2hpdGU9IldoaXRlIiAiUmVkIiINCnNldCAgICAiX1JlZD0iQmxhY2siICJSZWQiIg0K c2V0ICAiX1doaXRlPSJCbGFjayIgIkdyYXkiIg0Kc2V0ICAiX0dyZWVuPSJCbGFjayIgIkdyZWVuIiINCnNldCAiX1llbGxvdz0iQmxhY2siICJZZWxsb3ci Ig0KKQ0KDQpzZXQgIm5jZWxpbmU9ZWNobzogJmVjaG8gPT09PSBFUlJPUiA9PT09ICZlY2hvOiINCnNldCAiZWxpbmU9ZWNobzogJmNhbGwgOmRrX2NvbG9y ICVSZWQlICI9PT09IEVSUk9SID09PT0iICZlY2hvOiINCmlmICV+ejAgR0VRIDIwMDAwMCAoDQpzZXQgIl9leGl0bXNnPUdvIGJhY2siDQpzZXQgIl9maXht c2c9R28gYmFjayB0byBNYWluIE1lbnUsIHNlbGVjdCBUcm91Ymxlc2hvb3QgYW5kIHJ1biBGaXggTGljZW5zaW5nIG9wdGlvbi4iDQopIGVsc2UgKA0Kc2V0 ICJfZXhpdG1zZz1FeGl0Ig0Kc2V0ICJfZml4bXNnPUluIE1BUyBmb2xkZXIsIHJ1biBUcm91Ymxlc2hvb3Qgc2NyaXB0IGFuZCBzZWxlY3QgRml4IExpY2Vu c2luZyBvcHRpb24uIg0KKQ0KZXhpdCAvYg0KDQo6OiAgU2hvdyBPUyBpbmZvDQoNCjpka19zaG93b3NpbmZvDQoNCmZvciAvZiAic2tpcD0yIHRva2Vucz0y KiIgJSVhIGluICgncmVnIHF1ZXJ5ICJIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxDb250cm9sXFNlc3Npb24gTWFuYWdlclxFbnZpcm9ubWVudCIg L3YgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRScpIGRvIHNldCBvc2FyY2g9JSViDQoNCmZvciAvZiAidG9rZW5zPTYtNyBkZWxpbXM9W10uICIgJSVpIGluICgn dmVyJykgZG8gaWYgbm90ICIlJWoiPT0iIiAoDQpzZXQgZnVsbGJ1aWxkPSUlaS4lJWoNCikgZWxzZSAoDQpmb3IgL2YgInRva2Vucz0zIiAlJUcgaW4gKCci cmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uIiAvdiBVQlIiICVudWw2JScpIGRvIGlmIG5vdCBl cnJvcmxldmVsIDEgc2V0IC9hICJVQlI9JSVHIg0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTMsNCBkZWxpbXM9LiAiICUlRyBpbiAoJ3JlZyBxdWVyeSAiSEtM TVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgL3YgQnVpbGRMYWJFeCcpIGRvICgNCmlmIGRlZmluZWQgVUJSIChzZXQg ImZ1bGxidWlsZD0lJUcuIVVCUiEiKSBlbHNlIChzZXQgImZ1bGxidWlsZD0lJUcuJSVIIikNCikNCikNCg0KZWNobyBDaGVja2luZyBPUyBJbmZvICAgICAg ICAgICAgICAgICAgICAgICAgWyV3aW5vcyUgXnwgJWZ1bGxidWlsZCUgXnwgJW9zYXJjaCVdDQpleGl0IC9iDQoNCjo6ICBDaGVjayBTS1UgdmFsdWUNCg0K OmRrX2NoZWNrc2t1DQoNCmNhbGwgOmRrX3JlZmxlY3Rpb24NCg0Kc2V0IG9zU0tVPQ0Kc2V0IHNsY1NLVT0NCnNldCB3bWlTS1U9DQpzZXQgcmVnU0tVPQ0K c2V0IHdpbnN1Yj0NCg0KaWYgJXdpbmJ1aWxkJSBHRVEgMTQzOTMgKHNldCBpbmZvPUtlcm5lbC1CcmFuZGluZ0luZm8pIGVsc2UgKHNldCBpbmZvPUtlcm5l bC1Qcm9kdWN0SW5mbykNCnNldCBkMT0lcmVmJSBbdm9pZF0kVHlwZUJ1aWxkZXIuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xHZXRXaW5kb3dzSW5mb3JtYXRp b25EV09SRCcsICdzbGMuZGxsJywgJ1B1YmxpYywgU3RhdGljJywgMSwgW2ludF0sIEAoW1N0cmluZ10sIFtpbnRdLk1ha2VCeVJlZlR5cGUoKSksIDEsIDMp Ow0Kc2V0IGQxPSVkMSUgJFNrdSA9IDA7IFt2b2lkXSRUeXBlQnVpbGRlci5DcmVhdGVUeXBlKCk6OlNMR2V0V2luZG93c0luZm9ybWF0aW9uRFdPUkQoJyVp bmZvJScsIFtyZWZdJFNrdSk7ICRTa3UNCmZvciAvZiAiZGVsaW1zPSIgJSVzIGluICgnIiVwc2MlICVkMSUiJykgZG8gaWYgbm90IGVycm9ybGV2ZWwgMSAo c2V0IHNsY1NLVT0lJXMpDQpzZXQgc2xjU0tVPSVzbGNTS1U6ID0lDQppZiAiJXNsY1NLVSUiPT0iMCIgc2V0IHNsY1NLVT0NCmZvciAvZiAidG9rZW5zPSog ZGVsaW1zPTAxMjM0NTY3ODkiICUlYSBpbiAoIiVzbGNTS1UlIikgZG8gKGlmIG5vdCAiWyUlYV0iPT0iW10iIHNldCBzbGNTS1U9KQ0KDQpmb3IgL2YgInRv a2Vucz0zIGRlbGltcz0uIiAlJWEgaW4gKCdyZWcgcXVlcnkgIkhLTE1cU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcUHJvZHVjdE9wdGlvbnMi IC92IE9TUHJvZHVjdFBmbiAlbnVsNiUnKSBkbyBzZXQgInJlZ1NLVT0lJWEiDQppZiAlX3dtaWMlIEVRVSAxIGZvciAvZiAidG9rZW5zPTIgZGVsaW1zPT0i ICUlYSBpbiAoJyJ3bWljIFBhdGggV2luMzJfT3BlcmF0aW5nU3lzdGVtIEdldCBPcGVyYXRpbmdTeXN0ZW1TS1UgL2Zvcm1hdDpMSVNUIiAlbnVsNiUnKSBk byBpZiBub3QgZXJyb3JsZXZlbCAxIHNldCAid21pU0tVPSUlYSINCmlmICVfd21pYyUgRVFVIDAgZm9yIC9mICJ0b2tlbnM9MSIgJSVhIGluICgnJXBzYyUg IihbV01JXSdXaW4zMl9PcGVyYXRpbmdTeXN0ZW09QCcpLk9wZXJhdGluZ1N5c3RlbVNLVSIgJW51bDYlJykgZG8gaWYgbm90IGVycm9ybGV2ZWwgMSBzZXQg IndtaVNLVT0lJWEiDQoNCmlmICV3aW5idWlsZCUgR0VRIDE1MDYzICVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0 ICc6d2luc3Vic3RhdHVzXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSkiICVudWwyJSB8IGZpbmQgL2kgIlN1YnNjcmlwdGlvbl9pc19h Y3RpdmF0ZWQiICVudWwlICYmICgNCmlmIGRlZmluZWQgcmVnU0tVIGlmIGRlZmluZWQgc2xjU0tVIGlmIG5vdCAiJXJlZ1NLVSUiPT0iJXNsY1NLVSUiICgN CnNldCB3aW5zdWI9MQ0Kc2V0IG9zU0tVPSVyZWdTS1UlDQopDQopDQoNCmlmIG5vdCBkZWZpbmVkIG9zU0tVIHNldCBvc1NLVT0lc2xjU0tVJQ0KaWYgbm90 IGRlZmluZWQgb3NTS1Ugc2V0IG9zU0tVPSV3bWlTS1UlDQppZiBub3QgZGVmaW5lZCBvc1NLVSBzZXQgb3NTS1U9JXJlZ1NLVSUNCmV4aXQgL2INCg0KOjog IEdldCBXaW5kb3dzIFN1YnNjcmlwdGlvbiBzdGF0dXMNCg0KOndpbnN1YnN0YXR1czoNCiRETSA9IFtBcHBEb21haW5dOjpDdXJyZW50RG9tYWluLkRlZmlu ZUR5bmFtaWNBc3NlbWJseSg2LCAxKS5EZWZpbmVEeW5hbWljTW9kdWxlKDQpLkRlZmluZVR5cGUoMikNClt2b2lkXSRETS5EZWZpbmVQSW52b2tlTWV0aG9k KCdDbGlwR2V0U3Vic2NyaXB0aW9uU3RhdHVzJywgJ0NsaXBjLmRsbCcsIDIyLCAxLCBbSW50MzJdLCBAKFtJbnRQdHJdLk1ha2VCeVJlZlR5cGUoKSksIDEs IDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KJG0gPSBbU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLk1hcnNoYWxdDQokcCA9ICRtOjpB bGxvY0hHbG9iYWwoMTIpDQokciA9ICRETS5DcmVhdGVUeXBlKCk6OkNsaXBHZXRTdWJzY3JpcHRpb25TdGF0dXMoW3JlZl0kcCkNCmlmICgkciAtZXEgMCkg ew0KICAkZW5hYmxlZCA9ICRtOjpSZWFkSW50MzIoJHApDQogIGlmICgkZW5hYmxlZCAtZ2UgMSkgew0KICAgICRzdGF0ZSA9ICRtOjpSZWFkSW50MzIoJHAs IDgpDQogICAgaWYgKCRzdGF0ZSAtZXEgMSkgew0KICAgICAgICAiU3Vic2NyaXB0aW9uX2lzX2FjdGl2YXRlZC4iDQogICAgfQ0KICB9DQp9DQo6d2luc3Vi c3RhdHVzOg0KDQo6OiAgR2V0IFdpbmRvd3MgcGVybWFuZW50IGFjdGl2YXRpb24gc3RhdHVzDQoNCjpka19jaGVja3Blcm0NCg0KaWYgJV93bWljJSBFUVUg MSB3bWljIHBhdGggJXNwcCUgd2hlcmUgKExpY2Vuc2VTdGF0dXM9JzEnIGFuZCBHcmFjZVBlcmlvZFJlbWFpbmluZz0nMCcgYW5kIFBhcnRpYWxQcm9kdWN0 S2V5IGlzIG5vdCBOVUxMIEFORCBMaWNlbnNlRGVwZW5kc09uIGlzIE5VTEwpIGdldCBOYW1lIC92YWx1ZSAlbnVsMiUgfCBmaW5kc3RyIC9pICJXaW5kb3dz IiAlbnVsMSUgJiYgc2V0IF9wZXJtPTF8fHNldCBfcGVybT0NCmlmICVfd21pYyUgRVFVIDAgJXBzYyUgIigoW1dNSVNFQVJDSEVSXSdTRUxFQ1QgTmFtZSBG Uk9NICVzcHAlIFdIRVJFIExpY2Vuc2VTdGF0dXM9MSBBTkQgR3JhY2VQZXJpb2RSZW1haW5pbmc9MCBBTkQgUGFydGlhbFByb2R1Y3RLZXkgSVMgTk9UIE5V TEwgQU5EIExpY2Vuc2VEZXBlbmRzT24gaXMgTlVMTCcpLkdldCgpKS5OYW1lIHwgJSUge2VjaG8gKCdOYW1lPScrJF8pfSIgJW51bDIlIHwgZmluZHN0ciAv aSAiV2luZG93cyIgJW51bDElICYmIHNldCBfcGVybT0xfHxzZXQgX3Blcm09DQpleGl0IC9iDQoNCjo6ICBSZWZyZXNoIGxpY2Vuc2Ugc3RhdHVzDQoNCjpk a19yZWZyZXNoDQoNCmlmICVfd21pYyUgRVFVIDEgd21pYyBwYXRoICVzcHMlIHdoZXJlIF9fQ0xBU1M9JyVzcHMlJyBjYWxsIFJlZnJlc2hMaWNlbnNlU3Rh dHVzICVudWwlDQppZiAlX3dtaWMlIEVRVSAwICVwc2MlICIkbnVsbD0oKFtXTUlDTEFTU10nJXNwcyUnKS5HZXRJbnN0YW5jZXMoKSkuUmVmcmVzaExpY2Vu c2VTdGF0dXMoKSIgJW51bCUNCmV4aXQgL2INCg0KOjogIEluc3RhbGwgS2V5DQoNCjpka19pbnNrZXkNCg0KaWYgJV93bWljJSBFUVUgMSB3bWljIHBhdGgg JXNwcyUgd2hlcmUgX19DTEFTUz0nJXNwcyUnIGNhbGwgSW5zdGFsbFByb2R1Y3RLZXkgUHJvZHVjdEtleT0iJWtleSUiICVudWwlDQppZiAlX3dtaWMlIEVR VSAwICVwc2MlICJ0cnkgeyAkbnVsbD0oKFtXTUlTRUFSQ0hFUl0nU0VMRUNUIFZlcnNpb24gRlJPTSAlc3BzJScpLkdldCgpKS5JbnN0YWxsUHJvZHVjdEtl eSgnJWtleSUnKTsgZXhpdCAwIH0gY2F0Y2ggeyBleGl0ICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbi5IUmVzdWx0IH0iICVudWwlDQpzZXQga2V5ZXJy b3I9JWVycm9ybGV2ZWwlDQpjbWQgL2MgZXhpdCAvYiAla2V5ZXJyb3IlDQppZiAla2V5ZXJyb3IlIE5FUSAwIHNldCAia2V5ZXJyb3I9WzB4JT1FeGl0Q29k ZSVdIg0KDQppZiBkZWZpbmVkIGdlbmVyaWNrZXkgKHNldCAia2V5ZWNobz1JbnN0YWxsaW5nIEdlbmVyaWMgUHJvZHVjdCBLZXkgICAgICAgICAiKSBlbHNl IChzZXQgImtleWVjaG89SW5zdGFsbGluZyBQcm9kdWN0IEtleSAgICAgICAgICAgICAgICAgIikNCmlmICVrZXllcnJvciUgRVFVIDAgKA0KaWYgJXNwcyU9 PVNvZnR3YXJlTGljZW5zaW5nU2VydmljZSBjYWxsIDpka19yZWZyZXNoDQplY2hvICVrZXllY2hvJSAlfjEgW1N1Y2Nlc3NmdWxdDQopIGVsc2UgKA0KY2Fs bCA6ZGtfY29sb3IgJVJlZCUgIiVrZXllY2hvJSAlfjEgW0ZhaWxlZF0gJWtleWVycm9yJSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0KaWYgZGVmaW5l ZCBhbHRhcHBsaXN0IGNhbGwgOmRrX2NvbG9yICVSZWQlICJBY3RpdmF0aW9uIElEIG5vdCBmb3VuZCBmb3IgdGhpcyBrZXkuIg0KY2FsbCA6ZGtfY29sb3Ig JUJsdWUlICIlX2ZpeG1zZyUiDQplY2hvOg0Kc2V0IHNob3dmaXg9MQ0KKQ0Kc2V0IGVycm9yPTENCikNCg0Kc2V0IGdlbmVyaWNrZXk9DQpleGl0IC9iDQoN Cjo6ICBBY3RpdmF0aW9uIGNvbW1hbmQNCg0KOmRrX2FjdA0KDQpzZXQgZXJyb3JfY29kZT0NCmlmICVfd21pYyUgRVFVIDEgd21pYyBwYXRoICVzcHAlIHdo ZXJlICJBcHBsaWNhdGlvbklEPSc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYnIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVM TCBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBOVUxMIiBjYWxsIEFjdGl2YXRlICVudWwlDQppZiAlX3dtaWMlIEVRVSAwICVwc2MlICJ0cnkgeyRudWxsPSgo W1dNSVNFQVJDSEVSXSdTRUxFQ1QgSUQgRlJPTSAlc3BwJSBXSEVSRSBBcHBsaWNhdGlvbklEPScnNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYw NTlmJycgQU5EIFBhcnRpYWxQcm9kdWN0S2V5IElTIE5PVCBOVUxMIEFORCBMaWNlbnNlRGVwZW5kc09uIGlzIE5VTEwnKS5HZXQoKSkuQWN0aXZhdGUoKTsg ZXhpdCAwfSBjYXRjaCB7IGV4aXQgJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uLkhSZXN1bHQgfSIgJW51bCUNCnNldCBlcnJvcl9jb2RlPSVlcnJvcmxl dmVsJQ0KY21kIC9jIGV4aXQgL2IgJWVycm9yX2NvZGUlDQppZiAlZXJyb3JfY29kZSUgTkVRIDAgKHNldCAiZXJyb3JfY29kZT1bRXJyb3IgQ29kZTogMHgl PUV4aXRDb2RlJV0iKSBlbHNlIChzZXQgZXJyb3JfY29kZT0pDQpleGl0IC9iDQoNCjo6ICBHZXQgYWxsIHByb2R1Y3RzIEFjdGl2YXRpb24gSURzDQoNCjpk a19hY3RpZHMNCg0Kc2V0IGFsbGFwcHM9DQppZiAlX3dtaWMlIEVRVSAxIHNldCAiY2hrYXBwPWZvciAvZiAidG9rZW5zPTIgZGVsaW1zPT0iICUlYSBpbiAo JyJ3bWljIHBhdGggJXNwcCUgd2hlcmUgKEFwcGxpY2F0aW9uSUQ9JyUxJykgZ2V0IElEIC9WQUxVRSIgJW51bDYlJykiDQppZiAlX3dtaWMlIEVRVSAwIHNl dCAiY2hrYXBwPWZvciAvZiAidG9rZW5zPTIgZGVsaW1zPT0iICUlYSBpbiAoJyVwc2MlICIoKFtXTUlTRUFSQ0hFUl0nU0VMRUNUIElEIEZST00gJXNwcCUg V0hFUkUgQXBwbGljYXRpb25JRD0nJyUxJycnKS5HZXQoKSkuSUQgXnwgJSUge2VjaG8gKCdJRD0nKyRfKX0iICVudWw2JScpIg0KJWNoa2FwcCUgZG8gKGlm IGRlZmluZWQgYWxsYXBwcyAoY2FsbCBzZXQgImFsbGFwcHM9IWFsbGFwcHMhICUlYSIpIGVsc2UgKGNhbGwgc2V0ICJhbGxhcHBzPSUlYSIpKQ0KDQo6OiAg Q2hlY2sgcG90ZW50aWFsIHNjcmlwdCBjcmFzaCBpc3N1ZSB3aGVuIHVzZXIgbWFudWFsbHkgaW5zdGFsbHMgd2F5IHRvbyBtYW55IGxpY2Vuc2VzIGZvciBP ZmZpY2UgKGxlbmd0aCBsaW1pdCBpbiB2YXJpYWJsZSkNCg0KaWYgZGVmaW5lZCBhbGxhcHBzIGlmICUxPT0wZmYxY2UxNS1hOTg5LTQ3OWQtYWY0Ni1mMjc1 YzYzNzA2NjMgKA0Kc2V0IGxlbj0wDQplY2hvOiFhbGxhcHBzIT4gIiFfdHRlbXAhXGNoa2xlbiINCmZvciAlJUEgaW4gKCIhX3R0ZW1wIVxjaGtsZW4iKSBk byAoc2V0IGxlbj0lJX56QSkNCmRlbCAiIV90dGVtcCFcY2hrbGVuIiAlbnVsJQ0KDQppZiAhbGVuISBHVFIgNjAwMCAoDQolZWxpbmUlDQplY2hvIFRvbyBt YW55IGxpY2Vuc2VzIGFyZSBpbnN0YWxsZWQsIHRoZSBzY3JpcHQgbWF5IGNyYXNoLg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQp0aW1l b3V0IC90IDMwDQopDQopDQpleGl0IC9iDQoNCjo6ICBHZXQgaW5zdGFsbGVkIHByb2R1Y3RzIEFjdGl2YXRpb24gSURzDQoNCjpka19hY3RpZA0KDQpzZXQg YXBwcz0NCmlmICVfd21pYyUgRVFVIDEgc2V0ICJjaGthcHA9Zm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSVhIGluICgnIndtaWMgcGF0aCAlc3BwJSB3 aGVyZSAoQXBwbGljYXRpb25JRD0nJTEnIGFuZCBQYXJ0aWFsUHJvZHVjdEtleSBpcyBub3QgbnVsbCkgZ2V0IElEIC9WQUxVRSIgJW51bDYlJykiDQppZiAl X3dtaWMlIEVRVSAwIHNldCAiY2hrYXBwPWZvciAvZiAidG9rZW5zPTIgZGVsaW1zPT0iICUlYSBpbiAoJyVwc2MlICIoKFtXTUlTRUFSQ0hFUl0nU0VMRUNU IElEIEZST00gJXNwcCUgV0hFUkUgQXBwbGljYXRpb25JRD0nJyUxJycgQU5EIFBhcnRpYWxQcm9kdWN0S2V5IElTIE5PVCBOVUxMJykuR2V0KCkpLklEIF58 ICUlIHtlY2hvICgnSUQ9JyskXyl9IiAlbnVsNiUnKSINCiVjaGthcHAlIGRvIChpZiBkZWZpbmVkIGFwcHMgKGNhbGwgc2V0ICJhcHBzPSFhcHBzISAlJWEi KSBlbHNlIChjYWxsIHNldCAiYXBwcz0lJWEiKSkNCmV4aXQgL2INCg0KOjogIFRyaWdnZXIgcmVldmFsdWF0aW9uLCBpdCBoZWxwcyBpbiB1cGRhdGluZyBT UFAgdGFza3MNCg0KOmRrX3JlZXZhbA0KDQppZiAld2luYnVpbGQlIExTUyA3NjAwIGV4aXQgL2INCg0KOjogIFRoaXMga2V5IGlzIGxlZnQgYnkgdGhlIHN5 c3RlbSBpbiByZWFybSBwcm9jZXNzIGFuZCBzcHBzdmMgc29tZXRpbWVzIGZhaWxzIHRvIGRlbGV0ZSBpdCwgaXQgY2F1c2VzIGlzc3VlcyBpbiB3b3JraW5n IG9mIHRoZSBTY2hlZHVsZWQgVGFza3Mgb2YgU1BQDQoNCnNldCAicnVsZXNrZXk9SEtVXFMtMS01LTIwXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzIE5U XEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXFBlcnNpc3RlZFN5c3RlbVN0YXRlIg0KcmVnIGRlbGV0ZSAiJXJ1bGVza2V5JSIg L3YgIlN0YXRlIiAvZiAlbnVsJQ0KcmVnIGRlbGV0ZSAiJXJ1bGVza2V5JSIgL3YgIlN1cHByZXNzUnVsZXNFbmdpbmUiIC9mICVudWwlDQoNCnNldCByMT0k VEIgPSBbQXBwRG9tYWluXTo6Q3VycmVudERvbWFpbi5EZWZpbmVEeW5hbWljQXNzZW1ibHkoNCwgMSkuRGVmaW5lRHluYW1pY01vZHVsZSgyLCAkRmFsc2Up LkRlZmluZVR5cGUoMCk7DQpzZXQgcjI9JXIxJSBbdm9pZF0kVEIuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xwVHJpZ2dlclNlcnZpY2VXb3JrZXInLCAnc3Bw Yy5kbGwnLCAyMiwgMSwgW0ludDMyXSwgQChbVUludDMyXSwgW0ludFB0cl0sIFtTdHJpbmddLCBbVUludDMyXSksIDEsIDMpOw0Kc2V0IGQxPSVyMiUgW3Zv aWRdJFRCLkNyZWF0ZVR5cGUoKTo6U0xwVHJpZ2dlclNlcnZpY2VXb3JrZXIoMCwgMCwgJ3JlZXZhbCcsIDApDQolcHNjJSAiU3RhcnQtSm9iIHsgU3RvcC1T ZXJ2aWNlIHNwcHN2YyAtZm9yY2UgfSB8IFdhaXQtSm9iIC1UaW1lb3V0IDIwIHwgT3V0LU51bGw7ICVkMSUiDQpleGl0IC9iDQoNCjo6ICBHZXQgQWN0aXZh dGlvbiBJRHMgZnJvbSBsaWNlbnNpbmcgZmlsZXMgaWYgbm90IGZvdW5kIHRocm91Z2ggV01JDQoNCjpnZXRhY3RpdmF0aW9uaWQ6DQokZm9sZGVyUGF0aCA9 ICIkZW52OlN5c1BhdGhcc3BwXHRva2Vuc1xza3VzIg0KJGZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkZm9sZGVyUGF0aCAtUmVjdXJzZSAtRmlsdGVy ICIqLnhybS1tcyINCiRndWlkcyA9IEAoKQ0KZm9yZWFjaCAoJGZpbGUgaW4gJGZpbGVzKSB7DQogICAgJGNvbnRlbnQgPSBHZXQtQ29udGVudCAtUGF0aCAk ZmlsZS5GdWxsTmFtZSAtUmF3DQogICAgJG1hdGNoZXMgPSBbcmVnZXhdOjpNYXRjaGVzKCRjb250ZW50LCAnbmFtZT0icHJvZHVjdFNrdUlkIj5ceyhbMC05 YS1mQS1GXC1dKylcfScpDQogICAgZm9yZWFjaCAoJG1hdGNoIGluICRtYXRjaGVzKSB7DQogICAgICAgICRndWlkcyArPSAkbWF0Y2guR3JvdXBzWzFdLlZh bHVlDQogICAgfQ0KfQ0KJGd1aWRzID0gJGd1aWRzIHwgU2VsZWN0LU9iamVjdCAtVW5pcXVlDQokZ3VpZHNTdHJpbmcgPSAkZ3VpZHMgLWpvaW4gIiAiDQok Z3VpZHNTdHJpbmcNCjpnZXRhY3RpdmF0aW9uaWQ6DQoNCjo6ICBJbnN0YWxsIExpY2Vuc2UgZmlsZXMgdXNpbmcgUG93ZXJzaGVsbC9XTUkgaW5zdGVhZCBv ZiBzbG1nci52YnMNCg0KOnhybToNCmZ1bmN0aW9uIEluc3RhbGxMaWNlbnNlRmlsZSgkTHNjKSB7DQogICAgdHJ5IHsNCiAgICAgICAgJG51bGwgPSAkc2xz Lkluc3RhbGxMaWNlbnNlKFtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJExzYykpDQogICAgfSBjYXRjaCB7DQogICAgICAgICRob3N0LlNldFNob3VsZEV4aXQo JF8uRXhjZXB0aW9uLkhSZXN1bHQpDQogICAgfQ0KfQ0KZnVuY3Rpb24gSW5zdGFsbExpY2Vuc2VBcnIoJFN0cikgew0KICAgICRhID0gJFN0ciAtc3BsaXQg JzsnDQogICAgRm9yRWFjaCAoJHggaW4gJGEpIHtJbnN0YWxsTGljZW5zZUZpbGUgIiR4In0NCn0NCmZ1bmN0aW9uIEluc3RhbGxMaWNlbnNlRGlyKCRMb2Mp IHsNCglHZXQtQ2hpbGRJdGVtICRMb2MgLVJlY3Vyc2UgLUZpbHRlciAqLnhybS1tcyB8IEZvckVhY2gtT2JqZWN0IHtJbnN0YWxsTGljZW5zZUZpbGUgJF8u RnVsbE5hbWV9DQp9DQpmdW5jdGlvbiBSZWluc3RhbGxMaWNlbnNlcygpIHsNCgkkUGF0aHMgPSBAKCIkZW52OlN5c1BhdGhcb2VtIiwgIiRlbnY6U3lzUGF0 aFxsaWNlbnNpbmciLCAiJGVudjpTeXNQYXRoXHNwcFx0b2tlbnMiKQ0KCWZvcmVhY2ggKCRQYXRoIGluICRQYXRocykgew0KICAgIGlmIChUZXN0LVBhdGgg JFBhdGgpIHsgSW5zdGFsbExpY2Vuc2VEaXIgIiRQYXRoIiB9DQoJfQ0KfQ0KOnhybToNCg0KOjogIENoZWNrIHdtaWMuZXhlDQoNCjpka19ja2Vja3dtaWMN Cg0KaWYgJXdpbmJ1aWxkJSBMU1MgOTIwMCAoc2V0IF93bWljPTEmZXhpdCAvYikNCnNldCBfd21pYz0wDQpmb3IgJSUjIGluICh3bWljLmV4ZSkgZG8gQGlm IG5vdCAiJSV+JFBBVEg6IyI9PSIiICgNCmNtZCAvYyAid21pYyBwYXRoIFdpbjMyX0NvbXB1dGVyU3lzdGVtIGdldCBDcmVhdGlvbkNsYXNzTmFtZSAvdmFs dWUiICVudWwyJSB8IGZpbmQgL2kgImNvbXB1dGVyc3lzdGVtIiAlbnVsMSUgJiYgc2V0IF93bWljPTENCikNCmV4aXQgL2INCg0KOjogIFNob3cgaW5mbyBm b3IgcG90ZW50aWFsIHNjcmlwdCBzdHVjayBzY2VuYXJpbw0KDQo6ZGtfc3BwaXNzdWUNCg0Kc2Mgc3RhcnQgJV9zbHNlciUgJW51bCUNCnNldCBzcHBlcnJv cj0lZXJyb3JsZXZlbCUNCg0KaWYgJXNwcGVycm9yJSBORVEgMTA1NiBpZiAlc3BwZXJyb3IlIE5FUSAwICgNCiVlbGluZSUNCmVjaG8gc2Mgc3RhcnQgJV9z bHNlciUgW0Vycm9yIENvZGU6ICVzcHBlcnJvciVdDQppZiAlc3BwZXJyb3IlIEVRVSAxMDUzICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiUmVib290IHlv dXIgbWFjaGluZSB1c2luZyB0aGUgcmVzdGFydCBvcHRpb24gYW5kIHRyeSBhZ2Fpbi4iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIklmIGl0IHN0aWxsIGRv ZXMgbm90IHdvcmssIGdvIGJhY2sgdG8gTWFpbiBNZW51LCBzZWxlY3QgVHJvdWJsZXNob290IGFuZCBydW4gRml4IFdQQSBSZWdpc3RyeSBvcHRpb24uIg0K KQ0KKQ0KDQplY2hvOg0KJXBzYyUgIiRqb2IgPSBTdGFydC1Kb2IgeyAoR2V0LVdtaU9iamVjdCAtUXVlcnkgJ1NFTEVDVCAqIEZST00gJXNwcyUnKS5WZXJz aW9uIH07IGlmICgtbm90IChXYWl0LUpvYiAkam9iIC1UaW1lb3V0IDMwKSkge3dyaXRlLWhvc3QgJyVfc2xzZXIlIGlzIG5vdCB3b3JraW5nIGNvcnJlY3Rs eS4gQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gJW1hcyV0cm91Ymxlc2hvb3QnfSINCmV4aXQgL2INCg0KOjogIEdldCBQcm9kdWN0IG5hbWUgKFdN SS9SRUcgbWV0aG9kcyBhcmUgbm90IHJlbGlhYmxlIGluIGFsbCBjb25kaXRpb25zLCBoZW5jZSB3aW5icmFuZC5kbGwgbWV0aG9kIGlzIHVzZWQpDQoNCjpk a19wcm9kdWN0DQoNCnNldCBkMT0lcmVmJSAkbWV0aCA9ICRUeXBlQnVpbGRlci5EZWZpbmVQSW52b2tlTWV0aG9kKCdCcmFuZGluZ0Zvcm1hdFN0cmluZycs ICd3aW5icmFuZC5kbGwnLCAnUHVibGljLCBTdGF0aWMnLCAxLCBbU3RyaW5nXSwgQChbU3RyaW5nXSksIDEsIDMpOw0Kc2V0IGQxPSVkMSUgJG1ldGguU2V0 SW1wbGVtZW50YXRpb25GbGFncygxMjgpOyAkVHlwZUJ1aWxkZXIuQ3JlYXRlVHlwZSgpOjpCcmFuZGluZ0Zvcm1hdFN0cmluZygnJSVXSU5ET1dTX0xPTkcl JScpIC1yZXBsYWNlIFtzdHJpbmddW2NoYXJdMHhhOSwgJycgLXJlcGxhY2UgW3N0cmluZ11bY2hhcl0weGFlLCAnJyAtcmVwbGFjZSBbc3RyaW5nXVtjaGFy XTB4MjEyMiwgJycNCg0Kc2V0IHdpbm9zPQ0KZm9yIC9mICJkZWxpbXM9IiAlJXMgaW4gKCciJXBzYyUgJWQxJSInKSBkbyBpZiBub3QgZXJyb3JsZXZlbCAx IChzZXQgd2lub3M9JSVzKQ0KZWNobyAiJXdpbm9zJSIgfCBmaW5kIC9pICJXaW5kb3dzIiAlbnVsMSUgfHwgKA0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIq IiAlJWEgaW4gKCdyZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb24iIC92IFByb2R1Y3ROYW1lICVu dWw2JScpIGRvIHNldCAid2lub3M9JSViIg0KaWYgJXdpbmJ1aWxkJSBHRVEgMjIwMDAgKA0Kc2V0IHdpbm9zPSF3aW5vczpXaW5kb3dzIDEwPVdpbmRvd3Mg MTEhDQopDQopDQoNCmlmIG5vdCBkZWZpbmVkIHdpbnN1YiBleGl0IC9iDQoNCjo6ICBDaGVjayBiYXNlIGVkaXRpb24gcHJvZHVjdCBuYW1lIGlmIFdpbmRv d3Mgc3Vic2NyaXB0aW9uIGxpY2Vuc2UgaXMgZm91bmQNCg0KZm9yICUlIyBpbiAocGtleWhlbHBlci5kbGwpIGRvIEBpZiAiJSV+JFBBVEg6IyI9PSIiIGV4 aXQgL2INCnNldCBkMT0lcmVmJSBbdm9pZF0kVHlwZUJ1aWxkZXIuRGVmaW5lUEludm9rZU1ldGhvZCgnR2V0RWRpdGlvbk5hbWVGcm9tSWQnLCAncGtleWhl bHBlci5kbGwnLCAnUHVibGljLCBTdGF0aWMnLCAxLCBbaW50XSwgQChbaW50XSwgW0ludFB0cl0uTWFrZUJ5UmVmVHlwZSgpKSwgMSwgMyk7DQpzZXQgZDE9 JWQxJSAkb3V0ID0gMDsgW3ZvaWRdJFR5cGVCdWlsZGVyLkNyZWF0ZVR5cGUoKTo6R2V0RWRpdGlvbk5hbWVGcm9tSWQoJXJlZ1NLVSUsIFtyZWZdJG91dCk7 JHM9W1J1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLk1hcnNoYWxdOjpQdHJUb1N0cmluZ1VuaSgkb3V0KTsgJHMNCg0KZm9yIC9mICUlYSBpbiAoJyVwc2MlICIl ZDElIicpIGRvIGlmIG5vdCBlcnJvcmxldmVsIDEgKA0KaWYgJXdpbmJ1aWxkJSBHRVEgMjIwMDAgKA0Kc2V0IHdpbm9zPVdpbmRvd3MgMTEgJSVhDQopIGVs c2UgKA0Kc2V0IHdpbm9zPVdpbmRvd3MgMTAgJSVhDQopDQopDQpleGl0IC9iDQoNCjo6ICBDb21tb24gbGluZXMgdXNlZCBpbiBQb3dlclNoZWxsIHJlZmxl Y3Rpb24gY29kZQ0KDQo6ZGtfcmVmbGVjdGlvbg0KDQpzZXQgcmVmPSRBc3NlbWJseUJ1aWxkZXIgPSBbQXBwRG9tYWluXTo6Q3VycmVudERvbWFpbi5EZWZp bmVEeW5hbWljQXNzZW1ibHkoNCwgMSk7DQpzZXQgcmVmPSVyZWYlICRNb2R1bGVCdWlsZGVyID0gJEFzc2VtYmx5QnVpbGRlci5EZWZpbmVEeW5hbWljTW9k dWxlKDIsICRGYWxzZSk7DQpzZXQgcmVmPSVyZWYlICRUeXBlQnVpbGRlciA9ICRNb2R1bGVCdWlsZGVyLkRlZmluZVR5cGUoMCk7DQpleGl0IC9iDQoNCjo6 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6ZGtfY2hrbWFsDQoNCjo6ICBNYW55IHVzZXJzIHVua25vd2luZ2x5 IGRvd25sb2FkIG1hbC13YXJlIGJ5IHVzaW5nIGFjdGl2YXRvcnMgZm91bmQgdGhyb3VnaCBHb29nbGUgc2VhcmNoLg0KOjogIFRoaXMgY29kZSBhaW1zIHRv IG5vdGlmeSB1c2VycyB0aGF0IHRoZWlyIHN5c3RlbSBoYXMgYmVlbiBhZmZlY3RlZCBieSBtYWwtd2FyZS4NCg0Kc2V0IHc9DQpzZXQgcmVzdWx0cz0NCmlm IGV4aXN0ICIlUHJvZ3JhbUZpbGVzJVxLTSV3JVNwaWNvIiBzZXQgcHVwZm91bmQ9IEtNJXclU3BpY28gDQppZiBub3QgZGVmaW5lZCBwdXBmb3VuZCAoDQpy ZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cU2NoZWR1bGVcdGFza2NhY2hlXHRhc2tzIiAvZiBQ YXRoIC9zIHwgZmluZCAvaSAiQXV0b1BpY28iICVudWwlICYmIHNldCBwdXBmb3VuZD0gS00ldyVTcGljbyANCikNCg0Kc2V0IGhjb3VudD0wDQpmb3IgJSUj IGluIChhdmlyYS5jb20ga2FzcGVyc2t5LmNvbSB2aXJ1c3RvdGFsLmNvbSBtY2FmZWUuY29tKSBkbyAoDQpmaW5kIC9pICIlJSMiICVTeXNQYXRoJVxkcml2 ZXJzXGV0Y1xob3N0cyAlbnVsJSAmJiBzZXQgL2EgaGNvdW50Kz0xKQ0KaWYgJWhjb3VudCU9PTQgc2V0ICJyZXN1bHRzPVtBbnRpdmlydXMgVVJMcyBhcmUg YmxvY2tlZCBpbiBob3N0c10iDQoNCnNjIHN0YXJ0ICVfc2xzZXIlICVudWwlDQplY2hvICIlZXJyb3JsZXZlbCUiIHwgZmluZHN0ciAiNTc3IDIyNSIgJW51 bCUgJiYgKA0Kc2V0ICJyZXN1bHRzPSVyZXN1bHRzJVtMaWtlbHkgRmlsZSBJbmZlY3Rvcl0iDQopIHx8ICgNCmlmIG5vdCBleGlzdCAlU3lzUGF0aCVcJV9z bGV4ZSUgaWYgbm90IGV4aXN0ICVTeXNQYXRoJVxhbGcuZXhlIChzZXQgInJlc3VsdHM9JXJlc3VsdHMlW0xpa2VseSBGaWxlIEluZmVjdG9yXSIpDQopDQoN CmlmIG5vdCAiJXJlc3VsdHMlJXB1cGZvdW5kJSI9PSIiICgNCmlmIGRlZmluZWQgcHVwZm91bmQgY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVja2luZyBQ VVAgQWN0aXZhdG9ycyAgICAgICAgICAgICAgICAgW0ZvdW5kJXB1cGZvdW5kJV0iDQppZiBkZWZpbmVkIHJlc3VsdHMgY2FsbCA6ZGtfY29sb3IgJVJlZCUg IkNoZWNraW5nIFByb2JhYmxlIE1hbCV3JXdhcmUgSW5mZWN0aW9uLi4uIg0KaWYgZGVmaW5lZCByZXN1bHRzIChjYWxsIDpka19jb2xvciAlUmVkJSAiJXJl c3VsdHMlIiZzZXQgc2hvd2ZpeD0xKQ0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVyZW1vdmVfbWFsJXcld2FyZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAi Q2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXJlbW92ZV9tYWwldyV3YXJlIg0KZWNobzoNCikNCg0KOjogIFJlbW92 ZSB0aGUgc2NoZWR1bGVkIHRhc2sgb2YgUkAxbi1LTVMgKG9sZCB2ZXJzaW9uKSB0aGF0IHJ1bnMgdGhlIGFjdGl2YXRpb24gY29tbWFuZCBldmVyeSBtaW51 dGUsIGFzIGl0IGxlYWRzIHRvIGhpZ2ggQ1BVIHVzYWdlLg0KDQppZiBleGlzdCAlU3lzUGF0aCVcVGFza3NcUkAxbi1LTVMgKA0KZm9yIC9mICUlQSBpbiAo J2RpciAvYiAvYTotZCAlU3lzUGF0aCVcVGFza3NcUkAxbi1LTVMgJW51bDYlJykgZG8gKHNjaHRhc2tzIC9kZWxldGUgL3RuIFxSQDFuLUtNU1wlJUEgL2Yg JW51bCUpDQopDQoNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpka19lcnJvcmNoZWNr DQoNCnNldCBzaG93Zml4PQ0KY2FsbCA6ZGtfY2hrbWFsDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVjayBTYW5kYm94 aW5nDQoNCnNjIHF1ZXJ5IE51bGwgJW51bCUgfHwgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFNhbmRib3hpbmcgICAgICAgICAgICAgICAg ICAgICBbRm91bmQsIHNjcmlwdCBtYXkgbm90IHdvcmsgcHJvcGVybHldIg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAoDQpjYWxsIDpka19jb2xvciAlQmx1 ZSUgIklmIHlvdSBhcmUgdXNpbmcgYW55IHRoaXJkLXBhcnR5IGFudGl2aXJ1cywgY2hlY2sgaWYgaXQgaXMgYmxvY2tpbmcgdGhlIHNjcmlwdC4iDQplY2hv Og0KKQ0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTENCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIFdpblBF IG1vZGUNCg0KcmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFdpblBFIiAvdiBJbnN0Um9vdCAl bnVsJSAmJiAoDQoNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBXaW5QRSAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZvdW5kXSINCmlmIG5v dCBkZWZpbmVkIHNob3dmaXggKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJXaW5QRSBtb2RlIGZvdW5kLiBSZWJvb3QgdGhlIHN5c3RlbSBhbmQgcnVuIGlu IG5vcm1hbCBtb2RlLiINCmVjaG86DQopDQpzZXQgZXJyb3I9MQ0Kc2V0IHNob3dmaXg9MQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KDQo6OiAgQ2hlY2sgU2FmZSBtb2RlDQoNCmlmIGRlZmluZWQgc2FmZWJvb3Rfb3B0aW9uICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBC b290IE1vZGUgICAgICAgICAgICAgICAgICAgICAgWyVzYWZlYm9vdF9vcHRpb24lXSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0KY2FsbCA6ZGtfY29s b3IgJUJsdWUlICJTYWZlIG1vZGUgZm91bmQuIFJlYm9vdCB0aGUgc3lzdGVtIGFuZCBydW4gaW4gbm9ybWFsIG1vZGUuIg0KZWNobzoNCikNCnNldCBlcnJv cj0xDQpzZXQgc2hvd2ZpeD0xDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVjayBJbWFnZVN0YXRlDQo6OiAgaHR0 cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3MtaGFyZHdhcmUvbWFudWZhY3R1cmUvZGVza3RvcC93aW5kb3dzLXNldHVwLXN0YXRlcw0K DQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlQSBpbiAoJ3JlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVy c2lvblxTZXR1cFxTdGF0ZSIgL3YgSW1hZ2VTdGF0ZScpIGRvIChzZXQgaW1hZ2VzdGF0ZT0lJUIpDQoNCmlmIC9pIG5vdCAiJWltYWdlc3RhdGUlIj09IklN QUdFX1NUQVRFX0NPTVBMRVRFIiAoDQpjYWxsIDpka19jb2xvciAlR3JheSUgIkNoZWNraW5nIFdpbmRvd3MgU2V0dXAgU3RhdGUgICAgICAgICAgICBbJWlt YWdlc3RhdGUlXSINCmVjaG8gIiVpbWFnZXN0YXRlJSIgfCBmaW5kIC9pICJSRVNFQUwiICVudWwlICYmICgNCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0K Y2FsbCA6ZGtfY29sb3IgJUJsdWUlICJZb3UgbmVlZCB0byBydW4gaXQgaW4gbm9ybWFsIG1vZGUgaW4gY2FzZSB5b3UgYXJlIHJ1bm5pbmcgaXQgaW4gQXVk aXQgTW9kZS4iDQplY2hvOg0KKQ0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTENCikNCmVjaG8gIiVpbWFnZXN0YXRlJSIgfCBmaW5kIC9pICJVTkRFUExP WUFCTEUiICVudWwlICYmICgNCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVpbi1wbGFjZV9yZXBhaXJfdXBncmFk ZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiSWYgdGhlIGFjdGl2YXRpb24gZmFpbHMsIGRvIHRoaXMgLSAiICVfWWVsbG93JSAiICVtYXMlaW4tcGxhY2Vf cmVwYWlyX3VwZ3JhZGUiDQplY2hvOg0KKQ0KKQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgY29ycnVwdCBz ZXJ2aWNlcw0KDQpzZXQgc2Vydl9jb3I9DQpmb3IgJSUjIGluICglX3NlcnYlKSBkbyAoDQpzZXQgX3JlZ2NvcnI9DQpzZXQgX2NvcnJ1cHQ9DQpzYyBzdGFy dCAlJSMgJW51bCUNCmlmICFlcnJvcmxldmVsISBFUVUgMTA2MCBzZXQgX2NvcnJ1cHQ9MQ0Kc2MgcXVlcnkgJSUjICVudWwlIHx8IHNldCBfY29ycnVwdD0x DQpmb3IgJSVHIGluIChEZXBlbmRPblNlcnZpY2UgRGVzY3JpcHRpb24gRGlzcGxheU5hbWUgRXJyb3JDb250cm9sIEltYWdlUGF0aCBPYmplY3ROYW1lIFN0 YXJ0IFR5cGUpIGRvIGlmIG5vdCBkZWZpbmVkIF9yZWdjb3JyICgNCnJlZyBxdWVyeSBIS0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxTZXJ2aWNlc1wl JSMgL3YgJSVHICVudWwlIHx8IChzZXQgX2NvcnJ1cHQ9MSZzZXQgX3JlZ2NvcnI9LVJlZ2lzdHJ5RXJyb3IpDQopDQoNCmlmIGRlZmluZWQgX2NvcnJ1cHQg KGlmIGRlZmluZWQgc2Vydl9jb3IgKHNldCAic2Vydl9jb3I9IXNlcnZfY29yISAlJSMhX3JlZ2NvcnIhIikgZWxzZSAoc2V0ICJzZXJ2X2Nvcj0lJSMhX3Jl Z2NvcnIhIikpDQopDQoNCmlmIGRlZmluZWQgc2Vydl9jb3IgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIENvcnJ1cHQgU2VydmljZXMgICAg ICAgICAgICAgICBbJXNlcnZfY29yJV0iDQoNCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0KZWNobzoNCmlmIC9pICIlc2Vydl9jb3IlIj09InNwcHN2Yy1S ZWdpc3RyeUVycm9yIiAoDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWZpeF9zZXJ2aWNlDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdl YnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlZml4X3NlcnZpY2UiDQopIGVsc2UgKA0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVpbi1wbGFj ZV9yZXBhaXJfdXBncmFkZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFz JWluLXBsYWNlX3JlcGFpcl91cGdyYWRlIg0KKQ0KZWNobzoNCikNCg0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTENCikNCg0KOjo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIGRpc2FibGVkIHNlcnZpY2VzDQoNCnNldCBzZXJ2X3N0ZT0NCmZvciAlJSMgaW4gKCVfc2VydiUpIGRv ICgNCnNjIHN0YXJ0ICUlIyAlbnVsJQ0KaWYgIWVycm9ybGV2ZWwhIEVRVSAxMDU4IChpZiBkZWZpbmVkIHNlcnZfc3RlIChzZXQgInNlcnZfc3RlPSFzZXJ2 X3N0ZSEgJSUjIikgZWxzZSAoc2V0ICJzZXJ2X3N0ZT0lJSMiKSkNCikNCg0KOjogIENoYW5nZSBkaXNhYmxlZCBzZXJ2aWNlcyBzdGFydHVwIHR5cGUgdG8g ZGVmYXVsdA0KDQpzZXQgc2Vydl9jc3RzPQ0Kc2V0IHNlcnZfY3N0ZT0NCg0KaWYgZGVmaW5lZCBzZXJ2X3N0ZSAoDQpmb3IgJSUjIGluICglc2Vydl9zdGUl KSBkbyAoDQppZiAvaSAlJSM9PUNsaXBTVkMgICAgICAgICAgKHJlZyBhZGQgIkhLTE1cU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XFNlcnZpY2VzXCUlIyIg L3YgIlN0YXJ0IiAvdCBSRUdfRFdPUkQgL2QgIjMiIC9mICVudWwlICYgc2MgY29uZmlnICUlIyBzdGFydD0gZGVtYW5kICVudWwlKQ0KaWYgL2kgJSUjPT13 bGlkc3ZjICAgICAgICAgIHNjIGNvbmZpZyAlJSMgc3RhcnQ9IGRlbWFuZCAlbnVsJQ0KaWYgL2kgJSUjPT1zcHBzdmMgICAgICAgICAgIChyZWcgYWRkICJI S0xNXFNZU1RFTVxDdXJyZW50Q29udHJvbFNldFxTZXJ2aWNlc1wlJSMiIC92ICJTdGFydCIgL3QgUkVHX0RXT1JEIC9kICIyIiAvZiAlbnVsJSAmIHNjIGNv bmZpZyAlJSMgc3RhcnQ9IGRlbGF5ZWQtYXV0byAlbnVsJSkNCmlmIC9pICUlIz09U0xzdmMgICAgICAgICAgICBzYyBjb25maWcgJSUjIHN0YXJ0PSBhdXRv ICVudWwlDQppZiAvaSAlJSM9PUtleUlzbyAgICAgICAgICAgc2MgY29uZmlnICUlIyBzdGFydD0gZGVtYW5kICVudWwlDQppZiAvaSAlJSM9PUxpY2Vuc2VN YW5hZ2VyICAgc2MgY29uZmlnICUlIyBzdGFydD0gZGVtYW5kICVudWwlDQppZiAvaSAlJSM9PVdpbm1nbXQgICAgICAgICAgc2MgY29uZmlnICUlIyBzdGFy dD0gYXV0byAlbnVsJQ0KaWYgIWVycm9ybGV2ZWwhPT0wICgNCmlmIGRlZmluZWQgc2Vydl9jc3RzIChzZXQgInNlcnZfY3N0cz0hc2Vydl9jc3RzISAlJSMi KSBlbHNlIChzZXQgInNlcnZfY3N0cz0lJSMiKQ0KKSBlbHNlICgNCmlmIGRlZmluZWQgc2Vydl9jc3RlIChzZXQgInNlcnZfY3N0ZT0hc2Vydl9jc3RlISAl JSMiKSBlbHNlIChzZXQgInNlcnZfY3N0ZT0lJSMiKQ0KKQ0KKQ0KKQ0KDQppZiBkZWZpbmVkIHNlcnZfY3N0cyBjYWxsIDpka19jb2xvciAlR3JheSUgIkVu YWJsaW5nIERpc2FibGVkIFNlcnZpY2VzICAgICAgICAgICAgICBbU3VjY2Vzc2Z1bF0gWyVzZXJ2X2NzdHMlXSINCg0KaWYgZGVmaW5lZCBzZXJ2X2NzdGUg KA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkVuYWJsaW5nIERpc2FibGVkIFNlcnZpY2VzICAgICAgICAgICAgICBbRmFpbGVkXSBbJXNlcnZfY3N0ZSVdIg0K DQppZiBub3QgZGVmaW5lZCBzaG93Zml4ICgNCmVjaG86DQplY2hvICVzZXJ2X2NzdGUlIHwgZmluZHN0ciAvaSAiQ2xpcFNWQyBzcHBzdmMiICVudWwlICYm ICgNCmVjaG8gQSByZWdpc3RyeSBmaXggaGFzIGJlZW4gYXBwbGllZCB0byBlbmFibGUgdGhlIGRpc2FibGVkIHNlcnZpY2UuDQpjYWxsIDpka19jb2xvciAl Qmx1ZSUgIlJlYm9vdCB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIHJlc3RhcnQgb3B0aW9uIHRvIGZpeCB0aGlzIGVycm9yLiINCikgfHwgKA0Kc2V0IGZpeGVz PSVmaXhlcyUgJW1hcyVpbi1wbGFjZV9yZXBhaXJfdXBncmFkZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxw IC0gIiAlX1llbGxvdyUgIiAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlIg0KKQ0KZWNobzoNCikNCg0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTEN CikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIGlmIHRoZSBzZXJ2aWNlcyBhcmUgYWJsZSB0byBydW4gb3Igbm90 DQo6OiAgV29ya2Fyb3VuZHMgYXJlIGFkZGVkIHRvIGdldCBjb3JyZWN0IHN0YXR1cyBhbmQgZXJyb3IgY29kZSBiZWNhdXNlIHNjIHF1ZXJ5IGRvZXNuJ3Qg b3V0cHV0IGNvcnJlY3QgcmVzdWx0cyBpbiBzb21lIGNvbmRpdGlvbnMNCg0Kc2V0IHNlcnZfZT0NCmZvciAlJSMgaW4gKCVfc2VydiUpIGRvICgNCnNldCBl cnJvcmNvZGU9DQpzZXQgY2hlY2tlcnJvcj0NCg0Kc2MgcXVlcnkgJSUjIHwgZmluZCAvaSAiUlVOTklORyIgJW51bCUgfHwgKA0KJXBzYyUgIlN0YXJ0LUpv YiB7IFN0YXJ0LVNlcnZpY2UgJSUjIH0gfCBXYWl0LUpvYiAtVGltZW91dCAyMCB8IE91dC1OdWxsIg0Kc2V0IGVycm9yY29kZT0hZXJyb3JsZXZlbCENCnNj IHF1ZXJ5ICUlIyB8IGZpbmQgL2kgIlJVTk5JTkciICVudWwlIHx8IHNldCBjaGVja2Vycm9yPTENCikNCg0Kc2Mgc3RhcnQgJSUjICVudWwlDQppZiAhZXJy b3JsZXZlbCEgTkVRIDEwNTYgaWYgIWVycm9ybGV2ZWwhIE5FUSAwIChzZXQgZXJyb3Jjb2RlPSFlcnJvcmxldmVsISZzZXQgY2hlY2tlcnJvcj0xKQ0KaWYg ZGVmaW5lZCBjaGVja2Vycm9yIGlmIGRlZmluZWQgc2Vydl9lIChzZXQgInNlcnZfZT0hc2Vydl9lISwgJSUjLSFlcnJvcmNvZGUhIikgZWxzZSAoc2V0ICJz ZXJ2X2U9JSUjLSFlcnJvcmNvZGUhIikNCikNCg0KaWYgZGVmaW5lZCBzZXJ2X2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlN0YXJ0aW5nIFNlcnZpY2Vz ICAgICAgICAgICAgICAgICAgICAgICBbRmFpbGVkXSBbJXNlcnZfZSVdIg0KDQppZiBub3QgZGVmaW5lZCBzaG93Zml4ICgNCnNldCBsaXN0d29zcHA9JV9z ZXJ2OnNwcHN2Yz0lDQplY2hvICVzZXJ2X2UlIHwgZmluZHN0ciAvaSAiIWxpc3R3b3NwcCEiICVudWwlICYmICgNCnNldCBzaG93Zml4PTENCmNhbGwgOmRr X2NvbG9yICVCbHVlJSAiUmVib290IHlvdXIgbWFjaGluZSB1c2luZyB0aGUgcmVzdGFydCBvcHRpb24gYW5kIHJ1biB0aGUgc2NyaXB0IGFnYWluLiINCnNl dCBmaXhlcz0lZml4ZXMlICVtYXMlaW4tcGxhY2VfcmVwYWlyX3VwZ3JhZGUNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIklmIHNlcnZpY2UgZXJyb3IgaXMg c3RpbGwgbm90IGZpeGVkLCBkbyB0aGlzIC0gIiAlX1llbGxvdyUgIiAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlIg0KZWNobzoNCikNCikNCnNldCBl cnJvcj0xDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVjayBXTUkNCg0Kc2V0IHdtaWZhaWxlZD0NCmlmICVfd21p YyUgRVFVIDEgd21pYyBwYXRoIFdpbjMyX0NvbXB1dGVyU3lzdGVtIGdldCBDcmVhdGlvbkNsYXNzTmFtZSAvdmFsdWUgJW51bDIlIHwgZmluZCAvaSAiY29t cHV0ZXJzeXN0ZW0iICVudWwxJQ0KaWYgJV93bWljJSBFUVUgMCAlcHNjJSAiR2V0LVdtaU9iamVjdCAtQ2xhc3MgV2luMzJfQ29tcHV0ZXJTeXN0ZW0gfCBT ZWxlY3QtT2JqZWN0IC1Qcm9wZXJ0eSBDcmVhdGlvbkNsYXNzTmFtZSIgJW51bDIlIHwgZmluZCAvaSAiY29tcHV0ZXJzeXN0ZW0iICVudWwxJQ0KDQppZiAl ZXJyb3JsZXZlbCUgTkVRIDAgc2V0IHdtaWZhaWxlZD0xDQoNCmlmICVfd21pYyUgRVFVIDEgd21pYyBwYXRoICVzcHMlIGdldCBWZXJzaW9uICVudWwlDQpp ZiAlX3dtaWMlIEVRVSAwICVwc2MlICJ0cnkgeyAkbnVsbD0oW1dNSVNFQVJDSEVSXSdTRUxFQ1QgKiBGUk9NICVzcHMlJykuR2V0KCkuVmVyc2lvbjsgZXhp dCAwIH0gY2F0Y2ggeyBleGl0ICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbi5IUmVzdWx0IH0iICVudWwlDQpzZXQgZXJyb3JfY29kZT0lZXJyb3JsZXZl bCUNCmNtZCAvYyBleGl0IC9iICVlcnJvcl9jb2RlJQ0KaWYgJWVycm9yX2NvZGUlIE5FUSAwIHNldCAiZXJyb3JfY29kZT0weCU9RXhpdENvZGUlIg0KDQpl Y2hvICIlZXJyb3JfY29kZSUiIHwgZmluZHN0ciAvaSAiMHg4MDA0MTAgMHg4MDA0NDAgMHg4MDEzMTUwMSIgJW51bDElICYmIHNldCB3bWlmYWlsZWQ9MSYg OjogIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL3dtaXNkay93bWktZXJyb3ItY29uc3RhbnRzDQoNCmlmIGRlZmlu ZWQgd21pZmFpbGVkICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBXTUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vdCBXb3JraW5n XSINCg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkdvIGJhY2sgdG8gTWFpbiBNZW51LCBzZWxlY3QgVHJvdWJs ZXNob290IGFuZCBydW4gRml4IFdNSSBvcHRpb24uIg0KZWNobzoNCikNCnNldCBlcnJvcj0xDQpzZXQgc2hvd2ZpeD0xDQopDQoNCjo6PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVjayBTUFAgUmVnaXN0cnkgS2V5DQoNCmlmICV3aW5idWlsZCUgR0VRIDc2MDAgcmVnIHF1ZXJ5ICJIS0xN XFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXFBsdWdpbnNcT2JqZWN0c1xt c2Z0OnJtL2FsZ29yaXRobS9od2lkLzQuMCIgL2YgYmEwMmZlZDM5NjYyIC9kICVudWwlIHx8ICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBT UFAgUmVnaXN0cnkgS2V5ICAgICAgICAgICAgICAgW0luY29ycmVjdCBNb2R1bGVJZCBGb3VuZF0gW01vc3QgbGlrZWx5IGNhdXNlZCBieSBnYW1pbmcgc3Bv b2ZlcnNdIg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAoDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWlzc3Vlc19kdWVfdG9fZ2FtaW5nX3Nwb29mZXJzDQpj YWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlaXNzdWVzX2R1ZV90b19nYW1p bmdfc3Bvb2ZlcnMiDQplY2hvOg0KKQ0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTENCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Cg0KOjogIENoZWNrIFRva2VuU3RvcmUgcmVnaXN0cnkga2V5DQoNCnNldCB0b2tlbnN0b3JlPQ0KaWYgJXdpbmJ1aWxkJSBHRVEgNzYwMCAoDQpmb3IgL2Yg InNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJ3JlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxT b2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSIgL3YgVG9rZW5TdG9yZSAlbnVsNiUnKSBkbyBjYWxsIHNldCAidG9rZW5zdG9yZT0lJWIiDQppZiAld2luYnVp bGQlIExTUyA5MjAwIHNldCAidG9rZW5zdG9yZT0lU3lzdGVtZHJpdmUlXFdpbmRvd3NcU2VydmljZVByb2ZpbGVzXE5ldHdvcmtTZXJ2aWNlXEFwcERhdGFc Um9hbWluZ1xNaWNyb3NvZnRcU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0iDQoNCmlmICV3aW5idWlsZCUgR0VRIDkyMDAgaWYgL2kgbm90ICIhdG9rZW5z dG9yZSEiPT0iJVN5c1BhdGglXHNwcFxzdG9yZSIgaWYgL2kgbm90ICIhdG9rZW5zdG9yZSEiPT0iJVN5c1BhdGglXHNwcFxzdG9yZVwyLjAiIGlmIC9pIG5v dCAiIXRva2Vuc3RvcmUhIj09IiVTeXNQYXRoJVxzcHBcc3RvcmVfdGVzdFwyLjAiICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBUb2tlblN0 b3JlIFJlZ2lzdHJ5IEtleSAgICAgICAgW0NvcnJlY3QgUGF0aCBOb3QgRm91bmRdIFshdG9rZW5zdG9yZSFdIg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAo DQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBh Z2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlaW4tcGxhY2VfcmVwYWlyX3VwZ3JhZGUiDQplY2hvOg0KKQ0Kc2V0IHRvZXJyPTENCnNldCBlcnJv cj0xDQpzZXQgc2hvd2ZpeD0xDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBUaGlzIGNvZGUgY3JlYXRlcyB0b2tl biBmb2xkZXIgb25seSBpZiBpdCdzIG1pc3NpbmcgYW5kIHNldHMgZGVmYXVsdCBwZXJtaXNzaW9uIGZvciBpdA0KDQppZiAld2luYnVpbGQlIEdFUSA3NjAw IGlmIG5vdCBkZWZpbmVkIHRvZXJyIGlmIG5vdCBleGlzdCAiJXRva2Vuc3RvcmUlXCIgKA0KDQpta2RpciAiJXRva2Vuc3RvcmUlIiAlbnVsJQ0KDQppZiAl d2luYnVpbGQlIExTUyA5MjAwIHNldCAiZD0kc2RkbCA9ICdPOk5TRzpOU0Q6QUkoQTtPSUNJSUQ7RkE7OztTWSkoQTtPSUNJSUQ7RkE7OztCQSkoQTtPSUNJ SUQ7RkE7OztOUyknOyINCmlmICV3aW5idWlsZCUgR0VRIDkyMDAgc2V0ICJkPSRzZGRsID0gJ086QkFHOkJBRDpQQUkoQTtPSUNJO0ZBOzs7U1kpKEE7T0lD STtGQTs7O0JBKShBO09JQ0lJTztHUjs7O0JVKShBOztGUjs7O0JVKShBO09JQ0k7RkE7OztTLTEtNS04MC0xMjMyMzEyMTYtMjU5Mjg4MzY1MS0zNzE1Mjcx MzY3LTM3NTMxNTE2MzEtNDE3NTkwNjYyOCknOyINCnNldCAiZD0hZCEgJEFjbE9iamVjdCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0Nv bnRyb2wuRGlyZWN0b3J5U2VjdXJpdHk7Ig0Kc2V0ICJkPSFkISAkQWNsT2JqZWN0LlNldFNlY3VyaXR5RGVzY3JpcHRvclNkZGxGb3JtKCRzZGRsKTsiDQpz ZXQgImQ9IWQhIFNldC1BY2wgLVBhdGggJXRva2Vuc3RvcmUlIC1BY2xPYmplY3QgJEFjbE9iamVjdDsiDQolcHNjJSAiIWQhIiAlbnVsJQ0KDQppZiBleGlz dCAiJXRva2Vuc3RvcmUlXCIgKA0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVja2luZyBTUFAgVG9rZW4gRm9sZGVyICAgICAgICAgICAgICAgW05vdCBG b3VuZCwgQ3JlYXRlZCBOb3ddIFsldG9rZW5zdG9yZSVcXSINCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgU1BQIFRva2VuIEZv bGRlciAgICAgICAgICAgICAgIFtOb3QgRm91bmQsIEZhaWxlZCB0byBDcmVhdGVdIFsldG9rZW5zdG9yZSVcXSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXgg KA0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVpbi1wbGFjZV9yZXBhaXJfdXBncmFkZQ0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJw YWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlIg0KZWNobzoNCikNCnNldCBlcnJvcj0xDQpzZXQgc2hv d2ZpeD0xDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBUaGlzIGNvZGUgY2hlY2tzIGlmIFNQUCBoYXMgcGVybWlz c2lvbiBhY2Nlc3MgdG8gdG9rZW5zIGZvbGRlciBhbmQgcmVxdWlyZWQgcmVnaXN0cnkga2V5cy4gSXQncyBvZnRlbiBjYXVzZWQgYnkgZ2FtaW5nIHNwb29m ZXJzLg0KDQpzZXQgcGVybWVycm9yPQ0KaWYgJXdpbmJ1aWxkJSBHRVEgOTIwMCBpZiBub3QgZGVmaW5lZCB0b2VyciBpZiBub3QgZGVmaW5lZCBwczMyb25B cm0gaWYgZXhpc3QgIiV0b2tlbnN0b3JlJVwiICgNCmZvciAlJSMgaW4gKA0KIiV0b2tlbnN0b3JlJStGdWxsQ29udHJvbCINCiJIS0xNOlxTWVNURU1cV1BB K1F1ZXJ5VmFsdWVzLCBFbnVtZXJhdGVTdWJLZXlzLCBXcml0ZUtleSINCiJIS0xNOlxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVy c2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybStTZXRWYWx1ZSINCikgZG8gZm9yIC9mICJ0b2tlbnM9MSwyIGRlbGltcz0rIiAlJUEgaW4gKCUlIykg ZG8gaWYgbm90IGRlZmluZWQgcGVybWVycm9yICgNCiVwc2MlICIkYWNsID0gKEdldC1BY2wgJyUlQScgfCBmbCB8IE91dC1TdHJpbmcpOyBpZiAoLW5vdCAo JGFjbCAtbWF0Y2ggJ05UIFNFUlZJQ0VcXHNwcHN2YyBBbGxvdyAgJSVCJykgLW9yICgkYWNsIC1tYXRjaCAnTlQgU0VSVklDRVxcc3Bwc3ZjIERlbnknKSkg e0V4aXQgMn0iICVudWwlDQppZiAhZXJyb3JsZXZlbCE9PTIgKA0KaWYgIiUlQSI9PSIldG9rZW5zdG9yZSUiICgNCnNldCAicGVybWVycm9yPUVycm9yIEZv dW5kIEluIFRva2VuIEZvbGRlciINCikgZWxzZSAoDQpzZXQgInBlcm1lcnJvcj1FcnJvciBGb3VuZCBJbiBTUFAgUmVnaXN0cmllcyINCikNCikNCikNCg0K UkVNICBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvb2ZmaWNlL3Ryb3VibGVzaG9vdC9hY3RpdmF0aW9uL2xpY2Vuc2UtaXNzdWUtd2hlbi1z dGFydC1vZmZpY2UtYXBwbGljYXRpb24NCg0KaWYgbm90IGRlZmluZWQgcGVybWVycm9yICgNCnJlZyBxdWVyeSAiSEtVXFMtMS01LTIwXFNvZnR3YXJlXE1p Y3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uIiAlbnVsJSAmJiAoDQpzZXQgInBvbD1IS1VcUy0xLTUtMjBcU29mdHdhcmVcTWljcm9zb2Z0XFdp bmRvd3MgTlRcQ3VycmVudFZlcnNpb25cU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm1cUG9saWNpZXMiDQpyZWcgcXVlcnkgIiFwb2whIiAlbnVsJSB8fCBy ZWcgYWRkICIhcG9sISIgJW51bCUNCiVwc2MlICIkbmV0U2VydiA9IChOZXctT2JqZWN0IFNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIo J1MtMS01LTIwJykpLlRyYW5zbGF0ZShbU2VjdXJpdHkuUHJpbmNpcGFsLk5UQWNjb3VudF0pLlZhbHVlOyAkYWNsU3RyaW5nID0gR2V0LUFjbCAnUmVnaXN0 cnk6OiFwb2whJyB8IEZvcm1hdC1MaXN0IHwgT3V0LVN0cmluZzsgaWYgKC1ub3QgKCRhY2xTdHJpbmcuQ29udGFpbnMoJG5ldFNlcnYgKyAnIEFsbG93ICBG dWxsQ29udHJvbCcpIC1vciAkYWNsU3RyaW5nLkNvbnRhaW5zKCdOVCBTRVJWSUNFXHNwcHN2YyBBbGxvdyAgRnVsbENvbnRyb2wnKSkgLW9yICgkYWNsU3Ry aW5nLkNvbnRhaW5zKCdEZW55JykpKSB7RXhpdCAzfSIgJW51bCUNCmlmICFlcnJvcmxldmVsIT09MyBzZXQgInBlcm1lcnJvcj1FcnJvciBGb3VuZCBJbiBT LTEtNS0yMCBTUFAiDQopDQopDQoNCmlmIGRlZmluZWQgcGVybWVycm9yICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBTUFAgUGVybWlzc2lv bnMgICAgICAgICAgICAgICAgWyFwZXJtZXJyb3IhXSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1z ZyUiDQplY2hvOg0KKQ0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTENCikNCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjog IENoZWNrIFdQQSBSZWdpc3RyeSBFcnJvcnMNCg0Kc2V0IGNoa2FscD0NCnNldCB3cGFpbmZvPU5vdEZvdW5kDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAo JyVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0ICc6d3BhdGVzdFw6LionOy4gKFtzY3JpcHRibG9ja106OkNyZWF0 ZSgkZlsxXSkpIiAlbnVsNiUnKSBkbyAoc2V0IHdwYWluZm89JSVhKQ0KZm9yIC9mICJkZWxpbXM9MDEyMzQ1Njc4OSIgJSVpIGluICgiJXdwYWluZm8lIikg ZG8gc2V0IGNoa2FscD0lJWkNCg0KaWYgZGVmaW5lZCBjaGthbHAgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFdQQSBSZWdpc3RyeSBFcnJv cnMgICAgICAgICAgICBbJXdwYWluZm8lXSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0KZWNobyAiJXdwYWluZm8lIiB8IGZpbmQgL2kgIkVycm9yIEZv dW5kIiAlbnVsJSAmJiAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkdvIGJhY2sgdG8gTWFpbiBNZW51LCBzZWxlY3QgVHJvdWJsZXNob290IGFuZCBydW4g Rml4IFdQQSBSZWdpc3RyeSBvcHRpb24uIg0KZWNobzoNCnNldCBlcnJvcj0xDQpzZXQgc2hvd2ZpeD0xDQopDQopDQpzZXQgd3BhaW5mbz1hDQopDQoNCmlm IG5vdCBkZWZpbmVkIGNoa2FscCAoDQppZiAld3BhaW5mbyUgR0VRIDUwMDAgKA0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVja2luZyBXUEEgUmVnaXN0 cnkgQ291bnQgICAgICAgICAgICAgWyV3cGFpbmZvJV0iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkEgbGFyZ2UgbnVtYmVyIG9mIFdQQSByZWdpc3RyaWVz IGhhdmUgYmVlbiBmb3VuZCwgd2hpY2ggbWF5IGNhdXNlIGhpZ2ggQ1BVIHVzYWdlLiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiR28gYmFjayB0byBNYWlu IE1lbnUsIHNlbGVjdCBUcm91Ymxlc2hvb3QgYW5kIHJ1biBGaXggV1BBIFJlZ2lzdHJ5IG9wdGlvbi4iDQplY2hvOg0KKSBlbHNlICgNCmVjaG8gQ2hlY2tp bmcgV1BBIFJlZ2lzdHJ5IENvdW50ICAgICAgICAgICAgIFsld3BhaW5mbyVdDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoN Cjo6ICBDaGVjayBSZWFybQ0KDQpyZWcgcXVlcnkgIkhLVVxTLTEtNS0yMFxTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxT b2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybVxQZXJzaXN0ZWRUU1JlQXJtZWQiICVudWwlICYmICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBS ZWFybSAgICAgICAgICAgICAgICAgICAgICAgICAgW1N5c3RlbSBpcyBSZWFybWVkXSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0KY2FsbCA6ZGtfY29s b3IgJUJsdWUlICJSZWJvb3QgeW91ciBtYWNoaW5lIHVzaW5nIHRoZSByZXN0YXJ0IG9wdGlvbiB0byBmaXggdGhpcyBlcnJvci4iDQplY2hvOg0KKQ0Kc2V0 IGVycm9yPTENCnNldCBzaG93Zml4PTENCikNCg0KDQpyZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNp b25cQ2xpcFNWQ1xWb2xhdGlsZVxQZXJzaXN0ZWRTeXN0ZW1TdGF0ZSIgJW51bCUgJiYgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIENsaXBT VkMgUGVyc2lzdGVkU3lzdGVtU3RhdGUgICBbRm91bmRdIg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlJlYm9v dCB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIHJlc3RhcnQgb3B0aW9uIHRvIGZpeCB0aGlzIGVycm9yLiINCmVjaG86DQopDQpzZXQgZXJyb3I9MQ0Kc2V0IHNo b3dmaXg9MQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlDQoNCmlm ICVlcnJvcl9jb2RlJSBORVEgMCAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlICAgICAgIFtOb3Qg V29ya2luZ10gWyVlcnJvcl9jb2RlJV0iDQppZiBub3QgZGVmaW5lZCBzaG93Zml4ICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiJV9maXhtc2clIg0KY2Fs bCA6ZGtfY29sb3IgJUJsdWUlICJJZiBhY3RpdmF0aW9uIHN0aWxsIGZhaWxzIHRoZW4gcnVuIEZpeCBXUEEgUmVnaXN0cnkgb3B0aW9uLiINCmVjaG86DQop DQpzZXQgZXJyb3I9MQ0Kc2V0IHNob3dmaXg9MQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgQWN0aXZhdGlv biBJRHMNCg0KY2FsbCA6ZGtfYWN0aWQgNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmDQoNCmlmIG5vdCBkZWZpbmVkIGFwcHMgKA0KJXBz YyUgImlmICgtbm90ICRlbnY6X3Zpcykge1N0YXJ0LUpvYiB7IFN0b3AtU2VydmljZSAlX3Nsc2VyJSAtZm9yY2UgfSB8IFdhaXQtSm9iIC1UaW1lb3V0IDIw IHwgT3V0LU51bGx9OyAkc2xzID0gR2V0LVdtaU9iamVjdCBTb2Z0d2FyZUxpY2Vuc2luZ1NlcnZpY2U7ICRmPVtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJyFf YmF0cCEnKSAtc3BsaXQgJzp4cm1cOi4qJzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKTsgUmVpbnN0YWxsTGljZW5zZXMiICVudWwlDQppZiBu b3QgZGVmaW5lZCBfdmlzIGlmICFlcnJvcmxldmVsISBORVEgMCBzZXQgcmxpY2ZhaWxlZD0xDQpjYWxsIDpka19hY3RpZCA1NWM5MjczNC1kNjgyLTRkNzEt OTgzZS1kNmVjM2YxNjA1OWYNCikNCg0KaWYgbm90IGRlZmluZWQgYXBwcyBjYWxsIDpka19hY3RpZHMgNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNm MTYwNTlmDQoNCmlmIG5vdCBkZWZpbmVkIGFwcHMgaWYgZGVmaW5lZCBhbGxhcHBzIGlmIG5vdCBkZWZpbmVkIG5vdHdpbmFjdCAoDQpjYWxsIDpka19jb2xv ciAlR3JheSUgIkNoZWNraW5nIEFjdGl2YXRpb24gSURzICAgICAgICAgICAgICAgICBbS2V5IE5vdCBJbnN0YWxsZWQgb3IgQWN0IElEIE5vdCBGb3VuZF0i DQopDQoNCmlmIG5vdCBkZWZpbmVkIGFwcHMgaWYgbm90IGRlZmluZWQgYWxsYXBwcyAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgQWN0aXZh dGlvbiBJRHMgICAgICAgICAgICAgICAgIFtOb3QgZm91bmRdIg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIiVf Zml4bXNnJSINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiSWYgYWN0aXZhdGlvbiBzdGlsbCBmYWlscyB0aGVuIHJ1biBGaXggV1BBIFJlZ2lzdHJ5IG9wdGlv bi4iDQplY2hvOg0KKQ0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTENCikNCg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCBpZiBkZWZpbmVkIHJsaWNmYWls ZWQgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIklmIGFjdGl2YXRpb24gc3RpbGwgZmFpbHMg dGhlbiBydW4gRml4IFdQQSBSZWdpc3RyeSBvcHRpb24uIg0KZWNobzoNCikNCg0KaWYgJXdpbmJ1aWxkJSBHRVEgNzYwMCBpZiBleGlzdCAiJXRva2Vuc3Rv cmUlXCIgaWYgbm90IGV4aXN0ICIldG9rZW5zdG9yZSVcdG9rZW5zLmRhdCIgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFNQUCB0b2tlbnMu ZGF0ICAgICAgICAgICAgICAgICBbTm90IEZvdW5kXSBbJXRva2Vuc3RvcmUlXF0iDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoN Cjo6ICBDaGVjayBFdmFsIFdpbmRvd3MNCg0KaWYgbm90IGRlZmluZWQgbm90d2luYWN0IGlmIGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2th Z2VzXE1pY3Jvc29mdC1XaW5kb3dzLSpFdmFsRWRpdGlvbn4qLm11bSIgKA0KcmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5U XEN1cnJlbnRWZXJzaW9uIiAvdiBFZGl0aW9uSUQgJW51bDIlIHwgZmluZCAvaSAiRXZhbCIgJW51bDElIHx8ICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJD aGVja2luZyBFdmFsIFBhY2thZ2VzICAgICAgICAgICAgICAgICAgW0xpY2Vuc2Ugc3dhcHBpbmcgZm91bmQuIE5vbi1FdmFsIGxpY2Vuc2VzIGFyZSBpbnN0 YWxsZWQgaW4gRXZhbCBXaW5kb3dzXSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJMaWNlbnNlIHN3YXBwaW5n IGlzIG5vdCB0aGUgcmlnaHQgd2F5IHRvIHVwZ3JhZGUgdG8gdGhlIGZ1bGwgdmVyc2lvbi4gTGVhcm4gdGhlIGNvcnJlY3QgbWV0aG9kIGF0IHRoZSBsaW5r IGJlbG93LiINCnNldCBmaXhlcz0lZml4ZXMlICVtYXMlZXZhbHVhdGlvbl9lZGl0aW9ucw0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3 ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJWV2YWx1YXRpb25fZWRpdGlvbnMiDQplY2hvOg0KKQ0Kc2V0IGVycm9yPTENCnNldCBzaG93 Zml4PTENCikNCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIEhLVVxTLTEtNS0yMFxTb2Z0d2FyZSByZWdpc3Ry eSwgaW4gc29tZSBzeXN0ZW1zIGl0J3MgbWlzc2luZyBhbmQgdGhhdCBjYXVzZXMgV2luZG93cyBhY3RpdmF0aW9uIHByb2JsZW1zDQoNCnJlZyBxdWVyeSAi SEtVXFMtMS01LTIwXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uIiAlbnVsJSB8fCAoDQpjYWxsIDpka19jb2xvciAlUmVk JSAiQ2hlY2tpbmcgSEtVXFMtMS01LTIwIFJlZ2lzdHJ5ICAgICAgICAgIFtOb3QgRm91bmRdIg0KaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAoDQpzZXQgZml4 ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhl bHAgLSAiICVfWWVsbG93JSAiICVtYXMlaW4tcGxhY2VfcmVwYWlyX3VwZ3JhZGUiDQplY2hvOg0KKQ0Kc2V0IGVycm9yPTENCnNldCBzaG93Zml4PTENCikN Cg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIGxpY2Vuc2UgYW5kIHBhY2thZ2UgZmlsZXMgZm9yIHRoZSBjdXJyZW50 IGVkaXRpb24NCg0Kc2V0IG9zZWRpdGlvbj0wDQppZiAlX3dtaWMlIEVRVSAxIHNldCAiY2hrZWRpPWZvciAvZiAidG9rZW5zPTIgZGVsaW1zPT0iICUlYSBp biAoJyJ3bWljIHBhdGggJXNwcCUgd2hlcmUgKEFwcGxpY2F0aW9uSUQ9JzU1YzkyNzM0LWQ2ODItNGQ3MS05ODNlLWQ2ZWMzZjE2MDU5ZicgQU5EIExpY2Vu c2VEZXBlbmRzT24gaXMgTlVMTCBBTkQgUGFydGlhbFByb2R1Y3RLZXkgSVMgTk9UIE5VTEwpIGdldCBMaWNlbnNlRmFtaWx5IC9WQUxVRSIgJW51bDYlJyki DQppZiAlX3dtaWMlIEVRVSAwIHNldCAiY2hrZWRpPWZvciAvZiAidG9rZW5zPTIgZGVsaW1zPT0iICUlYSBpbiAoJyVwc2MlICIoKFtXTUlTRUFSQ0hFUl0n U0VMRUNUIExpY2Vuc2VGYW1pbHkgRlJPTSAlc3BwJSBXSEVSRSBBcHBsaWNhdGlvbklEPScnNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlm JycgQU5EIExpY2Vuc2VEZXBlbmRzT24gaXMgTlVMTCBBTkQgUGFydGlhbFByb2R1Y3RLZXkgSVMgTk9UIE5VTEwnKS5HZXQoKSkuTGljZW5zZUZhbWlseSBe fCAlJSB7ZWNobyAoJ0xpY2Vuc2VGYW1pbHk9JyskXyl9IiAlbnVsNiUnKSINCiVjaGtlZGklIGRvIGlmIG5vdCBlcnJvcmxldmVsIDEgKGNhbGwgc2V0ICJv c2VkaXRpb249JSVhIikNCg0KaWYgJW9zZWRpdGlvbiU9PTAgZm9yIC9mICJza2lwPTIgdG9rZW5zPTMiICUlYSBpbiAoJ3JlZyBxdWVyeSAiSEtMTVxTT0ZU V0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgL3YgRWRpdGlvbklEICVudWw2JScpIGRvIHNldCAib3NlZGl0aW9uPSUlYSINCg0K OjogIFdvcmthcm91bmQgZm9yIGFuIGlzc3VlIGluIGJ1aWxkcyBiZXR3ZWVuIDE2MDcgYW5kIDE3MDkgd2hlcmUgUHJvZmVzc2lvbmFsRWR1Y2F0aW9uIGlz IHNob3duIGFzIFByb2Zlc3Npb25hbA0KDQppZiBub3QgJW9zZWRpdGlvbiU9PTAgKA0KaWYgIiVvc1NLVSUiPT0iMTY0IiBzZXQgb3NlZGl0aW9uPVByb2Zl c3Npb25hbEVkdWNhdGlvbg0KaWYgIiVvc1NLVSUiPT0iMTY1IiBzZXQgb3NlZGl0aW9uPVByb2Zlc3Npb25hbEVkdWNhdGlvbk4NCikNCg0KaWYgbm90IGRl ZmluZWQgbm90d2luYWN0ICgNCmlmICVvc2VkaXRpb24lPT0wICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBFZGl0aW9uIE5hbWUgICAgICAg ICAgICAgICAgICAgW05vdCBGb3VuZCBJbiBSZWdpc3RyeV0iDQopIGVsc2UgKA0KaWYgbm90IGV4aXN0ICIlU3lzUGF0aCVcc3BwXHRva2Vuc1xza3VzXCVv c2VkaXRpb24lXCVvc2VkaXRpb24lKi54cm0tbXMiIGlmIG5vdCBleGlzdCAiJVN5c1BhdGglXHNwcFx0b2tlbnNcc2t1c1xTZWN1cml0eS1TUFAtQ29tcG9u ZW50LVNLVS0lb3NlZGl0aW9uJVwqLSVvc2VkaXRpb24lLSoueHJtLW1zIiBpZiBub3QgZXhpc3QgIiVTeXNQYXRoJVxsaWNlbnNpbmdcc2t1c1xTZWN1cml0 eS1MaWNlbnNpbmctU0xDLUNvbXBvbmVudC1TS1UtJW9zZWRpdGlvbiVcKi0lb3NlZGl0aW9uJS0qLnhybS1tcyIgKA0Kc2V0IHNrdW5vdGZvdW5kPTENCmNh bGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBMaWNlbnNlIEZpbGVzICAgICAgICAgICAgICAgICAgW05vdCBGb3VuZF0gWyVvc2VkaXRpb24lXSINCikN CmlmIG5vdCBleGlzdCAiJVN5c3RlbVJvb3QlXFNlcnZpY2luZ1xQYWNrYWdlc1xNaWNyb3NvZnQtV2luZG93cy0qLSVvc2VkaXRpb24lLSoubXVtIiAoDQpp ZiBub3QgZXhpc3QgIiVTeXN0ZW1Sb290JVxTZXJ2aWNpbmdcUGFja2FnZXNcTWljcm9zb2Z0LVdpbmRvd3MtJW9zZWRpdGlvbiVFZGl0aW9uKi5tdW0iICgN CmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBQYWNrYWdlIEZpbGVzICAgICAgICAgICAgICAgICAgW05vdCBGb3VuZF0gWyVvc2VkaXRpb24lXSIN CmlmIG5vdCBkZWZpbmVkIHNob3dmaXggKA0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVpbi1wbGFjZV9yZXBhaXJfdXBncmFkZQ0KY2FsbCA6ZGtfY29sb3Iy ICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlIg0KZWNobzoN CikNCnNldCBlcnJvcj0xDQpzZXQgc2hvd2ZpeD0xDQopDQopDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVj ayBTS1UgdmFsdWUgdG8gZmluZCBpZiB0aGVyZSBpcyBhbnkgZGlmZmVyZW5jZQ0KDQppZiBub3QgZGVmaW5lZCBub3R3aW5hY3QgKA0KaWYgJXdpbmJ1aWxk JSBHRVEgMTAyNDAgKA0KJW51bCUgc2V0IC9hICJzdW09JXNsY1NLVSUrJXJlZ1NLVSUrJXdtaVNLVSUiDQpzZXQgL2EgInN1bS89MyINCmlmIG5vdCAiIXN1 bSEiPT0iJXNsY1NLVSUiICgNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiQ2hlY2tpbmcgU0xDL1dNSS9SRUcgU0tVICAgICAgICAgICAgICAgIFtEaWZmZXJl bmNlIEZvdW5kIC0gU0xDOiVzbGNTS1UlIFdNSTold21pU0tVJSBSZWc6JXJlZ1NLVSVdIg0KKQ0KKSBlbHNlICgNCiVudWwlIHNldCAvYSAic3VtPSVzbGNT S1UlKyV3bWlTS1UlIg0Kc2V0IC9hICJzdW0vPTIiDQppZiBub3QgIiFzdW0hIj09IiVzbGNTS1UlIiAoDQpjYWxsIDpka19jb2xvciAlR3JheSUgIkNoZWNr aW5nIFNMQy9XTUkgU0tVICAgICAgICAgICAgICAgICAgICBbRGlmZmVyZW5jZSBGb3VuZCAtIFNMQzolc2xjU0tVJSBXTUk6JXdtaVNLVSVdIg0KKQ0KKQ0K KQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgVGhpcyAiV0xNUyIgc2VydmljZSB3YXMgaW5jbHVkZWQgaW4gcHJldmlvdXMg RXZhbCBlZGl0aW9ucyAod2hpY2ggd2VyZSBhY3RpdmFibGUpIHRvIGF1dG9tYXRpY2FsbHkgc2h1dCBkb3duIHRoZSBzeXN0ZW0gZXZlcnkgaG91ciBhZnRl ciB0aGUgZXZhbHVhdGlvbiBwZXJpb2QgZXhwaXJlZCBhbmQgcHJldmVudCBTUFBTVkMgZnJvbSBzdG9wcGluZy4NCg0Kc2MgcXVlcnkgd2xtcyAlbnVsJQ0K DQppZiAlZXJyb3JsZXZlbCUgTkVRIDEwNjAgKA0KZWNobyBDaGVja2luZyBFdmFsIFdMTVMgU2VydmljZSAgICAgICAgICAgICAgW0ZvdW5kXQ0KKQ0KDQo6 Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgU1BQIGludGVyZmVyZW5jZSBpbiBJRkVPDQoNCmZvciAlJSMgaW4gKFNwcEV4 JXcldENvbU9iai5leGUgU0xzdmMuZXhlIHNwcHN2Yy5leGUgc3Bwc3ZjLmV4ZVxQZXJmT3B0aW9ucykgZG8gKA0KcmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJF XE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXEltYSV3JWdlIEZpbGUgRXhlY3UldyV0aW9uIE9wdGlvbnNcJSUjIiAlbnVsJSAmJiAoaWYg ZGVmaW5lZCBfc3BwaW50IChzZXQgIl9zcHBpbnQ9IV9zcHBpbnQhLCAlJSMiKSBlbHNlIChzZXQgIl9zcHBpbnQ9JSUjIikpDQopDQppZiBkZWZpbmVkIF9z cHBpbnQgKA0KZWNobyAlX3NwcGludCUgfCBmaW5kIC9pICJQZXJmT3B0aW9ucyIgJW51bCUgJiYgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5n IFNQUCBJbnRlcmZlcmVuY2UgSW4gSUZFTyAgICAgICBbJV9zcHBpbnQlIC0gU3lzdGVtIG1pZ2h0IGRlYWN0aXZhdGUgbGF0ZXJdIg0KaWYgbm90IGRlZmlu ZWQgc2hvd2ZpeCAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIiVfZml4bXNnJSINCmVjaG86DQopDQpzZXQgc2hvd2ZpeD0xDQopIHx8ICgNCmVjaG8gQ2hl Y2tpbmcgU1BQIEluIElGRU8gICAgICAgICAgICAgICAgICAgIFslX3NwcGludCVdDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 DQoNCjo6ICBDaGVjayBhbmQgZml4IFNraXBSZWFybSByZWdpc3RyeSB2YWx1ZQ0KDQppZiAld2luYnVpbGQlIEdFUSA3NjAwIGZvciAvZiAic2tpcD0yIHRv a2Vucz0yKiIgJSVhIGluICgncmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJv dGVjdGlvblBsYXRmb3JtIiAvdiAiU2tpcFJlYXJtIiAlbnVsNiUnKSBkbyBpZiAvaSAlJWIgTkVRIDB4MCAoDQpyZWcgYWRkICJIS0xNXFNPRlRXQVJFXE1p Y3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtIiAvdiAiU2tpcFJlYXJtIiAvdCBSRUdfRFdPUkQg L2QgIjAiIC9mICVudWwlDQpjYWxsIDpka19jb2xvciAlR3JheSUgIkNoZWNraW5nIFNraXBSZWFybSAgICAgICAgICAgICAgICAgICAgICBbRGVmYXVsdCAw IFZhbHVlIE5vdCBGb3VuZC4gQ2hhbmdpbmcgVG8gMF0iDQolcHNjJSAiU3RhcnQtSm9iIHsgU3RvcC1TZXJ2aWNlIHNwcHN2YyAtZm9yY2UgfSB8IFdhaXQt Sm9iIC1UaW1lb3V0IDIwIHwgT3V0LU51bGwiDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVjayBTdmNSZXN0YXJ0 VGFzayBzdGF0dXMsIHRoaXMgdGFzayBoZWxwcyBpbiBtYWtpbmcgc3VyZSBzeXN0ZW0gcmVtYWlucyBhY3RpdmF0ZWQNCg0KaWYgJXdpbmJ1aWxkJSBHRVEg OTIwMCBpZiBub3QgZXhpc3QgIiVTeXN0ZW1Sb290JVxTZXJ2aWNpbmdcUGFja2FnZXNcTWljcm9zb2Z0LVdpbmRvd3MtKkV2YWxFZGl0aW9ufioubXVtIiAo DQolcHNjJSAiR2V0LVdtaU9iamVjdCAtUXVlcnkgJ1NFTEVDVCBEZXNjcmlwdGlvbiBGUk9NIFNvZnR3YXJlTGljZW5zaW5nUHJvZHVjdCBXSEVSRSBQYXJ0 aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVMTCBBTkQgTGljZW5zZURlcGVuZHNPbiBJUyBOVUxMJyB8IFNlbGVjdC1PYmplY3QgLVByb3BlcnR5IERlc2NyaXB0 aW9uIiAlbnVsMiUgfCBmaW5kc3RyIC9pICJLTVNfIiAlbnVsMSUgfHwgKA0KZm9yIC9mICJkZWxpbXM9IiAlJWEgaW4gKCclcHNjJSAiJHM9TmV3LU9iamVj dCAtQ29tT2JqZWN0ICdTY2hlZHVsZS5TZXJ2aWNlJzsgJHMuQ29ubmVjdCgpOyAkc3RhdGU9JHMuR2V0Rm9sZGVyKCdcTWljcm9zb2Z0XFdpbmRvd3NcU29m dHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0nKS5HZXRUYXNrKCdTdmNSZXN0YXJ0VGFzaycpLlN0YXRlOyBAezA9J1Vua25vd24nOzE9J0Rpc2FibGVkJzsyPSdR dWV1ZWQnOzM9J1JlYWR5Jzs0PSdSdW5uaW5nJ31bJHN0YXRlXSIgJW51bDYlJykgZG8gKHNldCB0YXNraW5mbz0lJWEpDQoNCmVjaG8gIXRhc2tpbmZvISB8 IGZpbmQgL2kgIlJlYWR5IiAlbnVsJSB8fCAoDQpyZWcgZGVsZXRlICJIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRc Q3VycmVudFZlcnNpb25cU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0iIC92ICJhY3Rpb25saXN0IiAvZiAlbnVsJQ0KcmVnIHF1ZXJ5ICJIS0xNXFNPRlRX QVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNjaGVkdWxlXFRhc2tDYWNoZVxUcmVlXE1pY3Jvc29mdFxXaW5kb3dzXFNvZnR3YXJl UHJvdGVjdGlvblBsYXRmb3JtXFN2Y1Jlc3RhcnRUYXNrIiAlbnVsJSB8fCBzZXQgdGFza2luZm89UmVtb3ZlZA0KaWYgIiF0YXNraW5mbyEiPT0iIiBzZXQg InRhc2tpbmZvPU5vdCBGb3VuZCINCg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVja2luZyBTdmNSZXN0YXJ0VGFzayBTdGF0dXMgICAgICAgICAgWyF0 YXNraW5mbyEuIFN5c3RlbSBtaWdodCBkZWFjdGl2YXRlIGxhdGVyLl0iDQppZiBub3QgZGVmaW5lZCBzaG93Zml4ICgNCmVjaG8gIiF0YXNraW5mbyEiIHwg ZmluZHN0ciAvaSAiUmVtb3ZlZCBOb3QgRm91bmQiICVudWwxJSAmJiAoDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRl DQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlaW4tcGxhY2VfcmVwYWly X3VwZ3JhZGUiDQopIHx8ICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiUmVib290IHlvdXIgbWFjaGluZSB1c2luZyB0aGUgcmVzdGFydCBvcHRpb24gYW5k IHJ1biB0aGUgc2NyaXB0IGFnYWluLiINCikNCmVjaG86DQopDQopDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmV4aXQg L2INCg0KOjogIFRoaXMgY29kZSBjaGVja3MgZm9yIGludmFsaWQgcmVnaXN0cnkga2V5cyBpbiBIS0xNXFNZU1RFTVxXUEEuIFRoaXMgaXNzdWUgbWF5IGFw cGVhciBldmVuIG9uIGhlYWx0aHkgc3lzdGVtcw0KDQo6d3BhdGVzdDoNCiR3cGFLZXkgPSBbTWljcm9zb2Z0LldpbjMyLlJlZ2lzdHJ5S2V5XTo6T3BlblJl bW90ZUJhc2VLZXkoJ0xvY2FsTWFjaGluZScsICRlbnY6Q09NUFVURVJOQU1FKS5PcGVuU3ViS2V5KCJTWVNURU1cXFdQQSIpDQokY291bnQgPSAwDQpmb3Jl YWNoICgkc3Via2V5TmFtZSBpbiAkd3BhS2V5LkdldFN1YktleU5hbWVzKCkpIHsNCiAgICBpZiAoJHN1YmtleU5hbWUgLW1hdGNoICc4REVDMEFGMS0wMzQx LTRiOTMtODVDRC03MjYwNkMyREY5NEMuKicpIHsNCiAgICAgICAgJGNvdW50KysNCiAgICB9DQp9DQokb3NWZXJzaW9uID0gW1N5c3RlbS5FbnZpcm9ubWVu dF06Ok9TVmVyc2lvbi5WZXJzaW9uDQokbWluQnVpbGROdW1iZXIgPSAxNDM5Mw0KaWYgKCRvc1ZlcnNpb24uQnVpbGQgLWdlICRtaW5CdWlsZE51bWJlcikg ew0KICAgICRzdWJrZXlIYXNoVGFibGUgPSBAe30NCiAgICBmb3JlYWNoICgkc3Via2V5TmFtZSBpbiAkd3BhS2V5LkdldFN1YktleU5hbWVzKCkpIHsNCiAg ICAgICAgaWYgKCRzdWJrZXlOYW1lIC1tYXRjaCAnOERFQzBBRjEtMDM0MS00YjkzLTg1Q0QtNzI2MDZDMkRGOTRDLionKSB7DQogICAgICAgICAgICAka2V5 TnVtYmVyID0gJHN1YmtleU5hbWUgLXJlcGxhY2UgJy4qLScsICcnDQogICAgICAgICAgICAkc3Via2V5SGFzaFRhYmxlWyRrZXlOdW1iZXJdID0gJHRydWUN CiAgICAgICAgfQ0KICAgIH0NCiAgICBmb3IgKCRpPTE7ICRpIC1sZSAkY291bnQ7ICRpKyspIHsNCiAgICAgICAgaWYgKC1ub3QgJHN1YmtleUhhc2hUYWJs ZS5Db250YWluc0tleSgiJGkiKSkgew0KICAgICAgICAgICAgV3JpdGUtT3V0cHV0ICJUb3RhbCBLZXlzICRjb3VudC4gRXJyb3IgRm91bmQgLSAkaSBrZXkg ZG9lcyBub3QgZXhpc3QuIg0KCQkJJHdwYUtleS5DbG9zZSgpDQoJCQlleGl0DQogICAgICAgIH0NCiAgICB9DQp9DQokd3BhS2V5LkdldFN1YktleU5hbWVz KCkgfCBGb3JFYWNoLU9iamVjdCB7DQogICAgaWYgKCRfIC1tYXRjaCAnOERFQzBBRjEtMDM0MS00YjkzLTg1Q0QtNzI2MDZDMkRGOTRDLionKSB7DQogICAg ICAgIGlmICgkUFNWZXJzaW9uVGFibGUuUFNWZXJzaW9uLk1ham9yIC1sdCAzKSB7DQogICAgICAgICAgICBjbWQgL2MgInJlZyBxdWVyeSAiSEtMTVxTWVNU RU1cV1BBXCRfIiAvdmUgL3QgUkVHX0JJTkFSWSA+bnVsIDI+JjEiDQoJCQlpZiAoJExBU1RFWElUQ09ERSAtbmUgMCkgew0KICAgICAgICAgICAgV3JpdGUt SG9zdCAiVG90YWwgS2V5cyAkY291bnQuIEVycm9yIEZvdW5kIC0gQmluYXJ5IERhdGEgaXMgY29ycnVwdC4iDQoJCQkkd3BhS2V5LkNsb3NlKCkNCgkJCWV4 aXQNCgkJCX0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRzdWJrZXkgPSAkd3BhS2V5Lk9wZW5TdWJLZXkoJF8pDQogICAgICAgICAgICAkcCA9 ICRzdWJrZXkuR2V0VmFsdWVOYW1lcygpDQogICAgICAgICAgICBpZiAoKCRwIHwgV2hlcmUtT2JqZWN0IHsgJHN1YmtleS5HZXRWYWx1ZUtpbmQoJF8pIC1l cSBbTWljcm9zb2Z0LldpbjMyLlJlZ2lzdHJ5VmFsdWVLaW5kXTo6QmluYXJ5IH0pLkNvdW50IC1lcSAwKSB7DQogICAgICAgICAgICAgICAgV3JpdGUtSG9z dCAiVG90YWwgS2V5cyAkY291bnQuIEVycm9yIEZvdW5kIC0gQmluYXJ5IERhdGEgaXMgY29ycnVwdC4iDQoJCQkJJHdwYUtleS5DbG9zZSgpDQoJCQkJZXhp dA0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KJGNvdW50DQokd3BhS2V5LkNsb3NlKCkNCjp3cGF0ZXN0Og0KDQo6Oj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOmRrX2NvbG9yDQoNCmlmICVfTkNTJSBFUVUgMSAoDQplY2hvICVlc2MlWyV+MSV+MiVl c2MlWzBtDQopIGVsc2UgaWYgZXhpc3QgJXBzJSAoDQolcHNjJSB3cml0ZS1ob3N0IC1iYWNrICclMScgLWZvcmUgJyUyJyAnJTMnDQopIGVsc2UgaWYgbm90 IGV4aXN0ICVwcyUgKA0KZWNobyAlfjMNCikNCmV4aXQgL2INCg0KOmRrX2NvbG9yMg0KDQppZiAlX05DUyUgRVFVIDEgKA0KZWNobyAlZXNjJVslfjElfjIl ZXNjJVslfjMlfjQlZXNjJVswbQ0KKSBlbHNlIGlmIGV4aXN0ICVwcyUgKA0KJXBzYyUgd3JpdGUtaG9zdCAtYmFjayAnJTEnIC1mb3JlICclMicgJyUzJyAt Tm9OZXdsaW5lOyB3cml0ZS1ob3N0IC1iYWNrICclNCcgLWZvcmUgJyU1JyAnJTYnDQopIGVsc2UgaWYgbm90IGV4aXN0ICVwcyUgKA0KZWNobyAlfjMgJX42 DQopDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6ZGtfZG9uZQ0KDQplY2hvOg0KaWYg JV91bmF0dGVuZGVkJT09MSB0aW1lb3V0IC90IDIgJiBleGl0IC9iDQoNCmlmIGRlZmluZWQgZml4ZXMgKA0KY2FsbCA6ZGtfY29sb3IgJVdoaXRlJSAiRm9s bG93IEFMTCB0aGUgQUJPVkUgYmx1ZSBsaW5lcy4gICAiDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJQcmVzcyBbMV0gdG8gT3BlbiBTdXBwb3J0IFdlYnBh Z2UgIiAlR3JheSUgIiBQcmVzcyBbMF0gdG8gSWdub3JlIg0KY2hvaWNlIC9DOjEwIC9ODQppZiAhZXJyb3JsZXZlbCE9PTIgZXhpdCAvYg0KaWYgIWVycm9y bGV2ZWwhPT0xIChzdGFydCAlc2VsZmdpdCUgJiBzdGFydCAlZ2l0aHViJSAmIGZvciAlJSMgaW4gKCVmaXhlcyUpIGRvIChzdGFydCAlJSMpKQ0KKQ0KDQpp ZiBkZWZpbmVkIHRlcm1pbmFsICgNCmNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiUHJlc3MgWzBdIGtleSB0byAlX2V4aXRtc2clLi4uIg0KY2hvaWNlIC9j IDAgL24NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlX1llbGxvdyUgIlByZXNzIGFueSBrZXkgdG8gJV9leGl0bXNnJS4uLiINCnBhdXNlICVudWwxJQ0K KQ0KDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgMXN0IGNvbHVtbiA9IEFjdGl2 YXRpb24gSUQNCjo6ICAybmQgY29sdW1uID0gR2VuZXJpYyBSZXRhaWwvT0VNL01BSyBLZXkNCjo6ICAzcmQgY29sdW1uID0gU0tVIElEDQo6OiAgNHRoIGNv bHVtbiA9IEtleSBwYXJ0IG51bWJlcg0KOjogIDV0aCBjb2x1bW4gPSAxID0gYWN0aXZhdGlvbiBpcyBub3Qgd29ya2luZyAoYXQgdGhlIHRpbWUgb2Ygd3Jp dGluZyB0aGlzKSwgMCA9IGFjdGl2YXRpb24gaXMgd29ya2luZw0KOjogIDZ0aCBjb2x1bW4gPSBLZXkgVHlwZQ0KOjogIDd0aCBjb2x1bW4gPSBXTUkgRWRp dGlvbiBJRCAoRm9yIHJlZmVyZW5jZSBvbmx5KQ0KOjogIDh0aCBjb2x1bW4gPSBWZXJzaW9uIG5hbWUgaW5jYXNlIHNhbWUgRWRpdGlvbiBJRCBpcyB1c2Vk IGluIGRpZmZlcmVudCBPUyB2ZXJzaW9ucyB3aXRoIGRpZmZlcmVudCBrZXkNCjo6ICBTZXBhcmF0b3IgID0gXw0KDQoNCjpod2lkZGF0YQ0KDQpzZXQgZj0N CmZvciAlJSMgaW4gKA0KOGIzNTFjOWMtZjM5OC00NTE1LTk5MDAtMDlkZjQ5NDI3MjYyX1hHVlBQLU5NSDQ3LTdUVEhKLVczRlc3LThIJWYlVjJDX19fNF9Y MTktOTk2ODNfMF9PRU06Tk9OU0xQX0VudGVycHJpc2UNCmM4M2NlZjA3LTZiNzItNGJiYy1hMjhmLWEwMDM4Njg3MjgzOV8zVjZRNi1OUVhDWC1WOFlYUi05 UUNZVi1RUCVmJUZDVF9fMjdfWDE5LTk4NzQ2XzBfVm9sdW1lOk1BS19FbnRlcnByaXNlTg0KNGRlN2NiNjUtY2RmMS00ZGU5LThhZTgtZTNjY2UyN2I5ZjJj X1ZLN0pHLU5QSFRNLUM5N0pNLTlNUEdULTNWJWYlNjZUX180OF9YMTktOTg4NDFfMF9fX19fUmV0YWlsX1Byb2Zlc3Npb25hbA0KOWZiYWY1ZDYtNGQ4My00 NDIyLTg3MGQtZmRkYTZlNTg1OGFhXzJCODdOLThLRkhQLURLVjZSLVkyQzhKLVBLJWYlQ0tUX180OV9YMTktOTg4NTlfMF9fX19fUmV0YWlsX1Byb2Zlc3Np b25hbE4NCmY3NDJlNGZmLTkwOWQtNGZlOS1hYWNiLTMyMzFkMjRhMGM1OF80Q1BSSy1OTTNLMy1YNlhYUS1SWFg4Ni1XWCVmJUNIV19fOThfWDE5LTk4ODc3 XzBfX19fX1JldGFpbF9Db3JlTg0KMWQxYmFjODUtNzM2NS00ZmVhLTk0OWEtOTY5NzhlYzkxYWUwX04yNDM0LVg5RDdXLThQRjZYLThEVjlULThUJWYlWU1E X185OV9YMTktOTk2NTJfMF9fX19fUmV0YWlsX0NvcmVDb3VudHJ5U3BlY2lmaWMNCjNhZTJjYzE0LWFiMmQtNDFmNC05NzJmLTVlMjAxNDI3NzFkY19CVDc5 US1HN042Ry1QR0JZVy00WVdYNi02RiVmJTRCVF8xMDBfWDE5LTk5NjYxXzBfX19fX1JldGFpbF9Db3JlU2luZ2xlTGFuZ3VhZ2UNCjJiMWYzNmJiLWMxY2Qt NDMwNi1iZjVjLWEwMzY3YzJkOTdkOF9ZVE1HMy1ONkRLQy1ES0I3Ny03TTlHSC04SCVmJVZYN18xMDFfWDE5LTk4ODY4XzBfX19fX1JldGFpbF9Db3JlDQoy YTYxMzdmMy03NWMwLTRmMjYtOGUzZS1kODNkODAyODY1YTRfWEtDTkMtSjI2UTktS0ZIRDItRktUSFktS0QlZiU3MllfMTE5X1gxOS05OTYwNl8wX09FTTpO T05TTFBfUFBJUHJvDQplNTU4NDE3YS01MTIzLTRmNmYtOTFlNy0zODVjMWM3Y2E5ZDRfWU5NR1EtOFJZVjMtNFBHUTMtQzhYVFAtN0MlZiVGQllfMTIxX1gx OS05ODg4Nl8wX19fX19SZXRhaWxfRWR1Y2F0aW9uDQpjNTE5OGE2Ni1lNDM1LTQ0MzItODljZi1lYzc3N2M5ZDAzNTJfODROR0YtTUhCVDYtRlhCWDgtUVdK SzctRFIlZiVSOEhfMTIyX1gxOS05ODg5Ml8wX19fX19SZXRhaWxfRWR1Y2F0aW9uTg0KZjZlMjk0MjYtYTI1Ni00MzE2LTg4YmYtY2M1YjBmOTVlYzBjX1BK QjQ3LThQTjJULU1DR0RZLUpUWTNELUNCJWYlQ1BWXzEyNV9YMjMtNTAzMzFfMV9Wb2x1bWU6TUFLX0VudGVycHJpc2VTX0dlDQpjY2U5ZDJkZS05OGVlLTRj ZTItODExMy0yMjI2MjBjNjRhMjdfS0NOVkgtWUtXWDgtR0pKQjktSDlGRFQtNkYlZiU3VzJfMTI1X1gyMi02NjA3NV8xX1ZvbHVtZTpNQUtfRW50ZXJwcmlz ZVNfVkINCmQwNjkzNGVlLTU0NDgtNGZkMS05NjRhLWNkMDc3NjE4YWEwNl80M1RCUS1OSDkySi1YS1RNNy1LVDNLSy1QMyVmJTlQQl8xMjVfWDIxLTgzMjMz XzBfT0VNOk5PTlNMUF9FbnRlcnByaXNlU19SUzUNCjcwNmUwY2ZkLTIzZjQtNDNiYi1hOWFmLTFhNDkyYjlmMTMwMl9OSzk2WS1EOUNEOC1XNDRDUS1SOFlU Sy1EWSVmJUpXWF8xMjVfWDIxLTA1MDM1XzBfT0VNOk5PTlNMUF9FbnRlcnByaXNlU19SUzENCmZhYTU3NzQ4LTc1YzgtNDBhMi1iODUxLTcxY2U5MmFhOGI0 NV9GV043SC1QRjkzUS00R0dQOC1NOFJGMy1NRCVmJVdXV18xMjVfWDE5LTk5NjE3XzBfT0VNOk5PTlNMUF9FbnRlcnByaXNlU19USA0KM2QxMDIyZDgtOTY5 Zi00MjIyLWI1NGItMzI3ZjVhNWFmNGM5XzJEQlczLU4yUEpHLU1WSFczLUc3VERLLTlIJWYlS1I0XzEyNl9YMjEtMDQ5MjFfMF9Wb2x1bWU6TUFLX0VudGVy cHJpc2VTTl9SUzENCjYwYzI0M2UxLWY5MGItNGExYi1iYTg5LTM4NzI5NDk0OGZiNl9OVFg2Qi1CUllDMi1LNjc4Ni1GNk1WUS1NNyVmJVYyWF8xMjZfWDE5 LTk4NzcwXzBfVm9sdW1lOk1BS19FbnRlcnByaXNlU05fVEgNCjAxZWI4NTJjLTQyNGQtNDA2MC05NGI4LWMxMGQ3OTlkNzM2NF8zWFA2RC1DUk5ENC1EUllN Mi1HTTg0RC00RyVmJUc4WV8xMzlfWDIzLTM3ODY5XzFfX19fX1JldGFpbF9Qcm9mZXNzaW9uYWxDb3VudHJ5U3BlY2lmaWNfWm4NCmViNmQzNDZmLTFjNjAt NDY0My1iOTYwLTQwZWMzMTU5NmM0NV9EWEc3Qy1OMzZDNC1DNEhURy1YNFQzWC0yWSVmJVY3N18xNjFfWDIxLTQzNjI2XzBfX19fX1JldGFpbF9Qcm9mZXNz aW9uYWxXb3Jrc3RhdGlvbg0KODllODc1MTAtYmE5Mi00NWY2LTgzMjktM2FmYTkwNWUzZTgzX1dZUE5RLThDNDY3LVYyVzZKLVRYNFdYLVdUJWYlMlJRXzE2 Ml9YMjEtNDM2NDRfMF9fX19fUmV0YWlsX1Byb2Zlc3Npb25hbFdvcmtzdGF0aW9uTg0KNjJmMGMxMDAtOWM1My00ZTAyLWI4ODYtYTM1MjhkZGZlN2Y2XzhQ VFQ2LVJOVzRDLTZWN0oyLUMyRDNYLU1IJWYlQlBCXzE2NF9YMjEtMDQ5NTVfMF9fX19fUmV0YWlsX1Byb2Zlc3Npb25hbEVkdWNhdGlvbg0KMTNhMzg2OTgt NGE0OS00YjllLThlODMtOThmZTUxMTEwOTUzX0dKVFlOLUhETVFZLUZSUjc2LUhWR0M3LVFQJWYlRjhQXzE2NV9YMjEtMDQ5NTZfMF9fX19fUmV0YWlsX1By b2Zlc3Npb25hbEVkdWNhdGlvbk4NCmRmOTYwMjNiLWRjZDktNGJlMi1hZmEwLWM2Yzg3MTE1OWViZV9OSkNGNy1QVzhRVC0zMzI0RC02ODhKWC0yWSVmJVY2 Nl8xNzVfWDIxLTQxMjk1XzBfX19fX1JldGFpbF9TZXJ2ZXJSZHNoDQpkNGVmNzI4Mi0zZDJjLTRjZjAtOTk3Ni04ODU0ZTY0YThkMWVfVjNXVlctTjJQVjIt Q0dXQzMtMzRRR0YtVk0lZiVKMkNfMTc4X1gyMS0zMjk4M18wX19fX19SZXRhaWxfQ2xvdWQNCmFmNWM5MzgxLTkyNDAtNDE3ZC04ZDM1LWViNDBjZDAzZTQ4 NF9OSDlKMy02OFdLNy02RkI5My00SzNERi1ESiVmJTRGNl8xNzlfWDIxLTMyOTg3XzBfX19fX1JldGFpbF9DbG91ZE4NCjhhYjliZGQxLTFmNjctNDk5Ny04 MmQ5LTg4Nzg1MjA4MzdkOV9YUVFZVy1ORkZNVy1YSlBCSC1LODczMi1DSyVmJUZGRF8xODhfWDIxLTk5Mzc4XzBfX19fX09FTTpETV9Jb1RFbnRlcnByaXNl DQplZDY1NTAxNi1hOWU4LTQ0MzQtOTVkOS00MzQ1MzUyYzI1NTJfUVBNNk4tN0oyV0otUDg4SEgtUDNZUkgtWVklZiU3NEhfMTkxX1gyMS05OTY4Ml8wX09F TTpOT05TTFBfSW9URW50ZXJwcmlzZVNfVkINCjZjNGRlMWI4LTI0YmItNGMxNy05YTc3LTdiOTM5NDE0YzI5OF9DR0s0Mi1HWU42WS1WRDIyQi1CWDk4Vy1K OCVmJUpYRF8xOTFfWDIzLTEyNjE3XzBfT0VNOk5PTlNMUF9Jb1RFbnRlcnByaXNlU19HZQ0KZDRiZGM2NzgtMGE0Yi00YTMyLWE1YjMtYWFhMjRjM2IwZjI0 X0s5VktOLTNCR1dWLVk2MjRXLU1DUk1RLUJIJWYlRENEXzIwMl9YMjItNTM4ODRfMF9fX19fUmV0YWlsX0Nsb3VkRWRpdGlvbk4NCjkyZmI4NzI2LTkyYTgt NGZmYy05NGNlLWY4MmUwNzQ0NDY1M19LWTdQTi1WUjZSWC04M1c2WS02RERZUS1UNiVmJVI0V18yMDNfWDIyLTUzODQ3XzBfX19fX1JldGFpbF9DbG91ZEVk aXRpb24NCjVhODUzMDBhLWJmY2UtNDc0Zi1hYzA3LWEzMDk4M2UzZmI5MF9OOTc5Sy1YV0Q3Ny1ZVzNHQi1IQkdINi1EMyVmJTJNSF8yMDVfWDIzLTE1MDQy XzBfX19fX09FTTpETV9Jb1RFbnRlcnByaXNlU0sNCjgwMDgzZWFlLTcwMzEtNDM5NC05ZTg4LTQ5MDE5NzNkNTZmZV9QOFE3VC1XTks3WC1QTUZYWS1WWEhC Ry1SUiVmJUs2OV8yMDZfWDIzLTYyMDg0XzBfX19fX09FTTpETV9Jb1RFbnRlcnByaXNlSw0KMWJjMjE0MGItMjg1Yi00MzUxLWI5OWMtMjZhMTI2MTA0YjI5 X1RNUDJOLUtHRkhKLVBXTTZGLTY4S0NRLTNQJWYlSkJQXzIxMF9YMjMtNjA1MTNfMF9fX19fUmV0YWlsX1dOQw0KKSBkbyAoDQpmb3IgL2YgInRva2Vucz0x LTkgZGVsaW1zPV8iICUlQSBpbiAoIiUlIyIpIGRvICgNCg0KUkVNIERldGVjdCBrZXkNCg0KaWYgJTE9PWtleSBpZiAlb3NTS1UlPT0lJUMgaWYgbm90IGRl ZmluZWQga2V5ICgNCmVjaG8gIiFhbGxhcHBzISAhYWx0YXBwbGlzdCEiIHwgZmluZCAvaSAiJSVBIiAlbnVsMSUgJiYgKA0KaWYgJSVFPT0xIHNldCBub3R3 b3JraW5nPTENCnNldCBrZXk9JSVCDQopDQopDQoNClJFTSBHZW5lcmF0ZSB0aWNrZXQNCg0KaWYgJTE9PXRpY2tldCBpZiAiJWtleSUiPT0iJSVCIiAoDQpz ZXQgIlNlc3Npb25JZFN0cj1PU01ham9yVmVyc2lvbj01O09TTWlub3JWZXJzaW9uPTE7T1NQbGF0Zm9ybUlkPTI7UFA9MDtQZm49TWljcm9zb2Z0LldpbmRv d3MuJSVDLiUlRF84d2VreWIzZDhiYndlO1BLZXlJSUQ9MjIxMzA2NDUyMzQwMTE1Njc3OTYzOTY0MjYxMjU5MjUwNDExNTg5NDkzNTUwMDM5MTk5OTQwNDMx NTg2ODg2OyINCiVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0ICc6c2lnblw6LionOy4gKFtzY3JpcHRibG9ja106 OkNyZWF0ZSgkZlsxXSkpIg0KKQ0KDQopDQopDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K DQo6c2lnbjoNCiRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAiU3RvcCINCg0KZnVuY3Rpb24gU2lnblByb3BlcnRpZXMgew0KICAgIHBhcmFtICgNCiAgICAg ICAgJFByb3BlcnRpZXMsDQogICAgICAgICRyc2ENCiAgICApDQoNCiAgICAkc2hhMjU2ID0gW1NlY3VyaXR5LkNyeXB0b2dyYXBoeS5TSEEyNTZdOjpDcmVh dGUoKQ0KICAgICRieXRlcyA9IFtUZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRCeXRlcygkUHJvcGVydGllcykNCiAgICAkaGFzaCA9ICRzaGEyNTYuQ29tcHV0 ZUhhc2goJGJ5dGVzKQ0KDQogICAgJHNpZ25hdHVyZSA9ICRyc2EuU2lnbkhhc2goJGhhc2gsIFtTZWN1cml0eS5DcnlwdG9ncmFwaHkuSGFzaEFsZ29yaXRo bU5hbWVdOjpTSEEyNTYsIFtTZWN1cml0eS5DcnlwdG9ncmFwaHkuUlNBU2lnbmF0dXJlUGFkZGluZ106OlBrY3MxKQ0KICAgIHJldHVybiBbQ29udmVydF06 OlRvQmFzZTY0U3RyaW5nKCRzaWduYXR1cmUpDQoNCn0NCg0KW2J5dGVbXV0gJGtleSA9IDB4MDcsMHgwMiwweDAwLDB4MDAsMHgwMCwweEE0LDB4MDAsMHgw MCwweDUyLDB4NTMsMHg0MSwweDMyLDB4MDAsMHgwNCwweDAwLDB4MDAsDQogICAgICAgICAgICAgICAgMHgwMSwweDAwLDB4MDEsMHgwMCwweDI5LDB4ODcs MHhCQSwweDNGLDB4NTIsMHg5MCwweDU3LDB4RDgsMHgxMiwweDI2LDB4NkIsMHgzOCwNCiAgICAgICAgICAgICAgICAweEIyLDB4M0IsMHhGOSwweDY3LDB4 MDgsMHg0RiwweERELDB4OEIsMHhGNSwweEUzLDB4MTEsMHhCOCwweDYxLDB4M0EsMHgzMywweDQyLA0KICAgICAgICAgICAgICAgIDB4NTEsMHg2NSwweDA1 LDB4ODYsMHgxRSwweDAwLDB4NDEsMHhERSwweEM1LDB4REQsMHg0NCwweDYwLDB4NTYsMHgzRCwweDE0LDB4MzksDQogICAgICAgICAgICAgICAgMHhCNyww eDQzLDB4NjUsMHhFOSwweEY3LDB4MkIsMHhBNSwweEYwLDB4QTMsMHg2NSwweDY4LDB4RTksMHhFNCwweDhCLDB4NUMsMHgwMywNCiAgICAgICAgICAgICAg ICAweDJELDB4MzYsMHhGRSwweDI4LDB4NEMsMHhEMSwweDNDLDB4M0QsMHhDMSwweDkwLDB4NzUsMHhGOSwweDZFLDB4MDIsMHhFMCwweDU4LA0KICAgICAg ICAgICAgICAgIDB4OTcsMHg2QSwweENBLDB4ODAsMHgwMiwweDQyLDB4M0YsMHg2QywweDE1LDB4ODUsMHg0RCwweDgzLDB4MjMsMHg2QSwweDk1LDB4OUUs DQogICAgICAgICAgICAgICAgMHgzOCwweDUyLDB4NTksMHgzOCwweDZBLDB4OTksMHhGMCwweEI1LDB4Q0QsMHg1MywweDdFLDB4MDgsMHg3QywweEI1LDB4 NTEsMHhEMywNCiAgICAgICAgICAgICAgICAweDhGLDB4QTMsMHgwRCwweEEwLDB4RkEsMHg4RCwweDg3LDB4M0MsMHhGQywweDU5LDB4MjEsMHhEOCwweDJF LDB4RDksMHg5NywweDhCLA0KICAgICAgICAgICAgICAgIDB4NDAsMHg2MCwweEIxLDB4RDcsMHgyQiwweDBBLDB4NkUsMHg2MCwweEI1LDB4NTAsMHhDQyww eDNDLDB4QjEsMHg1NywweEU0LDB4QjcsDQogICAgICAgICAgICAgICAgMHhEQywweDVBLDB4NEQsMHhFMSwweDVDLDB4RTAsMHg5NCwweDRDLDB4NUUsMHgy OCwweEZGLDB4RkEsMHg4MCwweDZBLDB4MTMsMHg1MywNCiAgICAgICAgICAgICAgICAweDUyLDB4REIsMHhGMywweDA0LDB4OTIsMHg0MywweDM4LDB4Qjks MHgxQiwweEQ5LDB4ODUsMHg1NCwweDdCLDB4MTQsMHhDNywweDg5LA0KICAgICAgICAgICAgICAgIDB4MTYsMHg4QSwweDRCLDB4ODIsMHhBMSwweDA4LDB4 MDIsMHg5OSwweDIzLDB4NDgsMHhERCwweDc1LDB4OUMsMHhDOCwweEMxLDB4Q0UsDQogICAgICAgICAgICAgICAgMHhCMCwweEQ3LDB4MUIsMHhEOCwweEZC LDB4MkQsMHhBNywweDJFLDB4NDcsMHhBNywweDE4LDB4NEIsMHhGNiwweDI5LDB4NjksMHg0NCwNCiAgICAgICAgICAgICAgICAweDMwLDB4MzMsMHhCQSww eEE3LDB4MUYsMHhDRSwweDk2LDB4OUUsMHg0MCwweEUxLDB4NDMsMHhGMCwweEUwLDB4MEQsMHgwQSwweDMyLA0KICAgICAgICAgICAgICAgIDB4QjQsMHhF RSwweEExLDB4QzMsMHg1RSwweDlCLDB4QzcsMHg3RiwweEY1LDB4OUQsMHhEOCwweEYyLDB4MEYsMHhEOSwweDhGLDB4QUQsDQogICAgICAgICAgICAgICAg MHg3NSwweDBBLDB4MDAsMHhENSwweDI1LDB4NDMsMHhGNywweEFFLDB4NTEsMHg3RiwweEI3LDB4REUsMHhCNywweEFELDB4RkIsMHhDRSwNCiAgICAgICAg ICAgICAgICAweDgzLDB4RTEsMHg4MSwweEZGLDB4REQsMHhBMiwweDc3LDB4RkUsMHhFQiwweDI3LDB4MUYsMHgxMCwweEZBLDB4ODIsMHgzNywweEY0LA0K ICAgICAgICAgICAgICAgIDB4N0UsMHhDQywweEUyLDB4QTEsMHg1OCwweEM4LDB4QUYsMHgxRCwweDFBLDB4ODEsMHgzMSwweDZFLDB4RjQsMHg4QiwweDYz LDB4MzQsDQogICAgICAgICAgICAgICAgMHhGMywweDA1LDB4MEYsMHhFMSwweENDLDB4MTUsMHhEQywweEE0LDB4MjgsMHg3QSwweDlFLDB4RUIsMHg2Miww eEQ4LDB4RDgsMHg4QywNCiAgICAgICAgICAgICAgICAweDg1LDB4RDcsMHgwNywweDg3LDB4OTAsMHgyRiwweEY3LDB4MUMsMHg1NiwweDg1LDB4MkYsMHhF RiwweDMyLDB4MzcsMHgwNywweEFCLA0KICAgICAgICAgICAgICAgIDB4QjAsMHhFNiwweEI1LDB4MDIsMHgxOSwweDM1LDB4QUYsMHhEQiwweEQ0LDB4QTIs MHg5QywweDM2LDB4ODAsMHhDNiwweERDLDB4ODIsDQogICAgICAgICAgICAgICAgMHgwOCwweEUwLDB4QzAsMHg1RiwweDNDLDB4NTksMHhBQSwweDRFLDB4 MjYsMHgwMywweDI5LDB4QjMsMHg2MiwweDU4LDB4NDEsMHg1OSwNCiAgICAgICAgICAgICAgICAweDNBLDB4MzcsMHg0MywweDM1LDB4RTMsMHg5RiwweDM0 LDB4RTIsMHhBMSwweDA0LDB4OTcsMHgxMiwweDlELDB4OEMsMHhBRCwweEY3LA0KICAgICAgICAgICAgICAgIDB4RkIsMHg4QywweEExLDB4QTIsMHhFOSww eEU0LDB4RUYsMHhEOSwweEM1LDB4RTUsMHhERiwweDBFLDB4QkYsMHg0QSwweEUwLDB4N0EsDQogICAgICAgICAgICAgICAgMHgxRSwweDEwLDB4NTAsMHg1 OCwweDYzLDB4NTEsMHhFMSwweEQ0LDB4RkUsMHg1NywweEIwLDB4OUUsMHhENywweERBLDB4OEMsMHhFRCwNCiAgICAgICAgICAgICAgICAweDdELDB4ODIs MHhBQywweDJGLDB4MjUsMHg1OCwweDBBLDB4NTgsMHhFNiwweEE0LDB4RjQsMHg1NywweDRCLDB4QTQsMHgxQiwweDY1LA0KICAgICAgICAgICAgICAgIDB4 QjksMHg0QSwweDg3LDB4NDYsMHhFQiwweDhDLDB4MEYsMHg5QSwweDQ4LDB4OTAsMHhGOSwweDlGLDB4NzYsMHg2OSwweDAzLDB4NzIsDQogICAgICAgICAg ICAgICAgMHg3NywweEVDLDB4QzEsMHg0MiwweDRDLDB4ODcsMHhEQiwweDBCLDB4M0MsMHhENCwweDc0LDB4RUYsMHhFNSwweDM0LDB4RTAsMHgzMiwNCiAg ICAgICAgICAgICAgICAweDQ1LDB4QjAsMHhGOCwweEFCLDB4RDUsMHgyNiwweDIxLDB4RDcsMHhEMiwweDk4LDB4NTQsMHg4RiwweDY0LDB4ODgsMHgyMCww eDJCLA0KICAgICAgICAgICAgICAgIDB4MTQsMHhFMywweDgyLDB4RDUsMHgyQSwweDRCLDB4OEYsMHg0RSwweDM1LDB4MjAsMHg4MiwweDdFLDB4MUIsMHhG RSwweEZBLDB4MkMsDQogICAgICAgICAgICAgICAgMHg3OSwweDZDLDB4NkUsMHg2NiwweDk0LDB4QkIsMHgwQSwweEVCLDB4QkEsMHhEOSwweDcwLDB4NjEs MHhFOSwweDQ3LDB4QjUsMHg4MiwNCiAgICAgICAgICAgICAgICAweEZDLDB4MTgsMHgzQywweDY2LDB4M0EsMHgwOSwweDJFLDB4MUYsMHg2MSwweDc0LDB4 Q0EsMHhDQiwweEY2LDB4N0EsMHg1MiwweDM3LA0KICAgICAgICAgICAgICAgIDB4MUQsMHhBQywweDhELDB4NjMsMHg2OSwweDg0LDB4OEUsMHhDNywweDcw LDB4NTksMHhERCwweDJELDB4OTEsMHgxRSwweEY3LDB4QjEsDQogICAgICAgICAgICAgICAgMHg1NiwweEVELDB4N0EsMHgwNiwweDlELDB4NUIsMHgzMyww eDE1LDB4REQsMHgzMSwweEQwLDB4RTYsMHgxNiwweDA3LDB4OUIsMHhBNSwNCiAgICAgICAgICAgICAgICAweDk0LDB4MDYsMHg3RCwweEMxLDB4RTksMHhE NiwweEM4LDB4QUYsMHhCNCwweDFFLDB4MkQsMHg4OCwweDA2LDB4QTcsMHg2MywweEI4LA0KICAgICAgICAgICAgICAgIDB4Q0YsMHhDOCwweEEyLDB4NkUs MHg4NCwweEIzLDB4OEQsMHhFNSwweDQ3LDB4RTYsMHgxMywweDYzLDB4OEUsMHhEMSwweDdGLDB4RDQsDQogICAgICAgICAgICAgICAgMHg4MSwweDQ0LDB4 MzgsMHhCRg0KDQokcnNhID0gTmV3LU9iamVjdCBTZWN1cml0eS5DcnlwdG9ncmFwaHkuUlNBQ3J5cHRvU2VydmljZVByb3ZpZGVyDQokcnNhLkltcG9ydENz cEJsb2IoJGtleSkNCiRTZXNzaW9uSWQgPSBbQ29udmVydF06OlRvQmFzZTY0U3RyaW5nKFtUZXh0LkVuY29kaW5nXTo6VW5pY29kZS5HZXRCeXRlcygkZW52 OlNlc3Npb25JZFN0ciArIFtjaGFyXTApKQ0KJFByb3BlcnRpZXNTdHIgPSAiT0EzeE9yaWdpbmFsUHJvZHVjdElkPTtPQTN4T3JpZ2luYWxQcm9kdWN0S2V5 PTtTZXNzaW9uSWQ9JFNlc3Npb25JZDtUaW1lU3RhbXBDbGllbnQ9MjAyMi0xMC0xMVQxMjowMDowMFoiDQokU2lnbmF0dXJlU3RyID0gU2lnblByb3BlcnRp ZXMgJFByb3BlcnRpZXNTdHIgJHJzYQ0KDQokeG1sID0gQCINCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PGdlbnVpbmVBdXRob3Jp emF0aW9uIHhtbG5zPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vRFJNL1NML0dlbnVpbmVBdXRob3JpemF0aW9uLzEuMCI+PHZlcnNpb24+MS4wPC92ZXJz aW9uPjxnZW51aW5lUHJvcGVydGllcyBvcmlnaW49InNwcGNsaWVudCI+PHByb3BlcnRpZXM+JFByb3BlcnRpZXNTdHI8L3Byb3BlcnRpZXM+PHNpZ25hdHVy ZXM+PHNpZ25hdHVyZSBuYW1lPSJjbGllbnRMb2NrYm94S2V5IiBtZXRob2Q9InJzYS1zaGEyNTYiPiRTaWduYXR1cmVTdHI8L3NpZ25hdHVyZT48L3NpZ25h dHVyZXM+PC9nZW51aW5lUHJvcGVydGllcz48L2dlbnVpbmVBdXRob3JpemF0aW9uPg0KIkANCltJTy5GaWxlXTo6V3JpdGVBbGxUZXh0KCIkZW52OlByb2dy YW1EYXRhXE1pY3Jvc29mdFxXaW5kb3dzXENsaXBTVkNcR2VudWluZVRpY2tldFxHZW51aW5lVGlja2V0IiwgKCR4bWwgLWpvaW4gIiIpLCBbU3lzdGVtLlRl eHQuRW5jb2RpbmddOjpBU0NJSSkNCjpzaWduOg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIEJl bG93IGNvZGUgaXMgdXNlZCB0byBnZXQgYWx0ZXJuYXRlIGVkaXRpb24gbmFtZSBhbmQga2V5IGlmIGN1cnJlbnQgZWRpdGlvbiBkb2Vzbid0IHN1cHBvcnQg SFdJRCBhY3RpdmF0aW9uDQoNCjo6ICAxc3QgY29sdW1uID0gQ3VycmVudCBTS1UgSUQNCjo6ICAybmQgY29sdW1uID0gQ3VycmVudCBFZGl0aW9uIE5hbWUN Cjo6ICAzcmQgY29sdW1uID0gQ3VycmVudCBFZGl0aW9uIEFjdGl2YXRpb24gSUQNCjo6ICA0dGggY29sdW1uID0gQWx0ZXJuYXRlIEVkaXRpb24gQWN0aXZh dGlvbiBJRA0KOjogIDV0aCBjb2x1bW4gPSBBbHRlcm5hdGUgRWRpdGlvbiBIV0lEIEtleQ0KOjogIDZ0aCBjb2x1bW4gPSBBbHRlcm5hdGUgRWRpdGlvbiBO YW1lDQo6OiAgU2VwYXJhdG9yICA9IF8NCg0KDQo6aHdpZGZhbGxiYWNrDQoNCnNldCBub3Rmb3VuZGFsdGFjdElEPQ0KaWYgJV9Ob0VkaXRpb25DaGFuZ2Ul PT0xIGV4aXQgL2INCg0KZm9yICUlIyBpbiAoDQoxMjVfRW50ZXJwcmlzZVMtMjAyMV9fX19fX19fX19fX19fX2NjZTlkMmRlLTk4ZWUtNGNlMi04MTEzLTIy MjYyMGM2NGEyN19lZDY1NTAxNi1hOWU4LTQ0MzQtOTVkOS00MzQ1MzUyYzI1NTJfUVBNNk4tN0oyV0otUDg4SEgtUDNZUkgtWVklZiU3NEhfSW9URW50ZXJw cmlzZVMtMjAyMQ0KMTI1X0VudGVycHJpc2VTLTIwMjRfX19fX19fX19fX19fX19mNmUyOTQyNi1hMjU2LTQzMTYtODhiZi1jYzViMGY5NWVjMGNfNmM0ZGUx YjgtMjRiYi00YzE3LTlhNzctN2I5Mzk0MTRjMjk4X0NHSzQyLUdZTjZZLVZEMjJCLUJYOThXLUo4JWYlSlhEX0lvVEVudGVycHJpc2VTLTIwMjQNCjEzOF9Q cm9mZXNzaW9uYWxTaW5nbGVMYW5ndWFnZV9fX19fYTQ4OTM4YWEtNjJmYS00OTY2LTlkNDQtOWYwNGRhM2Y3MmYyXzRkZTdjYjY1LWNkZjEtNGRlOS04YWU4 LWUzY2NlMjdiOWYyY19WSzdKRy1OUEhUTS1DOTdKTS05TVBHVC0zViVmJTY2VF9Qcm9mZXNzaW9uYWwNCjEzOV9Qcm9mZXNzaW9uYWxDb3VudHJ5U3BlY2lm aWNfX19fZjdhZjdkMDktNDBlNC00MTljLWE0OWItZWFlMzY2Njg5ZWJkXzRkZTdjYjY1LWNkZjEtNGRlOS04YWU4LWUzY2NlMjdiOWYyY19WSzdKRy1OUEhU TS1DOTdKTS05TVBHVC0zViVmJTY2VF9Qcm9mZXNzaW9uYWwNCjEzOV9Qcm9mZXNzaW9uYWxDb3VudHJ5U3BlY2lmaWMtWm5fMDFlYjg1MmMtNDI0ZC00MDYw LTk0YjgtYzEwZDc5OWQ3MzY0XzRkZTdjYjY1LWNkZjEtNGRlOS04YWU4LWUzY2NlMjdiOWYyY19WSzdKRy1OUEhUTS1DOTdKTS05TVBHVC0zViVmJTY2VF9Q cm9mZXNzaW9uYWwNCikgZG8gKA0KZm9yIC9mICJ0b2tlbnM9MS02IGRlbGltcz1fIiAlJUEgaW4gKCIlJSMiKSBkbyBpZiAlb3NTS1UlPT0lJUEgKA0KZWNo byAiIWFsbGFwcHMhICFhbHRhcHBsaXN0ISIgfCBmaW5kIC9pICIlJUMiICVudWwxJSAmJiAoDQplY2hvICIhYWxsYXBwcyEiIHwgZmluZCAvaSAiJSVEIiAl bnVsMSUgJiYgKA0Kc2V0IGFsdGtleT0lJUUNCnNldCBhbHRlZGl0aW9uPSUlRg0KKSB8fCAoDQpzZXQgYWx0ZWRpdGlvbj0lJUYNCnNldCBub3Rmb3VuZGFs dGFjdElEPTENCikNCikNCikNCikNCmV4aXQgL2INCg0KOisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQoNCjpPaG9v a0FjdGl2YXRpb24NCg0KOjogIFRvIGFjdGl2YXRlIE9mZmljZSB3aXRoIE9ob29rIGFjdGl2YXRpb24sIHJ1biB0aGUgc2NyaXB0IHdpdGggIi9PaG9vayIg cGFyYW1ldGVyIG9yIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0Kc2V0IF9hY3Q9MA0KDQo6OiAgVG8gcmVtb3ZlIE9ob29rIGFjdGl2YXRpb24sIHJ1 biB0aGUgc2NyaXB0IHdpdGggL09ob29rLVVuaW5zdGFsbCBwYXJhbWV0ZXIgb3IgY2hhbmdlIDAgdG8gMSBpbiBiZWxvdyBsaW5lDQpzZXQgX3JlbT0wDQoN Cjo6ICBJZiB2YWx1ZSBpcyBjaGFuZ2VkIGluIGFib3ZlIGxpbmVzIG9yIHBhcmFtZXRlciBpcyB1c2VkIHRoZW4gc2NyaXB0IHdpbGwgcnVuIGluIHVuYXR0 ZW5kZWQgbW9kZQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KY2xzDQpjb2xvciAwNw0KdGl0bGUgIE9o b29rIEFjdGl2YXRpb24gJW1hc3ZlciUNCg0Kc2V0IF9hcmdzPQ0Kc2V0IF9lbGV2PQ0Kc2V0IF91bmF0dGVuZGVkPTANCg0Kc2V0IF9hcmdzPSUqDQppZiBk ZWZpbmVkIF9hcmdzIHNldCBfYXJncz0lX2FyZ3M6Ij0lDQppZiBkZWZpbmVkIF9hcmdzICgNCmZvciAlJUEgaW4gKCVfYXJncyUpIGRvICgNCmlmIC9pICIl JUEiPT0iL09ob29rIiAgICAgICAgICAgICAgICAgIHNldCBfYWN0PTENCmlmIC9pICIlJUEiPT0iL09ob29rLVVuaW5zdGFsbCIgICAgICAgIHNldCBfcmVt PTENCmlmIC9pICIlJUEiPT0iLWVsIiAgICAgICAgICAgICAgICAgICAgIHNldCBfZWxldj0xDQopDQopDQoNCmZvciAlJUEgaW4gKCVfYWN0JSAlX3JlbSUp IGRvIChpZiAiJSVBIj09IjEiIHNldCBfdW5hdHRlbmRlZD0xKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Cg0KaWYgJV9yZW0lPT0xIGdvdG8gOm9oX3VuaW5zdGFsbA0KDQo6b2hfbWVudQ0KDQppZiAlX3VuYXR0ZW5kZWQlPT0wICgNCmNscw0KaWYgbm90IGRlZmlu ZWQgdGVybWluYWwgbW9kZSA3NiwgMjUNCnRpdGxlICBPaG9vayBBY3RpdmF0aW9uICVtYXN2ZXIlDQpjYWxsIDpvaF9jaGVja2FwcHMNCmVjaG86DQplY2hv Og0KZWNobzoNCmVjaG86DQppZiBkZWZpbmVkIGNoZWNrbmFtZXMgKGNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiICAgICAgICAgICAgICAgIENsb3NlIFsh Y2hlY2tuYW1lcyFdIGJlZm9yZSBwcm9jZWVkaW5nLi4uIikNCmVjaG8gICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18NCmVjaG86DQplY2hvICAgICAgICAgICAgICAgICBbMV0gSW5zdGFsbCBPaG9vayBPZmZpY2UgQWN0aXZhdGlvbg0KZWNo bzoNCmVjaG8gICAgICAgICAgICAgICAgIFsyXSBVbmluc3RhbGwgT2hvb2sNCmVjaG8gICAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fDQplY2hvOg0KZWNobyAgICAgICAgICAgICAgICAgWzNdIERvd25sb2FkIE9mZmljZQ0KZWNobzoNCmVjaG8gICAgICAg ICAgICAgICAgIFswXSAlX2V4aXRtc2clDQplY2hvICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fDQplY2hvOiANCmNhbGwgOmRrX2NvbG9yMiAlX1doaXRlJSAiICAgICAgICAgICAgICIgJV9HcmVlbiUgIkNob29zZSBhIG1lbnUgb3B0aW9u IHVzaW5nIHlvdXIga2V5Ym9hcmQgWzEsMiwzLDBdIg0KY2hvaWNlIC9DOjEyMzAgL04NCnNldCBfZWw9IWVycm9ybGV2ZWwhDQppZiAhX2VsIT09NCAgZXhp dCAvYg0KaWYgIV9lbCE9PTMgIHN0YXJ0ICVtYXMlZ2VudWluZS1pbnN0YWxsYXRpb24tbWVkaWEgJmdvdG8gOm9oX21lbnUNCmlmICFfZWwhPT0yICBnb3Rv IDpvaF91bmluc3RhbGwNCmlmICFfZWwhPT0xICBnb3RvIDpvaF9tZW51Mg0KZ290byA6b2hfbWVudQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOm9oX21lbnUyDQoNCmNscw0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgKA0KbW9kZSAxNDAsIDMyDQolcHNj JSAiJnskVz0kSG9zdC5VSS5SYXdVSS5XaW5kb3dTaXplOyRCPSRIb3N0LlVJLlJhd1VJLkJ1ZmZlclNpemU7JFcuSGVpZ2h0PTMyOyRCLkhlaWdodD0zMDA7 JEhvc3QuVUkuUmF3VUkuV2luZG93U2l6ZT0kVzskSG9zdC5VSS5SYXdVSS5CdWZmZXJTaXplPSRCO30iICVudWwlDQopDQp0aXRsZSAgT2hvb2sgQWN0aXZh dGlvbiAlbWFzdmVyJQ0KDQplY2hvOg0KZWNobyBJbml0aWFsaXppbmcuLi4NCmNhbGwgOmRrX2Noa21hbA0KDQppZiBub3QgZXhpc3QgJVN5c1BhdGglXCVf c2xleGUlICgNCiVlbGluZSUNCmVjaG8gWyVTeXNQYXRoJVwlX3NsZXhlJV0gZmlsZSBpcyBtaXNzaW5nLCBhYm9ydGluZy4uLg0KZWNobzoNCmlmIG5vdCBk ZWZpbmVkIHJlc3VsdHMgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJHbyBiYWNrIHRvIE1haW4gTWVudSwgc2VsZWN0IFRyb3VibGVzaG9vdCBhbmQgcnVu IERJU00gUmVzdG9yZSBhbmQgU0ZDIFNjYW4gb3B0aW9ucy4iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkFmdGVyIHRoYXQsIHJlc3RhcnQgc3lzdGVtIGFu ZCB0cnkgYWN0aXZhdGlvbiBhZ2Fpbi4iDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlDQpjYWxsIDpka19jb2xvcjIg JUJsdWUlICJJZiBpdCBzdGlsbCBzaG93cyB0aGUgc2FtZSBlcnJvciwgZG8gdGhpcyAtICIgJV9ZZWxsb3clICIgJW1hcyVpbi1wbGFjZV9yZXBhaXJfdXBn cmFkZSINCikNCmdvdG8gZGtfZG9uZQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0Kc2V0IHNwcD1T b2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3QNCnNldCBzcHM9U29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlDQoNCmNhbGwgOmRrX3JlZmxlY3Rpb24NCmNhbGwgOmRr X2NrZWNrd21pYw0KY2FsbCA6ZGtfcHJvZHVjdA0KY2FsbCA6ZGtfc3BwaXNzdWUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQoNCnNldCBlcnJvcj0NCg0KY2xzDQplY2hvOg0KY2FsbCA6ZGtfc2hvd29zaW5mbw0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCg0KZWNobyBJbml0aWF0aW5nIERpYWdub3N0aWMgVGVzdHMuLi4NCg0Kc2V0ICJfc2Vydj0lX3Nsc2VyJSBXaW5tZ210 Ig0KDQo6OiAgU29mdHdhcmUgUHJvdGVjdGlvbg0KOjogIFdpbmRvd3MgTWFuYWdlbWVudCBJbnN0cnVtZW50YXRpb24NCg0Kc2V0IG5vdHdpbmFjdD0xDQpz ZXQgb2hvb2thY3Q9MQ0KY2FsbCA6ZGtfZXJyb3JjaGVjaw0KDQpjYWxsIDpvaF9zZXRzcHANCg0KOjogIENoZWNrIHVuc3VwcG9ydGVkIG9mZmljZSB2ZXJz aW9ucw0KDQpzZXQgbzE0YzJyPQ0Kc2V0IG8xNnV3cD0NCg0Kc2V0IF82OD1IS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2UNCnNldCBfODY9SEtMTVxT T0ZUV0FSRVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcT2ZmaWNlDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV84NiVc MTQuMFxDb21tb25cSW5zdGFsbFJvb3QgL3YgUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlwqUGlja2VyLmRsbCIgKHNldCBvMTRtc2k9T2ZmaWNl IDIwMTAgTVNJICkNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzY4JVwxNC4wXENvbW1vblxJbnN0YWxsUm9vdCAv diBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0IG8xNG1zaT1PZmZpY2UgMjAxMCBNU0kgKQ0KJW51bCUgcmVnIHF1 ZXJ5ICVfNjglXDE0LjBcQ1ZIIC9mIENsaWNrMnJ1biAvayAgICAgICAgICYmIHNldCBvMTRjMnI9T2ZmaWNlIDIwMTAgQzJSIA0KJW51bCUgcmVnIHF1ZXJ5 ICVfODYlXDE0LjBcQ1ZIIC9mIENsaWNrMnJ1biAvayAgICAgICAgICYmIHNldCBvMTRjMnI9T2ZmaWNlIDIwMTAgQzJSIA0KDQppZiAld2luYnVpbGQlIEdF USAxMDI0MCAoDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIoR2V0LUFwcHhQYWNrYWdlIC1uYW1lICdNaWNyb3NvZnQuT2ZmaWNlLkRlc2t0 b3AnIHwgU2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgSW5zdGFsbExvY2F0aW9uKSIgJW51bDYlJykgZG8gKGlmIGV4aXN0ICIlJWFcSW50ZWdyYXRp b25cSW50ZWdyYXRvci5leGUiIHNldCBvMTZ1d3A9T2ZmaWNlIFVXUCApDQopDQoNCmlmIG5vdCAiJW8xNGMyciUlbzE2dXdwJSI9PSIiICgNCmVjaG86DQpj YWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgVW5zdXBwb3J0ZWQgT2ZmaWNlIEluc3RhbGwgICAgIFsgJW8xNGMyciUlbzE2dXdwJV0iDQppZiBub3Qg IiVvMTZ1d3AlIj09IiIgY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJVc2UgVFNmb3JnZSBvcHRpb24gdG8gYWN0aXZhdGUgaXQuIg0KKQ0KDQppZiAld2luYnVp bGQlIEdFUSAxMDI0MCAlcHNjJSAiR2V0LUFwcHhQYWNrYWdlIC1uYW1lICJNaWNyb3NvZnQuTWljcm9zb2Z0T2ZmaWNlSHViIiIgfCBmaW5kIC9pICJPZmZp Y2UiICVudWwxJSAmJiAoDQpzZXQgb2h1Yj0xDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAg Q2hlY2sgc3VwcG9ydGVkIG9mZmljZSB2ZXJzaW9ucw0KDQpjYWxsIDpvaF9nZXRwYXRoDQoNCnNjIHF1ZXJ5IENsaWNrVG9SdW5TdmMgJW51bCUNCnNldCBl cnJvcjE9JWVycm9ybGV2ZWwlDQoNCmlmIGRlZmluZWQgbzE2YzJyIGlmICVlcnJvcjElIEVRVSAxMDYwICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVj a2luZyBDbGlja1RvUnVuIFNlcnZpY2UgICAgICAgICAgICAgW05vdCBmb3VuZCwgT2ZmaWNlIDE2LjAgZmlsZXMgZm91bmRdIg0Kc2V0IG8xNmMycj0NCnNl dCBlcnJvcj0xDQopDQoNCnNjIHF1ZXJ5IE9mZmljZVN2YyAlbnVsJQ0Kc2V0IGVycm9yMj0lZXJyb3JsZXZlbCUNCg0KaWYgZGVmaW5lZCBvMTVjMnIgaWYg JWVycm9yMSUgRVFVIDEwNjAgaWYgJWVycm9yMiUgRVFVIDEwNjAgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIENsaWNrVG9SdW4gU2Vydmlj ZSAgICAgICAgICAgICBbTm90IGZvdW5kLCBPZmZpY2UgMTUuMCBmaWxlcyBmb3VuZF0iDQpzZXQgbzE1YzJyPQ0Kc2V0IGVycm9yPTENCikNCg0KaWYgIiVv MTZjMnIlJW8xNWMyciUlbzE2bXNpJSVvMTVtc2klJW8xNG1zaSUiPT0iIiAoDQpzZXQgZXJyb3I9MQ0KZWNobzoNCmlmIG5vdCAiJW8xNGMyciUlbzE2dXdw JSI9PSIiICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBTdXBwb3J0ZWQgT2ZmaWNlIEluc3RhbGwgICAgICAgW05vdCBGb3VuZF0iDQopIGVs c2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEluc3RhbGxlZCBPZmZpY2UgICAgICAgICAgICAgICBbTm90IEZvdW5kXSINCikNCg0KaWYg ZGVmaW5lZCBvaHViICgNCmVjaG86DQplY2hvIFlvdSBvbmx5IGhhdmUgdGhlIE9mZmljZSBEYXNoYm9hcmQgYXBwIGluc3RhbGxlZDsgeW91IG5lZWQgdG8g aW5zdGFsbCB0aGUgZnVsbCB2ZXJzaW9uIG9mIE9mZmljZS4NCikNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiRG93bmxvYWQgYW5kIGluc3RhbGwgT2ZmaWNl IGZyb20gdGhlIFVSTCBiZWxvdywgdGhlbiB0cnkgYWdhaW4uIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVnZW51aW5lLWluc3RhbGxhdGlvbi1tZWRpYQ0K Y2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICIlbWFzJWdlbnVpbmUtaW5zdGFsbGF0aW9uLW1lZGlhIg0KZ290byBka19kb25lDQopDQoNCnNldCBtdWx0aW9m ZmljZT0NCmlmIG5vdCAiJW8xNmMyciUlbzE1YzJyJSVvMTZtc2klJW8xNW1zaSUlbzE0bXNpJSI9PSIxIiBzZXQgbXVsdGlvZmZpY2U9MQ0KaWYgbm90ICIl bzE0YzJyJSVvMTZ1d3AlIj09IiIgc2V0IG11bHRpb2ZmaWNlPTENCg0KaWYgZGVmaW5lZCBtdWx0aW9mZmljZSAoDQpjYWxsIDpka19jb2xvciAlR3JheSUg IkNoZWNraW5nIE11bHRpcGxlIE9mZmljZSBJbnN0YWxsICAgICAgICBbRm91bmQsIGl0cyByZWNvbW1lbmRlZCB0byBpbnN0YWxsIG9ubHkgb25lIHZlcnNp b25dIg0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIFdpbmRvd3MgU2VydmVyDQoN CnNldCB3aW5zZXJ2ZXI9DQpyZWcgcXVlcnkgIkhLTE1cU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcUHJvZHVjdE9wdGlvbnMiIC92IFByb2R1 Y3RUeXBlICVudWwyJSB8IGZpbmQgL2kgIldpbk5UIiAlbnVsMSUgfHwgc2V0IHdpbnNlcnZlcj0xDQppZiBub3QgZGVmaW5lZCB3aW5zZXJ2ZXIgKA0KcmVn IHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uIiAvdiBFZGl0aW9uSUQgJW51bDIlIHwgZmluZCAvaSAi U2VydmVyIiAlbnVsMSUgJiYgc2V0IHdpbnNlcnZlcj0xDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K DQo6OiBDaGVjayBTbWFydCBBcHAgQ29udHJvbA0KDQpzZXQgInNhY3N0YXRlPSINCmlmICV3aW5idWlsZCUgR0VRIDIyNjIxICgNCmZvciAvZiAidG9rZW5z PTMiICUlYSBpbiAoJ3JlZyBxdWVyeSAiSEtMTVxTWVNURU1cQ3VycmVudENvbnRyb2xTZXRcQ29udHJvbFxDSVxQb2xpY3kiIC92IFZlcmlmaWVkQW5kUmVw dXRhYmxlUG9saWN5U3RhdGUgJW51bDYlJykgZG8gc2V0ICJzYWNzdGF0ZT0lJWEiDQopDQppZiBkZWZpbmVkIHNhY3N0YXRlICgNCmlmICIlc2Fjc3RhdGUl Ij09IjB4MSIgKA0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVja2luZyBTbWFydCBBcHAgQ29udHJvbCBTdGF0ZSAgICAgICAgW0VuYWJsZWRdIg0KY2Fs bCA6ZGtfY29sb3IgJUJsdWUlICJTbWFydCBBcHAgQ29udHJvbCBtYXkgcHJldmVudCB5b3UgZnJvbSBvcGVuaW5nIE9mZmljZSBhZnRlciBPaG9vayBhY3Rp dmF0aW9uLiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiWW91IHdpbGwgbmVlZCB0byBkaXNhYmxlIGl0IGZyb20gdGhlIFdpbmRvd3MgRGVmZW5kZXIgc2V0 dGluZ3MgaWYgaXQgZG9lcy4iDQopIGVsc2UgaWYgIiVzYWNzdGF0ZSUiPT0iMHgyIiAoDQpjYWxsIDpka19jb2xvciAlR3JheSUgIkNoZWNraW5nIFNtYXJ0 IEFwcCBDb250cm9sIFN0YXRlICAgICAgICBbRXZhbHVhdGlvbl0iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlNtYXJ0IEFwcCBDb250cm9sIG1heSBwcmV2 ZW50IHlvdSBmcm9tIG9wZW5pbmcgT2ZmaWNlIGluIHRoZSBmdXR1cmUgaWYgaXQgZW5hYmxlcyBpdHNlbGYgYWZ0ZXIgdGhlIGV2YWx1YXRpb24gcGVyaW9k LiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZGlzYWJsZSBpdCBmcm9tIHRoZSBXaW5kb3dzIERlZmVuZGVy IHNldHRpbmdzLiINCikNCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBQcm9jZXNzIE9mZmlj ZSAxNS4wIEMyUg0KDQppZiBub3QgZGVmaW5lZCBvMTVjMnIgZ290byA6c3RhcnRvMTZjMnINCg0KY2FsbCA6b2hfcmVzZXQNCmNhbGwgOmRrX2FjdGlkcyAw ZmYxY2UxNS1hOTg5LTQ3OWQtYWY0Ni1mMjc1YzYzNzA2NjMNCg0Kc2V0IG9WZXI9MTUNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJl ZyBxdWVyeSAlbzE1YzJyX3JlZyUgL3YgSW5zdGFsbFBhdGgiICVudWw2JScpIGRvIChzZXQgIl9vUm9vdD0lJWJccm9vdCIpDQpmb3IgL2YgInNraXA9MiB0 b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8xNWMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUGxhdGZvcm0iICVudWw2JScpIGRvIChzZXQgIl9v QXJjaD0lJWIiKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFZl cnNpb25Ub1JlcG9ydCIgJW51bDYlJykgZG8gKHNldCAiX3ZlcnNpb249JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBx dWVyeSAlbzE1YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBQcm9kdWN0UmVsZWFzZUlkcyIgJW51bDYlJykgZG8gKHNldCAiX3ByaWRzPSVvMTVjMnJfcmVn JVxDb25maWd1cmF0aW9uIC92IFByb2R1Y3RSZWxlYXNlSWRzIiAmIHNldCAiX2NvbmZpZz0lbzE1YzJyX3JlZyVcQ29uZmlndXJhdGlvbiIpDQppZiBub3Qg ZGVmaW5lZCBfb0FyY2ggICBmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8xNWMycl9yZWclXHByb3BlcnR5QmFnIC92 IFBsYXRmb3JtIiAlbnVsNiUnKSBkbyAoc2V0ICJfb0FyY2g9JSViIikNCmlmIG5vdCBkZWZpbmVkIF92ZXJzaW9uIGZvciAvZiAic2tpcD0yIHRva2Vucz0y KiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE1YzJyX3JlZyVccHJvcGVydHlCYWcgL3YgdmVyc2lvbiIgJW51bDYlJykgZG8gKHNldCAiX3ZlcnNpb249JSVi IikNCmlmIG5vdCBkZWZpbmVkIF9wcmlkcyAgIGZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE1YzJyX3JlZyVccHJv cGVydHlCYWcgL3YgUHJvZHVjdFJlbGVhc2VJZCIgJW51bDYlJykgZG8gKHNldCAiX3ByaWRzPSVvMTVjMnJfcmVnJVxwcm9wZXJ0eUJhZyAvdiBQcm9kdWN0 UmVsZWFzZUlkIiAmIHNldCAiX2NvbmZpZz0lbzE1YzJyX3JlZyVccHJvcGVydHlCYWciKQ0KDQplY2hvICIlbzE1YzJyX3JlZyUiIHwgZmluZCAvaSAiV293 NjQzMk5vZGUiICVudWwxJSAmJiAoc2V0IF90b2s9MTApIHx8IChzZXQgX3Rvaz05KQ0KZm9yIC9mICJ0b2tlbnM9JV90b2slIGRlbGltcz1cIiAlJWEgaW4g KCdyZWcgcXVlcnkgJW8xNWMycl9yZWclXFByb2R1Y3RSZWxlYXNlSURzXEFjdGl2ZSAlbnVsNiUgXnwgZmluZHN0ciAvaSAiUmV0YWlsIFZvbHVtZSInKSBk byAoDQplY2hvICIhX29JZHMhIiB8IGZpbmQgL2kgIiAlJWEgIiAlbnVsMSUgfHwgKHNldCAiX29JZHM9ICFfb0lkcyEgJSVhICIpDQopDQoNCnNldCAiX29M UGF0aD0lX29Sb290JVxMaWNlbnNlcyINCnNldCAiX29JbnRlZ3JhdG9yPSVfb1Jvb3QlXGludGVncmF0aW9uXGludGVncmF0b3IuZXhlIg0KDQppZiAvaSAi JV9vQXJjaCUiPT0ieDY0IiAoc2V0ICJfaG9va1BhdGg9JV9vUm9vdCVcdmZzXFN5c3RlbSIgICAgJiBzZXQgIl9ob29rPXNwcGM2NC5kbGwiKQ0KaWYgL2kg IiVfb0FyY2glIj09Ing4NiIgKHNldCAiX2hvb2tQYXRoPSVfb1Jvb3QlXHZmc1xTeXN0ZW1YODYiICYgc2V0ICJfaG9vaz1zcHBjMzIuZGxsIikNCg0KY2Fs bCA6b2hfcHBjcGF0aA0KDQplY2hvOg0KZWNobyBBY3RpdmF0aW5nIE9mZmljZS4uLiAgICAgICAgICAgICAgICAgICAgW0MyUiBefCAlX3ZlcnNpb24lIF58 ICVfb0FyY2glXQ0KDQppZiBub3QgZGVmaW5lZCBfb0lkcyAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgSW5zdGFsbGVkIFByb2R1Y3RzICAg ICAgICAgICAgIFtQcm9kdWN0IElEcyBub3QgZm91bmQuIEFib3J0aW5nIGFjdGl2YXRpb24uLi5dIg0Kc2V0IGVycm9yPTENCmdvdG8gOnN0YXJ0bzE2YzJy DQopDQoNCmlmIGRlZmluZWQgbm9Pc3BwYyAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgT1NQUEMuRExMICAgICAgICAgICAgICAgICAgICAg IFtOb3QgZm91bmQuIEFib3J0aW5nIGFjdGl2YXRpb24uLi5dIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQpzZXQgZXJyb3I9MQ0KZ290 byA6c3RhcnRvMTZjMnINCikNCg0KY2FsbCA6b2hfZXhwaXJlZHByZXZpZXcgMjAxMw0KY2FsbCA6b2hfZml4cHJpZHMNCmNhbGwgOm9oX3Byb2Nlc3MNCmlm IGRlZmluZWQgaXNPc3BwICgNCmNhbGwgOm9oX2hvb2tpbnN0YWxsX29zcHANCikgZWxzZSAoDQpjYWxsIDpvaF9ob29raW5zdGFsbA0KKQ0KDQo6Oj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnN0YXJ0bzE2YzJyDQoNCjo6ICBQcm9jZXNzIE9mZmljZSAxNi4wIEMyUg0K DQppZiBub3QgZGVmaW5lZCBvMTZjMnIgZ290byA6c3RhcnRtc2kNCg0KY2FsbCA6b2hfcmVzZXQNCmNhbGwgOmRrX2FjdGlkcyAwZmYxY2UxNS1hOTg5LTQ3 OWQtYWY0Ni1mMjc1YzYzNzA2NjMNCg0Kc2V0IG9WZXI9MTYNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJy X3JlZyUgL3YgSW5zdGFsbFBhdGgiICVudWw2JScpIGRvIChzZXQgIl9vUm9vdD0lJWJccm9vdCIpDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBp biAoJyJyZWcgcXVlcnkgJW8xNmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUGxhdGZvcm0iICVudWw2JScpIGRvIChzZXQgIl9vQXJjaD0lJWIiKQ0KZm9y IC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFZlcnNpb25Ub1JlcG9ydCIg JW51bDYlJykgZG8gKHNldCAiX3ZlcnNpb249JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3Jl ZyVcQ29uZmlndXJhdGlvbiAvdiBBdWRpZW5jZURhdGEiICVudWw2JScpIGRvIChzZXQgIl9BdWRpZW5jZURhdGE9XnwgJSViICIpDQpmb3IgL2YgInNraXA9 MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8xNmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUHJvZHVjdFJlbGVhc2VJZHMiICVudWw2JScp IGRvIChzZXQgIl9wcmlkcz0lbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBQcm9kdWN0UmVsZWFzZUlkcyIgJiBzZXQgIl9jb25maWc9JW8xNmMycl9y ZWclXENvbmZpZ3VyYXRpb24iKQ0KDQplY2hvICIlbzE2YzJyX3JlZyUiIHwgZmluZCAvaSAiV293NjQzMk5vZGUiICVudWwxJSAmJiAoc2V0IF90b2s9OSkg fHwgKHNldCBfdG9rPTgpDQpmb3IgL2YgInRva2Vucz0lX3RvayUgZGVsaW1zPVwiICUlYSBpbiAoJ3JlZyBxdWVyeSAiJW8xNmMycl9yZWclXFByb2R1Y3RS ZWxlYXNlSURzIiAvcyAvZiAiLjE2IiAvayAlbnVsNiUgXnwgZmluZHN0ciAvaSAiUmV0YWlsIFZvbHVtZSInKSBkbyAoDQplY2hvICIhX29JZHMhIiB8IGZp bmQgL2kgIiAlJWEgIiAlbnVsMSUgfHwgKHNldCAiX29JZHM9ICFfb0lkcyEgJSVhICIpDQopDQpzZXQgX29JZHM9JV9vSWRzOi4xNj0lDQpzZXQgX28xNmMy cklkcz0lX29JZHMlDQoNCnNldCAiX29MUGF0aD0lX29Sb290JVxMaWNlbnNlczE2Ig0Kc2V0ICJfb0ludGVncmF0b3I9JV9vUm9vdCVcaW50ZWdyYXRpb25c aW50ZWdyYXRvci5leGUiDQoNCmlmIC9pICIlX29BcmNoJSI9PSJ4NjQiIChzZXQgIl9ob29rUGF0aD0lX29Sb290JVx2ZnNcU3lzdGVtIiAgICAmIHNldCAi X2hvb2s9c3BwYzY0LmRsbCIpDQppZiAvaSAiJV9vQXJjaCUiPT0ieDg2IiAoc2V0ICJfaG9va1BhdGg9JV9vUm9vdCVcdmZzXFN5c3RlbVg4NiIgJiBzZXQg Il9ob29rPXNwcGMzMi5kbGwiKQ0KDQpjYWxsIDpvaF9wcGNwYXRoDQoNCmVjaG86DQplY2hvIEFjdGl2YXRpbmcgT2ZmaWNlLi4uICAgICAgICAgICAgICAg ICAgICBbQzJSIF58ICVfdmVyc2lvbiUgJV9BdWRpZW5jZURhdGElXnwgJV9vQXJjaCVdDQoNCmlmIG5vdCBkZWZpbmVkIF9vSWRzICgNCmNhbGwgOmRrX2Nv bG9yICVSZWQlICJDaGVja2luZyBJbnN0YWxsZWQgUHJvZHVjdHMgICAgICAgICAgICAgW1Byb2R1Y3QgSURzIG5vdCBmb3VuZC4gQWJvcnRpbmcgYWN0aXZh dGlvbi4uLl0iDQpzZXQgZXJyb3I9MQ0KZ290byA6c3RhcnRtc2kNCikNCg0KaWYgZGVmaW5lZCBub09zcHBjICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJD aGVja2luZyBPU1BQQy5ETEwgICAgICAgICAgICAgICAgICAgICAgW05vdCBmb3VuZC4gQWJvcnRpbmcgYWN0aXZhdGlvbi4uLl0iDQpjYWxsIDpka19jb2xv ciAlQmx1ZSUgIiVfZml4bXNnJSINCnNldCBlcnJvcj0xDQpnb3RvIDpzdGFydG1zaQ0KKQ0KDQpjYWxsIDpvaF9leHBpcmVkcHJldmlldyAyMDE2IDIwMTkg MjAyMSAyMDI0DQpjYWxsIDpvaF9maXhwcmlkcw0KY2FsbCA6b2hfcHJvY2Vzcw0KaWYgZGVmaW5lZCBpc09zcHAgKA0KY2FsbCA6b2hfaG9va2luc3RhbGxf b3NwcA0KKSBlbHNlICgNCmNhbGwgOm9oX2hvb2tpbnN0YWxsDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KDQo6OiAgT2xkIHZlcnNpb24gb2YgT2ZmaWNlIHdpdGggc3Vic2NyaXB0aW9uIGxpY2Vuc2Uga2V5IG1heSBzaG93IGEgYmFubmVyIHRvIHNpZ24gaW4g dG8gZml4IGxpY2Vuc2UgaXNzdWUuDQo6OiAgQWx0aG91Z2ggc2NyaXB0IGFwcGxpZXMgYSBSZXNpbGllbmN5IHJlZ2lzdHJ5IGVudHJ5IHRvIGZpeCB0aGF0 IGJ1dCBpdCBkb2Vzbid0IHdvcmsgb24gb2xkIG9mZmljZSB2ZXJzaW9ucy4NCjo6ICBCZWxvdyBjb2RlIGNoZWNrcyB0aGF0IGNvbmRpdGlvbiBhbmQgaW5m b3JtcyB0aGUgdXNlciB0byB1cGRhdGUgdGhlIE9mZmljZS4NCg0KaWYgZGVmaW5lZCBfc3VibGljICgNCmlmIG5vdCBleGlzdCAiJV9vTFBhdGglXFdvcmQy MDIxVkxfS01TX0NsaWVudF9BRSoueHJtLW1zIiAoDQpjYWxsIDpka19jb2xvciAlR3JheSUgIkNoZWNraW5nIE9sZCBPZmZpY2UgV2l0aCBTdWIgTGljZW5z ZSAgICBbRm91bmQuIFVwZGF0ZSBPZmZpY2UsIG90aGVyd2lzZSwgaXQgbWF5IHNob3cgYSBsaWNlbnNpbmcgaXNzdWUtcmVsYXRlZCBiYW5uZXIuXSINCikN CikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBtYXNze31ncmF2ZXtkb3R9ZGV2L29mZmljZS1s aWNlbnNlLWlzLW5vdC1nZW51aW5lDQo6OiAgQWRkIHJlZ2lzdHJ5IGtleXMgZm9yIHZvbHVtZSBwcm9kdWN0cyBzbyB0aGF0ICdub24tZ2VudWluZScgYmFu bmVyIHdvbid0IGFwcGVhciANCjo6ICBTY3JpcHQgYWxyZWFkeSBpcyB1c2luZyBNQUsgaW5zdGVhZCBvZiBHVkxLIHNvIGl0IHdvbid0IGFwcGVhciBhbnl3 YXksIGJ1dCByZWdpc3RyeSBrZXlzIGFyZSBhZGRlZCBpbmNhc2UgT2ZmaWNlIGluc3RhbGxzIGRlZmF1bHQgR1ZMSyBncmFjZSBrZXkgZm9yIHZvbHVtZSBw cm9kdWN0cw0KDQpzZXQgImttc2tleT1IS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlv blBsYXRmb3JtXDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2MyINCmVjaG8gIiVfb0lkcyUiIHwgZmluZCAvaSAiVm9sdW1lIiAlbnVsMSUg JiYgKA0KaWYgJXdpbmJ1aWxkJSBHRVEgOTIwMCAoDQppZiBub3QgIiVvc2FyY2glIj09Ing4NiIgKA0KcmVnIGRlbGV0ZSAiJWttc2tleSUiIC9mIC9yZWc6 MzIgJW51bCUNCnJlZyBhZGQgIiVrbXNrZXklIiAvZiAvdiBLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUgL3QgUkVHX1NaIC9kICIxMC4wLjAuMTAiIC9yZWc6 MzIgJW51bCUNCikNCnJlZyBkZWxldGUgIiVrbXNrZXklIiAvZiAlbnVsJQ0KcmVnIGFkZCAiJWttc2tleSUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2aWNl TmFtZSAvdCBSRUdfU1ogL2QgIjEwLjAuMC4xMCIgJW51bCUNCmVjaG8gQWRkaW5nIGEgUmVnaXN0cnkgdG8gUHJldmVudCBCYW5uZXIgICAgIFtTdWNjZXNz ZnVsXQ0KKQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnN0YXJ0bXNpDQoNCmlmIGRlZmluZWQg bzE0bXNpIGNhbGwgOm9oX3NldHNwcCAxNA0KaWYgZGVmaW5lZCBvMTRtc2kgY2FsbCA6b2hfcHJvY2Vzc21zaSAxNCAlbzE0bXNpX3JlZyUNCmNhbGwgOm9o X3NldHNwcA0KaWYgZGVmaW5lZCBvMTVtc2kgY2FsbCA6b2hfcHJvY2Vzc21zaSAxNSAlbzE1bXNpX3JlZyUNCmlmIGRlZmluZWQgbzE2bXNpIGNhbGwgOm9o X3Byb2Nlc3Ntc2kgMTYgJW8xNm1zaV9yZWclDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjYWxsIDpv aF9jbGVhcmJsb2NrDQpjYWxsIDpvaF91bmluc3RrZXkNCmNhbGwgOm9oX2xpY3JlZnJlc2gNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09DQoNCmVjaG86DQppZiBub3QgZGVmaW5lZCBlcnJvciAoDQpjYWxsIDpka19jb2xvciAlR3JlZW4lICJPZmZpY2UgaXMgcGVybWFu ZW50bHkgYWN0aXZhdGVkLiINCmlmIGRlZmluZWQgb2h1YiBjYWxsIDpka19jb2xvciAlR3JheSUgIk9mZmljZSBhcHBzIHN1Y2ggYXMgV29yZCwgRXhjZWwg YXJlIGFjdGl2YXRlZCwgdXNlIHRoZW0gZGlyZWN0bHkuIElnbm9yZSAnQnV5JyBidXR0b24gaW4gT2ZmaWNlIGRhc2hib2FyZCBhcHAuIg0KZWNobyBIZWxw OiAlbWFzJXRyb3VibGVzaG9vdA0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJTb21lIGVycm9ycyB3ZXJlIGRldGVjdGVkLiINCmlmIG5vdCBk ZWZpbmVkIGllcnJvciBpZiBub3QgZGVmaW5lZCBzaG93Zml4IGNhbGwgOmRrX2NvbG9yICVCbHVlJSAiJV9maXhtc2clIg0Kc2V0IGZpeGVzPSVmaXhlcyUg JW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1h cyV0cm91Ymxlc2hvb3QiDQopDQoNCmdvdG8gOmRrX2RvbmUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoN CjpvaF91bmluc3RhbGwNCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDE0NSwgMzINCnRpdGxlICBVbmluc3RhbGwgT2hvb2sgQWN0aXZh dGlvbiAlbWFzdmVyJQ0KDQpzZXQgX3ByZXNlbnQ9DQpzZXQgX3VuZXJyb3I9DQpjYWxsIDpvaF9yZXNldA0KY2FsbCA6b2hfZ2V0cGF0aA0KDQplY2hvOg0K ZWNobyBVbmluc3RhbGxpbmcgT2hvb2sgYWN0aXZhdGlvbi4uLg0KZWNobzoNCg0KaWYgZGVmaW5lZCBvMTZjMnJfcmVnIChmb3IgL2YgInNraXA9MiB0b2tl bnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8xNmMycl9yZWclIC92IEluc3RhbGxQYXRoIiAlbnVsNiUnKSBkbyAoc2V0ICJfMTZDSG9vaz0lJWJccm9v dFx2ZnMiKSkNCmlmIGRlZmluZWQgbzE1YzJyX3JlZyAoZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVn JSAvdiBJbnN0YWxsUGF0aCIgJW51bDYlJykgZG8gKHNldCAiXzE1Q0hvb2s9JSViXHJvb3RcdmZzIikpDQppZiBkZWZpbmVkIG8xNm1zaV9yZWcgKGZvciAv ZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2bXNpX3JlZyVcQ29tbW9uXEluc3RhbGxSb290IC92IFBhdGgiICVudWw2JScp IGRvIChzZXQgIl8xNk1Ib29rPSUlYiIpKQ0KaWYgZGVmaW5lZCBvMTVtc2lfcmVnIChmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcg cXVlcnkgJW8xNW1zaV9yZWclXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyAoc2V0ICJfMTVNSG9vaz0lJWIiKSkNCmlmIGRlZmlu ZWQgbzE0bXNpX3JlZyAoZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTRtc2lfcmVnJVxDb21tb25cSW5zdGFsbFJv b3QgL3YgUGF0aCIgJW51bDYlJykgZG8gKHNldCAiXzE0TUhvb2s9JSViIikpDQoNCmlmIGRlZmluZWQgXzE2Q0hvb2sgKGlmIGV4aXN0ICIlXzE2Q0hvb2sl XFN5c3RlbVxzcHBjKmRsbCIgICAgKHNldCBfcHJlc2VudD0xJiBkZWwgL3MgL2YgL3EgIiVfMTZDSG9vayVcU3lzdGVtXHNwcGMqZGxsIiAgICAmIGlmIGV4 aXN0ICIlXzE2Q0hvb2slXFN5c3RlbVxzcHBjKmRsbCIgICAgc2V0IF91bmVycm9yPTEpKQ0KaWYgZGVmaW5lZCBfMTZDSG9vayAoaWYgZXhpc3QgIiVfMTZD SG9vayVcU3lzdGVtWDg2XHNwcGMqZGxsIiAoc2V0IF9wcmVzZW50PTEmIGRlbCAvcyAvZiAvcSAiJV8xNkNIb29rJVxTeXN0ZW1YODZcc3BwYypkbGwiICYg aWYgZXhpc3QgIiVfMTZDSG9vayVcU3lzdGVtWDg2XHNwcGMqZGxsIiBzZXQgX3VuZXJyb3I9MSkpDQppZiBkZWZpbmVkIF8xNUNIb29rIChpZiBleGlzdCAi JV8xNUNIb29rJVxTeXN0ZW1cc3BwYypkbGwiICAgIChzZXQgX3ByZXNlbnQ9MSYgZGVsIC9zIC9mIC9xICIlXzE1Q0hvb2slXFN5c3RlbVxzcHBjKmRsbCIg ICAgJiBpZiBleGlzdCAiJV8xNUNIb29rJVxTeXN0ZW1cc3BwYypkbGwiICAgIHNldCBfdW5lcnJvcj0xKSkNCmlmIGRlZmluZWQgXzE1Q0hvb2sgKGlmIGV4 aXN0ICIlXzE1Q0hvb2slXFN5c3RlbVg4NlxzcHBjKmRsbCIgKHNldCBfcHJlc2VudD0xJiBkZWwgL3MgL2YgL3EgIiVfMTVDSG9vayVcU3lzdGVtWDg2XHNw cGMqZGxsIiAmIGlmIGV4aXN0ICIlXzE1Q0hvb2slXFN5c3RlbVg4NlxzcHBjKmRsbCIgc2V0IF91bmVycm9yPTEpKQ0KaWYgZGVmaW5lZCBfMTZNSG9vayAo aWYgZXhpc3QgIiVfMTZNSG9vayVzcHBjKmRsbCIgICAgICAgICAgICAoc2V0IF9wcmVzZW50PTEmIGRlbCAvcyAvZiAvcSAiJV8xNk1Ib29rJXNwcGMqZGxs IiAgICAgICAgICAgICYgaWYgZXhpc3QgIiVfMTZNSG9vayVzcHBjKmRsbCIgICAgICAgICAgICBzZXQgX3VuZXJyb3I9MSkpDQppZiBkZWZpbmVkIF8xNU1I b29rIChpZiBleGlzdCAiJV8xNU1Ib29rJXNwcGMqZGxsIiAgICAgICAgICAgIChzZXQgX3ByZXNlbnQ9MSYgZGVsIC9zIC9mIC9xICIlXzE1TUhvb2slc3Bw YypkbGwiICAgICAgICAgICAgJiBpZiBleGlzdCAiJV8xNU1Ib29rJXNwcGMqZGxsIiAgICAgICAgICAgIHNldCBfdW5lcnJvcj0xKSkNCmlmIGRlZmluZWQg XzE0TUhvb2sgKGlmIGV4aXN0ICIlXzE0TUhvb2slc3BwYypkbGwiICAgICAgICAgICAgKHNldCBfcHJlc2VudD0xJiBkZWwgL3MgL2YgL3EgIiVfMTRNSG9v ayVzcHBjKmRsbCIgICAgICAgICAgICAmIGlmIGV4aXN0ICIlXzE0TUhvb2slc3BwYypkbGwiICAgICAgICAgICAgc2V0IF91bmVycm9yPTEpKQ0KDQpmb3Ig JSUjIGluICgxNCAxNSAxNikgZG8gKA0KZm9yICUlQSBpbiAoIiVQcm9ncmFtRmlsZXMlIiAiJVByb2dyYW1XNjQzMiUiICIlUHJvZ3JhbUZpbGVzKHg4Nikl IikgZG8gKA0KaWYgZXhpc3QgIiUlfkFcTWljcm9zb2Z0IE9mZmljZVxPZmZpY2UlJSNcc3BwYypkbGwiIChzZXQgX3ByZXNlbnQ9MSYgZGVsIC9zIC9mIC9x ICIlJX5BXE1pY3Jvc29mdCBPZmZpY2VcT2ZmaWNlJSUjXHNwcGMqZGxsIiAmIGlmIGV4aXN0ICIlJX5BXE1pY3Jvc29mdCBPZmZpY2VcT2ZmaWNlJSUjXHNw cGMqZGxsIiBzZXQgX3VuZXJyb3I9MSkNCikNCikNCg0KZm9yICUlIyBpbiAoU3lzdGVtIFN5c3RlbVg4NikgZG8gKA0KZm9yICUlRyBpbiAoIk9mZmljZSAx NSIgIk9mZmljZSIpIGRvICgNCmZvciAlJUEgaW4gKCIlUHJvZ3JhbUZpbGVzJSIgIiVQcm9ncmFtVzY0MzIlIiAiJVByb2dyYW1GaWxlcyh4ODYpJSIpIGRv ICgNCmlmIGV4aXN0ICIlJX5BXE1pY3Jvc29mdCAlJX5HXHJvb3RcdmZzXCUlI1xzcHBjKmRsbCIgKHNldCBfcHJlc2VudD0xJiBkZWwgL3MgL2YgL3EgIiUl fkFcTWljcm9zb2Z0ICUlfkdccm9vdFx2ZnNcJSUjXHNwcGMqZGxsIiAmIGlmIGV4aXN0ICIlJX5BXE1pY3Jvc29mdCAlJX5HXHJvb3RcdmZzXCUlI1xzcHBj KmRsbCIgc2V0IF91bmVycm9yPTEpDQopDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpmb3IgJSUjIGluIChPU1BQ Qy5ETEwgc3BwY3MuZGxsKSBkbyAoDQpmb3IgJSVBIGluICgiJUNvbW1vblByb2dyYW1GaWxlcyUiICIlQ29tbW9uUHJvZ3JhbVc2NDMyJSIgIiVDb21tb25Q cm9ncmFtRmlsZXMoeDg2KSUiKSBkbyAoDQpmb3IgJSVHIGluICgiJSV+QVxNaWNyb3NvZnQgU2hhcmVkXE9mZmljZVNvZnR3YXJlUHJvdGVjdGlvblBsYXRm b3JtXCUlIyIpIGRvICgNCnNldCBzaXplPTANCnNldCBzaXplPSUlfnpHDQppZiAhc2l6ZSEgR0VRIDEgaWYgIXNpemUhIExTUyAxMDAwMDAgKA0Kc2V0IF9w cmVzZW50PTENCmRlbCAvZiAvcSAiJSV+RyINCmlmIGV4aXN0ICIlJX5HIiAobW92ZSAveSAiJSV+RyIgIiFfdHRlbXAhXG5lZWRzVG9CZURlbGV0ZWQlcmFu ZG9tJSIgJW51bCUpDQppZiBleGlzdCAiJSV+RyIgKHNldCBfdW5lcnJvcj0xKSBlbHNlIChlY2hvIERlbGV0ZWQgZmlsZSAtICUlfkcpDQopDQppZiAvaSBz cHBjcy5kbGw9PSUlIyBpZiAhc2l6ZSEgR0VRIDEwMDAwMCAoDQptb3ZlIC95ICIlJX5HIiAiJSV+QVxNaWNyb3NvZnQgU2hhcmVkXE9mZmljZVNvZnR3YXJl UHJvdGVjdGlvblBsYXRmb3JtXE9TUFBDLkRMTCIgJW51bCUNCmlmIGV4aXN0ICIlJX5HIiAobW92ZSAveSAiJSV+QVxNaWNyb3NvZnQgU2hhcmVkXE9mZmlj ZVNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXE9TUFBDLkRMTCIgIiFfdHRlbXAhXG5lZWRzVG9CZURlbGV0ZWQlcmFuZG9tJSIgJW51bCUpDQptb3ZlIC95 ICIlJX5HIiAiJSV+QVxNaWNyb3NvZnQgU2hhcmVkXE9mZmljZVNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXE9TUFBDLkRMTCIgJW51bCUNCmlmIGV4aXN0 ICIlJX5HIiAoc2V0IF91bmVycm9yPTEmZWNobyBGYWlsZWQgdG8gcmVuYW1lIHNwcGNzLmRsbCBiYWNrIHRvICIlJX5BXE1pY3Jvc29mdCBTaGFyZWRcT2Zm aWNlU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm1cT1NQUEMuRExMIikgZWxzZSAoZWNobyBSZW5hbWVkIHNwcGNzLmRsbCBiYWNrIHRvICIlJX5BXE1pY3Jv c29mdCBTaGFyZWRcT2ZmaWNlU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm1cT1NQUEMuRExMIikNCikNCikNCikNCikNCg0KOjo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQoNCnJlZyBxdWVyeSBIS0NVXFNvZnR3YXJlXE1pY3Jvc29mdFxPZmZpY2VcMTYuMFxDb21tb25cTGljZW5zaW5nXFJlc2ls aWVuY3kgJW51bCUgJiYgKA0KZWNobzoNCmVjaG8gRGVsZXRpbmcgLSBSZWdpc3RyeSBrZXlzIGZvciBza2lwcGluZyBsaWNlbnNlIGNoZWNrDQoNCnJlZyBs b2FkIEhLVVxERUZfVEVNUCAlU3lzdGVtRHJpdmUlXFVzZXJzXERlZmF1bHRcTlRVU0VSLkRBVCAlbnVsJQ0KcmVnIHF1ZXJ5IEhLVVxERUZfVEVNUFxTb2Z0 d2FyZVxNaWNyb3NvZnRcT2ZmaWNlXDE2LjBcQ29tbW9uXExpY2Vuc2luZ1xSZXNpbGllbmN5ICVudWwlICYmIHJlZyBkZWxldGUgSEtVXERFRl9URU1QXFNv ZnR3YXJlXE1pY3Jvc29mdFxPZmZpY2VcMTYuMFxDb21tb25cTGljZW5zaW5nXFJlc2lsaWVuY3kgL2YNCnJlZyB1bmxvYWQgSEtVXERFRl9URU1QICVudWwl DQoNCnNldCBfc2lkbGlzdD0NCmZvciAvZiAidG9rZW5zPSogZGVsaW1zPSIgJSVhIGluICgnJXBzYyUgIiRwID0gJ0hLTE06XFNPRlRXQVJFXE1pY3Jvc29m dFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFByb2ZpbGVMaXN0JzsgR2V0LUNoaWxkSXRlbSAkcCB8IEZvckVhY2gtT2JqZWN0IHsgJHBpID0gKEdldC1J dGVtUHJvcGVydHkgIiIiIiRwXCQoJF8uUFNDaGlsZE5hbWUpIiIiIikuUHJvZmlsZUltYWdlUGF0aDsgaWYgKCRwaSAtbGlrZSAnKlxVc2Vyc1wqJyAtYW5k IChUZXN0LVBhdGggIiIiIiRwaVxOVFVTRVIuREFUIiIiIikgLWFuZCAtbm90ICgkXy5QU0NoaWxkTmFtZSAtbWF0Y2ggJ1wuYmFrJCcpKSB7IFNwbGl0LVBh dGggJF8uUFNQYXRoIC1MZWFmIH0gfSIgJW51bDYlJykgZG8gKGlmIGRlZmluZWQgX3NpZGxpc3QgKHNldCBfc2lkbGlzdD0hX3NpZGxpc3QhICUlYSkgZWxz ZSAoc2V0IF9zaWRsaXN0PSUlYSkpDQoNCmlmIG5vdCBkZWZpbmVkIF9zaWRsaXN0ICgNCmZvciAvZiAiZGVsaW1zPSIgJSVhIGluICgnJXBzYyUgIiRleHBs b3JlclByb2MgPSBHZXQtUHJvY2VzcyAtTmFtZSBleHBsb3JlciB8IFdoZXJlLU9iamVjdCB7JF8uU2Vzc2lvbklkIC1lcSAoR2V0LVByb2Nlc3MgLUlkICRw aWQpLlNlc3Npb25JZH0gfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxOyAkc2lkID0gKGd3bWkgLVF1ZXJ5ICgnU2VsZWN0ICogRnJvbSBXaW4zMl9Qcm9jZXNz IFdoZXJlIFByb2Nlc3NJRD0nICsgJGV4cGxvcmVyUHJvYy5JZCkpLkdldE93bmVyU2lkKCkuU2lkOyAkc2lkIiAlbnVsNiUnKSBkbyAoc2V0IF9zaWRsaXN0 PSUlYSkNCikNCg0KZm9yICUlIyBpbiAoIV9zaWRsaXN0ISkgZG8gKA0KDQpyZWcgcXVlcnkgSEtVXCUlI1xTb2Z0d2FyZVxNaWNyb3NvZnRcT2ZmaWNlXDE2 LjBcQ29tbW9uXExpY2Vuc2luZ1xSZXNpbGllbmN5ICVudWwlICYmIHJlZyBkZWxldGUgSEtVXCUlI1xTb2Z0d2FyZVxNaWNyb3NvZnRcT2ZmaWNlXDE2LjBc Q29tbW9uXExpY2Vuc2luZ1xSZXNpbGllbmN5IC9mDQoNCnJlZyBxdWVyeSBIS1VcJSUjXFNvZnR3YXJlICVudWwlIHx8ICgNCmZvciAvZiAic2tpcD0yIHRv a2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxQcm9maWxlTGlz dFwlJSMiIC92IFByb2ZpbGVJbWFnZVBhdGgiICVudWw2JScpIGRvICgNCnJlZyBsb2FkIEhLVVwlJSMgIiUlYlxOVFVTRVIuREFUIiAlbnVsJQ0KcmVnIHF1 ZXJ5IEhLVVwlJSNcU29mdHdhcmVcTWljcm9zb2Z0XE9mZmljZVwxNi4wXENvbW1vblxMaWNlbnNpbmdcUmVzaWxpZW5jeSAlbnVsJSAmJiByZWcgZGVsZXRl IEhLVVwlJSNcU29mdHdhcmVcTWljcm9zb2Z0XE9mZmljZVwxNi4wXENvbW1vblxMaWNlbnNpbmdcUmVzaWxpZW5jeSAvZg0KcmVnIHVubG9hZCBIS1VcJSUj ICVudWwlDQopDQopDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpzZXQgImttc2tleT1IS0xNXFNPRlRXQVJFXE1p Y3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVj NjM3MDY2MyINCnJlZyBxdWVyeSAiJWttc2tleSUiICVudWwlICYmICgNCmVjaG86DQplY2hvIERlbGV0aW5nIC0gUmVnaXN0cnkga2V5cyBmb3IgcHJldmVu dGluZyBub24tZ2VudWluZSBiYW5uZXINCnJlZyBkZWxldGUgIiVrbXNrZXklIiAvZg0KKQ0KDQpyZWcgcXVlcnkgIiVrbXNrZXklIiAvcmVnOjMyICVudWwl ICYmICgNCnJlZyBkZWxldGUgIiVrbXNrZXklIiAvZiAvcmVnOjMyDQopDQoNCmVjaG8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQplY2hvOg0KDQppZiBub3QgZGVmaW5lZCBfcHJlc2VudCAoDQpl Y2hvIE9ob29rIGFjdGl2YXRpb24gaXMgbm90IGluc3RhbGxlZC4NCikgZWxzZSAoDQppZiBkZWZpbmVkIF91bmVycm9yICgNCmNhbGwgOmRrX2NvbG9yICVS ZWQlICJGYWlsZWQgdG8gdW5pbnN0YWxsIE9ob29rIGFjdGl2YXRpb24uIg0KY2FsbCA6b2hfY2hlY2thcHBzDQppZiBkZWZpbmVkIGNoZWNrbmFtZXMgKA0K Y2FsbCA6ZGtfY29sb3IgJUJsdWUlICJDbG9zZSBbIWNoZWNrbmFtZXMhXSBhbmQgdHJ5IGFnYWluLiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiSWYgaXQg aXMgc3RpbGwgbm90IGZpeGVkLCByZWJvb3QgeW91ciBtYWNoaW5lIHVzaW5nIHRoZSByZXN0YXJ0IG9wdGlvbiBhbmQgdHJ5IGFnYWluLiINCikgZWxzZSAo DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlJlYm9vdCB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIHJlc3RhcnQgb3B0aW9uIGFuZCB0cnkgYWdhaW4uIg0KKQ0K KSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVHcmVlbiUgIlN1Y2Nlc3NmdWxseSB1bmluc3RhbGxlZCBPaG9vayBhY3RpdmF0aW9uLiINCikNCikNCmVjaG8g X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f DQoNCmdvdG8gOmRrX2RvbmUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpvaF9yZXNldA0KDQpzZXQg a2V5PQ0Kc2V0IF9vUm9vdD0NCnNldCBfb0FyY2g9DQpzZXQgX29JZHM9DQpzZXQgX29MUGF0aD0NCnNldCBfaG9va1BhdGg9DQpzZXQgX2hvb2s9DQpzZXQg X3NwcGNQYXRoPQ0Kc2V0IF9vc3BwUGF0aD0NCnNldCBfYWN0aWQ9DQpzZXQgX3Byb2Q9DQpzZXQgX2xpYz0NCnNldCBfYXJyPQ0Kc2V0IF9wcmlkcz0NCnNl dCBfY29uZmlnPQ0Kc2V0IF92ZXJzaW9uPQ0Kc2V0IF9MaWNlbnNlPQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0NCg0KOm9oX2dldHBhdGgNCg0Kc2V0IG8xNmMycj0NCnNldCBvMTVjMnI9DQpzZXQgbzE2bXNpPQ0Kc2V0IG8xNW1zaT0NCnNldCBvMTRt c2k9DQoNCnNldCBfNjg9SEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlDQpzZXQgXzg2PUhLTE1cU09GVFdBUkVcV293NjQzMk5vZGVcTWljcm9zb2Z0 XE9mZmljZQ0KDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV84NiVcQ2xpY2tUb1J1biAvdiBJbnN0YWxsUGF0aCIg JW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzMTZcUHJvUGx1cyoueHJtLW1zIiAgICAoc2V0IG8xNmMycj0xJnNldCBvMTZjMnJfcmVn PSVfODYlXENsaWNrVG9SdW4pDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV82OCVcQ2xpY2tUb1J1biAvdiBJbnN0 YWxsUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzMTZcUHJvUGx1cyoueHJtLW1zIiAgICAoc2V0IG8xNmMycj0xJnNldCBv MTZjMnJfcmVnPSVfNjglXENsaWNrVG9SdW4pDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV84NiVcMTUuMFxDbGlj a1RvUnVuIC92IEluc3RhbGxQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXHJvb3RcTGljZW5zZXNcUHJvUGx1cyoueHJtLW1zIiAoc2V0IG8xNWMy cj0xJnNldCBvMTVjMnJfcmVnPSVfODYlXDE1LjBcQ2xpY2tUb1J1bikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAl XzY4JVwxNS4wXENsaWNrVG9SdW4gL3YgSW5zdGFsbFBhdGgiICVudWw2JScpIGRvIGlmIGV4aXN0ICIlJWJccm9vdFxMaWNlbnNlc1xQcm9QbHVzKi54cm0t bXMiIChzZXQgbzE1YzJyPTEmc2V0IG8xNWMycl9yZWc9JV82OCVcMTUuMFxDbGlja1RvUnVuKQ0KDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBp biAoJyJyZWcgcXVlcnkgJV84NiVcMTYuMFxDb21tb25cSW5zdGFsbFJvb3QgL3YgUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlwqUGlja2VyLmRs bCIgKHNldCBvMTZtc2k9MSZzZXQgbzE2bXNpX3JlZz0lXzg2JVwxNi4wKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5 ICVfNjglXDE2LjBcQ29tbW9uXEluc3RhbGxSb290IC92IFBhdGgiICVudWw2JScpIGRvIGlmIGV4aXN0ICIlJWJcKlBpY2tlci5kbGwiIChzZXQgbzE2bXNp PTEmc2V0IG8xNm1zaV9yZWc9JV82OCVcMTYuMCkNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzg2JVwxNS4wXENv bW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0IG8xNW1zaT0xJnNldCBvMTVtc2lf cmVnPSVfODYlXDE1LjApDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV82OCVcMTUuMFxDb21tb25cSW5zdGFsbFJv b3QgL3YgUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlwqUGlja2VyLmRsbCIgKHNldCBvMTVtc2k9MSZzZXQgbzE1bXNpX3JlZz0lXzY4JVwxNS4w KQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVfODYlXDE0LjBcQ29tbW9uXEluc3RhbGxSb290IC92IFBhdGgiICVu dWw2JScpIGRvIGlmIGV4aXN0ICIlJWJcKlBpY2tlci5kbGwiIChzZXQgbzE0bXNpPTEmc2V0IG8xNG1zaV9yZWc9JV84NiVcMTQuMCkNCmZvciAvZiAic2tp cD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzY4JVwxNC4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBl eGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0IG8xNG1zaT0xJnNldCBvMTRtc2lfcmVnPSVfNjglXDE0LjApDQoNCmV4aXQgL2INCg0KOjo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpvaF9leHBpcmVkcHJldmlldw0KDQplY2hvICVfb0lkcyUgfCBmaW5kIC9pICJWb2x1 bWUiICVudWwlIHx8IGV4aXQgL2INCg0KZm9yICUlIyBpbiAoJSopIGRvICgNCmlmICUlIz09MjAxMyBzZXQgX29mZnZlcj0NCmlmICUlIz09MjAxNiBzZXQg X29mZnZlcj0NCmlmICUlIz09MjAxOSBzZXQgX29mZnZlcj0yMDE5DQppZiAlJSM9PTIwMjEgc2V0IF9vZmZ2ZXI9MjAyMQ0KaWYgJSUjPT0yMDI0IHNldCBf b2ZmdmVyPTIwMjQNCmlmIGV4aXN0ICIhX29MUGF0aCFcUHJvUGx1cyFfb2ZmdmVyIVByZXZpZXdWTF8qLnhybS1tcyIgaWYgbm90IGV4aXN0ICIhX29MUGF0 aCFcUHJvUGx1cyFfb2ZmdmVyIVZMXyoueHJtLW1zIiAoDQpzZXQgZXJyb3I9MQ0Kc2V0IHNob3dmaXg9MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNr aW5nIEV4cGlyZWQgUHJldmlldyBQcm9kdWN0cyAgICAgICBbT2ZmaWNlICUlIyBQcmV2aWV3IEZvdW5kXSINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiUGxl YXNlIHJ1biB0aGUgT2ZmaWNlIHVwZGF0ZXMgZmlyc3QsIGFuZCB0aGVuIGF0dGVtcHQgdG8gYWN0aXZhdGUgaXQgYWdhaW4uIg0KKQ0KKQ0KDQpleGl0IC9i DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6b2hfcHBjcGF0aA0KDQppZiBub3QgZGVmaW5lZCBpc09z cHAgKA0KaWYgbm90ICIlb3NhcmNoJSI9PSJ4ODYiICgNCmlmIC9pICIlX29BcmNoJSI9PSJ4NjQiIHNldCAiX3NwcGNQYXRoPSVTeXN0ZW1Sb290JVxTeXN0 ZW0zMlxzcHBjLmRsbCINCmlmIC9pICIlX29BcmNoJSI9PSJ4ODYiIHNldCAiX3NwcGNQYXRoPSVTeXN0ZW1Sb290JVxTeXNXT1c2NFxzcHBjLmRsbCINCikg ZWxzZSAoDQpzZXQgIl9zcHBjUGF0aD0lU3lzdGVtUm9vdCVcU3lzdGVtMzJcc3BwYy5kbGwiDQopDQopDQoNCnNldCBub09zcHBjPQ0Kc2V0IF9ob29rNjg9 DQpzZXQgX2hvb2s4Nj0NCnNldCBfb3NwcFBhdGg2OD0NCnNldCBfb3NwcFBhdGg4Nj0NCg0KaWYgZGVmaW5lZCBpc09zcHAgKA0KaWYgbm90ICIlb3NhcmNo JSI9PSJ4ODYiICgNCmlmIC9pICIlX29BcmNoJSI9PSJ4NjQiICgNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSBIS0xN XFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2VTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSAvdiBQYXRoIiAlbnVsNiUnKSBkbyAoc2V0ICJfb3NwcFBhdGg2 OD0lJWIiKQ0KaWYgbm90IGV4aXN0ICIhX29zcHBQYXRoNjghT1NQUEMuRExMIiBzZXQgbm9Pc3BwYz0xDQopDQppZiAvaSAiJV9vQXJjaCUiPT0ieDg2IiAo DQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlU29mdHdhcmVQcm90 ZWN0aW9uUGxhdGZvcm0gL3YgUGF0aCIgJW51bDYlJykgZG8gKHNldCAiX29zcHBQYXRoNjg9JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVh IGluICgnInJlZyBxdWVyeSBIS0xNXFNPRlRXQVJFXFdvdzY0MzJOb2RlXE1pY3Jvc29mdFxPZmZpY2VTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSAvdiBQ YXRoIiAlbnVsNiUnKSBkbyAoc2V0ICJfb3NwcFBhdGg4Nj0lJWIiKQ0KaWYgbm90IGV4aXN0ICIhX29zcHBQYXRoNjghT1NQUEMuRExMIiBzZXQgbm9Pc3Bw Yz0xDQppZiBub3QgZXhpc3QgIiFfb3NwcFBhdGg4NiFPU1BQQy5ETEwiIHNldCBub09zcHBjPTENCikNCikgZWxzZSAoDQpmb3IgL2YgInNraXA9MiB0b2tl bnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0gL3YgUGF0 aCIgJW51bDYlJykgZG8gKHNldCAiX29zcHBQYXRoODY9JSViIikNCmlmIG5vdCBleGlzdCAiIV9vc3BwUGF0aDg2IU9TUFBDLkRMTCIgc2V0IG5vT3NwcGM9 MQ0KKQ0KaWYgIiFfb3NwcFBhdGg2ODp+LTEhIj09IlwiIHNldCAiX29zcHBQYXRoNjg9IV9vc3BwUGF0aDY4On4wLC0xISINCmlmICIhX29zcHBQYXRoODY6 fi0xISI9PSJcIiBzZXQgIl9vc3BwUGF0aDg2PSFfb3NwcFBhdGg4Njp+MCwtMSEiDQopDQoNCmlmIGRlZmluZWQgX29zcHBQYXRoNjggc2V0IF9ob29rNjg9 c3BwYzY0LmRsbA0KaWYgZGVmaW5lZCBfb3NwcFBhdGg4NiBzZXQgX2hvb2s4Nj1zcHBjMzIuZGxsDQoNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBTb21lIE9mZmljZSBSZXRhaWwgdG8gVm9sdW1lIGNvbnZlcnRlciB0b29scyBtYXkgZWRp dCB0aGUgUHJvZHVjdFJlbGVhc2VJZHMgdG8gYWRkIFZMIHByb2R1Y3RzLiBUaGlzIGNvZGUgcmVzdG9yZXMgaXQgYmVjYXVzZSBpdCBtYXkgYWZmZWN0IGZl YXR1cmVzLg0KDQo6b2hfZml4cHJpZHMNCg0KaWYgbm90IGRlZmluZWQgX3ByaWRzICgNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiQ2hlY2tpbmcgUHJvZHVj dFJlbGVhc2VJZHMgSW4gUmVnaXN0cnkgIFtOb3QgRm91bmRdIg0KZXhpdCAvYg0KKQ0KDQpzZXQgX3ByaWRzUj0NCnNldCBfcHJpZHNFPQ0KZm9yIC9mICJz a2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVfcHJpZHMlIiAlbnVsNiUnKSBkbyAoc2V0ICJfcHJpZHNSPSUlYiIpDQoNCnNldCBfcHJp ZHNSPSVfcHJpZHNSOiw9ICUNCmZvciAlJSMgaW4gKCVfcHJpZHNSJSkgZG8gKGVjaG8gJSUjIHwgZmluZHN0ciAvSSAiJV9vSWRzJSIgJW51bDElIHx8IHNl dCBfcHJpZHNFPTEpDQpmb3IgJSUjIGluICglX29JZHMlKSBkbyAoZWNobyAlJSMgfCBmaW5kc3RyIC9JICIlX3ByaWRzUiUiICVudWwxJSB8fCBzZXQgX3By aWRzRT0xKQ0KDQppZiBub3QgZGVmaW5lZCBfcHJpZHNFIGV4aXQgL2INCnJlZyBhZGQgJV9wcmlkcyUgL3QgUkVHX1NaIC9kICIiIC9mICVudWwxJQ0KDQpm b3IgJSUjIGluICglX29JZHMlKSBkbyAoDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJ3JlZyBxdWVyeSAlX3ByaWRzJScpIGRvIGlmIG5v dCAiJSViIj09IiIgKA0KcmVnIGFkZCAlX3ByaWRzJSAvdCBSRUdfU1ogL2QgIiUlYiwlJSMiIC9mICVudWwxJQ0KKSBlbHNlICgNCnJlZyBhZGQgJV9wcmlk cyUgL3QgUkVHX1NaIC9kICIlJSMiIC9mICVudWwxJQ0KKQ0KKQ0KDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQ0KDQo6b2hfaW5zdGFsbGxpYw0KDQppZiBub3QgZGVmaW5lZCBfb0xQYXRoIGV4aXQgL2INCg0KaWYgZGVmaW5lZCBfb0ludGVncmF0b3Ig KA0KaWYgJW9WZXIlPT0xNiAoDQoiIV9vSW50ZWdyYXRvciEiIC9JIC9MaWNlbnNlIFBSSUROYW1lPSVfTGljZW5zZSUuMTYgUGlkS2V5PSVrZXklICVudWwl DQopIGVsc2UgKA0KIiFfb0ludGVncmF0b3IhIiAvSSAvTGljZW5zZSBQUklETmFtZT0lX0xpY2Vuc2UlIFBpZEtleT0la2V5JSAlbnVsJQ0KKQ0KY2FsbCA6 ZGtfYWN0aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KZWNobyAiIWFsbGFwcHMhIiB8IGZpbmQgL2kgIiFfYWN0aWQhIiAlbnVs MSUgJiYgZXhpdCAvYg0KKQ0KDQo6OiAgRmFsbGJhY2sgdG8gbWFudWFsIG1ldGhvZCB0byBpbnN0YWxsIGxpY2Vuc2VzIGluY2FzZSBpbnRlZ3JhdG9yLmV4 ZSBpcyBub3Qgd29ya2luZw0KDQpzZXQgX0xpY2Vuc2U9JV9MaWNlbnNlOlhWb2x1bWU9WEMyUlZMXyUNCg0Kc2V0IF9MaWNlbnNlPSVfTGljZW5zZTpPMzY1 RWR1Q2xvdWRSZXRhaWw9TzM2NUVkdUNsb3VkRURVUl8lDQoNCnNldCBfTGljZW5zZT0lX0xpY2Vuc2U6UHJvamVjdFByb1JldGFpbD1Qcm9qZWN0UHJvTzM2 NVJfJQ0Kc2V0IF9MaWNlbnNlPSVfTGljZW5zZTpQcm9qZWN0U3RkUmV0YWlsPVByb2plY3RTdGRPMzY1Ul8lDQpzZXQgX0xpY2Vuc2U9JV9MaWNlbnNlOlZp c2lvUHJvUmV0YWlsPVZpc2lvUHJvTzM2NVJfJQ0Kc2V0IF9MaWNlbnNlPSVfTGljZW5zZTpWaXNpb1N0ZFJldGFpbD1WaXNpb1N0ZE8zNjVSXyUNCg0KaWYg ZGVmaW5lZCBfcHJldmlldyBzZXQgX0xpY2Vuc2U9JV9MaWNlbnNlOlZvbHVtZT1QcmV2aWV3VkxfJQ0KDQpzZXQgX0xpY2Vuc2U9JV9MaWNlbnNlOlJldGFp bD1SXyUNCnNldCBfTGljZW5zZT0lX0xpY2Vuc2U6Vm9sdW1lPVZMXyUNCg0KZm9yICUlIyBpbiAoIiFfb0xQYXRoIVxjbGllbnQtaXNzdWFuY2UtKi54cm0t bXMiKSBkbyAoDQppZiBkZWZpbmVkIF9hcnIgKHNldCAiX2Fycj0hX2FyciE7IiFfb0xQYXRoIVwlJX5ueCMiIikgZWxzZSAoc2V0ICJfYXJyPSIhX29MUGF0 aCFcJSV+bngjIiIpDQopDQoNCmZvciAlJSMgaW4gKCIhX29MUGF0aCFcJV9MaWNlbnNlJSoueHJtLW1zIikgZG8gKA0KaWYgZGVmaW5lZCBfYXJyIChzZXQg Il9hcnI9IV9hcnIhOyIhX29MUGF0aCFcJSV+bngjIiIpIGVsc2UgKHNldCAiX2Fycj0iIV9vTFBhdGghXCUlfm54IyIiKQ0KKQ0KDQolcHNjJSAiJHNscyA9 IEdldC1XbWlPYmplY3QgJXNwcyU7ICRmPVtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzp4cm1cOi4qJzsuIChbc2NyaXB0Ymxv Y2tdOjpDcmVhdGUoJGZbMV0pKTsgSW5zdGFsbExpY2Vuc2VBcnIgJyFfYXJyISc7IEluc3RhbGxMaWNlbnNlRmlsZSAnIiFfb0xQYXRoIVxwa2V5Y29uZmln LW9mZmljZS54cm0tbXMiJyIgJW51bCUNCg0KY2FsbCA6ZGtfYWN0aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KZWNobyAiIWFs bGFwcHMhIiB8IGZpbmQgL2kgIiFfYWN0aWQhIiAlbnVsMSUgfHwgKA0Kc2V0IGVycm9yPTENCmNhbGwgOmRrX2NvbG9yICVSZWQlICJJbnN0YWxsaW5nIE1p c3NpbmcgTGljZW5zZSBGaWxlcyAgICAgICAgW09mZmljZSAlb1ZlciUuMCAlX3Byb2QlXSBbRmFpbGVkXSINCikNCg0KZXhpdCAvYg0KDQo6Oj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOm9oX2hvb2tpbnN0YWxsDQoNCnNldCBpZXJyb3I9DQpzZXQgaGFzaGVycm9yPQ0K DQppZiAlX2hvb2slPT1zcHBjMzIuZGxsIHNldCBvZmZzZXQ9MjU2NA0KaWYgJV9ob29rJT09c3BwYzY0LmRsbCBzZXQgb2Zmc2V0PTMwNzYNCg0KOjo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgUmVtb3ZlIHByZXZpb3VzIEluc3RhbGwNCg0KZm9yICUlIyBpbiAoc3BwY3MuZGxs IHNwcGMuZGxsKSBkbyAoDQpkZWwgL2YgL3EgIiVfaG9va1BhdGglXCUlIyIgJW51bCUNCmlmIGV4aXN0ICIlX2hvb2tQYXRoJVwlJSMiIChtb3ZlIC95ICIl X2hvb2tQYXRoJVwlJSMiICIhX3R0ZW1wIVxuZWVkc1RvQmVEZWxldGVkJXJhbmRvbSUiICVudWwlKQ0KaWYgZXhpc3QgIiVfaG9va1BhdGglXCUlIyIgKHNl dCAiaWVycm9yPVJlbW92ZSBQcmV2aW91cyBPaG9vayBJbnN0YWxsIFslJSNdIikNCikNCg0KaWYgZGVmaW5lZCBpZXJyb3IgZ290byA6b2hfaG9va2luc3Rh bGxfZXJyb3INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpta2xpbmsgIiVfaG9va1BhdGglXHNwcGNzLmRsbCIgIiVf c3BwY1BhdGglIiAlbnVsJQ0KaWYgbm90IGV4aXN0ICIlX2hvb2tQYXRoJVxzcHBjcy5kbGwiICgNCnNldCBpZXJyb3I9bWtsaW5rIHNwcGNzLmRsbA0KZ290 byA6b2hfaG9va2luc3RhbGxfZXJyb3INCikNCg0KaWYgbm90IGV4aXN0ICIlX2hvb2tQYXRoJVxzcHBjLmRsbCIgKA0KY2FsbCA6b2hfZXh0cmFjdGRsbCAi JV9ob29rUGF0aCVcc3BwYy5kbGwiICIlb2Zmc2V0JSINCikNCmlmIG5vdCBleGlzdCAiJV9ob29rUGF0aCVcc3BwYy5kbGwiICgNCnNldCBpZXJyb3I9Q29w eQ0KZ290byA6b2hfaG9va2luc3RhbGxfZXJyb3INCikNCg0KZWNobzoNCmVjaG8gU3ltbGlua2luZyBTeXN0ZW0ncyBzcHBjLmRsbCAgICAgICAgICAgIFsi JV9ob29rUGF0aCVcc3BwY3MuZGxsIl0gW1N1Y2Nlc3NmdWxdDQplY2hvIEV4dHJhY3RpbmcgQ3VzdG9tICVfaG9vayUgdG8gICAgICAgICBbIiVfaG9va1Bh dGglXHNwcGMuZGxsIl0gW1N1Y2Nlc3NmdWxdDQoNCmdvdG8gOm9oX2hvb2tpbnN0YWxsX2Vycm9yDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQ0KDQo6b2hfaG9va2luc3RhbGxfb3NwcA0KDQpzZXQgaWVycm9yPQ0Kc2V0IGhhc2hlcnJvcj0NCg0KaWYgZGVmaW5lZCBf aG9vazg2IHNldCBvZmZzZXQ4Nj0yNTY0DQppZiBkZWZpbmVkIF9ob29rNjggc2V0IG9mZnNldDY4PTMwNzYNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQ0KDQo6OiAgUmVtb3ZlIHByZXZpb3VzIEluc3RhbGwNCg0KZm9yICUlIyBpbiAoT1NQUEMuRExMIHNwcGNzLmRsbCkgZG8gKA0K Zm9yICUlQSBpbiAoIiVfb3NwcFBhdGg2OCVcJSUjIiAiJV9vc3BwUGF0aDg2JVwlJSMiKSBkbyAoDQpzZXQgc2l6ZT0wDQpzZXQgc2l6ZT0lJX56QQ0KaWYg IXNpemUhIEdFUSAxIGlmICFzaXplISBMU1MgMTAwMDAwICgNCmRlbCAvZiAvcSAiJSV+QSIgJW51bCUNCmlmIGV4aXN0ICIlJX5BIiAobW92ZSAveSAiJSV+ QSIgIiFfdHRlbXAhXG5lZWRzVG9CZURlbGV0ZWQlcmFuZG9tJSIgJW51bCUpDQppZiBleGlzdCAiJSV+QSIgKHNldCAiaWVycm9yPVJlbW92ZSBQcmV2aW91 cyBPaG9vayBJbnN0YWxsIFslJSNdIikNCikNCikNCikNCg0KaWYgZGVmaW5lZCBpZXJyb3IgZ290byA6b2hfaG9va2luc3RhbGxfZXJyb3INCg0KZm9yICUl QSBpbiAoIiVfb3NwcFBhdGg2OCUiICIlX29zcHBQYXRoODYlIikgZG8gKA0KaWYgZXhpc3QgIiUlfkFcc3BwY3MuZGxsIiAobW92ZSAveSAiJSV+QVxzcHBj cy5kbGwiICIlJX5BXE9TUFBDLkRMTCIgJW51bCUpDQppZiBleGlzdCAiJSV+QVxzcHBjcy5kbGwiICgNCm1vdmUgL3kgIiUlfkFcT1NQUEMuRExMIiAiIV90 dGVtcCFcbmVlZHNUb0JlRGVsZXRlZCVyYW5kb20lIiAlbnVsJQ0KbW92ZSAveSAiJSV+QVxzcHBjcy5kbGwiICIlJX5BXE9TUFBDLkRMTCIgJW51bCUNCikN CmlmIGV4aXN0ICIlJX5BXHNwcGNzLmRsbCIgKHNldCAiaWVycm9yPU1vdmUgc3BwY3MuZGxsIGJhY2sgdG8gT1NQUEMuRExMIikNCikNCg0KZGVsIC9mIC9x ICIlX2hvb2tQYXRoJVxzcHBjcy5kbGwiICVudWwlDQppZiBleGlzdCAiJV9ob29rUGF0aCVcc3BwY3MuZGxsIiAobW92ZSAveSAiJV9ob29rUGF0aCVcc3Bw Y3MuZGxsIiAiIV90dGVtcCFcbmVlZHNUb0JlRGVsZXRlZCVyYW5kb20lIiAlbnVsJSkNCmlmIGV4aXN0ICIlX2hvb2tQYXRoJVxzcHBjcy5kbGwiIChzZXQg ImllcnJvcj1SZW1vdmUgUHJldmlvdXMgT2hvb2sgbWtsaW5rIHNwcGNzLmRsbCIpDQoNCmlmIGRlZmluZWQgaWVycm9yIGdvdG8gOm9oX2hvb2tpbnN0YWxs X2Vycm9yDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KaWYgZGVmaW5lZCBfb3NwcFBhdGg2OCAobW92ZSAveSAiJV9v c3BwUGF0aDY4JVxPU1BQQy5ETEwiICIlX29zcHBQYXRoNjglXHNwcGNzLmRsbCIgJW51bCUgJiBpZiBub3QgZXhpc3QgIiVfb3NwcFBhdGg2OCVcc3BwY3Mu ZGxsIiBzZXQgaWVycm9yPTEpDQppZiBkZWZpbmVkIF9vc3BwUGF0aDg2IChtb3ZlIC95ICIlX29zcHBQYXRoODYlXE9TUFBDLkRMTCIgIiVfb3NwcFBhdGg4 NiVcc3BwY3MuZGxsIiAlbnVsJSAmIGlmIG5vdCBleGlzdCAiJV9vc3BwUGF0aDg2JVxzcHBjcy5kbGwiIHNldCBpZXJyb3I9MSkNCg0KaWYgZGVmaW5lZCBp ZXJyb3IgKA0Kc2V0ICJpZXJyb3I9UmVuYW1lIE9TUFBDLkRMTCINCmdvdG8gOm9oX2hvb2tpbnN0YWxsX2Vycm9yDQopDQoNCmlmIGRlZmluZWQgX29zcHBQ YXRoNjggaWYgZGVmaW5lZCBfb3NwcFBhdGg4NiAgICAgKG1rbGluayAiJV9ob29rUGF0aCVcc3BwY3MuZGxsIiAiJV9vc3BwUGF0aDg2JVxzcHBjcy5kbGwi ICVudWwlKQ0KaWYgZGVmaW5lZCBfb3NwcFBhdGg2OCBpZiBub3QgZGVmaW5lZCBfb3NwcFBhdGg4NiAobWtsaW5rICIlX2hvb2tQYXRoJVxzcHBjcy5kbGwi ICIlX29zcHBQYXRoNjglXHNwcGNzLmRsbCIgJW51bCUpDQppZiBkZWZpbmVkIF9vc3BwUGF0aDg2IGlmIG5vdCBkZWZpbmVkIF9vc3BwUGF0aDY4IChta2xp bmsgIiVfaG9va1BhdGglXHNwcGNzLmRsbCIgIiVfb3NwcFBhdGg4NiVcc3BwY3MuZGxsIiAlbnVsJSkNCg0KaWYgbm90IGV4aXN0ICIlX2hvb2tQYXRoJVxz cHBjcy5kbGwiICgNCnNldCBpZXJyb3I9bWtsaW5rIHNwcGNzLmRsbA0KZ290byA6b2hfaG9va2luc3RhbGxfZXJyb3INCikNCg0KaWYgZGVmaW5lZCBfb3Nw cFBhdGg2OCAoc2V0IF9ob29rPSVfaG9vazY4JSZjYWxsIDpvaF9leHRyYWN0ZGxsICIlX29zcHBQYXRoNjglXE9TUFBDLkRMTCIgIiVvZmZzZXQ2OCUiKQ0K aWYgZGVmaW5lZCBfb3NwcFBhdGg4NiAoc2V0IF9ob29rPSVfaG9vazg2JSZjYWxsIDpvaF9leHRyYWN0ZGxsICIlX29zcHBQYXRoODYlXE9TUFBDLkRMTCIg IiVvZmZzZXQ4NiUiKQ0KDQppZiBkZWZpbmVkIF9vc3BwUGF0aDY4IChpZiBub3QgZXhpc3QgIiVfb3NwcFBhdGg2OCVcT1NQUEMuRExMIiBzZXQgaWVycm9y PTEpDQppZiBkZWZpbmVkIF9vc3BwUGF0aDg2IChpZiBub3QgZXhpc3QgIiVfb3NwcFBhdGg4NiVcT1NQUEMuRExMIiBzZXQgaWVycm9yPTEpDQoNCmlmIGRl ZmluZWQgaWVycm9yICgNCnNldCBpZXJyb3I9Q29weQ0KZ290byA6b2hfaG9va2luc3RhbGxfZXJyb3INCikNCg0KZWNobzoNCmlmIGRlZmluZWQgX29zcHBQ YXRoNjggKGVjaG8gUmVuYW1pbmcgT1NQUEMuRExMIHRvIHNwcGNzLmRsbCAgICAgICAgIFsiJV9vc3BwUGF0aDY4JVxzcHBjcy5kbGwiXSkNCmlmIGRlZmlu ZWQgX29zcHBQYXRoODYgKGVjaG8gUmVuYW1pbmcgT1NQUEMuRExMIHRvIHNwcGNzLmRsbCAgICAgICAgIFsiJV9vc3BwUGF0aDg2JVxzcHBjcy5kbGwiXSkN CmlmIGRlZmluZWQgX29zcHBQYXRoNjggKGVjaG8gRXh0cmFjdGluZyBDdXN0b20gJV9ob29rNjglIHRvICAgICAgICAgWyIlX29zcHBQYXRoNjglXE9TUFBD LkRMTCJdKQ0KaWYgZGVmaW5lZCBfb3NwcFBhdGg4NiAoZWNobyBFeHRyYWN0aW5nIEN1c3RvbSAlX2hvb2s4NiUgdG8gICAgICAgICBbIiVfb3NwcFBhdGg4 NiVcT1NQUEMuRExMIl0pDQoNCmVjaG8gU3ltbGlua2luZyBSZW5hbWVkIHNwcGNzLmRsbCAgICAgICAgICAgIFsiJV9ob29rUGF0aCVcc3BwY3MuZGxsIl0N Cg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpvaF9ob29raW5zdGFsbF9lcnJvcg0KDQppZiBkZWZpbmVk IGllcnJvciAoDQpzZXQgZXJyb3I9MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkluc3RhbGxpbmcgT2hvb2sgICAgICAgICAgICAgICAgICAgICAgICBbRmFp bGVkIHRvICVpZXJyb3IlXSINCmVjaG86DQpjYWxsIDpvaF9jaGVja2FwcHMNCmlmIGRlZmluZWQgY2hlY2tuYW1lcyAoDQpjYWxsIDpka19jb2xvciAlQmx1 ZSUgIkNsb3NlIFshY2hlY2tuYW1lcyFdIGFuZCB0cnkgYWdhaW4uIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJJZiBpdCBpcyBzdGlsbCBub3QgZml4ZWQs IHJlYm9vdCB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIHJlc3RhcnQgb3B0aW9uIGFuZCB0cnkgYWdhaW4uIg0KKSBlbHNlICgNCmlmIC9pIG5vdCAiJWllcnJv ciUiPT0iQ29weSIgY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJSZWJvb3QgeW91ciBtYWNoaW5lIHVzaW5nIHRoZSByZXN0YXJ0IG9wdGlvbiBhbmQgdHJ5IGFn YWluLiINCmlmIC9pICIlaWVycm9yJSI9PSJDb3B5IiBjYWxsIDpka19jb2xvciAlQmx1ZSUgIklmIHlvdSBhcmUgdXNpbmcgYW55IHRoaXJkLXBhcnR5IGFu dGl2aXJ1cywgY2hlY2sgaWYgaXQgaXMgYmxvY2tpbmcgdGhlIHNjcmlwdC4iDQopDQplY2hvOg0KKQ0KDQppZiBub3QgZGVmaW5lZCBleGhvb2sgaWYgbm90 IGRlZmluZWQgaWVycm9yICgNCmlmIGRlZmluZWQgaGFzaGVycm9yICgNCnNldCBlcnJvcj0xDQpzZXQgaWVycm9yPTENCmNhbGwgOmRrX2NvbG9yICVSZWQl ICJNb2RpZnlpbmcgSGFzaCBvZiBDdXN0b20gc3BwY3MuZGxsICAgICAgW0ZhaWxlZF0iDQopIGVsc2UgKA0KZWNobyBNb2RpZnlpbmcgSGFzaCBvZiBDdXN0 b20gc3BwY3MuZGxsICAgICAgW1N1Y2Nlc3NmdWxdDQopDQopDQoNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQoNCjpvaF9zZXRzcHANCg0Kc2V0IGlzT3NwcD0NCmlmICV3aW5idWlsZCUgR0VRIDkyMDAgKA0Kc2V0IHNwcD1Tb2Z0d2FyZUxpY2Vuc2lu Z1Byb2R1Y3QNCnNldCBzcHM9U29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlDQopIGVsc2UgKA0Kc2V0IGlzT3NwcD0xDQpzZXQgc3BwPU9mZmljZVNvZnR3YXJl UHJvdGVjdGlvblByb2R1Y3QNCnNldCBzcHM9T2ZmaWNlU29mdHdhcmVQcm90ZWN0aW9uU2VydmljZQ0KKQ0KaWYgIiUxIj09IjE0IiAoDQpzZXQgaXNPc3Bw PTENCnNldCBzcHA9T2ZmaWNlU29mdHdhcmVQcm90ZWN0aW9uUHJvZHVjdA0Kc2V0IHNwcz1PZmZpY2VTb2Z0d2FyZVByb3RlY3Rpb25TZXJ2aWNlDQopDQpl eGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6b2hfcHJvY2Vzcw0KDQpmb3IgJSUjIGluICgl X29JZHMlKSBkbyAoDQoNCnNldCBrZXk9DQpzZXQgX2FjdGlkPQ0Kc2V0IF9saWM9DQpzZXQgX3ByZXZpZXc9DQpzZXQgX0xpY2Vuc2U9JSUjDQoNCmVjaG8g JSUjIHwgZmluZCAvaSAiMjAyNCIgJW51bCUgJiYgKA0KaWYgZXhpc3QgIiFfb0xQYXRoIVxQcm9QbHVzMjAyNFByZXZpZXdWTF8qLnhybS1tcyIgaWYgbm90 IGV4aXN0ICIhX29MUGF0aCFcUHJvUGx1czIwMjRWTF8qLnhybS1tcyIgc2V0IF9wcmV2aWV3PS1QcmV2aWV3DQopDQpzZXQgX3Byb2Q9JSUjIV9wcmV2aWV3 IQ0KDQpjYWxsIDpvaG9va2RhdGEgZ2V0aW5mbyAhX3Byb2QhDQoNCmlmIG5vdCAiIWtleSEiPT0iIiAoDQplY2hvICIhYWxsYXBwcyEiIHwgZmluZCAvaSAi IV9hY3RpZCEiICVudWwxJSB8fCBjYWxsIDpvaF9pbnN0YWxsbGljDQppZiBub3QgJW9WZXIlPT0xNCBzZXQgZ2VuZXJpY2tleT0xDQpjYWxsIDpka19pbnNr ZXkgIlsha2V5IV0gWyFfcHJvZCFdIFshX2xpYyFdIg0KKSBlbHNlICgNCnNldCBlcnJvcj0xDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgUHJv ZHVjdCBJbiBTY3JpcHQgICAgICAgICAgICAgIFtPZmZpY2UgJW9WZXIlLjAgIV9wcm9kISBrZXkgbm90IGZvdW5kIGluIHNjcmlwdF0iDQpjYWxsIDpka19j b2xvciAlQmx1ZSUgIk1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBNQVMuIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyUN CmNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiJW1hcyUiDQopDQopDQoNCjo6ICBBZGQgU2hhcmVkQ29tcHV0ZXJMaWNlbnNpbmcgcmVnaXN0cnkga2V5IGlm IFJldGFpbCBPZmZpY2UgQzJSIGlzIGluc3RhbGxlZCBvbiBXaW5kb3dzIFNlcnZlcg0KOjogIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9v ZmZpY2UvdHJvdWJsZXNob290L29mZmljZS1zdWl0ZS1pc3N1ZXMvY2xpY2stdG8tcnVuLW9mZmljZS1vbi10ZXJtaW5hbC1zZXJ2ZXINCg0KaWYgZGVmaW5l ZCB3aW5zZXJ2ZXIgaWYgZGVmaW5lZCBfY29uZmlnIGlmIGV4aXN0ICIlX29MUGF0aCVcV29yZDIwMTlWTF9LTVNfQ2xpZW50X0FFKi54cm0tbXMiICgNCmVj aG8gJV9vSWRzJSB8IGZpbmQgL2kgIlJldGFpbCIgJW51bDElICYmICgNCnNldCBzY2FJc05lZWRlZD0xDQpyZWcgYWRkICVfY29uZmlnJSAvdiBTaGFyZWRD b21wdXRlckxpY2Vuc2luZyAvdCBSRUdfU1ogL2QgIjEiIC9mICVudWwxJQ0KZWNobyBBZGRpbmcgU2hhcmVkQ29tcHV0ZXJMaWNlbnNpbmcgUmVnICAgICAg W1N1Y2Nlc3NmdWxdIFtOZWVkZWQgb24gU2VydmVyIFdpdGggUmV0YWlsIE9mZmljZV0iDQopDQopDQoNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpvaF9wcm9jZXNzbXNpDQoNCjo6ICBQcm9jZXNzIE9mZmljZSBNU0kgVmVyc2lvbg0KDQpjYWxs IDpvaF9yZXNldA0KaWYgIiUxIj09IjE0IiAoDQpjYWxsIDpka19hY3RpZHMgNTlhNTI4ODEtYTk4OS00NzlkLWFmNDYtZjI3NWM2MzcwNjYzDQopIGVsc2Ug KA0KY2FsbCA6ZGtfYWN0aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KKQ0KDQpzZXQgb1Zlcj0lMQ0KZm9yIC9mICJza2lwPTIg dG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICUyXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyAoc2V0ICJfb1Jvb3Q9JSVi IikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlMlxDb21tb25cUHJvZHVjdFZlcnNpb24gL3YgTGFzdFByb2R1Y3Qi ICVudWw2JScpIGRvIChzZXQgIl92ZXJzaW9uPSUlYiIpDQppZiAiJV9vUm9vdDp+LTElIj09IlwiIHNldCAiX29Sb290PSVfb1Jvb3Q6fjAsLTElIg0KDQpl Y2hvICIlMiIgfCBmaW5kIC9pICJXb3c2NDMyTm9kZSIgJW51bDElICYmIHNldCBfb0FyY2g9eDg2DQppZiBub3QgIiVvc2FyY2glIj09Ing4NiIgaWYgbm90 IGRlZmluZWQgX29BcmNoIHNldCBfb0FyY2g9eDY0DQppZiAiJW9zYXJjaCUiPT0ieDg2IiBzZXQgX29BcmNoPXg4Ng0KDQppZiAvaSAiJV9vQXJjaCUiPT0i eDY0IiAoc2V0ICJfaG9va1BhdGg9JV9vUm9vdCUiICYgc2V0ICJfaG9vaz1zcHBjNjQuZGxsIikNCmlmIC9pICIlX29BcmNoJSI9PSJ4ODYiIChzZXQgIl9o b29rUGF0aD0lX29Sb290JSIgJiBzZXQgIl9ob29rPXNwcGMzMi5kbGwiKQ0KDQpjYWxsIDpvaF9wcGNwYXRoDQoNCmNhbGwgOm1zaW9mZmljZWRhdGEgJTIN Cg0KZWNobzoNCmVjaG8gQWN0aXZhdGluZyBPZmZpY2UuLi4gICAgICAgICAgICAgICAgICAgIFtNU0kgXnwgJV92ZXJzaW9uJSBefCAlX29BcmNoJV0NCg0K aWYgbm90IGRlZmluZWQgX29JZHMgKA0Kc2V0IGVycm9yPTENCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBJbnN0YWxsZWQgUHJvZHVjdHMgICAg ICAgICAgICAgW1Byb2R1Y3QgSURzIG5vdCBmb3VuZCwgYWJvcnRpbmcgYWN0aXZhdGlvbi4uLl0iDQpleGl0IC9iDQopDQoNCmlmIGRlZmluZWQgbm9Pc3Bw YyAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgT1NQUEMuRExMICAgICAgICAgICAgICAgICAgICAgIFtOb3QgZm91bmQuIEFib3J0aW5nIGFj dGl2YXRpb24uLi5dIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQpzZXQgZXJyb3I9MQ0KZXhpdCAvYg0KKQ0KDQppZiAlb1ZlciU9PTE0 IGlmIGRlZmluZWQgU2luZ2xlSW1hZ2UgKA0KZWNobyBDaGVja2luZyBJbnN0YWxsZWQgUHJvZHVjdHMgICAgICAgICAgICAgW1NpbmdsZUltYWdlIHByb2R1 Y3QgZm91bmQsIFByb2Zlc3Npb25hbCBSZXRhaWwga2V5IHdpbGwgYmUgdXNlZCBmb3IgYWN0aXZhdGlvbl0NCikNCg0KY2FsbCA6b2hfcHJvY2Vzcw0KaWYg ZGVmaW5lZCBpc09zcHAgKA0KY2FsbCA6b2hfaG9va2luc3RhbGxfb3NwcA0KKSBlbHNlICgNCmNhbGwgOm9oX2hvb2tpbnN0YWxsDQopDQoNCmV4aXQgL2IN Cg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpvaF9jbGVhcmJsb2NrDQoNCjo6ICBGaW5kIHJlbW5hbnRz IG9mIE9mZmljZSB2TmV4dC9zaGFyZWQvZGV2aWNlIGxpY2Vuc2UgYmxvY2sgYW5kIHJlbW92ZSBpdCBiZWNhdXNlIGl0IHN0b3BzIG90aGVyIGxpY2Vuc2Vz IGZyb20gYXBwZWFyaW5nDQo6OiAgaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL29mZmljZS90cm91Ymxlc2hvb3QvYWN0aXZhdGlvbi9yZXNl dC1vZmZpY2UtMzY1LXByb3BsdXMtYWN0aXZhdGlvbi1zdGF0ZQ0KDQpzZXQgX3NpZGxpc3Q9DQpmb3IgL2YgInRva2Vucz0qIGRlbGltcz0iICUlYSBpbiAo JyVwc2MlICIkcCA9ICdIS0xNOlxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxQcm9maWxlTGlzdCc7IEdldC1DaGlsZEl0 ZW0gJHAgfCBGb3JFYWNoLU9iamVjdCB7ICRwaSA9IChHZXQtSXRlbVByb3BlcnR5ICIiIiIkcFwkKCRfLlBTQ2hpbGROYW1lKSIiIiIpLlByb2ZpbGVJbWFn ZVBhdGg7IGlmICgkcGkgLWxpa2UgJypcVXNlcnNcKicgLWFuZCAoVGVzdC1QYXRoICIiIiIkcGlcTlRVU0VSLkRBVCIiIiIpIC1hbmQgLW5vdCAoJF8uUFND aGlsZE5hbWUgLW1hdGNoICdcLmJhayQnKSkgeyBTcGxpdC1QYXRoICRfLlBTUGF0aCAtTGVhZiB9IH0iICVudWw2JScpIGRvIChpZiBkZWZpbmVkIF9zaWRs aXN0IChzZXQgX3NpZGxpc3Q9IV9zaWRsaXN0ISAlJWEpIGVsc2UgKHNldCBfc2lkbGlzdD0lJWEpKQ0KDQppZiBub3QgZGVmaW5lZCBfc2lkbGlzdCAoDQpm b3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIkZXhwbG9yZXJQcm9jID0gR2V0LVByb2Nlc3MgLU5hbWUgZXhwbG9yZXIgfCBXaGVyZS1PYmplY3Qg eyRfLlNlc3Npb25JZCAtZXEgKEdldC1Qcm9jZXNzIC1JZCAkcGlkKS5TZXNzaW9uSWR9IHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMTsgJHNpZCA9IChnd21p IC1RdWVyeSAoJ1NlbGVjdCAqIEZyb20gV2luMzJfUHJvY2VzcyBXaGVyZSBQcm9jZXNzSUQ9JyArICRleHBsb3JlclByb2MuSWQpKS5HZXRPd25lclNpZCgp LlNpZDsgJHNpZCIgJW51bDYlJykgZG8gKHNldCBfc2lkbGlzdD0lJWEpDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIExvYWQg dGhlIHVubG9hZGVkIHVzZXJhY2NvdW50cyByZWdpc3RyeQ0KDQpzZXQgbG9hZGVkc2lkcz0NCnNldCBhbHJsb2FkZWRzaWRzPQ0KDQpmb3IgJSUjIGluICgl X3NpZGxpc3QlKSBkbyAoDQpyZWcgcXVlcnkgSEtVXCUlI1xTb2Z0d2FyZSAlbnVsJSAmJiAoDQpjYWxsIHNldCAiYWxybG9hZGVkc2lkcz0lJWFscmxvYWRl ZHNpZHMlJSAlJSMiDQopIHx8ICgNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3Nv ZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxQcm9maWxlTGlzdFwlJSMiIC92IFByb2ZpbGVJbWFnZVBhdGgiICVudWw2JScpIGRvICgNCnJlZyBsb2Fk IEhLVVwlJSMgIiUlYlxOVFVTRVIuREFUIiAlbnVsJQ0KcmVnIHF1ZXJ5IEhLVVwlJSNcU29mdHdhcmUgJW51bCUgJiYgKA0KY2FsbCBzZXQgImxvYWRlZHNp ZHM9JSVsb2FkZWRzaWRzJSUgJSUjIg0KKSB8fCAoDQpyZWcgdW5sb2FkIEhLVVwlJSMgJW51bCUNCikNCikNCikNCikNCg0KOjo9PT09PT09PT09PT09PT09 PT09PT09PT09PQ0KDQpzZXQgIl9zaWRsaXN0PSVsb2FkZWRzaWRzJSAlYWxybG9hZGVkc2lkcyUiDQoNCnNldCAvYSBjb3VudGVyPTANCmZvciAlJSMgaW4g KCVfc2lkbGlzdCUpIGRvIHNldCAvYSBjb3VudGVyKz0xDQoNCmlmICVjb3VudGVyJSBFUVUgMCAoDQpzZXQgZXJyb3I9MQ0KY2FsbCA6ZGtfY29sb3IgJVJl ZCUgIkNoZWNraW5nIFVzZXIgQWNjb3VudHMgU0lEICAgICAgICAgICAgICBbTm90IEZvdW5kXSINCmV4aXQgL2INCikNCg0KaWYgJWNvdW50ZXIlIEdUUiAx MCAoDQpjYWxsIDpka19jb2xvciAlR3JheSUgIkNoZWNraW5nIFRvdGFsIFVzZXIgQWNjb3VudHMgICAgICAgICAgICBbJWNvdW50ZXIlXSINCikNCg0KOjo9 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2xlYXIgdGhlIHZOZXh0L3NoYXJlZC9kZXZpY2UgbGljZW5zZSBibG9ja3Mgd2hpY2ggbWF5IHBy ZXZlbnQgb2hvb2sgYWN0aXZhdGlvbg0KDQpzZXQgdm5leHRleGlzdD0NCnJtZGlyIC9zIC9xICIlUHJvZ3JhbURhdGElXE1pY3Jvc29mdFxPZmZpY2VcTGlj ZW5zZXNcIiAlbnVsJQ0KDQpmb3IgJSV4IGluICgxNSAxNikgZG8gKA0KZm9yICUlIyBpbiAoJV9zaWRsaXN0JSkgZG8gKA0KcmVnIHF1ZXJ5IEhLVVwlJSNc U29mdHdhcmVcTWljcm9zb2Z0XE9mZmljZVwlJXguMFxDb21tb25cTGljZW5zaW5nIC9zICVudWwyJSB8IGZpbmRzdHIgL2kgIkNJRFRvTGljZW5zZUlkc01h cHBpbmcgTGljZW5zZUlkVG9FbWFpbE1hcHBpbmcgQCIgJW51bCUgJiYgc2V0IHZuZXh0ZXhpc3Q9MQ0KcmVnIGRlbGV0ZSBIS1VcJSUjXFNvZnR3YXJlXE1p Y3Jvc29mdFxPZmZpY2VcJSV4LjBcQ29tbW9uXExpY2Vuc2luZyAvZiAlbnVsJQ0KDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcg cXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cUHJvZmlsZUxpc3RcJSUjIiAvdiBQcm9maWxlSW1hZ2VQ YXRoIiAlbnVsNiUnKSBkbyAoDQpybWRpciAvcyAvcSAiJSViXEFwcERhdGFcTG9jYWxcTWljcm9zb2Z0XE9mZmljZVxMaWNlbnNlc1wiICVudWwlDQpybWRp ciAvcyAvcSAiJSViXEFwcERhdGFcTG9jYWxcTWljcm9zb2Z0XE9mZmljZVwlJXguMFxMaWNlbnNpbmdcIiAlbnVsJQ0KKQ0KKQ0KcmVnIGRlbGV0ZSAiSEtM TVxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlXCUleC4wXENvbW1vblxMaWNlbnNpbmciIC9mICVudWwlDQpyZWcgZGVsZXRlICJIS0xNXFNPRlRXQVJFXE1p Y3Jvc29mdFxPZmZpY2VcJSV4LjBcQ29tbW9uXExpY2Vuc2luZyIgL2YgL3JlZzozMiAlbnVsJQ0KcmVnIGRlbGV0ZSAiSEtMTVxTT0ZUV0FSRVxQb2xpY2ll c1xNaWNyb3NvZnRcT2ZmaWNlXCUleC4wXENvbW1vblxMaWNlbnNpbmciIC9mICVudWwlDQpyZWcgZGVsZXRlICJIS0xNXFNPRlRXQVJFXFBvbGljaWVzXE1p Y3Jvc29mdFxPZmZpY2VcJSV4LjBcQ29tbW9uXExpY2Vuc2luZyIgL2YgL3JlZzozMiAlbnVsJQ0KKQ0KDQo6OiAgQ2xlYXIgdk5leHQgaW4gVVdQIE9mZmlj ZQ0KDQppZiBkZWZpbmVkIG8xNnV3cGFwcGxpc3QgKA0KZm9yICUlIyBpbiAoJV9zaWRsaXN0JSkgZG8gKA0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAl JWEgaW4gKCcicmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFByb2ZpbGVMaXN0XCUlIyIgL3Yg UHJvZmlsZUltYWdlUGF0aCIgJW51bDYlJykgZG8gKA0Kcm1kaXIgL3MgL3EgIiUlYlxBcHBEYXRhXExvY2FsXFBhY2thZ2VzXE1pY3Jvc29mdC5PZmZpY2Uu RGVza3RvcF84d2VreWIzZDhiYndlXExvY2FsQ2FjaGVcTG9jYWxcTWljcm9zb2Z0XE9mZmljZVxMaWNlbnNlc1wiICVudWwlDQppZiBleGlzdCAiJSViXEFw cERhdGFcTG9jYWxcUGFja2FnZXNcTWljcm9zb2Z0Lk9mZmljZS5EZXNrdG9wXzh3ZWt5YjNkOGJid2VcU3lzdGVtQXBwRGF0YVxIZWxpdW1cVXNlci5kYXQi ICgNCnNldCBkZWZuYW1lPURFRlRFTVAtJSUjDQpyZWcgbG9hZCBIS1VcIWRlZm5hbWUhICIlJWJcQXBwRGF0YVxMb2NhbFxQYWNrYWdlc1xNaWNyb3NvZnQu T2ZmaWNlLkRlc2t0b3BfOHdla3liM2Q4YmJ3ZVxTeXN0ZW1BcHBEYXRhXEhlbGl1bVxVc2VyLmRhdCIgJW51bCUNCnJlZyBxdWVyeSBIS1VcIWRlZm5hbWUh XFNvZnR3YXJlXE1pY3Jvc29mdFxPZmZpY2VcMTYuMFxDb21tb25cTGljZW5zaW5nIC9zICVudWwyJSB8IGZpbmRzdHIgL2kgIkNJRFRvTGljZW5zZUlkc01h cHBpbmcgTGljZW5zZUlkVG9FbWFpbE1hcHBpbmcgQCIgJW51bCUgJiYgc2V0IHZuZXh0ZXhpc3Q9MQ0KcmVnIGRlbGV0ZSBIS1VcIWRlZm5hbWUhXFNvZnR3 YXJlXE1pY3Jvc29mdFxPZmZpY2VcMTYuMFxDb21tb25cTGljZW5zaW5nIC9mICVudWwlDQpyZWcgdW5sb2FkIEhLVVwhZGVmbmFtZSEgJW51bCUNCikNCikN CikNCikNCg0KaWYgZGVmaW5lZCB2bmV4dGV4aXN0ICgNCmVjaG86DQpjYWxsIDpka19jb2xvciAlR3JheSUgIlRoZSBsb2dnZWQtaW4gT2ZmaWNlIGFjY291 bnQgaGFzIGEgc3Vic2NyaXB0aW9uIGxpY2Vuc2UuIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJJZiB0aGUgc3Vic2NyaXB0aW9uIGlzIGFjdGl2ZSwgaXQg b3ZlcnJpZGVzIG90aGVyIGFjdGl2YXRpb24gbWV0aG9kcy4iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIklmIGl0IGlzIGV4cGlyaW5nIHNvb24sIHJlcnVu IHRoZSBhY3RpdmF0aW9uIHNjcmlwdCBhZnRlciBpdCBleHBpcmVzLiINCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIklmIGl0IGhhcyBhbHJlYWR5IGV4cGly ZWQgYW5kIGFjdGl2YXRpb24gZmFpbHMsIGdldCBoZWxwIGhlcmUgLSAiICVfWWVsbG93JSAiICVtYXMldHJvdWJsZXNob290Ig0KZWNobzoNCikNCg0KOjog IENsZWFyIFNoYXJlZENvbXB1dGVyTGljZW5zaW5nIGZvciBvZmZpY2UNCjo6ICBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvZGVwbG95b2Zm aWNlL292ZXJ2aWV3LXNoYXJlZC1jb21wdXRlci1hY3RpdmF0aW9uDQoNCmlmIG5vdCBkZWZpbmVkIHNjYUlzTmVlZGVkICgNCnJlZyBkZWxldGUgSEtMTVxT T0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlXENsaWNrVG9SdW5cQ29uZmlndXJhdGlvbiAvdiBTaGFyZWRDb21wdXRlckxpY2Vuc2luZyAvZiAlbnVsJQ0KcmVn IGRlbGV0ZSBIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2VcQ2xpY2tUb1J1blxDb25maWd1cmF0aW9uIC92IFNoYXJlZENvbXB1dGVyTGljZW5zaW5n IC9mIC9yZWc6MzIgJW51bCUNCnJlZyBkZWxldGUgSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlXDE1LjBcQ2xpY2tUb1J1blxDb25maWd1cmF0aW9u IC92IFNoYXJlZENvbXB1dGVyTGljZW5zaW5nIC9mICVudWwlDQpyZWcgZGVsZXRlIEhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XE9mZmljZVwxNS4wXENsaWNr VG9SdW5cQ29uZmlndXJhdGlvbiAvdiBTaGFyZWRDb21wdXRlckxpY2Vuc2luZyAvZiAvcmVnOjMyICVudWwlDQopDQoNCjo6ICBDbGVhciBkZXZpY2UtYmFz ZWQtbGljZW5zaW5nDQo6OiAgaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2RlcGxveW9mZmljZS9kZXZpY2UtYmFzZWQtbGljZW5zaW5nDQoN CmZvciAvZiAlJSMgaW4gKCdyZWcgcXVlcnkgIiVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIiAvZiAqLkRldmljZUJhc2VkTGljZW5zaW5nICVudWw2JSBe fCBmaW5kc3RyIFJFR18nKSBkbyByZWcgZGVsZXRlICIlbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiIgL3YgJSUjIC9mICVudWwlDQoNCjo6ICBSZW1vdmUg T0VNIHJlZ2lzdHJ5IGtleQ0KOjogIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2VuLXVzL29mZmljZS9vZmZpY2UtcmVwZWF0ZWRseS1wcm9tcHRz LXlvdS10by1hY3RpdmF0ZS1vbi1hLW5ldy1wYy1hOWE2YjA1Zi1mNmNlLTRkMWYtOGQ0OS1lYjUwMDdiNjRiYTENCg0KZm9yICUlIyBpbiAoMTUgMTYpIGRv ICgNCnJlZyBkZWxldGUgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XE9mZmljZVwlJSMuMFxDb21tb25cT0VNIiAvZiAlbnVsJQ0KcmVnIGRlbGV0ZSAiSEtM TVxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlXCUlIy4wXENvbW1vblxPRU0iIC9mIC9yZWc6MzIgJW51bCUNCikNCg0KcmVnIGRlbGV0ZSAiSEtVXFMtMS01 LTIwXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXFBvbGljaWVzXDBmZjFj ZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2MyIgL2YgJW51bCUNCnJlZyBkZWxldGUgIkhLVVxTLTEtNS0yMFxTb2Z0d2FyZVxNaWNyb3NvZnRcT2Zm aWNlU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm1cUG9saWNpZXNcMGZmMWNlMTUtYTk4OS00NzlkLWFmNDYtZjI3NWM2MzcwNjYzIiAvZiAlbnVsJQ0KcmVn IGRlbGV0ZSAiSEtVXFMtMS01LTIwXFNvZnR3YXJlXE1pY3Jvc29mdFxPZmZpY2VTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybVxQb2xpY2llc1w1OWE1Mjg4 MS1hOTg5LTQ3OWQtYWY0Ni1mMjc1YzYzNzA2NjMiIC9mICVudWwlDQoNCmVjaG8gQ2xlYXJpbmcgT2ZmaWNlIExpY2Vuc2UgQmxvY2tzICAgICAgICAgIFtT dWNjZXNzZnVsbHkgY2xlYXJlZCBmcm9tIGFsbCAlY291bnRlciUgdXNlciBhY2NvdW50c10NCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6 OiAgU29tZSByZXRhaWwgcHJvZHVjdHMgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgbGljZW5zZSBhbmQgbWF5IHNob3cgYSBiYW5uZXIgIlRoZXJlIHdhcyBh IHByb2JsZW0gY2hlY2tpbmcgdGhpcyBkZXZpY2UncyBsaWNlbnNlIHN0YXR1cy4iDQo6OiAgUmVzaWxpZW5jeSByZWdpc3RyeSBlbnRyeSBjYW4gc2tpcCB0 aGlzIGNoZWNrDQoNCnNldCBkZWZuYW1lPURFRlRFTVAtJXJhbmRvbSUNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAi SEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxQcm9maWxlTGlzdCIgL3YgRGVmYXVsdCIgJW51bDYlJykgZG8gY2Fs bCBzZXQgImRlZmRhdD0lJWIiDQoNCmlmIGRlZmluZWQgbzE2YzJyIGlmIGRlZmluZWQgb2hvb2thY3QgKA0KaWYgZXhpc3QgIiVkZWZkYXQlXE5UVVNFUi5E QVQiICgNCnJlZyBsb2FkIEhLVVwlZGVmbmFtZSUgIiVkZWZkYXQlXE5UVVNFUi5EQVQiICVudWwlDQpyZWcgcXVlcnkgSEtVXCVkZWZuYW1lJVxTb2Z0d2Fy ZSAlbnVsJSAmJiAoDQpyZWcgYWRkIEhLVVwlZGVmbmFtZSVcU29mdHdhcmVcTWljcm9zb2Z0XE9mZmljZVwxNi4wXENvbW1vblxMaWNlbnNpbmdcUmVzaWxp ZW5jeSAvdiAiVGltZU9mTGFzdEhlYXJ0YmVhdEZhaWx1cmUiIC90IFJFR19TWiAvZCAiMjA0MC0wMS0wMVQwMDowMDowMFoiIC9mICVudWwlDQopDQpyZWcg dW5sb2FkIEhLVVwlZGVmbmFtZSUgJW51bCUNCikNCg0KZm9yICUlIyBpbiAoJV9zaWRsaXN0JSkgZG8gKA0KcmVnIGRlbGV0ZSBIS1VcJSUjXFNvZnR3YXJl XE1pY3Jvc29mdFxPZmZpY2VcMTYuMFxDb21tb25cTGljZW5zaW5nXFJlc2lsaWVuY3kgL2YgJW51bCUNCnJlZyBhZGQgSEtVXCUlI1xTb2Z0d2FyZVxNaWNy b3NvZnRcT2ZmaWNlXDE2LjBcQ29tbW9uXExpY2Vuc2luZ1xSZXNpbGllbmN5IC92ICJUaW1lT2ZMYXN0SGVhcnRiZWF0RmFpbHVyZSIgL3QgUkVHX1NaIC9k ICIyMDQwLTAxLTAxVDAwOjAwOjAwWiIgL2YgJW51bCUNCikNCmVjaG8gQWRkaW5nIFJlZ2lzdHJ5IHRvIFNraXAgTGljZW5zZSBDaGVjayAgIFtTdWNjZXNz ZnVsbHkgYWRkZWQgdG8gYWxsICVjb3VudGVyJSBeJiBmdXR1cmUgbmV3IHVzZXIgYWNjb3VudHNdDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0KOjogIFVubG9hZCB0aGUgbG9hZGVkIHVzZXJhY2NvdW50cyByZWdpc3RyeQ0KDQpmb3IgJSUjIGluICglbG9hZGVkc2lkcyUpIGRvICgNCnJlZyB1 bmxvYWQgSEtVXCUlIyAlbnVsJQ0KKQ0KDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6 OiAgVW5pbnN0YWxsIG90aGVyIC8gZ3JhY2UgS2V5cw0KDQo6b2hfdW5pbnN0a2V5DQoNCnNldCB1cGtfcmVzdWx0PTANCmNhbGwgOmRrX2FjdGlkIDBmZjFj ZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KDQppZiAiJV9hY3Rwcm9qdmlzJSI9PSIxIiAoDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVw c2MlICJHZXQtV21pT2JqZWN0IC1RdWVyeSAnU0VMRUNUIElELCBEZXNjcmlwdGlvbiwgTGljZW5zZUZhbWlseSBGUk9NICVzcHAlIFdIRVJFIEFwcGxpY2F0 aW9uSUQ9JycwZmYxY2UxNS1hOTg5LTQ3OWQtYWY0Ni1mMjc1YzYzNzA2NjMnJyBBTkQgUGFydGlhbFByb2R1Y3RLZXkgSVMgTk9UIE5VTEwnIHwgV2hlcmUt T2JqZWN0IHsgJF8uTGljZW5zZUZhbWlseSAtbm90bWF0Y2ggJ1Byb2plY3QnIC1hbmQgJF8uTGljZW5zZUZhbWlseSAtbm90bWF0Y2ggJ1Zpc2lvJyB9IHwg U2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgSUQiICVudWw2JScpIGRvIGNhbGwgc2V0ICJfYWxsYWN0aWQ9JSVhICFfYWxsYWN0aWQhIg0KZm9yIC9m ICJkZWxpbXM9IiAlJWEgaW4gKCclcHNjJSAiR2V0LVdtaU9iamVjdCAtUXVlcnkgJ1NFTEVDVCBJRCwgRGVzY3JpcHRpb24sIExpY2Vuc2VGYW1pbHkgRlJP TSAlc3BwJSBXSEVSRSBBcHBsaWNhdGlvbklEPScnMGZmMWNlMTUtYTk4OS00NzlkLWFmNDYtZjI3NWM2MzcwNjYzJycgQU5EIFBhcnRpYWxQcm9kdWN0S2V5 IElTIE5PVCBOVUxMJyB8IFdoZXJlLU9iamVjdCB7ICchX2FsbGFjdGlkIScgLWNvbnRhaW5zICRfLklEIC1hbmQgKCRfLkxpY2Vuc2VGYW1pbHkgLW1hdGNo ICdQcm9qZWN0JyAtb3IgJF8uTGljZW5zZUZhbWlseSAtbWF0Y2ggJ1Zpc2lvJykgfSB8IFNlbGVjdC1PYmplY3QgLUV4cGFuZFByb3BlcnR5IElEIiAlbnVs NiUnKSBkbyBjYWxsIHNldCAiX2FsbGFjdGlkPSUlYSAhX2FsbGFjdGlkISINCikNCg0KZm9yICUlIyBpbiAoJWFwcHMlKSBkbyAoDQplY2hvICIlX2FsbGFj dGlkJSIgfCBmaW5kIC9pICIlJSMiICVudWwxJSB8fCAoDQoNCmlmICVfd21pYyUgRVFVIDEgd21pYyBwYXRoICVzcHAlIHdoZXJlIElEPSclJSMnIGNhbGwg VW5pbnN0YWxsUHJvZHVjdEtleSAlbnVsJQ0KaWYgJV93bWljJSBFUVUgMCAlcHNjJSAiJG51bGw9KFtXTUldJyVzcHAlPScnJSUjJycnKS5Vbmluc3RhbGxQ cm9kdWN0S2V5KCkiICVudWwlDQoNCmlmICFlcnJvcmxldmVsIT09MCAoDQpzZXQgdXBrX3Jlc3VsdD0xDQopIGVsc2UgKA0Kc2V0IGVycm9yPTENCnNldCB1 cGtfcmVzdWx0PTINCikNCikNCikNCg0KaWYgZGVmaW5lZCBvaG9va2FjdCBpZiBub3QgJXVwa19yZXN1bHQlPT0wIGVjaG86DQppZiAldXBrX3Jlc3VsdCU9 PTEgZWNobyBVbmluc3RhbGxpbmcgT3RoZXIvR3JhY2UgS2V5cyAgICAgICAgICAgW1N1Y2Nlc3NmdWxdDQppZiAldXBrX3Jlc3VsdCU9PTIgKA0KY2FsbCA6 ZGtfY29sb3IgJVJlZCUgIlVuaW5zdGFsbGluZyBPdGhlci9HcmFjZSBLZXlzICAgICAgICAgICBbRmFpbGVkXSINCmlmIG5vdCBkZWZpbmVkIHNob3dmaXgg KA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQplY2hvOg0Kc2V0IHNob3dmaXg9MQ0KKQ0KKQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIFJlZnJlc2ggV2luZG93cyBJbnNpZGVyIFByZXZpZXcgTGljZW5zZXMNCjo6ICBJ dCByZXF1aXJlZCBpbiBJbnNpZGVyIHZlcnNpb25zIG90aGVyd2lzZSBvZmZpY2UgbWF5IG5vdCBhY3RpdmF0ZQ0KDQo6b2hfbGljcmVmcmVzaA0KDQppZiBl eGlzdCAiJVN5c1BhdGglXHNwcFxzdG9yZV90ZXN0XDIuMFx0b2tlbnMuZGF0IiAoDQolcHNjJSAiU3RvcC1TZXJ2aWNlIHNwcHN2YyAtZm9yY2U7ICRzbHMg PSBHZXQtV21pT2JqZWN0IFNvZnR3YXJlTGljZW5zaW5nU2VydmljZTsgJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAnOnhy bVw6LionOy4gKFtzY3JpcHRibG9ja106OkNyZWF0ZSgkZlsxXSkpOyBSZWluc3RhbGxMaWNlbnNlcyIgJW51bCUNCmlmICFlcnJvcmxldmVsISBORVEgMCAl cHNjJSAiJHNscyA9IEdldC1XbWlPYmplY3QgU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlOyAkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykg LXNwbGl0ICc6eHJtXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSk7IFJlaW5zdGFsbExpY2Vuc2VzIiAlbnVsJQ0KKQ0KZXhpdCAvYg0K DQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIHJ1bm5pbmcgb2ZmaWNlIGFwcHMgYW5kIG5v dGlmeSB1c2VyDQoNCjpvaF9jaGVja2FwcHMNCg0Kc2V0IGNoZWNrYXBwcz0NCnNldCBjaGVja25hbWVzPQ0KZm9yIC9mICJ0b2tlbnM9MSIgJSVpIGluICgn dGFza2xpc3QgXnwgZmluZHN0ciAvSSAiLmV4ZSIgJW51bDYlJykgZG8gKHNldCAiY2hlY2thcHBzPSFjaGVja2FwcHMhIC0lJWktIikNCg0KZm9yICUlIyBp biAoDQpBY2Nlc3NfbXNhY2Nlc3MuZXhlDQpFeGNlbF9leGNlbC5leGUNCkdyb292ZV9ncm9vdmUuZXhlDQpMeW5jX2x5bmMuZXhlDQpPbmVOb3RlX29uZW5v dGUuZXhlDQpPdXRsb29rX291dGxvb2suZXhlDQpQb3dlclBvaW50X3Bvd2VycG50LmV4ZQ0KUHJvamVjdF93aW5wcm9qLmV4ZQ0KUHVibGlzaGVyX21zcHVi LmV4ZQ0KVmlzaW9fdmlzaW8uZXhlDQpXb3JkX3dpbndvcmQuZXhlDQpMaW1lX2xpbWUuZXhlDQopIGRvICgNCmZvciAvZiAidG9rZW5zPTEtMiBkZWxpbXM9 XyIgJSVBIGluICgiJSUjIikgZG8gKA0KZWNobyAhY2hlY2thcHBzISB8IGZpbmQgL2kgIi0lJUItIiAlbnVsMSUgJiYgKGlmIGRlZmluZWQgY2hlY2tuYW1l cyAoc2V0ICJjaGVja25hbWVzPSFjaGVja25hbWVzISAlJUEiKSBlbHNlIChzZXQgImNoZWNrbmFtZXM9JSVBIikpDQopDQopDQpleGl0IC9iDQoNCjo6PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgMXN0IGNvbHVtbiA9IE9mZmljZSB2ZXJzaW9uIG51bWJlcg0KOjog IDJuZCBjb2x1bW4gPSBBY3RpdmF0aW9uIElEDQo6OiAgM3JkIGNvbHVtbiA9IEZvciBPZmZpY2UgMjAxMyBhbmQgbGF0ZXIsIHRoZSBnZW5lcmF0ZWQga2V5 cyBhcmUgbGlzdGVkLiBGb3IgT2ZmaWNlIDIwMTAsIHRoZSBibG9ja2VkIGtleXMgc291cmNlZCBmcm9tIHRoZSBJbnRlcm5ldCBhcmUgbGlzdGVkLg0KOjog ICAgICAgICAgICAgICBGb3IgT2ZmaWNlIDIwMTMgYW5kIGxhdGVyLCBrZXkgcHJlZmVyZW5jZSBpcyBnaXZlbiBpbiB0aGlzIG9yZGVyLCBSZXRhaWw6VEI6 U3ViID4gUmV0YWlsID4gT0VNOk5PTlNMUCA+IFZvbHVtZTpNQUsgPiBWb2x1bWU6R1ZMSw0KOjogICAgICAgICAgICAgICBGb3IgT2ZmaWNlIDIwMTAsIGtl eSBwcmVmZXJlbmNlIGlzIGdpdmVuIGluIHRoaXMgb3JkZXIsIFJldGFpbCA+IFZvbHVtZTpNQUsNCjo6ICA0dGggY29sdW1uID0gTGFzdCBwYXJ0IG9mIGxp Y2Vuc2UgZGVzY3JpcHRpb24NCjo6ICA1dGggY29sdW1uID0gRWRpdGlvbg0KOjogIDZ0aCBjb2x1bW4gPSBPdGhlciBFZGl0aW9uIElEcyBpZiB0aGV5IGFy ZSBwYXJ0IG9mIHRoZSBzYW1lIHByaW1hcnkgcHJvZHVjdCAoRm9yIHJlZmVyZW5jZSBvbmx5KQ0KOjogIFNlcGFyYXRvciAgPSAiXyINCg0KOjo9PT09PT09 PT09PT09PT0NCg0KOjogV2UgY291bGRuJ3QgZmluZCBhbnkga2V5cyAoYmxvY2tlZC9nZW5lcmljIGRvZXNuJ3QgbWF0dGVyKSBmb3IgdGhlc2UgT2ZmaWNl IDIwMTAgcHJvZHVjdHMuIElmIHlvdSBoYXZlIHRoZW0sIHBsZWFzZSBzaGFyZSB3aXRoIHVzLg0KDQoxNF80ZWFmZjBkMC1jNmNiLTQxODctOTRmMy1jNzY1 NmQ0OWEwYWFfUmV0YWlsX19fX19fX19FeGNlbFJfW0hTRXhjZWxSXQ0KMTRfNzAwNGI3ZjAtNjQwNy00ZjQ1LThlYWMtOTY2ZTVmODY4YmRlX1JldGFpbF9f X19fX19fR3Jvb3ZlUg0KMTRfMTMzYzgzNTktNGU5My00MjQxLTgxMTgtMzBiYjE4NzM3ZWEwX1JldGFpbF9fX19fX19fUG93ZXJQb2ludFJfW0hTUG93ZXJQ b2ludFJdDQoxNF9kYjNiYmM5Yy1jZTUyLTQxZDEtYTQ2Zi0xYTFkNjgwNTkxMTlfUmV0YWlsX19fX19fX19Xb3JkUl9bSFNXb3JkUl0NCjE0X2RiZTNhZWUw LTUxODMtNGZmNy04MTQyLTY2MDUwMTczY2IwMV9SZXRhaWxfX19fX19fX1NtYWxsQnVzQmFzaWNzUl9bU21hbGxCdXNCYXNpY3NNU0ROUl0NCg0KOjogVGhl c2UgaW5zdGFsbGVycyBhcmUgbm90IHB1YmxpY2x5IGF2YWlsYWJsZSwgc28gaXQgZG9lc24ndCBtYXR0ZXIgaWYgd2UgZG9uJ3QgaGF2ZSB0aGVpciBrZXlz Lg0KDQoxNF8xOTMxNjExNy0zMGE4LTQ3NzMtOGZkOS03ZjcyMzFmNGUwNjBfU3ViUHJlcGlkX19fX19Ib21lQnVzaW5lc3NTdWJSDQoxNF80ZDA2ZjcyZS1m ZDUwLTRiYzItYTI0Yi1kNDQ4ZDdmMTdlZjJfU3ViUHJlcGlkX19fX19Qcm9qZWN0UHJvU3ViUg0KMTRfZTk4ZWYwYzAtNzFjNC00MmNlLTgzMDUtMjg3ZDg3 MjFlMjZjX1N1YlByZXBpZF9fX19fUHJvUGx1c1N1YlINCjE0XzE0ZjU5NDZhLWRlYmMtNDcxNi1iYWJjLTdlMmMyNDBmZWMwOF9SZXRhaWxfX19fX19fX01v bmRvUg0KMTRfNTMzYjY1NmEtNDQyNS00ODBiLThlMzAtMWEyMzU4ODk4MzUwX01BS19fX19fX19fX19fTW9uZG9WTA0KDQo6b2hvb2tkYXRhDQoNCnNldCBm PQ0KZm9yICUlIyBpbiAoDQo6OiBPZmZpY2UgMjAxMA0KMTRfNGQ0NjNjMmMtMDUwNS00NjI2LThjZGItYTRkYTgyZTJkOGVkXzdLVFlDLVhSNDNQLUMzTVJX LUJKS0ZELVhCJWYlWVBHX1JldGFpbF9fX19fX19fQWNjZXNzUg0KMTRfNzQ1ZmIzNzctMGE1OS00Y2E5LWI5YTktYzM1OTU1N2EyYzRlXzdYSFBRLUJRTVlH LVlCUDQ5LUNZOEIyLVQ4JWYlQ0dRX0J5UGFzc19fX19fX19fQWNjZXNzUnVudGltZVINCjE0Xzk1YWIzZWM4LTQxMDYtNGY5ZC1iNjMyLTAzYzAxOWQxZDIz Zl84OVJUUS1NVDRHSy02Q1BUWC1XV1A3Qy1KOSVmJUtYUl9NQUtfX19fX19fX19fX0FjY2Vzc1ZMDQoxNF83MWRjODZmZi1mMDU2LTQwZDAtOGZmYi05NTky NzA1YzliNzZfMzlUUlItQzJGMzctOVdZSjItTUpRWEgtQjklZiUzOEtfTUFLX19fX19fX19fX19FeGNlbFZMDQoxNF9mZGFkMGRmYS00MTdkLTRiNGYtOTNl NC02NGVhODg2N2I3ZmRfUkNHVDMtRlBRRFYtSDQ5Q0QtUFBEQkYtVEglZiU0N0dfTUFLX19fX19fX19fX19Hcm9vdmVWTA0KMTRfN2I3ZDFmMTctZmRjYi00 ODIwLTk3ODktOWJlYzZlMzc3ODIxXzNZUjlCLUQ5Vzc5LUJZNjZSLVI4WFlQLVFZJWYlWVlZX1JldGFpbF9fX19fX19fSG9tZUJ1c2luZXNzUl9bSG9tZUJ1 c2luZXNzRGVtb1JdDQoxNF8wOWUyZDM3ZS00NzRiLTQxMjEtODYyNi01OGFkOWJlNTc3NmZfM1g0M1ItSEhIWFgtRlJIUlctMk0yV0otOFYlZiVQSERfUmV0 YWlsX19fX19fX19Ib21lU3R1ZGVudFJfW0hvbWVTdHVkZW50RGVtb1JdDQoxNF9lZjFkYTQ2NC0wMWM4LTQzYTYtOTFhZi1lNGU1NzEzNzQ0ZjlfWERHSlkt S0ZIVzktSldYOVgtWU00R1ctR0MlZiU4V1JfUmV0YWlsX19fX19fX19JbmZvUGF0aFINCjE0Xzg1ZTIyNDUwLWI3NDEtNDMwYy1hMTcyLWEzNzk2MmM5Mzhh Zl82R0tUMi1LTUpQSy00UlJCRi04VlFLQi1KQiVmJTZHNl9NQUtfX19fX19fX19fX0luZm9QYXRoVkwNCjE0XzNmN2FhNjkzLTlhN2UtNDRmYy05MzA5LWJi M2Q4ZTYwNDkyNV8yVEczUC05REI3Ni00WVQ5OS04UlhHRC1DVyVmJVhCUF9SZXRhaWxfX19fX19fX09uZU5vdGVSX1tIU09uZU5vdGVSXQ0KMTRfNjg2MGIz MWYtNmE2Ny00OGI4LTg0YjktZTMxMmIzNDg1YzRiX0NWNjRQLUY0VlJILUJKMzNELVBINk1SLVg2JWYlOVJZX01BS19fX19fX19fX19fT25lTm90ZVZMDQox NF9mYmY0YWMzNi0zMWM4LTQzNDAtODY2Ni03OTg3MzEyOWNmNDBfOUQ4RlItN0dZQlctNFlHOE0tVjM2SkstVkQlZiU3Q01fUmV0YWlsX19fX19fX19PdXRs b29rUg0KMTRfYTlhZWFiZDgtNjNiOC00MDc5LWEyOGUtZjUzMTgwN2ZkNmI4X0o4QzlNLVlYTUgyLTlDWDQ0LTJDM1lHLVY3JWYlNjkyX01BS19fX19fX19f X19fT3V0bG9va1ZMDQoxNF9hY2I1MTM2MS1jMGRiLTQ4OTUtOTQ5Ny0xODMxYzQxZjMxYTZfR01CV00tV1ZYMjYtN1dIVjQtREI0M0QtV1YlZiVEWTJfUmV0 YWlsX19fX19fX19QZXJzb25hbFJfW1BlcnNvbmFsRGVtb1IsUGVyc29uYWxQcmVwYWlkUl0NCjE0XzM4MjUyOTQwLTcxOGMtNGFhNi04MWE0LTEzNTM5OGU1 Mzg1MV9IUEJRUC1SSkhEUi1RMzQ3Mi1QVDlRNi1QQiVmJUI3Ml9NQUtfX19fX19fX19fX1Bvd2VyUG9pbnRWTA0KMTRfOGI1NTljMzctMDExNy00MTNlLTky MWItYjg1M2FlYjZlMjEwXzM2N1g5LTlIUDlSLVRLSFk2LURINFFILUs5JWYlUFk3X1JldGFpbF9fX19fX19fUHJvZmVzc2lvbmFsUl9bUHJvZmVzc2lvbmFs QWNhZFIsUHJvZmVzc2lvbmFsRGVtb1IsT0VNLVNpbmdsZUltYWdlXQ0KMTRfNzI1NzE0ZDctZDU4Zi00ZDEyLTlmYTgtMzU4NzNjNmY3MjE1XzZKRDRHLUtS VzNKLTQ4TUdWLURNNkZDLVQ5JWYlV0tSX1JldGFpbF9fX19fX19fUHJvamVjdFByb1JfW1Byb2plY3RQcm9NU0ROUl0NCjE0XzFjZjU3YTU5LWM1MzItNGU1 Ni05YTdkLWZmYTJmZTk0YjQ3NF8zWERUSC1NTUdKNi1GOU1LWC1USFA4RC1HOSVmJUJQN19NQUtfX19fX19fX19fX1Byb2plY3RQcm9WTA0KMTRfNjg4ZjY1 ODktMmJkOS00MjRlLWExNTItYjEzZjM2YWE2ZGUxXzJXOTZWLVJUUTlSLTJCUFZULVBUOEg5LU1WJWYlNjhUX1JldGFpbF9fX19fX19fUHJvamVjdFN0ZFIN CjE0XzExYjM5NDM5LTZiOTMtNDY0Mi05NTcwLWYyZWI4MWJlMjIzOF80RFRUNC1ENE1LWC0yM0tGSC1KS1I2VC1ZSyVmJUcySl9NQUtfX19fX19fX19fX1By b2plY3RTdGRWTA0KMTRfNzFhZjdlODQtOTNlNi00MzYzLTliNjktNjk5ZTA0ZTc0MDcxXzJKOUg2LUg0RDNHLVBDWEQyLTk2WFZNLVRSJWYlUjczX1JldGFp bF9fX19fX19fUHJvUGx1c1JfW1Byb1BsdXNBY2FkUixQcm9QbHVzTVNETlIsU3ViNFJdDQoxNF9mZGYzZWNiOS1iNTZmLTQzYjItYTliOC0xYjQ4YjZiYWUx YTdfNkNENkMtOVI4UEItVDJEOVktOFJLS1gtVzclZiVERktfTUFLX19fX19fX19fX19Qcm9QbHVzVkxfW1Byb1BsdXNBY2FkVkxdDQoxNF85ODY3NzYwMy1h NjY4LTRmYTQtOTk4MC0zZjFmMDVmNzhmNjlfQ1RSSlAtUDcyVlYtSkJGOFktNFc2V1ctSFglZiVIVkdfUmV0YWlsX19fX19fX19QdWJsaXNoZXJSDQoxNF8z ZDAxNDc1OS1iMTI4LTQ0NjYtOTAxOC1lODBmNjMyMGQ5ZDBfMzJZRzktM1ZYNzctWVhKVlYtUFJWRlctVFQlZiU4QlZfTUFLX19fX19fX19fX19QdWJsaXNo ZXJWTA0KMTRfODA5MDc3MWUtZDQxYS00NDgyLTkyOWUtZGU4N2YxZjQ3ZTQ2XzdWS1hILTlCV0NHLVJQVEJCLUpCUlYzLUdSJWYlSFlDX01BS19fX19fX19f X19fU21hbGxCdXNCYXNpY3NWTA0KMTRfYjc4ZGY2OWUtMDk2Ni00MGIxLWFlODUtMzBhNTEzNGRlZGQwX0g0OEs2LUZCNFk2LVA4M0dILTlKN1hHLUhEJWYl S0tYX0J5UGFzc19fX19fX19fU1BEUg0KMTRfYjZkMjU2NWMtMzQxZC00NzY4LWFkN2QtYWRkYmUwMGJiNWNlX1czQlRYLUg2Qlc3LVE2REZXLUJYRkZZLThS JWYlVkpQX1JldGFpbF9fX19fX19fU3RhbmRhcmRSX1tTdGFuZGFyZE1TRE5SXVtLZXlpc2Zvck1TRE5SXQ0KMTRfMWY3NmUzNDYtZTBiZS00OWJjLTk5NTQt NzBlYzUzYTRmY2ZlXzJYVFFQLUdEUjdDLUdUWFBDLTZXNlBWLTRSJWYlWEdDX01BS19fX19fX19fX19fU3RhbmRhcmRWTF9bU3RhbmRhcmRBY2FkVkxdDQox NF8yNzQ1ZTU4MS01NjVhLTQ2NzAtYWU5MC02YmY3YzU3ZmZlNDNfVlhISEItVzdIQkQtN00zNDItUko3UDgtQ0glZiVCRDZfQnlQYXNzX19fX19fX19TdGFy dGVyUg0KMTRfNjZjYWQ1NjgtYzJkYy00NTlkLTkzZWMtMmYzY2I5NjdlZTM0XzJSRFBULVdQWVFNLUMyV1hGLUJUUERXLTJKJWYlMkhNX1JldGFpbF9fX19f X19fVmlzaW9TSVJfUHJlbVtQcm8sU3RkXQ0KMTRfMzY3NTZjYjgtOGU2OS00ZDExLTk1MjItNjg4OTk1MDdjZDZhXzdQS0ZULVgyTUtRLUdUNlgyLThDQjJX LUNIJWYlQzlLX01BS19fX19fX19fX19fVmlzaW9TSVZMX1ByZW1bUHJvLFN0ZF0NCjE0Xzk4ZDQwNTBlLTljOTgtNDliZi05YmUxLTg1ZTEyZWIzYWIxM182 SjNYSy1ERktHSy1YMzczVi1RSkhZTS1WMyVmJUZDMl9NQUtfX19fX19fX19fX1dvcmRWTA0KOjogT2ZmaWNlIDIwMTMNCjE1X2FiNGQwNDdiLTk3Y2YtNDEy Ni1hNjlmLTM0ZGYwOGUyZjI1NF9CN1JGWS03TlhQSy1RNDM0Mi1ZOVgySC0zSiVmJVg0WF9SZXRhaWxfX19fX19fX0FjY2Vzc1JldGFpbA0KMTVfMjU5ZGU1 YmUtNDkyYi00NGIzLTlkNzgtOTY0NWY4NDhmN2IwX1gzWE5CLUhKQjdLLTY2VEhILThEV1EzLVhIJWYlR0pQX0J5cGFzc19fX19fX19fQWNjZXNzUnVudGlt ZVJldGFpbA0KMTVfNDM3NDAyMmQtNTZiOC00OGMxLTliYjctZDhmMmZjNzI2MzQzXzlNRjlHLUNOMzJCLUhWN1hULTlYSjhULTlLJWYlVkY0X01BS19fX19f X19fX19fQWNjZXNzVm9sdW1lDQoxNV8xYjFkOWJkNS0xMmVhLTQwNjMtOTY0Yy0xNmU3ZTg3ZDZlMDhfTlQ4ODktTUJINFgtOE1ENEgtWDhSMkQtV1ElZiVI RjhfUmV0YWlsX19fX19fX19FeGNlbFJldGFpbA0KMTVfYWMxYWU3ZmQtYjk0OS00ZTA0LWEzMzAtODQ5YmM0MDYzOGNmX1kzTjM2LVlDSERLLVhZV0JHLUtZ UVZWLUJEJWYlVEoyX01BS19fX19fX19fX19fRXhjZWxWb2x1bWUNCjE1X2NmYWY1MzU2LTQ5ZTMtNDhhOC1hYjNjLWU3MjlhYjc5MTI1MF9CTUs0Vy02Tjg4 Qi1CUDlRUi1QSEZDSy1NRyVmJTdHRl9SZXRhaWxfX19fX19fX0dyb292ZVJldGFpbA0KMTVfNDgyNWFjMjgtY2U0MS00NWE3LTllNmUtMWZlZDc0MDU3NjAx X1JOODRELTdIQ1dZLUZUQ0JLLUpNWFdNLUhUJWYlN0dKX01BS19fX19fX19fX19fR3Jvb3ZlVm9sdW1lDQoxNV9jMDJmYjYyZS0xY2Q1LTRlMTgtYmEyNS1l MDQ4MDQ2N2ZmYWFfMldRTkYtR0JLNEItWFZHNkYtQkJNWDctTTQlZiVGMllfT0VNLVBlcnBfX19fX19Ib21lQnVzaW5lc3NQaXBjUmV0YWlsDQoxNV9hMmI5 MGU3YS1hNzk3LTQ3MTMtYWY5MC1mMGJlY2Y1MmExZGRfWVdENFItQ05LVlQtVkc4VkotOTMzM0ItUkMlZiVXOUZfU3Vic2NyaXB0aW9uX19Ib21lQnVzaW5l c3NSZXRhaWwNCjE1XzFmZGZiNGU0LWY5YzktNDFjNC1iMDU1LWM4MGRhZjAwNjk3ZF9COTJRWS1OS1lGUS02S1RLSC1WV1cyUS0zUCVmJUIzQl9PRU0tQVJN X19fX19fX0hvbWVTdHVkZW50QVJNUmV0YWlsDQoxNV9lYmVmOWYwNS01MjczLTQwNGEtOTI1My1jNWUyNTJmNTA1NTVfUVBHOTYtQ05UN00tS0gzNkstS1k0 SFEtTTclZiVUQlJfT0VNLUFSTV9fX19fX19Ib21lU3R1ZGVudFBsdXNBUk1SZXRhaWwNCjE1X2YyZGUzNTBkLTMwMjgtNDEwYS1iZmFlLTI4M2UwMGI0NGQw ZV82V1czTi1CREdNOS1QQ0NIRC05UVBQOS1QMyVmJTRRR19TdWJzY3JpcHRpb25fX0hvbWVTdHVkZW50UmV0YWlsDQoxNV80NDk4NDM4MS00MDZlLTRhMzUt YjFjMy1lNTRmNDk5NTU2ZTJfUlY3TlEtSFkzV1ctN0NLV0gtUVRWTVctMjklZiVWSENfUmV0YWlsX19fX19fX19JbmZvUGF0aFJldGFpbA0KMTVfOWUwMTY5 ODktNDAwNy00MmE2LTgwNTEtNjRlYjk3MTEwY2YyX0M0VEdOLVFRVzZZLUZZS1hDLTZXSlc3LVg3JWYlM1ZHX01BS19fX19fX19fX19fSW5mb1BhdGhWb2x1 bWUNCjE1XzkxMDNmM2NlLTEwODQtNDQ3YS04MjdlLWQ2MDk3ZjY4Yzg5NV82TURONC1XRjNGVi00V0gzUS1XNjk5Vi1SRyVmJUNNWV9QcmVwaWRCeXBhc3Nf X0x5bmNBY2FkZW1pY1JldGFpbA0KMTVfZmY2OTNiZjQtMDI3Ni00ZGRiLWJiNDItNzRlZjFhMGM5ZjRkX040MkJGLUNCWTlGLVcyQzdSLVgzOTdYLURZJWYl RlFXX1ByZXBpZEJ5cGFzc19fTHluY0VudHJ5UmV0YWlsDQoxNV9mYWRhNjY1OC1iZmM2LTRjNGUtODI1YS01OWE4OTgyMmNkYThfODlQMjMtMk5LMlItSlhN Mk0tM1E4UjgtQlclZiVNM1lfUmV0YWlsX19fX19fX19MeW5jUmV0YWlsDQoxNV9lMTI2NGUxMC1hZmFmLTQ0MzktYTk4Yi0yNTZkZjhiYjE1NmZfM1dLQ0Qt Uk40ODktNE03WEotR0oyR1EtWUIlZiVGUTZfTUFLX19fX19fX19fX19MeW5jVm9sdW1lDQoxNV82OWVjOTE1Mi0xNTNiLTQ3MWEtYmYzNS03N2VjODg2ODNl YWVfVk5XSEYtRktGQlctUTJSR0QtSFlIV0YtUjMlZiVISDJfU3Vic2NyaXB0aW9uX19Nb25kb1JldGFpbA0KMTVfZjMzNDg1YTAtMzEwYi00YjcyLTlhMGUt YjFkNjA1NTEwZGJkXzJZTllRLUZRTVZHLUNCOEtXLTZYS1lELU03JWYlUlJKX01BS19fX19fX19fX19fTW9uZG9Wb2x1bWUNCjE1XzMzOTFlMTI1LWY2ZTQt NGIxZS04OTljLWEyNWU2MDkyZDQwZF80VEdXVi02TjlQNi1HMkg4WS0ySFdLQi1CNCVmJUZGNF9CeXBhc3NfX19fX19fX09uZU5vdGVGcmVlUmV0YWlsDQox NV84YjUyNGJjYy02N2VhLTQ4NzYtYTUwOS00NWU0NmY2MzQ3ZThfM0tYWFEtUFZOMkMtOFA3WVktSENWODgtR1YlZiVHUTZfUmV0YWlsX19fX19fX19PbmVO b3RlUmV0YWlsDQoxNV9iMDY3ZTk2NS03NTIxLTQ1NWItYjlmNy1jNzQwMjA0NTc4YTJfSkRNV0YtTkpDN0ItSFJDSFktV0ZUOEctQlAlZiVYRDlfTUFLX19f X19fX19fX19PbmVOb3RlVm9sdW1lDQoxNV8xMjAwNGI0OC1lNmM4LTRmZmEtYWQ1YS1hYzhkNDQ2Nzc2NWFfOU40UlEtQ0Y4UjItSEJWQ0ItSjNDOVYtOTQl ZiVQNERfUmV0YWlsX19fX19fX19PdXRsb29rUmV0YWlsDQoxNV84ZDU3N2M1MC1hZTVlLTQ3ZmQtYTI0MC0yNDk4NmY3M2Q1MDNfSE5HMjktR0dXUkctUkZD OEMtSlRGUDQtMkolZiU5RkhfTUFLX19fX19fX19fX19PdXRsb29rVm9sdW1lDQoxNV81YWFiODU2MS0xNjg2LTQzZjctOWZmNS0yYzg2MWRhNThkMTdfOUNZ QjMtTkZNUlctWUZERzYtWEM3VEYtQlklZiUzNkpfT0VNLVBlcnBfX19fX19QZXJzb25hbFBpcGNSZXRhaWwNCjE1XzE3ZTlkZjJkLWVkOTEtNDM4Mi05MDRi LTRmZWQ2YTEyY2FmMF8yTkNRSi1NRlJNSC1UWFY4My1KN1Y0Qy1SViVmJVJXQ19SZXRhaWxfX19fX19fX1BlcnNvbmFsUmV0YWlsDQoxNV8zMTc0M2I4Mi1i ZmJjLTQ0YjYtYWExMi04NWQ0MmU2NDRkNWJfSFZNTjItS1BIUUgtRFZRTUstN0IzQ00tRkclZiVCRkNfUmV0YWlsX19fX19fX19Qb3dlclBvaW50UmV0YWls DQoxNV9lNDBkY2I0NC0xZDVjLTQwODUtOGU4Zi05NDNmMzNjNGYwMDRfNDdES04tSFBKUDctUkY5TTMtVkNZVDItVE0lZiVRNEdfTUFLX19fX19fX19fX19Q b3dlclBvaW50Vm9sdW1lDQoxNV8wNjQzODNmYS0xNTM4LTQ5MWMtODU5Yi0wZWNhYjE2OWEwYWJfTjNRTU0tR0tEVDMtSlFHWDYtN1gzTVEtNEclZiVCRzNf UmV0YWlsX19fX19fX19Qcm9QbHVzUmV0YWlsDQoxNV8yYjg4YzRmMi1lYThmLTQzY2QtODA1ZS00ZDQxMzQ2ZTE4YTdfUUtITlgtTTlHR0gtVDNRTVctWVBL NFEtUVIlZiVQOVZfTUFLX19fX19fX19fX19Qcm9QbHVzVm9sdW1lDQoxNV80ZTI2Y2FjMS1lMTVhLTQ0NjctOTA2OS1jYjQ3YjY3ZmUxOTFfQ0Y5REQtNkNO VzItQkpXSlEtQ1ZDRlgtWTclZiVUWERfT0VNLVBlcnBfX19fX19Qcm9mZXNzaW9uYWxQaXBjUmV0YWlsDQoxNV80NGJjNzBlMi1mYjgzLTRiMDktOTA4Mi1l NTU1N2UwYzJlZGVfTUJRQk4tQ1FQVDYtUFhSTUMtVFlKRlItM0MlZiU4TVlfUmV0YWlsX19fX19fX19Qcm9mZXNzaW9uYWxSZXRhaWwNCjE1XzJmNzIzNDBj LWI1NTUtNDE4ZC04YjQ2LTM1NTk0NGZlNjZiOF9XUFk4Ti1QRFBZNC1GQzdURi1LTVA3UC1LVyVmJVlGWV9TdWJzY3JpcHRpb25fX1Byb2plY3RQcm9SZXRh aWwNCjE1X2VkMzRkYzg5LTFjMjctNGVjZC04YjJmLTYzZDBmNGNlZGMzMl9XRkNUMi1OQkZRNy1KRDdWVi1NRkpYNi02RiVmJTJDTV9NQUtfX19fX19fX19f X1Byb2plY3RQcm9Wb2x1bWUNCjE1XzU4ZDk1YjA5LTZhZjYtNDUzZC1hOTc2LThlZjBhZTAzMTZiMV9OVEhRVC1WS0s2Vy1CUkI4Ny1IVjM0Ni1ZOSVmJTZX OF9TdWJzY3JpcHRpb25fX1Byb2plY3RTdGRSZXRhaWwNCjE1XzJiOWU0YTM3LTYyMzAtNGI0Mi1iZWUyLWUyNWNlODZjOGM3YV8zQ05RWC1UMzRUWS05OVJI NC1DNFlEMi1LVyVmJVlHVl9NQUtfX19fX19fX19fX1Byb2plY3RTdGRWb2x1bWUNCjE1X2MzYTA4MTRhLTcwYTQtNDcxZi1hZjM3LTIzMTNhNjMzMTExMV9U V05DSi1ZUjg0Vy1YN1BQRi02RFBSUC1ENiVmJTdWQ19SZXRhaWxfX19fX19fX1B1Ymxpc2hlclJldGFpbA0KMTVfMzhlYTQ5ZjYtYWQxZC00M2YxLTk4ODgt OTlhMzVkN2M5NDA5X0RKUEhWLU5DSlY2LUdXUFQ2LUsyNkpYLUM3JWYlR1g2X01BS19fX19fX19fX19fUHVibGlzaGVyVm9sdW1lDQoxNV9iYTNlMzgzMy02 YTdlLTQ0NWEtODlkMC03ODAyYTlhNjg1ODhfM05ZNkotV0hUM0YtNDdCRFYtSkhGMzYtMjMlZiU0M1dfUHJlcGlkQnlwYXNzX19TUERSZXRhaWwNCjE1XzMy MjU1YzBhLTE2YjQtNGNlMi1iMzg4LThhNDI2N2UyMTllYl9WNlZXTi1LQzJIUi1ZWURENi05VjdIUS03VCVmJTdWUF9SZXRhaWxfX19fX19fX1N0YW5kYXJk UmV0YWlsDQoxNV9hMjRjY2E1MS0zZDU0LTRjNDEtOGE3Ni00MDMxZjUzMzhjYjJfOVRONkItUENZSDQtTUNWRFEtS1Q4M0MtVE0lZiVRN1RfTUFLX19fX19f X19fX19TdGFuZGFyZFZvbHVtZQ0KMTVfYTU2YTNiMzctM2EzNS00YmJiLWEwMzYtZWVlNWYxODk4ZWVlX05WSzJHLTJNWTRHLTdKWDJQLTdENkYyLVZGJWYl UUJSX1N1YnNjcmlwdGlvbl9fVmlzaW9Qcm9SZXRhaWwNCjE1XzNlNDI5NGRkLWE3NjUtNDliYy04ZGJkLWNmOGI2MmE0YmQzZF9ZTjdDRi1YUkg2Ui1DR0tS WS1HS1BWMy1CRyVmJTdXRl9NQUtfX19fX19fX19fX1Zpc2lvUHJvVm9sdW1lDQoxNV85ODBmOWUzZS1mNWE4LTQxYzgtODU5Ni02MTQwNGFkZGY2NzdfTkNS QjctVlA0OEYtNDNGWVktNjJQM1ItMzYlZiU3V0tfU3Vic2NyaXB0aW9uX19WaXNpb1N0ZFJldGFpbA0KMTVfNDRhMWY2ZmYtMDg3Ni00ZWRiLTkxNjktZGJi NDMxMDFlZTg5X1JYNjNZLTRORksyLVhUWUM4LUM2QjNXLVlQJWYlWFBKX01BS19fX19fX19fX19fVmlzaW9TdGRWb2x1bWUNCjE1XzE5MTUwOWYyLTY5Nzct NDU2Zi1hYjMwLWNmMDQ5MmIxZTkzYV9OQjc3Vi1SUEZRNi1QTU1LUS1UODdEVi1NNCVmJUQ4NF9SZXRhaWxfX19fX19fX1dvcmRSZXRhaWwNCjE1XzljZWRl ZjE1LWJlMzctNGZmMC1hMDhhLTEzYTA0NTU0MDY0MV9SUEhQQi1ZN05DNC0zVllGTS1EVzdWRC1HOCVmJVlKOF9NQUtfX19fX19fX19fX1dvcmRWb2x1bWUN Cjo6IE9mZmljZSAzNjUgLSAxNS4wIHZlcnNpb24NCjE1Xzc0MjE3OGVkLTZiMjgtNDJkZC1iM2Q3LWI3YzBlYTc4NzQxYl9ZOU5GOS1NMlFXRC1GRjZSSi1R SlczNi1SUiVmJUYyVF9TdWJUZXN0X19fX19fX08zNjVCdXNpbmVzc1JldGFpbA0KMTVfYTk2ZjhkYWUtZGE1NC00ZmFkLWJkYzYtMTA4ZGE1OTI3MDdhXzNO TURDLUc3QzNXLTY4UkdQLUNCNE1ILTRDJWYlWENIX1N1YlRlc3QxX19fX19fTzM2NUhvbWVQcmVtUmV0YWlsDQoxNV9lM2RhY2MwNi0zYmMyLTRlMTMtOGU1 OS04ZTA1ZjMyMzIzMjVfSDhETjgtWTJZUDMtQ1I5SlQtREhEUjktQzclZiVHUDNfU3Vic2NyaXB0aW9uMl9PMzY1UHJvUGx1c1JldGFpbA0KMTVfMGJjMWRh ZTQtNjE1OC00YTFjLWE4OTMtODA3NjY1YjkzNGIyXzJRQ05CLVJNREtKLUdDOFBCLTdRR1FWLTdRJWYlVFFKX1N1YnNjcmlwdGlvbjJfTzM2NVNtYWxsQnVz UHJlbVJldGFpbA0KOjogT2ZmaWNlIDM2NSAtIDE2LjAgdmVyc2lvbg0KMTZfZGFiYWExZjItMTA5Yi00OTZkLWJmNDktMTUzNmNjODYyOTAwXzNIWUpOLTlL Rzk5LUY4Vkc5LVYzRFQ4LUpGJWYlTUhWX1N1YnNjcmlwdGlvbl9fTzM2NUFwcHNCYXNpY1JldGFpbA0KMTZfNzQyMTc4ZWQtNmIyOC00MmRkLWIzZDctYjdj MGVhNzg3NDFiX1k5TkY5LU0yUVdELUZGNlJKLVFKVzM2LVJSJWYlRjJUX1N1YlRlc3RfX19fX19fTzM2NUJ1c2luZXNzUmV0YWlsDQoxNl8yZjVjNzFiNC01 YjdhLTQwMDUtYmI2OC1mOWZhYzI2ZjJlYTNfVzYyTlEtMjY3UVItUlRGNzQtUEYyTUgtSlElZiVNVEhfU3Vic2NyaXB0aW9uX19PMzY1RWR1Q2xvdWRSZXRh aWwNCjE2X2E5NmY4ZGFlLWRhNTQtNGZhZC1iZGM2LTEwOGRhNTkyNzA3YV8zTk1EQy1HN0MzVy02OFJHUC1DQjRNSC00QyVmJVhDSF9TdWJUZXN0MV9fX19f X08zNjVIb21lUHJlbVJldGFpbA0KMTZfZTNkYWNjMDYtM2JjMi00ZTEzLThlNTktOGUwNWYzMjMyMzI1X0g4RE44LVkyWVAzLUNSOUpULURIRFI5LUM3JWYl R1AzX1N1YnNjcmlwdGlvbjJfTzM2NVByb1BsdXNSZXRhaWwNCjE2XzBiYzFkYWU0LTYxNTgtNGExYy1hODkzLTgwNzY2NWI5MzRiMl8yUUNOQi1STURLSi1H QzhQQi03UUdRVi03USVmJVRRSl9TdWJzY3JpcHRpb24yX08zNjVTbWFsbEJ1c1ByZW1SZXRhaWwNCjo6IE9mZmljZSAyMDE2DQoxNl9iZmEzNThiMC05OGYx LTQxMjUtODQyZS01ODVmYTEzMDMyZTZfV0hLNE4tWVFHSEItWFdYQ0MtRzNIWUMtNkolZiVGOTRfUmV0YWlsX19fX19fX19BY2Nlc3NSZXRhaWwNCjE2Xzlk OWZhZjllLWQzNDUtNGI0OS1hZmNlLTY4Y2IwYTUzOWM3Y19STkI3Vi1QNDhGNC0zRllZNi0yUDNSMy02MyVmJUJRVl9QcmVwaWRCeXBhc3NfX0FjY2Vzc1J1 bnRpbWVSZXRhaWwNCjE2XzNiMmZhMzNmLWNkNWEtNDNhNS1iZDk1LWY0OWYzZjU0NmIwYl9KSjJZNC1OOEtNMy1ZOEtZMy1ZMjJGUi1SMyVmJUtWS19NQUtf X19fX19fX19fX0FjY2Vzc1ZvbHVtZQ0KMTZfNDI0ZDUyZmYtN2FkMi00YmM3LThhYzYtNzQ4ZDc2N2I0NTVkX1JLSkJOLVZXVE0yLUJES1hYLVJLUUZELUpU JWYlWVEyX1JldGFpbF9fX19fX19fRXhjZWxSZXRhaWwNCjE2XzY4NTA2MmE3LTYwMjQtNDJlNy04YzVmLTZiYjllNjNlNjk3Zl9GVkdOUi1YODJCMi02UFJK TS1ZVDRXNy04SCVmJVYzNl9NQUtfX19fX19fX19fX0V4Y2VsVm9sdW1lDQoxNl9jMDJmYjYyZS0xY2Q1LTRlMTgtYmEyNS1lMDQ4MDQ2N2ZmYWFfMldRTkYt R0JLNEItWFZHNkYtQkJNWDctTTQlZiVGMllfT0VNLVBlcnBfX19fX19Ib21lQnVzaW5lc3NQaXBjUmV0YWlsDQoxNl84NjgzNGQwMC03ODk2LTRhMzgtOGZh ZS0zMmYyMGI4NmZhMmJfSE02Rk0tTlZGNzgtS1Y5UE0tRjM2QjgtRDklZiVNWERfUmV0YWlsX19fX19fX19Ib21lQnVzaW5lc3NSZXRhaWwNCjE2XzA5MDg5 NmEwLWVhOTgtNDhhYy1iNTQ1LWJhNWRhMGViMGM5Y19QQlFQSi1OQzIySy02OU1YRC1LV01SRi1XRiVmJUc3N19PRU0tQVJNX19fX19fX0hvbWVTdHVkZW50 QVJNUmV0YWlsDQoxNl82YmJlMjA3Ny0wMWE0LTQyNjktYmYxNS01YmY0ZDhlZmMwYjJfNkYyTlktN1JUWDQtTUQ5S00tVEo0M0gtOTQlZiVUQlRfT0VNLUFS TV9fX19fX19Ib21lU3R1ZGVudFBsdXNBUk1SZXRhaWwNCjE2X2MyOGFjZGI4LWQ4YjMtNDE5OS1iYWE0LTAyNGQwOWU5N2M5OV9QTlBSVi1GMjYyNy1ROEpW Qy0zREdSOS1XVCVmJVlSS19SZXRhaWxfX19fX19fX0hvbWVTdHVkZW50UmV0YWlsDQoxNl9lMjEyNzUyNi1iNjBjLTQzZTAtYmVkMS0zYzlkYzNkNWE0Njhf WVdENFItQ05LVlQtVkc4VkotOTMzM0ItUkMlZiUzQjhfUmV0YWlsX19fX19fX19Ib21lU3R1ZGVudFZOZXh0UmV0YWlsDQoxNl82OWVjOTE1Mi0xNTNiLTQ3 MWEtYmYzNS03N2VjODg2ODNlYWVfVk5XSEYtRktGQlctUTJSR0QtSFlIV0YtUjMlZiVISDJfU3Vic2NyaXB0aW9uX19Nb25kb1JldGFpbA0KMTZfMmNkMGVh N2UtNzQ5Zi00Mjg4LWEwNWUtNTY3YzU3M2IyYTZjX0ZNVFFRLTg0TlI4LTI3NDRSLU1YRjRQLVBHJWYlWVIzX01BS19fX19fX19fX19fTW9uZG9Wb2x1bWUN CjE2XzQzNjM2NmRlLTU1NzktNGYyNC05NmRiLTM4OTNlNDQwMDAzMF9YWU5URy1SOTZGWS0zNjlIWC1ZRlBIWS1GOSVmJUNQTV9CeXBhc3NfX19fX19fX09u ZU5vdGVGcmVlUmV0YWlsDQoxNl84M2FjNGRkOS0xYjkzLTQwZWQtYWE1NS1lZGUyNWJiNmFmMzhfRlhGNkYtQ05DMjYtVzY0M0MtSzZLQjctNlglZiVYVzNf UmV0YWlsX19fX19fX19PbmVOb3RlUmV0YWlsDQoxNl8yM2I2NzJkYS1hNDU2LTQ4NjAtYThmMy1lMDYyYTUwMWQ3ZThfOVRZVk4tRDc2SEstQlZNV1QtWTdH ODgtOVQlZiVQUFZfTUFLX19fX19fX19fX19PbmVOb3RlVm9sdW1lDQoxNl81YTY3MDgwOS0wOTgzLTRjMmQtOGFhZC1kM2MyYzViN2Q1ZDFfN040S0ctUDJR REgtODZWOUMtREpGVkYtMzYlZiU5VzlfUmV0YWlsX19fX19fX19PdXRsb29rUmV0YWlsDQoxNl81MDA1OTk3OS1hYzZmLTQ0NTgtOWU3OS03MTBiY2I0MTcy MWFfN1FQTlItM0hGREctWVA2VDktSlFDS1EtS0slZiVYWENfTUFLX19fX19fX19fX19PdXRsb29rVm9sdW1lDQoxNl81YWFiODU2MS0xNjg2LTQzZjctOWZm NS0yYzg2MWRhNThkMTdfOUNZQjMtTkZNUlctWUZERzYtWEM3VEYtQlklZiUzNkpfT0VNLVBlcnBfX19fX19QZXJzb25hbFBpcGNSZXRhaWwNCjE2X2E5ZjY0 NWExLTBkNmEtNDk3OC05MjZhLWFiY2IzNjNiNzJhNl9GVDdWRi1YQk45Mi1IUERKVi1SSE1CWS02ViVmJUtCRl9SZXRhaWxfX19fX19fX1BlcnNvbmFsUmV0 YWlsDQoxNl9mMzJkMTI4NC0wNzkyLTQ5ZGEtOWFjNi1kZWIyYmM5YzgwYjZfTjdHQ0ItV1FUN0stUVJIV0ctVFRQWUQtN1QlZiU5WEZfUmV0YWlsX19fX19f X19Qb3dlclBvaW50UmV0YWlsDQoxNl85YjQwNjBjOS1hN2Y1LTRhNjYtYjczMi1mYWYyNDhiNzI0MGZfWDNSVDktTkRHNjQtVk1LMk0tS1E2WFktRFAlZiVG R1ZfTUFLX19fX19fX19fX19Qb3dlclBvaW50Vm9sdW1lDQoxNl9kZTUyYmQ1MC05NTY0LTRhZGMtOGZjYi1hMzQ1YzE3Zjg0ZjlfR000M04tRjc0MlEtNkpE REstTTYyMkotSjglZiVHRFZfUmV0YWlsX19fX19fX19Qcm9QbHVzUmV0YWlsDQoxNl9jNDc0NTZlMy0yNjVkLTQ3YjYtOGNhMC1jMzBhYmJkMGNhMzZfRk5W SzgtOERWQ0otRjdYM0otS0dWUUItUkMlZiUyUVlfTUFLX19fX19fX19fX19Qcm9QbHVzVm9sdW1lDQoxNl80ZTI2Y2FjMS1lMTVhLTQ0NjctOTA2OS1jYjQ3 YjY3ZmUxOTFfQ0Y5REQtNkNOVzItQkpXSlEtQ1ZDRlgtWTclZiVUWERfT0VNLVBlcnBfX19fX19Qcm9mZXNzaW9uYWxQaXBjUmV0YWlsDQoxNl9kNjRlZGMw MC03NDUzLTQzMDEtODQyOC0xOTczNDNmYWZiMTZfTlhGVEstWUQ5WTctWDlNTUotOUJXTTYtSjIlZiVRVkhfUmV0YWlsX19fX19fX19Qcm9mZXNzaW9uYWxS ZXRhaWwNCjE2XzJmNzIzNDBjLWI1NTUtNDE4ZC04YjQ2LTM1NTk0NGZlNjZiOF9XUFk4Ti1QRFBZNC1GQzdURi1LTVA3UC1LVyVmJVlGWV9TdWJzY3JpcHRp b25fX1Byb2plY3RQcm9SZXRhaWwNCjE2XzgyZjUwMmI1LWIwYjAtNDM0OS1iZDJjLWM1NjBkZjg1YjI0OF9QS0MzTi04Rjk5SC0yOE1WWS1KNFJZWS1DVyVm JUdESF9NQUtfX19fX19fX19fX1Byb2plY3RQcm9Wb2x1bWUNCjE2XzE2NzI4NjM5LWE5YWItNDk5NC1iNmQ4LWY4MTA1MWU2OTgzM19KQk5QSC1ZRjJGNy1R OVkyOS04NkNURy1DOSVmJVlHVl9NQUtDMlJfX19fX19fX1Byb2plY3RQcm9YVm9sdW1lDQoxNl81OGQ5NWIwOS02YWY2LTQ1M2QtYTk3Ni04ZWYwYWUwMzE2 YjFfTlRIUVQtVktLNlctQlJCODctSFYzNDYtWTklZiU2VzhfU3Vic2NyaXB0aW9uX19Qcm9qZWN0U3RkUmV0YWlsDQoxNl84MmU2YjMxNC0yYTYyLTRlNTEt OTIyMC02MTM1OGRkMjMwZTZfNFRHV1YtNk45UDYtRzJIOFktMkhXS0ItQjQlZiVHOTNfTUFLX19fX19fX19fX19Qcm9qZWN0U3RkVm9sdW1lDQoxNl80MzEw NThmMC1jMDU5LTQ0YzUtYjllNy1lZDJkZDQ2YjY3ODlfTjNXMlEtNjlNQlQtMjdSRDktQkg4VjMtSlQlZiUyQzhfTUFLQzJSX19fX19fX19Qcm9qZWN0U3Rk WFZvbHVtZQ0KMTZfNmUwYzFkOTktYzcyZS00OTY4LWJjYjctYWI3OWUwM2UyMDFlX1dLV05ELVg2RzlHLUNETVRWLUNQR1lKLTZNJWYlVkJGX1JldGFpbF9f X19fX19fUHVibGlzaGVyUmV0YWlsDQoxNl9mY2MxNzU3Yi01ZDVmLTQ4NmEtODdjZi1jNGQ2ZGVkYjYwMzJfOVFWTjItUFhYUlgtOFY0VzgtUTc5MjYtVEol ZiVHRDhfTUFLX19fX19fX19fX19QdWJsaXNoZXJWb2x1bWUNCjE2XzkxMDNmM2NlLTEwODQtNDQ3YS04MjdlLWQ2MDk3ZjY4Yzg5NV82TURONC1XRjNGVi00 V0gzUS1XNjk5Vi1SRyVmJUNNWV9QcmVwaWRCeXBhc3NfX1NreXBlU2VydmljZUJ5cGFzc1JldGFpbA0KMTZfOTcxY2QzNjgtZjJlMS00OWMxLWFlZGQtMzMw OTA5Y2UxOGI2XzRONEQ4LTNKN1kzLVlZVzdDLTczSEQyLVY4JWYlUkhZX1ByZXBpZEJ5cGFzc19fU2t5cGVmb3JCdXNpbmVzc0VudHJ5UmV0YWlsDQoxNl80 MThkMmI5Zi1iNDkxLTRkN2YtODRmMS00OWUyN2NjNjY1OTdfUEJKNzktNzdOWTQtVlJHRkctWThXWUMtQ0slZiVDUkNfUmV0YWlsX19fX19fX19Ta3lwZWZv ckJ1c2luZXNzUmV0YWlsDQoxNl8wM2NhM2I5YS0wODY5LTQ3NDktODk4OC0zY2JjOWQ5ZjUxYmJfRE1UQ0otS05SS1ItSlY4VFEtVjJDUjItVkYlZiVURkhf TUFLX19fX19fX19fX19Ta3lwZWZvckJ1c2luZXNzVm9sdW1lDQoxNl80YTMxYzI5MS0zYTEyLTRjNjQtYjhhYi1jZDc5MjEyYmU0NWVfMkZQV04tNEg2Q00t S0Q4UVEtOEhDSEMtUDklZiVYWVdfUmV0YWlsX19fX19fX19TdGFuZGFyZFJldGFpbA0KMTZfMGVkOTRhYWMtMjIzNC00MzA5LWJhMjktNzRiZGJiODg3MDgz X1dIR01RLUpOTUdULU1EUVZGLVdEUjY5LUtRJWYlQldDX01BS19fX19fX19fX19fU3RhbmRhcmRWb2x1bWUNCjE2X2E1NmEzYjM3LTNhMzUtNGJiYi1hMDM2 LWVlZTVmMTg5OGVlZV9OVksyRy0yTVk0Ry03SlgyUC03RDZGMi1WRiVmJVFCUl9TdWJzY3JpcHRpb25fX1Zpc2lvUHJvUmV0YWlsDQoxNl8yOTViMmMwMy00 YjFjLTQyMjEtYjI5Mi0xNDExZjQ2OGJkMDJfTlJLVDktQzhHUDItWERZWFEtWVc3MkstTUclZiU5MkJfTUFLX19fX19fX19fX19WaXNpb1Byb1ZvbHVtZQ0K MTZfMDU5NGRjMTItODQ0NC00OTEyLTkzNmEtNzQ3Y2E3NDJkYmRiX0c5OFEyLUI2Tjc3LUNGSDlKLUs4MjRHLVhRJWYlQ0M0X01BS0MyUl9fX19fX19fVmlz aW9Qcm9YVm9sdW1lDQoxNl85ODBmOWUzZS1mNWE4LTQxYzgtODU5Ni02MTQwNGFkZGY2NzdfTkNSQjctVlA0OEYtNDNGWVktNjJQM1ItMzYlZiU3V0tfU3Vi c2NyaXB0aW9uX19WaXNpb1N0ZFJldGFpbA0KMTZfNDQxNTFjMmQtYzM5OC00NzFmLTk0NmYtNzY2MDU0MmUzMzY5X1hOQ0pCLVlZODgzLUpSVzY0LURQWE1Y LUpYJWYlQ1I2X01BS19fX19fX19fX19fVmlzaW9TdGRWb2x1bWUNCjE2XzFkMWM2ODc5LTM5YTMtNDdhNS05YTZkLWFjZWVmYTZhMjg5ZF9CMkhUTi1KUEg4 Qy1KNlk2Vi1IQ0hLQi00MyVmJU1HVF9NQUtDMlJfX19fX19fX1Zpc2lvU3RkWFZvbHVtZQ0KMTZfY2FjYWExYmYtZGE1My00YzNiLTk3MDAtMTE3MzhlZjFj MmE1X1A4SzgyLU5RN0dHLUpLWThULTZWSFZZLTg4JWYlR0dEX1JldGFpbF9fX19fX19fV29yZFJldGFpbA0KMTZfYzMwMDA3NTktNTUxZi00ZjRhLWJjYWMt YTRiNDJjYmYxZGUyX1lITVdDLVlONlY5LVdKUFhELTNXUUtQLVRNJWYlVkNWX01BS19fX19fX19fX19fV29yZFZvbHVtZQ0KOjogT2ZmaWNlIDIwMTkNCjE2 XzUxODY4N2JkLWRjNTUtNDViOS04ZmE2LWY5MThlMTA4MmU4M19XUllKNi1HM05QNy03Vkg5NC04WDdLUC1KQiVmJTdIQ19SZXRhaWxfX19fX19fX0FjY2Vz czIwMTlSZXRhaWwNCjE2XzM4NWI5MWQ2LTljMmMtNGEyZS04NmI1LWY0NGQ0NGE0OGM1Zl82RldIWC1OS1lYSy1CVzM0US03WEM5Ri1ROSVmJVBYN19NQUst QUVfX19fX19fX0FjY2VzczIwMTlWb2x1bWUNCjE2XzIyZTZiOTZjLTEwMTEtNGNkNS04YjM1LTNjOGZiNjM2NmI4Nl9GR1FOSi1KV0pDRy03UThNRy1STVJH Si05VCVmJVFWRl9QcmVwaWRCeXBhc3NfX0FjY2Vzc1J1bnRpbWUyMDE5UmV0YWlsDQoxNl9jMjAxYzJiNy0wMmExLTQxYTgtYjQ5Ni0zN2M3MjkxMGNkNGFf S0JQTlctNjRDTU0tOEtXQ0ItMjNGNDQtOEIlZiU3SE1fUmV0YWlsX19fX19fX19FeGNlbDIwMTlSZXRhaWwNCjE2XzA1Y2I0ZTFkLWNjODEtNDVkNS1hNzY5 LWYzNGIwOWI5YjM5MV84TlQ0WC1HUU1DSy02Mlg0UC1UVzZRUC1ZSyVmJVBZRl9NQUstQUVfX19fX19fX0V4Y2VsMjAxOVZvbHVtZQ0KMTZfN2ZlMDllZWYt NWVlZC00NzMzLTlhNjAtZDcwMTlkZjExY2FjX1FCTjJZLTlCMjg0LTlLVzc4LUs0OFBCLVI2JWYlMllUX1JldGFpbF9fX19fX19fSG9tZUJ1c2luZXNzMjAx OVJldGFpbA0KMTZfNjMwM2QxNGEtYWZhZC00MzFmLTg0MzQtODEwNTJhNjVmNTc1X0RKVE5ZLTRIRFdNLVREV0IyLThQV0MyLVcyJWYlUlJUX09FTS1BUk1f X19fX19fSG9tZVN0dWRlbnRBUk0yMDE5UmV0YWlsDQoxNl8yMTVjODQxZC1mZmMxLTRmMDMtYmQxMS01YjI3YjZhYjY0Y2NfTk04V1QtQ0ZIQjItUUJHWEst SjhXNkotR1YlZiVLOEZfT0VNLUFSTV9fX19fX19Ib21lU3R1ZGVudFBsdXNBUk0yMDE5UmV0YWlsDQoxNl80NTM5YWEyYy01YzMxLTRkNDctOTEzOS01NDNh ODY4ZTU3NDFfWE5XUE0tMzJYUUMtWTdRSkMtUUdHQlYtWVklZiU3SktfUmV0YWlsX19fX19fX19Ib21lU3R1ZGVudDIwMTlSZXRhaWwNCjE2XzIwZTM1OWQ1 LTkyN2YtNDdjMC04YTI3LTM4YWRiZGQyNzEyNF9XUjQzRC1OTVdRUS1IQ1FSMi1WS1hEUi0zNyVmJUI3SF9SZXRhaWxfX19fX19fX091dGxvb2syMDE5UmV0 YWlsDQoxNl85MmE5OWVkOC0yOTIzLTRjYjctYTRjNS0zMWRhNmIwYjhjZjNfUk4zUUItR1Q2RDctWUIzVkgtRjNSUEItM0clZiVRWUJfTUFLLUFFX19fX19f X19PdXRsb29rMjAxOVZvbHVtZQ0KMTZfMjc0N2I3MzEtMGYxZi00MTNlLWE5MmQtMzg2ZWMxMjc3ZGQ4X05NQlk4LVYzQ1Y3LUJYNks2LTI5MjJZLTQzJWYl TTdUX1JldGFpbF9fX19fX19fUGVyc29uYWwyMDE5UmV0YWlsDQoxNl83ZTYzY2MyMC1iYTM3LTQyYTEtODIyZC1kNWYyOWYzM2ExMDhfSE4yN0stSkhKOFIt N1Q3S0stV0pZQzMtRk0lZiU3TU1fUmV0YWlsX19fX19fX19Qb3dlclBvaW50MjAxOVJldGFpbA0KMTZfMTNjMmQ3YmYtZjEwZC00MmViLTllOTMtYWJmODQ2 Nzg1NDM0XzI5R05NLVZNMzNWLVdSMjNLLUhHMkRULUtUJWYlUVlSX01BSy1BRV9fX19fX19fUG93ZXJQb2ludDIwMTlWb2x1bWUNCjE2X2EzMDcyYjhmLWFk Y2MtNGU3NS04ZDYyLWZkZWI5YmRmYWU1N19CTjRYSi1SOURZWS05Nlc0OC1ZSzhETS1NWSVmJTdQWV9SZXRhaWxfX19fX19fX1Byb1BsdXMyMDE5UmV0YWls DQoxNl82NzU1YzdhNy00ZGZlLTQ2ZjUtYmNlOC00MjdiZThlOWRjNjJfVDhZQk4tNFlWM1gtS0syNFEtUVhCRDctVDMlZiVDNjNfTUFLLUFFX19fX19fX19Q cm9QbHVzMjAxOVZvbHVtZQ0KMTZfMTcxN2MxZTAtNDdkMy00ODk5LWE2ZDMtMTAyMmRiNzQxNWUwXzlOWERLLU1SWTk4LTJWSlY4LUdGNzNKLVRRJWYlOUZL X1JldGFpbF9fX19fX19fUHJvZmVzc2lvbmFsMjAxOVJldGFpbA0KMTZfMGQyNzBlZjctNWFhZi00MzcwLWEzNzItYmM4MDZiOTZhZGI3X0pEVE5DLVBQNzdU LVQ5SDJXLUc0SjJKLVZIJWYlOEpLX1JldGFpbF9fX19fX19fUHJvamVjdFBybzIwMTlSZXRhaWwNCjE2X2Q0ZWJhZGQ2LTQwMWItNDBkNS1hZGY0LWE1ZDRh Y2NkNzJkMV9UQlhCRC1GTldLSi1XUkhCRC1LQlBISC1YRCVmJTlGMl9NQUstQUVfX19fX19fX1Byb2plY3RQcm8yMDE5Vm9sdW1lDQoxNl9iYjdmZmU1Zi1k YWY5LTRiNzktYjEwNy00NTNlMWM4NDI3YjVfUjNKTlQtOFBCRFAtTVRXQ0stVkQyVjgtSE0lZiVLRjlfUmV0YWlsX19fX19fX19Qcm9qZWN0U3RkMjAxOVJl dGFpbA0KMTZfZmRhYTNjMDMtZGMyNy00YThkLThjYmYtYzNkODQzYTI4ZGRjX1JCUkZYLU1RTkRKLTRYRkhGLTdRVkRSLUpIJWYlWEdDX01BSy1BRV9fX19f X19fUHJvamVjdFN0ZDIwMTlWb2x1bWUNCjE2X2YwNTNhN2M3LWYzNDItNGFiOC05NTI2LWExZDZlNTEwNTgyM180UUMzNi1OVzNZSC1EMlk5RC1SSlBDNy1W ViVmJUI5RF9SZXRhaWxfX19fX19fX1B1Ymxpc2hlcjIwMTlSZXRhaWwNCjE2XzQwMDU1NDk1LWJlMDAtNDQ0ZS05OWNjLTA3NDQ2NzI5YjUzZV9LOEYyRC1O Qk0zMi1CRjI2Vi1ZQ0tGSi0yOSVmJVk5V19NQUstQUVfX19fX19fX1B1Ymxpc2hlcjIwMTlWb2x1bWUNCjE2X2I2MzllNTVjLThmM2UtNDdmZS05NzYxLTI2 YzZhNzg2YWQ2Yl9KQkRLRi02TkNENi00OUszRy0yVFY3OS1CSyVmJVA3M19SZXRhaWxfX19fX19fX1NreXBlZm9yQnVzaW5lc3MyMDE5UmV0YWlsDQoxNl8x NWE0MzBkNC01ZTNmLTRlNmQtOGEwYS0xNGJmM2NhZWU0YzdfOU1OUTctWVBRM0ItNldKWE0tRzgzVDMtQ0IlZiVCREtfTUFLLUFFX19fX19fX19Ta3lwZWZv ckJ1c2luZXNzMjAxOVZvbHVtZQ0KMTZfZjg4Y2ZkZWMtOTRjZS00NDYzLWE5NjktMDM3YmU5MmJjMGU3X045NzIyLUJWOUg2LVdUSlRULUZQQjkzLTk3JWYl OE1LX1ByZXBpZEJ5cGFzc19fU2t5cGVmb3JCdXNpbmVzc0VudHJ5MjAxOVJldGFpbA0KMTZfZmRmYTM0ZGQtYTQ3Mi00Yjg1LWJlZTYtY2YwN2JmMGFhYTFj X05ER1ZNLU1EMjdILTJYSFZDLUtERFgyLVlLJWYlUDc0X1JldGFpbF9fX19fX19fU3RhbmRhcmQyMDE5UmV0YWlsDQoxNl9iZWI1MDY1Yy0xODcyLTQwOWUt OTRlMi00MDNiY2ZiNmE4NzhfTlQzVjYtWE1CSzctUTY2TUYtVk1LUjQtRkMlZiUzM01fTUFLLUFFX19fX19fX19TdGFuZGFyZDIwMTlWb2x1bWUNCjE2X2E2 ZjY5ZDY4LTU1OTAtNGUwMi04MGI5LWU3MjMzZGZmMjA0ZV8yTldWVy1RR0Y0VC05Q1BNQi1XWURROS03WCVmJVA3OV9SZXRhaWxfX19fX19fX1Zpc2lvUHJv MjAxOVJldGFpbA0KMTZfZjQxYWJmODEtZjQwOS00YjBkLTg4OWQtOTJiM2UzZDdkMDA1XzMzWUY0LUdOQ1EzLUo2R0RNLUo2N1AzLUZNJWYlN1FQX01BSy1B RV9fX19fX19fVmlzaW9Qcm8yMDE5Vm9sdW1lDQoxNl80YTU4MjAyMS0xOGMyLTQ4OWYtOWIzZC01MTg2ZGU0OGYxY2RfMjYzV0stM043OTctN1I0MzctMjhC S0ctM1YlZiU4TThfUmV0YWlsX19fX19fX19WaXNpb1N0ZDIwMTlSZXRhaWwNCjE2XzkzM2VkMGUzLTc0N2QtNDhiMC05YzJjLTdjZWI0YzdlNDczZF9CR05I WC1RVFBSSi1GOUM5Ry1SOFFRRy04VCVmJTI3Rl9NQUstQUVfX19fX19fX1Zpc2lvU3RkMjAxOVZvbHVtZQ0KMTZfNzJjZWUxYzItMzM3Ni00Mzc3LTlmMjUt NDAyNGI2YmFhZGY4X0pYUjhILU5KM01LLVg2Nlc4LTc4Q1dELVFSJWYlVlIyX1JldGFpbF9fX19fX19fV29yZDIwMTlSZXRhaWwNCjE2X2ZlNWZlOWQ1LTNi MDYtNDAxNS1hYTM1LWIxNDZmODVjNDcwOV85RjM2Ui1QTlZISC0zRFhHUS03Q0QySC1SOSVmJUQzVl9NQUstQUVfX19fX19fX1dvcmQyMDE5Vm9sdW1lDQo6 OiBPZmZpY2UgMjAyMQ0KMTZfZjYzNDM5OGUtYWY2OS00OGM5LWIyNTYtNDc3YmVhMzA3OGI1X1AyODZCLU4zWFlQLTM2UVJRLTI5Q01QLVJWJWYlWDlNX1Jl dGFpbF9fX19fX19fQWNjZXNzMjAyMVJldGFpbA0KMTZfYWUxN2RiNzQtMTZiMC00MzBiLTkxMmYtNGZlNDU2ZTI3MWRiX0pCSDNOLVA5N0ZQLUZSVEpELU1H SzJDLVZGJWYlV0c2X01BSy1BRV9fX19fX19fQWNjZXNzMjAyMVZvbHVtZQ0KMTZfODQ0YzM2Y2ItODUxYy00OWU3LTkwNzktMTJlNjJhMDQ5ZTJhX01OWDlE LVBCODM0LVZDR1kyLUsyUlcyLTJEJWYlUDNEX0J5cGFzc19fX19fX19fQWNjZXNzUnVudGltZTIwMjFSZXRhaWwNCjE2X2ZiMDk5YzE5LWQ0OGItNGEyZi1h MTYwLTQzODMwMTEwNjBhYV9WNlFGQi03TjdHOS1QRjdXOS1NOEZRTS1NWSVmJThHOV9SZXRhaWxfX19fX19fX0V4Y2VsMjAyMVJldGFpbA0KMTZfOWRhMWVj ZGItM2E2Mi00MjczLWEyMzQtYmY2ZDQzZGMwNzc4X1dOWVI0LUtNUjlILUtWQzhXLTdISjhCLUs3JWYlOURRX01BSy1BRV9fX19fX19fRXhjZWwyMDIxVm9s dW1lDQoxNl8zOGI5MmI2My0xZGZmLTRiZTctODQ4My0yYTgzOTQ0MWEyYmNfSk05OU4tNE1NRDgtRFFDR0otVk1ZRlktUjYlZiUzWUtfU3Vic2NyaXB0aW9u X19Ib21lQnVzaW5lc3MyMDIxUmV0YWlsDQoxNl8yZjI1ODM3Ny03MzhmLTQ4ZGQtOTM5Ny0yODdlNDMwNzk5NThfTjNDV0QtMzhYVkgtS1JYMlktWVJQNzQt NlIlZiVCQjJfU3Vic2NyaXB0aW9uX19Ib21lU3R1ZGVudDIwMjFSZXRhaWwNCjE2XzI3OTcwNmY0LTNhNGItNDg3Ny05NDliLWY4YzI5OWNmMGNjNV9OQjJU US0zWTc5Qy03N0M2TS1RTVk3SC03USVmJVk4UF9SZXRhaWxfX19fX19fX09uZU5vdGUyMDIxUmV0YWlsDQoxNl8wYzdhZjYwZC0wNjY0LTQ5ZmMtOWIwMS00 MWIyZGVhODEzODBfVEhOS0MtS0ZSNkMtWTg2UTktVzhDQjMtR0YlZiU3UERfTUFLLUFFX19fX19fX19PbmVOb3RlMjAyMVZvbHVtZQ0KMTZfNzc4Y2NiOWEt MmY2YS00NGU1LTg1M2MtZWIyMmI3NjA5NjQzX0NOTTNXLVY5NEdCLVFKUUhILUJEUTNKLTMzJWYlWThIX0J5cGFzc19fX19fX19fT25lTm90ZUZyZWUyMDIx UmV0YWlsDQoxNl9lY2VhMmNmYS1kNDA2LTRhN2YtYmUwZC1jNjE2MzI1MGQxMjZfNE5DV1ItOVY5MlktMzRWQjItUlBUSFItWVQlZiVHUjdfUmV0YWlsX19f X19fX19PdXRsb29rMjAyMVJldGFpbA0KMTZfNDViZjY3ZjktMGZjOC00MzM1LThiMDktOTIyNmNlZjhhNTc2X0pROU1KLVFZTjZCLTY3UFg5LUdZRlZZLVFK JWYlNlRCX01BSy1BRV9fX19fX19fT3V0bG9vazIwMjFWb2x1bWUNCjE2XzhmODkzOTFlLWVlZGItNDI5ZC1hZjkwLTlkMzZmYmY5NGRlNl9SUlJZQi1ETjc0 OS1HQ1BXNC05SDZWSy1IQyVmJUhQVF9SZXRhaWxfX19fX19fX1BlcnNvbmFsMjAyMVJldGFpbA0KMTZfYzliZjVlODYtZjVlMy00YWM2LThkNTItZTExNGE2 MDRkN2JmXzNLWFhRLVBWTjJDLThQN1lZLUhDVjg4LUdWJWYlTTk2X1JldGFpbDFfX19fX19fUG93ZXJQb2ludDIwMjFSZXRhaWwNCjE2XzcxNmYyNDM0LTQx YjYtNDk2OS1hYjczLWU2MWU1OTNhMzg3NV8zOUcyTi0zQkQ5Qy1DNFhDTS1CRDRRRy1GViVmJVlEWV9NQUstQUVfX19fX19fX1Bvd2VyUG9pbnQyMDIxVm9s dW1lDQoxNl9jMmYwNGFkZi1hNWRlLTQ1YzUtOTlhNS1mNWZkZGJkYTc0YThfOFdYVFAtTU42MjgtS1k0NEctVkpXQ0stQzclZiVQQ0ZfUmV0YWlsX19fX19f X19Qcm9QbHVzMjAyMVJldGFpbA0KMTZfM2YxODBiMzAtOWIwNS00ZmUyLWFhOGQtMGMxYzQ3OTBmODExX1JOSEpZLURURlhXLUhXOUY4LTQ5ODJELU1EJWYl MkNXX01BSy1BRTFfX19fX19fUHJvUGx1czIwMjFWb2x1bWUNCjE2Xzk2MDk3YTY4LWI1YzUtNGIxOS04NjAwLTJlOGQ2ODQxYTBkYl9KUkpOSi0zM003Qy1S NzNYMy1QOVhGNy1SOSVmJUY2TV9NQUstQUVfX19fX19fX1Byb1BsdXNTUExBMjAyMVZvbHVtZQ0KMTZfNzExZTQ4YTYtMWE3OS00YjAwLWFmMTAtNzNmNGNh M2FhYWM0X0RKUEhWLU5DSlY2LUdXUFQ2LUsyNkpYLUM3JWYlUEJHX1JldGFpbF9fX19fX19fUHJvZmVzc2lvbmFsMjAyMVJldGFpbA0KMTZfMzc0N2QxZDUt NTVhOC00YmMzLWI1M2QtMTlmZmYxOTEzMTk1X1FLSE5YLU05R0dILVQzUU1XLVlQSzRRLVFSJWYlV01WX1JldGFpbF9fX19fX19fUHJvamVjdFBybzIwMjFS ZXRhaWwNCjE2XzE3NzM5MDY4LTg2YzQtNDkyNC04NjMzLTFlNTI5YWJjN2VmY19IVkMzNC1DVk5QRy1SVkNNVC1YMkpSRi1DUiVmJTdSS19NQUstQUUxX19f X19fX1Byb2plY3RQcm8yMDIxVm9sdW1lDQoxNl80ZWE2NGRjYS0yMjdjLTQzNmItODEzZi1iNjYyNGJlMmQ1NGNfMkI5NlYtWDlOSlktV0ZCUkMtUThNUDIt N0MlZiVIUlJfUmV0YWlsX19fX19fX19Qcm9qZWN0U3RkMjAyMVJldGFpbA0KMTZfODQzMTNkMWUtNDdjOC00ZTI3LThjZWQtMDQ3NmI3ZWU0NmM0XzNDTlFY LVQzNFRZLTk5Ukg0LUM0WUQyLUtXJWYlNldIX01BSy1BRV9fX19fX19fUHJvamVjdFN0ZDIwMjFWb2x1bWUNCjE2X2I3NjliNzQ2LTUzYjEtNGQ4OS04YTY4 LTQxOTQ0ZGFmZTc5N19DRE5GRy03N1Q4RC1WS1FKWC1CN0tUMy1LSyVmJTI4Vl9SZXRhaWwxX19fX19fX1B1Ymxpc2hlcjIwMjFSZXRhaWwNCjE2X2EwMjM0 Y2ZlLTk5YmQtNDU4Ni1hODEyLTRmMjk2MzIzYzc2MF8yS1hKSC0zTkhUVy1SREJQWC1RRlJYSi1NVCVmJUdYRl9NQUstQUVfX19fX19fX1B1Ymxpc2hlcjIw MjFWb2x1bWUNCjE2X2MzZmI0OGIyLTFmZDQtNGRjOC1hZjM5LTgxOWVkZjE5NDI4OF9EVkJYTi1IRlQ0My1DVlBSUS1KODlURi1WTSVmJU1IR19SZXRhaWxf X19fX19fX1NreXBlZm9yQnVzaW5lc3MyMDIxUmV0YWlsDQoxNl82MDI5MTA5Yy1jZWI4LTRlZTUtYjMyNC1mOGViMjk4MWU5OWFfUjNGQ1ktTkhHQzctQ0JQ VlAtOFE5MzQtWVQlZiVHWEdfTUFLLUFFX19fX19fX19Ta3lwZWZvckJ1c2luZXNzMjAyMVZvbHVtZQ0KMTZfOWU3ZTdiOGUtYTBlNy00NjdiLTk3NDktZDBk ZTgyZmI3Mjk3X0hYTlhCLUo0SkdNLVRDRjQ0LTJYMkNWLUZKJWYlVlZIX1JldGFpbF9fX19fX19fU3RhbmRhcmQyMDIxUmV0YWlsDQoxNl8yMjNhNjBkOC05 MDAyLTRhNTUtYWJhYy01OTNmNWI2NmNhNDVfMkNKTjQtQzlYSzItSEZQUTYtWUg0OTgtODIlZiVUWEhfTUFLLUFFX19fX19fX19TdGFuZGFyZDIwMjFWb2x1 bWUNCjE2X2I5OWJhOGM0LWUyNTctNGI3MC1hMzFhLThiZDMwOGNlNzA3M19CUVdEVy1OSjlZRi1QN1k3OS1INkRDVC1NSyVmJVE5Q19NQUstQUVfX19fX19f X1N0YW5kYXJkU1BMQTIwMjFWb2x1bWUNCjE2XzgxNDAxNGQzLWMzMGItNGY2My1hNDkzLTM3MDhlMGRjMGJhOF9UNlAyNi1OSlZCUi03NkJLOC1XQkNEWS1U WCVmJTNCQ19SZXRhaWxfX19fX19fX1Zpc2lvUHJvMjAyMVJldGFpbA0KMTZfYzU5MDYwNWEtYTA4YS00Y2M3LThkYzItZjFmZmIzZDA2OTQ5X0pOS0JYLU1I OVA0LUs4WVlWLThDRzJZLVZRJWYlMkM4X01BSy1BRV9fX19fX19fVmlzaW9Qcm8yMDIxVm9sdW1lDQoxNl8xNmQ0Mzk4OS1hNWVmLTQ3ZTItOWZmMS0yNzI3 ODRjYWVlMjRfODlOWVktS0I5M1ItN1gyMkYtOTNRREYtREolZiU2WU1fUmV0YWlsX19fX19fX19WaXNpb1N0ZDIwMjFSZXRhaWwNCjE2X2Q1NWY5MGVlLTRi YTItNGQwMi1iMjE2LTEzMDBlZTUwZTJhZl9CVzQzQi00UE5GUC1WNjM3Ri0yM1RSMi1KNCVmJTdUWF9NQUstQUVfX19fX19fX1Zpc2lvU3RkMjAyMVZvbHVt ZQ0KMTZfZmIzM2Q5OTctNGFhMy00OTRlLThiNTgtMDNlOWFiMGYxODFkX1ZOQ0M0LUNKUVZLLUJLWDM0LTc3WThILUNZJWYlWE1SX1JldGFpbF9fX19fX19f V29yZDIwMjFSZXRhaWwNCjE2XzBjNzI4MzgyLTk1ZmItNGE1NS04ZjEyLTYyZTYwNWY5MTcyN19CSkc5Ny1OVzNHTS04UVFRNy1GSDc2Ry02OCVmJTZYTV9N QUstQUVfX19fX19fX1dvcmQyMDIxVm9sdW1lDQo6OiBPZmZpY2UgMjAyNA0KMTZfOGZkYjFmMWUtNjYzZi00ZjJlLThmZGItN2MzNWFlZTdkNWVhX0dOWFdY LURGNzk3LUIySlQzLTgyVzI3LUtIJWYlUFhUX01BSy1BRV9fX19fX19fUHJvUGx1czIwMjRWb2x1bWUtUHJldmlldw0KMTZfMzNiMTFiMTQtOTFmZC00Zjdi LWI3MDQtZTY0YTA1NWNmNjAxX1g4NlhYLU4zUU1XLUI0V0dRLVFDQjY5LVYyJWYlNktXX01BSy1BRV9fX19fX19fUHJvamVjdFBybzIwMjRWb2x1bWUtUHJl dmlldw0KMTZfZWIwNzQxOTgtNzM4NC00YmRkLThlNmMtYzMzNDJkYWM4NDM1X0RXOTlZLUg3TlQ2LTZCMjlELThKUThGLVIzJWYlUVQ3X01BSy1BRV9fX19f X19fVmlzaW9Qcm8yMDI0Vm9sdW1lLVByZXZpZXcNCjE2X2U1NjNkMTA4LTdiMGUtNDE4YS04MzkwLTIwZTFkMTMzZDZiYl9QNk5NVy1KTVRSQy1SNk1RNi1I SDNGMi1CVCVmJUhLQl9SZXRhaWxfX19fX19fX0FjY2VzczIwMjRSZXRhaWwNCjE2X2Y3NDhlMmY3LTU5NTEtNGJjMi04YTA2LTVhMWZiZTQyZjVmNF9DWE5K VC05OEhQUC05MkhYNy1NWDZHWS0yUCVmJVZGUl9NQUstQUVfX19fX19fX0FjY2VzczIwMjRWb2x1bWUNCjE2X2YzYTVlODZhLWU0ZjgtNGQ4OC04MjIwLTE0 NDBjM2JiY2VmYV84MkNOSi1XODJUVy1CWTIzVy1CVko2Vy1XNCVmJThHUF9SZXRhaWxfX19fX19fX0V4Y2VsMjAyNFJldGFpbA0KMTZfNTIzZmJiYWItYzI5 MC00NjBkLWE2YzktNDhlNDk3MDljYjhlXzdZMjg3LTlOMktDLThNUlIzLUJLWTgyLTJEJWYlUVJWX01BSy1BRV9fX19fX19fRXhjZWwyMDI0Vm9sdW1lDQox Nl84ODVmODNlMC01ZTE4LTQxOTktYjhiZS01NjY5N2QwZGViZmJfTjY5WDctNzNLUFQtODk5RkQtUDhIUTQtUUclZiVUUDRfUmV0YWlsX19fX19fX19Ib21l MjAyNFJldGFpbA0KMTZfYWNkNGVjY2ItZmY4OS00ZTZhLTkzNTAtZDJkNTYyNzZlYzY5X1BSS1FNLVlOUFFSLTc3UVQ2LTMyOEQ3LUJEJWYlMjIzX1JldGFp bF9fX19fX19fSG9tZUJ1c2luZXNzMjAyNFJldGFpbA0KMTZfNmY1ZmQ2NDUtNzExOS00NGE0LTkxYjQtZWNjZmVlYjczOGJmXzJDRks0LU40NEtHLTdYRzg5 LUNXREc2LVA3JWYlUDI3X1JldGFpbF9fX19fX19fT3V0bG9vazIwMjRSZXRhaWwNCjE2XzlhMWUxYmFjLTJkOGItNDg5MC04MzJmLTBhNjhiMjdjMTZlMF9O UVBYUC1XVkI4Ny1IM01NQi1GWUJXMi05USVmJUZQQl9NQUstQUVfX19fX19fX091dGxvb2syMDI0Vm9sdW1lDQoxNl9kYTlhNTdhZS04MWE4LTRjYjMtYjc2 NC01ODQwZTZiNWQwYmZfQ1QyS1QtR1ROV0gtOUhGR1ctSjJQV0otWFclZiU3S0pfUmV0YWlsX19fX19fX19Qb3dlclBvaW50MjAyNFJldGFpbA0KMTZfZWNh MGQ4YTYtZTIxYi00NjIyLTlhODctYTcxMDNmZjE0MDEyX1JSWEZOLUpKMjZSLVJWV0QyLVY3V01QLTI3JWYlUFdRX01BSy1BRV9fX19fX19fUG93ZXJQb2lu dDIwMjRWb2x1bWUNCjE2XzI5NWRjYzIxLTE1MWEtNGI0ZC04ZjUwLTJiNjI3ZWExOTdmNl9HTko2UC1ZNFJCTS1DMzJXVy0yVkpLSi1NVCVmJUhLS19SZXRh aWxfX19fX19fX1Byb2plY3RQcm8yMDI0UmV0YWlsDQoxNl8yMTQxZDM0MS00MWFhLTRlNDUtOWNhMS0yMDFlMTE3ZDY0OTVfV05GTVItSEs0UjctN0ZKVk0t VlEzSkMtNzYlZiVIRjZfTUFLLUFFMV9fX19fX19Qcm9qZWN0UHJvMjAyNFZvbHVtZQ0KMTZfZWFkNDJmNzQtODE3ZC00NWI0LWFmNmItM2JlZWIzNmJhNjUw X0MyUE5NLTJHUUZDLUNZM1hSLVdYQ1A0LUdYJWYlM1hNX1JldGFpbF9fX19fX19fUHJvamVjdFN0ZDIwMjRSZXRhaWwNCjE2XzRiNmQ5YjliLWMxNmUtNDI5 ZC1iYWJlLThiYjg0YzNjMjdkNl9GMlZOVy1NVzhUVC1LNjIyUS00RDk2SC1QVyVmJUo4WF9NQUstQUVfX19fX19fX1Byb2plY3RTdGQyMDI0Vm9sdW1lDQox Nl9kYjI0OTcxNC1iYjU0LTQ0MjItOGM3OC0yY2M4ZDRjNGExOWZfVldDTlgtN0ZLQkQtRkhKWUctWEJSNEItODglZiVLQzZfUmV0YWlsX19fX19fX19Qcm9Q bHVzMjAyNFJldGFpbA0KMTZfZDc3MjQ0ZGMtMmI4Mi00ZjBhLWI4YWUtMWZjYTAwYjdmM2UyXzRZVjJKLVZORzdXLVlHVFAzLTQ0M1RLLVRGJWYlOENQX01B Sy1BRTFfX19fX19fUHJvUGx1czIwMjRWb2x1bWUNCjE2XzMwNDZhMDNlLTIyNzctNGE1MS04Y2NkLWE2NjA5ZWFlOGMxOV9YS1JCVy1LTjJGRi1HOENLWS1I WFZHNi1GViVmJVkyVl9NQUstQUVfX19fX19fX1NreXBlZm9yQnVzaW5lc3MyMDI0Vm9sdW1lDQoxNl80NGEwN2Y1MS04MjYzLTRiMmYtYjJhNS03MDM0MDA1 NWM2NDZfR1ZHNk4tNldDSEgtSzJNVlAtUlE3OFYtM0olZiU3R0pfTUFLLUFFMV9fX19fX19TdGFuZGFyZDIwMjRWb2x1bWUNCjE2XzI4MmQ4ZjM0LTExMTEt NGE2Zi04MGZlLWMxN2Y3MGRlYzU2N19IR1JCWC1ONjhRRi02RFk4Si1DR1g0Vy1YVyVmJTdLUF9SZXRhaWxfX19fX19fX1Zpc2lvUHJvMjAyNFJldGFpbA0K MTZfNGMyZjMyYmYtOWQwYi00ZDhjLThhYjEtYjRjNmEwYjk5OTJkX0dCTkhCLUIyRzNRLUc0MllCLTNNRkMyLTdDJWYlSkNYX01BSy1BRV9fX19fX19fVmlz aW9Qcm8yMDI0Vm9sdW1lDQoxNl84NTA0MTY3ZC04ODdhLTQxYWUtYmQxZC1mODQ5ZDgzNDM1MmRfVkJYUEotMzhOUjMtQzRES0YtQzhSVDctUkclZiVIS1Ff UmV0YWlsX19fX19fX19WaXNpb1N0ZDIwMjRSZXRhaWwNCjE2XzA5NzgzMzZiLTU2MTEtNDk3Yy05NDE0LTk2ZWZmYWZmNDkzOF9ZTkZUWS02M0s3UC1GS0hY Sy0yOFlZVC1EMyVmJTJYQl9NQUstQUVfX19fX19fX1Zpc2lvU3RkMjAyNFZvbHVtZQ0KMTZfZjZiMjRlNjEtNmFhNy00ZmQyLWFiOWItNDA0NmNlZTQyMzBh X1hOMzNSLVJQNjc2LUdNWTJGLVQzTUg3LUdDJWYlVktSX1JldGFpbF9fX19fX19fV29yZDIwMjRSZXRhaWwNCjE2XzA2MTQyYWEyLWU5MzUtNDljYS1hZjVk LTA4MDY5YTNkODRmM19XRDhDUS02S05RTS04VzJDWC0yUlQ2My1LSyVmJTNUUF9NQUstQUVfX19fX19fX1dvcmQyMDI0Vm9sdW1lDQopIGRvICgNCmZvciAv ZiAidG9rZW5zPTEtNSBkZWxpbXM9XyIgJSVBIGluICgiJSUjIikgZG8gKA0KDQppZiAlMT09Z2V0aW5mbyBpZiBub3QgZGVmaW5lZCBrZXkgKA0KaWYgJW9W ZXIlPT0lJUEgaWYgL2kgIiUyIj09IiUlRSIgKA0Kc2V0IGtleT0lJUMNCnNldCBfYWN0aWQ9JSVCDQpzZXQgX2FsbGFjdGlkPSFfYWxsYWN0aWQhICUlQg0K c2V0IF9saWM9JSVEDQppZiAlb1ZlciU9PTE2IChlY2hvICIlJUQiIHwgZmluZCAvaSAiU3Vic2NyaXB0aW9uIiAlbnVsJSAmJiBzZXQgX3N1YmxpYz0xKQ0K KQ0KKQ0KDQopDQopDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgVGhpcyBjb2Rl IGlzIHVzZWQgdG8gbW9kaWZ5IHRoZSB0aW1lc3RhbXAgdmFsdWUgb2Ygc3BwYyBkbGwgZmlsZSBpbiBvcmRlciB0byBjaGFuZ2UgY2hlY2tzdW1zDQo6OiAg SXQncyBkb25lIHRvIGxvd2VyIHRoZSBwb3RlbnRpYWwgZmFsc2UgcG9zaXRpdmUgZGV0ZWN0aW9uIGJ5IGFudGl2aXJ1cydzLiBPbiBlYWNoIGluc3RhbGws IGl0IHdpbGwgaW5zdGFsbCBhIHVuaXF1ZSBzcHBjIGRsbCBmaWxlDQoNCjpvaF9leHRyYWN0ZGxsDQoNCnNldCBiPQ0KJXBzYyUgIiRmPVtJTy5GaWxlXTo6 UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzolX2hvb2slXDouKic7JGVuY29kZWQgPSAoJGZbMV0pIC1yZXBsYWNlICctJywgJ0EnIC1yZXBsYWNl ICdfJywgJ2EnOyRieXRlcyA9IFtDb24lYiV2ZXJ0XTo6RnJvbUJhcyViJWU2NFN0cmluZygkZW5jb2RlZCk7ICRQZVBhdGg9JyUxJzsgJG9mZnNldD0nJTIn OyAkbT1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0ICc6aGV4ZWRpdFw6LionOy4gKFtzY3JpcHRibG9ja106OkNyZWF0ZSgkbVsx XSkpIiAlbnVsMiUgfCBmaW5kIC9pICJFcnJvciBmb3VuZCIgJW51bDElICYmIHNldCBoYXNoZXJyb3I9MQ0KZXhpdCAvYg0KDQo6aGV4ZWRpdDoNCiMgVXNl IGEgTWVtb3J5U3RyZWFtIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiB0aGUgYnl0ZXMNCiRNZW1vcnlTdHJlYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5N ZW1vcnlTdHJlYW0NCiRXcml0ZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5CaW5hcnlXcml0ZXIoJE1lbW9yeVN0cmVhbSkNCiRXcml0ZXIuV3JpdGUoJGJ5 dGVzKQ0KDQojIERlZmluZSBkeW5hbWljIGFzc2VtYmx5LCBtb2R1bGUsIGFuZCB0eXBlDQokQXNzZW1ibHlCdWlsZGVyID0gW0FwcERvbWFpbl06OkN1cnJl bnREb21haW4uRGVmaW5lRHluYW1pY0Fzc2VtYmx5KDQsIDEpDQokTW9kdWxlQnVpbGRlciA9ICRBc3NlbWJseUJ1aWxkZXIuRGVmaW5lRHluYW1pY01vZHVs ZSgyLCAkRmFsc2UpDQokVHlwZUJ1aWxkZXIgPSAkTW9kdWxlQnVpbGRlci5EZWZpbmVUeXBlKDApDQoNCiMgRGVmaW5lIFAvSW52b2tlIG1ldGhvZA0KW3Zv aWRdJFR5cGVCdWlsZGVyLkRlZmluZVBJbnZva2VNZXRob2QoJ01hcEZpbGVBbmRDaGVja1N1bScsICdpbWFnZWhscC5kbGwnLCAnUHVibGljLCBTdGF0aWMn LCBbUmVmbGVjdGlvbi5DYWxsaW5nQ29udmVudGlvbnNdOjpTdGFuZGFyZCwgW2ludF0sIEAoW3N0cmluZ10sIFtpbnRdLk1ha2VCeVJlZlR5cGUoKSwgW2lu dF0uTWFrZUJ5UmVmVHlwZSgpKSwgW1J1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkNhbGxpbmdDb252ZW50aW9uXTo6V2luYXBpLCBbUnVudGltZS5JbnRlcm9w U2VydmljZXMuQ2hhclNldF06OkF1dG8pDQoNCiMgQ3JlYXRlIHRoZSB0eXBlDQokSW1hZ2VobHAgPSAkVHlwZUJ1aWxkZXIuQ3JlYXRlVHlwZSgpDQoNCiMg T2Zmc2V0IGluZm9ybWF0aW9uDQokdGltZXN0YW1wT2Zmc2V0ID0gMTM2DQokZXhwb3J0VGltZXN0YW1wT2Zmc2V0ID0gJG9mZnNldA0KJGNoZWNrU3VtT2Zm c2V0ID0gMjE2DQoNCiMgQ2FsY3VsYXRlIHRpbWVzdGFtcA0KJGN1cnJlbnRUaW1lc3RhbXAgPSBbRGF0ZVRpbWVdOjpVdGNOb3cNCiR1bml4VGltZXN0YW1w ID0gW2ludF0oJGN1cnJlbnRUaW1lc3RhbXAgLSAoR2V0LURhdGUgLVllYXIgMTk3MCAtTW9udGggMSAtRGF5IDEgLUhvdXIgMCAtTWludXRlIDAgLVNlY29u ZCAwKSkuVG90YWxTZWNvbmRzDQoNCiMgQ2hhbmdlIHRpbWVzdGFtcHMNCiRXcml0ZXIuQmFzZVN0cmVhbS5Qb3NpdGlvbiA9ICR0aW1lc3RhbXBPZmZzZXQN CiRXcml0ZXIuV3JpdGUoJHVuaXhUaW1lc3RhbXApDQoNCiRXcml0ZXIuQmFzZVN0cmVhbS5Qb3NpdGlvbiA9ICRleHBvcnRUaW1lc3RhbXBPZmZzZXQNCiRX cml0ZXIuV3JpdGUoJHVuaXhUaW1lc3RhbXApDQoNCiRXcml0ZXIuRmx1c2goKQ0KDQojIFdyaXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBNZW1vcnlT dHJlYW0gdG8gYSB0ZW1wb3JhcnkgZmlsZQ0KJHRlbXBGaWxlUGF0aCA9ICIkZW52OndpbmRpclxUZW1wXCQoW0d1aWRdOjpOZXdHdWlkKCkuR3VpZCkiDQpb SU8uRmlsZV06OldyaXRlQWxsQnl0ZXMoJHRlbXBGaWxlUGF0aCwgJE1lbW9yeVN0cmVhbS5Ub0FycmF5KCkpDQoNCiMgVXBkYXRlIGhhc2ggdXNpbmcgdGhl IHRlbXBvcmFyeSBmaWxlDQpbaW50XSRIZWFkZXJTdW0gPSAwDQpbaW50XSRDaGVja1N1bSA9IDANClt2b2lkXSRJbWFnZWhscDo6TWFwRmlsZUFuZENoZWNr U3VtKCR0ZW1wRmlsZVBhdGgsIFtyZWZdJEhlYWRlclN1bSwgW3JlZl0kQ2hlY2tTdW0pDQoNCiMgSWYgdGhlIGNoZWNrc3VtcyBkb24ndCBtYXRjaCwgdXBk YXRlIHRoZSBjaGVja3N1bSBpbiB0aGUgTWVtb3J5U3RyZWFtDQppZiAoJEhlYWRlclN1bSAtbmUgJENoZWNrU3VtKSB7DQogICAgJFdyaXRlci5CYXNlU3Ry ZWFtLlBvc2l0aW9uID0gJGNoZWNrU3VtT2Zmc2V0DQogICAgJFdyaXRlci5Xcml0ZSgkQ2hlY2tTdW0pDQogICAgJFdyaXRlci5GbHVzaCgpDQp9IGVsc2Ug ew0KICAgIFdyaXRlLWhvc3QgRXJyb3IgZm91bmQNCn0NCg0KIyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlDQpSZW1vdmUtSXRlbSAtUGF0aCAkdGVtcEZp bGVQYXRoIC1Gb3JjZQ0KDQojIEdldCB0aGUgbW9kaWZpZWQgYnl0ZXMNCiRtb2RpZmllZEJ5dGVzID0gJE1lbW9yeVN0cmVhbS5Ub0FycmF5KCkNCg0KIyBX cml0ZSB0aGUgbW9kaWZpZWQgYnl0ZXMgdG8gdGhlIGZpbmFsIGZpbGUNCltJTy5GaWxlXTo6V3JpdGVBbGxCeXRlcygkUGVQYXRoLCAkbW9kaWZpZWRCeXRl cykNCg0KW3ZvaWRdJEltYWdlaGxwOjpNYXBGaWxlQW5kQ2hlY2tTdW0oJFBlUGF0aCwgW3JlZl0kSGVhZGVyU3VtLCBbcmVmXSRDaGVja1N1bSkNCmlmICgk SGVhZGVyU3VtIC1uZSAkQ2hlY2tTdW0pIHsNCiAgICBXcml0ZS1ob3N0IEVycm9yIGZvdW5kDQp9DQoNCiRNZW1vcnlTdHJlYW0uQ2xvc2UoKQ0KOmhleGVk aXQ6DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KOjoNCjo6ICBUaGlzIGJlbG93IGJsb2NrcyBvZiB0ZXh0 IGlzIGVuY29kZWQgaW4gYmFzZTY0IGZvcm1hdA0KOjogIFRoZSBibG9ja3MgaW4gbGFiZWxzICJzcHBjMzIuZGxsIiBhbmQgInNwcGM2NC5kbGwiIGNvbnRh aW5zIGJlbG93IGZpbGVzDQo6Og0KOjogIDA5ODY1ZWE1OTkzMjE1OTY1ZThmMjdhNzRiOGE0MWQxNWZkMGY2MGY1ZjQwNGNiN2E4YjNjNzc1N2FjZGFiMDIg KnNwcGMzMi5kbGwNCjo6ICAzOTNhMWZhMjZkZWIzNjYzODU0ZTQxZjJiNjg3YzE4OGE5ZWFjZDg3YjIzZjE3ZWEwOTQyMmM0NzE1Y2I1YTlmICpzcHBjNjQu ZGxsDQo6Og0KOjogIFRoZSBmaWxlcyBhcmUgZW5jb2RlZCBpbiBiYXNlNjQgdG8gbWFrZSBBSU8gdmVyc2lvbi4NCjo6DQo6OiAgbWFzc3t9Z3JhdmV7ZG90 fWRldi9vaG9vaw0KOjogIEhlcmUgeW91IGNhbiBmaW5kIHRoZSBmaWxlcyBzb3VyY2UgY29kZSBhbmQgaW5mbyBvbiBob3cgdG8gcmVidWlsZCB0aGUgaWRl bnRpY2FsIHNwcGMuZGxsIGZpbGVzDQo6Og0KOjogIHN0YWNrb3ZlcmZsb3cuY29tL2EvMzUzMzUyNzMNCjo6ICBIZXJlIHlvdSBjYW4gY2hlY2sgaG93IHRv IGV4dHJhY3Qgc3BwYy5kbGwgZmlsZXMgZnJvbSBiYXNlNjQNCjo6DQo6OiAgRm9yIGFueSBmdXJ0aGVyIHF1ZXN0aW9uLCBmZWVsIGZyZWUgdG8gY29udGFj dCB1cyBvbiBtYXNze31ncmF2ZXtkb3R9ZGV2L2NvbnRhY3R1cw0KOjoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KOjoNCjo6ICBSZXBsYWNlICItIiB3aXRoICJBIiBhbmQgIl8iIHdpdGggImEiIGJlZm9yZSBiYXNlNjQgY29udmVyc2lvbg0KOjogIEl0IHdhcyBjaGFu Z2VkIHRvIHByZXZlbnQgYW50aXZpcnVzZXMgZnJvbSBkZXRlY3RpbmcgYW5kIGZsYWdnaW5nIGJhc2U2NCBlbmNvZGluZw0KDQo6c3BwYzMyLmRsbDoNClRW cVEtLU0tLS0tRS0tLS0vLzgtLUxnLS0tLS0tLS0tUS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tZy0tLS0tNGZ1ZzQt dC1uTkliZ0JUTTBoVkdocGN5QndjbTluY21GdElHTmhibTV2ZENCaVpTQnlkVzRnX1c0Z1JFOVRJRzF2WkdVdURRMEtKLS0tLS0tLS0tQlFSUS0tVC1FSC1N RGMwR1EtLS0tLS0tLS0tTy0tDQpEaU1MLVFJby0tSS0tLS1lLS0tLS0tLS1SeEUtLS0tUS0tLS0tLS0tLS1DLV9nLVEtLS0tLWctLUItLS0tLUUtLS0tRy0t LS0tLS0tLS1DUS0tLS1CLS0tK2RZLS0tSS1RLUUtLUMtLS1CLS0tLS0tRS0tLUUtLS0tLS0tLUItLS0tLS1RLS0talItLS0tQmctLS1ZLVEtLS1ILS0tSGdE LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUktLS1CUS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLUJzWS0tLUgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1DNTBaWGgwLS0tLWMtRS0tLS1RLS0tLS1nLS0tLVEtLS0tLS0t LS0tLS0tLS0tLS1DLS0tRy11Y21SaGRHRS0tQmctLS0tLUktLS0tLUktLS0tRy0tLS0tLS0tLS0tLS0tLS0NCi0tQi0tLUItTG1Wb1gyWnlZVzItLS0tLS1E LS0tLS1DLS0tLUMtLS0tLS0tLS0tLS0tLS0tLS0tUS0tLVFDNWxaR0YwWVEtLWpSLS0tLUItLS0tLUVnLS0tLW8tLS0tLS0tLS0tLS0tLS0tLS1FLS0tRS11 X1dSaGRHRS0tQmdCLS0tLVktLS0tLUktLS0tYy0tLS0tLS0tLS0tLS0tLS0tLUItLS1ELUxuSnpjbU0tLS1CNC13LS0tSC0tLS0tRS0tLS1IZy0tDQotLS0t LS0tLS0tLS0tLS0tUS0tLXdDNXlaV3h2WXctLUYtLS0tLUMtLS0tLS1nLS0tQ0ktLS0tLS0tLS0tLS0tLS0tLS1FLS0tRUktLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUZXSjVWWlRqVVh3Zyt3d3gwWHctLS0tLUlsRUpCU05SZlNKDQpSQ1FRaTBVTXgwUWtELS0tLS1DSlJDUUVpMFVJ eDBRa0MtLWdnR3FKQkNUSFJmUS0tLS0tNi1vQi0tQ0xOWGhnZ0dxRDdCaUZ3SW5EaTBYd2QtcUpCQ1F4Mi8vV1Vlc3lpMVgweDBRa0Itb2dnR3FKQkNTSlZD UUkveFctWUlCcWcrd01oY0NMUmZDSkJDUjBDdi9XdXdFLS0tQlM2d1AvMWxDTlpmaUoyRnRlWGNOVmllVlhWbE9EN0R5TFJSaUxkUnlKUkNRUQ0KaTBVVWlY UWtGSWxFSi15TFJSQ0pSQ1FJaTBVTWlVUWtCSXRGQ0lrRUpPaUUtLS0tTWNtRDdCaUp4NFgtZFZ5TFJSZzVDSFpWXzlrb2l3WUIySU40RS1CMFJZbEVKLVNM UlFpSlRlU0pCQ1RvKy83Ly80dE41SVgtZFN3REhzZERFLUUtLS1ESFF4US0tLS0teDBNWS0tLS0tTWRESC0tLS0tREhReS0tLS0tLXgwTWstLS0tLUVIcnBJ MWw5SW40VzE1ZlhjSVkNCi1MZ0ItLS0td2d3LWtQOGxjR0MtX3BDUS95VnNZSUJxa0pELy8vLy8tLS0tLVAvLy8vOC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1UZ0Jo LUcwLVpRLS0tRWMtY2dCaC1HTS1aUS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVUtLS0tLS0tLS0tRjZVZy1CZi1nQkd3d0VCSWdCLS0tay0t LS1ILS0tLU9EZi8vK2QtLS0tLUVFT0NJVUNRZzBGU0lZRA0KZ3dRQ2o4TkJ4a0hGRC1RRUstLS0tRVEtLS1CVjRQLy9xZy0tLS1CQkRnaUYta0lOQlVfSC00 WUVnd1VDbThOQnhrSEhRY1VNQi1RUS0tLS1jLS0tLU5QZy8vOEktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tRC0zTkJrLS0tLS1NWkMtLS1CLS0tLVF3LS0tRU0tLS0tb1EtLS1ORUUtLUVCQy0tRFBRZy0tNzBJLS0t VkQtLS1wUXctLVhVTS0tS0ZELS1EcFF3LS1GMFEtLURWRS0tQm5SLS0tblVRLS1PTkUtLS10UlEtLVlVVS0tSjlGLS1EVFJRLS1EVVktLUR0Ry0tQnhSZy0t cjBZLS1NOUctLUQ3UmctLW5SLS0tRkZILS1CdlJ3LS0NCm4wYy0tTk5ILS0tUlMtLS1UVWctLUc5SS0tQ2xTLS0telVnLS0tVkotLUJCU1EtLWJVay0tS2RK LS1DN1NRLS0rMGstLURsSy0tQlBTZy0tZFVvLS1KMUstLURUU2ctLUIwcy0tRDFMLS1CcFN3LS1wVXMtLU9OTC0tLU5ULS0tT1V3LS1JbE0tLURSVC0tLUVV MC0tRmxOLS1DalRRLS04VTAtLUJ0Ty0tQkhUZy0taDA0LS1MdE8tLURuVGctLUswOC0tRnRQDQotLUMxVHctLTYwOC0tQ2RRLS1CZFUtLS00a0ktLVAxQy0t LV9Rdy0tUmtNLS1JSkQtLURJUXctLS0wUS0tQ2xFLS1CUlItLS1oVVEtLU1ORS0tLUxSUS0tU2tVLS1JTkYtLUM4UlEtLTgwVS0tQ2RHLS1CWlJnLS1rMFkt LU1KRy0tRG9SZy0tR1VjLS1ERkgtLUJqUnctLWlrYy0tTHhILS1EMVJ3LS1Na2ctLUdGSS0tQ05TLS0tdkVnLS1PeEktLS1tU1EtLQ0KV2trLS1JMUotLUMw U1EtLTNray0tQjFLLS1CSFNnLS1aVW8tLUl4Sy0tQzdTZy0tOEVvLS1DVkwtLUJXU3ctLWlrcy0tTWRMLS1EN1N3LS1Ka3ctLUdSTS0tQ3dULS0tOUV3LS1E aE4tLUNCVFEtLXpVMC0tLWxPLS0tMFRnLS1fazQtLUtSTy0tRFVUZy0tREU4LS1FWlAtLUNMVHctLTAwOC0tLXhRLS1CRlUtLS1lRi0tLS0tLS1RLUMtLU0t Qi0tRi0tWS0NCkJ3LUktLWstQ2ctTC0tdy1EUS1PLS04LUUtLVItQkktRXctVS1CVS1GZy1YLUJnLUdRLV8tQnMtSC0tZC1CNC1Idy1nLUNFLUlnLWotQ1Et SlEtbS1DYy1LLS1wLUNvLUt3LXMtQzAtTGctdi1ELS1NUS15LURNLU4tLTEtRFktTnctNC1Eay1PZy03LUR3LVBRLSstRDgtUS1CQi1FSS1jM0J3WXk1a2JH dy1VMUJRUTFNdVUweERZV3hzVTJWeWRtVnktRk5NDQpRMkZzYkZObGNuWmxjZ0JUVUZCRFV5NVRURU5zYjNObC1GTk1RMnh2YzJVLVUxQlFRMU11VTB4RGIy NXpkVzFsVW1sbl9IUS1VMHhEYjI1emRXMWxVbWxuX0hRLVUxQlFRMU11VTB4RVpYQnZjMmwwVFdsbmNtRjBfVzl1UW14dllnQlRURVJsY0c5el9YUk5fV2R5 WVhScGIyNUNiRzlpLUZOUVVFTlRMbE5NUkdWd2IzTnBkRTltWm14cGJtVkRiMjVtX1hKdA0KWVhScGIyNUpaLUJUVEVSbGNHOXpfWFJQWm1ac19XNWxRMjl1 Wm1seWJXRjBfVzl1U1dRLVUxQlFRMU11VTB4RVpYQnZjMmwwVDJabWJHbHVaVU52Ym1acGNtMWhkR2x2Ymtsa1JYZy1VMHhFWlhCdmMybDBUMlptYkdsdVpV TnZibVpwY20xaGRHbHZia2xrUlhnLVUxQlFRMU11VTB4RVpYQnZjMmwwVTNSdmNtVlViMnRsYmdCVFRFUmxjRzl6X1hSVGRHOXkNClpWUnZfMlZ1LUZOUVVF TlRMbE5NUm1seVpVVjJaVzUwLUZOTVJtbHlaVVYyWlc1MC1GTlFVRU5UTGxOTVIyRjBfR1Z5VFdsbmNtRjBfVzl1UW14dllnQlRURWRoZEdobGNrMXBaM0po ZEdsdmJrSnNiMkktVTFCUVExTXVVMHhIWVhSb1pYSk5fV2R5WVhScGIyNUNiRzlpUlhnLVUweEhZWFJvWlhKTl9XZHlZWFJwYjI1Q2JHOWlSWGctVTFCUVEx TXVVMHhIDQpaVzVsY21GMFpVOW1abXhwYm1WSmJuTjBZV3hzWVhScGIyNUpaLUJUVEVkbGJtVnlZWFJsVDJabWJHbHVaVWx1YzNSaGJHeGhkR2x2Ymtsay1G TlFVRU5UTGxOTVIyVnVaWEpoZEdWUFptWnNfVzVsU1c1emRHRnNiR0YwX1c5dVNXUkZlLUJUVEVkbGJtVnlZWFJsVDJabWJHbHVaVWx1YzNSaGJHeGhkR2x2 Ymtsa1JYZy1VMUJRUTFNdVUweEhaWFJCWTNScA0KZG1WTV9XTmxibk5sU1c1bWJ3QlRURWRsZEVGamRHbDJaVXhwWTJWdWMyVkpibVp2LUZOUVVFTlRMbE5N UjJWMFFYQndiR2xqWVhScGIyNUpibVp2Y20xaGRHbHZiZ0JUVEVkbGRFRndjR3hwWTJGMF9XOXVTVzVtYjNKdFlYUnBiMjQtVTFCUVExTXVVMHhIWlhSQmNI QnNfV05oZEdsdmJsQnZiR2xqZVFCVFRFZGxkRUZ3Y0d4cFkyRjBfVzl1VUc5c19XTjUNCi1GTlFVRU5UTGxOTVIyVjBRWFYwX0dWdWRHbGpZWFJwYjI1U1pY TjFiSFEtVTB4SFpYUkJkWFJvWlc1MF9XTmhkR2x2YmxKbGMzVnNkLUJUVUZCRFV5NVRURWRsZEVWdVkzSjVjSFJsWkZCSlJFVjQtRk5NUjJWMFJXNWpjbmx3 ZEdWa1VFbEVSWGctVTFCUVExTXVVMHhIWlhSSFpXNTFfVzVsU1c1bWIzSnRZWFJwYjI0LVUweEhaWFJIWlc1MV9XNWxTVzVtDQpiM0p0WVhScGIyNC1VMUJR UTFNdVUweEhaWFJKYm5OMFlXeHNaV1JRY205a2RXTjBTMlY1U1dSei1GTk1SMlYwU1c1emRHRnNiR1ZrVUhKdlpIVmpkRXRsZVVsa2N3QlRVRkJEVXk1VFRF ZGxkRXhwWTJWdWMyVS1VMHhIWlhSTV9XTmxibk5sLUZOUVVFTlRMbE5NUjJWMFRHbGpaVzV6WlVacGJHVkpaLUJUVEVkbGRFeHBZMlZ1YzJWR19XeGxTV1Et VTFCUQ0KUTFNdVUweEhaWFJNX1dObGJuTmxTVzVtYjNKdFlYUnBiMjQtVTB4SFpYUk1fV05sYm5ObFNXNW1iM0p0WVhScGIyNC1VMHhIWlhSTV9XTmxibk5w Ym1kVGRHRjBkWE5KYm1admNtMWhkR2x2YmdCVFVGQkRVeTVUVEVkbGRGQkxaWGxKWi1CVFRFZGxkRkJMWlhsSlotQlRVRkJEVXk1VFRFZGxkRkJMWlhsSmJt WnZjbTFoZEdsdmJnQlRURWRsZEZCTFpYbEoNCmJtWnZjbTFoZEdsdmJnQlRVRkJEVXk1VFRFZGxkRkJ2YkdsamVVbHVabTl5YldGMF9XOXUtRk5NUjJWMFVH OXNfV041U1c1bWIzSnRZWFJwYjI0LVUxQlFRMU11VTB4SFpYUlFiMnhwWTNsSmJtWnZjbTFoZEdsdmJrUlhUMUpFLUZOTVIyVjBVRzlzX1dONVNXNW1iM0p0 WVhScGIyNUVWMDlTUi1CVFVGQkRVeTVUVEVkbGRGQnliMlIxWTNSVF8zVkpibVp2DQpjbTFoZEdsdmJnQlRURWRsZEZCeWIyUjFZM1JUXzNWSmJtWnZjbTFo ZEdsdmJnQlRVRkJEVXk1VFRFZGxkRk5NU1VSTV9YTjAtRk5NUjJWMFUweEpSRXhwYzNRLVUxQlFRMU11VTB4SFpYUlRaWEoyX1dObFNXNW1iM0p0WVhScGIy NC1VMHhIWlhSVFpYSjJfV05sU1c1bWIzSnRZWFJwYjI0LVUxQlFRMU11VTB4SmJuTjBZV3hzVEdsalpXNXpaUUJUVEVsdQ0KYzNSaGJHeE1fV05sYm5ObC1G TlFVRU5UTGxOTVNXNXpkR0ZzYkZCeWIyOW1UMlpRZFhKal9HRnpaUUJUVEVsdWMzUmhiR3hRY205dlprOW1VSFZ5WTJoaGMyVS1VMUJRUTFNdVUweEpibk4w WVd4c1VISnZiMlpQWmxCMWNtTm9ZWE5sUlhnLVUweEpibk4wWVd4c1VISnZiMlpQWmxCMWNtTm9ZWE5sUlhnLVUxQlFRMU11VTB4SmMwZGxiblZwYm1WTWIy TmgNCmJFVjQtRk5NU1hOSFpXNTFfVzVsVEc5allXeEZlLUJUVUZCRFV5NVRURXh2WVdSQmNIQnNfV05oZEdsdmJsQnZiR2xqX1dWei1GTk1URzloWkVGd2NH eHBZMkYwX1c5dVVHOXNfV05wWlhNLVUxQlFRMU11VTB4UGNHVnUtRk5NVDNCbGJnQlRVRkJEVXk1VFRGQmxjbk5wYzNSQmNIQnNfV05oZEdsdmJsQnZiR2xq X1dWei1GTk1VR1Z5YzJsemRFRndjR3hwDQpZMkYwX1c5dVVHOXNfV05wWlhNLVUxQlFRMU11VTB4UVpYSnpfWE4wVWxSVFVHRjViRzloWkU5MlpYSnlfV1Js LUZOTVVHVnljMmx6ZEZKVVUxQmhlV3h2WVdSUGRtVnljbWxrWlFCVFVGQkRVeTVUVEZKbFFYSnQtRk5NVW1WQmNtMC1VMUJRUTFNdVUweFNaV2RwYzNSbGNr VjJaVzUwLUZOTVVtVm5fWE4wWlhKRmRtVnVkLUJUVUZCRFV5NVRURkpsWjJseg0KZEdWeVVHeDFaMmx1LUZOTVVtVm5fWE4wWlhKUWJIVm5fVzQtVTFCUVEx TXVVMHhUWlhSQmRYUm9aVzUwX1dOaGRHbHZia1JoZEdFLVUweFRaWFJCZFhSb1pXNTBfV05oZEdsdmJrUmhkR0UtVTFCUVExTXVVMHhUWlhSRGRYSnlaVzUw VUhKdlpIVmpkRXRsZVFCVFRGTmxkRU4xY25KbGJuUlFjbTlrZFdOMFMyVjUtRk5RVUVOVExsTk1VMlYwUjJWdWRXbHUNClpVbHVabTl5YldGMF9XOXUtRk5N VTJWMFIyVnVkV2x1WlVsdVptOXliV0YwX1c5dS1GTlFVRU5UTGxOTVZXNXBibk4wWVd4c1RHbGpaVzV6WlFCVFRGVnVfVzV6ZEdGc2JFeHBZMlZ1YzJVLVUx QlFRMU11VTB4VmJtbHVjM1JoYkd4UWNtOXZaazltVUhWeVkyaGhjMlUtVTB4VmJtbHVjM1JoYkd4UWNtOXZaazltVUhWeVkyaGhjMlUtVTFCUVExTXVVMHhW DQpibXh2WVdSQmNIQnNfV05oZEdsdmJsQnZiR2xqX1dWei1GTk1WVzVzYjJGa1FYQndiR2xqWVhScGIyNVFiMnhwWTJsbGN3QlRVRkJEVXk1VFRGVnVjbVZu X1hOMFpYSkZkbVZ1ZC1CVFRGVnVjbVZuX1hOMFpYSkZkbVZ1ZC1CVFVGQkRVeTVUVEZWdWNtVm5fWE4wWlhKUWJIVm5fVzQtVTB4VmJuSmxaMmx6ZEdWeVVH eDFaMmx1LUZOUVVFTlRMbE5NY0VGMQ0KZEdobGJuUnBZMkYwWlVkbGJuVnBibVZVX1dOclpYUlNaWE53YjI1elpRQlRUSEJCZFhSb1pXNTBfV05oZEdWSFpX NTFfVzVsVkdsal8yVjBVbVZ6Y0c5dWMyVS1VMUJRUTFNdVUweHdRbVZuX1c1SFpXNTFfVzVsVkdsal8yVjBWSEpoYm5OaFkzUnBiMjQtVTB4d1FtVm5fVzVI Wlc1MV9XNWxWR2xqXzJWMFZISmhibk5oWTNScGIyNC1VMUJRUTFNdVUweHcNClEyeGxZWEpCWTNScGRtRjBfVzl1U1c1UWNtOW5jbVZ6Y3dCVFRIQkRiR1Zo Y2tGamRHbDJZWFJwYjI1SmJsQnliMmR5WlhOei1GTlFVRU5UTGxOTWNFUmxjRzl6X1hSRWIzZHViR1YyWld4SFpXNTFfVzVsVkdsal8yVjAtRk5NY0VSbGNH OXpfWFJFYjNkdWJHVjJaV3hIWlc1MV9XNWxWR2xqXzJWMC1GTlFVRU5UTGxOTWNFUmxjRzl6X1hSVWIydGxia0ZqDQpkR2wyWVhScGIyNVNaWE53YjI1elpR QlRUSEJFWlhCdmMybDBWRzlyWlc1QlkzUnBkbUYwX1c5dVVtVnpjRzl1YzJVLVUxQlFRMU11VTB4d1IyVnVaWEpoZEdWVWIydGxia0ZqZEdsMllYUnBiMjVE X0dGc2JHVnVaMlUtVTB4d1IyVnVaWEpoZEdWVWIydGxia0ZqZEdsMllYUnBiMjVEX0dGc2JHVnVaMlUtVTFCUVExTXVVMHh3UjJWMFIyVnVkV2x1WlVKcw0K YjJJLVUweHdSMlYwUjJWdWRXbHVaVUpzYjJJLVUxQlFRMU11VTB4d1IyVjBSMlZ1ZFdsdVpVeHZZMkZzLUZOTWNFZGxkRWRsYm5WcGJtVk1iMk5oYi1CVFVG QkRVeTVUVEhCSFpYUk1fV05sYm5ObFFXTnhkV2x6X1hScGIyNUpibVp2LUZOTWNFZGxkRXhwWTJWdWMyVkJZM0YxX1hOcGRHbHZia2x1Wm04LVUxQlFRMU11 VTB4d1IyVjBUVk5RX1dSSmJtWnYNCmNtMWhkR2x2YmdCVFRIQkhaWFJOVTFCcFpFbHVabTl5YldGMF9XOXUtRk5RVUVOVExsTk1jRWRsZEUxaFkyaHBibVZW UjFWSlItQlRUSEJIWlhSTllXTm9fVzVsVlVkVlNVUS1VMUJRUTFNdVUweHdSMlYwVkc5clpXNUJZM1JwZG1GMF9XOXVSM0poYm5SSmJtWnYtRk5NY0VkbGRG UnZfMlZ1UVdOMF9YWmhkR2x2YmtkeVlXNTBTVzVtYndCVFVGQkRVeTVUDQpUSEJKUVVGamRHbDJZWFJsVUhKdlpIVmpkLUJUVEhCSlFVRmpkR2wyWVhSbFVI SnZaSFZqZC1CVFVGQkRVeTVUVEhCSmMwTjFjbkpsYm5SSmJuTjBZV3hzWldSUWNtOWtkV04wUzJWNVJHVm1ZWFZzZEV0bGVRQlRUSEJKYzBOMWNuSmxiblJK Ym5OMFlXeHNaV1JRY205a2RXTjBTMlY1UkdWbVlYVnNkRXRsZVFCVFVGQkRVeTVUVEhCUWNtOWpaWE56VmsxUQ0KX1hCbFRXVnpjMkZuWlFCVFRIQlFjbTlq WlhOelZrMVFfWEJsVFdWemMyRm5aUUJUVUZCRFV5NVRUSEJUWlhSQlkzUnBkbUYwX1c5dVNXNVFjbTluY21WemN3QlRUSEJUWlhSQlkzUnBkbUYwX1c5dVNX NVFjbTluY21WemN3QlRVRkJEVXk1VFRIQlVjbWxuWjJWeVUyVnlkbWxqWlZkdmNtdGxjZ0JUVEhCVWNtbG5aMlZ5VTJWeWRtbGpaVmR2Y210bGNnQlQNClVG QkRVeTVUVEhCV1RFRmpkR2wyWVhSbFVISnZaSFZqZC1CVFRIQldURUZqZEdsMllYUmxVSEp2WkhWamQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLUZCZy0tLS0tLS0tLS0tLS1PaGctLUJzWS0tLVhHLS0tLS0tLS0tLS0tLS0NCitHLS0tSGhnLS1Ca1ktLS0tLS0tLS0tLS0t LU1ZUS0tZ0ctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1pRy0tLUtwZy0tLS0tLS0teUctLS0tLS0tLURVWS0tLS0tLS0tSWhnLS1DcVktLS0tLS0t LU1oZy0tLS0tLS0tMUctLS0tLS0tLS1DLUZOTVIyVjBUR2xqWlc1el9XNW5VM1JoZEhWelNXNW1iM0p0WVhScGIyNC0tUUJUVEVkbGRGQnliMlIxDQpZM1JU XzNWSmJtWnZjbTFoZEdsdmJnLS0zUU5NYjJOaGJFWnlaV1UtUndGVGRISlRkSEpPU1ZjLS1HLS0tLUJnLS1CemNIQmpjeTVrYkd3LS0tLVVZLS0tUzBWU1Rr Vk1Nekl1Wkd4cy0tLS0tQ2hnLS1CVFNFeFhRVkJKTG1Sc2ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tQi1CLS0tLS1ZLS1DLS0tLS0tLS0tLS0tLS0tLS0tLS1CLS1FLS0tLXctLUMtLS0tLS0tLS0tLS0tLS0tLS0tLUItLWtFLS1CSS0tLS1XSC0t LUJ3RC0tLS0tLS0tLS0tLS1Cd0ROLS0tLUZZLVV3QmYtRlktUlFCUy1GTS1TUUJQLUU0LVh3QkotRTQtDQpSZ0JQLS0tLS0tQzlCTy8rLS0tQi0tVS0tLS0t LS0tLUJRLS0tLS0tLS0tLS0tLS0tLS0tLS1RLUItLUMtLS0tLS0tLS0tLS0tLS0tLS0tLWYtSS0tLUUtVXdCMC1ISS1fUUJ1LUdjLVJnQnAtR3ctWlFCSi1H NC1aZ0J2LS0tLVctSS0tLUUtTS0tMC1ELS1PUS13LURRLVJRLTAtLS0tZWctdC0tRS1Rd0J2LUcwLWMtQmgtRzQtZVFCTy1HRS1iUUJsLS0tLQ0KLS1CQi1H NC1id0J0LUdFLWItQnYtSFUtY3ctZy1GTS1id0JtLUhRLWR3QmgtSEktWlEtZy1FUS1aUUIwLUdVLWNnQnAtRzgtY2dCaC1IUS1fUUJ2LUc0LUktQkQtRzgt Y2dCdy1HOC1jZ0JoLUhRLV9RQnYtRzQtLS0tLS1ENC1Ddy1CLUVZLV9RQnMtR1UtUi1CbC1ITS1Zd0J5LUdrLWMtQjAtR2stYndCdS0tLS0tLUJ2LUdnLWJ3 QnYtR3MtSS1CVC1GLS0NClUtQkQtLS0tLS0tdy0tZy0tUUJHLUdrLWItQmwtRlktWlFCeS1ITS1fUUJ2LUc0LS0tLS0tRC0tTGctMS1DNC1NLS11LUQtLS0t LXEtLVUtLVFCSi1HNC1kLUJsLUhJLWJnQmgtR3ctVGdCaC1HMC1aUS0tLUhNLWMtQnctR00tLS0tLS1Jdy1OLS1CLUV3LVpRQm4tR0UtYi1CRC1HOC1jLUI1 LUhJLV9RQm4tR2ctZC0tLS1Lay1JLS15LUQtLU1nLTAtQy0tDQpRUUJ1LUc4LWJRQmgtR3ctYndCMS1ITS1JLUJULUc4LVpnQjAtSGMtWVFCeS1HVS1JLUJF LUdVLWQtQmwtSEktX1FCdi1ISS1ZUUIwLUdrLWJ3QnUtQy0tUXdCdi1ISS1jLUJ2LUhJLVlRQjAtR2stYndCdS0tLS1PZy1KLS1FLVR3QnktR2stWndCcC1H NC1ZUUJzLUVZLV9RQnMtR1UtYmdCaC1HMC1aUS0tLUhNLWMtQnctR00tTGdCay1Hdy1iLS0tLS0tLQ0KTC0tRy0tRS1VLUJ5LUc4LVotQjEtR00tZC1CTy1H RS1iUUJsLS0tLS0tQnYtR2ctYndCdi1Hcy0tLS0wLS1nLS1RQlEtSEktYndCay1IVS1Zd0IwLUZZLVpRQnktSE0tX1FCdi1HNC0tLS13LUM0LU5RLXUtRC0t TGctdy0tLS1SLS0tLS1FLVZnQmgtSEktUmdCcC1Hdy1aUUJKLUc0LVpnQnYtLS0tLS0tay0tUS0tLUJVLUhJLVlRQnUtSE0tYi1CaC1IUS0NCl9RQnYtRzQt LS0tLS0ta0U1LVEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQotLS0tLS0tUS0tLVUtLS0tTXpCSU1Ha3dkakJTTVZveC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo6c3BwYzMyLmRs bDoNCg0KOj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIFJlcGxhY2UgIi0iIHdpdGggIkEiIGFuZCAiXyIg d2l0aCAiYSIgYmVmb3JlIGJhc2U2NCBjb252ZXJzaW9uDQo6OiAgSXQgd2FzIGNoYW5nZWQgdG8gcHJldmVudCBhbnRpdmlydXNlcyBmcm9tIGRldGVjdGlu ZyBhbmQgZmxhZ2dpbmcgYmFzZTY0IGVuY29kaW5nDQoNCjpzcHBjNjQuZGxsOg0KVFZxUS0tTS0tLS1FLS0tLS8vOC0tTGctLS0tLS0tLS1RLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1nLS0tLS00ZnVnNC10LW5OSWJnQlRNMGhWR2hwY3lCd2NtOW5jbUZ0SUdOaGJtNXZkQ0Jp WlNCeWRXNGdfVzRnUkU5VElHMXZaR1V1RFEwS0otLS0tLS0tLS1CUVJRLS1aSVlILU1EYzBHUS0tLS0tLS0tLS1QLS0NCkxpSUwtZ0lvLS1JLS0tLWUtLS0t LS0tLUV4RS0tLS1RLS0tLS1KSXgtZy0tLS0tUS0tLS0tZy0tQi0tLS0tLS0tLS1HLS0tLS0tLS0tLUNRLS0tLUItLS1MZVktLS1JLVktRS0tQy0tLS0tLS0t LVEtLS0tLS0tLS0tLVEtLS0tLS0tLUUtLS0tLS0tLS0tLS0tLVEtLS0tLUYtLS1JMFEtLS0tYy0tLVUtRS0tLUMtLS1CNC13LS0tRC0tLUNRLS0tLS0tLS0t DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWlILS0tRGct LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS11ZEdWNGQtLS0tSC1CLS0tLUUtLS0tLUktLS0tRS0tLS0tLS0tLS0tLS0tLS0tLS1nLS1CZ0xu SmtZWFJoLS0tZy0tLS0tQy0tLS0tQw0KLS0tLUJnLS0tLS0tLS0tLS0tLS0tLS0tUS0tLVFDNXdaR0YwWVEtLUotLS0tLS13LS0tLS1nLS0tLWctLS0tLS0t LS0tLS0tLS0tLS1FLS0tRS11ZUdSaGRHRS0tQ1EtLS0tLVEtLS0tLUktLS0tSy0tLS0tLS0tLS0tLS0tLS0tLUItLS1CLUxtVmtZWFJoLS1DTkUtLS0tRi0t LS0tUy0tLS1ELS0tLS0tLS0tLS0tLS0tLS0tLVEtLS1RQzVwWkdGMFlRLS0NClUtRS0tLUJ3LS0tLS1nLS0tQjQtLS0tLS0tLS0tLS0tLS0tLS1FLS0tTS11 Y25OeVl3LS0tSGdELS0tLWctLS0tLVEtLS0tZy0tLS0tLS0tLS0tLS0tLS0tLUItLS1ELS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRUZVVTBpRDdFaEZNY2xN alFYdkR3LS1TSTFFSkRqSFJDUTANCi0tLS0tRWlKUkNRb1NJMUVKRFJJaVVRa0lFakhSQ1E0LS0tLS1PZ0YtUS0tU0l0TUpEaElpeDFaWS0tLWhjQkJpY1Iw Qi8vVFJUSGs2eWhFaTBRa05FaU5GX2tQLS1EL0ZVbGctLUJJaTB3a09FaUZ3SFFLLzlOQnYtRS0tLURyLXYvVFJJbmdTSVBFU0Z0QlhNTkJWVUZVVlZkV1Uw aUQ3RGd4OWt5THJDU1EtLS0tU0l1c0pKZy0tLUJNaVd3a0lFaUp6MGlKDQpiQ1FvNkotLS0tQkJpY1NGd0hWRVFUbDEtSFkrU0d2ZUtFaUxWUUJJLWRxRGVo LS1kQ2hJaWZub0l2Ly8vNFgtZFJ4SS0xMC1TTWRERS1FLS0tQkl4ME1ZLS0tLS1FakhReS0tLS0tLVNQL0c2N3hFaWVCSWc4UTRXMTVmWFVGY1FWM0R1LUUt LS1ERGtKQ1FrSkNRa1A4bGVsOC0tSkNRRHgrRS0tLS0tLUQvSlhwZi0tQ1FrLThmaC0tLS0tLS0veVZLWHctLQ0Ka0pEL0pUcGYtLUNRa1AvLy8vLy8vLy8v LS0tLS0tLS0tLUQvLy8vLy8vLy8vdy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVRnQmgtRzAtWlEtLS1FYy1jZ0JoLUdNLVpRLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLUUtLS1pQi0tLS1CLS0tQ0lFLS0tRXhFLS0teC0tLS1URVEtLUdSRS0tQ0ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLUVILXctSGdnTXctcy0t LS1FTUJ3LU1ZZ2d3QjItR2MtVlFCTS1DMC0tLS1RLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1EYzBHUS0tLS0teGxJLS0tRS0tLUJELS0tLVF3LS0tQ2hRLS0tMFVR LS1RRkktLU05Uy0tRHZVZy0tQlZNLS1DbFQtLUJkVXctLW9WTS0tT2xULS0tWFYtLS1OVlEtLUdkVQ0KLS1DZFYtLS00MVEtLUMxVi0tQmhWUS0tbjFVLS1O TlYtLS1OVmctLU8xWS0tSEZXLS1DdlZnLS16MVktLVB0Vy0tQ0lFLS0tVVZjLS1HOVgtLUNmVnctLTAxYy0tQkZZLS1CTlctLS1iMWctLUtWWS0tRE5XLS0t QlZrLS1FRlotLUJ0V1EtLXAxay0tTHRaLS1EN1dRLS1PVm8tLUU5Xy0tQjFXZy0tblZvLS1OTl8tLS1IV3ctLVBWcy0tR2xiLS1DbFd3LS0NCjQxcy0tLTFj LS0tNVgtLS1pVnctLU5GYy0tLVJYUS0tV1YwLS1LTmQtLUR4WFEtLUcxNC0tRWRlLS1DSFhnLS11MTQtLU9kZS0tLXJYdy0tVzE4LS1MVmYtLURyWHctLUoy LS0tRjFnLS1EaVVnLS0vVkktLUJwVC0tQkdVdy0tZ2xNLS1NaFQtLS1EVi0tLUtWUS0tRkZVLS1DRlYtLS13MVEtLS10Vi0tQktWUS0tZzFVLS1MeFYtLUR6 VlEtLUoxWS0tRmxXDQotLUNUVmctLXdsWS0tT2hXLS0tWlZ3LS1NVmMtLUdOWC0tQ0tWdy0tdkZjLS1QVlgtLS15Vy0tLVlWZy0tSTFZLS1DOFctLS03Rmct LUNaWi0tQl9XUS0talZrLS1MUlotLURlV1EtLUhWby0tRWRfLS1CbFdnLS1qRm8tLUx0Xy0tRHdXZy0tSlZzLS1GWmItLUNLV3ctLXgxcy0tUHRiLS0tbVgt LS1aRnctLUxCYy0tRDBYLS0tT0YwLS1JRmQtLUROWFEtLQ0KQ1Y0LS1EUmUtLUJxWGctLXBGNC0tTlJlLS0tTVh3LS1SbDgtLUl0Zi0tRFRYdy0tREctLS1F VmctLUI0WS0tLS0tLUItLUktLXctRS0tVS1CZy1ILS1nLUNRLUstLXMtRC0tTi0tNC1Edy1RLUJFLUVnLVQtQlEtRlEtVy1CYy1HLS1aLUJvLUd3LWMtQjAt SGctZi1DLS1JUS1pLUNNLUotLWwtQ1ktSnctby1Day1LZy1yLUN3LUxRLXUtQzgtTS0teC1ESS0NCk13LTAtRFUtTmctMy1EZy1PUS02LURzLVAtLTktRDQt UHdCLS1FRS1RZ0J6Y0hCakxtUnNiLUJUVUZCRFV5NVRURU5oYkd4VFpYSjJaWEktVTB4RFlXeHNVMlZ5ZG1WeS1GTlFVRU5UTGxOTVEyeHZjMlUtVTB4RGJH OXpaUUJUVUZCRFV5NVRURU52Ym5OMWJXVlNfV2RvZC1CVFRFTnZibk4xYldWU19XZG9kLUJUVUZCRFV5NVRURVJsY0c5el9YUk5fV2R5DQpZWFJwYjI1Q2JH OWktRk5NUkdWd2IzTnBkRTFwWjNKaGRHbHZia0pzYjJJLVUxQlFRMU11VTB4RVpYQnZjMmwwVDJabWJHbHVaVU52Ym1acGNtMWhkR2x2Ymtsay1GTk1SR1Z3 YjNOcGRFOW1abXhwYm1WRGIyNW1fWEp0WVhScGIyNUpaLUJUVUZCRFV5NVRURVJsY0c5el9YUlBabVpzX1c1bFEyOXVabWx5YldGMF9XOXVTV1JGZS1CVFRF UmxjRzl6X1hSUA0KWm1ac19XNWxRMjl1Wm1seWJXRjBfVzl1U1dSRmUtQlRVRkJEVXk1VFRFUmxjRzl6X1hSVGRHOXlaVlJ2XzJWdS1GTk1SR1Z3YjNOcGRG TjBiM0psVkc5clpXNC1VMUJRUTFNdVUweEdfWEpsUlhabGJuUS1VMHhHX1hKbFJYWmxiblEtVTFCUVExTXVVMHhIWVhSb1pYSk5fV2R5WVhScGIyNUNiRzlp LUZOTVIyRjBfR1Z5VFdsbmNtRjBfVzl1UW14dllnQlQNClVGQkRVeTVUVEVkaGRHaGxjazFwWjNKaGRHbHZia0pzYjJKRmUtQlRURWRoZEdobGNrMXBaM0po ZEdsdmJrSnNiMkpGZS1CVFVGQkRVeTVUVEVkbGJtVnlZWFJsVDJabWJHbHVaVWx1YzNSaGJHeGhkR2x2Ymtsay1GTk1SMlZ1WlhKaGRHVlBabVpzX1c1bFNX NXpkR0ZzYkdGMF9XOXVTV1EtVTFCUVExTXVVMHhIWlc1bGNtRjBaVTltWm14cGJtVkpibk4wDQpZV3hzWVhScGIyNUpaRVY0LUZOTVIyVnVaWEpoZEdWUFpt WnNfVzVsU1c1emRHRnNiR0YwX1c5dVNXUkZlLUJUVUZCRFV5NVRURWRsZEVGamRHbDJaVXhwWTJWdWMyVkpibVp2LUZOTVIyVjBRV04wX1habFRHbGpaVzV6 WlVsdVptOC1VMUJRUTFNdVUweEhaWFJCY0hCc19XTmhkR2x2YmtsdVptOXliV0YwX1c5dS1GTk1SMlYwUVhCd2JHbGpZWFJwYjI1Sg0KYm1admNtMWhkR2x2 YmdCVFVGQkRVeTVUVEVkbGRFRndjR3hwWTJGMF9XOXVVRzlzX1dONS1GTk1SMlYwUVhCd2JHbGpZWFJwYjI1UWIyeHBZM2stVTFCUVExTXVVMHhIWlhSQmRY Um9aVzUwX1dOaGRHbHZibEpsYzNWc2QtQlRURWRsZEVGMWRHaGxiblJwWTJGMF9XOXVVbVZ6ZFd4MC1GTlFVRU5UTGxOTVIyVjBSVzVqY25sd2RHVmtVRWxF UlhnLVUweEgNClpYUkZibU55ZVhCMFpXUlFTVVJGZS1CVFVGQkRVeTVUVEVkbGRFZGxiblZwYm1WSmJtWnZjbTFoZEdsdmJnQlRURWRsZEVkbGJuVnBibVZK Ym1admNtMWhkR2x2YmdCVFVGQkRVeTVUVEVkbGRFbHVjM1JoYkd4bFpGQnliMlIxWTNSTFpYbEpaSE0tVTB4SFpYUkpibk4wWVd4c1pXUlFjbTlrZFdOMFMy VjVTV1J6LUZOUVVFTlRMbE5NUjJWMFRHbGpaVzV6DQpaUUJUVEVkbGRFeHBZMlZ1YzJVLVUxQlFRMU11VTB4SFpYUk1fV05sYm5ObFJtbHNaVWxrLUZOTVIy VjBUR2xqWlc1elpVWnBiR1ZKWi1CVFVGQkRVeTVUVEVkbGRFeHBZMlZ1YzJWSmJtWnZjbTFoZEdsdmJnQlRURWRsZEV4cFkyVnVjMlZKYm1admNtMWhkR2x2 YmdCVFRFZGxkRXhwWTJWdWMybHVaMU4wWVhSMWMwbHVabTl5YldGMF9XOXUtRk5RVUVOVA0KTGxOTVIyVjBVRXRsZVVsay1GTk1SMlYwVUV0bGVVbGstRk5R VUVOVExsTk1SMlYwVUV0bGVVbHVabTl5YldGMF9XOXUtRk5NUjJWMFVFdGxlVWx1Wm05eWJXRjBfVzl1LUZOUVVFTlRMbE5NUjJWMFVHOXNfV041U1c1bWIz SnRZWFJwYjI0LVUweEhaWFJRYjJ4cFkzbEpibVp2Y20xaGRHbHZiZ0JUVUZCRFV5NVRURWRsZEZCdmJHbGplVWx1Wm05eWJXRjANCl9XOXVSRmRQVWtRLVUw eEhaWFJRYjJ4cFkzbEpibVp2Y20xaGRHbHZia1JYVDFKRS1GTlFVRU5UTGxOTVIyVjBVSEp2WkhWamRGTnJkVWx1Wm05eWJXRjBfVzl1LUZOTVIyVjBVSEp2 WkhWamRGTnJkVWx1Wm05eWJXRjBfVzl1LUZOUVVFTlRMbE5NUjJWMFUweEpSRXhwYzNRLVUweEhaWFJUVEVsRVRHbHpkLUJUVUZCRFV5NVRURWRsZEZObGNu WnBZMlZKDQpibVp2Y20xaGRHbHZiZ0JUVEVkbGRGTmxjblpwWTJWSmJtWnZjbTFoZEdsdmJnQlRVRkJEVXk1VFRFbHVjM1JoYkd4TV9XTmxibk5sLUZOTVNX NXpkR0ZzYkV4cFkyVnVjMlUtVTFCUVExTXVVMHhKYm5OMFlXeHNVSEp2YjJaUFpsQjFjbU5vWVhObC1GTk1TVzV6ZEdGc2JGQnliMjltVDJaUWRYSmpfR0Z6 WlFCVFVGQkRVeTVUVEVsdWMzUmhiR3hRY205dg0KWms5bVVIVnlZMmhoYzJWRmUtQlRURWx1YzNSaGJHeFFjbTl2Wms5bVVIVnlZMmhoYzJWRmUtQlRVRkJE VXk1VFRFbHpSMlZ1ZFdsdVpVeHZZMkZzUlhnLVUweEpjMGRsYm5WcGJtVk1iMk5oYkVWNC1GTlFVRU5UTGxOTVRHOWhaRUZ3Y0d4cFkyRjBfVzl1VUc5c19X TnBaWE0tVTB4TWIyRmtRWEJ3YkdsallYUnBiMjVRYjJ4cFkybGxjd0JUVUZCRFV5NVQNClRFOXdaVzQtVTB4UGNHVnUtRk5RVUVOVExsTk1VR1Z5YzJsemRF RndjR3hwWTJGMF9XOXVVRzlzX1dOcFpYTS1VMHhRWlhKel9YTjBRWEJ3YkdsallYUnBiMjVRYjJ4cFkybGxjd0JUVUZCRFV5NVRURkJsY25OcGMzUlNWRk5R WVhsc2IyRmtUM1psY25KcFpHVS1VMHhRWlhKel9YTjBVbFJUVUdGNWJHOWhaRTkyWlhKeV9XUmwtRk5RVUVOVExsTk1VbVZCDQpjbTAtVTB4U1pVRnliUUJU VUZCRFV5NVRURkpsWjJsemRHVnlSWFpsYm5RLVUweFNaV2RwYzNSbGNrVjJaVzUwLUZOUVVFTlRMbE5NVW1Wbl9YTjBaWEpRYkhWbl9XNC1VMHhTWldkcGMz UmxjbEJzZFdkcGJnQlRVRkJEVXk1VFRGTmxkRUYxZEdobGJuUnBZMkYwX1c5dVJHRjBZUUJUVEZObGRFRjFkR2hsYm5ScFkyRjBfVzl1UkdGMFlRQlRVRkJE VXk1VA0KVEZObGRFTjFjbkpsYm5SUWNtOWtkV04wUzJWNS1GTk1VMlYwUTNWeWNtVnVkRkJ5YjJSMVkzUkxaWGstVTFCUVExTXVVMHhUWlhSSFpXNTFfVzVs U1c1bWIzSnRZWFJwYjI0LVUweFRaWFJIWlc1MV9XNWxTVzVtYjNKdFlYUnBiMjQtVTFCUVExTXVVMHhWYm1sdWMzUmhiR3hNX1dObGJuTmwtRk5NVlc1cGJu TjBZV3hzVEdsalpXNXpaUUJUVUZCRFV5NVQNClRGVnVfVzV6ZEdGc2JGQnliMjltVDJaUWRYSmpfR0Z6WlFCVFRGVnVfVzV6ZEdGc2JGQnliMjltVDJaUWRY SmpfR0Z6WlFCVFVGQkRVeTVUVEZWdWJHOWhaRUZ3Y0d4cFkyRjBfVzl1VUc5c19XTnBaWE0tVTB4VmJteHZZV1JCY0hCc19XTmhkR2x2YmxCdmJHbGpfV1Z6 LUZOUVVFTlRMbE5NVlc1eVpXZHBjM1JsY2tWMlpXNTAtRk5NVlc1eVpXZHBjM1JsDQpja1YyWlc1MC1GTlFVRU5UTGxOTVZXNXlaV2RwYzNSbGNsQnNkV2Rw YmdCVFRGVnVjbVZuX1hOMFpYSlFiSFZuX1c0LVUxQlFRMU11VTB4d1FYVjBfR1Z1ZEdsallYUmxSMlZ1ZFdsdVpWUnBZMnRsZEZKbGMzQnZibk5sLUZOTWNF RjFkR2hsYm5ScFkyRjBaVWRsYm5WcGJtVlVfV05yWlhSU1pYTndiMjV6WlFCVFVGQkRVeTVUVEhCQ1pXZHBia2RsYm5WcA0KYm1WVV9XTnJaWFJVY21GdWMy RmpkR2x2YmdCVFRIQkNaV2RwYmtkbGJuVnBibVZVX1dOclpYUlVjbUZ1YzJGamRHbHZiZ0JUVUZCRFV5NVRUSEJEYkdWaGNrRmpkR2wyWVhScGIyNUpibEJ5 YjJkeVpYTnotRk5NY0VOc1pXRnlRV04wX1haaGRHbHZia2x1VUhKdlozSmxjM00tVTFCUVExTXVVMHh3UkdWd2IzTnBkRVJ2ZDI1c1pYWmxiRWRsYm5WcGJt VlUNCl9XTnJaWFEtVTB4d1JHVndiM05wZEVSdmQyNXNaWFpsYkVkbGJuVnBibVZVX1dOclpYUS1VMUJRUTFNdVUweHdSR1Z3YjNOcGRGUnZfMlZ1UVdOMF9Y WmhkR2x2YmxKbGMzQnZibk5sLUZOTWNFUmxjRzl6X1hSVWIydGxia0ZqZEdsMllYUnBiMjVTWlhOd2IyNXpaUUJUVUZCRFV5NVRUSEJIWlc1bGNtRjBaVlJ2 XzJWdVFXTjBfWFpoZEdsdmJrTm9ZV3hzDQpaVzVuWlFCVFRIQkhaVzVsY21GMFpWUnZfMlZ1UVdOMF9YWmhkR2x2YmtOb1lXeHNaVzVuWlFCVFVGQkRVeTVU VEhCSFpYUkhaVzUxX1c1bFFteHZZZ0JUVEhCSFpYUkhaVzUxX1c1bFFteHZZZ0JUVUZCRFV5NVRUSEJIWlhSSFpXNTFfVzVsVEc5allXdy1VMHh3UjJWMFIy VnVkV2x1WlV4dlkyRnMtRk5RVUVOVExsTk1jRWRsZEV4cFkyVnVjMlZCWTNGMQ0KX1hOcGRHbHZia2x1Wm04LVUweHdSMlYwVEdsalpXNXpaVUZqY1hWcGMy bDBfVzl1U1c1bWJ3QlRVRkJEVXk1VFRIQkhaWFJOVTFCcFpFbHVabTl5YldGMF9XOXUtRk5NY0VkbGRFMVRVR2xrU1c1bWIzSnRZWFJwYjI0LVUxQlFRMU11 VTB4d1IyVjBUV0ZqX0dsdVpWVkhWVWxFLUZOTWNFZGxkRTFoWTJocGJtVlZSMVZKUi1CVFVGQkRVeTVUVEhCSFpYUlUNCmIydGxia0ZqZEdsMllYUnBiMjVI Y21GdWRFbHVabTgtVTB4d1IyVjBWRzlyWlc1QlkzUnBkbUYwX1c5dVIzSmhiblJKYm1adi1GTlFVRU5UTGxOTWNFbEJRV04wX1haaGRHVlFjbTlrZFdOMC1G Tk1jRWxCUVdOMF9YWmhkR1ZRY205a2RXTjAtRk5RVUVOVExsTk1jRWx6UTNWeWNtVnVkRWx1YzNSaGJHeGxaRkJ5YjJSMVkzUkxaWGxFWldaaGRXeDBTMlY1 DQotRk5NY0VselEzVnljbVZ1ZEVsdWMzUmhiR3hsWkZCeWIyUjFZM1JMWlhsRVpXWmhkV3gwUzJWNS1GTlFVRU5UTGxOTWNGQnliMk5sYzNOV1RWQnBjR1ZO WlhOellXZGwtRk5NY0ZCeWIyTmxjM05XVFZCcGNHVk5aWE56WVdkbC1GTlFVRU5UTGxOTWNGTmxkRUZqZEdsMllYUnBiMjVKYmxCeWIyZHlaWE56LUZOTWNG TmxkRUZqZEdsMllYUnBiMjVKYmxCeQ0KYjJkeVpYTnotRk5RVUVOVExsTk1jRlJ5X1dkblpYSlRaWEoyX1dObFYyOXlfMlZ5LUZOTWNGUnlfV2RuWlhKVFpY SjJfV05sVjI5eV8yVnktRk5RVUVOVExsTk1jRlpNUVdOMF9YWmhkR1ZRY205a2RXTjAtRk5NY0ZaTVFXTjBfWFpoZEdWUWNtOWtkV04wLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVVILS0tLS0tLS0tLS0tLS1JSEUtLUlody0tQm9jLS0tLS0tLS0tLS0tLS13Y1EtLW9I LS0tSGh3LS0tLS0tLS0tLS0tLUVSeC0tQ3djLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1ELWMtLS0tLS0tLU9Kdy0tLS0tLS0tLS0tLS0tLS0tLS0t Y1EtLS0tLS0tLS0tLS0tLS0tLS0NCkRIRS0tLS0tLS0tLS0tLS0tLS0tLU1Cdy0tLS0tLS0tNG4tLS0tLS0tLS0tLS0tLS0tLS0tLUJ4LS0tLS0tLS0tLS0t LS0tLS0tLU1jUS0tLS0tLS0tLS0tLS0tLS0tLS1nQlRURWRsZEV4cFkyVnVjMmx1WjFOMFlYUjFjMGx1Wm05eWJXRjBfVzl1LS1FLVUweEhaWFJRY205a2RX TjBVMnQxU1c1bWIzSnRZWFJwYjI0LS1PZ0RURzlqWVd4R2NtVmwtRkVCDQpVM1J5VTNSeVRrbFgtLUJ3LS0tLWMtLS1jM0J3WTNNdVpHeHMtLS0tRkgtLS1F dEZVazVGVERNeUxtUnNiLS0tLS0tb2MtLS1VMGhNVjBGUVNTNWtiR3ctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUUtRS0tLS1CZy0tSS0tLS0tLS0tLS0tLS0tLS0tLS0tRS0tUS0tLUQtLS1JLS0tLS0tLS0tLS0tLS0NCi0t LS0tLUUtQ1FRLS1FZy0tLUJZZy0tLUgtTS0tLS0tLS0tLS0tLS1ILU0wLS0tLVZnQlQtRjgtVmdCRi1GSS1Vd0JKLUU4LVRnQmYtRWstVGdCRy1FOC0tLS0t LUwwRTcvNC0tLUUtQlEtLS0tLS0tLS1GLS0tLS0tLS0tLS0tLS0tLS0tLS1CLS1FLS1JLS0tLS0tLS0tLS0tLS0tLS0tLUI4LWctLS1RQlQtSFEtY2dCcC1H NC1ad0JHLUdrLWItQmwtRWstDQpiZ0JtLUc4LS0tQlktZy0tLVEtdy1EUS1NLS01LUQtLU4tQkYtRFEtLS1CNi1DMC0tUUJELUc4LWJRQnctR0UtYmdCNS1F NC1ZUUJ0LUdVLS0tLS0tRUUtYmdCdi1HMC1ZUUJzLUc4LWRRQnotQy0tVXdCdi1HWS1kLUIzLUdFLWNnQmwtQy0tUi1CbC1IUS1aUUJ5LUdrLWJ3QnktR0Ut ZC1CcC1HOC1iZy1nLUVNLWJ3QnktSC0tYndCeS1HRS1kLUJwLUc4LQ0KYmctLS0tLS1QZy1MLS1FLVJnQnAtR3ctWlFCRS1HVS1jd0JqLUhJLV9RQnctSFEt X1FCdi1HNC0tLS0tLUc4LV8tQnYtRzgtX3ctZy1GTS1VLUJRLUVNLS0tLS0tRC0tQy0tQi1FWS1fUUJzLUdVLVZnQmwtSEktY3dCcC1HOC1iZy0tLS0tLU0t LXUtRFUtTGctdy1DNC1NLS0tLUNvLUJRLUItRWstYmdCMC1HVS1jZ0J1LUdFLWItQk8tR0UtYlFCbC0tLS0NCmN3QnctSC0tWXctLS0tLS1qLS0wLS1FLVQt QmwtR2MtWVFCcy1FTS1id0J3LUhrLWNnQnAtR2MtXy1CMC0tLS1xUS1nLURJLU0tLXktRFEtSS1CQi1HNC1id0J0LUdFLWItQnYtSFUtY3ctZy1GTS1id0Jt LUhRLWR3QmgtSEktWlEtZy1FUS1aUUIwLUdVLWNnQnAtRzgtY2dCaC1IUS1fUUJ2LUc0LUktQkQtRzgtY2dCdy1HOC1jZ0JoLUhRLV9RQnYtRzQtDQotLS02 LS1rLS1RQlAtSEktX1FCbi1Hay1iZ0JoLUd3LVJnQnAtR3ctWlFCdS1HRS1iUUJsLS0tLWN3QnctSC0tWXctdS1HUS1iLUJzLS0tLS0tLXMtLVktLVFCUS1I SS1id0JrLUhVLVl3QjAtRTQtWVFCdC1HVS0tLS0tLUc4LV8tQnYtRzgtX3ctLS1EUS1DLS1CLUYtLWNnQnYtR1EtZFFCai1IUS1WZ0JsLUhJLWN3QnAtRzgt YmctLS1ELS1MZy0xLUM0LQ0KTS0tdS1ELS0tLUJFLS0tLS1RQlctR0UtY2dCRy1Hay1iLUJsLUVrLWJnQm0tRzgtLS0tLS1DUS1CLS0tLUZRLWNnQmgtRzQt Y3dCcy1HRS1kLUJwLUc4LWJnLS0tLS0tQ1FUa0ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCjpzcHBjNjQuZGxsOg0KDQo6KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysNCg0KOlRTZm9yZ2VBY3RpdmF0aW9uDQoNCjo6ICBUbyBhY3RpdmF0ZSBXaW5kb3dzLCBydW4gdGhlIHNjcmlwdCB3aXRoICIvWi1X aW5kb3dzIiBwYXJhbWV0ZXIgb3IgY2hhbmdlIDAgdG8gMSBpbiBiZWxvdyBsaW5lDQpzZXQgX2FjdHdpbj0wDQoNCjo6ICBUbyBhY3RpdmF0ZSBXaW5kb3dz IEVTVSwgcnVuIHRoZSBzY3JpcHQgd2l0aCAiL1otRVNVIiBwYXJhbWV0ZXIgb3IgY2hhbmdlIDAgdG8gMSBpbiBiZWxvdyBsaW5lDQpzZXQgX2FjdGVzdT0w DQoNCjo6ICBUbyBhY3RpdmF0ZSBhbGwgT2ZmaWNlIGFwcHMgKGluY2x1ZGluZyBQcm9qZWN0L1Zpc2lvKSwgcnVuIHRoZSBzY3JpcHQgd2l0aCAiL1otT2Zm aWNlIiBwYXJhbWV0ZXIgb3IgY2hhbmdlIDAgdG8gMSBpbiBiZWxvdyBsaW5lDQpzZXQgX2FjdG9mZj0wDQoNCjo6ICBUbyBhY3RpdmF0ZSBvbmx5IFByb2pl Y3QvVmlzaW8sIHJ1biB0aGUgc2NyaXB0IHdpdGggIi9aLVByb2plY3RWaXNpbyIgcGFyYW1ldGVyIG9yIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0K c2V0IF9hY3Rwcm9qdmlzPTANCg0KOjogIFRvIGFjdGl2YXRlIGFsbCBXaW5kb3dzL0VTVS9PZmZpY2UsIHJ1biB0aGUgc2NyaXB0IHdpdGggIi9aLVdpbmRv d3NFU1VPZmZpY2UiIHBhcmFtZXRlciBvciBjaGFuZ2UgMCB0byAxIGluIGJlbG93IGxpbmUNCnNldCBfYWN0d2luZXN1b2ZmPTANCg0KOjogIEFkdmFuY2Vk IG9wdGlvbnM6DQo6OiAgVG8gYWN0aXZhdGUgV2luZG93cyBLLU0tUyBob3N0IChjc3ZsayksIHJ1biB0aGUgc2NyaXB0IHdpdGggIi9aLVdpbkhvc3QiIHBh cmFtZXRlciBvciBjaGFuZ2UgMCB0byAxIGluIGJlbG93IGxpbmUNCnNldCBfYWN0d2luaG9zdD0wDQoNCjo6ICBUbyBhY3RpdmF0ZSBPZmZpY2UgSy1NLVMg aG9zdCAoY3N2bGspLCBydW4gdGhlIHNjcmlwdCB3aXRoICIvWi1PZmZIb3N0IiBwYXJhbWV0ZXIgb3IgY2hhbmdlIDAgdG8gMSBpbiBiZWxvdyBsaW5lDQpz ZXQgX2FjdG9mZmhvc3Q9MA0KDQo6OiAgVG8gYWN0aXZhdGUgV2luZG93cyA4LzguMSBBUFBYIFNpZGVsb2FkaW5nIChBUFBYTE9CKSwgcnVuIHRoZSBzY3Jp cHQgd2l0aCAiL1otQVBQWCIgcGFyYW1ldGVyIG9yIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0Kc2V0IF9hY3RhcHB4PTANCg0KOjogIFRvIGFjdGl2 YXRlIGNlcnRhaW4gYWN0aXZhdGlvbiBJRHMsIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZSBhbmQgc2V0IGFjdGl2YXRpb24gSURzIGluICJ0c2lkcyIg dmFyaWFibGUsIHlvdSBjYW4gZW50ZXIgbXVsdGlwbGUgYnkgYWRkaW5nIGEgc3BhY2UgYWZ0ZXIgZWFjaCBvZiB0aGVtDQo6OiAgb3IgcnVuIHRoZSBzY3Jp cHQgd2l0aCAiL1otSUQtQWN0aXZhdGlvbklkR29lc0hlcmUiIHBhcmFtZXRlci4gSWYgeW91IHdhbnQgdG8gYWRkIG11bHRpcGxlIHRocm91Z2ggcGFyYW1l dGVyLCBwYXNzIGVhY2ggb2YgdGhlbSBpbiBzZXBhcmF0ZSBwYXJhbWV0ZXJzDQpzZXQgX2FjdG1hbj0NCnNldCB0c2lkcz0NCg0KOjogIFRvIHJlc2V0IHJl YXJtIGNvdW50ZXIsIGV2YWx1YXRpb24gcGVyaW9kIGFuZCBjbGVhciB0aGUgdGFtcGVyIHN0YXRlLCBrZXkgbG9jaywgcnVuIHRoZSBzY3JpcHQgd2l0aCAi L1otUmVzZXQiIHBhcmFtZXRlciBvciBjaGFuZ2UgMCB0byAxIGluIGJlbG93IGxpbmUNCnNldCBfcmVzYWxsPTANCg0KOjogIENob29zZSBhY3RpdmF0aW9u IG1ldGhvZDoNCjo6ICBJbiBidWlsZHMgMjYxMDAgYW5kIGxhdGVyLCB0aGUgc2NyaXB0IHdpbGwgYXV0byBzZWxlY3QgU3RhdGljQ0lEIChyZXF1aXJlcyBp bnRlcm5ldCkuIElmIG5vIGludGVybmV0IGlzIGRldGVjdGVkLCBpdCB3aWxsIHRoZW4gYXV0byBzZWxlY3QgdGhlIEtNUzRrIG1ldGhvZC4gRm9yIGJ1aWxk cyBsb3dlciB0aGFuIDI2MTAwLCB0aGUgc2NyaXB0IHdpbGwgYXV0byBzZWxlY3QgWmVyb0NJRC4NCjo6ICBUbyBjaGFuZ2UgdGhlIGFjdGl2YXRpb24gbWV0 aG9kLCBydW4gdGhlIHNjcmlwdCB3aXRoIHRoZSBwYXJhbWV0ZXJzICIvWi1TQ0lEIiwgIi9aLVpDSUQiLCBvciAiL1otS01TNGsiLCBvciBtb2RpZnkgdGhl IG9wdGlvbiBmcm9tIEF1dG8gdG8gU0NJRCwgWkNJRCwgb3IgS01TNGsgaW4gdGhlIGxpbmUgYmVsb3cuDQpzZXQgX2FjdG1ldGhvZD1BdXRvDQoNCjo6ICBE ZWJ1ZyBNb2RlOg0KOjogIFRvIHJ1biB0aGUgc2NyaXB0IGluIGRlYnVnIG1vZGUsIGNoYW5nZSAwIHRvIGFueSBwYXJhbWV0ZXIgYWJvdmUgdGhhdCB5b3Ug d2FudCB0byBydW4sIGluIGJlbG93IGxpbmUNCnNldCAiX2RlYnVnPTAiDQoNCjo6ICBTY3JpcHQgd2lsbCBydW4gaW4gdW5hdHRlbmRlZCBtb2RlIGlmIHBh cmFtZXRlcnMgYXJlIHVzZWQgT1IgdmFsdWUgaXMgY2hhbmdlZCBpbiBhYm92ZSBsaW5lcy4NCjo6ICBJZiBtdWx0aXBsZSBvcHRpb25zIGFyZSBzZWxlY3Rl ZCB0aGVuIHNjcmlwdCB3aWxsIG9ubHkgcGljayBvbmUgZnJvbSB0aGUgYWR2YW5jZWQgb3B0aW9uLg0KDQoNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmNscw0KY29sb3IgMDcNCnNldCBLUz1LJWJsYW5rJU1TDQp0aXRsZSAgVFNmb3JnZSBBY3RpdmF0aW9uICVt YXN2ZXIlDQoNCnNldCBfYXJncz0NCnNldCBfZWxldj0NCnNldCBfdW5hdHRlbmRlZD0wDQoNCnNldCBfYXJncz0lKg0KaWYgZGVmaW5lZCBfYXJncyBzZXQg X2FyZ3M9JV9hcmdzOiI9JQ0KaWYgZGVmaW5lZCBfYXJncyBmb3IgJSVBIGluICglX2FyZ3MlKSBkbyAoDQppZiAvaSAiJSVBIj09Ii1lbCIgICAgICAgICAg ICAgICAgICAgICAoc2V0IF9lbGV2PTEpDQppZiAvaSAiJSVBIj09Ii9aLVdpbmRvd3MiICAgICAgICAgICAgICAoc2V0IF9hY3R3aW49MSkNCmlmIC9pICIl JUEiPT0iL1otRVNVIiAgICAgICAgICAgICAgICAgIChzZXQgX2FjdGVzdT0xKQ0KaWYgL2kgIiUlQSI9PSIvWi1PZmZpY2UiICAgICAgICAgICAgICAgKHNl dCBfYWN0b2ZmPTEpDQppZiAvaSAiJSVBIj09Ii9aLVByb2plY3RWaXNpbyIgICAgICAgICAoc2V0IF9hY3Rwcm9qdmlzPTEpDQppZiAvaSAiJSVBIj09Ii9a LVdpbmRvd3NFU1VPZmZpY2UiICAgICAoc2V0IF9hY3R3aW5lc3VvZmY9MSkNCmlmIC9pICIlJUEiPT0iL1otV2luSG9zdCIgICAgICAgICAgICAgIChzZXQg X2FjdHdpbmhvc3Q9MSkNCmlmIC9pICIlJUEiPT0iL1otT2ZmSG9zdCIgICAgICAgICAgICAgIChzZXQgX2FjdG9mZmhvc3Q9MSkNCmlmIC9pICIlJUEiPT0i L1otQVBQWCIgICAgICAgICAgICAgICAgIChzZXQgX2FjdGFwcHg9MSkNCmVjaG8gIiUlQSIgfCBmaW5kIC9pICIvWi1JRC0iICA+bnVsICYmIChzZXQgX2Fj dG1hbj0xJiBzZXQgImZpbHRzaWRzPSUlQSIgJiBjYWxsIHNldCAiZmlsdHNpZHM9JSVmaWx0c2lkczp+NiUlIiAmIGlmIGRlZmluZWQgZmlsdHNpZHMgY2Fs bCBzZXQgdHNpZHM9JSVmaWx0c2lkcyUlICUldHNpZHMlJSkNCmlmIC9pICIlJUEiPT0iL1otUmVzZXQiICAgICAgICAgICAgICAgIChzZXQgX3Jlc2FsbD0x KQ0KaWYgL2kgIiUlQSI9PSIvWi1TQ0lEIiAgICAgICAgICAgICAgICAgKHNldCBfYWN0bWV0aG9kPVNDSUQpDQppZiAvaSAiJSVBIj09Ii9aLVpDSUQiICAg ICAgICAgICAgICAgICAoc2V0IF9hY3RtZXRob2Q9WkNJRCkNCmlmIC9pICIlJUEiPT0iL1otS01TNGsiICAgICAgICAgICAgICAgIChzZXQgX2FjdG1ldGhv ZD1LTVM0aykNCikNCg0KaWYgbm90IGRlZmluZWQgdHNpZHMgc2V0IF9hY3RtYW49MA0KZm9yICUlQSBpbiAoJV9hY3R3aW4lICVfYWN0ZXN1JSAlX2FjdG9m ZiUgJV9hY3Rwcm9qdmlzJSAlX2FjdHdpbmVzdW9mZiUgJV9hY3R3aW5ob3N0JSAlX2FjdG9mZmhvc3QlICVfYWN0YXBweCUgJV9hY3RtYW4lICVfcmVzYWxs JSkgZG8gKGlmICIlJUEiPT0iMSIgc2V0IF91bmF0dGVuZGVkPTEpDQppZiAvaSBub3QgJV9hY3RtZXRob2QlPT1BdXRvIHNldCBfdW5hdHRlbmRlZD0xDQoN CmlmICV3aW5idWlsZCUgTFNTIDc2MDAgKA0KcmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXE5EUFx2My41 IiAvdiBJbnN0YWxsICVudWwyJSB8IGZpbmQgL2kgIjB4MSIgJW51bDElIHx8ICgNCiVlbGluZSUNCmVjaG8gLk5FVCAzLjUgRnJhbWV3b3JrIGlzIG5vdCBp bnN0YWxsZWQgaW4geW91ciBzeXN0ZW0uDQplY2hvIEluc3RhbGwgaXQgdXNpbmcgdGhlIGZvbGxvd2luZyBVUkwuDQplY2hvOg0KZWNobyBodHRwczovL3d3 dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yNTE1MA0KaWYgJV91bmF0dGVuZGVkJT09MCBzdGFydCBodHRwczovL3d3 dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yNTE1MA0KZ290byBka19kb25lDQopDQopDQoNCjo6PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6dHNfbWVudQ0KDQppZiAlX3VuYXR0ZW5kZWQlPT0wICgNCmNscw0KaWYgbm90IGRlZmlu ZWQgdGVybWluYWwgbW9kZSA3NiwgMzMNCnRpdGxlICBUU2ZvcmdlIEFjdGl2YXRpb24gJW1hc3ZlciUNCg0KZWNobzoNCmVjaG86DQplY2hvOg0KZWNobyAg ICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCmVjaG86IA0KZWNobyAgICAgICAg ICAgICAgIFsxXSBBY3RpdmF0ZSAtIFdpbmRvd3MNCmVjaG8gICAgICAgICAgICAgICBbMl0gQWN0aXZhdGUgLSBFU1UNCmVjaG8gICAgICAgICAgICAgICBb M10gQWN0aXZhdGUgLSBPZmZpY2UgW0FsbF0NCmVjaG8gICAgICAgICAgICAgICBbNF0gQWN0aXZhdGUgLSBPZmZpY2UgW1Byb2plY3QvVmlzaW9dDQplY2hv ICAgICAgICAgICAgICAgWzVdIEFjdGl2YXRlIC0gQWxsDQplY2hvICAgICAgICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18gIA0KZWNobzogDQplY2hvICAgICAgICAgICAgICAgICAgIEFkdmFuY2VkIE9wdGlvbnM6DQplY2hvOg0KZWNobyAgICAgICAgICAgICAg IFtBXSBBY3RpdmF0ZSAtIFdpbmRvd3MgJUtTJSBIb3N0DQplY2hvICAgICAgICAgICAgICAgW0JdIEFjdGl2YXRlIC0gT2ZmaWNlICVLUyUgSG9zdA0KZWNo byAgICAgICAgICAgICAgIFtDXSBBY3RpdmF0ZSAtIFdpbmRvd3MgOC84LjEgQVBQWCBTaWRlbG9hZGluZw0KZWNobyAgICAgICAgICAgICAgIFtEXSBBY3Rp dmF0ZSAtIE1hbnVhbGx5IFNlbGVjdCBQcm9kdWN0cw0KaWYgZGVmaW5lZCBfdmlzICgNCmVjaG8gICAgICAgICAgICAgICBbRV0gUmVzZXQgICAgLSBSZWFy bS9UaW1lcnMNCikgZWxzZSAoDQplY2hvICAgICAgICAgICAgICAgW0VdIFJlc2V0ICAgIC0gUmVhcm0vVGltZXJzL1RhbXBlci9Mb2NrDQopDQplY2hvICAg ICAgICAgICAgICAgW0ZdIENoYW5nZSAgIC0gQWN0aXZhdGlvbiBNZXRob2QgWyVfYWN0bWV0aG9kJV0NCmVjaG8gICAgICAgICAgICAgICBfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgICAgICANCmVjaG86DQplY2hvICAgICAgICAgICAgICAgWzZdIFJlbW92ZSBUU2Zvcmdl IEFjdGl2YXRpb24NCmVjaG8gICAgICAgICAgICAgICBbN10gRG93bmxvYWQgT2ZmaWNlDQplY2hvICAgICAgICAgICAgICAgWzBdICVfZXhpdG1zZyUNCmVj aG8gICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQplY2hvOg0KY2FsbCA6ZGtf Y29sb3IyICVfV2hpdGUlICIgICAgICAgICAgICAiICVfR3JlZW4lICJDaG9vc2UgYSBtZW51IG9wdGlvbiB1c2luZyB5b3VyIGtleWJvYXJkLi4uIg0KY2hv aWNlIC9DOjEyMzQ1QUJDREVGNjcwIC9ODQpzZXQgX2VsPSFlcnJvcmxldmVsIQ0KDQppZiAhX2VsIT09MTQgZXhpdCAvYg0KaWYgIV9lbCE9PTEzIHN0YXJ0 ICVtYXMlZ2VudWluZS1pbnN0YWxsYXRpb24tbWVkaWEgJiBnb3RvIDp0c19tZW51DQppZiAhX2VsIT09MTIgY2FsbCA6dHNfcmVtb3ZlICYgY2xzICYgZ290 byA6dHNfbWVudQ0KaWYgIV9lbCE9PTExIGdvdG8gOnRzX2NoYW5nZW1ldGhvZA0KaWYgIV9lbCE9PTEwIGNscyAmIHNldGxvY2FsICYgc2V0ICJfcmVzYWxs PTEiICAgICAgICYgY2FsbCA6dHNfc3RhcnQgJiBlbmRsb2NhbCAmIGNscyAmIGdvdG8gOnRzX21lbnUNCmlmICFfZWwhPT05ICBjbHMgJiBzZXRsb2NhbCAm IHNldCAiX2FjdG1hbj0xIiAgICAgICAmIGNhbGwgOnRzX3N0YXJ0ICYgZW5kbG9jYWwgJiBjbHMgJiBnb3RvIDp0c19tZW51DQppZiAhX2VsIT09OCAgY2xz ICYgc2V0bG9jYWwgJiBzZXQgIl9hY3RhcHB4PTEiICAgICAgJiBjYWxsIDp0c19zdGFydCAmIGVuZGxvY2FsICYgY2xzICYgZ290byA6dHNfbWVudQ0KaWYg IV9lbCE9PTcgIGNscyAmIHNldGxvY2FsICYgc2V0ICJfYWN0b2ZmaG9zdD0xIiAgICYgY2FsbCA6dHNfc3RhcnQgJiBlbmRsb2NhbCAmIGNscyAmIGdvdG8g OnRzX21lbnUNCmlmICFfZWwhPT02ICBjbHMgJiBzZXRsb2NhbCAmIHNldCAiX2FjdHdpbmhvc3Q9MSIgICAmIGNhbGwgOnRzX3N0YXJ0ICYgZW5kbG9jYWwg JiBjbHMgJiBnb3RvIDp0c19tZW51DQppZiAhX2VsIT09NSAgY2xzICYgc2V0bG9jYWwgJiBzZXQgIl9hY3R3aW5lc3VvZmY9MSIgJiBjYWxsIDp0c19zdGFy dCAmIGVuZGxvY2FsICYgY2xzICYgZ290byA6dHNfbWVudQ0KaWYgIV9lbCE9PTQgIGNscyAmIHNldGxvY2FsICYgc2V0ICJfYWN0cHJvanZpcz0xIiAgICYg Y2FsbCA6dHNfc3RhcnQgJiBlbmRsb2NhbCAmIGNscyAmIGdvdG8gOnRzX21lbnUNCmlmICFfZWwhPT0zICBjbHMgJiBzZXRsb2NhbCAmIHNldCAiX2FjdG9m Zj0xIiAgICAgICAmIGNhbGwgOnRzX3N0YXJ0ICYgZW5kbG9jYWwgJiBjbHMgJiBnb3RvIDp0c19tZW51DQppZiAhX2VsIT09MiAgY2xzICYgc2V0bG9jYWwg JiBzZXQgIl9hY3Rlc3U9MSIgICAgICAgJiBjYWxsIDp0c19zdGFydCAmIGVuZGxvY2FsICYgY2xzICYgZ290byA6dHNfbWVudQ0KaWYgIV9lbCE9PTEgIGNs cyAmIHNldGxvY2FsICYgc2V0ICJfYWN0d2luPTEiICAgICAgICYgY2FsbCA6dHNfc3RhcnQgJiBlbmRsb2NhbCAmIGNscyAmIGdvdG8gOnRzX21lbnUNCmdv dG8gOnRzX21lbnUNCikNCg0KZ290byA6dHNfc3RhcnQNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjp0 c19jaGFuZ2VtZXRob2QNCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDc2LCAzNg0KDQplY2hvOg0KZWNobzoNCmVjaG86DQplY2hvICAg ICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNobzogDQpjYWxsIDpka19jb2xv cjIgJV9XaGl0ZSUgIiAgICAgICAgICAgICBbMV0gIiAlX0dyZWVuJSAiQXV0byINCmVjaG8gICAgICAgICAgICAgICAgICBCdWlsZHMgXj49IDI2MTAwIC0g V2luZG93cyBvbmx5ICAtIEtNUzRrDQplY2hvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXIgb3B0aW9ucyAtIFN0YXRpY0NJRA0K ZWNobzoNCmVjaG8gICAgICAgICAgICAgICAgICBCdWlsZHMgXjwgIDI2MTAwIC0gWmVyb0NJRA0KZWNobyAgICAgICAgICAgICAgX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCmVjaG86IA0KZWNobyAgICAgICAgICAgICAgWzJdIFN0YXRpY0NJRA0KZWNobyAgICAgICAg ICAgICAgICAgIE5lZWRzIEludGVybmV0DQplY2hvICAgICAgICAgICAgICAgICAgTm90IGZvciBXaW5kb3dzIDcgb3Igb2xkZXINCmVjaG8gICAgICAgICAg ICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQplY2hvOg0KZWNobyAgICAgICAgICAgICAgWzNdIFplcm9D SUQNCmVjaG8gICAgICAgICAgICAgICAgICBXb3JrcyByZWxpYWJseSBvbiBidWlsZHMgYmVsb3cgMjYxMDANCmVjaG8gICAgICAgICAgICAgICAgICBEb2Vz IG5vdCB3b3JrIG9uIGJ1aWxkcyBhYm92ZSAyNjEwMC40MTg4DQplY2hvICAgICAgICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXw0KZWNobzoNCmVjaG8gICAgICAgICAgICAgIFs0XSBLTVM0aw0KZWNobyAgICAgICAgICAgICAgICAgIFZvbHVtZSBsaWNlbnNl cyBvbmx5DQplY2hvICAgICAgICAgICAgICAgICAgQWN0aXZhdGVzIGZvciA0MDAwKyB5ZWFycw0KZWNobyAgICAgICAgICAgICAgX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCmVjaG86DQplY2hvICAgICAgICAgICAgICBbNV0gTGVhcm4gTW9yZQ0KZWNobyAgICAgICAg ICAgICAgWzBdICVfZXhpdG1zZyUNCmVjaG8gICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IyICVfV2hpdGUlICIgICAgICAgICAgICAiICVfR3JlZW4lICJDaG9vc2UgYSBtZW51IG9wdGlvbiB1c2lu ZyB5b3VyIGtleWJvYXJkLi4uIg0KY2hvaWNlIC9DOjEyMzQ1MCAvTg0Kc2V0IF9lbD0hZXJyb3JsZXZlbCENCg0KaWYgIV9lbCE9PTYgZ290byA6dHNfbWVu dQ0KaWYgIV9lbCE9PTUgIGNscyAmIHN0YXJ0ICVtYXMldHNmb3JnZSAmZ290byA6dHNfbWVudQ0KaWYgIV9lbCE9PTQgIGNscyAmIHNldCAiX2FjdG1ldGhv ZD1LTVM0ayIgJiBnb3RvIDp0c19tZW51DQppZiAhX2VsIT09MyAgY2xzICYgc2V0ICJfYWN0bWV0aG9kPVpDSUQiICAmIGdvdG8gOnRzX21lbnUNCmlmICFf ZWwhPT0yICBjbHMgJiBzZXQgIl9hY3RtZXRob2Q9U0NJRCIgICYgZ290byA6dHNfbWVudQ0KaWYgIV9lbCE9PTEgIGNscyAmIHNldCAiX2FjdG1ldGhvZD1B dXRvIiAgJiBnb3RvIDp0c19tZW51DQpnb3RvIDp0c19jaGFuZ2VtZXRob2QNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09DQoNCjp0c19zdGFydA0KDQpjbHMNCg0KaWYgJV9hY3R3aW5lc3VvZmYlPT0xIChzZXQgaGVpZ2h0PTM4KSBlbHNlIChzZXQgaGVpZ2h0PTMyKQ0K aWYgbm90IGRlZmluZWQgdGVybWluYWwgKA0KbW9kZSAxMjUsICVoZWlnaHQlDQppZiBleGlzdCAiJVN5c1BhdGglXHNwcFxzdG9yZV90ZXN0XCIgbW9kZSAx MzQsICVoZWlnaHQlDQolcHNjJSAiJnskVz0kSG9zdC5VSS5SYXdVSS5XaW5kb3dTaXplOyRCPSRIb3N0LlVJLlJhd1VJLkJ1ZmZlclNpemU7JFcuSGVpZ2h0 PSVoZWlnaHQlOyRCLkhlaWdodD0zMDA7JEhvc3QuVUkuUmF3VUkuV2luZG93U2l6ZT0kVzskSG9zdC5VSS5SYXdVSS5CdWZmZXJTaXplPSRCO30iICVudWwl DQopDQp0aXRsZSAgVFNmb3JnZSBBY3RpdmF0aW9uICVtYXN2ZXIlDQoNCmVjaG86DQplY2hvIEluaXRpYWxpemluZy4uLg0KY2FsbCA6ZGtfY2hrbWFsDQoN CmlmIG5vdCBleGlzdCAlU3lzUGF0aCVcJV9zbGV4ZSUgKA0KJWVsaW5lJQ0KZWNobyBbJVN5c1BhdGglXCVfc2xleGUlXSBmaWxlIGlzIG1pc3NpbmcsIGFi b3J0aW5nLi4uDQplY2hvOg0KaWYgbm90IGRlZmluZWQgcmVzdWx0cyAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkdvIGJhY2sgdG8gTWFpbiBNZW51LCBz ZWxlY3QgVHJvdWJsZXNob290IGFuZCBydW4gRElTTSBSZXN0b3JlIGFuZCBTRkMgU2NhbiBvcHRpb25zLiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiQWZ0 ZXIgdGhhdCwgcmVzdGFydCBzeXN0ZW0gYW5kIHRyeSBhY3RpdmF0aW9uIGFnYWluLiINCnNldCBmaXhlcz0lZml4ZXMlICVtYXMlaW4tcGxhY2VfcmVwYWly X3VwZ3JhZGUNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIklmIGl0IHN0aWxsIHNob3dzIHRoZSBzYW1lIGVycm9yLCBkbyB0aGlzIC0gIiAlX1llbGxvdyUg IiAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlIg0KKQ0KZ290byBka19kb25lDQopDQoNCmZvciAvZiAiZGVsaW1zPSIgJSVhIGluICgnJXBzYyUgIltT eXN0ZW0uRW52aXJvbm1lbnRdOjpWZXJzaW9uLk1ham9yIiAlbnVsNiUnKSBkbyBpZiAiJSVhIj09IjIiICgNCnJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxN aWNyb3NvZnRcTkVUIEZyYW1ld29yayBTZXR1cFxORFBcdjMuNSIgL3YgSW5zdGFsbCAlbnVsMiUgfCBmaW5kIC9pICIweDEiICVudWwxJSB8fCAoDQolZWxp bmUlDQplY2hvIC5ORVQgMy41IEZyYW1ld29yayBpcyBjb3JydXB0IG9yIG1pc3NpbmcuIEFib3J0aW5nLi4uDQppZiBleGlzdCAiJVN5c1BhdGglXHNwcFx0 b2tlbnNcc2t1c1xTZWN1cml0eS1TUFAtQ29tcG9uZW50LVNLVS1FbWJlZGRlZCIgKA0KZWNobyBJbnN0YWxsIC5ORVQgRnJhbWV3b3JrIDQuOCBhbmQgV2lu ZG93cyBNYW5hZ2VtZW50IEZyYW1ld29yayA1LjENCikNCnNldCBmaXhlcz0lZml4ZXMlICVtYXMldHJvdWJsZXNob290DQpjYWxsIDpka19jb2xvcjIgJUJs dWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMldHJvdWJsZXNob290Ig0KZ290byBka19kb25lDQopDQopDQoN CmlmICV3aW5idWlsZCUgTFNTIDkyMDAgaWYgZXhpc3QgIiVTeXNQYXRoJVx3bG1zXHdsbXMuZXhlIiAoDQpzYyBxdWVyeSB3bG1zIHwgZmluZCAvaSAiUlVO TklORyIgJW51bCUgJiYgKA0Kc2Mgc3RvcCAlX3Nsc2VyJSAlbnVsJQ0KaWYgIWVycm9ybGV2ZWwhIEVRVSAxMDUxICgNCiVlbGluZSUNCmVjaG8gRXZhbHVh dGlvbiBXTE1TIHNlcnZpY2UgaXMgcnVubmluZywgJV9zbHNlciUgc2VydmljZSBjYW4gbm90IGJlIHN0b3BwZWQuIEFib3J0aW5nLi4uDQplY2hvIEluc3Rh bGwgTm9uLUV2YWwgdmVyc2lvbiBmb3IgV2luZG93cyBidWlsZCAld2luYnVpbGQlLg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNh bGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQpnb3Rv IGRrX2RvbmUNCikNCikNCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmlmICVfYWN0d2luZXN1b2Zm JT09MSAoc2V0ICJfYWN0d2luPTEiICYgc2V0ICJfYWN0ZXN1PTEiICYgc2V0ICJfYWN0b2ZmPTEiKQ0KaWYgJV9hY3Rwcm9qdmlzJT09MSAgIChzZXQgIl9h Y3RvZmY9MSIpDQoNCnNldCBzcHA9U29mdHdhcmVMaWNlbnNpbmdQcm9kdWN0DQpzZXQgc3BzPVNvZnR3YXJlTGljZW5zaW5nU2VydmljZQ0KDQpjYWxsIDpk a19ja2Vja3dtaWMNCmNhbGwgOmRrX2NoZWNrc2t1DQpjYWxsIDpka19wcm9kdWN0DQpjYWxsIDpka19zcHBpc3N1ZQ0KDQo6Oj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0Kc2V0IGVycm9yPQ0KDQpjbHMNCmVjaG86DQpjYWxsIDpka19zaG93b3NpbmZvDQoNCmlmIC9pICVf YWN0bWV0aG9kJT09U0NJRCBzZXQgdHNtZXRob2Q9U3RhdGljQ0lEDQppZiAvaSAlX2FjdG1ldGhvZCU9PVpDSUQgc2V0IHRzbWV0aG9kPVplcm9DSUQNCmlm IC9pICVfYWN0bWV0aG9kJT09S01TNGsgc2V0IHRzbWV0aG9kPUtNUzRrDQoNCmlmIC9pICVfYWN0bWV0aG9kJT09QXV0byAoDQppZiAld2luYnVpbGQlIEdF USAyNjEwMCAoDQpzZXQgdHNtZXRob2Q9U3RhdGljQ0lEDQppZiAhX2FjdHdpbiE9PTEgaWYgbm90ICFfYWN0d2luZXN1b2ZmIT09MSAoDQpzZXQgdHNtZXRo b2Q9S01TNGsNCikNCikgZWxzZSAoDQpzZXQgdHNtZXRob2Q9WmVyb0NJRA0KKQ0KKQ0KDQppZiAld2luYnVpbGQlIExTUyA5MjAwIGlmIC9pICV0c21ldGhv ZCU9PVN0YXRpY0NJRCAoDQolZWxpbmUlDQplY2hvIFN0YXRpY0NJRCBtZXRob2QgaXMgc3VwcG9ydGVkIG9ubHkgb24gV2luZG93cyA4IGFuZCBsYXRlci4N CmdvdG8gZGtfZG9uZQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIEludGVybmV0 IGNvbm5lY3Rpb24NCg0KaWYgL2kgJXRzbWV0aG9kJT09U3RhdGljQ0lEICgNCnNldCBfaW50PQ0KZm9yICUlYSBpbiAobC5yb290LXNlcnZlcnMubmV0IHJl c29sdmVyMS5vcGVuZG5zLmNvbSBkb3dubG9hZC53aW5kb3dzdXBkYXRlLmNvbSBnb29nbGUuY29tKSBkbyBpZiBub3QgZGVmaW5lZCBfaW50ICgNCmZvciAv ZiAiZGVsaW1zPVtdIHRva2Vucz0yIiAlJSMgaW4gKCdwaW5nIC1uIDEgJSVhJykgZG8gKGlmIG5vdCAiJSUjIj09IiIgc2V0IF9pbnQ9MSkNCikNCg0KaWYg bm90IGRlZmluZWQgX2ludCAoDQolcHNjJSAiSWYoW0FjdGl2YXRvcl06OkNyZWF0ZUluc3RhbmNlKFtUeXBlXTo6R2V0VHlwZUZyb21DTFNJRChbR3VpZF0n e0RDQjAwQzAxLTU3MEYtNEE5Qi04RDY5LTE5OUZEQkE1NzIzQn0nKSkuSXNDb25uZWN0ZWRUb0ludGVybmV0KXtFeGl0IDB9RWxzZXtFeGl0IDF9Ig0KaWYg IWVycm9ybGV2ZWwhPT0wIChzZXQgX2ludD0xJnNldCBwaW5nX2Y9IEJ1dCBQaW5nIEZhaWxlZCkNCikNCg0KaWYgZGVmaW5lZCBfaW50ICgNCmVjaG8gQ2hl Y2tpbmcgSW50ZXJuZXQgQ29ubmVjdGlvbiAgICAgICAgICAgIFtDb25uZWN0ZWQhcGluZ19mIV0NCikgZWxzZSAoDQppZiAvaSAlX2FjdG1ldGhvZCU9PUF1 dG8gaWYgbm90ICVfYWN0bWFuJT09MSBzZXQgdHNtZXRob2Q9S01TNGsNCmlmIC9pICF0c21ldGhvZCE9PUtNUzRrICgNCmNhbGwgOmRrX2NvbG9yICVSZWQl ICJDaGVja2luZyBJbnRlcm5ldCBDb25uZWN0aW9uICAgICAgICAgICAgW05vdCBDb25uZWN0ZWRdIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJTd2l0Y2hp bmcgVG8gS01TNGsgYWN0aXZhdGlvbiBiZWNhdXNlIEludGVybmV0IGlzIG5lZWRlZCBmb3IgU3RhdGljQ0lEIG1ldGhvZC4iDQopIGVsc2UgKA0Kc2V0IGVy cm9yPTENCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBJbnRlcm5ldCBDb25uZWN0aW9uICAgICAgICAgICAgW05vdCBDb25uZWN0ZWRdIg0KY2Fs bCA6ZGtfY29sb3IgJUJsdWUlICJJbnRlcm5ldCBpcyByZXF1aXJlZCBmb3IgVFNmb3JnZSBTdGF0aWNDSUQgb3B0aW9uLiINCikNCmVjaG86DQopDQopDQoN Cjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQplY2hvIEluaXRpYXRpbmcgRGlhZ25vc3RpYyBUZXN0cy4uLg0K DQpzZXQgIl9zZXJ2PSVfc2xzZXIlIFdpbm1nbXQiDQoNCjo6ICBTb2Z0d2FyZSBQcm90ZWN0aW9uDQo6OiAgV2luZG93cyBNYW5hZ2VtZW50IEluc3RydW1l bnRhdGlvbg0KDQpjYWxsIDpka19lcnJvcmNoZWNrDQoNCmNhbGwgOnRzX2dldGVkaXRpb24NCmlmIG5vdCBkZWZpbmVkIHRzZWRpdGlvbiAoDQpjYWxsIDpk a19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgV2luZG93cyBFZGl0aW9uIElEICAgICAgICAgICAgIFtOb3QgZm91bmQgaW4gaW5zdGFsbGVkIGxpY2Vuc2VzLCBh Ym9ydGluZy4uLl0iDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJw YWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCmdvdG8gOmRrX2RvbmUNCikNCg0KaWYgL2kgIXRzbWV0aG9kIT09S01T NGsgKA0KY2FsbCA6X3Rhc2tjbGVhci1jYWNoZQ0KZWNobyBDbGVhcmluZyAlS1MlIENhY2hlICAgICAgICAgICAgICAgICAgICAgIFtTdWNjZXNzZnVsXQ0K KQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KaWYgJV9yZXNhbGwlPT0xIGdvdG8gOnRzX3Jlc2V0YWxs DQppZiAlX2FjdG1hbiU9PTEgZ290byA6dHNfYWN0bWFuDQppZiAlX2FjdGFwcHglPT0xIGdvdG8gOnRzX2FwcHhsb2INCmlmICVfYWN0d2luaG9zdCU9PTEg Z290byA6dHNfd2hvc3QNCmlmICVfYWN0b2ZmaG9zdCU9PTEgZ290byA6dHNfb2hvc3QNCmlmIG5vdCAlX2FjdHdpbiU9PTEgZ290byA6dHNfZXN1DQoNCjo6 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgUHJvY2VzcyBXaW5kb3dzDQo6OiAgQ2hlY2sgaWYgc3lzdGVt IGlzIHBlcm1hbmVudGx5IGFjdGl2YXRlZCBvciBub3QNCg0KZWNobzoNCmVjaG8gUHJvY2Vzc2luZyBXaW5kb3dzLi4uDQoNCmVjaG8gJXRzZWRpdGlvbiUg fCBmaW5kIC9pICJFdmFsIiAlbnVsMSUgJiYgKA0KZ290byA6dHNfd2luZXZhbA0KKQ0KDQpzZXQgL2EgVUJSPTANCmlmICV3aW5idWlsZCUgRVFVIDI2MTAw ICgNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgncmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJl bnRWZXJzaW9uIiAvdiBVQlIgJW51bDYlJykgZG8gaWYgbm90IGVycm9ybGV2ZWwgMSBzZXQgL2EgVUJSPSUlYg0KaWYgIVVCUiEgTFNTIDQxODggKHNldCBk b250Y2hlY2thY3Q9MSkNCikNCg0KaWYgbm90IGRlZmluZWQgZG9udGNoZWNrYWN0IGNhbGwgOnRzX2NoZWNrd2lucGVybQ0KaWYgZGVmaW5lZCBfcGVybSAo DQpjYWxsIDpka19jb2xvciAlR3JheSUgIkNoZWNraW5nIE9TIEFjdGl2YXRpb24gICAgICAgICAgICAgICAgICBbV2luZG93cyBpcyBhbHJlYWR5IHBlcm1h bmVudGx5IGFjdGl2YXRlZF0iDQpnb3RvIDp0c19lc3UNCikNCg0KaWYgJXdpbmJ1aWxkJSBMU1MgOTIwMCBpZiAvaSAldHNtZXRob2QlPT1LTVM0ayBnb3Rv IDp0c19vbGRrcw0KaWYgZGVmaW5lZCBfdmlzIGdvdG8gOnRzX3dpbnZpc3RhDQoNCnNldCB0ZW1waWQ9DQppZiAvaSAldHNtZXRob2QlPT1LTVM0ayAoc2V0 IGtleXR5cGU9a3MpIGVsc2UgKHNldCBrZXl0eXBlPXplcm8pDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRB bGxUZXh0KCchX2JhdHAhJykgLXNwbGl0ICc6d2ludHNpZFw6LionOy4gKFtzY3JpcHRibG9ja106OkNyZWF0ZSgkZlsxXSkpIiAlbnVsNiUnKSBkbyAoDQpl Y2hvICIlJWEiIHwgZmluZHN0ciAvciAiLiotLiotLiotLiotLioiICVudWwxJSAmJiAoc2V0IHRzaWRzPSF0c2lkcyEgJSVhJiBzZXQgdGVtcGlkPSUlYSkN CikNCg0KaWYgZGVmaW5lZCB0ZW1waWQgKA0KZWNobyBDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgWyV0ZW1waWQlXSBbJXRzZWRp dGlvbiVdDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEFjdGl2YXRpb24gSUQgICAgICAgICAgICAgICAgICBbTm90IEZvdW5k XSBbJXRzZWRpdGlvbiVdIFslb3NTS1UlXSINCnNldCBlcnJvcj0xDQppZiAvaSAldHNtZXRob2QlPT1LTVM0ayAoDQppZiAvaSAlX2FjdG1ldGhvZCU9PUF1 dG8gKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJSZXR1cm4gdG8gdGhlIHByZXZpb3VzIG1lbnUgYW5kIHNlbGVjdCBTdGF0aWNDSUQgYWN0aXZhdGlvbiBt ZXRob2QuIEludGVybmV0IGNvbm5lY3Rpb24gaXMgcmVxdWlyZWQgdG8gYWN0aXZhdGUuIg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiVXNl IG5vbi1LTVM0SyBhY3RpdmF0aW9uIG9wdGlvbnMgZnJvbSB0aGUgcHJldmlvdXMgbWVudS4iDQopDQopDQpnb3RvIDp0c19lc3UNCikNCg0KaWYgZGVmaW5l ZCB3aW5zdWIgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJXaW5kb3dzIFN1YnNjcmlwdGlvbiBbU0tVIElELSVzbGNTS1UlXSBmb3VuZC4gU2NyaXB0IHdp bGwgYWN0aXZhdGUgYmFzZSBlZGl0aW9uIFtTS1UgSUQtJXJlZ1NLVSVdLiINCmVjaG86DQopDQoNCmdvdG8gOnRzX2VzdQ0KDQo6Oj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnRzX29sZGtzDQoNCjo6ICBLTVMga2V5cyBmb3IgS01TNGsgbWV0aG9kIGJlY2F1c2UgVFNm b3JnZSBjYW5ub3QgaW5zdGFsbCBLTVMga2V5IG9uIFdpbmRvd3MgVmlzdGEgYW5kIDcNCg0KOjogIDFzdCBjb2x1bW4gPSBBY3RpdmF0aW9uIElEDQo6OiAg Mm5kIGNvbHVtbiA9IEdlbmVyaWMga2V5DQo6OiAgM3JkIGNvbHVtbiA9IEVkaXRpb24gSUQNCjo6ICBTZXBhcmF0b3IgID0gXw0KDQpzZXQgZj0NCnNldCBr ZXk9DQpzZXQgdGVtcGlkPQ0KaWYgbm90IGRlZmluZWQgYWxsYXBwcyBjYWxsIDpka19hY3RpZHMgNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYw NTlmDQoNCmZvciAlJSMgaW4gKA0KOjogV2luZG93cyA3DQphZTJlZTUwOS0xYjM0LTQxYzAtYWNiNy02ZDQ2NTAxNjg5MTVfMzNQWEgtN1k2S0YtMlZKQzkt WEJCUjgtSFYlZiVUSEhfRW50ZXJwcmlzZQ0KMWNiNmQ2MDUtMTFiMy00ZTE0LWJiMzAtZGE5MWM4ZTM5ODNhX1lEUkJQLTNEODNXLVRZMjZGLUQ0NkIyLVhD JWYlS1JKX0VudGVycHJpc2VODQpiOTJlOTk4MC1iOWQ1LTQ4MjEtOWM5NC0xNDBmNjMyZjYzMTJfRko4MkgtWFQ2Q1ItSjhEN1AtWFFKSjItR1AlZiVERDRf UHJvZmVzc2lvbmFsDQo1NGEwOWEwZC1kNTdiLTRjMTAtOGI2OS1hODQyZDY1OTBhZDVfTVJQS1QtWVRHMjMtSzdEN1QtWDJKTU0tUVklZiU3TUdfUHJvZmVz c2lvbmFsTg0KZGI1Mzc4OTYtMzc2Zi00OGFlLWE0OTItNTNkMDU0Nzc3M2QwX1lCWUY2LUJIQ1IzLUpQS1JCLUNEVzdCLUY5JWYlQks0X0VtYmVkZGVkX1BP U1JlYWR5DQphYTZkZDNhYS1jMmI0LTQwZTItYTU0NC1hNmJiYjNmNWMzOTVfNzNLUVQtQ0Q5RzYtSzdUUUctNjZNUlAtQ1ElZiUyMkNfRW1iZWRkZWRfVGhp blBDDQo1YTA0MTUyOS1mZWY4LTRkMDctYjA2Zi1iNTliNTczYjMyZDJfVzgyWUYtMlE3NlktNjNIWEItRkdKRzktR0YlZiU3UVhfUHJvZmVzc2lvbmFsRQ0K NDZiYmVkMDgtOWM3Yi00OGZjLWE2MTQtOTUyNTA1NzNmNGVhX0MyOVdCLTIyQ0M4LVZKMzI2LUdIRkpXLUg5JWYlREg0X0VudGVycHJpc2VFDQo6OiBXaW5k b3dzIFNlcnZlciAyMDA4IFIyDQo2ODUzMWZiOS01NTExLTQ5ODktOTdiZS1kMTFhMGY1NTYzM2ZfWUM2S1QtR0tXOVQtWVRLWVItVDRYMzQtUjclZiVWSENf U2VydmVyU3RhbmRhcmQNCjc0ODJlNjFiLWM1ODktNGI3Zi04ZWNjLTQ2ZDQ1NWFjM2I4N183NFlGUC0zUUZCMy1LUVQ4Vy1QTVhXSi03TSVmJTY0OF9TZXJ2 ZXJEYXRhY2VudGVyDQo2MjBlMmIzZC0wOWU3LTQyZmQtODAyYS0xN2ExMzY1MmZlN2FfNDg5SjYtVkhETVAtWDYzUEstM0s3OTgtQ1AlZiVYM1lfU2VydmVy RW50ZXJwcmlzZQ0KNzQ4MmU2MWItYzU4OS00YjdmLThlY2MtNDZkNDU1YWMzYjg3Xzc0WUZQLTNRRkIzLUtRVDhXLVBNWFdKLTdNJWYlNjQ4X1NlcnZlckRh dGFjZW50ZXJDb3JlDQo2ODUzMWZiOS01NTExLTQ5ODktOTdiZS1kMTFhMGY1NTYzM2ZfWUM2S1QtR0tXOVQtWVRLWVItVDRYMzQtUjclZiVWSENfU2VydmVy U3RhbmRhcmRDb3JlDQo2MjBlMmIzZC0wOWU3LTQyZmQtODAyYS0xN2ExMzY1MmZlN2FfNDg5SjYtVkhETVAtWDYzUEstM0s3OTgtQ1AlZiVYM1lfU2VydmVy RW50ZXJwcmlzZUNvcmUNCjhhMjY4NTFjLTFjN2UtNDhkMy1hNjg3LWZiY2E5YjlhYzE2Yl9HVDYzQy1SSkZRMy00R01CNi1CUkZCOS1DQiVmJTgzVl9TZXJ2 ZXJFbnRlcnByaXNlSUE2NA0KYTc4YjhiZDktODAxNy00ZGY1LWI4NmEtMDlmNzU2YWZmYTdjXzZUUEpGLVJCVkhHLVdCVzJSLTg2UVBILTZSJWYlVE00X1Nl cnZlcldlYg0KY2RhMThjZjMtYzE5Ni00NmFkLWIyODktNjBjMDcyODY5OTk0X1RUOE1ILUNHMjI0LUQzRDdRLTQ5OFcyLTlRJWYlQ1RYX1NlcnZlckhQQw0K YTc4YjhiZDktODAxNy00ZGY1LWI4NmEtMDlmNzU2YWZmYTdjXzZUUEpGLVJCVkhHLVdCVzJSLTg2UVBILTZSJWYlVE00X1NlcnZlcldlYkNvcmUNCmY3NzI1 MTVjLTBlODctNDhkNS1hNjc2LWU2OTYyYzNlMTE5NV83MzZSRy1YREtKSy1WMzRQRi1CSEs4Ny1KNiVmJVgzS19TZXJ2ZXJFbWJlZGRlZFNvbHV0aW9uDQo6 OiBXaW5kb3dzIFZpc3RhDQpjZmQ4ZmYwOC1jMGQ3LTQ1MmItOWY2MC1lZjVjNzBjMzIwOTRfVktLM1gtNjhLV00tWDJZR1QtUVI0TTYtNEIlZiVXTVZfRW50 ZXJwcmlzZQ0KNGYzZDE2MDYtM2ZlYS00YzAxLWJlM2MtOGQ2NzFjNDAxZTNiX1lGS0JCLVBRSkpWLUc5OTZHLVZXR1hZLTJWJWYlM1g4X0J1c2luZXNzDQoy YzY4MmRjMi04YjY4LTRmNjMtYTE2NS1hZTI5MWQ0Y2YxMzhfSE1CUUctOEgyUkgtQzc3VlgtMjdSODItVk0lZiVRQlRfQnVzaW5lc3NODQpkNGY1NDk1MC0y NmYyLTRmYjQtYmEyMS1mZmFiMTZhZmNhZGVfVlRDNDItQk04MzgtNDNRSFYtODRIWDYtWEolZiVYS1ZfRW50ZXJwcmlzZU4NCjo6IFdpbmRvd3MgU2VydmVy IDIwMDgNCmFkMjU0MmQ0LTkxNTQtNGM2ZC04YTQ0LTMwZjExZWU5Njk4OV9UTTI0VC1YOVJNRi1WV1hLNi1YOEpDOS1CRiVmJUdNMl9TZXJ2ZXJTdGFuZGFy ZA0KNjhiNmUyMjAtY2YwOS00NjZiLTkyZDMtNDVjZDk2NGI5NTA5XzdNNjdHLVBDMzc0LUdSNzQyLVlIOFY0LVRDJWYlQlkzX1NlcnZlckRhdGFjZW50ZXIN CmMxYWY0ZDkwLWQxYmMtNDRjYS04NWQ0LTAwM2JhMzNkYjNiOV9ZUUdNVy1NUFdUSi0zNEtESy00OE0zVy1YNCVmJVE2Vl9TZXJ2ZXJFbnRlcnByaXNlDQow MWVmMTc2Yi0zZTBkLTQyMmEtYjRmOC00ZWE4ODAwMzVlOGZfNERXRlAtSkYzREotQjdEVEgtNzhGSkItUEQlZiVSSEtfU2VydmVyRW50ZXJwcmlzZUlBNjQN CmRkZmE5ZjdjLWYwOWUtNDBiOS04YzFhLWJlODc3YTlhN2Y0Yl9XWVIyOC1SN1RGSi0zWDJZUS1ZQ1k0SC1NMiVmJTQ5RF9TZXJ2ZXJXZWINCjdhZmIxMTU2 LTJjMWQtNDBmYy1iMjYwLWFhYjc0NDJiNjJmZV9SQ1RYMy1LV1ZIUC1CUjZUQi1SQjZETS02WCVmJTdIUF9TZXJ2ZXJDb21wdXRlQ2x1c3Rlcg0KMjQwMWUz ZDAtYzUwYS00YjU4LTg3YjItN2U3OTRiN2QyNjA3X1c3VkQ2LTdKRkJSLVJYMjZCLVlLUTNZLTZGJWYlRkZKX1NlcnZlclN0YW5kYXJkVg0KZmQwOWVmNzct NTY0Ny00ZWZmLTgwOWMtYWYyYjY0NjU5YTQ1XzIyWFEyLVZSWFJHLVA4RDQyLUszNFRELUczJWYlUVFDX1NlcnZlckRhdGFjZW50ZXJWDQo4MTk4NDkwYS1h ZGQwLTQ3YjItYjNiYS0zMTZiMTJkNjQ3YjRfMzlCWEYtWDhRMjMtUDJXV1QtMzhUMkYtRzMlZiVGUEdfU2VydmVyRW50ZXJwcmlzZVYNCikgZG8gKA0KZm9y IC9mICJ0b2tlbnM9MS0zIGRlbGltcz1fIiAlJUEgaW4gKCIlJSMiKSBkbyBpZiAldHNlZGl0aW9uJT09JSVDIGlmIG5vdCBkZWZpbmVkIGtleSAoDQplY2hv ICIlYWxsYXBwcyUiIHwgZmluZCAvaSAiJSVBIiAlbnVsMSUgJiYgKA0Kc2V0IGtleT0lJUINCnNldCB0ZW1waWQ9JSVBDQopDQopDQopDQoNCmlmIG5vdCBk ZWZpbmVkIGtleSAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAgICAgIFsldHNlZGl0aW9uJSBT S1UtJW9zU0tVJSAlS1MlIGtleSBpcyBub3QgYXZhaWxhYmxlXSINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiVXNlIFplcm9DSUQgYWN0aXZhdGlvbiBtZXRo b2QgZnJvbSB0aGUgcHJldmlvdXMgbWVudS4iDQpnb3RvIDp0c19lc3UNCikNCg0KZWNobyBDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAg ICAgWyV0ZW1waWQlXSBbJXRzZWRpdGlvbiVdDQoNCnNldCBvbGRrcz0xDQpzZXQgZ2VuZXJpY2tleT0xDQpjYWxsIDpka19pbnNrZXkgIlsla2V5JV0iDQpz ZXQgdHNpZHM9JXRzaWRzJSAldGVtcGlkJQ0KZ290byA6dHNfZXN1DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KDQo6dHNfd2ludmlzdGENCg0KOjogIFByb2Nlc3MgV2luZG93cyBWaXN0YQ0KDQo6OiAgMXN0IGNvbHVtbiA9IEFjdGl2YXRpb24gSUQNCjo6ICAybmQg Y29sdW1uID0gR2VuZXJpYyBrZXkNCjo6ICAzcmQgY29sdW1uID0gS2V5IGNoYW5uZWwNCjo6ICA0dGggY29sdW1uID0gRWRpdGlvbiBJRA0KOjogIFNlcGFy YXRvciAgPSBfDQoNCjo6ICBLZXlzIGFyZW4ndCBhdmFpbGFibGUgZm9yIHRoZXNlIGVkaXRpb25zLCBidXQgc2luY2UgdGhlc2UgZWRpdGlvbnMgYXJlbid0 IHB1YmxpY2x5IGF2YWlsYWJsZSwgaXQgZG9lc24ndCBtYXR0ZXINCjo6ICBhNzk3ZDYxZS0xNDc1LTQ3MGItODZjOC1mNzM3YTcyYzE4OGQgU3RhcnRlck4N Cjo6ICA1ZTlmNTQ4YS1jOGE5LTQ0ZTYtYTZjMi0zZjhkMGE3YTk5ZGQgU2VydmVyQ29tcHV0ZUNsdXN0ZXJWDQoNCnNldCBmPQ0Kc2V0IGtleT0NCnNldCB0 ZW1waWQ9DQppZiBub3QgZGVmaW5lZCBhbGxhcHBzIGNhbGwgOmRrX2FjdGlkcyA1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYNCg0KZm9y ICUlIyBpbiAoDQo6OiAgV2luZG93c1Zpc3RhDQo5ZGU5YWJlMi1kMDFkLTQ1MzgtYWY4NC00NDk4YmRiYzJiYTNfNEQyWEgtUFJCTU0tOFEyMkItSzhCTTMt TVIlZiVXNFdfX19fX1JldGFpbF9CdXNpbmVzcw0KZGI0NDJiZTQtODFlZC00YWIzLTlkNjYtMjQxN2U4YTVjODFjXzc2ODg0LVFYRlkyLTZRMldYLTJRVFE4 LVFYJWYlWDQ0X19fX19SZXRhaWxfQnVzaW5lc3NODQpiNTE3OTFjMi1iNTYyLTRiNzMtOTdiMC03MzVhMGU0NDI5YTZfWVFQUVYtUlc4UjMtWE1QRkctUlhH OVItSkclZiVUVkZfX19fX1JldGFpbF9FbnRlcnByaXNlDQo1OGMzNzUxNy00MmY4LTQ3MjMtYmI0NC0zMGIwNTc5MWZmMmFfUTdKOVItRzYzUjQtQkZNSEYt RldNOVItUlclZiVETVZfX19fX1JldGFpbF9FbnRlcnByaXNlTg0KOTVjNmU4MGEtMGZmOC00YmQwLTk1ZjItYzRhMzliNzlkMDllX1JDRzdQLVRYNDJELUhN OEZNLVRDRkNXLTNWJWYlNFZEX19fX19SZXRhaWxfSG9tZUJhc2ljDQpkMDMzM2RhZC1jMTRlLTQ2ZjItYjYyYS04YjQ3YTFiOTc2OGJfSFkyVlYtWEM2RkYt TUQ2V1YtRlBZQlEtR0YlZiVKQlRfX19fX1JldGFpbF9Ib21lQmFzaWNODQo5ZTA0MjIyMy0wM2JmLTQ5YWUtODA4Zi1mZjM3ZjEyOGQ0MGRfWDlIVEYtTUtK UVEtWEszNzYtVEo3VDQtNzYlZiVQS0ZfX19fX1JldGFpbF9Ib21lUHJlbWl1bQ0KOTJkODk3N2MtZDUwNi00ZTYzLWI1MDAtNmQzOTI4M2I2Y2Q1X0tKNlRQ LVBGOVcyLTIzVDNRLVhUVjdNLVBYJWYlRFQyX19fX19SZXRhaWxfSG9tZVByZW1pdW1ODQo4OWU1MWEzYy03NmMwLTRiZWItYTY1MC01M2QzNGM4ZjgxODZf WDlQWVYtWUJRUlYtOUJYV1YtVFFETUstUUQlZiVXSzRfX19fX1JldGFpbF9TdGFydGVyDQozMGZhYjljYy04NjE0LTQzMzktOTg5Zi03Y2U2MWZiN2E1YzRf Vk1DQjktRkRSVjYtNkNEUU0tUlYyM0stUlAlZiU4RjdfX19fX1JldGFpbF9VbHRpbWF0ZQ0KMWVlZmVkMjAtOGFjMC00NzhjLTg3NzQtNzBjZDQ0NzgyZWEx X0NWWDM4LVAyN0I0LTJYOEJULVJYRDRKLVY3JWYlQ0tYX19fX19SZXRhaWxfVWx0aW1hdGVODQo6OiAgV2luZG93c1NlcnZlcjIwMDgNCmM5YWQ1MDJiLWVm NDgtNDFkMS1hMmEwLTM4YTM4ZTgyZmVkMF8yNEZWOS1IN0pXOC1DOFE2WC1CUUtNSy1LOSVmJTc3Sl9fX19fUmV0YWlsX1NlcnZlckNvbXB1dGVDbHVzdGVy DQo4NjZlOTI0ZS1jMmEzLTQ4NzItYWNhMS02YjQ4YzEzOTYyZDVfNlFCSFktRFhUUEotVDlXM1AtRFRKWFgtNFYlZiVRTUJfX19fX1JldGFpbF9TZXJ2ZXJE YXRhY2VudGVyDQpkMDIwYzcyOS0wN2YwLTRmOGYtODdjZS1iZjgwMzI3NWM3ODZfODNUV0ctVEQzVEMtSFJEUDItSzkzRkotWTMlZiU0WUNfT0VNOk5PTlNM UF9TZXJ2ZXJEYXRhY2VudGVyVg0KMzJiNDBlNWUtMGM2ZC00YzZmLWFiMTItYTAzMTkzM2ZkMmM2X01SQjdILVFKUkhHLUZYVEJSLUIyUTJNLThXJWYlTVRK X19fX19SZXRhaWxfU2VydmVyRW50ZXJwcmlzZQ0KMjU2Y2M5OTAtMTY5Mi00ZWE4LTk2NWMtMmQ0MjNkNWRkMjRlX0g0VkI2LVFQUldILVZEQ1lNLTk5NlA4 LU1IJWYlS0ZZX09FTTpOT05TTFBfU2VydmVyRW50ZXJwcmlzZUlBNjQNCjFiYTVlMDM2LWUzODYtNDJjNC1iN2ViLTE2YmRiNGZhMTk0NV9IOEg3TS1IRFBR VC1QSkhRRi1NN0I4My05QyVmJVZHVl9fX19fUmV0YWlsX1NlcnZlckVudGVycHJpc2VWDQo4ZGYwNDQ1Ny0wN2M4LTQzMDEtYmNlOS1kNjFlYjc2Y2IyZDZf UkdCTUMtUFFCVkYtOTRROUstSEQ2M0ItVlklZiU2TVBfX19fX1JldGFpbF9TZXJ2ZXJIb21lUHJlbWl1bQ0KNWJkMjNiMTktYWE3MS00YTViLThiNjgtYzg4 MDFjMmJhZmY2XzZDOEtSLU1EM1FLLTlHV0ZXLTQ0Q1kyLVc5JWYlQ0JNX19fX19SZXRhaWxfU2VydmVySG9tZVN0YW5kYXJkDQpiODZjNzczNi05MWZmLTRk ZTktYmZhOS1iMzJiOGEwOWFjYWNfN1hSQlktNk1QMkstVlFQVDgtRjM3SlYtWVklZiVRODNfX19fX1JldGFpbF9TZXJ2ZXJNZWRpdW1CdXNpbmVzc01hbmFn ZW1lbnQNCmQzZjU2NDJmLTA4MWQtNDBiMi1hNGI5LWVmZDMwNTRkNDU4NF82UERURC1KSzQ4Si02NjJURi04SjJRVi1SNCVmJUNSQl9fX19fUmV0YWlsX1Nl cnZlck1lZGl1bUJ1c2luZXNzTWVzc2FnaW5nDQpjNjkzNmEzNi02OWYzLTQ5OTQtOTg1Ny0zMDY5YzdiOWVjN2FfRDY5NFYtQ01XS0gtUFk5MlgtUEZRS1Et SkMlZiVCNjlfX19fX1JldGFpbF9TZXJ2ZXJNZWRpdW1CdXNpbmVzc1NlY3VyaXR5DQpjYzRjMmNmOC1lZjI5LTRkOGUtYjE2OC0yYjY1YTNkYjMzMDlfTVJE SzMtWVlRRjMtODhCUUotRDZGSkctNjklZiVZSllfX19fX1JldGFpbF9TZXJ2ZXJTQlNQcmVtaXVtDQpiMzgyN2IyNy1iZDM4LTQyODQtOThhZi1lNGY0ZDFj MDUxYTBfMktCMjMtR0pSQkQtVzNUOUMtNkNIMlctMzklZiVCN1ZfX19fX1JldGFpbF9TZXJ2ZXJTQlNQcmltZQ0KNWRhZDBlZmYtM2Y2Zi00MzEwLTg4NDQt NDIyZjlkYzdjODRiX0g0WERELUIyN0dZLTY2N1A2LVhXVlY3LUdZJWYlRzhKX19fX19SZXRhaWxfU2VydmVyU0JTU3RhbmRhcmQNCjYwMzUwNGY5LTEwOWYt NDlmMC05MjcxLThjNjZmNzg3OGY1OF84WVZNNC1ZUUJESC03V0RRTS1SMjdXUi1XViVmJUNXR19fX19fUmV0YWlsX1NlcnZlclN0YW5kYXJkDQo2NWFiNzMz OC05YWQwLTQzZmUtYWYxYi0xOTBiNTc3NDk1ZTJfSDlNVzMtNlY3R0stOTRQOUctN0ZUUEotVkslZiVDS0ZfX19fX1JldGFpbF9TZXJ2ZXJTdGFuZGFyZFYN CjJiZTIwNGRhLTI0YTAtNDk0My1iNjZjLTgxZTg0NjRhY2Q3ZV8yMjY0Qy1URDlUOC1QOEhQVy1DQzlHSC1NSCVmJU0yVl9fX19fUmV0YWlsX1NlcnZlclN0 b3JhZ2VFbnRlcnByaXNlDQo2MDIwN2ViYS04YjRhLTQ4NmMtYTAxMy0wMjNiNGI3NDJjMmZfUkNZTVQtWVgzNDItOFQ2WVktWFlIWUMtM0QlZiVEN1hfX19f X1JldGFpbF9TZXJ2ZXJTdG9yYWdlRXhwcmVzcw0KMzY4ODU2ZTktNDNmNy00NjAxLTgzNTgtZTU2MWYzNmM3ZGQ4X0ZLRlQyLVdYWVk5LVdCUFk3LTZZTVk0 LVg0JWYlOEpGX19fX19SZXRhaWxfU2VydmVyU3RvcmFnZVN0YW5kYXJkDQo0YmY0MzNmYS1hYjA0LTRjNmMtYjU1Yi0wMDE3MGUxNGI4Y2RfOFg5SjctSENK N0otM1dESlQtUU03RDgtNDYlZiU0WUhfX19fX1JldGFpbF9TZXJ2ZXJTdG9yYWdlV29ya2dyb3VwDQphNzdhNjgwNi1mNTllLTQ5NTMtOTdkNy0yMjkzMTdi OGU2YTZfQkdUMzktOUZZSDctWDJDWUQtVDYyOEYtUVAlZiVRUFdfX19fX1JldGFpbF9TZXJ2ZXJXZWINCmY5MmY4MzZkLTRkM2UtNGU5MC1hMDhmLTJkNjEy ZDY1ZTcxNl9IUEg3Ni1GSEZQUC1EUlc5RC03VzJWNC1IVyVmJUdLVF9fX19fUmV0YWlsX1NlcnZlcldpblNCDQozMDU5YTlmZC1iMDY4LTRmMGQtYWNhZi02 NjMyNGRjYTY3YWNfMlY4RzYtS1JYWVItTU1HWEotNlJXTTMtR1glZiVDQ0dfX19fX1JldGFpbF9TZXJ2ZXJXaW5TQlYNCikgZG8gKA0KZm9yIC9mICJ0b2tl bnM9MS00IGRlbGltcz1fIiAlJUEgaW4gKCIlJSMiKSBkbyBpZiAldHNlZGl0aW9uJT09JSVEIGlmIG5vdCBkZWZpbmVkIGtleSAoDQplY2hvICIlYWxsYXBw cyUiIHwgZmluZCAvaSAiJSVBIiAlbnVsMSUgJiYgKA0Kc2V0IGtleT0lJUINCnNldCB0ZW1waWQ9JSVBDQopDQopDQopDQoNCmlmIG5vdCBkZWZpbmVkIGtl eSAoDQpzZXQgZXJyb3I9MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEFjdGl2YXRpb24gSUQgICAgICAgICAgICAgICAgICBbJXRzZWRpdGlv biUgU0tVLSVvc1NLVSUgbm90IGZvdW5kIGluIHRoZSBzeXN0ZW1dIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiDQpnb3RvIDp0c19lc3UN CikNCg0KZWNobyBDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgWyV0ZW1waWQlXSBbJXRzZWRpdGlvbiVdDQoNCnNldCBnZW5lcmlj a2V5PTENCmNhbGwgOmRrX2luc2tleSAiWyVrZXklXSINCnNldCB0c2lkcz0ldHNpZHMlICV0ZW1waWQlDQpnb3RvIDp0c19lc3UNCg0KOjo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjp0c193aW5ldmFsDQoNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiQ2hlY2tpbmcgT1Mg RWRpdGlvbiAgICAgICAgICAgICAgICAgICAgIFsldHNlZGl0aW9uJV0gW0V2YWx1YXRpb24gZWRpdGlvbiBmb3VuZF0iDQpjYWxsIDpka19jb2xvciAlQmx1 ZSUgIkV2YWx1YXRpb24gZWRpdGlvbnMgY2Fubm90IGJlIGFjdGl2YXRlZCBvdXRzaWRlIG9mIGV2YWx1YXRpb24gcGVyaW9kLiINCg0KaWYgZXhpc3QgIiVT eXN0ZW1Sb290JVxTZXJ2aWNpbmdcUGFja2FnZXNcTWljcm9zb2Z0LVdpbmRvd3MtU2VydmVyKkVkaXRpb25+Ki5tdW0iICgNCmNhbGwgOmRrX2NvbG9yICVC bHVlJSAiU2NyaXB0IHdpbGwgcmVzZXQgZXZhbHVhdGlvbiBwZXJpb2QsIGJ1dCB0byBwZXJtYW5lbnRseSBhY3RpdmF0ZSBXaW5kb3dzLCINCmNhbGwgOmRr X2NvbG9yICVCbHVlJSAiR28gYmFjayB0byBtYWluIG1lbnUgYW5kIHVzZSBbQ2hhbmdlIEVkaXRpb25dIG9wdGlvbiBhbmQgY2hhbmdlIHRvIE5vbi1ldmFs IGVkaXRpb24uIg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiU2NyaXB0IHdpbGwgcmVzZXQgZXZhbHVhdGlvbiBwZXJpb2QsIGJ1dCB0byBw ZXJtYW5lbnRseSBhY3RpdmF0ZSBXaW5kb3dzLCBpbnN0YWxsIE5vbi1ldmFsIGVkaXRpb24uIg0KY2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICIlbWFzJWV2 YWx1YXRpb25fZWRpdGlvbnMiDQopDQoNCjo6ICBDaGVjayBJbnRlcm5ldCBjb25uZWN0aW9uDQoNCnNldCBfaW50PQ0KZm9yICUlYSBpbiAobC5yb290LXNl cnZlcnMubmV0IHJlc29sdmVyMS5vcGVuZG5zLmNvbSBkb3dubG9hZC53aW5kb3dzdXBkYXRlLmNvbSBnb29nbGUuY29tKSBkbyBpZiBub3QgZGVmaW5lZCBf aW50ICgNCmZvciAvZiAiZGVsaW1zPVtdIHRva2Vucz0yIiAlJSMgaW4gKCdwaW5nIC1uIDEgJSVhJykgZG8gKGlmIG5vdCAiJSUjIj09IiIgc2V0IF9pbnQ9 MSkNCikNCg0KaWYgbm90IGRlZmluZWQgX2ludCAoDQolcHNjJSAiSWYoW0FjdGl2YXRvcl06OkNyZWF0ZUluc3RhbmNlKFtUeXBlXTo6R2V0VHlwZUZyb21D TFNJRChbR3VpZF0ne0RDQjAwQzAxLTU3MEYtNEE5Qi04RDY5LTE5OUZEQkE1NzIzQn0nKSkuSXNDb25uZWN0ZWRUb0ludGVybmV0KXtFeGl0IDB9RWxzZXtF eGl0IDF9Ig0KaWYgIWVycm9ybGV2ZWwhPT0wIChzZXQgX2ludD0xJnNldCBwaW5nX2Y9IEJ1dCBQaW5nIEZhaWxlZCkNCikNCg0KaWYgZGVmaW5lZCBfaW50 ICgNCmVjaG8gQ2hlY2tpbmcgSW50ZXJuZXQgQ29ubmVjdGlvbiAgICAgICAgICAgIFtDb25uZWN0ZWQlcGluZ19mJV0NCikgZWxzZSAoDQpzZXQgZXJyb3I9 MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEludGVybmV0IENvbm5lY3Rpb24gICAgICAgICAgICBbTm90IENvbm5lY3RlZF0iDQpjYWxsIDpk a19jb2xvciAlQmx1ZSUgIkludGVybmV0IGlzIHJlcXVpcmVkIGZvciBXaW5kb3dzIEV2YWx1YXRpb24gYWN0aXZhdGlvbi4iDQopDQoNCjo6ICBMaXN0IG9m IHByb2R1Y3RzIGxhY2tpbmcgYWN0aXZhYmxlIGV2YWx1YXRpb24ga2V5cyBhbmQgSVNPcw0KDQo6OiAgYzRiOTA4ZDItYzRiOS00MzlkLThmZjAtNDhiNjU2 YTI0ZGE0X0VtYmVkZGVkSW5kdXN0cnlFRXZhbF84LjENCjo6ICA5Yjc0MjU1Yi1hZmUxLTRkYTctYTE0My05OGQxODc0YjJhNmNfRW50ZXJwcmlzZU5FdmFs XzgNCjo6ICA3ZmQwYTg4Yi1mYjg5LTQxNWYtOWI3OS04NGFkYzZhN2NkNTZfRW50ZXJwcmlzZU5FdmFsXzguMQ0KOjogIDk5NDU3OGViLTE5M2MtNGM5OS1i ZWEwLTI0ODMyNzRjOWFmZF9FbnRlcnByaXNlU05FdmFsXzIwMTUNCjo6ICBiOWYzMTA5Yy1iZmE5LTRmMzctOTgyNC02ZGJhOWVlNjIwNTZfU2VydmVyU3Rv cmFnZVN0YW5kYXJkRXZhbF8yMDEyUjINCjo6ICAyZDNiNzI2OS02NWY0LTQ2N2QtOWQ1MS1kYmUwZTVhNGU2NjhfU2VydmVyU3RvcmFnZVdvcmtncm91cEV2 YWxfMjAxMlIyDQoNCjo6IC0tLS0tLS0tDQoNCjo6ICAxc3QgY29sdW1uID0gQWN0aXZhdGlvbiBJRA0KOjogIDJuZCBjb2x1bW4gPSBBY3RpdmFibGUgZXZh bHVhdGlvbiBrZXkNCjo6ICAzcmQgY29sdW1uID0gRWRpdGlvbiBJRA0KOjogIDR0aCBjb2x1bW4gPSBXaW5kb3dzIHZlcnNpb24gKGZvciByZWZlcmVuY2Ug b25seSkNCjo6ICA1dGggY29sdW1uID0gTm9BY3QgPSBhY3RpdmF0aW9uIGlzIG5vdCB3b3JraW5nDQo6OiAgU2VwYXJhdG9yICA9IF8NCg0Kc2V0IGY9DQpz ZXQga2V5PQ0Kc2V0IGV2YWw9DQppZiBub3QgZGVmaW5lZCBhbGxhcHBzIGNhbGwgOmRrX2FjdGlkcyA1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2Yx NjA1OWYNCg0KZm9yICUlIyBpbiAoDQpkOWVlYTQ1OS0xZTZiLTQ5OWQtODQ4Ni1lNjgxNjNmMmE4YmVfTjNRSlItWUNXS0stUlZKR0stR1FGTVgtVDglZiUy QkZfRW1iZWRkZWRJbmR1c3RyeUV2YWxfOC4xDQpmYmQ0YzVjNi1hZGM2LTQ3NDAtYmM2NS1iMmRjNmRjMjQ5YzFfTUo4VE4tNDJKSDgtODg2TVQtOFRIQ0Yt MzYlZiU2N0JfRW50ZXJwcmlzZUV2YWxfOF9Ob0FjdF8gICAgICAgICAgUkVNIE5ldyB0aW1lIGJhc2VkIGFjdGl2YXRpb24gbm90IGF2YWlsYWJsZQ0KMGVl YmJiNDUtMjlkNC00OWNiLWJhODctYTIzZGIwY2NlNDBhXzc2RktXLThOUjNLLVFESDRQLTNDODdGLUpIJWYlVFRXX0VudGVycHJpc2VFdmFsXzguMQ0KM2Y0 YzA1NDYtMzZjNi00NmE4LWEzN2YtYmUxM2NkZDBjZjI1XzdIQkRRLVFOS1ZHLUs0UkJGLUhNQlk2LVlHJWYlOVI2X0VudGVycHJpc2VFdmFsXzEwDQoxZjhk YmZlOC1kZWZhLTQ2NzYtYjVhNi1mNzY5NDlhMDE1NDBfNE44VlQtN1k2ODYtNDNER1YtVEhUVzktTTklZiU4VzdfRW50ZXJwcmlzZU5FdmFsXzEwDQo1N2E0 ZWJiNi04ZTBjLTQxZjgtYjc5ZS04ODcyZGRjOTcxZWZfVzYzR0YtN040RDktR1FIM0stSzRGUDctOUIlZiVUNkNfRW50ZXJwcmlzZVNFdmFsXzIwMTUNCmI0 N2RkMjUwLWZkNmEtNDRjOC05MjE3LTAzYWNhNmU0ODEyZV9ONERNVC1SSktEUS1YUjZINy0zREtLUC0zWSVmJUpXVF9FbnRlcnByaXNlU0V2YWxfMjAxNg0K MjY3YmY4MmQtMDhlOC00MDQ2LWIwNjEtOWVmM2Y4YWMyYjVhX043SE1ILU1LMzZRLU00WDkzLTc2S1EyLTZKJWYlSFdSX0VudGVycHJpc2VTRXZhbF8yMDE5 DQphZmYyNWYxZi1mYjUzLTRlMjctOTVlZi1iOGU1YWNhMTBhYzZfOVY0TkstNjI0WTMtVks0N1ItUTI3R1AtMjclZiVQR0ZfRW50ZXJwcmlzZVNFdmFsXzIw MjENCjM5OWYwNjk3LTg4NmItNDg4MS04OTRjLTRmZjZjNTJlN2Q4Zl9DWVBCMy1YTlY5Vi1RUjRHNC1RM0I4Sy1LUSVmJUZHSl9FbnRlcnByaXNlU0V2YWxf MjAyNA0KNjE2MmU4YzItM2MzMC00NmUxLWI5NjQtMGRlNjAzNDk4ZTJkX1IzNE45LUhKNlEzLUdCWDRGLVEyNEtRLTQ5JWYlREY3X0VudGVycHJpc2VTTkV2 YWxfMjAxNg0KYWVkMTRmYzgtOTA3ZC00NGZiLWEzYTEtZDVkOGU2MzhhY2IzX01ITjlRLVJEOVBXLUJGSERRLTlGVFdRLVdRJWYlUEY4X0VudGVycHJpc2VT TkV2YWxfMjAxOQ0KNWRkMGM4NjktZWFlOS00MGNlLWFmNDgtNzM2NjkyY2Q4ZTQzX1hDTjYyLTI5WDkyLUM0VDhYLVdQODJYLURZJWYlTUo4X0VudGVycHJp c2VTTkV2YWxfMjAyMQ0KNTIyY2MwZGMtM2M3Yi00MjU4LWFlNjgtZjI5N2NhNjNiNjRlX1k4REpNLU5QWEYzLVFHNE1ILVc3V0pLLUtRJWYlRkdNX0VudGVy cHJpc2VTTkV2YWxfMjAyNA0KYWE3MDgzOTctODYxOC00MmRlLWIxMjAtYTQ0MTkwZWY0NTZkX1I2M0RWLTlOUERYLVFWV0pGLUhNUjhWLU00JWYlSzdEX0lv VEVudGVycHJpc2VTRXZhbF8yMDI0DQpjZDI1YjFlOC01ODM5LTRhOTYtYTc2OS1iNmFiZTNhYTVkZWVfNzNCTU4tMzMyRzktRFg2QjgtRkdEVDMtR0YlZiVZ VDZfU2VydmVyRGF0YWNlbnRlckV2YWxfMjAxMg0KZTYyOGM1ZTgtMjMwMC00NDI5LThiODAtYThiMjFiZDdjZTBhX1dQUjk0LUtOM0o3LU1SQjdYLUpQSlY4 LVJYJWYlN0oyX1NlcnZlckRhdGFjZW50ZXJFdmFsXzIwMTJSMg0KMDEzOTgyMzktODVmZi00ODdmLTllOTAtMGUzY2M1YmNjOTJlX1FWVFE5LUdOUkJILUpR OUc3LVc3RkJXLVJYJWYlOVFSX1NlcnZlckRhdGFjZW50ZXJFdmFsXzIwMTYNCjVlYTRhZjllLWZkNTktNDY5MS1iNjFjLTFmYzFmZjNlMzA5ZV9LTlczRy0y MllEMi03UUtRSi0yUkYyWC1INiVmJUY4TV9TZXJ2ZXJEYXRhY2VudGVyRXZhbF8yMDE5DQoxZDAyNzc0ZC02NmFiLTRjNTctOGIxNC1lMjU0ZmRjZTA5ZDRf UEs3Sk4tMjQyMzYtRkg3SlAtVjc5MkYtMzclZiVDWVJfU2VydmVyRGF0YWNlbnRlckV2YWxfMjAyMQ0KOTY3OTRhOTgtMDk3Zi00MmZlLThmMjgtMmMzOGVh MTE1MjI5X000Uk5XLUNSVEhGLVRZN0JHLURESEc2LUoyJWYlVDkyX1NlcnZlckRhdGFjZW50ZXJFdmFsXzIwMjUNCjM4ZDE3MmM3LTM2YjMtNGU0Yi1iNDM1 LWZkMGIwNmI5NWM2ZV9STkZHRC1XRkZRUi1YUThCRy1LN1FRSy1HSiVmJUNQOV9TZXJ2ZXJTdGFuZGFyZEV2YWxfMjAxMg0KNGZjNDVhODgtMjZiNS00Y2Y5 LTllZWYtNzY5ZWUzZjBhMDE2Xzc5TThNLU4zNkJYLThZR0pZLTJHOUtQLTNZJWYlR1BDX1NlcnZlclN0YW5kYXJkRXZhbF8yMDEyUjINCjlkZmE4ZWMwLTc2 NjUtNGI5ZC1iMmNiLWJmYzJkYzM3YzlmNF85UEJLWC00TkhHVC1RV1Y0Qy00SkQ5NC1UViVmJUtRNl9TZXJ2ZXJTdGFuZGFyZEV2YWxfMjAxNg0KNzc4M2Ex MjYtYzEwOC00Y2Y3LWI1OWYtMTNjNzhjN2E3MzM3X0o0V05DLUg5QkczLTZYUlg0LTNYRDhLLVk3JWYlWFJYX1NlcnZlclN0YW5kYXJkRXZhbF8yMDE5DQpj MWExOTdiNi1iYTVlLTQzOTQtYjliZi1iNjU5YTZjMWI4NzNfN1BCSk0tTU5WUEQtTUJRRDctVFlUWTQtVzglZiVKRFlfU2VydmVyU3RhbmRhcmRFdmFsXzIw MjENCjc1M2M1M2EyLTQyNzQtNDMzOS04YzJlLWY2NmMwYjk2NDZjNV9ZUEJWTS1IRk5XUS1DVEY5TS1GUjRSUi03SCVmJTlZR19TZXJ2ZXJTdGFuZGFyZEV2 YWxfMjAyNQ0KMGRlNWZmMzEtMmQ2Mi00OTEyLWIxYTgtM2VhMDFkMjQ2MWZkXzNDS0JOLTNHSjhYLTdZVDRYLUQ4RERDLUQ2JWYlNjlCX1NlcnZlclN0b3Jh Z2VTdGFuZGFyZEV2YWxfMjAxMg0KZmIwOGY1M2EtZTU5Ny00MGRjLTlmMDgtOGJiZjk5ZjE5YjkyX05DSjZKLUoyM1ZSLURCWUIzLVFRQkpGLVc4JWYlQ1A3 X1NlcnZlclN0b3JhZ2VXb3JrZ3JvdXBFdmFsXzIwMTINCikgZG8gKA0KZm9yIC9mICJ0b2tlbnM9MS01IGRlbGltcz1fIiAlJUEgaW4gKCIlJSMiKSBkbyBp ZiAldHNlZGl0aW9uJT09JSVDIGlmIG5vdCBkZWZpbmVkIGtleSAoDQplY2hvICIlYWxsYXBwcyUiIHwgZmluZCAvaSAiJSVBIiAlbnVsMSUgJiYgKA0Kc2V0 IGtleT0lJUINCnNldCBldmFsPTENCmlmIC9pICIlJUUiPT0iTm9BY3QiIHNldCBub2FjdD0xDQplY2hvIENoZWNraW5nIEFjdGl2YXRpb24gSUQgICAgICAg ICAgICAgICAgICBbJSVBXSBbJSVDXQ0KKQ0KKQ0KKQ0KDQppZiBub3QgZGVmaW5lZCBrZXkgKA0Kc2V0IGVycm9yPTENCmNhbGwgOmRrX2NvbG9yICVSZWQl ICJDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgWyV0c2VkaXRpb24lIG5vdCBmb3VuZCBpbiB0aGUgc2NyaXB0XSINCmNhbGwgOmRr X2NvbG9yICVCbHVlJSAiTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgdGhlIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgc2NyaXB0LiINCmdvdG8gOnRzX2VzdQ0K KQ0KDQpzZXQgcmVzZXRzdHVmZj0xDQolcHNjJSAiJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAnOnRzZm9yZ2VcOi4qJzsu IChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKSINCnNldCByZXNldHN0dWZmPQ0KaWYgIWVycm9ybGV2ZWwhPT0zICgNCnNldCBlcnJvcj0xDQpjYWxs IDpka19jb2xvciAlUmVkJSAiUmVzZXR0aW5nIFJlYXJtIC8gR3JhY2VQZXJpb2QgICAgICAgICAgIFtGYWlsZWRdIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUl ICIlX2ZpeG1zZyUiDQpnb3RvIDp0c19lc3UNCikgZWxzZSAoDQplY2hvIFJlc2V0dGluZyBSZWFybSAvIEdyYWNlUGVyaW9kICAgICAgICAgICBbU3VjY2Vz c2Z1bF0NCikNCg0Kc2V0IGdlbmVyaWNrZXk9MQ0KY2FsbCA6ZGtfaW5za2V5ICJbJWtleSVdIg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0NCg0KOnRzX2VzdQ0KDQppZiBub3QgJV9hY3Rlc3UlPT0xIGdvdG8gOnRzX29mZg0KaWYgL2kgJXRzbWV0aG9kJT09S01TNGsg KA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlNraXBwaW5nIFdpbmRvd3MgRVNVICAgICAgICAgICAgICAgICAgICBbS01TNGsgbWV0aG9kIGlzIG5vdCBzdXBw b3J0ZWQgd2l0aCBXaW5kb3dzIEVTVV0iDQppZiAvaSAlX2FjdG1ldGhvZCU9PUF1dG8gKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJDb25uZWN0IHRvIHRo ZSBJbnRlcm5ldCBhbmQgdHJ5IGFnYWluLiBTY3JpcHQgd2lsbCB1c2UgdGhlIFN0YXRpY0NJRCBhY3RpdmF0aW9uIG1ldGhvZC4iDQopIGVsc2UgKA0KY2Fs bCA6ZGtfY29sb3IgJUJsdWUlICJVc2Ugbm9uLUtNUzRLIGFjdGl2YXRpb24gb3B0aW9ucyBmcm9tIHRoZSBwcmV2aW91cyBtZW51LiINCikNCmdvdG8gOnRz X29mZg0KKQ0KDQo6OiAgUHJvY2VzcyBXaW5kb3dzIEVTVQ0KDQplY2hvOg0KZWNobyBQcm9jZXNzaW5nIFdpbmRvd3MgRVNVLi4uDQoNCnNldCBlc3VleGlz dD0NCnNldCBlc3VleGlzdHN1cD0NCnNldCBlc3VlZGl0aW9ubGlzdD0NCnNldCBlc3VleGlzdGJ1dG5vc3VwPQ0KDQppZiAld2luYnVpbGQlIEdUUiAxNDM5 MyBmb3IgJSUjIGluIChFbnRlcnByaXNlUyBJb1RFbnRlcnByaXNlUyBJb1RFbnRlcnByaXNlU0spIGRvIChpZiAvaSAldHNlZGl0aW9uJT09JSUjIHNldCBp c2x0c2M9MSkNCmlmIGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2thZ2VzXE1pY3Jvc29mdC1XaW5kb3dzLVNlcnZlcipFZGl0aW9ufioubXVt IiBzZXQgaXNTZXJ2ZXI9MQ0KDQppZiAvaSAldHNlZGl0aW9uJT09RW1iZWRkZWQgKA0KaWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxTZXJ2aWNpbmdcUGFja2Fn ZXNcV2luRW1iLUJyYW5kaW5nLUVtYmVkZGVkLVRoaW5QQy1QYWNrYWdlKi5tdW0iIHNldCBpc1RoaW5wYz0xDQppZiBleGlzdCAiJVN5c3RlbVJvb3QlXFNl cnZpY2luZ1xQYWNrYWdlc1xXaW5FbWItQnJhbmRpbmctRW1iZWRkZWQtUE9TUmVhZHk3LVBhY2thZ2UqLm11bSIgc2V0IHN1YkVkaXRpb249W1BPU10NCmlm IGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2thZ2VzXFdpbkVtYi1CcmFuZGluZy1FbWJlZGRlZC1TdGFuZGFyZC1QYWNrYWdlKi5tdW0iIHNl dCBzdWJFZGl0aW9uPVtTdGFuZGFyZF0NCikNCmlmIG5vdCBkZWZpbmVkIGFsbGFwcHMgY2FsbCA6ZGtfYWN0aWRzIDU1YzkyNzM0LWQ2ODItNGQ3MS05ODNl LWQ2ZWMzZjE2MDU5Zg0KDQpzZXQgdzEwRXN1RWRpdGlvbnM9RWR1Y2F0aW9uLUVkdWNhdGlvbk4tRW50ZXJwcmlzZS1FbnRlcnByaXNlTi1Qcm9mZXNzaW9u YWwtUHJvZmVzc2lvbmFsRWR1Y2F0aW9uLVByb2Zlc3Npb25hbEVkdWNhdGlvbk4tUHJvZmVzc2lvbmFsTi1Qcm9mZXNzaW9uYWxXb3Jrc3RhdGlvbi1Qcm9m ZXNzaW9uYWxXb3Jrc3RhdGlvbk4NCg0Kc2V0IG1pbmJ1aWxkPTANCmlmIC9pICV0c2VkaXRpb24lPT1TZXJ2ZXJSZHNoIHNldCBtaW5idWlsZD01NTUyDQpm b3IgJSUjIGluIChDb3JlIENvcmVOIENvcmVDb3VudHJ5U3BlY2lmaWMgQ29yZVNpbmdsZUxhbmd1YWdlIElvVEVudGVycHJpc2UpIGRvIChpZiAvaSAldHNl ZGl0aW9uJT09JSUjIHNldCBtaW5idWlsZD02MTU2KQ0KaWYgL2kgJXRzZWRpdGlvbiU9PVBQSVBybyBzZXQgbWluYnVpbGQ9NjM4OA0KDQpzZXQgL2EgVUJS PTANCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgncmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJl bnRWZXJzaW9uIiAvdiBVQlIgJW51bDYlJykgZG8gaWYgbm90IGVycm9ybGV2ZWwgMSBzZXQgL2EgVUJSPSUlYg0KaWYgJXdpbmJ1aWxkJSBFUVUgMTkwNDUg aWYgJW1pbmJ1aWxkJSBHVFIgMCBpZiAlVUJSJSBHRVEgJW1pbmJ1aWxkJSAoDQpzZXQgdzEwRXN1RWRpdGlvbnNMYXRlckFkZGVkPSV0c2VkaXRpb24lLQ0K KQ0KDQppZiBub3QgZGVmaW5lZCBpc1RoaW5wYyBpZiBub3QgZGVmaW5lZCBpc2x0c2MgZm9yICUlIyBpbiAoDQpSRU0gV2luZG93czcNCjQyMjBmNTQ2LWY1 MjItNDZkZi04MjAyLTRkMDdhZmQyNjQ1NF9DbGllbnQtRVNVLVllYXIzWzEtM3ldXy1FbnRlcnByaXNlLUVudGVycHJpc2VFLUVudGVycHJpc2VOLVByb2Zl c3Npb25hbC1Qcm9mZXNzaW9uYWxFLVByb2Zlc3Npb25hbE4tVWx0aW1hdGUtVWx0aW1hdGVFLVVsdGltYXRlTi0NCjdlOTRiZTIzLWIxNjEtNDk1Ni1hNjgy LTE0NmFiMjkxNzc0Y19DbGllbnQtRVNVLVllYXI2WzQtNnldXy1FbnRlcnByaXNlLUVudGVycHJpc2VFLUVudGVycHJpc2VOLVByb2Zlc3Npb25hbC1Qcm9m ZXNzaW9uYWxFLVByb2Zlc3Npb25hbE4tVWx0aW1hdGUtVWx0aW1hdGVFLVVsdGltYXRlTi0NClJFTSBXaW5kb3dzN0VtYmVkZGVkUE9TUmVhZHk3DQo0ZjFm NjQ2Yy0xZTY2LTQ5MDgtYWNjNy1kMTYwNjIyOWIyOWVfUE9TLUVTVS1ZZWFyM1sxLTN5XV8tRW1iZWRkZWRbUE9TXS0NClJFTSBXaW5kb3dzN0VtYmVkZGVk U3RhbmRhcmQNCjZhYWYxYzdkLTUyN2YtNGVkNS1iOTA4LTlmYzAzOWRmYzY1NF9XRVMtRVNVLVllYXIzWzEtM3ldXy1FbWJlZGRlZFtTdGFuZGFyZF0tDQpS RU0gV2luZG93c1NlcnZlcjIwMDgvV2luZG93c1NlcnZlcjIwMDhSMg0KOGU3YmZiMWUtYWNjMS00ZjU2LWFiYWUtYjgwZmNlNTZjZDRiX1NlcnZlci1FU1Ut UEFbMS02eV1fLVNlcnZlckRhdGFjZW50ZXItU2VydmVyRGF0YWNlbnRlckNvcmUtU2VydmVyRGF0YWNlbnRlclYtU2VydmVyRGF0YWNlbnRlclZDb3JlLVNl cnZlclN0YW5kYXJkLVNlcnZlclN0YW5kYXJkQ29yZS1TZXJ2ZXJTdGFuZGFyZFYtU2VydmVyU3RhbmRhcmRWQ29yZS1TZXJ2ZXJFbnRlcnByaXNlLVNlcnZl ckVudGVycHJpc2VDb3JlLVNlcnZlckVudGVycHJpc2VWLVNlcnZlckVudGVycHJpc2VWQ29yZS0NClJFTSBXaW5kb3dzOC4xDQo0YWZjNjIwZi0xMmE0LTQ4 YWQtODAxNS0yYWViZmJkNmU0N2NfQ2xpZW50LUVTVS1ZZWFyM1sxLTN5XV8tRW50ZXJwcmlzZS1FbnRlcnByaXNlTi1Qcm9mZXNzaW9uYWwtUHJvZmVzc2lv bmFsTi0NCjExYmU3MDE5LWEzMDktNDc2My05YTA5LTA5MWQxNzIyZmZlM19DbGllbnQtRkVTLUVTVS1ZZWFyM1sxLTN5XV8tRW1iZWRkZWRJbmR1c3RyeS1F bWJlZGRlZEluZHVzdHJ5RS0NClJFTSBXaW5kb3dzU2VydmVyMjAxMi8yMDEyUjINCjU1YjFkZDJkLTIyMDktNGVhMC1hODA1LTA2Mjk4YmFkMjViM19TZXJ2 ZXItRVNVLVllYXIzWzEtM3ldXy1TZXJ2ZXJEYXRhY2VudGVyLVNlcnZlckRhdGFjZW50ZXJDb3JlLVNlcnZlckRhdGFjZW50ZXJWLVNlcnZlckRhdGFjZW50 ZXJWQ29yZS1TZXJ2ZXJTdGFuZGFyZC1TZXJ2ZXJTdGFuZGFyZENvcmUtU2VydmVyU3RhbmRhcmRWLVNlcnZlclN0YW5kYXJkVkNvcmUtDQoxYjYwMjg0YS02 M2I1LTQyZGEtOGVjOS1lYWFiODI1ZTJiYzhfU2VydmVyLUVTVS1ZZWFyNVs0LTV5XV8tU2VydmVyRGF0YWNlbnRlci1TZXJ2ZXJEYXRhY2VudGVyQ29yZS1T ZXJ2ZXJEYXRhY2VudGVyVi1TZXJ2ZXJEYXRhY2VudGVyVkNvcmUtU2VydmVyU3RhbmRhcmQtU2VydmVyU3RhbmRhcmRDb3JlLVNlcnZlclN0YW5kYXJkVi1T ZXJ2ZXJTdGFuZGFyZFZDb3JlLQ0KUkVNIFdpbmRvd3MxMA0KZjUyMGU0NWUtNzQxMy00YTM0LWE0OTctZDI3NjU5NjdkMDk0X0NsaWVudC1FU1UtWWVhcjFf LSV3MTBFc3VFZGl0aW9ucyUtJXcxMEVzdUVkaXRpb25zTGF0ZXJBZGRlZCUNCjEwNDNhZGQ1LTIzYjEtNGFmYi05YTBmLTY0MzQzYzhmM2Y4ZF9DbGllbnQt RVNVLVllYXIyXy0ldzEwRXN1RWRpdGlvbnMlLSV3MTBFc3VFZGl0aW9uc0xhdGVyQWRkZWQlDQo4M2Q0OTk4Ni1hZGQzLTQxZDctYmEzMy04N2M3YmZiNWMw ZmJfQ2xpZW50LUVTVS1ZZWFyM18tJXcxMEVzdUVkaXRpb25zJS0ldzEwRXN1RWRpdGlvbnNMYXRlckFkZGVkJQ0KMGI1MzNiNWUtMDhiNi00NGY5LWI4ODUt YzJkZTI5MWJhNDU2X0NsaWVudC1FU1UtWWVhcjZbNC02eV1fLSV3MTBFc3VFZGl0aW9ucyUtJXcxMEVzdUVkaXRpb25zTGF0ZXJBZGRlZCUNClJFTSBXaW5k b3dzU2VydmVyMjAxNg0KOTFiY2FjMGEtZDdkMy00ZDJiLWJkMGMtNzJmZWQ2NzVmMDFiX1NlcnZlci1FU1UtWWVhcjNbMS0zeV1fLVNlcnZlckRhdGFjZW50 ZXItU2VydmVyRGF0YWNlbnRlckNvcmUtU2VydmVyRGF0YWNlbnRlclYtU2VydmVyRGF0YWNlbnRlclZDb3JlLVNlcnZlclN0YW5kYXJkLVNlcnZlclN0YW5k YXJkQ29yZS1TZXJ2ZXJTdGFuZGFyZFYtU2VydmVyU3RhbmRhcmRWQ29yZS0NCjRjZDBhYjMwLTczYTQtNGRkZS05NzJjLTUxMmYwNWJlMzFkZl9TZXJ2ZXIt RVNVLVllYXI2WzQtNnldXy1TZXJ2ZXJEYXRhY2VudGVyLVNlcnZlckRhdGFjZW50ZXJDb3JlLVNlcnZlckRhdGFjZW50ZXJWLVNlcnZlckRhdGFjZW50ZXJW Q29yZS1TZXJ2ZXJTdGFuZGFyZC1TZXJ2ZXJTdGFuZGFyZENvcmUtU2VydmVyU3RhbmRhcmRWLVNlcnZlclN0YW5kYXJkVkNvcmUtDQpSRU0gV2luZG93czEw TFRTQjIwMTYNCmYyNTcxNzEwLTJjMjQtNDY3Ny04ZmI1LWEwN2Q0MWQzYzFhYV9DbGllbnQtRVNVLVllYXIzWzEtM3ldXy1FbnRlcnByaXNlUy1FbnRlcnBy aXNlU04tDQoyMmJhZGZlNi03ZDU1LTQ0ODUtODc0Yi03ZWMzMTc0NDIxMzRfQ2xpZW50LUVTVS1ZZWFyNls0LTZ5XV8tRW50ZXJwcmlzZVMtRW50ZXJwcmlz ZVNOLQ0KKSBkbyAoDQpmb3IgL2YgInRva2Vucz0xLTMgZGVsaW1zPV8iICUlQSBpbiAoIiUlIyIpIGRvICgNCmVjaG8gIiVhbGxhcHBzJSIgfCBmaW5kIC9p ICIlJUEiICVudWwxJSAmJiAoDQpzZXQgZXN1ZXhpc3Q9MQ0KZWNobyAiJSVDIiB8IGZpbmQgL2kgIi0ldHNlZGl0aW9uJSVzdWJFZGl0aW9uJS0iICVudWwx JSAmJiAoDQpzZXQgZXN1ZXhpc3RzdXA9MQ0Kc2V0IGVzdWVkaXRpb25saXN0PQ0Kc2V0IGVzdWV4aXN0YnV0bm9zdXA9DQpzZXQgdHNpZHM9IXRzaWRzISAl JUENCmVjaG8gQ2hlY2tpbmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAgICAgIFslJUFdIFslJUJdDQopIHx8ICgNCmlmIG5vdCBkZWZpbmVkIGVzdWVk aXRpb25saXN0IHNldCBlc3VlZGl0aW9ubGlzdD0lJUMNCnNldCBlc3VleGlzdGJ1dG5vc3VwPTENCikNCikNCikNCikNCg0KaWYgZGVmaW5lZCBlc3VleGlz dHN1cCBpZiBkZWZpbmVkIF92aXMgKA0Kc2V0IGtleT05RlBWNy1NV0dUOC03WFBERi1KQzIzVy1XVDdUVw0KUkVNIFRoaXMgaXMgYSBub24tZ2VuZXJpYyBi bG9ja2VkIE1BSyBrZXkgZm9yIFNlcnZlci1FU1UtUEENCmNhbGwgOmRrX2luc2tleSAiWyFrZXkhXSINCmdvdG8gOnRzX29mZg0KKQ0KDQppZiBkZWZpbmVk IGVzdWV4aXN0c3VwICgNCmVjaG8gIiV0c2lkcyUiIHwgZmluZCAvaSAiNDIyMGY1NDYtZjUyMi00NmRmLTgyMDItNGQwN2FmZDI2NDU0IiAlbnVsMSUgJiYg KA0KZWNobyAiJXRzaWRzJSIgfCBmaW5kIC9pICI3ZTk0YmUyMy1iMTYxLTQ5NTYtYTY4Mi0xNDZhYjI5MTc3NGMiICVudWwxJSB8fCAoDQpjYWxsIDpka19j b2xvciAlR3JheSUgIlRvIGdldCBDbGllbnQtRVNVLVllYXI2WzQtNnldIGxpY2Vuc2UsIGluc3RhbGwgdXBkYXRlcyBmcm9tIHRoZSBiZWxvdyBVUkwuIg0K Y2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlbWFzJXRzZm9yZ2Ujd2luZG93cy1lc3UiDQopDQopDQpnb3RvIDp0c19vZmYNCikNCg0KaWYgZGVmaW5lZCBpc2x0 c2MgKA0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgWyV0c2VkaXRpb24lIExUU0MgYWxy ZWFkeSBoYXMgbG9uZ2VyIHN1cHBvcnQsIEVTVSBpcyBub3QgYXBwbGljYWJsZV0iDQpnb3RvIDp0c19vZmYNCikNCg0KaWYgZGVmaW5lZCBlc3VleGlzdGJ1 dG5vc3VwICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgW0N1cnJlbnRseSBpbnN0YWxs ZWQgRVNVIExpY2Vuc2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgJXRzZWRpdGlvbiVdIg0KZWNobzoNCmlmICV3aW5idWlsZCUgRVFVIDE5MDQ1IGlmIG5vdCBk ZWZpbmVkIHcxMEVzdUVkaXRpb25zTGF0ZXJBZGRlZCAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlRvIGdldCBsYXRlc3QgdmVyc2lvbiwgZ28gdG8gV2lu ZG93cyBzZXR0aW5ncyBhbmQgcnVuIFdpbmRvd3MgVXBkYXRlLiBBZnRlciB0aGF0LCB0cnkgdGhlIHNjcmlwdCBhZ2Fpbi4iDQpnb3RvIDp0c19vZmYNCikN CmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiR28gYmFjayB0byBNYWluIE1lbnUsIHNlbGVjdCBDaGFuZ2UgV2luZG93cyBFZGl0aW9uIG9wdGlvbiBhbmQgY2hh bmdlIHRvIGFueSBvZiB0aGUgYmVsb3cgbGlzdGVkIGVkaXRpb25zLiINCmVjaG8gWyVlc3VlZGl0aW9ubGlzdCVdDQpnb3RvIDp0c19vZmYNCikNCg0Kc2V0 IGVzdWF2YWlsPQ0KaWYgZGVmaW5lZCBfdmlzIGlmIGRlZmluZWQgaXNTZXJ2ZXIgc2V0IGVzdWF2YWlsPTENCmlmICV3aW5idWlsZCUgTEVRIDc2MDIgaWYg bm90IGRlZmluZWQgX3ZpcyBpZiBub3QgZGVmaW5lZCBpc1RoaW5wYyBzZXQgZXN1YXZhaWw9MQ0KaWYgJXdpbmJ1aWxkJSBHVFIgNzYwMiBpZiAld2luYnVp bGQlIExFUSAxNDM5MyBpZiBkZWZpbmVkIGlzU2VydmVyIHNldCBlc3VhdmFpbD0xDQppZiAld2luYnVpbGQlIEdFUSAxMDI0MCBpZiAld2luYnVpbGQlIExF USAxOTA0NSBpZiBub3QgZGVmaW5lZCBpc1NlcnZlciBzZXQgZXN1YXZhaWw9MQ0KaWYgJXdpbmJ1aWxkJSBFUVUgOTYwMCBzZXQgZXN1YXZhaWw9MQ0KDQpp ZiBkZWZpbmVkIGVzdWF2YWlsICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgW0VTVSBs aWNlbnNlIGlzIG5vdCBmb3VuZCwgbWFrZSBzdXJlIFdpbmRvd3MgaXMgZnVsbHkgdXBkYXRlZF0iDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRzZm9yZ2Uj d2luZG93cy1lc3UNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0c2Zv cmdlI3dpbmRvd3MtZXN1Ig0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiQ2hlY2tpbmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAgICAg IFtFU1UgaXMgbm90IGF2YWlsYWJsZSBmb3IgJXdpbm9zJV0iDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KDQo6dHNfb2ZmDQoNCmlmIG5vdCAlX2FjdG9mZiU9PTEgZ290byA6dHNfYWN0DQoNCmlmICV3aW5idWlsZCUgTFNTIDkyMDAgKA0KZWNobzoNCmNhbGwg OmRrX2NvbG9yICVHcmF5JSAiQ2hlY2tpbmcgU3VwcG9ydGVkIE9mZmljZSAgICAgICAgICAgICAgIFtUU2ZvcmdlIGZvciBPZmZpY2UgaXMgc3VwcG9ydGVk IG9uIFdpbmRvd3MgOCBhbmQgbGF0ZXIgdmVyc2lvbnNdIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJPbiBXaW5kb3dzIFZpc3RhIC8gNywgdXNlIE9ob29r IGFjdGl2YXRpb24gb3B0aW9uIGZvciBPZmZpY2UgaW5zdGVhZC4iDQpnb3RvIDp0c19hY3QNCikNCg0KOjogIENoZWNrIG9ob29rIGluc3RhbGwNCg0Kc2V0 IG9ob29rPQ0KZm9yICUlIyBpbiAoMTUgMTYpIGRvICgNCmZvciAlJUEgaW4gKCIlUHJvZ3JhbUZpbGVzJSIgIiVQcm9ncmFtVzY0MzIlIiAiJVByb2dyYW1G aWxlcyh4ODYpJSIpIGRvICgNCmlmIGV4aXN0ICIlJX5BXE1pY3Jvc29mdCBPZmZpY2VcT2ZmaWNlJSUjXHNwcGMqZGxsIiBzZXQgb2hvb2s9MQ0KKQ0KKQ0K DQpmb3IgJSUjIGluIChTeXN0ZW0gU3lzdGVtWDg2KSBkbyAoDQpmb3IgJSVHIGluICgiT2ZmaWNlIDE1IiAiT2ZmaWNlIikgZG8gKA0KZm9yICUlQSBpbiAo IiVQcm9ncmFtRmlsZXMlIiAiJVByb2dyYW1XNjQzMiUiICIlUHJvZ3JhbUZpbGVzKHg4NiklIikgZG8gKA0KaWYgZXhpc3QgIiUlfkFcTWljcm9zb2Z0ICUl fkdccm9vdFx2ZnNcJSUjXHNwcGMqZGxsIiBzZXQgb2hvb2s9MQ0KKQ0KKQ0KKQ0KDQppZiBkZWZpbmVkIG9ob29rICgNCmVjaG86DQpjYWxsIDpka19jb2xv ciAlR3JheSUgIkNoZWNraW5nIE9ob29rICAgICAgICAgICAgICAgICAgICAgICAgICBbT2hvb2sgYWN0aXZhdGlvbiBpcyBhbHJlYWR5IGluc3RhbGxlZCBm b3IgT2ZmaWNlXSINCikNCg0KOjogIENoZWNrIHVuc3VwcG9ydGVkIG9mZmljZSB2ZXJzaW9ucw0KDQpzZXQgbzE0bXNpPQ0Kc2V0IG8xNGMycj0NCg0Kc2V0 IF82OD1IS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2UNCnNldCBfODY9SEtMTVxTT0ZUV0FSRVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcT2ZmaWNlDQpm b3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV84NiVcMTQuMFxDb21tb25cSW5zdGFsbFJvb3QgL3YgUGF0aCIgJW51bDYl JykgZG8gaWYgZXhpc3QgIiUlYlwqUGlja2VyLmRsbCIgKHNldCBvMTRtc2k9T2ZmaWNlIDIwMTAgTVNJICkNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIg JSVhIGluICgnInJlZyBxdWVyeSAlXzY4JVwxNC4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNr ZXIuZGxsIiAoc2V0IG8xNG1zaT1PZmZpY2UgMjAxMCBNU0kgKQ0KJW51bCUgcmVnIHF1ZXJ5ICVfNjglXDE0LjBcQ1ZIIC9mIENsaWNrMnJ1biAvayAgICAg ICAgICYmIHNldCBvMTRjMnI9T2ZmaWNlIDIwMTAgQzJSIA0KJW51bCUgcmVnIHF1ZXJ5ICVfODYlXDE0LjBcQ1ZIIC9mIENsaWNrMnJ1biAvayAgICAgICAg ICYmIHNldCBvMTRjMnI9T2ZmaWNlIDIwMTAgQzJSIA0KDQppZiBub3QgIiVvMTRtc2klJW8xNGMyciUiPT0iIiAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3Ig JVJlZCUgIkNoZWNraW5nIFVuc3VwcG9ydGVkIE9mZmljZSBJbnN0YWxsICAgICBbICVvMTRtc2klJW8xNGMyciVdIg0KaWYgZGVmaW5lZCBvMTRtc2kgY2Fs bCA6ZGtfY29sb3IgJUJsdWUlICJVc2UgT2hvb2sgYWN0aXZhdGlvbiBvcHRpb24gZm9yIE9mZmljZSAyMDEwLiINCikNCg0KaWYgJXdpbmJ1aWxkJSBHRVEg MTAyNDAgJXBzYyUgIkdldC1BcHB4UGFja2FnZSAtbmFtZSAiTWljcm9zb2Z0Lk1pY3Jvc29mdE9mZmljZUh1YiIiIHwgZmluZCAvaSAiT2ZmaWNlIiAlbnVs MSUgJiYgKA0Kc2V0IG9odWI9MQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIHN1 cHBvcnRlZCBvZmZpY2UgdmVyc2lvbnMNCg0KY2FsbCA6dHNfZ2V0cGF0aA0KDQpzZXQgbzE2dXdwPQ0Kc2V0IG8xNnV3cF9wYXRoPQ0KDQppZiAld2luYnVp bGQlIEdFUSAxMDI0MCAoDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIoR2V0LUFwcHhQYWNrYWdlIC1uYW1lICdNaWNyb3NvZnQuT2ZmaWNl LkRlc2t0b3AnIHwgU2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgSW5zdGFsbExvY2F0aW9uKSIgJW51bDYlJykgZG8gKGlmIGV4aXN0ICIlJWFcSW50 ZWdyYXRpb25cSW50ZWdyYXRvci5leGUiIChzZXQgbzE2dXdwPTEmc2V0ICJvMTZ1d3BfcGF0aD0lJWEiKSkNCikNCg0Kc2MgcXVlcnkgQ2xpY2tUb1J1blN2 YyAlbnVsJQ0Kc2V0IGVycm9yMT0lZXJyb3JsZXZlbCUNCg0KaWYgZGVmaW5lZCBvMTZjMnIgaWYgJWVycm9yMSUgRVFVIDEwNjAgKA0KZWNobzoNCmNhbGwg OmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBDbGlja1RvUnVuIFNlcnZpY2UgICAgICAgICAgICAgW05vdCBmb3VuZCwgT2ZmaWNlIDE2LjAgZmlsZXMgZm91 bmRdIg0Kc2V0IG8xNmMycj0NCnNldCBlcnJvcj0xDQopDQoNCnNjIHF1ZXJ5IE9mZmljZVN2YyAlbnVsJQ0Kc2V0IGVycm9yMj0lZXJyb3JsZXZlbCUNCg0K aWYgZGVmaW5lZCBvMTVjMnIgaWYgJWVycm9yMSUgRVFVIDEwNjAgaWYgJWVycm9yMiUgRVFVIDEwNjAgKA0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVSZWQl ICJDaGVja2luZyBDbGlja1RvUnVuIFNlcnZpY2UgICAgICAgICAgICAgW05vdCBmb3VuZCwgT2ZmaWNlIDE1LjAgZmlsZXMgZm91bmRdIg0Kc2V0IG8xNWMy cj0NCnNldCBlcnJvcj0xDQopDQoNCmlmICIlbzE2dXdwJSVvMTZjMnIlJW8xNWMyciUlbzE2bXNpJSVvMTVtc2klIj09IiIgKA0Kc2V0IGVycm9yPTENCnNl dCBzaG93Zml4PTENCmVjaG86DQppZiBub3QgIiVvMTRtc2klJW8xNGMyciUiPT0iIiAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgU3VwcG9y dGVkIE9mZmljZSBJbnN0YWxsICAgICAgIFtOb3QgRm91bmRdIg0KKSBlbHNlICgNCmlmICVfYWN0d2luJT09MCAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAi Q2hlY2tpbmcgSW5zdGFsbGVkIE9mZmljZSAgICAgICAgICAgICAgIFtOb3QgRm91bmRdIg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiQ2hl Y2tpbmcgSW5zdGFsbGVkIE9mZmljZSAgICAgICAgICAgICAgIFtOb3QgRm91bmRdIg0KKQ0KKQ0KDQppZiBkZWZpbmVkIG9odWIgKA0KZWNobzoNCmVjaG8g WW91IG9ubHkgaGF2ZSB0aGUgT2ZmaWNlIERhc2hib2FyZCBhcHAgaW5zdGFsbGVkOyB5b3UgbmVlZCB0byBpbnN0YWxsIHRoZSBmdWxsIHZlcnNpb24gb2Yg T2ZmaWNlLg0KKQ0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJEb3dubG9hZCBhbmQgaW5zdGFsbCBPZmZpY2UgZnJvbSB0aGUgVVJMIGJlbG93LCB0aGVuIHRy eSBhZ2Fpbi4iDQppZiAlX2FjdHdpbiU9PTAgc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVnZW51aW5lLWluc3RhbGxhdGlvbi1tZWRpYQ0KY2FsbCA6ZGtfY29s b3IgJV9ZZWxsb3clICIlbWFzJWdlbnVpbmUtaW5zdGFsbGF0aW9uLW1lZGlhIg0KZ290byA6dHNfYWN0DQopDQoNCnNldCBtdWx0aW9mZmljZT0NCmlmIG5v dCAiJW8xNnV3cCUlbzE2YzJyJSVvMTVjMnIlJW8xNm1zaSUlbzE1bXNpJSI9PSIxIiBzZXQgbXVsdGlvZmZpY2U9MQ0KaWYgbm90ICIlbzE0YzJyJSVvMTRt c2klIj09IiIgc2V0IG11bHRpb2ZmaWNlPTENCg0KaWYgZGVmaW5lZCBtdWx0aW9mZmljZSAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVj a2luZyBNdWx0aXBsZSBPZmZpY2UgSW5zdGFsbCAgICAgICAgW0ZvdW5kLiBSZWNvbW1lbmRlZCB0byBpbnN0YWxsIG9uZSB2ZXJzaW9uIG9ubHldIg0KKQ0K DQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIFdpbmRvd3MgU2VydmVyDQoNCnNldCB3aW5z ZXJ2ZXI9DQpyZWcgcXVlcnkgIkhLTE1cU1lTVEVNXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcUHJvZHVjdE9wdGlvbnMiIC92IFByb2R1Y3RUeXBlICVu dWwyJSB8IGZpbmQgL2kgIldpbk5UIiAlbnVsMSUgfHwgc2V0IHdpbnNlcnZlcj0xDQppZiBub3QgZGVmaW5lZCB3aW5zZXJ2ZXIgKA0KcmVnIHF1ZXJ5ICJI S0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uIiAvdiBFZGl0aW9uSUQgJW51bDIlIHwgZmluZCAvaSAiU2VydmVyIiAl bnVsMSUgJiYgc2V0IHdpbnNlcnZlcj0xDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgUHJv Y2VzcyBPZmZpY2UgVVdQDQoNCmlmIG5vdCBkZWZpbmVkIG8xNnV3cCBnb3RvIDp0c19zdGFydG8xNWMycg0KDQpjYWxsIDp0c19yZXNldA0KY2FsbCA6ZGtf YWN0aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KDQpzZXQgb1Zlcj0xNg0Kc2V0ICJfb0xQYXRoPSVvMTZ1d3BfcGF0aCVcTGlj ZW5zZXMxNiINCnNldCAicGtleXBhdGg9JW8xNnV3cF9wYXRoJVxPZmZpY2UxNlxwa2V5Y29uZmlnLW9mZmljZS54cm0tbXMiDQpmb3IgL2YgImRlbGltcz0i ICUlYSBpbiAoJyVwc2MlICIoR2V0LUFwcHhQYWNrYWdlIC1uYW1lICdNaWNyb3NvZnQuT2ZmaWNlLkRlc2t0b3AnIHwgU2VsZWN0LU9iamVjdCAtRXhwYW5k UHJvcGVydHkgRGVwZW5kZW5jaWVzKSB8IFNlbGVjdC1PYmplY3QgUGFja2FnZUZ1bGxOYW1lIiAlbnVsNiUnKSBkbyAoc2V0ICJvMTZ1d3BhcHBsaXN0PSFv MTZ1d3BhcHBsaXN0ISAlJWEiKQ0KDQplY2hvICIlbzE2dXdwYXBwbGlzdCUiIHwgZmluZHN0ciAvaSAiQWNjZXNzIEV4Y2VsIE9uZU5vdGUgT3V0bG9vayBQ b3dlclBvaW50IFB1Ymxpc2hlciBTa3lwZUZvckJ1c2luZXNzIFdvcmQiICVudWwlICYmIHNldCAiX29JZHM9TzM2NUhvbWVQcmVtUmV0YWlsIg0KDQpmb3Ig JSUjIGluIChQcm9qZWN0IFZpc2lvKSBkbyAoDQplY2hvICIlbzE2dXdwYXBwbGlzdCUiIHwgZmluZHN0ciAvaSAiJSUjIiAlbnVsJSAmJiAoDQpzZXQgX2xh dD0NCmlmIGV4aXN0ICIlX29MUGF0aCVcJSUjUHJvMjAyNFZMKi54cm0tbXMiIHNldCAiX29JZHM9ICFfb0lkcyEgJSUjUHJvMjAyNFJldGFpbCAiICYgc2V0 IF9sYXQ9MQ0KaWYgbm90IGRlZmluZWQgX2xhdCBpZiBleGlzdCAiJV9vTFBhdGglXCUlI1BybzIwMjFWTCoueHJtLW1zIiBzZXQgIl9vSWRzPSAhX29JZHMh ICUlI1BybzIwMjFSZXRhaWwgIiAmIHNldCBfbGF0PTENCmlmIG5vdCBkZWZpbmVkIF9sYXQgaWYgZXhpc3QgIiVfb0xQYXRoJVwlJSNQcm8yMDE5VkwqLnhy bS1tcyIgc2V0ICJfb0lkcz0gIV9vSWRzISAlJSNQcm8yMDE5UmV0YWlsICIgJiBzZXQgX2xhdD0xDQppZiBub3QgZGVmaW5lZCBfbGF0IHNldCAiX29JZHM9 ICFfb0lkcyEgJSUjUHJvUmV0YWlsICINCikNCikNCg0Kc2V0IHV3cGluZm89JW8xNnV3cF9wYXRoOkM6XFByb2dyYW0gRmlsZXNcV2luZG93c0FwcHNcTWlj cm9zb2Z0Lk9mZmljZS5EZXNrdG9wXz0lDQoNCmVjaG86DQplY2hvIFByb2Nlc3NpbmcgT2ZmaWNlLi4uICAgICAgICAgICAgICAgICAgICBbVVdQIF58ICV1 d3BpbmZvJV0NCg0KaWYgbm90IGRlZmluZWQgX29JZHMgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEluc3RhbGxlZCBQcm9kdWN0cyAgICAg ICAgICAgICBbUHJvZHVjdCBJRHMgbm90IGZvdW5kLiBBYm9ydGluZyBhY3RpdmF0aW9uLi4uXSINCnNldCBlcnJvcj0xDQpnb3RvIDp0c19zdGFydG8xNWMy cg0KKQ0KDQpjYWxsIDp0c19wcm9jZXNzDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6dHNfc3RhcnRv MTVjMnINCg0KOjogIFByb2Nlc3MgT2ZmaWNlIDE1LjAgQzJSDQoNCmlmIG5vdCBkZWZpbmVkIG8xNWMyciBnb3RvIDp0c19zdGFydG8xNmMycg0KDQpjYWxs IDp0c19yZXNldA0KY2FsbCA6ZGtfYWN0aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KDQpzZXQgb1Zlcj0xNQ0KZm9yIC9mICJz a2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJSAvdiBJbnN0YWxsUGF0aCIgJW51bDYlJykgZG8gKHNldCAiX29Sb290 PSUlYlxyb290IikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE1YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBQ bGF0Zm9ybSIgJW51bDYlJykgZG8gKHNldCAiX29BcmNoPSUlYiIpDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8x NWMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgVmVyc2lvblRvUmVwb3J0IiAlbnVsNiUnKSBkbyAoc2V0ICJfdmVyc2lvbj0lJWIiKQ0KZm9yIC9mICJza2lw PTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFByb2R1Y3RSZWxlYXNlSWRzIiAlbnVsNiUn KSBkbyAoc2V0ICJfcHJpZHM9JW8xNWMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUHJvZHVjdFJlbGVhc2VJZHMiICYgc2V0ICJfY29uZmlnPSVvMTVjMnJf cmVnJVxDb25maWd1cmF0aW9uIikNCmlmIG5vdCBkZWZpbmVkIF9vQXJjaCAgIGZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVy eSAlbzE1YzJyX3JlZyVccHJvcGVydHlCYWcgL3YgUGxhdGZvcm0iICVudWw2JScpIGRvIChzZXQgIl9vQXJjaD0lJWIiKQ0KaWYgbm90IGRlZmluZWQgX3Zl cnNpb24gZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJVxwcm9wZXJ0eUJhZyAvdiB2ZXJzaW9uIiAl bnVsNiUnKSBkbyAoc2V0ICJfdmVyc2lvbj0lJWIiKQ0KaWYgbm90IGRlZmluZWQgX3ByaWRzICAgZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4g KCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJVxwcm9wZXJ0eUJhZyAvdiBQcm9kdWN0UmVsZWFzZUlkIiAlbnVsNiUnKSBkbyAoc2V0ICJfcHJpZHM9JW8xNWMy cl9yZWclXHByb3BlcnR5QmFnIC92IFByb2R1Y3RSZWxlYXNlSWQiICYgc2V0ICJfY29uZmlnPSVvMTVjMnJfcmVnJVxwcm9wZXJ0eUJhZyIpDQoNCmVjaG8g IiVvMTVjMnJfcmVnJSIgfCBmaW5kIC9pICJXb3c2NDMyTm9kZSIgJW51bDElICYmIChzZXQgX3Rvaz0xMCkgfHwgKHNldCBfdG9rPTkpDQpmb3IgL2YgInRv a2Vucz0lX3RvayUgZGVsaW1zPVwiICUlYSBpbiAoJ3JlZyBxdWVyeSAlbzE1YzJyX3JlZyVcUHJvZHVjdFJlbGVhc2VJRHNcQWN0aXZlICVudWw2JSBefCBm aW5kc3RyIC9pICJSZXRhaWwgVm9sdW1lIicpIGRvICgNCmVjaG8gIiFfb0lkcyEiIHwgZmluZCAvaSAiICUlYSAiICVudWwxJSB8fCAoc2V0ICJfb0lkcz0g IV9vSWRzISAlJWEgIikNCikNCg0Kc2V0ICJfb0xQYXRoPSVfb1Jvb3QlXExpY2Vuc2VzIg0Kc2V0ICJwa2V5cGF0aD0lX29Sb290JVxPZmZpY2UxNVxwa2V5 Y29uZmlnLW9mZmljZS54cm0tbXMiDQpzZXQgIl9vSW50ZWdyYXRvcj0lX29Sb290JVxpbnRlZ3JhdGlvblxpbnRlZ3JhdG9yLmV4ZSINCg0KZWNobzoNCmVj aG8gUHJvY2Vzc2luZyBPZmZpY2UuLi4gICAgICAgICAgICAgICAgICAgIFtDMlIgXnwgJV92ZXJzaW9uJSBefCAlX29BcmNoJV0NCg0KaWYgbm90IGRlZmlu ZWQgX29JZHMgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEluc3RhbGxlZCBQcm9kdWN0cyAgICAgICAgICAgICBbUHJvZHVjdCBJRHMgbm90 IGZvdW5kLiBBYm9ydGluZyBhY3RpdmF0aW9uLi4uXSINCnNldCBlcnJvcj0xDQpnb3RvIDp0c19zdGFydG8xNmMycg0KKQ0KDQpjYWxsIDpvaF9leHBpcmVk cHJldmlldyAyMDEzDQppZiAiJV9hY3Rwcm9qdmlzJSI9PSIwIiBjYWxsIDpvaF9maXhwcmlkcw0KY2FsbCA6dHNfcHJvY2Vzcw0KDQo6Oj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnRzX3N0YXJ0bzE2YzJyDQoNCjo6ICBQcm9jZXNzIE9mZmljZSAxNi4wIEMyUg0KDQpp ZiBub3QgZGVmaW5lZCBvMTZjMnIgZ290byA6dHNfc3RhcnRtc2kNCg0KY2FsbCA6dHNfcmVzZXQNCmNhbGwgOmRrX2FjdGlkcyAwZmYxY2UxNS1hOTg5LTQ3 OWQtYWY0Ni1mMjc1YzYzNzA2NjMNCg0Kc2V0IG9WZXI9MTYNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJy X3JlZyUgL3YgSW5zdGFsbFBhdGgiICVudWw2JScpIGRvIChzZXQgIl9vUm9vdD0lJWJccm9vdCIpDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBp biAoJyJyZWcgcXVlcnkgJW8xNmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUGxhdGZvcm0iICVudWw2JScpIGRvIChzZXQgIl9vQXJjaD0lJWIiKQ0KZm9y IC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFZlcnNpb25Ub1JlcG9ydCIg JW51bDYlJykgZG8gKHNldCAiX3ZlcnNpb249JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3Jl ZyVcQ29uZmlndXJhdGlvbiAvdiBBdWRpZW5jZURhdGEiICVudWw2JScpIGRvIChzZXQgIl9BdWRpZW5jZURhdGE9XnwgJSViICIpDQpmb3IgL2YgInNraXA9 MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8xNmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUHJvZHVjdFJlbGVhc2VJZHMiICVudWw2JScp IGRvIChzZXQgIl9wcmlkcz0lbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBQcm9kdWN0UmVsZWFzZUlkcyIgJiBzZXQgIl9jb25maWc9JW8xNmMycl9y ZWclXENvbmZpZ3VyYXRpb24iKQ0KDQplY2hvICIlbzE2YzJyX3JlZyUiIHwgZmluZCAvaSAiV293NjQzMk5vZGUiICVudWwxJSAmJiAoc2V0IF90b2s9OSkg fHwgKHNldCBfdG9rPTgpDQpmb3IgL2YgInRva2Vucz0lX3RvayUgZGVsaW1zPVwiICUlYSBpbiAoJ3JlZyBxdWVyeSAiJW8xNmMycl9yZWclXFByb2R1Y3RS ZWxlYXNlSURzIiAvcyAvZiAiLjE2IiAvayAlbnVsNiUgXnwgZmluZHN0ciAvaSAiUmV0YWlsIFZvbHVtZSInKSBkbyAoDQplY2hvICIhX29JZHMhIiB8IGZp bmQgL2kgIiAlJWEgIiAlbnVsMSUgfHwgKHNldCAiX29JZHM9ICFfb0lkcyEgJSVhICIpDQopDQpzZXQgX29JZHM9JV9vSWRzOi4xNj0lDQpzZXQgX28xNmMy cklkcz0lX29JZHMlDQoNCnNldCAiX29MUGF0aD0lX29Sb290JVxMaWNlbnNlczE2Ig0Kc2V0ICJwa2V5cGF0aD0lX29Sb290JVxPZmZpY2UxNlxwa2V5Y29u ZmlnLW9mZmljZS54cm0tbXMiDQpzZXQgIl9vSW50ZWdyYXRvcj0lX29Sb290JVxpbnRlZ3JhdGlvblxpbnRlZ3JhdG9yLmV4ZSINCg0KZWNobzoNCmVjaG8g UHJvY2Vzc2luZyBPZmZpY2UuLi4gICAgICAgICAgICAgICAgICAgIFtDMlIgXnwgJV92ZXJzaW9uJSAlX0F1ZGllbmNlRGF0YSVefCAlX29BcmNoJV0NCg0K aWYgbm90IGRlZmluZWQgX29JZHMgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEluc3RhbGxlZCBQcm9kdWN0cyAgICAgICAgICAgICBbUHJv ZHVjdCBJRHMgbm90IGZvdW5kLiBBYm9ydGluZyBhY3RpdmF0aW9uLi4uXSINCnNldCBlcnJvcj0xDQpnb3RvIDp0c19zdGFydG1zaQ0KKQ0KDQpjYWxsIDpv aF9leHBpcmVkcHJldmlldyAyMDE2IDIwMTkgMjAyMSAyMDI0DQppZiAiJV9hY3Rwcm9qdmlzJSI9PSIwIiBjYWxsIDpvaF9maXhwcmlkcw0KY2FsbCA6dHNf cHJvY2Vzcw0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIG1hc3N7fWdyYXZle2RvdH1kZXYvb2Zm aWNlLWxpY2Vuc2UtaXMtbm90LWdlbnVpbmUNCjo6ICBBZGQgcmVnaXN0cnkga2V5cyBmb3Igdm9sdW1lIHByb2R1Y3RzIHNvIHRoYXQgJ25vbi1nZW51aW5l JyBiYW5uZXIgd29uJ3QgYXBwZWFyIA0KDQpzZXQgImttc2tleT1IS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNv ZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2MyINCmlmIC9pICV0c21ldGhvZCU9PUtNUzRrICgN CmlmICV3aW5idWlsZCUgR0VRIDkyMDAgKA0KaWYgbm90ICIlb3NhcmNoJSI9PSJ4ODYiICgNCnJlZyBkZWxldGUgIiVrbXNrZXklIiAvZiAvcmVnOjMyICVu dWwlDQpyZWcgYWRkICIla21za2V5JSIgL2YgL3YgS2V5TWFuYWdlbWVudFNlcnZpY2VOYW1lIC90IFJFR19TWiAvZCAiMTAuMC4wLjEwIiAvcmVnOjMyICVu dWwlDQopDQpyZWcgZGVsZXRlICIla21za2V5JSIgL2YgJW51bCUNCnJlZyBhZGQgIiVrbXNrZXklIiAvZiAvdiBLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUg L3QgUkVHX1NaIC9kICIxMC4wLjAuMTAiICVudWwlDQplY2hvIEFkZGluZyBhIFJlZ2lzdHJ5IHRvIFByZXZlbnQgQmFubmVyICAgICBbU3VjY2Vzc2Z1bF0N CikNCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjp0c19zdGFydG1zaQ0KDQppZiBkZWZpbmVkIG8x NW1zaSBjYWxsIDp0c19wcm9jZXNzbXNpIDE1ICVvMTVtc2lfcmVnJQ0KaWYgZGVmaW5lZCBvMTZtc2kgY2FsbCA6dHNfcHJvY2Vzc21zaSAxNiAlbzE2bXNp X3JlZyUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmVjaG86DQpjYWxsIDpvaF9jbGVhcmJsb2NrDQpp ZiAiJW8xNm1zaSUlbzE1bXNpJSI9PSIiIGlmIG5vdCAiJW8xNnV3cCUlbzE2YzJyJSVvMTVjMnIlIj09IiIgY2FsbCA6b2hfdW5pbnN0a2V5DQpjYWxsIDpv aF9saWNyZWZyZXNoDQoNCmdvdG8gOnRzX2FjdA0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnRzX3do b3N0DQoNCjo6ICBQcm9jZXNzIFdpbmRvd3MgSy1NLVMgaG9zdA0KDQplY2hvOg0KZWNobyBQcm9jZXNzaW5nIFdpbmRvd3MgJUtTJSBIb3N0Li4uDQoNCmlm IC9pICV0c21ldGhvZCU9PUtNUzRrICgNCmVjaG86DQpjYWxsIDpka19jb2xvciAlUmVkJSAiU2tpcHBpbmcgV2luZG93cyAlS1MlIEhvc3QgICAgICAgICAg ICAgICBbS01TNGsgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBXaW5kb3dzICVLUyUgSG9zdF0iDQppZiAvaSAlX2FjdG1ldGhvZCU9PUF1dG8gKA0K Y2FsbCA6ZGtfY29sb3IgJUJsdWUlICJDb25uZWN0IHRvIHRoZSBJbnRlcm5ldCBhbmQgdHJ5IGFnYWluLiBTY3JpcHQgd2lsbCB1c2UgdGhlIFN0YXRpY0NJ RCBhY3RpdmF0aW9uIG1ldGhvZC4iDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJVc2Ugbm9uLUtNUzRLIGFjdGl2YXRpb24gb3B0aW9ucyBm cm9tIHRoZSBwcmV2aW91cyBtZW51LiINCikNCmdvdG8gOnRzX2FjdA0KKQ0KDQplY2hvOg0KaWYgJXdpbmJ1aWxkJSBHRVEgMTA1ODYgKA0KY2FsbCA6ZGtf Y29sb3IgJUdyYXklICJXaXRoICVLUyUgSG9zdCBsaWNlbnNlLCBzeXN0ZW0gbWF5IHJhbmRvbWx5IGNoYW5nZSBXaW5kb3dzIEVkaXRpb24gbGF0ZXIuIEl0 IGlzIGEgV2luZG93cyBpc3N1ZSBhbmQgY2FuIGJlIHNhZmVseSBpZ25vcmVkLiINCikNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiJUtTJSBIb3N0IFtOb3Qg dG8gYmUgY29uZnVzZWQgd2l0aCAlS1MlIENsaWVudF0gbGljZW5zZSBjYXVzZXMgdGhlICVfc2xzZXIlIHNlcnZpY2UgdG8gcnVuIGNvbnRpbnVvdXNseS4i DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIk9ubHkgdXNlIHRoaXMgYWN0aXZhdGlvbiB3aGVuIG5lY2Vzc2FyeSwgeW91IGNhbiByZXZlcnQgdG8gbm9ybWFs IGFjdGl2YXRpb24gZnJvbSB0aGUgcHJldmlvdXMgbWVudS4iDQoNCmlmICVfdW5hdHRlbmRlZCU9PTAgKA0KZWNobzoNCmNob2ljZSAvQzowRiAvTiAvTSAi PiBbMF0gR28gYmFjayAgW0ZdIENvbnRpbnVlIDogIg0KaWYgIWVycm9ybGV2ZWwhPT0xIGV4aXQgL2INCmVjaG86DQopDQoNCnNldCBfYXJyPQ0Kc2V0IHRl bXBpZD0NCnNldCBrZXl0eXBlPWttc2hvc3QNCg0KaWYgZGVmaW5lZCBfdmlzIGdvdG8gOnRzX3dob3N0X3Zpc3RhDQoNCjo6ICBJbnN0YWxsIGN1cnJlbnQg ZWRpdGlvbiBjc3ZsayBsaWNlbnNlIHNvIHRoYXQgY29ycmVjdCBlZGl0aW9uIGNhbiByZWZsZWN0IGZvciBjc3Zsaw0KDQppZiAld2luYnVpbGQlIEdFUSAx MDU4NiAoDQpmb3IgJSUjIGluICgiJVN5c1BhdGglXHNwcFx0b2tlbnNcc2t1c1wldHNlZGl0aW9uJVwqQ1NWTEsqLnhybS1tcyIpIGRvICgNCmlmIGRlZmlu ZWQgX2FyciAoc2V0ICJfYXJyPSFfYXJyITsiJVN5c1BhdGglXHNwcFx0b2tlbnNcc2t1c1wldHNlZGl0aW9uJVwlJX5ueCMiIikgZWxzZSAoc2V0ICJfYXJy PSIlU3lzUGF0aCVcc3BwXHRva2Vuc1xza3VzXCV0c2VkaXRpb24lXCUlfm54IyIiKQ0KKQ0KaWYgZGVmaW5lZCBfYXJyICVwc2MlICIkc2xzID0gR2V0LVdt aU9iamVjdCAlc3BzJTsgJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAnOnhybVw6LionOy4gKFtzY3JpcHRibG9ja106OkNy ZWF0ZSgkZlsxXSkpOyBJbnN0YWxsTGljZW5zZUFyciAnIV9hcnIhJyIgJW51bCUNCikNCg0KZm9yIC9mICJkZWxpbXM9IiAlJWEgaW4gKCclcHNjJSAiJGY9 W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAnOndpbnRzaWRcOi4qJzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKSIg JW51bDYlJykgZG8gKA0KZWNobyAiJSVhIiB8IGZpbmRzdHIgL3IgIi4qLS4qLS4qLS4qLS4qIiAlbnVsMSUgJiYgKHNldCB0c2lkcz0hdHNpZHMhICUlYSYg c2V0IHRlbXBpZD0lJWEpDQopDQoNCmlmIGRlZmluZWQgdGVtcGlkICgNCmVjaG8gQ2hlY2tpbmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAgICAgIFsl dGVtcGlkJV0gWyV0c2VkaXRpb24lXQ0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAg ICAgICAgW05vdCBGb3VuZF0gWyV0c2VkaXRpb24lXSBbJW9zU0tVJV0iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIiVLUyUgSG9zdCBsaWNlbnNlIGlzIG5v dCBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gSXQgaXMgYXZhaWxhYmxlIGZvciB0aGUgYmVsb3cgZWRpdGlvbnMuIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJQ cm9mZXNzaW9uYWwsIEVkdWNhdGlvbiwgUHJvZmVzc2lvbmFsV29ya3N0YXRpb24sIEVudGVycHJpc2UsIEVudGVycHJpc2VTLCBhbmQgU2VydmVyIGVkaXRp b25zLCBldGMuIg0KZ290byA6dHNfYWN0DQopDQoNCmlmIGRlZmluZWQgd2luc3ViICgNCmVjaG86DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIldpbmRvd3Mg U3Vic2NyaXB0aW9uIFtTS1UgSUQtJXNsY1NLVSVdIGZvdW5kLiBTY3JpcHQgd2lsbCBhY3RpdmF0ZSBiYXNlIGVkaXRpb24gW1NLVSBJRC0lcmVnU0tVJV0u Ig0KKQ0KDQpnb3RvIDp0c19hY3QNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjp0c193aG9zdF92aXN0 YQ0KDQo6OiAgUHJvY2VzcyBXaW5kb3dzIEstTS1TIGhvc3QgZm9yIFZpc3RhDQoNCjo6ICAxc3QgY29sdW1uID0gQWN0aXZhdGlvbiBJRA0KOjogIDJuZCBj b2x1bW4gPSBDU1ZMSyBrZXkNCjo6ICAzcmQgY29sdW1uID0gRWRpdGlvbiBJRHMNCjo6ICBTZXBhcmF0b3IgID0gXw0KDQpzZXQgZj0NCnNldCBrZXk9DQpz ZXQgdGVtcGlkPQ0KaWYgbm90IGRlZmluZWQgYWxsYXBwcyBjYWxsIDpka19hY3RpZHMgNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmDQoN CmZvciAlJSMgaW4gKA0KOjogIFdpbmRvd3NWaXN0YQ0KMjEyYTY0ZGMtNDNiMS00ZDNkLWEzMGMtMmZjNjlkMjA5NWM2X1RXVkczLTlRNFA4LVc5WEpGLVk3 NkZKLURXJWYlUTRSXy1CdXNpbmVzcy1CdXNpbmVzc04tRW50ZXJwcmlzZS1FbnRlcnByaXNlTi0NCjo6ICBXaW5kb3dzU2VydmVyMjAwOA0KYzkwZDFiNGUt OGFhOC00MzllLThiOWUtYjZkNmI2YTZkOTc1X0JIQzRRLTZEN0I3LVFNVkg3LTRNS1FILVk5JWYlVks3Xy1TZXJ2ZXJDb21wdXRlQ2x1c3Rlci1TZXJ2ZXJE YXRhY2VudGVyLVNlcnZlckRhdGFjZW50ZXJWLVNlcnZlckVudGVycHJpc2UtU2VydmVyRW50ZXJwcmlzZUlBNjQtU2VydmVyRW50ZXJwcmlzZVYtU2VydmVy U3RhbmRhcmQtU2VydmVyU3RhbmRhcmRWLVNlcnZlcldlYi0NCjU2ZGY0MTUxLTFmOWYtNDFiZi1hY2FhLTI5NDFjMDcxODcyYl9QVkdLRy0yUjdYUS03V1RG RC1GWFRKUi1EUSVmJUJRM18tU2VydmVyQ29tcHV0ZUNsdXN0ZXItU2VydmVyRW50ZXJwcmlzZS1TZXJ2ZXJFbnRlcnByaXNlVi1TZXJ2ZXJTdGFuZGFyZC1T ZXJ2ZXJTdGFuZGFyZFYtU2VydmVyV2ViLQ0KYzQ0OGZhMDYtNDlkMS00NGVjLTgyYmItMDA4NTU0NWMzYjUxX0tINFBDLUtKRlg2LVhGVkhRLUdESzJHLUpD JWYlSlk5Xy1TZXJ2ZXJDb21wdXRlQ2x1c3Rlci1TZXJ2ZXJXZWItDQopIGRvICgNCmZvciAvZiAidG9rZW5zPTEtMyBkZWxpbXM9XyIgJSVBIGluICgiJSUj IikgZG8gaWYgbm90IGRlZmluZWQga2V5ICgNCmVjaG8gIiVhbGxhcHBzJSIgfCBmaW5kIC9pICIlJUEiICVudWwxJSAmJiAoDQplY2hvICIlJUMiIHwgZmlu ZCAvaSAiLSV0c2VkaXRpb24lLSIgJW51bDElICYmICgNCnNldCBrZXk9JSVCDQpzZXQgdGVtcGlkPSUlQQ0KKQ0KKQ0KKQ0KKQ0KDQppZiBkZWZpbmVkIGtl eSAoDQplY2hvIENoZWNraW5nIEFjdGl2YXRpb24gSUQgICAgICAgICAgICAgICAgICBbJXRlbXBpZCVdIFsldHNlZGl0aW9uJV0NCikgZWxzZSAoDQpjYWxs IDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAgICAgIFtOb3QgRm91bmRdIFsldHNlZGl0aW9uJV0gWyVvc1NL VSVdIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlS1MlIEhvc3QgbGljZW5zZSBpcyBub3QgZm91bmQgb24geW91ciBzeXN0ZW0uIEl0IGlzIGF2YWlsYWJs ZSBmb3IgdGhlIGJlbG93IGVkaXRpb25zLiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiQnVzaW5lc3MsIEJ1c2luZXNzTiwgRW50ZXJwcmlzZSwgRW50ZXJw cmlzZU4sIGFuZCBTZXJ2ZXIgZWRpdGlvbnMsIGV0Yy4iDQpnb3RvIDp0c19hY3QNCikNCg0KY2FsbCA6ZGtfaW5za2V5ICJbJWtleSVdIg0Kc2V0IHRzaWRz PSV0c2lkcyUgJXRlbXBpZCUNCmdvdG8gOnRzX2FjdA0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnRz X29ob3N0DQoNCjo6ICBQcm9jZXNzIE9mZmljZSBLLU0tUyBob3N0DQoNCmVjaG86DQplY2hvIFByb2Nlc3NpbmcgT2ZmaWNlICVLUyUgSG9zdC4uLg0KDQpp ZiBkZWZpbmVkIF92aXMgKA0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiV2luZG93cyBWaXN0YSBhbmQgU2VydmVyIDIwMDggZG8gbm90IHN1cHBv cnQgdGhlIGluc3RhbGxhdGlvbiBvZiBPZmZpY2UgS01TIEhvc3QuIg0KZ290byA6dHNfYWN0DQopDQoNCmlmIC9pICV0c21ldGhvZCU9PUtNUzRrICgNCmVj aG86DQpjYWxsIDpka19jb2xvciAlUmVkJSAiU2tpcHBpbmcgT2ZmaWNlICVLUyUgSG9zdCAgICAgICAgICAgICAgICBbS01TNGsgbWV0aG9kIGlzIG5vdCBz dXBwb3J0ZWQgd2l0aCBPZmZpY2UgJUtTJSBIb3N0XSINCmlmIC9pICVfYWN0bWV0aG9kJT09QXV0byAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkNvbm5l Y3QgdG8gdGhlIEludGVybmV0IGFuZCB0cnkgYWdhaW4uIFNjcmlwdCB3aWxsIHVzZSB0aGUgU3RhdGljQ0lEIGFjdGl2YXRpb24gbWV0aG9kLiINCikgZWxz ZSAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlVzZSBub24tS01TNEsgYWN0aXZhdGlvbiBvcHRpb25zIGZyb20gdGhlIHByZXZpb3VzIG1lbnUuIg0KKQ0K Z290byA6dHNfYWN0DQopDQoNCnNldCBvaG9zdGV4aXN0PQ0KY2FsbCA6ZGtfYWN0aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0K c2V0IG9ob3N0aWRzPSVhbGxhcHBzJQ0KY2FsbCA6ZGtfYWN0aWRzIDU5YTUyODgxLWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0Kc2V0IG9ob3N0aWRz PSVvaG9zdGlkcyUgJWFsbGFwcHMlDQoNCmZvciAlJSMgaW4gKA0KYmZlN2ExOTUtNGY4Zi00ZjBiLWE2MjItY2YxM2M3ZDE2ODY0X0tNU0hvc3QyMDEwLVBy b1BsdXNWTA0KZjNkODliYmYtYzBlYy00N2NlLWE4ZmEtZTVhNWY5N2U0NDdmX0tNU0hvc3QyMDI0Vm9sdW1lDQo0N2YzYjk4My03YzUzLTRkNDUtYWJjNi1i Y2Q5MWUyZGQ5MGFfS01TSG9zdDIwMjFWb2x1bWUNCjcwNTEyMzM0LTQ3YjQtNDRkYi1hMjMzLWJlNWVhMzNiOTE0Y19LTVNIb3N0MjAxOVZvbHVtZQ0KOThl YmZlNzMtMjA4NC00Yzk3LTkzMmMtYzBjZDE2NDNiZWE3X0tNU0hvc3QyMDE2Vm9sdW1lDQoyZTI4MTM4YS04NDdmLTQyYmMtOTc1Mi02MWIwM2ZmZjMzY2Rf S01TSG9zdDIwMTNWb2x1bWUNCikgZG8gKA0KZm9yIC9mICJ0b2tlbnM9MS0yIGRlbGltcz1fIiAlJUEgaW4gKCIlJSMiKSBkbyAoDQplY2hvICIlb2hvc3Rp ZHMlIiB8IGZpbmQgL2kgIiUlQSIgJW51bDElICYmICgNCnNldCBvaG9zdGV4aXN0PTENCnNldCB0c2lkcz0hdHNpZHMhICUlQQ0KZWNobyBDaGVja2luZyBB Y3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgWyUlQV0gWyUlQl0NCikNCikNCikNCg0KaWYgbm90IGRlZmluZWQgb2hvc3RleGlzdCAoDQpjYWxsIDpk a19jb2xvciAlR3JheSUgIkNoZWNraW5nIEFjdGl2YXRpb24gSUQgICAgICAgICAgICAgICAgICBbTm90IGZvdW5kIGZvciBPZmZpY2UgJUtTJSBIb3N0XSIN CmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0c2ZvcmdlI29mZmljZS1r bXMtaG9zdCINCikNCg0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiJUtTJSBIb3N0IFtOb3QgdG8gYmUgY29uZnVzZWQgd2l0aCAlS1MlIENsaWVu dF0gbGljZW5zZSBjYXVzZXMgdGhlIHNwcHN2YyBzZXJ2aWNlIHRvIHJ1biBjb250aW51b3VzbHkuIg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJPbmx5IHVz ZSB0aGlzIGFjdGl2YXRpb24gd2hlbiBuZWNlc3NhcnkuIg0KDQpnb3RvIDp0c19hY3QNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQoNCjp0c19hcHB4bG9iDQoNCjo6ICBQcm9jZXNzIFdpbmRvd3MgOC84LjEgQVBQWCBTaWRlbG9hZGluZw0KDQplY2hvOg0KZWNobyBQ cm9jZXNzaW5nIFdpbmRvd3MgOC84LjEgQVBQWCBTaWRlbG9hZGluZy4uLg0KDQppZiAld2luYnVpbGQlIExTUyA5MjAwIHNldCBub2FwcHg9MQ0KaWYgJXdp bmJ1aWxkJSBHVFIgOTYwMCBzZXQgbm9hcHB4PTENCg0KZWNobzoNCmlmIGRlZmluZWQgbm9hcHB4ICgNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiQ2hlY2tp bmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAgICAgIFtBUFBYIFNpZGVsb2FkaW5nIGZlYXR1cmUgaXMgYXZhaWxhYmxlIG9ubHkgb24gV2luZG93cyA4 LzguMV0iDQpnb3RvIDpka19kb25lDQopDQoNCmlmIC9pICV0c21ldGhvZCU9PUtNUzRrICgNCmVjaG86DQpjYWxsIDpka19jb2xvciAlUmVkJSAiU2tpcHBp bmcgV2luZG93cyA4LzguMSBBUFBYICAgICAgICAgICAgIFtLTVM0ayBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCB3aXRoIFdpbmRvd3MgOC84LjEgQVBQWF0i DQppZiAvaSAlX2FjdG1ldGhvZCU9PUF1dG8gKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJDb25uZWN0IHRvIHRoZSBJbnRlcm5ldCBhbmQgdHJ5IGFnYWlu LiBTY3JpcHQgd2lsbCB1c2UgdGhlIFN0YXRpY0NJRCBhY3RpdmF0aW9uIG1ldGhvZC4iDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJVc2Ug bm9uLUtNUzRLIGFjdGl2YXRpb24gb3B0aW9ucyBmcm9tIHRoZSBwcmV2aW91cyBtZW51LiINCikNCmdvdG8gOmRrX2RvbmUNCikNCg0Kc2V0IGFwcHhleGlz dD0NCmlmIG5vdCBkZWZpbmVkIGFsbGFwcHMgY2FsbCA6ZGtfYWN0aWRzIDU1YzkyNzM0LWQ2ODItNGQ3MS05ODNlLWQ2ZWMzZjE2MDU5Zg0KDQpmb3IgJSUj IGluICgNCmVjNjc4MTRiLTMwZTYtNGE1MC1iZjdiLWQ1NWRhZjcyOWQxZV9BUFBYTE9CLUNsaWVudA0KMjUxZWY5YmYtMjAwNS00NDJmLTk0YzQtODYzMDdk ZTdiYjMyX0FQUFhMT0ItRW1iZWRkZWQtSW5kdXN0cnkNCjFlNThjOWQ3LWUzZjEtNGY2OS05MDM5LTFmMTYyNDYzYWMyY19BUFBYTE9CLUVtYmVkZGVkLVN0 YW5kYXJkDQozNTAyZDUzZS01ZDQzLTQzNmEtODRhZi03MTRlOGQzMzRmOGRfQVBQWExPQi1TZXJ2ZXINCikgZG8gKA0KZm9yIC9mICJ0b2tlbnM9MS0yIGRl bGltcz1fIiAlJUEgaW4gKCIlJSMiKSBkbyAoDQplY2hvICIlYWxsYXBwcyUiIHwgZmluZCAvaSAiJSVBIiAlbnVsMSUgJiYgKA0Kc2V0IGFwcHhleGlzdD0x DQpzZXQgdHNpZHM9IXRzaWRzISAlJUENCmVjaG8gQ2hlY2tpbmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAgICAgIFslJUFdIFslJUJdDQopDQopDQop DQoNCmlmIG5vdCBkZWZpbmVkIGFwcHhleGlzdCAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgQWN0aXZhdGlvbiBJRCAgICAgICAgICAgICAg ICAgIFtOb3QgZm91bmRdIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJBUFBYIFNpZGVsb2FkaW5nIGZlYXR1cmUgaXMgYXZhaWxhYmxlIG9ubHkgb24gUHJv IGFuZCBoaWdoZXIgbGV2ZWwgZWRpdGlvbnMuIg0KKQ0KDQpnb3RvIDp0c19hY3QNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQoNCjp0c19yZXNldGFsbA0KDQplY2hvOg0KaWYgZGVmaW5lZCBfdmlzICgNCmVjaG8gUHJvY2Vzc2luZyBSZXNldCBvZiBSZWFybSAvIFRp bWVycy4uLg0KKSBlbHNlICgNCmVjaG8gUHJvY2Vzc2luZyBSZXNldCBvZiBSZWFybSAvIFRpbWVycyAvIFRhbXBlciAvIExvY2suLi4NCikNCmVjaG86DQoN CnNldCByZXNldHN0dWZmPTENCiVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0ICc6dHNmb3JnZVw6LionOy4gKFtz Y3JpcHRibG9ja106OkNyZWF0ZSgkZlsxXSkpIg0KDQppZiAlZXJyb3JsZXZlbCU9PTMgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlJlc2V0IEZhaWxlZC4i DQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxw IC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlR3JlZW4lICJSZXNldCBwcm9jZXNzIGhhcyBi ZWVuIHN1Y2Nlc3NmdWxseSBkb25lLiINCikNCg0KZ290byA6ZGtfZG9uZQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCg0KOnRzX2FjdG1hbg0KDQplY2hvOg0KZWNobyBQcm9jZXNzaW5nIE1hbnVhbCBBY3RpdmF0aW9uLi4uDQplY2hvOg0KDQppZiAvaSAldHNtZXRo b2QlPT1LTVM0ayAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlNraXBwaW5nIE1hbnVhbCBBY3RpdmF0aW9uICAgICAgICAgICAgICBbS01TNGsg bWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBpdF0iDQppZiAvaSAlX2FjdG1ldGhvZCU9PUF1dG8gKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJDb25u ZWN0IHRvIHRoZSBJbnRlcm5ldCBhbmQgdHJ5IGFnYWluLiBTY3JpcHQgd2lsbCB1c2UgdGhlIFN0YXRpY0NJRCBhY3RpdmF0aW9uIG1ldGhvZC4iDQopIGVs c2UgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJVc2Ugbm9uLUtNUzRLIGFjdGl2YXRpb24gb3B0aW9ucyBmcm9tIHRoZSBwcmV2aW91cyBtZW51LiINCikN CmdvdG8gOmRrX2RvbmUNCikNCg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJUaGlzIG9wdGlvbiBpcyBmb3IgYWR2YW5jZWQgdXNlcnMsIHRob3NlIHdobyBh bHJlYWR5IGtub3cgd2hhdCB0aGV5IGFyZSBkb2luZy4iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlNvbWUgYWN0aXZhdGlvbiBJRHMgbWF5IGNhdXNlIHN5 c3RlbSBjcmFzaCBbTVVJIG1pc21hdGNoXSwgb3IgaXJyZXZlcnNpYmxlIGNoYW5nZXMgW0Nsb3VkRWRpdGlvbiBldGNdLiINCg0KaWYgJV91bmF0dGVuZGVk JT09MSAoDQplY2hvOg0KZm9yICUlIyBpbiAoJXRzaWRzJSkgZG8gKGVjaG8gQWN0aXZhdGlvbiBJRCAtICUlIykNCmdvdG8gOnRzX2FjdA0KKQ0KDQpjYWxs IDpka19jb2xvciAlQmx1ZSUgIkFsdGhvdWdoIHRoZSBzY3JpcHQgd2lsbCB0cnkgdG8gcmVtb3ZlIHRob3NlIElEcyBmcm9tIHRoZSBsaXN0LCBpdCBpcyBu b3QgZnVsbHkgZ3VhcmFudGVlZC4iDQplY2hvOg0KY2hvaWNlIC9DOjBGIC9OIC9NICI+IFswXSBHbyBiYWNrICBbRl0gQ29udGludWUgOiAiDQppZiAlZXJy b3JsZXZlbCU9PTEgZXhpdCAvYg0KDQplY2hvOg0KZWNobyBGZXRjaGluZyBTdXBwb3J0ZWQgQWN0aXZhdGlvbiBJRHMgbGlzdC4gUGxlYXNlIHdhaXQuLi4N Cg0KJXBzYyUgIiRmPVtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzpsaXN0YWN0aWRzXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6 Q3JlYXRlKCRmWzFdKSkiDQppZiAlZXJyb3JsZXZlbCU9PTMgKA0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJObyBzdXBwb3J0ZWQgYWN0aXZhdGlvbiBJRCBm b3VuZCwgYWJvcnRpbmcuLi4iDQpnb3RvIDpka19kb25lDQopDQoNCmZvciAvZiAiZGVsaW1zPSIgJSVhIGluICgnJXBzYyUgIiRpZHMgPSBHZXQtV21pT2Jq ZWN0IC1RdWVyeSAnU0VMRUNUIElEIEZST00gU29mdHdhcmVMaWNlbnNpbmdQcm9kdWN0JyB8IFNlbGVjdC1PYmplY3QgLUV4cGFuZFByb3BlcnR5IElEOyAk aWRzIiAlbnVsNiUnKSBkbyBjYWxsIHNldCAiYWxsYWN0aWRzPSAlJWEgIWFsbGFjdGlkcyEgIg0KDQppZiBkZWZpbmVkIF92aXMgKA0KZWNobzoNCmNhbGwg OmRrX2NvbG9yICVCbHVlJSAiT24gV2luZG93cyBWaXN0YSBhbmQgU2VydmVyIDIwMDgsIHlvdSBtdXN0IG1hbnVhbGx5IGluc3RhbGwgdGhlIGtleSBiZWZv cmUgYWN0aXZhdGluZyBpdC4iDQopDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJFbnRlciAvIFBhc3RlIHRoZSBBY3RpdmF0aW9uIElEIHNob3du IGluIGZpcnN0IGNvbHVtbiBpbiB0aGUgb3BlbmVkIHRleHQgZmlsZSwgb3IganVzdCBwcmVzcyBFbnRlciB0byByZXR1cm46Ig0KZWNobyBBZGQgc3BhY2Ug YWZ0ZXIgZWFjaCBBY3RpdmF0aW9uIElEIGlmIHlvdSBhcmUgYWRkaW5nIG11bHRpcGxlOg0KZWNobzoNCnNldCAvcCB0c2lkcz0NCg0KZGVsIC9mIC9xICIl U3lzdGVtUm9vdCVcVGVtcFxhY3RpZHNfMTU5XyoiICVudWwlDQppZiBub3QgZGVmaW5lZCB0c2lkcyBnb3RvIDpka19kb25lDQoNCmZvciAlJSMgaW4gKCV0 c2lkcyUpIGRvICgNCmVjaG8gIiVhbGxhY3RpZHMlIiB8IGZpbmQgL2kgIiAlJSMgIiAlbnVsMSUgfHwgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlslJSNd IEluY29ycmVjdCBBY3RpdmF0aW9uIElEIGVudGVyZWQsIGFib3J0aW5nLi4uIg0KZ290byA6ZGtfZG9uZQ0KKQ0KKQ0KDQpnb3RvIDp0c19hY3QNCg0KOmxp c3RhY3RpZHM6DQokdCA9IFtBcHBEb21haW5dOjpDdXJyZW50RG9tYWluLkRlZmluZUR5bmFtaWNBc3NlbWJseSg0LCAxKS5EZWZpbmVEeW5hbWljTW9kdWxl KDIsICRGYWxzZSkuRGVmaW5lVHlwZSgwKQ0KJHQuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xPcGVuJywgJ3NsYy5kbGwnLCAyMiwgMSwgW0ludDMyXSwgQChb SW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5TZXRJbXBsZW1lbnRhdGlvbkZsYWdzKDEyOCkNCiR0LkRlZmluZVBJbnZva2VNZXRob2QoJ1NMQ2xv c2UnLCAnc2xjLmRsbCcsIDIyLCAxLCBbSW50UHRyXSwgQChbSW50UHRyXSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KJHQuRGVmaW5l UEludm9rZU1ldGhvZCgnU0xHZXRQcm9kdWN0U2t1SW5mb3JtYXRpb24nLCAnc2xjLmRsbCcsIDIyLCAxLCBbSW50MzJdLCBAKFtJbnRQdHJdLCBbR3VpZF0u TWFrZUJ5UmVmVHlwZSgpLCBbU3RyaW5nXSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpLCBbVUludDMyXS5NYWtlQnlSZWZUeXBlKCksIFtJbnRQdHJdLk1h a2VCeVJlZlR5cGUoKSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KJHQuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xHZXRMaWNlbnNlJywg J3NsYy5kbGwnLCAyMiwgMSwgW0ludDMyXSwgQChbSW50UHRyXSwgW0d1aWRdLk1ha2VCeVJlZlR5cGUoKSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpLCBb SW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5TZXRJbXBsZW1lbnRhdGlvbkZsYWdzKDEyOCkNCiR3ID0gJHQuQ3JlYXRlVHlwZSgpDQokbSA9IFtS dW50aW1lLkludGVyb3BTZXJ2aWNlcy5NYXJzaGFsXQ0KDQpmdW5jdGlvbiBzbEdldFNrdUluZm8oJFNrdUlkKSB7DQogICAgJGMgPSAwOyAkYiA9IDANCiAg ICAkciA9ICR3OjpTTEdldFByb2R1Y3RTa3VJbmZvcm1hdGlvbigkaFNMQywgW3JlZl1bR3VpZF0kU2t1SWQsICJtc2Z0OnNsL0VVTC9QSE9ORS9QVUJMSUMi LCBbcmVmXSRudWxsLCBbcmVmXSRjLCBbcmVmXSRiKQ0KICAgIHJldHVybiAoJHIgLWVxIDApDQp9DQoNCmZ1bmN0aW9uIElzTXVpTm90TG9ja2VkKCRTa3VJ ZCkgew0KICAgICRyID0gJHRydWU7ICRjID0gMDsgJGIgPSAwDQoNCiAgICAkTGljSWQgPSBbR3VpZF06OkVtcHR5DQogICAgW3ZvaWRdJHc6OlNMR2V0UHJv ZHVjdFNrdUluZm9ybWF0aW9uKCRoU0xDLCBbcmVmXVtHdWlkXSRTa3VJZCwgImZpbGVJZCIsIFtyZWZdJG51bGwsIFtyZWZdJGMsIFtyZWZdJGIpDQogICAg JEZpbGVJZCA9ICRtOjpQdHJUb1N0cmluZ1VuaSgkYikNCg0KICAgICRjID0gMDsgJGIgPSAwDQogICAgW3ZvaWRdJHc6OlNMR2V0TGljZW5zZSgkaFNMQywg W3JlZl1bR3VpZF0kRmlsZUlkLCBbcmVmXSRjLCBbcmVmXSRiKQ0KICAgICRibG9iID0gTmV3LU9iamVjdCBieXRlW10gJGM7ICRtOjpDb3B5KCRiLCAkYmxv YiwgMCwgJGMpDQogICAgJGNvbnQgPSBbVGV4dC5FbmNvZGluZ106OlVURjguR2V0U3RyaW5nKCRibG9iKQ0KICAgICR4bWwgPSBbeG1sXSRjb250LlN1YlN0 cmluZygkY29udC5JbmRleE9mKCc8cicpKQ0KDQogICAgJHhtbC5saWNlbnNlR3JvdXAubGljZW5zZVswXS5ncmFudCB8IGZvcmVhY2ggew0KICAgICAgICAk Xy5hbGxDb25kaXRpb25zLmFsbENvbmRpdGlvbnMucHJvZHVjdFBvbGljaWVzLnBvbGljeVN0ciB8IHdoZXJlIHsgJF8ubmFtZSAtZXEgJ0tlcm5lbC1NVUkt TGFuZ3VhZ2UtQWxsb3dlZCcgfSB8IGZvcmVhY2ggew0KICAgICAgICAgICAgaWYgKCRfLklubmVyVGV4dCAtbmUgJ0VNUFRZJykgeyAkciA9ICRmYWxzZSB9 DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICRyDQp9DQoNCiRoU0xDID0gMDsgW3ZvaWRdJHc6OlNMT3BlbihbcmVmXSRoU0xDKQ0KJHJlc3VsdHMg PSBHZXQtV21pT2JqZWN0IC1RdWVyeSAiU0VMRUNUIElELCBOYW1lLCBEZXNjcmlwdGlvbiBGUk9NIFNvZnR3YXJlTGljZW5zaW5nUHJvZHVjdCINCiRtYXhO YW1lV2lkdGggPSA2MA0KDQokZmlsdGVyZWRSZXN1bHRzID0gJHJlc3VsdHMgfCBXaGVyZS1PYmplY3Qgew0KICAgIGlmICgkZW52OnRzZWRpdGlvbiAtbGlr ZSAiKkNvdW50cnlTcGVjaWZpYyoiKSB7DQogICAgICAgICR0cnVlDQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICAkXy5OYW1lIC1saWtlICIqRVNVKiIg LW9yICRfLk5hbWUgLW5vdGxpa2UgIipDb3VudHJ5U3BlY2lmaWMqIg0KICAgIH0NCn0gfCBXaGVyZS1PYmplY3Qgew0KICAgIGlmICgkZW52OnRzZWRpdGlv biAtbGlrZSAiKkNsb3VkRWRpdGlvbioiKSB7DQogICAgICAgICR0cnVlDQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICAkXy5OYW1lIC1saWtlICIqRVNV KiIgLW9yICRfLk5hbWUgLW5vdGxpa2UgIipDbG91ZEVkaXRpb24qIg0KICAgIH0NCn0gfCBXaGVyZS1PYmplY3Qgew0KICAgICRfLk5hbWUgLWxpa2UgIipD b3VudHJ5U3BlY2lmaWMqIiAtb3IgKElzTXVpTm90TG9ja2VkICRfLklEKQ0KfSB8IFdoZXJlLU9iamVjdCB7DQogICAgc2xHZXRTa3VJbmZvICRfLklEDQp9 IHwgRm9yRWFjaC1PYmplY3Qgew0KICAgICIkKCRfLklEKWB0JCgkXy5OYW1lLlBhZFJpZ2h0KCRtYXhOYW1lV2lkdGgpKWB0JCgkXy5EZXNjcmlwdGlvbiki DQp9DQoNClt2b2lkXSR3OjpTTENsb3NlKCRoU0xDKQ0KaWYgKC1ub3QgJGZpbHRlcmVkUmVzdWx0cykgew0KICAgIEV4aXQgMw0KfQ0KDQokc29ydGVkUmVz dWx0cyA9ICRmaWx0ZXJlZFJlc3VsdHMgfCBTb3J0LU9iamVjdCB7ICRfLlNwbGl0KCJgdCIpWzFdLlRyaW0oKSB9DQokb3V0cHV0ID0gJHNvcnRlZFJlc3Vs dHMgLWpvaW4gImByYG4iDQokbmV3R3VpZCA9IFtHdWlkXTo6TmV3R3VpZCgpLkd1aWQNCiRmaWxlbmFtZSA9ICIkZW52OlN5c3RlbVJvb3RcVGVtcFxhY3Rp ZHNfMTU5XyRuZXdHdWlkLnR4dCINCiRvdXRwdXQgfCBTZXQtQ29udGVudCAtUGF0aCAkZmlsZW5hbWUgLUVuY29kaW5nIEFTQ0lJDQpTdGFydC1Qcm9jZXNz IG5vdGVwYWQuZXhlICRmaWxlbmFtZQ0KOmxpc3RhY3RpZHM6DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K DQo6dHNfYWN0DQoNCmlmIGRlZmluZWQgZXZhbCAoDQplY2hvOg0KZWNobyBBY3RpdmF0aW5nLi4uDQplY2hvOg0KY2FsbCA6ZGtfYWN0DQoNCnNldCBncHI9 MA0Kc2V0IGdwcmRheXM9MA0Kc2V0IGFjdGRvbmU9DQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIoR2V0LVdtaU9iamVjdCAtUXVlcnkgJ1NF TEVDVCBHcmFjZVBlcmlvZFJlbWFpbmluZyBGUk9NICVzcHAlIFdIRVJFIEFwcGxpY2F0aW9uSUQ9Jyc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2Yx NjA1OWYnJyBBTkQgUGFydGlhbFByb2R1Y3RLZXkgSVMgTk9UIE5VTEwgQU5EIExpY2Vuc2VEZXBlbmRzT24gaXMgTlVMTCcpLkdyYWNlUGVyaW9kUmVtYWlu aW5nIiAlbnVsNiUnKSBkbyBzZXQgImdwcj0lJWEiDQpzZXQgL2EgImdwcmRheXM9KCFncHIhKzE0NDAtMSkvMTQ0MCINCg0KaWYgIWdwcmRheXMhIEVRVSA5 MCBzZXQgYWN0ZG9uZT0xDQppZiAhZ3ByZGF5cyEgRVFVIDE4MCBzZXQgYWN0ZG9uZT0xDQoNCmlmIGRlZmluZWQgYWN0ZG9uZSAoDQpjYWxsIDpka19jb2xv ciAlR3JlZW4lICJbJXdpbm9zJV0gaGFzIGJlZW4gcmVzZXQgYW5kIGFjdGl2YXRlZCBzdWNjZXNzZnVsbHkgZm9yICFncHJkYXlzISBkYXlzLiINCikgZWxz ZSAoDQpzZXQgZXJyb3I9MQ0Kc2V0IHNob3dmaXg9MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlsld2lub3MlXSBBY3RpdmF0aW9uIEZhaWxlZCAlZXJyb3Jf Y29kZSUuIFJlbWFpbmluZyBQZXJpb2Q6ICFncHJkYXlzISBkYXlzIFshZ3ByISBtaW51dGVzXS4iDQppZiBub3QgZGVmaW5lZCBub2FjdCAoDQpjYWxsIDpk a19jb2xvciAlR3JheSUgIlRvIGFjdGl2YXRlLCBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIGVuc3VyZSB0aGUgZGF0ZSBhbmQgdGltZSBh cmUgY29ycmVjdC4iDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJUaGlzIFdpbmRvd3MgdmVyc2lvbiBpcyBrbm93biB0byBub3QgYWN0aXZh dGUgZHVlIHRvIE1TIFdpbmRvd3MvU2VydmVyIGlzc3Vlcy4iDQopDQppZiBub3QgZGVmaW5lZCBzaG93Zml4IGNhbGwgOmRrX2NvbG9yICVCbHVlJSAiJV9m aXhtc2clIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBm b3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQopDQopDQoNCmlmIGRlZmluZWQgdHNpZHMgKA0KZWNobzoNCmlmIG5vdCBkZWZp bmVkIF92aXMgaWYgbm90IGRlZmluZWQgb2xka3MgZWNobyBJbnN0YWxsaW5nIEZvcmdlZCBQcm9kdWN0IEtleSBEYXRhLi4uDQppZiAvaSAldHNtZXRob2Ql PT1LTVM0ayAoDQplY2hvIFdyaXRpbmcgVHJ1c3RlZFN0b3JlIGRhdGEuLi4NCikgZWxzZSAoDQppZiAvaSAldHNtZXRob2QlPT1TdGF0aWNDSUQgKGVjaG8g RGVwb3NpdGluZyBTdGF0aWMgQ29uZmlybWF0aW9uIElELi4uKSBlbHNlIChlY2hvIERlcG9zaXRpbmcgWmVybyBDb25maXJtYXRpb24gSUQuLi4pDQopDQpl Y2hvOg0KJXBzYyUgIiRmPVtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzp0c2ZvcmdlXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6 Q3JlYXRlKCRmWzFdKSkgJXRzaWRzJSINCmlmICFlcnJvcmxldmVsIT09MyAoDQppZiAlX2FjdG1hbiU9PTAgKGlmIG5vdCBkZWZpbmVkIHNob3dmaXggY2Fs bCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiKQ0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1 ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQopIGVsc2UgKA0KaWYgL2kgJXRzbWV0 aG9kJT09S01TNGsgaWYgJXdpbmJ1aWxkJSBHRVEgMjYxMDAgaWYgJV9hY3R3aW4lPT0xICgNCmVjaG86DQpjYWxsIDpka19jb2xvciAlR3JheSUgIkluIFdp bmRvd3Mgc2V0dGluZ3MsIHlvdSBtYXkgc2VlIGEgcmVuZXdhbCBub3RpZmljYXRpb24gZm9yIGFjdGl2YXRpb24gdGhhdCBjYW4gYmUgaWdub3JlZC4iDQpp ZiAvaSAlX2FjdG1ldGhvZCU9PUF1dG8gY2FsbCA6ZGtfY29sb3IgJUdyYXklICJUbyBhdm9pZCB0aGlzIG5vdGlmaWNhdGlvbiwgcnVuIHRoZSBzY3JpcHQg d2l0aCBhbiBpbnRlcm5ldCBjb25uZWN0aW9uIHRvIHVzZSB0aGUgU3RhdGljQ0lEIG1ldGhvZC4iDQopDQplY2hvICIldHNpZHMlIiB8IGZpbmQgL2kgIjdl OTRiZTIzLWIxNjEtNDk1Ni1hNjgyLTE0NmFiMjkxNzc0YyIgJW51bDElICYmICgNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiV2luZG93cyBVcGRhdGUgZ2V0 cyAxLTMgeWVhcnMgb2YgRVNVOyA0LTYgYXJlIHVub2ZmaWNpYWwgYnV0IGxldCB5b3UgaW5zdGFsbCBTZXJ2ZXIgMjAwOCBSMiB1cGRhdGVzIG1hbnVhbGx5 LiINCikNCmVjaG8gIiV0c2lkcyUiIHwgZmluZHN0ciAvaSAiNGFmYzYyMGYtMTJhNC00OGFkLTgwMTUtMmFlYmZiZDZlNDdjIDExYmU3MDE5LWEzMDktNDc2 My05YTA5LTA5MWQxNzIyZmZlMyIgJW51bDElICYmICgNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiRVNVIGlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZCBv biBXaW5kb3dzIDguMSwgYnV0IHVwZGF0ZXMgY2FuIGJlIGluc3RhbGxlZCBtYW51YWxseSB1bnRpbCBKYW51YXJ5IDIwMjQuIg0KKQ0KZWNobyAiJXRzaWRz JSIgfCBmaW5kc3RyIC9pICI4M2Q0OTk4Ni1hZGQzLTQxZDctYmEzMy04N2M3YmZiNWMwZmIgMGI1MzNiNWUtMDhiNi00NGY5LWI4ODUtYzJkZTI5MWJhNDU2 IiAlbnVsMSUgJiYgKA0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJXaW5kb3dzIFVwZGF0ZSBnZXRzIDEtMyB5ZWFycyBvZiBFU1U7IDQtNiBhcmUgdW5vZmZp Y2lhbCBidXQgbWF5IGxldCB5b3UgaW5zdGFsbCBMVFNDIHVwZGF0ZXMgbWFudWFsbHkuIg0KaWYgZXhpc3QgJVN5c1BhdGglXENsaXBFU1VDb25zdW1lci5l eGUgKCVTeXNQYXRoJVxDbGlwRVNVQ29uc3VtZXIuZXhlIC1ldmFsdWF0ZUVsaWdpYmlsaXR5KQ0KaWYgZXhpc3QgJVN5c1BhdGglXENsaXBFU1UuZXhlICgl U3lzUGF0aCVcQ2xpcEVTVS5leGUgJW51bCUpDQopDQopDQoNCmlmIGRlZmluZWQgZXN1ZXhpc3RzdXAgZWNobyBIZWxwOiAlbWFzJXRzZm9yZ2Ujd2luZG93 cy1lc3UNCg0KaWYgJV9hY3R3aW4lPT0xIGZvciAlJSMgaW4gKDQwNykgZG8gaWYgJW9zU0tVJT09JSUjICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICIld2lu b3MlIGRvZXMgbm90IHN1cHBvcnQgYWN0aXZhdGlvbiBvbiBub24tYXp1cmUgcGxhdGZvcm1zLiINCikNCg0KaWYgJV9hY3RvZmYlPT0xIGlmIG5vdCBkZWZp bmVkIGVycm9yIGlmIGRlZmluZWQgb2h1YiAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJPZmZpY2UgYXBwcyBzdWNoIGFzIFdvcmQsIEV4Y2Vs IGFyZSBhY3RpdmF0ZWQsIHVzZSB0aGVtIGRpcmVjdGx5LiBJZ25vcmUgJ0J1eScgYnV0dG9uIGluIE9mZmljZSBkYXNoYm9hcmQgYXBwLiINCikNCg0KUkVN IFRyaWdnZXIgcmVldmFsdWF0aW9uIG9mIFNQUCdzIFNjaGVkdWxlZCBUYXNrcw0KY2FsbCA6ZGtfcmVldmFsICVudWwlDQopDQoNCmlmIG5vdCBkZWZpbmVk IHRzaWRzIGlmIGRlZmluZWQgZXJyb3IgaWYgbm90IGRlZmluZWQgc2hvd2ZpeCAoDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2Fs bCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCikNCg0K Z290byA6ZGtfZG9uZQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnRzX3JlbW92ZQ0KDQpjbHMNCmlm IG5vdCBkZWZpbmVkIHRlcm1pbmFsICgNCm1vZGUgMTAwLCAzMA0KKQ0KdGl0bGUgIFJlbW92ZSBUU2ZvcmdlIEFjdGl2YXRpb24gJW1hc3ZlciUNCg0KZWNo bzoNCmVjaG8gVFNmb3JnZSBhY3RpdmF0aW9uIGRvZXNuJ3QgbW9kaWZ5IGFueSBXaW5kb3dzIGNvbXBvbmVudHMgYW5kIGRvZXNuJ3QgaW5zdGFsbCBhbnkg bmV3IGZpbGVzLg0KZWNobzoNCmVjaG8gSW5zdGVhZCwgaXQgYXBwZW5kcyBkYXRhIHRvIG9uZSBvZiBkYXRhIGZpbGVzIHVzZWQgYnkgU29mdHdhcmUgUHJv dGVjdGlvbiBQbGF0Zm9ybS4NCmVjaG86DQpjYWxsIDpka19jb2xvciAlR3JheSUgIklmIHlvdSB3YW50IHRvIHJlc2V0IHRoZSBhY3RpdmF0aW9uIHN0YXR1 cywiDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIiVfZml4bXNnJSINCmVjaG86DQoNCmdvdG8gOmRrX2RvbmUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjp0c19yZXNldA0KDQpzZXQga2V5PQ0Kc2V0IF9vUm9vdD0NCnNldCBfb0FyY2g9DQpzZXQgX29JZHM9DQpz ZXQgX29MUGF0aD0NCnNldCBfYWN0aWQ9DQpzZXQgX3Byb2Q9DQpzZXQgX2xpYz0NCnNldCBfYXJyPQ0Kc2V0IF9wcmlkcz0NCnNldCBfY29uZmlnPQ0Kc2V0 IF92ZXJzaW9uPQ0Kc2V0IF9MaWNlbnNlPQ0Kc2V0IF9vTVNJPQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0NCg0KOnRzX2dldHBhdGgNCg0Kc2V0IG8xNmMycj0NCnNldCBvMTVjMnI9DQpzZXQgbzE2bXNpPQ0Kc2V0IG8xNW1zaT0NCg0Kc2V0IF82OD1I S0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2UNCnNldCBfODY9SEtMTVxTT0ZUV0FSRVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcT2ZmaWNlDQoNCmZvciAv ZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzg2JVxDbGlja1RvUnVuIC92IEluc3RhbGxQYXRoIiAlbnVsNiUnKSBkbyBpZiBl eGlzdCAiJSViXHJvb3RcTGljZW5zZXMxNlxQcm9QbHVzKi54cm0tbXMiICAgIChzZXQgbzE2YzJyPTEmc2V0IG8xNmMycl9yZWc9JV84NiVcQ2xpY2tUb1J1 bikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzY4JVxDbGlja1RvUnVuIC92IEluc3RhbGxQYXRoIiAlbnVsNiUn KSBkbyBpZiBleGlzdCAiJSViXHJvb3RcTGljZW5zZXMxNlxQcm9QbHVzKi54cm0tbXMiICAgIChzZXQgbzE2YzJyPTEmc2V0IG8xNmMycl9yZWc9JV82OCVc Q2xpY2tUb1J1bikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzg2JVwxNS4wXENsaWNrVG9SdW4gL3YgSW5zdGFs bFBhdGgiICVudWw2JScpIGRvIGlmIGV4aXN0ICIlJWJccm9vdFxMaWNlbnNlc1xQcm9QbHVzKi54cm0tbXMiIChzZXQgbzE1YzJyPTEmc2V0IG8xNWMycl9y ZWc9JV84NiVcMTUuMFxDbGlja1RvUnVuKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVfNjglXDE1LjBcQ2xpY2tU b1J1biAvdiBJbnN0YWxsUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzXFByb1BsdXMqLnhybS1tcyIgKHNldCBvMTVjMnI9 MSZzZXQgbzE1YzJyX3JlZz0lXzY4JVwxNS4wXENsaWNrVG9SdW4pDQoNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAl Xzg2JVwxNi4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0IG8xNm1zaT0x JnNldCBvMTZtc2lfcmVnPSVfODYlXDE2LjApDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV82OCVcMTYuMFxDb21t b25cSW5zdGFsbFJvb3QgL3YgUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlwqUGlja2VyLmRsbCIgKHNldCBvMTZtc2k9MSZzZXQgbzE2bXNpX3Jl Zz0lXzY4JVwxNi4wKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVfODYlXDE1LjBcQ29tbW9uXEluc3RhbGxSb290 IC92IFBhdGgiICVudWw2JScpIGRvIGlmIGV4aXN0ICIlJWJcKlBpY2tlci5kbGwiIChzZXQgbzE1bXNpPTEmc2V0IG8xNW1zaV9yZWc9JV84NiVcMTUuMCkN CmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzY4JVwxNS4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVs NiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0IG8xNW1zaT0xJnNldCBvMTVtc2lfcmVnPSVfNjglXDE1LjApDQoNCmV4aXQgL2INCg0K Ojo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjp0c19wcm9jZXNzDQoNCmlmIG5vdCBleGlzdCAiJXBrZXlwYXRo JSIgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIHBrZXljb25maWctb2ZmaWNlLnhybS1tcyAgICAgICBbTm90IGZvdW5kLiBBYm9ydGluZyBh Y3RpdmF0aW9uLi4uXSINCnNldCBlcnJvcj0xDQpleGl0IC9iDQopDQoNCmZvciAlJSMgaW4gKCVfb0lkcyUpIGRvICgNCnNldCBfYWN0aWQ9DQpzZXQgX3By ZXZpZXc9DQpzZXQgX0xpY2Vuc2U9JSUjDQoNCnNldCBza2lwcHJvY2Vzcz0NCg0Kc2V0IGZvdW5kcHJvZD0NCmNhbGwgOnRza3NkYXRhIGNoa3Byb2QgJSUj DQppZiBkZWZpbmVkIF9vTVNJIGlmIG5vdCBkZWZpbmVkIGZvdW5kcHJvZCBpZiAvaSAldHNtZXRob2QlPT1LTVM0ayAoDQpzZXQgc2tpcHByb2Nlc3M9MQ0K Y2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFByb2R1Y3QgSW4gU2NyaXB0ICAgICAgICAgICAgICBbJSUjIE1TSSBSZXRhaWwgaXMgbm90IHN1cHBv cnRlZCB3aXRoIEtNUzRrXSINCmlmIC9pICVfYWN0bWV0aG9kJT09QXV0byAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkNvbm5lY3QgdG8gdGhlIEludGVy bmV0IGFuZCB0cnkgYWdhaW4uIFNjcmlwdCB3aWxsIHVzZSB0aGUgU3RhdGljQ0lEIGFjdGl2YXRpb24gbWV0aG9kLiINCikgZWxzZSAoDQpjYWxsIDpka19j b2xvciAlQmx1ZSUgIlVzZSBub24tS01TNEsgYWN0aXZhdGlvbiBvcHRpb25zIGZyb20gdGhlIHByZXZpb3VzIG1lbnUuIg0KKQ0KKQ0KDQppZiAiJV9hY3Rw cm9qdmlzJSI9PSIxIiAoDQplY2hvICUlIyB8IGZpbmRzdHIgL2kgIlByb2plY3QgVmlzaW8iICVudWwlIHx8ICgNCnNldCBza2lwcHJvY2Vzcz0xDQpjYWxs IDpka19jb2xvciAlR3JheSUgIlNraXBwaW5nIEJlY2F1c2UgUHJvamVjdC9WaXNpbyBNb2RlICAgICBbJSUjXSINCikNCikNCg0KaWYgIiVfYWN0cHJvanZp cyUiPT0iMCIgaWYgL2kgJXRzbWV0aG9kJT09S01TNGsgZWNobyAlX29JZHMlIHwgZmluZHN0ciAvaSAiTzM2NSIgJW51bCUgJiYgKA0KZWNobyAlJSMgfCBm aW5kc3RyIC9pICJQcm9qZWN0IFZpc2lvIiAlbnVsJSAmJiAoDQpzZXQgc2tpcHByb2Nlc3M9MQ0KZWNobyBTa2lwcGluZyBCZWNhdXNlIE1vbmRvIElzIEF2 YWlsYWJsZSAgICAgWyUlI10NCikNCikNCg0KDQppZiBub3QgZGVmaW5lZCBza2lwcHJvY2VzcyAoDQoNCmlmIC9pIG5vdCAldHNtZXRob2QlPT1LTVM0ayAo DQpzZXQgbm8zNjU9DQppZiAiJW9WZXIlIj09IjE1IiAoZWNobyAlJSMgfCBmaW5kc3RyIC9pICJPMzY1SG9tZVByZW1SZXRhaWwiICVudWwlICYmIHNldCBu bzM2NT0xKQ0KaWYgIiVvVmVyJSI9PSIxNiIgKGVjaG8gJSUjIHwgZmluZHN0ciAvaSAiTzM2NSIgJW51bCUgJiYgc2V0IG5vMzY1PTEpDQoNCmlmIGRlZmlu ZWQgbm8zNjUgKA0Kc2V0IF9MaWNlbnNlPU1vbmRvUmV0YWlsDQpzZXQgX2FsdG9mZmlkPU1vbmRvUmV0YWlsDQpjYWxsIDprc19vc3BwcmVhZHkNCmVjaG8g Q29udmVydGluZyBVbnN1cHBvcnRlZCBPMzY1IE9mZmljZSAgICAgIFslJSMgVG8gTW9uZG9SZXRhaWxdDQppZiAiJW9WZXIlIj09IjE1IiAoY2FsbCA6ZGtf Y29sb3IgJUdyYXklICJNb25kbyAyMDEzIGlzIGVxdWl2YWxlbnQgdG8gTzM2NSBbMTUuMCB2ZXJzaW9uXSBpbiB0ZXJtcyBvZiB0aGUgbGF0ZXN0IGZlYXR1 cmVzLiIpDQppZiAiJW9WZXIlIj09IjE2IiAoY2FsbCA6ZGtfY29sb3IgJUdyYXklICJNb25kbyAyMDE2IGlzIGVxdWl2YWxlbnQgdG8gTzM2NSBpbiB0ZXJt cyBvZiB0aGUgbGF0ZXN0IGZlYXR1cmVzLiIpDQopDQoNCmlmIG5vdCBkZWZpbmVkIF9vTVNJICgNCmVjaG8gJSUjIHwgZmluZHN0ciAvaSAiQVJNIiAlbnVs JSAmJiAoDQpzZXQgX0xpY2Vuc2U9TW9uZG9SZXRhaWwNCnNldCBfYWx0b2ZmaWQ9TW9uZG9SZXRhaWwNCmNhbGwgOmtzX29zcHByZWFkeQ0KZWNobyBDb252 ZXJ0aW5nIFVuc3VwcG9ydGVkIE9FTS1BUk0gT2ZmaWNlICAgWyUlIyBUbyBNb25kb1JldGFpbF0NCikNCikNCikNCg0KaWYgbm90IGRlZmluZWQgX29NU0kg aWYgL2kgJXRzbWV0aG9kJT09S01TNGsgaWYgbm90IGRlZmluZWQgZm91bmRwcm9kICgNCmNhbGwgOnRza3NkYXRhIGdldGluZm8gJSUjDQppZiBkZWZpbmVk IF9hbHRvZmZpZCAoDQplY2hvIENvbnZlcnRpbmcgUmV0YWlsIFRvIFZvbHVtZSAgICAgICAgICAgICBbJSUjIFRvICFfYWx0b2ZmaWQhXQ0KKSBlbHNlICgN CnNldCBfTGljZW5zZT1Nb25kb1ZvbHVtZQ0Kc2V0IF9hbHRvZmZpZD1Nb25kb1ZvbHVtZQ0KZWNobyBDb252ZXJ0aW5nIFJldGFpbCBUbyBWb2x1bWUgICAg ICAgICAgICAgWyUlIyBUbyAhX2FsdG9mZmlkIV0gW1VzaW5nIE1vbmRvIGJlY2F1c2UgJSUjIGlzIG5vdCBmb3VuZCBpbiB0aGUgc2NyaXB0XQ0KKQ0KZWNo byAlJSMgfCBmaW5kIC9pICJPMzY1IiAlbnVsJSAmJiAoDQppZiAiJW9WZXIlIj09IjE1IiAoY2FsbCA6ZGtfY29sb3IgJUdyYXklICJNb25kbyAyMDEzIGlz IGVxdWl2YWxlbnQgdG8gTzM2NSBbMTUuMCB2ZXJzaW9uXSBpbiB0ZXJtcyBvZiB0aGUgbGF0ZXN0IGZlYXR1cmVzLiIpDQppZiAiJW9WZXIlIj09IjE2IiAo Y2FsbCA6ZGtfY29sb3IgJUdyYXklICJNb25kbyAyMDE2IGlzIGVxdWl2YWxlbnQgdG8gTzM2NSBpbiB0ZXJtcyBvZiB0aGUgbGF0ZXN0IGZlYXR1cmVzLiIp DQopDQpjYWxsIDprc19vc3BwcmVhZHkNCikNCg0KaWYgL2kgJXRzbWV0aG9kJT09S01TNGsgKA0KZWNobyAhX0xpY2Vuc2UhIHwgZmluZCAvaSAiUmV0YWls IiAlbnVsJSAmJiAoc2V0IGtleXR5cGU9emVybykgfHwgKHNldCBrZXl0eXBlPWtzKQ0KKSBlbHNlICgNCnNldCBrZXl0eXBlPXplcm8NCikNCg0KZm9yIC9m ICJkZWxpbXM9IiAlJWEgaW4gKCclcHNjJSAiJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAnOm9mZnRzaWRcOi4qJzsuIChb c2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKSIgJW51bDYlJykgZG8gKA0KZWNobyAiJSVhIiB8IGZpbmRzdHIgL3IgIi4qLS4qLS4qLS4qLS4qIiAlbnVs MSUgJiYgKHNldCB0c2lkcz0hdHNpZHMhICUlYSYgc2V0IF9hY3RpZD0lJWEpDQopDQpzZXQgIl9hbGxhY3RpZD0hdHNpZHMhIg0KDQppZiBkZWZpbmVkIF9h Y3RpZCAoDQplY2hvIENoZWNraW5nIEFjdGl2YXRpb24gSUQgICAgICAgICAgICAgICAgICBbIV9hY3RpZCFdIFshX0xpY2Vuc2UhXQ0KKSBlbHNlICgNCmNh bGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBBY3RpdmF0aW9uIElEICAgICAgICAgICAgICAgICAgW09mZmljZSAlb1ZlciUuMCAhX0xpY2Vuc2UhIG5v dCBmb3VuZF0iDQpzZXQgZXJyb3I9MQ0Kc2V0IHNob3dmaXg9MQ0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9y MiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQopDQoNCmVjaG8gJSUjIHwg ZmluZCAvaSAiMjAyNCIgJW51bCUgJiYgKA0KaWYgZXhpc3QgIiFfb0xQYXRoIVxQcm9QbHVzMjAyNFByZXZpZXdWTF8qLnhybS1tcyIgaWYgbm90IGV4aXN0 ICIhX29MUGF0aCFcUHJvUGx1czIwMjRWTF8qLnhybS1tcyIgc2V0IF9wcmV2aWV3PTENCikNCg0KaWYgZGVmaW5lZCBfYWN0aWQgKA0KZWNobyAiIWFsbGFw cHMhIiB8IGZpbmQgL2kgIiFfYWN0aWQhIiAlbnVsMSUgfHwgY2FsbCA6b2hfaW5zdGFsbGxpYw0KKQ0KKQ0KKQ0KDQo6OiAgQWRkIFNoYXJlZENvbXB1dGVy TGljZW5zaW5nIHJlZ2lzdHJ5IGtleSBpZiBSZXRhaWwgT2ZmaWNlIEMyUiBpcyBpbnN0YWxsZWQgb24gV2luZG93cyBTZXJ2ZXINCjo6ICBodHRwczovL2xl YXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvb2ZmaWNlL3Ryb3VibGVzaG9vdC9vZmZpY2Utc3VpdGUtaXNzdWVzL2NsaWNrLXRvLXJ1bi1vZmZpY2Utb24tdGVy bWluYWwtc2VydmVyDQoNCmlmIC9pIG5vdCAldHNtZXRob2QlPT1LTVM0ayBpZiBkZWZpbmVkIHdpbnNlcnZlciBpZiBkZWZpbmVkIF9jb25maWcgaWYgZXhp c3QgIiVfb0xQYXRoJVxXb3JkMjAxOVZMX0tNU19DbGllbnRfQUUqLnhybS1tcyIgKA0KZWNobyAlX29JZHMlIHwgZmluZCAvaSAiUmV0YWlsIiAlbnVsMSUg JiYgKA0Kc2V0IHNjYUlzTmVlZGVkPTENCnJlZyBhZGQgJV9jb25maWclIC92IFNoYXJlZENvbXB1dGVyTGljZW5zaW5nIC90IFJFR19TWiAvZCAiMSIgL2Yg JW51bDElDQplY2hvIEFkZGluZyBTaGFyZWRDb21wdXRlckxpY2Vuc2luZyBSZWcgICAgICBbU3VjY2Vzc2Z1bF0gW05lZWRlZCBvbiBTZXJ2ZXIgV2l0aCBS ZXRhaWwgT2ZmaWNlXSINCikNCikNCg0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnRz X3Byb2Nlc3Ntc2kNCg0KOjogIFByb2Nlc3MgT2ZmaWNlIE1TSSBWZXJzaW9uDQoNCmNhbGwgOnRzX3Jlc2V0DQpjYWxsIDpka19hY3RpZHMgMGZmMWNlMTUt YTk4OS00NzlkLWFmNDYtZjI3NWM2MzcwNjYzDQoNCnNldCBfb01TST0xDQpzZXQgb1Zlcj0lMQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4g KCcicmVnIHF1ZXJ5ICUyXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyAoc2V0ICJfb1Jvb3Q9JSViIikNCmZvciAvZiAic2tpcD0y IHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlMlxDb21tb25cUHJvZHVjdFZlcnNpb24gL3YgTGFzdFByb2R1Y3QiICVudWw2JScpIGRvIChzZXQg Il92ZXJzaW9uPSUlYiIpDQppZiAiJV9vUm9vdDp+LTElIj09IlwiIHNldCAiX29Sb290PSVfb1Jvb3Q6fjAsLTElIg0KDQplY2hvICIlMiIgfCBmaW5kIC9p ICJXb3c2NDMyTm9kZSIgJW51bDElICYmIHNldCBfb0FyY2g9eDg2DQppZiBub3QgIiVvc2FyY2glIj09Ing4NiIgaWYgbm90IGRlZmluZWQgX29BcmNoIHNl dCBfb0FyY2g9eDY0DQppZiAiJW9zYXJjaCUiPT0ieDg2IiBzZXQgX29BcmNoPXg4Ng0KDQpzZXQgIl9jb21tb249JUNvbW1vblByb2dyYW1GaWxlcyUiDQpp ZiBkZWZpbmVkIFBST0NFU1NPUl9BUkNISVRFVzY0MzIgc2V0ICJfY29tbW9uPSVDb21tb25Qcm9ncmFtVzY0MzIlIg0Kc2V0ICJfY29tbW9uMj0lQ29tbW9u UHJvZ3JhbUZpbGVzKHg4NiklIg0KDQppZiBleGlzdCAiJV9jb21tb24lXE1pY3Jvc29mdCBTaGFyZWRcT0ZGSUNFJW9WZXIlXE9mZmljZSBTZXR1cCBDb250 cm9sbGVyXHBrZXljb25maWctb2ZmaWNlLnhybS1tcyIgKA0Kc2V0ICJwa2V5cGF0aD0lX2NvbW1vbiVcTWljcm9zb2Z0IFNoYXJlZFxPRkZJQ0Ulb1ZlciVc T2ZmaWNlIFNldHVwIENvbnRyb2xsZXJccGtleWNvbmZpZy1vZmZpY2UueHJtLW1zIg0KKSBlbHNlIGlmIGV4aXN0ICIlX2NvbW1vbjIlXE1pY3Jvc29mdCBT aGFyZWRcT0ZGSUNFJW9WZXIlXE9mZmljZSBTZXR1cCBDb250cm9sbGVyXHBrZXljb25maWctb2ZmaWNlLnhybS1tcyIgKA0Kc2V0ICJwa2V5cGF0aD0lX2Nv bW1vbjIlXE1pY3Jvc29mdCBTaGFyZWRcT0ZGSUNFJW9WZXIlXE9mZmljZSBTZXR1cCBDb250cm9sbGVyXHBrZXljb25maWctb2ZmaWNlLnhybS1tcyINCikN Cg0KY2FsbCA6bXNpb2ZmaWNlZGF0YSAlMg0KDQplY2hvOg0KZWNobyBQcm9jZXNzaW5nIE9mZmljZS4uLiAgICAgICAgICAgICAgICAgICAgW01TSSBefCAl X3ZlcnNpb24lIF58ICVfb0FyY2glXQ0KDQppZiBub3QgZGVmaW5lZCBfb0lkcyAoDQpzZXQgZXJyb3I9MQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNr aW5nIEluc3RhbGxlZCBQcm9kdWN0cyAgICAgICAgICAgICBbUHJvZHVjdCBJRHMgbm90IGZvdW5kLiBBYm9ydGluZyBhY3RpdmF0aW9uLi4uXSINCmV4aXQg L2INCikNCg0KY2FsbCA6dHNfcHJvY2Vzcw0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0K OjogIEdldCBXaW5kb3dzIHBlcm1hbmVudCBhY3RpdmF0aW9uIHN0YXR1cyAobm90IGNvdW50aW5nIGNzdmxrKQ0KDQo6dHNfY2hlY2t3aW5wZXJtDQoNCiVw c2MlICJHZXQtV21pT2JqZWN0IC1RdWVyeSAnU0VMRUNUIE5hbWUsIERlc2NyaXB0aW9uIEZST00gU29mdHdhcmVMaWNlbnNpbmdQcm9kdWN0IFdIRVJFIExp Y2Vuc2VTdGF0dXM9JycxJycgQU5EIEdyYWNlUGVyaW9kUmVtYWluaW5nPScnMCcnIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVMTCBBTkQgTGlj ZW5zZURlcGVuZHNPbiBJUyBOVUxMJyB8IFdoZXJlLU9iamVjdCB7ICRfLkRlc2NyaXB0aW9uIC1ub3RtYXRjaCAnS01TJyB9IHwgU2VsZWN0LU9iamVjdCAt UHJvcGVydHkgTmFtZSIgJW51bDIlIHwgZmluZHN0ciAvaSAiV2luZG93cyIgJW51bDElICYmIHNldCBfcGVybT0xfHxzZXQgX3Blcm09DQpleGl0IC9iDQoN Cjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6dHNmb3JnZToNCiRzcmMgPSBAJw0KI2lmICFQT1dFUlNIRUxM Mg0KbmFtZXNwYWNlIEFjdGl2YXRpb25Xcw0Kew0KDQovKg0KDQpUaGlzIGNvZGUgaXMgYWRhcHRlZCBmcm9tIEFjdGl2YXRpb25Xcy4NCk9yaWdpbmFsIFJl cG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYWRvcm5lci1tc2Z0L2FjdGl2YXRpb253cw0KDQpNSVQgTGljZW5zZQ0KDQpDb3B5cmlnaHQgKGMpIERh bmllbCBEb3JuZXINCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29w eQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5 LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJt aXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u czoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsDQpjb3Bp ZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBX QVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN RVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBU SEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQ0KU09GVFdBUkUuDQoNCiovDQoNCnVzaW5nIFN5c3RlbTsNCnVz aW5nIFN5c3RlbS5JTzsNCnVzaW5nIFN5c3RlbS5MaW5xOw0KdXNpbmcgU3lzdGVtLk5ldDsNCnVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHk7 DQp1c2luZyBTeXN0ZW0uVGV4dDsNCnVzaW5nIFN5c3RlbS5YbWwuTGlucTsNCg0KICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWN0aXZhdGlvbkhlbHBlciB7 DQogICAgICAgIC8vIEtleSBmb3IgSE1BQy9TSEEyNTYgc2lnbmF0dXJlLg0KICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW10gTWFjS2V5 ID0gbmV3IGJ5dGVbNjRdIHsNCiAgICAgICAgICAgIDI1NCwgIDQ5LCAxNTIsIDExNywgMjUxLCAgNzIsIDEzMiwgMTM0LA0KICAgICAgICAgICAgMTU2LCAy NDMsIDI0MSwgMjA2LCAxNTMsIDE2OCwgMTQ0LCAxMDAsDQogICAgICAgICAgICAxNzEsICA4NywgIDMxLCAyMDIsICA3MSwgICA0LCAgODAsICA4OCwNCiAg ICAgICAgICAgIDQ4LCAgIDM2LCAyMjYsICAyMCwgIDk4LCAxMzUsIDEyMSwgMTYwLA0KICAgICAgICAgICAgMCwgICAgIDAsICAgMCwgICAwLCAgIDAsICAg MCwgICAwLCAgIDAsDQogICAgICAgICAgICAwLCAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwNCiAgICAgICAgICAgIDAsICAgICAwLCAg IDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLA0KICAgICAgICAgICAgMCwgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDANCiAgICAgICAg fTsNCg0KICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBBY3Rpb24gPSAiaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL0JhdGNoQWN0aXZhdGlvblNlcnZp Y2UvQmF0Y2hBY3RpdmF0ZSI7DQoNCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVXJpIFVyaSA9IG5ldyBVcmkoImh0dHBzOi8vYWN0aXZhdGlv bi5zbHMubWljcm9zb2Z0LmNvbS9CYXRjaEFjdGl2YXRpb24vQmF0Y2hBY3RpdmF0aW9uLmFzbXgiKTsNCg0KICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFk b25seSBYTmFtZXNwYWNlIFNvYXBTY2hlbWFOcyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlLyI7DQogICAgICAgIHByaXZh dGUgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgWG1sU2NoZW1hSW5zdGFuY2VOcyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0 YW5jZSI7DQogICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgWG1sU2NoZW1hTnMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9Y TUxTY2hlbWEiOw0KICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIEJhdGNoQWN0aXZhdGlvblNlcnZpY2VOcyA9ICJodHRwOi8v d3d3Lm1pY3Jvc29mdC5jb20vQmF0Y2hBY3RpdmF0aW9uU2VydmljZSI7DQogICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFhOYW1lc3BhY2UgQmF0 Y2hBY3RpdmF0aW9uUmVxdWVzdE5zID0gImh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9EUk0vU0wvQmF0Y2hBY3RpdmF0aW9uUmVxdWVzdC8xLjAiOw0KICAg ICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBYTmFtZXNwYWNlIEJhdGNoQWN0aXZhdGlvblJlc3BvbnNlTnMgPSAiaHR0cDovL3d3dy5taWNyb3NvZnQu Y29tL0RSTS9TTC9CYXRjaEFjdGl2YXRpb25SZXNwb25zZS8xLjAiOw0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIENhbGxXZWJTZXJ2aWNlKGlu dCByZXF1ZXN0VHlwZSwgc3RyaW5nIGluc3RhbGxhdGlvbklkLCBzdHJpbmcgZXh0ZW5kZWRQcm9kdWN0SWQpIHsNCiAgICAgICAgICAgIFhEb2N1bWVudCBz b2FwUmVxdWVzdCA9IENyZWF0ZVNvYXBSZXF1ZXN0KHJlcXVlc3RUeXBlLCBpbnN0YWxsYXRpb25JZCwgZXh0ZW5kZWRQcm9kdWN0SWQpOw0KICAgICAgICAg ICAgSHR0cFdlYlJlcXVlc3Qgd2ViUmVxdWVzdCA9IENyZWF0ZVdlYlJlcXVlc3Qoc29hcFJlcXVlc3QpOw0KICAgICAgICAgICAgWERvY3VtZW50IHNvYXBS ZXNwb25zZSA9IG5ldyBYRG9jdW1lbnQoKTsNCg0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQg PSB3ZWJSZXF1ZXN0LkJlZ2luR2V0UmVzcG9uc2UobnVsbCwgbnVsbCk7DQogICAgICAgICAgICAgICAgYXN5bmNSZXN1bHQuQXN5bmNXYWl0SGFuZGxlLldh aXRPbmUoKTsNCg0KICAgICAgICAgICAgICAgIC8vIFJlYWQgZGF0YSBmcm9tIHRoZSByZXNwb25zZSBzdHJlYW0uDQogICAgICAgICAgICAgICAgdXNpbmcg KFdlYlJlc3BvbnNlIHdlYlJlc3BvbnNlID0gd2ViUmVxdWVzdC5FbmRHZXRSZXNwb25zZShhc3luY1Jlc3VsdCkpDQogICAgICAgICAgICAgICAgdXNpbmcg KFN0cmVhbVJlYWRlciBzdHJlYW1SZWFkZXIgPSBuZXcgU3RyZWFtUmVhZGVyKHdlYlJlc3BvbnNlLkdldFJlc3BvbnNlU3RyZWFtKCkpKSB7DQogICAgICAg ICAgICAgICAgICAgIHNvYXBSZXNwb25zZSA9IFhEb2N1bWVudC5QYXJzZShzdHJlYW1SZWFkZXIuUmVhZFRvRW5kKCkpOw0KICAgICAgICAgICAgICAgIH0N Cg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVNvYXBSZXNwb25zZShzb2FwUmVzcG9uc2UpOw0KDQogICAgICAgICAgICB9IGNhdGNoIHsNCiAgICAg ICAgICAgICAgICB0aHJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHByaXZhdGUgc3RhdGljIFhEb2N1bWVudCBDcmVhdGVTb2Fw UmVxdWVzdChpbnQgcmVxdWVzdFR5cGUsIHN0cmluZyBpbnN0YWxsYXRpb25JZCwgc3RyaW5nIGV4dGVuZGVkUHJvZHVjdElkKSB7DQogICAgICAgICAgICAv LyBDcmVhdGUgYW4gYWN0aXZhdGlvbiByZXF1ZXN0LiAgICAgICAgICAgDQogICAgICAgICAgICBYRWxlbWVudCBhY3RpdmF0aW9uUmVxdWVzdCA9IG5ldyBY RWxlbWVudChCYXRjaEFjdGl2YXRpb25SZXF1ZXN0TnMgKyAiQWN0aXZhdGlvblJlcXVlc3QiLA0KICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChCYXRj aEFjdGl2YXRpb25SZXF1ZXN0TnMgKyAiVmVyc2lvbk51bWJlciIsICIyLjAiKSwNCiAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQmF0Y2hBY3RpdmF0 aW9uUmVxdWVzdE5zICsgIlJlcXVlc3RUeXBlIiwgcmVxdWVzdFR5cGUpLA0KICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChCYXRjaEFjdGl2YXRpb25S ZXF1ZXN0TnMgKyAiUmVxdWVzdHMiLA0KICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQmF0Y2hBY3RpdmF0aW9uUmVxdWVzdE5zICsgIlJlcXVl c3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEJhdGNoQWN0aXZhdGlvblJlcXVlc3ROcyArICJQSUQiLCBleHRlbmRlZFByb2R1 Y3RJZCksDQogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VHlwZSA9PSAxID8gbmV3IFhFbGVtZW50KEJhdGNoQWN0aXZhdGlvblJlcXVlc3ROcyAr ICJJSUQiLCBpbnN0YWxsYXRpb25JZCkgOiBudWxsKQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgIC8vIEdldCB0 aGUgdW5pY29kZSBieXRlIGFycmF5IG9mIGFjdGl2YXRpb25SZXF1ZXN0IGFuZCBjb252ZXJ0IGl0IHRvIEJhc2U2NC4NCiAgICAgICAgICAgIGJ5dGVbXSBi eXRlcyA9IEVuY29kaW5nLlVuaWNvZGUuR2V0Qnl0ZXMoYWN0aXZhdGlvblJlcXVlc3QuVG9TdHJpbmcoKSk7DQogICAgICAgICAgICBzdHJpbmcgcmVxdWVz dFhtbCA9IENvbnZlcnQuVG9CYXNlNjRTdHJpbmcoYnl0ZXMpOw0KDQogICAgICAgICAgICBYRG9jdW1lbnQgc29hcFJlcXVlc3QgPSBuZXcgWERvY3VtZW50 KCk7DQoNCiAgICAgICAgICAgIHVzaW5nIChITUFDU0hBMjU2IGhNQUNTSEEgPSBuZXcgSE1BQ1NIQTI1NihNYWNLZXkpKSB7DQogICAgICAgICAgICAgICAg Ly8gQ29udmVydCB0aGUgSE1BQyBoYXNoZWQgZGF0YSB0byBCYXNlNjQuDQogICAgICAgICAgICAgICAgc3RyaW5nIGRpZ2VzdCA9IENvbnZlcnQuVG9CYXNl NjRTdHJpbmcoaE1BQ1NIQS5Db21wdXRlSGFzaChieXRlcykpOw0KDQogICAgICAgICAgICAgICAgc29hcFJlcXVlc3QgPSBuZXcgWERvY3VtZW50KA0KICAg ICAgICAgICAgICAgIG5ldyBYRGVjbGFyYXRpb24oIjEuMCIsICJVVEYtOCIsICJubyIpLA0KICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChTb2FwU2No ZW1hTnMgKyAiRW52ZWxvcGUiLA0KICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInNvYXAiLCBTb2FwU2No ZW1hTnMpLA0KICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInhzaSIsIFhtbFNjaGVtYUluc3RhbmNlTnMp LA0KICAgICAgICAgICAgICAgICAgICBuZXcgWEF0dHJpYnV0ZShYTmFtZXNwYWNlLlhtbG5zICsgInhzZCIsIFhtbFNjaGVtYU5zKSwNCiAgICAgICAgICAg ICAgICAgICAgbmV3IFhFbGVtZW50KFNvYXBTY2hlbWFOcyArICJCb2R5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBYRWxlbWVudChCYXRjaEFj dGl2YXRpb25TZXJ2aWNlTnMgKyAiQmF0Y2hBY3RpdmF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEJhdGNoQWN0aXZh dGlvblNlcnZpY2VOcyArICJyZXF1ZXN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFhFbGVtZW50KEJhdGNoQWN0aXZhdGlvblNl cnZpY2VOcyArICJEaWdlc3QiLCBkaWdlc3QpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgWEVsZW1lbnQoQmF0Y2hBY3RpdmF0aW9u U2VydmljZU5zICsgIlJlcXVlc3RYbWwiLCByZXF1ZXN0WG1sKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAg ICAgICkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICkpOw0KDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiBz b2FwUmVxdWVzdDsNCiAgICAgICAgfQ0KDQogICAgICAgIHByaXZhdGUgc3RhdGljIEh0dHBXZWJSZXF1ZXN0IENyZWF0ZVdlYlJlcXVlc3QoWERvY3VtZW50 IHNvYXBSZXF1ZXN0KSB7DQogICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCB3ZWJSZXF1ZXN0ID0gKEh0dHBXZWJSZXF1ZXN0KVdlYlJlcXVlc3QuQ3JlYXRl KFVyaSk7DQogICAgICAgICAgICB3ZWJSZXF1ZXN0LkFjY2VwdCA9ICJ0ZXh0L3htbCI7DQogICAgICAgICAgICB3ZWJSZXF1ZXN0LkNvbnRlbnRUeXBlID0g InRleHQveG1sOyBjaGFyc2V0PVwidXRmLThcIiI7DQogICAgICAgICAgICB3ZWJSZXF1ZXN0LkhlYWRlcnMuQWRkKCJTT0FQQWN0aW9uIiwgQWN0aW9uKTsN CiAgICAgICAgICAgIHdlYlJlcXVlc3QuSG9zdCA9ICJhY3RpdmF0aW9uLnNscy5taWNyb3NvZnQuY29tIjsNCiAgICAgICAgICAgIHdlYlJlcXVlc3QuTWV0 aG9kID0gIlBPU1QiOw0KDQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIC8vIEluc2VydCBTT0FQIGVudmVsb3BlDQogICAgICAgICAgICAg ICAgdXNpbmcgKFN0cmVhbSBzdHJlYW0gPSB3ZWJSZXF1ZXN0LkdldFJlcXVlc3RTdHJlYW0oKSkgew0KICAgICAgICAgICAgICAgICAgICBzb2FwUmVxdWVz dC5TYXZlKHN0cmVhbSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHdlYlJlcXVlc3Q7DQoNCiAgICAgICAgICAgIH0g Y2F0Y2ggew0KICAgICAgICAgICAgICAgIHRocm93Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5n IFBhcnNlU29hcFJlc3BvbnNlKFhEb2N1bWVudCBzb2FwUmVzcG9uc2UpIHsNCiAgICAgICAgICAgIGlmIChzb2FwUmVzcG9uc2UgPT0gbnVsbCkgew0KICAg ICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInNvYXBSZXNwb25zZSIsICJUaGUgcmVtb3RlIHNlcnZlciByZXR1cm5lZCBh biB1bmV4cGVjdGVkIHJlc3BvbnNlLiIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIXNvYXBSZXNwb25zZS5EZXNjZW5kYW50cyhCYXRj aEFjdGl2YXRpb25TZXJ2aWNlTnMgKyAiUmVzcG9uc2VYbWwiKS5BbnkoKSkgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSBy ZW1vdGUgc2VydmVyIHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgcmVzcG9uc2UiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdHJ5IHsNCiAgICAg ICAgICAgICAgICBYRG9jdW1lbnQgcmVzcG9uc2VYbWwgPSBYRG9jdW1lbnQuUGFyc2Uoc29hcFJlc3BvbnNlLkRlc2NlbmRhbnRzKEJhdGNoQWN0aXZhdGlv blNlcnZpY2VOcyArICJSZXNwb25zZVhtbCIpLkZpcnN0KCkuVmFsdWUpOw0KDQogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlWG1sLkRlc2NlbmRhbnRz KEJhdGNoQWN0aXZhdGlvblJlc3BvbnNlTnMgKyAiRXJyb3JDb2RlIikuQW55KCkpIHsNCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVycm9yQ29kZSA9 IHJlc3BvbnNlWG1sLkRlc2NlbmRhbnRzKEJhdGNoQWN0aXZhdGlvblJlc3BvbnNlTnMgKyAiRXJyb3JDb2RlIikuRmlyc3QoKS5WYWx1ZTsNCg0KICAgICAg ICAgICAgICAgICAgICBzd2l0Y2ggKGVycm9yQ29kZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiMHg3RiI6DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIE11bHRpcGxlIEFjdGl2YXRpb24gS2V5IGhhcyBleGNlZWRlZCBpdHMgbGltaXQiKTsNCg0K ICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiMHg2NyI6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhl IHByb2R1Y3Qga2V5IGhhcyBiZWVuIGJsb2NrZWQiKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiMHg2OCI6DQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBwcm9kdWN0IGtleSIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIw eDg2IjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGtleSB0eXBlIik7DQoNCiAgICAgICAgICAg ICAgICAgICAgICAgIGNhc2UgIjB4OTAiOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlBsZWFzZSBjaGVjayB0 aGUgSW5zdGFsbGF0aW9uIElEIGFuZCB0cnkgYWdhaW4iKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRoZSByZW1vdGUgc2VydmVyIHJlcG9ydGVkIGFuIGVycm9yICh7MH0pIiwg ZXJyb3JDb2RlKSk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2VYbWwuRGVzY2VuZGFudHMo QmF0Y2hBY3RpdmF0aW9uUmVzcG9uc2VOcyArICJSZXNwb25zZVR5cGUiKS5BbnkoKSkgew0KICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVzcG9uc2VU eXBlID0gcmVzcG9uc2VYbWwuRGVzY2VuZGFudHMoQmF0Y2hBY3RpdmF0aW9uUmVzcG9uc2VOcyArICJSZXNwb25zZVR5cGUiKS5GaXJzdCgpLlZhbHVlOw0K DQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIxIjoNCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29uZmlybWF0aW9uSWQgPSByZXNwb25zZVhtbC5EZXNjZW5kYW50cyhCYXRjaEFjdGl2YXRpb25SZXNwb25z ZU5zICsgIkNJRCIpLkZpcnN0KCkuVmFsdWU7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpcm1hdGlvbklkOw0KDQogICAgICAg ICAgICAgICAgICAgICAgICBjYXNlICIyIjoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWN0aXZhdGlvbnNSZW1haW5pbmcgPSByZXNw b25zZVhtbC5EZXNjZW5kYW50cyhCYXRjaEFjdGl2YXRpb25SZXNwb25zZU5zICsgIkFjdGl2YXRpb25SZW1haW5pbmciKS5GaXJzdCgpLlZhbHVlOw0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3RpdmF0aW9uc1JlbWFpbmluZzsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgcmVtb3RlIHNlcnZlciByZXR1cm5lZCBhbiB1bnJlY29nbml6 ZWQgcmVzcG9uc2UiKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGhy b3cgbmV3IEV4Y2VwdGlvbigiVGhlIHJlbW90ZSBzZXJ2ZXIgcmV0dXJuZWQgYW4gdW5yZWNvZ25pemVkIHJlc3BvbnNlIik7DQogICAgICAgICAgICAgICAg fQ0KDQogICAgICAgICAgICB9IGNhdGNoIHsNCiAgICAgICAgICAgICAgICB0aHJvdzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCiNl bmRpZg0KDQovLyBMaWJUU2ZvcmdlL0NvbW1vbi5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UNCnsNCiAgICB1c2luZyBTeXN0ZW07DQogICAgdXNpbmcgU3lz dGVtLklPOw0KICAgIHVzaW5nIFN5c3RlbS5MaW5xOw0KICAgIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCiAgICB1c2luZyBTeXN0 ZW0uVGV4dDsNCg0KICAgIHB1YmxpYyBlbnVtIFBTVmVyc2lvbg0KICAgIHsNCiAgICAgICAgVmlzdGEsDQogICAgICAgIFdpbjcsDQogICAgICAgIFdpbjgs DQogICAgICAgIFdpbkJsdWUsDQogICAgICAgIFdpbk1vZGVybg0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3RhbnRzDQogICAgew0K ICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBVbml2ZXJzYWxIV0lEQmxvY2sgPQ0KICAgICAgICB7DQogICAgICAgICAgICAweDI2LCAw eDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFjLCAweDAwLA0KICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwg MHgwMCwgMHgwMCwNCiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQogICAgICAgICAgICAweDAw LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwYywgMHgwMSwgMHgw MA0KICAgICAgICB9Ow0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEtNU3Y0UmVzcG9uc2UgPQ0KICAgICAgICB7DQogICAgICAg ICAgICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDM1LCAweDAwLCAweDM0LCAweDAwLCAw eDMyLCAweDAwLA0KICAgICAgICAgICAgMHgzNiwgMHgwMCwgMHgyRCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMCwg MHgwMCwgMHgzNiwgMHgwMCwgMHgyRCwgMHgwMCwNCiAgICAgICAgICAgIDB4MzEsIDB4MDAsIDB4MzYsIDB4MDAsIDB4MzEsIDB4MDAsIDB4MkQsIDB4MDAs IDB4MzYsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzUsIDB4MDAsDQogICAgICAgICAgICAweDMwLCAweDAwLCAweDM2LCAweDAwLCAweDJE LCAweDAwLCAweDMwLCAweDAwLCAweDMzLCAweDAwLCAweDJELCAweDAwLCAweDMxLCAweDAwLCAweDMwLCAweDAwLA0KICAgICAgICAgICAgMHgzMywgMHgw MCwgMHgzMywgMHgwMCwgMHgyRCwgMHgwMCwgMHgzOSwgMHgwMCwgMHgzMiwgMHgwMCwgMHgzMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgyRSwgMHgwMCwNCiAg ICAgICAgICAgIDB4MzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MkQsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MzYsIDB4 MDAsIDB4MzUsIDB4MDAsDQogICAgICAgICAgICAweDMyLCAweDAwLCAweDMwLCAweDAwLCAweDMxLCAweDAwLCAweDMzLCAweDAwLCAweDAwLCAweDAwLCAw eERFLCAweDE5LCAweDAyLCAweENGLCAweDFGLCAweDM1LA0KICAgICAgICAgICAgMHg5NywgMHg0RSwgMHg4QSwgMHg4RiwgMHhCOCwgMHgwNywgMHhCMSwg MHg5MiwgMHhCNSwgMHhCNSwgMHg5NywgMHg0MiwgMHhFQywgMHgzQSwgMHg3NiwgMHg4NCwNCiAgICAgICAgICAgIDB4RDUsIDB4MDEsIDB4MzIsIDB4MDAs IDB4MDAsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MjcsIDB4MDAsIDB4MDAsIDB4QzQsIDB4MUUsDQogICAgICAgICAgICAweEFB LCAweDhCLCAweERELCAweDBDLCAweEFCLCAweDU1LCAweDZBLCAweENFLCAweEFGLCAweEFDLCAweDdGLCAweDVGLCAweEJELCAweEU5DQogICAgICAgIH07 DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gS01TdjVSZXNwb25zZSA9DQogICAgICAgIHsNCiAgICAgICAgICAgIDB4MDAsIDB4 MDAsIDB4MDUsIDB4MDAsIDB4QkUsIDB4OTYsIDB4RjksIDB4MDQsIDB4NTQsIDB4MTcsIDB4M0YsIDB4QUYsIDB4RTMsIDB4MDgsIDB4NTAsIDB4RUIsDQog ICAgICAgICAgICAweDIyLCAweEJBLCAweDUzLCAweEJGLCAweEYyLCAweDZBLCAweDdCLCAweEM5LCAweDA1LCAweDFELCAweEI1LCAweDE5LCAweERGLCAw eDk4LCAweEUyLCAweDcxLA0KICAgICAgICAgICAgMHg0RCwgMHgwMCwgMHg2MSwgMHhFOSwgMHg5RCwgMHgwMywgMHhGQiwgMHgzMSwgMHhGOSwgMHgxRiwg MHgyRSwgMHg2MCwgMHg1OSwgMHhDNywgMHg3MywgMHhDOCwNCiAgICAgICAgICAgIDB4RTgsIDB4QjYsIDB4RTEsIDB4MkIsIDB4MzksIDB4QzYsIDB4MzUs IDB4MEUsIDB4NjgsIDB4N0EsIDB4QUEsIDB4NEYsIDB4MjgsIDB4MjMsIDB4MTIsIDB4MTgsDQogICAgICAgICAgICAweEUzLCAweEFBLCAweDg0LCAweDgx LCAweDZFLCAweDgyLCAweEYwLCAweDNGLCAweEQ5LCAweDY5LCAweEE5LCAweERGLCAweEJBLCAweDVGLCAweENBLCAweDMyLA0KICAgICAgICAgICAgMHg1 NCwgMHhCMiwgMHg1MiwgMHgzQiwgMHgzRSwgMHhEMSwgMHg1QywgMHg2NSwgMHhCQywgMHgzRSwgMHg1OSwgMHgwRCwgMHgxNSwgMHg5RiwgMHgzNywgMHhF QywNCiAgICAgICAgICAgIDB4MzAsIDB4OUMsIDB4Q0MsIDB4MUIsIDB4MzksIDB4MEQsIDB4MjEsIDB4MzIsIDB4MjksIDB4QTIsIDB4REQsIDB4QzcsIDB4 QzEsIDB4NjksIDB4RjIsIDB4NzIsDQogICAgICAgICAgICAweDNGLCAweDAwLCAweDk4LCAweDFFLCAweEY4LCAweDlBLCAweDc5LCAweDQ0LCAweDVELCAw eDI1LCAweDgwLCAweDdCLCAweEY1LCAweEUxLCAweDdDLCAweDY4LA0KICAgICAgICAgICAgMHgyNSwgMHhBQSwgMHgwRCwgMHg2NywgMHg5OCwgMHhFNSwg MHg1OSwgMHg5QiwgMHgwNCwgMHhDMSwgMHgyMywgMHgzMywgMHg0OCwgMHhGQiwgMHgyOCwgMHhEMCwNCiAgICAgICAgICAgIDB4NzYsIDB4REYsIDB4MDEs IDB4NTYsIDB4RTcsIDB4RUMsIDB4QkYsIDB4MUEsIDB4QTIsIDB4MjIsIDB4MjgsIDB4Q0EsIDB4QjEsIDB4QjQsIDB4NEMsIDB4MzAsDQogICAgICAgICAg ICAweDE0LCAweDZGLCAweEQyLCAweDJFLCAweDAxLCAweDJBLCAweDA0LCAweEUzLCAweEJELCAweEE3LCAweDQxLCAweDJGLCAweEM5LCAweEVGLCAweDUz LCAweEMwLA0KICAgICAgICAgICAgMHg3MCwgMHg0OCwgMHhGMSwgMHhCMiwgMHhCNiwgMHhFQSwgMHhFNywgMHgwRiwgMHg3QSwgMHgxNSwgMHhEMSwgMHhB NiwgMHhGRSwgMHgyMywgMHhDOCwgMHhGMywNCiAgICAgICAgICAgIDB4RTEsIDB4MDIsIDB4OUUsIDB4QTAsIDB4NEUsIDB4QkQsIDB4RjUsIDB4RUEsIDB4 NTMsIDB4NzQsIDB4OEUsIDB4NzQsIDB4QTEsIDB4QTEsIDB4QkQsIDB4QkUsDQogICAgICAgICAgICAweDY2LCAweEM0LCAweDczLCAweDhGLCAweDI0LCAw eEE3LCAweDJBLCAweDJGLCAweEUzLCAweEQ5LCAweEY0LCAweDI4LCAweEQ5LCAweEY4LCAweEEzLCAweDkzLA0KICAgICAgICAgICAgMHgwMywgMHg5RSwg MHgyOSwgMHhBQg0KICAgICAgICB9Ow0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEtNU3Y2UmVzcG9uc2UgPQ0KICAgICAgICB7 DQogICAgICAgICAgICAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDU0LCAweEQzLCAweDQwLCAweDA4LCAweEYzLCAweENELCAweDAzLCAweEVGLCAweEM4 LCAweDE1LCAweDg3LCAweDlFLA0KICAgICAgICAgICAgMHhDQSwgMHgyRSwgMHg4NSwgMHhGQiwgMHhFNiwgMHhGNiwgMHg3MywgMHg2NiwgMHhGQiwgMHhE QSwgMHhCQiwgMHg3QiwgMHhCMSwgMHhCQywgMHhENiwgMHhGOSwNCiAgICAgICAgICAgIDB4NUMsIDB4NDEsIDB4QTAsIDB4RkUsIDB4RTEsIDB4NzQsIDB4 QzQsIDB4QkIsIDB4OTEsIDB4RTUsIDB4REUsIDB4NkQsIDB4M0EsIDB4MTEsIDB4RDUsIDB4RkMsDQogICAgICAgICAgICAweDY4LCAweEMwLCAweDdCLCAw eDgyLCAweEIyLCAweDI0LCAweEQxLCAweDg1LCAweEJBLCAweDQ1LCAweEJGLCAweEYxLCAweDI2LCAweEZBLCAweEE1LCAweEM2LA0KICAgICAgICAgICAg MHg2MSwgMHg3MCwgMHg2OSwgMHg2OSwgMHg2RSwgMHgwRiwgMHgwQiwgMHg2MCwgMHhCNywgMHgzRCwgMHhFOCwgMHhGMSwgMHg0NywgMHgwQiwgMHg2NSwg MHhGRCwNCiAgICAgICAgICAgIDB4QTcsIDB4MzAsIDB4MUUsIDB4RjYsIDB4QTQsIDB4RDAsIDB4NzksIDB4QzQsIDB4NTgsIDB4OEQsIDB4ODEsIDB4RkQs IDB4QTcsIDB4RTcsIDB4NTMsIDB4RjEsDQogICAgICAgICAgICAweDY3LCAweDc4LCAweEYwLCAweDBGLCAweDYwLCAweDhGLCAweEM4LCAweDE2LCAweDM1 LCAweDIyLCAweDk0LCAweDQ4LCAweENCLCAweDBGLCAweDhFLCAweEIyLA0KICAgICAgICAgICAgMHgxRCwgMHhGNywgMHgzRSwgMHgyOCwgMHg0MiwgMHg1 NSwgMHg2QiwgMHgwNywgMHhFMywgMHhFOCwgMHg1MSwgMHhENSwgMHhGQSwgMHgyMiwgMHgwQywgMHg4NiwNCiAgICAgICAgICAgIDB4NjUsIDB4MEQsIDB4 M0YsIDB4REQsIDB4OEQsIDB4OUIsIDB4MUIsIDB4QzksIDB4RDMsIDB4QjgsIDB4M0EsIDB4RUMsIDB4RjEsIDB4MTEsIDB4MTksIDB4MjUsDQogICAgICAg ICAgICAweEY3LCAweDg0LCAweDRBLCAweDRDLCAweDBBLCAweEI1LCAweDMxLCAweDk0LCAweDM3LCAweDc2LCAweENFLCAweEU3LCAweEFCLCAweEE5LCAw eDY5LCAweERGLA0KICAgICAgICAgICAgMHhBNCwgMHhDOSwgMHgyMiwgMHg2QywgMHgyMywgMHhGRiwgMHg2QiwgMHhGQywgMHhEQSwgMHg3OCwgMHhEOCwg MHhDNCwgMHg4RiwgMHg3NCwgMHhCQiwgMHgyNiwNCiAgICAgICAgICAgIDB4MDUsIDB4MDAsIDB4OTgsIDB4OUIsIDB4RTUsIDB4RTIsIDB4QUQsIDB4MEQs IDB4NTcsIDB4OTUsIDB4ODAsIDB4NjYsIDB4OEUsIDB4NDMsIDB4NzQsIDB4ODcsDQogICAgICAgICAgICAweDkzLCAweDFGLCAweEY0LCAweEIyLCAweDJD LCAweDIwLCAweDVGLCAweEQ4LCAweDlDLCAweDRDLCAweDU2LCAweEIzLCAweDU3LCAweDQ0LCAweDYyLCAweDY4LA0KICAgICAgICAgICAgMHg4RCwgMHhB QSwgMHg0MCwgMHgxMSwgMHg5RCwgMHg4NCwgMHg2MiwgMHgwRSwgMHg0MywgMHg4QSwgMHgxRCwgMHhGMCwgMHgxQywgMHg0OSwgMHhEOCwgMHg1NiwNCiAg ICAgICAgICAgIDB4RUYsIDB4NEMsIDB4RDMsIDB4NjQsIDB4QkEsIDB4MEQsIDB4RUYsIDB4ODcsIDB4QjUsIDB4MkMsIDB4ODgsIDB4RjMsIDB4MTgsIDB4 RkYsIDB4M0EsIDB4OEMsDQogICAgICAgICAgICAweEY1LCAweEE2LCAweDc4LCAweDVDLCAweDYyLCAweEUzLCAweDlFLCAweDRDLCAweEI2LCAweDMxLCAw eDJELCAweDA2LCAweDgwLCAweDkyLCAweEJDLCAweDJFLA0KICAgICAgICAgICAgMHg5MiwgMHhBNiwgMHg1NiwgMHg5Ng0KICAgICAgICB9Ow0KDQogICAg ICAgIC8vIDJeMzEgLSA4IG1pbnV0ZXMNCiAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSB1bG9uZyBUaW1lck1heCA9ICh1bG9uZylUaW1lU3Bhbi5G cm9tTWludXRlcygyMTQ3NDgzNjQwKS5UaWNrczsNCg0KICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHN0cmluZyBaZXJvQ0lEID0gbmV3IHN0cmlu ZygnMCcsIDQ4KTsNCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpbmFyeVJlYWRlckV4dA0KICAgIHsNCiAgICAgICAgcHVibGljIHN0YXRp YyB2b2lkIEFsaWduKHRoaXMgQmluYXJ5UmVhZGVyIHJlYWRlciwgaW50IHRvKQ0KICAgICAgICB7DQogICAgICAgICAgICBpbnQgcG9zID0gKGludClyZWFk ZXIuQmFzZVN0cmVhbS5Qb3NpdGlvbjsNCiAgICAgICAgICAgIHJlYWRlci5CYXNlU3RyZWFtLlNlZWsoLXBvcyAmICh0byAtIDEpLCBTZWVrT3JpZ2luLkN1 cnJlbnQpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUmVhZE51bGxUZXJtaW5hdGVkU3RyaW5nKHRoaXMgQmluYXJ5UmVh ZGVyIHJlYWRlciwgaW50IG1heExlbikNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVuaWNvZGUuR2V0U3RyaW5nKHJlYWRlci5S ZWFkQnl0ZXMobWF4TGVuKSkuU3BsaXQobmV3IGNoYXJbXSB7ICdcMCcgfSwgMilbMF07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGlj IGNsYXNzIEJpbmFyeVdyaXRlckV4dA0KICAgIHsNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFsaWduKHRoaXMgQmluYXJ5V3JpdGVyIHdyaXRlciwg aW50IHRvKQ0KICAgICAgICB7DQogICAgICAgICAgICBpbnQgcG9zID0gKGludCl3cml0ZXIuQmFzZVN0cmVhbS5Qb3NpdGlvbjsNCiAgICAgICAgICAgIHdy aXRlci5Xcml0ZVBhZGRpbmcoLXBvcyAmICh0byAtIDEpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBXcml0ZVBhZGRpbmco dGhpcyBCaW5hcnlXcml0ZXIgd3JpdGVyLCBpbnQgbGVuKQ0KICAgICAgICB7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoRW51bWVyYWJsZS5SZXBlYXQo KGJ5dGUpMCwgbGVuKS5Ub0FycmF5KCkpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWRTdHJpbmcodGhpcyBC aW5hcnlXcml0ZXIgd3JpdGVyLCBzdHJpbmcgc3RyLCBpbnQgYkxlbikNCiAgICAgICAgew0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKEVuY29kaW5nLkFT Q0lJLkdldEJ5dGVzKHN0cikpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlUGFkZGluZyhiTGVuIC0gc3RyLkxlbmd0aCk7DQogICAgICAgIH0NCg0KICAg ICAgICBwdWJsaWMgc3RhdGljIHZvaWQgV3JpdGVGaXhlZFN0cmluZzE2KHRoaXMgQmluYXJ5V3JpdGVyIHdyaXRlciwgc3RyaW5nIHN0ciwgaW50IGJMZW4p DQogICAgICAgIHsNCiAgICAgICAgICAgIGJ5dGVbXSBic3RyID0gVXRpbHMuRW5jb2RlU3RyaW5nKHN0cik7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUo YnN0cik7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGVQYWRkaW5nKGJMZW4gLSBic3RyLkxlbmd0aCk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMg c3RhdGljIGJ5dGVbXSBHZXRCeXRlcyh0aGlzIEJpbmFyeVdyaXRlciB3cml0ZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiAoKE1lbW9yeVN0 cmVhbSl3cml0ZXIuQmFzZVN0cmVhbSkuVG9BcnJheSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIHN0YXRpYyBjbGFzcyBCeXRlQXJyYXlF eHQNCiAgICB7DQogICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIENhc3RUb0FycmF5PFQ+KHRoaXMgVCBkYXRhKSB3aGVyZSBUIDogc3RydWN0DQogICAg ICAgIHsNCiAgICAgICAgICAgIGludCBzaXplID0gTWFyc2hhbC5TaXplT2YodHlwZW9mKFQpKTsNCiAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcg Ynl0ZVtzaXplXTsNCiAgICAgICAgICAgIEdDSGFuZGxlIGhhbmRsZSA9IEdDSGFuZGxlLkFsbG9jKHJlc3VsdCwgR0NIYW5kbGVUeXBlLlBpbm5lZCk7DQog ICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBNYXJzaGFsLlN0cnVjdHVyZVRvUHRyKGRhdGEsIGhhbmRsZS5BZGRyT2ZQ aW5uZWRPYmplY3QoKSwgZmFsc2UpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZmluYWxseQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAg IGhhbmRsZS5GcmVlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGlj IHN0YXRpYyBjbGFzcyBGaWxlU3RyZWFtRXh0DQogICAgew0KICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBSZWFkQWxsQnl0ZXModGhpcyBGaWxlU3Ry ZWFtIGZzKQ0KICAgICAgICB7DQogICAgICAgICAgICBCaW5hcnlSZWFkZXIgYnIgPSBuZXcgQmluYXJ5UmVhZGVyKGZzKTsNCiAgICAgICAgICAgIHJldHVy biBici5SZWFkQnl0ZXMoKGludClmcy5MZW5ndGgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFdyaXRlQWxsQnl0ZXModGhp cyBGaWxlU3RyZWFtIGZzLCBieXRlW10gZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgZnMuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsNCiAgICAg ICAgICAgIGZzLlNldExlbmd0aChkYXRhLkxlbmd0aCk7DQogICAgICAgICAgICBmcy5Xcml0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7DQogICAgICAgIH0N CiAgICB9DQoNCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFV0aWxzDQogICAgew0KICAgICAgICBbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiKV0NCiAgICAg ICAgcHVibGljIHN0YXRpYyBleHRlcm4gdWludCBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIp XQ0KICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBib29sIFdvdzY0RW5hYmxlV293NjRGc1JlZGlyZWN0aW9uKGJvb2wgV293NjRGc0VuYWJsZVJlZGly ZWN0aW9uKTsNCg0KICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBEZWNvZGVTdHJpbmcoYnl0ZVtdIGRhdGEpDQogICAgICAgIHsNCiAgICAgICAgICAg IHJldHVybiBFbmNvZGluZy5Vbmljb2RlLkdldFN0cmluZyhkYXRhKS5UcmltKCdcMCcpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBi eXRlW10gRW5jb2RlU3RyaW5nKHN0cmluZyBzdHIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKHN0 ciArICdcMCcpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyB1aW50IENSQzMyKGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAg ICAgICBjb25zdCB1aW50IHBvbHlub21pYWwgPSAweDA0QzExREI3Ow0KICAgICAgICAgICAgdWludCBjcmMgPSAweGZmZmZmZmZmOw0KDQogICAgICAgICAg ICBmb3JlYWNoIChieXRlIGIgaW4gZGF0YSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjcmMgXj0gKHVpbnQpYiA8PCAyNDsNCiAgICAgICAg ICAgICAgICBmb3IgKGludCBiaXQgPSAwOyBiaXQgPCA4OyBiaXQrKykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICgoY3Jj ICYgMHg4MDAwMDAwMCkgIT0gMCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY3JjID0gKGNyYyA8PCAxKSBeIHBv bHlub21pYWw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAg ICAgICAgICAgICAgICAgICBjcmMgPDw9IDE7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAg ICAgICAgICByZXR1cm4gfmNyYzsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFyY2hpdGVjdHVyZSgpDQogICAgICAg IHsNCiAgICAgICAgICAgIHN0cmluZyBhcmNoID0gRW52aXJvbm1lbnQuR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSIs IEVudmlyb25tZW50VmFyaWFibGVUYXJnZXQuTWFjaGluZSkuVG9VcHBlckludmFyaWFudCgpOw0KICAgICAgICAgICAgcmV0dXJuIGFyY2ggPT0gIkFNRDY0 IiA/ICJYNjQiIDogYXJjaDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgUFNWZXJzaW9uIERldGVjdFZlcnNpb24oKQ0KICAgICAgICB7 DQogICAgICAgICAgICBpbnQgYnVpbGQgPSBFbnZpcm9ubWVudC5PU1ZlcnNpb24uVmVyc2lvbi5CdWlsZDsNCg0KICAgICAgICAgICAgaWYgKGJ1aWxkID49 IDk2MDApIHJldHVybiBQU1ZlcnNpb24uV2luTW9kZXJuOw0KICAgICAgICAgICAgaWYgKGJ1aWxkID49IDYwMDAgJiYgYnVpbGQgPD0gNjAwMykgcmV0dXJu IFBTVmVyc2lvbi5WaXN0YTsNCiAgICAgICAgICAgIGlmIChidWlsZCA+PSA3NjAwICYmIGJ1aWxkIDw9IDc2MDIpIHJldHVybiBQU1ZlcnNpb24uV2luNzsN CiAgICAgICAgICAgIGlmIChidWlsZCA9PSA5MjAwKSByZXR1cm4gUFNWZXJzaW9uLldpbjg7DQoNCiAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0 ZWRFeGNlcHRpb24oIlVuYWJsZSB0byBhdXRvLWRldGVjdCB2ZXJzaW9uIGluZm8iKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBzdGF0aWMg Y2xhc3MgTG9nZ2VyDQogICAgew0KICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSGlkZU91dHB1dCA9IGZhbHNlOw0KDQogICAgICAgIHB1YmxpYyBzdGF0 aWMgdm9pZCBXcml0ZUxpbmUoc3RyaW5nIGxpbmUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICghSGlkZU91dHB1dCkgQ29uc29sZS5Xcml0ZUxpbmUo bGluZSk7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9TUFAvUEtleUNvbmZpZy5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuU1BQ DQp7DQogICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KICAgIHVzaW5nIFN5c3RlbS5JTzsNCiAgICB1 c2luZyBTeXN0ZW0uTGlucTsNCiAgICB1c2luZyBTeXN0ZW0uVGV4dDsNCiAgICB1c2luZyBTeXN0ZW0uWG1sOw0KDQogICAgcHVibGljIGVudW0gUEtleUFs Z29yaXRobQ0KICAgIHsNCiAgICAgICAgUEtFWTIwMDUsDQogICAgICAgIFBLRVkyMDA5DQogICAgfQ0KDQogICAgcHVibGljIGNsYXNzIEtleVJhbmdlDQog ICAgew0KICAgICAgICBwdWJsaWMgaW50IFN0YXJ0Ow0KICAgICAgICBwdWJsaWMgaW50IEVuZDsNCiAgICAgICAgcHVibGljIHN0cmluZyBFdWxhVHlwZTsN CiAgICAgICAgcHVibGljIHN0cmluZyBQYXJ0TnVtYmVyOw0KICAgICAgICBwdWJsaWMgYm9vbCBWYWxpZDsNCg0KICAgICAgICBwdWJsaWMgYm9vbCBDb250 YWlucyhpbnQgbikNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIFN0YXJ0IDw9IG4gJiYgbiA8PSBFbmQ7DQogICAgICAgIH0NCiAgICB9DQoNCiAg ICBwdWJsaWMgY2xhc3MgUHJvZHVjdENvbmZpZw0KICAgIHsNCiAgICAgICAgcHVibGljIGludCBHcm91cElkOw0KICAgICAgICBwdWJsaWMgc3RyaW5nIEVk aXRpb247DQogICAgICAgIHB1YmxpYyBzdHJpbmcgRGVzY3JpcHRpb247DQogICAgICAgIHB1YmxpYyBzdHJpbmcgQ2hhbm5lbDsNCiAgICAgICAgcHVibGlj IGJvb2wgUmFuZG9taXplZDsNCiAgICAgICAgcHVibGljIFBLZXlBbGdvcml0aG0gQWxnb3JpdGhtOw0KICAgICAgICBwdWJsaWMgTGlzdDxLZXlSYW5nZT4g UmFuZ2VzOw0KICAgICAgICBwdWJsaWMgR3VpZCBBY3RpdmF0aW9uSWQ7DQoNCiAgICAgICAgcHJpdmF0ZSBMaXN0PEtleVJhbmdlPiBHZXRQa2V5UmFuZ2Vz KCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKFJhbmdlcy5Db3VudCA9PSAwKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93IG5l dyBBcmd1bWVudEV4Y2VwdGlvbigiTm8ga2V5IHJhbmdlcy4iKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKEFsZ29yaXRobSA9PSBQS2V5 QWxnb3JpdGhtLlBLRVkyMDA1KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZXM7DQogICAgICAgICAgICB9DQoNCiAgICAg ICAgICAgIExpc3Q8S2V5UmFuZ2U+IEZpbHRlcmVkUmFuZ2VzID0gUmFuZ2VzLldoZXJlKHIgPT4gIXIuRXVsYVR5cGUuQ29udGFpbnMoIldBVSIpKS5Ub0xp c3QoKTsNCg0KICAgICAgICAgICAgaWYgKEZpbHRlcmVkUmFuZ2VzLkNvdW50ID09IDApDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cg bmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiU3BlY2lmaWVkIEFjdGl2YXRpb24gSUQgaXMgdXNhYmxlIG9ubHkgZm9yIFdpbmRvd3MgQW55dGltZSBVcGdy YWRlLiBQbGVhc2UgdXNlIGEgbm9uLVdBVSBBY3RpdmF0aW9uIElEIGluc3RlYWQuIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiBG aWx0ZXJlZFJhbmdlczsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBQcm9kdWN0S2V5IEdldFJhbmRvbUtleSgpDQogICAgICAgIHsNCiAgICAgICAg ICAgIExpc3Q8S2V5UmFuZ2U+IEtleVJhbmdlcyA9IEdldFBrZXlSYW5nZXMoKTsNCiAgICAgICAgICAgIFJhbmRvbSBybmQgPSBuZXcgUmFuZG9tKCk7DQoN CiAgICAgICAgICAgIEtleVJhbmdlIHJhbmdlID0gS2V5UmFuZ2VzW3JuZC5OZXh0KEtleVJhbmdlcy5Db3VudCldOw0KICAgICAgICAgICAgaW50IHNlcmlh bCA9IHJuZC5OZXh0KHJhbmdlLlN0YXJ0LCByYW5nZS5FbmQpOw0KDQogICAgICAgICAgICByZXR1cm4gbmV3IFByb2R1Y3RLZXkoc2VyaWFsLCAwLCBmYWxz ZSwgQWxnb3JpdGhtLCB0aGlzLCByYW5nZSk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgY2xhc3MgUEtleUNvbmZpZw0KICAgIHsNCiAgICAg ICAgcHVibGljIHJlYWRvbmx5IERpY3Rpb25hcnk8R3VpZCwgUHJvZHVjdENvbmZpZz4gUHJvZHVjdHMgPSBuZXcgRGljdGlvbmFyeTxHdWlkLCBQcm9kdWN0 Q29uZmlnPigpOw0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8R3VpZD4gbG9hZGVkUGtleUNvbmZpZ3MgPSBuZXcgTGlzdDxHdWlkPigpOw0KDQog ICAgICAgIHB1YmxpYyB2b2lkIExvYWRDb25maWcoR3VpZCBhY3RJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgc3RyaW5nIHBrY0RhdGE7DQogICAgICAg ICAgICBHdWlkIHBrY0ZpbGVJZCA9IFNMQXBpLkdldFBrZXlDb25maWdGaWxlSWQoYWN0SWQpOw0KDQogICAgICAgICAgICBpZiAobG9hZGVkUGtleUNvbmZp Z3MuQ29udGFpbnMocGtjRmlsZUlkKSkgcmV0dXJuOw0KDQogICAgICAgICAgICBzdHJpbmcgbGljQ29udHMgPSBTTEFwaS5HZXRMaWNlbnNlQ29udGVudHMo cGtjRmlsZUlkKTsNCg0KICAgICAgICAgICAgdXNpbmcgKFRleHRSZWFkZXIgdHIgPSBuZXcgU3RyaW5nUmVhZGVyKGxpY0NvbnRzKSkNCiAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICBYbWxEb2N1bWVudCBsaWMgPSBuZXcgWG1sRG9jdW1lbnQoKTsNCiAgICAgICAgICAgICAgICBsaWMuTG9hZCh0cik7DQoN CiAgICAgICAgICAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbWdyID0gbmV3IFhtbE5hbWVzcGFjZU1hbmFnZXIobGljLk5hbWVUYWJsZSk7DQogICAg ICAgICAgICAgICAgbnNtZ3IuQWRkTmFtZXNwYWNlKCJyZyIsICJ1cm46bXBlZzptcGVnMjE6MjAwMzowMS1SRUwtUi1OUyIpOw0KICAgICAgICAgICAgICAg IG5zbWdyLkFkZE5hbWVzcGFjZSgiciIsICJ1cm46bXBlZzptcGVnMjE6MjAwMzowMS1SRUwtUi1OUyIpOw0KICAgICAgICAgICAgICAgIG5zbWdyLkFkZE5h bWVzcGFjZSgidG0iLCAiaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL0RSTS9Yck1MMi9UTS92MiIpOw0KDQogICAgICAgICAgICAgICAgWG1sTm9kZSByb290 ID0gbGljLkRvY3VtZW50RWxlbWVudDsNCiAgICAgICAgICAgICAgICBYbWxOb2RlIHBrY0RhdGFOb2RlID0gcm9vdC5TZWxlY3RTaW5nbGVOb2RlKCIvcmc6 bGljZW5zZUdyb3VwL3I6bGljZW5zZS9yOm90aGVySW5mby90bTppbmZvVGFibGVzL3RtOmluZm9MaXN0L3RtOmluZm9CaW5bQG5hbWU9XCJwa2V5Q29uZmln RGF0YVwiXSIsIG5zbWdyKTsNCiAgICAgICAgICAgICAgICBwa2NEYXRhID0gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoQ29udmVydC5Gcm9tQmFzZTY0U3Ry aW5nKHBrY0RhdGFOb2RlLklubmVyVGV4dCkpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB1c2luZyAoVGV4dFJlYWRlciB0ciA9IG5ldyBTdHJp bmdSZWFkZXIocGtjRGF0YSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgWG1sRG9jdW1lbnQgbGljID0gbmV3IFhtbERvY3VtZW50KCk7DQog ICAgICAgICAgICAgICAgbGljLkxvYWQodHIpOw0KDQogICAgICAgICAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuc21nciA9IG5ldyBYbWxOYW1lc3Bh Y2VNYW5hZ2VyKGxpYy5OYW1lVGFibGUpOw0KICAgICAgICAgICAgICAgIG5zbWdyLkFkZE5hbWVzcGFjZSgicCIsICJodHRwOi8vd3d3Lm1pY3Jvc29mdC5j b20vRFJNL1BLRVkvQ29uZmlndXJhdGlvbi8yLjAiKTsNCiAgICAgICAgICAgICAgICBYbWxOb2RlTGlzdCBjb25maWdOb2RlcyA9IGxpYy5TZWxlY3ROb2Rl cygiLy9wOlByb2R1Y3RLZXlDb25maWd1cmF0aW9uL3A6Q29uZmlndXJhdGlvbnMvcDpDb25maWd1cmF0aW9uIiwgbnNtZ3IpOw0KICAgICAgICAgICAgICAg IFhtbE5vZGVMaXN0IHJhbmdlTm9kZXMgPSBsaWMuU2VsZWN0Tm9kZXMoIi8vcDpQcm9kdWN0S2V5Q29uZmlndXJhdGlvbi9wOktleVJhbmdlcy9wOktleVJh bmdlIiwgbnNtZ3IpOw0KICAgICAgICAgICAgICAgIFhtbE5vZGVMaXN0IHB1YktleU5vZGVzID0gbGljLlNlbGVjdE5vZGVzKCIvL3A6UHJvZHVjdEtleUNv bmZpZ3VyYXRpb24vcDpQdWJsaWNLZXlzL3A6UHVibGljS2V5IiwgbnNtZ3IpOw0KDQogICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIFBLZXlBbGdv cml0aG0+IGFsZ29yaXRobXMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFBLZXlBbGdvcml0aG0+KCk7DQogICAgICAgICAgICAgICAgRGljdGlvbmFyeTxzdHJp bmcsIExpc3Q8S2V5UmFuZ2U+PiByYW5nZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIExpc3Q8S2V5UmFuZ2U+PigpOw0KDQogICAgICAgICAgICAgICAg RGljdGlvbmFyeTxzdHJpbmcsIFBLZXlBbGdvcml0aG0+IGFsZ29Db252ID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQS2V5QWxnb3JpdGhtPg0KICAgICAg ICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgeyAibXNmdDpybS9hbGdvcml0aG0vcGtleS8yMDA1IiwgUEtleUFsZ29yaXRobS5QS0VZMjAwNSB9 LA0KICAgICAgICAgICAgICAgICAgICB7ICJtc2Z0OnJtL2FsZ29yaXRobS9wa2V5LzIwMDkiLCBQS2V5QWxnb3JpdGhtLlBLRVkyMDA5IH0NCiAgICAgICAg ICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBwdWJLZXlOb2RlIGluIHB1YktleU5vZGVzKQ0KICAgICAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwID0gaW50LlBhcnNlKHB1YktleU5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi9wOkdyb3VwSWQiLCBu c21ncikuSW5uZXJUZXh0KTsNCiAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtc1tncm91cF0gPSBhbGdvQ29udltwdWJLZXlOb2RlLlNlbGVjdFNpbmds ZU5vZGUoIi4vcDpBbGdvcml0aG1JZCIsIG5zbWdyKS5Jbm5lclRleHRdOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGZvcmVhY2gg KFhtbE5vZGUgcmFuZ2VOb2RlIGluIHJhbmdlTm9kZXMpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVmQWN0SWRT dHIgPSByYW5nZU5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi9wOlJlZkFjdENvbmZpZ0lkIiwgbnNtZ3IpLklubmVyVGV4dDsNCg0KICAgICAgICAgICAgICAg ICAgICBpZiAoIXJhbmdlcy5Db250YWluc0tleShyZWZBY3RJZFN0cikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAg IHJhbmdlc1tyZWZBY3RJZFN0cl0gPSBuZXcgTGlzdDxLZXlSYW5nZT4oKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAg IEtleVJhbmdlIGtleVJhbmdlID0gbmV3IEtleVJhbmdlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ID0g aW50LlBhcnNlKHJhbmdlTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuL3A6U3RhcnQiLCBuc21ncikuSW5uZXJUZXh0KSwNCiAgICAgICAgICAgICAgICAgICAg ICAgIEVuZCA9IGludC5QYXJzZShyYW5nZU5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi9wOkVuZCIsIG5zbWdyKS5Jbm5lclRleHQpLA0KICAgICAgICAgICAg ICAgICAgICAgICAgRXVsYVR5cGUgPSByYW5nZU5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi9wOkV1bGFUeXBlIiwgbnNtZ3IpLklubmVyVGV4dCwNCiAgICAg ICAgICAgICAgICAgICAgICAgIFBhcnROdW1iZXIgPSByYW5nZU5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi9wOlBhcnROdW1iZXIiLCBuc21ncikuSW5uZXJU ZXh0LA0KICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPSByYW5nZU5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi9wOklzVmFsaWQiLCBuc21ncikuSW5u ZXJUZXh0LlRvTG93ZXIoKSA9PSAidHJ1ZSINCiAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICByYW5nZXNbcmVmQWN0SWRT dHJdLkFkZChrZXlSYW5nZSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBjb25maWdOb2RlIGluIGNv bmZpZ05vZGVzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlZkFjdElkU3RyID0gY29uZmlnTm9kZS5TZWxlY3RT aW5nbGVOb2RlKCIuL3A6QWN0Q29uZmlnSWQiLCBuc21ncikuSW5uZXJUZXh0Ow0KICAgICAgICAgICAgICAgICAgICBHdWlkIHJlZkFjdElkID0gbmV3IEd1 aWQocmVmQWN0SWRTdHIpOw0KICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXAgPSBpbnQuUGFyc2UoY29uZmlnTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIu L3A6UmVmR3JvdXBJZCIsIG5zbWdyKS5Jbm5lclRleHQpOw0KICAgICAgICAgICAgICAgICAgICBMaXN0PEtleVJhbmdlPiBrZXlSYW5nZXM7DQogICAgICAg ICAgICAgICAgICAgIHJhbmdlcy5UcnlHZXRWYWx1ZShyZWZBY3RJZFN0ciwgb3V0IGtleVJhbmdlcyk7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGtl eVJhbmdlcyA9PSBudWxsKSANCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAg ICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAoa2V5UmFuZ2VzLkNvdW50ID4gMCAmJiAhUHJvZHVjdHMuQ29udGFpbnNLZXkocmVmQWN0SWQp KQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBQS2V5QWxnb3JpdGhtIGFsZ29yaXRobTsNCiAgICAgICAgICAgICAg ICAgICAgICAgIGFsZ29yaXRobXMuVHJ5R2V0VmFsdWUoZ3JvdXAsIG91dCBhbGdvcml0aG0pOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0 Q29uZmlnIHByb2R1Y3RDb25maWcgPSBuZXcgUHJvZHVjdENvbmZpZw0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEdyb3VwSWQgPSBncm91cCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0aW9uID0gY29uZmlnTm9kZS5TZWxlY3RTaW5nbGVOb2Rl KCIuL3A6RWRpdGlvbklkIiwgbnNtZ3IpLklubmVyVGV4dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9IGNvbmZpZ05vZGUu U2VsZWN0U2luZ2xlTm9kZSgiLi9wOlByb2R1Y3REZXNjcmlwdGlvbiIsIG5zbWdyKS5Jbm5lclRleHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg Q2hhbm5lbCA9IGNvbmZpZ05vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi9wOlByb2R1Y3RLZXlUeXBlIiwgbnNtZ3IpLklubmVyVGV4dCwNCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICBSYW5kb21pemVkID0gY29uZmlnTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuL3A6UHJvZHVjdEtleVR5cGUiLCBuc21ncikuSW5u ZXJUZXh0LlRvTG93ZXIoKSA9PSAidHJ1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxnb3JpdGhtID0gYWxnb3JpdGhtLA0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFJhbmdlcyA9IGtleVJhbmdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3RpdmF0aW9uSWQgPSByZWZBY3RJ ZA0KICAgICAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdHNbcmVmQWN0SWRdID0gcHJvZHVjdENvbmZp ZzsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbG9hZGVkUGtleUNvbmZp Z3MuQWRkKHBrY0ZpbGVJZCk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgUHJvZHVjdENvbmZpZyBNYXRjaFBhcmFtcyhpbnQgZ3JvdXAsIGludCBz ZXJpYWwpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFByb2R1Y3RDb25maWcgY29uZmlnIGluIFByb2R1Y3RzLlZhbHVlcykNCiAgICAgICAg ICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLkdyb3VwSWQgPT0gZ3JvdXApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAg ICBmb3JlYWNoIChLZXlSYW5nZSByYW5nZSBpbiBjb25maWcuUmFuZ2VzKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAg ICBpZiAocmFuZ2UuQ29udGFpbnMoc2VyaWFsKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1 cm4gY29uZmlnOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAg ICAgfQ0KDQogICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGYWlsZWQgdG8gZmluZCBwcm9kdWN0IG1hdGNoaW5nIHN1cHBs aWVkIHByb2R1Y3Qga2V5IHBhcmFtZXRlcnMuIik7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBMb2FkQWxsQ29uZmlncyhHdWlkIGFwcElk KQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3JlYWNoIChHdWlkIGFjdElkIGluIFNMQXBpLkdldEFjdGl2YXRpb25JZHMoYXBwSWQpKQ0KICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgTG9hZENvbmZpZyhhY3RJZCk7DQogICAg ICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24pDQogICAgICAgICAgICAgICAgew0KDQogICAgICAgICAg ICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8vIExpYlRTZm9yZ2UvU1BQL1Byb2R1Y3RLZXkuY3MNCm5hbWVzcGFj ZSBMaWJUU2ZvcmdlLlNQUA0Kew0KICAgIHVzaW5nIFN5c3RlbTsNCiAgICB1c2luZyBTeXN0ZW0uSU87DQogICAgdXNpbmcgU3lzdGVtLkxpbnE7DQogICAg dXNpbmcgQ3J5cHRvOw0KICAgIHVzaW5nIFBoeXNpY2FsU3RvcmU7DQoNCiAgICBwdWJsaWMgY2xhc3MgUHJvZHVjdEtleQ0KICAgIHsNCiAgICAgICAgcHJp dmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nIEFMUEhBQkVUID0gIkJDREZHSEpLTVBRUlRWV1hZMjM0Njc4OSI7DQoNCiAgICAgICAgcHJpdmF0ZSByZWFk b25seSB1bG9uZyBrbG93Ow0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVsb25nIGtoaWdoOw0KDQogICAgICAgIHB1YmxpYyBpbnQgR3JvdXA7DQogICAg ICAgIHB1YmxpYyBpbnQgU2VyaWFsOw0KICAgICAgICBwdWJsaWMgdWxvbmcgU2VjdXJpdHk7DQogICAgICAgIHB1YmxpYyBib29sIFVwZ3JhZGU7DQogICAg ICAgIHB1YmxpYyBQS2V5QWxnb3JpdGhtIEFsZ29yaXRobTsNCiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmluZyBFdWxhVHlwZTsNCiAgICAgICAgcHVi bGljIHJlYWRvbmx5IHN0cmluZyBQYXJ0TnVtYmVyOw0KICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nIEVkaXRpb247DQogICAgICAgIHB1YmxpYyBy ZWFkb25seSBzdHJpbmcgQ2hhbm5lbDsNCiAgICAgICAgcHVibGljIHJlYWRvbmx5IEd1aWQgQWN0aXZhdGlvbklkOw0KDQogICAgICAgIHByaXZhdGUgc3Ry aW5nIG1wYzsNCiAgICAgICAgcHJpdmF0ZSBzdHJpbmcgcGlkMjsNCg0KICAgICAgICBwdWJsaWMgYnl0ZVtdIEtleUJ5dGVzDQogICAgICAgIHsNCiAgICAg ICAgICAgIGdldCB7IHJldHVybiBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoa2xvdykuQ29uY2F0KEJpdENvbnZlcnRlci5HZXRCeXRlcyhraGlnaCkpLlRvQXJy YXkoKTsgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIFByb2R1Y3RLZXkoKQ0KICAgICAgICB7DQoNCiAgICAgICAgfQ0KDQogICAgICAgIHB1Ymxp YyBQcm9kdWN0S2V5KGludCBzZXJpYWwsIHVsb25nIHNlY3VyaXR5LCBib29sIHVwZ3JhZGUsIFBLZXlBbGdvcml0aG0gYWxnb3JpdGhtLCBQcm9kdWN0Q29u ZmlnIGNvbmZpZywgS2V5UmFuZ2UgcmFuZ2UpDQogICAgICAgIHsNCiAgICAgICAgICAgIEdyb3VwID0gY29uZmlnLkdyb3VwSWQ7DQogICAgICAgICAgICBT ZXJpYWwgPSBzZXJpYWw7DQogICAgICAgICAgICBTZWN1cml0eSA9IHNlY3VyaXR5Ow0KICAgICAgICAgICAgVXBncmFkZSA9IHVwZ3JhZGU7DQogICAgICAg ICAgICBBbGdvcml0aG0gPSBhbGdvcml0aG07DQogICAgICAgICAgICBFdWxhVHlwZSA9IHJhbmdlLkV1bGFUeXBlOw0KICAgICAgICAgICAgUGFydE51bWJl ciA9IHJhbmdlLlBhcnROdW1iZXIuU3BsaXQoJzonLCAnOycpWzBdOw0KICAgICAgICAgICAgRWRpdGlvbiA9IGNvbmZpZy5FZGl0aW9uOw0KICAgICAgICAg ICAgQ2hhbm5lbCA9IGNvbmZpZy5DaGFubmVsOw0KICAgICAgICAgICAgQWN0aXZhdGlvbklkID0gY29uZmlnLkFjdGl2YXRpb25JZDsNCg0KICAgICAgICAg ICAga2xvdyA9ICgoc2VjdXJpdHkgJiAweDNmZmYpIDw8IDUwIHwgKCh1bG9uZylzZXJpYWwgJiAweDNmZmZmZmZmKSA8PCAyMCB8ICgodWxvbmcpR3JvdXAg JiAweGZmZmZmKSk7DQogICAgICAgICAgICBraGlnaCA9ICgodXBncmFkZSA/ICh1bG9uZykxIDogMCkgPDwgNDkgfCAoKHNlY3VyaXR5ID4+IDE0KSAmIDB4 N2ZmZmZmZmZmZikpOw0KDQogICAgICAgICAgICB1aW50IGNoZWNrc3VtID0gVXRpbHMuQ1JDMzIoS2V5Qnl0ZXMpICYgMHgzZmY7DQoNCiAgICAgICAgICAg IGtoaWdoIHw9ICgodWxvbmcpY2hlY2tzdW0gPDwgMzkpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0cmluZyBHZXRBbGdvVXJpKCkNCiAgICAg ICAgew0KICAgICAgICAgICAgcmV0dXJuICJtc2Z0OnJtL2FsZ29yaXRobS9wa2V5LyIgKyAoQWxnb3JpdGhtID09IFBLZXlBbGdvcml0aG0uUEtFWTIwMDUg PyAiMjAwNSIgOiAoQWxnb3JpdGhtID09IFBLZXlBbGdvcml0aG0uUEtFWTIwMDkgPyAiMjAwOSIgOiAiVW5rbm93biIpKTsNCiAgICAgICAgfQ0KDQogICAg ICAgIHB1YmxpYyBHdWlkIEdldFBrZXlJZCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIFZhcmlhYmxlQmFnIHBrYiA9IG5ldyBWYXJpYWJsZUJhZyhQU1Zl cnNpb24uV2luTW9kZXJuKTsNCiAgICAgICAgICAgIHBrYi5CbG9ja3MuQWRkUmFuZ2UobmV3W10NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBu ZXcgQ1JDQmxvY2tNb2Rlcm4NCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gQ1JDQmxvY2tUeXBlLlNUUklORywN CiAgICAgICAgICAgICAgICAgICAgS2V5QXNTdHIgPSAiU3BwUGtleUJpbmRpbmdQcm9kdWN0S2V5IiwNCiAgICAgICAgICAgICAgICAgICAgVmFsdWVBc1N0 ciA9IFRvU3RyaW5nKCkNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIG5ldyBDUkNCbG9ja01vZGVybg0KICAgICAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgPSBDUkNCbG9ja1R5cGUuQklOQVJZLA0KICAgICAgICAgICAgICAgICAgICBLZXlBc1N0ciA9ICJTcHBQ a2V5QmluZGluZ01pc2NEYXRhIiwNCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBuZXcgYnl0ZVtdIHsgfQ0KICAgICAgICAgICAgICAgIH0sDQogICAg ICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IENSQ0Jsb2Nr VHlwZS5TVFJJTkcsDQogICAgICAgICAgICAgICAgICAgIEtleUFzU3RyID0gIlNwcFBrZXlCaW5kaW5nQWxnb3JpdGhtIiwNCiAgICAgICAgICAgICAgICAg ICAgVmFsdWVBc1N0ciA9IEdldEFsZ29VcmkoKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICByZXR1cm4gbmV3 IEd1aWQoQ3J5cHRvVXRpbHMuU0hBMjU2SGFzaChwa2IuU2VyaWFsaXplKCkpLlRha2UoMTYpLlRvQXJyYXkoKSk7DQogICAgICAgIH0NCg0KICAgICAgICBw dWJsaWMgc3RyaW5nIEdldE1QQygpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChtcGMgIT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAg ICAgICByZXR1cm4gbXBjOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpbnQgYnVpbGQgPSBFbnZpcm9ubWVudC5PU1ZlcnNpb24uVmVyc2lvbi5C dWlsZDsNCg0KICAgICAgICAgICAgbXBjID0gYnVpbGQgPj0gMTAyNDAgPyAiMDM2MTIiIDoNCiAgICAgICAgICAgICAgICAgICAgYnVpbGQgPj0gOTYwMCA/ ICIwNjQwMSIgOg0KICAgICAgICAgICAgICAgICAgICBidWlsZCA+PSA5MjAwID8gIjA1NDI2IiA6DQogICAgICAgICAgICAgICAgICAgICI1NTA0MSI7DQoN CiAgICAgICAgICAgIC8vIHNldHVwLmNmZyBkb2Vzbid0IGV4aXN0IGluIFdpbmRvd3MgOCsNCiAgICAgICAgICAgIHN0cmluZyBzZXR1cGNmZyA9IHN0cmlu Zy5Gb3JtYXQoQCJ7MH1cb29iZVx7MX0iLCBFbnZpcm9ubWVudC5TeXN0ZW1EaXJlY3RvcnksICJzZXR1cC5jZmciKTsNCg0KICAgICAgICAgICAgaWYgKCFG aWxlLkV4aXN0cyhzZXR1cGNmZykgfHwgRWRpdGlvbi5Db250YWlucygiOyIpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiBtcGM7 DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHN0cmluZyBtcGNLZXkgPSBzdHJpbmcuRm9ybWF0KCJ7MH0uezF9PSIsIFV0aWxzLkdldEFyY2hpdGVj dHVyZSgpLCBFZGl0aW9uKTsNCiAgICAgICAgICAgIHN0cmluZyBsb2NhbE1QQyA9IEZpbGUuUmVhZEFsbExpbmVzKHNldHVwY2ZnKS5GaXJzdE9yRGVmYXVs dChsaW5lID0+IGxpbmUuQ29udGFpbnMobXBjS2V5KSk7DQogICAgICAgICAgICBpZiAobG9jYWxNUEMgIT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAg ICAgICAgICAgICBtcGMgPSBsb2NhbE1QQy5TcGxpdCgnPScpWzFdLlRyaW0oKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIG1wYzsN CiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0UGlkMigpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChwaWQyICE9IG51bGwpDQog ICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHBpZDI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHBpZDIgPSAiIjsNCg0KICAg ICAgICAgICAgaWYgKEFsZ29yaXRobSA9PSBQS2V5QWxnb3JpdGhtLlBLRVkyMDA1KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHN0cmluZyBt cGMgPSBHZXRNUEMoKTsNCiAgICAgICAgICAgICAgICBzdHJpbmcgc2VyaWFsSGlnaDsNCiAgICAgICAgICAgICAgICBpbnQgc2VyaWFsTG93Ow0KICAgICAg ICAgICAgICAgIGludCBsYXN0UGFydDsNCg0KICAgICAgICAgICAgICAgIGlmIChFdWxhVHlwZSA9PSAiT0VNIikNCiAgICAgICAgICAgICAgICB7DQogICAg ICAgICAgICAgICAgICAgIHNlcmlhbEhpZ2ggPSAiT0VNIjsNCiAgICAgICAgICAgICAgICAgICAgc2VyaWFsTG93ID0gKChHcm91cCAvIDIpICUgMTAwKSAq IDEwMDAwICsgKFNlcmlhbCAvIDEwMDAwMCk7DQogICAgICAgICAgICAgICAgICAgIGxhc3RQYXJ0ID0gU2VyaWFsICUgMTAwMDAwOw0KICAgICAgICAgICAg ICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBzZXJpYWxIaWdoID0gKFNlcmlhbCAv IDEwMDAwMDApLlRvU3RyaW5nKCJEMyIpOw0KICAgICAgICAgICAgICAgICAgICBzZXJpYWxMb3cgPSBTZXJpYWwgJSAxMDAwMDAwOw0KICAgICAgICAgICAg ICAgICAgICBsYXN0UGFydCA9ICgoR3JvdXAgLyAyKSAlIDEwMCkgKiAxMDAwICsgbmV3IFJhbmRvbSgpLk5leHQoMTAwMCk7DQogICAgICAgICAgICAgICAg fQ0KDQogICAgICAgICAgICAgICAgaW50IGNoZWNrc3VtID0gMDsNCg0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKGNoYXIgYyBpbiBzZXJpYWxMb3cuVG9T dHJpbmcoKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtICs9IGludC5QYXJzZShjLlRvU3RyaW5nKCkpOw0KICAg ICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjaGVja3N1bSA9IDcgLSAoY2hlY2tzdW0gJSA3KTsNCg0KICAgICAgICAgICAgICAgIHBpZDIgPSBz dHJpbmcuRm9ybWF0KCJ7MH0tezF9LXsyOkQ2fXszfS17NDpENX0iLCBtcGMsIHNlcmlhbEhpZ2gsIHNlcmlhbExvdywgY2hlY2tzdW0sIGxhc3RQYXJ0KTsN CiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIHBpZDI7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldFBpZDMoKQ0K ICAgICAgICB7DQogICAgICAgICAgICBCaW5hcnlXcml0ZXIgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOw0KICAgICAg ICAgICAgd3JpdGVyLldyaXRlKDB4QTQpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKDB4Myk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGVGaXhlZFN0 cmluZyhHZXRQaWQyKCksIDI0KTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShHcm91cCk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGVGaXhlZFN0cmlu ZyhQYXJ0TnVtYmVyLCAxNik7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGVQYWRkaW5nKDB4NkMpOw0KICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSB3cml0 ZXIuR2V0Qnl0ZXMoKTsNCiAgICAgICAgICAgIGJ5dGVbXSBjcmMgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoflV0aWxzLkNSQzMyKGRhdGEuUmV2ZXJzZSgp LlRvQXJyYXkoKSkpLlJldmVyc2UoKS5Ub0FycmF5KCk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoY3JjKTsNCg0KICAgICAgICAgICAgcmV0dXJuIHdy aXRlci5HZXRCeXRlcygpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRQaWQ0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgQmlu YXJ5V3JpdGVyIHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0cmVhbSgpKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgweDRGOCk7 DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoMHg0KTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZUZpeGVkU3RyaW5nMTYoR2V0RXh0ZW5kZWRQaWQoKSwg MHg4MCk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGVGaXhlZFN0cmluZzE2KEFjdGl2YXRpb25JZC5Ub1N0cmluZygpLCAweDgwKTsNCiAgICAgICAgICAg IHdyaXRlci5Xcml0ZVBhZGRpbmcoMHgxMCk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGVGaXhlZFN0cmluZzE2KEVkaXRpb24sIDB4MjA4KTsNCiAgICAg ICAgICAgIHdyaXRlci5Xcml0ZShVcGdyYWRlID8gKHVsb25nKTEgOiAwKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZVBhZGRpbmcoMHg1MCk7DQogICAg ICAgICAgICB3cml0ZXIuV3JpdGVGaXhlZFN0cmluZzE2KFBhcnROdW1iZXIsIDB4ODApOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlRml4ZWRTdHJpbmcx NihDaGFubmVsLCAweDgwKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZUZpeGVkU3RyaW5nMTYoRXVsYVR5cGUsIDB4ODApOw0KDQogICAgICAgICAgICBy ZXR1cm4gd3JpdGVyLkdldEJ5dGVzKCk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEV4dGVuZGVkUGlkKCkNCiAgICAgICAgew0K ICAgICAgICAgICAgc3RyaW5nIG1wYyA9IEdldE1QQygpOw0KICAgICAgICAgICAgaW50IHNlcmlhbEhpZ2ggPSBTZXJpYWwgLyAxMDAwMDAwOw0KICAgICAg ICAgICAgaW50IHNlcmlhbExvdyA9IFNlcmlhbCAlIDEwMDAwMDA7DQogICAgICAgICAgICBpbnQgbGljZW5zZVR5cGU7DQogICAgICAgICAgICB1aW50IGxj aWQgPSBVdGlscy5HZXRTeXN0ZW1EZWZhdWx0TENJRCgpOw0KICAgICAgICAgICAgaW50IGJ1aWxkID0gRW52aXJvbm1lbnQuT1NWZXJzaW9uLlZlcnNpb24u QnVpbGQ7DQogICAgICAgICAgICBpbnQgZGF5T2ZZZWFyID0gRGF0ZVRpbWUuTm93LkRheU9mWWVhcjsNCiAgICAgICAgICAgIGludCB5ZWFyID0gRGF0ZVRp bWUuTm93LlllYXI7DQoNCiAgICAgICAgICAgIHN3aXRjaCAoRXVsYVR5cGUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSAiT0VNIjoN CiAgICAgICAgICAgICAgICAgICAgbGljZW5zZVR5cGUgPSAyOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgICAgIGNhc2Ug IlZvbHVtZSI6DQogICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VUeXBlID0gMzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAg ICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICBsaWNlbnNlVHlwZSA9IDA7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAg ICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgNCiAgICAgICAgICAgICAgICAiezB9LXsxOkQ1fS17MjpEM30tezM6RDZ9LXs0OkQy fS17NTpENH0tezY6RDR9LjAwMDAtezc6RDN9ezg6RDR9IiwNCiAgICAgICAgICAgICAgICBtcGMsDQogICAgICAgICAgICAgICAgR3JvdXAsDQogICAgICAg ICAgICAgICAgc2VyaWFsSGlnaCwNCiAgICAgICAgICAgICAgICBzZXJpYWxMb3csDQogICAgICAgICAgICAgICAgbGljZW5zZVR5cGUsDQogICAgICAgICAg ICAgICAgbGNpZCwNCiAgICAgICAgICAgICAgICBidWlsZCwNCiAgICAgICAgICAgICAgICBkYXlPZlllYXIsDQogICAgICAgICAgICAgICAgeWVhcg0KICAg ICAgICAgICAgKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBieXRlW10gR2V0UGhvbmVEYXRhKFBTVmVyc2lvbiB2ZXJzaW9uKQ0KICAgICAgICB7 DQogICAgICAgICAgICBpZiAodmVyc2lvbiA9PSBQU1ZlcnNpb24uV2luNykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB1bG9uZyBzaG9ydGF1 dGggPSAoKHVsb25nKUdyb3VwIDw8IDQxKSB8IChTZWN1cml0eSA8PCAzMSkgfCAoKHVsb25nKVNlcmlhbCA8PCAxKSB8IChVcGdyYWRlID8gKHVsb25nKTEg OiAwKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLkdldEJ5dGVzKHNob3J0YXV0aCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAg ICAgIGludCBzZXJpYWxIaWdoID0gU2VyaWFsIC8gMTAwMDAwMDsNCiAgICAgICAgICAgIGludCBzZXJpYWxMb3cgPSBTZXJpYWwgJSAxMDAwMDAwOw0KDQog ICAgICAgICAgICBCaW5hcnlXcml0ZXIgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOw0KICAgICAgICAgICAgc3RyaW5n IGFsZ29JZCA9IEFsZ29yaXRobSA9PSBQS2V5QWxnb3JpdGhtLlBLRVkyMDA1ID8gIkI4NzMxNTk1LUEyRjYtNDMwQi1BNzk5LUZCRkZCODFBOEQ3MyIgOiAi NjYwNjcyRUYtNzgwOS00Q0ZELThENTQtNDFCN0ZCNzM4OTg4IjsNCg0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKG5ldyBHdWlkKGFsZ29JZCkuVG9CeXRl QXJyYXkoKSk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoR3JvdXApOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKHNlcmlhbEhpZ2gpOw0KICAgICAg ICAgICAgd3JpdGVyLldyaXRlKHNlcmlhbExvdyk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoVXBncmFkZSA/IDEgOiAwKTsNCiAgICAgICAgICAgIHdy aXRlci5Xcml0ZShTZWN1cml0eSk7DQoNCiAgICAgICAgICAgIHJldHVybiB3cml0ZXIuR2V0Qnl0ZXMoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1Ymxp YyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdHJpbmcga2V5U3RyID0gIiI7DQogICAgICAgICAgICBSYW5k b20gcm5kID0gbmV3IFJhbmRvbShHcm91cCAqIDEwMDAwMDAwMDAgKyBTZXJpYWwpOw0KDQogICAgICAgICAgICBpZiAoQWxnb3JpdGhtID09IFBLZXlBbGdv cml0aG0uUEtFWTIwMDUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAga2V5U3RyID0gIkg0WDNESDRYM0RINFgzREg0WDNEIjsNCg0KICAgICAg ICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAga2V5U3RyICs9IEFM UEhBQkVUW3JuZC5OZXh0KDI0KV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSBpZiAoQWxnb3JpdGhtID09 IFBLZXlBbGdvcml0aG0uUEtFWTIwMDkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaW50IGxhc3QgPSAwOw0KICAgICAgICAgICAgICAgIGJ5 dGVbXSBiS2V5ID0gS2V5Qnl0ZXM7DQoNCiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMjQ7IGkgPj0gMDsgaS0tKQ0KICAgICAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICAgICAgaW50IGN1cnJlbnQgPSAwOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAxNDsgaiA+PSAwOyBqLS0p DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKj0gMHgxMDA7DQogICAgICAgICAgICAgICAgICAgICAg ICBjdXJyZW50ICs9IGJLZXlbal07DQogICAgICAgICAgICAgICAgICAgICAgICBiS2V5W2pdID0gKGJ5dGUpKGN1cnJlbnQgLyAyNCk7DQogICAgICAgICAg ICAgICAgICAgICAgICBjdXJyZW50ICU9IDI0Ow0KICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGN1cnJlbnQ7DQogICAgICAgICAgICAgICAgICAg IH0NCg0KICAgICAgICAgICAgICAgICAgICBrZXlTdHIgPSBBTFBIQUJFVFtjdXJyZW50XSArIGtleVN0cjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAg ICAgICAgICAgICBrZXlTdHIgPSBrZXlTdHIuU3Vic3RyaW5nKDEsIGxhc3QpICsgIk4iICsga2V5U3RyLlN1YnN0cmluZyhsYXN0ICsgMSwga2V5U3RyLkxl bmd0aCAtIGxhc3QgLSAxKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDU7IGkgPCBrZXlTdHIuTGVuZ3RoOyBpICs9IDYp DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAga2V5U3RyID0ga2V5U3RyLkluc2VydChpLCAiLSIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAg ICAgICByZXR1cm4ga2V5U3RyOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8vIExpYlRTZm9yZ2UvU1BQL1NMQVBJLmNzDQpuYW1lc3BhY2UgTGliVFNm b3JnZS5TUFANCnsNCiAgICB1c2luZyBTeXN0ZW07DQogICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQogICAgdXNpbmcgU3lzdGVtLkxp bnE7DQogICAgdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOw0KICAgIHVzaW5nIFN5c3RlbS5UZXh0Ow0KDQogICAgcHVibGljIHN0YXRp YyBjbGFzcyBTTEFwaQ0KICAgIHsNCiAgICAgICAgcHJpdmF0ZSBlbnVtIFNMSURUWVBFDQogICAgICAgIHsNCiAgICAgICAgICAgIFNMX0lEX0FQUExJQ0FU SU9OLA0KICAgICAgICAgICAgU0xfSURfUFJPRFVDVF9TS1UsDQogICAgICAgICAgICBTTF9JRF9MSUNFTlNFX0ZJTEUsDQogICAgICAgICAgICBTTF9JRF9M SUNFTlNFLA0KICAgICAgICAgICAgU0xfSURfUEtFWSwNCiAgICAgICAgICAgIFNMX0lEX0FMTF9MSUNFTlNFUywNCiAgICAgICAgICAgIFNMX0lEX0FMTF9M SUNFTlNFX0ZJTEVTLA0KICAgICAgICAgICAgU0xfSURfU1RPUkVfVE9LRU4sDQogICAgICAgICAgICBTTF9JRF9MQVNUDQogICAgICAgIH0NCg0KICAgICAg ICBwcml2YXRlIGVudW0gU0xEQVRBVFlQRQ0KICAgICAgICB7DQogICAgICAgICAgICBTTF9EQVRBX05PTkUsDQogICAgICAgICAgICBTTF9EQVRBX1NaLA0K ICAgICAgICAgICAgU0xfREFUQV9EV09SRCwNCiAgICAgICAgICAgIFNMX0RBVEFfQklOQVJZLA0KICAgICAgICAgICAgU0xfREFUQV9NVUxUSV9TWiwNCiAg ICAgICAgICAgIFNMX0RBVEFfU1VNDQogICAgICAgIH0NCg0KICAgICAgICBbU3RydWN0TGF5b3V0KExheW91dEtpbmQuU2VxdWVudGlhbCldDQogICAgICAg IHByaXZhdGUgc3RydWN0IFNMX0xJQ0VOU0lOR19TVEFUVVMNCiAgICAgICAgew0KICAgICAgICAgICAgcHVibGljIEd1aWQgU2t1SWQ7DQogICAgICAgICAg ICBwdWJsaWMgdWludCBlU3RhdHVzOw0KICAgICAgICAgICAgcHVibGljIHVpbnQgZHdHcmFjZVRpbWU7DQogICAgICAgICAgICBwdWJsaWMgdWludCBkd1Rv dGFsR3JhY2VEYXlzOw0KICAgICAgICAgICAgcHVibGljIHVpbnQgaHJSZWFzb247DQogICAgICAgICAgICBwdWJsaWMgdWxvbmcgcXdWYWxpZGl0eUV4cGly YXRpb247DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEd1aWQgV0lORE9XU19BUFBfSUQgPSBuZXcgR3VpZCgiNTVjOTI3 MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmIik7DQoNCiAgICAgICAgW0RsbEltcG9ydCgic2xjLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNv ZGUsIFByZXNlcnZlU2lnID0gZmFsc2UpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdm9pZCBTTE9wZW4ob3V0IEludFB0ciBoU0xDKTsNCg0K ICAgICAgICBbRGxsSW1wb3J0KCJzbGMuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuVW5pY29kZSwgUHJlc2VydmVTaWcgPSBmYWxzZSldDQogICAgICAgIHBy aXZhdGUgc3RhdGljIGV4dGVybiB2b2lkIFNMQ2xvc2UoSW50UHRyIGhTTEMpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoInNsYy5kbGwiLCBDaGFyU2V0ID0g Q2hhclNldC5Vbmljb2RlKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgU0xHZXRXaW5kb3dzSW5mb3JtYXRpb25EV09SRChzdHJpbmcg VmFsdWVOYW1lLCByZWYgaW50IFZhbHVlKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJzbGMuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuVW5pY29kZSldDQog ICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiB1aW50IFNMSW5zdGFsbFByb29mT2ZQdXJjaGFzZShJbnRQdHIgaFNMQywgc3RyaW5nIHB3c3pQS2V5QWxn b3JpdGhtLCBzdHJpbmcgcHdzelBLZXlTdHJpbmcsIHVpbnQgY2JQS2V5U3BlY2lmaWNEYXRhLCBieXRlW10gcGJQS2V5U3BlY2lmaWNEYXRhLCByZWYgR3Vp ZCBQS2V5SWQpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoInNsYy5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5Vbmljb2RlKV0NCiAgICAgICAgcHJpdmF0ZSBz dGF0aWMgZXh0ZXJuIHVpbnQgU0xVbmluc3RhbGxQcm9vZk9mUHVyY2hhc2UoSW50UHRyIGhTTEMsIHJlZiBHdWlkIFBLZXlJZCk7DQoNCiAgICAgICAgW0Rs bEltcG9ydCgic2xjLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNvZGUpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBTTEdldFBL ZXlJbmZvcm1hdGlvbihJbnRQdHIgaFNMQywgcmVmIEd1aWQgcFBLZXlJZCwgc3RyaW5nIHB3c3pWYWx1ZU5hbWUsIG91dCBTTERBVEFUWVBFIHBlRGF0YVR5 cGUsIG91dCB1aW50IHBjYlZhbHVlLCBvdXQgSW50UHRyIHBwYlZhbHVlKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJzbGNleHQuZGxsIiwgQ2hhclNldCA9 IENoYXJTZXQuVW5pY29kZSldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiB1aW50IFNMQWN0aXZhdGVQcm9kdWN0KEludFB0ciBoU0xDLCByZWYg R3VpZCBwUHJvZHVjdFNrdUlkLCBieXRlW10gY2JBcHBTcGVjaWZpY0RhdGEsIGJ5dGVbXSBwdkFwcFNwZWNpZmljRGF0YSwgYnl0ZVtdIHBBY3RpdmF0aW9u SW5mbywgc3RyaW5nIHB3c3pQcm94eVNlcnZlciwgdXNob3J0IHdQcm94eVBvcnQpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoInNsYy5kbGwiLCBDaGFyU2V0 ID0gQ2hhclNldC5Vbmljb2RlKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgU0xHZW5lcmF0ZU9mZmxpbmVJbnN0YWxsYXRpb25JZChJ bnRQdHIgaFNMQywgcmVmIEd1aWQgcFByb2R1Y3RTa3VJZCwgcmVmIHN0cmluZyBwcHdzekluc3RhbGxhdGlvbklkKTsNCg0KICAgICAgICBbRGxsSW1wb3J0 KCJzbGMuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuVW5pY29kZSldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiB1aW50IFNMRGVwb3NpdE9mZmxp bmVDb25maXJtYXRpb25JZChJbnRQdHIgaFNMQywgcmVmIEd1aWQgcFByb2R1Y3RTa3VJZCwgc3RyaW5nIHB3c3pJbnN0YWxsYXRpb25JZCwgc3RyaW5nIHB3 c3pDb25maXJtYXRpb25JZCk7DQoNCiAgICAgICAgW0RsbEltcG9ydCgic2xjLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNvZGUpXQ0KICAgICAgICBw cml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBTTEdldFNMSURMaXN0KEludFB0ciBoU0xDLCBTTElEVFlQRSBlUXVlcnlJZFR5cGUsIHJlZiBHdWlkIHBRdWVy eUlkLCBTTElEVFlQRSBlUmV0dXJuSWRUeXBlLCBvdXQgdWludCBwblJldHVybklkcywgb3V0IEludFB0ciBwcFJldHVybklkcyk7DQoNCiAgICAgICAgW0Rs bEltcG9ydCgic2xjLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNvZGUsIFByZXNlcnZlU2lnID0gZmFsc2UpXQ0KICAgICAgICBwcml2YXRlIHN0YXRp YyBleHRlcm4gdm9pZCBTTEdldExpY2Vuc2luZ1N0YXR1c0luZm9ybWF0aW9uKEludFB0ciBoU0xDLCByZWYgR3VpZCBwQXBwSUQsIEludFB0ciBwUHJvZHVj dFNrdUlkLCBzdHJpbmcgcHdzelJpZ2h0TmFtZSwgb3V0IHVpbnQgcG5TdGF0dXNDb3VudCwgb3V0IEludFB0ciBwcExpY2Vuc2luZ1N0YXR1cyk7DQoNCiAg ICAgICAgW0RsbEltcG9ydCgic2xjLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNvZGUpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWlu dCBTTEdldEluc3RhbGxlZFByb2R1Y3RLZXlJZHMoSW50UHRyIGhTTEMsIHJlZiBHdWlkIHBQcm9kdWN0U2t1SWQsIG91dCB1aW50IHBuUHJvZHVjdEtleUlk cywgb3V0IEludFB0ciBwcFByb2R1Y3RLZXlJZHMpOw0KDQogICAgICAgIFtEbGxJbXBvcnQoInNsYy5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5Vbmljb2Rl KV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgU0xDb25zdW1lV2luZG93c1JpZ2h0KHVpbnQgdW5rbm93bik7DQoNCiAgICAgICAgW0Rs bEltcG9ydCgic2xjLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNvZGUpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBTTEdldFBy b2R1Y3RTa3VJbmZvcm1hdGlvbihJbnRQdHIgaFNMQywgcmVmIEd1aWQgcFByb2R1Y3RTa3VJZCwgc3RyaW5nIHB3c3pWYWx1ZU5hbWUsIG91dCBTTERBVEFU WVBFIHBlRGF0YVR5cGUsIG91dCB1aW50IHBjYlZhbHVlLCBvdXQgSW50UHRyIHBwYlZhbHVlKTsNCg0KICAgICAgICBbRGxsSW1wb3J0KCJzbGMuZGxsIiwg Q2hhclNldCA9IENoYXJTZXQuVW5pY29kZSldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiB1aW50IFNMR2V0TGljZW5zZShJbnRQdHIgaFNMQywg cmVmIEd1aWQgcExpY2Vuc2VGaWxlSWQsIG91dCB1aW50IHBjYkxpY2Vuc2VGaWxlLCBvdXQgSW50UHRyIHBwYkxpY2Vuc2VGaWxlKTsNCg0KICAgICAgICBb RGxsSW1wb3J0KCJzbGMuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuVW5pY29kZSldDQogICAgICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiB1aW50IFNMU2V0 Q3VycmVudFByb2R1Y3RLZXkoSW50UHRyIGhTTEMsIHJlZiBHdWlkIHBQcm9kdWN0U2t1SWQsIHJlZiBHdWlkIHBQcm9kdWN0S2V5SWQpOw0KDQogICAgICAg IFtEbGxJbXBvcnQoInNsYy5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5Vbmljb2RlKV0NCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVpbnQgU0xG aXJlRXZlbnQoSW50UHRyIGhTTEMsIHN0cmluZyBwd3N6RXZlbnRJZCwgcmVmIEd1aWQgcEFwcGxpY2F0aW9uSWQpOw0KDQogICAgICAgIHByaXZhdGUgY2xh c3MgU0xDb250ZXh0IDogSURpc3Bvc2FibGUNCiAgICAgICAgew0KICAgICAgICAgICAgcHVibGljIHJlYWRvbmx5IEludFB0ciBIYW5kbGU7DQoNCiAgICAg ICAgICAgIHB1YmxpYyBTTENvbnRleHQoKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFNMT3BlbihvdXQgSGFuZGxlKTsNCiAgICAgICAgICAg IH0NCg0KICAgICAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgU0xDbG9zZShIYW5kbGUpOw0K ICAgICAgICAgICAgICAgIEdDLlN1cHByZXNzRmluYWxpemUodGhpcyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIH5TTENvbnRleHQoKQ0KICAg ICAgICAgICAgew0KICAgICAgICAgICAgICAgIERpc3Bvc2UoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMg R3VpZCBHZXREZWZhdWx0QWN0aXZhdGlvbklEKEd1aWQgYXBwSWQsIGJvb2wgaW5jbHVkZUFjdGl2YXRlZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNp bmcgKFNMQ29udGV4dCBzbCA9IG5ldyBTTENvbnRleHQoKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB1aW50IGNvdW50Ow0KICAgICAgICAg ICAgICAgIEludFB0ciBwTGljU3RhdDsNCg0KICAgICAgICAgICAgICAgIFNMR2V0TGljZW5zaW5nU3RhdHVzSW5mb3JtYXRpb24oc2wuSGFuZGxlLCByZWYg YXBwSWQsIEludFB0ci5aZXJvLCBudWxsLCBvdXQgY291bnQsIG91dCBwTGljU3RhdCk7DQoNCiAgICAgICAgICAgICAgICB1bnNhZmUNCiAgICAgICAgICAg ICAgICB7DQogICAgICAgICAgICAgICAgICAgIFNMX0xJQ0VOU0lOR19TVEFUVVMqIGxpY2Vuc2luZ1N0YXR1c2VzID0gKFNMX0xJQ0VOU0lOR19TVEFUVVMq KXBMaWNTdGF0Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspDQogICAgICAgICAgICAgICAgICAgIHsNCiAg ICAgICAgICAgICAgICAgICAgICAgIFNMX0xJQ0VOU0lOR19TVEFUVVMgc2xTdGF0dXMgPSBsaWNlbnNpbmdTdGF0dXNlc1tpXTsNCg0KICAgICAgICAgICAg ICAgICAgICAgICAgR3VpZCBhY3RJZCA9IHNsU3RhdHVzLlNrdUlkOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdldEluc3RhbGxlZFBrZXlJRChh Y3RJZCkgPT0gR3VpZC5FbXB0eSkgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNBZGRvbihhY3RJZCkpIGNvbnRpbnVlOw0KICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlQWN0aXZhdGVkICYmIChzbFN0YXR1cy5lU3RhdHVzID09IDEpKSBjb250aW51ZTsNCg0KICAgICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdElkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAg ICAgcmV0dXJuIEd1aWQuRW1wdHk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRJbnN0YWxs YXRpb25JRChHdWlkIGFjdElkKQ0KICAgICAgICB7DQogICAgICAgICAgICB1c2luZyAoU0xDb250ZXh0IHNsID0gbmV3IFNMQ29udGV4dCgpKQ0KICAgICAg ICAgICAgew0KICAgICAgICAgICAgICAgIHN0cmluZyBpbnN0YWxsYXRpb25JZCA9IG51bGw7DQogICAgICAgICAgICAgICAgcmV0dXJuIFNMR2VuZXJhdGVP ZmZsaW5lSW5zdGFsbGF0aW9uSWQoc2wuSGFuZGxlLCByZWYgYWN0SWQsIHJlZiBpbnN0YWxsYXRpb25JZCkgPT0gMCA/IGluc3RhbGxhdGlvbklkIDogbnVs bDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgR3VpZCBHZXRJbnN0YWxsZWRQa2V5SUQoR3VpZCBhY3RJZCkN CiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNMQ29udGV4dCBzbCA9IG5ldyBTTENvbnRleHQoKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAg ICAgICB1aW50IGNvdW50Ow0KICAgICAgICAgICAgICAgIEludFB0ciBwUHJvZHVjdEtleUlkczsNCg0KICAgICAgICAgICAgICAgIHVpbnQgc3RhdHVzID0g U0xHZXRTTElETGlzdChzbC5IYW5kbGUsIFNMSURUWVBFLlNMX0lEX1BST0RVQ1RfU0tVLCByZWYgYWN0SWQsIFNMSURUWVBFLlNMX0lEX1BLRVksIG91dCBj b3VudCwgb3V0IHBQcm9kdWN0S2V5SWRzKTsNCg0KICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjb3VudCA9PSAwKQ0KICAgICAgICAgICAg ICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEd1aWQuRW1wdHk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgdW5zYWZl IHsgcmV0dXJuICooR3VpZCopcFByb2R1Y3RLZXlJZHM7IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdWlu dCBEZXBvc2l0Q29uZmlybWF0aW9uSUQoR3VpZCBhY3RJZCwgc3RyaW5nIGluc3RhbGxhdGlvbklkLCBzdHJpbmcgY29uZmlybWF0aW9uSWQpDQogICAgICAg IHsNCiAgICAgICAgICAgIHVzaW5nIChTTENvbnRleHQgc2wgPSBuZXcgU0xDb250ZXh0KCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0 dXJuIFNMRGVwb3NpdE9mZmxpbmVDb25maXJtYXRpb25JZChzbC5IYW5kbGUsIHJlZiBhY3RJZCwgaW5zdGFsbGF0aW9uSWQsIGNvbmZpcm1hdGlvbklkKTsN CiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWZyZXNoTGljZW5zZVN0YXR1cygpDQogICAgICAgIHsN CiAgICAgICAgICAgIFNMQ29uc3VtZVdpbmRvd3NSaWdodCgwKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWZyZXNoVHJ1 c3RlZFRpbWUoR3VpZCBhY3RJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNMQ29udGV4dCBzbCA9IG5ldyBTTENvbnRleHQoKSkNCiAgICAg ICAgICAgIHsNCiAgICAgICAgICAgICAgICBTTERBVEFUWVBFIHR5cGU7DQogICAgICAgICAgICAgICAgdWludCBjb3VudDsNCiAgICAgICAgICAgICAgICBJ bnRQdHIgcHBiVmFsdWU7DQoNCiAgICAgICAgICAgICAgICBTTEdldFByb2R1Y3RTa3VJbmZvcm1hdGlvbihzbC5IYW5kbGUsIHJlZiBhY3RJZCwgIlRydXN0 ZWRUaW1lIiwgb3V0IHR5cGUsIG91dCBjb3VudCwgb3V0IHBwYlZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBz dGF0aWMgdm9pZCBGaXJlU3RhdGVDaGFuZ2VkRXZlbnQoR3VpZCBhcHBJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNMQ29udGV4dCBzbCA9 IG5ldyBTTENvbnRleHQoKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBTTEZpcmVFdmVudChzbC5IYW5kbGUsICJtc2Z0OnJtL2V2ZW50L2xp Y2Vuc2luZ3N0YXRlY2hhbmdlZCIsIHJlZiBhcHBJZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIEd1aWQg R2V0QXBwSWQoR3VpZCBhY3RJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNMQ29udGV4dCBzbCA9IG5ldyBTTENvbnRleHQoKSkNCiAgICAg ICAgICAgIHsNCiAgICAgICAgICAgICAgICB1aW50IGNvdW50Ow0KICAgICAgICAgICAgICAgIEludFB0ciBwQXBwSWRzOw0KDQogICAgICAgICAgICAgICAg dWludCBzdGF0dXMgPSBTTEdldFNMSURMaXN0KHNsLkhhbmRsZSwgU0xJRFRZUEUuU0xfSURfUFJPRFVDVF9TS1UsIHJlZiBhY3RJZCwgU0xJRFRZUEUuU0xf SURfQVBQTElDQVRJT04sIG91dCBjb3VudCwgb3V0IHBBcHBJZHMpOw0KDQogICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNvdW50ID09IDAp DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gR3VpZC5FbXB0eTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAg ICAgICAgICB1bnNhZmUgeyByZXR1cm4gKihHdWlkKilwQXBwSWRzOyB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3Rh dGljIGJvb2wgSXNBZGRvbihHdWlkIGFjdElkKQ0KICAgICAgICB7DQogICAgICAgICAgICB1c2luZyAoU0xDb250ZXh0IHNsID0gbmV3IFNMQ29udGV4dCgp KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHVpbnQgY291bnQ7DQogICAgICAgICAgICAgICAgU0xEQVRBVFlQRSB0eXBlOw0KICAgICAgICAg ICAgICAgIEludFB0ciBwcGJWYWx1ZTsNCg0KICAgICAgICAgICAgICAgIHVpbnQgc3RhdHVzID0gU0xHZXRQcm9kdWN0U2t1SW5mb3JtYXRpb24oc2wuSGFu ZGxlLCByZWYgYWN0SWQsICJEZXBlbmRzT24iLCBvdXQgdHlwZSwgb3V0IGNvdW50LCBvdXQgcHBiVmFsdWUpOw0KICAgICAgICAgICAgICAgIHJldHVybiAo aW50KXN0YXR1cyA+PSAwICYmIHN0YXR1cyAhPSAweEMwMDRGMDEyOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRp YyBHdWlkIEdldExpY2Vuc2VGaWxlSWQoR3VpZCBsaWNJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNMQ29udGV4dCBzbCA9IG5ldyBTTENv bnRleHQoKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB1aW50IGNvdW50Ow0KICAgICAgICAgICAgICAgIEludFB0ciBwcFJldHVybkxpY3M7 DQoNCiAgICAgICAgICAgICAgICB1aW50IHN0YXR1cyA9IFNMR2V0U0xJRExpc3Qoc2wuSGFuZGxlLCBTTElEVFlQRS5TTF9JRF9MSUNFTlNFLCByZWYgbGlj SWQsIFNMSURUWVBFLlNMX0lEX0xJQ0VOU0VfRklMRSwgb3V0IGNvdW50LCBvdXQgcHBSZXR1cm5MaWNzKTsNCg0KICAgICAgICAgICAgICAgIGlmIChzdGF0 dXMgIT0gMCB8fCBjb3VudCA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEd1aWQuRW1wdHk7DQogICAgICAg ICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgdW5zYWZlIHsgcmV0dXJuICooR3VpZCopcHBSZXR1cm5MaWNzOyB9DQogICAgICAgICAgICB9DQogICAg ICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIEd1aWQgR2V0UGtleUNvbmZpZ0ZpbGVJZChHdWlkIGFjdElkKQ0KICAgICAgICB7DQogICAgICAgICAg ICB1c2luZyAoU0xDb250ZXh0IHNsID0gbmV3IFNMQ29udGV4dCgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFNMREFUQVRZUEUgdHlwZTsN CiAgICAgICAgICAgICAgICB1aW50IGxlbjsNCiAgICAgICAgICAgICAgICBJbnRQdHIgcHBSZXR1cm5MaWNzOw0KDQogICAgICAgICAgICAgICAgdWludCBz dGF0dXMgPSBTTEdldFByb2R1Y3RTa3VJbmZvcm1hdGlvbihzbC5IYW5kbGUsIHJlZiBhY3RJZCwgInBrZXlDb25maWdMaWNlbnNlSWQiLCBvdXQgdHlwZSwg b3V0IGxlbiwgb3V0IHBwUmV0dXJuTGljcyk7DQoNCiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDAgfHwgbGVuID09IDApDQogICAgICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gR3VpZC5FbXB0eTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBHdWlkIHBr Y0lkID0gbmV3IEd1aWQoTWFyc2hhbC5QdHJUb1N0cmluZ0F1dG8ocHBSZXR1cm5MaWNzKSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIEdldExpY2Vuc2VG aWxlSWQocGtjSWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0TGljZW5zZUNvbnRlbnRz KEd1aWQgZmlsZUlkKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoZmlsZUlkID09IEd1aWQuRW1wdHkpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlv bigiTGljZW5zZSBjb250ZW50cyBjb3VsZCBub3QgYmUgcmV0cmlldmVkLiIpOw0KDQogICAgICAgICAgICB1c2luZyAoU0xDb250ZXh0IHNsID0gbmV3IFNM Q29udGV4dCgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHVpbnQgZGF0YUxlbjsNCiAgICAgICAgICAgICAgICBJbnRQdHIgZGF0YVB0cjsN Cg0KICAgICAgICAgICAgICAgIGlmIChTTEdldExpY2Vuc2Uoc2wuSGFuZGxlLCByZWYgZmlsZUlkLCBvdXQgZGF0YUxlbiwgb3V0IGRhdGFQdHIpICE9IDAp DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAg ICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2RhdGFMZW5dOw0KICAgICAgICAgICAgICAgIE1hcnNoYWwuQ29weShkYXRhUHRyLCBkYXRhLCAwLCAoaW50KWRh dGFMZW4pOw0KDQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuU2tpcChBcnJheS5JbmRleE9mKGRhdGEsIChieXRlKSc8JykpLlRvQXJyYXkoKTsNCiAg ICAgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoZGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBw dWJsaWMgc3RhdGljIGJvb2wgSXNQaG9uZUFjdGl2YXRhYmxlKEd1aWQgYWN0SWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVzaW5nIChTTENvbnRleHQg c2wgPSBuZXcgU0xDb250ZXh0KCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdWludCBjb3VudDsNCiAgICAgICAgICAgICAgICBTTERBVEFU WVBFIHR5cGU7DQogICAgICAgICAgICAgICAgSW50UHRyIHBwYlZhbHVlOw0KDQogICAgICAgICAgICAgICAgdWludCBzdGF0dXMgPSBTTEdldFByb2R1Y3RT a3VJbmZvcm1hdGlvbihzbC5IYW5kbGUsIHJlZiBhY3RJZCwgIm1zZnQ6c2wvRVVML1BIT05FL1BVQkxJQyIsIG91dCB0eXBlLCBvdXQgY291bnQsIG91dCBw cGJWYWx1ZSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cyAhPSAweEMwMDRGMDEyOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAg ICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0UEtleUNoYW5uZWwoR3VpZCBwa2V5SWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVzaW5nIChTTENvbnRl eHQgc2wgPSBuZXcgU0xDb250ZXh0KCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgU0xEQVRBVFlQRSB0eXBlOw0KICAgICAgICAgICAgICAg IHVpbnQgbGVuOw0KICAgICAgICAgICAgICAgIEludFB0ciBwcGJWYWx1ZTsNCg0KICAgICAgICAgICAgICAgIHVpbnQgc3RhdHVzID0gU0xHZXRQS2V5SW5m b3JtYXRpb24oc2wuSGFuZGxlLCByZWYgcGtleUlkLCAiQ2hhbm5lbCIsIG91dCB0eXBlLCBvdXQgbGVuLCBvdXQgcHBiVmFsdWUpOw0KDQogICAgICAgICAg ICAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGxlbiA9PSAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQog ICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIE1hcnNoYWwuUHRyVG9TdHJpbmdBdXRvKHBwYlZhbHVlKTsNCiAgICAgICAgICAg IH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldE1ldGFTdHIoR3VpZCBhY3RJZCwgc3RyaW5nIHZhbHVlKQ0KICAgICAg ICB7DQogICAgICAgICAgICB1c2luZyAoU0xDb250ZXh0IHNsID0gbmV3IFNMQ29udGV4dCgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHVp bnQgbGVuOw0KICAgICAgICAgICAgICAgIFNMREFUQVRZUEUgdHlwZTsNCiAgICAgICAgICAgICAgICBJbnRQdHIgcHBiVmFsdWU7DQoNCiAgICAgICAgICAg ICAgICB1aW50IHN0YXR1cyA9IFNMR2V0UHJvZHVjdFNrdUluZm9ybWF0aW9uKHNsLkhhbmRsZSwgcmVmIGFjdElkLCB2YWx1ZSwgb3V0IHR5cGUsIG91dCBs ZW4sIG91dCBwcGJWYWx1ZSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDAgfHwgbGVuID09IDAgfHwgdHlwZSAhPSBTTERBVEFUWVBFLlNM X0RBVEFfU1opDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAg ICAgICAgICAgICByZXR1cm4gTWFyc2hhbC5QdHJUb1N0cmluZ0F1dG8ocHBiVmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAg cHVibGljIHN0YXRpYyBMaXN0PEd1aWQ+IEdldEFjdGl2YXRpb25JZHMoR3VpZCBhcHBJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNMQ29u dGV4dCBzbCA9IG5ldyBTTENvbnRleHQoKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB1aW50IGNvdW50Ow0KICAgICAgICAgICAgICAgIElu dFB0ciBwTGljU3RhdDsNCg0KICAgICAgICAgICAgICAgIFNMR2V0TGljZW5zaW5nU3RhdHVzSW5mb3JtYXRpb24oc2wuSGFuZGxlLCByZWYgYXBwSWQsIElu dFB0ci5aZXJvLCBudWxsLCBvdXQgY291bnQsIG91dCBwTGljU3RhdCk7DQoNCiAgICAgICAgICAgICAgICBMaXN0PEd1aWQ+IHJlc3VsdCA9IG5ldyBMaXN0 PEd1aWQ+KCk7DQoNCiAgICAgICAgICAgICAgICB1bnNhZmUNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIFNMX0xJQ0VOU0lOR19T VEFUVVMqIGxpY2Vuc2luZ1N0YXR1c2VzID0gKFNMX0xJQ0VOU0lOR19TVEFUVVMqKXBMaWNTdGF0Ow0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBp ID0gMDsgaSA8IGNvdW50OyBpKyspDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5BZGQobGljZW5zaW5n U3RhdHVzZXNbaV0uU2t1SWQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIHJl c3VsdDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdWludCBTZXRDdXJyZW50UHJvZHVjdEtleShHdWlkIGFj dElkLCBHdWlkIHBrZXlJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNMQ29udGV4dCBzbCA9IG5ldyBTTENvbnRleHQoKSkNCiAgICAgICAg ICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gU0xTZXRDdXJyZW50UHJvZHVjdEtleShzbC5IYW5kbGUsIHJlZiBhY3RJZCwgcmVmIHBrZXlJZCk7DQog ICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIHVpbnQgSW5zdGFsbFByb2R1Y3RLZXkoUHJvZHVjdEtleSBwa2V5KQ0K ICAgICAgICB7DQogICAgICAgICAgICB1c2luZyAoU0xDb250ZXh0IHNsID0gbmV3IFNMQ29udGV4dCgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAg ICAgIEd1aWQgcGtleUlkID0gR3VpZC5FbXB0eTsNCiAgICAgICAgICAgICAgICByZXR1cm4gU0xJbnN0YWxsUHJvb2ZPZlB1cmNoYXNlKHNsLkhhbmRsZSwg cGtleS5HZXRBbGdvVXJpKCksIHBrZXkuVG9TdHJpbmcoKSwgMCwgbnVsbCwgcmVmIHBrZXlJZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAg ICAgICBwdWJsaWMgc3RhdGljIHZvaWQgVW5pbnN0YWxsUHJvZHVjdEtleShHdWlkIHBrZXlJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNM Q29udGV4dCBzbCA9IG5ldyBTTENvbnRleHQoKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBTTFVuaW5zdGFsbFByb29mT2ZQdXJjaGFzZShz bC5IYW5kbGUsIHJlZiBwa2V5SWQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFVuaW5zdGFsbEFs bFByb2R1Y3RLZXlzKEd1aWQgYXBwSWQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKEd1aWQgYWN0SWQgaW4gR2V0QWN0aXZhdGlvbklkcyhh cHBJZCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgR3VpZCBwa2V5SWQgPSBHZXRJbnN0YWxsZWRQa2V5SUQoYWN0SWQpOw0KICAgICAgICAg ICAgICAgIGlmIChwa2V5SWQgPT0gR3VpZC5FbXB0eSkgY29udGludWU7DQogICAgICAgICAgICAgICAgaWYgKElzQWRkb24oYWN0SWQpKSBjb250aW51ZTsN CiAgICAgICAgICAgICAgICBVbmluc3RhbGxQcm9kdWN0S2V5KHBrZXlJZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KLy8g TGliVFNmb3JnZS9TUFAvU1BQVXRpbHMuY3MNCm5hbWVzcGFjZSBMaWJUU2ZvcmdlLlNQUA0Kew0KICAgIHVzaW5nIE1pY3Jvc29mdC5XaW4zMjsNCiAgICB1 c2luZyBTeXN0ZW07DQogICAgdXNpbmcgU3lzdGVtLklPOw0KICAgIHVzaW5nIFN5c3RlbS5MaW5xOw0KICAgIHVzaW5nIFN5c3RlbS5TZXJ2aWNlUHJvY2Vz czsNCiAgICB1c2luZyBDcnlwdG87DQogICAgdXNpbmcgUGh5c2ljYWxTdG9yZTsNCiAgICB1c2luZyBUb2tlblN0b3JlOw0KDQogICAgcHVibGljIHN0YXRp YyBjbGFzcyBTUFBVdGlscw0KICAgIHsNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEtpbGxTUFAoUFNWZXJzaW9uIHZlcnNpb24pDQogICAgICAgIHsN CiAgICAgICAgICAgIFNlcnZpY2VDb250cm9sbGVyIHNjOw0KDQogICAgICAgICAgICBzdHJpbmcgc3ZjTmFtZSA9IHZlcnNpb24gPT0gUFNWZXJzaW9uLlZp c3RhID8gInNsc3ZjIiA6ICJzcHBzdmMiOw0KDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBzYyA9IG5ldyBTZXJ2 aWNlQ29udHJvbGxlcihzdmNOYW1lKTsNCg0KICAgICAgICAgICAgICAgIGlmIChzYy5TdGF0dXMgPT0gU2VydmljZUNvbnRyb2xsZXJTdGF0dXMuU3RvcHBl ZCkNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb25FeGNlcHRp b24gZXgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgi VW5hYmxlIHRvIGFjY2VzcyB7MH06ICIsIHN2Y05hbWUpICsgZXguTWVzc2FnZSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0 ZUxpbmUoc3RyaW5nLkZvcm1hdCgiU3RvcHBpbmcgezB9Li4uIiwgc3ZjTmFtZSkpOw0KDQogICAgICAgICAgICBib29sIHN0b3BwZWQgPSBmYWxzZTsNCg0K ICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IHN0b3BwZWQgPT0gZmFsc2UgJiYgaSA8IDEwODA7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAg ICAgICB0cnkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmIChzYy5TdGF0dXMgIT0gU2VydmljZUNvbnRyb2xsZXJTdGF0dXMu U3RvcFBlbmRpbmcpDQogICAgICAgICAgICAgICAgICAgICAgICBzYy5TdG9wKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgc2MuV2FpdEZvclN0YXR1cyhT ZXJ2aWNlQ29udHJvbGxlclN0YXR1cy5TdG9wcGVkLCBUaW1lU3Bhbi5Gcm9tTWlsbGlzZWNvbmRzKDUwMCkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAg ICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlNlcnZpY2VQcm9jZXNzLlRpbWVvdXRFeGNlcHRpb24pDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAg ICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gZXgp DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJXYXJuaW5nOiBTdG9wcGluZyBzcHBzdmMgZmFpbGVk LCByZXRyeWluZy4gRGV0YWlsczogIiArIGV4Lk1lc3NhZ2UpOw0KICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1 MDApOw0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTsN CiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKCFzdG9wcGVkKQ0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uVGltZW91dEV4Y2Vw dGlvbihzdHJpbmcuRm9ybWF0KCJGYWlsZWQgdG8gc3RvcCB7MH0iLCBzdmNOYW1lKSk7DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoc3RyaW5n LkZvcm1hdCgiezB9IHN0b3BwZWQgc3VjY2Vzc2Z1bGx5LiIsIHN2Y05hbWUpKTsNCg0KICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gUFNWZXJzaW9uLlZp c3RhICYmIFNQU3lzLklzU3BTeXNSdW5uaW5nKCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgTG9nZ2VyLldyaXRlTGluZSgiVW5sb2FkaW5n IHNwc3lzLi4uIik7DQoNCiAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gU1BTeXMuQ29udHJvbFNwU3lzKGZhbHNlKTsNCg0KICAgICAgICAgICAgICAg IGlmIChzdGF0dXMgPCAwKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8g dW5sb2FkIHNwc3lzIik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgTG9nZ2VyLldyaXRlTGluZSgic3BzeXMgdW5sb2FkZWQgc3Vj Y2Vzc2Z1bGx5LiIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlc3RhcnRTUFAoUFNWZXJzaW9u IHZlcnNpb24pDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IFBTVmVyc2lvbi5WaXN0YSkNCiAgICAgICAgICAgIHsNCiAgICAgICAg ICAgICAgICBTZXJ2aWNlQ29udHJvbGxlciBzYzsNCg0KICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAg ICAgc2MgPSBuZXcgU2VydmljZUNvbnRyb2xsZXIoInNsc3ZjIik7DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKHNjLlN0YXR1cyA9PSBTZXJ2aWNlQ29u dHJvbGxlclN0YXR1cy5SdW5uaW5nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg ICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJ bnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gYWNjZXNzIHNsc3ZjOiAiICsgZXguTWVzc2FnZSk7DQogICAgICAgICAgICAgICAgfQ0KDQog ICAgICAgICAgICAgICAgTG9nZ2VyLldyaXRlTGluZSgiU3RhcnRpbmcgc2xzdmMuLi4iKTsNCg0KICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRlZCA9IGZh bHNlOw0KDQogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IHN0YXJ0ZWQgPT0gZmFsc2UgJiYgaSA8IDM2MDsgaSsrKQ0KICAgICAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYy5TdGF0dXMg IT0gU2VydmljZUNvbnRyb2xsZXJTdGF0dXMuU3RhcnRQZW5kaW5nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLlN0YXJ0KCk7DQoNCiAgICAg ICAgICAgICAgICAgICAgICAgIHNjLldhaXRGb3JTdGF0dXMoU2VydmljZUNvbnRyb2xsZXJTdGF0dXMuUnVubmluZywgVGltZVNwYW4uRnJvbU1pbGxpc2Vj b25kcyg1MDApKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLlNlcnZpY2VQcm9jZXNzLlRpbWVv dXRFeGNlcHRpb24pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAg ICB9DQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAg ICAgICAgICAgICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJXYXJuaW5nOiBTdGFydGluZyBzbHN2YyBmYWlsZWQsIHJldHJ5aW5nLiBEZXRhaWxzOiAi ICsgZXguTWVzc2FnZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcCg1MDApOw0KICAgICAgICAgICAg ICAgICAgICAgICAgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTsNCiAgICAg ICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0ZWQpDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uVGltZW91 dEV4Y2VwdGlvbigiRmFpbGVkIHRvIHN0YXJ0IHNsc3ZjIik7DQoNCiAgICAgICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJzbHN2YyBzdGFydGVkIHN1 Y2Nlc3NmdWxseS4iKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgU0xBcGkuUmVmcmVzaExpY2Vuc2VTdGF0dXMoKTsNCiAgICAgICAgfQ0KDQog ICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBEZXRlY3RDdXJyZW50S2V5KCkNCiAgICAgICAgew0KICAgICAgICAgICAgU0xBcGkuUmVmcmVzaExpY2Vuc2VT dGF0dXMoKTsNCg0KICAgICAgICAgICAgdXNpbmcgKFJlZ2lzdHJ5S2V5IHdwYUtleSA9IFJlZ2lzdHJ5LkxvY2FsTWFjaGluZS5PcGVuU3ViS2V5KEAiU1lT VEVNXFdQQSIpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBzdWJLZXkgaW4gd3BhS2V5LkdldFN1YktleU5hbWVz KCkpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAoc3ViS2V5LlN0YXJ0c1dpdGgoIjhERUMwQUYxIikpDQogICAgICAgICAg ICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWJLZXkuQ29udGFpbnMoIlAiKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiRmFpbGVkIHRv IGF1dG9kZXRlY3Qga2V5IHR5cGUsIHNwZWNpZnkgcGh5c2ljYWwgc3RvcmUga2V5IHdpdGggL3Byb2Qgb3IgL3Rlc3QgYXJndW1lbnRzLiIpOw0KICAgICAg ICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0UFNQYXRoKFBTVmVyc2lvbiB2ZXJzaW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBz d2l0Y2ggKHZlcnNpb24pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSBQU1ZlcnNpb24uVmlzdGE6DQogICAgICAgICAgICAgICAgY2Fz ZSBQU1ZlcnNpb24uV2luNzoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdG9yeS5HZXRGaWxlcygNCiAgICAgICAgICAgICAgICAgICAgICAg IEVudmlyb25tZW50LkdldEZvbGRlclBhdGgoRW52aXJvbm1lbnQuU3BlY2lhbEZvbGRlci5TeXN0ZW0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgIjdC Mjk2RkIwLTM3NkItNDk3ZS1CMDEyLTlDNDUwRTFCNzMyNy0qLkM3NDgzNDU2LUEyODktNDM5ZC04MTE1LTYwMTYzMkQwMDVBMCIpDQogICAgICAgICAgICAg ICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpID8/ICIiOw0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgIHN0cmluZyBwc0Rp ciA9IEVudmlyb25tZW50LkV4cGFuZEVudmlyb25tZW50VmFyaWFibGVzKA0KICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZylSZWdpc3RyeS5HZXRW YWx1ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIkhLRVlfTE9DQUxfTUFDSElORVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJy ZW50VmVyc2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRva2VuU3RvcmUiLA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICIiDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAg ICAgICAgIHN0cmluZyBwc1BhdGggPSBQYXRoLkNvbWJpbmUocHNEaXIsICJkYXRhLmRhdCIpOw0KDQogICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcu SXNOdWxsT3JFbXB0eShwc0RpcikgfHwgIUZpbGUuRXhpc3RzKHBzUGF0aCkpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAg ICAgIHN0cmluZ1tdIHBzRGlycyA9DQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzcHBcc3RvcmUi LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAic3BwXHN0b3JlXDIuMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzcHBcc3RvcmVf dGVzdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJzcHBcc3RvcmVfdGVzdFwyLjAiDQogICAgICAgICAgICAgICAgICAgICAgICB9Ow0KDQog ICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgZGlyIGluIHBzRGlycykNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwc1BhdGggPSBQYXRoLkNvbWJpbmUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguQ29tYmluZSgN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LkdldEZvbGRlclBhdGgoRW52aXJvbm1lbnQuU3BlY2lhbEZvbGRlci5T eXN0ZW0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhLmRhdCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBzUGF0aCkpIHJldHVybiBwc1BhdGg7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAg ICAgICAgICAgIH0gDQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0 dXJuIHBzUGF0aDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24o IkZhaWxlZCB0byBsb2NhdGUgcGh5c2ljYWwgc3RvcmUuIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIHN0 cmluZyBHZXRUb2tlbnNQYXRoKFBTVmVyc2lvbiB2ZXJzaW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pDQogICAgICAgICAg ICB7DQogICAgICAgICAgICAgICAgY2FzZSBQU1ZlcnNpb24uVmlzdGE6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXRoLkNvbWJpbmUoDQogICAg ICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5FeHBhbmRFbnZpcm9ubWVudFZhcmlhYmxlcygiJVdJTkRJUiUiKSwNCiAgICAgICAgICAgICAgICAg ICAgICAgIEAiU2VydmljZVByb2ZpbGVzXE5ldHdvcmtTZXJ2aWNlXEFwcERhdGFcUm9hbWluZ1xNaWNyb3NvZnRcU29mdHdhcmVMaWNlbnNpbmdcdG9rZW5z LmRhdCINCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICBjYXNlIFBTVmVyc2lvbi5XaW43Og0KICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gUGF0aC5Db21iaW5lKA0KICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuRXhwYW5kRW52aXJvbm1lbnRWYXJpYWJsZXMoIiVXSU5E SVIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICBAIlNlcnZpY2VQcm9maWxlc1xOZXR3b3JrU2VydmljZVxBcHBEYXRhXFJvYW1pbmdcTWljcm9zb2Z0 XFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXHRva2Vucy5kYXQiDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgZGVmYXVsdDoN CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRva0RpciA9IEVudmlyb25tZW50LkV4cGFuZEVudmlyb25tZW50VmFyaWFibGVzKA0KICAgICAgICAgICAg ICAgICAgICAgICAgKHN0cmluZylSZWdpc3RyeS5HZXRWYWx1ZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIkhLRVlfTE9DQUxfTUFDSElORVxT T0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSIsDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgIlRva2VuU3RvcmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAg ICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIHN0cmluZyB0b2tQYXRoID0gUGF0aC5Db21iaW5lKHRva0RpciwgInRva2Vucy5kYXQi KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodG9rRGlyKSB8fCAhRmlsZS5FeGlzdHModG9rUGF0aCkpDQogICAg ICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tdIHRva0RpcnMgPQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAic3BwXHN0b3JlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAInNwcFxzdG9yZVwyLjAiLA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAic3BwXHN0b3JlX3Rlc3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAic3BwXHN0b3JlX3Rl c3RcMi4wIg0KICAgICAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGRpciBpbiB0b2tE aXJzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva1BhdGggPSBQYXRoLkNvbWJpbmUoDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGguQ29tYmluZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50 LkdldEZvbGRlclBhdGgoRW52aXJvbm1lbnQuU3BlY2lhbEZvbGRlci5TeXN0ZW0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGly DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbnMuZGF0Ig0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZS5FeGlzdHModG9rUGF0aCkpIHJldHVybiB0 b2tQYXRoOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAg ICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva1BhdGg7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAg ICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9jYXRlIHRva2VuIHN0b3JlLiIpOw0KICAgICAgICAg ICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBJUGh5c2ljYWxTdG9yZSBHZXRTdG9yZShQU1ZlcnNpb24gdmVyc2lvbiwgYm9vbCBw cm9kdWN0aW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdHJpbmcgcHNQYXRoID0gR2V0UFNQYXRoKHZlcnNpb24pOw0KDQogICAgICAgICAgICBzd2l0 Y2ggKHZlcnNpb24pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSBQU1ZlcnNpb24uVmlzdGE6DQogICAgICAgICAgICAgICAgICAgIHJl dHVybiBuZXcgUGh5c2ljYWxTdG9yZVZpc3RhKHBzUGF0aCwgcHJvZHVjdGlvbik7DQogICAgICAgICAgICAgICAgY2FzZSBQU1ZlcnNpb24uV2luNzoNCiAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQaHlzaWNhbFN0b3JlV2luNyhwc1BhdGgsIHByb2R1Y3Rpb24pOw0KICAgICAgICAgICAgICAgIGRlZmF1 bHQ6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGh5c2ljYWxTdG9yZU1vZGVybihwc1BhdGgsIHByb2R1Y3Rpb24sIHZlcnNpb24pOw0KICAg ICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBJVG9rZW5TdG9yZSBHZXRUb2tlblN0b3JlKFBTVmVyc2lvbiB2ZXJzaW9u KQ0KICAgICAgICB7DQogICAgICAgICAgICBzdHJpbmcgdG9rUGF0aCA9IEdldFRva2Vuc1BhdGgodmVyc2lvbik7DQoNCiAgICAgICAgICAgIHJldHVybiBu ZXcgVG9rZW5TdG9yZU1vZGVybih0b2tQYXRoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBEdW1wU3RvcmUoUFNWZXJzaW9u IHZlcnNpb24sIGJvb2wgcHJvZHVjdGlvbiwgc3RyaW5nIGZpbGVQYXRoLCBzdHJpbmcgZW5jckZpbGVQYXRoKQ0KICAgICAgICB7DQogICAgICAgICAgICBi b29sIG1hbmFnZVNwcCA9IGZhbHNlOw0KDQogICAgICAgICAgICBpZiAoZW5jckZpbGVQYXRoID09IG51bGwpDQogICAgICAgICAgICB7DQogICAgICAgICAg ICAgICAgZW5jckZpbGVQYXRoID0gR2V0UFNQYXRoKHZlcnNpb24pOw0KICAgICAgICAgICAgICAgIG1hbmFnZVNwcCA9IHRydWU7DQogICAgICAgICAgICAg ICAgS2lsbFNQUCh2ZXJzaW9uKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGVuY3JGaWxlUGF0aCkg fHwgIUZpbGUuRXhpc3RzKGVuY3JGaWxlUGF0aCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2Vw dGlvbigiU3RvcmUgZG9lcyBub3QgZXhpc3QgYXQgZXhwZWN0ZWQgcGF0aCAnIiArIGVuY3JGaWxlUGF0aCArICInLiIpOw0KICAgICAgICAgICAgfQ0KDQog ICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB1c2luZyAoRmlsZVN0cmVhbSBmcyA9IEZpbGUuT3BlbihlbmNyRmlsZVBh dGgsIEZpbGVNb2RlLk9wZW4sIEZpbGVBY2Nlc3MuUmVhZCwgRmlsZVNoYXJlLlJlYWQpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAg ICAgYnl0ZVtdIGVuY3JEYXRhID0gZnMuUmVhZEFsbEJ5dGVzKCk7DQogICAgICAgICAgICAgICAgICAgIEZpbGUuV3JpdGVBbGxCeXRlcyhmaWxlUGF0aCwg UGh5c1N0b3JlQ3J5cHRvLkRlY3J5cHRQaHlzaWNhbFN0b3JlKGVuY3JEYXRhLCBwcm9kdWN0aW9uLCB2ZXJzaW9uKSk7DQogICAgICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIlN0b3JlIGR1bXBlZCBzdWNjZXNzZnVsbHkgdG8gJyIgKyBmaWxlUGF0aCArICInLiIpOw0KICAg ICAgICAgICAgfQ0KICAgICAgICAgICAgZmluYWxseQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChtYW5hZ2VTcHApDQogICAgICAgICAg ICAgICAgew0KICAgICAgICAgICAgICAgICAgICBSZXN0YXJ0U1BQKHZlcnNpb24pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAg ICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBMb2FkU3RvcmUoUFNWZXJzaW9uIHZlcnNpb24sIGJvb2wgcHJvZHVjdGlvbiwgc3RyaW5nIGZp bGVQYXRoKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZmlsZVBhdGgpIHx8ICFGaWxlLkV4aXN0cyhmaWxlUGF0 aCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiU3RvcmUgZmlsZSAnIiArIGZpbGVQ YXRoICsgIicgZG9lcyBub3QgZXhpc3QuIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIEtpbGxTUFAodmVyc2lvbik7DQoNCiAgICAgICAgICAg IHVzaW5nIChJUGh5c2ljYWxTdG9yZSBzdG9yZSA9IEdldFN0b3JlKHZlcnNpb24sIHByb2R1Y3Rpb24pKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAg ICAgIHN0b3JlLldyaXRlUmF3KEZpbGUuUmVhZEFsbEJ5dGVzKGZpbGVQYXRoKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIFJlc3RhcnRTUFAo dmVyc2lvbik7DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIkxvYWRlZCBzdG9yZSBmaWxlIHN1Y2Nlc3NmdWxseS4iKTsNCiAgICAgICAgfQ0K ICAgIH0NCn0NCg0KDQovLyBMaWJUU2ZvcmdlL1NQUC9TUFN5cy5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuU1BQDQp7DQogICAgdXNpbmcgTWljcm9zb2Z0 LldpbjMyLlNhZmVIYW5kbGVzOw0KICAgIHVzaW5nIFN5c3RlbTsNCiAgICB1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQoNCiAgICBw dWJsaWMgY2xhc3MgU1BTeXMNCiAgICB7DQogICAgICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LkF1dG8sIFNldExh c3RFcnJvciA9IHRydWUpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIENyZWF0ZUZpbGUoc3RyaW5nIGxwRmlsZU5hbWUsIHVpbnQg ZHdEZXNpcmVkQWNjZXNzLCB1aW50IGR3U2hhcmVNb2RlLCBJbnRQdHIgbHBTZWN1cml0eUF0dHJpYnV0ZXMsIHVpbnQgZHdDcmVhdGlvbkRpc3Bvc2l0aW9u LCB1aW50IGR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCBJbnRQdHIgaFRlbXBsYXRlRmlsZSk7DQogICAgICAgIHByaXZhdGUgc3RhdGljIFNhZmVGaWxlSGFuZGxl IENyZWF0ZUZpbGVTYWZlKHN0cmluZyBkZXZpY2UpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBuZXcgU2FmZUZpbGVIYW5kbGUoQ3JlYXRlRmls ZShkZXZpY2UsIDB4QzAwMDAwMDAsIDAsIEludFB0ci5aZXJvLCAzLCAwLCBJbnRQdHIuWmVybyksIHRydWUpOw0KICAgICAgICB9DQoNCiAgICAgICAgW3Jl dHVybjogTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQm9vbCldDQogICAgICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0 LkF1dG8sIFNldExhc3RFcnJvciA9IHRydWUpXQ0KICAgICAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gYm9vbCBEZXZpY2VJb0NvbnRyb2woW0luXSBTYWZl RmlsZUhhbmRsZSBoRGV2aWNlLCBbSW5dIHVpbnQgZHdJb0NvbnRyb2xDb2RlLCBbSW5dIEludFB0ciBscEluQnVmZmVyLCBbSW5dIGludCBuSW5CdWZmZXJT aXplLCBbT3V0XSBJbnRQdHIgbHBPdXRCdWZmZXIsIFtJbl0gaW50IG5PdXRCdWZmZXJTaXplLCBvdXQgaW50IGxwQnl0ZXNSZXR1cm5lZCwgW0luXSBJbnRQ dHIgbHBPdmVybGFwcGVkKTsNCg0KICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNTcFN5c1J1bm5pbmcoKQ0KICAgICAgICB7DQogICAgICAgICAgICBT YWZlRmlsZUhhbmRsZSBmaWxlID0gQ3JlYXRlRmlsZVNhZmUoQCJcXC5cU3BEZXZpY2UiKTsNCiAgICAgICAgICAgIEludFB0ciBidWZmZXIgPSBNYXJzaGFs LkFsbG9jSEdsb2JhbCgxKTsNCiAgICAgICAgICAgIGludCBieXRlc1JldHVybmVkOw0KICAgICAgICAgICAgRGV2aWNlSW9Db250cm9sKGZpbGUsIDB4ODAw MDYwMDgsIEludFB0ci5aZXJvLCAwLCBidWZmZXIsIDEsIG91dCBieXRlc1JldHVybmVkLCBJbnRQdHIuWmVybyk7DQogICAgICAgICAgICBib29sIHJ1bm5p bmcgPSBNYXJzaGFsLlJlYWRCeXRlKGJ1ZmZlcikgIT0gMDsNCiAgICAgICAgICAgIE1hcnNoYWwuRnJlZUhHbG9iYWwoYnVmZmVyKTsNCiAgICAgICAgICAg IGZpbGUuQ2xvc2UoKTsNCiAgICAgICAgICAgIHJldHVybiBydW5uaW5nOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29udHJv bFNwU3lzKGJvb2wgc3RhcnQpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNhZmVGaWxlSGFuZGxlIGZpbGUgPSBDcmVhdGVGaWxlU2FmZShAIlxcLlxTcERl dmljZSIpOw0KICAgICAgICAgICAgSW50UHRyIGJ1ZmZlciA9IE1hcnNoYWwuQWxsb2NIR2xvYmFsKDQpOw0KICAgICAgICAgICAgaW50IGJ5dGVzUmV0dXJu ZWQ7DQogICAgICAgICAgICBEZXZpY2VJb0NvbnRyb2woZmlsZSwgc3RhcnQgPyAweDgwMDBhMDAwIDogMHg4MDAwYTAwNCwgSW50UHRyLlplcm8sIDAsIGJ1 ZmZlciwgNCwgb3V0IGJ5dGVzUmV0dXJuZWQsIEludFB0ci5aZXJvKTsNCiAgICAgICAgICAgIGludCByZXN1bHQgPSBNYXJzaGFsLlJlYWRJbnQzMihidWZm ZXIpOw0KICAgICAgICAgICAgTWFyc2hhbC5GcmVlSEdsb2JhbChidWZmZXIpOw0KICAgICAgICAgICAgZmlsZS5DbG9zZSgpOw0KICAgICAgICAgICAgcmV0 dXJuIHJlc3VsdDsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQovLyBMaWJUU2ZvcmdlL0NyeXB0by9DcnlwdG9VdGlscy5jcw0KbmFtZXNwYWNlIExpYlRT Zm9yZ2UuQ3J5cHRvDQp7DQogICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5nIFN5c3RlbS5MaW5xOw0KICAgIHVzaW5nIFN5c3RlbS5TZWN1cml0eS5Dcnlw dG9ncmFwaHk7DQoNCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENyeXB0b1V0aWxzDQogICAgew0KICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBHZW5l cmF0ZVJhbmRvbUtleShpbnQgbGVuKQ0KICAgICAgICB7DQogICAgICAgICAgICBieXRlW10gcmFuZCA9IG5ldyBieXRlW2xlbl07DQogICAgICAgICAgICBS YW5kb20gciA9IG5ldyBSYW5kb20oKTsNCiAgICAgICAgICAgIHIuTmV4dEJ5dGVzKHJhbmQpOw0KDQogICAgICAgICAgICByZXR1cm4gcmFuZDsNCiAgICAg ICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIEFFU0VuY3J5cHQoYnl0ZVtdIGRhdGEsIGJ5dGVbXSBrZXkpDQogICAgICAgIHsNCiAgICAg ICAgICAgIHVzaW5nIChBZXMgYWVzID0gQWVzLkNyZWF0ZSgpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGFlcy5LZXkgPSBrZXk7DQogICAg ICAgICAgICAgICAgYWVzLk1vZGUgPSBDaXBoZXJNb2RlLkNCQzsNCiAgICAgICAgICAgICAgICBhZXMuUGFkZGluZyA9IFBhZGRpbmdNb2RlLlBLQ1M3Ow0K DQogICAgICAgICAgICAgICAgSUNyeXB0b1RyYW5zZm9ybSBlbmNyeXB0b3IgPSBhZXMuQ3JlYXRlRW5jcnlwdG9yKGFlcy5LZXksIEVudW1lcmFibGUuUmVw ZWF0KChieXRlKTAsIDE2KS5Ub0FycmF5KCkpOw0KICAgICAgICAgICAgICAgIGJ5dGVbXSBlbmNyeXB0ZWREYXRhID0gZW5jcnlwdG9yLlRyYW5zZm9ybUZp bmFsQmxvY2soZGF0YSwgMCwgZGF0YS5MZW5ndGgpOw0KICAgICAgICAgICAgICAgIHJldHVybiBlbmNyeXB0ZWREYXRhOw0KICAgICAgICAgICAgfQ0KICAg ICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gQUVTRGVjcnlwdChieXRlW10gZGF0YSwgYnl0ZVtdIGtleSkNCiAgICAgICAgew0KICAg ICAgICAgICAgdXNpbmcgKEFlcyBhZXMgPSBBZXMuQ3JlYXRlKCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYWVzLktleSA9IGtleTsNCiAg ICAgICAgICAgICAgICBhZXMuTW9kZSA9IENpcGhlck1vZGUuQ0JDOw0KICAgICAgICAgICAgICAgIGFlcy5QYWRkaW5nID0gUGFkZGluZ01vZGUuUEtDUzc7 DQoNCiAgICAgICAgICAgICAgICBJQ3J5cHRvVHJhbnNmb3JtIGRlY3J5cHRvciA9IGFlcy5DcmVhdGVEZWNyeXB0b3IoYWVzLktleSwgRW51bWVyYWJsZS5S ZXBlYXQoKGJ5dGUpMCwgMTYpLlRvQXJyYXkoKSk7DQogICAgICAgICAgICAgICAgYnl0ZVtdIGRlY3J5cHRlZERhdGEgPSBkZWNyeXB0b3IuVHJhbnNmb3Jt RmluYWxCbG9jayhkYXRhLCAwLCBkYXRhLkxlbmd0aCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIGRlY3J5cHRlZERhdGE7DQogICAgICAgICAgICB9DQog ICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBSU0FEZWNyeXB0KGJ5dGVbXSByc2FLZXksIGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7 DQoNCiAgICAgICAgICAgIHVzaW5nIChSU0FDcnlwdG9TZXJ2aWNlUHJvdmlkZXIgcnNhID0gbmV3IFJTQUNyeXB0b1NlcnZpY2VQcm92aWRlcigpKQ0KICAg ICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJzYS5JbXBvcnRDc3BCbG9iKHJzYUtleSk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJzYS5EZWNyeXB0 KGRhdGEsIGZhbHNlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFJTQUVuY3J5cHQoYnl0ZVtd IHJzYUtleSwgYnl0ZVtdIGRhdGEpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVzaW5nIChSU0FDcnlwdG9TZXJ2aWNlUHJvdmlkZXIgcnNhID0gbmV3IFJT QUNyeXB0b1NlcnZpY2VQcm92aWRlcigpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJzYS5JbXBvcnRDc3BCbG9iKHJzYUtleSk7DQogICAg ICAgICAgICAgICAgcmV0dXJuIHJzYS5FbmNyeXB0KGRhdGEsIGZhbHNlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBz dGF0aWMgYnl0ZVtdIFJTQVNpZ24oYnl0ZVtdIHJzYUtleSwgYnl0ZVtdIGRhdGEpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVzaW5nIChSU0FDcnlwdG9T ZXJ2aWNlUHJvdmlkZXIgcnNhID0gbmV3IFJTQUNyeXB0b1NlcnZpY2VQcm92aWRlcigpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJzYS5J bXBvcnRDc3BCbG9iKHJzYUtleSk7DQogICAgICAgICAgICAgICAgUlNBUEtDUzFTaWduYXR1cmVGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IFJTQVBLQ1Mx U2lnbmF0dXJlRm9ybWF0dGVyKHJzYSk7DQogICAgICAgICAgICAgICAgZm9ybWF0dGVyLlNldEhhc2hBbGdvcml0aG0oIlNIQTEiKTsNCg0KICAgICAgICAg ICAgICAgIGJ5dGVbXSBoYXNoOw0KICAgICAgICAgICAgICAgIHVzaW5nIChTSEExIHNoYTEgPSBTSEExLkNyZWF0ZSgpKQ0KICAgICAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICAgICAgaGFzaCA9IHNoYTEuQ29tcHV0ZUhhc2goZGF0YSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAg cmV0dXJuIGZvcm1hdHRlci5DcmVhdGVTaWduYXR1cmUoaGFzaCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGlj IGJvb2wgUlNBVmVyaWZ5U2lnbmF0dXJlKGJ5dGVbXSByc2FLZXksIGJ5dGVbXSBkYXRhLCBieXRlW10gc2lnbmF0dXJlKQ0KICAgICAgICB7DQogICAgICAg ICAgICB1c2luZyAoUlNBQ3J5cHRvU2VydmljZVByb3ZpZGVyIHJzYSA9IG5ldyBSU0FDcnlwdG9TZXJ2aWNlUHJvdmlkZXIoKSkNCiAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICByc2EuSW1wb3J0Q3NwQmxvYihyc2FLZXkpOw0KICAgICAgICAgICAgICAgIFJTQVBLQ1MxU2lnbmF0dXJlRGVmb3JtYXR0ZXIg ZGVmb3JtYXR0ZXIgPSBuZXcgUlNBUEtDUzFTaWduYXR1cmVEZWZvcm1hdHRlcihyc2EpOw0KICAgICAgICAgICAgICAgIGRlZm9ybWF0dGVyLlNldEhhc2hB bGdvcml0aG0oIlNIQTEiKTsNCg0KICAgICAgICAgICAgICAgIGJ5dGVbXSBoYXNoOw0KICAgICAgICAgICAgICAgIHVzaW5nIChTSEExIHNoYTEgPSBTSEEx LkNyZWF0ZSgpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaGFzaCA9IHNoYTEuQ29tcHV0ZUhhc2goZGF0YSk7DQogICAgICAg ICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIGRlZm9ybWF0dGVyLlZlcmlmeVNpZ25hdHVyZShoYXNoLCBzaWduYXR1cmUpOw0KICAgICAg ICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gSE1BQ1NpZ24oYnl0ZVtdIGtleSwgYnl0ZVtdIGRhdGEpDQogICAg ICAgIHsNCiAgICAgICAgICAgIEhNQUNTSEExIGhtYWMgPSBuZXcgSE1BQ1NIQTEoa2V5KTsNCiAgICAgICAgICAgIHJldHVybiBobWFjLkNvbXB1dGVIYXNo KGRhdGEpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEhNQUNWZXJpZnkoYnl0ZVtdIGtleSwgYnl0ZVtdIGRhdGEsIGJ5dGVb XSBzaWduYXR1cmUpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBFbnVtZXJhYmxlLlNlcXVlbmNlRXF1YWwoc2lnbmF0dXJlLCBITUFDU2lnbihr ZXksIGRhdGEpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFNhbHRTSEFTdW0oYnl0ZVtdIHNhbHQsIGJ5dGVbXSBkYXRh KQ0KICAgICAgICB7DQogICAgICAgICAgICBTSEExIHNoYTEgPSBTSEExLkNyZWF0ZSgpOw0KICAgICAgICAgICAgYnl0ZVtdIHNoYV9kYXRhID0gc2FsdC5D b25jYXQoZGF0YSkuVG9BcnJheSgpOw0KICAgICAgICAgICAgcmV0dXJuIHNoYTEuQ29tcHV0ZUhhc2goc2hhX2RhdGEpOw0KICAgICAgICB9DQoNCiAgICAg ICAgcHVibGljIHN0YXRpYyBib29sIFNhbHRTSEFWZXJpZnkoYnl0ZVtdIHNhbHQsIGJ5dGVbXSBkYXRhLCBieXRlW10gY2hlY2tzdW0pDQogICAgICAgIHsN CiAgICAgICAgICAgIHJldHVybiBFbnVtZXJhYmxlLlNlcXVlbmNlRXF1YWwoY2hlY2tzdW0sIFNhbHRTSEFTdW0oc2FsdCwgZGF0YSkpOw0KICAgICAgICB9 DQoNCiAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gU0hBMjU2SGFzaChieXRlW10gZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgdXNpbmcgKFNI QTI1NiBzaGEyNTYgPSBTSEEyNTYuQ3JlYXRlKCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNoYTI1Ni5Db21wdXRlSGFzaChk YXRhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQovLyBMaWJUU2ZvcmdlL0NyeXB0by9LZXlzLmNzDQpuYW1lc3BhY2UgTGli VFNmb3JnZS5DcnlwdG8NCnsNCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEtleXMNCiAgICB7DQogICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0 ZVtdIFBST0RVQ1RJT04gPSB7DQogICAgICAgICAgICAweDA3LCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweEE0LCAweDAwLCAweDAwLCAweDUyLCAweDUz LCAweDQxLCAweDMyLCAweDAwLCAweDA0LCAweDAwLCAweDAwLA0KICAgICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgyOSwgMHg4NywgMHhC QSwgMHgzRiwgMHg1MiwgMHg5MCwgMHg1NywgMHhEOCwgMHgxMiwgMHgyNiwgMHg2QiwgMHgzOCwNCiAgICAgICAgICAgIDB4QjIsIDB4M0IsIDB4RjksIDB4 NjcsIDB4MDgsIDB4NEYsIDB4REQsIDB4OEIsIDB4RjUsIDB4RTMsIDB4MTEsIDB4QjgsIDB4NjEsIDB4M0EsIDB4MzMsIDB4NDIsDQogICAgICAgICAgICAw eDUxLCAweDY1LCAweDA1LCAweDg2LCAweDFFLCAweDAwLCAweDQxLCAweERFLCAweEM1LCAweERELCAweDQ0LCAweDYwLCAweDU2LCAweDNELCAweDE0LCAw eDM5LA0KICAgICAgICAgICAgMHhCNywgMHg0MywgMHg2NSwgMHhFOSwgMHhGNywgMHgyQiwgMHhBNSwgMHhGMCwgMHhBMywgMHg2NSwgMHg2OCwgMHhFOSwg MHhFNCwgMHg4QiwgMHg1QywgMHgwMywNCiAgICAgICAgICAgIDB4MkQsIDB4MzYsIDB4RkUsIDB4MjgsIDB4NEMsIDB4RDEsIDB4M0MsIDB4M0QsIDB4QzEs IDB4OTAsIDB4NzUsIDB4RjksIDB4NkUsIDB4MDIsIDB4RTAsIDB4NTgsDQogICAgICAgICAgICAweDk3LCAweDZBLCAweENBLCAweDgwLCAweDAyLCAweDQy LCAweDNGLCAweDZDLCAweDE1LCAweDg1LCAweDRELCAweDgzLCAweDIzLCAweDZBLCAweDk1LCAweDlFLA0KICAgICAgICAgICAgMHgzOCwgMHg1MiwgMHg1 OSwgMHgzOCwgMHg2QSwgMHg5OSwgMHhGMCwgMHhCNSwgMHhDRCwgMHg1MywgMHg3RSwgMHgwOCwgMHg3QywgMHhCNSwgMHg1MSwgMHhEMywNCiAgICAgICAg ICAgIDB4OEYsIDB4QTMsIDB4MEQsIDB4QTAsIDB4RkEsIDB4OEQsIDB4ODcsIDB4M0MsIDB4RkMsIDB4NTksIDB4MjEsIDB4RDgsIDB4MkUsIDB4RDksIDB4 OTcsIDB4OEIsDQogICAgICAgICAgICAweDQwLCAweDYwLCAweEIxLCAweEQ3LCAweDJCLCAweDBBLCAweDZFLCAweDYwLCAweEI1LCAweDUwLCAweENDLCAw eDNDLCAweEIxLCAweDU3LCAweEU0LCAweEI3LA0KICAgICAgICAgICAgMHhEQywgMHg1QSwgMHg0RCwgMHhFMSwgMHg1QywgMHhFMCwgMHg5NCwgMHg0Qywg MHg1RSwgMHgyOCwgMHhGRiwgMHhGQSwgMHg4MCwgMHg2QSwgMHgxMywgMHg1MywNCiAgICAgICAgICAgIDB4NTIsIDB4REIsIDB4RjMsIDB4MDQsIDB4OTIs IDB4NDMsIDB4MzgsIDB4QjksIDB4MUIsIDB4RDksIDB4ODUsIDB4NTQsIDB4N0IsIDB4MTQsIDB4QzcsIDB4ODksDQogICAgICAgICAgICAweDE2LCAweDhB LCAweDRCLCAweDgyLCAweEExLCAweDA4LCAweDAyLCAweDk5LCAweDIzLCAweDQ4LCAweERELCAweDc1LCAweDlDLCAweEM4LCAweEMxLCAweENFLA0KICAg ICAgICAgICAgMHhCMCwgMHhENywgMHgxQiwgMHhEOCwgMHhGQiwgMHgyRCwgMHhBNywgMHgyRSwgMHg0NywgMHhBNywgMHgxOCwgMHg0QiwgMHhGNiwgMHgy OSwgMHg2OSwgMHg0NCwNCiAgICAgICAgICAgIDB4MzAsIDB4MzMsIDB4QkEsIDB4QTcsIDB4MUYsIDB4Q0UsIDB4OTYsIDB4OUUsIDB4NDAsIDB4RTEsIDB4 NDMsIDB4RjAsIDB4RTAsIDB4MEQsIDB4MEEsIDB4MzIsDQogICAgICAgICAgICAweEI0LCAweEVFLCAweEExLCAweEMzLCAweDVFLCAweDlCLCAweEM3LCAw eDdGLCAweEY1LCAweDlELCAweEQ4LCAweEYyLCAweDBGLCAweEQ5LCAweDhGLCAweEFELA0KICAgICAgICAgICAgMHg3NSwgMHgwQSwgMHgwMCwgMHhENSwg MHgyNSwgMHg0MywgMHhGNywgMHhBRSwgMHg1MSwgMHg3RiwgMHhCNywgMHhERSwgMHhCNywgMHhBRCwgMHhGQiwgMHhDRSwNCiAgICAgICAgICAgIDB4ODMs IDB4RTEsIDB4ODEsIDB4RkYsIDB4REQsIDB4QTIsIDB4NzcsIDB4RkUsIDB4RUIsIDB4MjcsIDB4MUYsIDB4MTAsIDB4RkEsIDB4ODIsIDB4MzcsIDB4RjQs DQogICAgICAgICAgICAweDdFLCAweENDLCAweEUyLCAweEExLCAweDU4LCAweEM4LCAweEFGLCAweDFELCAweDFBLCAweDgxLCAweDMxLCAweDZFLCAweEY0 LCAweDhCLCAweDYzLCAweDM0LA0KICAgICAgICAgICAgMHhGMywgMHgwNSwgMHgwRiwgMHhFMSwgMHhDQywgMHgxNSwgMHhEQywgMHhBNCwgMHgyOCwgMHg3 QSwgMHg5RSwgMHhFQiwgMHg2MiwgMHhEOCwgMHhEOCwgMHg4QywNCiAgICAgICAgICAgIDB4ODUsIDB4RDcsIDB4MDcsIDB4ODcsIDB4OTAsIDB4MkYsIDB4 RjcsIDB4MUMsIDB4NTYsIDB4ODUsIDB4MkYsIDB4RUYsIDB4MzIsIDB4MzcsIDB4MDcsIDB4QUIsDQogICAgICAgICAgICAweEIwLCAweEU2LCAweEI1LCAw eDAyLCAweDE5LCAweDM1LCAweEFGLCAweERCLCAweEQ0LCAweEEyLCAweDlDLCAweDM2LCAweDgwLCAweEM2LCAweERDLCAweDgyLA0KICAgICAgICAgICAg MHgwOCwgMHhFMCwgMHhDMCwgMHg1RiwgMHgzQywgMHg1OSwgMHhBQSwgMHg0RSwgMHgyNiwgMHgwMywgMHgyOSwgMHhCMywgMHg2MiwgMHg1OCwgMHg0MSwg MHg1OSwNCiAgICAgICAgICAgIDB4M0EsIDB4MzcsIDB4NDMsIDB4MzUsIDB4RTMsIDB4OUYsIDB4MzQsIDB4RTIsIDB4QTEsIDB4MDQsIDB4OTcsIDB4MTIs IDB4OUQsIDB4OEMsIDB4QUQsIDB4RjcsDQogICAgICAgICAgICAweEZCLCAweDhDLCAweEExLCAweEEyLCAweEU5LCAweEU0LCAweEVGLCAweEQ5LCAweEM1 LCAweEU1LCAweERGLCAweDBFLCAweEJGLCAweDRBLCAweEUwLCAweDdBLA0KICAgICAgICAgICAgMHgxRSwgMHgxMCwgMHg1MCwgMHg1OCwgMHg2MywgMHg1 MSwgMHhFMSwgMHhENCwgMHhGRSwgMHg1NywgMHhCMCwgMHg5RSwgMHhENywgMHhEQSwgMHg4QywgMHhFRCwNCiAgICAgICAgICAgIDB4N0QsIDB4ODIsIDB4 QUMsIDB4MkYsIDB4MjUsIDB4NTgsIDB4MEEsIDB4NTgsIDB4RTYsIDB4QTQsIDB4RjQsIDB4NTcsIDB4NEIsIDB4QTQsIDB4MUIsIDB4NjUsDQogICAgICAg ICAgICAweEI5LCAweDRBLCAweDg3LCAweDQ2LCAweEVCLCAweDhDLCAweDBGLCAweDlBLCAweDQ4LCAweDkwLCAweEY5LCAweDlGLCAweDc2LCAweDY5LCAw eDAzLCAweDcyLA0KICAgICAgICAgICAgMHg3NywgMHhFQywgMHhDMSwgMHg0MiwgMHg0QywgMHg4NywgMHhEQiwgMHgwQiwgMHgzQywgMHhENCwgMHg3NCwg MHhFRiwgMHhFNSwgMHgzNCwgMHhFMCwgMHgzMiwNCiAgICAgICAgICAgIDB4NDUsIDB4QjAsIDB4RjgsIDB4QUIsIDB4RDUsIDB4MjYsIDB4MjEsIDB4RDcs IDB4RDIsIDB4OTgsIDB4NTQsIDB4OEYsIDB4NjQsIDB4ODgsIDB4MjAsIDB4MkIsDQogICAgICAgICAgICAweDE0LCAweEUzLCAweDgyLCAweEQ1LCAweDJB LCAweDRCLCAweDhGLCAweDRFLCAweDM1LCAweDIwLCAweDgyLCAweDdFLCAweDFCLCAweEZFLCAweEZBLCAweDJDLA0KICAgICAgICAgICAgMHg3OSwgMHg2 QywgMHg2RSwgMHg2NiwgMHg5NCwgMHhCQiwgMHgwQSwgMHhFQiwgMHhCQSwgMHhEOSwgMHg3MCwgMHg2MSwgMHhFOSwgMHg0NywgMHhCNSwgMHg4MiwNCiAg ICAgICAgICAgIDB4RkMsIDB4MTgsIDB4M0MsIDB4NjYsIDB4M0EsIDB4MDksIDB4MkUsIDB4MUYsIDB4NjEsIDB4NzQsIDB4Q0EsIDB4Q0IsIDB4RjYsIDB4 N0EsIDB4NTIsIDB4MzcsDQogICAgICAgICAgICAweDFELCAweEFDLCAweDhELCAweDYzLCAweDY5LCAweDg0LCAweDhFLCAweEM3LCAweDcwLCAweDU5LCAw eERELCAweDJELCAweDkxLCAweDFFLCAweEY3LCAweEIxLA0KICAgICAgICAgICAgMHg1NiwgMHhFRCwgMHg3QSwgMHgwNiwgMHg5RCwgMHg1QiwgMHgzMywg MHgxNSwgMHhERCwgMHgzMSwgMHhEMCwgMHhFNiwgMHgxNiwgMHgwNywgMHg5QiwgMHhBNSwNCiAgICAgICAgICAgIDB4OTQsIDB4MDYsIDB4N0QsIDB4QzEs IDB4RTksIDB4RDYsIDB4QzgsIDB4QUYsIDB4QjQsIDB4MUUsIDB4MkQsIDB4ODgsIDB4MDYsIDB4QTcsIDB4NjMsIDB4QjgsDQogICAgICAgICAgICAweENG LCAweEM4LCAweEEyLCAweDZFLCAweDg0LCAweEIzLCAweDhELCAweEU1LCAweDQ3LCAweEU2LCAweDEzLCAweDYzLCAweDhFLCAweEQxLCAweDdGLCAweEQ0 LA0KICAgICAgICAgICAgMHg4MSwgMHg0NCwgMHgzOCwgMHhCRg0KICAgICAgICB9Ow0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtd IFRFU1QgPSB7DQogICAgICAgICAgICAweDA3LCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweEE0LCAweDAwLCAweDAwLCAweDUyLCAweDUzLCAweDQxLCAw eDMyLCAweDAwLCAweDA0LCAweDAwLCAweDAwLA0KICAgICAgICAgICAgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwRiwgMHhCRSwgMHg3NywgMHhCOCwg MHhERCwgMHg1NCwgMHgzNiwgMHhERCwgMHg2NywgMHhENCwgMHgxNywgMHg2NiwNCiAgICAgICAgICAgIDB4QzQsIDB4MTMsIDB4RDEsIDB4M0YsIDB4MUUs IDB4MTYsIDB4MEMsIDB4MTYsIDB4MzUsIDB4QUIsIDB4NkQsIDB4M0QsIDB4MzQsIDB4NTEsIDB4RUQsIDB4M0YsDQogICAgICAgICAgICAweDU3LCAweDE0 LCAweEI2LCAweEI3LCAweDA4LCAweEU5LCAweEQ5LCAweDdBLCAweDgwLCAweEIzLCAweDVGLCAweDlCLCAweDNBLCAweEZELCAweDlFLCAweDM3LA0KICAg ICAgICAgICAgMHgzQSwgMHg1MywgMHg3MiwgMHg2NywgMHg5MiwgMHg2MCwgMHhDMywgMHhFRiwgMHhCNSwgMHg4RSwgMHgxRSwgMHhDRiwgMHg5RCwgMHg5 QywgMHhEMywgMHg5MCwNCiAgICAgICAgICAgIDB4RTUsIDB4REQsIDB4RjQsIDB4REIsIDB4RjMsIDB4RDYsIDB4NjUsIDB4QjMsIDB4QzEsIDB4QkQsIDB4 NjksIDB4RTEsIDB4NzYsIDB4OTUsIDB4RDksIDB4MzcsDQogICAgICAgICAgICAweEI4LCAweDVFLCAweENBLCAweDNELCAweDk4LCAweEZDLCAweDUwLCAw eDVDLCAweDk4LCAweEFFLCAweEUzLCAweDdDLCAweDRDLCAweDI3LCAweEMzLCAweEQwLA0KICAgICAgICAgICAgMHhDRSwgMHg3OCwgMHgwNiwgMHg1MSwg MHg2OCwgMHgyMywgMHhFNiwgMHg3MCwgMHhGOCwgMHg3QywgMHhBRSwgMHgzNiwgMHhCRSwgMHg0MSwgMHg1NywgMHhFMiwNCiAgICAgICAgICAgIDB4QzMs IDB4MkQsIDB4QUYsIDB4MjEsIDB4QjEsIDB4QjMsIDB4MTUsIDB4ODEsIDB4MTksIDB4MjYsIDB4NkIsIDB4MTAsIDB4QjMsIDB4RTksIDB4RDEsIDB4NDUs DQogICAgICAgICAgICAweDIxLCAweDc3LCAweDlDLCAweEY2LCAweEUxLCAweERELCAweEI2LCAweDc4LCAweDlELCAweDFELCAweDMyLCAweDYxLCAweEJD LCAweDJCLCAweERCLCAweDg2LA0KICAgICAgICAgICAgMHhGQiwgMHgwNywgMHgyNCwgMHgxMCwgMHgxOSwgMHg0RiwgMHgwOSwgMHg2RCwgMHgwMywgMHg5 MCwgMHhENCwgMHg1RSwgMHgzMCwgMHg4NSwgMHhDNSwgMHg1OCwNCiAgICAgICAgICAgIDB4N0UsIDB4NUQsIDB4QUUsIDB4OUYsIDB4NjQsIDB4OTMsIDB4 MDQsIDB4ODIsIDB4MDksIDB4MEUsIDB4MUMsIDB4NjYsIDB4QTgsIDB4OTUsIDB4OTEsIDB4NTEsDQogICAgICAgICAgICAweEIyLCAweEVELCAweDlBLCAw eDc1LCAweDA0LCAweDg3LCAweDUwLCAweEFDLCAweENDLCAweDIwLCAweDA2LCAweDQ1LCAweEI5LCAweDdCLCAweDQyLCAweDUzLA0KICAgICAgICAgICAg MHg5QSwgMHhEMSwgMHgyOSwgMHhGQywgMHhFRiwgMHhCOSwgMHg0NywgMHgxNiwgMHg3NSwgMHg2OSwgMHgwNSwgMHg4NywgMHgyQiwgMHhDQiwgMHg1NCwg MHg5QywNCiAgICAgICAgICAgIDB4MjEsIDB4MkQsIDB4NTAsIDB4OEUsIDB4MTIsIDB4REUsIDB4RDMsIDB4NkIsIDB4RUMsIDB4OTIsIDB4QTEsIDB4QjEs IDB4RTksIDB4NEIsIDB4QkYsIDB4NkIsDQogICAgICAgICAgICAweDlBLCAweDM4LCAweEM3LCAweDEzLCAweEZBLCAweDc4LCAweEExLCAweDNDLCAweDFF LCAweEJCLCAweDM4LCAweDMxLCAweEJCLCAweDBDLCAweDlGLCAweDcwLA0KICAgICAgICAgICAgMHgxQSwgMHgzMSwgMHgwMCwgMHhENywgMHg1QSwgMHhB NSwgMHg4NCwgMHgyNCwgMHg4OSwgMHg4MCwgMHhGNSwgMHg4OCwgMHhDMiwgMHgzMSwgMHgxOCwgMHhEQywNCiAgICAgICAgICAgIDB4NTMsIDB4MDUsIDB4 NUQsIDB4RkEsIDB4ODEsIDB4REMsIDB4RTEsIDB4Q0UsIDB4QTQsIDB4QUEsIDB4QkEsIDB4MDcsIDB4REEsIDB4MjgsIDB4NEYsIDB4NjQsDQogICAgICAg ICAgICAweDBFLCAweDg0LCAweDlCLCAweDA2LCAweERFLCAweEM4LCAweDc4LCAweDY2LCAweDJGLCAweDE3LCAweDI1LCAweEE4LCAweDlDLCAweDk5LCAw eEZDLCAweEJDLA0KICAgICAgICAgICAgMHg3RCwgMHgwMSwgMHg0MiwgMHhENywgMHgzNSwgMHhCRiwgMHgxOSwgMHhGNiwgMHgzRiwgMHgyMCwgMHhEOSwg MHg5OCwgMHg5QiwgMHg1RCwgMHhERCwgMHgzOSwNCiAgICAgICAgICAgIDB4QkUsIDB4ODEsIDB4MDAsIDB4MEIsIDB4REUsIDB4NkYsIDB4MTQsIDB4Q0Es IDB4N0UsIDB4RjgsIDB4QzAsIDB4MjYsIDB4QTgsIDB4MUQsIDB4RDEsIDB4MTYsDQogICAgICAgICAgICAweDg4LCAweDY0LCAweDg3LCAweDM2LCAweDQ1 LCAweDM3LCAweDUwLCAweERBLCAweDZDLCAweEVCLCAweDg1LCAweEI1LCAweDQzLCAweDI5LCAweDg4LCAweDZGLA0KICAgICAgICAgICAgMHgyRiwgMHhG RSwgMHg4RCwgMHgxMiwgMHg4QiwgMHg3MiwgMHhCNywgMHg1QSwgMHhDQiwgMHg2NiwgMHhDMiwgMHgyRSwgMHgxRCwgMHg3RCwgMHg0MiwgMHhBNiwNCiAg ICAgICAgICAgIDB4RjQsIDB4RkUsIDB4MjYsIDB4NUQsIDB4NTQsIDB4OUUsIDB4NzcsIDB4MUQsIDB4OTcsIDB4QzIsIDB4RjMsIDB4RkQsIDB4NjAsIDB4 QjMsIDB4MjIsIDB4ODgsDQogICAgICAgICAgICAweENBLCAweDI3LCAweDk5LCAweERGLCAweEM4LCAweEIxLCAweEQ3LCAweEM2LCAweDU0LCAweEE2LCAw eDUwLCAweEI5LCAweDU0LCAweEY1LCAweERFLCAweEZFLA0KICAgICAgICAgICAgMHhFMSwgMHg4MSwgMHhBMiwgMHhCRSwgMHg4MSwgMHg5RiwgMHg0OCwg MHhGRiwgMHgyRiwgMHhCOCwgMHhBNCwgMHhCMywgMHgxNywgMHhEOCwgMHhDMSwgMHhCOSwNCiAgICAgICAgICAgIDB4NUQsIDB4MjEsIDB4M0QsIDB4QTIs IDB4RUQsIDB4MUMsIDB4OTYsIDB4NjYsIDB4RUUsIDB4MUYsIDB4NDcsIDB4Q0YsIDB4NjIsIDB4RkEsIDB4RDYsIDB4QzEsDQogICAgICAgICAgICAweDg3 LCAweDVCLCAweEM0LCAweEU1LCAweEQ5LCAweDA4LCAweDM4LCAweDIyLCAweEZBLCAweDIxLCAweEJELCAweEYyLCAweDg4LCAweERBLCAweEUyLCAweDI0 LA0KICAgICAgICAgICAgMHgyNSwgMHgxRiwgMHhGMSwgMHgwQiwgMHgyRCwgMHhBRSwgMHgwNCwgMHhCRSwgMHhBNiwgMHg3RiwgMHg3NSwgMHg4QywgMHhE OSwgMHg5NywgMHhFMSwgMHhDQSwNCiAgICAgICAgICAgIDB4MzUsIDB4QjksIDB4RkMsIDB4NkYsIDB4MDEsIDB4NjgsIDB4MTEsIDB4RDMsIDB4NjgsIDB4 MzIsIDB4RDAsIDB4QzEsIDB4NjksIDB4QTMsIDB4Q0YsIDB4OUIsDQogICAgICAgICAgICAweDEwLCAweEU0LCAweDY5LCAweEE3LCAweENGLCAweEUxLCAw eEZFLCAweDJBLCAweDA3LCAweDlFLCAweEMxLCAweDM3LCAweDg0LCAweDY4LCAweEU1LCAweEM1LA0KICAgICAgICAgICAgMHhBQiwgMHgyNSwgMHhFQywg MHg3RCwgMHg3RCwgMHg3NCwgMHg2QSwgMHhEMSwgMHhENSwgMHg0RCwgMHhENywgMHhFMSwgMHg3RCwgMHhERSwgMHgzMCwgMHg0QiwNCiAgICAgICAgICAg IDB4RTYsIDB4NUQsIDB4Q0QsIDB4OTEsIDB4NTksIDB4RjYsIDB4ODAsIDB4RkQsIDB4QzYsIDB4M0MsIDB4REQsIDB4OTQsIDB4N0YsIDB4MTUsIDB4OUQs IDB4RUYsDQogICAgICAgICAgICAweDJGLCAweDAwLCAweDYyLCAweEQ3LCAweERBLCAweEI5LCAweEIzLCAweEQ5LCAweDhELCAweEU4LCAweEQ3LCAweDND LCAweDk2LCAweDQ1LCAweDVELCAweDFFLA0KICAgICAgICAgICAgMHg1MCwgMHhGQiwgMHhBQSwgMHg0MywgMHhEMywgMHg0NywgMHg3NywgMHg4MSwgMHhF OSwgMHg2NywgMHhFNCwgMHhGRSwgMHhERiwgMHg0MiwgMHg3OSwgMHhDQiwNCiAgICAgICAgICAgIDB4QTcsIDB4QUQsIDB4NUQsIDB4NDgsIDB4RjUsIDB4 QjcsIDB4NzQsIDB4OTYsIDB4MTIsIDB4MjMsIDB4MDYsIDB4NzAsIDB4NDIsIDB4NjgsIDB4N0EsIDB4NDQsDQogICAgICAgICAgICAweEZDLCAweEEwLCAw eDMxLCAweDdGLCAweDY4LCAweENBLCAweEEyLCAweDE0LCAweDVELCAweEEzLCAweENGLCAweDQyLCAweDIzLCAweEFCLCAweDQ3LCAweEY2LA0KICAgICAg ICAgICAgMHhCMiwgMHhGQywgMHg2RCwgMHhGMQ0KICAgICAgICB9Ow0KICAgIH0NCn0NCg0KDQovLyBMaWJUU2ZvcmdlL0NyeXB0by9QaHlzU3RvcmVDcnlw dG8uY3MNCm5hbWVzcGFjZSBMaWJUU2ZvcmdlLkNyeXB0bw0Kew0KICAgIHVzaW5nIFN5c3RlbTsNCiAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2Vu ZXJpYzsNCiAgICB1c2luZyBTeXN0ZW0uSU87DQogICAgdXNpbmcgU3lzdGVtLkxpbnE7DQogICAgdXNpbmcgU3lzdGVtLlRleHQ7DQoNCiAgICBwdWJsaWMg c3RhdGljIGNsYXNzIFBoeXNTdG9yZUNyeXB0bw0KICAgIHsNCiAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gRGVjcnlwdFBoeXNpY2FsU3RvcmUoYnl0 ZVtdIGRhdGEsIGJvb2wgcHJvZHVjdGlvbiwgUFNWZXJzaW9uIHZlcnNpb24pDQogICAgICAgIHsNCiAgICAgICAgICAgIGJ5dGVbXSByc2FLZXkgPSBwcm9k dWN0aW9uID8gS2V5cy5QUk9EVUNUSU9OIDogS2V5cy5URVNUOw0KICAgICAgICAgICAgQmluYXJ5UmVhZGVyIGJyID0gbmV3IEJpbmFyeVJlYWRlcihuZXcg TWVtb3J5U3RyZWFtKGRhdGEpKTsNCiAgICAgICAgICAgIGJyLkJhc2VTdHJlYW0uU2VlaygweDEwLCBTZWVrT3JpZ2luLkJlZ2luKTsNCiAgICAgICAgICAg IGJ5dGVbXSBhZXNLZXlTaWcgPSBici5SZWFkQnl0ZXMoMHg4MCk7DQogICAgICAgICAgICBieXRlW10gZW5jQWVzS2V5ID0gYnIuUmVhZEJ5dGVzKDB4ODAp Ow0KDQogICAgICAgICAgICBpZiAoIUNyeXB0b1V0aWxzLlJTQVZlcmlmeVNpZ25hdHVyZShyc2FLZXksIGVuY0Flc0tleSwgYWVzS2V5U2lnKSkNCiAgICAg ICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGVjcnlwdCBwaHlzaWNhbCBzdG9yZS4iKTsNCiAgICAg ICAgICAgIH0NCg0KICAgICAgICAgICAgYnl0ZVtdIGFlc0tleSA9IENyeXB0b1V0aWxzLlJTQURlY3J5cHQocnNhS2V5LCBlbmNBZXNLZXkpOw0KICAgICAg ICAgICAgYnl0ZVtdIGRlY0RhdGEgPSBDcnlwdG9VdGlscy5BRVNEZWNyeXB0KGJyLlJlYWRCeXRlcygoaW50KWJyLkJhc2VTdHJlYW0uTGVuZ3RoIC0gMHgx MTApLCBhZXNLZXkpOw0KICAgICAgICAgICAgYnl0ZVtdIGhtYWNLZXkgPSBkZWNEYXRhLlRha2UoMHgxMCkuVG9BcnJheSgpOyAvLyBTSEEtMSBzYWx0IG9u IFZpc3RhDQogICAgICAgICAgICBieXRlW10gaG1hY1NpZyA9IGRlY0RhdGEuU2tpcCgweDEwKS5UYWtlKDB4MTQpLlRvQXJyYXkoKTsgLy8gU0hBLTEgaGFz aCBvbiBWaXN0YQ0KICAgICAgICAgICAgYnl0ZVtdIHBzRGF0YSA9IGRlY0RhdGEuU2tpcCgweDI4KS5Ub0FycmF5KCk7DQoNCiAgICAgICAgICAgIGlmICh2 ZXJzaW9uICE9IFBTVmVyc2lvbi5WaXN0YSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIUNyeXB0b1V0aWxzLkhNQUNWZXJpZnkoaG1h Y0tleSwgcHNEYXRhLCBobWFjU2lnKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0YUV4Y2Vw dGlvbigiRmFpbGVkIHRvIHZlcmlmeSBITUFDLiBQaHlzaWNhbCBzdG9yZSBpcyBjb3JydXB0LiIpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAg IH0NCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoIUNyeXB0b1V0aWxzLlNhbHRTSEFWZXJpZnkoaG1hY0tl eSwgcHNEYXRhLCBobWFjU2lnKSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0YUV4Y2VwdGlv bigiRmFpbGVkIHRvIHZlcmlmeSBjaGVja3N1bS4gUGh5c2ljYWwgc3RvcmUgaXMgY29ycnVwdC4iKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAg ICB9DQoNCiAgICAgICAgICAgIHJldHVybiBwc0RhdGE7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBFbmNyeXB0UGh5c2lj YWxTdG9yZShieXRlW10gZGF0YSwgYm9vbCBwcm9kdWN0aW9uLCBQU1ZlcnNpb24gdmVyc2lvbikNCiAgICAgICAgew0KICAgICAgICAgICAgRGljdGlvbmFy eTxQU1ZlcnNpb24sIGludD4gdmVyc2lvblRhYmxlID0gbmV3IERpY3Rpb25hcnk8UFNWZXJzaW9uLCBpbnQ+DQogICAgICAgICAgICB7DQogICAgICAgICAg ICAgICAge1BTVmVyc2lvbi5WaXN0YSwgMn0sDQogICAgICAgICAgICAgICAge1BTVmVyc2lvbi5XaW43LCA1fSwNCiAgICAgICAgICAgICAgICB7UFNWZXJz aW9uLldpbjgsIDF9LA0KICAgICAgICAgICAgICAgIHtQU1ZlcnNpb24uV2luQmx1ZSwgMn0sDQogICAgICAgICAgICAgICAge1BTVmVyc2lvbi5XaW5Nb2Rl cm4sIDN9DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBieXRlW10gcnNhS2V5ID0gcHJvZHVjdGlvbiA/IEtleXMuUFJPRFVDVElPTiA6IEtleXMu VEVTVDsNCg0KICAgICAgICAgICAgYnl0ZVtdIGFlc0tleSA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoIm1hc3NncmF2ZS5kZXYgOjMiKTsNCiAgICAgICAg ICAgIGJ5dGVbXSBobWFjS2V5ID0gQ3J5cHRvVXRpbHMuR2VuZXJhdGVSYW5kb21LZXkoMHgxMCk7DQoNCiAgICAgICAgICAgIGJ5dGVbXSBlbmNBZXNLZXkg PSBDcnlwdG9VdGlscy5SU0FFbmNyeXB0KHJzYUtleSwgYWVzS2V5KTsNCiAgICAgICAgICAgIGJ5dGVbXSBhZXNLZXlTaWcgPSBDcnlwdG9VdGlscy5SU0FT aWduKHJzYUtleSwgZW5jQWVzS2V5KTsNCiAgICAgICAgICAgIGJ5dGVbXSBobWFjU2lnID0gdmVyc2lvbiAhPSBQU1ZlcnNpb24uVmlzdGEgPyBDcnlwdG9V dGlscy5ITUFDU2lnbihobWFjS2V5LCBkYXRhKSA6IENyeXB0b1V0aWxzLlNhbHRTSEFTdW0oaG1hY0tleSwgZGF0YSk7DQoNCiAgICAgICAgICAgIGJ5dGVb XSBkZWNEYXRhID0geyB9Ow0KICAgICAgICAgICAgZGVjRGF0YSA9IGRlY0RhdGEuQ29uY2F0KGhtYWNLZXkpLkNvbmNhdChobWFjU2lnKS5Db25jYXQoQml0 Q29udmVydGVyLkdldEJ5dGVzKDApKS5Db25jYXQoZGF0YSkuVG9BcnJheSgpOw0KICAgICAgICAgICAgYnl0ZVtdIGVuY0RhdGEgPSBDcnlwdG9VdGlscy5B RVNFbmNyeXB0KGRlY0RhdGEsIGFlc0tleSk7DQoNCiAgICAgICAgICAgIEJpbmFyeVdyaXRlciBidyA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0 cmVhbSgpKTsNCiAgICAgICAgICAgIGJ3LldyaXRlKHZlcnNpb25UYWJsZVt2ZXJzaW9uXSk7DQogICAgICAgICAgICBidy5Xcml0ZShFbmNvZGluZy5VVEY4 LkdldEJ5dGVzKCJVTlRSVVNUU1RPUkUiKSk7DQogICAgICAgICAgICBidy5Xcml0ZShhZXNLZXlTaWcpOw0KICAgICAgICAgICAgYncuV3JpdGUoZW5jQWVz S2V5KTsNCiAgICAgICAgICAgIGJ3LldyaXRlKGVuY0RhdGEpOw0KDQogICAgICAgICAgICByZXR1cm4gYncuR2V0Qnl0ZXMoKTsNCiAgICAgICAgfQ0KICAg IH0NCn0NCg0KDQovLyBMaWJUU2ZvcmdlL01vZGlmaWVycy9HZW5QS2V5SW5zdGFsbC5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuTW9kaWZpZXJzDQp7DQog ICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5nIFN5c3RlbS5JTzsNCiAgICB1c2luZyBNaWNyb3NvZnQuV2luMzI7DQogICAgdXNpbmcgUGh5c2ljYWxTdG9y ZTsNCiAgICB1c2luZyBTUFA7DQogICAgdXNpbmcgVG9rZW5TdG9yZTsNCg0KICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuUEtleUluc3RhbGwNCiAgICB7 DQogICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgV3JpdGVQa2V5MjAwNVJlZ2lzdHJ5VmFsdWVzKFBTVmVyc2lvbiB2ZXJzaW9uLCBQcm9kdWN0S2V5IHBr ZXkpDQogICAgICAgIHsNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIldyaXRpbmcgcmVnaXN0cnkgZGF0YSBmb3IgV2luZG93cyBwcm9kdWN0IGtl eS4uLiIpOw0KICAgICAgICAgICAgUmVnaXN0cnkuU2V0VmFsdWUoQCJIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRc Q3VycmVudFZlcnNpb24iLCAiUHJvZHVjdElkIiwgcGtleS5HZXRQaWQyKCkpOw0KICAgICAgICAgICAgUmVnaXN0cnkuU2V0VmFsdWUoQCJIS0VZX0xPQ0FM X01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb24iLCAiRGlnaXRhbFByb2R1Y3RJZCIsIHBrZXkuR2V0UGlkMygp KTsNCiAgICAgICAgICAgIFJlZ2lzdHJ5LlNldFZhbHVlKEAiSEtFWV9MT0NBTF9NQUNISU5FXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJl bnRWZXJzaW9uIiwgIkRpZ2l0YWxQcm9kdWN0SWQ0IiwgcGtleS5HZXRQaWQ0KCkpOw0KDQogICAgICAgICAgICBpZiAoUmVnaXN0cnkuR2V0VmFsdWUoQCJI S0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XEludGVybmV0IEV4cGxvcmVyXFJlZ2lzdHJhdGlvbiIsICJQcm9kdWN0SWQiLCBudWxsKSAh PSBudWxsKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFJlZ2lzdHJ5LlNldFZhbHVlKEAiSEtFWV9MT0NBTF9NQUNISU5FXFNPRlRXQVJFXE1p Y3Jvc29mdFxJbnRlcm5ldCBFeHBsb3JlclxSZWdpc3RyYXRpb24iLCAiUHJvZHVjdElkIiwgcGtleS5HZXRQaWQyKCkpOw0KICAgICAgICAgICAgICAgIFJl Z2lzdHJ5LlNldFZhbHVlKEAiSEtFWV9MT0NBTF9NQUNISU5FXFNPRlRXQVJFXE1pY3Jvc29mdFxJbnRlcm5ldCBFeHBsb3JlclxSZWdpc3RyYXRpb24iLCAi RGlnaXRhbFByb2R1Y3RJZCIsIHBrZXkuR2V0UGlkMygpKTsNCiAgICAgICAgICAgICAgICBSZWdpc3RyeS5TZXRWYWx1ZShAIkhLRVlfTE9DQUxfTUFDSElO RVxTT0ZUV0FSRVxNaWNyb3NvZnRcSW50ZXJuZXQgRXhwbG9yZXJcUmVnaXN0cmF0aW9uIiwgIkRpZ2l0YWxQcm9kdWN0SWQ0IiwgcGtleS5HZXRQaWQ0KCkp Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAocGtleS5DaGFubmVsID09ICJWb2x1bWU6Q1NWTEsiICYmIHZlcnNpb24gIT0gUFNWZXJzaW9u LldpbjcpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgUmVnaXN0cnkuU2V0VmFsdWUoQCJIS0VZX1VTRVJTXFMtMS01LTIwXFNPRlRXQVJFXE1p Y3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtIiwgIkttc0hvc3RDb25maWciLCAxKTsNCiAgICAg ICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbnN0YWxsR2VuUEtleShQU1ZlcnNpb24gdmVyc2lvbiwgYm9vbCBw cm9kdWN0aW9uLCBHdWlkIGFjdElkKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAodmVyc2lvbiA9PSBQU1ZlcnNpb24uVmlzdGEpIHRocm93IG5ldyBO b3RTdXBwb3J0ZWRFeGNlcHRpb24oIlRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgVmlzdGEvU2VydmVyIDIwMDguIik7DQogICAg ICAgICAgICBpZiAoYWN0SWQgPT0gR3VpZC5FbXB0eSkgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJBY3RpdmF0aW9uIElEIG11c3QgYmUgc3BlY2lm aWVkIGZvciBnZW5lcmF0ZWQgcHJvZHVjdCBrZXkgaW5zdGFsbC4iKTsNCg0KICAgICAgICAgICAgUEtleUNvbmZpZyBwa2MgPSBuZXcgUEtleUNvbmZpZygp Ow0KICAgICAgICAgICAgDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBwa2MuTG9hZENvbmZpZyhhY3RJZCk7DQog ICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoQXJndW1lbnRFeGNlcHRpb24pDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcGtjLkxv YWRBbGxDb25maWdzKFNMQXBpLkdldEFwcElkKGFjdElkKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIFByb2R1Y3RDb25maWcgY29uZmlnOw0K ICAgICAgICAgICAgcGtjLlByb2R1Y3RzLlRyeUdldFZhbHVlKGFjdElkLCBvdXQgY29uZmlnKTsNCg0KICAgICAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxs KSB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkFjdGl2YXRpb24gSUQgIiArIGFjdElkICsgIiBub3QgZm91bmQgaW4gUEtleUNvbmZpZy4iKTsNCg0K ICAgICAgICAgICAgUHJvZHVjdEtleSBwa2V5ID0gY29uZmlnLkdldFJhbmRvbUtleSgpOw0KDQogICAgICAgICAgICBHdWlkIGluc3RQa2V5SWQgPSBTTEFw aS5HZXRJbnN0YWxsZWRQa2V5SUQoYWN0SWQpOw0KICAgICAgICAgICAgaWYgKGluc3RQa2V5SWQgIT0gR3VpZC5FbXB0eSkgU0xBcGkuVW5pbnN0YWxsUHJv ZHVjdEtleShpbnN0UGtleUlkKTsNCg0KICAgICAgICAgICAgaWYgKHBrZXkuQWxnb3JpdGhtID09IFBLZXlBbGdvcml0aG0uUEtFWTIwMDkpDQogICAgICAg ICAgICB7DQogICAgICAgICAgICAgICAgdWludCBzdGF0dXMgPSBTTEFwaS5JbnN0YWxsUHJvZHVjdEtleShwa2V5KTsNCiAgICAgICAgICAgICAgICBMb2dn ZXIuV3JpdGVMaW5lKHN0cmluZy5Gb3JtYXQoIkluc3RhbGxpbmcgZ2VuZXJhdGVkIHByb2R1Y3Qga2V5IHswfSBzdGF0dXMgezE6WH0iLCBwa2V5LCBzdGF0 dXMpKTsNCg0KICAgICAgICAgICAgICAgIGlmICgoaW50KXN0YXR1cyA8IDApDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aHJv dyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBpbnN0YWxsIGdlbmVyYXRlZCBwcm9kdWN0IGtleS4iKTsNCiAgICAgICAgICAgICAgICB9 DQoNCiAgICAgICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJTdWNjZXNzZnVsbHkgZGVwb3NpdGVkIGdlbmVyYXRlZCBwcm9kdWN0IGtleS4iKTsNCiAg ICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIktleSByYW5nZSBpcyBQS0VZMjAw NSwgY3JlYXRpbmcgZmFrZSBrZXkgZGF0YS4uLiIpOw0KDQogICAgICAgICAgICBpZiAocGtleS5DaGFubmVsID09ICJWb2x1bWU6R1ZMSyIgJiYgdmVyc2lv biA9PSBQU1ZlcnNpb24uV2luNykgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiRmFrZSBHVkxLIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRl ZCBvbiBXaW5kb3dzIDcuIik7DQoNCiAgICAgICAgICAgIFZhcmlhYmxlQmFnIHBrYiA9IG5ldyBWYXJpYWJsZUJhZyh2ZXJzaW9uKTsNCiAgICAgICAgICAg IHBrYi5CbG9ja3MuQWRkUmFuZ2UobmV3W10NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBuZXcgQ1JDQmxvY2tNb2Rlcm4NCiAgICAgICAgICAg ICAgICB7DQogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gQ1JDQmxvY2tUeXBlLlNUUklORywNCiAgICAgICAgICAgICAgICAgICAgS2V5QXNTdHIg PSAiU3BwUGtleUJpbmRpbmdQcm9kdWN0S2V5IiwNCiAgICAgICAgICAgICAgICAgICAgVmFsdWVBc1N0ciA9IHBrZXkuVG9TdHJpbmcoKQ0KICAgICAgICAg ICAgICAgIH0sDQogICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBEYXRh VHlwZSA9IENSQ0Jsb2NrVHlwZS5TVFJJTkcsDQogICAgICAgICAgICAgICAgICAgIEtleUFzU3RyID0gIlNwcFBrZXlCaW5kaW5nTVBDIiwNCiAgICAgICAg ICAgICAgICAgICAgVmFsdWVBc1N0ciA9IHBrZXkuR2V0TVBDKCkNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIG5ldyBDUkNCbG9ja01v ZGVybiB7DQogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gQ1JDQmxvY2tUeXBlLkJJTkFSWSwNCiAgICAgICAgICAgICAgICAgICAgS2V5QXNTdHIg PSAiU3BwUGtleUJpbmRpbmdQaWQyIiwNCiAgICAgICAgICAgICAgICAgICAgVmFsdWVBc1N0ciA9IHBrZXkuR2V0UGlkMigpDQogICAgICAgICAgICAgICAg fSwNCiAgICAgICAgICAgICAgICBuZXcgQ1JDQmxvY2tNb2Rlcm4NCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0g Q1JDQmxvY2tUeXBlLkJJTkFSWSwNCiAgICAgICAgICAgICAgICAgICAgS2V5QXNTdHIgPSAiU3BwUGtleUJpbmRpbmdQaWQzIiwNCiAgICAgICAgICAgICAg ICAgICAgVmFsdWUgPSBwa2V5LkdldFBpZDMoKQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAg ICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IENSQ0Jsb2NrVHlwZS5CSU5BUlksDQogICAgICAgICAgICAgICAgICAgIEtl eUFzU3RyID0gIlNwcFBrZXlCaW5kaW5nUGlkNCIsDQogICAgICAgICAgICAgICAgICAgIFZhbHVlID0gcGtleS5HZXRQaWQ0KCkNCiAgICAgICAgICAgICAg ICB9LA0KICAgICAgICAgICAgICAgIG5ldyBDUkNCbG9ja01vZGVybg0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUg PSBDUkNCbG9ja1R5cGUuU1RSSU5HLA0KICAgICAgICAgICAgICAgICAgICBLZXlBc1N0ciA9ICJTcHBQa2V5Q2hhbm5lbElkIiwNCiAgICAgICAgICAgICAg ICAgICAgVmFsdWVBc1N0ciA9IHBrZXkuQ2hhbm5lbA0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQog ICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IENSQ0Jsb2NrVHlwZS5TVFJJTkcsDQogICAgICAgICAgICAgICAgICAg IEtleUFzU3RyID0gIlNwcFBrZXlCaW5kaW5nRWRpdGlvbklkIiwNCiAgICAgICAgICAgICAgICAgICAgVmFsdWVBc1N0ciA9IHBrZXkuRWRpdGlvbg0KICAg ICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAg ICBEYXRhVHlwZSA9IENSQ0Jsb2NrVHlwZS5CSU5BUlksDQogICAgICAgICAgICAgICAgICAgIEtleUFzU3RyID0gKHZlcnNpb24gPT0gUFNWZXJzaW9uLldp bjcpID8gIlNwcFBrZXlTaG9ydEF1dGhlbnRpY2F0b3IiIDogIlNwcFBrZXlQaG9uZUFjdGl2YXRpb25EYXRhIiwNCiAgICAgICAgICAgICAgICAgICAgVmFs dWUgPSBwa2V5LkdldFBob25lRGF0YSh2ZXJzaW9uKQ0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQog ICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IENSQ0Jsb2NrVHlwZS5CSU5BUlksDQogICAgICAgICAgICAgICAgICAg IEtleUFzU3RyID0gIlNwcFBrZXlCaW5kaW5nTWlzY0RhdGEiLA0KICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IG5ldyBieXRlW10geyB9DQogICAgICAg ICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIEd1aWQgYXBwSWQgPSBTTEFwaS5HZXRBcHBJZChhY3RJZCk7DQogICAgICAgICAg ICBzdHJpbmcgcGtleUlkID0gcGtleS5HZXRQa2V5SWQoKS5Ub1N0cmluZygpOw0KICAgICAgICAgICAgYm9vbCBpc0FkZG9uID0gU0xBcGkuSXNBZGRvbihh Y3RJZCk7DQogICAgICAgICAgICBzdHJpbmcgY3VyckVkaXRpb24gPSBTTEFwaS5HZXRNZXRhU3RyKGFjdElkLCAiRmFtaWx5Iik7DQoNCiAgICAgICAgICAg IGlmIChhcHBJZCA9PSBTTEFwaS5XSU5ET1dTX0FQUF9JRCAmJiAhaXNBZGRvbikNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBTTEFwaS5Vbmlu c3RhbGxBbGxQcm9kdWN0S2V5cyhhcHBJZCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVyc2lvbik7DQoNCiAg ICAgICAgICAgIHVzaW5nIChJUGh5c2ljYWxTdG9yZSBwcyA9IFNQUFV0aWxzLkdldFN0b3JlKHZlcnNpb24sIHByb2R1Y3Rpb24pKQ0KICAgICAgICAgICAg ew0KICAgICAgICAgICAgICAgIHVzaW5nIChJVG9rZW5TdG9yZSB0a3MgPSBTUFBVdGlscy5HZXRUb2tlblN0b3JlKHZlcnNpb24pKQ0KICAgICAgICAgICAg ICAgIHsNCiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLldyaXRlTGluZSgiV3JpdGluZyB0byBwaHlzaWNhbCBzdG9yZSBhbmQgdG9rZW4gc3RvcmUuLi4i KTsNCg0KICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4ID0gKHZlcnNpb24gPT0gUFNWZXJzaW9uLldpbjggfHwgdmVyc2lvbiA9PSBQU1ZlcnNp b24uV2luQmx1ZSB8fCB2ZXJzaW9uID09IFBTVmVyc2lvbi5XaW5Nb2Rlcm4pID8gIl8tLSIgOiAiIjsNCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1l dFN1ZmZpeCA9IHN1ZmZpeCArICJfbWV0IjsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoYXBwSWQgPT0gU0xBcGkuV0lORE9XU19BUFBfSUQgJiYgIWlz QWRkb24pDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlZFRva05hbWUgPSAibXNmdDpzcHAvdG9rZW4v d2luZG93cy9wcm9kdWN0a2V5aWQvIiArIGN1cnJFZGl0aW9uOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBUb2tlbk1ldGEgZWRUb2tlbiA9IHRrcy5H ZXRNZXRhRW50cnkoZWRUb2tOYW1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVkVG9rZW4uRGF0YVsid2luZG93c0NvbXBvbmVudEVkaXRpb25Qa2V5 SWQiXSA9IHBrZXlJZDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVkVG9rZW4uRGF0YVsid2luZG93c0NvbXBvbmVudEVkaXRpb25Ta3VJZCJdID0gYWN0 SWQuVG9TdHJpbmcoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRrcy5TZXRFbnRyeShlZFRva05hbWUsICJ4bWwiLCBlZFRva2VuLlNlcmlhbGl6ZSgp KTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVQa2V5MjAwNVJlZ2lzdHJ5VmFsdWVzKHZlcnNpb24sIHBrZXkpOw0KICAgICAgICAgICAgICAg ICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHVyaU1hcE5hbWUgPSAibXNmdDpzcHAvdG9rZW4vUEtleUlkVXJpTWFwcGVyIiArIG1ldFN1 ZmZpeDsNCiAgICAgICAgICAgICAgICAgICAgVG9rZW5NZXRhIHVyaU1hcCA9IHRrcy5HZXRNZXRhRW50cnkodXJpTWFwTmFtZSk7DQogICAgICAgICAgICAg ICAgICAgIHVyaU1hcC5EYXRhW3BrZXlJZF0gPSBwa2V5LkdldEFsZ29VcmkoKTsNCiAgICAgICAgICAgICAgICAgICAgdGtzLlNldEVudHJ5KHVyaU1hcE5h bWUsICJ4bWwiLCB1cmlNYXAuU2VyaWFsaXplKCkpOw0KDQogICAgICAgICAgICAgICAgICAgIHN0cmluZyBza3VNZXRhTmFtZSA9IGFjdElkICsgbWV0U3Vm Zml4Ow0KICAgICAgICAgICAgICAgICAgICBUb2tlbk1ldGEgc2t1TWV0YSA9IHRrcy5HZXRNZXRhRW50cnkoc2t1TWV0YU5hbWUpOw0KDQogICAgICAgICAg ICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrIGluIHNrdU1ldGEuRGF0YS5LZXlzKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAg ICAgICAgICBpZiAoay5TdGFydHNXaXRoKCJwa2V5SWRfIikpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgc2t1TWV0YS5EYXRhLlJlbW92ZShrKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0N CiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHNrdU1ldGEuRGF0YVsicGtleUlkIl0gPSBwa2V5SWQ7DQogICAgICAgICAg ICAgICAgICAgIHNrdU1ldGEuRGF0YVsicGtleUlkTGlzdCJdID0gcGtleUlkOw0KICAgICAgICAgICAgICAgICAgICB0a3MuU2V0RW50cnkoc2t1TWV0YU5h bWUsICJ4bWwiLCBza3VNZXRhLlNlcmlhbGl6ZSgpKTsNCg0KICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHNLZXkgPSBzdHJpbmcuRm9ybWF0KCJTUFBT VkNcXHswfVxcezF9IiwgYXBwSWQsIGFjdElkKTsNCiAgICAgICAgICAgICAgICAgICAgcHMuRGVsZXRlQmxvY2socHNLZXksIHBrZXlJZCk7DQogICAgICAg ICAgICAgICAgICAgIHBzLkFkZEJsb2NrKG5ldyBQU0Jsb2NrDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUg PSBCbG9ja1R5cGUuTkFNRUQsDQogICAgICAgICAgICAgICAgICAgICAgICBGbGFncyA9ICh2ZXJzaW9uID09IFBTVmVyc2lvbi5XaW5Nb2Rlcm4pID8gKHVp bnQpMHg0MDIgOiAweDIsDQogICAgICAgICAgICAgICAgICAgICAgICBLZXlBc1N0ciA9IHBzS2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVB c1N0ciA9IHBrZXlJZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBwa2IuU2VyaWFsaXplKCkNCiAgICAgICAgICAgICAgICAgICAgfSk7DQoN CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhY2hlUGF0aCA9IFNQUFV0aWxzLkdldFRva2Vuc1BhdGgodmVyc2lvbikuUmVwbGFjZSgidG9rZW5zLmRh dCIsIEAiY2FjaGVcY2FjaGUuZGF0Iik7DQogICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhjYWNoZVBhdGgpKSBGaWxlLkRlbGV0ZShjYWNo ZVBhdGgpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgU0xBcGkuUmVmcmVzaFRydXN0ZWRUaW1lKGFjdElkKTsN CiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIlN1Y2Nlc3NmdWxseSBkZXBvc2l0ZWQgZmFrZSBwcm9kdWN0IGtleS4iKTsNCiAgICAgICAgfQ0KICAg IH0NCn0NCg0KDQovLyBMaWJUU2ZvcmdlL01vZGlmaWVycy9HcmFjZVBlcmlvZFJlc2V0LmNzDQpuYW1lc3BhY2UgTGliVFNmb3JnZS5Nb2RpZmllcnMNCnsN CiAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCiAgICB1c2luZyBTeXN0ZW0uTGlucTsNCiAgICB1c2luZyBQaHlzaWNhbFN0b3JlOw0K ICAgIHVzaW5nIFNQUDsNCg0KICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JhY2VQZXJpb2RSZXNldA0KICAgIHsNCiAgICAgICAgcHVibGljIHN0YXRpYyB2 b2lkIFJlc2V0KFBTVmVyc2lvbiB2ZXJzaW9uLCBib29sIHByb2R1Y3Rpb24pDQogICAgICAgIHsNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVy c2lvbik7DQogICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJXcml0aW5nIFRydXN0ZWRTdG9yZSBkYXRhLi4uIik7DQoNCiAgICAgICAgICAgIHVzaW5n IChJUGh5c2ljYWxTdG9yZSBzdG9yZSA9IFNQUFV0aWxzLkdldFN0b3JlKHZlcnNpb24sIHByb2R1Y3Rpb24pKQ0KICAgICAgICAgICAgew0KICAgICAgICAg ICAgICAgIHN0cmluZyB2YWx1ZSA9ICJtc2Z0OnNsL3RpbWVyIjsNCiAgICAgICAgICAgICAgICBMaXN0PFBTQmxvY2s+IGJsb2NrcyA9IHN0b3JlLkZpbmRC bG9ja3ModmFsdWUpLlRvTGlzdCgpOw0KDQogICAgICAgICAgICAgICAgZm9yZWFjaCAoUFNCbG9jayBibG9jayBpbiBibG9ja3MpDQogICAgICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgICAgICBzdG9yZS5EZWxldGVCbG9jayhibG9jay5LZXlBc1N0ciwgYmxvY2suVmFsdWVBc1N0cik7DQogICAgICAgICAg ICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBTUFBVdGlscy5SZXN0YXJ0U1BQKHZlcnNpb24pOw0KICAgICAgICAgICAgTG9nZ2VyLldy aXRlTGluZSgiU3VjY2Vzc2Z1bGx5IHJlc2V0IGFsbCBncmFjZSBhbmQgZXZhbHVhdGlvbiBwZXJpb2QgdGltZXJzLiIpOw0KICAgICAgICB9DQogICAgfQ0K fQ0KDQoNCi8vIExpYlRTZm9yZ2UvTW9kaWZpZXJzL0tleUNoYW5nZUxvY2tEZWxldGUuY3MNCm5hbWVzcGFjZSBMaWJUU2ZvcmdlLk1vZGlmaWVycw0Kew0K ICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KICAgIHVzaW5nIFN5c3RlbS5MaW5xOw0KICAgIHVzaW5nIFBoeXNpY2FsU3RvcmU7DQog ICAgdXNpbmcgU1BQOw0KICAgIHVzaW5nIFN5c3RlbTsNCg0KICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5Q2hhbmdlTG9ja0RlbGV0ZQ0KICAgIHsNCiAg ICAgICAgcHVibGljIHN0YXRpYyB2b2lkIERlbGV0ZShQU1ZlcnNpb24gdmVyc2lvbiwgYm9vbCBwcm9kdWN0aW9uKQ0KICAgICAgICB7DQogICAgICAgICAg ICBpZiAodmVyc2lvbiA9PSBQU1ZlcnNpb24uVmlzdGEpIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIlRoaXMgZmVhdHVyZSBpcyBub3Qgc3Vw cG9ydGVkIG9uIFdpbmRvd3MgVmlzdGEvU2VydmVyIDIwMDguIik7DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVyc2lvbik7DQogICAgICAg ICAgICBMb2dnZXIuV3JpdGVMaW5lKCJXcml0aW5nIFRydXN0ZWRTdG9yZSBkYXRhLi4uIik7DQogICAgICAgICAgICB1c2luZyAoSVBoeXNpY2FsU3RvcmUg c3RvcmUgPSBTUFBVdGlscy5HZXRTdG9yZSh2ZXJzaW9uLCBwcm9kdWN0aW9uKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBMaXN0PHN0cmlu Zz4gdmFsdWVzID0gbmV3IExpc3Q8c3RyaW5nPg0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgIm1zZnQ6c3BwL3RpbWViYXNlZC9B QiIsDQogICAgICAgICAgICAgICAgICAgICJtc2Z0OnNwcC90aW1lYmFzZWQvQ0QiDQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICBMaXN0 PFBTQmxvY2s+IGJsb2NrcyA9IG5ldyBMaXN0PFBTQmxvY2s+KCk7DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHZhbHVlIGluIHZhbHVlcykN CiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5BZGRSYW5nZShzdG9yZS5GaW5kQmxvY2tzKHZhbHVlKS5Ub0xpc3QoKSk7 DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKFBTQmxvY2sgYmxvY2sgaW4gYmxvY2tzKQ0KICAgICAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICAgICAgc3RvcmUuRGVsZXRlQmxvY2soYmxvY2suS2V5QXNTdHIsIGJsb2NrLlZhbHVlQXNTdHIpOw0KICAgICAgICAgICAgICAg IH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIlN1Y2Nlc3NmdWxseSByZW1vdmVkIHRoZSBrZXkgY2hhbmdlIGxvY2su Iik7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9Nb2RpZmllcnMvS01TSG9zdENoYXJnZS5jcw0KbmFtZXNwYWNlIExpYlRTZm9y Z2UuTW9kaWZpZXJzDQp7DQogICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5nIFN5c3RlbS5JTzsNCiAgICB1c2luZyBQaHlzaWNhbFN0b3JlOw0KICAgIHVz aW5nIFNQUDsNCg0KICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS01TSG9zdENoYXJnZQ0KICAgIHsNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENoYXJn ZShQU1ZlcnNpb24gdmVyc2lvbiwgYm9vbCBwcm9kdWN0aW9uLCBHdWlkIGFjdElkKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoYWN0SWQgPT0gR3Vp ZC5FbXB0eSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBhY3RJZCA9IFNMQXBpLkdldERlZmF1bHRBY3RpdmF0aW9uSUQoU0xBcGkuV0lORE9X U19BUFBfSUQsIHRydWUpOw0KDQogICAgICAgICAgICAgICAgaWYgKGFjdElkID09IEd1aWQuRW1wdHkpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAg ICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJObyBhcHBsaWNhYmxlIGFjdGl2YXRpb24gSURzIGZvdW5kLiIpOw0KICAgICAg ICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKFNMQXBpLkdldFBLZXlDaGFubmVsKFNMQXBpLkdldEluc3RhbGxlZFBrZXlJ RChhY3RJZCkpICE9ICJWb2x1bWU6Q1NWTEsiKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRp b24oIk5vbi1Wb2x1bWU6Q1NWTEsgcHJvZHVjdCBrZXkgaW5zdGFsbGVkLiIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBHdWlkIGFwcElkID0g U0xBcGkuR2V0QXBwSWQoYWN0SWQpOw0KICAgICAgICAgICAgaW50IHRvdGFsQ2xpZW50cyA9IDUwOw0KICAgICAgICAgICAgaW50IGN1cnJDbGllbnRzID0g MjU7DQogICAgICAgICAgICBieXRlW10gaHdpZEJsb2NrID0gQ29uc3RhbnRzLlVuaXZlcnNhbEhXSURCbG9jazsNCiAgICAgICAgICAgIHN0cmluZyBrZXkg PSBzdHJpbmcuRm9ybWF0KCJTUFBTVkNcXHswfSIsIGFwcElkKTsNCiAgICAgICAgICAgIGxvbmcgbGRhcFRpbWVzdGFtcCA9IERhdGVUaW1lLk5vdy5Ub0Zp bGVUaW1lKCk7DQoNCiAgICAgICAgICAgIGJ5dGVbXSBjbWlkR3VpZHMgPSB7IH07DQogICAgICAgICAgICBieXRlW10gcmVxQ291bnRzID0geyB9Ow0KICAg ICAgICAgICAgYnl0ZVtdIGttc0NoYXJnZURhdGEgPSB7IH07DQoNCiAgICAgICAgICAgIEJpbmFyeVdyaXRlciB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVy KG5ldyBNZW1vcnlTdHJlYW0oKSk7DQoNCiAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IFBTVmVyc2lvbi5WaXN0YSkNCiAgICAgICAgICAgIHsNCiAgICAg ICAgICAgICAgICB3cml0ZXIuV3JpdGUobmV3IGJ5dGVbNDRdKTsNCiAgICAgICAgICAgICAgICB3cml0ZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsN Cg0KICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSh0b3RhbENsaWVudHMpOw0KICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSg0MzIwMCk7DQogICAg ICAgICAgICAgICAgd3JpdGVyLldyaXRlKDMyKTsNCg0KICAgICAgICAgICAgICAgIHdyaXRlci5TZWVrKDIwLCBTZWVrT3JpZ2luLkJlZ2luKTsNCiAgICAg ICAgICAgICAgICB3cml0ZXIuV3JpdGUoKGJ5dGUpY3VyckNsaWVudHMpOw0KDQogICAgICAgICAgICAgICAgd3JpdGVyLlNlZWsoMzIsIFNlZWtPcmlnaW4u QmVnaW4pOw0KICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgoYnl0ZSljdXJyQ2xpZW50cyk7DQoNCiAgICAgICAgICAgICAgICB3cml0ZXIuU2Vlaygw LCBTZWVrT3JpZ2luLkVuZCk7DQoNCiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJDbGllbnRzOyBpKyspDQogICAgICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoR3VpZC5OZXdHdWlkKCkuVG9CeXRlQXJyYXkoKSk7DQogICAgICAgICAgICAgICAgICAg IHdyaXRlci5Xcml0ZShsZGFwVGltZXN0YW1wIC0gKDEwICogKGkgKyAxKSkpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGttc0No YXJnZURhdGEgPSB3cml0ZXIuR2V0Qnl0ZXMoKTsNCiAgICAgICAgICAgIH0gDQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAg ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyQ2xpZW50czsgaSsrKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgd3JpdGVy LldyaXRlKGxkYXBUaW1lc3RhbXAgLSAoMTAgKiAoaSArIDEpKSk7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShHdWlkLk5ld0d1aWQoKS5U b0J5dGVBcnJheSgpKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBjbWlkR3VpZHMgPSB3cml0ZXIuR2V0Qnl0ZXMoKTsNCg0KICAg ICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIobmV3IE1lbW9yeVN0cmVhbSgpKTsNCg0KICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0 ZShuZXcgYnl0ZVs0MF0pOw0KDQogICAgICAgICAgICAgICAgd3JpdGVyLlNlZWsoNCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICAgICAgd3Jp dGVyLldyaXRlKChieXRlKWN1cnJDbGllbnRzKTsNCg0KICAgICAgICAgICAgICAgIHdyaXRlci5TZWVrKDI0LCBTZWVrT3JpZ2luLkJlZ2luKTsNCiAgICAg ICAgICAgICAgICB3cml0ZXIuV3JpdGUoKGJ5dGUpY3VyckNsaWVudHMpOw0KDQogICAgICAgICAgICAgICAgcmVxQ291bnRzID0gd3JpdGVyLkdldEJ5dGVz KCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVyc2lvbik7DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxp bmUoIldyaXRpbmcgVHJ1c3RlZFN0b3JlIGRhdGEuLi4iKTsNCg0KICAgICAgICAgICAgdXNpbmcgKElQaHlzaWNhbFN0b3JlIHN0b3JlID0gU1BQVXRpbHMu R2V0U3RvcmUodmVyc2lvbiwgcHJvZHVjdGlvbikpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gUFNWZXJzaW9uLlZp c3RhKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVCYWcga21zQ291bnREYXRhID0gbmV3IFZhcmlhYmxlQmFnKHZl cnNpb24pOw0KICAgICAgICAgICAgICAgICAgICBrbXNDb3VudERhdGEuQmxvY2tzLkFkZFJhbmdlKG5ld1tdDQogICAgICAgICAgICAgICAgICAgIHsNCiAg ICAgICAgICAgICAgICAgICAgICAgIG5ldyBDUkNCbG9ja01vZGVybg0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgIERhdGFUeXBlID0gQ1JDQmxvY2tUeXBlLkJJTkFSWSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlBc1N0ciA9ICJTcHBCaW5kaW5n TGljZW5zZURhdGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gaHdpZEJsb2NrDQogICAgICAgICAgICAgICAgICAgICAgICB9LA0K ICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgRGF0YVR5cGUgPSBDUkNCbG9ja1R5cGUuVUlOVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBuZXcgYnl0ZVtdIHsgfSwN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFzSW50ID0gKHVpbnQpdG90YWxDbGllbnRzDQogICAgICAgICAgICAgICAgICAgICAgICB9LA0K ICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgRGF0YVR5cGUgPSBDUkNCbG9ja1R5cGUuVUlOVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBuZXcgYnl0ZVtdIHsgfSwN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFzSW50ID0gMTA1MTIwMDAwMA0KICAgICAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAg ICAgICAgICAgICAgICAgIG5ldyBDUkNCbG9ja01vZGVybg0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAg IERhdGFUeXBlID0gQ1JDQmxvY2tUeXBlLlVJTlQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gbmV3IGJ5dGVbXSB7IH0sDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgVmFsdWVBc0ludCA9ICh1aW50KWN1cnJDbGllbnRzDQogICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAg ICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg RGF0YVR5cGUgPSBDUkNCbG9ja1R5cGUuQklOQVJZLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IG5ldyBieXRlW10geyB9LA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gY21pZEd1aWRzDQogICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICAgICAg ICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgPSBD UkNCbG9ja1R5cGUuQklOQVJZLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IG5ldyBieXRlW10geyB9LA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFZhbHVlID0gcmVxQ291bnRzDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAg ICAgICAgICAgICAgIGttc0NoYXJnZURhdGEgPSBrbXNDb3VudERhdGEuU2VyaWFsaXplKCk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAg ICAgc3RyaW5nIGNvdW50VmFsID0gdmVyc2lvbiA9PSBQU1ZlcnNpb24uVmlzdGEgPyAiQzhGNkZGRjEtNzlDRS00MDRDLUIxNTAtRjk3OTkxMjczREYxIiA6 IHN0cmluZy5Gb3JtYXQoIm1zZnQ6c3BwL2ttcy9ob3N0LzIuMC9zdG9yZS9jb3VudGVycy97MH0iLCBhcHBJZCk7DQoNCiAgICAgICAgICAgICAgICBzdG9y ZS5EZWxldGVCbG9jayhrZXksIGNvdW50VmFsKTsNCiAgICAgICAgICAgICAgICBzdG9yZS5BZGRCbG9jayhuZXcgUFNCbG9jaw0KICAgICAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9IEJsb2NrVHlwZS5OQU1FRCwNCiAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSAodmVyc2lvbiA9PSBQ U1ZlcnNpb24uV2luTW9kZXJuKSA/ICh1aW50KTB4NDAwIDogMCwNCiAgICAgICAgICAgICAgICAgICAgS2V5QXNTdHIgPSBrZXksDQogICAgICAgICAgICAg ICAgICAgIFZhbHVlQXNTdHIgPSBjb3VudFZhbCwNCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IGttc0NoYXJnZURhdGENCiAgICAgICAgICAgICAgICB9 KTsNCg0KICAgICAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoc3RyaW5nLkZvcm1hdCgiU2V0IGNoYXJnZSBjb3VudCB0byB7MH0gc3VjY2Vzc2Z1bGx5 LiIsIGN1cnJDbGllbnRzKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLlJlc3RhcnRTUFAodmVyc2lvbik7DQogICAgICAgIH0N CiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9Nb2RpZmllcnMvUmVhcm1SZXNldC5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuTW9kaWZpZXJzDQp7DQog ICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQogICAgdXNpbmcgU3lzdGVtLkxpbnE7DQogICAgdXNpbmcgUGh5c2ljYWxTdG9yZTsNCiAg ICB1c2luZyBTUFA7DQoNCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYXJtUmVzZXQNCiAgICB7DQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZXNl dChQU1ZlcnNpb24gdmVyc2lvbiwgYm9vbCBwcm9kdWN0aW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBTUFBVdGlscy5LaWxsU1BQKHZlcnNpb24pOw0K DQogICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJXcml0aW5nIFRydXN0ZWRTdG9yZSBkYXRhLi4uIik7DQoNCiAgICAgICAgICAgIHVzaW5nIChJUGh5 c2ljYWxTdG9yZSBzdG9yZSA9IFNQUFV0aWxzLkdldFN0b3JlKHZlcnNpb24sIHByb2R1Y3Rpb24pKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAg IExpc3Q8UFNCbG9jaz4gYmxvY2tzOw0KDQogICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gUFNWZXJzaW9uLlZpc3RhKQ0KICAgICAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tzID0gc3RvcmUuRmluZEJsb2NrcygiNzQwRDcwRDgtNjQ0OC00YjJmLTkwNjMtNEE3QTQ2MzYwMEM1Iiku VG9MaXN0KCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZlcnNpb24gPT0gUFNWZXJzaW9uLldpbjcpDQogICAgICAg ICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBibG9ja3MgPSBzdG9yZS5GaW5kQmxvY2tzKDB4QTAwMDApLlRvTGlzdCgpOw0KICAgICAgICAgICAg ICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBibG9ja3MgPSBzdG9yZS5GaW5kQmxv Y2tzKCJfXyMjVVNFUlNFUC1SRVNFUlZFRCMjX18kJFJFQVJNLUNPVU5UJCQiKS5Ub0xpc3QoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAg ICAgICBmb3JlYWNoIChQU0Jsb2NrIGJsb2NrIGluIGJsb2NrcykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9u ID09IFBTVmVyc2lvbi5WaXN0YSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuRGVsZXRlQmxvY2soYmxv Y2suS2V5QXNTdHIsIGJsb2NrLlZhbHVlQXNTdHIpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZlcnNp b24gPT0gUFNWZXJzaW9uLldpbjcpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLlNldEJsb2NrKGJsb2Nr LktleUFzU3RyLCBibG9jay5WYWx1ZUFzSW50LCBuZXcgYnl0ZVs4XSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxz ZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5TZXRCbG9jayhibG9jay5LZXlBc1N0ciwgYmxvY2suVmFs dWVBc1N0ciwgbmV3IGJ5dGVbOF0pOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgTG9nZ2Vy LldyaXRlTGluZSgiU3VjY2Vzc2Z1bGx5IHJlc2V0IGFsbCByZWFybSBjb3VudGVycy4iKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0N Cg0KDQovLyBMaWJUU2ZvcmdlL01vZGlmaWVycy9TZXRJSURQYXJhbXMuY3MNCm5hbWVzcGFjZSBMaWJUU2ZvcmdlLk1vZGlmaWVycw0Kew0KICAgIHVzaW5n IFBoeXNpY2FsU3RvcmU7DQogICAgdXNpbmcgU1BQOw0KICAgIHVzaW5nIFN5c3RlbS5JTzsNCiAgICB1c2luZyBTeXN0ZW07DQoNCiAgICBwdWJsaWMgc3Rh dGljIGNsYXNzIFNldElJRFBhcmFtcw0KICAgIHsNCiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFNldFBhcmFtcyhQU1ZlcnNpb24gdmVyc2lvbiwgYm9v bCBwcm9kdWN0aW9uLCBHdWlkIGFjdElkLCBQS2V5QWxnb3JpdGhtIGFsZ29yaXRobSwgaW50IGdyb3VwLCBpbnQgc2VyaWFsLCB1bG9uZyBzZWN1cml0eSkN CiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gUFNWZXJzaW9uLlZpc3RhKSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJU aGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIFZpc3RhL1NlcnZlciAyMDA4LiIpOw0KDQogICAgICAgICAgICBHdWlkIGFwcElkOw0K DQogICAgICAgICAgICBpZiAoYWN0SWQgPT0gR3VpZC5FbXB0eSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBhcHBJZCA9IFNMQXBpLldJTkRP V1NfQVBQX0lEOw0KICAgICAgICAgICAgICAgIGFjdElkID0gU0xBcGkuR2V0RGVmYXVsdEFjdGl2YXRpb25JRChhcHBJZCwgdHJ1ZSk7DQoNCiAgICAgICAg ICAgICAgICBpZiAoYWN0SWQgPT0gR3VpZC5FbXB0eSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRp b24oIk5vIGFwcGxpY2FibGUgYWN0aXZhdGlvbiBJRHMgZm91bmQuIik7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAg ZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGFwcElkID0gU0xBcGkuR2V0QXBwSWQoYWN0SWQpOw0KICAgICAgICAgICAgfQ0KDQogICAg ICAgICAgICBHdWlkIHBrZXlJZCA9IFNMQXBpLkdldEluc3RhbGxlZFBrZXlJRChhY3RJZCk7DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVy c2lvbik7DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIldyaXRpbmcgVHJ1c3RlZFN0b3JlIGRhdGEuLi4iKTsNCg0KICAgICAgICAgICAgdXNp bmcgKElQaHlzaWNhbFN0b3JlIHN0b3JlID0gU1BQVXRpbHMuR2V0U3RvcmUodmVyc2lvbiwgcHJvZHVjdGlvbikpDQogICAgICAgICAgICB7DQogICAgICAg ICAgICAgICAgc3RyaW5nIGtleSA9IHN0cmluZy5Gb3JtYXQoIlNQUFNWQ1xcezB9XFx7MX0iLCBhcHBJZCwgYWN0SWQpOw0KICAgICAgICAgICAgICAgIFBT QmxvY2sga2V5QmxvY2sgPSBzdG9yZS5HZXRCbG9jayhrZXksIHBrZXlJZC5Ub1N0cmluZygpKTsNCg0KICAgICAgICAgICAgICAgIGlmIChrZXlCbG9jayA9 PSBudWxsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJGYWlsZWQgdG8g Z2V0IHByb2R1Y3Qga2V5IGRhdGEgZm9yIGFjdGl2YXRpb24gSUQgIiArIGFjdElkICsgIi4iKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAg ICAgICBWYXJpYWJsZUJhZyBwa2IgPSBuZXcgVmFyaWFibGVCYWcoa2V5QmxvY2suRGF0YSwgdmVyc2lvbik7DQoNCiAgICAgICAgICAgICAgICBQcm9kdWN0 S2V5IHBrZXkgPSBuZXcgUHJvZHVjdEtleQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgR3JvdXAgPSBncm91cCwNCiAgICAgICAg ICAgICAgICAgICAgU2VyaWFsID0gc2VyaWFsLA0KICAgICAgICAgICAgICAgICAgICBTZWN1cml0eSA9IHNlY3VyaXR5LA0KICAgICAgICAgICAgICAgICAg ICBBbGdvcml0aG0gPSBhbGdvcml0aG0sDQogICAgICAgICAgICAgICAgICAgIFVwZ3JhZGUgPSBmYWxzZQ0KICAgICAgICAgICAgICAgIH07DQoNCiAgICAg ICAgICAgICAgICBzdHJpbmcgYmxvY2tOYW1lID0gdmVyc2lvbiA9PSBQU1ZlcnNpb24uV2luNyA/ICJTcHBQa2V5U2hvcnRBdXRoZW50aWNhdG9yIiA6ICJT cHBQa2V5UGhvbmVBY3RpdmF0aW9uRGF0YSI7DQogICAgICAgICAgICAgICAgcGtiLlNldEJsb2NrKGJsb2NrTmFtZSwgcGtleS5HZXRQaG9uZURhdGEodmVy c2lvbikpOw0KICAgICAgICAgICAgICAgIHN0b3JlLlNldEJsb2NrKGtleSwgcGtleUlkLlRvU3RyaW5nKCksIHBrYi5TZXJpYWxpemUoKSk7DQogICAgICAg ICAgICB9DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIlN1Y2Nlc3NmdWxseSBzZXQgSUlEIHBhcmFtZXRlcnMuIik7DQogICAgICAgIH0NCiAg ICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9Nb2RpZmllcnMvVGFtcGVyZWRGbGFnc0RlbGV0ZS5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuTW9kaWZpZXJz DQp7DQogICAgdXNpbmcgU3lzdGVtLkxpbnE7DQogICAgdXNpbmcgUGh5c2ljYWxTdG9yZTsNCiAgICB1c2luZyBTUFA7DQoNCiAgICBwdWJsaWMgc3RhdGlj IGNsYXNzIFRhbXBlcmVkRmxhZ3NEZWxldGUNCiAgICB7DQogICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBEZWxldGVUYW1wZXJGbGFncyhQU1ZlcnNpb24g dmVyc2lvbiwgYm9vbCBwcm9kdWN0aW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBTUFBVdGlscy5LaWxsU1BQKHZlcnNpb24pOw0KDQogICAgICAgICAg ICBMb2dnZXIuV3JpdGVMaW5lKCJXcml0aW5nIFRydXN0ZWRTdG9yZSBkYXRhLi4uIik7DQoNCiAgICAgICAgICAgIHVzaW5nIChJUGh5c2ljYWxTdG9yZSBz dG9yZSA9IFNQUFV0aWxzLkdldFN0b3JlKHZlcnNpb24sIHByb2R1Y3Rpb24pKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9u ID09IFBTVmVyc2lvbi5WaXN0YSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIERlbGV0ZUZsYWcoc3RvcmUsICI2QkU4NDI1Qi1F M0NGLTRlODYtQTZBRi01ODYzRTNEQ0I2MDYiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmVyc2lvbiA9PSBQU1Zl cnNpb24uV2luNykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIFNldEZsYWcoc3RvcmUsIDB4QTAwMDEpOw0KICAgICAgICAgICAg ICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBEZWxldGVGbGFnKHN0b3JlLCAiX18j I1VTRVJTRVAtUkVTRVJWRUQjI19fJCRSRUNSRUFURUQtRkxBRyQkIik7DQogICAgICAgICAgICAgICAgICAgIERlbGV0ZUZsYWcoc3RvcmUsICJfXyMjVVNF UlNFUC1SRVNFUlZFRCMjX18kJFJFQ09WRVJFRC1GTEFHJCQiKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBMb2dnZXIuV3JpdGVM aW5lKCJTdWNjZXNzZnVsbHkgY2xlYXJlZCB0aGUgdGFtcGVyIHN0YXRlLiIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBTUFBVdGlscy5SZXN0 YXJ0U1BQKHZlcnNpb24pOw0KICAgICAgICB9DQoNCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEZWxldGVGbGFnKElQaHlzaWNhbFN0b3JlIHN0b3Jl LCBzdHJpbmcgZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgc3RvcmUuRmluZEJsb2NrcyhmbGFnKS5Ub0xpc3QoKS5Gb3JFYWNoKGJsb2NrID0+IHN0 b3JlLkRlbGV0ZUJsb2NrKGJsb2NrLktleUFzU3RyLCBibG9jay5WYWx1ZUFzU3RyKSk7DQogICAgICAgIH0NCg0KICAgICAgICBwcml2YXRlIHN0YXRpYyB2 b2lkIFNldEZsYWcoSVBoeXNpY2FsU3RvcmUgc3RvcmUsIHVpbnQgZmxhZykNCiAgICAgICAgew0KICAgICAgICAgICAgc3RvcmUuRmluZEJsb2NrcyhmbGFn KS5Ub0xpc3QoKS5Gb3JFYWNoKGJsb2NrID0+IHN0b3JlLlNldEJsb2NrKGJsb2NrLktleUFzU3RyLCBibG9jay5WYWx1ZUFzSW50LCBuZXcgYnl0ZVs4XSkp Ow0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8vIExpYlRTZm9yZ2UvTW9kaWZpZXJzL1VuaXF1ZUlkRGVsZXRlLmNzDQpuYW1lc3BhY2UgTGliVFNmb3Jn ZS5Nb2RpZmllcnMNCnsNCiAgICB1c2luZyBTeXN0ZW07DQogICAgdXNpbmcgUGh5c2ljYWxTdG9yZTsNCiAgICB1c2luZyBTUFA7DQoNCiAgICBwdWJsaWMg c3RhdGljIGNsYXNzIFVuaXF1ZUlkRGVsZXRlDQogICAgew0KICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgRGVsZXRlVW5pcXVlSWQoUFNWZXJzaW9uIHZl cnNpb24sIGJvb2wgcHJvZHVjdGlvbiwgR3VpZCBhY3RJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gUFNWZXJzaW9uLlZpc3Rh KSB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIFZpc3RhL1NlcnZlciAy MDA4LiIpOw0KDQogICAgICAgICAgICBHdWlkIGFwcElkOw0KDQogICAgICAgICAgICBpZiAoYWN0SWQgPT0gR3VpZC5FbXB0eSkNCiAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICBhcHBJZCA9IFNMQXBpLldJTkRPV1NfQVBQX0lEOw0KICAgICAgICAgICAgICAgIGFjdElkID0gU0xBcGkuR2V0RGVmYXVsdEFj dGl2YXRpb25JRChhcHBJZCwgdHJ1ZSk7DQoNCiAgICAgICAgICAgICAgICBpZiAoYWN0SWQgPT0gR3VpZC5FbXB0eSkNCiAgICAgICAgICAgICAgICB7DQog ICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGFwcGxpY2FibGUgYWN0aXZhdGlvbiBJRHMgZm91bmQuIik7DQogICAgICAgICAg ICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGFwcElkID0gU0xBcGkuR2V0 QXBwSWQoYWN0SWQpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBHdWlkIHBrZXlJZCA9IFNMQXBpLkdldEluc3RhbGxlZFBrZXlJRChhY3RJZCk7 DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVyc2lvbik7DQoNCiAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIldyaXRpbmcgVHJ1c3Rl ZFN0b3JlIGRhdGEuLi4iKTsNCg0KICAgICAgICAgICAgdXNpbmcgKElQaHlzaWNhbFN0b3JlIHN0b3JlID0gU1BQVXRpbHMuR2V0U3RvcmUodmVyc2lvbiwg cHJvZHVjdGlvbikpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3RyaW5nIGtleSA9IHN0cmluZy5Gb3JtYXQoIlNQUFNWQ1xcezB9XFx7MX0i LCBhcHBJZCwgYWN0SWQpOw0KICAgICAgICAgICAgICAgIFBTQmxvY2sga2V5QmxvY2sgPSBzdG9yZS5HZXRCbG9jayhrZXksIHBrZXlJZC5Ub1N0cmluZygp KTsNCg0KICAgICAgICAgICAgICAgIGlmIChrZXlCbG9jayA9PSBudWxsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cg bmV3IEV4Y2VwdGlvbigiTm8gcHJvZHVjdCBrZXkgZm91bmQuIik7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgVmFyaWFibGVCYWcg cGtiID0gbmV3IFZhcmlhYmxlQmFnKGtleUJsb2NrLkRhdGEsIHZlcnNpb24pOw0KDQogICAgICAgICAgICAgICAgcGtiLkRlbGV0ZUJsb2NrKCJTcHBQa2V5 VW5pcXVlSWRUb2tlbiIpOw0KDQogICAgICAgICAgICAgICAgc3RvcmUuU2V0QmxvY2soa2V5LCBwa2V5SWQuVG9TdHJpbmcoKSwgcGtiLlNlcmlhbGl6ZSgp KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgTG9nZ2VyLldyaXRlTGluZSgiU3VjY2Vzc2Z1bGx5IHJlbW92ZWQgVW5pcXVlIElEIGZvciBwcm9k dWN0IGtleSBJRCAiICsgcGtleUlkKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQovLyBMaWJUU2ZvcmdlL0FjdGl2YXRvcnMvS01TNEsuY3MNCm5hbWVz cGFjZSBMaWJUU2ZvcmdlLkFjdGl2YXRvcnMNCnsNCiAgICB1c2luZyBTeXN0ZW07DQogICAgdXNpbmcgU3lzdGVtLklPOw0KICAgIHVzaW5nIFBoeXNpY2Fs U3RvcmU7DQogICAgdXNpbmcgU1BQOw0KDQogICAgcHVibGljIGNsYXNzIEtNUzRrDQogICAgew0KICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQWN0aXZh dGUoUFNWZXJzaW9uIHZlcnNpb24sIGJvb2wgcHJvZHVjdGlvbiwgR3VpZCBhY3RJZCkNCiAgICAgICAgew0KICAgICAgICAgICAgR3VpZCBhcHBJZDsNCiAg ICAgICAgICAgIGlmIChhY3RJZCA9PSBHdWlkLkVtcHR5KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGFwcElkID0gU0xBcGkuV0lORE9XU19B UFBfSUQ7DQogICAgICAgICAgICAgICAgYWN0SWQgPSBTTEFwaS5HZXREZWZhdWx0QWN0aXZhdGlvbklEKGFwcElkLCB0cnVlKTsNCg0KICAgICAgICAgICAg ICAgIGlmIChhY3RJZCA9PSBHdWlkLkVtcHR5KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRl ZEV4Y2VwdGlvbigiTm8gYXBwbGljYWJsZSBhY3RpdmF0aW9uIElEcyBmb3VuZC4iKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAg ICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYXBwSWQgPSBTTEFwaS5HZXRBcHBJZChhY3RJZCk7DQogICAgICAgICAgICB9 DQoNCiAgICAgICAgICAgIGlmIChTTEFwaS5HZXRQS2V5Q2hhbm5lbChTTEFwaS5HZXRJbnN0YWxsZWRQa2V5SUQoYWN0SWQpKSAhPSAiVm9sdW1lOkdWTEsi KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIk5vbi1Wb2x1bWU6R1ZMSyBwcm9kdWN0 IGtleSBpbnN0YWxsZWQuIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVyc2lvbik7DQoNCiAgICAgICAgICAg IExvZ2dlci5Xcml0ZUxpbmUoIldyaXRpbmcgVHJ1c3RlZFN0b3JlIGRhdGEuLi4iKTsNCg0KICAgICAgICAgICAgdXNpbmcgKElQaHlzaWNhbFN0b3JlIHN0 b3JlID0gU1BQVXRpbHMuR2V0U3RvcmUodmVyc2lvbiwgcHJvZHVjdGlvbikpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgc3RyaW5nIGtleSA9 IHN0cmluZy5Gb3JtYXQoIlNQUFNWQ1xcezB9XFx7MX0iLCBhcHBJZCwgYWN0SWQpOw0KDQogICAgICAgICAgICAgICAgdWxvbmcgdW5rbm93biA9IDA7DQog ICAgICAgICAgICAgICAgdWxvbmcgdGltZTE7DQogICAgICAgICAgICAgICAgdWxvbmcgdGltZTIgPSAodWxvbmcpRGF0ZVRpbWUuVXRjTm93LlRvRmlsZVRp bWUoKTsNCiAgICAgICAgICAgICAgICB1bG9uZyBleHBpcnkgPSBDb25zdGFudHMuVGltZXJNYXg7DQoNCiAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9 PSBQU1ZlcnNpb24uVmlzdGEgfHwgdmVyc2lvbiA9PSBQU1ZlcnNpb24uV2luNykNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHVu a25vd24gPSAweDgwMDAwMDAwMDsNCiAgICAgICAgICAgICAgICAgICAgdGltZTEgPSAwOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBl bHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBsb25nIGNyZWF0aW9uVGltZSA9IEJpdENvbnZlcnRlci5Ub0ludDY0KHN0b3Jl LkdldEJsb2NrKCJfXyMjVVNFUlNFUCMjXFwkJF9SRVNFUlZFRF8kJFxcTkFNRVNQQUNFX18iLCAiX18jI1VTRVJTRVAtUkVTRVJWRUQjI19fJCRHTE9CQUwt Q1JFQVRJT04tVElNRSQkIikuRGF0YSwgMCk7DQogICAgICAgICAgICAgICAgICAgIGxvbmcgdGlja0NvdW50ID0gQml0Q29udmVydGVyLlRvSW50NjQoc3Rv cmUuR2V0QmxvY2soIl9fIyNVU0VSU0VQIyNcXCQkX1JFU0VSVkVEXyQkXFxOQU1FU1BBQ0VfXyIsICJfXyMjVVNFUlNFUC1SRVNFUlZFRCMjX18kJEdMT0JB TC1USUNLQ09VTlQtVVBUSU1FJCQiKS5EYXRhLCAwKTsNCiAgICAgICAgICAgICAgICAgICAgbG9uZyBkZWx0YVRpbWUgPSBCaXRDb252ZXJ0ZXIuVG9JbnQ2 NChzdG9yZS5HZXRCbG9jayhrZXksICJfXyMjVVNFUlNFUC1SRVNFUlZFRCMjX18kJFVQLVRJTUUtREVMVEEkJCIpLkRhdGEsIDApOw0KDQogICAgICAgICAg ICAgICAgICAgIHRpbWUxID0gKHVsb25nKShjcmVhdGlvblRpbWUgKyB0aWNrQ291bnQgKyBkZWx0YVRpbWUpOw0KICAgICAgICAgICAgICAgICAgICB0aW1l MiAvPSAxMDAwMDsNCiAgICAgICAgICAgICAgICAgICAgZXhwaXJ5IC89IDEwMDAwOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlm ICh2ZXJzaW9uID09IFBTVmVyc2lvbi5WaXN0YSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIFZpc3RhVGltZXIgdmlzdGFUaW1l ciA9IG5ldyBWaXN0YVRpbWVyDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUgPSB0aW1lMiwNCiAgICAgICAg ICAgICAgICAgICAgICAgIEV4cGlyeSA9IENvbnN0YW50cy5UaW1lck1heA0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgICAg IHN0cmluZyB2aXN0YVRpbWVyTmFtZSA9IHN0cmluZy5Gb3JtYXQoIm1zZnQ6c2wvdGltZXIvVkxFeHBpcmF0aW9uL1ZPTFVNRS97MH0vezF9IiwgYXBwSWQs IGFjdElkKTsNCg0KICAgICAgICAgICAgICAgICAgICBzdG9yZS5EZWxldGVCbG9jayhrZXksIHZpc3RhVGltZXJOYW1lKTsNCiAgICAgICAgICAgICAgICAg ICAgc3RvcmUuRGVsZXRlQmxvY2soa2V5LCBhY3RJZC5Ub1N0cmluZygpKTsNCg0KICAgICAgICAgICAgICAgICAgICBCaW5hcnlXcml0ZXIgd3JpdGVyID0g bmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOw0KICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoQ29uc3RhbnRzLktNU3Y0UmVz cG9uc2UuTGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKENvbnN0YW50cy5LTVN2NFJlc3BvbnNlKTsNCiAgICAgICAgICAgICAg ICAgICAgd3JpdGVyLldyaXRlKENvbnN0YW50cy5Vbml2ZXJzYWxIV0lEQmxvY2spOw0KICAgICAgICAgICAgICAgICAgICBieXRlW10ga21zRGF0YSA9IHdy aXRlci5HZXRCeXRlcygpOw0KDQogICAgICAgICAgICAgICAgICAgIHN0b3JlLkFkZEJsb2NrcyhuZXdbXQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAg ICAgICAgICAgICAgICAgICAgICBuZXcgUFNCbG9jaw0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5 cGUgPSBCbG9ja1R5cGUuVElNRVIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg IEtleUFzU3RyID0ga2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQXNTdHIgPSB2aXN0YVRpbWVyTmFtZSwNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBEYXRhID0gdmlzdGFUaW1lci5DYXN0VG9BcnJheSgpDQogICAgICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAg ICAgICAgICAgbmV3IFBTQmxvY2sNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gQmxvY2tU eXBlLk5BTUVELA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlBc1N0ciA9 IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFzU3RyID0gYWN0SWQuVG9TdHJpbmcoKSwNCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBEYXRhID0ga21zRGF0YQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9 DQogICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGh3aWRCbG9jayA9IENvbnN0YW50 cy5Vbml2ZXJzYWxIV0lEQmxvY2s7DQogICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBrbXNSZXNwOw0KDQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAo dmVyc2lvbikNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQU1ZlcnNpb24uV2luNzoNCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICBrbXNSZXNwID0gQ29uc3RhbnRzLktNU3Y0UmVzcG9uc2U7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQog ICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBTVmVyc2lvbi5XaW44Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttc1Jlc3AgPSBDb25zdGFu dHMuS01TdjVSZXNwb25zZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUFNWZXJz aW9uLldpbkJsdWU6DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBTVmVyc2lvbi5XaW5Nb2Rlcm46DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAga21zUmVzcCA9IENvbnN0YW50cy5LTVN2NlJlc3BvbnNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAg ICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJVbnN1cHBvcnRl ZCBQU1ZlcnNpb24uIik7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUJhZyBrbXNCaW5kaW5nID0gbmV3 IFZhcmlhYmxlQmFnKHZlcnNpb24pOw0KDQogICAgICAgICAgICAgICAgICAgIGttc0JpbmRpbmcuQmxvY2tzLkFkZFJhbmdlKG5ld1tdDQogICAgICAgICAg ICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAg ICAgICAgICAgIERhdGFUeXBlID0gQ1JDQmxvY2tUeXBlLkJJTkFSWSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IG5ldyBieXRlW10geyB9LA0K ICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBrbXNSZXNwDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG5ldyBD UkNCbG9ja01vZGVybg0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IENSQ0Jsb2NrVHlwZS5TVFJJ TkcsDQogICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBuZXcgYnl0ZVtdIHsgfSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQXNTdHIgPSAi bXNmdDpybS9hbGdvcml0aG0vaHdpZC80LjAiDQogICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgIG5ldyBDUkNCbG9ja01vZGVy bg0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IENSQ0Jsb2NrVHlwZS5CSU5BUlksDQogICAgICAg ICAgICAgICAgICAgICAgICBLZXlBc1N0ciA9ICJTcHBCaW5kaW5nTGljZW5zZURhdGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBod2lk QmxvY2sNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9 PSBQU1ZlcnNpb24uV2luTW9kZXJuKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBrbXNCaW5kaW5nLkJsb2Nrcy5B ZGRSYW5nZShuZXdbXQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENSQ0Jsb2NrTW9kZXJuDQogICAg ICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgPSBDUkNCbG9ja1R5cGUuU1RSSU5HLA0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEtleSA9IG5ldyBieXRlW10geyB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQXNTdHIgPSAibWFz c2dyYXZlLmRldiINCiAgICAgICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ1JDQmxvY2tNb2Rlcm4NCiAgICAg ICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IENSQ0Jsb2NrVHlwZS5TVFJJTkcsDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgS2V5ID0gbmV3IGJ5dGVbXSB7IH0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVBc1N0ciA9ICI2OTY5 Ig0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAg ICAgICAgICAgICAgICBieXRlW10ga21zQmluZGluZ0RhdGEgPSBrbXNCaW5kaW5nLlNlcmlhbGl6ZSgpOw0KDQogICAgICAgICAgICAgICAgICAgIFRpbWVy IGttc1RpbWVyID0gbmV3IFRpbWVyDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd24gPSB1bmtub3duLA0K ICAgICAgICAgICAgICAgICAgICAgICAgVGltZTEgPSB0aW1lMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUyID0gdGltZTIsDQogICAgICAgICAg ICAgICAgICAgICAgICBFeHBpcnkgPSBleHBpcnkNCiAgICAgICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RvcmVW YWwgPSBzdHJpbmcuRm9ybWF0KCJtc2Z0OnNwcC9rbXMvYmluZC8yLjAvc3RvcmUvezB9L3sxfSIsIGFwcElkLCBhY3RJZCk7DQogICAgICAgICAgICAgICAg ICAgIHN0cmluZyB0aW1lclZhbCA9IHN0cmluZy5Gb3JtYXQoIm1zZnQ6c3BwL2ttcy9iaW5kLzIuMC90aW1lci97MH0vezF9IiwgYXBwSWQsIGFjdElkKTsN Cg0KICAgICAgICAgICAgICAgICAgICBzdG9yZS5EZWxldGVCbG9jayhrZXksIHN0b3JlVmFsKTsNCiAgICAgICAgICAgICAgICAgICAgc3RvcmUuRGVsZXRl QmxvY2soa2V5LCB0aW1lclZhbCk7DQoNCiAgICAgICAgICAgICAgICAgICAgc3RvcmUuQWRkQmxvY2tzKG5ld1tdDQogICAgICAgICAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICAgICAgbmV3IFBTQmxvY2sNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IEJs b2NrVHlwZS5OQU1FRCwNCiAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzID0gKHZlcnNpb24gPT0gUFNWZXJzaW9uLldpbk1vZGVybikgPyAodWludCkw eDQwMCA6IDAsDQogICAgICAgICAgICAgICAgICAgICAgICBLZXlBc1N0ciA9IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQXNTdHIgPSBz dG9yZVZhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBrbXNCaW5kaW5nRGF0YQ0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAg ICAgICAgICAgICBuZXcgUFNCbG9jaw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gQmxvY2tUeXBlLlRJ TUVSLA0KICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSAodmVyc2lvbiA9PSBQU1ZlcnNpb24uV2luNykgPyAodWludCkwIDogMHg0LA0KICAgICAg ICAgICAgICAgICAgICAgICAgS2V5QXNTdHIgPSBrZXksDQogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFzU3RyID0gdGltZXJWYWwsDQogICAgICAg ICAgICAgICAgICAgICAgICBEYXRhID0ga21zVGltZXIuQ2FzdFRvQXJyYXkoKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAg IH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgU1BQVXRpbHMuUmVzdGFydFNQUCh2ZXJzaW9uKTsNCiAgICAg ICAgICAgIFNMQXBpLkZpcmVTdGF0ZUNoYW5nZWRFdmVudChhcHBJZCk7DQogICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJBY3RpdmF0ZWQgdXNpbmcg S01TNGsgc3VjY2Vzc2Z1bGx5LiIpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8vIExpYlRTZm9yZ2UvQWN0aXZhdG9ycy9aZXJvQ0lELmNzDQpuYW1l c3BhY2UgTGliVFNmb3JnZS5BY3RpdmF0b3JzDQp7DQogICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5nIFN5c3RlbS5JTzsNCiAgICB1c2luZyBTeXN0ZW0u TGlucTsNCiAgICB1c2luZyBDcnlwdG87DQogICAgdXNpbmcgUGh5c2ljYWxTdG9yZTsNCiAgICB1c2luZyBTUFA7DQoNCiAgICBwdWJsaWMgc3RhdGljIGNs YXNzIFplcm9DSUQNCiAgICB7DQogICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRGVwb3NpdChHdWlkIGFjdElkLCBzdHJpbmcgaW5zdElkKQ0KICAgICAg ICB7DQogICAgICAgICAgICB1aW50IHN0YXR1cyA9IFNMQXBpLkRlcG9zaXRDb25maXJtYXRpb25JRChhY3RJZCwgaW5zdElkLCBDb25zdGFudHMuWmVyb0NJ RCk7DQogICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKHN0cmluZy5Gb3JtYXQoIkRlcG9zaXRpbmcgZmFrZSBDSUQgc3RhdHVzIHswOlh9Iiwgc3RhdHVz KSk7DQoNCiAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJh dGlvbkV4Y2VwdGlvbigiRmFpbGVkIHRvIGRlcG9zaXQgZmFrZSBDSUQuIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMg c3RhdGljIHZvaWQgQWN0aXZhdGUoUFNWZXJzaW9uIHZlcnNpb24sIGJvb2wgcHJvZHVjdGlvbiwgR3VpZCBhY3RJZCkNCiAgICAgICAgew0KICAgICAgICAg ICAgR3VpZCBhcHBJZDsNCg0KICAgICAgICAgICAgaWYgKGFjdElkID09IEd1aWQuRW1wdHkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYXBw SWQgPSBTTEFwaS5XSU5ET1dTX0FQUF9JRDsNCiAgICAgICAgICAgICAgICBhY3RJZCA9IFNMQXBpLkdldERlZmF1bHRBY3RpdmF0aW9uSUQoYXBwSWQsIGZh bHNlKTsNCg0KICAgICAgICAgICAgICAgIGlmIChhY3RJZCA9PSBHdWlkLkVtcHR5KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAg dGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTm8gYXBwbGljYWJsZSBhY3RpdmF0aW9uIElEcyBmb3VuZC4iKTsNCiAgICAgICAgICAgICAgICB9 DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYXBwSWQgPSBTTEFwaS5HZXRBcHBJZChh Y3RJZCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICghU0xBcGkuSXNQaG9uZUFjdGl2YXRhYmxlKGFjdElkKSkNCiAgICAgICAgICAgIHsN CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJQaG9uZSBsaWNlbnNlIGlzIHVuYXZhaWxhYmxlIGZvciB0aGlzIHBy b2R1Y3QuIik7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHN0cmluZyBpbnN0SWQgPSBTTEFwaS5HZXRJbnN0YWxsYXRpb25JRChhY3RJZCk7DQog ICAgICAgICAgICBHdWlkIHBrZXlJZCA9IFNMQXBpLkdldEluc3RhbGxlZFBrZXlJRChhY3RJZCk7DQoNCiAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IFBT VmVyc2lvbi5WaXN0YSB8fCB2ZXJzaW9uID09IFBTVmVyc2lvbi5XaW43KQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERlcG9zaXQoYWN0SWQs IGluc3RJZCk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIFNQUFV0aWxzLktpbGxTUFAodmVyc2lvbik7DQoNCiAgICAgICAgICAgIExvZ2dlci5X cml0ZUxpbmUoIldyaXRpbmcgVHJ1c3RlZFN0b3JlIGRhdGEuLi4iKTsNCg0KICAgICAgICAgICAgdXNpbmcgKElQaHlzaWNhbFN0b3JlIHN0b3JlID0gU1BQ VXRpbHMuR2V0U3RvcmUodmVyc2lvbiwgcHJvZHVjdGlvbikpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYnl0ZVtdIGh3aWRCbG9jayA9IENv bnN0YW50cy5Vbml2ZXJzYWxIV0lEQmxvY2s7DQoNCiAgICAgICAgICAgICAgICBMb2dnZXIuV3JpdGVMaW5lKCJBY3RpdmF0aW9uIElEOiAiICsgYWN0SWQp Ow0KICAgICAgICAgICAgICAgIExvZ2dlci5Xcml0ZUxpbmUoIkluc3RhbGxhdGlvbiBJRDogIiArIGluc3RJZCk7DQogICAgICAgICAgICAgICAgTG9nZ2Vy LldyaXRlTGluZSgiUHJvZHVjdCBLZXkgSUQ6ICIgKyBwa2V5SWQpOw0KDQogICAgICAgICAgICAgICAgYnl0ZVtdIGlpZEhhc2g7DQoNCiAgICAgICAgICAg ICAgICBpZiAodmVyc2lvbiA9PSBQU1ZlcnNpb24uVmlzdGEpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBpaWRIYXNoID0gQ3J5 cHRvVXRpbHMuU0hBMjU2SGFzaChVdGlscy5FbmNvZGVTdHJpbmcoaW5zdElkKSkuVGFrZSgweDEwKS5Ub0FycmF5KCk7DQogICAgICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZlcnNpb24gPT0gUFNWZXJzaW9uLldpbjcpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAg ICBpaWRIYXNoID0gQ3J5cHRvVXRpbHMuU0hBMjU2SGFzaChVdGlscy5FbmNvZGVTdHJpbmcoaW5zdElkKSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAg ICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGlpZEhhc2ggPSBDcnlwdG9VdGlscy5TSEEyNTZIYXNoKFV0 aWxzLkVuY29kZVN0cmluZyhpbnN0SWQgKyAnXDAnICsgQ29uc3RhbnRzLlplcm9DSUQpKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAg ICBzdHJpbmcga2V5ID0gc3RyaW5nLkZvcm1hdCgiU1BQU1ZDXFx7MH1cXHsxfSIsIGFwcElkLCBhY3RJZCk7DQogICAgICAgICAgICAgICAgUFNCbG9jayBr ZXlCbG9jayA9IHN0b3JlLkdldEJsb2NrKGtleSwgcGtleUlkLlRvU3RyaW5nKCkpOw0KDQogICAgICAgICAgICAgICAgaWYgKGtleUJsb2NrID09IG51bGwp DQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIkZhaWxlZCB0byBnZXQgcHJv ZHVjdCBrZXkgZGF0YSBmb3IgYWN0aXZhdGlvbiBJRCAiICsgYWN0SWQgKyAiLiIpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIFZh cmlhYmxlQmFnIHBrYiA9IG5ldyBWYXJpYWJsZUJhZyhrZXlCbG9jay5EYXRhLCB2ZXJzaW9uKTsNCg0KICAgICAgICAgICAgICAgIGJ5dGVbXSBwa2V5RGF0 YTsNCg0KICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IFBTVmVyc2lvbi5WaXN0YSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAg ICAgIHBrZXlEYXRhID0gcGtiLkdldEJsb2NrKCJQS2V5QmFzaWNJbmZvIikuVmFsdWU7DQogICAgICAgICAgICAgICAgICAgIHN0cmluZyB1bmlxdWVJZCA9 IFV0aWxzLkRlY29kZVN0cmluZyhwa2V5RGF0YS5Ta2lwKDB4MTIwKS5UYWtlKDB4ODApLlRvQXJyYXkoKSk7DQogICAgICAgICAgICAgICAgICAgIHN0cmlu ZyBleHRQaWQgPSBVdGlscy5EZWNvZGVTdHJpbmcocGtleURhdGEuU2tpcCgweDFBMCkuVGFrZSgweDgwKS5Ub0FycmF5KCkpOw0KDQogICAgICAgICAgICAg ICAgICAgIHVpbnQgZ3JvdXA7DQogICAgICAgICAgICAgICAgICAgIHVpbnQuVHJ5UGFyc2UoZXh0UGlkLlNwbGl0KCctJylbMV0sIG91dCBncm91cCk7DQoN CiAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwID09IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93 IG5ldyBGb3JtYXRFeGNlcHRpb24oIkV4dGVuZGVkIFBJRCBoYXMgaW52YWxpZCBmb3JtYXQuIik7DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAg ICAgICAgICAgICAgICB1bG9uZyBzaG9ydGF1dGg7DQoNCiAgICAgICAgICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAg ICAgICAgICAgICAgICAgIHNob3J0YXV0aCA9IEJpdENvbnZlcnRlci5Ub1VJbnQ2NChDb252ZXJ0LkZyb21CYXNlNjRTdHJpbmcodW5pcXVlSWQuU3BsaXQo JyYnKVsxXSksIDApOw0KICAgICAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICAgICAgICBjYXRjaA0KICAgICAgICAgICAgICAgICAgICB7DQog ICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJLZXkgVW5pcXVlIElEIGhhcyBpbnZhbGlkIGZvcm1hdC4iKTsNCiAg ICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHNob3J0YXV0aCB8PSAodWxvbmcpZ3JvdXAgPDwgNDE7DQogICAgICAgICAgICAg ICAgICAgIHBrZXlEYXRhID0gQml0Q29udmVydGVyLkdldEJ5dGVzKHNob3J0YXV0aCk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVs c2UgaWYgKHZlcnNpb24gPT0gUFNWZXJzaW9uLldpbjcpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwa2V5RGF0YSA9IHBrYi5H ZXRCbG9jaygiU3BwUGtleVNob3J0QXV0aGVudGljYXRvciIpLlZhbHVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlDQogICAg ICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBwa2V5RGF0YSA9IHBrYi5HZXRCbG9jaygiU3BwUGtleVBob25lQWN0aXZhdGlvbkRhdGEiKS5W YWx1ZTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBwa2IuRGVsZXRlQmxvY2soIlNwcFBrZXlWaXJ0dWFsIik7DQogICAgICAgICAg ICAgICAgc3RvcmUuU2V0QmxvY2soa2V5LCBwa2V5SWQuVG9TdHJpbmcoKSwgcGtiLlNlcmlhbGl6ZSgpKTsNCg0KICAgICAgICAgICAgICAgIEJpbmFyeVdy aXRlciB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSk7DQogICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKGlpZEhhc2gu TGVuZ3RoKTsNCiAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoaWlkSGFzaCk7DQogICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKGh3aWRCbG9jay5M ZW5ndGgpOw0KICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShod2lkQmxvY2spOw0KICAgICAgICAgICAgICAgIGJ5dGVbXSB0c0h3aWREYXRhID0gd3Jp dGVyLkdldEJ5dGVzKCk7DQoNCiAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSk7DQogICAgICAg ICAgICAgICAgd3JpdGVyLldyaXRlKGlpZEhhc2guTGVuZ3RoKTsNCiAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoaWlkSGFzaCk7DQogICAgICAgICAg ICAgICAgd3JpdGVyLldyaXRlKHBrZXlEYXRhLkxlbmd0aCk7DQogICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKHBrZXlEYXRhKTsNCiAgICAgICAgICAg ICAgICBieXRlW10gdHNQa2V5SW5mb0RhdGEgPSB3cml0ZXIuR2V0Qnl0ZXMoKTsNCg0KICAgICAgICAgICAgICAgIHN0cmluZyBwaG9uZVZlcnNpb24gPSB2 ZXJzaW9uID09IFBTVmVyc2lvbi5WaXN0YSA/ICI2LjAiIDogIjcuMCI7DQogICAgICAgICAgICAgICAgR3VpZCBpbmRleFNsaWQgPSB2ZXJzaW9uID09IFBT VmVyc2lvbi5WaXN0YSA/IGFjdElkIDogcGtleUlkOw0KICAgICAgICAgICAgICAgIHN0cmluZyBod2lkQmxvY2tOYW1lID0gc3RyaW5nLkZvcm1hdCgibXNm dDpXaW5kb3dzL3swfS9QaG9uZS9DYWNoZWQvSHdpZEJsb2NrL3sxfSIsIHBob25lVmVyc2lvbiwgaW5kZXhTbGlkKTsNCiAgICAgICAgICAgICAgICBzdHJp bmcgcGtleUluZm9OYW1lID0gc3RyaW5nLkZvcm1hdCgibXNmdDpXaW5kb3dzL3swfS9QaG9uZS9DYWNoZWQvUEtleUluZm8vezF9IiwgcGhvbmVWZXJzaW9u LCBpbmRleFNsaWQpOw0KDQogICAgICAgICAgICAgICAgc3RvcmUuRGVsZXRlQmxvY2soa2V5LCBod2lkQmxvY2tOYW1lKTsNCiAgICAgICAgICAgICAgICBz dG9yZS5EZWxldGVCbG9jayhrZXksIHBrZXlJbmZvTmFtZSk7DQoNCiAgICAgICAgICAgICAgICBzdG9yZS5BZGRCbG9ja3MobmV3W10gew0KICAgICAgICAg ICAgICAgICAgICBuZXcgUFNCbG9jaw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gQmxvY2tUeXBlLk5B TUVELA0KICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgS2V5QXNTdHIgPSBrZXksDQogICAgICAg ICAgICAgICAgICAgICAgICBWYWx1ZUFzU3RyID0gaHdpZEJsb2NrTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSB0c0h3aWREYXRhDQog ICAgICAgICAgICAgICAgICAgIH0sIA0KICAgICAgICAgICAgICAgICAgICBuZXcgUFNCbG9jaw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAg ICAgICAgICAgICAgICBUeXBlID0gQmxvY2tUeXBlLk5BTUVELA0KICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSAwLA0KICAgICAgICAgICAgICAg ICAgICAgICAgS2V5QXNTdHIgPSBrZXksDQogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFzU3RyID0gcGtleUluZm9OYW1lLA0KICAgICAgICAgICAg ICAgICAgICAgICAgRGF0YSA9IHRzUGtleUluZm9EYXRhDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAg IH0NCg0KICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gUFNWZXJzaW9uLlZpc3RhICYmIHZlcnNpb24gIT0gUFNWZXJzaW9uLldpbjcpDQogICAgICAgICAg ICB7DQogICAgICAgICAgICAgICAgRGVwb3NpdChhY3RJZCwgaW5zdElkKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgU1BQVXRpbHMuUmVzdGFy dFNQUCh2ZXJzaW9uKTsNCiAgICAgICAgICAgIFNMQXBpLkZpcmVTdGF0ZUNoYW5nZWRFdmVudChhcHBJZCk7DQogICAgICAgICAgICBMb2dnZXIuV3JpdGVM aW5lKCJBY3RpdmF0ZWQgdXNpbmcgWmVyb0NJRCBzdWNjZXNzZnVsbHkuIik7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9Ub2tl blN0b3JlL0NvbW1vbi5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuVG9rZW5TdG9yZQ0Kew0KICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmlj Ow0KICAgIHVzaW5nIFN5c3RlbS5JTzsNCg0KICAgIHB1YmxpYyBjbGFzcyBUb2tlbkVudHJ5DQogICAgew0KICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWU7 DQogICAgICAgIHB1YmxpYyBzdHJpbmcgRXh0ZW5zaW9uOw0KICAgICAgICBwdWJsaWMgYnl0ZVtdIERhdGE7DQogICAgICAgIHB1YmxpYyBib29sIFBvcHVs YXRlZDsNCiAgICB9DQoNCiAgICBwdWJsaWMgY2xhc3MgVG9rZW5NZXRhDQogICAgew0KICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWU7DQogICAgICAgIHB1 YmxpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBEYXRhID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7DQoNCiAgICAg ICAgcHVibGljIGJ5dGVbXSBTZXJpYWxpemUoKQ0KICAgICAgICB7DQogICAgICAgICAgICBCaW5hcnlXcml0ZXIgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRl cihuZXcgTWVtb3J5U3RyZWFtKCkpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKDEpOw0KICAgICAgICAgICAgYnl0ZVtdIG5hbWVCeXRlcyA9IFV0aWxz LkVuY29kZVN0cmluZyhOYW1lKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShuYW1lQnl0ZXMuTGVuZ3RoKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0 ZShuYW1lQnl0ZXMpOw0KDQogICAgICAgICAgICBmb3JlYWNoIChLZXlWYWx1ZVBhaXI8c3RyaW5nLCBzdHJpbmc+IGt2IGluIERhdGEpDQogICAgICAgICAg ICB7DQogICAgICAgICAgICAgICAgYnl0ZVtdIGtleUJ5dGVzID0gVXRpbHMuRW5jb2RlU3RyaW5nKGt2LktleSk7DQogICAgICAgICAgICAgICAgYnl0ZVtd IHZhbHVlQnl0ZXMgPSBVdGlscy5FbmNvZGVTdHJpbmcoa3YuVmFsdWUpOw0KICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShrZXlCeXRlcy5MZW5ndGgp Ow0KICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSh2YWx1ZUJ5dGVzLkxlbmd0aCk7DQogICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKGtleUJ5dGVz KTsNCiAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUodmFsdWVCeXRlcyk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiB3cml0ZXIu R2V0Qnl0ZXMoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHByaXZhdGUgdm9pZCBEZXNlcmlhbGl6ZShieXRlW10gZGF0YSkNCiAgICAgICAgew0KICAgICAg ICAgICAgQmluYXJ5UmVhZGVyIHJlYWRlciA9IG5ldyBCaW5hcnlSZWFkZXIobmV3IE1lbW9yeVN0cmVhbShkYXRhKSk7DQogICAgICAgICAgICByZWFkZXIu UmVhZEludDMyKCk7DQogICAgICAgICAgICBpbnQgbmFtZUxlbiA9IHJlYWRlci5SZWFkSW50MzIoKTsNCiAgICAgICAgICAgIE5hbWUgPSByZWFkZXIuUmVh ZE51bGxUZXJtaW5hdGVkU3RyaW5nKG5hbWVMZW4pOw0KDQogICAgICAgICAgICB3aGlsZSAocmVhZGVyLkJhc2VTdHJlYW0uUG9zaXRpb24gPCBkYXRhLkxl bmd0aCAtIDB4OCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpbnQga2V5TGVuID0gcmVhZGVyLlJlYWRJbnQzMigpOw0KICAgICAgICAgICAg ICAgIGludCB2YWx1ZUxlbiA9IHJlYWRlci5SZWFkSW50MzIoKTsNCiAgICAgICAgICAgICAgICBzdHJpbmcga2V5ID0gcmVhZGVyLlJlYWROdWxsVGVybWlu YXRlZFN0cmluZyhrZXlMZW4pOw0KICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IHJlYWRlci5SZWFkTnVsbFRlcm1pbmF0ZWRTdHJpbmcodmFsdWVM ZW4pOw0KICAgICAgICAgICAgICAgIERhdGFba2V5XSA9IHZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIFRva2Vu TWV0YShieXRlW10gZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgRGVzZXJpYWxpemUoZGF0YSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMg VG9rZW5NZXRhKCkNCiAgICAgICAgew0KDQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9Ub2tlblN0b3JlL0lUb2tlblN0b3JlLmNz DQpuYW1lc3BhY2UgTGliVFNmb3JnZS5Ub2tlblN0b3JlDQp7DQogICAgdXNpbmcgU3lzdGVtOw0KDQogICAgcHVibGljIGludGVyZmFjZSBJVG9rZW5TdG9y ZSA6IElEaXNwb3NhYmxlDQogICAgew0KICAgICAgICB2b2lkIERlc2VyaWFsaXplKCk7DQogICAgICAgIHZvaWQgU2VyaWFsaXplKCk7DQogICAgICAgIHZv aWQgQWRkRW50cnkoVG9rZW5FbnRyeSBlbnRyeSk7DQogICAgICAgIHZvaWQgQWRkRW50cmllcyhUb2tlbkVudHJ5W10gZW50cmllcyk7DQogICAgICAgIHZv aWQgRGVsZXRlRW50cnkoc3RyaW5nIG5hbWUsIHN0cmluZyBleHQpOw0KICAgICAgICB2b2lkIERlbGV0ZVVucG9wRW50cnkoc3RyaW5nIG5hbWUsIHN0cmlu ZyBleHQpOw0KICAgICAgICBUb2tlbkVudHJ5IEdldEVudHJ5KHN0cmluZyBuYW1lLCBzdHJpbmcgZXh0KTsNCiAgICAgICAgVG9rZW5NZXRhIEdldE1ldGFF bnRyeShzdHJpbmcgbmFtZSk7DQogICAgICAgIHZvaWQgU2V0RW50cnkoc3RyaW5nIG5hbWUsIHN0cmluZyBleHQsIGJ5dGVbXSBkYXRhKTsNCiAgICB9DQp9 DQoNCg0KLy8gTGliVFNmb3JnZS9Ub2tlblN0b3JlL1Rva2VuU3RvcmVNb2Rlcm4uY3MNCm5hbWVzcGFjZSBMaWJUU2ZvcmdlLlRva2VuU3RvcmUNCnsNCiAg ICB1c2luZyBTeXN0ZW07DQogICAgdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQogICAgdXNpbmcgU3lzdGVtLklPOw0KICAgIHVzaW5nIFN5 c3RlbS5MaW5xOw0KICAgIHVzaW5nIENyeXB0bzsNCg0KICAgIHB1YmxpYyBjbGFzcyBUb2tlblN0b3JlTW9kZXJuIDogSVRva2VuU3RvcmUNCiAgICB7DQog ICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHVpbnQgVkVSU0lPTiA9IDM7DQogICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludCBFTlRS WV9TSVpFID0gMHg5RTsNCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgaW50IEJMT0NLX1NJWkUgPSAweDQwMjA7DQogICAgICAgIHByaXZhdGUg c3RhdGljIHJlYWRvbmx5IGludCBFTlRSSUVTX1BFUl9CTE9DSyA9IEJMT0NLX1NJWkUgLyBFTlRSWV9TSVpFOw0KICAgICAgICBwcml2YXRlIHN0YXRpYyBy ZWFkb25seSBpbnQgQkxPQ0tfUEFEX1NJWkUgPSAweDY2Ow0KDQogICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDT05UU19IRUFERVIg PSBFbnVtZXJhYmxlLlJlcGVhdCgoYnl0ZSkweDU1LCAweDIwKS5Ub0FycmF5KCk7DQogICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBD T05UU19GT09URVIgPSBFbnVtZXJhYmxlLlJlcGVhdCgoYnl0ZSkweEFBLCAweDIwKS5Ub0FycmF5KCk7DQoNCiAgICAgICAgcHJpdmF0ZSBMaXN0PFRva2Vu RW50cnk+IEVudHJpZXMgPSBuZXcgTGlzdDxUb2tlbkVudHJ5PigpOw0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTdHJlYW0gVG9rZW5zRmlsZTsN Cg0KICAgICAgICBwdWJsaWMgdm9pZCBEZXNlcmlhbGl6ZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChUb2tlbnNGaWxlLkxlbmd0aCA8IEJMT0NL X1NJWkUpIHJldHVybjsNCg0KICAgICAgICAgICAgVG9rZW5zRmlsZS5TZWVrKDB4MjQsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgdWludCBu ZXh0QmxvY2s7DQoNCiAgICAgICAgICAgIEJpbmFyeVJlYWRlciByZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKFRva2Vuc0ZpbGUpOw0KICAgICAgICAgICAg ZG8NCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZWFkZXIuUmVhZFVJbnQzMigpOw0KICAgICAgICAgICAgICAgIG5leHRCbG9jayA9IHJlYWRl ci5SZWFkVUludDMyKCk7DQoNCiAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVOVFJJRVNfUEVSX0JMT0NLOyBpKyspDQogICAgICAgICAg ICAgICAgew0KICAgICAgICAgICAgICAgICAgICB1aW50IGN1ck9mZnNldCA9IHJlYWRlci5SZWFkVUludDMyKCk7DQogICAgICAgICAgICAgICAgICAgIGJv b2wgcG9wdWxhdGVkID0gcmVhZGVyLlJlYWRVSW50MzIoKSA9PSAxOw0KICAgICAgICAgICAgICAgICAgICB1aW50IGNvbnRlbnRPZmZzZXQgPSByZWFkZXIu UmVhZFVJbnQzMigpOw0KICAgICAgICAgICAgICAgICAgICB1aW50IGNvbnRlbnRMZW5ndGggPSByZWFkZXIuUmVhZFVJbnQzMigpOw0KICAgICAgICAgICAg ICAgICAgICB1aW50IGFsbG9jTGVuZ3RoID0gcmVhZGVyLlJlYWRVSW50MzIoKTsNCiAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGNvbnRlbnREYXRhID0g eyB9Ow0KDQogICAgICAgICAgICAgICAgICAgIGlmIChwb3B1bGF0ZWQpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAg IHJlYWRlci5CYXNlU3RyZWFtLlNlZWsoY29udGVudE9mZnNldCArIDB4MjAsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAg dWludCBkYXRhTGVuZ3RoID0gcmVhZGVyLlJlYWRVSW50MzIoKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFMZW5ndGggIT0gY29udGVu dExlbmd0aCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9u KCJEYXRhIGxlbmd0aCBpbiB0b2tlbnMgY29udGVudCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBlbnRyeS4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0N Cg0KICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLlJlYWRCeXRlcygweDIwKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnREYXRhID0g cmVhZGVyLlJlYWRCeXRlcygoaW50KWNvbnRlbnRMZW5ndGgpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgcmVhZGVy LkJhc2VTdHJlYW0uU2VlayhjdXJPZmZzZXQgKyAweDE0LCBTZWVrT3JpZ2luLkJlZ2luKTsNCg0KICAgICAgICAgICAgICAgICAgICBFbnRyaWVzLkFkZChu ZXcgVG9rZW5FbnRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0gcmVhZGVyLlJlYWROdWxsVGVybWlu YXRlZFN0cmluZygweDgyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbiA9IHJlYWRlci5SZWFkTnVsbFRlcm1pbmF0ZWRTdHJpbmcoMHg4 KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBjb250ZW50RGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVsYXRlZCA9IHBvcHVs YXRlZA0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZWFkZXIuQmFzZVN0cmVhbS5TZWVr KG5leHRCbG9jaywgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICB9IHdoaWxlIChuZXh0QmxvY2sgIT0gMCk7DQogICAgICAgIH0NCg0KICAgICAg ICBwdWJsaWMgdm9pZCBTZXJpYWxpemUoKQ0KICAgICAgICB7DQogICAgICAgICAgICBNZW1vcnlTdHJlYW0gdG9rZW5zID0gbmV3IE1lbW9yeVN0cmVhbSgp Ow0KDQogICAgICAgICAgICB1c2luZyAoQmluYXJ5V3JpdGVyIHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIodG9rZW5zKSkNCiAgICAgICAgICAgIHsNCiAg ICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoVkVSU0lPTik7DQogICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKENPTlRTX0hFQURFUik7DQoNCiAgICAg ICAgICAgICAgICBpbnQgY3VyQmxvY2tPZmZzZXQgPSAoaW50KXdyaXRlci5CYXNlU3RyZWFtLlBvc2l0aW9uOw0KICAgICAgICAgICAgICAgIGludCBjdXJF bnRyeU9mZnNldCA9IGN1ckJsb2NrT2Zmc2V0ICsgMHg4Ow0KICAgICAgICAgICAgICAgIGludCBjdXJDb250c09mZnNldCA9IGN1ckJsb2NrT2Zmc2V0ICsg QkxPQ0tfU0laRTsNCg0KICAgICAgICAgICAgICAgIGZvciAoaW50IGVJbmRleCA9IDA7IGVJbmRleCA8ICgoRW50cmllcy5Db3VudCAvIEVOVFJJRVNfUEVS X0JMT0NLKSArIDEpICogRU5UUklFU19QRVJfQkxPQ0s7IGVJbmRleCsrKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgVG9rZW5F bnRyeSBlbnRyeTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoZUluZGV4IDwgRW50cmllcy5Db3VudCkNCiAgICAgICAgICAgICAgICAgICAgew0KICAg ICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBFbnRyaWVzW2VJbmRleF07DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAg ZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5ldyBUb2tlbkVudHJ5DQogICAgICAgICAgICAg ICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9ICIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lv biA9ICIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVsYXRlZCA9IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEg PSBuZXcgYnl0ZVtdIHsgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAg IHdyaXRlci5CYXNlU3RyZWFtLlNlZWsoY3VyQmxvY2tPZmZzZXQsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3Jp dGUoY3VyQmxvY2tPZmZzZXQpOw0KICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoMCk7DQoNCiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLkJh c2VTdHJlYW0uU2VlayhjdXJFbnRyeU9mZnNldCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShjdXJFbnRy eU9mZnNldCk7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShlbnRyeS5Qb3B1bGF0ZWQgPyAxIDogMCk7DQogICAgICAgICAgICAgICAgICAg IHdyaXRlci5Xcml0ZShlbnRyeS5Qb3B1bGF0ZWQgPyBjdXJDb250c09mZnNldCA6IDApOw0KICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoZW50 cnkuUG9wdWxhdGVkID8gZW50cnkuRGF0YS5MZW5ndGggOiAtMSk7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShlbnRyeS5Qb3B1bGF0ZWQg PyBlbnRyeS5EYXRhLkxlbmd0aCA6IC0xKTsNCiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlRml4ZWRTdHJpbmcxNihlbnRyeS5OYW1lLCAweDgy KTsNCiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlRml4ZWRTdHJpbmcxNihlbnRyeS5FeHRlbnNpb24sIDB4OCk7DQogICAgICAgICAgICAgICAg ICAgIGN1ckVudHJ5T2Zmc2V0ID0gKGludCl3cml0ZXIuQmFzZVN0cmVhbS5Qb3NpdGlvbjsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuUG9w dWxhdGVkKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuQmFzZVN0cmVhbS5TZWVrKGN1ckNvbnRzT2Zm c2V0LCBTZWVrT3JpZ2luLkJlZ2luKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShDT05UU19IRUFERVIpOw0KICAgICAgICAgICAg ICAgICAgICAgICAgd3JpdGVyLldyaXRlKGVudHJ5LkRhdGEuTGVuZ3RoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShDcnlwdG9V dGlscy5TSEEyNTZIYXNoKGVudHJ5LkRhdGEpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShlbnRyeS5EYXRhKTsNCiAgICAgICAg ICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShDT05UU19GT09URVIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ29udHNPZmZzZXQgPSAoaW50 KXdyaXRlci5CYXNlU3RyZWFtLlBvc2l0aW9uOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgaWYgKChlSW5kZXggKyAx KSAlIEVOVFJJRVNfUEVSX0JMT0NLID09IDAgJiYgZUluZGV4ICE9IDApDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAg IGlmIChlSW5kZXggPCBFbnRyaWVzLkNvdW50KQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRl ci5CYXNlU3RyZWFtLlNlZWsoY3VyQmxvY2tPZmZzZXQgKyAweDQsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdy aXRlci5Xcml0ZShjdXJDb250c09mZnNldCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5C YXNlU3RyZWFtLlNlZWsoY3VyRW50cnlPZmZzZXQsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlUGFk ZGluZyhCTE9DS19QQURfU0laRSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5CYXNlU3RyZWFtLlNlZWsoY3VyQmxvY2tPZmZzZXQsIFNl ZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJsb2NrRGF0YSA9IG5ldyBieXRlW0JMT0NLX1NJWkUgLSAweDIwXTsN Cg0KICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zLlJlYWQoYmxvY2tEYXRhLCAwLCBCTE9DS19TSVpFIC0gMHgyMCk7DQogICAgICAgICAgICAgICAg ICAgICAgICBieXRlW10gYmxvY2tIYXNoID0gQ3J5cHRvVXRpbHMuU0hBMjU2SGFzaChibG9ja0RhdGEpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB3 cml0ZXIuQmFzZVN0cmVhbS5TZWVrKGN1ckJsb2NrT2Zmc2V0ICsgQkxPQ0tfU0laRSAtIDB4MjAsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAg ICAgICAgICAgICAgd3JpdGVyLldyaXRlKGJsb2NrSGFzaCk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGN1ckJsb2NrT2Zmc2V0ID0gY3VyQ29udHNP ZmZzZXQ7DQogICAgICAgICAgICAgICAgICAgICAgICBjdXJFbnRyeU9mZnNldCA9IGN1ckJsb2NrT2Zmc2V0ICsgMHg4Ow0KICAgICAgICAgICAgICAgICAg ICAgICAgY3VyQ29udHNPZmZzZXQgPSBjdXJCbG9ja09mZnNldCArIEJMT0NLX1NJWkU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAg ICB9DQoNCiAgICAgICAgICAgICAgICB0b2tlbnMuU2V0TGVuZ3RoKGN1ckJsb2NrT2Zmc2V0KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgYnl0 ZVtdIHRva2Vuc0RhdGEgPSB0b2tlbnMuVG9BcnJheSgpOw0KICAgICAgICAgICAgYnl0ZVtdIHRva2Vuc0hhc2ggPSBDcnlwdG9VdGlscy5TSEEyNTZIYXNo KHRva2Vuc0RhdGEuVGFrZSgweDQpLkNvbmNhdCh0b2tlbnNEYXRhLlNraXAoMHgyNCkpLlRvQXJyYXkoKSk7DQoNCiAgICAgICAgICAgIHRva2VucyA9IG5l dyBNZW1vcnlTdHJlYW0odG9rZW5zRGF0YSk7DQoNCiAgICAgICAgICAgIEJpbmFyeVdyaXRlciB0b2tXcml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKFRva2Vu c0ZpbGUpOw0KICAgICAgICAgICAgdXNpbmcgKEJpbmFyeVJlYWRlciByZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKHRva2VucykpDQogICAgICAgICAgICB7 DQogICAgICAgICAgICAgICAgVG9rZW5zRmlsZS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgICAgIFRva2Vuc0ZpbGUuU2V0TGVu Z3RoKHRva2Vucy5MZW5ndGgpOw0KICAgICAgICAgICAgICAgIHRva1dyaXRlci5Xcml0ZShyZWFkZXIuUmVhZEJ5dGVzKDB4NCkpOw0KICAgICAgICAgICAg ICAgIHJlYWRlci5SZWFkQnl0ZXMoMHgyMCk7DQogICAgICAgICAgICAgICAgdG9rV3JpdGVyLldyaXRlKHRva2Vuc0hhc2gpOw0KICAgICAgICAgICAgICAg IHRva1dyaXRlci5Xcml0ZShyZWFkZXIuUmVhZEJ5dGVzKChpbnQpcmVhZGVyLkJhc2VTdHJlYW0uTGVuZ3RoIC0gMHg0KSk7DQogICAgICAgICAgICB9DQog ICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBBZGRFbnRyeShUb2tlbkVudHJ5IGVudHJ5KQ0KICAgICAgICB7DQogICAgICAgICAgICBFbnRyaWVz LkFkZChlbnRyeSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBBZGRFbnRyaWVzKFRva2VuRW50cnlbXSBlbnRyaWVzKQ0KICAgICAgICB7 DQogICAgICAgICAgICBFbnRyaWVzLkFkZFJhbmdlKGVudHJpZXMpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlRW50cnkoc3Ry aW5nIG5hbWUsIHN0cmluZyBleHQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFRva2VuRW50cnkgZW50cnkgaW4gRW50cmllcykNCiAgICAg ICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoZW50cnkuTmFtZSA9PSBuYW1lICYmIGVudHJ5LkV4dGVuc2lvbiA9PSBleHQpDQogICAgICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgICAgICBFbnRyaWVzLlJlbW92ZShlbnRyeSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAg ICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVVbnBvcEVudHJ5KHN0cmluZyBuYW1lLCBzdHJp bmcgZXh0KQ0KICAgICAgICB7DQogICAgICAgICAgICBMaXN0PFRva2VuRW50cnk+IGRlbEVudHJpZXMgPSBuZXcgTGlzdDxUb2tlbkVudHJ5PigpOw0KICAg ICAgICAgICAgZm9yZWFjaCAoVG9rZW5FbnRyeSBlbnRyeSBpbiBFbnRyaWVzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChlbnRyeS5O YW1lID09IG5hbWUgJiYgZW50cnkuRXh0ZW5zaW9uID09IGV4dCAmJiAhZW50cnkuUG9wdWxhdGVkKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAg ICAgICAgICAgZGVsRW50cmllcy5BZGQoZW50cnkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgRW50cmllcyA9 IEVudHJpZXMuRXhjZXB0KGRlbEVudHJpZXMpLlRvTGlzdCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIFRva2VuRW50cnkgR2V0RW50cnkoc3Ry aW5nIG5hbWUsIHN0cmluZyBleHQpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFRva2VuRW50cnkgZW50cnkgaW4gRW50cmllcykNCiAgICAg ICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoZW50cnkuTmFtZSA9PSBuYW1lICYmIGVudHJ5LkV4dGVuc2lvbiA9PSBleHQpDQogICAgICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgICAgICBpZiAoIWVudHJ5LlBvcHVsYXRlZCkgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRy eTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVi bGljIFRva2VuTWV0YSBHZXRNZXRhRW50cnkoc3RyaW5nIG5hbWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIERlbGV0ZVVucG9wRW50cnkobmFtZSwgInht bCIpOw0KICAgICAgICAgICAgVG9rZW5FbnRyeSBlbnRyeSA9IEdldEVudHJ5KG5hbWUsICJ4bWwiKTsNCiAgICAgICAgICAgIFRva2VuTWV0YSBtZXRhOw0K DQogICAgICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBtZXRhID0gbmV3IFRva2VuTWV0YQ0KICAg ICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9IG5hbWUNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfQ0KICAgICAg ICAgICAgZWxzZQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG1ldGEgPSBuZXcgVG9rZW5NZXRhKGVudHJ5LkRhdGEpOw0KICAgICAgICAgICAg fQ0KDQogICAgICAgICAgICByZXR1cm4gbWV0YTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIFNldEVudHJ5KHN0cmluZyBuYW1lLCBzdHJp bmcgZXh0LCBieXRlW10gZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFbnRyaWVzLkNvdW50OyBpKyspDQogICAg ICAgICAgICB7DQogICAgICAgICAgICAgICAgVG9rZW5FbnRyeSBlbnRyeSA9IEVudHJpZXNbaV07DQoNCiAgICAgICAgICAgICAgICBpZiAoZW50cnkuTmFt ZSA9PSBuYW1lICYmIGVudHJ5LkV4dGVuc2lvbiA9PSBleHQgJiYgZW50cnkuUG9wdWxhdGVkKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAg ICAgICAgZW50cnkuRGF0YSA9IGRhdGE7DQogICAgICAgICAgICAgICAgICAgIEVudHJpZXNbaV0gPSBlbnRyeTsNCiAgICAgICAgICAgICAgICAgICAgcmV0 dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgRW50cmllcy5BZGQobmV3IFRva2VuRW50cnkNCiAgICAgICAg ICAgIHsNCiAgICAgICAgICAgICAgICBQb3B1bGF0ZWQgPSB0cnVlLA0KICAgICAgICAgICAgICAgIE5hbWUgPSBuYW1lLA0KICAgICAgICAgICAgICAgIEV4 dGVuc2lvbiA9IGV4dCwNCiAgICAgICAgICAgICAgICBEYXRhID0gZGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMg VG9rZW5TdG9yZU1vZGVybihzdHJpbmcgdG9rZW5zUGF0aCkNCiAgICAgICAgew0KICAgICAgICAgICAgVG9rZW5zRmlsZSA9IEZpbGUuT3Blbih0b2tlbnNQ YXRoLCBGaWxlTW9kZS5PcGVuT3JDcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlLCBGaWxlU2hhcmUuTm9uZSk7DQogICAgICAgICAgICBEZXNlcmlhbGl6 ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNlcmlhbGl6ZSgpOw0KICAg ICAgICAgICAgVG9rZW5zRmlsZS5DbG9zZSgpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8vIExpYlRTZm9yZ2UvUGh5c2ljYWxTdG9yZS9Db21tb24u Y3MNCm5hbWVzcGFjZSBMaWJUU2ZvcmdlLlBoeXNpY2FsU3RvcmUNCnsNCiAgICB1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQoNCiAg ICBwdWJsaWMgZW51bSBCbG9ja1R5cGUgOiB1aW50DQogICAgew0KICAgICAgICBOT05FLA0KICAgICAgICBOQU1FRCwNCiAgICAgICAgQVRUUklCVVRFLA0K ICAgICAgICBUSU1FUg0KICAgIH0NCg0KICAgIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1ZW50aWFsLCBQYWNrID0gMSldDQogICAgcHVibGljIHN0 cnVjdCBUaW1lcg0KICAgIHsNCiAgICAgICAgcHVibGljIHVsb25nIFVua25vd247DQogICAgICAgIHB1YmxpYyB1bG9uZyBUaW1lMTsNCiAgICAgICAgcHVi bGljIHVsb25nIFRpbWUyOw0KICAgICAgICBwdWJsaWMgdWxvbmcgRXhwaXJ5Ow0KICAgIH0NCg0KICAgIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1 ZW50aWFsLCBQYWNrID0gMSldDQogICAgcHVibGljIHN0cnVjdCBWaXN0YVRpbWVyDQogICAgew0KICAgICAgICBwdWJsaWMgdWxvbmcgVGltZTsNCiAgICAg ICAgcHVibGljIHVsb25nIEV4cGlyeTsNCiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9QaHlzaWNhbFN0b3JlL0lQaHlzaWNhbFN0b3JlLmNzDQpuYW1l c3BhY2UgTGliVFNmb3JnZS5QaHlzaWNhbFN0b3JlDQp7DQogICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmlj Ow0KDQogICAgcHVibGljIGNsYXNzIFBTQmxvY2sNCiAgICB7DQogICAgICAgIHB1YmxpYyBCbG9ja1R5cGUgVHlwZTsNCiAgICAgICAgcHVibGljIHVpbnQg RmxhZ3M7DQogICAgICAgIHB1YmxpYyB1aW50IFVua25vd24gPSAwOw0KICAgICAgICBwdWJsaWMgYnl0ZVtdIEtleTsNCiAgICAgICAgcHVibGljIHN0cmlu ZyBLZXlBc1N0cg0KICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuRGVjb2Rl U3RyaW5nKEtleSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBLZXkgPSBVdGlscy5F bmNvZGVTdHJpbmcodmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHB1YmxpYyBieXRlW10gVmFsdWU7DQogICAgICAgIHB1Ymxp YyBzdHJpbmcgVmFsdWVBc1N0cg0KICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gVXRp bHMuRGVjb2RlU3RyaW5nKFZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFZh bHVlID0gVXRpbHMuRW5jb2RlU3RyaW5nKHZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwdWJsaWMgdWludCBWYWx1ZUFzSW50 DQogICAgICAgIHsNCiAgICAgICAgICAgIGdldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9VSW50MzIo VmFsdWUsIDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgVmFsdWUgPSBCaXRDb252 ZXJ0ZXIuR2V0Qnl0ZXModmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHB1YmxpYyBieXRlW10gRGF0YTsNCiAgICAgICAgcHVi bGljIHN0cmluZyBEYXRhQXNTdHINCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIFV0 aWxzLkRlY29kZVN0cmluZyhEYXRhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERh dGEgPSBVdGlscy5FbmNvZGVTdHJpbmcodmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHB1YmxpYyB1aW50IERhdGFBc0ludA0K ICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvVUludDMyKERh dGEsIDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgRGF0YSA9IEJpdENvbnZlcnRl ci5HZXRCeXRlcyh2YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMgaW50ZXJmYWNlIElQaHlzaWNhbFN0b3Jl IDogSURpc3Bvc2FibGUNCiAgICB7DQogICAgICAgIFBTQmxvY2sgR2V0QmxvY2soc3RyaW5nIGtleSwgc3RyaW5nIHZhbHVlKTsNCiAgICAgICAgUFNCbG9j ayBHZXRCbG9jayhzdHJpbmcga2V5LCB1aW50IHZhbHVlKTsNCiAgICAgICAgdm9pZCBBZGRCbG9jayhQU0Jsb2NrIGJsb2NrKTsNCiAgICAgICAgdm9pZCBB ZGRCbG9ja3MoSUVudW1lcmFibGU8UFNCbG9jaz4gYmxvY2tzKTsNCiAgICAgICAgdm9pZCBTZXRCbG9jayhzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWUsIGJ5 dGVbXSBkYXRhKTsNCiAgICAgICAgdm9pZCBTZXRCbG9jayhzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWUsIHN0cmluZyBkYXRhKTsNCiAgICAgICAgdm9pZCBT ZXRCbG9jayhzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWUsIHVpbnQgZGF0YSk7DQogICAgICAgIHZvaWQgU2V0QmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1 ZSwgYnl0ZVtdIGRhdGEpOw0KICAgICAgICB2b2lkIFNldEJsb2NrKHN0cmluZyBrZXksIHVpbnQgdmFsdWUsIHN0cmluZyBkYXRhKTsNCiAgICAgICAgdm9p ZCBTZXRCbG9jayhzdHJpbmcga2V5LCB1aW50IHZhbHVlLCB1aW50IGRhdGEpOw0KICAgICAgICB2b2lkIERlbGV0ZUJsb2NrKHN0cmluZyBrZXksIHN0cmlu ZyB2YWx1ZSk7DQogICAgICAgIHZvaWQgRGVsZXRlQmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1ZSk7DQogICAgICAgIGJ5dGVbXSBTZXJpYWxpemUoKTsN CiAgICAgICAgdm9pZCBEZXNlcmlhbGl6ZShieXRlW10gZGF0YSk7DQogICAgICAgIGJ5dGVbXSBSZWFkUmF3KCk7DQogICAgICAgIHZvaWQgV3JpdGVSYXco Ynl0ZVtdIGRhdGEpOw0KICAgICAgICBJRW51bWVyYWJsZTxQU0Jsb2NrPiBGaW5kQmxvY2tzKHN0cmluZyB2YWx1ZVNlYXJjaCk7DQogICAgICAgIElFbnVt ZXJhYmxlPFBTQmxvY2s+IEZpbmRCbG9ja3ModWludCB2YWx1ZVNlYXJjaCk7DQogICAgfQ0KfQ0KDQoNCi8vIExpYlRTZm9yZ2UvUGh5c2ljYWxTdG9yZS9Q aHlzaWNhbFN0b3JlTW9kZXJuLmNzDQpuYW1lc3BhY2UgTGliVFNmb3JnZS5QaHlzaWNhbFN0b3JlDQp7DQogICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5n IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KICAgIHVzaW5nIFN5c3RlbS5JTzsNCiAgICB1c2luZyBDcnlwdG87DQoNCiAgICBwdWJsaWMgY2xhc3Mg TW9kZXJuQmxvY2sNCiAgICB7DQogICAgICAgIHB1YmxpYyBCbG9ja1R5cGUgVHlwZTsNCiAgICAgICAgcHVibGljIHVpbnQgRmxhZ3M7DQogICAgICAgIHB1 YmxpYyB1aW50IFVua25vd247DQogICAgICAgIHB1YmxpYyBieXRlW10gVmFsdWU7DQogICAgICAgIHB1YmxpYyBzdHJpbmcgVmFsdWVBc1N0cg0KICAgICAg ICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuRGVjb2RlU3RyaW5nKFZhbHVlKTsNCiAg ICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFZhbHVlID0gVXRpbHMuRW5jb2RlU3RyaW5nKHZh bHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwdWJsaWMgdWludCBWYWx1ZUFzSW50DQogICAgICAgIHsNCiAgICAgICAgICAgIGdl dA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9VSW50MzIoVmFsdWUsIDApOw0KICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgc2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgVmFsdWUgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXModmFsdWUpOw0KICAg ICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHB1YmxpYyBieXRlW10gRGF0YTsNCiAgICAgICAgcHVibGljIHN0cmluZyBEYXRhQXNTdHINCiAgICAg ICAgew0KICAgICAgICAgICAgZ2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLkRlY29kZVN0cmluZyhEYXRhKTsNCiAg ICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERhdGEgPSBVdGlscy5FbmNvZGVTdHJpbmcodmFs dWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHB1YmxpYyB1aW50IERhdGFBc0ludA0KICAgICAgICB7DQogICAgICAgICAgICBnZXQN CiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvVUludDMyKERhdGEsIDApOw0KICAgICAgICAgICAgfQ0KICAg ICAgICAgICAgc2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgRGF0YSA9IEJpdENvbnZlcnRlci5HZXRCeXRlcyh2YWx1ZSk7DQogICAgICAg ICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBFbmNvZGUoQmluYXJ5V3JpdGVyIHdyaXRlcikNCiAgICAgICAgew0KICAgICAgICAg ICAgd3JpdGVyLldyaXRlKCh1aW50KVR5cGUpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKEZsYWdzKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgo dWludClWYWx1ZS5MZW5ndGgpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKCh1aW50KURhdGEuTGVuZ3RoKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0 ZShVbmtub3duKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShWYWx1ZSk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoRGF0YSk7DQogICAgICAgIH0N Cg0KICAgICAgICBwdWJsaWMgc3RhdGljIE1vZGVybkJsb2NrIERlY29kZShCaW5hcnlSZWFkZXIgcmVhZGVyKQ0KICAgICAgICB7DQogICAgICAgICAgICB1 aW50IHR5cGUgPSByZWFkZXIuUmVhZFVJbnQzMigpOw0KICAgICAgICAgICAgdWludCBmbGFncyA9IHJlYWRlci5SZWFkVUludDMyKCk7DQoNCiAgICAgICAg ICAgIHVpbnQgdmFsdWVMZW4gPSByZWFkZXIuUmVhZFVJbnQzMigpOw0KICAgICAgICAgICAgdWludCBkYXRhTGVuID0gcmVhZGVyLlJlYWRVSW50MzIoKTsN CiAgICAgICAgICAgIHVpbnQgdW5rMyA9IHJlYWRlci5SZWFkVUludDMyKCk7DQoNCiAgICAgICAgICAgIGJ5dGVbXSB2YWx1ZSA9IHJlYWRlci5SZWFkQnl0 ZXMoKGludCl2YWx1ZUxlbik7DQogICAgICAgICAgICBieXRlW10gZGF0YSA9IHJlYWRlci5SZWFkQnl0ZXMoKGludClkYXRhTGVuKTsNCg0KICAgICAgICAg ICAgcmV0dXJuIG5ldyBNb2Rlcm5CbG9jaw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFR5cGUgPSAoQmxvY2tUeXBlKXR5cGUsDQogICAgICAg ICAgICAgICAgRmxhZ3MgPSBmbGFncywNCiAgICAgICAgICAgICAgICBVbmtub3duID0gdW5rMywNCiAgICAgICAgICAgICAgICBWYWx1ZSA9IHZhbHVlLA0K ICAgICAgICAgICAgICAgIERhdGEgPSBkYXRhLA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBzZWFsZWQgY2xhc3Mg UGh5c2ljYWxTdG9yZU1vZGVybiA6IElQaHlzaWNhbFN0b3JlDQogICAgew0KICAgICAgICBwcml2YXRlIGJ5dGVbXSBQcmVIZWFkZXJCeXRlcyA9IHsgfTsN CiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgTGlzdDxNb2Rlcm5CbG9jaz4+IERhdGEgPSBuZXcgRGljdGlvbmFyeTxzdHJp bmcsIExpc3Q8TW9kZXJuQmxvY2s+PigpOw0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTdHJlYW0gVFNGaWxlOw0KICAgICAgICBwcml2YXRlIHJl YWRvbmx5IFBTVmVyc2lvbiBWZXJzaW9uOw0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgUHJvZHVjdGlvbjsNCg0KICAgICAgICBwdWJsaWMgYnl0 ZVtdIFNlcmlhbGl6ZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIEJpbmFyeVdyaXRlciB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlT dHJlYW0oKSk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoUHJlSGVhZGVyQnl0ZXMpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKERhdGEuS2V5cy5D b3VudCk7DQoNCiAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gRGF0YS5LZXlzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIExp c3Q8TW9kZXJuQmxvY2s+IGJsb2NrcyA9IERhdGFba2V5XTsNCiAgICAgICAgICAgICAgICBieXRlW10ga2V5TmFtZUVuYyA9IFV0aWxzLkVuY29kZVN0cmlu ZyhrZXkpOw0KDQogICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKGtleU5hbWVFbmMuTGVuZ3RoKTsNCiAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUo a2V5TmFtZUVuYyk7DQogICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKGJsb2Nrcy5Db3VudCk7DQogICAgICAgICAgICAgICAgd3JpdGVyLkFsaWduKDQp Ow0KDQogICAgICAgICAgICAgICAgZm9yZWFjaCAoTW9kZXJuQmxvY2sgYmxvY2sgaW4gYmxvY2tzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAg ICAgICAgICAgYmxvY2suRW5jb2RlKHdyaXRlcik7DQogICAgICAgICAgICAgICAgICAgIHdyaXRlci5BbGlnbig0KTsNCiAgICAgICAgICAgICAgICB9DQog ICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiB3cml0ZXIuR2V0Qnl0ZXMoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIERl c2VyaWFsaXplKGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBCaW5hcnlSZWFkZXIgcmVhZGVyID0gbmV3IEJpbmFyeVJlYWRlcihuZXcg TWVtb3J5U3RyZWFtKGRhdGEpKTsNCiAgICAgICAgICAgIFByZUhlYWRlckJ5dGVzID0gcmVhZGVyLlJlYWRCeXRlcyg4KTsNCg0KICAgICAgICAgICAgd2hp bGUgKHJlYWRlci5CYXNlU3RyZWFtLlBvc2l0aW9uIDwgZGF0YS5MZW5ndGggLSAweDQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdWludCBu dW1LZXlzID0gcmVhZGVyLlJlYWRVSW50MzIoKTsNCg0KICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5czsgaSsrKQ0KICAgICAg ICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgdWludCBsZW5LZXlOYW1lID0gcmVhZGVyLlJlYWRVSW50MzIoKTsNCiAgICAgICAgICAgICAgICAg ICAgc3RyaW5nIGtleU5hbWUgPSBVdGlscy5EZWNvZGVTdHJpbmcocmVhZGVyLlJlYWRCeXRlcygoaW50KWxlbktleU5hbWUpKTsgdWludCBudW1WYWx1ZXMg PSByZWFkZXIuUmVhZFVJbnQzMigpOw0KDQogICAgICAgICAgICAgICAgICAgIHJlYWRlci5BbGlnbig0KTsNCg0KICAgICAgICAgICAgICAgICAgICBEYXRh W2tleU5hbWVdID0gbmV3IExpc3Q8TW9kZXJuQmxvY2s+KCk7DQoNCiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1WYWx1ZXM7 IGorKykNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVtrZXlOYW1lXS5BZGQoTW9kZXJuQmxvY2suRGVjb2Rl KHJlYWRlcikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLkFsaWduKDQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAg ICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgQWRkQmxvY2soUFNCbG9jayBibG9jaykNCiAgICAgICAgew0K ICAgICAgICAgICAgaWYgKCFEYXRhLkNvbnRhaW5zS2V5KGJsb2NrLktleUFzU3RyKSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBEYXRhW2Js b2NrLktleUFzU3RyXSA9IG5ldyBMaXN0PE1vZGVybkJsb2NrPigpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBEYXRhW2Jsb2NrLktleUFzU3Ry XS5BZGQobmV3IE1vZGVybkJsb2NrDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgVHlwZSA9IGJsb2NrLlR5cGUsDQogICAgICAgICAgICAgICAg RmxhZ3MgPSBibG9jay5GbGFncywNCiAgICAgICAgICAgICAgICBVbmtub3duID0gYmxvY2suVW5rbm93biwNCiAgICAgICAgICAgICAgICBWYWx1ZSA9IGJs b2NrLlZhbHVlLA0KICAgICAgICAgICAgICAgIERhdGEgPSBibG9jay5EYXRhDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1Ymxp YyB2b2lkIEFkZEJsb2NrcyhJRW51bWVyYWJsZTxQU0Jsb2NrPiBibG9ja3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFBTQmxvY2sgYmxv Y2sgaW4gYmxvY2tzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFkZEJsb2NrKGJsb2NrKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0K DQogICAgICAgIHB1YmxpYyBQU0Jsb2NrIEdldEJsb2NrKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSkNCiAgICAgICAgew0KICAgICAgICAgICAgTGlzdDxN b2Rlcm5CbG9jaz4gYmxvY2tzID0gRGF0YVtrZXldOw0KDQogICAgICAgICAgICBmb3JlYWNoIChNb2Rlcm5CbG9jayBibG9jayBpbiBibG9ja3MpDQogICAg ICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNTdHIgPT0gdmFsdWUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAg ICAgICAgICByZXR1cm4gbmV3IFBTQmxvY2sNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGJsb2NrLlR5 cGUsDQogICAgICAgICAgICAgICAgICAgICAgICBGbGFncyA9IGJsb2NrLkZsYWdzLA0KICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gVXRpbHMuRW5j b2RlU3RyaW5nKGtleSksDQogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IGJsb2NrLlZhbHVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgRGF0 YSA9IGJsb2NrLkRhdGENCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJl dHVybiBudWxsOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIFBTQmxvY2sgR2V0QmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1ZSkNCiAgICAgICAg ew0KICAgICAgICAgICAgTGlzdDxNb2Rlcm5CbG9jaz4gYmxvY2tzID0gRGF0YVtrZXldOw0KDQogICAgICAgICAgICBmb3JlYWNoIChNb2Rlcm5CbG9jayBi bG9jayBpbiBibG9ja3MpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNJbnQgPT0gdmFsdWUpDQogICAgICAgICAg ICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBTQmxvY2sNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAg ICAgICAgVHlwZSA9IGJsb2NrLlR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICBGbGFncyA9IGJsb2NrLkZsYWdzLA0KICAgICAgICAgICAgICAgICAg ICAgICAgS2V5ID0gVXRpbHMuRW5jb2RlU3RyaW5nKGtleSksDQogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IGJsb2NrLlZhbHVlLA0KICAgICAg ICAgICAgICAgICAgICAgICAgRGF0YSA9IGJsb2NrLkRhdGENCiAgICAgICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAg ICB9DQoNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgU2V0QmxvY2soc3RyaW5nIGtleSwgc3Ry aW5nIHZhbHVlLCBieXRlW10gZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgTGlzdDxNb2Rlcm5CbG9jaz4gYmxvY2tzID0gRGF0YVtrZXldOw0KDQog ICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2Nrcy5Db3VudDsgaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIE1vZGVybkJs b2NrIGJsb2NrID0gYmxvY2tzW2ldOw0KDQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNTdHIgPT0gdmFsdWUpDQogICAgICAgICAgICAgICAg ew0KICAgICAgICAgICAgICAgICAgICBibG9jay5EYXRhID0gZGF0YTsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2ldID0gYmxvY2s7DQogICAgICAg ICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgRGF0YVtrZXldID0gYmxvY2tzOw0K ICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgU2V0QmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1ZSwgYnl0ZVtdIGRhdGEpDQogICAgICAgIHsN CiAgICAgICAgICAgIExpc3Q8TW9kZXJuQmxvY2s+IGJsb2NrcyA9IERhdGFba2V5XTsNCg0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9j a3MuQ291bnQ7IGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBNb2Rlcm5CbG9jayBibG9jayA9IGJsb2Nrc1tpXTsNCg0KICAgICAgICAg ICAgICAgIGlmIChibG9jay5WYWx1ZUFzSW50ID09IHZhbHVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2suRGF0YSA9 IGRhdGE7DQogICAgICAgICAgICAgICAgICAgIGJsb2Nrc1tpXSA9IGJsb2NrOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAg ICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIERhdGFba2V5XSA9IGJsb2NrczsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIFNl dEJsb2NrKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSwgc3RyaW5nIGRhdGEpDQogICAgICAgIHsNCiAgICAgICAgICAgIFNldEJsb2NrKGtleSwgdmFsdWUs IFV0aWxzLkVuY29kZVN0cmluZyhkYXRhKSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBTZXRCbG9jayhzdHJpbmcga2V5LCBzdHJpbmcg dmFsdWUsIHVpbnQgZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgU2V0QmxvY2soa2V5LCB2YWx1ZSwgQml0Q29udmVydGVyLkdldEJ5dGVzKGRhdGEp KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIFNldEJsb2NrKHN0cmluZyBrZXksIHVpbnQgdmFsdWUsIHN0cmluZyBkYXRhKQ0KICAgICAg ICB7DQogICAgICAgICAgICBTZXRCbG9jayhrZXksIHZhbHVlLCBVdGlscy5FbmNvZGVTdHJpbmcoZGF0YSkpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVi bGljIHZvaWQgU2V0QmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1ZSwgdWludCBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBTZXRCbG9jayhrZXks IHZhbHVlLCBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoZGF0YSkpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlQmxvY2soc3RyaW5n IGtleSwgc3RyaW5nIHZhbHVlKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoIURhdGEuQ29udGFpbnNLZXkoa2V5KSkNCiAgICAgICAgICAgIHsNCiAg ICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIExpc3Q8TW9kZXJuQmxvY2s+IGJsb2NrcyA9IERhdGFba2V5XTsN Cg0KICAgICAgICAgICAgZm9yZWFjaCAoTW9kZXJuQmxvY2sgYmxvY2sgaW4gYmxvY2tzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChi bG9jay5WYWx1ZUFzU3RyID09IHZhbHVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLlJlbW92ZShibG9jayk7DQog ICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgRGF0YVtrZXldID0gYmxv Y2tzOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlQmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1ZSkNCiAgICAgICAgew0KICAg ICAgICAgICAgaWYgKCFEYXRhLkNvbnRhaW5zS2V5KGtleSkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAg fQ0KDQogICAgICAgICAgICBMaXN0PE1vZGVybkJsb2NrPiBibG9ja3MgPSBEYXRhW2tleV07DQoNCiAgICAgICAgICAgIGZvcmVhY2ggKE1vZGVybkJsb2Nr IGJsb2NrIGluIGJsb2NrcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2suVmFsdWVBc0ludCA9PSB2YWx1ZSkNCiAgICAgICAg ICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGJsb2Nrcy5SZW1vdmUoYmxvY2spOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAg ICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIERhdGFba2V5XSA9IGJsb2NrczsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBQ aHlzaWNhbFN0b3JlTW9kZXJuKHN0cmluZyB0c1BhdGgsIGJvb2wgcHJvZHVjdGlvbiwgUFNWZXJzaW9uIHZlcnNpb24pDQogICAgICAgIHsNCiAgICAgICAg ICAgIFRTRmlsZSA9IEZpbGUuT3Blbih0c1BhdGgsIEZpbGVNb2RlLk9wZW5PckNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUsIEZpbGVTaGFyZS5Ob25l KTsNCiAgICAgICAgICAgIERlc2VyaWFsaXplKFBoeXNTdG9yZUNyeXB0by5EZWNyeXB0UGh5c2ljYWxTdG9yZShUU0ZpbGUuUmVhZEFsbEJ5dGVzKCksIHBy b2R1Y3Rpb24sIHZlcnNpb24pKTsNCiAgICAgICAgICAgIFRTRmlsZS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgVmVyc2lvbiA9 IHZlcnNpb247DQogICAgICAgICAgICBQcm9kdWN0aW9uID0gcHJvZHVjdGlvbjsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2Uo KQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoVFNGaWxlLkNhbldyaXRlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRh ID0gUGh5c1N0b3JlQ3J5cHRvLkVuY3J5cHRQaHlzaWNhbFN0b3JlKFNlcmlhbGl6ZSgpLCBQcm9kdWN0aW9uLCBWZXJzaW9uKTsNCiAgICAgICAgICAgICAg ICBUU0ZpbGUuU2V0TGVuZ3RoKGRhdGEuTG9uZ0xlbmd0aCk7DQogICAgICAgICAgICAgICAgVFNGaWxlLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQog ICAgICAgICAgICAgICAgVFNGaWxlLldyaXRlQWxsQnl0ZXMoZGF0YSk7DQogICAgICAgICAgICAgICAgVFNGaWxlLkNsb3NlKCk7DQogICAgICAgICAgICB9 DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgYnl0ZVtdIFJlYWRSYXcoKQ0KICAgICAgICB7DQogICAgICAgICAgICBieXRlW10gZGF0YSA9IFBoeXNT dG9yZUNyeXB0by5EZWNyeXB0UGh5c2ljYWxTdG9yZShUU0ZpbGUuUmVhZEFsbEJ5dGVzKCksIFByb2R1Y3Rpb24sIFZlcnNpb24pOw0KICAgICAgICAgICAg VFNGaWxlLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICByZXR1cm4gZGF0YTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2 b2lkIFdyaXRlUmF3KGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBieXRlW10gZW5jckRhdGEgPSBQaHlzU3RvcmVDcnlwdG8uRW5jcnlw dFBoeXNpY2FsU3RvcmUoZGF0YSwgUHJvZHVjdGlvbiwgVmVyc2lvbik7DQogICAgICAgICAgICBUU0ZpbGUuU2V0TGVuZ3RoKGVuY3JEYXRhLkxvbmdMZW5n dGgpOw0KICAgICAgICAgICAgVFNGaWxlLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICBUU0ZpbGUuV3JpdGVBbGxCeXRlcyhlbmNy RGF0YSk7DQogICAgICAgICAgICBUU0ZpbGUuQ2xvc2UoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxQU0Jsb2NrPiBGaW5k QmxvY2tzKHN0cmluZyB2YWx1ZVNlYXJjaCkNCiAgICAgICAgew0KICAgICAgICAgICAgTGlzdDxQU0Jsb2NrPiByZXN1bHRzID0gbmV3IExpc3Q8UFNCbG9j az4oKTsNCg0KICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGtleSBpbiBEYXRhLktleXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgTGlz dDxNb2Rlcm5CbG9jaz4gdmFsdWVzID0gRGF0YVtrZXldOw0KDQogICAgICAgICAgICAgICAgZm9yZWFjaCAoTW9kZXJuQmxvY2sgYmxvY2sgaW4gdmFsdWVz KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNTdHIuQ29udGFpbnModmFsdWVTZWFyY2gpKQ0KICAg ICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLkFkZChuZXcgUFNCbG9jaw0KICAgICAgICAgICAgICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSBibG9jay5UeXBlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzID0g YmxvY2suRmxhZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5QXNTdHIgPSBrZXksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFs dWUgPSBibG9jay5WYWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gYmxvY2suRGF0YQ0KICAgICAgICAgICAgICAgICAgICAgICAg fSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiByZXN1bHRz Ow0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFBTQmxvY2s+IEZpbmRCbG9ja3ModWludCB2YWx1ZVNlYXJjaCkNCiAgICAgICAg ew0KICAgICAgICAgICAgTGlzdDxQU0Jsb2NrPiByZXN1bHRzID0gbmV3IExpc3Q8UFNCbG9jaz4oKTsNCg0KICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5n IGtleSBpbiBEYXRhLktleXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgTGlzdDxNb2Rlcm5CbG9jaz4gdmFsdWVzID0gRGF0YVtrZXldOw0K DQogICAgICAgICAgICAgICAgZm9yZWFjaCAoTW9kZXJuQmxvY2sgYmxvY2sgaW4gdmFsdWVzKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAg ICAgICAgaWYgKGJsb2NrLlZhbHVlQXNJbnQgPT0gdmFsdWVTZWFyY2gpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAg IHJlc3VsdHMuQWRkKG5ldyBQU0Jsb2NrDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGJs b2NrLlR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSBibG9jay5GbGFncywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBL ZXlBc1N0ciA9IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IGJsb2NrLlZhbHVlLA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgIERhdGEgPSBibG9jay5EYXRhDQogICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAg IH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9Q aHlzaWNhbFN0b3JlL1BoeXNpY2FsU3RvcmVWaXN0YS5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuUGh5c2ljYWxTdG9yZQ0Kew0KICAgIHVzaW5nIFN5c3Rl bTsNCiAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCiAgICB1c2luZyBTeXN0ZW0uSU87DQogICAgdXNpbmcgQ3J5cHRvOw0KDQogICAg cHVibGljIGNsYXNzIFZpc3RhQmxvY2sNCiAgICB7DQogICAgICAgIHB1YmxpYyBCbG9ja1R5cGUgVHlwZTsNCiAgICAgICAgcHVibGljIHVpbnQgRmxhZ3M7 DQogICAgICAgIHB1YmxpYyBieXRlW10gVmFsdWU7DQogICAgICAgIHB1YmxpYyBzdHJpbmcgVmFsdWVBc1N0cg0KICAgICAgICB7DQogICAgICAgICAgICBn ZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuRGVjb2RlU3RyaW5nKFZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAg ICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFZhbHVlID0gVXRpbHMuRW5jb2RlU3RyaW5nKHZhbHVlKTsNCiAgICAgICAgICAg IH0NCiAgICAgICAgfQ0KICAgICAgICBwdWJsaWMgdWludCBWYWx1ZUFzSW50DQogICAgICAgIHsNCiAgICAgICAgICAgIGdldA0KICAgICAgICAgICAgew0K ICAgICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9VSW50MzIoVmFsdWUsIDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0DQog ICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgVmFsdWUgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXModmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAg ICB9DQogICAgICAgIHB1YmxpYyBieXRlW10gRGF0YTsNCiAgICAgICAgcHVibGljIHN0cmluZyBEYXRhQXNTdHINCiAgICAgICAgew0KICAgICAgICAgICAg Z2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLkRlY29kZVN0cmluZyhEYXRhKTsNCiAgICAgICAgICAgIH0NCiAgICAg ICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIERhdGEgPSBVdGlscy5FbmNvZGVTdHJpbmcodmFsdWUpOw0KICAgICAgICAgICAg fQ0KICAgICAgICB9DQogICAgICAgIHB1YmxpYyB1aW50IERhdGFBc0ludA0KICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAg ICAgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvVUludDMyKERhdGEsIDApOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0DQogICAg ICAgICAgICB7DQogICAgICAgICAgICAgICAgRGF0YSA9IEJpdENvbnZlcnRlci5HZXRCeXRlcyh2YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0N Cg0KICAgICAgICBpbnRlcm5hbCB2b2lkIEVuY29kZShCaW5hcnlXcml0ZXIgd3JpdGVyKQ0KICAgICAgICB7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUo KHVpbnQpVHlwZSk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoRmxhZ3MpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKFZhbHVlLkxlbmd0aCk7DQog ICAgICAgICAgICB3cml0ZXIuV3JpdGUoRGF0YS5MZW5ndGgpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKFZhbHVlKTsNCiAgICAgICAgICAgIHdyaXRl ci5Xcml0ZShEYXRhKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGludGVybmFsIHN0YXRpYyBWaXN0YUJsb2NrIERlY29kZShCaW5hcnlSZWFkZXIgcmVhZGVy KQ0KICAgICAgICB7DQogICAgICAgICAgICB1aW50IHR5cGUgPSByZWFkZXIuUmVhZFVJbnQzMigpOw0KICAgICAgICAgICAgdWludCBmbGFncyA9IHJlYWRl ci5SZWFkVUludDMyKCk7DQoNCiAgICAgICAgICAgIGludCB2YWx1ZUxlbiA9IHJlYWRlci5SZWFkSW50MzIoKTsNCiAgICAgICAgICAgIGludCBkYXRhTGVu ID0gcmVhZGVyLlJlYWRJbnQzMigpOw0KDQogICAgICAgICAgICBieXRlW10gdmFsdWUgPSByZWFkZXIuUmVhZEJ5dGVzKHZhbHVlTGVuKTsNCiAgICAgICAg ICAgIGJ5dGVbXSBkYXRhID0gcmVhZGVyLlJlYWRCeXRlcyhkYXRhTGVuKTsNCiAgICAgICAgICAgIHJldHVybiBuZXcgVmlzdGFCbG9jaw0KICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgIFR5cGUgPSAoQmxvY2tUeXBlKXR5cGUsDQogICAgICAgICAgICAgICAgRmxhZ3MgPSBmbGFncywNCiAgICAgICAgICAg ICAgICBWYWx1ZSA9IHZhbHVlLA0KICAgICAgICAgICAgICAgIERhdGEgPSBkYXRhLA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAg IHB1YmxpYyBzZWFsZWQgY2xhc3MgUGh5c2ljYWxTdG9yZVZpc3RhIDogSVBoeXNpY2FsU3RvcmUNCiAgICB7DQogICAgICAgIHByaXZhdGUgYnl0ZVtdIFBy ZUhlYWRlckJ5dGVzID0geyB9Ow0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8VmlzdGFCbG9jaz4gQmxvY2tzID0gbmV3IExpc3Q8VmlzdGFCbG9j az4oKTsNCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3RyZWFtIFRTUHJpbWFyeTsNCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3RyZWFt IFRTU2Vjb25kYXJ5Ow0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgUHJvZHVjdGlvbjsNCg0KICAgICAgICBwdWJsaWMgYnl0ZVtdIFNlcmlhbGl6 ZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIEJpbmFyeVdyaXRlciB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKG5ldyBNZW1vcnlTdHJlYW0oKSk7DQog ICAgICAgICAgICB3cml0ZXIuV3JpdGUoUHJlSGVhZGVyQnl0ZXMpOw0KDQogICAgICAgICAgICBmb3JlYWNoIChWaXN0YUJsb2NrIGJsb2NrIGluIEJsb2Nr cykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBibG9jay5FbmNvZGUod3JpdGVyKTsNCiAgICAgICAgICAgICAgICB3cml0ZXIuQWxpZ24oNCk7 DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiB3cml0ZXIuR2V0Qnl0ZXMoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lk IERlc2VyaWFsaXplKGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBpbnQgbGVuID0gZGF0YS5MZW5ndGg7DQoNCiAgICAgICAgICAgIEJp bmFyeVJlYWRlciByZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKG5ldyBNZW1vcnlTdHJlYW0oZGF0YSkpOw0KICAgICAgICAgICAgUHJlSGVhZGVyQnl0ZXMg PSByZWFkZXIuUmVhZEJ5dGVzKDgpOw0KDQogICAgICAgICAgICB3aGlsZSAocmVhZGVyLkJhc2VTdHJlYW0uUG9zaXRpb24gPCBsZW4gLSAweDE0KQ0KICAg ICAgICAgICAgew0KICAgICAgICAgICAgICAgIEJsb2Nrcy5BZGQoVmlzdGFCbG9jay5EZWNvZGUocmVhZGVyKSk7DQogICAgICAgICAgICAgICAgcmVhZGVy LkFsaWduKDQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgQWRkQmxvY2soUFNCbG9jayBibG9jaykNCiAgICAg ICAgew0KICAgICAgICAgICAgQmxvY2tzLkFkZChuZXcgVmlzdGFCbG9jaw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFR5cGUgPSBibG9jay5U eXBlLA0KICAgICAgICAgICAgICAgIEZsYWdzID0gYmxvY2suRmxhZ3MsDQogICAgICAgICAgICAgICAgVmFsdWUgPSBibG9jay5WYWx1ZSwNCiAgICAgICAg ICAgICAgICBEYXRhID0gYmxvY2suRGF0YQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBBZGRCbG9ja3MoSUVu dW1lcmFibGU8UFNCbG9jaz4gYmxvY2tzKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3JlYWNoIChQU0Jsb2NrIGJsb2NrIGluIGJsb2NrcykNCiAgICAg ICAgICAgIHsNCiAgICAgICAgICAgICAgICBBZGRCbG9jayhibG9jayk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgUFNC bG9jayBHZXRCbG9jayhzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFZpc3RhQmxvY2sgYmxvY2sg aW4gQmxvY2tzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlmIChibG9jay5WYWx1ZUFzU3RyID09IHZhbHVlKQ0KICAgICAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQU0Jsb2NrDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAg IFR5cGUgPSBibG9jay5UeXBlLA0KICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSBibG9jay5GbGFncywNCiAgICAgICAgICAgICAgICAgICAgICAg IEtleSA9IG5ldyBieXRlWzBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBibG9jay5WYWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAg IERhdGEgPSBibG9jay5EYXRhDQogICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAg ICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBQU0Jsb2NrIEdldEJsb2NrKHN0cmluZyBrZXksIHVpbnQgdmFsdWUpDQogICAg ICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFZpc3RhQmxvY2sgYmxvY2sgaW4gQmxvY2tzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGlm IChibG9jay5WYWx1ZUFzSW50ID09IHZhbHVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQU0Jsb2NrDQog ICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSBibG9jay5UeXBlLA0KICAgICAgICAgICAgICAgICAgICAgICAg RmxhZ3MgPSBibG9jay5GbGFncywNCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9IG5ldyBieXRlWzBdLA0KICAgICAgICAgICAgICAgICAgICAgICAg VmFsdWUgPSBibG9jay5WYWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBibG9jay5EYXRhDQogICAgICAgICAgICAgICAgICAgIH07DQog ICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2 b2lkIFNldEJsb2NrKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSwgYnl0ZVtdIGRhdGEpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAw OyBpIDwgQmxvY2tzLkNvdW50OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgVmlzdGFCbG9jayBibG9jayA9IEJsb2Nrc1tpXTsNCg0K ICAgICAgICAgICAgICAgIGlmIChibG9jay5WYWx1ZUFzU3RyID09IHZhbHVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgYmxv Y2suRGF0YSA9IGRhdGE7DQogICAgICAgICAgICAgICAgICAgIEJsb2Nrc1tpXSA9IGJsb2NrOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAg ICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBTZXRCbG9jayhzdHJpbmcga2V5LCB1aW50IHZh bHVlLCBieXRlW10gZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCbG9ja3MuQ291bnQ7IGkrKykNCiAgICAgICAg ICAgIHsNCiAgICAgICAgICAgICAgICBWaXN0YUJsb2NrIGJsb2NrID0gQmxvY2tzW2ldOw0KDQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNJ bnQgPT0gdmFsdWUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBibG9jay5EYXRhID0gZGF0YTsNCiAgICAgICAgICAgICAgICAg ICAgQmxvY2tzW2ldID0gYmxvY2s7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAg ICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIFNldEJsb2NrKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSwgc3RyaW5nIGRhdGEpDQogICAgICAgIHsNCiAg ICAgICAgICAgIFNldEJsb2NrKGtleSwgdmFsdWUsIFV0aWxzLkVuY29kZVN0cmluZyhkYXRhKSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9p ZCBTZXRCbG9jayhzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWUsIHVpbnQgZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgU2V0QmxvY2soa2V5LCB2YWx1 ZSwgQml0Q29udmVydGVyLkdldEJ5dGVzKGRhdGEpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIFNldEJsb2NrKHN0cmluZyBrZXksIHVp bnQgdmFsdWUsIHN0cmluZyBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBTZXRCbG9jayhrZXksIHZhbHVlLCBVdGlscy5FbmNvZGVTdHJpbmcoZGF0 YSkpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgU2V0QmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1ZSwgdWludCBkYXRhKQ0KICAgICAg ICB7DQogICAgICAgICAgICBTZXRCbG9jayhrZXksIHZhbHVlLCBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoZGF0YSkpOw0KICAgICAgICB9DQoNCiAgICAgICAg cHVibGljIHZvaWQgRGVsZXRlQmxvY2soc3RyaW5nIGtleSwgc3RyaW5nIHZhbHVlKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3JlYWNoIChWaXN0YUJs b2NrIGJsb2NrIGluIEJsb2NrcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2suVmFsdWVBc1N0ciA9PSB2YWx1ZSkNCiAgICAg ICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIEJsb2Nrcy5SZW1vdmUoYmxvY2spOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAg ICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlQmxvY2soc3RyaW5nIGtleSwgdWlu dCB2YWx1ZSkNCiAgICAgICAgew0KICAgICAgICAgICAgZm9yZWFjaCAoVmlzdGFCbG9jayBibG9jayBpbiBCbG9ja3MpDQogICAgICAgICAgICB7DQogICAg ICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNJbnQgPT0gdmFsdWUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBCbG9ja3Mu UmVtb3ZlKGJsb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0K DQogICAgICAgIHB1YmxpYyBQaHlzaWNhbFN0b3JlVmlzdGEoc3RyaW5nIHByaW1hcnlQYXRoLCBib29sIHByb2R1Y3Rpb24pDQogICAgICAgIHsNCiAgICAg ICAgICAgIFRTUHJpbWFyeSA9IEZpbGUuT3BlbihwcmltYXJ5UGF0aCwgRmlsZU1vZGUuT3Blbk9yQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSwgRmls ZVNoYXJlLk5vbmUpOw0KICAgICAgICAgICAgVFNTZWNvbmRhcnkgPSBGaWxlLk9wZW4ocHJpbWFyeVBhdGguUmVwbGFjZSgiLTAuIiwgIi0xLiIpLCBGaWxl TW9kZS5PcGVuT3JDcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlLCBGaWxlU2hhcmUuTm9uZSk7DQogICAgICAgICAgICBQcm9kdWN0aW9uID0gcHJvZHVj dGlvbjsNCg0KICAgICAgICAgICAgRGVzZXJpYWxpemUoUGh5c1N0b3JlQ3J5cHRvLkRlY3J5cHRQaHlzaWNhbFN0b3JlKFRTUHJpbWFyeS5SZWFkQWxsQnl0 ZXMoKSwgcHJvZHVjdGlvbiwgUFNWZXJzaW9uLlZpc3RhKSk7DQogICAgICAgICAgICBUU1ByaW1hcnkuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsNCiAg ICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQ0KICAgICAgICB7DQogICAgICAgICAgICBpZiAoVFNQcmltYXJ5LkNhbldyaXRlICYm IFRTU2Vjb25kYXJ5LkNhbldyaXRlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gUGh5c1N0b3JlQ3J5cHRvLkVuY3J5 cHRQaHlzaWNhbFN0b3JlKFNlcmlhbGl6ZSgpLCBQcm9kdWN0aW9uLCBQU1ZlcnNpb24uVmlzdGEpOw0KDQogICAgICAgICAgICAgICAgVFNQcmltYXJ5LlNl dExlbmd0aChkYXRhLkxvbmdMZW5ndGgpOw0KICAgICAgICAgICAgICAgIFRTU2Vjb25kYXJ5LlNldExlbmd0aChkYXRhLkxvbmdMZW5ndGgpOw0KDQogICAg ICAgICAgICAgICAgVFNQcmltYXJ5LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICAgICAgVFNTZWNvbmRhcnkuU2VlaygwLCBTZWVr T3JpZ2luLkJlZ2luKTsNCg0KICAgICAgICAgICAgICAgIFRTUHJpbWFyeS5Xcml0ZUFsbEJ5dGVzKGRhdGEpOw0KICAgICAgICAgICAgICAgIFRTU2Vjb25k YXJ5LldyaXRlQWxsQnl0ZXMoZGF0YSk7DQoNCiAgICAgICAgICAgICAgICBUU1ByaW1hcnkuQ2xvc2UoKTsNCiAgICAgICAgICAgICAgICBUU1NlY29uZGFy eS5DbG9zZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGJ5dGVbXSBSZWFkUmF3KCkNCiAgICAgICAgew0KICAgICAg ICAgICAgYnl0ZVtdIGRhdGEgPSBQaHlzU3RvcmVDcnlwdG8uRGVjcnlwdFBoeXNpY2FsU3RvcmUoVFNQcmltYXJ5LlJlYWRBbGxCeXRlcygpLCBQcm9kdWN0 aW9uLCBQU1ZlcnNpb24uVmlzdGEpOw0KICAgICAgICAgICAgVFNQcmltYXJ5LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICByZXR1 cm4gZGF0YTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUmF3KGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBi eXRlW10gZW5jckRhdGEgPSBQaHlzU3RvcmVDcnlwdG8uRW5jcnlwdFBoeXNpY2FsU3RvcmUoZGF0YSwgUHJvZHVjdGlvbiwgUFNWZXJzaW9uLlZpc3RhKTsN Cg0KICAgICAgICAgICAgVFNQcmltYXJ5LlNldExlbmd0aChlbmNyRGF0YS5Mb25nTGVuZ3RoKTsNCiAgICAgICAgICAgIFRTU2Vjb25kYXJ5LlNldExlbmd0 aChlbmNyRGF0YS5Mb25nTGVuZ3RoKTsNCg0KICAgICAgICAgICAgVFNQcmltYXJ5LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICBU U1NlY29uZGFyeS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOw0KDQogICAgICAgICAgICBUU1ByaW1hcnkuV3JpdGVBbGxCeXRlcyhlbmNyRGF0YSk7DQog ICAgICAgICAgICBUU1NlY29uZGFyeS5Xcml0ZUFsbEJ5dGVzKGVuY3JEYXRhKTsNCg0KICAgICAgICAgICAgVFNQcmltYXJ5LkNsb3NlKCk7DQogICAgICAg ICAgICBUU1NlY29uZGFyeS5DbG9zZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFBTQmxvY2s+IEZpbmRCbG9ja3Moc3Ry aW5nIHZhbHVlU2VhcmNoKQ0KICAgICAgICB7DQogICAgICAgICAgICBMaXN0PFBTQmxvY2s+IHJlc3VsdHMgPSBuZXcgTGlzdDxQU0Jsb2NrPigpOw0KDQog ICAgICAgICAgICBmb3JlYWNoIChWaXN0YUJsb2NrIGJsb2NrIGluIEJsb2NrcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2su VmFsdWVBc1N0ci5Db250YWlucyh2YWx1ZVNlYXJjaCkpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXN1bHRzLkFkZChuZXcg UFNCbG9jaw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gYmxvY2suVHlwZSwNCiAgICAgICAgICAgICAg ICAgICAgICAgIEZsYWdzID0gYmxvY2suRmxhZ3MsDQogICAgICAgICAgICAgICAgICAgICAgICBLZXkgPSBuZXcgYnl0ZVswXSwNCiAgICAgICAgICAgICAg ICAgICAgICAgIFZhbHVlID0gYmxvY2suVmFsdWUsDQogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gYmxvY2suRGF0YQ0KICAgICAgICAgICAgICAg ICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzOw0KICAgICAgICB9DQoNCiAg ICAgICAgcHVibGljIElFbnVtZXJhYmxlPFBTQmxvY2s+IEZpbmRCbG9ja3ModWludCB2YWx1ZVNlYXJjaCkNCiAgICAgICAgew0KICAgICAgICAgICAgTGlz dDxQU0Jsb2NrPiByZXN1bHRzID0gbmV3IExpc3Q8UFNCbG9jaz4oKTsNCg0KICAgICAgICAgICAgZm9yZWFjaCAoVmlzdGFCbG9jayBibG9jayBpbiBCbG9j a3MpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNJbnQgPT0gdmFsdWVTZWFyY2gpDQogICAgICAgICAgICAgICAg ew0KICAgICAgICAgICAgICAgICAgICByZXN1bHRzLkFkZChuZXcgUFNCbG9jaw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAg ICAgICBUeXBlID0gYmxvY2suVHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzID0gYmxvY2suRmxhZ3MsDQogICAgICAgICAgICAgICAgICAg ICAgICBLZXkgPSBuZXcgYnl0ZVswXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gYmxvY2suVmFsdWUsDQogICAgICAgICAgICAgICAgICAg ICAgICBEYXRhID0gYmxvY2suRGF0YQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAg ICAgICAgIHJldHVybiByZXN1bHRzOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQoNCi8vIExpYlRTZm9yZ2UvUGh5c2ljYWxTdG9yZS9QaHlzaWNhbFN0b3Jl V2luNy5jcw0KbmFtZXNwYWNlIExpYlRTZm9yZ2UuUGh5c2ljYWxTdG9yZQ0Kew0KICAgIHVzaW5nIFN5c3RlbTsNCiAgICB1c2luZyBTeXN0ZW0uQ29sbGVj dGlvbnMuR2VuZXJpYzsNCiAgICB1c2luZyBTeXN0ZW0uSU87DQogICAgdXNpbmcgQ3J5cHRvOw0KDQogICAgcHVibGljIGNsYXNzIFdpbjdCbG9jaw0KICAg IHsNCiAgICAgICAgcHVibGljIEJsb2NrVHlwZSBUeXBlOw0KICAgICAgICBwdWJsaWMgdWludCBGbGFnczsNCiAgICAgICAgcHVibGljIGJ5dGVbXSBLZXk7 DQogICAgICAgIHB1YmxpYyBzdHJpbmcgS2V5QXNTdHINCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAg ICAgcmV0dXJuIFV0aWxzLkRlY29kZVN0cmluZyhLZXkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0DQogICAgICAgICAgICB7DQogICAgICAg ICAgICAgICAgS2V5ID0gVXRpbHMuRW5jb2RlU3RyaW5nKHZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwdWJsaWMgYnl0ZVtd IFZhbHVlOw0KICAgICAgICBwdWJsaWMgc3RyaW5nIFZhbHVlQXNTdHINCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0DQogICAgICAgICAgICB7DQogICAg ICAgICAgICAgICAgcmV0dXJuIFV0aWxzLkRlY29kZVN0cmluZyhWYWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXQNCiAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICBWYWx1ZSA9IFV0aWxzLkVuY29kZVN0cmluZyh2YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAg cHVibGljIHVpbnQgVmFsdWVBc0ludA0KICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4g Qml0Q29udmVydGVyLlRvVUludDMyKFZhbHVlLCAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAg ICAgICAgIFZhbHVlID0gQml0Q29udmVydGVyLkdldEJ5dGVzKHZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwdWJsaWMgYnl0 ZVtdIERhdGE7DQogICAgICAgIHB1YmxpYyBzdHJpbmcgRGF0YUFzU3RyDQogICAgICAgIHsNCiAgICAgICAgICAgIGdldA0KICAgICAgICAgICAgew0KICAg ICAgICAgICAgICAgIHJldHVybiBVdGlscy5EZWNvZGVTdHJpbmcoRGF0YSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXQNCiAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICBEYXRhID0gVXRpbHMuRW5jb2RlU3RyaW5nKHZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBw dWJsaWMgdWludCBEYXRhQXNJbnQNCiAgICAgICAgew0KICAgICAgICAgICAgZ2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuIEJp dENvbnZlcnRlci5Ub1VJbnQzMihEYXRhLCAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAg ICAgIERhdGEgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXModmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaW50ZXJuYWwgdm9p ZCBFbmNvZGUoQmluYXJ5V3JpdGVyIHdyaXRlcikNCiAgICAgICAgew0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKCh1aW50KVR5cGUpOw0KICAgICAgICAg ICAgd3JpdGVyLldyaXRlKEZsYWdzKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShLZXkuTGVuZ3RoKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShW YWx1ZS5MZW5ndGgpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKERhdGEuTGVuZ3RoKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShLZXkpOw0KICAg ICAgICAgICAgd3JpdGVyLldyaXRlKFZhbHVlKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShEYXRhKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGludGVy bmFsIHN0YXRpYyBXaW43QmxvY2sgRGVjb2RlKEJpbmFyeVJlYWRlciByZWFkZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVpbnQgdHlwZSA9IHJlYWRl ci5SZWFkVUludDMyKCk7DQogICAgICAgICAgICB1aW50IGZsYWdzID0gcmVhZGVyLlJlYWRVSW50MzIoKTsNCg0KICAgICAgICAgICAgaW50IGtleUxlbiA9 IHJlYWRlci5SZWFkSW50MzIoKTsNCiAgICAgICAgICAgIGludCB2YWx1ZUxlbiA9IHJlYWRlci5SZWFkSW50MzIoKTsNCiAgICAgICAgICAgIGludCBkYXRh TGVuID0gcmVhZGVyLlJlYWRJbnQzMigpOw0KDQogICAgICAgICAgICBieXRlW10ga2V5ID0gcmVhZGVyLlJlYWRCeXRlcyhrZXlMZW4pOw0KICAgICAgICAg ICAgYnl0ZVtdIHZhbHVlID0gcmVhZGVyLlJlYWRCeXRlcyh2YWx1ZUxlbik7DQogICAgICAgICAgICBieXRlW10gZGF0YSA9IHJlYWRlci5SZWFkQnl0ZXMo ZGF0YUxlbik7DQogICAgICAgICAgICByZXR1cm4gbmV3IFdpbjdCbG9jaw0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFR5cGUgPSAoQmxvY2tU eXBlKXR5cGUsDQogICAgICAgICAgICAgICAgRmxhZ3MgPSBmbGFncywNCiAgICAgICAgICAgICAgICBLZXkgPSBrZXksDQogICAgICAgICAgICAgICAgVmFs dWUgPSB2YWx1ZSwNCiAgICAgICAgICAgICAgICBEYXRhID0gZGF0YSwNCiAgICAgICAgICAgIH07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwdWJsaWMg c2VhbGVkIGNsYXNzIFBoeXNpY2FsU3RvcmVXaW43IDogSVBoeXNpY2FsU3RvcmUNCiAgICB7DQogICAgICAgIHByaXZhdGUgYnl0ZVtdIFByZUhlYWRlckJ5 dGVzID0geyB9Ow0KICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8V2luN0Jsb2NrPiBCbG9ja3MgPSBuZXcgTGlzdDxXaW43QmxvY2s+KCk7DQogICAg ICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVN0cmVhbSBUU1ByaW1hcnk7DQogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVN0cmVhbSBUU1NlY29uZGFy eTsNCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIFByb2R1Y3Rpb247DQoNCiAgICAgICAgcHVibGljIGJ5dGVbXSBTZXJpYWxpemUoKQ0KICAgICAg ICB7DQogICAgICAgICAgICBCaW5hcnlXcml0ZXIgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOw0KICAgICAgICAgICAg d3JpdGVyLldyaXRlKFByZUhlYWRlckJ5dGVzKTsNCg0KICAgICAgICAgICAgZm9yZWFjaCAoV2luN0Jsb2NrIGJsb2NrIGluIEJsb2NrcykNCiAgICAgICAg ICAgIHsNCiAgICAgICAgICAgICAgICBibG9jay5FbmNvZGUod3JpdGVyKTsNCiAgICAgICAgICAgICAgICB3cml0ZXIuQWxpZ24oNCk7DQogICAgICAgICAg ICB9DQoNCiAgICAgICAgICAgIHJldHVybiB3cml0ZXIuR2V0Qnl0ZXMoKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIERlc2VyaWFsaXpl KGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBpbnQgbGVuID0gZGF0YS5MZW5ndGg7DQoNCiAgICAgICAgICAgIEJpbmFyeVJlYWRlciBy ZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKG5ldyBNZW1vcnlTdHJlYW0oZGF0YSkpOw0KICAgICAgICAgICAgUHJlSGVhZGVyQnl0ZXMgPSByZWFkZXIuUmVh ZEJ5dGVzKDgpOw0KDQogICAgICAgICAgICB3aGlsZSAocmVhZGVyLkJhc2VTdHJlYW0uUG9zaXRpb24gPCBsZW4gLSAweDE0KQ0KICAgICAgICAgICAgew0K ICAgICAgICAgICAgICAgIEJsb2Nrcy5BZGQoV2luN0Jsb2NrLkRlY29kZShyZWFkZXIpKTsNCiAgICAgICAgICAgICAgICByZWFkZXIuQWxpZ24oNCk7DQog ICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBBZGRCbG9jayhQU0Jsb2NrIGJsb2NrKQ0KICAgICAgICB7DQogICAgICAg ICAgICBCbG9ja3MuQWRkKG5ldyBXaW43QmxvY2sNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBUeXBlID0gYmxvY2suVHlwZSwNCiAgICAgICAg ICAgICAgICBGbGFncyA9IGJsb2NrLkZsYWdzLA0KICAgICAgICAgICAgICAgIEtleSA9IGJsb2NrLktleSwNCiAgICAgICAgICAgICAgICBWYWx1ZSA9IGJs b2NrLlZhbHVlLA0KICAgICAgICAgICAgICAgIERhdGEgPSBibG9jay5EYXRhDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1Ymxp YyB2b2lkIEFkZEJsb2NrcyhJRW51bWVyYWJsZTxQU0Jsb2NrPiBibG9ja3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFBTQmxvY2sgYmxv Y2sgaW4gYmxvY2tzKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIEFkZEJsb2NrKGJsb2NrKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0K DQogICAgICAgIHB1YmxpYyBQU0Jsb2NrIEdldEJsb2NrKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSkNCiAgICAgICAgew0KICAgICAgICAgICAgZm9yZWFj aCAoV2luN0Jsb2NrIGJsb2NrIGluIEJsb2NrcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2suS2V5QXNTdHIgPT0ga2V5ICYm IGJsb2NrLlZhbHVlQXNTdHIgPT0gdmFsdWUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBTQmxvY2sNCiAg ICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGJsb2NrLlR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICBG bGFncyA9IGJsb2NrLkZsYWdzLA0KICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gYmxvY2suS2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgVmFs dWUgPSBibG9jay5WYWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBibG9jay5EYXRhDQogICAgICAgICAgICAgICAgICAgIH07DQogICAg ICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBQU0Js b2NrIEdldEJsb2NrKHN0cmluZyBrZXksIHVpbnQgdmFsdWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFdpbjdCbG9jayBibG9jayBpbiBC bG9ja3MpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLktleUFzU3RyID09IGtleSAmJiBibG9jay5WYWx1ZUFzSW50ID09IHZh bHVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQU0Jsb2NrDQogICAgICAgICAgICAgICAgICAgIHsNCiAg ICAgICAgICAgICAgICAgICAgICAgIFR5cGUgPSBibG9jay5UeXBlLA0KICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgPSBibG9jay5GbGFncywNCiAg ICAgICAgICAgICAgICAgICAgICAgIEtleSA9IGJsb2NrLktleSwNCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gYmxvY2suVmFsdWUsDQogICAg ICAgICAgICAgICAgICAgICAgICBEYXRhID0gYmxvY2suRGF0YQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAg ICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBTZXRCbG9jayhzdHJpbmcga2V5LCBz dHJpbmcgdmFsdWUsIGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJsb2Nrcy5Db3VudDsgaSsrKQ0K ICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFdpbjdCbG9jayBibG9jayA9IEJsb2Nrc1tpXTsNCg0KICAgICAgICAgICAgICAgIGlmIChibG9jay5L ZXlBc1N0ciA9PSBrZXkgJiYgYmxvY2suVmFsdWVBc1N0ciA9PSB2YWx1ZSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGJsb2Nr LkRhdGEgPSBkYXRhOw0KICAgICAgICAgICAgICAgICAgICBCbG9ja3NbaV0gPSBibG9jazsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAg ICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIHZvaWQgU2V0QmxvY2soc3RyaW5nIGtleSwgdWludCB2YWx1 ZSwgYnl0ZVtdIGRhdGEpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQmxvY2tzLkNvdW50OyBpKyspDQogICAgICAgICAg ICB7DQogICAgICAgICAgICAgICAgV2luN0Jsb2NrIGJsb2NrID0gQmxvY2tzW2ldOw0KDQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLktleUFzU3RyID09 IGtleSAmJiBibG9jay5WYWx1ZUFzSW50ID09IHZhbHVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2suRGF0YSA9IGRh dGE7DQogICAgICAgICAgICAgICAgICAgIEJsb2Nrc1tpXSA9IGJsb2NrOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9 DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBTZXRCbG9jayhzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWUsIHN0cmlu ZyBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBTZXRCbG9jayhrZXksIHZhbHVlLCBVdGlscy5FbmNvZGVTdHJpbmcoZGF0YSkpOw0KICAgICAgICB9 DQoNCiAgICAgICAgcHVibGljIHZvaWQgU2V0QmxvY2soc3RyaW5nIGtleSwgc3RyaW5nIHZhbHVlLCB1aW50IGRhdGEpDQogICAgICAgIHsNCiAgICAgICAg ICAgIFNldEJsb2NrKGtleSwgdmFsdWUsIEJpdENvbnZlcnRlci5HZXRCeXRlcyhkYXRhKSk7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBT ZXRCbG9jayhzdHJpbmcga2V5LCB1aW50IHZhbHVlLCBzdHJpbmcgZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgU2V0QmxvY2soa2V5LCB2YWx1ZSwg VXRpbHMuRW5jb2RlU3RyaW5nKGRhdGEpKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIFNldEJsb2NrKHN0cmluZyBrZXksIHVpbnQgdmFs dWUsIHVpbnQgZGF0YSkNCiAgICAgICAgew0KICAgICAgICAgICAgU2V0QmxvY2soa2V5LCB2YWx1ZSwgQml0Q29udmVydGVyLkdldEJ5dGVzKGRhdGEpKTsN CiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZUJsb2NrKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSkNCiAgICAgICAgew0KICAgICAg ICAgICAgZm9yZWFjaCAoV2luN0Jsb2NrIGJsb2NrIGluIEJsb2NrcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2suS2V5QXNT dHIgPT0ga2V5ICYmIGJsb2NrLlZhbHVlQXNTdHIgPT0gdmFsdWUpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBCbG9ja3MuUmVt b3ZlKGJsb2NrKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQog ICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZUJsb2NrKHN0cmluZyBrZXksIHVpbnQgdmFsdWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKFdp bjdCbG9jayBibG9jayBpbiBCbG9ja3MpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLktleUFzU3RyID09IGtleSAmJiBibG9j ay5WYWx1ZUFzSW50ID09IHZhbHVlKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgQmxvY2tzLlJlbW92ZShibG9jayk7DQogICAg ICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgUGh5 c2ljYWxTdG9yZVdpbjcoc3RyaW5nIHByaW1hcnlQYXRoLCBib29sIHByb2R1Y3Rpb24pDQogICAgICAgIHsNCiAgICAgICAgICAgIFRTUHJpbWFyeSA9IEZp bGUuT3BlbihwcmltYXJ5UGF0aCwgRmlsZU1vZGUuT3Blbk9yQ3JlYXRlLCBGaWxlQWNjZXNzLlJlYWRXcml0ZSwgRmlsZVNoYXJlLk5vbmUpOw0KICAgICAg ICAgICAgVFNTZWNvbmRhcnkgPSBGaWxlLk9wZW4ocHJpbWFyeVBhdGguUmVwbGFjZSgiLTAuIiwgIi0xLiIpLCBGaWxlTW9kZS5PcGVuT3JDcmVhdGUsIEZp bGVBY2Nlc3MuUmVhZFdyaXRlLCBGaWxlU2hhcmUuTm9uZSk7DQogICAgICAgICAgICBQcm9kdWN0aW9uID0gcHJvZHVjdGlvbjsNCg0KICAgICAgICAgICAg RGVzZXJpYWxpemUoUGh5c1N0b3JlQ3J5cHRvLkRlY3J5cHRQaHlzaWNhbFN0b3JlKFRTUHJpbWFyeS5SZWFkQWxsQnl0ZXMoKSwgcHJvZHVjdGlvbiwgUFNW ZXJzaW9uLldpbjcpKTsNCiAgICAgICAgICAgIFRTUHJpbWFyeS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVi bGljIHZvaWQgRGlzcG9zZSgpDQogICAgICAgIHsNCiAgICAgICAgICAgIGlmIChUU1ByaW1hcnkuQ2FuV3JpdGUgJiYgVFNTZWNvbmRhcnkuQ2FuV3JpdGUp DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBQaHlzU3RvcmVDcnlwdG8uRW5jcnlwdFBoeXNpY2FsU3RvcmUoU2VyaWFs aXplKCksIFByb2R1Y3Rpb24sIFBTVmVyc2lvbi5XaW43KTsNCg0KICAgICAgICAgICAgICAgIFRTUHJpbWFyeS5TZXRMZW5ndGgoZGF0YS5Mb25nTGVuZ3Ro KTsNCiAgICAgICAgICAgICAgICBUU1NlY29uZGFyeS5TZXRMZW5ndGgoZGF0YS5Mb25nTGVuZ3RoKTsNCg0KICAgICAgICAgICAgICAgIFRTUHJpbWFyeS5T ZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOw0KICAgICAgICAgICAgICAgIFRTU2Vjb25kYXJ5LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQoNCiAgICAg ICAgICAgICAgICBUU1ByaW1hcnkuV3JpdGVBbGxCeXRlcyhkYXRhKTsNCiAgICAgICAgICAgICAgICBUU1NlY29uZGFyeS5Xcml0ZUFsbEJ5dGVzKGRhdGEp Ow0KDQogICAgICAgICAgICAgICAgVFNQcmltYXJ5LkNsb3NlKCk7DQogICAgICAgICAgICAgICAgVFNTZWNvbmRhcnkuQ2xvc2UoKTsNCiAgICAgICAgICAg IH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyBieXRlW10gUmVhZFJhdygpDQogICAgICAgIHsNCiAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gUGh5 c1N0b3JlQ3J5cHRvLkRlY3J5cHRQaHlzaWNhbFN0b3JlKFRTUHJpbWFyeS5SZWFkQWxsQnl0ZXMoKSwgUHJvZHVjdGlvbiwgUFNWZXJzaW9uLldpbjcpOw0K ICAgICAgICAgICAgVFNQcmltYXJ5LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7DQogICAgICAgICAgICByZXR1cm4gZGF0YTsNCiAgICAgICAgfQ0KDQog ICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUmF3KGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAgICAgICAgICBieXRlW10gZW5jckRhdGEgPSBQaHlzU3Rv cmVDcnlwdG8uRW5jcnlwdFBoeXNpY2FsU3RvcmUoZGF0YSwgUHJvZHVjdGlvbiwgUFNWZXJzaW9uLldpbjcpOw0KDQogICAgICAgICAgICBUU1ByaW1hcnku U2V0TGVuZ3RoKGVuY3JEYXRhLkxvbmdMZW5ndGgpOw0KICAgICAgICAgICAgVFNTZWNvbmRhcnkuU2V0TGVuZ3RoKGVuY3JEYXRhLkxvbmdMZW5ndGgpOw0K DQogICAgICAgICAgICBUU1ByaW1hcnkuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsNCiAgICAgICAgICAgIFRTU2Vjb25kYXJ5LlNlZWsoMCwgU2Vla09y aWdpbi5CZWdpbik7DQoNCiAgICAgICAgICAgIFRTUHJpbWFyeS5Xcml0ZUFsbEJ5dGVzKGVuY3JEYXRhKTsNCiAgICAgICAgICAgIFRTU2Vjb25kYXJ5Lldy aXRlQWxsQnl0ZXMoZW5jckRhdGEpOw0KDQogICAgICAgICAgICBUU1ByaW1hcnkuQ2xvc2UoKTsNCiAgICAgICAgICAgIFRTU2Vjb25kYXJ5LkNsb3NlKCk7 DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8UFNCbG9jaz4gRmluZEJsb2NrcyhzdHJpbmcgdmFsdWVTZWFyY2gpDQogICAgICAg IHsNCiAgICAgICAgICAgIExpc3Q8UFNCbG9jaz4gcmVzdWx0cyA9IG5ldyBMaXN0PFBTQmxvY2s+KCk7DQoNCiAgICAgICAgICAgIGZvcmVhY2ggKFdpbjdC bG9jayBibG9jayBpbiBCbG9ja3MpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGJsb2NrLlZhbHVlQXNTdHIuQ29udGFpbnModmFsdWVT ZWFyY2gpKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5BZGQobmV3IFBTQmxvY2sNCiAgICAgICAgICAgICAgICAg ICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGJsb2NrLlR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICBGbGFncyA9IGJsb2NrLkZs YWdzLA0KICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gYmxvY2suS2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBibG9jay5WYWx1 ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBibG9jay5EYXRhDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0N CiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8UFNC bG9jaz4gRmluZEJsb2Nrcyh1aW50IHZhbHVlU2VhcmNoKQ0KICAgICAgICB7DQogICAgICAgICAgICBMaXN0PFBTQmxvY2s+IHJlc3VsdHMgPSBuZXcgTGlz dDxQU0Jsb2NrPigpOw0KDQogICAgICAgICAgICBmb3JlYWNoIChXaW43QmxvY2sgYmxvY2sgaW4gQmxvY2tzKQ0KICAgICAgICAgICAgew0KICAgICAgICAg ICAgICAgIGlmIChibG9jay5WYWx1ZUFzSW50ID09IHZhbHVlU2VhcmNoKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0 cy5BZGQobmV3IFBTQmxvY2sNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGJsb2NrLlR5cGUsDQogICAg ICAgICAgICAgICAgICAgICAgICBGbGFncyA9IGJsb2NrLkZsYWdzLA0KICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gYmxvY2suS2V5LA0KICAgICAg ICAgICAgICAgICAgICAgICAgVmFsdWUgPSBibG9jay5WYWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPSBibG9jay5EYXRhDQogICAgICAg ICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7DQogICAgICAg IH0NCiAgICB9DQp9DQoNCg0KLy8gTGliVFNmb3JnZS9QaHlzaWNhbFN0b3JlL1ZhcmlhYmxlQmFnLmNzDQpuYW1lc3BhY2UgTGliVFNmb3JnZS5QaHlzaWNh bFN0b3JlDQp7DQogICAgdXNpbmcgU3lzdGVtOw0KICAgIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KICAgIHVzaW5nIFN5c3RlbS5JTzsN Cg0KICAgIHB1YmxpYyBlbnVtIENSQ0Jsb2NrVHlwZSA6IHVpbnQNCiAgICB7DQogICAgICAgIFVJTlQgPSAxIDw8IDAsDQogICAgICAgIFNUUklORyA9IDEg PDwgMSwNCiAgICAgICAgQklOQVJZID0gMSA8PCAyDQogICAgfQ0KDQogICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENSQ0Jsb2NrDQogICAgew0KICAgICAg ICBwdWJsaWMgQ1JDQmxvY2tUeXBlIERhdGFUeXBlOw0KICAgICAgICBwdWJsaWMgYnl0ZVtdIEtleTsNCiAgICAgICAgcHVibGljIHN0cmluZyBLZXlBc1N0 cg0KICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuRGVjb2RlU3RyaW5nKEtl eSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBLZXkgPSBVdGlscy5FbmNvZGVTdHJp bmcodmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHB1YmxpYyBieXRlW10gVmFsdWU7DQogICAgICAgIHB1YmxpYyBzdHJpbmcg VmFsdWVBc1N0cg0KICAgICAgICB7DQogICAgICAgICAgICBnZXQNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMuRGVjb2Rl U3RyaW5nKFZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIFZhbHVlID0gVXRp bHMuRW5jb2RlU3RyaW5nKHZhbHVlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBwdWJsaWMgdWludCBWYWx1ZUFzSW50DQogICAgICAg IHsNCiAgICAgICAgICAgIGdldA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9VSW50MzIoVmFsdWUsIDAp Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2V0DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgVmFsdWUgPSBCaXRDb252ZXJ0ZXIuR2V0 Qnl0ZXModmFsdWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgRW5jb2RlKEJpbmFyeVdyaXRl ciB3cml0ZXIpOw0KICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBEZWNvZGUoQmluYXJ5UmVhZGVyIHJlYWRlcik7DQogICAgICAgIHB1YmxpYyBhYnN0 cmFjdCB1aW50IENSQygpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBjbGFzcyBDUkNCbG9ja1Zpc3RhIDogQ1JDQmxvY2sNCiAgICB7DQogICAgICAgIHB1Ymxp YyBvdmVycmlkZSB2b2lkIEVuY29kZShCaW5hcnlXcml0ZXIgd3JpdGVyKQ0KICAgICAgICB7DQogICAgICAgICAgICB1aW50IGNyYyA9IENSQygpOw0KICAg ICAgICAgICAgd3JpdGVyLldyaXRlKCh1aW50KURhdGFUeXBlKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgwKTsNCiAgICAgICAgICAgIHdyaXRlci5X cml0ZShLZXkuTGVuZ3RoKTsNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShWYWx1ZS5MZW5ndGgpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKGNyYyk7 DQoNCiAgICAgICAgICAgIHdyaXRlci5Xcml0ZShLZXkpOw0KDQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoVmFsdWUpOw0KICAgICAgICB9DQoNCiAgICAg ICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRGVjb2RlKEJpbmFyeVJlYWRlciByZWFkZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVpbnQgdHlwZSA9IHJl YWRlci5SZWFkVUludDMyKCk7DQogICAgICAgICAgICByZWFkZXIuUmVhZFVJbnQzMigpOw0KICAgICAgICAgICAgdWludCBsZW5OYW1lID0gcmVhZGVyLlJl YWRVSW50MzIoKTsNCiAgICAgICAgICAgIHVpbnQgbGVuVmFsID0gcmVhZGVyLlJlYWRVSW50MzIoKTsNCiAgICAgICAgICAgIHVpbnQgY3JjID0gcmVhZGVy LlJlYWRVSW50MzIoKTsNCg0KICAgICAgICAgICAgYnl0ZVtdIGtleSA9IHJlYWRlci5SZWFkQnl0ZXMoKGludClsZW5OYW1lKTsNCiAgICAgICAgICAgIGJ5 dGVbXSB2YWx1ZSA9IHJlYWRlci5SZWFkQnl0ZXMoKGludClsZW5WYWwpOw0KDQogICAgICAgICAgICBEYXRhVHlwZSA9IChDUkNCbG9ja1R5cGUpdHlwZTsN CiAgICAgICAgICAgIEtleSA9IGtleTsNCiAgICAgICAgICAgIFZhbHVlID0gdmFsdWU7DQoNCiAgICAgICAgICAgIGlmIChDUkMoKSAhPSBjcmMpDQogICAg ICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJJbnZhbGlkIENSQyBpbiB2YXJpYWJsZSBiYWcuIik7 DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdWludCBDUkMoKQ0KICAgICAgICB7DQogICAgICAgICAgICBy ZXR1cm4gVXRpbHMuQ1JDMzIoVmFsdWUpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIGNsYXNzIENSQ0Jsb2NrTW9kZXJuIDogQ1JDQmxvY2sN CiAgICB7DQogICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuY29kZShCaW5hcnlXcml0ZXIgd3JpdGVyKQ0KICAgICAgICB7DQogICAgICAgICAgICB1 aW50IGNyYyA9IENSQygpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKGNyYyk7DQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoKHVpbnQpRGF0YVR5cGUp Ow0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKEtleS5MZW5ndGgpOw0KICAgICAgICAgICAgd3JpdGVyLldyaXRlKFZhbHVlLkxlbmd0aCk7DQoNCiAgICAg ICAgICAgIHdyaXRlci5Xcml0ZShLZXkpOw0KICAgICAgICAgICAgd3JpdGVyLkFsaWduKDgpOw0KDQogICAgICAgICAgICB3cml0ZXIuV3JpdGUoVmFsdWUp Ow0KICAgICAgICAgICAgd3JpdGVyLkFsaWduKDgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRGVjb2RlKEJpbmFyeVJl YWRlciByZWFkZXIpDQogICAgICAgIHsNCiAgICAgICAgICAgIHVpbnQgY3JjID0gcmVhZGVyLlJlYWRVSW50MzIoKTsNCiAgICAgICAgICAgIHVpbnQgdHlw ZSA9IHJlYWRlci5SZWFkVUludDMyKCk7DQogICAgICAgICAgICB1aW50IGxlbk5hbWUgPSByZWFkZXIuUmVhZFVJbnQzMigpOw0KICAgICAgICAgICAgdWlu dCBsZW5WYWwgPSByZWFkZXIuUmVhZFVJbnQzMigpOw0KDQogICAgICAgICAgICBieXRlW10ga2V5ID0gcmVhZGVyLlJlYWRCeXRlcygoaW50KWxlbk5hbWUp Ow0KICAgICAgICAgICAgcmVhZGVyLkFsaWduKDgpOw0KDQogICAgICAgICAgICBieXRlW10gdmFsdWUgPSByZWFkZXIuUmVhZEJ5dGVzKChpbnQpbGVuVmFs KTsNCiAgICAgICAgICAgIHJlYWRlci5BbGlnbig4KTsNCg0KICAgICAgICAgICAgRGF0YVR5cGUgPSAoQ1JDQmxvY2tUeXBlKXR5cGU7DQogICAgICAgICAg ICBLZXkgPSBrZXk7DQogICAgICAgICAgICBWYWx1ZSA9IHZhbHVlOw0KDQogICAgICAgICAgICBpZiAoQ1JDKCkgIT0gY3JjKQ0KICAgICAgICAgICAgew0K ICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRGF0YUV4Y2VwdGlvbigiSW52YWxpZCBDUkMgaW4gdmFyaWFibGUgYmFnLiIpOw0KICAgICAgICAg ICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIG92ZXJyaWRlIHVpbnQgQ1JDKCkNCiAgICAgICAgew0KICAgICAgICAgICAgQmluYXJ5V3JpdGVy IHd0ZW1wID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOw0KICAgICAgICAgICAgd3RlbXAuV3JpdGUoMCk7DQogICAgICAgICAgICB3 dGVtcC5Xcml0ZSgodWludClEYXRhVHlwZSk7DQogICAgICAgICAgICB3dGVtcC5Xcml0ZShLZXkuTGVuZ3RoKTsNCiAgICAgICAgICAgIHd0ZW1wLldyaXRl KFZhbHVlLkxlbmd0aCk7DQogICAgICAgICAgICB3dGVtcC5Xcml0ZShLZXkpOw0KICAgICAgICAgICAgd3RlbXAuV3JpdGUoVmFsdWUpOw0KICAgICAgICAg ICAgcmV0dXJuIFV0aWxzLkNSQzMyKHd0ZW1wLkdldEJ5dGVzKCkpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIGNsYXNzIFZhcmlhYmxlQmFn DQogICAgew0KICAgICAgICBwdWJsaWMgTGlzdDxDUkNCbG9jaz4gQmxvY2tzID0gbmV3IExpc3Q8Q1JDQmxvY2s+KCk7DQogICAgICAgIHByaXZhdGUgcmVh ZG9ubHkgUFNWZXJzaW9uIFZlcnNpb247DQoNCiAgICAgICAgcHJpdmF0ZSB2b2lkIERlc2VyaWFsaXplKGJ5dGVbXSBkYXRhKQ0KICAgICAgICB7DQogICAg ICAgICAgICBpbnQgbGVuID0gZGF0YS5MZW5ndGg7DQoNCiAgICAgICAgICAgIEJpbmFyeVJlYWRlciByZWFkZXIgPSBuZXcgQmluYXJ5UmVhZGVyKG5ldyBN ZW1vcnlTdHJlYW0oZGF0YSkpOw0KDQogICAgICAgICAgICB3aGlsZSAocmVhZGVyLkJhc2VTdHJlYW0uUG9zaXRpb24gPCBsZW4gLSAweDEwKQ0KICAgICAg ICAgICAgew0KICAgICAgICAgICAgICAgIENSQ0Jsb2NrIGJsb2NrOw0KDQogICAgICAgICAgICAgICAgaWYgKFZlcnNpb24gPT0gUFNWZXJzaW9uLlZpc3Rh KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgYmxvY2sgPSBuZXcgQ1JDQmxvY2tWaXN0YSgpOw0KICAgICAgICAgICAgICAgIH0N CiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBDUkNCbG9ja01vZGVybigp Ow0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGJsb2NrLkRlY29kZShyZWFkZXIpOw0KICAgICAgICAgICAgICAgIEJsb2Nrcy5BZGQo YmxvY2spOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIGJ5dGVbXSBTZXJpYWxpemUoKQ0KICAgICAgICB7DQogICAgICAg ICAgICBCaW5hcnlXcml0ZXIgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcihuZXcgTWVtb3J5U3RyZWFtKCkpOw0KDQogICAgICAgICAgICBmb3JlYWNoIChD UkNCbG9jayBibG9jayBpbiBCbG9ja3MpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKFZlcnNpb24gPT0gUFNWZXJzaW9uLlZpc3RhKQ0K ICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgKChDUkNCbG9ja1Zpc3RhKWJsb2NrKS5FbmNvZGUod3JpdGVyKTsNCiAgICAgICAgICAg ICAgICB9IGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICgoQ1JDQmxvY2tNb2Rlcm4pYmxvY2spLkVuY29kZSh3cml0ZXIp Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0dXJuIHdyaXRlci5HZXRCeXRlcygpOw0KICAgICAgICB9DQoN CiAgICAgICAgcHVibGljIENSQ0Jsb2NrIEdldEJsb2NrKHN0cmluZyBrZXkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKENSQ0Jsb2NrIGJs b2NrIGluIEJsb2NrcykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2suS2V5QXNTdHIgPT0ga2V5KQ0KICAgICAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgcmV0 dXJuIG51bGw7DQogICAgICAgIH0NCg0KICAgICAgICBwdWJsaWMgdm9pZCBTZXRCbG9jayhzdHJpbmcga2V5LCBieXRlW10gdmFsdWUpDQogICAgICAgIHsN CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQmxvY2tzLkNvdW50OyBpKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgQ1JDQmxv Y2sgYmxvY2sgPSBCbG9ja3NbaV07DQoNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2suS2V5QXNTdHIgPT0ga2V5KQ0KICAgICAgICAgICAgICAgIHsNCiAg ICAgICAgICAgICAgICAgICAgYmxvY2suVmFsdWUgPSB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgQmxvY2tzW2ldID0gYmxvY2s7DQogICAgICAgICAg ICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIHB1YmxpYyB2b2lkIERlbGV0 ZUJsb2NrKHN0cmluZyBrZXkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKENSQ0Jsb2NrIGJsb2NrIGluIEJsb2NrcykNCiAgICAgICAgICAg IHsNCiAgICAgICAgICAgICAgICBpZiAoYmxvY2suS2V5QXNTdHIgPT0ga2V5KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgQmxv Y2tzLlJlbW92ZShibG9jayk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAg IH0NCg0KICAgICAgICBwdWJsaWMgVmFyaWFibGVCYWcoYnl0ZVtdIGRhdGEsIFBTVmVyc2lvbiB2ZXJzaW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBW ZXJzaW9uID0gdmVyc2lvbjsNCiAgICAgICAgICAgIERlc2VyaWFsaXplKGRhdGEpOw0KICAgICAgICB9DQoNCiAgICAgICAgcHVibGljIFZhcmlhYmxlQmFn KFBTVmVyc2lvbiB2ZXJzaW9uKQ0KICAgICAgICB7DQogICAgICAgICAgICBWZXJzaW9uID0gdmVyc2lvbjsNCiAgICAgICAgfQ0KICAgIH0NCn0NCidADQok RXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnDQokcHNNYWpvclZlciA9IChHZXQtSG9zdCkuVmVyc2lvbi5NYWpvcg0KJGJ1aWxkID0gW1N5c3RlbS5F bnZpcm9ubWVudF06Ok9TVmVyc2lvbi5WZXJzaW9uLkJ1aWxkDQoNCiRjcCA9IFtDb2RlRG9tLkNvbXBpbGVyLkNvbXBpbGVyUGFyYW1ldGVyc10gW3N0cmlu Z1tdXUAoIlN5c3RlbS5kbGwiLCAiU3lzdGVtLkNvcmUuZGxsIiwgIlN5c3RlbS5TZXJ2aWNlUHJvY2Vzcy5kbGwiLCAiU3lzdGVtLlhtbC5kbGwiLCAiU3lz dGVtLlhtbC5MaW5xLmRsbCIpDQppZiAoJHBzTWFqb3JWZXIgLWxlIDIpIHsgJGNwLkNvbXBpbGVyT3B0aW9ucyA9ICIvZGVmaW5lOlBPV0VSU0hFTEwyIC91 bnNhZmUiIH0gZWxzZSB7ICRjcC5Db21waWxlck9wdGlvbnMgPSAiL3Vuc2FmZSIgfQ0KJGxhbmcgPSBpZiAoJHBzTWFqb3JWZXIgLWd0IDIpIHsgIkNTaGFy cCIgfSBlbHNlIHsgIkNTaGFycFZlcnNpb24zIiB9DQoNCiRjdGVtcCA9ICIkZW52OlN5c3RlbVJvb3RcVGVtcFwkKFtHdWlkXTo6TmV3R3VpZCgpLkd1aWQp XCINCmlmICgtTm90IChUZXN0LVBhdGggLVBhdGggJGN0ZW1wKSkgeyBOZXctSXRlbSAtUGF0aCAkY3RlbXAgLUl0ZW1UeXBlIERpcmVjdG9yeSA+ICRudWxs IH0NCiRlbnY6VE1QID0gJGN0ZW1wDQokZW52OlRFTVAgPSAkY3RlbXANCg0KJGNwLkdlbmVyYXRlSW5NZW1vcnkgPSAkdHJ1ZQ0KQWRkLVR5cGUgLUxhbmd1 YWdlICRsYW5nIC1UeXBlRGVmaW5pdGlvbiAkc3JjIC1Db21waWxlclBhcmFtZXRlcnMgJGNwDQoNCnRyeSB7DQogICAgJGNwLlRlbXBGaWxlcy5EaXNwb3Nl KCkNCn0gY2F0Y2ggew0KIyBPbGRlciAuTkVUIEZyYW1ld29yayB2ZXJzaW9ucyBkbyBub3QgaGF2ZSB0aGF0IG1ldGhvZCwgYnV0IHRoZXkgYWxzbyBkb24n dCBjcmVhdGUgdGhlIGZvbGRlciB0aGF0IGl0IHJlbW92ZXMuDQp9DQpSZW1vdmUtSXRlbSAtUGF0aCAkY3RlbXANCg0KaWYgKCRlbnY6X2RlYnVnIC1lcSAn MCcpIHsNCiAgICBbTGliVFNmb3JnZS5Mb2dnZXJdOjpIaWRlT3V0cHV0ID0gJHRydWUNCn0NClt2b2lkXVtMaWJUU2ZvcmdlLlV0aWxzXTo6V293NjRFbmFi bGVXb3c2NEZzUmVkaXJlY3Rpb24oJGZhbHNlKQ0KJHZlciA9IFtMaWJUU2ZvcmdlLlV0aWxzXTo6RGV0ZWN0VmVyc2lvbigpDQokcHJvZCA9IFtMaWJUU2Zv cmdlLlNQUC5TUFBVdGlsc106OkRldGVjdEN1cnJlbnRLZXkoKQ0KJHRzYWN0aWRzID0gQCgkYXJncykNCg0KZnVuY3Rpb24gR2V0LVdtaUluZm8gew0KICAg IHBhcmFtIChbc3RyaW5nXSR0c2FjdGlkLCBbc3RyaW5nXSRwcm9wZXJ0eSkNCiAgICANCiAgICAkcXVlcnkgPSAiU0VMRUNUIElELCAkcHJvcGVydHkgRlJP TSBTb2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3QgV0hFUkUgSUQ9JyR0c2FjdGlkJyINCiAgICAkcmVjb3JkID0gR2V0LVdtaU9iamVjdCAtUXVlcnkgJHF1ZXJ5 DQogICAgaWYgKCRyZWNvcmQpIHsNCiAgICAgICAgcmV0dXJuICRyZWNvcmQuJHByb3BlcnR5DQogICAgfQ0KfQ0KDQpmdW5jdGlvbiBzbEdldFNrdUluZm8o JFNrdUlkKSB7DQogICAgJHQgPSBbQXBwRG9tYWluXTo6Q3VycmVudERvbWFpbi5EZWZpbmVEeW5hbWljQXNzZW1ibHkoNCwgMSkuRGVmaW5lRHluYW1pY01v ZHVsZSgyLCAkRmFsc2UpLkRlZmluZVR5cGUoMCkNCiAgICAkdC5EZWZpbmVQSW52b2tlTWV0aG9kKCdTTE9wZW4nLCAnc2xjLmRsbCcsIDIyLCAxLCBbSW50 MzJdLCBAKFtJbnRQdHJdLk1ha2VCeVJlZlR5cGUoKSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KICAgICR0LkRlZmluZVBJbnZva2VN ZXRob2QoJ1NMQ2xvc2UnLCAnc2xjLmRsbCcsIDIyLCAxLCBbSW50UHRyXSwgQChbSW50UHRyXSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4 KQ0KICAgICR0LkRlZmluZVBJbnZva2VNZXRob2QoJ1NMR2V0UHJvZHVjdFNrdUluZm9ybWF0aW9uJywgJ3NsYy5kbGwnLCAyMiwgMSwgW0ludDMyXSwgQChb SW50UHRyXSwgW0d1aWRdLk1ha2VCeVJlZlR5cGUoKSwgW1N0cmluZ10sIFtVSW50MzJdLk1ha2VCeVJlZlR5cGUoKSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlw ZSgpLCBbSW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5TZXRJbXBsZW1lbnRhdGlvbkZsYWdzKDEyOCkNCiAgICAkdyA9ICR0LkNyZWF0ZVR5cGUo KQ0KICAgICRoU0xDID0gMA0KICAgIHRyeSB7DQogICAgICAgIFt2b2lkXSR3OjpTTE9wZW4oW3JlZl0kaFNMQykNCiAgICAgICAgJGMgPSAwOyAkYiA9IDAN CiAgICAgICAgJHIgPSAkdzo6U0xHZXRQcm9kdWN0U2t1SW5mb3JtYXRpb24oJGhTTEMsIFtyZWZdW0d1aWRdJFNrdUlkLCAibXNmdDpzbC9FVUwvUEhPTkUv UFVCTElDIiwgW3JlZl0kbnVsbCwgW3JlZl0kYywgW3JlZl0kYikNCiAgICAgICAgcmV0dXJuICgkciAtZXEgMCkNCiAgICB9DQogICAgZmluYWxseSB7DQog ICAgICAgIFt2b2lkXSR3OjpTTENsb3NlKCRoU0xDKQ0KICAgIH0NCn0NCg0KaWYgKC1ub3QgJGVudjpyZXNldHN0dWZmKSB7DQogICAgZm9yZWFjaCAoJHRz YWN0aWQgaW4gJHRzYWN0aWRzKSB7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICAkYWN0aXZhdGVkID0gJG51bGwNCiAgICAgICAgICAgICRwcm9kRGVz ID0gR2V0LVdtaUluZm8gLXRzYWN0aWQgJHRzYWN0aWQgLXByb3BlcnR5ICJEZXNjcmlwdGlvbiINCiAgICAgICAgICAgICRwcm9kTmFtZSA9IEdldC1XbWlJ bmZvIC10c2FjdGlkICR0c2FjdGlkIC1wcm9wZXJ0eSAiTmFtZSINCiAgICAgICAgICAgIGlmICgkcHJvZE5hbWUpIHsNCiAgICAgICAgICAgICAgICAkbmFt ZVBhcnRzID0gJHByb2ROYW1lIC1zcGxpdCAnLCcsIDINCiAgICAgICAgICAgICAgICAkcHJvZE5hbWUgPSBpZiAoJG5hbWVQYXJ0cy5Db3VudCAtZ3QgMSkg eyAoJG5hbWVQYXJ0c1sxXS5UcmltKCkgLXNwbGl0ICdbICxdJylbMF0gfSBlbHNlIHsgJG51bGwgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYg KC1ub3QgJGVudjpfdmlzIC1hbmQgLW5vdCAkZW52Om9sZGtzKSB7DQogICAgICAgICAgICAgICAgW0xpYlRTZm9yZ2UuTW9kaWZpZXJzLkdlblBLZXlJbnN0 YWxsXTo6SW5zdGFsbEdlblBLZXkoJHZlciwgJHByb2QsICR0c2FjdGlkKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCRwcm9kTmFtZSAtbWF0 Y2ggJ09mZmljZScgLWFuZCAkcHJvZERlcyAtbm90bWF0Y2ggJ0tNUycgLWFuZCAtbm90IChzbEdldFNrdUluZm8oJHRzYWN0aWQpKSkgew0KICAgICAgICAg ICAgICAgICRsaWNlbnNlU3RhdHVzID0gR2V0LVdtaUluZm8gLXRzYWN0aWQgJHRzYWN0aWQgLXByb3BlcnR5ICJMaWNlbnNlU3RhdHVzIg0KICAgICAgICAg ICAgICAgIGlmICgkbGljZW5zZVN0YXR1cyAtZXEgMSkgew0KICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0ICJbJHByb2ROYW1lXSBpcyBhbHJlYWR5 IHBlcm1hbmVudGx5IGFjdGl2YXRlZC4iIC1Gb3JlZ3JvdW5kQ29sb3IgV2hpdGUgLUJhY2tncm91bmRDb2xvciBEYXJrR3JlZW4NCiAgICAgICAgICAgICAg ICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoJGVudjp0c21ldGhvZCAtZXEgIlN0YXRp Y0NJRCIpIHsNCiAgICAgICAgICAgICAgICBbTmV0LlNlcnZpY2VQb2ludE1hbmFnZXJdOjpTZWN1cml0eVByb3RvY29sID0gW05ldC5TZWN1cml0eVByb3Rv Y29sVHlwZV06OlRsczEyDQogICAgICAgICAgICAgICAgJGF0dGVtcHRzID0gQCgNCiAgICAgICAgICAgICAgICAgICAgQCgxMDAwNTUsIDEwMDAwNDMsIDEz Mzg2NjIxNzI1NjI0NzgpLA0KICAgICAgICAgICAgICAgICAgICBAKDEzNDUsIDEwMDMwMjAsIDYzMTE2MDgyMzgwODQ0MDUpDQogICAgICAgICAgICAgICAg KQ0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRwYXJhbXMgaW4gJGF0dGVtcHRzKSB7DQogICAgICAgICAgICAgICAgICAgIFtMaWJUU2ZvcmdlLk1vZGlm aWVycy5TZXRJSURQYXJhbXNdOjpTZXRQYXJhbXMoJHZlciwgJHByb2QsICR0c2FjdGlkLCBbTGliVFNmb3JnZS5TUFAuUEtleUFsZ29yaXRobV06OlBLRVky MDA5LCAkcGFyYW1zWzBdLCAkcGFyYW1zWzFdLCAkcGFyYW1zWzJdKQ0KICAgICAgICAgICAgICAgICAgICAkaW5zdElkID0gW0xpYlRTZm9yZ2UuU1BQLlNM QXBpXTo6R2V0SW5zdGFsbGF0aW9uSUQoJHRzYWN0aWQpDQogICAgICAgICAgICAgICAgICAgICRjb25mSWQgPSBbQWN0aXZhdGlvbldzLkFjdGl2YXRpb25I ZWxwZXJdOjpDYWxsV2ViU2VydmljZSgxLCAkaW5zdElkLCAiMzEzMzctNDIwNjktMTIzLTQ1Njc4OS0wNC0xMzM3LTI2MDAuMDAwMC0yNTQyMDAxIikNCiAg ICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFtMaWJUU2ZvcmdlLlNQUC5TTEFwaV06OkRlcG9zaXRDb25maXJtYXRpb25JRCgkdHNhY3RpZCwgJGluc3RJ ZCwgJGNvbmZJZCkNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXN1bHQgLWVxIDApIHsgYnJlYWsgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAg ICAgICAgICBbTGliVFNmb3JnZS5TUFAuU1BQVXRpbHNdOjpSZXN0YXJ0U1BQKCR2ZXIpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlaWYgKCRl bnY6dHNtZXRob2QgLWVxICJLTVM0ayIpIHsNCiAgICAgICAgICAgICAgICBbTGliVFNmb3JnZS5BY3RpdmF0b3JzLktNUzRrXTo6QWN0aXZhdGUoJHZlciwg JHByb2QsICR0c2FjdGlkKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgW0xpYlRTZm9yZ2UuQWN0aXZhdG9y cy5aZXJvQ0lEXTo6QWN0aXZhdGUoJHZlciwgJHByb2QsICR0c2FjdGlkKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCRlbnY6dHNtZXRob2Qg LWVxICJLTVM0ayIpIHsNCiAgICAgICAgICAgICAgICAkR3JhY2VQZXJpb2RTdGF0dXMgPSBHZXQtV21pSW5mbyAtdHNhY3RpZCAkdHNhY3RpZCAtcHJvcGVy dHkgIkdyYWNlUGVyaW9kUmVtYWluaW5nIg0KICAgICAgICAgICAgICAgIGlmICgkR3JhY2VQZXJpb2RTdGF0dXMgLWVxIDI1OTIwMCAtb3IgKFtkYXRldGlt ZV06Ok5vdy5BZGRNaW51dGVzKCRHcmFjZVBlcmlvZFN0YXR1cykpLlllYXIgLWd0IDIwMzgpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgoJGJ1aWxk IC1nZSAyNjEwMCAtYW5kICRHcmFjZVBlcmlvZFN0YXR1cyAtZ2UgMjU5MjAwKSAtb3IgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCRidWlsZCAt bHQgMjYxMDAgLWFuZCAkR3JhY2VQZXJpb2RTdGF0dXMgLWd0IDI1OTIwMCkpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkYWN0aXZhdGVkID0gMQ0K ICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAg ICAgJGxpY2Vuc2VTdGF0dXMgPSBHZXQtV21pSW5mbyAtdHNhY3RpZCAkdHNhY3RpZCAtcHJvcGVydHkgIkxpY2Vuc2VTdGF0dXMiDQogICAgICAgICAgICAg ICAgaWYgKCRsaWNlbnNlU3RhdHVzIC1lcSAxKSB7ICRhY3RpdmF0ZWQgPSAxIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgkYWN0aXZhdGVk KSB7DQogICAgICAgICAgICAgICAgaWYgKCRwcm9kRGVzIC1tYXRjaCAnS01TJyAtYW5kICRwcm9kRGVzIC1ub3RtYXRjaCAnQ0xJRU5UJykgew0KICAgICAg ICAgICAgICAgICAgICBbTGliVFNmb3JnZS5Nb2RpZmllcnMuS01TSG9zdENoYXJnZV06OkNoYXJnZSgkdmVyLCAkcHJvZCwgJHRzYWN0aWQpDQogICAgICAg ICAgICAgICAgICAgIFdyaXRlLUhvc3QgIlskcHJvZE5hbWVdIENTVkxLIGlzIHBlcm1hbmVudGx5IGFjdGl2YXRlZCB3aXRoICRlbnY6dHNtZXRob2QuIiAt Rm9yZWdyb3VuZENvbG9yIFdoaXRlIC1CYWNrZ3JvdW5kQ29sb3IgRGFya0dyZWVuDQogICAgICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIlskcHJvZE5h bWVdIENTVkxLIGlzIGNoYXJnZWQgd2l0aCAyNSBjbGllbnRzIGZvciAzMCBkYXlzLiIgLUZvcmVncm91bmRDb2xvciBXaGl0ZSAtQmFja2dyb3VuZENvbG9y IERhcmtHcmVlbg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRlbnY6dHNtZXRo b2QgLWVxICJLTVM0ayIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYnVpbGQgLWdlIDI2MTAwKSB7DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgV3JpdGUtSG9zdCAiWyRwcm9kTmFtZV0gaXMgYWN0aXZhdGVkIHdpdGggS01TNGsgZm9yIG92ZXIgNCwwMDAgeWVhcnMuIiAtRm9yZWdyb3VuZENv bG9yIFdoaXRlIC1CYWNrZ3JvdW5kQ29sb3IgRGFya0dyZWVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiRnJvbSBidWlsZCAy NjEwMC43MDE5LCBXaW5kb3dzIHdpbGwgYWx3YXlzIGRpc3BsYXkgYSByZW1haW5pbmcgYWN0aXZhdGlvbiBwZXJpb2Qgb2YgMTgwIGRheXMgaW4gU2V0dGlu Z3MuIiAtRm9yZWdyb3VuZENvbG9yIFdoaXRlIC1CYWNrZ3JvdW5kQ29sb3IgRGFya2dyYXkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAg ICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlLUhvc3QgIlskcHJvZE5hbWVdIGlzIGFjdGl2YXRlZCB0 aWxsICQoW0RhdGVUaW1lXTo6Tm93LkFkZE1pbnV0ZXMoJEdyYWNlUGVyaW9kU3RhdHVzKS5Ub1N0cmluZygneXl5eS1NTS1kZCBISDptbTpzcycpKSB3aXRo ICRlbnY6dHNtZXRob2QuIiAtRm9yZWdyb3VuZENvbG9yIFdoaXRlIC1CYWNrZ3JvdW5kQ29sb3IgRGFya0dyZWVuDQogICAgICAgICAgICAgICAgICAgICAg ICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBXcml0ZS1Ib3N0 ICJbJHByb2ROYW1lXSBpcyBwZXJtYW5lbnRseSBhY3RpdmF0ZWQgd2l0aCAkZW52OnRzbWV0aG9kLiIgLUZvcmVncm91bmRDb2xvciBXaGl0ZSAtQmFja2dy b3VuZENvbG9yIERhcmtHcmVlbg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAg ZWxzZSB7DQogICAgICAgICAgICAgICAgV3JpdGUtSG9zdCAiWyRwcm9kTmFtZV0gYWN0aXZhdGlvbiBoYXMgZmFpbGVkLiIgLUZvcmVncm91bmRDb2xvciBX aGl0ZSAtQmFja2dyb3VuZENvbG9yIERhcmtSZWQNCiAgICAgICAgICAgICAgICAkZXJyY29kZSA9IDMNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAg ICAgICBjYXRjaCB7DQogICAgICAgICAgICAkZXJyY29kZSA9IDMNCiAgICAgICAgICAgIFdyaXRlLUhvc3QgIiQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAt Rm9yZWdyb3VuZENvbG9yIFJlZCAtQmFja2dyb3VuZENvbG9yIEJsYWNrDQogICAgICAgICAgICBXcml0ZS1Ib3N0ICJbJHByb2ROYW1lXSBhY3RpdmF0aW9u IGhhcyBmYWlsZWQuIiAtRm9yZWdyb3VuZENvbG9yIFdoaXRlIC1CYWNrZ3JvdW5kQ29sb3IgRGFya1JlZA0KICAgICAgICB9DQogICAgfQ0KfQ0KDQppZiAo JGVudjpyZXNldHN0dWZmKSB7DQogICAgdHJ5IHsNCiAgICAgICAgaWYgKC1ub3QgJGVudjpfdmlzKSB7IFtMaWJUU2ZvcmdlLk1vZGlmaWVycy5UYW1wZXJl ZEZsYWdzRGVsZXRlXTo6RGVsZXRlVGFtcGVyRmxhZ3MoJHZlciwgJHByb2QpIH0NCiAgICAgICAgW0xpYlRTZm9yZ2UuU1BQLlNMQXBpXTo6UmVmcmVzaExp Y2Vuc2VTdGF0dXMoKQ0KICAgICAgICBbTGliVFNmb3JnZS5Nb2RpZmllcnMuUmVhcm1SZXNldF06OlJlc2V0KCR2ZXIsICRwcm9kKQ0KICAgICAgICBbTGli VFNmb3JnZS5Nb2RpZmllcnMuR3JhY2VQZXJpb2RSZXNldF06OlJlc2V0KCR2ZXIsICRwcm9kKQ0KICAgICAgICBpZiAoLW5vdCAkZW52Ol92aXMpIHsgW0xp YlRTZm9yZ2UuTW9kaWZpZXJzLktleUNoYW5nZUxvY2tEZWxldGVdOjpEZWxldGUoJHZlciwgJHByb2QpIH0NCiAgICB9DQogICAgY2F0Y2ggew0KICAgICAg ICAkZXJyY29kZSA9IDMNCiAgICAgICAgV3JpdGUtSG9zdCAiJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiIC1Gb3JlZ3JvdW5kQ29sb3IgUmVkIC1CYWNrZ3Jv dW5kQ29sb3IgQmxhY2sNCiAgICB9DQp9DQoNCkV4aXQgJGVycmNvZGUNCjp0c2ZvcmdlOg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCg0KOjogIEdldCBXaW5kb3dzIEFjdGl2YXRpb24gSUQNCg0KOndpbnRzaWQ6DQokU3lzUGF0aCA9ICIkZW52OlN5c3RlbVJvb3Rc U3lzdGVtMzIiDQppZiAoVGVzdC1QYXRoICIkZW52OlN5c3RlbVJvb3RcU3lzbmF0aXZlXHJlZy5leGUiKSB7DQogICAgJFN5c1BhdGggPSAiJGVudjpTeXN0 ZW1Sb290XFN5c25hdGl2ZSINCn0NCg0KZnVuY3Rpb24gV2luZG93cy1BY3RJRCB7DQogICAgcGFyYW0gKA0KICAgICAgICBbc3RyaW5nXSRlZGl0aW9uLA0K ICAgICAgICBbc3RyaW5nXSRrZXl0eXBlDQogICAgKQ0KICAgIA0KICAgICRmaWxlUGF0dGVybnMgPSBAKA0KICAgICAgICAiJFN5c1BhdGhcc3BwXHRva2Vu c1xza3VzXCRlZGl0aW9uXCRlZGl0aW9uKi54cm0tbXMiLA0KICAgICAgICAiJFN5c1BhdGhcc3BwXHRva2Vuc1xza3VzXFNlY3VyaXR5LVNQUC1Db21wb25l bnQtU0tVLSRlZGl0aW9uXCotJGVkaXRpb24tKi54cm0tbXMiDQogICAgKQ0KICAgIA0KICAgIHN3aXRjaCAoJGtleXR5cGUpIHsNCiAgICAgICAgInplcm8i IHsNCiAgICAgICAgICAgICRsaWNlbnNlVHlwZXMgPSBAKCdPRU1fRE0nLCAnT0VNX0NPQV9TTFAnLCAnT0VNX0NPQV9OU0xQJywgJ01BSycsICdSRVRBSUwn KQ0KICAgICAgICB9DQogICAgICAgICJrcyIgew0KICAgICAgICAgICAgJGxpY2Vuc2VUeXBlcyA9IEAoJ0tNU0NMSUVOVCcpDQogICAgICAgIH0NCiAgICAg ICAgImF2bWEiIHsNCiAgICAgICAgICAgICRsaWNlbnNlVHlwZXMgPSBAKCdWSVJUVUFMX01BQ0hJTkUnKQ0KICAgICAgICB9DQogICAgICAgICJrbXNob3N0 IiB7DQogICAgICAgICAgICAkbGljZW5zZVR5cGVzID0gQCgnS01TXycpDQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgJHNvZnR3YXJlTGljZW5zaW5n UHJvZHVjdHMgPSBHZXQtV21pT2JqZWN0IC1RdWVyeSAiU0VMRUNUIElELCBEZXNjcmlwdGlvbiwgTGljZW5zZUZhbWlseSBGUk9NIFNvZnR3YXJlTGljZW5z aW5nUHJvZHVjdCBXSEVSRSBBcHBsaWNhdGlvbklEPSc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYnIiB8IFdoZXJlLU9iamVjdCB7ICRf LkxpY2Vuc2VGYW1pbHkgLWVxICRlZGl0aW9uIH0NCiAgICANCiAgICAkb3JkZXJlZExpY2Vuc2VzID0gQCgpDQogICAgZm9yZWFjaCAoJHR5cGUgaW4gJGxp Y2Vuc2VUeXBlcykgew0KICAgICAgICAkb3JkZXJlZExpY2Vuc2VzICs9ICRzb2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3RzIHwgV2hlcmUtT2JqZWN0IHsgJF8u RGVzY3JpcHRpb24gLW1hdGNoICR0eXBlIH0gfCBTZWxlY3QtT2JqZWN0IC1FeHBhbmRQcm9wZXJ0eSBJRA0KICAgIH0NCiAgICANCiAgICAkZmlsZUlkcyA9 IEAoKQ0KICAgICRtdWlMb2NrZWRJZHMgPSBAKCkNCiAgICAka21zQ291bnRlZElkQ291bnRzID0gQHt9DQoNCiAgICAkdCA9IFtBcHBEb21haW5dOjpDdXJy ZW50RG9tYWluLkRlZmluZUR5bmFtaWNBc3NlbWJseSg0LCAxKS5EZWZpbmVEeW5hbWljTW9kdWxlKDIsICRGYWxzZSkuRGVmaW5lVHlwZSgwKQ0KDQogICAg JG1ldGhvZHMgPSBAKA0KICAgICAgICBAe25hbWUgPSAnU0xPcGVuJzsgcmV0dXJuVHlwZSA9IFtJbnQzMl07IHBhcmFtZXRlcnMgPSBAKFtJbnRQdHJdLk1h a2VCeVJlZlR5cGUoKSkgfSwNCiAgICAgICAgQHtuYW1lID0gJ1NMQ2xvc2UnOyByZXR1cm5UeXBlID0gW0ludDMyXTsgcGFyYW1ldGVycyA9IEAoW0ludFB0 cl0pIH0sDQogICAgICAgIEB7bmFtZSA9ICdTTEdldFByb2R1Y3RTa3VJbmZvcm1hdGlvbic7IHJldHVyblR5cGUgPSBbSW50MzJdOyBwYXJhbWV0ZXJzID0g QChbSW50UHRyXSwgW0d1aWRdLk1ha2VCeVJlZlR5cGUoKSwgW1N0cmluZ10sIFtVSW50MzJdLk1ha2VCeVJlZlR5cGUoKSwgW1VJbnQzMl0uTWFrZUJ5UmVm VHlwZSgpLCBbSW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpIH0sDQogICAgICAgIEB7bmFtZSA9ICdTTEdldExpY2Vuc2UnOyByZXR1cm5UeXBlID0gW0ludDMy XTsgcGFyYW1ldGVycyA9IEAoW0ludFB0cl0sIFtHdWlkXS5NYWtlQnlSZWZUeXBlKCksIFtVSW50MzJdLk1ha2VCeVJlZlR5cGUoKSwgW0ludFB0cl0uTWFr ZUJ5UmVmVHlwZSgpKSB9DQogICAgKQ0KICAgIA0KICAgIGZvcmVhY2ggKCRtZXRob2QgaW4gJG1ldGhvZHMpIHsNCiAgICAgICAgJHQuRGVmaW5lUEludm9r ZU1ldGhvZCgkbWV0aG9kLm5hbWUsICdzbGMuZGxsJywgMjIsIDEsICRtZXRob2QucmV0dXJuVHlwZSwgJG1ldGhvZC5wYXJhbWV0ZXJzLCAxLCAzKS5TZXRJ bXBsZW1lbnRhdGlvbkZsYWdzKDEyOCkNCiAgICB9DQogICAgDQogICAgJHcgPSAkdC5DcmVhdGVUeXBlKCkNCiAgICAkbSA9IFtSdW50aW1lLkludGVyb3BT ZXJ2aWNlcy5NYXJzaGFsXQ0KDQogICAgZnVuY3Rpb24gR2V0TGljZW5zZUluZm8oJFNrdUlkLCAkY2hlY2tUeXBlKSB7DQogICAgICAgICRyZXN1bHQgPSAk ZmFsc2UNCiAgICAgICAgJGMgPSAwOyAkYiA9IDANCiAgICAgICAgDQogICAgICAgIFt2b2lkXSR3OjpTTEdldFByb2R1Y3RTa3VJbmZvcm1hdGlvbigkaFNM QywgW3JlZl1bR3VpZF0kU2t1SWQsICJmaWxlSWQiLCBbcmVmXSRudWxsLCBbcmVmXSRjLCBbcmVmXSRiKQ0KICAgICAgICAkRmlsZUlkID0gJG06OlB0clRv U3RyaW5nVW5pKCRiKQ0KICAgICAgICANCiAgICAgICAgJGMgPSAwOyAkYiA9IDANCiAgICAgICAgW3ZvaWRdJHc6OlNMR2V0TGljZW5zZSgkaFNMQywgW3Jl Zl1bR3VpZF0kRmlsZUlkLCBbcmVmXSRjLCBbcmVmXSRiKQ0KICAgICAgICAkYmxvYiA9IE5ldy1PYmplY3QgYnl0ZVtdICRjOyAkbTo6Q29weSgkYiwgJGJs b2IsIDAsICRjKQ0KICAgICAgICAkY29udCA9IFtUZXh0LkVuY29kaW5nXTo6VVRGOC5HZXRTdHJpbmcoJGJsb2IpDQogICAgICAgICR4bWwgPSBbeG1sXSRj b250LlN1YlN0cmluZygkY29udC5JbmRleE9mKCc8cicpKQ0KICAgICAgICANCiAgICAgICAgaWYgKCRjaGVja1R5cGUgLWVxICdNVUknKSB7DQogICAgICAg ICAgICAkeG1sLmxpY2Vuc2VHcm91cC5saWNlbnNlWzBdLmdyYW50IHwgZm9yZWFjaCB7DQogICAgICAgICAgICAgICAgJF8uYWxsQ29uZGl0aW9ucy5hbGxD b25kaXRpb25zLnByb2R1Y3RQb2xpY2llcy5wb2xpY3lTdHIgfCB3aGVyZSB7ICRfLm5hbWUgLWVxICdLZXJuZWwtTVVJLUxhbmd1YWdlLUFsbG93ZWQnIH0g fCBmb3JlYWNoIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCRfLklubmVyVGV4dCAtbmUgJ0VNUFRZJykgeyAkcmVzdWx0ID0gJHRydWUgfQ0KICAgICAg ICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlaWYgKCRjaGVja1R5cGUgLWVxICdLTVMnKSB7DQogICAgICAgICAg ICAkeG1sLmxpY2Vuc2VHcm91cC5saWNlbnNlWzBdLmdyYW50IHwgZm9yZWFjaCB7DQogICAgICAgICAgICAgICAgJF8uYWxsQ29uZGl0aW9ucy5hbGxDb25k aXRpb25zLnByb2R1Y3RQb2xpY2llcy5wb2xpY3lTdHIgfCB3aGVyZSB7ICRfLm5hbWUgLWVxICdTZWN1cml0eS1TUFAtS21zQ291bnRlZElkTGlzdCcgfSB8 IGZvcmVhY2ggew0KICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gKCRfLklubmVyVGV4dC5SZXBsYWNlKCcgJywgJycpLlJlcGxhY2UoImBuIiwgJycp IC1zcGxpdCAnLCcpLkNvdW50DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICByZXR1cm4g JHJlc3VsdA0KICAgIH0NCg0KICAgICRoU0xDID0gMDsgW3ZvaWRdJHc6OlNMT3BlbihbcmVmXSRoU0xDKQ0KDQogICAgZm9yZWFjaCAoJGlkIGluICRvcmRl cmVkTGljZW5zZXMpIHsNCiAgICAgICAgaWYgKCRrZXl0eXBlIC1lcSAna21zaG9zdCcpIHsNCiAgICAgICAgICAgICRrbXNDb3VudCA9IEdldExpY2Vuc2VJ bmZvICRpZCAnS01TJw0KICAgICAgICAgICAgaWYgKCRrbXNDb3VudCAtZ3QgMCkgew0KICAgICAgICAgICAgICAgICRrbXNDb3VudGVkSWRDb3VudHNbJGlk XSA9ICRrbXNDb3VudA0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICgkZWRpdGlvbiAtbm90Y29udGFpbnMgIkNvdW50cnlTcGVjaWZp YyIgLWFuZCAoR2V0TGljZW5zZUluZm8gJGlkICdNVUknKSkgew0KICAgICAgICAgICAgJG11aUxvY2tlZElkcyArPSAkaWQNCiAgICAgICAgfQ0KICAgIH0N CiAgICANCiAgICBmb3JlYWNoICgkZmlsZVBhdHRlcm4gaW4gJGZpbGVQYXR0ZXJucykgew0KICAgICAgICAkZmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRo ICRmaWxlUGF0dGVybiAtRmlsdGVyICcqLnhybS1tcycgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUNCiAgICAgICAgZm9yZWFjaCAoJGZpbGUgaW4g JGZpbGVzKSB7DQogICAgICAgICAgICBpZiAoJG51bGwgLW5lICRmaWxlLkZ1bGxOYW1lKSB7DQogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBHZXQtQ29u dGVudCAtUGF0aCAkZmlsZS5GdWxsTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZSB8IE91dC1TdHJpbmcNCiAgICAgICAgICAgICAgICBmb3Jl YWNoICgkaWQgaW4gJG9yZGVyZWRMaWNlbnNlcykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbnRlbnQgLW1hdGNoICJuYW1lPWAicHJvZHVjdFNr dUlkYCI+XHskaWRcfSIgLWFuZCAtbm90ICgkZmlsZS5OYW1lIC1tYXRjaCAnQmV0YXxUZXN0JykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICRmaWxl SWRzICs9ICRpZA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KICAg IA0KICAgIGlmICgka21zQ291bnRlZElkQ291bnRzLkNvdW50IC1ndCAwKSB7DQogICAgICAgICRpZFdpdGhNb3N0SWRzID0gJGttc0NvdW50ZWRJZENvdW50 cy5HZXRFbnVtZXJhdG9yKCkgfCBTb3J0LU9iamVjdCBWYWx1ZSAtRGVzY2VuZGluZw0KICAgICAgICAkZmlsZUlkcyA9ICRpZFdpdGhNb3N0SWRzIHwgU2Vs ZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgS2V5DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBpZiAoJGZpbGVJZHMuQ291bnQgLWVxIDApIHsNCiAg ICAgICAgICAgICRmaWxlSWRzID0gJG9yZGVyZWRMaWNlbnNlcw0KICAgICAgICB9DQogICAgDQogICAgICAgICRmaWxlSWRzID0gJG9yZGVyZWRMaWNlbnNl cyB8IFdoZXJlLU9iamVjdCB7ICRmaWxlSWRzIC1jb250YWlucyAkXyAtYW5kICRtdWlMb2NrZWRJZHMgLW5vdGNvbnRhaW5zICRfIH0gfCBTZWxlY3QtT2Jq ZWN0IC1VbmlxdWUNCiAgICB9DQogICAgDQogICAgW3ZvaWRdJHc6OlNMQ2xvc2UoJGhTTEMpDQogICAgDQogICAgJHBrZXljb25maWcgPSAiJFN5c1BhdGhc c3BwXHRva2Vuc1xwa2V5Y29uZmlnXHBrZXljb25maWcueHJtLW1zIg0KICAgIGlmICgka2V5dHlwZSAtZXEgJ2ttc2hvc3QnKSB7DQogICAgICAgICRjc3Zs a1BhdGggPSAiJFN5c1BhdGhcc3BwXHRva2Vuc1xwa2V5Y29uZmlnXHBrZXljb25maWctY3N2bGsueHJtLW1zIg0KICAgICAgICBpZiAoVGVzdC1QYXRoICRj c3Zsa1BhdGgpIHsNCiAgICAgICAgICAgICRwa2V5Y29uZmlnID0gJGNzdmxrUGF0aA0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgICRkYXRhID0gW3ht bF1bVGV4dC5FbmNvZGluZ106OlVURjguR2V0U3RyaW5nKFtDb252ZXJ0XTo6RnJvbUJhc2U2NFN0cmluZygoW3htbF0oZ2V0LWNvbnRlbnQgJHBrZXljb25m aWcpKS5saWNlbnNlR3JvdXAubGljZW5zZS5vdGhlckluZm8uaW5mb1RhYmxlcy5pbmZvTGlzdC5pbmZvQmluLklubmVyVGV4dCkpDQogICAgDQogICAgJGJl dGFJZHMgPSBAKCkNCiAgICAkZXhjbHVkZWRJZHMgPSBAKCkNCiAgICAkY2hlY2tlZElkcyA9IEAoKQ0KICAgIA0KICAgIGZvcmVhY2ggKCRpZCBpbiAkZmls ZUlkcykgew0KICAgICAgICAkYWN0Q29uZmlnID0gJGRhdGEuUHJvZHVjdEtleUNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbnMuQ29uZmlndXJhdGlvbiB8 IFdoZXJlLU9iamVjdCB7ICRfLkFjdENvbmZpZ0lkIC1lcSAieyRpZH0iIH0NCiAgICAgICAgaWYgKCRhY3RDb25maWcpIHsNCiAgICAgICAgICAgICRwcm9k dWN0RGVzY3JpcHRpb24gPSAkYWN0Q29uZmlnLlByb2R1Y3REZXNjcmlwdGlvbg0KICAgICAgICAgICAgJHByb2R1Y3RFZGl0aW9uSUQgPSAkYWN0Q29uZmln LkVkaXRpb25JRA0KICAgICAgICAgICAgaWYgKCRwcm9kdWN0RGVzY3JpcHRpb24gLW1hdGNoICdNVUkgbG9ja2VkfFRlbmNlbnR8UWlob298V0FVJykgew0K ICAgICAgICAgICAgICAgICRleGNsdWRlZElkcyArPSAkaWQNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgfQ0KICAgIA0KICAgICAg ICAgICAgaWYgKCRwcm9kdWN0RGVzY3JpcHRpb24gLW1hdGNoICdCZXRhfFJDIHxOZXh0IHxUZXN0fFByZS0nKSB7DQogICAgICAgICAgICAgICAgJGJldGFJ ZHMgKz0gJGlkDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIH0NCiAgICANCiAgICAgICAgICAgIGlmICgka2V5dHlwZSAtbmUgJ2tt c2hvc3QnIC1hbmQgJHByb2R1Y3RFZGl0aW9uSUQgLWVxICckZWRpdGlvbicpIHsNCiAgICAgICAgICAgICAgICAkY2hlY2tlZElkcyArPSAkaWQNCiAgICAg ICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgfQ0KICAgIA0KICAgICAgICAgICAgJHJlZkdyb3VwSWQgPSAkYWN0Q29uZmlnLlJlZkdyb3VwSWQN CiAgICAgICAgICAgICRwdWJsaWNLZXkgPSAkZGF0YS5Qcm9kdWN0S2V5Q29uZmlndXJhdGlvbi5QdWJsaWNLZXlzLlB1YmxpY0tleSB8IFdoZXJlLU9iamVj dCB7ICRfLkdyb3VwSWQgLWVxICRyZWZHcm91cElkIC1hbmQgJF8uQWxnb3JpdGhtSWQgLWVxICdtc2Z0OnJtL2FsZ29yaXRobS9wa2V5LzIwMDknIH0NCiAg ICAgICAgICAgIGlmICgkcHVibGljS2V5KSB7DQogICAgICAgICAgICAgICAgJGtleVJhbmdlcyA9ICRkYXRhLlByb2R1Y3RLZXlDb25maWd1cmF0aW9uLktl eVJhbmdlcy5LZXlSYW5nZSB8IFdoZXJlLU9iamVjdCB7ICRfLlJlZkFjdENvbmZpZ0lkIC1lcSAieyRpZH0iIH0NCiAgICAgICAgICAgICAgICBmb3JlYWNo ICgka2V5UmFuZ2UgaW4gJGtleVJhbmdlcykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoJGtleVJhbmdlLkV1bGFUeXBlIC1tYXRjaCAnV0FVJykgew0K ICAgICAgICAgICAgICAgICAgICAgICAgJGV4Y2x1ZGVkSWRzICs9ICRpZA0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAg ICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAkcHJlZmluYWxJZHMgPSBAKCkN CiAgICAkZmluYWxJZHMgPSBAKCkNCiAgICANCiAgICAkcHJlZmluYWxJZHMgPSAkZmlsZUlkcyB8IFdoZXJlLU9iamVjdCB7ICRleGNsdWRlZElkcyAtbm90 Y29udGFpbnMgJF8gfSB8IFNlbGVjdC1PYmplY3QgLVVuaXF1ZQ0KICAgICRmaW5hbElkcyA9ICRwcmVmaW5hbElkcyB8IFdoZXJlLU9iamVjdCB7ICRiZXRh SWRzIC1ub3Rjb250YWlucyAkXyB9IHwgU2VsZWN0LU9iamVjdCAtVW5pcXVlDQogICAgDQogICAgaWYgKCRmaW5hbElkcy5Db3VudCAtZXEgMCkgew0KICAg ICAgICAkZmluYWxJZHMgPSAkcHJlZmluYWxJZHMNCiAgICB9DQogICAgDQogICAgaWYgKCRjaGVja2VkSWRzLkNvdW50IC1ndCAwKSB7DQogICAgICAgICRm aW5hbElkcyA9ICRjaGVja2VkSWRzICsgJGZpbmFsSWRzDQogICAgfQ0KICAgIA0KICAgICRmaXJzdElkID0gJGZpbmFsSWRzIHwgU2VsZWN0LU9iamVjdCAt Rmlyc3QgMQ0KICAgIHJldHVybiAkZmlyc3RJZC5Ub0xvd2VyKCkNCn0NCg0KV2luZG93cy1BY3RJRCAtZWRpdGlvbiAiJGVudjp0c2VkaXRpb24iIC1rZXl0 eXBlICIkZW52OmtleXR5cGUiDQo6d2ludHNpZDoNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBH ZXQgT2ZmaWNlIEFjdGl2YXRpb24gSUQNCg0KOm9mZnRzaWQ6DQpmdW5jdGlvbiBPZmZpY2UtQWN0SUQgew0KICAgIHBhcmFtICgNCiAgICAgICAgW3N0cmlu Z10kcGtleXBhdGgsDQogICAgICAgIFtzdHJpbmddJGVkaXRpb24sDQogICAgICAgIFtzdHJpbmddJGtleXR5cGUNCiAgICApDQoNCiAgICBzd2l0Y2ggKCRr ZXl0eXBlKSB7DQogICAgICAgICJ6ZXJvIiB7ICRwcm9kdWN0S2V5VHlwZXMgPSBAKCJPRU06Tk9OU0xQIiwiVm9sdW1lOk1BSyIsIlJldGFpbCIpIH0NCiAg ICAgICAgImtzIiB7ICRwcm9kdWN0S2V5VHlwZXMgPSBAKCJWb2x1bWU6R1ZMSyIpIH0NCiAgICB9DQoNCiAgICAkZGF0YSA9IFt4bWxdW1RleHQuRW5jb2Rp bmddOjpVVEY4LkdldFN0cmluZyhbQ29udmVydF06OkZyb21CYXNlNjRTdHJpbmcoKFt4bWxdKEdldC1Db250ZW50ICRwa2V5cGF0aCkpLmxpY2Vuc2VHcm91 cC5saWNlbnNlLm90aGVySW5mby5pbmZvVGFibGVzLmluZm9MaXN0LmluZm9CaW4uSW5uZXJUZXh0KSkNCiAgICAkY29uZmlndXJhdGlvbnMgPSAkZGF0YS5Q cm9kdWN0S2V5Q29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9ucy5Db25maWd1cmF0aW9uDQoNCiAgICAkZmlsdGVyZWRDb25maWdzID0gQCgpDQogICAgZm9y ZWFjaCAoJHR5cGUgaW4gJHByb2R1Y3RLZXlUeXBlcykgew0KICAgICAgICAkZmlsdGVyZWRDb25maWdzICs9ICRjb25maWd1cmF0aW9ucyB8IFdoZXJlLU9i amVjdCB7IA0KICAgICAgICAgICAgJF8uRWRpdGlvbklkIC1lcSAkZWRpdGlvbiAtYW5kIA0KICAgICAgICAgICAgJF8uUHJvZHVjdEtleVR5cGUgLWVxICR0 eXBlIC1hbmQgDQogICAgICAgICAgICAkXy5Qcm9kdWN0RGVzY3JpcHRpb24gLW5vdG1hdGNoICdkZW1vfE1TRE58UElOJw0KICAgICAgICB9DQogICAgfQ0K DQogICAgJGZpbHRlclByZXZpZXcgPSAkZmlsdGVyZWRDb25maWdzIHwgV2hlcmUtT2JqZWN0IHsgJF8uUHJvZHVjdERlc2NyaXB0aW9uIC1ub3RtYXRjaCAn cHJldmlld3xjMnInIH0NCg0KICAgIGlmICgkZmlsdGVyUHJldmlldy5Db3VudCAtbmUgMCkgew0KICAgICAgICAkZmlsdGVyZWRDb25maWdzID0gJGZpbHRl clByZXZpZXcNCiAgICB9IA0KDQogICAgJGZpcnN0Q29uZmlnID0gKCRmaWx0ZXJlZENvbmZpZ3MgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5BY3RDb25m aWdJRCAtcmVwbGFjZSAnXlx7fFx9JCcsICcnDQogICAgcmV0dXJuICRmaXJzdENvbmZpZy5Ub0xvd2VyKCkNCn0NCg0KT2ZmaWNlLUFjdElEIC1wa2V5cGF0 aCAiJGVudjpwa2V5cGF0aCIgLWVkaXRpb24gIiRlbnY6X0xpY2Vuc2UiIC1rZXl0eXBlICIkZW52OmtleXR5cGUiDQo6b2ZmdHNpZDoNCg0KOjo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICAxc3QgY29sdW1uID0gT2ZmaWNlIHZlcnNpb24NCjo6ICAybmQgY29sdW1u ID0gVm9sdW1lIG9yIGZyZWUgcmV0YWlsIHByb2R1Y3QNCjo6ICAzcmQgY29sdW1uID0gUmV0YWlsIHByb2R1Y3QgbmFtZXMgdGhhdCBuZWVkcyB0byBiZSBj b252ZXJ0ZWQgdG8gdGhlIFZvbHVtZSBwcm9kdWN0IG1lbnRpb25lZCBpbiAybmQgY29sdW1uDQo6OiAgU2VwYXJhdG9yICA9ICJfIg0KDQo6dHNrc2RhdGEN Cg0Kc2V0IGY9DQpmb3IgJSUjIGluICgNCjo6IE9mZmljZSAyMDEzDQoxNV9BY2Nlc3NWb2x1bWVfLUFjY2Vzc1JldGFpbC0NCjE1X0FjY2Vzc1J1bnRpbWVS ZXRhaWwNCjE1X0V4Y2VsVm9sdW1lXy1FeGNlbFJldGFpbC0NCjE1X0dyb292ZVZvbHVtZV8tR3Jvb3ZlUmV0YWlsLQ0KMTVfSW5mb1BhdGhWb2x1bWVfLUlu Zm9QYXRoUmV0YWlsLQ0KMTVfTHluY0FjYWRlbWljUmV0YWlsDQoxNV9MeW5jRW50cnlSZXRhaWwNCjE1X0x5bmNWb2x1bWVfLUx5bmNSZXRhaWwtDQoxNV9N b25kb1JldGFpbA0KMTVfTW9uZG9Wb2x1bWVfLU8zNjVCdXNpbmVzc1JldGFpbC1PMzY1SG9tZVByZW1SZXRhaWwtTzM2NVByb1BsdXNSZXRhaWwtTzM2NVNt YWxsQnVzUHJlbVJldGFpbC0NCjE1X09uZU5vdGVGcmVlUmV0YWlsDQoxNV9PbmVOb3RlVm9sdW1lXy1PbmVOb3RlUmV0YWlsLQ0KMTVfT3V0bG9va1ZvbHVt ZV8tT3V0bG9va1JldGFpbC0NCjE1X1Bvd2VyUG9pbnRWb2x1bWVfLVBvd2VyUG9pbnRSZXRhaWwtDQoxNV9Qcm9qZWN0UHJvVm9sdW1lXy1Qcm9qZWN0UHJv UmV0YWlsLQ0KMTVfUHJvamVjdFN0ZFZvbHVtZV8tUHJvamVjdFN0ZFJldGFpbC0NCjE1X1Byb1BsdXNWb2x1bWVfLVByb1BsdXNSZXRhaWwtUHJvZmVzc2lv bmFsUGlwY1JldGFpbC1Qcm9mZXNzaW9uYWxSZXRhaWwtDQoxNV9QdWJsaXNoZXJWb2x1bWVfLVB1Ymxpc2hlclJldGFpbC0NCjE1X1NQRFJldGFpbA0KMTVf U3RhbmRhcmRWb2x1bWVfLVN0YW5kYXJkUmV0YWlsLUhvbWVCdXNpbmVzc1BpcGNSZXRhaWwtSG9tZUJ1c2luZXNzUmV0YWlsLUhvbWVTdHVkZW50QVJNUmV0 YWlsLUhvbWVTdHVkZW50UGx1c0FSTVJldGFpbC1Ib21lU3R1ZGVudFJldGFpbC1QZXJzb25hbFBpcGNSZXRhaWwtUGVyc29uYWxSZXRhaWwtDQoxNV9WaXNp b1Byb1ZvbHVtZV8tVmlzaW9Qcm9SZXRhaWwtDQoxNV9WaXNpb1N0ZFZvbHVtZV8tVmlzaW9TdGRSZXRhaWwtDQoxNV9Xb3JkVm9sdW1lXy1Xb3JkUmV0YWls LQ0KOjogT2ZmaWNlIDIwMTYNCjE2X0FjY2Vzc1J1bnRpbWVSZXRhaWwNCjE2X0FjY2Vzc1ZvbHVtZV8tQWNjZXNzUmV0YWlsLQ0KMTZfRXhjZWxWb2x1bWVf LUV4Y2VsUmV0YWlsLQ0KMTZfTW9uZG9SZXRhaWwNCjE2X01vbmRvVm9sdW1lXy1PMzY1QXBwc0Jhc2ljUmV0YWlsLU8zNjVCdXNpbmVzc1JldGFpbC1PMzY1 RWR1Q2xvdWRSZXRhaWwtTzM2NUhvbWVQcmVtUmV0YWlsLU8zNjVQcm9QbHVzUmV0YWlsLU8zNjVTbWFsbEJ1c1ByZW1SZXRhaWwtDQoxNl9PbmVOb3RlRnJl ZVJldGFpbA0KMTZfT25lTm90ZVZvbHVtZV8tT25lTm90ZVJldGFpbC1PbmVOb3RlMjAyMVJldGFpbC0NCjE2X091dGxvb2tWb2x1bWVfLU91dGxvb2tSZXRh aWwtDQoxNl9Qb3dlclBvaW50Vm9sdW1lXy1Qb3dlclBvaW50UmV0YWlsLQ0KMTZfUHJvamVjdFByb1ZvbHVtZV8tUHJvamVjdFByb1JldGFpbC0NCjE2X1By b2plY3RQcm9YVm9sdW1lDQoxNl9Qcm9qZWN0U3RkVm9sdW1lXy1Qcm9qZWN0U3RkUmV0YWlsLQ0KMTZfUHJvamVjdFN0ZFhWb2x1bWUNCjE2X1Byb1BsdXNW b2x1bWVfLVByb1BsdXNSZXRhaWwtUHJvZmVzc2lvbmFsUGlwY1JldGFpbC1Qcm9mZXNzaW9uYWxSZXRhaWwtDQoxNl9QdWJsaXNoZXJWb2x1bWVfLVB1Ymxp c2hlclJldGFpbC0NCjE2X1NreXBlU2VydmljZUJ5cGFzc1JldGFpbA0KMTZfU2t5cGVmb3JCdXNpbmVzc0VudHJ5UmV0YWlsDQoxNl9Ta3lwZWZvckJ1c2lu ZXNzVm9sdW1lXy1Ta3lwZWZvckJ1c2luZXNzUmV0YWlsLQ0KMTZfU3RhbmRhcmRWb2x1bWVfLVN0YW5kYXJkUmV0YWlsLUhvbWVCdXNpbmVzc1BpcGNSZXRh aWwtSG9tZUJ1c2luZXNzUmV0YWlsLUhvbWVTdHVkZW50QVJNUmV0YWlsLUhvbWVTdHVkZW50UGx1c0FSTVJldGFpbC1Ib21lU3R1ZGVudFJldGFpbC1Ib21l U3R1ZGVudFZOZXh0UmV0YWlsLVBlcnNvbmFsUGlwY1JldGFpbC1QZXJzb25hbFJldGFpbC0NCjE2X1Zpc2lvUHJvVm9sdW1lXy1WaXNpb1Byb1JldGFpbC0N CjE2X1Zpc2lvUHJvWFZvbHVtZQ0KMTZfVmlzaW9TdGRWb2x1bWVfLVZpc2lvU3RkUmV0YWlsLQ0KMTZfVmlzaW9TdGRYVm9sdW1lDQoxNl9Xb3JkVm9sdW1l Xy1Xb3JkUmV0YWlsLQ0KOjogT2ZmaWNlIDIwMTkNCjE2X0FjY2Vzc1J1bnRpbWUyMDE5UmV0YWlsDQoxNl9BY2Nlc3MyMDE5Vm9sdW1lXy1BY2Nlc3MyMDE5 UmV0YWlsLQ0KMTZfRXhjZWwyMDE5Vm9sdW1lXy1FeGNlbDIwMTlSZXRhaWwtDQoxNl9PdXRsb29rMjAxOVZvbHVtZV8tT3V0bG9vazIwMTlSZXRhaWwtDQox Nl9Qb3dlclBvaW50MjAxOVZvbHVtZV8tUG93ZXJQb2ludDIwMTlSZXRhaWwtDQoxNl9Qcm9qZWN0UHJvMjAxOVZvbHVtZV8tUHJvamVjdFBybzIwMTlSZXRh aWwtDQoxNl9Qcm9qZWN0U3RkMjAxOVZvbHVtZV8tUHJvamVjdFN0ZDIwMTlSZXRhaWwtDQoxNl9Qcm9QbHVzMjAxOVZvbHVtZV8tUHJvUGx1czIwMTlSZXRh aWwtUHJvZmVzc2lvbmFsMjAxOVJldGFpbC0NCjE2X1B1Ymxpc2hlcjIwMTlWb2x1bWVfLVB1Ymxpc2hlcjIwMTlSZXRhaWwtDQoxNl9Ta3lwZWZvckJ1c2lu ZXNzMjAxOVZvbHVtZV8tU2t5cGVmb3JCdXNpbmVzczIwMTlSZXRhaWwtDQoxNl9Ta3lwZWZvckJ1c2luZXNzRW50cnkyMDE5UmV0YWlsDQoxNl9TdGFuZGFy ZDIwMTlWb2x1bWVfLVN0YW5kYXJkMjAxOVJldGFpbC1Ib21lQnVzaW5lc3MyMDE5UmV0YWlsLUhvbWVTdHVkZW50QVJNMjAxOVJldGFpbC1Ib21lU3R1ZGVu dFBsdXNBUk0yMDE5UmV0YWlsLUhvbWVTdHVkZW50MjAxOVJldGFpbC1QZXJzb25hbDIwMTlSZXRhaWwtDQoxNl9WaXNpb1BybzIwMTlWb2x1bWVfLVZpc2lv UHJvMjAxOVJldGFpbC0NCjE2X1Zpc2lvU3RkMjAxOVZvbHVtZV8tVmlzaW9TdGQyMDE5UmV0YWlsLQ0KMTZfV29yZDIwMTlWb2x1bWVfLVdvcmQyMDE5UmV0 YWlsLQ0KOjogT2ZmaWNlIDIwMjENCjo6IE9uZU5vdGUyMDIxVm9sdW1lIEtNUyBsaWNlbnNlIGlzIG5vdCBhdmFpbGFibGUNCjE2X0FjY2Vzc1J1bnRpbWUy MDIxUmV0YWlsDQoxNl9BY2Nlc3MyMDIxVm9sdW1lXy1BY2Nlc3MyMDIxUmV0YWlsLQ0KMTZfRXhjZWwyMDIxVm9sdW1lXy1FeGNlbDIwMjFSZXRhaWwtDQox Nl9PdXRsb29rMjAyMVZvbHVtZV8tT3V0bG9vazIwMjFSZXRhaWwtDQoxNl9PbmVOb3RlRnJlZTIwMjFSZXRhaWwNCjE2X1Bvd2VyUG9pbnQyMDIxVm9sdW1l Xy1Qb3dlclBvaW50MjAyMVJldGFpbC0NCjE2X1Byb2plY3RQcm8yMDIxVm9sdW1lXy1Qcm9qZWN0UHJvMjAyMVJldGFpbC0NCjE2X1Byb2plY3RTdGQyMDIx Vm9sdW1lXy1Qcm9qZWN0U3RkMjAyMVJldGFpbC0NCjE2X1Byb1BsdXMyMDIxVm9sdW1lXy1Qcm9QbHVzMjAyMVJldGFpbC1Qcm9mZXNzaW9uYWwyMDIxUmV0 YWlsLQ0KMTZfUHVibGlzaGVyMjAyMVZvbHVtZV8tUHVibGlzaGVyMjAyMVJldGFpbC0NCjE2X1NreXBlZm9yQnVzaW5lc3MyMDIxVm9sdW1lXy1Ta3lwZWZv ckJ1c2luZXNzMjAyMVJldGFpbC0NCjE2X1N0YW5kYXJkMjAyMVZvbHVtZV8tU3RhbmRhcmQyMDIxUmV0YWlsLUhvbWVCdXNpbmVzczIwMjFSZXRhaWwtSG9t ZVN0dWRlbnQyMDIxUmV0YWlsLVBlcnNvbmFsMjAyMVJldGFpbC0NCjE2X1Zpc2lvUHJvMjAyMVZvbHVtZV8tVmlzaW9Qcm8yMDIxUmV0YWlsLQ0KMTZfVmlz aW9TdGQyMDIxVm9sdW1lXy1WaXNpb1N0ZDIwMjFSZXRhaWwtDQoxNl9Xb3JkMjAyMVZvbHVtZV8tV29yZDIwMjFSZXRhaWwtDQo6OiBPZmZpY2UgMjAyNA0K MTZfQWNjZXNzMjAyNFZvbHVtZV8tQWNjZXNzMjAyNFJldGFpbC0NCjE2X0V4Y2VsMjAyNFZvbHVtZV8tRXhjZWwyMDI0UmV0YWlsLQ0KMTZfT3V0bG9vazIw MjRWb2x1bWVfLU91dGxvb2syMDI0UmV0YWlsLQ0KMTZfUG93ZXJQb2ludDIwMjRWb2x1bWVfLVBvd2VyUG9pbnQyMDI0UmV0YWlsLQ0KMTZfUHJvamVjdFBy bzIwMjRWb2x1bWVfLVByb2plY3RQcm8yMDI0UmV0YWlsLQ0KMTZfUHJvamVjdFN0ZDIwMjRWb2x1bWVfLVByb2plY3RTdGQyMDI0UmV0YWlsLQ0KMTZfUHJv UGx1czIwMjRWb2x1bWVfLVByb1BsdXMyMDI0UmV0YWlsLQ0KMTZfU2t5cGVmb3JCdXNpbmVzczIwMjRWb2x1bWUNCjE2X1N0YW5kYXJkMjAyNFZvbHVtZV8t SG9tZTIwMjRSZXRhaWwtSG9tZUJ1c2luZXNzMjAyNFJldGFpbC0NCjE2X1Zpc2lvUHJvMjAyNFZvbHVtZV8tVmlzaW9Qcm8yMDI0UmV0YWlsLQ0KMTZfVmlz aW9TdGQyMDI0Vm9sdW1lXy1WaXNpb1N0ZDIwMjRSZXRhaWwtDQoxNl9Xb3JkMjAyNFZvbHVtZV8tV29yZDIwMjRSZXRhaWwtDQopIGRvICgNCmZvciAvZiAi dG9rZW5zPTEtMyBkZWxpbXM9XyIgJSVBIGluICgiJSUjIikgZG8gKA0KDQppZiAlMT09Y2hrcHJvZCBpZiAiJW9WZXIlIj09IiUlQSIgaWYgbm90IGRlZmlu ZWQgZm91bmRwcm9kICgNCmlmIC9pICIlJUIiPT0iJTIiIHNldCBmb3VuZHByb2Q9MQ0KKQ0KDQppZiAlMT09Z2V0aW5mbyBpZiAiJW9WZXIlIj09IiUlQSIg KA0KZWNobzogJSVDIHwgZmluZCAvaSAiLSUyLSIgJW51bCUgJiYgKA0Kc2V0IF9MaWNlbnNlPSUlQg0Kc2V0IF9hbHRvZmZpZD0lJUINCikNCikNCg0KKQ0K KQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnRzX2dldGVkaXRpb24NCg0Kc2V0IHRz ZWRpdGlvbj0NCnNldCBfd3RhcmdldD0NCg0KaWYgJV93bWljJSBFUVUgMSBzZXQgImNoa2VkaT1mb3IgL2YgInRva2Vucz0yIGRlbGltcz09IiAlJWEgaW4g KCcid21pYyBwYXRoICVzcHAlIHdoZXJlIChBcHBsaWNhdGlvbklEPSc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYnIEFORCBMaWNlbnNl RGVwZW5kc09uIGlzIE5VTEwpIGdldCBMaWNlbnNlRmFtaWx5IC9WQUxVRSIgJW51bDYlJykiDQppZiAlX3dtaWMlIEVRVSAwIHNldCAiY2hrZWRpPWZvciAv ZiAidG9rZW5zPTIgZGVsaW1zPT0iICUlYSBpbiAoJyVwc2MlICIoKFtXTUlTRUFSQ0hFUl0nU0VMRUNUIExpY2Vuc2VGYW1pbHkgRlJPTSAlc3BwJSBXSEVS RSBBcHBsaWNhdGlvbklEPScnNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmJycgQU5EIExpY2Vuc2VEZXBlbmRzT24gaXMgTlVMTCcpLkdl dCgpKS5MaWNlbnNlRmFtaWx5IF58ICUlIHtlY2hvICgnTGljZW5zZUZhbWlseT0nKyRfKX0iICVudWw2JScpIg0KJWNoa2VkaSUgZG8gaWYgbm90IGVycm9y bGV2ZWwgMSBjYWxsIHNldCAiX3d0YXJnZXQ9ICFfd3RhcmdldCEgJSVhICINCg0KOjogIFNLVSBhbmQgRWRpdGlvbiBJRCBkYXRhYmFzZQ0KDQpmb3IgJSUj IGluICgNCjE6VWx0aW1hdGUNCjI6SG9tZUJhc2ljDQozOkhvbWVQcmVtaXVtDQo0OkVudGVycHJpc2UNCjU6SG9tZUJhc2ljTg0KNjpCdXNpbmVzcw0KNzpT ZXJ2ZXJTdGFuZGFyZA0KODpTZXJ2ZXJEYXRhY2VudGVyDQo5OlNlcnZlclNCU1N0YW5kYXJkDQoxMDpTZXJ2ZXJFbnRlcnByaXNlDQoxMTpTdGFydGVyDQox MjpTZXJ2ZXJEYXRhY2VudGVyQ29yZQ0KMTM6U2VydmVyU3RhbmRhcmRDb3JlDQoxNDpTZXJ2ZXJFbnRlcnByaXNlQ29yZQ0KMTU6U2VydmVyRW50ZXJwcmlz ZUlBNjQNCjE2OkJ1c2luZXNzTg0KMTc6U2VydmVyV2ViDQoxODpTZXJ2ZXJIUEMNCjE5OlNlcnZlckhvbWVTdGFuZGFyZA0KMjA6U2VydmVyU3RvcmFnZUV4 cHJlc3MNCjIxOlNlcnZlclN0b3JhZ2VTdGFuZGFyZA0KMjI6U2VydmVyU3RvcmFnZVdvcmtncm91cA0KMjM6U2VydmVyU3RvcmFnZUVudGVycHJpc2UNCjI0 OlNlcnZlcldpblNCDQoyNTpTZXJ2ZXJTQlNQcmVtaXVtDQoyNjpIb21lUHJlbWl1bU4NCjI3OkVudGVycHJpc2VODQoyODpVbHRpbWF0ZU4NCjI5OlNlcnZl cldlYkNvcmUNCjMwOlNlcnZlck1lZGl1bUJ1c2luZXNzTWFuYWdlbWVudA0KMzE6U2VydmVyTWVkaXVtQnVzaW5lc3NTZWN1cml0eQ0KMzI6U2VydmVyTWVk aXVtQnVzaW5lc3NNZXNzYWdpbmcNCjMzOlNlcnZlcldpbkZvdW5kYXRpb24NCjM0OlNlcnZlckhvbWVQcmVtaXVtDQozNTpTZXJ2ZXJXaW5TQlYNCjM2OlNl cnZlclN0YW5kYXJkVg0KMzc6U2VydmVyRGF0YWNlbnRlclYNCjM4OlNlcnZlckVudGVycHJpc2VWDQozOTpTZXJ2ZXJEYXRhY2VudGVyVkNvcmUNCjQwOlNl cnZlclN0YW5kYXJkVkNvcmUNCjQxOlNlcnZlckVudGVycHJpc2VWQ29yZQ0KNDI6U2VydmVySHlwZXJDb3JlDQo0MzpTZXJ2ZXJTdG9yYWdlRXhwcmVzc0Nv cmUNCjQ0OlNlcnZlclN0b3JhZ2VTdGFuZGFyZENvcmUNCjQ1OlNlcnZlclN0b3JhZ2VXb3JrZ3JvdXBDb3JlDQo0NjpTZXJ2ZXJTdG9yYWdlRW50ZXJwcmlz ZUNvcmUNCjQ3OlN0YXJ0ZXJODQo0ODpQcm9mZXNzaW9uYWwNCjQ5OlByb2Zlc3Npb25hbE4NCjUwOlNlcnZlclNvbHV0aW9uDQo1MTpTZXJ2ZXJGb3JTQlNv bHV0aW9ucw0KNTI6U2VydmVyU29sdXRpb25zUHJlbWl1bQ0KNTM6U2VydmVyU29sdXRpb25zUHJlbWl1bUNvcmUNCjU0OlNlcnZlclNvbHV0aW9uRU0NCjU1 OlNlcnZlckZvclNCU29sdXRpb25zRU0NCjU2OlNlcnZlckVtYmVkZGVkU29sdXRpb24NCjU3OlNlcnZlckVtYmVkZGVkU29sdXRpb25Db3JlDQo1ODpQcm9m ZXNzaW9uYWxFbWJlZGRlZA0KNTk6U2VydmVyRXNzZW50aWFsTWFuYWdlbWVudA0KNjA6U2VydmVyRXNzZW50aWFsQWRkaXRpb25hbA0KNjE6U2VydmVyRXNz ZW50aWFsTWFuYWdlbWVudFN2Yw0KNjI6U2VydmVyRXNzZW50aWFsQWRkaXRpb25hbFN2Yw0KNjM6U2VydmVyU0JTUHJlbWl1bUNvcmUNCjY0OlNlcnZlckhQ Q1YNCjY1OkVtYmVkZGVkDQo2NjpTdGFydGVyRQ0KNjc6SG9tZUJhc2ljRQ0KNjg6SG9tZVByZW1pdW1FDQo2OTpQcm9mZXNzaW9uYWxFDQo3MDpFbnRlcnBy aXNlRQ0KNzE6VWx0aW1hdGVFDQo3MjpFbnRlcnByaXNlRXZhbA0KNzQ6UHJlcmVsZWFzZQ0KNzY6U2VydmVyTXVsdGlQb2ludFN0YW5kYXJkDQo3NzpTZXJ2 ZXJNdWx0aVBvaW50UHJlbWl1bQ0KNzk6U2VydmVyU3RhbmRhcmRFdmFsDQo4MDpTZXJ2ZXJEYXRhY2VudGVyRXZhbA0KODE6UHJlcmVsZWFzZUFSTQ0KODI6 UHJlcmVsZWFzZU4NCjg0OkVudGVycHJpc2VORXZhbA0KODU6RW1iZWRkZWRBdXRvbW90aXZlDQo4NjpFbWJlZGRlZEluZHVzdHJ5QQ0KODc6VGhpblBDDQo4 ODpFbWJlZGRlZEENCjg5OkVtYmVkZGVkSW5kdXN0cnkNCjkwOkVtYmVkZGVkRQ0KOTE6RW1iZWRkZWRJbmR1c3RyeUUNCjkyOkVtYmVkZGVkSW5kdXN0cnlB RQ0KOTM6UHJvZmVzc2lvbmFsUGx1cw0KOTU6U2VydmVyU3RvcmFnZVdvcmtncm91cEV2YWwNCjk2OlNlcnZlclN0b3JhZ2VTdGFuZGFyZEV2YWwNCjk3OkNv cmVBUk0NCjk4OkNvcmVODQo5OTpDb3JlQ291bnRyeVNwZWNpZmljDQoxMDA6Q29yZVNpbmdsZUxhbmd1YWdlDQoxMDE6Q29yZQ0KMTAzOlByb2Zlc3Npb25h bFdNQw0KMTA0Ok1vYmlsZUNvcmUNCjEwNTpFbWJlZGRlZEluZHVzdHJ5RXZhbA0KMTA2OkVtYmVkZGVkSW5kdXN0cnlFRXZhbA0KMTA3OkVtYmVkZGVkRXZh bA0KMTA4OkVtYmVkZGVkRUV2YWwNCjEwOTpDb3JlU3lzdGVtU2VydmVyDQoxMTA6U2VydmVyQ2xvdWRTdG9yYWdlDQoxMTE6Q29yZUNvbm5lY3RlZA0KMTEy OlByb2Zlc3Npb25hbFN0dWRlbnQNCjExMzpDb3JlQ29ubmVjdGVkTg0KMTE0OlByb2Zlc3Npb25hbFN0dWRlbnRODQoxMTU6Q29yZUNvbm5lY3RlZFNpbmds ZUxhbmd1YWdlDQoxMTY6Q29yZUNvbm5lY3RlZENvdW50cnlTcGVjaWZpYw0KMTE3OkNvbm5lY3RlZENhcg0KMTE4OkluZHVzdHJ5SGFuZGhlbGQNCjExOTpQ UElQUk8NCjEyMDpTZXJ2ZXJBUk02NA0KMTIxOkVkdWNhdGlvbg0KMTIyOkVkdWNhdGlvbk4NCjEyMzpJb1RVQVANCjEyNDpTZXJ2ZXJISQ0KMTI1OkVudGVy cHJpc2VTDQoxMjY6RW50ZXJwcmlzZVNODQoxMjc6UHJvZmVzc2lvbmFsUw0KMTI4OlByb2Zlc3Npb25hbFNODQoxMjk6RW50ZXJwcmlzZVNFdmFsDQoxMzA6 RW50ZXJwcmlzZVNORXZhbA0KMTMxOklvVFVBUENvbW1lcmNpYWwNCjEzMzpNb2JpbGVFbnRlcnByaXNlDQoxMzQ6QW5hbG9nT25lQ29yZUVudGVycHJpc2UN CjEzNTpBbmFsb2dPbmVDb3JlDQoxMzY6SG9sb2dyYXBoaWMNCjEzODpQcm9mZXNzaW9uYWxTaW5nbGVMYW5ndWFnZQ0KMTM5OlByb2Zlc3Npb25hbENvdW50 cnlTcGVjaWZpYw0KMTQwOkVudGVycHJpc2VTdWJzY3JpcHRpb24NCjE0MTpFbnRlcnByaXNlU3Vic2NyaXB0aW9uTg0KMTQzOlNlcnZlckRhdGFjZW50ZXJO YW5vDQoxNDQ6U2VydmVyU3RhbmRhcmROYW5vDQoxNDU6U2VydmVyRGF0YWNlbnRlckFDb3INCjE0NjpTZXJ2ZXJTdGFuZGFyZEFDb3INCjE0NzpTZXJ2ZXJE YXRhY2VudGVyQ29yDQoxNDg6U2VydmVyU3RhbmRhcmRDb3INCjE0OTpVdGlsaXR5Vk0NCjE1OTpTZXJ2ZXJEYXRhY2VudGVyRXZhbENvcg0KMTYwOlNlcnZl clN0YW5kYXJkRXZhbENvcg0KMTYxOlByb2Zlc3Npb25hbFdvcmtzdGF0aW9uDQoxNjI6UHJvZmVzc2lvbmFsV29ya3N0YXRpb25ODQoxNjM6U2VydmVyQXp1 cmUNCjE2NDpQcm9mZXNzaW9uYWxFZHVjYXRpb24NCjE2NTpQcm9mZXNzaW9uYWxFZHVjYXRpb25ODQoxNjg6U2VydmVyQXp1cmVDb3INCjE2OTpTZXJ2ZXJB enVyZU5hbm8NCjE3MTpFbnRlcnByaXNlRw0KMTcyOkVudGVycHJpc2VHTg0KMTczOkJ1c2luZXNzU3Vic2NyaXB0aW9uDQoxNzQ6QnVzaW5lc3NTdWJzY3Jp cHRpb25ODQoxNzU6U2VydmVyUmRzaA0KMTc4OkNsb3VkDQoxNzk6Q2xvdWRODQoxODA6SHViT1MNCjE4MjpPbmVDb3JlVXBkYXRlT1MNCjE4MzpDbG91ZEUN CjE4NDpBbmRyb21lZGENCjE4NTpJb1RPUw0KMTg2OkNsb3VkRU4NCjE4NzpJb1RFZGdlT1MNCjE4ODpJb1RFbnRlcnByaXNlDQoxODk6TW9kZXJuUEMNCjE5 MTpJb1RFbnRlcnByaXNlUw0KMTkyOlN5c3RlbU9TDQoxOTM6TmF0aXZlT1MNCjE5NDpHYW1lQ29yZVhib3gNCjE5NTpHYW1lT1MNCjE5NjpEdXJhbmdvSG9z dE9TDQoxOTc6U2NhcmxldHRIb3N0T1MNCjE5ODpLZXlzdG9uZQ0KMTk5OkNsb3VkSG9zdA0KMjAwOkNsb3VkTU9TDQoyMDE6Q2xvdWRDb3JlDQoyMDI6Q2xv dWRFZGl0aW9uTg0KMjAzOkNsb3VkRWRpdGlvbg0KMjA0OldpblZPUw0KMjA1OklvVEVudGVycHJpc2VTSw0KMjA2OklvVEVudGVycHJpc2VLDQoyMDc6SW9U RW50ZXJwcmlzZVNFdmFsDQoyMDg6QWdlbnRCcmlkZ2UNCjIwOTpOYW5vSG9zdA0KMjEwOldOQw0KNDA2OlNlcnZlckF6dXJlU3RhY2tIQ0lDb3INCjQwNzpT ZXJ2ZXJUdXJiaW5lDQo0MDg6U2VydmVyVHVyYmluZUNvcg0KDQpSRU0gU29tZSBvbGQgZWRpdGlvbiBuYW1lcyB3aXRoIHNhbWUgU0tVIElEDQoNCjQ6UHJv RW50ZXJwcmlzZQ0KNjpQcm9TdGFuZGFyZA0KMTA6UHJvU0JTDQoxNjpQcm9TdGFuZGFyZE4NCjE4OlNlcnZlckNvbXB1dGVDbHVzdGVyDQoxOTpTZXJ2ZXJI b21lDQozMDpTZXJ2ZXJNaWRtYXJrZXRTdGFuZGFyZA0KMzE6U2VydmVyTWlkbWFya2V0RWRnZQ0KMzI6U2VydmVyTWlkbWFya2V0UHJlbWl1bQ0KMzM6U2Vy dmVyU0JTUHJpbWUNCjQyOlNlcnZlckh5cGVyDQo2NDpTZXJ2ZXJDb21wdXRlQ2x1c3RlclYNCjg1OkVtYmVkZGVkSWFwZXR1cw0KODY6RW1iZWRkZWRUZXRo eXMNCjg4OkVtYmVkZGVkRGlvbmUNCjg5OkVtYmVkZGVkUmhlYQ0KOTA6RW1iZWRkZWRFbmNlbGFkdXMNCjEwOTpTZXJ2ZXJOYW5vDQoxMjQ6U2VydmVyQ2xv dWRIb3N0SW5mcmFzdHJ1Y3R1cmUNCjEzMzpNb2JpbGVCdXNpbmVzcw0KMTM0OkhvbG9sZW5zRW50ZXJwcmlzZQ0KMTQ1OlNlcnZlckRhdGFjZW50ZXJTQ29y DQoxNDY6U2VydmVyU3RhbmRhcmRTQ29yDQoxNDc6U2VydmVyRGF0YWNlbnRlcldTQ29yDQoxNDg6U2VydmVyU3RhbmRhcmRXU0Nvcg0KMTg5OkxpdGUNCikg ZG8gKA0KZm9yIC9mICJ0b2tlbnM9MS0yIGRlbGltcz06IiAlJUEgaW4gKCIlJSMiKSBkbyBpZiAiJW9zU0tVJSI9PSIlJUEiIGlmIG5vdCBkZWZpbmVkIHRz ZWRpdGlvbiAoDQplY2hvICIlX3d0YXJnZXQlIiB8IGZpbmQgL2kgIiAlJUIgIiAlbnVsJSAmJiBzZXQgdHNlZGl0aW9uPSUlQg0KKQ0KKQ0KDQppZiBkZWZp bmVkIHRzZWRpdGlvbiBleGl0IC9iDQoNCnNldCBkMT0lcmVmJSBbdm9pZF0kVHlwZUJ1aWxkZXIuRGVmaW5lUEludm9rZU1ldGhvZCgnR2V0RWRpdGlvbk5h bWVGcm9tSWQnLCAncGtleWhlbHBlci5kbGwnLCAnUHVibGljLCBTdGF0aWMnLCAxLCBbaW50XSwgQChbaW50XSwgW0ludFB0cl0uTWFrZUJ5UmVmVHlwZSgp KSwgMSwgMyk7DQpzZXQgZDE9JWQxJSAkb3V0ID0gMDsgW3ZvaWRdJFR5cGVCdWlsZGVyLkNyZWF0ZVR5cGUoKTo6R2V0RWRpdGlvbk5hbWVGcm9tSWQoJW9z U0tVJSwgW3JlZl0kb3V0KTskcz1bUnVudGltZS5JbnRlcm9wU2VydmljZXMuTWFyc2hhbF06OlB0clRvU3RyaW5nVW5pKCRvdXQpOyAkcw0KDQpmb3IgJSUj IGluIChwa2V5aGVscGVyLmRsbCkgZG8gQGlmIG5vdCAiJSV+JFBBVEg6IyI9PSIiICgNCmZvciAvZiAlJWEgaW4gKCclcHNjJSAiJWQxJSInKSBkbyBpZiBu b3QgZXJyb3JsZXZlbCAxICgNCmVjaG8gIiVfd3RhcmdldCUiIHwgZmluZCAvaSAiICUlYSAiICVudWwlICYmIHNldCB0c2VkaXRpb249JSVhDQopDQopDQoN CmV4aXQgL2INCg0KOisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrDQoNCjpLTVNBY3RpdmF0aW9uDQoNCjo6ICBUbyBh Y3RpdmF0ZSBXaW5kb3dzIHdpdGggSy1NLVMgYWN0aXZhdGlvbiwgcnVuIHRoZSBzY3JpcHQgd2l0aCAiL0stV2luZG93cyIgcGFyYW1ldGVyIG9yIGNoYW5n ZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0Kc2V0IF9hY3R3aW49MA0KDQo6OiAgVG8gYWN0aXZhdGUgYWxsIE9mZmljZSBhcHBzIChpbmNsdWRpbmcgUHJvamVj dC9WaXNpbykgd2l0aCBLLU0tUyBhY3RpdmF0aW9uLCBydW4gdGhlIHNjcmlwdCB3aXRoICIvSy1PZmZpY2UiIHBhcmFtZXRlciBvciBjaGFuZ2UgMCB0byAx IGluIGJlbG93IGxpbmUNCnNldCBfYWN0b2ZmPTANCg0KOjogIFRvIGFjdGl2YXRlIG9ubHkgUHJvamVjdC9WaXNpbyB3aXRoIEstTS1TIGFjdGl2YXRpb24s IHJ1biB0aGUgc2NyaXB0IHdpdGggIi9LLVByb2plY3RWaXNpbyIgcGFyYW1ldGVyIG9yIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0Kc2V0IF9hY3Rw cm9qdmlzPTANCg0KOjogIFRvIGFjdGl2YXRlIGFsbCBXaW5kb3dzL09mZmljZSB3aXRoIEstTS1TIGFjdGl2YXRpb24sIHJ1biB0aGUgc2NyaXB0IHdpdGgg Ii9LLVdpbmRvd3NPZmZpY2UiIHBhcmFtZXRlciBvciBjaGFuZ2UgMCB0byAxIGluIGJlbG93IGxpbmUNCnNldCBfYWN0d2lub2ZmPTANCg0KOjogIFRvIGRp c2FibGUgY2hhbmdpbmcgV2luZG93cy9PZmZpY2UgZWRpdGlvbiBpZiBjdXJyZW50IGVkaXRpb24gZG9lc24ndCBzdXBwb3J0IEstTS1TIGFjdGl2YXRpb24s IHJ1biB0aGUgc2NyaXB0IHdpdGggIi9LLU5vRWRpdGlvbkNoYW5nZSIgcGFyYW1ldGVyIG9yIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0Kc2V0IF9O b0VkaXRpb25DaGFuZ2U9MA0KDQo6OiAgVG8gTk9UIGF1dG8taW5zdGFsbCByZW5ld2FsIHRhc2sgd2l0aCBhY3RpdmF0aW9uLCBydW4gdGhlIHNjcmlwdCB3 aXRoICIvSy1Ob1JlbmV3YWxUYXNrIiBwYXJhbWV0ZXIgb3IgY2hhbmdlIDAgdG8gMSBpbiBiZWxvdyBsaW5lDQpzZXQgX25vcmVudHNrPTANCg0KOjogIFRv IHVuaW5zdGFsbCBLLU0tUywgcnVuIHRoZSBzY3JpcHQgd2l0aCAiL0stVW5pbnN0YWxsIiBwYXJhbWV0ZXIgb3IgY2hhbmdlIDAgdG8gMSBpbiBiZWxvdyBs aW5lLiBJdCdsbCB0YWtlIHByZWZlcmVuY2Ugb3ZlciBhbnkgb3RoZXIgcGFyYW1ldGVyLg0Kc2V0IF91bmk9MA0KDQo6OiAgQWR2YW5jZWQgb3B0aW9uczoN Cjo6ICBEb24ndCB1c2UgcmVuZXdhbCB0YXNrIG9wdGlvbiBpZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSBhIHNwZWNpZmljIHNlcnZlciBuYW1lIGluc3RlYWQg b2YgcHVibGljIHNlcnZlcnMgdXNlZCBpbiB0aGUgc2NyaXB0DQoNCjo6ICBUbyBzcGVjaWZ5IGEgc2VydmVyIGFkZHJlc3MgZm9yIGFjdGl2YXRpb24sIHJ1 biB0aGUgc2NyaXB0IHdpdGggIi9LLVNlcnZlci1ZT1VSS01TU0VSVkVSTkFNRSIgcGFyYW1ldGVyIG9yIGFkZCBpdCBpbiBiZWxvdyBsaW5lIGFmdGVyID0g c2lnbg0Kc2V0IF9zZXJ2ZXI9DQoNCjo6ICBUbyBzcGVjaWZ5IGEgcG9ydCBmb3IgYWN0aXZhdGlvbiwgcnVuIHRoZSBzY3JpcHQgd2l0aCAiL0stUG9ydC1Z T1VSUE9SVE5BTUUiIHBhcmFtZXRlciBvciBhZGQgaXQgaW4gYmVsb3cgbGluZSBhZnRlciA9IHNpZ24NCnNldCBfcG9ydD0NCg0KOjogIFNjcmlwdCB3aWxs IHJ1biBpbiB1bmF0dGVuZGVkIG1vZGUgaWYgcGFyYW1ldGVycyBhcmUgdXNlZCBPUiB2YWx1ZSBpcyBjaGFuZ2VkIGluIGFib3ZlIGxpbmVzIEZPUiBhY3Rp dmF0aW9uIG9yIHVuaW5zdGFsbC4NCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmNscw0KY29sb3IgMDcN CnNldCBLUz1LJWJsYW5rJU1TDQp0aXRsZSAgT25saW5lICVLUyUgQWN0aXZhdGlvbiAlbWFzdmVyJQ0KDQpzZXQgX2FyZ3M9DQpzZXQgX2VsZXY9DQpzZXQg X3VuYXR0ZW5kZWQ9MA0KDQpzZXQgX2FyZ3M9JSoNCmlmIGRlZmluZWQgX2FyZ3Mgc2V0IF9hcmdzPSVfYXJnczoiPSUNCmlmIGRlZmluZWQgX2FyZ3MgZm9y ICUlQSBpbiAoJV9hcmdzJSkgZG8gKA0KaWYgL2kgIiUlQSI9PSItZWwiICAgICAgICAgICAgICAgICAgICAgICAgKHNldCBfZWxldj0xKQ0KaWYgL2kgIiUl QSI9PSIvSy1XaW5kb3dzIiAgICAgICAgICAgICAgICAgKHNldCBfYWN0d2luPTEpDQppZiAvaSAiJSVBIj09Ii9LLU9mZmljZSIgICAgICAgICAgICAgICAg ICAoc2V0IF9hY3RvZmY9MSkNCmlmIC9pICIlJUEiPT0iL0stUHJvamVjdFZpc2lvIiAgICAgICAgICAgIChzZXQgX2FjdHByb2p2aXM9MSkNCmlmIC9pICIl JUEiPT0iL0stV2luZG93c09mZmljZSIgICAgICAgICAgIChzZXQgX2FjdHdpbm9mZj0xKQ0KaWYgL2kgIiUlQSI9PSIvSy1Ob0VkaXRpb25DaGFuZ2UiICAg ICAgICAgKHNldCBfTm9FZGl0aW9uQ2hhbmdlPTEpDQppZiAvaSAiJSVBIj09Ii9LLU5vUmVuZXdhbFRhc2siICAgICAgICAgICAoc2V0IF9ub3JlbnRzaz0x KQ0KaWYgL2kgIiUlQSI9PSIvSy1Vbmluc3RhbGwiICAgICAgICAgICAgICAgKHNldCBfdW5pPTEpDQplY2hvICIlJUEiIHwgZmluZCAvaSAiL0stUG9ydC0i ICAgPm51bCAmJiAoc2V0ICJfcG9ydD0lJUEiICAgJiBjYWxsIHNldCAiX3BvcnQ9JSVfcG9ydDp+OCUlIikNCmVjaG8gIiUlQSIgfCBmaW5kIC9pICIvSy1T ZXJ2ZXItIiA+bnVsICYmIChzZXQgIl9zZXJ2ZXI9JSVBIiAmIGNhbGwgc2V0ICJfc2VydmVyPSUlX3NlcnZlcjp+MTAlJSIpDQopDQoNCmZvciAlJUEgaW4g KCVfYWN0d2luJSAlX2FjdG9mZiUgJV9hY3Rwcm9qdmlzJSAlX2FjdHdpbm9mZiUgJV91bmklKSBkbyAoaWYgIiUlQSI9PSIxIiBzZXQgX3VuYXR0ZW5kZWQ9 MSkNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmlmICVfdW5pJT09MSBnb3RvIDprc191bmluc3RhbGwN Cg0KOmtzX21lbnUNCg0KaWYgZGVmaW5lZCBfc2VydmVyIHNldCBfbm9yZW50c2s9MQ0KaWYgbm90IGRlZmluZWQgX3NlcnZlciBzZXQgX3BvcnQ9DQoNCmlm ICVfdW5hdHRlbmRlZCU9PTAgKA0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDc2LCAzMA0KdGl0bGUgIE9ubGluZSAlS1MlIEFjdGl2YXRp b24gJW1hc3ZlciUNCg0KZWNobzoNCmVjaG86DQplY2hvOg0KZWNobzoNCmlmIGV4aXN0ICIlUHJvZ3JhbUZpbGVzJVxBY3RpdmF0aW9uLVJlbmV3YWxcQWN0 aXZhdGlvbl90YXNrLmNtZCIgKA0KZmluZCAvaSAiVmVyOjIuNyIgIiVQcm9ncmFtRmlsZXMlXEFjdGl2YXRpb24tUmVuZXdhbFxBY3RpdmF0aW9uX3Rhc2su Y21kIiAlbnVsJSB8fCAoDQpjYWxsIDpka19jb2xvciAlX1llbGxvdyUgIiAgICAgICAgICAgICAgT2xkIHJlbmV3YWwgdGFzayBmb3VuZCwgcnVuIGFjdGl2 YXRpb24gdG8gdXBkYXRlIGl0LiINCikNCikNCmVjaG8gICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fDQplY2hvOiANCmVjaG8gICAgICAgICAgICAgICBbMV0gQWN0aXZhdGUgLSBXaW5kb3dzDQplY2hvICAgICAgICAgICAgICAgWzJdIEFj dGl2YXRlIC0gT2ZmaWNlIFtBbGxdDQplY2hvICAgICAgICAgICAgICAgWzNdIEFjdGl2YXRlIC0gT2ZmaWNlIFtQcm9qZWN0L1Zpc2lvXQ0KZWNobyAgICAg ICAgICAgICAgIFs0XSBBY3RpdmF0ZSAtIEFsbA0KZWNobyAgICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fICANCmVjaG86IA0KaWYgJV9ub3JlbnRzayU9PTAgKA0KZWNobyAgICAgICAgICAgICAgIFs1XSBSZW5ld2FsIFRhc2sgV2l0aCBBY3RpdmF0aW9u ICAgICAgIFtZZXNdDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IyICVfV2hpdGUlICIgICAgICAgICAgICAgIFs1XSBSZW5ld2FsIFRhc2sgV2l0aCBBY3Rp dmF0aW9uICAgICAgICAiICVfWWVsbG93JSAiW05vXSINCikNCmlmICVfTm9FZGl0aW9uQ2hhbmdlJT09MCAoDQplY2hvICAgICAgICAgICAgICAgWzZdIENo YW5nZSBFZGl0aW9uIElmIE5lZWRlZCAgICAgICAgICAgW1llc10NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvcjIgJV9XaGl0ZSUgIiAgICAgICAgICAgICAg WzZdIENoYW5nZSBFZGl0aW9uIElmIE5lZWRlZCAgICAgICAgICAgICIgJV9ZZWxsb3clICJbTm9dIg0KKQ0KZWNobyAgICAgICAgICAgICAgIFs3XSBVbmlu c3RhbGwgT25saW5lICVLUyUNCmVjaG8gICAgICAgICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgICAg ICANCmVjaG86DQppZiBkZWZpbmVkIF9zZXJ2ZXIgKA0KZWNobyAgICAgICAgICAgICAgIFs4XSBTZXQgJUtTJSBTZXJ2ZXIvUG9ydCBbJV9zZXJ2ZXIlXSBb JV9wb3J0JV0NCikgZWxzZSAoDQplY2hvICAgICAgICAgICAgICAgWzhdIFNldCAlS1MlIFNlcnZlci9Qb3J0DQopDQplY2hvICAgICAgICAgICAgICAgWzld IERvd25sb2FkIE9mZmljZQ0KZWNobyAgICAgICAgICAgICAgIFswXSAlX2V4aXRtc2clDQplY2hvICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNobzoNCmNhbGwgOmRrX2NvbG9yMiAlX1doaXRlJSAiICAgICAgICIgJV9HcmVlbiUg IkNob29zZSBhIG1lbnUgb3B0aW9uIHVzaW5nIHlvdXIga2V5Ym9hcmQgWzEsMiwzLDQsNSw2LDcsOCw5LDBdIg0KY2hvaWNlIC9DOjEyMzQ1Njc4OTAgL04N CnNldCBfZWw9IWVycm9ybGV2ZWwhDQoNCmlmICFfZWwhPT0xMCBleGl0IC9iDQppZiAhX2VsIT09OSBzdGFydCAlbWFzJWdlbnVpbmUtaW5zdGFsbGF0aW9u LW1lZGlhICYgZ290byA6a3NfbWVudQ0KaWYgIV9lbCE9PTggZ290byA6a3NfaXANCmlmICFfZWwhPT03IGNscyAmIGNhbGwgOmtzX3VuaW5zdGFsbCAmIGNs cyAmIGdvdG8gOmtzX21lbnUNCmlmICFfZWwhPT02IChpZiAlX05vRWRpdGlvbkNoYW5nZSU9PTAgKHNldCBfTm9FZGl0aW9uQ2hhbmdlPTEpIGVsc2UgKHNl dCBfTm9FZGl0aW9uQ2hhbmdlPTApKSAmIGdvdG8gOmtzX21lbnUNCmlmICFfZWwhPT01IChpZiAlX25vcmVudHNrJT09MCAoc2V0IF9ub3JlbnRzaz0xKSBl bHNlIChzZXQgX25vcmVudHNrPTApKSAmIGdvdG8gOmtzX21lbnUNCmlmICFfZWwhPT00IGNscyAmIHNldGxvY2FsICYgc2V0ICJfYWN0d2luPTEiICYgc2V0 ICJfYWN0b2ZmPTEiICYgc2V0ICJfYWN0cHJvanZpcz0wIiAmIGNhbGwgOmtzX3N0YXJ0ICYgZW5kbG9jYWwgJiBjbHMgJiBnb3RvIDprc19tZW51DQppZiAh X2VsIT09MyBjbHMgJiBzZXRsb2NhbCAmIHNldCAiX2FjdHdpbj0wIiAmIHNldCAiX2FjdG9mZj0wIiAmIHNldCAiX2FjdHByb2p2aXM9MSIgJiBjYWxsIDpr c19zdGFydCAmIGVuZGxvY2FsICYgY2xzICYgZ290byA6a3NfbWVudQ0KaWYgIV9lbCE9PTIgY2xzICYgc2V0bG9jYWwgJiBzZXQgIl9hY3R3aW49MCIgJiBz ZXQgIl9hY3RvZmY9MSIgJiBzZXQgIl9hY3Rwcm9qdmlzPTAiICYgY2FsbCA6a3Nfc3RhcnQgJiBlbmRsb2NhbCAmIGNscyAmIGdvdG8gOmtzX21lbnUNCmlm ICFfZWwhPT0xIGNscyAmIHNldGxvY2FsICYgc2V0ICJfYWN0d2luPTEiICYgc2V0ICJfYWN0b2ZmPTAiICYgc2V0ICJfYWN0cHJvanZpcz0wIiAmIGNhbGwg OmtzX3N0YXJ0ICYgZW5kbG9jYWwgJiBjbHMgJiBnb3RvIDprc19tZW51DQpnb3RvIDprc19tZW51DQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6a3Nfc3RhcnQNCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCAoDQptb2RlIDExNSwgMzINCmlmIGV4 aXN0ICIlU3lzUGF0aCVcc3BwXHN0b3JlX3Rlc3RcIiBtb2RlIDEzNSwgMzINCiVwc2MlICImeyRXPSRIb3N0LlVJLlJhd1VJLldpbmRvd1NpemU7JEI9JEhv c3QuVUkuUmF3VUkuQnVmZmVyU2l6ZTskVy5IZWlnaHQ9MzI7JEIuSGVpZ2h0PTMwMDskSG9zdC5VSS5SYXdVSS5XaW5kb3dTaXplPSRXOyRIb3N0LlVJLlJh d1VJLkJ1ZmZlclNpemU9JEI7fSIgJW51bCUNCikNCnRpdGxlICBPbmxpbmUgJUtTJSBBY3RpdmF0aW9uICVtYXN2ZXIlDQoNCmVjaG86DQplY2hvIEluaXRp YWxpemluZy4uLg0KY2FsbCA6ZGtfY2hrbWFsDQoNCmlmIG5vdCBleGlzdCAlU3lzUGF0aCVcJV9zbGV4ZSUgKA0KJWVsaW5lJQ0KZWNobyBbJVN5c1BhdGgl XCVfc2xleGUlXSBmaWxlIGlzIG1pc3NpbmcsIGFib3J0aW5nLi4uDQplY2hvOg0KaWYgbm90IGRlZmluZWQgcmVzdWx0cyAoDQpjYWxsIDpka19jb2xvciAl Qmx1ZSUgIkdvIGJhY2sgdG8gTWFpbiBNZW51LCBzZWxlY3QgVHJvdWJsZXNob290IGFuZCBydW4gRElTTSBSZXN0b3JlIGFuZCBTRkMgU2NhbiBvcHRpb25z LiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiQWZ0ZXIgdGhhdCwgcmVzdGFydCBzeXN0ZW0gYW5kIHRyeSBhY3RpdmF0aW9uIGFnYWluLiINCnNldCBmaXhl cz0lZml4ZXMlICVtYXMlaW4tcGxhY2VfcmVwYWlyX3VwZ3JhZGUNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIklmIGl0IHN0aWxsIHNob3dzIHRoZSBzYW1l IGVycm9yLCBkbyB0aGlzIC0gIiAlX1llbGxvdyUgIiAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlIg0KKQ0KZ290byBka19kb25lDQopDQoNCjo6PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQppZiAlX2FjdHByb2p2aXMlPT0xIChzZXQgIl9hY3RvZmY9MSIpDQppZiAl X2FjdHdpbm9mZiU9PTEgKHNldCAiX2FjdHdpbj0xIiAmIHNldCAiX2FjdG9mZj0xIikNCg0Kc2V0IHNwcD1Tb2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3QNCnNl dCBzcHM9U29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlDQoNCmNhbGwgOmRrX2NrZWNrd21pYw0KY2FsbCA6ZGtfY2hlY2tza3UNCmNhbGwgOmRrX3Byb2R1Y3QN CmNhbGwgOmRrX3NwcGlzc3VlDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpzZXQgZXJyb3I9DQoNCmNs cw0KZWNobzoNCmNhbGwgOmRrX3Nob3dvc2luZm8NCg0KOjogIENoZWNrIEludGVybmV0IGNvbm5lY3Rpb24NCg0Kc2V0IF9pbnQ9DQpmb3IgJSVhIGluIChs LnJvb3Qtc2VydmVycy5uZXQgcmVzb2x2ZXIxLm9wZW5kbnMuY29tIGRvd25sb2FkLndpbmRvd3N1cGRhdGUuY29tIGdvb2dsZS5jb20pIGRvIGlmIG5vdCBk ZWZpbmVkIF9pbnQgKA0KZm9yIC9mICJkZWxpbXM9W10gdG9rZW5zPTIiICUlIyBpbiAoJ3BpbmcgLW4gMSAlJWEnKSBkbyAoaWYgbm90ICIlJSMiPT0iIiBz ZXQgX2ludD0xKQ0KKQ0KDQppZiBub3QgZGVmaW5lZCBfaW50ICgNCiVwc2MlICJJZihbQWN0aXZhdG9yXTo6Q3JlYXRlSW5zdGFuY2UoW1R5cGVdOjpHZXRU eXBlRnJvbUNMU0lEKFtHdWlkXSd7RENCMDBDMDEtNTcwRi00QTlCLThENjktMTk5RkRCQTU3MjNCfScpKS5Jc0Nvbm5lY3RlZFRvSW50ZXJuZXQpe0V4aXQg MH1FbHNle0V4aXQgMX0iDQppZiAhZXJyb3JsZXZlbCE9PTAgKHNldCBfaW50PTEmc2V0IHBpbmdfZj0gQnV0IFBpbmcgRmFpbGVkKQ0KKQ0KDQppZiBkZWZp bmVkIF9pbnQgKA0KZWNobyBDaGVja2luZyBJbnRlcm5ldCBDb25uZWN0aW9uICAgICAgICAgICAgW0Nvbm5lY3RlZCVwaW5nX2YlXQ0KKSBlbHNlICgNCnNl dCBlcnJvcj0xDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgSW50ZXJuZXQgQ29ubmVjdGlvbiAgICAgICAgICAgIFtOb3QgQ29ubmVjdGVkXSIN CmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiSW50ZXJuZXQgaXMgcmVxdWlyZWQgZm9yIE9ubGluZSAlS1MlIEFjdGl2YXRpb24uIg0KKQ0KDQo6Oj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KZWNobyBJbml0aWF0aW5nIERpYWdub3N0aWMgVGVzdHMuLi4NCg0Kc2V0ICJfc2Vy dj0lX3Nsc2VyJSBXaW5tZ210Ig0KDQo6OiAgU29mdHdhcmUgUHJvdGVjdGlvbg0KOjogIFdpbmRvd3MgTWFuYWdlbWVudCBJbnN0cnVtZW50YXRpb24NCg0K aWYgJV9hY3R3aW4lPT0wIHNldCBub3R3aW5hY3Q9MQ0KY2FsbCA6ZGtfZXJyb3JjaGVjaw0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCg0KY2FsbCA6X3Rhc2tjbGVhci1jYWNoZQ0KY2FsbCA6X3Rhc2tzZXRzZXJ2DQoNCmlmIG5vdCAlX2FjdHdpbiU9PTEgZ290byA6 a3Nfb2ZmaWNlDQoNCjo6ICBQcm9jZXNzIFdpbmRvd3MNCjo6ICBDaGVjayBpZiBzeXN0ZW0gaXMgcGVybWFuZW50bHkgYWN0aXZhdGVkIG9yIG5vdA0KDQpl Y2hvOg0KZWNobyBQcm9jZXNzaW5nIFdpbmRvd3MuLi4NCmNhbGwgOmRrX2NoZWNrcGVybQ0KaWYgZGVmaW5lZCBfcGVybSAoDQpjYWxsIDpka19jb2xvciAl R3JheSUgIkNoZWNraW5nIE9TIEFjdGl2YXRpb24gICAgICAgICAgICAgICAgICBbV2luZG93cyBpcyBhbHJlYWR5IHBlcm1hbmVudGx5IGFjdGl2YXRlZF0i DQpnb3RvIDprc19vZmZpY2UNCikNCg0KOjogIENoZWNrIEV2YWx1YXRpb24gdmVyc2lvbg0KDQpzZXQgX2V2YWw9DQpzZXQgX2V2YWxzZXJ2PQ0KDQppZiBl eGlzdCAiJVN5c3RlbVJvb3QlXFNlcnZpY2luZ1xQYWNrYWdlc1xNaWNyb3NvZnQtV2luZG93cy0qRXZhbEVkaXRpb25+Ki5tdW0iIHNldCBfZXZhbD0xDQpp ZiBleGlzdCAiJVN5c3RlbVJvb3QlXFNlcnZpY2luZ1xQYWNrYWdlc1xNaWNyb3NvZnQtV2luZG93cy1TZXJ2ZXIqRXZhbEVkaXRpb25+Ki5tdW0iIHNldCBf ZXZhbHNlcnY9MQ0KaWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxTZXJ2aWNpbmdcUGFja2FnZXNcTWljcm9zb2Z0LVdpbmRvd3MtU2VydmVyKkV2YWxDb3JFZGl0 aW9ufioubXVtIiBzZXQgX2V2YWw9MSAmIHNldCBfZXZhbHNlcnY9MQ0KDQppZiBkZWZpbmVkIF9ldmFsICgNCnJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxN aWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgL3YgRWRpdGlvbklEICVudWwyJSB8IGZpbmQgL2kgIkV2YWwiICVudWwxJSAmJiAoDQpjYWxs IDpka19jb2xvciAlUmVkJSAiQ2hlY2tpbmcgRXZhbHVhdGlvbiBFZGl0aW9uICAgICAgICAgICAgIFtFdmFsdWF0aW9uIGVkaXRpb25zIGNhbm5vdCBiZSBh Y3RpdmF0ZWQgb3V0c2lkZSBvZiBldmFsdWF0aW9uIHBlcmlvZC5dIg0KDQppZiBkZWZpbmVkIF9ldmFsc2VydiAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUg IkdvIGJhY2sgdG8gbWFpbiBtZW51IGFuZCB1c2UgW0NoYW5nZSBFZGl0aW9uXSBvcHRpb24uIg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAi VXNlIFRTZm9yZ2UgYWN0aXZhdGlvbiBvcHRpb24gZnJvbSB0aGUgbWFpbiBtZW51IHRvIHJlc2V0IGV2YWx1YXRpb24gcGVyaW9kLiINCnNldCBmaXhlcz0l Zml4ZXMlICVtYXMlZXZhbHVhdGlvbl9lZGl0aW9ucw0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAl X1llbGxvdyUgIiAlbWFzJWV2YWx1YXRpb25fZWRpdGlvbnMiDQopDQoNCmdvdG8gOmtzX29mZmljZQ0KKQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIGlmIEdWTEsgaXMgYWxyZWFkeSBpbnN0YWxsZWQgb3Igbm90DQoNCmNhbGwgOmtfY2hh bm5lbA0KDQo6OiAgRGV0ZWN0IEtleQ0KDQpzZXQga2V5PQ0Kc2V0IHBrZXk9DQpzZXQgYWx0a2V5PQ0Kc2V0IGNoYW5nZWtleT0NCnNldCBhbHRlZGl0aW9u PQ0KDQpjYWxsIDpka19hY3RpZHMgNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmDQppZiBkZWZpbmVkIGFsbGFwcHMgY2FsbCA6a3NkYXRh IHdpbmtleQ0KaWYgbm90IGRlZmluZWQga2V5IGNhbGwgOmtfZ3ZsayAlbnVsJQ0KaWYgZGVmaW5lZCBhbGxhcHBzIGlmIG5vdCBkZWZpbmVkIGtleSBjYWxs IDprbXNmYWxsYmFjaw0KDQppZiBkZWZpbmVkIGFsdGtleSAoc2V0IGtleT0lYWx0a2V5JSZzZXQgY2hhbmdla2V5PTEpDQoNCnNldCAvYSBVQlI9MA0KaWYg JW9zU0tVJT09MTkxIGlmIGRlZmluZWQgYWx0a2V5IGlmIGRlZmluZWQgYWx0ZWRpdGlvbiAoDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAo J3JlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgL3YgVUJSICVudWw2JScpIGRvIGlmIG5vdCBl cnJvcmxldmVsIDEgc2V0IC9hIFVCUj0lJWINCmlmICV3aW5idWlsZCUgTFNTIDIyNTk4IGlmICFVQlIhIExTUyAyNzg4ICgNCmNhbGwgOmRrX2NvbG9yICVC bHVlJSAiV2luZG93cyBtdXN0IGJlIHVwZGF0ZWQgdG8gYnVpbGQgMTkwNDQuMjc4OCBvciBoaWdoZXIgZm9yIElvdEVudGVycHJpc2VTICVLUyUgYWN0aXZh dGlvbi4iDQopDQopDQoNCmlmIG5vdCBkZWZpbmVkIGtleSBpZiBkZWZpbmVkIG5vdGZvdW5kYWx0YWN0SUQgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNo ZWNraW5nIEFsdGVybmF0ZSBFZGl0aW9uIEZvciAlS1MlICAgICAgWyVhbHRlZGl0aW9uJSBBY3RpdmF0aW9uIElEIE5vdCBGb3VuZF0iDQopDQoNCmlmIG5v dCBkZWZpbmVkIGtleSBpZiBub3QgZGVmaW5lZCBfZ3ZsayAoDQplY2hvIFsld2lub3MlIF58ICV3aW5idWlsZCUgXnwgU0tVOiVvc1NLVSVdDQoNCmlmICV3 aW5idWlsZCUgR0VRIDkyMDAgaWYgZXhpc3QgIiVTeXNQYXRoJVxzcHBcdG9rZW5zXHNrdXNcJW9zZWRpdGlvbiVcKkdWTEsqLnhybS1tcyIgc2V0IHNwcGtz PTENCmlmICV3aW5idWlsZCUgTFNTIDkyMDAgaWYgZXhpc3QgIiVTeXNQYXRoJVxzcHBcdG9rZW5zXHNrdXNcU2VjdXJpdHktU1BQLUNvbXBvbmVudC1TS1Ut JW9zZWRpdGlvbiVcKlZMS01TKi54cm0tbXMiIHNldCBzcHBrcz0xDQppZiAld2luYnVpbGQlIExTUyA5MjAwIGlmIGV4aXN0ICIlU3lzUGF0aCVcc3BwXHRv a2Vuc1xza3VzXFNlY3VyaXR5LVNQUC1Db21wb25lbnQtU0tVLSVvc2VkaXRpb24lXCpWTC1CWVBBU1MqLnhybS1tcyIgc2V0IHNwcGtzPTENCmlmICV3aW5i dWlsZCUgTFNTIDc2MDAgaWYgZXhpc3QgIiVTeXNQYXRoJVxsaWNlbnNpbmdcc2t1c1xTZWN1cml0eS1MaWNlbnNpbmctU0xDLUNvbXBvbmVudC1TS1UtJW9z ZWRpdGlvbiVcKktNUyoueHJtLW1zIiBzZXQgc3Bwa3M9MQ0KaWYgJXdpbmJ1aWxkJSBMU1MgNzYwMCBpZiBleGlzdCAiJVN5c1BhdGglXGxpY2Vuc2luZ1xz a3VzXFNlY3VyaXR5LUxpY2Vuc2luZy1TTEMtQ29tcG9uZW50LVNLVS0lb3NlZGl0aW9uJVwqVkwtQllQQVNTKi54cm0tbXMiIHNldCBzcHBrcz0xDQoNCmlm IGRlZmluZWQgc2t1bm90Zm91bmQgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIlJlcXVpcmVkIGxpY2Vuc2UgZmlsZXMgbm90IGZvdW5kLiINCnNldCBmaXhl cz0lZml4ZXMlICVtYXMldHJvdWJsZXNob290DQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVs bG93JSAiICVtYXMldHJvdWJsZXNob290Ig0KKQ0KDQppZiBkZWZpbmVkIHNwcGtzICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICIlS1MlIGFjdGl2YXRpb24g aXMgc3VwcG9ydGVkIGJ1dCBmYWlsZWQgdG8gZmluZCB0aGUgJUtTJSBrZXkuIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwg OmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQopDQoNCmlm IG5vdCBkZWZpbmVkIHNrdW5vdGZvdW5kIGlmIG5vdCBkZWZpbmVkIHNwcGtzICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJUaGlzIHByb2R1Y3QgZG9lcyBu b3Qgc3VwcG9ydCAlS1MlIGFjdGl2YXRpb24uIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJVc2UgVFNmb3JnZSBhY3RpdmF0aW9uIG9wdGlvbiBmcm9tIHRo ZSBtYWluIG1lbnUuIg0KKQ0KZWNobzoNCmdvdG8gOmtzX29mZmljZQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCg0KOjogIEluc3RhbGwga2V5DQoNCmlmIGRlZmluZWQgY2hhbmdla2V5ICgNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiWyVhbHRlZGl0aW9uJV0g ZWRpdGlvbiBwcm9kdWN0IGtleSB3aWxsIGJlIHVzZWQgdG8gZW5hYmxlICVLUyUgYWN0aXZhdGlvbi4iDQplY2hvOg0KKQ0KDQppZiBkZWZpbmVkIHdpbnN1 YiAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIldpbmRvd3MgU3Vic2NyaXB0aW9uIFtTS1UgSUQtJXNsY1NLVSVdIGZvdW5kLiBTY3JpcHQgd2lsbCBhY3Rp dmF0ZSBiYXNlIGVkaXRpb24gW1NLVSBJRC0lcmVnU0tVJV0uIg0KZWNobzoNCikNCg0Kc2V0IF9wYXJ0aWFsPQ0KaWYgbm90IGRlZmluZWQga2V5ICgNCmlm ICVfd21pYyUgRVFVIDEgZm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSUjIGluICgnd21pYyBwYXRoICVzcHAlIHdoZXJlICJBcHBsaWNhdGlvbklEPSc1 NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYnIGFuZCBQYXJ0aWFsUHJvZHVjdEtleTw+bnVsbCBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBO VUxMIiBHZXQgUGFydGlhbFByb2R1Y3RLZXkgL3ZhbHVlICVudWw2JScpIGRvIHNldCAiX3BhcnRpYWw9JSUjIg0KaWYgJV93bWljJSBFUVUgMCBmb3IgL2Yg InRva2Vucz0yIGRlbGltcz09IiAlJSMgaW4gKCclcHNjJSAiKChbV01JU0VBUkNIRVJdJ1NFTEVDVCBQYXJ0aWFsUHJvZHVjdEtleSBGUk9NICVzcHAlIFdI RVJFIEFwcGxpY2F0aW9uSUQ9Jyc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYnJyBBTkQgUGFydGlhbFByb2R1Y3RLZXkgSVMgTk9UIE5V TEwgQU5EIExpY2Vuc2VEZXBlbmRzT24gaXMgTlVMTCcpLkdldCgpKS5QYXJ0aWFsUHJvZHVjdEtleSB8ICUlIHtlY2hvICgnUGFydGlhbFByb2R1Y3RLZXk9 JyskXyl9IiAlbnVsNiUnKSBkbyBzZXQgIl9wYXJ0aWFsPSUlIyINCmNhbGwgZWNobyBDaGVja2luZyBJbnN0YWxsZWQgUHJvZHVjdCBLZXkgICAgICAgICAg W1BhcnRpYWwgS2V5IC0gJSVfcGFydGlhbCUlXSBbVm9sdW1lOkdWTEtdDQopDQoNCmlmIGRlZmluZWQga2V5ICgNCnNldCBnZW5lcmlja2V5PTENCmNhbGwg OmRrX2luc2tleSAiWyVrZXklXSINCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjprc19vZmZpY2UN Cg0KaWYgbm90ICVfYWN0b2ZmJT09MSBnb3RvIDprc19hY3RpdmF0ZQ0KDQpjYWxsIDpvaF9zZXRzcHANCg0KOjogIENoZWNrIG9ob29rIGluc3RhbGwNCg0K c2V0IG9ob29rPQ0KZm9yICUlIyBpbiAoMTUgMTYpIGRvICgNCmZvciAlJUEgaW4gKCIlUHJvZ3JhbUZpbGVzJSIgIiVQcm9ncmFtVzY0MzIlIiAiJVByb2dy YW1GaWxlcyh4ODYpJSIpIGRvICgNCmlmIGV4aXN0ICIlJX5BXE1pY3Jvc29mdCBPZmZpY2VcT2ZmaWNlJSUjXHNwcGMqZGxsIiBzZXQgb2hvb2s9MQ0KKQ0K KQ0KDQpmb3IgJSUjIGluIChTeXN0ZW0gU3lzdGVtWDg2KSBkbyAoDQpmb3IgJSVHIGluICgiT2ZmaWNlIDE1IiAiT2ZmaWNlIikgZG8gKA0KZm9yICUlQSBp biAoIiVQcm9ncmFtRmlsZXMlIiAiJVByb2dyYW1XNjQzMiUiICIlUHJvZ3JhbUZpbGVzKHg4NiklIikgZG8gKA0KaWYgZXhpc3QgIiUlfkFcTWljcm9zb2Z0 ICUlfkdccm9vdFx2ZnNcJSUjXHNwcGMqZGxsIiBzZXQgb2hvb2s9MQ0KKQ0KKQ0KKQ0KDQppZiBkZWZpbmVkIG9ob29rICgNCmVjaG86DQpjYWxsIDpka19j b2xvciAlR3JheSUgIkNoZWNraW5nIE9ob29rICAgICAgICAgICAgICAgICAgICAgICAgICBbT2hvb2sgYWN0aXZhdGlvbiBpcyBhbHJlYWR5IGluc3RhbGxl ZCBmb3IgT2ZmaWNlXSINCikNCg0KOjogIENoZWNrIHVuc3VwcG9ydGVkIG9mZmljZSB2ZXJzaW9ucw0KDQpzZXQgbzE0YzJyPQ0Kc2V0IF82OD1IS0xNXFNP RlRXQVJFXE1pY3Jvc29mdFxPZmZpY2UNCnNldCBfODY9SEtMTVxTT0ZUV0FSRVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcT2ZmaWNlDQolbnVsJSByZWcgcXVl cnkgJV82OCVcMTQuMFxDVkggL2YgQ2xpY2sycnVuIC9rICAgICAgICAgJiYgc2V0IG8xNGMycj1PZmZpY2UgMjAxMCBDMlIgDQolbnVsJSByZWcgcXVlcnkg JV84NiVcMTQuMFxDVkggL2YgQ2xpY2sycnVuIC9rICAgICAgICAgJiYgc2V0IG8xNGMycj1PZmZpY2UgMjAxMCBDMlIgDQoNCmlmIG5vdCAiJW8xNGMyciUi PT0iIiAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIFVuc3VwcG9ydGVkIE9mZmljZSBJbnN0YWxsICAgICBbICVvMTRjMnIlXSIN CikNCg0KaWYgJXdpbmJ1aWxkJSBHRVEgMTAyNDAgJXBzYyUgIkdldC1BcHB4UGFja2FnZSAtbmFtZSAiTWljcm9zb2Z0Lk1pY3Jvc29mdE9mZmljZUh1YiIi IHwgZmluZCAvaSAiT2ZmaWNlIiAlbnVsMSUgJiYgKA0Kc2V0IG9odWI9MQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0NCg0KOjogIENoZWNrIHN1cHBvcnRlZCBvZmZpY2UgdmVyc2lvbnMNCg0KY2FsbCA6b2hfZ2V0cGF0aA0KDQpzZXQgbzE2dXdwPQ0Kc2V0IG8x NnV3cF9wYXRoPQ0KDQppZiAld2luYnVpbGQlIEdFUSAxMDI0MCAoDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIoR2V0LUFwcHhQYWNrYWdl IC1uYW1lICdNaWNyb3NvZnQuT2ZmaWNlLkRlc2t0b3AnIHwgU2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgSW5zdGFsbExvY2F0aW9uKSIgJW51bDYl JykgZG8gKGlmIGV4aXN0ICIlJWFcSW50ZWdyYXRpb25cSW50ZWdyYXRvci5leGUiIChzZXQgbzE2dXdwPTEmc2V0ICJvMTZ1d3BfcGF0aD0lJWEiKSkNCikN Cg0Kc2MgcXVlcnkgQ2xpY2tUb1J1blN2YyAlbnVsJQ0Kc2V0IGVycm9yMT0lZXJyb3JsZXZlbCUNCg0KaWYgZGVmaW5lZCBvMTZjMnIgaWYgJWVycm9yMSUg RVFVIDEwNjAgKA0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBDbGlja1RvUnVuIFNlcnZpY2UgICAgICAgICAgICAgW05vdCBmb3Vu ZCwgT2ZmaWNlIDE2LjAgZmlsZXMgZm91bmRdIg0Kc2V0IG8xNmMycj0NCnNldCBlcnJvcj0xDQopDQoNCnNjIHF1ZXJ5IE9mZmljZVN2YyAlbnVsJQ0Kc2V0 IGVycm9yMj0lZXJyb3JsZXZlbCUNCg0KaWYgZGVmaW5lZCBvMTVjMnIgaWYgJWVycm9yMSUgRVFVIDEwNjAgaWYgJWVycm9yMiUgRVFVIDEwNjAgKA0KZWNo bzoNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBDbGlja1RvUnVuIFNlcnZpY2UgICAgICAgICAgICAgW05vdCBmb3VuZCwgT2ZmaWNlIDE1LjAg ZmlsZXMgZm91bmRdIg0Kc2V0IG8xNWMycj0NCnNldCBlcnJvcj0xDQopDQoNCmlmICIlbzE2dXdwJSVvMTZjMnIlJW8xNWMyciUlbzE2bXNpJSVvMTVtc2kl JW8xNG1zaSUiPT0iIiAoDQpzZXQgZXJyb3I9MQ0KZWNobzoNCmlmIG5vdCAiJW8xNGMyciUiPT0iIiAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tp bmcgU3VwcG9ydGVkIE9mZmljZSBJbnN0YWxsICAgICAgIFtOb3QgRm91bmRdIg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBJ bnN0YWxsZWQgT2ZmaWNlICAgICAgICAgICAgICAgW05vdCBGb3VuZF0iDQopDQoNCmlmIGRlZmluZWQgb2h1YiAoDQplY2hvOg0KZWNobyBZb3Ugb25seSBo YXZlIHRoZSBPZmZpY2UgRGFzaGJvYXJkIGFwcCBpbnN0YWxsZWQ7IHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIGZ1bGwgdmVyc2lvbiBvZiBPZmZpY2UuDQop DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkRvd25sb2FkIGFuZCBpbnN0YWxsIE9mZmljZSBmcm9tIHRoZSBVUkwgYmVsb3csIHRoZW4gdHJ5IGFnYWluLiIN CnNldCBmaXhlcz0lZml4ZXMlICVtYXMlZ2VudWluZS1pbnN0YWxsYXRpb24tbWVkaWENCmNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiJW1hcyVnZW51aW5l LWluc3RhbGxhdGlvbi1tZWRpYSINCmdvdG8gOmtzX2FjdGl2YXRlDQopDQoNCnNldCBtdWx0aW9mZmljZT0NCmlmIG5vdCAiJW8xNnV3cCUlbzE2YzJyJSVv MTVjMnIlJW8xNm1zaSUlbzE1bXNpJSVvMTRtc2klIj09IjEiIHNldCBtdWx0aW9mZmljZT0xDQppZiBub3QgIiVvMTRjMnIlIj09IiIgc2V0IG11bHRpb2Zm aWNlPTENCg0KaWYgZGVmaW5lZCBtdWx0aW9mZmljZSAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDaGVja2luZyBNdWx0aXBsZSBPZmZpY2Ug SW5zdGFsbCAgICAgICAgW0ZvdW5kLiBSZWNvbW1lbmRlZCB0byBpbnN0YWxsIG9uZSB2ZXJzaW9uIG9ubHldIg0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIFByb2Nlc3MgT2ZmaWNlIFVXUA0KDQppZiBub3QgZGVmaW5lZCBvMTZ1d3AgZ290byA6a3Nf c3RhcnRvMTVjMnINCg0KY2FsbCA6a3NfcmVzZXQNCmNhbGwgOmRrX2FjdGlkcyAwZmYxY2UxNS1hOTg5LTQ3OWQtYWY0Ni1mMjc1YzYzNzA2NjMNCg0Kc2V0 IG9WZXI9MTYNCnNldCAiX29MUGF0aD0lbzE2dXdwX3BhdGglXExpY2Vuc2VzMTYiDQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIoR2V0LUFw cHhQYWNrYWdlIC1uYW1lICdNaWNyb3NvZnQuT2ZmaWNlLkRlc2t0b3AnIHwgU2VsZWN0LU9iamVjdCAtRXhwYW5kUHJvcGVydHkgRGVwZW5kZW5jaWVzKSB8 IFNlbGVjdC1PYmplY3QgUGFja2FnZUZ1bGxOYW1lIiAlbnVsNiUnKSBkbyAoc2V0ICJvMTZ1d3BhcHBsaXN0PSFvMTZ1d3BhcHBsaXN0ISAlJWEiKQ0KDQpl Y2hvICIlbzE2dXdwYXBwbGlzdCUiIHwgZmluZHN0ciAvaSAiQWNjZXNzIEV4Y2VsIE9uZU5vdGUgT3V0bG9vayBQb3dlclBvaW50IFB1Ymxpc2hlciBTa3lw ZUZvckJ1c2luZXNzIFdvcmQiICVudWwlICYmIHNldCAiX29JZHM9TzM2NUhvbWVQcmVtUmV0YWlsIg0KDQpmb3IgJSUjIGluIChQcm9qZWN0IFZpc2lvKSBk byAoDQplY2hvICIlbzE2dXdwYXBwbGlzdCUiIHwgZmluZHN0ciAvaSAiJSUjIiAlbnVsJSAmJiAoDQpzZXQgX2xhdD0NCmlmIGV4aXN0ICIlX29MUGF0aCVc JSUjUHJvMjAyNFZMKi54cm0tbXMiIHNldCAiX29JZHM9ICFfb0lkcyEgJSUjUHJvMjAyNFJldGFpbCAiICYgc2V0IF9sYXQ9MQ0KaWYgbm90IGRlZmluZWQg X2xhdCBpZiBleGlzdCAiJV9vTFBhdGglXCUlI1BybzIwMjFWTCoueHJtLW1zIiBzZXQgIl9vSWRzPSAhX29JZHMhICUlI1BybzIwMjFSZXRhaWwgIiAmIHNl dCBfbGF0PTENCmlmIG5vdCBkZWZpbmVkIF9sYXQgaWYgZXhpc3QgIiVfb0xQYXRoJVwlJSNQcm8yMDE5VkwqLnhybS1tcyIgc2V0ICJfb0lkcz0gIV9vSWRz ISAlJSNQcm8yMDE5UmV0YWlsICIgJiBzZXQgX2xhdD0xDQppZiBub3QgZGVmaW5lZCBfbGF0IHNldCAiX29JZHM9ICFfb0lkcyEgJSUjUHJvUmV0YWlsICIN CikNCikNCg0Kc2V0IHV3cGluZm89JW8xNnV3cF9wYXRoOkM6XFByb2dyYW0gRmlsZXNcV2luZG93c0FwcHNcTWljcm9zb2Z0Lk9mZmljZS5EZXNrdG9wXz0l DQoNCmVjaG86DQplY2hvIFByb2Nlc3NpbmcgT2ZmaWNlLi4uICAgICAgICAgICAgICAgICAgICBbVVdQIF58ICV1d3BpbmZvJV0NCg0KaWYgbm90IGRlZmlu ZWQgX29JZHMgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkNoZWNraW5nIEluc3RhbGxlZCBQcm9kdWN0cyAgICAgICAgICAgICBbUHJvZHVjdCBJRHMgbm90 IGZvdW5kLiBBYm9ydGluZyBhY3RpdmF0aW9uLi4uXSINCnNldCBlcnJvcj0xDQpnb3RvIDprc19zdGFydG8xNWMycg0KKQ0KDQpjYWxsIDprc19wcm9jZXNz DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6a3Nfc3RhcnRvMTVjMnINCg0KOjogIFByb2Nlc3MgT2Zm aWNlIDE1LjAgQzJSDQoNCmlmIG5vdCBkZWZpbmVkIG8xNWMyciBnb3RvIDprc19zdGFydG8xNmMycg0KDQpjYWxsIDprc19yZXNldA0KY2FsbCA6ZGtfYWN0 aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KDQpzZXQgb1Zlcj0xNQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4g KCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJSAvdiBJbnN0YWxsUGF0aCIgJW51bDYlJykgZG8gKHNldCAiX29Sb290PSUlYlxyb290IikNCmZvciAvZiAic2tp cD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE1YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBQbGF0Zm9ybSIgJW51bDYlJykgZG8gKHNl dCAiX29BcmNoPSUlYiIpDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8xNWMycl9yZWclXENvbmZpZ3VyYXRpb24g L3YgVmVyc2lvblRvUmVwb3J0IiAlbnVsNiUnKSBkbyAoc2V0ICJfdmVyc2lvbj0lJWIiKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCci cmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFByb2R1Y3RSZWxlYXNlSWRzIiAlbnVsNiUnKSBkbyAoc2V0ICJfcHJpZHM9JW8xNWMy cl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUHJvZHVjdFJlbGVhc2VJZHMiICYgc2V0ICJfY29uZmlnPSVvMTVjMnJfcmVnJVxDb25maWd1cmF0aW9uIikNCmlm IG5vdCBkZWZpbmVkIF9vQXJjaCAgIGZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE1YzJyX3JlZyVccHJvcGVydHlC YWcgL3YgUGxhdGZvcm0iICVudWw2JScpIGRvIChzZXQgIl9vQXJjaD0lJWIiKQ0KaWYgbm90IGRlZmluZWQgX3ZlcnNpb24gZm9yIC9mICJza2lwPTIgdG9r ZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVnJVxwcm9wZXJ0eUJhZyAvdiB2ZXJzaW9uIiAlbnVsNiUnKSBkbyAoc2V0ICJfdmVyc2lv bj0lJWIiKQ0KaWYgbm90IGRlZmluZWQgX3ByaWRzICAgZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTVjMnJfcmVn JVxwcm9wZXJ0eUJhZyAvdiBQcm9kdWN0UmVsZWFzZUlkIiAlbnVsNiUnKSBkbyAoc2V0ICJfcHJpZHM9JW8xNWMycl9yZWclXHByb3BlcnR5QmFnIC92IFBy b2R1Y3RSZWxlYXNlSWQiICYgc2V0ICJfY29uZmlnPSVvMTVjMnJfcmVnJVxwcm9wZXJ0eUJhZyIpDQoNCmVjaG8gIiVvMTVjMnJfcmVnJSIgfCBmaW5kIC9p ICJXb3c2NDMyTm9kZSIgJW51bDElICYmIChzZXQgX3Rvaz0xMCkgfHwgKHNldCBfdG9rPTkpDQpmb3IgL2YgInRva2Vucz0lX3RvayUgZGVsaW1zPVwiICUl YSBpbiAoJ3JlZyBxdWVyeSAlbzE1YzJyX3JlZyVcUHJvZHVjdFJlbGVhc2VJRHNcQWN0aXZlICVudWw2JSBefCBmaW5kc3RyIC9pICJSZXRhaWwgVm9sdW1l IicpIGRvICgNCmVjaG8gIiFfb0lkcyEiIHwgZmluZCAvaSAiICUlYSAiICVudWwxJSB8fCAoc2V0ICJfb0lkcz0gIV9vSWRzISAlJWEgIikNCikNCg0Kc2V0 ICJfb0xQYXRoPSVfb1Jvb3QlXExpY2Vuc2VzIg0Kc2V0ICJfb0ludGVncmF0b3I9JV9vUm9vdCVcaW50ZWdyYXRpb25caW50ZWdyYXRvci5leGUiDQoNCmVj aG86DQplY2hvIFByb2Nlc3NpbmcgT2ZmaWNlLi4uICAgICAgICAgICAgICAgICAgICBbQzJSIF58ICVfdmVyc2lvbiUgXnwgJV9vQXJjaCVdDQoNCmlmIG5v dCBkZWZpbmVkIF9vSWRzICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJDaGVja2luZyBJbnN0YWxsZWQgUHJvZHVjdHMgICAgICAgICAgICAgW1Byb2R1Y3Qg SURzIG5vdCBmb3VuZC4gQWJvcnRpbmcgYWN0aXZhdGlvbi4uLl0iDQpzZXQgZXJyb3I9MQ0KZ290byA6a3Nfc3RhcnRvMTZjMnINCikNCg0KY2FsbCA6b2hf ZXhwaXJlZHByZXZpZXcgMjAxMw0KaWYgIiVfYWN0cHJvanZpcyUiPT0iMCIgY2FsbCA6b2hfZml4cHJpZHMNCmNhbGwgOmtzX3Byb2Nlc3MNCg0KOjo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjprc19zdGFydG8xNmMycg0KDQo6OiAgUHJvY2VzcyBPZmZpY2UgMTYuMCBD MlINCg0KaWYgbm90IGRlZmluZWQgbzE2YzJyIGdvdG8gOmtzX3N0YXJ0bXNpDQoNCmNhbGwgOmtzX3Jlc2V0DQpjYWxsIDpka19hY3RpZHMgMGZmMWNlMTUt YTk4OS00NzlkLWFmNDYtZjI3NWM2MzcwNjYzDQoNCnNldCBvVmVyPTE2DQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkg JW8xNmMycl9yZWclIC92IEluc3RhbGxQYXRoIiAlbnVsNiUnKSBkbyAoc2V0ICJfb1Jvb3Q9JSViXHJvb3QiKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIq IiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFBsYXRmb3JtIiAlbnVsNiUnKSBkbyAoc2V0ICJfb0FyY2g9JSVi IikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBWZXJzaW9uVG9S ZXBvcnQiICVudWw2JScpIGRvIChzZXQgIl92ZXJzaW9uPSUlYiIpDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8x NmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgQXVkaWVuY2VEYXRhIiAlbnVsNiUnKSBkbyAoc2V0ICJfQXVkaWVuY2VEYXRhPV58ICUlYiAiKQ0KZm9yIC9m ICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFByb2R1Y3RSZWxlYXNlSWRzIiAl bnVsNiUnKSBkbyAoc2V0ICJfcHJpZHM9JW8xNmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgUHJvZHVjdFJlbGVhc2VJZHMiICYgc2V0ICJfY29uZmlnPSVv MTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIikNCg0KZWNobyAiJW8xNmMycl9yZWclIiB8IGZpbmQgL2kgIldvdzY0MzJOb2RlIiAlbnVsMSUgJiYgKHNldCBf dG9rPTkpIHx8IChzZXQgX3Rvaz04KQ0KZm9yIC9mICJ0b2tlbnM9JV90b2slIGRlbGltcz1cIiAlJWEgaW4gKCdyZWcgcXVlcnkgIiVvMTZjMnJfcmVnJVxQ cm9kdWN0UmVsZWFzZUlEcyIgL3MgL2YgIi4xNiIgL2sgJW51bDYlIF58IGZpbmRzdHIgL2kgIlJldGFpbCBWb2x1bWUiJykgZG8gKA0KZWNobyAiIV9vSWRz ISIgfCBmaW5kIC9pICIgJSVhICIgJW51bDElIHx8IChzZXQgIl9vSWRzPSAhX29JZHMhICUlYSAiKQ0KKQ0Kc2V0IF9vSWRzPSVfb0lkczouMTY9JQ0Kc2V0 IF9vMTZjMnJJZHM9JV9vSWRzJQ0KDQpzZXQgIl9vTFBhdGg9JV9vUm9vdCVcTGljZW5zZXMxNiINCnNldCAiX29JbnRlZ3JhdG9yPSVfb1Jvb3QlXGludGVn cmF0aW9uXGludGVncmF0b3IuZXhlIg0KDQplY2hvOg0KZWNobyBQcm9jZXNzaW5nIE9mZmljZS4uLiAgICAgICAgICAgICAgICAgICAgW0MyUiBefCAlX3Zl cnNpb24lICVfQXVkaWVuY2VEYXRhJV58ICVfb0FyY2glXQ0KDQppZiBub3QgZGVmaW5lZCBfb0lkcyAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hlY2tp bmcgSW5zdGFsbGVkIFByb2R1Y3RzICAgICAgICAgICAgIFtQcm9kdWN0IElEcyBub3QgZm91bmQuIEFib3J0aW5nIGFjdGl2YXRpb24uLi5dIg0Kc2V0IGVy cm9yPTENCmdvdG8gOmtzX3N0YXJ0bXNpDQopDQoNCmNhbGwgOm9oX2V4cGlyZWRwcmV2aWV3IDIwMTYgMjAxOSAyMDIxIDIwMjQNCmlmICIlX2FjdHByb2p2 aXMlIj09IjAiIGNhbGwgOm9oX2ZpeHByaWRzDQpjYWxsIDprc19wcm9jZXNzDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQ0KDQo6a3Nfc3RhcnRtc2kNCg0KaWYgZGVmaW5lZCBvMTRtc2kgY2FsbCA6b2hfc2V0c3BwIDE0DQppZiBkZWZpbmVkIG8xNG1zaSBjYWxsIDpr c19wcm9jZXNzbXNpIDE0ICVvMTRtc2lfcmVnJQ0KY2FsbCA6b2hfc2V0c3BwDQppZiBkZWZpbmVkIG8xNW1zaSBjYWxsIDprc19wcm9jZXNzbXNpIDE1ICVv MTVtc2lfcmVnJQ0KaWYgZGVmaW5lZCBvMTZtc2kgY2FsbCA6a3NfcHJvY2Vzc21zaSAxNiAlbzE2bXNpX3JlZyUNCg0KOjo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmVjaG86DQpjYWxsIDpvaF9jbGVhcmJsb2NrDQppZiAiJW8xNm1zaSUlbzE1bXNpJSI9PSIiIGlmIG5v dCAiJW8xNnV3cCUlbzE2YzJyJSVvMTVjMnIlIj09IiIgaWYgIiVrZXllcnJvciUiPT0iMCIgaWYgJV9Ob0VkaXRpb25DaGFuZ2UlPT0wIGNhbGwgOm9oX3Vu aW5zdGtleQ0KY2FsbCA6b2hfbGljcmVmcmVzaA0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOmtzX2Fj dGl2YXRlDQoNCjo6ICBPcHQgb3V0IG9mIHNlbmRpbmcgS01TY2xpZW50IGFjdGl2YXRpb24gZGF0YSB0byBNaWNyb3NvZnQNCjo6ICBodHRwczovL2xlYXJu Lm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy9wcml2YWN5L21hbmFnZS1jb25uZWN0aW9ucy1mcm9tLXdpbmRvd3Mtb3BlcmF0aW5nLXN5c3RlbS1jb21w b25lbnRzLXRvLW1pY3Jvc29mdC1zZXJ2aWNlcyMxOS1zb2Z0d2FyZS1wcm90ZWN0aW9uLXBsYXRmb3JtDQoNCmlmICV3aW5idWlsZCUgR0VRIDk2MDAgKA0K cmVnIGFkZCAiSEtMTVxTT0ZUV0FSRVxQb2xpY2llc1xNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTb2Z0d2FyZSBQcm90ZWN0aW9uIFBs YXRmb3JtIiAvdiBOb0dlblRpY2tldCAvdCBSRUdfRFdPUkQgL2QgMSAvZiAlbnVsJQ0KaWYgJXdpbmJ1aWxkJSBFUVUgMTQzOTMgcmVnIGFkZCAiSEtMTVxT T0ZUV0FSRVxQb2xpY2llc1xNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTb2Z0d2FyZSBQcm90ZWN0aW9uIFBsYXRmb3JtIiAvdiBOb0Fj cXVpcmVHVCAvdCBSRUdfRFdPUkQgL2QgMSAvZiAlbnVsJQ0KZWNobyBUdXJuIG9mZiAlS1MlIEFWUyBWYWxpZGF0aW9uICAgICAgICAgICAgIFtTdWNjZXNz ZnVsXQ0KKQ0KDQpzZXQgInNscD1Tb2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3QiDQpzZXQgIm9zcHA9T2ZmaWNlU29mdHdhcmVQcm90ZWN0aW9uUHJvZHVjdCIN Cg0KZWNobzoNCmVjaG8gQWN0aXZhdGluZyBWb2x1bWUgUHJvZHVjdHMuLi4NCmlmICVfYWN0d2luJT09MSBjYWxsIDpfdGFza2dldGlkcyBzcHB3aWQgJXNs cCUgd2luZG93cw0KaWYgJV9hY3RvZmYlPT0xIGNhbGwgOl90YXNrZ2V0aWRzIHNwcG9pZCAlc2xwJSBvZmZpY2UNCmlmICVfYWN0b2ZmJT09MSBjYWxsIDpf dGFza2dldGlkcyBvc3BwaWQgJW9zcHAlIG9mZmljZQ0KDQppZiBub3QgZGVmaW5lZCBzcHB3aWQgaWYgbm90IGRlZmluZWQgc3Bwb2lkIGlmIG5vdCBkZWZp bmVkIG9zcHBpZCAoDQppZiBub3QgZGVmaW5lZCBrZXllcnJvciAoDQplY2hvIE5vIGluc3RhbGxlZCBWb2x1bWUgV2luZG93cyAvIE9mZmljZSBwcm9kdWN0 cyBmb3VuZC4NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiRmFpbGVkIHRvIGdldCBpbnN0YWxsZWQgVm9sdW1lIFdpbmRvd3MgLyBPZmZpY2Ug cHJvZHVjdHMuIg0KKQ0KY2FsbCA6X3Rhc2tnZXRzZXJ2DQpjYWxsIDpfdGFza3JlZ3NlcnYNCikNCg0KY2FsbCA6X3Rhc2thY3QNCmlmIG5vdCBkZWZpbmVk IHNob3dmaXggaWYgZGVmaW5lZCBfdHNlcnJvciAoY2FsbCA6ZGtfY29sb3IgJUJsdWUlICIlX2ZpeG1zZyUiICYgc2V0IHNob3dmaXg9MSkNCg0KOjogIERv bid0IGNyZWF0ZSByZW5ld2FsIHRhc2sgaWYgV2luZG93cy9PZmZpY2Ugdm9sdW1lIElEcyBhcmUgbm90IGZvdW5kLCBldmVuIGlmIHNjcmlwdCBpcyBzZXQg dG8gY3JlYXRlIGl0IGJ5IGRlZmF1bHQNCjo6ICBEb24ndCBjcmVhdGUgcmVuZXdhbCB0YXNrIGlmIG9ubHkgV2luZG93cyB2b2x1bWUgSUQgaXMgZm91bmQg YW5kIE9FTSBCSU9TIGVycm9yIGlzIHByZXNlbnQgb24gV2luZG93cyA3LCBldmVuIGlmIHNjcmlwdCBpcyBzZXQgdG8gY3JlYXRlIGl0IGJ5IGRlZmF1bHQN Cg0Kc2V0IF9kZWx0YXNrPQ0KaWYgbm90ICVfbm9yZW50c2slPT0wIHNldCBfZGVsdGFzaz0xDQppZiBub3QgZGVmaW5lZCBfZGVsdGFzayAoDQppZiAlX2Fj dHdpbiU9PTAgY2FsbCA6X3Rhc2tnZXRpZHMgc3Bwd2lkICVzbHAlIHdpbmRvd3MNCmlmICVfYWN0b2ZmJT09MCBjYWxsIDpfdGFza2dldGlkcyBzcHBvaWQg JXNscCUgb2ZmaWNlDQppZiAlX2FjdG9mZiU9PTAgY2FsbCA6X3Rhc2tnZXRpZHMgb3NwcGlkICVvc3BwJSBvZmZpY2UNCikNCg0KaWYgbm90IGRlZmluZWQg c3Bwd2lkIGlmIG5vdCBkZWZpbmVkIHNwcG9pZCBpZiBub3QgZGVmaW5lZCBvc3BwaWQgKHNldCBfZGVsdGFzaz0xKQ0KaWYgZGVmaW5lZCBvZW1lcnIgaWYg bm90IGRlZmluZWQgc3Bwb2lkIGlmIG5vdCBkZWZpbmVkIG9zcHBpZCAoc2V0IF9kZWx0YXNrPTEpDQoNCmlmIG5vdCBkZWZpbmVkIF9kZWx0YXNrICgNCmNh bGwgOmtzX3JlbmV3YWwNCikgZWxzZSAoDQppZiBleGlzdCAiJVByb2dyYW1GaWxlcyVcQWN0aXZhdGlvbi1SZW5ld2FsXEFjdGl2YXRpb25fdGFzay5jbWQi IGNhbGwgOmRrX2NvbG9yICVHcmF5JSAiRGVsZXRpbmcgYWN0aXZhdGlvbiByZW5ld2FsIHRhc2suLi4iDQpjYWxsIDpka19jb2xvciAlR3JheSUgIlNraXBw aW5nIGNyZWF0aW9uIG9mIGFjdGl2YXRpb24gcmVuZXdhbCB0YXNrLi4uIg0KY2FsbCA6a3NfY2xlYXJzdHVmZiAlbnVsJQ0KaWYgbm90IGRlZmluZWQgX3Nl cnZlciAoDQppZiAld2luYnVpbGQlIEdFUSA5MjAwICgNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSBIS0xNXFNPRlRX QVJFXE1pY3Jvc29mdFxPZmZpY2VcQ2xpY2tUb1J1biAvdiBJbnN0YWxsUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzMTZc UHJvUGx1cyoueHJtLW1zIiBzZXQgIl9DMTZSPTEiDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgSEtMTVxTT0ZUV0FS RVxNaWNyb3NvZnRcT2ZmaWNlXENsaWNrVG9SdW4gL3YgSW5zdGFsbFBhdGggL3JlZzozMiIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vu c2VzMTZcUHJvUGx1cyoueHJtLW1zIiBzZXQgIl9DMTZSPTEiDQppZiBkZWZpbmVkIF9DMTZSICgNClJFTSAgbWFzc3t9Z3JhdmV7ZG90fWRldi9vZmZpY2Ut bGljZW5zZS1pcy1ub3QtZ2VudWluZQ0Kc2V0IF9zZXJ2ZXI9MTAuMC4wLjEwDQpjYWxsIDpfdGFza3JlZ3NlcnYNCmVjaG8gS2VlcGluZyB0aGUgbm9uLWV4 aXN0ZW50IElQIGFkZHJlc3MgMTAuMC4wLjEwIGFzICVLUyUgU2VydmVyLg0KKQ0KKQ0KaWYgbm90IGRlZmluZWQgX0MxNlIgKA0KY2FsbCA6X3Rhc2tjbGVh ci1jYWNoZQ0KZWNobyBDbGVhcmVkICVLUyUgU2VydmVyIGZyb20gdGhlIHJlZ2lzdHJ5Lg0KKQ0KKQ0KKQ0KDQo6OiAgaHR0cHM6Ly9sZWFybi5taWNyb3Nv ZnQuY29tL2VuLXVzL2F6dXJlL3ZpcnR1YWwtZGVza3RvcC93aW5kb3dzLTEwLW11bHRpc2Vzc2lvbi1mYXENCg0KaWYgJV9hY3R3aW4lPT0xIGZvciAlJSMg aW4gKDQwNykgZG8gaWYgJW9zU0tVJT09JSUjICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICIld2lub3MlIGRvZXMgbm90IHN1cHBvcnQgYWN0aXZhdGlvbiBv biBub24tYXp1cmUgcGxhdGZvcm1zLiINCikNCg0KaWYgJV9hY3RvZmYlPT0xIGlmIGRlZmluZWQgc3Bwb2lkIGlmIG5vdCBkZWZpbmVkIF90c2Vycm9yIGlm ICVfTm9FZGl0aW9uQ2hhbmdlJT09MCBpZiBkZWZpbmVkIG9odWIgKA0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiT2ZmaWNlIGFwcHMgc3VjaCBh cyBXb3JkLCBFeGNlbCBhcmUgYWN0aXZhdGVkLCB1c2UgdGhlbSBkaXJlY3RseS4gSWdub3JlICdCdXknIGJ1dHRvbiBpbiBPZmZpY2UgZGFzaGJvYXJkIGFw cC4iDQopDQoNCjo6ICBUcmlnZ2VyIHJlZXZhbHVhdGlvbiBvZiBTUFAncyBTY2hlZHVsZWQgVGFza3MNCg0KY2FsbCA6ZGtfcmVldmFsICVudWwlDQpnb3Rv IDpka19kb25lDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6a3NfaXANCg0KY2xzDQpzZXQgX3NlcnZl cj0NCmVjaG86DQplY2hvIEVudGVyIC8gUGFzdGUgdGhlICVLUyUgU2VydmVyIGFkZHJlc3MsIG9yIGp1c3QgcHJlc3MgRW50ZXIgdG8gcmV0dXJuOg0KZWNo bzoNCnNldCAvcCBfc2VydmVyPQ0KaWYgbm90IGRlZmluZWQgX3NlcnZlciBnb3RvIDprc19tZW51DQpzZXQgIl9zZXJ2ZXI9JV9zZXJ2ZXI6ID0lIg0KDQpl Y2hvOg0KZWNobyBFbnRlciAvIFBhc3RlIHRoZSAlS1MlIFBvcnQgYWRkcmVzcywgb3IganVzdCBwcmVzcyBFbnRlciB0byB1c2UgZGVmYXVsdDoNCmVjaG86 DQpzZXQgL3AgX3BvcnQ9DQppZiBub3QgZGVmaW5lZCBfcG9ydCBnb3RvIDprc19tZW51DQpzZXQgIl9wb3J0PSVfcG9ydDogPSUiDQoNCmdvdG8gOmtzX21l bnUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjprc19yZXNldA0KDQpzZXQga2V5PQ0Kc2V0IF9vUm9v dD0NCnNldCBfb0FyY2g9DQpzZXQgX29JZHM9DQpzZXQgX29MUGF0aD0NCnNldCBfYWN0aWQ9DQpzZXQgX3Byb2Q9DQpzZXQgX2xpYz0NCnNldCBfYXJyPQ0K c2V0IF9wcmlkcz0NCnNldCBfY29uZmlnPQ0Kc2V0IF92ZXJzaW9uPQ0Kc2V0IF9MaWNlbnNlPQ0Kc2V0IF9vTVNJPQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIEFmdGVyIHJldGFpbCB0byB2b2x1bWUgY29udmVyc2lvbiwgbmV3IHByb2R1 Y3QgSUQgbmVlZHMgLk9TUFBSZWFkeSBrZXkgaW4gcmVnaXN0cnksIG90aGVyd2lzZSBwcm9kdWN0IGluZm8gbWF5IG5vdCBmdWxseSByZWZsZWN0IA0KDQo6 a3Nfb3NwcHJlYWR5DQoNCmlmIG5vdCBkZWZpbmVkIF9jb25maWcgZXhpdCAvYg0KDQplY2hvOiAlX2NvbmZpZyUgfCBmaW5kIC9pICJwcm9wZXJ0eUJhZyIg JW51bDElICYmICgNCnNldCAiX29zcHB0PVJFR19EV09SRCINCnNldCAiX29zcHByZWFkeT0lbzE1YzJyX3JlZyUiDQopIHx8ICgNCnNldCAiX29zcHB0PVJF R19TWiINCnNldCAiX29zcHByZWFkeT0lX2NvbmZpZyUiDQopDQoNCnJlZyBhZGQgJV9vc3BwcmVhZHklIC9mIC92ICVfYWx0b2ZmaWQlLk9TUFBSZWFkeSAv dCAlX29zcHB0JSAvZCAxICVudWwxJQ0KDQo6OiAgT2ZmaWNlIGJ1aWxkcyBiZWZvcmUgMTYuMC4xMDczMC4yMDEwMiBuZWVkIHRoZSBJbnN0YWxsZWQgbGlj ZW5zZSBwcm9kdWN0IElEIGluIFByb2R1Y3RSZWxlYXNlSWRzLCBvdGhlcndpc2UgcHJvZHVjdCBpbmZvIG1heSBub3QgZnVsbHkgcmVmbGVjdCANCg0KaWYg ZXhpc3QgIiVfb0xQYXRoJVxXb3JkMjAxOVZMX0tNU19DbGllbnRfQUUqLnhybS1tcyIgZXhpdCAvYg0KDQpyZWcgcXVlcnkgJV9wcmlkcyUgfCBmaW5kc3Ry IC9JICIlX2FsdG9mZmlkJSIgJW51bDElDQppZiAlZXJyb3JsZXZlbCUgTkVRIDAgKA0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCdyZWcg cXVlcnkgJV9wcmlkcyUnKSBkbyByZWcgYWRkICVfcHJpZHMlIC90IFJFR19TWiAvZCAiJSViLCVfYWx0b2ZmaWQlIiAvZiAlbnVsMSUNCikNCmV4aXQgL2IN Cg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpvaF9zZXRzcHANCg0Kc2V0IGlzT3NwcD0NCmlmICV3aW5i dWlsZCUgR0VRIDkyMDAgKA0Kc2V0IHNwcD1Tb2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3QNCnNldCBzcHM9U29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlDQopIGVs c2UgKA0Kc2V0IGlzT3NwcD0xDQpzZXQgc3BwPU9mZmljZVNvZnR3YXJlUHJvdGVjdGlvblByb2R1Y3QNCnNldCBzcHM9T2ZmaWNlU29mdHdhcmVQcm90ZWN0 aW9uU2VydmljZQ0KKQ0KaWYgIiUxIj09IjE0IiAoDQpzZXQgaXNPc3BwPTENCnNldCBzcHA9T2ZmaWNlU29mdHdhcmVQcm90ZWN0aW9uUHJvZHVjdA0Kc2V0 IHNwcz1PZmZpY2VTb2Z0d2FyZVByb3RlY3Rpb25TZXJ2aWNlDQopDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQ0KDQo6a3NfcHJvY2Vzcw0KDQpmb3IgJSUjIGluICglX29JZHMlKSBkbyAoDQoNCnNldCBza2lwcHJvY2Vzcz0NCmlmICVfTm9FZGl0aW9u Q2hhbmdlJT09MSBpZiBub3QgZGVmaW5lZCBfb01TSSAoDQpzZXQgZm91bmRwcm9kPQ0KY2FsbCA6a3NkYXRhIGNoa3Byb2QgJSUjDQppZiBub3QgZGVmaW5l ZCBmb3VuZHByb2QgKA0Kc2V0IHNraXBwcm9jZXNzPTENCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiU2tpcHBpbmcgQmVjYXVzZSBOb0VkaXRpb25DaGFuZ2Ug TW9kZSAgIFslJSNdIg0KKQ0KKQ0KDQoNCmlmICIlX2FjdHByb2p2aXMlIj09IjEiIGlmIG5vdCBkZWZpbmVkIHNraXBwcm9jZXNzICgNCmVjaG8gJSUjIHwg ZmluZHN0ciAvaSAiUHJvamVjdCBWaXNpbyIgJW51bCUgfHwgKA0Kc2V0IHNraXBwcm9jZXNzPTENCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiU2tpcHBpbmcg QmVjYXVzZSBQcm9qZWN0L1Zpc2lvIE1vZGUgICAgIFslJSNdIg0KKQ0KKQ0KDQppZiAiJV9hY3Rwcm9qdmlzJSI9PSIwIiBpZiBub3QgZGVmaW5lZCBza2lw cHJvY2VzcyBlY2hvICVfb0lkcyUgfCBmaW5kc3RyIC9pICJPMzY1IiAlbnVsJSAmJiAoDQplY2hvICUlIyB8IGZpbmRzdHIgL2kgIlByb2plY3QgVmlzaW8i ICVudWwlICYmICgNCnNldCBza2lwcHJvY2Vzcz0xDQplY2hvIFNraXBwaW5nIEJlY2F1c2UgTW9uZG8gSXMgQXZhaWxhYmxlICAgICBbJSUjXQ0KKQ0KKQ0K DQppZiBub3QgZGVmaW5lZCBza2lwcHJvY2VzcyAoDQpzZXQga2V5PQ0Kc2V0IF9hY3RpZD0NCnNldCBfcHJldmlldz0NCnNldCBfTGljZW5zZT0lJSMNCnNl dCBfYWx0b2ZmaWQ9DQoNCmVjaG8gJSUjIHwgZmluZCAvaSAiMjAyNCIgJW51bCUgJiYgKA0KaWYgZXhpc3QgIiFfb0xQYXRoIVxQcm9QbHVzMjAyNFByZXZp ZXdWTF8qLnhybS1tcyIgaWYgbm90IGV4aXN0ICIhX29MUGF0aCFcUHJvUGx1czIwMjRWTF8qLnhybS1tcyIgc2V0IF9wcmV2aWV3PS1QcmV2aWV3DQopDQpz ZXQgX3Byb2Q9JSUjIV9wcmV2aWV3IQ0KDQpjYWxsIDprc2RhdGEgZ2V0aW5mbyAhX3Byb2QhDQoNCmlmIGRlZmluZWQgX2FsdG9mZmlkICgNCnNldCBfTGlj ZW5zZT0hX2FsdG9mZmlkIQ0KZWNobyBDb252ZXJ0aW5nIFJldGFpbCBUbyBWb2x1bWUgICAgICAgICAgICAgWyFfcHJvZCEgVG8gIV9hbHRvZmZpZCFdDQpl Y2hvICUlIyB8IGZpbmQgL2kgIk8zNjUiICVudWwlICYmICgNCmlmICIlb1ZlciUiPT0iMTUiIChjYWxsIDpka19jb2xvciAlR3JheSUgIk1vbmRvIDIwMTMg aXMgZXF1aXZhbGVudCB0byBPMzY1IFsxNS4wIHZlcnNpb25dIGluIHRlcm1zIG9mIHRoZSBsYXRlc3QgZmVhdHVyZXMuIikNCmlmICIlb1ZlciUiPT0iMTYi IChjYWxsIDpka19jb2xvciAlR3JheSUgIk1vbmRvIDIwMTYgaXMgZXF1aXZhbGVudCB0byBPMzY1IGluIHRlcm1zIG9mIHRoZSBsYXRlc3QgZmVhdHVyZXMu IikNCikNCnNldCBfcHJvZD0hX2FsdG9mZmlkIQ0KY2FsbCA6a3Nfb3NwcHJlYWR5DQopDQoNCmlmIG5vdCAiIWtleSEiPT0iIiAoDQplY2hvICIhYWxsYXBw cyEiIHwgZmluZCAvaSAiIV9hY3RpZCEiICVudWwxJSB8fCBjYWxsIDpvaF9pbnN0YWxsbGljDQpzZXQgZ2VuZXJpY2tleT0xDQpjYWxsIDpka19pbnNrZXkg Ilsha2V5IV0gWyFfcHJvZCFdIg0KKSBlbHNlICgNCmlmIG5vdCBkZWZpbmVkIF9vTVNJICgNCnNldCBlcnJvcj0xDQpjYWxsIDpka19jb2xvciAlUmVkJSAi Q2hlY2tpbmcgUHJvZHVjdCBJbiBTY3JpcHQgICAgICAgICAgICAgIFtPZmZpY2UgJW9WZXIlLjAgIV9wcm9kISBub3QgZm91bmQgaW4gc2NyaXB0XSINCmNh bGwgOmRrX2NvbG9yICVCbHVlJSAiTWFrZSBzdXJlIHlvdSBhcmUgdXNpbmcgTGF0ZXN0IE1BUyBzY3JpcHQuIg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9y ICVSZWQlICJDaGVja2luZyBQcm9kdWN0IEluIFNjcmlwdCAgICAgICAgICAgICAgWyFfcHJvZCEgTVNJIFJldGFpbCBpcyBub3Qgc3VwcG9ydGVkXSINCmNh bGwgOmRrX2NvbG9yICVCbHVlJSAiVXNlIE9ob29rIG9wdGlvbiB0byBhY3RpdmF0ZSBpdC4gVG8gYWN0aXZhdGUgd2l0aCAlS1MlLCB5b3UgbmVlZCB0byBp bnN0YWxsIFZvbHVtZSB2ZXJzaW9uIG9mIE9mZmljZS4iDQopDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWdlbnVpbmUtaW5zdGFsbGF0aW9uLW1lZGlhDQpj YWxsIDpka19jb2xvciAlX1llbGxvdyUgIiVtYXMlZ2VudWluZS1pbnN0YWxsYXRpb24tbWVkaWEiDQopDQopDQopDQoNCmV4aXQgL2INCg0KOjo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjprc19wcm9jZXNzbXNpDQoNCjo6ICBQcm9jZXNzIE9mZmljZSBNU0kgVmVyc2lv bg0KDQpjYWxsIDprc19yZXNldA0Kc2V0IF9vTVNJPTENCg0KaWYgIiUxIj09IjE0IiAoDQpjYWxsIDpka19hY3RpZHMgNTlhNTI4ODEtYTk4OS00NzlkLWFm NDYtZjI3NWM2MzcwNjYzDQopIGVsc2UgKA0KY2FsbCA6ZGtfYWN0aWRzIDBmZjFjZTE1LWE5ODktNDc5ZC1hZjQ2LWYyNzVjNjM3MDY2Mw0KKQ0KDQpzZXQg b1Zlcj0lMQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICUyXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVs NiUnKSBkbyAoc2V0ICJfb1Jvb3Q9JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlMlxDb21tb25cUHJvZHVj dFZlcnNpb24gL3YgTGFzdFByb2R1Y3QiICVudWw2JScpIGRvIChzZXQgIl92ZXJzaW9uPSUlYiIpDQppZiAiJV9vUm9vdDp+LTElIj09IlwiIHNldCAiX29S b290PSVfb1Jvb3Q6fjAsLTElIg0KDQplY2hvICIlMiIgfCBmaW5kIC9pICJXb3c2NDMyTm9kZSIgJW51bDElICYmIHNldCBfb0FyY2g9eDg2DQppZiBub3Qg IiVvc2FyY2glIj09Ing4NiIgaWYgbm90IGRlZmluZWQgX29BcmNoIHNldCBfb0FyY2g9eDY0DQppZiAiJW9zYXJjaCUiPT0ieDg2IiBzZXQgX29BcmNoPXg4 Ng0KDQpjYWxsIDptc2lvZmZpY2VkYXRhICUyDQoNCmVjaG86DQplY2hvIFByb2Nlc3NpbmcgT2ZmaWNlLi4uICAgICAgICAgICAgICAgICAgICBbTVNJIF58 ICVfdmVyc2lvbiUgXnwgJV9vQXJjaCVdDQoNCmlmIG5vdCBkZWZpbmVkIF9vSWRzICgNCnNldCBlcnJvcj0xDQpjYWxsIDpka19jb2xvciAlUmVkJSAiQ2hl Y2tpbmcgSW5zdGFsbGVkIFByb2R1Y3RzICAgICAgICAgICAgIFtQcm9kdWN0IElEcyBub3QgZm91bmQuIEFib3J0aW5nIGFjdGl2YXRpb24uLi5dIg0KZXhp dCAvYg0KKQ0KDQpjYWxsIDprc19wcm9jZXNzDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0K DQo6a3NfdW5pbnN0YWxsDQoNCmNscw0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgbW9kZSA5MSwgMzANCnRpdGxlICBPbmxpbmUgJUtTJSBDb21wbGV0ZSBV bmluc3RhbGwgJW1hc3ZlciUNCg0Kc2V0ICJ1bGluZT1fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18iDQoNCnNldCAiX0MxNlI9Ig0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVn IHF1ZXJ5IEhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XE9mZmljZVxDbGlja1RvUnVuIC92IEluc3RhbGxQYXRoIiAyXj5udWwnKSBkbyBpZiBleGlzdCAiJSVi XHJvb3RcTGljZW5zZXMxNlxQcm9QbHVzKi54cm0tbXMiIHNldCAiX0MxNlI9MSINCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBx dWVyeSBIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2VcQ2xpY2tUb1J1biAvdiBJbnN0YWxsUGF0aCAvcmVnOjMyIiAyXj5udWwnKSBkbyBpZiBleGlz dCAiJSViXHJvb3RcTGljZW5zZXMxNlxQcm9QbHVzKi54cm0tbXMiIHNldCAiX0MxNlI9MSINCmlmICV3aW5idWlsZCUgR0VRIDkyMDAgaWYgZGVmaW5lZCBf QzE2UiAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJOb3RpY2UtIg0KZWNobzoNCmVjaG8gVG8gbWFrZSBzdXJlIE9mZmljZSBwcm9ncmFtcyBk byBub3Qgc2hvdyBhIG5vbi1nZW51aW5lIGJhbm5lciwNCmVjaG8gcGxlYXNlIHJ1biB0aGUgYWN0aXZhdGlvbiBvcHRpb24gb25jZSwgYW5kIGRvbid0IHVu aW5zdGFsbCBhZnRlcndhcmQuDQplY2hvICV1bGluZSUNCikNCg0KZWNobzoNCnNldCBlcnJvcl89DQpjYWxsIDpfdGFza2NsZWFyLWNhY2hlDQpjYWxsIDpr c19jbGVhcnN0dWZmDQoNCjo6IGNoZWNrIEtNUzM4IGxvY2sNCg0KJW51bCUgcmVnIHF1ZXJ5ICJIS0xNXCVTUFBrJVwlX3dBcHAlIiAmJiAoDQpzZXQgZXJy b3JfPTkNCmVjaG8gRmFpbGVkIHRvIGNvbXBsZXRlbHkgY2xlYXIgJUtTJSBDYWNoZS4NCnJlZyBxdWVyeSAiSEtMTVwlU1BQayVcJV93QXBwJSIgL3MgJW51 bDIlIHwgZmluZHN0ciAvaSAiMTI3LjAuMC4yIiAlbnVsMSUgJiYgZWNobyBLTVMzOCBhY3RpdmF0aW9uIGlzIGxvY2tlZC4NCmNhbGwgOmRrX2NvbG9yICVC bHVlJSAiJV9maXhtc2clIg0KZWNobzoNCikgfHwgKA0KZWNobyBDbGVhcmVkICVLUyUgQ2FjaGUgc3VjY2Vzc2Z1bGx5Lg0KKQ0KDQppZiBkZWZpbmVkIGVy cm9yXyAoDQppZiAiJWVycm9yXyUiPT0iMSIgKA0KZWNobyAldWxpbmUlDQolZWxpbmUlDQplY2hvIFRyeSBBZ2FpbiAvIFJlc3RhcnQgdGhlIFN5c3RlbQ0K ZWNobyAldWxpbmUlDQopDQopIGVsc2UgKA0KZWNobyAldWxpbmUlDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyZWVuJSAiT25saW5lICVLUyUgaGFzIGJl ZW4gc3VjY2Vzc2Z1bGx5IHVuaW5zdGFsbGVkLiINCmVjaG86DQpjYWxsIDpka19jb2xvciAlR3JheSUgIklmIHlvdSB3YW50IHRvIHJlc2V0IHRoZSBhY3Rp dmF0aW9uIHN0YXR1cywiDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIiVfZml4bXNnJSINCmVjaG86DQplY2hvICV1bGluZSUNCikNCg0KZ290byA6ZGtfZG9u ZQ0KDQo6a3NfY2xlYXJzdHVmZg0KDQpzZXQgImtleT1IS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNjaGVkdWxl XHRhc2tjYWNoZVx0YXNrcyINCg0KcmVnIHF1ZXJ5ICIla2V5JSIgL2YgUGF0aCAvcyB8IGZpbmQgL2kgIlxBY3RpdmF0aW9uLVJlbmV3YWwiICVudWwxJSAm JiAoDQplY2hvIERlbGV0aW5nIFtUYXNrXSBBY3RpdmF0aW9uLVJlbmV3YWwNCnNjaHRhc2tzIC9kZWxldGUgL3RuIEFjdGl2YXRpb24tUmVuZXdhbCAvZiAl bnVsJQ0KKQ0KDQpyZWcgcXVlcnkgIiVrZXklIiAvZiBQYXRoIC9zIHwgZmluZCAvaSAiXEFjdGl2YXRpb24tUnVuX09uY2UiICVudWwxJSAmJiAoDQplY2hv IERlbGV0aW5nIFtUYXNrXSBBY3RpdmF0aW9uLVJ1bl9PbmNlDQpzY2h0YXNrcyAvZGVsZXRlIC90biBBY3RpdmF0aW9uLVJ1bl9PbmNlIC9mICVudWwlDQop DQoNCklmIGV4aXN0ICIlUHJvZ3JhbUZpbGVzJVxBY3RpdmF0aW9uLVJlbmV3YWxcIiAoDQplY2hvIERlbGV0aW5nIFtGb2xkZXJdICVQcm9ncmFtRmlsZXMl XEFjdGl2YXRpb24tUmVuZXdhbFwNCnJtZGlyIC9zIC9xICIlUHJvZ3JhbUZpbGVzJVxBY3RpdmF0aW9uLVJlbmV3YWxcIiAlbnVsJQ0KKQ0KDQo6OiAgU3R1 ZmYgZnJvbSBvbGQgTUFTIHZlcnNpb25zDQoNCnNjaHRhc2tzIC9kZWxldGUgL3RuIE9ubGluZV8lS1MlX0FjdGl2YXRpb25fU2NyaXB0LVJlbmV3YWwgL2Yg JW51bCUNCnNjaHRhc2tzIC9kZWxldGUgL3RuIE9ubGluZV8lS1MlX0FjdGl2YXRpb25fU2NyaXB0LVJ1bl9PbmNlIC9mICVudWwlDQpkZWwgL2YgL3EgIiVQ cm9ncmFtRGF0YSVcT25saW5lXyVLUyVfQWN0aXZhdGlvbi5jbWQiICVudWwlDQpybWRpciAvcyAvcSAiJVByb2dyYW1EYXRhJVxBY3RpdmF0aW9uLVJlbmV3 YWxcIiAlbnVsJQ0Kcm1kaXIgL3MgL3EgIiVQcm9ncmFtRGF0YSVcT25saW5lXyVLUyVfQWN0aXZhdGlvblwiICVudWwlDQpybWRpciAvcyAvcSAiJXdpbmRp ciVcT25saW5lXyVLUyVfQWN0aXZhdGlvbl9TY3JpcHRcIiAlbnVsJQ0KcmVnIGRlbGV0ZSAiSEtDUlxEZXNrdG9wQmFja2dyb3VuZFxzaGVsbFxBY3RpdmF0 ZSBXaW5kb3dzIC0gT2ZmaWNlIiAvZiAlbnVsJQ0KDQo6OiAgQ2hlY2sgaWYgYWxsIGlzIHJlbW92ZWQNCg0KcmVnIHF1ZXJ5ICIla2V5JSIgL2YgUGF0aCAv cyB8IGZpbmQgL2kgIlxBY3RpdmF0aW9uLVJlbmV3YWwiICVudWwxJSAmJiAoc2V0IGVycm9yXz0xKQ0KcmVnIHF1ZXJ5ICIla2V5JSIgL2YgUGF0aCAvcyB8 IGZpbmQgL2kgIlxBY3RpdmF0aW9uLVJ1bl9PbmNlIiAlbnVsMSUgJiYgKHNldCBlcnJvcl89MSkNCnJlZyBxdWVyeSAiJWtleSUiIC9mIFBhdGggL3MgfCBm aW5kIC9pICJcT25saW5lXyVLUyVfQWN0aXZhdGlvbl9TY3JpcHQiICVudWwxJSAmJiAoc2V0IGVycm9yXz0xKQ0KSWYgZXhpc3QgIiV3aW5kaXIlXE9ubGlu ZV8lS1MlX0FjdGl2YXRpb25fU2NyaXB0XCIgKHNldCBlcnJvcl89MSkNCnJlZyBxdWVyeSAiSEtDUlxEZXNrdG9wQmFja2dyb3VuZFxzaGVsbFxBY3RpdmF0 ZSBXaW5kb3dzIC0gT2ZmaWNlIiAlbnVsJSAmJiAoc2V0IGVycm9yXz0xKQ0KaWYgZXhpc3QgIiVQcm9ncmFtRGF0YSVcT25saW5lXyVLUyVfQWN0aXZhdGlv bi5jbWQiIChzZXQgZXJyb3JfPTEpDQppZiBleGlzdCAiJVByb2dyYW1EYXRhJVxPbmxpbmVfJUtTJV9BY3RpdmF0aW9uXCIgKHNldCBlcnJvcl89MSkNCmlm IGV4aXN0ICIlUHJvZ3JhbURhdGElXEFjdGl2YXRpb24tUmVuZXdhbFwiIChzZXQgZXJyb3JfPTEpDQppZiBleGlzdCAiJVByb2dyYW1GaWxlcyVcQWN0aXZh dGlvbi1SZW5ld2FsXCIgKHNldCBlcnJvcl89MSkNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 DQoNCjpfZXh0cmFjdHRhc2s6DQpAZWNobyBvZmYNCg0KOjogICBSZW5ldyBLLU0tUyBhY3RpdmF0aW9uIHdpdGggT25saW5lIHNlcnZlcnMgdmlhIHNjaGVk dWxlZCB0YXNrDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQ0KOjoNCjo6ICAgSG9tZXBhZ2U6IG17fWFzc2dyYXZle2RvdH1kZXYNCjo6DQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KDQppZiBub3QgIiV+MSI9PSJUYXNrIiAoDQplY2hvOg0KZWNobyA9PT09PT0gRXJyb3Ig PT09PT09DQplY2hvOg0KZWNobyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgcnVuIG9ubHkgYnkgdGhlIHNjaGVkdWxlZCB0YXNrLg0KZWNobzoNCmVj aG8gUHJlc3MgYW55IGtleSB0byBleGl0DQpwYXVzZSA+bnVsDQpleGl0IC9iDQopDQoNCjo6ICBTZXQgRW52aXJvbm1lbnQgdmFyaWFibGVzLCBpdCBoZWxw cyBpZiB0aGV5IGFyZSBtaXNjb25maWd1cmVkIGluIHRoZSBzeXN0ZW0NCg0Kc2V0bG9jYWwgRW5hYmxlRXh0ZW5zaW9ucw0Kc2V0bG9jYWwgRGlzYWJsZURl bGF5ZWRFeHBhbnNpb24NCg0Kc2V0ICJQYXRoRXh0PS5DT007LkVYRTsuQkFUOy5DTUQ7LlZCUzsuVkJFOy5KUzsuSlNFOy5XU0Y7LldTSDsuTVNDIg0KDQpz ZXQgIlN5c1BhdGg9JVN5c3RlbVJvb3QlXFN5c3RlbTMyIg0Kc2V0ICJQYXRoPSVTeXN0ZW1Sb290JVxTeXN0ZW0zMjslU3lzdGVtUm9vdCU7JVN5c3RlbVJv b3QlXFN5c3RlbTMyXFdiZW07JVN5c3RlbVJvb3QlXFN5c3RlbTMyXFdpbmRvd3NQb3dlclNoZWxsXHYxLjBcIg0KaWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxT eXNuYXRpdmVccmVnLmV4ZSIgKA0Kc2V0ICJTeXNQYXRoPSVTeXN0ZW1Sb290JVxTeXNuYXRpdmUiDQpzZXQgIlBhdGg9JVN5c3RlbVJvb3QlXFN5c25hdGl2 ZTslU3lzdGVtUm9vdCU7JVN5c3RlbVJvb3QlXFN5c25hdGl2ZVxXYmVtOyVTeXN0ZW1Sb290JVxTeXNuYXRpdmVcV2luZG93c1Bvd2VyU2hlbGxcdjEuMFw7 JVBhdGglIg0KKQ0KDQpzZXQgIkNvbVNwZWM9JVN5c1BhdGglXGNtZC5leGUiDQpzZXQgIlBTTW9kdWxlUGF0aD0lUHJvZ3JhbUZpbGVzJVxXaW5kb3dzUG93 ZXJTaGVsbFxNb2R1bGVzOyVTeXNQYXRoJVxXaW5kb3dzUG93ZXJTaGVsbFx2MS4wXE1vZHVsZXMiDQoNCj5udWwgZmx0bWMgfHwgZXhpdCAvYg0KDQo6Oj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0Kc2V0IF90c2Vycm9yPQ0Kc2V0IHdpbmJ1aWxkPTENCnNldCAibnVsPT5u dWwgMj4mMSINCmZvciAvZiAidG9rZW5zPTIgZGVsaW1zPVtdIiAlJUcgaW4gKCd2ZXInKSBkbyBmb3IgL2YgInRva2Vucz0yLDMsNCBkZWxpbXM9LiAiICUl SCBpbiAoIiUlfkciKSBkbyBzZXQgIndpbmJ1aWxkPSUlSiINCnNldCBwc2M9cG93ZXJzaGVsbC5leGUgLW5vcCAtYw0KDQpzZXQgX3NsZXhlPXNwcHN2Yy5l eGUmIHNldCBfc2xzZXI9c3Bwc3ZjDQppZiAld2luYnVpbGQlIExFUSA2MzAwIChzZXQgX3NsZXhlPVNMc3ZjLmV4ZSYgc2V0IF9zbHNlcj1TTHN2YykNCmlm ICV3aW5idWlsZCUgTFNTIDc2MDAgaWYgZXhpc3QgIiVTeXNQYXRoJVxTTHN2Yy5leGUiIChzZXQgX3NsZXhlPVNMc3ZjLmV4ZSYgc2V0IF9zbHNlcj1TTHN2 YykNCmlmICVfc2xleGUlPT1TTHN2Yy5leGUgc2V0IF92aXM9MQ0KDQpzZXQgcnVuX29uY2U9DQpzZXQgdF9uYW1lPVJlbmV3YWwgVGFzaw0KcmVnIHF1ZXJ5 ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNjaGVkdWxlXHRhc2tjYWNoZVx0YXNrcyIgL2YgUGF0aCAvcyB8 IGZpbmQgL2kgIlxBY3RpdmF0aW9uLVJ1bl9PbmNlIiA+bnVsICYmICgNCnNldCBydW5fb25jZT0xDQpzZXQgdF9uYW1lPVJ1biBPbmNlIFRhc2sNCikNCg0K c2V0IF93bWljPTANCmZvciAlJSMgaW4gKHdtaWMuZXhlKSBkbyBAaWYgbm90ICIlJX4kUEFUSDojIj09IiIgKA0KY21kIC9jICJ3bWljIHBhdGggV2luMzJf Q29tcHV0ZXJTeXN0ZW0gZ2V0IENyZWF0aW9uQ2xhc3NOYW1lIC92YWx1ZSIgMj5udWwgfCBmaW5kIC9pICJjb21wdXRlcnN5c3RlbSIgMT5udWwgJiYgc2V0 IF93bWljPTENCikNCmlmICV3aW5idWlsZCUgTFNTIDkyMDAgc2V0IF93bWljPTENCg0Kc2V0bG9jYWwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbg0KaWYgZXhp c3QgIiVQcm9ncmFtRmlsZXMlXEFjdGl2YXRpb24tUmVuZXdhbFwiIGNhbGwgOl90YXNrc3RhcnQ+PiIlUHJvZ3JhbUZpbGVzJVxBY3RpdmF0aW9uLVJlbmV3 YWxcTG9ncy50eHQiDQpleGl0DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6X3Rhc2tzdGFydA0KDQpl Y2hvOg0KZWNobyAlZGF0ZSUsICV0aW1lJQ0KDQpzZXQgL2EgbG9vcD0xDQpzZXQgL2EgbWF4X2xvb3A9NA0KDQpjYWxsIDpfdGFza3NldHNlcnYNCg0KOl9p bnRyZXBlYXQNCg0KOjogIENoZWNrIEludGVybmV0IGNvbm5lY3Rpb24uIFdvcmtzIGV2ZW4gaWYgSUNNUCBlY2hvIGlzIGRpc2FibGVkLg0KDQpmb3IgJSVh IGluICglc3J2bGlzdCUpIGRvICgNCmZvciAvZiAiZGVsaW1zPVtdIHRva2Vucz0yIiAlJSMgaW4gKCdwaW5nIC1uIDEgJSVhJykgZG8gKA0KaWYgbm90ICIl JSMiPT0iIiBnb3RvIF90YXNrSW50Q29ubmVjdGVkDQopDQopDQoNCm5zbG9va3VwIGRucy5tc2Z0bmNzaS5jb20gMj5udWwgfCBmaW5kICIxMzEuMTA3LjI1 NS4yNTUiIDE+bnVsDQppZiAiJWVycm9ybGV2ZWwlIj09IjAiIGdvdG8gX3Rhc2tJbnRDb25uZWN0ZWQNCg0KaWYgJWxvb3AlPT0lbWF4X2xvb3AlICgNCnNl dCBfdHNlcnJvcj0xDQpnb3RvIF90YXNrZW5kDQopDQoNCmVjaG86DQplY2hvIEVycm9yOiBJbnRlcm5ldCBpcyBub3QgY29ubmVjdGVkDQplY2hvIFdhaXRp bmcgMzAgc2Vjb25kcw0KDQp0aW1lb3V0IC90IDMwID5udWwNCnNldCAvYSBsb29wPSVsb29wJSsxDQpnb3RvIF9pbnRyZXBlYXQNCg0KOl90YXNrSW50Q29u bmVjdGVkDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjYWxsIDpfdGFza2NsZWFyLWNhY2hlDQoNCjo6 ICBDaGVjayBXTUkgYW5kIHNwcHN2YyBFcnJvcnMNCg0Kc2V0IGFwcGxpc3Q9DQpuZXQgc3RhcnQgJV9zbHNlciUgL3kgJW51bCUNCmlmICVfd21pYyUgRVFV IDEgc2V0ICJjaGthcHA9Zm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSVhIGluICgnIndtaWMgcGF0aCAlc2xwJSB3aGVyZSAoQXBwbGljYXRpb25JRD0n JV93QXBwJScpIGdldCBJRCAvVkFMVUUiIDJePm51bCcpIg0KaWYgJV93bWljJSBFUVUgMCBzZXQgImNoa2FwcD1mb3IgL2YgInRva2Vucz0yIGRlbGltcz09 IiAlJWEgaW4gKCclcHNjJSAiKChbV01JU0VBUkNIRVJdJ1NFTEVDVCBJRCBGUk9NICVzbHAlIFdIRVJFIEFwcGxpY2F0aW9uSUQ9JyclX3dBcHAlJycnKS5H ZXQoKSkuSUQgXnwgJSUge2VjaG8gKCdJRD0nKyRfKX0iIDJePm51bCcpIg0KJWNoa2FwcCUgZG8gKGlmIGRlZmluZWQgYXBwbGlzdCAoY2FsbCBzZXQgImFw cGxpc3Q9IWFwcGxpc3QhICUlYSIpIGVsc2UgKGNhbGwgc2V0ICJhcHBsaXN0PSUlYSIpKQ0KDQppZiBub3QgZGVmaW5lZCBhcHBsaXN0ICgNCnNldCBfdHNl cnJvcj0xDQppZiAlX3dtaWMlIEVRVSAxIHdtaWMgcGF0aCBXaW4zMl9Db21wdXRlclN5c3RlbSBnZXQgQ3JlYXRpb25DbGFzc05hbWUgL3ZhbHVlIDI+bnVs IHwgZmluZCAvaSAiY29tcHV0ZXJzeXN0ZW0iIDE+bnVsDQppZiAlX3dtaWMlIEVRVSAwICVwc2MlICJHZXQtQ0lNSW5zdGFuY2UgLUNsYXNzIFdpbjMyX0Nv bXB1dGVyU3lzdGVtIHwgU2VsZWN0LU9iamVjdCAtUHJvcGVydHkgQ3JlYXRpb25DbGFzc05hbWUiIDI+bnVsIHwgZmluZCAvaSAiY29tcHV0ZXJzeXN0ZW0i IDE+bnVsDQppZiAhZXJyb3JsZXZlbCEgTkVRIDAgKHNldCBlX3dtaXNwcD1XTUksIFNQUCkgZWxzZSAoc2V0IGVfd21pc3BwPVNQUCkNCmVjaG86DQplY2hv IEVycm9yOiBOb3QgUmVzcG9kaW5nLSAhZV93bWlzcHAhDQplY2hvOg0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCg0KOjogIENoZWNrIGluc3RhbGxlZCB2b2x1bWUgcHJvZHVjdHMgYWN0aXZhdGlvbiBJRCdzDQoNCmNhbGwgOl90YXNrZ2V0aWRzIHNwcHdpZCAl c2xwJSB3aW5kb3dzDQpjYWxsIDpfdGFza2dldGlkcyBzcHBvaWQgJXNscCUgb2ZmaWNlDQpjYWxsIDpfdGFza2dldGlkcyBvc3BwaWQgJW9zcHAlIG9mZmlj ZQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KZWNobzoNCmVjaG8gUmVuZXdpbmcgSy1NLVMgYWN0aXZh dGlvbiBmb3IgYWxsIGluc3RhbGxlZCBWb2x1bWUgcHJvZHVjdHMNCg0KaWYgbm90IGRlZmluZWQgc3Bwd2lkIGlmIG5vdCBkZWZpbmVkIHNwcG9pZCBpZiBu b3QgZGVmaW5lZCBvc3BwaWQgKA0KZWNobzoNCmVjaG8gTm8gaW5zdGFsbGVkIFZvbHVtZSBXaW5kb3dzIC8gT2ZmaWNlIHByb2R1Y3QgZm91bmQNCmVjaG86 DQplY2hvIFJlbmV3aW5nIEstTS1TIHNlcnZlcg0KY2FsbCA6X3Rhc2tnZXRzZXJ2DQpjYWxsIDpfdGFza3JlZ3NlcnYNCmdvdG8gOl9za2lwYWN0DQopDQoN Cjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjYWxsIDpfdGFza2FjdA0KDQo6X3NraXBhY3QNCg0KOjo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCmlmIGRlZmluZWQgcnVuX29uY2UgKA0KZWNobzoNCmVjaG8gRGVsZXRpbmcg U2NoZWR1bGVkIFRhc2sgQWN0aXZhdGlvbi1SdW5fT25jZQ0Kc2NodGFza3MgL2RlbGV0ZSAvdG4gQWN0aXZhdGlvbi1SdW5fT25jZSAvZiAlbnVsJQ0KKQ0K DQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOl90YXNrZW5kDQoNCmVjaG86DQplY2hvIEV4aXRpbmcNCmVj aG8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KDQppZiBkZWZpbmVkIF90 c2Vycm9yIChleGl0IC9iIDEyMzQ1Njc4OSkgZWxzZSAoZXhpdCAvYiAwKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCg0KOl9hY3QNCg0Kc2V0IHByb2RuYW1lPQ0KaWYgJV93bWljJSBFUVUgMSBmb3IgL2YgInRva2Vucz0yIGRlbGltcz09IiAlJSMgaW4gKCcid21p YyBwYXRoICFfcGF0aCEgd2hlcmUgSUQ9JyFfYWN0aWQhJyBnZXQgTGljZW5zZUZhbWlseSAvVkFMVUUiIDJePm51bCcpIGRvIChjYWxsIHNldCAicHJvZG5h bWU9JSUjIikNCmlmICVfd21pYyUgRVFVIDAgZm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSUjIGluICgnJXBzYyUgIigoW1dNSVNFQVJDSEVSXSdTRUxF Q1QgTGljZW5zZUZhbWlseSBGUk9NICFfcGF0aCEgV0hFUkUgSUQ9JychX2FjdGlkIScnJykuR2V0KCkpLkxpY2Vuc2VGYW1pbHkgfCAlJSB7ZWNobyAoJ0xp Y2Vuc2VGYW1pbHk9JyskXyl9IiAyXj5udWwnKSBkbyAoY2FsbCBzZXQgInByb2RuYW1lPSUlIyIpDQpmb3IgL2YgInRva2Vucz0xIGRlbGltcz0tXyIgJSVh IGluICgiJXByb2RuYW1lJSIpIGRvIHNldCAicHJvZG5hbWU9JSVhIg0KDQpzZXQgX3Rhc2tza2lwPQ0KaWYgIiVfYWN0cHJvanZpcyUiPT0iMSIgKA0KZWNo bzogJXByb2RuYW1lJSB8IGZpbmQgL2kgIk9mZmljZSIgJW51bCUgJiYgKA0KZWNobzogJXByb2RuYW1lJSB8IGZpbmRzdHIgL2kgIlByb2plY3QgVmlzaW8i ICVudWwlIHx8IChzZXQgX3Rhc2tza2lwPTEmIGV4aXQgL2IpDQopDQopDQoNCmlmIGRlZmluZWQgdF9uYW1lIEFjdGl2YXRpbmc6ICVwcm9kbmFtZSUNCg0K c2V0IGVycm9yY29kZT0xMjM0NQ0Kc2V0IC9hIGFjdF9hdHRlbXB0PTANCg0KOl9hY3QyDQoNCmlmICVhY3RfYXR0ZW1wdCUgR1RSIDQgZXhpdCAvYg0KDQpp ZiBub3QgIiVhY3Rfb2slIj09IjEiICgNCmlmIG5vdCBkZWZpbmVkIF9zZXJ2ZXIgY2FsbCA6X3Rhc2tnZXRzZXJ2DQpjYWxsIDpfdGFza3JlZ3NlcnYNCikN Cg0KaWYgbm90ICFzZXJ2ZXJfbnVtISBHVFIgJW1heF9zZXJ2ZXJzJSAoDQoNCmlmICIlMSI9PSJhY3Rfd2luIiBpZiAlX2ttczM4JSBFUVUgMSAoDQpzZXQg YWN0X29rPTENCmV4aXQgL2INCikNCg0KaWYgJV93bWljJSBFUVUgMSB3bWljIHBhdGggIV9wYXRoISB3aGVyZSBJRD0nIV9hY3RpZCEnIGNhbGwgQWN0aXZh dGUgJW51bCUNCmlmICVfd21pYyUgRVFVIDAgJXBzYyUgInRyeSB7JG51bGw9KChbV01JU0VBUkNIRVJdJ1NFTEVDVCBJRCBGUk9NICFfcGF0aCEgd2hlcmUg SUQ9JychX2FjdGlkIScnJykuR2V0KCkpLkFjdGl2YXRlKCk7IGV4aXQgMH0gY2F0Y2ggeyBleGl0ICRfLkV4Y2VwdGlvbi5Jbm5lckV4Y2VwdGlvbi5IUmVz dWx0IH0iDQoNCmNhbGwgc2V0IGVycm9yY29kZT0hZXJyb3JsZXZlbCENCg0KaWYgIWVycm9yY29kZSEgRVFVIDAgKA0Kc2V0IGFjdF9vaz0xDQpleGl0IC9i DQopDQppZiAiJTEiPT0iYWN0X3dpbiIgaWYgIWVycm9yY29kZSEgRVFVIC0xMDczNDE4MTg3IGlmICV3aW5idWlsZCUgTFNTIDkyMDAgKA0Kc2V0IGFjdF9v az0xDQpleGl0IC9iDQopDQoNCnNldCBhY3Rfb2s9MA0Kc2V0IC9hIGFjdF9hdHRlbXB0Kz0xDQppZiBub3QgZGVmaW5lZCBfc2VydmVyIGdvdG8gX2FjdDIN CikNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpfYWN0aW5mbw0KDQppZiAiJTEiPT0i YWN0X3dpbiIgaWYgbm90IGRlZmluZWQgdF9uYW1lIChzZXQgcHJvZG5hbWU9JXdpbm9zJSkNCg0KaWYgIiUxIj09ImFjdF93aW4iIGlmICVfa21zMzglIEVR VSAxICgNCmlmIGRlZmluZWQgdF9uYW1lICgNCmVjaG8gJXByb2RuYW1lJSBpcyBhbHJlYWR5IGFjdGl2YXRlZCB3aXRoIEtNUzM4Lg0KKSBlbHNlICgNCmNh bGwgOmRrX2NvbG9yICVHcmVlbiUgIiVwcm9kbmFtZSUgaXMgYWxyZWFkeSBhY3RpdmF0ZWQgd2l0aCBLTVMzOC4iDQopDQpleGl0IC9iDQopDQoNCmlmICVl cnJvcmNvZGUlIEVRVSAxMjM0NSAoDQppZiBkZWZpbmVkIHRfbmFtZSAoDQplY2hvICVwcm9kbmFtZSUgYWN0aXZhdGlvbiBmYWlsZWQgZHVlIHRvIHJlc3Ry aWN0ZWQgb3Igbm8gSW50ZXJuZXQuDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIiVwcm9kbmFtZSUgYWN0aXZhdGlvbiBmYWlsZWQgZHVlIHRv IHJlc3RyaWN0ZWQgb3Igbm8gSW50ZXJuZXQuIg0KKQ0Kc2V0IHNob3dmaXg9MQ0Kc2V0IF90c2Vycm9yPTENCmV4aXQgL2INCikNCg0KaWYgJWVycm9yY29k ZSUgRVFVIC0xMDczNDE4MTg3IGlmICIlMSI9PSJhY3Rfd2luIiBpZiAld2luYnVpbGQlIExTUyA5MjAwICgNCmlmIGRlZmluZWQgdF9uYW1lICgNCmVjaG8g JXByb2RuYW1lJSBjYW5ub3QgYmUgS01TLWFjdGl2YXRlZCBvbiB0aGlzIGNvbXB1dGVyIGR1ZSB0byB1bnF1YWxpZmllZCBPRU0gQklPUyBbMHhDMDA0RjAz NV0uDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIiVwcm9kbmFtZSUgY2Fubm90IGJlIEtNUy1hY3RpdmF0ZWQgb24gdGhpcyBjb21wdXRlciBk dWUgdG8gdW5xdWFsaWZpZWQgT0VNIEJJT1MgWzB4QzAwNEYwMzVdLiINCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiVXNlIFRTZm9yZ2UgYWN0aXZhdGlvbiBv cHRpb24gZnJvbSB0aGUgbWFpbiBtZW51LiINCikNCnNldCBvZW1lcnI9MQ0Kc2V0IHNob3dmaXg9MQ0KZXhpdCAvYg0KKQ0KDQppZiAlZXJyb3Jjb2RlJSBF UVUgLTEwNzM0MTgxMjQgKA0KaWYgZGVmaW5lZCB0X25hbWUgKA0KZWNobyAlcHJvZG5hbWUlIGFjdGl2YXRpb24gZmFpbGVkIGR1ZSB0byBJbnRlcm5ldCBp c3N1ZSBbMHhDMDA0RjA3NF0uDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIiVwcm9kbmFtZSUgYWN0aXZhdGlvbiBmYWlsZWQgZHVlIHRvIElu dGVybmV0IGlzc3VlIFsweEMwMDRGMDc0XS4iDQppZiBub3QgZGVmaW5lZCBfdHNlcnJvciAoDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIk1ha2Ugc3VyZSB0 aGF0IHN5c3RlbSBmaWxlcyBhcmUgbm90IGJsb2NrZWQgYnkgZmlyZXdhbGwuIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJJZiB0aGUgaXNzdWUgcGVyc2lz dHMsIHRyeSBhbm90aGVyIEludGVybmV0IGNvbm5lY3Rpb24gb3IgVlBOIHN1Y2ggYXMgaHR0cHM6Ly8xLjEuMS4xIg0KKQ0KKQ0Kc2V0IHNob3dmaXg9MQ0K c2V0IF90c2Vycm9yPTENCmV4aXQgL2INCikNCg0KDQpzZXQgZ3ByPTANCnNldCBncHIyPTANCmNhbGwgOl90YXNrZ2V0Z3JhY2UNCnNldCAvYSAiZ3ByMj0o JWdwciUrMTQ0MC0xKS8xNDQwIg0KDQppZiAlZXJyb3Jjb2RlJSBFUVUgMCBpZiAlZ3ByJSBFUVUgMCAoDQppZiBkZWZpbmVkIHRfbmFtZSAoDQplY2hvICVw cm9kbmFtZSUgYWN0aXZhdGlvbiBzdWNjZWVkZWQsIGJ1dCBSZW1haW5pbmcgUGVyaW9kIGZhaWxlZCB0byBpbmNyZWFzZS4NCikgZWxzZSAoDQpjYWxsIDpk a19jb2xvciAlUmVkJSAiJXByb2RuYW1lJSBhY3RpdmF0aW9uIHN1Y2NlZWRlZCwgYnV0IFJlbWFpbmluZyBQZXJpb2QgZmFpbGVkIHRvIGluY3JlYXNlLiIN CikNCnNldCBfdHNlcnJvcj0xDQpleGl0IC9iDQopDQoNCnNldCBfYWN0cGFzcz0xDQppZiAlZ3ByJSBFUVUgNDMyMDAgIGlmICIlMSI9PSJhY3Rfd2luIiBp ZiAld2luYnVpbGQlIEdFUSA5MjAwIHNldCBfYWN0cGFzcz0wDQppZiAlZ3ByJSBFUVUgNjQ4MDAgIHNldCBfYWN0cGFzcz0wDQppZiAlZ3ByJSBHVFIgMjU5 MjAwIGlmICIlMSI9PSJhY3Rfd2luIiBjYWxsIDpfdGFza2Noa0VudGVycHJpc2VHIF9hY3RwYXNzDQppZiAlZ3ByJSBFUVUgMjU5MjAwIHNldCBfYWN0cGFz cz0wDQoNCmlmICVlcnJvcmNvZGUlIEVRVSAwIGlmICVfYWN0cGFzcyUgRVFVIDAgKA0KaWYgZGVmaW5lZCB0X25hbWUgKA0KZWNobyAlcHJvZG5hbWUlIGlz IHN1Y2Nlc3NmdWxseSBhY3RpdmF0ZWQgZm9yICVncHIyJSBkYXlzLg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVHcmVlbiUgIiVwcm9kbmFtZSUgaXMg c3VjY2Vzc2Z1bGx5IGFjdGl2YXRlZCBmb3IgJWdwcjIlIGRheXMuIg0KKQ0KZXhpdCAvYg0KKQ0KDQpjbWQgL2MgZXhpdCAvYiAlZXJyb3Jjb2RlJQ0KaWYg ZGVmaW5lZCB0X25hbWUgKA0KZWNobyAlcHJvZG5hbWUlIGhhcyBmYWlsZWQgdG8gYWN0aXZhdGUgWzB4IT1FeGl0Q29kZSFdLiBSZW1haW5pbmcgUGVyaW9k OiAlZ3ByMiUgZGF5cyBbJWdwciUgbWludXRlc10uDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIiVwcm9kbmFtZSUgaGFzIGZhaWxlZCB0byBh Y3RpdmF0ZSBbMHghPUV4aXRDb2RlIV0uIFJlbWFpbmluZyBQZXJpb2Q6ICVncHIyJSBkYXlzIFslZ3ByJSBtaW51dGVzXS4iDQopDQpzZXQgX3RzZXJyb3I9 MQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOl90YXNrYWN0DQoNCjo6IENoZWNrIEtN UzM4IGFjdGl2YXRpb24NCg0Kc2V0IGdwcj0wDQpzZXQgX2ttczM4PTANCmlmIGRlZmluZWQgc3Bwd2lkIGlmICV3aW5idWlsZCUgR0VRIDE0MzkzICgNCnNl dCBfcGF0aD0lc2xwJQ0Kc2V0IF9hY3RpZD0lc3Bwd2lkJQ0KY2FsbCA6X3Rhc2tnZXRncmFjZQ0KKQ0KDQppZiAlZ3ByJSBORVEgMCBpZiAlZ3ByJSBHVFIg MjU5MjAwICgNCnNldCBfa21zMzg9MQ0KY2FsbCA6X3Rhc2tjaGtFbnRlcnByaXNlRyBfa21zMzgNCikNCg0KOjogU2V0IHNwZWNpZmljIEstTS1TIGhvc3Qg dG8gTG9jYWwgSG9zdCBzbyB0aGF0IGdsb2JhbCBLLU0tUyBJUCBjYW4gbm90IHJlcGxhY2UgS01TMzggYWN0aXZhdGlvbiBidXQgY2FuIGJlIHVzZWQgd2l0 aCBPZmZpY2UgYW5kIG90aGVyIFdpbmRvd3MgRWRpdGlvbnMuDQoNCmlmICVfa21zMzglIEVRVSAxICgNCiVudWwlIHJlZyBhZGQgIkhLTE1cJVNQUGslXCVf d0FwcCVcJXNwcHdpZCUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2aWNlTmFtZSAvdCBSRUdfU1ogL2QgIjEyNy4wLjAuMiINCiVudWwlIHJlZyBhZGQgIkhL TE1cJVNQUGslXCVfd0FwcCVcJXNwcHdpZCUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2aWNlUG9ydCAvdCBSRUdfU1ogL2QgIjE2ODgiDQopDQoNCmVjaG86 DQppZiBkZWZpbmVkIHNwcHdpZCAoDQpzZXQgX3BhdGg9JXNscCUNCnNldCBfYWN0aWQ9JXNwcHdpZCUNCmNhbGwgOl9hY3QgYWN0X3dpbg0KY2FsbCA6X2Fj dGluZm8gYWN0X3dpbg0KKSBlbHNlICgNCmlmIGRlZmluZWQgdF9uYW1lIGVjaG8gQ2hlY2tpbmc6IFZvbHVtZSB2ZXJzaW9uIG9mIFdpbmRvd3MgaXMgbm90 IGluc3RhbGxlZA0KKQ0KDQppZiBkZWZpbmVkIHNwcG9pZCAoDQpzZXQgX3BhdGg9JXNscCUNCmZvciAlJSMgaW4gKCVzcHBvaWQlKSBkbyAoDQpzZXQgX2Fj dGlkPSUlIw0KY2FsbCA6X2FjdA0KaWYgbm90IGRlZmluZWQgX3Rhc2tza2lwIGNhbGwgOl9hY3RpbmZvDQopDQopDQoNCmlmIGRlZmluZWQgb3NwcGlkICgN CnNldCBfcGF0aD0lb3NwcCUNCmZvciAlJSMgaW4gKCVvc3BwaWQlKSBkbyAoDQpzZXQgX2FjdGlkPSUlIw0KY2FsbCA6X2FjdA0KaWYgbm90IGRlZmluZWQg X3Rhc2tza2lwIGNhbGwgOl9hY3RpbmZvDQopDQopDQoNCmlmIG5vdCBkZWZpbmVkIHNwcG9pZCBpZiBub3QgZGVmaW5lZCBvc3BwaWQgaWYgZGVmaW5lZCB0 X25hbWUgKA0KZWNobzoNCmVjaG8gQ2hlY2tpbmc6IFZvbHVtZSB2ZXJzaW9uIG9mIE9mZmljZSBpcyBub3QgaW5zdGFsbGVkDQopDQoNCmV4aXQgL2INCg0K Ojo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpfdGFza2dldGlkcw0KDQpzZXQgJTE9DQppZiAlX3dtaWMlIEVR VSAxIHNldCAiY2hrYXBwPWZvciAvZiAidG9rZW5zPTIgZGVsaW1zPT0iICUlYSBpbiAoJyJ3bWljIHBhdGggJTIgd2hlcmUgKE5hbWUgbGlrZSAnJSUlMyUl JyBhbmQgRGVzY3JpcHRpb24gbGlrZSAnJSVLTVNDTElFTlQlJScgYW5kIFBhcnRpYWxQcm9kdWN0S2V5IGlzIG5vdCBOVUxMIEFORCBMaWNlbnNlRGVwZW5k c09uIGlzIE5VTEwpIGdldCBJRCAvVkFMVUUiIDJePm51bCcpIg0KaWYgJV93bWljJSBFUVUgMCBzZXQgImNoa2FwcD1mb3IgL2YgInRva2Vucz0yIGRlbGlt cz09IiAlJWEgaW4gKCclcHNjJSAiKChbV01JU0VBUkNIRVJdJ1NFTEVDVCBJRCBGUk9NICUyIFdIRVJFIE5hbWUgbGlrZSAnJyUlJTMlJScnIGFuZCBEZXNj cmlwdGlvbiBsaWtlICcnJSVLTVNDTElFTlQlJScnIGFuZCBQYXJ0aWFsUHJvZHVjdEtleSBpcyBub3QgTlVMTCBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBO VUxMJykuR2V0KCkpLklEIF58ICUlIHtlY2hvICgnSUQ9JyskXyl9IiAyXj5udWwnKSINCiVjaGthcHAlIGRvIChpZiBkZWZpbmVkICUxIChjYWxsIHNldCAi JTE9ISUxISAlJWEiKSBlbHNlIChjYWxsIHNldCAiJTE9JSVhIikpDQpleGl0IC9iDQoNCjpfdGFza2dldGdyYWNlDQoNCnNldCBncHI9MA0KaWYgJV93bWlj JSBFUVUgMSBmb3IgL2YgInRva2Vucz0yIGRlbGltcz09IiAlJSMgaW4gKCcid21pYyBwYXRoICFfcGF0aCEgd2hlcmUgSUQ9JyFfYWN0aWQhJyBnZXQgR3Jh Y2VQZXJpb2RSZW1haW5pbmcgL1ZBTFVFIiAyXj5udWwnKSBkbyBjYWxsIHNldCAiZ3ByPSUlIyINCmlmICVfd21pYyUgRVFVIDAgZm9yIC9mICJ0b2tlbnM9 MiBkZWxpbXM9PSIgJSUjIGluICgnJXBzYyUgIigoW1dNSVNFQVJDSEVSXSdTRUxFQ1QgR3JhY2VQZXJpb2RSZW1haW5pbmcgRlJPTSAhX3BhdGghIHdoZXJl IElEPScnIV9hY3RpZCEnJycpLkdldCgpKS5HcmFjZVBlcmlvZFJlbWFpbmluZyB8ICUlIHtlY2hvICgnR3JhY2VQZXJpb2RSZW1haW5pbmc9JyskXyl9IiAy Xj5udWwnKSBkbyBjYWxsIHNldCAiZ3ByPSUlIyINCmV4aXQgL2INCg0KOl90YXNrY2hrRW50ZXJwcmlzZUcNCg0KZm9yICUlIyBpbiAoZTBiMmQzODMtZDEx Mi00MTNmLThhODAtOTdmMzczYTU4MjBjIGUzODQ1NGZiLTQxYTQtNGY1OS1hNWRjLTI1MDgwZTM1NDczMCkgZG8gKGlmICVzcHB3aWQlPT0lJSMgc2V0ICUx PTApDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2xlYW4gZXhpc3RpbmcgSy1N LVMgY2FjaGUgZnJvbSB0aGUgcmVnaXN0cnkNCg0KOl90YXNrY2xlYXItY2FjaGUNCg0Kc2V0IHc9DQpmb3IgJSUjIGluIChTcHBFJXcleHRDb21PYmouZXhl IHNwcHN2Yy5leGUgU0xzdmMuZXhlKSBkbyAoDQpyZWcgZGVsZXRlICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9u XEltYSV3JWdlIEZpbGUgRXhlY3UldyV0aW9uIE9wdGlvbnNcJSUjIiAvZiAlbnVsJQ0KKQ0KDQpzZXQgIk9QUGs9U09GVFdBUkVcTWljcm9zb2Z0XE9mZmlj ZVNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtIg0KDQppZiAld2luYnVpbGQlIExTUyA3NjAwICgNCnJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3Nv ZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTTCIgJW51bCUgJiYgKA0Kc2V0ICJTUFBrPVNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJl bnRWZXJzaW9uXFNMIg0KKQ0KKQ0KaWYgbm90IGRlZmluZWQgU1BQayAoDQpzZXQgIlNQUGs9U09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVu dFZlcnNpb25cU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0iDQopDQoNCnNldCAic2xwPVNvZnR3YXJlTGljZW5zaW5nUHJvZHVjdCINCnNldCAib3NwcD1P ZmZpY2VTb2Z0d2FyZVByb3RlY3Rpb25Qcm9kdWN0Ig0KDQpzZXQgIl93QXBwPTU1YzkyNzM0LWQ2ODItNGQ3MS05ODNlLWQ2ZWMzZjE2MDU5ZiINCnNldCAi X29BcHA9MGZmMWNlMTUtYTk4OS00NzlkLWFmNDYtZjI3NWM2MzcwNjYzIg0Kc2V0ICJfb0ExND01OWE1Mjg4MS1hOTg5LTQ3OWQtYWY0Ni1mMjc1YzYzNzA2 NjMiDQoNCiVudWwlIHJlZyBkZWxldGUgIkhLTE1cJVNQUGslIiAvZiAvdiBLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUNCiVudWwlIHJlZyBkZWxldGUgIkhL TE1cJVNQUGslIiAvZiAvdiBLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUgL3JlZzozMg0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVwlU1BQayUiIC9mIC92IEtl eU1hbmFnZW1lbnRTZXJ2aWNlUG9ydA0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVwlU1BQayUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2aWNlUG9ydCAvcmVn OjMyDQolbnVsJSByZWcgZGVsZXRlICJIS0xNXCVTUFBrJSIgL2YgL3YgRGlzYWJsZURuc1B1Ymxpc2hpbmcNCiVudWwlIHJlZyBkZWxldGUgIkhLTE1cJVNQ UGslIiAvZiAvdiBEaXNhYmxlS2V5TWFuYWdlbWVudFNlcnZpY2VIb3N0Q2FjaGluZw0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVwlU1BQayVcJV93QXBwJSIg L2YNCmlmICV3aW5idWlsZCUgR0VRIDkyMDAgKA0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVwlU1BQayVcJV9vQXBwJSIgL2YNCiVudWwlIHJlZyBkZWxldGUg IkhLTE1cJVNQUGslXCVfb0FwcCUiIC9mIC9yZWc6MzINCikNCmlmICV3aW5idWlsZCUgR0VRIDk2MDAgKA0KJW51bCUgcmVnIGRlbGV0ZSAiSEtVXFMtMS01 LTIwXCVTUFBrJVwlX3dBcHAlIiAvZg0KJW51bCUgcmVnIGRlbGV0ZSAiSEtVXFMtMS01LTIwXCVTUFBrJVwlX29BcHAlIiAvZg0KKQ0KJW51bCUgcmVnIGRl bGV0ZSAiSEtMTVwlT1BQayUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2aWNlTmFtZQ0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVwlT1BQayUiIC9mIC92IEtl eU1hbmFnZW1lbnRTZXJ2aWNlUG9ydA0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVwlT1BQayUiIC9mIC92IERpc2FibGVEbnNQdWJsaXNoaW5nDQolbnVsJSBy ZWcgZGVsZXRlICJIS0xNXCVPUFBrJSIgL2YgL3YgRGlzYWJsZUtleU1hbmFnZW1lbnRTZXJ2aWNlSG9zdENhY2hpbmcNCiVudWwlIHJlZyBkZWxldGUgIkhL TE1cJU9QUGslXCVfb0ExNCUiIC9mDQolbnVsJSByZWcgZGVsZXRlICJIS0xNXCVPUFBrJVwlX29BcHAlIiAvZg0KDQpleGl0IC9iDQoNCjo6PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6X3Rhc2tyZWdzZXJ2DQoNCmlmIGRlZmluZWQgX3NlcnZlciAoc2V0IEtNU19JUD0l X3NlcnZlciUpDQppZiBub3QgZGVmaW5lZCBfcG9ydCBzZXQgX3BvcnQ9MTY4OA0KDQolbnVsJSByZWcgYWRkICJIS0xNXCVTUFBrJSIgL2YgL3YgS2V5TWFu YWdlbWVudFNlcnZpY2VOYW1lIC90IFJFR19TWiAvZCAiJUtNU19JUCUiDQolbnVsJSByZWcgYWRkICJIS0xNXCVTUFBrJSIgL2YgL3YgS2V5TWFuYWdlbWVu dFNlcnZpY2VOYW1lIC90IFJFR19TWiAvZCAiJUtNU19JUCUiIC9yZWc6MzINCiVudWwlIHJlZyBhZGQgIkhLTE1cJVNQUGslIiAvZiAvdiBLZXlNYW5hZ2Vt ZW50U2VydmljZVBvcnQgL3QgUkVHX1NaIC9kICIlX3BvcnQlIg0KJW51bCUgcmVnIGFkZCAiSEtMTVwlU1BQayUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2 aWNlUG9ydCAvdCBSRUdfU1ogL2QgIiVfcG9ydCUiIC9yZWc6MzINCg0KJW51bCUgcmVnIGFkZCAiSEtMTVwlT1BQayUiIC9mIC92IEtleU1hbmFnZW1lbnRT ZXJ2aWNlTmFtZSAvdCBSRUdfU1ogL2QgIiVLTVNfSVAlIg0KJW51bCUgcmVnIGFkZCAiSEtMTVwlT1BQayUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2aWNl UG9ydCAvdCBSRUdfU1ogL2QgIiVfcG9ydCUiDQoNCmlmICV3aW5idWlsZCUgR0VRIDkyMDAgKA0KJW51bCUgcmVnIGFkZCAiSEtMTVwlU1BQayVcJV9vQXBw JSIgL2YgL3YgS2V5TWFuYWdlbWVudFNlcnZpY2VOYW1lIC90IFJFR19TWiAvZCAiJUtNU19JUCUiDQolbnVsJSByZWcgYWRkICJIS0xNXCVTUFBrJVwlX29B cHAlIiAvZiAvdiBLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUgL3QgUkVHX1NaIC9kICIlS01TX0lQJSIgL3JlZzozMg0KJW51bCUgcmVnIGFkZCAiSEtMTVwl U1BQayVcJV9vQXBwJSIgL2YgL3YgS2V5TWFuYWdlbWVudFNlcnZpY2VQb3J0IC90IFJFR19TWiAvZCAiJV9wb3J0JSINCiVudWwlIHJlZyBhZGQgIkhLTE1c JVNQUGslXCVfb0FwcCUiIC9mIC92IEtleU1hbmFnZW1lbnRTZXJ2aWNlUG9ydCAvdCBSRUdfU1ogL2QgIiVfcG9ydCUiIC9yZWc6MzINCikNCmV4aXQgL2IN Cg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpfdGFza3NldHNlcnYNCg0KOjogIE11bHRpIEstTS1TIHNl cnZlcnMgaW50ZWdyYXRpb24gYW5kIHNlcnZlcnMgcmFuZG9taXphdGlvbg0KDQpzZXQgc3J2bGlzdD0NCnNldCAtPQ0KDQpzZXQgInNydmxpc3Q9a21zLjAz JS0lay5vcmcga21zLWRlZmF1bHQuY2FuZ3MlLSVodWkubmV0IGttcy5zaXglLSV5aW4uY29tIGttcy5tb2UlLSVjbHViLm9yZyBrbXMuY2d0JS0lc29mdC5j b20iDQpzZXQgInNydmxpc3Q9JXNydmxpc3QlIGttcy5pZCUtJWluYS5jbiBrbXMubW9lJS0leXV1a28uY29tIHhpbmNoJS0lZW5nMjEzNjE4LmNuIGttcy5s b2wlLSVpLmJlc3Qga21zLm1jJS0lMDYubmV0Ig0Kc2V0ICJzcnZsaXN0PSVzcnZsaXN0JSBrbXMuMCUtJXQubmV0LmNuIHdpbi5rJS0lbXMucHViIGttcy53 eCUtJWxvc3QuY29tIGttcy5tb2UlLSV5dXVrby50b3Aga21zLmdoJS0leGkuY29tIg0KDQpzZXQgbj0xDQpmb3IgJSVhIGluICglc3J2bGlzdCUpIGRvIChz ZXQgJSVhPSZzZXQgc2VydmVyIW4hPSUlYSZzZXQgL2Egbis9MSkNCnNldCBtYXhfc2VydmVycz0xNQ0Kc2V0IC9hIHNlcnZlcl9udW09MA0KZXhpdCAvYg0K DQo6X3Rhc2tnZXRzZXJ2DQoNCmlmICVzZXJ2ZXJfbnVtJSBnZXEgJW1heF9zZXJ2ZXJzJSAoc2V0IC9hIHNlcnZlcl9udW0rPTEmc2V0IEtNU19JUD0yMjIu MTg0LjkuOTgmZXhpdCAvYikNCnNldCAvYSByYW5kPSVSYW5kb20lJSUoMTUrMS0xKSsxDQppZiBkZWZpbmVkICFzZXJ2ZXIlcmFuZCUhIGdvdG8gOl90YXNr Z2V0c2Vydg0Kc2V0IEtNU19JUD0hc2VydmVyJXJhbmQlIQ0Kc2V0ICFzZXJ2ZXIlcmFuZCUhPTENCg0KOjogIEdldCBJUHY0IGFkZHJlc3Mgb2YgSy1NLVMg c2VydmVyIHRvIHVzZSBmb3IgdGhlIGFjdGl2YXRpb24sIHdvcmtzIGV2ZW4gaWYgSUNNUCBlY2hvIGlzIGRpc2FibGVkLg0KOjogIE1pY3Jvc29mdCBhbmQg QW50aXZpcnVzJ3MgbWF5IGZsYWcgdGhlIGlzc3VlIGlmIHB1YmxpYyBLLU0tUyBzZXJ2ZXIgaG9zdCBuYW1lIGlzIGRpcmVjdGx5IHVzZWQgZm9yIHRoZSBh Y3RpdmF0aW9uLg0KDQpzZXQgL2Egc2VydmVyX251bSs9MQ0KKGZvciAvZiAiZGVsaW1zPVtdIHRva2Vucz0yIiAlJWEgaW4gKCdwaW5nIC00IC1uIDEgJUtN U19JUCUgMl4+bnVsJykgZG8gc2V0ICJLTVNfSVA9JSVhIg0KaWYgIiVLTVNfSVAlIj09IiFLTVNfSVAhIiBmb3IgL2YgImRlbGltcz1bXSB0b2tlbnM9MiIg JSUjIGluICgncGF0aHBpbmcgLTQgLWggMSAtbiAtcCAxIC1xIDEgLXcgMSAlS01TX0lQJSAyXj5udWwnKSBkbyBzZXQgIktNU19JUD0lJSMiDQppZiBub3Qg IiVLTVNfSVAlIj09IiFLTVNfSVAhIiBleGl0IC9iDQpnb3RvIDpfdGFza2dldHNlcnYNCikNCjo6VmVyOjIuNw0KOl9leHRyYWN0dGFzazoNCg0KOjo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjprc19yZW5ld2FsDQoNCnNldCBlcnJvcl89DQpzZXQgIl9kZXN0PSVQcm9n cmFtRmlsZXMlXEFjdGl2YXRpb24tUmVuZXdhbCINCnNldCAia2V5PUhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25c U2NoZWR1bGVcdGFza2NhY2hlXHRhc2tzIg0KDQpjYWxsIDprc19jbGVhcnN0dWZmICVudWwlDQoNCmlmIGRlZmluZWQgZXJyb3JfICgNCnNldCBlcnJvcj0x DQpjYWxsIDpka19jb2xvciAlUmVkJSAiRmFpbGVkIHRvIHJlbW92ZSBwcmV2aW91cyBSZW5ld2FsIFRhc2suIFJlc3RhcnQgc3lzdGVtIC8gVHJ5IGFnYWlu LiINCmV4aXQgL2INCikNCg0KaWYgbm90IGV4aXN0ICIlX2Rlc3QlXCIgbWQgIiVfZGVzdCVcIiAlbnVsJQ0KZm9yIC9mICUlRyBpbiAoJyVwc2MlICJbR3Vp ZF06Ok5ld0d1aWQoKS5HdWlkIicpIGRvIHNldCAicmFuZGd1aWQ9JSVHIg0Kc2V0ICJfdGVtcD0lU3lzdGVtUm9vdCVcVGVtcFwlUmFuZG9tJSVyYW5kZ3Vp ZCUiDQoNCnNldCBuaWw9DQppZiAld2luYnVpbGQlIExTUyA3NjAwIChzZXQgX3Zpc3RhPV92aXN0YSkNCmlmIGV4aXN0ICIlX3RlbXAlXC4qIiBybWRpciAv cyAvcSAiJV90ZW1wJVwiICVudWwlDQptZCAiJV90ZW1wJVwiICVudWwlDQpjYWxsIDprc19SZW5FeHBvcnQgcmVuZXdhbCVfdmlzdGElICIlX3RlbXAlXFJl bmV3YWwueG1sIiBVbmljb2RlDQppZiBub3QgZGVmaW5lZCBfaW50IChjYWxsIDprc19SZW5FeHBvcnQgcnVuX29uY2UlX3Zpc3RhJSAiJV90ZW1wJVxSdW5f T25jZS54bWwiIFVuaWNvZGUpDQpzJW5pbCVjaHQlbmlsJWFza3MgL2NyZSVuaWwlYXRlIC90biAiQWN0aXZhdGlvbi1SZW5ld2FsIiAvcnUgIlNZUyVuaWwl VEVNIiAveG1sICIlX3RlbXAlXFJlbmV3YWwueG1sIiAlbnVsJQ0KaWYgbm90IGRlZmluZWQgX2ludCAocyVuaWwlY2h0JW5pbCVhc2tzIC9jcmUlbmlsJWF0 ZSAvdG4gIkFjdGl2YXRpb24tUnVuX09uY2UiIC9ydSAiU1lTJW5pbCVURU0iIC94bWwgIiVfdGVtcCVcUnVuX09uY2UueG1sIiAlbnVsJSkNCmlmIGV4aXN0 ICIlX3RlbXAlXC4qIiBybWRpciAvcyAvcSAiJV90ZW1wJVwiICVudWwlDQoNCmNhbGwgOmtzX2NyZWF0ZUluZm8udHh0DQolcHNjJSAiJGY9W0lPLkZpbGVd OjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCBcIjpfZXh0cmFjdHRhc2tcOi4qYHJgblwiOyBbaW8uZmlsZV06OldyaXRlQWxsVGV4dCgnJV9kZXN0 JVxBY3RpdmF0aW9uX3Rhc2suY21kJywgJ0A6OiVyYW5kZ3VpZCUnICsgW0Vudmlyb25tZW50XTo6TmV3TGluZSArICRmWzFdLlRyaW0oKSwgW1N5c3RlbS5U ZXh0LkVuY29kaW5nXTo6QVNDSUkpIg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KcmVnIHF1ZXJ5ICIl a2V5JSIgL2YgUGF0aCAvcyB8IGZpbmQgL2kgIlxBY3RpdmF0aW9uLVJlbmV3YWwiID5udWwgfHwgKHNldCBlcnJvcl89MSkNCmlmIG5vdCBkZWZpbmVkIF9p bnQgcmVnIHF1ZXJ5ICIla2V5JSIgL2YgUGF0aCAvcyB8IGZpbmQgL2kgIlxBY3RpdmF0aW9uLVJ1bl9PbmNlIiA+bnVsIHx8IChzZXQgZXJyb3JfPTEpDQoN CklmIG5vdCBleGlzdCAiJV9kZXN0JVxBY3RpdmF0aW9uX3Rhc2suY21kIiAoc2V0IGVycm9yXz0xKQ0KSWYgbm90IGV4aXN0ICIlX2Rlc3QlXEluZm8udHh0 IiAoc2V0IGVycm9yXz0xKQ0KDQppZiBkZWZpbmVkIGVycm9yXyAoDQpzY2h0YXNrcyAvZGVsZXRlIC90biBBY3RpdmF0aW9uLVJlbmV3YWwgL2YgJW51bCUN CnNjaHRhc2tzIC9kZWxldGUgL3RuIEFjdGl2YXRpb24tUnVuX09uY2UgL2YgJW51bCUNCnJtZGlyIC9zIC9xICIlX2Rlc3QlXCIgJW51bCUNCnNldCBlcnJv cj0xDQpjYWxsIDpka19jb2xvciAlUmVkJSAiRmFpbGVkIHRvIGluc3RhbGwgUmVuZXdhbCBUYXNrLiBSZXN0YXJ0IHN5c3RlbSAvIFRyeSBhZ2Fpbi4iDQpl eGl0IC9iDQopDQoNCmlmICIla2V5ZXJyb3IlIj09IjAiIGlmIG5vdCBkZWZpbmVkIF90c2Vycm9yICgNCmNhbGwgOmRrX2NvbG9yICVHcmVlbiUgIlJlbmV3 YWwgVGFzayBmb3IgbGlmZXRpbWUgYWN0aXZhdGlvbiBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIGluICVfZGVzdCUiDQpleGl0IC9iDQopDQplY2hvIFJl bmV3YWwgVGFzayBmb3IgbGlmZXRpbWUgYWN0aXZhdGlvbiBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIGluICVfZGVzdCUNCmV4aXQgL2INCg0KOjogIEV4 dHJhY3QgdGhlIHRleHQgZnJvbSBiYXRjaCBzY3JpcHQgd2l0aG91dCBjaGFyYWN0ZXIgYW5kIGZpbGUgZW5jb2RpbmcgaXNzdWUNCg0KOmtzX1JlbkV4cG9y dA0KDQolcHNjJSAiJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCBcIjolfjFcOi4qYHJgblwiOyBbaW8uZmlsZV06OldyaXRl QWxsVGV4dCgnJX4yJywkZlsxXS5UcmltKCksW1N5c3RlbS5UZXh0LkVuY29kaW5nXTo6JX4zKTsiDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6a3NfY3JlYXRlSW5mby50eHQNCg0KKA0KZWNobyAgIFRoZSB1c2Ugb2YgdGhpcyBzY3JpcHQgaXMg dG8gcmVuZXcgeW91ciBXaW5kb3dzL09mZmljZSBsaWNlbnNlIHVzaW5nIG9ubGluZSBLLU0tUy4NCmVjaG86DQplY2hvICAgSWYgcmVuZXdhbC9hY3RpdmF0 aW9uIFNjaGVkdWxlZCB0YXNrcyB3ZXJlIGNyZWF0ZWQgdGhlbiBmb2xsb3dpbmcgd291bGQgZXhpc3QsDQplY2hvOg0KZWNobyAgIC0gU2NoZWR1bGVkIHRh c2tzDQplY2hvICAgICBBY3RpdmF0aW9uLVJlbmV3YWwgICAgW1JlbmV3YWwgLyBXZWVrbHldDQplY2hvICAgICBBY3RpdmF0aW9uLVJ1bl9PbmNlICAgW0Fj dGl2YXRpb24gVGFzayAtIGRlbGV0ZXMgaXRzZWxmIG9uY2UgYWN0aXZhdGVkXQ0KZWNobyAgICAgVGhlIHNjaGVkdWxlZCB0YXNrcyBydW5zIG9ubHkgaWYg dGhlIHN5c3RlbSBpcyBjb25uZWN0ZWQgdG8gdGhlIEludGVybmV0Lg0KZWNobzoNCmVjaG8gICAtIEZpbGVzDQplY2hvICAgICBDOlxQcm9ncmFtIEZpbGVz XEFjdGl2YXRpb24tUmVuZXdhbFxBY3RpdmF0aW9uX3Rhc2suY21kDQplY2hvICAgICBDOlxQcm9ncmFtIEZpbGVzXEFjdGl2YXRpb24tUmVuZXdhbFxJbmZv LnR4dA0KZWNobyAgICAgQzpcUHJvZ3JhbSBGaWxlc1xBY3RpdmF0aW9uLVJlbmV3YWxcTG9ncy50eHQNCmVjaG8gX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNobzoNCmVjaG8gICBUaGlz IFNjcmlwdCBpcyBhIHBhcnQgb2YgTUFTIHByb2plY3QuDQplY2hvOiAgIA0KZWNobyAgIEhvbWVwYWdlOiBtYXNzJXclZ3JhdmUldyUuZGV2DQopPiIlX2Rl c3QlXEluZm8udHh0Ig0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnJlbmV3YWw6DQo8 P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtMTYiPz4NCjxUYXNrIHZlcnNpb249IjEuMyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29m dC5jb20vd2luZG93cy8yMDA0LzAyL21pdC90YXNrIj4NCiAgPFJlZ2lzdHJhdGlvbkluZm8+DQogICAgPFNvdXJjZT5NaWNyb3NvZnQgQ29ycG9yYXRpb248 L1NvdXJjZT4NCiAgICA8RGF0ZT4xOTk5LTAxLTAxVDEyOjAwOjAwLjM0Mzc1PC9EYXRlPg0KICAgIDxBdXRob3I+V2luZG93c0FkZGljdDwvQXV0aG9yPg0K ICAgIDxWZXJzaW9uPjEuMDwvVmVyc2lvbj4NCiAgICA8RGVzY3JpcHRpb24+T25saW5lIEstTS1TIEFjdGl2YXRpb24tUmVuZXdhbCAtIFdlZWtseSBUYXNr PC9EZXNjcmlwdGlvbj4NCiAgICA8VVJJPlxBY3RpdmF0aW9uLVJlbmV3YWw8L1VSST4NCiAgICA8U2VjdXJpdHlEZXNjcmlwdG9yPkQ6UChBOztGQTs7O1NZ KShBOztGQTs7O0JBKShBOztGUkZYOzs7TFMpKEE7O0ZSRlc7OztTLTEtNS04MC0xMjMyMzEyMTYtMjU5Mjg4MzY1MS0zNzE1MjcxMzY3LTM3NTMxNTE2MzEt NDE3NTkwNjYyOCkoQTs7RlI7OztTLTEtNS00KTwvU2VjdXJpdHlEZXNjcmlwdG9yPg0KICA8L1JlZ2lzdHJhdGlvbkluZm8+DQogIDxUcmlnZ2Vycz4NCiAg ICA8Q2FsZW5kYXJUcmlnZ2VyPg0KICAgICAgPFN0YXJ0Qm91bmRhcnk+MTk5OS0wMS0wMVQxMjowMDowMDwvU3RhcnRCb3VuZGFyeT4NCiAgICAgIDxFbmFi bGVkPnRydWU8L0VuYWJsZWQ+DQogICAgICA8U2NoZWR1bGVCeVdlZWs+DQogICAgICAgIDxEYXlzT2ZXZWVrPg0KICAgICAgICAgIDxTdW5kYXkgLz4NCiAg ICAgICAgPC9EYXlzT2ZXZWVrPg0KICAgICAgICA8V2Vla3NJbnRlcnZhbD4xPC9XZWVrc0ludGVydmFsPg0KICAgICAgPC9TY2hlZHVsZUJ5V2Vlaz4NCiAg ICA8L0NhbGVuZGFyVHJpZ2dlcj4NCiAgPC9UcmlnZ2Vycz4NCiAgPFByaW5jaXBhbHM+DQogICAgPFByaW5jaXBhbCBpZD0iTG9jYWxTeXN0ZW0iPg0KICAg ICAgPFVzZXJJZD5TLTEtNS0xODwvVXNlcklkPg0KICAgICAgPFJ1bkxldmVsPkhpZ2hlc3RBdmFpbGFibGU8L1J1bkxldmVsPg0KICAgIDwvUHJpbmNpcGFs Pg0KICA8L1ByaW5jaXBhbHM+DQogIDxTZXR0aW5ncz4NCiAgICA8TXVsdGlwbGVJbnN0YW5jZXNQb2xpY3k+SWdub3JlTmV3PC9NdWx0aXBsZUluc3RhbmNl c1BvbGljeT4NCiAgICA8RGlzYWxsb3dTdGFydElmT25CYXR0ZXJpZXM+ZmFsc2U8L0Rpc2FsbG93U3RhcnRJZk9uQmF0dGVyaWVzPg0KICAgIDxTdG9wSWZH b2luZ09uQmF0dGVyaWVzPmZhbHNlPC9TdG9wSWZHb2luZ09uQmF0dGVyaWVzPg0KICAgIDxBbGxvd0hhcmRUZXJtaW5hdGU+dHJ1ZTwvQWxsb3dIYXJkVGVy bWluYXRlPg0KICAgIDxTdGFydFdoZW5BdmFpbGFibGU+dHJ1ZTwvU3RhcnRXaGVuQXZhaWxhYmxlPg0KICAgIDxSdW5Pbmx5SWZOZXR3b3JrQXZhaWxhYmxl PnRydWU8L1J1bk9ubHlJZk5ldHdvcmtBdmFpbGFibGU+DQogICAgPElkbGVTZXR0aW5ncz4NCiAgICAgIDxTdG9wT25JZGxlRW5kPmZhbHNlPC9TdG9wT25J ZGxlRW5kPg0KICAgICAgPFJlc3RhcnRPbklkbGU+ZmFsc2U8L1Jlc3RhcnRPbklkbGU+DQogICAgPC9JZGxlU2V0dGluZ3M+DQogICAgPEFsbG93U3RhcnRP bkRlbWFuZD50cnVlPC9BbGxvd1N0YXJ0T25EZW1hbmQ+DQogICAgPEVuYWJsZWQ+dHJ1ZTwvRW5hYmxlZD4NCiAgICA8SGlkZGVuPnRydWU8L0hpZGRlbj4N CiAgICA8UnVuT25seUlmSWRsZT5mYWxzZTwvUnVuT25seUlmSWRsZT4NCiAgICA8RGlzYWxsb3dTdGFydE9uUmVtb3RlQXBwU2Vzc2lvbj5mYWxzZTwvRGlz YWxsb3dTdGFydE9uUmVtb3RlQXBwU2Vzc2lvbj4NCiAgICA8VXNlVW5pZmllZFNjaGVkdWxpbmdFbmdpbmU+dHJ1ZTwvVXNlVW5pZmllZFNjaGVkdWxpbmdF bmdpbmU+DQogICAgPFdha2VUb1J1bj5mYWxzZTwvV2FrZVRvUnVuPg0KICAgIDxFeGVjdXRpb25UaW1lTGltaXQ+UFQxME08L0V4ZWN1dGlvblRpbWVMaW1p dD4NCiAgICA8UHJpb3JpdHk+NzwvUHJpb3JpdHk+DQogICAgPFJlc3RhcnRPbkZhaWx1cmU+DQogICAgICA8SW50ZXJ2YWw+UFQyTTwvSW50ZXJ2YWw+DQog ICAgICA8Q291bnQ+MzwvQ291bnQ+DQogICAgPC9SZXN0YXJ0T25GYWlsdXJlPg0KICA8L1NldHRpbmdzPg0KICA8QWN0aW9ucyBDb250ZXh0PSJMb2NhbFN5 c3RlbSI+DQogICAgPEV4ZWM+DQogICAgICA8Q29tbWFuZD4lUHJvZ3JhbUZpbGVzJVxBY3RpdmF0aW9uLVJlbmV3YWxcQWN0aXZhdGlvbl90YXNrLmNtZDwv Q29tbWFuZD4NCiAgICA8QXJndW1lbnRzPlRhc2s8L0FyZ3VtZW50cz4NCiAgICA8L0V4ZWM+DQogIDwvQWN0aW9ucz4NCjwvVGFzaz4NCjpyZW5ld2FsOg0K DQo6cnVuX29uY2U6DQo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtMTYiPz4NCjxUYXNrIHZlcnNpb249IjEuMyIgeG1sbnM9Imh0dHA6Ly9z Y2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZG93cy8yMDA0LzAyL21pdC90YXNrIj4NCiAgPFJlZ2lzdHJhdGlvbkluZm8+DQogICAgPFNvdXJjZT5NaWNyb3Nv ZnQgQ29ycG9yYXRpb248L1NvdXJjZT4NCiAgICA8RGF0ZT4xOTk5LTAxLTAxVDEyOjAwOjAwLjM0Mzc1PC9EYXRlPg0KICAgIDxBdXRob3I+V2luZG93c0Fk ZGljdDwvQXV0aG9yPg0KICAgIDxWZXJzaW9uPjEuMDwvVmVyc2lvbj4NCiAgICA8RGVzY3JpcHRpb24+T25saW5lIEstTS1TIEFjdGl2YXRpb24gUnVuIE9u Y2UgLSBSdW4gYW5kIERlbGV0ZSBpdHNlbGYgb24gZmlyc3QgSW50ZXJuZXQgQ29udGFjdDwvRGVzY3JpcHRpb24+DQogICAgPFVSST5cQWN0aXZhdGlvbi1S dW5fT25jZTwvVVJJPg0KICAgIDxTZWN1cml0eURlc2NyaXB0b3I+RDpQKEE7O0ZBOzs7U1kpKEE7O0ZBOzs7QkEpKEE7O0ZSRlg7OztMUykoQTs7RlJGVzs7 O1MtMS01LTgwLTEyMzIzMTIxNi0yNTkyODgzNjUxLTM3MTUyNzEzNjctMzc1MzE1MTYzMS00MTc1OTA2NjI4KShBOztGUjs7O1MtMS01LTQpPC9TZWN1cml0 eURlc2NyaXB0b3I+DQogIDwvUmVnaXN0cmF0aW9uSW5mbz4NCiAgPFRyaWdnZXJzPg0KICAgIDxMb2dvblRyaWdnZXI+DQogICAgICA8RW5hYmxlZD50cnVl PC9FbmFibGVkPg0KICAgIDwvTG9nb25UcmlnZ2VyPg0KICA8L1RyaWdnZXJzPg0KICA8UHJpbmNpcGFscz4NCiAgICA8UHJpbmNpcGFsIGlkPSJMb2NhbFN5 c3RlbSI+DQogICAgICA8VXNlcklkPlMtMS01LTE4PC9Vc2VySWQ+DQogICAgICA8UnVuTGV2ZWw+SGlnaGVzdEF2YWlsYWJsZTwvUnVuTGV2ZWw+DQogICAg PC9QcmluY2lwYWw+DQogIDwvUHJpbmNpcGFscz4NCiAgPFNldHRpbmdzPg0KICAgIDxNdWx0aXBsZUluc3RhbmNlc1BvbGljeT5JZ25vcmVOZXc8L011bHRp cGxlSW5zdGFuY2VzUG9saWN5Pg0KICAgIDxEaXNhbGxvd1N0YXJ0SWZPbkJhdHRlcmllcz5mYWxzZTwvRGlzYWxsb3dTdGFydElmT25CYXR0ZXJpZXM+DQog ICAgPFN0b3BJZkdvaW5nT25CYXR0ZXJpZXM+ZmFsc2U8L1N0b3BJZkdvaW5nT25CYXR0ZXJpZXM+DQogICAgPEFsbG93SGFyZFRlcm1pbmF0ZT50cnVlPC9B bGxvd0hhcmRUZXJtaW5hdGU+DQogICAgPFN0YXJ0V2hlbkF2YWlsYWJsZT50cnVlPC9TdGFydFdoZW5BdmFpbGFibGU+DQogICAgPFJ1bk9ubHlJZk5ldHdv cmtBdmFpbGFibGU+dHJ1ZTwvUnVuT25seUlmTmV0d29ya0F2YWlsYWJsZT4NCiAgICA8SWRsZVNldHRpbmdzPg0KICAgICAgPFN0b3BPbklkbGVFbmQ+ZmFs c2U8L1N0b3BPbklkbGVFbmQ+DQogICAgICA8UmVzdGFydE9uSWRsZT5mYWxzZTwvUmVzdGFydE9uSWRsZT4NCiAgICA8L0lkbGVTZXR0aW5ncz4NCiAgICA8 QWxsb3dTdGFydE9uRGVtYW5kPnRydWU8L0FsbG93U3RhcnRPbkRlbWFuZD4NCiAgICA8RW5hYmxlZD50cnVlPC9FbmFibGVkPg0KICAgIDxIaWRkZW4+dHJ1 ZTwvSGlkZGVuPg0KICAgIDxSdW5Pbmx5SWZJZGxlPmZhbHNlPC9SdW5Pbmx5SWZJZGxlPg0KICAgIDxEaXNhbGxvd1N0YXJ0T25SZW1vdGVBcHBTZXNzaW9u PmZhbHNlPC9EaXNhbGxvd1N0YXJ0T25SZW1vdGVBcHBTZXNzaW9uPg0KICAgIDxVc2VVbmlmaWVkU2NoZWR1bGluZ0VuZ2luZT50cnVlPC9Vc2VVbmlmaWVk U2NoZWR1bGluZ0VuZ2luZT4NCiAgICA8V2FrZVRvUnVuPmZhbHNlPC9XYWtlVG9SdW4+DQogICAgPEV4ZWN1dGlvblRpbWVMaW1pdD5QVDEwTTwvRXhlY3V0 aW9uVGltZUxpbWl0Pg0KICAgIDxQcmlvcml0eT43PC9Qcmlvcml0eT4NCiAgICA8UmVzdGFydE9uRmFpbHVyZT4NCiAgICAgIDxJbnRlcnZhbD5QVDJNPC9J bnRlcnZhbD4NCiAgICAgIDxDb3VudD4zPC9Db3VudD4NCiAgICA8L1Jlc3RhcnRPbkZhaWx1cmU+DQogIDwvU2V0dGluZ3M+DQogIDxBY3Rpb25zIENvbnRl eHQ9IkxvY2FsU3lzdGVtIj4NCiAgICA8RXhlYz4NCiAgICAgIDxDb21tYW5kPiVQcm9ncmFtRmlsZXMlXEFjdGl2YXRpb24tUmVuZXdhbFxBY3RpdmF0aW9u X3Rhc2suY21kPC9Db21tYW5kPg0KICAgIDxBcmd1bWVudHM+VGFzazwvQXJndW1lbnRzPg0KICAgIDwvRXhlYz4NCiAgPC9BY3Rpb25zPg0KPC9UYXNrPg0K OnJ1bl9vbmNlOg0KDQo6cmVuZXdhbF92aXN0YToNCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi0xNiI/Pg0KPFRhc2sgdmVyc2lvbj0iMS4y IiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aW5kb3dzLzIwMDQvMDIvbWl0L3Rhc2siPg0KICA8UmVnaXN0cmF0aW9uSW5mbz4NCiAg ICA8RGF0ZT4xOTk5LTAxLTAxVDEyOjAwOjAwLjM0Mzc1PC9EYXRlPg0KICAgIDxBdXRob3I+V2luZG93c0FkZGljdDwvQXV0aG9yPg0KICAgIDxEZXNjcmlw dGlvbj5PbmxpbmUgSy1NLVMgQWN0aXZhdGlvbi1SZW5ld2FsIC0gV2Vla2x5IFRhc2s8L0Rlc2NyaXB0aW9uPg0KICA8L1JlZ2lzdHJhdGlvbkluZm8+DQog IDxUcmlnZ2Vycz4NCiAgICA8Q2FsZW5kYXJUcmlnZ2VyPg0KICAgICAgPFN0YXJ0Qm91bmRhcnk+MTk5OS0wMS0wMVQxMjowMDowMC4zNDM3NTwvU3RhcnRC b3VuZGFyeT4NCiAgICAgIDxFbmFibGVkPnRydWU8L0VuYWJsZWQ+DQogICAgICA8U2NoZWR1bGVCeVdlZWs+DQogICAgICAgIDxEYXlzT2ZXZWVrPg0KICAg ICAgICAgIDxTdW5kYXkgLz4NCiAgICAgICAgPC9EYXlzT2ZXZWVrPg0KICAgICAgICA8V2Vla3NJbnRlcnZhbD4xPC9XZWVrc0ludGVydmFsPg0KICAgICAg PC9TY2hlZHVsZUJ5V2Vlaz4NCiAgICA8L0NhbGVuZGFyVHJpZ2dlcj4NCiAgPC9UcmlnZ2Vycz4NCiAgPFByaW5jaXBhbHM+DQogICAgPFByaW5jaXBhbCBp ZD0iQXV0aG9yIj4NCiAgICAgIDxVc2VySWQ+Uy0xLTUtMTg8L1VzZXJJZD4NCiAgICAgIDxSdW5MZXZlbD5IaWdoZXN0QXZhaWxhYmxlPC9SdW5MZXZlbD4N CiAgICA8L1ByaW5jaXBhbD4NCiAgPC9QcmluY2lwYWxzPg0KICA8U2V0dGluZ3M+DQogICAgPElkbGVTZXR0aW5ncz4NCiAgICAgIDxEdXJhdGlvbj5QVDEw TTwvRHVyYXRpb24+DQogICAgICA8V2FpdFRpbWVvdXQ+UFQxSDwvV2FpdFRpbWVvdXQ+DQogICAgICA8U3RvcE9uSWRsZUVuZD50cnVlPC9TdG9wT25JZGxl RW5kPg0KICAgICAgPFJlc3RhcnRPbklkbGU+ZmFsc2U8L1Jlc3RhcnRPbklkbGU+DQogICAgPC9JZGxlU2V0dGluZ3M+DQogICAgPE11bHRpcGxlSW5zdGFu Y2VzUG9saWN5Pklnbm9yZU5ldzwvTXVsdGlwbGVJbnN0YW5jZXNQb2xpY3k+DQogICAgPERpc2FsbG93U3RhcnRJZk9uQmF0dGVyaWVzPmZhbHNlPC9EaXNh bGxvd1N0YXJ0SWZPbkJhdHRlcmllcz4NCiAgICA8U3RvcElmR29pbmdPbkJhdHRlcmllcz50cnVlPC9TdG9wSWZHb2luZ09uQmF0dGVyaWVzPg0KICAgIDxB bGxvd0hhcmRUZXJtaW5hdGU+dHJ1ZTwvQWxsb3dIYXJkVGVybWluYXRlPg0KICAgIDxTdGFydFdoZW5BdmFpbGFibGU+dHJ1ZTwvU3RhcnRXaGVuQXZhaWxh YmxlPg0KICAgIDxSdW5Pbmx5SWZOZXR3b3JrQXZhaWxhYmxlPnRydWU8L1J1bk9ubHlJZk5ldHdvcmtBdmFpbGFibGU+DQogICAgPE5ldHdvcmtTZXR0aW5n cyAvPg0KICAgIDxBbGxvd1N0YXJ0T25EZW1hbmQ+dHJ1ZTwvQWxsb3dTdGFydE9uRGVtYW5kPg0KICAgIDxFbmFibGVkPnRydWU8L0VuYWJsZWQ+DQogICAg PEhpZGRlbj5mYWxzZTwvSGlkZGVuPg0KICAgIDxSdW5Pbmx5SWZJZGxlPmZhbHNlPC9SdW5Pbmx5SWZJZGxlPg0KICAgIDxXYWtlVG9SdW4+ZmFsc2U8L1dh a2VUb1J1bj4NCiAgICA8RXhlY3V0aW9uVGltZUxpbWl0PlBUMTBNPC9FeGVjdXRpb25UaW1lTGltaXQ+DQogICAgPFByaW9yaXR5Pjc8L1ByaW9yaXR5Pg0K ICAgIDxSZXN0YXJ0T25GYWlsdXJlPg0KICAgICAgPEludGVydmFsPlBUNU08L0ludGVydmFsPg0KICAgICAgPENvdW50PjM8L0NvdW50Pg0KICAgIDwvUmVz dGFydE9uRmFpbHVyZT4NCiAgPC9TZXR0aW5ncz4NCiAgPEFjdGlvbnMgQ29udGV4dD0iQXV0aG9yIj4NCiAgICA8RXhlYz4NCiAgICAgIDxDb21tYW5kPiVQ cm9ncmFtRmlsZXMlXEFjdGl2YXRpb24tUmVuZXdhbFxBY3RpdmF0aW9uX3Rhc2suY21kPC9Db21tYW5kPg0KICAgICAgPEFyZ3VtZW50cz5UYXNrPC9Bcmd1 bWVudHM+DQogICAgPC9FeGVjPg0KICA8L0FjdGlvbnM+DQo8L1Rhc2s+DQo6cmVuZXdhbF92aXN0YToNCg0KOnJ1bl9vbmNlX3Zpc3RhOg0KPD94bWwgdmVy c2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTE2Ij8+DQo8VGFzayB2ZXJzaW9uPSIxLjIiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dp bmRvd3MvMjAwNC8wMi9taXQvdGFzayI+DQogIDxSZWdpc3RyYXRpb25JbmZvPg0KICAgIDxEYXRlPjE5OTktMDEtMDFUMTI6MDA6MDAuMzQzNzU8L0RhdGU+ DQogICAgPEF1dGhvcj5XaW5kb3dzQWRkaWN0PC9BdXRob3I+DQogICAgPERlc2NyaXB0aW9uPk9ubGluZSBLLU0tUyBBY3RpdmF0aW9uIFJ1biBPbmNlIC0g UnVuIGFuZCBEZWxldGUgaXRzZWxmIG9uIGZpcnN0IEludGVybmV0IENvbnRhY3Q8L0Rlc2NyaXB0aW9uPg0KICA8L1JlZ2lzdHJhdGlvbkluZm8+DQogIDxU cmlnZ2Vycz4NCiAgICA8TG9nb25UcmlnZ2VyPg0KICAgICAgPEVuYWJsZWQ+dHJ1ZTwvRW5hYmxlZD4NCiAgICA8L0xvZ29uVHJpZ2dlcj4NCiAgPC9Ucmln Z2Vycz4NCiAgPFByaW5jaXBhbHM+DQogICAgPFByaW5jaXBhbCBpZD0iQXV0aG9yIj4NCiAgICAgIDxVc2VySWQ+Uy0xLTUtMTg8L1VzZXJJZD4NCiAgICAg IDxSdW5MZXZlbD5IaWdoZXN0QXZhaWxhYmxlPC9SdW5MZXZlbD4NCiAgICA8L1ByaW5jaXBhbD4NCiAgPC9QcmluY2lwYWxzPg0KICA8U2V0dGluZ3M+DQog ICAgPElkbGVTZXR0aW5ncz4NCiAgICAgIDxEdXJhdGlvbj5QVDEwTTwvRHVyYXRpb24+DQogICAgICA8V2FpdFRpbWVvdXQ+UFQxSDwvV2FpdFRpbWVvdXQ+ DQogICAgICA8U3RvcE9uSWRsZUVuZD50cnVlPC9TdG9wT25JZGxlRW5kPg0KICAgICAgPFJlc3RhcnRPbklkbGU+ZmFsc2U8L1Jlc3RhcnRPbklkbGU+DQog ICAgPC9JZGxlU2V0dGluZ3M+DQogICAgPE11bHRpcGxlSW5zdGFuY2VzUG9saWN5Pklnbm9yZU5ldzwvTXVsdGlwbGVJbnN0YW5jZXNQb2xpY3k+DQogICAg PERpc2FsbG93U3RhcnRJZk9uQmF0dGVyaWVzPmZhbHNlPC9EaXNhbGxvd1N0YXJ0SWZPbkJhdHRlcmllcz4NCiAgICA8U3RvcElmR29pbmdPbkJhdHRlcmll cz50cnVlPC9TdG9wSWZHb2luZ09uQmF0dGVyaWVzPg0KICAgIDxBbGxvd0hhcmRUZXJtaW5hdGU+dHJ1ZTwvQWxsb3dIYXJkVGVybWluYXRlPg0KICAgIDxT dGFydFdoZW5BdmFpbGFibGU+dHJ1ZTwvU3RhcnRXaGVuQXZhaWxhYmxlPg0KICAgIDxSdW5Pbmx5SWZOZXR3b3JrQXZhaWxhYmxlPnRydWU8L1J1bk9ubHlJ Zk5ldHdvcmtBdmFpbGFibGU+DQogICAgPE5ldHdvcmtTZXR0aW5ncyAvPg0KICAgIDxBbGxvd1N0YXJ0T25EZW1hbmQ+dHJ1ZTwvQWxsb3dTdGFydE9uRGVt YW5kPg0KICAgIDxFbmFibGVkPnRydWU8L0VuYWJsZWQ+DQogICAgPEhpZGRlbj5mYWxzZTwvSGlkZGVuPg0KICAgIDxSdW5Pbmx5SWZJZGxlPmZhbHNlPC9S dW5Pbmx5SWZJZGxlPg0KICAgIDxXYWtlVG9SdW4+ZmFsc2U8L1dha2VUb1J1bj4NCiAgICA8RXhlY3V0aW9uVGltZUxpbWl0PlBUMTBNPC9FeGVjdXRpb25U aW1lTGltaXQ+DQogICAgPFByaW9yaXR5Pjc8L1ByaW9yaXR5Pg0KICAgIDxSZXN0YXJ0T25GYWlsdXJlPg0KICAgICAgPEludGVydmFsPlBUNU08L0ludGVy dmFsPg0KICAgICAgPENvdW50PjM8L0NvdW50Pg0KICAgIDwvUmVzdGFydE9uRmFpbHVyZT4NCiAgPC9TZXR0aW5ncz4NCiAgPEFjdGlvbnMgQ29udGV4dD0i QXV0aG9yIj4NCiAgICA8RXhlYz4NCiAgICAgIDxDb21tYW5kPiVQcm9ncmFtRmlsZXMlXEFjdGl2YXRpb24tUmVuZXdhbFxBY3RpdmF0aW9uX3Rhc2suY21k PC9Db21tYW5kPg0KICAgICAgPEFyZ3VtZW50cz5UYXNrPC9Bcmd1bWVudHM+DQogICAgPC9FeGVjPg0KICA8L0FjdGlvbnM+DQo8L1Rhc2s+DQo6cnVuX29u Y2VfdmlzdGE6DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgR2V0IFdpbmRvd3MgaW5zdGFsbGVk IGtleSBjaGFubmVsDQoNCjprX2NoYW5uZWwNCg0Kc2V0IF9ndmxrPQ0KaWYgJV93bWljJSBFUVUgMSBmb3IgL2YgInRva2Vucz0yIGRlbGltcz09IiAlJSMg aW4gKCd3bWljIHBhdGggJXNwcCUgd2hlcmUgIkFwcGxpY2F0aW9uSUQ9JzU1YzkyNzM0LWQ2ODItNGQ3MS05ODNlLWQ2ZWMzZjE2MDU5ZicgYW5kIFBhcnRp YWxQcm9kdWN0S2V5IElTIE5PVCBOVUxMIEFORCBMaWNlbnNlRGVwZW5kc09uIGlzIE5VTEwgYW5kIERlc2NyaXB0aW9uIGxpa2UgJyUlS01TQ0xJRU5UJSUn IiBHZXQgTmFtZSAvdmFsdWUgJW51bDYlJykgZG8gKGVjaG8gJSUjIGZpbmRzdHIgL2kgIldpbmRvd3MiICVudWwxJSAmJiBzZXQgX2d2bGs9MSkNCmlmICVf d21pYyUgRVFVIDAgZm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSUjIGluICgnJXBzYyUgIigoW1dNSVNFQVJDSEVSXSdTRUxFQ1QgTmFtZSBGUk9NICVz cHAlIFdIRVJFIEFwcGxpY2F0aW9uSUQ9Jyc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYnJyBBTkQgUGFydGlhbFByb2R1Y3RLZXkgSVMg Tk9UIE5VTEwgQU5EIExpY2Vuc2VEZXBlbmRzT24gaXMgTlVMTCBhbmQgRGVzY3JpcHRpb24gbGlrZSAnJyUlS01TQ0xJRU5UJSUnJycpLkdldCgpKS5OYW1l IHwgJSUge2VjaG8gKCdOYW1lPScrJF8pfSIgJW51bDYlJykgZG8gKGVjaG8gJSUjIGZpbmRzdHIgL2kgIldpbmRvd3MiICVudWwxJSAmJiBzZXQgX2d2bGs9 MSkNCmV4aXQgL2INCg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIEdldCBQcm9kdWN0IEtleSBm cm9tIHBrZXloZWxwZXIuZGxsIGZvciBmdXR1cmUgbmV3IGVkaXRpb25zDQo6OiAgSXQgd29ya3Mgb24gV2luZG93cyAxMCAxODAzICgxNzEzNCkgYW5kIGxh dGVyIGJ1aWxkcy4NCg0KOmtfcGtleQ0KDQpjYWxsIDpka19yZWZsZWN0aW9uDQoNCnNldCBkMT0lcmVmJSBbdm9pZF0kVHlwZUJ1aWxkZXIuRGVmaW5lUElu dm9rZU1ldGhvZCgnU2t1R2V0UHJvZHVjdEtleUZvckVkaXRpb24nLCAncGtleWhlbHBlci5kbGwnLCAnUHVibGljLCBTdGF0aWMnLCAxLCBbaW50XSwgQChb aW50XSwgW1N0cmluZ10sIFtTdHJpbmddLk1ha2VCeVJlZlR5cGUoKSwgW1N0cmluZ10uTWFrZUJ5UmVmVHlwZSgpKSwgMSwgMyk7DQpzZXQgZDE9JWQxJSAk b3V0ID0gJyc7IFt2b2lkXSRUeXBlQnVpbGRlci5DcmVhdGVUeXBlKCk6OlNrdUdldFByb2R1Y3RLZXlGb3JFZGl0aW9uKCUxLCAlMiwgW3JlZl0kb3V0LCBb cmVmXSRudWxsKTsgJG91dA0KDQpzZXQgcGtleT0NCmZvciAvZiAlJWEgaW4gKCclcHNjJSAiJWQxJSInKSBkbyBpZiBub3QgZXJyb3JsZXZlbCAxIChzZXQg cGtleT0lJWEpDQpleGl0IC9iDQoNCjo6ICBHZXQgY2hhbm5lbCBuYW1lIGZvciB0aGUga2V5IHdoaWNoIHdhcyBleHRyYWN0ZWQgZnJvbSBwa2V5aGVscGVy LmRsbA0KDQo6a19wa2V5Y2hhbm5lbA0KDQpzZXQgaz0lMQ0Kc2V0IG09W1J1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLk1hcnNoYWxdDQpzZXQgcD0lU3lzUGF0 aCVcc3BwXHRva2Vuc1xwa2V5Y29uZmlnXHBrZXljb25maWcueHJtLW1zDQoNCnNldCBkMT0lcmVmJSBbdm9pZF0kVHlwZUJ1aWxkZXIuRGVmaW5lUEludm9r ZU1ldGhvZCgnUGlkR2VuWCcsICdwaWRnZW54LmRsbCcsICdQdWJsaWMsIFN0YXRpYycsIDEsIFtpbnRdLCBAKFtTdHJpbmddLCBbU3RyaW5nXSwgW1N0cmlu Z10sIFtpbnRdLCBbSW50UHRyXSwgW0ludFB0cl0sIFtJbnRQdHJdKSwgMSwgMyk7DQpzZXQgZDE9JWQxJSAkciA9IFtieXRlW11dOjpuZXcoMHgwNEY4KTsg JHJbMF0gPSAweEY4OyAkclsxXSA9IDB4MDQ7ICRmID0gJW0lOjpBbGxvY0hHbG9iYWwoMHgwNEY4KTsgJW0lOjpDb3B5KCRyLCAwLCAkZiwgMHgwNEY4KTsN CnNldCBkMT0lZDElIFt2b2lkXSRUeXBlQnVpbGRlci5DcmVhdGVUeXBlKCk6OlBpZEdlblgoJyVrJScsICclcCUnLCAnMDAwMDAnLCAwLCAwLCAwLCAkZik7 ICVtJTo6Q29weSgkZiwgJHIsIDAsIDB4MDRGOCk7ICVtJTo6RnJlZUhHbG9iYWwoJGYpOyBbVGV4dC5FbmNvZGluZ106OlVuaWNvZGUuR2V0U3RyaW5nKCRy LCAxMDE2LCAxMjgpDQoNCnNldCBwa2V5Y2hhbm5lbD0NCmZvciAvZiAlJWEgaW4gKCclcHNjJSAiJWQxJSInKSBkbyBpZiBub3QgZXJyb3JsZXZlbCAxIChz ZXQgcGtleWNoYW5uZWw9JSVhKQ0KZXhpdCAvYg0KDQo6a19ndmxrDQoNCmZvciAlJSMgaW4gKHBrZXloZWxwZXIuZGxsKSBkbyBAaWYgIiUlfiRQQVRIOiMi PT0iIiBleGl0IC9iDQpmb3IgJSUjIGluIChWb2x1bWU6R1ZMSykgZG8gKA0KY2FsbCA6a19wa2V5ICVvc1NLVSUgJyUlIycNCmlmIGRlZmluZWQgcGtleSBj YWxsIDprX3BrZXljaGFubmVsICFwa2V5IQ0KaWYgL2kgIiFwa2V5Y2hhbm5lbCEiPT0iJSUjIiAoDQpzZXQga2V5PSFwa2V5IQ0KZXhpdCAvYg0KKQ0KKQ0K ZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIDFzdCBjb2x1bW4gPSBPZmZpY2UgdmVy c2lvbiBudW1iZXINCjo6ICAybmQgY29sdW1uID0gQWN0aXZhdGlvbiBJRA0KOjogIDNyZCBjb2x1bW4gPSBQcm9kdWN0IElEIGZyb20gYnJhbmRpbmcueG1s DQo6OiAgNHRoIGNvbHVtbiA9IEVkaXRpb24NCjo6ICA1dGggY29sdW1uID0gT3RoZXIgRWRpdGlvbiBJRHMgaWYgdGhleSBhcmUgcGFydCBvZiB0aGUgc2Ft ZSBwcmltYXJ5IHByb2R1Y3QgKEZvciByZWZlcmVuY2Ugb25seSkNCjo6ICBTZXBhcmF0b3IgID0gIl8iDQoNCjptc2lvZmZpY2VkYXRhDQoNCmZvciAlJSMg aW4gKA0KMTRfNGQ0NjNjMmMtMDUwNS00NjI2LThjZGItYTRkYTgyZTJkOGVkXzAwMTVfQWNjZXNzUg0KMTRfNzQ1ZmIzNzctMGE1OS00Y2E5LWI5YTktYzM1 OTU1N2EyYzRlXzAwMUNfQWNjZXNzUnVudGltZVINCjE0Xzk1YWIzZWM4LTQxMDYtNGY5ZC1iNjMyLTAzYzAxOWQxZDIzZl8wMDE1X0FjY2Vzc1ZMDQoxNF80 ZWFmZjBkMC1jNmNiLTQxODctOTRmMy1jNzY1NmQ0OWEwYWFfMDAxNl9FeGNlbFJfW0hTRXhjZWxSXQ0KMTRfNzFkYzg2ZmYtZjA1Ni00MGQwLThmZmItOTU5 MjcwNWM5Yjc2XzAwMTZfRXhjZWxWTA0KMTRfNzAwNGI3ZjAtNjQwNy00ZjQ1LThlYWMtOTY2ZTVmODY4YmRlXzAwQkFfR3Jvb3ZlUg0KMTRfZmRhZDBkZmEt NDE3ZC00YjRmLTkzZTQtNjRlYTg4NjdiN2ZkXzAwQkFfR3Jvb3ZlVkwNCjE0XzdiN2QxZjE3LWZkY2ItNDgyMC05Nzg5LTliZWM2ZTM3NzgyMV8wMDEzX0hv bWVCdXNpbmVzc1JfW0hvbWVCdXNpbmVzc0RlbW9SXQ0KMTRfMTkzMTYxMTctMzBhOC00NzczLThmZDktN2Y3MjMxZjRlMDYwXzAxMUVfSG9tZUJ1c2luZXNz U3ViUg0KMTRfMDllMmQzN2UtNDc0Yi00MTIxLTg2MjYtNThhZDliZTU3NzZmXzAwMkZfSG9tZVN0dWRlbnRSX1tIb21lU3R1ZGVudERlbW9SXQ0KMTRfZWYx ZGE0NjQtMDFjOC00M2E2LTkxYWYtZTRlNTcxMzc0NGY5XzAwNDRfSW5mb1BhdGhSDQoxNF84NWUyMjQ1MC1iNzQxLTQzMGMtYTE3Mi1hMzc5NjJjOTM4YWZf MDA0NF9JbmZvUGF0aFZMDQoxNF8xNGY1OTQ2YS1kZWJjLTQ3MTYtYmFiYy03ZTJjMjQwZmVjMDhfMDAwRl9Nb25kb1INCjE0XzUzM2I2NTZhLTQ0MjUtNDgw Yi04ZTMwLTFhMjM1ODg5ODM1MF8wMDBGX01vbmRvVkwNCjE0X2MxY2VkYThiLWM1NzgtNGQ1ZC1hNGFhLTIzNjI2YmU0ZTIzNF8wMDNEX1Byb2Zlc3Npb25h bFJfW09FTS1TaW5nbGVJbWFnZV1FeGNlcHRpb24NCjE0XzNmN2FhNjkzLTlhN2UtNDRmYy05MzA5LWJiM2Q4ZTYwNDkyNV8wMEExX09uZU5vdGVSX1tIU09u ZU5vdGVSXQ0KMTRfNjg2MGIzMWYtNmE2Ny00OGI4LTg0YjktZTMxMmIzNDg1YzRiXzAwQTFfT25lTm90ZVZMDQoxNF9mYmY0YWMzNi0zMWM4LTQzNDAtODY2 Ni03OTg3MzEyOWNmNDBfMDAxQV9PdXRsb29rUg0KMTRfYTlhZWFiZDgtNjNiOC00MDc5LWEyOGUtZjUzMTgwN2ZkNmI4XzAwMUFfT3V0bG9va1ZMDQoxNF9h Y2I1MTM2MS1jMGRiLTQ4OTUtOTQ5Ny0xODMxYzQxZjMxYTZfMDAzM19QZXJzb25hbFJfW1BlcnNvbmFsRGVtb1IsUGVyc29uYWxQcmVwYWlkUl0NCjE0XzEz M2M4MzU5LTRlOTMtNDI0MS04MTE4LTMwYmIxODczN2VhMF8wMDE4X1Bvd2VyUG9pbnRSX1tIU1Bvd2VyUG9pbnRSXQ0KMTRfMzgyNTI5NDAtNzE4Yy00YWE2 LTgxYTQtMTM1Mzk4ZTUzODUxXzAwMThfUG93ZXJQb2ludFZMDQoxNF84YjU1OWMzNy0wMTE3LTQxM2UtOTIxYi1iODUzYWViNmUyMTBfMDAxNF9Qcm9mZXNz aW9uYWxSX1tQcm9mZXNzaW9uYWxBY2FkUixQcm9mZXNzaW9uYWxEZW1vUl0NCjE0XzcyNTcxNGQ3LWQ1OGYtNGQxMi05ZmE4LTM1ODczYzZmNzIxNV8wMDNC X1Byb2plY3RQcm9SX1tQcm9qZWN0UHJvTVNETlJdDQoxNF80ZDA2ZjcyZS1mZDUwLTRiYzItYTI0Yi1kNDQ4ZDdmMTdlZjJfMDExRl9Qcm9qZWN0UHJvU3Vi Ug0KMTRfMWNmNTdhNTktYzUzMi00ZTU2LTlhN2QtZmZhMmZlOTRiNDc0XzAwM0JfUHJvamVjdFByb1ZMDQoxNF82ODhmNjU4OS0yYmQ5LTQyNGUtYTE1Mi1i MTNmMzZhYTZkZTFfMDAzQV9Qcm9qZWN0U3RkUg0KMTRfMTFiMzk0MzktNmI5My00NjQyLTk1NzAtZjJlYjgxYmUyMjM4XzAwM0FfUHJvamVjdFN0ZFZMDQox NF83MWFmN2U4NC05M2U2LTQzNjMtOWI2OS02OTllMDRlNzQwNzFfMDAxMV9Qcm9QbHVzUl9bUHJvUGx1c0FjYWRSLFByb1BsdXNNU0ROUixTdWI0Ul0NCjE0 X2U5OGVmMGMwLTcxYzQtNDJjZS04MzA1LTI4N2Q4NzIxZTI2Y18wMTFEX1Byb1BsdXNTdWJSDQoxNF9mZGYzZWNiOS1iNTZmLTQzYjItYTliOC0xYjQ4YjZi YWUxYTdfMDAxMV9Qcm9QbHVzVkxfW1Byb1BsdXNBY2FkVkxdDQoxNF85ODY3NzYwMy1hNjY4LTRmYTQtOTk4MC0zZjFmMDVmNzhmNjlfMDAxOV9QdWJsaXNo ZXJSDQoxNF8zZDAxNDc1OS1iMTI4LTQ0NjYtOTAxOC1lODBmNjMyMGQ5ZDBfMDAxOV9QdWJsaXNoZXJWTA0KMTRfZGJlM2FlZTAtNTE4My00ZmY3LTgxNDIt NjYwNTAxNzNjYjAxXzAwOEJfU21hbGxCdXNCYXNpY3NSX1tTbWFsbEJ1c0Jhc2ljc01TRE5SXQ0KMTRfODA5MDc3MWUtZDQxYS00NDgyLTkyOWUtZGU4N2Yx ZjQ3ZTQ2XzAwOEJfU21hbGxCdXNCYXNpY3NWTA0KMTRfYjc4ZGY2OWUtMDk2Ni00MGIxLWFlODUtMzBhNTEzNGRlZGQwXzAwMTdfU1BEUg0KMTRfZDM0MjJj ZmItOGQ4Yi00ZWFkLTk5ZjktZWFiMGNjZDk5MGQ3XzAwMTJfU3RhbmRhcmRSDQoxNF8xZjc2ZTM0Ni1lMGJlLTQ5YmMtOTk1NC03MGVjNTNhNGZjZmVfMDAx Ml9TdGFuZGFyZFZMX1tTdGFuZGFyZEFjYWRWTF0NCjE0XzI3NDVlNTgxLTU2NWEtNDY3MC1hZTkwLTZiZjdjNTdmZmU0M18wMDY2X1N0YXJ0ZXJSDQoxNF82 NmNhZDU2OC1jMmRjLTQ1OWQtOTNlYy0yZjNjYjk2N2VlMzRfMDA1N19WaXNpb1NJUl9QcmVtW1BybyxTdGRdRXhjZXB0aW9uDQoxNF8zNjc1NmNiOC04ZTY5 LTRkMTEtOTUyMi02ODg5OTUwN2NkNmFfMDA1N19WaXNpb1NJVkxfUHJlbVtQcm8sU3RkXUV4Y2VwdGlvbg0KMTRfZGIzYmJjOWMtY2U1Mi00MWQxLWE0NmYt MWExZDY4MDU5MTE5XzAwMUJfV29yZFJfW0hTV29yZFJdDQoxNF85OGQ0MDUwZS05Yzk4LTQ5YmYtOWJlMS04NWUxMmViM2FiMTNfMDAxQl9Xb3JkVkwNCjo6 IE9mZmljZSAyMDEzDQoxNV9hYjRkMDQ3Yi05N2NmLTQxMjYtYTY5Zi0zNGRmMDhlMmYyNTRfMDAxNV9BY2Nlc3NSZXRhaWwNCjE1XzI1OWRlNWJlLTQ5MmIt NDRiMy05ZDc4LTk2NDVmODQ4ZjdiMF8wMDFDX0FjY2Vzc1J1bnRpbWVSZXRhaWwNCjE1XzQzNzQwMjJkLTU2YjgtNDhjMS05YmI3LWQ4ZjJmYzcyNjM0M18w MDE1X0FjY2Vzc1ZvbHVtZQ0KMTVfMWIxZDliZDUtMTJlYS00MDYzLTk2NGMtMTZlN2U4N2Q2ZTA4XzAwMTZfRXhjZWxSZXRhaWwNCjE1X2FjMWFlN2ZkLWI5 NDktNGUwNC1hMzMwLTg0OWJjNDA2MzhjZl8wMDE2X0V4Y2VsVm9sdW1lDQoxNV9jZmFmNTM1Ni00OWUzLTQ4YTgtYWIzYy1lNzI5YWI3OTEyNTBfMDBCQV9H cm9vdmVSZXRhaWwNCjE1XzQ4MjVhYzI4LWNlNDEtNDVhNy05ZTZlLTFmZWQ3NDA1NzYwMV8wMEJBX0dyb292ZVZvbHVtZQ0KMTVfYzAyZmI2MmUtMWNkNS00 ZTE4LWJhMjUtZTA0ODA0NjdmZmFhXzAwRTdfSG9tZUJ1c2luZXNzUGlwY1JldGFpbA0KMTVfY2QyNTYxNTAtYTg5OC00NDFmLWFhYzAtOWY4ZjMzMzkwZTQ1 XzAwMTNfSG9tZUJ1c2luZXNzUmV0YWlsDQoxNV8xZmRmYjRlNC1mOWM5LTQxYzQtYjA1NS1jODBkYWYwMDY5N2RfMDBDRV9Ib21lU3R1ZGVudEFSTVJldGFp bA0KMTVfZWJlZjlmMDUtNTI3My00MDRhLTkyNTMtYzVlMjUyZjUwNTU1XzAwREFfSG9tZVN0dWRlbnRQbHVzQVJNUmV0YWlsDQoxNV85ODY4NWQyMS03OGJk LTRjNjItYmM0Zi02NTMzNDRhNjMwMzVfMDAyRl9Ib21lU3R1ZGVudFJldGFpbA0KMTVfNDQ5ODQzODEtNDA2ZS00YTM1LWIxYzMtZTU0ZjQ5OTU1NmUyXzAw NDRfSW5mb1BhdGhSZXRhaWwNCjE1XzllMDE2OTg5LTQwMDctNDJhNi04MDUxLTY0ZWI5NzExMGNmMl8wMDQ0X0luZm9QYXRoVm9sdW1lDQoxNV85MTAzZjNj ZS0xMDg0LTQ0N2EtODI3ZS1kNjA5N2Y2OGM4OTVfMDBFQV9MeW5jQWNhZGVtaWNSZXRhaWwNCjE1X2ZmNjkzYmY0LTAyNzYtNGRkYi1iYjQyLTc0ZWYxYTBj OWY0ZF8wMTJEX0x5bmNFbnRyeVJldGFpbA0KMTVfZmFkYTY2NTgtYmZjNi00YzRlLTgyNWEtNTlhODk4MjJjZGE4XzAxMkNfTHluY1JldGFpbA0KMTVfZTEy NjRlMTAtYWZhZi00NDM5LWE5OGItMjU2ZGY4YmIxNTZmXzAxMkNfTHluY1ZvbHVtZQ0KMTVfMzE2OWM4ZGYtZjY1OS00Zjk1LTljYzYtMzExNWU2NTk2ZTgz XzAwMEZfTW9uZG9SZXRhaWwNCjE1X2YzMzQ4NWEwLTMxMGItNGI3Mi05YTBlLWIxZDYwNTUxMGRiZF8wMDBGX01vbmRvVm9sdW1lDQoxNV8zMzkxZTEyNS1m NmU0LTRiMWUtODk5Yy1hMjVlNjA5MmQ0MGRfMDBBMV9PbmVOb3RlRnJlZVJldGFpbA0KMTVfOGI1MjRiY2MtNjdlYS00ODc2LWE1MDktNDVlNDZmNjM0N2U4 XzAwQTFfT25lTm90ZVJldGFpbA0KMTVfYjA2N2U5NjUtNzUyMS00NTViLWI5ZjctYzc0MDIwNDU3OGEyXzAwQTFfT25lTm90ZVZvbHVtZQ0KMTVfMTIwMDRi NDgtZTZjOC00ZmZhLWFkNWEtYWM4ZDQ0Njc3NjVhXzAwMUFfT3V0bG9va1JldGFpbA0KMTVfOGQ1NzdjNTAtYWU1ZS00N2ZkLWEyNDAtMjQ5ODZmNzNkNTAz XzAwMUFfT3V0bG9va1ZvbHVtZQ0KMTVfNWFhYjg1NjEtMTY4Ni00M2Y3LTlmZjUtMmM4NjFkYTU4ZDE3XzAwRTZfUGVyc29uYWxQaXBjUmV0YWlsDQoxNV8x N2U5ZGYyZC1lZDkxLTQzODItOTA0Yi00ZmVkNmExMmNhZjBfMDAzM19QZXJzb25hbFJldGFpbA0KMTVfMzE3NDNiODItYmZiYy00NGI2LWFhMTItODVkNDJl NjQ0ZDViXzAwMThfUG93ZXJQb2ludFJldGFpbA0KMTVfZTQwZGNiNDQtMWQ1Yy00MDg1LThlOGYtOTQzZjMzYzRmMDA0XzAwMThfUG93ZXJQb2ludFZvbHVt ZQ0KMTVfNGUyNmNhYzEtZTE1YS00NDY3LTkwNjktY2I0N2I2N2ZlMTkxXzAwRThfUHJvZmVzc2lvbmFsUGlwY1JldGFpbA0KMTVfNDRiYzcwZTItZmI4My00 YjA5LTkwODItZTU1NTdlMGMyZWRlXzAwMTRfUHJvZmVzc2lvbmFsUmV0YWlsDQoxNV9mMjQzNWRlNC01ZmMwLTRlNWItYWM5Ny0zNGY1MTVlYzVlZTdfMDAz Ql9Qcm9qZWN0UHJvUmV0YWlsDQoxNV9lZDM0ZGM4OS0xYzI3LTRlY2QtOGIyZi02M2QwZjRjZWRjMzJfMDAzQl9Qcm9qZWN0UHJvVm9sdW1lDQoxNV81NTE3 ZTZhMi03MzliLTQ4MjItOTQ2Zi03ZjBmMWM1OTM0YjFfMDAzQV9Qcm9qZWN0U3RkUmV0YWlsDQoxNV8yYjllNGEzNy02MjMwLTRiNDItYmVlMi1lMjVjZTg2 YzhjN2FfMDAzQV9Qcm9qZWN0U3RkVm9sdW1lDQoxNV8wNjQzODNmYS0xNTM4LTQ5MWMtODU5Yi0wZWNhYjE2OWEwYWJfMDAxMV9Qcm9QbHVzUmV0YWlsDQox NV8yYjg4YzRmMi1lYThmLTQzY2QtODA1ZS00ZDQxMzQ2ZTE4YTdfMDAxMV9Qcm9QbHVzVm9sdW1lDQoxNV9jM2EwODE0YS03MGE0LTQ3MWYtYWYzNy0yMzEz YTYzMzExMTFfMDAxOV9QdWJsaXNoZXJSZXRhaWwNCjE1XzM4ZWE0OWY2LWFkMWQtNDNmMS05ODg4LTk5YTM1ZDdjOTQwOV8wMDE5X1B1Ymxpc2hlclZvbHVt ZQ0KMTVfYmEzZTM4MzMtNmE3ZS00NDVhLTg5ZDAtNzgwMmE5YTY4NTg4XzAwMTdfU1BEUmV0YWlsDQoxNV8zMjI1NWMwYS0xNmI0LTRjZTItYjM4OC04YTQy NjdlMjE5ZWJfMDAxMl9TdGFuZGFyZFJldGFpbA0KMTVfYTI0Y2NhNTEtM2Q1NC00YzQxLThhNzYtNDAzMWY1MzM4Y2IyXzAwMTJfU3RhbmRhcmRWb2x1bWUN CjE1XzE1ZDEyYWQ0LTYyMmQtNDI1Ny05NzZjLTVlYjMyODJmYjkzZF8wMDUxX1Zpc2lvUHJvUmV0YWlsDQoxNV8zZTQyOTRkZC1hNzY1LTQ5YmMtOGRiZC1j ZjhiNjJhNGJkM2RfMDA1MV9WaXNpb1Byb1ZvbHVtZQ0KMTVfZGFlNTk3Y2UtNTgyMy00Yzc3LTk1ODAtNzI2OGI5M2E0YjIzXzAwNTNfVmlzaW9TdGRSZXRh aWwNCjE1XzQ0YTFmNmZmLTA4NzYtNGVkYi05MTY5LWRiYjQzMTAxZWU4OV8wMDUzX1Zpc2lvU3RkVm9sdW1lDQoxNV8xOTE1MDlmMi02OTc3LTQ1NmYtYWIz MC1jZjA0OTJiMWU5M2FfMDAxQl9Xb3JkUmV0YWlsDQoxNV85Y2VkZWYxNS1iZTM3LTRmZjAtYTA4YS0xM2EwNDU1NDA2NDFfMDAxQl9Xb3JkVm9sdW1lDQo6 OiBPZmZpY2UgMzY1IC0gMTUuMCB2ZXJzaW9uDQoxNV9iZWZlZTM3MS1hMmY1LTQ2NDgtODVkYi1hMmM1NWZkZjMyNGNfMDBFOV9PMzY1QnVzaW5lc3NSZXRh aWwNCjE1XzUzN2VhNWI1LTdkNTAtNDg3Ni1iZDM4LWE1M2E3N2NhY2EzMl8wMEQ2X08zNjVIb21lUHJlbVJldGFpbA0KMTVfMTQ5ZGJjZTctYTQ4ZS00NGRi LTgzNjQtYTUzMzg2Y2Q0NTgwXzAwRDRfTzM2NVByb1BsdXNSZXRhaWwNCjE1X2JhY2Q0NjE0LTViZWYtNGE1ZS1iYWZjLWRlNGM3ODgwMzdhMl8wMEQ1X08z NjVTbWFsbEJ1c1ByZW1SZXRhaWwNCjo6IE9mZmljZSAzNjUgLSAxNi4wIHZlcnNpb24NCjE2XzYzMzcxMzdlLTdjMDctNDE5Ny04OTg2LWJlY2U2YTc2ZmMz M18wMEU5X08zNjVCdXNpbmVzc1JldGFpbA0KMTZfMmY1YzcxYjQtNWI3YS00MDA1LWJiNjgtZjlmYWMyNmYyZWEzXzAwRDZfTzM2NUVkdUNsb3VkUmV0YWls DQoxNl81MzdlYTViNS03ZDUwLTQ4NzYtYmQzOC1hNTNhNzdjYWNhMzJfMDBENl9PMzY1SG9tZVByZW1SZXRhaWwNCjE2XzE0OWRiY2U3LWE0OGUtNDRkYi04 MzY0LWE1MzM4NmNkNDU4MF8wMEQ0X08zNjVQcm9QbHVzUmV0YWlsDQoxNl9iYWNkNDYxNC01YmVmLTRhNWUtYmFmYy1kZTRjNzg4MDM3YTJfMDBENV9PMzY1 U21hbGxCdXNQcmVtUmV0YWlsDQo6OiBPZmZpY2UgMjAxNg0KMTZfYmZhMzU4YjAtOThmMS00MTI1LTg0MmUtNTg1ZmExMzAzMmU2XzAwMTVfQWNjZXNzUmV0 YWlsDQoxNl85ZDlmYWY5ZS1kMzQ1LTRiNDktYWZjZS02OGNiMGE1MzljN2NfMDAxQ19BY2Nlc3NSdW50aW1lUmV0YWlsDQoxNl8zYjJmYTMzZi1jZDVhLTQz YTUtYmQ5NS1mNDlmM2Y1NDZiMGJfMDAxNV9BY2Nlc3NWb2x1bWUNCjE2XzQyNGQ1MmZmLTdhZDItNGJjNy04YWM2LTc0OGQ3NjdiNDU1ZF8wMDE2X0V4Y2Vs UmV0YWlsDQoxNl82ODUwNjJhNy02MDI0LTQyZTctOGM1Zi02YmI5ZTYzZTY5N2ZfMDAxNl9FeGNlbFZvbHVtZQ0KMTZfYzAyZmI2MmUtMWNkNS00ZTE4LWJh MjUtZTA0ODA0NjdmZmFhXzAwRTdfSG9tZUJ1c2luZXNzUGlwY1JldGFpbA0KMTZfODY4MzRkMDAtNzg5Ni00YTM4LThmYWUtMzJmMjBiODZmYTJiXzAwMTNf SG9tZUJ1c2luZXNzUmV0YWlsDQoxNl8wOTA4OTZhMC1lYTk4LTQ4YWMtYjU0NS1iYTVkYTBlYjBjOWNfMDBDRV9Ib21lU3R1ZGVudEFSTVJldGFpbA0KMTZf NmJiZTIwNzctMDFhNC00MjY5LWJmMTUtNWJmNGQ4ZWZjMGIyXzAwREFfSG9tZVN0dWRlbnRQbHVzQVJNUmV0YWlsDQoxNl9jMjhhY2RiOC1kOGIzLTQxOTkt YmFhNC0wMjRkMDllOTdjOTlfMDAyRl9Ib21lU3R1ZGVudFJldGFpbA0KMTZfZTIxMjc1MjYtYjYwYy00M2UwLWJlZDEtM2M5ZGMzZDVhNDY4XzAwMkZfSG9t ZVN0dWRlbnRWTmV4dFJldGFpbA0KMTZfYjIxMzY3ZGYtOTU0NS00ZjAyLTlmMjQtMjQwNjkxZGEwZTU4XzAwMEZfTW9uZG9SZXRhaWwNCjE2XzJjZDBlYTdl LTc0OWYtNDI4OC1hMDVlLTU2N2M1NzNiMmE2Y18wMDBGX01vbmRvVm9sdW1lDQoxNl80MzYzNjZkZS01NTc5LTRmMjQtOTZkYi0zODkzZTQ0MDAwMzBfMDBB M19PbmVOb3RlRnJlZVJldGFpbA0KMTZfODNhYzRkZDktMWI5My00MGVkLWFhNTUtZWRlMjViYjZhZjM4XzAwQTFfT25lTm90ZVJldGFpbA0KMTZfMjNiNjcy ZGEtYTQ1Ni00ODYwLWE4ZjMtZTA2MmE1MDFkN2U4XzAwQTFfT25lTm90ZVZvbHVtZQ0KMTZfNWE2NzA4MDktMDk4My00YzJkLThhYWQtZDNjMmM1YjdkNWQx XzAwMUFfT3V0bG9va1JldGFpbA0KMTZfNTAwNTk5NzktYWM2Zi00NDU4LTllNzktNzEwYmNiNDE3MjFhXzAwMUFfT3V0bG9va1ZvbHVtZQ0KMTZfNWFhYjg1 NjEtMTY4Ni00M2Y3LTlmZjUtMmM4NjFkYTU4ZDE3XzAwRTZfUGVyc29uYWxQaXBjUmV0YWlsDQoxNl9hOWY2NDVhMS0wZDZhLTQ5NzgtOTI2YS1hYmNiMzYz YjcyYTZfMDAzM19QZXJzb25hbFJldGFpbA0KMTZfZjMyZDEyODQtMDc5Mi00OWRhLTlhYzYtZGViMmJjOWM4MGI2XzAwMThfUG93ZXJQb2ludFJldGFpbA0K MTZfOWI0MDYwYzktYTdmNS00YTY2LWI3MzItZmFmMjQ4YjcyNDBmXzAwMThfUG93ZXJQb2ludFZvbHVtZQ0KMTZfNGUyNmNhYzEtZTE1YS00NDY3LTkwNjkt Y2I0N2I2N2ZlMTkxXzAwRThfUHJvZmVzc2lvbmFsUGlwY1JldGFpbA0KMTZfZDY0ZWRjMDAtNzQ1My00MzAxLTg0MjgtMTk3MzQzZmFmYjE2XzAwMTRfUHJv ZmVzc2lvbmFsUmV0YWlsDQoxNl8wZjQyZjMxNi0wMGIxLTQ4YzUtYWRhNC0yZjUyYjU3MjBhZDBfMDAzQl9Qcm9qZWN0UHJvUmV0YWlsDQoxNl84MmY1MDJi NS1iMGIwLTQzNDktYmQyYy1jNTYwZGY4NWIyNDhfMDAzQl9Qcm9qZWN0UHJvVm9sdW1lDQoxNl8xNjcyODYzOS1hOWFiLTQ5OTQtYjZkOC1mODEwNTFlNjk4 MzNfMDAzQl9Qcm9qZWN0UHJvWFZvbHVtZQ0KMTZfZTlmMGIzZmMtOTYyZi00OTQ0LWFkMDYtMDVjMTBiNmJjZDVlXzAwM0FfUHJvamVjdFN0ZFJldGFpbA0K MTZfODJlNmIzMTQtMmE2Mi00ZTUxLTkyMjAtNjEzNThkZDIzMGU2XzAwM0FfUHJvamVjdFN0ZFZvbHVtZQ0KMTZfNDMxMDU4ZjAtYzA1OS00NGM1LWI5ZTct ZWQyZGQ0NmI2Nzg5XzAwM0FfUHJvamVjdFN0ZFhWb2x1bWUNCjE2X2RlNTJiZDUwLTk1NjQtNGFkYy04ZmNiLWEzNDVjMTdmODRmOV8wMDExX1Byb1BsdXNS ZXRhaWwNCjE2X2M0NzQ1NmUzLTI2NWQtNDdiNi04Y2EwLWMzMGFiYmQwY2EzNl8wMDExX1Byb1BsdXNWb2x1bWUNCjE2XzZlMGMxZDk5LWM3MmUtNDk2OC1i Y2I3LWFiNzllMDNlMjAxZV8wMDE5X1B1Ymxpc2hlclJldGFpbA0KMTZfZmNjMTc1N2ItNWQ1Zi00ODZhLTg3Y2YtYzRkNmRlZGI2MDMyXzAwMTlfUHVibGlz aGVyVm9sdW1lDQoxNl85NzFjZDM2OC1mMmUxLTQ5YzEtYWVkZC0zMzA5MDljZTE4YjZfMDEyRF9Ta3lwZWZvckJ1c2luZXNzRW50cnlSZXRhaWwNCjE2XzQx OGQyYjlmLWI0OTEtNGQ3Zi04NGYxLTQ5ZTI3Y2M2NjU5N18wMTJDX1NreXBlZm9yQnVzaW5lc3NSZXRhaWwNCjE2XzAzY2EzYjlhLTA4NjktNDc0OS04OTg4 LTNjYmM5ZDlmNTFiYl8wMTJDX1NreXBlZm9yQnVzaW5lc3NWb2x1bWUNCjE2XzkxMDNmM2NlLTEwODQtNDQ3YS04MjdlLWQ2MDk3ZjY4Yzg5NV8wMTJDX1Nr eXBlU2VydmljZUJ5cGFzc1JldGFpbA0KMTZfNGEzMWMyOTEtM2ExMi00YzY0LWI4YWItY2Q3OTIxMmJlNDVlXzAwMTJfU3RhbmRhcmRSZXRhaWwNCjE2XzBl ZDk0YWFjLTIyMzQtNDMwOS1iYTI5LTc0YmRiYjg4NzA4M18wMDEyX1N0YW5kYXJkVm9sdW1lDQoxNl8yZGZlMjA3NS0yZDA0LTRlNDMtODE2YS1lYjYwYmJi Nzc1NzRfMDA1MV9WaXNpb1Byb1JldGFpbA0KMTZfMjk1YjJjMDMtNGIxYy00MjIxLWIyOTItMTQxMWY0NjhiZDAyXzAwNTFfVmlzaW9Qcm9Wb2x1bWUNCjE2 XzA1OTRkYzEyLTg0NDQtNDkxMi05MzZhLTc0N2NhNzQyZGJkYl8wMDUxX1Zpc2lvUHJvWFZvbHVtZQ0KMTZfYzc2ZGJjYmMtZDcxYi00ZjQ1LWI1YjMtYjc0 OTRjYjRlMjNlXzAwNTNfVmlzaW9TdGRSZXRhaWwNCjE2XzQ0MTUxYzJkLWMzOTgtNDcxZi05NDZmLTc2NjA1NDJlMzM2OV8wMDUzX1Zpc2lvU3RkVm9sdW1l DQoxNl8xZDFjNjg3OS0zOWEzLTQ3YTUtOWE2ZC1hY2VlZmE2YTI4OWRfMDA1M19WaXNpb1N0ZFhWb2x1bWUNCjE2X2NhY2FhMWJmLWRhNTMtNGMzYi05NzAw LTExNzM4ZWYxYzJhNV8wMDFCX1dvcmRSZXRhaWwNCjE2X2MzMDAwNzU5LTU1MWYtNGY0YS1iY2FjLWE0YjQyY2JmMWRlMl8wMDFCX1dvcmRWb2x1bWUNCikg ZG8gKA0KZm9yIC9mICJ0b2tlbnM9MS01IGRlbGltcz1fIiAlJUEgaW4gKCIlJSMiKSBkbyAoDQoNCmlmICIlb1ZlciUiPT0iJSVBIiAoDQpyZWcgcXVlcnkg IiUxXFJlZ2lzdHJhdGlvblx7JSVCfSIgL3YgUHJvZHVjdENvZGUgJW51bDIlIHwgZmluZCAvaSAiLSUlQy0iICVudWwlICYmICgNCnJlZyBxdWVyeSAiJTFc Q29tbW9uXEluc3RhbGxlZFBhY2thZ2VzIiAlbnVsMiUgfCBmaW5kIC9pICItJSVDLSIgJW51bCUgJiYgKA0KaWYgZGVmaW5lZCBfb0lkcyAoc2V0IF9vSWRz PSFfb0lkcyEgJSVEKSBlbHNlIChzZXQgX29JZHM9JSVEKQ0KaWYgL2kgMDAzRD09JSVDIHNldCBTaW5nbGVJbWFnZT0xDQopDQopDQopDQoNCikNCikNCmV4 aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICAxc3QgY29sdW1uID0gQWN0aXZhdGlvbiBJ RA0KOjogIDJuZCBjb2x1bW4gPSBHVkxLIC8gRnJlZSBPZmZpY2UgcHJvZHVjdHMga2V5cw0KOjogIDNyZCBjb2x1bW4gPSBJbiBjYXNlIG9mIFdpbmRvd3Ms IGl0cyBTS1UgSUQuIEluIGNhc2Ugb2YgT2ZmaWNlLCBpdHMgT2ZmaWNlIHZlcnNpb24NCjo6ICA0dGggY29sdW1uID0gRWRpdGlvbiBJRA0KOjogIDV0aCBj b2x1bW4gPSBJbiBjYXNlIG9mIFdpbmRvd3MsIGl0cyBCdWlsZCBCcmFuY2ggbmFtZSBpbiBjYXNlIHNhbWUgRWRpdGlvbiBJRCBpcyB1c2VkIGluIGRpZmZl cmVudCBPUyB2ZXJzaW9ucyB3aXRoIGRpZmZlcmVudCBrZXkgKEZvciByZWZlcmVuY2Ugb25seSkNCjo6ICAgICAgICAgICAgICAgSW4gY2FzZSBvZiBPZmZp Y2UsIGl0cyBlaXRoZXIgYSBrZXkgdHlwZSBpZiBpdHMgYSBmcmVlIE9mZmljZSBwcm9kdWN0IG9yIFJldGFpbCBwcm9kdWN0IG5hbWVzIHRoYXQgbmVlZHMg dG8gYmUgY29udmVydGVkIHRvIHRoZSBFZGl0aW9uIElEIG1lbnRpb25lZCBpbiA0dGggY29sdW1uDQo6OiAgICAgICAgICAgICAgIEluIE9mZmljZSAyMDEw LCBvbmUgaGlnaGVzdCBWTCBlZGl0aW9uIGZyb20gZWFjaCBwcmltYXJ5IHByb2R1Y3QgSUQgaXMgc2VsZWN0ZWQsIHRoYXQncyB3aHkgVmlzaW8gUHJlbSBr ZXkgaXMgbWVudGlvbmVkIGJ1dCBub3QgZm9yIFZpc2lvIFBybywgU3RkDQo6OiAgU2VwYXJhdG9yICA9ICJfIg0KDQo6a3NkYXRhDQoNCnNldCBmPQ0KZm9y ICUlIyBpbiAoDQo6OiBXaW5kb3dzIDEwLzExDQo3MzExMTEyMS01NjM4LTQwZjYtYmMxMS1mMWQ3YjBkNjQzMDBfTlBQUjktRldEQ1gtRDJDOEotSDg3Mkst MlklZiVUNDNfX180X0VudGVycHJpc2UNCmUyNzJlM2UyLTczMmYtNGM2NS1hOGYwLTQ4NDc0N2QwZDk0N19EUEgyVi1UVE5WQi00WDlRMy1USlI0SC1LSCVm JUpXNF9fMjdfRW50ZXJwcmlzZU4NCjJkZTY3MzkyLWI3YTctNDYyYS1iMWNhLTEwOGRkMTg5ZjU4OF9XMjY5Ti1XRkdXWC1ZVkM5Qi00SjZDOS1UOCVmJTNH WF9fNDhfUHJvZmVzc2lvbmFsDQphODBiNWFiZi03NmFkLTQyOGItYjA1ZC1hNDdkMmRmZmVlYmZfTUgzN1ctTjQ3WEstVjdYTTktQzcyMjctR0MlZiVRRzlf XzQ5X1Byb2Zlc3Npb25hbE4NCjdiOWUxNzUxLWE4ZGEtNGY3NS05NTYwLTVmYWRmZTNkOGUzOF8zS0hZNy1XTlQ4My1ER1FLUi1GN0hQUi04NCVmJTRCTV9f OThfQ29yZU4NCmE5MTA3NTQ0LWY0YTAtNDA1My1hOTZhLTE0NzlhYmRlZjkxMl9QVk1KTi02REZZNi05Q0NQNi03QktUVC1EMyVmJVdWUl9fOTlfQ29yZUNv dW50cnlTcGVjaWZpYw0KY2Q5MThhNTctYTQxYi00YzgyLThkY2UtMWE1MzhlMjIxYTgzXzdITlJYLUQ3S0dHLTNLNFJRLTRXUEo0LVlUJWYlREZIXzEwMF9D b3JlU2luZ2xlTGFuZ3VhZ2UNCjU4ZTk3Yzk5LWYzNzctNGVmMS04MWQ1LTRhZDU1MjJiNWZkOF9UWDlYRC05OE43Vi02V01RNi1CWDdGRy1IOCVmJVE5OV8x MDFfQ29yZQ0KZTBjNDIyODgtOTgwYy00Nzg4LWEwMTQtYzA4MGQyZTE5MjZlX05XNkMyLVFNUFZXLUQ3S0tLLTNHS1Q2LVZDJWYlRkIyXzEyMV9FZHVjYXRp b24NCjNjMTAyMzU1LWQwMjctNDJjNi1hZDIzLTJlN2VmOGEwMjU4NV8yV0g0Ti04UUdCVi1IMjJKUC1DVDQzUS1NRCVmJVdXSl8xMjJfRWR1Y2F0aW9uTg0K MzJkMmZhYjMtZTRhOC00MmMyLTkyM2ItNGJmNGZkMTNlNmVlX003WFRRLUZOOFA2LVRUS1lWLTlENENDLUo0JWYlNjJEXzEyNV9FbnRlcnByaXNlU19SUzUs VkIsR2UNCjJkNWE1YTYwLTMwNDAtNDhiZi1iZWIwLWZjZDc3MGMyMGNlMF9EQ1BISy1ORk1UQy1IODhNSi1QRkhQWS1RSiVmJTRCSl8xMjVfRW50ZXJwcmlz ZVNfUlMxDQo3YjUxYTQ2Yy0wYzA0LTRlOGYtOWFmNC04NDk2Y2NhOTBkNWVfV05NVFItNEM4OEMtSks4WVYtSFE3VDItNzYlZiVERjlfMTI1X0VudGVycHJp c2VTX1RIMQ0KNzEwM2EzMzMtYjhjOC00OWNjLTkzY2UtZDM3YzA5Njg3ZjkyXzkyTkZYLThESlFQLVA2QkJRLVRIRjlDLTdDJWYlRzJIXzEyNl9FbnRlcnBy aXNlU05fUlM1LFZCLEdlDQo5Zjc3NmQ4My03MTU2LTQ1YjItOGE1Yy0zNTliOWM5ZjIyYTNfUUZGRE4tR1JUM1AtVktXV1gtWDdUM1ItOEIlZiU2MzlfMTI2 X0VudGVycHJpc2VTTl9SUzENCjg3YjgzOGI3LTQxYjYtNDU5MC04MzE4LTU3OTc5NTFkODUyOV8yRjc3Qi1UTkZHWS02OVFRRi1COFlLUC1ENiVmJTlUSl8x MjZfRW50ZXJwcmlzZVNOX1RIMQ0KODJiYmMwOTItYmM1MC00ZTE2LThlMTgtYjc0ZmM0ODZhZWMzX05SRzhCLVZLSzNRLUNYVkNKLTlHMlhGLTZRJWYlODRK XzE2MV9Qcm9mZXNzaW9uYWxXb3Jrc3RhdGlvbg0KNGIxNTcxZDMtYmFmYi00YjQwLTgwODctYTk2MWJlMmNhZjY1XzlGTkhILUszSEJULTNXNFRELTYzODNI LTZYJWYlWVdGXzE2Ml9Qcm9mZXNzaW9uYWxXb3Jrc3RhdGlvbk4NCjNmMWFmYzgyLWY4YWMtNGY2Yy04MDA1LTFkMjMzZTYwNmVlZV82VFA0Ui1HTlBURC1L WVlIUS03QjdEUC1KNCVmJTQ3WV8xNjRfUHJvZmVzc2lvbmFsRWR1Y2F0aW9uDQo1MzAwYjE4Yy0yZTMzLTRkYzItODI5MS00N2ZmY2VjNzQ2ZGRfWVZXR0Yt QlhOTUMtSFRRWVEtQ1BROTktNjYlZiVRRkNfMTY1X1Byb2Zlc3Npb25hbEVkdWNhdGlvbk4NCmUwYjJkMzgzLWQxMTItNDEzZi04YTgwLTk3ZjM3M2E1ODIw Y19ZWVZYOS1OVEZXVi02TURNMy05UFQ0VC00TSVmJTY4Ql8xNzFfRW50ZXJwcmlzZUcNCmUzODQ1NGZiLTQxYTQtNGY1OS1hNWRjLTI1MDgwZTM1NDczMF80 NFJQTi1GVFkyMy05VlRUQi1NUDlCWC1UOCVmJTRGVl8xNzJfRW50ZXJwcmlzZUdODQplYzg2OGU2NS1mYWRmLTQ3NTktYjIzZS05M2ZlMzdmMmNjMjlfQ1BX SEMtTlQyQzctVllXNzgtREhEQjItUEclZiUzR0tfMTc1X1NlcnZlclJkc2hfUlM1DQplNGRiNTBlYS1iZGExLTQ1NjYtYjA0Ny0wY2E1MGFiYzZmMDdfN05C VDQtV0dCUVgtTVA0SDctUVhGRjgtWVAlZiUzS1hfMTc1X1NlcnZlclJkc2hfUlMzDQowZGY0ZjgxNC0zZjU3LTRiOGItOWE5ZC1mZGRhZGNkNjlmYWNfTkJU V0otM0RSNjktM0M0VjgtQzI2TUMtR1ElZiU5TTZfMTgzX0Nsb3VkRQ0KNTllYjk2NWMtOTE1MC00MmI3LWEwZWMtMjIxNTFiOTg5N2M1X0tCTjhWLUhGR1E0 LU1HWFZELTM0N1A2LVBEJWYlUUdUXzE5MV9Jb1RFbnRlcnByaXNlU19WQixOSQ0KZDMwMTM2ZmMtY2I0Yi00MTZlLWEyM2QtODcyMDdhYmM0NGE5XzZYTjdW LVBDQkRDLUJEQlJILThEUVk3LUc2JWYlUjQ0XzIwMl9DbG91ZEVkaXRpb25ODQpjYTdkZjJlMy01ZWEwLTQ3YjgtOWFjMS1iMWJlNGQ4ZWRkNjlfMzdEN0Yt TjQ5Q0ItV1FSOFctVEJKNzMtRk0lZiU4UlhfMjAzX0Nsb3VkRWRpdGlvbg0KOjogV2luZG93cyAyMDE2LzE5LzIyLzI1IExUU0MvU0FDDQo3ZGMyNjQ0OS1k YjIxLTRlMDktYmEzNy0yOGYyOTU4NTA2YTZfVFZSSDYtV0hOWFYtUjlXRzMtOVhSRlktTVklZiU4MzJfX183X1NlcnZlclN0YW5kYXJkX0dlDQo5YmQ3Nzg2 MC05YjMxLTRiN2ItOTZhZC0yNTY0MDE3MzE1YmZfVkRZQk4tMjdXUFAtVjRIUVQtOVZNRDQtVk0lZiVLN0hfX183X1NlcnZlclN0YW5kYXJkX0ZFDQpkZTMy ZWFmZC1hYWVlLTQ2NjItOTQ0NC1jMWJlZmI0MWJkZTJfTjY5RzQtQjg5SjItNEc4RjQtV1dZQ0MtSjQlZiU2NENfX183X1NlcnZlclN0YW5kYXJkX1JTNQ0K OGMxYzU0MTAtOWYzOS00ODA1LThjOWQtNjNhMDc3MDYzNThmX1dDMkJRLThOUk0zLUZERFlZLTJCRkdWLUtIJWYlS1FZX19fN19TZXJ2ZXJTdGFuZGFyZF9S UzENCmMwNTJmMTY0LWNkZjYtNDA5YS1hMGNiLTg1M2JhMGYwZjU1YV9ENzY0Sy0yTkRSRy00N1Q2US1QOFQ4Vy1ZUCVmJTZERl9fXzhfU2VydmVyRGF0YWNl bnRlcl9HZQ0KZWY2Y2ZjOWYtOGM1ZC00NGFjLTlhYWQtZGU2YTJlYTBhZTAzX1dYNE5NLUtZV1lXLVFKSlI0LVhWM1FCLTZWJWYlTTMzX19fOF9TZXJ2ZXJE YXRhY2VudGVyX0ZFDQozNGUxYWU1NS0yN2Y4LTQ5NTAtODg3Ny03YTAzYmU1ZmIxODFfV01ER04tRzlQUUctWFZWWFgtUjNYNDMtNjMlZiVERkdfX184X1Nl cnZlckRhdGFjZW50ZXJfUlM1DQoyMWM1Njc3OS1iNDQ5LTRkMjAtYWRmYy1lZWNlMGUxYWQ3NGJfQ0I3S0YtQldOODQtUjdSMlktNzkzSzItOFglZiVEREdf X184X1NlcnZlckRhdGFjZW50ZXJfUlMxDQowMzRkM2NiYi01ZDRiLTQyNDUtYjNmOC1mODQ1NzEzMTQwNzhfV1ZESE4tODZNN1gtNDY2UDYtVkhYVjctWVkl ZiU3MjZfXzUwX1NlcnZlclNvbHV0aW9uX1JTNQ0KMmI1YTFiMGYtYTVhYi00YzU0LWFjMmYtYTZkOTQ4MjRhMjgzX0pDS1JGLU4zN1A0LUMyRDgyLTlZWFJU LTRNJWYlNjNCX181MF9TZXJ2ZXJTb2x1dGlvbl9SUzENCjdiNDQzM2Y0LWIxZTctNDc4OC04OTVhLWM0NTM3OGQzODI1M19RTjRDNi1HQkpEMi1GQjQyMi1H SFdKSy1HSiVmJUcyUl8xMTBfU2VydmVyQ2xvdWRTdG9yYWdlDQo4ZGU4ZWI2Mi1iYmUwLTQwYWMtYWMxNy1mNzU1OTUwNzFlYTNfR1JGQlctUU5EQzQtNlFC SEctQ0NLM0ItMlAlZiVSODhfMTIwX1NlcnZlckFSTTY0X1JTNQ0KNDNkOWFmNmUtNWU4Ni00YmU4LWE3OTctZDA3MmEwNDY4OTZjX0s5RllGLUc2TkNLLTcz TTMyLVhNVlBZLUY5JWYlRFJSXzEyMF9TZXJ2ZXJBUk02NF9SUzQNCjM5ZTY5YzQxLTQyYjQtNGEwYS1hYmFkLThlM2MxMGE3OTdjY19RRk5EOS1EM1k5Qy1K M0tLWS02UlBWUC0yRCVmJVBZVl8xNDVfU2VydmVyRGF0YWNlbnRlckFDb3JfRkUNCjkwYzM2MmU1LTBkYTEtNGJmZC1iNTNiLWI4N2QzMDlhZGU0M182Tk1S Vy0yQzhGTS1EMjRXNy1UUVdNWS1DVyVmJUgyRF8xNDVfU2VydmVyRGF0YWNlbnRlckFDb3JfUlM1DQplNDljMDhlNy1kYTgyLTQyZjgtYmRlMi1iNTcwZmJj YWU3NmNfMkhYRE4tS1JYSEItR1BZQzctWUNLRkotN0YlZiVWREdfMTQ1X1NlcnZlckRhdGFjZW50ZXJBQ29yX1JTMw0KZjVlOTQyOWMtZjUwYi00Yjk4LWIx NWMtZWY5MmViNWNmZjM5XzY3S044LTRGWUpXLTI0ODdRLU1RMko3LTRDJWYlNFJHXzE0Nl9TZXJ2ZXJTdGFuZGFyZEFDb3JfRkUNCjczZTM5NTdjLWZjMGMt NDAwZC05MTg0LTVmN2I2ZjJlYjQwOV9OMktKWC1KOTRZVy1UUVZGQi1ERzlZVC03MiVmJTRDQ18xNDZfU2VydmVyU3RhbmRhcmRBQ29yX1JTNQ0KNjFjNWVm MjItZjE0Zi00NTUzLWE4MjQtYzRiMzFlODRiMTAwX1BUWE44LUpGSEpNLTRXQzc4LU1QQ0JSLTlXJWYlNEtSXzE0Nl9TZXJ2ZXJTdGFuZGFyZEFDb3JfUlMz DQo0NWI1YWZmMi02MGEwLTQyZjItYmM0Yi1lYzZlNWY3YjUyN2VfRkNOVjMtMjc5UTktQlFCNDYtRlRLWFgtOUglZiVQUkhfMTY4X1NlcnZlckF6dXJlQ29y X0dlDQo4YzhmMGFkMy05YTQzLTRlMDUtYjg0MC05M2I4ZDE0NzVjYmNfNk4zNzktR0dUTUstMjNDNk0tWFZWVEMtQ0slZiVGUlFfMTY4X1NlcnZlckF6dXJl Q29yX0ZFDQphOTljYzFmMC03NzE5LTQzMDYtOTY0NS0yOTQxMDJmYmZmOTVfRkROSDYtVlc5UlctQlhQSjctNFhUWUctMjMlZiU5VEJfMTY4X1NlcnZlckF6 dXJlQ29yX1JTNQ0KM2RiZjM0MWItNWY2Yy00ZmE3LWI5MzYtNjk5ZGNlOWUyNjNmX1ZQMzRHLTROUFBHLTc5SlRRLTg2NFQ0LVIzJWYlTVFYXzE2OF9TZXJ2 ZXJBenVyZUNvcl9SUzENCmMyZTk0NmQxLWNmYTItNDUyMy04Yzg3LTMwYmM2OTZlZTU4NF9YR04zRi1GMzk0SC1GRDJNWS1QUDZGRC04TSVmJUNSQ180MDdf U2VydmVyVHVyYmluZV9HZQ0KMTliNWUwZmItNDQzMS00NmJjLWJhYzEtMmYxODczZTRhZTczX05UQlY4LTlLN1E4LVYyN0M2LU0yQlRWLUtIJWYlTVhWXzQw N19TZXJ2ZXJUdXJiaW5lX1JTNQ0KOjogV2luZG93cyA4LjENCjgxNjcxYWFmLTc5ZDEtNGViMS1iMDA0LThjYmJlMTczYWZlYV9NSEY5Ti1YWTZYQi1XVlhN Qy1CVERDVC1NSyVmJUtHN19fXzRfRW50ZXJwcmlzZQ0KMTEzZTcwNWMtZmE0OS00OGE0LWJlZWEtN2RkODc5YjQ2YjE0X1RUNEhNLUhON1lULTYySzY3LVJH UlFKLUpGJWYlRlhXX18yN19FbnRlcnByaXNlTg0KYzA2YjY5ODEtZDdmZC00YTM1LWI3YjQtMDU0NzQyYjdhZjY3X0dDUkpELThOVzlILUYyQ0RYLUNDTThE LTlEJWYlNlQ5X180OF9Qcm9mZXNzaW9uYWwNCjc0NzZkNzlmLThlNDgtNDliNC1hYjYzLTRkMGI4MTNhMTZlNF9ITUNOVi1WVkJGWC03SE1CSC1DVFk5Qi1C NCVmJUZYWV9fNDlfUHJvZmVzc2lvbmFsTg0KZjdlODg1OTAtZGZjNy00Yzc4LWJjY2ItNmYzODY1Yjk5ZDFhX1ZIWE0zLU5SNkZULVJZNlJULUNLODgyLUtX JWYlMkNKX184Nl9FbWJlZGRlZEluZHVzdHJ5QQ0KMGFiODJkNTQtNDdmNC00YWNiLTgxOGMtY2M1YmYwZWNiNjQ5X05NTVBCLTM4REQ0LVIyODIzLTYyVzhE LVZYJWYlS0pCX184OV9FbWJlZGRlZEluZHVzdHJ5DQpjZDRlMmQ5Zi01MDU5LTRhNTAtYTkyZC0wNWQ1YmIxMjY3YzdfRk5GS0YtUFdUVlQtOVJDOEgtMzJI QjItSkIlZiUzNFhfXzkxX0VtYmVkZGVkSW5kdXN0cnlFDQpmZmVlNDU2YS1jZDg3LTQzOTAtOGUwNy0xNjE0NmM2NzJmZDBfWFlUTkQtSzZRS1QtSzJNUkgt NjZSVE0tNDMlZiVKS1BfXzk3X0NvcmVBUk0NCjc4NTU4YTY0LWRjMTktNDNmZS1hMGQwLTgwNzViMmEzNzBhM183QjlOMy1EOTRDRy1ZVFZIUi1RQlBYMy1S SiVmJVA2NF9fOThfQ29yZU4NCmRiNzhiNzRmLWVmMWMtNDg5Mi1hYmZlLTFlNjZiODIzMWRmNl9OQ1RUNy0yUkdLOC1XTUhSRi1SWTdZUS1KVCVmJVhHM19f OTlfQ29yZUNvdW50cnlTcGVjaWZpYw0KYzcyYzZhMWQtZjI1Mi00ZTdlLWJkZDEtM2ZjYTM0MmFjYjM1X0JCNk5HLVBRODJWLVZSRFBXLThYVkQyLVY4JWYl UDY2XzEwMF9Db3JlU2luZ2xlTGFuZ3VhZ2UNCmZlMWMzMjM4LTQzMmEtNDNhMS04ZTI1LTk3ZTdkMWVmMTBmM19NOVE5UC1XTkpKVC02UFhQWS1EV1g4SC02 WCVmJVdLS18xMDFfQ29yZQ0KMDk2Y2U2M2QtNGZhYy00OGE5LTgyYTktNjFhZTllODAwZTVmXzc4OU5KLVRRSzZULTZYVEg4LUozOUNKLUo4JWYlRDNQXzEw M19Qcm9mZXNzaW9uYWxXTUMNCmU5OTQyYjMyLTJlNTUtNDE5Ny1iMGJkLTVmZjU4Y2JhODg2MF8zUFk4Ui1RSE5QOS1XN1hRRC1HNkRQSC0zSiVmJTJDOV8x MTFfQ29yZUNvbm5lY3RlZA0KYzZkZGVjZDYtMjM1NC00YzE5LTkwOWItMzA2YTMwNTg0ODRlX1E2SFRSLU4yNEdNLVBNSkZQLTY5Q0Q4LTJHJWYlWEtSXzEx M19Db3JlQ29ubmVjdGVkTg0KYjhmNWUzYTMtZWQzMy00NjA4LTgxZTEtMzdkNmM5ZGNmZDljX0tGMzdOLVZEVjM4LUdSUlRWLVhIOFg2LTZGJWYlM0JCXzEx NV9Db3JlQ29ubmVjdGVkU2luZ2xlTGFuZ3VhZ2UNCmJhOTk4MjEyLTQ2MGEtNDRkYi1iZmI1LTcxYmYwOWQxYzY4Yl9SOTYySi0zN044Ny05VlZLMi1XSjc0 UC1YVCVmJU1IUl8xMTZfQ29yZUNvbm5lY3RlZENvdW50cnlTcGVjaWZpYw0KZTU4ZDg3YjUtODEyNi00NTgwLTgwZmItODYxYjIyZjc5Mjk2X01YM1JLLTlI TkdYLUszUUtDLTZQSjNGLVc4JWYlRDdCXzExMl9Qcm9mZXNzaW9uYWxTdHVkZW50DQpjYWI0OTFjNy1hOTE4LTRmNjAtYjUwMi1kYWI3NWUzMzRmNDBfVE5G R0gtMlI2UEItOFhNM0stUVlIWDItSjQlZiUyOTZfMTE0X1Byb2Zlc3Npb25hbFN0dWRlbnRODQo6OiBXaW5kb3dzIFNlcnZlciAyMDEyIFIyDQpiM2NhMDQ0 ZS1hMzU4LTRkNjgtOTg4My1hYWEyOTQxYWNhOTlfRDJOOVAtM1A2WDktMlIzOUMtN1JUQ0QtTUQlZiVWSlhfX183X1NlcnZlclN0YW5kYXJkDQowMDA5MTM0 NC0xZWE0LTRmMzctYjc4OS0wMTc1MGJhNjk4OGNfVzNHR04tRlQ4VzMtWTRNMjctSjg0Q1AtUTMlZiVWSjlfX184X1NlcnZlckRhdGFjZW50ZXINCjIxZGI2 YmE0LTlhN2ItNGExNC05ZTI5LTY0YTYwYzU5MzAxZF9LTkM4Ny0zSjJUWC1YQjRXUC1WQ1BKVi1NNCVmJUZXTV9fNTBfU2VydmVyU29sdXRpb24NCmI3NDNh MmJlLTY4ZDQtNGRkMy1hZjMyLTkyNDI1YjdiYjYyM18zTlBURi0zM0tQVC1HR0JQUi1ZWDc2Qi0zOSVmJUtERF8xMTBfU2VydmVyQ2xvdWRTdG9yYWdlDQo6 OiBXaW5kb3dzIDgNCjQ1OGUxYmVjLTgzN2EtNDVmNi1iOWQ1LTkyNWVkNWQyOTlkZV8zMkpOVy05S1E4NC1QNDdUOC1EOEdHWS1DVyVmJUNLN19fXzRfRW50 ZXJwcmlzZQ0KZTE0OTk3ZTctODAwYS00Y2Y3LWFkMTAtZGU0YjQ1YjU3OGRiX0pNTk1GLVJIVzdQLURNWTZYLVJGM0RSLVgyJWYlQlFUX18yN19FbnRlcnBy aXNlTg0KYTk4YmNkNmQtNTM0My00NjAzLThhZmUtNTkwOGU0NjExMTEyX05HNEhXLVZIMjZDLTczM0tXLUs2Rjk4LUo4JWYlQ0s0X180OF9Qcm9mZXNzaW9u YWwNCmViZjI0NWMxLTI5YTgtNGRhZi05Y2IxLTM4ZGZjNjA4YThjOF9YQ1ZDRi0yTlhNOS03MjNQQi1NSENCNy0yUiVmJVlRUV9fNDlfUHJvZmVzc2lvbmFs Tg0KMTAwMThiYWYtY2UyMS00MDYwLTgwYmQtNDdmZTc0ZWQ0ZGFiX1JZWFZULUJOUUc3LVZEMjlGLURCTVJZLUhUJWYlNzNNX184OV9FbWJlZGRlZEluZHVz dHJ5DQoxOGRiMTg0OC0xMmUwLTQxNjctYjlkNy1kYTdmY2RhNTA3ZGJfTktCM1ItUjJGOFQtM1hDRFAtN1EyS1ctWFclZiVZUTJfXzkxX0VtYmVkZGVkSW5k dXN0cnlFDQphZjM1ZDdiNy01MDM1LTRiNjMtODk3Mi1mMGI3NDdiOWY0ZGNfRFhISkYtTjlLUVgtTUZQVlItR0hHUUstWTclZiVSS1ZfXzk3X0NvcmVBUk0N CjE5NzM5MGEwLTY1ZjYtNGE5NS1iZGM0LTU1ZDU4YTNiMDI1M184TjJNMi1IV1BHWS03UEdUOS1IR0REOC1HViVmJUdHWV9fOThfQ29yZU4NCjlkNTU4NGEy LTJkODUtNDE5YS05ODJjLWEwMDg4OGJiOWRkZl80SzM2UC1KTjRWRC1HREM2Vi1LRFQ4OS1EWSVmJUZLUF9fOTlfQ29yZUNvdW50cnlTcGVjaWZpYw0KODg2 MGZjZDQtYTc3Yi00YTIwLTkwNDUtYTE1MGZmMTFkNjA5XzJXTjJILVlHQ1FSLUtGWDZLLUNENlRGLTg0JWYlWVhRXzEwMF9Db3JlU2luZ2xlTGFuZ3VhZ2UN CmMwNGVkNmJmLTU1YzgtNGI0Ny05ZjhlLTVhMWYzMWNlZWU2MF9CTjNEMi1SN1RLQi0zWVBCRC04RFJQMi0yNyVmJUdHNF8xMDFfQ29yZQ0KYTAwMDE4YTMt ZjIwZi00NjMyLWJmN2MtOGRhYTUzNTFjOTE0X0dOQkI4LVlWRDc0LVFKSFg2LTI3SDRLLThRJWYlSERHXzEwM19Qcm9mZXNzaW9uYWxXTUMNCjo6IFdpbmRv d3MgU2VydmVyIDIwMTINCmYwZjVlYzQxLTBkNTUtNDczMi1hZjAyLTQ0MGE0NGEzY2YwZl9YQzlCNy1OQlBQMi04M0oySC1SSE1CWS05MiVmJUJUNF9fXzdf U2VydmVyU3RhbmRhcmQNCmQzNjQzZDYwLTBjNDItNDEyZC1hN2Q2LTUyZTY2MzUzMjdmNl80OEhQOC1ETjk4Qi1NWVdERy1UMkRDQy04VyVmJTgzUF9fXzhf U2VydmVyRGF0YWNlbnRlcg0KOGYzNjViYTYtYzFiOS00MjIzLTk4ZmMtMjgyYTA3NTZhM2VkX0hURFFNLU5CTU1HLUtHWURULTJEVEtULUoyJWYlTVBWX181 MF9TZXJ2ZXJTb2x1dGlvbg0KN2Q1NDg2YzctZTEyMC00NzcxLWI3ZjEtN2I1NmM2ZDMxNzBjX0hNN0ROLVlWTUgzLTQ2SkMzLVhZVEc3LUNZJWYlUUpKX183 Nl9TZXJ2ZXJNdWx0aVBvaW50U3RhbmRhcmQNCjk1ZmQxYzgzLTdkZjUtNDk0YS1iZThiLTEzMDBlMWM5ZDFjZF9YTkg2Vy0yVjlHWC1SR0o0Sy1ZOFg2Ri1R RyVmJUoyR19fNzdfU2VydmVyTXVsdGlQb2ludFByZW1pdW0NCjo6IFdpbmRvd3MgNw0KYWUyZWU1MDktMWIzNC00MWMwLWFjYjctNmQ0NjUwMTY4OTE1XzMz UFhILTdZNktGLTJWSkM5LVhCQlI4LUhWJWYlVEhIX19fNF9FbnRlcnByaXNlDQoxY2I2ZDYwNS0xMWIzLTRlMTQtYmIzMC1kYTkxYzhlMzk4M2FfWURSQlAt M0Q4M1ctVFkyNkYtRDQ2QjItWEMlZiVLUkpfXzI3X0VudGVycHJpc2VODQpiOTJlOTk4MC1iOWQ1LTQ4MjEtOWM5NC0xNDBmNjMyZjYzMTJfRko4MkgtWFQ2 Q1ItSjhEN1AtWFFKSjItR1AlZiVERDRfXzQ4X1Byb2Zlc3Npb25hbA0KNTRhMDlhMGQtZDU3Yi00YzEwLThiNjktYTg0MmQ2NTkwYWQ1X01SUEtULVlURzIz LUs3RDdULVgySk1NLVFZJWYlN01HX180OV9Qcm9mZXNzaW9uYWxODQpkYjUzNzg5Ni0zNzZmLTQ4YWUtYTQ5Mi01M2QwNTQ3NzczZDBfWUJZRjYtQkhDUjMt SlBLUkItQ0RXN0ItRjklZiVCSzRfXzY1X0VtYmVkZGVkX1BPU1JlYWR5DQphYTZkZDNhYS1jMmI0LTQwZTItYTU0NC1hNmJiYjNmNWMzOTVfNzNLUVQtQ0Q5 RzYtSzdUUUctNjZNUlAtQ1ElZiUyMkNfXzY1X0VtYmVkZGVkX1RoaW5QQw0KNWEwNDE1MjktZmVmOC00ZDA3LWIwNmYtYjU5YjU3M2IzMmQyX1c4MllGLTJR NzZZLTYzSFhCLUZHSkc5LUdGJWYlN1FYX182OV9Qcm9mZXNzaW9uYWxFDQo0NmJiZWQwOC05YzdiLTQ4ZmMtYTYxNC05NTI1MDU3M2Y0ZWFfQzI5V0ItMjJD QzgtVkozMjYtR0hGSlctSDklZiVESDRfXzcwX0VudGVycHJpc2VFDQo6OiBXaW5kb3dzIFNlcnZlciAyMDA4IFIyDQo2ODUzMWZiOS01NTExLTQ5ODktOTdi ZS1kMTFhMGY1NTYzM2ZfWUM2S1QtR0tXOVQtWVRLWVItVDRYMzQtUjclZiVWSENfX183X1NlcnZlclN0YW5kYXJkDQo3NDgyZTYxYi1jNTg5LTRiN2YtOGVj Yy00NmQ0NTVhYzNiODdfNzRZRlAtM1FGQjMtS1FUOFctUE1YV0otN00lZiU2NDhfX184X1NlcnZlckRhdGFjZW50ZXINCjYyMGUyYjNkLTA5ZTctNDJmZC04 MDJhLTE3YTEzNjUyZmU3YV80ODlKNi1WSERNUC1YNjNQSy0zSzc5OC1DUCVmJVgzWV9fMTBfU2VydmVyRW50ZXJwcmlzZQ0KNzQ4MmU2MWItYzU4OS00Yjdm LThlY2MtNDZkNDU1YWMzYjg3Xzc0WUZQLTNRRkIzLUtRVDhXLVBNWFdKLTdNJWYlNjQ4X18xMl9TZXJ2ZXJEYXRhY2VudGVyQ29yZQ0KNjg1MzFmYjktNTUx MS00OTg5LTk3YmUtZDExYTBmNTU2MzNmX1lDNktULUdLVzlULVlUS1lSLVQ0WDM0LVI3JWYlVkhDX18xM19TZXJ2ZXJTdGFuZGFyZENvcmUNCjYyMGUyYjNk LTA5ZTctNDJmZC04MDJhLTE3YTEzNjUyZmU3YV80ODlKNi1WSERNUC1YNjNQSy0zSzc5OC1DUCVmJVgzWV9fMTRfU2VydmVyRW50ZXJwcmlzZUNvcmUNCjhh MjY4NTFjLTFjN2UtNDhkMy1hNjg3LWZiY2E5YjlhYzE2Yl9HVDYzQy1SSkZRMy00R01CNi1CUkZCOS1DQiVmJTgzVl9fMTVfU2VydmVyRW50ZXJwcmlzZUlB NjQNCmE3OGI4YmQ5LTgwMTctNGRmNS1iODZhLTA5Zjc1NmFmZmE3Y182VFBKRi1SQlZIRy1XQlcyUi04NlFQSC02UiVmJVRNNF9fMTdfU2VydmVyV2ViDQpj ZGExOGNmMy1jMTk2LTQ2YWQtYjI4OS02MGMwNzI4Njk5OTRfVFQ4TUgtQ0cyMjQtRDNEN1EtNDk4VzItOVElZiVDVFhfXzE4X1NlcnZlckhQQw0KYTc4Yjhi ZDktODAxNy00ZGY1LWI4NmEtMDlmNzU2YWZmYTdjXzZUUEpGLVJCVkhHLVdCVzJSLTg2UVBILTZSJWYlVE00X18yOV9TZXJ2ZXJXZWJDb3JlDQpmNzcyNTE1 Yy0wZTg3LTQ4ZDUtYTY3Ni1lNjk2MmMzZTExOTVfNzM2UkctWERLSkstVjM0UEYtQkhLODctSjYlZiVYM0tfXzU2X1NlcnZlckVtYmVkZGVkU29sdXRpb24N Cjo6IFdpbmRvd3MgVmlzdGENCmNmZDhmZjA4LWMwZDctNDUyYi05ZjYwLWVmNWM3MGMzMjA5NF9WS0szWC02OEtXTS1YMllHVC1RUjRNNi00QiVmJVdNVl9f XzRfRW50ZXJwcmlzZQ0KNGYzZDE2MDYtM2ZlYS00YzAxLWJlM2MtOGQ2NzFjNDAxZTNiX1lGS0JCLVBRSkpWLUc5OTZHLVZXR1hZLTJWJWYlM1g4X19fNl9C dXNpbmVzcw0KMmM2ODJkYzItOGI2OC00ZjYzLWExNjUtYWUyOTFkNGNmMTM4X0hNQlFHLThIMlJILUM3N1ZYLTI3UjgyLVZNJWYlUUJUX18xNl9CdXNpbmVz c04NCmQ0ZjU0OTUwLTI2ZjItNGZiNC1iYTIxLWZmYWIxNmFmY2FkZV9WVEM0Mi1CTTgzOC00M1FIVi04NEhYNi1YSiVmJVhLVl9fMjdfRW50ZXJwcmlzZU4N Cjo6IFdpbmRvd3MgU2VydmVyIDIwMDgNCmFkMjU0MmQ0LTkxNTQtNGM2ZC04YTQ0LTMwZjExZWU5Njk4OV9UTTI0VC1YOVJNRi1WV1hLNi1YOEpDOS1CRiVm JUdNMl9fXzdfU2VydmVyU3RhbmRhcmQNCjY4YjZlMjIwLWNmMDktNDY2Yi05MmQzLTQ1Y2Q5NjRiOTUwOV83TTY3Ry1QQzM3NC1HUjc0Mi1ZSDhWNC1UQyVm JUJZM19fXzhfU2VydmVyRGF0YWNlbnRlcg0KYzFhZjRkOTAtZDFiYy00NGNhLTg1ZDQtMDAzYmEzM2RiM2I5X1lRR01XLU1QV1RKLTM0S0RLLTQ4TTNXLVg0 JWYlUTZWX18xMF9TZXJ2ZXJFbnRlcnByaXNlDQowMWVmMTc2Yi0zZTBkLTQyMmEtYjRmOC00ZWE4ODAwMzVlOGZfNERXRlAtSkYzREotQjdEVEgtNzhGSkIt UEQlZiVSSEtfXzE1X1NlcnZlckVudGVycHJpc2VJQTY0DQpkZGZhOWY3Yy1mMDllLTQwYjktOGMxYS1iZTg3N2E5YTdmNGJfV1lSMjgtUjdURkotM1gyWVEt WUNZNEgtTTIlZiU0OURfXzE3X1NlcnZlcldlYg0KN2FmYjExNTYtMmMxZC00MGZjLWIyNjAtYWFiNzQ0MmI2MmZlX1JDVFgzLUtXVkhQLUJSNlRCLVJCNkRN LTZYJWYlN0hQX18xOF9TZXJ2ZXJDb21wdXRlQ2x1c3Rlcg0KMjQwMWUzZDAtYzUwYS00YjU4LTg3YjItN2U3OTRiN2QyNjA3X1c3VkQ2LTdKRkJSLVJYMjZC LVlLUTNZLTZGJWYlRkZKX18zNl9TZXJ2ZXJTdGFuZGFyZFYNCmZkMDllZjc3LTU2NDctNGVmZi04MDljLWFmMmI2NDY1OWE0NV8yMlhRMi1WUlhSRy1QOEQ0 Mi1LMzRURC1HMyVmJVFRQ19fMzdfU2VydmVyRGF0YWNlbnRlclYNCjgxOTg0OTBhLWFkZDAtNDdiMi1iM2JhLTMxNmIxMmQ2NDdiNF8zOUJYRi1YOFEyMy1Q MldXVC0zOFQyRi1HMyVmJUZQR19fMzhfU2VydmVyRW50ZXJwcmlzZVYNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 DQo6OiBPZmZpY2UgMjAxMA0KOGNlN2U4NzItMTg4Yy00Yjk4LTlkOTAtZjhmOTBiN2FhZDAyX1Y3WTQ0LTlUMzhDLVIyVkpLLTY2NkhLLVQ3JWYlRERYX18x NF9BY2Nlc3NWTA0KY2VlNWQ0NzAtNmUzYi00ZmNjLThjMmItZDE3NDI4NTY4YTlmX0g2MlFHLUhYVktGLVBQNEhQLTY2S01SLUNXJWYlOUJNX18xNF9FeGNl bFZMDQo4OTQ3ZDBiOC1jMzNiLTQzZTEtOGM1Ni05YjY3NGMwNTI4MzJfUVlZVzYtUVA0Q0ItTUJWNkctSFlNQ0otNFQlZiUzSjRfXzE0X0dyb292ZVZMDQpj YTZiNjYzOS00YWQ2LTQwYWUtYTU3NS0xNGRlZTA3ZjY0MzBfSzk2VzgtNjdSUFEtNjJUOVktSjhGUUotQlQlZiUzN1RfXzE0X0luZm9QYXRoVkwNCjA5ZWQ5 NjQwLWYwMjAtNDAwYS1hY2Q4LWQ3ZDg2N2RmZDljMl9ZQkpUVC1KRzZNRC1WOVE3UC1EQktYSi0zOCVmJVc5Ul9fMTRfTW9uZG9WTA0KYWI1ODZmNWMtNTI1 Ni00NjMyLTk2MmYtZmVmZDhiNDllNmY0X1E0WTRNLVJIV0pNLVBZMzdGLU1US1dILUQzJWYlWEhYX18xNF9PbmVOb3RlVkwNCmVjYjdjMTkyLTczYWItNGRl ZC1hY2Y0LTIzOTliMDk1ZDBjY183WURDMi1DV004TS1SUlRKQy04TURWQy1YMyVmJURXUV9fMTRfT3V0bG9va1ZMDQo0NTU5M2IxZC1kZmIxLTRlOTEtYmJm Yi0yZDVkMGNlMjIyN2FfUkM4RlgtODhKUlktM1BGN0MtWDhQNjctUDQlZiVWVFRfXzE0X1Bvd2VyUG9pbnRWTA0KZGYxMzNmZjctYmYxNC00Zjk1LWFmZTMt N2I0OGU3ZTMzMWVmX1lHWDZGLVBHVjQ5LVBHVzNKLTlCVEdHLVZIJWYlS0M2X18xNF9Qcm9qZWN0UHJvVkwNCjVkYzdiZjYxLTVlYzktNDk5Ni05Y2NiLWRm ODA2YTJkMGVmZV80SFAzSy04OFczRi1XMkszRC02Njc3WC1GOSVmJVBHQl9fMTRfUHJvamVjdFN0ZFZMDQo2ZjMyNzc2MC04YzVjLTQxN2MtOWI2MS04MzZh OTgyODdlMGNfVllCQkotVFJKUEItUUZRUkYtUUZUNEQtSDMlZiVHVkJfXzE0X1Byb1BsdXNWTA0KYjUwYzRmNzUtNTk5Yi00M2U4LThkY2QtMTA4MWE3OTY3 MjQxX0JGSzdGLTlNWUhNLVY2OEM3LURSUTY2LTgzJWYlWVRQX18xNF9QdWJsaXNoZXJWTA0KZWE1MDllODctMDdhMS00YTQ1LTllZGMtZWJhNWEzOWYzNmFm X0Q2UUZHLVZCWVAyLVhRSE03LUo5N1JILVZWJWYlUkNLX18xNF9TbWFsbEJ1c0Jhc2ljc1ZMDQo5ZGEyYTY3OC1mYjZiLTRlNjctYWI4NC02MGRkNmE5Yzgx OWFfVjdRS1YtNFhWVlItWFlWNEQtRjdERk0tOFIlZiU2Qk1fXzE0X1N0YW5kYXJkVkwNCjkyMjM2MTA1LWJiNjctNDk0Zi05NGM3LTdmN2E2MDc5MjliZF9E OURXQy1IUFlWVi1KR0Y0UC1CVFdRQi1XWCVmJThCSl9fMTRfVmlzaW9TSVZMDQoyZDA4ODJlNy1hNGU3LTQyM2ItOGNjYy03MGQ5MWUwMTU4YjFfSFZIQjMt QzZGVjctS1FYOVctWVFHNzktQ1IlZiVZN1RfXzE0X1dvcmRWTA0KOjogT2ZmaWNlIDIwMTMNCjZlZTc2MjJjLTE4ZDgtNDAwNS05ZmI3LTkyZGI2NDRhMjc5 Yl9ORzJKWS1INEpCVC1IUVhZUC03OFFIOS00SiVmJU0yRF9fMTVfQWNjZXNzVm9sdW1lXy1BY2Nlc3NSZXRhaWwtDQoyNTlkZTViZS00OTJiLTQ0YjMtOWQ3 OC05NjQ1Zjg0OGY3YjBfWDNYTkItSEpCN0stNjZUSEgtOERXUTMtWEglZiVHSlBfXzE1X0FjY2Vzc1J1bnRpbWVSZXRhaWxfW0J5cGFzc10NCmY3NDYxZDUy LTdjMmItNDNiMi04NzQ0LWVhOTU4ZTBiZDA5YV9WR1BORy1ZN0hRVy05UkhQNy1US1BWMy1CRyVmJTdHQl9fMTVfRXhjZWxWb2x1bWVfLUV4Y2VsUmV0YWls LQ0KZmI0ODc1ZWMtMGM2Yi00NTBmLWI4MmItYWI1N2Q4ZDE2NzdmX0g3UjdWLVdQTlhRLVdDWVlDLTc2QkdWLVZUJWYlN0dIX18xNV9Hcm9vdmVWb2x1bWVf LUdyb292ZVJldGFpbC0NCmEzMGI4MDQwLWQ2OGEtNDIzZi1iMGI1LTljZTI5MmVhNWE4Zl9ES1Q4Qi1ON1ZYSC1EOTYzUC1RNFBIWS1GOCVmJTg5NF9fMTVf SW5mb1BhdGhWb2x1bWVfLUluZm9QYXRoUmV0YWlsLQ0KOTEwM2YzY2UtMTA4NC00NDdhLTgyN2UtZDYwOTdmNjhjODk1XzZNRE40LVdGM0ZWLTRXSDNRLVc2 OTlWLVJHJWYlQ01ZX18xNV9MeW5jQWNhZGVtaWNSZXRhaWxfW1ByZXBpZEJ5cGFzc10NCmZmNjkzYmY0LTAyNzYtNGRkYi1iYjQyLTc0ZWYxYTBjOWY0ZF9O NDJCRi1DQlk5Ri1XMkM3Ui1YMzk3WC1EWSVmJUZRV19fMTVfTHluY0VudHJ5UmV0YWlsX1tQcmVwaWRCeXBhc3NdDQoxYjlmMTFlMy1jODVjLTRlMWItYmIy OS04NzlhZDJjOTA5ZTNfMk1HM0ctM0JOVFQtM01GVzktS0RRVzMtVEMlZiVLN1JfXzE1X0x5bmNWb2x1bWVfLUx5bmNSZXRhaWwtDQoxZGMwMDcwMS0wM2Fm LTQ2ODAtYjJhZi0wMDdmZmM3NThhMWZfQ1dIMlktTlBZSlctM0M3SEQtQkpRV0ItRzIlZiU4SkpfXzE1X01vbmRvUmV0YWlsDQpkYzk4MWM2Yi1mYzhlLTQy MGYtYWE0My1mOGYzM2U1YzA5MjNfNDJRVEstUk44TTctSjNDNEctQkJHWU0tODglZiVDWVZfXzE1X01vbmRvVm9sdW1lXy1PMzY1QnVzaW5lc3NSZXRhaWwt TzM2NUhvbWVQcmVtUmV0YWlsLU8zNjVQcm9QbHVzUmV0YWlsLU8zNjVTbWFsbEJ1c1ByZW1SZXRhaWwtDQozMzkxZTEyNS1mNmU0LTRiMWUtODk5Yy1hMjVl NjA5MmQ0MGRfNFRHV1YtNk45UDYtRzJIOFktMkhXS0ItQjQlZiVGRjRfXzE1X09uZU5vdGVGcmVlUmV0YWlsX1tCeXBhc3NdDQplZmUxZjNlNi1hZWEyLTQx NDQtYTIwOC0zMmFhODcyYjY1NDVfVEdONlAtOE1NQkMtMzdQMkYtWEhYWEstUDMlZiU0VldfXzE1X09uZU5vdGVWb2x1bWVfLU9uZU5vdGVSZXRhaWwtDQo3 NzFjM2FmYS01MGM1LTQ0M2YtYjE1MS1mZjI1NDZkODYzYTBfUVBOOFEtQkpCVEotMzM0SzMtOTNUR1ktMlAlZiVNQlRfXzE1X091dGxvb2tWb2x1bWVfLU91 dGxvb2tSZXRhaWwtDQo4Yzc2MjY0OS05N2QxLTQ5NTMtYWQyNy1iN2UyYzI1Yjk3MmVfNE5UOTktOFJKRkgtUTJWREgtS1lHMkMtNFIlZiVENEZfXzE1X1Bv d2VyUG9pbnRWb2x1bWVfLVBvd2VyUG9pbnRSZXRhaWwtDQo0YTVkMTI0YS1lNjIwLTQ0YmEtYjZmZi02NTg5NjFiMzNiOWFfRk44VFQtN1dNSDYtMkQ0WDkt TTMzN1QtMjMlZiU0MktfXzE1X1Byb2plY3RQcm9Wb2x1bWVfLVByb2plY3RQcm9SZXRhaWwtDQo0MjdhMjhkMS1kMTdjLTRhYmYtYjcxNy0zMmM3ODBiYTZm MDdfNk5USDMtQ1c5NzYtM0czWTItSkszVFgtOFElZiVIVFRfXzE1X1Byb2plY3RTdGRWb2x1bWVfLVByb2plY3RTdGRSZXRhaWwtDQpiMzIyZGE5Yy1hMmUy LTQwNTgtOWU0ZS1mNTlhNjk3MGJkNjlfWUM3REstRzJOUDMtMlFRQzMtSjZIODgtR1YlZiVHWFRfXzE1X1Byb1BsdXNWb2x1bWVfLVByb1BsdXNSZXRhaWwt UHJvZmVzc2lvbmFsUGlwY1JldGFpbC1Qcm9mZXNzaW9uYWxSZXRhaWwtDQowMGM3OWZmMS02ODUwLTQ0M2QtYmY2MS03MWNkZTBkZTMwNWZfUE4yV0YtMjlY RzItVDlISjctSlFQSlItRkMlZiVYSzRfXzE1X1B1Ymxpc2hlclZvbHVtZV8tUHVibGlzaGVyUmV0YWlsLQ0KYmEzZTM4MzMtNmE3ZS00NDVhLTg5ZDAtNzgw MmE5YTY4NTg4XzNOWTZKLVdIVDNGLTQ3QkRWLUpIRjM2LTIzJWYlNDNXX18xNV9TUERSZXRhaWxfW1ByZXBpZEJ5cGFzc10NCmIxM2FmYjM4LWNkNzktNGFl NS05ZjdmLWVlZDA1OGQ3NTBjYV9LQktRVC0yTk1YWS1KSldHUC1NNjJKQi05MiVmJUNENF9fMTVfU3RhbmRhcmRWb2x1bWVfLVN0YW5kYXJkUmV0YWlsLUhv bWVCdXNpbmVzc1BpcGNSZXRhaWwtSG9tZUJ1c2luZXNzUmV0YWlsLUhvbWVTdHVkZW50QVJNUmV0YWlsLUhvbWVTdHVkZW50UGx1c0FSTVJldGFpbC1Ib21l U3R1ZGVudFJldGFpbC1QZXJzb25hbFBpcGNSZXRhaWwtUGVyc29uYWxSZXRhaWwtDQplMTNhYzEwZS03NWQwLTRhZmYtYTBjZC03NjQ5ODJjZjU0MWNfQzJG RzktTjZKNjgtSDhCVEotQlczUVgtUk0lZiUzQjNfXzE1X1Zpc2lvUHJvVm9sdW1lXy1WaXNpb1Byb1JldGFpbC0NCmFjNGVmYWYwLWY4MWYtNGY2MS1iZGY3 LWVhMzJiMDJhYjExN19KNDg0WS00TktCRi1XMkhNRy1EQk1KQy1QRyVmJVdSN19fMTVfVmlzaW9TdGRWb2x1bWVfLVZpc2lvU3RkUmV0YWlsLQ0KZDlmNWIx YzYtNTM4Ni00OTVhLTg4ZjktOWFkNmI0MWFjOWIzXzZRN1ZELU5YOEpELVdKMlZILTg4VjczLTRHJWYlQko3X18xNV9Xb3JkVm9sdW1lXy1Xb3JkUmV0YWls LQ0KOjogT2ZmaWNlIDIwMTYNCjlkOWZhZjllLWQzNDUtNGI0OS1hZmNlLTY4Y2IwYTUzOWM3Y19STkI3Vi1QNDhGNC0zRllZNi0yUDNSMy02MyVmJUJRVl9f MTZfQWNjZXNzUnVudGltZVJldGFpbF9bUHJlcGlkQnlwYXNzXQ0KNjdjMGZjMGMtZGViYS00MDFiLWJmOGItOWM4YWQ4Mzk1ODA0X0dOSDlZLUQySjRULUZK SEdHLVFSVkg3LVFQJWYlRkRXX18xNl9BY2Nlc3NWb2x1bWVfLUFjY2Vzc1JldGFpbC0NCmMzZTY1ZDM2LTE0MWYtNGQyZi1hMzAzLWE4NDJlZTc1NmEyOV85 QzJQSy1OV1RWQi1KTVBXOC1CRlQyOC03RiVmJVRCRl9fMTZfRXhjZWxWb2x1bWVfLUV4Y2VsUmV0YWlsLQ0KZTkxNGVhNmUtYTVmYS00NDM5LWEzOTQtYTli YjMyOTNjYTA5X0RNVENKLUtOUktYLTI2OTgyLUpZQ0tULVA3JWYlS0I2X18xNl9Nb25kb1JldGFpbA0KOWNhYWJjY2ItNjFiMS00YjRiLThiZWMtZDEwYTNj M2FjMmNlX0hGVE5ELVc5TUs0LThCN01KLUI2QzRHLVhRJWYlQlIyX18xNl9Nb25kb1ZvbHVtZV8tTzM2NUFwcHNCYXNpY1JldGFpbC1PMzY1QnVzaW5lc3NS ZXRhaWwtTzM2NUVkdUNsb3VkUmV0YWlsLU8zNjVIb21lUHJlbVJldGFpbC1PMzY1UHJvUGx1c1JldGFpbC1PMzY1U21hbGxCdXNQcmVtUmV0YWlsLQ0KNDM2 MzY2ZGUtNTU3OS00ZjI0LTk2ZGItMzg5M2U0NDAwMDMwX1hZTlRHLVI5NkZZLTM2OUhYLVlGUEhZLUY5JWYlQ1BNX18xNl9PbmVOb3RlRnJlZVJldGFpbF9b QnlwYXNzXQ0KZDhjYWNlNTktMzNkMi00YWM3LTliMWItOWI3MjMzOWM1MWM4X0RSOTJOLTlIVEYyLTk3WEtNLVhXMldKLVhXJWYlM0o2X18xNl9PbmVOb3Rl Vm9sdW1lXy1PbmVOb3RlUmV0YWlsLU9uZU5vdGUyMDIxUmV0YWlsLQ0KZWM5ZDkyNjUtOWQxZS00ZWQwLTgzOGEtY2RjMjBmMjU1MWExX1I2OUtLLU5UUEtG LTdNM1E0LVFZQkhXLTZNJWYlVDlCX18xNl9PdXRsb29rVm9sdW1lXy1PdXRsb29rUmV0YWlsLQ0KZDcwYjFiYmEtYjg5My00NTQ0LTk2ZTItYjdhMzE4MDkx YzMzX0o3TVFQLUhOSjRZLVdKN1lNLVBGWUdGLUJZJWYlNkM2X18xNl9Qb3dlclBvaW50Vm9sdW1lXy1Qb3dlclBvaW50UmV0YWlsLQ0KNGY0MTQxOTctMGZj Mi00YzAxLWI2OGEtODZjYmI5YWMyNTRjX1lHOU5XLTNLMzlWLTJUM0hKLTkzRjNRLUc4JWYlM0tUX18xNl9Qcm9qZWN0UHJvVm9sdW1lXy1Qcm9qZWN0UHJv UmV0YWlsLQ0KODI5YjgxMTAtMGU2Zi00MzQ5LWJjYTQtNDI4MDM1Nzc3ODhkX1dHVDI0LUhDTk1GLUZRN1hILTZNOEs3LURSJWYlVFc5X18xNl9Qcm9qZWN0 UHJvWFZvbHVtZQ0KZGE3ZGRhYmMtM2ZiZS00NDQ3LTllMDEtNmFiNzQ0MGI0Y2Q0X0dORkhRLUY2WVFNLUtRREdKLTMyN1hYLUtRJWYlQlZDX18xNl9Qcm9q ZWN0U3RkVm9sdW1lXy1Qcm9qZWN0U3RkUmV0YWlsLQ0KY2JiYWNhNDUtNTU2YS00NDE2LWFkMDMtYmRhNTk4ZWFhN2M4X0Q4TlJRLUpUWU0zLTdKMkRYLTY0 NkNULTY4JWYlMzZNX18xNl9Qcm9qZWN0U3RkWFZvbHVtZQ0KZDQ1MDU5NmYtODk0ZC00OWUwLTk2NmEtZmQzOWVkNGM0YzY0X1hRTlZLLThKWURCLVdKOVcz LVlKOFlSLVdGJWYlRzk5X18xNl9Qcm9QbHVzVm9sdW1lXy1Qcm9QbHVzUmV0YWlsLVByb2Zlc3Npb25hbFBpcGNSZXRhaWwtUHJvZmVzc2lvbmFsUmV0YWls LQ0KMDQxYTA2Y2ItYzViOC00NzcyLTgwOWYtNDE2ZDAzZDE2NjU0X0Y0N01NLU4zWEpQLVRRWEo5LUJQOTlELThLJWYlODM3X18xNl9QdWJsaXNoZXJWb2x1 bWVfLVB1Ymxpc2hlclJldGFpbC0NCjkxMDNmM2NlLTEwODQtNDQ3YS04MjdlLWQ2MDk3ZjY4Yzg5NV82TURONC1XRjNGVi00V0gzUS1XNjk5Vi1SRyVmJUNN WV9fMTZfU2t5cGVTZXJ2aWNlQnlwYXNzUmV0YWlsX1tQcmVwaWRCeXBhc3NdDQo5NzFjZDM2OC1mMmUxLTQ5YzEtYWVkZC0zMzA5MDljZTE4YjZfNE40RDgt M0o3WTMtWVlXN0MtNzNIRDItVjglZiVSSFlfXzE2X1NreXBlZm9yQnVzaW5lc3NFbnRyeVJldGFpbF9bUHJlcGlkQnlwYXNzXQ0KODNlMDRlZTEtZmE4ZC00 MzZkLTg5OTQtZDMxYTg2MmNhYjc3Xzg2OU5RLUZKNjlLLTQ2NkhXLVFZQ1AyLUREJWYlQlY2X18xNl9Ta3lwZWZvckJ1c2luZXNzVm9sdW1lXy1Ta3lwZWZv ckJ1c2luZXNzUmV0YWlsLQ0KZGVkZmEyM2QtNmVkMS00NWE2LTg1ZGMtNjNjYWUwNTQ2ZGU2X0pOUkdNLVdIRFdYLUZKSkczLUs0N1FWLURSJWYlVEZNX18x Nl9TdGFuZGFyZFZvbHVtZV8tU3RhbmRhcmRSZXRhaWwtSG9tZUJ1c2luZXNzUGlwY1JldGFpbC1Ib21lQnVzaW5lc3NSZXRhaWwtSG9tZVN0dWRlbnRBUk1S ZXRhaWwtSG9tZVN0dWRlbnRQbHVzQVJNUmV0YWlsLUhvbWVTdHVkZW50UmV0YWlsLUhvbWVTdHVkZW50Vk5leHRSZXRhaWwtUGVyc29uYWxQaXBjUmV0YWls LVBlcnNvbmFsUmV0YWlsLQ0KNmJmMzAxYzEtYjk0YS00M2U5LWJhMzEtZDQ5NDU5OGM0N2ZiX1BEM1BDLVJITkdWLUZYSjI5LThKSzdELVJKJWYlUkpLX18x Nl9WaXNpb1Byb1ZvbHVtZV8tVmlzaW9Qcm9SZXRhaWwtDQpiMjM0YWJlMy0wODU3LTRmOWMtYjA1YS00ZGMzMTRmODU1NTdfNjlXWE4tTUJZVjYtMjJQUUct M1dHSEstUk0lZiU2WENfXzE2X1Zpc2lvUHJvWFZvbHVtZQ0KYWEyYTc4MjEtMTgyNy00YzJjLThmMWQtNDUxM2EzNGRkYTk3XzdXSFdOLTRUN01QLUc5NkpG LUczM0tSLVc4JWYlR0Y0X18xNl9WaXNpb1N0ZFZvbHVtZV8tVmlzaW9TdGRSZXRhaWwtDQozNjFmZTYyMC02NGY0LTQxYjUtYmE3Ny04NGY4ZTA3OWIxZjdf Tlk0OFYtUFBZWUgtM0Y0UFgtWEpSS0otVzQlZiU0MjNfXzE2X1Zpc2lvU3RkWFZvbHVtZQ0KYmIxMWJhZGYtZDhhYS00NzBlLTkzMTEtMjBlYWY4MGZlNWNj X1dYWTg0LUpOMlE5LVJCQ0NRLTNRM0ozLTNQJWYlRko2X18xNl9Xb3JkVm9sdW1lXy1Xb3JkUmV0YWlsLQ0KOjogT2ZmaWNlIDIwMTkNCjIyZTZiOTZjLTEw MTEtNGNkNS04YjM1LTNjOGZiNjM2NmI4Nl9GR1FOSi1KV0pDRy03UThNRy1STVJHSi05VCVmJVFWRl9fMTZfQWNjZXNzUnVudGltZTIwMTlSZXRhaWxfW1By ZXBpZEJ5cGFzc10NCjllOWJjZWViLWU3MzYtNGYyNi04OGRlLTc2M2Y4N2RjYzQ4NV85TjlQVC0yN1Y0WS1WSjJQRC1ZWEZNRi1ZVCVmJUZRVF9fMTZfQWNj ZXNzMjAxOVZvbHVtZV8tQWNjZXNzMjAxOVJldGFpbC0NCjIzNzg1NGU5LTc5ZmMtNDQ5Ny1hMGMxLWE3MDk2OTY5MWM2Yl9UTUpXVC1ZWU5NQi0zQktURi02 NDRGQy1SViVmJVhCRF9fMTZfRXhjZWwyMDE5Vm9sdW1lXy1FeGNlbDIwMTlSZXRhaWwtDQpjOGY4YTMwMS0xOWY1LTQxMzItOTZjZS0yZGU5ZDRhZGJkMzNf N0hEN0stTjRQVkstQkhCQ1EtWVdRUlctWFclZiU0VktfXzE2X091dGxvb2syMDE5Vm9sdW1lXy1PdXRsb29rMjAxOVJldGFpbC0NCjMxMzFmZDYxLTVlNGYt NDMwOC04ZDZkLTYyYmUxOTg3YzkyY19SUk5DWC1DNjRIWS1XMk1NNy1NQ0g5Ry1USiVmJUhNUV9fMTZfUG93ZXJQb2ludDIwMTlWb2x1bWVfLVBvd2VyUG9p bnQyMDE5UmV0YWlsLQ0KMmNhMmJmM2YtOTQ5ZS00NDZhLTgyYzctZTI1YTE1ZWM3OGM0X0I0TlBSLTNGS0s3LVQyTUJWLUZSUTRXLVBLJWYlRDJCX18xNl9Q cm9qZWN0UHJvMjAxOVZvbHVtZV8tUHJvamVjdFBybzIwMTlSZXRhaWwtDQoxNzc3ZjBlMy03MzkyLTQxOTgtOTdlYS04YWU0ZGU2ZjYzODFfQzRGN1AtTkNQ OEMtNkNRUFQtTVFIVjktSlglZiVEMk1fXzE2X1Byb2plY3RTdGQyMDE5Vm9sdW1lXy1Qcm9qZWN0U3RkMjAxOVJldGFpbC0NCjg1ZGQ4YjVmLWVhYTQtNGFm My1hNjI4LWNjZTllNzdjOWEwM19OTU1LSi02Uks0Ri1LTUpWWC04RDlNSi02TSVmJVdLUF9fMTZfUHJvUGx1czIwMTlWb2x1bWVfLVByb1BsdXMyMDE5UmV0 YWlsLVByb2Zlc3Npb25hbDIwMTlSZXRhaWwtDQo5ZDNlNGNjYS1lMTcyLTQ2ZjEtYTJmNC0xZDIxMDcwNTE0NDRfRzJLV1gtM05XNlAtUFk5M1ItSlhLMlQt QzklZiVZOVZfXzE2X1B1Ymxpc2hlcjIwMTlWb2x1bWVfLVB1Ymxpc2hlcjIwMTlSZXRhaWwtDQo3MzRjNmM2ZS1iMGJhLTQyOTgtYTg5MS02NzE3NzJiMmJk MWJfTkNKMzMtSkhCQlktSFRLOTgtTVlDVjgtSE0lZiVLSEpfXzE2X1NreXBlZm9yQnVzaW5lc3MyMDE5Vm9sdW1lXy1Ta3lwZWZvckJ1c2luZXNzMjAxOVJl dGFpbC0NCmY4OGNmZGVjLTk0Y2UtNDQ2My1hOTY5LTAzN2JlOTJiYzBlN19OOTcyMi1CVjlINi1XVEpUVC1GUEI5My05NyVmJThNS19fMTZfU2t5cGVmb3JC dXNpbmVzc0VudHJ5MjAxOVJldGFpbF9bUHJlcGlkQnlwYXNzXQ0KNjkxMmE3NGItYTVmYi00MDFhLWJmZGItMmUzYWI0NmY0YjAyXzZOV1dKLVlRV01SLVFL R0NCLTZUTUIzLTlEJWYlOUhLX18xNl9TdGFuZGFyZDIwMTlWb2x1bWVfLVN0YW5kYXJkMjAxOVJldGFpbC1Ib21lQnVzaW5lc3MyMDE5UmV0YWlsLUhvbWVT dHVkZW50QVJNMjAxOVJldGFpbC1Ib21lU3R1ZGVudFBsdXNBUk0yMDE5UmV0YWlsLUhvbWVTdHVkZW50MjAxOVJldGFpbC1QZXJzb25hbDIwMTlSZXRhaWwt DQo1YjVjZjA4Zi1iODFhLTQzMWQtYjA4MC0zNDUwZDg2MjA1NjVfOUJHTlEtSzM3WVItUlFIRjItMzhSUTMtN1YlZiVDQkJfXzE2X1Zpc2lvUHJvMjAxOVZv bHVtZV8tVmlzaW9Qcm8yMDE5UmV0YWlsLQ0KZTA2ZDdkZjMtYWFkMC00MTlkLThkZmItMGFjMzdlMmJkZjM5XzdUUU5RLUszWVFRLTNQRkg3LUNDUFBNLVg0 JWYlVlEyX18xNl9WaXNpb1N0ZDIwMTlWb2x1bWVfLVZpc2lvU3RkMjAxOVJldGFpbC0NCjA1OTgzNGZlLWE4ZWEtNGJmZi1iNjdiLTRkMDA2YjU0NDdkM19Q QlgzRy1OV01UNi1RN1hCVy1QWUpHRy1XWCVmJUQzM19fMTZfV29yZDIwMTlWb2x1bWVfLVdvcmQyMDE5UmV0YWlsLQ0KOjogT2ZmaWNlIDIwMjENCjo6IE9u ZU5vdGUyMDIxVm9sdW1lIEtNUyBsaWNlbnNlIGlzIG5vdCBhdmFpbGFibGUNCjg0NGMzNmNiLTg1MWMtNDllNy05MDc5LTEyZTYyYTA0OWUyYV9NTlg5RC1Q QjgzNC1WQ0dZMi1LMlJXMi0yRCVmJVAzRF9fMTZfQWNjZXNzUnVudGltZTIwMjFSZXRhaWxfW0J5cGFzc10NCjFmZTQyOWQ4LTNmYTctNGEzOS1iNmYwLTAz ZGRlZDQyZmUxNF9XTThZRy1ZTkdERC00SkhEQy1QRzNGNC1GQyVmJTRUNF9fMTZfQWNjZXNzMjAyMVZvbHVtZV8tQWNjZXNzMjAyMVJldGFpbC0NCmVhNzFl ZmZjLTY5ZjEtNDkyNS05OTkxLTJmNWUzMTliYmMyNF9OV0czWC04N0M5Sy1UQzdZWS1CQzJHNy1HNiVmJVJWQ19fMTZfRXhjZWwyMDIxVm9sdW1lXy1FeGNl bDIwMjFSZXRhaWwtDQphNTc5OWU0Yy1mODNjLTRjNmUtOTUxNi1kZmU5YjY5NjE1MGJfQzlGTTYtM043MkYtSEZKWEItVE0zVjktVDglZiU2UjlfXzE2X091 dGxvb2syMDIxVm9sdW1lXy1PdXRsb29rMjAyMVJldGFpbC0NCjc3OGNjYjlhLTJmNmEtNDRlNS04NTNjLWViMjJiNzYwOTY0M19DTk0zVy1WOTRHQi1RSlFI SC1CRFEzSi0zMyVmJVk4SF9fMTZfT25lTm90ZUZyZWUyMDIxUmV0YWlsX1tCeXBhc3NdDQo2ZTE2NmNjMy00OTVkLTQzOGEtODllNy1kN2M5ZTZmZDRkZWFf VFk3WEYtTkZSQlItS0o0NEMtRzgzS0YtR1glZiUyN0tfXzE2X1Bvd2VyUG9pbnQyMDIxVm9sdW1lXy1Qb3dlclBvaW50MjAyMVJldGFpbC0NCjc2ODgxMTU5 LTE1NWMtNDNlMC05ZGI3LTJkNzBhOWEzYTRjYV9GVE5XVC1DNldCVC04SE1HRi1LOVBSWC1RViVmJTlIOF9fMTZfUHJvamVjdFBybzIwMjFWb2x1bWVfLVBy b2plY3RQcm8yMDIxUmV0YWlsLQ0KNmRkNzI3MDQtZjc1Mi00YjcxLTk0YzctMTFjZWM2YmZjMzU1X0oySkRDLU5KQ1lZLTlSR1E0LVlYV01ILVQzJWYlRDRU X18xNl9Qcm9qZWN0U3RkMjAyMVZvbHVtZV8tUHJvamVjdFN0ZDIwMjFSZXRhaWwtDQpmYmRiM2UxOC1hOGVmLTRmYjMtOTE4My1kZmZkNjBiZDA5ODRfRlhZ VEstTkpKOEMtR0I2RFctM0RZUVQtNkYlZiU3VEhfXzE2X1Byb1BsdXMyMDIxVm9sdW1lXy1Qcm9QbHVzMjAyMVJldGFpbC1Qcm9mZXNzaW9uYWwyMDIxUmV0 YWlsLQ0KYWE2NjUyMWYtMjM3MC00YWQ4LWEyYmItYzA5NWUzZTQzMzhmXzJNVzlELU40QlhNLTlWQlBHLVE3VzZNLUtGJWYlQkdRX18xNl9QdWJsaXNoZXIy MDIxVm9sdW1lXy1QdWJsaXNoZXIyMDIxUmV0YWlsLQ0KMWYzMmE5YWYtMTI3NC00OGJkLWJhMWUtMWFiNzUwOGEyM2U4X0hXQ1hOLUszV0JULVdKQktZLVI4 QkQ5LVhLJWYlMjlQX18xNl9Ta3lwZWZvckJ1c2luZXNzMjAyMVZvbHVtZV8tU2t5cGVmb3JCdXNpbmVzczIwMjFSZXRhaWwtDQowODBhNDVjNS05ZjlmLTQ5 ZWItYjRiMC1jM2M2MTBhNWViZDNfS0RYN1gtQk5WUjgtVFhYR1gtNFE3WTgtNzglZiVWVDNfXzE2X1N0YW5kYXJkMjAyMVZvbHVtZV8tU3RhbmRhcmQyMDIx UmV0YWlsLUhvbWVCdXNpbmVzczIwMjFSZXRhaWwtSG9tZVN0dWRlbnQyMDIxUmV0YWlsLVBlcnNvbmFsMjAyMVJldGFpbC0NCmZiNjFhYzlhLTE2ODgtNDVk Mi04ZjZiLTA2NzRkYmZmYTMzY19LTkg4RC1GR0hUNC1UOFJLMy1DVERZSi1LMiVmJUhUNF9fMTZfVmlzaW9Qcm8yMDIxVm9sdW1lXy1WaXNpb1BybzIwMjFS ZXRhaWwtDQo3MmZjZTc5Ny0xODg0LTQ4ZGQtYTg2MC1iMmY2YTVlZmQzY2FfTUpWTlktQllXUFktQ1dWNkotMlJLUlQtNE0lZiU4UUdfXzE2X1Zpc2lvU3Rk MjAyMVZvbHVtZV8tVmlzaW9TdGQyMDIxUmV0YWlsLQ0KYWJlMjhhZWEtNjI1YS00M2IxLThlMzAtMjI1ZWI4ZmJkOWU1X1ROOEg5LU0zNEQzLVk2NFY5LVRS NzJWLVg3JWYlOUtWX18xNl9Xb3JkMjAyMVZvbHVtZV8tV29yZDIwMjFSZXRhaWwtDQo6OiBPZmZpY2UgMjAyNA0KZmNlZGEwODMtMTIwMy00MDJhLThlYzQt M2Q3ZWQ5ZjM2NDhjXzJURFBXLU5EUTdHLUZNRzk5LURYUTdNLVRYJWYlM1QyX18xNl9Qcm9QbHVzMjAyNFZvbHVtZS1QcmV2aWV3DQphYWVhMGRjOC03OGUx LTQzNDMtOWYyNS1iNjliODNkZDFiY2VfRDlHVEctTlA3RFYtVDZKUDMtQjZCNjItSkIlZiU4OVJfXzE2X1Byb2plY3RQcm8yMDI0Vm9sdW1lLVByZXZpZXcN CjRhYjRkODQ5LWFhYmMtNDNmYi04N2VlLTNhZWQwMjUxODg5MV9ZVzY2WC1OSDYyTS1HNllGUC1CN0tDVC1XWCVmJUdLUV9fMTZfVmlzaW9Qcm8yMDI0Vm9s dW1lLVByZXZpZXcNCjcyZTlmYWE3LWVhZDEtNGYzZC05ZjZlLTNhYmMwOTBhODFkN184MkZUUi1OQ0hSNy1XMzk0NC1NR1JITS1KTSVmJUNXRF9fMTZfQWNj ZXNzMjAyNFZvbHVtZV8tQWNjZXNzMjAyNFJldGFpbC0NCmNiYmJhMmMzLTBmZjUtNDU1OC04NDZhLTA0M2VmOWQ3ODU1OV9GNERZTi04OUJQMi1XUVRXSi1H UjhZQy1DSyVmJUdKR19fMTZfRXhjZWwyMDI0Vm9sdW1lXy1FeGNlbDIwMjRSZXRhaWwtDQpiZWYzMTUyYS04YTA0LTQwZjItYTA2NS0zNDBjM2YyMzUxNmRf RDJGOEQtTjNRM0ItSjI4UFYtWDI3SEQtUkolZiVXQjlfXzE2X091dGxvb2syMDI0Vm9sdW1lXy1PdXRsb29rMjAyNFJldGFpbC0NCmI2MzYyNmE0LTVmMDUt NGNlZC05NjM5LTMxYmE3MzBhMTI3ZV9DVzk0Ti1LNkdKSC05Q1RYWS1NRzJWQy1GWSVmJUNXUF9fMTZfUG93ZXJQb2ludDIwMjRWb2x1bWVfLVBvd2VyUG9p bnQyMDI0UmV0YWlsLQ0KZjUxMGFmNzUtOGFiNy00NDI2LWEyMzYtMWJmYjk1YzM0ZmY4X0ZRUTIzLU40WUNZLTczSFEzLUZNOVdDLTc2JWYlSEY0X18xNl9Q cm9qZWN0UHJvMjAyNFZvbHVtZV8tUHJvamVjdFBybzIwMjRSZXRhaWwtDQo5ZjE0NGYyNy0yYWM1LTQwYjktODk5ZC04OThjMmI4YjRmODFfUEQzVFQtTlRI UVEtVkM3Q1ktTUZYSzMtRzglZiU3RjhfXzE2X1Byb2plY3RTdGQyMDI0Vm9sdW1lXy1Qcm9qZWN0U3RkMjAyNFJldGFpbC0NCjhkMzY4ZmMxLTk0NzAtNGJl Mi04ZDY2LTkwZTgzNmNiYjA1MV9YSjJYTi1GVzhSSy1QNEhNUC1ES0RCVi1HQyVmJVZHQl9fMTZfUHJvUGx1czIwMjRWb2x1bWVfLVByb1BsdXMyMDI0UmV0 YWlsLQ0KMDAwMjI5MGEtMjA5MS00MzI0LTllNTMtM2NmZTI4ODg0Y2RlXzROS0hGLTlIQlFGLVEzQjZDLTdZVjM0LUY2JWYlNFAzX18xNl9Ta3lwZWZvckJ1 c2luZXNzMjAyNFZvbHVtZQ0KYmJhYzkwNGYtNmE3ZS00MThhLWJiNGItMjRjODVkYTA2MTg3X1YyOE40LUpHMjJLLVc2NlA4LVZUTUdLLUg2JWYlSEdSX18x Nl9TdGFuZGFyZDIwMjRWb2x1bWVfLUhvbWUyMDI0UmV0YWlsLUhvbWVCdXNpbmVzczIwMjRSZXRhaWwtDQpmYTE4NzA5MS04MjQ2LTQ3YjEtOTY0Zi04MGEw YjFlNWQ2OWFfQjdUTjgtRko4VjMtN1FZQ1AtSFFQTVYtWVklZiU4OUdfXzE2X1Zpc2lvUHJvMjAyNFZvbHVtZV8tVmlzaW9Qcm8yMDI0UmV0YWlsLQ0KOTIz ZmE0NzAtYWE3MS00YjhiLWIzNWMtMzZiNzliZjlmNDRiX0pNTVZZLVhGTlFDLUtLNEhLLTlIN1IzLVdRJWYlUVRWX18xNl9WaXNpb1N0ZDIwMjRWb2x1bWVf LVZpc2lvU3RkMjAyNFJldGFpbC0NCmQwZWRlZDAxLTA4ODEtNGIzNy05NzM4LTE5MDQwMDA5NTA5OF9NUTg0Ti03VllETS1GWFY3Qy02SzdDQy1WRiVmJVc5 Sl9fMTZfV29yZDIwMjRWb2x1bWVfLVdvcmQyMDI0UmV0YWlsLQ0KKSBkbyAoDQpmb3IgL2YgInRva2Vucz0xLTUgZGVsaW1zPV8iICUlQSBpbiAoIiUlIyIp IGRvICgNCg0KaWYgJTE9PXdpbmtleSBpZiAlb3NTS1UlPT0lJUMgaWYgbm90IGRlZmluZWQga2V5ICgNCmVjaG8gIiFhbGxhcHBzISIgfCBmaW5kIC9pICIl JUEiICVudWwxJSAmJiBzZXQga2V5PSUlQg0KKQ0KDQppZiAlMT09Y2hrcHJvZCBpZiAiJW9WZXIlIj09IiUlQyIgaWYgbm90IGRlZmluZWQgZm91bmRwcm9k ICgNCmVjaG8gIiUlRCIgfCBmaW5kc3RyIC9JICJcPCUyLioiICVudWwlICYmIHNldCBmb3VuZHByb2Q9MQ0KKQ0KDQppZiAlMT09Z2V0aW5mbyBpZiBub3Qg ZGVmaW5lZCBrZXkgaWYgIiVvVmVyJSI9PSIlJUMiICgNCmlmIC9pICIlMiI9PSIlJUQiICgNCnNldCBrZXk9JSVCDQpzZXQgX2FjdGlkPSUlQQ0Kc2V0IF9h bGxhY3RpZD0hX2FsbGFjdGlkISAlJUENCikgZWxzZSBpZiBub3QgZGVmaW5lZCBfb01TSSBpZiAlX05vRWRpdGlvbkNoYW5nZSU9PTAgKA0KZWNobzogJSVF IHwgZmluZCAvaSAiLSUyLSIgJW51bCUgJiYgKA0Kc2V0IGtleT0lJUINCnNldCBfYWx0b2ZmaWQ9JSVEDQpzZXQgX2FjdGlkPSUlQQ0Kc2V0IF9hbGxhY3Rp ZD0hX2FsbGFjdGlkISAlJUENCikNCikNCikNCg0KKQ0KKQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCg0KOjogIEJlbG93IGNvZGUgaXMgdXNlZCB0byBnZXQgYWx0ZXJuYXRlIGVkaXRpb24gbmFtZSBhbmQga2V5IGlmIGN1cnJlbnQgZWRpdGlvbiBk b2Vzbid0IHN1cHBvcnQgSy1NLVMgYWN0aXZhdGlvbg0KDQo6OiAgMXN0IGNvbHVtbiA9IEN1cnJlbnQgU0tVIElEDQo6OiAgMm5kIGNvbHVtbiA9IEN1cnJl bnQgRWRpdGlvbiBOYW1lDQo6OiAgM3JkIGNvbHVtbiA9IEN1cnJlbnQgRWRpdGlvbiBBY3RpdmF0aW9uIElEDQo6OiAgNHRoIGNvbHVtbiA9IEFsdGVybmF0 ZSBFZGl0aW9uIEFjdGl2YXRpb24gSUQNCjo6ICA1dGggY29sdW1uID0gQWx0ZXJuYXRlIEVkaXRpb24gR1ZMSw0KOjogIDZ0aCBjb2x1bW4gPSBBbHRlcm5h dGUgRWRpdGlvbiBOYW1lDQo6OiAgU2VwYXJhdG9yICA9IF8NCg0KDQo6a21zZmFsbGJhY2sNCg0Kc2V0IG5vdGZvdW5kYWx0YWN0SUQ9DQppZiAlX05vRWRp dGlvbkNoYW5nZSU9PTEgZXhpdCAvYg0KDQpmb3IgJSUjIGluICgNCjIwNV9Jb1RFbnRlcnByaXNlU0tfX19fX19fX19fX19fX19fZDRmOWI0MWYtMjA1Yy00 MDVlLThlMDgtM2QxNmU4OGUwMmJlXzU5ZWI5NjVjLTkxNTAtNDJiNy1hMGVjLTIyMTUxYjk4OTdjNV9LQk44Vi1IRkdRNC1NR1hWRC0zNDdQNi1QRCVmJVFH VF9Jb1RFbnRlcnByaXNlUw0KMTM4X1Byb2Zlc3Npb25hbFNpbmdsZUxhbmd1YWdlX19fX19hNDg5MzhhYS02MmZhLTQ5NjYtOWQ0NC05ZjA0ZGEzZjcyZjJf MmRlNjczOTItYjdhNy00NjJhLWIxY2EtMTA4ZGQxODlmNTg4X1cyNjlOLVdGR1dYLVlWQzlCLTRKNkM5LVQ4JWYlM0dYX1Byb2Zlc3Npb25hbA0KMTM5X1By b2Zlc3Npb25hbENvdW50cnlTcGVjaWZpY19fX19mN2FmN2QwOS00MGU0LTQxOWMtYTQ5Yi1lYWUzNjY2ODllYmRfMmRlNjczOTItYjdhNy00NjJhLWIxY2Et MTA4ZGQxODlmNTg4X1cyNjlOLVdGR1dYLVlWQzlCLTRKNkM5LVQ4JWYlM0dYX1Byb2Zlc3Npb25hbA0KMTM5X1Byb2Zlc3Npb25hbENvdW50cnlTcGVjaWZp Yy1abl8wMWViODUyYy00MjRkLTQwNjAtOTRiOC1jMTBkNzk5ZDczNjRfMmRlNjczOTItYjdhNy00NjJhLWIxY2EtMTA4ZGQxODlmNTg4X1cyNjlOLVdGR1dY LVlWQzlCLTRKNkM5LVQ4JWYlM0dYX1Byb2Zlc3Npb25hbA0KKSBkbyAoDQpmb3IgL2YgInRva2Vucz0xLTYgZGVsaW1zPV8iICUlQSBpbiAoIiUlIyIpIGRv IGlmICVvc1NLVSU9PSUlQSAoDQplY2hvICIhYWxsYXBwcyEiIHwgZmluZCAvaSAiJSVDIiAlbnVsMSUgJiYgKA0KZWNobyAiIWFsbGFwcHMhIiB8IGZpbmQg L2kgIiUlRCIgJW51bDElICYmICgNCnNldCBhbHRrZXk9JSVFDQpzZXQgYWx0ZWRpdGlvbj0lJUYNCikgfHwgKA0Kc2V0IGFsdGVkaXRpb249JSVGDQpzZXQg bm90Zm91bmRhbHRhY3RJRD0xDQopDQopDQopDQopDQpleGl0IC9iDQoNCjorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Kw0KDQo6Y2hlY2tfYWN0c3RhdHVzDQoNCmNscw0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgKA0KbW9kZSAxMDAsIDM2DQolcHNjJSAiJnskVz0kSG9zdC5V SS5SYXdVSS5XaW5kb3dTaXplOyRCPSRIb3N0LlVJLlJhd1VJLkJ1ZmZlclNpemU7JFcuSGVpZ2h0PTM1OyRCLkhlaWdodD0zMDA7JEhvc3QuVUkuUmF3VUku V2luZG93U2l6ZT0kVzskSG9zdC5VSS5SYXdVSS5CdWZmZXJTaXplPSRCO30iICVudWwlDQopDQoNCiVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0 KCchX2JhdHAhJykgLXNwbGl0ICc6c3BwbWdyXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSkiDQpnb3RvIGRrX2RvbmUNCg0KOnNwcG1n cjoNCnBhcmFtICgNCiAgICBbUGFyYW1ldGVyKCldDQogICAgW3N3aXRjaF0NCiAgICAkQWxsLA0KICAgIFtQYXJhbWV0ZXIoKV0NCiAgICBbc3dpdGNoXQ0K ICAgICREbHYsDQogICAgW1BhcmFtZXRlcigpXQ0KICAgIFtzd2l0Y2hdDQogICAgJElJRCwNCiAgICBbUGFyYW1ldGVyKCldDQogICAgW3N3aXRjaF0NCiAg ICAkUGFzcw0KKQ0KDQpmdW5jdGlvbiBDT05PVVQoJHN0ck9iaikNCnsNCglPdXQtSG9zdCAtSW5wdXQgJHN0ck9iag0KfQ0KDQpmdW5jdGlvbiBFeGl0U2Ny aXB0KCRFeGl0Q29kZSA9IDApDQp7DQoJRXhpdCAkRXhpdENvZGUNCn0NCg0KaWYgKC1Ob3QgJFBTVmVyc2lvblRhYmxlKSB7DQoJIj09PT0gRVJST1IgPT09 PWByYG4iDQoJIldpbmRvd3MgUG93ZXJTaGVsbCAxLjAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdC4iDQoJRXhpdFNjcmlwdCAxDQp9DQoNCmlm ICgkRXhlY3V0aW9uQ29udGV4dC5TZXNzaW9uU3RhdGUuTGFuZ3VhZ2VNb2RlLnZhbHVlX18gLU5FIDApIHsNCgkiPT09PSBFUlJPUiA9PT09YHJgbiINCgki V2luZG93cyBQb3dlclNoZWxsIGlzIG5vdCBydW5uaW5nIGluIEZ1bGwgTGFuZ3VhZ2UgTW9kZS4iDQoJRXhpdFNjcmlwdCAxDQp9DQoNCiR3aW5idWlsZCA9 IDENCnRyeSB7DQoJJHdpbmJ1aWxkID0gW1N5c3RlbS5EaWFnbm9zdGljcy5GaWxlVmVyc2lvbkluZm9dOjpHZXRWZXJzaW9uSW5mbygiJGVudjpTeXN0ZW1S b290XFN5c3RlbTMyXGtlcm5lbDMyLmRsbCIpLkZpbGVCdWlsZFBhcnQNCn0gY2F0Y2ggew0KCSR3aW5idWlsZCA9IFtpbnRdKFt3bWldJ1dpbjMyX09wZXJh dGluZ1N5c3RlbT1AJykuQnVpbGROdW1iZXINCn0NCg0KaWYgKCR3aW5idWlsZCAtRVEgMSkgew0KCSI9PT09IEVSUk9SID09PT1gcmBuIg0KCSJDb3VsZCBu b3QgZGV0ZWN0IFdpbmRvd3MgYnVpbGQuIg0KCUV4aXRTY3JpcHQgMQ0KfQ0KDQppZiAoJHdpbmJ1aWxkIC1MVCAyNjAwKSB7DQoJIj09PT0gRVJST1IgPT09 PWByYG4iDQoJIlRoaXMgYnVpbGQgb2YgV2luZG93cyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LiINCglFeGl0U2NyaXB0IDENCn0NCg0KaWYg KCRBbGwuSXNQcmVzZW50KQ0Kew0KCSRpc0FsbCA9IHtDT05PVVQgImByIn0NCgkkbm9BbGwgPSB7JG51bGx9DQp9DQplbHNlDQp7DQoJJGlzQWxsID0geyRu dWxsfQ0KCSRub0FsbCA9IHtDT05PVVQgImByIn0NCn0NCiREbHYgPSAkRGx2LklzUHJlc2VudA0KJElJRCA9ICRJSUQuSXNQcmVzZW50IC1PciAkRGx2Lklz UHJlc2VudA0KDQokTlQ2ID0gJHdpbmJ1aWxkIC1HRSA2MDAwDQokTlQ3ID0gJHdpbmJ1aWxkIC1HRSA3NjAwDQokTlQ4ID0gJHdpbmJ1aWxkIC1HRSA5MjAw DQokTlQ5ID0gJHdpbmJ1aWxkIC1HRSA5NjAwDQoNCiRBZG1pbiA9IChbU2VjdXJpdHkuUHJpbmNpcGFsLldpbmRvd3NQcmluY2lwYWxdW1NlY3VyaXR5LlBy aW5jaXBhbC5XaW5kb3dzSWRlbnRpdHldOjpHZXRDdXJyZW50KCkpLklzSW5Sb2xlKFtTZWN1cml0eS5QcmluY2lwYWwuV2luZG93c0J1aWx0SW5Sb2xlXTo6 QWRtaW5pc3RyYXRvcikNCg0KJGxpbmUyID0gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIN CiRsaW5lMyA9ICJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18iDQoNCmZ1bmN0aW9uIGVjaG9X aW5kb3dzDQp7DQoJQ09OT1VUICIkbGluZTIiDQoJQ09OT1VUICI9PT0gICAgICAgICAgICAgICAgICAgV2luZG93cyBTdGF0dXMgICAgICAgICAgICAgICAg ICAgICA9PT0iDQoJQ09OT1VUICIkbGluZTIiDQoJJiAkbm9BbGwNCn0NCg0KZnVuY3Rpb24gZWNob09mZmljZQ0Kew0KCWlmICgkZG9NU0cgLUVRIDApIHsN CgkJcmV0dXJuDQoJfQ0KDQoJJiAkaXNBbGwNCglDT05PVVQgIiRsaW5lMiINCglDT05PVVQgIj09PSAgICAgICAgICAgICAgICAgICBPZmZpY2UgU3RhdHVz ICAgICAgICAgICAgICAgICAgICAgID09PSINCglDT05PVVQgIiRsaW5lMiINCgkmICRub0FsbA0KDQoJJHNjcmlwdDpkb01TRyA9IDANCn0NCg0KZnVuY3Rp b24gc3RyR2V0UmVnaXN0cnkoJHN0cktleSwgJHN0ck5hbWUpDQp7DQoJdHJ5IHsNCgkJcmV0dXJuIFtNaWNyb3NvZnQuV2luMzIuUmVnaXN0cnldOjpHZXRW YWx1ZSgkc3RyS2V5LCAkc3RyTmFtZSwgJG51bGwpDQoJfSBjYXRjaCB7DQoJCXJldHVybiAkbnVsbA0KCX0NCn0NCg0KZnVuY3Rpb24gQ2hlY2tPaG9vaw0K ew0KCSRvaG9vayA9IDANCgkkcGF0aHMgPSAiJHtlbnY6UHJvZ3JhbUZpbGVzfSIsICIke2VudjpQcm9ncmFtVzY0MzJ9IiwgIiR7ZW52OlByb2dyYW1GaWxl cyh4ODYpfSINCg0KCTE1LCAxNiB8IGZvcmVhY2ggYA0KCXsNCgkJJEEgPSAkXzsgJHBhdGhzIHwgZm9yZWFjaCBgDQoJCXsNCgkJCWlmIChUZXN0LVBhdGgg IiQoJF8pJCgnXE1pY3Jvc29mdCBPZmZpY2VcT2ZmaWNlJykkKCRBKSQoJ1xzcHBjKmRsbCcpIikgeyRvaG9vayA9IDF9DQoJCX0NCgl9DQoNCgkiU3lzdGVt IiwgIlN5c3RlbVg4NiIgfCBmb3JlYWNoIGANCgl7DQoJCSRBID0gJF87ICJPZmZpY2UgMTUiLCAiT2ZmaWNlIiB8IGZvcmVhY2ggYA0KCQl7DQoJCQkkQiA9 ICRfOyAkcGF0aHMgfCBmb3JlYWNoIGANCgkJCXsNCgkJCQlpZiAoVGVzdC1QYXRoICIkKCRfKSQoJ1xNaWNyb3NvZnQgJykkKCRCKSQoJ1xyb290XHZmc1wn KSQoJEEpJCgnXHNwcGMqZGxsJykiKSB7JG9ob29rID0gMX0NCgkJCX0NCgkJfQ0KCX0NCg0KCWlmICgkb2hvb2sgLUVRIDApIHsNCgkJcmV0dXJuDQoJfQ0K DQoJJiAkaXNBbGwNCglDT05PVVQgIiRsaW5lMiINCglDT05PVVQgIj09PSAgICAgICAgICAgICAgICBPZmZpY2UgT2hvb2sgU3RhdHVzICAgICAgICAgICAg ICAgICAgID09PSINCglDT05PVVQgIiRsaW5lMiINCgkkaG9zdC5VSS5Xcml0ZUxpbmUoJ1llbGxvdycsICdCbGFjaycsICJgcmBuT2hvb2sgZm9yIHBlcm1h bmVudCBPZmZpY2UgYWN0aXZhdGlvbiBpcyBpbnN0YWxsZWQuYHJgbllvdSBjYW4gaWdub3JlIHRoZSBiZWxvdyBtZW50aW9uZWQgT2ZmaWNlIGFjdGl2YXRp b24gc3RhdHVzLiIpDQoJJiAkbm9BbGwNCn0NCg0KI3JlZ2lvbiBTU1NTDQpmdW5jdGlvbiBCb29sVG9XU3RyKCRiVmFsKSB7DQoJKCJUUlVFIiwgIkZBTFNF IilbISRiVmFsXQ0KfQ0KDQpmdW5jdGlvbiBJbml0aWFsaXplUEludm9rZSgkTGFEbGwsICRiT2ZmaWNlKSB7DQoJJExhTmFtZSA9IFtJTy5QYXRoXTo6R2V0 RmlsZU5hbWVXaXRob3V0RXh0ZW5zaW9uKCRMYURsbCkNCgkkU0xBcHAgPSAkTlQ3IC1PciAkYk9mZmljZSAtT3IgKCRMYU5hbWUgLUVRICdzcHBjJyAtQW5k IFtEaWFnbm9zdGljcy5GaWxlVmVyc2lvbkluZm9dOjpHZXRWZXJzaW9uSW5mbygiJFN5c1BhdGhcc3BwYy5kbGwiKS5GaWxlUHJpdmF0ZVBhcnQgLUdFIDE2 NTAxKQ0KCSRXaW4zMiA9ICRudWxsDQoNCgkkTWFyc2hhbCA9IFtTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXMuTWFyc2hhbF0NCgkkTW9kdWxlID0g W0FwcERvbWFpbl06OkN1cnJlbnREb21haW4uRGVmaW5lRHluYW1pY0Fzc2VtYmx5KCgkTGFOYW1lKyJfQXNzZW1ibHkiKSwgJ1J1bicpLkRlZmluZUR5bmFt aWNNb2R1bGUoKCRMYU5hbWUrIl9Nb2R1bGUiKSwgJEZhbHNlKQ0KCSRDbGFzcyA9ICRNb2R1bGUuRGVmaW5lVHlwZSgoJExhTmFtZSsiX01ldGhvZHMiKSwg J1B1YmxpYywgQWJzdHJhY3QsIFNlYWxlZCwgQmVmb3JlRmllbGRJbml0JywgW09iamVjdF0sIDApDQoNCgkkQ2xhc3MuRGVmaW5lUEludm9rZU1ldGhvZCgn U0xDbG9zZScsICRMYURsbCwgMjIsIDEsIFtJbnQzMl0sIEAoW0ludFB0cl0pLCAxLCAzKS5TZXRJbXBsZW1lbnRhdGlvbkZsYWdzKDEyOCkNCgkkQ2xhc3Mu RGVmaW5lUEludm9rZU1ldGhvZCgnU0xPcGVuJywgJExhRGxsLCAyMiwgMSwgW0ludDMyXSwgQChbSW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5T ZXRJbXBsZW1lbnRhdGlvbkZsYWdzKDEyOCkNCgkkQ2xhc3MuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xHZW5lcmF0ZU9mZmxpbmVJbnN0YWxsYXRpb25JZCcs ICRMYURsbCwgMjIsIDEsIFtJbnQzMl0sIEAoW0ludFB0cl0sIFtHdWlkXS5NYWtlQnlSZWZUeXBlKCksIFtJbnRQdHJdLk1ha2VCeVJlZlR5cGUoKSksIDEs IDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KCSRDbGFzcy5EZWZpbmVQSW52b2tlTWV0aG9kKCdTTEdldFNMSURMaXN0JywgJExhRGxsLCAyMiwg MSwgW0ludDMyXSwgQChbSW50UHRyXSwgW1VJbnQzMl0sIFtHdWlkXS5NYWtlQnlSZWZUeXBlKCksIFtVSW50MzJdLCBbVUludDMyXS5NYWtlQnlSZWZUeXBl KCksIFtJbnRQdHJdLk1ha2VCeVJlZlR5cGUoKSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KCSRDbGFzcy5EZWZpbmVQSW52b2tlTWV0 aG9kKCdTTEdldExpY2Vuc2luZ1N0YXR1c0luZm9ybWF0aW9uJywgJExhRGxsLCAyMiwgMSwgW0ludDMyXSwgQChbSW50UHRyXSwgW0d1aWRdLk1ha2VCeVJl ZlR5cGUoKSwgW0d1aWRdLk1ha2VCeVJlZlR5cGUoKSwgW0ludFB0cl0sIFtVSW50MzJdLk1ha2VCeVJlZlR5cGUoKSwgW0ludFB0cl0uTWFrZUJ5UmVmVHlw ZSgpKSwgMSwgMykuU2V0SW1wbGVtZW50YXRpb25GbGFncygxMjgpDQoJJENsYXNzLkRlZmluZVBJbnZva2VNZXRob2QoJ1NMR2V0UEtleUluZm9ybWF0aW9u JywgJExhRGxsLCAyMiwgMSwgW0ludDMyXSwgQChbSW50UHRyXSwgW0d1aWRdLk1ha2VCeVJlZlR5cGUoKSwgW1N0cmluZ10sIFtVSW50MzJdLk1ha2VCeVJl ZlR5cGUoKSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpLCBbSW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5TZXRJbXBsZW1lbnRhdGlvbkZsYWdz KDEyOCkNCgkkQ2xhc3MuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xHZXRQcm9kdWN0U2t1SW5mb3JtYXRpb24nLCAkTGFEbGwsIDIyLCAxLCBbSW50MzJdLCBA KFtJbnRQdHJdLCBbR3VpZF0uTWFrZUJ5UmVmVHlwZSgpLCBbU3RyaW5nXSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpLCBbVUludDMyXS5NYWtlQnlSZWZU eXBlKCksIFtJbnRQdHJdLk1ha2VCeVJlZlR5cGUoKSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KCSRDbGFzcy5EZWZpbmVQSW52b2tl TWV0aG9kKCdTTEdldFNlcnZpY2VJbmZvcm1hdGlvbicsICRMYURsbCwgMjIsIDEsIFtJbnQzMl0sIEAoW0ludFB0cl0sIFtTdHJpbmddLCBbVUludDMyXS5N YWtlQnlSZWZUeXBlKCksIFtVSW50MzJdLk1ha2VCeVJlZlR5cGUoKSwgW0ludFB0cl0uTWFrZUJ5UmVmVHlwZSgpKSwgMSwgMykuU2V0SW1wbGVtZW50YXRp b25GbGFncygxMjgpDQoJaWYgKCRTTEFwcCkgew0KCQkkQ2xhc3MuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xHZXRBcHBsaWNhdGlvbkluZm9ybWF0aW9uJywg JExhRGxsLCAyMiwgMSwgW0ludDMyXSwgQChbSW50UHRyXSwgW0d1aWRdLk1ha2VCeVJlZlR5cGUoKSwgW1N0cmluZ10sIFtVSW50MzJdLk1ha2VCeVJlZlR5 cGUoKSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpLCBbSW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5TZXRJbXBsZW1lbnRhdGlvbkZsYWdzKDEy OCkNCgl9DQoJaWYgKCRiT2ZmaWNlKSB7DQoJCSRXaW4zMiA9ICRDbGFzcy5DcmVhdGVUeXBlKCkNCgkJcmV0dXJuDQoJfQ0KCWlmICgkTlQ2KSB7DQoJCSRD bGFzcy5EZWZpbmVQSW52b2tlTWV0aG9kKCdTTEdldFdpbmRvd3NJbmZvcm1hdGlvbicsICdzbGMuZGxsJywgMjIsIDEsIFtJbnQzMl0sIEAoW1N0cmluZ10s IFtVSW50MzJdLk1ha2VCeVJlZlR5cGUoKSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpLCBbSW50UHRyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5TZXRJ bXBsZW1lbnRhdGlvbkZsYWdzKDEyOCkNCgkJJENsYXNzLkRlZmluZVBJbnZva2VNZXRob2QoJ1NMR2V0V2luZG93c0luZm9ybWF0aW9uRFdPUkQnLCAnc2xj LmRsbCcsIDIyLCAxLCBbSW50MzJdLCBAKFtTdHJpbmddLCBbVUludDMyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKS5TZXRJbXBsZW1lbnRhdGlvbkZsYWdz KDEyOCkNCgkJJENsYXNzLkRlZmluZVBJbnZva2VNZXRob2QoJ1NMSXNHZW51aW5lTG9jYWwnLCAnc2x3Z2EuZGxsJywgMjIsIDEsIFtJbnQzMl0sIEAoW0d1 aWRdLk1ha2VCeVJlZlR5cGUoKSwgW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpLCBbSW50UHRyXSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4 KQ0KCX0NCglpZiAoJE5UNykgew0KCQkkQ2xhc3MuRGVmaW5lUEludm9rZU1ldGhvZCgnU0xJc1dpbmRvd3NHZW51aW5lTG9jYWwnLCAnc2xjLmRsbCcsICdQ dWJsaWMsIFN0YXRpYycsICdTdGFuZGFyZCcsIFtJbnQzMl0sIEAoW1VJbnQzMl0uTWFrZUJ5UmVmVHlwZSgpKSwgJ1dpbmFwaScsICdVbmljb2RlJykuU2V0 SW1wbGVtZW50YXRpb25GbGFncygnUHJlc2VydmVTaWcnKQ0KCX0NCg0KCWlmICgkRGxsU3Vic2NyaXB0aW9uKSB7DQoJCSRDbGFzcy5EZWZpbmVQSW52b2tl TWV0aG9kKCdDbGlwR2V0U3Vic2NyaXB0aW9uU3RhdHVzJywgJ0NsaXBjLmRsbCcsIDIyLCAxLCBbSW50MzJdLCBAKFtJbnRQdHJdLk1ha2VCeVJlZlR5cGUo KSksIDEsIDMpLlNldEltcGxlbWVudGF0aW9uRmxhZ3MoMTI4KQ0KCQkkU3RydWN0ID0gJENsYXNzLkRlZmluZU5lc3RlZFR5cGUoJ1N1YlN0YXR1cycsICdO ZXN0ZWRQdWJsaWMsIFNlcXVlbnRpYWxMYXlvdXQsIFNlYWxlZCwgQmVmb3JlRmllbGRJbml0JywgW1ZhbHVlVHlwZV0sIDApDQoJCVt2b2lkXSRTdHJ1Y3Qu RGVmaW5lRmllbGQoJ2R3RW5hYmxlZCcsIFtVSW50MzJdLCAnUHVibGljJykNCgkJW3ZvaWRdJFN0cnVjdC5EZWZpbmVGaWVsZCgnZHdTa3UnLCBbVUludDMy XSwgNikNCgkJW3ZvaWRdJFN0cnVjdC5EZWZpbmVGaWVsZCgnZHdTdGF0ZScsIFtVSW50MzJdLCA2KQ0KCQkkU3ViU3RhdHVzID0gJFN0cnVjdC5DcmVhdGVU eXBlKCkNCgl9DQoNCgkkV2luMzIgPSAkQ2xhc3MuQ3JlYXRlVHlwZSgpDQp9DQoNCmZ1bmN0aW9uIFNsR2V0SW5mb0lJRCgkU2t1SWQpDQp7DQoJJGJEYXRh ID0gMA0KDQoJaWYgKCRXaW4zMjo6U0xHZW5lcmF0ZU9mZmxpbmVJbnN0YWxsYXRpb25JZCgNCgkJJGhTTEMsDQoJCVtyZWZdW0d1aWRdJFNrdUlkLA0KCQlb cmVmXSRiRGF0YQ0KCSkpDQoJew0KCQlyZXR1cm4gJG51bGwNCgl9DQoJZWxzZQ0KCXsNCgkJcmV0dXJuICRNYXJzaGFsOjpQdHJUb1N0cmluZ1VuaSgkYkRh dGEpDQoJfQ0KfQ0KDQpmdW5jdGlvbiBTbFJldHVybkRhdGEoJGhyUmV0LCAkdERhdGEsICRjRGF0YSwgJGJEYXRhKSB7DQoJaWYgKCRoclJldCAtTkUgMCAt T3IgJGNEYXRhIC1FUSAwKQ0KCXsNCgkJcmV0dXJuICRudWxsDQoJfQ0KCWlmICgkdERhdGEgLUVRIDEpDQoJew0KCQlyZXR1cm4gJE1hcnNoYWw6OlB0clRv U3RyaW5nVW5pKCRiRGF0YSkNCgl9DQoJZWxzZWlmICgkdERhdGEgLUVRIDQpDQoJew0KCQlyZXR1cm4gJE1hcnNoYWw6OlJlYWRJbnQzMigkYkRhdGEpDQoJ fQ0KCWVsc2VpZiAoJHREYXRhIC1FUSAzIC1BbmQgJGNEYXRhIC1FUSA4KQ0KCXsNCgkJcmV0dXJuICRNYXJzaGFsOjpSZWFkSW50NjQoJGJEYXRhKQ0KCX0N CgllbHNlDQoJew0KCQlyZXR1cm4gJG51bGwNCgl9DQp9DQoNCmZ1bmN0aW9uIFNsR2V0SW5mb1BLZXkoJFBrZXlJZCwgJFZhbHVlKQ0Kew0KCSR0RGF0YSA9 IDANCgkkY0RhdGEgPSAwDQoJJGJEYXRhID0gMA0KDQoJJGhyUmV0ID0gJFdpbjMyOjpTTEdldFBLZXlJbmZvcm1hdGlvbigNCgkJJGhTTEMsDQoJCVtyZWZd W0d1aWRdJFBrZXlJZCwNCgkJJFZhbHVlLA0KCQlbcmVmXSR0RGF0YSwNCgkJW3JlZl0kY0RhdGEsDQoJCVtyZWZdJGJEYXRhDQoJKQ0KDQoJcmV0dXJuIFNs UmV0dXJuRGF0YSAkaHJSZXQgJHREYXRhICRjRGF0YSAkYkRhdGENCn0NCg0KZnVuY3Rpb24gU2xHZXRJbmZvU2t1KCRTa3VJZCwgJFZhbHVlKQ0Kew0KCSR0 RGF0YSA9IDANCgkkY0RhdGEgPSAwDQoJJGJEYXRhID0gMA0KDQoJJGhyUmV0ID0gJFdpbjMyOjpTTEdldFByb2R1Y3RTa3VJbmZvcm1hdGlvbigNCgkJJGhT TEMsDQoJCVtyZWZdW0d1aWRdJFNrdUlkLA0KCQkkVmFsdWUsDQoJCVtyZWZdJHREYXRhLA0KCQlbcmVmXSRjRGF0YSwNCgkJW3JlZl0kYkRhdGENCgkpDQoN CglyZXR1cm4gU2xSZXR1cm5EYXRhICRoclJldCAkdERhdGEgJGNEYXRhICRiRGF0YQ0KfQ0KDQpmdW5jdGlvbiBTbEdldEluZm9BcHAoJEFwcElkLCAkVmFs dWUpDQp7DQoJJHREYXRhID0gMA0KCSRjRGF0YSA9IDANCgkkYkRhdGEgPSAwDQoNCgkkaHJSZXQgPSAkV2luMzI6OlNMR2V0QXBwbGljYXRpb25JbmZvcm1h dGlvbigNCgkJJGhTTEMsDQoJCVtyZWZdW0d1aWRdJEFwcElkLA0KCQkkVmFsdWUsDQoJCVtyZWZdJHREYXRhLA0KCQlbcmVmXSRjRGF0YSwNCgkJW3JlZl0k YkRhdGENCgkpDQoNCglyZXR1cm4gU2xSZXR1cm5EYXRhICRoclJldCAkdERhdGEgJGNEYXRhICRiRGF0YQ0KfQ0KDQpmdW5jdGlvbiBTbEdldEluZm9TZXJ2 aWNlKCRWYWx1ZSkNCnsNCgkkdERhdGEgPSAwDQoJJGNEYXRhID0gMA0KCSRiRGF0YSA9IDANCg0KCSRoclJldCA9ICRXaW4zMjo6U0xHZXRTZXJ2aWNlSW5m b3JtYXRpb24oDQoJCSRoU0xDLA0KCQkkVmFsdWUsDQoJCVtyZWZdJHREYXRhLA0KCQlbcmVmXSRjRGF0YSwNCgkJW3JlZl0kYkRhdGENCgkpDQoNCglyZXR1 cm4gU2xSZXR1cm5EYXRhICRoclJldCAkdERhdGEgJGNEYXRhICRiRGF0YQ0KfQ0KDQpmdW5jdGlvbiBTbEdldEluZm9TdmNBcHAoJHN0ckFwcCwgJFZhbHVl KQ0Kew0KCWlmICgkU0xBcHApDQoJew0KCQlyZXR1cm4gU2xHZXRJbmZvQXBwICRzdHJBcHAgJFZhbHVlDQoJfQ0KCWVsc2UNCgl7DQoJCXJldHVybiBTbEdl dEluZm9TZXJ2aWNlICRWYWx1ZQ0KCX0NCn0NCg0KZnVuY3Rpb24gU2xHZXRJbmZvTGljZW5zaW5nKCRBcHBJZCwgJFNrdUlkKQ0Kew0KCSRkd1N0YXR1cyA9 IDANCgkkZHdHcmFjZSA9IDANCgkkaHJSZWFzb24gPSAwDQoJJHF3VmFsaWRpdHkgPSAwDQoNCgkkY1N0YXR1cyA9IDANCgkkcFN0YXR1cyA9IDANCg0KCSRo clJldCA9ICRXaW4zMjo6U0xHZXRMaWNlbnNpbmdTdGF0dXNJbmZvcm1hdGlvbigNCgkJJGhTTEMsDQoJCVtyZWZdW0d1aWRdJEFwcElkLA0KCQlbcmVmXVtH dWlkXSRTa3VJZCwNCgkJMCwNCgkJW3JlZl0kY1N0YXR1cywNCgkJW3JlZl0kcFN0YXR1cw0KCSkNCg0KCWlmICgkaHJSZXQgLU5FIDAgLU9yICRjU3RhdHVz IC1FUSAwKQ0KCXsNCgkJcmV0dXJuDQoJfQ0KDQoJW0ludFB0cl0kcHBTdGF0dXMgPSBbSW50NjRdJHBTdGF0dXMgKyBbSW50NjRdNDAgKiAoJGNTdGF0dXMg LSAxKQ0KCSRkd1N0YXR1cyA9ICRNYXJzaGFsOjpSZWFkSW50MzIoJHBwU3RhdHVzLCAxNikNCgkkZHdHcmFjZSA9ICRNYXJzaGFsOjpSZWFkSW50MzIoJHBw U3RhdHVzLCAyMCkNCgkkaHJSZWFzb24gPSAkTWFyc2hhbDo6UmVhZEludDMyKCRwcFN0YXR1cywgMjgpDQoJJHF3VmFsaWRpdHkgPSAkTWFyc2hhbDo6UmVh ZEludDY0KCRwcFN0YXR1cywgMzIpDQoNCglpZiAoJGR3U3RhdHVzIC1FUSAzKQ0KCXsNCgkJJGR3U3RhdHVzID0gNQ0KCX0NCglpZiAoJGR3U3RhdHVzIC1F USAyKQ0KCXsNCgkJaWYgKCRoclJlYXNvbiAtRVEgMHg0MDA0RjAwRCkNCgkJew0KCQkJJGR3U3RhdHVzID0gMw0KCQl9DQoJCWVsc2VpZiAoJGhyUmVhc29u IC1FUSAweDQwMDRGMDY1KQ0KCQl7DQoJCQkkZHdTdGF0dXMgPSA0DQoJCX0NCgkJZWxzZWlmICgkaHJSZWFzb24gLUVRIDB4NDAwNEZDMDYpDQoJCXsNCgkJ CSRkd1N0YXR1cyA9IDYNCgkJfQ0KCX0NCg0KCXJldHVybg0KfQ0KDQpmdW5jdGlvbiBTbEdldEluZm9TTElEKCRBcHBJZCkNCnsNCgkkY1JldHVybklkcyA9 IDANCgkkcFJldHVybklkcyA9IDANCg0KCSRoclJldCA9ICRXaW4zMjo6U0xHZXRTTElETGlzdCgNCgkJJGhTTEMsDQoJCTAsDQoJCVtyZWZdW0d1aWRdJEFw cElkLA0KCQkxLA0KCQlbcmVmXSRjUmV0dXJuSWRzLA0KCQlbcmVmXSRwUmV0dXJuSWRzDQoJKQ0KDQoJaWYgKCRoclJldCAtTkUgMCAtT3IgJGNSZXR1cm5J ZHMgLUVRIDApDQoJew0KCQlyZXR1cm4NCgl9DQoNCgkkYTFMaXN0ID0gQCgpDQoJJGEyTGlzdCA9IEAoKQ0KCSRhM0xpc3QgPSBAKCkNCgkkYTRMaXN0ID0g QCgpDQoNCglmb3JlYWNoICgkaSBpbiAwLi4oJGNSZXR1cm5JZHMgLSAxKSkNCgl7DQoJCSRieXRlcyA9IE5ldy1PYmplY3QgYnl0ZVtdIDE2DQoJCSRNYXJz aGFsOjpDb3B5KFtJbnQ2NF0kcFJldHVybklkcyArIFtJbnQ2NF0xNiAqICRpLCAkYnl0ZXMsIDAsIDE2KQ0KCQkkYWN0aWQgPSAoW0d1aWRdJGJ5dGVzKS5H dWlkDQoJCSRnUFBLID0gU2xHZXRJbmZvU2t1ICRhY3RpZCAicGtleUlkIg0KCQkkZ0FkZCA9IFNsR2V0SW5mb1NrdSAkYWN0aWQgIkRlcGVuZHNPbiINCgkJ aWYgKCRBbGwuSXNQcmVzZW50KSB7DQoJCQlpZiAoJG51bGwgLUVRICRnUFBLIC1BbmQgJG51bGwgLU5FICRnQWRkKSB7ICRhMUxpc3QgKz0gQHtpZCA9ICRh Y3RpZDsgcGsgPSAkbnVsbDsgZXggPSAkdHJ1ZX0gfQ0KCQkJaWYgKCRudWxsIC1FUSAkZ1BQSyAtQW5kICRudWxsIC1FUSAkZ0FkZCkgeyAkYTJMaXN0ICs9 IEB7aWQgPSAkYWN0aWQ7IHBrID0gJG51bGw7IGV4ID0gJGZhbHNlfSB9DQoJCX0NCgkJaWYgKCRudWxsIC1ORSAkZ1BQSyAtQW5kICRudWxsIC1ORSAkZ0Fk ZCkgeyAkYTNMaXN0ICs9IEB7aWQgPSAkYWN0aWQ7IHBrID0gJGdQUEs7IGV4ID0gJHRydWV9IH0NCgkJaWYgKCRudWxsIC1ORSAkZ1BQSyAtQW5kICRudWxs IC1FUSAkZ0FkZCkgeyAkYTRMaXN0ICs9IEB7aWQgPSAkYWN0aWQ7IHBrID0gJGdQUEs7IGV4ID0gJGZhbHNlfSB9DQoJfQ0KDQoJcmV0dXJuICgkYTFMaXN0 ICsgJGEyTGlzdCArICRhM0xpc3QgKyAkYTRMaXN0KQ0KfQ0KDQpmdW5jdGlvbiBEZXRlY3RTdWJzY3JpcHRpb24gew0KCXRyeQ0KCXsNCgkJJG9ialN2YyA9 IE5ldy1PYmplY3QgUFNPYmplY3QNCgkJJHdtaVN2YyA9IFt3bWlzZWFyY2hlcl0iU0VMRUNUIFN1YnNjcmlwdGlvblR5cGUsIFN1YnNjcmlwdGlvblN0YXR1 cywgU3Vic2NyaXB0aW9uRWRpdGlvbiwgU3Vic2NyaXB0aW9uRXhwaXJ5IEZST00gU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlIg0KCQkkd21pU3ZjLk9wdGlv bnMuUmV3aW5kYWJsZSA9ICRmYWxzZQ0KCQkkd21pU3ZjLkdldCgpIHwgc2VsZWN0IC1FeHBhbmQgUHJvcGVydGllcyAtRUEgMCB8IGZvcmVhY2ggeyAkb2Jq U3ZjIHwgQWRkLU1lbWJlciA4ICRfLk5hbWUgJF8uVmFsdWUgfQ0KCQkkd21pU3ZjLkRpc3Bvc2UoKQ0KCX0NCgljYXRjaA0KCXsNCgkJcmV0dXJuDQoJfQ0K DQoJaWYgKCRudWxsIC1FUSAkb2JqU3ZjLlN1YnNjcmlwdGlvblR5cGUgLU9yICRvYmpTdmMuU3Vic2NyaXB0aW9uVHlwZSAtRVEgMTIwKSB7DQoJCXJldHVy bg0KCX0NCg0KCWlmICgkb2JqU3ZjLlN1YnNjcmlwdGlvblR5cGUgLUVRIDEpIHsNCgkJJFN1Yk1zZ1R5cGUgPSAiRGV2aWNlIGJhc2VkIg0KCX0gZWxzZSB7 DQoJCSRTdWJNc2dUeXBlID0gIlVzZXIgYmFzZWQiDQoJfQ0KDQoJaWYgKCRvYmpTdmMuU3Vic2NyaXB0aW9uU3RhdHVzIC1FUSAxMjApIHsNCgkJJFN1Yk1z Z1N0YXR1cyA9ICJFeHBpcmVkIg0KCX0gZWxzZWlmICgkb2JqU3ZjLlN1YnNjcmlwdGlvblN0YXR1cyAtRVEgMTAwKSB7DQoJCSRTdWJNc2dTdGF0dXMgPSAi RGlzYWJsZWQiDQoJfSBlbHNlaWYgKCRvYmpTdmMuU3Vic2NyaXB0aW9uU3RhdHVzIC1FUSAxKSB7DQoJCSRTdWJNc2dTdGF0dXMgPSAiQWN0aXZlIg0KCX0g ZWxzZSB7DQoJCSRTdWJNc2dTdGF0dXMgPSAiTm90IGFjdGl2ZSINCgl9DQoNCgkkU3ViTXNnRXhwaXJ5ID0gIlVua25vd24iDQoJaWYgKCRvYmpTdmMuU3Vi c2NyaXB0aW9uRXhwaXJ5KSB7DQoJCWlmICgkb2JqU3ZjLlN1YnNjcmlwdGlvbkV4cGlyeS5Db250YWlucygidW5zcGVjaWZpZWQiKSAtRVEgJGZhbHNlKSB7 JFN1Yk1zZ0V4cGlyeSA9ICRvYmpTdmMuU3Vic2NyaXB0aW9uRXhwaXJ5fQ0KCX0NCg0KCSRTdWJNc2dFZGl0aW9uID0gIlVua25vd24iDQoJaWYgKCRvYmpT dmMuU3Vic2NyaXB0aW9uRWRpdGlvbikgew0KCQlpZiAoJG9ialN2Yy5TdWJzY3JpcHRpb25FZGl0aW9uLkNvbnRhaW5zKCJVTktOT1dOIikgLUVRICRmYWxz ZSkgeyRTdWJNc2dFZGl0aW9uID0gJG9ialN2Yy5TdWJzY3JpcHRpb25FZGl0aW9ufQ0KCX0NCg0KCUNPTk9VVCAiYG5TdWJzY3JpcHRpb24gaW5mb3JtYXRp b246Ig0KCUNPTk9VVCAiICAgIFR5cGUgICA6ICRTdWJNc2dUeXBlIg0KCUNPTk9VVCAiICAgIFN0YXR1cyA6ICRTdWJNc2dTdGF0dXMiDQoJQ09OT1VUICIg ICAgRWRpdGlvbjogJFN1Yk1zZ0VkaXRpb24iDQoJQ09OT1VUICIgICAgRXhwaXJ5IDogJFN1Yk1zZ0V4cGlyeSINCn0NCg0KZnVuY3Rpb24gRGV0ZWN0QWRi YUNsaWVudA0Kew0KCSRwcm9wQURCQSB8IGZvcmVhY2ggeyBzZXQgJF8gKFNsR2V0SW5mb1NrdSAkbGljSUQgJF8pIH0NCglEZXRlY3RBY3RUeXBlDQoJQ09O T1VUICJgbkFEIEFjdGl2YXRpb24gY2xpZW50IGluZm9ybWF0aW9uOiINCglDT05PVVQgIiAgICBPYmplY3QgTmFtZTogJEFEQWN0aXZhdGlvbk9iamVjdE5h bWUiDQoJQ09OT1VUICIgICAgRG9tYWluIE5hbWU6ICRBREFjdGl2YXRpb25PYmplY3RETiINCglDT05PVVQgIiAgICBDU1ZMSyBFeHRlbmRlZCBQSUQ6ICRB REFjdGl2YXRpb25Dc3Zsa1BJRCINCglDT05PVVQgIiAgICBDU1ZMSyBBY3RpdmF0aW9uIElEOiAkQURBY3RpdmF0aW9uQ3N2bGtTa3VJRCINCn0NCg0KZnVu Y3Rpb24gRGV0ZWN0QXZtQ2xpZW50DQp7DQoJJHByb3BBVk1BIHwgZm9yZWFjaCB7IHNldCAkXyAoU2xHZXRJbmZvU2t1ICRsaWNJRCAkXykgfQ0KCUNPTk9V VCAiYG5BdXRvbWF0aWMgVk0gQWN0aXZhdGlvbiBjbGllbnQgaW5mb3JtYXRpb246Ig0KCWlmICgtTm90IFtTdHJpbmddOjpJc051bGxPckVtcHR5KCRJbmhl cml0ZWRBY3RpdmF0aW9uSWQpKSB7DQoJCUNPTk9VVCAiICAgIEd1ZXN0IElBSUQ6ICRJbmhlcml0ZWRBY3RpdmF0aW9uSWQiDQoJfSBlbHNlIHsNCgkJQ09O T1VUICIgICAgR3Vlc3QgSUFJRDogTm90IEF2YWlsYWJsZSINCgl9DQoJaWYgKC1Ob3QgW1N0cmluZ106OklzTnVsbE9yRW1wdHkoJEluaGVyaXRlZEFjdGl2 YXRpb25Ib3N0TWFjaGluZU5hbWUpKSB7DQoJCUNPTk9VVCAiICAgIEhvc3QgbWFjaGluZSBuYW1lOiAkSW5oZXJpdGVkQWN0aXZhdGlvbkhvc3RNYWNoaW5l TmFtZSINCgl9IGVsc2Ugew0KCQlDT05PVVQgIiAgICBIb3N0IG1hY2hpbmUgbmFtZTogTm90IEF2YWlsYWJsZSINCgl9DQoJaWYgKC1Ob3QgW1N0cmluZ106 OklzTnVsbE9yRW1wdHkoJEluaGVyaXRlZEFjdGl2YXRpb25Ib3N0RGlnaXRhbFBpZDIpKSB7DQoJCUNPTk9VVCAiICAgIEhvc3QgRGlnaXRhbCBQSUQyOiAk SW5oZXJpdGVkQWN0aXZhdGlvbkhvc3REaWdpdGFsUGlkMiINCgl9IGVsc2Ugew0KCQlDT05PVVQgIiAgICBIb3N0IERpZ2l0YWwgUElEMjogTm90IEF2YWls YWJsZSINCgl9DQoJaWYgKCRJbmhlcml0ZWRBY3RpdmF0aW9uQWN0aXZhdGlvblRpbWUpIHsNCgkJJElBQVQgPSBbRGF0ZVRpbWVdOjpGcm9tRmlsZVRpbWUo JEluaGVyaXRlZEFjdGl2YXRpb25BY3RpdmF0aW9uVGltZSkuVG9TdHJpbmcoJ3l5eXktTU0tZGQgaGg6bW06c3MgdHQnKQ0KCQlDT05PVVQgIiAgICBBY3Rp dmF0aW9uIHRpbWU6ICRJQUFUIg0KCX0gZWxzZSB7DQoJCUNPTk9VVCAiICAgIEFjdGl2YXRpb24gdGltZTogTm90IEF2YWlsYWJsZSINCgl9DQp9DQoNCmZ1 bmN0aW9uIERldGVjdEttc0hvc3QNCnsNCgkkSXNLZXlNYW5hZ2VtZW50U2VydmljZSA9IFNsR2V0SW5mb1N2Y0FwcCAkc3RyQXBwICdJc0tleU1hbmFnZW1l bnRTZXJ2aWNlJw0KCWlmICgtTm90ICRJc0tleU1hbmFnZW1lbnRTZXJ2aWNlKSB7DQoJCXJldHVybg0KCX0NCg0KCWlmICgkVmlzdGEgLU9yICROVDUpIHsN CgkJJHJlZ2sgPSAkU0xLZXlQYXRoDQoJfSBlbHNlaWYgKCRzdHJTTFAgLUVRICRvc2xwKSB7DQoJCSRyZWdrID0gJE9QS2V5UGF0aA0KCX0gZWxzZSB7DQoJ CSRyZWdrID0gJFNQS2V5UGF0aA0KCX0NCgkkS01TTGlzdGVuaW5nID0gc3RyR2V0UmVnaXN0cnkgJHJlZ2sgIktleU1hbmFnZW1lbnRTZXJ2aWNlTGlzdGVu aW5nUG9ydCINCgkkS01TUHVibGlzaGluZyA9IHN0ckdldFJlZ2lzdHJ5ICRyZWdrICJEaXNhYmxlRG5zUHVibGlzaGluZyINCgkkS01TUHJpb3JpdHkgPSBz dHJHZXRSZWdpc3RyeSAkcmVnayAiRW5hYmxlS21zTG93UHJpb3JpdHkiDQoNCglpZiAoLU5vdCAkS01TTGlzdGVuaW5nKSB7JEtNU0xpc3RlbmluZyA9IDE2 ODh9DQoJaWYgKC1Ob3QgJEtNU1B1Ymxpc2hpbmcpIHskS01TUHVibGlzaGluZyA9ICJUUlVFIn0gZWxzZSB7JEtNU1B1Ymxpc2hpbmcgPSBCb29sVG9XU3Ry ICghJEtNU1B1Ymxpc2hpbmcpfQ0KCWlmICgtTm90ICRLTVNQcmlvcml0eSkgeyRLTVNQcmlvcml0eSA9ICJGQUxTRSJ9IGVsc2UgeyRLTVNQcmlvcml0eSA9 IEJvb2xUb1dTdHIgJEtNU1ByaW9yaXR5fQ0KDQoJaWYgKCRLTVNQdWJsaXNoaW5nIC1FUSAiVFJVRSIpIHskS01TUHVibGlzaGluZyA9ICJFbmFibGVkIn0g ZWxzZSB7JEtNU1B1Ymxpc2hpbmcgPSAiRGlzYWJsZWQifQ0KCWlmICgkS01TUHJpb3JpdHkgLUVRICJUUlVFIikgeyRLTVNQcmlvcml0eSA9ICJMb3cifSBl bHNlIHskS01TUHJpb3JpdHkgPSAiTm9ybWFsIn0NCg0KCWlmICgkU0xBcHApDQoJew0KCQkkcHJvcEtNU1NlcnZlciB8IGZvcmVhY2ggeyBzZXQgJF8gKFNs R2V0SW5mb0FwcCAkc3RyQXBwICRfKSB9DQoJfQ0KCWVsc2UNCgl7DQoJCSRwcm9wS01TU2VydmVyIHwgZm9yZWFjaCB7IHNldCAkXyAoU2xHZXRJbmZvU2Vy dmljZSAkXykgfQ0KCX0NCg0KCSRLTVNSZXF1ZXN0cyA9ICRLZXlNYW5hZ2VtZW50U2VydmljZVRvdGFsUmVxdWVzdHMNCgkkTm9SZXF1ZXN0cyA9ICgkbnVs bCAtRVEgJEtNU1JlcXVlc3RzKSAtT3IgKCRLTVNSZXF1ZXN0cyAtRVEgLTEpIC1PciAoJEtNU1JlcXVlc3RzIC1FUSA0Mjk0OTY3Mjk1KQ0KDQoJQ09OT1VU ICJgbktleSBNYW5hZ2VtZW50IFNlcnZpY2UgaG9zdCBpbmZvcm1hdGlvbjoiDQoJQ09OT1VUICIgICAgQ3VycmVudCBjb3VudDogJEtleU1hbmFnZW1lbnRT ZXJ2aWNlQ3VycmVudENvdW50Ig0KCUNPTk9VVCAiICAgIExpc3RlbmluZyBvbiBQb3J0OiAkS01TTGlzdGVuaW5nIg0KCUNPTk9VVCAiICAgIEROUyBwdWJs aXNoaW5nOiAkS01TUHVibGlzaGluZyINCglDT05PVVQgIiAgICBLTVMgcHJpb3JpdHk6ICRLTVNQcmlvcml0eSINCglpZiAoJE5vUmVxdWVzdHMpIHsNCgkJ cmV0dXJuDQoJfQ0KCUNPTk9VVCAiYG5LZXkgTWFuYWdlbWVudCBTZXJ2aWNlIGN1bXVsYXRpdmUgcmVxdWVzdHMgcmVjZWl2ZWQgZnJvbSBjbGllbnRzOiIN CglDT05PVVQgIiAgICBUb3RhbDogJEtleU1hbmFnZW1lbnRTZXJ2aWNlVG90YWxSZXF1ZXN0cyINCglDT05PVVQgIiAgICBGYWlsZWQ6ICRLZXlNYW5hZ2Vt ZW50U2VydmljZUZhaWxlZFJlcXVlc3RzIg0KCUNPTk9VVCAiICAgIFVubGljZW5zZWQ6ICRLZXlNYW5hZ2VtZW50U2VydmljZVVubGljZW5zZWRSZXF1ZXN0 cyINCglDT05PVVQgIiAgICBMaWNlbnNlZDogJEtleU1hbmFnZW1lbnRTZXJ2aWNlTGljZW5zZWRSZXF1ZXN0cyINCglDT05PVVQgIiAgICBJbml0aWFsIGdy YWNlIHBlcmlvZDogJEtleU1hbmFnZW1lbnRTZXJ2aWNlT09CR3JhY2VSZXF1ZXN0cyINCglDT05PVVQgIiAgICBFeHBpcmVkIG9yIEhhcmR3YXJlIG91dCBv ZiB0b2xlcmFuY2U6ICRLZXlNYW5hZ2VtZW50U2VydmljZU9PVEdyYWNlUmVxdWVzdHMiDQoJQ09OT1VUICIgICAgTm9uLWdlbnVpbmUgZ3JhY2UgcGVyaW9k OiAkS2V5TWFuYWdlbWVudFNlcnZpY2VOb25HZW51aW5lR3JhY2VSZXF1ZXN0cyINCglpZiAoJG51bGwgLU5FICRLZXlNYW5hZ2VtZW50U2VydmljZU5vdGlm aWNhdGlvblJlcXVlc3RzKSB7Q09OT1VUICIgICAgTm90aWZpY2F0aW9uOiAkS2V5TWFuYWdlbWVudFNlcnZpY2VOb3RpZmljYXRpb25SZXF1ZXN0cyJ9DQp9 DQoNCmZ1bmN0aW9uIERldGVjdEFjdFR5cGUNCnsNCgkkVkxUeXBlID0gc3RyR2V0UmVnaXN0cnkgKCRTUEtleVBhdGggKyAnXCcgKyAkc3RyQXBwICsgJ1wn ICsgJGxpY0lEKSAiVkxBY3RpdmF0aW9uVHlwZSINCglpZiAoJG51bGwgLUVRICRWTFR5cGUpIHskVkxUeXBlID0gc3RyR2V0UmVnaXN0cnkgKCRTUEtleVBh dGggKyAnXCcgKyAkc3RyQXBwKSAiVkxBY3RpdmF0aW9uVHlwZSJ9DQoJaWYgKCRudWxsIC1FUSAkVkxUeXBlKSB7JFZMVHlwZSA9IHN0ckdldFJlZ2lzdHJ5 ICgkU1BLZXlQYXRoKSAiVkxBY3RpdmF0aW9uVHlwZSJ9DQoJaWYgKCRudWxsIC1FUSAkVkxUeXBlIC1PciAkVkxUeXBlIC1HVCAzKSB7JFZMVHlwZSA9IDB9 DQoJaWYgKCRudWxsIC1ORSAkVkxUeXBlKSB7Q09OT1VUICJDb25maWd1cmVkIEFjdGl2YXRpb24gVHlwZTogJCgkVkxBY3RUeXBlc1skVkxUeXBlXSkifQ0K fQ0KDQpmdW5jdGlvbiBEZXRlY3RLbXNDbGllbnQNCnsNCglpZiAoJHdpbjgpIHtEZXRlY3RBY3RUeXBlfQ0KCUNPTk9VVCAiYHIiDQoJaWYgKCRMaWNlbnNl U3RhdHVzIC1ORSAxKSB7DQoJCUNPTk9VVCAiUGxlYXNlIGFjdGl2YXRlIHRoZSBwcm9kdWN0IGluIG9yZGVyIHRvIHVwZGF0ZSBLTVMgY2xpZW50IGluZm9y bWF0aW9uIHZhbHVlcy4iDQoJCXJldHVybg0KCX0NCg0KCWlmICgkTlQ3IC1PciAkc3RyU0xQIC1FUSAkb3NscCkgew0KCQkkcHJvcEtNU0NsaWVudCB8IGZv cmVhY2ggeyBzZXQgJF8gKFNsR2V0SW5mb1NrdSAkbGljSUQgJF8pIH0NCgkJaWYgKCRzdHJTTFAgLUVRICRvc2xwKSB7JHJlZ2sgPSAkT1BLZXlQYXRofSBl bHNlIHskcmVnayA9ICRTUEtleVBhdGh9DQoJCSRLTVNDYWNoaW5nID0gc3RyR2V0UmVnaXN0cnkgJHJlZ2sgIkRpc2FibGVLZXlNYW5hZ2VtZW50U2Vydmlj ZUhvc3RDYWNoaW5nIg0KCQlpZiAoLU5vdCAkS01TQ2FjaGluZykgeyRLTVNDYWNoaW5nID0gIlRSVUUifSBlbHNlIHskS01TQ2FjaGluZyA9IEJvb2xUb1dT dHIgKCEkS01TQ2FjaGluZyl9DQoJfQ0KDQoJIkNsaWVudE1hY2hpbmVJRCIgfCBmb3JlYWNoIHsgc2V0ICRfIChTbEdldEluZm9TZXJ2aWNlICRfKSB9DQoN CglpZiAoJFZpc3RhKSB7DQoJCSRwcm9wS01TVmlzdGEgfCBmb3JlYWNoIHsgc2V0ICRfIChTbEdldEluZm9TZXJ2aWNlICRfKSB9DQoJCSRLZXlNYW5hZ2Vt ZW50U2VydmljZVBvcnQgPSBzdHJHZXRSZWdpc3RyeSAkU0xLZXlQYXRoICJLZXlNYW5hZ2VtZW50U2VydmljZVBvcnQiDQoJCSREaXNjb3ZlcmVkS2V5TWFu YWdlbWVudFNlcnZpY2VOYW1lID0gc3RyR2V0UmVnaXN0cnkgJE5TS2V5UGF0aCAiRGlzY292ZXJlZEtleU1hbmFnZW1lbnRTZXJ2aWNlTmFtZSINCgkJJERp c2NvdmVyZWRLZXlNYW5hZ2VtZW50U2VydmljZVBvcnQgPSBzdHJHZXRSZWdpc3RyeSAkTlNLZXlQYXRoICJEaXNjb3ZlcmVkS2V5TWFuYWdlbWVudFNlcnZp Y2VQb3J0Ig0KCX0NCg0KCWlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkS2V5TWFuYWdlbWVudFNlcnZpY2VOYW1lKSkgew0KCQkkS21zUmVnID0gJG51 bGwNCgl9IGVsc2Ugew0KCQlpZiAoLU5vdCAkS2V5TWFuYWdlbWVudFNlcnZpY2VQb3J0KSB7JEtleU1hbmFnZW1lbnRTZXJ2aWNlUG9ydCA9IDE2ODh9DQoJ CSRLbXNSZWcgPSAiUmVnaXN0ZXJlZCBLTVMgbWFjaGluZSBuYW1lOiAke0tleU1hbmFnZW1lbnRTZXJ2aWNlTmFtZX06JHtLZXlNYW5hZ2VtZW50U2Vydmlj ZVBvcnR9Ig0KCX0NCg0KCWlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkRGlzY292ZXJlZEtleU1hbmFnZW1lbnRTZXJ2aWNlTmFtZSkpIHsNCgkJJEtt c0RucyA9ICJETlMgYXV0by1kaXNjb3Zlcnk6IEtNUyBuYW1lIG5vdCBhdmFpbGFibGUiDQoJCWlmICgkVmlzdGEgLUFuZCAtTm90ICRBZG1pbikgeyRLbXNE bnMgPSAiRE5TIGF1dG8tZGlzY292ZXJ5OiBSdW4gdGhlIHNjcmlwdCBhcyBhZG1pbmlzdHJhdG9yIHRvIHJldHJpZXZlIGluZm8ifQ0KCX0gZWxzZSB7DQoJ CWlmICgtTm90ICREaXNjb3ZlcmVkS2V5TWFuYWdlbWVudFNlcnZpY2VQb3J0KSB7JERpc2NvdmVyZWRLZXlNYW5hZ2VtZW50U2VydmljZVBvcnQgPSAxNjg4 fQ0KCQkkS21zRG5zID0gIktNUyBtYWNoaW5lIG5hbWUgZnJvbSBETlM6ICR7RGlzY292ZXJlZEtleU1hbmFnZW1lbnRTZXJ2aWNlTmFtZX06JHtEaXNjb3Zl cmVkS2V5TWFuYWdlbWVudFNlcnZpY2VQb3J0fSINCgl9DQoNCglpZiAoJG51bGwgLU5FICRLTVNDYWNoaW5nKSB7DQoJCWlmICgkS01TQ2FjaGluZyAtRVEg IlRSVUUiKSB7JEtNU0NhY2hpbmcgPSAiRW5hYmxlZCJ9IGVsc2UgeyRLTVNDYWNoaW5nID0gIkRpc2FibGVkIn0NCgl9DQoNCglpZiAoJHN0clNMUCAtRVEg JHdzbHAgLUFuZCAkTlQ5KSB7DQoJCWlmIChbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkRGlzY292ZXJlZEtleU1hbmFnZW1lbnRTZXJ2aWNlSXBBZGRyZXNz KSkgew0KCQkJJERpc2NvdmVyZWRLZXlNYW5hZ2VtZW50U2VydmljZUlwQWRkcmVzcyA9ICJub3QgYXZhaWxhYmxlIg0KCQl9DQoJfQ0KDQoJQ09OT1VUICJL ZXkgTWFuYWdlbWVudCBTZXJ2aWNlIGNsaWVudCBpbmZvcm1hdGlvbjoiDQoJQ09OT1VUICIgICAgQ2xpZW50IE1hY2hpbmUgSUQgKENNSUQpOiAkQ2xpZW50 TWFjaGluZUlEIg0KCWlmICgkbnVsbCAtRVEgJEttc1JlZykgew0KCQlDT05PVVQgIiAgICAkS21zRG5zIg0KCQlDT05PVVQgIiAgICBSZWdpc3RlcmVkIEtN UyBtYWNoaW5lIG5hbWU6IEtNUyBuYW1lIG5vdCBhdmFpbGFibGUiDQoJfSBlbHNlIHsNCgkJQ09OT1VUICIgICAgJEttc1JlZyINCgl9DQoJaWYgKCRudWxs IC1ORSAkRGlzY292ZXJlZEtleU1hbmFnZW1lbnRTZXJ2aWNlSXBBZGRyZXNzKSB7Q09OT1VUICIgICAgS01TIG1hY2hpbmUgSVAgYWRkcmVzczogJERpc2Nv dmVyZWRLZXlNYW5hZ2VtZW50U2VydmljZUlwQWRkcmVzcyJ9DQoJQ09OT1VUICIgICAgS01TIG1hY2hpbmUgZXh0ZW5kZWQgUElEOiAkQ3VzdG9tZXJQSUQi DQoJQ09OT1VUICIgICAgQWN0aXZhdGlvbiBpbnRlcnZhbDogJFZMQWN0aXZhdGlvbkludGVydmFsIG1pbnV0ZXMiDQoJQ09OT1VUICIgICAgUmVuZXdhbCBp bnRlcnZhbDogJFZMUmVuZXdhbEludGVydmFsIG1pbnV0ZXMiDQoJaWYgKCRudWxsIC1ORSAkS01TQ2FjaGluZykge0NPTk9VVCAiICAgIEtNUyBob3N0IGNh Y2hpbmc6ICRLTVNDYWNoaW5nIn0NCglpZiAoLU5vdCBbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkS2V5TWFuYWdlbWVudFNlcnZpY2VMb29rdXBEb21haW4p KSB7Q09OT1VUICIgICAgS01TIFNSViByZWNvcmQgbG9va3VwIGRvbWFpbjogJEtleU1hbmFnZW1lbnRTZXJ2aWNlTG9va3VwRG9tYWluIn0NCn0NCg0KZnVu Y3Rpb24gR2V0UmVzdWx0KCRzdHJTTFAsICRzdHJBcHAsICRlbnRyeSkNCnsNCgkkbGljSUQgPSAkZW50cnkuaWQNCgkkcHJvcFByZCB8IGZvcmVhY2ggeyBz ZXQgJF8gKFNsR2V0SW5mb1NrdSAkbGljSUQgJF8pIH0NCgkuIFNsR2V0SW5mb0xpY2Vuc2luZyAkc3RyQXBwICRsaWNJRA0KCSRMaWNlbnNlU3RhdHVzID0g JGR3U3RhdHVzDQoJJExpY1JlYXNvbiA9ICRoclJlYXNvbg0KCSRFdmFsdWF0aW9uRW5kRGF0ZSA9ICRxd1ZhbGlkaXR5DQoJJGdwck1udCA9ICRkd0dyYWNl DQoNCgkkcGtpZCA9ICRlbnRyeS5waw0KCSRpc1BQSyA9ICRudWxsIC1ORSAkcGtpZA0KDQoJJGFkZF9vbiA9ICROYW1lLkluZGV4T2YoImFkZC1vbiBmb3Ii LCA1KQ0KCWlmICgkYWRkX29uIC1ORSAtMSkgew0KCQkkTmFtZSA9ICROYW1lLlN1YnN0cmluZygwLCAkYWRkX29uICsgNykNCgl9DQoNCgkkbGljUEhOID0g ImVtcHR5Ig0KCWlmICgkRGx2IC1PciAkQWxsLklzUHJlc2VudCkgew0KCQkkbGljUEhOID0gU2xHZXRJbmZvU2t1ICRsaWNJRCAibXNmdDpzbC9FVUwvUEhP TkUvUFVCTElDIg0KCX0NCg0KCWlmICgkTGljZW5zZVN0YXR1cyAtRVEgMCAtQW5kICEkaXNQUEspIHsNCgkJJiAkaXNBbGwNCgkJQ09OT1VUICJOYW1lOiAk TmFtZSINCgkJQ09OT1VUICJEZXNjcmlwdGlvbjogJERlc2NyaXB0aW9uIg0KCQlDT05PVVQgIkFjdGl2YXRpb24gSUQ6ICRsaWNJRCINCgkJQ09OT1VUICJM aWNlbnNlIFN0YXR1czogVW5saWNlbnNlZCINCgkJaWYgKCRsaWNQSE4gLU5FICJlbXB0eSIpIHsNCgkJCSRnUEhOID0gW1N0cmluZ106OklzTnVsbE9yRW1w dHkoJGxpY1BITikgLU5FICR0cnVlDQoJCQlDT05PVVQgIlBob25lIGFjdGl2YXRhYmxlOiAkKCRnUEhOLlRvU3RyaW5nKCkpIg0KCQl9DQoJCXJldHVybg0K CX0NCg0KCSR3aW5JRCA9ICgkc3RyQXBwIC1FUSAkd2luQXBwKQ0KCSR3aW5QUiA9ICgkd2luSUQgLUFuZCAtTm90ICRlbnRyeS5leCkNCgkkVmlzdGEgPSAo JHdpbklEIC1BbmQgJE5UNiAtQW5kIC1Ob3QgJE5UNykNCgkkTlQ1ID0gKCRzdHJTTFAgLUVRICR3c2xwIC1BbmQgJHdpbmJ1aWxkIC1MVCA2MDAxKQ0KCSR3 aW44ID0gKCRzdHJTTFAgLUVRICR3c2xwIC1BbmQgJE5UOCkNCgkkcmVhcHAgPSAoIldpbmRvd3MiLCAiQXBwIilbISR3aW5JRF0NCgkkcHJtbnQgPSAoIm1h Y2hpbmUiLCAicHJvZHVjdCIpWyEkd2luUFJdDQoNCglpZiAoJERlc2NyaXB0aW9uLkNvbnRhaW5zKCJWT0xVTUVfS01TQ0xJRU5UIikpIHskY0ttc0NsaWVu dCA9IDE7ICRhY3RUYWcgPSAiVm9sdW1lIn0NCglpZiAoJERlc2NyaXB0aW9uLkNvbnRhaW5zKCJUSU1FQkFTRURfIikpIHskY1RibENsaWVudCA9IDE7ICRh Y3RUYWcgPSAiVGltZWJhc2VkIn0NCglpZiAoJERlc2NyaXB0aW9uLkNvbnRhaW5zKCJWSVJUVUFMX01BQ0hJTkVfQUNUSVZBVElPTiIpKSB7JGNBdm1DbGll bnQgPSAxOyAkYWN0VGFnID0gIkF1dG9tYXRpYyBWTSJ9DQoJaWYgKCRudWxsIC1FUSAkY0ttc0NsaWVudCAtQW5kICREZXNjcmlwdGlvbi5Db250YWlucygi Vk9MVU1FX0tNUyIpKSB7JGNLbXNTZXJ2ZXIgPSAxfQ0KDQoJJGdwckRheSA9IFtNYXRoXTo6Um91bmQoJGdwck1udC8xNDQwKQ0KCSRfeHByID0gIiINCgkk aW5HcmFjZSA9ICRmYWxzZQ0KCWlmICgkZ3ByTW50IC1HVCAwKSB7DQoJCSRfeHByID0gW0RhdGVUaW1lXTo6Tm93LkFkZE1pbnV0ZXMoJGdwck1udCkuVG9T dHJpbmcoJ3l5eXktTU0tZGQgaGg6bW06c3MgdHQnKQ0KCQkkaW5HcmFjZSA9ICR0cnVlDQoJfQ0KDQoJJExpY2Vuc2VNc2cgPSAiVGltZSByZW1haW5pbmc6 ICRncHJNbnQgbWludXRlKHMpICgkZ3ByRGF5IGRheShzKSkiDQoJaWYgKCRMaWNlbnNlU3RhdHVzIC1FUSAwKSB7DQoJCSRMaWNlbnNlSW5mID0gIlVubGlj ZW5zZWQiDQoJCSRMaWNlbnNlTXNnID0gJG51bGwNCgl9DQoJaWYgKCRMaWNlbnNlU3RhdHVzIC1FUSAxKSB7DQoJCSRMaWNlbnNlSW5mID0gIkxpY2Vuc2Vk Ig0KCQlpZiAoJGdwck1udCAtRVEgMCkgew0KCQkJJExpY2Vuc2VNc2cgPSAkbnVsbA0KCQkJJEV4cGlyZU1zZyA9ICJUaGUgJHBybW50IGlzIHBlcm1hbmVu dGx5IGFjdGl2YXRlZC4iDQoJCX0gZWxzZSB7DQoJCQkkTGljZW5zZU1zZyA9ICIkYWN0VGFnIGFjdGl2YXRpb24gZXhwaXJhdGlvbjogJGdwck1udCBtaW51 dGUocykgKCRncHJEYXkgZGF5KHMpKSINCgkJCWlmICgkaW5HcmFjZSkgeyRFeHBpcmVNc2cgPSAiJGFjdFRhZyBhY3RpdmF0aW9uIHdpbGwgZXhwaXJlICRf eHByIn0NCgkJfQ0KCX0NCglpZiAoJExpY2Vuc2VTdGF0dXMgLUVRIDIpIHsNCgkJJExpY2Vuc2VJbmYgPSAiSW5pdGlhbCBncmFjZSBwZXJpb2QiDQoJCWlm ICgkaW5HcmFjZSkgeyRFeHBpcmVNc2cgPSAiJExpY2Vuc2VJbmYgZW5kcyAkX3hwciJ9DQoJfQ0KCWlmICgkTGljZW5zZVN0YXR1cyAtRVEgMykgew0KCQkk TGljZW5zZUluZiA9ICJBZGRpdGlvbmFsIGdyYWNlIHBlcmlvZCAoS01TIGxpY2Vuc2UgZXhwaXJlZCBvciBoYXJkd2FyZSBvdXQgb2YgdG9sZXJhbmNlKSIN CgkJaWYgKCRpbkdyYWNlKSB7JEV4cGlyZU1zZyA9ICJBZGRpdGlvbmFsIGdyYWNlIHBlcmlvZCBlbmRzICRfeHByIn0NCgl9DQoJaWYgKCRMaWNlbnNlU3Rh dHVzIC1FUSA0KSB7DQoJCSRMaWNlbnNlSW5mID0gIk5vbi1nZW51aW5lIGdyYWNlIHBlcmlvZCINCgkJaWYgKCRpbkdyYWNlKSB7JEV4cGlyZU1zZyA9ICIk TGljZW5zZUluZiBlbmRzICRfeHByIn0NCgl9DQoJaWYgKCRMaWNlbnNlU3RhdHVzIC1FUSA1IC1BbmQgLU5vdCAkTlQ1KSB7DQoJCSRMaWNlbnNlUmVhc29u ID0gJzB4ezA6WH0nIC1mICRMaWNSZWFzb24NCgkJJExpY2Vuc2VJbmYgPSAiTm90aWZpY2F0aW9uIg0KCQkkTGljZW5zZU1zZyA9ICJOb3RpZmljYXRpb24g UmVhc29uOiAkTGljZW5zZVJlYXNvbiINCgkJaWYgKCRMaWNlbnNlUmVhc29uIC1FUSAiMHhDMDA0RjAwRiIpIHtpZiAoJG51bGwgLU5FICRjS21zQ2xpZW50 KSB7JExpY2Vuc2VNc2cgPSAkTGljZW5zZU1zZyArICIgKEtNUyBsaWNlbnNlIGV4cGlyZWQpLiJ9IGVsc2UgeyRMaWNlbnNlTXNnID0gJExpY2Vuc2VNc2cg KyAiIChoYXJkd2FyZSBvdXQgb2YgdG9sZXJhbmNlKS4ifX0NCgkJaWYgKCRMaWNlbnNlUmVhc29uIC1FUSAiMHhDMDA0RjIwMCIpIHskTGljZW5zZU1zZyA9 ICRMaWNlbnNlTXNnICsgIiAobm9uLWdlbnVpbmUpLiJ9DQoJCWlmICgkTGljZW5zZVJlYXNvbiAtRVEgIjB4QzAwNEYwMDkiIC1PciAkTGljZW5zZVJlYXNv biAtRVEgIjB4QzAwNEYwNjQiKSB7JExpY2Vuc2VNc2cgPSAkTGljZW5zZU1zZyArICIgKGdyYWNlIHRpbWUgZXhwaXJlZCkuIn0NCgl9DQoJaWYgKCRMaWNl bnNlU3RhdHVzIC1HVCA1IC1PciAoJExpY2Vuc2VTdGF0dXMgLUdUIDQgLUFuZCAkTlQ1KSkgew0KCQkkTGljZW5zZUluZiA9ICJVbmtub3duIg0KCQkkTGlj ZW5zZU1zZyA9ICRudWxsDQoJfQ0KCWlmICgkTGljZW5zZVN0YXR1cyAtRVEgNiAtQW5kIC1Ob3QgJFZpc3RhIC1BbmQgLU5vdCAkTlQ1KSB7DQoJCSRMaWNl bnNlSW5mID0gIkV4dGVuZGVkIGdyYWNlIHBlcmlvZCINCgkJaWYgKCRpbkdyYWNlKSB7JEV4cGlyZU1zZyA9ICIkTGljZW5zZUluZiBlbmRzICRfeHByIn0N Cgl9DQoNCglpZiAoJGlzUFBLKSB7DQoJCSRwcm9wUGtleSB8IGZvcmVhY2ggeyBzZXQgJF8gKFNsR2V0SW5mb1BLZXkgJHBraWQgJF8pIH0NCgl9DQoNCglp ZiAoJHdpblBSIC1BbmQgJGlzUFBLIC1BbmQgLU5vdCAkTlQ4KSB7DQoJCSR1eGQgPSBTbEdldEluZm9Ta3UgJGxpY0lEICdVWERpZmZlcmVudGlhdG9yJw0K CQkkc2NyaXB0OnByaW1hcnkgKz0gQHsNCgkJCWFpZCA9ICRsaWNJRDsNCgkJCXBwayA9ICRQYXJ0aWFsUHJvZHVjdEtleTsNCgkJCWNobiA9ICRDaGFubmVs Ow0KCQkJbHN0ID0gJExpY2Vuc2VTdGF0dXM7DQoJCQlsY3IgPSAkTGljUmVhc29uOw0KCQkJZ2VkID0gJGdwck1udDsNCgkJCWV2bCA9ICRFdmFsdWF0aW9u RW5kRGF0ZTsNCgkJCWRmZiA9ICR1eGQNCgkJfQ0KCX0NCg0KCWlmICgkSUlEIC1BbmQgJGlzUFBLKSB7DQoJCSRPZmZsaW5lSW5zdGFsbGF0aW9uSWQgPSBT bEdldEluZm9JSUQgJGxpY0lEDQoJfQ0KDQoJaWYgKCREbHYpIHsNCgkJaWYgKCR3aW44KQ0KCQl7DQoJCQkkUmVtYWluaW5nU2t1UmVBcm1Db3VudCA9IFNs R2V0SW5mb1NrdSAkbGljSUQgJ1JlbWFpbmluZ1JlYXJtQ291bnQnDQoJCQkkUmVtYWluaW5nQXBwUmVBcm1Db3VudCA9IFNsR2V0SW5mb0FwcCAkc3RyQXBw ICdSZW1haW5pbmdSZWFybUNvdW50Jw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJaWYgKCgkd2luSUQgLUFuZCAkTlQ3KSAtT3IgJHN0clNMUCAtRVEgJG9zbHAp DQoJCQl7DQoJCQkJJFJlbWFpbmluZ1NMUmVBcm1Db3VudCA9IFNsR2V0SW5mb0FwcCAkc3RyQXBwICdSZW1haW5pbmdSZWFybUNvdW50Jw0KCQkJfQ0KCQkJ ZWxzZQ0KCQkJew0KCQkJCSRSZW1haW5pbmdTTFJlQXJtQ291bnQgPSBTbEdldEluZm9TZXJ2aWNlICdSZWFybUNvdW50Jw0KCQkJfQ0KCQl9DQoJCWlmICgk bnVsbCAtRVEgJFRydXN0ZWRUaW1lKQ0KCQl7DQoJCQkkVHJ1c3RlZFRpbWUgPSBTbEdldEluZm9TdmNBcHAgJHN0ckFwcCAnVHJ1c3RlZFRpbWUnDQoJCX0N Cgl9DQoNCgkmICRpc0FsbA0KCUNPTk9VVCAiTmFtZTogJE5hbWUiDQoJQ09OT1VUICJEZXNjcmlwdGlvbjogJERlc2NyaXB0aW9uIg0KCUNPTk9VVCAiQWN0 aXZhdGlvbiBJRDogJGxpY0lEIg0KCWlmICgkbnVsbCAtTkUgJERpZ2l0YWxQSUQpIHtDT05PVVQgIkV4dGVuZGVkIFBJRDogJERpZ2l0YWxQSUQifQ0KCWlm ICgkbnVsbCAtTkUgJERpZ2l0YWxQSUQyIC1BbmQgJERsdikge0NPTk9VVCAiUHJvZHVjdCBJRDogJERpZ2l0YWxQSUQyIn0NCglpZiAoJG51bGwgLU5FICRP ZmZsaW5lSW5zdGFsbGF0aW9uSWQgLUFuZCAkSUlEKSB7Q09OT1VUICJJbnN0YWxsYXRpb24gSUQ6ICRPZmZsaW5lSW5zdGFsbGF0aW9uSWQifQ0KCWlmICgk bnVsbCAtTkUgJENoYW5uZWwpIHtDT05PVVQgIlByb2R1Y3QgS2V5IENoYW5uZWw6ICRDaGFubmVsIn0NCglpZiAoJG51bGwgLU5FICRQYXJ0aWFsUHJvZHVj dEtleSkge0NPTk9VVCAiUGFydGlhbCBQcm9kdWN0IEtleTogJFBhcnRpYWxQcm9kdWN0S2V5In0NCglDT05PVVQgIkxpY2Vuc2UgU3RhdHVzOiAkTGljZW5z ZUluZiINCglpZiAoJG51bGwgLU5FICRMaWNlbnNlTXNnKSB7Q09OT1VUICIkTGljZW5zZU1zZyJ9DQoJaWYgKCRMaWNlbnNlU3RhdHVzIC1ORSAwIC1BbmQg JEV2YWx1YXRpb25FbmREYXRlKSB7DQoJCSRFRUQgPSBbRGF0ZVRpbWVdOjpGcm9tRmlsZVRpbWVVdGMoJEV2YWx1YXRpb25FbmREYXRlKS5Ub1N0cmluZygn eXl5eS1NTS1kZCBoaDptbTpzcyB0dCcpDQoJCUNPTk9VVCAiRXZhbHVhdGlvbiBFbmQgRGF0ZTogJEVFRCBVVEMiDQoJfQ0KCWlmICgkTGljZW5zZVN0YXR1 cyAtTkUgMSAtQW5kICRsaWNQSE4gLU5FICJlbXB0eSIpIHsNCgkJJGdQSE4gPSBbU3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkbGljUEhOKSAtTkUgJHRydWUN CgkJQ09OT1VUICJQaG9uZSBhY3RpdmF0YWJsZTogJCgkZ1BITi5Ub1N0cmluZygpKSINCgl9DQoJaWYgKCREbHYpIHsNCgkJaWYgKCRudWxsIC1ORSAkUmVt YWluaW5nU0xSZUFybUNvdW50KSB7DQoJCQlDT05PVVQgIlJlbWFpbmluZyAkcmVhcHAgcmVhcm0gY291bnQ6ICRSZW1haW5pbmdTTFJlQXJtQ291bnQiDQoJ CX0NCgkJaWYgKCRudWxsIC1ORSAkUmVtYWluaW5nU2t1UmVBcm1Db3VudCkgew0KCQkJQ09OT1VUICJSZW1haW5pbmcgJHJlYXBwIHJlYXJtIGNvdW50OiAk UmVtYWluaW5nQXBwUmVBcm1Db3VudCINCgkJCUNPTk9VVCAiUmVtYWluaW5nIFNLVSByZWFybSBjb3VudDogJFJlbWFpbmluZ1NrdVJlQXJtQ291bnQiDQoJ CX0NCgkJaWYgKCRMaWNlbnNlU3RhdHVzIC1ORSAwIC1BbmQgJFRydXN0ZWRUaW1lKSB7DQoJCQkkVFREID0gW0RhdGVUaW1lXTo6RnJvbUZpbGVUaW1lKCRU cnVzdGVkVGltZSkuVG9TdHJpbmcoJ3l5eXktTU0tZGQgaGg6bW06c3MgdHQnKQ0KCQkJQ09OT1VUICJUcnVzdGVkIHRpbWU6ICRUVEQiDQoJCX0NCgl9DQoJ aWYgKCEkaXNQUEspIHsNCgkJcmV0dXJuDQoJfQ0KDQoJaWYgKCR3aW44IC1BbmQgJFZMQWN0aXZhdGlvblR5cGUgLUVRIDEpIHsNCgkJRGV0ZWN0QWRiYUNs aWVudA0KCQkkY0ttc0NsaWVudCA9ICRudWxsDQoJfQ0KDQoJaWYgKCR3aW5JRCAtQW5kICRudWxsIC1ORSAkY0F2bUNsaWVudCkgew0KCQlEZXRlY3RBdm1D bGllbnQNCgl9DQoNCgkkY2hrU3ViID0gKCR3aW5QUiAtQW5kICRpc1N1YikNCg0KCSRjaGtTTFMgPSAoJG51bGwgLU5FICRjS21zQ2xpZW50IC1PciAkbnVs bCAtTkUgJGNLbXNTZXJ2ZXIgLU9yICRjaGtTdWIpDQoNCglpZiAoISRjaGtTTFMpIHsNCgkJaWYgKCRudWxsIC1ORSAkRXhwaXJlTXNnKSB7Q09OT1VUICJg biAgICAkRXhwaXJlTXNnIn0NCgkJcmV0dXJuDQoJfQ0KDQoJaWYgKCRudWxsIC1ORSAkY0ttc0NsaWVudCkgew0KCQlEZXRlY3RLbXNDbGllbnQNCgl9DQoN CglpZiAoJG51bGwgLU5FICRjS21zU2VydmVyKSB7DQoJCWlmICgkbnVsbCAtTkUgJEV4cGlyZU1zZykge0NPTk9VVCAiYG4gICAgJEV4cGlyZU1zZyJ9DQoJ CURldGVjdEttc0hvc3QNCgl9IGVsc2Ugew0KCQlpZiAoJG51bGwgLU5FICRFeHBpcmVNc2cpIHtDT05PVVQgImBuICAgICRFeHBpcmVNc2cifQ0KCX0NCg0K CWlmICgkY2hrU3ViKSB7DQoJCURldGVjdFN1YnNjcmlwdGlvbg0KCX0NCg0KfQ0KDQpmdW5jdGlvbiBQYXJzZUxpc3QoJHN0clNMUCwgJHN0ckFwcCwgJGFy ckxpc3QpDQp7DQoJZm9yZWFjaCAoJGVudHJ5IGluICRhcnJMaXN0KQ0KCXsNCgkJR2V0UmVzdWx0ICRzdHJTTFAgJHN0ckFwcCAkZW50cnkNCgkJQ09OT1VU ICIkbGluZTMiDQoJCSYgJG5vQWxsDQoJfQ0KfQ0KI2VuZHJlZ2lvbg0KDQojcmVnaW9uIHZOZXh0RGlhZw0KaWYgKCRQU1ZlcnNpb25UYWJsZS5QU1ZlcnNp b24uTWFqb3IgLUx0IDMpDQp7DQoJZnVuY3Rpb24gQ29udmVydEZyb20tSnNvbg0KCXsNCgkJW0NtZGxldEJpbmRpbmcoKV0NCgkJUGFyYW0oDQoJCQlbUGFy YW1ldGVyKFZhbHVlRnJvbVBpcGVsaW5lPSR0cnVlKV1bT2JqZWN0XSRpdGVtDQoJCSkNCgkJW3ZvaWRdW1N5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5XTo6 TG9hZFdpdGhQYXJ0aWFsTmFtZSgiU3lzdGVtLldlYi5FeHRlbnNpb25zIikNCgkJJHBzanMgPSBOZXctT2JqZWN0IFN5c3RlbS5XZWIuU2NyaXB0LlNlcmlh bGl6YXRpb24uSmF2YVNjcmlwdFNlcmlhbGl6ZXINCgkJUmV0dXJuICwkcHNqcy5EZXNlcmlhbGl6ZU9iamVjdCgkaXRlbSkNCgl9DQoJZnVuY3Rpb24gQ29u dmVydFRvLUpzb24NCgl7DQoJCVtDbWRsZXRCaW5kaW5nKCldDQoJCVBhcmFtKA0KCQkJW1BhcmFtZXRlcihWYWx1ZUZyb21QaXBlbGluZT0kdHJ1ZSldW09i amVjdF0kaXRlbQ0KCQkpDQoJCVt2b2lkXVtTeXN0ZW0uUmVmbGVjdGlvbi5Bc3NlbWJseV06OkxvYWRXaXRoUGFydGlhbE5hbWUoIlN5c3RlbS5XZWIuRXh0 ZW5zaW9ucyIpDQoJCSRwc2pzID0gTmV3LU9iamVjdCBTeXN0ZW0uV2ViLlNjcmlwdC5TZXJpYWxpemF0aW9uLkphdmFTY3JpcHRTZXJpYWxpemVyDQoJCVJl dHVybiAkcHNqcy5TZXJpYWxpemUoJGl0ZW0pDQoJfQ0KfQ0KDQpmdW5jdGlvbiBQcmludE1vZGVQZXJQcmlkRnJvbVJlZ2lzdHJ5DQp7DQoJJHZOZXh0UmVn a2V5ID0gIkhLQ1U6XFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2VcMTYuMFxDb21tb25cTGljZW5zaW5nXExpY2Vuc2luZ05leHQiDQoJJHZOZXh0UHJpZHMg PSBHZXQtSXRlbSAtUGF0aCAkdk5leHRSZWdrZXkgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUgfCBTZWxlY3QtT2JqZWN0IC1FeHBhbmRQcm9wZXJ0 eSAncHJvcGVydHknIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlIHwgV2hlcmUtT2JqZWN0IC1GaWx0ZXJTY3JpcHQgeyRfLlRvTG93ZXIoKSAtbGlr ZSAiKnJldGFpbCIgLW9yICRfLlRvTG93ZXIoKSAtbGlrZSAiKnZvbHVtZSJ9DQoJSWYgKCRudWxsIC1FcSAkdk5leHRQcmlkcykNCgl7DQoJCUNPTk9VVCAi YG5ObyByZWdpc3RyeSBrZXlzIGZvdW5kLiINCgkJUmV0dXJuDQoJfQ0KCUNPTk9VVCAiYHIiDQoJJHZOZXh0UHJpZHMgfCBGb3JFYWNoIGANCgl7DQoJCSRt b2RlID0gKEdldC1JdGVtUHJvcGVydHkgLVBhdGggJHZOZXh0UmVna2V5IC1OYW1lICRfKS4kXw0KCQlTd2l0Y2ggKCRtb2RlKQ0KCQl7DQoJCQkyIHsgJG1v ZGUgPSAidk5leHQiOyBCcmVhayB9DQoJCQkzIHsgJG1vZGUgPSAiRGV2aWNlIjsgQnJlYWsgfQ0KCQkJRGVmYXVsdCB7ICRtb2RlID0gIkxlZ2FjeSI7IEJy ZWFrIH0NCgkJfQ0KCQlDT05PVVQgIiRfID0gJG1vZGUiDQoJfQ0KfQ0KDQpmdW5jdGlvbiBQcmludFNoYXJlZENvbXB1dGVyTGljZW5zaW5nDQp7DQoJJHNj YVJlZ0tleSA9ICJIS0xNOlxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlXENsaWNrVG9SdW5cQ29uZmlndXJhdGlvbiINCgkkc2NhVmFsdWUgPSBHZXQtSXRl bVByb3BlcnR5IC1QYXRoICRzY2FSZWdLZXkgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUgfCBTZWxlY3QtT2JqZWN0IC1FeHBhbmRQcm9wZXJ0eSAi U2hhcmVkQ29tcHV0ZXJMaWNlbnNpbmciIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQoJJHNjYVJlZ0tleTIgPSAiSEtMTTpcU09GVFdBUkVcTWlj cm9zb2Z0XE9mZmljZVwxNi4wXENvbW1vblxMaWNlbnNpbmciDQoJJHNjYVZhbHVlMiA9IEdldC1JdGVtUHJvcGVydHkgLVBhdGggJHNjYVJlZ0tleTIgLUVy cm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUgfCBTZWxlY3QtT2JqZWN0IC1FeHBhbmRQcm9wZXJ0eSAiU2hhcmVkQ29tcHV0ZXJMaWNlbnNpbmciIC1FcnJv ckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQoJJHNjYVBvbGljeUtleSA9ICJIS0xNOlxTT0ZUV0FSRVxQb2xpY2llc1xNaWNyb3NvZnRcT2ZmaWNlXDE2LjBc Q29tbW9uXExpY2Vuc2luZyINCgkkc2NhUG9saWN5VmFsdWUgPSBHZXQtSXRlbVByb3BlcnR5IC1QYXRoICRzY2FQb2xpY3lLZXkgLUVycm9yQWN0aW9uIFNp bGVudGx5Q29udGludWUgfCBTZWxlY3QtT2JqZWN0IC1FeHBhbmRQcm9wZXJ0eSAiU2hhcmVkQ29tcHV0ZXJMaWNlbnNpbmciIC1FcnJvckFjdGlvbiBTaWxl bnRseUNvbnRpbnVlDQoJSWYgKCRudWxsIC1FcSAkc2NhVmFsdWUgLUFuZCAkbnVsbCAtRXEgJHNjYVZhbHVlMiAtQW5kICRudWxsIC1FcSAkc2NhUG9saWN5 VmFsdWUpDQoJew0KCQlDT05PVVQgImBuTm8gcmVnaXN0cnkga2V5cyBmb3VuZC4iDQoJCVJldHVybg0KCX0NCgkkc2NhTW9kZVZhbHVlID0gJHNjYVZhbHVl IC1PciAkc2NhVmFsdWUyIC1PciAkc2NhUG9saWN5VmFsdWUNCglJZiAoJHNjYU1vZGVWYWx1ZSAtRXEgMCkNCgl7DQoJCSRzY2FNb2RlID0gIkRpc2FibGVk Ig0KCX0NCglJZiAoJHNjYU1vZGVWYWx1ZSAtRXEgMSkNCgl7DQoJCSRzY2FNb2RlID0gIkVuYWJsZWQiDQoJfQ0KCUNPTk9VVCAiYG5TdGF0dXM6ICRzY2FN b2RlIg0KCUNPTk9VVCAiYHIiDQoJJHRva2VuRmlsZXMgPSAkbnVsbA0KCSR0b2tlblBhdGggPSAiJHtlbnY6TE9DQUxBUFBEQVRBfVxNaWNyb3NvZnRcT2Zm aWNlXDE2LjBcTGljZW5zaW5nIg0KCUlmIChUZXN0LVBhdGggJHRva2VuUGF0aCkNCgl7DQoJCSR0b2tlbkZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAk dG9rZW5QYXRoIC1GaWx0ZXIgIiphdXRoU3RyaW5nKiIgLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgeyAhJF8uUFNJc0NvbnRhaW5lciB9DQoJfQ0KCUlmICgk bnVsbCAtRXEgJHRva2VuRmlsZXMgLU9yICR0b2tlbkZpbGVzLkxlbmd0aCAtRXEgMCkNCgl7DQoJCUNPTk9VVCAiTm8gdG9rZW5zIGZvdW5kLiINCgkJUmV0 dXJuDQoJfQ0KCSR0b2tlbkZpbGVzIHwgRm9yRWFjaCBgDQoJew0KCQkkdG9rZW5QYXJ0cyA9IChHZXQtQ29udGVudCAtRW5jb2RpbmcgVW5pY29kZSAtUGF0 aCAkXy5GdWxsTmFtZSkuU3BsaXQoJ18nKQ0KCQkkb3V0cHV0ID0gTmV3LU9iamVjdCBQU09iamVjdA0KCQkkb3V0cHV0IHwgQWRkLU1lbWJlciA4ICdBQ0lE JyAkdG9rZW5QYXJ0c1swXTsNCgkJJG91dHB1dCB8IEFkZC1NZW1iZXIgOCAnVXNlcicgJHRva2VuUGFydHNbM107DQoJCSRvdXRwdXQgfCBBZGQtTWVtYmVy IDggJ05vdEJlZm9yZScgJHRva2VuUGFydHNbNF07DQoJCSRvdXRwdXQgfCBBZGQtTWVtYmVyIDggJ05vdEFmdGVyJyAkdG9rZW5QYXJ0c1s1XTsNCgkJV3Jp dGUtT3V0cHV0ICRvdXRwdXQNCgl9DQp9DQoNCmZ1bmN0aW9uIFByaW50TGljZW5zZXNJbmZvcm1hdGlvbg0Kew0KCVBhcmFtKA0KCQlbVmFsaWRhdGVTZXQo Ik5VTCIsICJEZXZpY2UiKV0NCgkJW1N0cmluZ10kbW9kZQ0KCSkNCglJZiAoJG1vZGUgLUVxICJOVUwiKQ0KCXsNCgkJJGxpY2Vuc2VQYXRoID0gIiR7ZW52 OkxPQ0FMQVBQREFUQX1cTWljcm9zb2Z0XE9mZmljZVxMaWNlbnNlcyINCgl9DQoJRWxzZUlmICgkbW9kZSAtRXEgIkRldmljZSIpDQoJew0KCQkkbGljZW5z ZVBhdGggPSAiJHtlbnY6UFJPR1JBTURBVEF9XE1pY3Jvc29mdFxPZmZpY2VcTGljZW5zZXMiDQoJfQ0KCSRsaWNlbnNlRmlsZXMgPSAkbnVsbA0KCUlmIChU ZXN0LVBhdGggJGxpY2Vuc2VQYXRoKQ0KCXsNCgkJJGxpY2Vuc2VGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJGxpY2Vuc2VQYXRoIC1SZWN1cnNlIHwg V2hlcmUtT2JqZWN0IHsgISRfLlBTSXNDb250YWluZXIgfQ0KCX0NCglJZiAoJG51bGwgLUVxICRsaWNlbnNlRmlsZXMgLU9yICRsaWNlbnNlRmlsZXMuTGVu Z3RoIC1FcSAwKQ0KCXsNCgkJQ09OT1VUICJgbk5vIGxpY2Vuc2VzIGZvdW5kLiINCgkJUmV0dXJuDQoJfQ0KCSRsaWNlbnNlRmlsZXMgfCBGb3JFYWNoIGAN Cgl7DQoJCSRsaWNlbnNlID0gKEdldC1Db250ZW50IC1FbmNvZGluZyBVbmljb2RlICRfLkZ1bGxOYW1lIHwgQ29udmVydEZyb20tSnNvbikuTGljZW5zZQ0K CQkkZGVjb2RlZExpY2Vuc2UgPSBbU3lzdGVtLlRleHQuRW5jb2RpbmddOjpVVEY4LkdldFN0cmluZyhbU3lzdGVtLkNvbnZlcnRdOjpGcm9tQmFzZTY0U3Ry aW5nKCRsaWNlbnNlKSkgfCBDb252ZXJ0RnJvbS1Kc29uDQoJCSRsaWNlbnNlVHlwZSA9ICRkZWNvZGVkTGljZW5zZS5MaWNlbnNlVHlwZQ0KCQlJZiAoJG51 bGwgLU5lICRkZWNvZGVkTGljZW5zZS5FeHBpcmVzT24pDQoJCXsNCgkJCSRleHBpcnkgPSBbU3lzdGVtLkRhdGVUaW1lXTo6UGFyc2UoJGRlY29kZWRMaWNl bnNlLkV4cGlyZXNPbiwgJG51bGwsICdBZGp1c3RUb1VuaXZlcnNhbCcpDQoJCX0NCgkJRWxzZQ0KCQl7DQoJCQkkZXhwaXJ5ID0gTmV3LU9iamVjdCBTeXN0 ZW0uRGF0ZVRpbWUNCgkJfQ0KCQkkbGljZW5zZVN0YXRlID0gIkdyYWNlIg0KCQlJZiAoKEdldC1EYXRlKSAtR3QgKEdldC1EYXRlICRkZWNvZGVkTGljZW5z ZS5NZXRhZGF0YS5Ob3RBZnRlcikpDQoJCXsNCgkJCSRsaWNlbnNlU3RhdGUgPSAiUkZNIg0KCQl9DQoJCUVsc2VJZiAoKEdldC1EYXRlKSAtTHQgKEdldC1E YXRlICRleHBpcnkpKQ0KCQl7DQoJCQkkbGljZW5zZVN0YXRlID0gIkxpY2Vuc2VkIg0KCQl9DQoJCSRvdXRwdXQgPSBOZXctT2JqZWN0IFBTT2JqZWN0DQoJ CSRvdXRwdXQgfCBBZGQtTWVtYmVyIDggJ0ZpbGUnICRfLlBTQ2hpbGROYW1lOw0KCQkkb3V0cHV0IHwgQWRkLU1lbWJlciA4ICdWZXJzaW9uJyAkXy5EaXJl Y3RvcnkuTmFtZTsNCgkJJG91dHB1dCB8IEFkZC1NZW1iZXIgOCAnVHlwZScgIlVzZXJ8JHtsaWNlbnNlVHlwZX0iOw0KCQkkb3V0cHV0IHwgQWRkLU1lbWJl ciA4ICdQcm9kdWN0JyAkZGVjb2RlZExpY2Vuc2UuUHJvZHVjdFJlbGVhc2VJZDsNCgkJJG91dHB1dCB8IEFkZC1NZW1iZXIgOCAnQWNpZCcgJGRlY29kZWRM aWNlbnNlLkFjaWQ7DQoJCUlmICgkbW9kZSAtRXEgIkRldmljZSIpIHsgJG91dHB1dCB8IEFkZC1NZW1iZXIgOCAnRGV2aWNlSWQnICRkZWNvZGVkTGljZW5z ZS5NZXRhZGF0YS5EZXZpY2VJZDsgfQ0KCQkkb3V0cHV0IHwgQWRkLU1lbWJlciA4ICdMaWNlbnNlU3RhdGUnICRsaWNlbnNlU3RhdGU7DQoJCSRvdXRwdXQg fCBBZGQtTWVtYmVyIDggJ0VudGl0bGVtZW50U3RhdHVzJyAkZGVjb2RlZExpY2Vuc2UuU3RhdHVzOw0KCQkkb3V0cHV0IHwgQWRkLU1lbWJlciA4ICdFbnRp dGxlbWVudEV4cGlyYXRpb24nICgiTi9BIiwgJGRlY29kZWRMaWNlbnNlLkV4cGlyZXNPbilbISgkbnVsbCAtZXEgJGRlY29kZWRMaWNlbnNlLkV4cGlyZXNP bildOw0KCQkkb3V0cHV0IHwgQWRkLU1lbWJlciA4ICdSZWFzb25Db2RlJyAoIk4vQSIsICRkZWNvZGVkTGljZW5zZS5SZWFzb25Db2RlKVshKCRudWxsIC1l cSAkZGVjb2RlZExpY2Vuc2UuUmVhc29uQ29kZSldOw0KCQkkb3V0cHV0IHwgQWRkLU1lbWJlciA4ICdOb3RCZWZvcmUnICRkZWNvZGVkTGljZW5zZS5NZXRh ZGF0YS5Ob3RCZWZvcmU7DQoJCSRvdXRwdXQgfCBBZGQtTWVtYmVyIDggJ05vdEFmdGVyJyAkZGVjb2RlZExpY2Vuc2UuTWV0YWRhdGEuTm90QWZ0ZXI7DQoJ CSRvdXRwdXQgfCBBZGQtTWVtYmVyIDggJ05leHRSZW5ld2FsJyAkZGVjb2RlZExpY2Vuc2UuTWV0YWRhdGEuUmVuZXdBZnRlcjsNCgkJJG91dHB1dCB8IEFk ZC1NZW1iZXIgOCAnVGVuYW50SWQnICgiTi9BIiwgJGRlY29kZWRMaWNlbnNlLk1ldGFkYXRhLlRlbmFudElkKVshKCRudWxsIC1lcSAkZGVjb2RlZExpY2Vu c2UuTWV0YWRhdGEuVGVuYW50SWQpXTsNCgkJIyRvdXRwdXQuUFNPYmplY3QuUHJvcGVydGllcyB8IGZvcmVhY2ggeyAkaHQgPSBAe30gfSB7ICRodFskXy5O YW1lXSA9ICRfLlZhbHVlIH0geyAkb3V0cHV0ID0gJGh0IHwgQ29udmVydFRvLUpzb24gfQ0KCQlXcml0ZS1PdXRwdXQgJG91dHB1dA0KCX0NCn0NCg0KZnVu Y3Rpb24gdk5leHREaWFnUnVuDQp7DQoJJGZOVUwgPSAoW0lPLkRpcmVjdG9yeV06OkV4aXN0cygiJHtlbnY6TE9DQUxBUFBEQVRBfVxNaWNyb3NvZnRcT2Zm aWNlXExpY2Vuc2VzIikpIC1hbmQgKFtJTy5EaXJlY3RvcnldOjpHZXRGaWxlcygiJHtlbnY6TE9DQUxBUFBEQVRBfVxNaWNyb3NvZnRcT2ZmaWNlXExpY2Vu c2VzIiwgIioiLCAxKS5MZW5ndGggLUdUIDApDQoJJGZEZXYgPSAoW0lPLkRpcmVjdG9yeV06OkV4aXN0cygiJHtlbnY6UFJPR1JBTURBVEF9XE1pY3Jvc29m dFxPZmZpY2VcTGljZW5zZXMiKSkgLWFuZCAoW0lPLkRpcmVjdG9yeV06OkdldEZpbGVzKCIke2VudjpQUk9HUkFNREFUQX1cTWljcm9zb2Z0XE9mZmljZVxM aWNlbnNlcyIsICIqIiwgMSkuTGVuZ3RoIC1HVCAwKQ0KCSRyUElEID0gJG51bGwgLU5FIChHUCAiSEtDVTpcU09GVFdBUkVcTWljcm9zb2Z0XE9mZmljZVwx Ni4wXENvbW1vblxMaWNlbnNpbmdcTGljZW5zaW5nTmV4dCIgLUVBIDAgfCBzZWxlY3QgLUV4cGFuZCAncHJvcGVydHknIC1FQSAwIHwgd2hlcmUgLUZpbHRl ciB7JF8uVG9Mb3dlcigpIC1saWtlICIqcmV0YWlsIiAtb3IgJF8uVG9Mb3dlcigpIC1saWtlICIqdm9sdW1lIn0pDQoJJHJTQ0EgPSAkbnVsbCAtTkUgKEdQ ICJIS0xNOlxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlXENsaWNrVG9SdW5cQ29uZmlndXJhdGlvbiIgLUVBIDAgfCBzZWxlY3QgLUV4cGFuZCAiU2hhcmVk Q29tcHV0ZXJMaWNlbnNpbmciIC1FQSAwKQ0KCSRyU0NMID0gJG51bGwgLU5FIChHUCAiSEtMTTpcU09GVFdBUkVcTWljcm9zb2Z0XE9mZmljZVwxNi4wXENv bW1vblxMaWNlbnNpbmciIC1FQSAwIHwgc2VsZWN0IC1FeHBhbmQgIlNoYXJlZENvbXB1dGVyTGljZW5zaW5nIiAtRUEgMCkNCg0KCWlmICgoJGZOVUwgLU9y ICRmRGV2IC1PciAkclBJRCAtT3IgJHJTQ0EgLU9yICRyU0NMKSAtRVEgJGZhbHNlKSB7DQoJCVJldHVybg0KCX0NCg0KCSYgJGlzQWxsDQoJQ09OT1VUICIk bGluZTIiDQoJQ09OT1VUICI9PT0gICAgICAgICAgICAgICAgICBPZmZpY2Ugdk5leHQgU3RhdHVzICAgICAgICAgICAgICAgICA9PT0iDQoJQ09OT1VUICIk bGluZTIiDQoJQ09OT1VUICJgbj09PT09PT09PT0gTW9kZSBwZXIgUHJvZHVjdFJlbGVhc2VJZCA9PT09PT09PT09Ig0KCVByaW50TW9kZVBlclByaWRGcm9t UmVnaXN0cnkNCglDT05PVVQgImBuPT09PT09PT09PSBTaGFyZWQgQ29tcHV0ZXIgTGljZW5zaW5nID09PT09PT09PT0iDQoJUHJpbnRTaGFyZWRDb21wdXRl ckxpY2Vuc2luZw0KCUNPTk9VVCAiYG49PT09PT09PT09IHZOZXh0IGxpY2Vuc2VzID09PT09PT09PT09Ig0KCVByaW50TGljZW5zZXNJbmZvcm1hdGlvbiAt TW9kZSAiTlVMIg0KCUNPTk9VVCAiYG49PT09PT09PT09IERldmljZSBsaWNlbnNlcyA9PT09PT09PT09Ig0KCVByaW50TGljZW5zZXNJbmZvcm1hdGlvbiAt TW9kZSAiRGV2aWNlIg0KCUNPTk9VVCAiJGxpbmUzIg0KCUNPTk9VVCAiYHIiDQp9DQojZW5kcmVnaW9uDQoNCiNyZWdpb24gY2xpYw0KDQo8Iw0KOzs7IFNv dXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2FzZGNvcnAvY2xpYw0KOzs7IFBvd2Vyc2hlbGwgcG9ydDogYWJib2RpMTQwNg0KDQpDb3B5cmlnaHQgMjAyMyBh c2Rjb3JwDQoNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YN CnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluDQp0aGUgU29mdHdh cmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvDQp1c2UsIGNvcHksIG1vZGlmeSwgbWVy Z2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZg0KdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBl cnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLA0Kc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoN ClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbA0KY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCg0KVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hB TlRBQklMSVRZLCBGSVRORVNTDQpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFV VEhPUlMgT1INCkNPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUg0K SU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4NCkNPTk5FQ1RJT04gV0lUSCBU SEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQojPg0KDQpmdW5jdGlvbiBJbml0aWFsaXplRGlnaXRh bExpY2Vuc2VDaGVjayB7DQoJJENBQiA9IFtTeXN0ZW0uUmVmbGVjdGlvbi5FbWl0LkN1c3RvbUF0dHJpYnV0ZUJ1aWxkZXJdDQoNCgkkSUNvbSA9ICRNb2R1 bGUuRGVmaW5lVHlwZSgnRVVNLklFVU0nLCAnUHVibGljLCBJbnRlcmZhY2UsIEFic3RyYWN0LCBJbXBvcnQnKQ0KCSRJQ29tLlNldEN1c3RvbUF0dHJpYnV0 ZSgkQ0FCOjpuZXcoW1N5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5Db21JbXBvcnRBdHRyaWJ1dGVdLkdldENvbnN0cnVjdG9yKEAoKSksIEAoKSkp DQoJJElDb20uU2V0Q3VzdG9tQXR0cmlidXRlKCRDQUI6Om5ldyhbU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzLkd1aWRBdHRyaWJ1dGVdLkdldENv bnN0cnVjdG9yKEAoW1N0cmluZ10pKSwgQCgnRjJEQ0I4MEQtMDY3MC00NEJDLTkwMDItQ0QxODY4ODczMEFGJykpKQ0KCSRJQ29tLlNldEN1c3RvbUF0dHJp YnV0ZSgkQ0FCOjpuZXcoW1N5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcy5JbnRlcmZhY2VUeXBlQXR0cmlidXRlXS5HZXRDb25zdHJ1Y3RvcihAKFtJ bnQxNl0pKSwgQChbSW50MTZdMSkpKQ0KDQoJMS4uNCB8ICUgeyBbdm9pZF0kSUNvbS5EZWZpbmVNZXRob2QoJ1ZGJyskXywgJ1B1YmxpYywgVmlydHVhbCwg SGlkZUJ5U2lnLCBOZXdTbG90LCBBYnN0cmFjdCcsICdTdGFuZGFyZCwgSGFzVGhpcycsIFtWb2lkXSwgQCgpKSB9DQoJW3ZvaWRdJElDb20uRGVmaW5lTWV0 aG9kKCdBY3F1aXJlTW9kZXJuTGljZW5zZUZvcldpbmRvd3MnLCAxNDc4LCAzMywgW0ludDMyXSwgQChbSW50MzJdLCBbSW50MzJdLk1ha2VCeVJlZlR5cGUo KSkpDQoNCgkkSUVVTSA9ICRJQ29tLkNyZWF0ZVR5cGUoKQ0KfQ0KDQpmdW5jdGlvbiBQcmludFN0YXRlRGF0YSB7DQoJJHB3c3pTdGF0ZURhdGEgPSAwDQoJ JGNiU2l6ZSA9IDANCg0KCWlmICgkV2luMzI6OlNMR2V0V2luZG93c0luZm9ybWF0aW9uKA0KCQkiU2VjdXJpdHktU1BQLUFjdGlvbi1TdGF0ZURhdGEiLA0K CQlbcmVmXSRudWxsLA0KCQlbcmVmXSRjYlNpemUsDQoJCVtyZWZdJHB3c3pTdGF0ZURhdGENCgkpKSB7DQoJCXJldHVybiAkRkFMU0UNCgl9DQoNCglbc3Ry aW5nW11dJHB3c3pTdGF0ZVN0cmluZyA9ICRNYXJzaGFsOjpQdHJUb1N0cmluZ1VuaSgkcHdzelN0YXRlRGF0YSkgLXJlcGxhY2UgIjsiLCAiYG4gICAgIg0K CUNPTk9VVCAoIiAgICAkcHdzelN0YXRlU3RyaW5nIikNCg0KCSRNYXJzaGFsOjpGcmVlSEdsb2JhbCgkcHdzelN0YXRlRGF0YSkNCglyZXR1cm4gJFRSVUUN Cn0NCg0KZnVuY3Rpb24gUHJpbnRMYXN0QWN0aXZhdGlvbkhSZXN1bHQgew0KCSRwZHdMYXN0SFJlc3VsdCA9IDANCgkkY2JTaXplID0gMA0KDQoJaWYgKCRX aW4zMjo6U0xHZXRXaW5kb3dzSW5mb3JtYXRpb24oDQoJCSJTZWN1cml0eS1TUFAtTGFzdFdpbmRvd3NBY3RpdmF0aW9uSFJlc3VsdCIsDQoJCVtyZWZdJG51 bGwsDQoJCVtyZWZdJGNiU2l6ZSwNCgkJW3JlZl0kcGR3TGFzdEhSZXN1bHQNCgkpKSB7DQoJCXJldHVybiAkRkFMU0UNCgl9DQoNCglDT05PVVQgKCIgICAg TGFzdEFjdGl2YXRpb25IUmVzdWx0PTB4ezA6eDh9IiAtZiAkTWFyc2hhbDo6UmVhZEludDMyKCRwZHdMYXN0SFJlc3VsdCkpDQoNCgkkTWFyc2hhbDo6RnJl ZUhHbG9iYWwoJHBkd0xhc3RIUmVzdWx0KQ0KCXJldHVybiAkVFJVRQ0KfQ0KDQpmdW5jdGlvbiBQcmludExhc3RBY3RpdmF0aW9uVGltZSB7DQoJJHBxd0xh c3RUaW1lID0gMA0KCSRjYlNpemUgPSAwDQoNCglpZiAoJFdpbjMyOjpTTEdldFdpbmRvd3NJbmZvcm1hdGlvbigNCgkJIlNlY3VyaXR5LVNQUC1MYXN0V2lu ZG93c0FjdGl2YXRpb25UaW1lIiwNCgkJW3JlZl0kbnVsbCwNCgkJW3JlZl0kY2JTaXplLA0KCQlbcmVmXSRwcXdMYXN0VGltZQ0KCSkpIHsNCgkJcmV0dXJu ICRGQUxTRQ0KCX0NCg0KCSRhY3RUaW1lID0gJE1hcnNoYWw6OlJlYWRJbnQ2NCgkcHF3TGFzdFRpbWUpDQoJaWYgKCRhY3RUaW1lIC1uZSAwKSB7DQoJCUNP Tk9VVCAoIiAgICBMYXN0QWN0aXZhdGlvblRpbWU9ezB9IiAtZiBbRGF0ZVRpbWVdOjpGcm9tRmlsZVRpbWVVdGMoJGFjdFRpbWUpLlRvU3RyaW5nKCJ5eXl5 L01NL2RkOkhIOm1tOnNzIikpDQoJfQ0KDQoJJE1hcnNoYWw6OkZyZWVIR2xvYmFsKCRwcXdMYXN0VGltZSkNCglyZXR1cm4gJFRSVUUNCn0NCg0KZnVuY3Rp b24gUHJpbnRJc1dpbmRvd3NHZW51aW5lIHsNCgkkZHdHZW51aW5lID0gMA0KDQoJaWYgKCRXaW4zMjo6U0xJc1dpbmRvd3NHZW51aW5lTG9jYWwoW3JlZl0k ZHdHZW51aW5lKSkgew0KCQlyZXR1cm4gJEZBTFNFDQoJfQ0KDQoJaWYgKCRkd0dlbnVpbmUgLWx0IDUpIHsNCgkJQ09OT1VUICgiICAgIElzV2luZG93c0dl bnVpbmU9ezB9IiAtZiAkcHB3c3pHZW51aW5lU3RhdGVzWyRkd0dlbnVpbmVdKQ0KCX0gZWxzZSB7DQoJCUNPTk9VVCAoIiAgICBJc1dpbmRvd3NHZW51aW5l PXswfSIgLWYgJGR3R2VudWluZSkNCgl9DQoNCglyZXR1cm4gJFRSVUUNCn0NCg0KZnVuY3Rpb24gUHJpbnREaWdpdGFsTGljZW5zZVN0YXR1cyB7DQoJdHJ5 IHsNCgkJLiBJbml0aWFsaXplRGlnaXRhbExpY2Vuc2VDaGVjaw0KCQkkQ29tT2JqID0gTmV3LU9iamVjdCAtQ29tIEVkaXRpb25VcGdyYWRlTWFuYWdlck9i ai5FZGl0aW9uVXBncmFkZU1hbmFnZXINCgl9IGNhdGNoIHsNCgkJcmV0dXJuICRGQUxTRQ0KCX0NCg0KCSRwYXJhbWV0ZXJzID0gMSwgJG51bGwNCg0KCWlm IChbRVVNLklFVU1dLkdldE1ldGhvZCgiQWNxdWlyZU1vZGVybkxpY2Vuc2VGb3JXaW5kb3dzIikuSW52b2tlKCRDb21PYmosICRwYXJhbWV0ZXJzKSkgew0K CQlyZXR1cm4gJEZBTFNFDQoJfQ0KDQoJJGR3UmV0dXJuQ29kZSA9ICRwYXJhbWV0ZXJzWzFdDQoJW2Jvb2xdJGJEaWdpdGFsTGljZW5zZSA9ICRGQUxTRQ0K DQoJJGJEaWdpdGFsTGljZW5zZSA9ICgoJGR3UmV0dXJuQ29kZSAtZ2UgMCkgLWFuZCAoJGR3UmV0dXJuQ29kZSAtbmUgMSkpDQoJQ09OT1VUICgiICAgIElz RGlnaXRhbExpY2Vuc2U9ezB9IiAtZiAoQm9vbFRvV1N0ciAkYkRpZ2l0YWxMaWNlbnNlKSkNCg0KCXJldHVybiAkVFJVRQ0KfQ0KDQpmdW5jdGlvbiBQcmlu dFN1YnNjcmlwdGlvblN0YXR1cyB7DQoJJGR3U3VwcG9ydGVkID0gMA0KDQoJaWYgKCR3aW5idWlsZCAtZ2UgMTUwNjMpIHsNCgkJJHB3c3pQb2xpY3kgPSAi Q29uc3VtZUFkZG9uUG9saWN5U2V0Ig0KCX0gZWxzZSB7DQoJCSRwd3N6UG9saWN5ID0gIkFsbG93LVdpbmRvd3NTdWJzY3JpcHRpb24iDQoJfQ0KDQoJaWYg KCRXaW4zMjo6U0xHZXRXaW5kb3dzSW5mb3JtYXRpb25EV09SRCgkcHdzelBvbGljeSwgW3JlZl0kZHdTdXBwb3J0ZWQpKSB7DQoJCXJldHVybiAkRkFMU0UN Cgl9DQoNCglDT05PVVQgKCIgICAgU3Vic2NyaXB0aW9uU3VwcG9ydGVkRWRpdGlvbj17MH0iIC1mIChCb29sVG9XU3RyICRkd1N1cHBvcnRlZCkpDQoNCgkk cFN0YXR1cyA9ICRNYXJzaGFsOjpBbGxvY0hHbG9iYWwoJE1hcnNoYWw6OlNpemVPZihbVHlwZV0kU3ViU3RhdHVzKSkNCglpZiAoJFdpbjMyOjpDbGlwR2V0 U3Vic2NyaXB0aW9uU3RhdHVzKFtyZWZdJHBTdGF0dXMpKSB7DQoJCXJldHVybiAkRkFMU0UNCgl9DQoNCgkkc1N0YXR1cyA9IFtBY3RpdmF0b3JdOjpDcmVh dGVJbnN0YW5jZSgkU3ViU3RhdHVzKQ0KCSRzU3RhdHVzID0gJE1hcnNoYWw6OlB0clRvU3RydWN0dXJlKCRwU3RhdHVzLCBbVHlwZV0kU3ViU3RhdHVzKQ0K CSRNYXJzaGFsOjpGcmVlSEdsb2JhbCgkcFN0YXR1cykNCg0KCUNPTk9VVCAoIiAgICBTdWJzY3JpcHRpb25FbmFibGVkPXswfSIgLWYgKEJvb2xUb1dTdHIg JHNTdGF0dXMuZHdFbmFibGVkKSkNCg0KCWlmICgkc1N0YXR1cy5kd0VuYWJsZWQgLWVxIDApIHsNCgkJcmV0dXJuICRUUlVFDQoJfQ0KDQoJQ09OT1VUICgi ICAgIFN1YnNjcmlwdGlvblNrdT17MH0iIC1mICRzU3RhdHVzLmR3U2t1KQ0KCUNPTk9VVCAoIiAgICBTdWJzY3JpcHRpb25TdGF0ZT17MH0iIC1mICRzU3Rh dHVzLmR3U3RhdGUpDQoNCglyZXR1cm4gJFRSVUUNCn0NCg0KZnVuY3Rpb24gQ2xpY1J1bg0Kew0KCSYgJGlzQWxsDQoJQ09OT1VUICJDbGllbnQgTGljZW5z aW5nIENoZWNrIGluZm9ybWF0aW9uOiINCg0KCSRudWxsID0gUHJpbnRTdGF0ZURhdGENCgkkbnVsbCA9IFByaW50TGFzdEFjdGl2YXRpb25IUmVzdWx0DQoJ JG51bGwgPSBQcmludExhc3RBY3RpdmF0aW9uVGltZQ0KCSRudWxsID0gUHJpbnRJc1dpbmRvd3NHZW51aW5lDQoNCglpZiAoJERsbERpZ2l0YWwpIHsNCgkJ JG51bGwgPSBQcmludERpZ2l0YWxMaWNlbnNlU3RhdHVzDQoJfQ0KDQoJaWYgKCREbGxTdWJzY3JpcHRpb24pIHsNCgkJJG51bGwgPSBQcmludFN1YnNjcmlw dGlvblN0YXR1cw0KCX0NCg0KCUNPTk9VVCAiJGxpbmUzIg0KCSYgJG5vQWxsDQp9DQojZW5kcmVnaW9uDQoNCiNyZWdpb24gY2xjDQpmdW5jdGlvbiBjbGNH ZXRFeHBpcmVLcm4NCnsNCgkkdERhdGEgPSAwDQoJJGNEYXRhID0gMA0KCSRiRGF0YSA9IDANCg0KCSRoclJldCA9ICRXaW4zMjo6U0xHZXRXaW5kb3dzSW5m b3JtYXRpb24oDQoJCSJLZXJuZWwtRXhwaXJhdGlvbkRhdGUiLA0KCQlbcmVmXSR0RGF0YSwNCgkJW3JlZl0kY0RhdGEsDQoJCVtyZWZdJGJEYXRhDQoJKQ0K DQoJaWYgKCRoclJldCAtT3IgISRjRGF0YSAtT3IgJHREYXRhIC1ORSAzKQ0KCXsNCgkJcmV0dXJuICRudWxsDQoJfQ0KDQoJJHllYXIgPSAkTWFyc2hhbDo6 UmVhZEludDE2KCRiRGF0YSwgMCkNCglpZiAoJHllYXIgLUVRIDAgLU9yICR5ZWFyIC1FUSAxNjAxKQ0KCXsNCgkJJHJEYXRhID0gJG51bGwNCgl9DQoJZWxz ZQ0KCXsNCgkJJHJEYXRhID0gJ3swfS97MX0vezJ9OnszfTp7NH06ezV9JyAtZiAkeWVhciwgJE1hcnNoYWw6OlJlYWRJbnQxNigkYkRhdGEsIDIpLCAkTWFy c2hhbDo6UmVhZEludDE2KCRiRGF0YSwgNCksICRNYXJzaGFsOjpSZWFkSW50MTYoJGJEYXRhLCA2KSwgJE1hcnNoYWw6OlJlYWRJbnQxNigkYkRhdGEsIDgp LCAkTWFyc2hhbDo6UmVhZEludDE2KCRiRGF0YSwgMTApDQoJfQ0KDQoJIyRNYXJzaGFsOjpGcmVlSEdsb2JhbCgkYkRhdGEpDQoJcmV0dXJuICRyRGF0YQ0K fQ0KDQpmdW5jdGlvbiBjbGNHZXRFeHBpcmVTeXMNCnsNCgkka3VzZXIgPSAkTWFyc2hhbDo6UmVhZEludDY0KChOZXctT2JqZWN0IEludFB0cigweDdGRkUw MkM4KSkpDQoNCglpZiAoJGt1c2VyIC1FUSAwKQ0KCXsNCgkJcmV0dXJuICRudWxsDQoJfQ0KDQoJJHJEYXRhID0gW0RhdGVUaW1lXTo6RnJvbUZpbGVUaW1l VXRjKCRrdXNlcikuVG9TdHJpbmcoJ3l5eXkvTU0vZGQ6SEg6bW06c3MnKQ0KCXJldHVybiAkckRhdGENCn0NCg0KZnVuY3Rpb24gY2xjR2V0TGljZW5zaW5n U3RhdGUoJGR3U3RhdGUpDQp7DQoJaWYgKCRkd1N0YXRlIC1FUSA1KSB7DQoJCSRkd1N0YXRlID0gMw0KCX0gZWxzZWlmICgkZHdTdGF0ZSAtRVEgMyAtT3Ig JGR3U3RhdGUgLUVRIDQgLU9yICRkd1N0YXRlIC1FUSA2KSB7DQoJCSRkd1N0YXRlID0gMg0KCX0gZWxzZWlmICgkZHdTdGF0ZSAtR1QgNikgew0KCQkkZHdT dGF0ZSA9IDQNCgl9DQoNCgkkckRhdGEgPSAnezB9JyAtZiAkcHB3c3pMaWNlbnNpbmdTdGF0ZXNbJGR3U3RhdGVdDQoJcmV0dXJuICRyRGF0YQ0KfQ0KDQpm dW5jdGlvbiBjbGNHZXRHZW51aW5lU3RhdGUoJEFwcElkKQ0Kew0KCSRkd0dlbnVpbmUgPSAwDQoNCglpZiAoJE5UNykgew0KCQkkaHJSZXQgPSAkV2luMzI6 OlNMSXNXaW5kb3dzR2VudWluZUxvY2FsKFtyZWZdJGR3R2VudWluZSkNCgl9IGVsc2Ugew0KCQkkaHJSZXQgPSAkV2luMzI6OlNMSXNHZW51aW5lTG9jYWwo W3JlZl1bR3VpZF0kQXBwSWQsIFtyZWZdJGR3R2VudWluZSwgMCkNCgl9DQoNCglpZiAoJGhyUmV0KQ0KCXsNCgkJJGR3R2VudWluZSA9IDQNCgl9DQoNCglp ZiAoJGR3R2VudWluZSAtTFQgNSkgew0KCQkkckRhdGEgPSAnezB9JyAtZiAkcHB3c3pHZW51aW5lU3RhdGVzWyRkd0dlbnVpbmVdDQoJfSBlbHNlIHsNCgkJ JHJEYXRhID0gJGR3R2VudWluZQ0KCX0NCglyZXR1cm4gJHJEYXRhDQp9DQoNCmZ1bmN0aW9uIENsY1J1bg0Kew0KCSRwcnMgPSAkc2NyaXB0OnByaW1hcnlb MF0NCglpZiAoJG51bGwgLUVRICRwcnMpIHsNCgkJcmV0dXJuDQoJfQ0KDQoJJGxTdGF0ZSA9IGNsY0dldExpY2Vuc2luZ1N0YXRlICRwcnMubHN0DQoJJHVT dGF0ZSA9IGNsY0dldEdlbnVpbmVTdGF0ZSAkd2luQXBwDQoJJFRiYktybiA9IGNsY0dldEV4cGlyZUtybg0KCSRUYmJTeXMgPSBjbGNHZXRFeHBpcmVTeXMN CglpZiAoJG51bGwgLU5FICRUYmJLcm4pIHsNCgkJJGtlZCA9ICRUYmJLcm4NCgl9IGVsc2VpZiAoJG51bGwgLU5FICRUYmJTeXMpIHsNCgkJJGtlZCA9ICRU YmJTeXMNCgl9DQoNCgkmICRpc0FsbA0KCUNPTk9VVCAiQ2xpZW50IExpY2Vuc2luZyBDaGVjayBpbmZvcm1hdGlvbjoiDQoNCglDT05PVVQgKCIgICAgQXBw SWQ9ezB9IiAtZiAkd2luQXBwKQ0KCWlmICgkcHJzLmdlZCkgeyBDT05PVVQgKCIgICAgR3JhY2VFbmREYXRlPXswfSIgLWYgKFtEYXRlVGltZV06OlV0Y05v dy5BZGRNaW51dGVzKCRwcnMuZ2VkKS5Ub1N0cmluZygneXl5eS9NTS9kZDpISDptbTpzcycpKSkgfQ0KCWlmICgkbnVsbCAtTkUgJGtlZCkgeyBDT05PVVQg KCIgICAgS2VybmVsVGltZWJvbWJEYXRlPXswfSIgLWYgJGtlZCkgfQ0KCUNPTk9VVCAoIiAgICBMYXN0Q29uc3VtcHRpb25SZWFzb249MHh7MDp4OH0iIC1m ICRwcnMubGNyKQ0KCWlmICgkcHJzLmV2bCkgeyBDT05PVVQgKCIgICAgTGljZW5zZUV4cGlyYXRpb25EYXRlPXswfSIgLWYgKFtEYXRlVGltZV06OkZyb21G aWxlVGltZVV0YygkcHJzLmV2bCkuVG9TdHJpbmcoJ3l5eXkvTU0vZGQ6SEg6bW06c3MnKSkpIH0NCglDT05PVVQgKCIgICAgTGljZW5zZVN0YXRlPXswfSIg LWYgJGxTdGF0ZSkNCglDT05PVVQgKCIgICAgUGFydGlhbFByb2R1Y3RLZXk9ezB9IiAtZiAkcHJzLnBwaykNCglDT05PVVQgKCIgICAgUHJvZHVjdEtleVR5 cGU9ezB9IiAtZiAkcHJzLmNobikNCglDT05PVVQgKCIgICAgU2t1SWQ9ezB9IiAtZiAkcHJzLmFpZCkNCglDT05PVVQgKCIgICAgdXhEaWZmZXJlbnRpYXRv cj17MH0iIC1mICRwcnMuZGZmKQ0KCUNPTk9VVCAoIiAgICBJc1dpbmRvd3NHZW51aW5lPXswfSIgLWYgJHVTdGF0ZSkNCg0KCUNPTk9VVCAiJGxpbmUzIg0K CSYgJG5vQWxsDQp9DQojZW5kcmVnaW9uDQoNCiRIb3N0LlVJLlJhd1VJLldpbmRvd1RpdGxlID0gIkNoZWNrIEFjdGl2YXRpb24gU3RhdHVzIg0KaWYgKCRB bGwuSXNQcmVzZW50KSB7DQoJJEI9JEhvc3QuVUkuUmF3VUkuQnVmZmVyU2l6ZTskQi5IZWlnaHQ9MzAwMDskSG9zdC5VSS5SYXdVSS5CdWZmZXJTaXplPSRC Ow0KCWlmICghJFBhc3MuSXNQcmVzZW50KSB7Y2xlYXI7fQ0KfQ0KDQokU3lzUGF0aCA9ICIkZW52OlN5c3RlbVJvb3RcU3lzdGVtMzIiDQppZiAoVGVzdC1Q YXRoICIkZW52OlN5c3RlbVJvb3RcU3lzbmF0aXZlXHJlZy5leGUiKSB7DQoJJFN5c1BhdGggPSAiJGVudjpTeXN0ZW1Sb290XFN5c25hdGl2ZSINCn0NCg0K JHdzbHAgPSAiU29mdHdhcmVMaWNlbnNpbmdQcm9kdWN0Ig0KJHdzbHMgPSAiU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlIg0KJG9zbHAgPSAiT2ZmaWNlU29m dHdhcmVQcm90ZWN0aW9uUHJvZHVjdCINCiRvc2xzID0gIk9mZmljZVNvZnR3YXJlUHJvdGVjdGlvblNlcnZpY2UiDQokd2luQXBwID0gIjU1YzkyNzM0LWQ2 ODItNGQ3MS05ODNlLWQ2ZWMzZjE2MDU5ZiINCiRvMTRBcHAgPSAiNTlhNTI4ODEtYTk4OS00NzlkLWFmNDYtZjI3NWM2MzcwNjYzIg0KJG8xNUFwcCA9ICIw ZmYxY2UxNS1hOTg5LTQ3OWQtYWY0Ni1mMjc1YzYzNzA2NjMiDQokaXNTdWIgPSAoJHdpbmJ1aWxkIC1HRSAyNjAwMCkgLUFuZCAoU2VsZWN0LVN0cmluZyAt UGF0aCAiJFN5c1BhdGhcd2JlbVxzcHB3bWkubW9mIiAtRW5jb2RpbmcgdW5pY29kZSAtUGF0dGVybiAiU3Vic2NyaXB0aW9uVHlwZSIpDQokRGxsRGlnaXRh bCA9ICgkd2luYnVpbGQgLUdFIDE0MzkzKSAtQW5kIChUZXN0LVBhdGggIiRTeXNQYXRoXEVkaXRpb25VcGdyYWRlTWFuYWdlck9iai5kbGwiKQ0KJERsbFN1 YnNjcmlwdGlvbiA9ICgkd2luYnVpbGQgLUdFIDE0MzkzKSAtQW5kIChUZXN0LVBhdGggIiRTeXNQYXRoXENsaXBjLmRsbCIpDQokVkxBY3RUeXBlcyA9IEAo IkFsbCIsICJBRCIsICJLTVMiLCAiVG9rZW4iKQ0KJE9QS2V5UGF0aCA9ICJIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XE9mZmljZVNv ZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtIg0KJFNQS2V5UGF0aCA9ICJIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRc Q3VycmVudFZlcnNpb25cU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0iDQokU0xLZXlQYXRoID0gIkhLRVlfTE9DQUxfTUFDSElORVxTT0ZUV0FSRVxNaWNy b3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTTCINCiROU0tleVBhdGggPSAiSEtFWV9VU0VSU1xTLTEtNS0yMFxTT0ZUV0FSRVxNaWNyb3NvZnRc V2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTTCINCiRwcm9wUHJkID0gJ05hbWUnLCAnRGVzY3JpcHRpb24nLCAnVHJ1c3RlZFRpbWUnLCAnVkxBY3RpdmF0 aW9uVHlwZScNCiRwcm9wUGtleSA9ICdQYXJ0aWFsUHJvZHVjdEtleScsICdDaGFubmVsJywgJ0RpZ2l0YWxQSUQnLCAnRGlnaXRhbFBJRDInDQokcHJvcEtN U1NlcnZlciA9ICdLZXlNYW5hZ2VtZW50U2VydmljZUN1cnJlbnRDb3VudCcsICdLZXlNYW5hZ2VtZW50U2VydmljZVRvdGFsUmVxdWVzdHMnLCAnS2V5TWFu YWdlbWVudFNlcnZpY2VGYWlsZWRSZXF1ZXN0cycsICdLZXlNYW5hZ2VtZW50U2VydmljZVVubGljZW5zZWRSZXF1ZXN0cycsICdLZXlNYW5hZ2VtZW50U2Vy dmljZUxpY2Vuc2VkUmVxdWVzdHMnLCAnS2V5TWFuYWdlbWVudFNlcnZpY2VPT0JHcmFjZVJlcXVlc3RzJywgJ0tleU1hbmFnZW1lbnRTZXJ2aWNlT09UR3Jh Y2VSZXF1ZXN0cycsICdLZXlNYW5hZ2VtZW50U2VydmljZU5vbkdlbnVpbmVHcmFjZVJlcXVlc3RzJywgJ0tleU1hbmFnZW1lbnRTZXJ2aWNlTm90aWZpY2F0 aW9uUmVxdWVzdHMnDQokcHJvcEtNU0NsaWVudCA9ICdDdXN0b21lclBJRCcsICdLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUnLCAnS2V5TWFuYWdlbWVudFNl cnZpY2VQb3J0JywgJ0Rpc2NvdmVyZWRLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUnLCAnRGlzY292ZXJlZEtleU1hbmFnZW1lbnRTZXJ2aWNlUG9ydCcsICdE aXNjb3ZlcmVkS2V5TWFuYWdlbWVudFNlcnZpY2VJcEFkZHJlc3MnLCAnVkxBY3RpdmF0aW9uSW50ZXJ2YWwnLCAnVkxSZW5ld2FsSW50ZXJ2YWwnLCAnS2V5 TWFuYWdlbWVudFNlcnZpY2VMb29rdXBEb21haW4nDQokcHJvcEtNU1Zpc3RhICA9ICdDdXN0b21lclBJRCcsICdLZXlNYW5hZ2VtZW50U2VydmljZU5hbWUn LCAnVkxBY3RpdmF0aW9uSW50ZXJ2YWwnLCAnVkxSZW5ld2FsSW50ZXJ2YWwnDQokcHJvcEFEQkEgPSAnQURBY3RpdmF0aW9uT2JqZWN0TmFtZScsICdBREFj dGl2YXRpb25PYmplY3RETicsICdBREFjdGl2YXRpb25Dc3Zsa1BJRCcsICdBREFjdGl2YXRpb25Dc3Zsa1NrdUlEJw0KJHByb3BBVk1BID0gJ0luaGVyaXRl ZEFjdGl2YXRpb25JZCcsICdJbmhlcml0ZWRBY3RpdmF0aW9uSG9zdE1hY2hpbmVOYW1lJywgJ0luaGVyaXRlZEFjdGl2YXRpb25Ib3N0RGlnaXRhbFBpZDIn LCAnSW5oZXJpdGVkQWN0aXZhdGlvbkFjdGl2YXRpb25UaW1lJw0KJHByaW1hcnkgPSBAKCkNCiRwcHdzekdlbnVpbmVTdGF0ZXMgPSBAKA0KCSJTTF9HRU5f U1RBVEVfSVNfR0VOVUlORSIsDQoJIlNMX0dFTl9TVEFURV9JTlZBTElEX0xJQ0VOU0UiLA0KCSJTTF9HRU5fU1RBVEVfVEFNUEVSRUQiLA0KCSJTTF9HRU5f U1RBVEVfT0ZGTElORSIsDQoJIlNMX0dFTl9TVEFURV9MQVNUIg0KKQ0KJHBwd3N6TGljZW5zaW5nU3RhdGVzID0gQCgNCgkiU0xfTElDRU5TSU5HX1NUQVRV U19VTkxJQ0VOU0VEIiwNCgkiU0xfTElDRU5TSU5HX1NUQVRVU19MSUNFTlNFRCIsDQoJIlNMX0xJQ0VOU0lOR19TVEFUVVNfSU5fR1JBQ0VfUEVSSU9EIiwN CgkiU0xfTElDRU5TSU5HX1NUQVRVU19OT1RJRklDQVRJT04iLA0KCSJTTF9MSUNFTlNJTkdfU1RBVFVTX0xBU1QiDQopDQoNCidjVzFuZDB3cycsICdjMGZm MWNlMTUnLCAnYzBmZjFjZTE0JywgJ29zcHAxNCcsICdvc3BwMTUnIHwgZm9yZWFjaCB7c2V0ICRfIEAoKX0NCg0KJG9mZnN2YyA9ICJvc3Bwc3ZjIg0KaWYg KCROVDcgLU9yIC1Ob3QgJE5UNikgeyR3aW5zdmMgPSAic3Bwc3ZjIn0gZWxzZSB7JHdpbnN2YyA9ICJzbHN2YyJ9DQoNCnRyeSB7Z3N2ICR3aW5zdmMgLUVB IDEgfCBPdXQtTnVsbDsgJFdzcHBIb29rID0gMX0gY2F0Y2ggeyRXc3BwSG9vayA9IDB9DQp0cnkge2dzdiAkb2Zmc3ZjIC1FQSAxIHwgT3V0LU51bGw7ICRP c3BwSG9vayA9IDF9IGNhdGNoIHskT3NwcEhvb2sgPSAwfQ0KDQppZiAoVGVzdC1QYXRoICIkU3lzUGF0aFxzcHBjLmRsbCIpIHsNCgkkU0xkbGwgPSAnc3Bw Yy5kbGwnDQp9IGVsc2VpZiAoVGVzdC1QYXRoICIkU3lzUGF0aFxzbGMuZGxsIikgew0KCSRTTGRsbCA9ICdzbGMuZGxsJw0KfSBlbHNlIHsNCgkkV3NwcEhv b2sgPSAwDQp9DQoNCmlmICgkT3NwcEhvb2sgLU5FIDApIHsNCgkkT0xkbGwgPSAoc3RyR2V0UmVnaXN0cnkgJE9QS2V5UGF0aCAiUGF0aCIpICsgJ29zcHBj LmRsbCcNCglpZiAoIShUZXN0LVBhdGggIiRPTGRsbCIpKSB7JE9zcHBIb29rID0gMH0NCn0NCg0KaWYgKCRXc3BwSG9vayAtTkUgMCkgew0KCWlmICgkTlQ2 IC1BbmQgLU5vdCAkTlQ3IC1BbmQgLU5vdCAkQWRtaW4pIHsNCgkJaWYgKCRudWxsIC1FUSBbRGlhZ25vc3RpY3MuUHJvY2Vzc106OkdldFByb2Nlc3Nlc0J5 TmFtZSgiJHdpbnN2YyIpWzBdLlByb2Nlc3NOYW1lKSB7JFdzcHBIb29rID0gMDsgQ09OT1VUICJgbkVycm9yOiBmYWlsZWQgdG8gc3RhcnQgJHdpbnN2YyBT ZXJ2aWNlLmBuIn0NCgl9IGVsc2Ugew0KCQl0cnkge3Nhc3YgJHdpbnN2YyAtRUEgMX0gY2F0Y2ggeyRXc3BwSG9vayA9IDA7IENPTk9VVCAiYG5FcnJvcjog ZmFpbGVkIHRvIHN0YXJ0ICR3aW5zdmMgU2VydmljZS5gbiJ9DQoJfQ0KfQ0KDQppZiAoJFdzcHBIb29rIC1ORSAwKSB7DQoJLiBJbml0aWFsaXplUEludm9r ZSAkU0xkbGwgJGZhbHNlDQoJJGhTTEMgPSAwDQoJW3ZvaWRdJFdpbjMyOjpTTE9wZW4oW3JlZl0kaFNMQykNCg0KCSRjVzFuZDB3cyAgPSBTbEdldEluZm9T TElEICR3aW5BcHANCgkkYzBmZjFjZTE1ID0gU2xHZXRJbmZvU0xJRCAkbzE1QXBwDQoJJGMwZmYxY2UxNCA9IFNsR2V0SW5mb1NMSUQgJG8xNEFwcA0KfQ0K DQppZiAoJGNXMW5kMHdzLkNvdW50IC1HVCAwKQ0Kew0KCWVjaG9XaW5kb3dzDQoJUGFyc2VMaXN0ICR3c2xwICR3aW5BcHAgJGNXMW5kMHdzDQp9DQplbHNl aWYgKCROVDYpDQp7DQoJZWNob1dpbmRvd3MNCglDT05PVVQgIkVycm9yOiBwcm9kdWN0IGtleSBub3QgZm91bmQuYG4iDQp9DQoNCmlmICgkTlQ2IC1BbmQg LU5vdCAkTlQ4KSB7DQoJQ2xjUnVuDQp9DQoNCmlmICgkTlQ4KSB7DQoJQ2xpY1J1bg0KfQ0KDQokZG9NU0cgPSAxDQoNCmlmICgkYzBmZjFjZTE1LkNvdW50 IC1HVCAwKQ0Kew0KCUNoZWNrT2hvb2sNCgllY2hvT2ZmaWNlDQoJUGFyc2VMaXN0ICR3c2xwICRvMTVBcHAgJGMwZmYxY2UxNQ0KfQ0KDQppZiAoJGMwZmYx Y2UxNC5Db3VudCAtR1QgMCkNCnsNCgllY2hvT2ZmaWNlDQoJUGFyc2VMaXN0ICR3c2xwICRvMTRBcHAgJGMwZmYxY2UxNA0KfQ0KDQppZiAoJGhTTEMpIHsN Cglbdm9pZF0kV2luMzI6OlNMQ2xvc2UoJGhTTEMpDQp9DQoNCmlmICgkT3NwcEhvb2sgLU5FIDApIHsNCgl0cnkge3Nhc3YgJG9mZnN2YyAtRUEgMX0gY2F0 Y2ggeyRPc3BwSG9vayA9IDA7IENPTk9VVCAiYG5FcnJvcjogZmFpbGVkIHRvIHN0YXJ0ICRvZmZzdmMgU2VydmljZS5gbiJ9DQp9DQoNCmlmICgkT3NwcEhv b2sgLU5FIDApIHsNCgkuIEluaXRpYWxpemVQSW52b2tlICIkT0xkbGwiICR0cnVlDQoJJGhTTEMgPSAwDQoJW3ZvaWRdJFdpbjMyOjpTTE9wZW4oW3JlZl0k aFNMQykNCg0KCSRvc3BwMTUgPSBTbEdldEluZm9TTElEICRvMTVBcHANCgkkb3NwcDE0ID0gU2xHZXRJbmZvU0xJRCAkbzE0QXBwDQp9DQoNCmlmICgkb3Nw cDE1LkNvdW50IC1HVCAwKQ0Kew0KCWVjaG9PZmZpY2UNCglQYXJzZUxpc3QgJG9zbHAgJG8xNUFwcCAkb3NwcDE1DQp9DQoNCmlmICgkb3NwcDE0LkNvdW50 IC1HVCAwKQ0Kew0KCWVjaG9PZmZpY2UNCglQYXJzZUxpc3QgJG9zbHAgJG8xNEFwcCAkb3NwcDE0DQp9DQoNCmlmICgkaFNMQykgew0KCVt2b2lkXSRXaW4z Mjo6U0xDbG9zZSgkaFNMQykNCn0NCg0KaWYgKCROVDcpIHsNCgl2TmV4dERpYWdSdW4NCn0NCg0KRXhpdFNjcmlwdCAwDQo6c3BwbWdyOg0KDQo6KysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCg0KOnRyb3VibGVzaG9vdA0KDQpzZXQgImxpbmU9X19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyINCg0KOmF0X21l bnUNCg0KY2xzDQp0aXRsZSAgVHJvdWJsZXNob290ICVtYXN2ZXIlDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDc3LCAzMA0KDQplY2hvOg0KZWNo bzoNCmVjaG86DQplY2hvOg0KZWNobzogICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fDQplY2hvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KY2FsbCA6ZGtfY29sb3IyICVfV2hpdGUlICIg ICAgICAgICAgICAgWzFdICIgJV9HcmVlbiUgIkhlbHAiDQplY2hvOiAgICAgICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18NCmVjaG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IA0KZWNobzogICAgICAgICAgICAgWzJdIERpc20gUmVzdG9yZUhlYWx0aA0KZWNobzogICAgICAgICAgICAgWzNdIFNGQyBTY2Fubm93DQplY2hvOiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmVjaG86ICAgICAgICAgICAgIFs0XSBG aXggV01JDQplY2hvOiAgICAgICAgICAgICBbNV0gRml4IExpY2Vuc2luZw0KZWNobzogICAgICAgICAgICAgWzZdIEZpeCBXUEEgUmVnaXN0cnkNCmVjaG86 ICAgICAgICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNobzoNCmVjaG86ICAgICAgICAgICAg IFswXSAlX2V4aXRtc2clDQplY2hvOiAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18NCmVjaG86ICAgICAgICAgIA0KY2FsbCA6ZGtfY29sb3IyICVfV2hpdGUlICIgICAgICAgICAgICAiICVfR3JlZW4lICJDaG9vc2UgYSBtZW51IG9wdGlv biB1c2luZyB5b3VyIGtleWJvYXJkIDoiDQpjaG9pY2UgL0M6MTIzNDU2MCAvTg0Kc2V0IF9lcmw9JWVycm9ybGV2ZWwlDQoNCmlmICVfZXJsJT09NyBleGl0 IC9iDQppZiAlX2VybCU9PTYgc3RhcnQgJW1hcyVmaXgtd3BhLXJlZ2lzdHJ5ICZnb3RvIGF0X21lbnUNCmlmICVfZXJsJT09NSBnb3RvOnJldG9rZW5zDQpp ZiAlX2VybCU9PTQgZ290bzpmaXh3bWkNCmlmICVfZXJsJT09MyBnb3RvOnNmY3NjYW4NCmlmICVfZXJsJT09MiBnb3RvOmRpc21fcmVzdA0KaWYgJV9lcmwl PT0xIChzdGFydCAlc2VsZmdpdCUgJiBzdGFydCAlZ2l0aHViJSAmIHN0YXJ0ICVtYXMldHJvdWJsZXNob290ICYgZ290byBhdF9tZW51KQ0KZ290byA6YXRf bWVudQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOmRpc21fcmVzdA0KDQpjbHMNCmlmIG5vdCBkZWZp bmVkIHRlcm1pbmFsIG1vZGUgOTgsIDMwDQp0aXRsZSAgRGlzbSAvRW5nbGlzaCAvT25saW5lIC9DbGVhbnVwLUltYWdlIC9SZXN0b3JlSGVhbHRoDQoNCmlm ICV3aW5idWlsZCUgTFNTIDkyMDAgKA0KJWVsaW5lJQ0KZWNobyBVbnN1cHBvcnRlZCBPUyB2ZXJzaW9uIGRldGVjdGVkLg0KZWNobyBUaGlzIGNvbW1hbmQg b25seSB3b3JrcyBvbiBXaW5kb3dzIDgvOC4xLzEwLzExIGFuZCB0aGVpciBTZXJ2ZXIgZXF1aXZhbGVudHMuDQpnb3RvIDphdF9iYWNrDQopDQoNCnNldCBf aW50PQ0KZm9yICUlYSBpbiAobC5yb290LXNlcnZlcnMubmV0IHJlc29sdmVyMS5vcGVuZG5zLmNvbSBkb3dubG9hZC53aW5kb3dzdXBkYXRlLmNvbSBnb29n bGUuY29tKSBkbyBpZiBub3QgZGVmaW5lZCBfaW50ICgNCmZvciAvZiAiZGVsaW1zPVtdIHRva2Vucz0yIiAlJSMgaW4gKCdwaW5nIC1uIDEgJSVhJykgZG8g KGlmIG5vdCAiJSUjIj09IiIgc2V0IF9pbnQ9MSkNCikNCg0KZWNobzoNCmlmIGRlZmluZWQgX2ludCAoDQplY2hvICAgICAgQ2hlY2tpbmcgSW50ZXJuZXQg Q29ubmVjdGlvbiAgW0Nvbm5lY3RlZF0NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvcjIgJV9XaGl0ZSUgIiAgICAgIiAlUmVkJSAiQ2hlY2tpbmcgSW50ZXJu ZXQgQ29ubmVjdGlvbiAgW05vdCBjb25uZWN0ZWRdIg0KKQ0KDQplY2hvICVsaW5lJQ0KZWNobzoNCmVjaG8gICAgICBESVNNIHVzZXMgV2luZG93cyBVcGRh dGUgdG8gcHJvdmlkZSByZXBsYWNlbWVudCBmaWxlcyByZXF1aXJlZCB0byBmaXggY29ycnVwdGlvbi4NCmVjaG8gICAgICBUaGlzIHdpbGwgdGFrZSA1LTE1 IG1pbnV0ZXMgb3IgbW9yZS4uDQplY2hvICVsaW5lJQ0KZWNobzoNCmVjaG8gICAgICBOb3RlczoNCmVjaG86DQpjYWxsIDpka19jb2xvcjIgJV9XaGl0ZSUg IiAgICAgLSAiICVHcmF5JSAiTWFrZSBzdXJlIHRoZSBpbnRlcm5ldCBpcyBjb25uZWN0ZWQuIg0KY2FsbCA6ZGtfY29sb3IyICVfV2hpdGUlICIgICAgIC0g IiAlR3JheSUgIk1ha2Ugc3VyZSB0aGF0IFdpbmRvd3MgdXBkYXRlIGlzIHByb3Blcmx5IHdvcmtpbmcuIg0KZWNobzoNCmVjaG8gJWxpbmUlDQplY2hvOg0K Y2hvaWNlIC9DOjA5IC9OIC9NICI+ICAgIFs5XSBDb250aW51ZSBbMF0gR28gYmFjayA6ICINCmlmICVlcnJvcmxldmVsJT09MSBnb3RvIGF0X21lbnUNCg0K Y2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDExMCwgMzANCg0KZm9yIC9mICUlYSBpbiAoJyVwc2MlICIoR2V0LURhdGUpLlRvU3RyaW5nKCd5 eXl5TU1kZC1ISG1tc3NmZmYnKSInKSBkbyBzZXQgX3RpbWU9JSVhDQoNCiVwc2MlIFN0b3AtU2VydmljZSBUcnVzdGVkSW5zdGFsbGVyIC1mb3JjZSAlbnVs JQ0KDQpjb3B5IC95IC9iICIlU3lzdGVtUm9vdCVcbG9nc1xjYnNcY2JzLmxvZyIgIiVTeXN0ZW1Sb290JVxsb2dzXGNic1xiYWNrdXBfY2JzXyVfdGltZSUu bG9nIiAlbnVsJQ0KY29weSAveSAvYiAiJVN5c3RlbVJvb3QlXGxvZ3NcRElTTVxkaXNtLmxvZyIgIiVTeXN0ZW1Sb290JVxsb2dzXERJU01cYmFja3VwX2Rp c21fJV90aW1lJS5sb2ciICVudWwlDQpkZWwgL2YgL3EgIiVTeXN0ZW1Sb290JVxsb2dzXGNic1xjYnMubG9nIiAlbnVsJQ0KZGVsIC9mIC9xICIlU3lzdGVt Um9vdCVcbG9nc1xESVNNXGRpc20ubG9nIiAlbnVsJQ0KDQplY2hvOg0KZWNobyBBcHBseWluZyB0aGUgY29tbWFuZC4uLg0KZWNobyBkaXNtIC9lbmdsaXNo IC9vbmxpbmUgL2NsZWFudXAtaW1hZ2UgL3Jlc3RvcmVoZWFsdGgNCmRpc20gL2VuZ2xpc2ggL29ubGluZSAvY2xlYW51cC1pbWFnZSAvcmVzdG9yZWhlYWx0 aA0KDQp0aW1lb3V0IC90IDUgJW51bDElDQpjb3B5IC95IC9iICIlU3lzdGVtUm9vdCVcbG9nc1xjYnNcY2JzLmxvZyIgIiVTeXN0ZW1Sb290JVxsb2dzXGNi c1xjYnNfJV90aW1lJS5sb2ciICVudWwlDQpjb3B5IC95IC9iICIlU3lzdGVtUm9vdCVcbG9nc1xESVNNXGRpc20ubG9nIiAiJVN5c3RlbVJvb3QlXGxvZ3Nc RElTTVxkaXNtXyVfdGltZSUubG9nIiAlbnVsJQ0KDQppZiBub3QgZXhpc3QgIiFkZXNrdG9wIVxBVF9Mb2dzXCIgbWQgIiFkZXNrdG9wIVxBVF9Mb2dzXCIg JW51bCUNCmNhbGwgOmNvbXByZXNzbG9nIGNic1xjYnNfJV90aW1lJS5sb2cgQVRfTG9nc1xSSGVhbHRoX0NCUyAlbnVsJQ0KY2FsbCA6Y29tcHJlc3Nsb2cg RElTTVxkaXNtXyVfdGltZSUubG9nIEFUX0xvZ3NcUkhlYWx0aF9ESVNNICVudWwlDQoNCmlmIG5vdCBleGlzdCAiIWRlc2t0b3AhXEFUX0xvZ3NcUkhlYWx0 aF9DQlNfJV90aW1lJS5jYWIiICgNCmNvcHkgL3kgL2IgIiVTeXN0ZW1Sb290JVxsb2dzXGNic1xjYnMubG9nIiAiIWRlc2t0b3AhXEFUX0xvZ3NcUkhlYWx0 aF9DQlNfJV90aW1lJS5sb2ciICVudWwlDQopDQoNCmlmIG5vdCBleGlzdCAiIWRlc2t0b3AhXEFUX0xvZ3NcUkhlYWx0aF9ESVNNXyVfdGltZSUuY2FiIiAo DQpjb3B5IC95IC9iICIlU3lzdGVtUm9vdCVcbG9nc1xESVNNXGRpc20ubG9nIiAiIWRlc2t0b3AhXEFUX0xvZ3NcUkhlYWx0aF9ESVNNXyVfdGltZSUubG9n IiAlbnVsJQ0KKQ0KDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJDQlMgYW5kIERJU00gbG9ncyBhcmUgY29waWVkIHRvIHRoZSBBVF9Mb2dzIGZv bGRlciBvbiB5b3VyIGRlc2t0b3AuIg0KZ290byA6YXRfYmFjaw0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Cg0KOnNmY3NjYW4NCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDk4LCAzMA0KdGl0bGUgIHNmYyAvc2Nhbm5vdw0KDQplY2hvOg0KZWNo byAlbGluZSUNCmVjaG86ICAgIA0KZWNobyAgICAgIFNGQyB3aWxsIHJlcGFpciBtaXNzaW5nIG9yIGNvcnJ1cHRlZCBzeXN0ZW0gZmlsZXMuDQplY2hvICAg ICAgSXQgaXMgcmVjb21tZW5kZWQgeW91IHJ1biB0aGUgRElTTSBvcHRpb24gZmlyc3QgYmVmb3JlIHRoaXMgb25lLg0KZWNobyAgICAgIFRoaXMgd2lsbCB0 YWtlIDEwLTE1IG1pbnV0ZXMgb3IgbW9yZS4uDQplY2hvOg0KZWNobyAgICAgIElmIFNGQyBjb3VsZCBub3QgZml4IHNvbWV0aGluZywgdGhlbiBydW4gdGhl IGNvbW1hbmQgYWdhaW4gdG8gc2VlIGlmIGl0IG1heSBiZSBhYmxlIA0KZWNobyAgICAgIHRvIHRoZSBuZXh0IHRpbWUuIFNvbWV0aW1lcyBpdCBtYXkgdGFr ZSBydW5uaW5nIHRoZSBzZmMgL3NjYW5ub3cgY29tbWFuZCAzIHRpbWVzDQplY2hvICAgICAgcmVzdGFydGluZyB0aGUgUEMgYWZ0ZXIgZWFjaCB0aW1lIHRv IGNvbXBsZXRlbHkgZml4IGV2ZXJ5dGhpbmcgdGhhdCBpdCdzIGFibGUgdG8uDQplY2hvOiAgIA0KZWNobyAlbGluZSUNCmVjaG86DQpjaG9pY2UgL0M6MDkg L04gL00gIj4gICAgWzldIENvbnRpbnVlIFswXSBHbyBiYWNrIDogIg0KaWYgJWVycm9ybGV2ZWwlPT0xIGdvdG8gYXRfbWVudQ0KDQpjbHMNCmZvciAvZiAl JWEgaW4gKCclcHNjJSAiKEdldC1EYXRlKS5Ub1N0cmluZygneXl5eU1NZGQtSEhtbXNzZmZmJykiJykgZG8gc2V0IF90aW1lPSUlYQ0KDQolcHNjJSBTdG9w LVNlcnZpY2UgVHJ1c3RlZEluc3RhbGxlciAtZm9yY2UgJW51bCUNCg0KY29weSAveSAvYiAiJVN5c3RlbVJvb3QlXGxvZ3NcY2JzXGNicy5sb2ciICIlU3lz dGVtUm9vdCVcbG9nc1xjYnNcYmFja3VwX2Nic18lX3RpbWUlLmxvZyIgJW51bCUNCmRlbCAvZiAvcSAiJVN5c3RlbVJvb3QlXGxvZ3NcY2JzXGNicy5sb2ci ICVudWwlDQoNCmVjaG86DQplY2hvIEFwcGx5aW5nIHRoZSBjb21tYW5kLi4uDQplY2hvIHNmYyAvc2Nhbm5vdw0Kc2ZjIC9zY2Fubm93DQoNCnRpbWVvdXQg L3QgNSAlbnVsMSUNCmNvcHkgL3kgL2IgIiVTeXN0ZW1Sb290JVxsb2dzXGNic1xjYnMubG9nIiAiJVN5c3RlbVJvb3QlXGxvZ3NcY2JzXGNic18lX3RpbWUl LmxvZyIgJW51bCUNCg0KaWYgbm90IGV4aXN0ICIhZGVza3RvcCFcQVRfTG9nc1wiIG1kICIhZGVza3RvcCFcQVRfTG9nc1wiICVudWwlDQpjYWxsIDpjb21w cmVzc2xvZyBjYnNcY2JzXyVfdGltZSUubG9nIEFUX0xvZ3NcU0ZDX0NCUyAlbnVsJQ0KDQppZiBub3QgZXhpc3QgIiFkZXNrdG9wIVxBVF9Mb2dzXFNGQ19D QlNfJV90aW1lJS5jYWIiICgNCmNvcHkgL3kgL2IgIiVTeXN0ZW1Sb290JVxsb2dzXGNic1xjYnMubG9nIiAiIWRlc2t0b3AhXEFUX0xvZ3NcU0ZDX0NCU18l X3RpbWUlLmxvZyIgJW51bCUNCikNCg0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiVGhlIENCUyBsb2cgd2FzIGNvcGllZCB0byB0aGUgQVRfTG9n cyBmb2xkZXIgb24geW91ciBEZXNrdG9wLiINCmdvdG8gOmF0X2JhY2sNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09DQoNCjpyZXRva2Vucw0KDQpjbHMNCmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsICgNCm1vZGUgMTI1LCAzMg0KJXBzYyUgIiZ7JFc9JEhvc3QuVUkuUmF3 VUkuV2luZG93U2l6ZTskQj0kSG9zdC5VSS5SYXdVSS5CdWZmZXJTaXplOyRXLkhlaWdodD0zMTskQi5IZWlnaHQ9MjAwOyRIb3N0LlVJLlJhd1VJLldpbmRv d1NpemU9JFc7JEhvc3QuVUkuUmF3VUkuQnVmZmVyU2l6ZT0kQjt9IiAlbnVsJQ0KKQ0KdGl0bGUgIEZpeCBMaWNlbnNpbmcgXihDbGlwU1ZDIF4rIFNQUCBe KyBPU1BQXikNCg0KaWYgJXdpbmJ1aWxkJSBFUVUgNjAwMSAoDQolZWxpbmUlDQplY2hvIFRoaXMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93 cyBWaXN0YSBTUDEuDQplY2hvIFVwZ3JhZGUgdG8gV2luZG93cyBWaXN0YSBTUDIuDQpnb3RvIDphdF9iYWNrDQopDQoNCmVjaG86DQplY2hvICVsaW5lJQ0K ZWNobzogICANCmVjaG8gICAgICBOb3RlczoNCmVjaG86DQplY2hvICAgICAgIC0gVGhpcyBvcHRpb24gaGVscHMgaW4gdHJvdWJsZXNob290aW5nIGFjdGl2 YXRpb24gaXNzdWVzLg0KZWNobzoNCmVjaG8gICAgICAgLSBUaGlzIG9wdGlvbiB3aWxsOg0KZWNobyAgICAgICAgICAgIC0gRGVhY3RpdmF0ZSBXaW5kb3dz IGFuZCBPZmZpY2UsIHlvdSBtYXkgbmVlZCB0byByZWFjdGl2YXRlLg0KZWNobyAgICAgICAgICAgICAgSWYgV2luZG93cyBpcyBhY3RpdmF0ZWQgd2l0aCBt b3RoZXJib2FyZCAvIE9FTSAvIERpZ2l0YWwgbGljZW5zZQ0KZWNobyAgICAgICAgICAgICAgdGhlbiBXaW5kb3dzIHdpbGwgYWN0aXZhdGUgaXRzZWxmIGFn YWluLg0KZWNobzoNCmVjaG8gICAgICAgICAgICAtIENsZWFyIENsaXBTVkMsIFNQUCBhbmQgT1NQUCBsaWNlbnNlcy4NCmVjaG8gICAgICAgICAgICAtIEZp eCBwZXJtaXNzaW9ucyBvZiBTUFAgdG9rZW5zIGZvbGRlciBhbmQgcmVnaXN0cmllcy4NCmVjaG8gICAgICAgICAgICAtIFRyaWdnZXIgdGhlIHJlcGFpciBv cHRpb24gZm9yIE9mZmljZS4NCmVjaG86DQpjYWxsIDpka19jb2xvcjIgJV9XaGl0ZSUgIiAgICAgIC0gIiAlQmx1ZSUgIkFwcGx5IHRoaXMgb3B0aW9uIG9u bHkgd2hlbiBpdCBpcyBuZWNlc3NhcnkuIg0KZWNobzoNCmVjaG8gJWxpbmUlDQplY2hvOg0KY2hvaWNlIC9DOjA5IC9OIC9NICI+ICAgIFs5XSBDb250aW51 ZSBbMF0gR28gYmFjayA6ICINCmlmICVlcnJvcmxldmVsJT09MSBnb3RvIGF0X21lbnUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09DQoNCjo6ICBSZWJ1aWxkIENsaXBTVkMgTGljZW5jZXMNCg0KY2xzDQo6Y2xlYW5saWNlbnNpbmcNCg0KZWNobzoNCmVjaG8gJWxpbmUl DQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJSZWJ1aWxkaW5nIENsaXBTVkMgTGljZW5zZXMuLi4iDQplY2hvOg0KDQppZiAld2luYnVpbGQlIExT UyAxMDI0MCAoDQplY2hvIENsaXBTVkMgbGljZW5zZSByZWJ1aWxkaW5nIGlzIHN1cHBvcnRlZCBvbmx5IG9uIFdpbmRvd3MgMTAvMTEuDQplY2hvIFNraXBw aW5nLi4uDQpnb3RvIDpyZWJ1aWxkc3BwdG9rDQopDQoNCiVwc2MlICIoKFtXTUlTRUFSQ0hFUl0nU0VMRUNUIE5hbWUgRlJPTSBTb2Z0d2FyZUxpY2Vuc2lu Z1Byb2R1Y3QgV0hFUkUgTGljZW5zZVN0YXR1cz0xIEFORCBHcmFjZVBlcmlvZFJlbWFpbmluZz0wIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVM TCBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBOVUxMJykuR2V0KCkpLk5hbWUiICVudWwyJSB8IGZpbmRzdHIgL2kgIldpbmRvd3MiICVudWwxJSAmJiAoDQpl Y2hvIFdpbmRvd3MgaXMgcGVybWFuZW50bHkgYWN0aXZhdGVkLg0KZWNobyBTa2lwcGluZy4uLg0KZ290byA6cmVidWlsZHNwcHRvaw0KKQ0KDQpzZXQgX3Bh cnRpYWw9DQpzZXQgX2tleW1hdGNoPQ0KZm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSUjIGluICgnJXBzYyUgIigoW1dNSVNFQVJDSEVSXSdTRUxFQ1Qg UGFydGlhbFByb2R1Y3RLZXkgRlJPTSBTb2Z0d2FyZUxpY2Vuc2luZ1Byb2R1Y3QgV0hFUkUgQXBwbGljYXRpb25JRD0nJzU1YzkyNzM0LWQ2ODItNGQ3MS05 ODNlLWQ2ZWMzZjE2MDU5ZicnIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVMTCBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBOVUxMJykuR2V0KCkp LlBhcnRpYWxQcm9kdWN0S2V5IHwgJSUge2VjaG8gKCdQYXJ0aWFsUHJvZHVjdEtleT0nKyRfKX0iICVudWw2JScpIGRvIHNldCAiX3BhcnRpYWw9JSUjIg0K Zm9yICUlIyBpbiAoOEhWMkMgUVBGQ1QgM1Y2NlQgUEtDS1QgV1hDSFcgOFRZTUQgNkY0QlQgOEhWWDcgS0Q3MlkgN0NGQlkgRFJSOEggUDM5UEIgRFlKV1gg TURXV1cgOUhLUjQgTTdWMlggMllWNzcgV1QyUlEgTUhCUEIgUVBGOFAgMllWNjYgVk1KMkMgREo0RjYgQ0tGRkQgWVk3NEggSjhKWEQgQkhEQ0QgVDZSNFcg RDMyTUggUlJLNjkgM1BKQlApIGRvIGlmIC9pICIlX3BhcnRpYWwlIj09IiUlIyIgc2V0IF9rZXltYXRjaD0xDQoNCmlmIG5vdCBkZWZpbmVkIF9rZXltYXRj aCAoDQplY2hvIEhXSUQgYWN0aXZhdGlvbiBrZXkgaXMgbm90IGluc3RhbGxlZC4NCmVjaG8gU2tpcHBpbmcuLi4NCmdvdG8gOnJlYnVpbGRzcHB0b2sNCikN Cg0KJXBzYyUgIklmKFtBY3RpdmF0b3JdOjpDcmVhdGVJbnN0YW5jZShbVHlwZV06OkdldFR5cGVGcm9tQ0xTSUQoW0d1aWRdJ3tEQ0IwMEMwMS01NzBGLTRB OUItOEQ2OS0xOTlGREJBNTcyM0J9JykpLklzQ29ubmVjdGVkVG9JbnRlcm5ldCl7RXhpdCAwfUVsc2V7RXhpdCAxfSINCmlmIGVycm9ybGV2ZWwgMSAoDQpl Y2hvIEludGVybmV0IGlzIG5vdCBjb25uZWN0ZWQuDQplY2hvIFNraXBwaW5nLi4uDQpnb3RvIDpyZWJ1aWxkc3BwdG9rDQopDQoNCnNldCByZXNmYWlsPQ0K Zm9yICUlIyBpbiAoDQpsaWNlbnNpbmcubXAubWljcm9zb2Z0LmNvbS92Ny4wL2xpY2Vuc2VzL2NvbnRlbnQNCmxvZ2luLmxpdmUuY29tL3Bwc2VjdXJlL2Rl dmljZWFkZGNyZWRlbnRpYWwuc3JmDQpwdXJjaGFzZS5tcC5taWNyb3NvZnQuY29tL3Y3LjAvdXNlcnMvbWUvb3JkZXJzDQopIGRvIGlmIG5vdCBkZWZpbmVk IHJlc2ZhaWwgKA0KJXBzYyUgInRyeSB7IFtOZXQuU2VydmljZVBvaW50TWFuYWdlcl06OlNlY3VyaXR5UHJvdG9jb2w9W05ldC5TZWN1cml0eVByb3RvY29s VHlwZV06OlRsczEyOyBpcm0gaHR0cHM6Ly8lJSMgLU1ldGhvZCBQT1NUIH0gY2F0Y2ggeyBpZiAoJF8uRXhjZXB0aW9uLlJlc3BvbnNlIC1lcSAkbnVsbCkg eyBXcml0ZS1Ib3N0ICIiIiJbJSUjXSAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIiIiIgLUZvcmVncm91bmRDb2xvciBSZWQgLUJhY2tncm91bmRDb2xvciBC bGFjazsgZXhpdCAzIH0gfSINCmlmICFlcnJvcmxldmVsIT09MyBzZXQgcmVzZmFpbD0xDQopDQoNCmlmIGRlZmluZWQgcmVzZmFpbCAoDQplY2hvIEZhaWxl ZCB0byBjb25uZWN0IHRvIGxpY2Vuc2luZyBzZXJ2ZXJzLg0KZWNobyBTa2lwcGluZy4uLg0KZ290byA6cmVidWlsZHNwcHRvaw0KKQ0KDQplY2hvIFN0b3Bw aW5nIENsaXBTVkMgc2VydmljZS4uLg0KJXBzYyUgU3RvcC1TZXJ2aWNlIENsaXBTVkMgLWZvcmNlICVudWwlDQp0aW1lb3V0IC90IDIgJW51bCUNCg0KZWNo bzoNCmVjaG8gQXBwbHlpbmcgdGhlIGNvbW1hbmQgdG8gY2xlYW4gQ2xpcFNWQyBMaWNlbnNlcy4uLg0KZWNobyBydW5kbGwzMiBjbGlwYy5kbGwsQ2xpcENs ZWFuVXBTdGF0ZQ0KDQpydW5kbGwzMiBjbGlwYy5kbGwsQ2xpcENsZWFuVXBTdGF0ZQ0KDQppZiAld2luYnVpbGQlIExFUSAxMDI0MCAoDQplY2hvIFtTdWNj ZXNzZnVsXQ0KKSBlbHNlICgNCmlmIGV4aXN0ICIlUHJvZ3JhbURhdGElXE1pY3Jvc29mdFxXaW5kb3dzXENsaXBTVkNcdG9rZW5zLmRhdCIgKA0KY2FsbCA6 ZGtfY29sb3IgJVJlZCUgIltGYWlsZWRdIg0KKSBlbHNlICgNCmVjaG8gW1N1Y2Nlc3NmdWxdDQopDQopDQoNCjo6ICBCZWxvdyByZWdpc3RyeSBrZXkgKFZv bGF0aWxlICYgUHJvdGVjdGVkKSBnZXRzIGNyZWF0ZWQgYWZ0ZXIgdGhlIENsaXBTVkMgTGljZW5zZSBjbGVhbnVwIGNvbW1hbmQsIGFuZCBnZXRzIGF1dG9t YXRpY2FsbHkgZGVsZXRlZCBhZnRlciANCjo6ICBzeXN0ZW0gcmVzdGFydC4gSXQgbmVlZHMgdG8gYmUgZGVsZXRlZCB0byBhY3RpdmF0ZSB0aGUgc3lzdGVt IHdpdGhvdXQgcmVzdGFydC4NCg0Kc2V0ICJSZWdLZXk9SEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxDbGlwU1ZD XFZvbGF0aWxlXFBlcnNpc3RlZFN5c3RlbVN0YXRlIg0Kc2V0ICJfaWRlbnQ9SEtVXFMtMS01LTE5XFNPRlRXQVJFXE1pY3Jvc29mdFxJZGVudGl0eUNSTCIN Cg0KcmVnIHF1ZXJ5ICIlUmVnS2V5JSIgJW51bCUgJiYgJW51bCUgY2FsbCA6cmVnb3duc3RhcnQNCnJlZyBkZWxldGUgIiVSZWdLZXklIiAvZiAlbnVsJSAN Cg0KZWNobzoNCmVjaG8gRGVsZXRpbmcgYSBWb2xhdGlsZSBeJiBQcm90ZWN0ZWQgUmVnaXN0cnkgS2V5Li4uDQplY2hvIFslUmVnS2V5JV0NCnJlZyBxdWVy eSAiJVJlZ0tleSUiICVudWwlICYmICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJbRmFpbGVkXSINCmVjaG8gUmVib290IHlvdXIgbWFjaGluZSB1c2luZyB0 aGUgcmVzdGFydCBvcHRpb24sIHRoYXQgd2lsbCBkZWxldGUgdGhpcyByZWdpc3RyeSBrZXkgYXV0b21hdGljYWxseS4NCikgfHwgKA0KZWNobyBbU3VjY2Vz c2Z1bF0NCikNCg0KOjogICBDbGVhciBIV0lEIHRva2VuIHJlbGF0ZWQgcmVnaXN0cnkgdG8gZml4IGFjdGl2YXRpb24gaW5jYXNlIHRoZXJlIGlzIGFueSBj b3JydXB0aW9uDQoNCmVjaG86DQplY2hvIERlbGV0aW5nIElkZW50aXR5Q1JMIFJlZ2lzdHJ5IEtleS4uLg0KZWNobyBbJV9pZGVudCVdDQpyZWcgZGVsZXRl ICIlX2lkZW50JSIgL2YgJW51bCUNCnJlZyBxdWVyeSAiJV9pZGVudCUiICVudWwlICYmICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJbRmFpbGVkXSINCikg fHwgKA0KZWNobyBbU3VjY2Vzc2Z1bF0NCikNCg0KJXBzYyUgU3RvcC1TZXJ2aWNlIENsaXBTVkMgLWZvcmNlICVudWwlDQoNCjo6ICBSZWJ1aWxkIENsaXBT VkMgZm9sZGVyIHRvIGZpeCBwZXJtaXNzaW9uIGlzc3Vlcw0KDQplY2hvOg0KaWYgJXdpbmJ1aWxkJSBHVFIgMTAyNDAgKA0KZWNobyBEZWxldGluZyBmb2xk ZXIgJVByb2dyYW1EYXRhJVxNaWNyb3NvZnRcV2luZG93c1xDbGlwU1ZDXA0Kcm1kaXIgL3MgL3EgIkM6XFByb2dyYW1EYXRhXE1pY3Jvc29mdFxXaW5kb3dz XENsaXBTdmMiICVudWwlDQoNCmlmIGV4aXN0ICIlUHJvZ3JhbURhdGElXE1pY3Jvc29mdFxXaW5kb3dzXENsaXBTVkNcIiAoDQpjYWxsIDpka19jb2xvciAl UmVkJSAiW0ZhaWxlZF0iDQopIGVsc2UgKA0KZWNobyBbU3VjY2Vzc2Z1bF0NCikNCg0KZWNobzoNCmVjaG8gUmVidWlsZGluZyB0aGUgJVByb2dyYW1EYXRh JVxNaWNyb3NvZnRcV2luZG93c1xDbGlwU1ZDXCBmb2xkZXIuLi4NCiVwc2MlIFN0YXJ0LVNlcnZpY2UgQ2xpcFNWQyAlbnVsJQ0KdGltZW91dCAvdCAzICVu dWwlDQppZiBub3QgZXhpc3QgIiVQcm9ncmFtRGF0YSVcTWljcm9zb2Z0XFdpbmRvd3NcQ2xpcFNWQ1wiIHRpbWVvdXQgL3QgNSAlbnVsJQ0KaWYgbm90IGV4 aXN0ICIlUHJvZ3JhbURhdGElXE1pY3Jvc29mdFxXaW5kb3dzXENsaXBTVkNcIiAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiW0ZhaWxlZF0iDQopIGVsc2Ug KA0KZWNobyBbU3VjY2Vzc2Z1bF0NCikNCikNCg0KZWNobzoNCmVjaG8gUmVzdGFydGluZyB3bGlkc3ZjIF4mIExpY2Vuc2VNYW5hZ2VyIHNlcnZpY2VzLi4u DQpmb3IgJSUjIGluICh3bGlkc3ZjIExpY2Vuc2VNYW5hZ2VyKSBkbyAoJXBzYyUgIlN0YXJ0LUpvYiB7IFJlc3RhcnQtU2VydmljZSAlJSMgfSB8IFdhaXQt Sm9iIC1UaW1lb3V0IDIwIHwgT3V0LU51bGwiKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIFJl YnVpbGQgU1BQIFRva2Vucw0KDQo6cmVidWlsZHNwcHRvaw0KDQplY2hvOg0KZWNobyAlbGluZSUNCmVjaG86DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlJl YnVpbGRpbmcgU1BQIGxpY2Vuc2luZyB0b2tlbnMuLi4iDQplY2hvOg0KDQplY2hvIENsZWFyaW5nIEtNUyBDYWNoZS4uLg0KZWNobzoNCmNhbGwgOl90YXNr Y2xlYXItY2FjaGUNCg0KJW51bCUgcmVnIHF1ZXJ5ICJIS0xNXCVTUFBrJVwlX3dBcHAlIiAmJiAoDQplY2hvIFJlbW92aW5nIEtNUzM4IHByb3RlY3Rpb24u Li4NCiVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0ICc6cmVnZGVsXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6Q3Jl YXRlKCRmWzFdKSkiDQolbnVsJSByZWcgZGVsZXRlICJIS0xNXCVTUFBrJVwlX3dBcHAlIiAvZg0KJW51bCUgcmVnIHF1ZXJ5ICJIS0xNXCVTUFBrJVwlX3dB cHAlIiAmJiAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiRmFpbGVkIHRvIHJlbW92ZSBLTVMzOCBwcm90ZWN0aW9uLiINCikgfHwgKA0KZWNobyBTdWNjZXNz ZnVsbHkgcmVtb3ZlZCBLTVMzOCBwcm90ZWN0aW9uLg0KZWNobyBTdWNjZXNzZnVsbHkgY2xlYXJlZCBLTVMgQ2FjaGUuDQopDQopIHx8ICgNCmVjaG8gU3Vj Y2Vzc2Z1bGx5IGNsZWFyZWQgS01TIENhY2hlLg0KKQ0KZWNobzoNCg0KY2FsbCA6c2NhbmRhdCBjaGVjaw0KDQppZiBub3QgZGVmaW5lZCB0b2tlbiAoDQpj YWxsIDpka19jb2xvciAlUmVkJSAidG9rZW5zLmRhdCBmaWxlIG5vdCBmb3VuZC4iDQopIGVsc2UgKA0KZWNobyB0b2tlbnMuZGF0IGZpbGU6IFsldG9rZW4l XQ0KKQ0KDQpzZXQgdG9rZW5zdG9yZT0NCnNldCBiYWRyZWdpc3RyeT0NCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgncmVnIHF1ZXJ5ICJI S0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtIiAvdiBUb2tlblN0b3Jl ICVudWw2JScpIGRvIGNhbGwgc2V0ICJ0b2tlbnN0b3JlPSUlYiINCmlmICV3aW5idWlsZCUgR0VRIDkyMDAgaWYgL2kgbm90ICIldG9rZW5zdG9yZSUiPT0i JVN5c1BhdGglXHNwcFxzdG9yZSIgaWYgL2kgbm90ICIldG9rZW5zdG9yZSUiPT0iJVN5c1BhdGglXHNwcFxzdG9yZVwyLjAiIGlmIC9pIG5vdCAiJXRva2Vu c3RvcmUlIj09IiVTeXNQYXRoJVxzcHBcc3RvcmVfdGVzdFwyLjAiICgNCnNldCBiYWRyZWdpc3RyeT0xDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJVJlZCUg IkNvcnJlY3QgcGF0aCBub3QgZm91bmQgaW4gVG9rZW5TdG9yZSBSZWdpc3RyeSBbJXRva2Vuc3RvcmUlXSINCikNCg0KOjogIENoZWNrIHNwcHN2YyBwZXJt aXNzaW9ucyBhbmQgYXBwbHkgZml4ZXMNCg0KaWYgJXdpbmJ1aWxkJSBHRVEgOTIwMCBpZiBub3QgZGVmaW5lZCBiYWRyZWdpc3RyeSAoDQplY2hvOg0KZWNo byBDaGVja2luZyBTUFAgcGVybWlzc2lvbiByZWxhdGVkIGlzc3Vlcy4uLg0KY2FsbCA6Y2hlY2twZXJtcw0KaWYgZGVmaW5lZCBwZXJtZXJyb3IgKA0KY2Fs bCA6ZGtfY29sb3IgJVJlZCUgIlshcGVybWVycm9yIV0iDQolcHNjJSAiJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAnOmZp eHNwcHBlcm1zXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSkiICVudWwlDQpjYWxsIDpjaGVja3Blcm1zDQppZiBkZWZpbmVkIHBlcm1l cnJvciAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiWyFwZXJtZXJyb3IhXSBbRmFpbGVkIFRvIEZpeF0iDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJUdy ZWVuJSAiW1N1Y2Nlc3NmdWxseSBGaXhlZF0iDQopDQopIGVsc2UgKA0KZWNobyBbTm8gRXJyb3IgRm91bmRdDQopDQopDQoNCmVjaG86DQplY2hvIFN0b3Bw aW5nICVfc2xzZXIlIHNlcnZpY2UuLi4NCiVwc2MlIFN0b3AtU2VydmljZSAlX3Nsc2VyJSAtZm9yY2UgJW51bCUNCg0Kc2V0IHc9DQpzZXQgX3NwcGludD0N CmZvciAlJSMgaW4gKFNwcEV4JXcldENvbU9iai5leGUgJV9zbGV4ZSUpIGRvIChyZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3Mg TlRcQ3VycmVudFZlcnNpb25cSW1hJXclZ2UgRmlsZSBFeGVjdSV3JXRpb24gT3B0aW9uc1wlJSMiICVudWwlICYmIChzZXQgX3NwcGludD0xKSkNCmlmIGRl ZmluZWQgX3NwcGludCAoDQplY2hvOg0KZWNobyBSZW1vdmluZyBTUFAgSUZFTyByZWdpc3RyeSBrZXlzLi4uDQpmb3IgJSUjIGluIChTcHBFJXcleHRDb21P YmouZXhlICVfc2xleGUlKSBkbyAocmVnIGRlbGV0ZSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxJbWEldyVn ZSBGaWxlIEV4ZWN1JXcldGlvbiBPcHRpb25zXCUlIyIgL2YgJW51bCUpDQopDQoNCmlmICV3aW5idWlsZCUgTFNTIDkyMDAgaWYgbm90IGRlZmluZWQgX3Zp cyAoDQpSRU0gRml4IGlzc3VlcyBjYXVzZWQgYnkgVXBkYXRlIEtCOTcxMDMzIGluIFdpbmRvd3MgNw0KUkVNIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQu Y29tL2VuLXVzL2hlbHAvNDQ4NzI2Ng0KZWNobzoNCmVjaG8gQ2hlY2tpbmcgVXBkYXRlIEtCOTcxMDMzLi4uDQolcHNjJSAiaWYgKEdldC1Ib3RmaXggLUlk IEtCOTcxMDMzIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlKSB7RXhpdCAzfSIgJW51bCUNCmlmICFlcnJvcmxldmVsIT09MyAoDQplY2hvIEZvdW5k LCB1bmluc3RhbGxpbmcgaXQuLi4NCnd1c2EgL3VuaW5zdGFsbCAvcXVpZXQgL25vcmVzdGFydCAva2I6OTcxMDMzDQopIGVsc2UgKA0KZWNobyBbTm90IEZv dW5kXQ0KKQ0KJXBzYyUgU3RvcC1TZXJ2aWNlIHNwcHVpbm90aWZ5IC1mb3JjZSAlbnVsJQ0Kc2MgY29uZmlnIHNwcHVpbm90aWZ5IHN0YXJ0PSBkaXNhYmxl ZA0KZGVsIC9mIC9xICVTeXNQYXRoJVw3QjI5NkZCMC0zNzZCLTQ5N2UtQjAxMi05QzQ1MEUxQjczMjctKi5DNzQ4MzQ1Ni1BMjg5LTQzOWQtODExNS02MDE2 MzJEMDA1QTAgL2FoDQopDQoNCjo6ICBEZWxldGUgcmVnaXN0cnkga2V5cyB0aGF0IGFyZSBub3QgZGVsZXRlZCBieSBhY3RpdmF0aW9uIHNjcmlwdHMNCg0K aWYgbm90IGRlZmluZWQgX3ZpcyAoDQplY2hvOg0KZWNobyBDbGVhbmluZyBzb21lIGxpY2Vuc2luZy1yZWxhdGVkIHJlZ2lzdHJ5IGtleXMuLi4NCiVudWwl IHJlZyBkZWxldGUgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0i IC92ICJTZXJ2aWNlU2Vzc2lvbklkIiAvZg0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVy c2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSIgL3YgIkxpY1N0YXR1c0FycmF5IiAvZg0KJW51bCUgcmVnIGRlbGV0ZSAiSEtMTVxTT0ZUV0FSRVxN aWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSIgL3YgIlBvbGljeVZhbHVlc0FycmF5IiAvZg0K JW51bCUgcmVnIGRlbGV0ZSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0 Zm9ybSIgL3YgImFjdGlvbmxpc3QiIC9mDQolbnVsJSByZWcgZGVsZXRlICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2VTb2Z0d2FyZVByb3RlY3Rp b25QbGF0Zm9ybVxkYXRhIiAvZg0KKQ0KDQplY2hvOg0KY2FsbCA6c2NhbmRhdCBkZWxldGUNCmNhbGwgOnNjYW5kYXQgY2hlY2sNCg0KaWYgZGVmaW5lZCB0 b2tlbiAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkZhaWxlZCB0byBkZWxldGUgLmRhdCBmaWxlcy4iDQplY2hvOg0KKQ0KDQppZiBkZWZpbmVk IF92aXMgKA0KJXBzYyUgU3RhcnQtU2VydmljZSAlX3Nsc2VyJSAlbnVsJQ0KKQ0KDQplY2hvOg0KZWNobyBSZWluc3RhbGxpbmcgc3lzdGVtIGxpY2Vuc2Vz Li4uDQolcHNjJSAiJHNscyA9IEdldC1XbWlPYmplY3QgU29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlOyAkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2Jh dHAhJykgLXNwbGl0ICc6eHJtXDouKic7LiAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSk7IFJlaW5zdGFsbExpY2Vuc2VzIiAlbnVsJQ0KaWYgJWVy cm9ybGV2ZWwlIE5FUSAwICVwc2MlICIkc2xzID0gR2V0LVdtaU9iamVjdCBTb2Z0d2FyZUxpY2Vuc2luZ1NlcnZpY2U7ICRmPVtJTy5GaWxlXTo6UmVhZEFs bFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzp4cm1cOi4qJzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKTsgUmVpbnN0YWxsTGljZW5zZXMiICVu dWwlDQppZiAlZXJyb3JsZXZlbCUgRVFVIDAgKA0KZWNobyBbU3VjY2Vzc2Z1bF0NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiW0ZhaWxlZF0i DQopDQoNCmNhbGwgOnNjYW5kYXQgY2hlY2sNCg0KZWNobzoNCmlmIG5vdCBkZWZpbmVkIHRva2VuICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJGYWlsZWQg dG8gcmVidWlsZCB0b2tlbnMuZGF0IGZpbGUuIg0KKSBlbHNlICgNCmVjaG8gdG9rZW5zLmRhdCBmaWxlIHdhcyByZWJ1aWx0IHN1Y2Nlc3NmdWxseS4NCikN Cg0KaWYgJXdpbmJ1aWxkJSBMU1MgOTIwMCBpZiBub3QgZGVmaW5lZCBfdmlzICgNCnNjIGNvbmZpZyBzcHB1aW5vdGlmeSBzdGFydD0gZGVtYW5kDQopDQoN Cjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgUmVidWlsZCBPU1BQIFRva2Vucw0KDQplY2hvOg0KZWNo byAlbGluZSUNCmVjaG86DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIlJlYnVpbGRpbmcgT1NQUCBsaWNlbnNpbmcgdG9rZW5zLi4uIg0KZWNobzoNCg0Kc2Mg cWMgb3NwcHN2YyAlbnVsJSB8fCAoDQplY2hvIE9TUFAtYmFzZWQgT2ZmaWNlIGlzIG5vdCBpbnN0YWxsZWQuDQplY2hvIFNraXBwaW5nIHJlYnVpbGRpbmcg T1NQUCB0b2tlbnMuLi4NCmdvdG8gOnJlcGFpcm9mZmljZQ0KKQ0KDQpjYWxsIDpzY2FuZGF0b3NwcCBjaGVjaw0KDQppZiBub3QgZGVmaW5lZCB0b2tlbiAo DQpjYWxsIDpka19jb2xvciAlUmVkJSAidG9rZW5zLmRhdCBmaWxlIG5vdCBmb3VuZC4iDQopIGVsc2UgKA0KZWNobyB0b2tlbnMuZGF0IGZpbGU6IFsldG9r ZW4lXQ0KKQ0KDQplY2hvOg0KZWNobyBTdG9wcGluZyBvc3Bwc3ZjIHNlcnZpY2UuLi4NCiVwc2MlIFN0b3AtU2VydmljZSBvc3Bwc3ZjIC1mb3JjZSAlbnVs JQ0KDQplY2hvOg0KY2FsbCA6c2NhbmRhdG9zcHAgZGVsZXRlDQpjYWxsIDpzY2FuZGF0b3NwcCBjaGVjaw0KDQppZiBkZWZpbmVkIHRva2VuICgNCmVjaG86 DQpjYWxsIDpka19jb2xvciAlUmVkJSAiRmFpbGVkIHRvIGRlbGV0ZSAuZGF0IGZpbGVzLiINCmVjaG86DQopDQoNCmVjaG86DQplY2hvIFN0YXJ0aW5nIG9z cHBzdmMgc2VydmljZSB0byBnZW5lcmF0ZSB0b2tlbnMuZGF0Li4uDQolcHNjJSBTdGFydC1TZXJ2aWNlIG9zcHBzdmMgJW51bCUNCmNhbGwgOnNjYW5kYXRv c3BwIGNoZWNrDQppZiBub3QgZGVmaW5lZCB0b2tlbiAoDQolcHNjJSBTdG9wLVNlcnZpY2Ugb3NwcHN2YyAtZm9yY2UgJW51bCUNCiVwc2MlIFN0YXJ0LVNl cnZpY2Ugb3NwcHN2YyAlbnVsJQ0KdGltZW91dCAvdCAzICVudWwlDQopDQoNCmNhbGwgOnNjYW5kYXRvc3BwIGNoZWNrDQoNCmVjaG86DQppZiBub3QgZGVm aW5lZCB0b2tlbiAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiRmFpbGVkIHRvIHJlYnVpbGQgdG9rZW5zLmRhdCBmaWxlLiINCikgZWxzZSAoDQplY2hvIHRv a2Vucy5kYXQgZmlsZSB3YXMgcmVidWlsdCBzdWNjZXNzZnVsbHkuDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KDQo6cmVwYWlyb2ZmaWNlDQoNCmVjaG86DQplY2hvICVsaW5lJQ0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiUmVwYWlyaW5nIE9mZmlj ZSBsaWNlbnNlcy4uLiINCmVjaG86DQoNCmZvciAlJSMgaW4gKDY4IDg2KSBkbyAoDQpmb3IgJSVBIGluIChtc2kxNCBtc2kxNSBtc2kxNiBjMnIxNCBjMnIx NSBjMnIxNikgZG8gKHNldCAlJUFfJSUjPSZzZXQgJSVBcmVwYWlyJSUjPSkNCikNCg0Kc2V0IF82OD1IS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxPZmZpY2UN CnNldCBfODY9SEtMTVxTT0ZUV0FSRVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcT2ZmaWNlDQoNCnJlZyBxdWVyeSAlXzY4JVwxNC4wXENWSCAvZiBDbGljazJy dW4gL2sgJW51bCUgJiYgKHNldCAiYzJyMTRfNjg9T2ZmaWNlIDE0LjAgQzJSIHg4Ni94NjQiICAmIHNldCAiYzJyMTRyZXBhaXI2OD0iKQ0KcmVnIHF1ZXJ5 ICVfODYlXDE0LjBcQ1ZIIC9mIENsaWNrMnJ1biAvayAlbnVsJSAmJiAoc2V0ICJjMnIxNF84Nj1PZmZpY2UgMTQuMCBDMlIgeDg2IiAgICAgICYgc2V0ICJj MnIxNHJlcGFpcjg2PSIpDQoNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzg2JVwxNC4wXENvbW1vblxJbnN0YWxs Um9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0ICJtc2kxNF84Nj1PZmZpY2UgMTQuMCBNU0kgeDg2IiAg ICAgICYgY2FsbCA6Z2V0cmVwYWlyc2V0dXAgbXNpMTRyZXBhaXI4NiAxNCkNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVy eSAlXzY4JVwxNC4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0ICJtc2kx NF82OD1PZmZpY2UgMTQuMCBNU0kgeDg2L3g2NCIgICYgY2FsbCA6Z2V0cmVwYWlyc2V0dXAgbXNpMTRyZXBhaXI2OCAxNCkNCmZvciAvZiAic2tpcD0yIHRv a2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzg2JVwxNS4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAi JSViXCpQaWNrZXIuZGxsIiAoc2V0ICJtc2kxNV84Nj1PZmZpY2UgMTUuMCBNU0kgeDg2IiAgICAgICYgY2FsbCA6Z2V0cmVwYWlyc2V0dXAgbXNpMTVyZXBh aXI4NiAxNSkNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzY4JVwxNS4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQ YXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0ICJtc2kxNV82OD1PZmZpY2UgMTUuMCBNU0kgeDg2L3g2NCIgICYgY2Fs bCA6Z2V0cmVwYWlyc2V0dXAgbXNpMTVyZXBhaXI2OCAxNSkNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlXzg2JVwx Ni4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNrZXIuZGxsIiAoc2V0ICJtc2kxNl84Nj1PZmZp Y2UgMTYuMCBNU0kgeDg2IiAgICAgICYgY2FsbCA6Z2V0cmVwYWlyc2V0dXAgbXNpMTZyZXBhaXI4NiAxNikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIg JSVhIGluICgnInJlZyBxdWVyeSAlXzY4JVwxNi4wXENvbW1vblxJbnN0YWxsUm9vdCAvdiBQYXRoIiAlbnVsNiUnKSBkbyBpZiBleGlzdCAiJSViXCpQaWNr ZXIuZGxsIiAoc2V0ICJtc2kxNl82OD1PZmZpY2UgMTYuMCBNU0kgeDg2L3g2NCIgICYgY2FsbCA6Z2V0cmVwYWlyc2V0dXAgbXNpMTZyZXBhaXI2OCAxNikN Cg0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVfODYlXDE1LjBcQ2xpY2tUb1J1biAvdiBJbnN0YWxsUGF0aCIgJW51 bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzXFByb1BsdXMqLnhybS1tcyIgKHNldCAiYzJyMTVfODY9T2ZmaWNlIDE1LjAgQzJSIHg4NiIg ICAgICAmIGNhbGwgOmdldGMycnJlcGFpciBjMnIxNXJlcGFpcjg2IGludGVncmF0ZWRvZmZpY2UuZXhlKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAl JWEgaW4gKCcicmVnIHF1ZXJ5ICVfNjglXDE1LjBcQ2xpY2tUb1J1biAvdiBJbnN0YWxsUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExp Y2Vuc2VzXFByb1BsdXMqLnhybS1tcyIgKHNldCAiYzJyMTVfNjg9T2ZmaWNlIDE1LjAgQzJSIHg4Ni94NjQiICAmIGNhbGwgOmdldGMycnJlcGFpciBjMnIx NXJlcGFpcjY4IGludGVncmF0ZWRvZmZpY2UuZXhlKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVfODYlXENsaWNr VG9SdW4gL3YgSW5zdGFsbFBhdGgiICVudWw2JScpIGRvIGlmIGV4aXN0ICIlJWJccm9vdFxMaWNlbnNlczE2XFByb1BsdXMqLnhybS1tcyIgICAgKHNldCAi YzJyMTZfODY9T2ZmaWNlIDE2LjAgQzJSIHg4NiIgICAgICAmIGNhbGwgOmdldGMycjE2cmVwYWlyIGMycjE2cmVwYWlyODYgT2ZmaWNlQ2xpY2tUb1J1bi5l eGUpDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV82OCVcQ2xpY2tUb1J1biAvdiBJbnN0YWxsUGF0aCIgJW51bDYl JykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzMTZcUHJvUGx1cyoueHJtLW1zIiAgICAoc2V0ICJjMnIxNl82OD1PZmZpY2UgMTYuMCBDMlIgeDg2 L3g2NCIgICYgY2FsbCA6Z2V0YzJyMTZyZXBhaXIgYzJyMTZyZXBhaXI2OCBPZmZpY2VDbGlja1RvUnVuLmV4ZSkNCg0Kc2V0IHV3cDE2PQ0KaWYgJXdpbmJ1 aWxkJSBHRVEgMTAyNDAgKA0KJXBzYyUgIkdldC1BcHB4UGFja2FnZSAtbmFtZSAiTWljcm9zb2Z0Lk9mZmljZS5EZXNrdG9wIiIgfCBmaW5kIC9pICJPZmZp Y2UiICVudWwxJSAmJiBzZXQgdXdwMTY9T2ZmaWNlIDE2LjAgVVdQDQopDQoNCnNldCAvYSBjb3VudGVyPTANCmVjaG8gQ2hlY2tpbmcgaW5zdGFsbGVkIE9m ZmljZSB2ZXJzaW9ucy4uLg0KZWNobzoNCg0KZm9yICUlIyBpbiAoDQoiJW1zaTE0XzY4JSINCiIlbXNpMTRfODYlIg0KIiVtc2kxNV82OCUiDQoiJW1zaTE1 Xzg2JSINCiIlbXNpMTZfNjglIg0KIiVtc2kxNl84NiUiDQoiJWMycjE0XzY4JSINCiIlYzJyMTRfODYlIg0KIiVjMnIxNV82OCUiDQoiJWMycjE1Xzg2JSIN CiIlYzJyMTZfNjglIg0KIiVjMnIxNl84NiUiDQoiJXV3cDE2JSINCikgZG8gKA0KaWYgbm90ICIlJSMiPT0iIiIiICgNCnNldCBpbnNvZmY9JSUjDQpzZXQg aW5zb2ZmPSFpbnNvZmY6Ij0hDQplY2hvIFshaW5zb2ZmIV0NCnNldCAvYSBjb3VudGVyKz0xDQopDQopDQoNCmlmICVjb3VudGVyJSBHVFIgMSAoDQolZWxp bmUlDQplY2hvIE11bHRpcGxlIE9mZmljZSB2ZXJzaW9ucyBmb3VuZC4NCmVjaG8gSXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSBpbnN0YWxsIG9uZSB2ZXJz aW9uIG9mIE9mZmljZS4NCmVjaG8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNo bzoNCikNCg0KZWNobzoNCmlmICVjb3VudGVyJSBFUVUgMCAoDQplY2hvIE9mZmljZSBeKDIwMTAgYW5kIGxhdGVyXikgaXMgbm90IGluc3RhbGxlZC4NCmdv dG8gOnJlcGFpcmVuZA0KKSBlbHNlIGlmIG5vdCBkZWZpbmVkIGMycjE2XzY4IGlmIG5vdCBkZWZpbmVkIGMycjE2Xzg2ICgNCmNhbGwgOmRrX2NvbG9yICVf WWVsbG93JSAiQSBuZXcgd2luZG93IHdpbGwgYXBwZWFyLCBpbiB0aGF0IHdpbmRvdyB5b3UgbmVlZCB0byBzZWxlY3QgW1F1aWNrIFJlcGFpcl0gb3B0aW9u LiINCmlmIGRlZmluZWQgdGVybWluYWwgKA0KY2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICJQcmVzcyBbMF0gdG8gY29udGludWUuLi4iDQpjaG9pY2UgL2Mg MCAvbg0KKSBlbHNlICgNCmNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiUHJlc3MgYW55IGtleSB0byBjb250aW51ZS4uLiINCnBhdXNlICVudWwxJQ0KKQ0K KQ0KDQppZiBkZWZpbmVkIHV3cDE2ICgNCmVjaG86DQplY2hvIFNraXBwaW5nIHJlcGFpciBmb3IgT2ZmaWNlIDE2LjAgVVdQLi4uIA0KZWNobzoNCikNCg0K c2V0IGMycjE0PQ0KaWYgZGVmaW5lZCBjMnIxNF82OCBzZXQgYzJyMTQ9MQ0KaWYgZGVmaW5lZCBjMnIxNF84NiBzZXQgYzJyMTQ9MQ0KDQppZiBkZWZpbmVk IGMycjE0ICgNCmVjaG86DQplY2hvIFNraXBwaW5nIHJlcGFpciBmb3IgT2ZmaWNlIDE0LjAgQzJSLi4uDQplY2hvOg0KKQ0KDQppZiBkZWZpbmVkIG1zaTE0 XzY4IGlmIGV4aXN0ICIlbXNpMTRyZXBhaXI2OCUiIGVjaG8gUnVubmluZyAtICIlbXNpMTRyZXBhaXI2OCUiICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICYgIiVtc2kxNHJlcGFpcjY4JSINCmlmIGRlZmluZWQgbXNpMTRfODYgaWYgZXhpc3QgIiVtc2kxNHJlcGFpcjg2JSIgZWNobyBSdW5u aW5nIC0gIiVtc2kxNHJlcGFpcjg2JSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAiJW1zaTE0cmVwYWlyODYlIg0KaWYgZGVm aW5lZCBtc2kxNV82OCBpZiBleGlzdCAiJW1zaTE1cmVwYWlyNjglIiBlY2hvIFJ1bm5pbmcgLSAiJW1zaTE1cmVwYWlyNjglIiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAmICIlbXNpMTVyZXBhaXI2OCUiDQppZiBkZWZpbmVkIG1zaTE1Xzg2IGlmIGV4aXN0ICIlbXNpMTVyZXBhaXI4NiUi IGVjaG8gUnVubmluZyAtICIlbXNpMTVyZXBhaXI4NiUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgIiVtc2kxNXJlcGFpcjg2 JSINCmlmIGRlZmluZWQgbXNpMTZfNjggaWYgZXhpc3QgIiVtc2kxNnJlcGFpcjY4JSIgZWNobyBSdW5uaW5nIC0gIiVtc2kxNnJlcGFpcjY4JSIgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAiJW1zaTE2cmVwYWlyNjglIg0KaWYgZGVmaW5lZCBtc2kxNl84NiBpZiBleGlzdCAiJW1zaTE2 cmVwYWlyODYlIiBlY2hvIFJ1bm5pbmcgLSAiJW1zaTE2cmVwYWlyODYlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmICIlbXNp MTZyZXBhaXI4NiUiDQppZiBkZWZpbmVkIGMycjE1XzY4IGlmIGV4aXN0ICIlYzJyMTVyZXBhaXI2OCUiIGVjaG8gUnVubmluZyAtICIlYzJyMTVyZXBhaXI2 OCUiIFJFUEFJUlVJIFJFUlVOTU9ERSAgICAgICAgICAgICAgICAgICAgICYgIiVjMnIxNXJlcGFpcjY4JSIgUkVQQUlSVUkgUkVSVU5NT0RFDQppZiBkZWZp bmVkIGMycjE1Xzg2IGlmIGV4aXN0ICIlYzJyMTVyZXBhaXI4NiUiIGVjaG8gUnVubmluZyAtICIlYzJyMTVyZXBhaXI4NiUiIFJFUEFJUlVJIFJFUlVOTU9E RSAgICAgICAgICAgICAgICAgICAgICYgIiVjMnIxNXJlcGFpcjg2JSIgUkVQQUlSVUkgUkVSVU5NT0RFDQppZiBkZWZpbmVkIGMycjE2XzY4IGlmIGV4aXN0 ICIlYzJyMTZyZXBhaXI2OCUiIGVjaG8gUnVubmluZyAtICIlYzJyMTZyZXBhaXI2OCUiIFNjZW5hcmlvPVJlcGFpciBSZXBhaXJUeXBlPVF1aWNrUmVwYWly ICYgIiVjMnIxNnJlcGFpcjY4JSIgU2NlbmFyaW89UmVwYWlyIFJlcGFpclR5cGU9UXVpY2tSZXBhaXINCmlmIGRlZmluZWQgYzJyMTZfODYgaWYgZXhpc3Qg IiVjMnIxNnJlcGFpcjg2JSIgZWNobyBSdW5uaW5nIC0gIiVjMnIxNnJlcGFpcjg2JSIgU2NlbmFyaW89UmVwYWlyIFJlcGFpclR5cGU9UXVpY2tSZXBhaXIg JiAiJWMycjE2cmVwYWlyODYlIiBTY2VuYXJpbz1SZXBhaXIgUmVwYWlyVHlwZT1RdWlja1JlcGFpcg0KDQo6cmVwYWlyZW5kDQoNCmVjaG86DQplY2hvICVs aW5lJQ0KZWNobzoNCmVjaG86DQpjYWxsIDpka19jb2xvciAlR3JlZW4lICJGaW5pc2hlZCINCmdvdG8gOmF0X2JhY2sNCg0KOmdldGMycnJlcGFpcg0KDQpm b3IgJSUjIGluIChYODYgWDY0KSBkbyAoDQppZiBleGlzdCAiJXN5c3RlbWRyaXZlJVxQcm9ncmFtIEZpbGVzXE1pY3Jvc29mdCBPZmZpY2UgMTVcQ2xpZW50 JSUjXCUyIiAoDQpzZXQgIiUxPSVzeXN0ZW1kcml2ZSVcUHJvZ3JhbSBGaWxlc1xNaWNyb3NvZnQgT2ZmaWNlIDE1XENsaWVudCUlI1wlMiINCikNCikNCmV4 aXQgL2INCg0KOmdldGMycjE2cmVwYWlyDQoNCmZvciAlJSMgaW4gKCVfNjglICVfODYlKSBkbyAoDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBp biAoJyJyZWcgcXVlcnkgJSUjXENsaWNrVG9SdW5cQ29uZmlndXJhdGlvbiAvdiBDbGllbnRGb2xkZXIiICVudWw2JScpIGRvIGlmIGV4aXN0ICIlJWJcJTIi IChzZXQgIiUxPSUlYlwlMiIpDQopDQpleGl0IC9iDQoNCjpnZXRyZXBhaXJzZXR1cA0KDQpzZXQgIl9jb21tb244Nj0lc3lzdGVtZHJpdmUlXFByb2dyYW0g RmlsZXMgKHg4NilcQ29tbW9uIEZpbGVzXE1pY3Jvc29mdCBTaGFyZWRcT0ZGSUNFJTJcT2ZmaWNlIFNldHVwIENvbnRyb2xsZXJcc2V0dXAuZXhlIg0Kc2V0 ICJfY29tbW9uNjg9JXN5c3RlbWRyaXZlJVxQcm9ncmFtIEZpbGVzXENvbW1vbiBGaWxlc1xNaWNyb3NvZnQgU2hhcmVkXE9GRklDRSUyXE9mZmljZSBTZXR1 cCBDb250cm9sbGVyXHNldHVwLmV4ZSINCg0KaWYgZXhpc3QgIiVfY29tbW9uODYlIiBzZXQgIiUxPSVfY29tbW9uODYlIg0KaWYgZXhpc3QgIiVfY29tbW9u NjglIiBzZXQgIiUxPSVfY29tbW9uNjglIg0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0K OmZpeHdtaQ0KDQpjbHMNCmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsIG1vZGUgOTgsIDM0DQp0aXRsZSAgRml4IFdNSQ0KDQo6OiAgaHR0cHM6Ly90ZWNoY29t bXVuaXR5Lm1pY3Jvc29mdC5jb20vdDUvYXNrLXRoZS1wZXJmb3JtYW5jZS10ZWFtL3dtaS1yZXBvc2l0b3J5LWNvcnJ1cHRpb24tb3Itbm90L2JhLXAvMzc1 NDg0DQoNCmlmIGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2thZ2VzXE1pY3Jvc29mdC1XaW5kb3dzLVNlcnZlcipFZGl0aW9ufioubXVtIiAo DQolZWxpbmUlDQplY2hvIFJlYnVpbGRpbmcgV01JIGlzIG5vdCByZWNvbW1lbmRlZCBvbiBXaW5kb3dzIFNlcnZlciwgYWJvcnRpbmcuLi4NCmdvdG8gOmF0 X2JhY2sNCikNCg0KZWNobzoNCmVjaG8gQ2hlY2tpbmcgV01JDQpjYWxsIDpjaGVja3dtaQ0KDQo6OiAgQXBwbHkgYmFzaWMgZml4IGZpcnN0IGFuZCBjaGVj aw0KDQppZiBkZWZpbmVkIGVycm9yICgNCiVwc2MlIFN0b3AtU2VydmljZSBXaW5tZ210IC1mb3JjZSAlbnVsJQ0Kd2lubWdtdCAvc2FsdmFnZXJlcG9zaXRv cnkgJW51bCUNCmNhbGwgOmNoZWNrd21pDQopDQoNCmlmIG5vdCBkZWZpbmVkIGVycm9yICgNCmVjaG8gW1dvcmtpbmddDQplY2hvIE5vIG5lZWQgdG8gYXBw bHkgdGhpcyBvcHRpb24sIGFib3J0aW5nLi4uDQpnb3RvIDphdF9iYWNrDQopDQoNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJbTm90IFJlc3BvbmRpbmddIg0K DQpzZXQgX2NvcnJ1cHQ9DQpzYyBzdGFydCBXaW5tZ210ICVudWwlDQppZiAlZXJyb3JsZXZlbCUgRVFVIDEwNjAgc2V0IF9jb3JydXB0PTENCnNjIHF1ZXJ5 IFdpbm1nbXQgJW51bCUgfHwgc2V0IF9jb3JydXB0PTENCmZvciAlJUcgaW4gKERlcGVuZE9uU2VydmljZSBEZXNjcmlwdGlvbiBEaXNwbGF5TmFtZSBFcnJv ckNvbnRyb2wgSW1hZ2VQYXRoIE9iamVjdE5hbWUgU3RhcnQgVHlwZSkgZG8gaWYgbm90IGRlZmluZWQgX2NvcnJ1cHQgKHJlZyBxdWVyeSBIS0xNXFNZU1RF TVxDdXJyZW50Q29udHJvbFNldFxTZXJ2aWNlc1xXaW5tZ210IC92ICUlRyAlbnVsJSB8fCBzZXQgX2NvcnJ1cHQ9MSkNCg0KZWNobzoNCmlmIGRlZmluZWQg X2NvcnJ1cHQgKA0KJWVsaW5lJQ0KZWNobyBXaW5tZ210IHNlcnZpY2UgaXMgY29ycnVwdGVkLCBhYm9ydGluZy4uLg0KZ290byA6YXRfYmFjaw0KKQ0KDQpl Y2hvIERpc2FibGluZyBXaW5tZ210IHNlcnZpY2UNCnNjIGNvbmZpZyBXaW5tZ210IHN0YXJ0PSBkaXNhYmxlZCAlbnVsJQ0KaWYgJWVycm9ybGV2ZWwlIEVR VSAwICgNCmVjaG8gW1N1Y2Nlc3NmdWxdDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIltGYWlsZWRdIEFib3J0aW5nLi4uIg0Kc2MgY29uZmln IFdpbm1nbXQgc3RhcnQ9IGF1dG8gJW51bCUNCmdvdG8gOmF0X2JhY2sNCikNCg0KZWNobzoNCmVjaG8gU3RvcHBpbmcgV2lubWdtdCBzZXJ2aWNlDQolcHNj JSBTdG9wLVNlcnZpY2UgV2lubWdtdCAtZm9yY2UgJW51bCUNCiVwc2MlIFN0b3AtU2VydmljZSBXaW5tZ210IC1mb3JjZSAlbnVsJQ0KJXBzYyUgU3RvcC1T ZXJ2aWNlIFdpbm1nbXQgLWZvcmNlICVudWwlDQpzYyBxdWVyeSBXaW5tZ210IHwgZmluZCAvaSAiU1RPUFBFRCIgJW51bCUgJiYgKA0KZWNobyBbU3VjY2Vz c2Z1bF0NCikgfHwgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIltGYWlsZWRdIg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJJdHMgcmVjb21tZW5kZWQgdG8g c2VsZWN0IFtSZXN0YXJ0XSBvcHRpb24gYW5kIHRoZW4gYXBwbHkgRml4IFdNSSBvcHRpb24gYWdhaW4uIg0KZWNobyAlbGluZSUNCmVjaG86DQpjaG9pY2Ug L0M6MjEgL04gL00gIj4gWzFdIFJlc3RhcnQgIFsyXSBSZXZlcnQgQmFjayBDaGFuZ2VzIDoiDQppZiAhZXJyb3JsZXZlbCE9PTEgKHNjIGNvbmZpZyBXaW5t Z210IHN0YXJ0PSBhdXRvICVudWwlJmdvdG8gOmF0X2JhY2spDQplY2hvOg0KZWNobyBSZXN0YXJ0aW5nLi4uDQpzaHV0ZG93biAtdCA1IC1yDQpleGl0DQop DQoNCmVjaG86DQplY2hvIERlbGV0aW5nIFdNSSByZXBvc2l0b3J5DQpybWRpciAvcyAvcSAiJVN5c1BhdGglXHdiZW1ccmVwb3NpdG9yeVwiICVudWwlDQpp ZiBleGlzdCAiJVN5c1BhdGglXHdiZW1ccmVwb3NpdG9yeVwiICgNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJbRmFpbGVkXSINCikgZWxzZSAoDQplY2hvIFtT dWNjZXNzZnVsXQ0KKQ0KDQplY2hvOg0KZWNobyBFbmFibGluZyBXaW5tZ210IHNlcnZpY2UNCnNjIGNvbmZpZyBXaW5tZ210IHN0YXJ0PSBhdXRvICVudWwl DQppZiAlZXJyb3JsZXZlbCUgRVFVIDAgKA0KZWNobyBbU3VjY2Vzc2Z1bF0NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiW0ZhaWxlZF0iDQop DQoNCmNhbGwgOmNoZWNrd21pDQppZiBub3QgZGVmaW5lZCBlcnJvciAoDQplY2hvOg0KZWNobyBDaGVja2luZyBXTUkNCmNhbGwgOmRrX2NvbG9yICVHcmVl biUgIltXb3JraW5nXSINCmdvdG8gOmF0X2JhY2sNCikNCg0KZWNobzoNCmVjaG8gUmVnaXN0ZXJpbmcgLmRsbCdzIGFuZCBDb21waWxpbmcgLm1vZidzLCAu bWZsJ3MNCmNhbGwgOnJlZ2lzdGVyb2JqICVudWwlDQoNCmVjaG86DQplY2hvIENoZWNraW5nIFdNSQ0KY2FsbCA6Y2hlY2t3bWkNCmlmIGRlZmluZWQgZXJy b3IgKA0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIltOb3QgUmVzcG9uZGluZ10iDQplY2hvOg0KZWNobyBSdW4gW0Rpc20gUmVzdG9yZUhlYWx0aF0gYW5kIFtT RkMgU2Nhbm5vd10gb3B0aW9ucyBhbmQgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBlcnJvcnMuDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJUdyZWVuJSAi W1dvcmtpbmddIg0KKQ0KDQpnb3RvIDphdF9iYWNrDQoNCjpyZWdpc3Rlcm9iag0KDQo6OiAgaHR0cHM6Ly9lc2tvbnIuY29tLzIwMTIvMDEvaG93LXRvLWZp eC13bWktaXNzdWVzLWF1dG9tYXRpY2FsbHkvDQoNCiVwc2MlIFN0b3AtU2VydmljZSBXaW5tZ210IC1mb3JjZSAlbnVsJQ0KY2QgL2QgJVN5c1BhdGglXHdi ZW1cDQpyZWdzdnIzMiAvcyAlU3lzUGF0aCVcc2NlY2xpLmRsbA0KcmVnc3ZyMzIgL3MgJVN5c1BhdGglXHVzZXJlbnYuZGxsDQptb2Zjb21wIGNpbXdpbjMy Lm1vZg0KbW9mY29tcCBjaW13aW4zMi5tZmwNCm1vZmNvbXAgcnNvcC5tb2YNCm1vZmNvbXAgcnNvcC5tZmwNCmZvciAvZiAlJXMgaW4gKCdkaXIgL2IgL3Mg Ki5kbGwnKSBkbyByZWdzdnIzMiAvcyAlJXMNCmZvciAvZiAlJXMgaW4gKCdkaXIgL2IgKi5tb2YnKSBkbyBtb2Zjb21wICUlcw0KZm9yIC9mICUlcyBpbiAo J2RpciAvYiAqLm1mbCcpIGRvIG1vZmNvbXAgJSVzDQoNCndpbm1nbXQgL3NhbHZhZ2VyZXBvc2l0b3J5DQp3aW5tZ210IC9yZXNldHJlcG9zaXRvcnkNCmV4 aXQgL2INCg0KOmNoZWNrd21pDQoNCjo6ICBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93aW4zMi93bWlzZGsvd21pLWVycm9y LWNvbnN0YW50cw0KDQpzZXQgZXJyb3I9DQolcHNjJSAiR2V0LVdtaU9iamVjdCAtQ2xhc3MgV2luMzJfQ29tcHV0ZXJTeXN0ZW0gfCBTZWxlY3QtT2JqZWN0 IC1Qcm9wZXJ0eSBDcmVhdGlvbkNsYXNzTmFtZSIgJW51bDIlIHwgZmluZCAvaSAiY29tcHV0ZXJzeXN0ZW0iICVudWwxJQ0KaWYgJWVycm9ybGV2ZWwlIE5F USAwIChzZXQgZXJyb3I9MSYgZXhpdCAvYikNCndpbm1nbXQgL3ZlcmlmeXJlcG9zaXRvcnkgJW51bCUNCmlmICVlcnJvcmxldmVsJSBORVEgMCAoc2V0IGVy cm9yPTEmIGV4aXQgL2IpDQoNCiVwc2MlICJ0cnkgeyAkbnVsbD0oW1dNSVNFQVJDSEVSXSdTRUxFQ1QgKiBGUk9NIFNvZnR3YXJlTGljZW5zaW5nU2Vydmlj ZScpLkdldCgpLlZlcnNpb247IGV4aXQgMCB9IGNhdGNoIHsgZXhpdCAkXy5FeGNlcHRpb24uSW5uZXJFeGNlcHRpb24uSFJlc3VsdCB9IiAlbnVsJQ0KY21k IC9jIGV4aXQgL2IgJWVycm9ybGV2ZWwlDQplY2hvICIweCU9RXhpdENvZGUlIiB8IGZpbmRzdHIgL2kgIjB4ODAwNDEwIDB4ODAwNDQwIDB4ODAxMzE1MDEi ICVudWwxJQ0KaWYgJWVycm9ybGV2ZWwlIEVRVSAwIHNldCBlcnJvcj0xDQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQ0KDQo6YXRfYmFjaw0KDQplY2hvOg0KZWNobyAlbGluZSUNCmVjaG86DQppZiBkZWZpbmVkIHRlcm1pbmFsICgNCmNhbGwgOmRrX2Nv bG9yICVfWWVsbG93JSAiUHJlc3MgWzBdIGtleSB0byAlX2V4aXRtc2clLi4uIg0KY2hvaWNlIC9jIDAgL24NCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAl X1llbGxvdyUgIlByZXNzIGFueSBrZXkgdG8gJV9leGl0bXNnJS4uLiINCnBhdXNlICVudWwxJQ0KKQ0KZ290byA6YXRfbWVudQ0KDQo6Oj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOmNvbXByZXNzbG9nDQoNCjo6ICBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDYy NjgyMzINCg0KZm9yIC9mICUlRyBpbiAoJyVwc2MlICJbR3VpZF06Ok5ld0d1aWQoKS5HdWlkIicpIGRvIHNldCAicmFuZGd1aWQ9JSVHIg0Kc2V0ICJkZGY9 IiVTeXN0ZW1Sb290JVxUZW1wXCVSYW5kb20lJXJhbmRndWlkJSIiDQplY2hvLy5OZXcgQ2FiaW5ldD4lZGRmJQ0KZWNoby8uc2V0IENhYmluZXQ9T04+PiVk ZGYlDQplY2hvLy5zZXQgQ2FiaW5ldEZpbGVDb3VudFRocmVzaG9sZD0wOz4+JWRkZiUNCmVjaG8vLnNldCBDb21wcmVzcz1PTj4+JWRkZiUNCmVjaG8vLnNl dCBDb21wcmVzc2lvblR5cGU9TFpYPj4lZGRmJQ0KZWNoby8uc2V0IENvbXByZXNzaW9uTGV2ZWw9Nzs+PiVkZGYlDQplY2hvLy5zZXQgQ29tcHJlc3Npb25N ZW1vcnk9MjE7Pj4lZGRmJQ0KZWNoby8uc2V0IEZvbGRlckZpbGVDb3VudFRocmVzaG9sZD0wOz4+JWRkZiUNCmVjaG8vLnNldCBGb2xkZXJTaXplVGhyZXNo b2xkPTA7Pj4lZGRmJQ0KZWNoby8uc2V0IEdlbmVyYXRlSW5mPU9GRj4+JWRkZiUNCmVjaG8vLnNldCBJbmZGaWxlTmFtZT1udWw+PiVkZGYlDQplY2hvLy5z ZXQgTWF4Q2FiaW5ldFNpemU9MDs+PiVkZGYlDQplY2hvLy5zZXQgTWF4RGlza0ZpbGVDb3VudD0wOz4+JWRkZiUNCmVjaG8vLnNldCBNYXhEaXNrU2l6ZT0w Oz4+JWRkZiUNCmVjaG8vLnNldCBNYXhFcnJvcnM9MTs+PiVkZGYlDQplY2hvLy5zZXQgUnB0RmlsZU5hbWU9bnVsPj4lZGRmJQ0KZWNoby8uc2V0IFVuaXF1 ZUZpbGVzPU9OPj4lZGRmJQ0KZm9yIC9mICJ0b2tlbnM9KiBkZWxpbXM9IiAlJUQgaW4gKCdkaXIgL2E6LUQvYi9zICIlU3lzdGVtUm9vdCVcbG9nc1wlMSIn KSBkbyAoDQogZWNoby8iJSV+ZkQiICAvaW5mPW5vOz4+JWRkZiUNCikNCm1ha2VjYWIgL0YgJWRkZiUgL0QgRGlza0RpcmVjdG9yeTE9IiIgL0QgQ2FiaW5l dE5hbWVUZW1wbGF0ZT0iIWRlc2t0b3AhXCUyXyVfdGltZSUuY2FiIg0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0NCg0KOmNoZWNrcGVybXMNCg0KOjogIFRoaXMgY29kZSBjaGVja3MgaWYgU1BQIGhhcyBwZXJtaXNzaW9uIGFjY2VzcyB0byB0b2tlbnMg Zm9sZGVyIGFuZCByZXF1aXJlZCByZWdpc3RyeSBrZXlzLiBJbmNvcnJlY3QgcGVybWlzc2lvbnMgYXJlIG9mdGVuIHNldCBieSBnYW1pbmcgc3Bvb2ZlcnMu DQoNCnNldCBwZXJtZXJyb3I9DQppZiBub3QgZXhpc3QgIiV0b2tlbnN0b3JlJVwiIHNldCAicGVybWVycm9yPUVycm9yIEZvdW5kIEluIFRva2VuIEZvbGRl ciINCg0KaWYgZGVmaW5lZCBwczMyb25Bcm0gZXhpdCAvYg0KDQpmb3IgJSUjIGluICgNCiIldG9rZW5zdG9yZSUrRnVsbENvbnRyb2wiDQoiSEtMTTpcU1lT VEVNXFdQQStRdWVyeVZhbHVlcywgRW51bWVyYXRlU3ViS2V5cywgV3JpdGVLZXkiDQoiSEtMTTpcU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3Vy cmVudFZlcnNpb25cU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0rU2V0VmFsdWUiDQopIGRvIGZvciAvZiAidG9rZW5zPTEsMiBkZWxpbXM9KyIgJSVBIGlu ICglJSMpIGRvIGlmIG5vdCBkZWZpbmVkIHBlcm1lcnJvciAoDQolcHNjJSAiJGFjbCA9IChHZXQtQWNsICclJUEnIHwgZmwgfCBPdXQtU3RyaW5nKTsgaWYg KC1ub3QgKCRhY2wgLW1hdGNoICdOVCBTRVJWSUNFXFxzcHBzdmMgQWxsb3cgICUlQicpIC1vciAoJGFjbCAtbWF0Y2ggJ05UIFNFUlZJQ0VcXHNwcHN2YyBE ZW55JykpIHtFeGl0IDJ9IiAlbnVsJQ0KaWYgIWVycm9ybGV2ZWwhPT0yICgNCmlmICIlJUEiPT0iJXRva2Vuc3RvcmUlIiAoDQpzZXQgInBlcm1lcnJvcj1F cnJvciBGb3VuZCBJbiBUb2tlbiBGb2xkZXIiDQopIGVsc2UgKA0Kc2V0ICJwZXJtZXJyb3I9RXJyb3IgRm91bmQgSW4gU1BQIFJlZ2lzdHJpZXMiDQopDQop DQopDQoNClJFTSAgaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL29mZmljZS90cm91Ymxlc2hvb3QvYWN0aXZhdGlvbi9saWNlbnNlLWlzc3Vl LXdoZW4tc3RhcnQtb2ZmaWNlLWFwcGxpY2F0aW9uDQoNCmlmIG5vdCBkZWZpbmVkIHBlcm1lcnJvciAoDQpyZWcgcXVlcnkgIkhLVVxTLTEtNS0yMFxTb2Z0 d2FyZVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgJW51bCUgJiYgKA0Kc2V0ICJwb2w9SEtVXFMtMS01LTIwXFNvZnR3YXJlXE1pY3Jv c29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXFBvbGljaWVzIg0KcmVnIHF1ZXJ5ICIhcG9sISIgJW51 bCUgfHwgcmVnIGFkZCAiIXBvbCEiICVudWwlDQolcHNjJSAiJG5ldFNlcnYgPSAoTmV3LU9iamVjdCBTZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVu dGlmaWVyKCdTLTEtNS0yMCcpKS5UcmFuc2xhdGUoW1NlY3VyaXR5LlByaW5jaXBhbC5OVEFjY291bnRdKS5WYWx1ZTsgJGFjbFN0cmluZyA9IEdldC1BY2wg J1JlZ2lzdHJ5OjohcG9sIScgfCBGb3JtYXQtTGlzdCB8IE91dC1TdHJpbmc7IGlmICgtbm90ICgkYWNsU3RyaW5nLkNvbnRhaW5zKCRuZXRTZXJ2ICsgJyBB bGxvdyAgRnVsbENvbnRyb2wnKSAtb3IgJGFjbFN0cmluZy5Db250YWlucygnTlQgU0VSVklDRVxzcHBzdmMgQWxsb3cgIEZ1bGxDb250cm9sJykpIC1vciAo JGFjbFN0cmluZy5Db250YWlucygnRGVueScpKSkge0V4aXQgM30iICVudWwlDQppZiAhZXJyb3JsZXZlbCE9PTMgc2V0ICJwZXJtZXJyb3I9RXJyb3IgRm91 bmQgSW4gUy0xLTUtMjAgU1BQIg0KKQ0KKQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0K OjogIEZpeCBTUFAgcmVsYXRlZCByZWdpc3RyeSBhbmQgZm9sZGVyIHBlcm1pc3Npb25zDQoNCjpmaXhzcHBwZXJtczoNCiMgRml4IHBlcm1zIGZvciBUb2tl biBGb2xkZXINCg0KaWYgKCRlbnY6cGVybWVycm9yIC1lcSAnRXJyb3IgRm91bmQgSW4gVG9rZW4gRm9sZGVyJykgew0KICAgIE5ldy1JdGVtIC1QYXRoICRl bnY6dG9rZW5zdG9yZSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Gb3JjZQ0KICAgICRzZGRsID0gJ086QkFHOkJBRDpQQUkoQTtPSUNJO0ZBOzs7U1kpKEE7T0lD STtGQTs7O0JBKShBO09JQ0lJTztHUjs7O0JVKShBOztGUjs7O0JVKShBO09JQ0k7RkE7OztTLTEtNS04MC0xMjMyMzEyMTYtMjU5Mjg4MzY1MS0zNzE1Mjcx MzY3LTM3NTMxNTE2MzEtNDE3NTkwNjYyOCknDQogICAgJEFjbE9iamVjdCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRGly ZWN0b3J5U2VjdXJpdHkNCiAgICAkQWNsT2JqZWN0LlNldFNlY3VyaXR5RGVzY3JpcHRvclNkZGxGb3JtKCRzZGRsKQ0KICAgIFNldC1BY2wgLVBhdGggJGVu djp0b2tlbnN0b3JlIC1BY2xPYmplY3QgJEFjbE9iamVjdA0KICAgIGV4aXQNCn0NCg0KIyBGaXggcGVybXMgZm9yIFNQUCByZWdpc3RyaWVzDQoNCmlmICgk ZW52OnBlcm1lcnJvciAtZXEgJ0Vycm9yIEZvdW5kIEluIFNQUCBSZWdpc3RyaWVzJykgew0KICAgICRhY2wgPSBHZXQtQWNsICdIS0xNOlxTWVNURU1cV1BB Jw0KICAgICRydWxlID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5SZWdpc3RyeUFjY2Vzc1J1bGUgKCdOVCBTZXJ2aWNlXHNw cHN2YycsICdRdWVyeVZhbHVlcywgRW51bWVyYXRlU3ViS2V5cywgV3JpdGVLZXknLCAnQ29udGFpbmVySW5oZXJpdCwgT2JqZWN0SW5oZXJpdCcsICdOb25l JywgJ0FsbG93JykNCiAgICAkYWNsLlJlc2V0QWNjZXNzUnVsZSgkcnVsZSkNCiAgICAkYWNsLlNldEFjY2Vzc1J1bGUoJHJ1bGUpDQogICAgU2V0LUFjbCAt UGF0aCAnSEtMTTpcU1lTVEVNXFdQQScgLUFjbE9iamVjdCAkYWNsDQoJDQogICAgJGFjbCA9IEdldC1BY2wgJ0hLTE06XFNPRlRXQVJFXE1pY3Jvc29mdFxX aW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9uXFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtJw0KICAgICRydWxlID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJp dHkuQWNjZXNzQ29udHJvbC5SZWdpc3RyeUFjY2Vzc1J1bGUgKCdOVCBTZXJ2aWNlXHNwcHN2YycsICdTZXRWYWx1ZScsICdDb250YWluZXJJbmhlcml0LCBP YmplY3RJbmhlcml0JywgJ05vbmUnLCAnQWxsb3cnKQ0KICAgICRhY2wuUmVzZXRBY2Nlc3NSdWxlKCRydWxlKQ0KICAgICRhY2wuU2V0QWNjZXNzUnVsZSgk cnVsZSkNCiAgICBTZXQtQWNsIC1QYXRoICdIS0xNOlxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTb2Z0d2FyZVByb3Rl Y3Rpb25QbGF0Zm9ybScgLUFjbE9iamVjdCAkYWNsDQogICAgZXhpdA0KfQ0KDQojIEZpeCBwZXJtcyBmb3IgU1BQIGluIEhLVVxTLTEtNS0yMA0KIyBodHRw czovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvb2ZmaWNlL3Ryb3VibGVzaG9vdC9hY3RpdmF0aW9uL2xpY2Vuc2UtaXNzdWUtd2hlbi1zdGFydC1vZmZp Y2UtYXBwbGljYXRpb24NCg0KaWYgKCRlbnY6cGVybWVycm9yIC1uZSAnRXJyb3IgRm91bmQgSW4gUy0xLTUtMjAgU1BQJykgew0KICAgIGV4aXQNCn0NCmlm ICgtbm90IChUZXN0LVBhdGggJ1JlZ2lzdHJ5OjpIS1VcUy0xLTUtMjBcU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cU29m dHdhcmVQcm90ZWN0aW9uUGxhdGZvcm0nKSkgew0KICAgIGV4aXQNCn0NCg0KIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzU4NDM0MjANCg0KZnVu Y3Rpb24gVGFrZS1QZXJtaXNzaW9ucyB7DQogICAgcGFyYW0oJHJvb3RLZXksICRrZXksIFtTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRl bnRpZmllcl0kc2lkID0gJ1MtMS01LTMyLTU0NScsICRyZWN1cnNlID0gJHRydWUpDQogICAgDQogICAgc3dpdGNoIC1yZWdleCAoJHJvb3RLZXkpIHsNCiAg ICAgICAgJ0hLQ1V8SEtFWV9DVVJSRU5UX1VTRVInIHsgJHJvb3RLZXkgPSAnQ3VycmVudFVzZXInIH0NCiAgICAgICAgJ0hLTE18SEtFWV9MT0NBTF9NQUNI SU5FJyB7ICRyb290S2V5ID0gJ0xvY2FsTWFjaGluZScgfQ0KICAgICAgICAnSEtDUnxIS0VZX0NMQVNTRVNfUk9PVCcgeyAkcm9vdEtleSA9ICdDbGFzc2Vz Um9vdCcgfQ0KICAgICAgICAnSEtDQ3xIS0VZX0NVUlJFTlRfQ09ORklHJyB7ICRyb290S2V5ID0gJ0N1cnJlbnRDb25maWcnIH0NCiAgICAgICAgJ0hLVXxI S0VZX1VTRVJTJyB7ICRyb290S2V5ID0gJ1VzZXJzJyB9DQogICAgfQ0KDQogICAgIyMjIFN0ZXAgMSAtIGVzY2FsYXRlIGN1cnJlbnQgcHJvY2VzcydzIHBy aXZpbGVnZQ0KICAgICMgZ2V0IFNlVGFrZU93bmVyc2hpcCwgU2VCYWNrdXAgYW5kIFNlUmVzdG9yZSBwcml2aWxlZ2VzIGJlZm9yZSBleGVjdXRlcyBuZXh0 IGxpbmVzLCBzY3JpcHQgbmVlZHMgQWRtaW4gcHJpdmlsZWdlDQogICAgJEFzc2VtYmx5QnVpbGRlciA9IFtBcHBEb21haW5dOjpDdXJyZW50RG9tYWluLkRl ZmluZUR5bmFtaWNBc3NlbWJseSg0LCAxKQ0KICAgICRNb2R1bGVCdWlsZGVyID0gJEFzc2VtYmx5QnVpbGRlci5EZWZpbmVEeW5hbWljTW9kdWxlKDIsICRG YWxzZSkNCiAgICAkVHlwZUJ1aWxkZXIgPSAkTW9kdWxlQnVpbGRlci5EZWZpbmVUeXBlKDApDQogICAgJFR5cGVCdWlsZGVyLkRlZmluZVBJbnZva2VNZXRo b2QoJ1J0bEFkanVzdFByaXZpbGVnZScsICdudGRsbC5kbGwnLCAnUHVibGljLCBTdGF0aWMnLCAxLCBbaW50XSwgQChbaW50XSwgW2Jvb2xdLCBbYm9vbF0s IFtib29sXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKSB8IE91dC1OdWxsDQogICAgOSwgMTcsIDE4IHwgRm9yRWFjaC1PYmplY3QgeyAkVHlwZUJ1aWxkZXIu Q3JlYXRlVHlwZSgpOjpSdGxBZGp1c3RQcml2aWxlZ2UoJF8sICR0cnVlLCAkZmFsc2UsIFtyZWZdJGZhbHNlKSB8IE91dC1OdWxsIH0NCg0KICAgIGZ1bmN0 aW9uIFRha2UtS2V5UGVybWlzc2lvbnMgew0KICAgICAgICBwYXJhbSgkcm9vdEtleSwgJGtleSwgJHNpZCwgJHJlY3Vyc2UsICRyZWN1cnNlTGV2ZWwgPSAw KQ0KDQogICAgICAgICMjIyBTdGVwIDIgLSBnZXQgb3duZXJzaGlwcyBvZiBrZXkgLSBpdCB3b3JrcyBvbmx5IGZvciBjdXJyZW50IGtleQ0KICAgICAgICAk cmVnS2V5ID0gW01pY3Jvc29mdC5XaW4zMi5SZWdpc3RyeV06OiRyb290S2V5Lk9wZW5TdWJLZXkoJGtleSwgJ1JlYWRXcml0ZVN1YlRyZWUnLCAnVGFrZU93 bmVyc2hpcCcpDQogICAgICAgICRhY2wgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLlJlZ2lzdHJ5U2VjdXJpdHkNCiAgICAg ICAgJGFjbC5TZXRPd25lcigkc2lkKQ0KICAgICAgICAkcmVnS2V5LlNldEFjY2Vzc0NvbnRyb2woJGFjbCkNCg0KICAgICAgICAjIyMgU3RlcCAzIC0gZW5h YmxlIGluaGVyaXRhbmNlIG9mIHBlcm1pc3Npb25zIChub3Qgb3duZXJzaGlwKSBmb3IgY3VycmVudCBrZXkgZnJvbSBwYXJlbnQNCiAgICAgICAgJGFjbC5T ZXRBY2Nlc3NSdWxlUHJvdGVjdGlvbigkZmFsc2UsICRmYWxzZSkNCiAgICAgICAgJHJlZ0tleS5TZXRBY2Nlc3NDb250cm9sKCRhY2wpDQoNCiAgICAgICAg IyMjIFN0ZXAgNCAtIG9ubHkgZm9yIHRvcC1sZXZlbCBrZXksIGNoYW5nZSBwZXJtaXNzaW9ucyBmb3IgY3VycmVudCBrZXkgYW5kIHByb3BhZ2F0ZSBpdCBm b3Igc3Via2V5cw0KICAgICAgICAjIHRvIGVuYWJsZSBwcm9wYWdhdGlvbnMgZm9yIHN1YmtleXMsIGl0IG5lZWRzIHRvIGV4ZWN1dGUgU3RlcHMgMi0zIGZv ciBlYWNoIHN1YmtleSAoU3RlcCA1KQ0KICAgICAgICBpZiAoJHJlY3Vyc2VMZXZlbCAtZXEgMCkgew0KICAgICAgICAgICAgJHJlZ0tleSA9ICRyZWdLZXku T3BlblN1YktleSgnJywgJ1JlYWRXcml0ZVN1YlRyZWUnLCAnQ2hhbmdlUGVybWlzc2lvbnMnKQ0KICAgICAgICAgICAgJHJ1bGUgPSBOZXctT2JqZWN0IFN5 c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLlJlZ2lzdHJ5QWNjZXNzUnVsZSgkc2lkLCAnRnVsbENvbnRyb2wnLCAnQ29udGFpbmVySW5oZXJpdCcsICdO b25lJywgJ0FsbG93JykNCiAgICAgICAgICAgICRhY2wuUmVzZXRBY2Nlc3NSdWxlKCRydWxlKQ0KICAgICAgICAgICAgJHJlZ0tleS5TZXRBY2Nlc3NDb250 cm9sKCRhY2wpDQogICAgICAgIH0NCg0KICAgICAgICAjIyMgU3RlcCA1IC0gcmVjdXJzaXZlbHkgcmVwZWF0IHN0ZXBzIDItNSBmb3Igc3Via2V5cw0KICAg ICAgICBpZiAoJHJlY3Vyc2UpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRzdWJLZXkgaW4gJHJlZ0tleS5PcGVuU3ViS2V5KCcnKS5HZXRTdWJLZXlOYW1l cygpKSB7DQogICAgICAgICAgICAgICAgVGFrZS1LZXlQZXJtaXNzaW9ucyAkcm9vdEtleSAoJGtleSArICdcJyArICRzdWJLZXkpICRzaWQgJHJlY3Vyc2Ug KCRyZWN1cnNlTGV2ZWwgKyAxKQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgVGFrZS1LZXlQZXJtaXNzaW9ucyAkcm9vdEtleSAk a2V5ICRzaWQgJHJlY3Vyc2UNCn0NCg0KVGFrZS1QZXJtaXNzaW9ucyAiVXNlcnMiICJTLTEtNS0yMFxTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93cyBOVFxD dXJyZW50VmVyc2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybSIgIlMtMS01LTIwIg0KOmZpeHNwcHBlcm1zOg0KDQo6Oj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOnNjYW5kYXQNCg0Kc2V0IHRva2VuPQ0KZm9yICUlIyBpbiAoDQolU3lzUGF0aCVcc3BwXHN0b3Jl X3Rlc3RcMi4wXA0KJVN5c1BhdGglXHNwcFxzdG9yZVwNCiVTeXNQYXRoJVxzcHBcc3RvcmVcMi4wXA0KJVN5c3RlbWRyaXZlJVxXaW5kb3dzXFNlcnZpY2VQ cm9maWxlc1xOZXR3b3JrU2VydmljZVxBcHBEYXRhXFJvYW1pbmdcTWljcm9zb2Z0XFNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXA0KJVN5c3RlbWRyaXZl JVxXaW5kb3dzXFNlcnZpY2VQcm9maWxlc1xOZXR3b3JrU2VydmljZVxBcHBEYXRhXFJvYW1pbmdcTWljcm9zb2Z0XFNvZnR3YXJlTGljZW5zaW5nXA0KKSBk byAoDQoNCmlmICUxPT1jaGVjayAoDQppZiBleGlzdCAlJSN0b2tlbnMuZGF0IHNldCB0b2tlbj0lJSN0b2tlbnMuZGF0DQopDQoNCmlmICUxPT1kZWxldGUg KA0KaWYgZXhpc3QgJSUjICgNCiVudWwlIGRpciAvYS1kIC9zICIlJSMqLmRhdCIgJiYgKA0KYXR0cmliIC1yIC1zIC1oICIlJSMqLmRhdCIgL1MNCmRlbCAv UyAvRiAvUSAiJSUjKi5kYXQiDQopDQopDQopDQopDQpleGl0IC9iDQoNCjpzY2FuZGF0b3NwcA0KDQpzZXQgdG9rZW49DQpmb3IgJSUjIGluICgNCiVQcm9n cmFtRGF0YSVcTWljcm9zb2Z0XE9mZmljZVNvZnR3YXJlUHJvdGVjdGlvblBsYXRmb3JtXA0KKSBkbyAoDQoNCmlmICUxPT1jaGVjayAoDQppZiBleGlzdCAl JSN0b2tlbnMuZGF0IHNldCB0b2tlbj0lJSN0b2tlbnMuZGF0DQopDQoNCmlmICUxPT1kZWxldGUgKA0KaWYgZXhpc3QgJSUjICgNCiVudWwlIGRpciAvYS1k IC9zICIlJSMqLmRhdCIgJiYgKA0KYXR0cmliIC1yIC1zIC1oICIlJSMqLmRhdCIgL1MNCmRlbCAvUyAvRiAvUSAiJSUjKi5kYXQiDQopDQopDQopDQopDQpl eGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6cmVnb3duc3RhcnQNCg0KJXBzYyUgIiRmPVtJ Ty5GaWxlXTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzpyZWdvd25cOi4qJzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKTsiDQpl eGl0IC9iDQoNCjo6ICBCZWxvdyBjb2RlIHRha2VzIG93bmVyc2hpcCBvZiBhIHZvbGF0aWxlIHJlZ2lzdHJ5IGtleSBhbmQgZGVsZXRlcyBpdA0KOjogIEhL TE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb25cQ2xpcFNWQ1xWb2xhdGlsZVxQZXJzaXN0ZWRTeXN0ZW1TdGF0ZQ0KDQo6 cmVnb3duOg0KJEFzc2VtYmx5QnVpbGRlciA9IFtBcHBEb21haW5dOjpDdXJyZW50RG9tYWluLkRlZmluZUR5bmFtaWNBc3NlbWJseSg0LCAxKQ0KJE1vZHVs ZUJ1aWxkZXIgPSAkQXNzZW1ibHlCdWlsZGVyLkRlZmluZUR5bmFtaWNNb2R1bGUoMiwgJEZhbHNlKQ0KJFR5cGVCdWlsZGVyID0gJE1vZHVsZUJ1aWxkZXIu RGVmaW5lVHlwZSgwKQ0KDQokVHlwZUJ1aWxkZXIuRGVmaW5lUEludm9rZU1ldGhvZCgnUnRsQWRqdXN0UHJpdmlsZWdlJywgJ250ZGxsLmRsbCcsICdQdWJs aWMsIFN0YXRpYycsIDEsIFtpbnRdLCBAKFtpbnRdLCBbYm9vbF0sIFtib29sXSwgW2Jvb2xdLk1ha2VCeVJlZlR5cGUoKSksIDEsIDMpIHwgT3V0LU51bGwN CiRUeXBlQnVpbGRlci5DcmVhdGVUeXBlKCk6OlJ0bEFkanVzdFByaXZpbGVnZSg5LCAkdHJ1ZSwgJGZhbHNlLCBbcmVmXSRmYWxzZSkgfCBPdXQtTnVsbA0K DQokU0lEID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ0JykNCiRJRE4gPSAo JFNJRC5UcmFuc2xhdGUoW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuTlRBY2NvdW50XSkpLlZhbHVlDQokQWRtaW4gPSBOZXctT2JqZWN0IFN5c3RlbS5T ZWN1cml0eS5QcmluY2lwYWwuTlRBY2NvdW50KCRJRE4pDQoNCiRwYXRoID0gJ1NPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1cnJlbnRWZXJzaW9u XENsaXBTVkNcVm9sYXRpbGVcUGVyc2lzdGVkU3lzdGVtU3RhdGUnDQoka2V5ID0gW01pY3Jvc29mdC5XaW4zMi5SZWdpc3RyeUtleV06Ok9wZW5CYXNlS2V5 KCdMb2NhbE1hY2hpbmUnLCAnUmVnaXN0cnk2NCcpLk9wZW5TdWJLZXkoJHBhdGgsICdSZWFkV3JpdGVTdWJUcmVlJywgJ3Rha2Vvd25lcnNoaXAnKQ0KDQok YWNsID0gJGtleS5HZXRBY2Nlc3NDb250cm9sKCkNCiRhY2wuU2V0T3duZXIoJEFkbWluKQ0KJGtleS5TZXRBY2Nlc3NDb250cm9sKCRhY2wpDQoNCiRydWxl ID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5SZWdpc3RyeUFjY2Vzc1J1bGUoJEFkbWluLCJGdWxsQ29udHJvbCIsIkFsbG93 IikNCiRhY2wuU2V0QWNjZXNzUnVsZSgkcnVsZSkNCiRrZXkuU2V0QWNjZXNzQ29udHJvbCgkYWNsKQ0KOnJlZ293bjoNCg0KOjo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBUaGlzIGNvZGUgcnVucyB0byB1bmRvIGJlbG93IHJlZ2lzdHJ5IGtleSBLTVMzOCBwcm90 ZWN0aW9uDQo6OiAgSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvblxTb2Z0d2FyZVByb3RlY3Rpb25QbGF0Zm9ybVw1 NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYNCg0KOjogIFRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkIGluIEtNUzM4IGFueW1vcmUsIGl0J3Mg aGVyZSBvbmx5IHRvIHJlbW92ZSBwcmV2aW91cyB2ZXJzaW9ucyBwcm90ZWN0aW9uLg0KDQo6cmVnZGVsOg0KcGFyYW0gKA0KICAgIFtzd2l0Y2hdJHByb3Rl Y3QNCikNCg0KJFNJRCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NCcpDQok QWRtaW4gPSAoJFNJRC5UcmFuc2xhdGUoW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuTlRBY2NvdW50XSkpLlZhbHVlDQoNCmlmKCRwcm90ZWN0KSB7DQok cnVsZUFyZ3MgPSBAKCIkQWRtaW4iLCAiRGVsZXRlLCBTZXRWYWx1ZSIsICJDb250YWluZXJJbmhlcml0IiwgIk5vbmUiLCAiRGVueSIpDQp9IGVsc2Ugew0K JHJ1bGVBcmdzID0gQCgiJEFkbWluIiwgIkZ1bGxDb250cm9sIiwgIkFsbG93IikNCn0NCg0KJHBhdGggPSAnU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3Mg TlRcQ3VycmVudFZlcnNpb25cU29mdHdhcmVQcm90ZWN0aW9uUGxhdGZvcm1cNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmJw0KJGtleSA9 IFtNaWNyb3NvZnQuV2luMzIuUmVnaXN0cnlLZXldOjpPcGVuQmFzZUtleSgnTG9jYWxNYWNoaW5lJywgJ1JlZ2lzdHJ5NjQnKS5PcGVuU3ViS2V5KCRwYXRo LCAnUmVhZFdyaXRlU3ViVHJlZScsICdDaGFuZ2VQZXJtaXNzaW9ucycpDQokYWNsID0gJGtleS5HZXRBY2Nlc3NDb250cm9sKCkNCg0KJHJ1bGUgPSBbU3lz dGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuUmVnaXN0cnlBY2Nlc3NSdWxlXTo6bmV3Lkludm9rZSgkcnVsZUFyZ3MpDQokYWNsLlJlc2V0QWNjZXNzUnVs ZSgkcnVsZSkNCiRrZXkuU2V0QWNjZXNzQ29udHJvbCgkYWNsKQ0KOnJlZ2RlbDoNCg0KOisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrDQoNCjpjaGFuZ2Vfd2luZWRpdGlvbg0KDQo6OiAgVG8gc3RhZ2UgY3VycmVudCBlZGl0aW9uIHdoaWxlIGNoYW5naW5nIGVkaXRpb24gd2l0 aCBDQlMgVXBncmFkZSBNZXRob2QsIGNoYW5nZSAwIHRvIDEgaW4gYmVsb3cgbGluZQ0Kc2V0IF9zdGc9MA0KDQpzZXQgImxpbmU9ZWNobyBfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIg0KDQpjbHMN CmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsIG1vZGUgOTgsIDMwDQp0aXRsZSAgQ2hhbmdlIFdpbmRvd3MgRWRpdGlvbiAlbWFzdmVyJQ0KDQppZiAld2luYnVp bGQlIExTUyA3NjAwICgNCiVlbGluZSUNCmVjaG8gVW5zdXBwb3J0ZWQgT1MgdmVyc2lvbiBkZXRlY3RlZCBbJXdpbmJ1aWxkJV0uDQplY2hvIFRoaXMgb3B0 aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBXaW5kb3dzIDcvOC84LjEvMTAvMTEgYW5kIHRoZWlyIFNlcnZlciBlcXVpdmFsZW50cy4NCmdvdG8gZGtfZG9u ZQ0KKQ0KDQplY2hvOg0KZWNobyBJbml0aWFsaXppbmcuLi4NCmVjaG86DQoNCmZvciAlJSMgaW4gKA0Kc3Bwc3ZjLmV4ZQ0KZGlzbS5leGUNCikgZG8gKA0K aWYgbm90IGV4aXN0ICVTeXNQYXRoJVwlJSMgKA0KJWVsaW5lJQ0KZWNobyBbJVN5c1BhdGglXCUlI10gZmlsZSBpcyBtaXNzaW5nLCBhYm9ydGluZy4uLg0K Y2FsbCA6ZGtfY29sb3IgJUJsdWUlICJHbyBiYWNrIHRvIE1haW4gTWVudSwgc2VsZWN0IFRyb3VibGVzaG9vdCBhbmQgcnVuIERJU00gUmVzdG9yZSBhbmQg U0ZDIFNjYW4gb3B0aW9ucy4iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkFmdGVyIHRoYXQsIHJlc3RhcnQgc3lzdGVtIGFuZCB0cnkgYWN0aXZhdGlvbiBh Z2Fpbi4iDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJWluLXBsYWNlX3JlcGFpcl91cGdyYWRlDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJJZiBpdCBzdGls bCBzaG93cyB0aGUgc2FtZSBlcnJvciwgZG8gdGhpcyAtICIgJV9ZZWxsb3clICIgJW1hcyVpbi1wbGFjZV9yZXBhaXJfdXBncmFkZSINCmdvdG8gZGtfZG9u ZQ0KKQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0Kc2V0IHNwcD1Tb2Z0d2FyZUxpY2Vuc2luZ1By b2R1Y3QNCnNldCBzcHM9U29mdHdhcmVMaWNlbnNpbmdTZXJ2aWNlDQoNCmNhbGwgOmRrX3JlZmxlY3Rpb24NCmNhbGwgOmRrX2NrZWNrd21pYw0KY2FsbCA6 ZGtfc3BwaXNzdWUNCg0KZm9yIC9mICJ0b2tlbnM9Ni03IGRlbGltcz1bXS4gIiAlJWkgaW4gKCd2ZXInKSBkbyBpZiBub3QgIiUlaiI9PSIiICgNCnNldCBm dWxsYnVpbGQ9JSVpLiUlag0KKSBlbHNlICgNCmZvciAvZiAidG9rZW5zPTMiICUlRyBpbiAoJyJyZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0 XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb24iIC92IFVCUiIgJW51bDYlJykgZG8gaWYgbm90IGVycm9ybGV2ZWwgMSBzZXQgL2EgIlVCUj0lJUciDQpmb3Ig L2YgInNraXA9MiB0b2tlbnM9Myw0IGRlbGltcz0uICIgJSVHIGluICgncmVnIHF1ZXJ5ICJIS0xNXFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzIE5UXEN1 cnJlbnRWZXJzaW9uIiAvdiBCdWlsZExhYkV4JykgZG8gKA0KaWYgZGVmaW5lZCBVQlIgKHNldCAiZnVsbGJ1aWxkPSUlRy4hVUJSISIpIGVsc2UgKHNldCAi ZnVsbGJ1aWxkPSUlRy4lJUgiKQ0KKQ0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNr IEFjdGl2YXRpb24gSURzDQoNCmNhbGwgOmRrX2FjdGlkcyA1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYNCmlmIG5vdCBkZWZpbmVkIGFs bGFwcHMgKA0KJWVsaW5lJQ0KZWNobyBGYWlsZWQgdG8gZmluZCBhY3RpdmF0aW9uIElEcy4gQWJvcnRpbmcuLi4NCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAi VG8gZml4IHRoaXMgaXNzdWUsIGFjdGl2YXRlIFdpbmRvd3MgZnJvbSB0aGUgbWFpbiBtZW51LiINCmdvdG8gZGtfZG9uZQ0KKQ0KDQo6Oj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIFdpbmRvd3MgRWRpdGlvbiBhbmQgYnJhbmNoDQoNCnNldCBvc2VkaXRp b249DQpzZXQgZGlzbW5vdHdvcmtpbmc9DQoNCmZvciAvZiAidG9rZW5zPTMgZGVsaW1zPTogIiAlJWEgaW4gKCdESVNNIC9FbmdsaXNoIC9PbmxpbmUgL0dl dC1DdXJyZW50RWRpdGlvbiAlbnVsNiUgXnwgZmluZCAvaSAiQ3VycmVudCBFZGl0aW9uIDoiJykgZG8gc2V0ICJvc2VkaXRpb249JSVhIg0KaWYgbm90IGRl ZmluZWQgb3NlZGl0aW9uIHNldCBkaXNtbm90d29ya2luZz0xDQoNCmlmICVfd21pYyUgRVFVIDEgc2V0ICJjaGtlZGk9Zm9yIC9mICJ0b2tlbnM9MiBkZWxp bXM9PSIgJSVhIGluICgnIndtaWMgcGF0aCAlc3BwJSB3aGVyZSAoQXBwbGljYXRpb25JRD0nNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlm JyBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBOVUxMIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVMTCkgZ2V0IExpY2Vuc2VGYW1pbHkgL1ZBTFVF IiAlbnVsNiUnKSINCmlmICVfd21pYyUgRVFVIDAgc2V0ICJjaGtlZGk9Zm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSVhIGluICgnJXBzYyUgIigoW1dN SVNFQVJDSEVSXSdTRUxFQ1QgTGljZW5zZUZhbWlseSBGUk9NICVzcHAlIFdIRVJFIEFwcGxpY2F0aW9uSUQ9Jyc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1k NmVjM2YxNjA1OWYnJyBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBOVUxMIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVMTCcpLkdldCgpKS5MaWNl bnNlRmFtaWx5IF58ICUlIHtlY2hvICgnTGljZW5zZUZhbWlseT0nKyRfKX0iICVudWw2JScpIg0KaWYgbm90IGRlZmluZWQgb3NlZGl0aW9uICVjaGtlZGkl IGRvIGlmIG5vdCBlcnJvcmxldmVsIDEgKGNhbGwgc2V0ICJvc2VkaXRpb249JSVhIikNCg0KaWYgbm90IGRlZmluZWQgb3NlZGl0aW9uICgNCiVlbGluZSUN CmVjaG8gRmFpbGVkIHRvIGRldGVjdCBPUyBlZGl0aW9uLCBhYm9ydGluZy4uLg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJUbyBmaXggdGhpcyBpc3N1ZSwg YWN0aXZhdGUgV2luZG93cyBmcm9tIHRoZSBtYWluIG1lbnUuIg0KZ290byBka19kb25lDQopDQoNCmZvciAvZiAic2tpcD0yIHRva2Vucz0zIiAlJWEgaW4g KCdyZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3MgTlRcQ3VycmVudFZlcnNpb24iIC92IEVkaXRpb25JRCAlbnVsNiUnKSBkbyBz ZXQgInJlZ2VkaXRpb249JSVhIg0KaWYgL2kgbm90ICIlb3NlZGl0aW9uJSI9PSIlcmVnZWRpdGlvbiUiICgNCnNldCAic2hvd2VkaXRpb25lcnJvcj1jYWxs IDpka19jb2xvciAlX1llbGxvdyUgIlslb3NlZGl0aW9uJV0gW1JlZy0lcmVnZWRpdGlvbiVdLiIiDQopDQoNCnNldCBicmFuY2g9DQpmb3IgL2YgInNraXA9 MiB0b2tlbnM9MioiICUlYSBpbiAoJ3JlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgL3YgQnVp bGRCcmFuY2ggJW51bDYlJykgZG8gc2V0ICJicmFuY2g9JSViIg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N Cg0KOjogIEdldCB0YXJnZXQgZWRpdGlvbnMgbGlzdA0KDQpzZXQgX3RhcmdldD0NCnNldCBfZHRhcmdldD0NCnNldCBfcHRhcmdldD0NCnNldCBfbnRhcmdl dD0NCnNldCBfd3RhcmdldD0NCg0KaWYgJXdpbmJ1aWxkJSBHRVEgMTAyNDAgZm9yIC9mICJ0b2tlbnM9NCIgJSVhIGluICgnZGlzbSAvb25saW5lIC9lbmds aXNoIC9HZXQtVGFyZ2V0RWRpdGlvbnMgXnwgZmluZHN0ciAvaSAvYzoiVGFyZ2V0IEVkaXRpb24gOiAiJykgZG8gKGlmIGRlZmluZWQgX2R0YXJnZXQgKHNl dCAiX2R0YXJnZXQ9ICFfZHRhcmdldCEgJSVhICIpIGVsc2UgKHNldCAiX2R0YXJnZXQ9ICUlYSAiKSkNCmlmICV3aW5idWlsZCUgTFNTIDEwMjQwIGZvciAv ZiAidG9rZW5zPTQiICUlYSBpbiAoJyVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0ICc6Y2JzeG1sXDouKic7LiAo W3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSkgLUdldFRhcmdldEVkaXRpb25zOyIgXnwgZmluZHN0ciAvaSAvYzoiVGFyZ2V0IEVkaXRpb24gOiAiJykg ZG8gKGlmIGRlZmluZWQgX3B0YXJnZXQgKHNldCAiX3B0YXJnZXQ9ICFfcHRhcmdldCEgJSVhICIpIGVsc2UgKHNldCAiX3B0YXJnZXQ9ICUlYSAiKSkNCg0K aWYgJXdpbmJ1aWxkJSBHRVEgMTAyNDAgaWYgbm90IGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2thZ2VzXE1pY3Jvc29mdC1XaW5kb3dzLVNl cnZlcipFZGl0aW9ufioubXVtIiAoDQppZiAld2luYnVpbGQlIEdFUSAxNzA2MyBjYWxsIDpjZWRfZWRpbGlzdA0KaWYgL2kgIiVvc2VkaXRpb246fjAsNCUi PT0iQ29yZSIgc2V0IF9wcm89UHJvZmVzc2lvbmFsDQppZiAvaSAiJW9zZWRpdGlvbiUiPT0iQ29yZU4iIHNldCBfcHJvPVByb2Zlc3Npb25hbE4NCnNldCAi X2R0YXJnZXQ9ICVfZHRhcmdldCUgIV93dGFyZ2V0ISAhX3BybyEgIg0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCg0KZm9yICUlIyBpbiAoQ2xvdWRFZGl0aW9uIENsb3VkRWRpdGlvbk4gU2VydmVyUmRzaCkgZG8gaWYgL2kgJW9zZWRpdGlvbiU9PSUlIyAoDQpj bHMNCmVjaG86DQpjYWxsIDpka19jb2xvciAlUmVkJSAiPT09PSBOb3RlID09PT0iDQplY2hvOg0KZWNobyBbRWRpdGlvbklEOiVvc2VkaXRpb24lIF58ICVm dWxsYnVpbGQlXQ0KZWNobzoNCmVjaG8gQ2hhbmdpbmcgdGhpcyBlZGl0aW9uIG1heSBub3QgcmVtb3ZlICIlb3NlZGl0aW9uJSItc3BlY2lmaWMgZmVhdHVy ZXMuDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICJQcmVzcyBbN10gdG8gY29udGludWUgYW55d2F5Li4uIg0KY2hvaWNlIC9jIDcgL24NCmNs cw0KKQ0KDQpmb3IgJSUjIGluICggJV9kdGFyZ2V0JSAlX3B0YXJnZXQlICkgZG8gaWYgL2kgbm90ICIlJSMiPT0iJW9zZWRpdGlvbiUiICgNCmVjaG8gIiFf dGFyZ2V0ISIgfCBmaW5kIC9pICIgJSUjICIgJW51bDElIHx8IHNldCAiX3RhcmdldD0gIV90YXJnZXQhICUlIyAiDQopDQoNCmlmIGRlZmluZWQgX3Rhcmdl dCAoDQpmb3IgJSUjIGluICglX3RhcmdldCUpIGRvICgNCmVjaG8gJSUjIHwgZmluZHN0ciAvaSAiQ291bnRyeVNwZWNpZmljIENsb3VkRWRpdGlvbiIgJW51 bCUgfHwgKHNldCAiX250YXJnZXQ9IV9udGFyZ2V0ISAlJSMiKQ0KKQ0KKQ0KDQppZiBub3QgZGVmaW5lZCBfbnRhcmdldCAoDQolbGluZSUNCmVjaG86DQpp ZiBkZWZpbmVkIGRpc21ub3R3b3JraW5nIGNhbGwgOmRrX2NvbG9yICVSZWQlICJESVNNLmV4ZSBpcyBub3Qgd29ya2luZy4iDQpjYWxsIDpka19jb2xvciAl R3JheSUgIlRhcmdldCBlZGl0aW9ucyBub3QgZm91bmQuIg0KZWNobyBDdXJyZW50IEVkaXRpb24gWyVvc2VkaXRpb24lIF58ICV3aW5idWlsZCVdIGNhbiBu b3QgYmUgY2hhbmdlZCB0byBhbnkgb3RoZXIgRWRpdGlvbi4NCiVsaW5lJQ0KZ290byBka19kb25lDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6Y2VkbWVudTINCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDk4LCAzMA0Kc2V0IGlucHQ9 DQpzZXQgY291bnRlcj0wDQpzZXQgdmVyaWZpZWQ9MA0Kc2V0IHRhcmdldGVkaXRpb249DQoNCiVsaW5lJQ0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVHcmF5 JSAiWW91IGNhbiBjaGFuZ2UgdGhlIGVkaXRpb24gWyVvc2VkaXRpb24lXSBbJWZ1bGxidWlsZCVdIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nLiINCiVzaG93 ZWRpdGlvbmVycm9yJQ0KaWYgZGVmaW5lZCBkaXNtbm90d29ya2luZyAoDQpjYWxsIDpka19jb2xvciAlX1llbGxvdyUgIk5vdGUgLSBESVNNLmV4ZSBpcyBu b3Qgd29ya2luZy4iDQppZiAvaSAiJW9zZWRpdGlvbjp+MCw0JSI9PSJDb3JlIiBjYWxsIDpka19jb2xvciAlX1llbGxvdyUgIiAgICAgLSBZb3Ugd2lsbCBz ZWUgbW9yZSBlZGl0aW9uIG9wdGlvbnMgdG8gY2hvb3NlIG9uY2UgaXRzIGNoYW5nZWQgdG8gUHJvLiINCikNCiVsaW5lJQ0KZWNobzoNCg0KZm9yICUlQSBp biAoJV9udGFyZ2V0JSkgZG8gKA0Kc2V0IC9hIGNvdW50ZXIrPTENCmlmIC9pICUlQT09SW9URW50ZXJwcmlzZSAoDQplY2hvIFshY291bnRlciFdICAlJUEg W0dBQywgbm90IExUU0NdDQopIGVsc2UgKA0KZWNobyBbIWNvdW50ZXIhXSAgJSVBDQopDQpzZXQgdGFyZ2V0ZWRpdGlvbiFjb3VudGVyIT0lJUENCikNCg0K JWxpbmUlDQplY2hvOg0KZWNobyBbMF0gICVfZXhpdG1zZyUNCmVjaG86DQpjYWxsIDpka19jb2xvciAlX0dyZWVuJSAiRW50ZXIgYW4gb3B0aW9uIG51bWJl ciB1c2luZyB5b3VyIGtleWJvYXJkIGFuZCBwcmVzcyBFbnRlciB0byBjb25maXJtOiINCnNldCAvcCBpbnB0PQ0KaWYgIiVpbnB0JSI9PSIiIGdvdG8gY2Vk bWVudTINCmlmICIlaW5wdCUiPT0iMCIgZXhpdCAvYg0KZm9yIC9sICUlaSBpbiAoMSwxLCVjb3VudGVyJSkgZG8gKGlmICIlaW5wdCUiPT0iJSVpIiBzZXQg dmVyaWZpZWQ9MSkNCnNldCB0YXJnZXRlZGl0aW9uPSF0YXJnZXRlZGl0aW9uJWlucHQlIQ0KaWYgJXZlcmlmaWVkJT09MCBnb3RvIGNlZG1lbnUyDQoNCjo6 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQppZiAld2luYnVpbGQlIExTUyAxMDI0MCBnb3RvIDpjYnNtZXRob2QN CmlmIGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2thZ2VzXE1pY3Jvc29mdC1XaW5kb3dzLVNlcnZlcipFZGl0aW9ufioubXVtIiBnb3RvIDpj ZWRfY2hhbmdlX3NlcnZlcg0KDQpjbHMNCmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsIG1vZGUgY29uIGNvbHM9MTA1IGxpbmVzPTMyDQoNCmlmIC9pICIldGFy Z2V0ZWRpdGlvbiUiPT0iU2VydmVyUmRzaCIgKA0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVSZWQlICI9PT09IE5vdGUgPT09PSINCmVjaG86DQplY2hvIE9u Y2UgdGhlIGVkaXRpb24gaXMgY2hhbmdlZCB0byAiJXRhcmdldGVkaXRpb24lIiwgDQplY2hvIHRoZSBzeXN0ZW0gbWF5IG5vdCBiZSBhYmxlIHRvIHByb3Bl cmx5IGNoYW5nZSBlZGl0aW9uIGxhdGVyLg0KZWNobzoNCmVjaG8gWzFdIENvbnRpbnVlIEFueXdheQ0KZWNobyBbMF0gR28gQmFjaw0KZWNobzoNCmNhbGwg OmRrX2NvbG9yICVfR3JlZW4lICJDaG9vc2UgYSBtZW51IG9wdGlvbiB1c2luZyB5b3VyIGtleWJvYXJkIFsxLDBdIDoiDQpjaG9pY2UgL0M6MTAgL04NCmlm ICFlcnJvcmxldmVsIT09MiBnb3RvIGNlZG1lbnUyDQppZiAhZXJyb3JsZXZlbCE9PTEgcmVtDQopDQoNCmNscw0Kc2V0IGtleT0NCnNldCBfY2hhbj0NCnNl dCBfZGlzbWFwaT0wDQoNCjo6ICBDaGVjayBpZiBESVNNIEFQSSBvciBzbG1nci52YnMgaXMgcmVxdWlyZWQgZm9yIGVkaXRpb24gdXBncmFkZQ0KDQppZiBu b3QgZXhpc3QgIiVTeXNQYXRoJVxzcHBcdG9rZW5zXHNrdXNcJXRhcmdldGVkaXRpb24lXCV0YXJnZXRlZGl0aW9uJSoueHJtLW1zIiAoDQplY2hvICVfd3Rh cmdldCUgfCBmaW5kIC9pICIgJXRhcmdldGVkaXRpb24lICIgfHwgKA0Kc2V0IF9kaXNtYXBpPTENCikNCikNCg0Kc2V0ICJrZXlmbG93PVJldGFpbCBPRU06 Tk9OU0xQIE9FTTpETSBWb2x1bWU6TUFLIFZvbHVtZTpHVkxLIFBHUzpUQiBSZXRhaWw6VEI6RXZhbCINCg0KY2FsbCA6Y2VkX3RhcmdldFNLVSAldGFyZ2V0 ZWRpdGlvbiUNCmlmIGRlZmluZWQgdGFyZ2V0U0tVIGNhbGwgOmNlZF93aW5kb3dza2V5DQppZiBkZWZpbmVkIGtleSBpZiBkZWZpbmVkIHBrZXljaGFubmVs IHNldCBfY2hhbj0lcGtleWNoYW5uZWwlDQppZiBub3QgZGVmaW5lZCBrZXkgY2FsbCA6Y2hhbmdlZWRpdGlvbmRhdGENCmlmIG5vdCBkZWZpbmVkIGtleSBp ZiAlX2Rpc21hcGklPT0xIGlmIC9pICIldGFyZ2V0ZWRpdGlvbiUiPT0iUHJvZmVzc2lvbmFsIiAoDQpzZXQga2V5PVZLN0pHLU5QSFRNLUM5N0pNLTlNUEdU LTNWNjZUDQpzZXQgX2NoYW49UmV0YWlsDQopDQoNCmlmIG5vdCBkZWZpbmVkIGtleSAoDQolZWxpbmUlDQplY2hvIFsldGFyZ2V0ZWRpdGlvbiUgXnwgJXdp bmJ1aWxkJV0NCmVjaG8gRmFpbGVkIHRvIGdldCBwcm9kdWN0IGtleSBmcm9tIHBrZXloZWxwZXIuZGxsLg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91 Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxl c2hvb3QiDQpnb3RvIGRrX2RvbmUNCikNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGFuZ2lu ZyBmcm9tIENvcmUgdG8gTm9uLUNvcmUgJiBDaGFuZ2luZyBlZGl0aW9ucyBpbiBXaW5kb3dzIGJ1aWxkIG9sZGVyIHRoYW4gMTcxMzQgcmVxdWlyZXMgImNo YW5nZXBrIC9wcm9kdWN0a2V5IiBvciBESVNNIEFwaSBtZXRob2QgYW5kIHJlc3RhcnQNCjo6ICBJbiBvdGhlciBjYXNlcywgZWRpdGlvbnMgY2FuIGJlIGNo YW5nZWQgaW5zdGFudGx5IHdpdGggInNsbWdyIC9pcGsiDQoNCmlmICVfZGlzbWFwaSU9PTEgKA0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgbW9kZSBjb24g Y29scz0xMDUgbGluZXM9NDANCmNhbGwgOmNlZF9yZWJvb3RmbGFnDQppZiBkZWZpbmVkIHJlYm9vdHJlcSBnb3RvIGRrX2RvbmUNCikNCg0KY2xzDQolbGlu ZSUNCmVjaG86DQolc2hvd2VkaXRpb25lcnJvciUNCmlmIGRlZmluZWQgZGlzbW5vdHdvcmtpbmcgY2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICJESVNNLmV4 ZSBpcyBub3Qgd29ya2luZy4iDQplY2hvIENoYW5naW5nIHRoZSBjdXJyZW50IGVkaXRpb24gWyVvc2VkaXRpb24lXSAlZnVsbGJ1aWxkJSB0byBbJXRhcmdl dGVkaXRpb24lXS4uLg0KZWNobzoNCg0KaWYgJV9kaXNtYXBpJT09MSAoDQpjYWxsIDpka19jb2xvciAlR3JlZW4lICJOb3RlcyAtIg0KZWNobzoNCmVjaG8g IC0gU2F2ZSB5b3VyIHdvcmsgYmVmb3JlIGNvbnRpbnVpbmcsIHRoZSBzeXN0ZW0gd2lsbCBhdXRvLXJlc3RhcnQuDQplY2hvOg0KZWNobyAgLSBZb3Ugd2ls bCBuZWVkIHRvIGFjdGl2YXRlIHdpdGggSFdJRCBvcHRpb24gb25jZSB0aGUgZWRpdGlvbiBpcyBjaGFuZ2VkLg0KJWxpbmUlDQplY2hvOg0KY2hvaWNlIC9D OjIxIC9OIC9NICJbMV0gQ29udGludWUgWzJdICVfZXhpdG1zZyUgOiAiDQppZiAhZXJyb3JsZXZlbCE9PTEgZXhpdCAvYg0KKQ0KDQo6Oj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KaWYgJV9kaXNtYXBpJT09MCAoDQplY2hvIEluc3RhbGxpbmcgJV9jaGFuJSBrZXkgWyVr ZXklXQ0KZWNobzoNCmlmICVfd21pYyUgRVFVIDEgd21pYyBwYXRoICVzcHMlIHdoZXJlIF9fQ0xBU1M9JyVzcHMlJyBjYWxsIEluc3RhbGxQcm9kdWN0S2V5 IFByb2R1Y3RLZXk9IiVrZXklIiAlbnVsJQ0KaWYgJV93bWljJSBFUVUgMCAlcHNjJSAidHJ5IHsgJG51bGw9KChbV01JU0VBUkNIRVJdJ1NFTEVDVCBWZXJz aW9uIEZST00gJXNwcyUnKS5HZXQoKSkuSW5zdGFsbFByb2R1Y3RLZXkoJyVrZXklJyk7IGV4aXQgMCB9IGNhdGNoIHsgZXhpdCAkXy5FeGNlcHRpb24uSW5u ZXJFeGNlcHRpb24uSFJlc3VsdCB9IiAlbnVsJQ0Kc2V0IGtleWVycm9yPSFlcnJvcmxldmVsIQ0KY21kIC9jIGV4aXQgL2IgIWtleWVycm9yIQ0KaWYgIWtl eWVycm9yISBORVEgMCBzZXQgImtleWVycm9yPVsweCE9RXhpdENvZGUhXSINCg0KaWYgIWtleWVycm9yISBFUVUgMCAoDQpjYWxsIDpka19yZWZyZXNoDQpj YWxsIDpka19jb2xvciAlR3JlZW4lICJbU3VjY2Vzc2Z1bF0iDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJSZWJvb3QgaXMgcmVxdWlyZWQgdG8g ZnVsbHkgY2hhbmdlIHRoZSBlZGl0aW9uLiINCikgZWxzZSAoDQpjYWxsIDpka19jb2xvciAlUmVkJSAiW1Vuc3VjY2Vzc2Z1bF0gW0Vycm9yIENvZGU6ICFr ZXllcnJvciFdIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFn ZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQopDQopDQoNCmlmICVfZGlzbWFwaSU9PTEgKA0KZWNobzoNCmVjaG8gQXBw bHlpbmcgdGhlIERJU00gQVBJIG1ldGhvZCB3aXRoICVfY2hhbiUga2V5ICVrZXklLiBQbGVhc2Ugd2FpdC4uLg0KZWNobzoNCg0KY2FsbCA6Y2VkX3ByZXAN CmlmIGRlZmluZWQgcHJlcGVycm9yIGdvdG8gZGtfZG9uZQ0KDQolcHNjJSAiJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAn OmRpc21hcGlcOi4qJzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKSAldGFyZ2V0ZWRpdGlvbiUgJWtleSUiDQpjYWxsIDpjZWRfcG9zdHByZXAN CikNCiVsaW5lJQ0KDQpnb3RvIGRrX2RvbmUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpjYnNtZXRo b2QNCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCAoDQptb2RlIGNvbiBjb2xzPTEwNSBsaW5lcz0zMg0KJXBzYyUgIiZ7JFc9JEhvc3QuVUkuUmF3 VUkuV2luZG93U2l6ZTskQj0kSG9zdC5VSS5SYXdVSS5CdWZmZXJTaXplOyRXLkhlaWdodD0zMTskQi5IZWlnaHQ9MjAwOyRIb3N0LlVJLlJhd1VJLldpbmRv d1NpemU9JFc7JEhvc3QuVUkuUmF3VUkuQnVmZmVyU2l6ZT0kQjt9IiAlbnVsJQ0KKQ0KDQpjYWxsIDpjZWRfcmVib290ZmxhZw0KaWYgZGVmaW5lZCByZWJv b3RyZXEgZ290byBka19kb25lDQoNCmVjaG86DQolc2hvd2VkaXRpb25lcnJvciUNCmlmIGRlZmluZWQgZGlzbW5vdHdvcmtpbmcgY2FsbCA6ZGtfY29sb3Ig JV9ZZWxsb3clICJOb3RlIC0gRElTTS5leGUgaXMgbm90IHdvcmtpbmcuIg0KZWNobyBDaGFuZ2luZyB0aGUgY3VycmVudCBlZGl0aW9uIFslb3NlZGl0aW9u JV0gJWZ1bGxidWlsZCUgdG8gWyV0YXJnZXRlZGl0aW9uJV0uLi4NCmVjaG86DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkltcG9ydGFudCAtIFNhdmUgeW91 ciB3b3JrIGJlZm9yZSBjb250aW51aW5nLCB0aGUgc3lzdGVtIHdpbGwgYXV0by1yZXN0YXJ0LiINCmVjaG86DQpjaG9pY2UgL0M6MDEgL04gL00gIlsxXSBD b250aW51ZSBbMF0gJV9leGl0bXNnJSA6ICINCmlmICVlcnJvcmxldmVsJT09MSBleGl0IC9iDQoNCmVjaG86DQplY2hvIEluaXRpYWxpemluZy4uLg0KZWNo bzoNCg0KY2FsbCA6Y2VkX3ByZXANCmlmIGRlZmluZWQgcHJlcGVycm9yIGdvdG8gZGtfZG9uZQ0KDQppZiAlX3N0ZyU9PTAgKHNldCBzdGFnZT0pIGVsc2Ug KHNldCBzdGFnZT0tU3RhZ2VDdXJyZW50KQ0KJXBzYyUgIiRmPVtJTy5GaWxlXTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzpjYnN4bWxcOi4q JzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKSAtU2V0RWRpdGlvbiAldGFyZ2V0ZWRpdGlvbiUgJXN0YWdlJSINCmNhbGwgOmNlZF9wb3N0cHJl cA0KJWxpbmUlDQoNCmdvdG8gZGtfZG9uZQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOmNlZF9jaGFu Z2Vfc2VydmVyDQoNCmNscw0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgKA0KbW9kZSBjb24gY29scz0xMDUgbGluZXM9MzINCiVwc2MlICImeyRXPSRIb3N0 LlVJLlJhd1VJLldpbmRvd1NpemU7JEI9JEhvc3QuVUkuUmF3VUkuQnVmZmVyU2l6ZTskVy5IZWlnaHQ9MzE7JEIuSGVpZ2h0PTIwMDskSG9zdC5VSS5SYXdV SS5XaW5kb3dTaXplPSRXOyRIb3N0LlVJLlJhd1VJLkJ1ZmZlclNpemU9JEI7fSIgJW51bCUNCikNCg0Kc2V0IGtleT0NCnNldCBfY2hhbj0NCnNldCAia2V5 Zmxvdz1Wb2x1bWU6R1ZMSyBSZXRhaWwgVm9sdW1lOk1BSyBPRU06Tk9OU0xQIE9FTTpETSBQR1M6VEIgUmV0YWlsOlRCOkV2YWwiDQoNCmNhbGwgOmNlZF90 YXJnZXRTS1UgJXRhcmdldGVkaXRpb24lDQppZiBkZWZpbmVkIHRhcmdldFNLVSBjYWxsIDpjZWRfd2luZG93c2tleQ0KaWYgZGVmaW5lZCBrZXkgaWYgZGVm aW5lZCBwa2V5Y2hhbm5lbCBzZXQgX2NoYW49JXBrZXljaGFubmVsJQ0KaWYgbm90IGRlZmluZWQga2V5IGNhbGwgOmNoYW5nZWVkaXRpb25kYXRhDQoNCmlm IG5vdCBkZWZpbmVkIGtleSAoDQolZWxpbmUlDQplY2hvIFsldGFyZ2V0ZWRpdGlvbiUgXnwgJXdpbmJ1aWxkJV0NCmVjaG8gRmFpbGVkIHRvIGdldCBwcm9k dWN0IGtleSBmcm9tIHBrZXloZWxwZXIuZGxsLg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUg IkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQpnb3RvIGRrX2RvbmUNCikNCg0KY2FsbCA6 Y2VkX3JlYm9vdGZsYWcNCmlmIGRlZmluZWQgcmVib290cmVxIGdvdG8gZGtfZG9uZQ0KDQpjbHMNCmVjaG86DQolc2hvd2VkaXRpb25lcnJvciUNCmlmIGRl ZmluZWQgZGlzbW5vdHdvcmtpbmcgY2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICJOb3RlIC0gRElTTS5leGUgaXMgbm90IHdvcmtpbmcuIg0KZWNobyBDaGFu Z2luZyB0aGUgY3VycmVudCBlZGl0aW9uIFslb3NlZGl0aW9uJV0gJWZ1bGxidWlsZCUgdG8gWyV0YXJnZXRlZGl0aW9uJV0uLi4NCmVjaG86DQoNCmNhbGwg OmNlZF9wcmVwDQppZiBkZWZpbmVkIHByZXBlcnJvciBnb3RvIGRrX2RvbmUNCg0KZWNobyBBcHBseWluZyB0aGUgY29tbWFuZCB3aXRoICVfY2hhbiUga2V5 Li4uDQplY2hvIERJU00gL29ubGluZSAvU2V0LUVkaXRpb246JXRhcmdldGVkaXRpb24lIC9Qcm9kdWN0S2V5OiVrZXklIC9BY2NlcHRFdWxhDQpESVNNIC9v bmxpbmUgL1NldC1FZGl0aW9uOiV0YXJnZXRlZGl0aW9uJSAvUHJvZHVjdEtleTola2V5JSAvQWNjZXB0RXVsYQ0KDQpjYWxsIDpjZWRfcG9zdHByZXANCiVs aW5lJQ0KDQpnb3RvIGRrX2RvbmUNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpjZWRfcHJlcA0KDQpz ZXQgX3RpbWU9DQpzZXQgcHJlcGVycm9yPQ0KDQpmb3IgL2YgJSVhIGluICgnJXBzYyUgIihHZXQtRGF0ZSkuVG9TdHJpbmcoJ3l5eXlNTWRkLUhIbW1zc2Zm ZicpIicpIGRvIHNldCBfdGltZT0lJWENCg0KJXBzYyUgU3RvcC1TZXJ2aWNlIFRydXN0ZWRJbnN0YWxsZXIgLWZvcmNlICVudWwlDQoNCnNjIHF1ZXJ5IFRy dXN0ZWRJbnN0YWxsZXIgfCBmaW5kIC9pICJSVU5OSU5HIiAlbnVsJSAmJiAoDQolZWxpbmUlDQplY2hvIEZhaWxlZCB0byBzdG9wIHRoZSBUcnVzdGVkSW5z dGFsbGVyIHNlcnZpY2UuDQplY2hvIFJlYm9vdCB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIHJlc3RhcnQgb3B0aW9uIGFuZCB0cnkgYWdhaW4uDQpzZXQgcHJl cGVycm9yPTENCmV4aXQgL2INCikNCg0KY29weSAveSAvYiAiJVN5c3RlbVJvb3QlXGxvZ3NcY2JzXGNicy5sb2ciICIlU3lzdGVtUm9vdCVcbG9nc1xjYnNc YmFja3VwX2Nic18lX3RpbWUlLmxvZyIgJW51bCUNCmNvcHkgL3kgL2IgIiVTeXN0ZW1Sb290JVxsb2dzXERJU01cZGlzbS5sb2ciICIlU3lzdGVtUm9vdCVc bG9nc1xESVNNXGJhY2t1cF9kaXNtXyVfdGltZSUubG9nIiAlbnVsJQ0KDQpkZWwgL2YgL3EgIiVTeXN0ZW1Sb290JVxsb2dzXGNic1xjYnMubG9nIiAlbnVs JQ0KZGVsIC9mIC9xICIlU3lzdGVtUm9vdCVcbG9nc1xESVNNXGRpc20ubG9nIiAlbnVsJQ0KDQo6OiBJbml0aWF0ZSB0aGlzIHRvIGFwcGVhciBpbiBmcmVz aCBsb2dzDQoNCmRpc20gL29ubGluZSAvZW5nbGlzaCAvR2V0LUN1cnJlbnRFZGl0aW9uICVudWwlDQpkaXNtIC9vbmxpbmUgL2VuZ2xpc2ggL0dldC1UYXJn ZXRFZGl0aW9ucyAlbnVsJQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOmNlZF9wb3N0 cHJlcA0KDQp0aW1lb3V0IC90IDUgJW51bDElDQpjb3B5IC95IC9iICIlU3lzdGVtUm9vdCVcbG9nc1xjYnNcY2JzLmxvZyIgIiVTeXN0ZW1Sb290JVxsb2dz XGNic1xjYnNfJV90aW1lJS5sb2ciICVudWwlDQpjb3B5IC95IC9iICIlU3lzdGVtUm9vdCVcbG9nc1xESVNNXGRpc20ubG9nIiAiJVN5c3RlbVJvb3QlXGxv Z3NcRElTTVxkaXNtXyVfdGltZSUubG9nIiAlbnVsJQ0KDQppZiBub3QgZXhpc3QgIiFkZXNrdG9wIVxDaGFuZ2VFZGl0aW9uX0xvZ3NcIiBtZCAiIWRlc2t0 b3AhXENoYW5nZUVkaXRpb25fTG9nc1wiICVudWwlDQpjYWxsIDpjb21wcmVzc2xvZyBjYnNcY2JzXyVfdGltZSUubG9nIENoYW5nZUVkaXRpb25fTG9nc1xD QlMgJW51bCUNCmNhbGwgOmNvbXByZXNzbG9nIERJU01cZGlzbV8lX3RpbWUlLmxvZyBDaGFuZ2VFZGl0aW9uX0xvZ3NcRElTTSAlbnVsJQ0KDQplY2hvOg0K aWYgJXdpbmJ1aWxkJSBHRVEgOTIwMCAlcHNjJSAiaWYgKChHZXQtV2luZG93c09wdGlvbmFsRmVhdHVyZSAtT25saW5lIC1GZWF0dXJlTmFtZSBOZXRGeDMp LlN0YXRlIC1lcSAnRW5hYmxlZCcpIHtXcml0ZS1Ib3N0ICdDaGVja2luZyAuTkVUIEZyYW1ld29yayAzLjUgU3RhdHVzIC0gRW5hYmxlZCd9Ig0KZWNobyBM b2cgZmlsZXMgYXJlIGNvcGllZCB0byB0aGUgQ2hhbmdlRWRpdGlvbl9Mb2dzIGZvbGRlciBvbiB5b3VyIGRlc2t0b3AuDQplY2hvOg0KY2FsbCA6ZGtfY29s b3IgJUJsdWUlICJJbiBjYXNlIHRoZXJlIGFyZSBlcnJvcnMsIHlvdSBzaG91bGQgcmVzdGFydCB0aGUgc3lzdGVtIGJlZm9yZSB0cnlpbmcgYWdhaW4uIg0K ZWNobzoNCnNldCBmaXhlcz0lZml4ZXMlICVtYXMlY2hhbmdlX2VkaXRpb25faXNzdWVzDQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdl YnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMlY2hhbmdlX2VkaXRpb25faXNzdWVzIg0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIEdldCBFZGl0aW9uIGxpc3QNCg0KOmNlZF9lZGlsaXN0DQoNCmlmICVfd21pYyUgRVFVIDEg c2V0ICJjaGtlZGk9Zm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSVhIGluICgnIndtaWMgcGF0aCAlc3BwJSB3aGVyZSAoQXBwbGljYXRpb25JRD0nNTVj OTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmJyBBTkQgTGljZW5zZURlcGVuZHNPbiBpcyBOVUxMKSBnZXQgTGljZW5zZUZhbWlseSAvVkFMVUUi ICVudWw2JScpIg0KaWYgJV93bWljJSBFUVUgMCBzZXQgImNoa2VkaT1mb3IgL2YgInRva2Vucz0yIGRlbGltcz09IiAlJWEgaW4gKCclcHNjJSAiKChbV01J U0VBUkNIRVJdJ1NFTEVDVCBMaWNlbnNlRmFtaWx5IEZST00gJXNwcCUgV0hFUkUgQXBwbGljYXRpb25JRD0nJzU1YzkyNzM0LWQ2ODItNGQ3MS05ODNlLWQ2 ZWMzZjE2MDU5ZicnIEFORCBMaWNlbnNlRGVwZW5kc09uIGlzIE5VTEwnKS5HZXQoKSkuTGljZW5zZUZhbWlseSBefCAlJSB7ZWNobyAoJ0xpY2Vuc2VGYW1p bHk9JyskXyl9IiAlbnVsNiUnKSINCiVjaGtlZGklIGRvIGNhbGwgc2V0ICJfd3RhcmdldD0gIV93dGFyZ2V0ISAlJWEgIg0KZXhpdCAvYg0KDQo6Oj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIHBlbmRpbmcgcmVib290IGZsYWdzDQoNCjpjZWRfcmVib290 ZmxhZw0KDQpzZXQgcmVib290cmVxPQ0KcmVnIHF1ZXJ5ICJIS0xNXFNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXENvbXBvbmVu dCBCYXNlZCBTZXJ2aWNpbmdcUmVib290UGVuZGluZyIgJW51bCUgJiYgc2V0IHJlYm9vdHJlcT0xDQpyZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9z b2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cV2luZG93c1VwZGF0ZVxBdXRvIFVwZGF0ZVxSZWJvb3RSZXF1aXJlZCIgJW51bCUgJiYgc2V0IHJlYm9vdHJl cT0xDQoNCmlmIGRlZmluZWQgcmVib290cmVxICgNCiVlbGluZSUNCmVjaG8gUGVuZGluZyByZWJvb3QgZmxhZ3MgZm91bmQuDQplY2hvOg0KZWNobyBNYWtl IHN1cmUgV2luZG93cyBpcyBmdWxseSB1cGRhdGVkLCByZXN0YXJ0IHRoZSBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4NCikNCmV4aXQgL2INCg0KOjo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjpjZWRfd2luZG93c2tleQ0KDQpmb3IgJSUjIGluIChwa2V5aGVscGVyLmRsbCkg ZG8gQGlmICIlJX4kUEFUSDojIj09IiIgZXhpdCAvYg0KZm9yICUlIyBpbiAoJWtleWZsb3clKSBkbyAoDQpjYWxsIDprX3BrZXkgJXRhcmdldFNLVSUgJyUl IycNCmlmIGRlZmluZWQgcGtleSBjYWxsIDprX3BrZXljaGFubmVsICFwa2V5IQ0KaWYgL2kgIiFwa2V5Y2hhbm5lbCEiPT0iJSUjIiAoDQpzZXQga2V5PSFw a2V5IQ0KZXhpdCAvYg0KKQ0KKQ0KZXhpdCAvYg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOmNlZF90 YXJnZXRTS1UNCg0Kc2V0IGs9JTENCnNldCB0YXJnZXRTS1U9DQpmb3IgJSUjIGluIChwa2V5aGVscGVyLmRsbCkgZG8gQGlmICIlJX4kUEFUSDojIj09IiIg ZXhpdCAvYg0KDQpjYWxsIDpka19yZWZsZWN0aW9uDQoNCnNldCBkMT0lcmVmJSBbdm9pZF0kVHlwZUJ1aWxkZXIuRGVmaW5lUEludm9rZU1ldGhvZCgnR2V0 RWRpdGlvbklkRnJvbU5hbWUnLCAncGtleWhlbHBlci5kbGwnLCAnUHVibGljLCBTdGF0aWMnLCAxLCBbaW50XSwgQChbU3RyaW5nXSwgW2ludF0uTWFrZUJ5 UmVmVHlwZSgpKSwgMSwgMyk7DQpzZXQgZDE9JWQxJSAkb3V0ID0gMDsgW3ZvaWRdJFR5cGVCdWlsZGVyLkNyZWF0ZVR5cGUoKTo6R2V0RWRpdGlvbklkRnJv bU5hbWUoJyVrJScsIFtyZWZdJG91dCk7ICRvdXQNCg0KZm9yIC9mICUlYSBpbiAoJyVwc2MlICIlZDElIicpIGRvIGlmIG5vdCBlcnJvcmxldmVsIDEgKHNl dCB0YXJnZXRTS1U9JSVhKQ0KaWYgIiV0YXJnZXRTS1UlIj09IjAiIHNldCB0YXJnZXRTS1U9DQpleGl0IC9iDQoNCjo6PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgaHR0cHM6Ly9naXRodWIuY29tL2FzZGNvcnAvU2V0LVdpbmRvd3NDYnNFZGl0aW9uDQoNCjpjYnN4 bWw6Ww0KcGFyYW0gKA0KICAgIFtQYXJhbWV0ZXIoKV0NCiAgICBbU3RyaW5nXSRTZXRFZGl0aW9uLA0KDQogICAgW1BhcmFtZXRlcigpXQ0KICAgIFtTd2l0 Y2hdJEdldFRhcmdldEVkaXRpb25zLA0KDQogICAgW1BhcmFtZXRlcigpXQ0KICAgIFtTd2l0Y2hdJFN0YWdlQ3VycmVudA0KKQ0KDQpmdW5jdGlvbiBHZXQt QXNzZW1ibHlJZGVudGl0eSB7DQogICAgcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSRQYWNrYWdlTmFtZQ0KICAgICkNCg0KICAgICRQYWNrYWdlTmFtZSA9 IFtTdHJpbmddJFBhY2thZ2VOYW1lDQogICAgJHBhY2thZ2VEYXRhID0gKCRQYWNrYWdlTmFtZSAtc3BsaXQgJ34nKQ0KDQogICAgaWYoJHBhY2thZ2VEYXRh WzNdIC1lcSAnJykgew0KICAgICAgICAkcGFja2FnZURhdGFbM10gPSAnbmV1dHJhbCcNCiAgICB9DQoNCiAgICByZXR1cm4gIjxhc3NlbWJseUlkZW50aXR5 IG5hbWU9YCIkKCRwYWNrYWdlRGF0YVswXSlgIiB2ZXJzaW9uPWAiJCgkcGFja2FnZURhdGFbNF0pYCIgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPWAiJCgkcGFj a2FnZURhdGFbMl0pYCIgcHVibGljS2V5VG9rZW49YCIkKCRwYWNrYWdlRGF0YVsxXSlgIiBsYW5ndWFnZT1gIiQoJHBhY2thZ2VEYXRhWzNdKWAiIC8+Ig0K fQ0KDQpmdW5jdGlvbiBHZXQtU3hzTmFtZSB7DQogICAgcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSRQYWNrYWdlTmFtZQ0KICAgICkNCg0KICAgICRuYW1l ID0gKCRQYWNrYWdlTmFtZSAtcmVwbGFjZSAnW15BLXowLTlcLVwuX10nLCAnJykNCg0KICAgIGlmKCRuYW1lLkxlbmd0aCAtZ3QgNDApIHsNCiAgICAgICAg JG5hbWUgPSAoJG5hbWVbMC4uMThdIC1qb2luICcnKSArICdcLlwuJyArICgkbmFtZVstMTkuLi0xXSAtam9pbiAnJykNCiAgICB9DQoNCiAgICByZXR1cm4g JG5hbWUuVG9Mb3dlcigpDQp9DQoNCmZ1bmN0aW9uIEZpbmQtRWRpdGlvblhtbEluU3hzIHsNCiAgICBwYXJhbSAoDQogICAgICAgIFtTdHJpbmddJEVkaXRp b24NCiAgICApDQoNCiAgICAkY2FuZGlkYXRlcyA9IEAoJEVkaXRpb24sICdDbGllbnQnLCAnU2VydmVyJykNCiAgICAkd2luU3hzID0gJEVudjpTeXN0ZW1S b290ICsgJ1xXaW5TeFMnDQogICAgJGFsbEluU3hzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkd2luU3hzIHwgc2VsZWN0IE5hbWUNCg0KICAgIGZvcmVhY2go JGNhbmRpZGF0ZSBpbiAkY2FuZGlkYXRlcykgew0KICAgICAgICAkbmFtZSA9IEdldC1TeHNOYW1lIC1QYWNrYWdlTmFtZSAiTWljcm9zb2Z0LVdpbmRvd3Mt RWRpdGlvbnMtJGNhbmRpZGF0ZSINCiAgICAgICAgJHBhY2thZ2VzID0gJGFsbEluU3hzIHwgd2hlcmUgbmFtZSAtTWF0Y2ggKCdeLipfJyskbmFtZSsnXzMx YmYzODU2YWQzNjRlMzUnKQ0KDQogICAgICAgIGlmKCRwYWNrYWdlcy5MZW5ndGggLWVxIDApIHsNCiAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgIH0N Cg0KICAgICAgICAkcGFja2FnZSA9ICRwYWNrYWdlc1stMV0uTmFtZQ0KICAgICAgICAkdGVzdFBhdGggPSAkd2luU3hzICsgIlwkcGFja2FnZVwiICsgJEVk aXRpb24gKyAnRWRpdGlvbi54bWwnDQoNCiAgICAgICAgaWYoVGVzdC1QYXRoIC1QYXRoICR0ZXN0UGF0aCAtUGF0aFR5cGUgTGVhZikgew0KICAgICAgICAg ICAgcmV0dXJuICR0ZXN0UGF0aA0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuICRudWxsDQp9DQoNCmZ1bmN0aW9uIEZpbmQtRWRpdGlvblhtbCB7 DQogICAgcGFyYW0gKA0KICAgICAgICBbU3RyaW5nXSRFZGl0aW9uDQogICAgKQ0KDQogICAgJHNlcnZpY2luZ0VkaXRpb25zID0gJEVudjpTeXN0ZW1Sb290 ICsgJ1xzZXJ2aWNpbmdcRWRpdGlvbnMnDQogICAgJGVkaXRpb25YbWwgPSAkRWRpdGlvbiArICdFZGl0aW9uLnhtbCcNCg0KICAgICRlZGl0aW9uWG1sSW5T ZXJ2aWNpbmcgPSAkc2VydmljaW5nRWRpdGlvbnMgKyAnXCcgKyAkZWRpdGlvblhtbA0KDQogICAgaWYoVGVzdC1QYXRoIC1QYXRoICRlZGl0aW9uWG1sSW5T ZXJ2aWNpbmcgLVBhdGhUeXBlIExlYWYpIHsNCiAgICAgICAgcmV0dXJuICRlZGl0aW9uWG1sSW5TZXJ2aWNpbmcNCiAgICB9DQoNCiAgICByZXR1cm4gRmlu ZC1FZGl0aW9uWG1sSW5TeHMgLUVkaXRpb24gJEVkaXRpb24NCn0NCg0KZnVuY3Rpb24gV3JpdGUtVXBncmFkZUNhbmRpZGF0ZXMgew0KICAgIHBhcmFtICgN CiAgICAgICAgW0hhc2hUYWJsZV0kSW5zdGFsbENhbmRpZGF0ZXMNCiAgICApDQoNCiAgICAkZWRpdGlvbkNvdW50ID0gMA0KICAgIFdyaXRlLUhvc3QgJ0Vk aXRpb25zIHRoYXQgY2FuIGJlIHVwZ3JhZGVkIHRvOicNCiAgICBmb3JlYWNoKCRjYW5kaWRhdGUgaW4gJEluc3RhbGxDYW5kaWRhdGVzLktleXMpIHsNCiAg ICAgICAgV3JpdGUtSG9zdCAiVGFyZ2V0IEVkaXRpb24gOiAkY2FuZGlkYXRlIg0KICAgICAgICAkZWRpdGlvbkNvdW50KysNCiAgICB9DQoNCiAgICBpZigk ZWRpdGlvbkNvdW50IC1lcSAwKSB7DQogICAgICAgIFdyaXRlLUhvc3QgJyhubyBlZGl0aW9ucyBhcmUgYXZhaWxhYmxlKScNCiAgICB9DQp9DQoNCmZ1bmN0 aW9uIFdyaXRlLVVwZ3JhZGVYbWwgew0KICAgIHBhcmFtICgNCiAgICAgICAgW0FycmF5XSRSZW1vdmFsQ2FuZGlkYXRlcywNCiAgICAgICAgW0FycmF5XSRJ bnN0YWxsQ2FuZGlkYXRlcywNCiAgICAgICAgW0Jvb2xlYW5dJFN0YWdlDQogICAgKQ0KDQogICAgJHJlbW92ZUFjdGlvbiA9ICdyZW1vdmUnDQogICAgaWYo JFN0YWdlKSB7DQogICAgICAgICRyZW1vdmVBY3Rpb24gPSAnc3RhZ2UnDQogICAgfQ0KDQogICAgV3JpdGUtT3V0cHV0ICc8P3htbCB2ZXJzaW9uPSIxLjAi Pz4nDQogICAgV3JpdGUtT3V0cHV0ICc8dW5hdHRlbmQgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dW5hdHRlbmQiPicNCiAgICBXcml0ZS1P dXRwdXQgJzxzZXJ2aWNpbmc+Jw0KDQogICAgZm9yZWFjaCgkcGFja2FnZSBpbiAkSW5zdGFsbENhbmRpZGF0ZXMpIHsNCiAgICAgICAgV3JpdGUtT3V0cHV0 ICc8cGFja2FnZSBhY3Rpb249Imluc3RhbGwiPicNCiAgICAgICAgV3JpdGUtT3V0cHV0IChHZXQtQXNzZW1ibHlJZGVudGl0eSAtUGFja2FnZU5hbWUgJHBh Y2thZ2UpDQogICAgICAgIFdyaXRlLU91dHB1dCAnPC9wYWNrYWdlPicNCiAgICB9DQoNCiAgICBmb3JlYWNoKCRwYWNrYWdlIGluICRSZW1vdmFsQ2FuZGlk YXRlcykgew0KICAgICAgICBXcml0ZS1PdXRwdXQgIjxwYWNrYWdlIGFjdGlvbj1gIiRyZW1vdmVBY3Rpb25gIj4iDQogICAgICAgIFdyaXRlLU91dHB1dCAo R2V0LUFzc2VtYmx5SWRlbnRpdHkgLVBhY2thZ2VOYW1lICRwYWNrYWdlKQ0KICAgICAgICBXcml0ZS1PdXRwdXQgJzwvcGFja2FnZT4nDQogICAgfQ0KDQog ICAgV3JpdGUtT3V0cHV0ICc8L3NlcnZpY2luZz4nDQogICAgV3JpdGUtT3V0cHV0ICc8L3VuYXR0ZW5kPicNCn0NCg0KZnVuY3Rpb24gV3JpdGUtVXNhZ2Ug ew0KICAgIEdldC1IZWxwICRzY3JpcHQ6TXlJbnZvY2F0aW9uLk15Q29tbWFuZC5QYXRoIC1kZXRhaWxlZA0KfQ0KDQokdmVyc2lvbiA9ICcxLjAnDQokZ2V0 VGFyZ2V0c1BhcmFtID0gJEdldFRhcmdldEVkaXRpb25zLklzUHJlc2VudA0KJHN0YWdlQ3VycmVudFBhcmFtID0gJFN0YWdlQ3VycmVudC5Jc1ByZXNlbnQN Cg0KaWYoJFNldEVkaXRpb24gLWVxICcnIC1hbmQgKCRmYWxzZSAtZXEgJGdldFRhcmdldHNQYXJhbSkpIHsNCiAgICBXcml0ZS1Vc2FnZQ0KICAgIEV4aXQg MQ0KfQ0KDQokcmVtb3ZhbENhbmRpZGF0ZXMgPSBAKCk7DQokaW5zdGFsbENhbmRpZGF0ZXMgPSBAe307DQoNCiRwYWNrYWdlcyA9IEdldC1DaGlsZEl0ZW0g LVBhdGggJ0hLTE06XFNPRlRXQVJFXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXENvbXBvbmVudCBCYXNlZCBTZXJ2aWNpbmdcUGFja2FnZXMn IHwgc2VsZWN0IE5hbWUgfCB3aGVyZSB7ICRfLm5hbWUgLW1hdGNoICdeLipcXE1pY3Jvc29mdC1XaW5kb3dzLS4qRWRpdGlvbn4nIH0NCmZvcmVhY2goJHBh Y2thZ2UgaW4gJHBhY2thZ2VzKSB7DQogICAgJHN0YXRlID0gKEdldC1JdGVtUHJvcGVydHkgLVBhdGggIlJlZ2lzdHJ5OjokKCRwYWNrYWdlLk5hbWUpIiku Q3VycmVudFN0YXRlDQogICAgJHBhY2thZ2VOYW1lID0gKCRwYWNrYWdlLk5hbWUgLXNwbGl0ICdcXCcpWy0xXQ0KICAgICRwYWNrYWdlRWRpdGlvbiA9ICgo JHBhY2thZ2VOYW1lIC1zcGxpdCAnRWRpdGlvbn4nKVswXSAtc3BsaXQgJ01pY3Jvc29mdC1XaW5kb3dzLScpWy0xXQ0KDQogICAgaWYoJHN0YXRlIC1lcSAw eDQwKSB7DQogICAgICAgIGlmKCRudWxsIC1lcSAkaW5zdGFsbENhbmRpZGF0ZXNbJHBhY2thZ2VFZGl0aW9uXSkgew0KICAgICAgICAgICAgJGluc3RhbGxD YW5kaWRhdGVzWyRwYWNrYWdlRWRpdGlvbl0gPSBAKCkNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKCRmYWxzZSAtZXEgKCRpbnN0YWxsQ2FuZGlkYXRlc1sk cGFja2FnZUVkaXRpb25dIC1jb250YWlucyAkcGFja2FnZU5hbWUpKSB7DQogICAgICAgICAgICAkaW5zdGFsbENhbmRpZGF0ZXNbJHBhY2thZ2VFZGl0aW9u XSA9ICRpbnN0YWxsQ2FuZGlkYXRlc1skcGFja2FnZUVkaXRpb25dICsgQCgkcGFja2FnZU5hbWUpDQogICAgICAgIH0NCiAgICB9DQoNCiAgICBpZigoKCRz dGF0ZSAtZXEgMHg1MCkgLW9yICgkc3RhdGUgLWVxIDB4NzApKSAtYW5kICgkZmFsc2UgLWVxICgkcmVtb3ZhbENhbmRpZGF0ZXMgLWNvbnRhaW5zICRwYWNr YWdlTmFtZSkpKSB7DQogICAgICAgICRyZW1vdmFsQ2FuZGlkYXRlcyA9ICRyZW1vdmFsQ2FuZGlkYXRlcyArIEAoJHBhY2thZ2VOYW1lKQ0KICAgIH0NCn0N Cg0KaWYoJGdldFRhcmdldHNQYXJhbSkgew0KICAgIFdyaXRlLVVwZ3JhZGVDYW5kaWRhdGVzIC1JbnN0YWxsQ2FuZGlkYXRlcyAkaW5zdGFsbENhbmRpZGF0 ZXMNCiAgICBFeGl0DQp9DQoNCmlmKCRmYWxzZSAtZXEgKCRpbnN0YWxsQ2FuZGlkYXRlcy5LZXlzIC1jb250YWlucyAkU2V0RWRpdGlvbikpIHsNCiAgICBX cml0ZS1FcnJvciAiVGhlIHN5c3RlbSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYCIkU2V0RWRpdGlvbmAiIg0KICAgIEV4aXQgMQ0KfQ0KDQokeG1sUGF0aCA9 ICRFbnY6U3lzdGVtUm9vdCArICdcVGVtcCcgKyAiXCQoW0d1aWRdOjpOZXdHdWlkKCkuR3VpZClDYnNVcGdyYWRlLnhtbCINCg0KV3JpdGUtVXBncmFkZVht bCAtUmVtb3ZhbENhbmRpZGF0ZXMgJHJlbW92YWxDYW5kaWRhdGVzIGANCiAgICAtSW5zdGFsbENhbmRpZGF0ZXMgJGluc3RhbGxDYW5kaWRhdGVzWyRTZXRF ZGl0aW9uXSBgDQogICAgLVN0YWdlICRzdGFnZUN1cnJlbnRQYXJhbSA+JHhtbFBhdGgNCg0KJGVkaXRpb25YbWwgPSBGaW5kLUVkaXRpb25YbWwgLUVkaXRp b24gJFNldEVkaXRpb24NCmlmKCRudWxsIC1lcSAkZWRpdGlvblhtbCkgew0KICAgIFdyaXRlLVdhcm5pbmcgJ1VuYWJsZSB0byBmaW5kIGVkaXRpb24gc3Bl Y2lmaWMgc2V0dGluZ3MgWE1MLiBQcm9jZWVkaW5nIHdpdGhvdXQgaXQuLi4nDQp9DQoNCldyaXRlLUhvc3QgJ1N0YXJ0aW5nIHRoZSB1cGdyYWRlIHByb2Nl c3MuIFRoaXMgbWF5IHRha2UgYSB3aGlsZS4uLicNCg0KRElTTS5FWEUgL0VuZ2xpc2ggL05vUmVzdGFydCAvT25saW5lIC9BcHBseS1VbmF0dGVuZDokeG1s UGF0aA0KJGRpc21FcnJvciA9ICRMQVNURVhJVENPREUNCg0KUmVtb3ZlLUl0ZW0gLVBhdGggJHhtbFBhdGggLUZvcmNlDQoNCmlmKCgkZGlzbUVycm9yIC1u ZSAwKSAtYW5kICgkZGlzbUVycm9yIC1uZSAzMDEwKSkgew0KICAgIFdyaXRlLUVycm9yICdGYWlsZWQgdG8gdXBncmFkZSB0byB0aGUgdGFyZ2V0IGVkaXRp b24nDQogICAgRXhpdCAkZGlzbUVycm9yDQp9DQoNCmlmKCRudWxsIC1uZSAkZWRpdGlvblhtbCkgew0KICAgICRkZXN0aW5hdGlvbiA9ICRFbnY6U3lzdGVt Um9vdCArICdcJyArICRTZXRFZGl0aW9uICsgJy54bWwnDQogICAgQ29weS1JdGVtIC1QYXRoICRlZGl0aW9uWG1sIC1EZXN0aW5hdGlvbiAkZGVzdGluYXRp b24NCg0KICAgIERJU00uRVhFIC9FbmdsaXNoIC9Ob1Jlc3RhcnQgL09ubGluZSAvQXBwbHktVW5hdHRlbmQ6JGVkaXRpb25YbWwNCiAgICAkZGlzbUVycm9y ID0gJExBU1RFWElUQ09ERQ0KDQogICAgaWYoKCRkaXNtRXJyb3IgLW5lIDApIC1hbmQgKCRkaXNtRXJyb3IgLW5lIDMwMTApKSB7DQogICAgICAgIFdyaXRl LUVycm9yICdGYWlsZWQgdG8gYXBwbHkgZWRpdGlvbiBzcGVjaWZpYyBzZXR0aW5ncycNCiAgICAgICAgRXhpdCAkZGlzbUVycm9yDQogICAgfQ0KfQ0KDQpS ZXN0YXJ0LUNvbXB1dGVyDQo6Y2JzeG1sOl0NCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGFu Z2UgZWRpdGlvbiB1c2luZyBESVNNIEFQSQ0KOjogIFRoYW5rcyB0byBBbGV4IChha2EgbWF5LCBhdmU5ODU4KQ0KDQo6ZGlzbWFwaTpbDQpwYXJhbSAoDQog ICAgW1BhcmFtZXRlcigpXQ0KICAgIFtTdHJpbmddJFRhcmdldEVkaXRpb24sDQoNCiAgICBbUGFyYW1ldGVyKCldDQogICAgW1N0cmluZ10kS2V5DQopDQoN CiRBc3NlbWJseUJ1aWxkZXIgPSBbQXBwRG9tYWluXTo6Q3VycmVudERvbWFpbi5EZWZpbmVEeW5hbWljQXNzZW1ibHkoNCwgMSkNCiRNb2R1bGVCdWlsZGVy ID0gJEFzc2VtYmx5QnVpbGRlci5EZWZpbmVEeW5hbWljTW9kdWxlKDIsICRGYWxzZSkNCiRUQiA9ICRNb2R1bGVCdWlsZGVyLkRlZmluZVR5cGUoMCkNCg0K W3ZvaWRdJFRCLkRlZmluZVBJbnZva2VNZXRob2QoJ0Rpc21Jbml0aWFsaXplJywgJ0Rpc21BcGkuZGxsJywgMjIsIDEsIFtpbnRdLCBAKFtpbnRdLCBbSW50 UHRyXSwgW0ludFB0cl0pLCAxLCAzKQ0KW3ZvaWRdJFRCLkRlZmluZVBJbnZva2VNZXRob2QoJ0Rpc21PcGVuU2Vzc2lvbicsICdEaXNtQXBpLmRsbCcsIDIy LCAxLCBbaW50XSwgQChbU3RyaW5nXSwgW0ludFB0cl0sIFtJbnRQdHJdLCBbVUludDMyXS5NYWtlQnlSZWZUeXBlKCkpLCAxLCAzKQ0KW3ZvaWRdJFRCLkRl ZmluZVBJbnZva2VNZXRob2QoJ19EaXNtU2V0RWRpdGlvbicsICdEaXNtQXBpLmRsbCcsIDIyLCAxLCBbaW50XSwgQChbVUludDMyXSwgW1N0cmluZ10sIFtT dHJpbmddLCBbSW50UHRyXSwgW0ludFB0cl0sIFtJbnRQdHJdKSwgMSwgMykNCiREaXNtID0gJFRCLkNyZWF0ZVR5cGUoKQ0KDQpbdm9pZF0kRGlzbTo6RGlz bUluaXRpYWxpemUoMiwgMCwgMCkNCiRTZXNzaW9uID0gMA0KW3ZvaWRdJERpc206OkRpc21PcGVuU2Vzc2lvbignRElTTV97NTNCRkFFNTItQjE2Ny00RTJG LUEyNTgtMEEzN0I1N0ZGODQ1fScsIDAsIDAsIFtyZWZdJFNlc3Npb24pDQppZiAoISREaXNtOjpfRGlzbVNldEVkaXRpb24oJFNlc3Npb24sICIkVGFyZ2V0 RWRpdGlvbiIsICIkS2V5IiwgMCwgMCwgMCkpIHsNCiAgICBSZXN0YXJ0LUNvbXB1dGVyDQp9DQo6ZGlzbWFwaTpdDQoNCjo6PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgMXN0IGNvbHVtbiA9IEdlbmVyaWMgUmV0YWlsL09FTS9NQUsvR1ZMSyBLZXkNCjo6ICAybmQg Y29sdW1uID0gS2V5IFR5cGUNCjo6ICAzcmQgY29sdW1uID0gV01JIEVkaXRpb24gSUQNCjo6ICA0dGggY29sdW1uID0gVmVyc2lvbiBuYW1lIGluY2FzZSBz YW1lIEVkaXRpb24gSUQgaXMgdXNlZCBpbiBkaWZmZXJlbnQgT1MgdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQga2V5DQo6OiAgU2VwYXJhdG9yICA9IF8NCg0K OjogIEZvciBXaW5kb3dzIDEwLzExIGVkaXRpb25zLCBIV0lEIGtleSBpcyBsaXN0ZWQgd2hlcmUgZXZlciBwb3NzaWJsZSwgaW4gU2VydmVyIHZlcnNpb25z LCBLTVMga2V5IGlzIGxpc3RlZCB3aGVyZSBldmVyIHBvc3NpYmxlLg0KOjogIEZvciBXaW5kb3dzLCBnZW5lcmljIGtleXMgYXJlIG1lbnRpb25lZCB0aWxs IDIyMDAwIGFuZCBmb3IgU2VydmVyLCBnZW5lcmljIGtleXMgYXJlIG1lbnRpb25lZCB0aWxsIDE3NzYzLCBsYXRlciBvbmVzIGFyZSBleHRyYWN0ZWQgZnJv bSB0aGUgcGtleWhlbHBlci5kbGwNCg0KOmNoYW5nZWVkaXRpb25kYXRhDQoNCmlmIGV4aXN0ICIlU3lzdGVtUm9vdCVcU2VydmljaW5nXFBhY2thZ2VzXE1p Y3Jvc29mdC1XaW5kb3dzLVNlcnZlcipFZGl0aW9ufioubXVtIiAoDQppZiAld2luYnVpbGQlIEdUUiAxNzc2MyBleGl0IC9iDQopIGVsc2UgKA0KaWYgJXdp bmJ1aWxkJSBHRVEgMjIwMDAgZXhpdCAvYg0KKQ0KaWYgZXhpc3QgIiVTeXN0ZW1Sb290JVxTZXJ2aWNpbmdcUGFja2FnZXNcTWljcm9zb2Z0LVdpbmRvd3Mt U2VydmVyKkNvckVkaXRpb25+Ki5tdW0iIChzZXQgQ29yPUNvcikgZWxzZSAoc2V0IENvcj0pDQoNCnNldCB3PQ0KZm9yICUlIyBpbiAoDQpYR1ZQUC1OTUg0 Ny03VFRISi1XM0ZXNy04SFYldyUyQ19fT0VNOk5PTlNMUF9FbnRlcnByaXNlDQpENlJEOS1ENE44VC1SVDlRWC1ZVzZZVC1GQ1cldyVXSl9fX19fX1JldGFp bF9TdGFydGVyDQozVjZRNi1OUVhDWC1WOFlYUi05UUNZVi1RUEYldyVDVF9fVm9sdW1lOk1BS19FbnRlcnByaXNlTg0KM05GWFctMlQyN00tMkJEVzYtNEdI UlYtNjhYJXclUlhfX19fX19SZXRhaWxfU3RhcnRlck4NClZLN0pHLU5QSFRNLUM5N0pNLTlNUEdULTNWNiV3JTZUX19fX19fUmV0YWlsX1Byb2Zlc3Npb25h bA0KMkI4N04tOEtGSFAtREtWNlItWTJDOEotUEtDJXclS1RfX19fX19SZXRhaWxfUHJvZmVzc2lvbmFsTg0KNENQUkstTk0zSzMtWDZYWFEtUlhYODYtV1hD JXclSFdfX19fX19SZXRhaWxfQ29yZU4NCk4yNDM0LVg5RDdXLThQRjZYLThEVjlULThUWSV3JU1EX19fX19fUmV0YWlsX0NvcmVDb3VudHJ5U3BlY2lmaWMN CkJUNzlRLUc3TjZHLVBHQllXLTRZV1g2LTZGNCV3JUJUX19fX19fUmV0YWlsX0NvcmVTaW5nbGVMYW5ndWFnZQ0KWVRNRzMtTjZES0MtREtCNzctN005R0gt OEhWJXclWDdfX19fX19SZXRhaWxfQ29yZQ0KWEtDTkMtSjI2UTktS0ZIRDItRktUSFktS0Q3JXclMllfX09FTTpOT05TTFBfUFBJUHJvDQpZTk1HUS04UllW My00UEdRMy1DOFhUUC03Q0YldyVCWV9fX19fX1JldGFpbF9FZHVjYXRpb24NCjg0TkdGLU1IQlQ2LUZYQlg4LVFXSks3LURSUiV3JThIX19fX19fUmV0YWls X0VkdWNhdGlvbk4NCktDTlZILVlLV1g4LUdKSkI5LUg5RkRULTZGNyV3JVcyX19Wb2x1bWU6TUFLX0VudGVycHJpc2VTX1ZCDQo0M1RCUS1OSDkySi1YS1RN Ny1LVDNLSy1QMzkldyVQQl9fT0VNOk5PTlNMUF9FbnRlcnByaXNlU19SUzUNCk5LOTZZLUQ5Q0Q4LVc0NENRLVI4WVRLLURZSiV3JVdYX19PRU06Tk9OU0xQ X0VudGVycHJpc2VTX1JTMQ0KRldON0gtUEY5M1EtNEdHUDgtTThSRjMtTURXJXclV1dfX09FTTpOT05TTFBfRW50ZXJwcmlzZVNfVEgNClJRRk5XLTlUUE0z LUpRNzNULVFWNFZRLURWOSV3JVBUX19Wb2x1bWU6TUFLX0VudGVycHJpc2VTTl9WQg0KTTMzV1YtTkhZM0MtUjdGUE0tQlFHUFQtMjM5JXclUEdfX1ZvbHVt ZTpNQUtfRW50ZXJwcmlzZVNOX1JTNQ0KMkRCVzMtTjJQSkctTVZIVzMtRzdUREstOUhLJXclUjRfX1ZvbHVtZTpNQUtfRW50ZXJwcmlzZVNOX1JTMQ0KTlRY NkItQlJZQzItSzY3ODYtRjZNVlEtTTdWJXclMlhfX1ZvbHVtZTpNQUtfRW50ZXJwcmlzZVNOX1RIDQpHM0tOTS1DSEc2VC1SMzZYMy05UURHNi04TTgldyVL OV9fX19fX1JldGFpbF9Qcm9mZXNzaW9uYWxTaW5nbGVMYW5ndWFnZQ0KSE5HQ0MtWTM4S0ctUVZLOEQtV01XUkstWDg2JXclVktfX19fX19SZXRhaWxfUHJv ZmVzc2lvbmFsQ291bnRyeVNwZWNpZmljDQpEWEc3Qy1OMzZDNC1DNEhURy1YNFQzWC0yWVYldyU3N19fX19fX1JldGFpbF9Qcm9mZXNzaW9uYWxXb3Jrc3Rh dGlvbg0KV1lQTlEtOEM0NjctVjJXNkotVFg0V1gtV1QyJXclUlFfX19fX19SZXRhaWxfUHJvZmVzc2lvbmFsV29ya3N0YXRpb25ODQo4UFRUNi1STlc0Qy02 VjdKMi1DMkQzWC1NSEIldyVQQl9fX19fX1JldGFpbF9Qcm9mZXNzaW9uYWxFZHVjYXRpb24NCkdKVFlOLUhETVFZLUZSUjc2LUhWR0M3LVFQRiV3JThQX19f X19fUmV0YWlsX1Byb2Zlc3Npb25hbEVkdWNhdGlvbk4NCkM0TlRKLUNYNlEyLVZYRE1SLVhWS0dNLUY5RCV3JUpDX19Wb2x1bWU6TUFLX0VudGVycHJpc2VH DQo0NlBONi1SOUJLOS1DVkhLQi1IV1E5Vi1NQkoldyVZOF9fVm9sdW1lOk1BS19FbnRlcnByaXNlR04NCk5KQ0Y3LVBXOFFULTMzMjRELTY4OEpYLTJZViV3 JTY2X19fX19fUmV0YWlsX1NlcnZlclJkc2gNClhRUVlXLU5GRk1XLVhKUEJILUs4NzMyLUNLRiV3JUZEX19fX19fT0VNOkRNX0lvVEVudGVycHJpc2UNClFQ TTZOLTdKMldKLVA4OEhILVAzWVJILVlZNyV3JTRIX19PRU06Tk9OU0xQX0lvVEVudGVycHJpc2VTDQpLOVZLTi0zQkdXVi1ZNjI0Vy1NQ1JNUS1CSEQldyVD RF9fX19fX1JldGFpbF9DbG91ZEVkaXRpb25ODQpLWTdQTi1WUjZSWC04M1c2WS02RERZUS1UNlIldyU0V19fX19fX1JldGFpbF9DbG91ZEVkaXRpb24NClYz V1ZXLU4yUFYyLUNHV0MzLTM0UUdGLVZNSiV3JTJDX19fX19fUmV0YWlsX0Nsb3VkDQpOSDlKMy02OFdLNy02RkI5My00SzNERi1ESjQldyVGNl9fX19fX1Jl dGFpbF9DbG91ZE4NCjJITjZWLUhHVE04LTZDOTdDLVJLNjdWLUpRUCV3JUZEX19fX19fUmV0YWlsX0Nsb3VkRQ0KV0MyQlEtOE5STTMtRkREWVktMkJGR1Yt S0hLJXclUVlfVm9sdW1lOkdWTEtfU2VydmVyU3RhbmRhcmQlQ29yJV9SUzENCkNCN0tGLUJXTjg0LVI3UjJZLTc5M0syLThYRCV3JURHX1ZvbHVtZTpHVkxL X1NlcnZlckRhdGFjZW50ZXIlQ29yJV9SUzENCkpDS1JGLU4zN1A0LUMyRDgyLTlZWFJULTRNNiV3JTNCX1ZvbHVtZTpHVkxLX1NlcnZlclNvbHV0aW9uX1JT MQ0KUU40QzYtR0JKRDItRkI0MjItR0hXSkstR0pHJXclMlJfVm9sdW1lOkdWTEtfU2VydmVyQ2xvdWRTdG9yYWdlX1JTMQ0KVlAzNEctNE5QUEctNzlKVFEt ODY0VDQtUjNNJXclUVhfVm9sdW1lOkdWTEtfU2VydmVyQXp1cmVDb3JfUlMxDQo5SlFOUS1WOEhRNi1QS0I4SC1HR0hSWS1SNjIldyVINl9fX19fX1JldGFp bF9TZXJ2ZXJBenVyZU5hbm9fUlMxDQpWTjhEMy1QUjgySC1EQjZCSi1KOVA0TS05MkYldyU2Sl9fX19fX1JldGFpbF9TZXJ2ZXJTdG9yYWdlU3RhbmRhcmRf UlMxDQo0OFRRWC1OVkszUi1EOFFSMy1HVEhITS04RkgldyVYQ19fX19fX1JldGFpbF9TZXJ2ZXJTdG9yYWdlV29ya2dyb3VwX1JTMQ0KMkhYRE4tS1JYSEIt R1BZQzctWUNLRkotN0ZWJXclREdfVm9sdW1lOkdWTEtfU2VydmVyRGF0YWNlbnRlckFDb3JfUlMzDQpQVFhOOC1KRkhKTS00V0M3OC1NUENCUi05VzQldyVL Ul9Wb2x1bWU6R1ZMS19TZXJ2ZXJTdGFuZGFyZEFDb3JfUlMzDQopIGRvICgNCmZvciAvZiAidG9rZW5zPTEtNCBkZWxpbXM9XyIgJSVBIGluICgiJSUjIikg ZG8gaWYgL2kgJXRhcmdldGVkaXRpb24lPT0lJUMgKA0KDQppZiBub3QgZGVmaW5lZCBrZXkgKA0Kc2V0IDR0aD0lJUQNCmlmIG5vdCBkZWZpbmVkIDR0aCAo DQpzZXQgImtleT0lJUEiICYgc2V0ICJfY2hhbj0lJUIiDQopIGVsc2UgKA0KZWNobyAiJWJyYW5jaCUiIHwgZmluZCAvaSAiJSVEIiAlbnVsMSUgJiYgKHNl dCAia2V5PSUlQSIgJiBzZXQgIl9jaGFuPSUlQiIpDQopDQopDQopDQopDQpleGl0IC9iDQoNCjorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKw0KDQo6Y2hhbmdlX29mZmVkaXRpb24NCg0Kc2V0ICJsaW5lPWVjaG8gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyINCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBt b2RlIDk4LCAzMA0KdGl0bGUgIENoYW5nZSBPZmZpY2UgRWRpdGlvbiAlbWFzdmVyJQ0KDQppZiAld2luYnVpbGQlIExTUyA3NjAwICgNCiVlbGluZSUNCmVj aG8gVW5zdXBwb3J0ZWQgT1MgdmVyc2lvbiBkZXRlY3RlZCBbJXdpbmJ1aWxkJV0uDQplY2hvIFRoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBX aW5kb3dzIDcvOC84LjEvMTAvMTEgYW5kIHRoZWlyIFNlcnZlciBlcXVpdmFsZW50cy4NCmdvdG8gZGtfZG9uZQ0KKQ0KDQplY2hvOg0KZWNobyBJbml0aWFs aXppbmcuLi4NCmVjaG86DQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpzZXQgc3BwPVNvZnR3YXJlTGlj ZW5zaW5nUHJvZHVjdA0Kc2V0IHNwcz1Tb2Z0d2FyZUxpY2Vuc2luZ1NlcnZpY2UNCg0KY2FsbCA6ZGtfcmVmbGVjdGlvbg0KY2FsbCA6ZGtfY2tlY2t3bWlj DQpjYWxsIDpka19zcHBpc3N1ZQ0KDQpmb3IgL2YgInRva2Vucz02LTcgZGVsaW1zPVtdLiAiICUlaSBpbiAoJ3ZlcicpIGRvIGlmIG5vdCAiJSVqIj09IiIg KA0Kc2V0IGZ1bGxidWlsZD0lJWkuJSVqDQopIGVsc2UgKA0KZm9yIC9mICJ0b2tlbnM9MyIgJSVHIGluICgnInJlZyBxdWVyeSAiSEtMTVxTT0ZUV0FSRVxN aWNyb3NvZnRcV2luZG93cyBOVFxDdXJyZW50VmVyc2lvbiIgL3YgVUJSIiAlbnVsNiUnKSBkbyBpZiBub3QgZXJyb3JsZXZlbCAxIHNldCAvYSAiVUJSPSUl RyINCmZvciAvZiAic2tpcD0yIHRva2Vucz0zLDQgZGVsaW1zPS4gIiAlJUcgaW4gKCdyZWcgcXVlcnkgIkhLTE1cU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRv d3MgTlRcQ3VycmVudFZlcnNpb24iIC92IEJ1aWxkTGFiRXgnKSBkbyAoDQppZiBkZWZpbmVkIFVCUiAoc2V0ICJmdWxsYnVpbGQ9JSVHLiFVQlIhIikgZWxz ZSAoc2V0ICJmdWxsYnVpbGQ9JSVHLiUlSCIpDQopDQopDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6 OiAgQ2hlY2sgV2luZG93cyBFZGl0aW9uDQo6OiAgVGhpcyBpcyBqdXN0IHRvIGVuc3VyZSB0aGF0IFNQUC9XTUkgYXJlIGZ1bmN0aW9uYWwNCg0KY2xzDQpz ZXQgb3NlZGl0aW9uPTANCmlmICVfd21pYyUgRVFVIDEgc2V0ICJjaGtlZGk9Zm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSVhIGluICgnIndtaWMgcGF0 aCAlc3BwJSB3aGVyZSAoQXBwbGljYXRpb25JRD0nNTVjOTI3MzQtZDY4Mi00ZDcxLTk4M2UtZDZlYzNmMTYwNTlmJyBBTkQgTGljZW5zZURlcGVuZHNPbiBp cyBOVUxMIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVMTCkgZ2V0IExpY2Vuc2VGYW1pbHkgL1ZBTFVFIiAlbnVsNiUnKSINCmlmICVfd21pYyUg RVFVIDAgc2V0ICJjaGtlZGk9Zm9yIC9mICJ0b2tlbnM9MiBkZWxpbXM9PSIgJSVhIGluICgnJXBzYyUgIigoW1dNSVNFQVJDSEVSXSdTRUxFQ1QgTGljZW5z ZUZhbWlseSBGUk9NICVzcHAlIFdIRVJFIEFwcGxpY2F0aW9uSUQ9Jyc1NWM5MjczNC1kNjgyLTRkNzEtOTgzZS1kNmVjM2YxNjA1OWYnJyBBTkQgTGljZW5z ZURlcGVuZHNPbiBpcyBOVUxMIEFORCBQYXJ0aWFsUHJvZHVjdEtleSBJUyBOT1QgTlVMTCcpLkdldCgpKS5MaWNlbnNlRmFtaWx5IF58ICUlIHtlY2hvICgn TGljZW5zZUZhbWlseT0nKyRfKX0iICVudWw2JScpIg0KJWNoa2VkaSUgZG8gaWYgbm90IGVycm9ybGV2ZWwgMSAoY2FsbCBzZXQgIm9zZWRpdGlvbj0lJWEi KQ0KDQppZiAlb3NlZGl0aW9uJT09MCAoDQolZWxpbmUlDQplY2hvIEZhaWxlZCB0byBkZXRlY3QgT1MgRWRpdGlvbi4gQWJvcnRpbmcuLi4NCmNhbGwgOmRr X2NvbG9yICVCbHVlJSAiVG8gZml4IHRoaXMgaXNzdWUsIGFjdGl2YXRlIFdpbmRvd3MgZnJvbSB0aGUgbWFpbiBtZW51LiINCmdvdG8gZGtfZG9uZQ0KKQ0K DQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIGluc3RhbGxlZCBPZmZpY2UgMTYuMCBDMlIN Cg0Kc2V0IG8xNmMycj0NCnNldCBfNjg9SEtMTVxTT0ZUV0FSRVxNaWNyb3NvZnRcT2ZmaWNlDQpzZXQgXzg2PUhLTE1cU09GVFdBUkVcV293NjQzMk5vZGVc TWljcm9zb2Z0XE9mZmljZQ0KDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV84NiVcQ2xpY2tUb1J1biAvdiBJbnN0 YWxsUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzMTZcUHJvUGx1cyoueHJtLW1zIiAoc2V0IG8xNmMycj0xJnNldCBvMTZj MnJfcmVnPSVfODYlXENsaWNrVG9SdW4pDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJV82OCVcQ2xpY2tUb1J1biAv diBJbnN0YWxsUGF0aCIgJW51bDYlJykgZG8gaWYgZXhpc3QgIiUlYlxyb290XExpY2Vuc2VzMTZcUHJvUGx1cyoueHJtLW1zIiAoc2V0IG8xNmMycj0xJnNl dCBvMTZjMnJfcmVnPSVfNjglXENsaWNrVG9SdW4pDQoNCmlmIG5vdCBkZWZpbmVkIG8xNmMycl9yZWcgKA0KJWVsaW5lJQ0KZWNobyBPZmZpY2UgQzJSIDIw MTYgb3IgbGF0ZXIgaXMgbm90IGluc3RhbGxlZCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHRoaXMgc2NyaXB0Lg0KZWNobyBEb3dubG9hZCBhbmQgaW5zdGFs bCBPZmZpY2UgZnJvbSBiZWxvdyBVUkwgYW5kIHRyeSBhZ2Fpbi4NCnNldCBmaXhlcz0lZml4ZXMlICVtYXMlZ2VudWluZS1pbnN0YWxsYXRpb24tbWVkaWEN CmNhbGwgOmRrX2NvbG9yICVfWWVsbG93JSAiJW1hcyVnZW51aW5lLWluc3RhbGxhdGlvbi1tZWRpYSINCmdvdG8gZGtfZG9uZQ0KKQ0KDQpjYWxsIDpjaF9n ZXRpbmZvDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hlY2sgbWluaW11bSByZXF1aXJlZCBk ZXRhaWxzDQoNCmlmICV2ZXJjaGslIExTUyA5MDI5ICgNCiVlbGluZSUNCmVjaG8gSW5zdGFsbGVkIE9mZmljZSB2ZXJzaW9uIGlzICVfdmVyc2lvbiUuDQpl Y2hvIE1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBpcyAxNi4wLjkwMjkuMjE2Nw0KZWNobyBBYm9ydGluZy4uLg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUlICJE b3dubG9hZCBhbmQgaW5zdGFsbCBsYXRlc3QgT2ZmaWNlIGZyb20gYmVsb3cgVVJMIGFuZCB0cnkgYWdhaW4uIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVn ZW51aW5lLWluc3RhbGxhdGlvbi1tZWRpYQ0KY2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICIlbWFzJWdlbnVpbmUtaW5zdGFsbGF0aW9uLW1lZGlhIg0KZ290 byBka19kb25lDQopDQoNCmZvciAlJUEgaW4gKA0KX29BcmNoDQpfdXBkY2gNCl9sYW5nDQpfY2x2ZXJzaW9uDQpfdmVyc2lvbg0KX0F1ZGllbmNlRGF0YQ0K X29JZHMNCl9jMnJYbWwNCl9jMnJFeGUNCl9jMnJDZXhlDQpfbWFzdGVyeG1sDQopIGRvICgNCmlmIG5vdCBkZWZpbmVkICUlQSAoDQolZWxpbmUlDQplY2hv IEZhaWxlZCB0byBmaW5kICUlQS4gQWJvcnRpbmcuLi4NCmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiRG93bmxvYWQgYW5kIGluc3RhbGwgT2ZmaWNlIGZyb20g YmVsb3cgVVJMIGFuZCB0cnkgYWdhaW4uIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyVnZW51aW5lLWluc3RhbGxhdGlvbi1tZWRpYQ0KY2FsbCA6ZGtfY29s b3IgJV9ZZWxsb3clICIlbWFzJWdlbnVpbmUtaW5zdGFsbGF0aW9uLW1lZGlhIg0KZ290byBka19kb25lDQopDQopDQoNCmlmICV3aW5idWlsZCUgTFNTIDEw MjQwIGlmIGRlZmluZWQgbHRzY2ZvdW5kICgNCiVlbGluZSUNCmVjaG8gSW5zdGFsbGVkIE9mZmljZSBhcHBlYXJzIHRvIGJlIGZyb20gdGhlIFZvbHVtZSBj aGFubmVsICVsdHNjMTklJWx0c2MyMSUlbHRzYzI0JSwNCmVjaG8gd2hpY2ggaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkIG9uIHlvdXIgV2luZG93cyBi dWlsZCB2ZXJzaW9uICV3aW5idWlsZCUuDQplY2hvIEFib3J0aW5nLi4uDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2FsbCA6ZGtf Y29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCmdvdG8gZGtfZG9u ZQ0KKQ0KDQpzZXQgdW5zdXBidWlsZD0NCmlmICV3aW5idWlsZCUgTFNTIDEwMjQwIGlmICV3aW5idWlsZCUgR0VRIDkyMDAgaWYgJXZlcmNoayUgR1RSIDE2 MDI2IHNldCB1bnN1cGJ1aWxkPTENCmlmICV3aW5idWlsZCUgTFNTIDkyMDAgaWYgJXZlcmNoayUgR1RSIDEyNTI3IHNldCB1bnN1cGJ1aWxkPTENCg0KaWYg ZGVmaW5lZCB1bnN1cGJ1aWxkICgNCiVlbGluZSUNCmVjaG8gVW5zdXBwb3J0ZWQgT2ZmaWNlICV2ZXJjaGslIGlzIGluc3RhbGxlZCBvbiB5b3VyIFdpbmRv d3MgYnVpbGQgdmVyc2lvbiAld2luYnVpbGQlLg0KZWNobyBBYm9ydGluZy4uLg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwg OmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQpnb3RvIGRr X2RvbmUNCikNCg0Kc2V0ICJvX3JhbmRndWlkPSINCmZvciAvZiAlJUcgaW4gKCclcHNjJSAiW0d1aWRdOjpOZXdHdWlkKCkuR3VpZCIgXnwgZmluZHN0ciAv ciAiXlswMTIzNDU2Nzg5YWJjZGVmXSotWzAxMjM0NTY3ODlhYmNkZWZdKi1bMDEyMzQ1Njc4OWFiY2RlZl0qLVswMTIzNDU2Nzg5YWJjZGVmXSotWzAxMjM0 NTY3ODlhYmNkZWZdKiQiJykgZG8gc2V0ICJvX3JhbmRndWlkPSUlRyINCmlmIG5vdCBkZWZpbmVkIG9fcmFuZGd1aWQgKA0KJWVsaW5lJQ0KZWNobyBVbmFi bGUgdG8gZ2VuZXJhdGUgR1VJRCB3aXRoIFBvd2VyU2hlbGwuDQplY2hvIEFib3J0aW5nLi4uDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9v dA0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCIN CmdvdG8gZGtfZG9uZQ0KKQ0KbWQgIiVTeXN0ZW1Sb290JVxUZW1wXCVvX3JhbmRndWlkJVwiDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQ0KDQo6b2VtZW51DQoNCmNscw0Kc2V0IGZpeGVzPQ0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgbW9kZSA3NiwgMjUNCnRpdGxl ICBDaGFuZ2UgT2ZmaWNlIEVkaXRpb24gJW1hc3ZlciUNCmVjaG86DQplY2hvOg0KZWNobzoNCmVjaG86DQplY2hvICAgICAgICAgX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQplY2hvOg0KZWNobyAgICAgICAgICAgICAgICAgWzFdIENoYW5nZSBhbGwg ZWRpdGlvbnMNCmVjaG8gICAgICAgICAgICAgICAgIFsyXSBBZGQgZWRpdGlvbg0KZWNobyAgICAgICAgICAgICAgICAgWzNdIFJlbW92ZSBlZGl0aW9uDQpl Y2hvOg0KZWNobyAgICAgICAgICAgICAgICAgWzRdIEFkZC9SZW1vdmUgYXBwcw0KZWNobyAgICAgICAgICAgICAgICAgX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18NCmVjaG86DQplY2hvICAgICAgICAgICAgICAgICBbNV0gQ2hhbmdlIE9mZmljZSBVcGRhdGUgQ2hhbm5lbA0KZWNo byAgICAgICAgICAgICAgICAgWzBdICVfZXhpdG1zZyUNCmVjaG8gICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18NCmVjaG86IA0KY2FsbCA6ZGtfY29sb3IyICVfV2hpdGUlICIgICAgICAgICAgICIgJV9HcmVlbiUgIkNob29zZSBhIG1lbnUg b3B0aW9uIHVzaW5nIHlvdXIga2V5Ym9hcmQgWzEsMiwzLDQsNSwwXSINCmNob2ljZSAvQzoxMjM0NTAgL04NCnNldCBfZWw9IWVycm9ybGV2ZWwhDQppZiAh X2VsIT09NiAgZXhpdCAvYg0KaWYgIV9lbCE9PTUgIGdvdG8gOm9lX2NoYW5nZXVwZGNobmwNCmlmICFfZWwhPT00ICBnb3RvIDpvZV9lZGl0ZWRpdGlvbg0K aWYgIV9lbCE9PTMgIGdvdG8gOm9lX3JlbW92ZWVkaXRpb24NCmlmICFfZWwhPT0yICBzZXQgY2hhbmdlPTAmIGdvdG8gOm9lX2VkaXRpb24NCmlmICFfZWwh PT0xICBzZXQgY2hhbmdlPTEmIGdvdG8gOm9lX2VkaXRpb24NCmdvdG8gOm9lbWVudQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0NCg0KOm9lX2VkaXRpb24NCg0KY2xzDQpjYWxsIDpvZV9jaGtpbnRlcm5ldA0KaWYgbm90IGRlZmluZWQgX2ludCAoDQpnb3RvIDpvZV9n b2JhY2sNCikNCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDc2LCAyNQ0KaWYgJWNoYW5nZSU9PTEgKA0KdGl0bGUgIENoYW5nZSBhbGwg ZWRpdGlvbnMgJW1hc3ZlciUNCikgZWxzZSAoDQp0aXRsZSAgQWRkIGVkaXRpb24gJW1hc3ZlciUNCikNCg0KZWNobzoNCmVjaG86DQplY2hvOg0KZWNobzoN CmVjaG8gICAgICAgICAgICAgICAgIE8zNjUvTW9uZG8gZWRpdGlvbnMgaGF2ZSB0aGUgbGF0ZXN0IGZlYXR1cmVzLiAgICAgDQplY2hvICAgICAgICAgX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQplY2hvOg0KZWNobyAgICAgICAgICAgICAgICAgWzFd IE9mZmljZSBTdWl0ZXMgICAgIC0gUmV0YWlsDQplY2hvICAgICAgICAgICAgICAgICBbMl0gT2ZmaWNlIFN1aXRlcyAgICAgLSBWb2x1bWUNCmVjaG8gICAg ICAgICAgICAgICAgIFszXSBPZmZpY2UgU2luZ2xlQXBwcyAtIFJldGFpbA0KZWNobyAgICAgICAgICAgICAgICAgWzRdIE9mZmljZSBTaW5nbGVBcHBzIC0g Vm9sdW1lDQplY2hvICAgICAgICAgICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KZWNobzoNCmVjaG8gICAg ICAgICAgICAgICAgIFswXSBHbyBCYWNrDQplY2hvICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fDQplY2hvOiANCmNhbGwgOmRrX2NvbG9yMiAlX1doaXRlJSAiICAgICAgICAgICAgIiAlX0dyZWVuJSAiQ2hvb3NlIGEgbWVudSBvcHRpb24g dXNpbmcgeW91ciBrZXlib2FyZCBbMSwyLDMsNCwwXSINCmNob2ljZSAvQzoxMjM0MCAvTg0Kc2V0IF9lbD0hZXJyb3JsZXZlbCENCmlmICFfZWwhPT01ICBn b3RvIDpvZW1lbnUNCmlmICFfZWwhPT00ICBzZXQgbGlzdD1TaW5nbGVBcHBzX1ZvbHVtZSZnb3RvIDpvZV9lZGl0aW9uY2hhbmdlcHJlDQppZiAhX2VsIT09 MyAgc2V0IGxpc3Q9U2luZ2xlQXBwc19SZXRhaWwmZ290byA6b2VfZWRpdGlvbmNoYW5nZXByZQ0KaWYgIV9lbCE9PTIgIHNldCBsaXN0PVN1aXRlc19Wb2x1 bWUmZ290byA6b2VfZWRpdGlvbmNoYW5nZXByZQ0KaWYgIV9lbCE9PTEgIHNldCBsaXN0PVN1aXRlc19SZXRhaWwmZ290byA6b2VfZWRpdGlvbmNoYW5nZXBy ZQ0KZ290byA6b2VfZWRpdGlvbg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOm9lX2VkaXRpb25jaGFu Z2VwcmUNCg0KY2xzDQpzZXQgZWRpdGVkaXRpb249DQpjYWxsIDpjaF9nZXRpbmZvDQpjYWxsIDpvZV90ZW1wY2xlYW51cA0KJXBzYyUgIiRmPVtJTy5GaWxl XTo6UmVhZEFsbFRleHQoJyFfYmF0cCEnKSAtc3BsaXQgJzpnZXRsaXN0XDouKic7LiAoW3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSkiDQoNCjpvZV9l ZGl0aW9uY2hhbmdlDQoNCmNscw0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgKA0KbW9kZSA5OCwgNDUNCiVwc2MlICImeyRXPSRIb3N0LlVJLlJhd1VJLldp bmRvd1NpemU7JEI9JEhvc3QuVUkuUmF3VUkuQnVmZmVyU2l6ZTskVy5IZWlnaHQ9NDQ7JEIuSGVpZ2h0PTEwMDskSG9zdC5VSS5SYXdVSS5XaW5kb3dTaXpl PSRXOyRIb3N0LlVJLlJhd1VJLkJ1ZmZlclNpemU9JEI7fSIgJW51bCUNCikNCg0KaWYgbm90IGV4aXN0ICVTeXN0ZW1Sb290JVxUZW1wXCVvX3JhbmRndWlk JVwlbGlzdCUudHh0ICgNCiVlbGluZSUNCmVjaG8gRmFpbGVkIHRvIGdlbmVyYXRlIGF2YWlsYWJsZSBlZGl0aW9ucyBsaXN0Lg0Kc2V0IGZpeGVzPSVmaXhl cyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIg JW1hcyV0cm91Ymxlc2hvb3QiDQpnb3RvIDpvZV9nb2JhY2sNCikNCg0Kc2V0IGlucHQ9DQpzZXQgY291bnRlcj0wDQpzZXQgdmVyaWZpZWQ9MA0Kc2V0IF9u b3Rmb3VuZD0NCnNldCB0YXJnZXRlZGl0aW9uPQ0KDQolbGluZSUNCmVjaG86DQpjYWxsIDpka19jb2xvciAlR3JheSUgIkluc3RhbGxlZCBPZmZpY2UgZWRp dGlvbnM6ICVfb0lkcyUiDQpjYWxsIDpka19jb2xvciAlR3JheSUgIllvdSBjYW4gc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIE9mZmljZSBFZGl0aW9u cy4iDQppZiAld2luYnVpbGQlIExTUyAxMDI0MCAoDQplY2hvIFVuc3VwcG9ydGVkIHByb2R1Y3RzIHN1Y2ggYXMgMjAxOS8yMDIxLzIwMjQgYXJlIGV4Y2x1 ZGVkIGZyb20gdGhpcyBsaXN0Lg0KKSBlbHNlICgNCmZvciAlJSMgaW4gKDIwMTkgMjAyMSAyMDI0KSBkbyAoDQpmaW5kIC9pICIlJSMiICIlU3lzdGVtUm9v dCVcVGVtcFwlb19yYW5kZ3VpZCVcJWxpc3QlLnR4dCIgJW51bDElIHx8ICgNCmlmIGRlZmluZWQgX25vdGZvdW5kIChzZXQgX25vdGZvdW5kPSUlIywgIV9u b3Rmb3VuZCEpIGVsc2UgKHNldCBfbm90Zm91bmQ9JSUjKQ0KKQ0KKQ0KaWYgZGVmaW5lZCBfbm90Zm91bmQgY2FsbCA6ZGtfY29sb3IgJUdyYXklICJPZmZp Y2UgIV9ub3Rmb3VuZCEgaXMgbm90IGluIHRoaXMgbGlzdCBiZWNhdXNlIG9sZCB2ZXJzaW9uIFslX3ZlcnNpb24lXSBvZiBPZmZpY2UgaXMgaW5zdGFsbGVk LiINCikNCiVsaW5lJQ0KZWNobzoNCg0KZm9yIC9mICJ1c2ViYWNrcSBkZWxpbXM9IiAlJUEgaW4gKCVTeXN0ZW1Sb290JVxUZW1wXCVvX3JhbmRndWlkJVwl bGlzdCUudHh0KSBkbyAoDQpzZXQgL2EgY291bnRlcis9MQ0KaWYgIWNvdW50ZXIhIExTUyAxMCAoDQplY2hvIFshY291bnRlciFdICAlJUENCikgZWxzZSAo DQplY2hvIFshY291bnRlciFdICUlQQ0KKQ0Kc2V0IHRhcmdldGVkaXRpb24hY291bnRlciE9JSVBDQopDQoNCiVsaW5lJQ0KZWNobzoNCmVjaG8gWzBdICBH byBCYWNrDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJV9HcmVlbiUgIkVudGVyIGFuIG9wdGlvbiBudW1iZXIgdXNpbmcgeW91ciBrZXlib2FyZCBhbmQgcHJl c3MgRW50ZXIgdG8gY29uZmlybToiDQpzZXQgL3AgaW5wdD0NCmlmICIlaW5wdCUiPT0iIiBnb3RvIDpvZV9lZGl0aW9uY2hhbmdlDQppZiAiJWlucHQlIj09 IjAiIChjYWxsIDpvZV90ZW1wY2xlYW51cCAmIGdvdG8gOm9lX2VkaXRpb24pDQpmb3IgL2wgJSVpIGluICgxLDEsJWNvdW50ZXIlKSBkbyAoaWYgIiVpbnB0 JSI9PSIlJWkiIHNldCB2ZXJpZmllZD0xKQ0Kc2V0IHRhcmdldGVkaXRpb249IXRhcmdldGVkaXRpb24laW5wdCUhDQppZiAldmVyaWZpZWQlPT0wIGdvdG8g Om9lX2VkaXRpb25jaGFuZ2UNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBTZXQgYXBwIGV4Y2x1 c2lvbnMNCg0KOm9lX2V4Y2x1ZGVhcHBzcHJlDQoNCmNscw0Kc2V0IHN1aXRlcz0NCmVjaG8gJWxpc3QlIHwgZmluZCAvaSAiU3VpdGVzIiAlbnVsMSUgJiYg KA0Kc2V0IHN1aXRlcz0xDQolcHNjJSAiJGY9W0lPLkZpbGVdOjpSZWFkQWxsVGV4dCgnIV9iYXRwIScpIC1zcGxpdCAnOmdldGFwcG5hbWVzXDouKic7LiAo W3NjcmlwdGJsb2NrXTo6Q3JlYXRlKCRmWzFdKSkiDQppZiBub3QgZXhpc3QgJVN5c3RlbVJvb3QlXFRlbXBcJW9fcmFuZGd1aWQlXGdldEFwcElkcy50eHQg KA0KJWVsaW5lJQ0KZWNobyBGYWlsZWQgdG8gZ2VuZXJhdGUgYXZhaWxhYmxlIGFwcHMgbGlzdC4NCnNldCBmaXhlcz0lZml4ZXMlICVtYXMldHJvdWJsZXNo b290DQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMldHJvdWJsZXNob290 Ig0KZ290byA6b2VfZ29iYWNrDQopDQopDQoNCmZvciAlJSMgaW4gKA0KQWNjZXNzDQpFeGNlbA0KTHluYw0KT25lTm90ZQ0KT3V0bG9vaw0KUG93ZXJQb2lu dA0KUHJvamVjdA0KUHVibGlzaGVyDQpWaXNpbw0KV29yZA0KKSBkbyAoDQppZiBkZWZpbmVkIHN1aXRlcyAoDQpmaW5kIC9pICIlJSMiICIlU3lzdGVtUm9v dCVcVGVtcFwlb19yYW5kZ3VpZCVcZ2V0QXBwSWRzLnR4dCIgJW51bDElICYmIChzZXQgJSUjX3N0PU9uKSB8fCAoc2V0ICUlI19zdD0pDQopIGVsc2UgKA0K c2V0ICUlI19zdD0NCikNCikNCg0KaWYgZGVmaW5lZCBMeW5jX3N0IHNldCBMeW5jX3N0PU9mZg0Kc2V0IE9uZURyaXZlX3N0PU9mZg0KaWYgZGVmaW5lZCBz dWl0ZXMgKHNldCBUZWFtc19zdD1PZmYpIGVsc2UgKHNldCBUZWFtc19zdD0pDQoNCnNldCBPdXRsb29rRm9yV2luZG93c19zdD0NCmlmICV3aW5idWlsZCUg R0VRIDE5MDQxIGlmIGRlZmluZWQgT3V0bG9va19zdCBlY2hvICV0YXJnZXRlZGl0aW9uJSB8IGZpbmQgL2kgIk8zNjUiICVudWwxJSAmJiAoDQpzZXQgT3V0 bG9va0ZvcldpbmRvd3Nfc3Q9T2ZmDQopDQoNCjpvZV9leGNsdWRlYXBwcw0KDQpjbHMNCmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsIG1vZGUgOTgsIDMyDQoN CiVsaW5lJQ0KZWNobzoNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiVGFyZ2V0IGVkaXRpb246ICV0YXJnZXRlZGl0aW9uJSINCmNhbGwgOmRrX2NvbG9yICVH cmF5JSAiVG8gZXhjbHVkZSB0aGUgYXBwcyBsaXN0ZWQgYmVsb3cgZnJvbSBpbnN0YWxsYXRpb24sIHRvZ2dsZSB0aGVtIGZyb20gT24gdG8gT2ZmLiINCmlm IGRlZmluZWQgZWRpdGVkaXRpb24gY2FsbCA6ZGtfY29sb3IgJUdyYXklICJOb3RlOiBUaGUgT24vT2ZmIHN0YXR1cyBiZWxvdyBkb2VzIG5vdCByZWZsZWN0 IHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgaW5zdGFsbGVkIGFwcHMuIg0KJWxpbmUlDQppZiBkZWZpbmVkIHN1aXRlcyBlY2hvOg0KaWYgZGVmaW5lZCBB Y2Nlc3Nfc3QgICAgICAgICAgICBlY2hvIFtBXSBBY2Nlc3MgICAgICAgICAgICAgIDogJUFjY2Vzc19zdCUNCmlmIGRlZmluZWQgRXhjZWxfc3QgICAgICAg ICAgICAgZWNobyBbRV0gRXhjZWwgICAgICAgICAgICAgICA6ICVFeGNlbF9zdCUNCmlmIGRlZmluZWQgT25lTm90ZV9zdCAgICAgICAgICAgZWNobyBbTl0g T25lTm90ZSAgICAgICAgICAgICA6ICVPbmVOb3RlX3N0JQ0KaWYgZGVmaW5lZCBPdXRsb29rX3N0ICAgICAgICAgICBlY2hvIFtPXSBPdXRsb29rIF4oQ2xh c3NpY14pICAgOiAlT3V0bG9va19zdCUNCmlmIGRlZmluZWQgUG93ZXJQb2ludF9zdCAgICAgICAgZWNobyBbUF0gUG93ZXJQb2ludCAgICAgICAgICA6ICVQ b3dlclBvaW50X3N0JQ0KaWYgZGVmaW5lZCBQcm9qZWN0X3N0ICAgICAgICAgICBlY2hvIFtKXSBQcm9qZWN0ICAgICAgICAgICAgIDogJVByb2plY3Rfc3Ql DQppZiBkZWZpbmVkIFB1Ymxpc2hlcl9zdCAgICAgICAgIGVjaG8gW1JdIFB1Ymxpc2hlciAgICAgICAgICAgOiAlUHVibGlzaGVyX3N0JQ0KaWYgZGVmaW5l ZCBWaXNpb19zdCAgICAgICAgICAgICBlY2hvIFtWXSBWaXNpbyAgICAgICAgICAgICAgIDogJVZpc2lvX3N0JQ0KaWYgZGVmaW5lZCBXb3JkX3N0ICAgICAg ICAgICAgICBlY2hvIFtXXSBXb3JkICAgICAgICAgICAgICAgIDogJVdvcmRfc3QlDQplY2hvOg0KaWYgZGVmaW5lZCBMeW5jX3N0ICAgICAgICAgICAgICBl Y2hvIFtMXSBTa3lwZUZvckJ1c2luZXNzICAgIDogJUx5bmNfc3QlDQppZiBkZWZpbmVkIE91dGxvb2tGb3JXaW5kb3dzX3N0IGVjaG8gW0tdIE91dGxvb2sg XihOZXdeKSAgICAgICA6ICVPdXRsb29rRm9yV2luZG93c19zdCUNCmlmIGRlZmluZWQgT25lRHJpdmVfc3QgICAgICAgICAgZWNobyBbRF0gT25lRHJpdmUg ICAgICAgICAgICA6ICVPbmVEcml2ZV9zdCUNCmlmIGRlZmluZWQgVGVhbXNfc3QgICAgICAgICAgICAgZWNobyBbVF0gVGVhbXMgICAgICAgICAgICAgICA6 ICVUZWFtc19zdCUNCiVsaW5lJQ0KZWNobzoNCmVjaG8gWzFdIENvbnRpbnVlDQplY2hvIFswXSBHbyBCYWNrDQolbGluZSUNCmVjaG86DQpjYWxsIDpka19j b2xvciAlX0dyZWVuJSAiQ2hvb3NlIGEgbWVudSBvcHRpb24gdXNpbmcgeW91ciBrZXlib2FyZDoiDQpjaG9pY2UgL0M6QUVOT1BKUlZXTEtEVDEwIC9ODQpz ZXQgX2VsPSFlcnJvcmxldmVsIQ0KaWYgIV9lbCE9PTE1IGdvdG8gOm9lbWVudQ0KaWYgIV9lbCE9PTE0IGNhbGwgOmV4Y2x1ZGVsaXN0ICYgZ290byA6b2Vf ZWRpdGlvbmNoYW5nZWZpbmFsDQppZiAhX2VsIT09MTMgaWYgZGVmaW5lZCBUZWFtc19zdCAgICAgICAgICAgICAoaWYgIiVUZWFtc19zdCUiPT0iT2ZmIiAg ICAgICAgICAgICAoc2V0IFRlYW1zX3N0PU9OKSAgICAgICAgICAgICBlbHNlIChzZXQgVGVhbXNfc3Q9T2ZmKSkNCmlmICFfZWwhPT0xMiBpZiBkZWZpbmVk IE9uZURyaXZlX3N0ICAgICAgICAgIChpZiAiJU9uZURyaXZlX3N0JSI9PSJPZmYiICAgICAgICAgIChzZXQgT25lRHJpdmVfc3Q9T04pICAgICAgICAgIGVs c2UgKHNldCBPbmVEcml2ZV9zdD1PZmYpKQ0KaWYgIV9lbCE9PTExIGlmIGRlZmluZWQgT3V0bG9va0ZvcldpbmRvd3Nfc3QgKGlmICIlT3V0bG9va0Zvcldp bmRvd3Nfc3QlIj09Ik9mZiIgKHNldCBPdXRsb29rRm9yV2luZG93c19zdD1PTikgZWxzZSAoc2V0IE91dGxvb2tGb3JXaW5kb3dzX3N0PU9mZikpDQppZiAh X2VsIT09MTAgaWYgZGVmaW5lZCBMeW5jX3N0ICAgICAgICAgICAgICAoaWYgIiVMeW5jX3N0JSI9PSJPZmYiICAgICAgICAgICAgICAoc2V0IEx5bmNfc3Q9 T04pICAgICAgICAgICAgICBlbHNlIChzZXQgTHluY19zdD1PZmYpKQ0KaWYgIV9lbCE9PTkgIGlmIGRlZmluZWQgV29yZF9zdCAgICAgICAgICAgICAgKGlm ICIlV29yZF9zdCUiPT0iT2ZmIiAgICAgICAgICAgICAgKHNldCBXb3JkX3N0PU9OKSAgICAgICAgICAgICAgZWxzZSAoc2V0IFdvcmRfc3Q9T2ZmKSkNCmlm ICFfZWwhPT04ICBpZiBkZWZpbmVkIFZpc2lvX3N0ICAgICAgICAgICAgIChpZiAiJVZpc2lvX3N0JSI9PSJPZmYiICAgICAgICAgICAgIChzZXQgVmlzaW9f c3Q9T04pICAgICAgICAgICAgIGVsc2UgKHNldCBWaXNpb19zdD1PZmYpKQ0KaWYgIV9lbCE9PTcgIGlmIGRlZmluZWQgUHVibGlzaGVyX3N0ICAgICAgICAg KGlmICIlUHVibGlzaGVyX3N0JSI9PSJPZmYiICAgICAgICAgKHNldCBQdWJsaXNoZXJfc3Q9T04pICAgICAgICAgZWxzZSAoc2V0IFB1Ymxpc2hlcl9zdD1P ZmYpKQ0KaWYgIV9lbCE9PTYgIGlmIGRlZmluZWQgUHJvamVjdF9zdCAgICAgICAgICAgKGlmICIlUHJvamVjdF9zdCUiPT0iT2ZmIiAgICAgICAgICAgKHNl dCBQcm9qZWN0X3N0PU9OKSAgICAgICAgICAgZWxzZSAoc2V0IFByb2plY3Rfc3Q9T2ZmKSkNCmlmICFfZWwhPT01ICBpZiBkZWZpbmVkIFBvd2VyUG9pbnRf c3QgICAgICAgIChpZiAiJVBvd2VyUG9pbnRfc3QlIj09Ik9mZiIgICAgICAgIChzZXQgUG93ZXJQb2ludF9zdD1PTikgICAgICAgIGVsc2UgKHNldCBQb3dl clBvaW50X3N0PU9mZikpDQppZiAhX2VsIT09NCAgaWYgZGVmaW5lZCBPdXRsb29rX3N0ICAgICAgICAgICAoaWYgIiVPdXRsb29rX3N0JSI9PSJPZmYiICAg ICAgICAgICAoc2V0IE91dGxvb2tfc3Q9T04pICAgICAgICAgICBlbHNlIChzZXQgT3V0bG9va19zdD1PZmYpKQ0KaWYgIV9lbCE9PTMgIGlmIGRlZmluZWQg T25lTm90ZV9zdCAgICAgICAgICAgKGlmICIlT25lTm90ZV9zdCUiPT0iT2ZmIiAgICAgICAgICAgKHNldCBPbmVOb3RlX3N0PU9OKSAgICAgICAgICAgZWxz ZSAoc2V0IE9uZU5vdGVfc3Q9T2ZmKSkNCmlmICFfZWwhPT0yICBpZiBkZWZpbmVkIEV4Y2VsX3N0ICAgICAgICAgICAgIChpZiAiJUV4Y2VsX3N0JSI9PSJP ZmYiICAgICAgICAgICAgIChzZXQgRXhjZWxfc3Q9T04pICAgICAgICAgICAgIGVsc2UgKHNldCBFeGNlbF9zdD1PZmYpKQ0KaWYgIV9lbCE9PTEgIGlmIGRl ZmluZWQgQWNjZXNzX3N0ICAgICAgICAgICAgKGlmICIlQWNjZXNzX3N0JSI9PSJPZmYiICAgICAgICAgICAgKHNldCBBY2Nlc3Nfc3Q9T04pICAgICAgICAg ICAgZWxzZSAoc2V0IEFjY2Vzc19zdD1PZmYpKQ0KZ290byA6b2VfZXhjbHVkZWFwcHMNCg0KOmV4Y2x1ZGVsaXN0DQoNCnNldCBleGNsdWRlbGlzdD0NCmZv ciAlJSMgaW4gKA0KYWNjZXNzDQpleGNlbA0Kb25lbm90ZQ0Kb3V0bG9vaw0KcG93ZXJwb2ludA0KcHJvamVjdA0KcHVibGlzaGVyDQp2aXNpbw0Kd29yZA0K bHluYw0Kb3V0bG9va2ZvcndpbmRvd3MNCm9uZWRyaXZlDQp0ZWFtcw0KKSBkbyAoDQppZiAvaSAiISUlI19zdCEiPT0iT2ZmIiBpZiBkZWZpbmVkIGV4Y2x1 ZGVsaXN0IChzZXQgZXhjbHVkZWxpc3Q9IWV4Y2x1ZGVsaXN0ISwlJSMpIGVsc2UgKHNldCBleGNsdWRlbGlzdD0sJSUjKQ0KKQ0KZXhpdCAvYg0KDQo6Oj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIEZpbmFsIGNvbW1hbmQgdG8gY2hhbmdlL2FkZCBlZGl0aW9uDQoN CjpvZV9lZGl0aW9uY2hhbmdlZmluYWwNCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCBtb2RlIDEwNSwgMzINCg0KOjogIENoZWNrIGZvciBQcm9q ZWN0IGFuZCBWaXNpbyB3aXRoIHVuc3VwcG9ydGVkIGxhbmd1YWdlDQoNCnNldCBwcm9qdmlzPQ0Kc2V0IGxhbmdtYXRjaGVkPQ0KZWNobzogJVByb2plY3Rf c3QlICVWaXNpb19zdCUgfCBmaW5kIC9pICJPTiIgJW51bCUgJiYgc2V0IHByb2p2aXM9MQ0KZWNobzogJXRhcmdldGVkaXRpb24lIHwgZmluZHN0ciAvaSAi UHJvamVjdCBWaXNpbyIgJW51bCUgJiYgc2V0IHByb2p2aXM9MQ0KDQppZiBkZWZpbmVkIHByb2p2aXMgKA0KZm9yICUlIyBpbiAoDQphci1zYQ0KY3MtY3oN CmRhLWRrDQpkZS1kZQ0KZWwtZ3INCmVuLXVzDQplcy1lcw0KZmktZmkNCmZyLWZyDQpoZS1pbA0KaHUtaHUNCml0LWl0DQpqYS1qcA0Ka28ta3INCm5iLW5v DQpubC1ubA0KcGwtcGwNCnB0LWJyDQpwdC1wdA0Kcm8tcm8NCnJ1LXJ1DQpzay1zaw0Kc2wtc2kNCnN2LXNlDQp0ci10cg0KdWstdWENCnpoLWNuDQp6aC10 dw0KKSBkbyAoDQppZiAvaSAiJV9sYW5nJSI9PSIlJSMiIHNldCBsYW5nbWF0Y2hlZD0xDQopDQppZiBub3QgZGVmaW5lZCBsYW5nbWF0Y2hlZCAoDQolZWxp bmUlDQplY2hvICVfbGFuZyUgbGFuZ3VhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHJvamVjdC9WaXNpbyBhcHBzLg0KY2FsbCA6ZGtfY29sb3IgJUJsdWUl ICJJbnN0YWxsIE9mZmljZSBpbiB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlIGZvciBQcm9qZWN0L1Zpc2lvIGZyb20gdGhlIGJlbG93IFVSTC4iDQpzZXQgZml4 ZXM9JWZpeGVzJSAlbWFzJWdlbnVpbmUtaW5zdGFsbGF0aW9uLW1lZGlhDQpjYWxsIDpka19jb2xvciAlX1llbGxvdyUgIiVtYXMlZ2VudWluZS1pbnN0YWxs YXRpb24tbWVkaWEiDQpnb3RvIDpvZV9nb2JhY2sNCikNCikNCg0KOjogIFRoYW5rcyB0byBAYWJib2RpMTQwNiBmb3IgZmlyc3QgZGlzY292ZXJpbmcgT2Zm aWNlQ2xpY2tUb1J1bi5leGUgdXNlcw0KOjogIFRoYW5rcyB0byBAbWF5IGZvciB0aGUgc3VnZ2VzdGlvbiB0byB1c2UgaXQgdG8gY2hhbmdlIGVkaXRpb24g d2l0aCBDRE4gYXMgYSBzb3VyY2UNCjo6ICBPZmZpY2VDbGlja1RvUnVuLmV4ZSB3aXRoIHByb2R1Y3RzdG9hZGQgbWV0aG9kIGlzIHVzZWQgaGVyZSB0byBh ZGQgZWRpdGlvbnMNCjo6ICBJdCB1c2VzIGRlbHRhIHVwZGF0ZXMsIG1lYW5pbmcgdGhhdCBzaW5jZSBpdCdzIHVzaW5nIHNhbWUgaW5zdGFsbGVkIGJ1aWxk LCBpdCB3aWxsIGNvbnN1bWUgdmVyeSBsZXNzIEludGVybmV0DQoNCmNhbGwgOm9lX2dldGxhbmdzDQoNCnNldCAiYzJyY29tbWFuZD0iJV9jMnJFeGUlIiBw bGF0Zm9ybT0lX29BcmNoJSBjdWx0dXJlPSVfbGFuZyUgcHJvZHVjdHN0b2FkZD0ldGFyZ2V0ZWRpdGlvbiUuMTZfJV9hbGxMYW5ncyUgY2RuYmFzZXVybC4x Nj1odHRwOi8vb2ZmaWNlY2RuLm1pY3Jvc29mdC5jb20vcHIvJV91cGRjaCUgYmFzZXVybC4xNj1odHRwOi8vb2ZmaWNlY2RuLm1pY3Jvc29mdC5jb20vcHIv JV91cGRjaCUgdmVyc2lvbi4xNj0lX3ZlcnNpb24lIG1lZGlhdHlwZS4xNj1DRE4gc291cmNldHlwZS4xNj1DRE4gZGVsaXZlcnltZWNoYW5pc209JV91cGRj aCUgJXRhcmdldGVkaXRpb24lLmV4Y2x1ZGVkYXBwcy4xNj1ncm9vdmUlZXhjbHVkZWxpc3QlIGZsdC51c2V0ZWFtc2FkZG9uPWRpc2FibGVkIGZsdC51c2Vi aW5nYWRkb25vbmluc3RhbGw9ZGlzYWJsZWQgZmx0LnVzZWJpbmdhZGRvbm9udXBkYXRlPWRpc2FibGVkIg0KDQppZiAlY2hhbmdlJT09MSAoDQpzZXQgImMy cmNvbW1hbmQ9IWMycmNvbW1hbmQhIHByb2R1Y3RzdG9yZW1vdmU9QWxsUHJvZHVjdHMiDQopDQoNCmVjaG86DQplY2hvIFJ1bm5pbmcgdGhlIGJlbG93IGNv bW1hbmQsIHBsZWFzZSB3YWl0Li4uDQplY2hvOg0KZWNobyAlYzJyY29tbWFuZCUNCiVjMnJjb21tYW5kJQ0Kc2V0IGVycm9yY29kZT0lZXJyb3JsZXZlbCUN CnRpbWVvdXQgL3QgMTAgJW51bCUNCg0KZWNobzoNCnNldCBzdWdnZXN0Y2hhbm5lbD0NCg0KaWYgJWVycm9yY29kZSUgRVFVIDAgKA0KaWYgJWNoYW5nZSU9 PTEgKA0KZWNobyAldGFyZ2V0ZWRpdGlvbiUgfCBmaW5kIC9pICIyMDE5Vm9sdW1lIiAlbnVsJSAmJiAoDQppZiBub3QgZGVmaW5lZCBsdHNjMTkgc2V0IHN1 Z2dlc3RjaGFubmVsPVByb2R1Y3Rpb246OkxUU0MNCmlmIC9pIG5vdCAlX0F1ZGllbmNlRGF0YSU9PVByb2R1Y3Rpb246OkxUU0Mgc2V0IHN1Z2dlc3RjaGFu bmVsPVByb2R1Y3Rpb246OkxUU0MNCmlmIC9pIG5vdCAlX3VwZGNoJT09RjJFNzI0QzEtNzQ4Ri00QjQ3LThGQjgtOEUwRDIxMEU5MjA4IHNldCBzdWdnZXN0 Y2hhbm5lbD1Qcm9kdWN0aW9uOjpMVFNDDQopDQoNCmVjaG8gJXRhcmdldGVkaXRpb24lIHwgZmluZCAvaSAiMjAyMVZvbHVtZSIgJW51bCUgJiYgKA0KaWYg bm90IGRlZmluZWQgbHRzYzIxIHNldCBzdWdnZXN0Y2hhbm5lbD1Qcm9kdWN0aW9uOjpMVFNDMjAyMQ0KaWYgL2kgbm90ICVfQXVkaWVuY2VEYXRhJT09UHJv ZHVjdGlvbjo6TFRTQzIwMjEgc2V0IHN1Z2dlc3RjaGFubmVsPVByb2R1Y3Rpb246OkxUU0MyMDIxDQppZiAvaSBub3QgJV91cGRjaCU9PTUwMzA4NDFELUM5 MTktNDU5NC04RDJELTg0QUU0Rjk2RTU4RSBzZXQgc3VnZ2VzdGNoYW5uZWw9UHJvZHVjdGlvbjo6TFRTQzIwMjENCikNCg0KZWNobyAldGFyZ2V0ZWRpdGlv biUgfCBmaW5kIC9pICIyMDI0Vm9sdW1lIiAlbnVsJSAmJiAoDQppZiBub3QgZGVmaW5lZCBsdHNjMjQgc2V0IHN1Z2dlc3RjaGFubmVsPVByb2R1Y3Rpb246 OkxUU0MyMDI0DQppZiAvaSBub3QgJV9BdWRpZW5jZURhdGElPT1Qcm9kdWN0aW9uOjpMVFNDMjAyNCBzZXQgc3VnZ2VzdGNoYW5uZWw9UHJvZHVjdGlvbjo6 TFRTQzIwMjQNCmlmIC9pIG5vdCAlX3VwZGNoJT09Nzk4M0JBQzAtRTUzMS00MENGLUJFMDAtRkQyNEZFNjY2MTlDIHNldCBzdWdnZXN0Y2hhbm5lbD1Qcm9k dWN0aW9uOjpMVFNDMjAyNA0KKQ0KDQplY2hvICV0YXJnZXRlZGl0aW9uJSB8IGZpbmRzdHIgL1IgIjIwLipWb2x1bWUiICVudWwlIHx8ICgNCmlmIGRlZmlu ZWQgbHRzY2ZvdW5kIHNldCBzdWdnZXN0Y2hhbm5lbD1Qcm9kdWN0aW9uOjpDQw0KZWNobyAlX0F1ZGllbmNlRGF0YSUgfCBmaW5kIC9pICJMVFNDIiAlbnVs JSAmJiBzZXQgc3VnZ2VzdGNoYW5uZWw9UHJvZHVjdGlvbjo6Q0MNCikNCg0KaWYgZGVmaW5lZCBzdWdnZXN0Y2hhbm5lbCAoDQpjYWxsIDpka19jb2xvciAl R3JheSUgIk1pc21hdGNoIGZvdW5kIGluIHVwZGF0ZSBjaGFubmVsIGFuZCBpbnN0YWxsZWQgcHJvZHVjdC4iDQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkl0 IGlzIHJlY29tbWVuZGVkIHRvIGNoYW5nZSB0aGUgdXBkYXRlIGNoYW5uZWwgdG8gWyFzdWdnZXN0Y2hhbm5lbCFdIGZyb20gdGhlIHByZXZpb3VzIG1lbnUu Ig0KKQ0KZWNobzoNCikNCmNhbGwgOmRrX2NvbG9yICVHcmF5JSAiVG8gYWN0aXZhdGUgT2ZmaWNlLCBydW4gdGhlIGFjdGl2YXRpb24gb3B0aW9uIGZyb20g dGhlIG1haW4gbWVudS4iDQopIGVsc2UgKA0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNo ZWNrIHRoaXMgd2VicGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQopDQoNCmNhbGwgOm9lX3RlbXBjbGVhbnVwDQpn b3RvIDpvZV9nb2JhY2sNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBFZGl0IE9mZmljZSBlZGl0 aW9uDQoNCjpvZV9lZGl0ZWRpdGlvbg0KDQpjbHMNCnRpdGxlICBBZGQvUmVtb3ZlIEFwcHMgJW1hc3ZlciUNCg0KY2FsbCA6b2VfY2hraW50ZXJuZXQNCmlm IG5vdCBkZWZpbmVkIF9pbnQgKA0KZ290byA6b2VfZ29iYWNrDQopDQoNCnNldCBjaGFuZ2U9MA0Kc2V0IGVkaXRlZGl0aW9uPTENCmNhbGwgOmNoX2dldGlu Zm8NCmNscw0KDQppZiBub3QgZGVmaW5lZCB0ZXJtaW5hbCAoDQptb2RlIDk4LCAzNQ0KKQ0KDQpzZXQgaW5wdD0NCnNldCBjb3VudGVyPTANCnNldCB2ZXJp ZmllZD0wDQpzZXQgdGFyZ2V0ZWRpdGlvbj0NCg0KJWxpbmUlDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJZb3UgY2FuIGVkaXQgW2FkZC9yZW1v dmUgYXBwc10gb25lIG9mIHRoZSBmb2xsb3dpbmcgT2ZmaWNlIGVkaXRpb25zLiINCiVsaW5lJQ0KZWNobzoNCg0KZm9yICUlQSBpbiAoJV9vSWRzJSkgZG8g KA0Kc2V0IC9hIGNvdW50ZXIrPTENCmVjaG8gWyFjb3VudGVyIV0gJSVBDQpzZXQgdGFyZ2V0ZWRpdGlvbiFjb3VudGVyIT0lJUENCikNCg0KJWxpbmUlDQpl Y2hvOg0KZWNobyBbMF0gIEdvIEJhY2sNCmVjaG86DQpjYWxsIDpka19jb2xvciAlX0dyZWVuJSAiRW50ZXIgYW4gb3B0aW9uIG51bWJlciB1c2luZyB5b3Vy IGtleWJvYXJkIGFuZCBwcmVzcyBFbnRlciB0byBjb25maXJtOiINCnNldCAvcCBpbnB0PQ0KaWYgIiVpbnB0JSI9PSIiIGdvdG8gOm9lX2VkaXRlZGl0aW9u DQppZiAiJWlucHQlIj09IjAiIGdvdG8gOm9lbWVudQ0KZm9yIC9sICUlaSBpbiAoMSwxLCVjb3VudGVyJSkgZG8gKGlmICIlaW5wdCUiPT0iJSVpIiBzZXQg dmVyaWZpZWQ9MSkNCnNldCB0YXJnZXRlZGl0aW9uPSF0YXJnZXRlZGl0aW9uJWlucHQlIQ0KaWYgJXZlcmlmaWVkJT09MCBnb3RvIDpvZV9lZGl0ZWRpdGlv bg0KDQo6Oj09PT09PT09PT09PT09PQ0KDQpjbHMNCmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsIG1vZGUgOTgsIDMyDQoNCmVjaG8gJXRhcmdldGVkaXRpb24l IHwgZmluZHN0ciAvaSAiQWNjZXNzIEV4Y2VsIE9uZU5vdGUgT3V0bG9vayBQb3dlclBvaW50IFByb2plY3QgUHVibGlzaGVyIFNreXBlIFZpc2lvIFdvcmQi ICVudWwlICYmIChzZXQgbGlzdD1TaW5nbGVBcHBzKSB8fCAoc2V0IGxpc3Q9U3VpdGVzKQ0KZ290byA6b2VfZXhjbHVkZWFwcHNwcmUNCg0KOjo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBSZW1vdmUgT2ZmaWNlIGVkaXRpb25zDQoNCjpvZV9yZW1vdmVlZGl0aW9u DQoNCnRpdGxlICBSZW1vdmUgT2ZmaWNlIGVkaXRpb25zICVtYXN2ZXIlDQoNCmNhbGwgOmNoX2dldGluZm8NCg0KY2xzDQppZiBub3QgZGVmaW5lZCB0ZXJt aW5hbCAoDQptb2RlIDk4LCAzNQ0KKQ0KDQpzZXQgY291bnRlcj0wDQpmb3IgJSVBIGluICglX29JZHMlKSBkbyAoc2V0IC9hIGNvdW50ZXIrPTEpDQoNCmlm ICFjb3VudGVyISBMRVEgMSAoDQplY2hvOg0KZWNobyBPbmx5ICIlX29JZHMlIiBwcm9kdWN0IGlzIGluc3RhbGxlZC4NCmVjaG8gVGhpcyBvcHRpb24gaXMg YXZhaWxhYmxlIG9ubHkgd2hlbiBtdWx0aXBsZSBwcm9kdWN0cyBhcmUgaW5zdGFsbGVkLg0KZ290byA6b2VfZ29iYWNrDQopDQoNCjo6PT09PT09PT09PT09 PT09DQoNCnNldCBpbnB0PQ0Kc2V0IGNvdW50ZXI9MA0Kc2V0IHZlcmlmaWVkPTANCnNldCB0YXJnZXRlZGl0aW9uPQ0KDQolbGluZSUNCmVjaG86DQpjYWxs IDpka19jb2xvciAlR3JheSUgIllvdSBjYW4gdW5pbnN0YWxsIG9uZSBvZiB0aGUgZm9sbG93aW5nIE9mZmljZSBlZGl0aW9ucy4iDQolbGluZSUNCmVjaG86 DQoNCmZvciAlJUEgaW4gKCVfb0lkcyUpIGRvICgNCnNldCAvYSBjb3VudGVyKz0xDQplY2hvIFshY291bnRlciFdICUlQQ0Kc2V0IHRhcmdldGVkaXRpb24h Y291bnRlciE9JSVBDQopDQoNCiVsaW5lJQ0KZWNobzoNCmVjaG8gWzBdICBHbyBCYWNrDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJV9HcmVlbiUgIkVudGVy IGFuIG9wdGlvbiBudW1iZXIgdXNpbmcgeW91ciBrZXlib2FyZCBhbmQgcHJlc3MgRW50ZXIgdG8gY29uZmlybToiDQpzZXQgL3AgaW5wdD0NCmlmICIlaW5w dCUiPT0iIiBnb3RvIDpvZV9yZW1vdmVlZGl0aW9uDQppZiAiJWlucHQlIj09IjAiIGdvdG8gOm9lbWVudQ0KZm9yIC9sICUlaSBpbiAoMSwxLCVjb3VudGVy JSkgZG8gKGlmICIlaW5wdCUiPT0iJSVpIiBzZXQgdmVyaWZpZWQ9MSkNCnNldCB0YXJnZXRlZGl0aW9uPSF0YXJnZXRlZGl0aW9uJWlucHQlIQ0KaWYgJXZl cmlmaWVkJT09MCBnb3RvIDpvZV9yZW1vdmVlZGl0aW9uDQoNCjo6PT09PT09PT09PT09PT09DQoNCmNscw0KaWYgbm90IGRlZmluZWQgdGVybWluYWwgbW9k ZSAxMDUsIDMyDQoNCmNhbGwgOm9lX2dldGxhbmdzICV0YXJnZXRlZGl0aW9uJQ0Kc2V0ICJjMnJjb21tYW5kPSIlX2MyckV4ZSUiIHBsYXRmb3JtPSVfb0Fy Y2glIHByb2R1Y3RzdG9yZW1vdmU9JXRhcmdldGVkaXRpb24lLjE2XyVfYWxsTGFuZ3MlIg0KDQplY2hvOg0KZWNobyBSdW5uaW5nIHRoZSBiZWxvdyBjb21t YW5kLCBwbGVhc2Ugd2FpdC4uLg0KZWNobzoNCmVjaG8gJWMycmNvbW1hbmQlDQolYzJyY29tbWFuZCUNCg0KaWYgJWVycm9ybGV2ZWwlIE5FUSAwICgNCmVj aG86DQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2FsbCA6ZGtfY29sb3IyICVCbHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBo ZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCikNCg0KZ290byA6b2VfZ29iYWNrDQoNCjo6PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQ0KDQo6OiAgQ2hhbmdlIE9mZmljZSB1cGRhdGUgY2hhbm5lbA0KDQo6b2VfY2hhbmdldXBkY2hubA0KDQp0aXRsZSAg Q2hhbmdlIE9mZmljZSB1cGRhdGUgY2hhbm5lbCAlbWFzdmVyJQ0KY2FsbCA6Y2hfZ2V0aW5mbw0KDQpjbHMNCmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsICgN Cm1vZGUgOTgsIDMzDQopDQoNCmNhbGwgOm9lX2Noa2ludGVybmV0DQppZiBub3QgZGVmaW5lZCBfaW50ICgNCmdvdG8gOm9lX2dvYmFjaw0KKQ0KDQppZiAl d2luYnVpbGQlIExTUyAxMDI0MCAoDQplY2hvICVfb0lkcyUgfCBmaW5kc3RyICIyMDE5IDIwMjEgMjAyNCIgJW51bCUgJiYgKA0KJWVsaW5lJQ0KZWNobyBJ bnN0YWxsZWQgT2ZmaWNlIGVkaXRpb25zOiAlX29JZHMlDQplY2hvIFVuc3VwcG9ydGVkIE9mZmljZSBlZGl0aW9uIGlzIGluc3RhbGxlZCBvbiB5b3VyIFdp bmRvd3MgYnVpbGQgdmVyc2lvbiAld2luYnVpbGQlLg0KZ290byA6b2VfZ29iYWNrDQopDQppZiBkZWZpbmVkIGx0c2Nmb3VuZCAoDQolZWxpbmUlDQplY2hv IEluc3RhbGxlZCBPZmZpY2UgdXBkYXRlIGNoYW5uZWw6ICVsdHNjMTklJWx0c2MyMSUlbHRzYzI0JQ0KZWNobyBVbnN1cHBvcnRlZCBPZmZpY2UgdXBkYXRl IGNoYW5uZWwgaXMgaW5zdGFsbGVkIG9uIHlvdXIgV2luZG93cyBidWlsZCB2ZXJzaW9uICV3aW5idWlsZCUuDQpnb3RvIDpvZV9nb2JhY2sNCikNCikNCg0K Ojo9PT09PT09PT09PT09PT0NCg0Kc2V0IGlucHQ9DQpzZXQgY291bnRlcj0wDQpzZXQgdmVyaWZpZWQ9MA0Kc2V0IHRhcmdldEZGTj0NCnNldCBieXBhc3NG Rk49DQpzZXQgdGFyZ2V0Y2hhbm5lbD0NCg0KJWxpbmUlDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJUdyYXklICJJbnN0YWxsZWQgdXBkYXRlIGNoYW5uZWw6 ICVfQXVkaWVuY2VEYXRhJSwgJV92ZXJzaW9uJSwgQ2xpZW50OiAlX2NsdmVyc2lvbiUiDQpjYWxsIDpka19jb2xvciAlR3JheSUgIkluc3RhbGxlZCBPZmZp Y2UgZWRpdGlvbnM6ICVfb0lkcyUiDQolbGluZSUNCmVjaG86DQoNCmZvciAlJSMgaW4gKA0KIjU0NDBmZDFmLTdlY2ItNDIyMS04MTEwLTE0NWVmYWE2Mzcy Zl9CZXRhICAgIC8gSW5zaWRlciBGYXN0ICAgIC0gICBJbnNpZGVyczo6RGV2TWFpbiAgLSINCiI2NDI1NmFmZS1mNWQ5LTRmODYtODkzNi04ODQwYTZhNGY1 YmVfQ3VycmVudCAvIE1vbnRobHkgUHJldmlldyAtICAgSW5zaWRlcnM6OkNDICAgICAgIC0iDQoiNDkyMzUwZjYtM2EwMS00Zjk3LWI5YzAtYzdjNmRkZjY3 ZDYwX0N1cnJlbnQgLyBNb250aGx5ICAgICAgICAgLSBQcm9kdWN0aW9uOjpDQyAgICAgICAtIg0KIjU1MzM2YjgyLWExOGQtNGRkNi1iNWY2LTllNTA5NWMz MTRhNl9Nb250aGx5IEVudGVycHJpc2UgICAgICAgIC0gUHJvZHVjdGlvbjo6TUVDICAgICAgLSINCiI3ZmZiYzZiZi1iYzMyLTRmOTItODk4Mi1mOWRkMTdm ZDMxMTRfU2VtaSBBbm51YWwgRW50ZXJwcmlzZSAgICAtIFByb2R1Y3Rpb246OkRDICAgICAgIC0iDQoiZWE0YTQwOTAtZGUyNi00OWQ3LTkzYzEtOTFiZmY5 ZTUzZmMzX0Rldk1haW4gQ2hhbm5lbCAgICAgICAgICAgLSAgICBEb2dmb29kOjpEZXZNYWluICAtIg0KImI2MTI4NWRkLWQ5ZjctNDFmMi05NzU3LThmNjFj YmE0ZTljOF9NaWNyb3NvZnQgRWxpdGUgICAgICAgICAgIC0gIE1pY3Jvc29mdDo6RGV2TWFpbiAgLSINCiJmMmU3MjRjMS03NDhmLTRiNDctOGZiOC04ZTBk MjEwZTkyMDhfUGVycGV0dWFsMjAxOSBWTCAgICAgICAgICAtIFByb2R1Y3Rpb246OkxUU0MgICAgIC0iDQoiMWQyZDJlYTYtMTY4MC00YzU2LWFjNTgtYTQ0 MWM4YzI0ZmY5X01pY3Jvc29mdDIwMTkgVkwgICAgICAgICAgLSAgTWljcm9zb2Z0OjpMVFNDICAgICAtIg0KIjUwMzA4NDFkLWM5MTktNDU5NC04ZDJkLTg0 YWU0Zjk2ZTU4ZV9QZXJwZXR1YWwyMDIxIFZMICAgICAgICAgIC0gUHJvZHVjdGlvbjo6TFRTQzIwMjEgLSINCiI4Njc1MjI4Mi01ODQxLTQxMjAtYWM4MC1k YjAzYWU2YjVmZGJfTWljcm9zb2Z0MjAyMSBWTCAgICAgICAgICAtICBNaWNyb3NvZnQ6OkxUU0MyMDIxIC0iDQoiNzk4M2JhYzAtZTUzMS00MGNmLWJlMDAt ZmQyNGZlNjY2MTljX1BlcnBldHVhbDIwMjQgVkwgICAgICAgICAgLSBQcm9kdWN0aW9uOjpMVFNDMjAyNCAtIg0KImMwMmQ4ZmU2LTUyNDItNGRhOC05NzJm LTgyZWU1NWUwMDY3MV9NaWNyb3NvZnQyMDI0IFZMICAgICAgICAgIC0gIE1pY3Jvc29mdDo6TFRTQzIwMjQgLSINCikgZG8gKA0KZm9yIC9mICJ0b2tlbnM9 MS0yIGRlbGltcz1fIiAlJUEgaW4gKCIlJX4jIikgZG8gKA0Kc2V0IGJ5cGFzcz0NCnNldCBzdXBwb3J0ZWQ9DQppZiAld2luYnVpbGQlIExTUyAxMDI0MCAo ZWNobyAlJUIgfCBmaW5kc3RyIC9pICJMVFNDIERldk1haW4iICVudWwlIHx8IHNldCBzdXBwb3J0ZWQ9MSkgZWxzZSAoc2V0IHN1cHBvcnRlZD0xKQ0KaWYg JXdpbmJ1aWxkJSBHRVEgMTAyNDAgKA0KaWYgZGVmaW5lZCBsdHNjMTkgZWNobyAlJUIgfCBmaW5kIC9pICIyMDE5IFZMIiAlbnVsJSB8fCBzZXQgYnlwYXNz PTENCmlmIGRlZmluZWQgbHRzYzIxIGVjaG8gJSVCIHwgZmluZCAvaSAiMjAyMSBWTCIgJW51bCUgfHwgc2V0IGJ5cGFzcz0xDQppZiBkZWZpbmVkIGx0c2My NCBlY2hvICUlQiB8IGZpbmQgL2kgIjIwMjQgVkwiICVudWwlIHx8IHNldCBieXBhc3M9MQ0KaWYgbm90IGRlZmluZWQgbHRzY2ZvdW5kIGVjaG8gJSVCIHwg ZmluZCAvaSAiTFRTQyIgJW51bCUgJiYgc2V0IGJ5cGFzcz0xDQopDQppZiBkZWZpbmVkIHN1cHBvcnRlZCAoDQpzZXQgL2EgY291bnRlcis9MQ0KaWYgIWNv dW50ZXIhIExTUyAxMCAoDQppZiBkZWZpbmVkIGJ5cGFzcyAoZWNobyBbIWNvdW50ZXIhXSAgJSVCICBVbm9mZmljaWFsIGNoYW5nZSBtZXRob2Qgd2lsbCBi ZSB1c2VkKSBlbHNlIChlY2hvIFshY291bnRlciFdICAlJUIpDQopIGVsc2UgKA0KaWYgZGVmaW5lZCBieXBhc3MgKGVjaG8gWyFjb3VudGVyIV0gJSVCICBV bm9mZmljaWFsIGNoYW5nZSBtZXRob2Qgd2lsbCBiZSB1c2VkKSBlbHNlIChlY2hvIFshY291bnRlciFdICUlQikNCikNCnNldCB0YXJnZXRGRk4hY291bnRl ciE9JSVBDQpzZXQgdGFyZ2V0Y2hhbm5lbCFjb3VudGVyIT0lJUINCmlmIGRlZmluZWQgYnlwYXNzIHNldCBieXBhc3NGRk49IWJ5cGFzc0ZGTiElJUENCikN CikNCikNCg0KJWxpbmUlDQplY2hvOg0KZWNobyBbUl0gIExlYXJuIGFib3V0IHVwZGF0ZSBjaGFubmVscw0KZWNobyBbMF0gIEdvIGJhY2sNCmVjaG86DQpj YWxsIDpka19jb2xvciAlX0dyZWVuJSAiRW50ZXIgYW4gb3B0aW9uIG51bWJlciB1c2luZyB5b3VyIGtleWJvYXJkIGFuZCBwcmVzcyBFbnRlciB0byBjb25m aXJtOiINCnNldCAvcCBpbnB0PQ0KaWYgIiVpbnB0JSI9PSIiIGdvdG8gOm9lX2NoYW5nZXVwZGNobmwNCmlmICIlaW5wdCUiPT0iMCIgZ290byA6b2VtZW51 DQppZiAvaSAiJWlucHQlIj09IlIiIHN0YXJ0IGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtMzY1LWFwcHMvdXBkYXRlcy9v dmVydmlldy11cGRhdGUtY2hhbm5lbHMgJiBnb3RvIDpvZV9jaGFuZ2V1cGRjaG5sDQpmb3IgL2wgJSVpIGluICgxLDEsJWNvdW50ZXIlKSBkbyAoaWYgIiVp bnB0JSI9PSIlJWkiIHNldCB2ZXJpZmllZD0xKQ0Kc2V0IHRhcmdldEZGTj0hdGFyZ2V0RkZOJWlucHQlIQ0Kc2V0IHRhcmdldGNoYW5uZWw9IXRhcmdldGNo YW5uZWwlaW5wdCUhDQppZiAldmVyaWZpZWQlPT0wIGdvdG8gOm9lX2NoYW5nZXVwZGNobmwNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PQ0KDQpjbHMN CmlmIG5vdCBkZWZpbmVkIHRlcm1pbmFsIG1vZGUgMTA1LCAzMg0KDQo6OiAgR2V0IGJ1aWxkIG51bWJlciBmb3IgdGhlIHRhcmdldCBGRk4sIHVzaW5nIGJ1 aWxkIG51bWJlciB3aXRoIE9mZmljZUMyUkNsaWVudC5leGUgY29tbWFuZCB0byB0cmlnZ2VyIHVwZGF0ZXMgcHJvdmlkZXMgYWNjdXJhdGUgcmVzdWx0cw0K DQpzZXQgYnVpbGQ9DQpmb3IgL2YgImRlbGltcz0iICUlYSBpbiAoJyVwc2MlICIkZj1bSU8uRmlsZV06OlJlYWRBbGxUZXh0KCchX2JhdHAhJykgLXNwbGl0 ICc6Z2V0YnVpbGRcOi4qJzsuIChbc2NyaXB0YmxvY2tdOjpDcmVhdGUoJGZbMV0pKSIgJW51bDYlJykgZG8gKHNldCBidWlsZD0lJWEpDQplY2hvICIlYnVp bGQlIiB8IGZpbmQgL2kgIjE2LiIgJW51bCUgfHwgc2V0IGJ1aWxkPQ0KDQplY2hvOg0KZm9yIC9mICJ0b2tlbnM9MSBkZWxpbXM9LSIgJSVBIGluICgiJXRh cmdldGNoYW5uZWwlIikgZG8gKGVjaG8gVGFyZ2V0IHVwZGF0ZSBjaGFubmVsOiAlJUEpDQplY2hvIFRhcmdldCBidWlsZCBudW1iZXI6ICVidWlsZCUNCmVj aG86ICVieXBhc3NGRk4lIHwgZmluZCAvaSAiJXRhcmdldEZGTiUiICVudWwlICYmIGdvdG8gOm9lX2NoYW5nZXVub2ZmDQoNCmNhbGwgOm9lX2NsZWFudXBy ZWcNCg0KaWYgbm90IGRlZmluZWQgYnVpbGQgKA0KaWYgJXdpbmJ1aWxkJSBHRVEgOTIwMCBjYWxsIDpka19jb2xvciAlR3JheSUgIkZhaWxlZCB0byBkZXRl Y3QgYnVpbGQgbnVtYmVyIGZvciB0aGUgdGFyZ2V0IEZGTi4iDQpzZXQgInVwZGNvbW1hbmQ9IiVfYzJyQ2V4ZSUiIC91cGRhdGUgdXNlciINCikgZWxzZSAo DQpzZXQgInVwZGNvbW1hbmQ9IiVfYzJyQ2V4ZSUiIC91cGRhdGUgdXNlciB1cGRhdGV0b3ZlcnNpb249JWJ1aWxkJSINCikNCmVjaG8gUnVubmluZyB0aGUg YmVsb3cgY29tbWFuZCB0byB0cmlnZ2VyIHVwZGF0ZXMuLi4NCmVjaG86DQplY2hvICV1cGRjb21tYW5kJQ0KJXVwZGNvbW1hbmQlDQplY2hvOg0KZWNobyBD aGVjayB0aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAlbWFzJXRyb3VibGVzaG9vdA0KZ290byA6b2VfZ29iYWNrDQoNCjo6PT09PT09PT09PT09PT09PT09PT09 PT0NCg0KOjogIFVub2ZmaWNpYWwgbWV0aG9kIHRvIGNoYW5nZSBjaGFubmVsDQoNCjpvZV9jaGFuZ2V1bm9mZg0KDQpzZXQgYWJvcnRjaGFuZ2U9DQplY2hv ICV0YXJnZXRjaGFubmVsJSB8IGZpbmQgL2kgIjIwMTkgVkwiICVudWwlICYmIChmb3IgJSVBIGluICglX29JZHMlKSBkbyAoZWNobyAlJUEgfCBmaW5kIC9p ICIyMDE5Vm9sdW1lIiAlbnVsJSB8fCBzZXQgYWJvcnRjaGFuZ2U9MSkpDQplY2hvICV0YXJnZXRjaGFubmVsJSB8IGZpbmQgL2kgIjIwMjEgVkwiICVudWwl ICYmIChmb3IgJSVBIGluICglX29JZHMlKSBkbyAoZWNobyAlJUEgfCBmaW5kIC9pICIyMDIxVm9sdW1lIiAlbnVsJSB8fCBzZXQgYWJvcnRjaGFuZ2U9MSkp DQplY2hvICV0YXJnZXRjaGFubmVsJSB8IGZpbmQgL2kgIjIwMjQgVkwiICVudWwlICYmIChmb3IgJSVBIGluICglX29JZHMlKSBkbyAoZWNobyAlJUEgfCBm aW5kIC9pICIyMDI0Vm9sdW1lIiAlbnVsJSB8fCBzZXQgYWJvcnRjaGFuZ2U9MSkpDQoNCmlmIGRlZmluZWQgYWJvcnRjaGFuZ2UgKA0KJWVsaW5lJQ0KZWNo byBNaXNtYXRjaCBmb3VuZCBpbiBpbnN0YWxsZWQgT2ZmaWNlIHByb2R1Y3RzIGFuZCB0YXJnZXQgdXBkYXRlIGNoYW5uZWwuIEFib3J0aW5nLi4uDQplY2hv IE5vbi1wZXJwZXR1YWwgT2ZmaWNlIHByb2R1Y3RzIGFyZSBub3Qgc3VwcHBvcnRlZCB3aXRoIFBlcnBldHVhbCBWTCB1cGRhdGUgY2hhbm5lbHMuDQpnb3Rv IDpvZV9nb2JhY2sNCikNCg0KaWYgbm90IGRlZmluZWQgYnVpbGQgKA0KJWVsaW5lJQ0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkZhaWxlZCB0byBkZXRlY3Qg YnVpbGQgbnVtYmVyIGZvciB0aGUgdGFyZ2V0IEZGTi4iDQpzZXQgZml4ZXM9JWZpeGVzJSAlbWFzJXRyb3VibGVzaG9vdA0KY2FsbCA6ZGtfY29sb3IyICVC bHVlJSAiQ2hlY2sgdGhpcyB3ZWJwYWdlIGZvciBoZWxwIC0gIiAlX1llbGxvdyUgIiAlbWFzJXRyb3VibGVzaG9vdCINCmdvdG8gOm9lX2dvYmFjaw0KKQ0K DQpzZXQgYnVpbGRjaGs9MA0KZm9yIC9mICJ0b2tlbnM9MyBkZWxpbXM9LiIgJSVhIGluICgiJWJ1aWxkJSIpIGRvIHNldCAiYnVpbGRjaGs9JSVhIg0KDQpj YWxsIDpvZV9nZXRsYW5ncyAlX2ZpcnN0b0lkJQ0KDQplY2hvICV0YXJnZXRjaGFubmVsJSB8IGZpbmQgL2kgIjIwMTkgVkwiICVudWwlICYmICgNCmZvciAl JUEgaW4gKGVuLWdiIGVzLW14IGZyLWNhKSBkbyAoDQplY2hvICVfYWxsTGFuZ3MlIHwgZmluZCAvaSAiJSVBIiAlbnVsJSAmJiAoDQolZWxpbmUlDQplY2hv IFslJUFdIGxhbmd1YWdlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIE9mZmljZSAyMDE5IFBlcnBldHVhbCBWTCB1cGRhdGUgY2hhbm5lbC4gQWJvcnRpbmcu Li4NCmdvdG8gOm9lX2dvYmFjaw0KKQ0KKQ0KKQ0KDQpzZXQgImMycmNvbW1hbmQ9IiVfYzJyRXhlJSIgcGxhdGZvcm09JV9vQXJjaCUgY3VsdHVyZT0lX2xh bmclIHByb2R1Y3RzdG9hZGQ9JV9maXJzdG9JZCUuMTZfJV9hbGxMYW5ncyUgY2RuYmFzZXVybC4xNj1odHRwOi8vb2ZmaWNlY2RuLm1pY3Jvc29mdC5jb20v cHIvJXRhcmdldEZGTiUgYmFzZXVybC4xNj1odHRwOi8vb2ZmaWNlY2RuLm1pY3Jvc29mdC5jb20vcHIvJXRhcmdldEZGTiUgdmVyc2lvbi4xNj0lYnVpbGQl IG1lZGlhdHlwZS4xNj1DRE4gc291cmNldHlwZS4xNj1DRE4gZGVsaXZlcnltZWNoYW5pc209JXRhcmdldEZGTiUgJV9maXJzdG9JZCUuZXhjbHVkZWRhcHBz LjE2PSVfZmlyc3RvSWRFeGNsdWRlbGlzdCUgZmx0LnVzZXRlYW1zYWRkb249ZGlzYWJsZWQgZmx0LnVzZWJpbmdhZGRvbm9uaW5zdGFsbD1kaXNhYmxlZCBm bHQudXNlYmluZ2FkZG9ub251cGRhdGU9ZGlzYWJsZWQiDQpzZXQgImMycmNsaWVudHVwZGF0ZT0hYzJyY29tbWFuZCEgc2NlbmFyaW89Q0xJRU5UVVBEQVRF Ig0KDQppZiAlY2x2ZXJjaGslIExTUyAlYnVpbGRjaGslICgNCmVjaG86DQpjYWxsIDpka19jb2xvciAlQmx1ZSUgIkRvIG5vdCB0ZXJtaW5hdGUgdGhlIG9w ZXJhdGlvbiBiZWZvcmUgaXQgY29tcGxldGVzLi4uIg0KZWNobzoNCmVjaG8gVXBkYXRpbmcgT2ZmaWNlIEMyUiBjbGllbnQgd2l0aCB0aGUgY29tbWFuZCBi ZWxvdywgcGxlYXNlIHdhaXQuLi4NCmVjaG86DQplY2hvICVjMnJjbGllbnR1cGRhdGUlDQolYzJyY2xpZW50dXBkYXRlJQ0KZm9yIC9sICUlaSBpbiAoMSwx LDMwKSBkbyAoaWYgIWNsdmVyY2hrISBMU1MgJWJ1aWxkY2hrJSAoY2FsbCA6Y2hfZ2V0aW5mbyZ0aW1lb3V0IC90IDEwICVudWwlKSkNCikNCg0KaWYgJWNs dmVyY2hrJSBMU1MgJWJ1aWxkY2hrJSAoDQplY2hvOg0KY2FsbCA6ZGtfY29sb3IgJVJlZCUgIkZhaWxlZCB0byB1cGRhdGUgT2ZmaWNlIEMyUiBjbGllbnQu IEFib3J0aW5nLi4uIg0Kc2V0IGZpeGVzPSVmaXhlcyUgJW1hcyV0cm91Ymxlc2hvb3QNCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIkNoZWNrIHRoaXMgd2Vi cGFnZSBmb3IgaGVscCAtICIgJV9ZZWxsb3clICIgJW1hcyV0cm91Ymxlc2hvb3QiDQpnb3RvIDpvZV9nb2JhY2sNCikNCg0KY2FsbCA6b2VfY2xlYW51cHJl Zw0KDQplY2hvIFJ1bm5pbmcgdGhlIGJlbG93IGNvbW1hbmQgdG8gY2hhbmdlIHVwZGF0ZSBjaGFubmVsLCBwbGVhc2Ugd2FpdC4uLg0KZWNobzoNCmVjaG8g JWMycmNvbW1hbmQlDQolYzJyY29tbWFuZCUNCnNldCBlcnJvcmNvZGU9JWVycm9ybGV2ZWwlDQp0aW1lb3V0IC90IDEwICVudWwlDQoNCmVjaG86DQppZiAl ZXJyb3Jjb2RlJSBFUVUgMCAoDQpjYWxsIDpka19jb2xvciAlR3JheSUgIk5vdyBydW4gdGhlIE9mZmljZSBhY3RpdmF0aW9uIG9wdGlvbiBmcm9tIHRoZSBt YWluIG1lbnUuIg0KKSBlbHNlICgNCnNldCBmaXhlcz0lZml4ZXMlICVtYXMldHJvdWJsZXNob290DQpjYWxsIDpka19jb2xvcjIgJUJsdWUlICJDaGVjayB0 aGlzIHdlYnBhZ2UgZm9yIGhlbHAgLSAiICVfWWVsbG93JSAiICVtYXMldHJvdWJsZXNob290Ig0KKQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0NCg0KOm9lX2dvYmFjaw0KDQpjYWxsIDpvZV90ZW1wY2xlYW51cA0KDQplY2hvOg0KaWYgZGVmaW5lZCBmaXhlcyAoDQpj YWxsIDpka19jb2xvciAlV2hpdGUlICJGb2xsb3cgQUxMIHRoZSBBQk9WRSBibHVlIGxpbmVzLiAgICINCmNhbGwgOmRrX2NvbG9yMiAlQmx1ZSUgIlByZXNz IFsxXSB0byBPcGVuIFN1cHBvcnQgV2VicGFnZSAiICVHcmF5JSAiIFByZXNzIFswXSB0byBJZ25vcmUiDQpjaG9pY2UgL0M6MTAgL04NCmlmICFlcnJvcmxl dmVsIT09MiBnb3RvIDpvZW1lbnUNCmlmICFlcnJvcmxldmVsIT09MSAoc3RhcnQgJXNlbGZnaXQlICYgc3RhcnQgJWdpdGh1YiUgJiBmb3IgJSUjIGluICgl Zml4ZXMlKSBkbyAoc3RhcnQgJSUjKSkNCikNCg0KaWYgZGVmaW5lZCB0ZXJtaW5hbCAoDQpjYWxsIDpka19jb2xvciAlX1llbGxvdyUgIlByZXNzIFswXSBr ZXkgdG8gZ28gYmFjay4uLiINCmNob2ljZSAvYyAwIC9uDQopIGVsc2UgKA0KY2FsbCA6ZGtfY29sb3IgJV9ZZWxsb3clICJQcmVzcyBhbnkga2V5IHRvIGdv IGJhY2suLi4iDQpwYXVzZSAlbnVsMSUNCikNCmdvdG8gOm9lbWVudQ0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0KOm9lX2NsZWFudXByZWcNCg0KOjogIENsZWFudXAgT2ZmaWNlIHVwZGF0ZSByZWxhdGVkIHJlZ2lzdHJpZXMsIHRoYW5rcyB0byBAYWJib2RpMTQw Ng0KOjogIGh0dHBzOi8vdGVjaGNvbW11bml0eS5taWNyb3NvZnQuY29tL3Q1L29mZmljZS0zNjUtYmxvZy9ob3ctdG8tbWFuYWdlLW9mZmljZS0zNjUtcHJv cGx1cy1jaGFubmVscy1mb3ItaXQtcHJvcy9iYS1wLzc5NTgxMw0KOjogIGh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtMzY1 LWFwcHMvdXBkYXRlcy9jaGFuZ2UtdXBkYXRlLWNoYW5uZWxzI2NvbnNpZGVyYXRpb25zLXdoZW4tY2hhbmdpbmctY2hhbm5lbHMNCg0KZWNobzoNCmVjaG8g Q2xlYW5pbmcgT2ZmaWNlIHVwZGF0ZSByZWdpc3RyeSBrZXlzLi4uDQplY2hvIEFkZGluZyBuZXcgdXBkYXRlIGNoYW5uZWwgdG8gcmVnaXN0cnkga2V5cy4u Lg0KZWNobzoNCg0KJW51bCUgcmVnIGFkZCAlbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBDRE5CYXNlVXJsIC90IFJFR19TWiAvZCAiaHR0cHM6Ly9v ZmZpY2VjZG4ubWljcm9zb2Z0LmNvbS9wci8ldGFyZ2V0RkZOJSIgL2YNCiVudWwlIHJlZyBhZGQgJW8xNmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgVXBk YXRlQ2hhbm5lbCAvdCBSRUdfU1ogL2QgImh0dHBzOi8vb2ZmaWNlY2RuLm1pY3Jvc29mdC5jb20vcHIvJXRhcmdldEZGTiUiIC9mDQolbnVsJSByZWcgYWRk ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFVwZGF0ZUNoYW5uZWxDaGFuZ2VkIC90IFJFR19TWiAvZCAiVHJ1ZSIgL2YNCiVudWwlIHJlZyBkZWxl dGUgJW8xNmMycl9yZWclXENvbmZpZ3VyYXRpb24gL3YgVW5tYW5hZ2VkVXBkYXRlVVJMIC9mDQolbnVsJSByZWcgZGVsZXRlICVvMTZjMnJfcmVnJVxDb25m aWd1cmF0aW9uIC92IFVwZGF0ZVVybCAvZg0KJW51bCUgcmVnIGRlbGV0ZSAlbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBVcGRhdGVQYXRoIC9mDQol bnVsJSByZWcgZGVsZXRlICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IFVwZGF0ZVRvVmVyc2lvbiAvZg0KJW51bCUgcmVnIGRlbGV0ZSAlbzE2YzJy X3JlZyVcVXBkYXRlcyAvdiBVcGRhdGVUb1ZlcnNpb24gL2YNCiVudWwlIHJlZyBkZWxldGUgSEtMTVxTT0ZUV0FSRVxQb2xpY2llc1xNaWNyb3NvZnRcb2Zm aWNlXDE2LjBcY29tbW9uXG9mZmljZXVwZGF0ZSAvZg0KJW51bCUgcmVnIGRlbGV0ZSBIS0xNXFNPRlRXQVJFXFBvbGljaWVzXE1pY3Jvc29mdFxvZmZpY2Vc MTYuMFxjb21tb25cb2ZmaWNldXBkYXRlIC9mIC9yZWc6MzINCiVudWwlIHJlZyBkZWxldGUgSEtDVVxTT0ZUV0FSRVxQb2xpY2llc1xNaWNyb3NvZnRcb2Zm aWNlXDE2LjBcY29tbW9uXG9mZmljZXVwZGF0ZSAvZg0KJW51bCUgcmVnIGRlbGV0ZSBIS0xNXFNPRlRXQVJFXFBvbGljaWVzXE1pY3Jvc29mdFxjbG91ZFxv ZmZpY2VcMTYuMFxDb21tb25cb2ZmaWNldXBkYXRlIC9mDQolbnVsJSByZWcgZGVsZXRlIEhLTE1cU09GVFdBUkVcUG9saWNpZXNcTWljcm9zb2Z0XGNsb3Vk XG9mZmljZVwxNi4wXENvbW1vblxvZmZpY2V1cGRhdGUgL2YgL3JlZzozMg0KJW51bCUgcmVnIGRlbGV0ZSBIS0NVXFNvZnR3YXJlXFBvbGljaWVzXE1pY3Jv c29mdFxjbG91ZFxvZmZpY2VcMTYuMFxDb21tb25cb2ZmaWNldXBkYXRlIC9mDQoNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQoNCjpvZV90ZW1wY2xlYW51cA0KDQpkZWwgJVN5c3RlbVJvb3QlXFRlbXBcJW9fcmFuZGd1aWQlXFNpbmdsZUFwcHNfVm9s dW1lLnR4dCAlbnVsJQ0KZGVsICVTeXN0ZW1Sb290JVxUZW1wXCVvX3JhbmRndWlkJVxTaW5nbGVBcHBzX1JldGFpbC50eHQgJW51bCUNCmRlbCAlU3lzdGVt Um9vdCVcVGVtcFwlb19yYW5kZ3VpZCVcU3VpdGVzX1ZvbHVtZS50eHQgJW51bCUNCmRlbCAlU3lzdGVtUm9vdCVcVGVtcFwlb19yYW5kZ3VpZCVcU3VpdGVz X1JldGFpbC50eHQgJW51bCUNCmRlbCAlU3lzdGVtUm9vdCVcVGVtcFwlb19yYW5kZ3VpZCVcZ2V0QXBwSWRzLnR4dCAlbnVsJQ0KZXhpdCAvYg0KDQo6Oj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIEZldGNoIHJlcXVpcmVkIGluZm8NCg0KOmNoX2dldGluZm8NCg0K c2V0IF9vUm9vdD0NCnNldCBfb0FyY2g9DQpzZXQgX3VwZGNoPQ0Kc2V0IF9vSWRzPQ0Kc2V0IF9maXJzdG9JZD0NCnNldCBfbGFuZz0NCnNldCBfY2ZvbGRl cj0NCnNldCBfdmVyc2lvbj0NCnNldCBfY2x2ZXJzaW9uPQ0Kc2V0IF9BdWRpZW5jZURhdGE9DQpzZXQgX2FjdGNvbmZpZz0NCnNldCBfYzJyWG1sPQ0Kc2V0 IF9jMnJFeGU9DQpzZXQgX2MyckNleGU9DQpzZXQgX21hc3RlcnhtbD0NCnNldCBsdHNjMTk9DQpzZXQgbHRzYzIxPQ0Kc2V0IGx0c2MyND0NCnNldCBsdHNj Zm91bmQ9DQoNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3JlZyUgL3YgSW5zdGFsbFBhdGgiICVudWw2 JScpIGRvIChzZXQgIl9vUm9vdD0lJWJccm9vdCIpDQpmb3IgL2YgInNraXA9MiB0b2tlbnM9MioiICUlYSBpbiAoJyJyZWcgcXVlcnkgJW8xNmMycl9yZWcl XENvbmZpZ3VyYXRpb24gL3YgUGxhdGZvcm0iICVudWw2JScpIGRvIChzZXQgIl9vQXJjaD0lJWIiKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEg aW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IENsaWVudEZvbGRlciIgJW51bDYlJykgZG8gKHNldCAiX2Nmb2xkZXI9JSVi IikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBBdWRpZW5jZUlk IiAlbnVsNiUnKSBkbyAoc2V0ICJfdXBkY2g9JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3Jl ZyVcQ29uZmlndXJhdGlvbiAvdiBDbGllbnRDdWx0dXJlIiAlbnVsNiUnKSBkbyAoc2V0ICJfbGFuZz0lJWIiKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIq IiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92IENsaWVudFZlcnNpb25Ub1JlcG9ydCIgJW51bDYlJykgZG8gKHNl dCAiX2NsdmVyc2lvbj0lJWIiKQ0KZm9yIC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0 aW9uIC92IFZlcnNpb25Ub1JlcG9ydCIgJW51bDYlJykgZG8gKHNldCAiX3ZlcnNpb249JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGlu ICgnInJlZyBxdWVyeSAlbzE2YzJyX3JlZyVcQ29uZmlndXJhdGlvbiAvdiBBdWRpZW5jZURhdGEiICVudWw2JScpIGRvIChzZXQgIl9BdWRpZW5jZURhdGE9 JSViIikNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3JlZyVcUHJvZHVjdFJlbGVhc2VJRHMgL3YgQWN0 aXZlQ29uZmlndXJhdGlvbiIgJW51bDYlJykgZG8gKHNldCAiX2FjdGNvbmZpZz0lJWIiKQ0KDQplY2hvICIlbzE2YzJyX3JlZyUiIHwgZmluZCAvaSAiV293 NjQzMk5vZGUiICVudWwxJSAmJiAoc2V0IF90b2s9OSkgfHwgKHNldCBfdG9rPTgpDQpmb3IgL2YgInRva2Vucz0lX3RvayUgZGVsaW1zPVwiICUlYSBpbiAo J3JlZyBxdWVyeSAiJW8xNmMycl9yZWclXFByb2R1Y3RSZWxlYXNlSURzXCVfYWN0Y29uZmlnJSIgL2YgIi4xNiIgL2sgJW51bDYlIF58IGZpbmRzdHIgL2kg IlJldGFpbCBWb2x1bWUiJykgZG8gKA0KaWYgZGVmaW5lZCBfb0lkcyAoc2V0ICJfb0lkcz0hX29JZHMhICUlYSIpIGVsc2UgKHNldCAiX29JZHM9JSVhIikN CikNCnNldCBfb0lkcz0lX29JZHM6LjE2PSUNCmZvciAvZiAidG9rZW5zPTEiICUlQSBpbiAoIiVfb0lkcyUiKSBkbyBzZXQgX2ZpcnN0b0lkPSUlQQ0KZm9y IC9mICJza2lwPTIgdG9rZW5zPTIqIiAlJWEgaW4gKCcicmVnIHF1ZXJ5ICVvMTZjMnJfcmVnJVxDb25maWd1cmF0aW9uIC92ICVfZmlyc3RvSWQlLkV4Y2x1 ZGVkQXBwcyIgJW51bDYlJykgZG8gKHNldCAiX2ZpcnN0b0lkRXhjbHVkZWxpc3Q9JSViIikNCg0Kc2V0IHZlcmNoaz0wDQpzZXQgY2x2ZXJjaGs9MA0KZm9y IC9mICJ0b2tlbnM9MyBkZWxpbXM9LiIgJSVhIGluICgiJV92ZXJzaW9uJSIpIGRvIHNldCAidmVyY2hrPSUlYSINCmZvciAvZiAidG9rZW5zPTMgZGVsaW1z PS4iICUlYSBpbiAoIiVfY2x2ZXJzaW9uJSIpIGRvIHNldCAiY2x2ZXJjaGs9JSVhIg0KDQppZiBleGlzdCAiJV9vUm9vdCVcTGljZW5zZXMxNlxjMnJwcmlk c2xpY2Vuc2VmaWxlc19hdXRvLnhtbCIgc2V0ICJfYzJyWG1sPSVfb1Jvb3QlXExpY2Vuc2VzMTZcYzJycHJpZHNsaWNlbnNlZmlsZXNfYXV0by54bWwiDQoN CmlmIGV4aXN0ICIlUHJvZ3JhbURhdGElXE1pY3Jvc29mdFxDbGlja1RvUnVuXFByb2R1Y3RSZWxlYXNlc1wlX2FjdGNvbmZpZyVceC1ub25lLjE2XE1hc3Rl ckRlc2NyaXB0b3IueC1ub25lLnhtbCIgKA0Kc2V0ICJfbWFzdGVyeG1sPSVQcm9ncmFtRGF0YSVcTWljcm9zb2Z0XENsaWNrVG9SdW5cUHJvZHVjdFJlbGVh c2VzXCVfYWN0Y29uZmlnJVx4LW5vbmUuMTZcTWFzdGVyRGVzY3JpcHRvci54LW5vbmUueG1sIg0KKQ0KDQppZiBleGlzdCAiJV9jZm9sZGVyJVxPZmZpY2VD bGlja1RvUnVuLmV4ZSIgKA0Kc2V0ICJfYzJyRXhlPSVfY2ZvbGRlciVcT2ZmaWNlQ2xpY2tUb1J1bi5leGUiDQopDQoNCmlmIGV4aXN0ICIlX2Nmb2xkZXIl XE9mZmljZUMyUkNsaWVudC5leGUiICgNCnNldCAiX2MyckNleGU9JV9jZm9sZGVyJVxPZmZpY2VDMlJDbGllbnQuZXhlIg0KKQ0KDQo6OiAgQ2hlY2sgTFRT QyB2ZXJzaW9uIGZpbGVzDQoNCmZvciAvZiAic2tpcD0yIHRva2Vucz0yKiIgJSVhIGluICgnInJlZyBxdWVyeSAlbzE2YzJyX3JlZyVcUHJvZHVjdFJlbGVh c2VJRHNcJV9hY3Rjb25maWclIiAvcyAlbnVsNiUnKSBkbyAoDQplY2hvICIlJWIiICVudWwyJSB8IGZpbmRzdHIgIjE2LjAuMTAzIDE2LjAuMTA0IDE2LjAu MTA1IiAlbnVsJSAmJiBzZXQgbHRzYzE5PUxUU0MNCmVjaG8gIiUlYiIgJW51bDIlIHwgZmluZHN0ciAiMTYuMC4xNDMzMiIgJW51bCUgJiYgc2V0IGx0c2My MT1MVFNDMjAyMQ0KZWNobyAiJSViIiAlbnVsMiUgfCBmaW5kc3RyICIxNi4wLjE3OTMyIiAlbnVsJSAmJiBzZXQgbHRzYzI0PUxUU0MyMDI0DQopDQoNCmlm IG5vdCAiJWx0c2MxOSUlbHRzYzIxJSVsdHNjMjQlIj09IiIgc2V0IGx0c2Nmb3VuZD0xDQoNCmV4aXQgL2INCg0KOjo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBDaGVjayBhbGwgdGhlIGluc3RhbGxlZCBsYW5ndWFnZXMNCg0KOm9lX2dldGxhbmdzDQoNCmlmICIl MSI9PSIiICgNCnNldCBsYW5ncmVnPWN1bHR1cmUNCikgZWxzZSAoDQpzZXQgbGFuZ3JlZz0lMS4xNg0KKQ0KDQpzZXQgX2FsbExhbmdzPQ0KZWNobyAiJW8x NmMycl9yZWclIiB8IGZpbmQgL2kgIldvdzY0MzJOb2RlIiAlbnVsMSUgJiYgKHNldCBfdG9rPTEwKSB8fCAoc2V0IF90b2s9OSkNCmZvciAvZiAidG9rZW5z PSVfdG9rJSBkZWxpbXM9XCIgJSVhIGluICgncmVnIHF1ZXJ5ICIlbzE2YzJyX3JlZyVcUHJvZHVjdFJlbGVhc2VJRHNcJV9hY3Rjb25maWclXCVsYW5ncmVn JSIgL2YgIi0iIC9rIF58IGZpbmRzdHIgL2kgIiVsYW5ncmVnJVxcLiotLioiJykgZG8gKA0KaWYgZGVmaW5lZCBfYWxsTGFuZ3MgKHNldCAiX2FsbExhbmdz PSFfYWxsTGFuZ3MhXyUlYSIpIGVsc2UgKHNldCAiX2FsbExhbmdzPSUlYSIpDQopDQoNCnNldCBfYWxsTGFuZ3M9JV9hbGxMYW5nczouMTY9JQ0KZXhpdCAv Yg0KDQo6Oj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIENoZWNrIEludGVybmV0IGNvbm5lY3Rpb24NCg0K Om9lX2Noa2ludGVybmV0DQoNCnNldCBfaW50PQ0KZm9yICUlYSBpbiAobC5yb290LXNlcnZlcnMubmV0IHJlc29sdmVyMS5vcGVuZG5zLmNvbSBkb3dubG9h ZC53aW5kb3dzdXBkYXRlLmNvbSBnb29nbGUuY29tKSBkbyBpZiBub3QgZGVmaW5lZCBfaW50ICgNCmZvciAvZiAiZGVsaW1zPVtdIHRva2Vucz0yIiAlJSMg aW4gKCdwaW5nIC1uIDEgJSVhJykgZG8gKGlmIG5vdCAiJSUjIj09IiIgc2V0IF9pbnQ9MSkNCikNCg0KaWYgbm90IGRlZmluZWQgX2ludCAoDQolcHNjJSAi SWYoW0FjdGl2YXRvcl06OkNyZWF0ZUluc3RhbmNlKFtUeXBlXTo6R2V0VHlwZUZyb21DTFNJRChbR3VpZF0ne0RDQjAwQzAxLTU3MEYtNEE5Qi04RDY5LTE5 OUZEQkE1NzIzQn0nKSkuSXNDb25uZWN0ZWRUb0ludGVybmV0KXtFeGl0IDB9RWxzZXtFeGl0IDF9Ig0KaWYgIWVycm9ybGV2ZWwhPT0wIChzZXQgX2ludD0x KQ0KKQ0KDQppZiBub3QgZGVmaW5lZCBfaW50ICgNCiVlbGluZSUNCmNhbGwgOmRrX2NvbG9yICVSZWQlICJJbnRlcm5ldCBpcyBub3QgY29ubmVjdGVkLiIN CmNhbGwgOmRrX2NvbG9yICVCbHVlJSAiSW50ZXJuZXQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uLiINCikNCmV4aXQgL2INCg0KOjo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBHZXQgYXZhaWxhYmxlIGJ1aWxkIG51bWJlciBmb3IgYSBGRk4NCg0KOmdl dGJ1aWxkOg0KJFRsczEyID0gW0VudW1dOjpUb09iamVjdChbU3lzdGVtLk5ldC5TZWN1cml0eVByb3RvY29sVHlwZV0sIDMwNzIpDQpbU3lzdGVtLk5ldC5T ZXJ2aWNlUG9pbnRNYW5hZ2VyXTo6U2VjdXJpdHlQcm90b2NvbCA9ICRUbHMxMg0KDQokRkZOID0gJGVudjp0YXJnZXRGRk4NCiR3aW5kb3dzQnVpbGQgPSBb U3lzdGVtLkVudmlyb25tZW50XTo6T1NWZXJzaW9uLlZlcnNpb24uQnVpbGQNCg0KJGJhc2VVcmwgPSAiaHR0cHM6Ly9tcm9kZXZpY2VtZ3Iub2ZmaWNlYXBw cy5saXZlLmNvbS9tcm9kZXZpY2VtZ3JzdmMvYXBpL3YyL0MyUlJlbGVhc2VEYXRhP2F1ZGllbmNlRkZOPSRGRk4iDQokdXJsID0gaWYgKCR3aW5kb3dzQnVp bGQgLWx0IDkyMDApIHsgIiRiYXNlVXJsJm9zdmVyPUNsaWVudHw2LjEiIH0gZWxzZWlmICgkd2luZG93c0J1aWxkIC1sdCAxMDI0MCkgeyAiJGJhc2VVcmwm b3N2ZXI9Q2xpZW50fDYuMyIgfSBlbHNlIHsgJGJhc2VVcmwgfQ0KDQokcmVzcG9uc2UgPSBpZiAoJHdpbmRvd3NCdWlsZCAtZ2UgOTIwMCkgeyBpcm0gLVVy aSAkdXJsIC1NZXRob2QgR2V0IH0gZWxzZSB7IChOZXctT2JqZWN0IFN5c3RlbS5OZXQuV2ViQ2xpZW50KS5Eb3dubG9hZFN0cmluZygkdXJsKSB9DQoNCmlm ICgkd2luZG93c0J1aWxkIC1sdCA5MjAwKSB7DQogICAgaWYgKCRyZXNwb25zZSAtbWF0Y2ggJyJBdmFpbGFibGVCdWlsZCJccyo6XHMqIihbXiJdKykiJykg eyBXcml0ZS1Ib3N0ICRtYXRjaGVzWzFdIH0NCn0gZWxzZSB7DQogICAgV3JpdGUtSG9zdCAkcmVzcG9uc2UuQXZhaWxhYmxlQnVpbGQNCn0NCjpnZXRidWls ZDoNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCjo6ICBHZXQgYXZhaWxhYmxlIGVkaXRpb24gbGlzdCBm cm9tIGMycnByaWRzbGljZW5zZWZpbGVzX2F1dG8ueG1sDQo6OiAgYW5kIGZpbHRlciB0aGUgbGlzdCB1c2luZyBNYXN0ZXJEZXNjcmlwdG9yLngtbm9uZS54 bWwNCjo6ICBhbmQgZXhjbHVkZSB1bnN1cHBvcnRlZCBwcm9kdWN0cyBvbiBXaW5kb3dzIDcvOC84LjENCg0KOmdldGxpc3Q6DQokeG1sUGF0aDEgPSAkZW52 Ol9jMnJYbWwNCiR4bWxQYXRoMiA9ICRlbnY6X21hc3RlcnhtbA0KJG91dHB1dERpciA9ICRlbnY6U3lzdGVtUm9vdCArICJcVGVtcFwkZW52Om9fcmFuZGd1 aWRcIg0KJGJ1aWxkTnVtYmVyID0gW1N5c3RlbS5FbnZpcm9ubWVudF06Ok9TVmVyc2lvbi5WZXJzaW9uLkJ1aWxkDQokZXhjbHVkZWRLZXl3b3JkcyA9IEAo IjIwMTkiLCAiMjAyMSIsICIyMDI0IikNCiRwcm9kdWN0UmVsZWFzZUlkcyA9IEAoKQ0KDQppZiAoVGVzdC1QYXRoICR4bWxQYXRoMSkgew0KICAgICR4bWwx ID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLlhtbC5YbWxEb2N1bWVudA0KICAgICR4bWwxLkxvYWQoJHhtbFBhdGgxKQ0KICAgIGZvcmVhY2ggKCRu b2RlIGluICR4bWwxLlNlbGVjdE5vZGVzKCIvL1Byb2R1Y3RSZWxlYXNlSWQiKSkgew0KICAgICAgICAkaWQgPSAkbm9kZS5HZXRBdHRyaWJ1dGUoImlkIikN CiAgICAgICAgJGV4Y2x1ZGUgPSAkZmFsc2UNCiAgICAgICAgaWYgKCRidWlsZE51bWJlciAtbHQgMTAyNDApIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRr ZXl3b3JkIGluICRleGNsdWRlZEtleXdvcmRzKSB7DQogICAgICAgICAgICAgICAgaWYgKCRpZCAtbWF0Y2ggJGtleXdvcmQpIHsgJGV4Y2x1ZGUgPSAkdHJ1 ZTsgYnJlYWsgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICgkaWQgLW5lICJDb21tb25MaWNlbnNlRmlsZXMiIC1hbmQgLW5vdCAk ZXhjbHVkZSkgeyAkcHJvZHVjdFJlbGVhc2VJZHMgKz0gJGlkIH0NCiAgICB9DQp9DQoNCiRjYXRlZ29yaWVzID0gQHsNCiAgICAiU3VpdGVzX1JldGFpbCIg PSBAKCk7ICJTdWl0ZXNfVm9sdW1lIiA9IEAoKQ0KICAgICJTaW5nbGVBcHBzX1JldGFpbCIgPSBAKCk7ICJTaW5nbGVBcHBzX1ZvbHVtZSIgPSBAKCkNCn0N Cg0KZm9yZWFjaCAoJGlkIGluICRwcm9kdWN0UmVsZWFzZUlkcykgew0KICAgICRjYXRlZ29yeSA9IGlmICgkaWQgLW1hdGNoICJSZXRhaWwiKSB7ICJSZXRh aWwiIH0gZWxzZSB7ICJWb2x1bWUiIH0NCiAgICAkY2F0ZWdvcmllc1siU2luZ2xlQXBwc18kY2F0ZWdvcnkiXSArPSAkaWQNCn0NCg0KaWYgKFRlc3QtUGF0 aCAkeG1sUGF0aDIpIHsNCiAgICAkeG1sMiA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5YbWwuWG1sRG9jdW1lbnQNCiAgICAkeG1sMi5Mb2FkKCR4 bWxQYXRoMikNCiAgICBmb3JlYWNoICgkc2t1IGluICR4bWwyLlNlbGVjdE5vZGVzKCIvL1NLVSIpKSB7DQogICAgICAgICRza3VJZCA9ICRza3UuR2V0QXR0 cmlidXRlKCJJRCIpDQogICAgICAgIGlmICgkcHJvZHVjdFJlbGVhc2VJZHMgLWNvbnRhaW5zICRza3VJZCkgew0KICAgICAgICAgICAgJGFwcElkcyA9ICRz a3UuU2VsZWN0Tm9kZXMoIkFwcHMvQXBwIikgfCBGb3JFYWNoLU9iamVjdCB7ICRfLkdldEF0dHJpYnV0ZSgiaWQiKSB9DQogICAgICAgICAgICBpZiAoJGFw cElkcyAtY29udGFpbnMgIkV4Y2VsIiAtYW5kICRhcHBJZHMgLWNvbnRhaW5zICJXb3JkIikgew0KICAgICAgICAgICAgICAgICRjYXRlZ29yeSA9IGlmICgk c2t1SWQgLW1hdGNoICJSZXRhaWwiKSB7ICJSZXRhaWwiIH0gZWxzZSB7ICJWb2x1bWUiIH0NCiAgICAgICAgICAgICAgICAkY2F0ZWdvcmllc1siU3VpdGVz XyRjYXRlZ29yeSJdICs9ICRza3VJZA0KICAgICAgICAgICAgICAgICRjYXRlZ29yaWVzWyJTaW5nbGVBcHBzXyRjYXRlZ29yeSJdID0gJGNhdGVnb3JpZXNb IlNpbmdsZUFwcHNfJGNhdGVnb3J5Il0gfCBXaGVyZS1PYmplY3QgeyAkXyAtbmUgJHNrdUlkIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0N Cn0NCg0KZm9yZWFjaCAoJHNlY3Rpb24gaW4gJGNhdGVnb3JpZXMuS2V5cykgew0KICAgICRmaWxlUGF0aCA9IEpvaW4tUGF0aCAtUGF0aCAkb3V0cHV0RGly IC1DaGlsZFBhdGggIiRzZWN0aW9uLnR4dCINCiAgICAkaWRzID0gJGNhdGVnb3JpZXNbJHNlY3Rpb25dDQogICAgaWYgKCRpZHMuQ291bnQgLWd0IDApIHsg JGlkcyB8IE91dC1GaWxlIC1GaWxlUGF0aCAkZmlsZVBhdGggLUVuY29kaW5nIEFTQ0lJIH0NCn0NCjpnZXRsaXN0Og0KDQo6Oj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KOjogIEdldCBBcHAgbGlzdCBmb3IgYSBzcGVjaWZpYyBwcm9kdWN0IElEIHVzaW5nIE1hc3RlckRl c2NyaXB0b3IueC1ub25lLnhtbA0KDQo6Z2V0YXBwbmFtZXM6DQokeG1sUGF0aCA9ICRlbnY6X21hc3RlcnhtbA0KJHRhcmdldFNrdUlkID0gJGVudjp0YXJn ZXRlZGl0aW9uDQokb3V0cHV0RGlyID0gJGVudjpTeXN0ZW1Sb290ICsgIlxUZW1wXCRlbnY6b19yYW5kZ3VpZFwiDQokb3V0cHV0RmlsZSA9IEpvaW4tUGF0 aCAtUGF0aCAkb3V0cHV0RGlyIC1DaGlsZFBhdGggImdldEFwcElkcy50eHQiDQokZXhjbHVkZUlkcyA9IEAoInNoYXJlZCIsICJQb3dlclBpdm90IiwgIlBv d2VyVmlldyIsICJNb25kb09ubHkiLCAiT1NNIiwgIk9TTVVYIiwgIkdyb292ZSIsICJEQ0YiKQ0KDQokeG1sID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lz dGVtLlhtbC5YbWxEb2N1bWVudA0KJHhtbC5Mb2FkKCR4bWxQYXRoKQ0KDQokYXBwSWRzTGlzdCA9IEAoKQ0KJHNrdU5vZGVzID0gJHhtbC5TZWxlY3ROb2Rl cygiLy9TS1VbQElEPSckdGFyZ2V0U2t1SWQnXSIpDQoNCmZvcmVhY2ggKCRza3VOb2RlIGluICRza3VOb2Rlcykgew0KICAgIGZvcmVhY2ggKCRhcHAgaW4g JHNrdU5vZGUuU2VsZWN0Tm9kZXMoIkFwcHMvQXBwIikpIHsNCiAgICAgICAgJGFwcElkID0gJGFwcC5HZXRBdHRyaWJ1dGUoImlkIikNCiAgICAgICAgaWYg KCRleGNsdWRlSWRzIC1ub3Rjb250YWlucyAkYXBwSWQpIHsNCiAgICAgICAgICAgICRhcHBJZHNMaXN0ICs9ICRhcHBJZA0KICAgICAgICB9DQogICAgfQ0K fQ0KDQppZiAoJGFwcElkc0xpc3QuQ291bnQgLWd0IDApIHsNCiAgICAkYXBwSWRzTGlzdCB8IE91dC1GaWxlIC1GaWxlUGF0aCAkb3V0cHV0RmlsZSAtRW5j b2RpbmcgQVNDSUkNCn0NCjpnZXRhcHBuYW1lczoNCg0KOjo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQo6Og0KOjog TGVhdmUgZW1wdHkgbGluZSBiZWxvdw0KDQo= '@ function Executar-MAS { Rodar-Async -Vars @{masConteudoBase64=$script:masConteudoBase64; masSha256=$script:masSha256} -Bloco { $arquivo = Join-Path ([IO.Path]::GetTempPath()) ('VicTool-MAS-' + [guid]::NewGuid().ToString('N') + '.cmd') try { Escrever-Log 'Extraindo MAS.cmd incorporado ao VicTool...' [IO.File]::WriteAllBytes($arquivo, [Convert]::FromBase64String($masConteudoBase64)) if ((Get-FileHash -LiteralPath $arquivo -Algorithm SHA256 -ErrorAction Stop).Hash -ne $masSha256) { throw 'O MAS.cmd incorporado falhou na verificacao de integridade.' } Escrever-Log 'Abrindo MAS.cmd no CMD. Feche o menu para concluir.' $process = Start-Process -FilePath "$env:SystemRoot\System32\cmd.exe" -ArgumentList ('/d /c ""{0}""' -f $arquivo) -Wait -PassThru -ErrorAction Stop if ($process.ExitCode -ne 0) { throw "MAS.cmd terminou com codigo $($process.ExitCode)." } Escrever-Log 'MAS.cmd encerrado.' 'INFO' } finally { if (Test-Path -LiteralPath $arquivo) { Remove-Item -LiteralPath $arquivo -Force -ErrorAction SilentlyContinue } } } } function Criar-Icone { $bmp = New-Object System.Drawing.Bitmap(16, 16) $g = [System.Drawing.Graphics]::FromImage($bmp) $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias $g.Clear([System.Drawing.Color]::Transparent) $brush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(0, 122, 204)) $g.FillEllipse($brush, 0, 0, 15, 15) $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::White, 2) $g.DrawLine($pen, 2, 3, 7, 12) $g.DrawLine($pen, 12, 3, 7, 12) $g.Dispose(); $pen.Dispose(); $brush.Dispose() $icon = [System.Drawing.Icon]::FromHandle($bmp.GetHicon()) $bmp.Dispose() return $icon } # ─── Aplicar Tweak ──────────────────────────────────────── function Aplicar-Tweak-Item { param([string]$Acao) if ($Acao -in @('perf_energia','perf_energia_max')) { $active = Invoke-NativeChecked powercfg @('/getactivescheme') $match = [regex]::Match(($active -join ' '), '[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}') if (-not $match.Success) { throw 'Nao foi possivel salvar o plano de energia atual.' } Salvar-EstadoAnterior @{Kind='Power'; Guid=$match.Value} | Out-Null } switch ($Acao) { # Performance "perf_visual" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" "VisualFXSetting" 2; Escrever-Log "Efeitos visuais desativados!" "OK" } "perf_energia" { Invoke-NativeChecked 'powercfg' @('/setactive','8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c') | Out-Null; Escrever-Log "Plano Alto Desempenho ativado!" "OK" } "perf_energia_max" { $plan='5c1a75d2-8d9a-4f8f-a8ef-60c90e8b8e11' $plans=Invoke-NativeChecked powercfg @('/list') if (($plans -join ' ') -notmatch $plan) { Invoke-NativeChecked powercfg @('/duplicatescheme','e9a42b02-d5df-448d-aa00-03f14749eb61',$plan) | Out-Null Invoke-NativeChecked powercfg @('/changename',$plan,'VicTool - Desempenho Maximo') | Out-Null } Invoke-NativeChecked powercfg @('/setactive',$plan) | Out-Null Escrever-Log "Plano Desempenho Maximo ativado! ($plan)" 'OK' } "perf_sysmain" { Svc-Disable "SysMain" } "perf_index" { Svc-Disable "WSearch" } "perf_gamedvr" { RegSet "HKCU:\System\GameConfigStore" "GameDVR_Enabled" 0; RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\GameDVR" "AllowGameDVR" 0; Escrever-Log "Game DVR desativado!" "OK" } "perf_temp" { Limpar-Temporarios } "perf_cpu_prio" { RegSet "HKLM:\SYSTEM\CurrentControlSet\Control\PriorityControl" "Win32PrioritySeparation" 38 Escrever-Log "Prioridade de CPU otimizada para aplicacoes!" "OK" } "perf_hibern" { Invoke-NativeChecked 'powercfg' @('/hibernate','off') | Out-Null; Escrever-Log "Hibernacao desativada! (libera espaco no SSD)" "OK" } "perf_ntfs" { Invoke-NativeChecked 'fsutil' @('behavior','set','disable8dot3','1') | Out-Null; Escrever-Log "Nomes curtos NTFS (8.3) desativados!" "OK" } # Privacidade "priv_telemetria" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" "AllowTelemetry" 0 @("DiagTrack","dmwappushservice") | ForEach-Object { Svc-Disable $_ } Escrever-Log "Telemetria desativada!" "OK" } "priv_ads" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo" "Enabled" 0; Escrever-Log "Publicidade desativada!" "OK" } "priv_bing" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search" "BingSearchEnabled" 0; RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search" "CortanaConsent" 0; Escrever-Log "Bing removido do Menu Iniciar!" "OK" } "priv_activity" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" "EnableActivityFeed" 0; RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" "PublishUserActivities" 0; Escrever-Log "Activity History desativado!" "OK" } "priv_diag" { RegSet "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection" "AllowTelemetry" 0; Escrever-Log "Diagnosticos minimizados!" "OK" } "priv_cortana" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" "AllowCortana" 0; Escrever-Log "Cortana desativada!" "OK" } "priv_location" { RegSet "HKLM:\SOFTWARE\Policies\Microsoft\Windows\LocationAndSensors" "DisableLocation" 1 RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\DeviceAccess\Global\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}" "Value" "Deny" "String" Escrever-Log "Rastreamento de localizacao desativado!" "OK" } "priv_devices" { @("{2EEF81BE-33FA-4800-9670-1CD474972C3F}","{992AFA70-6F47-4148-B3E9-3003349C1548}") | ForEach-Object { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\DeviceAccess\Global\$_" "Value" "Deny" "String" } Escrever-Log "Acesso de apps a microfone/camera negado!" "OK" } "priv_inktyping" { RegSet "HKCU:\Software\Microsoft\InputPersonalization" "RestrictImplicitInkCollection" 1; RegSet "HKCU:\Software\Microsoft\InputPersonalization" "RestrictImplicitTextCollection" 1; Escrever-Log "Coleta de tinta/digitacao desativada!" "OK" } "priv_wifisense" { RegSet "HKLM:\SOFTWARE\Microsoft\WcmSvc\wifinetworkmanager\config" "AutoConnectAllowedOEM" 0; Escrever-Log "WiFi Sense desativado!" "OK" } "priv_hosts" { $hostsPath = "$env:WINDIR\System32\drivers\etc\hosts" $dominios = @( "0.0.0.0 telemetry.microsoft.com", "0.0.0.0 vortex.data.microsoft.com", "0.0.0.0 settings-win.data.microsoft.com", "0.0.0.0 watson.telemetry.microsoft.com", "0.0.0.0 oca.telemetry.microsoft.com", "0.0.0.0 sqm.telemetry.microsoft.com" ) $hostsConteudo = Get-Content $hostsPath -ErrorAction Stop if (@($dominios | Where-Object { $hostsConteudo -notcontains $_ }).Count) { Salvar-ArquivoAnterior $hostsPath } foreach ($d in $dominios) { if ($hostsConteudo -notcontains $d) { Add-Content -Path $hostsPath -Value $d -ErrorAction Stop } } Escrever-Log "Dominios de telemetria bloqueados no Hosts!" "OK" } # Interface "ui_ext" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "HideFileExt" 0; Escrever-Log "Extensoes de arquivo visiveis!" "OK" } "ui_hidden" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "Hidden" 1; Escrever-Log "Arquivos ocultos visiveis!" "OK" } "ui_notif" { $p = "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" @("SubscribedContent-338388Enabled","SubscribedContent-338389Enabled","SubscribedContent-353694Enabled","SubscribedContent-353696Enabled","SoftLandingEnabled","SystemPaneSuggestionsEnabled","OemPreInstalledAppsEnabled","PreInstalledAppsEnabled","SilentInstalledAppsEnabled") | ForEach-Object { RegSet $p $_ 0 } Escrever-Log "Notificacoes e sugestoes desativadas!" "OK" } "ui_endtask" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarDeveloperSettings" "TaskbarEndTask" 1; Escrever-Log "Encerrar Tarefa ativado!" "OK" } "ui_menu" { RegSet 'HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32' '' '' 'String'; Escrever-Log 'Menu classico configurado.' 'OK' } "ui_taskbar" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "TaskbarAl" 0; Escrever-Log "Barra alinhada a esquerda!" "OK" } "ui_recstart" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "Start_TrackProgs" 0; Escrever-Log "Recomendados do Menu Iniciar desativados!" "OK" } "ui_searchhl" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Feeds\DSB" "ShowDynamicContent" 0; RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\SearchSettings" "IsDynamicSearchBoxEnabled" 0; Escrever-Log "Destaque da Pesquisa (Bing) desativado!" "OK" } "ui_clock_sec" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "ShowSecondsInSystemClock" 1; Escrever-Log "Segundos no relogio ativados!" "OK" } "ui_snap" { RegSet "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" "SnapAssist" 0; Escrever-Log "Snap Assist popup desativado!" "OK" } # Servicos "svc_diagtrack" { Svc-Disable "DiagTrack" } "svc_wsearch" { Svc-Disable "WSearch" } "svc_sysmain" { Svc-Disable "SysMain" } "svc_spooler" { Svc-Disable "Spooler" } "svc_fax" { Svc-Disable "Fax" } "svc_remreg" { Svc-Disable "RemoteRegistry" } "svc_tablet" { Svc-Disable "TabletInputService" } "svc_touch" { Svc-Disable "TouchKeyboardAndHandwritingPanelService" } "svc_geoloc" { Svc-Disable "lfsvc" } "svc_diagsvc" { Svc-Disable "DiagnosticHub.StandardCollector.Service" } "svc_xbox" { @("XblAuthManager","XblGameSave","XboxGipSvc","XboxNetApiSvc") | ForEach-Object { Svc-Disable $_ } } "svc_wallet" { Svc-Disable "WalletService" } "svc_maps" { Svc-Disable "MapsBroker" } "svc_retail" { Svc-Disable "RetailDemo" } "svc_ics" { Svc-Disable "SharedAccess" } "svc_trkwks" { Svc-Disable "TrkWks" } } } # ═══════════════════════════════════════════════════════════ # JANELA PRINCIPAL # ═══════════════════════════════════════════════════════════ Inicializar-Sessao $script:workerFunctions = @('Escrever-Log','RegSet','Svc-Disable','Invoke-NativeChecked','Iniciar-RegistroOperacao','Salvar-EstadoAnterior','Set-VicDns','Salvar-ArquivoAnterior','Get-VicHistory','Restaurar-UltimaOperacao','Limpar-Temporarios','Get-TweakInfo','Invoke-TweakBatch','Aplicar-Tweak-Item','Publicar-Progresso','Get-WingetResult') $script:form = New-Object System.Windows.Forms.Form $script:form.add_FormClosing({ param($sender, $eventArgs) if ($script:asyncTimers -and $script:asyncTimers.Count -gt 0) { $eventArgs.Cancel = $true [System.Windows.Forms.MessageBox]::Show('Aguarde as operacoes em andamento antes de fechar.', 'Operacao em andamento', 'OK', 'Information') | Out-Null } }) $script:form.Text = "VicTool v1.5.1 | by Victor Schiavinato" $script:form.Size = New-Object System.Drawing.Size(1220, 780) $script:form.StartPosition = "CenterScreen" $script:form.BackColor = $corFundo $script:form.ForeColor = $corTexto $script:form.Font = New-Object System.Drawing.Font("Segoe UI", 9) $script:form.MinimumSize = New-Object System.Drawing.Size(1000, 660) $script:form.Icon = Criar-Icone # Barra de acento + Header $pnlAccent = New-Object System.Windows.Forms.Panel $pnlAccent.Dock = "Top"; $pnlAccent.Height = 3; $pnlAccent.BackColor = $corDestaque $pnlHeader = New-Object System.Windows.Forms.Panel $pnlHeader.Dock = "Top"; $pnlHeader.Height = 54; $pnlHeader.BackColor = $corPainel # Titulo + versao lado a lado, subtitulo na linha de baixo $lblTitulo = New-Object System.Windows.Forms.Label $lblTitulo.Text = "VicTool" $lblTitulo.Font = New-Object System.Drawing.Font("Segoe UI", 18, [System.Drawing.FontStyle]::Bold) $lblTitulo.ForeColor = $corDestaque $lblTitulo.Location = New-Object System.Drawing.Point(18, 8) $lblTitulo.AutoSize = $true $lblVersion = New-Object System.Windows.Forms.Label $lblVersion.Text = "v1.5.1" $lblVersion.Font = New-Object System.Drawing.Font("Segoe UI", 8) $lblVersion.ForeColor = $corTextoEscuro $lblVersion.Location = New-Object System.Drawing.Point(110, 12) $lblVersion.AutoSize = $true $sepHeaderV = New-Object System.Windows.Forms.Panel $sepHeaderV.Location = New-Object System.Drawing.Point(148, 10) $sepHeaderV.Size = New-Object System.Drawing.Size(1, 32) $sepHeaderV.BackColor = $corBorda $lblSub = New-Object System.Windows.Forms.Label $lblSub.Text = "Ferramenta de Otimizacao, Debloat e Configuracao Windows | by Victor Schiavinato" $lblSub.Font = New-Object System.Drawing.Font("Segoe UI", 9) $lblSub.ForeColor = $corTextoEscuro $lblSub.Location = New-Object System.Drawing.Point(158, 17) $lblSub.AutoSize = $true $pnlHeader.Controls.AddRange(@($lblTitulo, $lblVersion, $sepHeaderV, $lblSub)) $script:form.Controls.Add($pnlAccent) $script:form.Controls.Add($pnlHeader) # Container principal — com padding bottom de 10px para botoes nao colarem no footer $pnlMain = New-Object System.Windows.Forms.Panel $pnlMain.Location = New-Object System.Drawing.Point(0, 57) $pnlMain.Size = New-Object System.Drawing.Size(1220, 686) $pnlMain.Anchor = "Top,Left,Bottom,Right" $pnlMain.BackColor = $corFundo $pnlMain.Padding = New-Object System.Windows.Forms.Padding(0, 0, 0, 10) $script:form.Controls.Add($pnlMain) # Sidebar $pnlSidebar = New-Object System.Windows.Forms.Panel $pnlSidebar.Location = New-Object System.Drawing.Point(0, 0) $pnlSidebar.Size = New-Object System.Drawing.Size(182, 686) $pnlSidebar.Anchor = "Top,Left,Bottom" $pnlSidebar.BackColor = $corPainel $pnlMain.Controls.Add($pnlSidebar) $sepSide = New-Object System.Windows.Forms.Panel $sepSide.Location = New-Object System.Drawing.Point(182, 0); $sepSide.Size = New-Object System.Drawing.Size(1, 686) $sepSide.Anchor = "Top,Left,Bottom"; $sepSide.BackColor = $corBorda $pnlMain.Controls.Add($sepSide) # Area de conteudo — cresce horizontalmente, deixando 240px para o log $pnlContent = New-Object System.Windows.Forms.Panel $pnlContent.Location = New-Object System.Drawing.Point(183, 0) $pnlContent.Size = New-Object System.Drawing.Size(796, 686) $pnlContent.Anchor = "Top,Left,Bottom,Right" $pnlContent.BackColor = $corFundo $pnlMain.Controls.Add($pnlContent) # Log — 235px de largura $sepLog = New-Object System.Windows.Forms.Panel $sepLog.Location = New-Object System.Drawing.Point(979, 0); $sepLog.Size = New-Object System.Drawing.Size(1, 686) $sepLog.Anchor = "Top,Right,Bottom"; $sepLog.BackColor = $corBorda $pnlMain.Controls.Add($sepLog) $pnlLog = New-Object System.Windows.Forms.Panel $pnlLog.Location = New-Object System.Drawing.Point(980, 0) $pnlLog.Size = New-Object System.Drawing.Size(240, 686) $pnlLog.Anchor = "Top,Right,Bottom" $pnlLog.BackColor = $corFundo $pnlMain.Controls.Add($pnlLog) # ─── Tabs ───────────────────────────────────────────────── $tabDefs = @( @{ Label="Pagina Inicial"; Icon="[H]"; } @{ Label="Instalar Programas"; Icon="[+]"; } @{ Label="Remover Bloatware"; Icon="[-]"; } @{ Label="Tweaks + Servicos"; Icon="[*]"; } @{ Label="Sistema"; Icon="[S]"; } @{ Label="Microsoft"; Icon="[M]"; } @{ Label="Ajustes"; Icon="[A]"; } @{ Label="Rede"; Icon="[R]"; } @{ Label="Usuarios"; Icon="[U]"; } ) $tabPanels = [System.Collections.ArrayList]@() $tabButtons = [System.Collections.ArrayList]@() function Criar-TabPanel { $p = New-Object System.Windows.Forms.Panel $p.Dock = "Fill"; $p.BackColor = $corFundo; $p.Visible = $false $pnlContent.Controls.Add($p) return $p } function Solicitar-SenhaMicrosoft { $frmSenha = New-Object System.Windows.Forms.Form $frmSenha.Text = "Acesso Restrito" $frmSenha.Size = New-Object System.Drawing.Size(360, 180) $frmSenha.StartPosition = "CenterParent" $frmSenha.FormBorderStyle = "FixedDialog" $frmSenha.MaximizeBox = $false $frmSenha.MinimizeBox = $false $frmSenha.ShowInTaskbar = $false $frmSenha.BackColor = $corPainel $frmSenha.ForeColor = $corTexto $frmSenha.Font = New-Object System.Drawing.Font("Segoe UI", 9) $frmSenha.Tag = $false $lblSenha = New-Object System.Windows.Forms.Label $lblSenha.Text = "Digite a senha para acessar o menu Microsoft:" $lblSenha.Location = New-Object System.Drawing.Point(16, 16) $lblSenha.Size = New-Object System.Drawing.Size(315, 22) $lblSenha.ForeColor = $corTextoClaro $txtSenha = New-Object System.Windows.Forms.TextBox $txtSenha.Location = New-Object System.Drawing.Point(16, 44) $txtSenha.Size = New-Object System.Drawing.Size(315, 25) $txtSenha.UseSystemPasswordChar = $true $txtSenha.BackColor = $corBorda $txtSenha.ForeColor = $corTextoClaro $txtSenha.BorderStyle = "FixedSingle" $btnEntrar = New-Object System.Windows.Forms.Button $btnEntrar.Text = "Entrar" $btnEntrar.Location = New-Object System.Drawing.Point(141, 88) $btnEntrar.Size = New-Object System.Drawing.Size(90, 30) $btnEntrar.BackColor = $corDestaque $btnEntrar.ForeColor = $corTextoClaro $btnEntrar.FlatStyle = "Flat" $btnEntrar.FlatAppearance.BorderSize = 0 $btnCancelar = New-Object System.Windows.Forms.Button $btnCancelar.Text = "Cancelar" $btnCancelar.Location = New-Object System.Drawing.Point(241, 88) $btnCancelar.Size = New-Object System.Drawing.Size(90, 30) $btnCancelar.BackColor = $corBorda $btnCancelar.ForeColor = $corTextoClaro $btnCancelar.FlatStyle = "Flat" $btnCancelar.FlatAppearance.BorderSize = 0 $btnEntrar.add_Click({ if ($txtSenha.Text -eq "171511") { $frmSenha.Tag = $true $frmSenha.DialogResult = [System.Windows.Forms.DialogResult]::OK $frmSenha.Close() } else { [System.Windows.Forms.MessageBox]::Show( "Senha incorreta.", "Acesso negado", "OK", "Error" ) | Out-Null $txtSenha.Clear() $txtSenha.Focus() } }) $btnCancelar.add_Click({ $frmSenha.Tag = $false $frmSenha.DialogResult = [System.Windows.Forms.DialogResult]::Cancel $frmSenha.Close() }) $frmSenha.AcceptButton = $btnEntrar $frmSenha.CancelButton = $btnCancelar $frmSenha.Controls.AddRange(@($lblSenha, $txtSenha, $btnEntrar, $btnCancelar)) $frmSenha.add_Shown({ $txtSenha.Focus() }) [void]$frmSenha.ShowDialog($script:form) return [bool]$frmSenha.Tag } function Selecionar-Tab { param([int]$idx) if ($idx -eq 5 -and -not (Solicitar-SenhaMicrosoft)) { return } $script:tabAtual = $idx for ($i = 0; $i -lt $tabPanels.Count; $i++) { $tabPanels[$i].Visible = ($i -eq $idx) } for ($i = 0; $i -lt $tabButtons.Count; $i++) { if ($i -eq $idx) { $tabButtons[$i].BackColor = $corDestaque; $tabButtons[$i].ForeColor = $corTextoClaro } else { $tabButtons[$i].BackColor = $corTabInativa; $tabButtons[$i].ForeColor = $corTextoEscuro } } } $yBtn = 10 foreach ($def in $tabDefs) { $btn = New-Object System.Windows.Forms.Button $btn.Text = " $($def.Icon) $($def.Label)" $btn.Location = New-Object System.Drawing.Point(6, $yBtn) $btn.Size = New-Object System.Drawing.Size(166, 42) $btn.BackColor = $corTabInativa; $btn.ForeColor = $corTextoEscuro $btn.FlatStyle = "Flat"; $btn.FlatAppearance.BorderSize = 0 $btn.FlatAppearance.MouseOverBackColor = $corTabHover $btn.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $btn.TextAlign = "MiddleLeft"; $btn.Cursor = [System.Windows.Forms.Cursors]::Hand $btn.Tag = $tabButtons.Count $pnl = Criar-TabPanel $tabPanels.Add($pnl) | Out-Null $tabButtons.Add($btn) | Out-Null $btn.add_Click({ Selecionar-Tab -idx $this.Tag }) $pnlSidebar.Controls.Add($btn) $yBtn += 48 } $sepSideLine = New-Object System.Windows.Forms.Panel $sepSideLine.Location = New-Object System.Drawing.Point(10, ($yBtn - 6)); $sepSideLine.Size = New-Object System.Drawing.Size(158, 1); $sepSideLine.BackColor = $corBorda $pnlSidebar.Controls.Add($sepSideLine) $lblCredit = New-Object System.Windows.Forms.Label $lblCredit.Text = "by Victor Schiavinato"; $lblCredit.ForeColor = $corTextoEscuro $lblCredit.Font = New-Object System.Drawing.Font("Segoe UI", 7); $lblCredit.Location = New-Object System.Drawing.Point(8, 620); $lblCredit.AutoSize = $true $pnlSidebar.Controls.Add($lblCredit) # ═══════════════════════════════════════════════════════════ # ABA 0 — PAGINA INICIAL # ═══════════════════════════════════════════════════════════ $pHome = $tabPanels[0] $pnlHomeScroll = New-Object System.Windows.Forms.Panel $pnlHomeScroll.Dock = "Fill" $pnlHomeScroll.BackColor = $corFundo $pnlHomeScroll.AutoScroll = $true # ── Boas-vindas ─────────────────────────────────────────── $pnlWelcome = New-Object System.Windows.Forms.Panel $pnlWelcome.Location = New-Object System.Drawing.Point(16, 16) $pnlWelcome.Size = New-Object System.Drawing.Size(760, 100) $pnlWelcome.BackColor = $corPainel $acHome = New-Object System.Windows.Forms.Panel $acHome.Location = New-Object System.Drawing.Point(0,0); $acHome.Size = New-Object System.Drawing.Size(4,100); $acHome.BackColor = $corDestaque $pnlWelcome.Controls.Add($acHome) $lblWelTit = New-Object System.Windows.Forms.Label $lblWelTit.Text = "Bem-vindo ao VicTool v1.5.1" $lblWelTit.Font = New-Object System.Drawing.Font("Segoe UI", 14, [System.Drawing.FontStyle]::Bold) $lblWelTit.ForeColor = $corTextoClaro $lblWelTit.Location = New-Object System.Drawing.Point(16, 12); $lblWelTit.AutoSize = $true $pnlWelcome.Controls.Add($lblWelTit) $lblWelSub = New-Object System.Windows.Forms.Label $lblWelSub.Text = "Ferramenta completa de otimizacao, limpeza e configuracao para Windows 10/11.`nDesenvolvida por Victor Schiavinato para uso profissional e pessoal." $lblWelSub.Font = New-Object System.Drawing.Font("Segoe UI", 9) $lblWelSub.ForeColor = $corTextoEscuro $lblWelSub.Location = New-Object System.Drawing.Point(16, 42); $lblWelSub.Size = New-Object System.Drawing.Size(730, 48) $pnlWelcome.Controls.Add($lblWelSub) $pnlHomeScroll.Controls.Add($pnlWelcome) # ── Cards de funcionalidades ────────────────────────────── $funcoes = @( @{ Titulo = "[+] Instalar Programas" Cor = $corDestaque Desc = "Instale mais de 30 programas essenciais com um clique, organizados por categoria:`n" + " - Navegadores: Chrome, Firefox, Brave`n" + " - Utilitarios: 7-Zip, Notepad++, Everything, PowerToys`n" + " - Desenvolvimento: VS Code, Git, Python, Node.js`n" + " - Acesso remoto: TeamViewer, AnyDesk, RustDesk, PuTTY`n" + " - Seguranca: Bitwarden, Malwarebytes, KeePassXC`n" + " - E muito mais! Tudo via Winget, de forma silenciosa." } @{ Titulo = "[-] Remover Bloatware" Cor = $corVermelho Desc = "Remove aplicativos desnecessarios pre-instalados pela Microsoft:`n" + " - Microsoft Copilot, Clipchamp, Xbox e Game Bar`n" + " - Jogos: Solitaire, Candy Crush, Farmville`n" + " - Widgets, Mixed Reality Portal, Paint 3D, 3D Viewer`n" + " - Teams (pessoal), Skype legacy, OneDrive`n" + " - Sistema classificado por risco: [OK] Seguro / [MEDIO] Cuidado / [ALTO] Impacto maior" } @{ Titulo = "[*] Tweaks e Servicos" Cor = $corAmarelo Desc = "46 otimizacoes organizadas em 4 categorias com filtro:`n" + " - Performance: efeitos visuais, plano de energia maximo, hibernacao, NTFS 8.3`n" + " - Privacidade: telemetria, publicidade, Bing, localizacao, hosts DNS`n" + " - Interface: extensoes de arquivo, menu classico, barra esquerda, snap assist`n" + " - Servicos: desativa 15+ servicos inuteis (Xbox, Fax, Geolocation, etc.)" } @{ Titulo = "[S] Sistema" Cor = $corDestaque Desc = "Ferramentas de manutencao e diagnostico em um so lugar:`n" + " - Hardware Detalhado: CPU, RAM (slots/tipo/freq), GPU, SSD/HD com uso por particao`n" + " - Configurar DNS: 20 servidores (Google, Cloudflare, AdGuard anti-AD, Quad9...)`n" + " - SFC /scannow e DISM RestoreHealth para reparar o sistema`n" + " - Resetar TCP/IP, Flush DNS, Reiniciar Explorer`n" + " - Exportar relatorio de hardware em .TXT para a Area de Trabalho" } @{ Titulo = "[M] Microsoft — Ativacao" Cor = [System.Drawing.Color]::FromArgb(0,164,239) Desc = "Microsoft Activation Scripts (MAS - massgrave.dev).`n" + " - Menu Microsoft protegido por senha local`n" + " - Downloads do Office nos servidores Microsoft" } ) $yCard = 130 foreach ($f in $funcoes) { $pnlCard = New-Object System.Windows.Forms.Panel $pnlCard.Location = New-Object System.Drawing.Point(16, $yCard) $pnlCard.Size = New-Object System.Drawing.Size(760, 132) $pnlCard.BackColor = $corPainel $acCard = New-Object System.Windows.Forms.Panel $acCard.Location = New-Object System.Drawing.Point(0, 0); $acCard.Size = New-Object System.Drawing.Size(4, 132); $acCard.BackColor = $f.Cor $pnlCard.Controls.Add($acCard) $lblCardTit = New-Object System.Windows.Forms.Label $lblCardTit.Text = $f.Titulo $lblCardTit.Font = New-Object System.Drawing.Font("Segoe UI", 10, [System.Drawing.FontStyle]::Bold) $lblCardTit.ForeColor = $f.Cor $lblCardTit.Location = New-Object System.Drawing.Point(14, 8); $lblCardTit.AutoSize = $true $pnlCard.Controls.Add($lblCardTit) $lblCardDesc = New-Object System.Windows.Forms.Label $lblCardDesc.Text = $f.Desc $lblCardDesc.Font = New-Object System.Drawing.Font("Segoe UI", 8.5) $lblCardDesc.ForeColor = $corTextoEscuro $lblCardDesc.Location = New-Object System.Drawing.Point(14, 30) $lblCardDesc.Size = New-Object System.Drawing.Size(736, 96) $pnlCard.Controls.Add($lblCardDesc) $pnlHomeScroll.Controls.Add($pnlCard) $yCard += 142 } # Nota de rodape da home $lblHomeNota = New-Object System.Windows.Forms.Label $lblHomeNota.Text = "Use o menu lateral para navegar entre as funcoes. Todas as operacoes sao executadas como Administrador." $lblHomeNota.Font = New-Object System.Drawing.Font("Segoe UI", 8) $lblHomeNota.ForeColor = $corTextoEscuro $lblHomeNota.Location = New-Object System.Drawing.Point(16, ($yCard + 8)) $lblHomeNota.AutoSize = $true $pnlHomeScroll.Controls.Add($lblHomeNota) $pHome.Controls.Add($pnlHomeScroll) # ═══════════════════════════════════════════════════════════ # ABA 1 — INSTALAR # ═══════════════════════════════════════════════════════════ $pInst = $tabPanels[1] # ── Toolbar superior ────────────────────────────────────── $pnlInstTop = New-Object System.Windows.Forms.Panel $pnlInstTop.Dock = "Top"; $pnlInstTop.Height = 44; $pnlInstTop.BackColor = $corPainel $lblBusca = New-Object System.Windows.Forms.Label $lblBusca.Text = "Buscar:"; $lblBusca.Location = New-Object System.Drawing.Point(8,14) $lblBusca.AutoSize = $true; $lblBusca.ForeColor = $corTextoEscuro $txtBusca = New-Object System.Windows.Forms.TextBox $txtBusca.Location = New-Object System.Drawing.Point(60,10); $txtBusca.Size = New-Object System.Drawing.Size(190,24) $txtBusca.BackColor = $corBorda; $txtBusca.ForeColor = $corTextoClaro; $txtBusca.BorderStyle = "FixedSingle" $btnDeselInst = New-Object System.Windows.Forms.Button $btnDeselInst.Text = "Limpar Selecao"; $btnDeselInst.Location = New-Object System.Drawing.Point(258,8); $btnDeselInst.Size = New-Object System.Drawing.Size(120,28) $btnDeselInst.BackColor = $corBorda; $btnDeselInst.ForeColor = $corTextoClaro; $btnDeselInst.FlatStyle = "Flat"; $btnDeselInst.FlatAppearance.BorderSize = 0 $script:lblContador = New-Object System.Windows.Forms.Label $script:lblContador.Text = "0 selecionados"; $script:lblContador.Location = New-Object System.Drawing.Point(386,14) $script:lblContador.AutoSize = $true; $script:lblContador.ForeColor = $corAmarelo $script:lblContador.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $pnlInstTop.Controls.AddRange(@($lblBusca,$txtBusca,$btnDeselInst,$script:lblContador)) # ── Scroll principal ────────────────────────────────────── $pnlInstScroll = New-Object System.Windows.Forms.Panel $pnlInstScroll.Dock = "Fill" $pnlInstScroll.BackColor = $corFundo $pnlInstScroll.AutoScroll = $true $script:instGrupos = @{} $script:instSelecionados = @{} # Cores por categoria $catCores = @{ "Navegadores" = [System.Drawing.Color]::FromArgb(0, 122, 204) "Midia" = [System.Drawing.Color]::FromArgb(168, 85, 247) "Utilitarios" = [System.Drawing.Color]::FromArgb(35, 197, 120) "Dev" = [System.Drawing.Color]::FromArgb(255,189, 46) "Remoto" = [System.Drawing.Color]::FromArgb(0, 164, 239) "Seguranca" = [System.Drawing.Color]::FromArgb(248, 81, 73) "Criacao" = [System.Drawing.Color]::FromArgb(236, 72, 153) "Comunicacao" = [System.Drawing.Color]::FromArgb(52, 211, 153) } function Atualizar-ContadorInst { $total = $script:instSelecionados.Count $script:lblContador.Text = if ($total -gt 0) { "$total selecionado(s)" } else { "0 selecionados" } $script:lblContador.ForeColor = if ($total -gt 0) { $corVerde } else { $corAmarelo } } function Construir-Blocos { param([string]$filtro = "") foreach ($control in @($pnlInstScroll.Controls)) { $control.Dispose() } $pnlInstScroll.Controls.Clear() $script:instGrupos = @{} $ordem = @("Navegadores","Utilitarios","Dev","Remoto","Seguranca","Midia","Criacao","Comunicacao") $porCat = @{} foreach ($p in $programas) { if (-not $porCat.ContainsKey($p.Cat)) { $porCat[$p.Cat] = [System.Collections.ArrayList]@() } $porCat[$p.Cat].Add($p) | Out-Null } $largura = 368 $col = 0 $yPos = 10 $alturaCol0 = 0 foreach ($cat in $ordem) { if (-not $porCat.ContainsKey($cat)) { continue } $itens = if ($filtro) { @($porCat[$cat] | Where-Object { $_.Nome -like "*$filtro*" }) } else { @($porCat[$cat]) } if ($itens.Count -eq 0) { continue } $corCat = if ($catCores.ContainsKey($cat)) { $catCores[$cat] } else { $corDestaque } $alturaCLB = $itens.Count * 22 $alturaBloco = 3 + 28 + $alturaCLB + 6 # barra + header + lista + padding $xPos = if ($col -eq 0) { 10 } else { 390 } $pnlBloco = New-Object System.Windows.Forms.Panel $pnlBloco.Location = New-Object System.Drawing.Point($xPos, $yPos) $pnlBloco.Size = New-Object System.Drawing.Size($largura, $alturaBloco) $pnlBloco.BackColor = $corPainel # Barra colorida no topo $barTopo = New-Object System.Windows.Forms.Panel $barTopo.Location = New-Object System.Drawing.Point(0,0) $barTopo.Size = New-Object System.Drawing.Size($largura, 3) $barTopo.BackColor = $corCat $pnlBloco.Controls.Add($barTopo) # Label da categoria (SEM checkbox) $lblCat = New-Object System.Windows.Forms.Label $lblCat.Text = $cat $lblCat.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $lblCat.ForeColor = $corCat $lblCat.BackColor = $corPainel $lblCat.Location = New-Object System.Drawing.Point(10, 6) $lblCat.AutoSize = $true $pnlBloco.Controls.Add($lblCat) # Botão "Sel. todos" discreto ao lado direito $btnSelCat = New-Object System.Windows.Forms.Button $btnSelCat.Text = "sel. todos" $btnSelCat.Font = New-Object System.Drawing.Font("Segoe UI",7) $btnSelCat.ForeColor = $corTextoEscuro $btnSelCat.BackColor = $corPainel $btnSelCat.FlatStyle = "Flat" $btnSelCat.FlatAppearance.BorderSize = 0 $btnSelCat.FlatAppearance.MouseOverBackColor = $corBorda $btnSelCat.Location = New-Object System.Drawing.Point(300, 8) $btnSelCat.Size = New-Object System.Drawing.Size(62, 16) $btnSelCat.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlBloco.Controls.Add($btnSelCat) # CheckedListBox dos programas $clb = New-Object System.Windows.Forms.CheckedListBox $clb.Location = New-Object System.Drawing.Point(6, 31) $clb.Size = New-Object System.Drawing.Size(356, $alturaCLB) $clb.BackColor = $corPainel $clb.ForeColor = $corTextoClaro $clb.BorderStyle = "None" $clb.CheckOnClick = $true $clb.Font = New-Object System.Drawing.Font("Segoe UI",9) $clb.IntegralHeight = $false $clb.Tag = $cat foreach ($p in $itens) { $clb.Items.Add($p.Nome, $script:instSelecionados.ContainsKey($p.Nome)) | Out-Null } $pnlBloco.Controls.Add($clb) $script:instGrupos[$cat] = @{ CLB=$clb; Programas=$itens } # Sel. todos via botão (sem timer, sem event recursivo) $btnSelCat.Tag = $clb $btnSelCat.add_Click({ param($sender, $eventArgs) $list = $sender.Tag for ($i = 0; $i -lt $list.Items.Count; $i++) { $list.SetItemChecked($i, $true) } }) $clb.add_ItemCheck({ param($sender, $eventArgs) $name = [string]$sender.Items[$eventArgs.Index] if ($eventArgs.NewValue -eq [System.Windows.Forms.CheckState]::Checked) { $script:instSelecionados[$name] = $true } else { $script:instSelecionados.Remove($name) } Atualizar-ContadorInst }) $pnlInstScroll.Controls.Add($pnlBloco) # Controle de posição em 2 colunas if ($col -eq 0) { $alturaCol0 = $alturaBloco $col = 1 } else { $maxH = [Math]::Max($alturaCol0, $alturaBloco) $yPos += $maxH + 10 $col = 0 $alturaCol0 = 0 } } # Se terminou em coluna ímpar, avançar Y if ($col -eq 1) { $yPos += $alturaCol0 + 10 } Atualizar-ContadorInst } Construir-Blocos $txtBusca.add_TextChanged({ Construir-Blocos -filtro $txtBusca.Text }) $btnDeselInst.add_Click({ $script:instSelecionados.Clear() foreach ($cat in $script:instGrupos.Keys) { $clb = $script:instGrupos[$cat].CLB for ($i = 0; $i -lt $clb.Items.Count; $i++) { $clb.SetItemChecked($i, $false) } } Atualizar-ContadorInst }) # ── Botão Instalar ──────────────────────────────────────── $btnInst = New-Object System.Windows.Forms.Button $btnInst.Text = " Instalar Selecionados" $btnInst.Dock = "Bottom"; $btnInst.Height = 44 $btnInst.BackColor = $corDestaque; $btnInst.ForeColor = $corTextoClaro $btnInst.FlatStyle = "Flat"; $btnInst.FlatAppearance.BorderSize = 0 $btnInst.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $script:btnInst = $btnInst $btnInst.add_Click({ $lista = @($programas | Where-Object { $script:instSelecionados.ContainsKey($_.Nome) }) if ($lista.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione ao menos um programa.","Atencao","OK","Warning") | Out-Null return } if (-not (Get-Command winget -ErrorAction SilentlyContinue)) { Escrever-Log 'Winget nao encontrado. Instale o App Installer antes de continuar.' 'ERRO' return } $total = $lista.Count $script:btnInst.Enabled = $false $script:btnInst.Text = "Instalando... (0/$total)" Rodar-Async -Vars @{lista=$lista;totalInst=$total} -Bloco { $n=0 foreach ($p in $lista) { Publicar-Progresso "Instalando $($n+1)/$totalInst`: $($p.Nome)" try { $oldPreference=$ErrorActionPreference $ErrorActionPreference='Continue' $output = & winget install --id $p.Winget --exact --silent --disable-interactivity --accept-package-agreements --accept-source-agreements 2>&1 $code=$LASTEXITCODE; $ErrorActionPreference=$oldPreference; $status=Get-WingetResult $code $detail=($output | Out-String).Trim() Escrever-Log "$($p.Nome): $status (codigo $code). $detail" $(if($status -eq 'Falhou'){'ERRO'}else{'INFO'}) [pscustomobject]@{Item=$p.Nome; Resultado=$status; Codigo=$code; Detalhes=$detail} } catch { $ErrorActionPreference=$oldPreference Escrever-Log "$($p.Nome): falhou. $($_.Exception.Message)" 'ERRO' [pscustomobject]@{Item=$p.Nome; Resultado='Falhou'; Codigo=''; Detalhes=$_.Exception.Message} } $n++; Publicar-Progresso "$n/$totalInst processados" } } -AoProgresso { param($text) $script:btnInst.Text=$text } -AoFinalizar { param($resultado,$falha) $script:btnInst.Enabled=$true; $script:btnInst.Text=' Instalar Selecionados' if ($resultado.Count) { Mostrar-Resultados @($resultado) 'Instalacao de programas' } Atualizar-ContadorInst } }) $pInst.Controls.Add($pnlInstScroll) $pInst.Controls.Add($pnlInstTop) $pInst.Controls.Add($btnInst) # ═══════════════════════════════════════════════════════════ # FUNCAO REUTILIZAVEL — Blocos por categoria (Bloatware e Tweaks) # ═══════════════════════════════════════════════════════════ function Criar-AbaBlocos { param( [System.Windows.Forms.Panel]$PainelAba, [array]$Itens, [hashtable]$CatCores, [string[]]$OrdemCats, [string]$TextoBotao, [System.Drawing.Color]$CorBotao, [scriptblock]$AcaoBotao ) # ── Toolbar ─────────────────────────────────────────── $pnlTop = New-Object System.Windows.Forms.Panel $pnlTop.Dock = "Top"; $pnlTop.Height = 44; $pnlTop.BackColor = $corPainel $btnLimpar = New-Object System.Windows.Forms.Button $btnLimpar.Text = "Limpar Selecao" $btnLimpar.Location = New-Object System.Drawing.Point(8,8); $btnLimpar.Size = New-Object System.Drawing.Size(120,28) $btnLimpar.BackColor = $corBorda; $btnLimpar.ForeColor = $corTextoClaro $btnLimpar.FlatStyle = "Flat"; $btnLimpar.FlatAppearance.BorderSize = 0 $lblCont = New-Object System.Windows.Forms.Label $lblCont.Text = "0 selecionados" $lblCont.Location = New-Object System.Drawing.Point(138,14); $lblCont.AutoSize = $true $lblCont.ForeColor = $corAmarelo $lblCont.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $pnlTop.Controls.AddRange(@($btnLimpar,$lblCont)) # ── FlowLayoutPanel para os blocos ──────────────────── $flow = New-Object System.Windows.Forms.FlowLayoutPanel $flow.Dock = "Fill" $flow.BackColor = $corFundo $flow.AutoScroll = $true $flow.FlowDirection = "LeftToRight" $flow.WrapContents = $true $flow.Padding = New-Object System.Windows.Forms.Padding(8, 8, 8, 8) # ── Agrupar itens por categoria ─────────────────────── $porCat = @{} foreach ($it in $Itens) { if (-not $porCat.ContainsKey($it.Cat)) { $porCat[$it.Cat] = [System.Collections.ArrayList]@() } $porCat[$it.Cat].Add($it) | Out-Null } # Dicionario de CLBs: cat -> CLB (para leitura no botao) $mapCLB = [System.Collections.Hashtable]::new() $mapItens = [System.Collections.Hashtable]::new() foreach ($cat in $OrdemCats) { if (-not $porCat.ContainsKey($cat)) { continue } $itensBloco = @($porCat[$cat]) if ($itensBloco.Count -eq 0) { continue } $corCat = if ($CatCores.ContainsKey($cat)) { $CatCores[$cat] } else { $corDestaque } $alturaCLB = $itensBloco.Count * 22 $altBloco = 3 + 30 + $alturaCLB + 8 $largBloco = 370 # Painel do bloco $pnlB = New-Object System.Windows.Forms.Panel $pnlB.Size = New-Object System.Drawing.Size($largBloco, $altBloco) $pnlB.BackColor = $corPainel $pnlB.Margin = New-Object System.Windows.Forms.Padding(4) $bar = New-Object System.Windows.Forms.Panel $bar.Location = New-Object System.Drawing.Point(0,0) $bar.Size = New-Object System.Drawing.Size($largBloco, 3) $bar.BackColor= $corCat $pnlB.Controls.Add($bar) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $cat $lblTit.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $corCat; $lblTit.BackColor = $corPainel $lblTit.Location = New-Object System.Drawing.Point(10,7); $lblTit.AutoSize = $true $pnlB.Controls.Add($lblTit) $btnSel = New-Object System.Windows.Forms.Button $btnSel.Text = "sel. todos" $btnSel.Font = New-Object System.Drawing.Font("Segoe UI",7) $btnSel.ForeColor = $corTextoEscuro; $btnSel.BackColor = $corPainel $btnSel.FlatStyle = "Flat"; $btnSel.FlatAppearance.BorderSize = 0 $btnSel.FlatAppearance.MouseOverBackColor = $corBorda $btnSel.Location = New-Object System.Drawing.Point(300, 9) $btnSel.Size = New-Object System.Drawing.Size(64, 16) $btnSel.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlB.Controls.Add($btnSel) $clb = New-Object System.Windows.Forms.CheckedListBox $clb.Location = New-Object System.Drawing.Point(6, 33) $clb.Size = New-Object System.Drawing.Size(358, $alturaCLB) $clb.BackColor = $corPainel; $clb.ForeColor = $corTextoClaro $clb.BorderStyle = "None"; $clb.CheckOnClick = $true $clb.Font = New-Object System.Drawing.Font("Segoe UI",9) $clb.IntegralHeight = $false foreach ($it in $itensBloco) { $clb.Items.Add($it.Nome) | Out-Null } $pnlB.Controls.Add($clb) $clb.Tag = @{ Lists=$mapCLB; Label=$lblCont } $clb.add_ItemCheck({ param($sender, $eventArgs) $count = 0 foreach ($list in $sender.Tag.Lists.Values) { $count += $list.CheckedItems.Count } if ($sender.GetItemChecked($eventArgs.Index)) { $count-- } if ($eventArgs.NewValue -ne [System.Windows.Forms.CheckState]::Unchecked) { $count++ } $sender.Tag.Label.Text = "$count selecionado(s)" }) $mapCLB[$cat] = $clb $mapItens[$cat] = $itensBloco # sel. todos — capturar clb por valor com GetNewClosure $clbCapt = $clb $btnSel.add_Click({ for ($i=0;$i -lt $clbCapt.Items.Count;$i++) { $clbCapt.SetItemChecked($i,$true) } }.GetNewClosure()) $flow.Controls.Add($pnlB) } # ── Botão de ação ───────────────────────────────────── $btnAcao = New-Object System.Windows.Forms.Button $btnAcao.Text = $TextoBotao; $btnAcao.Dock = "Bottom"; $btnAcao.Height = 44 $btnAcao.BackColor = $CorBotao $btnAcao.ForeColor = if ($CorBotao.R -lt 200 -or $CorBotao.G -gt 150) { $corFundo } else { $corTextoClaro } $btnAcao.FlatStyle = "Flat"; $btnAcao.FlatAppearance.BorderSize = 0 $btnAcao.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) # Capturar mapas por valor para os handlers $mapCLBCapt = $mapCLB $mapItensCapt = $mapItens $lblContCapt = $lblCont $acaoCapt = $AcaoBotao $corVerdeCapt = $corVerde $corAmarCapt = $corAmarelo $btnLimpar.add_Click({ foreach ($c in $mapCLBCapt.Values) { for ($i=0;$i -lt $c.Items.Count;$i++) { $c.SetItemChecked($i,$false) } } $lblContCapt.Text = "0 selecionados"; $lblContCapt.ForeColor = $corAmarCapt }.GetNewClosure()) $btnAcao.add_Click({ $lista = [System.Collections.ArrayList]@() foreach ($cat in $mapCLBCapt.Keys) { $c = $mapCLBCapt[$cat] $itns = $mapItensCapt[$cat] for ($i=0;$i -lt $c.Items.Count;$i++) { if ($c.GetItemChecked($i)) { $lista.Add($itns[$i].Dados) | Out-Null } } } if ($lista.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione ao menos um item.","Atencao","OK","Warning") | Out-Null return } & $acaoCapt $lista }.GetNewClosure()) $PainelAba.Controls.Add($flow) $PainelAba.Controls.Add($pnlTop) $PainelAba.Controls.Add($btnAcao) return @{ MapCLB=$mapCLB; MapItens=$mapItens; BtnAcao=$btnAcao; LblCont=$lblCont } } # ═══════════════════════════════════════════════════════════ # ABA 2 — BLOATWARE (blocos por risco) # ═══════════════════════════════════════════════════════════ $pDeb = $tabPanels[2] $bloatItens = $bloatware | ForEach-Object { $cat = switch($_.Risco) { "Baixo" { "OK - Seguro Remover" } "Medio" { "Medio - Remover com Cuidado" } "Alto" { "Agressivo - Alto Impacto" } } [PSCustomObject]@{ Nome=$_.Nome; Cat=$cat; Dados=$_ } } $bloatCores = @{ "OK - Seguro Remover" = $corVerde "Medio - Remover com Cuidado" = $corAmarelo "Agressivo - Alto Impacto" = $corVermelho } $bloatOrdem = @("OK - Seguro Remover","Medio - Remover com Cuidado","Agressivo - Alto Impacto") $script:btnRem = $null $debResult = Criar-AbaBlocos -PainelAba $pDeb -Itens $bloatItens -CatCores $bloatCores -OrdemCats $bloatOrdem ` -TextoBotao " Remover Selecionados" -CorBotao $corVermelho -AcaoBotao { param($lista) $total = $lista.Count $conf = [System.Windows.Forms.MessageBox]::Show( "Remover $total item(ns) selecionado(s)?`nEssa acao e dificil de desfazer.", "Confirmar Remocao","YesNo","Warning") if ($conf -ne "Yes") { return } $script:btnRem.Enabled = $false; $script:btnRem.Text = "Removendo..." Rodar-Async -Vars @{lista=$lista} -Bloco { foreach ($b in $lista) { Escrever-Log "Removendo: $($b.Nome)..." try { if ($b.Pkg -eq "OneDrive") { Get-Process "OneDrive" -EA SilentlyContinue | Stop-Process -Force $setup = @("$env:LOCALAPPDATA\Microsoft\OneDrive\OneDriveSetup.exe", "$env:SYSTEMROOT\SysWOW64\OneDriveSetup.exe", "$env:SYSTEMROOT\System32\OneDriveSetup.exe") | Where-Object { Test-Path -LiteralPath $_ } | Select-Object -First 1 if (-not $setup) { throw 'Desinstalador do OneDrive nao encontrado.' } $process = Start-Process -FilePath $setup -ArgumentList '/uninstall' -Wait -PassThru -WindowStyle Hidden -ErrorAction Stop if ($process.ExitCode -ne 0) { throw "Desinstalador retornou $($process.ExitCode)." } Escrever-Log 'Desinstalador do OneDrive concluido.' 'OK'; [pscustomobject]@{Item=$b.Nome;Resultado='Concluido';Detalhes='Desinstalador encerrado sem erro.'}; continue } $packages = @(Get-AppxPackage -Name $b.Pkg -AllUsers -ErrorAction Stop) $provisioned = @(Get-AppxProvisionedPackage -Online -ErrorAction Stop | Where-Object { $_.DisplayName -eq $b.Pkg }) if (-not $packages.Count -and -not $provisioned.Count) { Escrever-Log "$($b.Nome) nao esta instalado." 'INFO'; [pscustomobject]@{Item=$b.Nome;Resultado='Ausente';Detalhes='Nenhum pacote encontrado.'}; continue } $packages | Remove-AppxPackage -AllUsers -ErrorAction Stop $provisioned | Remove-AppxProvisionedPackage -Online -ErrorAction Stop | Out-Null Escrever-Log "$($b.Nome) removido!" "OK" [pscustomobject]@{Item=$b.Nome;Resultado='Concluido';Detalhes='Pacotes removidos.'} } catch { Escrever-Log "Aviso ($($b.Nome)): $_" "AVISO"; [pscustomobject]@{Item=$b.Nome;Resultado='Falhou ou parcial';Detalhes=$_.Exception.Message} } } Escrever-Log "=== Debloat finalizado. Consulte os resultados de cada item. ===" "INFO" } -AoFinalizar { param($results,$failure) $script:btnRem.Enabled=$true; $script:btnRem.Text=" Remover Selecionados"; if ($results.Count) { Mostrar-Resultados @($results) 'Remocao de aplicativos' } } } $script:btnRem = $debResult.BtnAcao # ═══════════════════════════════════════════════════════════ # ABA 3 — TWEAKS + SERVICOS (blocos por categoria) # ═══════════════════════════════════════════════════════════ $pTwk = $tabPanels[3] $tweakItens = $tweaks | ForEach-Object { [PSCustomObject]@{ Nome=$_.Nome; Cat=$_.Cat; Dados=$_ } } $tweakCores = @{ "Performance" = [System.Drawing.Color]::FromArgb(0, 122, 204) "Privacidade" = [System.Drawing.Color]::FromArgb(168, 85, 247) "Interface" = [System.Drawing.Color]::FromArgb(35, 197, 120) "Servicos" = [System.Drawing.Color]::FromArgb(255, 189, 46) } $tweakOrdem = @("Performance","Privacidade","Interface","Servicos") $script:btnApl = $null $twkResult = Criar-AbaBlocos -PainelAba $pTwk -Itens $tweakItens -CatCores $tweakCores -OrdemCats $tweakOrdem ` -TextoBotao " Aplicar Selecionados" -CorBotao $corAmarelo -AcaoBotao { param($lista) $items=@($lista) $infos=@($items | ForEach-Object { Get-TweakInfo $_ }) Mostrar-Resultados @($infos | Select-Object Nome,Compatibilidade,Estado,Impacto,Reinicio,Reversivel) 'Revise os ajustes selecionados' if ([Windows.Forms.MessageBox]::Show('Aplicar os ajustes compativeis listados? O historico guarda as alteracoes reversiveis. Exclusoes, hibernacao e NTFS nao possuem desfazer automatico.', 'Aplicar ajustes', 'YesNo', 'Question') -ne 'Yes') { return } $script:btnApl.Enabled=$false; $script:btnApl.Text='Aplicando...' Rodar-Async -Vars @{items=$items} -Bloco { Invoke-TweakBatch $items } -AoFinalizar { param($results,$failure) $script:btnApl.Enabled=$true; $script:btnApl.Text=' Aplicar Selecionados' if ($results.Count) { Mostrar-Resultados @($results) 'Resultado por ajuste' } } } $script:btnApl = $twkResult.BtnAcao # ═══════════════════════════════════════════════════════════ # ABA 3 — SISTEMA # ═══════════════════════════════════════════════════════════ $pSis = $tabPanels[4] $pnlSisScroll = New-Object System.Windows.Forms.Panel $pnlSisScroll.Dock="Fill";$pnlSisScroll.BackColor=$corFundo;$pnlSisScroll.AutoScroll=$true $sisAcoes = @( @{Txt="Hardware Detalhado"; Desc="CPU, RAM, slots, placa-mae, SSD/HD — tudo detalhado"; Cor=$corVerde; Cmd="hwinfo" } @{Txt="Configurar DNS"; Desc="Define DNS nos adaptadores: Google, Cloudflare, anti-AD e mais"; Cor=$corVerde; Cmd="dnsconf" } @{Txt="Limpeza de Disco"; Desc="Executa cleanmgr com todas as opcoes"; Cor=$corDestaque; Cmd="cleanmgr" } @{Txt="SFC /scannow"; Desc="Verifica e repara arquivos do sistema"; Cor=$corAmarelo; Cmd="sfc" } @{Txt="DISM RestoreHealth"; Desc="Repara imagem do Windows (pode demorar)"; Cor=$corAmarelo; Cmd="dism" } @{Txt="Resetar TCP/IP"; Desc="Reseta Winsock, DNS e pilha de rede"; Cor=$corDestaque; Cmd="tcp" } @{Txt="Flush DNS"; Desc="Limpa cache DNS do sistema"; Cor=$corBorda; Cmd="dns" } @{Txt="Reiniciar Explorer"; Desc="Reinicia o Explorer sem reiniciar o PC"; Cor=$corBorda; Cmd="exp" } @{Txt="Gerenc. de Tarefas"; Desc="Abre o Gerenciador de Tarefas"; Cor=$corBorda; Cmd="taskmgr" } @{Txt="Gerenc. de Disco"; Desc="Abre o Gerenciamento de Disco"; Cor=$corBorda; Cmd="diskmgmt"} @{Txt="Editor de Registro"; Desc="Abre o Regedit"; Cor=$corBorda; Cmd="regedit" } @{Txt="Windows Update"; Desc="Abre as configuracoes do Windows Update"; Cor=$corBorda; Cmd="wupd" } @{Txt="Informacoes (msinfo)";Desc="Abre msinfo32 com dados completos do sistema"; Cor=$corBorda; Cmd="info" } @{Txt="Reiniciar PC"; Desc="Reinicia o computador imediatamente"; Cor=$corVermelho; Cmd="reboot" } ) $y = 10 foreach ($a in $sisAcoes) { $pnl = New-Object System.Windows.Forms.Panel $pnl.Location=New-Object System.Drawing.Point(10,$y);$pnl.Size=New-Object System.Drawing.Size(720,52);$pnl.BackColor=$corPainel $btn = New-Object System.Windows.Forms.Button $btn.Text=$a.Txt;$btn.Location=New-Object System.Drawing.Point(0,0);$btn.Size=New-Object System.Drawing.Size(185,52) $btn.BackColor=$a.Cor;$btn.ForeColor=if($a.Cor -eq $corAmarelo){$corFundo}else{$corTextoClaro} $btn.FlatStyle="Flat";$btn.FlatAppearance.BorderSize=0;$btn.Font=New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold);$btn.Tag=$a.Cmd $lbl = New-Object System.Windows.Forms.Label $lbl.Text=$a.Desc;$lbl.Location=New-Object System.Drawing.Point(195,16);$lbl.Size=New-Object System.Drawing.Size(515,24);$lbl.ForeColor=$corTextoEscuro $btn.add_Click({ switch($this.Tag){ "hwinfo" { Mostrar-HardwareInfo } "dnsconf" { Mostrar-ConfigurarDNS } "cleanmgr" { Executar-Manutencao 'Limpeza de Disco' { $process=Start-Process cleanmgr.exe -ArgumentList '/sagerun:1' -Wait -PassThru -ErrorAction Stop; if($process.ExitCode -ne 0){throw "Cleanmgr retornou $($process.ExitCode)"}; 'Processo de limpeza encerrado.' } } "sfc" { Executar-Manutencao 'SFC' { Invoke-NativeChecked sfc.exe @('/scannow') } } "dism" { Executar-Manutencao 'DISM RestoreHealth' { Invoke-NativeChecked dism.exe @('/Online','/Cleanup-Image','/RestoreHealth','/NoRestart') -SuccessCodes @(0,3010) } } "tcp" { if ([Windows.Forms.MessageBox]::Show('Resetar a rede? Pode interromper conexoes e exige reinicio.','Reset de rede','YesNo','Warning') -eq 'Yes') { Executar-Manutencao 'Reset TCP/IP (reinicie o computador)' { Invoke-NativeChecked netsh @('winsock','reset'); Invoke-NativeChecked netsh @('int','ip','reset'); Invoke-NativeChecked ipconfig @('/flushdns') } } } "dns" { Executar-Manutencao 'Limpar cache DNS' { Invoke-NativeChecked ipconfig @('/flushdns') } } "exp" { Stop-Process -Name "explorer" -Force -EA SilentlyContinue;Start-Sleep 1;Start-Process "explorer";Escrever-Log "Explorer reiniciado!" "OK" } "taskmgr" { Start-Process "taskmgr" } "diskmgmt" { Start-Process "diskmgmt.msc" } "regedit" { Start-Process "regedit" -Verb RunAs } "wupd" { Start-Process "ms-settings:windowsupdate" } "info" { Start-Process "msinfo32" } "reboot" { $r=[System.Windows.Forms.MessageBox]::Show("Reiniciar agora?","Confirmar","YesNo","Warning");if($r -eq "Yes"){Restart-Computer -Force} } } }) $pnl.Controls.AddRange(@($btn,$lbl));$pnlSisScroll.Controls.Add($pnl);$y+=62 } $pSis.Controls.Add($pnlSisScroll) # ═══════════════════════════════════════════════════════════ # FUNCAO: JANELA DE CONFIGURACAO DE DNS # ═══════════════════════════════════════════════════════════ function Mostrar-ConfigurarDNS { Escrever-Log "Abrindo configurador de DNS..." # ── Tabela de servidores DNS ─────────────────────────── $dnsList = @( # Nome | Primario | Secundario | Categoria | Descricao [PSCustomObject]@{ Nome="Google Public DNS"; Pri="8.8.8.8"; Sec="8.8.4.4"; Cat="Geral"; Desc="Rapido e confiavel. Nao bloqueia nada." } [PSCustomObject]@{ Nome="Cloudflare DNS"; Pri="1.1.1.1"; Sec="1.0.0.1"; Cat="Geral"; Desc="Mais rapido do mundo (Cloudflare). Privacidade sem logs." } [PSCustomObject]@{ Nome="Cloudflare + WARP"; Pri="1.1.1.2"; Sec="1.0.0.2"; Cat="Seguranca"; Desc="Cloudflare — bloqueia malware." } [PSCustomObject]@{ Nome="Cloudflare Familia"; Pri="1.1.1.3"; Sec="1.0.0.3"; Cat="Familia"; Desc="Cloudflare — bloqueia malware e conteudo adulto." } [PSCustomObject]@{ Nome="OpenDNS Home"; Pri="208.67.222.222"; Sec="208.67.220.220"; Cat="Seguranca"; Desc="Cisco OpenDNS — bloqueia phishing e malware." } [PSCustomObject]@{ Nome="OpenDNS FamilyShield"; Pri="208.67.222.123"; Sec="208.67.220.123"; Cat="Familia"; Desc="Cisco — bloqueia conteudo adulto automaticamente." } [PSCustomObject]@{ Nome="Quad9 (Seguro)"; Pri="9.9.9.9"; Sec="149.112.112.112"; Cat="Seguranca"; Desc="Bloqueia dominios maliciosos. Sem rastreamento." } [PSCustomObject]@{ Nome="Quad9 + EDNS"; Pri="9.9.9.11"; Sec="149.112.112.11"; Cat="Seguranca"; Desc="Quad9 com suporte a EDNS Client Subnet." } [PSCustomObject]@{ Nome="AdGuard DNS"; Pri="94.140.14.14"; Sec="94.140.15.15"; Cat="Anti-Anuncio";Desc="Bloqueia anuncios, trackers e malware em toda a rede." } [PSCustomObject]@{ Nome="AdGuard Familia"; Pri="94.140.14.15"; Sec="94.140.15.16"; Cat="Familia"; Desc="AdGuard + bloqueio de conteudo adulto." } [PSCustomObject]@{ Nome="NextDNS"; Pri="45.90.28.0"; Sec="45.90.30.0"; Cat="Anti-Anuncio";Desc="DNS configuravel. Bloqueia ADs, trackers e mais." } [PSCustomObject]@{ Nome="Control D (Anuncios)"; Pri="76.76.2.2"; Sec="76.76.10.2"; Cat="Anti-Anuncio";Desc="ControlD — bloqueia anuncios e trackers." } [PSCustomObject]@{ Nome="DNS.Watch"; Pri="84.200.69.80"; Sec="84.200.70.40"; Cat="Privacidade"; Desc="Sem logs, sem filtragem, neutro e privado." } [PSCustomObject]@{ Nome="Comodo Secure DNS"; Pri="8.26.56.26"; Sec="8.20.247.20"; Cat="Seguranca"; Desc="Comodo — bloqueia malware e phishing." } [PSCustomObject]@{ Nome="Level3 DNS"; Pri="209.244.0.3"; Sec="209.244.0.4"; Cat="Geral"; Desc="DNS corporativo rapido. Sem filtragem." } [PSCustomObject]@{ Nome="Verisign Public DNS"; Pri="64.6.64.6"; Sec="64.6.65.6"; Cat="Geral"; Desc="Verisign — estavel, privado, sem redirecionamentos." } [PSCustomObject]@{ Nome="CleanBrowsing (Adultos)"; Pri="185.228.168.168"; Sec="185.228.169.168"; Cat="Familia"; Desc="Bloqueia conteudo adulto e sites suspeitos." } [PSCustomObject]@{ Nome="CleanBrowsing (Seguranca)"; Pri="185.228.168.9"; Sec="185.228.169.9"; Cat="Seguranca"; Desc="Bloqueia malware, phishing e botnets." } [PSCustomObject]@{ Nome="Alternativo DNS (Anti-AD)"; Pri="76.76.19.19"; Sec="76.223.122.150"; Cat="Anti-Anuncio";Desc="Bloqueia anuncios sem necessidade de extensao." } [PSCustomObject]@{ Nome="AUTOMATICO (DHCP)"; Pri=""; Sec=""; Cat="Sistema"; Desc="Remove DNS fixo. Volta a usar o DNS do roteador/DHCP." } ) $frmDNS = New-Object System.Windows.Forms.Form $frmDNS.Text = "VicTool — Configurar DNS" $frmDNS.Size = New-Object System.Drawing.Size(900, 680) $frmDNS.StartPosition = "CenterScreen" $frmDNS.BackColor = $corFundo $frmDNS.ForeColor = $corTexto $frmDNS.Font = New-Object System.Drawing.Font("Segoe UI", 9) $frmDNS.Icon = Criar-Icone # Header $pnlDNSHdr = New-Object System.Windows.Forms.Panel $pnlDNSHdr.Dock = "Top"; $pnlDNSHdr.Height = 56; $pnlDNSHdr.BackColor = $corPainel $pnlAccDNS = New-Object System.Windows.Forms.Panel $pnlAccDNS.Dock = "Top"; $pnlAccDNS.Height = 3; $pnlAccDNS.BackColor = $corVerde $lblDNSTit = New-Object System.Windows.Forms.Label $lblDNSTit.Text = "Configurar DNS"; $lblDNSTit.Font = New-Object System.Drawing.Font("Segoe UI",15,[System.Drawing.FontStyle]::Bold) $lblDNSTit.ForeColor = $corVerde; $lblDNSTit.Location = New-Object System.Drawing.Point(16,10); $lblDNSTit.AutoSize = $true $lblDNSSub = New-Object System.Windows.Forms.Label $lblDNSSub.Text = "Selecione um servidor DNS e o adaptador de rede. A mudanca e aplicada imediatamente." $lblDNSSub.ForeColor = $corTextoEscuro; $lblDNSSub.Location = New-Object System.Drawing.Point(18,36); $lblDNSSub.AutoSize = $true $pnlDNSHdr.Controls.AddRange(@($lblDNSTit,$lblDNSSub)) $frmDNS.Controls.Add($pnlAccDNS) $frmDNS.Controls.Add($pnlDNSHdr) # Layout: lista DNS (esquerda) | detalhe + adaptadores (direita) $pnlDNSBody = New-Object System.Windows.Forms.Panel $pnlDNSBody.Location = New-Object System.Drawing.Point(0, 59) $pnlDNSBody.Size = New-Object System.Drawing.Size(900, 580) $pnlDNSBody.Anchor = "Top,Left,Bottom,Right" $pnlDNSBody.BackColor= $corFundo $frmDNS.Controls.Add($pnlDNSBody) # ── Lista de DNS (esquerda) ──────────────────────────── $pnlDNSLeft = New-Object System.Windows.Forms.Panel $pnlDNSLeft.Location = New-Object System.Drawing.Point(0, 0) $pnlDNSLeft.Size = New-Object System.Drawing.Size(310, 580) $pnlDNSLeft.Anchor = "Top,Left,Bottom" $pnlDNSLeft.BackColor = $corPainel $pnlDNSBody.Controls.Add($pnlDNSLeft) $sepDNS = New-Object System.Windows.Forms.Panel $sepDNS.Location = New-Object System.Drawing.Point(310,0); $sepDNS.Size = New-Object System.Drawing.Size(1,580) $sepDNS.Anchor = "Top,Left,Bottom"; $sepDNS.BackColor = $corBorda $pnlDNSBody.Controls.Add($sepDNS) # Filtro por categoria $pnlDNSFiltro = New-Object System.Windows.Forms.Panel $pnlDNSFiltro.Location = New-Object System.Drawing.Point(0, 0) $pnlDNSFiltro.Size = New-Object System.Drawing.Size(310, 38) $pnlDNSFiltro.Anchor = "Top,Left,Right" $pnlDNSFiltro.BackColor = $corFundo $lblDNSCat = New-Object System.Windows.Forms.Label $lblDNSCat.Text = "Filtrar:"; $lblDNSCat.Location = New-Object System.Drawing.Point(8,11); $lblDNSCat.AutoSize = $true; $lblDNSCat.ForeColor = $corTextoEscuro $cmbDNSCat = New-Object System.Windows.Forms.ComboBox $cmbDNSCat.Location = New-Object System.Drawing.Point(54,7); $cmbDNSCat.Size = New-Object System.Drawing.Size(245,24) $cmbDNSCat.BackColor = $corBorda; $cmbDNSCat.ForeColor = $corTextoClaro $cmbDNSCat.FlatStyle = "Flat"; $cmbDNSCat.DropDownStyle = "DropDownList" @("Todos","Geral","Seguranca","Anti-Anuncio","Familia","Privacidade","Sistema") | ForEach-Object { $cmbDNSCat.Items.Add($_) | Out-Null } $cmbDNSCat.SelectedIndex = 0 $pnlDNSFiltro.Controls.AddRange(@($lblDNSCat,$cmbDNSCat)) $pnlDNSLeft.Controls.Add($pnlDNSFiltro) # ListBox abaixo do filtro, com posicao fixa $lbDNS = New-Object System.Windows.Forms.ListBox $lbDNS.Location = New-Object System.Drawing.Point(0, 38) $lbDNS.Size = New-Object System.Drawing.Size(310, 542) $lbDNS.Anchor = "Top,Left,Bottom" $lbDNS.BackColor = $corPainel; $lbDNS.ForeColor = $corTextoClaro $lbDNS.BorderStyle = "None"; $lbDNS.Font = New-Object System.Drawing.Font("Segoe UI",9) $lbDNS.ItemHeight = 22 $pnlDNSLeft.Controls.Add($lbDNS) # Mapa índice visível -> entrada na $dnsList $script:dnsMap = @{} function RefreshDNSList { param([string]$cat = "Todos") $lbDNS.Items.Clear() $script:dnsMap = @{} $j = 0 for ($i = 0; $i -lt $dnsList.Count; $i++) { $d = $dnsList[$i] if ($cat -eq "Todos" -or $d.Cat -eq $cat) { $lbDNS.Items.Add(" [$($d.Cat.PadRight(11))] $($d.Nome)") | Out-Null $script:dnsMap[$j] = $i $j++ } } if ($lbDNS.Items.Count -gt 0) { $lbDNS.SelectedIndex = 0 } } RefreshDNSList $cmbDNSCat.add_SelectedIndexChanged({ RefreshDNSList -cat $cmbDNSCat.SelectedItem }) # ── Painel direito: detalhe + adaptadores ────────────── $pnlDNSRight = New-Object System.Windows.Forms.Panel $pnlDNSRight.Location = New-Object System.Drawing.Point(311, 0) $pnlDNSRight.Size = New-Object System.Drawing.Size(589, 580) $pnlDNSRight.Anchor = "Top,Left,Bottom,Right" $pnlDNSRight.BackColor = $corFundo $pnlDNSBody.Controls.Add($pnlDNSRight) # Card de detalhe do DNS selecionado $pnlDNSDetalhe = New-Object System.Windows.Forms.Panel $pnlDNSDetalhe.Location = New-Object System.Drawing.Point(10, 10) $pnlDNSDetalhe.Size = New-Object System.Drawing.Size(569, 130) $pnlDNSDetalhe.BackColor = $corPainel $pnlDNSRight.Controls.Add($pnlDNSDetalhe) $acDet = New-Object System.Windows.Forms.Panel $acDet.Location = New-Object System.Drawing.Point(0,0); $acDet.Size = New-Object System.Drawing.Size(4,130); $acDet.BackColor = $corVerde $pnlDNSDetalhe.Controls.Add($acDet) $lblDetNome = New-Object System.Windows.Forms.Label $lblDetNome.Text = "Selecione um DNS na lista"; $lblDetNome.Font = New-Object System.Drawing.Font("Segoe UI",12,[System.Drawing.FontStyle]::Bold) $lblDetNome.ForeColor = $corTextoClaro; $lblDetNome.Location = New-Object System.Drawing.Point(14,10); $lblDetNome.Size = New-Object System.Drawing.Size(545,24) $lblDetDesc = New-Object System.Windows.Forms.Label $lblDetDesc.Text = ""; $lblDetDesc.ForeColor = $corTextoEscuro $lblDetDesc.Location = New-Object System.Drawing.Point(14,36); $lblDetDesc.Size = New-Object System.Drawing.Size(545,36) $lblDetPri = New-Object System.Windows.Forms.Label $lblDetPri.Text = ""; $lblDetPri.Font = New-Object System.Drawing.Font("Consolas",10,[System.Drawing.FontStyle]::Bold) $lblDetPri.ForeColor = $corVerde; $lblDetPri.Location = New-Object System.Drawing.Point(14,76); $lblDetPri.AutoSize = $true $lblDetSec = New-Object System.Windows.Forms.Label $lblDetSec.Text = ""; $lblDetSec.Font = New-Object System.Drawing.Font("Consolas",10) $lblDetSec.ForeColor = $corAmarelo; $lblDetSec.Location = New-Object System.Drawing.Point(14,98); $lblDetSec.AutoSize = $true $pnlDNSDetalhe.Controls.AddRange(@($lblDetNome,$lblDetDesc,$lblDetPri,$lblDetSec)) # Atualizar detalhe ao selecionar $lbDNS.add_SelectedIndexChanged({ if ($lbDNS.SelectedIndex -lt 0) { return } $realIdx = $script:dnsMap[$lbDNS.SelectedIndex] $d = $dnsList[$realIdx] $lblDetNome.Text = $d.Nome $lblDetDesc.Text = $d.Desc if ($d.Pri -eq "") { $lblDetPri.Text = "Primario : Automatico (DHCP)" $lblDetSec.Text = "Secundario: Automatico (DHCP)" $acDet.BackColor = $corTextoEscuro } else { $lblDetPri.Text = "Primario : $($d.Pri)" $lblDetSec.Text = "Secundario: $($d.Sec)" $catCor = switch($d.Cat){ "Anti-Anuncio"{ [System.Drawing.Color]::FromArgb(255,100,50) } "Familia" { [System.Drawing.Color]::FromArgb(236,72,153) } "Seguranca" { $corAmarelo } "Privacidade" { [System.Drawing.Color]::FromArgb(168,85,247) } default { $corVerde } } $acDet.BackColor = $catCor } }) # Titulo: adaptadores $lblAdapTit = New-Object System.Windows.Forms.Label $lblAdapTit.Text = "Adaptadores de Rede Disponiveis" $lblAdapTit.Font = New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold) $lblAdapTit.ForeColor = $corTextoEscuro; $lblAdapTit.Location = New-Object System.Drawing.Point(10,150); $lblAdapTit.AutoSize = $true $pnlDNSRight.Controls.Add($lblAdapTit) # Lista de adaptadores com checkbox $clbAdap = New-Object System.Windows.Forms.CheckedListBox $clbAdap.Location = New-Object System.Drawing.Point(10, 174) $clbAdap.Size = New-Object System.Drawing.Size(569, 200) $clbAdap.Anchor = "Top,Left,Right" $clbAdap.BackColor = $corPainel; $clbAdap.ForeColor = $corTextoClaro $clbAdap.BorderStyle = "None"; $clbAdap.CheckOnClick = $true $clbAdap.Font = New-Object System.Drawing.Font("Consolas",8.5) $pnlDNSRight.Controls.Add($clbAdap) # Carregar adaptadores ativos $adaptadores = Get-NetAdapter | Where-Object { $_.Status -eq "Up" } | Sort-Object Name $adapterMap = @{} $ai = 0 foreach ($adap in $adaptadores) { $dnsAtual = (Get-DnsClientServerAddress -InterfaceIndex $adap.InterfaceIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue).ServerAddresses -join ", " if (-not $dnsAtual) { $dnsAtual = "DHCP/Automatico" } $clbAdap.Items.Add(" $($adap.Name.PadRight(30)) | DNS atual: $dnsAtual") | Out-Null $adapterMap[$ai] = $adap $ai++ } # Botao selecionar todos os adaptadores $btnSelAdap = New-Object System.Windows.Forms.Button $btnSelAdap.Text = "Selec. Todos os Adaptadores" $btnSelAdap.Location = New-Object System.Drawing.Point(10, 378); $btnSelAdap.Size = New-Object System.Drawing.Size(220,28) $btnSelAdap.BackColor = $corBorda; $btnSelAdap.ForeColor = $corTextoClaro $btnSelAdap.FlatStyle = "Flat"; $btnSelAdap.FlatAppearance.BorderSize = 0 $btnSelAdap.add_Click({ for($i=0;$i -lt $clbAdap.Items.Count;$i++){$clbAdap.SetItemChecked($i,$true)} }) $pnlDNSRight.Controls.Add($btnSelAdap) # Status label $lblDNSStatus = New-Object System.Windows.Forms.Label $lblDNSStatus.Text = "" $lblDNSStatus.Location = New-Object System.Drawing.Point(10, 415); $lblDNSStatus.Size = New-Object System.Drawing.Size(569,40) $lblDNSStatus.ForeColor = $corVerde; $lblDNSStatus.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $pnlDNSRight.Controls.Add($lblDNSStatus) # Botao APLICAR $btnDNSAplicar = New-Object System.Windows.Forms.Button $btnDNSAplicar.Text = "Aplicar DNS Selecionado" $btnDNSAplicar.Location = New-Object System.Drawing.Point(10, 460); $btnDNSAplicar.Size = New-Object System.Drawing.Size(280,50) $btnDNSAplicar.BackColor = $corVerde; $btnDNSAplicar.ForeColor = $corFundo $btnDNSAplicar.FlatStyle = "Flat"; $btnDNSAplicar.FlatAppearance.BorderSize = 0 $btnDNSAplicar.Font = New-Object System.Drawing.Font("Segoe UI",12,[System.Drawing.FontStyle]::Bold) $btnDNSAplicar.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlDNSRight.Controls.Add($btnDNSAplicar) # Botao RESTAURAR DHCP $btnDNSDHCP = New-Object System.Windows.Forms.Button $btnDNSDHCP.Text = "Restaurar DHCP Automatico" $btnDNSDHCP.Location = New-Object System.Drawing.Point(300, 460); $btnDNSDHCP.Size = New-Object System.Drawing.Size(279,50) $btnDNSDHCP.BackColor = $corBorda; $btnDNSDHCP.ForeColor = $corTextoClaro $btnDNSDHCP.FlatStyle = "Flat"; $btnDNSDHCP.FlatAppearance.BorderSize = 0 $btnDNSDHCP.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $btnDNSDHCP.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlDNSRight.Controls.Add($btnDNSDHCP) # Nota $lblDNSNota = New-Object System.Windows.Forms.Label $lblDNSNota.Text = "A mudanca de DNS e aplicada imediatamente. Para IPv6, configure manualmente se necessario." $lblDNSNota.ForeColor = $corTextoEscuro; $lblDNSNota.Font = New-Object System.Drawing.Font("Segoe UI",8) $lblDNSNota.Location = New-Object System.Drawing.Point(10,520); $lblDNSNota.Size = New-Object System.Drawing.Size(569,20) $pnlDNSRight.Controls.Add($lblDNSNota) # ── Acao: Aplicar DNS ────────────────────────────────── $btnDNSAplicar.add_Click({ if ($lbDNS.SelectedIndex -lt 0) { [System.Windows.Forms.MessageBox]::Show("Selecione um servidor DNS na lista.","Atencao","OK","Warning") | Out-Null return } $checkedAdap = @($clbAdap.CheckedIndices) if ($checkedAdap.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione ao menos um adaptador de rede.","Atencao","OK","Warning") | Out-Null return } $realIdx = $script:dnsMap[$lbDNS.SelectedIndex] $dSel = $dnsList[$realIdx] $requests=@($checkedAdap | ForEach-Object { [int]$adapterMap[$_].InterfaceIndex }) $servers=@($dSel.Pri,$dSel.Sec); $automatic=($dSel.Pri -eq '') if ([Windows.Forms.MessageBox]::Show("Alterar DNS IPv4 de $($requests.Count) adaptador(es)? O estado anterior sera salvo.", 'DNS', 'YesNo', 'Question') -ne 'Yes') { return } Rodar-Async -Vars @{requests=$requests;servers=$servers;automatic=$automatic} -Bloco { foreach ($index in $requests) { Iniciar-RegistroOperacao "DNS IPv4 / adaptador $index" try { Set-VicDns -InterfaceIndex $index -Servers $servers -Automatic:$automatic; $status='Concluido'; $detail='Estado anterior salvo quando houve alteracao.' } catch { $status='Falhou ou parcial'; $detail=$_.Exception.Message } Escrever-Log "DNS $index`: $status - $detail" [pscustomobject]@{Adaptador=$index; Resultado=$status; Detalhes=$detail} } try { Invoke-NativeChecked ipconfig @('/flushdns') | Out-Null } catch { Escrever-Log 'DNS alterado, mas nao foi possivel limpar o cache.' 'AVISO' } } -AoFinalizar { param($results,$failure) if ($results.Count) { Mostrar-Resultados @($results) 'Alteracao DNS' } } }) $btnDNSDHCP.add_Click({ $requests=@($clbAdap.CheckedIndices | ForEach-Object { [int]$adapterMap[$_].InterfaceIndex }) if (-not $requests.Count) { return } Rodar-Async -Vars @{requests=$requests} -Bloco { foreach ($index in $requests) { Iniciar-RegistroOperacao "DNS automatico / adaptador $index" try { Set-VicDns -InterfaceIndex $index -Automatic; $status='Concluido'; $detail='DNS automatico IPv4.' } catch { $status='Falhou ou parcial'; $detail=$_.Exception.Message } Escrever-Log "DNS $index`: $status - $detail" [pscustomobject]@{Adaptador=$index; Resultado=$status; Detalhes=$detail} } } -AoFinalizar { param($results,$failure) if ($results.Count) { Mostrar-Resultados @($results) 'DNS automatico' } } }) $frmDNS.ShowDialog() | Out-Null Escrever-Log "Janela de DNS fechada." "INFO" } # ═══════════════════════════════════════════════════════════ # FUNCAO: JANELA DE HARDWARE DETALHADO # ═══════════════════════════════════════════════════════════ function Mostrar-HardwareInfo { param($Data=$null) if (-not $Data) { Escrever-Log 'Coletando hardware em segundo plano...' Rodar-Async -Bloco { $data=@{} foreach ($class in @('Win32_ComputerSystem','Win32_Processor','Win32_BaseBoard','Win32_BIOS','Win32_PhysicalMemory','Win32_PhysicalMemoryArray','Win32_VideoController','Win32_DiskDriveToDiskPartition','Win32_LogicalDiskToPartition','Win32_LogicalDisk','Win32_DiskDrive','Win32_NetworkAdapterConfiguration','Win32_OperatingSystem')) { $data[$class]=@(Get-CimInstance -ClassName $class -OperationTimeoutSec 15 -ErrorAction Stop) } $data.PhysicalDisk=@(Get-PhysicalDisk -ErrorAction SilentlyContinue) [pscustomobject]@{Data=$data} } -AoFinalizar { param($results,$failure) if (-not $failure) { Mostrar-HardwareInfo -Data ($results | Select-Object -Last 1).Data } } return } Escrever-Log "Coletando informacoes de hardware..." $frmHW = New-Object System.Windows.Forms.Form $frmHW.Text = "VicTool - Hardware Detalhado" $frmHW.Size = New-Object System.Drawing.Size(780, 680) $frmHW.StartPosition = "CenterScreen" $frmHW.BackColor = $corFundo $frmHW.ForeColor = $corTexto $frmHW.Font = New-Object System.Drawing.Font("Segoe UI", 9) $frmHW.Icon = Criar-Icone # Header da janela HW $pnlHWHeader = New-Object System.Windows.Forms.Panel $pnlHWHeader.Dock = "Top"; $pnlHWHeader.Height = 46; $pnlHWHeader.BackColor = $corPainel $lblHWTit = New-Object System.Windows.Forms.Label $lblHWTit.Text = "Hardware Detalhado"; $lblHWTit.Font = New-Object System.Drawing.Font("Segoe UI",15,[System.Drawing.FontStyle]::Bold) $lblHWTit.ForeColor = $corDestaque; $lblHWTit.Location = New-Object System.Drawing.Point(16,10); $lblHWTit.AutoSize = $true $pnlHWHeader.Controls.Add($lblHWTit) $frmHW.Controls.Add($pnlHWHeader) $frmHW.Show() [System.Windows.Forms.Application]::DoEvents() # Coletar dados via WMI try { # --- Dominio / Computador --- $csInfo = $Data.Win32_ComputerSystem | Select-Object -First 1 $noDominio = $csInfo.PartOfDomain $nomeDominio = if ($noDominio) { $csInfo.Domain } else { "Nao" } $tipoMembro = if ($noDominio) { "Dominio: $($csInfo.Domain)" } else { "Grupo de trabalho: $($csInfo.Workgroup)" } # --- CPU --- $cpu = $Data.Win32_Processor | Select-Object -First 1 $cpuNome = $cpu.Name.Trim() $cpuCores = $cpu.NumberOfCores $cpuThreads = $cpu.NumberOfLogicalProcessors $cpuClockMHz= $cpu.MaxClockSpeed $cpuClockGHz= [math]::Round($cpuClockMHz / 1000, 2) $cpuSocket = $cpu.SocketDesignation $cpuArch = $cpu.Architecture $archStr = switch($cpuArch){0{"x86"};5{"ARM"};9{"x64"};12{"ARM64"};default{"Desconhecido"}} # --- Placa Mae --- $mb = $Data.Win32_BaseBoard | Select-Object -First 1 $mbFabric= $mb.Manufacturer.Trim() $mbModel = $mb.Product.Trim() $mbSerial= $mb.SerialNumber.Trim() $bios = $Data.Win32_BIOS | Select-Object -First 1 $biosVer = "$($bios.Manufacturer) $($bios.SMBIOSBIOSVersion)" # --- RAM --- $ramSlots = $Data.Win32_PhysicalMemory $ramTotalGB = [math]::Round(($ramSlots | Measure-Object Capacity -Sum).Sum / 1GB, 1) $slotsUsados= $ramSlots.Count $slotsTotais= ($Data.Win32_PhysicalMemoryArray | Select-Object -First 1).MemoryDevices $ramTipo = ($ramSlots | Select-Object -First 1).MemoryType $tipoStr = switch($ramTipo){20{"DDR"};21{"DDR2"};24{"DDR3"};26{"DDR4"};34{"DDR5"};default{"DDR?"}} if($tipoStr -eq "DDR?"){ $smb = ($ramSlots | Select-Object -First 1).SMBIOSMemoryType $tipoStr = switch($smb){26{"DDR4"};34{"DDR5"};24{"DDR3"};21{"DDR2"};20{"DDR"};default{"Desconhecido"}} } $ramFreqMHz = ($ramSlots | Select-Object -First 1).ConfiguredClockSpeed if(!$ramFreqMHz -or $ramFreqMHz -eq 0){ $ramFreqMHz = ($ramSlots | Select-Object -First 1).Speed } # --- GPU --- $gpus = $Data.Win32_VideoController $gpuInfo = $gpus | ForEach-Object { $vramGB = if($_.AdapterRAM -gt 0){ [math]::Round($_.AdapterRAM/1GB,1) }else{"N/A"} "$($_.Name.Trim()) - VRAM: $vramGB GB" } # --- Discos --- # Carregar todas as associacoes de uma vez (mais confiavel que filtrar inline) $allDiskToPart = $Data.Win32_DiskDriveToDiskPartition $allPartToLogic = $Data.Win32_LogicalDiskToPartition $allLogicDisks = $Data.Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 } $allPhysDisk = $Data.PhysicalDisk $discos = $Data.Win32_DiskDrive | ForEach-Object { $disco = $_ $sizeGB = [math]::Round($disco.Size / 1GB, 1) $model = $disco.Model.Trim() $iface = $disco.InterfaceType # Detectar SSD/HDD via MSFT_PhysicalDisk (match por numero do disco) $tipo = "HDD" try { $pd = $allPhysDisk | Where-Object { $_.DeviceId -eq $disco.Index } | Select-Object -First 1 if ($pd) { $tipo = switch ($pd.MediaType) { "SSD" { "SSD" } "HDD" { "HDD" } "SCM" { "SCM" } default { # Fallback: tentar pelo nome $pdByName = $allPhysDisk | Where-Object { $_.FriendlyName -like "*$($model.Substring(0,[Math]::Min(12,$model.Length)))*" } | Select-Object -First 1 if ($pdByName) { $pdByName.MediaType } else { "HDD" } } } } } catch { $tipo = "HDD" } # Mapear Disco -> Particoes fisicas # O Antecedent de Win32_DiskDriveToDiskPartition contem "Disk #N" $partsFisicas = $allDiskToPart | Where-Object { $_.Antecedent.ToString() -match "Disk #$($disco.Index)[^0-9]|Disk #$($disco.Index)""" } $particoesInfo = [System.Collections.ArrayList]@() foreach ($pf in $partsFisicas) { # O Dependent.DeviceID da particao fisica ex: "Disk #0, Partition #0" $partDevID = $pf.Dependent.DeviceID # Procurar no Win32_LogicalDiskToPartition onde Antecedent contem esse DeviceID $logRels = $allPartToLogic | Where-Object { $_.Antecedent.ToString() -like "*$partDevID*" } foreach ($lr in $logRels) { $letra = $lr.Dependent.DeviceID $ldisk = $allLogicDisks | Where-Object { $_.DeviceID -eq $letra } | Select-Object -First 1 if ($ldisk -and $ldisk.Size -gt 0) { $totGB = [math]::Round($ldisk.Size / 1GB, 1) $livGB = [math]::Round($ldisk.FreeSpace / 1GB, 1) $usaGB = [math]::Round(($ldisk.Size - $ldisk.FreeSpace) / 1GB, 1) $usaPct = [math]::Round((($ldisk.Size - $ldisk.FreeSpace) / $ldisk.Size) * 100, 1) $particoesInfo.Add([PSCustomObject]@{ Letra = $letra TotGB = $totGB UsaGB = $usaGB LivGB = $livGB UsaPct = $usaPct }) | Out-Null } } } # Fallback: se nao achou particoes pela associacao, tentar direto pelo volume if ($particoesInfo.Count -eq 0) { foreach ($ld in $allLogicDisks) { if ($ld.Size -gt 0) { $totGB = [math]::Round($ld.Size / 1GB, 1) $livGB = [math]::Round($ld.FreeSpace / 1GB, 1) $usaGB = [math]::Round(($ld.Size - $ld.FreeSpace) / 1GB, 1) $usaPct = [math]::Round((($ld.Size - $ld.FreeSpace) / $ld.Size) * 100, 1) # So adiciona se a capacidade do volume <= capacidade do disco fisico if ($totGB -le $sizeGB) { $particoesInfo.Add([PSCustomObject]@{ Letra = $ld.DeviceID TotGB = $totGB UsaGB = $usaGB LivGB = $livGB UsaPct = $usaPct }) | Out-Null } } } } [PSCustomObject]@{ Model = $model SizeGB = $sizeGB Tipo = $tipo Interface = $iface Particoes = $particoesInfo } } # --- Rede --- $netAdapters = $Data.Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled } } catch { # Mostrar erro no titulo da janela e logar $frmHW.Text = "VicTool - Erro ao coletar hardware: $_" Escrever-Log "Erro ao coletar hardware: $_" "ERRO" return } # ── Construir layout de cards ────────────────────────── $scroll = New-Object System.Windows.Forms.Panel $scroll.Location = New-Object System.Drawing.Point(0, 46) $scroll.Size = New-Object System.Drawing.Size(780, 584) $scroll.Anchor = "Top,Left,Bottom,Right" $scroll.AutoScroll = $true $scroll.BackColor = $corFundo $frmHW.Controls.Add($scroll) $script:yCard = 10 function Novo-Card { param([string]$Titulo, [string[]]$Linhas, [System.Drawing.Color]$CorAcento) $linhasValidas = $Linhas | Where-Object { $_ -ne $null -and $_.Trim() -ne "" } $altura = 36 + ($linhasValidas.Count * 22) + 10 $card = New-Object System.Windows.Forms.Panel $card.Location = New-Object System.Drawing.Point(10, $script:yCard) $card.Size = New-Object System.Drawing.Size(740, $altura) $card.BackColor = $corPainel # Barra colorida lateral $acento = New-Object System.Windows.Forms.Panel $acento.Location = New-Object System.Drawing.Point(0, 0) $acento.Size = New-Object System.Drawing.Size(4, $altura) $acento.BackColor = $CorAcento $card.Controls.Add($acento) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $Titulo $lblTit.Font = New-Object System.Drawing.Font("Segoe UI", 10, [System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $CorAcento $lblTit.Location = New-Object System.Drawing.Point(14, 8) $lblTit.AutoSize = $true $card.Controls.Add($lblTit) $yLinha = 32 foreach ($linha in $linhasValidas) { $partes = $linha -split "\|", 2 $chave = $partes[0].Trim() $valor = if ($partes.Count -gt 1) { $partes[1].Trim() } else { "" } $lblChave = New-Object System.Windows.Forms.Label $lblChave.Text = $chave $lblChave.Font = New-Object System.Drawing.Font("Segoe UI", 9) $lblChave.ForeColor = $corTextoEscuro $lblChave.Location = New-Object System.Drawing.Point(14, $yLinha) $lblChave.Size = New-Object System.Drawing.Size(200, 20) $card.Controls.Add($lblChave) $lblValor = New-Object System.Windows.Forms.Label $lblValor.Text = $valor $lblValor.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $lblValor.ForeColor = $corTextoClaro $lblValor.Location = New-Object System.Drawing.Point(218, $yLinha) $lblValor.Size = New-Object System.Drawing.Size(510, 20) $card.Controls.Add($lblValor) $yLinha += 22 } $scroll.Controls.Add($card) $script:yCard += $altura + 10 } # Card: Sistema Operacional $so = $Data.Win32_OperatingSystem $uptime = (Get-Date) - $so.LastBootUpTime $uptimeStr = "{0}d {1}h {2}m" -f [int]$uptime.TotalDays, $uptime.Hours, $uptime.Minutes $dominioLinha = if ($noDominio) { "Dominio | $nomeDominio" } else { "Dominio | Nao ingressado ($tipoMembro)" } Novo-Card -Titulo "Sistema Operacional" -CorAcento $corDestaque -Linhas @( "Computador | $env:COMPUTERNAME", $dominioLinha, "Sistema Operacional | $($so.Caption) $($so.OSArchitecture)", "Build | $($so.BuildNumber) ($($so.Version))", "Instalado em | $($so.InstallDate.ToString('dd/MM/yyyy'))", "Ultimo boot | $($so.LastBootUpTime.ToString('dd/MM/yyyy HH:mm')) (uptime: $uptimeStr)", "Diretorio Windows | $($so.WindowsDirectory)" ) # Card: Placa Mae Novo-Card -Titulo "Placa-Mae (Motherboard)" -CorAcento ([System.Drawing.Color]::FromArgb(168,85,247)) -Linhas @( "Fabricante | $mbFabric", "Modelo | $mbModel", "Serial | $mbSerial", "BIOS | $biosVer", "Socket CPU | $cpuSocket" ) # Card: Processador Novo-Card -Titulo "Processador (CPU)" -CorAcento $corVerde -Linhas @( "Modelo | $cpuNome", "Arquitetura | $archStr", "Nucleos / Threads | $cpuCores nucleos / $cpuThreads threads", "Clock Maximo | $cpuClockGHz GHz ($cpuClockMHz MHz)", "Socket | $cpuSocket" ) # Card: Memoria RAM $ramLinhas = @( "Capacidade Total | $ramTotalGB GB", "Tipo | $tipoStr", "Frequencia | $ramFreqMHz MHz", "Slots usados | $slotsUsados de $slotsTotais slots" ) # Detalhar cada modulo $idx = 1 foreach($slot in $ramSlots){ $capGB = [math]::Round($slot.Capacity/1GB,1) $fab = if($slot.Manufacturer.Trim()) {$slot.Manufacturer.Trim()} else {"N/A"} $freq = if($slot.ConfiguredClockSpeed -gt 0){$slot.ConfiguredClockSpeed}else{$slot.Speed} $ramLinhas += "Modulo $idx (${capGB}GB) | Fabricante: $fab | Freq: $freq MHz | Banco: $($slot.DeviceLocator)" $idx++ } Novo-Card -Titulo "Memoria RAM" -CorAcento $corAmarelo -Linhas $ramLinhas # Card: GPU $gpuLinhas = @() foreach($g in $gpus){ $vramGB = if($g.AdapterRAM -gt 0){ [math]::Round($g.AdapterRAM/1GB,1) }else{"N/A"} $res = "$($g.CurrentHorizontalResolution)x$($g.CurrentVerticalResolution)" $gpuLinhas += "Nome | $($g.Name.Trim())" $gpuLinhas += "VRAM | $vramGB GB" $gpuLinhas += "Resolucao | $res" $gpuLinhas += "Driver | $($g.DriverVersion)" $gpuLinhas += "---" } Novo-Card -Titulo "Placa de Video (GPU)" -CorAcento ([System.Drawing.Color]::FromArgb(236,72,153)) -Linhas ($gpuLinhas | Where-Object {$_ -ne "---"}) # Card: Discos (um card por disco, com uso por particao) foreach ($d in $discos) { $tipoLabel = if ($d.Tipo -eq "SSD") { "SSD" } else { "HDD" } $discoLinhas = @( "Modelo | $($d.Model)", "Tipo | $($d.Tipo)", "Interface | $($d.Interface)", "Capacidade | $($d.SizeGB) GB (total fisico)" ) if ($d.Particoes.Count -gt 0) { foreach ($part in $d.Particoes) { if ($part.TotGB -gt 0) { $barLen = 20 $filled = [math]::Round($barLen * ($part.UsaPct / 100)) $bar = ("#" * $filled) + ("-" * ($barLen - $filled)) $discoLinhas += "Particao $($part.Letra) | Total: $($part.TotGB) GB | Usado: $($part.UsaGB) GB ($($part.UsaPct)%) | Livre: $($part.LivGB) GB [$bar]" } else { $discoLinhas += "Particao $($part.Letra) | (sem volume formatado)" } } } else { $discoLinhas += "Particoes | N/A" } Novo-Card -Titulo "Armazenamento — $($d.Model) [$tipoLabel]" -CorAcento $corVerde -Linhas $discoLinhas } # Card: Rede $netLinhas = @() foreach($n in $netAdapters){ $ips = ($n.IPAddress | Where-Object {$_ -match "\."}) -join ", " $netLinhas += "Adaptador | $($n.Description)" $netLinhas += "IP | $ips" $netLinhas += "Gateway | $(($n.DefaultIPGateway | Select-Object -First 1))" $netLinhas += "DNS | $(($n.DNSServerSearchOrder | Select-Object -First 2) -join ', ')" $netLinhas += "MAC | $($n.MACAddress)" $netLinhas += "---" } Novo-Card -Titulo "Rede" -CorAcento $corDestaque -Linhas ($netLinhas | Where-Object {$_ -ne "---"}) # ── Montar o texto do relatorio agora (escopo local, sem funcao) ── $relRam = @() $ri = 1 foreach ($slot in $ramSlots) { $rCapGB = [math]::Round($slot.Capacity / 1GB, 1) $rFab = if ($slot.Manufacturer -and $slot.Manufacturer.Trim()) { $slot.Manufacturer.Trim() } else { "N/A" } $rFreq = if ($slot.ConfiguredClockSpeed -gt 0) { $slot.ConfiguredClockSpeed } else { $slot.Speed } $relRam += " Modulo $ri : ${rCapGB} GB | Fab: $rFab | Freq: $rFreq MHz | Banco: $($slot.DeviceLocator)" $ri++ } $relUptime = (Get-Date) - $so.LastBootUpTime $relUptimeStr = "{0}d {1}h {2}m" -f [int]$relUptime.TotalDays, $relUptime.Hours, $relUptime.Minutes $relLinhas = @("================================================================") $relLinhas += " VicTool - Relatorio de Hardware" $relLinhas += " Gerado em : $(Get-Date -Format 'dd/MM/yyyy HH:mm:ss')" $relLinhas += " Maquina : $env:COMPUTERNAME" $relLinhas += " Usuario : $env:USERNAME" $relLinhas += "================================================================" $relLinhas += "" $relLinhas += "[ SISTEMA OPERACIONAL ]" $relLinhas += " Computador : $env:COMPUTERNAME" $relLinhas += " Dominio : $(if ($noDominio) { $nomeDominio + ' (membro do dominio)' } else { 'Nao ingressado (' + $tipoMembro + ')' })" $relLinhas += " Sistema : $($so.Caption) $($so.OSArchitecture)" $relLinhas += " Build : $($so.BuildNumber) ($($so.Version))" $relLinhas += " Instalado em : $($so.InstallDate.ToString('dd/MM/yyyy'))" $relLinhas += " Ultimo boot : $($so.LastBootUpTime.ToString('dd/MM/yyyy HH:mm')) (Uptime: $relUptimeStr)" $relLinhas += " Dir. Windows : $($so.WindowsDirectory)" $relLinhas += "" $relLinhas += "[ PLACA-MAE ]" $relLinhas += " Fabricante : $mbFabric" $relLinhas += " Modelo : $mbModel" $relLinhas += " Serial : $mbSerial" $relLinhas += " BIOS : $biosVer" $relLinhas += " Socket CPU : $cpuSocket" $relLinhas += "" $relLinhas += "[ PROCESSADOR (CPU) ]" $relLinhas += " Modelo : $cpuNome" $relLinhas += " Arquitetura : $archStr" $relLinhas += " Nucleos : $cpuCores nucleos / $cpuThreads threads" $relLinhas += " Clock Maximo : $cpuClockGHz GHz ($cpuClockMHz MHz)" $relLinhas += " Socket : $cpuSocket" $relLinhas += "" $relLinhas += "[ MEMORIA RAM ]" $relLinhas += " Total : $ramTotalGB GB" $relLinhas += " Tipo : $tipoStr" $relLinhas += " Frequencia : $ramFreqMHz MHz" $relLinhas += " Slots : $slotsUsados usados de $slotsTotais no total" $relLinhas += " Modulos:" $relLinhas += $relRam $relLinhas += "" $relLinhas += "[ PLACA DE VIDEO (GPU) ]" foreach ($g in $gpus) { $gVram = if ($g.AdapterRAM -gt 0) { [math]::Round($g.AdapterRAM / 1GB, 1) } else { "N/A" } $gRes = "$($g.CurrentHorizontalResolution)x$($g.CurrentVerticalResolution)" $relLinhas += " Nome : $($g.Name.Trim())" $relLinhas += " VRAM : $gVram GB" $relLinhas += " Resolucao : $gRes" $relLinhas += " Driver : $($g.DriverVersion)" $relLinhas += "" } $relLinhas += "[ ARMAZENAMENTO ]" foreach ($d in $discos) { $relLinhas += " Disco : $($d.Model)" $relLinhas += " Tipo : $($d.Tipo)" $relLinhas += " Interface : $($d.Interface)" $relLinhas += " Capacidade : $($d.SizeGB) GB (total fisico)" if ($d.Particoes.Count -gt 0) { foreach ($part in $d.Particoes) { if ($part.TotGB -gt 0) { $relLinhas += " Particao $($part.Letra) : Total $($part.TotGB) GB | Usado $($part.UsaGB) GB ($($part.UsaPct)%) | Livre $($part.LivGB) GB" } else { $relLinhas += " Particao $($part.Letra) : (sem volume formatado)" } } } else { $relLinhas += " Particoes : N/A" } $relLinhas += "" } $relLinhas += "[ REDE ]" foreach ($n in $netAdapters) { $nIps = ($n.IPAddress | Where-Object { $_ -match "\." }) -join ", " $relLinhas += " Adaptador : $($n.Description)" $relLinhas += " IP : $nIps" $relLinhas += " Gateway : $(($n.DefaultIPGateway | Select-Object -First 1))" $relLinhas += " DNS : $(($n.DNSServerSearchOrder | Select-Object -First 2) -join ', ')" $relLinhas += " MAC : $($n.MACAddress)" $relLinhas += "" } $relLinhas += "================================================================" $relLinhas += " Gerado por VicTool | by Victor Schiavinato" $relLinhas += "================================================================" # Guardar no escopo script para os click handlers acessarem $script:hwRelatorio = $relLinhas -join "`r`n" $script:hwNomeMaquina = $env:COMPUTERNAME # Painel inferior com dois botoes $pnlBotoes = New-Object System.Windows.Forms.Panel $pnlBotoes.Location = New-Object System.Drawing.Point(0, 586) $pnlBotoes.Size = New-Object System.Drawing.Size(780, 50) $pnlBotoes.Anchor = "Bottom,Left,Right" $pnlBotoes.BackColor = $corPainel $btnCopiar = New-Object System.Windows.Forms.Button $btnCopiar.Text = "Copiar para Area de Transferencia" $btnCopiar.Location = New-Object System.Drawing.Point(8, 8) $btnCopiar.Size = New-Object System.Drawing.Size(260, 34) $btnCopiar.BackColor = $corBorda $btnCopiar.ForeColor = $corTextoClaro $btnCopiar.FlatStyle = "Flat" $btnCopiar.FlatAppearance.BorderSize = 0 $btnCopiar.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $btnCopiar.add_Click({ [System.Windows.Forms.Clipboard]::SetText($script:hwRelatorio) [System.Windows.Forms.MessageBox]::Show("Relatorio copiado para a area de transferencia!", "Copiado", "OK", "Information") | Out-Null }) $btnExportar = New-Object System.Windows.Forms.Button $btnExportar.Text = "Exportar .TXT para Area de Trabalho" $btnExportar.Location = New-Object System.Drawing.Point(278, 8) $btnExportar.Size = New-Object System.Drawing.Size(280, 34) $btnExportar.BackColor = $corVerde $btnExportar.ForeColor = $corFundo $btnExportar.FlatStyle = "Flat" $btnExportar.FlatAppearance.BorderSize = 0 $btnExportar.Font = New-Object System.Drawing.Font("Segoe UI", 9, [System.Drawing.FontStyle]::Bold) $btnExportar.add_Click({ try { $dataHora = Get-Date -Format "yyyy-MM-dd_HH-mm" $nomeArquivo = "Hardware_$($script:hwNomeMaquina)_${dataHora}.txt" $desktop = [System.Environment]::GetFolderPath("Desktop") $caminhoFinal = Join-Path $desktop $nomeArquivo $script:hwRelatorio | Out-File -FilePath $caminhoFinal -Encoding UTF8 -Force Escrever-Log "Exportado: $caminhoFinal" "OK" $resp = [System.Windows.Forms.MessageBox]::Show( "Arquivo salvo com sucesso!`n`n$caminhoFinal`n`nDeseja abrir agora?", "Exportado!", "YesNo", "Information") if ($resp -eq "Yes") { Start-Process "notepad.exe" -ArgumentList "`"$caminhoFinal`"" } } catch { [System.Windows.Forms.MessageBox]::Show("Erro ao exportar:`n$_", "Erro", "OK", "Error") | Out-Null Escrever-Log "Erro ao exportar: $_" "ERRO" } }) $pnlBotoes.Controls.AddRange(@($btnCopiar, $btnExportar)) $frmHW.Controls.Add($pnlBotoes) Escrever-Log "Hardware coletado com sucesso!" "OK" } # ═══════════════════════════════════════════════════════════ # ABA 4 — MICROSOFT (MAS + Downloads Office) # ═══════════════════════════════════════════════════════════ $pMs = $tabPanels[5] $pnlMsScroll = New-Object System.Windows.Forms.Panel $pnlMsScroll.Dock = "Fill"; $pnlMsScroll.BackColor = $corFundo; $pnlMsScroll.AutoScroll = $true $pMs.Controls.Add($pnlMsScroll) # ── Título ──────────────────────────────────────────────── $lblMsTit = New-Object System.Windows.Forms.Label $lblMsTit.Text = "Microsoft"; $lblMsTit.Font = New-Object System.Drawing.Font("Segoe UI",16,[System.Drawing.FontStyle]::Bold) $lblMsTit.ForeColor = [System.Drawing.Color]::FromArgb(0,164,239) $lblMsTit.Location = New-Object System.Drawing.Point(20,18); $lblMsTit.AutoSize = $true $pnlMsScroll.Controls.Add($lblMsTit) $lblMsSub = New-Object System.Windows.Forms.Label $lblMsSub.Text = "Ativacao e Download de produtos Microsoft" $lblMsSub.ForeColor = $corTextoEscuro; $lblMsSub.Location = New-Object System.Drawing.Point(22,50); $lblMsSub.AutoSize = $true $pnlMsScroll.Controls.Add($lblMsSub) $sepMs1 = New-Object System.Windows.Forms.Panel $sepMs1.Location = New-Object System.Drawing.Point(20,72); $sepMs1.Size = New-Object System.Drawing.Size(730,1); $sepMs1.BackColor = $corBorda $pnlMsScroll.Controls.Add($sepMs1) # ── Seção: Ativação ─────────────────────────────────────── $lblSecAtiv = New-Object System.Windows.Forms.Label $lblSecAtiv.Text = "ATIVACAO (Microsoft Activation Scripts — massgrave.dev)" $lblSecAtiv.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblSecAtiv.ForeColor = $corTextoEscuro; $lblSecAtiv.Location = New-Object System.Drawing.Point(20,82); $lblSecAtiv.AutoSize = $true $pnlMsScroll.Controls.Add($lblSecAtiv) # Card Windows $pnlWin = New-Object System.Windows.Forms.Panel $pnlWin.Location = New-Object System.Drawing.Point(20,98); $pnlWin.Size = New-Object System.Drawing.Size(355,210); $pnlWin.BackColor = $corPainel $acWin = New-Object System.Windows.Forms.Panel $acWin.Location = New-Object System.Drawing.Point(0,0); $acWin.Size = New-Object System.Drawing.Size(4,210); $acWin.BackColor = [System.Drawing.Color]::FromArgb(0,120,215) $pnlWin.Controls.Add($acWin) $lblWinTit = New-Object System.Windows.Forms.Label $lblWinTit.Text = "Windows"; $lblWinTit.Font = New-Object System.Drawing.Font("Segoe UI",14,[System.Drawing.FontStyle]::Bold) $lblWinTit.ForeColor = $corTextoClaro; $lblWinTit.Location = New-Object System.Drawing.Point(16,14); $lblWinTit.AutoSize = $true $pnlWin.Controls.Add($lblWinTit) $lblWinM = New-Object System.Windows.Forms.Label $lblWinM.Text = "Metodo: HWID (Licenca Digital Permanente)"; $lblWinM.ForeColor = $corVerde $lblWinM.Font = New-Object System.Drawing.Font("Segoe UI",9); $lblWinM.Location = New-Object System.Drawing.Point(16,44); $lblWinM.AutoSize = $true $pnlWin.Controls.Add($lblWinM) $lblWinD = New-Object System.Windows.Forms.Label $lblWinD.Text = "Executa o MAS.cmd incorporado ao VicTool.`nNo menu, selecione [1] para Windows (HWID)." $lblWinD.ForeColor = $corTextoEscuro; $lblWinD.Location = New-Object System.Drawing.Point(16,68); $lblWinD.Size = New-Object System.Drawing.Size(323,56) $pnlWin.Controls.Add($lblWinD) $btnAtivarWin = New-Object System.Windows.Forms.Button $btnAtivarWin.Text = "Ativar Windows (HWID)"; $btnAtivarWin.Location = New-Object System.Drawing.Point(16,146) $btnAtivarWin.Size = New-Object System.Drawing.Size(323,46); $btnAtivarWin.BackColor = [System.Drawing.Color]::FromArgb(0,120,215) $btnAtivarWin.ForeColor = $corTextoClaro; $btnAtivarWin.FlatStyle = "Flat"; $btnAtivarWin.FlatAppearance.BorderSize = 0 $btnAtivarWin.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold); $btnAtivarWin.Cursor = [System.Windows.Forms.Cursors]::Hand $btnAtivarWin.add_Click({ $c = [System.Windows.Forms.MessageBox]::Show("Abrir MAS para ativar Windows (HWID)?`nNo menu que abrir, pressione [1].","Ativar Windows","YesNo","Question") if ($c -ne "Yes") { return } Escrever-Log "Abrindo MAS..." Executar-MAS }) $pnlWin.Controls.AddRange(@($lblWinTit,$lblWinM,$lblWinD,$btnAtivarWin)) $pnlMsScroll.Controls.Add($pnlWin) # Card Office Ativação $pnlOff = New-Object System.Windows.Forms.Panel $pnlOff.Location = New-Object System.Drawing.Point(395,98); $pnlOff.Size = New-Object System.Drawing.Size(355,210); $pnlOff.BackColor = $corPainel $acOff = New-Object System.Windows.Forms.Panel $acOff.Location = New-Object System.Drawing.Point(0,0); $acOff.Size = New-Object System.Drawing.Size(4,210); $acOff.BackColor = [System.Drawing.Color]::FromArgb(214,67,5) $pnlOff.Controls.Add($acOff) $lblOffTit = New-Object System.Windows.Forms.Label $lblOffTit.Text = "Office (Ativar)"; $lblOffTit.Font = New-Object System.Drawing.Font("Segoe UI",14,[System.Drawing.FontStyle]::Bold) $lblOffTit.ForeColor = $corTextoClaro; $lblOffTit.Location = New-Object System.Drawing.Point(16,14); $lblOffTit.AutoSize = $true $pnlOff.Controls.Add($lblOffTit) $lblOffM = New-Object System.Windows.Forms.Label $lblOffM.Text = "Metodo: Ohook (Ativacao Permanente)"; $lblOffM.ForeColor = $corVerde $lblOffM.Font = New-Object System.Drawing.Font("Segoe UI",9); $lblOffM.Location = New-Object System.Drawing.Point(16,44); $lblOffM.AutoSize = $true $pnlOff.Controls.Add($lblOffM) $lblOffD = New-Object System.Windows.Forms.Label $lblOffD.Text = "Executa o MAS.cmd incorporado ao VicTool.`nNo menu, selecione [2] para Office (Ohook)." $lblOffD.ForeColor = $corTextoEscuro; $lblOffD.Location = New-Object System.Drawing.Point(16,68); $lblOffD.Size = New-Object System.Drawing.Size(323,56) $pnlOff.Controls.Add($lblOffD) $btnAtivarOff = New-Object System.Windows.Forms.Button $btnAtivarOff.Text = "Ativar Office (Ohook)"; $btnAtivarOff.Location = New-Object System.Drawing.Point(16,146) $btnAtivarOff.Size = New-Object System.Drawing.Size(323,46); $btnAtivarOff.BackColor = [System.Drawing.Color]::FromArgb(214,67,5) $btnAtivarOff.ForeColor = $corTextoClaro; $btnAtivarOff.FlatStyle = "Flat"; $btnAtivarOff.FlatAppearance.BorderSize = 0 $btnAtivarOff.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold); $btnAtivarOff.Cursor = [System.Windows.Forms.Cursors]::Hand $btnAtivarOff.add_Click({ $c = [System.Windows.Forms.MessageBox]::Show("Abrir MAS para ativar Office (Ohook)?`nNo menu que abrir, pressione [2].","Ativar Office","YesNo","Question") if ($c -ne "Yes") { return } Escrever-Log "Abrindo MAS..." Executar-MAS }) $pnlOff.Controls.AddRange(@($lblOffTit,$lblOffM,$lblOffD,$btnAtivarOff)) $pnlMsScroll.Controls.Add($pnlOff) # ── Separador: Download Office ──────────────────────────── $sepDl = New-Object System.Windows.Forms.Panel $sepDl.Location = New-Object System.Drawing.Point(20,432); $sepDl.Size = New-Object System.Drawing.Size(730,1); $sepDl.BackColor = $corBorda $pnlMsScroll.Controls.Add($sepDl) $lblSecDl = New-Object System.Windows.Forms.Label $lblSecDl.Text = "DOWNLOAD OFFICE (instalador oficial Microsoft)" $lblSecDl.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblSecDl.ForeColor = $corTextoEscuro; $lblSecDl.Location = New-Object System.Drawing.Point(20,442); $lblSecDl.AutoSize = $true $pnlMsScroll.Controls.Add($lblSecDl) # Função para criar card de download de Office function Novo-CardDownloadOffice { param([int]$X, [int]$Y, [string]$Titulo, [string]$Versao, [string]$Desc, [string]$URL, [System.Drawing.Color]$Cor) $card = New-Object System.Windows.Forms.Panel $card.Location = New-Object System.Drawing.Point($X,$Y); $card.Size = New-Object System.Drawing.Size(234,200); $card.BackColor = $corPainel $ac = New-Object System.Windows.Forms.Panel $ac.Location = New-Object System.Drawing.Point(0,0); $ac.Size = New-Object System.Drawing.Size(234,4); $ac.BackColor = $Cor $card.Controls.Add($ac) $lblVer = New-Object System.Windows.Forms.Label $lblVer.Text = $Versao; $lblVer.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblVer.ForeColor = $Cor; $lblVer.Location = New-Object System.Drawing.Point(12,12); $lblVer.AutoSize = $true $card.Controls.Add($lblVer) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $Titulo; $lblTit.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $corTextoClaro; $lblTit.Location = New-Object System.Drawing.Point(12,30); $lblTit.AutoSize = $true $card.Controls.Add($lblTit) $lblDesc = New-Object System.Windows.Forms.Label $lblDesc.Text = $Desc; $lblDesc.Font = New-Object System.Drawing.Font("Segoe UI",8) $lblDesc.ForeColor = $corTextoEscuro; $lblDesc.Location = New-Object System.Drawing.Point(12,58); $lblDesc.Size = New-Object System.Drawing.Size(210,60) $card.Controls.Add($lblDesc) $lblPlat = New-Object System.Windows.Forms.Label $lblPlat.Text = "x64 | PT-BR | Oficial Microsoft" $lblPlat.Font = New-Object System.Drawing.Font("Segoe UI",7); $lblPlat.ForeColor = $corTextoEscuro $lblPlat.Location = New-Object System.Drawing.Point(12,122); $lblPlat.AutoSize = $true $card.Controls.Add($lblPlat) $btnDl = New-Object System.Windows.Forms.Button $btnDl.Text = "Baixar Agora"; $btnDl.Location = New-Object System.Drawing.Point(12,144); $btnDl.Size = New-Object System.Drawing.Size(210,44) $btnDl.BackColor = $Cor; $btnDl.ForeColor = $corFundo $btnDl.FlatStyle = "Flat"; $btnDl.FlatAppearance.BorderSize = 0 $btnDl.Font = New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold); $btnDl.Cursor = [System.Windows.Forms.Cursors]::Hand $urlCapt = $URL; $tituloCapt = $Titulo $btnDl.add_Click({ Escrever-Log "Iniciando download: $tituloCapt..." Start-Process $urlCapt Escrever-Log "Download iniciado no navegador. Aguarde o instalador baixar." "OK" }.GetNewClosure()) $card.Controls.Add($btnDl) return $card } $card365 = Novo-CardDownloadOffice -X 20 -Y 460 -Titulo "Microsoft 365" -Versao "MICROSOFT 365 APPS" ` -Desc "Assinatura com atualizacoes continuas. Word, Excel, PowerPoint, Outlook e mais." ` -URL "https://c2rsetup.officeapps.live.com/c2r/download.aspx?ProductreleaseID=O365ProPlusRetail&platform=x64&language=pt-br&version=O16GA" ` -Cor ([System.Drawing.Color]::FromArgb(0,120,215)) $card2024 = Novo-CardDownloadOffice -X 264 -Y 460 -Titulo "Office 2024" -Versao "OFFICE 2024 PRO PLUS" ` -Desc "Versao perpetu mais recente. Sem assinatura. Licenca unica." ` -URL "https://c2rsetup.officeapps.live.com/c2r/download.aspx?ProductreleaseID=ProPlus2024Retail&platform=x64&language=pt-br&version=O16GA" ` -Cor ([System.Drawing.Color]::FromArgb(35,197,120)) $card2021 = Novo-CardDownloadOffice -X 508 -Y 460 -Titulo "Office 2021" -Versao "OFFICE 2021 PRO PLUS" ` -Desc "Versao perp etua estavel. Sem assinatura. Compativel com Windows 10/11." ` -URL "https://c2rsetup.officeapps.live.com/c2r/download.aspx?ProductreleaseID=ProPlus2021Retail&platform=x64&language=pt-br&version=O16GA" ` -Cor ([System.Drawing.Color]::FromArgb(255,189,46)) $pnlMsScroll.Controls.AddRange(@($card365,$card2024,$card2021)) $lblDlNota = New-Object System.Windows.Forms.Label $lblDlNota.Text = "Os downloads sao iniciados via navegador direto dos servidores oficiais Microsoft (c2rsetup.officeapps.live.com)" $lblDlNota.ForeColor = $corTextoEscuro; $lblDlNota.Font = New-Object System.Drawing.Font("Segoe UI",8) $lblDlNota.Location = New-Object System.Drawing.Point(20,672); $lblDlNota.AutoSize = $true $pnlMsScroll.Controls.Add($lblDlNota) # ═══════════════════════════════════════════════════════════ # ABA 6 — AJUSTES # ═══════════════════════════════════════════════════════════ $pAjustes = $tabPanels[6] $pnlAjScroll = New-Object System.Windows.Forms.Panel $pnlAjScroll.Dock = "Fill"; $pnlAjScroll.BackColor = $corFundo; $pnlAjScroll.AutoScroll = $true # Função auxiliar para criar um card de ajuste function Novo-CardAjuste { param( [int]$Y, [string]$Titulo, [string]$Descricao, [string]$TextoBotaoAtivar, [string]$TextoBotaoDesfazer, [System.Drawing.Color]$Cor, [scriptblock]$AcaoAtivar, [scriptblock]$AcaoDesfazer ) $card = New-Object System.Windows.Forms.Panel $card.Location = New-Object System.Drawing.Point(16, $Y) $card.Size = New-Object System.Drawing.Size(740, 160) $card.BackColor = $corPainel $bar = New-Object System.Windows.Forms.Panel $bar.Location = New-Object System.Drawing.Point(0,0); $bar.Size = New-Object System.Drawing.Size(4,160); $bar.BackColor = $Cor $card.Controls.Add($bar) $lblTit = New-Object System.Windows.Forms.Label $lblTit.Text = $Titulo; $lblTit.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $lblTit.ForeColor = $Cor; $lblTit.Location = New-Object System.Drawing.Point(16,12); $lblTit.AutoSize = $true $card.Controls.Add($lblTit) $lblDesc = New-Object System.Windows.Forms.Label $lblDesc.Text = $Descricao; $lblDesc.Font = New-Object System.Drawing.Font("Segoe UI",9) $lblDesc.ForeColor = $corTextoEscuro; $lblDesc.Location = New-Object System.Drawing.Point(16,38) $lblDesc.Size = New-Object System.Drawing.Size(720,52) $card.Controls.Add($lblDesc) $btnAtivar = New-Object System.Windows.Forms.Button $btnAtivar.Text = $TextoBotaoAtivar $btnAtivar.Location = New-Object System.Drawing.Point(16, 102); $btnAtivar.Size = New-Object System.Drawing.Size(260,42) $btnAtivar.BackColor = $Cor; $btnAtivar.ForeColor = $corFundo $btnAtivar.FlatStyle = "Flat"; $btnAtivar.FlatAppearance.BorderSize = 0 $btnAtivar.Font = New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold) $btnAtivar.Cursor = [System.Windows.Forms.Cursors]::Hand $btnAtivar.add_Click($AcaoAtivar) $card.Controls.Add($btnAtivar) $btnDesfazer = New-Object System.Windows.Forms.Button $btnDesfazer.Text = $TextoBotaoDesfazer $btnDesfazer.Location = New-Object System.Drawing.Point(290, 102); $btnDesfazer.Size = New-Object System.Drawing.Size(220,42) $btnDesfazer.BackColor = $corBorda; $btnDesfazer.ForeColor = $corTextoEscuro $btnDesfazer.FlatStyle = "Flat"; $btnDesfazer.FlatAppearance.BorderSize = 0 $btnDesfazer.Font = New-Object System.Drawing.Font("Segoe UI",9) $btnDesfazer.Cursor = [System.Windows.Forms.Cursors]::Hand $btnDesfazer.add_Click($AcaoDesfazer) $card.Controls.Add($btnDesfazer) return $card } # ── Card 1: Visualizador de Fotos Classico ──────────────── $cardFotos = Novo-CardAjuste -Y 16 -Cor $corDestaque ` -Titulo "Visualizador de Fotos Classico" ` -Descricao "Adiciona o Windows Photo Viewer como opcao em Abrir com. Nao muda o aplicativo padrao automaticamente.`nGuarda os valores anteriores no historico." ` -TextoBotaoAtivar "Habilitar visualizador" -TextoBotaoDesfazer "Restaurar estado anterior" ` -AcaoAtivar { Iniciar-RegistroOperacao 'Visualizador de Fotos Classico' try { if (-not (Test-Path "$env:ProgramFiles\Windows Photo Viewer\PhotoViewer.dll")) { throw 'Photo Viewer nao disponivel neste Windows.' } $path='HKLM:\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations' foreach ($ext in @('.jpg','.jpeg','.png','.bmp','.gif','.tiff','.tif','.ico','.wdp','.jfif')) { RegSet $path $ext 'PhotoViewer.FileAssoc.Tiff' String } $path='HKCU:\Software\Classes\Applications\photoviewer.dll\shell\open' RegSet $path 'MuiVerb' '@photoviewer.dll,-3043' String RegSet "$path\command" '' '%SystemRoot%\System32\rundll32.exe "%ProgramFiles%\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen %1' ExpandString RegSet "$path\DropTarget" 'Clsid' '{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}' String foreach ($ext in @('.jpg','.jpeg','.png','.bmp','.gif','.tiff','.tif')) { RegSet "HKCU:\Software\Classes\$ext\OpenWithProgids" 'PhotoViewer.FileAssoc.Tiff' ([byte[]]@()) None } Escrever-Log 'Photo Viewer registrado. Use Abrir com para selecionar o aplicativo.' 'OK' } catch { Escrever-Log "Falha ou ajuste parcial. Consulte o historico. $($_.Exception.Message)" 'ERRO' } } -AcaoDesfazer { Solicitar-DesfazerAjuste 'Visualizador de Fotos Classico' } $cardMenu = Novo-CardAjuste -Y 192 -Cor $corAmarelo ` -Titulo "Menu de contexto classico (Windows 11)" ` -Descricao "Configura o menu de contexto completo. Requer Windows 11 e reinicio do Explorer ou da sessao.`nO estado anterior e preservado no historico." ` -TextoBotaoAtivar "Ativar menu classico" -TextoBotaoDesfazer "Restaurar estado anterior" ` -AcaoAtivar { $item=@{Nome='Menu de contexto classico';Acao='ui_menu';Cat='Interface'} Rodar-Async -Vars @{items=@($item)} -Bloco { Invoke-TweakBatch $items } -AoFinalizar { param($results,$failure) if ($results.Count) { Mostrar-Resultados @($results) 'Menu de contexto' } } } -AcaoDesfazer { Solicitar-DesfazerAjuste 'Menu de contexto classico' } $pnlAjScroll.Controls.Add($cardFotos) $pnlAjScroll.Controls.Add($cardMenu) # ── Card 3: Print Management ────────────────────────────── $cardPrint = Novo-CardAjuste -Y 368 -Cor $corVerde ` -Titulo "Print Management" -Descricao "Instala ou remove o console de gerenciamento de impressao, quando disponivel nesta edicao do Windows.`nPode exigir internet e reinicio. O resultado aparece ao concluir." ` -TextoBotaoAtivar "Instalar Print Management" -TextoBotaoDesfazer "Remover Print Management" ` -AcaoAtivar { Executar-Manutencao 'Instalar Print Management' { $feature=Get-WindowsCapability -Online -Name 'Print.Management.Console*' -ErrorAction Stop | Select-Object -First 1 if (-not $feature) { throw 'Recurso nao disponivel nesta edicao do Windows.' } if ($feature.State -eq 'Installed') { 'Ja instalado.'; return } $result=Add-WindowsCapability -Online -Name $feature.Name -ErrorAction Stop "Instalado. Reinicio necessario: $($result.RestartNeeded)" } } -AcaoDesfazer { if ([Windows.Forms.MessageBox]::Show('Remover Print Management?', 'Remover recurso', 'YesNo', 'Question') -ne 'Yes') { return } Executar-Manutencao 'Remover Print Management' { $feature=Get-WindowsCapability -Online -Name 'Print.Management.Console*' -ErrorAction Stop | Select-Object -First 1 if (-not $feature -or $feature.State -ne 'Installed') { 'Ja ausente.'; return } $result=Remove-WindowsCapability -Online -Name $feature.Name -ErrorAction Stop "Removido. Reinicio necessario: $($result.RestartNeeded)" } } $pnlAjScroll.Controls.Add($cardPrint) # ── Card 4: Hyper-V ─────────────────────────────────────── $cardHyperV = New-Object System.Windows.Forms.Panel $cardHyperV.Location = New-Object System.Drawing.Point(16, 544) $cardHyperV.Size = New-Object System.Drawing.Size(740, 220) $cardHyperV.BackColor = $corPainel $pnlAjScroll.Controls.Add($cardHyperV) $acHV = New-Object System.Windows.Forms.Panel $acHV.Location = New-Object System.Drawing.Point(0,0); $acHV.Size = New-Object System.Drawing.Size(4,220) $acHV.BackColor = [System.Drawing.Color]::FromArgb(168,85,247) $cardHyperV.Controls.Add($acHV) $lblHVTit = New-Object System.Windows.Forms.Label $lblHVTit.Text = "Hyper-V (Hypervisor Windows)"; $lblHVTit.Font = New-Object System.Drawing.Font("Segoe UI",11,[System.Drawing.FontStyle]::Bold) $lblHVTit.ForeColor = [System.Drawing.Color]::FromArgb(168,85,247) $lblHVTit.Location = New-Object System.Drawing.Point(16,12); $lblHVTit.AutoSize = $true $cardHyperV.Controls.Add($lblHVTit) $lblHVDesc = New-Object System.Windows.Forms.Label $lblHVDesc.Text = "Instala o Hyper-V (virtualizacao nativa do Windows Pro/Enterprise).`nRequer virtualizacao habilitada na BIOS (VT-x/AMD-V). O botao 'Verificar Status' checa tudo antes de instalar." $lblHVDesc.Font = New-Object System.Drawing.Font("Segoe UI",9); $lblHVDesc.ForeColor = $corTextoEscuro $lblHVDesc.Location = New-Object System.Drawing.Point(16,38); $lblHVDesc.Size = New-Object System.Drawing.Size(716,40) $cardHyperV.Controls.Add($lblHVDesc) # Label de status (atualizado dinamicamente) $lblHVStatus = New-Object System.Windows.Forms.Label $lblHVStatus.Text = "Clique em 'Verificar Status' para checar o ambiente."; $lblHVStatus.Font = New-Object System.Drawing.Font("Consolas",8) $lblHVStatus.ForeColor = $corTextoEscuro; $lblHVStatus.Location = New-Object System.Drawing.Point(16,82); $lblHVStatus.Size = New-Object System.Drawing.Size(716,50) $cardHyperV.Controls.Add($lblHVStatus) # Botão Verificar Status $btnHVCheck = New-Object System.Windows.Forms.Button $btnHVCheck.Text = "Verificar Status"; $btnHVCheck.Location = New-Object System.Drawing.Point(16,140); $btnHVCheck.Size = New-Object System.Drawing.Size(170,42) $btnHVCheck.BackColor = $corBorda; $btnHVCheck.ForeColor = $corTextoClaro $btnHVCheck.FlatStyle = "Flat"; $btnHVCheck.FlatAppearance.BorderSize = 0 $btnHVCheck.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold); $btnHVCheck.Cursor = [System.Windows.Forms.Cursors]::Hand $cardHyperV.Controls.Add($btnHVCheck) # Botão Instalar $btnHVInstall = New-Object System.Windows.Forms.Button $btnHVInstall.Text = "Instalar Hyper-V"; $btnHVInstall.Location = New-Object System.Drawing.Point(196,140); $btnHVInstall.Size = New-Object System.Drawing.Size(170,42) $btnHVInstall.BackColor = [System.Drawing.Color]::FromArgb(168,85,247); $btnHVInstall.ForeColor = $corTextoClaro $btnHVInstall.FlatStyle = "Flat"; $btnHVInstall.FlatAppearance.BorderSize = 0 $btnHVInstall.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold); $btnHVInstall.Cursor = [System.Windows.Forms.Cursors]::Hand $cardHyperV.Controls.Add($btnHVInstall) # Botão Remover $btnHVRemove = New-Object System.Windows.Forms.Button $btnHVRemove.Text = "Remover Hyper-V"; $btnHVRemove.Location = New-Object System.Drawing.Point(376,140); $btnHVRemove.Size = New-Object System.Drawing.Size(170,42) $btnHVRemove.BackColor = $corBorda; $btnHVRemove.ForeColor = $corTextoEscuro $btnHVRemove.FlatStyle = "Flat"; $btnHVRemove.FlatAppearance.BorderSize = 0 $btnHVRemove.Font = New-Object System.Drawing.Font("Segoe UI",9); $btnHVRemove.Cursor = [System.Windows.Forms.Cursors]::Hand $cardHyperV.Controls.Add($btnHVRemove) # ── Lógica dos botões ──────────────────────────────────── $btnHVCheck.add_Click({ Rodar-Async -Bloco { $feature=Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -ErrorAction Stop $cpu=Get-CimInstance Win32_Processor -ErrorAction Stop | Select-Object -First 1 "Hyper-V: $($feature.State) | Virtualizacao no firmware: $($cpu.VirtualizationFirmwareEnabled) | SLAT: $($cpu.SecondLevelAddressTranslationExtensions)" } -AoFinalizar { param($results,$failure) $lblHVStatus.Text=if($failure){'Recurso indisponivel ou falha na consulta. Consulte o log.'}else{($results -join ' ')} } }) $btnHVInstall.add_Click({ if ([Windows.Forms.MessageBox]::Show('Habilitar Hyper-V? Exige uma edicao compativel e virtualizacao no firmware. Reinicie manualmente ao concluir.', 'Hyper-V', 'YesNo', 'Question') -ne 'Yes') { return } Executar-Manutencao 'Habilitar Hyper-V' { $feature=Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -ErrorAction Stop if ($feature.State -eq 'Enabled') { 'Ja habilitado.'; return } $cpu=Get-CimInstance Win32_Processor -ErrorAction Stop | Select-Object -First 1 if (-not $cpu.VirtualizationFirmwareEnabled -or -not $cpu.SecondLevelAddressTranslationExtensions) { throw 'Habilite virtualizacao no firmware e confira suporte SLAT.' } $result=Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -All -NoRestart -ErrorAction Stop "Hyper-V habilitado. Reinicio necessario: $($result.RestartNeeded)" } }) $btnHVRemove.add_Click({ if ([Windows.Forms.MessageBox]::Show('Desabilitar Hyper-V? Pode afetar maquinas virtuais e ferramentas que dependem dele. Reinicie manualmente ao concluir.', 'Hyper-V', 'YesNo', 'Warning') -ne 'Yes') { return } Executar-Manutencao 'Desabilitar Hyper-V' { $feature=Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -ErrorAction Stop if ($feature.State -eq 'Disabled') { 'Ja desabilitado.'; return } $result=Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All -NoRestart -ErrorAction Stop "Hyper-V desabilitado. Reinicio necessario: $($result.RestartNeeded)" } }) $pAjustes.Controls.Add($pnlAjScroll) # ═══════════════════════════════════════════════════════════ # ABA 7 — REDE # ═══════════════════════════════════════════════════════════ $pRede = $tabPanels[7] # Layout: painel esquerdo (ferramentas) + painel direito (output) $pnlRedeLeft = New-Object System.Windows.Forms.Panel $pnlRedeLeft.Location = New-Object System.Drawing.Point(0,0) $pnlRedeLeft.Size = New-Object System.Drawing.Size(310, 650) $pnlRedeLeft.Anchor = "Top,Left,Bottom" $pnlRedeLeft.BackColor= $corPainel $pRede.Controls.Add($pnlRedeLeft) $sepRede = New-Object System.Windows.Forms.Panel $sepRede.Location = New-Object System.Drawing.Point(310,0); $sepRede.Size = New-Object System.Drawing.Size(1,650) $sepRede.Anchor = "Top,Left,Bottom"; $sepRede.BackColor = $corBorda $pRede.Controls.Add($sepRede) # Output (direita) $pnlRedeRight = New-Object System.Windows.Forms.Panel $pnlRedeRight.Location = New-Object System.Drawing.Point(311,0) $pnlRedeRight.Size = New-Object System.Drawing.Size(480, 650) $pnlRedeRight.Anchor = "Top,Left,Bottom,Right" $pnlRedeRight.BackColor = $corFundo $pRede.Controls.Add($pnlRedeRight) $lblRedeOut = New-Object System.Windows.Forms.Label $lblRedeOut.Text = "RESULTADO"; $lblRedeOut.Font = New-Object System.Drawing.Font("Segoe UI",8,[System.Drawing.FontStyle]::Bold) $lblRedeOut.ForeColor = $corTextoEscuro; $lblRedeOut.Location = New-Object System.Drawing.Point(4,4); $lblRedeOut.AutoSize = $true $pnlRedeRight.Controls.Add($lblRedeOut) $txtRedeOut = New-Object System.Windows.Forms.RichTextBox $txtRedeOut.Location = New-Object System.Drawing.Point(4, 22) $txtRedeOut.Size = New-Object System.Drawing.Size(472, 590) $txtRedeOut.Anchor = "Top,Left,Bottom,Right" $txtRedeOut.BackColor = $corPainel; $txtRedeOut.ForeColor = $corVerde $txtRedeOut.Font = New-Object System.Drawing.Font("Consolas", 8.5) $txtRedeOut.ReadOnly = $true; $txtRedeOut.BorderStyle = "None"; $txtRedeOut.ScrollBars = "Vertical" $pnlRedeRight.Controls.Add($txtRedeOut) $btnLimRedeOut = New-Object System.Windows.Forms.Button $btnLimRedeOut.Text = "Limpar"; $btnLimRedeOut.Location = New-Object System.Drawing.Point(4,616) $btnLimRedeOut.Size = New-Object System.Drawing.Size(472,28); $btnLimRedeOut.BackColor = $corBorda $btnLimRedeOut.ForeColor = $corTextoEscuro; $btnLimRedeOut.FlatStyle = "Flat"; $btnLimRedeOut.FlatAppearance.BorderSize = 0 $btnLimRedeOut.add_Click({ $txtRedeOut.Clear() }) $pnlRedeRight.Controls.Add($btnLimRedeOut) function Exibir-RedeOut { param([string]$texto, [string]$titulo = "") $txtRedeOut.Clear() if ($titulo) { $txtRedeOut.AppendText("=== $titulo ===`r`n`r`n") } $txtRedeOut.AppendText($texto) $txtRedeOut.SelectionStart = 0; $txtRedeOut.ScrollToCaret() } # ── Botões do painel esquerdo ───────────────────────────── function Novo-BtnRede { param([string]$txt, [int]$y, [System.Drawing.Color]$cor = $corBorda) $b = New-Object System.Windows.Forms.Button $b.Text = $txt; $b.Location = New-Object System.Drawing.Point(8,$y); $b.Size = New-Object System.Drawing.Size(294,36) $b.BackColor = $cor; $b.ForeColor = if($cor -eq $corBorda){$corTextoClaro}else{$corFundo} $b.FlatStyle = "Flat"; $b.FlatAppearance.BorderSize = 0 $b.Font = New-Object System.Drawing.Font("Segoe UI",9,[System.Drawing.FontStyle]::Bold) $b.Cursor = [System.Windows.Forms.Cursors]::Hand $pnlRedeLeft.Controls.Add($b) return $b } $lblRedeInfo = New-Object System.Windows.Forms.Label $lblRedeInfo.Text = "INFORMACOES"; $lblRedeInfo.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblRedeInfo.ForeColor = $corTextoEscuro; $lblRedeInfo.Location = New-Object System.Drawing.Point(8,10); $lblRedeInfo.AutoSize = $true $pnlRedeLeft.Controls.Add($lblRedeInfo) $btnIPInfo = Novo-BtnRede -txt "IP / MAC / Gateway / DNS" -y 28 -cor $corDestaque $btnIPInfo.add_Click({ Invoke-VicNetwork -Title 'IP / MAC / Gateway / DNS' -Work { $adapters = Get-NetIPConfiguration | Where-Object { $_.IPv4Address } $sb = [System.Text.StringBuilder]::new() foreach ($a in $adapters) { $sb.AppendLine("Adaptador : $($a.InterfaceAlias)") | Out-Null $sb.AppendLine("IP : $($a.IPv4Address.IPAddress)") | Out-Null $sb.AppendLine("Mascara : $($a.IPv4Address.PrefixLength) bits") | Out-Null $sb.AppendLine("Gateway : $($a.IPv4DefaultGateway.NextHop)") | Out-Null $dns = ($a.DNSServer | Where-Object {$_.AddressFamily -eq 2}).ServerAddresses -join ", " $sb.AppendLine("DNS : $dns") | Out-Null $mac = (Get-NetAdapter -InterfaceIndex $a.InterfaceIndex -EA SilentlyContinue).MacAddress $sb.AppendLine("MAC : $mac") | Out-Null $sb.AppendLine("") | Out-Null } $sb.ToString() } }) $btnIPPublico = Novo-BtnRede -txt "Ver IP Publico (externo)" -y 70 $btnIPPublico.add_Click({ Invoke-VicNetwork -Title 'IP publico' -Work { Invoke-RestMethod 'https://api.ipify.org' -TimeoutSec 10 -ErrorAction Stop } }) $btnCompart = Novo-BtnRede -txt "Compartilhamentos Ativos" -y 112 $btnCompart.add_Click({ Invoke-VicNetwork -Title 'Compartilhamentos' -Work { Invoke-NativeChecked net @('share') } }) $btnConexoes = Novo-BtnRede -txt "Conexoes Ativas (netstat)" -y 154 $btnConexoes.add_Click({ Invoke-VicNetwork -Title 'Conexoes ativas' -Work { Invoke-NativeChecked netstat @('-ano') } }) $lblRedeFerr = New-Object System.Windows.Forms.Label $lblRedeFerr.Text = "FERRAMENTAS"; $lblRedeFerr.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblRedeFerr.ForeColor = $corTextoEscuro; $lblRedeFerr.Location = New-Object System.Drawing.Point(8,202); $lblRedeFerr.AutoSize = $true $pnlRedeLeft.Controls.Add($lblRedeFerr) # Campo host/IP para Ping e Tracert $txtHost = New-Object System.Windows.Forms.TextBox $txtHost.Location = New-Object System.Drawing.Point(8,220); $txtHost.Size = New-Object System.Drawing.Size(294,24) $txtHost.BackColor = $corBorda; $txtHost.ForeColor = $corTextoClaro; $txtHost.BorderStyle = "FixedSingle" $txtHost.Text = "8.8.8.8"; $txtHost.Font = New-Object System.Drawing.Font("Consolas",9) $pnlRedeLeft.Controls.Add($txtHost) $btnPing = Novo-BtnRede -txt "Ping" -y 250 -cor $corVerde $btnPing.add_Click({ $hostAlvo = $txtHost.Text.Trim() if (-not $hostAlvo) { return } Escrever-Log "Ping para $hostAlvo..." Rodar-Async -Vars @{h=$hostAlvo} -Bloco { $res = ping $h -n 4 2>&1 | Out-String [PSCustomObject]@{ Texto=$res; Titulo="Ping -> $h" } } -AoFinalizar { param($resultado, $falha) if ($falha) { Exibir-RedeOut -titulo 'Erro' -texto "$falha"; return } $item = $resultado | Select-Object -Last 1 Exibir-RedeOut -titulo $item.Titulo -texto $item.Texto Escrever-Log "Ping concluido." "OK" } }) $btnTracert = Novo-BtnRede -txt "Tracert (rota)" -y 292 $btnTracert.add_Click({ $hostAlvo = $txtHost.Text.Trim() if (-not $hostAlvo) { return } Escrever-Log "Tracert para $hostAlvo (pode demorar)..." $txtRedeOut.Clear(); $txtRedeOut.AppendText("=== Tracert -> $hostAlvo ===`r`n`r`nExecutando, aguarde...`r`n") Rodar-Async -Vars @{h=$hostAlvo} -Bloco { $res = tracert -d $h 2>&1 | Out-String [PSCustomObject]@{ Texto=$res; Titulo="Tracert -> $h" } } -AoFinalizar { param($resultado, $falha) if ($falha) { Exibir-RedeOut -titulo 'Erro' -texto "$falha"; return } $item = $resultado | Select-Object -Last 1 Exibir-RedeOut -titulo $item.Titulo -texto $item.Texto Escrever-Log "Tracert concluido." "OK" } }) $btnNslookup = Novo-BtnRede -txt "NSLookup (resolver DNS)" -y 334 $btnNslookup.add_Click({ $target=$txtHost.Text.Trim() if (-not $target -or $target.StartsWith('-')) { return } Invoke-VicNetwork -Title "DNS: $target" -Vars @{target=$target} -Work { Resolve-DnsName -Name $target -ErrorAction Stop | Format-Table -AutoSize | Out-String } }) $btnPortas = Novo-BtnRede -txt "Testar Porta Aberta" -y 376 $btnPortas.add_Click({ $hostAlvo = $txtHost.Text.Trim() $form2 = New-Object System.Windows.Forms.Form $form2.Text = "Testar Porta"; $form2.Size = New-Object System.Drawing.Size(320,130) $form2.StartPosition = "CenterScreen"; $form2.BackColor = $corPainel; $form2.ForeColor = $corTextoClaro $lblP = New-Object System.Windows.Forms.Label; $lblP.Text = "Porta (ex: 80, 443, 3389):"; $lblP.Location = New-Object System.Drawing.Point(10,12); $lblP.AutoSize = $true $txtP = New-Object System.Windows.Forms.TextBox; $txtP.Location = New-Object System.Drawing.Point(10,34); $txtP.Size = New-Object System.Drawing.Size(280,24); $txtP.BackColor=$corBorda;$txtP.ForeColor=$corTextoClaro $btnOKP = New-Object System.Windows.Forms.Button; $btnOKP.Text = "Testar"; $btnOKP.Location = New-Object System.Drawing.Point(10,66); $btnOKP.Size = New-Object System.Drawing.Size(280,28) $btnOKP.BackColor=$corDestaque;$btnOKP.ForeColor=$corTextoClaro;$btnOKP.FlatStyle="Flat";$btnOKP.FlatAppearance.BorderSize=0 $btnOKP.add_Click({ $form2.Tag = $txtP.Text; $form2.Close() }) $form2.Controls.AddRange(@($lblP,$txtP,$btnOKP)); $form2.ShowDialog() | Out-Null $portaNum = $form2.Tag if (-not $portaNum) { return } $port=0 if (-not [int]::TryParse([string]$portaNum,[ref]$port) -or $port -lt 1 -or $port -gt 65535) { [Windows.Forms.MessageBox]::Show('Informe uma porta entre 1 e 65535.') | Out-Null; return } Invoke-VicNetwork -Title "Porta $port em $hostAlvo" -Vars @{target=$hostAlvo;port=$port} -Work { $tcp=New-Object Net.Sockets.TcpClient try { $connection=$tcp.BeginConnect($target,$port,$null,$null) try { if (-not $connection.AsyncWaitHandle.WaitOne(3000)) { return 'Sem resposta em 3 segundos (fechada, filtrada ou indisponivel).' } $tcp.EndConnect($connection); 'ABERTA - conexao estabelecida.' } finally { $connection.AsyncWaitHandle.Close() } } finally { $tcp.Dispose() } } }) $lblRedeAcoes = New-Object System.Windows.Forms.Label $lblRedeAcoes.Text = "ACOES"; $lblRedeAcoes.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblRedeAcoes.ForeColor = $corTextoEscuro; $lblRedeAcoes.Location = New-Object System.Drawing.Point(8,424); $lblRedeAcoes.AutoSize = $true $pnlRedeLeft.Controls.Add($lblRedeAcoes) $btnFlushDNS = Novo-BtnRede -txt "Flush DNS" -y 442 $btnFlushDNS.add_Click({ Invoke-VicNetwork -Title 'Limpar cache DNS' -Work { Invoke-NativeChecked ipconfig @('/flushdns') } }) $btnRenovarIP = Novo-BtnRede -txt "Renovar IP (release + renew)" -y 484 $btnRenovarIP.add_Click({ if ([Windows.Forms.MessageBox]::Show('A conexao pode cair durante a renovacao. Continuar?', 'Renovar IP', 'YesNo', 'Question') -ne 'Yes') { return } Invoke-VicNetwork -Title 'Renovar IP' -Work { Invoke-NativeChecked ipconfig @('/release'); Invoke-NativeChecked ipconfig @('/renew') } }) $btnResetTCP = Novo-BtnRede -txt "Reset TCP/IP + Winsock" -y 526 -cor $corAmarelo $btnResetTCP.add_Click({ if ([Windows.Forms.MessageBox]::Show('Resetar TCP/IP e Winsock? Pode afetar conexoes e exige reinicio. Nao possui desfazer automatico.', 'Reset de rede', 'YesNo', 'Warning') -ne 'Yes') { return } Invoke-VicNetwork -Title 'Reset de rede (reinicie o computador)' -Work { Invoke-NativeChecked netsh @('winsock','reset'); Invoke-NativeChecked netsh @('int','ip','reset'); Invoke-NativeChecked ipconfig @('/flushdns') } }) $btnTestarDNS = Novo-BtnRede -txt "Comparar velocidade DNS" -y 568 $btnTestarDNS.add_Click({ Escrever-Log "Testando velocidade dos servidores DNS..." $txtRedeOut.Clear(); $txtRedeOut.AppendText("=== Comparacao de Velocidade DNS ===`r`n`r`nTestando, aguarde...`r`n") Rodar-Async -Vars @{} -Bloco { $servidores = @{ "Google 8.8.8.8" = "8.8.8.8" "Cloudflare 1.1.1.1" = "1.1.1.1" "Quad9 9.9.9.9" = "9.9.9.9" "OpenDNS 208.67.222" = "208.67.222.222" "AdGuard 94.140.14" = "94.140.14.14" } $resultados = @() foreach ($nome in $servidores.Keys) { $ip = $servidores[$nome] $tempos = @() for ($i = 0; $i -lt 3; $i++) { try { $sw = [System.Diagnostics.Stopwatch]::StartNew() $null = Resolve-DnsName -Name "google.com" -Server $ip -DnsOnly -ErrorAction Stop $sw.Stop() $tempos += $sw.ElapsedMilliseconds } catch { $tempos += 9999 } } $media = [math]::Round(($tempos | Measure-Object -Average).Average, 0) $resultados += [PSCustomObject]@{ Nome=$nome; IP=$ip; MediaMs=$media } } $resultados = $resultados | Sort-Object MediaMs $sb = [System.Text.StringBuilder]::new() $sb.AppendLine("Resultado (media de 3 consultas a google.com):`r`n") | Out-Null $pos = 1 foreach ($r in $resultados) { $estrela = if ($pos -eq 1) { " << MAIS RAPIDO" } else { "" } $sb.AppendLine("$pos. $($r.Nome.PadRight(20)) $($r.MediaMs) ms$estrela") | Out-Null $pos++ } [PSCustomObject]@{ Texto=$sb.ToString(); Titulo="Comparacao de Velocidade DNS" } } -AoFinalizar { param($resultado, $falha) if ($falha) { Exibir-RedeOut -titulo 'Erro' -texto "$falha"; return } $item = $resultado | Select-Object -Last 1 Exibir-RedeOut -titulo $item.Titulo -texto $item.Texto Escrever-Log "Teste DNS concluido." "OK" } }) # ═══════════════════════════════════════════════════════════ # ABA 8 — USUARIOS # ═══════════════════════════════════════════════════════════ $pUsers = $tabPanels[8] # Layout: lista de usuarios (esquerda) + acoes (direita) $pnlUsLeft = New-Object System.Windows.Forms.Panel $pnlUsLeft.Location = New-Object System.Drawing.Point(0,0); $pnlUsLeft.Size = New-Object System.Drawing.Size(290,650) $pnlUsLeft.Anchor = "Top,Left,Bottom"; $pnlUsLeft.BackColor = $corPainel $pUsers.Controls.Add($pnlUsLeft) $sepUs = New-Object System.Windows.Forms.Panel $sepUs.Location = New-Object System.Drawing.Point(290,0); $sepUs.Size = New-Object System.Drawing.Size(1,650) $sepUs.Anchor = "Top,Left,Bottom"; $sepUs.BackColor = $corBorda $pUsers.Controls.Add($sepUs) $pnlUsRight = New-Object System.Windows.Forms.Panel $pnlUsRight.Location = New-Object System.Drawing.Point(291,0); $pnlUsRight.Size = New-Object System.Drawing.Size(500,650) $pnlUsRight.Anchor = "Top,Left,Bottom,Right"; $pnlUsRight.BackColor = $corFundo $pUsers.Controls.Add($pnlUsRight) # ── Painel esquerdo: lista de usuários ─────────────────── $lblUsTit = New-Object System.Windows.Forms.Label $lblUsTit.Text = "USUARIOS LOCAIS"; $lblUsTit.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lblUsTit.ForeColor = $corTextoEscuro; $lblUsTit.Location = New-Object System.Drawing.Point(8,8); $lblUsTit.AutoSize = $true $pnlUsLeft.Controls.Add($lblUsTit) $btnRefreshUs = New-Object System.Windows.Forms.Button $btnRefreshUs.Text = "Atualizar"; $btnRefreshUs.Location = New-Object System.Drawing.Point(200,4); $btnRefreshUs.Size = New-Object System.Drawing.Size(82,22) $btnRefreshUs.BackColor=$corBorda;$btnRefreshUs.ForeColor=$corTextoEscuro;$btnRefreshUs.FlatStyle="Flat";$btnRefreshUs.FlatAppearance.BorderSize=0 $btnRefreshUs.Font = New-Object System.Drawing.Font("Segoe UI",7) $pnlUsLeft.Controls.Add($btnRefreshUs) $lvUsers = New-Object System.Windows.Forms.ListView $lvUsers.Location = New-Object System.Drawing.Point(0,28); $lvUsers.Size = New-Object System.Drawing.Size(290,622) $lvUsers.Anchor = "Top,Left,Bottom"; $lvUsers.View = "Details"; $lvUsers.FullRowSelect = $true $lvUsers.BackColor = $corFundo; $lvUsers.ForeColor = $corTextoClaro; $lvUsers.BorderStyle = "None" $lvUsers.Font = New-Object System.Drawing.Font("Segoe UI",9); $lvUsers.GridLines = $false $lvUsers.Columns.Add("Usuario", 130) | Out-Null $lvUsers.Columns.Add("Status", 80) | Out-Null $lvUsers.Columns.Add("Admin", 60) | Out-Null $pnlUsLeft.Controls.Add($lvUsers) function Carregar-Usuarios { $lvUsers.Items.Clear() try { $admins = (Get-LocalGroupMember -SID "S-1-5-32-544" -EA SilentlyContinue).Name | ForEach-Object { ($_ -split "\\")[-1] } Get-LocalUser | Sort-Object Name | ForEach-Object { $u = $_ $item = New-Object System.Windows.Forms.ListViewItem($u.Name) $status = if ($u.Enabled) { "Ativo" } else { "Inativo" } $isAdmin = if ($admins -contains $u.Name) { "Sim" } else { "Nao" } $item.SubItems.Add($status) | Out-Null $item.SubItems.Add($isAdmin) | Out-Null $item.ForeColor = if ($u.Enabled) { $corTextoClaro } else { $corTextoEscuro } $item.Tag = $u $lvUsers.Items.Add($item) | Out-Null } } catch { Escrever-Log "Erro ao listar usuarios: $_" "ERRO" } } Carregar-Usuarios $btnRefreshUs.add_Click({ Carregar-Usuarios; Escrever-Log "Lista de usuarios atualizada." "OK" }) # ── Painel direito: informações e ações ────────────────── $pnlUsScroll = New-Object System.Windows.Forms.Panel $pnlUsScroll.Dock = "Fill"; $pnlUsScroll.BackColor = $corFundo; $pnlUsScroll.AutoScroll = $true $pnlUsRight.Controls.Add($pnlUsScroll) # Info do usuario selecionado $pnlUsInfo = New-Object System.Windows.Forms.Panel $pnlUsInfo.Location = New-Object System.Drawing.Point(10,10); $pnlUsInfo.Size = New-Object System.Drawing.Size(470,120) $pnlUsInfo.BackColor = $corPainel $pnlUsScroll.Controls.Add($pnlUsInfo) $barUsInfo = New-Object System.Windows.Forms.Panel $barUsInfo.Location = New-Object System.Drawing.Point(0,0); $barUsInfo.Size = New-Object System.Drawing.Size(4,120); $barUsInfo.BackColor = $corDestaque $pnlUsInfo.Controls.Add($barUsInfo) $lblUsInfoNome = New-Object System.Windows.Forms.Label $lblUsInfoNome.Text = "Selecione um usuario na lista"; $lblUsInfoNome.Font = New-Object System.Drawing.Font("Segoe UI",12,[System.Drawing.FontStyle]::Bold) $lblUsInfoNome.ForeColor = $corTextoClaro; $lblUsInfoNome.Location = New-Object System.Drawing.Point(14,10); $lblUsInfoNome.AutoSize = $true $pnlUsInfo.Controls.Add($lblUsInfoNome) $lblUsInfoDetalhe = New-Object System.Windows.Forms.Label $lblUsInfoDetalhe.Text = ""; $lblUsInfoDetalhe.ForeColor = $corTextoEscuro $lblUsInfoDetalhe.Location = New-Object System.Drawing.Point(14,38); $lblUsInfoDetalhe.Size = New-Object System.Drawing.Size(446,72) $pnlUsInfo.Controls.Add($lblUsInfoDetalhe) $lvUsers.add_SelectedIndexChanged({ if ($lvUsers.SelectedItems.Count -eq 0) { return } $u = $lvUsers.SelectedItems[0].Tag if (-not $u) { return } $lblUsInfoNome.Text = $u.Name $admins = (Get-LocalGroupMember -SID "S-1-5-32-544" -EA SilentlyContinue).Name | ForEach-Object { ($_ -split "\\")[-1] } $isAdmin = $admins -contains $u.Name $ultimo = if ($u.LastLogon -and $u.LastLogon -gt [datetime]"1/1/2000") { $u.LastLogon.ToString("dd/MM/yyyy HH:mm") } else { "Nunca" } $lblUsInfoDetalhe.Text = "Status: $(if($u.Enabled){'Ativo'}else{'Inativo'}) | Administrador: $(if($isAdmin){'Sim'}else{'Nao'})`nDescricao: $($u.Description)`nUltimo Logon: $ultimo`nSenha expira: $(if($u.PasswordExpires){$u.PasswordExpires.ToString('dd/MM/yyyy')}else{'Nunca'})" $barUsInfo.BackColor = if ($u.Enabled) { $corDestaque } else { $corTextoEscuro } }) # ── Seção: Ações sobre usuario selecionado ─────────────── function Obter-UserSelecionado { if ($lvUsers.SelectedItems.Count -eq 0) { [System.Windows.Forms.MessageBox]::Show("Selecione um usuario na lista.","Atencao","OK","Warning") | Out-Null return $null } return $lvUsers.SelectedItems[0].Tag } function Novo-SecaoUsers { param([string]$titulo, [int]$Y, [System.Drawing.Color]$cor) $lbl = New-Object System.Windows.Forms.Label $lbl.Text = $titulo; $lbl.Font = New-Object System.Drawing.Font("Segoe UI",7,[System.Drawing.FontStyle]::Bold) $lbl.ForeColor = $cor; $lbl.Location = New-Object System.Drawing.Point(10,$Y); $lbl.AutoSize = $true $pnlUsScroll.Controls.Add($lbl) } function Novo-BtnUser { param([string]$txt,[int]$x,[int]$y,[int]$w=145,[System.Drawing.Color]$cor=$corBorda) $b = New-Object System.Windows.Forms.Button $b.Text=$txt;$b.Location=New-Object System.Drawing.Point($x,$y);$b.Size=New-Object System.Drawing.Size($w,34) $b.BackColor=$cor;$b.ForeColor=if($cor -ne $corBorda -and $cor.GetBrightness() -lt 0.5){$corTextoClaro}else{$corTextoClaro} $b.FlatStyle="Flat";$b.FlatAppearance.BorderSize=0 $b.Font=New-Object System.Drawing.Font("Segoe UI",8,[System.Drawing.FontStyle]::Bold) $b.Cursor=[System.Windows.Forms.Cursors]::Hand $pnlUsScroll.Controls.Add($b) return $b } Novo-SecaoUsers -titulo "ACOES DO USUARIO SELECIONADO" -Y 142 -cor $corTextoEscuro # Ativar / Desativar $btnAtivarUs = Novo-BtnUser -txt "Ativar Usuario" -x 10 -y 160 -cor $corVerde $btnAtivarUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } try { Enable-LocalUser -Name $u.Name -ErrorAction Stop; Carregar-Usuarios; Escrever-Log "Usuario '$($u.Name)' ativado!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) $btnDesativarUs = Novo-BtnUser -txt "Desativar Usuario" -x 162 -y 160 -cor $corAmarelo $btnDesativarUs.ForeColor = $corFundo $btnDesativarUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } $conf = [System.Windows.Forms.MessageBox]::Show("Desativar o usuario '$($u.Name)'?","Confirmar","YesNo","Warning") if ($conf -ne "Yes") { return } try { Disable-LocalUser -Name $u.Name -ErrorAction Stop; Carregar-Usuarios; Escrever-Log "Usuario '$($u.Name)' desativado!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) $btnRemoverUs = Novo-BtnUser -txt "Remover Usuario" -x 314 -y 160 -cor $corVermelho $btnRemoverUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } $conf = [System.Windows.Forms.MessageBox]::Show("REMOVER o usuario '$($u.Name)'?`nEssa acao nao pode ser desfeita.","Confirmar","YesNo","Warning") if ($conf -ne "Yes") { return } try { Remove-LocalUser -Name $u.Name -ErrorAction Stop; Carregar-Usuarios; Escrever-Log "Usuario '$($u.Name)' removido!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) # Alterar senha $btnSenhaUs = Novo-BtnUser -txt "Alterar Senha" -x 10 -y 202 -w 220 -cor $corDestaque $btnSenhaUs.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } # Mini form de senha $fSenha = New-Object System.Windows.Forms.Form $fSenha.Text="Alterar Senha - $($u.Name)";$fSenha.Size=New-Object System.Drawing.Size(340,160) $fSenha.StartPosition="CenterScreen";$fSenha.BackColor=$corPainel;$fSenha.ForeColor=$corTextoClaro $fSenha.FormBorderStyle="FixedDialog";$fSenha.MaximizeBox=$false $lblNS=New-Object System.Windows.Forms.Label;$lblNS.Text="Nova senha:";$lblNS.Location=New-Object System.Drawing.Point(10,14);$lblNS.AutoSize=$true $txtNS=New-Object System.Windows.Forms.TextBox;$txtNS.Location=New-Object System.Drawing.Point(10,34);$txtNS.Size=New-Object System.Drawing.Size(300,24) $txtNS.BackColor=$corBorda;$txtNS.ForeColor=$corTextoClaro;$txtNS.UseSystemPasswordChar=$true $btnOKS=New-Object System.Windows.Forms.Button;$btnOKS.Text="Alterar";$btnOKS.Location=New-Object System.Drawing.Point(10,68) $btnOKS.Size=New-Object System.Drawing.Size(300,30);$btnOKS.BackColor=$corDestaque;$btnOKS.ForeColor=$corTextoClaro $btnOKS.FlatStyle="Flat";$btnOKS.FlatAppearance.BorderSize=0 $btnOKS.add_Click({ $fSenha.Tag=$txtNS.Text; $fSenha.Close() }) $fSenha.Controls.AddRange(@($lblNS,$txtNS,$btnOKS)); $fSenha.ShowDialog()|Out-Null $novaSenha = $fSenha.Tag if (-not $novaSenha) { return } try { $secSenha = ConvertTo-SecureString $novaSenha -AsPlainText -Force Set-LocalUser -Name $u.Name -Password $secSenha -ErrorAction Stop Escrever-Log "Senha de '$($u.Name)' alterada com sucesso!" "OK" [System.Windows.Forms.MessageBox]::Show("Senha alterada com sucesso!","OK","OK","Information")|Out-Null } catch { Escrever-Log "Erro ao alterar senha: $_" "ERRO" } }) # Admin $btnAddAdmin = Novo-BtnUser -txt "Tornar Administrador" -x 10 -y 244 -w 220 -cor $corDestaque $btnAddAdmin.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } try { Add-LocalGroupMember -SID "S-1-5-32-544" -Member $u.Name -EA Stop; Carregar-Usuarios; Escrever-Log "'$($u.Name)' adicionado ao grupo Administrators!" "OK" } catch { Escrever-Log "Erro (ja e admin?): $_" "AVISO" } }) $btnRemAdmin = Novo-BtnUser -txt "Remover de Admin" -x 238 -y 244 -w 220 -cor $corBorda $btnRemAdmin.add_Click({ $u = Obter-UserSelecionado; if (-not $u) { return } $conf=[System.Windows.Forms.MessageBox]::Show("Remover '$($u.Name)' do grupo Administradores?","Confirmar","YesNo","Warning") if ($conf -ne "Yes") { return } try { Remove-LocalGroupMember -SID "S-1-5-32-544" -Member $u.Name -EA Stop; Carregar-Usuarios; Escrever-Log "'$($u.Name)' removido dos Administrators!" "OK" } catch { Escrever-Log "Erro: $_" "ERRO" } }) Novo-SecaoUsers -titulo "CRIAR NOVO USUARIO" -Y 294 -cor $corTextoEscuro # Form de criação $pnlCriar = New-Object System.Windows.Forms.Panel $pnlCriar.Location=New-Object System.Drawing.Point(10,312);$pnlCriar.Size=New-Object System.Drawing.Size(470,180) $pnlCriar.BackColor=$corPainel $pnlUsScroll.Controls.Add($pnlCriar) $acCriar=New-Object System.Windows.Forms.Panel;$acCriar.Location=New-Object System.Drawing.Point(0,0);$acCriar.Size=New-Object System.Drawing.Size(4,180);$acCriar.BackColor=$corVerde $pnlCriar.Controls.Add($acCriar) function LblCriar { param($txt,$x,$y) $l=New-Object System.Windows.Forms.Label;$l.Text=$txt;$l.Location=New-Object System.Drawing.Point($x,$y);$l.AutoSize=$true;$l.ForeColor=$corTextoEscuro;$l.Font=New-Object System.Drawing.Font("Segoe UI",8);$pnlCriar.Controls.Add($l) } function TxtCriar { param($x,$y,$w=180) $t=New-Object System.Windows.Forms.TextBox;$t.Location=New-Object System.Drawing.Point($x,$y);$t.Size=New-Object System.Drawing.Size($w,22);$t.BackColor=$corBorda;$t.ForeColor=$corTextoClaro;$t.BorderStyle="FixedSingle";$pnlCriar.Controls.Add($t);return $t } LblCriar "Nome de usuario:" 14 10; $txtNovoNome = TxtCriar 14 28 200 LblCriar "Senha:" 14 58; $txtNovaSenha = TxtCriar 14 76 200; $txtNovaSenha.UseSystemPasswordChar=$true LblCriar "Descricao:" 230 10; $txtNovaDesc = TxtCriar 230 28 220 LblCriar "Tipo:" 230 58 $cmbTipoUser = New-Object System.Windows.Forms.ComboBox $cmbTipoUser.Location=New-Object System.Drawing.Point(230,76);$cmbTipoUser.Size=New-Object System.Drawing.Size(220,22) $cmbTipoUser.BackColor=$corBorda;$cmbTipoUser.ForeColor=$corTextoClaro;$cmbTipoUser.FlatStyle="Flat";$cmbTipoUser.DropDownStyle="DropDownList" @("Usuario Padrao","Administrador") | ForEach-Object { $cmbTipoUser.Items.Add($_)|Out-Null } $cmbTipoUser.SelectedIndex=0 $pnlCriar.Controls.Add($cmbTipoUser) $chkSenhaExpira = New-Object System.Windows.Forms.CheckBox $chkSenhaExpira.Text="Senha nao expira";$chkSenhaExpira.Location=New-Object System.Drawing.Point(14,108);$chkSenhaExpira.AutoSize=$true $chkSenhaExpira.ForeColor=$corTextoEscuro;$chkSenhaExpira.BackColor=$corPainel;$chkSenhaExpira.Checked=$true $pnlCriar.Controls.Add($chkSenhaExpira) $btnCriarUs = New-Object System.Windows.Forms.Button $btnCriarUs.Text="Criar Usuario";$btnCriarUs.Location=New-Object System.Drawing.Point(14,136);$btnCriarUs.Size=New-Object System.Drawing.Size(436,34) $btnCriarUs.BackColor=$corVerde;$btnCriarUs.ForeColor=$corFundo;$btnCriarUs.FlatStyle="Flat";$btnCriarUs.FlatAppearance.BorderSize=0 $btnCriarUs.Font=New-Object System.Drawing.Font("Segoe UI",10,[System.Drawing.FontStyle]::Bold) $btnCriarUs.Cursor=[System.Windows.Forms.Cursors]::Hand $pnlCriar.Controls.Add($btnCriarUs) $btnCriarUs.add_Click({ $nome = $txtNovoNome.Text.Trim() $senha = $txtNovaSenha.Text if (-not $nome) { [System.Windows.Forms.MessageBox]::Show("Informe o nome do usuario.","Atencao","OK","Warning")|Out-Null; return } try { $params = @{ Name=$nome; Description=$txtNovaDesc.Text } if ($senha) { $params.Password = ConvertTo-SecureString $senha -AsPlainText -Force } else { $params.NoPassword = $true } if ($chkSenhaExpira.Checked) { $params.PasswordNeverExpires = $true } New-LocalUser @params -EA Stop | Out-Null $groupSid = if ($cmbTipoUser.SelectedItem -eq 'Administrador') { 'S-1-5-32-544' } else { 'S-1-5-32-545' } try { Add-LocalGroupMember -SID $groupSid -Member $nome -ErrorAction Stop } catch { throw "Usuario '$nome' criado, mas nao foi adicionado ao grupo: $_" } Carregar-Usuarios $txtNovoNome.Clear(); $txtNovaSenha.Clear(); $txtNovaDesc.Clear() Escrever-Log "Usuario '$nome' criado com sucesso!" "OK" [System.Windows.Forms.MessageBox]::Show("Usuario '$nome' criado com sucesso!","OK","OK","Information")|Out-Null } catch { Escrever-Log "Erro ao criar usuario: $_" "ERRO"; [System.Windows.Forms.MessageBox]::Show("Erro: $_","Erro","OK","Error")|Out-Null } }) # ═══════════════════════════════════════════════════════════ $lblLogTit = New-Object System.Windows.Forms.Label $lblLogTit.Text="LOG";$lblLogTit.Font=New-Object System.Drawing.Font("Segoe UI",8,[System.Drawing.FontStyle]::Bold) $lblLogTit.ForeColor=$corTextoEscuro;$lblLogTit.Location=New-Object System.Drawing.Point(0,4);$lblLogTit.AutoSize=$true $script:txtLog = New-Object System.Windows.Forms.RichTextBox $script:txtLog.Location=New-Object System.Drawing.Point(0,22);$script:txtLog.Size=New-Object System.Drawing.Size(240,622) $script:txtLog.BackColor=$corPainel;$script:txtLog.ForeColor=$corVerde;$script:txtLog.Font=New-Object System.Drawing.Font("Consolas",8) $script:txtLog.ReadOnly=$true;$script:txtLog.BorderStyle="None";$script:txtLog.ScrollBars="Vertical";$script:txtLog.Anchor="Top,Left,Bottom,Right" $btnLimLog = New-Object System.Windows.Forms.Button $btnLimLog.Text="Limpar Log";$btnLimLog.Location=New-Object System.Drawing.Point(0,648);$btnLimLog.Size=New-Object System.Drawing.Size(240,28) $btnLimLog.BackColor=$corBorda;$btnLimLog.ForeColor=$corTextoEscuro;$btnLimLog.FlatStyle="Flat";$btnLimLog.FlatAppearance.BorderSize=0 $btnLimLog.add_Click({$script:txtLog.Clear()}) $pnlLog.Controls.AddRange(@($lblLogTit,$script:txtLog,$btnLimLog)) $logMenu=New-Object Windows.Forms.ContextMenuStrip $btnExportLog=New-Object Windows.Forms.ToolStripMenuItem $btnExportLog.Text='Exportar log' $btnExportLog.add_Click({ $dialog=New-Object Windows.Forms.SaveFileDialog; $dialog.Filter='Log (*.log)|*.log'; $dialog.FileName="VicTool-$($script:sessionId).log" if ($dialog.ShowDialog() -eq 'OK') { try { Copy-Item -LiteralPath $script:logFile -Destination $dialog.FileName -Force -ErrorAction Stop; Escrever-Log 'Log exportado.' 'OK' } catch { Escrever-Log 'Falha ao exportar o log.' 'ERRO' } } $dialog.Dispose() }) $btnUndo=New-Object Windows.Forms.ToolStripMenuItem $btnUndo.Text='Historico / Desfazer' $btnUndo.add_Click({ try { $history=@(Get-VicHistory) if (-not $history.Count) { [Windows.Forms.MessageBox]::Show('Nenhuma alteracao reversivel pendente.') | Out-Null; return } $summary=@($history | ForEach-Object { [pscustomobject]@{Data=$_.State.Created.ToLocalTime(); Operacao=$_.State.Label; Tipo=$_.State.Kind} }) Mostrar-Resultados $summary 'Historico pendente (mais recente primeiro)' if ([Windows.Forms.MessageBox]::Show("Desfazer a ultima operacao: $($history[0].State.Label)?`nRestaura os valores anteriores e pode substituir ajustes feitos depois por outros programas.", 'Desfazer', 'YesNo', 'Warning') -eq 'Yes') { Rodar-Async -Bloco { Restaurar-UltimaOperacao } } } catch { Escrever-Log "Nao foi possivel abrir o historico: $_" 'ERRO' } }) [void]$logMenu.Items.Add($btnExportLog) [void]$logMenu.Items.Add($btnUndo) $script:txtLog.ContextMenuStrip=$logMenu $btnLimLog.ContextMenuStrip=$logMenu $logTip=New-Object Windows.Forms.ToolTip $logTip.SetToolTip($script:txtLog,'Botao direito: exportar log e historico / desfazer.') $logTip.SetToolTip($btnLimLog,'Botao direito: exportar log e historico / desfazer.') # ─── Footer ──────────────────────────────────────────────── $pnlFoot = New-Object System.Windows.Forms.Panel $pnlFoot.Dock="Bottom";$pnlFoot.Height=26;$pnlFoot.BackColor=$corPainel $lblFoot = New-Object System.Windows.Forms.Label $lblFoot.Text="VicTool v1.5.1 | Ferramenta desenvolvida por Victor Schiavinato | Executando como Administrador" $lblFoot.ForeColor=$corTextoEscuro;$lblFoot.Font=New-Object System.Drawing.Font("Segoe UI",8);$lblFoot.Location=New-Object System.Drawing.Point(10,6);$lblFoot.AutoSize=$true $pnlFoot.Controls.Add($lblFoot) $script:form.Controls.Add($pnlFoot) # ─── Iniciar ─────────────────────────────────────────────── $script:form.add_Shown({ Selecionar-Tab -idx 0 Escrever-Log "VicTool v1.5.1 iniciado! Sessao $($script:sessionId)" Escrever-Log "Log local: $($script:logFile)" Escrever-Log "SO: $([System.Environment]::OSVersion.VersionString)" Escrever-Log "Usuario: $env:USERNAME @ $env:COMPUTERNAME" Escrever-Log "Pronto para uso." }) [System.Windows.Forms.Application]::Run($script:form)