#!/usr/bin/python3
# Encrypted with srtool
import base64
import sys

_DATA = "CmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCBzdWJwcm9jZXNzCmltcG9ydCBkYXRldGltZQppbXBvcnQgaGFzaGxpYgppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgZ2xvYgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IHJhbmRvbQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCkhPTUUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4iKQpQUk9KRUNUX1BBVEggPSBvcy5wYXRoLmpvaW4oSE9NRSwgIlByb2plY3QiKQpERUJJQU5fUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJkZWJpYW4iKQpURVJNVVhfUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJ0ZXJtdXgiKQpURVJNVVhfREVCX1BBVEggPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCAidGVybXV4LWRlYiIpCkRFQklBTl9ERUJfUEFUSCA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsICJkZWJpYW4tZGViIikKQ09ORklHX0ZJTEUgPSBvcy5wYXRoLmpvaW4oSE9NRSwgIi5jb25maWciLCAiZ2l0LXJlcG8uY29uZiIpCgpTVVBQT1JURURfQVJDSEVTID0gWydhbGwnLCAnYXJtaGYnLCAnYXJtNjQnLCAnYW1kNjQnLCAnYXJtZWwnLCAnaTM4NicsICdhcm0nLCAnYWFyY2g2NCcsICdpNjg2JywgJ3g4Nl82NCddCkhBU0hFUyA9IFsnbWQ1JywgJ3NoYTEnLCAnc2hhMjU2JywgJ3NoYTUxMiddCgpkZWYgY3JlYXRlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIk1lbWJ1YXQgZGlyZWt0b3JpIGppa2EgYmVsdW0gYWRhIiIiCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKCmRlZiBydW5fc2hlbGxfY29tbWFuZChjbWQpOgogICAgIiIiTWVuamFsYW5rYW4gcGVyaW50YWggc2hlbGwgZGFuIG1lbmdlbWJhbGlrYW4gb3V0cHV0IiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KFtjbWRdLCBzaGVsbD1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuREVWTlVMTCkuc3RyaXAoKQogICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgogICAgICAgIHJldHVybiBOb25lCgpkZWYgZW5zdXJlX2RpcmVjdG9yaWVzKCk6CiAgICAiIiJNZW1hc3Rpa2FuIHNlbXVhIGRpcmVrdG9yaSB5YW5nIGRpcGVybHVrYW4gYWRhIiIiCiAgICBjcmVhdGVfZGlyZWN0b3J5KERFQklBTl9QQVRIKQogICAgY3JlYXRlX2RpcmVjdG9yeShURVJNVVhfUEFUSCkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoVEVSTVVYX0RFQl9QQVRIKToKICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KFRFUk1VWF9ERUJfUEFUSCkKICAgIGVsc2U6CiAgICAgICAgY3JlYXRlX2RpcmVjdG9yeShvcy5wYXRoLmpvaW4oVEVSTVVYX0RFQl9QQVRILCAibWFpbiIpKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhERUJJQU5fREVCX1BBVEgpOgogICAgICAgIGNyZWF0ZV9kaXJlY3RvcnkoREVCSUFOX0RFQl9QQVRIKQogICAgZWxzZToKICAgICAgICBjcmVhdGVfZGlyZWN0b3J5KG9zLnBhdGguam9pbihERUJJQU5fREVCX1BBVEgsICJtYWluIikpCgp0cnk6CiAgICBpbXBvcnQgcmVhZGxpbmUKICAgIFJFQURMSU5FX0FWQUlMQUJMRSA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgUkVBRExJTkVfQVZBSUxBQkxFID0gRmFsc2UKICAgIHByaW50KCJbIV0gcmVhZGxpbmUgbm90IGF2YWlsYWJsZSwgdXNpbmcgYmFzaWMgaW5wdXQiKQoKZGVmIGlucHV0X3dpdGhfZWRpdGFibGVfZGVmYXVsdChwcm9tcHQsIGRlZmF1bHRfdGV4dD0iIik6CiAgICAiIiIKICAgIElucHV0IGZ1bmN0aW9uIHdpdGggZWRpdGFibGUgZGVmYXVsdCB0ZXh0IHVzaW5nIHJlYWRsaW5lLgogICAgVXNlciBjYW4gZWRpdCB0aGUgZGVmYXVsdCB0ZXh0IHVzaW5nIGFycm93IGtleXMsIGJhY2tzcGFjZSwgZXRjLgogICAgIiIiCiAgICBpZiBub3QgUkVBRExJTkVfQVZBSUxBQkxFIG9yIG5vdCBkZWZhdWx0X3RleHQ6CiAgICAgICAgaWYgZGVmYXVsdF90ZXh0OgogICAgICAgICAgICByZXR1cm4gaW5wdXQoZiJ7cHJvbXB0fSBbe2RlZmF1bHRfdGV4dH1dOiAiKS5zdHJpcCgpIG9yIGRlZmF1bHRfdGV4dAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBpbnB1dChmIntwcm9tcHR9OiAiKS5zdHJpcCgpCgogICAgb2xkX2hpc3RvcnkgPSBbXQogICAgdHJ5OgogICAgICAgIGhpc3RvcnlfZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8ucHl0aG9uX2hpc3RvcnkiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGhpc3RvcnlfZmlsZSk6CiAgICAgICAgICAgIHJlYWRsaW5lLnJlYWRfaGlzdG9yeV9maWxlKGhpc3RvcnlfZmlsZSkKICAgICAgICAgICAgb2xkX2hpc3RvcnkgPSBbcmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbShpKzEpIGZvciBpIGluIHJhbmdlKHJlYWRsaW5lLmdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKCkpXQogICAgZXhjZXB0OgogICAgICAgIHBhc3MKCiAgICBkZWYgcHJlZmlsbF9pbnB1dCgpOgogICAgICAgIHJlYWRsaW5lLmluc2VydF90ZXh0KGRlZmF1bHRfdGV4dCkKICAgICAgICByZWFkbGluZS5zZXRfc3RhcnR1cF9ob29rKE5vbmUpCgogICAgb2xkX3N0YXJ0dXBfaG9vayA9IE5vbmUKICAgIHRyeToKICAgICAgICBvbGRfc3RhcnR1cF9ob29rID0gcmVhZGxpbmUuZ2V0X3N0YXJ0dXBfaG9vaygpCiAgICBleGNlcHQ6CiAgICAgICAgcGFzcwoKICAgIHJlYWRsaW5lLnNldF9zdGFydHVwX2hvb2socHJlZmlsbF9pbnB1dCkKCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gaW5wdXQoZiJ7cHJvbXB0fTogIikgCiAgICBmaW5hbGx5OgogICAgICAgIHJlYWRsaW5lLnNldF9zdGFydHVwX2hvb2sob2xkX3N0YXJ0dXBfaG9vaykKCiAgICB0cnk6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaGlzdG9yeV9maWxlKToKICAgICAgICAgICAgcmVhZGxpbmUuY2xlYXJfaGlzdG9yeSgpCiAgICAgICAgICAgIGZvciBpdGVtIGluIG9sZF9oaXN0b3J5OgogICAgICAgICAgICAgICAgaWYgaXRlbToKICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5hZGRfaGlzdG9yeShpdGVtKQogICAgZXhjZXB0OgogICAgICAgIHBhc3MKCiAgICByZXR1cm4gcmVzdWx0LnN0cmlwKCkgaWYgcmVzdWx0LnN0cmlwKCkgZWxzZSBkZWZhdWx0X3RleHQKCmRlZiBhdXRvX2luY3JlbWVudF92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiCiAgICBBdXRvLWluY3JlbWVudCB2ZXJzaW9uIG51bWJlci4KICAgIEhhbmRsZXMgZm9ybWF0cyBsaWtlOiAxLjAuMCwgMS41LjctU1IsIDIuMS42LVNSLCBldGMuCiAgICAiIiIKICAgIGltcG9ydCByZQoKICAgIHN1ZmZpeF9tYXRjaCA9IHJlLnNlYXJjaChyJygtLispJCcsIHZlcnNpb24pCiAgICBzdWZmaXggPSBzdWZmaXhfbWF0Y2guZ3JvdXAoMSkgaWYgc3VmZml4X21hdGNoIGVsc2UgJycKCiAgICBudW1lcmljX3BhcnQgPSB2ZXJzaW9uLnJlcGxhY2Uoc3VmZml4LCAnJykKCiAgICBwYXJ0cyA9IG51bWVyaWNfcGFydC5zcGxpdCgnLicpCgogICAgaWYgbGVuKHBhcnRzKSA+PSAzOgogICAgICAgIHRyeToKICAgICAgICAgICAgcGFydHNbLTFdID0gc3RyKGludChwYXJ0c1stMV0pICsgMSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCcxJykKICAgIGVsaWYgbGVuKHBhcnRzKSA9PSAyOgogICAgICAgIHBhcnRzLmFwcGVuZCgnMScpCiAgICBlbGlmIGxlbihwYXJ0cykgPT0gMToKICAgICAgICBwYXJ0cy5leHRlbmQoWycwJywgJzEnXSkKICAgIGVsc2U6CiAgICAgICAgcGFydHMgPSBbJzEnLCAnMCcsICcwJ10KCiAgICBuZXdfbnVtZXJpYyA9ICcuJy5qb2luKHBhcnRzKQogICAgbmV3X3ZlcnNpb24gPSBuZXdfbnVtZXJpYyArIHN1ZmZpeAoKICAgIHJldHVybiBuZXdfdmVyc2lvbgoKZGVmIGdldF9uZXdfdmVyc2lvbl9pbnB1dChwcm9tcHQsIGRlZmF1bHRfdmVyc2lvbj0iMS4wLjAiKToKICAgICIiIkZvciBjcmVhdGluZyBwYWNrYWdlIC0gYXV0by1pbmNyZW1lbnQiIiIKICAgIHN1Z2dlc3RlZF92ZXJzaW9uID0gZGVmYXVsdF92ZXJzaW9uCiAgICBwcmludChmIlxue3Byb21wdH0iKQogICAgcHJpbnQoZiIgIFN1Z2dlc3RlZDoge2RlZmF1bHRfdmVyc2lvbn0iKQogICAgdXNlX3N1Z2dlc3RlZCA9IGlucHV0KCJVc2Ugc3VnZ2VzdGVkIHZlcnNpb24/IFtZL24vZSB0byBlZGl0XTogIikuc3RyaXAoKS5sb3dlcigpCiAgICBpZiB1c2Vfc3VnZ2VzdGVkIGluIFsnJywgJ3knLCAneWVzJ106CiAgICAgICAgcmV0dXJuIHN1Z2dlc3RlZF92ZXJzaW9uCiAgICBlbGlmIHVzZV9zdWdnZXN0ZWQgaW4gWydlJywgJ2VkaXQnXToKICAgICAgICByZXR1cm4gaW5wdXRfd2l0aF9lZGl0YWJsZV9kZWZhdWx0KCJFbnRlciB2ZXJzaW9uIiwgc3VnZ2VzdGVkX3ZlcnNpb24pCiAgICBlbHNlOgogICAgICAgIHJldHVybiBpbnB1dF93aXRoX2VkaXRhYmxlX2RlZmF1bHQoIkVudGVyIHZlcnNpb24iLCBzdWdnZXN0ZWRfdmVyc2lvbikKCmRlZiBnZXRfdXBkYXRlX3ZlcnNpb25faW5wdXQocHJvbXB0LCBjdXJyZW50X3ZlcnNpb24pOgogICAgIiIiRm9yIHVwZGF0aW5nIHBhY2thZ2UgLSBhdXRvLWluY3JlbWVudCIiIgogICAgc3VnZ2VzdGVkX3ZlcnNpb24gPSBhdXRvX2luY3JlbWVudF92ZXJzaW9uKGN1cnJlbnRfdmVyc2lvbikKICAgIHByaW50KGYiXG57cHJvbXB0fSIpCiAgICBwcmludChmIiAgQ3VycmVudDoge2N1cnJlbnRfdmVyc2lvbn0iKQogICAgcHJpbnQoZiIgIFN1Z2dlc3RlZDoge3N1Z2dlc3RlZF92ZXJzaW9ufSIpCiAgICB1c2Vfc3VnZ2VzdGVkID0gaW5wdXQoIlVzZSBzdWdnZXN0ZWQgdmVyc2lvbj8gW1kvbi9lIHRvIGVkaXRdOiAiKS5zdHJpcCgpLmxvd2VyKCkKICAgIGlmIHVzZV9zdWdnZXN0ZWQgaW4gWycnLCAneScsICd5ZXMnXToKICAgICAgICByZXR1cm4gc3VnZ2VzdGVkX3ZlcnNpb24KICAgIGVsaWYgdXNlX3N1Z2dlc3RlZCBpbiBbJ2UnLCAnZWRpdCddOgogICAgICAgIHJldHVybiBpbnB1dF93aXRoX2VkaXRhYmxlX2RlZmF1bHQoIkVudGVyIHZlcnNpb24iLCBzdWdnZXN0ZWRfdmVyc2lvbikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIGlucHV0X3dpdGhfZWRpdGFibGVfZGVmYXVsdCgiRW50ZXIgdmVyc2lvbiIsIGN1cnJlbnRfdmVyc2lvbikKCmRlZiBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZShwcm9tcHQsIGRlZmF1bHRfdmFsdWU9IiIpOgogICAgIiIiCiAgICBFbmhhbmNlZCBpbnB1dCBmdW5jdGlvbiB3aXRoIGVkaXRhYmxlIGRlZmF1bHQgdXNpbmcgcmVhZGxpbmUuCiAgICAiIiIKICAgIGlmIFJFQURMSU5FX0FWQUlMQUJMRSBhbmQgZGVmYXVsdF92YWx1ZToKICAgICAgICByZXR1cm4gaW5wdXRfd2l0aF9lZGl0YWJsZV9kZWZhdWx0KHByb21wdCwgZGVmYXVsdF92YWx1ZSkKICAgIGVsaWYgZGVmYXVsdF92YWx1ZToKICAgICAgICByZXR1cm4gaW5wdXQoZiJ7cHJvbXB0fSBbe2RlZmF1bHRfdmFsdWV9XTogIikuc3RyaXAoKSBvciBkZWZhdWx0X3ZhbHVlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBpbnB1dChmIntwcm9tcHR9OiAiKS5zdHJpcCgpCgpkZWYgZ2V0X3JhbmRvbV9vc3R5cGUoKToKICAgICIiIlJldHVybiByYW5kb20gT1MgdHlwZSBiZXR3ZWVuIHRlcm11eCBhbmQgZGViaWFuIiIiCiAgICByZXR1cm4gcmFuZG9tLmNob2ljZShbJ3Rlcm11eCcsICdkZWJpYW4nXSkKCmRlZiBjb250cm9sX2ZpbGVfY29udGVudHMoZGViZmlsZSk6CiAgICAiIiJNZW5nYW1iaWwga29udGVuIGZpbGUgY29udHJvbCBkYXJpIGRlYiIiIgogICAgZmlsZV9saXN0ID0gcnVuX3NoZWxsX2NvbW1hbmQoImFyIHQge30iLmZvcm1hdChkZWJmaWxlKSkKICAgIGlmIGZpbGVfbGlzdCBpcyBOb25lOgogICAgICAgIHN5cy5leGl0KCJFcnJvciBsaXN0aW5nIGNvbnRlbnRzIG9mICd7fSciLmZvcm1hdChkZWJmaWxlKSkKCiAgICBmaWxlX2xpc3QgPSBmaWxlX2xpc3Quc3BsaXQoIlxuIikKCiAgICBpZiAiY29udHJvbC50YXIuZ3oiIGluIGZpbGVfbGlzdDoKICAgICAgICBjb250cm9sX2ZpbGVuYW1lID0gImNvbnRyb2wudGFyLmd6IgogICAgICAgIHRhcl9hcmdzID0gIi16IgogICAgZWxpZiAiY29udHJvbC50YXIueHoiIGluIGZpbGVfbGlzdDoKICAgICAgICBjb250cm9sX2ZpbGVuYW1lID0gImNvbnRyb2wudGFyLnh6IgogICAgICAgIHRhcl9hcmdzID0gIi1KIgogICAgZWxzZToKICAgICAgICBzeXMuZXhpdCgiRmFpbGVkIHRvIGZpbmQgY29udHJvbCBmaWxlIGluICd7fSciLmZvcm1hdChkZWJmaWxlKSkKCiAgICBjbWRfZm10ID0gImFyIHAge30ge30gfCB0YXIgLU8ge30gLXhmIC0gLi9jb250cm9sIgogICAgY21kID0gY21kX2ZtdC5mb3JtYXQoZGViZmlsZSwgY29udHJvbF9maWxlbmFtZSwgdGFyX2FyZ3MpCiAgICBjb250ZW50cyA9IHJ1bl9zaGVsbF9jb21tYW5kKGNtZCkKICAgIGlmIGNvbnRlbnRzIGlzIE5vbmU6CiAgICAgICAgc3lzLmV4aXQoIkVycm9yIGV4dHJhY3RpbmcgY29udHJvbCBmaWxlIGZyb20gJ3t9JyIuZm9ybWF0KGRlYmZpbGUpKQoKICAgIHJldHVybiBjb250ZW50cwoKZGVmIGxpc3RfcGFja2FnZV9maWxlcyhkZWJmaWxlKToKICAgICIiIk1lbmRhZnRhciBmaWxlLWZpbGUgZGFsYW0gcGFja2FnZSBkZWIiIiIKICAgIGFsbF9jb250ZW50ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCiAgICAgICAgWyJhciBwICIgKyBkZWJmaWxlICsgIiBkYXRhLnRhci54eiB8IHRhciAtdEoiXSwKICAgICAgICBzaGVsbD1UcnVlLAogICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAogICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLkRFVk5VTEwKICAgICkKICAgIHJldHVybiBbZmlsZXMuc3RyaXAoIi4vIikgZm9yIGZpbGVzIGluIGFsbF9jb250ZW50LnNwbGl0bGluZXMoKSBpZiBub3QgZmlsZXNbLTFdID09ICIvIl0KCmRlZiBnZXRfcGFja2FnZV9uYW1lKGZpbGVuYW1lKToKICAgICIiIk1lbmRhcGF0a2FuIG5hbWEgcGFja2FnZSBkYXJpIGZpbGVuYW1lIiIiCiAgICByZXR1cm4gZmlsZW5hbWUuc3BsaXQoJ18nKVswXQoKZGVmIGFkZF9kZWIoZGViX3RvX2FkZF9wYXRoLCBjb21wb25lbnQsIGRpc3RyaWJ1dGlvbl9wYXRoLCB1c2VfaGFyZF9saW5rcyk6CiAgICAiIiJNZW5hbWJhaGthbiBkZWIga2UgcmVwb3NpdG9yeSIiIgogICAgZGViX3RvX2FkZF9jb250cm9sX2ZpbGUgPSBjb250cm9sX2ZpbGVfY29udGVudHMoZGViX3RvX2FkZF9wYXRoKQogICAgZGViX3RvX2FkZF9wa2dfbmFtZSA9IHJlLnNlYXJjaCgnUGFja2FnZTogKC4qKScsIGRlYl90b19hZGRfY29udHJvbF9maWxlKS5ncm91cCgxKQogICAgZGViX2FyY2ggPSByZS5zZWFyY2goJ0FyY2hpdGVjdHVyZTogKC4qKScsIGRlYl90b19hZGRfY29udHJvbF9maWxlKS5ncm91cCgxKQoKICAgIGlmIGRlYl9hcmNoIG5vdCBpbiBTVVBQT1JURURfQVJDSEVTOgogICAgICAgIHN5cy5leGl0KCdVbnN1cHBvcnRlZCBhcmNoICInICsgZGViX2FyY2ggKyAnIiBpbiAnICsgb3MucGF0aC5iYXNlbmFtZShkZWJfdG9fYWRkX3BhdGgpKQoKICAgIGFyY2hfZGlyX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXBvbmVudCwgJ2JpbmFyeS0nICsgZGViX2FyY2gpCgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoYXJjaF9kaXJfcGF0aCk6CiAgICAgICAgb3MubWFrZWRpcnMoYXJjaF9kaXJfcGF0aCkKCiAgICBwcmludCgnQWRkaW5nIGRlYiBmaWxlOiAnICsgb3MucGF0aC5iYXNlbmFtZShkZWJfdG9fYWRkX3BhdGgpICsgJy4uLicpCiAgICBkZXN0X2RlYl9kaXJfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcG9uZW50LCAnYmluYXJ5LScgKyBkZWJfYXJjaCkKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRlc3RfZGViX2Rpcl9wYXRoKToKICAgICAgICBvcy5tYWtlZGlycyhkZXN0X2RlYl9kaXJfcGF0aCkKICAgIGRlc3RpbmF0aW9uX2RlYl9maWxlID0gb3MucGF0aC5qb2luKGRlc3RfZGViX2Rpcl9wYXRoLCBvcy5wYXRoLmJhc2VuYW1lKGRlYl90b19hZGRfcGF0aCkpCgogICAgaWYgdXNlX2hhcmRfbGlua3M6CiAgICAgICAgb3MubGluayhkZWJfdG9fYWRkX3BhdGgsIGRlc3RpbmF0aW9uX2RlYl9maWxlKQogICAgZWxzZToKICAgICAgICBzaHV0aWwuY29weTIoZGViX3RvX2FkZF9wYXRoLCBkZXN0aW5hdGlvbl9kZWJfZmlsZSkKCiAgICBjb250ZW50c19maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXBvbmVudCwgJ0NvbnRlbnRzLScgKyBkZWJfYXJjaCkKICAgIHdpdGggb3Blbihjb250ZW50c19maWxlX3BhdGgsICdhJykgYXMgY29udGVudHNfZmlsZToKICAgICAgICBmb3IgZiBpbiBsaXN0X3BhY2thZ2VfZmlsZXMoZGVzdGluYXRpb25fZGViX2ZpbGUpOgogICAgICAgICAgICBwcmludCgiJS04MHMgJXMiICUgKGYsIGRlYl90b19hZGRfcGtnX25hbWUpLCBmaWxlPWNvbnRlbnRzX2ZpbGUpCgpkZWYgYnVpbGRfc291cmNlKCk6CiAgICAiIiJNZW1idWF0IHNvdXJjZSBwYWNrYWdlIGJhcnUiIiIKICAgIHByaW50KCJcblsrXSBDcmVhdGluZyBuZXcgc291cmNlIHBhY2thZ2UiKQoKICAgIGxpbnV4dHlwZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJPUyBUeXBlIixnZXRfcmFuZG9tX29zdHlwZSgpKQogICAgcGtnbmFtZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJQYWNrYWdlIE5hbWUiLCAibXl0b29scyIpCiAgICB2ZXJzaW9uZGViID0gZ2V0X25ld192ZXJzaW9uX2lucHV0KCJWZXJzaW9uIiwgIjEuMC4wIikKICAgIGFyY2h0eXBlID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIkFyY2hpdGVjdHVyZSIsICJhbGwiKQogICAgZGVwZW5kID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIkRlcGVuZHMiLCAiIikKICAgIHJlY29tbWVuZCA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJSZWNvbW1lbmRzIiwgIiIpCiAgICBpbnN0YWxsc2l6ZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJJbnN0YWxsZWQgU2l6ZSIsICIxMDI0IikKICAgIGRlc2NyaXB0aW9uID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIkRlc2NyaXB0aW9ucyIsICJBIGdyZWF0IHRvb2xzIikKICAgIHVzZXJuYW1lID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIlVzZXJuYW1lIiwgb3MuZW52aXJvbi5nZXQoJ1VTRVInLCAndXNlcicpKQogICAgdXNlcmVtYWlsID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIkVtYWlsIiwgZiJ7b3MuZW52aXJvbi5nZXQoJ1VTRVInLCAndXNlcicpfUBleGFtcGxlLmNvbSIpCiAgICBob21lcGFnZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJIb21lIFBhZ2UiLCAiaHR0cHM6Ly9leGFtcGxlLmNvbSIpCgogICAgcGFja2FnZV9kaXIgPSBvcy5wYXRoLmpvaW4oUFJPSkVDVF9QQVRILCBsaW51eHR5cGUsIGYie3BrZ25hbWV9X3t2ZXJzaW9uZGVifV97YXJjaHR5cGV9IikKICAgIGRlYmlhbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJERUJJQU4iKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZWJpYW5fZGlyKToKICAgICAgICBvcy5tYWtlZGlycyhkZWJpYW5fZGlyKQogICAgZWxzZToKICAgICAgICBwcmludChmIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czoge3BhY2thZ2VfZGlyfSIpCiAgICAgICAgcmV0dXJuCgogICAgVEVSTVVYX1NIRUJBTkcgPSAiIyEvZGF0YS9kYXRhL2NvbS50ZXJtdXgvZmlsZXMvdXNyL2Jpbi9iYXNoIgogICAgREVCSUFOX1NIRUJBTkcgPSAiIyEvYmluL2Jhc2giCgogICAgaWYgbGludXh0eXBlID09ICJ0ZXJtdXgiOgogICAgICAgIGJpbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluIikKICAgICAgICBvcy5tYWtlZGlycyhiaW5fZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRlYmlhbl9kaXIsICJwb3N0aW5zdCIpLCAndycpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoVEVSTVVYX1NIRUJBTkcgKyAiXG4iKQogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgInByZXJtIiksICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShURVJNVVhfU0hFQkFORyArICJcbiIpCiAgICBlbHNlOgogICAgICAgIGJpbl9kaXIgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICJ1c3IvbG9jYWwvYmluIikKICAgICAgICBvcy5tYWtlZGlycyhiaW5fZGlyLCBleGlzdF9vaz1UcnVlKQoKICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRlYmlhbl9kaXIsICJwb3N0aW5zdCIpLCAndycpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUoREVCSUFOX1NIRUJBTkcgKyAiXG4iKQogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgInByZXJtIiksICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZShERUJJQU5fU0hFQkFORyArICJcbiIpCgogICAgY29udHJvbF9jb250ZW50ID0gZiIiIlBhY2thZ2U6IHtwa2duYW1lfQpWZXJzaW9uOiB7dmVyc2lvbmRlYn0KQXJjaGl0ZWN0dXJlOiB7YXJjaHR5cGV9Ck1haW50YWluZXI6IHt1c2VybmFtZX0gPHt1c2VyZW1haWx9PgpEZXBlbmRzOiB7ZGVwZW5kfQpSZWNvbW1lbmRzOiB7cmVjb21tZW5kfQpJbnN0YWxsZWQtU2l6ZToge2luc3RhbGxzaXplfQpIb21lcGFnZToge2hvbWVwYWdlfQpEZXNjcmlwdGlvbjoge2Rlc2NyaXB0aW9ufSIiIgoKICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGViaWFuX2RpciwgImNvbnRyb2wiKSwgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUoY29udHJvbF9jb250ZW50KQoKICAgIHN1YnByb2Nlc3MucnVuKFsnY2htb2QnLCAnNzU1JywgZGViaWFuX2RpciwgJy1SJ10pCgogICAgcHJpbnQoZiJcblsrXSBTb3VyY2UgcGFja2FnZSBjcmVhdGVkIGF0OiB7cGFja2FnZV9kaXJ9IikKICAgIHByaW50KGYiWytdIE1vdmUgeW91ciBiaW5hcnkgZmlsZXMgdG86IHtiaW5fZGlyfSIpCgpkZWYgdXBkYXRlX3NvdXJjZSgpOgogICAgIiIiVXBkYXRlIHNvdXJjZSBwYWNrYWdlIiIiCiAgICBwcmludCgiXG5bK10gVXBkYXRpbmcgc291cmNlIHBhY2thZ2UiKQoKICAgIGxpbnV4dHlwZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJPUyBUeXBlIixnZXRfcmFuZG9tX29zdHlwZSgpKQogICAgc291cmNlX2RpciA9IG9zLnBhdGguam9pbihQUk9KRUNUX1BBVEgsIGxpbnV4dHlwZSkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlX2Rpcik6CiAgICAgICAgcHJpbnQoZiJTb3VyY2UgZGlyZWN0b3J5IG5vdCBmb3VuZDoge3NvdXJjZV9kaXJ9IikKICAgICAgICByZXR1cm4KCiAgICBmaWxlcyA9IFtkIGZvciBkIGluIG9zLmxpc3RkaXIoc291cmNlX2RpcikgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgZCkpXQoKICAgIGlmIG5vdCBmaWxlczoKICAgICAgICBwcmludCgiTm8gc291cmNlIHBhY2thZ2VzIGZvdW5kIikKICAgICAgICByZXR1cm4KCiAgICBpZiBsZW4oZmlsZXMpID09IDE6CiAgICAgICAgc2VsZWN0ZWQgPSBmaWxlc1swXQogICAgICAgIHByaW50KGYiXG5BdXRvLXNlbGVjdGluZzoge3NlbGVjdGVkfSIpCiAgICBlbHNlOgogICAgICAgIHByaW50KCJcbkF2YWlsYWJsZSBwYWNrYWdlczoiKQogICAgICAgIGZvciBpLCBmIGluIGVudW1lcmF0ZShmaWxlcywgMSk6CiAgICAgICAgICAgIHByaW50KGYiICB7aX0uIHtmfSIpCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2hvaWNlID0gaW5wdXQoIlNlbGVjdCBwYWNrYWdlIChudW1iZXIpOiAiKS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZHggPSBpbnQoY2hvaWNlKSAtIDEKICAgICAgICAgICAgICAgIGlmIDAgPD0gaWR4IDwgbGVuKGZpbGVzKToKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGZpbGVzW2lkeF0KICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwcmludChmIkludmFsaWQgc2VsZWN0aW9uLiBQbGVhc2UgZW50ZXIgMS17bGVuKGZpbGVzKX0iKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHByaW50KCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXIiKQoKICAgIHBhY2thZ2VfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBzZWxlY3RlZCkKICAgIGNvbnRyb2xfcGF0aCA9IG9zLnBhdGguam9pbihwYWNrYWdlX3BhdGgsICJERUJJQU4iLCAiY29udHJvbCIpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGNvbnRyb2xfcGF0aCk6CiAgICAgICAgcHJpbnQoIkludmFsaWQgc291cmNlIHBhY2thZ2UiKQogICAgICAgIHJldHVybgoKICAgIHdpdGggb3Blbihjb250cm9sX3BhdGgsICdyJykgYXMgZjoKICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKCiAgICBwa2dfbmFtZSA9IHJlLnNlYXJjaChyJ1BhY2thZ2U6ICguKiknLCBjb250ZW50KS5ncm91cCgxKQogICAgcGtnX3ZlcnNpb24gPSByZS5zZWFyY2gocidWZXJzaW9uOiAoLiopJywgY29udGVudCkuZ3JvdXAoMSkKICAgIHBrZ19hcmNoID0gcmUuc2VhcmNoKHInQXJjaGl0ZWN0dXJlOiAoLiopJywgY29udGVudCkuZ3JvdXAoMSkKCiAgICBwcmludChmIlxuWytdIEN1cnJlbnQgcGFja2FnZSBpbmZvOiIpCiAgICBwcmludChmIiAgICBQYWNrYWdlOiB7cGtnX25hbWV9IikKICAgIHByaW50KGYiICAgIFZlcnNpb246IHtwa2dfdmVyc2lvbn0iKQogICAgcHJpbnQoZiIgICAgQXJjaGl0ZWN0dXJlOiB7cGtnX2FyY2h9IikKCiAgICBuZXdfbmFtZSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJOZXcgcGFja2FnZSBuYW1lIiwgcGtnX25hbWUpCiAgICBuZXdfdmVyc2lvbiA9IGdldF91cGRhdGVfdmVyc2lvbl9pbnB1dCgiVmVyc2lvbiIsIHBrZ192ZXJzaW9uKQogICAgbmV3X2FyY2ggPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiTmV3IGFyY2hpdGVjdHVyZSIsIHBrZ19hcmNoKQogICAgcmVuYW1lID0gaW5wdXQoIlJlbmFtZSBzb3VyY2UgZm9sZGVyPyBbWS9uXTogIikuc3RyaXAoKS5sb3dlcigpCiAgICBuZXdfZGlyX25hbWUgPSBmIntuZXdfbmFtZX1fe25ld192ZXJzaW9ufV97bmV3X2FyY2h9IgogICAgbmV3X3BhY2thZ2VfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBuZXdfZGlyX25hbWUpCgogICAgaWYgcmVuYW1lIGluIFsnJywgJ3knLCAneWVzJ106CiAgICAgICAgb3MucmVuYW1lKHBhY2thZ2VfcGF0aCwgbmV3X3BhY2thZ2VfcGF0aCkKICAgICAgICBwcmludChmIlsrXSBSZW5hbWVkOiB7c2VsZWN0ZWR9IC0+IHtuZXdfZGlyX25hbWV9IikKICAgIGVsc2U6CiAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHBhY2thZ2VfcGF0aCwgbmV3X3BhY2thZ2VfcGF0aCkKICAgICAgICBwcmludChmIlsrXSBDb3BpZWQ6IHtzZWxlY3RlZH0gLT4ge25ld19kaXJfbmFtZX0iKQoKICAgIGNvbnRyb2xfcGF0aF9uZXcgPSBvcy5wYXRoLmpvaW4obmV3X3BhY2thZ2VfcGF0aCwgIkRFQklBTiIsICJjb250cm9sIikKICAgIHdpdGggb3Blbihjb250cm9sX3BhdGhfbmV3LCAncicpIGFzIGY6CiAgICAgICAgbmV3X2NvbnRlbnQgPSBmLnJlYWQoKQoKICAgIG5ld19jb250ZW50ID0gcmUuc3ViKHInUGFja2FnZTogLionLCBmJ1BhY2thZ2U6IHtuZXdfbmFtZX0nLCBuZXdfY29udGVudCkKICAgIG5ld19jb250ZW50ID0gcmUuc3ViKHInVmVyc2lvbjogLionLCBmJ1ZlcnNpb246IHtuZXdfdmVyc2lvbn0nLCBuZXdfY29udGVudCkKICAgIG5ld19jb250ZW50ID0gcmUuc3ViKHInQXJjaGl0ZWN0dXJlOiAuKicsIGYnQXJjaGl0ZWN0dXJlOiB7bmV3X2FyY2h9JywgbmV3X2NvbnRlbnQpCgogICAgd2l0aCBvcGVuKGNvbnRyb2xfcGF0aF9uZXcsICd3JykgYXMgZjoKICAgICAgICBmLndyaXRlKG5ld19jb250ZW50KQoKICAgIGlmIGxpbnV4dHlwZSA9PSAidGVybXV4IjoKICAgICAgICBiaW5fZGlyID0gb3MucGF0aC5qb2luKG5ld19wYWNrYWdlX3BhdGgsICJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluIikKICAgIGVsc2U6CiAgICAgICAgYmluX2RpciA9IG9zLnBhdGguam9pbihuZXdfcGFja2FnZV9wYXRoLCAidXNyL2xvY2FsL2JpbiIpCgogICAgaWYgb3MucGF0aC5leGlzdHMoYmluX2Rpcik6CiAgICAgICAgZm9yIGJpbl9maWxlIGluIG9zLmxpc3RkaXIoYmluX2Rpcik6CiAgICAgICAgICAgIGJpbl9wYXRoID0gb3MucGF0aC5qb2luKGJpbl9kaXIsIGJpbl9maWxlKQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShiaW5fcGF0aCk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGJpbl9wYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgIGJpbl9jb250ZW50ID0gZi5yZWFkKCkKICAgICAgICAgICAgICAgICAgICBpZiBwa2dfdmVyc2lvbiBpbiBiaW5fY29udGVudDoKICAgICAgICAgICAgICAgICAgICAgICAgYmluX2NvbnRlbnQgPSBiaW5fY29udGVudC5yZXBsYWNlKHBrZ192ZXJzaW9uLCBuZXdfdmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGJpbl9wYXRoLCAndycpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGJpbl9jb250ZW50KQogICAgICAgICAgICAgICAgICAgICAgICBwcmludChmIlsrXSBVcGRhdGVkIHZlcnNpb24gaW46IHtiaW5fZmlsZX0iKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgICAgIHByaW50KGYiWy1dIENvdWxkIG5vdCB1cGRhdGUge2Jpbl9maWxlfToge2V9IikKCiAgICBzdWJwcm9jZXNzLnJ1bihbJ2NobW9kJywgJzc1NScsIG9zLnBhdGguam9pbihuZXdfcGFja2FnZV9wYXRoLCAiREVCSUFOIiksICctUiddKQoKICAgIHByaW50KGYiXG5bK10gUGFja2FnZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEiKQogICAgcHJpbnQoZiIgICAgTG9jYXRpb246IHtuZXdfcGFja2FnZV9wYXRofSIpCiAgICBwcmludChmIiAgICBOZXcgdmVyc2lvbjoge25ld192ZXJzaW9ufSIpCgpkZWYgYnVpbGRfZGViKCk6CiAgICAiIiJNZW1iYW5ndW4gZGViIGRhcmkgc291cmNlIiIiCiAgICBwcmludCgiXG5bK10gQnVpbGRpbmcgZGViIHBhY2thZ2UiKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhQUk9KRUNUX1BBVEgpOgogICAgICAgIHByaW50KCJQcm9qZWN0IGZvbGRlciBub3QgZm91bmQuIFJ1biAncmVwby1tYW5hZ2VyIC0tc291cmNlJyBmaXJzdCIpCiAgICAgICAgcmV0dXJuCgogICAgbGludXh0eXBlID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIk9TIFR5cGUiLGdldF9yYW5kb21fb3N0eXBlKCkpCiAgICBzb3VyY2VfZGlyID0gb3MucGF0aC5qb2luKFBST0pFQ1RfUEFUSCwgbGludXh0eXBlKQoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2VfZGlyKToKICAgICAgICBwcmludChmIlNvdXJjZSBkaXJlY3Rvcnkgbm90IGZvdW5kOiB7c291cmNlX2Rpcn0iKQogICAgICAgIHJldHVybgoKICAgIGZpbGVzID0gW2QgZm9yIGQgaW4gb3MubGlzdGRpcihzb3VyY2VfZGlyKSBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBkKSldCiAgICBmaWxlcy5zb3J0KCkKCiAgICBpZiBub3QgZmlsZXM6CiAgICAgICAgcHJpbnQoIk5vIHNvdXJjZSBwYWNrYWdlcyBmb3VuZCIpCiAgICAgICAgcmV0dXJuCgogICAgcHJpbnQoIlxuQXZhaWxhYmxlIHBhY2thZ2VzOiIpCiAgICBmb3IgaSwgZiBpbiBlbnVtZXJhdGUoZmlsZXMsIDEpOgogICAgICAgIHByaW50KGYiICB7aX0uIHtmfSIpCgogICAgY2hvaWNlID0gaW5wdXQoIlNlbGVjdCBwYWNrYWdlIChudW1iZXIpOiAiKS5zdHJpcCgpCiAgICB0cnk6CiAgICAgICAgaWR4ID0gaW50KGNob2ljZSkgLSAxCiAgICAgICAgaWYgMCA8PSBpZHggPCBsZW4oZmlsZXMpOgogICAgICAgICAgICBzZWxlY3RlZCA9IGZpbGVzW2lkeF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmludCgiSW52YWxpZCBzZWxlY3Rpb24iKQogICAgICAgICAgICByZXR1cm4KICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHByaW50KCJJbnZhbGlkIGlucHV0IikKICAgICAgICByZXR1cm4KCiAgICBwYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2Rpciwgc2VsZWN0ZWQpCiAgICBkZWJpYW5fZGlyID0gb3MucGF0aC5qb2luKHBhY2thZ2VfcGF0aCwgIkRFQklBTiIpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRlYmlhbl9kaXIpOgogICAgICAgIHByaW50KGYiREVCSUFOIGRpcmVjdG9yeSBub3QgZm91bmQgaW4ge3NlbGVjdGVkfSIpCiAgICAgICAgcHJpbnQoIlRoaXMgZG9lc24ndCBsb29rIGxpa2UgYSB2YWxpZCBzb3VyY2UgcGFja2FnZSIpCiAgICAgICAgcmV0dXJuCgogICAgY29uZmlnID0gbG9hZF9yZXBvX2NvbmZpZygpCiAgICBjb21wZm9sZCA9IGNvbmZpZy5nZXQoJ0NPTVBPTkVOVCcpIG9yICJtYWluIgogICAgY29uZmlnWydDT01QT05FTlQnXSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJDb21wb25lbnQgZm9sZGVyIiwgY29tcGZvbGQpCgogICAgaWYgbGludXh0eXBlID09ICJ0ZXJtdXgiOgogICAgICAgIGRlYmZvbGQgPSBURVJNVVhfREVCX1BBVEgKICAgIGVsc2U6CiAgICAgICAgZGViZm9sZCA9IERFQklBTl9ERUJfUEFUSAoKICAgIGNvbXBvbmVudF9kaXIgPSBvcy5wYXRoLmpvaW4oZGViZm9sZCwgY29tcGZvbGQpCiAgICBjcmVhdGVfZGlyZWN0b3J5KGNvbXBvbmVudF9kaXIpCgogICAgc3VicHJvY2Vzcy5ydW4oWydjaG1vZCcsICc3NTUnLCBkZWJpYW5fZGlyLCAnLVInXSkKICAgIHN1YnByb2Nlc3MucnVuKFsnZHBrZy1kZWInLCAnLS1idWlsZCcsICctWnh6JywgcGFja2FnZV9wYXRoXSkKCiAgICBkZWJfZmlsZSA9IHBhY2thZ2VfcGF0aCArICIuZGViIgogICAgaWYgb3MucGF0aC5leGlzdHMoZGViX2ZpbGUpOgogICAgICAgIHNodXRpbC5tb3ZlKGRlYl9maWxlLCBvcy5wYXRoLmpvaW4oY29tcG9uZW50X2Rpciwgb3MucGF0aC5iYXNlbmFtZShkZWJfZmlsZSkpKQogICAgICAgIHByaW50KGYiWytdIERlYiBidWlsdCBzdWNjZXNzZnVsbHk6IHtvcy5wYXRoLmpvaW4oY29tcG9uZW50X2Rpciwgb3MucGF0aC5iYXNlbmFtZShkZWJfZmlsZSkpfSIpCiAgICBlbHNlOgogICAgICAgIHByaW50KCJbLV0gRmFpbGVkIHRvIGJ1aWxkIGRlYiIpCgpkZWYgbG9hZF9yZXBvX2NvbmZpZygpOgogICAgIiIiTG9hZCBrb25maWd1cmFzaSByZXBvc2l0b3J5IiIiCiAgICBjb25maWcgPSB7CiAgICAgICAgJ1VTRVJOQU1FJzogJycsCiAgICAgICAgJ1JFUE9TSVRPUlknOiAnJywKICAgICAgICAnT1NUWVBFJzogJycsCiAgICAgICAgJ0NPREVOQU1FJzogJycsCiAgICAgICAgJ0NPTVBPTkVOVCc6ICcnCiAgICB9CgogICAgaWYgb3MucGF0aC5leGlzdHMoQ09ORklHX0ZJTEUpOgogICAgICAgIHdpdGggb3BlbihDT05GSUdfRklMRSwgJ3InKSBhcyBmOgogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgaWYgJz0nIGluIGxpbmU6CiAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3RyaXAoKS5zcGxpdCgnPScsIDEpCiAgICAgICAgICAgICAgICAgICAgaWYga2V5IGluIGNvbmZpZzoKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW2tleV0gPSB2YWx1ZQoKICAgIHJldHVybiBjb25maWcKCmRlZiBzYXZlX3JlcG9fY29uZmlnKGNvbmZpZyk6CiAgICAiIiJTYXZlIGtvbmZpZ3VyYXNpIHJlcG9zaXRvcnkiIiIKICAgIGNyZWF0ZV9kaXJlY3Rvcnkob3MucGF0aC5kaXJuYW1lKENPTkZJR19GSUxFKSkKICAgIHdpdGggb3BlbihDT05GSUdfRklMRSwgJ3cnKSBhcyBmOgogICAgICAgIGZvciBrZXksIHZhbHVlIGluIGNvbmZpZy5pdGVtcygpOgogICAgICAgICAgICBpZiB2YWx1ZToKICAgICAgICAgICAgICAgIGYud3JpdGUoZiJ7a2V5fT17dmFsdWV9XG4iKQoKZGVmIGdlbmVyYXRlX3JlcG9fY29uZmlnKCk6CiAgICAiIiJHZW5lcmF0ZSBrb25maWd1cmFzaSByZXBvc2l0b3J5IiIiCiAgICBjb25maWcgPSBsb2FkX3JlcG9fY29uZmlnKCkKCiAgICBwcmludCgiXG5bK10gUmVwb3NpdG9yeSBDb25maWd1cmF0aW9uXG4iKQoKICAgIGdpdF91c2VyID0gc3VicHJvY2Vzcy5ydW4oWydnaXQnLCAnY29uZmlnJywgJ3VzZXIubmFtZSddLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpLnN0ZG91dC5zdHJpcCgpCgogICAgZGVmYXVsdF91c2VybmFtZSA9IGNvbmZpZy5nZXQoJ1VTRVJOQU1FJykgb3IgZ2l0X3VzZXIgb3IgInVzZXJuYW1lIgogICAgY29uZmlnWydVU0VSTkFNRSddID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIkdpdCB1c2VybmFtZSIsIGRlZmF1bHRfdXNlcm5hbWUpCgogICAgY3VycmVudF9kaXIgPSBvcy5wYXRoLmJhc2VuYW1lKG9zLmdldGN3ZCgpKQogICAgZGVmYXVsdF9yZXBvID0gY29uZmlnLmdldCgnUkVQT1NJVE9SWScpIG9yIGN1cnJlbnRfZGlyCiAgICBjb25maWdbJ1JFUE9TSVRPUlknXSA9IGdldF9pbnB1dF93aXRoX2VkaXRhYmxlKCJHaXQgcmVwbyIsIGRlZmF1bHRfcmVwbykKCiAgICBkZWZhdWx0X29zdHlwZSA9IGNvbmZpZy5nZXQoJ09TVFlQRScpIG9yICJkZWJpYW4iCiAgICBjb25maWdbJ09TVFlQRSddID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIk9TIHR5cGUiLCBkZWZhdWx0X29zdHlwZSkKCiAgICBkZWZhdWx0X2NvZGVuYW1lID0gY29uZmlnLmdldCgnQ09ERU5BTUUnKSBvciAic3RhYmxlIgogICAgY29uZmlnWydDT0RFTkFNRSddID0gZ2V0X2lucHV0X3dpdGhfZWRpdGFibGUoIkNvZGUgbmFtZSIsIGRlZmF1bHRfY29kZW5hbWUpCgogICAgZGVmYXVsdF9jb21wb25lbnQgPSBjb25maWcuZ2V0KCdDT01QT05FTlQnKSBvciAibWFpbiIKICAgIGNvbmZpZ1snQ09NUE9ORU5UJ10gPSBnZXRfaW5wdXRfd2l0aF9lZGl0YWJsZSgiQ29tcG9uZW50IiwgZGVmYXVsdF9jb21wb25lbnQpCgogICAgc2F2ZV9yZXBvX2NvbmZpZyhjb25maWcpCgogICAgcmVwb191cmwgPSBmImRlYiBodHRwczovL3tjb25maWdbJ1VTRVJOQU1FJ119LmdpdGh1Yi5pby97Y29uZmlnWydSRVBPU0lUT1JZJ119L3tjb25maWdbJ09TVFlQRSddfSB7Y29uZmlnWydDT0RFTkFNRSddfSB7Y29uZmlnWydDT01QT05FTlQnXX0iCgogICAgcHJpbnQoZiJcblsrXSBSZXBvc2l0b3J5IFVSTDoge3JlcG9fdXJsfSIpCiAgICBwcmludCgiWytdIENvbmZpZyBzYXZlZCB0byB+Ly5jb25maWcvZ2l0LXJlcG8uY29uZiIpCgogICAgcmV0dXJuIGNvbmZpZwoKZGVmIGJ1aWxkX3JlcG9zaXRvcnkoKToKICAgICIiIk1lbWJhbmd1biByZXBvc2l0b3J5IHRyZWUiIiIKICAgIHByaW50KCJcblsrXSBCdWlsZGluZyByZXBvc2l0b3J5IikKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoIi5naXQiKToKICAgICAgICBwcmludCgiTm90IGluIGEgZ2l0IHJlcG9zaXRvcnkuIFBsZWFzZSBydW4gdGhpcyBjb21tYW5kIGZyb20geW91ciByZXBvc2l0b3J5IGZvbGRlciIpCiAgICAgICAgcHJpbnQoIk9yIGluaXRpYWxpemUgZ2l0IHdpdGg6IGdpdCBpbml0IikKICAgICAgICByZXR1cm4KCiAgICBjb25maWcgPSBnZW5lcmF0ZV9yZXBvX2NvbmZpZygpCgogICAgaWYgY29uZmlnWydPU1RZUEUnXSA9PSAidGVybXV4IjoKICAgICAgICBkZWJfcGF0aCA9IFRFUk1VWF9ERUJfUEFUSAogICAgZWxzZToKICAgICAgICBkZWJfcGF0aCA9IERFQklBTl9ERUJfUEFUSAoKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZWJfcGF0aCk6CiAgICAgICAgcHJpbnQoZiJEZWIgZm9sZGVyIG5vdCBmb3VuZDoge2RlYl9wYXRofSIpCiAgICAgICAgcHJpbnQoIkJ1aWxkIHNvbWUgZGVicyBmaXJzdCB3aXRoICdyZXBvLW1hbmFnZXIgLS1kZWInIikKICAgICAgICByZXR1cm4KICAgIHJ1bl9idWlsZF9yZXBvKGRlYl9wYXRoLCBjb25maWdbJ09TVFlQRSddLCBjb25maWdbJ0NPREVOQU1FJ10sIGNvbmZpZ1snQ09NUE9ORU5UJ10sIHNpZ249VHJ1ZSkKCmRlZiBydW5fYnVpbGRfcmVwbyhpbnB1dF9wYXRoLCBvdXRwdXRfcGF0aCwgZGlzdHJpYnV0aW9uLCBjb21wb25lbnQsIHNpZ249RmFsc2UpOgogICAgIiIiTWVtYmFuZ3VuIHJlcG9zaXRvcnkgZGVuZ2FuIGRlYiBmaWxlcyIiIgoKICAgIENPTVBPTkVOVFMgPSBbXQogICAgZW5jb3VudGVyZWRfYXJjaGVzID0gc2V0KCkKCiAgICBkaXN0cmlidXRpb25fcGF0aCA9IG9zLnBhdGguam9pbihvdXRwdXRfcGF0aCwgJ2Rpc3RzJywgZGlzdHJpYnV0aW9uKQoKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGlucHV0X3BhdGgpOgogICAgICAgIHN5cy5leGl0KGYiJ3tpbnB1dF9wYXRofScgZG9lcyBub3QgZXhpc3QiKQoKICAgIGRlYnNfaW5fcGF0aCA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oaW5wdXRfcGF0aCwgIiouZGViIikpCiAgICBkZWJzX2luX3BhdGggKz0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihpbnB1dF9wYXRoLCAiKi8qLmRlYiIpKQoKICAgIGlmIG5vdCBkZWJzX2luX3BhdGg6CiAgICAgICAgc3lzLmV4aXQoJ05vIC5kZWIgZmlsZSBmb3VuZCBpbiAnICsgaW5wdXRfcGF0aCkKCiAgICBmb3IgZGViX3BhdGggaW4gc29ydGVkKGRlYnNfaW5fcGF0aCk6CiAgICAgICAgY29tcCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlbHBhdGgoZGViX3BhdGgsIGlucHV0X3BhdGgpKQogICAgICAgIGlmIG5vdCBjb21wOgogICAgICAgICAgICBjb21wID0gY29tcG9uZW50CiAgICAgICAgaWYgY29tcCBub3QgaW4gQ09NUE9ORU5UUzoKICAgICAgICAgICAgQ09NUE9ORU5UUy5hcHBlbmQoY29tcCkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXApKToKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5qb2luKGRpc3RyaWJ1dGlvbl9wYXRoLCBjb21wKSkKICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5qb2luKGRpc3RyaWJ1dGlvbl9wYXRoLCBjb21wKSkKCiAgICAgICAgZGViX3RvX2FkZF9jb250cm9sX2ZpbGUgPSBjb250cm9sX2ZpbGVfY29udGVudHMoZGViX3BhdGgpCiAgICAgICAgZGViX2FyY2ggPSByZS5zZWFyY2goJ0FyY2hpdGVjdHVyZTogKC4qKScsIGRlYl90b19hZGRfY29udHJvbF9maWxlKS5ncm91cCgxKQoKICAgICAgICBpZiBkZWJfYXJjaCBub3QgaW4gU1VQUE9SVEVEX0FSQ0hFUzoKICAgICAgICAgICAgc3lzLmV4aXQoZidVbnN1cHBvcnRlZCBhcmNoICJ7ZGViX2FyY2h9IiBpbiB7b3MucGF0aC5iYXNlbmFtZShkZWJfcGF0aCl9JykKICAgICAgICBlbmNvdW50ZXJlZF9hcmNoZXMuYWRkKGRlYl9hcmNoKQoKICAgICAgICBhcmNoX2Rpcl9wYXRoID0gb3MucGF0aC5qb2luKGRpc3RyaWJ1dGlvbl9wYXRoLCBjb21wLCAnYmluYXJ5LScgKyBkZWJfYXJjaCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihhcmNoX2Rpcl9wYXRoKToKICAgICAgICAgICAgb3MubWFrZWRpcnMoYXJjaF9kaXJfcGF0aCkKCiAgICAgICAgcHJpbnQoZidBZGRpbmcgZGViIGZpbGU6IHtvcy5wYXRoLmJhc2VuYW1lKGRlYl9wYXRoKX0uLi4nKQogICAgICAgIGRlc3RfZGViX2ZpbGUgPSBvcy5wYXRoLmpvaW4oYXJjaF9kaXJfcGF0aCwgb3MucGF0aC5iYXNlbmFtZShkZWJfcGF0aCkpCiAgICAgICAgc2h1dGlsLmNvcHkyKGRlYl9wYXRoLCBkZXN0X2RlYl9maWxlKQoKICAgICAgICBwYWNrYWdlX25hbWUgPSBnZXRfcGFja2FnZV9uYW1lKG9zLnBhdGguYmFzZW5hbWUoZGViX3BhdGgpKQogICAgICAgIGNvbnRlbnRzX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcCwgJ0NvbnRlbnRzLScgKyBkZWJfYXJjaCkKICAgICAgICB3aXRoIG9wZW4oY29udGVudHNfZmlsZV9wYXRoLCAnYScpIGFzIGNvbnRlbnRzX2ZpbGU6CiAgICAgICAgICAgIGZvciBmIGluIGxpc3RfcGFja2FnZV9maWxlcyhkZXN0X2RlYl9maWxlKToKICAgICAgICAgICAgICAgIHByaW50KCIlLTgwcyAlcyIgJSAoZiwgcGFja2FnZV9uYW1lKSwgZmlsZT1jb250ZW50c19maWxlKQoKICAgIHJlbGVhc2VfZmlsZV9wYXRoID0gZGlzdHJpYnV0aW9uX3BhdGggKyAnL1JlbGVhc2UnCiAgICB3aXRoIG9wZW4ocmVsZWFzZV9maWxlX3BhdGgsICd3JykgYXMgcmVsZWFzZV9maWxlOgogICAgICAgIHByaW50KCJDb2RlbmFtZTogIiArIGRpc3RyaWJ1dGlvbiwgZmlsZT1yZWxlYXNlX2ZpbGUpCiAgICAgICAgcHJpbnQoIlZlcnNpb246IDEiLCBmaWxlPXJlbGVhc2VfZmlsZSkKICAgICAgICBwcmludCgiQXJjaGl0ZWN0dXJlczogIiArICcgJy5qb2luKGVuY291bnRlcmVkX2FyY2hlcyksIGZpbGU9cmVsZWFzZV9maWxlKQogICAgICAgIHByaW50KCJEZXNjcmlwdGlvbjogIiArIGRpc3RyaWJ1dGlvbiArICIgcmVwb3NpdG9yeSIsIGZpbGU9cmVsZWFzZV9maWxlKQogICAgICAgIHByaW50KCJTdWl0ZTogIiArIGRpc3RyaWJ1dGlvbiwgZmlsZT1yZWxlYXNlX2ZpbGUpCiAgICAgICAgcHJpbnQoIkRhdGU6ICIgKyBkYXRldGltZS5kYXRldGltZS5ub3coZGF0ZXRpbWUuVVRDKS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIFVUQycpLCBmaWxlPXJlbGVhc2VfZmlsZSkKCiAgICAgICAgZm9yIGNvbXAgaW4gQ09NUE9ORU5UUzoKICAgICAgICAgICAgZm9yIGFyY2hfZGlyX3BhdGggaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcCwgJ2JpbmFyeS0qJykpOgogICAgICAgICAgICAgICAgYXJjaCA9IG9zLnBhdGguYmFzZW5hbWUoYXJjaF9kaXJfcGF0aCkuc3BsaXQoJy0nKVsxXQogICAgICAgICAgICAgICAgcHJpbnQoZidDcmVhdGluZyBwYWNrYWdlIGZpbGUgZm9yIHtjb21wfSBhbmQge2FyY2h9Li4uJykKICAgICAgICAgICAgICAgIHBhY2thZ2VzX2ZpbGVfcGF0aCA9IGFyY2hfZGlyX3BhdGggKyAnL1BhY2thZ2VzJwogICAgICAgICAgICAgICAgYmluYXJ5X3BhdGggPSAnYmluYXJ5LScgKyBhcmNoCgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhY2thZ2VzX2ZpbGVfcGF0aCwgJ3cnKSBhcyBwYWNrYWdlc19maWxlOgogICAgICAgICAgICAgICAgICAgIGZvciBkZWJfdG9fcmVhZF9wYXRoIGluIHNvcnRlZChnbG9iLmdsb2Iob3MucGF0aC5qb2luKGFyY2hfZGlyX3BhdGgsICIqLmRlYiIpKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5wYWNrYWdlc19vdXRwdXQgPSBjb250cm9sX2ZpbGVfY29udGVudHMoZGViX3RvX3JlYWRfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbnBhY2thZ2VzX291dHB1dCArPSAnXG5GaWxlbmFtZTogJyArIG9zLnBhdGguam9pbignZGlzdHMnLCBkaXN0cmlidXRpb24sIGNvbXAsIGJpbmFyeV9wYXRoLCBvcy5wYXRoLmJhc2VuYW1lKGRlYl90b19yZWFkX3BhdGgpKQogICAgICAgICAgICAgICAgICAgICAgICBzY2FucGFja2FnZXNfb3V0cHV0ICs9ICdcblNpemU6ICcgKyBzdHIob3Muc3RhdChkZWJfdG9fcmVhZF9wYXRoKS5zdF9zaXplKQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGhhc2hfdHlwZSBpbiBIQVNIRVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNoX3R5cGUgPT0gIm1kNSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9zdHJpbmcgPSBoYXNoX3R5cGUudXBwZXIoKSArICdTdW0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfc3RyaW5nID0gaGFzaF90eXBlLnVwcGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihkZWJfdG9fcmVhZF9wYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfb2JqID0gZ2V0YXR0cihoYXNobGliLCBoYXNoX3R5cGUpKGYucmVhZCgpKS5oZXhkaWdlc3QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbnBhY2thZ2VzX291dHB1dCArPSAnXG4nICsgaGFzaF9zdHJpbmcgKyAnOiAnICsgaGFzaF9vYmoKCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHNjYW5wYWNrYWdlc19vdXRwdXQsIGZpbGU9cGFja2FnZXNfZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJycsIGZpbGU9cGFja2FnZXNfZmlsZSkKCiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWyd4eiAtOSAtLWtlZXAgJyArIHBhY2thZ2VzX2ZpbGVfcGF0aF0sIHNoZWxsPVRydWUsIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQoKICAgICAgICAgICAgZm9yIGNvbnRlbnRzX2ZpbGUgaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihkaXN0cmlidXRpb25fcGF0aCwgY29tcCwgJ0NvbnRlbnRzLSonKSk6CiAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWyd4eiAtOSAtLWtlZXAgJyArIGNvbnRlbnRzX2ZpbGVdLCBzaGVsbD1UcnVlLCB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSkKCiAgICAgICAgQ09NUE9ORU5UUyA9IFtkIGZvciBkIGluIG9zLmxpc3RkaXIoZGlzdHJpYnV0aW9uX3BhdGgpIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKGRpc3RyaWJ1dGlvbl9wYXRoLCBkKSldCgogICAgICAgIGZvciBoYXNoX3R5cGUgaW4gSEFTSEVTOgogICAgICAgICAgICBpZiBoYXNoX3R5cGUgPT0gJ21kNSc6CiAgICAgICAgICAgICAgICBoYXNoX3N0cmluZyA9IGhhc2hfdHlwZS51cHBlcigpICsgJ1N1bScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGhhc2hfc3RyaW5nID0gaGFzaF90eXBlLnVwcGVyKCkKICAgICAgICAgICAgcHJpbnQoaGFzaF9zdHJpbmcgKyAnOicsIGZpbGU9cmVsZWFzZV9maWxlKQoKICAgICAgICAgICAgZm9yIGNvbXAgaW4gQ09NUE9ORU5UUzoKICAgICAgICAgICAgICAgIGZvciBhcmNoX2Rpcl9wYXRoIGluIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXAsICdiaW5hcnktKicpKToKICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBbJ1BhY2thZ2VzJywgJ1BhY2thZ2VzLnh6J106CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihhcmNoX2Rpcl9wYXRoLCBmKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlX3BhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9oYXNoID0gZ2V0YXR0cihoYXNobGliLCBoYXNoX3R5cGUpKGZwLnJlYWQoKSkuaGV4ZGlnZXN0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IHN0cihvcy5zdGF0KGZpbGVfcGF0aCkuc3Rfc2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9wYXRoID0gb3MucGF0aC5qb2luKGNvbXAsIG9zLnBhdGguYmFzZW5hbWUoYXJjaF9kaXJfcGF0aCksIGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnICcgKyAnICcuam9pbihbZmlsZV9oYXNoLCBmaWxlX3NpemUsIHJlbF9wYXRoXSksIGZpbGU9cmVsZWFzZV9maWxlKQoKICAgICAgICAgICAgICAgIGZvciBjb250ZW50c19maWxlIGluIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZGlzdHJpYnV0aW9uX3BhdGgsIGNvbXAsICdDb250ZW50cy0qJykpOgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbnRlbnRzX2ZpbGUpOgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29udGVudHNfZmlsZSwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2hhc2ggPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hfdHlwZSkoZnAucmVhZCgpKS5oZXhkaWdlc3QoKQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSBzdHIob3Muc3RhdChjb250ZW50c19maWxlKS5zdF9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICByZWxfcGF0aCA9IG9zLnBhdGgucmVscGF0aChjb250ZW50c19maWxlLCBkaXN0cmlidXRpb25fcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyAnICsgJyAnLmpvaW4oW2ZpbGVfaGFzaCwgZmlsZV9zaXplLCByZWxfcGF0aF0pLCBmaWxlPXJlbGVhc2VfZmlsZSkKCiAgICAgICAgICAgICAgICAgICAgeHpfZmlsZSA9IGNvbnRlbnRzX2ZpbGUgKyAnLnh6JwogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHh6X2ZpbGUpOgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oeHpfZmlsZSwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2hhc2ggPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hfdHlwZSkoZnAucmVhZCgpKS5oZXhkaWdlc3QoKQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSBzdHIob3Muc3RhdCh4el9maWxlKS5zdF9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICByZWxfcGF0aCA9IG9zLnBhdGgucmVscGF0aCh4el9maWxlLCBkaXN0cmlidXRpb25fcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyAnICsgJyAnLmpvaW4oW2ZpbGVfaGFzaCwgZmlsZV9zaXplLCByZWxfcGF0aF0pLCBmaWxlPXJlbGVhc2VfZmlsZSkKCiAgICBwcmludCgnXG5bK10gUmVwb3NpdG9yeSBidWlsdCBzdWNjZXNzZnVsbHkhJykKICAgIHByaW50KGYnWytdIExvY2F0aW9uOiB7b3V0cHV0X3BhdGh9JykKICAgIHByaW50KCdcbkNvbnRhaW5pbmc6JykKICAgIGZvciBjb21wIGluIENPTVBPTkVOVFM6CiAgICAgICAgcHJpbnQoZicgIHtkaXN0cmlidXRpb259IHtjb21wfScpCgogICAgaWYgc2lnbjoKICAgICAgICBwcmludCgnXG5TaWduaW5nIHdpdGggZ3BnLi4uJykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbCiAgICAgICAgICAgICAgICAnZ3BnJywgJy0tY2xlYXJzaWduJywgJy1vJywKICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbl9wYXRoICsgJy9JblJlbGVhc2UnLAogICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX3BhdGggKyAnL1JlbGVhc2UnCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHByaW50KCcgIFtPS10gSW5SZWxlYXNlIGNyZWF0ZWQnKQoKICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsKICAgICAgICAgICAgICAgICdncGcnLCAnLWFicycsICctbycsCiAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fcGF0aCArICcvUmVsZWFzZS5ncGcnLAogICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX3BhdGggKyAnL1JlbGVhc2UnCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHByaW50KCcgIFtPS10gUmVsZWFzZS5ncGcgY3JlYXRlZCcpCiAgICAgICAgICAgIHByaW50KCdbK10gUmVwb3NpdG9yeSBzaWduZWQgc3VjY2Vzc2Z1bGx5IScpCiAgICAgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CiAgICAgICAgICAgIHByaW50KGYnWy1dIEdQRyBzaWduaW5nIGZhaWxlZDoge2V9JykKICAgICAgICAgICAgcHJpbnQoJyAgICBNYWtlIHN1cmUgeW91IGhhdmUgYSBHUEcga2V5IGNvbmZpZ3VyZWQnKQoKZGVmIHB1c2hfcmVwb3NpdG9yeSgpOgogICAgIiIiUHVzaCByZXBvc2l0b3J5IGtlIGdpdGh1YiIiIgogICAgcHJpbnQoIlxuWytdIFB1c2hpbmcgcmVwb3NpdG9yeSB0byBHaXRIdWIiKQoKICAgIHN1YnByb2Nlc3MucnVuKFsnZ2l0JywgJ2FkZCcsICcuJ10pCiAgICByZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bihbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBmIlVwZGF0ZSBieSB7b3MuZW52aXJvbi5nZXQoJ1VTRVInLCAndXNlcicpfSJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlX291dHB1dD1UcnVlLCB0ZXh0PVRydWUpCgogICAgaWYgcmVzdWx0LnJldHVybmNvZGUgIT0gMCBhbmQgIm5vdGhpbmcgdG8gY29tbWl0IiBub3QgaW4gcmVzdWx0LnN0ZGVycjoKICAgICAgICBwcmludChyZXN1bHQuc3RkZXJyKQoKICAgIGJyYW5jaF9yZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bihbJ2dpdCcsICdicmFuY2gnLCAnLS1zaG93LWN1cnJlbnQnXSwgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgdGV4dD1UcnVlKQogICAgYnJhbmNoID0gYnJhbmNoX3Jlc3VsdC5zdGRvdXQuc3RyaXAoKQoKICAgIGlmIGJyYW5jaDoKICAgICAgICBzdWJwcm9jZXNzLnJ1bihbJ2dpdCcsICdwdXNoJywgJy11JywgJ29yaWdpbicsIGJyYW5jaF0pCiAgICAgICAgcHJpbnQoIlsrXSBSZXBvc2l0b3J5IHB1c2hlZCBzdWNjZXNzZnVsbHkiKQogICAgZWxzZToKICAgICAgICBwcmludCgiWy1dIEZhaWxlZCB0byBkZXRlcm1pbmUgZ2l0IGJyYW5jaCIpCgpkZWYgZWRpdF9kZWIoZGViX2ZpbGUpOgogICAgIiIiRWRpdCBkZWIgcGFja2FnZSIiIgogICAgcHJpbnQoZiJcblsrXSBFZGl0aW5nIGRlYjoge2RlYl9maWxlfSIpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRlYl9maWxlKToKICAgICAgICBwcmludChmIkZpbGUgbm90IGZvdW5kOiB7ZGViX2ZpbGV9IikKICAgICAgICByZXR1cm4KCiAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZGViX2ZpbGUpCiAgICBwYXJ0cyA9IGJhc2VuYW1lLnJlcGxhY2UoJy5kZWInLCAnJykuc3BsaXQoJ18nKQoKICAgIGlmIGxlbihwYXJ0cykgPj0gMzoKICAgICAgICBkZWJuYW1lID0gcGFydHNbMF0KICAgICAgICB2ZXJzaW9uID0gcGFydHNbMV0KICAgICAgICBhcmNoaXRjID0gcGFydHNbMl0KICAgICAgICBwYWNrYWdlbmFtZSA9IGYie2RlYm5hbWV9X3t2ZXJzaW9ufV97YXJjaGl0Y30iCiAgICBlbHNlOgogICAgICAgIHBhY2thZ2VuYW1lID0gYmFzZW5hbWUucmVwbGFjZSgnLmRlYicsICcnKQoKICAgIGV4dHJhY3RfZGlyID0gcGFja2FnZW5hbWUKICAgIGNyZWF0ZV9kaXJlY3RvcnkoZXh0cmFjdF9kaXIpCgogICAgb3MuY2hkaXIoZXh0cmFjdF9kaXIpCgogICAgc3VicHJvY2Vzcy5ydW4oWydhcicsICd4JywgZiIuLi97ZGViX2ZpbGV9Il0sIGNoZWNrPUZhbHNlKQoKICAgIGNyZWF0ZV9kaXJlY3RvcnkoIkRFQklBTiIpCgogICAgaWYgb3MucGF0aC5leGlzdHMoImNvbnRyb2wudGFyLnh6Iik6CiAgICAgICAgc3VicHJvY2Vzcy5ydW4oWyd0YXInLCAneEp2ZicsICdjb250cm9sLnRhci54eicsICctQycsICdERUJJQU4nXSwgY2hlY2s9RmFsc2UpCiAgICBlbGlmIG9zLnBhdGguZXhpc3RzKCJjb250cm9sLnRhci5neiIpOgogICAgICAgIHN1YnByb2Nlc3MucnVuKFsndGFyJywgJ3h6dmYnLCAnY29udHJvbC50YXIuZ3onLCAnLUMnLCAnREVCSUFOJ10sIGNoZWNrPUZhbHNlKQoKICAgIGlmIG9zLnBhdGguZXhpc3RzKCJkYXRhLnRhci54eiIpOgogICAgICAgIHN1YnByb2Nlc3MucnVuKFsndGFyJywgJ3hKdmYnLCAnZGF0YS50YXIueHonXSwgY2hlY2s9RmFsc2UpCiAgICBlbGlmIG9zLnBhdGguZXhpc3RzKCJkYXRhLnRhci5neiIpOgogICAgICAgIHN1YnByb2Nlc3MucnVuKFsndGFyJywgJ3h6dmYnLCAnZGF0YS50YXIuZ3onXSwgY2hlY2s9RmFsc2UpCgogICAgZm9yIGYgaW4gWydkYXRhLnRhci54eicsICdkYXRhLnRhci5neicsICdjb250cm9sLnRhci54eicsICdjb250cm9sLnRhci5neicsICdkZWJpYW4tYmluYXJ5JywgZiIuLi97ZGViX2ZpbGV9Il06CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgIG9zLnJlbW92ZShmKQoKICAgIHByaW50KGYiWytdIERlYiBleHRyYWN0ZWQgdG86IHtvcy5wYXRoLmFic3BhdGgoZXh0cmFjdF9kaXIpfSIpCiAgICBwcmludCgiWytdIFlvdSBjYW4gbm93IGVkaXQgdGhlIGZpbGVzIikKICAgIHByaW50KCJbK10gVG8gcmVidWlsZDogZHBrZy1kZWIgLS1idWlsZCAuIikKCmRlZiB1cGRhdGVfYmluYXJ5X2Zyb21fZGViKCk6CiAgICAiIiJVcGRhdGUgYmluYXJ5IGluIGV4dHJhY3RlZCBkZWIiIiIKICAgIGN1cnJlbnRfZGlyID0gb3MuZ2V0Y3dkKCkKCiAgICBpZiBvcy5wYXRoLmV4aXN0cygiREVCSUFOIikgYW5kIG9zLnBhdGguZXhpc3RzKCJERUJJQU4vY29udHJvbCIpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCJ1c3IvbG9jYWwvYmluIik6CiAgICAgICAgICAgIGJpbl9maWxlcyA9IG9zLmxpc3RkaXIoInVzci9sb2NhbC9iaW4iKQogICAgICAgICAgICBmb3IgYmluX2ZpbGUgaW4gYmluX2ZpbGVzOgogICAgICAgICAgICAgICAgc3JjX2JpbiA9IGYiL3Vzci9sb2NhbC9iaW4ve2Jpbl9maWxlfSIKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNyY19iaW4pOgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihzcmNfYmluLCBmInVzci9sb2NhbC9iaW4ve2Jpbl9maWxlfSIpCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoZiJbK10gVXBkYXRlZDoge2Jpbl9maWxlfSIpCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cygiZGF0YS9kYXRhL2NvbS50ZXJtdXgvZmlsZXMvdXNyL2JpbiIpOgogICAgICAgICAgICBiaW5fZmlsZXMgPSBvcy5saXN0ZGlyKCJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluIikKICAgICAgICAgICAgZm9yIGJpbl9maWxlIGluIGJpbl9maWxlczoKICAgICAgICAgICAgICAgIHNyY19iaW4gPSBmIi91c3IvbG9jYWwvYmluL3tiaW5fZmlsZX0iCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzcmNfYmluKToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoc3JjX2JpbiwgZiJkYXRhL2RhdGEvY29tLnRlcm11eC9maWxlcy91c3IvYmluL3tiaW5fZmlsZX0iKQogICAgICAgICAgICAgICAgICAgIHByaW50KGYiWytdIFVwZGF0ZWQ6IHtiaW5fZmlsZX0iKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHByaW50KCJObyBiaW5hcnkgZGlyZWN0b3J5IGZvdW5kIikKICAgIGVsc2U6CiAgICAgICAgcHJpbnQoIk5vdCBpbiBhbiBleHRyYWN0ZWQgZGViIGRpcmVjdG9yeS4gUnVuICdyZXBvLW1hbmFnZXIgLS1lZGl0LWRlYiBmaWxlLmRlYicgZmlyc3QiKQoKZGVmIHNob3dfaGVscCgpOgogICAgIiIiTWVuYW1waWxrYW4gaGVscCBzY3JlZW4iIiIKICAgIGhlbHBfdGV4dCA9ICIiIgpbK10gUmVwb3NpdG9yeSBNYW5hZ2VyIGJ5IEFyaWUtU1I5MQpbIV0gR290byB5b3VyIHJlcG9zaXRvcnkgZm9sZGVyIGFuZCBydW4gdGhlIGNvbW1hbmQKClVzYWdlOiByZXBvLW1hbmFnZXIgW29wdGlvbnNdCgpPcHRpb25zOgogICAgLXMsIC0tc291cmNlICAgICAgICAgICAgICAgICAgOiBidWlsZCBzb3VyY2Ugb2YgZGViCiAgICAtZCwgLS1kZWIgICAgICAgICAgICAgICAgICAgICA6IGJ1aWxkIGRlYiBmcm9tIHNvdXJjZQogICAgLXIsIC0tcmVwbyAgICAgICAgICAgICAgICAgICAgOiBidWlsZCByZXBvc2l0b3J5IHRyZWUKICAgIC1wLCAtLXB1c2ggICAgICAgICAgICAgICAgICAgIDogcHVzaCByZXBvc2l0b3J5IHRvIGdpdGh1YgogICAgLXUsIC0tdXBkYXRlICAgICAgICAgICAgICAgICAgOiB1cGRhdGUgc291cmNlIHBhY2thZ2UKICAgIC1lLCAtLWVkaXQtZGViIDxmaWxlPiAgICAgICAgIDogZWRpdCBleGlzdGluZyBkZWIgZmlsZQogICAgLWIsIC0tdXBkYXRlLWJpbiAgICAgICAgICAgICAgOiB1cGRhdGUgYmluYXJ5IGluIGV4dHJhY3RlZCBkZWIKICAgIC1nLCAtLWd1aSAgICAgICAgICAgICAgICAgICAgIDogR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlCiAgICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgICAgICA6IHNob3cgdGhpcyBoZWxwIHNjcmVlbgogICAgLXYsIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgOiBzaG93IHRoZSB2ZXJzaW9uCgpmb3IgbW9yZSBpbmZvIHZpc2l0OiBodHRwczovL2dpdGh1Yi5jb20vQXJpZVNSOTEvdXNlcjkxLXJlcG8KIiIiCiAgICBwcmludChoZWxwX3RleHQpCgpkZWYgc2hvd192ZXJzaW9uKCk6CiAgICAiIiJNZW5hbXBpbGthbiB2ZXJzaSIiIgogICAgcHJpbnQoIjIuMS44LVNSIikKCmRlZiBtYWluKCk6CiAgICBlbnN1cmVfZGlyZWN0b3JpZXMoKQoKICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgogICAgICAgIHNob3dfaGVscCgpCiAgICAgICAgcmV0dXJuCgogICAgb3B0aW9uID0gc3lzLmFyZ3ZbMV0KCiAgICBpZiBvcHRpb24gaW4gWyctcycsICctLXNvdXJjZSddOgogICAgICAgIGJ1aWxkX3NvdXJjZSgpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy1kJywgJy0tZGViJ106CiAgICAgICAgYnVpbGRfZGViKCkKICAgIGVsaWYgb3B0aW9uIGluIFsnLXInLCAnLS1yZXBvJ106CiAgICAgICAgYnVpbGRfcmVwb3NpdG9yeSgpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy1wJywgJy0tcHVzaCddOgogICAgICAgIHB1c2hfcmVwb3NpdG9yeSgpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy11JywgJy0tdXBkYXRlJ106CiAgICAgICAgdXBkYXRlX3NvdXJjZSgpCiAgICBlbGlmIG9wdGlvbiBpbiBbJy1lJywgJy0tZWRpdC1kZWInXToKICAgICAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMjoKICAgICAgICAgICAgZWRpdF9kZWIoc3lzLmFyZ3ZbMl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoIlBsZWFzZSBzcGVjaWZ5IGEgZGViIGZpbGUiKQogICAgICAgICAgICBwcmludCgiVXNhZ2U6IHJlcG8tbWFuYWdlciAtLWVkaXQtZGViIDxmaWxlLmRlYj4iKQogICAgZWxpZiBvcHRpb24gaW4gWyctYicsICctLXVwZGF0ZS1iaW4nXToKICAgICAgICB1cGRhdGVfYmluYXJ5X2Zyb21fZGViKCkKICAgIGVsaWYgb3B0aW9uIGluIFsnLXYnLCAnLS12ZXJzaW9uJ106CiAgICAgICAgc2hvd192ZXJzaW9uKCkKICAgIGVsaWYgb3B0aW9uIGluIFsnLWcnLCAnLS1ndWknXToKICAgICAgICBzdWJwcm9jZXNzLnJ1bihbInJlcG8tbWFuYWdlci1tZW51IiwgIi0tZ3VpIl0pCiAgICBlbHNlOgogICAgICAgIHNob3dfaGVscCgpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdHJ5OgogICAgICAgIG1haW4oKQogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIHByaW50KCJcblshXSBQcm9ncmFtIGNhbmNlbGVkLiIpCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgcHJpbnQoZiJcblshXSBFcnJvcjoge2V9IikK"

try:
    _decoded = base64.b64decode(_DATA)
    exec(_decoded)
except Exception as _e:
    print(f"Error: {_e}")
    sys.exit(1)
