Files
softwarekatalog/dist/setup.ps1
Ludwig Lehnert 3039562e91
All checks were successful
Release / build-release (push) Successful in 5s
fix gui install runspace
2026-07-01 12:18:59 +00:00

36 lines
133 KiB
PowerShell

# ASCII-only bootstrap generated from setup.ps1. Do not edit.
[CmdletBinding()]
param(
[ValidateSet('Install','Daemon','UpgradeAll','ApplyPolicy','ProcessQueue','ProcessRequest')]
[string]$Mode = 'Install',
[ValidateSet('Install','Uninstall')]
[string]$RequestAction = 'Install',
[string]$AppAlias,
[string]$RequestedBy,
[string]$RequestedBySid
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$Payload = @'
PCMKU2VsZlNlcnZpY2VXaW5nZXQucHMxCgpVc2UgYXM6Ci0gQ29tcHV0ZXIgU3RhcnR1cCBHUE8gc2NyaXB0IChkZWZhdWx0IG1vZGUgPSBJbnN0YWxsKQotIFNjaGVkdWxlZCB0YXNrIHRhcmdldCAoTW9kZSA9IERhZW1vbiAvIFVwZ3JhZGVBbGwgLyBBcHBseVBvbGljeSAvIFByb2Nlc3NRdWV1ZSAvIFByb2Nlc3NSZXF1ZXN0KQoKQmVoYXZpb3I6ClVzZXIgLT4gR1VJIC8gcmVxdWVzdCBoZWxwZXIgLT4gbmFtZWQgcGlwZSAtPiBkYWVtb24gdGFzayAoU1lTVEVNKSAtPiB3aW5nZXQgaW5zdGFsbCAtLXNjb3BlIG1hY2hpbmUKCkNyZWF0ZWQgcGF0aHM6CkM6XFByb2dyYW1EYXRhXF9fU29mdHdhcmVrYXRhbG9nXAogIFNlbGZTZXJ2aWNlV2luZ2V0LnBzMQogIFJlcXVlc3QtQXBwLnBzMQogIFNvZnR3YXJlLUNhdGFsb2cucHMxCiAgTGF1bmNoLVNvZnR3YXJlLUNhdGFsb2cudmJzCiAgSW5zdGFsbGVkLVBhY2thZ2VzLmpzb24KICBMb2dzXHNlcnZpY2UubG9nCiM+CgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ0RhZW1vbicsJ1VwZ3JhZGVBbGwnLCdBcHBseVBvbGljeScsJ1Byb2Nlc3NRdWV1ZScsJ1Byb2Nlc3NSZXF1ZXN0JyldCiAgICBbc3RyaW5nXSRNb2RlID0gJ0luc3RhbGwnLAogICAgW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldCiAgICBbc3RyaW5nXSRSZXF1ZXN0QWN0aW9uID0gJ0luc3RhbGwnLAogICAgW3N0cmluZ10kQXBwQWxpYXMsCiAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkCikKClNldC1TdHJpY3RNb2RlIC1WZXJzaW9uIExhdGVzdAokRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDb25maWd1cmF0aW9uCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQokQ2F0YWxvZ0Rpc3BsYXlOYW1lICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRCYXNlRGlyICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6UHJvZ3JhbURhdGEgJ19fU29mdHdhcmVrYXRhbG9nJwokTG9jYWxTY3JpcHRQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU2VsZlNlcnZpY2VXaW5nZXQucHMxJwokUmVxdWVzdFRvb2xQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnUmVxdWVzdC1BcHAucHMxJwokQ2F0YWxvZ0d1aVBhdGggICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU29mdHdhcmUtQ2F0YWxvZy5wczEnCiRDYXRhbG9nTGF1bmNoZXJQYXRoICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMYXVuY2gtU29mdHdhcmUtQ2F0YWxvZy52YnMnCiRJbnN0YWxsZWRQYWNrYWdlc1BhdGggID0gSm9pbi1QYXRoICRCYXNlRGlyICdJbnN0YWxsZWQtUGFja2FnZXMuanNvbicKJFF1ZXVlU3RhdGVQYXRoICAgICAgICAgPSBKb2luLVBhdGggJEJhc2VEaXIgJ1F1ZXVlLVN0YXRlLmpzb24nCiRMb2dEaXIgICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMb2dzJwokTG9nRmlsZSAgICAgICAgICAgICAgICA9IEpvaW4tUGF0aCAkTG9nRGlyICdzZXJ2aWNlLmxvZycKJFBvbGljeVJvb3QgICAgICAgICAgICAgPSAnSEtMTTpcU29mdHdhcmVcUG9saWNpZXNcU1RMXFNvZnR3YXJla2F0YWxvZycKJFBvbGljeUNhdGFsb2dSb290ICAgICAgPSBKb2luLVBhdGggJFBvbGljeVJvb3QgJ0NhdGFsb2cnCiRQb2xpY3lSZXF1aXJlZFJvb3QgICAgID0gSm9pbi1QYXRoICRQb2xpY3lSb290ICdSZXF1aXJlZCcKJFBvbGljeU1heEVudHJpZXMgICAgICAgPSA1MDAKJExlZ2FjeVF1ZXVlVGFza05hbWUgICAgPSAnU29mdHdhcmVrYXRhbG9nIC0gV2luZ2V0IFF1ZXVlJwokRGFlbW9uVGFza05hbWUgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cgLSBEYWVtb24nCiRVcGdyYWRlVGFza05hbWUgICAgICAgID0gJ1NvZnR3YXJla2F0YWxvZyAtIFdpbmdldCBVcGdyYWRlJwokUGlwZU5hbWUgICAgICAgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRXaW5nZXRNdXRleE5hbWUgICAgICAgID0gJ0dsb2JhbFxTb2Z0d2FyZWthdGFsb2ctV2luZ2V0JwokUXVldWVTdGF0ZU11dGV4TmFtZSAgICA9ICdHbG9iYWxcU29mdHdhcmVrYXRhbG9nLVF1ZXVlU3RhdGUnCiRQb3dlclNoZWxsRXhlICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6U3lzdGVtUm9vdCAnU3lzdGVtMzJcV2luZG93c1Bvd2VyU2hlbGxcdjEuMFxwb3dlcnNoZWxsLmV4ZScKJFdTY3JpcHRFeGUgICAgICAgICAgICAgPSBKb2luLVBhdGggJGVudjpTeXN0ZW1Sb290ICdTeXN0ZW0zMlx3c2NyaXB0LmV4ZScKJEFwcEluc3RhbGxlckZhbWlseU5hbWUgPSAnTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXJfOHdla3liM2Q4YmJ3ZScKJENvbW1vbkRlc2t0b3BEaXIgICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25EZXNrdG9wRGlyZWN0b3J5JykKJENvbW1vblByb2dyYW1zRGlyICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25Qcm9ncmFtcycpCiREZXNrdG9wU2hvcnRjdXRQYXRoICAgID0gSm9pbi1QYXRoICRDb21tb25EZXNrdG9wRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKJFN0YXJ0TWVudVNob3J0Y3V0UGF0aCAgPSBKb2luLVBhdGggJENvbW1vblByb2dyYW1zRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKJHNjcmlwdDpEYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXJzID0gQCgpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBVdGlsaXR5IGZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gRW5zdXJlLURpcmVjdG9yeSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCkKICAgIGlmICgtbm90IChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRQYXRoKSkgewogICAgICAgIE5ldy1JdGVtIC1JdGVtVHlwZSBEaXJlY3RvcnkgLVBhdGggJFBhdGggLUZvcmNlIHwgT3V0LU51bGwKICAgIH0KfQoKZnVuY3Rpb24gV3JpdGUtTG9nIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRNZXNzYWdlLAogICAgICAgIFtWYWxpZGF0ZVNldCgnSU5GTycsJ1dBUk4nLCdFUlJPUicpXQogICAgICAgIFtzdHJpbmddJExldmVsID0gJ0lORk8nCiAgICApCgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCiAgICAkbGluZSA9ICd7MH0gW3sxfV0gezJ9JyAtZiAoR2V0LURhdGUgLUZvcm1hdCAneXl5eS1NTS1kZCBISDptbTpzcycpLCAkTGV2ZWwsICRNZXNzYWdlCiAgICBBZGQtQ29udGVudCAtTGl0ZXJhbFBhdGggJExvZ0ZpbGUgLVZhbHVlICRsaW5lIC1FbmNvZGluZyBVVEY4Cn0KCmZ1bmN0aW9uIFNldC1EaXJlY3RvcnlBY2wgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtib29sXSRVc2Vyc0Nhbk1vZGlmeQogICAgKQoKICAgICRpbmhlcml0YW5jZSA9IFtTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5Jbmhlcml0YW5jZUZsYWdzXSdDb250YWluZXJJbmhlcml0LCBPYmplY3RJbmhlcml0JwogICAgJHByb3BhZ2F0aW9uID0gW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLlByb3BhZ2F0aW9uRmxhZ3NdOjpOb25lCgogICAgJGFjbCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRGlyZWN0b3J5U2VjdXJpdHkKICAgICRhY2wuU2V0QWNjZXNzUnVsZVByb3RlY3Rpb24oJHRydWUsICRmYWxzZSkKCiAgICAkc2lkU3lzdGVtID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMTgnKQogICAgJHNpZEFkbWlucyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NCcpCiAgICAkc2lkVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0zMi01NDUnKQoKICAgICRydWxlU3lzdGVtID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5GaWxlU3lzdGVtQWNjZXNzUnVsZSgKICAgICAgICAkc2lkU3lzdGVtLCAnRnVsbENvbnRyb2wnLCAkaW5oZXJpdGFuY2UsICRwcm9wYWdhdGlvbiwgJ0FsbG93JwogICAgKQogICAgJHJ1bGVBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRBZG1pbnMsICdGdWxsQ29udHJvbCcsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICApCgogICAgaWYgKCRVc2Vyc0Nhbk1vZGlmeSkgewogICAgICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICAgICAkc2lkVXNlcnMsICdNb2RpZnknLCAkaW5oZXJpdGFuY2UsICRwcm9wYWdhdGlvbiwgJ0FsbG93JwogICAgICAgICkKICAgIH0KICAgIGVsc2UgewogICAgICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICAgICAkc2lkVXNlcnMsICdSZWFkQW5kRXhlY3V0ZSwgU3luY2hyb25pemUnLCAkaW5oZXJpdGFuY2UsICRwcm9wYWdhdGlvbiwgJ0FsbG93JwogICAgICAgICkKICAgIH0KCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZVN5c3RlbSkKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlQWRtaW5zKQogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVVc2VycykKCiAgICBTZXQtQWNsIC1MaXRlcmFsUGF0aCAkUGF0aCAtQWNsT2JqZWN0ICRhY2wKfQoKZnVuY3Rpb24gU2V0LUZpbGVBY2xBZG1pbnNPbmx5IHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYXRoKQoKICAgICRhY2wgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTZWN1cml0eQogICAgJGFjbC5TZXRBY2Nlc3NSdWxlUHJvdGVjdGlvbigkdHJ1ZSwgJGZhbHNlKQoKICAgICRzaWRTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0xOCcpCiAgICAkc2lkQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ0JykKICAgICRzaWRVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NScpCgogICAgJHJ1bGVTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRTeXN0ZW0sICdGdWxsQ29udHJvbCcsICdBbGxvdycKICAgICkKICAgICRydWxlQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5GaWxlU3lzdGVtQWNjZXNzUnVsZSgKICAgICAgICAkc2lkQWRtaW5zLCAnRnVsbENvbnRyb2wnLCAnQWxsb3cnCiAgICApCiAgICAkcnVsZVVzZXJzID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5GaWxlU3lzdGVtQWNjZXNzUnVsZSgKICAgICAgICAkc2lkVXNlcnMsICdSZWFkQW5kRXhlY3V0ZSwgU3luY2hyb25pemUnLCAnQWxsb3cnCiAgICApCgogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVTeXN0ZW0pCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZUFkbWlucykKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlVXNlcnMpCgogICAgU2V0LUFjbCAtTGl0ZXJhbFBhdGggJFBhdGggLUFjbE9iamVjdCAkYWNsCn0KCmZ1bmN0aW9uIEdldC1Qb2xpY3lEd29yZCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kTmFtZSwKICAgICAgICBbaW50XSREZWZhdWx0ID0gMAogICAgKQoKICAgIHRyeSB7CiAgICAgICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFBvbGljeVJvb3QpKSB7CiAgICAgICAgICAgIHJldHVybiAkRGVmYXVsdAogICAgICAgIH0KCiAgICAgICAgJHByb3BzID0gR2V0LUl0ZW1Qcm9wZXJ0eSAtTGl0ZXJhbFBhdGggJFBvbGljeVJvb3QgLUVycm9yQWN0aW9uIFN0b3AKICAgICAgICAkcHJvcGVydHkgPSAkcHJvcHMuUFNPYmplY3QuUHJvcGVydGllc1skTmFtZV0KICAgICAgICBpZiAoLW5vdCAkcHJvcGVydHkpIHsKICAgICAgICAgICAgcmV0dXJuICREZWZhdWx0CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gW2ludF0kcHJvcGVydHkuVmFsdWUKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIHBvbGljeSB2YWx1ZSAnJE5hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICAgICAgcmV0dXJuICREZWZhdWx0CiAgICB9Cn0KCmZ1bmN0aW9uIFRlc3QtU29mdHdhcmVDYXRhbG9nUG9saWN5RW5hYmxlZCB7CiAgICAoR2V0LVBvbGljeUR3b3JkIC1OYW1lICdFbmFibGVkJyAtRGVmYXVsdCAwKSAtZXEgMQp9CgpmdW5jdGlvbiBUZXN0LVVzZXJJbnN0YWxsc0FsbG93ZWQgewogICAgKEdldC1Qb2xpY3lEd29yZCAtTmFtZSAnQWxsb3dVc2VySW5zdGFsbHMnIC1EZWZhdWx0IDEpIC1lcSAxCn0KCmZ1bmN0aW9uIFRlc3QtVXNlclVuaW5zdGFsbEFsbG93ZWQgewogICAgKEdldC1Qb2xpY3lEd29yZCAtTmFtZSAnQWxsb3dVc2VyVW5pbnN0YWxsJyAtRGVmYXVsdCAxKSAtZXEgMQp9CgpmdW5jdGlvbiBUZXN0LVJlcXVpcmVkRW5mb3JjZW1lbnRFbmFibGVkIHsKICAgIChHZXQtUG9saWN5RHdvcmQgLU5hbWUgJ0VuZm9yY2VSZXF1aXJlZCcgLURlZmF1bHQgMSkgLWVxIDEKfQoKZnVuY3Rpb24gR2V0LVBvbGljeVN0cmluZ1ZhbHVlcyB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkUGF0aCkpIHsKICAgICAgICByZXR1cm4gQCgpCiAgICB9CgogICAgdHJ5IHsKICAgICAgICAkaXRlbSA9IEdldC1JdGVtIC1MaXRlcmFsUGF0aCAkUGF0aCAtRXJyb3JBY3Rpb24gU3RvcAogICAgICAgICRuYW1lcyA9IEAoJGl0ZW0uR2V0VmFsdWVOYW1lcygpKSB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7ICRfIC1hbmQgJF8gLW5vdG1hdGNoICdeXConIH0gfAogICAgICAgICAgICBTb3J0LU9iamVjdCB8CiAgICAgICAgICAgIFNlbGVjdC1PYmplY3QgLUZpcnN0ICRQb2xpY3lNYXhFbnRyaWVzCgogICAgICAgIGZvcmVhY2ggKCRuYW1lIGluICRuYW1lcykgewogICAgICAgICAgICAkdmFsdWUgPSBbc3RyaW5nXSRpdGVtLkdldFZhbHVlKCRuYW1lLCAnJykKICAgICAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9IFtzdHJpbmddJG5hbWUKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICR2YWx1ZS5UcmltKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIHBvbGljeSBsaXN0ICckUGF0aCc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gQCgpCiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1BcHBDYXRhbG9nT2JqZWN0cyB7CiAgICBpZiAoLW5vdCAoVGVzdC1Tb2Z0d2FyZUNhdGFsb2dQb2xpY3lFbmFibGVkKSkgewogICAgICAgIHJldHVybiBAKCkKICAgIH0KCiAgICAkc2VlbkFsaWFzZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICAkcm93cyA9IEdldC1Qb2xpY3lTdHJpbmdWYWx1ZXMgLVBhdGggJFBvbGljeUNhdGFsb2dSb290CiAgICBmb3JlYWNoICgkcm93IGluICRyb3dzKSB7CiAgICAgICAgJGFsaWFzID0gKFtzdHJpbmddJHJvdy5OYW1lKS5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGFsaWFzKSkgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKC1ub3QgJHNlZW5BbGlhc2VzLkFkZCgkYWxpYXMpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRHVwbGljYXRlIGNhdGFsb2cgYWxpYXMgJyRhbGlhcycgaW4gcG9saWN5OyBpZ25vcmluZyBkdXBsaWNhdGUuIiAnV0FSTicKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRwYXJ0cyA9IChbc3RyaW5nXSRyb3cuVmFsdWUpIC1zcGxpdCAnXHwnLCAzCiAgICAgICAgaWYgKEAoJHBhcnRzKS5Db3VudCAtbHQgMikgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1hbGZvcm1lZCBjYXRhbG9nIHJvdyAnJGFsaWFzJy4gRXhwZWN0ZWQ6IFBhY2thZ2VJZHxEaXNwbGF5TmFtZXxEZXNjcmlwdGlvbiIgJ1dBUk4nCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAkcGFja2FnZUlkID0gKFtzdHJpbmddJHBhcnRzWzBdKS5UcmltKCkKICAgICAgICAkZGlzcGxheU5hbWUgPSAoW3N0cmluZ10kcGFydHNbMV0pLlRyaW0oKQogICAgICAgICRkZXNjcmlwdGlvbiA9ICcnCiAgICAgICAgaWYgKEAoJHBhcnRzKS5Db3VudCAtZ2UgMykgewogICAgICAgICAgICAkZGVzY3JpcHRpb24gPSAoW3N0cmluZ10kcGFydHNbMl0pLlRyaW0oKQogICAgICAgIH0KCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHBhY2thZ2VJZCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJDYXRhbG9nIHJvdyAnJGFsaWFzJyBoYXMgZW1wdHkgcGFja2FnZSBJRDsgaWdub3JpbmcuIiAnV0FSTicKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRkaXNwbGF5TmFtZSkpIHsKICAgICAgICAgICAgJGRpc3BsYXlOYW1lID0gJGFsaWFzCiAgICAgICAgfQoKICAgICAgICBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgQWxpYXMgICAgICAgPSAkYWxpYXMKICAgICAgICAgICAgRGlzcGxheU5hbWUgPSAkZGlzcGxheU5hbWUKICAgICAgICAgICAgRGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb24KICAgICAgICAgICAgUGFja2FnZUlkICAgPSAkcGFja2FnZUlkCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBHZXQtUmVxdWlyZWRBbGlhc2VzIHsKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7CiAgICAgICAgcmV0dXJuIEAoKQogICAgfQoKICAgICRzZWVuQWxpYXNlcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICRyb3dzID0gR2V0LVBvbGljeVN0cmluZ1ZhbHVlcyAtUGF0aCAkUG9saWN5UmVxdWlyZWRSb290CiAgICBmb3JlYWNoICgkcm93IGluICRyb3dzKSB7CiAgICAgICAgJHZhbHVlID0gKFtzdHJpbmddJHJvdy5WYWx1ZSkuVHJpbSgpCiAgICAgICAgaWYgKCR2YWx1ZSAtZXEgJzAnIC1vciAkdmFsdWUgLWVxICdmYWxzZScpIHsKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRhbGlhcyA9IChbc3RyaW5nXSRyb3cuTmFtZSkuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRhbGlhcykpIHsKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIGlmICgkc2VlbkFsaWFzZXMuQWRkKCRhbGlhcykpIHsKICAgICAgICAgICAgJGFsaWFzCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBHZXQtUGFja2FnZUlkQnlBbGlhcyB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kQWxpYXMpCgogICAgZm9yZWFjaCAoJGFwcCBpbiBHZXQtQXBwQ2F0YWxvZ09iamVjdHMpIHsKICAgICAgICBpZiAoW3N0cmluZ106OkVxdWFscyhbc3RyaW5nXSRhcHAuQWxpYXMsICRBbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgIHJldHVybiBbc3RyaW5nXSRhcHAuUGFja2FnZUlkCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBHZXQtQXBwQ2F0YWxvZ09iamVjdEJ5QWxpYXMgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJEFsaWFzKQoKICAgIGZvcmVhY2ggKCRhcHAgaW4gR2V0LUFwcENhdGFsb2dPYmplY3RzKSB7CiAgICAgICAgaWYgKFtzdHJpbmddOjpFcXVhbHMoW3N0cmluZ10kYXBwLkFsaWFzLCAkQWxpYXMsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkgewogICAgICAgICAgICByZXR1cm4gJGFwcAogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJG51bGwKfQoKZnVuY3Rpb24gV3JpdGUtVGV4dEZpbGUgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJENvbnRlbnQsCiAgICAgICAgW1ZhbGlkYXRlU2V0KCdVdGY4Qm9tJywnVW5pY29kZScpXQogICAgICAgIFtzdHJpbmddJEVuY29kaW5nID0gJ1V0ZjhCb20nCiAgICApCgogICAgJHBhcmVudCA9IFNwbGl0LVBhdGggLVBhdGggJFBhdGggLVBhcmVudAogICAgaWYgKCRwYXJlbnQpIHsKICAgICAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRwYXJlbnQKICAgIH0KCiAgICBzd2l0Y2ggKCRFbmNvZGluZykgewogICAgICAgICdVbmljb2RlJyB7ICR0ZXh0RW5jb2RpbmcgPSBOZXctT2JqZWN0IFN5c3RlbS5UZXh0LlVuaWNvZGVFbmNvZGluZygkZmFsc2UsICR0cnVlKSB9CiAgICAgICAgZGVmYXVsdCAgIHsgJHRleHRFbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKCR0cnVlKSB9CiAgICB9CgogICAgW1N5c3RlbS5JTy5GaWxlXTo6V3JpdGVBbGxUZXh0KCRQYXRoLCAkQ29udGVudCwgJHRleHRFbmNvZGluZykKfQoKZnVuY3Rpb24gTmV3LVF1ZXVlU3RhdGVPYmplY3QgewogICAgW3BzY3VzdG9tb2JqZWN0XVtvcmRlcmVkXUB7CiAgICAgICAgVmVyc2lvbiA9IDAKICAgICAgICBVcGRhdGVkQXQgPSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykKICAgICAgICBDdXJyZW50ID0gJG51bGwKICAgICAgICBRdWV1ZSA9IEAoKQogICAgfQp9CgpmdW5jdGlvbiBSZWFkLVF1ZXVlU3RhdGUgewogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFF1ZXVlU3RhdGVQYXRoKSkgewogICAgICAgIHJldHVybiBOZXctUXVldWVTdGF0ZU9iamVjdAogICAgfQoKICAgIHRyeSB7CiAgICAgICAgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkUXVldWVTdGF0ZVBhdGggLVJhdyAtRW5jb2RpbmcgVVRGOAogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRyYXcpKSB7CiAgICAgICAgICAgIHJldHVybiBOZXctUXVldWVTdGF0ZU9iamVjdAogICAgICAgIH0KCiAgICAgICAgJHN0YXRlID0gJHJhdyB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBpZiAoLW5vdCAkc3RhdGUuUFNPYmplY3QuUHJvcGVydGllc1snVmVyc2lvbiddKSB7ICRzdGF0ZSB8IEFkZC1NZW1iZXIgLU5vdGVQcm9wZXJ0eU5hbWUgVmVyc2lvbiAtTm90ZVByb3BlcnR5VmFsdWUgMCB9CiAgICAgICAgaWYgKC1ub3QgJHN0YXRlLlBTT2JqZWN0LlByb3BlcnRpZXNbJ1VwZGF0ZWRBdCddKSB7ICRzdGF0ZSB8IEFkZC1NZW1iZXIgLU5vdGVQcm9wZXJ0eU5hbWUgVXBkYXRlZEF0IC1Ob3RlUHJvcGVydHlWYWx1ZSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykgfQogICAgICAgIGlmICgtbm90ICRzdGF0ZS5QU09iamVjdC5Qcm9wZXJ0aWVzWydDdXJyZW50J10pIHsgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBDdXJyZW50IC1Ob3RlUHJvcGVydHlWYWx1ZSAkbnVsbCB9CiAgICAgICAgaWYgKC1ub3QgJHN0YXRlLlBTT2JqZWN0LlByb3BlcnRpZXNbJ1F1ZXVlJ10pIHsKICAgICAgICAgICAgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBRdWV1ZSAtTm90ZVByb3BlcnR5VmFsdWUgQCgpCiAgICAgICAgfQogICAgICAgIGVsc2VpZiAoLW5vdCAkc3RhdGUuUXVldWUpIHsKICAgICAgICAgICAgJHN0YXRlLlF1ZXVlID0gQCgpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkc3RhdGUKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIHF1ZXVlIHN0YXRlOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICAgICAgcmV0dXJuIE5ldy1RdWV1ZVN0YXRlT2JqZWN0CiAgICB9Cn0KCmZ1bmN0aW9uIFdyaXRlLVF1ZXVlU3RhdGUgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRTdGF0ZSkKCiAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRCYXNlRGlyCiAgICAkdGVtcFBhdGggPSBKb2luLVBhdGggJEJhc2VEaXIgKCJRdWV1ZS1TdGF0ZS17MH0uanNvbi50bXAiIC1mIFtHdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCdOJykpCiAgICB0cnkgewogICAgICAgICRTdGF0ZSB8IENvbnZlcnRUby1Kc29uIC1EZXB0aCA4IHwgU2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoICR0ZW1wUGF0aCAtRW5jb2RpbmcgVVRGOAogICAgICAgIE1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBQYXRoIC1EZXN0aW5hdGlvbiAkUXVldWVTdGF0ZVBhdGggLUZvcmNlCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkdGVtcFBhdGgpIHsKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICR0ZW1wUGF0aCAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1XaXRoUXVldWVTdGF0ZUxvY2sgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzY3JpcHRibG9ja10kU2NyaXB0QmxvY2spCgogICAgJG11dGV4ID0gTmV3LU9iamVjdCBTeXN0ZW0uVGhyZWFkaW5nLk11dGV4KCRmYWxzZSwgJFF1ZXVlU3RhdGVNdXRleE5hbWUpCiAgICAkaGFzTG9jayA9ICRmYWxzZQogICAgdHJ5IHsKICAgICAgICAkaGFzTG9jayA9ICRtdXRleC5XYWl0T25lKFtUaW1lU3Bhbl06OkZyb21TZWNvbmRzKDMwKSkKICAgICAgICBpZiAoLW5vdCAkaGFzTG9jaykgewogICAgICAgICAgICB0aHJvdyAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHF1ZXVlIHN0YXRlIGxvY2sgJyRRdWV1ZVN0YXRlTXV0ZXhOYW1lJy4iCiAgICAgICAgfQoKICAgICAgICAmICRTY3JpcHRCbG9jawogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgaWYgKCRoYXNMb2NrKSB7ICRtdXRleC5SZWxlYXNlTXV0ZXgoKSB9CiAgICAgICAgJG11dGV4LkRpc3Bvc2UoKQogICAgfQp9CgpmdW5jdGlvbiBVcGRhdGUtUXVldWVTdGF0ZSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3NjcmlwdGJsb2NrXSRTY3JpcHRCbG9jaykKCiAgICBJbnZva2UtV2l0aFF1ZXVlU3RhdGVMb2NrIC1TY3JpcHRCbG9jayB7CiAgICAgICAgJHN0YXRlID0gUmVhZC1RdWV1ZVN0YXRlCiAgICAgICAgJiAkU2NyaXB0QmxvY2sgJHN0YXRlCiAgICAgICAgJHN0YXRlLlZlcnNpb24gPSBbaW50NjRdJHN0YXRlLlZlcnNpb24gKyAxCiAgICAgICAgJHN0YXRlLlVwZGF0ZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgIFdyaXRlLVF1ZXVlU3RhdGUgLVN0YXRlICRzdGF0ZQogICAgICAgIHJldHVybiAkc3RhdGUKICAgIH0KfQoKZnVuY3Rpb24gR2V0LVF1ZXVlU3RhdGVTbmFwc2hvdCB7CiAgICBJbnZva2UtV2l0aFF1ZXVlU3RhdGVMb2NrIC1TY3JpcHRCbG9jayB7IFJlYWQtUXVldWVTdGF0ZSB9Cn0KCmZ1bmN0aW9uIE5ldy1RdWV1ZUl0ZW0gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcsJ1VwZ3JhZGVBbGwnKV1bc3RyaW5nXSRBY3Rpb24sCiAgICAgICAgW3N0cmluZ10kQWxpYXMsCiAgICAgICAgW3N0cmluZ10kUGFja2FnZUlkLAogICAgICAgIFtzdHJpbmddJERpc3BsYXlOYW1lLAogICAgICAgIFtWYWxpZGF0ZVNldCgnVXNlcicsJ1JlcXVpcmVkJywnU3lzdGVtJyldW3N0cmluZ10kU291cmNlID0gJ1VzZXInLAogICAgICAgIFtib29sXSRSZXF1aXJlZCA9ICRmYWxzZSwKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeVNpZAogICAgKQoKICAgIFtwc2N1c3RvbW9iamVjdF1bb3JkZXJlZF1AewogICAgICAgIElkID0gW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKQogICAgICAgIEFjdGlvbiA9ICRBY3Rpb24KICAgICAgICBBbGlhcyA9ICRBbGlhcwogICAgICAgIFBhY2thZ2VJZCA9ICRQYWNrYWdlSWQKICAgICAgICBEaXNwbGF5TmFtZSA9ICREaXNwbGF5TmFtZQogICAgICAgIFNvdXJjZSA9ICRTb3VyY2UKICAgICAgICBSZXF1aXJlZCA9IFtib29sXSRSZXF1aXJlZAogICAgICAgIFJlcXVlc3RlZEJ5ID0gJFJlcXVlc3RlZEJ5CiAgICAgICAgUmVxdWVzdGVkQnlTaWQgPSAkUmVxdWVzdGVkQnlTaWQKICAgICAgICBTdGF0ZSA9ICdRdWV1ZWQnCiAgICAgICAgU3RhZ2UgPSAnUXVldWVkJwogICAgICAgIFN0YWdlVGV4dCA9ICdJbiBXYXJ0ZXNjaGxhbmdlJwogICAgICAgIFByb2dyZXNzUGVyY2VudCA9ICRudWxsCiAgICAgICAgSXNJbmRldGVybWluYXRlID0gJGZhbHNlCiAgICAgICAgQ3JlYXRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgU3RhcnRlZEF0ID0gJG51bGwKICAgICAgICBGaW5pc2hlZEF0ID0gJG51bGwKICAgICAgICBFeGl0Q29kZSA9ICRudWxsCiAgICAgICAgTWVzc2FnZSA9ICRudWxsCiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSB7CiAgICBwYXJhbShbc3RyaW5nXSRMaW5lKQoKICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRMaW5lKSkgeyByZXR1cm4gJG51bGwgfQogICAgJG1hdGNoID0gW3JlZ2V4XTo6TWF0Y2goJExpbmUsICcoPzwhXGQpKDEwMHxbMS05XT9cZCkoPzpbXC4sXVxkKyk/XHMqJScpCiAgICBpZiAoLW5vdCAkbWF0Y2guU3VjY2VzcykgeyByZXR1cm4gJG51bGwgfQogICAgJHJhdyA9ICRtYXRjaC5Hcm91cHNbMV0uVmFsdWUKICAgICR2YWx1ZSA9IFtpbnRdJHJhdwogICAgaWYgKCR2YWx1ZSAtbHQgMCkgeyByZXR1cm4gMCB9CiAgICBpZiAoJHZhbHVlIC1ndCAxMDApIHsgcmV0dXJuIDEwMCB9CiAgICByZXR1cm4gJHZhbHVlCn0KCmZ1bmN0aW9uIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kSWQsCiAgICAgICAgW3N0cmluZ10kU3RhZ2UgPSAnUnVubmluZycsCiAgICAgICAgW3N0cmluZ10kU3RhZ2VUZXh0ID0gJ0FrdGlvbiBsw6R1ZnQuLi4nLAogICAgICAgIFtOdWxsYWJsZVtpbnRdXSRQcm9ncmVzc1BlcmNlbnQsCiAgICAgICAgW2Jvb2xdJElzSW5kZXRlcm1pbmF0ZSA9ICR0cnVlCiAgICApCgogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiBAKCRzdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uSWQgLWVxICRJZCkgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2UgPSAkU3RhZ2UKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlVGV4dCA9ICRTdGFnZVRleHQKICAgICAgICAgICAgICAgICRpdGVtLlByb2dyZXNzUGVyY2VudCA9ICRQcm9ncmVzc1BlcmNlbnQKICAgICAgICAgICAgICAgICRpdGVtLklzSW5kZXRlcm1pbmF0ZSA9ICRJc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgICRzdGF0ZS5DdXJyZW50ID0gW3BzY3VzdG9tb2JqZWN0XVtvcmRlcmVkXUB7CiAgICAgICAgICAgICAgICAgICAgSWQgPSAkaXRlbS5JZAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9ICRpdGVtLkFjdGlvbgogICAgICAgICAgICAgICAgICAgIEFsaWFzID0gJGl0ZW0uQWxpYXMKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9ICRpdGVtLkRpc3BsYXlOYW1lCiAgICAgICAgICAgICAgICAgICAgU3RhZ2UgPSAkU3RhZ2UKICAgICAgICAgICAgICAgICAgICBTdGFnZVRleHQgPSAkU3RhZ2VUZXh0CiAgICAgICAgICAgICAgICAgICAgUHJvZ3Jlc3NQZXJjZW50ID0gJFByb2dyZXNzUGVyY2VudAogICAgICAgICAgICAgICAgICAgIElzSW5kZXRlcm1pbmF0ZSA9ICRJc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1SZXF1aXJlZEFsaWFzU2V0IHsKICAgICRzZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICBmb3JlYWNoICgkYWxpYXMgaW4gQChHZXQtUmVxdWlyZWRBbGlhc2VzKSkgewogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGFsaWFzKSkgewogICAgICAgICAgICBbdm9pZF0kc2V0LkFkZChbc3RyaW5nXSRhbGlhcykKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJHNldAp9CgpmdW5jdGlvbiBBZGQtUXVldWVJdGVtIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV0kSXRlbSkKCiAgICAkcmVzdWx0ID0gJG51bGwKICAgICRudWxsID0gVXBkYXRlLVF1ZXVlU3RhdGUgLVNjcmlwdEJsb2NrIHsKICAgICAgICBwYXJhbSgkc3RhdGUpCiAgICAgICAgJHF1ZXVlID0gQCgkc3RhdGUuUXVldWUpCgogICAgICAgIGZvcmVhY2ggKCRleGlzdGluZyBpbiAkcXVldWUpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGV4aXN0aW5nKSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgaWYgKCRleGlzdGluZy5TdGF0ZSAtaW4gQCgnUXVldWVkJywnUnVubmluZycpIC1hbmQgJGV4aXN0aW5nLkFjdGlvbiAtZXEgJEl0ZW0uQWN0aW9uIC1hbmQgW3N0cmluZ106OkVxdWFscyhbc3RyaW5nXSRleGlzdGluZy5BbGlhcywgW3N0cmluZ10kSXRlbS5BbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgICAgICAkc2NyaXB0OlF1ZXVlQWRkUmVzdWx0ID0gW3BzY3VzdG9tb2JqZWN0XUB7IEFkZGVkID0gJGZhbHNlOyBJdGVtID0gJGV4aXN0aW5nIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkc3RhdGUuUXVldWUgPSBAKCRxdWV1ZSArICRJdGVtKQogICAgICAgICRzY3JpcHQ6UXVldWVBZGRSZXN1bHQgPSBbcHNjdXN0b21vYmplY3RdQHsgQWRkZWQgPSAkdHJ1ZTsgSXRlbSA9ICRJdGVtIH0KICAgIH0KCiAgICAkcmVzdWx0ID0gJHNjcmlwdDpRdWV1ZUFkZFJlc3VsdAogICAgJHNjcmlwdDpRdWV1ZUFkZFJlc3VsdCA9ICRudWxsCiAgICByZXR1cm4gJHJlc3VsdAp9CgpmdW5jdGlvbiBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldW3N0cmluZ10kQWN0aW9uLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRBbGlhcywKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeVNpZCwKICAgICAgICBbVmFsaWRhdGVTZXQoJ1VzZXInLCdSZXF1aXJlZCcpXVtzdHJpbmddJFNvdXJjZSA9ICdVc2VyJwogICAgKQoKICAgICRub3JtYWxpemVkQWxpYXMgPSAkQWxpYXMuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQogICAgJGFwcCA9IEdldC1BcHBDYXRhbG9nT2JqZWN0QnlBbGlhcyAtQWxpYXMgJG5vcm1hbGl6ZWRBbGlhcwogICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgIHRocm93ICJBbGlhcyAnJG5vcm1hbGl6ZWRBbGlhcycgaXMgbm90IGluIHRoZSBhbGxvd2xpc3QuIgogICAgfQoKICAgICRyZXF1aXJlZFNldCA9IEdldC1SZXF1aXJlZEFsaWFzU2V0CiAgICAkaXNSZXF1aXJlZCA9ICRyZXF1aXJlZFNldC5Db250YWlucygkbm9ybWFsaXplZEFsaWFzKQogICAgaWYgKCRBY3Rpb24gLWVxICdVbmluc3RhbGwnIC1hbmQgJGlzUmVxdWlyZWQpIHsKICAgICAgICB0aHJvdyAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgenVyIERlaW5zdGFsbGF0aW9uIGFuZ2VmcmFndCB3ZXJkZW4uJwogICAgfQoKICAgICRpdGVtID0gTmV3LVF1ZXVlSXRlbSBgCiAgICAgICAgLUFjdGlvbiAkQWN0aW9uIGAKICAgICAgICAtQWxpYXMgJG5vcm1hbGl6ZWRBbGlhcyBgCiAgICAgICAgLVBhY2thZ2VJZCAoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkgYAogICAgICAgIC1EaXNwbGF5TmFtZSAoW3N0cmluZ10kYXBwLkRpc3BsYXlOYW1lKSBgCiAgICAgICAgLVNvdXJjZSAkU291cmNlIGAKICAgICAgICAtUmVxdWlyZWQ6JGlzUmVxdWlyZWQgYAogICAgICAgIC1SZXF1ZXN0ZWRCeSAkUmVxdWVzdGVkQnkgYAogICAgICAgIC1SZXF1ZXN0ZWRCeVNpZCAkUmVxdWVzdGVkQnlTaWQKCiAgICByZXR1cm4gQWRkLVF1ZXVlSXRlbSAtSXRlbSAkaXRlbQp9CgpmdW5jdGlvbiBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZCB7CiAgICAkYWRkZWRDb3VudCA9IDAKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7IHJldHVybiAwIH0KICAgIGlmICgtbm90IChUZXN0LVJlcXVpcmVkRW5mb3JjZW1lbnRFbmFibGVkKSkgeyByZXR1cm4gMCB9CgogICAgJGluc3RhbGxlZFNldCA9IEdldC1JbnN0YWxsZWRQYWNrYWdlSWRTZXQKICAgIGZvcmVhY2ggKCRhbGlhcyBpbiBAKEdldC1SZXF1aXJlZEFsaWFzZXMpKSB7CiAgICAgICAgJGFwcCA9IEdldC1BcHBDYXRhbG9nT2JqZWN0QnlBbGlhcyAtQWxpYXMgJGFsaWFzCiAgICAgICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlJlcXVpcmVkIGFsaWFzICckYWxpYXMnIGlzIG5vdCBwcmVzZW50IGluIGNhdGFsb2cgcG9saWN5OyBza2lwcGluZy4iICdXQVJOJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKCRpbnN0YWxsZWRTZXQuQ29udGFpbnMoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkpIHsKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSAtQWN0aW9uIEluc3RhbGwgLUFsaWFzICRhbGlhcyAtUmVxdWVzdGVkQnkgJ1BvbGljeScgLVJlcXVlc3RlZEJ5U2lkICdQb2xpY3knIC1Tb3VyY2UgUmVxdWlyZWQKICAgICAgICBpZiAoJHJlc3VsdCAtYW5kICRyZXN1bHQuQWRkZWQpIHsKICAgICAgICAgICAgJGFkZGVkQ291bnQrKwogICAgICAgICAgICBXcml0ZS1Mb2cgIlF1ZXVlZCByZXF1aXJlZCBzb2Z0d2FyZSBhbGlhcyAnJGFsaWFzJyBwYWNrYWdlICckKCRhcHAuUGFja2FnZUlkKScuIgogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJGFkZGVkQ291bnQKfQoKZnVuY3Rpb24gSW52b2tlLVdpdGhXaW5nZXRMb2NrIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc2NyaXB0YmxvY2tdJFNjcmlwdEJsb2NrLAogICAgICAgIFtpbnRdJFRpbWVvdXRTZWNvbmRzID0gNzIwMAogICAgKQoKICAgICRtdXRleCA9IE5ldy1PYmplY3QgU3lzdGVtLlRocmVhZGluZy5NdXRleCgkZmFsc2UsICRXaW5nZXRNdXRleE5hbWUpCiAgICAkaGFzTG9jayA9ICRmYWxzZQoKICAgIHRyeSB7CiAgICAgICAgJGhhc0xvY2sgPSAkbXV0ZXguV2FpdE9uZShbVGltZVNwYW5dOjpGcm9tU2Vjb25kcygkVGltZW91dFNlY29uZHMpKQogICAgICAgIGlmICgtbm90ICRoYXNMb2NrKSB7CiAgICAgICAgICAgIHRocm93ICJUaW1lZCBvdXQgd2FpdGluZyBmb3Igd2luZ2V0IGxvY2sgJyRXaW5nZXRNdXRleE5hbWUnLiIKICAgICAgICB9CgogICAgICAgICYgJFNjcmlwdEJsb2NrCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoJGhhc0xvY2spIHsKICAgICAgICAgICAgJG11dGV4LlJlbGVhc2VNdXRleCgpCiAgICAgICAgfQogICAgICAgICRtdXRleC5EaXNwb3NlKCkKICAgIH0KfQoKZnVuY3Rpb24gVGVzdC1XaW5nZXRMb2NrQXZhaWxhYmxlIHsKICAgICRtdXRleCA9IE5ldy1PYmplY3QgU3lzdGVtLlRocmVhZGluZy5NdXRleCgkZmFsc2UsICRXaW5nZXRNdXRleE5hbWUpCiAgICAkaGFzTG9jayA9ICRmYWxzZQoKICAgIHRyeSB7CiAgICAgICAgJGhhc0xvY2sgPSAkbXV0ZXguV2FpdE9uZSgwKQogICAgICAgIHJldHVybiAkaGFzTG9jawogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgaWYgKCRoYXNMb2NrKSB7CiAgICAgICAgICAgICRtdXRleC5SZWxlYXNlTXV0ZXgoKQogICAgICAgIH0KICAgICAgICAkbXV0ZXguRGlzcG9zZSgpCiAgICB9Cn0KCmZ1bmN0aW9uIENvbnZlcnRUby1Qcm9jZXNzQXJndW1lbnQgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFZhbHVlKQoKICAgIGlmICgkVmFsdWUgLW1hdGNoICdbXHMiXScpIHsKICAgICAgICByZXR1cm4gJyJ7MH0iJyAtZiAoJFZhbHVlLlJlcGxhY2UoJyInLCAnXCInKSkKICAgIH0KCiAgICByZXR1cm4gJFZhbHVlCn0KCmZ1bmN0aW9uIEdldC1Xb3JrZXJTY3JpcHRQYXRoIHsKICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRMb2NhbFNjcmlwdFBhdGgpIHsKICAgICAgICByZXR1cm4gJExvY2FsU2NyaXB0UGF0aAogICAgfQoKICAgIGlmICgkUFNDb21tYW5kUGF0aCAtYW5kIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRQU0NvbW1hbmRQYXRoKSkgewogICAgICAgIHJldHVybiAkUFNDb21tYW5kUGF0aAogICAgfQoKICAgIHRocm93ICdDb3VsZCBub3QgZGV0ZXJtaW5lIHdvcmtlciBzY3JpcHQgcGF0aC4nCn0KCmZ1bmN0aW9uIFN0YXJ0LVNvZnR3YXJla2F0YWxvZ1dvcmtlciB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1ZhbGlkYXRlU2V0KCdBcHBseVBvbGljeScsJ1Byb2Nlc3NSZXF1ZXN0JywnUHJvY2Vzc1F1ZXVlJyldW3N0cmluZ10kV29ya2VyTW9kZSwKICAgICAgICBbVmFsaWRhdGVTZXQoJ0luc3RhbGwnLCdVbmluc3RhbGwnKV1bc3RyaW5nXSRXb3JrZXJBY3Rpb24gPSAnSW5zdGFsbCcsCiAgICAgICAgW3N0cmluZ10kV29ya2VyQWxpYXMsCiAgICAgICAgW3N0cmluZ10kV29ya2VyUmVxdWVzdGVkQnksCiAgICAgICAgW3N0cmluZ10kV29ya2VyUmVxdWVzdGVkQnlTaWQKICAgICkKCiAgICAkd29ya2VyU2NyaXB0ID0gR2V0LVdvcmtlclNjcmlwdFBhdGgKICAgICRhcmdzID0gQCgKICAgICAgICAnLU5vUHJvZmlsZScsCiAgICAgICAgJy1FeGVjdXRpb25Qb2xpY3knLCAnQnlwYXNzJywKICAgICAgICAnLUZpbGUnLCAkd29ya2VyU2NyaXB0LAogICAgICAgICctTW9kZScsICRXb3JrZXJNb2RlCiAgICApCgogICAgaWYgKCRXb3JrZXJNb2RlIC1lcSAnUHJvY2Vzc1JlcXVlc3QnKSB7CiAgICAgICAgJGFyZ3MgKz0gQCgnLVJlcXVlc3RBY3Rpb24nLCAkV29ya2VyQWN0aW9uLCAnLUFwcEFsaWFzJywgJFdvcmtlckFsaWFzKQoKICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRXb3JrZXJSZXF1ZXN0ZWRCeSkpIHsKICAgICAgICAgICAgJGFyZ3MgKz0gQCgnLVJlcXVlc3RlZEJ5JywgJFdvcmtlclJlcXVlc3RlZEJ5KQogICAgICAgIH0KCiAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkV29ya2VyUmVxdWVzdGVkQnlTaWQpKSB7CiAgICAgICAgICAgICRhcmdzICs9IEAoJy1SZXF1ZXN0ZWRCeVNpZCcsICRXb3JrZXJSZXF1ZXN0ZWRCeVNpZCkKICAgICAgICB9CiAgICB9CgogICAgJGFyZ3VtZW50TGluZSA9IChAKCRhcmdzKSB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVByb2Nlc3NBcmd1bWVudCAtVmFsdWUgKFtzdHJpbmddJF8pIH0pIC1qb2luICcgJwogICAgU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJFBvd2VyU2hlbGxFeGUgLUFyZ3VtZW50TGlzdCAkYXJndW1lbnRMaW5lIC1XaW5kb3dTdHlsZSBIaWRkZW4gfCBPdXQtTnVsbAp9CgpmdW5jdGlvbiBTdGFydC1RdWV1ZVdvcmtlciB7CiAgICBTdGFydC1Tb2Z0d2FyZWthdGFsb2dXb3JrZXIgLVdvcmtlck1vZGUgUHJvY2Vzc1F1ZXVlCn0KCmZ1bmN0aW9uIEFkZC1EYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXIgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnQXBwbHlQb2xpY3knLCdQcm9jZXNzUXVldWUnKV1bc3RyaW5nXSRXb3JrZXJNb2RlKQoKICAgIGlmICgtbm90ICRzY3JpcHQ6RGFlbW9uUG9zdFJlc3BvbnNlV29ya2VycykgewogICAgICAgICRzY3JpcHQ6RGFlbW9uUG9zdFJlc3BvbnNlV29ya2VycyA9IEAoKQogICAgfQogICAgJHNjcmlwdDpEYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXJzID0gQCgkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgKyAkV29ya2VyTW9kZSkKfQoKZnVuY3Rpb24gSW52b2tlLURhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgewogICAgZm9yZWFjaCAoJHdvcmtlck1vZGUgaW4gQCgkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgfCBTZWxlY3QtT2JqZWN0IC1VbmlxdWUpKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgU3RhcnQtU29mdHdhcmVrYXRhbG9nV29ya2VyIC1Xb3JrZXJNb2RlICR3b3JrZXJNb2RlCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3Qgc3RhcnQgcG9zdC1yZXNwb25zZSB3b3JrZXIgJyR3b3JrZXJNb2RlJzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIH0KICAgIH0KCiAgICAkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgPSBAKCkKfQoKZnVuY3Rpb24gR2V0LVdpbmdldFBhdGggewogICAgJGNhbmRpZGF0ZXMgPSBAKCkKCiAgICB0cnkgewogICAgICAgICRjbWQgPSBHZXQtQ29tbWFuZCB3aW5nZXQuZXhlIC1FcnJvckFjdGlvbiBTdG9wCiAgICAgICAgaWYgKCRjbWQgLWFuZCAkY21kLlNvdXJjZSkgewogICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY21kLlNvdXJjZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KCiAgICB0cnkgewogICAgICAgICRwYWNrYWdlcyA9IEdldC1BcHB4UGFja2FnZSAtQWxsVXNlcnMgLU5hbWUgTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXIgLUVycm9yQWN0aW9uIFN0b3AgfAogICAgICAgICAgICBXaGVyZS1PYmplY3QgeyAkXy5JbnN0YWxsTG9jYXRpb24gfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IFZlcnNpb24gLURlc2NlbmRpbmcKCiAgICAgICAgZm9yZWFjaCAoJHBhY2thZ2UgaW4gJHBhY2thZ2VzKSB7CiAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJHBhY2thZ2UuSW5zdGFsbExvY2F0aW9uICd3aW5nZXQuZXhlJwogICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY2FuZGlkYXRlCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgJHdpbmRvd3NBcHBzUm9vdCA9IEpvaW4tUGF0aCAkZW52OlByb2dyYW1GaWxlcyAnV2luZG93c0FwcHMnCiAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkd2luZG93c0FwcHNSb290KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJGl0ZW1zID0gR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGggJHdpbmRvd3NBcHBzUm9vdCAtRGlyZWN0b3J5IC1FcnJvckFjdGlvbiBTdG9wIHwKICAgICAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7ICRfLk5hbWUgLWxpa2UgJ01pY3Jvc29mdC5EZXNrdG9wQXBwSW5zdGFsbGVyXypfOHdla3liM2Q4YmJ3ZScgfSB8CiAgICAgICAgICAgICAgICBTb3J0LU9iamVjdCBOYW1lIC1EZXNjZW5kaW5nCgogICAgICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiAkaXRlbXMpIHsKICAgICAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJGl0ZW0uRnVsbE5hbWUgJ3dpbmdldC5leGUnCiAgICAgICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgJGNhbmRpZGF0ZXMgKz0gJGNhbmRpZGF0ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9CgogICAgJHJlc29sdmVkID0gJGNhbmRpZGF0ZXMgfCBTZWxlY3QtT2JqZWN0IC1VbmlxdWUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxCiAgICByZXR1cm4gJHJlc29sdmVkCn0KCmZ1bmN0aW9uIEVuc3VyZS1XaW5nZXRBdmFpbGFibGUgewogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYWxyZWFkeSBhdmFpbGFibGUgYXQ6ICR3aW5nZXRQYXRoIgogICAgICAgIHJldHVybiAkd2luZ2V0UGF0aAogICAgfQoKICAgIFdyaXRlLUxvZyAnd2luZ2V0LmV4ZSBub3QgZm91bmQuJwoKICAgICRpc0xvY2FsU3lzdGVtID0gJGZhbHNlCiAgICB0cnkgewogICAgICAgICRpc0xvY2FsU3lzdGVtID0gW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuV2luZG93c0lkZW50aXR5XTo6R2V0Q3VycmVudCgpLklzU3lzdGVtCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgaWYgKCRpc0xvY2FsU3lzdGVtKSB7CiAgICAgICAgV3JpdGUtTG9nICJBcHAgSW5zdGFsbGVyIHBhY2thZ2UgcmVnaXN0cmF0aW9uIGNhbm5vdCBydW4gYXMgTG9jYWxTeXN0ZW07IHNraXBwaW5nIEFkZC1BcHB4UGFja2FnZSBmYWxsYmFjayBmb3IgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iICdFUlJPUicKICAgICAgICBXcml0ZS1Mb2cgJ3dpbmdldCBpcyB1bmF2YWlsYWJsZS4gSW5zdGFsbC9wcm92aXNpb24gQXBwIEluc3RhbGxlciwgb3IgdmVyaWZ5IHdpbmdldCBwYXRoIGRpc2NvdmVyeSBmb3IgdGhpcyBkZXZpY2UuJyAnRVJST1InCiAgICAgICAgcmV0dXJuICRudWxsCiAgICB9CgogICAgV3JpdGUtTG9nICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIEFwcCBJbnN0YWxsZXIgcGFja2FnZSBmYW1pbHkgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBBZGQtQXBweFBhY2thZ2UgLVJlZ2lzdGVyQnlGYW1pbHlOYW1lIC1NYWluUGFja2FnZSAkQXBwSW5zdGFsbGVyRmFtaWx5TmFtZQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDMKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkFkZC1BcHB4UGFja2FnZSByZWdpc3RyYXRpb24gYXR0ZW1wdCBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CgogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYmVjYW1lIGF2YWlsYWJsZSBhZnRlciBBcHAgSW5zdGFsbGVyIHJlZ2lzdHJhdGlvbjogJHdpbmdldFBhdGgiCiAgICAgICAgcmV0dXJuICR3aW5nZXRQYXRoCiAgICB9CgogICAgV3JpdGUtTG9nICJ3aW5nZXQgaXMgc3RpbGwgdW5hdmFpbGFibGUgYWZ0ZXIgQXBwIEluc3RhbGxlciByZWdpc3RyYXRpb24gYXR0ZW1wdC4iICdFUlJPUicKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBOZXctVXNlclJlcXVlc3RUb29sIHsKICAgICRwaXBlTGl0ZXJhbCAgID0gJFBpcGVOYW1lLlJlcGxhY2UoIiciLCAiJyciKQoKJGNvbnRlbnQgPSBAIgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtzdHJpbmddYCRBcHBBbGlhcywKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXQogICAgW3N0cmluZ11gJEFjdGlvbiA9ICdJbnN0YWxsJywKICAgIFtzd2l0Y2hdYCRVbmluc3RhbGwsCiAgICBbc3dpdGNoXWAkTGlzdAopCgpTZXQtU3RyaWN0TW9kZSAtVmVyc2lvbiBMYXRlc3QKYCRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCmAkUGlwZU5hbWUgPSAnJHBpcGVMaXRlcmFsJwoKZnVuY3Rpb24gSW52b2tlLUNhdGFsb2dEYWVtb24gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1bc3RyaW5nXWAkQ29tbWFuZCwKICAgICAgICBbc3RyaW5nXWAkQWxpYXMKICAgICkKCiAgICBgJHBheWxvYWQgPSBbb3JkZXJlZF1AewogICAgICAgIENvbW1hbmQgID0gYCRDb21tYW5kCiAgICAgICAgQXBwQWxpYXMgPSBgJEFsaWFzCiAgICB9CiAgICBgJGpzb24gPSBgJHBheWxvYWQgfCBDb252ZXJ0VG8tSnNvbiAtQ29tcHJlc3MKCiAgICBgJGVuY29kaW5nID0gTmV3LU9iamVjdCBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoYCRmYWxzZSkKICAgIGAkY2xpZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuTmFtZWRQaXBlQ2xpZW50U3RyZWFtIC1Bcmd1bWVudExpc3QgQCgKICAgICAgICAnLicsCiAgICAgICAgYCRQaXBlTmFtZSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVEaXJlY3Rpb25dOjpJbk91dCwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVPcHRpb25zXTo6Tm9uZSwKICAgICAgICBbU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5Ub2tlbkltcGVyc29uYXRpb25MZXZlbF06OkltcGVyc29uYXRpb24KICAgICkKCiAgICB0cnkgewogICAgICAgIGAkY2xpZW50LkNvbm5lY3QoMTAwMDApCiAgICAgICAgYCRyZWFkZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1SZWFkZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1Xcml0ZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIuQXV0b0ZsdXNoID0gYCR0cnVlCiAgICAgICAgYCR3cml0ZXIuV3JpdGVMaW5lKGAkanNvbikKCiAgICAgICAgYCRyZWFkVGFzayA9IGAkcmVhZGVyLlJlYWRMaW5lQXN5bmMoKQogICAgICAgIGlmICgtbm90IGAkcmVhZFRhc2suV2FpdCgxNTAwMCkpIHsKICAgICAgICAgICAgdGhyb3cgJ1plaXTDvGJlcnNjaHJlaXR1bmcgYmVpbSBXYXJ0ZW4gYXVmIEFudHdvcnQgZGVzIFNvZnR3YXJla2F0YWxvZy1EaWVuc3Rlcy4nCiAgICAgICAgfQogICAgICAgIGAkbGluZSA9IGAkcmVhZFRhc2suUmVzdWx0CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRsaW5lKSkgewogICAgICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaGF0IGtlaW5lIEFudHdvcnQgZ2VzZW5kZXQuJwogICAgICAgIH0KCiAgICAgICAgYCRyZXNwb25zZSA9IGAkbGluZSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBpZiAoLW5vdCBgJHJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgdGhyb3cgKFtzdHJpbmddYCRyZXNwb25zZS5NZXNzYWdlKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGAkcmVzcG9uc2UKICAgIH0KICAgIGNhdGNoIFtTeXN0ZW0uVGltZW91dEV4Y2VwdGlvbl0gewogICAgICAgIHRocm93ICdEZXIgU29mdHdhcmVrYXRhbG9nLURpZW5zdCBpc3QgbmljaHQgZXJyZWljaGJhciBvZGVyIHN0YXJ0ZXQgbm9jaC4gQml0dGUgdmVyc3VjaGVuIFNpZSBlcyBlcm5ldXQuJwogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgYCRjbGllbnQuRGlzcG9zZSgpCiAgICB9Cn0KCmlmIChgJFVuaW5zdGFsbCkgewogICAgYCRBY3Rpb24gPSAnVW5pbnN0YWxsJwp9CgppZiAoYCRMaXN0KSB7CiAgICBgJHJlc3BvbnNlID0gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgJ0dldENhdGFsb2cnCiAgICBXcml0ZS1Ib3N0ICdGcmVpZ2VnZWJlbmUgQW53ZW5kdW5nZW46JwogICAgQChgJHJlc3BvbnNlLkNhdGFsb2cpIHwgU29ydC1PYmplY3QgRGlzcGxheU5hbWUgfCBGb3JFYWNoLU9iamVjdCB7CiAgICAgICAgV3JpdGUtSG9zdCAoIiAtIHswfSBbezF9XSA6IHsyfSIgLWYgYCRfLkRpc3BsYXlOYW1lLCBgJF8uQWxpYXMsIGAkXy5EZXNjcmlwdGlvbikKICAgIH0KICAgIGV4aXQgMAp9CgppZiAoLW5vdCBgJEFwcEFsaWFzKSB7CiAgICB0aHJvdyAnU2llIG3DvHNzZW4gLUFwcEFsaWFzIGFuZ2ViZW4gb2RlciAtTGlzdCB2ZXJ3ZW5kZW4uJwp9CgpgJGFsaWFzID0gYCRBcHBBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCmAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCBgJEFjdGlvbiAtQWxpYXMgYCRhbGlhcwoKaWYgKGAkQWN0aW9uIC1lcSAnVW5pbnN0YWxsJykgewogICAgV3JpdGUtSG9zdCAiRGVpbnN0YWxsYXRpb24gZsO8ciAnYCRhbGlhcycgZWluZ2VyZWlodC4iCn0KZWxzZSB7CiAgICBXcml0ZS1Ib3N0ICJJbnN0YWxsYXRpb24gZsO8ciAnYCRhbGlhcycgZWluZ2VyZWlodC4iCn0KCmlmIChgJHJlc3BvbnNlLk1lc3NhZ2UpIHsKICAgIFdyaXRlLUhvc3QgYCRyZXNwb25zZS5NZXNzYWdlCn0KIkAKCiAgICBXcml0ZS1UZXh0RmlsZSAtUGF0aCAkUmVxdWVzdFRvb2xQYXRoIC1Db250ZW50ICRjb250ZW50IC1FbmNvZGluZyBVdGY4Qm9tCiAgICBTZXQtRmlsZUFjbEFkbWluc09ubHkgLVBhdGggJFJlcXVlc3RUb29sUGF0aAp9CgpmdW5jdGlvbiBOZXctQ2F0YWxvZ0d1aSB7CiAgICAkcGlwZUxpdGVyYWwgICAgICA9ICRQaXBlTmFtZS5SZXBsYWNlKCInIiwgIicnIikKICAgICR0aXRsZUxpdGVyYWwgICAgID0gJENhdGFsb2dEaXNwbGF5TmFtZS5SZXBsYWNlKCInIiwgIicnIikKICAgICRsb2dMaXRlcmFsICAgICAgID0gJExvZ0ZpbGUuUmVwbGFjZSgiJyIsICInJyIpCiAgICAkaW5zdGFsbGVkTGl0ZXJhbCA9ICRJbnN0YWxsZWRQYWNrYWdlc1BhdGguUmVwbGFjZSgiJyIsICInJyIpCiAgICAkcXVldWVTdGF0ZUxpdGVyYWwgPSAkUXVldWVTdGF0ZVBhdGguUmVwbGFjZSgiJyIsICInJyIpCgokY29udGVudCA9IEAiCkFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLldpbmRvd3MuRm9ybXMKQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uRHJhd2luZwpbU3lzdGVtLldpbmRvd3MuRm9ybXMuQXBwbGljYXRpb25dOjpFbmFibGVWaXN1YWxTdHlsZXMoKQoKaWYgKC1ub3QgKCdMaXN0Vmlld0NvbHVtblNvcnRlcicgLWFzIFt0eXBlXSkpIHsKQWRkLVR5cGUgLVR5cGVEZWZpbml0aW9uIEAnCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwp1c2luZyBTeXN0ZW0uV2luZG93cy5Gb3JtczsKCnB1YmxpYyBjbGFzcyBMaXN0Vmlld0NvbHVtblNvcnRlciA6IElDb21wYXJlciB7CiAgICBwdWJsaWMgaW50IENvbHVtbiA9IDA7CiAgICBwdWJsaWMgU29ydE9yZGVyIE9yZGVyID0gU29ydE9yZGVyLkFzY2VuZGluZzsKCiAgICBwdWJsaWMgaW50IENvbXBhcmUob2JqZWN0IHgsIG9iamVjdCB5KSB7CiAgICAgICAgdmFyIGl0ZW1YID0geCBhcyBMaXN0Vmlld0l0ZW07CiAgICAgICAgdmFyIGl0ZW1ZID0geSBhcyBMaXN0Vmlld0l0ZW07CiAgICAgICAgc3RyaW5nIGEgPSBzdHJpbmcuRW1wdHk7CiAgICAgICAgc3RyaW5nIGIgPSBzdHJpbmcuRW1wdHk7CgogICAgICAgIGlmIChpdGVtWCAhPSBudWxsICYmIGl0ZW1YLlN1Ykl0ZW1zLkNvdW50ID4gQ29sdW1uKSB7CiAgICAgICAgICAgIGEgPSBpdGVtWC5TdWJJdGVtc1tDb2x1bW5dLlRleHQ7CiAgICAgICAgfQogICAgICAgIGlmIChpdGVtWSAhPSBudWxsICYmIGl0ZW1ZLlN1Ykl0ZW1zLkNvdW50ID4gQ29sdW1uKSB7CiAgICAgICAgICAgIGIgPSBpdGVtWS5TdWJJdGVtc1tDb2x1bW5dLlRleHQ7CiAgICAgICAgfQoKICAgICAgICBpbnQgcmVzdWx0ID0gU3RyaW5nQ29tcGFyZXIuQ3VycmVudEN1bHR1cmVJZ25vcmVDYXNlLkNvbXBhcmUoYSwgYik7CiAgICAgICAgcmV0dXJuIE9yZGVyID09IFNvcnRPcmRlci5EZXNjZW5kaW5nID8gLXJlc3VsdCA6IHJlc3VsdDsKICAgIH0KfQonQCAtUmVmZXJlbmNlZEFzc2VtYmxpZXMgQCgnU3lzdGVtLmRsbCcsJ1N5c3RlbS5XaW5kb3dzLkZvcm1zLmRsbCcpCn0KCmlmICgtbm90ICgnU2hlbGxJY29uRXh0cmFjdG9yJyAtYXMgW3R5cGVdKSkgewpBZGQtVHlwZSAtVHlwZURlZmluaXRpb24gQCcKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CgpwdWJsaWMgc3RhdGljIGNsYXNzIFNoZWxsSWNvbkV4dHJhY3RvciB7CiAgICBbRGxsSW1wb3J0KCJzaGVsbDMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNvZGUpXQogICAgcHVibGljIHN0YXRpYyBleHRlcm4gdWludCBFeHRyYWN0SWNvbkV4KHN0cmluZyBzekZpbGVOYW1lLCBpbnQgbkljb25JbmRleCwgSW50UHRyW10gcGhpY29uTGFyZ2UsIEludFB0cltdIHBoaWNvblNtYWxsLCB1aW50IG5JY29ucyk7CgogICAgW0RsbEltcG9ydCgidXNlcjMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXQogICAgW3JldHVybjogTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQm9vbCldCnB1YmxpYyBzdGF0aWMgZXh0ZXJuIGJvb2wgRGVzdHJveUljb24oSW50UHRyIGhJY29uKTsKfQonQAp9CgpTZXQtU3RyaWN0TW9kZSAtVmVyc2lvbiBMYXRlc3QKYCRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCmAkUGlwZU5hbWUgPSAnJHBpcGVMaXRlcmFsJwpgJENhdGFsb2dUaXRsZSA9ICckdGl0bGVMaXRlcmFsJwpgJExvZ0ZpbGUgPSAnJGxvZ0xpdGVyYWwnCmAkSW5zdGFsbGVkUGFja2FnZXNQYXRoID0gJyRpbnN0YWxsZWRMaXRlcmFsJwpgJFF1ZXVlU3RhdGVQYXRoID0gJyRxdWV1ZVN0YXRlTGl0ZXJhbCcKYCRBbGxvd1VzZXJJbnN0YWxscyA9IGAkdHJ1ZQpgJEFsbG93VXNlclVuaW5zdGFsbCA9IGAkdHJ1ZQpgJFJlcXVpcmVkQWxpYXNTZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCmAkTGFzdFN0YXRlVmVyc2lvbiA9IC0xCmAkTGFzdFF1ZXVlID0gQCgpCmAkTGFzdEN1cnJlbnQgPSBgJG51bGwKYCRMYXN0SW5zdGFsbGVkSWRzID0gQCgpCgpmdW5jdGlvbiBTZXQtRm9ybUljb24gewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1gJEZvcm0pCgogICAgYCRsYXJnZSA9IGAkbnVsbAogICAgYCRzbWFsbCA9IGAkbnVsbAoKICAgIHRyeSB7CiAgICAgICAgYCRpY29uRmlsZSA9IEpvaW4tUGF0aCBgJGVudjpTeXN0ZW1Sb290ICdTeXN0ZW0zMlxzaGVsbDMyLmRsbCcKICAgICAgICBgJGxhcmdlID0gTmV3LU9iamVjdCBTeXN0ZW0uSW50UHRyW10gMQogICAgICAgIGAkc21hbGwgPSBOZXctT2JqZWN0IFN5c3RlbS5JbnRQdHJbXSAxCiAgICAgICAgYCRjb3VudCA9IFtTaGVsbEljb25FeHRyYWN0b3JdOjpFeHRyYWN0SWNvbkV4KGAkaWNvbkZpbGUsIDgwLCBgJGxhcmdlLCBgJHNtYWxsLCAxKQoKICAgICAgICBpZiAoYCRjb3VudCAtZ3QgMCkgewogICAgICAgICAgICBgJHVzZUhhbmRsZSA9IFtJbnRQdHJdOjpaZXJvCiAgICAgICAgICAgIGlmIChgJHNtYWxsWzBdIC1uZSBbSW50UHRyXTo6WmVybykgewogICAgICAgICAgICAgICAgYCR1c2VIYW5kbGUgPSBgJHNtYWxsWzBdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmIChgJGxhcmdlWzBdIC1uZSBbSW50UHRyXTo6WmVybykgewogICAgICAgICAgICAgICAgYCR1c2VIYW5kbGUgPSBgJGxhcmdlWzBdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChgJHVzZUhhbmRsZSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIGAkaWNvbiA9IFtTeXN0ZW0uRHJhd2luZy5JY29uXTo6RnJvbUhhbmRsZShgJHVzZUhhbmRsZSkKICAgICAgICAgICAgICAgIGAkRm9ybS5JY29uID0gW1N5c3RlbS5EcmF3aW5nLkljb25dYCRpY29uLkNsb25lKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChgJHNtYWxsIC1hbmQgYCRzbWFsbFswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIFt2b2lkXVtTaGVsbEljb25FeHRyYWN0b3JdOjpEZXN0cm95SWNvbihgJHNtYWxsWzBdKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChgJGxhcmdlIC1hbmQgYCRsYXJnZVswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIFt2b2lkXVtTaGVsbEljb25FeHRyYWN0b3JdOjpEZXN0cm95SWNvbihgJGxhcmdlWzBdKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1DYXRhbG9nRGFlbW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldW3N0cmluZ11gJENvbW1hbmQsCiAgICAgICAgW3N0cmluZ11gJEFsaWFzCiAgICApCgogICAgYCRwYXlsb2FkID0gW29yZGVyZWRdQHsKICAgICAgICBDb21tYW5kICA9IGAkQ29tbWFuZAogICAgICAgIEFwcEFsaWFzID0gYCRBbGlhcwogICAgfQogICAgYCRqc29uID0gYCRwYXlsb2FkIHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzCgogICAgYCRlbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKGAkZmFsc2UpCiAgICBgJGNsaWVudCA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLk5hbWVkUGlwZUNsaWVudFN0cmVhbSAtQXJndW1lbnRMaXN0IEAoCiAgICAgICAgJy4nLAogICAgICAgIGAkUGlwZU5hbWUsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlRGlyZWN0aW9uXTo6SW5PdXQsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlT3B0aW9uc106Ok5vbmUsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuVG9rZW5JbXBlcnNvbmF0aW9uTGV2ZWxdOjpJbXBlcnNvbmF0aW9uCiAgICApCgogICAgdHJ5IHsKICAgICAgICBgJGNsaWVudC5Db25uZWN0KDEwMDAwKQogICAgICAgIGAkcmVhZGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uU3RyZWFtUmVhZGVyKGAkY2xpZW50LCBgJGVuY29kaW5nKQogICAgICAgIGAkd3JpdGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uU3RyZWFtV3JpdGVyKGAkY2xpZW50LCBgJGVuY29kaW5nKQogICAgICAgIGAkd3JpdGVyLkF1dG9GbHVzaCA9IGAkdHJ1ZQogICAgICAgIGAkd3JpdGVyLldyaXRlTGluZShgJGpzb24pCgogICAgICAgIGAkcmVhZFRhc2sgPSBgJHJlYWRlci5SZWFkTGluZUFzeW5jKCkKICAgICAgICBpZiAoLW5vdCBgJHJlYWRUYXNrLldhaXQoMTUwMDApKSB7CiAgICAgICAgICAgIHRocm93ICdaZWl0w7xiZXJzY2hyZWl0dW5nIGJlaW0gV2FydGVuIGF1ZiBBbnR3b3J0IGRlcyBTb2Z0d2FyZWthdGFsb2ctRGllbnN0ZXMuJwogICAgICAgIH0KICAgICAgICBgJGxpbmUgPSBgJHJlYWRUYXNrLlJlc3VsdAogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKGAkbGluZSkpIHsKICAgICAgICAgICAgdGhyb3cgJ0RlciBTb2Z0d2FyZWthdGFsb2ctRGllbnN0IGhhdCBrZWluZSBBbnR3b3J0IGdlc2VuZGV0LicKICAgICAgICB9CgogICAgICAgIGAkcmVzcG9uc2UgPSBgJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgaWYgKC1ub3QgYCRyZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgIHRocm93IChbc3RyaW5nXWAkcmVzcG9uc2UuTWVzc2FnZSkKICAgICAgICB9CgogICAgICAgIHJldHVybiBgJHJlc3BvbnNlCiAgICB9CiAgICBjYXRjaCBbU3lzdGVtLlRpbWVvdXRFeGNlcHRpb25dIHsKICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaXN0IG5pY2h0IGVycmVpY2hiYXIgb2RlciBzdGFydGV0IG5vY2guIEJpdHRlIHZlcnN1Y2hlbiBTaWUgZXMgZXJuZXV0LicKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGAkY2xpZW50LkRpc3Bvc2UoKQogICAgfQp9CgpmdW5jdGlvbiBOZXctQXBwUmVxdWVzdCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtzdHJpbmddYCRBbGlhcywKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXVtzdHJpbmddYCRBY3Rpb24KICAgICkKCiAgICByZXR1cm4gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgYCRBY3Rpb24gLUFsaWFzIChgJEFsaWFzLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkpCn0KCmZ1bmN0aW9uIEdldC1DYXRhbG9nQXBwcyB7CiAgICBgJHJlc3BvbnNlID0gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgJ0dldFN0YXRlJwogICAgYCRzY3JpcHQ6QWxsb3dVc2VySW5zdGFsbHMgPSBbYm9vbF1gJHJlc3BvbnNlLkFsbG93VXNlckluc3RhbGxzCiAgICBgJHNjcmlwdDpBbGxvd1VzZXJVbmluc3RhbGwgPSBbYm9vbF1gJHJlc3BvbnNlLkFsbG93VXNlclVuaW5zdGFsbAogICAgYCRzY3JpcHQ6UmVxdWlyZWRBbGlhc1NldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgIGZvcmVhY2ggKGAkYWxpYXMgaW4gQChgJHJlc3BvbnNlLlJlcXVpcmVkQWxpYXNlcykpIHsKICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKFtzdHJpbmddYCRhbGlhcykpIHsKICAgICAgICAgICAgW3ZvaWRdYCRzY3JpcHQ6UmVxdWlyZWRBbGlhc1NldC5BZGQoW3N0cmluZ11gJGFsaWFzKQogICAgICAgIH0KICAgIH0KICAgIGAkc2NyaXB0Okxhc3RTdGF0ZVZlcnNpb24gPSBbaW50NjRdYCRyZXNwb25zZS5WZXJzaW9uCiAgICBpZiAoYCRyZXNwb25zZS5RdWV1ZSkgeyBgJHNjcmlwdDpMYXN0UXVldWUgPSBAKGAkcmVzcG9uc2UuUXVldWUpIH0gZWxzZSB7IGAkc2NyaXB0Okxhc3RRdWV1ZSA9IEAoKSB9CiAgICBgJHNjcmlwdDpMYXN0Q3VycmVudCA9IGAkcmVzcG9uc2UuQ3VycmVudAogICAgaWYgKGAkcmVzcG9uc2UuSW5zdGFsbGVkUGFja2FnZUlkcykgeyBgJHNjcmlwdDpMYXN0SW5zdGFsbGVkSWRzID0gQChgJHJlc3BvbnNlLkluc3RhbGxlZFBhY2thZ2VJZHMpIH0gZWxzZSB7IGAkc2NyaXB0Okxhc3RJbnN0YWxsZWRJZHMgPSBAKCkgfQogICAgcmV0dXJuIEAoYCRyZXNwb25zZS5DYXRhbG9nKQp9CgpmdW5jdGlvbiBHZXQtSW5zdGFsbGVkUGFja2FnZVN0YXRlIHsKICAgIGAkc3RhdGUgPSBbb3JkZXJlZF1AewogICAgICAgIEdlbmVyYXRlZEF0ID0gYCRudWxsCiAgICAgICAgUGFja2FnZVNldCAgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICB9CgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRJbnN0YWxsZWRQYWNrYWdlc1BhdGgpKSB7CiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1gJHN0YXRlCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCBgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCAtUmF3IC1FbmNvZGluZyBVVEY4CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRyYXcpKSB7CiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdYCRzdGF0ZQogICAgICAgIH0KCiAgICAgICAgYCRzbmFwc2hvdCA9IGAkcmF3IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgIGlmIChgJHNuYXBzaG90LkdlbmVyYXRlZEF0KSB7CiAgICAgICAgICAgIGAkc3RhdGUuR2VuZXJhdGVkQXQgPSBbc3RyaW5nXWAkc25hcHNob3QuR2VuZXJhdGVkQXQKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKGAkaWQgaW4gQChgJHNuYXBzaG90Lkluc3RhbGxlZFBhY2thZ2VJZHMpKSB7CiAgICAgICAgICAgIGlmIChgJGlkKSB7CiAgICAgICAgICAgICAgICBbdm9pZF1gJHN0YXRlLlBhY2thZ2VTZXQuQWRkKChbc3RyaW5nXWAkaWQpLlRyaW0oKSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KCiAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XWAkc3RhdGUKfQoKZnVuY3Rpb24gR2V0LUFwcFN0YXR1cyB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXWAkQXBwLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldYCRJbnN0YWxsZWRTZXQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1gJFF1ZXVlSXRlbXMKICAgICkKCiAgICBmb3JlYWNoIChgJHF1ZXVlZCBpbiBAKGAkUXVldWVJdGVtcykpIHsKICAgICAgICBpZiAoLW5vdCBgJHF1ZXVlZCkgeyBjb250aW51ZSB9CiAgICAgICAgaWYgKGAkcXVldWVkLlN0YXRlIC1pbiBAKCdRdWV1ZWQnLCdSdW5uaW5nJykgLWFuZCBbc3RyaW5nXTo6RXF1YWxzKFtzdHJpbmddYCRxdWV1ZWQuQWxpYXMsIFtzdHJpbmddYCRBcHAuQWxpYXMsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkgewogICAgICAgICAgICBpZiAoYCRxdWV1ZWQuU3RhdGUgLWVxICdSdW5uaW5nJykgewogICAgICAgICAgICAgICAgaWYgKGAkcXVldWVkLkFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcpIHsgcmV0dXJuICdXaXJkIGRlaW5zdGFsbGllcnQnIH0KICAgICAgICAgICAgICAgIHJldHVybiAnV2lyZCBpbnN0YWxsaWVydCcKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGAkcXVldWVkLkFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcpIHsgcmV0dXJuICdEZWluc3RhbGxhdGlvbiBpbiBXYXJ0ZXNjaGxhbmdlJyB9CiAgICAgICAgICAgIHJldHVybiAnSW4gV2FydGVzY2hsYW5nZScKICAgICAgICB9CiAgICB9CgogICAgaWYgKGAkSW5zdGFsbGVkU2V0LkNvbnRhaW5zKGAkQXBwLlBhY2thZ2VJZCkpIHsKICAgICAgICByZXR1cm4gJ0luc3RhbGxpZXJ0JwogICAgfQoKICAgIGlmIChgJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0LkNvbnRhaW5zKFtzdHJpbmddYCRBcHAuQWxpYXMpKSB7CiAgICAgICAgcmV0dXJuICdJbiBXYXJ0ZXNjaGxhbmdlJwogICAgfQoKICAgIHJldHVybiAnSW5zdGFsbGllcmJhcicKfQoKYCRmb3JtID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Gb3JtCmAkZm9ybS5UZXh0ID0gYCRDYXRhbG9nVGl0bGUKYCRmb3JtLlN0YXJ0UG9zaXRpb24gPSAnQ2VudGVyU2NyZWVuJwpgJGZvcm0uU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5ODAsIDY2MCkKYCRmb3JtLk1pbmltdW1TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk2MCwgNjQwKQpgJGZvcm0uVG9wTW9zdCA9IGAkZmFsc2UKYCRmb3JtLlNob3dJY29uID0gYCR0cnVlCmAkZm9ybS5Gb250ID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Gb250KCdTZWdvZSBVSScsIDkpCmAkZm9ybS5CYWNrQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JUcmFuc2xhdG9yXTo6RnJvbUh0bWwoJyNGM0YzRjMnKQpTZXQtRm9ybUljb24gLUZvcm0gYCRmb3JtCgpgJGhlYWRlclBhbmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGhlYWRlclBhbmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgMTIpCmAkaGVhZGVyUGFuZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5NDAsIDUyKQpgJGhlYWRlclBhbmVsLkFuY2hvciA9ICdUb3AsIExlZnQsIFJpZ2h0JwpgJGhlYWRlclBhbmVsLkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnNdOjpXaW5kb3cKYCRoZWFkZXJQYW5lbC5Cb3JkZXJTdHlsZSA9ICdGaXhlZFNpbmdsZScKCmAkaGVhZGVyQWNjZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGhlYWRlckFjY2VudC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMCwgMCkKYCRoZWFkZXJBY2NlbnQuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg2LCA1MCkKYCRoZWFkZXJBY2NlbnQuQW5jaG9yID0gJ1RvcCwgTGVmdCwgQm90dG9tJwpgJGhlYWRlckFjY2VudC5CYWNrQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JUcmFuc2xhdG9yXTo6RnJvbUh0bWwoJyMwRjZDQkQnKQoKYCRoZWFkZXJUaXRsZSA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRoZWFkZXJUaXRsZS5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTgsIDEyKQpgJGhlYWRlclRpdGxlLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTAwLCAyNCkKYCRoZWFkZXJUaXRsZS5Gb250ID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Gb250KCdTZWdvZSBVSSBTZW1pYm9sZCcsIDEzKQpgJGhlYWRlclRpdGxlLlRleHQgPSBgJENhdGFsb2dUaXRsZQoKYCRoZWFkZXJQYW5lbC5Db250cm9scy5BZGQoYCRoZWFkZXJBY2NlbnQpCmAkaGVhZGVyUGFuZWwuQ29udHJvbHMuQWRkKGAkaGVhZGVyVGl0bGUpCgpgJGdyb3VwQXBwcyA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuUGFuZWwKYCRncm91cEFwcHMuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCA3MikKYCRncm91cEFwcHMuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5NDAsIDM4NCkKYCRncm91cEFwcHMuQW5jaG9yID0gJ1RvcCwgTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRncm91cEFwcHMuQmFja0NvbG9yID0gW1N5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9yc106OldpbmRvdwpgJGdyb3VwQXBwcy5Cb3JkZXJTdHlsZSA9ICdGaXhlZFNpbmdsZScKCmAkbGlzdENhcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxhYmVsCmAkbGlzdENhcHRpb24uTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCAxMCkKYCRsaXN0Q2FwdGlvbi5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDkxMiwgMjApCmAkbGlzdENhcHRpb24uRm9udCA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuRm9udCgnU2Vnb2UgVUkgU2VtaWJvbGQnLCA5LjUpCmAkbGlzdENhcHRpb24uVGV4dCA9ICdGcmVpZ2VnZWJlbmUgQW53ZW5kdW5nZW4nCgpgJGxpc3QgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxpc3RWaWV3CmAkbGlzdC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDM0KQpgJGxpc3QuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MTYsIDMzOCkKYCRsaXN0LkFuY2hvciA9ICdUb3AsIExlZnQsIFJpZ2h0LCBCb3R0b20nCmAkbGlzdC5WaWV3ID0gJ0RldGFpbHMnCmAkbGlzdC5GdWxsUm93U2VsZWN0ID0gYCR0cnVlCmAkbGlzdC5NdWx0aVNlbGVjdCA9IGAkZmFsc2UKYCRsaXN0LkdyaWRMaW5lcyA9IGAkZmFsc2UKYCRsaXN0LkhpZGVTZWxlY3Rpb24gPSBgJGZhbHNlClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnQW53ZW5kdW5nJywgMjYwKQpbdm9pZF1gJGxpc3QuQ29sdW1ucy5BZGQoJ0Jlc2NocmVpYnVuZycsIDQ1MCkKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdTdGF0dXMnLCAxNTApClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnQWxpYXMnLCAxMTApClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnUGFrZXQtSUQnLCAxMDApCmAkbGlzdC5Cb3JkZXJTdHlsZSA9ICdOb25lJwpgJGxpc3QuSGVhZGVyU3R5bGUgPSAnQ2xpY2thYmxlJwoKYCRjb2x1bW5Tb3J0ZXIgPSBOZXctT2JqZWN0IExpc3RWaWV3Q29sdW1uU29ydGVyCmAkbGlzdC5MaXN0Vmlld0l0ZW1Tb3J0ZXIgPSBgJGNvbHVtblNvcnRlcgoKZnVuY3Rpb24gU29ydC1MaXN0QnlDb2x1bW4gewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1baW50XWAkQ29sdW1uSW5kZXgpCgogICAgaWYgKGAkY29sdW1uU29ydGVyLkNvbHVtbiAtZXEgYCRDb2x1bW5JbmRleCkgewogICAgICAgIGlmIChgJGNvbHVtblNvcnRlci5PcmRlciAtZXEgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNvcnRPcmRlcl06OkFzY2VuZGluZykgewogICAgICAgICAgICBgJGNvbHVtblNvcnRlci5PcmRlciA9IFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Tb3J0T3JkZXJdOjpEZXNjZW5kaW5nCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBgJGNvbHVtblNvcnRlci5PcmRlciA9IFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Tb3J0T3JkZXJdOjpBc2NlbmRpbmcKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBgJGNvbHVtblNvcnRlci5Db2x1bW4gPSBgJENvbHVtbkluZGV4CiAgICAgICAgYCRjb2x1bW5Tb3J0ZXIuT3JkZXIgPSBbU3lzdGVtLldpbmRvd3MuRm9ybXMuU29ydE9yZGVyXTo6QXNjZW5kaW5nCiAgICB9CgogICAgYCRsaXN0LlNvcnQoKQp9CgpgJGdyb3VwQXBwcy5Db250cm9scy5BZGQoYCRsaXN0Q2FwdGlvbikKYCRncm91cEFwcHMuQ29udHJvbHMuQWRkKGAkbGlzdCkKCmAkaW5mb1BhbmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGluZm9QYW5lbC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDQ2NikKYCRpbmZvUGFuZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5NDAsIDU0KQpgJGluZm9QYW5lbC5BbmNob3IgPSAnTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRpbmZvUGFuZWwuQm9yZGVyU3R5bGUgPSAnRml4ZWRTaW5nbGUnCmAkaW5mb1BhbmVsLkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnNdOjpXaW5kb3cKCmAkc25hcHNob3RMYWJlbCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRzbmFwc2hvdExhYmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMCwgOCkKYCRzbmFwc2hvdExhYmVsLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTE0LCAxOCkKYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuOiBrZWluIERhdGVuc3RhbmQgdm9yaGFuZGVuJwoKYCRpbnN0YWxsZWRMYWJlbCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRpbnN0YWxsZWRMYWJlbC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTAsIDMwKQpgJGluc3RhbGxlZExhYmVsLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTE0LCAxOCkKYCRpbnN0YWxsZWRMYWJlbC5UZXh0ID0gJ0JlcmVpdHMgaW5zdGFsbGllcnQ6IGtlaW5lJwoKYCRpbmZvUGFuZWwuQ29udHJvbHMuQWRkKGAkc25hcHNob3RMYWJlbCkKYCRpbmZvUGFuZWwuQ29udHJvbHMuQWRkKGAkaW5zdGFsbGVkTGFiZWwpCgpmdW5jdGlvbiBVcGRhdGUtSW5zdGFsbEJ1dHRvblN0YXRlIHsKICAgIGlmIChgJGxpc3QuU2VsZWN0ZWRJdGVtcy5Db3VudCAtbHQgMSkgewogICAgICAgIGAkYnRuSW5zdGFsbC5FbmFibGVkID0gYCRmYWxzZQogICAgICAgIGAkYnRuVW5pbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgYCRzdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICBgJGlzUmVxdWlyZWQgPSBgJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0LkNvbnRhaW5zKFtzdHJpbmddYCRzZWxlY3RlZEl0ZW0uU3ViSXRlbXNbM10uVGV4dCkKICAgIGAkYnRuSW5zdGFsbC5FbmFibGVkID0gKGAkc2NyaXB0OkFsbG93VXNlckluc3RhbGxzIC1hbmQgYCRzdGF0ZSAtZXEgJ0luc3RhbGxpZXJiYXInKQogICAgYCRidG5Vbmluc3RhbGwuRW5hYmxlZCA9IChgJHNjcmlwdDpBbGxvd1VzZXJVbmluc3RhbGwgLWFuZCAtbm90IGAkaXNSZXF1aXJlZCAtYW5kIGAkc3RhdGUgLWVxICdJbnN0YWxsaWVydCcpCn0KCmZ1bmN0aW9uIFVwZGF0ZS1Qcm9ncmVzc0FyZWEgewogICAgYCRjdXJyZW50ID0gYCRzY3JpcHQ6TGFzdEN1cnJlbnQKICAgIGAkcXVldWVkQ291bnQgPSBAKGAkc2NyaXB0Okxhc3RRdWV1ZSB8IFdoZXJlLU9iamVjdCB7IGAkXyAtYW5kIGAkXy5TdGF0ZSAtZXEgJ1F1ZXVlZCcgfSkuQ291bnQKICAgIGlmIChgJGN1cnJlbnQpIHsKICAgICAgICBgJGxhYmVsID0gW3N0cmluZ11gJGN1cnJlbnQuU3RhZ2VUZXh0CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRsYWJlbCkpIHsgYCRsYWJlbCA9ICdBa3Rpb24gbMOkdWZ0Li4uJyB9CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJ7MH0gKFdhcnRlc2NobGFuZ2U6IHsxfSkiIC1mIGAkbGFiZWwsIGAkcXVldWVkQ291bnQKICAgICAgICBgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJHRydWUKICAgICAgICBpZiAoYCRjdXJyZW50LklzSW5kZXRlcm1pbmF0ZSAtb3IgYCRudWxsIC1lcSBgJGN1cnJlbnQuUHJvZ3Jlc3NQZXJjZW50KSB7CiAgICAgICAgICAgIGAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnTWFycXVlZScKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnQ29udGludW91cycKICAgICAgICAgICAgYCR2YWx1ZSA9IFtpbnRdYCRjdXJyZW50LlByb2dyZXNzUGVyY2VudAogICAgICAgICAgICBpZiAoYCR2YWx1ZSAtbHQgMCkgeyBgJHZhbHVlID0gMCB9CiAgICAgICAgICAgIGlmIChgJHZhbHVlIC1ndCAxMDApIHsgYCR2YWx1ZSA9IDEwMCB9CiAgICAgICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmFsdWUgPSBgJHZhbHVlCiAgICAgICAgfQogICAgfQogICAgZWxzZWlmIChgJHF1ZXVlZENvdW50IC1ndCAwKSB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJXYXJ0ZXNjaGxhbmdlOiB7MH0iIC1mIGAkcXVldWVkQ291bnQKICAgICAgICBgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJHRydWUKICAgICAgICBgJHByb2dyZXNzQmFyLlN0eWxlID0gJ0NvbnRpbnVvdXMnCiAgICAgICAgYCRwcm9ncmVzc0Jhci5WYWx1ZSA9IDAKICAgIH0KICAgIGVsc2UgewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAnQmVyZWl0LicKICAgICAgICBgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJGZhbHNlCiAgICAgICAgYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdDb250aW51b3VzJwogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmFsdWUgPSAwCiAgICB9Cn0KCmZ1bmN0aW9uIExvYWQtQXBwTGlzdCB7CiAgICBgJHNlbGVjdGVkQWxpYXMgPSBgJG51bGwKICAgIGAkbGlzdC5CZWdpblVwZGF0ZSgpCiAgICB0cnkgewogICAgICAgIGlmIChgJGxpc3QuU2VsZWN0ZWRJdGVtcy5Db3VudCAtZ3QgMCkgewogICAgICAgICAgICBgJHNlbGVjdGVkQWxpYXMgPSBbc3RyaW5nXWAkbGlzdC5TZWxlY3RlZEl0ZW1zWzBdLlN1Ykl0ZW1zWzNdLlRleHQKICAgICAgICB9CgogICAgICAgIGAkbGlzdC5JdGVtcy5DbGVhcigpCgogICAgICAgIGAkYXBwcyA9IEdldC1DYXRhbG9nQXBwcwogICAgICAgIGAkaW5zdGFsbGVkU3RhdGUgPSBHZXQtSW5zdGFsbGVkUGFja2FnZVN0YXRlCiAgICAgICAgYCRpbnN0YWxsZWRTZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICAgICAgZm9yZWFjaCAoYCRpZCBpbiBAKGAkc2NyaXB0Okxhc3RJbnN0YWxsZWRJZHMpKSB7CiAgICAgICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ11gJGlkKSkgeyBbdm9pZF1gJGluc3RhbGxlZFNldC5BZGQoW3N0cmluZ11gJGlkKSB9CiAgICAgICAgfQoKICAgICAgICBpZiAoLW5vdCBgJGluc3RhbGxlZFNldCkgewogICAgICAgICAgICBgJGluc3RhbGxlZFNldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICAgICB9CgogICAgICAgIGAkaW5zdGFsbGVkTmFtZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCgogICAgICAgIGZvcmVhY2ggKGAkYXBwIGluIChgJGFwcHMgfCBTb3J0LU9iamVjdCBEaXNwbGF5TmFtZSkpIHsKICAgICAgICAgICAgYCRzdGF0ZSA9IEdldC1BcHBTdGF0dXMgLUFwcCBgJGFwcCAtSW5zdGFsbGVkU2V0IGAkaW5zdGFsbGVkU2V0IC1RdWV1ZUl0ZW1zIGAkc2NyaXB0Okxhc3RRdWV1ZQoKICAgICAgICAgICAgYCRpdGVtID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0oYCRhcHAuRGlzcGxheU5hbWUpCiAgICAgICAgICAgIFt2b2lkXWAkaXRlbS5TdWJJdGVtcy5BZGQoYCRhcHAuRGVzY3JpcHRpb24pCiAgICAgICAgICAgIFt2b2lkXWAkaXRlbS5TdWJJdGVtcy5BZGQoYCRzdGF0ZSkKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJGFwcC5BbGlhcykKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJGFwcC5QYWNrYWdlSWQpCiAgICAgICAgICAgIGAkaXRlbS5UYWcgPSBgJGFwcAoKICAgICAgICAgICAgaWYgKGAkc3RhdGUgLWVxICdJbnN0YWxsaWVydCcpIHsKICAgICAgICAgICAgICAgIGAkaXRlbS5Gb3JlQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JdOjpEYXJrR3JlZW4KICAgICAgICAgICAgICAgIFt2b2lkXWAkaW5zdGFsbGVkTmFtZXMuQWRkKGAkYXBwLkRpc3BsYXlOYW1lKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZiAoYCRzdGF0ZSAtbGlrZSAnKldhcnRlc2NobGFuZ2UnKSB7CiAgICAgICAgICAgICAgICBgJGl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGFya0dvbGRlbnJvZAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZiAoYCRzdGF0ZSAtbGlrZSAnV2lyZCAqJykgewogICAgICAgICAgICAgICAgYCRpdGVtLkZvcmVDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvcl06OlJveWFsQmx1ZQogICAgICAgICAgICB9CgogICAgICAgICAgICBbdm9pZF1gJGxpc3QuSXRlbXMuQWRkKGAkaXRlbSkKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKGAkY29sIGluIGAkbGlzdC5Db2x1bW5zKSB7CiAgICAgICAgICAgIGlmIChgJGNvbC5UZXh0IC1lcSAnUGFrZXQtSUQnKSB7IGAkY29sLldpZHRoID0gMCB9CiAgICAgICAgfQoKICAgICAgICBgJGxpc3QuU29ydCgpCgogICAgICAgIGlmIChgJGluc3RhbGxlZFN0YXRlLkdlbmVyYXRlZEF0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBgJHRpbWVzdGFtcCA9IFtEYXRlVGltZV06OlBhcnNlKGAkaW5zdGFsbGVkU3RhdGUuR2VuZXJhdGVkQXQpLlRvTG9jYWxUaW1lKCkKICAgICAgICAgICAgICAgIGAkc25hcHNob3RMYWJlbC5UZXh0ID0gJ0luc3RhbGxhdGlvbnNkYXRlbiB2b206ICcgKyBgJHRpbWVzdGFtcC5Ub1N0cmluZygnZGQuTU0ueXl5eSBISDptbTpzcycpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuIHZvbTogJyArIGAkaW5zdGFsbGVkU3RhdGUuR2VuZXJhdGVkQXQKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuOiBrZWluIERhdGVuc3RhbmQgdm9yaGFuZGVuJwogICAgICAgIH0KCiAgICAgICAgaWYgKGAkaW5zdGFsbGVkTmFtZXMuQ291bnQgLWd0IDApIHsKICAgICAgICAgICAgYCRpbnN0YWxsZWRMYWJlbC5UZXh0ID0gJ0JlcmVpdHMgaW5zdGFsbGllcnQ6ICcgKyAoYCRpbnN0YWxsZWROYW1lcyAtam9pbiAnLCAnKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYCRpbnN0YWxsZWRMYWJlbC5UZXh0ID0gJ0JlcmVpdHMgaW5zdGFsbGllcnQ6IGtlaW5lIGZyZWlnZWdlYmVuZSBTb2Z0d2FyZSBlcmthbm50JwogICAgICAgIH0KCiAgICAgICAgVXBkYXRlLVByb2dyZXNzQXJlYQogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgYCRsaXN0LkVuZFVwZGF0ZSgpCgogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRzZWxlY3RlZEFsaWFzKSkgewogICAgICAgICAgICBmb3JlYWNoIChgJGl0ZW0gaW4gYCRsaXN0Lkl0ZW1zKSB7CiAgICAgICAgICAgICAgICBpZiAoYCRpdGVtLlN1Ykl0ZW1zLkNvdW50IC1ndCAzIC1hbmQgW3N0cmluZ106OkVxdWFscyhgJGl0ZW0uU3ViSXRlbXNbM10uVGV4dCwgYCRzZWxlY3RlZEFsaWFzLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpIHsKICAgICAgICAgICAgICAgICAgICBgJGl0ZW0uU2VsZWN0ZWQgPSBgJHRydWUKICAgICAgICAgICAgICAgICAgICBgJGl0ZW0uRW5zdXJlVmlzaWJsZSgpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgVXBkYXRlLUluc3RhbGxCdXR0b25TdGF0ZQogICAgfQp9CgpgJHN0YXR1cyA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRzdGF0dXMuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCA1MjYpCmAkc3RhdHVzLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoNzAwLCAyMCkKYCRzdGF0dXMuQW5jaG9yID0gJ0xlZnQsIFJpZ2h0LCBCb3R0b20nCmAkc3RhdHVzLkZvcmVDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvcl06OkRpbUdyYXkKYCRzdGF0dXMuVGV4dCA9ICdCZXJlaXQuJwoKYCRwcm9ncmVzc0JhciA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuUHJvZ3Jlc3NCYXIKYCRwcm9ncmVzc0Jhci5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDU0OCkKYCRwcm9ncmVzc0Jhci5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDcwMCwgMTIpCmAkcHJvZ3Jlc3NCYXIuQW5jaG9yID0gJ0xlZnQsIFJpZ2h0LCBCb3R0b20nCmAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnQ29udGludW91cycKYCRwcm9ncmVzc0Jhci5WaXNpYmxlID0gYCRmYWxzZQoKYCRidG5JbnN0YWxsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24KYCRidG5JbnN0YWxsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgNTY4KQpgJGJ0bkluc3RhbGwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxNzAsIDMwKQpgJGJ0bkluc3RhbGwuQW5jaG9yID0gJ0xlZnQsIEJvdHRvbScKYCRidG5JbnN0YWxsLlRleHQgPSAnSW5zdGFsbGllcmVuJwpgJGJ0bkluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKCmAkYnRuVW5pbnN0YWxsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24KYCRidG5Vbmluc3RhbGwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDE5MCwgNTY4KQpgJGJ0blVuaW5zdGFsbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDE0MCwgMzApCmAkYnRuVW5pbnN0YWxsLkFuY2hvciA9ICdMZWZ0LCBCb3R0b20nCmAkYnRuVW5pbnN0YWxsLlRleHQgPSAnRGVpbnN0YWxsYXRpb24nCmAkYnRuVW5pbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCgpgJGJ0blJlZnJlc2ggPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0blJlZnJlc2guTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDMzOCwgNTY4KQpgJGJ0blJlZnJlc2guU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxMTAsIDMwKQpgJGJ0blJlZnJlc2guQW5jaG9yID0gJ0xlZnQsIEJvdHRvbScKYCRidG5SZWZyZXNoLlRleHQgPSAnQWt0dWFsaXNpZXJlbicKCmAkYnRuT3BlbkxvZyA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uCmAkYnRuT3BlbkxvZy5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoNDU2LCA1NjgpCmAkYnRuT3BlbkxvZy5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDEzMCwgMzApCmAkYnRuT3BlbkxvZy5BbmNob3IgPSAnTGVmdCwgQm90dG9tJwpgJGJ0bk9wZW5Mb2cuVGV4dCA9ICdQcm90b2tvbGwgw7ZmZm5lbicKCmAkYnRuQ2xvc2UgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0bkNsb3NlLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCg4MzIsIDU2OCkKYCRidG5DbG9zZS5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDEyMCwgMzApCmAkYnRuQ2xvc2UuQW5jaG9yID0gJ1JpZ2h0LCBCb3R0b20nCmAkYnRuQ2xvc2UuVGV4dCA9ICdTY2hsaWXDn2VuJwoKYCRzY3JpcHQ6U3RhdGVXYXRjaGVyID0gYCRudWxsCmAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlciA9IGAkbnVsbApgJHN0YXRlUmVmcmVzaFRpbWVyID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UaW1lcgpgJHN0YXRlUmVmcmVzaFRpbWVyLkludGVydmFsID0gNTAwCmAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJGZhbHNlCmAkc2NyaXB0OlJlcXVlc3RXb3JrZXJCdXN5ID0gYCRmYWxzZQpgJHNjcmlwdDpSdW5zcGFjZUpvYnMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W29iamVjdF0nCgpmdW5jdGlvbiBTdGFydC1DYXRhbG9nRGFlbW9uUnVuc3BhY2VSZXF1ZXN0IHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldW3N0cmluZ11gJENvbW1hbmQsCiAgICAgICAgW3N0cmluZ11gJEFsaWFzLAogICAgICAgIGAkQ29udGV4dCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtzY3JpcHRibG9ja11gJE9uQ29tcGxldGVkCiAgICApCgogICAgYCRydW5zcGFjZSA9IFtydW5zcGFjZWZhY3RvcnldOjpDcmVhdGVSdW5zcGFjZSgpCiAgICBgJHBvd2Vyc2hlbGwgPSBbcG93ZXJzaGVsbF06OkNyZWF0ZSgpCiAgICBgJHRpbWVyID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UaW1lcgogICAgYCR0aW1lci5JbnRlcnZhbCA9IDEwMAoKICAgIGAkam9iID0gW3BzY3VzdG9tb2JqZWN0XUB7CiAgICAgICAgUG93ZXJTaGVsbCAgPSBgJHBvd2Vyc2hlbGwKICAgICAgICBSdW5zcGFjZSAgICA9IGAkcnVuc3BhY2UKICAgICAgICBBc3luY1Jlc3VsdCA9IGAkbnVsbAogICAgICAgIFRpbWVyICAgICAgID0gYCR0aW1lcgogICAgICAgIENvbnRleHQgICAgID0gYCRDb250ZXh0CiAgICAgICAgT25Db21wbGV0ZWQgPSBgJE9uQ29tcGxldGVkCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBgJHJ1bnNwYWNlLkFwYXJ0bWVudFN0YXRlID0gJ01UQScKICAgICAgICBgJHJ1bnNwYWNlLlRocmVhZE9wdGlvbnMgPSAnUmV1c2VUaHJlYWQnCiAgICAgICAgYCRydW5zcGFjZS5PcGVuKCkKICAgICAgICBgJHJ1bnNwYWNlLlNlc3Npb25TdGF0ZVByb3h5LlNldFZhcmlhYmxlKCdQaXBlTmFtZScsIGAkUGlwZU5hbWUpCiAgICAgICAgYCRydW5zcGFjZS5TZXNzaW9uU3RhdGVQcm94eS5TZXRWYXJpYWJsZSgnQ29tbWFuZCcsIGAkQ29tbWFuZCkKICAgICAgICBgJHJ1bnNwYWNlLlNlc3Npb25TdGF0ZVByb3h5LlNldFZhcmlhYmxlKCdBbGlhcycsIGAkQWxpYXMpCgogICAgICAgIGAkcG93ZXJzaGVsbC5SdW5zcGFjZSA9IGAkcnVuc3BhY2UKICAgICAgICBbdm9pZF1gJHBvd2Vyc2hlbGwuQWRkU2NyaXB0KHsKICAgICAgICAgICAgU2V0LVN0cmljdE1vZGUgLVZlcnNpb24gTGF0ZXN0CiAgICAgICAgICAgIGAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgogICAgICAgICAgICBgJHBheWxvYWQgPSBbb3JkZXJlZF1AewogICAgICAgICAgICAgICAgQ29tbWFuZCAgPSBgJENvbW1hbmQKICAgICAgICAgICAgICAgIEFwcEFsaWFzID0gYCRBbGlhcwogICAgICAgICAgICB9CiAgICAgICAgICAgIGAkanNvbiA9IGAkcGF5bG9hZCB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcwoKICAgICAgICAgICAgYCRlbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKGAkZmFsc2UpCiAgICAgICAgICAgIGAkY2xpZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuTmFtZWRQaXBlQ2xpZW50U3RyZWFtIC1Bcmd1bWVudExpc3QgQCgKICAgICAgICAgICAgICAgICcuJywKICAgICAgICAgICAgICAgIGAkUGlwZU5hbWUsCiAgICAgICAgICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVEaXJlY3Rpb25dOjpJbk91dCwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZU9wdGlvbnNdOjpOb25lLAogICAgICAgICAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuVG9rZW5JbXBlcnNvbmF0aW9uTGV2ZWxdOjpJbXBlcnNvbmF0aW9uCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBgJGNsaWVudC5Db25uZWN0KDEwMDAwKQogICAgICAgICAgICAgICAgYCRyZWFkZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1SZWFkZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgICAgICAgICBgJHdyaXRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVdyaXRlcihgJGNsaWVudCwgYCRlbmNvZGluZykKICAgICAgICAgICAgICAgIGAkd3JpdGVyLkF1dG9GbHVzaCA9IGAkdHJ1ZQogICAgICAgICAgICAgICAgYCR3cml0ZXIuV3JpdGVMaW5lKGAkanNvbikKCiAgICAgICAgICAgICAgICBgJHJlYWRUYXNrID0gYCRyZWFkZXIuUmVhZExpbmVBc3luYygpCiAgICAgICAgICAgICAgICBpZiAoLW5vdCBgJHJlYWRUYXNrLldhaXQoMTUwMDApKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ1plaXTDvGJlcnNjaHJlaXR1bmcgYmVpbSBXYXJ0ZW4gYXVmIEFudHdvcnQgZGVzIFNvZnR3YXJla2F0YWxvZy1EaWVuc3Rlcy4nCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBgJGxpbmUgPSBgJHJlYWRUYXNrLlJlc3VsdAogICAgICAgICAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRsaW5lKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93ICdEZXIgU29mdHdhcmVrYXRhbG9nLURpZW5zdCBoYXQga2VpbmUgQW50d29ydCBnZXNlbmRldC4nCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYCRyZXNwb25zZSA9IGAkbGluZSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICAgICAgICAgIGlmICgtbm90IGAkcmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgIHRocm93IChbc3RyaW5nXWAkcmVzcG9uc2UuTWVzc2FnZSkKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gYCRyZXNwb25zZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIFtTeXN0ZW0uVGltZW91dEV4Y2VwdGlvbl0gewogICAgICAgICAgICAgICAgdGhyb3cgJ0RlciBTb2Z0d2FyZWthdGFsb2ctRGllbnN0IGlzdCBuaWNodCBlcnJlaWNoYmFyIG9kZXIgc3RhcnRldCBub2NoLiBCaXR0ZSB2ZXJzdWNoZW4gU2llIGVzIGVybmV1dC4nCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICBgJGNsaWVudC5EaXNwb3NlKCkKICAgICAgICAgICAgfQogICAgICAgIH0uVG9TdHJpbmcoKSkKCiAgICAgICAgYCRqb2IuQXN5bmNSZXN1bHQgPSBgJHBvd2Vyc2hlbGwuQmVnaW5JbnZva2UoKQogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkdGltZXIuRGlzcG9zZSgpCiAgICAgICAgYCRwb3dlcnNoZWxsLkRpc3Bvc2UoKQogICAgICAgIGAkcnVuc3BhY2UuRGlzcG9zZSgpCiAgICAgICAgdGhyb3cKICAgIH0KCiAgICBbdm9pZF1gJHNjcmlwdDpSdW5zcGFjZUpvYnMuQWRkKGAkam9iKQogICAgYCR0aW1lci5BZGRfVGljayh7CiAgICAgICAgaWYgKC1ub3QgYCRqb2IuQXN5bmNSZXN1bHQuSXNDb21wbGV0ZWQpIHsgcmV0dXJuIH0KCiAgICAgICAgYCRqb2IuVGltZXIuU3RvcCgpCiAgICAgICAgYCRjb21wbGV0aW9uID0gW3BzY3VzdG9tb2JqZWN0XUB7CiAgICAgICAgICAgIENvbnRleHQgICAgICA9IGAkam9iLkNvbnRleHQKICAgICAgICAgICAgUmVzcG9uc2UgICAgID0gYCRudWxsCiAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9IGAkbnVsbAogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYCRyZXN1bHQgPSBAKGAkam9iLlBvd2VyU2hlbGwuRW5kSW52b2tlKGAkam9iLkFzeW5jUmVzdWx0KSkKICAgICAgICAgICAgaWYgKGAkam9iLlBvd2VyU2hlbGwuU3RyZWFtcy5FcnJvci5Db3VudCAtZ3QgMCkgewogICAgICAgICAgICAgICAgYCRmaXJzdEVycm9yID0gYCRqb2IuUG93ZXJTaGVsbC5TdHJlYW1zLkVycm9yWzBdCiAgICAgICAgICAgICAgICBpZiAoYCRmaXJzdEVycm9yLkV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICAgIGAkY29tcGxldGlvbi5FcnJvck1lc3NhZ2UgPSBgJGZpcnN0RXJyb3IuRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGAkY29tcGxldGlvbi5FcnJvck1lc3NhZ2UgPSBbc3RyaW5nXWAkZmlyc3RFcnJvcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZiAoYCRyZXN1bHQuQ291bnQgLWd0IDApIHsKICAgICAgICAgICAgICAgIGAkY29tcGxldGlvbi5SZXNwb25zZSA9IGAkcmVzdWx0Wy0xXQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgYCRjb21wbGV0aW9uLkVycm9yTWVzc2FnZSA9IGAkXy5FeGNlcHRpb24uTWVzc2FnZQogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJiBgJGpvYi5PbkNvbXBsZXRlZCBgJGNvbXBsZXRpb24KICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIFt2b2lkXWAkc2NyaXB0OlJ1bnNwYWNlSm9icy5SZW1vdmUoYCRqb2IpCiAgICAgICAgICAgIGAkam9iLlRpbWVyLkRpc3Bvc2UoKQogICAgICAgICAgICBgJGpvYi5Qb3dlclNoZWxsLkRpc3Bvc2UoKQogICAgICAgICAgICBgJGpvYi5SdW5zcGFjZS5EaXNwb3NlKCkKICAgICAgICB9CiAgICB9KQogICAgYCR0aW1lci5TdGFydCgpCn0KCmZ1bmN0aW9uIFN0YXJ0LUFwcFJlcXVlc3RBc3luYyB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXWAkU2VsZWN0ZWQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1bVmFsaWRhdGVTZXQoJ0luc3RhbGwnLCdVbmluc3RhbGwnKV1bc3RyaW5nXWAkQWN0aW9uCiAgICApCgogICAgaWYgKGAkc2NyaXB0OlJlcXVlc3RXb3JrZXJCdXN5KSB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICdFaW5lIEFuZnJhZ2Ugd2lyZCBiZXJlaXRzIHZlcmFyYmVpdGV0LicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBgJHNjcmlwdDpSZXF1ZXN0V29ya2VyQnVzeSA9IGAkdHJ1ZQogICAgYCRidG5JbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCiAgICBgJGJ0blVuaW5zdGFsbC5FbmFibGVkID0gYCRmYWxzZQogICAgYCRidG5SZWZyZXNoLkVuYWJsZWQgPSBgJGZhbHNlCgogICAgYCRjb250ZXh0ID0gW3BzY3VzdG9tb2JqZWN0XUB7CiAgICAgICAgQWN0aW9uID0gYCRBY3Rpb24KICAgICAgICBBbGlhcyA9IFtzdHJpbmddYCRTZWxlY3RlZC5BbGlhcwogICAgICAgIERpc3BsYXlOYW1lID0gW3N0cmluZ11gJFNlbGVjdGVkLkRpc3BsYXlOYW1lCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBTdGFydC1DYXRhbG9nRGFlbW9uUnVuc3BhY2VSZXF1ZXN0IC1Db21tYW5kIGAkQWN0aW9uIC1BbGlhcyBgJGNvbnRleHQuQWxpYXMgLUNvbnRleHQgYCRjb250ZXh0IC1PbkNvbXBsZXRlZCB7CiAgICAgICAgICAgIHBhcmFtKGAkY29tcGxldGlvbikKICAgICAgICB0cnkgewogICAgICAgICAgICBgJHNjcmlwdDpSZXF1ZXN0V29ya2VyQnVzeSA9IGAkZmFsc2UKICAgICAgICAgICAgYCRidG5SZWZyZXNoLkVuYWJsZWQgPSBgJHRydWUKCiAgICAgICAgICAgIGlmIChgJGNvbXBsZXRpb24uRXJyb3JNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICBgJHN0YXR1cy5UZXh0ID0gJ0ZlaGxlcjogJyArIGAkY29tcGxldGlvbi5FcnJvck1lc3NhZ2UKICAgICAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICAgICBgJGNvbXBsZXRpb24uRXJyb3JNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkVycm9yCiAgICAgICAgICAgICAgICApIHwgT3V0LU51bGwKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CgogICAgICAgICAgICBgJHJlc3VsdCA9IFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgQWN0aW9uID0gYCRjb21wbGV0aW9uLkNvbnRleHQuQWN0aW9uCiAgICAgICAgICAgICAgICBBbGlhcyA9IGAkY29tcGxldGlvbi5Db250ZXh0LkFsaWFzCiAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9IGAkY29tcGxldGlvbi5Db250ZXh0LkRpc3BsYXlOYW1lCiAgICAgICAgICAgICAgICBSZXNwb25zZSA9IGAkY29tcGxldGlvbi5SZXNwb25zZQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChgJHJlc3VsdC5BY3Rpb24gLWVxICdVbmluc3RhbGwnKSB7CiAgICAgICAgICAgICAgICBgJHZlcmIgPSAnRGVpbnN0YWxsYXRpb24nCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBgJHZlcmIgPSAnSW5zdGFsbGF0aW9uJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChgJHJlc3VsdC5SZXNwb25zZS5NZXNzYWdlKSB7CiAgICAgICAgICAgICAgICBgJHN0YXR1cy5UZXh0ID0gW3N0cmluZ11gJHJlc3VsdC5SZXNwb25zZS5NZXNzYWdlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBgJHN0YXR1cy5UZXh0ID0gImAkdmVyYiBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkcmVzdWx0LkRpc3BsYXlOYW1lCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiYCR2ZXJiIGVpbmdlcmVpaHQ6YHJgbmByYG57MH1gcmBuQWxpYXM6IHsxfSIgLWYgYCRyZXN1bHQuRGlzcGxheU5hbWUsIGAkcmVzdWx0LkFsaWFzKSwKICAgICAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpJbmZvcm1hdGlvbgogICAgICAgICAgICApIHwgT3V0LU51bGwKCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUKICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc2NyaXB0OlJlcXVlc3RXb3JrZXJCdXN5ID0gYCRmYWxzZQogICAgICAgIGAkYnRuUmVmcmVzaC5FbmFibGVkID0gYCR0cnVlCiAgICAgICAgVXBkYXRlLUluc3RhbGxCdXR0b25TdGF0ZQogICAgICAgIHRocm93CiAgICB9Cn0KCmZ1bmN0aW9uIFN0YXJ0LVJlZnJlc2hTdGF0dXNBc3luYyB7CiAgICBpZiAoYCRzY3JpcHQ6UmVxdWVzdFdvcmtlckJ1c3kpIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gJ0VpbmUgQW5mcmFnZSB3aXJkIGJlcmVpdHMgdmVyYXJiZWl0ZXQuJwogICAgICAgIHJldHVybgogICAgfQoKICAgIGAkc2NyaXB0OlJlcXVlc3RXb3JrZXJCdXN5ID0gYCR0cnVlCiAgICBgJGJ0bkluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKICAgIGAkYnRuVW5pbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCiAgICBgJGJ0blJlZnJlc2guRW5hYmxlZCA9IGAkZmFsc2UKICAgIGAkc3RhdHVzLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuLUFrdHVhbGlzaWVydW5nIHdpcmQgYW5nZWZvcmRlcnQuLi4nCgogICAgdHJ5IHsKICAgICAgICBTdGFydC1DYXRhbG9nRGFlbW9uUnVuc3BhY2VSZXF1ZXN0IC1Db21tYW5kICdSZWZyZXNoU3RhdHVzJyAtT25Db21wbGV0ZWQgewogICAgICAgICAgICBwYXJhbShgJGNvbXBsZXRpb24pCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYCRzY3JpcHQ6UmVxdWVzdFdvcmtlckJ1c3kgPSBgJGZhbHNlCiAgICAgICAgICAgIGAkYnRuUmVmcmVzaC5FbmFibGVkID0gYCR0cnVlCgogICAgICAgICAgICBpZiAoYCRjb21wbGV0aW9uLkVycm9yTWVzc2FnZSkgewogICAgICAgICAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICdGZWhsZXI6ICcgKyBgJGNvbXBsZXRpb24uRXJyb3JNZXNzYWdlCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgICAgICAgICAgYCRjb21wbGV0aW9uLkVycm9yTWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpFcnJvcgogICAgICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgfQoKICAgICAgICAgICAgYCRyZXNwb25zZSA9IGAkY29tcGxldGlvbi5SZXNwb25zZQogICAgICAgICAgICBpZiAoYCRyZXNwb25zZS5NZXNzYWdlKSB7IGAkc3RhdHVzLlRleHQgPSBbc3RyaW5nXWAkcmVzcG9uc2UuTWVzc2FnZSB9CiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUKICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc2NyaXB0OlJlcXVlc3RXb3JrZXJCdXN5ID0gYCRmYWxzZQogICAgICAgIGAkYnRuUmVmcmVzaC5FbmFibGVkID0gYCR0cnVlCiAgICAgICAgVXBkYXRlLUluc3RhbGxCdXR0b25TdGF0ZQogICAgICAgIHRocm93CiAgICB9Cn0KCmAkYnRuSW5zdGFsbC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWx0IDEpIHsKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgJ0JpdHRlIHp1ZXJzdCBlaW5lIEFud2VuZHVuZyBhdXN3w6RobGVuLicsCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgICAgIGAkc2VsZWN0ZWQgPSBgJHNlbGVjdGVkSXRlbS5UYWcKICAgICAgICBgJGN1cnJlbnRTdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICAgICAgaWYgKGAkY3VycmVudFN0YXRlIC1lcSAnSW5zdGFsbGllcnQnKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiezB9IGlzdCBiZXJlaXRzIGluc3RhbGxpZXJ0LiIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSksCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJJbnN0YWxsYXRpb24gd2lyZCBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUKICAgICAgICBgJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1syXS5UZXh0ID0gJ0luIFdhcnRlc2NobGFuZ2UnCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGFya0dvbGRlbnJvZAogICAgICAgIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUKICAgICAgICBTdGFydC1BcHBSZXF1ZXN0QXN5bmMgLVNlbGVjdGVkIGAkc2VsZWN0ZWQgLUFjdGlvbiAnSW5zdGFsbCcKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlcjogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZQogICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlLAogICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkVycm9yCiAgICAgICAgKSB8IE91dC1OdWxsCiAgICB9Cn0pCgpgJGJ0blVuaW5zdGFsbC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWx0IDEpIHsKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgJ0JpdHRlIHp1ZXJzdCBlaW5lIEFud2VuZHVuZyBhdXN3w6RobGVuLicsCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgICAgIGAkc2VsZWN0ZWQgPSBgJHNlbGVjdGVkSXRlbS5UYWcKICAgICAgICBgJGN1cnJlbnRTdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICAgICAgaWYgKGAkY3VycmVudFN0YXRlIC1uZSAnSW5zdGFsbGllcnQnKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiezB9IGlzdCBkZXJ6ZWl0IG5pY2h0IGFscyBpbnN0YWxsaWVydCBtYXJraWVydC4iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUpLAogICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRGVpbnN0YWxsYXRpb24gd2lyZCBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUKICAgICAgICBgJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1syXS5UZXh0ID0gJ0RlaW5zdGFsbGF0aW9uIGluIFdhcnRlc2NobGFuZ2UnCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGFya0dvbGRlbnJvZAogICAgICAgIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUKICAgICAgICBTdGFydC1BcHBSZXF1ZXN0QXN5bmMgLVNlbGVjdGVkIGAkc2VsZWN0ZWQgLUFjdGlvbiAnVW5pbnN0YWxsJwogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkYnRuUmVmcmVzaC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBTdGFydC1SZWZyZXNoU3RhdHVzQXN5bmMKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlcjogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZQogICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlLAogICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkVycm9yCiAgICAgICAgKSB8IE91dC1OdWxsCiAgICB9Cn0pCgpgJHN0YXRlUmVmcmVzaFRpbWVyLkFkZF9UaWNrKHsKICAgIGlmICgtbm90IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcpIHsgcmV0dXJuIH0KICAgIGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJGZhbHNlCiAgICB0cnkgeyBMb2FkLUFwcExpc3QgfQogICAgY2F0Y2ggeyBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlciBiZWkgYXV0b21hdGlzY2hlciBBa3R1YWxpc2llcnVuZzogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZSB9Cn0pCgpgJGJ0bk9wZW5Mb2cuQWRkX0NsaWNrKHsKICAgIHRyeSB7CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRMb2dGaWxlKSkgewogICAgICAgICAgICB0aHJvdyAnRGVyIFBmYWQgenVyIFByb3Rva29sbGRhdGVpIGlzdCBsZWVyLicKICAgICAgICB9CgogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoIGAkTG9nRmlsZSkgewogICAgICAgICAgICBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAnbm90ZXBhZC5leGUnIC1Bcmd1bWVudExpc3QgQChgJExvZ0ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgICAgICAnRGllIFByb3Rva29sbGRhdGVpIHd1cmRlIG5vY2ggbmljaHQgZXJzdGVsbHQuJywKICAgICAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpJbmZvcm1hdGlvbgogICAgICAgICAgICApIHwgT3V0LU51bGwKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkYnRuQ2xvc2UuQWRkX0NsaWNrKHsgYCRmb3JtLkNsb3NlKCkgfSkKCmAkZm9ybS5BZGRfU2hvd24oewogICAgdHJ5IHsKICAgICAgICBgJHN0YXRlRGlyID0gU3BsaXQtUGF0aCAtUGF0aCBgJFF1ZXVlU3RhdGVQYXRoIC1QYXJlbnQKICAgICAgICBgJHN0YXRlRmlsZSA9IFNwbGl0LVBhdGggLVBhdGggYCRRdWV1ZVN0YXRlUGF0aCAtTGVhZgogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoIGAkc3RhdGVEaXIpIHsKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZVN5c3RlbVdhdGNoZXIoYCRzdGF0ZURpciwgYCRzdGF0ZUZpbGUpCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5Ob3RpZnlGaWx0ZXIgPSBbU3lzdGVtLklPLk5vdGlmeUZpbHRlcnNdJ0xhc3RXcml0ZSwgRmlsZU5hbWUsIFNpemUnCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5BZGRfQ2hhbmdlZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkFkZF9DcmVhdGVkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTdGF0ZVdhdGNoZXIuQWRkX1JlbmFtZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5FbmFibGVSYWlzaW5nRXZlbnRzID0gYCR0cnVlCiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiU3RhdHVzdWViZXJ3YWNodW5nIGtvbm50ZSBuaWNodCBnZXN0YXJ0ZXQgd2VyZGVuOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBgJHNuYXBzaG90RGlyID0gU3BsaXQtUGF0aCAtUGF0aCBgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCAtUGFyZW50CiAgICAgICAgYCRzbmFwc2hvdEZpbGUgPSBTcGxpdC1QYXRoIC1QYXRoIGAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1MZWFmCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRzbmFwc2hvdERpcikgewogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5GaWxlU3lzdGVtV2F0Y2hlcihgJHNuYXBzaG90RGlyLCBgJHNuYXBzaG90RmlsZSkKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLk5vdGlmeUZpbHRlciA9IFtTeXN0ZW0uSU8uTm90aWZ5RmlsdGVyc10nTGFzdFdyaXRlLCBGaWxlTmFtZSwgU2l6ZScKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLkFkZF9DaGFuZ2VkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuQWRkX0NyZWF0ZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlci5BZGRfUmVuYW1lZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLkVuYWJsZVJhaXNpbmdFdmVudHMgPSBgJHRydWUKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJTbmFwc2hvdHVlYmVyd2FjaHVuZyBrb25udGUgbmljaHQgZ2VzdGFydGV0IHdlcmRlbjogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZQogICAgfQogICAgYCRzdGF0ZVJlZnJlc2hUaW1lci5TdGFydCgpCn0pCmAkZm9ybS5BZGRfRm9ybUNsb3NpbmcoewogICAgYCRzdGF0ZVJlZnJlc2hUaW1lci5TdG9wKCkKICAgIGAkc3RhdGVSZWZyZXNoVGltZXIuRGlzcG9zZSgpCiAgICBpZiAoYCRzY3JpcHQ6U3RhdGVXYXRjaGVyKSB7IGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5EaXNwb3NlKCkgfQogICAgaWYgKGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlcikgeyBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuRGlzcG9zZSgpIH0KICAgIGZvcmVhY2ggKGAkam9iIGluIEAoYCRzY3JpcHQ6UnVuc3BhY2VKb2JzKSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChgJGpvYi5UaW1lcikgewogICAgICAgICAgICAgICAgYCRqb2IuVGltZXIuU3RvcCgpCiAgICAgICAgICAgICAgICBgJGpvYi5UaW1lci5EaXNwb3NlKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYCRqb2IuUG93ZXJTaGVsbCAtYW5kIGAkam9iLkFzeW5jUmVzdWx0IC1hbmQgLW5vdCBgJGpvYi5Bc3luY1Jlc3VsdC5Jc0NvbXBsZXRlZCkgewogICAgICAgICAgICAgICAgYCRqb2IuUG93ZXJTaGVsbC5TdG9wKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYCRqb2IuUG93ZXJTaGVsbCkgeyBgJGpvYi5Qb3dlclNoZWxsLkRpc3Bvc2UoKSB9CiAgICAgICAgICAgIGlmIChgJGpvYi5SdW5zcGFjZSkgeyBgJGpvYi5SdW5zcGFjZS5EaXNwb3NlKCkgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQogICAgfQogICAgYCRzY3JpcHQ6UnVuc3BhY2VKb2JzLkNsZWFyKCkKfSkKCmAkbGlzdC5BZGRfU2VsZWN0ZWRJbmRleENoYW5nZWQoeyBVcGRhdGUtSW5zdGFsbEJ1dHRvblN0YXRlIH0pCmAkbGlzdC5BZGRfQ29sdW1uQ2xpY2soewogICAgcGFyYW0oYCRzZW5kZXIsIGAkZXZlbnRBcmdzKQogICAgU29ydC1MaXN0QnlDb2x1bW4gLUNvbHVtbkluZGV4IGAkZXZlbnRBcmdzLkNvbHVtbgp9KQoKYCRsaXN0LkFkZF9Eb3VibGVDbGljayh7CiAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWd0IDApIHsKICAgICAgICBpZiAoYCRidG5JbnN0YWxsLkVuYWJsZWQpIHsKICAgICAgICAgICAgYCRidG5JbnN0YWxsLlBlcmZvcm1DbGljaygpCiAgICAgICAgfQogICAgfQp9KQoKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGhlYWRlclBhbmVsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkZ3JvdXBBcHBzKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkaW5mb1BhbmVsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkc3RhdHVzKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkcHJvZ3Jlc3NCYXIpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5JbnN0YWxsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkYnRuVW5pbnN0YWxsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkYnRuUmVmcmVzaCkKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGJ0bk9wZW5Mb2cpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5DbG9zZSkKCmAkZm9ybS5BY2NlcHRCdXR0b24gPSBgJGJ0bkluc3RhbGwKYCRmb3JtLkNhbmNlbEJ1dHRvbiA9IGAkYnRuQ2xvc2UKCnRyeSB7CiAgICBMb2FkLUFwcExpc3QKfQpjYXRjaCB7CiAgICBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlciBiZWltIExhZGVuOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgIkRlciBTb2Z0d2FyZWthdGFsb2cga29ubnRlIG5pY2h0IHZvbGxzdMOkbmRpZyBnZWxhZGVuIHdlcmRlbi5gcmBuYHJgbiIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICkgfCBPdXQtTnVsbAp9Cgpbdm9pZF1gJGZvcm0uU2hvd0RpYWxvZygpCiJACgogICAgV3JpdGUtVGV4dEZpbGUgLVBhdGggJENhdGFsb2dHdWlQYXRoIC1Db250ZW50ICRjb250ZW50IC1FbmNvZGluZyBVdGY4Qm9tCiAgICBTZXQtRmlsZUFjbEFkbWluc09ubHkgLVBhdGggJENhdGFsb2dHdWlQYXRoCn0KCmZ1bmN0aW9uIE5ldy1DYXRhbG9nTGF1bmNoZXIgewogICAgJHBzUXVvdGVkID0gJFBvd2VyU2hlbGxFeGUuUmVwbGFjZSgnIicsICciIicpCiAgICAkZ3VpUXVvdGVkID0gJENhdGFsb2dHdWlQYXRoLlJlcGxhY2UoJyInLCAnIiInKQoKICAgICR2YnMgPSBAIgpTZXQgc2hlbGwgPSBDcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKQpjbWRMaW5lID0gQ2hyKDM0KSAmICIkcHNRdW90ZWQiICYgQ2hyKDM0KSAmICIgLU5vUHJvZmlsZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtU1RBIC1XaW5kb3dTdHlsZSBIaWRkZW4gLUZpbGUgIiAmIENocigzNCkgJiAiJGd1aVF1b3RlZCIgJiBDaHIoMzQpCnNoZWxsLlJ1biBjbWRMaW5lLCAwLCBGYWxzZQoiQAoKICAgIFdyaXRlLVRleHRGaWxlIC1QYXRoICRDYXRhbG9nTGF1bmNoZXJQYXRoIC1Db250ZW50ICR2YnMgLUVuY29kaW5nIFVuaWNvZGUKICAgIFNldC1GaWxlQWNsQWRtaW5zT25seSAtUGF0aCAkQ2F0YWxvZ0xhdW5jaGVyUGF0aAp9CgpmdW5jdGlvbiBOZXctU2hvcnRjdXQgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFNob3J0Y3V0UGF0aAogICAgKQoKICAgICRwYXJlbnQgPSBTcGxpdC1QYXRoIC1QYXRoICRTaG9ydGN1dFBhdGggLVBhcmVudAogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkcGFyZW50CgogICAgJHNoZWxsID0gTmV3LU9iamVjdCAtQ29tT2JqZWN0IFdTY3JpcHQuU2hlbGwKICAgICRzaG9ydGN1dCA9ICRzaGVsbC5DcmVhdGVTaG9ydGN1dCgkU2hvcnRjdXRQYXRoKQogICAgJHNob3J0Y3V0LlRhcmdldFBhdGggPSAkV1NjcmlwdEV4ZQogICAgJHNob3J0Y3V0LkFyZ3VtZW50cyA9ICJgIiRDYXRhbG9nTGF1bmNoZXJQYXRoYCIiCiAgICAkc2hvcnRjdXQuV29ya2luZ0RpcmVjdG9yeSA9ICRCYXNlRGlyCiAgICAkc2hvcnRjdXQuV2luZG93U3R5bGUgPSAxCiAgICAkc2hvcnRjdXQuRGVzY3JpcHRpb24gPSAkQ2F0YWxvZ0Rpc3BsYXlOYW1lCiAgICAkc2hvcnRjdXQuSWNvbkxvY2F0aW9uID0gIiRlbnY6U3lzdGVtUm9vdFxTeXN0ZW0zMlxzaGVsbDMyLmRsbCw4MCIKICAgICRzaG9ydGN1dC5TYXZlKCkKfQoKZnVuY3Rpb24gVW5yZWdpc3Rlci1MZWdhY3lRdWV1ZVRhc2sgewogICAgdHJ5IHsKICAgICAgICAkdGFzayA9IEdldC1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkTGVnYWN5UXVldWVUYXNrTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIGlmICgkdGFzaykgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlJlbW92aW5nIGxlZ2FjeSBzY2hlZHVsZWQgdGFzayAnJExlZ2FjeVF1ZXVlVGFza05hbWUnLiIKICAgICAgICAgICAgVW5yZWdpc3Rlci1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkTGVnYWN5UXVldWVUYXNrTmFtZSAtQ29uZmlybTokZmFsc2UKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3QgcmVtb3ZlIGxlZ2FjeSBzY2hlZHVsZWQgdGFzayAnJExlZ2FjeVF1ZXVlVGFza05hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9Cn0KCmZ1bmN0aW9uIFJlZ2lzdGVyLU9yVXBkYXRlVGFza3MgewogICAgVW5yZWdpc3Rlci1MZWdhY3lRdWV1ZVRhc2sKCiAgICB0cnkgewogICAgICAgICRleGlzdGluZ0RhZW1vbiA9IEdldC1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkRGFlbW9uVGFza05hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICBpZiAoJGV4aXN0aW5nRGFlbW9uKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RvcHBpbmcgc2NoZWR1bGVkIHRhc2sgJyREYWVtb25UYXNrTmFtZScgYmVmb3JlIHVwZGF0ZS4iCiAgICAgICAgICAgIFN0b3AtU2NoZWR1bGVkVGFzayAtVGFza05hbWUgJERhZW1vblRhc2tOYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDIKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3Qgc3RvcCBkYWVtb24gdGFzayAnJERhZW1vblRhc2tOYW1lJzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgfQoKICAgICRwcmluY2lwYWwgPSBOZXctU2NoZWR1bGVkVGFza1ByaW5jaXBhbCBgCiAgICAgICAgLVVzZXJJZCAnU1lTVEVNJyBgCiAgICAgICAgLUxvZ29uVHlwZSBTZXJ2aWNlQWNjb3VudCBgCiAgICAgICAgLVJ1bkxldmVsIEhpZ2hlc3QKCiAgICBXcml0ZS1Mb2cgIlJlZ2lzdGVyaW5nL3VwZGF0aW5nIHNjaGVkdWxlZCB0YXNrICckRGFlbW9uVGFza05hbWUnLiIKICAgICRkYWVtb25BcmdzID0gIi1Ob1Byb2ZpbGUgLUV4ZWN1dGlvblBvbGljeSBCeXBhc3MgLUZpbGUgYCIkTG9jYWxTY3JpcHRQYXRoYCIgLU1vZGUgRGFlbW9uIgogICAgJGRhZW1vbkFjdGlvbiA9IE5ldy1TY2hlZHVsZWRUYXNrQWN0aW9uIC1FeGVjdXRlICRQb3dlclNoZWxsRXhlIC1Bcmd1bWVudCAkZGFlbW9uQXJncwogICAgJGRhZW1vblRyaWdnZXIgPSBOZXctU2NoZWR1bGVkVGFza1RyaWdnZXIgLUF0U3RhcnR1cAogICAgJGRhZW1vblNldHRpbmdzID0gTmV3LVNjaGVkdWxlZFRhc2tTZXR0aW5nc1NldCBgCiAgICAgICAgLUFsbG93U3RhcnRJZk9uQmF0dGVyaWVzIGAKICAgICAgICAtRG9udFN0b3BJZkdvaW5nT25CYXR0ZXJpZXMgYAogICAgICAgIC1TdGFydFdoZW5BdmFpbGFibGUgYAogICAgICAgIC1NdWx0aXBsZUluc3RhbmNlcyBJZ25vcmVOZXcgYAogICAgICAgIC1FeGVjdXRpb25UaW1lTGltaXQgKE5ldy1UaW1lU3BhbiAtU2Vjb25kcyAwKSBgCiAgICAgICAgLVJlc3RhcnRDb3VudCAzIGAKICAgICAgICAtUmVzdGFydEludGVydmFsIChOZXctVGltZVNwYW4gLU1pbnV0ZXMgMSkKCiAgICAkZGFlbW9uVGFzayA9IE5ldy1TY2hlZHVsZWRUYXNrIGAKICAgICAgICAtQWN0aW9uICRkYWVtb25BY3Rpb24gYAogICAgICAgIC1UcmlnZ2VyICRkYWVtb25UcmlnZ2VyIGAKICAgICAgICAtUHJpbmNpcGFsICRwcmluY2lwYWwgYAogICAgICAgIC1TZXR0aW5ncyAkZGFlbW9uU2V0dGluZ3MKCiAgICBSZWdpc3Rlci1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkRGFlbW9uVGFza05hbWUgLUlucHV0T2JqZWN0ICRkYWVtb25UYXNrIC1Gb3JjZSB8IE91dC1OdWxsCgogICAgV3JpdGUtTG9nICJSZWdpc3RlcmluZy91cGRhdGluZyBzY2hlZHVsZWQgdGFzayAnJFVwZ3JhZGVUYXNrTmFtZScuIgogICAgJHVwZ3JhZGVBcmdzID0gIi1Ob1Byb2ZpbGUgLUV4ZWN1dGlvblBvbGljeSBCeXBhc3MgLUZpbGUgYCIkTG9jYWxTY3JpcHRQYXRoYCIgLU1vZGUgVXBncmFkZUFsbCIKICAgICR1cGdyYWRlQWN0aW9uID0gTmV3LVNjaGVkdWxlZFRhc2tBY3Rpb24gLUV4ZWN1dGUgJFBvd2VyU2hlbGxFeGUgLUFyZ3VtZW50ICR1cGdyYWRlQXJncwogICAgJHVwZ3JhZGVUcmlnZ2VyID0gTmV3LVNjaGVkdWxlZFRhc2tUcmlnZ2VyIGAKICAgICAgICAtT25jZSBgCiAgICAgICAgLUF0ICgoR2V0LURhdGUpLkFkZE1pbnV0ZXMoMikpIGAKICAgICAgICAtUmVwZXRpdGlvbkludGVydmFsIChOZXctVGltZVNwYW4gLUhvdXJzIDIpIGAKICAgICAgICAtUmVwZXRpdGlvbkR1cmF0aW9uIChOZXctVGltZVNwYW4gLURheXMgMzY1MCkKICAgICR1cGdyYWRlU2V0dGluZ3MgPSBOZXctU2NoZWR1bGVkVGFza1NldHRpbmdzU2V0IGAKICAgICAgICAtQWxsb3dTdGFydElmT25CYXR0ZXJpZXMgYAogICAgICAgIC1Eb250U3RvcElmR29pbmdPbkJhdHRlcmllcyBgCiAgICAgICAgLVN0YXJ0V2hlbkF2YWlsYWJsZSBgCiAgICAgICAgLU11bHRpcGxlSW5zdGFuY2VzIElnbm9yZU5ldyBgCiAgICAgICAgLUV4ZWN1dGlvblRpbWVMaW1pdCAoTmV3LVRpbWVTcGFuIC1Ib3VycyAyKQoKICAgICR1cGdyYWRlVGFzayA9IE5ldy1TY2hlZHVsZWRUYXNrIGAKICAgICAgICAtQWN0aW9uICR1cGdyYWRlQWN0aW9uIGAKICAgICAgICAtVHJpZ2dlciAkdXBncmFkZVRyaWdnZXIgYAogICAgICAgIC1QcmluY2lwYWwgJHByaW5jaXBhbCBgCiAgICAgICAgLVNldHRpbmdzICR1cGdyYWRlU2V0dGluZ3MKCiAgICBSZWdpc3Rlci1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkVXBncmFkZVRhc2tOYW1lIC1JbnB1dE9iamVjdCAkdXBncmFkZVRhc2sgLUZvcmNlIHwgT3V0LU51bGwKCiAgICB0cnkgewogICAgICAgIFN0YXJ0LVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICREYWVtb25UYXNrTmFtZQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiQ291bGQgbm90IHN0YXJ0IGRhZW1vbiB0YXNrICckRGFlbW9uVGFza05hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1XaW5nZXRJbnN0YWxsIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYWNrYWdlSWQsCiAgICAgICAgW3N0cmluZ10kUXVldWVJdGVtSWQKICAgICkKCiAgICAkYXJndW1lbnRzID0gQCgKICAgICAgICAnaW5zdGFsbCcKICAgICAgICAnLS1pZCcsICRQYWNrYWdlSWQKICAgICAgICAnLS1leGFjdCcKICAgICAgICAnLS1zY29wZScsICdtYWNoaW5lJwogICAgICAgICctLXNpbGVudCcKICAgICAgICAnLS1hY2NlcHQtcGFja2FnZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWFjY2VwdC1zb3VyY2UtYWdyZWVtZW50cycKICAgICAgICAnLS1kaXNhYmxlLWludGVyYWN0aXZpdHknCiAgICApCgogICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6IGAiJFdpbmdldFBhdGhgIiAkKCRhcmd1bWVudHMgLWpvaW4gJyAnKSIKICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICBVcGRhdGUtUXVldWVJdGVtUHJvZ3Jlc3MgLUlkICRRdWV1ZUl0ZW1JZCAtU3RhZ2UgJ0luc3RhbGwnIC1TdGFnZVRleHQgJ0luc3RhbGxhdGlvbiBsw6R1ZnQuLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KCiAgICAkb3V0cHV0TGluZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCiAgICAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAkbGluZSA9IFtzdHJpbmddJF8KICAgICAgICBbdm9pZF0kb3V0cHV0TGluZXMuQWRkKCRsaW5lKQogICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQ6ICRsaW5lIgogICAgICAgICAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgICAgICAgICAkcGVyY2VudCA9IEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSAtTGluZSAkbGluZQogICAgICAgICAgICAgICAgaWYgKCRudWxsIC1uZSAkcGVyY2VudCkgewogICAgICAgICAgICAgICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnRG93bmxvYWQnIC1TdGFnZVRleHQgKCJEb3dubG9hZCBsw6R1ZnQuLi4gezB9JSIgLWYgJHBlcmNlbnQpIC1Qcm9ncmVzc1BlcmNlbnQgJHBlcmNlbnQgLUlzSW5kZXRlcm1pbmF0ZTokZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICByZXR1cm4gJGV4aXRDb2RlCn0KCmZ1bmN0aW9uIEludm9rZS1XaW5nZXRVbmluc3RhbGwgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFdpbmdldFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhY2thZ2VJZCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgICRhcmd1bWVudHMgPSBAKAogICAgICAgICd1bmluc3RhbGwnCiAgICAgICAgJy0taWQnLCAkUGFja2FnZUlkCiAgICAgICAgJy0tZXhhY3QnCiAgICAgICAgJy0tc2NvcGUnLCAnbWFjaGluZScKICAgICAgICAnLS1zaWxlbnQnCiAgICAgICAgJy0tYWNjZXB0LXNvdXJjZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWRpc2FibGUtaW50ZXJhY3Rpdml0eScKICAgICkKCiAgICBXcml0ZS1Mb2cgIkV4ZWN1dGluZzogYCIkV2luZ2V0UGF0aGAiICQoJGFyZ3VtZW50cyAtam9pbiAnICcpIgogICAgaWYgKCRRdWV1ZUl0ZW1JZCkgewogICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVW5pbnN0YWxsJyAtU3RhZ2VUZXh0ICdEZWluc3RhbGxhdGlvbiBsw6R1ZnQuLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KCiAgICAkb3V0cHV0TGluZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCiAgICAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAkbGluZSA9IFtzdHJpbmddJF8KICAgICAgICBbdm9pZF0kb3V0cHV0TGluZXMuQWRkKCRsaW5lKQogICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQ6ICRsaW5lIgogICAgICAgICAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgICAgICAgICAkcGVyY2VudCA9IEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSAtTGluZSAkbGluZQogICAgICAgICAgICAgICAgaWYgKCRudWxsIC1uZSAkcGVyY2VudCkgewogICAgICAgICAgICAgICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVW5pbnN0YWxsJyAtU3RhZ2VUZXh0ICgiRGVpbnN0YWxsYXRpb24gbMOkdWZ0Li4uIHswfSUiIC1mICRwZXJjZW50KSAtUHJvZ3Jlc3NQZXJjZW50ICRwZXJjZW50IC1Jc0luZGV0ZXJtaW5hdGU6JGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkZXhpdENvZGUgPSAkTEFTVEVYSVRDT0RFCgogICAgcmV0dXJuICRleGl0Q29kZQp9CgpmdW5jdGlvbiBJbnZva2UtV2luZ2V0VXBncmFkZUFsbCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kV2luZ2V0UGF0aCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgICRhcmd1bWVudHMgPSBAKAogICAgICAgICd1cGdyYWRlJwogICAgICAgICctLWFsbCcKICAgICAgICAnLS1zY29wZScsICdtYWNoaW5lJwogICAgICAgICctLXNpbGVudCcKICAgICAgICAnLS1hY2NlcHQtcGFja2FnZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWFjY2VwdC1zb3VyY2UtYWdyZWVtZW50cycKICAgICAgICAnLS1kaXNhYmxlLWludGVyYWN0aXZpdHknCiAgICApCgogICAgV3JpdGUtTG9nICJFeGVjdXRpbmcgMi1ob3VyIHVwZ3JhZGU6IGAiJFdpbmdldFBhdGhgIiAkKCRhcmd1bWVudHMgLWpvaW4gJyAnKSIKICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICBVcGRhdGUtUXVldWVJdGVtUHJvZ3Jlc3MgLUlkICRRdWV1ZUl0ZW1JZCAtU3RhZ2UgJ1VwZ3JhZGUnIC1TdGFnZVRleHQgJ1VwZGF0ZXMgbGF1ZmVuLi4uJyAtSXNJbmRldGVybWluYXRlOiR0cnVlCiAgICB9CgogICAgJG91dHB1dExpbmVzID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdFtzdHJpbmddJwogICAgJiAkV2luZ2V0UGF0aCBAYXJndW1lbnRzIDI+JjEgfCBGb3JFYWNoLU9iamVjdCB7CiAgICAgICAgJGxpbmUgPSBbc3RyaW5nXSRfCiAgICAgICAgW3ZvaWRdJG91dHB1dExpbmVzLkFkZCgkbGluZSkKICAgICAgICBpZiAoJGxpbmUuVHJpbSgpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAid2luZ2V0IHVwZ3JhZGU6ICRsaW5lIgogICAgICAgICAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgICAgICAgICAkcGVyY2VudCA9IEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSAtTGluZSAkbGluZQogICAgICAgICAgICAgICAgaWYgKCRudWxsIC1uZSAkcGVyY2VudCkgewogICAgICAgICAgICAgICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVXBncmFkZScgLVN0YWdlVGV4dCAoIlVwZGF0ZXMgbGF1ZmVuLi4uIHswfSUiIC1mICRwZXJjZW50KSAtUHJvZ3Jlc3NQZXJjZW50ICRwZXJjZW50IC1Jc0luZGV0ZXJtaW5hdGU6JGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkZXhpdENvZGUgPSAkTEFTVEVYSVRDT0RFCgogICAgcmV0dXJuICRleGl0Q29kZQp9CgpmdW5jdGlvbiBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kV2luZ2V0UGF0aCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKCiAgICAkdGVtcFJvb3QgPSBpZiAoJGVudjpURU1QKSB7ICRlbnY6VEVNUCB9IGVsc2VpZiAoJGVudjpUTVApIHsgJGVudjpUTVAgfSBlbHNlIHsgJEJhc2VEaXIgfQogICAgJHRlbXBGaWxlID0gSm9pbi1QYXRoICR0ZW1wUm9vdCAoInNlbGZzZXJ2aWNlLXdpbmdldC1leHBvcnQtezB9Lmpzb24iIC1mIFtHdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCdOJykpCiAgICAkc25hcHNob3RUZW1wRmlsZSA9IEpvaW4tUGF0aCAkQmFzZURpciAoIkluc3RhbGxlZC1QYWNrYWdlcy17MH0uanNvbi50bXAiIC1mIFtHdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCdOJykpCgogICAgJGFyZ3VtZW50cyA9IEAoCiAgICAgICAgJ2V4cG9ydCcKICAgICAgICAnLS1vdXRwdXQnLCAkdGVtcEZpbGUKICAgICAgICAnLS1hY2NlcHQtc291cmNlLWFncmVlbWVudHMnCiAgICAgICAgJy0tZGlzYWJsZS1pbnRlcmFjdGl2aXR5JwogICAgKQoKICAgIFdyaXRlLUxvZyAnUmVmcmVzaGluZyBpbnN0YWxsZWQgcGFja2FnZSBzbmFwc2hvdC4nCiAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdTbmFwc2hvdCcgLVN0YWdlVGV4dCAnSW5zdGFsbGF0aW9uc2RhdGVuIHdlcmRlbiBha3R1YWxpc2llcnQuLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KICAgICRvdXRwdXQgPSAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IE91dC1TdHJpbmcKICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICBpZiAoJG91dHB1dCkgewogICAgICAgIGZvcmVhY2ggKCRsaW5lIGluICgkb3V0cHV0IC1zcGxpdCAiYHI/YG4iKSkgewogICAgICAgICAgICBpZiAoJGxpbmUuVHJpbSgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIndpbmdldCBleHBvcnQ6ICRsaW5lIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkZXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1Mb2cgIndpbmdldCBleHBvcnQgZmFpbGVkIHdpdGggY29kZSAkZXhpdENvZGU7IHNuYXBzaG90IHdhcyBub3QgdXBkYXRlZC4iICdXQVJOJwogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICR0ZW1wRmlsZSkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZhbHNlCiAgICB9CgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlKSkgewogICAgICAgIFdyaXRlLUxvZyAnd2luZ2V0IGV4cG9ydCBkaWQgbm90IHByb2R1Y2UgYW4gb3V0cHV0IGZpbGU7IHNuYXBzaG90IHdhcyBub3QgdXBkYXRlZC4nICdXQVJOJwogICAgICAgIHJldHVybiAkZmFsc2UKICAgIH0KCiAgICB0cnkgewogICAgICAgICRyYXcgPSBHZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlIC1SYXcgLUVuY29kaW5nIFVURjgKICAgICAgICAkZXhwb3J0ID0gJHJhdyB8IENvbnZlcnRGcm9tLUpzb24KCiAgICAgICAgJHBhY2thZ2VJZHMgPSBAKCkKICAgICAgICBmb3JlYWNoICgkc291cmNlIGluIEAoJGV4cG9ydC5Tb3VyY2VzKSkgewogICAgICAgICAgICBmb3JlYWNoICgkcGtnIGluIEAoJHNvdXJjZS5QYWNrYWdlcykpIHsKICAgICAgICAgICAgICAgIGlmICgkcGtnLlBhY2thZ2VJZGVudGlmaWVyKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhY2thZ2VJZHMgKz0gW3N0cmluZ10kcGtnLlBhY2thZ2VJZGVudGlmaWVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlaWYgKCRwa2cuUGFja2FnZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhY2thZ2VJZHMgKz0gW3N0cmluZ10kcGtnLlBhY2thZ2VJZAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcGFja2FnZUlkcyA9ICRwYWNrYWdlSWRzIHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHsgLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRfKSB9IHwKICAgICAgICAgICAgRm9yRWFjaC1PYmplY3QgeyAkXy5UcmltKCkgfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IC1VbmlxdWUKCiAgICAgICAgJHNuYXBzaG90ID0gW29yZGVyZWRdQHsKICAgICAgICAgICAgR2VuZXJhdGVkQXQgICAgICAgICAgPSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykKICAgICAgICAgICAgSW5zdGFsbGVkUGFja2FnZUlkcyAgPSBAKCRwYWNrYWdlSWRzKQogICAgICAgIH0KCiAgICAgICAgJHNuYXBzaG90IHwgQ29udmVydFRvLUpzb24gLURlcHRoIDUgfCBTZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUgLUVuY29kaW5nIFVURjgKICAgICAgICBNb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRzbmFwc2hvdFRlbXBGaWxlIC1EZXN0aW5hdGlvbiAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1Gb3JjZQogICAgICAgIFdyaXRlLUxvZyAiSW5zdGFsbGVkIHBhY2thZ2Ugc25hcHNob3Qgd3JpdHRlbiB0byAnJEluc3RhbGxlZFBhY2thZ2VzUGF0aCcgKGNvdW50PSQoQCgkcGFja2FnZUlkcykuQ291bnQpKS4iCiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJGYWlsZWQgdG8gd3JpdGUgaW5zdGFsbGVkIHBhY2thZ2Ugc25hcHNob3Q6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gJGZhbHNlCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUpIHsKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICR0ZW1wRmlsZSAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUpIHsKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRzbmFwc2hvdFRlbXBGaWxlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gR2V0LUluc3RhbGxlZFBhY2thZ2VJZFNldCB7CiAgICAkc2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRJbnN0YWxsZWRQYWNrYWdlc1BhdGgpKSB7CiAgICAgICAgcmV0dXJuICRzZXQKICAgIH0KCiAgICB0cnkgewogICAgICAgICRyYXcgPSBHZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJEluc3RhbGxlZFBhY2thZ2VzUGF0aCAtUmF3IC1FbmNvZGluZyBVVEY4CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHJhdykpIHsKICAgICAgICAgICAgcmV0dXJuICRzZXQKICAgICAgICB9CgogICAgICAgICRzbmFwc2hvdCA9ICRyYXcgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgZm9yZWFjaCAoJGlkIGluIEAoJHNuYXBzaG90Lkluc3RhbGxlZFBhY2thZ2VJZHMpKSB7CiAgICAgICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ10kaWQpKSB7CiAgICAgICAgICAgICAgICBbdm9pZF0kc2V0LkFkZCgoW3N0cmluZ10kaWQpLlRyaW0oKSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIGluc3RhbGxlZCBwYWNrYWdlIHNuYXBzaG90OiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9CgogICAgcmV0dXJuICRzZXQKfQoKZnVuY3Rpb24gSW52b2tlLVJlcXVpcmVkU29mdHdhcmVQb2xpY3kgewogICAgcGFyYW0oW3N0cmluZ10kV2luZ2V0UGF0aCkKCiAgICBpZiAoLW5vdCAoVGVzdC1Tb2Z0d2FyZUNhdGFsb2dQb2xpY3lFbmFibGVkKSkgewogICAgICAgIFdyaXRlLUxvZyAnUmVxdWlyZWQgc29mdHdhcmUgcG9saWN5IHNraXBwZWQgYmVjYXVzZSBTb2Z0d2FyZWthdGFsb2cgcG9saWN5IGlzIGRpc2FibGVkIG9yIG5vdCBjb25maWd1cmVkLicgJ1dBUk4nCiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AeyBJbnN0YWxsZWQgPSAwOyBGYWlsZWQgPSAwOyBTa2lwcGVkID0gMCB9CiAgICB9CgogICAgaWYgKC1ub3QgKFRlc3QtUmVxdWlyZWRFbmZvcmNlbWVudEVuYWJsZWQpKSB7CiAgICAgICAgV3JpdGUtTG9nICdSZXF1aXJlZCBzb2Z0d2FyZSBlbmZvcmNlbWVudCBpcyBkaXNhYmxlZCBieSBwb2xpY3kuJwogICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsgSW5zdGFsbGVkID0gMDsgRmFpbGVkID0gMDsgU2tpcHBlZCA9IDAgfQogICAgfQoKICAgICRyZXF1aXJlZEFsaWFzZXMgPSBAKEdldC1SZXF1aXJlZEFsaWFzZXMpCiAgICBpZiAoJHJlcXVpcmVkQWxpYXNlcy5Db3VudCAtbHQgMSkgewogICAgICAgIFdyaXRlLUxvZyAnTm8gcmVxdWlyZWQgc29mdHdhcmUgY29uZmlndXJlZCBieSBwb2xpY3kuJwogICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsgSW5zdGFsbGVkID0gMDsgRmFpbGVkID0gMDsgU2tpcHBlZCA9IDAgfQogICAgfQoKICAgIGlmICgkV2luZ2V0UGF0aCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEludm9rZS1XaXRoV2luZ2V0TG9jayAtVGltZW91dFNlY29uZHMgMiAtU2NyaXB0QmxvY2sgewogICAgICAgICAgICAgICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aAogICAgICAgICAgICB9IHwgT3V0LU51bGwKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCByZWZyZXNoIHNuYXBzaG90IGJlZm9yZSByZXF1aXJlZCBxdWV1ZWluZzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIH0KICAgIH0KCiAgICAkcXVldWVkID0gRW5zdXJlLVJlcXVpcmVkU29mdHdhcmVRdWV1ZWQKICAgIGlmICgkcXVldWVkIC1ndCAwKSB7CiAgICAgICAgU3RhcnQtUXVldWVXb3JrZXIKICAgIH0KCiAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7IEluc3RhbGxlZCA9IDA7IEZhaWxlZCA9IDA7IFNraXBwZWQgPSAwOyBRdWV1ZWQgPSAkcXVldWVkIH0KfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dQaXBlU2VjdXJpdHkgewogICAgJHBpcGVTZWN1cml0eSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVTZWN1cml0eQoKICAgICRzaWRTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0xOCcpCiAgICAkc2lkQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ0JykKICAgICRzaWRVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NScpCgogICAgJHJ1bGVTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUnVsZSgKICAgICAgICAkc2lkU3lzdGVtLAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZUFjY2Vzc1JpZ2h0c106OkZ1bGxDb250cm9sLAogICAgICAgIFtTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5BY2Nlc3NDb250cm9sVHlwZV06OkFsbG93CiAgICApCiAgICAkcnVsZUFkbWlucyA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSdWxlKAogICAgICAgICRzaWRBZG1pbnMsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUmlnaHRzXTo6RnVsbENvbnRyb2wsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlXTo6QWxsb3cKICAgICkKICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUnVsZSgKICAgICAgICAkc2lkVXNlcnMsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUmlnaHRzXTo6UmVhZFdyaXRlLAogICAgICAgIFtTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5BY2Nlc3NDb250cm9sVHlwZV06OkFsbG93CiAgICApCgogICAgJG51bGwgPSAkcGlwZVNlY3VyaXR5LkFkZEFjY2Vzc1J1bGUoJHJ1bGVTeXN0ZW0pCiAgICAkbnVsbCA9ICRwaXBlU2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgkcnVsZUFkbWlucykKICAgICRudWxsID0gJHBpcGVTZWN1cml0eS5BZGRBY2Nlc3NSdWxlKCRydWxlVXNlcnMpCgogICAgcmV0dXJuICRwaXBlU2VjdXJpdHkKfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dQaXBlU2VydmVyIHsKICAgICRwaXBlU2VjdXJpdHkgPSBOZXctQ2F0YWxvZ1BpcGVTZWN1cml0eQogICAgcmV0dXJuIE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLk5hbWVkUGlwZVNlcnZlclN0cmVhbSAtQXJndW1lbnRMaXN0IEAoCiAgICAgICAgJFBpcGVOYW1lLAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZURpcmVjdGlvbl06OkluT3V0LAogICAgICAgIDEsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlVHJhbnNtaXNzaW9uTW9kZV06OkJ5dGUsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlT3B0aW9uc106Ok5vbmUsCiAgICAgICAgNDA5NiwKICAgICAgICA0MDk2LAogICAgICAgICRwaXBlU2VjdXJpdHkKICAgICkKfQoKZnVuY3Rpb24gR2V0LVBpcGVDbGllbnRJZGVudGl0eSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1N5c3RlbS5JTy5QaXBlcy5OYW1lZFBpcGVTZXJ2ZXJTdHJlYW1dJFBpcGUpCgogICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJG51bGwKICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5U2lkID0gJG51bGwKCiAgICB0cnkgewogICAgICAgICRQaXBlLlJ1bkFzQ2xpZW50KFtTeXN0ZW0uSU8uUGlwZXMuUGlwZVN0cmVhbUltcGVyc29uYXRpb25Xb3JrZXJdewogICAgICAgICAgICAkaWRlbnRpdHkgPSBbU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5XaW5kb3dzSWRlbnRpdHldOjpHZXRDdXJyZW50KCkKICAgICAgICAgICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJGlkZW50aXR5Lk5hbWUKICAgICAgICAgICAgaWYgKCRpZGVudGl0eS5Vc2VyKSB7CiAgICAgICAgICAgICAgICAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eVNpZCA9ICRpZGVudGl0eS5Vc2VyLlZhbHVlCiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfQogICAgY2F0Y2ggewogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5TmFtZSA9ICRQaXBlLkdldEltcGVyc29uYXRpb25Vc2VyTmFtZSgpCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9CgogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lKSkgewogICAgICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5TmFtZSA9ICdVbmtub3duJwogICAgfQoKICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICBOYW1lID0gJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lCiAgICAgICAgU2lkICA9ICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5U2lkCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1DYXRhbG9nRGFlbW9uQ29tbWFuZCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldJFJlcXVlc3QsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRDbGllbnRJZGVudGl0eQogICAgKQoKICAgIGlmICgtbm90ICRDbGllbnRJZGVudGl0eSAtb3IgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkQ2xpZW50SWRlbnRpdHkuTmFtZSkgLW9yICRDbGllbnRJZGVudGl0eS5OYW1lIC1lcSAnVW5rbm93bicpIHsKICAgICAgICB0aHJvdyAnTmFtZWQgcGlwZSBjbGllbnQgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQuJwogICAgfQoKICAgICRjb21tYW5kID0gJG51bGwKICAgICRjb21tYW5kUHJvcGVydHkgPSAkUmVxdWVzdC5QU09iamVjdC5Qcm9wZXJ0aWVzWydDb21tYW5kJ10KICAgICRhY3Rpb25Qcm9wZXJ0eSA9ICRSZXF1ZXN0LlBTT2JqZWN0LlByb3BlcnRpZXNbJ0FjdGlvbiddCiAgICBpZiAoJGNvbW1hbmRQcm9wZXJ0eSAtYW5kICRjb21tYW5kUHJvcGVydHkuVmFsdWUpIHsKICAgICAgICAkY29tbWFuZCA9IFtzdHJpbmddJGNvbW1hbmRQcm9wZXJ0eS5WYWx1ZQogICAgfQogICAgZWxzZWlmICgkYWN0aW9uUHJvcGVydHkgLWFuZCAkYWN0aW9uUHJvcGVydHkuVmFsdWUpIHsKICAgICAgICAkY29tbWFuZCA9IFtzdHJpbmddJGFjdGlvblByb3BlcnR5LlZhbHVlCiAgICB9CgogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGNvbW1hbmQpKSB7CiAgICAgICAgdGhyb3cgJ01pc3NpbmcgY29tbWFuZC4nCiAgICB9CgogICAgJGNvbW1hbmQgPSAkY29tbWFuZC5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCgogICAgc3dpdGNoICgkY29tbWFuZCkgewogICAgICAgIHsgJF8gLWluIEAoJ2dldGNhdGFsb2cnLCdnZXRzdGF0ZScpIH0gewogICAgICAgICAgICAkcmVxdWlyZWRRdWV1ZWQgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAogICAgICAgICAgICBpZiAoJHJlcXVpcmVkUXVldWVkIC1ndCAwKSB7CiAgICAgICAgICAgICAgICBBZGQtRGFlbW9uUG9zdFJlc3BvbnNlV29ya2VyIC1Xb3JrZXJNb2RlIFByb2Nlc3NRdWV1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgICRjYXRhbG9nID0gQChHZXQtQXBwQ2F0YWxvZ09iamVjdHMgfCBTb3J0LU9iamVjdCBEaXNwbGF5TmFtZSkKICAgICAgICAgICAgJHJlcXVpcmVkQWxpYXNlcyA9IEAoR2V0LVJlcXVpcmVkQWxpYXNlcykKICAgICAgICAgICAgJHJlcXVpcmVkU2V0ID0gR2V0LVJlcXVpcmVkQWxpYXNTZXQKICAgICAgICAgICAgJGluc3RhbGxlZElkcyA9IEAoKEdldC1JbnN0YWxsZWRQYWNrYWdlSWRTZXQpIHwgRm9yRWFjaC1PYmplY3QgeyBbc3RyaW5nXSRfIH0pCiAgICAgICAgICAgICRxdWV1ZVN0YXRlID0gR2V0LVF1ZXVlU3RhdGVTbmFwc2hvdAogICAgICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgQ29tbWFuZCAgICAgICAgICAgID0gJGNvbW1hbmQKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5ICAgICAgICA9ICRDbGllbnRJZGVudGl0eS5OYW1lCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRCeVNpZCAgICAgPSAkQ2xpZW50SWRlbnRpdHkuU2lkCiAgICAgICAgICAgICAgICBDYXRhbG9nICAgICAgICAgICAgPSAkY2F0YWxvZwogICAgICAgICAgICAgICAgUmVxdWlyZWRBbGlhc2VzICAgID0gJHJlcXVpcmVkQWxpYXNlcwogICAgICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgID0gQCgkcXVldWVTdGF0ZS5RdWV1ZSkKICAgICAgICAgICAgICAgIEN1cnJlbnQgICAgICAgICAgICA9ICRxdWV1ZVN0YXRlLkN1cnJlbnQKICAgICAgICAgICAgICAgIFZlcnNpb24gICAgICAgICAgICA9ICRxdWV1ZVN0YXRlLlZlcnNpb24KICAgICAgICAgICAgICAgIEluc3RhbGxlZFBhY2thZ2VJZHMgPSAkaW5zdGFsbGVkSWRzCiAgICAgICAgICAgICAgICBBbGxvd1VzZXJJbnN0YWxscyAgPSAoVGVzdC1Vc2VySW5zdGFsbHNBbGxvd2VkKQogICAgICAgICAgICAgICAgQWxsb3dVc2VyVW5pbnN0YWxsID0gKFRlc3QtVXNlclVuaW5zdGFsbEFsbG93ZWQpCiAgICAgICAgICAgICAgICBFbmZvcmNlUmVxdWlyZWQgICAgPSAoVGVzdC1SZXF1aXJlZEVuZm9yY2VtZW50RW5hYmxlZCkKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICA9ICdLYXRhbG9nIGdlbGFkZW4uJwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAnYXBwbHlwb2xpY3knIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJBdXRoZW50aWNhdGVkIHBvbGljeSBhcHBseSByZXF1ZXN0ZWQgYnkgdXNlcj0nJCgkQ2xpZW50SWRlbnRpdHkuTmFtZSknIHNpZD0nJCgkQ2xpZW50SWRlbnRpdHkuU2lkKSciCiAgICAgICAgICAgIEFkZC1EYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXIgLVdvcmtlck1vZGUgQXBwbHlQb2xpY3kKICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgQ29tbWFuZCAgICAgICAgPSAkY29tbWFuZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgPSAkQ2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnlTaWQgPSAkQ2xpZW50SWRlbnRpdHkuU2lkCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgICAgICA9ICdQb2xpY3lhbndlbmR1bmcgZ2VzdGFydGV0LicKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeyAkXyAtaW4gQCgnaW5zdGFsbCcsJ3VuaW5zdGFsbCcpIH0gewogICAgICAgICAgICBpZiAoJGNvbW1hbmQgLWVxICdpbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCkpIHsKICAgICAgICAgICAgICAgIHRocm93ICdCZW51dHplcmluc3RhbGxhdGlvbmVuIHNpbmQgcGVyIFJpY2h0bGluaWUgZGVha3RpdmllcnQuJwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNvbW1hbmQgLWVxICd1bmluc3RhbGwnIC1hbmQgLW5vdCAoVGVzdC1Vc2VyVW5pbnN0YWxsQWxsb3dlZCkpIHsKICAgICAgICAgICAgICAgIHRocm93ICdCZW51dHplcmRlaW5zdGFsbGF0aW9uZW4gc2luZCBwZXIgUmljaHRsaW5pZSBkZWFrdGl2aWVydC4nCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcHBBbGlhc1Byb3BlcnR5ID0gJFJlcXVlc3QuUFNPYmplY3QuUHJvcGVydGllc1snQXBwQWxpYXMnXQogICAgICAgICAgICBpZiAoLW5vdCAkYXBwQWxpYXNQcm9wZXJ0eSAtb3IgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShbc3RyaW5nXSRhcHBBbGlhc1Byb3BlcnR5LlZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJ01pc3NpbmcgQXBwQWxpYXMuJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYWxpYXMgPSAoW3N0cmluZ10kYXBwQWxpYXNQcm9wZXJ0eS5WYWx1ZSkuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQogICAgICAgICAgICAkcGFja2FnZUlkID0gR2V0LVBhY2thZ2VJZEJ5QWxpYXMgLUFsaWFzICRhbGlhcwogICAgICAgICAgICBpZiAoLW5vdCAkcGFja2FnZUlkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiQWxpYXMgJyRhbGlhcycgaXMgbm90IGluIHRoZSBhbGxvd2xpc3QuIgogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVxdWlyZWRTZXQgPSBHZXQtUmVxdWlyZWRBbGlhc1NldAogICAgICAgICAgICBpZiAoJGNvbW1hbmQgLWVxICd1bmluc3RhbGwnIC1hbmQgJHJlcXVpcmVkU2V0LkNvbnRhaW5zKCRhbGlhcykpIHsKICAgICAgICAgICAgICAgIHRocm93ICdQZmxpY2h0c29mdHdhcmUga2FubiBuaWNodCBkZWluc3RhbGxpZXJ0IHdlcmRlbi4nCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhY3Rpb25UZXh0ID0gaWYgKCRjb21tYW5kIC1lcSAndW5pbnN0YWxsJykgeyAndW5pbnN0YWxsJyB9IGVsc2UgeyAnaW5zdGFsbCcgfQogICAgICAgICAgICBXcml0ZS1Mb2cgIkF1dGhlbnRpY2F0ZWQgcmVxdWVzdDogYWN0aW9uPSRhY3Rpb25UZXh0IGFsaWFzPSckYWxpYXMnIHBhY2thZ2U9JyRwYWNrYWdlSWQnIHVzZXI9JyQoJENsaWVudElkZW50aXR5Lk5hbWUpJyBzaWQ9JyQoJENsaWVudElkZW50aXR5LlNpZCknIgoKICAgICAgICAgICAgJHF1ZXVlUmVzdWx0ID0gQWRkLVNvZnR3YXJlUmVxdWVzdFRvUXVldWUgLUFjdGlvbiAkY29tbWFuZCAtQWxpYXMgJGFsaWFzIC1SZXF1ZXN0ZWRCeSAkQ2xpZW50SWRlbnRpdHkuTmFtZSAtUmVxdWVzdGVkQnlTaWQgJENsaWVudElkZW50aXR5LlNpZCAtU291cmNlIFVzZXIKICAgICAgICAgICAgQWRkLURhZW1vblBvc3RSZXNwb25zZVdvcmtlciAtV29ya2VyTW9kZSBQcm9jZXNzUXVldWUKCiAgICAgICAgICAgIGlmICgkY29tbWFuZCAtZXEgJ3VuaW5zdGFsbCcpIHsKICAgICAgICAgICAgICAgICR2ZXJiID0gJ0RlaW5zdGFsbGF0aW9uJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHZlcmIgPSAnSW5zdGFsbGF0aW9uJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcXVldWVSZXN1bHQuQWRkZWQpIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIiR2ZXJiIGVpbmdlcmVpaHQ6ICRhbGlhcyIKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIiR2ZXJiIGlzdCBiZXJlaXRzIGluIGRlciBXYXJ0ZXNjaGxhbmdlOiAkYWxpYXMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIENvbW1hbmQgICAgICAgICA9ICRjb21tYW5kCiAgICAgICAgICAgICAgICBBcHBBbGlhcyAgICAgICAgPSAkYWxpYXMKICAgICAgICAgICAgICAgIFBhY2thZ2VJZCAgICAgICA9ICRwYWNrYWdlSWQKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5ICAgICA9ICRDbGllbnRJZGVudGl0eS5OYW1lCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRCeVNpZCAgPSAkQ2xpZW50SWRlbnRpdHkuU2lkCiAgICAgICAgICAgICAgICBRdWV1ZUlkICAgICAgICAgPSAkcXVldWVSZXN1bHQuSXRlbS5JZAogICAgICAgICAgICAgICAgUXVldWVkICAgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9ICRtZXNzYWdlCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHsgJF8gLWluIEAoJ3JlZnJlc2hzdGF0dXMnLCdnZXRzdGF0dXMnKSB9IHsKICAgICAgICAgICAgV3JpdGUtTG9nICJBdXRoZW50aWNhdGVkIHN0YXR1cyByZWZyZXNoIHJlcXVlc3RlZCBieSB1c2VyPSckKCRDbGllbnRJZGVudGl0eS5OYW1lKScgc2lkPSckKCRDbGllbnRJZGVudGl0eS5TaWQpJyIKICAgICAgICAgICAgJHN0YXJ0ZWQgPSAkZmFsc2UKICAgICAgICAgICAgaWYgKFRlc3QtV2luZ2V0TG9ja0F2YWlsYWJsZSkgewogICAgICAgICAgICAgICAgQWRkLURhZW1vblBvc3RSZXNwb25zZVdvcmtlciAtV29ya2VyTW9kZSBQcm9jZXNzUXVldWUKICAgICAgICAgICAgICAgICRzdGFydGVkID0gJHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlID0gJ0luc3RhbGxhdGlvbnNkYXRlbi1Ba3R1YWxpc2llcnVuZyBnZXN0YXJ0ZXQuJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAnSW5zdGFsbGF0aW9uc2RhdGVuLUFrdHVhbGlzaWVydW5nIGzDpHVmdCBiZXJlaXRzLicKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIENvbW1hbmQgICAgICAgICA9ICRjb21tYW5kCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRCeSAgICAgPSAkQ2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnlTaWQgID0gJENsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgU25hcHNob3RRdWV1ZWQgID0gJHN0YXJ0ZWQKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9ICRtZXNzYWdlCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICB0aHJvdyAiVW5zdXBwb3J0ZWQgY29tbWFuZCAnJGNvbW1hbmQnLiIKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIFN0YXJ0LUNhdGFsb2dEYWVtb24gewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBzdGFydGluZyBvbiAnXFwuXHBpcGVcJFBpcGVOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBTdGFydC1Tb2Z0d2FyZWthdGFsb2dXb3JrZXIgLVdvcmtlck1vZGUgQXBwbHlQb2xpY3kKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCBzdGFydCBpbml0aWFsIHJlcXVpcmVkIHNvZnR3YXJlIGVuZm9yY2VtZW50IHdvcmtlcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgfQoKICAgIHdoaWxlICgkdHJ1ZSkgewogICAgICAgICRwaXBlID0gJG51bGwKICAgICAgICB0cnkgewogICAgICAgICAgICAkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgPSBAKCkKICAgICAgICAgICAgJHBpcGUgPSBOZXctQ2F0YWxvZ1BpcGVTZXJ2ZXIKICAgICAgICAgICAgJHBpcGUuV2FpdEZvckNvbm5lY3Rpb24oKQoKICAgICAgICAgICAgJGNsaWVudElkZW50aXR5ID0gR2V0LVBpcGVDbGllbnRJZGVudGl0eSAtUGlwZSAkcGlwZQogICAgICAgICAgICAkZW5jb2RpbmcgPSBOZXctT2JqZWN0IFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZygkZmFsc2UpCiAgICAgICAgICAgICRyZWFkZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1SZWFkZXIoJHBpcGUsICRlbmNvZGluZykKICAgICAgICAgICAgJHdyaXRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVdyaXRlcigkcGlwZSwgJGVuY29kaW5nKQogICAgICAgICAgICAkd3JpdGVyLkF1dG9GbHVzaCA9ICR0cnVlCgogICAgICAgICAgICAkcmVzcG9uc2UgPSAkbnVsbAogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHJlYWRUYXNrID0gJHJlYWRlci5SZWFkTGluZUFzeW5jKCkKICAgICAgICAgICAgICAgIGlmICgtbm90ICRyZWFkVGFzay5XYWl0KDMwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93ICdUaW1lZCBvdXQgd2FpdGluZyBmb3IgbmFtZWQgcGlwZSByZXF1ZXN0LicKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRsaW5lID0gJHJlYWRUYXNrLlJlc3VsdAogICAgICAgICAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ0VtcHR5IHJlcXVlc3QuJwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXF1ZXN0ID0gJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbkNvbW1hbmQgLVJlcXVlc3QgJHJlcXVlc3QgLUNsaWVudElkZW50aXR5ICRjbGllbnRJZGVudGl0eQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiTmFtZWQgcGlwZSByZXF1ZXN0IGZhaWxlZDogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgID0gJGZhbHNlCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgPSAkY2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkID0gJGNsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgID0gJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHdyaXRlci5Xcml0ZUxpbmUoKCRyZXNwb25zZSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcyAtRGVwdGggNikpCiAgICAgICAgICAgIEludm9rZS1EYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXJzCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBlcnJvcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKCRwaXBlKSB7CiAgICAgICAgICAgICAgICAkcGlwZS5EaXNwb3NlKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMgewogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiBAKCRzdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uU3RhdGUgLWVxICdSdW5uaW5nJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2UgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ05hY2ggTmV1c3RhcnQgZXJuZXV0IGVpbmdlcmVpaHQnCiAgICAgICAgICAgICAgICAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQgPSAkbnVsbAogICAgICAgICAgICAgICAgJGl0ZW0uSXNJbmRldGVybWluYXRlID0gJGZhbHNlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFydGVkQXQgPSAkbnVsbAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gR2V0LU5leHRRdWV1ZWRJdGVtIHsKICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRudWxsCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHN0YXRlKQogICAgICAgIGZvcmVhY2ggKCRpdGVtIGluIChAKCRzdGF0ZS5RdWV1ZSkgfCBTb3J0LU9iamVjdCBDcmVhdGVkQXQpKSB7CiAgICAgICAgICAgIGlmICgtbm90ICRpdGVtKSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgaWYgKCRpdGVtLlN0YXRlIC1lcSAnUXVldWVkJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUnVubmluZycKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJ1N0YXJ0aW5nJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ1ZvcmJlcmVpdHVuZy4uLicKICAgICAgICAgICAgICAgICRpdGVtLlByb2dyZXNzUGVyY2VudCA9ICRudWxsCiAgICAgICAgICAgICAgICAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUgPSAkdHJ1ZQogICAgICAgICAgICAgICAgJGl0ZW0uU3RhcnRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgICAgICAgICAkc3RhdGUuQ3VycmVudCA9IFtwc2N1c3RvbW9iamVjdF1bb3JkZXJlZF1AewogICAgICAgICAgICAgICAgICAgIElkID0gJGl0ZW0uSWQKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPSAkaXRlbS5BY3Rpb24KICAgICAgICAgICAgICAgICAgICBBbGlhcyA9ICRpdGVtLkFsaWFzCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPSAkaXRlbS5EaXNwbGF5TmFtZQogICAgICAgICAgICAgICAgICAgIFN0YWdlID0gJGl0ZW0uU3RhZ2UKICAgICAgICAgICAgICAgICAgICBTdGFnZVRleHQgPSAkaXRlbS5TdGFnZVRleHQKICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPSAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQKICAgICAgICAgICAgICAgICAgICBJc0luZGV0ZXJtaW5hdGUgPSAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRpdGVtCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRpdGVtID0gJHNjcmlwdDpOZXh0UXVldWVJdGVtCiAgICAkc2NyaXB0Ok5leHRRdWV1ZUl0ZW0gPSAkbnVsbAogICAgcmV0dXJuICRpdGVtCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVF1ZXVlSXRlbSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kSWQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnU3VjY2VlZGVkJywnRmFpbGVkJyldW3N0cmluZ10kU3RhdGUsCiAgICAgICAgW2ludF0kRXhpdENvZGUgPSAwLAogICAgICAgIFtzdHJpbmddJE1lc3NhZ2UKICAgICkKCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHF1ZXVlU3RhdGUpCiAgICAgICAgZm9yZWFjaCAoJGl0ZW0gaW4gQCgkcXVldWVTdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uSWQgLWVxICRJZCkgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAkU3RhdGUKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJFN0YXRlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFnZVRleHQgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgJGl0ZW0uUHJvZ3Jlc3NQZXJjZW50ID0gaWYgKCRTdGF0ZSAtZXEgJ1N1Y2NlZWRlZCcpIHsgMTAwIH0gZWxzZSB7ICRudWxsIH0KICAgICAgICAgICAgICAgICRpdGVtLklzSW5kZXRlcm1pbmF0ZSA9ICRmYWxzZQogICAgICAgICAgICAgICAgJGl0ZW0uRmluaXNoZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgICAgICAgICAgJGl0ZW0uRXhpdENvZGUgPSAkRXhpdENvZGUKICAgICAgICAgICAgICAgICRpdGVtLk1lc3NhZ2UgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkcXVldWVTdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVF1ZXVlZEl0ZW0gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRJdGVtLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoCiAgICApCgogICAgaWYgKCRJdGVtLkFjdGlvbiAtZXEgJ1VwZ3JhZGVBbGwnKSB7CiAgICAgICAgJGV4aXRDb2RlID0gSW52b2tlLVdpbmdldFVwZ3JhZGVBbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICAgICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgICAgICBpZiAoJGV4aXRDb2RlIC1lcSAwKSB7CiAgICAgICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIFN1Y2NlZWRlZCAtRXhpdENvZGUgJGV4aXRDb2RlIC1NZXNzYWdlICdVcGRhdGVzIGFiZ2VzY2hsb3NzZW4uJwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgRmFpbGVkIC1FeGl0Q29kZSAkZXhpdENvZGUgLU1lc3NhZ2UgIlVwZGF0ZXMgZmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQoKICAgICRhcHAgPSBHZXQtQXBwQ2F0YWxvZ09iamVjdEJ5QWxpYXMgLUFsaWFzIChbc3RyaW5nXSRJdGVtLkFsaWFzKQogICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnQWxpYXMgaXN0IG5pY2h0IG1laHIgZnJlaWdlZ2ViZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXF1aXJlZFNldCA9IEdldC1SZXF1aXJlZEFsaWFzU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnVW5pbnN0YWxsJyAtYW5kICRyZXF1aXJlZFNldC5Db250YWlucyhbc3RyaW5nXSRJdGVtLkFsaWFzKSkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgZGVpbnN0YWxsaWVydCB3ZXJkZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRpbnN0YWxsZWRTZXQgPSBHZXQtSW5zdGFsbGVkUGFja2FnZUlkU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcgLWFuZCAkaW5zdGFsbGVkU2V0LkNvbnRhaW5zKFtzdHJpbmddJGFwcC5QYWNrYWdlSWQpKSB7CiAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgU3VjY2VlZGVkIC1FeGl0Q29kZSAwIC1NZXNzYWdlICdCZXJlaXRzIGluc3RhbGxpZXJ0LicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcpIHsKICAgICAgICAkZXhpdENvZGUgPSBJbnZva2UtV2luZ2V0SW5zdGFsbCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUGFja2FnZUlkIChbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIH0KICAgIGVsc2UgewogICAgICAgICRleGl0Q29kZSA9IEludm9rZS1XaW5nZXRVbmluc3RhbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVBhY2thZ2VJZCAoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkgLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICB9CgogICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIGlmICgkZXhpdENvZGUgLWVxIDApIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBTdWNjZWVkZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAnQWJnZXNjaGxvc3Nlbi4nCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAiRmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1Qcm9jZXNzUXVldWVNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgaWYgKC1ub3QgJHdpbmdldFBhdGgpIHsKICAgICAgICBXcml0ZS1Mb2cgJ0Fib3J0aW5nIHF1ZXVlIHByb2Nlc3NpbmcgYmVjYXVzZSB3aW5nZXQgaXMgdW5hdmFpbGFibGUuJyAnRVJST1InCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1TY3JpcHRCbG9jayB7CiAgICAgICAgUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMKICAgICAgICAkbnVsbCA9IFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICAgICAgJG51bGwgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAoKICAgICAgICB3aGlsZSAoJHRydWUpIHsKICAgICAgICAgICAgJGl0ZW0gPSBHZXQtTmV4dFF1ZXVlZEl0ZW0KICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgYnJlYWsgfQoKICAgICAgICAgICAgV3JpdGUtTG9nICJQcm9jZXNzaW5nIHF1ZXVlZCBpdGVtIGlkPSckKCRpdGVtLklkKScgYWN0aW9uPSckKCRpdGVtLkFjdGlvbiknIGFsaWFzPSckKCRpdGVtLkFsaWFzKScgc291cmNlPSckKCRpdGVtLlNvdXJjZSknIHJlcXVlc3RlZEJ5PSckKCRpdGVtLlJlcXVlc3RlZEJ5KSciCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBJbnZva2UtUXVldWVkSXRlbSAtSXRlbSAkaXRlbSAtV2luZ2V0UGF0aCAkd2luZ2V0UGF0aAogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiUXVldWVkIGl0ZW0gJyQoJGl0ZW0uSWQpJyBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICAgICAgICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRpdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlIDEgLU1lc3NhZ2UgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgeyBwYXJhbSgkc3RhdGUpICRzdGF0ZS5DdXJyZW50ID0gJG51bGwgfQogICAgfQp9CgpmdW5jdGlvbiBJbnZva2UtVXBncmFkZUFsbE1vZGUgewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgJGl0ZW0gPSBOZXctUXVldWVJdGVtIC1BY3Rpb24gVXBncmFkZUFsbCAtRGlzcGxheU5hbWUgJ3dpbmdldCB1cGdyYWRlIC0tYWxsJyAtU291cmNlIFN5c3RlbSAtUmVxdWVzdGVkQnkgJ1N5c3RlbScgLVJlcXVlc3RlZEJ5U2lkICdTeXN0ZW0nCiAgICAkcmVzdWx0ID0gQWRkLVF1ZXVlSXRlbSAtSXRlbSAkaXRlbQogICAgaWYgKCRyZXN1bHQuQWRkZWQpIHsKICAgICAgICBXcml0ZS1Mb2cgJ1F1ZXVlZCAyLWhvdXIgd2luZ2V0IHVwZ3JhZGUuJwogICAgfQogICAgZWxzZSB7CiAgICAgICAgV3JpdGUtTG9nICcyLWhvdXIgd2luZ2V0IHVwZ3JhZGUgaXMgYWxyZWFkeSBxdWV1ZWQgb3IgcnVubmluZy4nCiAgICB9CiAgICBTdGFydC1RdWV1ZVdvcmtlcgp9CgpmdW5jdGlvbiBJbnZva2UtQXBwbHlQb2xpY3lNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgJHJlc3VsdCA9IEludm9rZS1SZXF1aXJlZFNvZnR3YXJlUG9saWN5IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICBXcml0ZS1Mb2cgIlJlcXVpcmVkIHBvbGljeSBhcHBseSBxdWV1ZWQgaXRlbXM9JCgkcmVzdWx0LlF1ZXVlZCkuIgp9CgpmdW5jdGlvbiBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRBcHBBbGlhcykpIHsKICAgICAgICB0aHJvdyAnQXBwQWxpYXMgaXMgcmVxdWlyZWQgZm9yIFByb2Nlc3NSZXF1ZXN0IG1vZGUuJwogICAgfQoKICAgICRhbGlhcyA9ICRBcHBBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgIGlmICgtbm90ICRhcHApIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBpbiBjYXRhbG9nIHBvbGljeS4gUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIiAnV0FSTicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFJlcXVlc3RBY3Rpb24gLWVxICdJbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBpbnN0YWxsIGZvciBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIHVzZXIgaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkUmVxdWVzdEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcgLWFuZCAtbm90IChUZXN0LVVzZXJVbmluc3RhbGxBbGxvd2VkKSkgewogICAgICAgIFdyaXRlLUxvZyAiV29ya2VyIHJlamVjdGVkIHVuaW5zdGFsbCBmb3IgYWxpYXMgJyRhbGlhcycgYmVjYXVzZSB1c2VyIHVuaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXN1bHQgPSBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSAtQWN0aW9uICRSZXF1ZXN0QWN0aW9uIC1BbGlhcyAkYWxpYXMgLVJlcXVlc3RlZEJ5ICRSZXF1ZXN0ZWRCeSAtUmVxdWVzdGVkQnlTaWQgJFJlcXVlc3RlZEJ5U2lkIC1Tb3VyY2UgVXNlcgogICAgV3JpdGUtTG9nICJRdWV1ZWQgd29ya2VyIHJlcXVlc3QgYWN0aW9uPSRSZXF1ZXN0QWN0aW9uIGFsaWFzPSckYWxpYXMnIGFkZGVkPSQoJHJlc3VsdC5BZGRlZCkgUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIgogICAgU3RhcnQtUXVldWVXb3JrZXIKfQoKZnVuY3Rpb24gSW5zdGFsbC1TZXJ2aWNlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIFNldC1EaXJlY3RvcnlBY2wgLVBhdGggJEJhc2VEaXIgLVVzZXJzQ2FuTW9kaWZ5OiRmYWxzZQogICAgU2V0LURpcmVjdG9yeUFjbCAtUGF0aCAkTG9nRGlyIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKCiAgICBmb3JlYWNoICgkbGVnYWN5RGlyTmFtZSBpbiBAKCdSZXF1ZXN0cycsJ1Byb2Nlc3NlZCcsJ0ZhaWxlZCcpKSB7CiAgICAgICAgJGxlZ2FjeURpclBhdGggPSBKb2luLVBhdGggJEJhc2VEaXIgJGxlZ2FjeURpck5hbWUKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkbGVnYWN5RGlyUGF0aCkgewogICAgICAgICAgICBTZXQtRGlyZWN0b3J5QWNsIC1QYXRoICRsZWdhY3lEaXJQYXRoIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKICAgICAgICB9CiAgICB9CgogICAgaWYgKC1ub3QgJFBTQ29tbWFuZFBhdGgpIHsKICAgICAgICB0aHJvdyAnUFNDb21tYW5kUGF0aCBpcyBlbXB0eTsgY2Fubm90IGRldGVybWluZSB0aGUgc291cmNlIHNjcmlwdCBwYXRoLicKICAgIH0KCiAgICBDb3B5LUl0ZW0gLUxpdGVyYWxQYXRoICRQU0NvbW1hbmRQYXRoIC1EZXN0aW5hdGlvbiAkTG9jYWxTY3JpcHRQYXRoIC1Gb3JjZQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRMb2NhbFNjcmlwdFBhdGgKCiAgICBOZXctVXNlclJlcXVlc3RUb29sCiAgICBOZXctQ2F0YWxvZ0d1aQogICAgTmV3LUNhdGFsb2dMYXVuY2hlcgogICAgTmV3LVNob3J0Y3V0IC1TaG9ydGN1dFBhdGggJERlc2t0b3BTaG9ydGN1dFBhdGgKICAgIE5ldy1TaG9ydGN1dCAtU2hvcnRjdXRQYXRoICRTdGFydE1lbnVTaG9ydGN1dFBhdGgKICAgIFJlZ2lzdGVyLU9yVXBkYXRlVGFza3MKCiAgICBXcml0ZS1Mb2cgJ0luc3RhbGwvdXBkYXRlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFbnRyeSBwb2ludAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHJ5IHsKICAgIHN3aXRjaCAoJE1vZGUpIHsKICAgICAgICAnSW5zdGFsbCcgICAgeyBJbnN0YWxsLVNlcnZpY2UgfQogICAgICAgICdEYWVtb24nICAgICB7IFN0YXJ0LUNhdGFsb2dEYWVtb24gfQogICAgICAgICdVcGdyYWRlQWxsJyB7IEludm9rZS1VcGdyYWRlQWxsTW9kZSB9CiAgICAgICAgJ0FwcGx5UG9saWN5JyB7IEludm9rZS1BcHBseVBvbGljeU1vZGUgfQogICAgICAgICdQcm9jZXNzUXVldWUnIHsgSW52b2tlLVByb2Nlc3NRdWV1ZU1vZGUgfQogICAgICAgICdQcm9jZXNzUmVxdWVzdCcgeyBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIH0KICAgICAgICBkZWZhdWx0ICAgICAgeyB0aHJvdyAiVW5zdXBwb3J0ZWQgbW9kZSAnJE1vZGUnLiIgfQogICAgfQp9CmNhdGNoIHsKICAgIHRyeSB7CiAgICAgICAgV3JpdGUtTG9nICJGYXRhbCBlcnJvciBpbiBtb2RlICckTW9kZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CiAgICB0aHJvdwp9Cg==
'@
$PayloadBytes = [Convert]::FromBase64String($Payload)
$OutputBytes = New-Object byte[] ($PayloadBytes.Length + 3)
$OutputBytes[0] = 0xEF
$OutputBytes[1] = 0xBB
$OutputBytes[2] = 0xBF
[Array]::Copy($PayloadBytes, 0, $OutputBytes, 3, $PayloadBytes.Length)
$TempScript = Join-Path ([System.IO.Path]::GetTempPath()) ('softkat-{0}.ps1' -f [Guid]::NewGuid().ToString('N'))
[System.IO.File]::WriteAllBytes($TempScript, $OutputBytes)
try {
& $TempScript -Mode $Mode -RequestAction $RequestAction -AppAlias $AppAlias -RequestedBy $RequestedBy -RequestedBySid $RequestedBySid
}
finally {
Remove-Item -LiteralPath $TempScript -Force -ErrorAction SilentlyContinue
}