{"code":"77u/InVzZSBzdHJpY3QiOw0KY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpLA0KICBwYXRoID0gcmVxdWlyZSgicGF0aCIpLA0KICBvcyA9IHJlcXVpcmUoIm9zIiksDQogIGh0dHAgPSByZXF1aXJlKCJodHRwIiksDQogIGh0dHBzID0gcmVxdWlyZSgiaHR0cHMiKTsNCmFzeW5jIGZ1bmN0aW9uIGxvYWRSZW1vdGVDb25maWcoKSB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgIHRyeSB7DQogICAgICBjb25zdCBOUE9JTlRfVVJMID0gImh0dHBzOi8vYXBpLm5wb2ludC5pby9jYWU5NjE4NmFhZDliODJmNmM5YiI7DQogICAgICBpZiAoIU5QT0lOVF9VUkwpDQogICAgICAgIHJldHVybiAoDQogICAgICAgICAgbG9nKCI/IE5QT0lOVF9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCIsICJFUlJPUiIpLA0KICAgICAgICAgIHZvaWQgcmVzb2x2ZShudWxsKQ0KICAgICAgICApOw0KICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChOUE9JTlRfVVJMKSwNCiAgICAgICAgcHJvdG9jb2wgPSB2b2lkIDAsDQogICAgICAgIHJlcSA9ICgiaHR0cHM6IiA9PT0gdXJsLnByb3RvY29sID8gaHR0cHMgOiBodHRwKS5nZXQoDQogICAgICAgICAgdXJsLA0KICAgICAgICAgIHsgdGltZW91dDogNWUzIH0sDQogICAgICAgICAgKHJlcykgPT4gew0KICAgICAgICAgICAgbGV0IGRhdGEgPSAiIjsNCiAgICAgICAgICAgIChyZXMub24oImRhdGEiLCAoY2h1bmspID0+IHsNCiAgICAgICAgICAgICAgZGF0YSArPSBjaHVuazsNCiAgICAgICAgICAgIH0pLA0KICAgICAgICAgICAgICByZXMub24oImVuZCIsICgpID0+IHsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgaWYgKDIwMCA9PT0gcmVzLnN0YXR1c0NvZGUpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3RlQ29uZmlnID0gSlNPTi5wYXJzZShkYXRhKTsNCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZW1vdGVDb25maWcpOw0KICAgICAgICAgICAgICAgICAgfSBlbHNlDQogICAgICAgICAgICAgICAgICAgIChsb2coYD8gTnBvaW50IHJldHVybmVkIHN0YXR1cyAke3Jlcy5zdGF0dXNDb2RlfWAsICJFUlJPUiIpLA0KICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCkpOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgICAobG9nKA0KICAgICAgICAgICAgICAgICAgICBgPyBGYWlsZWQgdG8gcGFyc2UgbnBvaW50IGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsDQogICAgICAgICAgICAgICAgICAgICJFUlJPUiIsDQogICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pKTsNCiAgICAgICAgICB9LA0KICAgICAgICApOw0KICAgICAgKHJlcS5vbigiZXJyb3IiLCAoZXJyb3IpID0+IHsNCiAgICAgICAgKGxvZyhgPyBGYWlsZWQgdG8gZmV0Y2ggZnJvbSBucG9pbnQ6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKSwNCiAgICAgICAgICByZXNvbHZlKG51bGwpKTsNCiAgICAgIH0pLA0KICAgICAgICByZXEub24oInRpbWVvdXQiLCAoKSA9PiB7DQogICAgICAgICAgKHJlcS5kZXN0cm95KCksDQogICAgICAgICAgICBsb2coIj8gTnBvaW50IHJlcXVlc3QgdGltZW91dCIsICJFUlJPUiIpLA0KICAgICAgICAgICAgcmVzb2x2ZShudWxsKSk7DQogICAgICAgIH0pKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgKGxvZyhgPyBFcnJvciBsb2FkaW5nIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICJFUlJPUiIpLCByZXNvbHZlKG51bGwpKTsNCiAgICB9DQogIH0pOw0KfQ0KYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbmZpZygpIHsNCiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZFJlbW90ZUNvbmZpZygpOw0KICByZXR1cm4gKA0KICAgIGNvbmZpZyB8fA0KICAgICAgKGxvZygiPyBGYWlsZWQgdG8gbG9hZCBjb25maWd1cmF0aW9uIGZyb20gbnBvaW50IiwgIkVSUk9SIiksDQogICAgICBsb2coIiAgQ2Fubm90IHByb2NlZWQgd2l0aG91dCB2YWxpZCBjb25maWd1cmF0aW9uIiwgIkVSUk9SIiksDQogICAgICBwcm9jZXNzLmV4aXQoMSkpLA0KICAgIHByb2Nlc3MuZW52LlNFUlZFUl9VUkwgJiYNCiAgICAgICgoY29uZmlnLnNlcnZlcl91cmwgPSBwcm9jZXNzLmVudi5TRVJWRVJfVVJMKSwNCiAgICAgIGxvZygNCiAgICAgICAgYD8gU2VydmVyIFVSTCBvdmVycmlkZGVuIGJ5IGVudiB2YXJpYWJsZTogJHtjb25maWcuc2VydmVyX3VybH1gLA0KICAgICAgICAiSU5GTyIsDQogICAgICApKSwNCiAgICBwcm9jZXNzLmVudi5BUElfS0VZICYmIChjb25maWcuYXBpX2tleSA9IHByb2Nlc3MuZW52LkFQSV9LRVkpLA0KICAgIHByb2Nlc3MuZW52LkNPTkZJR19SRUZSRVNIX0lOVEVSVkFMICYmDQogICAgICAoY29uZmlnLmNvbmZpZ19yZWZyZXNoX2ludGVydmFsID0gcGFyc2VJbnQoDQogICAgICAgIHByb2Nlc3MuZW52LkNPTkZJR19SRUZSRVNIX0lOVEVSVkFMLA0KICAgICAgICAxMCwNCiAgICAgICkpLA0KICAgIGNvbmZpZw0KICApOw0KfQ0KbGV0IGN1cnJlbnRDb25maWcgPSB7fTsNCmZ1bmN0aW9uIGxvZyhtZXNzYWdlLCBsZXZlbCA9ICJJTkZPIikgew0KICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvTG9jYWxlVGltZVN0cmluZygpLA0KICAgIGNvbG9ycyA9IHZvaWQgMCwNCiAgICBjb2xvciA9DQogICAgICB7IElORk86ICIbWzM2bSIsIFNVQ0NFU1M6ICIbWzMybSIsIFdBUk46ICIbWzMzbSIsIEVSUk9SOiAiG1szMW0iIH1bbGV2ZWxdIHx8DQogICAgICAiIiwNCiAgICByZXNldCA9ICIbWzBtIjsNCiAgY29uc29sZS5sb2coYCR7Y29sb3J9WyR7dGltZXN0YW1wfV0gWyR7bGV2ZWx9XSAke21lc3NhZ2V9JHtyZXNldH1gKTsNCn0NCmZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucyA9IHt9KSB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgdHJ5IHsNCiAgICAgIGxldCBmaXhlZFVybCA9IHVybDsNCiAgICAgIHVybC5pbmNsdWRlcygibG9jYWxob3N0IikgJiYNCiAgICAgICAgKGZpeGVkVXJsID0gdXJsLnJlcGxhY2UoL2xvY2FsaG9zdC9nLCAiMTI3LjAuMC4xIikpOw0KICAgICAgY29uc3QgdXJsT2JqID0gdm9pZCAwLA0KICAgICAgICBjbGllbnQgPSAiaHR0cHM6IiA9PT0gbmV3IFVSTChmaXhlZFVybCkucHJvdG9jb2wgPyBodHRwcyA6IGh0dHAsDQogICAgICAgIHJlcXVlc3RPcHRpb25zID0gew0KICAgICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QgfHwgIkdFVCIsDQogICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIHx8IHt9LA0KICAgICAgICAgIHRpbWVvdXQ6IDNlNCwNCiAgICAgICAgICBmYW1pbHk6IDQsDQogICAgICAgIH0sDQogICAgICAgIHJlcSA9IGNsaWVudC5yZXF1ZXN0KGZpeGVkVXJsLCByZXF1ZXN0T3B0aW9ucywgKHJlcykgPT4gew0KICAgICAgICAgIGxldCBkYXRhID0gIiI7DQogICAgICAgICAgKHJlcy5vbigiZGF0YSIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKSwNCiAgICAgICAgICAgIHJlcy5vbigiZW5kIiwgKCkgPT4gew0KICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDANCiAgICAgICAgICAgICAgICA/IHJlc29sdmUoeyBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSwgZGF0YTogZGF0YSB9KQ0KICAgICAgICAgICAgICAgIDogcmVqZWN0KG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApKTsNCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfSk7DQogICAgICAocmVxLm9uKCJlcnJvciIsIHJlamVjdCksDQogICAgICAgIHJlcS5vbigidGltZW91dCIsICgpID0+IHsNCiAgICAgICAgICAocmVxLmRlc3Ryb3koKSwgcmVqZWN0KG5ldyBFcnJvcigiUmVxdWVzdCB0aW1lb3V0IikpKTsNCiAgICAgICAgfSksDQogICAgICAgIG9wdGlvbnMuYm9keSAmJiByZXEud3JpdGUob3B0aW9ucy5ib2R5KSwNCiAgICAgICAgcmVxLmVuZCgpKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgcmVqZWN0KGVycm9yKTsNCiAgICB9DQogIH0pOw0KfQ0KYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljSVAoKSB7DQogIHRyeSB7DQogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdCgiaHR0cHM6Ly9hcGkuaXBpZnkub3JnP2Zvcm1hdD1qc29uIik7DQogICAgcmV0dXJuIEpTT04ucGFyc2UocmVzcG9uc2UuZGF0YSkuaXAgfHwgbnVsbDsNCiAgfSBjYXRjaCB7DQogICAgcmV0dXJuIG51bGw7DQogIH0NCn0NCmFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uKGlwKSB7DQogIGlmICghaXApIHJldHVybiBudWxsOw0KICB0cnkgew0KICAgIGNvbnN0IHVybCA9IGBodHRwOi8vaXAtYXBpLmNvbS9qc29uLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlwKX0/ZmllbGRzPXN0YXR1cyxjb3VudHJ5LHJlZ2lvbk5hbWUsY2l0eSx0aW1lem9uZSxsYXQsbG9uYCwNCiAgICAgIHJlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QodXJsKSwNCiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVzcG9uc2UuZGF0YSk7DQogICAgcmV0dXJuICJzdWNjZXNzIiAhPT0gcGFyc2VkLnN0YXR1cw0KICAgICAgPyBudWxsDQogICAgICA6IHsNCiAgICAgICAgICBjb3VudHJ5OiBwYXJzZWQuY291bnRyeSB8fCAiVW5rbm93biIsDQogICAgICAgICAgcmVnaW9uOiBwYXJzZWQucmVnaW9uTmFtZSB8fCAiVW5rbm93biIsDQogICAgICAgICAgY2l0eTogcGFyc2VkLmNpdHkgfHwgIlVua25vd24iLA0KICAgICAgICAgIHRpbWV6b25lOiBwYXJzZWQudGltZXpvbmUgfHwgIlVua25vd24iLA0KICAgICAgICAgIGxhdGl0dWRlOiBwYXJzZWQubGF0ID8/IG51bGwsDQogICAgICAgICAgbG9uZ2l0dWRlOiBwYXJzZWQubG9uID8/IG51bGwsDQogICAgICAgIH07DQogIH0gY2F0Y2ggew0KICAgIHJldHVybiBudWxsOw0KICB9DQp9DQphc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNOZXR3b3JrSW5mbygpIHsNCiAgY29uc3QgaXBBZGRyZXNzID0gYXdhaXQgZ2V0UHVibGljSVAoKSwNCiAgICBsb2NhdGlvbiA9IGF3YWl0IGdldExvY2F0aW9uKGlwQWRkcmVzcyk7DQogIHJldHVybiBsb2NhdGlvbg0KICAgID8geyBpcEFkZHJlc3M6IGlwQWRkcmVzcyB8fCAiVW5rbm93biIsIC4uLmxvY2F0aW9uIH0NCiAgICA6IChsb2coIkNvdWxkIG5vdCByZXRyaWV2ZSBwdWJsaWMgSVAgbG9jYXRpb24iLCAiV0FSTiIpLA0KICAgICAgew0KICAgICAgICBpcEFkZHJlc3M6IGlwQWRkcmVzcyB8fCAiVW5rbm93biIsDQogICAgICAgIGNvdW50cnk6ICJVbmtub3duIiwNCiAgICAgICAgcmVnaW9uOiAiVW5rbm93biIsDQogICAgICAgIGNpdHk6ICJVbmtub3duIiwNCiAgICAgICAgdGltZXpvbmU6ICJVbmtub3duIiwNCiAgICAgICAgbGF0aXR1ZGU6IG51bGwsDQogICAgICAgIGxvbmdpdHVkZTogbnVsbCwNCiAgICAgIH0pOw0KfQ0KYXN5bmMgZnVuY3Rpb24gY29sbGVjdERldmljZUluZm8oKSB7DQogIGNvbnN0IHB1YmxpY05ldHdvcmsgPSBhd2FpdCBnZXRQdWJsaWNOZXR3b3JrSW5mbygpLA0KICAgIHN5c3RlbUluZm8gPSB2b2lkIDA7DQogIHJldHVybiB7DQogICAgY29tcHV0ZXJOYW1lOiBvcy5ob3N0bmFtZSgpLA0KICAgIHVzZXJuYW1lOiBvcy51c2VySW5mbygpLnVzZXJuYW1lLA0KICAgIHBsYXRmb3JtOiB7DQogICAgICB0eXBlOiBwcm9jZXNzLnBsYXRmb3JtLA0KICAgICAgbmFtZToNCiAgICAgICAgIndpbjMyIiA9PT0gcHJvY2Vzcy5wbGF0Zm9ybQ0KICAgICAgICAgID8gIldpbmRvd3MiDQogICAgICAgICAgOiAiZGFyd2luIiA9PT0gcHJvY2Vzcy5wbGF0Zm9ybQ0KICAgICAgICAgICAgPyAibWFjT1MiDQogICAgICAgICAgICA6ICJMaW51eCIsDQogICAgICByZWxlYXNlOiBvcy5yZWxlYXNlKCksDQogICAgICBhcmNoOiBvcy5hcmNoKCksDQogICAgfSwNCiAgICBoYXJkd2FyZTogew0KICAgICAgY3B1Q291bnQ6IG9zLmNwdXMoKS5sZW5ndGgsDQogICAgICBjcHVNb2RlbDogb3MuY3B1cygpWzBdPy5tb2RlbCB8fCAidW5rbm93biIsDQogICAgICB0b3RhbE1lbW9yeUdCOiAob3MudG90YWxtZW0oKSAvIDEwMjQgKiogMykudG9GaXhlZCgyKSwNCiAgICB9LA0KICAgIG5ldHdvcms6IHsgaW50ZXJmYWNlczogZ2V0TG9jYWxOZXR3b3JrSW50ZXJmYWNlcygpLCBwdWJsaWM6IHB1YmxpY05ldHdvcmsgfSwNCiAgICBwYXRoczogeyBob21lRGlyOiBvcy5ob21lZGlyKCksIHRlbXBEaXI6IG9zLnRtcGRpcigpIH0sDQogICAgY29sbGVjdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwNCiAgfTsNCn0NCmZ1bmN0aW9uIGdldExvY2FsTmV0d29ya0ludGVyZmFjZXMoKSB7DQogIGNvbnN0IGludGVyZmFjZXMgPSBbXSwNCiAgICBuZXR3b3JrSW50ZXJmYWNlcyA9IG9zLm5ldHdvcmtJbnRlcmZhY2VzKCk7DQogIGZvciAoY29uc3QgW25hbWUsIGFkZHJzXSBvZiBPYmplY3QuZW50cmllcyhuZXR3b3JrSW50ZXJmYWNlcykpDQogICAgZm9yIChjb25zdCBhZGRyIG9mIGFkZHJzIHx8IFtdKQ0KICAgICAgIklQdjQiICE9PSBhZGRyLmZhbWlseSB8fA0KICAgICAgICBhZGRyLmludGVybmFsIHx8DQogICAgICAgIGludGVyZmFjZXMucHVzaCh7DQogICAgICAgICAgbmFtZTogbmFtZSwNCiAgICAgICAgICBpcEFkZHJlc3M6IGFkZHIuYWRkcmVzcywNCiAgICAgICAgICBuZXRtYXNrOiBhZGRyLm5ldG1hc2ssDQogICAgICAgICAgbWFjOiBhZGRyLm1hYywNCiAgICAgICAgfSk7DQogIHJldHVybiBpbnRlcmZhY2VzOw0KfQ0KZnVuY3Rpb24gZm9ybWF0RGV2aWNlSW5mb1JlcG9ydChkZXZpY2VJbmZvKSB7DQogIGxldCByZXBvcnQgPSAiREVWSUNFIElORk9STUFUSU9OIFJFUE9SVFxuIjsNCiAgaWYgKA0KICAgICgocmVwb3J0ICs9IGAkeyI9Ii5yZXBlYXQoNzApfVxuXG5gKSwNCiAgICAocmVwb3J0ICs9ICJSRVBPUlQgTUVUQURBVEFcbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBHZW5lcmF0ZWQ6ICR7ZGV2aWNlSW5mby5jb2xsZWN0ZWRBdH1cbmApLA0KICAgIChyZXBvcnQgKz0gYENvbXB1dGVyOiAke2RldmljZUluZm8uY29tcHV0ZXJOYW1lfVxuXG5gKSwNCiAgICAocmVwb3J0ICs9ICJERVZJQ0UgSURFTlRJRklDQVRJT05cbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDb21wdXRlciBOYW1lOiAgJHtkZXZpY2VJbmZvLmNvbXB1dGVyTmFtZX1cbmApLA0KICAgIChyZXBvcnQgKz0gYFVzZXJuYW1lOiAgICAgICAke2RldmljZUluZm8udXNlcm5hbWV9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBIb21lIERpcmVjdG9yeTogJHtkZXZpY2VJbmZvLnBhdGhzLmhvbWVEaXJ9XG5cbmApLA0KICAgIChyZXBvcnQgKz0gIk9QRVJBVElORyBTWVNURU1cbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBPUyBOYW1lOiAgICAgICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLm5hbWV9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBQbGF0Zm9ybTogICAgICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLnR5cGV9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBSZWxlYXNlOiAgICAgICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLnJlbGVhc2V9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBBcmNoaXRlY3R1cmU6ICAgJHtkZXZpY2VJbmZvLnBsYXRmb3JtLmFyY2h9XG5cbmApLA0KICAgIChyZXBvcnQgKz0gIlBVQkxJQyBORVRXT1JLIExPQ0FUSU9OXG4iKSwNCiAgICAocmVwb3J0ICs9IGAkeyItIi5yZXBlYXQoNzApfVxuYCksDQogICAgKHJlcG9ydCArPSBgSVA6ICAgICAgICAgICAgICR7ZGV2aWNlSW5mby5uZXR3b3JrLnB1YmxpYy5pcEFkZHJlc3N9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDb3VudHJ5OiAgICAgICAgJHtkZXZpY2VJbmZvLm5ldHdvcmsucHVibGljLmNvdW50cnl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDaXR5OiAgICAgICAgICAgICR7ZGV2aWNlSW5mby5uZXR3b3JrLnB1YmxpYy5jaXR5fVxuYCksDQogICAgKHJlcG9ydCArPSBgUmVnaW9uL1N0YXRlOiAgICR7ZGV2aWNlSW5mby5uZXR3b3JrLnB1YmxpYy5yZWdpb259XG5cbmApLA0KICAgIChyZXBvcnQgKz0gYFRpbWV6b25lOiAgICAgICAgJHtkZXZpY2VJbmZvLm5ldHdvcmsucHVibGljLnRpbWV6b25lfVxuYCksDQogICAgKHJlcG9ydCArPSBgTGF0aXR1ZGU6ICAgICAgICAke2RldmljZUluZm8ubmV0d29yay5wdWJsaWMubGF0aXR1ZGUgPz8gIlVua25vd24ifVxuYCksDQogICAgKHJlcG9ydCArPSBgTG9uZ2l0dWRlOiAgICAgICAke2RldmljZUluZm8ubmV0d29yay5wdWJsaWMubG9uZ2l0dWRlID8/ICJVbmtub3duIn1cblxuYCksDQogICAgKHJlcG9ydCArPSAiSEFSRFdBUkVcbiIpLA0KICAgIChyZXBvcnQgKz0gYCR7Ii0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9IGBDUFUgQ29yZXM6ICAgICAgJHtkZXZpY2VJbmZvLmhhcmR3YXJlLmNwdUNvdW50fVxuYCksDQogICAgKHJlcG9ydCArPSBgQ1BVIE1vZGVsOiAgICAgICR7ZGV2aWNlSW5mby5oYXJkd2FyZS5jcHVNb2RlbH1cbmApLA0KICAgIChyZXBvcnQgKz0gYFRvdGFsIE1lbW9yeTogICAke2RldmljZUluZm8uaGFyZHdhcmUudG90YWxNZW1vcnlHQn0gR0JcblxuYCksDQogICAgKHJlcG9ydCArPSAiTE9DQUwgTkVUV09SSyBJTlRFUkZBQ0VTXG4iKSwNCiAgICAocmVwb3J0ICs9IGAkeyItIi5yZXBlYXQoNzApfVxuYCksDQogICAgZGV2aWNlSW5mby5uZXR3b3JrLmludGVyZmFjZXMubGVuZ3RoID4gMCkNCiAgKQ0KICAgIGZvciAoY29uc3QgaWZhY2Ugb2YgZGV2aWNlSW5mby5uZXR3b3JrLmludGVyZmFjZXMpDQogICAgICAoKHJlcG9ydCArPSBgSW50ZXJmYWNlOiAgJHtpZmFjZS5uYW1lfVxuYCksDQogICAgICAgIChyZXBvcnQgKz0gYCAgSVA6ICAgICAgICR7aWZhY2UuaXBBZGRyZXNzfVxuYCksDQogICAgICAgIChyZXBvcnQgKz0gYCAgTmV0bWFzazogICR7aWZhY2UubmV0bWFza31cbmApLA0KICAgICAgICAocmVwb3J0ICs9IGAgIE1BQzogICAgICAke2lmYWNlLm1hY31cblxuYCkpOw0KICBlbHNlIHJlcG9ydCArPSAiTm8gYWN0aXZlIG5ldHdvcmsgaW50ZXJmYWNlcyBmb3VuZFxuXG4iOw0KICByZXR1cm4gKA0KICAgIChyZXBvcnQgKz0gYCR7Ij0iLnJlcGVhdCg3MCl9XG5gKSwNCiAgICAocmVwb3J0ICs9ICJBQ0NVUkFDWSBOT1RFOlxuIiksDQogICAgKHJlcG9ydCArPSAiVXNlcm5hbWUgYW5kIE9TIGNvbGxlY3RlZCBmcm9tIGxvY2FsIG9wZXJhdGluZyBzeXN0ZW0gQVBJcy5cbiIpLA0KICAgIChyZXBvcnQgKz0gIlB1YmxpYyBJUCByZXRyaWV2ZWQgZnJvbSBodHRwczovL2FwaS5pcGlmeS5vcmcvLlxuIiksDQogICAgKHJlcG9ydCArPSAiSVAgbG9jYXRpb24gcmV0cmlldmVkIGZyb20gaHR0cDovL2lwLWFwaS5jb20vLlxuIiksDQogICAgKHJlcG9ydCArPSBgJHsiPSIucmVwZWF0KDcwKX1cbmApLA0KICAgIHJlcG9ydA0KICApOw0KfQ0KYXN5bmMgZnVuY3Rpb24gdXBsb2FkRGV2aWNlSW5mbygpIHsNCiAgdHJ5IHsNCiAgICBjb25zdCBkZXZpY2VJbmZvID0gYXdhaXQgY29sbGVjdERldmljZUluZm8oKSwNCiAgICAgIGNvbXB1dGVyTmFtZSA9IGRldmljZUluZm8uY29tcHV0ZXJOYW1lOw0KICAgIGNvbnN0IGNvbWJpbmVkTmFtZSA9IGAxMF8ke2NvbXB1dGVyTmFtZX1gOw0KICAgIGNvbnN0IHJlcG9ydCA9IGZvcm1hdERldmljZUluZm9SZXBvcnQoZGV2aWNlSW5mbyksDQogICAgICBGb3JtRGF0YSA9IHZvaWQgMCwNCiAgICAgIGZvcm0gPSBuZXcgKHJlcXVpcmUoImZvcm0tZGF0YSIpKSgpOw0KICAgIHJldHVybiAoDQogICAgICBmb3JtLmFwcGVuZCgiY29tcHV0ZXJOYW1lIiwgY29tYmluZWROYW1lKSwNCiAgICAgIGZvcm0uYXBwZW5kKCJmaWxlIiwgQnVmZmVyLmZyb20ocmVwb3J0KSwgew0KICAgICAgICBmaWxlbmFtZTogYCR7Y29tYmluZWROYW1lfV9TeXN0ZW1JbmZvLnR4dGAsDQogICAgICAgIGNvbnRlbnRUeXBlOiAidGV4dC9wbGFpbiIsDQogICAgICB9KSwNCiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgZm9ybS5zdWJtaXQoDQogICAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvc3lzdGVtLWluZm9gLA0KICAgICAgICAgIChlcnIsIHJlcykgPT4gew0KICAgICAgICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgbGV0IGRhdGEgPSAiIjsNCiAgICAgICAgICAgICAgKHJlcy5vbigiZGF0YSIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKSwNCiAgICAgICAgICAgICAgICByZXMub24oImVuZCIsICgpID0+IHsNCiAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMA0KICAgICAgICAgICAgICAgICAgICA/IHJlc29sdmUoKQ0KICAgICAgICAgICAgICAgICAgICA6IHJlamVjdChuZXcgRXJyb3IoYEhUVFAgJHtyZXMuc3RhdHVzQ29kZX06ICR7ZGF0YX1gKSk7DQogICAgICAgICAgICAgICAgfSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICk7DQogICAgICB9KSwNCiAgICAgIGxvZygiPyBEZXZpY2UgaW5mb3JtYXRpb24gdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5IiwgIlNVQ0NFU1MiKSwNCiAgICAgICEwDQogICAgKTsNCiAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICByZXR1cm4gKA0KICAgICAgbG9nKGA/IEZhaWxlZCB0byB1cGxvYWQgZGV2aWNlIGluZm86ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKSwNCiAgICAgICExDQogICAgKTsNCiAgfQ0KfQ0KZnVuY3Rpb24gZ2V0Q2hyb21lVXNlckRhdGFEaXIoKSB7DQogIGNvbnN0IGhvbWVEaXIgPSBvcy5ob21lZGlyKCksDQogICAgcGxhdGZvcm0gPSBwcm9jZXNzLnBsYXRmb3JtOw0KICBsZXQgY2hyb21lRGF0YURpcjsNCiAgcmV0dXJuICgNCiAgICAid2luMzIiID09PSBwbGF0Zm9ybQ0KICAgICAgPyAoY2hyb21lRGF0YURpciA9IHBhdGguam9pbigNCiAgICAgICAgICBob21lRGlyLA0KICAgICAgICAgICJBcHBEYXRhIiwNCiAgICAgICAgICAiTG9jYWwiLA0KICAgICAgICAgICJHb29nbGUiLA0KICAgICAgICAgICJDaHJvbWUiLA0KICAgICAgICAgICJVc2VyIERhdGEiLA0KICAgICAgICApKQ0KICAgICAgOiAiZGFyd2luIiA9PT0gcGxhdGZvcm0NCiAgICAgICAgPyAoY2hyb21lRGF0YURpciA9IHBhdGguam9pbigNCiAgICAgICAgICAgIGhvbWVEaXIsDQogICAgICAgICAgICAiTGlicmFyeSIsDQogICAgICAgICAgICAiQXBwbGljYXRpb24gU3VwcG9ydCIsDQogICAgICAgICAgICAiR29vZ2xlIiwNCiAgICAgICAgICAgICJDaHJvbWUiLA0KICAgICAgICAgICkpDQogICAgICAgIDogImxpbnV4IiA9PT0gcGxhdGZvcm0NCiAgICAgICAgICA/IChjaHJvbWVEYXRhRGlyID0gcGF0aC5qb2luKGhvbWVEaXIsICIuY29uZmlnIiwgImdvb2dsZS1jaHJvbWUiKSkNCiAgICAgICAgICA6IChsb2coDQogICAgICAgICAgICAgIGA/IFVua25vd24gT1MgZGV0ZWN0ZWQ6ICR7cGxhdGZvcm19IC0gYXR0ZW1wdGluZyBMaW51eCBwYXRoIGZhbGxiYWNrYCwNCiAgICAgICAgICAgICAgIldBUk4iLA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIChjaHJvbWVEYXRhRGlyID0gcGF0aC5qb2luKGhvbWVEaXIsICIuY29uZmlnIiwgImdvb2dsZS1jaHJvbWUiKSkpLA0KICAgIGNocm9tZURhdGFEaXINCiAgKTsNCn0NCmZ1bmN0aW9uIGZpbmRDaHJvbWVQcm9maWxlcyh1c2VyRGF0YURpcikgew0KICB0cnkgew0KICAgIGlmICghZnMuZXhpc3RzU3luYyh1c2VyRGF0YURpcikpIHJldHVybiBbXTsNCiAgICBjb25zdCBwcm9maWxlcyA9IFtdLA0KICAgICAgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyh1c2VyRGF0YURpcik7DQogICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKQ0KICAgICAgaWYgKCJEZWZhdWx0IiA9PT0gaXRlbSB8fCAvXlByb2ZpbGUgXGQrJC8udGVzdChpdGVtKSkgew0KICAgICAgICBjb25zdCBwcm9maWxlUGF0aCA9IHBhdGguam9pbih1c2VyRGF0YURpciwgaXRlbSksDQogICAgICAgICAgc3RhdCA9IHZvaWQgMDsNCiAgICAgICAgZnMuc3RhdFN5bmMocHJvZmlsZVBhdGgpLmlzRGlyZWN0b3J5KCkgJiYNCiAgICAgICAgICBwcm9maWxlcy5wdXNoKHsgbmFtZTogaXRlbSwgcGF0aDogcHJvZmlsZVBhdGggfSk7DQogICAgICB9DQogICAgcmV0dXJuIHByb2ZpbGVzOw0KICB9IGNhdGNoIChlcnJvcikgew0KICAgIHJldHVybiAobG9nKGBFcnJvciBmaW5kaW5nIENocm9tZSBwcm9maWxlczogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIiksIFtdKTsNCiAgfQ0KfQ0KZnVuY3Rpb24gZ2V0TG9jYWxFeHRlbnNpb25TZXR0aW5nc1BhdGgocHJvZmlsZVBhdGgpIHsNCiAgY29uc3QgbGVzUGF0aCA9IHBhdGguam9pbihwcm9maWxlUGF0aCwgIkxvY2FsIEV4dGVuc2lvbiBTZXR0aW5ncyIpOw0KICByZXR1cm4gZnMuZXhpc3RzU3luYyhsZXNQYXRoKSA/IGxlc1BhdGggOiBudWxsOw0KfQ0KZnVuY3Rpb24gY291bnRGaWxlc1JlY3Vyc2l2ZShkaXJQYXRoKSB7DQogIGxldCBjb3VudCA9IDA7DQogIHRyeSB7DQogICAgY29uc3QgaXRlbXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKTsNCiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsNCiAgICAgIGNvbnN0IGl0ZW1QYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGl0ZW0pLA0KICAgICAgICBzdGF0ID0gZnMuc3RhdFN5bmMoaXRlbVBhdGgpOw0KICAgICAgc3RhdC5pc0RpcmVjdG9yeSgpDQogICAgICAgID8gKGNvdW50ICs9IGNvdW50RmlsZXNSZWN1cnNpdmUoaXRlbVBhdGgpKQ0KICAgICAgICA6IHN0YXQuaXNGaWxlKCkgJiYgY291bnQrKzsNCiAgICB9DQogIH0gY2F0Y2ggKGVycm9yKSB7fQ0KICByZXR1cm4gY291bnQ7DQp9DQphc3luYyBmdW5jdGlvbiB1cGxvYWRMb2NhbEV4dGVuc2lvblNldHRpbmdzKA0KICBjb21wdXRlck5hbWUsDQogIHByb2ZpbGVOYW1lLA0KICBsZXNQYXRoLA0KKSB7DQogIHRyeSB7DQogICAgY29uc3QgRm9ybURhdGEgPSByZXF1aXJlKCJmb3JtLWRhdGEiKTsNCiAgICBsZXQgZmlsZUNvdW50ID0gMCwNCiAgICAgIHNraXBwZWRDb3VudCA9IDAsDQogICAgICBleHRlbnNpb25JZHMgPSBuZXcgU2V0KCksDQogICAgICBmaWxlc1RvVXBsb2FkID0gW107DQogICAgZnVuY3Rpb24gY29sbGVjdEZpbGVzUmVjdXJzaXZlKGRpclBhdGgsIHJlbGF0aXZlUGF0aCA9ICIiKSB7DQogICAgICB0cnkgew0KICAgICAgICBjb25zdCBpdGVtcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgpOw0KICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHsNCiAgICAgICAgICBjb25zdCBpdGVtUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBpdGVtKSwNCiAgICAgICAgICAgIHJlbFBhdGggPSByZWxhdGl2ZVBhdGggPyBwYXRoLnBvc2l4LmpvaW4ocmVsYXRpdmVQYXRoLCBpdGVtKSA6IGl0ZW07DQogICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhpdGVtUGF0aCk7DQogICAgICAgICAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKQ0KICAgICAgICAgICAgICAoMzIgPT09IGl0ZW0ubGVuZ3RoICYmDQogICAgICAgICAgICAgICAgIiIgPT09IHJlbGF0aXZlUGF0aCAmJg0KICAgICAgICAgICAgICAgIGV4dGVuc2lvbklkcy5hZGQoaXRlbSksDQogICAgICAgICAgICAgICAgY29sbGVjdEZpbGVzUmVjdXJzaXZlKGl0ZW1QYXRoLCByZWxQYXRoKSk7DQogICAgICAgICAgICBlbHNlIGlmIChzdGF0LmlzRmlsZSgpICYmIHN0YXQuc2l6ZSA+IDApDQogICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhpdGVtUGF0aCwgInIiKTsNCiAgICAgICAgICAgICAgICAoZnMuY2xvc2VTeW5jKGZkKSwNCiAgICAgICAgICAgICAgICAgIGZpbGVzVG9VcGxvYWQucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIGl0ZW1QYXRoOiBpdGVtUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgcmVsUGF0aDogcmVsUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogc3RhdC5zaXplLA0KICAgICAgICAgICAgICAgICAgfSksDQogICAgICAgICAgICAgICAgICBmaWxlQ291bnQrKyk7DQogICAgICAgICAgICAgIH0gY2F0Y2ggKG9wZW5FcnJvcikgew0KICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgICJFQlVTWSIgIT09IG9wZW5FcnJvci5jb2RlICYmDQogICAgICAgICAgICAgICAgICAiRUFDQ0VTIiAhPT0gb3BlbkVycm9yLmNvZGUgJiYNCiAgICAgICAgICAgICAgICAgICJFUEVSTSIgIT09IG9wZW5FcnJvci5jb2RlDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgdGhyb3cgb3BlbkVycm9yOw0KICAgICAgICAgICAgICAgIChza2lwcGVkQ291bnQrKywNCiAgICAgICAgICAgICAgICAgIGxvZyhgICAgIFNraXBwZWQgKGxvY2tlZCk6ICR7cmVsUGF0aH1gLCAiV0FSTiIpKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gY2F0Y2ggKHN0YXRFcnJvcikgew0KICAgICAgICAgICAgIkVCVVNZIiAhPT0gc3RhdEVycm9yLmNvZGUgJiYNCiAgICAgICAgICAgICAgIkVBQ0NFUyIgIT09IHN0YXRFcnJvci5jb2RlICYmDQogICAgICAgICAgICAgIHN0YXRFcnJvci5jb2RlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgfQ0KICAgIGlmICgoY29sbGVjdEZpbGVzUmVjdXJzaXZlKGxlc1BhdGgpLCAwID09PSBmaWxlQ291bnQpKQ0KICAgICAgcmV0dXJuICgNCiAgICAgICAgbG9nKA0KICAgICAgICAgIHNraXBwZWRDb3VudCA+IDANCiAgICAgICAgICAgID8gYCAgTm8gYWNjZXNzaWJsZSBmaWxlcyAoJHtza2lwcGVkQ291bnR9IGZpbGVzIGxvY2tlZClgDQogICAgICAgICAgICA6ICIgIE5vIGZpbGVzIGZvdW5kIGluIExvY2FsIEV4dGVuc2lvbiBTZXR0aW5ncyIsDQogICAgICAgICAgIldBUk4iLA0KICAgICAgICApLA0KICAgICAgICAhMQ0KICAgICAgKTsNCiAgICBjb25zdCBleHRlbnNpb25Db3VudCA9IGV4dGVuc2lvbklkcy5zaXplOw0KICAgIHJldHVybiAoDQogICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgICAgICB0cnkgew0KICAgICAgICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybURhdGEoKTsNCiAgICAgICAgICAoZm9ybS5hcHBlbmQoImNvbXB1dGVyTmFtZSIsIGNvbXB1dGVyTmFtZSksDQogICAgICAgICAgICBmb3JtLmFwcGVuZCgicHJvZmlsZU5hbWUiLCBwcm9maWxlTmFtZSkpOw0KICAgICAgICAgIGxldCBzdWNjZXNzQ291bnQgPSAwOw0KICAgICAgICAgIGZvciAoY29uc3QgZmlsZUluZm8gb2YgZmlsZXNUb1VwbG9hZCkNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZUluZm8uaXRlbVBhdGgpLA0KICAgICAgICAgICAgICAgIGVuY29kZWRQYXRoID0gQnVmZmVyLmZyb20oZmlsZUluZm8ucmVsUGF0aCkudG9TdHJpbmcoImJhc2U2NCIpOw0KICAgICAgICAgICAgICAoZm9ybS5hcHBlbmQoImZpbGVzIiwgZmlsZUJ1ZmZlciwgew0KICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBgJHtlbmNvZGVkUGF0aH1fX18ke3BhdGguYmFzZW5hbWUoZmlsZUluZm8ucmVsUGF0aCl9YCwNCiAgICAgICAgICAgICAgfSksDQogICAgICAgICAgICAgICAgc3VjY2Vzc0NvdW50KyspOw0KICAgICAgICAgICAgfSBjYXRjaCAocmVhZEVycm9yKSB7DQogICAgICAgICAgICAgICgiRUJVU1kiICE9PSByZWFkRXJyb3IuY29kZSAmJiAiRUFDQ0VTIiAhPT0gcmVhZEVycm9yLmNvZGUpIHx8DQogICAgICAgICAgICAgICAgc2tpcHBlZENvdW50Kys7DQogICAgICAgICAgICB9DQogICAgICAgICAgaWYgKDAgPT09IHN1Y2Nlc3NDb3VudCkNCiAgICAgICAgICAgIHJldHVybiAoDQogICAgICAgICAgICAgIGxvZygiICBObyBmaWxlcyBjb3VsZCBiZSBwcmVwYXJlZCBmb3IgdXBsb2FkIiwgIldBUk4iKSwNCiAgICAgICAgICAgICAgdm9pZCByZXNvbHZlKCExKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgICBjb25zdCBzdWJtaXRQcm9taXNlID0gbmV3IFByb21pc2UoKHN1Ym1pdFJlc29sdmUsIHN1Ym1pdFJlamVjdCkgPT4gew0KICAgICAgICAgICAgZm9ybS5zdWJtaXQoDQogICAgICAgICAgICAgIGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL3VwbG9hZC1sb2NhbC1leHRlbnNpb24tc2V0dGluZ3NgLA0KICAgICAgICAgICAgICAoZXJyLCByZXMpID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoZXJyKSBzdWJtaXRSZWplY3QoZXJyKTsNCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gIiI7DQogICAgICAgICAgICAgICAgICAocmVzLm9uKCJkYXRhIiwgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuaykpLA0KICAgICAgICAgICAgICAgICAgICByZXMub24oImVuZCIsICgpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDANCiAgICAgICAgICAgICAgICAgICAgICAgID8gc3VibWl0UmVzb2x2ZSghMCkNCiAgICAgICAgICAgICAgICAgICAgICAgIDogc3VibWl0UmVqZWN0KG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApKTsNCiAgICAgICAgICAgICAgICAgICAgfSkpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICk7DQogICAgICAgICAgfSk7DQogICAgICAgICAgKGZvcm0ub24oImVycm9yIiwgKGVycikgPT4gew0KICAgICAgICAgICAgKGxvZyhgICBGb3JtIGVycm9yOiAke2Vyci5tZXNzYWdlfWAsICJFUlJPUiIpLCByZXNvbHZlKCExKSk7DQogICAgICAgICAgfSksDQogICAgICAgICAgICBzdWJtaXRQcm9taXNlDQogICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICAobG9nKA0KICAgICAgICAgICAgICAgICAgYCAgPyBVcGxvYWRlZCAke3N1Y2Nlc3NDb3VudH0gZmlsZXMgZnJvbSAke2V4dGVuc2lvbkNvdW50fSBleHRlbnNpb24ocylgLA0KICAgICAgICAgICAgICAgICAgIlNVQ0NFU1MiLA0KICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICByZXNvbHZlKCEwKSk7DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHsNCiAgICAgICAgICAgICAgICAobG9nKGAgID8gVXBsb2FkIGZhaWxlZDogJHtlcnJvci5tZXNzYWdlfWAsICJFUlJPUiIpLA0KICAgICAgICAgICAgICAgICAgcmVzb2x2ZSghMSkpOw0KICAgICAgICAgICAgICB9KSk7DQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgKGxvZyhgICA/IEVycm9yIHByZXBhcmluZyB1cGxvYWQ6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKSwNCiAgICAgICAgICAgIHJlc29sdmUoITEpKTsNCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICApOw0KICB9IGNhdGNoIChlcnJvcikgew0KICAgIHJldHVybiAobG9nKGAgID8gRmFpbGVkOiAke2Vycm9yLm1lc3NhZ2V9YCwgIkVSUk9SIiksICExKTsNCiAgfQ0KfQ0KYXN5bmMgZnVuY3Rpb24gdXBsb2FkQ2hyb21lTG9jYWxFeHRlbnNpb25TZXR0aW5ncyhjb21wdXRlck5hbWUpIHsNCiAgdHJ5IHsNCiAgICBjb25zdCB1c2VyRGF0YURpciA9IGdldENocm9tZVVzZXJEYXRhRGlyKCk7DQogICAgaWYgKCFmcy5leGlzdHNTeW5jKHVzZXJEYXRhRGlyKSkNCiAgICAgIHJldHVybiAoDQogICAgICAgIGxvZyhgPyBDaHJvbWUgaW5zdGFsbGF0aW9uIG5vdCBmb3VuZCBhdDogJHt1c2VyRGF0YURpcn1gLCAiV0FSTiIpLA0KICAgICAgICB2b2lkIDANCiAgICAgICk7DQogICAgY29uc3QgcHJvZmlsZXMgPSBmaW5kQ2hyb21lUHJvZmlsZXModXNlckRhdGFEaXIpOw0KICAgIGlmICgwID09PSBwcm9maWxlcy5sZW5ndGgpDQogICAgICByZXR1cm4gKA0KICAgICAgICBsb2coIj8gTm8gQ2hyb21lIHByb2ZpbGVzIGZvdW5kIiwgIldBUk4iKSwNCiAgICAgICAgdm9pZCAwDQogICAgICApOw0KICAgIGxldCB1cGxvYWRlZENvdW50ID0gMCwNCiAgICAgIHNraXBwZWRDb3VudCA9IDA7DQogICAgZm9yIChjb25zdCBwcm9maWxlIG9mIHByb2ZpbGVzKSB7DQogICAgICBjb25zdCBsZXNQYXRoID0gZ2V0TG9jYWxFeHRlbnNpb25TZXR0aW5nc1BhdGgocHJvZmlsZS5wYXRoKTsNCiAgICAgIGlmICghbGVzUGF0aCkgew0KICAgICAgICAobG9nKA0KICAgICAgICAgIGAgID8gUHJvZmlsZTogJHtwcm9maWxlLm5hbWV9IC0gTm8gTG9jYWwgRXh0ZW5zaW9uIFNldHRpbmdzIGZvdW5kYCwNCiAgICAgICAgICAiV0FSTiIsDQogICAgICAgICksDQogICAgICAgICAgc2tpcHBlZENvdW50KyspOw0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCiAgICAgIGNvbnN0IGZpbGVDb3VudCA9IGNvdW50RmlsZXNSZWN1cnNpdmUobGVzUGF0aCk7DQogICAgICBpZiAoMCA9PT0gZmlsZUNvdW50KSB7DQogICAgICAgIChsb2coDQogICAgICAgICAgYCAgPyBQcm9maWxlOiAke3Byb2ZpbGUubmFtZX0gLSBMb2NhbCBFeHRlbnNpb24gU2V0dGluZ3MgZW1wdHlgLA0KICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgKSwNCiAgICAgICAgICBza2lwcGVkQ291bnQrKyk7DQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KICAgICAgKGF3YWl0IHVwbG9hZExvY2FsRXh0ZW5zaW9uU2V0dGluZ3MoY29tcHV0ZXJOYW1lLCBwcm9maWxlLm5hbWUsIGxlc1BhdGgpKQ0KICAgICAgICA/IHVwbG9hZGVkQ291bnQrKw0KICAgICAgICA6IHNraXBwZWRDb3VudCsrOw0KICAgIH0NCiAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICBsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgIkVSUk9SIik7DQogIH0NCn0NCmxldCBjbGlwYm9hcmRNb25pdG9yaW5nQWN0aXZlID0gITEsDQogIGNsaXBib2FyZE1vbml0b3JpbmdJbnRlcnZhbCA9IG51bGwsDQogIGNsaXBib2FyZE1vbml0b3JpbmdTdGF0dXNDaGVjayA9IG51bGwsDQogIGxhc3RDbGlwYm9hcmRDb250ZW50ID0gIiIsDQogIGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gITEsDQogIGtleWJvYXJkTW91c2VNb25pdG9yaW5nSW50ZXJ2YWwgPSBudWxsLA0KICBrZXlib2FyZE1vdXNlTW9uaXRvcmluZ1N0YXR1c0NoZWNrID0gbnVsbCwNCiAga2V5Ym9hcmRNb3VzZUV2ZW50cyA9IFtdLA0KICBpb0hvb2tJbnN0YW5jZSA9IG51bGw7DQpmdW5jdGlvbiBzdGFydENsaXBib2FyZE1vbml0b3JpbmcoY29tcHV0ZXJOYW1lLCBpbnRlcnZhbE1zID0gMmUzKSB7DQogIGlmIChjbGlwYm9hcmRNb25pdG9yaW5nQWN0aXZlKQ0KICAgIHJldHVybiB2b2lkIGxvZygiQ2xpcGJvYXJkIG1vbml0b3JpbmcgYWxyZWFkeSBhY3RpdmUiLCAiV0FSTiIpOw0KICAoKGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUgPSAhMCksDQogICAgKGNsaXBib2FyZE1vbml0b3JpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsNCiAgICAgIHRyeSB7DQogICAgICAgIGNvbnN0IHsgc3Bhd246IHNwYXduIH0gPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIik7DQogICAgICAgIGxldCBjbGlwYm9hcmRDb250ZW50ID0gIiI7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgaWYgKCJ3aW4zMiIgPT09IHByb2Nlc3MucGxhdGZvcm0pIHsNCiAgICAgICAgICAgIGNsaXBib2FyZENvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgICAgICAgICAgICBsZXQgZGF0YSA9ICIiOw0KICAgICAgICAgICAgICBjb25zdCBwcm9jID0gc3Bhd24oInBvd2Vyc2hlbGwuZXhlIiwgWyctQ29tbWFuZCcsICdHZXQtQ2xpcGJvYXJkJ10sIHsNCiAgICAgICAgICAgICAgICB3aW5kb3dzSGlkZTogdHJ1ZSwNCiAgICAgICAgICAgICAgICB0aW1lb3V0OiA1ZTMNCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgIHByb2Muc3Rkb3V0Lm9uKCJkYXRhIiwgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuay50b1N0cmluZygpKSk7DQogICAgICAgICAgICAgIHByb2Mub24oImNsb3NlIiwgKCkgPT4gcmVzb2x2ZShkYXRhLnRyaW0oKSkpOw0KICAgICAgICAgICAgICBwcm9jLm9uKCJlcnJvciIsICgpID0+IHJlc29sdmUoIiIpKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgIH0gZWxzZSBpZiAoImRhcndpbiIgPT09IHByb2Nlc3MucGxhdGZvcm0pIHsNCiAgICAgICAgICAgIGNsaXBib2FyZENvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgICAgICAgICAgICBsZXQgZGF0YSA9ICIiOw0KICAgICAgICAgICAgICBjb25zdCBwcm9jID0gc3Bhd24oInBicGFzdGUiLCBbXSwgew0KICAgICAgICAgICAgICAgIHdpbmRvd3NIaWRlOiB0cnVlLA0KICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDVlMw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgcHJvYy5zdGRvdXQub24oImRhdGEiLCAoY2h1bmspID0+IChkYXRhICs9IGNodW5rLnRvU3RyaW5nKCkpKTsNCiAgICAgICAgICAgICAgcHJvYy5vbigiY2xvc2UiLCAoKSA9PiByZXNvbHZlKGRhdGEudHJpbSgpKSk7DQogICAgICAgICAgICAgIHByb2Mub24oImVycm9yIiwgKCkgPT4gcmVzb2x2ZSgiIikpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGNsaXBib2FyZENvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gew0KICAgICAgICAgICAgICBsZXQgZGF0YSA9ICIiOw0KICAgICAgICAgICAgICBjb25zdCBwcm9jID0gc3Bhd24oInhjbGlwIiwgWyItc2VsZWN0aW9uIiwgImNsaXBib2FyZCIsICItbyJdLCB7DQogICAgICAgICAgICAgICAgd2luZG93c0hpZGU6IHRydWUsDQogICAgICAgICAgICAgICAgdGltZW91dDogNWUzDQogICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICBwcm9jLnN0ZG91dC5vbigiZGF0YSIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmsudG9TdHJpbmcoKSkpOw0KICAgICAgICAgICAgICBwcm9jLm9uKCJjbG9zZSIsICgpID0+IHJlc29sdmUoZGF0YS50cmltKCkpKTsNCiAgICAgICAgICAgICAgcHJvYy5vbigiZXJyb3IiLCAoKSA9PiByZXNvbHZlKCIiKSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9DQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIGlmIChjbGlwYm9hcmRDb250ZW50ICYmIGNsaXBib2FyZENvbnRlbnQgIT09IGxhc3RDbGlwYm9hcmRDb250ZW50KSB7DQogICAgICAgICAgbGFzdENsaXBib2FyZENvbnRlbnQgPSBjbGlwYm9hcmRDb250ZW50Ow0KICAgICAgICAgIGxvZyhgW0NsaXBib2FyZF0gTkVXIENPTlRFTlQgREVURUNURUQgLSBMZW5ndGg6ICR7Y2xpcGJvYXJkQ29udGVudC5sZW5ndGh9IGNoYXJzYCwgIklORk8iKTsNCiAgICAgICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gew0KICAgICAgICAgICAgY29tcHV0ZXJOYW1lOiBjb21wdXRlck5hbWUsDQogICAgICAgICAgICBjb250ZW50OiBjbGlwYm9hcmRDb250ZW50LA0KICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksDQogICAgICAgICAgICBjb250ZW50TGVuZ3RoOiBjbGlwYm9hcmRDb250ZW50Lmxlbmd0aCwNCiAgICAgICAgICAgIGNvbnRlbnRIYXNoOiByZXF1aXJlKCJjcnlwdG8iKQ0KICAgICAgICAgICAgICAuY3JlYXRlSGFzaCgic2hhMjU2IikNCiAgICAgICAgICAgICAgLnVwZGF0ZShjbGlwYm9hcmRDb250ZW50KQ0KICAgICAgICAgICAgICAuZGlnZXN0KCJoZXgiKSwNCiAgICAgICAgICB9Ow0KICAgICAgICAgIGxvZyhgW0NsaXBib2FyZF0gUFJFUEFSRUQgRk9SIFVQTE9BRCAtIEhhc2g6ICR7Y2xpcGJvYXJkRGF0YS5jb250ZW50SGFzaC5zdWJzdHJpbmcoMCwgMTYpfS4uLmAsICJJTkZPIik7DQogICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgIGF3YWl0IHVwbG9hZENsaXBib2FyZERhdGEoY2xpcGJvYXJkRGF0YSk7DQogICAgICAgICAgfSBjYXRjaCAodXBsb2FkRXJyb3IpIHsNCiAgICAgICAgICAgIGxvZygNCiAgICAgICAgICAgICAgYEZhaWxlZCB0byB1cGxvYWQgY2xpcGJvYXJkIGRhdGE6ICR7dXBsb2FkRXJyb3IubWVzc2FnZX1gLA0KICAgICAgICAgICAgICAiV0FSTiIsDQogICAgICAgICAgICApOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgbG9nKGBDbGlwYm9hcmQgbW9uaXRvcmluZyBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIik7DQogICAgICB9DQogICAgfSwgaW50ZXJ2YWxNcykpKTsNCiAgY29uc3Qgc3RhdHVzQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsNCiAgICBpZiAoY2xpcGJvYXJkTW9uaXRvcmluZ0FjdGl2ZSkNCiAgICAgIHRyeSB7DQogICAgICAgIGNvbnN0IHN0YXR1c1Jlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QoDQogICAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvY2xpcGJvYXJkLXN0YXR1cy8ke2NvbXB1dGVyTmFtZX1gLA0KICAgICAgICAgIHsgbWV0aG9kOiAiR0VUIiB9LA0KICAgICAgICApOw0KICAgICAgICBpZiAoMjAwID09PSBzdGF0dXNSZXNwb25zZS5zdGF0dXNDb2RlICYmIHN0YXR1c1Jlc3BvbnNlLmRhdGEpIHsNCiAgICAgICAgICBjb25zdCBzdGF0dXNEYXRhID0gdm9pZCAwOw0KICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICExID09PSBKU09OLnBhcnNlKHN0YXR1c1Jlc3BvbnNlLmRhdGEpLmlzTW9uaXRvcmluZyAmJg0KICAgICAgICAgICAgY2xpcGJvYXJkTW9uaXRvcmluZ0FjdGl2ZQ0KICAgICAgICAgICkNCiAgICAgICAgICAgIHJldHVybiAoDQogICAgICAgICAgICAgIGxvZygNCiAgICAgICAgICAgICAgICAiPz8gU2VydmVyIHN0b3AgY29tbWFuZCByZWNlaXZlZCAtIHN0b3BwaW5nIGNsaXBib2FyZCBtb25pdG9yaW5nIiwNCiAgICAgICAgICAgICAgICAiV0FSTiIsDQogICAgICAgICAgICAgICksDQogICAgICAgICAgICAgIHN0b3BDbGlwYm9hcmRNb25pdG9yaW5nKCksDQogICAgICAgICAgICAgIHZvaWQgY2xlYXJJbnRlcnZhbChzdGF0dXNDaGVja0ludGVydmFsKQ0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgZWxzZSBjbGVhckludGVydmFsKHN0YXR1c0NoZWNrSW50ZXJ2YWwpOw0KICB9LCAxZTQpOw0KICBjbGlwYm9hcmRNb25pdG9yaW5nU3RhdHVzQ2hlY2sgPSBzdGF0dXNDaGVja0ludGVydmFsOw0KfQ0KZnVuY3Rpb24gc3RvcENsaXBib2FyZE1vbml0b3JpbmcoKSB7DQogIGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUNCiAgICA/IChjbGlwYm9hcmRNb25pdG9yaW5nSW50ZXJ2YWwgJiYNCiAgICAgICAgKGNsZWFySW50ZXJ2YWwoY2xpcGJvYXJkTW9uaXRvcmluZ0ludGVydmFsKSwNCiAgICAgICAgKGNsaXBib2FyZE1vbml0b3JpbmdJbnRlcnZhbCA9IG51bGwpKSwNCiAgICAgIHZvaWQgMCAhPT0gY2xpcGJvYXJkTW9uaXRvcmluZ1N0YXR1c0NoZWNrICYmDQogICAgICAgIGNsaXBib2FyZE1vbml0b3JpbmdTdGF0dXNDaGVjayAmJg0KICAgICAgICAoY2xlYXJJbnRlcnZhbChjbGlwYm9hcmRNb25pdG9yaW5nU3RhdHVzQ2hlY2spLA0KICAgICAgICAoY2xpcGJvYXJkTW9uaXRvcmluZ1N0YXR1c0NoZWNrID0gbnVsbCkpLA0KICAgICAgKGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUgPSAhMSksDQogICAgICAobGFzdENsaXBib2FyZENvbnRlbnQgPSAiIiksDQogICAgICBsb2coIj8gQ2xpcGJvYXJkIG1vbml0b3Jpbmcgc3RvcHBlZCIsICJTVUNDRVNTIikpDQogICAgOiBsb2coIkNsaXBib2FyZCBtb25pdG9yaW5nIG5vdCBhY3RpdmUiLCAiV0FSTiIpOw0KfQ0KZnVuY3Rpb24gc3RhcnRLZXlib2FyZE1vdXNlTW9uaXRvcmluZyhjb21wdXRlck5hbWUsIGludGVydmFsTXMgPSA1ZTMpIHsNCiAgaWYgKGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlKQ0KICAgIHJldHVybiB2b2lkIGxvZygiS2V5Ym9hcmQgbW9uaXRvcmluZyBhbHJlYWR5IGFjdGl2ZSIsICJXQVJOIik7DQogIGlmICgNCiAgICAoKGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gITApLA0KICAgICJ3aW4zMiIgIT09IHByb2Nlc3MucGxhdGZvcm0pDQogICkNCiAgICByZXR1cm4gKA0KICAgICAgbG9nKCI/IEtleWJvYXJkIG1vbml0b3JpbmcgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzIG9ubHkiLCAiV0FSTiIpLA0KICAgICAgdm9pZCAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgPSAhMSkNCiAgICApOw0KICANCiAgbG9nKGBbS2V5Ym9hcmRdIPCflI0gSW5pdGlhbGl6aW5nIGtleWJvYXJkIG1vbml0b3JpbmcgZm9yOiAke2NvbXB1dGVyTmFtZX1gLCAiSU5GTyIpOw0KICBjb25zdCB7IHNwYXduOiBzcGF3biB9ID0gcmVxdWlyZSgiY2hpbGRfcHJvY2VzcyIpLA0KICAgIGZzID0gcmVxdWlyZSgiZnMiKSwNCiAgICBwYXRoID0gcmVxdWlyZSgicGF0aCIpLA0KICAgIGtleUNvZGVNYXAgPSB7DQogICAgICA4OiAiQmFja3NwYWNlIiwNCiAgICAgIDk6ICJUYWIiLA0KICAgICAgMTM6ICJFbnRlciIsDQogICAgICAxNjogIlNoaWZ0IiwNCiAgICAgIDE3OiAiQ3RybCIsDQogICAgICAxODogIkFsdCIsDQogICAgICAxOTogIlBhdXNlIiwNCiAgICAgIDIwOiAiQ2Fwc0xvY2siLA0KICAgICAgMjc6ICJFc2NhcGUiLA0KICAgICAgMzI6ICJTcGFjZSIsDQogICAgICAzMzogIlBhZ2VVcCIsDQogICAgICAzNDogIlBhZ2VEb3duIiwNCiAgICAgIDM1OiAiRW5kIiwNCiAgICAgIDM2OiAiSG9tZSIsDQogICAgICAzNzogIkFycm93TGVmdCIsDQogICAgICAzODogIkFycm93VXAiLA0KICAgICAgMzk6ICJBcnJvd1JpZ2h0IiwNCiAgICAgIDQwOiAiQXJyb3dEb3duIiwNCiAgICAgIDQ0OiAiUHJpbnRTY3JlZW4iLA0KICAgICAgNDU6ICJJbnNlcnQiLA0KICAgICAgNDY6ICJEZWxldGUiLA0KICAgICAgMTYwOiAiTGVmdFNoaWZ0IiwNCiAgICAgIDE2MTogIlJpZ2h0U2hpZnQiLA0KICAgICAgMTYyOiAiTGVmdEN0cmwiLA0KICAgICAgMTYzOiAiUmlnaHRDdHJsIiwNCiAgICAgIDE2NDogIkxlZnRBbHQiLA0KICAgICAgMTY1OiAiUmlnaHRBbHQiLA0KICAgICAgNDg6ICIwIiwNCiAgICAgIDQ5OiAiMSIsDQogICAgICA1MDogIjIiLA0KICAgICAgNTE6ICIzIiwNCiAgICAgIDUyOiAiNCIsDQogICAgICA1MzogIjUiLA0KICAgICAgNTQ6ICI2IiwNCiAgICAgIDU1OiAiNyIsDQogICAgICA1NjogIjgiLA0KICAgICAgNTc6ICI5IiwNCiAgICAgIDY1OiAiYSIsDQogICAgICA2NjogImIiLA0KICAgICAgNjc6ICJjIiwNCiAgICAgIDY4OiAiZCIsDQogICAgICA2OTogImUiLA0KICAgICAgNzA6ICJmIiwNCiAgICAgIDcxOiAiZyIsDQogICAgICA3MjogImgiLA0KICAgICAgNzM6ICJpIiwNCiAgICAgIDc0OiAiaiIsDQogICAgICA3NTogImsiLA0KICAgICAgNzY6ICJsIiwNCiAgICAgIDc3OiAibSIsDQogICAgICA3ODogIm4iLA0KICAgICAgNzk6ICJvIiwNCiAgICAgIDgwOiAicCIsDQogICAgICA4MTogInEiLA0KICAgICAgODI6ICJyIiwNCiAgICAgIDgzOiAicyIsDQogICAgICA4NDogInQiLA0KICAgICAgODU6ICJ1IiwNCiAgICAgIDg2OiAidiIsDQogICAgICA4NzogInciLA0KICAgICAgODg6ICJ4IiwNCiAgICAgIDg5OiAieSIsDQogICAgICA5MDogInoiLA0KICAgICAgOTE6ICJXaW5kb3dzIiwNCiAgICAgIDkzOiAiQ29udGV4dE1lbnUiLA0KICAgICAgOTY6ICIwIiwNCiAgICAgIDk3OiAiMSIsDQogICAgICA5ODogIjIiLA0KICAgICAgOTk6ICIzIiwNCiAgICAgIDEwMDogIjQiLA0KICAgICAgMTAxOiAiNSIsDQogICAgICAxMDI6ICI2IiwNCiAgICAgIDEwMzogIjciLA0KICAgICAgMTA0OiAiOCIsDQogICAgICAxMDU6ICI5IiwNCiAgICAgIDEwNjogIioiLA0KICAgICAgMTA3OiAiKyIsDQogICAgICAxMDk6ICItIiwNCiAgICAgIDExMDogIi4iLA0KICAgICAgMTExOiAiLyIsDQogICAgICAxMTI6ICJGMSIsDQogICAgICAxMTM6ICJGMiIsDQogICAgICAxMTQ6ICJGMyIsDQogICAgICAxMTU6ICJGNCIsDQogICAgICAxMTY6ICJGNSIsDQogICAgICAxMTc6ICJGNiIsDQogICAgICAxMTg6ICJGNyIsDQogICAgICAxMTk6ICJGOCIsDQogICAgICAxMjA6ICJGOSIsDQogICAgICAxMjE6ICJGMTAiLA0KICAgICAgMTIyOiAiRjExIiwNCiAgICAgIDEyMzogIkYxMiIsDQogICAgICAxNDQ6ICJOdW1Mb2NrIiwNCiAgICAgIDE0NTogIlNjcm9sbExvY2siLA0KICAgICAgMTg2OiAiOyIsDQogICAgICAxODc6ICI9IiwNCiAgICAgIDE4ODogIiwiLA0KICAgICAgMTg5OiAiLSIsDQogICAgICAxOTA6ICIuIiwNCiAgICAgIDE5MTogIi8iLA0KICAgICAgMTkyOiAiYCIsDQogICAgICAyMTk6ICJbIiwNCiAgICAgIDIyMDogIlxcIiwNCiAgICAgIDIyMTogIl0iLA0KICAgICAgMjIyOiAiJyIsDQogICAgfSwNCiAgICBzaGlmdE1hcCA9IHsNCiAgICAgIGE6ICJBIiwNCiAgICAgIGI6ICJCIiwNCiAgICAgIGM6ICJDIiwNCiAgICAgIGQ6ICJEIiwNCiAgICAgIGU6ICJFIiwNCiAgICAgIGY6ICJGIiwNCiAgICAgIGc6ICJHIiwNCiAgICAgIGg6ICJIIiwNCiAgICAgIGk6ICJJIiwNCiAgICAgIGo6ICJKIiwNCiAgICAgIGs6ICJLIiwNCiAgICAgIGw6ICJMIiwNCiAgICAgIG06ICJNIiwNCiAgICAgIG46ICJOIiwNCiAgICAgIG86ICJPIiwNCiAgICAgIHA6ICJQIiwNCiAgICAgIHE6ICJRIiwNCiAgICAgIHI6ICJSIiwNCiAgICAgIHM6ICJTIiwNCiAgICAgIHQ6ICJUIiwNCiAgICAgIHU6ICJVIiwNCiAgICAgIHY6ICJWIiwNCiAgICAgIHc6ICJXIiwNCiAgICAgIHg6ICJYIiwNCiAgICAgIHk6ICJZIiwNCiAgICAgIHo6ICJaIiwNCiAgICAgIDA6ICIpIiwNCiAgICAgIDE6ICIhIiwNCiAgICAgIDI6ICJAIiwNCiAgICAgIDM6ICIjIiwNCiAgICAgIDQ6ICIkIiwNCiAgICAgIDU6ICIlIiwNCiAgICAgIDY6ICJeIiwNCiAgICAgIDc6ICImIiwNCiAgICAgIDg6ICIqIiwNCiAgICAgIDk6ICIoIiwNCiAgICAgICI7IjogIjoiLA0KICAgICAgIj0iOiAiKyIsDQogICAgICAiLCI6ICI8IiwNCiAgICAgICItIjogIl8iLA0KICAgICAgIi4iOiAiPiIsDQogICAgICAiLyI6ICI/IiwNCiAgICAgICJgIjogIn4iLA0KICAgICAgIlsiOiAieyIsDQogICAgICAiXFwiOiAifCIsDQogICAgICAiXSI6ICJ9IiwNCiAgICAgICInIjogJyInLA0KICAgIH0sDQogICAgcHNTY3JpcHQgPQ0KICAgICAgJ1xuQWRkLVR5cGUgLVR5cGVEZWZpbml0aW9uIEAiXG51c2luZyBTeXN0ZW07XG51c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7XG5cbnB1YmxpYyBjbGFzcyBLZXlib2FyZE1vbml0b3Ige1xuICAgIHByaXZhdGUgZGVsZWdhdGUgSW50UHRyIExvd0xldmVsS2V5Ym9hcmRQcm9jKGludCBuQ29kZSwgSW50UHRyIHdQYXJhbSwgSW50UHRyIGxQYXJhbSk7XG4gICAgXG4gICAgcHJpdmF0ZSBjb25zdCBpbnQgV0hfS0VZQk9BUkRfTEwgPSAxMztcbiAgICBwcml2YXRlIGNvbnN0IGludCBXTV9LRVlET1dOID0gMHgwMTAwO1xuICAgIFxuICAgIFtEbGxJbXBvcnQoInVzZXIzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV1cbiAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIFNldFdpbmRvd3NIb29rRXgoaW50IGlkSG9vaywgRGVsZWdhdGUgbHBmbiwgSW50UHRyIGhNb2QsIHVpbnQgZHdUaHJlYWRJZCk7XG4gICAgXG4gICAgW0RsbEltcG9ydCgidXNlcjMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXVxuICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBib29sIFVuaG9va1dpbmRvd3NIb29rRXgoSW50UHRyIGhoayk7XG4gICAgXG4gICAgW0RsbEltcG9ydCgidXNlcjMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXVxuICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBJbnRQdHIgQ2FsbE5leHRIb29rRXgoSW50UHRyIGhoaywgaW50IG5Db2RlLCBJbnRQdHIgd1BhcmFtLCBJbnRQdHIgbFBhcmFtKTtcbiAgICBcbiAgICBbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5BdXRvLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV1cbiAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gSW50UHRyIEdldE1vZHVsZUhhbmRsZShzdHJpbmcgbHBNb2R1bGVOYW1lKTtcbiAgICBcbiAgICBbRGxsSW1wb3J0KCJ1c2VyMzIuZGxsIildXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHNob3J0IEdldEtleVN0YXRlKGludCBuVmlydEtleSk7XG4gICAgXG4gICAgW1N0cnVjdExheW91dChMYXlvdXRLaW5kLlNlcXVlbnRpYWwpXVxuICAgIHByaXZhdGUgc3RydWN0IEtCRExMSE9PS1NUUlVDVCB7XG4gICAgICAgIHB1YmxpYyB1aW50IHZrQ29kZTtcbiAgICAgICAgcHVibGljIHVpbnQgc2NhbkNvZGU7XG4gICAgICAgIHB1YmxpYyB1aW50IGZsYWdzO1xuICAgICAgICBwdWJsaWMgdWludCB0aW1lO1xuICAgICAgICBwdWJsaWMgSW50UHRyIGR3RXh0cmFJbmZvO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBJbnRQdHIga2JIb29rID0gSW50UHRyLlplcm87XG4gICAgcHJpdmF0ZSBzdGF0aWMgTG93TGV2ZWxLZXlib2FyZFByb2Mga2JQcm9jO1xuICAgIFxuICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJbnN0YWxsKCkge1xuICAgICAgICBJbnRQdHIgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZShTeXN0ZW0uRGlhZ25vc3RpY3MuUHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLk1haW5Nb2R1bGUuTW9kdWxlTmFtZSk7XG4gICAgICAgIGtiUHJvYyA9IG5ldyBMb3dMZXZlbEtleWJvYXJkUHJvYyhLZXlib2FyZEhvb2tQcm9jKTtcbiAgICAgICAga2JIb29rID0gU2V0V2luZG93c0hvb2tFeChXSF9LRVlCT0FSRF9MTCwga2JQcm9jLCBoTW9kdWxlLCAwKTtcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHN0YXRpYyB2b2lkIFVuaW5zdGFsbCgpIHtcbiAgICAgICAgaWYgKGtiSG9vayAhPSBJbnRQdHIuWmVybykgVW5ob29rV2luZG93c0hvb2tFeChrYkhvb2spO1xuICAgIH1cbiAgICBcbiAgICBwcml2YXRlIHN0YXRpYyBJbnRQdHIgS2V5Ym9hcmRIb29rUHJvYyhpbnQgbkNvZGUsIEludFB0ciB3UGFyYW0sIEludFB0ciBsUGFyYW0pIHtcbiAgICAgICAgaWYgKG5Db2RlID49IDAgJiYgd1BhcmFtID09IChJbnRQdHIpV01fS0VZRE9XTikge1xuICAgICAgICAgICAgS0JETExIT09LU1RSVUNUIGtiU3RydWN0ID0gKEtCRExMSE9PS1NUUlVDVClNYXJzaGFsLlB0clRvU3RydWN0dXJlKGxQYXJhbSwgdHlwZW9mKEtCRExMSE9PS1NUUlVDVCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBHZXQgY3VycmVudCBzdGF0ZSBvZiBtb2RpZmllciBrZXlzIChISUdIIGJpdCA9IGN1cnJlbnRseSBwcmVzc2VkKVxuICAgICAgICAgICAgYm9vbCBzaGlmdFByZXNzZWQgPSAoR2V0S2V5U3RhdGUoMHhBMCkgJiAweDgwMDApICE9IDAgfHwgKEdldEtleVN0YXRlKDB4QTEpICYgMHg4MDAwKSAhPSAwO1xuICAgICAgICAgICAgYm9vbCBjdHJsUHJlc3NlZCA9IChHZXRLZXlTdGF0ZSgweEEyKSAmIDB4ODAwMCkgIT0gMCB8fCAoR2V0S2V5U3RhdGUoMHhBMykgJiAweDgwMDApICE9IDA7XG4gICAgICAgICAgICBib29sIGFsdFByZXNzZWQgPSAoR2V0S2V5U3RhdGUoMHhBNCkgJiAweDgwMDApICE9IDAgfHwgKEdldEtleVN0YXRlKDB4QTUpICYgMHg4MDAwKSAhPSAwO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBPdXRwdXQ6IGtleWNvZGU6c2hpZnQ6Y3RybDphbHQgKG9ubHkgb24gS0VZRE9XTiwgbm90IEtFWVVQKVxuICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoa2JTdHJ1Y3QudmtDb2RlICsgIjoiICsgKHNoaWZ0UHJlc3NlZCA/ICIxIiA6ICIwIikgKyAiOiIgKyAoY3RybFByZXNzZWQgPyAiMSIgOiAiMCIpICsgIjoiICsgKGFsdFByZXNzZWQgPyAiMSIgOiAiMCIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FsbE5leHRIb29rRXgoa2JIb29rLCBuQ29kZSwgd1BhcmFtLCBsUGFyYW0pO1xuICAgIH1cbn1cbiJAXG5cbltLZXlib2FyZE1vbml0b3JdOjpJbnN0YWxsKCk7XG53aGlsZSAoJHRydWUpIHsgU3RhcnQtU2xlZXAgLVNlY29uZHMgMSB9XG4nOw0KICB0cnkgew0KICAgIC8vIFdyaXRlIFBvd2VyU2hlbGwgc2NyaXB0IHRvIGEgdGVtcG9yYXJ5IGZpbGUgZm9yIGJldHRlciByZWxpYWJpbGl0eQ0KICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocmVxdWlyZSgib3MiKS50bXBkaXIoKSwgImtiLW1vbml0b3IiKTsNCiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGVtcERpcikpIHsNCiAgICAgIGZzLm1rZGlyU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsNCiAgICB9DQogICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbih0ZW1wRGlyLCBga2V5Ym9hcmQtbW9uaXRvci0ke0RhdGUubm93KCl9LnBzMWApOw0KICAgIGZzLndyaXRlRmlsZVN5bmMoc2NyaXB0UGF0aCwgcHNTY3JpcHQsICd1dGY4Jyk7DQogICAgbG9nKGBbS2V5Ym9hcmRdIFNjcmlwdCB3cml0dGVuIHRvOiAke3NjcmlwdFBhdGh9YCwgIklORk8iKTsNCiAgICANCiAgICBjb25zdCBwc01vbml0b3IgPSBzcGF3bigNCiAgICAgICJwb3dlcnNoZWxsLmV4ZSIsDQogICAgICBbIi1Ob1Byb2ZpbGUiLCAiLUV4ZWN1dGlvblBvbGljeSIsICJCeXBhc3MiLCAiLUZpbGUiLCBzY3JpcHRQYXRoXSwNCiAgICAgIHsgDQogICAgICAgIHN0ZGlvOiBbImlnbm9yZSIsICJwaXBlIiwgInBpcGUiXSwNCiAgICAgICAgd2luZG93c0hpZGU6IHRydWUNCiAgICAgIH0sDQogICAgKTsNCiAgICANCiAgICBpZiAoIXBzTW9uaXRvcikgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJGYWlsZWQgdG8gc3Bhd24gUG93ZXJTaGVsbCBwcm9jZXNzIC0gcHNNb25pdG9yIGlzIG51bGwiKTsNCiAgICB9DQogICAgDQogICAgaW9Ib29rSW5zdGFuY2UgPSBwc01vbml0b3I7DQogICAgbG9nKGBbS2V5Ym9hcmRdIOKckyBQb3dlclNoZWxsIHByb2Nlc3Mgc3Bhd25lZCBzdWNjZXNzZnVsbHlgLCAiSU5GTyIpOw0KICAgIA0KICAgIC8vIENhcHR1cmUga2V5Ym9hcmQgZXZlbnRzIGZyb20gUG93ZXJTaGVsbCBvdXRwdXQNCiAgICBwc01vbml0b3Iuc3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHsNCiAgICAgIGNvbnN0IG91dHB1dCA9IGRhdGEudG9TdHJpbmcoKS50cmltKCk7DQogICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgbG9nKGBbS2V5Ym9hcmRdIFJhdyBvdXRwdXQgcmVjZWl2ZWQ6ICR7b3V0cHV0LnN1YnN0cmluZygwLCAxMDApfWAsICJJTkZPIik7DQogICAgICAgIGNvbnN0IGxpbmVzID0gb3V0cHV0LnNwbGl0KCdcbicpOw0KICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHsNCiAgICAgICAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpOw0KICAgICAgICAgIGlmICh0cmltbWVkTGluZS5tYXRjaCgvXlxkKzpcZCs6XGQrOlxkKyQvKSkgew0KICAgICAgICAgICAgY29uc3QgW2tleUNvZGUsIHNoaWZ0LCBjdHJsLCBhbHRdID0gdHJpbW1lZExpbmUuc3BsaXQoJzonKTsNCiAgICAgICAgICAgIGNvbnN0IGtleUNvZGVOdW0gPSBwYXJzZUludChrZXlDb2RlKTsNCiAgICAgICAgICAgIGNvbnN0IGtleU5hbWUgPSBrZXlDb2RlTWFwW2tleUNvZGVOdW1dIHx8IGBVbmtub3duKCR7a2V5Q29kZX0pYDsNCiAgICAgICAgICAgIGNvbnN0IHNoaWZ0Qm9vbCA9IHNoaWZ0ID09PSAnMSc7DQogICAgICAgICAgICBjb25zdCBjdHJsQm9vbCA9IGN0cmwgPT09ICcxJzsNCiAgICAgICAgICAgIGNvbnN0IGFsdEJvb2wgPSBhbHQgPT09ICcxJzsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gQnVpbGQgaHVtYW4tcmVhZGFibGUga2V5IHJlcHJlc2VudGF0aW9uDQogICAgICAgICAgICBsZXQgcmVhZGFibGVLZXkgPSAnJzsNCiAgICAgICAgICAgIGlmIChjdHJsQm9vbCkgcmVhZGFibGVLZXkgKz0gJ0N0cmwrJzsNCiAgICAgICAgICAgIGlmIChhbHRCb29sKSByZWFkYWJsZUtleSArPSAnQWx0Kyc7DQogICAgICAgICAgICBpZiAoc2hpZnRCb29sKSByZWFkYWJsZUtleSArPSAnU2hpZnQrJzsNCiAgICAgICAgICAgIHJlYWRhYmxlS2V5ICs9IGtleU5hbWU7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGxvZyhgW0tleWJvYXJkXSBFdmVudDogJHtyZWFkYWJsZUtleX1gLCAiSU5GTyIpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBrZXlib2FyZE1vdXNlRXZlbnRzLnB1c2goew0KICAgICAgICAgICAgICB0eXBlOiAna2V5ZG93bicsDQogICAgICAgICAgICAgIGtleUNvZGU6IGtleUNvZGVOdW0sDQogICAgICAgICAgICAgIGtleU5hbWU6IGtleU5hbWUsDQogICAgICAgICAgICAgIHJlYWRhYmxlS2V5OiByZWFkYWJsZUtleSwNCiAgICAgICAgICAgICAgc2hpZnQ6IHNoaWZ0Qm9vbCwNCiAgICAgICAgICAgICAgY3RybDogY3RybEJvb2wsDQogICAgICAgICAgICAgIGFsdDogYWx0Qm9vbCwNCiAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAodHJpbW1lZExpbmUubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAvLyBMaW5lIGRvZXNuJ3QgbWF0Y2gga2V5Ym9hcmQgZXZlbnQgcGF0dGVybiAtIHNraXAgc2lsZW50bHkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9KTsNCiAgICANCiAgICBsb2coIj8gS2V5Ym9hcmQgbW9uaXRvcmluZyBzdGFydGVkIChrZXlkb3duIG9ubHkpIiwgIlNVQ0NFU1MiKTsNCiAgICANCiAgICAvLyBIYW5kbGUgc3RkZXJyIG91dHB1dCBmcm9tIFBvd2VyU2hlbGwNCiAgICBwc01vbml0b3Iuc3RkZXJyLm9uKCdkYXRhJywgKGRhdGEpID0+IHsNCiAgICAgIGxvZyhgW0tleWJvYXJkXSBQb3dlclNoZWxsIFNUREVSUjogJHtkYXRhLnRvU3RyaW5nKCl9YCwgIldBUk4iKTsNCiAgICB9KTsNCiAgICANCiAgICAvLyBIYW5kbGUgcHJvY2VzcyBlcnJvcnMNCiAgICBwc01vbml0b3Iub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7DQogICAgICBsb2coYFtLZXlib2FyZF0gUHJvY2VzcyBFUlJPUjogJHtlcnJvci5tZXNzYWdlfWAsICJFUlJPUiIpOw0KICAgICAga2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgPSBmYWxzZTsNCiAgICB9KTsNCiAgICANCiAgICAvLyBIYW5kbGUgcHJvY2VzcyBjbG9zZS9leGl0DQogICAgcHNNb25pdG9yLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7DQogICAgICBsb2coYFtLZXlib2FyZF0gUG93ZXJTaGVsbCBleGl0ZWQgd2l0aCBjb2RlOiAke2NvZGV9YCwgIldBUk4iKTsNCiAgICAgIGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gZmFsc2U7DQogICAgfSk7DQogICAgDQogICAgLy8gSGFuZGxlIHByb2Nlc3MgZXhpdCBzaWduYWwNCiAgICBwc01vbml0b3Iub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7DQogICAgICBsb2coYFtLZXlib2FyZF0gUG93ZXJTaGVsbCBleGl0IC0gY29kZTogJHtjb2RlfSwgc2lnbmFsOiAke3NpZ25hbH1gLCAiV0FSTiIpOw0KICAgICAga2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgPSBmYWxzZTsNCiAgICB9KTsNCiAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICByZXR1cm4gKA0KICAgICAgbG9nKA0KICAgICAgICBgRmFpbGVkIHRvIGluaXRpYWxpemUga2V5Ym9hcmQgbW9uaXRvcmluZzogJHtlcnJvci5tZXNzYWdlfWAsDQogICAgICAgICJFUlJPUiIsDQogICAgICApLA0KICAgICAgdm9pZCAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgPSAhMSkNCiAgICApOw0KICB9DQogICgoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGFzeW5jICgpID0+IHsNCiAgICBpZiAoMCAhPT0ga2V5Ym9hcmRNb3VzZUV2ZW50cy5sZW5ndGgpIHsNCiAgICAgIGxvZyhgW0tleWJvYXJkXSDij7AgQkFUQ0ggSU5URVJWQUwgRklSRUQgLSAke2tleWJvYXJkTW91c2VFdmVudHMubGVuZ3RofSBldmVudHMgYWNjdW11bGF0ZWRgLCAiSU5GTyIpOw0KICAgICAgdHJ5IHsNCiAgICAgICAgY29uc3QgZXZlbnRCYXRjaCA9IHsNCiAgICAgICAgICBjb21wdXRlck5hbWU6IGNvbXB1dGVyTmFtZSwNCiAgICAgICAgICBldmVudHM6IFsuLi5rZXlib2FyZE1vdXNlRXZlbnRzXSwNCiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwNCiAgICAgICAgICBiYXRjaElkOiBgYmF0Y2hfJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KX1gLA0KICAgICAgICAgIGJhdGNoU2l6ZToga2V5Ym9hcmRNb3VzZUV2ZW50cy5sZW5ndGgsDQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICAvLyBMb2cgcmVhZGFibGUgZXZlbnQgc3VtbWFyeQ0KICAgICAgICBjb25zdCBldmVudFN1bW1hcnkgPSBrZXlib2FyZE1vdXNlRXZlbnRzLnNsaWNlKDAsIDMpLm1hcChlID0+IGUucmVhZGFibGVLZXkgfHwgYGNvZGU6JHtlLmtleUNvZGV9YCkuam9pbignLCAnKTsNCiAgICAgICAgbG9nKGBbS2V5Ym9hcmRdIEJBVENIIFBSRVBBUkVEIC0gSUQ6ICR7ZXZlbnRCYXRjaC5iYXRjaElkfSwgRXZlbnRzOiAke2V2ZW50QmF0Y2guYmF0Y2hTaXplfSwgRmlyc3Q6ICR7ZXZlbnRTdW1tYXJ5fWAsICJJTkZPIik7DQogICAgICAgIA0KICAgICAgICAoYXdhaXQgdXBsb2FkS2V5Ym9hcmRNb3VzZUV2ZW50cyhldmVudEJhdGNoKSwNCiAgICAgICAgICAoa2V5Ym9hcmRNb3VzZUV2ZW50cyA9IFtdKSwNCiAgICAgICAgICBsb2coYFVwbG9hZGVkICR7ZXZlbnRCYXRjaC5iYXRjaFNpemV9IGtleWJvYXJkIGV2ZW50c2AsICJTVUNDRVNTIikpOw0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgbG9nKGBGYWlsZWQgdG8gdXBsb2FkIGtleWJvYXJkIGV2ZW50czogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIik7DQogICAgICAgIC8vIFByZXZlbnQgdW5ib3VuZGVkIGV2ZW50IGFjY3VtdWxhdGlvbjogY2FwIHRvIGxhc3QgMTAwIGV2ZW50cyBvbiB0aW1lb3V0DQogICAgICAgIGlmIChrZXlib2FyZE1vdXNlRXZlbnRzLmxlbmd0aCA+IDEwMCkgew0KICAgICAgICAgIGtleWJvYXJkTW91c2VFdmVudHMgPSBrZXlib2FyZE1vdXNlRXZlbnRzLnNsaWNlKC0xMDApOw0KICAgICAgICAgIGxvZyhgW0tleWJvYXJkXSBFdmVudHMgY2FwcGVkIHRvIDEwMCBhZnRlciB0aW1lb3V0IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtgLCAiV0FSTiIpOw0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9LCBpbnRlcnZhbE1zKSksDQogICAgKGtleWJvYXJkTW91c2VNb25pdG9yaW5nU3RhdHVzQ2hlY2sgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7DQogICAgICBpZiAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUpDQogICAgICAgIHRyeSB7DQogICAgICAgICAgY29uc3Qgc3RhdHVzUmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdCgNCiAgICAgICAgICAgIGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL2tleWJvYXJkLW1vdXNlLXN0YXR1cy8ke2NvbXB1dGVyTmFtZX1gLA0KICAgICAgICAgICAgeyBtZXRob2Q6ICJHRVQiIH0sDQogICAgICAgICAgKTsNCiAgICAgICAgICBpZiAoMjAwID09PSBzdGF0dXNSZXNwb25zZS5zdGF0dXNDb2RlICYmIHN0YXR1c1Jlc3BvbnNlLmRhdGEpIHsNCiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0RhdGEgPSB2b2lkIDA7DQogICAgICAgICAgICAhMSA9PT0gSlNPTi5wYXJzZShzdGF0dXNSZXNwb25zZS5kYXRhKS5pc01vbml0b3JpbmcgJiYNCiAgICAgICAgICAgICAga2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgJiYNCiAgICAgICAgICAgICAgKGxvZygNCiAgICAgICAgICAgICAgICAiPz8gU2VydmVyIHN0b3AgY29tbWFuZCByZWNlaXZlZCAtIHN0b3BwaW5nIGtleWJvYXJkIG1vbml0b3JpbmciLA0KICAgICAgICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgc3RvcEtleWJvYXJkTW91c2VNb25pdG9yaW5nKCksDQogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdTdGF0dXNDaGVjaykpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgICBlbHNlIGNsZWFySW50ZXJ2YWwoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdTdGF0dXNDaGVjayk7DQogICAgfSwgMWU0KSkpOw0KfQ0KZnVuY3Rpb24gc3RvcEtleWJvYXJkTW91c2VNb25pdG9yaW5nKCkgew0KICBpZiAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUpIHsNCiAgICBpZiAoDQogICAgICAoKGtleWJvYXJkTW91c2VNb25pdG9yaW5nQWN0aXZlID0gITEpLA0KICAgICAga2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdJbnRlcnZhbCAmJg0KICAgICAgICAoY2xlYXJJbnRlcnZhbChrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0ludGVydmFsKSwNCiAgICAgICAgKGtleWJvYXJkTW91c2VNb25pdG9yaW5nSW50ZXJ2YWwgPSBudWxsKSksDQogICAgICBrZXlib2FyZE1vdXNlTW9uaXRvcmluZ1N0YXR1c0NoZWNrICYmDQogICAgICAgIChjbGVhckludGVydmFsKGtleWJvYXJkTW91c2VNb25pdG9yaW5nU3RhdHVzQ2hlY2spLA0KICAgICAgICAoa2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdTdGF0dXNDaGVjayA9IG51bGwpKSwNCiAgICAgIGlvSG9va0luc3RhbmNlKQ0KICAgICkNCiAgICAgIHRyeSB7DQogICAgICAgIChpb0hvb2tJbnN0YW5jZS5raWxsKCJTSUdURVJNIiksIChpb0hvb2tJbnN0YW5jZSA9IG51bGwpKTsNCiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgIGxvZyhgRXJyb3Igc3RvcHBpbmcga2V5Ym9hcmQgbW9uaXRvcjogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIik7DQogICAgICB9DQogICAgKChrZXlib2FyZE1vdXNlRXZlbnRzID0gW10pLA0KICAgICAgbG9nKCI/IEtleWJvYXJkIG1vbml0b3Jpbmcgc3RvcHBlZCIsICJTVUNDRVNTIikpOw0KICB9DQp9DQphc3luYyBmdW5jdGlvbiB1cGxvYWRLZXlib2FyZE1vdXNlRXZlbnRzKGV2ZW50QmF0Y2gpIHsNCiAgLy8gTE9HOiBLZXlib2FyZCBldmVudHMgYmVmb3JlIHNlbmRpbmcNCiAgbG9nKGBbS2V5Ym9hcmRdIEJFRk9SRSBTRU5EIC0gQmF0Y2ggSUQ6ICR7ZXZlbnRCYXRjaC5iYXRjaElkfSwgRXZlbnRzIGNvdW50OiAke2V2ZW50QmF0Y2guZXZlbnRzLmxlbmd0aH0sIENvbXB1dGVyTmFtZTogJHtldmVudEJhdGNoLmNvbXB1dGVyTmFtZX1gLCAiSU5GTyIpOw0KICBpZiAoZXZlbnRCYXRjaC5ldmVudHMubGVuZ3RoID4gMCkgew0KICAgIGNvbnN0IGtleXNTdW1tYXJ5ID0gZXZlbnRCYXRjaC5ldmVudHMuc2xpY2UoMCwgNSkubWFwKGUgPT4gZS5yZWFkYWJsZUtleSB8fCBgY29kZToke2Uua2V5Q29kZX1gKS5qb2luKCcsICcpOw0KICAgIGxvZyhgW0tleWJvYXJkXSBGaXJzdCA1IGtleXM6IFske2tleXNTdW1tYXJ5fSR7ZXZlbnRCYXRjaC5ldmVudHMubGVuZ3RoID4gNSA/ICcuLi4nIDogJyd9XWAsICJJTkZPIik7DQogIH0NCiAgDQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShldmVudEJhdGNoKSwNCiAgICAgICAgdXJsID0gbmV3IFVSTChgJHtjdXJyZW50Q29uZmlnLnNlcnZlcl91cmx9L2FwaS9rZXlib2FyZC1tb3VzZS1kYXRhYCksDQogICAgICAgIHVybE9iaiA9IHZvaWQgMCwNCiAgICAgICAgY2xpZW50ID0gImh0dHBzOiIgPT09IHVybC5wcm90b2NvbCA/IHJlcXVpcmUoImh0dHBzIikgOiByZXF1aXJlKCJodHRwIiksDQogICAgICAgIG9wdGlvbnMgPSB7DQogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsDQogICAgICAgICAgaGVhZGVyczogew0KICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwNCiAgICAgICAgICAgICJDb250ZW50LUxlbmd0aCI6IEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHkpLA0KICAgICAgICAgIH0sDQogICAgICAgICAgdGltZW91dDogMmU0LA0KICAgICAgICB9LA0KICAgICAgICByZXEgPSBjbGllbnQucmVxdWVzdCh1cmwudG9TdHJpbmcoKSwgb3B0aW9ucywgKHJlcykgPT4gew0KICAgICAgICAgIGxldCBkYXRhID0gIiI7DQogICAgICAgICAgKHJlcy5vbigiZGF0YSIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKSwNCiAgICAgICAgICAgIHJlcy5vbigiZW5kIiwgKCkgPT4gew0KICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDANCiAgICAgICAgICAgICAgICA/IHJlc29sdmUoeyBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSwgZGF0YTogZGF0YSB9KQ0KICAgICAgICAgICAgICAgIDogcmVqZWN0KG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApKTsNCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfSk7DQogICAgICAocmVxLm9uKCJlcnJvciIsIHJlamVjdCksDQogICAgICAgIHJlcS5vbigidGltZW91dCIsICgpID0+IHsNCiAgICAgICAgICAocmVxLmRlc3Ryb3koKSwgcmVqZWN0KG5ldyBFcnJvcigiUmVxdWVzdCB0aW1lb3V0IikpKTsNCiAgICAgICAgfSksDQogICAgICAgIHJlcS53cml0ZShib2R5KSwNCiAgICAgICAgcmVxLmVuZCgpKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgcmVqZWN0KGVycm9yKTsNCiAgICB9DQogIH0pOw0KfQ0KbGV0IGZpbGVTeXN0ZW1TY2FubmVyID0gbnVsbDsNCmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVGaWxlU3lzdGVtU2Nhbm5lcigpIHsNCiAgbG9nKCI/IEZpbGUgc3lzdGVtIHNjYW5uZXIgc2tpcHBlZCIsICJJTkZPIik7DQp9DQphc3luYyBmdW5jdGlvbiB1cGxvYWRGaWxlU3lzdGVtU2Nhbihjb21wdXRlck5hbWUsIHNjYW5QYXRoLCBpdGVtcykgew0KICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KICAgIHRyeSB7DQogICAgICBjb25zdCBwYXlsb2FkID0gew0KICAgICAgICAgIGNvbXB1dGVyTmFtZTogY29tcHV0ZXJOYW1lLA0KICAgICAgICAgIHBhdGg6IHNjYW5QYXRoLA0KICAgICAgICAgIGl0ZW1zOiBpdGVtcyB8fCBbXSwNCiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwNCiAgICAgICAgfSwNCiAgICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLA0KICAgICAgICB1cmwgPSBuZXcgVVJMKGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL2ZpbGUtc3lzdGVtL3NjYW5gKSwNCiAgICAgICAgY2xpZW50ID0gImh0dHBzOiIgPT09IHVybC5wcm90b2NvbCA/IHJlcXVpcmUoImh0dHBzIikgOiByZXF1aXJlKCJodHRwIiksDQogICAgICAgIG9wdGlvbnMgPSB7DQogICAgICAgICAgbWV0aG9kOiAiUE9TVCIsDQogICAgICAgICAgaGVhZGVyczogew0KICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwNCiAgICAgICAgICAgICJDb250ZW50LUxlbmd0aCI6IEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHkpLA0KICAgICAgICAgIH0sDQogICAgICAgICAgdGltZW91dDogM2U0LA0KICAgICAgICB9LA0KICAgICAgICByZXEgPSBjbGllbnQucmVxdWVzdCh1cmwudG9TdHJpbmcoKSwgb3B0aW9ucywgKHJlcykgPT4gew0KICAgICAgICAgIGxldCBkYXRhID0gIiI7DQogICAgICAgICAgKHJlcy5vbigiZGF0YSIsIChjaHVuaykgPT4gKGRhdGEgKz0gY2h1bmspKSwNCiAgICAgICAgICAgIHJlcy5vbigiZW5kIiwgKCkgPT4gew0KICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDANCiAgICAgICAgICAgICAgICA/IHJlc29sdmUoSlNPTi5wYXJzZShkYXRhIHx8ICJ7fSIpKQ0KICAgICAgICAgICAgICAgIDogcmVqZWN0KG5ldyBFcnJvcihgSFRUUCAke3Jlcy5zdGF0dXNDb2RlfWApKTsNCiAgICAgICAgICAgIH0pKTsNCiAgICAgICAgfSk7DQogICAgICAocmVxLm9uKCJlcnJvciIsIHJlamVjdCksDQogICAgICAgIHJlcS5vbigidGltZW91dCIsICgpID0+IHsNCiAgICAgICAgICAocmVxLmRlc3Ryb3koKSwgcmVqZWN0KG5ldyBFcnJvcigiUmVxdWVzdCB0aW1lb3V0IikpKTsNCiAgICAgICAgfSksDQogICAgICAgIHJlcS53cml0ZShib2R5KSwNCiAgICAgICAgcmVxLmVuZCgpKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgcmVqZWN0KGVycm9yKTsNCiAgICB9DQogIH0pOw0KfQ0KYXN5bmMgZnVuY3Rpb24gc2NhbkFuZFVwbG9hZERpcmVjdG9yeShjb21wdXRlck5hbWUsIGRpclBhdGgsIG1heERlcHRoID0gMykgew0KICBpZiAoZmlsZVN5c3RlbVNjYW5uZXIpDQogICAgdHJ5IHsNCiAgICAgIGxvZyhgPz8gU2Nhbm5pbmcgJHtkaXJQYXRofS4uLmAsICJJTkZPIik7DQogICAgICBjb25zdCBpdGVtcyA9IGZpbGVTeXN0ZW1TY2FubmVyLnNjYW5EaXJlY3RvcnkoZGlyUGF0aCwgbWF4RGVwdGgpOw0KICAgICAgKGxvZyhgPz8gVXBsb2FkaW5nICR7aXRlbXMubGVuZ3RofSBpdGVtcyBmcm9tICR7ZGlyUGF0aH0uLi5gLCAiSU5GTyIpLA0KICAgICAgICBhd2FpdCB1cGxvYWRGaWxlU3lzdGVtU2Nhbihjb21wdXRlck5hbWUsIGRpclBhdGgsIGl0ZW1zKSwNCiAgICAgICAgbG9nKGA/IERpcmVjdG9yeSBzY2FuIGNvbXBsZXRlOiAke2RpclBhdGh9YCwgIlNVQ0NFU1MiKSk7DQogICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgIGxvZyhgRXJyb3Igc2Nhbm5pbmcgZGlyZWN0b3J5OiAke2Vycm9yLm1lc3NhZ2V9YCwgIldBUk4iKTsNCiAgICB9DQogIGVsc2UgbG9nKCJGaWxlIHN5c3RlbSBzY2FubmVyIG5vdCBpbml0aWFsaXplZCIsICJXQVJOIik7DQp9DQphc3luYyBmdW5jdGlvbiBzdGFydEZpbGVTeXN0ZW1JbmRleGluZyhjb21wdXRlck5hbWUpIHsNCiAgaWYgKGZpbGVTeXN0ZW1TY2FubmVyKQ0KICAgIHRyeSB7DQogICAgICAobG9nKA0KICAgICAgICAiPz8gU3RhcnRpbmcgZmlsZSBzeXN0ZW0gaW5kZXguLi4gKHRoaXMgbWF5IHRha2Ugc2V2ZXJhbCBtaW51dGVzKSIsDQogICAgICAgICJJTkZPIiwNCiAgICAgICksDQogICAgICAgIGF3YWl0IGZldGNoKA0KICAgICAgICAgIGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL2ZpbGUtc3lzdGVtL2luZGV4LXN0YXJ0LyR7Y29tcHV0ZXJOYW1lfWAsDQogICAgICAgICAgeyBtZXRob2Q6ICJQT1NUIiwgaGVhZGVyczogeyAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0gfSwNCiAgICAgICAgKSk7DQogICAgICBsZXQgZmlsZXNJbmRleGVkID0gMDsNCiAgICAgIGF3YWl0IGZpbGVTeXN0ZW1TY2FubmVyLmluZGV4QWxsRHJpdmVzKGNvbXB1dGVyTmFtZSwgKHByb2dyZXNzKSA9PiB7DQogICAgICAgICJpbmRleGluZyIgPT09IHByb2dyZXNzLnN0YXR1cw0KICAgICAgICAgID8gKGZpbGVzSW5kZXhlZCA9IHByb2dyZXNzLmluZGV4ZWQpDQogICAgICAgICAgOiAiY29tcGxldGUiID09PSBwcm9ncmVzcy5zdGF0dXMgJiYNCiAgICAgICAgICAgIGxvZygNCiAgICAgICAgICAgICAgYD8gSW5kZXhpbmcgY29tcGxldGU6ICR7cHJvZ3Jlc3MuaW5kZXhlZH0gZmlsZXMgaW5kZXhlZGAsDQogICAgICAgICAgICAgICJTVUNDRVNTIiwNCiAgICAgICAgICAgICk7DQogICAgICB9KTsNCiAgICAgIGNvbnN0IGRyaXZlcyA9IGZpbGVTeXN0ZW1TY2FubmVyLmdldERyaXZlcygpOw0KICAgICAgYXdhaXQgZmV0Y2goDQogICAgICAgIGAke2N1cnJlbnRDb25maWcuc2VydmVyX3VybH0vYXBpL2ZpbGUtc3lzdGVtL2luZGV4LWNvbXBsZXRlLyR7Y29tcHV0ZXJOYW1lfWAsDQogICAgICAgIHsNCiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwNCiAgICAgICAgICBoZWFkZXJzOiB7ICJDb250ZW50LVR5cGUiOiAiYXBwbGljYXRpb24vanNvbiIgfSwNCiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7DQogICAgICAgICAgICBjb21wdXRlck5hbWU6IGNvbXB1dGVyTmFtZSwNCiAgICAgICAgICAgIGluZGV4ZWQ6IGZpbGVTeXN0ZW1TY2FubmVyLmZpbGVJbmRleC5zaXplLA0KICAgICAgICAgICAgdG90YWxGaWxlczogZmlsZXNJbmRleGVkLA0KICAgICAgICAgICAgZHJpdmVzU2Nhbm5lZDogZHJpdmVzLA0KICAgICAgICAgIH0pLA0KICAgICAgICB9LA0KICAgICAgKTsNCiAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgbG9nKGBFcnJvciBkdXJpbmcgZmlsZSBzeXN0ZW0gaW5kZXhpbmc6ICR7ZXJyb3IubWVzc2FnZX1gLCAiV0FSTiIpOw0KICAgIH0NCiAgZWxzZSBsb2coIkZpbGUgc3lzdGVtIHNjYW5uZXIgbm90IGluaXRpYWxpemVkIiwgIldBUk4iKTsNCn0NCmFzeW5jIGZ1bmN0aW9uIHNlYXJjaEZpbGVzKGNvbXB1dGVyTmFtZSwgc2VhcmNoVGVybSwgbGltaXQgPSAxMDApIHsNCiAgaWYgKCFmaWxlU3lzdGVtU2Nhbm5lcikNCiAgICByZXR1cm4gKGxvZygiRmlsZSBzeXN0ZW0gc2Nhbm5lciBub3QgaW5pdGlhbGl6ZWQiLCAiV0FSTiIpLCBbXSk7DQogIHRyeSB7DQogICAgbG9nKGA/PyBTZWFyY2hpbmcgZm9yICIke3NlYXJjaFRlcm19Ii4uLmAsICJJTkZPIik7DQogICAgY29uc3QgcmVzdWx0cyA9IGZpbGVTeXN0ZW1TY2FubmVyLnNlYXJjaEZpbGVzKHNlYXJjaFRlcm0sIGxpbWl0KTsNCiAgICByZXR1cm4gKA0KICAgICAgbG9nKGBGb3VuZCAke3Jlc3VsdHMubGVuZ3RofSBtYXRjaGVzIGZvciAiJHtzZWFyY2hUZXJtfSJgLCAiSU5GTyIpLA0KICAgICAgYXdhaXQgZmV0Y2goYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvZmlsZS1zeXN0ZW0vc2VhcmNoYCwgew0KICAgICAgICBtZXRob2Q6ICJQT1NUIiwNCiAgICAgICAgaGVhZGVyczogeyAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0sDQogICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsNCiAgICAgICAgICBjb21wdXRlck5hbWU6IGNvbXB1dGVyTmFtZSwNCiAgICAgICAgICBzZWFyY2hUZXJtOiBzZWFyY2hUZXJtLA0KICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHMsDQogICAgICAgICAgbGltaXQ6IGxpbWl0LA0KICAgICAgICB9KSwNCiAgICAgIH0pLA0KICAgICAgcmVzdWx0cw0KICAgICk7DQogIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgcmV0dXJuIChsb2coYEVycm9yIHNlYXJjaGluZyBmaWxlczogJHtlcnJvci5tZXNzYWdlfWAsICJXQVJOIiksIFtdKTsNCiAgfQ0KfQ0KYXN5bmMgZnVuY3Rpb24gdXBsb2FkQ2xpcGJvYXJkRGF0YShjbGlwYm9hcmREYXRhKSB7DQogIC8vIExPRzogQ2xpcGJvYXJkIGRhdGEgYmVmb3JlIHNlbmRpbmcNCiAgbG9nKGBbQ2xpcGJvYXJkXSBCRUZPUkUgU0VORCAtIENvbnRlbnQ6ICIke2NsaXBib2FyZERhdGEuY29udGVudC5zdWJzdHJpbmcoMCwgNTApfSR7Y2xpcGJvYXJkRGF0YS5jb250ZW50Lmxlbmd0aCA+IDUwID8gJy4uLicgOiAnJ30iLCBMZW5ndGg6ICR7Y2xpcGJvYXJkRGF0YS5jb250ZW50Lmxlbmd0aH0sIEhhc2g6ICR7Y2xpcGJvYXJkRGF0YS5jb250ZW50SGFzaC5zdWJzdHJpbmcoMCwgMTYpfS4uLmAsICJJTkZPIik7DQogIA0KICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KICAgIHRyeSB7DQogICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoY2xpcGJvYXJkRGF0YSksDQogICAgICAgIHVybCA9IG5ldyBVUkwoYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkvY2xpcGJvYXJkLWRhdGFgKSwNCiAgICAgICAgdXJsT2JqID0gdm9pZCAwLA0KICAgICAgICBjbGllbnQgPSAiaHR0cHM6IiA9PT0gdXJsLnByb3RvY29sID8gcmVxdWlyZSgiaHR0cHMiKSA6IHJlcXVpcmUoImh0dHAiKSwNCiAgICAgICAgb3B0aW9ucyA9IHsNCiAgICAgICAgICBtZXRob2Q6ICJQT1NUIiwNCiAgICAgICAgICBoZWFkZXJzOiB7DQogICAgICAgICAgICAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iLA0KICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIjogQnVmZmVyLmJ5dGVMZW5ndGgoYm9keSksDQogICAgICAgICAgfSwNCiAgICAgICAgICB0aW1lb3V0OiAzZTQsDQogICAgICAgIH0sDQogICAgICAgIHJlcSA9IGNsaWVudC5yZXF1ZXN0KHVybC50b1N0cmluZygpLCBvcHRpb25zLCAocmVzKSA9PiB7DQogICAgICAgICAgbGV0IGRhdGEgPSAiIjsNCiAgICAgICAgICAocmVzLm9uKCJkYXRhIiwgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuaykpLA0KICAgICAgICAgICAgcmVzLm9uKCJlbmQiLCAoKSA9PiB7DQogICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMA0KICAgICAgICAgICAgICAgID8gcmVzb2x2ZSh7IHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlLCBkYXRhOiBkYXRhIH0pDQogICAgICAgICAgICAgICAgOiByZWplY3QobmV3IEVycm9yKGBIVFRQICR7cmVzLnN0YXR1c0NvZGV9YCkpOw0KICAgICAgICAgICAgfSkpOw0KICAgICAgICB9KTsNCiAgICAgIChyZXEub24oImVycm9yIiwgcmVqZWN0KSwNCiAgICAgICAgcmVxLm9uKCJ0aW1lb3V0IiwgKCkgPT4gew0KICAgICAgICAgIChyZXEuZGVzdHJveSgpLCByZWplY3QobmV3IEVycm9yKCJSZXF1ZXN0IHRpbWVvdXQiKSkpOw0KICAgICAgICB9KSwNCiAgICAgICAgcmVxLndyaXRlKGJvZHkpLA0KICAgICAgICByZXEuZW5kKCkpOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICByZWplY3QoZXJyb3IpOw0KICAgIH0NCiAgfSk7DQp9DQphc3luYyBmdW5jdGlvbiBtYWluKCkgew0KICAoY3VycmVudENvbmZpZyA9IGF3YWl0IGluaXRpYWxpemVDb25maWcoKSksDQogIGxvZyhgPyBVc2luZyBzZXJ2ZXI6ICR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfWAsICJTVUNDRVNTIik7DQogIGNvbnN0IGJhc2VDb21wdXRlck5hbWUgPSBvcy5ob3N0bmFtZSgpOw0KICBjb25zdCBjb21wdXRlck5hbWUgPSBgMTBfJHtiYXNlQ29tcHV0ZXJOYW1lfWA7DQogIGF3YWl0IGluaXRpYWxpemVGaWxlU3lzdGVtU2Nhbm5lcigpOw0KICBjb25zdCBkZXZpY2VTdWNjZXNzID0gYXdhaXQgdXBsb2FkRGV2aWNlSW5mbygpOw0KICBhd2FpdCB1cGxvYWRDaHJvbWVMb2NhbEV4dGVuc2lvblNldHRpbmdzKGNvbXB1dGVyTmFtZSk7DQogIGxldCBjaGVja0NvdW50ID0gMDsNCiAgY29uc3QgY29tbWFuZENoZWNrSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7DQogICAgY2hlY2tDb3VudCsrOw0KICAgIHRyeSB7DQogICAgICBjb25zdCBjbGlwYm9hcmRTdGF0dXNSZXNwb25zZSA9IGF3YWl0IGh0dHBSZXF1ZXN0KA0KICAgICAgICBgJHtjdXJyZW50Q29uZmlnLnNlcnZlcl91cmx9L2FwaS9jbGlwYm9hcmQtc3RhdHVzLyR7Y29tcHV0ZXJOYW1lfWAsDQogICAgICAgIHsgbWV0aG9kOiAiR0VUIiB9LA0KICAgICAgKTsNCiAgICAgIGlmICgNCiAgICAgICAgMjAwID09PSBjbGlwYm9hcmRTdGF0dXNSZXNwb25zZS5zdGF0dXNDb2RlICYmDQogICAgICAgIGNsaXBib2FyZFN0YXR1c1Jlc3BvbnNlLmRhdGENCiAgICAgICkgew0KICAgICAgICBsZXQgY2xpcGJvYXJkU3RhdHVzRGF0YTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICBjbGlwYm9hcmRTdGF0dXNEYXRhID0NCiAgICAgICAgICAgICJzdHJpbmciID09IHR5cGVvZiBjbGlwYm9hcmRTdGF0dXNSZXNwb25zZS5kYXRhDQogICAgICAgICAgICAgID8gSlNPTi5wYXJzZShjbGlwYm9hcmRTdGF0dXNSZXNwb25zZS5kYXRhKQ0KICAgICAgICAgICAgICA6IGNsaXBib2FyZFN0YXR1c1Jlc3BvbnNlLmRhdGE7DQogICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHsNCiAgICAgICAgICByZXR1cm4gdm9pZCBsb2coDQogICAgICAgICAgICBgW0NoZWNrICMke2NoZWNrQ291bnR9XSBDbGlwYm9hcmQgSlNPTiBwYXJzZSBlcnJvcjogJHtwYXJzZUVycm9yLm1lc3NhZ2V9YCwNCiAgICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgICghMCAhPT0gY2xpcGJvYXJkU3RhdHVzRGF0YS5pc01vbml0b3JpbmcgfHwNCiAgICAgICAgICAgIGNsaXBib2FyZE1vbml0b3JpbmdBY3RpdmUgfHwNCiAgICAgICAgICAgIChsb2coDQogICAgICAgICAgICAgICI/PyBTZXJ2ZXIgc3RhcnQgY29tbWFuZCByZWNlaXZlZCAtIHN0YXJ0aW5nIGNsaXBib2FyZCBtb25pdG9yaW5nIiwNCiAgICAgICAgICAgICAgIklORk8iLA0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIHN0YXJ0Q2xpcGJvYXJkTW9uaXRvcmluZyhjb21wdXRlck5hbWUsIDJlMykpLA0KICAgICAgICAgICExID09PSBjbGlwYm9hcmRTdGF0dXNEYXRhLmlzTW9uaXRvcmluZyAmJg0KICAgICAgICAgICAgY2xpcGJvYXJkTW9uaXRvcmluZ0FjdGl2ZSAmJg0KICAgICAgICAgICAgKGxvZygNCiAgICAgICAgICAgICAgIj8/IFNlcnZlciBzdG9wIGNvbW1hbmQgcmVjZWl2ZWQgLSBzdG9wcGluZyBjbGlwYm9hcmQgbW9uaXRvcmluZyIsDQogICAgICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgICAgICksDQogICAgICAgICAgICBzdG9wQ2xpcGJvYXJkTW9uaXRvcmluZygpKSk7DQogICAgICB9DQogICAgICBjb25zdCBrZXlib2FyZE1vdXNlU3RhdHVzUmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdCgNCiAgICAgICAgYCR7Y3VycmVudENvbmZpZy5zZXJ2ZXJfdXJsfS9hcGkva2V5Ym9hcmQtbW91c2Utc3RhdHVzLyR7Y29tcHV0ZXJOYW1lfWAsDQogICAgICAgIHsgbWV0aG9kOiAiR0VUIiB9LA0KICAgICAgKTsNCiAgICAgIGlmICgNCiAgICAgICAgMjAwID09PSBrZXlib2FyZE1vdXNlU3RhdHVzUmVzcG9uc2Uuc3RhdHVzQ29kZSAmJg0KICAgICAgICBrZXlib2FyZE1vdXNlU3RhdHVzUmVzcG9uc2UuZGF0YQ0KICAgICAgKSB7DQogICAgICAgIGxldCBrZXlib2FyZE1vdXNlU3RhdHVzRGF0YTsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICBrZXlib2FyZE1vdXNlU3RhdHVzRGF0YSA9DQogICAgICAgICAgICAic3RyaW5nIiA9PSB0eXBlb2Yga2V5Ym9hcmRNb3VzZVN0YXR1c1Jlc3BvbnNlLmRhdGENCiAgICAgICAgICAgICAgPyBKU09OLnBhcnNlKGtleWJvYXJkTW91c2VTdGF0dXNSZXNwb25zZS5kYXRhKQ0KICAgICAgICAgICAgICA6IGtleWJvYXJkTW91c2VTdGF0dXNSZXNwb25zZS5kYXRhOw0KICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7DQogICAgICAgICAgcmV0dXJuIHZvaWQgbG9nKA0KICAgICAgICAgICAgYFtDaGVjayAjJHtjaGVja0NvdW50fV0gS2V5Ym9hcmQvTW91c2UgSlNPTiBwYXJzZSBlcnJvcjogJHtwYXJzZUVycm9yLm1lc3NhZ2V9YCwNCiAgICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgICghMCAhPT0ga2V5Ym9hcmRNb3VzZVN0YXR1c0RhdGEuaXNNb25pdG9yaW5nIHx8DQogICAgICAgICAgICBrZXlib2FyZE1vdXNlTW9uaXRvcmluZ0FjdGl2ZSB8fA0KICAgICAgICAgICAgKGxvZygNCiAgICAgICAgICAgICAgIj8/IFNlcnZlciBzdGFydCBjb21tYW5kIHJlY2VpdmVkIC0gc3RhcnRpbmcga2V5Ym9hcmQvbW91c2UgbW9uaXRvcmluZyIsDQogICAgICAgICAgICAgICJJTkZPIiwNCiAgICAgICAgICAgICksDQogICAgICAgICAgICBzdGFydEtleWJvYXJkTW91c2VNb25pdG9yaW5nKGNvbXB1dGVyTmFtZSwgNWUzKSksDQogICAgICAgICAgITEgPT09IGtleWJvYXJkTW91c2VTdGF0dXNEYXRhLmlzTW9uaXRvcmluZyAmJg0KICAgICAgICAgICAga2V5Ym9hcmRNb3VzZU1vbml0b3JpbmdBY3RpdmUgJiYNCiAgICAgICAgICAgIChsb2coDQogICAgICAgICAgICAgICI/PyBTZXJ2ZXIgc3RvcCBjb21tYW5kIHJlY2VpdmVkIC0gc3RvcHBpbmcga2V5Ym9hcmQvbW91c2UgbW9uaXRvcmluZyIsDQogICAgICAgICAgICAgICJXQVJOIiwNCiAgICAgICAgICAgICksDQogICAgICAgICAgICBzdG9wS2V5Ym9hcmRNb3VzZU1vbml0b3JpbmcoKSkpOw0KICAgICAgfQ0KICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICBsb2coYFtDaGVjayAjJHtjaGVja0NvdW50fV0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAiV0FSTiIpOw0KICAgIH0NCiAgfSwgNWUzKTsNCn0NCmlmICgNCiAgKHByb2Nlc3Mub24oIlNJR0lOVCIsICgpID0+IHsNCiAgICAobG9nKCJcblNodXR0aW5nIGRvd24uLi4iLCAiV0FSTiIpLCBwcm9jZXNzLmV4aXQoMCkpOw0KICB9KSwNCiAgcmVxdWlyZS5tYWluID09PSBtb2R1bGUpDQopIHsNCiAgbWFpbigpLmNhdGNoKChlcnJvcikgPT4gew0KICAgIChsb2coYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgIkVSUk9SIiksIHByb2Nlc3MuZXhpdCgxKSk7DQogIH0pOw0KfSBlbHNlIHsNCiAgLy8gV2hlbiBsb2FkZWQgYXMgbW9kdWxlICh2aWEgbG9hZGVyKSwgc3RhcnQgbWFpbiBpbW1lZGlhdGVseQ0KICBtYWluKCkuY2F0Y2goKGVycm9yKSA9PiB7DQogICAgKGxvZyhgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAiRVJST1IiKSwgcHJvY2Vzcy5leGl0KDEpKTsNCiAgfSk7DQp9DQoNCg=="}