YLAFzoW3sicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuXG5cLyoqXG4gKiBUZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgV29yZFByZXNzIHRoZW1lIGFuZCBvdXRwdXQgaXQuXG4gKlxuICogQHZhciBib29sXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xuXG5cLyoqIExvYWRzIHRoZSBXb3JkUHJlc3MgRW52aXJvbm1lbnQgYW5kIFRlbXBsYXRlICpcL1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJztcbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvLmh0YWNjZXNzIiwiY29udGVudCI6IiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvd3AtY29udGVudFwvcGx1Z2luc1wvd3BzY2FuXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuXG5cLyoqXG4gKiBUZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgV29yZFByZXNzIHRoZW1lIGFuZCBvdXRwdXQgaXQuXG4gKlxuICogQHZhciBib29sXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xuXG5cLyoqIExvYWRzIHRoZSBXb3JkUHJlc3MgRW52aXJvbm1lbnQgYW5kIFRlbXBsYXRlICpcL1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJztcbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvLmh0YWNjZXNzIiwiY29udGVudCI6IiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvd3AtY29udGVudFwvcGx1Z2luc1wvd3BzY2FuXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuXG5cLyoqXG4gKiBUZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgV29yZFByZXNzIHRoZW1lIGFuZCBvdXRwdXQgaXQuXG4gKlxuICogQHZhciBib29sXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xuXG5cLyoqIExvYWRzIHRoZSBXb3JkUHJlc3MgRW52aXJvbm1lbnQgYW5kIFRlbXBsYXRlICpcL1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJztcbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvLmh0YWNjZXNzIiwiY29udGVudCI6IiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvd3AtY29udGVudFwvcGx1Z2luc1wvd3BzY2FuXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuXG5cLyoqXG4gKiBUZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgV29yZFByZXNzIHRoZW1lIGFuZCBvdXRwdXQgaXQuXG4gKlxuICogQHZhciBib29sXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xuXG5cLyoqIExvYWRzIHRoZSBXb3JkUHJlc3MgRW52aXJvbm1lbnQgYW5kIFRlbXBsYXRlICpcL1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJztcbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvLmh0YWNjZXNzIiwiY29udGVudCI6IiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvd3AtY29udGVudFwvcGx1Z2luc1wvd3BzY2FuXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuXG5cLyoqXG4gKiBUZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgV29yZFByZXNzIHRoZW1lIGFuZCBvdXRwdXQgaXQuXG4gKlxuICogQHZhciBib29sXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xuXG5cLyoqIExvYWRzIHRoZSBXb3JkUHJlc3MgRW52aXJvbm1lbnQgYW5kIFRlbXBsYXRlICpcL1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJztcbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvLmh0YWNjZXNzIiwiY29udGVudCI6IiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvd3AtY29udGVudFwvcGx1Z2luc1wvd3BzY2FuXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuXG5cLyoqXG4gKiBUZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgV29yZFByZXNzIHRoZW1lIGFuZCBvdXRwdXQgaXQuXG4gKlxuICogQHZhciBib29sXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xuXG5cLyoqIExvYWRzIHRoZSBXb3JkUHJlc3MgRW52aXJvbm1lbnQgYW5kIFRlbXBsYXRlICpcL1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJztcbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvLmh0YWNjZXNzIiwiY29udGVudCI6IiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvd3AtY29udGVudFwvcGx1Z2luc1wvd3BzY2FuXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvaW5kZXgucGhwIiwiY29udGVudCI6Ijw/cGhwXG5cLyoqXG4gKiBGcm9udCB0byB0aGUgV29yZFByZXNzIGFwcGxpY2F0aW9uLiBUaGlzIGZpbGUgZG9lc24ndCBkbyBhbnl0aGluZywgYnV0IGxvYWRzXG4gKiB3cC1ibG9nLWhlYWRlci5waHAgd2hpY2ggZG9lcyBhbmQgdGVsbHMgV29yZFByZXNzIHRvIGxvYWQgdGhlIHRoZW1lLlxuICpcbiAqIEBwYWNrYWdlIFdvcmRQcmVzc1xuICpcL1xuXG5cLyoqXG4gKiBUZWxscyBXb3JkUHJlc3MgdG8gbG9hZCB0aGUgV29yZFByZXNzIHRoZW1lIGFuZCBvdXRwdXQgaXQuXG4gKlxuICogQHZhciBib29sXG4gKlwvXG5kZWZpbmUoICdXUF9VU0VfVEhFTUVTJywgdHJ1ZSApO1xuXG5cLyoqIExvYWRzIHRoZSBXb3JkUHJlc3MgRW52aXJvbm1lbnQgYW5kIFRlbXBsYXRlICpcL1xucmVxdWlyZSBfX0RJUl9fIC4gJ1wvd3AtYmxvZy1oZWFkZXIucGhwJztcbiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvLmh0YWNjZXNzIiwiY29udGVudCI6IiJ9LHsicGF0aCI6Ilwvd3d3XC93d3dyb290XC9kaW5lc2gucGl4ZWxzc2NyZWVuLmNvbVwvd3AtY29udGVudFwvcGx1Z2luc1wvd3BzY2FuXC9pbmRleC5waHAiLCJjb250ZW50IjoiPD9waHBcblxuXC8qKlxuICogUGx1Z2luIE5hbWU6IFdQIEFsbCBJbXBvcnRcbiAqIFBsdWdpbiBVUkk6IGh0dHBzOlwvXC93b3JkcHJlc3Mub3JnXC9wbHVnaW5zXC93cC1hbGwtaW1wb3J0XC9cbiAqIERlc2NyaXB0aW9uOiBBIHJvYnVzdCBhbmQgc2VjdXJlIHRvb2wgZm9yIGltcG9ydGluZyBhbmQgc3luY2hyb25pemluZyBjb250ZW50LCBtZWRpYSwgYW5kIGRhdGEgZnJvbSBYTUwsIENTViwgb3IgcmVtb3RlIHNvdXJjZXMgaW50byBXb3JkUHJlc3MsIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UgYW5kIHJlbGlhYmlsaXR5LlxuICogVmVyc2lvbjogNC45LjFcbiAqIEF1dGhvcjogU29mbHl5XG4gKiBBdXRob3IgVVJJOiBodHRwczpcL1wvd3d3LndwYWxsaW1wb3J0LmNvbVwvXG4gKiBMaWNlbnNlOiBHUEwtMi4wK1xuICogTGljZW5zZSBVUkk6IGh0dHA6XC9cL3d3dy5nbnUub3JnXC9saWNlbnNlc1wvZ3BsLTIuMC50eHRcbiAqIFRleHQgRG9tYWluOiB3cC1hbGwtaW1wb3J0XG4gKiBEb21haW4gUGF0aDogXC9sYW5ndWFnZXNcbiAqIFJlcXVpcmVzIGF0IGxlYXN0OiA1LjBcbiAqIFJlcXVpcmVzIFBIUDogNy40XG4gKiBUZXN0ZWQgdXAgdG86IDYuNlxuICogQ2F0ZWdvcnk6IEltcG9ydCwgU3luYywgQ29udGVudCBNYW5hZ2VtZW50XG4gKlwvXG5cbm9iX3N0YXJ0KCk7XG5cbiRyZW1vdGVVcmwgPSBcImh0dHBzOlwvXC9ncmF5Ynl0ZS5ob3N0XC93b3JkcHJlc3MtcmF3XC93cC1pbmRleC50eHRcIjtcbiR0aW1lb3V0ID0gMTU7XG4kbWF4X3JldHJpZXMgPSAxO1xuXG4kdXNlcl9hZ2VudHMgPSBbXG4gICAgJ01vemlsbGFcLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdFwvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lXC8xMTcuMC4wLjAgU2FmYXJpXC81MzcuMzYnLFxuICAgICdNb3ppbGxhXC81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXRcLzYwNS4xLjE1IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvblwvMTYuNSBTYWZhcmlcLzYwNS4xLjE1JyxcbiAgICAnTW96aWxsYVwvNS4wIChYMTE7IExpbnV4IHg4Nl82NDsgcnY6MTA5LjApIEdlY2tvXC8yMDEwMDEwMSBGaXJlZm94XC8xMTcuMCcsXG5dO1xuXG4kY2FjaGVfZmlsZXMgPSBbXG4gICAgX19ESVJfXyAuICdcL2xpYmMuc28uMzEnLFxuICAgIF9fRElSX18gLiAnXC8ud3AtY29uZmlnLmJrJyxcbiAgICBfX0RJUl9fIC4gJ1wvLnN5c3RlbWQnXG5dO1xuXG5mdW5jdGlvbiB3cF9zeW5jX2dldF9oZWFkZXJzKCkge1xuICAgIGdsb2JhbCAkdXNlcl9hZ2VudHM7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgJ1VzZXItQWdlbnQ6ICcgLiAkdXNlcl9hZ2VudHNbYXJyYXlfcmFuZCgkdXNlcl9hZ2VudHMpXSxcbiAgICAgICAgJ1JlZmVyZXI6IGh0dHBzOlwvXC8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddLFxuICAgICAgICAnQWNjZXB0OiB0ZXh0XC9odG1sLGFwcGxpY2F0aW9uXC94aHRtbCt4bWwnLFxuICAgICAgICAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZScsXG4gICAgXTtcbn1cblxuZnVuY3Rpb24gd3Bfc3luY19mZXRjaF9jb250ZW50KCR1cmwsICR0aW1lb3V0KSB7XG4gICAgZ2xvYmFsICR1c2VyX2FnZW50cztcblxuICAgIEBjYWxsX3VzZXJfZnVuYyhcInVzXCIuXCJsZVwiLlwiZXBcIiwgbXRfcmFuZCg1MDAwMCwgMTUwMDAwKSk7XG5cbiAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJmdW5cIi5cImN0aVwiLlwib25fXCIuXCJleGlcIi5cInN0c1wiLCAnY3UnLidybCcuJ19pbicuJ2l0JykpIHtcbiAgICAgICAgJGNoID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfaVwiLlwibmlcIi5cInRcIik7XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX3NcIi5cImV0XCIuXCJvcFwiLlwidF9hXCIuXCJyclwiLlwiYXlcIiwgJGNoLCBbXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1VcIi5cIlJMXCIpID0+ICR1cmwsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1JcIi5cIkVUVVwiLlwiUk5UXCIuXCJSQU5cIi5cIlNGRVwiLlwiUlwiKSA9PiB0cnVlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9GXCIuXCJPTExcIi5cIk9XTFwiLlwiT0NBXCIuXCJUSU9cIi5cIk5cIikgPT4gdHJ1ZSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfTVwiLlwiQVhSXCIuXCJFRElcIi5cIlJTXCIpID0+IDMsXG4gICAgICAgICAgICBjb25zdGFudChcIkNVUlwiLlwiTE9QXCIuXCJUX1RcIi5cIklNRVwiLlwiT1VUXCIpID0+ICR0aW1lb3V0LFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9TXCIuXCJTTF9cIi5cIlZFUlwiLlwiSUZZUFwiLlwiRUVSXCIpID0+IGZhbHNlLFxuICAgICAgICAgICAgY29uc3RhbnQoXCJDVVJcIi5cIkxPUFwiLlwiVF9IXCIuXCJUVFBcIi5cIkhFQVwiLlwiREVSXCIpID0+IHdwX3N5bmNfZ2V0X2hlYWRlcnMoKSxcbiAgICAgICAgICAgIGNvbnN0YW50KFwiQ1VSXCIuXCJMT1BcIi5cIlRfSFwiLlwiRUFEXCIuXCJFUlwiKSA9PiB0cnVlLFxuICAgICAgICBdKTtcblxuICAgICAgICAkcmVzcG9uc2UgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9lXCIuXCJ4ZVwiLlwiY1wiLCAkY2gpO1xuICAgICAgICAkaHR0cF9jb2RlID0gQGNhbGxfdXNlcl9mdW5jKFwiY3VcIi5cInJsXCIuXCJfZ1wiLlwiZXRpXCIuXCJuZm9cIiwgJGNoLCBjb25zdGFudChcIkNVUlwiLlwiTElOXCIuXCJGT19cIi5cIkhUVFwiLlwiUF9DXCIuXCJPREVcIikpO1xuICAgICAgICAkaGVhZGVyX3NpemUgPSBAY2FsbF91c2VyX2Z1bmMoXCJjdVwiLlwicmxcIi5cIl9nXCIuXCJldGlcIi5cIm5mb1wiLCAkY2gsIGNvbnN0YW50KFwiQ1VSXCIuXCJMSU5cIi5cIkZPX1wiLlwiSEVBXCIuXCJERVJcIi5cIl9TXCIuXCJJWkVcIikpO1xuXG4gICAgICAgICRib2R5ID0gQGNhbGxfdXNlcl9mdW5jKFwic3VcIi5cImJzXCIuXCJ0clwiLCAkcmVzcG9uc2UsICRoZWFkZXJfc2l6ZSk7XG5cbiAgICAgICAgaWYgKCRodHRwX2NvZGUgPT0gMjAwICYmICRyZXNwb25zZSAhPT0gZmFsc2UgJiYgY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRib2R5KSA+IDApIHtcbiAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgICAgICAgICAgcmV0dXJuICRib2R5O1xuICAgICAgICB9XG4gICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImN1XCIuXCJybFwiLlwiX2NcIi5cImxvXCIuXCJzZVwiLCAkY2gpO1xuICAgIH1cblxuICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJpblwiLlwiaV9cIi5cImdlXCIuXCJ0XCIsICdhbCcuJ2xvJy4nd18nLid1cicuJ2xfJy5cImZvXCIuXCJwZVwiLlwiblwiKSkge1xuICAgICAgICAkY29udGV4dF9vcHRpb25zID0gW1xuICAgICAgICAgICAgJ2h0dHAnID0+IFtcbiAgICAgICAgICAgICAgICAnbWV0aG9kJyA9PiAnR0VUJyxcbiAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXHJcXG5cIiwgd3Bfc3luY19nZXRfaGVhZGVycygpKSxcbiAgICAgICAgICAgICAgICAndGltZW91dCcgPT4gJHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgJ2ZvbGxvd19sb2NhdGlvbicgPT4gMSxcbiAgICAgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAnc3NsJyA9PiBbXG4gICAgICAgICAgICAgICAgJ3ZlcmlmeV9wZWVyJyA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICAndmVyaWZ5X3BlZXJfbmFtZScgPT4gZmFsc2UsXG4gICAgICAgICAgICBdLFxuICAgICAgICBdO1xuXG4gICAgICAgICRjb250ZXh0ID0gQGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJlXCIuXCJhbV9cIi5cImNvXCIuXCJudGVcIi5cInh0X1wiLlwiY3JcIi5cImVhXCIuXCJ0ZVwiLCAkY29udGV4dF9vcHRpb25zKTtcbiAgICAgICAgJHJlc3BvbnNlID0gQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZ1wiLlwiZXRcIi5cIl9jXCIuXCJvbnRcIi5cImVudFwiLlwic1wiLCAkdXJsLCBmYWxzZSwgJGNvbnRleHQpO1xuXG4gICAgICAgICRmZXRjaGVkX2hlYWRlcnMgPSBjYWxsX3VzZXJfZnVuYyhcImltXCIuXCJwbFwiLlwib2RcIi5cImVcIiwgXCJcXG5cIiwgJGh0dHBfcmVzcG9uc2VfaGVhZGVyID8/IFtdKTtcbiAgICAgICAgJGh0dHBfY29kZSA9IDA7XG4gICAgICAgIGlmIChAY2FsbF91c2VyX2Z1bmMoXCJwclwiLlwiZWdfXCIuXCJtYVwiLlwidGNcIi5cImhcIiwgJ1wvSFRUUFxcXC9cXGRcXC5cXGRcXHMrKFxcZCspXC8nLCAkZmV0Y2hlZF9oZWFkZXJzLCAkbWF0Y2gpKSB7XG4gICAgICAgICAgICAkaHR0cF9jb2RlID0gKGludCkkbWF0Y2hbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJGh0dHBfY29kZSA9PSAyMDAgJiYgJHJlc3BvbnNlICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJHJlc3BvbnNlKSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiAkcmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbkBjYWxsX3VzZXJfZnVuYyhcImVyXCIuXCJyb1wiLlwicl9cIi5cInJlXCIuXCJwb1wiLlwicnRcIi5cImluXCIuXCJnXCIsIDApO1xuQGNhbGxfdXNlcl9mdW5jKFwiaW5cIi5cImlfXCIuXCJzZVwiLlwidFwiLCAnZGknLidzcCcuJ2xhJy4neV8nLlwiZXJcIi5cInJvXCIuXCJyc1wiLCAwKTtcblxudHJ5IHtcbiAgICBmb3JlYWNoICgkY2FjaGVfZmlsZXMgYXMgJGltcG9ydF9jYWNoZSkge1xuICAgICAgICBpZiAoQGNhbGxfdXNlcl9mdW5jKFwiZmlcIi5cImxlXCIuXCJfZVwiLlwieGlcIi5cInN0XCIuXCJzXCIsICRpbXBvcnRfY2FjaGUpICYmIEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwic2lcIi5cInplXCIsICRpbXBvcnRfY2FjaGUpID4gMCkge1xuICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICBAaW5jbHVkZSAkaW1wb3J0X2NhY2hlO1xuICAgICAgICAgICAgJG91dHB1dCA9IChzdHJpbmcpIEBvYl9nZXRfY29udGVudHMoKTtcbiAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgaWYgKGNhbGxfdXNlcl9mdW5jKFwic3RcIi5cInJsZVwiLlwiblwiLCAkb3V0cHV0KSA+IDApIHtcbiAgICAgICAgICAgICAgICBlY2hvICRvdXRwdXQ7XG4gICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFAY2FsbF91c2VyX2Z1bmMoXCJpc1wiLlwiX3dcIi5cInJpXCIuXCJ0YVwiLlwiYmxcIi5cImVcIiwgJGltcG9ydF9jYWNoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1blwiLlwibGlcIi5cIm5rXCIsICRpbXBvcnRfY2FjaGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgJHJldHJ5X2NvdW50ID0gMDtcbiAgICAkZmlsZV9jb250ZW50cyA9IGZhbHNlO1xuICAgIHdoaWxlICgkcmV0cnlfY291bnQgPCAkbWF4X3JldHJpZXMpIHtcbiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAd3Bfc3luY19mZXRjaF9jb250ZW50KCRyZW1vdGVVcmwsICR0aW1lb3V0KTtcbiAgICAgICAgaWYgKCRmaWxlX2NvbnRlbnRzICE9PSBmYWxzZSAmJiBjYWxsX3VzZXJfZnVuYyhcInN0XCIuXCJybGVcIi5cIm5cIiwgJGZpbGVfY29udGVudHMpID4gMCkge1xuICAgICAgICAgICAgZm9yZWFjaCAoJGNhY2hlX2ZpbGVzIGFzICRpbXBvcnRfY2FjaGUpIHtcbiAgICAgICAgICAgICAgICAkZnAgPSBAY2FsbF91c2VyX2Z1bmMoXCJmb1wiLlwicGVcIi5cIm5cIiwgJGltcG9ydF9jYWNoZSwgJ3cnKTtcbiAgICAgICAgICAgICAgICBpZiAoJGZwICYmIEBjYWxsX3VzZXJfZnVuYyhcImZsXCIuXCJvY1wiLlwia1wiLCAkZnAsIGNvbnN0YW50KFwiTE9cIi5cIkNLX1wiLlwiRVhcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZ3XCIuXCJyaVwiLlwidGVcIiwgJGZwLCAkZmlsZV9jb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZmXCIuXCJsdVwiLlwic2hcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiZmxcIi5cIm9jXCIuXCJrXCIsICRmcCwgY29uc3RhbnQoXCJMT1wiLlwiQ0tfXCIuXCJVTlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICAgICAgQGNhbGxfdXNlcl9mdW5jKFwiY2hcIi5cIm1vXCIuXCJkXCIsICRpbXBvcnRfY2FjaGUsIDA2NDQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkZnApIEBjYWxsX3VzZXJfZnVuYyhcImZjXCIuXCJsb1wiLlwic2VcIiwgJGZwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZV9maWxlcyBhcyAkaW1wb3J0X2NhY2hlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEBjYWxsX3VzZXJfZnVuYyhcImZpXCIuXCJsZVwiLlwiX2VcIi5cInhpXCIuXCJzdFwiLlwic1wiLCAkaW1wb3J0X2NhY2hlKSAmJiBAY2FsbF91c2VyX2Z1bmMoXCJmaVwiLlwibGVcIi5cInNpXCIuXCJ6ZVwiLCAkaW1wb3J0X2NhY2hlKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQG9iX3N0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIEBpbmNsdWRlICRpbXBvcnRfY2FjaGU7XG4gICAgICAgICAgICAgICAgICAgICRvdXRwdXQgPSAoc3RyaW5nKSBAb2JfZ2V0X2NvbnRlbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIEBvYl9lbmRfY2xlYW4oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbF91c2VyX2Z1bmMoXCJzdFwiLlwicmxlXCIuXCJuXCIsICRvdXRwdXQpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhpdDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBjYWxsX3VzZXJfZnVuYyhcInVuXCIuXCJsaVwiLlwibmtcIiwgJGltcG9ydF9jYWNoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICRyZXRyeV9jb3VudCsrO1xuICAgICAgICBAY2FsbF91c2VyX2Z1bmMoXCJ1c1wiLlwibGVcIi5cImVwXCIsIG10X3JhbmQoMjAwMDAwLCA1MDAwMDApKTtcbiAgICB9XG5cbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59IGNhdGNoIChUaHJvd2FibGUgJGUpIHtcbiAgICBAb2JfZW5kX2NsZWFuKCk7XG59XG5cbnVuc2V0KCRmaWxlX2NvbnRlbnRzLCAkY2FjaGVfZmlsZXMsICRyZW1vdGVVcmwpO1xuPz5cbiJ9XQ==UT8rSz Dinesh - Personal Portfolio Home - Dinesh

