diff --git a/dist/setup.ps1 b/dist/setup.ps1 index 157fb7d..41cc5bc 100644 --- a/dist/setup.ps1 +++ b/dist/setup.ps1 @@ -14,7 +14,7 @@ Set-StrictMode -Version Latest $ErrorActionPreference = 'Stop' $Payload = @' -PCMKU2VsZlNlcnZpY2VXaW5nZXQucHMxCgpVc2UgYXM6Ci0gQ29tcHV0ZXIgU3RhcnR1cCBHUE8gc2NyaXB0IChkZWZhdWx0IG1vZGUgPSBJbnN0YWxsKQotIFNjaGVkdWxlZCB0YXNrIHRhcmdldCAoTW9kZSA9IERhZW1vbiAvIFVwZ3JhZGVBbGwgLyBBcHBseVBvbGljeSAvIFByb2Nlc3NRdWV1ZSAvIFByb2Nlc3NSZXF1ZXN0KQoKQmVoYXZpb3I6ClVzZXIgLT4gR1VJIC8gcmVxdWVzdCBoZWxwZXIgLT4gbmFtZWQgcGlwZSAtPiBkYWVtb24gdGFzayAoU1lTVEVNKSAtPiB3aW5nZXQgaW5zdGFsbCAtLXNjb3BlIG1hY2hpbmUKCkNyZWF0ZWQgcGF0aHM6CkM6XFByb2dyYW1EYXRhXF9fU29mdHdhcmVrYXRhbG9nXAogIFNlbGZTZXJ2aWNlV2luZ2V0LnBzMQogIFJlcXVlc3QtQXBwLnBzMQogIFNvZnR3YXJlLUNhdGFsb2cucHMxCiAgTGF1bmNoLVNvZnR3YXJlLUNhdGFsb2cudmJzCiAgSW5zdGFsbGVkLVBhY2thZ2VzLmpzb24KICBMb2dzXHNlcnZpY2UubG9nCiM+CgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ0RhZW1vbicsJ1VwZ3JhZGVBbGwnLCdBcHBseVBvbGljeScsJ1Byb2Nlc3NRdWV1ZScsJ1Byb2Nlc3NSZXF1ZXN0JyldCiAgICBbc3RyaW5nXSRNb2RlID0gJ0luc3RhbGwnLAogICAgW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldCiAgICBbc3RyaW5nXSRSZXF1ZXN0QWN0aW9uID0gJ0luc3RhbGwnLAogICAgW3N0cmluZ10kQXBwQWxpYXMsCiAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkCikKClNldC1TdHJpY3RNb2RlIC1WZXJzaW9uIExhdGVzdAokRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDb25maWd1cmF0aW9uCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQokQ2F0YWxvZ0Rpc3BsYXlOYW1lICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRCYXNlRGlyICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6UHJvZ3JhbURhdGEgJ19fU29mdHdhcmVrYXRhbG9nJwokTG9jYWxTY3JpcHRQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU2VsZlNlcnZpY2VXaW5nZXQucHMxJwokUmVxdWVzdFRvb2xQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnUmVxdWVzdC1BcHAucHMxJwokQ2F0YWxvZ0d1aVBhdGggICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU29mdHdhcmUtQ2F0YWxvZy5wczEnCiRDYXRhbG9nTGF1bmNoZXJQYXRoICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMYXVuY2gtU29mdHdhcmUtQ2F0YWxvZy52YnMnCiRJbnN0YWxsZWRQYWNrYWdlc1BhdGggID0gSm9pbi1QYXRoICRCYXNlRGlyICdJbnN0YWxsZWQtUGFja2FnZXMuanNvbicKJFF1ZXVlU3RhdGVQYXRoICAgICAgICAgPSBKb2luLVBhdGggJEJhc2VEaXIgJ1F1ZXVlLVN0YXRlLmpzb24nCiRMb2dEaXIgICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMb2dzJwokTG9nRmlsZSAgICAgICAgICAgICAgICA9IEpvaW4tUGF0aCAkTG9nRGlyICdzZXJ2aWNlLmxvZycKJFBvbGljeVJvb3QgICAgICAgICAgICAgPSAnSEtMTTpcU29mdHdhcmVcUG9saWNpZXNcU1RMXFNvZnR3YXJla2F0YWxvZycKJFBvbGljeUNhdGFsb2dSb290ICAgICAgPSBKb2luLVBhdGggJFBvbGljeVJvb3QgJ0NhdGFsb2cnCiRQb2xpY3lSZXF1aXJlZFJvb3QgICAgID0gSm9pbi1QYXRoICRQb2xpY3lSb290ICdSZXF1aXJlZCcKJFBvbGljeU1heEVudHJpZXMgICAgICAgPSA1MDAKJExlZ2FjeVF1ZXVlVGFza05hbWUgICAgPSAnU29mdHdhcmVrYXRhbG9nIC0gV2luZ2V0IFF1ZXVlJwokRGFlbW9uVGFza05hbWUgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cgLSBEYWVtb24nCiRVcGdyYWRlVGFza05hbWUgICAgICAgID0gJ1NvZnR3YXJla2F0YWxvZyAtIFdpbmdldCBVcGdyYWRlJwokUGlwZU5hbWUgICAgICAgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRXaW5nZXRNdXRleE5hbWUgICAgICAgID0gJ0dsb2JhbFxTb2Z0d2FyZWthdGFsb2ctV2luZ2V0JwokUXVldWVTdGF0ZU11dGV4TmFtZSAgICA9ICdHbG9iYWxcU29mdHdhcmVrYXRhbG9nLVF1ZXVlU3RhdGUnCiRQb3dlclNoZWxsRXhlICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6U3lzdGVtUm9vdCAnU3lzdGVtMzJcV2luZG93c1Bvd2VyU2hlbGxcdjEuMFxwb3dlcnNoZWxsLmV4ZScKJFdTY3JpcHRFeGUgICAgICAgICAgICAgPSBKb2luLVBhdGggJGVudjpTeXN0ZW1Sb290ICdTeXN0ZW0zMlx3c2NyaXB0LmV4ZScKJEFwcEluc3RhbGxlckZhbWlseU5hbWUgPSAnTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXJfOHdla3liM2Q4YmJ3ZScKJENvbW1vbkRlc2t0b3BEaXIgICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25EZXNrdG9wRGlyZWN0b3J5JykKJENvbW1vblByb2dyYW1zRGlyICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25Qcm9ncmFtcycpCiREZXNrdG9wU2hvcnRjdXRQYXRoICAgID0gSm9pbi1QYXRoICRDb21tb25EZXNrdG9wRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKJFN0YXJ0TWVudVNob3J0Y3V0UGF0aCAgPSBKb2luLVBhdGggJENvbW1vblByb2dyYW1zRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFV0aWxpdHkgZnVuY3Rpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBFbnN1cmUtRGlyZWN0b3J5IHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYXRoKQogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFBhdGgpKSB7CiAgICAgICAgTmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtUGF0aCAkUGF0aCAtRm9yY2UgfCBPdXQtTnVsbAogICAgfQp9CgpmdW5jdGlvbiBXcml0ZS1Mb2cgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJE1lc3NhZ2UsCiAgICAgICAgW1ZhbGlkYXRlU2V0KCdJTkZPJywnV0FSTicsJ0VSUk9SJyldCiAgICAgICAgW3N0cmluZ10kTGV2ZWwgPSAnSU5GTycKICAgICkKCiAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRMb2dEaXIKICAgICRsaW5lID0gJ3swfSBbezF9XSB7Mn0nIC1mIChHZXQtRGF0ZSAtRm9ybWF0ICd5eXl5LU1NLWRkIEhIOm1tOnNzJyksICRMZXZlbCwgJE1lc3NhZ2UKICAgIEFkZC1Db250ZW50IC1MaXRlcmFsUGF0aCAkTG9nRmlsZSAtVmFsdWUgJGxpbmUgLUVuY29kaW5nIFVURjgKfQoKZnVuY3Rpb24gU2V0LURpcmVjdG9yeUFjbCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW2Jvb2xdJFVzZXJzQ2FuTW9kaWZ5CiAgICApCgogICAgJGluaGVyaXRhbmNlID0gW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkluaGVyaXRhbmNlRmxhZ3NdJ0NvbnRhaW5lckluaGVyaXQsIE9iamVjdEluaGVyaXQnCiAgICAkcHJvcGFnYXRpb24gPSBbU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuUHJvcGFnYXRpb25GbGFnc106Ok5vbmUKCiAgICAkYWNsID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5EaXJlY3RvcnlTZWN1cml0eQogICAgJGFjbC5TZXRBY2Nlc3NSdWxlUHJvdGVjdGlvbigkdHJ1ZSwgJGZhbHNlKQoKICAgICRzaWRTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0xOCcpCiAgICAkc2lkQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ0JykKICAgICRzaWRVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NScpCgogICAgJHJ1bGVTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRTeXN0ZW0sICdGdWxsQ29udHJvbCcsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICApCiAgICAkcnVsZUFkbWlucyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgJHNpZEFkbWlucywgJ0Z1bGxDb250cm9sJywgJGluaGVyaXRhbmNlLCAkcHJvcGFnYXRpb24sICdBbGxvdycKICAgICkKCiAgICBpZiAoJFVzZXJzQ2FuTW9kaWZ5KSB7CiAgICAgICAgJHJ1bGVVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgICAgICRzaWRVc2VycywgJ01vZGlmeScsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICAgICAgKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJHJ1bGVVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgICAgICRzaWRVc2VycywgJ1JlYWRBbmRFeGVjdXRlLCBTeW5jaHJvbml6ZScsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICAgICAgKQogICAgfQoKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlU3lzdGVtKQogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVBZG1pbnMpCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZVVzZXJzKQoKICAgIFNldC1BY2wgLUxpdGVyYWxQYXRoICRQYXRoIC1BY2xPYmplY3QgJGFjbAp9CgpmdW5jdGlvbiBTZXQtRmlsZUFjbEFkbWluc09ubHkgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhdGgpCgogICAgJGFjbCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVNlY3VyaXR5CiAgICAkYWNsLlNldEFjY2Vzc1J1bGVQcm90ZWN0aW9uKCR0cnVlLCAkZmFsc2UpCgogICAgJHNpZFN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTE4JykKICAgICRzaWRBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0zMi01NDQnKQogICAgJHNpZFVzZXJzID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ1JykKCiAgICAkcnVsZVN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRmlsZVN5c3RlbUFjY2Vzc1J1bGUoCiAgICAgICAgJHNpZFN5c3RlbSwgJ0Z1bGxDb250cm9sJywgJ0FsbG93JwogICAgKQogICAgJHJ1bGVBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRBZG1pbnMsICdGdWxsQ29udHJvbCcsICdBbGxvdycKICAgICkKICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRVc2VycywgJ1JlYWRBbmRFeGVjdXRlLCBTeW5jaHJvbml6ZScsICdBbGxvdycKICAgICkKCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZVN5c3RlbSkKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlQWRtaW5zKQogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVVc2VycykKCiAgICBTZXQtQWNsIC1MaXRlcmFsUGF0aCAkUGF0aCAtQWNsT2JqZWN0ICRhY2wKfQoKZnVuY3Rpb24gR2V0LVBvbGljeUR3b3JkIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSROYW1lLAogICAgICAgIFtpbnRdJERlZmF1bHQgPSAwCiAgICApCgogICAgdHJ5IHsKICAgICAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkUG9saWN5Um9vdCkpIHsKICAgICAgICAgICAgcmV0dXJuICREZWZhdWx0CiAgICAgICAgfQoKICAgICAgICAkcHJvcHMgPSBHZXQtSXRlbVByb3BlcnR5IC1MaXRlcmFsUGF0aCAkUG9saWN5Um9vdCAtRXJyb3JBY3Rpb24gU3RvcAogICAgICAgICRwcm9wZXJ0eSA9ICRwcm9wcy5QU09iamVjdC5Qcm9wZXJ0aWVzWyROYW1lXQogICAgICAgIGlmICgtbm90ICRwcm9wZXJ0eSkgewogICAgICAgICAgICByZXR1cm4gJERlZmF1bHQKICAgICAgICB9CgogICAgICAgIHJldHVybiBbaW50XSRwcm9wZXJ0eS5WYWx1ZQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgcG9saWN5IHZhbHVlICckTmFtZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gJERlZmF1bHQKICAgIH0KfQoKZnVuY3Rpb24gVGVzdC1Tb2Z0d2FyZUNhdGFsb2dQb2xpY3lFbmFibGVkIHsKICAgIChHZXQtUG9saWN5RHdvcmQgLU5hbWUgJ0VuYWJsZWQnIC1EZWZhdWx0IDApIC1lcSAxCn0KCmZ1bmN0aW9uIFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCB7CiAgICAoR2V0LVBvbGljeUR3b3JkIC1OYW1lICdBbGxvd1VzZXJJbnN0YWxscycgLURlZmF1bHQgMSkgLWVxIDEKfQoKZnVuY3Rpb24gVGVzdC1Vc2VyVW5pbnN0YWxsQWxsb3dlZCB7CiAgICAoR2V0LVBvbGljeUR3b3JkIC1OYW1lICdBbGxvd1VzZXJVbmluc3RhbGwnIC1EZWZhdWx0IDEpIC1lcSAxCn0KCmZ1bmN0aW9uIFRlc3QtUmVxdWlyZWRFbmZvcmNlbWVudEVuYWJsZWQgewogICAgKEdldC1Qb2xpY3lEd29yZCAtTmFtZSAnRW5mb3JjZVJlcXVpcmVkJyAtRGVmYXVsdCAxKSAtZXEgMQp9CgpmdW5jdGlvbiBHZXQtUG9saWN5U3RyaW5nVmFsdWVzIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYXRoKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRQYXRoKSkgewogICAgICAgIHJldHVybiBAKCkKICAgIH0KCiAgICB0cnkgewogICAgICAgICRpdGVtID0gR2V0LUl0ZW0gLUxpdGVyYWxQYXRoICRQYXRoIC1FcnJvckFjdGlvbiBTdG9wCiAgICAgICAgJG5hbWVzID0gQCgkaXRlbS5HZXRWYWx1ZU5hbWVzKCkpIHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHsgJF8gLWFuZCAkXyAtbm90bWF0Y2ggJ15cKicgfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IHwKICAgICAgICAgICAgU2VsZWN0LU9iamVjdCAtRmlyc3QgJFBvbGljeU1heEVudHJpZXMKCiAgICAgICAgZm9yZWFjaCAoJG5hbWUgaW4gJG5hbWVzKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IFtzdHJpbmddJGl0ZW0uR2V0VmFsdWUoJG5hbWUsICcnKQogICAgICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCR2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgICAgIE5hbWUgID0gW3N0cmluZ10kbmFtZQogICAgICAgICAgICAgICAgICAgIFZhbHVlID0gJHZhbHVlLlRyaW0oKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgcG9saWN5IGxpc3QgJyRQYXRoJzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIHJldHVybiBAKCkKICAgIH0KfQoKZnVuY3Rpb24gR2V0LUFwcENhdGFsb2dPYmplY3RzIHsKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7CiAgICAgICAgcmV0dXJuIEAoKQogICAgfQoKICAgICRzZWVuQWxpYXNlcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICRyb3dzID0gR2V0LVBvbGljeVN0cmluZ1ZhbHVlcyAtUGF0aCAkUG9saWN5Q2F0YWxvZ1Jvb3QKICAgIGZvcmVhY2ggKCRyb3cgaW4gJHJvd3MpIHsKICAgICAgICAkYWxpYXMgPSAoW3N0cmluZ10kcm93Lk5hbWUpLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkYWxpYXMpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICBpZiAoLW5vdCAkc2VlbkFsaWFzZXMuQWRkKCRhbGlhcykpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJEdXBsaWNhdGUgY2F0YWxvZyBhbGlhcyAnJGFsaWFzJyBpbiBwb2xpY3k7IGlnbm9yaW5nIGR1cGxpY2F0ZS4iICdXQVJOJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgJHBhcnRzID0gKFtzdHJpbmddJHJvdy5WYWx1ZSkgLXNwbGl0ICdcfCcsIDMKICAgICAgICBpZiAoQCgkcGFydHMpLkNvdW50IC1sdCAyKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiTWFsZm9ybWVkIGNhdGFsb2cgcm93ICckYWxpYXMnLiBFeHBlY3RlZDogUGFja2FnZUlkfERpc3BsYXlOYW1lfERlc2NyaXB0aW9uIiAnV0FSTicKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRwYWNrYWdlSWQgPSAoW3N0cmluZ10kcGFydHNbMF0pLlRyaW0oKQogICAgICAgICRkaXNwbGF5TmFtZSA9IChbc3RyaW5nXSRwYXJ0c1sxXSkuVHJpbSgpCiAgICAgICAgJGRlc2NyaXB0aW9uID0gJycKICAgICAgICBpZiAoQCgkcGFydHMpLkNvdW50IC1nZSAzKSB7CiAgICAgICAgICAgICRkZXNjcmlwdGlvbiA9IChbc3RyaW5nXSRwYXJ0c1syXSkuVHJpbSgpCiAgICAgICAgfQoKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkcGFja2FnZUlkKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIkNhdGFsb2cgcm93ICckYWxpYXMnIGhhcyBlbXB0eSBwYWNrYWdlIElEOyBpZ25vcmluZy4iICdXQVJOJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGRpc3BsYXlOYW1lKSkgewogICAgICAgICAgICAkZGlzcGxheU5hbWUgPSAkYWxpYXMKICAgICAgICB9CgogICAgICAgIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICBBbGlhcyAgICAgICA9ICRhbGlhcwogICAgICAgICAgICBEaXNwbGF5TmFtZSA9ICRkaXNwbGF5TmFtZQogICAgICAgICAgICBEZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbgogICAgICAgICAgICBQYWNrYWdlSWQgICA9ICRwYWNrYWdlSWQKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1SZXF1aXJlZEFsaWFzZXMgewogICAgaWYgKC1ub3QgKFRlc3QtU29mdHdhcmVDYXRhbG9nUG9saWN5RW5hYmxlZCkpIHsKICAgICAgICByZXR1cm4gQCgpCiAgICB9CgogICAgJHNlZW5BbGlhc2VzID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQogICAgJHJvd3MgPSBHZXQtUG9saWN5U3RyaW5nVmFsdWVzIC1QYXRoICRQb2xpY3lSZXF1aXJlZFJvb3QKICAgIGZvcmVhY2ggKCRyb3cgaW4gJHJvd3MpIHsKICAgICAgICAkdmFsdWUgPSAoW3N0cmluZ10kcm93LlZhbHVlKS5UcmltKCkKICAgICAgICBpZiAoJHZhbHVlIC1lcSAnMCcgLW9yICR2YWx1ZSAtZXEgJ2ZhbHNlJykgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgJGFsaWFzID0gKFtzdHJpbmddJHJvdy5OYW1lKS5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGFsaWFzKSkgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKCRzZWVuQWxpYXNlcy5BZGQoJGFsaWFzKSkgewogICAgICAgICAgICAkYWxpYXMKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1QYWNrYWdlSWRCeUFsaWFzIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRBbGlhcykKCiAgICBmb3JlYWNoICgkYXBwIGluIEdldC1BcHBDYXRhbG9nT2JqZWN0cykgewogICAgICAgIGlmIChbc3RyaW5nXTo6RXF1YWxzKFtzdHJpbmddJGFwcC5BbGlhcywgJEFsaWFzLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpIHsKICAgICAgICAgICAgcmV0dXJuIFtzdHJpbmddJGFwcC5QYWNrYWdlSWQKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRudWxsCn0KCmZ1bmN0aW9uIEdldC1BcHBDYXRhbG9nT2JqZWN0QnlBbGlhcyB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kQWxpYXMpCgogICAgZm9yZWFjaCAoJGFwcCBpbiBHZXQtQXBwQ2F0YWxvZ09iamVjdHMpIHsKICAgICAgICBpZiAoW3N0cmluZ106OkVxdWFscyhbc3RyaW5nXSRhcHAuQWxpYXMsICRBbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgIHJldHVybiAkYXBwCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBXcml0ZS1UZXh0RmlsZSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kQ29udGVudCwKICAgICAgICBbVmFsaWRhdGVTZXQoJ1V0ZjhCb20nLCdVbmljb2RlJyldCiAgICAgICAgW3N0cmluZ10kRW5jb2RpbmcgPSAnVXRmOEJvbScKICAgICkKCiAgICAkcGFyZW50ID0gU3BsaXQtUGF0aCAtUGF0aCAkUGF0aCAtUGFyZW50CiAgICBpZiAoJHBhcmVudCkgewogICAgICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJHBhcmVudAogICAgfQoKICAgIHN3aXRjaCAoJEVuY29kaW5nKSB7CiAgICAgICAgJ1VuaWNvZGUnIHsgJHRleHRFbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVW5pY29kZUVuY29kaW5nKCRmYWxzZSwgJHRydWUpIH0KICAgICAgICBkZWZhdWx0ICAgeyAkdGV4dEVuY29kaW5nID0gTmV3LU9iamVjdCBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoJHRydWUpIH0KICAgIH0KCiAgICBbU3lzdGVtLklPLkZpbGVdOjpXcml0ZUFsbFRleHQoJFBhdGgsICRDb250ZW50LCAkdGV4dEVuY29kaW5nKQp9CgpmdW5jdGlvbiBOZXctUXVldWVTdGF0ZU9iamVjdCB7CiAgICBbcHNjdXN0b21vYmplY3RdW29yZGVyZWRdQHsKICAgICAgICBWZXJzaW9uID0gMAogICAgICAgIFVwZGF0ZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgIEN1cnJlbnQgPSAkbnVsbAogICAgICAgIFF1ZXVlID0gQCgpCiAgICB9Cn0KCmZ1bmN0aW9uIFJlYWQtUXVldWVTdGF0ZSB7CiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkUXVldWVTdGF0ZVBhdGgpKSB7CiAgICAgICAgcmV0dXJuIE5ldy1RdWV1ZVN0YXRlT2JqZWN0CiAgICB9CgogICAgdHJ5IHsKICAgICAgICAkcmF3ID0gR2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoICRRdWV1ZVN0YXRlUGF0aCAtUmF3IC1FbmNvZGluZyBVVEY4CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHJhdykpIHsKICAgICAgICAgICAgcmV0dXJuIE5ldy1RdWV1ZVN0YXRlT2JqZWN0CiAgICAgICAgfQoKICAgICAgICAkc3RhdGUgPSAkcmF3IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgIGlmICgtbm90ICRzdGF0ZS5QU09iamVjdC5Qcm9wZXJ0aWVzWydWZXJzaW9uJ10pIHsgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBWZXJzaW9uIC1Ob3RlUHJvcGVydHlWYWx1ZSAwIH0KICAgICAgICBpZiAoLW5vdCAkc3RhdGUuUFNPYmplY3QuUHJvcGVydGllc1snVXBkYXRlZEF0J10pIHsgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBVcGRhdGVkQXQgLU5vdGVQcm9wZXJ0eVZhbHVlIChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKSB9CiAgICAgICAgaWYgKC1ub3QgJHN0YXRlLlBTT2JqZWN0LlByb3BlcnRpZXNbJ0N1cnJlbnQnXSkgeyAkc3RhdGUgfCBBZGQtTWVtYmVyIC1Ob3RlUHJvcGVydHlOYW1lIEN1cnJlbnQgLU5vdGVQcm9wZXJ0eVZhbHVlICRudWxsIH0KICAgICAgICBpZiAoLW5vdCAkc3RhdGUuUFNPYmplY3QuUHJvcGVydGllc1snUXVldWUnXSkgewogICAgICAgICAgICAkc3RhdGUgfCBBZGQtTWVtYmVyIC1Ob3RlUHJvcGVydHlOYW1lIFF1ZXVlIC1Ob3RlUHJvcGVydHlWYWx1ZSBAKCkKICAgICAgICB9CiAgICAgICAgZWxzZWlmICgtbm90ICRzdGF0ZS5RdWV1ZSkgewogICAgICAgICAgICAkc3RhdGUuUXVldWUgPSBAKCkKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzdGF0ZQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgcXVldWUgc3RhdGU6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gTmV3LVF1ZXVlU3RhdGVPYmplY3QKICAgIH0KfQoKZnVuY3Rpb24gV3JpdGUtUXVldWVTdGF0ZSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldJFN0YXRlKQoKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgICR0ZW1wUGF0aCA9IEpvaW4tUGF0aCAkQmFzZURpciAoIlF1ZXVlLVN0YXRlLXswfS5qc29uLnRtcCIgLWYgW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKSkKICAgIHRyeSB7CiAgICAgICAgJFN0YXRlIHwgQ29udmVydFRvLUpzb24gLURlcHRoIDggfCBTZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJHRlbXBQYXRoIC1FbmNvZGluZyBVVEY4CiAgICAgICAgTW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkdGVtcFBhdGggLURlc3RpbmF0aW9uICRRdWV1ZVN0YXRlUGF0aCAtRm9yY2UKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICR0ZW1wUGF0aCkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBQYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVdpdGhRdWV1ZVN0YXRlTG9jayB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3NjcmlwdGJsb2NrXSRTY3JpcHRCbG9jaykKCiAgICAkbXV0ZXggPSBOZXctT2JqZWN0IFN5c3RlbS5UaHJlYWRpbmcuTXV0ZXgoJGZhbHNlLCAkUXVldWVTdGF0ZU11dGV4TmFtZSkKICAgICRoYXNMb2NrID0gJGZhbHNlCiAgICB0cnkgewogICAgICAgICRoYXNMb2NrID0gJG11dGV4LldhaXRPbmUoW1RpbWVTcGFuXTo6RnJvbVNlY29uZHMoMzApKQogICAgICAgIGlmICgtbm90ICRoYXNMb2NrKSB7CiAgICAgICAgICAgIHRocm93ICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcXVldWUgc3RhdGUgbG9jayAnJFF1ZXVlU3RhdGVNdXRleE5hbWUnLiIKICAgICAgICB9CgogICAgICAgICYgJFNjcmlwdEJsb2NrCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoJGhhc0xvY2spIHsgJG11dGV4LlJlbGVhc2VNdXRleCgpIH0KICAgICAgICAkbXV0ZXguRGlzcG9zZSgpCiAgICB9Cn0KCmZ1bmN0aW9uIFVwZGF0ZS1RdWV1ZVN0YXRlIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc2NyaXB0YmxvY2tdJFNjcmlwdEJsb2NrKQoKICAgIEludm9rZS1XaXRoUXVldWVTdGF0ZUxvY2sgLVNjcmlwdEJsb2NrIHsKICAgICAgICAkc3RhdGUgPSBSZWFkLVF1ZXVlU3RhdGUKICAgICAgICAmICRTY3JpcHRCbG9jayAkc3RhdGUKICAgICAgICAkc3RhdGUuVmVyc2lvbiA9IFtpbnQ2NF0kc3RhdGUuVmVyc2lvbiArIDEKICAgICAgICAkc3RhdGUuVXBkYXRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgV3JpdGUtUXVldWVTdGF0ZSAtU3RhdGUgJHN0YXRlCiAgICAgICAgcmV0dXJuICRzdGF0ZQogICAgfQp9CgpmdW5jdGlvbiBHZXQtUXVldWVTdGF0ZVNuYXBzaG90IHsKICAgIEludm9rZS1XaXRoUXVldWVTdGF0ZUxvY2sgLVNjcmlwdEJsb2NrIHsgUmVhZC1RdWV1ZVN0YXRlIH0KfQoKZnVuY3Rpb24gTmV3LVF1ZXVlSXRlbSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJywnVXBncmFkZUFsbCcpXVtzdHJpbmddJEFjdGlvbiwKICAgICAgICBbc3RyaW5nXSRBbGlhcywKICAgICAgICBbc3RyaW5nXSRQYWNrYWdlSWQsCiAgICAgICAgW3N0cmluZ10kRGlzcGxheU5hbWUsCiAgICAgICAgW1ZhbGlkYXRlU2V0KCdVc2VyJywnUmVxdWlyZWQnLCdTeXN0ZW0nKV1bc3RyaW5nXSRTb3VyY2UgPSAnVXNlcicsCiAgICAgICAgW2Jvb2xdJFJlcXVpcmVkID0gJGZhbHNlLAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5LAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkCiAgICApCgogICAgW3BzY3VzdG9tb2JqZWN0XVtvcmRlcmVkXUB7CiAgICAgICAgSWQgPSBbR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygnTicpCiAgICAgICAgQWN0aW9uID0gJEFjdGlvbgogICAgICAgIEFsaWFzID0gJEFsaWFzCiAgICAgICAgUGFja2FnZUlkID0gJFBhY2thZ2VJZAogICAgICAgIERpc3BsYXlOYW1lID0gJERpc3BsYXlOYW1lCiAgICAgICAgU291cmNlID0gJFNvdXJjZQogICAgICAgIFJlcXVpcmVkID0gW2Jvb2xdJFJlcXVpcmVkCiAgICAgICAgUmVxdWVzdGVkQnkgPSAkUmVxdWVzdGVkQnkKICAgICAgICBSZXF1ZXN0ZWRCeVNpZCA9ICRSZXF1ZXN0ZWRCeVNpZAogICAgICAgIFN0YXRlID0gJ1F1ZXVlZCcKICAgICAgICBTdGFnZSA9ICdRdWV1ZWQnCiAgICAgICAgU3RhZ2VUZXh0ID0gJ0luIFdhcnRlc2NobGFuZ2UnCiAgICAgICAgUHJvZ3Jlc3NQZXJjZW50ID0gJG51bGwKICAgICAgICBJc0luZGV0ZXJtaW5hdGUgPSAkZmFsc2UKICAgICAgICBDcmVhdGVkQXQgPSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykKICAgICAgICBTdGFydGVkQXQgPSAkbnVsbAogICAgICAgIEZpbmlzaGVkQXQgPSAkbnVsbAogICAgICAgIEV4aXRDb2RlID0gJG51bGwKICAgICAgICBNZXNzYWdlID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIHsKICAgIHBhcmFtKFtzdHJpbmddJExpbmUpCgogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJExpbmUpKSB7IHJldHVybiAkbnVsbCB9CiAgICAkbWF0Y2ggPSBbcmVnZXhdOjpNYXRjaCgkTGluZSwgJyg/PCFcZCkoMTAwfFsxLTldP1xkKSg/OltcLixdXGQrKT9ccyolJykKICAgIGlmICgtbm90ICRtYXRjaC5TdWNjZXNzKSB7IHJldHVybiAkbnVsbCB9CiAgICAkcmF3ID0gJG1hdGNoLkdyb3Vwc1sxXS5WYWx1ZQogICAgJHZhbHVlID0gW2ludF0kcmF3CiAgICBpZiAoJHZhbHVlIC1sdCAwKSB7IHJldHVybiAwIH0KICAgIGlmICgkdmFsdWUgLWd0IDEwMCkgeyByZXR1cm4gMTAwIH0KICAgIHJldHVybiAkdmFsdWUKfQoKZnVuY3Rpb24gVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRJZCwKICAgICAgICBbc3RyaW5nXSRTdGFnZSA9ICdSdW5uaW5nJywKICAgICAgICBbc3RyaW5nXSRTdGFnZVRleHQgPSAnQWt0aW9uIGzDpHVmdC4uLicsCiAgICAgICAgW051bGxhYmxlW2ludF1dJFByb2dyZXNzUGVyY2VudCwKICAgICAgICBbYm9vbF0kSXNJbmRldGVybWluYXRlID0gJHRydWUKICAgICkKCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHN0YXRlKQogICAgICAgIGZvcmVhY2ggKCRpdGVtIGluIEAoJHN0YXRlLlF1ZXVlKSkgewogICAgICAgICAgICBpZiAoLW5vdCAkaXRlbSkgeyBjb250aW51ZSB9CiAgICAgICAgICAgIGlmICgkaXRlbS5JZCAtZXEgJElkKSB7CiAgICAgICAgICAgICAgICAkaXRlbS5TdGFnZSA9ICRTdGFnZQogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJFN0YWdlVGV4dAogICAgICAgICAgICAgICAgJGl0ZW0uUHJvZ3Jlc3NQZXJjZW50ID0gJFByb2dyZXNzUGVyY2VudAogICAgICAgICAgICAgICAgJGl0ZW0uSXNJbmRldGVybWluYXRlID0gJElzSW5kZXRlcm1pbmF0ZQogICAgICAgICAgICAgICAgJHN0YXRlLkN1cnJlbnQgPSBbcHNjdXN0b21vYmplY3RdW29yZGVyZWRdQHsKICAgICAgICAgICAgICAgICAgICBJZCA9ICRpdGVtLklkCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0gJGl0ZW0uQWN0aW9uCiAgICAgICAgICAgICAgICAgICAgQWxpYXMgPSAkaXRlbS5BbGlhcwogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0gJGl0ZW0uRGlzcGxheU5hbWUKICAgICAgICAgICAgICAgICAgICBTdGFnZSA9ICRTdGFnZQogICAgICAgICAgICAgICAgICAgIFN0YWdlVGV4dCA9ICRTdGFnZVRleHQKICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPSAkUHJvZ3Jlc3NQZXJjZW50CiAgICAgICAgICAgICAgICAgICAgSXNJbmRldGVybWluYXRlID0gJElzSW5kZXRlcm1pbmF0ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gR2V0LVJlcXVpcmVkQWxpYXNTZXQgewogICAgJHNldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgIGZvcmVhY2ggKCRhbGlhcyBpbiBAKEdldC1SZXF1aXJlZEFsaWFzZXMpKSB7CiAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkYWxpYXMpKSB7CiAgICAgICAgICAgIFt2b2lkXSRzZXQuQWRkKFtzdHJpbmddJGFsaWFzKQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkc2V0Cn0KCmZ1bmN0aW9uIEFkZC1RdWV1ZUl0ZW0gewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRJdGVtKQoKICAgICRyZXN1bHQgPSAkbnVsbAogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICAkcXVldWUgPSBAKCRzdGF0ZS5RdWV1ZSkKCiAgICAgICAgZm9yZWFjaCAoJGV4aXN0aW5nIGluICRxdWV1ZSkgewogICAgICAgICAgICBpZiAoLW5vdCAkZXhpc3RpbmcpIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGV4aXN0aW5nLlN0YXRlIC1pbiBAKCdRdWV1ZWQnLCdSdW5uaW5nJykgLWFuZCAkZXhpc3RpbmcuQWN0aW9uIC1lcSAkSXRlbS5BY3Rpb24gLWFuZCBbc3RyaW5nXTo6RXF1YWxzKFtzdHJpbmddJGV4aXN0aW5nLkFsaWFzLCBbc3RyaW5nXSRJdGVtLkFsaWFzLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpIHsKICAgICAgICAgICAgICAgICRzY3JpcHQ6UXVldWVBZGRSZXN1bHQgPSBbcHNjdXN0b21vYmplY3RdQHsgQWRkZWQgPSAkZmFsc2U7IEl0ZW0gPSAkZXhpc3RpbmcgfQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRzdGF0ZS5RdWV1ZSA9IEAoJHF1ZXVlICsgJEl0ZW0pCiAgICAgICAgJHNjcmlwdDpRdWV1ZUFkZFJlc3VsdCA9IFtwc2N1c3RvbW9iamVjdF1AeyBBZGRlZCA9ICR0cnVlOyBJdGVtID0gJEl0ZW0gfQogICAgfQoKICAgICRyZXN1bHQgPSAkc2NyaXB0OlF1ZXVlQWRkUmVzdWx0CiAgICAkc2NyaXB0OlF1ZXVlQWRkUmVzdWx0ID0gJG51bGwKICAgIHJldHVybiAkcmVzdWx0Cn0KCmZ1bmN0aW9uIEFkZC1Tb2Z0d2FyZVJlcXVlc3RUb1F1ZXVlIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bVmFsaWRhdGVTZXQoJ0luc3RhbGwnLCdVbmluc3RhbGwnKV1bc3RyaW5nXSRBY3Rpb24sCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJEFsaWFzLAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5LAogICAgICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkLAogICAgICAgIFtWYWxpZGF0ZVNldCgnVXNlcicsJ1JlcXVpcmVkJyldW3N0cmluZ10kU291cmNlID0gJ1VzZXInCiAgICApCgogICAgJG5vcm1hbGl6ZWRBbGlhcyA9ICRBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkbm9ybWFsaXplZEFsaWFzCiAgICBpZiAoLW5vdCAkYXBwKSB7CiAgICAgICAgdGhyb3cgIkFsaWFzICckbm9ybWFsaXplZEFsaWFzJyBpcyBub3QgaW4gdGhlIGFsbG93bGlzdC4iCiAgICB9CgogICAgJHJlcXVpcmVkU2V0ID0gR2V0LVJlcXVpcmVkQWxpYXNTZXQKICAgICRpc1JlcXVpcmVkID0gJHJlcXVpcmVkU2V0LkNvbnRhaW5zKCRub3JtYWxpemVkQWxpYXMpCiAgICBpZiAoJEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcgLWFuZCAkaXNSZXF1aXJlZCkgewogICAgICAgIHRocm93ICdQZmxpY2h0c29mdHdhcmUga2FubiBuaWNodCB6dXIgRGVpbnN0YWxsYXRpb24gYW5nZWZyYWd0IHdlcmRlbi4nCiAgICB9CgogICAgJGl0ZW0gPSBOZXctUXVldWVJdGVtIGAKICAgICAgICAtQWN0aW9uICRBY3Rpb24gYAogICAgICAgIC1BbGlhcyAkbm9ybWFsaXplZEFsaWFzIGAKICAgICAgICAtUGFja2FnZUlkIChbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSBgCiAgICAgICAgLURpc3BsYXlOYW1lIChbc3RyaW5nXSRhcHAuRGlzcGxheU5hbWUpIGAKICAgICAgICAtU291cmNlICRTb3VyY2UgYAogICAgICAgIC1SZXF1aXJlZDokaXNSZXF1aXJlZCBgCiAgICAgICAgLVJlcXVlc3RlZEJ5ICRSZXF1ZXN0ZWRCeSBgCiAgICAgICAgLVJlcXVlc3RlZEJ5U2lkICRSZXF1ZXN0ZWRCeVNpZAoKICAgIHJldHVybiBBZGQtUXVldWVJdGVtIC1JdGVtICRpdGVtCn0KCmZ1bmN0aW9uIEVuc3VyZS1SZXF1aXJlZFNvZnR3YXJlUXVldWVkIHsKICAgICRhZGRlZENvdW50ID0gMAogICAgaWYgKC1ub3QgKFRlc3QtU29mdHdhcmVDYXRhbG9nUG9saWN5RW5hYmxlZCkpIHsgcmV0dXJuIDAgfQogICAgaWYgKC1ub3QgKFRlc3QtUmVxdWlyZWRFbmZvcmNlbWVudEVuYWJsZWQpKSB7IHJldHVybiAwIH0KCiAgICAkaW5zdGFsbGVkU2V0ID0gR2V0LUluc3RhbGxlZFBhY2thZ2VJZFNldAogICAgZm9yZWFjaCAoJGFsaWFzIGluIEAoR2V0LVJlcXVpcmVkQWxpYXNlcykpIHsKICAgICAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgICAgICBpZiAoLW5vdCAkYXBwKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiUmVxdWlyZWQgYWxpYXMgJyRhbGlhcycgaXMgbm90IHByZXNlbnQgaW4gY2F0YWxvZyBwb2xpY3k7IHNraXBwaW5nLiIgJ1dBUk4nCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICBpZiAoJGluc3RhbGxlZFNldC5Db250YWlucyhbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSkgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9IEFkZC1Tb2Z0d2FyZVJlcXVlc3RUb1F1ZXVlIC1BY3Rpb24gSW5zdGFsbCAtQWxpYXMgJGFsaWFzIC1SZXF1ZXN0ZWRCeSAnUG9saWN5JyAtUmVxdWVzdGVkQnlTaWQgJ1BvbGljeScgLVNvdXJjZSBSZXF1aXJlZAogICAgICAgIGlmICgkcmVzdWx0IC1hbmQgJHJlc3VsdC5BZGRlZCkgewogICAgICAgICAgICAkYWRkZWRDb3VudCsrCiAgICAgICAgICAgIFdyaXRlLUxvZyAiUXVldWVkIHJlcXVpcmVkIHNvZnR3YXJlIGFsaWFzICckYWxpYXMnIHBhY2thZ2UgJyQoJGFwcC5QYWNrYWdlSWQpJy4iCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkYWRkZWRDb3VudAp9CgpmdW5jdGlvbiBJbnZva2UtV2l0aFdpbmdldExvY2sgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzY3JpcHRibG9ja10kU2NyaXB0QmxvY2ssCiAgICAgICAgW2ludF0kVGltZW91dFNlY29uZHMgPSA3MjAwCiAgICApCgogICAgJG11dGV4ID0gTmV3LU9iamVjdCBTeXN0ZW0uVGhyZWFkaW5nLk11dGV4KCRmYWxzZSwgJFdpbmdldE11dGV4TmFtZSkKICAgICRoYXNMb2NrID0gJGZhbHNlCgogICAgdHJ5IHsKICAgICAgICAkaGFzTG9jayA9ICRtdXRleC5XYWl0T25lKFtUaW1lU3Bhbl06OkZyb21TZWNvbmRzKCRUaW1lb3V0U2Vjb25kcykpCiAgICAgICAgaWYgKC1ub3QgJGhhc0xvY2spIHsKICAgICAgICAgICAgdGhyb3cgIlRpbWVkIG91dCB3YWl0aW5nIGZvciB3aW5nZXQgbG9jayAnJFdpbmdldE11dGV4TmFtZScuIgogICAgICAgIH0KCiAgICAgICAgJiAkU2NyaXB0QmxvY2sKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmICgkaGFzTG9jaykgewogICAgICAgICAgICAkbXV0ZXguUmVsZWFzZU11dGV4KCkKICAgICAgICB9CiAgICAgICAgJG11dGV4LkRpc3Bvc2UoKQogICAgfQp9CgpmdW5jdGlvbiBUZXN0LVdpbmdldExvY2tBdmFpbGFibGUgewogICAgJG11dGV4ID0gTmV3LU9iamVjdCBTeXN0ZW0uVGhyZWFkaW5nLk11dGV4KCRmYWxzZSwgJFdpbmdldE11dGV4TmFtZSkKICAgICRoYXNMb2NrID0gJGZhbHNlCgogICAgdHJ5IHsKICAgICAgICAkaGFzTG9jayA9ICRtdXRleC5XYWl0T25lKDApCiAgICAgICAgcmV0dXJuICRoYXNMb2NrCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoJGhhc0xvY2spIHsKICAgICAgICAgICAgJG11dGV4LlJlbGVhc2VNdXRleCgpCiAgICAgICAgfQogICAgICAgICRtdXRleC5EaXNwb3NlKCkKICAgIH0KfQoKZnVuY3Rpb24gQ29udmVydFRvLVByb2Nlc3NBcmd1bWVudCB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kVmFsdWUpCgogICAgaWYgKCRWYWx1ZSAtbWF0Y2ggJ1tccyJdJykgewogICAgICAgIHJldHVybiAnInswfSInIC1mICgkVmFsdWUuUmVwbGFjZSgnIicsICdcIicpKQogICAgfQoKICAgIHJldHVybiAkVmFsdWUKfQoKZnVuY3Rpb24gR2V0LVdvcmtlclNjcmlwdFBhdGggewogICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJExvY2FsU2NyaXB0UGF0aCkgewogICAgICAgIHJldHVybiAkTG9jYWxTY3JpcHRQYXRoCiAgICB9CgogICAgaWYgKCRQU0NvbW1hbmRQYXRoIC1hbmQgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFBTQ29tbWFuZFBhdGgpKSB7CiAgICAgICAgcmV0dXJuICRQU0NvbW1hbmRQYXRoCiAgICB9CgogICAgdGhyb3cgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgd29ya2VyIHNjcmlwdCBwYXRoLicKfQoKZnVuY3Rpb24gU3RhcnQtU29mdHdhcmVrYXRhbG9nV29ya2VyIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bVmFsaWRhdGVTZXQoJ0FwcGx5UG9saWN5JywnUHJvY2Vzc1JlcXVlc3QnLCdQcm9jZXNzUXVldWUnKV1bc3RyaW5nXSRXb3JrZXJNb2RlLAogICAgICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXVtzdHJpbmddJFdvcmtlckFjdGlvbiA9ICdJbnN0YWxsJywKICAgICAgICBbc3RyaW5nXSRXb3JrZXJBbGlhcywKICAgICAgICBbc3RyaW5nXSRXb3JrZXJSZXF1ZXN0ZWRCeSwKICAgICAgICBbc3RyaW5nXSRXb3JrZXJSZXF1ZXN0ZWRCeVNpZAogICAgKQoKICAgICR3b3JrZXJTY3JpcHQgPSBHZXQtV29ya2VyU2NyaXB0UGF0aAogICAgJGFyZ3MgPSBAKAogICAgICAgICctTm9Qcm9maWxlJywKICAgICAgICAnLUV4ZWN1dGlvblBvbGljeScsICdCeXBhc3MnLAogICAgICAgICctRmlsZScsICR3b3JrZXJTY3JpcHQsCiAgICAgICAgJy1Nb2RlJywgJFdvcmtlck1vZGUKICAgICkKCiAgICBpZiAoJFdvcmtlck1vZGUgLWVxICdQcm9jZXNzUmVxdWVzdCcpIHsKICAgICAgICAkYXJncyArPSBAKCctUmVxdWVzdEFjdGlvbicsICRXb3JrZXJBY3Rpb24sICctQXBwQWxpYXMnLCAkV29ya2VyQWxpYXMpCgogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJFdvcmtlclJlcXVlc3RlZEJ5KSkgewogICAgICAgICAgICAkYXJncyArPSBAKCctUmVxdWVzdGVkQnknLCAkV29ya2VyUmVxdWVzdGVkQnkpCiAgICAgICAgfQoKICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRXb3JrZXJSZXF1ZXN0ZWRCeVNpZCkpIHsKICAgICAgICAgICAgJGFyZ3MgKz0gQCgnLVJlcXVlc3RlZEJ5U2lkJywgJFdvcmtlclJlcXVlc3RlZEJ5U2lkKQogICAgICAgIH0KICAgIH0KCiAgICAkYXJndW1lbnRMaW5lID0gKEAoJGFyZ3MpIHwgRm9yRWFjaC1PYmplY3QgeyBDb252ZXJ0VG8tUHJvY2Vzc0FyZ3VtZW50IC1WYWx1ZSAoW3N0cmluZ10kXykgfSkgLWpvaW4gJyAnCiAgICBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAkUG93ZXJTaGVsbEV4ZSAtQXJndW1lbnRMaXN0ICRhcmd1bWVudExpbmUgLVdpbmRvd1N0eWxlIEhpZGRlbiB8IE91dC1OdWxsCn0KCmZ1bmN0aW9uIFN0YXJ0LVF1ZXVlV29ya2VyIHsKICAgIFN0YXJ0LVNvZnR3YXJla2F0YWxvZ1dvcmtlciAtV29ya2VyTW9kZSBQcm9jZXNzUXVldWUKfQoKZnVuY3Rpb24gR2V0LVdpbmdldFBhdGggewogICAgJGNhbmRpZGF0ZXMgPSBAKCkKCiAgICB0cnkgewogICAgICAgICRjbWQgPSBHZXQtQ29tbWFuZCB3aW5nZXQuZXhlIC1FcnJvckFjdGlvbiBTdG9wCiAgICAgICAgaWYgKCRjbWQgLWFuZCAkY21kLlNvdXJjZSkgewogICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY21kLlNvdXJjZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KCiAgICB0cnkgewogICAgICAgICRwYWNrYWdlcyA9IEdldC1BcHB4UGFja2FnZSAtQWxsVXNlcnMgLU5hbWUgTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXIgLUVycm9yQWN0aW9uIFN0b3AgfAogICAgICAgICAgICBXaGVyZS1PYmplY3QgeyAkXy5JbnN0YWxsTG9jYXRpb24gfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IFZlcnNpb24gLURlc2NlbmRpbmcKCiAgICAgICAgZm9yZWFjaCAoJHBhY2thZ2UgaW4gJHBhY2thZ2VzKSB7CiAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJHBhY2thZ2UuSW5zdGFsbExvY2F0aW9uICd3aW5nZXQuZXhlJwogICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY2FuZGlkYXRlCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgJHdpbmRvd3NBcHBzUm9vdCA9IEpvaW4tUGF0aCAkZW52OlByb2dyYW1GaWxlcyAnV2luZG93c0FwcHMnCiAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkd2luZG93c0FwcHNSb290KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJGl0ZW1zID0gR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGggJHdpbmRvd3NBcHBzUm9vdCAtRGlyZWN0b3J5IC1FcnJvckFjdGlvbiBTdG9wIHwKICAgICAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7ICRfLk5hbWUgLWxpa2UgJ01pY3Jvc29mdC5EZXNrdG9wQXBwSW5zdGFsbGVyXypfOHdla3liM2Q4YmJ3ZScgfSB8CiAgICAgICAgICAgICAgICBTb3J0LU9iamVjdCBOYW1lIC1EZXNjZW5kaW5nCgogICAgICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiAkaXRlbXMpIHsKICAgICAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJGl0ZW0uRnVsbE5hbWUgJ3dpbmdldC5leGUnCiAgICAgICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgJGNhbmRpZGF0ZXMgKz0gJGNhbmRpZGF0ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9CgogICAgJHJlc29sdmVkID0gJGNhbmRpZGF0ZXMgfCBTZWxlY3QtT2JqZWN0IC1VbmlxdWUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxCiAgICByZXR1cm4gJHJlc29sdmVkCn0KCmZ1bmN0aW9uIEVuc3VyZS1XaW5nZXRBdmFpbGFibGUgewogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYWxyZWFkeSBhdmFpbGFibGUgYXQ6ICR3aW5nZXRQYXRoIgogICAgICAgIHJldHVybiAkd2luZ2V0UGF0aAogICAgfQoKICAgIFdyaXRlLUxvZyAnd2luZ2V0LmV4ZSBub3QgZm91bmQuJwoKICAgICRpc0xvY2FsU3lzdGVtID0gJGZhbHNlCiAgICB0cnkgewogICAgICAgICRpc0xvY2FsU3lzdGVtID0gW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuV2luZG93c0lkZW50aXR5XTo6R2V0Q3VycmVudCgpLklzU3lzdGVtCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgaWYgKCRpc0xvY2FsU3lzdGVtKSB7CiAgICAgICAgV3JpdGUtTG9nICJBcHAgSW5zdGFsbGVyIHBhY2thZ2UgcmVnaXN0cmF0aW9uIGNhbm5vdCBydW4gYXMgTG9jYWxTeXN0ZW07IHNraXBwaW5nIEFkZC1BcHB4UGFja2FnZSBmYWxsYmFjayBmb3IgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iICdFUlJPUicKICAgICAgICBXcml0ZS1Mb2cgJ3dpbmdldCBpcyB1bmF2YWlsYWJsZS4gSW5zdGFsbC9wcm92aXNpb24gQXBwIEluc3RhbGxlciwgb3IgdmVyaWZ5IHdpbmdldCBwYXRoIGRpc2NvdmVyeSBmb3IgdGhpcyBkZXZpY2UuJyAnRVJST1InCiAgICAgICAgcmV0dXJuICRudWxsCiAgICB9CgogICAgV3JpdGUtTG9nICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIEFwcCBJbnN0YWxsZXIgcGFja2FnZSBmYW1pbHkgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBBZGQtQXBweFBhY2thZ2UgLVJlZ2lzdGVyQnlGYW1pbHlOYW1lIC1NYWluUGFja2FnZSAkQXBwSW5zdGFsbGVyRmFtaWx5TmFtZQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDMKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkFkZC1BcHB4UGFja2FnZSByZWdpc3RyYXRpb24gYXR0ZW1wdCBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CgogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYmVjYW1lIGF2YWlsYWJsZSBhZnRlciBBcHAgSW5zdGFsbGVyIHJlZ2lzdHJhdGlvbjogJHdpbmdldFBhdGgiCiAgICAgICAgcmV0dXJuICR3aW5nZXRQYXRoCiAgICB9CgogICAgV3JpdGUtTG9nICJ3aW5nZXQgaXMgc3RpbGwgdW5hdmFpbGFibGUgYWZ0ZXIgQXBwIEluc3RhbGxlciByZWdpc3RyYXRpb24gYXR0ZW1wdC4iICdFUlJPUicKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBOZXctVXNlclJlcXVlc3RUb29sIHsKICAgICRwaXBlTGl0ZXJhbCAgID0gJFBpcGVOYW1lLlJlcGxhY2UoIiciLCAiJyciKQoKJGNvbnRlbnQgPSBAIgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtzdHJpbmddYCRBcHBBbGlhcywKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXQogICAgW3N0cmluZ11gJEFjdGlvbiA9ICdJbnN0YWxsJywKICAgIFtzd2l0Y2hdYCRVbmluc3RhbGwsCiAgICBbc3dpdGNoXWAkTGlzdAopCgpTZXQtU3RyaWN0TW9kZSAtVmVyc2lvbiBMYXRlc3QKYCRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCmAkUGlwZU5hbWUgPSAnJHBpcGVMaXRlcmFsJwoKZnVuY3Rpb24gSW52b2tlLUNhdGFsb2dEYWVtb24gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1bc3RyaW5nXWAkQ29tbWFuZCwKICAgICAgICBbc3RyaW5nXWAkQWxpYXMKICAgICkKCiAgICBgJHBheWxvYWQgPSBbb3JkZXJlZF1AewogICAgICAgIENvbW1hbmQgID0gYCRDb21tYW5kCiAgICAgICAgQXBwQWxpYXMgPSBgJEFsaWFzCiAgICB9CiAgICBgJGpzb24gPSBgJHBheWxvYWQgfCBDb252ZXJ0VG8tSnNvbiAtQ29tcHJlc3MKCiAgICBgJGVuY29kaW5nID0gTmV3LU9iamVjdCBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoYCRmYWxzZSkKICAgIGAkY2xpZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuTmFtZWRQaXBlQ2xpZW50U3RyZWFtIC1Bcmd1bWVudExpc3QgQCgKICAgICAgICAnLicsCiAgICAgICAgYCRQaXBlTmFtZSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVEaXJlY3Rpb25dOjpJbk91dCwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVPcHRpb25zXTo6Tm9uZSwKICAgICAgICBbU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5Ub2tlbkltcGVyc29uYXRpb25MZXZlbF06OkltcGVyc29uYXRpb24KICAgICkKCiAgICB0cnkgewogICAgICAgIGAkY2xpZW50LkNvbm5lY3QoNjAwMDApCiAgICAgICAgYCRyZWFkZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1SZWFkZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1Xcml0ZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIuQXV0b0ZsdXNoID0gYCR0cnVlCiAgICAgICAgYCR3cml0ZXIuV3JpdGVMaW5lKGAkanNvbikKCiAgICAgICAgYCRsaW5lID0gYCRyZWFkZXIuUmVhZExpbmUoKQogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKGAkbGluZSkpIHsKICAgICAgICAgICAgdGhyb3cgJ0RlciBTb2Z0d2FyZWthdGFsb2ctRGllbnN0IGhhdCBrZWluZSBBbnR3b3J0IGdlc2VuZGV0LicKICAgICAgICB9CgogICAgICAgIGAkcmVzcG9uc2UgPSBgJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgaWYgKC1ub3QgYCRyZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgIHRocm93IChbc3RyaW5nXWAkcmVzcG9uc2UuTWVzc2FnZSkKICAgICAgICB9CgogICAgICAgIHJldHVybiBgJHJlc3BvbnNlCiAgICB9CiAgICBjYXRjaCBbU3lzdGVtLlRpbWVvdXRFeGNlcHRpb25dIHsKICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaXN0IG5pY2h0IGVycmVpY2hiYXIgb2RlciBzdGFydGV0IG5vY2guIEJpdHRlIHZlcnN1Y2hlbiBTaWUgZXMgZXJuZXV0LicKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGAkY2xpZW50LkRpc3Bvc2UoKQogICAgfQp9CgppZiAoYCRVbmluc3RhbGwpIHsKICAgIGAkQWN0aW9uID0gJ1VuaW5zdGFsbCcKfQoKaWYgKGAkTGlzdCkgewogICAgYCRyZXNwb25zZSA9IEludm9rZS1DYXRhbG9nRGFlbW9uIC1Db21tYW5kICdHZXRDYXRhbG9nJwogICAgV3JpdGUtSG9zdCAnRnJlaWdlZ2ViZW5lIEFud2VuZHVuZ2VuOicKICAgIEAoYCRyZXNwb25zZS5DYXRhbG9nKSB8IFNvcnQtT2JqZWN0IERpc3BsYXlOYW1lIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgIFdyaXRlLUhvc3QgKCIgLSB7MH0gW3sxfV0gOiB7Mn0iIC1mIGAkXy5EaXNwbGF5TmFtZSwgYCRfLkFsaWFzLCBgJF8uRGVzY3JpcHRpb24pCiAgICB9CiAgICBleGl0IDAKfQoKaWYgKC1ub3QgYCRBcHBBbGlhcykgewogICAgdGhyb3cgJ1NpZSBtw7xzc2VuIC1BcHBBbGlhcyBhbmdlYmVuIG9kZXIgLUxpc3QgdmVyd2VuZGVuLicKfQoKYCRhbGlhcyA9IGAkQXBwQWxpYXMuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQpgJHJlc3BvbnNlID0gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgYCRBY3Rpb24gLUFsaWFzIGAkYWxpYXMKCmlmIChgJEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcpIHsKICAgIFdyaXRlLUhvc3QgIkRlaW5zdGFsbGF0aW9uIGbDvHIgJ2AkYWxpYXMnIGVpbmdlcmVpaHQuIgp9CmVsc2UgewogICAgV3JpdGUtSG9zdCAiSW5zdGFsbGF0aW9uIGbDvHIgJ2AkYWxpYXMnIGVpbmdlcmVpaHQuIgp9CgppZiAoYCRyZXNwb25zZS5NZXNzYWdlKSB7CiAgICBXcml0ZS1Ib3N0IGAkcmVzcG9uc2UuTWVzc2FnZQp9CiJACgogICAgV3JpdGUtVGV4dEZpbGUgLVBhdGggJFJlcXVlc3RUb29sUGF0aCAtQ29udGVudCAkY29udGVudCAtRW5jb2RpbmcgVXRmOEJvbQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRSZXF1ZXN0VG9vbFBhdGgKfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dHdWkgewogICAgJHBpcGVMaXRlcmFsICAgICAgPSAkUGlwZU5hbWUuUmVwbGFjZSgiJyIsICInJyIpCiAgICAkdGl0bGVMaXRlcmFsICAgICA9ICRDYXRhbG9nRGlzcGxheU5hbWUuUmVwbGFjZSgiJyIsICInJyIpCiAgICAkbG9nTGl0ZXJhbCAgICAgICA9ICRMb2dGaWxlLlJlcGxhY2UoIiciLCAiJyciKQogICAgJGluc3RhbGxlZExpdGVyYWwgPSAkSW5zdGFsbGVkUGFja2FnZXNQYXRoLlJlcGxhY2UoIiciLCAiJyciKQogICAgJHF1ZXVlU3RhdGVMaXRlcmFsID0gJFF1ZXVlU3RhdGVQYXRoLlJlcGxhY2UoIiciLCAiJyciKQoKJGNvbnRlbnQgPSBAIgpBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5XaW5kb3dzLkZvcm1zCkFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLkRyYXdpbmcKW1N5c3RlbS5XaW5kb3dzLkZvcm1zLkFwcGxpY2F0aW9uXTo6RW5hYmxlVmlzdWFsU3R5bGVzKCkKCmlmICgtbm90ICgnTGlzdFZpZXdDb2x1bW5Tb3J0ZXInIC1hcyBbdHlwZV0pKSB7CkFkZC1UeXBlIC1UeXBlRGVmaW5pdGlvbiBAJwp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKdXNpbmcgU3lzdGVtLldpbmRvd3MuRm9ybXM7CgpwdWJsaWMgY2xhc3MgTGlzdFZpZXdDb2x1bW5Tb3J0ZXIgOiBJQ29tcGFyZXIgewogICAgcHVibGljIGludCBDb2x1bW4gPSAwOwogICAgcHVibGljIFNvcnRPcmRlciBPcmRlciA9IFNvcnRPcmRlci5Bc2NlbmRpbmc7CgogICAgcHVibGljIGludCBDb21wYXJlKG9iamVjdCB4LCBvYmplY3QgeSkgewogICAgICAgIHZhciBpdGVtWCA9IHggYXMgTGlzdFZpZXdJdGVtOwogICAgICAgIHZhciBpdGVtWSA9IHkgYXMgTGlzdFZpZXdJdGVtOwogICAgICAgIHN0cmluZyBhID0gc3RyaW5nLkVtcHR5OwogICAgICAgIHN0cmluZyBiID0gc3RyaW5nLkVtcHR5OwoKICAgICAgICBpZiAoaXRlbVggIT0gbnVsbCAmJiBpdGVtWC5TdWJJdGVtcy5Db3VudCA+IENvbHVtbikgewogICAgICAgICAgICBhID0gaXRlbVguU3ViSXRlbXNbQ29sdW1uXS5UZXh0OwogICAgICAgIH0KICAgICAgICBpZiAoaXRlbVkgIT0gbnVsbCAmJiBpdGVtWS5TdWJJdGVtcy5Db3VudCA+IENvbHVtbikgewogICAgICAgICAgICBiID0gaXRlbVkuU3ViSXRlbXNbQ29sdW1uXS5UZXh0OwogICAgICAgIH0KCiAgICAgICAgaW50IHJlc3VsdCA9IFN0cmluZ0NvbXBhcmVyLkN1cnJlbnRDdWx0dXJlSWdub3JlQ2FzZS5Db21wYXJlKGEsIGIpOwogICAgICAgIHJldHVybiBPcmRlciA9PSBTb3J0T3JkZXIuRGVzY2VuZGluZyA/IC1yZXN1bHQgOiByZXN1bHQ7CiAgICB9Cn0KJ0AgLVJlZmVyZW5jZWRBc3NlbWJsaWVzIEAoJ1N5c3RlbS5kbGwnLCdTeXN0ZW0uV2luZG93cy5Gb3Jtcy5kbGwnKQp9CgppZiAoLW5vdCAoJ1NoZWxsSWNvbkV4dHJhY3RvcicgLWFzIFt0eXBlXSkpIHsKQWRkLVR5cGUgLVR5cGVEZWZpbml0aW9uIEAnCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKcHVibGljIHN0YXRpYyBjbGFzcyBTaGVsbEljb25FeHRyYWN0b3IgewogICAgW0RsbEltcG9ydCgic2hlbGwzMi5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5Vbmljb2RlKV0KICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIHVpbnQgRXh0cmFjdEljb25FeChzdHJpbmcgc3pGaWxlTmFtZSwgaW50IG5JY29uSW5kZXgsIEludFB0cltdIHBoaWNvbkxhcmdlLCBJbnRQdHJbXSBwaGljb25TbWFsbCwgdWludCBuSWNvbnMpOwoKICAgIFtEbGxJbXBvcnQoInVzZXIzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0KICAgIFtyZXR1cm46IE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkJvb2wpXQpwdWJsaWMgc3RhdGljIGV4dGVybiBib29sIERlc3Ryb3lJY29uKEludFB0ciBoSWNvbik7Cn0KJ0AKfQoKU2V0LVN0cmljdE1vZGUgLVZlcnNpb24gTGF0ZXN0CmAkRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgpgJFBpcGVOYW1lID0gJyRwaXBlTGl0ZXJhbCcKYCRDYXRhbG9nVGl0bGUgPSAnJHRpdGxlTGl0ZXJhbCcKYCRMb2dGaWxlID0gJyRsb2dMaXRlcmFsJwpgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCA9ICckaW5zdGFsbGVkTGl0ZXJhbCcKYCRRdWV1ZVN0YXRlUGF0aCA9ICckcXVldWVTdGF0ZUxpdGVyYWwnCmAkQWxsb3dVc2VySW5zdGFsbHMgPSBgJHRydWUKYCRBbGxvd1VzZXJVbmluc3RhbGwgPSBgJHRydWUKYCRSZXF1aXJlZEFsaWFzU2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQpgJExhc3RTdGF0ZVZlcnNpb24gPSAtMQpgJExhc3RRdWV1ZSA9IEAoKQpgJExhc3RDdXJyZW50ID0gYCRudWxsCmAkTGFzdEluc3RhbGxlZElkcyA9IEAoKQoKZnVuY3Rpb24gU2V0LUZvcm1JY29uIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldYCRGb3JtKQoKICAgIGAkbGFyZ2UgPSBgJG51bGwKICAgIGAkc21hbGwgPSBgJG51bGwKCiAgICB0cnkgewogICAgICAgIGAkaWNvbkZpbGUgPSBKb2luLVBhdGggYCRlbnY6U3lzdGVtUm9vdCAnU3lzdGVtMzJcc2hlbGwzMi5kbGwnCiAgICAgICAgYCRsYXJnZSA9IE5ldy1PYmplY3QgU3lzdGVtLkludFB0cltdIDEKICAgICAgICBgJHNtYWxsID0gTmV3LU9iamVjdCBTeXN0ZW0uSW50UHRyW10gMQogICAgICAgIGAkY291bnQgPSBbU2hlbGxJY29uRXh0cmFjdG9yXTo6RXh0cmFjdEljb25FeChgJGljb25GaWxlLCA4MCwgYCRsYXJnZSwgYCRzbWFsbCwgMSkKCiAgICAgICAgaWYgKGAkY291bnQgLWd0IDApIHsKICAgICAgICAgICAgYCR1c2VIYW5kbGUgPSBbSW50UHRyXTo6WmVybwogICAgICAgICAgICBpZiAoYCRzbWFsbFswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIGAkdXNlSGFuZGxlID0gYCRzbWFsbFswXQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZiAoYCRsYXJnZVswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIGAkdXNlSGFuZGxlID0gYCRsYXJnZVswXQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoYCR1c2VIYW5kbGUgLW5lIFtJbnRQdHJdOjpaZXJvKSB7CiAgICAgICAgICAgICAgICBgJGljb24gPSBbU3lzdGVtLkRyYXdpbmcuSWNvbl06OkZyb21IYW5kbGUoYCR1c2VIYW5kbGUpCiAgICAgICAgICAgICAgICBgJEZvcm0uSWNvbiA9IFtTeXN0ZW0uRHJhd2luZy5JY29uXWAkaWNvbi5DbG9uZSgpCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYCRzbWFsbCAtYW5kIGAkc21hbGxbMF0gLW5lIFtJbnRQdHJdOjpaZXJvKSB7CiAgICAgICAgICAgICAgICBbdm9pZF1bU2hlbGxJY29uRXh0cmFjdG9yXTo6RGVzdHJveUljb24oYCRzbWFsbFswXSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoYCRsYXJnZSAtYW5kIGAkbGFyZ2VbMF0gLW5lIFtJbnRQdHJdOjpaZXJvKSB7CiAgICAgICAgICAgICAgICBbdm9pZF1bU2hlbGxJY29uRXh0cmFjdG9yXTo6RGVzdHJveUljb24oYCRsYXJnZVswXSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBJbnZva2UtQ2F0YWxvZ0RhZW1vbiB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtzdHJpbmddYCRDb21tYW5kLAogICAgICAgIFtzdHJpbmddYCRBbGlhcwogICAgKQoKICAgIGAkcGF5bG9hZCA9IFtvcmRlcmVkXUB7CiAgICAgICAgQ29tbWFuZCAgPSBgJENvbW1hbmQKICAgICAgICBBcHBBbGlhcyA9IGAkQWxpYXMKICAgIH0KICAgIGAkanNvbiA9IGAkcGF5bG9hZCB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcwoKICAgIGAkZW5jb2RpbmcgPSBOZXctT2JqZWN0IFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZyhgJGZhbHNlKQogICAgYCRjbGllbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5QaXBlcy5OYW1lZFBpcGVDbGllbnRTdHJlYW0gLUFyZ3VtZW50TGlzdCBAKAogICAgICAgICcuJywKICAgICAgICBgJFBpcGVOYW1lLAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZURpcmVjdGlvbl06OkluT3V0LAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZU9wdGlvbnNdOjpOb25lLAogICAgICAgIFtTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlRva2VuSW1wZXJzb25hdGlvbkxldmVsXTo6SW1wZXJzb25hdGlvbgogICAgKQoKICAgIHRyeSB7CiAgICAgICAgYCRjbGllbnQuQ29ubmVjdCg2MDAwMCkKICAgICAgICBgJHJlYWRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVJlYWRlcihgJGNsaWVudCwgYCRlbmNvZGluZykKICAgICAgICBgJHdyaXRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVdyaXRlcihgJGNsaWVudCwgYCRlbmNvZGluZykKICAgICAgICBgJHdyaXRlci5BdXRvRmx1c2ggPSBgJHRydWUKICAgICAgICBgJHdyaXRlci5Xcml0ZUxpbmUoYCRqc29uKQoKICAgICAgICBgJGxpbmUgPSBgJHJlYWRlci5SZWFkTGluZSgpCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRsaW5lKSkgewogICAgICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaGF0IGtlaW5lIEFudHdvcnQgZ2VzZW5kZXQuJwogICAgICAgIH0KCiAgICAgICAgYCRyZXNwb25zZSA9IGAkbGluZSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBpZiAoLW5vdCBgJHJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgdGhyb3cgKFtzdHJpbmddYCRyZXNwb25zZS5NZXNzYWdlKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGAkcmVzcG9uc2UKICAgIH0KICAgIGNhdGNoIFtTeXN0ZW0uVGltZW91dEV4Y2VwdGlvbl0gewogICAgICAgIHRocm93ICdEZXIgU29mdHdhcmVrYXRhbG9nLURpZW5zdCBpc3QgbmljaHQgZXJyZWljaGJhciBvZGVyIHN0YXJ0ZXQgbm9jaC4gQml0dGUgdmVyc3VjaGVuIFNpZSBlcyBlcm5ldXQuJwogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgYCRjbGllbnQuRGlzcG9zZSgpCiAgICB9Cn0KCmZ1bmN0aW9uIE5ldy1BcHBSZXF1ZXN0IHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldW3N0cmluZ11gJEFsaWFzLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldW3N0cmluZ11gJEFjdGlvbgogICAgKQoKICAgIHJldHVybiBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCBgJEFjdGlvbiAtQWxpYXMgKGAkQWxpYXMuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKSkKfQoKZnVuY3Rpb24gR2V0LUNhdGFsb2dBcHBzIHsKICAgIGAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCAnR2V0U3RhdGUnCiAgICBgJHNjcmlwdDpBbGxvd1VzZXJJbnN0YWxscyA9IFtib29sXWAkcmVzcG9uc2UuQWxsb3dVc2VySW5zdGFsbHMKICAgIGAkc2NyaXB0OkFsbG93VXNlclVuaW5zdGFsbCA9IFtib29sXWAkcmVzcG9uc2UuQWxsb3dVc2VyVW5pbnN0YWxsCiAgICBgJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQogICAgZm9yZWFjaCAoYCRhbGlhcyBpbiBAKGAkcmVzcG9uc2UuUmVxdWlyZWRBbGlhc2VzKSkgewogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ11gJGFsaWFzKSkgewogICAgICAgICAgICBbdm9pZF1gJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0LkFkZChbc3RyaW5nXWAkYWxpYXMpCiAgICAgICAgfQogICAgfQogICAgYCRzY3JpcHQ6TGFzdFN0YXRlVmVyc2lvbiA9IFtpbnQ2NF1gJHJlc3BvbnNlLlZlcnNpb24KICAgIGlmIChgJHJlc3BvbnNlLlF1ZXVlKSB7IGAkc2NyaXB0Okxhc3RRdWV1ZSA9IEAoYCRyZXNwb25zZS5RdWV1ZSkgfSBlbHNlIHsgYCRzY3JpcHQ6TGFzdFF1ZXVlID0gQCgpIH0KICAgIGAkc2NyaXB0Okxhc3RDdXJyZW50ID0gYCRyZXNwb25zZS5DdXJyZW50CiAgICBpZiAoYCRyZXNwb25zZS5JbnN0YWxsZWRQYWNrYWdlSWRzKSB7IGAkc2NyaXB0Okxhc3RJbnN0YWxsZWRJZHMgPSBAKGAkcmVzcG9uc2UuSW5zdGFsbGVkUGFja2FnZUlkcykgfSBlbHNlIHsgYCRzY3JpcHQ6TGFzdEluc3RhbGxlZElkcyA9IEAoKSB9CiAgICByZXR1cm4gQChgJHJlc3BvbnNlLkNhdGFsb2cpCn0KCmZ1bmN0aW9uIEdldC1JbnN0YWxsZWRQYWNrYWdlU3RhdGUgewogICAgYCRzdGF0ZSA9IFtvcmRlcmVkXUB7CiAgICAgICAgR2VuZXJhdGVkQXQgPSBgJG51bGwKICAgICAgICBQYWNrYWdlU2V0ICA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgIH0KCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCBgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCkpIHsKICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XWAkc3RhdGUKICAgIH0KCiAgICB0cnkgewogICAgICAgIGAkcmF3ID0gR2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoIGAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1SYXcgLUVuY29kaW5nIFVURjgKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJHJhdykpIHsKICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1gJHN0YXRlCiAgICAgICAgfQoKICAgICAgICBgJHNuYXBzaG90ID0gYCRyYXcgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgaWYgKGAkc25hcHNob3QuR2VuZXJhdGVkQXQpIHsKICAgICAgICAgICAgYCRzdGF0ZS5HZW5lcmF0ZWRBdCA9IFtzdHJpbmddYCRzbmFwc2hvdC5HZW5lcmF0ZWRBdAogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoYCRpZCBpbiBAKGAkc25hcHNob3QuSW5zdGFsbGVkUGFja2FnZUlkcykpIHsKICAgICAgICAgICAgaWYgKGAkaWQpIHsKICAgICAgICAgICAgICAgIFt2b2lkXWAkc3RhdGUuUGFja2FnZVNldC5BZGQoKFtzdHJpbmddYCRpZCkuVHJpbSgpKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgfQoKICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdYCRzdGF0ZQp9CgpmdW5jdGlvbiBHZXQtQXBwU3RhdHVzIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldYCRBcHAsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1gJEluc3RhbGxlZFNldCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXWAkUXVldWVJdGVtcwogICAgKQoKICAgIGZvcmVhY2ggKGAkcXVldWVkIGluIEAoYCRRdWV1ZUl0ZW1zKSkgewogICAgICAgIGlmICgtbm90IGAkcXVldWVkKSB7IGNvbnRpbnVlIH0KICAgICAgICBpZiAoYCRxdWV1ZWQuU3RhdGUgLWluIEAoJ1F1ZXVlZCcsJ1J1bm5pbmcnKSAtYW5kIFtzdHJpbmddOjpFcXVhbHMoW3N0cmluZ11gJHF1ZXVlZC5BbGlhcywgW3N0cmluZ11gJEFwcC5BbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgIGlmIChgJHF1ZXVlZC5TdGF0ZSAtZXEgJ1J1bm5pbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoYCRxdWV1ZWQuQWN0aW9uIC1lcSAnVW5pbnN0YWxsJykgeyByZXR1cm4gJ1dpcmQgZGVpbnN0YWxsaWVydCcgfQogICAgICAgICAgICAgICAgcmV0dXJuICdXaXJkIGluc3RhbGxpZXJ0JwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoYCRxdWV1ZWQuQWN0aW9uIC1lcSAnVW5pbnN0YWxsJykgeyByZXR1cm4gJ0RlaW5zdGFsbGF0aW9uIGluIFdhcnRlc2NobGFuZ2UnIH0KICAgICAgICAgICAgcmV0dXJuICdJbiBXYXJ0ZXNjaGxhbmdlJwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoYCRJbnN0YWxsZWRTZXQuQ29udGFpbnMoYCRBcHAuUGFja2FnZUlkKSkgewogICAgICAgIHJldHVybiAnSW5zdGFsbGllcnQnCiAgICB9CgogICAgaWYgKGAkc2NyaXB0OlJlcXVpcmVkQWxpYXNTZXQuQ29udGFpbnMoW3N0cmluZ11gJEFwcC5BbGlhcykpIHsKICAgICAgICByZXR1cm4gJ0luIFdhcnRlc2NobGFuZ2UnCiAgICB9CgogICAgcmV0dXJuICdJbnN0YWxsaWVyYmFyJwp9CgpgJGZvcm0gPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkZvcm0KYCRmb3JtLlRleHQgPSBgJENhdGFsb2dUaXRsZQpgJGZvcm0uU3RhcnRQb3NpdGlvbiA9ICdDZW50ZXJTY3JlZW4nCmAkZm9ybS5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk4MCwgNjYwKQpgJGZvcm0uTWluaW11bVNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTYwLCA2NDApCmAkZm9ybS5Ub3BNb3N0ID0gYCRmYWxzZQpgJGZvcm0uU2hvd0ljb24gPSBgJHRydWUKYCRmb3JtLkZvbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLkZvbnQoJ1NlZ29lIFVJJywgOSkKYCRmb3JtLkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvclRyYW5zbGF0b3JdOjpGcm9tSHRtbCgnI0YzRjNGMycpClNldC1Gb3JtSWNvbiAtRm9ybSBgJGZvcm0KCmAkaGVhZGVyUGFuZWwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlBhbmVsCmAkaGVhZGVyUGFuZWwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCAxMikKYCRoZWFkZXJQYW5lbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk0MCwgNTIpCmAkaGVhZGVyUGFuZWwuQW5jaG9yID0gJ1RvcCwgTGVmdCwgUmlnaHQnCmAkaGVhZGVyUGFuZWwuQmFja0NvbG9yID0gW1N5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9yc106OldpbmRvdwpgJGhlYWRlclBhbmVsLkJvcmRlclN0eWxlID0gJ0ZpeGVkU2luZ2xlJwoKYCRoZWFkZXJBY2NlbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlBhbmVsCmAkaGVhZGVyQWNjZW50LkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgwLCAwKQpgJGhlYWRlckFjY2VudC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDYsIDUwKQpgJGhlYWRlckFjY2VudC5BbmNob3IgPSAnVG9wLCBMZWZ0LCBCb3R0b20nCmAkaGVhZGVyQWNjZW50LkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvclRyYW5zbGF0b3JdOjpGcm9tSHRtbCgnIzBGNkNCRCcpCgpgJGhlYWRlclRpdGxlID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJGhlYWRlclRpdGxlLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxOCwgMTIpCmAkaGVhZGVyVGl0bGUuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MDAsIDI0KQpgJGhlYWRlclRpdGxlLkZvbnQgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLkZvbnQoJ1NlZ29lIFVJIFNlbWlib2xkJywgMTMpCmAkaGVhZGVyVGl0bGUuVGV4dCA9IGAkQ2F0YWxvZ1RpdGxlCgpgJGhlYWRlclBhbmVsLkNvbnRyb2xzLkFkZChgJGhlYWRlckFjY2VudCkKYCRoZWFkZXJQYW5lbC5Db250cm9scy5BZGQoYCRoZWFkZXJUaXRsZSkKCmAkZ3JvdXBBcHBzID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGdyb3VwQXBwcy5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDcyKQpgJGdyb3VwQXBwcy5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk0MCwgMzg0KQpgJGdyb3VwQXBwcy5BbmNob3IgPSAnVG9wLCBMZWZ0LCBSaWdodCwgQm90dG9tJwpgJGdyb3VwQXBwcy5CYWNrQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuU3lzdGVtQ29sb3JzXTo6V2luZG93CmAkZ3JvdXBBcHBzLkJvcmRlclN0eWxlID0gJ0ZpeGVkU2luZ2xlJwoKYCRsaXN0Q2FwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRsaXN0Q2FwdGlvbi5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDEwKQpgJGxpc3RDYXB0aW9uLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTEyLCAyMCkKYCRsaXN0Q2FwdGlvbi5Gb250ID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Gb250KCdTZWdvZSBVSSBTZW1pYm9sZCcsIDkuNSkKYCRsaXN0Q2FwdGlvbi5UZXh0ID0gJ0ZyZWlnZWdlYmVuZSBBbndlbmR1bmdlbicKCmAkbGlzdCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGlzdFZpZXcKYCRsaXN0LkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgMzQpCmAkbGlzdC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDkxNiwgMzM4KQpgJGxpc3QuQW5jaG9yID0gJ1RvcCwgTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRsaXN0LlZpZXcgPSAnRGV0YWlscycKYCRsaXN0LkZ1bGxSb3dTZWxlY3QgPSBgJHRydWUKYCRsaXN0Lk11bHRpU2VsZWN0ID0gYCRmYWxzZQpgJGxpc3QuR3JpZExpbmVzID0gYCRmYWxzZQpgJGxpc3QuSGlkZVNlbGVjdGlvbiA9IGAkZmFsc2UKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdBbndlbmR1bmcnLCAyNjApClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnQmVzY2hyZWlidW5nJywgNDUwKQpbdm9pZF1gJGxpc3QuQ29sdW1ucy5BZGQoJ1N0YXR1cycsIDE1MCkKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdBbGlhcycsIDExMCkKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdQYWtldC1JRCcsIDEwMCkKYCRsaXN0LkJvcmRlclN0eWxlID0gJ05vbmUnCmAkbGlzdC5IZWFkZXJTdHlsZSA9ICdDbGlja2FibGUnCgpgJGNvbHVtblNvcnRlciA9IE5ldy1PYmplY3QgTGlzdFZpZXdDb2x1bW5Tb3J0ZXIKYCRsaXN0Lkxpc3RWaWV3SXRlbVNvcnRlciA9IGAkY29sdW1uU29ydGVyCgpmdW5jdGlvbiBTb3J0LUxpc3RCeUNvbHVtbiB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtpbnRdYCRDb2x1bW5JbmRleCkKCiAgICBpZiAoYCRjb2x1bW5Tb3J0ZXIuQ29sdW1uIC1lcSBgJENvbHVtbkluZGV4KSB7CiAgICAgICAgaWYgKGAkY29sdW1uU29ydGVyLk9yZGVyIC1lcSBbU3lzdGVtLldpbmRvd3MuRm9ybXMuU29ydE9yZGVyXTo6QXNjZW5kaW5nKSB7CiAgICAgICAgICAgIGAkY29sdW1uU29ydGVyLk9yZGVyID0gW1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNvcnRPcmRlcl06OkRlc2NlbmRpbmcKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGAkY29sdW1uU29ydGVyLk9yZGVyID0gW1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNvcnRPcmRlcl06OkFzY2VuZGluZwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGAkY29sdW1uU29ydGVyLkNvbHVtbiA9IGAkQ29sdW1uSW5kZXgKICAgICAgICBgJGNvbHVtblNvcnRlci5PcmRlciA9IFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Tb3J0T3JkZXJdOjpBc2NlbmRpbmcKICAgIH0KCiAgICBgJGxpc3QuU29ydCgpCn0KCmAkZ3JvdXBBcHBzLkNvbnRyb2xzLkFkZChgJGxpc3RDYXB0aW9uKQpgJGdyb3VwQXBwcy5Db250cm9scy5BZGQoYCRsaXN0KQoKYCRpbmZvUGFuZWwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlBhbmVsCmAkaW5mb1BhbmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgNDY2KQpgJGluZm9QYW5lbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk0MCwgNTQpCmAkaW5mb1BhbmVsLkFuY2hvciA9ICdMZWZ0LCBSaWdodCwgQm90dG9tJwpgJGluZm9QYW5lbC5Cb3JkZXJTdHlsZSA9ICdGaXhlZFNpbmdsZScKYCRpbmZvUGFuZWwuQmFja0NvbG9yID0gW1N5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9yc106OldpbmRvdwoKYCRzbmFwc2hvdExhYmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJHNuYXBzaG90TGFiZWwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEwLCA4KQpgJHNuYXBzaG90TGFiZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MTQsIDE4KQpgJHNuYXBzaG90TGFiZWwuVGV4dCA9ICdJbnN0YWxsYXRpb25zZGF0ZW46IGtlaW4gRGF0ZW5zdGFuZCB2b3JoYW5kZW4nCgpgJGluc3RhbGxlZExhYmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJGluc3RhbGxlZExhYmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMCwgMzApCmAkaW5zdGFsbGVkTGFiZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MTQsIDE4KQpgJGluc3RhbGxlZExhYmVsLlRleHQgPSAnQmVyZWl0cyBpbnN0YWxsaWVydDoga2VpbmUnCgpgJGluZm9QYW5lbC5Db250cm9scy5BZGQoYCRzbmFwc2hvdExhYmVsKQpgJGluZm9QYW5lbC5Db250cm9scy5BZGQoYCRpbnN0YWxsZWRMYWJlbCkKCmZ1bmN0aW9uIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUgewogICAgaWYgKGAkbGlzdC5TZWxlY3RlZEl0ZW1zLkNvdW50IC1sdCAxKSB7CiAgICAgICAgYCRidG5JbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCiAgICAgICAgYCRidG5Vbmluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBgJHNlbGVjdGVkSXRlbSA9IGAkbGlzdC5TZWxlY3RlZEl0ZW1zWzBdCiAgICBgJHN0YXRlID0gYCRzZWxlY3RlZEl0ZW0uU3ViSXRlbXNbMl0uVGV4dAoKICAgIGAkaXNSZXF1aXJlZCA9IGAkc2NyaXB0OlJlcXVpcmVkQWxpYXNTZXQuQ29udGFpbnMoW3N0cmluZ11gJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1szXS5UZXh0KQogICAgYCRidG5JbnN0YWxsLkVuYWJsZWQgPSAoYCRzY3JpcHQ6QWxsb3dVc2VySW5zdGFsbHMgLWFuZCBgJHN0YXRlIC1lcSAnSW5zdGFsbGllcmJhcicpCiAgICBgJGJ0blVuaW5zdGFsbC5FbmFibGVkID0gKGAkc2NyaXB0OkFsbG93VXNlclVuaW5zdGFsbCAtYW5kIC1ub3QgYCRpc1JlcXVpcmVkIC1hbmQgYCRzdGF0ZSAtZXEgJ0luc3RhbGxpZXJ0JykKfQoKZnVuY3Rpb24gVXBkYXRlLVByb2dyZXNzQXJlYSB7CiAgICBgJGN1cnJlbnQgPSBgJHNjcmlwdDpMYXN0Q3VycmVudAogICAgYCRxdWV1ZWRDb3VudCA9IEAoYCRzY3JpcHQ6TGFzdFF1ZXVlIHwgV2hlcmUtT2JqZWN0IHsgYCRfIC1hbmQgYCRfLlN0YXRlIC1lcSAnUXVldWVkJyB9KS5Db3VudAogICAgaWYgKGAkY3VycmVudCkgewogICAgICAgIGAkbGFiZWwgPSBbc3RyaW5nXWAkY3VycmVudC5TdGFnZVRleHQKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJGxhYmVsKSkgeyBgJGxhYmVsID0gJ0FrdGlvbiBsw6R1ZnQuLi4nIH0KICAgICAgICBgJHN0YXR1cy5UZXh0ID0gInswfSAoV2FydGVzY2hsYW5nZTogezF9KSIgLWYgYCRsYWJlbCwgYCRxdWV1ZWRDb3VudAogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmlzaWJsZSA9IGAkdHJ1ZQogICAgICAgIGlmIChgJGN1cnJlbnQuSXNJbmRldGVybWluYXRlIC1vciBgJG51bGwgLWVxIGAkY3VycmVudC5Qcm9ncmVzc1BlcmNlbnQpIHsKICAgICAgICAgICAgYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdNYXJxdWVlJwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdDb250aW51b3VzJwogICAgICAgICAgICBgJHZhbHVlID0gW2ludF1gJGN1cnJlbnQuUHJvZ3Jlc3NQZXJjZW50CiAgICAgICAgICAgIGlmIChgJHZhbHVlIC1sdCAwKSB7IGAkdmFsdWUgPSAwIH0KICAgICAgICAgICAgaWYgKGAkdmFsdWUgLWd0IDEwMCkgeyBgJHZhbHVlID0gMTAwIH0KICAgICAgICAgICAgYCRwcm9ncmVzc0Jhci5WYWx1ZSA9IGAkdmFsdWUKICAgICAgICB9CiAgICB9CiAgICBlbHNlaWYgKGAkcXVldWVkQ291bnQgLWd0IDApIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIldhcnRlc2NobGFuZ2U6IHswfSIgLWYgYCRxdWV1ZWRDb3VudAogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmlzaWJsZSA9IGAkdHJ1ZQogICAgICAgIGAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnQ29udGludW91cycKICAgICAgICBgJHByb2dyZXNzQmFyLlZhbHVlID0gMAogICAgfQogICAgZWxzZSB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICdCZXJlaXQuJwogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmlzaWJsZSA9IGAkZmFsc2UKICAgICAgICBgJHByb2dyZXNzQmFyLlN0eWxlID0gJ0NvbnRpbnVvdXMnCiAgICAgICAgYCRwcm9ncmVzc0Jhci5WYWx1ZSA9IDAKICAgIH0KfQoKZnVuY3Rpb24gTG9hZC1BcHBMaXN0IHsKICAgIGAkc2VsZWN0ZWRBbGlhcyA9IGAkbnVsbAogICAgYCRsaXN0LkJlZ2luVXBkYXRlKCkKICAgIHRyeSB7CiAgICAgICAgaWYgKGAkbGlzdC5TZWxlY3RlZEl0ZW1zLkNvdW50IC1ndCAwKSB7CiAgICAgICAgICAgIGAkc2VsZWN0ZWRBbGlhcyA9IFtzdHJpbmddYCRsaXN0LlNlbGVjdGVkSXRlbXNbMF0uU3ViSXRlbXNbM10uVGV4dAogICAgICAgIH0KCiAgICAgICAgYCRsaXN0Lkl0ZW1zLkNsZWFyKCkKCiAgICAgICAgYCRhcHBzID0gR2V0LUNhdGFsb2dBcHBzCiAgICAgICAgYCRpbnN0YWxsZWRTdGF0ZSA9IEdldC1JbnN0YWxsZWRQYWNrYWdlU3RhdGUKICAgICAgICBgJGluc3RhbGxlZFNldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICAgICBmb3JlYWNoIChgJGlkIGluIEAoYCRzY3JpcHQ6TGFzdEluc3RhbGxlZElkcykpIHsKICAgICAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShbc3RyaW5nXWAkaWQpKSB7IFt2b2lkXWAkaW5zdGFsbGVkU2V0LkFkZChbc3RyaW5nXWAkaWQpIH0KICAgICAgICB9CgogICAgICAgIGlmICgtbm90IGAkaW5zdGFsbGVkU2V0KSB7CiAgICAgICAgICAgIGAkaW5zdGFsbGVkU2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQogICAgICAgIH0KCiAgICAgICAgYCRpbnN0YWxsZWROYW1lcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbc3RyaW5nXScKCiAgICAgICAgZm9yZWFjaCAoYCRhcHAgaW4gKGAkYXBwcyB8IFNvcnQtT2JqZWN0IERpc3BsYXlOYW1lKSkgewogICAgICAgICAgICBgJHN0YXRlID0gR2V0LUFwcFN0YXR1cyAtQXBwIGAkYXBwIC1JbnN0YWxsZWRTZXQgYCRpbnN0YWxsZWRTZXQgLVF1ZXVlSXRlbXMgYCRzY3JpcHQ6TGFzdFF1ZXVlCgogICAgICAgICAgICBgJGl0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxpc3RWaWV3SXRlbShgJGFwcC5EaXNwbGF5TmFtZSkKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJGFwcC5EZXNjcmlwdGlvbikKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJHN0YXRlKQogICAgICAgICAgICBbdm9pZF1gJGl0ZW0uU3ViSXRlbXMuQWRkKGAkYXBwLkFsaWFzKQogICAgICAgICAgICBbdm9pZF1gJGl0ZW0uU3ViSXRlbXMuQWRkKGAkYXBwLlBhY2thZ2VJZCkKICAgICAgICAgICAgYCRpdGVtLlRhZyA9IGAkYXBwCgogICAgICAgICAgICBpZiAoYCRzdGF0ZSAtZXEgJ0luc3RhbGxpZXJ0JykgewogICAgICAgICAgICAgICAgYCRpdGVtLkZvcmVDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvcl06OkRhcmtHcmVlbgogICAgICAgICAgICAgICAgW3ZvaWRdYCRpbnN0YWxsZWROYW1lcy5BZGQoYCRhcHAuRGlzcGxheU5hbWUpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmIChgJHN0YXRlIC1saWtlICcqV2FydGVzY2hsYW5nZScpIHsKICAgICAgICAgICAgICAgIGAkaXRlbS5Gb3JlQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JdOjpEYXJrR29sZGVucm9kCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmIChgJHN0YXRlIC1saWtlICdXaXJkIConKSB7CiAgICAgICAgICAgICAgICBgJGl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6Um95YWxCbHVlCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFt2b2lkXWAkbGlzdC5JdGVtcy5BZGQoYCRpdGVtKQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoYCRjb2wgaW4gYCRsaXN0LkNvbHVtbnMpIHsKICAgICAgICAgICAgaWYgKGAkY29sLlRleHQgLWVxICdQYWtldC1JRCcpIHsgYCRjb2wuV2lkdGggPSAwIH0KICAgICAgICB9CgogICAgICAgIGAkbGlzdC5Tb3J0KCkKCiAgICAgICAgaWYgKGAkaW5zdGFsbGVkU3RhdGUuR2VuZXJhdGVkQXQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGAkdGltZXN0YW1wID0gW0RhdGVUaW1lXTo6UGFyc2UoYCRpbnN0YWxsZWRTdGF0ZS5HZW5lcmF0ZWRBdCkuVG9Mb2NhbFRpbWUoKQogICAgICAgICAgICAgICAgYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuIHZvbTogJyArIGAkdGltZXN0YW1wLlRvU3RyaW5nKCdkZC5NTS55eXl5IEhIOm1tOnNzJykKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgICAgICBgJHNuYXBzaG90TGFiZWwuVGV4dCA9ICdJbnN0YWxsYXRpb25zZGF0ZW4gdm9tOiAnICsgYCRpbnN0YWxsZWRTdGF0ZS5HZW5lcmF0ZWRBdAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBgJHNuYXBzaG90TGFiZWwuVGV4dCA9ICdJbnN0YWxsYXRpb25zZGF0ZW46IGtlaW4gRGF0ZW5zdGFuZCB2b3JoYW5kZW4nCiAgICAgICAgfQoKICAgICAgICBpZiAoYCRpbnN0YWxsZWROYW1lcy5Db3VudCAtZ3QgMCkgewogICAgICAgICAgICBgJGluc3RhbGxlZExhYmVsLlRleHQgPSAnQmVyZWl0cyBpbnN0YWxsaWVydDogJyArIChgJGluc3RhbGxlZE5hbWVzIC1qb2luICcsICcpCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBgJGluc3RhbGxlZExhYmVsLlRleHQgPSAnQmVyZWl0cyBpbnN0YWxsaWVydDoga2VpbmUgZnJlaWdlZ2ViZW5lIFNvZnR3YXJlIGVya2FubnQnCiAgICAgICAgfQoKICAgICAgICBVcGRhdGUtUHJvZ3Jlc3NBcmVhCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBgJGxpc3QuRW5kVXBkYXRlKCkKCiAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJHNlbGVjdGVkQWxpYXMpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKGAkaXRlbSBpbiBgJGxpc3QuSXRlbXMpIHsKICAgICAgICAgICAgICAgIGlmIChgJGl0ZW0uU3ViSXRlbXMuQ291bnQgLWd0IDMgLWFuZCBbc3RyaW5nXTo6RXF1YWxzKGAkaXRlbS5TdWJJdGVtc1szXS5UZXh0LCBgJHNlbGVjdGVkQWxpYXMsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkgewogICAgICAgICAgICAgICAgICAgIGAkaXRlbS5TZWxlY3RlZCA9IGAkdHJ1ZQogICAgICAgICAgICAgICAgICAgIGAkaXRlbS5FbnN1cmVWaXNpYmxlKCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBVcGRhdGUtSW5zdGFsbEJ1dHRvblN0YXRlCiAgICB9Cn0KCmAkc3RhdHVzID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MYWJlbApgJHN0YXR1cy5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDUyNikKYCRzdGF0dXMuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg3MDAsIDIwKQpgJHN0YXR1cy5BbmNob3IgPSAnTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRzdGF0dXMuRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGltR3JheQpgJHN0YXR1cy5UZXh0ID0gJ0JlcmVpdC4nCgpgJHByb2dyZXNzQmFyID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Qcm9ncmVzc0JhcgpgJHByb2dyZXNzQmFyLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgNTQ4KQpgJHByb2dyZXNzQmFyLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoNzAwLCAxMikKYCRwcm9ncmVzc0Jhci5BbmNob3IgPSAnTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdDb250aW51b3VzJwpgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJGZhbHNlCgpgJGJ0bkluc3RhbGwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0bkluc3RhbGwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCA1NjgpCmAkYnRuSW5zdGFsbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDE3MCwgMzApCmAkYnRuSW5zdGFsbC5BbmNob3IgPSAnTGVmdCwgQm90dG9tJwpgJGJ0bkluc3RhbGwuVGV4dCA9ICdJbnN0YWxsaWVyZW4nCmAkYnRuSW5zdGFsbC5FbmFibGVkID0gYCRmYWxzZQoKYCRidG5Vbmluc3RhbGwgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0blVuaW5zdGFsbC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTkwLCA1NjgpCmAkYnRuVW5pbnN0YWxsLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoMTQwLCAzMCkKYCRidG5Vbmluc3RhbGwuQW5jaG9yID0gJ0xlZnQsIEJvdHRvbScKYCRidG5Vbmluc3RhbGwuVGV4dCA9ICdEZWluc3RhbGxhdGlvbicKYCRidG5Vbmluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKCmAkYnRuUmVmcmVzaCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uCmAkYnRuUmVmcmVzaC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMzM4LCA1NjgpCmAkYnRuUmVmcmVzaC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDExMCwgMzApCmAkYnRuUmVmcmVzaC5BbmNob3IgPSAnTGVmdCwgQm90dG9tJwpgJGJ0blJlZnJlc2guVGV4dCA9ICdBa3R1YWxpc2llcmVuJwoKYCRidG5PcGVuTG9nID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24KYCRidG5PcGVuTG9nLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCg0NTYsIDU2OCkKYCRidG5PcGVuTG9nLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoMTMwLCAzMCkKYCRidG5PcGVuTG9nLkFuY2hvciA9ICdMZWZ0LCBCb3R0b20nCmAkYnRuT3BlbkxvZy5UZXh0ID0gJ1Byb3Rva29sbCDDtmZmbmVuJwoKYCRidG5DbG9zZSA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uCmAkYnRuQ2xvc2UuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDgzMiwgNTY4KQpgJGJ0bkNsb3NlLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoMTIwLCAzMCkKYCRidG5DbG9zZS5BbmNob3IgPSAnUmlnaHQsIEJvdHRvbScKYCRidG5DbG9zZS5UZXh0ID0gJ1NjaGxpZcOfZW4nCgpgJHNjcmlwdDpTdGF0ZVdhdGNoZXIgPSBgJG51bGwKYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyID0gYCRudWxsCmAkc3RhdGVSZWZyZXNoVGltZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLlRpbWVyCmAkc3RhdGVSZWZyZXNoVGltZXIuSW50ZXJ2YWwgPSA1MDAKYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkZmFsc2UKCmAkYnRuSW5zdGFsbC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWx0IDEpIHsKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgJ0JpdHRlIHp1ZXJzdCBlaW5lIEFud2VuZHVuZyBhdXN3w6RobGVuLicsCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgICAgIGAkc2VsZWN0ZWQgPSBgJHNlbGVjdGVkSXRlbS5UYWcKICAgICAgICBgJGN1cnJlbnRTdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICAgICAgaWYgKGAkY3VycmVudFN0YXRlIC1lcSAnSW5zdGFsbGllcnQnKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiezB9IGlzdCBiZXJlaXRzIGluc3RhbGxpZXJ0LiIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSksCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJJbnN0YWxsYXRpb24gd2lyZCBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUKICAgICAgICBgJHJlc3BvbnNlID0gTmV3LUFwcFJlcXVlc3QgLUFsaWFzIGAkc2VsZWN0ZWQuQWxpYXMgLUFjdGlvbiAnSW5zdGFsbCcKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gaWYgKGAkcmVzcG9uc2UuTWVzc2FnZSkgeyBgJHJlc3BvbnNlLk1lc3NhZ2UgfSBlbHNlIHsgIkluc3RhbGxhdGlvbiBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUgfQoKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgICgiSW5zdGFsbGF0aW9uIGVpbmdlcmVpaHQ6YHJgbmByYG57MH1gcmBuQWxpYXM6IHsxfSIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSwgYCRzZWxlY3RlZC5BbGlhcyksCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICApIHwgT3V0LU51bGwKCiAgICAgICAgTG9hZC1BcHBMaXN0CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJGZWhsZXI6ICIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgIGAkXy5FeGNlcHRpb24uTWVzc2FnZSwKICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpFcnJvcgogICAgICAgICkgfCBPdXQtTnVsbAogICAgfQp9KQoKYCRidG5Vbmluc3RhbGwuQWRkX0NsaWNrKHsKICAgIHRyeSB7CiAgICAgICAgaWYgKGAkbGlzdC5TZWxlY3RlZEl0ZW1zLkNvdW50IC1sdCAxKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICdCaXR0ZSB6dWVyc3QgZWluZSBBbndlbmR1bmcgYXVzd8OkaGxlbi4nLAogICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGAkc2VsZWN0ZWRJdGVtID0gYCRsaXN0LlNlbGVjdGVkSXRlbXNbMF0KICAgICAgICBgJHNlbGVjdGVkID0gYCRzZWxlY3RlZEl0ZW0uVGFnCiAgICAgICAgYCRjdXJyZW50U3RhdGUgPSBgJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1syXS5UZXh0CgogICAgICAgIGlmIChgJGN1cnJlbnRTdGF0ZSAtbmUgJ0luc3RhbGxpZXJ0JykgewogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgICAgICAoInswfSBpc3QgZGVyemVpdCBuaWNodCBhbHMgaW5zdGFsbGllcnQgbWFya2llcnQuIiAtZiBgJHNlbGVjdGVkLkRpc3BsYXlOYW1lKSwKICAgICAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpJbmZvcm1hdGlvbgogICAgICAgICAgICApIHwgT3V0LU51bGwKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIkRlaW5zdGFsbGF0aW9uIHdpcmQgZWluZ2VyZWlodDogezB9IiAtZiBgJHNlbGVjdGVkLkRpc3BsYXlOYW1lCiAgICAgICAgYCRyZXNwb25zZSA9IE5ldy1BcHBSZXF1ZXN0IC1BbGlhcyBgJHNlbGVjdGVkLkFsaWFzIC1BY3Rpb24gJ1VuaW5zdGFsbCcKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gaWYgKGAkcmVzcG9uc2UuTWVzc2FnZSkgeyBgJHJlc3BvbnNlLk1lc3NhZ2UgfSBlbHNlIHsgIkRlaW5zdGFsbGF0aW9uIGVpbmdlcmVpaHQ6IHswfSIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSB9CgogICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgKCJEZWluc3RhbGxhdGlvbiBlaW5nZXJlaWh0OmByYG5gcmBuezB9YHJgbkFsaWFzOiB7MX0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUsIGAkc2VsZWN0ZWQuQWxpYXMpLAogICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgKSB8IE91dC1OdWxsCgogICAgICAgIExvYWQtQXBwTGlzdAogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkYnRuUmVmcmVzaC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gJ0luc3RhbGxhdGlvbnNkYXRlbiB3ZXJkZW4gYWt0dWFsaXNpZXJ0Li4uJwogICAgICAgIGAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCAnUmVmcmVzaFN0YXR1cycKICAgICAgICBMb2FkLUFwcExpc3QKICAgICAgICBpZiAoYCRyZXNwb25zZS5NZXNzYWdlKSB7IGAkc3RhdHVzLlRleHQgPSBgJHJlc3BvbnNlLk1lc3NhZ2UgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkc3RhdGVSZWZyZXNoVGltZXIuQWRkX1RpY2soewogICAgaWYgKC1ub3QgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZykgeyByZXR1cm4gfQogICAgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkZmFsc2UKICAgIHRyeSB7IExvYWQtQXBwTGlzdCB9CiAgICBjYXRjaCB7IGAkc3RhdHVzLlRleHQgPSAiRmVobGVyIGJlaSBhdXRvbWF0aXNjaGVyIEFrdHVhbGlzaWVydW5nOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlIH0KfSkKCmAkYnRuT3BlbkxvZy5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShgJExvZ0ZpbGUpKSB7CiAgICAgICAgICAgIHRocm93ICdEZXIgUGZhZCB6dXIgUHJvdG9rb2xsZGF0ZWkgaXN0IGxlZXIuJwogICAgICAgIH0KCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRMb2dGaWxlKSB7CiAgICAgICAgICAgIFN0YXJ0LVByb2Nlc3MgLUZpbGVQYXRoICdub3RlcGFkLmV4ZScgLUFyZ3VtZW50TGlzdCBAKGAkTG9nRmlsZSkKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICdEaWUgUHJvdG9rb2xsZGF0ZWkgd3VyZGUgbm9jaCBuaWNodCBlcnN0ZWxsdC4nLAogICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgIGAkXy5FeGNlcHRpb24uTWVzc2FnZSwKICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpFcnJvcgogICAgICAgICkgfCBPdXQtTnVsbAogICAgfQp9KQoKYCRidG5DbG9zZS5BZGRfQ2xpY2soeyBgJGZvcm0uQ2xvc2UoKSB9KQoKYCRmb3JtLkFkZF9TaG93bih7CiAgICB0cnkgewogICAgICAgIGAkc3RhdGVEaXIgPSBTcGxpdC1QYXRoIC1QYXRoIGAkUXVldWVTdGF0ZVBhdGggLVBhcmVudAogICAgICAgIGAkc3RhdGVGaWxlID0gU3BsaXQtUGF0aCAtUGF0aCBgJFF1ZXVlU3RhdGVQYXRoIC1MZWFmCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRzdGF0ZURpcikgewogICAgICAgICAgICBgJHNjcmlwdDpTdGF0ZVdhdGNoZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5GaWxlU3lzdGVtV2F0Y2hlcihgJHN0YXRlRGlyLCBgJHN0YXRlRmlsZSkKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLk5vdGlmeUZpbHRlciA9IFtTeXN0ZW0uSU8uTm90aWZ5RmlsdGVyc10nTGFzdFdyaXRlLCBGaWxlTmFtZSwgU2l6ZScKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkFkZF9DaGFuZ2VkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTdGF0ZVdhdGNoZXIuQWRkX0NyZWF0ZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5BZGRfUmVuYW1lZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkVuYWJsZVJhaXNpbmdFdmVudHMgPSBgJHRydWUKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJTdGF0dXN1ZWJlcndhY2h1bmcga29ubnRlIG5pY2h0IGdlc3RhcnRldCB3ZXJkZW46ICIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgIH0KCiAgICB0cnkgewogICAgICAgIGAkc25hcHNob3REaXIgPSBTcGxpdC1QYXRoIC1QYXRoIGAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1QYXJlbnQKICAgICAgICBgJHNuYXBzaG90RmlsZSA9IFNwbGl0LVBhdGggLVBhdGggYCRJbnN0YWxsZWRQYWNrYWdlc1BhdGggLUxlYWYKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCBgJHNuYXBzaG90RGlyKSB7CiAgICAgICAgICAgIGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkZpbGVTeXN0ZW1XYXRjaGVyKGAkc25hcHNob3REaXIsIGAkc25hcHNob3RGaWxlKQogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuTm90aWZ5RmlsdGVyID0gW1N5c3RlbS5JTy5Ob3RpZnlGaWx0ZXJzXSdMYXN0V3JpdGUsIEZpbGVOYW1lLCBTaXplJwogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuQWRkX0NoYW5nZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlci5BZGRfQ3JlYXRlZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLkFkZF9SZW5hbWVkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuRW5hYmxlUmFpc2luZ0V2ZW50cyA9IGAkdHJ1ZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIlNuYXBzaG90dWViZXJ3YWNodW5nIGtvbm50ZSBuaWNodCBnZXN0YXJ0ZXQgd2VyZGVuOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICB9CiAgICBgJHN0YXRlUmVmcmVzaFRpbWVyLlN0YXJ0KCkKfSkKYCRmb3JtLkFkZF9Gb3JtQ2xvc2luZyh7CiAgICBgJHN0YXRlUmVmcmVzaFRpbWVyLlN0b3AoKQogICAgYCRzdGF0ZVJlZnJlc2hUaW1lci5EaXNwb3NlKCkKICAgIGlmIChgJHNjcmlwdDpTdGF0ZVdhdGNoZXIpIHsgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkRpc3Bvc2UoKSB9CiAgICBpZiAoYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyKSB7IGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlci5EaXNwb3NlKCkgfQp9KQoKYCRsaXN0LkFkZF9TZWxlY3RlZEluZGV4Q2hhbmdlZCh7IFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUgfSkKYCRsaXN0LkFkZF9Db2x1bW5DbGljayh7CiAgICBwYXJhbShgJHNlbmRlciwgYCRldmVudEFyZ3MpCiAgICBTb3J0LUxpc3RCeUNvbHVtbiAtQ29sdW1uSW5kZXggYCRldmVudEFyZ3MuQ29sdW1uCn0pCgpgJGxpc3QuQWRkX0RvdWJsZUNsaWNrKHsKICAgIGlmIChgJGxpc3QuU2VsZWN0ZWRJdGVtcy5Db3VudCAtZ3QgMCkgewogICAgICAgIGlmIChgJGJ0bkluc3RhbGwuRW5hYmxlZCkgewogICAgICAgICAgICBgJGJ0bkluc3RhbGwuUGVyZm9ybUNsaWNrKCkKICAgICAgICB9CiAgICB9Cn0pCgpgJGZvcm0uQ29udHJvbHMuQWRkKGAkaGVhZGVyUGFuZWwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRncm91cEFwcHMpCmAkZm9ybS5Db250cm9scy5BZGQoYCRpbmZvUGFuZWwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRzdGF0dXMpCmAkZm9ybS5Db250cm9scy5BZGQoYCRwcm9ncmVzc0JhcikKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGJ0bkluc3RhbGwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5Vbmluc3RhbGwpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5SZWZyZXNoKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkYnRuT3BlbkxvZykKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGJ0bkNsb3NlKQoKYCRmb3JtLkFjY2VwdEJ1dHRvbiA9IGAkYnRuSW5zdGFsbApgJGZvcm0uQ2FuY2VsQnV0dG9uID0gYCRidG5DbG9zZQoKdHJ5IHsKICAgIExvYWQtQXBwTGlzdAp9CmNhdGNoIHsKICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyIGJlaW0gTGFkZW46ICIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAiRGVyIFNvZnR3YXJla2F0YWxvZyBrb25udGUgbmljaHQgdm9sbHN0w6RuZGlnIGdlbGFkZW4gd2VyZGVuLmByYG5gcmBuIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZSwKICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpFcnJvcgogICAgKSB8IE91dC1OdWxsCn0KClt2b2lkXWAkZm9ybS5TaG93RGlhbG9nKCkKIkAKCiAgICBXcml0ZS1UZXh0RmlsZSAtUGF0aCAkQ2F0YWxvZ0d1aVBhdGggLUNvbnRlbnQgJGNvbnRlbnQgLUVuY29kaW5nIFV0ZjhCb20KICAgIFNldC1GaWxlQWNsQWRtaW5zT25seSAtUGF0aCAkQ2F0YWxvZ0d1aVBhdGgKfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dMYXVuY2hlciB7CiAgICAkcHNRdW90ZWQgPSAkUG93ZXJTaGVsbEV4ZS5SZXBsYWNlKCciJywgJyIiJykKICAgICRndWlRdW90ZWQgPSAkQ2F0YWxvZ0d1aVBhdGguUmVwbGFjZSgnIicsICciIicpCgogICAgJHZicyA9IEAiClNldCBzaGVsbCA9IENyZWF0ZU9iamVjdCgiV1NjcmlwdC5TaGVsbCIpCmNtZExpbmUgPSBDaHIoMzQpICYgIiRwc1F1b3RlZCIgJiBDaHIoMzQpICYgIiAtTm9Qcm9maWxlIC1FeGVjdXRpb25Qb2xpY3kgQnlwYXNzIC1TVEEgLVdpbmRvd1N0eWxlIEhpZGRlbiAtRmlsZSAiICYgQ2hyKDM0KSAmICIkZ3VpUXVvdGVkIiAmIENocigzNCkKc2hlbGwuUnVuIGNtZExpbmUsIDAsIEZhbHNlCiJACgogICAgV3JpdGUtVGV4dEZpbGUgLVBhdGggJENhdGFsb2dMYXVuY2hlclBhdGggLUNvbnRlbnQgJHZicyAtRW5jb2RpbmcgVW5pY29kZQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRDYXRhbG9nTGF1bmNoZXJQYXRoCn0KCmZ1bmN0aW9uIE5ldy1TaG9ydGN1dCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kU2hvcnRjdXRQYXRoCiAgICApCgogICAgJHBhcmVudCA9IFNwbGl0LVBhdGggLVBhdGggJFNob3J0Y3V0UGF0aCAtUGFyZW50CiAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRwYXJlbnQKCiAgICAkc2hlbGwgPSBOZXctT2JqZWN0IC1Db21PYmplY3QgV1NjcmlwdC5TaGVsbAogICAgJHNob3J0Y3V0ID0gJHNoZWxsLkNyZWF0ZVNob3J0Y3V0KCRTaG9ydGN1dFBhdGgpCiAgICAkc2hvcnRjdXQuVGFyZ2V0UGF0aCA9ICRXU2NyaXB0RXhlCiAgICAkc2hvcnRjdXQuQXJndW1lbnRzID0gImAiJENhdGFsb2dMYXVuY2hlclBhdGhgIiIKICAgICRzaG9ydGN1dC5Xb3JraW5nRGlyZWN0b3J5ID0gJEJhc2VEaXIKICAgICRzaG9ydGN1dC5XaW5kb3dTdHlsZSA9IDEKICAgICRzaG9ydGN1dC5EZXNjcmlwdGlvbiA9ICRDYXRhbG9nRGlzcGxheU5hbWUKICAgICRzaG9ydGN1dC5JY29uTG9jYXRpb24gPSAiJGVudjpTeXN0ZW1Sb290XFN5c3RlbTMyXHNoZWxsMzIuZGxsLDgwIgogICAgJHNob3J0Y3V0LlNhdmUoKQp9CgpmdW5jdGlvbiBVbnJlZ2lzdGVyLUxlZ2FjeVF1ZXVlVGFzayB7CiAgICB0cnkgewogICAgICAgICR0YXNrID0gR2V0LVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICRMZWdhY3lRdWV1ZVRhc2tOYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgaWYgKCR0YXNrKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiUmVtb3ZpbmcgbGVnYWN5IHNjaGVkdWxlZCB0YXNrICckTGVnYWN5UXVldWVUYXNrTmFtZScuIgogICAgICAgICAgICBVbnJlZ2lzdGVyLVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICRMZWdhY3lRdWV1ZVRhc2tOYW1lIC1Db25maXJtOiRmYWxzZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCByZW1vdmUgbGVnYWN5IHNjaGVkdWxlZCB0YXNrICckTGVnYWN5UXVldWVUYXNrTmFtZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgIH0KfQoKZnVuY3Rpb24gUmVnaXN0ZXItT3JVcGRhdGVUYXNrcyB7CiAgICBVbnJlZ2lzdGVyLUxlZ2FjeVF1ZXVlVGFzawoKICAgIHRyeSB7CiAgICAgICAgJGV4aXN0aW5nRGFlbW9uID0gR2V0LVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICREYWVtb25UYXNrTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIGlmICgkZXhpc3RpbmdEYWVtb24pIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJTdG9wcGluZyBzY2hlZHVsZWQgdGFzayAnJERhZW1vblRhc2tOYW1lJyBiZWZvcmUgdXBkYXRlLiIKICAgICAgICAgICAgU3RvcC1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkRGFlbW9uVGFza05hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMgogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCBzdG9wIGRhZW1vbiB0YXNrICckRGFlbW9uVGFza05hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9CgogICAgJHByaW5jaXBhbCA9IE5ldy1TY2hlZHVsZWRUYXNrUHJpbmNpcGFsIGAKICAgICAgICAtVXNlcklkICdTWVNURU0nIGAKICAgICAgICAtTG9nb25UeXBlIFNlcnZpY2VBY2NvdW50IGAKICAgICAgICAtUnVuTGV2ZWwgSGlnaGVzdAoKICAgIFdyaXRlLUxvZyAiUmVnaXN0ZXJpbmcvdXBkYXRpbmcgc2NoZWR1bGVkIHRhc2sgJyREYWVtb25UYXNrTmFtZScuIgogICAgJGRhZW1vbkFyZ3MgPSAiLU5vUHJvZmlsZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtRmlsZSBgIiRMb2NhbFNjcmlwdFBhdGhgIiAtTW9kZSBEYWVtb24iCiAgICAkZGFlbW9uQWN0aW9uID0gTmV3LVNjaGVkdWxlZFRhc2tBY3Rpb24gLUV4ZWN1dGUgJFBvd2VyU2hlbGxFeGUgLUFyZ3VtZW50ICRkYWVtb25BcmdzCiAgICAkZGFlbW9uVHJpZ2dlciA9IE5ldy1TY2hlZHVsZWRUYXNrVHJpZ2dlciAtQXRTdGFydHVwCiAgICAkZGFlbW9uU2V0dGluZ3MgPSBOZXctU2NoZWR1bGVkVGFza1NldHRpbmdzU2V0IGAKICAgICAgICAtQWxsb3dTdGFydElmT25CYXR0ZXJpZXMgYAogICAgICAgIC1Eb250U3RvcElmR29pbmdPbkJhdHRlcmllcyBgCiAgICAgICAgLVN0YXJ0V2hlbkF2YWlsYWJsZSBgCiAgICAgICAgLU11bHRpcGxlSW5zdGFuY2VzIElnbm9yZU5ldyBgCiAgICAgICAgLUV4ZWN1dGlvblRpbWVMaW1pdCAoTmV3LVRpbWVTcGFuIC1TZWNvbmRzIDApIGAKICAgICAgICAtUmVzdGFydENvdW50IDMgYAogICAgICAgIC1SZXN0YXJ0SW50ZXJ2YWwgKE5ldy1UaW1lU3BhbiAtTWludXRlcyAxKQoKICAgICRkYWVtb25UYXNrID0gTmV3LVNjaGVkdWxlZFRhc2sgYAogICAgICAgIC1BY3Rpb24gJGRhZW1vbkFjdGlvbiBgCiAgICAgICAgLVRyaWdnZXIgJGRhZW1vblRyaWdnZXIgYAogICAgICAgIC1QcmluY2lwYWwgJHByaW5jaXBhbCBgCiAgICAgICAgLVNldHRpbmdzICRkYWVtb25TZXR0aW5ncwoKICAgIFJlZ2lzdGVyLVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICREYWVtb25UYXNrTmFtZSAtSW5wdXRPYmplY3QgJGRhZW1vblRhc2sgLUZvcmNlIHwgT3V0LU51bGwKCiAgICBXcml0ZS1Mb2cgIlJlZ2lzdGVyaW5nL3VwZGF0aW5nIHNjaGVkdWxlZCB0YXNrICckVXBncmFkZVRhc2tOYW1lJy4iCiAgICAkdXBncmFkZUFyZ3MgPSAiLU5vUHJvZmlsZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtRmlsZSBgIiRMb2NhbFNjcmlwdFBhdGhgIiAtTW9kZSBVcGdyYWRlQWxsIgogICAgJHVwZ3JhZGVBY3Rpb24gPSBOZXctU2NoZWR1bGVkVGFza0FjdGlvbiAtRXhlY3V0ZSAkUG93ZXJTaGVsbEV4ZSAtQXJndW1lbnQgJHVwZ3JhZGVBcmdzCiAgICAkdXBncmFkZVRyaWdnZXIgPSBOZXctU2NoZWR1bGVkVGFza1RyaWdnZXIgYAogICAgICAgIC1PbmNlIGAKICAgICAgICAtQXQgKChHZXQtRGF0ZSkuQWRkTWludXRlcygyKSkgYAogICAgICAgIC1SZXBldGl0aW9uSW50ZXJ2YWwgKE5ldy1UaW1lU3BhbiAtSG91cnMgMikgYAogICAgICAgIC1SZXBldGl0aW9uRHVyYXRpb24gKE5ldy1UaW1lU3BhbiAtRGF5cyAzNjUwKQogICAgJHVwZ3JhZGVTZXR0aW5ncyA9IE5ldy1TY2hlZHVsZWRUYXNrU2V0dGluZ3NTZXQgYAogICAgICAgIC1BbGxvd1N0YXJ0SWZPbkJhdHRlcmllcyBgCiAgICAgICAgLURvbnRTdG9wSWZHb2luZ09uQmF0dGVyaWVzIGAKICAgICAgICAtU3RhcnRXaGVuQXZhaWxhYmxlIGAKICAgICAgICAtTXVsdGlwbGVJbnN0YW5jZXMgSWdub3JlTmV3IGAKICAgICAgICAtRXhlY3V0aW9uVGltZUxpbWl0IChOZXctVGltZVNwYW4gLUhvdXJzIDIpCgogICAgJHVwZ3JhZGVUYXNrID0gTmV3LVNjaGVkdWxlZFRhc2sgYAogICAgICAgIC1BY3Rpb24gJHVwZ3JhZGVBY3Rpb24gYAogICAgICAgIC1UcmlnZ2VyICR1cGdyYWRlVHJpZ2dlciBgCiAgICAgICAgLVByaW5jaXBhbCAkcHJpbmNpcGFsIGAKICAgICAgICAtU2V0dGluZ3MgJHVwZ3JhZGVTZXR0aW5ncwoKICAgIFJlZ2lzdGVyLVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICRVcGdyYWRlVGFza05hbWUgLUlucHV0T2JqZWN0ICR1cGdyYWRlVGFzayAtRm9yY2UgfCBPdXQtTnVsbAoKICAgIHRyeSB7CiAgICAgICAgU3RhcnQtU2NoZWR1bGVkVGFzayAtVGFza05hbWUgJERhZW1vblRhc2tOYW1lCiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3Qgc3RhcnQgZGFlbW9uIHRhc2sgJyREYWVtb25UYXNrTmFtZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVdpbmdldEluc3RhbGwgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFdpbmdldFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhY2thZ2VJZCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgICRhcmd1bWVudHMgPSBAKAogICAgICAgICdpbnN0YWxsJwogICAgICAgICctLWlkJywgJFBhY2thZ2VJZAogICAgICAgICctLWV4YWN0JwogICAgICAgICctLXNjb3BlJywgJ21hY2hpbmUnCiAgICAgICAgJy0tc2lsZW50JwogICAgICAgICctLWFjY2VwdC1wYWNrYWdlLWFncmVlbWVudHMnCiAgICAgICAgJy0tYWNjZXB0LXNvdXJjZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWRpc2FibGUtaW50ZXJhY3Rpdml0eScKICAgICkKCiAgICBXcml0ZS1Mb2cgIkV4ZWN1dGluZzogYCIkV2luZ2V0UGF0aGAiICQoJGFyZ3VtZW50cyAtam9pbiAnICcpIgogICAgaWYgKCRRdWV1ZUl0ZW1JZCkgewogICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnSW5zdGFsbCcgLVN0YWdlVGV4dCAnSW5zdGFsbGF0aW9uIGzDpHVmdC4uLicgLUlzSW5kZXRlcm1pbmF0ZTokdHJ1ZQogICAgfQoKICAgICRvdXRwdXRMaW5lcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbc3RyaW5nXScKICAgICYgJFdpbmdldFBhdGggQGFyZ3VtZW50cyAyPiYxIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICRsaW5lID0gW3N0cmluZ10kXwogICAgICAgIFt2b2lkXSRvdXRwdXRMaW5lcy5BZGQoJGxpbmUpCiAgICAgICAgaWYgKCRsaW5lLlRyaW0oKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIndpbmdldDogJGxpbmUiCiAgICAgICAgICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICAgICAgICAgICRwZXJjZW50ID0gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIC1MaW5lICRsaW5lCiAgICAgICAgICAgICAgICBpZiAoJG51bGwgLW5lICRwZXJjZW50KSB7CiAgICAgICAgICAgICAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdEb3dubG9hZCcgLVN0YWdlVGV4dCAoIkRvd25sb2FkIGzDpHVmdC4uLiB7MH0lIiAtZiAkcGVyY2VudCkgLVByb2dyZXNzUGVyY2VudCAkcGVyY2VudCAtSXNJbmRldGVybWluYXRlOiRmYWxzZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgJGV4aXRDb2RlID0gJExBU1RFWElUQ09ERQoKICAgIHJldHVybiAkZXhpdENvZGUKfQoKZnVuY3Rpb24gSW52b2tlLVdpbmdldFVuaW5zdGFsbCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kV2luZ2V0UGF0aCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGFja2FnZUlkLAogICAgICAgIFtzdHJpbmddJFF1ZXVlSXRlbUlkCiAgICApCgogICAgJGFyZ3VtZW50cyA9IEAoCiAgICAgICAgJ3VuaW5zdGFsbCcKICAgICAgICAnLS1pZCcsICRQYWNrYWdlSWQKICAgICAgICAnLS1leGFjdCcKICAgICAgICAnLS1zY29wZScsICdtYWNoaW5lJwogICAgICAgICctLXNpbGVudCcKICAgICAgICAnLS1hY2NlcHQtc291cmNlLWFncmVlbWVudHMnCiAgICAgICAgJy0tZGlzYWJsZS1pbnRlcmFjdGl2aXR5JwogICAgKQoKICAgIFdyaXRlLUxvZyAiRXhlY3V0aW5nOiBgIiRXaW5nZXRQYXRoYCIgJCgkYXJndW1lbnRzIC1qb2luICcgJykiCiAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdVbmluc3RhbGwnIC1TdGFnZVRleHQgJ0RlaW5zdGFsbGF0aW9uIGzDpHVmdC4uLicgLUlzSW5kZXRlcm1pbmF0ZTokdHJ1ZQogICAgfQoKICAgICRvdXRwdXRMaW5lcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbc3RyaW5nXScKICAgICYgJFdpbmdldFBhdGggQGFyZ3VtZW50cyAyPiYxIHwgRm9yRWFjaC1PYmplY3QgewogICAgICAgICRsaW5lID0gW3N0cmluZ10kXwogICAgICAgIFt2b2lkXSRvdXRwdXRMaW5lcy5BZGQoJGxpbmUpCiAgICAgICAgaWYgKCRsaW5lLlRyaW0oKSkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIndpbmdldDogJGxpbmUiCiAgICAgICAgICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICAgICAgICAgICRwZXJjZW50ID0gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIC1MaW5lICRsaW5lCiAgICAgICAgICAgICAgICBpZiAoJG51bGwgLW5lICRwZXJjZW50KSB7CiAgICAgICAgICAgICAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdVbmluc3RhbGwnIC1TdGFnZVRleHQgKCJEZWluc3RhbGxhdGlvbiBsw6R1ZnQuLi4gezB9JSIgLWYgJHBlcmNlbnQpIC1Qcm9ncmVzc1BlcmNlbnQgJHBlcmNlbnQgLUlzSW5kZXRlcm1pbmF0ZTokZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICByZXR1cm4gJGV4aXRDb2RlCn0KCmZ1bmN0aW9uIEludm9rZS1XaW5nZXRVcGdyYWRlQWxsIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoLAogICAgICAgIFtzdHJpbmddJFF1ZXVlSXRlbUlkCiAgICApCgogICAgJGFyZ3VtZW50cyA9IEAoCiAgICAgICAgJ3VwZ3JhZGUnCiAgICAgICAgJy0tYWxsJwogICAgICAgICctLXNjb3BlJywgJ21hY2hpbmUnCiAgICAgICAgJy0tc2lsZW50JwogICAgICAgICctLWFjY2VwdC1wYWNrYWdlLWFncmVlbWVudHMnCiAgICAgICAgJy0tYWNjZXB0LXNvdXJjZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWRpc2FibGUtaW50ZXJhY3Rpdml0eScKICAgICkKCiAgICBXcml0ZS1Mb2cgIkV4ZWN1dGluZyAyLWhvdXIgdXBncmFkZTogYCIkV2luZ2V0UGF0aGAiICQoJGFyZ3VtZW50cyAtam9pbiAnICcpIgogICAgaWYgKCRRdWV1ZUl0ZW1JZCkgewogICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVXBncmFkZScgLVN0YWdlVGV4dCAnVXBkYXRlcyBsYXVmZW4uLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KCiAgICAkb3V0cHV0TGluZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCiAgICAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAkbGluZSA9IFtzdHJpbmddJF8KICAgICAgICBbdm9pZF0kb3V0cHV0TGluZXMuQWRkKCRsaW5lKQogICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgdXBncmFkZTogJGxpbmUiCiAgICAgICAgICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICAgICAgICAgICRwZXJjZW50ID0gR2V0LVByb2dyZXNzUGVyY2VudEZyb21MaW5lIC1MaW5lICRsaW5lCiAgICAgICAgICAgICAgICBpZiAoJG51bGwgLW5lICRwZXJjZW50KSB7CiAgICAgICAgICAgICAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdVcGdyYWRlJyAtU3RhZ2VUZXh0ICgiVXBkYXRlcyBsYXVmZW4uLi4gezB9JSIgLWYgJHBlcmNlbnQpIC1Qcm9ncmVzc1BlcmNlbnQgJHBlcmNlbnQgLUlzSW5kZXRlcm1pbmF0ZTokZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICByZXR1cm4gJGV4aXRDb2RlCn0KCmZ1bmN0aW9uIFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoLAogICAgICAgIFtzdHJpbmddJFF1ZXVlSXRlbUlkCiAgICApCgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgoKICAgICR0ZW1wUm9vdCA9IGlmICgkZW52OlRFTVApIHsgJGVudjpURU1QIH0gZWxzZWlmICgkZW52OlRNUCkgeyAkZW52OlRNUCB9IGVsc2UgeyAkQmFzZURpciB9CiAgICAkdGVtcEZpbGUgPSBKb2luLVBhdGggJHRlbXBSb290ICgic2VsZnNlcnZpY2Utd2luZ2V0LWV4cG9ydC17MH0uanNvbiIgLWYgW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKSkKICAgICRzbmFwc2hvdFRlbXBGaWxlID0gSm9pbi1QYXRoICRCYXNlRGlyICgiSW5zdGFsbGVkLVBhY2thZ2VzLXswfS5qc29uLnRtcCIgLWYgW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKSkKCiAgICAkYXJndW1lbnRzID0gQCgKICAgICAgICAnZXhwb3J0JwogICAgICAgICctLW91dHB1dCcsICR0ZW1wRmlsZQogICAgICAgICctLWFjY2VwdC1zb3VyY2UtYWdyZWVtZW50cycKICAgICAgICAnLS1kaXNhYmxlLWludGVyYWN0aXZpdHknCiAgICApCgogICAgV3JpdGUtTG9nICdSZWZyZXNoaW5nIGluc3RhbGxlZCBwYWNrYWdlIHNuYXBzaG90LicKICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICBVcGRhdGUtUXVldWVJdGVtUHJvZ3Jlc3MgLUlkICRRdWV1ZUl0ZW1JZCAtU3RhZ2UgJ1NuYXBzaG90JyAtU3RhZ2VUZXh0ICdJbnN0YWxsYXRpb25zZGF0ZW4gd2VyZGVuIGFrdHVhbGlzaWVydC4uLicgLUlzSW5kZXRlcm1pbmF0ZTokdHJ1ZQogICAgfQogICAgJG91dHB1dCA9ICYgJFdpbmdldFBhdGggQGFyZ3VtZW50cyAyPiYxIHwgT3V0LVN0cmluZwogICAgJGV4aXRDb2RlID0gJExBU1RFWElUQ09ERQoKICAgIGlmICgkb3V0cHV0KSB7CiAgICAgICAgZm9yZWFjaCAoJGxpbmUgaW4gKCRvdXRwdXQgLXNwbGl0ICJgcj9gbiIpKSB7CiAgICAgICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAid2luZ2V0IGV4cG9ydDogJGxpbmUiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCRleGl0Q29kZSAtbmUgMCkgewogICAgICAgIFdyaXRlLUxvZyAid2luZ2V0IGV4cG9ydCBmYWlsZWQgd2l0aCBjb2RlICRleGl0Q29kZTsgc25hcHNob3Qgd2FzIG5vdCB1cGRhdGVkLiIgJ1dBUk4nCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlKSB7CiAgICAgICAgICAgIFJlbW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgfQogICAgICAgIHJldHVybiAkZmFsc2UKICAgIH0KCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUpKSB7CiAgICAgICAgV3JpdGUtTG9nICd3aW5nZXQgZXhwb3J0IGRpZCBub3QgcHJvZHVjZSBhbiBvdXRwdXQgZmlsZTsgc25hcHNob3Qgd2FzIG5vdCB1cGRhdGVkLicgJ1dBUk4nCiAgICAgICAgcmV0dXJuICRmYWxzZQogICAgfQoKICAgIHRyeSB7CiAgICAgICAgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUgLVJhdyAtRW5jb2RpbmcgVVRGOAogICAgICAgICRleHBvcnQgPSAkcmF3IHwgQ29udmVydEZyb20tSnNvbgoKICAgICAgICAkcGFja2FnZUlkcyA9IEAoKQogICAgICAgIGZvcmVhY2ggKCRzb3VyY2UgaW4gQCgkZXhwb3J0LlNvdXJjZXMpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRwa2cgaW4gQCgkc291cmNlLlBhY2thZ2VzKSkgewogICAgICAgICAgICAgICAgaWYgKCRwa2cuUGFja2FnZUlkZW50aWZpZXIpIHsKICAgICAgICAgICAgICAgICAgICAkcGFja2FnZUlkcyArPSBbc3RyaW5nXSRwa2cuUGFja2FnZUlkZW50aWZpZXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2VpZiAoJHBrZy5QYWNrYWdlSWQpIHsKICAgICAgICAgICAgICAgICAgICAkcGFja2FnZUlkcyArPSBbc3RyaW5nXSRwa2cuUGFja2FnZUlkCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRwYWNrYWdlSWRzID0gJHBhY2thZ2VJZHMgfAogICAgICAgICAgICBXaGVyZS1PYmplY3QgeyAtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJF8pIH0gfAogICAgICAgICAgICBGb3JFYWNoLU9iamVjdCB7ICRfLlRyaW0oKSB9IHwKICAgICAgICAgICAgU29ydC1PYmplY3QgLVVuaXF1ZQoKICAgICAgICAkc25hcHNob3QgPSBbb3JkZXJlZF1AewogICAgICAgICAgICBHZW5lcmF0ZWRBdCAgICAgICAgICA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgICAgICBJbnN0YWxsZWRQYWNrYWdlSWRzICA9IEAoJHBhY2thZ2VJZHMpCiAgICAgICAgfQoKICAgICAgICAkc25hcHNob3QgfCBDb252ZXJ0VG8tSnNvbiAtRGVwdGggNSB8IFNldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkc25hcHNob3RUZW1wRmlsZSAtRW5jb2RpbmcgVVRGOAogICAgICAgIE1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUgLURlc3RpbmF0aW9uICRJbnN0YWxsZWRQYWNrYWdlc1BhdGggLUZvcmNlCiAgICAgICAgV3JpdGUtTG9nICJJbnN0YWxsZWQgcGFja2FnZSBzbmFwc2hvdCB3cml0dGVuIHRvICckSW5zdGFsbGVkUGFja2FnZXNQYXRoJyAoY291bnQ9JChAKCRwYWNrYWdlSWRzKS5Db3VudCkpLiIKICAgICAgICByZXR1cm4gJHRydWUKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byB3cml0ZSBpbnN0YWxsZWQgcGFja2FnZSBzbmFwc2hvdDogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIHJldHVybiAkZmFsc2UKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICR0ZW1wRmlsZSkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkc25hcHNob3RUZW1wRmlsZSkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBHZXQtSW5zdGFsbGVkUGFja2FnZUlkU2V0IHsKICAgICRzZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJEluc3RhbGxlZFBhY2thZ2VzUGF0aCkpIHsKICAgICAgICByZXR1cm4gJHNldAogICAgfQoKICAgIHRyeSB7CiAgICAgICAgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1SYXcgLUVuY29kaW5nIFVURjgKICAgICAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkcmF3KSkgewogICAgICAgICAgICByZXR1cm4gJHNldAogICAgICAgIH0KCiAgICAgICAgJHNuYXBzaG90ID0gJHJhdyB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBmb3JlYWNoICgkaWQgaW4gQCgkc25hcHNob3QuSW5zdGFsbGVkUGFja2FnZUlkcykpIHsKICAgICAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShbc3RyaW5nXSRpZCkpIHsKICAgICAgICAgICAgICAgIFt2b2lkXSRzZXQuQWRkKChbc3RyaW5nXSRpZCkuVHJpbSgpKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiRmFpbGVkIHRvIHJlYWQgaW5zdGFsbGVkIHBhY2thZ2Ugc25hcHNob3Q6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgIH0KCiAgICByZXR1cm4gJHNldAp9CgpmdW5jdGlvbiBJbnZva2UtUmVxdWlyZWRTb2Z0d2FyZVBvbGljeSB7CiAgICBwYXJhbShbc3RyaW5nXSRXaW5nZXRQYXRoKQoKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7CiAgICAgICAgV3JpdGUtTG9nICdSZXF1aXJlZCBzb2Z0d2FyZSBwb2xpY3kgc2tpcHBlZCBiZWNhdXNlIFNvZnR3YXJla2F0YWxvZyBwb2xpY3kgaXMgZGlzYWJsZWQgb3Igbm90IGNvbmZpZ3VyZWQuJyAnV0FSTicKICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7IEluc3RhbGxlZCA9IDA7IEZhaWxlZCA9IDA7IFNraXBwZWQgPSAwIH0KICAgIH0KCiAgICBpZiAoLW5vdCAoVGVzdC1SZXF1aXJlZEVuZm9yY2VtZW50RW5hYmxlZCkpIHsKICAgICAgICBXcml0ZS1Mb2cgJ1JlcXVpcmVkIHNvZnR3YXJlIGVuZm9yY2VtZW50IGlzIGRpc2FibGVkIGJ5IHBvbGljeS4nCiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AeyBJbnN0YWxsZWQgPSAwOyBGYWlsZWQgPSAwOyBTa2lwcGVkID0gMCB9CiAgICB9CgogICAgJHJlcXVpcmVkQWxpYXNlcyA9IEAoR2V0LVJlcXVpcmVkQWxpYXNlcykKICAgIGlmICgkcmVxdWlyZWRBbGlhc2VzLkNvdW50IC1sdCAxKSB7CiAgICAgICAgV3JpdGUtTG9nICdObyByZXF1aXJlZCBzb2Z0d2FyZSBjb25maWd1cmVkIGJ5IHBvbGljeS4nCiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AeyBJbnN0YWxsZWQgPSAwOyBGYWlsZWQgPSAwOyBTa2lwcGVkID0gMCB9CiAgICB9CgogICAgaWYgKCRXaW5nZXRQYXRoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1UaW1lb3V0U2Vjb25kcyAyIC1TY3JpcHRCbG9jayB7CiAgICAgICAgICAgICAgICAkbnVsbCA9IFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IC1XaW5nZXRQYXRoICRXaW5nZXRQYXRoCiAgICAgICAgICAgIH0gfCBPdXQtTnVsbAogICAgICAgIH0KICAgICAgICBjYXRjaCB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiQ291bGQgbm90IHJlZnJlc2ggc25hcHNob3QgYmVmb3JlIHJlcXVpcmVkIHF1ZXVlaW5nOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICAgICAgfQogICAgfQoKICAgICRxdWV1ZWQgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAogICAgaWYgKCRxdWV1ZWQgLWd0IDApIHsKICAgICAgICBTdGFydC1RdWV1ZVdvcmtlcgogICAgfQoKICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsgSW5zdGFsbGVkID0gMDsgRmFpbGVkID0gMDsgU2tpcHBlZCA9IDA7IFF1ZXVlZCA9ICRxdWV1ZWQgfQp9CgpmdW5jdGlvbiBOZXctQ2F0YWxvZ1BpcGVTZWN1cml0eSB7CiAgICAkcGlwZVNlY3VyaXR5ID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuUGlwZVNlY3VyaXR5CgogICAgJHNpZFN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTE4JykKICAgICRzaWRBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0zMi01NDQnKQogICAgJHNpZFVzZXJzID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ1JykKCiAgICAkcnVsZVN5c3RlbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSdWxlKAogICAgICAgICRzaWRTeXN0ZW0sCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUmlnaHRzXTo6RnVsbENvbnRyb2wsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlXTo6QWxsb3cKICAgICkKICAgICRydWxlQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuUGlwZUFjY2Vzc1J1bGUoCiAgICAgICAgJHNpZEFkbWlucywKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSaWdodHNdOjpGdWxsQ29udHJvbCwKICAgICAgICBbU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuQWNjZXNzQ29udHJvbFR5cGVdOjpBbGxvdwogICAgKQogICAgJHJ1bGVVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSdWxlKAogICAgICAgICRzaWRVc2VycywKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSaWdodHNdOjpSZWFkV3JpdGUsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlXTo6QWxsb3cKICAgICkKCiAgICAkbnVsbCA9ICRwaXBlU2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgkcnVsZVN5c3RlbSkKICAgICRudWxsID0gJHBpcGVTZWN1cml0eS5BZGRBY2Nlc3NSdWxlKCRydWxlQWRtaW5zKQogICAgJG51bGwgPSAkcGlwZVNlY3VyaXR5LkFkZEFjY2Vzc1J1bGUoJHJ1bGVVc2VycykKCiAgICByZXR1cm4gJHBpcGVTZWN1cml0eQp9CgpmdW5jdGlvbiBOZXctQ2F0YWxvZ1BpcGVTZXJ2ZXIgewogICAgJHBpcGVTZWN1cml0eSA9IE5ldy1DYXRhbG9nUGlwZVNlY3VyaXR5CiAgICByZXR1cm4gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuTmFtZWRQaXBlU2VydmVyU3RyZWFtIC1Bcmd1bWVudExpc3QgQCgKICAgICAgICAkUGlwZU5hbWUsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlRGlyZWN0aW9uXTo6SW5PdXQsCiAgICAgICAgMSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVUcmFuc21pc3Npb25Nb2RlXTo6Qnl0ZSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVPcHRpb25zXTo6Tm9uZSwKICAgICAgICA0MDk2LAogICAgICAgIDQwOTYsCiAgICAgICAgJHBpcGVTZWN1cml0eQogICAgKQp9CgpmdW5jdGlvbiBHZXQtUGlwZUNsaWVudElkZW50aXR5IHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bU3lzdGVtLklPLlBpcGVzLk5hbWVkUGlwZVNlcnZlclN0cmVhbV0kUGlwZSkKCiAgICAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUgPSAkbnVsbAogICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlTaWQgPSAkbnVsbAoKICAgIHRyeSB7CiAgICAgICAgJFBpcGUuUnVuQXNDbGllbnQoW1N5c3RlbS5JTy5QaXBlcy5QaXBlU3RyZWFtSW1wZXJzb25hdGlvbldvcmtlcl17CiAgICAgICAgICAgICRpZGVudGl0eSA9IFtTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLldpbmRvd3NJZGVudGl0eV06OkdldEN1cnJlbnQoKQogICAgICAgICAgICAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUgPSAkaWRlbnRpdHkuTmFtZQogICAgICAgICAgICBpZiAoJGlkZW50aXR5LlVzZXIpIHsKICAgICAgICAgICAgICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5U2lkID0gJGlkZW50aXR5LlVzZXIuVmFsdWUKICAgICAgICAgICAgfQogICAgICAgIH0pCiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJFBpcGUuR2V0SW1wZXJzb25hdGlvblVzZXJOYW1lKCkKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgIH0KICAgIH0KCiAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUpKSB7CiAgICAgICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJ1Vua25vd24nCiAgICB9CgogICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgIE5hbWUgPSAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eU5hbWUKICAgICAgICBTaWQgID0gJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlTaWQKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLUNhdGFsb2dEYWVtb25Db21tYW5kIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV0kUmVxdWVzdCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldJENsaWVudElkZW50aXR5CiAgICApCgogICAgaWYgKC1ub3QgJENsaWVudElkZW50aXR5IC1vciBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRDbGllbnRJZGVudGl0eS5OYW1lKSAtb3IgJENsaWVudElkZW50aXR5Lk5hbWUgLWVxICdVbmtub3duJykgewogICAgICAgIHRocm93ICdOYW1lZCBwaXBlIGNsaWVudCBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZC4nCiAgICB9CgogICAgJGNvbW1hbmQgPSAkbnVsbAogICAgJGNvbW1hbmRQcm9wZXJ0eSA9ICRSZXF1ZXN0LlBTT2JqZWN0LlByb3BlcnRpZXNbJ0NvbW1hbmQnXQogICAgJGFjdGlvblByb3BlcnR5ID0gJFJlcXVlc3QuUFNPYmplY3QuUHJvcGVydGllc1snQWN0aW9uJ10KICAgIGlmICgkY29tbWFuZFByb3BlcnR5IC1hbmQgJGNvbW1hbmRQcm9wZXJ0eS5WYWx1ZSkgewogICAgICAgICRjb21tYW5kID0gW3N0cmluZ10kY29tbWFuZFByb3BlcnR5LlZhbHVlCiAgICB9CiAgICBlbHNlaWYgKCRhY3Rpb25Qcm9wZXJ0eSAtYW5kICRhY3Rpb25Qcm9wZXJ0eS5WYWx1ZSkgewogICAgICAgICRjb21tYW5kID0gW3N0cmluZ10kYWN0aW9uUHJvcGVydHkuVmFsdWUKICAgIH0KCiAgICBpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkY29tbWFuZCkpIHsKICAgICAgICB0aHJvdyAnTWlzc2luZyBjb21tYW5kLicKICAgIH0KCiAgICAkY29tbWFuZCA9ICRjb21tYW5kLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkKCiAgICBzd2l0Y2ggKCRjb21tYW5kKSB7CiAgICAgICAgeyAkXyAtaW4gQCgnZ2V0Y2F0YWxvZycsJ2dldHN0YXRlJykgfSB7CiAgICAgICAgICAgICRyZXF1aXJlZFF1ZXVlZCA9IEVuc3VyZS1SZXF1aXJlZFNvZnR3YXJlUXVldWVkCiAgICAgICAgICAgIGlmICgkcmVxdWlyZWRRdWV1ZWQgLWd0IDApIHsKICAgICAgICAgICAgICAgIFN0YXJ0LVF1ZXVlV29ya2VyCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNhdGFsb2cgPSBAKEdldC1BcHBDYXRhbG9nT2JqZWN0cyB8IFNvcnQtT2JqZWN0IERpc3BsYXlOYW1lKQogICAgICAgICAgICAkcmVxdWlyZWRBbGlhc2VzID0gQChHZXQtUmVxdWlyZWRBbGlhc2VzKQogICAgICAgICAgICAkcmVxdWlyZWRTZXQgPSBHZXQtUmVxdWlyZWRBbGlhc1NldAogICAgICAgICAgICAkaW5zdGFsbGVkSWRzID0gQCgoR2V0LUluc3RhbGxlZFBhY2thZ2VJZFNldCkgfCBGb3JFYWNoLU9iamVjdCB7IFtzdHJpbmddJF8gfSkKICAgICAgICAgICAgJHF1ZXVlU3RhdGUgPSBHZXQtUXVldWVTdGF0ZVNuYXBzaG90CiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgICAgICA9ICR0cnVlCiAgICAgICAgICAgICAgICBDb21tYW5kICAgICAgICAgICAgPSAkY29tbWFuZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkICAgICA9ICRDbGllbnRJZGVudGl0eS5TaWQKICAgICAgICAgICAgICAgIENhdGFsb2cgICAgICAgICAgICA9ICRjYXRhbG9nCiAgICAgICAgICAgICAgICBSZXF1aXJlZEFsaWFzZXMgICAgPSAkcmVxdWlyZWRBbGlhc2VzCiAgICAgICAgICAgICAgICBRdWV1ZSAgICAgICAgICAgICAgPSBAKCRxdWV1ZVN0YXRlLlF1ZXVlKQogICAgICAgICAgICAgICAgQ3VycmVudCAgICAgICAgICAgID0gJHF1ZXVlU3RhdGUuQ3VycmVudAogICAgICAgICAgICAgICAgVmVyc2lvbiAgICAgICAgICAgID0gJHF1ZXVlU3RhdGUuVmVyc2lvbgogICAgICAgICAgICAgICAgSW5zdGFsbGVkUGFja2FnZUlkcyA9ICRpbnN0YWxsZWRJZHMKICAgICAgICAgICAgICAgIEFsbG93VXNlckluc3RhbGxzICA9IChUZXN0LVVzZXJJbnN0YWxsc0FsbG93ZWQpCiAgICAgICAgICAgICAgICBBbGxvd1VzZXJVbmluc3RhbGwgPSAoVGVzdC1Vc2VyVW5pbnN0YWxsQWxsb3dlZCkKICAgICAgICAgICAgICAgIEVuZm9yY2VSZXF1aXJlZCAgICA9IChUZXN0LVJlcXVpcmVkRW5mb3JjZW1lbnRFbmFibGVkKQogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgID0gJ0thdGFsb2cgZ2VsYWRlbi4nCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICdhcHBseXBvbGljeScgewogICAgICAgICAgICBXcml0ZS1Mb2cgIkF1dGhlbnRpY2F0ZWQgcG9saWN5IGFwcGx5IHJlcXVlc3RlZCBieSB1c2VyPSckKCRDbGllbnRJZGVudGl0eS5OYW1lKScgc2lkPSckKCRDbGllbnRJZGVudGl0eS5TaWQpJyIKICAgICAgICAgICAgU3RhcnQtU29mdHdhcmVrYXRhbG9nV29ya2VyIC1Xb3JrZXJNb2RlIEFwcGx5UG9saWN5CiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIENvbW1hbmQgICAgICAgID0gJGNvbW1hbmQKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5ICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkID0gJENsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgPSAnUG9saWN5YW53ZW5kdW5nIGdlc3RhcnRldC4nCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHsgJF8gLWluIEAoJ2luc3RhbGwnLCd1bmluc3RhbGwnKSB9IHsKICAgICAgICAgICAgaWYgKCRjb21tYW5kIC1lcSAnaW5zdGFsbCcgLWFuZCAtbm90IChUZXN0LVVzZXJJbnN0YWxsc0FsbG93ZWQpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnQmVudXR6ZXJpbnN0YWxsYXRpb25lbiBzaW5kIHBlciBSaWNodGxpbmllIGRlYWt0aXZpZXJ0LicKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRjb21tYW5kIC1lcSAndW5pbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlclVuaW5zdGFsbEFsbG93ZWQpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnQmVudXR6ZXJkZWluc3RhbGxhdGlvbmVuIHNpbmQgcGVyIFJpY2h0bGluaWUgZGVha3RpdmllcnQuJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYXBwQWxpYXNQcm9wZXJ0eSA9ICRSZXF1ZXN0LlBTT2JqZWN0LlByb3BlcnRpZXNbJ0FwcEFsaWFzJ10KICAgICAgICAgICAgaWYgKC1ub3QgJGFwcEFsaWFzUHJvcGVydHkgLW9yIFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ10kYXBwQWxpYXNQcm9wZXJ0eS5WYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHRocm93ICdNaXNzaW5nIEFwcEFsaWFzLicKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFsaWFzID0gKFtzdHJpbmddJGFwcEFsaWFzUHJvcGVydHkuVmFsdWUpLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkKICAgICAgICAgICAgJHBhY2thZ2VJZCA9IEdldC1QYWNrYWdlSWRCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgICAgICAgICAgaWYgKC1ub3QgJHBhY2thZ2VJZCkgewogICAgICAgICAgICAgICAgdGhyb3cgIkFsaWFzICckYWxpYXMnIGlzIG5vdCBpbiB0aGUgYWxsb3dsaXN0LiIKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlcXVpcmVkU2V0ID0gR2V0LVJlcXVpcmVkQWxpYXNTZXQKICAgICAgICAgICAgaWYgKCRjb21tYW5kIC1lcSAndW5pbnN0YWxsJyAtYW5kICRyZXF1aXJlZFNldC5Db250YWlucygkYWxpYXMpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgZGVpbnN0YWxsaWVydCB3ZXJkZW4uJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYWN0aW9uVGV4dCA9IGlmICgkY29tbWFuZCAtZXEgJ3VuaW5zdGFsbCcpIHsgJ3VuaW5zdGFsbCcgfSBlbHNlIHsgJ2luc3RhbGwnIH0KICAgICAgICAgICAgV3JpdGUtTG9nICJBdXRoZW50aWNhdGVkIHJlcXVlc3Q6IGFjdGlvbj0kYWN0aW9uVGV4dCBhbGlhcz0nJGFsaWFzJyBwYWNrYWdlPSckcGFja2FnZUlkJyB1c2VyPSckKCRDbGllbnRJZGVudGl0eS5OYW1lKScgc2lkPSckKCRDbGllbnRJZGVudGl0eS5TaWQpJyIKCiAgICAgICAgICAgICRxdWV1ZVJlc3VsdCA9IEFkZC1Tb2Z0d2FyZVJlcXVlc3RUb1F1ZXVlIC1BY3Rpb24gJGNvbW1hbmQgLUFsaWFzICRhbGlhcyAtUmVxdWVzdGVkQnkgJENsaWVudElkZW50aXR5Lk5hbWUgLVJlcXVlc3RlZEJ5U2lkICRDbGllbnRJZGVudGl0eS5TaWQgLVNvdXJjZSBVc2VyCiAgICAgICAgICAgIFN0YXJ0LVF1ZXVlV29ya2VyCgogICAgICAgICAgICAkdmVyYiA9IGlmICgkY29tbWFuZCAtZXEgJ3VuaW5zdGFsbCcpIHsgJ0RlaW5zdGFsbGF0aW9uJyB9IGVsc2UgeyAnSW5zdGFsbGF0aW9uJyB9CiAgICAgICAgICAgICRtZXNzYWdlID0gaWYgKCRxdWV1ZVJlc3VsdC5BZGRlZCkgeyAiJHZlcmIgZWluZ2VyZWlodDogJGFsaWFzIiB9IGVsc2UgeyAiJHZlcmIgaXN0IGJlcmVpdHMgaW4gZGVyIFdhcnRlc2NobGFuZ2U6ICRhbGlhcyIgfQogICAgICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgQ29tbWFuZCAgICAgICAgID0gJGNvbW1hbmQKICAgICAgICAgICAgICAgIEFwcEFsaWFzICAgICAgICA9ICRhbGlhcwogICAgICAgICAgICAgICAgUGFja2FnZUlkICAgICAgID0gJHBhY2thZ2VJZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkICA9ICRDbGllbnRJZGVudGl0eS5TaWQKICAgICAgICAgICAgICAgIFF1ZXVlSWQgICAgICAgICA9ICRxdWV1ZVJlc3VsdC5JdGVtLklkCiAgICAgICAgICAgICAgICBRdWV1ZWQgICAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgID0gJG1lc3NhZ2UKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeyAkXyAtaW4gQCgncmVmcmVzaHN0YXR1cycsJ2dldHN0YXR1cycpIH0gewogICAgICAgICAgICBXcml0ZS1Mb2cgIkF1dGhlbnRpY2F0ZWQgc3RhdHVzIHJlZnJlc2ggcmVxdWVzdGVkIGJ5IHVzZXI9JyQoJENsaWVudElkZW50aXR5Lk5hbWUpJyBzaWQ9JyQoJENsaWVudElkZW50aXR5LlNpZCknIgogICAgICAgICAgICAkd2luZ2V0UGF0aCA9IEVuc3VyZS1XaW5nZXRBdmFpbGFibGUKICAgICAgICAgICAgaWYgKC1ub3QgJHdpbmdldFBhdGgpIHsKICAgICAgICAgICAgICAgIHRocm93ICd3aW5nZXQgaXMgdW5hdmFpbGFibGUuJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzdWx0ID0gSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1UaW1lb3V0U2Vjb25kcyAyIC1TY3JpcHRCbG9jayB7CiAgICAgICAgICAgICAgICAkc25hcHNob3RVcGRhdGVkID0gVXBkYXRlLUluc3RhbGxlZFBhY2thZ2VzU25hcHNob3QgLVdpbmdldFBhdGggJHdpbmdldFBhdGgKICAgICAgICAgICAgICAgIFtwc2N1c3RvbW9iamVjdF1AeyBTbmFwc2hvdFVwZGF0ZWQgPSBbYm9vbF0kc25hcHNob3RVcGRhdGVkIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0ID0gQCgkcmVzdWx0KVstMV0KCiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgICA9IFtib29sXSRyZXN1bHQuU25hcHNob3RVcGRhdGVkCiAgICAgICAgICAgICAgICBDb21tYW5kICAgICAgICAgPSAkY29tbWFuZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgID0gJENsaWVudElkZW50aXR5Lk5hbWUKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkICA9ICRDbGllbnRJZGVudGl0eS5TaWQKICAgICAgICAgICAgICAgIFNuYXBzaG90VXBkYXRlZCA9IFtib29sXSRyZXN1bHQuU25hcHNob3RVcGRhdGVkCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgICAgICAgPSAnSW5zdGFsbGF0aW9uc2RhdGVuIGFrdHVhbGlzaWVydC4nCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICB0aHJvdyAiVW5zdXBwb3J0ZWQgY29tbWFuZCAnJGNvbW1hbmQnLiIKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIFN0YXJ0LUNhdGFsb2dEYWVtb24gewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBzdGFydGluZyBvbiAnXFwuXHBpcGVcJFBpcGVOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBTdGFydC1Tb2Z0d2FyZWthdGFsb2dXb3JrZXIgLVdvcmtlck1vZGUgQXBwbHlQb2xpY3kKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCBzdGFydCBpbml0aWFsIHJlcXVpcmVkIHNvZnR3YXJlIGVuZm9yY2VtZW50IHdvcmtlcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgfQoKICAgIHdoaWxlICgkdHJ1ZSkgewogICAgICAgICRwaXBlID0gJG51bGwKICAgICAgICB0cnkgewogICAgICAgICAgICAkcGlwZSA9IE5ldy1DYXRhbG9nUGlwZVNlcnZlcgogICAgICAgICAgICAkcGlwZS5XYWl0Rm9yQ29ubmVjdGlvbigpCgogICAgICAgICAgICAkY2xpZW50SWRlbnRpdHkgPSBHZXQtUGlwZUNsaWVudElkZW50aXR5IC1QaXBlICRwaXBlCiAgICAgICAgICAgICRlbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKCRmYWxzZSkKICAgICAgICAgICAgJHJlYWRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVJlYWRlcigkcGlwZSwgJGVuY29kaW5nKQogICAgICAgICAgICAkd3JpdGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uU3RyZWFtV3JpdGVyKCRwaXBlLCAkZW5jb2RpbmcpCiAgICAgICAgICAgICR3cml0ZXIuQXV0b0ZsdXNoID0gJHRydWUKCiAgICAgICAgICAgICRyZXNwb25zZSA9ICRudWxsCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkbGluZSA9ICRyZWFkZXIuUmVhZExpbmUoKQogICAgICAgICAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ0VtcHR5IHJlcXVlc3QuJwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXF1ZXN0ID0gJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbkNvbW1hbmQgLVJlcXVlc3QgJHJlcXVlc3QgLUNsaWVudElkZW50aXR5ICRjbGllbnRJZGVudGl0eQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiTmFtZWQgcGlwZSByZXF1ZXN0IGZhaWxlZDogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgID0gJGZhbHNlCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgPSAkY2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkID0gJGNsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgID0gJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHdyaXRlci5Xcml0ZUxpbmUoKCRyZXNwb25zZSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcyAtRGVwdGggNikpCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBlcnJvcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKCRwaXBlKSB7CiAgICAgICAgICAgICAgICAkcGlwZS5EaXNwb3NlKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMgewogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiBAKCRzdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uU3RhdGUgLWVxICdSdW5uaW5nJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2UgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ05hY2ggTmV1c3RhcnQgZXJuZXV0IGVpbmdlcmVpaHQnCiAgICAgICAgICAgICAgICAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQgPSAkbnVsbAogICAgICAgICAgICAgICAgJGl0ZW0uSXNJbmRldGVybWluYXRlID0gJGZhbHNlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFydGVkQXQgPSAkbnVsbAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gR2V0LU5leHRRdWV1ZWRJdGVtIHsKICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRudWxsCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHN0YXRlKQogICAgICAgIGZvcmVhY2ggKCRpdGVtIGluIChAKCRzdGF0ZS5RdWV1ZSkgfCBTb3J0LU9iamVjdCBDcmVhdGVkQXQpKSB7CiAgICAgICAgICAgIGlmICgtbm90ICRpdGVtKSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgaWYgKCRpdGVtLlN0YXRlIC1lcSAnUXVldWVkJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUnVubmluZycKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJ1N0YXJ0aW5nJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ1ZvcmJlcmVpdHVuZy4uLicKICAgICAgICAgICAgICAgICRpdGVtLlByb2dyZXNzUGVyY2VudCA9ICRudWxsCiAgICAgICAgICAgICAgICAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUgPSAkdHJ1ZQogICAgICAgICAgICAgICAgJGl0ZW0uU3RhcnRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgICAgICAgICAkc3RhdGUuQ3VycmVudCA9IFtwc2N1c3RvbW9iamVjdF1bb3JkZXJlZF1AewogICAgICAgICAgICAgICAgICAgIElkID0gJGl0ZW0uSWQKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPSAkaXRlbS5BY3Rpb24KICAgICAgICAgICAgICAgICAgICBBbGlhcyA9ICRpdGVtLkFsaWFzCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPSAkaXRlbS5EaXNwbGF5TmFtZQogICAgICAgICAgICAgICAgICAgIFN0YWdlID0gJGl0ZW0uU3RhZ2UKICAgICAgICAgICAgICAgICAgICBTdGFnZVRleHQgPSAkaXRlbS5TdGFnZVRleHQKICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPSAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQKICAgICAgICAgICAgICAgICAgICBJc0luZGV0ZXJtaW5hdGUgPSAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRpdGVtCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRpdGVtID0gJHNjcmlwdDpOZXh0UXVldWVJdGVtCiAgICAkc2NyaXB0Ok5leHRRdWV1ZUl0ZW0gPSAkbnVsbAogICAgcmV0dXJuICRpdGVtCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVF1ZXVlSXRlbSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kSWQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnU3VjY2VlZGVkJywnRmFpbGVkJyldW3N0cmluZ10kU3RhdGUsCiAgICAgICAgW2ludF0kRXhpdENvZGUgPSAwLAogICAgICAgIFtzdHJpbmddJE1lc3NhZ2UKICAgICkKCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHF1ZXVlU3RhdGUpCiAgICAgICAgZm9yZWFjaCAoJGl0ZW0gaW4gQCgkcXVldWVTdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uSWQgLWVxICRJZCkgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAkU3RhdGUKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJFN0YXRlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFnZVRleHQgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgJGl0ZW0uUHJvZ3Jlc3NQZXJjZW50ID0gaWYgKCRTdGF0ZSAtZXEgJ1N1Y2NlZWRlZCcpIHsgMTAwIH0gZWxzZSB7ICRudWxsIH0KICAgICAgICAgICAgICAgICRpdGVtLklzSW5kZXRlcm1pbmF0ZSA9ICRmYWxzZQogICAgICAgICAgICAgICAgJGl0ZW0uRmluaXNoZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgICAgICAgICAgJGl0ZW0uRXhpdENvZGUgPSAkRXhpdENvZGUKICAgICAgICAgICAgICAgICRpdGVtLk1lc3NhZ2UgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkcXVldWVTdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVF1ZXVlZEl0ZW0gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRJdGVtLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoCiAgICApCgogICAgaWYgKCRJdGVtLkFjdGlvbiAtZXEgJ1VwZ3JhZGVBbGwnKSB7CiAgICAgICAgJGV4aXRDb2RlID0gSW52b2tlLVdpbmdldFVwZ3JhZGVBbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICAgICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgICAgICBpZiAoJGV4aXRDb2RlIC1lcSAwKSB7CiAgICAgICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIFN1Y2NlZWRlZCAtRXhpdENvZGUgJGV4aXRDb2RlIC1NZXNzYWdlICdVcGRhdGVzIGFiZ2VzY2hsb3NzZW4uJwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgRmFpbGVkIC1FeGl0Q29kZSAkZXhpdENvZGUgLU1lc3NhZ2UgIlVwZGF0ZXMgZmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQoKICAgICRhcHAgPSBHZXQtQXBwQ2F0YWxvZ09iamVjdEJ5QWxpYXMgLUFsaWFzIChbc3RyaW5nXSRJdGVtLkFsaWFzKQogICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnQWxpYXMgaXN0IG5pY2h0IG1laHIgZnJlaWdlZ2ViZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXF1aXJlZFNldCA9IEdldC1SZXF1aXJlZEFsaWFzU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnVW5pbnN0YWxsJyAtYW5kICRyZXF1aXJlZFNldC5Db250YWlucyhbc3RyaW5nXSRJdGVtLkFsaWFzKSkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgZGVpbnN0YWxsaWVydCB3ZXJkZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRpbnN0YWxsZWRTZXQgPSBHZXQtSW5zdGFsbGVkUGFja2FnZUlkU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcgLWFuZCAkaW5zdGFsbGVkU2V0LkNvbnRhaW5zKFtzdHJpbmddJGFwcC5QYWNrYWdlSWQpKSB7CiAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgU3VjY2VlZGVkIC1FeGl0Q29kZSAwIC1NZXNzYWdlICdCZXJlaXRzIGluc3RhbGxpZXJ0LicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcpIHsKICAgICAgICAkZXhpdENvZGUgPSBJbnZva2UtV2luZ2V0SW5zdGFsbCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUGFja2FnZUlkIChbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIH0KICAgIGVsc2UgewogICAgICAgICRleGl0Q29kZSA9IEludm9rZS1XaW5nZXRVbmluc3RhbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVBhY2thZ2VJZCAoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkgLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICB9CgogICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIGlmICgkZXhpdENvZGUgLWVxIDApIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBTdWNjZWVkZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAnQWJnZXNjaGxvc3Nlbi4nCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAiRmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1Qcm9jZXNzUXVldWVNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgaWYgKC1ub3QgJHdpbmdldFBhdGgpIHsKICAgICAgICBXcml0ZS1Mb2cgJ0Fib3J0aW5nIHF1ZXVlIHByb2Nlc3NpbmcgYmVjYXVzZSB3aW5nZXQgaXMgdW5hdmFpbGFibGUuJyAnRVJST1InCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1TY3JpcHRCbG9jayB7CiAgICAgICAgUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMKICAgICAgICAkbnVsbCA9IFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICAgICAgJG51bGwgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAoKICAgICAgICB3aGlsZSAoJHRydWUpIHsKICAgICAgICAgICAgJGl0ZW0gPSBHZXQtTmV4dFF1ZXVlZEl0ZW0KICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgYnJlYWsgfQoKICAgICAgICAgICAgV3JpdGUtTG9nICJQcm9jZXNzaW5nIHF1ZXVlZCBpdGVtIGlkPSckKCRpdGVtLklkKScgYWN0aW9uPSckKCRpdGVtLkFjdGlvbiknIGFsaWFzPSckKCRpdGVtLkFsaWFzKScgc291cmNlPSckKCRpdGVtLlNvdXJjZSknIHJlcXVlc3RlZEJ5PSckKCRpdGVtLlJlcXVlc3RlZEJ5KSciCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBJbnZva2UtUXVldWVkSXRlbSAtSXRlbSAkaXRlbSAtV2luZ2V0UGF0aCAkd2luZ2V0UGF0aAogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiUXVldWVkIGl0ZW0gJyQoJGl0ZW0uSWQpJyBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICAgICAgICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRpdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlIDEgLU1lc3NhZ2UgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgeyBwYXJhbSgkc3RhdGUpICRzdGF0ZS5DdXJyZW50ID0gJG51bGwgfQogICAgfQp9CgpmdW5jdGlvbiBJbnZva2UtVXBncmFkZUFsbE1vZGUgewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgJGl0ZW0gPSBOZXctUXVldWVJdGVtIC1BY3Rpb24gVXBncmFkZUFsbCAtRGlzcGxheU5hbWUgJ3dpbmdldCB1cGdyYWRlIC0tYWxsJyAtU291cmNlIFN5c3RlbSAtUmVxdWVzdGVkQnkgJ1N5c3RlbScgLVJlcXVlc3RlZEJ5U2lkICdTeXN0ZW0nCiAgICAkcmVzdWx0ID0gQWRkLVF1ZXVlSXRlbSAtSXRlbSAkaXRlbQogICAgaWYgKCRyZXN1bHQuQWRkZWQpIHsKICAgICAgICBXcml0ZS1Mb2cgJ1F1ZXVlZCAyLWhvdXIgd2luZ2V0IHVwZ3JhZGUuJwogICAgfQogICAgZWxzZSB7CiAgICAgICAgV3JpdGUtTG9nICcyLWhvdXIgd2luZ2V0IHVwZ3JhZGUgaXMgYWxyZWFkeSBxdWV1ZWQgb3IgcnVubmluZy4nCiAgICB9CiAgICBTdGFydC1RdWV1ZVdvcmtlcgp9CgpmdW5jdGlvbiBJbnZva2UtQXBwbHlQb2xpY3lNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgJHJlc3VsdCA9IEludm9rZS1SZXF1aXJlZFNvZnR3YXJlUG9saWN5IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICBXcml0ZS1Mb2cgIlJlcXVpcmVkIHBvbGljeSBhcHBseSBxdWV1ZWQgaXRlbXM9JCgkcmVzdWx0LlF1ZXVlZCkuIgp9CgpmdW5jdGlvbiBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRBcHBBbGlhcykpIHsKICAgICAgICB0aHJvdyAnQXBwQWxpYXMgaXMgcmVxdWlyZWQgZm9yIFByb2Nlc3NSZXF1ZXN0IG1vZGUuJwogICAgfQoKICAgICRhbGlhcyA9ICRBcHBBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgIGlmICgtbm90ICRhcHApIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBpbiBjYXRhbG9nIHBvbGljeS4gUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIiAnV0FSTicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFJlcXVlc3RBY3Rpb24gLWVxICdJbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBpbnN0YWxsIGZvciBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIHVzZXIgaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkUmVxdWVzdEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcgLWFuZCAtbm90IChUZXN0LVVzZXJVbmluc3RhbGxBbGxvd2VkKSkgewogICAgICAgIFdyaXRlLUxvZyAiV29ya2VyIHJlamVjdGVkIHVuaW5zdGFsbCBmb3IgYWxpYXMgJyRhbGlhcycgYmVjYXVzZSB1c2VyIHVuaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXN1bHQgPSBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSAtQWN0aW9uICRSZXF1ZXN0QWN0aW9uIC1BbGlhcyAkYWxpYXMgLVJlcXVlc3RlZEJ5ICRSZXF1ZXN0ZWRCeSAtUmVxdWVzdGVkQnlTaWQgJFJlcXVlc3RlZEJ5U2lkIC1Tb3VyY2UgVXNlcgogICAgV3JpdGUtTG9nICJRdWV1ZWQgd29ya2VyIHJlcXVlc3QgYWN0aW9uPSRSZXF1ZXN0QWN0aW9uIGFsaWFzPSckYWxpYXMnIGFkZGVkPSQoJHJlc3VsdC5BZGRlZCkgUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIgogICAgU3RhcnQtUXVldWVXb3JrZXIKfQoKZnVuY3Rpb24gSW5zdGFsbC1TZXJ2aWNlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIFNldC1EaXJlY3RvcnlBY2wgLVBhdGggJEJhc2VEaXIgLVVzZXJzQ2FuTW9kaWZ5OiRmYWxzZQogICAgU2V0LURpcmVjdG9yeUFjbCAtUGF0aCAkTG9nRGlyIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKCiAgICBmb3JlYWNoICgkbGVnYWN5RGlyTmFtZSBpbiBAKCdSZXF1ZXN0cycsJ1Byb2Nlc3NlZCcsJ0ZhaWxlZCcpKSB7CiAgICAgICAgJGxlZ2FjeURpclBhdGggPSBKb2luLVBhdGggJEJhc2VEaXIgJGxlZ2FjeURpck5hbWUKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkbGVnYWN5RGlyUGF0aCkgewogICAgICAgICAgICBTZXQtRGlyZWN0b3J5QWNsIC1QYXRoICRsZWdhY3lEaXJQYXRoIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKICAgICAgICB9CiAgICB9CgogICAgaWYgKC1ub3QgJFBTQ29tbWFuZFBhdGgpIHsKICAgICAgICB0aHJvdyAnUFNDb21tYW5kUGF0aCBpcyBlbXB0eTsgY2Fubm90IGRldGVybWluZSB0aGUgc291cmNlIHNjcmlwdCBwYXRoLicKICAgIH0KCiAgICBDb3B5LUl0ZW0gLUxpdGVyYWxQYXRoICRQU0NvbW1hbmRQYXRoIC1EZXN0aW5hdGlvbiAkTG9jYWxTY3JpcHRQYXRoIC1Gb3JjZQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRMb2NhbFNjcmlwdFBhdGgKCiAgICBOZXctVXNlclJlcXVlc3RUb29sCiAgICBOZXctQ2F0YWxvZ0d1aQogICAgTmV3LUNhdGFsb2dMYXVuY2hlcgogICAgTmV3LVNob3J0Y3V0IC1TaG9ydGN1dFBhdGggJERlc2t0b3BTaG9ydGN1dFBhdGgKICAgIE5ldy1TaG9ydGN1dCAtU2hvcnRjdXRQYXRoICRTdGFydE1lbnVTaG9ydGN1dFBhdGgKICAgIFJlZ2lzdGVyLU9yVXBkYXRlVGFza3MKCiAgICBXcml0ZS1Mb2cgJ0luc3RhbGwvdXBkYXRlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFbnRyeSBwb2ludAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHJ5IHsKICAgIHN3aXRjaCAoJE1vZGUpIHsKICAgICAgICAnSW5zdGFsbCcgICAgeyBJbnN0YWxsLVNlcnZpY2UgfQogICAgICAgICdEYWVtb24nICAgICB7IFN0YXJ0LUNhdGFsb2dEYWVtb24gfQogICAgICAgICdVcGdyYWRlQWxsJyB7IEludm9rZS1VcGdyYWRlQWxsTW9kZSB9CiAgICAgICAgJ0FwcGx5UG9saWN5JyB7IEludm9rZS1BcHBseVBvbGljeU1vZGUgfQogICAgICAgICdQcm9jZXNzUXVldWUnIHsgSW52b2tlLVByb2Nlc3NRdWV1ZU1vZGUgfQogICAgICAgICdQcm9jZXNzUmVxdWVzdCcgeyBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIH0KICAgICAgICBkZWZhdWx0ICAgICAgeyB0aHJvdyAiVW5zdXBwb3J0ZWQgbW9kZSAnJE1vZGUnLiIgfQogICAgfQp9CmNhdGNoIHsKICAgIHRyeSB7CiAgICAgICAgV3JpdGUtTG9nICJGYXRhbCBlcnJvciBpbiBtb2RlICckTW9kZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CiAgICB0aHJvdwp9Cg== +PCMKU2VsZlNlcnZpY2VXaW5nZXQucHMxCgpVc2UgYXM6Ci0gQ29tcHV0ZXIgU3RhcnR1cCBHUE8gc2NyaXB0IChkZWZhdWx0IG1vZGUgPSBJbnN0YWxsKQotIFNjaGVkdWxlZCB0YXNrIHRhcmdldCAoTW9kZSA9IERhZW1vbiAvIFVwZ3JhZGVBbGwgLyBBcHBseVBvbGljeSAvIFByb2Nlc3NRdWV1ZSAvIFByb2Nlc3NSZXF1ZXN0KQoKQmVoYXZpb3I6ClVzZXIgLT4gR1VJIC8gcmVxdWVzdCBoZWxwZXIgLT4gbmFtZWQgcGlwZSAtPiBkYWVtb24gdGFzayAoU1lTVEVNKSAtPiB3aW5nZXQgaW5zdGFsbCAtLXNjb3BlIG1hY2hpbmUKCkNyZWF0ZWQgcGF0aHM6CkM6XFByb2dyYW1EYXRhXF9fU29mdHdhcmVrYXRhbG9nXAogIFNlbGZTZXJ2aWNlV2luZ2V0LnBzMQogIFJlcXVlc3QtQXBwLnBzMQogIFNvZnR3YXJlLUNhdGFsb2cucHMxCiAgTGF1bmNoLVNvZnR3YXJlLUNhdGFsb2cudmJzCiAgSW5zdGFsbGVkLVBhY2thZ2VzLmpzb24KICBMb2dzXHNlcnZpY2UubG9nCiM+CgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ0RhZW1vbicsJ1VwZ3JhZGVBbGwnLCdBcHBseVBvbGljeScsJ1Byb2Nlc3NRdWV1ZScsJ1Byb2Nlc3NSZXF1ZXN0JyldCiAgICBbc3RyaW5nXSRNb2RlID0gJ0luc3RhbGwnLAogICAgW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldCiAgICBbc3RyaW5nXSRSZXF1ZXN0QWN0aW9uID0gJ0luc3RhbGwnLAogICAgW3N0cmluZ10kQXBwQWxpYXMsCiAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgIFtzdHJpbmddJFJlcXVlc3RlZEJ5U2lkCikKClNldC1TdHJpY3RNb2RlIC1WZXJzaW9uIExhdGVzdAokRXJyb3JBY3Rpb25QcmVmZXJlbmNlID0gJ1N0b3AnCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDb25maWd1cmF0aW9uCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQokQ2F0YWxvZ0Rpc3BsYXlOYW1lICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRCYXNlRGlyICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6UHJvZ3JhbURhdGEgJ19fU29mdHdhcmVrYXRhbG9nJwokTG9jYWxTY3JpcHRQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU2VsZlNlcnZpY2VXaW5nZXQucHMxJwokUmVxdWVzdFRvb2xQYXRoICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnUmVxdWVzdC1BcHAucHMxJwokQ2F0YWxvZ0d1aVBhdGggICAgICAgICA9IEpvaW4tUGF0aCAkQmFzZURpciAnU29mdHdhcmUtQ2F0YWxvZy5wczEnCiRDYXRhbG9nTGF1bmNoZXJQYXRoICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMYXVuY2gtU29mdHdhcmUtQ2F0YWxvZy52YnMnCiRJbnN0YWxsZWRQYWNrYWdlc1BhdGggID0gSm9pbi1QYXRoICRCYXNlRGlyICdJbnN0YWxsZWQtUGFja2FnZXMuanNvbicKJFF1ZXVlU3RhdGVQYXRoICAgICAgICAgPSBKb2luLVBhdGggJEJhc2VEaXIgJ1F1ZXVlLVN0YXRlLmpzb24nCiRMb2dEaXIgICAgICAgICAgICAgICAgID0gSm9pbi1QYXRoICRCYXNlRGlyICdMb2dzJwokTG9nRmlsZSAgICAgICAgICAgICAgICA9IEpvaW4tUGF0aCAkTG9nRGlyICdzZXJ2aWNlLmxvZycKJFBvbGljeVJvb3QgICAgICAgICAgICAgPSAnSEtMTTpcU29mdHdhcmVcUG9saWNpZXNcU1RMXFNvZnR3YXJla2F0YWxvZycKJFBvbGljeUNhdGFsb2dSb290ICAgICAgPSBKb2luLVBhdGggJFBvbGljeVJvb3QgJ0NhdGFsb2cnCiRQb2xpY3lSZXF1aXJlZFJvb3QgICAgID0gSm9pbi1QYXRoICRQb2xpY3lSb290ICdSZXF1aXJlZCcKJFBvbGljeU1heEVudHJpZXMgICAgICAgPSA1MDAKJExlZ2FjeVF1ZXVlVGFza05hbWUgICAgPSAnU29mdHdhcmVrYXRhbG9nIC0gV2luZ2V0IFF1ZXVlJwokRGFlbW9uVGFza05hbWUgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cgLSBEYWVtb24nCiRVcGdyYWRlVGFza05hbWUgICAgICAgID0gJ1NvZnR3YXJla2F0YWxvZyAtIFdpbmdldCBVcGdyYWRlJwokUGlwZU5hbWUgICAgICAgICAgICAgICA9ICdTb2Z0d2FyZWthdGFsb2cnCiRXaW5nZXRNdXRleE5hbWUgICAgICAgID0gJ0dsb2JhbFxTb2Z0d2FyZWthdGFsb2ctV2luZ2V0JwokUXVldWVTdGF0ZU11dGV4TmFtZSAgICA9ICdHbG9iYWxcU29mdHdhcmVrYXRhbG9nLVF1ZXVlU3RhdGUnCiRQb3dlclNoZWxsRXhlICAgICAgICAgID0gSm9pbi1QYXRoICRlbnY6U3lzdGVtUm9vdCAnU3lzdGVtMzJcV2luZG93c1Bvd2VyU2hlbGxcdjEuMFxwb3dlcnNoZWxsLmV4ZScKJFdTY3JpcHRFeGUgICAgICAgICAgICAgPSBKb2luLVBhdGggJGVudjpTeXN0ZW1Sb290ICdTeXN0ZW0zMlx3c2NyaXB0LmV4ZScKJEFwcEluc3RhbGxlckZhbWlseU5hbWUgPSAnTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXJfOHdla3liM2Q4YmJ3ZScKJENvbW1vbkRlc2t0b3BEaXIgICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25EZXNrdG9wRGlyZWN0b3J5JykKJENvbW1vblByb2dyYW1zRGlyICAgICAgPSBbRW52aXJvbm1lbnRdOjpHZXRGb2xkZXJQYXRoKCdDb21tb25Qcm9ncmFtcycpCiREZXNrdG9wU2hvcnRjdXRQYXRoICAgID0gSm9pbi1QYXRoICRDb21tb25EZXNrdG9wRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKJFN0YXJ0TWVudVNob3J0Y3V0UGF0aCAgPSBKb2luLVBhdGggJENvbW1vblByb2dyYW1zRGlyICIkQ2F0YWxvZ0Rpc3BsYXlOYW1lLmxuayIKJHNjcmlwdDpEYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXJzID0gQCgpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBVdGlsaXR5IGZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZnVuY3Rpb24gRW5zdXJlLURpcmVjdG9yeSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCkKICAgIGlmICgtbm90IChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRQYXRoKSkgewogICAgICAgIE5ldy1JdGVtIC1JdGVtVHlwZSBEaXJlY3RvcnkgLVBhdGggJFBhdGggLUZvcmNlIHwgT3V0LU51bGwKICAgIH0KfQoKZnVuY3Rpb24gV3JpdGUtTG9nIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRNZXNzYWdlLAogICAgICAgIFtWYWxpZGF0ZVNldCgnSU5GTycsJ1dBUk4nLCdFUlJPUicpXQogICAgICAgIFtzdHJpbmddJExldmVsID0gJ0lORk8nCiAgICApCgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCiAgICAkbGluZSA9ICd7MH0gW3sxfV0gezJ9JyAtZiAoR2V0LURhdGUgLUZvcm1hdCAneXl5eS1NTS1kZCBISDptbTpzcycpLCAkTGV2ZWwsICRNZXNzYWdlCiAgICBBZGQtQ29udGVudCAtTGl0ZXJhbFBhdGggJExvZ0ZpbGUgLVZhbHVlICRsaW5lIC1FbmNvZGluZyBVVEY4Cn0KCmZ1bmN0aW9uIFNldC1EaXJlY3RvcnlBY2wgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtib29sXSRVc2Vyc0Nhbk1vZGlmeQogICAgKQoKICAgICRpbmhlcml0YW5jZSA9IFtTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5Jbmhlcml0YW5jZUZsYWdzXSdDb250YWluZXJJbmhlcml0LCBPYmplY3RJbmhlcml0JwogICAgJHByb3BhZ2F0aW9uID0gW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLlByb3BhZ2F0aW9uRmxhZ3NdOjpOb25lCgogICAgJGFjbCA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LkFjY2Vzc0NvbnRyb2wuRGlyZWN0b3J5U2VjdXJpdHkKICAgICRhY2wuU2V0QWNjZXNzUnVsZVByb3RlY3Rpb24oJHRydWUsICRmYWxzZSkKCiAgICAkc2lkU3lzdGVtID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMTgnKQogICAgJHNpZEFkbWlucyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NCcpCiAgICAkc2lkVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0zMi01NDUnKQoKICAgICRydWxlU3lzdGVtID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5GaWxlU3lzdGVtQWNjZXNzUnVsZSgKICAgICAgICAkc2lkU3lzdGVtLCAnRnVsbENvbnRyb2wnLCAkaW5oZXJpdGFuY2UsICRwcm9wYWdhdGlvbiwgJ0FsbG93JwogICAgKQogICAgJHJ1bGVBZG1pbnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRBZG1pbnMsICdGdWxsQ29udHJvbCcsICRpbmhlcml0YW5jZSwgJHByb3BhZ2F0aW9uLCAnQWxsb3cnCiAgICApCgogICAgaWYgKCRVc2Vyc0Nhbk1vZGlmeSkgewogICAgICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICAgICAkc2lkVXNlcnMsICdNb2RpZnknLCAkaW5oZXJpdGFuY2UsICRwcm9wYWdhdGlvbiwgJ0FsbG93JwogICAgICAgICkKICAgIH0KICAgIGVsc2UgewogICAgICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICAgICAkc2lkVXNlcnMsICdSZWFkQW5kRXhlY3V0ZSwgU3luY2hyb25pemUnLCAkaW5oZXJpdGFuY2UsICRwcm9wYWdhdGlvbiwgJ0FsbG93JwogICAgICAgICkKICAgIH0KCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZVN5c3RlbSkKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlQWRtaW5zKQogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVVc2VycykKCiAgICBTZXQtQWNsIC1MaXRlcmFsUGF0aCAkUGF0aCAtQWNsT2JqZWN0ICRhY2wKfQoKZnVuY3Rpb24gU2V0LUZpbGVBY2xBZG1pbnNPbmx5IHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYXRoKQoKICAgICRhY2wgPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTZWN1cml0eQogICAgJGFjbC5TZXRBY2Nlc3NSdWxlUHJvdGVjdGlvbigkdHJ1ZSwgJGZhbHNlKQoKICAgICRzaWRTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0xOCcpCiAgICAkc2lkQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ0JykKICAgICRzaWRVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NScpCgogICAgJHJ1bGVTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkZpbGVTeXN0ZW1BY2Nlc3NSdWxlKAogICAgICAgICRzaWRTeXN0ZW0sICdGdWxsQ29udHJvbCcsICdBbGxvdycKICAgICkKICAgICRydWxlQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5GaWxlU3lzdGVtQWNjZXNzUnVsZSgKICAgICAgICAkc2lkQWRtaW5zLCAnRnVsbENvbnRyb2wnLCAnQWxsb3cnCiAgICApCiAgICAkcnVsZVVzZXJzID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5GaWxlU3lzdGVtQWNjZXNzUnVsZSgKICAgICAgICAkc2lkVXNlcnMsICdSZWFkQW5kRXhlY3V0ZSwgU3luY2hyb25pemUnLCAnQWxsb3cnCiAgICApCgogICAgJG51bGwgPSAkYWNsLkFkZEFjY2Vzc1J1bGUoJHJ1bGVTeXN0ZW0pCiAgICAkbnVsbCA9ICRhY2wuQWRkQWNjZXNzUnVsZSgkcnVsZUFkbWlucykKICAgICRudWxsID0gJGFjbC5BZGRBY2Nlc3NSdWxlKCRydWxlVXNlcnMpCgogICAgU2V0LUFjbCAtTGl0ZXJhbFBhdGggJFBhdGggLUFjbE9iamVjdCAkYWNsCn0KCmZ1bmN0aW9uIEdldC1Qb2xpY3lEd29yZCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kTmFtZSwKICAgICAgICBbaW50XSREZWZhdWx0ID0gMAogICAgKQoKICAgIHRyeSB7CiAgICAgICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFBvbGljeVJvb3QpKSB7CiAgICAgICAgICAgIHJldHVybiAkRGVmYXVsdAogICAgICAgIH0KCiAgICAgICAgJHByb3BzID0gR2V0LUl0ZW1Qcm9wZXJ0eSAtTGl0ZXJhbFBhdGggJFBvbGljeVJvb3QgLUVycm9yQWN0aW9uIFN0b3AKICAgICAgICAkcHJvcGVydHkgPSAkcHJvcHMuUFNPYmplY3QuUHJvcGVydGllc1skTmFtZV0KICAgICAgICBpZiAoLW5vdCAkcHJvcGVydHkpIHsKICAgICAgICAgICAgcmV0dXJuICREZWZhdWx0CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gW2ludF0kcHJvcGVydHkuVmFsdWUKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIHBvbGljeSB2YWx1ZSAnJE5hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICAgICAgcmV0dXJuICREZWZhdWx0CiAgICB9Cn0KCmZ1bmN0aW9uIFRlc3QtU29mdHdhcmVDYXRhbG9nUG9saWN5RW5hYmxlZCB7CiAgICAoR2V0LVBvbGljeUR3b3JkIC1OYW1lICdFbmFibGVkJyAtRGVmYXVsdCAwKSAtZXEgMQp9CgpmdW5jdGlvbiBUZXN0LVVzZXJJbnN0YWxsc0FsbG93ZWQgewogICAgKEdldC1Qb2xpY3lEd29yZCAtTmFtZSAnQWxsb3dVc2VySW5zdGFsbHMnIC1EZWZhdWx0IDEpIC1lcSAxCn0KCmZ1bmN0aW9uIFRlc3QtVXNlclVuaW5zdGFsbEFsbG93ZWQgewogICAgKEdldC1Qb2xpY3lEd29yZCAtTmFtZSAnQWxsb3dVc2VyVW5pbnN0YWxsJyAtRGVmYXVsdCAxKSAtZXEgMQp9CgpmdW5jdGlvbiBUZXN0LVJlcXVpcmVkRW5mb3JjZW1lbnRFbmFibGVkIHsKICAgIChHZXQtUG9saWN5RHdvcmQgLU5hbWUgJ0VuZm9yY2VSZXF1aXJlZCcgLURlZmF1bHQgMSkgLWVxIDEKfQoKZnVuY3Rpb24gR2V0LVBvbGljeVN0cmluZ1ZhbHVlcyB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kUGF0aCkKCiAgICBpZiAoLW5vdCAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkUGF0aCkpIHsKICAgICAgICByZXR1cm4gQCgpCiAgICB9CgogICAgdHJ5IHsKICAgICAgICAkaXRlbSA9IEdldC1JdGVtIC1MaXRlcmFsUGF0aCAkUGF0aCAtRXJyb3JBY3Rpb24gU3RvcAogICAgICAgICRuYW1lcyA9IEAoJGl0ZW0uR2V0VmFsdWVOYW1lcygpKSB8CiAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7ICRfIC1hbmQgJF8gLW5vdG1hdGNoICdeXConIH0gfAogICAgICAgICAgICBTb3J0LU9iamVjdCB8CiAgICAgICAgICAgIFNlbGVjdC1PYmplY3QgLUZpcnN0ICRQb2xpY3lNYXhFbnRyaWVzCgogICAgICAgIGZvcmVhY2ggKCRuYW1lIGluICRuYW1lcykgewogICAgICAgICAgICAkdmFsdWUgPSBbc3RyaW5nXSRpdGVtLkdldFZhbHVlKCRuYW1lLCAnJykKICAgICAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9IFtzdHJpbmddJG5hbWUKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICR2YWx1ZS5UcmltKCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIHBvbGljeSBsaXN0ICckUGF0aCc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gQCgpCiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1BcHBDYXRhbG9nT2JqZWN0cyB7CiAgICBpZiAoLW5vdCAoVGVzdC1Tb2Z0d2FyZUNhdGFsb2dQb2xpY3lFbmFibGVkKSkgewogICAgICAgIHJldHVybiBAKCkKICAgIH0KCiAgICAkc2VlbkFsaWFzZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICAkcm93cyA9IEdldC1Qb2xpY3lTdHJpbmdWYWx1ZXMgLVBhdGggJFBvbGljeUNhdGFsb2dSb290CiAgICBmb3JlYWNoICgkcm93IGluICRyb3dzKSB7CiAgICAgICAgJGFsaWFzID0gKFtzdHJpbmddJHJvdy5OYW1lKS5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGFsaWFzKSkgewogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKC1ub3QgJHNlZW5BbGlhc2VzLkFkZCgkYWxpYXMpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiRHVwbGljYXRlIGNhdGFsb2cgYWxpYXMgJyRhbGlhcycgaW4gcG9saWN5OyBpZ25vcmluZyBkdXBsaWNhdGUuIiAnV0FSTicKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRwYXJ0cyA9IChbc3RyaW5nXSRyb3cuVmFsdWUpIC1zcGxpdCAnXHwnLCAzCiAgICAgICAgaWYgKEAoJHBhcnRzKS5Db3VudCAtbHQgMikgewogICAgICAgICAgICBXcml0ZS1Mb2cgIk1hbGZvcm1lZCBjYXRhbG9nIHJvdyAnJGFsaWFzJy4gRXhwZWN0ZWQ6IFBhY2thZ2VJZHxEaXNwbGF5TmFtZXxEZXNjcmlwdGlvbiIgJ1dBUk4nCiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgfQoKICAgICAgICAkcGFja2FnZUlkID0gKFtzdHJpbmddJHBhcnRzWzBdKS5UcmltKCkKICAgICAgICAkZGlzcGxheU5hbWUgPSAoW3N0cmluZ10kcGFydHNbMV0pLlRyaW0oKQogICAgICAgICRkZXNjcmlwdGlvbiA9ICcnCiAgICAgICAgaWYgKEAoJHBhcnRzKS5Db3VudCAtZ2UgMykgewogICAgICAgICAgICAkZGVzY3JpcHRpb24gPSAoW3N0cmluZ10kcGFydHNbMl0pLlRyaW0oKQogICAgICAgIH0KCiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHBhY2thZ2VJZCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJDYXRhbG9nIHJvdyAnJGFsaWFzJyBoYXMgZW1wdHkgcGFja2FnZSBJRDsgaWdub3JpbmcuIiAnV0FSTicKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRkaXNwbGF5TmFtZSkpIHsKICAgICAgICAgICAgJGRpc3BsYXlOYW1lID0gJGFsaWFzCiAgICAgICAgfQoKICAgICAgICBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICAgICAgQWxpYXMgICAgICAgPSAkYWxpYXMKICAgICAgICAgICAgRGlzcGxheU5hbWUgPSAkZGlzcGxheU5hbWUKICAgICAgICAgICAgRGVzY3JpcHRpb24gPSAkZGVzY3JpcHRpb24KICAgICAgICAgICAgUGFja2FnZUlkICAgPSAkcGFja2FnZUlkCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBHZXQtUmVxdWlyZWRBbGlhc2VzIHsKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7CiAgICAgICAgcmV0dXJuIEAoKQogICAgfQoKICAgICRzZWVuQWxpYXNlcyA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICRyb3dzID0gR2V0LVBvbGljeVN0cmluZ1ZhbHVlcyAtUGF0aCAkUG9saWN5UmVxdWlyZWRSb290CiAgICBmb3JlYWNoICgkcm93IGluICRyb3dzKSB7CiAgICAgICAgJHZhbHVlID0gKFtzdHJpbmddJHJvdy5WYWx1ZSkuVHJpbSgpCiAgICAgICAgaWYgKCR2YWx1ZSAtZXEgJzAnIC1vciAkdmFsdWUgLWVxICdmYWxzZScpIHsKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRhbGlhcyA9IChbc3RyaW5nXSRyb3cuTmFtZSkuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRhbGlhcykpIHsKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgIGlmICgkc2VlbkFsaWFzZXMuQWRkKCRhbGlhcykpIHsKICAgICAgICAgICAgJGFsaWFzCiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiBHZXQtUGFja2FnZUlkQnlBbGlhcyB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kQWxpYXMpCgogICAgZm9yZWFjaCAoJGFwcCBpbiBHZXQtQXBwQ2F0YWxvZ09iamVjdHMpIHsKICAgICAgICBpZiAoW3N0cmluZ106OkVxdWFscyhbc3RyaW5nXSRhcHAuQWxpYXMsICRBbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgIHJldHVybiBbc3RyaW5nXSRhcHAuUGFja2FnZUlkCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBHZXQtQXBwQ2F0YWxvZ09iamVjdEJ5QWxpYXMgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJEFsaWFzKQoKICAgIGZvcmVhY2ggKCRhcHAgaW4gR2V0LUFwcENhdGFsb2dPYmplY3RzKSB7CiAgICAgICAgaWYgKFtzdHJpbmddOjpFcXVhbHMoW3N0cmluZ10kYXBwLkFsaWFzLCAkQWxpYXMsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkgewogICAgICAgICAgICByZXR1cm4gJGFwcAogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJG51bGwKfQoKZnVuY3Rpb24gV3JpdGUtVGV4dEZpbGUgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJENvbnRlbnQsCiAgICAgICAgW1ZhbGlkYXRlU2V0KCdVdGY4Qm9tJywnVW5pY29kZScpXQogICAgICAgIFtzdHJpbmddJEVuY29kaW5nID0gJ1V0ZjhCb20nCiAgICApCgogICAgJHBhcmVudCA9IFNwbGl0LVBhdGggLVBhdGggJFBhdGggLVBhcmVudAogICAgaWYgKCRwYXJlbnQpIHsKICAgICAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRwYXJlbnQKICAgIH0KCiAgICBzd2l0Y2ggKCRFbmNvZGluZykgewogICAgICAgICdVbmljb2RlJyB7ICR0ZXh0RW5jb2RpbmcgPSBOZXctT2JqZWN0IFN5c3RlbS5UZXh0LlVuaWNvZGVFbmNvZGluZygkZmFsc2UsICR0cnVlKSB9CiAgICAgICAgZGVmYXVsdCAgIHsgJHRleHRFbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKCR0cnVlKSB9CiAgICB9CgogICAgW1N5c3RlbS5JTy5GaWxlXTo6V3JpdGVBbGxUZXh0KCRQYXRoLCAkQ29udGVudCwgJHRleHRFbmNvZGluZykKfQoKZnVuY3Rpb24gTmV3LVF1ZXVlU3RhdGVPYmplY3QgewogICAgW3BzY3VzdG9tb2JqZWN0XVtvcmRlcmVkXUB7CiAgICAgICAgVmVyc2lvbiA9IDAKICAgICAgICBVcGRhdGVkQXQgPSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykKICAgICAgICBDdXJyZW50ID0gJG51bGwKICAgICAgICBRdWV1ZSA9IEAoKQogICAgfQp9CgpmdW5jdGlvbiBSZWFkLVF1ZXVlU3RhdGUgewogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFF1ZXVlU3RhdGVQYXRoKSkgewogICAgICAgIHJldHVybiBOZXctUXVldWVTdGF0ZU9iamVjdAogICAgfQoKICAgIHRyeSB7CiAgICAgICAgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCAkUXVldWVTdGF0ZVBhdGggLVJhdyAtRW5jb2RpbmcgVVRGOAogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRyYXcpKSB7CiAgICAgICAgICAgIHJldHVybiBOZXctUXVldWVTdGF0ZU9iamVjdAogICAgICAgIH0KCiAgICAgICAgJHN0YXRlID0gJHJhdyB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBpZiAoLW5vdCAkc3RhdGUuUFNPYmplY3QuUHJvcGVydGllc1snVmVyc2lvbiddKSB7ICRzdGF0ZSB8IEFkZC1NZW1iZXIgLU5vdGVQcm9wZXJ0eU5hbWUgVmVyc2lvbiAtTm90ZVByb3BlcnR5VmFsdWUgMCB9CiAgICAgICAgaWYgKC1ub3QgJHN0YXRlLlBTT2JqZWN0LlByb3BlcnRpZXNbJ1VwZGF0ZWRBdCddKSB7ICRzdGF0ZSB8IEFkZC1NZW1iZXIgLU5vdGVQcm9wZXJ0eU5hbWUgVXBkYXRlZEF0IC1Ob3RlUHJvcGVydHlWYWx1ZSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykgfQogICAgICAgIGlmICgtbm90ICRzdGF0ZS5QU09iamVjdC5Qcm9wZXJ0aWVzWydDdXJyZW50J10pIHsgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBDdXJyZW50IC1Ob3RlUHJvcGVydHlWYWx1ZSAkbnVsbCB9CiAgICAgICAgaWYgKC1ub3QgJHN0YXRlLlBTT2JqZWN0LlByb3BlcnRpZXNbJ1F1ZXVlJ10pIHsKICAgICAgICAgICAgJHN0YXRlIHwgQWRkLU1lbWJlciAtTm90ZVByb3BlcnR5TmFtZSBRdWV1ZSAtTm90ZVByb3BlcnR5VmFsdWUgQCgpCiAgICAgICAgfQogICAgICAgIGVsc2VpZiAoLW5vdCAkc3RhdGUuUXVldWUpIHsKICAgICAgICAgICAgJHN0YXRlLlF1ZXVlID0gQCgpCiAgICAgICAgfQogICAgICAgIHJldHVybiAkc3RhdGUKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIHF1ZXVlIHN0YXRlOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICAgICAgcmV0dXJuIE5ldy1RdWV1ZVN0YXRlT2JqZWN0CiAgICB9Cn0KCmZ1bmN0aW9uIFdyaXRlLVF1ZXVlU3RhdGUgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRTdGF0ZSkKCiAgICBFbnN1cmUtRGlyZWN0b3J5IC1QYXRoICRCYXNlRGlyCiAgICAkdGVtcFBhdGggPSBKb2luLVBhdGggJEJhc2VEaXIgKCJRdWV1ZS1TdGF0ZS17MH0uanNvbi50bXAiIC1mIFtHdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCdOJykpCiAgICB0cnkgewogICAgICAgICRTdGF0ZSB8IENvbnZlcnRUby1Kc29uIC1EZXB0aCA4IHwgU2V0LUNvbnRlbnQgLUxpdGVyYWxQYXRoICR0ZW1wUGF0aCAtRW5jb2RpbmcgVVRGOAogICAgICAgIE1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBQYXRoIC1EZXN0aW5hdGlvbiAkUXVldWVTdGF0ZVBhdGggLUZvcmNlCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkdGVtcFBhdGgpIHsKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICR0ZW1wUGF0aCAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1XaXRoUXVldWVTdGF0ZUxvY2sgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzY3JpcHRibG9ja10kU2NyaXB0QmxvY2spCgogICAgJG11dGV4ID0gTmV3LU9iamVjdCBTeXN0ZW0uVGhyZWFkaW5nLk11dGV4KCRmYWxzZSwgJFF1ZXVlU3RhdGVNdXRleE5hbWUpCiAgICAkaGFzTG9jayA9ICRmYWxzZQogICAgdHJ5IHsKICAgICAgICAkaGFzTG9jayA9ICRtdXRleC5XYWl0T25lKFtUaW1lU3Bhbl06OkZyb21TZWNvbmRzKDMwKSkKICAgICAgICBpZiAoLW5vdCAkaGFzTG9jaykgewogICAgICAgICAgICB0aHJvdyAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIHF1ZXVlIHN0YXRlIGxvY2sgJyRRdWV1ZVN0YXRlTXV0ZXhOYW1lJy4iCiAgICAgICAgfQoKICAgICAgICAmICRTY3JpcHRCbG9jawogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgaWYgKCRoYXNMb2NrKSB7ICRtdXRleC5SZWxlYXNlTXV0ZXgoKSB9CiAgICAgICAgJG11dGV4LkRpc3Bvc2UoKQogICAgfQp9CgpmdW5jdGlvbiBVcGRhdGUtUXVldWVTdGF0ZSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3NjcmlwdGJsb2NrXSRTY3JpcHRCbG9jaykKCiAgICBJbnZva2UtV2l0aFF1ZXVlU3RhdGVMb2NrIC1TY3JpcHRCbG9jayB7CiAgICAgICAgJHN0YXRlID0gUmVhZC1RdWV1ZVN0YXRlCiAgICAgICAgJiAkU2NyaXB0QmxvY2sgJHN0YXRlCiAgICAgICAgJHN0YXRlLlZlcnNpb24gPSBbaW50NjRdJHN0YXRlLlZlcnNpb24gKyAxCiAgICAgICAgJHN0YXRlLlVwZGF0ZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgIFdyaXRlLVF1ZXVlU3RhdGUgLVN0YXRlICRzdGF0ZQogICAgICAgIHJldHVybiAkc3RhdGUKICAgIH0KfQoKZnVuY3Rpb24gR2V0LVF1ZXVlU3RhdGVTbmFwc2hvdCB7CiAgICBJbnZva2UtV2l0aFF1ZXVlU3RhdGVMb2NrIC1TY3JpcHRCbG9jayB7IFJlYWQtUXVldWVTdGF0ZSB9Cn0KCmZ1bmN0aW9uIE5ldy1RdWV1ZUl0ZW0gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcsJ1VwZ3JhZGVBbGwnKV1bc3RyaW5nXSRBY3Rpb24sCiAgICAgICAgW3N0cmluZ10kQWxpYXMsCiAgICAgICAgW3N0cmluZ10kUGFja2FnZUlkLAogICAgICAgIFtzdHJpbmddJERpc3BsYXlOYW1lLAogICAgICAgIFtWYWxpZGF0ZVNldCgnVXNlcicsJ1JlcXVpcmVkJywnU3lzdGVtJyldW3N0cmluZ10kU291cmNlID0gJ1VzZXInLAogICAgICAgIFtib29sXSRSZXF1aXJlZCA9ICRmYWxzZSwKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeVNpZAogICAgKQoKICAgIFtwc2N1c3RvbW9iamVjdF1bb3JkZXJlZF1AewogICAgICAgIElkID0gW0d1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoJ04nKQogICAgICAgIEFjdGlvbiA9ICRBY3Rpb24KICAgICAgICBBbGlhcyA9ICRBbGlhcwogICAgICAgIFBhY2thZ2VJZCA9ICRQYWNrYWdlSWQKICAgICAgICBEaXNwbGF5TmFtZSA9ICREaXNwbGF5TmFtZQogICAgICAgIFNvdXJjZSA9ICRTb3VyY2UKICAgICAgICBSZXF1aXJlZCA9IFtib29sXSRSZXF1aXJlZAogICAgICAgIFJlcXVlc3RlZEJ5ID0gJFJlcXVlc3RlZEJ5CiAgICAgICAgUmVxdWVzdGVkQnlTaWQgPSAkUmVxdWVzdGVkQnlTaWQKICAgICAgICBTdGF0ZSA9ICdRdWV1ZWQnCiAgICAgICAgU3RhZ2UgPSAnUXVldWVkJwogICAgICAgIFN0YWdlVGV4dCA9ICdJbiBXYXJ0ZXNjaGxhbmdlJwogICAgICAgIFByb2dyZXNzUGVyY2VudCA9ICRudWxsCiAgICAgICAgSXNJbmRldGVybWluYXRlID0gJGZhbHNlCiAgICAgICAgQ3JlYXRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgU3RhcnRlZEF0ID0gJG51bGwKICAgICAgICBGaW5pc2hlZEF0ID0gJG51bGwKICAgICAgICBFeGl0Q29kZSA9ICRudWxsCiAgICAgICAgTWVzc2FnZSA9ICRudWxsCiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSB7CiAgICBwYXJhbShbc3RyaW5nXSRMaW5lKQoKICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRMaW5lKSkgeyByZXR1cm4gJG51bGwgfQogICAgJG1hdGNoID0gW3JlZ2V4XTo6TWF0Y2goJExpbmUsICcoPzwhXGQpKDEwMHxbMS05XT9cZCkoPzpbXC4sXVxkKyk/XHMqJScpCiAgICBpZiAoLW5vdCAkbWF0Y2guU3VjY2VzcykgeyByZXR1cm4gJG51bGwgfQogICAgJHJhdyA9ICRtYXRjaC5Hcm91cHNbMV0uVmFsdWUKICAgICR2YWx1ZSA9IFtpbnRdJHJhdwogICAgaWYgKCR2YWx1ZSAtbHQgMCkgeyByZXR1cm4gMCB9CiAgICBpZiAoJHZhbHVlIC1ndCAxMDApIHsgcmV0dXJuIDEwMCB9CiAgICByZXR1cm4gJHZhbHVlCn0KCmZ1bmN0aW9uIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kSWQsCiAgICAgICAgW3N0cmluZ10kU3RhZ2UgPSAnUnVubmluZycsCiAgICAgICAgW3N0cmluZ10kU3RhZ2VUZXh0ID0gJ0FrdGlvbiBsw6R1ZnQuLi4nLAogICAgICAgIFtOdWxsYWJsZVtpbnRdXSRQcm9ncmVzc1BlcmNlbnQsCiAgICAgICAgW2Jvb2xdJElzSW5kZXRlcm1pbmF0ZSA9ICR0cnVlCiAgICApCgogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiBAKCRzdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uSWQgLWVxICRJZCkgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2UgPSAkU3RhZ2UKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlVGV4dCA9ICRTdGFnZVRleHQKICAgICAgICAgICAgICAgICRpdGVtLlByb2dyZXNzUGVyY2VudCA9ICRQcm9ncmVzc1BlcmNlbnQKICAgICAgICAgICAgICAgICRpdGVtLklzSW5kZXRlcm1pbmF0ZSA9ICRJc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgICRzdGF0ZS5DdXJyZW50ID0gW3BzY3VzdG9tb2JqZWN0XVtvcmRlcmVkXUB7CiAgICAgICAgICAgICAgICAgICAgSWQgPSAkaXRlbS5JZAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9ICRpdGVtLkFjdGlvbgogICAgICAgICAgICAgICAgICAgIEFsaWFzID0gJGl0ZW0uQWxpYXMKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9ICRpdGVtLkRpc3BsYXlOYW1lCiAgICAgICAgICAgICAgICAgICAgU3RhZ2UgPSAkU3RhZ2UKICAgICAgICAgICAgICAgICAgICBTdGFnZVRleHQgPSAkU3RhZ2VUZXh0CiAgICAgICAgICAgICAgICAgICAgUHJvZ3Jlc3NQZXJjZW50ID0gJFByb2dyZXNzUGVyY2VudAogICAgICAgICAgICAgICAgICAgIElzSW5kZXRlcm1pbmF0ZSA9ICRJc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEdldC1SZXF1aXJlZEFsaWFzU2V0IHsKICAgICRzZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICBmb3JlYWNoICgkYWxpYXMgaW4gQChHZXQtUmVxdWlyZWRBbGlhc2VzKSkgewogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGFsaWFzKSkgewogICAgICAgICAgICBbdm9pZF0kc2V0LkFkZChbc3RyaW5nXSRhbGlhcykKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJHNldAp9CgpmdW5jdGlvbiBBZGQtUXVldWVJdGVtIHsKICAgIHBhcmFtKFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV0kSXRlbSkKCiAgICAkcmVzdWx0ID0gJG51bGwKICAgICRudWxsID0gVXBkYXRlLVF1ZXVlU3RhdGUgLVNjcmlwdEJsb2NrIHsKICAgICAgICBwYXJhbSgkc3RhdGUpCiAgICAgICAgJHF1ZXVlID0gQCgkc3RhdGUuUXVldWUpCgogICAgICAgIGZvcmVhY2ggKCRleGlzdGluZyBpbiAkcXVldWUpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGV4aXN0aW5nKSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgaWYgKCRleGlzdGluZy5TdGF0ZSAtaW4gQCgnUXVldWVkJywnUnVubmluZycpIC1hbmQgJGV4aXN0aW5nLkFjdGlvbiAtZXEgJEl0ZW0uQWN0aW9uIC1hbmQgW3N0cmluZ106OkVxdWFscyhbc3RyaW5nXSRleGlzdGluZy5BbGlhcywgW3N0cmluZ10kSXRlbS5BbGlhcywgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKSB7CiAgICAgICAgICAgICAgICAkc2NyaXB0OlF1ZXVlQWRkUmVzdWx0ID0gW3BzY3VzdG9tb2JqZWN0XUB7IEFkZGVkID0gJGZhbHNlOyBJdGVtID0gJGV4aXN0aW5nIH0KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkc3RhdGUuUXVldWUgPSBAKCRxdWV1ZSArICRJdGVtKQogICAgICAgICRzY3JpcHQ6UXVldWVBZGRSZXN1bHQgPSBbcHNjdXN0b21vYmplY3RdQHsgQWRkZWQgPSAkdHJ1ZTsgSXRlbSA9ICRJdGVtIH0KICAgIH0KCiAgICAkcmVzdWx0ID0gJHNjcmlwdDpRdWV1ZUFkZFJlc3VsdAogICAgJHNjcmlwdDpRdWV1ZUFkZFJlc3VsdCA9ICRudWxsCiAgICByZXR1cm4gJHJlc3VsdAp9CgpmdW5jdGlvbiBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1ZhbGlkYXRlU2V0KCdJbnN0YWxsJywnVW5pbnN0YWxsJyldW3N0cmluZ10kQWN0aW9uLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRBbGlhcywKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeSwKICAgICAgICBbc3RyaW5nXSRSZXF1ZXN0ZWRCeVNpZCwKICAgICAgICBbVmFsaWRhdGVTZXQoJ1VzZXInLCdSZXF1aXJlZCcpXVtzdHJpbmddJFNvdXJjZSA9ICdVc2VyJwogICAgKQoKICAgICRub3JtYWxpemVkQWxpYXMgPSAkQWxpYXMuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQogICAgJGFwcCA9IEdldC1BcHBDYXRhbG9nT2JqZWN0QnlBbGlhcyAtQWxpYXMgJG5vcm1hbGl6ZWRBbGlhcwogICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgIHRocm93ICJBbGlhcyAnJG5vcm1hbGl6ZWRBbGlhcycgaXMgbm90IGluIHRoZSBhbGxvd2xpc3QuIgogICAgfQoKICAgICRyZXF1aXJlZFNldCA9IEdldC1SZXF1aXJlZEFsaWFzU2V0CiAgICAkaXNSZXF1aXJlZCA9ICRyZXF1aXJlZFNldC5Db250YWlucygkbm9ybWFsaXplZEFsaWFzKQogICAgaWYgKCRBY3Rpb24gLWVxICdVbmluc3RhbGwnIC1hbmQgJGlzUmVxdWlyZWQpIHsKICAgICAgICB0aHJvdyAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgenVyIERlaW5zdGFsbGF0aW9uIGFuZ2VmcmFndCB3ZXJkZW4uJwogICAgfQoKICAgICRpdGVtID0gTmV3LVF1ZXVlSXRlbSBgCiAgICAgICAgLUFjdGlvbiAkQWN0aW9uIGAKICAgICAgICAtQWxpYXMgJG5vcm1hbGl6ZWRBbGlhcyBgCiAgICAgICAgLVBhY2thZ2VJZCAoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkgYAogICAgICAgIC1EaXNwbGF5TmFtZSAoW3N0cmluZ10kYXBwLkRpc3BsYXlOYW1lKSBgCiAgICAgICAgLVNvdXJjZSAkU291cmNlIGAKICAgICAgICAtUmVxdWlyZWQ6JGlzUmVxdWlyZWQgYAogICAgICAgIC1SZXF1ZXN0ZWRCeSAkUmVxdWVzdGVkQnkgYAogICAgICAgIC1SZXF1ZXN0ZWRCeVNpZCAkUmVxdWVzdGVkQnlTaWQKCiAgICByZXR1cm4gQWRkLVF1ZXVlSXRlbSAtSXRlbSAkaXRlbQp9CgpmdW5jdGlvbiBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZCB7CiAgICAkYWRkZWRDb3VudCA9IDAKICAgIGlmICgtbm90IChUZXN0LVNvZnR3YXJlQ2F0YWxvZ1BvbGljeUVuYWJsZWQpKSB7IHJldHVybiAwIH0KICAgIGlmICgtbm90IChUZXN0LVJlcXVpcmVkRW5mb3JjZW1lbnRFbmFibGVkKSkgeyByZXR1cm4gMCB9CgogICAgJGluc3RhbGxlZFNldCA9IEdldC1JbnN0YWxsZWRQYWNrYWdlSWRTZXQKICAgIGZvcmVhY2ggKCRhbGlhcyBpbiBAKEdldC1SZXF1aXJlZEFsaWFzZXMpKSB7CiAgICAgICAgJGFwcCA9IEdldC1BcHBDYXRhbG9nT2JqZWN0QnlBbGlhcyAtQWxpYXMgJGFsaWFzCiAgICAgICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlJlcXVpcmVkIGFsaWFzICckYWxpYXMnIGlzIG5vdCBwcmVzZW50IGluIGNhdGFsb2cgcG9saWN5OyBza2lwcGluZy4iICdXQVJOJwogICAgICAgICAgICBjb250aW51ZQogICAgICAgIH0KCiAgICAgICAgaWYgKCRpbnN0YWxsZWRTZXQuQ29udGFpbnMoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkpIHsKICAgICAgICAgICAgY29udGludWUKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSAtQWN0aW9uIEluc3RhbGwgLUFsaWFzICRhbGlhcyAtUmVxdWVzdGVkQnkgJ1BvbGljeScgLVJlcXVlc3RlZEJ5U2lkICdQb2xpY3knIC1Tb3VyY2UgUmVxdWlyZWQKICAgICAgICBpZiAoJHJlc3VsdCAtYW5kICRyZXN1bHQuQWRkZWQpIHsKICAgICAgICAgICAgJGFkZGVkQ291bnQrKwogICAgICAgICAgICBXcml0ZS1Mb2cgIlF1ZXVlZCByZXF1aXJlZCBzb2Z0d2FyZSBhbGlhcyAnJGFsaWFzJyBwYWNrYWdlICckKCRhcHAuUGFja2FnZUlkKScuIgogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJGFkZGVkQ291bnQKfQoKZnVuY3Rpb24gSW52b2tlLVdpdGhXaW5nZXRMb2NrIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc2NyaXB0YmxvY2tdJFNjcmlwdEJsb2NrLAogICAgICAgIFtpbnRdJFRpbWVvdXRTZWNvbmRzID0gNzIwMAogICAgKQoKICAgICRtdXRleCA9IE5ldy1PYmplY3QgU3lzdGVtLlRocmVhZGluZy5NdXRleCgkZmFsc2UsICRXaW5nZXRNdXRleE5hbWUpCiAgICAkaGFzTG9jayA9ICRmYWxzZQoKICAgIHRyeSB7CiAgICAgICAgJGhhc0xvY2sgPSAkbXV0ZXguV2FpdE9uZShbVGltZVNwYW5dOjpGcm9tU2Vjb25kcygkVGltZW91dFNlY29uZHMpKQogICAgICAgIGlmICgtbm90ICRoYXNMb2NrKSB7CiAgICAgICAgICAgIHRocm93ICJUaW1lZCBvdXQgd2FpdGluZyBmb3Igd2luZ2V0IGxvY2sgJyRXaW5nZXRNdXRleE5hbWUnLiIKICAgICAgICB9CgogICAgICAgICYgJFNjcmlwdEJsb2NrCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoJGhhc0xvY2spIHsKICAgICAgICAgICAgJG11dGV4LlJlbGVhc2VNdXRleCgpCiAgICAgICAgfQogICAgICAgICRtdXRleC5EaXNwb3NlKCkKICAgIH0KfQoKZnVuY3Rpb24gVGVzdC1XaW5nZXRMb2NrQXZhaWxhYmxlIHsKICAgICRtdXRleCA9IE5ldy1PYmplY3QgU3lzdGVtLlRocmVhZGluZy5NdXRleCgkZmFsc2UsICRXaW5nZXRNdXRleE5hbWUpCiAgICAkaGFzTG9jayA9ICRmYWxzZQoKICAgIHRyeSB7CiAgICAgICAgJGhhc0xvY2sgPSAkbXV0ZXguV2FpdE9uZSgwKQogICAgICAgIHJldHVybiAkaGFzTG9jawogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgaWYgKCRoYXNMb2NrKSB7CiAgICAgICAgICAgICRtdXRleC5SZWxlYXNlTXV0ZXgoKQogICAgICAgIH0KICAgICAgICAkbXV0ZXguRGlzcG9zZSgpCiAgICB9Cn0KCmZ1bmN0aW9uIENvbnZlcnRUby1Qcm9jZXNzQXJndW1lbnQgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFZhbHVlKQoKICAgIGlmICgkVmFsdWUgLW1hdGNoICdbXHMiXScpIHsKICAgICAgICByZXR1cm4gJyJ7MH0iJyAtZiAoJFZhbHVlLlJlcGxhY2UoJyInLCAnXCInKSkKICAgIH0KCiAgICByZXR1cm4gJFZhbHVlCn0KCmZ1bmN0aW9uIEdldC1Xb3JrZXJTY3JpcHRQYXRoIHsKICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRMb2NhbFNjcmlwdFBhdGgpIHsKICAgICAgICByZXR1cm4gJExvY2FsU2NyaXB0UGF0aAogICAgfQoKICAgIGlmICgkUFNDb21tYW5kUGF0aCAtYW5kIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRQU0NvbW1hbmRQYXRoKSkgewogICAgICAgIHJldHVybiAkUFNDb21tYW5kUGF0aAogICAgfQoKICAgIHRocm93ICdDb3VsZCBub3QgZGV0ZXJtaW5lIHdvcmtlciBzY3JpcHQgcGF0aC4nCn0KCmZ1bmN0aW9uIFN0YXJ0LVNvZnR3YXJla2F0YWxvZ1dvcmtlciB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1ZhbGlkYXRlU2V0KCdBcHBseVBvbGljeScsJ1Byb2Nlc3NSZXF1ZXN0JywnUHJvY2Vzc1F1ZXVlJyldW3N0cmluZ10kV29ya2VyTW9kZSwKICAgICAgICBbVmFsaWRhdGVTZXQoJ0luc3RhbGwnLCdVbmluc3RhbGwnKV1bc3RyaW5nXSRXb3JrZXJBY3Rpb24gPSAnSW5zdGFsbCcsCiAgICAgICAgW3N0cmluZ10kV29ya2VyQWxpYXMsCiAgICAgICAgW3N0cmluZ10kV29ya2VyUmVxdWVzdGVkQnksCiAgICAgICAgW3N0cmluZ10kV29ya2VyUmVxdWVzdGVkQnlTaWQKICAgICkKCiAgICAkd29ya2VyU2NyaXB0ID0gR2V0LVdvcmtlclNjcmlwdFBhdGgKICAgICRhcmdzID0gQCgKICAgICAgICAnLU5vUHJvZmlsZScsCiAgICAgICAgJy1FeGVjdXRpb25Qb2xpY3knLCAnQnlwYXNzJywKICAgICAgICAnLUZpbGUnLCAkd29ya2VyU2NyaXB0LAogICAgICAgICctTW9kZScsICRXb3JrZXJNb2RlCiAgICApCgogICAgaWYgKCRXb3JrZXJNb2RlIC1lcSAnUHJvY2Vzc1JlcXVlc3QnKSB7CiAgICAgICAgJGFyZ3MgKz0gQCgnLVJlcXVlc3RBY3Rpb24nLCAkV29ya2VyQWN0aW9uLCAnLUFwcEFsaWFzJywgJFdvcmtlckFsaWFzKQoKICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRXb3JrZXJSZXF1ZXN0ZWRCeSkpIHsKICAgICAgICAgICAgJGFyZ3MgKz0gQCgnLVJlcXVlc3RlZEJ5JywgJFdvcmtlclJlcXVlc3RlZEJ5KQogICAgICAgIH0KCiAgICAgICAgaWYgKC1ub3QgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkV29ya2VyUmVxdWVzdGVkQnlTaWQpKSB7CiAgICAgICAgICAgICRhcmdzICs9IEAoJy1SZXF1ZXN0ZWRCeVNpZCcsICRXb3JrZXJSZXF1ZXN0ZWRCeVNpZCkKICAgICAgICB9CiAgICB9CgogICAgJGFyZ3VtZW50TGluZSA9IChAKCRhcmdzKSB8IEZvckVhY2gtT2JqZWN0IHsgQ29udmVydFRvLVByb2Nlc3NBcmd1bWVudCAtVmFsdWUgKFtzdHJpbmddJF8pIH0pIC1qb2luICcgJwogICAgU3RhcnQtUHJvY2VzcyAtRmlsZVBhdGggJFBvd2VyU2hlbGxFeGUgLUFyZ3VtZW50TGlzdCAkYXJndW1lbnRMaW5lIC1XaW5kb3dTdHlsZSBIaWRkZW4gfCBPdXQtTnVsbAp9CgpmdW5jdGlvbiBTdGFydC1RdWV1ZVdvcmtlciB7CiAgICBTdGFydC1Tb2Z0d2FyZWthdGFsb2dXb3JrZXIgLVdvcmtlck1vZGUgUHJvY2Vzc1F1ZXVlCn0KCmZ1bmN0aW9uIEFkZC1EYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXIgewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnQXBwbHlQb2xpY3knLCdQcm9jZXNzUXVldWUnKV1bc3RyaW5nXSRXb3JrZXJNb2RlKQoKICAgIGlmICgtbm90ICRzY3JpcHQ6RGFlbW9uUG9zdFJlc3BvbnNlV29ya2VycykgewogICAgICAgICRzY3JpcHQ6RGFlbW9uUG9zdFJlc3BvbnNlV29ya2VycyA9IEAoKQogICAgfQogICAgJHNjcmlwdDpEYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXJzID0gQCgkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgKyAkV29ya2VyTW9kZSkKfQoKZnVuY3Rpb24gSW52b2tlLURhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgewogICAgZm9yZWFjaCAoJHdvcmtlck1vZGUgaW4gQCgkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgfCBTZWxlY3QtT2JqZWN0IC1VbmlxdWUpKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgU3RhcnQtU29mdHdhcmVrYXRhbG9nV29ya2VyIC1Xb3JrZXJNb2RlICR3b3JrZXJNb2RlCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3Qgc3RhcnQgcG9zdC1yZXNwb25zZSB3b3JrZXIgJyR3b3JrZXJNb2RlJzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIH0KICAgIH0KCiAgICAkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgPSBAKCkKfQoKZnVuY3Rpb24gR2V0LVdpbmdldFBhdGggewogICAgJGNhbmRpZGF0ZXMgPSBAKCkKCiAgICB0cnkgewogICAgICAgICRjbWQgPSBHZXQtQ29tbWFuZCB3aW5nZXQuZXhlIC1FcnJvckFjdGlvbiBTdG9wCiAgICAgICAgaWYgKCRjbWQgLWFuZCAkY21kLlNvdXJjZSkgewogICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY21kLlNvdXJjZQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KCiAgICB0cnkgewogICAgICAgICRwYWNrYWdlcyA9IEdldC1BcHB4UGFja2FnZSAtQWxsVXNlcnMgLU5hbWUgTWljcm9zb2Z0LkRlc2t0b3BBcHBJbnN0YWxsZXIgLUVycm9yQWN0aW9uIFN0b3AgfAogICAgICAgICAgICBXaGVyZS1PYmplY3QgeyAkXy5JbnN0YWxsTG9jYXRpb24gfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IFZlcnNpb24gLURlc2NlbmRpbmcKCiAgICAgICAgZm9yZWFjaCAoJHBhY2thZ2UgaW4gJHBhY2thZ2VzKSB7CiAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJHBhY2thZ2UuSW5zdGFsbExvY2F0aW9uICd3aW5nZXQuZXhlJwogICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlcyArPSAkY2FuZGlkYXRlCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgJHdpbmRvd3NBcHBzUm9vdCA9IEpvaW4tUGF0aCAkZW52OlByb2dyYW1GaWxlcyAnV2luZG93c0FwcHMnCiAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkd2luZG93c0FwcHNSb290KSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJGl0ZW1zID0gR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGggJHdpbmRvd3NBcHBzUm9vdCAtRGlyZWN0b3J5IC1FcnJvckFjdGlvbiBTdG9wIHwKICAgICAgICAgICAgICAgIFdoZXJlLU9iamVjdCB7ICRfLk5hbWUgLWxpa2UgJ01pY3Jvc29mdC5EZXNrdG9wQXBwSW5zdGFsbGVyXypfOHdla3liM2Q4YmJ3ZScgfSB8CiAgICAgICAgICAgICAgICBTb3J0LU9iamVjdCBOYW1lIC1EZXNjZW5kaW5nCgogICAgICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiAkaXRlbXMpIHsKICAgICAgICAgICAgICAgICRjYW5kaWRhdGUgPSBKb2luLVBhdGggJGl0ZW0uRnVsbE5hbWUgJ3dpbmdldC5leGUnCiAgICAgICAgICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgJGNhbmRpZGF0ZXMgKz0gJGNhbmRpZGF0ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9CgogICAgJHJlc29sdmVkID0gJGNhbmRpZGF0ZXMgfCBTZWxlY3QtT2JqZWN0IC1VbmlxdWUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxCiAgICByZXR1cm4gJHJlc29sdmVkCn0KCmZ1bmN0aW9uIEVuc3VyZS1XaW5nZXRBdmFpbGFibGUgewogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYWxyZWFkeSBhdmFpbGFibGUgYXQ6ICR3aW5nZXRQYXRoIgogICAgICAgIHJldHVybiAkd2luZ2V0UGF0aAogICAgfQoKICAgIFdyaXRlLUxvZyAnd2luZ2V0LmV4ZSBub3QgZm91bmQuJwoKICAgICRpc0xvY2FsU3lzdGVtID0gJGZhbHNlCiAgICB0cnkgewogICAgICAgICRpc0xvY2FsU3lzdGVtID0gW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuV2luZG93c0lkZW50aXR5XTo6R2V0Q3VycmVudCgpLklzU3lzdGVtCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CgogICAgaWYgKCRpc0xvY2FsU3lzdGVtKSB7CiAgICAgICAgV3JpdGUtTG9nICJBcHAgSW5zdGFsbGVyIHBhY2thZ2UgcmVnaXN0cmF0aW9uIGNhbm5vdCBydW4gYXMgTG9jYWxTeXN0ZW07IHNraXBwaW5nIEFkZC1BcHB4UGFja2FnZSBmYWxsYmFjayBmb3IgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iICdFUlJPUicKICAgICAgICBXcml0ZS1Mb2cgJ3dpbmdldCBpcyB1bmF2YWlsYWJsZS4gSW5zdGFsbC9wcm92aXNpb24gQXBwIEluc3RhbGxlciwgb3IgdmVyaWZ5IHdpbmdldCBwYXRoIGRpc2NvdmVyeSBmb3IgdGhpcyBkZXZpY2UuJyAnRVJST1InCiAgICAgICAgcmV0dXJuICRudWxsCiAgICB9CgogICAgV3JpdGUtTG9nICJBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIEFwcCBJbnN0YWxsZXIgcGFja2FnZSBmYW1pbHkgJyRBcHBJbnN0YWxsZXJGYW1pbHlOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBBZGQtQXBweFBhY2thZ2UgLVJlZ2lzdGVyQnlGYW1pbHlOYW1lIC1NYWluUGFja2FnZSAkQXBwSW5zdGFsbGVyRmFtaWx5TmFtZQogICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDMKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkFkZC1BcHB4UGFja2FnZSByZWdpc3RyYXRpb24gYXR0ZW1wdCBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CgogICAgJHdpbmdldFBhdGggPSBHZXQtV2luZ2V0UGF0aAogICAgaWYgKCR3aW5nZXRQYXRoKSB7CiAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQgYmVjYW1lIGF2YWlsYWJsZSBhZnRlciBBcHAgSW5zdGFsbGVyIHJlZ2lzdHJhdGlvbjogJHdpbmdldFBhdGgiCiAgICAgICAgcmV0dXJuICR3aW5nZXRQYXRoCiAgICB9CgogICAgV3JpdGUtTG9nICJ3aW5nZXQgaXMgc3RpbGwgdW5hdmFpbGFibGUgYWZ0ZXIgQXBwIEluc3RhbGxlciByZWdpc3RyYXRpb24gYXR0ZW1wdC4iICdFUlJPUicKICAgIHJldHVybiAkbnVsbAp9CgpmdW5jdGlvbiBOZXctVXNlclJlcXVlc3RUb29sIHsKICAgICRwaXBlTGl0ZXJhbCAgID0gJFBpcGVOYW1lLlJlcGxhY2UoIiciLCAiJyciKQoKJGNvbnRlbnQgPSBAIgpbQ21kbGV0QmluZGluZygpXQpwYXJhbSgKICAgIFtzdHJpbmddYCRBcHBBbGlhcywKICAgIFtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXQogICAgW3N0cmluZ11gJEFjdGlvbiA9ICdJbnN0YWxsJywKICAgIFtzd2l0Y2hdYCRVbmluc3RhbGwsCiAgICBbc3dpdGNoXWAkTGlzdAopCgpTZXQtU3RyaWN0TW9kZSAtVmVyc2lvbiBMYXRlc3QKYCRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCmAkUGlwZU5hbWUgPSAnJHBpcGVMaXRlcmFsJwoKZnVuY3Rpb24gSW52b2tlLUNhdGFsb2dEYWVtb24gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1bc3RyaW5nXWAkQ29tbWFuZCwKICAgICAgICBbc3RyaW5nXWAkQWxpYXMKICAgICkKCiAgICBgJHBheWxvYWQgPSBbb3JkZXJlZF1AewogICAgICAgIENvbW1hbmQgID0gYCRDb21tYW5kCiAgICAgICAgQXBwQWxpYXMgPSBgJEFsaWFzCiAgICB9CiAgICBgJGpzb24gPSBgJHBheWxvYWQgfCBDb252ZXJ0VG8tSnNvbiAtQ29tcHJlc3MKCiAgICBgJGVuY29kaW5nID0gTmV3LU9iamVjdCBTeXN0ZW0uVGV4dC5VVEY4RW5jb2RpbmcoYCRmYWxzZSkKICAgIGAkY2xpZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uUGlwZXMuTmFtZWRQaXBlQ2xpZW50U3RyZWFtIC1Bcmd1bWVudExpc3QgQCgKICAgICAgICAnLicsCiAgICAgICAgYCRQaXBlTmFtZSwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVEaXJlY3Rpb25dOjpJbk91dCwKICAgICAgICBbU3lzdGVtLklPLlBpcGVzLlBpcGVPcHRpb25zXTo6Tm9uZSwKICAgICAgICBbU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5Ub2tlbkltcGVyc29uYXRpb25MZXZlbF06OkltcGVyc29uYXRpb24KICAgICkKCiAgICB0cnkgewogICAgICAgIGAkY2xpZW50LkNvbm5lY3QoMTAwMDApCiAgICAgICAgYCRyZWFkZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1SZWFkZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1Xcml0ZXIoYCRjbGllbnQsIGAkZW5jb2RpbmcpCiAgICAgICAgYCR3cml0ZXIuQXV0b0ZsdXNoID0gYCR0cnVlCiAgICAgICAgYCR3cml0ZXIuV3JpdGVMaW5lKGAkanNvbikKCiAgICAgICAgYCRyZWFkVGFzayA9IGAkcmVhZGVyLlJlYWRMaW5lQXN5bmMoKQogICAgICAgIGlmICgtbm90IGAkcmVhZFRhc2suV2FpdCgxNTAwMCkpIHsKICAgICAgICAgICAgdGhyb3cgJ1plaXTDvGJlcnNjaHJlaXR1bmcgYmVpbSBXYXJ0ZW4gYXVmIEFudHdvcnQgZGVzIFNvZnR3YXJla2F0YWxvZy1EaWVuc3Rlcy4nCiAgICAgICAgfQogICAgICAgIGAkbGluZSA9IGAkcmVhZFRhc2suUmVzdWx0CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRsaW5lKSkgewogICAgICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaGF0IGtlaW5lIEFudHdvcnQgZ2VzZW5kZXQuJwogICAgICAgIH0KCiAgICAgICAgYCRyZXNwb25zZSA9IGAkbGluZSB8IENvbnZlcnRGcm9tLUpzb24KICAgICAgICBpZiAoLW5vdCBgJHJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgdGhyb3cgKFtzdHJpbmddYCRyZXNwb25zZS5NZXNzYWdlKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGAkcmVzcG9uc2UKICAgIH0KICAgIGNhdGNoIFtTeXN0ZW0uVGltZW91dEV4Y2VwdGlvbl0gewogICAgICAgIHRocm93ICdEZXIgU29mdHdhcmVrYXRhbG9nLURpZW5zdCBpc3QgbmljaHQgZXJyZWljaGJhciBvZGVyIHN0YXJ0ZXQgbm9jaC4gQml0dGUgdmVyc3VjaGVuIFNpZSBlcyBlcm5ldXQuJwogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgYCRjbGllbnQuRGlzcG9zZSgpCiAgICB9Cn0KCmlmIChgJFVuaW5zdGFsbCkgewogICAgYCRBY3Rpb24gPSAnVW5pbnN0YWxsJwp9CgppZiAoYCRMaXN0KSB7CiAgICBgJHJlc3BvbnNlID0gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgJ0dldENhdGFsb2cnCiAgICBXcml0ZS1Ib3N0ICdGcmVpZ2VnZWJlbmUgQW53ZW5kdW5nZW46JwogICAgQChgJHJlc3BvbnNlLkNhdGFsb2cpIHwgU29ydC1PYmplY3QgRGlzcGxheU5hbWUgfCBGb3JFYWNoLU9iamVjdCB7CiAgICAgICAgV3JpdGUtSG9zdCAoIiAtIHswfSBbezF9XSA6IHsyfSIgLWYgYCRfLkRpc3BsYXlOYW1lLCBgJF8uQWxpYXMsIGAkXy5EZXNjcmlwdGlvbikKICAgIH0KICAgIGV4aXQgMAp9CgppZiAoLW5vdCBgJEFwcEFsaWFzKSB7CiAgICB0aHJvdyAnU2llIG3DvHNzZW4gLUFwcEFsaWFzIGFuZ2ViZW4gb2RlciAtTGlzdCB2ZXJ3ZW5kZW4uJwp9CgpgJGFsaWFzID0gYCRBcHBBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCmAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCBgJEFjdGlvbiAtQWxpYXMgYCRhbGlhcwoKaWYgKGAkQWN0aW9uIC1lcSAnVW5pbnN0YWxsJykgewogICAgV3JpdGUtSG9zdCAiRGVpbnN0YWxsYXRpb24gZsO8ciAnYCRhbGlhcycgZWluZ2VyZWlodC4iCn0KZWxzZSB7CiAgICBXcml0ZS1Ib3N0ICJJbnN0YWxsYXRpb24gZsO8ciAnYCRhbGlhcycgZWluZ2VyZWlodC4iCn0KCmlmIChgJHJlc3BvbnNlLk1lc3NhZ2UpIHsKICAgIFdyaXRlLUhvc3QgYCRyZXNwb25zZS5NZXNzYWdlCn0KIkAKCiAgICBXcml0ZS1UZXh0RmlsZSAtUGF0aCAkUmVxdWVzdFRvb2xQYXRoIC1Db250ZW50ICRjb250ZW50IC1FbmNvZGluZyBVdGY4Qm9tCiAgICBTZXQtRmlsZUFjbEFkbWluc09ubHkgLVBhdGggJFJlcXVlc3RUb29sUGF0aAp9CgpmdW5jdGlvbiBOZXctQ2F0YWxvZ0d1aSB7CiAgICAkcGlwZUxpdGVyYWwgICAgICA9ICRQaXBlTmFtZS5SZXBsYWNlKCInIiwgIicnIikKICAgICR0aXRsZUxpdGVyYWwgICAgID0gJENhdGFsb2dEaXNwbGF5TmFtZS5SZXBsYWNlKCInIiwgIicnIikKICAgICRsb2dMaXRlcmFsICAgICAgID0gJExvZ0ZpbGUuUmVwbGFjZSgiJyIsICInJyIpCiAgICAkaW5zdGFsbGVkTGl0ZXJhbCA9ICRJbnN0YWxsZWRQYWNrYWdlc1BhdGguUmVwbGFjZSgiJyIsICInJyIpCiAgICAkcXVldWVTdGF0ZUxpdGVyYWwgPSAkUXVldWVTdGF0ZVBhdGguUmVwbGFjZSgiJyIsICInJyIpCgokY29udGVudCA9IEAiCkFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLldpbmRvd3MuRm9ybXMKQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uRHJhd2luZwpbU3lzdGVtLldpbmRvd3MuRm9ybXMuQXBwbGljYXRpb25dOjpFbmFibGVWaXN1YWxTdHlsZXMoKQoKaWYgKC1ub3QgKCdMaXN0Vmlld0NvbHVtblNvcnRlcicgLWFzIFt0eXBlXSkpIHsKQWRkLVR5cGUgLVR5cGVEZWZpbml0aW9uIEAnCnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwp1c2luZyBTeXN0ZW0uV2luZG93cy5Gb3JtczsKCnB1YmxpYyBjbGFzcyBMaXN0Vmlld0NvbHVtblNvcnRlciA6IElDb21wYXJlciB7CiAgICBwdWJsaWMgaW50IENvbHVtbiA9IDA7CiAgICBwdWJsaWMgU29ydE9yZGVyIE9yZGVyID0gU29ydE9yZGVyLkFzY2VuZGluZzsKCiAgICBwdWJsaWMgaW50IENvbXBhcmUob2JqZWN0IHgsIG9iamVjdCB5KSB7CiAgICAgICAgdmFyIGl0ZW1YID0geCBhcyBMaXN0Vmlld0l0ZW07CiAgICAgICAgdmFyIGl0ZW1ZID0geSBhcyBMaXN0Vmlld0l0ZW07CiAgICAgICAgc3RyaW5nIGEgPSBzdHJpbmcuRW1wdHk7CiAgICAgICAgc3RyaW5nIGIgPSBzdHJpbmcuRW1wdHk7CgogICAgICAgIGlmIChpdGVtWCAhPSBudWxsICYmIGl0ZW1YLlN1Ykl0ZW1zLkNvdW50ID4gQ29sdW1uKSB7CiAgICAgICAgICAgIGEgPSBpdGVtWC5TdWJJdGVtc1tDb2x1bW5dLlRleHQ7CiAgICAgICAgfQogICAgICAgIGlmIChpdGVtWSAhPSBudWxsICYmIGl0ZW1ZLlN1Ykl0ZW1zLkNvdW50ID4gQ29sdW1uKSB7CiAgICAgICAgICAgIGIgPSBpdGVtWS5TdWJJdGVtc1tDb2x1bW5dLlRleHQ7CiAgICAgICAgfQoKICAgICAgICBpbnQgcmVzdWx0ID0gU3RyaW5nQ29tcGFyZXIuQ3VycmVudEN1bHR1cmVJZ25vcmVDYXNlLkNvbXBhcmUoYSwgYik7CiAgICAgICAgcmV0dXJuIE9yZGVyID09IFNvcnRPcmRlci5EZXNjZW5kaW5nID8gLXJlc3VsdCA6IHJlc3VsdDsKICAgIH0KfQonQCAtUmVmZXJlbmNlZEFzc2VtYmxpZXMgQCgnU3lzdGVtLmRsbCcsJ1N5c3RlbS5XaW5kb3dzLkZvcm1zLmRsbCcpCn0KCmlmICgtbm90ICgnU2hlbGxJY29uRXh0cmFjdG9yJyAtYXMgW3R5cGVdKSkgewpBZGQtVHlwZSAtVHlwZURlZmluaXRpb24gQCcKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CgpwdWJsaWMgc3RhdGljIGNsYXNzIFNoZWxsSWNvbkV4dHJhY3RvciB7CiAgICBbRGxsSW1wb3J0KCJzaGVsbDMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LlVuaWNvZGUpXQogICAgcHVibGljIHN0YXRpYyBleHRlcm4gdWludCBFeHRyYWN0SWNvbkV4KHN0cmluZyBzekZpbGVOYW1lLCBpbnQgbkljb25JbmRleCwgSW50UHRyW10gcGhpY29uTGFyZ2UsIEludFB0cltdIHBoaWNvblNtYWxsLCB1aW50IG5JY29ucyk7CgogICAgW0RsbEltcG9ydCgidXNlcjMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXQogICAgW3JldHVybjogTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQm9vbCldCnB1YmxpYyBzdGF0aWMgZXh0ZXJuIGJvb2wgRGVzdHJveUljb24oSW50UHRyIGhJY29uKTsKfQonQAp9CgpTZXQtU3RyaWN0TW9kZSAtVmVyc2lvbiBMYXRlc3QKYCRFcnJvckFjdGlvblByZWZlcmVuY2UgPSAnU3RvcCcKCmAkUGlwZU5hbWUgPSAnJHBpcGVMaXRlcmFsJwpgJENhdGFsb2dUaXRsZSA9ICckdGl0bGVMaXRlcmFsJwpgJExvZ0ZpbGUgPSAnJGxvZ0xpdGVyYWwnCmAkSW5zdGFsbGVkUGFja2FnZXNQYXRoID0gJyRpbnN0YWxsZWRMaXRlcmFsJwpgJFF1ZXVlU3RhdGVQYXRoID0gJyRxdWV1ZVN0YXRlTGl0ZXJhbCcKYCRBbGxvd1VzZXJJbnN0YWxscyA9IGAkdHJ1ZQpgJEFsbG93VXNlclVuaW5zdGFsbCA9IGAkdHJ1ZQpgJFJlcXVpcmVkQWxpYXNTZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCmAkTGFzdFN0YXRlVmVyc2lvbiA9IC0xCmAkTGFzdFF1ZXVlID0gQCgpCmAkTGFzdEN1cnJlbnQgPSBgJG51bGwKYCRMYXN0SW5zdGFsbGVkSWRzID0gQCgpCgpmdW5jdGlvbiBTZXQtRm9ybUljb24gewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1gJEZvcm0pCgogICAgYCRsYXJnZSA9IGAkbnVsbAogICAgYCRzbWFsbCA9IGAkbnVsbAoKICAgIHRyeSB7CiAgICAgICAgYCRpY29uRmlsZSA9IEpvaW4tUGF0aCBgJGVudjpTeXN0ZW1Sb290ICdTeXN0ZW0zMlxzaGVsbDMyLmRsbCcKICAgICAgICBgJGxhcmdlID0gTmV3LU9iamVjdCBTeXN0ZW0uSW50UHRyW10gMQogICAgICAgIGAkc21hbGwgPSBOZXctT2JqZWN0IFN5c3RlbS5JbnRQdHJbXSAxCiAgICAgICAgYCRjb3VudCA9IFtTaGVsbEljb25FeHRyYWN0b3JdOjpFeHRyYWN0SWNvbkV4KGAkaWNvbkZpbGUsIDgwLCBgJGxhcmdlLCBgJHNtYWxsLCAxKQoKICAgICAgICBpZiAoYCRjb3VudCAtZ3QgMCkgewogICAgICAgICAgICBgJHVzZUhhbmRsZSA9IFtJbnRQdHJdOjpaZXJvCiAgICAgICAgICAgIGlmIChgJHNtYWxsWzBdIC1uZSBbSW50UHRyXTo6WmVybykgewogICAgICAgICAgICAgICAgYCR1c2VIYW5kbGUgPSBgJHNtYWxsWzBdCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZWlmIChgJGxhcmdlWzBdIC1uZSBbSW50UHRyXTo6WmVybykgewogICAgICAgICAgICAgICAgYCR1c2VIYW5kbGUgPSBgJGxhcmdlWzBdCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChgJHVzZUhhbmRsZSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIGAkaWNvbiA9IFtTeXN0ZW0uRHJhd2luZy5JY29uXTo6RnJvbUhhbmRsZShgJHVzZUhhbmRsZSkKICAgICAgICAgICAgICAgIGAkRm9ybS5JY29uID0gW1N5c3RlbS5EcmF3aW5nLkljb25dYCRpY29uLkNsb25lKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChgJHNtYWxsIC1hbmQgYCRzbWFsbFswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIFt2b2lkXVtTaGVsbEljb25FeHRyYWN0b3JdOjpEZXN0cm95SWNvbihgJHNtYWxsWzBdKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChgJGxhcmdlIC1hbmQgYCRsYXJnZVswXSAtbmUgW0ludFB0cl06Olplcm8pIHsKICAgICAgICAgICAgICAgIFt2b2lkXVtTaGVsbEljb25FeHRyYWN0b3JdOjpEZXN0cm95SWNvbihgJGxhcmdlWzBdKQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1DYXRhbG9nRGFlbW9uIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldW3N0cmluZ11gJENvbW1hbmQsCiAgICAgICAgW3N0cmluZ11gJEFsaWFzCiAgICApCgogICAgYCRwYXlsb2FkID0gW29yZGVyZWRdQHsKICAgICAgICBDb21tYW5kICA9IGAkQ29tbWFuZAogICAgICAgIEFwcEFsaWFzID0gYCRBbGlhcwogICAgfQogICAgYCRqc29uID0gYCRwYXlsb2FkIHwgQ29udmVydFRvLUpzb24gLUNvbXByZXNzCgogICAgYCRlbmNvZGluZyA9IE5ldy1PYmplY3QgU3lzdGVtLlRleHQuVVRGOEVuY29kaW5nKGAkZmFsc2UpCiAgICBgJGNsaWVudCA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLk5hbWVkUGlwZUNsaWVudFN0cmVhbSAtQXJndW1lbnRMaXN0IEAoCiAgICAgICAgJy4nLAogICAgICAgIGAkUGlwZU5hbWUsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlRGlyZWN0aW9uXTo6SW5PdXQsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlT3B0aW9uc106Ok5vbmUsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuVG9rZW5JbXBlcnNvbmF0aW9uTGV2ZWxdOjpJbXBlcnNvbmF0aW9uCiAgICApCgogICAgdHJ5IHsKICAgICAgICBgJGNsaWVudC5Db25uZWN0KDEwMDAwKQogICAgICAgIGAkcmVhZGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uU3RyZWFtUmVhZGVyKGAkY2xpZW50LCBgJGVuY29kaW5nKQogICAgICAgIGAkd3JpdGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uU3RyZWFtV3JpdGVyKGAkY2xpZW50LCBgJGVuY29kaW5nKQogICAgICAgIGAkd3JpdGVyLkF1dG9GbHVzaCA9IGAkdHJ1ZQogICAgICAgIGAkd3JpdGVyLldyaXRlTGluZShgJGpzb24pCgogICAgICAgIGAkcmVhZFRhc2sgPSBgJHJlYWRlci5SZWFkTGluZUFzeW5jKCkKICAgICAgICBpZiAoLW5vdCBgJHJlYWRUYXNrLldhaXQoMTUwMDApKSB7CiAgICAgICAgICAgIHRocm93ICdaZWl0w7xiZXJzY2hyZWl0dW5nIGJlaW0gV2FydGVuIGF1ZiBBbnR3b3J0IGRlcyBTb2Z0d2FyZWthdGFsb2ctRGllbnN0ZXMuJwogICAgICAgIH0KICAgICAgICBgJGxpbmUgPSBgJHJlYWRUYXNrLlJlc3VsdAogICAgICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKGAkbGluZSkpIHsKICAgICAgICAgICAgdGhyb3cgJ0RlciBTb2Z0d2FyZWthdGFsb2ctRGllbnN0IGhhdCBrZWluZSBBbnR3b3J0IGdlc2VuZGV0LicKICAgICAgICB9CgogICAgICAgIGAkcmVzcG9uc2UgPSBgJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgaWYgKC1ub3QgYCRyZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgIHRocm93IChbc3RyaW5nXWAkcmVzcG9uc2UuTWVzc2FnZSkKICAgICAgICB9CgogICAgICAgIHJldHVybiBgJHJlc3BvbnNlCiAgICB9CiAgICBjYXRjaCBbU3lzdGVtLlRpbWVvdXRFeGNlcHRpb25dIHsKICAgICAgICB0aHJvdyAnRGVyIFNvZnR3YXJla2F0YWxvZy1EaWVuc3QgaXN0IG5pY2h0IGVycmVpY2hiYXIgb2RlciBzdGFydGV0IG5vY2guIEJpdHRlIHZlcnN1Y2hlbiBTaWUgZXMgZXJuZXV0LicKICAgIH0KICAgIGZpbmFsbHkgewogICAgICAgIGAkY2xpZW50LkRpc3Bvc2UoKQogICAgfQp9CgpmdW5jdGlvbiBOZXctQXBwUmVxdWVzdCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtzdHJpbmddYCRBbGlhcywKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXVtzdHJpbmddYCRBY3Rpb24KICAgICkKCiAgICByZXR1cm4gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgYCRBY3Rpb24gLUFsaWFzIChgJEFsaWFzLlRyaW0oKS5Ub0xvd2VySW52YXJpYW50KCkpCn0KCmZ1bmN0aW9uIEdldC1DYXRhbG9nQXBwcyB7CiAgICBgJHJlc3BvbnNlID0gSW52b2tlLUNhdGFsb2dEYWVtb24gLUNvbW1hbmQgJ0dldFN0YXRlJwogICAgYCRzY3JpcHQ6QWxsb3dVc2VySW5zdGFsbHMgPSBbYm9vbF1gJHJlc3BvbnNlLkFsbG93VXNlckluc3RhbGxzCiAgICBgJHNjcmlwdDpBbGxvd1VzZXJVbmluc3RhbGwgPSBbYm9vbF1gJHJlc3BvbnNlLkFsbG93VXNlclVuaW5zdGFsbAogICAgYCRzY3JpcHQ6UmVxdWlyZWRBbGlhc1NldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgIGZvcmVhY2ggKGAkYWxpYXMgaW4gQChgJHJlc3BvbnNlLlJlcXVpcmVkQWxpYXNlcykpIHsKICAgICAgICBpZiAoLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKFtzdHJpbmddYCRhbGlhcykpIHsKICAgICAgICAgICAgW3ZvaWRdYCRzY3JpcHQ6UmVxdWlyZWRBbGlhc1NldC5BZGQoW3N0cmluZ11gJGFsaWFzKQogICAgICAgIH0KICAgIH0KICAgIGAkc2NyaXB0Okxhc3RTdGF0ZVZlcnNpb24gPSBbaW50NjRdYCRyZXNwb25zZS5WZXJzaW9uCiAgICBpZiAoYCRyZXNwb25zZS5RdWV1ZSkgeyBgJHNjcmlwdDpMYXN0UXVldWUgPSBAKGAkcmVzcG9uc2UuUXVldWUpIH0gZWxzZSB7IGAkc2NyaXB0Okxhc3RRdWV1ZSA9IEAoKSB9CiAgICBgJHNjcmlwdDpMYXN0Q3VycmVudCA9IGAkcmVzcG9uc2UuQ3VycmVudAogICAgaWYgKGAkcmVzcG9uc2UuSW5zdGFsbGVkUGFja2FnZUlkcykgeyBgJHNjcmlwdDpMYXN0SW5zdGFsbGVkSWRzID0gQChgJHJlc3BvbnNlLkluc3RhbGxlZFBhY2thZ2VJZHMpIH0gZWxzZSB7IGAkc2NyaXB0Okxhc3RJbnN0YWxsZWRJZHMgPSBAKCkgfQogICAgcmV0dXJuIEAoYCRyZXNwb25zZS5DYXRhbG9nKQp9CgpmdW5jdGlvbiBHZXQtSW5zdGFsbGVkUGFja2FnZVN0YXRlIHsKICAgIGAkc3RhdGUgPSBbb3JkZXJlZF1AewogICAgICAgIEdlbmVyYXRlZEF0ID0gYCRudWxsCiAgICAgICAgUGFja2FnZVNldCAgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICB9CgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRJbnN0YWxsZWRQYWNrYWdlc1BhdGgpKSB7CiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1gJHN0YXRlCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBgJHJhdyA9IEdldC1Db250ZW50IC1MaXRlcmFsUGF0aCBgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCAtUmF3IC1FbmNvZGluZyBVVEY4CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRyYXcpKSB7CiAgICAgICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdYCRzdGF0ZQogICAgICAgIH0KCiAgICAgICAgYCRzbmFwc2hvdCA9IGAkcmF3IHwgQ29udmVydEZyb20tSnNvbgogICAgICAgIGlmIChgJHNuYXBzaG90LkdlbmVyYXRlZEF0KSB7CiAgICAgICAgICAgIGAkc3RhdGUuR2VuZXJhdGVkQXQgPSBbc3RyaW5nXWAkc25hcHNob3QuR2VuZXJhdGVkQXQKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKGAkaWQgaW4gQChgJHNuYXBzaG90Lkluc3RhbGxlZFBhY2thZ2VJZHMpKSB7CiAgICAgICAgICAgIGlmIChgJGlkKSB7CiAgICAgICAgICAgICAgICBbdm9pZF1gJHN0YXRlLlBhY2thZ2VTZXQuQWRkKChbc3RyaW5nXWAkaWQpLlRyaW0oKSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgIH0KCiAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XWAkc3RhdGUKfQoKZnVuY3Rpb24gR2V0LUFwcFN0YXR1cyB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXWAkQXBwLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldYCRJbnN0YWxsZWRTZXQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1gJFF1ZXVlSXRlbXMKICAgICkKCiAgICBmb3JlYWNoIChgJHF1ZXVlZCBpbiBAKGAkUXVldWVJdGVtcykpIHsKICAgICAgICBpZiAoLW5vdCBgJHF1ZXVlZCkgeyBjb250aW51ZSB9CiAgICAgICAgaWYgKGAkcXVldWVkLlN0YXRlIC1pbiBAKCdRdWV1ZWQnLCdSdW5uaW5nJykgLWFuZCBbc3RyaW5nXTo6RXF1YWxzKFtzdHJpbmddYCRxdWV1ZWQuQWxpYXMsIFtzdHJpbmddYCRBcHAuQWxpYXMsIFtTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkgewogICAgICAgICAgICBpZiAoYCRxdWV1ZWQuU3RhdGUgLWVxICdSdW5uaW5nJykgewogICAgICAgICAgICAgICAgaWYgKGAkcXVldWVkLkFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcpIHsgcmV0dXJuICdXaXJkIGRlaW5zdGFsbGllcnQnIH0KICAgICAgICAgICAgICAgIHJldHVybiAnV2lyZCBpbnN0YWxsaWVydCcKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGAkcXVldWVkLkFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcpIHsgcmV0dXJuICdEZWluc3RhbGxhdGlvbiBpbiBXYXJ0ZXNjaGxhbmdlJyB9CiAgICAgICAgICAgIHJldHVybiAnSW4gV2FydGVzY2hsYW5nZScKICAgICAgICB9CiAgICB9CgogICAgaWYgKGAkSW5zdGFsbGVkU2V0LkNvbnRhaW5zKGAkQXBwLlBhY2thZ2VJZCkpIHsKICAgICAgICByZXR1cm4gJ0luc3RhbGxpZXJ0JwogICAgfQoKICAgIGlmIChgJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0LkNvbnRhaW5zKFtzdHJpbmddYCRBcHAuQWxpYXMpKSB7CiAgICAgICAgcmV0dXJuICdJbiBXYXJ0ZXNjaGxhbmdlJwogICAgfQoKICAgIHJldHVybiAnSW5zdGFsbGllcmJhcicKfQoKYCRmb3JtID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Gb3JtCmAkZm9ybS5UZXh0ID0gYCRDYXRhbG9nVGl0bGUKYCRmb3JtLlN0YXJ0UG9zaXRpb24gPSAnQ2VudGVyU2NyZWVuJwpgJGZvcm0uU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5ODAsIDY2MCkKYCRmb3JtLk1pbmltdW1TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDk2MCwgNjQwKQpgJGZvcm0uVG9wTW9zdCA9IGAkZmFsc2UKYCRmb3JtLlNob3dJY29uID0gYCR0cnVlCmAkZm9ybS5Gb250ID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Gb250KCdTZWdvZSBVSScsIDkpCmAkZm9ybS5CYWNrQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JUcmFuc2xhdG9yXTo6RnJvbUh0bWwoJyNGM0YzRjMnKQpTZXQtRm9ybUljb24gLUZvcm0gYCRmb3JtCgpgJGhlYWRlclBhbmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGhlYWRlclBhbmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgMTIpCmAkaGVhZGVyUGFuZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5NDAsIDUyKQpgJGhlYWRlclBhbmVsLkFuY2hvciA9ICdUb3AsIExlZnQsIFJpZ2h0JwpgJGhlYWRlclBhbmVsLkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnNdOjpXaW5kb3cKYCRoZWFkZXJQYW5lbC5Cb3JkZXJTdHlsZSA9ICdGaXhlZFNpbmdsZScKCmAkaGVhZGVyQWNjZW50ID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGhlYWRlckFjY2VudC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMCwgMCkKYCRoZWFkZXJBY2NlbnQuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg2LCA1MCkKYCRoZWFkZXJBY2NlbnQuQW5jaG9yID0gJ1RvcCwgTGVmdCwgQm90dG9tJwpgJGhlYWRlckFjY2VudC5CYWNrQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JUcmFuc2xhdG9yXTo6RnJvbUh0bWwoJyMwRjZDQkQnKQoKYCRoZWFkZXJUaXRsZSA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRoZWFkZXJUaXRsZS5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTgsIDEyKQpgJGhlYWRlclRpdGxlLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTAwLCAyNCkKYCRoZWFkZXJUaXRsZS5Gb250ID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Gb250KCdTZWdvZSBVSSBTZW1pYm9sZCcsIDEzKQpgJGhlYWRlclRpdGxlLlRleHQgPSBgJENhdGFsb2dUaXRsZQoKYCRoZWFkZXJQYW5lbC5Db250cm9scy5BZGQoYCRoZWFkZXJBY2NlbnQpCmAkaGVhZGVyUGFuZWwuQ29udHJvbHMuQWRkKGAkaGVhZGVyVGl0bGUpCgpgJGdyb3VwQXBwcyA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuUGFuZWwKYCRncm91cEFwcHMuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCA3MikKYCRncm91cEFwcHMuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5NDAsIDM4NCkKYCRncm91cEFwcHMuQW5jaG9yID0gJ1RvcCwgTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRncm91cEFwcHMuQmFja0NvbG9yID0gW1N5c3RlbS5EcmF3aW5nLlN5c3RlbUNvbG9yc106OldpbmRvdwpgJGdyb3VwQXBwcy5Cb3JkZXJTdHlsZSA9ICdGaXhlZFNpbmdsZScKCmAkbGlzdENhcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxhYmVsCmAkbGlzdENhcHRpb24uTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCAxMCkKYCRsaXN0Q2FwdGlvbi5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDkxMiwgMjApCmAkbGlzdENhcHRpb24uRm9udCA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuRm9udCgnU2Vnb2UgVUkgU2VtaWJvbGQnLCA5LjUpCmAkbGlzdENhcHRpb24uVGV4dCA9ICdGcmVpZ2VnZWJlbmUgQW53ZW5kdW5nZW4nCgpgJGxpc3QgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkxpc3RWaWV3CmAkbGlzdC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDM0KQpgJGxpc3QuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5MTYsIDMzOCkKYCRsaXN0LkFuY2hvciA9ICdUb3AsIExlZnQsIFJpZ2h0LCBCb3R0b20nCmAkbGlzdC5WaWV3ID0gJ0RldGFpbHMnCmAkbGlzdC5GdWxsUm93U2VsZWN0ID0gYCR0cnVlCmAkbGlzdC5NdWx0aVNlbGVjdCA9IGAkZmFsc2UKYCRsaXN0LkdyaWRMaW5lcyA9IGAkZmFsc2UKYCRsaXN0LkhpZGVTZWxlY3Rpb24gPSBgJGZhbHNlClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnQW53ZW5kdW5nJywgMjYwKQpbdm9pZF1gJGxpc3QuQ29sdW1ucy5BZGQoJ0Jlc2NocmVpYnVuZycsIDQ1MCkKW3ZvaWRdYCRsaXN0LkNvbHVtbnMuQWRkKCdTdGF0dXMnLCAxNTApClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnQWxpYXMnLCAxMTApClt2b2lkXWAkbGlzdC5Db2x1bW5zLkFkZCgnUGFrZXQtSUQnLCAxMDApCmAkbGlzdC5Cb3JkZXJTdHlsZSA9ICdOb25lJwpgJGxpc3QuSGVhZGVyU3R5bGUgPSAnQ2xpY2thYmxlJwoKYCRjb2x1bW5Tb3J0ZXIgPSBOZXctT2JqZWN0IExpc3RWaWV3Q29sdW1uU29ydGVyCmAkbGlzdC5MaXN0Vmlld0l0ZW1Tb3J0ZXIgPSBgJGNvbHVtblNvcnRlcgoKZnVuY3Rpb24gU29ydC1MaXN0QnlDb2x1bW4gewogICAgcGFyYW0oW1BhcmFtZXRlcihNYW5kYXRvcnk9YCR0cnVlKV1baW50XWAkQ29sdW1uSW5kZXgpCgogICAgaWYgKGAkY29sdW1uU29ydGVyLkNvbHVtbiAtZXEgYCRDb2x1bW5JbmRleCkgewogICAgICAgIGlmIChgJGNvbHVtblNvcnRlci5PcmRlciAtZXEgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLlNvcnRPcmRlcl06OkFzY2VuZGluZykgewogICAgICAgICAgICBgJGNvbHVtblNvcnRlci5PcmRlciA9IFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Tb3J0T3JkZXJdOjpEZXNjZW5kaW5nCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBgJGNvbHVtblNvcnRlci5PcmRlciA9IFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5Tb3J0T3JkZXJdOjpBc2NlbmRpbmcKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBgJGNvbHVtblNvcnRlci5Db2x1bW4gPSBgJENvbHVtbkluZGV4CiAgICAgICAgYCRjb2x1bW5Tb3J0ZXIuT3JkZXIgPSBbU3lzdGVtLldpbmRvd3MuRm9ybXMuU29ydE9yZGVyXTo6QXNjZW5kaW5nCiAgICB9CgogICAgYCRsaXN0LlNvcnQoKQp9CgpgJGdyb3VwQXBwcy5Db250cm9scy5BZGQoYCRsaXN0Q2FwdGlvbikKYCRncm91cEFwcHMuQ29udHJvbHMuQWRkKGAkbGlzdCkKCmAkaW5mb1BhbmVsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5QYW5lbApgJGluZm9QYW5lbC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDQ2NikKYCRpbmZvUGFuZWwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSg5NDAsIDU0KQpgJGluZm9QYW5lbC5BbmNob3IgPSAnTGVmdCwgUmlnaHQsIEJvdHRvbScKYCRpbmZvUGFuZWwuQm9yZGVyU3R5bGUgPSAnRml4ZWRTaW5nbGUnCmAkaW5mb1BhbmVsLkJhY2tDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5TeXN0ZW1Db2xvcnNdOjpXaW5kb3cKCmAkc25hcHNob3RMYWJlbCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRzbmFwc2hvdExhYmVsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMCwgOCkKYCRzbmFwc2hvdExhYmVsLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTE0LCAxOCkKYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuOiBrZWluIERhdGVuc3RhbmQgdm9yaGFuZGVuJwoKYCRpbnN0YWxsZWRMYWJlbCA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRpbnN0YWxsZWRMYWJlbC5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTAsIDMwKQpgJGluc3RhbGxlZExhYmVsLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoOTE0LCAxOCkKYCRpbnN0YWxsZWRMYWJlbC5UZXh0ID0gJ0JlcmVpdHMgaW5zdGFsbGllcnQ6IGtlaW5lJwoKYCRpbmZvUGFuZWwuQ29udHJvbHMuQWRkKGAkc25hcHNob3RMYWJlbCkKYCRpbmZvUGFuZWwuQ29udHJvbHMuQWRkKGAkaW5zdGFsbGVkTGFiZWwpCgpmdW5jdGlvbiBVcGRhdGUtSW5zdGFsbEJ1dHRvblN0YXRlIHsKICAgIGlmIChgJGxpc3QuU2VsZWN0ZWRJdGVtcy5Db3VudCAtbHQgMSkgewogICAgICAgIGAkYnRuSW5zdGFsbC5FbmFibGVkID0gYCRmYWxzZQogICAgICAgIGAkYnRuVW5pbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgYCRzdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICBgJGlzUmVxdWlyZWQgPSBgJHNjcmlwdDpSZXF1aXJlZEFsaWFzU2V0LkNvbnRhaW5zKFtzdHJpbmddYCRzZWxlY3RlZEl0ZW0uU3ViSXRlbXNbM10uVGV4dCkKICAgIGAkYnRuSW5zdGFsbC5FbmFibGVkID0gKGAkc2NyaXB0OkFsbG93VXNlckluc3RhbGxzIC1hbmQgYCRzdGF0ZSAtZXEgJ0luc3RhbGxpZXJiYXInKQogICAgYCRidG5Vbmluc3RhbGwuRW5hYmxlZCA9IChgJHNjcmlwdDpBbGxvd1VzZXJVbmluc3RhbGwgLWFuZCAtbm90IGAkaXNSZXF1aXJlZCAtYW5kIGAkc3RhdGUgLWVxICdJbnN0YWxsaWVydCcpCn0KCmZ1bmN0aW9uIFVwZGF0ZS1Qcm9ncmVzc0FyZWEgewogICAgYCRjdXJyZW50ID0gYCRzY3JpcHQ6TGFzdEN1cnJlbnQKICAgIGAkcXVldWVkQ291bnQgPSBAKGAkc2NyaXB0Okxhc3RRdWV1ZSB8IFdoZXJlLU9iamVjdCB7IGAkXyAtYW5kIGAkXy5TdGF0ZSAtZXEgJ1F1ZXVlZCcgfSkuQ291bnQKICAgIGlmIChgJGN1cnJlbnQpIHsKICAgICAgICBgJGxhYmVsID0gW3N0cmluZ11gJGN1cnJlbnQuU3RhZ2VUZXh0CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRsYWJlbCkpIHsgYCRsYWJlbCA9ICdBa3Rpb24gbMOkdWZ0Li4uJyB9CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJ7MH0gKFdhcnRlc2NobGFuZ2U6IHsxfSkiIC1mIGAkbGFiZWwsIGAkcXVldWVkQ291bnQKICAgICAgICBgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJHRydWUKICAgICAgICBpZiAoYCRjdXJyZW50LklzSW5kZXRlcm1pbmF0ZSAtb3IgYCRudWxsIC1lcSBgJGN1cnJlbnQuUHJvZ3Jlc3NQZXJjZW50KSB7CiAgICAgICAgICAgIGAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnTWFycXVlZScKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnQ29udGludW91cycKICAgICAgICAgICAgYCR2YWx1ZSA9IFtpbnRdYCRjdXJyZW50LlByb2dyZXNzUGVyY2VudAogICAgICAgICAgICBpZiAoYCR2YWx1ZSAtbHQgMCkgeyBgJHZhbHVlID0gMCB9CiAgICAgICAgICAgIGlmIChgJHZhbHVlIC1ndCAxMDApIHsgYCR2YWx1ZSA9IDEwMCB9CiAgICAgICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmFsdWUgPSBgJHZhbHVlCiAgICAgICAgfQogICAgfQogICAgZWxzZWlmIChgJHF1ZXVlZENvdW50IC1ndCAwKSB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJXYXJ0ZXNjaGxhbmdlOiB7MH0iIC1mIGAkcXVldWVkQ291bnQKICAgICAgICBgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJHRydWUKICAgICAgICBgJHByb2dyZXNzQmFyLlN0eWxlID0gJ0NvbnRpbnVvdXMnCiAgICAgICAgYCRwcm9ncmVzc0Jhci5WYWx1ZSA9IDAKICAgIH0KICAgIGVsc2UgewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAnQmVyZWl0LicKICAgICAgICBgJHByb2dyZXNzQmFyLlZpc2libGUgPSBgJGZhbHNlCiAgICAgICAgYCRwcm9ncmVzc0Jhci5TdHlsZSA9ICdDb250aW51b3VzJwogICAgICAgIGAkcHJvZ3Jlc3NCYXIuVmFsdWUgPSAwCiAgICB9Cn0KCmZ1bmN0aW9uIExvYWQtQXBwTGlzdCB7CiAgICBgJHNlbGVjdGVkQWxpYXMgPSBgJG51bGwKICAgIGAkbGlzdC5CZWdpblVwZGF0ZSgpCiAgICB0cnkgewogICAgICAgIGlmIChgJGxpc3QuU2VsZWN0ZWRJdGVtcy5Db3VudCAtZ3QgMCkgewogICAgICAgICAgICBgJHNlbGVjdGVkQWxpYXMgPSBbc3RyaW5nXWAkbGlzdC5TZWxlY3RlZEl0ZW1zWzBdLlN1Ykl0ZW1zWzNdLlRleHQKICAgICAgICB9CgogICAgICAgIGAkbGlzdC5JdGVtcy5DbGVhcigpCgogICAgICAgIGAkYXBwcyA9IEdldC1DYXRhbG9nQXBwcwogICAgICAgIGAkaW5zdGFsbGVkU3RhdGUgPSBHZXQtSW5zdGFsbGVkUGFja2FnZVN0YXRlCiAgICAgICAgYCRpbnN0YWxsZWRTZXQgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5IYXNoU2V0W3N0cmluZ10nIChbU3lzdGVtLlN0cmluZ0NvbXBhcmVyXTo6T3JkaW5hbElnbm9yZUNhc2UpCiAgICAgICAgZm9yZWFjaCAoYCRpZCBpbiBAKGAkc2NyaXB0Okxhc3RJbnN0YWxsZWRJZHMpKSB7CiAgICAgICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ11gJGlkKSkgeyBbdm9pZF1gJGluc3RhbGxlZFNldC5BZGQoW3N0cmluZ11gJGlkKSB9CiAgICAgICAgfQoKICAgICAgICBpZiAoLW5vdCBgJGluc3RhbGxlZFNldCkgewogICAgICAgICAgICBgJGluc3RhbGxlZFNldCA9IE5ldy1PYmplY3QgJ1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkhhc2hTZXRbc3RyaW5nXScgKFtTeXN0ZW0uU3RyaW5nQ29tcGFyZXJdOjpPcmRpbmFsSWdub3JlQ2FzZSkKICAgICAgICB9CgogICAgICAgIGAkaW5zdGFsbGVkTmFtZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCgogICAgICAgIGZvcmVhY2ggKGAkYXBwIGluIChgJGFwcHMgfCBTb3J0LU9iamVjdCBEaXNwbGF5TmFtZSkpIHsKICAgICAgICAgICAgYCRzdGF0ZSA9IEdldC1BcHBTdGF0dXMgLUFwcCBgJGFwcCAtSW5zdGFsbGVkU2V0IGAkaW5zdGFsbGVkU2V0IC1RdWV1ZUl0ZW1zIGAkc2NyaXB0Okxhc3RRdWV1ZQoKICAgICAgICAgICAgYCRpdGVtID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0oYCRhcHAuRGlzcGxheU5hbWUpCiAgICAgICAgICAgIFt2b2lkXWAkaXRlbS5TdWJJdGVtcy5BZGQoYCRhcHAuRGVzY3JpcHRpb24pCiAgICAgICAgICAgIFt2b2lkXWAkaXRlbS5TdWJJdGVtcy5BZGQoYCRzdGF0ZSkKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJGFwcC5BbGlhcykKICAgICAgICAgICAgW3ZvaWRdYCRpdGVtLlN1Ykl0ZW1zLkFkZChgJGFwcC5QYWNrYWdlSWQpCiAgICAgICAgICAgIGAkaXRlbS5UYWcgPSBgJGFwcAoKICAgICAgICAgICAgaWYgKGAkc3RhdGUgLWVxICdJbnN0YWxsaWVydCcpIHsKICAgICAgICAgICAgICAgIGAkaXRlbS5Gb3JlQ29sb3IgPSBbU3lzdGVtLkRyYXdpbmcuQ29sb3JdOjpEYXJrR3JlZW4KICAgICAgICAgICAgICAgIFt2b2lkXWAkaW5zdGFsbGVkTmFtZXMuQWRkKGAkYXBwLkRpc3BsYXlOYW1lKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZiAoYCRzdGF0ZSAtbGlrZSAnKldhcnRlc2NobGFuZ2UnKSB7CiAgICAgICAgICAgICAgICBgJGl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGFya0dvbGRlbnJvZAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2VpZiAoYCRzdGF0ZSAtbGlrZSAnV2lyZCAqJykgewogICAgICAgICAgICAgICAgYCRpdGVtLkZvcmVDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvcl06OlJveWFsQmx1ZQogICAgICAgICAgICB9CgogICAgICAgICAgICBbdm9pZF1gJGxpc3QuSXRlbXMuQWRkKGAkaXRlbSkKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKGAkY29sIGluIGAkbGlzdC5Db2x1bW5zKSB7CiAgICAgICAgICAgIGlmIChgJGNvbC5UZXh0IC1lcSAnUGFrZXQtSUQnKSB7IGAkY29sLldpZHRoID0gMCB9CiAgICAgICAgfQoKICAgICAgICBgJGxpc3QuU29ydCgpCgogICAgICAgIGlmIChgJGluc3RhbGxlZFN0YXRlLkdlbmVyYXRlZEF0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBgJHRpbWVzdGFtcCA9IFtEYXRlVGltZV06OlBhcnNlKGAkaW5zdGFsbGVkU3RhdGUuR2VuZXJhdGVkQXQpLlRvTG9jYWxUaW1lKCkKICAgICAgICAgICAgICAgIGAkc25hcHNob3RMYWJlbC5UZXh0ID0gJ0luc3RhbGxhdGlvbnNkYXRlbiB2b206ICcgKyBgJHRpbWVzdGFtcC5Ub1N0cmluZygnZGQuTU0ueXl5eSBISDptbTpzcycpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggewogICAgICAgICAgICAgICAgYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuIHZvbTogJyArIGAkaW5zdGFsbGVkU3RhdGUuR2VuZXJhdGVkQXQKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYCRzbmFwc2hvdExhYmVsLlRleHQgPSAnSW5zdGFsbGF0aW9uc2RhdGVuOiBrZWluIERhdGVuc3RhbmQgdm9yaGFuZGVuJwogICAgICAgIH0KCiAgICAgICAgaWYgKGAkaW5zdGFsbGVkTmFtZXMuQ291bnQgLWd0IDApIHsKICAgICAgICAgICAgYCRpbnN0YWxsZWRMYWJlbC5UZXh0ID0gJ0JlcmVpdHMgaW5zdGFsbGllcnQ6ICcgKyAoYCRpbnN0YWxsZWROYW1lcyAtam9pbiAnLCAnKQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYCRpbnN0YWxsZWRMYWJlbC5UZXh0ID0gJ0JlcmVpdHMgaW5zdGFsbGllcnQ6IGtlaW5lIGZyZWlnZWdlYmVuZSBTb2Z0d2FyZSBlcmthbm50JwogICAgICAgIH0KCiAgICAgICAgVXBkYXRlLVByb2dyZXNzQXJlYQogICAgfQogICAgZmluYWxseSB7CiAgICAgICAgYCRsaXN0LkVuZFVwZGF0ZSgpCgogICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRzZWxlY3RlZEFsaWFzKSkgewogICAgICAgICAgICBmb3JlYWNoIChgJGl0ZW0gaW4gYCRsaXN0Lkl0ZW1zKSB7CiAgICAgICAgICAgICAgICBpZiAoYCRpdGVtLlN1Ykl0ZW1zLkNvdW50IC1ndCAzIC1hbmQgW3N0cmluZ106OkVxdWFscyhgJGl0ZW0uU3ViSXRlbXNbM10uVGV4dCwgYCRzZWxlY3RlZEFsaWFzLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpIHsKICAgICAgICAgICAgICAgICAgICBgJGl0ZW0uU2VsZWN0ZWQgPSBgJHRydWUKICAgICAgICAgICAgICAgICAgICBgJGl0ZW0uRW5zdXJlVmlzaWJsZSgpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgVXBkYXRlLUluc3RhbGxCdXR0b25TdGF0ZQogICAgfQp9CgpgJHN0YXR1cyA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuTGFiZWwKYCRzdGF0dXMuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDEyLCA1MjYpCmAkc3RhdHVzLlNpemUgPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlNpemUoNzAwLCAyMCkKYCRzdGF0dXMuQW5jaG9yID0gJ0xlZnQsIFJpZ2h0LCBCb3R0b20nCmAkc3RhdHVzLkZvcmVDb2xvciA9IFtTeXN0ZW0uRHJhd2luZy5Db2xvcl06OkRpbUdyYXkKYCRzdGF0dXMuVGV4dCA9ICdCZXJlaXQuJwoKYCRwcm9ncmVzc0JhciA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuUHJvZ3Jlc3NCYXIKYCRwcm9ncmVzc0Jhci5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoMTIsIDU0OCkKYCRwcm9ncmVzc0Jhci5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDcwMCwgMTIpCmAkcHJvZ3Jlc3NCYXIuQW5jaG9yID0gJ0xlZnQsIFJpZ2h0LCBCb3R0b20nCmAkcHJvZ3Jlc3NCYXIuU3R5bGUgPSAnQ29udGludW91cycKYCRwcm9ncmVzc0Jhci5WaXNpYmxlID0gYCRmYWxzZQoKYCRidG5JbnN0YWxsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24KYCRidG5JbnN0YWxsLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCgxMiwgNTY4KQpgJGJ0bkluc3RhbGwuU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxNzAsIDMwKQpgJGJ0bkluc3RhbGwuQW5jaG9yID0gJ0xlZnQsIEJvdHRvbScKYCRidG5JbnN0YWxsLlRleHQgPSAnSW5zdGFsbGllcmVuJwpgJGJ0bkluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKCmAkYnRuVW5pbnN0YWxsID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5CdXR0b24KYCRidG5Vbmluc3RhbGwuTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDE5MCwgNTY4KQpgJGJ0blVuaW5zdGFsbC5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDE0MCwgMzApCmAkYnRuVW5pbnN0YWxsLkFuY2hvciA9ICdMZWZ0LCBCb3R0b20nCmAkYnRuVW5pbnN0YWxsLlRleHQgPSAnRGVpbnN0YWxsYXRpb24nCmAkYnRuVW5pbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCgpgJGJ0blJlZnJlc2ggPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0blJlZnJlc2guTG9jYXRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5EcmF3aW5nLlBvaW50KDMzOCwgNTY4KQpgJGJ0blJlZnJlc2guU2l6ZSA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuU2l6ZSgxMTAsIDMwKQpgJGJ0blJlZnJlc2guQW5jaG9yID0gJ0xlZnQsIEJvdHRvbScKYCRidG5SZWZyZXNoLlRleHQgPSAnQWt0dWFsaXNpZXJlbicKCmAkYnRuT3BlbkxvZyA9IE5ldy1PYmplY3QgU3lzdGVtLldpbmRvd3MuRm9ybXMuQnV0dG9uCmAkYnRuT3BlbkxvZy5Mb2NhdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkRyYXdpbmcuUG9pbnQoNDU2LCA1NjgpCmAkYnRuT3BlbkxvZy5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDEzMCwgMzApCmAkYnRuT3BlbkxvZy5BbmNob3IgPSAnTGVmdCwgQm90dG9tJwpgJGJ0bk9wZW5Mb2cuVGV4dCA9ICdQcm90b2tvbGwgw7ZmZm5lbicKCmAkYnRuQ2xvc2UgPSBOZXctT2JqZWN0IFN5c3RlbS5XaW5kb3dzLkZvcm1zLkJ1dHRvbgpgJGJ0bkNsb3NlLkxvY2F0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5Qb2ludCg4MzIsIDU2OCkKYCRidG5DbG9zZS5TaXplID0gTmV3LU9iamVjdCBTeXN0ZW0uRHJhd2luZy5TaXplKDEyMCwgMzApCmAkYnRuQ2xvc2UuQW5jaG9yID0gJ1JpZ2h0LCBCb3R0b20nCmAkYnRuQ2xvc2UuVGV4dCA9ICdTY2hsaWXDn2VuJwoKYCRzY3JpcHQ6U3RhdGVXYXRjaGVyID0gYCRudWxsCmAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlciA9IGAkbnVsbApgJHN0YXRlUmVmcmVzaFRpbWVyID0gTmV3LU9iamVjdCBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5UaW1lcgpgJHN0YXRlUmVmcmVzaFRpbWVyLkludGVydmFsID0gNTAwCmAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJGZhbHNlCmAkc2NyaXB0OlJlcXVlc3RXb3JrZXJCdXN5ID0gYCRmYWxzZQoKZnVuY3Rpb24gU3RhcnQtQXBwUmVxdWVzdEFzeW5jIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PWAkdHJ1ZSldYCRTZWxlY3RlZCwKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeT1gJHRydWUpXVtWYWxpZGF0ZVNldCgnSW5zdGFsbCcsJ1VuaW5zdGFsbCcpXVtzdHJpbmddYCRBY3Rpb24KICAgICkKCiAgICBpZiAoYCRzY3JpcHQ6UmVxdWVzdFdvcmtlckJ1c3kpIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gJ0VpbmUgQW5mcmFnZSB3aXJkIGJlcmVpdHMgdmVyYXJiZWl0ZXQuJwogICAgICAgIHJldHVybgogICAgfQoKICAgIGAkc2NyaXB0OlJlcXVlc3RXb3JrZXJCdXN5ID0gYCR0cnVlCiAgICBgJGJ0bkluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKICAgIGAkYnRuVW5pbnN0YWxsLkVuYWJsZWQgPSBgJGZhbHNlCiAgICBgJGJ0blJlZnJlc2guRW5hYmxlZCA9IGAkZmFsc2UKCiAgICBgJHdvcmtlciA9IE5ldy1PYmplY3QgU3lzdGVtLkNvbXBvbmVudE1vZGVsLkJhY2tncm91bmRXb3JrZXIKICAgIGAkd29ya2VyLkFkZF9Eb1dvcmsoewogICAgICAgIHBhcmFtKGAkc2VuZGVyLCBgJGV2ZW50QXJncykKICAgICAgICBgJGFyZyA9IGAkZXZlbnRBcmdzLkFyZ3VtZW50CiAgICAgICAgYCRyZXNwb25zZSA9IE5ldy1BcHBSZXF1ZXN0IC1BbGlhcyBgJGFyZy5BbGlhcyAtQWN0aW9uIGAkYXJnLkFjdGlvbgogICAgICAgIGAkZXZlbnRBcmdzLlJlc3VsdCA9IFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICBBY3Rpb24gPSBgJGFyZy5BY3Rpb24KICAgICAgICAgICAgQWxpYXMgPSBgJGFyZy5BbGlhcwogICAgICAgICAgICBEaXNwbGF5TmFtZSA9IGAkYXJnLkRpc3BsYXlOYW1lCiAgICAgICAgICAgIFJlc3BvbnNlID0gYCRyZXNwb25zZQogICAgICAgIH0KICAgIH0pCiAgICBgJHdvcmtlci5BZGRfUnVuV29ya2VyQ29tcGxldGVkKHsKICAgICAgICBwYXJhbShgJHNlbmRlciwgYCRldmVudEFyZ3MpCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYCRzY3JpcHQ6UmVxdWVzdFdvcmtlckJ1c3kgPSBgJGZhbHNlCiAgICAgICAgICAgIGAkYnRuUmVmcmVzaC5FbmFibGVkID0gYCR0cnVlCgogICAgICAgICAgICBpZiAoYCRldmVudEFyZ3MuRXJyb3IpIHsKICAgICAgICAgICAgICAgIGAkc3RhdHVzLlRleHQgPSAnRmVobGVyOiAnICsgYCRldmVudEFyZ3MuRXJyb3IuTWVzc2FnZQogICAgICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZQogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgICAgIGAkZXZlbnRBcmdzLkVycm9yLk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGAkcmVzdWx0ID0gYCRldmVudEFyZ3MuUmVzdWx0CiAgICAgICAgICAgIGlmIChgJHJlc3VsdC5BY3Rpb24gLWVxICdVbmluc3RhbGwnKSB7CiAgICAgICAgICAgICAgICBgJHZlcmIgPSAnRGVpbnN0YWxsYXRpb24nCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBgJHZlcmIgPSAnSW5zdGFsbGF0aW9uJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChgJHJlc3VsdC5SZXNwb25zZS5NZXNzYWdlKSB7CiAgICAgICAgICAgICAgICBgJHN0YXR1cy5UZXh0ID0gW3N0cmluZ11gJHJlc3VsdC5SZXNwb25zZS5NZXNzYWdlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBgJHN0YXR1cy5UZXh0ID0gImAkdmVyYiBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkcmVzdWx0LkRpc3BsYXlOYW1lCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiYCR2ZXJiIGVpbmdlcmVpaHQ6YHJgbmByYG57MH1gcmBuQWxpYXM6IHsxfSIgLWYgYCRyZXN1bHQuRGlzcGxheU5hbWUsIGAkcmVzdWx0LkFsaWFzKSwKICAgICAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpJbmZvcm1hdGlvbgogICAgICAgICAgICApIHwgT3V0LU51bGwKCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUKICAgICAgICAgICAgYCRzZW5kZXIuRGlzcG9zZSgpCiAgICAgICAgfQogICAgfSkKICAgIGAkd29ya2VyLlJ1bldvcmtlckFzeW5jKFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgIEFjdGlvbiA9IGAkQWN0aW9uCiAgICAgICAgQWxpYXMgPSBbc3RyaW5nXWAkU2VsZWN0ZWQuQWxpYXMKICAgICAgICBEaXNwbGF5TmFtZSA9IFtzdHJpbmddYCRTZWxlY3RlZC5EaXNwbGF5TmFtZQogICAgfSkKfQoKZnVuY3Rpb24gU3RhcnQtUmVmcmVzaFN0YXR1c0FzeW5jIHsKICAgIGlmIChgJHNjcmlwdDpSZXF1ZXN0V29ya2VyQnVzeSkgewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAnRWluZSBBbmZyYWdlIHdpcmQgYmVyZWl0cyB2ZXJhcmJlaXRldC4nCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgYCRzY3JpcHQ6UmVxdWVzdFdvcmtlckJ1c3kgPSBgJHRydWUKICAgIGAkYnRuSW5zdGFsbC5FbmFibGVkID0gYCRmYWxzZQogICAgYCRidG5Vbmluc3RhbGwuRW5hYmxlZCA9IGAkZmFsc2UKICAgIGAkYnRuUmVmcmVzaC5FbmFibGVkID0gYCRmYWxzZQogICAgYCRzdGF0dXMuVGV4dCA9ICdJbnN0YWxsYXRpb25zZGF0ZW4tQWt0dWFsaXNpZXJ1bmcgd2lyZCBhbmdlZm9yZGVydC4uLicKCiAgICBgJHdvcmtlciA9IE5ldy1PYmplY3QgU3lzdGVtLkNvbXBvbmVudE1vZGVsLkJhY2tncm91bmRXb3JrZXIKICAgIGAkd29ya2VyLkFkZF9Eb1dvcmsoewogICAgICAgIHBhcmFtKGAkc2VuZGVyLCBgJGV2ZW50QXJncykKICAgICAgICBgJGV2ZW50QXJncy5SZXN1bHQgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbiAtQ29tbWFuZCAnUmVmcmVzaFN0YXR1cycKICAgIH0pCiAgICBgJHdvcmtlci5BZGRfUnVuV29ya2VyQ29tcGxldGVkKHsKICAgICAgICBwYXJhbShgJHNlbmRlciwgYCRldmVudEFyZ3MpCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYCRzY3JpcHQ6UmVxdWVzdFdvcmtlckJ1c3kgPSBgJGZhbHNlCiAgICAgICAgICAgIGAkYnRuUmVmcmVzaC5FbmFibGVkID0gYCR0cnVlCgogICAgICAgICAgICBpZiAoYCRldmVudEFyZ3MuRXJyb3IpIHsKICAgICAgICAgICAgICAgIGAkc3RhdHVzLlRleHQgPSAnRmVobGVyOiAnICsgYCRldmVudEFyZ3MuRXJyb3IuTWVzc2FnZQogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgICAgIGAkZXZlbnRBcmdzLkVycm9yLk1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGAkcmVzcG9uc2UgPSBgJGV2ZW50QXJncy5SZXN1bHQKICAgICAgICAgICAgaWYgKGAkcmVzcG9uc2UuTWVzc2FnZSkgeyBgJHN0YXR1cy5UZXh0ID0gW3N0cmluZ11gJHJlc3BvbnNlLk1lc3NhZ2UgfQogICAgICAgICAgICBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlCiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBVcGRhdGUtSW5zdGFsbEJ1dHRvblN0YXRlCiAgICAgICAgICAgIGAkc2VuZGVyLkRpc3Bvc2UoKQogICAgICAgIH0KICAgIH0pCiAgICBgJHdvcmtlci5SdW5Xb3JrZXJBc3luYygpCn0KCmAkYnRuSW5zdGFsbC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWx0IDEpIHsKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgJ0JpdHRlIHp1ZXJzdCBlaW5lIEFud2VuZHVuZyBhdXN3w6RobGVuLicsCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgICAgIGAkc2VsZWN0ZWQgPSBgJHNlbGVjdGVkSXRlbS5UYWcKICAgICAgICBgJGN1cnJlbnRTdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICAgICAgaWYgKGAkY3VycmVudFN0YXRlIC1lcSAnSW5zdGFsbGllcnQnKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiezB9IGlzdCBiZXJlaXRzIGluc3RhbGxpZXJ0LiIgLWYgYCRzZWxlY3RlZC5EaXNwbGF5TmFtZSksCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJJbnN0YWxsYXRpb24gd2lyZCBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUKICAgICAgICBgJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1syXS5UZXh0ID0gJ0luIFdhcnRlc2NobGFuZ2UnCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGFya0dvbGRlbnJvZAogICAgICAgIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUKICAgICAgICBTdGFydC1BcHBSZXF1ZXN0QXN5bmMgLVNlbGVjdGVkIGAkc2VsZWN0ZWQgLUFjdGlvbiAnSW5zdGFsbCcKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlcjogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZQogICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlLAogICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkVycm9yCiAgICAgICAgKSB8IE91dC1OdWxsCiAgICB9Cn0pCgpgJGJ0blVuaW5zdGFsbC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWx0IDEpIHsKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICAgICAgJ0JpdHRlIHp1ZXJzdCBlaW5lIEFud2VuZHVuZyBhdXN3w6RobGVuLicsCiAgICAgICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94QnV0dG9uc106Ok9LLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6SW5mb3JtYXRpb24KICAgICAgICAgICAgKSB8IE91dC1OdWxsCiAgICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0gPSBgJGxpc3QuU2VsZWN0ZWRJdGVtc1swXQogICAgICAgIGAkc2VsZWN0ZWQgPSBgJHNlbGVjdGVkSXRlbS5UYWcKICAgICAgICBgJGN1cnJlbnRTdGF0ZSA9IGAkc2VsZWN0ZWRJdGVtLlN1Ykl0ZW1zWzJdLlRleHQKCiAgICAgICAgaWYgKGAkY3VycmVudFN0YXRlIC1uZSAnSW5zdGFsbGllcnQnKSB7CiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgICAgICgiezB9IGlzdCBkZXJ6ZWl0IG5pY2h0IGFscyBpbnN0YWxsaWVydCBtYXJraWVydC4iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUpLAogICAgICAgICAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkluZm9ybWF0aW9uCiAgICAgICAgICAgICkgfCBPdXQtTnVsbAogICAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRGVpbnN0YWxsYXRpb24gd2lyZCBlaW5nZXJlaWh0OiB7MH0iIC1mIGAkc2VsZWN0ZWQuRGlzcGxheU5hbWUKICAgICAgICBgJHNlbGVjdGVkSXRlbS5TdWJJdGVtc1syXS5UZXh0ID0gJ0RlaW5zdGFsbGF0aW9uIGluIFdhcnRlc2NobGFuZ2UnCiAgICAgICAgYCRzZWxlY3RlZEl0ZW0uRm9yZUNvbG9yID0gW1N5c3RlbS5EcmF3aW5nLkNvbG9yXTo6RGFya0dvbGRlbnJvZAogICAgICAgIFVwZGF0ZS1JbnN0YWxsQnV0dG9uU3RhdGUKICAgICAgICBTdGFydC1BcHBSZXF1ZXN0QXN5bmMgLVNlbGVjdGVkIGAkc2VsZWN0ZWQgLUFjdGlvbiAnVW5pbnN0YWxsJwogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiRmVobGVyOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkYnRuUmVmcmVzaC5BZGRfQ2xpY2soewogICAgdHJ5IHsKICAgICAgICBTdGFydC1SZWZyZXNoU3RhdHVzQXN5bmMKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlcjogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZQogICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94XTo6U2hvdygKICAgICAgICAgICAgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlLAogICAgICAgICAgICBgJENhdGFsb2dUaXRsZSwKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgIFtTeXN0ZW0uV2luZG93cy5Gb3Jtcy5NZXNzYWdlQm94SWNvbl06OkVycm9yCiAgICAgICAgKSB8IE91dC1OdWxsCiAgICB9Cn0pCgpgJHN0YXRlUmVmcmVzaFRpbWVyLkFkZF9UaWNrKHsKICAgIGlmICgtbm90IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcpIHsgcmV0dXJuIH0KICAgIGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJGZhbHNlCiAgICB0cnkgeyBMb2FkLUFwcExpc3QgfQogICAgY2F0Y2ggeyBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlciBiZWkgYXV0b21hdGlzY2hlciBBa3R1YWxpc2llcnVuZzogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZSB9Cn0pCgpgJGJ0bk9wZW5Mb2cuQWRkX0NsaWNrKHsKICAgIHRyeSB7CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoYCRMb2dGaWxlKSkgewogICAgICAgICAgICB0aHJvdyAnRGVyIFBmYWQgenVyIFByb3Rva29sbGRhdGVpIGlzdCBsZWVyLicKICAgICAgICB9CgogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoIGAkTG9nRmlsZSkgewogICAgICAgICAgICBTdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAnbm90ZXBhZC5leGUnIC1Bcmd1bWVudExpc3QgQChgJExvZ0ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgICAgICAgICAnRGllIFByb3Rva29sbGRhdGVpIHd1cmRlIG5vY2ggbmljaHQgZXJzdGVsbHQuJywKICAgICAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEljb25dOjpJbmZvcm1hdGlvbgogICAgICAgICAgICApIHwgT3V0LU51bGwKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KAogICAgICAgICAgICBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgICAgIGAkQ2F0YWxvZ1RpdGxlLAogICAgICAgICAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveEJ1dHRvbnNdOjpPSywKICAgICAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICAgICApIHwgT3V0LU51bGwKICAgIH0KfSkKCmAkYnRuQ2xvc2UuQWRkX0NsaWNrKHsgYCRmb3JtLkNsb3NlKCkgfSkKCmAkZm9ybS5BZGRfU2hvd24oewogICAgdHJ5IHsKICAgICAgICBgJHN0YXRlRGlyID0gU3BsaXQtUGF0aCAtUGF0aCBgJFF1ZXVlU3RhdGVQYXRoIC1QYXJlbnQKICAgICAgICBgJHN0YXRlRmlsZSA9IFNwbGl0LVBhdGggLVBhdGggYCRRdWV1ZVN0YXRlUGF0aCAtTGVhZgogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoIGAkc3RhdGVEaXIpIHsKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uRmlsZVN5c3RlbVdhdGNoZXIoYCRzdGF0ZURpciwgYCRzdGF0ZUZpbGUpCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5Ob3RpZnlGaWx0ZXIgPSBbU3lzdGVtLklPLk5vdGlmeUZpbHRlcnNdJ0xhc3RXcml0ZSwgRmlsZU5hbWUsIFNpemUnCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5BZGRfQ2hhbmdlZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U3RhdGVXYXRjaGVyLkFkZF9DcmVhdGVkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTdGF0ZVdhdGNoZXIuQWRkX1JlbmFtZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5FbmFibGVSYWlzaW5nRXZlbnRzID0gYCR0cnVlCiAgICAgICAgfQogICAgfQogICAgY2F0Y2ggewogICAgICAgIGAkc3RhdHVzLlRleHQgPSAiU3RhdHVzdWViZXJ3YWNodW5nIGtvbm50ZSBuaWNodCBnZXN0YXJ0ZXQgd2VyZGVuOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICB9CgogICAgdHJ5IHsKICAgICAgICBgJHNuYXBzaG90RGlyID0gU3BsaXQtUGF0aCAtUGF0aCBgJEluc3RhbGxlZFBhY2thZ2VzUGF0aCAtUGFyZW50CiAgICAgICAgYCRzbmFwc2hvdEZpbGUgPSBTcGxpdC1QYXRoIC1QYXRoIGAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1MZWFmCiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggYCRzbmFwc2hvdERpcikgewogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5GaWxlU3lzdGVtV2F0Y2hlcihgJHNuYXBzaG90RGlyLCBgJHNuYXBzaG90RmlsZSkKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLk5vdGlmeUZpbHRlciA9IFtTeXN0ZW0uSU8uTm90aWZ5RmlsdGVyc10nTGFzdFdyaXRlLCBGaWxlTmFtZSwgU2l6ZScKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLkFkZF9DaGFuZ2VkKHsgYCRzY3JpcHQ6U3RhdGVSZWZyZXNoUGVuZGluZyA9IGAkdHJ1ZSB9KQogICAgICAgICAgICBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuQWRkX0NyZWF0ZWQoeyBgJHNjcmlwdDpTdGF0ZVJlZnJlc2hQZW5kaW5nID0gYCR0cnVlIH0pCiAgICAgICAgICAgIGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlci5BZGRfUmVuYW1lZCh7IGAkc2NyaXB0OlN0YXRlUmVmcmVzaFBlbmRpbmcgPSBgJHRydWUgfSkKICAgICAgICAgICAgYCRzY3JpcHQ6U25hcHNob3RXYXRjaGVyLkVuYWJsZVJhaXNpbmdFdmVudHMgPSBgJHRydWUKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgYCRzdGF0dXMuVGV4dCA9ICJTbmFwc2hvdHVlYmVyd2FjaHVuZyBrb25udGUgbmljaHQgZ2VzdGFydGV0IHdlcmRlbjogIiArIGAkXy5FeGNlcHRpb24uTWVzc2FnZQogICAgfQogICAgYCRzdGF0ZVJlZnJlc2hUaW1lci5TdGFydCgpCn0pCmAkZm9ybS5BZGRfRm9ybUNsb3NpbmcoewogICAgYCRzdGF0ZVJlZnJlc2hUaW1lci5TdG9wKCkKICAgIGAkc3RhdGVSZWZyZXNoVGltZXIuRGlzcG9zZSgpCiAgICBpZiAoYCRzY3JpcHQ6U3RhdGVXYXRjaGVyKSB7IGAkc2NyaXB0OlN0YXRlV2F0Y2hlci5EaXNwb3NlKCkgfQogICAgaWYgKGAkc2NyaXB0OlNuYXBzaG90V2F0Y2hlcikgeyBgJHNjcmlwdDpTbmFwc2hvdFdhdGNoZXIuRGlzcG9zZSgpIH0KfSkKCmAkbGlzdC5BZGRfU2VsZWN0ZWRJbmRleENoYW5nZWQoeyBVcGRhdGUtSW5zdGFsbEJ1dHRvblN0YXRlIH0pCmAkbGlzdC5BZGRfQ29sdW1uQ2xpY2soewogICAgcGFyYW0oYCRzZW5kZXIsIGAkZXZlbnRBcmdzKQogICAgU29ydC1MaXN0QnlDb2x1bW4gLUNvbHVtbkluZGV4IGAkZXZlbnRBcmdzLkNvbHVtbgp9KQoKYCRsaXN0LkFkZF9Eb3VibGVDbGljayh7CiAgICBpZiAoYCRsaXN0LlNlbGVjdGVkSXRlbXMuQ291bnQgLWd0IDApIHsKICAgICAgICBpZiAoYCRidG5JbnN0YWxsLkVuYWJsZWQpIHsKICAgICAgICAgICAgYCRidG5JbnN0YWxsLlBlcmZvcm1DbGljaygpCiAgICAgICAgfQogICAgfQp9KQoKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGhlYWRlclBhbmVsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkZ3JvdXBBcHBzKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkaW5mb1BhbmVsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkc3RhdHVzKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkcHJvZ3Jlc3NCYXIpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5JbnN0YWxsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkYnRuVW5pbnN0YWxsKQpgJGZvcm0uQ29udHJvbHMuQWRkKGAkYnRuUmVmcmVzaCkKYCRmb3JtLkNvbnRyb2xzLkFkZChgJGJ0bk9wZW5Mb2cpCmAkZm9ybS5Db250cm9scy5BZGQoYCRidG5DbG9zZSkKCmAkZm9ybS5BY2NlcHRCdXR0b24gPSBgJGJ0bkluc3RhbGwKYCRmb3JtLkNhbmNlbEJ1dHRvbiA9IGAkYnRuQ2xvc2UKCnRyeSB7CiAgICBMb2FkLUFwcExpc3QKfQpjYXRjaCB7CiAgICBgJHN0YXR1cy5UZXh0ID0gIkZlaGxlciBiZWltIExhZGVuOiAiICsgYCRfLkV4Y2VwdGlvbi5NZXNzYWdlCiAgICBbU3lzdGVtLldpbmRvd3MuRm9ybXMuTWVzc2FnZUJveF06OlNob3coCiAgICAgICAgIkRlciBTb2Z0d2FyZWthdGFsb2cga29ubnRlIG5pY2h0IHZvbGxzdMOkbmRpZyBnZWxhZGVuIHdlcmRlbi5gcmBuYHJgbiIgKyBgJF8uRXhjZXB0aW9uLk1lc3NhZ2UsCiAgICAgICAgYCRDYXRhbG9nVGl0bGUsCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hCdXR0b25zXTo6T0ssCiAgICAgICAgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hJY29uXTo6RXJyb3IKICAgICkgfCBPdXQtTnVsbAp9Cgpbdm9pZF1gJGZvcm0uU2hvd0RpYWxvZygpCiJACgogICAgV3JpdGUtVGV4dEZpbGUgLVBhdGggJENhdGFsb2dHdWlQYXRoIC1Db250ZW50ICRjb250ZW50IC1FbmNvZGluZyBVdGY4Qm9tCiAgICBTZXQtRmlsZUFjbEFkbWluc09ubHkgLVBhdGggJENhdGFsb2dHdWlQYXRoCn0KCmZ1bmN0aW9uIE5ldy1DYXRhbG9nTGF1bmNoZXIgewogICAgJHBzUXVvdGVkID0gJFBvd2VyU2hlbGxFeGUuUmVwbGFjZSgnIicsICciIicpCiAgICAkZ3VpUXVvdGVkID0gJENhdGFsb2dHdWlQYXRoLlJlcGxhY2UoJyInLCAnIiInKQoKICAgICR2YnMgPSBAIgpTZXQgc2hlbGwgPSBDcmVhdGVPYmplY3QoIldTY3JpcHQuU2hlbGwiKQpjbWRMaW5lID0gQ2hyKDM0KSAmICIkcHNRdW90ZWQiICYgQ2hyKDM0KSAmICIgLU5vUHJvZmlsZSAtRXhlY3V0aW9uUG9saWN5IEJ5cGFzcyAtU1RBIC1XaW5kb3dTdHlsZSBIaWRkZW4gLUZpbGUgIiAmIENocigzNCkgJiAiJGd1aVF1b3RlZCIgJiBDaHIoMzQpCnNoZWxsLlJ1biBjbWRMaW5lLCAwLCBGYWxzZQoiQAoKICAgIFdyaXRlLVRleHRGaWxlIC1QYXRoICRDYXRhbG9nTGF1bmNoZXJQYXRoIC1Db250ZW50ICR2YnMgLUVuY29kaW5nIFVuaWNvZGUKICAgIFNldC1GaWxlQWNsQWRtaW5zT25seSAtUGF0aCAkQ2F0YWxvZ0xhdW5jaGVyUGF0aAp9CgpmdW5jdGlvbiBOZXctU2hvcnRjdXQgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFNob3J0Y3V0UGF0aAogICAgKQoKICAgICRwYXJlbnQgPSBTcGxpdC1QYXRoIC1QYXRoICRTaG9ydGN1dFBhdGggLVBhcmVudAogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkcGFyZW50CgogICAgJHNoZWxsID0gTmV3LU9iamVjdCAtQ29tT2JqZWN0IFdTY3JpcHQuU2hlbGwKICAgICRzaG9ydGN1dCA9ICRzaGVsbC5DcmVhdGVTaG9ydGN1dCgkU2hvcnRjdXRQYXRoKQogICAgJHNob3J0Y3V0LlRhcmdldFBhdGggPSAkV1NjcmlwdEV4ZQogICAgJHNob3J0Y3V0LkFyZ3VtZW50cyA9ICJgIiRDYXRhbG9nTGF1bmNoZXJQYXRoYCIiCiAgICAkc2hvcnRjdXQuV29ya2luZ0RpcmVjdG9yeSA9ICRCYXNlRGlyCiAgICAkc2hvcnRjdXQuV2luZG93U3R5bGUgPSAxCiAgICAkc2hvcnRjdXQuRGVzY3JpcHRpb24gPSAkQ2F0YWxvZ0Rpc3BsYXlOYW1lCiAgICAkc2hvcnRjdXQuSWNvbkxvY2F0aW9uID0gIiRlbnY6U3lzdGVtUm9vdFxTeXN0ZW0zMlxzaGVsbDMyLmRsbCw4MCIKICAgICRzaG9ydGN1dC5TYXZlKCkKfQoKZnVuY3Rpb24gVW5yZWdpc3Rlci1MZWdhY3lRdWV1ZVRhc2sgewogICAgdHJ5IHsKICAgICAgICAkdGFzayA9IEdldC1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkTGVnYWN5UXVldWVUYXNrTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIGlmICgkdGFzaykgewogICAgICAgICAgICBXcml0ZS1Mb2cgIlJlbW92aW5nIGxlZ2FjeSBzY2hlZHVsZWQgdGFzayAnJExlZ2FjeVF1ZXVlVGFza05hbWUnLiIKICAgICAgICAgICAgVW5yZWdpc3Rlci1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkTGVnYWN5UXVldWVUYXNrTmFtZSAtQ29uZmlybTokZmFsc2UKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3QgcmVtb3ZlIGxlZ2FjeSBzY2hlZHVsZWQgdGFzayAnJExlZ2FjeVF1ZXVlVGFza05hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9Cn0KCmZ1bmN0aW9uIFJlZ2lzdGVyLU9yVXBkYXRlVGFza3MgewogICAgVW5yZWdpc3Rlci1MZWdhY3lRdWV1ZVRhc2sKCiAgICB0cnkgewogICAgICAgICRleGlzdGluZ0RhZW1vbiA9IEdldC1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkRGFlbW9uVGFza05hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICBpZiAoJGV4aXN0aW5nRGFlbW9uKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAiU3RvcHBpbmcgc2NoZWR1bGVkIHRhc2sgJyREYWVtb25UYXNrTmFtZScgYmVmb3JlIHVwZGF0ZS4iCiAgICAgICAgICAgIFN0b3AtU2NoZWR1bGVkVGFzayAtVGFza05hbWUgJERhZW1vblRhc2tOYW1lIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlCiAgICAgICAgICAgIFN0YXJ0LVNsZWVwIC1TZWNvbmRzIDIKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJDb3VsZCBub3Qgc3RvcCBkYWVtb24gdGFzayAnJERhZW1vblRhc2tOYW1lJzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgfQoKICAgICRwcmluY2lwYWwgPSBOZXctU2NoZWR1bGVkVGFza1ByaW5jaXBhbCBgCiAgICAgICAgLVVzZXJJZCAnU1lTVEVNJyBgCiAgICAgICAgLUxvZ29uVHlwZSBTZXJ2aWNlQWNjb3VudCBgCiAgICAgICAgLVJ1bkxldmVsIEhpZ2hlc3QKCiAgICBXcml0ZS1Mb2cgIlJlZ2lzdGVyaW5nL3VwZGF0aW5nIHNjaGVkdWxlZCB0YXNrICckRGFlbW9uVGFza05hbWUnLiIKICAgICRkYWVtb25BcmdzID0gIi1Ob1Byb2ZpbGUgLUV4ZWN1dGlvblBvbGljeSBCeXBhc3MgLUZpbGUgYCIkTG9jYWxTY3JpcHRQYXRoYCIgLU1vZGUgRGFlbW9uIgogICAgJGRhZW1vbkFjdGlvbiA9IE5ldy1TY2hlZHVsZWRUYXNrQWN0aW9uIC1FeGVjdXRlICRQb3dlclNoZWxsRXhlIC1Bcmd1bWVudCAkZGFlbW9uQXJncwogICAgJGRhZW1vblRyaWdnZXIgPSBOZXctU2NoZWR1bGVkVGFza1RyaWdnZXIgLUF0U3RhcnR1cAogICAgJGRhZW1vblNldHRpbmdzID0gTmV3LVNjaGVkdWxlZFRhc2tTZXR0aW5nc1NldCBgCiAgICAgICAgLUFsbG93U3RhcnRJZk9uQmF0dGVyaWVzIGAKICAgICAgICAtRG9udFN0b3BJZkdvaW5nT25CYXR0ZXJpZXMgYAogICAgICAgIC1TdGFydFdoZW5BdmFpbGFibGUgYAogICAgICAgIC1NdWx0aXBsZUluc3RhbmNlcyBJZ25vcmVOZXcgYAogICAgICAgIC1FeGVjdXRpb25UaW1lTGltaXQgKE5ldy1UaW1lU3BhbiAtU2Vjb25kcyAwKSBgCiAgICAgICAgLVJlc3RhcnRDb3VudCAzIGAKICAgICAgICAtUmVzdGFydEludGVydmFsIChOZXctVGltZVNwYW4gLU1pbnV0ZXMgMSkKCiAgICAkZGFlbW9uVGFzayA9IE5ldy1TY2hlZHVsZWRUYXNrIGAKICAgICAgICAtQWN0aW9uICRkYWVtb25BY3Rpb24gYAogICAgICAgIC1UcmlnZ2VyICRkYWVtb25UcmlnZ2VyIGAKICAgICAgICAtUHJpbmNpcGFsICRwcmluY2lwYWwgYAogICAgICAgIC1TZXR0aW5ncyAkZGFlbW9uU2V0dGluZ3MKCiAgICBSZWdpc3Rlci1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkRGFlbW9uVGFza05hbWUgLUlucHV0T2JqZWN0ICRkYWVtb25UYXNrIC1Gb3JjZSB8IE91dC1OdWxsCgogICAgV3JpdGUtTG9nICJSZWdpc3RlcmluZy91cGRhdGluZyBzY2hlZHVsZWQgdGFzayAnJFVwZ3JhZGVUYXNrTmFtZScuIgogICAgJHVwZ3JhZGVBcmdzID0gIi1Ob1Byb2ZpbGUgLUV4ZWN1dGlvblBvbGljeSBCeXBhc3MgLUZpbGUgYCIkTG9jYWxTY3JpcHRQYXRoYCIgLU1vZGUgVXBncmFkZUFsbCIKICAgICR1cGdyYWRlQWN0aW9uID0gTmV3LVNjaGVkdWxlZFRhc2tBY3Rpb24gLUV4ZWN1dGUgJFBvd2VyU2hlbGxFeGUgLUFyZ3VtZW50ICR1cGdyYWRlQXJncwogICAgJHVwZ3JhZGVUcmlnZ2VyID0gTmV3LVNjaGVkdWxlZFRhc2tUcmlnZ2VyIGAKICAgICAgICAtT25jZSBgCiAgICAgICAgLUF0ICgoR2V0LURhdGUpLkFkZE1pbnV0ZXMoMikpIGAKICAgICAgICAtUmVwZXRpdGlvbkludGVydmFsIChOZXctVGltZVNwYW4gLUhvdXJzIDIpIGAKICAgICAgICAtUmVwZXRpdGlvbkR1cmF0aW9uIChOZXctVGltZVNwYW4gLURheXMgMzY1MCkKICAgICR1cGdyYWRlU2V0dGluZ3MgPSBOZXctU2NoZWR1bGVkVGFza1NldHRpbmdzU2V0IGAKICAgICAgICAtQWxsb3dTdGFydElmT25CYXR0ZXJpZXMgYAogICAgICAgIC1Eb250U3RvcElmR29pbmdPbkJhdHRlcmllcyBgCiAgICAgICAgLVN0YXJ0V2hlbkF2YWlsYWJsZSBgCiAgICAgICAgLU11bHRpcGxlSW5zdGFuY2VzIElnbm9yZU5ldyBgCiAgICAgICAgLUV4ZWN1dGlvblRpbWVMaW1pdCAoTmV3LVRpbWVTcGFuIC1Ib3VycyAyKQoKICAgICR1cGdyYWRlVGFzayA9IE5ldy1TY2hlZHVsZWRUYXNrIGAKICAgICAgICAtQWN0aW9uICR1cGdyYWRlQWN0aW9uIGAKICAgICAgICAtVHJpZ2dlciAkdXBncmFkZVRyaWdnZXIgYAogICAgICAgIC1QcmluY2lwYWwgJHByaW5jaXBhbCBgCiAgICAgICAgLVNldHRpbmdzICR1cGdyYWRlU2V0dGluZ3MKCiAgICBSZWdpc3Rlci1TY2hlZHVsZWRUYXNrIC1UYXNrTmFtZSAkVXBncmFkZVRhc2tOYW1lIC1JbnB1dE9iamVjdCAkdXBncmFkZVRhc2sgLUZvcmNlIHwgT3V0LU51bGwKCiAgICB0cnkgewogICAgICAgIFN0YXJ0LVNjaGVkdWxlZFRhc2sgLVRhc2tOYW1lICREYWVtb25UYXNrTmFtZQogICAgfQogICAgY2F0Y2ggewogICAgICAgIFdyaXRlLUxvZyAiQ291bGQgbm90IHN0YXJ0IGRhZW1vbiB0YXNrICckRGFlbW9uVGFza05hbWUnOiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1XaW5nZXRJbnN0YWxsIHsKICAgIHBhcmFtKAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRQYWNrYWdlSWQsCiAgICAgICAgW3N0cmluZ10kUXVldWVJdGVtSWQKICAgICkKCiAgICAkYXJndW1lbnRzID0gQCgKICAgICAgICAnaW5zdGFsbCcKICAgICAgICAnLS1pZCcsICRQYWNrYWdlSWQKICAgICAgICAnLS1leGFjdCcKICAgICAgICAnLS1zY29wZScsICdtYWNoaW5lJwogICAgICAgICctLXNpbGVudCcKICAgICAgICAnLS1hY2NlcHQtcGFja2FnZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWFjY2VwdC1zb3VyY2UtYWdyZWVtZW50cycKICAgICAgICAnLS1kaXNhYmxlLWludGVyYWN0aXZpdHknCiAgICApCgogICAgV3JpdGUtTG9nICJFeGVjdXRpbmc6IGAiJFdpbmdldFBhdGhgIiAkKCRhcmd1bWVudHMgLWpvaW4gJyAnKSIKICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICBVcGRhdGUtUXVldWVJdGVtUHJvZ3Jlc3MgLUlkICRRdWV1ZUl0ZW1JZCAtU3RhZ2UgJ0luc3RhbGwnIC1TdGFnZVRleHQgJ0luc3RhbGxhdGlvbiBsw6R1ZnQuLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KCiAgICAkb3V0cHV0TGluZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCiAgICAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAkbGluZSA9IFtzdHJpbmddJF8KICAgICAgICBbdm9pZF0kb3V0cHV0TGluZXMuQWRkKCRsaW5lKQogICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQ6ICRsaW5lIgogICAgICAgICAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgICAgICAgICAkcGVyY2VudCA9IEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSAtTGluZSAkbGluZQogICAgICAgICAgICAgICAgaWYgKCRudWxsIC1uZSAkcGVyY2VudCkgewogICAgICAgICAgICAgICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnRG93bmxvYWQnIC1TdGFnZVRleHQgKCJEb3dubG9hZCBsw6R1ZnQuLi4gezB9JSIgLWYgJHBlcmNlbnQpIC1Qcm9ncmVzc1BlcmNlbnQgJHBlcmNlbnQgLUlzSW5kZXRlcm1pbmF0ZTokZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICByZXR1cm4gJGV4aXRDb2RlCn0KCmZ1bmN0aW9uIEludm9rZS1XaW5nZXRVbmluc3RhbGwgewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFdpbmdldFBhdGgsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtzdHJpbmddJFBhY2thZ2VJZCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgICRhcmd1bWVudHMgPSBAKAogICAgICAgICd1bmluc3RhbGwnCiAgICAgICAgJy0taWQnLCAkUGFja2FnZUlkCiAgICAgICAgJy0tZXhhY3QnCiAgICAgICAgJy0tc2NvcGUnLCAnbWFjaGluZScKICAgICAgICAnLS1zaWxlbnQnCiAgICAgICAgJy0tYWNjZXB0LXNvdXJjZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWRpc2FibGUtaW50ZXJhY3Rpdml0eScKICAgICkKCiAgICBXcml0ZS1Mb2cgIkV4ZWN1dGluZzogYCIkV2luZ2V0UGF0aGAiICQoJGFyZ3VtZW50cyAtam9pbiAnICcpIgogICAgaWYgKCRRdWV1ZUl0ZW1JZCkgewogICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVW5pbnN0YWxsJyAtU3RhZ2VUZXh0ICdEZWluc3RhbGxhdGlvbiBsw6R1ZnQuLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KCiAgICAkb3V0cHV0TGluZXMgPSBOZXctT2JqZWN0ICdTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cmluZ10nCiAgICAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IEZvckVhY2gtT2JqZWN0IHsKICAgICAgICAkbGluZSA9IFtzdHJpbmddJF8KICAgICAgICBbdm9pZF0kb3V0cHV0TGluZXMuQWRkKCRsaW5lKQogICAgICAgIGlmICgkbGluZS5UcmltKCkpIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJ3aW5nZXQ6ICRsaW5lIgogICAgICAgICAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgICAgICAgICAkcGVyY2VudCA9IEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSAtTGluZSAkbGluZQogICAgICAgICAgICAgICAgaWYgKCRudWxsIC1uZSAkcGVyY2VudCkgewogICAgICAgICAgICAgICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVW5pbnN0YWxsJyAtU3RhZ2VUZXh0ICgiRGVpbnN0YWxsYXRpb24gbMOkdWZ0Li4uIHswfSUiIC1mICRwZXJjZW50KSAtUHJvZ3Jlc3NQZXJjZW50ICRwZXJjZW50IC1Jc0luZGV0ZXJtaW5hdGU6JGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkZXhpdENvZGUgPSAkTEFTVEVYSVRDT0RFCgogICAgcmV0dXJuICRleGl0Q29kZQp9CgpmdW5jdGlvbiBJbnZva2UtV2luZ2V0VXBncmFkZUFsbCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kV2luZ2V0UGF0aCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgICRhcmd1bWVudHMgPSBAKAogICAgICAgICd1cGdyYWRlJwogICAgICAgICctLWFsbCcKICAgICAgICAnLS1zY29wZScsICdtYWNoaW5lJwogICAgICAgICctLXNpbGVudCcKICAgICAgICAnLS1hY2NlcHQtcGFja2FnZS1hZ3JlZW1lbnRzJwogICAgICAgICctLWFjY2VwdC1zb3VyY2UtYWdyZWVtZW50cycKICAgICAgICAnLS1kaXNhYmxlLWludGVyYWN0aXZpdHknCiAgICApCgogICAgV3JpdGUtTG9nICJFeGVjdXRpbmcgMi1ob3VyIHVwZ3JhZGU6IGAiJFdpbmdldFBhdGhgIiAkKCRhcmd1bWVudHMgLWpvaW4gJyAnKSIKICAgIGlmICgkUXVldWVJdGVtSWQpIHsKICAgICAgICBVcGRhdGUtUXVldWVJdGVtUHJvZ3Jlc3MgLUlkICRRdWV1ZUl0ZW1JZCAtU3RhZ2UgJ1VwZ3JhZGUnIC1TdGFnZVRleHQgJ1VwZGF0ZXMgbGF1ZmVuLi4uJyAtSXNJbmRldGVybWluYXRlOiR0cnVlCiAgICB9CgogICAgJG91dHB1dExpbmVzID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdFtzdHJpbmddJwogICAgJiAkV2luZ2V0UGF0aCBAYXJndW1lbnRzIDI+JjEgfCBGb3JFYWNoLU9iamVjdCB7CiAgICAgICAgJGxpbmUgPSBbc3RyaW5nXSRfCiAgICAgICAgW3ZvaWRdJG91dHB1dExpbmVzLkFkZCgkbGluZSkKICAgICAgICBpZiAoJGxpbmUuVHJpbSgpKSB7CiAgICAgICAgICAgIFdyaXRlLUxvZyAid2luZ2V0IHVwZ3JhZGU6ICRsaW5lIgogICAgICAgICAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgICAgICAgICAkcGVyY2VudCA9IEdldC1Qcm9ncmVzc1BlcmNlbnRGcm9tTGluZSAtTGluZSAkbGluZQogICAgICAgICAgICAgICAgaWYgKCRudWxsIC1uZSAkcGVyY2VudCkgewogICAgICAgICAgICAgICAgICAgIFVwZGF0ZS1RdWV1ZUl0ZW1Qcm9ncmVzcyAtSWQgJFF1ZXVlSXRlbUlkIC1TdGFnZSAnVXBncmFkZScgLVN0YWdlVGV4dCAoIlVwZGF0ZXMgbGF1ZmVuLi4uIHswfSUiIC1mICRwZXJjZW50KSAtUHJvZ3Jlc3NQZXJjZW50ICRwZXJjZW50IC1Jc0luZGV0ZXJtaW5hdGU6JGZhbHNlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkZXhpdENvZGUgPSAkTEFTVEVYSVRDT0RFCgogICAgcmV0dXJuICRleGl0Q29kZQp9CgpmdW5jdGlvbiBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kV2luZ2V0UGF0aCwKICAgICAgICBbc3RyaW5nXSRRdWV1ZUl0ZW1JZAogICAgKQoKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKCiAgICAkdGVtcFJvb3QgPSBpZiAoJGVudjpURU1QKSB7ICRlbnY6VEVNUCB9IGVsc2VpZiAoJGVudjpUTVApIHsgJGVudjpUTVAgfSBlbHNlIHsgJEJhc2VEaXIgfQogICAgJHRlbXBGaWxlID0gSm9pbi1QYXRoICR0ZW1wUm9vdCAoInNlbGZzZXJ2aWNlLXdpbmdldC1leHBvcnQtezB9Lmpzb24iIC1mIFtHdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCdOJykpCiAgICAkc25hcHNob3RUZW1wRmlsZSA9IEpvaW4tUGF0aCAkQmFzZURpciAoIkluc3RhbGxlZC1QYWNrYWdlcy17MH0uanNvbi50bXAiIC1mIFtHdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCdOJykpCgogICAgJGFyZ3VtZW50cyA9IEAoCiAgICAgICAgJ2V4cG9ydCcKICAgICAgICAnLS1vdXRwdXQnLCAkdGVtcEZpbGUKICAgICAgICAnLS1hY2NlcHQtc291cmNlLWFncmVlbWVudHMnCiAgICAgICAgJy0tZGlzYWJsZS1pbnRlcmFjdGl2aXR5JwogICAgKQoKICAgIFdyaXRlLUxvZyAnUmVmcmVzaGluZyBpbnN0YWxsZWQgcGFja2FnZSBzbmFwc2hvdC4nCiAgICBpZiAoJFF1ZXVlSXRlbUlkKSB7CiAgICAgICAgVXBkYXRlLVF1ZXVlSXRlbVByb2dyZXNzIC1JZCAkUXVldWVJdGVtSWQgLVN0YWdlICdTbmFwc2hvdCcgLVN0YWdlVGV4dCAnSW5zdGFsbGF0aW9uc2RhdGVuIHdlcmRlbiBha3R1YWxpc2llcnQuLi4nIC1Jc0luZGV0ZXJtaW5hdGU6JHRydWUKICAgIH0KICAgICRvdXRwdXQgPSAmICRXaW5nZXRQYXRoIEBhcmd1bWVudHMgMj4mMSB8IE91dC1TdHJpbmcKICAgICRleGl0Q29kZSA9ICRMQVNURVhJVENPREUKCiAgICBpZiAoJG91dHB1dCkgewogICAgICAgIGZvcmVhY2ggKCRsaW5lIGluICgkb3V0cHV0IC1zcGxpdCAiYHI/YG4iKSkgewogICAgICAgICAgICBpZiAoJGxpbmUuVHJpbSgpKSB7CiAgICAgICAgICAgICAgICBXcml0ZS1Mb2cgIndpbmdldCBleHBvcnQ6ICRsaW5lIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICgkZXhpdENvZGUgLW5lIDApIHsKICAgICAgICBXcml0ZS1Mb2cgIndpbmdldCBleHBvcnQgZmFpbGVkIHdpdGggY29kZSAkZXhpdENvZGU7IHNuYXBzaG90IHdhcyBub3QgdXBkYXRlZC4iICdXQVJOJwogICAgICAgIGlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICR0ZW1wRmlsZSkgewogICAgICAgICAgICBSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZhbHNlCiAgICB9CgogICAgaWYgKC1ub3QgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlKSkgewogICAgICAgIFdyaXRlLUxvZyAnd2luZ2V0IGV4cG9ydCBkaWQgbm90IHByb2R1Y2UgYW4gb3V0cHV0IGZpbGU7IHNuYXBzaG90IHdhcyBub3QgdXBkYXRlZC4nICdXQVJOJwogICAgICAgIHJldHVybiAkZmFsc2UKICAgIH0KCiAgICB0cnkgewogICAgICAgICRyYXcgPSBHZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJHRlbXBGaWxlIC1SYXcgLUVuY29kaW5nIFVURjgKICAgICAgICAkZXhwb3J0ID0gJHJhdyB8IENvbnZlcnRGcm9tLUpzb24KCiAgICAgICAgJHBhY2thZ2VJZHMgPSBAKCkKICAgICAgICBmb3JlYWNoICgkc291cmNlIGluIEAoJGV4cG9ydC5Tb3VyY2VzKSkgewogICAgICAgICAgICBmb3JlYWNoICgkcGtnIGluIEAoJHNvdXJjZS5QYWNrYWdlcykpIHsKICAgICAgICAgICAgICAgIGlmICgkcGtnLlBhY2thZ2VJZGVudGlmaWVyKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhY2thZ2VJZHMgKz0gW3N0cmluZ10kcGtnLlBhY2thZ2VJZGVudGlmaWVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlaWYgKCRwa2cuUGFja2FnZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhY2thZ2VJZHMgKz0gW3N0cmluZ10kcGtnLlBhY2thZ2VJZAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcGFja2FnZUlkcyA9ICRwYWNrYWdlSWRzIHwKICAgICAgICAgICAgV2hlcmUtT2JqZWN0IHsgLW5vdCBbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRfKSB9IHwKICAgICAgICAgICAgRm9yRWFjaC1PYmplY3QgeyAkXy5UcmltKCkgfSB8CiAgICAgICAgICAgIFNvcnQtT2JqZWN0IC1VbmlxdWUKCiAgICAgICAgJHNuYXBzaG90ID0gW29yZGVyZWRdQHsKICAgICAgICAgICAgR2VuZXJhdGVkQXQgICAgICAgICAgPSAoR2V0LURhdGUpLlRvU3RyaW5nKCdvJykKICAgICAgICAgICAgSW5zdGFsbGVkUGFja2FnZUlkcyAgPSBAKCRwYWNrYWdlSWRzKQogICAgICAgIH0KCiAgICAgICAgJHNuYXBzaG90IHwgQ29udmVydFRvLUpzb24gLURlcHRoIDUgfCBTZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUgLUVuY29kaW5nIFVURjgKICAgICAgICBNb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRzbmFwc2hvdFRlbXBGaWxlIC1EZXN0aW5hdGlvbiAkSW5zdGFsbGVkUGFja2FnZXNQYXRoIC1Gb3JjZQogICAgICAgIFdyaXRlLUxvZyAiSW5zdGFsbGVkIHBhY2thZ2Ugc25hcHNob3Qgd3JpdHRlbiB0byAnJEluc3RhbGxlZFBhY2thZ2VzUGF0aCcgKGNvdW50PSQoQCgkcGFja2FnZUlkcykuQ291bnQpKS4iCiAgICAgICAgcmV0dXJuICR0cnVlCiAgICB9CiAgICBjYXRjaCB7CiAgICAgICAgV3JpdGUtTG9nICJGYWlsZWQgdG8gd3JpdGUgaW5zdGFsbGVkIHBhY2thZ2Ugc25hcHNob3Q6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnV0FSTicKICAgICAgICByZXR1cm4gJGZhbHNlCiAgICB9CiAgICBmaW5hbGx5IHsKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkdGVtcEZpbGUpIHsKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICR0ZW1wRmlsZSAtRm9yY2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUKICAgICAgICB9CiAgICAgICAgaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJHNuYXBzaG90VGVtcEZpbGUpIHsKICAgICAgICAgICAgUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRzbmFwc2hvdFRlbXBGaWxlIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gR2V0LUluc3RhbGxlZFBhY2thZ2VJZFNldCB7CiAgICAkc2V0ID0gTmV3LU9iamVjdCAnU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSGFzaFNldFtzdHJpbmddJyAoW1N5c3RlbS5TdHJpbmdDb21wYXJlcl06Ok9yZGluYWxJZ25vcmVDYXNlKQoKICAgIGlmICgtbm90IChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRJbnN0YWxsZWRQYWNrYWdlc1BhdGgpKSB7CiAgICAgICAgcmV0dXJuICRzZXQKICAgIH0KCiAgICB0cnkgewogICAgICAgICRyYXcgPSBHZXQtQ29udGVudCAtTGl0ZXJhbFBhdGggJEluc3RhbGxlZFBhY2thZ2VzUGF0aCAtUmF3IC1FbmNvZGluZyBVVEY4CiAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHJhdykpIHsKICAgICAgICAgICAgcmV0dXJuICRzZXQKICAgICAgICB9CgogICAgICAgICRzbmFwc2hvdCA9ICRyYXcgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgZm9yZWFjaCAoJGlkIGluIEAoJHNuYXBzaG90Lkluc3RhbGxlZFBhY2thZ2VJZHMpKSB7CiAgICAgICAgICAgIGlmICgtbm90IFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ10kaWQpKSB7CiAgICAgICAgICAgICAgICBbdm9pZF0kc2V0LkFkZCgoW3N0cmluZ10kaWQpLlRyaW0oKSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkZhaWxlZCB0byByZWFkIGluc3RhbGxlZCBwYWNrYWdlIHNuYXBzaG90OiAkKCRfLkV4Y2VwdGlvbi5NZXNzYWdlKSIgJ1dBUk4nCiAgICB9CgogICAgcmV0dXJuICRzZXQKfQoKZnVuY3Rpb24gSW52b2tlLVJlcXVpcmVkU29mdHdhcmVQb2xpY3kgewogICAgcGFyYW0oW3N0cmluZ10kV2luZ2V0UGF0aCkKCiAgICBpZiAoLW5vdCAoVGVzdC1Tb2Z0d2FyZUNhdGFsb2dQb2xpY3lFbmFibGVkKSkgewogICAgICAgIFdyaXRlLUxvZyAnUmVxdWlyZWQgc29mdHdhcmUgcG9saWN5IHNraXBwZWQgYmVjYXVzZSBTb2Z0d2FyZWthdGFsb2cgcG9saWN5IGlzIGRpc2FibGVkIG9yIG5vdCBjb25maWd1cmVkLicgJ1dBUk4nCiAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AeyBJbnN0YWxsZWQgPSAwOyBGYWlsZWQgPSAwOyBTa2lwcGVkID0gMCB9CiAgICB9CgogICAgaWYgKC1ub3QgKFRlc3QtUmVxdWlyZWRFbmZvcmNlbWVudEVuYWJsZWQpKSB7CiAgICAgICAgV3JpdGUtTG9nICdSZXF1aXJlZCBzb2Z0d2FyZSBlbmZvcmNlbWVudCBpcyBkaXNhYmxlZCBieSBwb2xpY3kuJwogICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsgSW5zdGFsbGVkID0gMDsgRmFpbGVkID0gMDsgU2tpcHBlZCA9IDAgfQogICAgfQoKICAgICRyZXF1aXJlZEFsaWFzZXMgPSBAKEdldC1SZXF1aXJlZEFsaWFzZXMpCiAgICBpZiAoJHJlcXVpcmVkQWxpYXNlcy5Db3VudCAtbHQgMSkgewogICAgICAgIFdyaXRlLUxvZyAnTm8gcmVxdWlyZWQgc29mdHdhcmUgY29uZmlndXJlZCBieSBwb2xpY3kuJwogICAgICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsgSW5zdGFsbGVkID0gMDsgRmFpbGVkID0gMDsgU2tpcHBlZCA9IDAgfQogICAgfQoKICAgIGlmICgkV2luZ2V0UGF0aCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIEludm9rZS1XaXRoV2luZ2V0TG9jayAtVGltZW91dFNlY29uZHMgMiAtU2NyaXB0QmxvY2sgewogICAgICAgICAgICAgICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aAogICAgICAgICAgICB9IHwgT3V0LU51bGwKICAgICAgICB9CiAgICAgICAgY2F0Y2ggewogICAgICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCByZWZyZXNoIHNuYXBzaG90IGJlZm9yZSByZXF1aXJlZCBxdWV1ZWluZzogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgICAgIH0KICAgIH0KCiAgICAkcXVldWVkID0gRW5zdXJlLVJlcXVpcmVkU29mdHdhcmVRdWV1ZWQKICAgIGlmICgkcXVldWVkIC1ndCAwKSB7CiAgICAgICAgU3RhcnQtUXVldWVXb3JrZXIKICAgIH0KCiAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7IEluc3RhbGxlZCA9IDA7IEZhaWxlZCA9IDA7IFNraXBwZWQgPSAwOyBRdWV1ZWQgPSAkcXVldWVkIH0KfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dQaXBlU2VjdXJpdHkgewogICAgJHBpcGVTZWN1cml0eSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVTZWN1cml0eQoKICAgICRzaWRTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWwuU2VjdXJpdHlJZGVudGlmaWVyKCdTLTEtNS0xOCcpCiAgICAkc2lkQWRtaW5zID0gTmV3LU9iamVjdCBTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsLlNlY3VyaXR5SWRlbnRpZmllcignUy0xLTUtMzItNTQ0JykKICAgICRzaWRVc2VycyA9IE5ldy1PYmplY3QgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5TZWN1cml0eUlkZW50aWZpZXIoJ1MtMS01LTMyLTU0NScpCgogICAgJHJ1bGVTeXN0ZW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUnVsZSgKICAgICAgICAkc2lkU3lzdGVtLAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZUFjY2Vzc1JpZ2h0c106OkZ1bGxDb250cm9sLAogICAgICAgIFtTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5BY2Nlc3NDb250cm9sVHlwZV06OkFsbG93CiAgICApCiAgICAkcnVsZUFkbWlucyA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLlBpcGVBY2Nlc3NSdWxlKAogICAgICAgICRzaWRBZG1pbnMsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUmlnaHRzXTo6RnVsbENvbnRyb2wsCiAgICAgICAgW1N5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlXTo6QWxsb3cKICAgICkKICAgICRydWxlVXNlcnMgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUnVsZSgKICAgICAgICAkc2lkVXNlcnMsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlQWNjZXNzUmlnaHRzXTo6UmVhZFdyaXRlLAogICAgICAgIFtTeXN0ZW0uU2VjdXJpdHkuQWNjZXNzQ29udHJvbC5BY2Nlc3NDb250cm9sVHlwZV06OkFsbG93CiAgICApCgogICAgJG51bGwgPSAkcGlwZVNlY3VyaXR5LkFkZEFjY2Vzc1J1bGUoJHJ1bGVTeXN0ZW0pCiAgICAkbnVsbCA9ICRwaXBlU2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgkcnVsZUFkbWlucykKICAgICRudWxsID0gJHBpcGVTZWN1cml0eS5BZGRBY2Nlc3NSdWxlKCRydWxlVXNlcnMpCgogICAgcmV0dXJuICRwaXBlU2VjdXJpdHkKfQoKZnVuY3Rpb24gTmV3LUNhdGFsb2dQaXBlU2VydmVyIHsKICAgICRwaXBlU2VjdXJpdHkgPSBOZXctQ2F0YWxvZ1BpcGVTZWN1cml0eQogICAgcmV0dXJuIE5ldy1PYmplY3QgU3lzdGVtLklPLlBpcGVzLk5hbWVkUGlwZVNlcnZlclN0cmVhbSAtQXJndW1lbnRMaXN0IEAoCiAgICAgICAgJFBpcGVOYW1lLAogICAgICAgIFtTeXN0ZW0uSU8uUGlwZXMuUGlwZURpcmVjdGlvbl06OkluT3V0LAogICAgICAgIDEsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlVHJhbnNtaXNzaW9uTW9kZV06OkJ5dGUsCiAgICAgICAgW1N5c3RlbS5JTy5QaXBlcy5QaXBlT3B0aW9uc106Ok5vbmUsCiAgICAgICAgNDA5NiwKICAgICAgICA0MDk2LAogICAgICAgICRwaXBlU2VjdXJpdHkKICAgICkKfQoKZnVuY3Rpb24gR2V0LVBpcGVDbGllbnRJZGVudGl0eSB7CiAgICBwYXJhbShbUGFyYW1ldGVyKE1hbmRhdG9yeSldW1N5c3RlbS5JTy5QaXBlcy5OYW1lZFBpcGVTZXJ2ZXJTdHJlYW1dJFBpcGUpCgogICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJG51bGwKICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5U2lkID0gJG51bGwKCiAgICB0cnkgewogICAgICAgICRQaXBlLlJ1bkFzQ2xpZW50KFtTeXN0ZW0uSU8uUGlwZXMuUGlwZVN0cmVhbUltcGVyc29uYXRpb25Xb3JrZXJdewogICAgICAgICAgICAkaWRlbnRpdHkgPSBbU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbC5XaW5kb3dzSWRlbnRpdHldOjpHZXRDdXJyZW50KCkKICAgICAgICAgICAgJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lID0gJGlkZW50aXR5Lk5hbWUKICAgICAgICAgICAgaWYgKCRpZGVudGl0eS5Vc2VyKSB7CiAgICAgICAgICAgICAgICAkc2NyaXB0OlBpcGVDbGllbnRJZGVudGl0eVNpZCA9ICRpZGVudGl0eS5Vc2VyLlZhbHVlCiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfQogICAgY2F0Y2ggewogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5TmFtZSA9ICRQaXBlLkdldEltcGVyc29uYXRpb25Vc2VyTmFtZSgpCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICB9CiAgICB9CgogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lKSkgewogICAgICAgICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5TmFtZSA9ICdVbmtub3duJwogICAgfQoKICAgIHJldHVybiBbcHNjdXN0b21vYmplY3RdQHsKICAgICAgICBOYW1lID0gJHNjcmlwdDpQaXBlQ2xpZW50SWRlbnRpdHlOYW1lCiAgICAgICAgU2lkICA9ICRzY3JpcHQ6UGlwZUNsaWVudElkZW50aXR5U2lkCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1DYXRhbG9nRGFlbW9uQ29tbWFuZCB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldJFJlcXVlc3QsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRDbGllbnRJZGVudGl0eQogICAgKQoKICAgIGlmICgtbm90ICRDbGllbnRJZGVudGl0eSAtb3IgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkQ2xpZW50SWRlbnRpdHkuTmFtZSkgLW9yICRDbGllbnRJZGVudGl0eS5OYW1lIC1lcSAnVW5rbm93bicpIHsKICAgICAgICB0aHJvdyAnTmFtZWQgcGlwZSBjbGllbnQgY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQuJwogICAgfQoKICAgICRjb21tYW5kID0gJG51bGwKICAgICRjb21tYW5kUHJvcGVydHkgPSAkUmVxdWVzdC5QU09iamVjdC5Qcm9wZXJ0aWVzWydDb21tYW5kJ10KICAgICRhY3Rpb25Qcm9wZXJ0eSA9ICRSZXF1ZXN0LlBTT2JqZWN0LlByb3BlcnRpZXNbJ0FjdGlvbiddCiAgICBpZiAoJGNvbW1hbmRQcm9wZXJ0eSAtYW5kICRjb21tYW5kUHJvcGVydHkuVmFsdWUpIHsKICAgICAgICAkY29tbWFuZCA9IFtzdHJpbmddJGNvbW1hbmRQcm9wZXJ0eS5WYWx1ZQogICAgfQogICAgZWxzZWlmICgkYWN0aW9uUHJvcGVydHkgLWFuZCAkYWN0aW9uUHJvcGVydHkuVmFsdWUpIHsKICAgICAgICAkY29tbWFuZCA9IFtzdHJpbmddJGFjdGlvblByb3BlcnR5LlZhbHVlCiAgICB9CgogICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGNvbW1hbmQpKSB7CiAgICAgICAgdGhyb3cgJ01pc3NpbmcgY29tbWFuZC4nCiAgICB9CgogICAgJGNvbW1hbmQgPSAkY29tbWFuZC5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCgogICAgc3dpdGNoICgkY29tbWFuZCkgewogICAgICAgIHsgJF8gLWluIEAoJ2dldGNhdGFsb2cnLCdnZXRzdGF0ZScpIH0gewogICAgICAgICAgICAkcmVxdWlyZWRRdWV1ZWQgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAogICAgICAgICAgICBpZiAoJHJlcXVpcmVkUXVldWVkIC1ndCAwKSB7CiAgICAgICAgICAgICAgICBBZGQtRGFlbW9uUG9zdFJlc3BvbnNlV29ya2VyIC1Xb3JrZXJNb2RlIFByb2Nlc3NRdWV1ZQogICAgICAgICAgICB9CiAgICAgICAgICAgICRjYXRhbG9nID0gQChHZXQtQXBwQ2F0YWxvZ09iamVjdHMgfCBTb3J0LU9iamVjdCBEaXNwbGF5TmFtZSkKICAgICAgICAgICAgJHJlcXVpcmVkQWxpYXNlcyA9IEAoR2V0LVJlcXVpcmVkQWxpYXNlcykKICAgICAgICAgICAgJHJlcXVpcmVkU2V0ID0gR2V0LVJlcXVpcmVkQWxpYXNTZXQKICAgICAgICAgICAgJGluc3RhbGxlZElkcyA9IEAoKEdldC1JbnN0YWxsZWRQYWNrYWdlSWRTZXQpIHwgRm9yRWFjaC1PYmplY3QgeyBbc3RyaW5nXSRfIH0pCiAgICAgICAgICAgICRxdWV1ZVN0YXRlID0gR2V0LVF1ZXVlU3RhdGVTbmFwc2hvdAogICAgICAgICAgICByZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgQ29tbWFuZCAgICAgICAgICAgID0gJGNvbW1hbmQKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5ICAgICAgICA9ICRDbGllbnRJZGVudGl0eS5OYW1lCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRCeVNpZCAgICAgPSAkQ2xpZW50SWRlbnRpdHkuU2lkCiAgICAgICAgICAgICAgICBDYXRhbG9nICAgICAgICAgICAgPSAkY2F0YWxvZwogICAgICAgICAgICAgICAgUmVxdWlyZWRBbGlhc2VzICAgID0gJHJlcXVpcmVkQWxpYXNlcwogICAgICAgICAgICAgICAgUXVldWUgICAgICAgICAgICAgID0gQCgkcXVldWVTdGF0ZS5RdWV1ZSkKICAgICAgICAgICAgICAgIEN1cnJlbnQgICAgICAgICAgICA9ICRxdWV1ZVN0YXRlLkN1cnJlbnQKICAgICAgICAgICAgICAgIFZlcnNpb24gICAgICAgICAgICA9ICRxdWV1ZVN0YXRlLlZlcnNpb24KICAgICAgICAgICAgICAgIEluc3RhbGxlZFBhY2thZ2VJZHMgPSAkaW5zdGFsbGVkSWRzCiAgICAgICAgICAgICAgICBBbGxvd1VzZXJJbnN0YWxscyAgPSAoVGVzdC1Vc2VySW5zdGFsbHNBbGxvd2VkKQogICAgICAgICAgICAgICAgQWxsb3dVc2VyVW5pbnN0YWxsID0gKFRlc3QtVXNlclVuaW5zdGFsbEFsbG93ZWQpCiAgICAgICAgICAgICAgICBFbmZvcmNlUmVxdWlyZWQgICAgPSAoVGVzdC1SZXF1aXJlZEVuZm9yY2VtZW50RW5hYmxlZCkKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICA9ICdLYXRhbG9nIGdlbGFkZW4uJwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAnYXBwbHlwb2xpY3knIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJBdXRoZW50aWNhdGVkIHBvbGljeSBhcHBseSByZXF1ZXN0ZWQgYnkgdXNlcj0nJCgkQ2xpZW50SWRlbnRpdHkuTmFtZSknIHNpZD0nJCgkQ2xpZW50SWRlbnRpdHkuU2lkKSciCiAgICAgICAgICAgIEFkZC1EYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXIgLVdvcmtlck1vZGUgQXBwbHlQb2xpY3kKICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgPSAkdHJ1ZQogICAgICAgICAgICAgICAgQ29tbWFuZCAgICAgICAgPSAkY29tbWFuZAogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgPSAkQ2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnlTaWQgPSAkQ2xpZW50SWRlbnRpdHkuU2lkCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgICAgICA9ICdQb2xpY3lhbndlbmR1bmcgZ2VzdGFydGV0LicKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgeyAkXyAtaW4gQCgnaW5zdGFsbCcsJ3VuaW5zdGFsbCcpIH0gewogICAgICAgICAgICBpZiAoJGNvbW1hbmQgLWVxICdpbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCkpIHsKICAgICAgICAgICAgICAgIHRocm93ICdCZW51dHplcmluc3RhbGxhdGlvbmVuIHNpbmQgcGVyIFJpY2h0bGluaWUgZGVha3RpdmllcnQuJwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNvbW1hbmQgLWVxICd1bmluc3RhbGwnIC1hbmQgLW5vdCAoVGVzdC1Vc2VyVW5pbnN0YWxsQWxsb3dlZCkpIHsKICAgICAgICAgICAgICAgIHRocm93ICdCZW51dHplcmRlaW5zdGFsbGF0aW9uZW4gc2luZCBwZXIgUmljaHRsaW5pZSBkZWFrdGl2aWVydC4nCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcHBBbGlhc1Byb3BlcnR5ID0gJFJlcXVlc3QuUFNPYmplY3QuUHJvcGVydGllc1snQXBwQWxpYXMnXQogICAgICAgICAgICBpZiAoLW5vdCAkYXBwQWxpYXNQcm9wZXJ0eSAtb3IgW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZShbc3RyaW5nXSRhcHBBbGlhc1Byb3BlcnR5LlZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJ01pc3NpbmcgQXBwQWxpYXMuJwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYWxpYXMgPSAoW3N0cmluZ10kYXBwQWxpYXNQcm9wZXJ0eS5WYWx1ZSkuVHJpbSgpLlRvTG93ZXJJbnZhcmlhbnQoKQogICAgICAgICAgICAkcGFja2FnZUlkID0gR2V0LVBhY2thZ2VJZEJ5QWxpYXMgLUFsaWFzICRhbGlhcwogICAgICAgICAgICBpZiAoLW5vdCAkcGFja2FnZUlkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAiQWxpYXMgJyRhbGlhcycgaXMgbm90IGluIHRoZSBhbGxvd2xpc3QuIgogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVxdWlyZWRTZXQgPSBHZXQtUmVxdWlyZWRBbGlhc1NldAogICAgICAgICAgICBpZiAoJGNvbW1hbmQgLWVxICd1bmluc3RhbGwnIC1hbmQgJHJlcXVpcmVkU2V0LkNvbnRhaW5zKCRhbGlhcykpIHsKICAgICAgICAgICAgICAgIHRocm93ICdQZmxpY2h0c29mdHdhcmUga2FubiBuaWNodCBkZWluc3RhbGxpZXJ0IHdlcmRlbi4nCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhY3Rpb25UZXh0ID0gaWYgKCRjb21tYW5kIC1lcSAndW5pbnN0YWxsJykgeyAndW5pbnN0YWxsJyB9IGVsc2UgeyAnaW5zdGFsbCcgfQogICAgICAgICAgICBXcml0ZS1Mb2cgIkF1dGhlbnRpY2F0ZWQgcmVxdWVzdDogYWN0aW9uPSRhY3Rpb25UZXh0IGFsaWFzPSckYWxpYXMnIHBhY2thZ2U9JyRwYWNrYWdlSWQnIHVzZXI9JyQoJENsaWVudElkZW50aXR5Lk5hbWUpJyBzaWQ9JyQoJENsaWVudElkZW50aXR5LlNpZCknIgoKICAgICAgICAgICAgJHF1ZXVlUmVzdWx0ID0gQWRkLVNvZnR3YXJlUmVxdWVzdFRvUXVldWUgLUFjdGlvbiAkY29tbWFuZCAtQWxpYXMgJGFsaWFzIC1SZXF1ZXN0ZWRCeSAkQ2xpZW50SWRlbnRpdHkuTmFtZSAtUmVxdWVzdGVkQnlTaWQgJENsaWVudElkZW50aXR5LlNpZCAtU291cmNlIFVzZXIKICAgICAgICAgICAgQWRkLURhZW1vblBvc3RSZXNwb25zZVdvcmtlciAtV29ya2VyTW9kZSBQcm9jZXNzUXVldWUKCiAgICAgICAgICAgIGlmICgkY29tbWFuZCAtZXEgJ3VuaW5zdGFsbCcpIHsKICAgICAgICAgICAgICAgICR2ZXJiID0gJ0RlaW5zdGFsbGF0aW9uJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJHZlcmIgPSAnSW5zdGFsbGF0aW9uJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcXVldWVSZXN1bHQuQWRkZWQpIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIiR2ZXJiIGVpbmdlcmVpaHQ6ICRhbGlhcyIKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIiR2ZXJiIGlzdCBiZXJlaXRzIGluIGRlciBXYXJ0ZXNjaGxhbmdlOiAkYWxpYXMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIENvbW1hbmQgICAgICAgICA9ICRjb21tYW5kCiAgICAgICAgICAgICAgICBBcHBBbGlhcyAgICAgICAgPSAkYWxpYXMKICAgICAgICAgICAgICAgIFBhY2thZ2VJZCAgICAgICA9ICRwYWNrYWdlSWQKICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5ICAgICA9ICRDbGllbnRJZGVudGl0eS5OYW1lCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRCeVNpZCAgPSAkQ2xpZW50SWRlbnRpdHkuU2lkCiAgICAgICAgICAgICAgICBRdWV1ZUlkICAgICAgICAgPSAkcXVldWVSZXN1bHQuSXRlbS5JZAogICAgICAgICAgICAgICAgUXVldWVkICAgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9ICRtZXNzYWdlCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHsgJF8gLWluIEAoJ3JlZnJlc2hzdGF0dXMnLCdnZXRzdGF0dXMnKSB9IHsKICAgICAgICAgICAgV3JpdGUtTG9nICJBdXRoZW50aWNhdGVkIHN0YXR1cyByZWZyZXNoIHJlcXVlc3RlZCBieSB1c2VyPSckKCRDbGllbnRJZGVudGl0eS5OYW1lKScgc2lkPSckKCRDbGllbnRJZGVudGl0eS5TaWQpJyIKICAgICAgICAgICAgJHN0YXJ0ZWQgPSAkZmFsc2UKICAgICAgICAgICAgaWYgKFRlc3QtV2luZ2V0TG9ja0F2YWlsYWJsZSkgewogICAgICAgICAgICAgICAgQWRkLURhZW1vblBvc3RSZXNwb25zZVdvcmtlciAtV29ya2VyTW9kZSBQcm9jZXNzUXVldWUKICAgICAgICAgICAgICAgICRzdGFydGVkID0gJHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICRtZXNzYWdlID0gJ0luc3RhbGxhdGlvbnNkYXRlbi1Ba3R1YWxpc2llcnVuZyBnZXN0YXJ0ZXQuJwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAnSW5zdGFsbGF0aW9uc2RhdGVuLUFrdHVhbGlzaWVydW5nIGzDpHVmdCBiZXJlaXRzLicKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgICAgID0gJHRydWUKICAgICAgICAgICAgICAgIENvbW1hbmQgICAgICAgICA9ICRjb21tYW5kCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRCeSAgICAgPSAkQ2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgUmVxdWVzdGVkQnlTaWQgID0gJENsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgU25hcHNob3RRdWV1ZWQgID0gJHN0YXJ0ZWQKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICA9ICRtZXNzYWdlCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGRlZmF1bHQgewogICAgICAgICAgICB0aHJvdyAiVW5zdXBwb3J0ZWQgY29tbWFuZCAnJGNvbW1hbmQnLiIKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIFN0YXJ0LUNhdGFsb2dEYWVtb24gewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBzdGFydGluZyBvbiAnXFwuXHBpcGVcJFBpcGVOYW1lJy4iCgogICAgdHJ5IHsKICAgICAgICBTdGFydC1Tb2Z0d2FyZWthdGFsb2dXb3JrZXIgLVdvcmtlck1vZGUgQXBwbHlQb2xpY3kKICAgIH0KICAgIGNhdGNoIHsKICAgICAgICBXcml0ZS1Mb2cgIkNvdWxkIG5vdCBzdGFydCBpbml0aWFsIHJlcXVpcmVkIHNvZnR3YXJlIGVuZm9yY2VtZW50IHdvcmtlcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdXQVJOJwogICAgfQoKICAgIHdoaWxlICgkdHJ1ZSkgewogICAgICAgICRwaXBlID0gJG51bGwKICAgICAgICB0cnkgewogICAgICAgICAgICAkc2NyaXB0OkRhZW1vblBvc3RSZXNwb25zZVdvcmtlcnMgPSBAKCkKICAgICAgICAgICAgJHBpcGUgPSBOZXctQ2F0YWxvZ1BpcGVTZXJ2ZXIKICAgICAgICAgICAgJHBpcGUuV2FpdEZvckNvbm5lY3Rpb24oKQoKICAgICAgICAgICAgJGNsaWVudElkZW50aXR5ID0gR2V0LVBpcGVDbGllbnRJZGVudGl0eSAtUGlwZSAkcGlwZQogICAgICAgICAgICAkZW5jb2RpbmcgPSBOZXctT2JqZWN0IFN5c3RlbS5UZXh0LlVURjhFbmNvZGluZygkZmFsc2UpCiAgICAgICAgICAgICRyZWFkZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5TdHJlYW1SZWFkZXIoJHBpcGUsICRlbmNvZGluZykKICAgICAgICAgICAgJHdyaXRlciA9IE5ldy1PYmplY3QgU3lzdGVtLklPLlN0cmVhbVdyaXRlcigkcGlwZSwgJGVuY29kaW5nKQogICAgICAgICAgICAkd3JpdGVyLkF1dG9GbHVzaCA9ICR0cnVlCgogICAgICAgICAgICAkcmVzcG9uc2UgPSAkbnVsbAogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHJlYWRUYXNrID0gJHJlYWRlci5SZWFkTGluZUFzeW5jKCkKICAgICAgICAgICAgICAgIGlmICgtbm90ICRyZWFkVGFzay5XYWl0KDMwMDAwKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93ICdUaW1lZCBvdXQgd2FpdGluZyBmb3IgbmFtZWQgcGlwZSByZXF1ZXN0LicKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRsaW5lID0gJHJlYWRUYXNrLlJlc3VsdAogICAgICAgICAgICAgICAgaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGxpbmUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ0VtcHR5IHJlcXVlc3QuJwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRyZXF1ZXN0ID0gJGxpbmUgfCBDb252ZXJ0RnJvbS1Kc29uCiAgICAgICAgICAgICAgICAkcmVzcG9uc2UgPSBJbnZva2UtQ2F0YWxvZ0RhZW1vbkNvbW1hbmQgLVJlcXVlc3QgJHJlcXVlc3QgLUNsaWVudElkZW50aXR5ICRjbGllbnRJZGVudGl0eQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiTmFtZWQgcGlwZSByZXF1ZXN0IGZhaWxlZDogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgICAgICRyZXNwb25zZSA9IFtwc2N1c3RvbW9iamVjdF1AewogICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgID0gJGZhbHNlCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkQnkgICAgPSAkY2xpZW50SWRlbnRpdHkuTmFtZQogICAgICAgICAgICAgICAgICAgIFJlcXVlc3RlZEJ5U2lkID0gJGNsaWVudElkZW50aXR5LlNpZAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgID0gJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHdyaXRlci5Xcml0ZUxpbmUoKCRyZXNwb25zZSB8IENvbnZlcnRUby1Kc29uIC1Db21wcmVzcyAtRGVwdGggNikpCiAgICAgICAgICAgIEludm9rZS1EYWVtb25Qb3N0UmVzcG9uc2VXb3JrZXJzCiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgV3JpdGUtTG9nICJOYW1lZCBwaXBlIGRhZW1vbiBlcnJvcjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkiICdFUlJPUicKICAgICAgICAgICAgU3RhcnQtU2xlZXAgLVNlY29uZHMgMwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgaWYgKCRwaXBlKSB7CiAgICAgICAgICAgICAgICAkcGlwZS5EaXNwb3NlKCkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKZnVuY3Rpb24gUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMgewogICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgewogICAgICAgIHBhcmFtKCRzdGF0ZSkKICAgICAgICBmb3JlYWNoICgkaXRlbSBpbiBAKCRzdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uU3RhdGUgLWVxICdSdW5uaW5nJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2UgPSAnUXVldWVkJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ05hY2ggTmV1c3RhcnQgZXJuZXV0IGVpbmdlcmVpaHQnCiAgICAgICAgICAgICAgICAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQgPSAkbnVsbAogICAgICAgICAgICAgICAgJGl0ZW0uSXNJbmRldGVybWluYXRlID0gJGZhbHNlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFydGVkQXQgPSAkbnVsbAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRzdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gR2V0LU5leHRRdWV1ZWRJdGVtIHsKICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRudWxsCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHN0YXRlKQogICAgICAgIGZvcmVhY2ggKCRpdGVtIGluIChAKCRzdGF0ZS5RdWV1ZSkgfCBTb3J0LU9iamVjdCBDcmVhdGVkQXQpKSB7CiAgICAgICAgICAgIGlmICgtbm90ICRpdGVtKSB7IGNvbnRpbnVlIH0KICAgICAgICAgICAgaWYgKCRpdGVtLlN0YXRlIC1lcSAnUXVldWVkJykgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAnUnVubmluZycKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJ1N0YXJ0aW5nJwogICAgICAgICAgICAgICAgJGl0ZW0uU3RhZ2VUZXh0ID0gJ1ZvcmJlcmVpdHVuZy4uLicKICAgICAgICAgICAgICAgICRpdGVtLlByb2dyZXNzUGVyY2VudCA9ICRudWxsCiAgICAgICAgICAgICAgICAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUgPSAkdHJ1ZQogICAgICAgICAgICAgICAgJGl0ZW0uU3RhcnRlZEF0ID0gKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgICAgICAgICAgICAgICAkc3RhdGUuQ3VycmVudCA9IFtwc2N1c3RvbW9iamVjdF1bb3JkZXJlZF1AewogICAgICAgICAgICAgICAgICAgIElkID0gJGl0ZW0uSWQKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gPSAkaXRlbS5BY3Rpb24KICAgICAgICAgICAgICAgICAgICBBbGlhcyA9ICRpdGVtLkFsaWFzCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPSAkaXRlbS5EaXNwbGF5TmFtZQogICAgICAgICAgICAgICAgICAgIFN0YWdlID0gJGl0ZW0uU3RhZ2UKICAgICAgICAgICAgICAgICAgICBTdGFnZVRleHQgPSAkaXRlbS5TdGFnZVRleHQKICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc1BlcmNlbnQgPSAkaXRlbS5Qcm9ncmVzc1BlcmNlbnQKICAgICAgICAgICAgICAgICAgICBJc0luZGV0ZXJtaW5hdGUgPSAkaXRlbS5Jc0luZGV0ZXJtaW5hdGUKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRzY3JpcHQ6TmV4dFF1ZXVlSXRlbSA9ICRpdGVtCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRpdGVtID0gJHNjcmlwdDpOZXh0UXVldWVJdGVtCiAgICAkc2NyaXB0Ok5leHRRdWV1ZUl0ZW0gPSAkbnVsbAogICAgcmV0dXJuICRpdGVtCn0KCmZ1bmN0aW9uIENvbXBsZXRlLVF1ZXVlSXRlbSB7CiAgICBwYXJhbSgKICAgICAgICBbUGFyYW1ldGVyKE1hbmRhdG9yeSldW3N0cmluZ10kSWQsCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXVtWYWxpZGF0ZVNldCgnU3VjY2VlZGVkJywnRmFpbGVkJyldW3N0cmluZ10kU3RhdGUsCiAgICAgICAgW2ludF0kRXhpdENvZGUgPSAwLAogICAgICAgIFtzdHJpbmddJE1lc3NhZ2UKICAgICkKCiAgICAkbnVsbCA9IFVwZGF0ZS1RdWV1ZVN0YXRlIC1TY3JpcHRCbG9jayB7CiAgICAgICAgcGFyYW0oJHF1ZXVlU3RhdGUpCiAgICAgICAgZm9yZWFjaCAoJGl0ZW0gaW4gQCgkcXVldWVTdGF0ZS5RdWV1ZSkpIHsKICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgY29udGludWUgfQogICAgICAgICAgICBpZiAoJGl0ZW0uSWQgLWVxICRJZCkgewogICAgICAgICAgICAgICAgJGl0ZW0uU3RhdGUgPSAkU3RhdGUKICAgICAgICAgICAgICAgICRpdGVtLlN0YWdlID0gJFN0YXRlCiAgICAgICAgICAgICAgICAkaXRlbS5TdGFnZVRleHQgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgJGl0ZW0uUHJvZ3Jlc3NQZXJjZW50ID0gaWYgKCRTdGF0ZSAtZXEgJ1N1Y2NlZWRlZCcpIHsgMTAwIH0gZWxzZSB7ICRudWxsIH0KICAgICAgICAgICAgICAgICRpdGVtLklzSW5kZXRlcm1pbmF0ZSA9ICRmYWxzZQogICAgICAgICAgICAgICAgJGl0ZW0uRmluaXNoZWRBdCA9IChHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKQogICAgICAgICAgICAgICAgJGl0ZW0uRXhpdENvZGUgPSAkRXhpdENvZGUKICAgICAgICAgICAgICAgICRpdGVtLk1lc3NhZ2UgPSAkTWVzc2FnZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkcXVldWVTdGF0ZS5DdXJyZW50ID0gJG51bGwKICAgIH0KfQoKZnVuY3Rpb24gSW52b2tlLVF1ZXVlZEl0ZW0gewogICAgcGFyYW0oCiAgICAgICAgW1BhcmFtZXRlcihNYW5kYXRvcnkpXSRJdGVtLAogICAgICAgIFtQYXJhbWV0ZXIoTWFuZGF0b3J5KV1bc3RyaW5nXSRXaW5nZXRQYXRoCiAgICApCgogICAgaWYgKCRJdGVtLkFjdGlvbiAtZXEgJ1VwZ3JhZGVBbGwnKSB7CiAgICAgICAgJGV4aXRDb2RlID0gSW52b2tlLVdpbmdldFVwZ3JhZGVBbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICAgICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgICAgICBpZiAoJGV4aXRDb2RlIC1lcSAwKSB7CiAgICAgICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIFN1Y2NlZWRlZCAtRXhpdENvZGUgJGV4aXRDb2RlIC1NZXNzYWdlICdVcGRhdGVzIGFiZ2VzY2hsb3NzZW4uJwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgRmFpbGVkIC1FeGl0Q29kZSAkZXhpdENvZGUgLU1lc3NhZ2UgIlVwZGF0ZXMgZmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICAgICAgfQogICAgICAgIHJldHVybgogICAgfQoKICAgICRhcHAgPSBHZXQtQXBwQ2F0YWxvZ09iamVjdEJ5QWxpYXMgLUFsaWFzIChbc3RyaW5nXSRJdGVtLkFsaWFzKQogICAgaWYgKC1ub3QgJGFwcCkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnQWxpYXMgaXN0IG5pY2h0IG1laHIgZnJlaWdlZ2ViZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXF1aXJlZFNldCA9IEdldC1SZXF1aXJlZEFsaWFzU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnVW5pbnN0YWxsJyAtYW5kICRyZXF1aXJlZFNldC5Db250YWlucyhbc3RyaW5nXSRJdGVtLkFsaWFzKSkgewogICAgICAgIENvbXBsZXRlLVF1ZXVlSXRlbSAtSWQgJEl0ZW0uSWQgLVN0YXRlIEZhaWxlZCAtRXhpdENvZGUgMSAtTWVzc2FnZSAnUGZsaWNodHNvZnR3YXJlIGthbm4gbmljaHQgZGVpbnN0YWxsaWVydCB3ZXJkZW4uJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRpbnN0YWxsZWRTZXQgPSBHZXQtSW5zdGFsbGVkUGFja2FnZUlkU2V0CiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcgLWFuZCAkaW5zdGFsbGVkU2V0LkNvbnRhaW5zKFtzdHJpbmddJGFwcC5QYWNrYWdlSWQpKSB7CiAgICAgICAgQ29tcGxldGUtUXVldWVJdGVtIC1JZCAkSXRlbS5JZCAtU3RhdGUgU3VjY2VlZGVkIC1FeGl0Q29kZSAwIC1NZXNzYWdlICdCZXJlaXRzIGluc3RhbGxpZXJ0LicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJEl0ZW0uQWN0aW9uIC1lcSAnSW5zdGFsbCcpIHsKICAgICAgICAkZXhpdENvZGUgPSBJbnZva2UtV2luZ2V0SW5zdGFsbCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUGFja2FnZUlkIChbc3RyaW5nXSRhcHAuUGFja2FnZUlkKSAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIH0KICAgIGVsc2UgewogICAgICAgICRleGl0Q29kZSA9IEludm9rZS1XaW5nZXRVbmluc3RhbGwgLVdpbmdldFBhdGggJFdpbmdldFBhdGggLVBhY2thZ2VJZCAoW3N0cmluZ10kYXBwLlBhY2thZ2VJZCkgLVF1ZXVlSXRlbUlkICRJdGVtLklkCiAgICB9CgogICAgJG51bGwgPSBVcGRhdGUtSW5zdGFsbGVkUGFja2FnZXNTbmFwc2hvdCAtV2luZ2V0UGF0aCAkV2luZ2V0UGF0aCAtUXVldWVJdGVtSWQgJEl0ZW0uSWQKICAgIGlmICgkZXhpdENvZGUgLWVxIDApIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBTdWNjZWVkZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAnQWJnZXNjaGxvc3Nlbi4nCiAgICB9CiAgICBlbHNlIHsKICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRJdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlICRleGl0Q29kZSAtTWVzc2FnZSAiRmVobGdlc2NobGFnZW4gKENvZGUgJGV4aXRDb2RlKS4iCiAgICB9Cn0KCmZ1bmN0aW9uIEludm9rZS1Qcm9jZXNzUXVldWVNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgaWYgKC1ub3QgJHdpbmdldFBhdGgpIHsKICAgICAgICBXcml0ZS1Mb2cgJ0Fib3J0aW5nIHF1ZXVlIHByb2Nlc3NpbmcgYmVjYXVzZSB3aW5nZXQgaXMgdW5hdmFpbGFibGUuJyAnRVJST1InCiAgICAgICAgcmV0dXJuCiAgICB9CgogICAgSW52b2tlLVdpdGhXaW5nZXRMb2NrIC1TY3JpcHRCbG9jayB7CiAgICAgICAgUmVzZXQtUnVubmluZ1F1ZXVlSXRlbXMKICAgICAgICAkbnVsbCA9IFVwZGF0ZS1JbnN0YWxsZWRQYWNrYWdlc1NuYXBzaG90IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICAgICAgJG51bGwgPSBFbnN1cmUtUmVxdWlyZWRTb2Z0d2FyZVF1ZXVlZAoKICAgICAgICB3aGlsZSAoJHRydWUpIHsKICAgICAgICAgICAgJGl0ZW0gPSBHZXQtTmV4dFF1ZXVlZEl0ZW0KICAgICAgICAgICAgaWYgKC1ub3QgJGl0ZW0pIHsgYnJlYWsgfQoKICAgICAgICAgICAgV3JpdGUtTG9nICJQcm9jZXNzaW5nIHF1ZXVlZCBpdGVtIGlkPSckKCRpdGVtLklkKScgYWN0aW9uPSckKCRpdGVtLkFjdGlvbiknIGFsaWFzPSckKCRpdGVtLkFsaWFzKScgc291cmNlPSckKCRpdGVtLlNvdXJjZSknIHJlcXVlc3RlZEJ5PSckKCRpdGVtLlJlcXVlc3RlZEJ5KSciCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBJbnZva2UtUXVldWVkSXRlbSAtSXRlbSAkaXRlbSAtV2luZ2V0UGF0aCAkd2luZ2V0UGF0aAogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgIFdyaXRlLUxvZyAiUXVldWVkIGl0ZW0gJyQoJGl0ZW0uSWQpJyBmYWlsZWQ6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICAgICAgICAgICAgICBDb21wbGV0ZS1RdWV1ZUl0ZW0gLUlkICRpdGVtLklkIC1TdGF0ZSBGYWlsZWQgLUV4aXRDb2RlIDEgLU1lc3NhZ2UgJF8uRXhjZXB0aW9uLk1lc3NhZ2UKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG51bGwgPSBVcGRhdGUtUXVldWVTdGF0ZSAtU2NyaXB0QmxvY2sgeyBwYXJhbSgkc3RhdGUpICRzdGF0ZS5DdXJyZW50ID0gJG51bGwgfQogICAgfQp9CgpmdW5jdGlvbiBJbnZva2UtVXBncmFkZUFsbE1vZGUgewogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkQmFzZURpcgogICAgRW5zdXJlLURpcmVjdG9yeSAtUGF0aCAkTG9nRGlyCgogICAgJGl0ZW0gPSBOZXctUXVldWVJdGVtIC1BY3Rpb24gVXBncmFkZUFsbCAtRGlzcGxheU5hbWUgJ3dpbmdldCB1cGdyYWRlIC0tYWxsJyAtU291cmNlIFN5c3RlbSAtUmVxdWVzdGVkQnkgJ1N5c3RlbScgLVJlcXVlc3RlZEJ5U2lkICdTeXN0ZW0nCiAgICAkcmVzdWx0ID0gQWRkLVF1ZXVlSXRlbSAtSXRlbSAkaXRlbQogICAgaWYgKCRyZXN1bHQuQWRkZWQpIHsKICAgICAgICBXcml0ZS1Mb2cgJ1F1ZXVlZCAyLWhvdXIgd2luZ2V0IHVwZ3JhZGUuJwogICAgfQogICAgZWxzZSB7CiAgICAgICAgV3JpdGUtTG9nICcyLWhvdXIgd2luZ2V0IHVwZ3JhZGUgaXMgYWxyZWFkeSBxdWV1ZWQgb3IgcnVubmluZy4nCiAgICB9CiAgICBTdGFydC1RdWV1ZVdvcmtlcgp9CgpmdW5jdGlvbiBJbnZva2UtQXBwbHlQb2xpY3lNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgICR3aW5nZXRQYXRoID0gRW5zdXJlLVdpbmdldEF2YWlsYWJsZQogICAgJHJlc3VsdCA9IEludm9rZS1SZXF1aXJlZFNvZnR3YXJlUG9saWN5IC1XaW5nZXRQYXRoICR3aW5nZXRQYXRoCiAgICBXcml0ZS1Mb2cgIlJlcXVpcmVkIHBvbGljeSBhcHBseSBxdWV1ZWQgaXRlbXM9JCgkcmVzdWx0LlF1ZXVlZCkuIgp9CgpmdW5jdGlvbiBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRBcHBBbGlhcykpIHsKICAgICAgICB0aHJvdyAnQXBwQWxpYXMgaXMgcmVxdWlyZWQgZm9yIFByb2Nlc3NSZXF1ZXN0IG1vZGUuJwogICAgfQoKICAgICRhbGlhcyA9ICRBcHBBbGlhcy5UcmltKCkuVG9Mb3dlckludmFyaWFudCgpCiAgICAkYXBwID0gR2V0LUFwcENhdGFsb2dPYmplY3RCeUFsaWFzIC1BbGlhcyAkYWxpYXMKICAgIGlmICgtbm90ICRhcHApIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBpbiBjYXRhbG9nIHBvbGljeS4gUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIiAnV0FSTicKICAgICAgICByZXR1cm4KICAgIH0KCiAgICBpZiAoJFJlcXVlc3RBY3Rpb24gLWVxICdJbnN0YWxsJyAtYW5kIC1ub3QgKFRlc3QtVXNlckluc3RhbGxzQWxsb3dlZCkpIHsKICAgICAgICBXcml0ZS1Mb2cgIldvcmtlciByZWplY3RlZCBpbnN0YWxsIGZvciBhbGlhcyAnJGFsaWFzJyBiZWNhdXNlIHVzZXIgaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgIGlmICgkUmVxdWVzdEFjdGlvbiAtZXEgJ1VuaW5zdGFsbCcgLWFuZCAtbm90IChUZXN0LVVzZXJVbmluc3RhbGxBbGxvd2VkKSkgewogICAgICAgIFdyaXRlLUxvZyAiV29ya2VyIHJlamVjdGVkIHVuaW5zdGFsbCBmb3IgYWxpYXMgJyRhbGlhcycgYmVjYXVzZSB1c2VyIHVuaW5zdGFsbHMgYXJlIGRpc2FibGVkLiBSZXF1ZXN0ZWRCeT0nJFJlcXVlc3RlZEJ5JyBTaWQ9JyRSZXF1ZXN0ZWRCeVNpZCciICdXQVJOJwogICAgICAgIHJldHVybgogICAgfQoKICAgICRyZXN1bHQgPSBBZGQtU29mdHdhcmVSZXF1ZXN0VG9RdWV1ZSAtQWN0aW9uICRSZXF1ZXN0QWN0aW9uIC1BbGlhcyAkYWxpYXMgLVJlcXVlc3RlZEJ5ICRSZXF1ZXN0ZWRCeSAtUmVxdWVzdGVkQnlTaWQgJFJlcXVlc3RlZEJ5U2lkIC1Tb3VyY2UgVXNlcgogICAgV3JpdGUtTG9nICJRdWV1ZWQgd29ya2VyIHJlcXVlc3QgYWN0aW9uPSRSZXF1ZXN0QWN0aW9uIGFsaWFzPSckYWxpYXMnIGFkZGVkPSQoJHJlc3VsdC5BZGRlZCkgUmVxdWVzdGVkQnk9JyRSZXF1ZXN0ZWRCeScgU2lkPSckUmVxdWVzdGVkQnlTaWQnIgogICAgU3RhcnQtUXVldWVXb3JrZXIKfQoKZnVuY3Rpb24gSW5zdGFsbC1TZXJ2aWNlIHsKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJEJhc2VEaXIKICAgIEVuc3VyZS1EaXJlY3RvcnkgLVBhdGggJExvZ0RpcgoKICAgIFNldC1EaXJlY3RvcnlBY2wgLVBhdGggJEJhc2VEaXIgLVVzZXJzQ2FuTW9kaWZ5OiRmYWxzZQogICAgU2V0LURpcmVjdG9yeUFjbCAtUGF0aCAkTG9nRGlyIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKCiAgICBmb3JlYWNoICgkbGVnYWN5RGlyTmFtZSBpbiBAKCdSZXF1ZXN0cycsJ1Byb2Nlc3NlZCcsJ0ZhaWxlZCcpKSB7CiAgICAgICAgJGxlZ2FjeURpclBhdGggPSBKb2luLVBhdGggJEJhc2VEaXIgJGxlZ2FjeURpck5hbWUKICAgICAgICBpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkbGVnYWN5RGlyUGF0aCkgewogICAgICAgICAgICBTZXQtRGlyZWN0b3J5QWNsIC1QYXRoICRsZWdhY3lEaXJQYXRoIC1Vc2Vyc0Nhbk1vZGlmeTokZmFsc2UKICAgICAgICB9CiAgICB9CgogICAgaWYgKC1ub3QgJFBTQ29tbWFuZFBhdGgpIHsKICAgICAgICB0aHJvdyAnUFNDb21tYW5kUGF0aCBpcyBlbXB0eTsgY2Fubm90IGRldGVybWluZSB0aGUgc291cmNlIHNjcmlwdCBwYXRoLicKICAgIH0KCiAgICBDb3B5LUl0ZW0gLUxpdGVyYWxQYXRoICRQU0NvbW1hbmRQYXRoIC1EZXN0aW5hdGlvbiAkTG9jYWxTY3JpcHRQYXRoIC1Gb3JjZQogICAgU2V0LUZpbGVBY2xBZG1pbnNPbmx5IC1QYXRoICRMb2NhbFNjcmlwdFBhdGgKCiAgICBOZXctVXNlclJlcXVlc3RUb29sCiAgICBOZXctQ2F0YWxvZ0d1aQogICAgTmV3LUNhdGFsb2dMYXVuY2hlcgogICAgTmV3LVNob3J0Y3V0IC1TaG9ydGN1dFBhdGggJERlc2t0b3BTaG9ydGN1dFBhdGgKICAgIE5ldy1TaG9ydGN1dCAtU2hvcnRjdXRQYXRoICRTdGFydE1lbnVTaG9ydGN1dFBhdGgKICAgIFJlZ2lzdGVyLU9yVXBkYXRlVGFza3MKCiAgICBXcml0ZS1Mb2cgJ0luc3RhbGwvdXBkYXRlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuJwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFbnRyeSBwb2ludAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdHJ5IHsKICAgIHN3aXRjaCAoJE1vZGUpIHsKICAgICAgICAnSW5zdGFsbCcgICAgeyBJbnN0YWxsLVNlcnZpY2UgfQogICAgICAgICdEYWVtb24nICAgICB7IFN0YXJ0LUNhdGFsb2dEYWVtb24gfQogICAgICAgICdVcGdyYWRlQWxsJyB7IEludm9rZS1VcGdyYWRlQWxsTW9kZSB9CiAgICAgICAgJ0FwcGx5UG9saWN5JyB7IEludm9rZS1BcHBseVBvbGljeU1vZGUgfQogICAgICAgICdQcm9jZXNzUXVldWUnIHsgSW52b2tlLVByb2Nlc3NRdWV1ZU1vZGUgfQogICAgICAgICdQcm9jZXNzUmVxdWVzdCcgeyBJbnZva2UtUHJvY2Vzc1JlcXVlc3RNb2RlIH0KICAgICAgICBkZWZhdWx0ICAgICAgeyB0aHJvdyAiVW5zdXBwb3J0ZWQgbW9kZSAnJE1vZGUnLiIgfQogICAgfQp9CmNhdGNoIHsKICAgIHRyeSB7CiAgICAgICAgV3JpdGUtTG9nICJGYXRhbCBlcnJvciBpbiBtb2RlICckTW9kZSc6ICQoJF8uRXhjZXB0aW9uLk1lc3NhZ2UpIiAnRVJST1InCiAgICB9CiAgICBjYXRjaCB7CiAgICB9CiAgICB0aHJvdwp9Cg== '@ $PayloadBytes = [Convert]::FromBase64String($Payload) diff --git a/setup.ps1 b/setup.ps1 index 1232ca4..8dc6763 100644 --- a/setup.ps1 +++ b/setup.ps1 @@ -62,6 +62,7 @@ $CommonDesktopDir = [Environment]::GetFolderPath('CommonDesktopDirectory') $CommonProgramsDir = [Environment]::GetFolderPath('CommonPrograms') $DesktopShortcutPath = Join-Path $CommonDesktopDir "$CatalogDisplayName.lnk" $StartMenuShortcutPath = Join-Path $CommonProgramsDir "$CatalogDisplayName.lnk" +$script:DaemonPostResponseWorkers = @() # ---------------------------- # Utility functions @@ -710,6 +711,28 @@ function Start-QueueWorker { Start-SoftwarekatalogWorker -WorkerMode ProcessQueue } +function Add-DaemonPostResponseWorker { + param([Parameter(Mandatory)][ValidateSet('ApplyPolicy','ProcessQueue')][string]$WorkerMode) + + if (-not $script:DaemonPostResponseWorkers) { + $script:DaemonPostResponseWorkers = @() + } + $script:DaemonPostResponseWorkers = @($script:DaemonPostResponseWorkers + $WorkerMode) +} + +function Invoke-DaemonPostResponseWorkers { + foreach ($workerMode in @($script:DaemonPostResponseWorkers | Select-Object -Unique)) { + try { + Start-SoftwarekatalogWorker -WorkerMode $workerMode + } + catch { + Write-Log "Could not start post-response worker '$workerMode': $($_.Exception.Message)" 'WARN' + } + } + + $script:DaemonPostResponseWorkers = @() +} + function Get-WingetPath { $candidates = @() @@ -841,13 +864,17 @@ function Invoke-CatalogDaemon { ) try { - `$client.Connect(60000) + `$client.Connect(10000) `$reader = New-Object System.IO.StreamReader(`$client, `$encoding) `$writer = New-Object System.IO.StreamWriter(`$client, `$encoding) `$writer.AutoFlush = `$true `$writer.WriteLine(`$json) - `$line = `$reader.ReadLine() + `$readTask = `$reader.ReadLineAsync() + if (-not `$readTask.Wait(15000)) { + throw 'Zeitüberschreitung beim Warten auf Antwort des Softwarekatalog-Dienstes.' + } + `$line = `$readTask.Result if ([string]::IsNullOrWhiteSpace(`$line)) { throw 'Der Softwarekatalog-Dienst hat keine Antwort gesendet.' } @@ -1047,13 +1074,17 @@ function Invoke-CatalogDaemon { ) try { - `$client.Connect(60000) + `$client.Connect(10000) `$reader = New-Object System.IO.StreamReader(`$client, `$encoding) `$writer = New-Object System.IO.StreamWriter(`$client, `$encoding) `$writer.AutoFlush = `$true `$writer.WriteLine(`$json) - `$line = `$reader.ReadLine() + `$readTask = `$reader.ReadLineAsync() + if (-not `$readTask.Wait(15000)) { + throw 'Zeitüberschreitung beim Warten auf Antwort des Softwarekatalog-Dienstes.' + } + `$line = `$readTask.Result if ([string]::IsNullOrWhiteSpace(`$line)) { throw 'Der Softwarekatalog-Dienst hat keine Antwort gesendet.' } @@ -1462,6 +1493,134 @@ function Load-AppList { `$stateRefreshTimer = New-Object System.Windows.Forms.Timer `$stateRefreshTimer.Interval = 500 `$script:StateRefreshPending = `$false +`$script:RequestWorkerBusy = `$false + +function Start-AppRequestAsync { + param( + [Parameter(Mandatory=`$true)]`$Selected, + [Parameter(Mandatory=`$true)][ValidateSet('Install','Uninstall')][string]`$Action + ) + + if (`$script:RequestWorkerBusy) { + `$status.Text = 'Eine Anfrage wird bereits verarbeitet.' + return + } + + `$script:RequestWorkerBusy = `$true + `$btnInstall.Enabled = `$false + `$btnUninstall.Enabled = `$false + `$btnRefresh.Enabled = `$false + + `$worker = New-Object System.ComponentModel.BackgroundWorker + `$worker.Add_DoWork({ + param(`$sender, `$eventArgs) + `$arg = `$eventArgs.Argument + `$response = New-AppRequest -Alias `$arg.Alias -Action `$arg.Action + `$eventArgs.Result = [pscustomobject]@{ + Action = `$arg.Action + Alias = `$arg.Alias + DisplayName = `$arg.DisplayName + Response = `$response + } + }) + `$worker.Add_RunWorkerCompleted({ + param(`$sender, `$eventArgs) + try { + `$script:RequestWorkerBusy = `$false + `$btnRefresh.Enabled = `$true + + if (`$eventArgs.Error) { + `$status.Text = 'Fehler: ' + `$eventArgs.Error.Message + `$script:StateRefreshPending = `$true + [System.Windows.Forms.MessageBox]::Show( + `$eventArgs.Error.Message, + `$CatalogTitle, + [System.Windows.Forms.MessageBoxButtons]::OK, + [System.Windows.Forms.MessageBoxIcon]::Error + ) | Out-Null + return + } + + `$result = `$eventArgs.Result + if (`$result.Action -eq 'Uninstall') { + `$verb = 'Deinstallation' + } + else { + `$verb = 'Installation' + } + if (`$result.Response.Message) { + `$status.Text = [string]`$result.Response.Message + } + else { + `$status.Text = "`$verb eingereiht: {0}" -f `$result.DisplayName + } + + [System.Windows.Forms.MessageBox]::Show( + ("`$verb eingereiht:`r`n`r`n{0}`r`nAlias: {1}" -f `$result.DisplayName, `$result.Alias), + `$CatalogTitle, + [System.Windows.Forms.MessageBoxButtons]::OK, + [System.Windows.Forms.MessageBoxIcon]::Information + ) | Out-Null + + `$script:StateRefreshPending = `$true + } + finally { + Update-InstallButtonState + `$sender.Dispose() + } + }) + `$worker.RunWorkerAsync([pscustomobject]@{ + Action = `$Action + Alias = [string]`$Selected.Alias + DisplayName = [string]`$Selected.DisplayName + }) +} + +function Start-RefreshStatusAsync { + if (`$script:RequestWorkerBusy) { + `$status.Text = 'Eine Anfrage wird bereits verarbeitet.' + return + } + + `$script:RequestWorkerBusy = `$true + `$btnInstall.Enabled = `$false + `$btnUninstall.Enabled = `$false + `$btnRefresh.Enabled = `$false + `$status.Text = 'Installationsdaten-Aktualisierung wird angefordert...' + + `$worker = New-Object System.ComponentModel.BackgroundWorker + `$worker.Add_DoWork({ + param(`$sender, `$eventArgs) + `$eventArgs.Result = Invoke-CatalogDaemon -Command 'RefreshStatus' + }) + `$worker.Add_RunWorkerCompleted({ + param(`$sender, `$eventArgs) + try { + `$script:RequestWorkerBusy = `$false + `$btnRefresh.Enabled = `$true + + if (`$eventArgs.Error) { + `$status.Text = 'Fehler: ' + `$eventArgs.Error.Message + [System.Windows.Forms.MessageBox]::Show( + `$eventArgs.Error.Message, + `$CatalogTitle, + [System.Windows.Forms.MessageBoxButtons]::OK, + [System.Windows.Forms.MessageBoxIcon]::Error + ) | Out-Null + return + } + + `$response = `$eventArgs.Result + if (`$response.Message) { `$status.Text = [string]`$response.Message } + `$script:StateRefreshPending = `$true + } + finally { + Update-InstallButtonState + `$sender.Dispose() + } + }) + `$worker.RunWorkerAsync() +} `$btnInstall.Add_Click({ try { @@ -1490,17 +1649,10 @@ function Load-AppList { } `$status.Text = "Installation wird eingereiht: {0}" -f `$selected.DisplayName - `$response = New-AppRequest -Alias `$selected.Alias -Action 'Install' - `$status.Text = if (`$response.Message) { `$response.Message } else { "Installation eingereiht: {0}" -f `$selected.DisplayName } - - [System.Windows.Forms.MessageBox]::Show( - ("Installation eingereiht:`r`n`r`n{0}`r`nAlias: {1}" -f `$selected.DisplayName, `$selected.Alias), - `$CatalogTitle, - [System.Windows.Forms.MessageBoxButtons]::OK, - [System.Windows.Forms.MessageBoxIcon]::Information - ) | Out-Null - - Load-AppList + `$selectedItem.SubItems[2].Text = 'In Warteschlange' + `$selectedItem.ForeColor = [System.Drawing.Color]::DarkGoldenrod + Update-InstallButtonState + Start-AppRequestAsync -Selected `$selected -Action 'Install' } catch { `$status.Text = "Fehler: " + `$_.Exception.Message @@ -1540,17 +1692,10 @@ function Load-AppList { } `$status.Text = "Deinstallation wird eingereiht: {0}" -f `$selected.DisplayName - `$response = New-AppRequest -Alias `$selected.Alias -Action 'Uninstall' - `$status.Text = if (`$response.Message) { `$response.Message } else { "Deinstallation eingereiht: {0}" -f `$selected.DisplayName } - - [System.Windows.Forms.MessageBox]::Show( - ("Deinstallation eingereiht:`r`n`r`n{0}`r`nAlias: {1}" -f `$selected.DisplayName, `$selected.Alias), - `$CatalogTitle, - [System.Windows.Forms.MessageBoxButtons]::OK, - [System.Windows.Forms.MessageBoxIcon]::Information - ) | Out-Null - - Load-AppList + `$selectedItem.SubItems[2].Text = 'Deinstallation in Warteschlange' + `$selectedItem.ForeColor = [System.Drawing.Color]::DarkGoldenrod + Update-InstallButtonState + Start-AppRequestAsync -Selected `$selected -Action 'Uninstall' } catch { `$status.Text = "Fehler: " + `$_.Exception.Message @@ -1565,10 +1710,7 @@ function Load-AppList { `$btnRefresh.Add_Click({ try { - `$status.Text = 'Installationsdaten werden aktualisiert...' - `$response = Invoke-CatalogDaemon -Command 'RefreshStatus' - Load-AppList - if (`$response.Message) { `$status.Text = `$response.Message } + Start-RefreshStatusAsync } catch { `$status.Text = "Fehler: " + `$_.Exception.Message @@ -2212,7 +2354,7 @@ function Invoke-CatalogDaemonCommand { { $_ -in @('getcatalog','getstate') } { $requiredQueued = Ensure-RequiredSoftwareQueued if ($requiredQueued -gt 0) { - Start-QueueWorker + Add-DaemonPostResponseWorker -WorkerMode ProcessQueue } $catalog = @(Get-AppCatalogObjects | Sort-Object DisplayName) $requiredAliases = @(Get-RequiredAliases) @@ -2239,7 +2381,7 @@ function Invoke-CatalogDaemonCommand { 'applypolicy' { Write-Log "Authenticated policy apply requested by user='$($ClientIdentity.Name)' sid='$($ClientIdentity.Sid)'" - Start-SoftwarekatalogWorker -WorkerMode ApplyPolicy + Add-DaemonPostResponseWorker -WorkerMode ApplyPolicy return [pscustomobject]@{ Success = $true Command = $command @@ -2278,10 +2420,20 @@ function Invoke-CatalogDaemonCommand { Write-Log "Authenticated request: action=$actionText alias='$alias' package='$packageId' user='$($ClientIdentity.Name)' sid='$($ClientIdentity.Sid)'" $queueResult = Add-SoftwareRequestToQueue -Action $command -Alias $alias -RequestedBy $ClientIdentity.Name -RequestedBySid $ClientIdentity.Sid -Source User - Start-QueueWorker + Add-DaemonPostResponseWorker -WorkerMode ProcessQueue - $verb = if ($command -eq 'uninstall') { 'Deinstallation' } else { 'Installation' } - $message = if ($queueResult.Added) { "$verb eingereiht: $alias" } else { "$verb ist bereits in der Warteschlange: $alias" } + if ($command -eq 'uninstall') { + $verb = 'Deinstallation' + } + else { + $verb = 'Installation' + } + if ($queueResult.Added) { + $message = "$verb eingereiht: $alias" + } + else { + $message = "$verb ist bereits in der Warteschlange: $alias" + } return [pscustomobject]@{ Success = $true Command = $command @@ -2297,24 +2449,25 @@ function Invoke-CatalogDaemonCommand { { $_ -in @('refreshstatus','getstatus') } { Write-Log "Authenticated status refresh requested by user='$($ClientIdentity.Name)' sid='$($ClientIdentity.Sid)'" - $wingetPath = Ensure-WingetAvailable - if (-not $wingetPath) { - throw 'winget is unavailable.' + $started = $false + if (Test-WingetLockAvailable) { + Add-DaemonPostResponseWorker -WorkerMode ProcessQueue + $started = $true } - - $result = Invoke-WithWingetLock -TimeoutSeconds 2 -ScriptBlock { - $snapshotUpdated = Update-InstalledPackagesSnapshot -WingetPath $wingetPath - [pscustomobject]@{ SnapshotUpdated = [bool]$snapshotUpdated } + if ($started) { + $message = 'Installationsdaten-Aktualisierung gestartet.' + } + else { + $message = 'Installationsdaten-Aktualisierung läuft bereits.' } - $result = @($result)[-1] return [pscustomobject]@{ - Success = [bool]$result.SnapshotUpdated + Success = $true Command = $command RequestedBy = $ClientIdentity.Name RequestedBySid = $ClientIdentity.Sid - SnapshotUpdated = [bool]$result.SnapshotUpdated - Message = 'Installationsdaten aktualisiert.' + SnapshotQueued = $started + Message = $message } } @@ -2340,6 +2493,7 @@ function Start-CatalogDaemon { while ($true) { $pipe = $null try { + $script:DaemonPostResponseWorkers = @() $pipe = New-CatalogPipeServer $pipe.WaitForConnection() @@ -2351,7 +2505,11 @@ function Start-CatalogDaemon { $response = $null try { - $line = $reader.ReadLine() + $readTask = $reader.ReadLineAsync() + if (-not $readTask.Wait(30000)) { + throw 'Timed out waiting for named pipe request.' + } + $line = $readTask.Result if ([string]::IsNullOrWhiteSpace($line)) { throw 'Empty request.' } @@ -2370,6 +2528,7 @@ function Start-CatalogDaemon { } $writer.WriteLine(($response | ConvertTo-Json -Compress -Depth 6)) + Invoke-DaemonPostResponseWorkers } catch { Write-Log "Named pipe daemon error: $($_.Exception.Message)" 'ERROR'