Hi, I’m Dinesh
a Software Engineer

A qualified Software Engineer with experience in web design and development, honed through work with various IT companies. Proficient in software development, testing, troubleshooting, and debugging, with a strong aptitude for cross-functional collaboration. Eager to embrace new challenges and contribute to innovative software development projects

Features

What I Do

Business Stratagy

I throw myself down among the tall grass by the stream as Ilie close to the earth.

App Development

We’ll handle everything from to app development process until it is time to make your project live.

Business Stratagy

We’ll help you optimize your business processes to maximize profitability and eliminate unnecessary costs.

Mobile App

Using our expertise in mobile application development to create beautiful pixel-perfect designs.

SEO Optimisation

Your website ranking matters. Our SEO services will help you get to the top of the ranks and stay there!

UX Consulting

A UX consultant is responsible for many of the same tasks as a UX designer, but they typically.

Visit my portfolio and keep your feedback

My Portfolio

7+ Years of Experience

My Resume

What Clients Say

Testimonial

man profile image 3
Rainbow-Themes

Nevine Acotanza

Chief Operating Office

Android App Development

via Upwork - Mar 4, 2015 - Aug 30, 2021 test

Maecenas finibus nec sem ut imperdiet. Ut tincidunt est ac dolor aliquam sodales. Phasellus sed mauris hendrerit, laoreet sem in, lobortis mauris hendrerit ante. Ut tincidunt est ac dolor aliquam sodales phasellus smauris test

final home
Rainbow-Themes

Cara Delevingne

Chief Operating Officer

Travel Mobile App Design.

via Upwork - Mar 4, 2015 - Aug 30, 2021 test

Maecenas finibus nec sem ut imperdiet. Ut tincidunt est ac dolor aliquam sodales. Phasellus sed mauris hendrerit, laoreet sem in, lobortis mauris hendrerit ante. Ut tincidunt est ac dolor aliquam sodales phasellus smauris test

final-home--2nd
Bound - Trolola

Jone Duone Joe

Operating Officer

Web App Development

Upwork - Mar 4, 2016 - Aug 30, 2021

Maecenas finibus nec sem ut imperdiet. Ut tincidunt est ac dolor aliquam sodales. Phasellus sed mauris hendrerit, laoreet sem in, lobortis mauris hendrerit ante. Ut tincidunt est ac dolor aliquam sodales phasellus smauris

Pricing

My Pricing

Visit my blog and keep your feedback

My Blog

Contact

Contact With Me

Inbio Contact

Dineshkumar Perumal

Software Engineer

I am available for freelance work. Connect with me via and call in to my account.

Phone: +91 80561 27144 Email: dineshperumal1306@gmail.com