ZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9BdWRpb19tYWMucHkgYi9MaWIvcGxhdC1tYWMvQXVkaW9fbWFjLnB5CmluZGV4IGJmOTk3ODcuLjUzNTBlNTUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9BdWRpb19tYWMucHkKKysrIGIvTGliL3BsYXQtbWFjL0F1ZGlvX21hYy5weQpAQCAtMywxMTkgKzMsMTE5IEBACiAKIGNsYXNzIFBsYXlfQXVkaW9fbWFjOgogCi0JZGVmIF9faW5pdF9fKHNlbGYsIHFzaXplPVFTSVpFKToKLQkJc2VsZi5fY2hhbiA9IE5vbmUKLQkJc2VsZi5fcXNpemUgPSBxc2l6ZQotCQlzZWxmLl9vdXRyYXRlID0gMjIyNTQKLQkJc2VsZi5fc2FtcHdpZHRoID0gMQotCQlzZWxmLl9uY2hhbm5lbHMgPSAxCi0JCXNlbGYuX2djID0gW10KLQkJc2VsZi5fdXNlcmNhbGxiYWNrID0gTm9uZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBxc2l6ZT1RU0laRSk6CisgICAgICAgIHNlbGYuX2NoYW4gPSBOb25lCisgICAgICAgIHNlbGYuX3FzaXplID0gcXNpemUKKyAgICAgICAgc2VsZi5fb3V0cmF0ZSA9IDIyMjU0CisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IDEKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gMQorICAgICAgICBzZWxmLl9nYyA9IFtdCisgICAgICAgIHNlbGYuX3VzZXJjYWxsYmFjayA9IE5vbmUKIAotCWRlZiBfX2RlbF9fKHNlbGYpOgotCQlzZWxmLnN0b3AoKQotCQlzZWxmLl91c2VyY2FsbGJhY2sgPSBOb25lCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuc3RvcCgpCisgICAgICAgIHNlbGYuX3VzZXJjYWxsYmFjayA9IE5vbmUKIAotCWRlZiB3YWl0KHNlbGYpOgotCQlpbXBvcnQgdGltZQotCQl3aGlsZSBzZWxmLmdldGZpbGxlZCgpOgotCQkJdGltZS5zbGVlcCgwLjEpCi0JCXNlbGYuX2NoYW4gPSBOb25lCi0JCXNlbGYuX2djID0gW10KKyAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgd2hpbGUgc2VsZi5nZXRmaWxsZWQoKToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBzZWxmLl9jaGFuID0gTm9uZQorICAgICAgICBzZWxmLl9nYyA9IFtdCiAKLQlkZWYgc3RvcChzZWxmLCBxdWlldE5vdyA9IDEpOgotCQkjI2NoYW4gPSBzZWxmLl9jaGFuCi0JCXNlbGYuX2NoYW4gPSBOb25lCi0JCSMjY2hhbi5TbmREaXNwb3NlQ2hhbm5lbCgxKQotCQlzZWxmLl9nYyA9IFtdCisgICAgZGVmIHN0b3Aoc2VsZiwgcXVpZXROb3cgPSAxKToKKyAgICAgICAgIyNjaGFuID0gc2VsZi5fY2hhbgorICAgICAgICBzZWxmLl9jaGFuID0gTm9uZQorICAgICAgICAjI2NoYW4uU25kRGlzcG9zZUNoYW5uZWwoMSkKKyAgICAgICAgc2VsZi5fZ2MgPSBbXQogCi0JZGVmIHNldG91dHJhdGUoc2VsZiwgb3V0cmF0ZSk6Ci0JCXNlbGYuX291dHJhdGUgPSBvdXRyYXRlCisgICAgZGVmIHNldG91dHJhdGUoc2VsZiwgb3V0cmF0ZSk6CisgICAgICAgIHNlbGYuX291dHJhdGUgPSBvdXRyYXRlCiAKLQlkZWYgc2V0c2FtcHdpZHRoKHNlbGYsIHNhbXB3aWR0aCk6Ci0JCXNlbGYuX3NhbXB3aWR0aCA9IHNhbXB3aWR0aAorICAgIGRlZiBzZXRzYW1wd2lkdGgoc2VsZiwgc2FtcHdpZHRoKToKKyAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gc2FtcHdpZHRoCiAKLQlkZWYgc2V0bmNoYW5uZWxzKHNlbGYsIG5jaGFubmVscyk6Ci0JCXNlbGYuX25jaGFubmVscyA9IG5jaGFubmVscworICAgIGRlZiBzZXRuY2hhbm5lbHMoc2VsZiwgbmNoYW5uZWxzKToKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gbmNoYW5uZWxzCiAKLQlkZWYgd3JpdGVmcmFtZXMoc2VsZiwgZGF0YSk6Ci0JCWltcG9ydCB0aW1lCi0JCWZyb20gQ2FyYm9uLlNvdW5kIGltcG9ydCBidWZmZXJDbWQsIGNhbGxCYWNrQ21kLCBleHRTSAotCQlpbXBvcnQgc3RydWN0Ci0JCWltcG9ydCBNYWNPUwotCQlpZiBub3Qgc2VsZi5fY2hhbjoKLQkJCWZyb20gQ2FyYm9uIGltcG9ydCBTbmQKLQkJCXNlbGYuX2NoYW4gPSBTbmQuU25kTmV3Q2hhbm5lbCg1LCAwLCBzZWxmLl9jYWxsYmFjaykKLQkJbmZyYW1lcyA9IGxlbihkYXRhKSAvIHNlbGYuX25jaGFubmVscyAvIHNlbGYuX3NhbXB3aWR0aAotCQlpZiBsZW4oZGF0YSkgIT0gbmZyYW1lcyAqIHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aDoKLQkJCXJhaXNlIGVycm9yLCAnZGF0YSBpcyBub3QgYSB3aG9sZSBudW1iZXIgb2YgZnJhbWVzJwotCQl3aGlsZSBzZWxmLl9nYyBhbmQgXAotCQkJICBzZWxmLmdldGZpbGxlZCgpICsgbmZyYW1lcyA+IFwKLQkJCQlzZWxmLl9xc2l6ZSAvIHNlbGYuX25jaGFubmVscyAvIHNlbGYuX3NhbXB3aWR0aDoKLQkJCXRpbWUuc2xlZXAoMC4xKQotCQlpZiBzZWxmLl9zYW1wd2lkdGggPT0gMToKLQkJCWltcG9ydCBhdWRpb29wCi0JCQlkYXRhID0gYXVkaW9vcC5hZGQoZGF0YSwgJ1x4ODAnKmxlbihkYXRhKSwgMSkKLQkJaDEgPSBzdHJ1Y3QucGFjaygnbGxIaGxsYmJsJywKLQkJCWlkKGRhdGEpK01hY09TLnN0cmluZ19pZF90b19idWZmZXIsCi0JCQlzZWxmLl9uY2hhbm5lbHMsCi0JCQlzZWxmLl9vdXRyYXRlLCAwLAotCQkJMCwKLQkJCTAsCi0JCQlleHRTSCwKLQkJCTYwLAotCQkJbmZyYW1lcykKLQkJaDIgPSAyMionXDAnCi0JCWgzID0gc3RydWN0LnBhY2soJ2hobGxsJywKLQkJCXNlbGYuX3NhbXB3aWR0aCo4LAotCQkJMCwKLQkJCTAsCi0JCQkwLAotCQkJMCkKLQkJaGVhZGVyID0gaDEraDIraDMKLQkJc2VsZi5fZ2MuYXBwZW5kKChoZWFkZXIsIGRhdGEpKQotCQlzZWxmLl9jaGFuLlNuZERvQ29tbWFuZCgoYnVmZmVyQ21kLCAwLCBoZWFkZXIpLCAwKQotCQlzZWxmLl9jaGFuLlNuZERvQ29tbWFuZCgoY2FsbEJhY2tDbWQsIDAsIDApLCAwKQorICAgIGRlZiB3cml0ZWZyYW1lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgZnJvbSBDYXJib24uU291bmQgaW1wb3J0IGJ1ZmZlckNtZCwgY2FsbEJhY2tDbWQsIGV4dFNICisgICAgICAgIGltcG9ydCBzdHJ1Y3QKKyAgICAgICAgaW1wb3J0IE1hY09TCisgICAgICAgIGlmIG5vdCBzZWxmLl9jaGFuOgorICAgICAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IFNuZAorICAgICAgICAgICAgc2VsZi5fY2hhbiA9IFNuZC5TbmROZXdDaGFubmVsKDUsIDAsIHNlbGYuX2NhbGxiYWNrKQorICAgICAgICBuZnJhbWVzID0gbGVuKGRhdGEpIC8gc2VsZi5fbmNoYW5uZWxzIC8gc2VsZi5fc2FtcHdpZHRoCisgICAgICAgIGlmIGxlbihkYXRhKSAhPSBuZnJhbWVzICogc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICdkYXRhIGlzIG5vdCBhIHdob2xlIG51bWJlciBvZiBmcmFtZXMnCisgICAgICAgIHdoaWxlIHNlbGYuX2djIGFuZCBcCisgICAgICAgICAgICAgIHNlbGYuZ2V0ZmlsbGVkKCkgKyBuZnJhbWVzID4gXAorICAgICAgICAgICAgICAgIHNlbGYuX3FzaXplIC8gc2VsZi5fbmNoYW5uZWxzIC8gc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCA9PSAxOgorICAgICAgICAgICAgaW1wb3J0IGF1ZGlvb3AKKyAgICAgICAgICAgIGRhdGEgPSBhdWRpb29wLmFkZChkYXRhLCAnXHg4MCcqbGVuKGRhdGEpLCAxKQorICAgICAgICBoMSA9IHN0cnVjdC5wYWNrKCdsbEhobGxiYmwnLAorICAgICAgICAgICAgaWQoZGF0YSkrTWFjT1Muc3RyaW5nX2lkX3RvX2J1ZmZlciwKKyAgICAgICAgICAgIHNlbGYuX25jaGFubmVscywKKyAgICAgICAgICAgIHNlbGYuX291dHJhdGUsIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIGV4dFNILAorICAgICAgICAgICAgNjAsCisgICAgICAgICAgICBuZnJhbWVzKQorICAgICAgICBoMiA9IDIyKidcMCcKKyAgICAgICAgaDMgPSBzdHJ1Y3QucGFjaygnaGhsbGwnLAorICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoKjgsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwKQorICAgICAgICBoZWFkZXIgPSBoMStoMitoMworICAgICAgICBzZWxmLl9nYy5hcHBlbmQoKGhlYWRlciwgZGF0YSkpCisgICAgICAgIHNlbGYuX2NoYW4uU25kRG9Db21tYW5kKChidWZmZXJDbWQsIDAsIGhlYWRlciksIDApCisgICAgICAgIHNlbGYuX2NoYW4uU25kRG9Db21tYW5kKChjYWxsQmFja0NtZCwgMCwgMCksIDApCiAKLQlkZWYgX2NhbGxiYWNrKHNlbGYsICphcmdzKToKLQkJZGVsIHNlbGYuX2djWzBdCi0JCWlmIHNlbGYuX3VzZXJjYWxsYmFjazoKLQkJCXNlbGYuX3VzZXJjYWxsYmFjaygpCi0JCQkKLQlkZWYgc2V0Y2FsbGJhY2soc2VsZiwgY2FsbGJhY2spOgotCQlzZWxmLl91c2VyY2FsbGJhY2sgPSBjYWxsYmFjaworICAgIGRlZiBfY2FsbGJhY2soc2VsZiwgKmFyZ3MpOgorICAgICAgICBkZWwgc2VsZi5fZ2NbMF0KKyAgICAgICAgaWYgc2VsZi5fdXNlcmNhbGxiYWNrOgorICAgICAgICAgICAgc2VsZi5fdXNlcmNhbGxiYWNrKCkKKyAgICAgICAgICAgIAorICAgIGRlZiBzZXRjYWxsYmFjayhzZWxmLCBjYWxsYmFjayk6CisgICAgICAgIHNlbGYuX3VzZXJjYWxsYmFjayA9IGNhbGxiYWNrCiAKLQlkZWYgZ2V0ZmlsbGVkKHNlbGYpOgotCQlmaWxsZWQgPSAwCi0JCWZvciBoZWFkZXIsIGRhdGEgaW4gc2VsZi5fZ2M6Ci0JCQlmaWxsZWQgPSBmaWxsZWQgKyBsZW4oZGF0YSkKLQkJcmV0dXJuIGZpbGxlZCAvIHNlbGYuX25jaGFubmVscyAvIHNlbGYuX3NhbXB3aWR0aAorICAgIGRlZiBnZXRmaWxsZWQoc2VsZik6CisgICAgICAgIGZpbGxlZCA9IDAKKyAgICAgICAgZm9yIGhlYWRlciwgZGF0YSBpbiBzZWxmLl9nYzoKKyAgICAgICAgICAgIGZpbGxlZCA9IGZpbGxlZCArIGxlbihkYXRhKQorICAgICAgICByZXR1cm4gZmlsbGVkIC8gc2VsZi5fbmNoYW5uZWxzIC8gc2VsZi5fc2FtcHdpZHRoCiAKLQlkZWYgZ2V0ZmlsbGFibGUoc2VsZik6Ci0JCXJldHVybiAoc2VsZi5fcXNpemUgLyBzZWxmLl9uY2hhbm5lbHMgLyBzZWxmLl9zYW1wd2lkdGgpIC0gc2VsZi5nZXRmaWxsZWQoKQorICAgIGRlZiBnZXRmaWxsYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLl9xc2l6ZSAvIHNlbGYuX25jaGFubmVscyAvIHNlbGYuX3NhbXB3aWR0aCkgLSBzZWxmLmdldGZpbGxlZCgpCiAKLQlkZWYgdWxhdzJsaW4oc2VsZiwgZGF0YSk6Ci0JCWltcG9ydCBhdWRpb29wCi0JCXJldHVybiBhdWRpb29wLnVsYXcybGluKGRhdGEsIDIpCisgICAgZGVmIHVsYXcybGluKHNlbGYsIGRhdGEpOgorICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICByZXR1cm4gYXVkaW9vcC51bGF3MmxpbihkYXRhLCAyKQogCiBkZWYgdGVzdCgpOgotCWltcG9ydCBhaWZjCi0JaW1wb3J0IEVhc3lEaWFsb2dzCi0JZm4gPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSJTZWxlY3QgYW4gQUlGRiBzb3VuZGZpbGUiLCB0eXBlTGlzdD0oIkFJRkYiLCkpCi0JaWYgbm90IGZuOiByZXR1cm4KLQlhZiA9IGFpZmMub3BlbihmbiwgJ3InKQotCXByaW50IGFmLmdldHBhcmFtcygpCi0JcCA9IFBsYXlfQXVkaW9fbWFjKCkKLQlwLnNldG91dHJhdGUoYWYuZ2V0ZnJhbWVyYXRlKCkpCi0JcC5zZXRzYW1wd2lkdGgoYWYuZ2V0c2FtcHdpZHRoKCkpCi0JcC5zZXRuY2hhbm5lbHMoYWYuZ2V0bmNoYW5uZWxzKCkpCi0JQlVGU0laID0gMTAwMDAKLQl3aGlsZSAxOgotCQlkYXRhID0gYWYucmVhZGZyYW1lcyhCVUZTSVopCi0JCWlmIG5vdCBkYXRhOiBicmVhawotCQlwLndyaXRlZnJhbWVzKGRhdGEpCi0JCXByaW50ICd3cm90ZScsIGxlbihkYXRhKSwgJ3NwYWNlJywgcC5nZXRmaWxsYWJsZSgpCi0JcC53YWl0KCkKKyAgICBpbXBvcnQgYWlmYworICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgIGZuID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iU2VsZWN0IGFuIEFJRkYgc291bmRmaWxlIiwgdHlwZUxpc3Q9KCJBSUZGIiwpKQorICAgIGlmIG5vdCBmbjogcmV0dXJuCisgICAgYWYgPSBhaWZjLm9wZW4oZm4sICdyJykKKyAgICBwcmludCBhZi5nZXRwYXJhbXMoKQorICAgIHAgPSBQbGF5X0F1ZGlvX21hYygpCisgICAgcC5zZXRvdXRyYXRlKGFmLmdldGZyYW1lcmF0ZSgpKQorICAgIHAuc2V0c2FtcHdpZHRoKGFmLmdldHNhbXB3aWR0aCgpKQorICAgIHAuc2V0bmNoYW5uZWxzKGFmLmdldG5jaGFubmVscygpKQorICAgIEJVRlNJWiA9IDEwMDAwCisgICAgd2hpbGUgMToKKyAgICAgICAgZGF0YSA9IGFmLnJlYWRmcmFtZXMoQlVGU0laKQorICAgICAgICBpZiBub3QgZGF0YTogYnJlYWsKKyAgICAgICAgcC53cml0ZWZyYW1lcyhkYXRhKQorICAgICAgICBwcmludCAnd3JvdGUnLCBsZW4oZGF0YSksICdzcGFjZScsIHAuZ2V0ZmlsbGFibGUoKQorICAgIHAud2FpdCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JdGVzdCgpCisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xBY2Nlc3Nvci5weSBiL0xpYi9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5CmluZGV4IDIwY2Y0MTQuLjc5MTU0NGUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5CkBAIC01LDUzICs1LDUzIEBACiAKICMgVGhlc2UgbmVlZG4ndCBnbyB0aHJvdWdoIHRoaXMgbW9kdWxlLCBidXQgYXJlIGhlcmUgZm9yIGNvbXBsZXRlbmVzcwogZGVmIFNldENvbnRyb2xEYXRhX0hhbmRsZShjb250cm9sLCBwYXJ0LCBzZWxlY3RvciwgZGF0YSk6Ci0JY29udHJvbC5TZXRDb250cm9sRGF0YV9IYW5kbGUocGFydCwgc2VsZWN0b3IsIGRhdGEpCi0JCisgICAgY29udHJvbC5TZXRDb250cm9sRGF0YV9IYW5kbGUocGFydCwgc2VsZWN0b3IsIGRhdGEpCisgICAgCiBkZWYgR2V0Q29udHJvbERhdGFfSGFuZGxlKGNvbnRyb2wsIHBhcnQsIHNlbGVjdG9yKToKLQlyZXR1cm4gY29udHJvbC5HZXRDb250cm9sRGF0YV9IYW5kbGUocGFydCwgc2VsZWN0b3IpCi0JCisgICAgcmV0dXJuIGNvbnRyb2wuR2V0Q29udHJvbERhdGFfSGFuZGxlKHBhcnQsIHNlbGVjdG9yKQorICAgIAogX2FjY2Vzc2RpY3QgPSB7Ci0Ja0NvbnRyb2xQb3B1cEJ1dHRvbk1lbnVIYW5kbGVUYWc6IChTZXRDb250cm9sRGF0YV9IYW5kbGUsIEdldENvbnRyb2xEYXRhX0hhbmRsZSksCisgICAga0NvbnRyb2xQb3B1cEJ1dHRvbk1lbnVIYW5kbGVUYWc6IChTZXRDb250cm9sRGF0YV9IYW5kbGUsIEdldENvbnRyb2xEYXRhX0hhbmRsZSksCiB9CiAKIF9jb2RpbmdkaWN0ID0gewotCWtDb250cm9sUHVzaEJ1dHRvbkRlZmF1bHRUYWcgOiAoImIiLCBOb25lLCBOb25lKSwKLQkKLQlrQ29udHJvbEVkaXRUZXh0VGV4dFRhZzogKE5vbmUsIE5vbmUsIE5vbmUpLAotCWtDb250cm9sRWRpdFRleHRQYXNzd29yZFRhZzogKE5vbmUsIE5vbmUsIE5vbmUpLAotCQotCWtDb250cm9sUG9wdXBCdXR0b25NZW51SURUYWc6ICgiaCIsIE5vbmUsIE5vbmUpLAotCQotCWtDb250cm9sTGlzdEJveERvdWJsZUNsaWNrVGFnOiAoImIiLCBOb25lLCBOb25lKSwKKyAgICBrQ29udHJvbFB1c2hCdXR0b25EZWZhdWx0VGFnIDogKCJiIiwgTm9uZSwgTm9uZSksCisgICAgCisgICAga0NvbnRyb2xFZGl0VGV4dFRleHRUYWc6IChOb25lLCBOb25lLCBOb25lKSwKKyAgICBrQ29udHJvbEVkaXRUZXh0UGFzc3dvcmRUYWc6IChOb25lLCBOb25lLCBOb25lKSwKKyAgICAKKyAgICBrQ29udHJvbFBvcHVwQnV0dG9uTWVudUlEVGFnOiAoImgiLCBOb25lLCBOb25lKSwKKyAgICAKKyAgICBrQ29udHJvbExpc3RCb3hEb3VibGVDbGlja1RhZzogKCJiIiwgTm9uZSwgTm9uZSksCiB9CiAKIGRlZiBTZXRDb250cm9sRGF0YShjb250cm9sLCBwYXJ0LCBzZWxlY3RvciwgZGF0YSk6Ci0JaWYgX2FjY2Vzc2RpY3QuaGFzX2tleShzZWxlY3Rvcik6Ci0JCXNldGZ1bmMsIGdldGZ1bmMgPSBfYWNjZXNzZGljdFtzZWxlY3Rvcl0KLQkJc2V0ZnVuYyhjb250cm9sLCBwYXJ0LCBzZWxlY3RvciwgZGF0YSkKLQkJcmV0dXJuCi0JaWYgbm90IF9jb2RpbmdkaWN0Lmhhc19rZXkoc2VsZWN0b3IpOgotCQlyYWlzZSBLZXlFcnJvciwgKCdVbmtub3duIGNvbnRyb2wgc2VsZWN0b3InLCBzZWxlY3RvcikKLQlzdHJ1Y3RmbXQsIGNvZGVyLCBkZWNvZGVyID0gX2NvZGluZ2RpY3Rbc2VsZWN0b3JdCi0JaWYgY29kZXI6Ci0JCWRhdGEgPSBjb2RlcihkYXRhKQotCWlmIHN0cnVjdGZtdDoKLQkJZGF0YSA9IHN0cnVjdC5wYWNrKHN0cnVjdGZtdCwgZGF0YSkKLQljb250cm9sLlNldENvbnRyb2xEYXRhKHBhcnQsIHNlbGVjdG9yLCBkYXRhKQotCQorICAgIGlmIF9hY2Nlc3NkaWN0Lmhhc19rZXkoc2VsZWN0b3IpOgorICAgICAgICBzZXRmdW5jLCBnZXRmdW5jID0gX2FjY2Vzc2RpY3Rbc2VsZWN0b3JdCisgICAgICAgIHNldGZ1bmMoY29udHJvbCwgcGFydCwgc2VsZWN0b3IsIGRhdGEpCisgICAgICAgIHJldHVybgorICAgIGlmIG5vdCBfY29kaW5nZGljdC5oYXNfa2V5KHNlbGVjdG9yKToKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IsICgnVW5rbm93biBjb250cm9sIHNlbGVjdG9yJywgc2VsZWN0b3IpCisgICAgc3RydWN0Zm10LCBjb2RlciwgZGVjb2RlciA9IF9jb2RpbmdkaWN0W3NlbGVjdG9yXQorICAgIGlmIGNvZGVyOgorICAgICAgICBkYXRhID0gY29kZXIoZGF0YSkKKyAgICBpZiBzdHJ1Y3RmbXQ6CisgICAgICAgIGRhdGEgPSBzdHJ1Y3QucGFjayhzdHJ1Y3RmbXQsIGRhdGEpCisgICAgY29udHJvbC5TZXRDb250cm9sRGF0YShwYXJ0LCBzZWxlY3RvciwgZGF0YSkKKyAgICAKIGRlZiBHZXRDb250cm9sRGF0YShjb250cm9sLCBwYXJ0LCBzZWxlY3Rvcik6Ci0JaWYgX2FjY2Vzc2RpY3QuaGFzX2tleShzZWxlY3Rvcik6Ci0JCXNldGZ1bmMsIGdldGZ1bmMgPSBfYWNjZXNzZGljdFtzZWxlY3Rvcl0KLQkJcmV0dXJuIGdldGZ1bmMoY29udHJvbCwgcGFydCwgc2VsZWN0b3IsIGRhdGEpCi0JaWYgbm90IF9jb2RpbmdkaWN0Lmhhc19rZXkoc2VsZWN0b3IpOgotCQlyYWlzZSBLZXlFcnJvciwgKCdVbmtub3duIGNvbnRyb2wgc2VsZWN0b3InLCBzZWxlY3RvcikKLQlzdHJ1Y3RmbXQsIGNvZGVyLCBkZWNvZGVyID0gX2NvZGluZ2RpY3Rbc2VsZWN0b3JdCi0JZGF0YSA9IGNvbnRyb2wuR2V0Q29udHJvbERhdGEocGFydCwgc2VsZWN0b3IpCi0JaWYgc3RydWN0Zm10OgotCQlkYXRhID0gc3RydWN0LnVucGFjayhzdHJ1Y3RmbXQsIGRhdGEpCi0JaWYgZGVjb2RlcjoKLQkJZGF0YSA9IGRlY29kZXIoZGF0YSkKLQlpZiB0eXBlKGRhdGEpID09IHR5cGUoKCkpIGFuZCBsZW4oZGF0YSkgPT0gMToKLQkJZGF0YSA9IGRhdGFbMF0KLQlyZXR1cm4gZGF0YQotCQorICAgIGlmIF9hY2Nlc3NkaWN0Lmhhc19rZXkoc2VsZWN0b3IpOgorICAgICAgICBzZXRmdW5jLCBnZXRmdW5jID0gX2FjY2Vzc2RpY3Rbc2VsZWN0b3JdCisgICAgICAgIHJldHVybiBnZXRmdW5jKGNvbnRyb2wsIHBhcnQsIHNlbGVjdG9yLCBkYXRhKQorICAgIGlmIG5vdCBfY29kaW5nZGljdC5oYXNfa2V5KHNlbGVjdG9yKToKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IsICgnVW5rbm93biBjb250cm9sIHNlbGVjdG9yJywgc2VsZWN0b3IpCisgICAgc3RydWN0Zm10LCBjb2RlciwgZGVjb2RlciA9IF9jb2RpbmdkaWN0W3NlbGVjdG9yXQorICAgIGRhdGEgPSBjb250cm9sLkdldENvbnRyb2xEYXRhKHBhcnQsIHNlbGVjdG9yKQorICAgIGlmIHN0cnVjdGZtdDoKKyAgICAgICAgZGF0YSA9IHN0cnVjdC51bnBhY2soc3RydWN0Zm10LCBkYXRhKQorICAgIGlmIGRlY29kZXI6CisgICAgICAgIGRhdGEgPSBkZWNvZGVyKGRhdGEpCisgICAgaWYgdHlwZShkYXRhKSA9PSB0eXBlKCgpKSBhbmQgbGVuKGRhdGEpID09IDE6CisgICAgICAgIGRhdGEgPSBkYXRhWzBdCisgICAgcmV0dXJuIGRhdGEKKyAgICAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9DYXJib24vUmVzLnB5IGIvTGliL3BsYXQtbWFjL0NhcmJvbi9SZXMucHkKaW5kZXggODQ2NWFiOC4uOGY0NWQwOSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL0NhcmJvbi9SZXMucHkKKysrIGIvTGliL3BsYXQtbWFjL0NhcmJvbi9SZXMucHkKQEAgLTEsNCArMSw0IEBACiB0cnk6Ci0JZnJvbSBPdmVycmlkZUZyb20yMy5fUmVzIGltcG9ydCAqCisgICAgZnJvbSBPdmVycmlkZUZyb20yMy5fUmVzIGltcG9ydCAqCiBleGNlcHQgSW1wb3J0RXJyb3I6Ci0JZnJvbSBfUmVzIGltcG9ydCAqCisgICAgZnJvbSBfUmVzIGltcG9ydCAqCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvUGl4TWFwV3JhcHBlci5weSBiL0xpYi9wbGF0LW1hYy9QaXhNYXBXcmFwcGVyLnB5CmluZGV4IDAxOTczZTguLmEyZDEzZmUgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9QaXhNYXBXcmFwcGVyLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9QaXhNYXBXcmFwcGVyLnB5CkBAIC0xNCwyMDIgKzE0LDIwMiBAQAogCiAjIFBpeE1hcCBkYXRhIHN0cnVjdHVyZSBlbGVtZW50IGZvcm1hdCAoYXMgdXNlZCB3aXRoIHN0cnVjdCkKIF9wbUVsZW1Gb3JtYXQgPSB7Ci0JJ2Jhc2VBZGRyJzonbCcsCQkjIGFkZHJlc3Mgb2YgcGl4ZWwgZGF0YQotCSdyb3dCeXRlcyc6J0gnLAkJIyBieXRlcyBwZXIgcm93LCBwbHVzIDB4ODAwMAotCSdib3VuZHMnOidoaGhoJywJIyBjb29yZGluYXRlcyBpbXBvc2VkIG92ZXIgcGl4ZWwgZGF0YQotCQkndG9wJzonaCcsCi0JCSdsZWZ0JzonaCcsCi0JCSdib3R0b20nOidoJywKLQkJJ3JpZ2h0JzonaCcsCi0JJ3BtVmVyc2lvbic6J2gnLAkjIGZsYWdzIGZvciBDb2xvciBRdWlja0RyYXcKLQkncGFja1R5cGUnOidoJywJCSMgZm9ybWF0IG9mIGNvbXByZXNzaW9uIGFsZ29yaXRobQotCSdwYWNrU2l6ZSc6J2wnLAkJIyBzaXplIGFmdGVyIGNvbXByZXNzaW9uCi0JJ2hSZXMnOidsJywJCQkjIGhvcml6b250YWwgcGl4ZWxzIHBlciBpbmNoCi0JJ3ZSZXMnOidsJywJCQkjIHZlcnRpY2FsIHBpeGVscyBwZXIgaW5jaAotCSdwaXhlbFR5cGUnOidoJywJIyBwaXhlbCBmb3JtYXQKLQkncGl4ZWxTaXplJzonaCcsCSMgYml0cyBwZXIgcGl4ZWwKLQknY21wQ291bnQnOidoJywJCSMgY29sb3IgY29tcG9uZW50cyBwZXIgcGl4ZWwKLQknY21wU2l6ZSc6J2gnLAkJIyBiaXRzIHBlciBjb21wb25lbnQKLQkncGxhbmVCeXRlcyc6J2wnLAkjIG9mZnNldCBpbiBieXRlcyB0byBuZXh0IHBsYW5lCi0JJ3BtVGFibGUnOidsJywJCSMgaGFuZGxlIHRvIGNvbG9yIHRhYmxlCi0JJ3BtUmVzZXJ2ZWQnOidsJwkjIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgJ2Jhc2VBZGRyJzonbCcsICAgICAjIGFkZHJlc3Mgb2YgcGl4ZWwgZGF0YQorICAgICdyb3dCeXRlcyc6J0gnLCAgICAgIyBieXRlcyBwZXIgcm93LCBwbHVzIDB4ODAwMAorICAgICdib3VuZHMnOidoaGhoJywgICAgIyBjb29yZGluYXRlcyBpbXBvc2VkIG92ZXIgcGl4ZWwgZGF0YQorICAgICAgICAndG9wJzonaCcsCisgICAgICAgICdsZWZ0JzonaCcsCisgICAgICAgICdib3R0b20nOidoJywKKyAgICAgICAgJ3JpZ2h0JzonaCcsCisgICAgJ3BtVmVyc2lvbic6J2gnLCAgICAjIGZsYWdzIGZvciBDb2xvciBRdWlja0RyYXcKKyAgICAncGFja1R5cGUnOidoJywgICAgICMgZm9ybWF0IG9mIGNvbXByZXNzaW9uIGFsZ29yaXRobQorICAgICdwYWNrU2l6ZSc6J2wnLCAgICAgIyBzaXplIGFmdGVyIGNvbXByZXNzaW9uCisgICAgJ2hSZXMnOidsJywgICAgICAgICAjIGhvcml6b250YWwgcGl4ZWxzIHBlciBpbmNoCisgICAgJ3ZSZXMnOidsJywgICAgICAgICAjIHZlcnRpY2FsIHBpeGVscyBwZXIgaW5jaAorICAgICdwaXhlbFR5cGUnOidoJywgICAgIyBwaXhlbCBmb3JtYXQKKyAgICAncGl4ZWxTaXplJzonaCcsICAgICMgYml0cyBwZXIgcGl4ZWwKKyAgICAnY21wQ291bnQnOidoJywgICAgICMgY29sb3IgY29tcG9uZW50cyBwZXIgcGl4ZWwKKyAgICAnY21wU2l6ZSc6J2gnLCAgICAgICMgYml0cyBwZXIgY29tcG9uZW50CisgICAgJ3BsYW5lQnl0ZXMnOidsJywgICAjIG9mZnNldCBpbiBieXRlcyB0byBuZXh0IHBsYW5lCisgICAgJ3BtVGFibGUnOidsJywgICAgICAjIGhhbmRsZSB0byBjb2xvciB0YWJsZQorICAgICdwbVJlc2VydmVkJzonbCcgICAgIyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQogfQogCiAjIFBpeE1hcCBkYXRhIHN0cnVjdHVyZSBlbGVtZW50IG9mZnNldAogX3BtRWxlbU9mZnNldCA9IHsKLQknYmFzZUFkZHInOjAsCi0JJ3Jvd0J5dGVzJzo0LAotCSdib3VuZHMnOjYsCi0JCSd0b3AnOjYsCi0JCSdsZWZ0Jzo4LAotCQknYm90dG9tJzoxMCwKLQkJJ3JpZ2h0JzoxMiwKLQkncG1WZXJzaW9uJzoxNCwKLQkncGFja1R5cGUnOjE2LAotCSdwYWNrU2l6ZSc6MTgsCi0JJ2hSZXMnOjIyLAotCSd2UmVzJzoyNiwKLQkncGl4ZWxUeXBlJzozMCwKLQkncGl4ZWxTaXplJzozMiwKLQknY21wQ291bnQnOjM0LAotCSdjbXBTaXplJzozNiwKLQkncGxhbmVCeXRlcyc6MzgsCi0JJ3BtVGFibGUnOjQyLAotCSdwbVJlc2VydmVkJzo0NgorICAgICdiYXNlQWRkcic6MCwKKyAgICAncm93Qnl0ZXMnOjQsCisgICAgJ2JvdW5kcyc6NiwKKyAgICAgICAgJ3RvcCc6NiwKKyAgICAgICAgJ2xlZnQnOjgsCisgICAgICAgICdib3R0b20nOjEwLAorICAgICAgICAncmlnaHQnOjEyLAorICAgICdwbVZlcnNpb24nOjE0LAorICAgICdwYWNrVHlwZSc6MTYsCisgICAgJ3BhY2tTaXplJzoxOCwKKyAgICAnaFJlcyc6MjIsCisgICAgJ3ZSZXMnOjI2LAorICAgICdwaXhlbFR5cGUnOjMwLAorICAgICdwaXhlbFNpemUnOjMyLAorICAgICdjbXBDb3VudCc6MzQsCisgICAgJ2NtcFNpemUnOjM2LAorICAgICdwbGFuZUJ5dGVzJzozOCwKKyAgICAncG1UYWJsZSc6NDIsCisgICAgJ3BtUmVzZXJ2ZWQnOjQ2CiB9CiAKIGNsYXNzIFBpeE1hcFdyYXBwZXI6Ci0JIiIiUGl4TWFwV3JhcHBlciAtLSB3cmFwcyB0aGUgUUQgUGl4TWFwIG9iamVjdCBpbiBhIFB5dGhvbiBjbGFzcywKLQl3aXRoIG1ldGhvZHMgdG8gZWFzaWx5IGdldC9zZXQgdmFyaW91cyBwaXhtYXAgZmllbGRzLiAgTm90ZTogVXNlIHRoZQotCVBpeE1hcCgpIG1ldGhvZCB3aGVuIHBhc3NpbmcgdG8gUUQgY2FsbHMuIiIiCisgICAgIiIiUGl4TWFwV3JhcHBlciAtLSB3cmFwcyB0aGUgUUQgUGl4TWFwIG9iamVjdCBpbiBhIFB5dGhvbiBjbGFzcywKKyAgICB3aXRoIG1ldGhvZHMgdG8gZWFzaWx5IGdldC9zZXQgdmFyaW91cyBwaXhtYXAgZmllbGRzLiAgTm90ZTogVXNlIHRoZQorICAgIFBpeE1hcCgpIG1ldGhvZCB3aGVuIHBhc3NpbmcgdG8gUUQgY2FsbHMuIiIiCiAKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYuX19kaWN0X19bJ2RhdGEnXSA9ICcnCi0JCXNlbGYuX2hlYWRlciA9IHN0cnVjdC5wYWNrKCJsaGhoaGhoaGxsbGhoaGhsbGwiLAotCQkJaWQoc2VsZi5kYXRhKStNYWNPUy5zdHJpbmdfaWRfdG9fYnVmZmVyLAotCQkJMCwJCQkJCQkjIHJvd0J5dGVzCi0JCQkwLCAwLCAwLCAwLAkJCQkjIGJvdW5kcwotCQkJMCwJCQkJCQkjIHBtVmVyc2lvbgotCQkJMCwgMCwJCQkJCSMgcGFja1R5cGUsIHBhY2tTaXplCi0JCQk3Mjw8MTYsIDcyPDwxNiwJCQkjIGhSZXMsIHZSZXMKLQkJCVF1aWNrRHJhdy5SR0JEaXJlY3QsCSMgcGl4ZWxUeXBlCi0JCQkxNiwJCQkJCQkjIHBpeGVsU2l6ZQotCQkJMiwgNSwJCQkJCSMgY21wQ291bnQsIGNtcFNpemUsCi0JCQkwLCAwLCAwKQkJCQkjIHBsYW5lQnl0ZXMsIHBtVGFibGUsIHBtUmVzZXJ2ZWQKLQkJc2VsZi5fX2RpY3RfX1snX3BtJ10gPSBRZC5SYXdCaXRNYXAoc2VsZi5faGVhZGVyKQotCQotCWRlZiBfc3R1ZmYoc2VsZiwgZWxlbWVudCwgYnl0ZXMpOgotCQlvZmZzZXQgPSBfcG1FbGVtT2Zmc2V0W2VsZW1lbnRdCi0JCWZtdCA9IF9wbUVsZW1Gb3JtYXRbZWxlbWVudF0KLQkJc2VsZi5faGVhZGVyID0gc2VsZi5faGVhZGVyWzpvZmZzZXRdIFwKLQkJCSsgc3RydWN0LnBhY2soZm10LCBieXRlcykgXAotCQkJKyBzZWxmLl9oZWFkZXJbb2Zmc2V0ICsgc3RydWN0LmNhbGNzaXplKGZtdCk6XQotCQlzZWxmLl9fZGljdF9fWydfcG0nXSA9IE5vbmUKLQkKLQlkZWYgX3Vuc3R1ZmYoc2VsZiwgZWxlbWVudCk6Ci0JCW9mZnNldCA9IF9wbUVsZW1PZmZzZXRbZWxlbWVudF0KLQkJZm10ID0gX3BtRWxlbUZvcm1hdFtlbGVtZW50XQotCQlyZXR1cm4gc3RydWN0LnVucGFjayhmbXQsIHNlbGYuX2hlYWRlcltvZmZzZXQ6b2Zmc2V0K3N0cnVjdC5jYWxjc2l6ZShmbXQpXSlbMF0KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX19kaWN0X19bJ2RhdGEnXSA9ICcnCisgICAgICAgIHNlbGYuX2hlYWRlciA9IHN0cnVjdC5wYWNrKCJsaGhoaGhoaGxsbGhoaGhsbGwiLAorICAgICAgICAgICAgaWQoc2VsZi5kYXRhKStNYWNPUy5zdHJpbmdfaWRfdG9fYnVmZmVyLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIyByb3dCeXRlcworICAgICAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIyBib3VuZHMKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICMgcG1WZXJzaW9uCisgICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAjIHBhY2tUeXBlLCBwYWNrU2l6ZQorICAgICAgICAgICAgNzI8PDE2LCA3Mjw8MTYsICAgICAgICAgIyBoUmVzLCB2UmVzCisgICAgICAgICAgICBRdWlja0RyYXcuUkdCRGlyZWN0LCAgICAjIHBpeGVsVHlwZQorICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgIyBwaXhlbFNpemUKKyAgICAgICAgICAgIDIsIDUsICAgICAgICAgICAgICAgICAgICMgY21wQ291bnQsIGNtcFNpemUsCisgICAgICAgICAgICAwLCAwLCAwKSAgICAgICAgICAgICAgICAjIHBsYW5lQnl0ZXMsIHBtVGFibGUsIHBtUmVzZXJ2ZWQKKyAgICAgICAgc2VsZi5fX2RpY3RfX1snX3BtJ10gPSBRZC5SYXdCaXRNYXAoc2VsZi5faGVhZGVyKQorICAgIAorICAgIGRlZiBfc3R1ZmYoc2VsZiwgZWxlbWVudCwgYnl0ZXMpOgorICAgICAgICBvZmZzZXQgPSBfcG1FbGVtT2Zmc2V0W2VsZW1lbnRdCisgICAgICAgIGZtdCA9IF9wbUVsZW1Gb3JtYXRbZWxlbWVudF0KKyAgICAgICAgc2VsZi5faGVhZGVyID0gc2VsZi5faGVhZGVyWzpvZmZzZXRdIFwKKyAgICAgICAgICAgICsgc3RydWN0LnBhY2soZm10LCBieXRlcykgXAorICAgICAgICAgICAgKyBzZWxmLl9oZWFkZXJbb2Zmc2V0ICsgc3RydWN0LmNhbGNzaXplKGZtdCk6XQorICAgICAgICBzZWxmLl9fZGljdF9fWydfcG0nXSA9IE5vbmUKKyAgICAKKyAgICBkZWYgX3Vuc3R1ZmYoc2VsZiwgZWxlbWVudCk6CisgICAgICAgIG9mZnNldCA9IF9wbUVsZW1PZmZzZXRbZWxlbWVudF0KKyAgICAgICAgZm10ID0gX3BtRWxlbUZvcm1hdFtlbGVtZW50XQorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjayhmbXQsIHNlbGYuX2hlYWRlcltvZmZzZXQ6b2Zmc2V0K3N0cnVjdC5jYWxjc2l6ZShmbXQpXSlbMF0KIAotCWRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRyLCB2YWwpOgotCQlpZiBhdHRyID09ICdiYXNlQWRkcic6Ci0JCQlyYWlzZSAnVXNlRXJyJywgImRvbid0IGFzc2lnbiB0byAuYmFzZUFkZHIgLS0gYXNzaWduIHRvIC5kYXRhIGluc3RlYWQiCi0JCWVsaWYgYXR0ciA9PSAnZGF0YSc6Ci0JCQlzZWxmLl9fZGljdF9fWydkYXRhJ10gPSB2YWwKLQkJCXNlbGYuX3N0dWZmKCdiYXNlQWRkcicsIGlkKHNlbGYuZGF0YSkgKyBNYWNPUy5zdHJpbmdfaWRfdG9fYnVmZmVyKQotCQllbGlmIGF0dHIgPT0gJ3Jvd0J5dGVzJzoKLQkJCSMgaGlnaCBiaXQgaXMgYWx3YXlzIHNldCBmb3Igc29tZSBvZGQgcmVhc29uCi0JCQlzZWxmLl9zdHVmZigncm93Qnl0ZXMnLCB2YWwgfCAweDgwMDApCi0JCWVsaWYgYXR0ciA9PSAnYm91bmRzJzoKLQkJCSMgYXNzdW1lIHZhbCBpcyBpbiBvZmZpY2lhbCBMZWZ0LCBUb3AsIFJpZ2h0LCBCb3R0b20gb3JkZXIhCi0JCQlzZWxmLl9zdHVmZignbGVmdCcsdmFsWzBdKQotCQkJc2VsZi5fc3R1ZmYoJ3RvcCcsdmFsWzFdKQotCQkJc2VsZi5fc3R1ZmYoJ3JpZ2h0Jyx2YWxbMl0pCi0JCQlzZWxmLl9zdHVmZignYm90dG9tJyx2YWxbM10pCi0JCWVsaWYgYXR0ciA9PSAnaFJlcycgb3IgYXR0ciA9PSAndlJlcyc6Ci0JCQkjIDE2LjE2IGZpeGVkIGZvcm1hdCwgc28ganVzdCBzaGlmdCAxNiBiaXRzCi0JCQlzZWxmLl9zdHVmZihhdHRyLCBpbnQodmFsKSA8PCAxNikKLQkJZWxpZiBhdHRyIGluIF9wbUVsZW1Gb3JtYXQua2V5cygpOgotCQkJIyBhbnkgb3RoZXIgcG0gYXR0cmlidXRlIC0tIGp1c3Qgc3R1ZmYKLQkJCXNlbGYuX3N0dWZmKGF0dHIsIHZhbCkKLQkJZWxzZToKLQkJCXNlbGYuX19kaWN0X19bYXR0cl0gPSB2YWwJCisgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIGF0dHIsIHZhbCk6CisgICAgICAgIGlmIGF0dHIgPT0gJ2Jhc2VBZGRyJzoKKyAgICAgICAgICAgIHJhaXNlICdVc2VFcnInLCAiZG9uJ3QgYXNzaWduIHRvIC5iYXNlQWRkciAtLSBhc3NpZ24gdG8gLmRhdGEgaW5zdGVhZCIKKyAgICAgICAgZWxpZiBhdHRyID09ICdkYXRhJzoKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bJ2RhdGEnXSA9IHZhbAorICAgICAgICAgICAgc2VsZi5fc3R1ZmYoJ2Jhc2VBZGRyJywgaWQoc2VsZi5kYXRhKSArIE1hY09TLnN0cmluZ19pZF90b19idWZmZXIpCisgICAgICAgIGVsaWYgYXR0ciA9PSAncm93Qnl0ZXMnOgorICAgICAgICAgICAgIyBoaWdoIGJpdCBpcyBhbHdheXMgc2V0IGZvciBzb21lIG9kZCByZWFzb24KKyAgICAgICAgICAgIHNlbGYuX3N0dWZmKCdyb3dCeXRlcycsIHZhbCB8IDB4ODAwMCkKKyAgICAgICAgZWxpZiBhdHRyID09ICdib3VuZHMnOgorICAgICAgICAgICAgIyBhc3N1bWUgdmFsIGlzIGluIG9mZmljaWFsIExlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbSBvcmRlciEKKyAgICAgICAgICAgIHNlbGYuX3N0dWZmKCdsZWZ0Jyx2YWxbMF0pCisgICAgICAgICAgICBzZWxmLl9zdHVmZigndG9wJyx2YWxbMV0pCisgICAgICAgICAgICBzZWxmLl9zdHVmZigncmlnaHQnLHZhbFsyXSkKKyAgICAgICAgICAgIHNlbGYuX3N0dWZmKCdib3R0b20nLHZhbFszXSkKKyAgICAgICAgZWxpZiBhdHRyID09ICdoUmVzJyBvciBhdHRyID09ICd2UmVzJzoKKyAgICAgICAgICAgICMgMTYuMTYgZml4ZWQgZm9ybWF0LCBzbyBqdXN0IHNoaWZ0IDE2IGJpdHMKKyAgICAgICAgICAgIHNlbGYuX3N0dWZmKGF0dHIsIGludCh2YWwpIDw8IDE2KQorICAgICAgICBlbGlmIGF0dHIgaW4gX3BtRWxlbUZvcm1hdC5rZXlzKCk6CisgICAgICAgICAgICAjIGFueSBvdGhlciBwbSBhdHRyaWJ1dGUgLS0ganVzdCBzdHVmZgorICAgICAgICAgICAgc2VsZi5fc3R1ZmYoYXR0ciwgdmFsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1thdHRyXSA9IHZhbCAgIAogCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgotCQlpZiBhdHRyID09ICdyb3dCeXRlcyc6Ci0JCQkjIGhpZ2ggYml0IGlzIGFsd2F5cyBzZXQgZm9yIHNvbWUgb2RkIHJlYXNvbgotCQkJcmV0dXJuIHNlbGYuX3Vuc3R1ZmYoJ3Jvd0J5dGVzJykgJiAweDdGRkYKLQkJZWxpZiBhdHRyID09ICdib3VuZHMnOgotCQkJIyByZXR1cm4gYm91bmRzIGluIG9mZmljaWFsIExlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbSBvcmRlciEKLQkJCXJldHVybiAoIFwKLQkJCQlzZWxmLl91bnN0dWZmKCdsZWZ0JyksCi0JCQkJc2VsZi5fdW5zdHVmZigndG9wJyksCi0JCQkJc2VsZi5fdW5zdHVmZigncmlnaHQnKSwKLQkJCQlzZWxmLl91bnN0dWZmKCdib3R0b20nKSApCi0JCWVsaWYgYXR0ciA9PSAnaFJlcycgb3IgYXR0ciA9PSAndlJlcyc6Ci0JCQkjIDE2LjE2IGZpeGVkIGZvcm1hdCwgc28ganVzdCBzaGlmdCAxNiBiaXRzCi0JCQlyZXR1cm4gc2VsZi5fdW5zdHVmZihhdHRyKSA+PiAxNgotCQllbGlmIGF0dHIgaW4gX3BtRWxlbUZvcm1hdC5rZXlzKCk6Ci0JCQkjIGFueSBvdGhlciBwbSBhdHRyaWJ1dGUgLS0ganVzdCB1bnN0dWZmCi0JCQlyZXR1cm4gc2VsZi5fdW5zdHVmZihhdHRyKQotCQllbHNlOgotCQkJcmV0dXJuIHNlbGYuX19kaWN0X19bYXR0cl0JCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICBpZiBhdHRyID09ICdyb3dCeXRlcyc6CisgICAgICAgICAgICAjIGhpZ2ggYml0IGlzIGFsd2F5cyBzZXQgZm9yIHNvbWUgb2RkIHJlYXNvbgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Vuc3R1ZmYoJ3Jvd0J5dGVzJykgJiAweDdGRkYKKyAgICAgICAgZWxpZiBhdHRyID09ICdib3VuZHMnOgorICAgICAgICAgICAgIyByZXR1cm4gYm91bmRzIGluIG9mZmljaWFsIExlZnQsIFRvcCwgUmlnaHQsIEJvdHRvbSBvcmRlciEKKyAgICAgICAgICAgIHJldHVybiAoIFwKKyAgICAgICAgICAgICAgICBzZWxmLl91bnN0dWZmKCdsZWZ0JyksCisgICAgICAgICAgICAgICAgc2VsZi5fdW5zdHVmZigndG9wJyksCisgICAgICAgICAgICAgICAgc2VsZi5fdW5zdHVmZigncmlnaHQnKSwKKyAgICAgICAgICAgICAgICBzZWxmLl91bnN0dWZmKCdib3R0b20nKSApCisgICAgICAgIGVsaWYgYXR0ciA9PSAnaFJlcycgb3IgYXR0ciA9PSAndlJlcyc6CisgICAgICAgICAgICAjIDE2LjE2IGZpeGVkIGZvcm1hdCwgc28ganVzdCBzaGlmdCAxNiBiaXRzCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdW5zdHVmZihhdHRyKSA+PiAxNgorICAgICAgICBlbGlmIGF0dHIgaW4gX3BtRWxlbUZvcm1hdC5rZXlzKCk6CisgICAgICAgICAgICAjIGFueSBvdGhlciBwbSBhdHRyaWJ1dGUgLS0ganVzdCB1bnN0dWZmCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdW5zdHVmZihhdHRyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bYXR0cl0gIAogCi0JCQotCWRlZiBQaXhNYXAoc2VsZik6Ci0JCSJSZXR1cm4gYSBRdWlja0RyYXcgUGl4TWFwIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBkYXRhLiIKLQkJaWYgbm90IHNlbGYuX19kaWN0X19bJ19wbSddOgotCQkJc2VsZi5fX2RpY3RfX1snX3BtJ10gPSBRZC5SYXdCaXRNYXAoc2VsZi5faGVhZGVyKQotCQlyZXR1cm4gc2VsZi5fX2RpY3RfX1snX3BtJ10KKyAgICAgICAgCisgICAgZGVmIFBpeE1hcChzZWxmKToKKyAgICAgICAgIlJldHVybiBhIFF1aWNrRHJhdyBQaXhNYXAgY29ycmVzcG9uZGluZyB0byB0aGlzIGRhdGEuIgorICAgICAgICBpZiBub3Qgc2VsZi5fX2RpY3RfX1snX3BtJ106CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fWydfcG0nXSA9IFFkLlJhd0JpdE1hcChzZWxmLl9oZWFkZXIpCisgICAgICAgIHJldHVybiBzZWxmLl9fZGljdF9fWydfcG0nXQogCi0JZGVmIGJsaXQoc2VsZiwgeDE9MCx5MT0wLHgyPU5vbmUseTI9Tm9uZSwgcG9ydD1Ob25lKToKLQkJIiIiRHJhdyB0aGlzIHBpeG1hcCBpbnRvIHRoZSBnaXZlbiAoZGVmYXVsdCBjdXJyZW50KSBncmFmcG9ydC4iIiIgCi0JCXNyYyA9IHNlbGYuYm91bmRzCi0JCWRlc3QgPSBbeDEseTEseDIseTJdCi0JCWlmIHgyID09IE5vbmU6Ci0JCQlkZXN0WzJdID0geDEgKyBzcmNbMl0tc3JjWzBdCi0JCWlmIHkyID09IE5vbmU6Ci0JCQlkZXN0WzNdID0geTEgKyBzcmNbM10tc3JjWzFdCi0JCWlmIG5vdCBwb3J0OiBwb3J0ID0gUWQuR2V0UG9ydCgpCi0JCVFkLkNvcHlCaXRzKHNlbGYuUGl4TWFwKCksIHBvcnQuR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKCksIHNyYywgdHVwbGUoZGVzdCksCi0JCQkJUXVpY2tEcmF3LnNyY0NvcHksIE5vbmUpCi0JCi0JZGVmIGZyb21zdHJpbmcoc2VsZixzLHdpZHRoLGhlaWdodCxmb3JtYXQ9aW1nZm9ybWF0Lm1hY3JnYik6Ci0JCSIiIlN0dWZmIHRoaXMgcGl4bWFwIHdpdGggcmF3IHBpeGVsIGRhdGEgZnJvbSBhIHN0cmluZy4KLQkJU3VwcGx5IHdpZHRoLCBoZWlnaHQsIGFuZCBvbmUgb2YgdGhlIGltZ2Zvcm1hdCBzcGVjaWZpZXJzLiIiIgotCQkjIHdlIG9ubHkgc3VwcG9ydCAxNi0gYW5kIDMyLWJpdCBtYWMgcmdiLi4uCi0JCSMgc28gY29udmVydCBpZiBuZWNlc3NhcnkKLQkJaWYgZm9ybWF0ICE9IGltZ2Zvcm1hdC5tYWNyZ2IgYW5kIGZvcm1hdCAhPSBpbWdmb3JtYXQubWFjcmdiMTY6Ci0JCQkjIChMQVRFUiEpCi0JCQlyYWlzZSAiTm90SW1wbGVtZW50ZWRFcnJvciIsICJjb252ZXJzaW9uIHRvIG1hY3JnYiBvciBtYWNyZ2IxNiIKLQkJc2VsZi5kYXRhID0gcwotCQlzZWxmLmJvdW5kcyA9ICgwLDAsd2lkdGgsaGVpZ2h0KQotCQlzZWxmLmNtcENvdW50ID0gMwotCQlzZWxmLnBpeGVsVHlwZSA9IFF1aWNrRHJhdy5SR0JEaXJlY3QKLQkJaWYgZm9ybWF0ID09IGltZ2Zvcm1hdC5tYWNyZ2I6Ci0JCQlzZWxmLnBpeGVsU2l6ZSA9IDMyCi0JCQlzZWxmLmNtcFNpemUgPSA4Ci0JCWVsc2U6Ci0JCQlzZWxmLnBpeGVsU2l6ZSA9IDE2Ci0JCQlzZWxmLmNtcFNpemUgPSA1Ci0JCXNlbGYucm93Qnl0ZXMgPSB3aWR0aCpzZWxmLnBpeGVsU2l6ZS84CisgICAgZGVmIGJsaXQoc2VsZiwgeDE9MCx5MT0wLHgyPU5vbmUseTI9Tm9uZSwgcG9ydD1Ob25lKToKKyAgICAgICAgIiIiRHJhdyB0aGlzIHBpeG1hcCBpbnRvIHRoZSBnaXZlbiAoZGVmYXVsdCBjdXJyZW50KSBncmFmcG9ydC4iIiIgCisgICAgICAgIHNyYyA9IHNlbGYuYm91bmRzCisgICAgICAgIGRlc3QgPSBbeDEseTEseDIseTJdCisgICAgICAgIGlmIHgyID09IE5vbmU6CisgICAgICAgICAgICBkZXN0WzJdID0geDEgKyBzcmNbMl0tc3JjWzBdCisgICAgICAgIGlmIHkyID09IE5vbmU6CisgICAgICAgICAgICBkZXN0WzNdID0geTEgKyBzcmNbM10tc3JjWzFdCisgICAgICAgIGlmIG5vdCBwb3J0OiBwb3J0ID0gUWQuR2V0UG9ydCgpCisgICAgICAgIFFkLkNvcHlCaXRzKHNlbGYuUGl4TWFwKCksIHBvcnQuR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKCksIHNyYywgdHVwbGUoZGVzdCksCisgICAgICAgICAgICAgICAgUXVpY2tEcmF3LnNyY0NvcHksIE5vbmUpCisgICAgCisgICAgZGVmIGZyb21zdHJpbmcoc2VsZixzLHdpZHRoLGhlaWdodCxmb3JtYXQ9aW1nZm9ybWF0Lm1hY3JnYik6CisgICAgICAgICIiIlN0dWZmIHRoaXMgcGl4bWFwIHdpdGggcmF3IHBpeGVsIGRhdGEgZnJvbSBhIHN0cmluZy4KKyAgICAgICAgU3VwcGx5IHdpZHRoLCBoZWlnaHQsIGFuZCBvbmUgb2YgdGhlIGltZ2Zvcm1hdCBzcGVjaWZpZXJzLiIiIgorICAgICAgICAjIHdlIG9ubHkgc3VwcG9ydCAxNi0gYW5kIDMyLWJpdCBtYWMgcmdiLi4uCisgICAgICAgICMgc28gY29udmVydCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgZm9ybWF0ICE9IGltZ2Zvcm1hdC5tYWNyZ2IgYW5kIGZvcm1hdCAhPSBpbWdmb3JtYXQubWFjcmdiMTY6CisgICAgICAgICAgICAjIChMQVRFUiEpCisgICAgICAgICAgICByYWlzZSAiTm90SW1wbGVtZW50ZWRFcnJvciIsICJjb252ZXJzaW9uIHRvIG1hY3JnYiBvciBtYWNyZ2IxNiIKKyAgICAgICAgc2VsZi5kYXRhID0gcworICAgICAgICBzZWxmLmJvdW5kcyA9ICgwLDAsd2lkdGgsaGVpZ2h0KQorICAgICAgICBzZWxmLmNtcENvdW50ID0gMworICAgICAgICBzZWxmLnBpeGVsVHlwZSA9IFF1aWNrRHJhdy5SR0JEaXJlY3QKKyAgICAgICAgaWYgZm9ybWF0ID09IGltZ2Zvcm1hdC5tYWNyZ2I6CisgICAgICAgICAgICBzZWxmLnBpeGVsU2l6ZSA9IDMyCisgICAgICAgICAgICBzZWxmLmNtcFNpemUgPSA4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBpeGVsU2l6ZSA9IDE2CisgICAgICAgICAgICBzZWxmLmNtcFNpemUgPSA1CisgICAgICAgIHNlbGYucm93Qnl0ZXMgPSB3aWR0aCpzZWxmLnBpeGVsU2l6ZS84CiAKLQlkZWYgdG9zdHJpbmcoc2VsZiwgZm9ybWF0PWltZ2Zvcm1hdC5tYWNyZ2IpOgotCQkiIiJSZXR1cm4gcmF3IGRhdGEgYXMgYSBzdHJpbmcgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQuIiIiCi0JCSMgaXMgdGhlIG5hdGl2ZSBmb3JtYXQgcmVxdWVzdGVkPyAgaWYgc28sIGp1c3QgcmV0dXJuIGRhdGEKLQkJaWYgKGZvcm1hdCA9PSBpbWdmb3JtYXQubWFjcmdiIGFuZCBzZWxmLnBpeGVsU2l6ZSA9PSAzMikgb3IgXAotCQkgICAoZm9ybWF0ID09IGltZ2Zvcm1hdC5tYWNyZ2IxNiBhbmQgc2VsZi5waXhlbHNpemUgPT0gMTYpOgotCQkJcmV0dXJuIHNlbGYuZGF0YQotCQkjIG90aGVyd2lzZSwgY29udmVydCB0byB0aGUgcmVxdWVzdGVkIGZvcm1hdAotCQkjIChMQVRFUiEpCi0JCQlyYWlzZSAiTm90SW1wbGVtZW50ZWRFcnJvciIsICJkYXRhIGZvcm1hdCBjb252ZXJzaW9uIgorICAgIGRlZiB0b3N0cmluZyhzZWxmLCBmb3JtYXQ9aW1nZm9ybWF0Lm1hY3JnYik6CisgICAgICAgICIiIlJldHVybiByYXcgZGF0YSBhcyBhIHN0cmluZyBpbiB0aGUgc3BlY2lmaWVkIGZvcm1hdC4iIiIKKyAgICAgICAgIyBpcyB0aGUgbmF0aXZlIGZvcm1hdCByZXF1ZXN0ZWQ/ICBpZiBzbywganVzdCByZXR1cm4gZGF0YQorICAgICAgICBpZiAoZm9ybWF0ID09IGltZ2Zvcm1hdC5tYWNyZ2IgYW5kIHNlbGYucGl4ZWxTaXplID09IDMyKSBvciBcCisgICAgICAgICAgIChmb3JtYXQgPT0gaW1nZm9ybWF0Lm1hY3JnYjE2IGFuZCBzZWxmLnBpeGVsc2l6ZSA9PSAxNik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhCisgICAgICAgICMgb3RoZXJ3aXNlLCBjb252ZXJ0IHRvIHRoZSByZXF1ZXN0ZWQgZm9ybWF0CisgICAgICAgICMgKExBVEVSISkKKyAgICAgICAgICAgIHJhaXNlICJOb3RJbXBsZW1lbnRlZEVycm9yIiwgImRhdGEgZm9ybWF0IGNvbnZlcnNpb24iCiAKLQlkZWYgZnJvbUltYWdlKHNlbGYsaW0pOgotCQkiIiJJbml0aWFsaXplIHRoaXMgUGl4TWFwIGZyb20gYSBQSUwgSW1hZ2Ugb2JqZWN0LiIiIgotCQkjIFdlIG5lZWQgZGF0YSBpbiBBUkdCIGZvcm1hdDsgUElMIGNhbid0IGN1cnJlbnRseSBkbyB0aGF0LAotCQkjIGJ1dCBpdCBjYW4gZG8gUkdCQSwgd2hpY2ggd2UgY2FuIHVzZSBieSBpbnNlcnRpbmcgb25lIG51bGwKLQkJIyB1cCBmcm9udHBtID0gCi0JCWlmIGltLm1vZGUgIT0gJ1JHQkEnOiBpbSA9IGltLmNvbnZlcnQoJ1JHQkEnKQotCQlkYXRhID0gY2hyKDApICsgaW0udG9zdHJpbmcoKQotCQlzZWxmLmZyb21zdHJpbmcoZGF0YSwgaW0uc2l6ZVswXSwgaW0uc2l6ZVsxXSkKKyAgICBkZWYgZnJvbUltYWdlKHNlbGYsaW0pOgorICAgICAgICAiIiJJbml0aWFsaXplIHRoaXMgUGl4TWFwIGZyb20gYSBQSUwgSW1hZ2Ugb2JqZWN0LiIiIgorICAgICAgICAjIFdlIG5lZWQgZGF0YSBpbiBBUkdCIGZvcm1hdDsgUElMIGNhbid0IGN1cnJlbnRseSBkbyB0aGF0LAorICAgICAgICAjIGJ1dCBpdCBjYW4gZG8gUkdCQSwgd2hpY2ggd2UgY2FuIHVzZSBieSBpbnNlcnRpbmcgb25lIG51bGwKKyAgICAgICAgIyB1cCBmcm9udHBtID0gCisgICAgICAgIGlmIGltLm1vZGUgIT0gJ1JHQkEnOiBpbSA9IGltLmNvbnZlcnQoJ1JHQkEnKQorICAgICAgICBkYXRhID0gY2hyKDApICsgaW0udG9zdHJpbmcoKQorICAgICAgICBzZWxmLmZyb21zdHJpbmcoZGF0YSwgaW0uc2l6ZVswXSwgaW0uc2l6ZVsxXSkKIAotCWRlZiB0b0ltYWdlKHNlbGYpOgotCQkiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgUGl4TWFwIGFzIGEgUElMIEltYWdlIG9iamVjdC4iIiIKLQkJaW1wb3J0IEltYWdlCi0JCSMgb3VyIHRvc3RyaW5nKCkgbWV0aG9kIHJldHVybnMgZGF0YSBpbiBBUkdCIGZvcm1hdCwKLQkJIyB3aGVyZWFzIEltYWdlIHVzZXMgUkdCQTsgYSBiaXQgb2Ygc2xpY2luZyBmaXhlcyB0aGlzLi4uCi0JCWRhdGEgPSBzZWxmLnRvc3RyaW5nKClbMTpdICsgY2hyKDApCi0JCWJvdW5kcyA9IHNlbGYuYm91bmRzCi0JCXJldHVybiBJbWFnZS5mcm9tc3RyaW5nKCdSR0JBJywoYm91bmRzWzJdLWJvdW5kc1swXSxib3VuZHNbM10tYm91bmRzWzFdKSxkYXRhKQorICAgIGRlZiB0b0ltYWdlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgUGl4TWFwIGFzIGEgUElMIEltYWdlIG9iamVjdC4iIiIKKyAgICAgICAgaW1wb3J0IEltYWdlCisgICAgICAgICMgb3VyIHRvc3RyaW5nKCkgbWV0aG9kIHJldHVybnMgZGF0YSBpbiBBUkdCIGZvcm1hdCwKKyAgICAgICAgIyB3aGVyZWFzIEltYWdlIHVzZXMgUkdCQTsgYSBiaXQgb2Ygc2xpY2luZyBmaXhlcyB0aGlzLi4uCisgICAgICAgIGRhdGEgPSBzZWxmLnRvc3RyaW5nKClbMTpdICsgY2hyKDApCisgICAgICAgIGJvdW5kcyA9IHNlbGYuYm91bmRzCisgICAgICAgIHJldHVybiBJbWFnZS5mcm9tc3RyaW5nKCdSR0JBJywoYm91bmRzWzJdLWJvdW5kc1swXSxib3VuZHNbM10tYm91bmRzWzFdKSxkYXRhKQogCiBkZWYgdGVzdCgpOgotCWltcG9ydCBNYWNPUwotCWltcG9ydCBFYXN5RGlhbG9ncwotCWltcG9ydCBJbWFnZQotCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbigiSW1hZ2UgRmlsZToiKQotCWlmIG5vdCBwYXRoOiByZXR1cm4KLQlwbSA9IFBpeE1hcFdyYXBwZXIoKQotCXBtLmZyb21JbWFnZSggSW1hZ2Uub3BlbihwYXRoKSApCi0JcG0uYmxpdCgyMCwyMCkKLQlyZXR1cm4gcG0KKyAgICBpbXBvcnQgTWFjT1MKKyAgICBpbXBvcnQgRWFzeURpYWxvZ3MKKyAgICBpbXBvcnQgSW1hZ2UKKyAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4oIkltYWdlIEZpbGU6IikKKyAgICBpZiBub3QgcGF0aDogcmV0dXJuCisgICAgcG0gPSBQaXhNYXBXcmFwcGVyKCkKKyAgICBwbS5mcm9tSW1hZ2UoIEltYWdlLm9wZW4ocGF0aCkgKQorICAgIHBtLmJsaXQoMjAsMjApCisgICAgcmV0dXJuIHBtCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9hZXBhY2sucHkgYi9MaWIvcGxhdC1tYWMvYWVwYWNrLnB5CmluZGV4IDVkZDk1YjguLjIyZGZkMjEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9hZXBhY2sucHkKKysrIGIvTGliL3BsYXQtbWFjL2FlcGFjay5weQpAQCAtNDQsMTUgKzQ0LDE1IEBACiAjIHdlIGxpa2UgYmV0dGVyIChhbmQgd2hpY2ggaXMgZXF1aXZhbGVudCkKICMKIHVucGFja2VyX2NvZXJjaW9ucyA9IHsKLQl0eXBlQ29tcCA6IHR5cGVGbG9hdCwKLQl0eXBlQ29sb3JUYWJsZSA6IHR5cGVBRUxpc3QsCi0JdHlwZURyYXdpbmdBcmVhIDogdHlwZUFFUmVjb3JkLAotCXR5cGVGaXhlZCA6IHR5cGVGbG9hdCwKLQl0eXBlRXh0ZW5kZWQgOiB0eXBlRmxvYXQsCi0JdHlwZVBpeGVsTWFwIDogdHlwZUFFUmVjb3JkLAotCXR5cGVSb3RhdGlvbiA6IHR5cGVBRVJlY29yZCwKLQl0eXBlU3R5bGVkVGV4dCA6IHR5cGVBRVJlY29yZCwKLQl0eXBlVGV4dFN0eWxlcyA6IHR5cGVBRVJlY29yZCwKKyAgICB0eXBlQ29tcCA6IHR5cGVGbG9hdCwKKyAgICB0eXBlQ29sb3JUYWJsZSA6IHR5cGVBRUxpc3QsCisgICAgdHlwZURyYXdpbmdBcmVhIDogdHlwZUFFUmVjb3JkLAorICAgIHR5cGVGaXhlZCA6IHR5cGVGbG9hdCwKKyAgICB0eXBlRXh0ZW5kZWQgOiB0eXBlRmxvYXQsCisgICAgdHlwZVBpeGVsTWFwIDogdHlwZUFFUmVjb3JkLAorICAgIHR5cGVSb3RhdGlvbiA6IHR5cGVBRVJlY29yZCwKKyAgICB0eXBlU3R5bGVkVGV4dCA6IHR5cGVBRVJlY29yZCwKKyAgICB0eXBlVGV4dFN0eWxlcyA6IHR5cGVBRVJlY29yZCwKIH07CiAKICMKQEAgLTY0LDMwMyArNjQsMzAzIEBACiBBbGlhc1R5cGUgPSBDYXJib24uRmlsZS5BbGlhc1R5cGUKIAogZGVmIHBhY2trZXkoYWUsIGtleSwgdmFsdWUpOgotCWlmIGhhc2F0dHIoa2V5LCAnd2hpY2gnKToKLQkJa2V5c3RyID0ga2V5LndoaWNoCi0JZWxpZiBoYXNhdHRyKGtleSwgJ3dhbnQnKToKLQkJa2V5c3RyID0ga2V5LndhbnQKLQllbHNlOgotCQlrZXlzdHIgPSBrZXkKLQlhZS5BRVB1dFBhcmFtRGVzYyhrZXlzdHIsIHBhY2sodmFsdWUpKQorICAgIGlmIGhhc2F0dHIoa2V5LCAnd2hpY2gnKToKKyAgICAgICAga2V5c3RyID0ga2V5LndoaWNoCisgICAgZWxpZiBoYXNhdHRyKGtleSwgJ3dhbnQnKToKKyAgICAgICAga2V5c3RyID0ga2V5LndhbnQKKyAgICBlbHNlOgorICAgICAgICBrZXlzdHIgPSBrZXkKKyAgICBhZS5BRVB1dFBhcmFtRGVzYyhrZXlzdHIsIHBhY2sodmFsdWUpKQogCiBkZWYgcGFjayh4LCBmb3JjZXR5cGUgPSBOb25lKToKLQkiIiJQYWNrIGEgcHl0aG9uIG9iamVjdCBpbnRvIGFuIEFFIGRlc2NyaXB0b3IiIiIKLQkKLQlpZiBmb3JjZXR5cGU6Ci0JCWlmIHR5cGUoeCkgaXMgU3RyaW5nVHlwZToKLQkJCXJldHVybiBBRS5BRUNyZWF0ZURlc2MoZm9yY2V0eXBlLCB4KQotCQllbHNlOgotCQkJcmV0dXJuIHBhY2soeCkuQUVDb2VyY2VEZXNjKGZvcmNldHlwZSkKLQkJCQotCWlmIHggPT0gTm9uZToKLQkJcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnbnVsbCcsICcnKQotCQkKLQlpZiBpc2luc3RhbmNlKHgsIEFFRGVzY1R5cGUpOgotCQlyZXR1cm4geAotCWlmIGlzaW5zdGFuY2UoeCwgRlNTVHlwZSk6Ci0JCXJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ2ZzcyAnLCB4LmRhdGEpCi0JaWYgaXNpbnN0YW5jZSh4LCBGU1JlZlR5cGUpOgotCQlyZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdmc3JmJywgeC5kYXRhKQotCWlmIGlzaW5zdGFuY2UoeCwgQWxpYXNUeXBlKToKLQkJcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnYWxpcycsIHguZGF0YSkKLQlpZiBpc2luc3RhbmNlKHgsIEludFR5cGUpOgotCQlyZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdsb25nJywgc3RydWN0LnBhY2soJ2wnLCB4KSkKLQlpZiBpc2luc3RhbmNlKHgsIEZsb2F0VHlwZSk6Ci0JCXJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ2RvdWInLCBzdHJ1Y3QucGFjaygnZCcsIHgpKQotCWlmIGlzaW5zdGFuY2UoeCwgU3RyaW5nVHlwZSk6Ci0JCXJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ1RFWFQnLCB4KQotCWlmIGlzaW5zdGFuY2UoeCwgVW5pY29kZVR5cGUpOgotCQlkYXRhID0geC5lbmNvZGUoJ3V0ZjE2JykKLQkJaWYgZGF0YVs6Ml0gPT0gJ1x4ZmVceGZmJzoKLQkJCWRhdGEgPSBkYXRhWzI6XQotCQlyZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCd1dHh0JywgZGF0YSkKLQlpZiBpc2luc3RhbmNlKHgsIExpc3RUeXBlKToKLQkJbGlzdCA9IEFFLkFFQ3JlYXRlTGlzdCgnJywgMCkKLQkJZm9yIGl0ZW0gaW4geDoKLQkJCWxpc3QuQUVQdXREZXNjKDAsIHBhY2soaXRlbSkpCi0JCXJldHVybiBsaXN0Ci0JaWYgaXNpbnN0YW5jZSh4LCBEaWN0aW9uYXJ5VHlwZSk6Ci0JCXJlY29yZCA9IEFFLkFFQ3JlYXRlTGlzdCgnJywgMSkKLQkJZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOgotCQkJcGFja2tleShyZWNvcmQsIGtleSwgdmFsdWUpCi0JCQkjcmVjb3JkLkFFUHV0UGFyYW1EZXNjKGtleSwgcGFjayh2YWx1ZSkpCi0JCXJldHVybiByZWNvcmQKLQlpZiB0eXBlKHgpID09IHR5cGVzLkNsYXNzVHlwZSBhbmQgaXNzdWJjbGFzcyh4LCBPYmplY3RTcGVjaWZpZXIpOgotCQkjIE5vdGU6IHdlIGFyZSBnZXR0aW5nIGEgY2xhc3Mgb2JqZWN0IGhlcmUsIG5vdCBhbiBpbnN0YW5jZQotCQlyZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCd0eXBlJywgeC53YW50KQotCWlmIGhhc2F0dHIoeCwgJ19fYWVwYWNrX18nKToKLQkJcmV0dXJuIHguX19hZXBhY2tfXygpCi0JaWYgaGFzYXR0cih4LCAnd2hpY2gnKToKLQkJcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnVEVYVCcsIHgud2hpY2gpCi0JaWYgaGFzYXR0cih4LCAnd2FudCcpOgotCQlyZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdURVhUJywgeC53YW50KQotCXJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ1RFWFQnLCByZXByKHgpKSAjIENvcG91dAorICAgICIiIlBhY2sgYSBweXRob24gb2JqZWN0IGludG8gYW4gQUUgZGVzY3JpcHRvciIiIgorICAgIAorICAgIGlmIGZvcmNldHlwZToKKyAgICAgICAgaWYgdHlwZSh4KSBpcyBTdHJpbmdUeXBlOgorICAgICAgICAgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYyhmb3JjZXR5cGUsIHgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcGFjayh4KS5BRUNvZXJjZURlc2MoZm9yY2V0eXBlKQorICAgICAgICAgICAgCisgICAgaWYgeCA9PSBOb25lOgorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdudWxsJywgJycpCisgICAgICAgIAorICAgIGlmIGlzaW5zdGFuY2UoeCwgQUVEZXNjVHlwZSk6CisgICAgICAgIHJldHVybiB4CisgICAgaWYgaXNpbnN0YW5jZSh4LCBGU1NUeXBlKToKKyAgICAgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnZnNzICcsIHguZGF0YSkKKyAgICBpZiBpc2luc3RhbmNlKHgsIEZTUmVmVHlwZSk6CisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ2ZzcmYnLCB4LmRhdGEpCisgICAgaWYgaXNpbnN0YW5jZSh4LCBBbGlhc1R5cGUpOgorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdhbGlzJywgeC5kYXRhKQorICAgIGlmIGlzaW5zdGFuY2UoeCwgSW50VHlwZSk6CisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ2xvbmcnLCBzdHJ1Y3QucGFjaygnbCcsIHgpKQorICAgIGlmIGlzaW5zdGFuY2UoeCwgRmxvYXRUeXBlKToKKyAgICAgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnZG91YicsIHN0cnVjdC5wYWNrKCdkJywgeCkpCisgICAgaWYgaXNpbnN0YW5jZSh4LCBTdHJpbmdUeXBlKToKKyAgICAgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnVEVYVCcsIHgpCisgICAgaWYgaXNpbnN0YW5jZSh4LCBVbmljb2RlVHlwZSk6CisgICAgICAgIGRhdGEgPSB4LmVuY29kZSgndXRmMTYnKQorICAgICAgICBpZiBkYXRhWzoyXSA9PSAnXHhmZVx4ZmYnOgorICAgICAgICAgICAgZGF0YSA9IGRhdGFbMjpdCisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ3V0eHQnLCBkYXRhKQorICAgIGlmIGlzaW5zdGFuY2UoeCwgTGlzdFR5cGUpOgorICAgICAgICBsaXN0ID0gQUUuQUVDcmVhdGVMaXN0KCcnLCAwKQorICAgICAgICBmb3IgaXRlbSBpbiB4OgorICAgICAgICAgICAgbGlzdC5BRVB1dERlc2MoMCwgcGFjayhpdGVtKSkKKyAgICAgICAgcmV0dXJuIGxpc3QKKyAgICBpZiBpc2luc3RhbmNlKHgsIERpY3Rpb25hcnlUeXBlKToKKyAgICAgICAgcmVjb3JkID0gQUUuQUVDcmVhdGVMaXN0KCcnLCAxKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiB4Lml0ZW1zKCk6CisgICAgICAgICAgICBwYWNra2V5KHJlY29yZCwga2V5LCB2YWx1ZSkKKyAgICAgICAgICAgICNyZWNvcmQuQUVQdXRQYXJhbURlc2Moa2V5LCBwYWNrKHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHJlY29yZAorICAgIGlmIHR5cGUoeCkgPT0gdHlwZXMuQ2xhc3NUeXBlIGFuZCBpc3N1YmNsYXNzKHgsIE9iamVjdFNwZWNpZmllcik6CisgICAgICAgICMgTm90ZTogd2UgYXJlIGdldHRpbmcgYSBjbGFzcyBvYmplY3QgaGVyZSwgbm90IGFuIGluc3RhbmNlCisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ3R5cGUnLCB4LndhbnQpCisgICAgaWYgaGFzYXR0cih4LCAnX19hZXBhY2tfXycpOgorICAgICAgICByZXR1cm4geC5fX2FlcGFja19fKCkKKyAgICBpZiBoYXNhdHRyKHgsICd3aGljaCcpOgorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdURVhUJywgeC53aGljaCkKKyAgICBpZiBoYXNhdHRyKHgsICd3YW50Jyk6CisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ1RFWFQnLCB4LndhbnQpCisgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnVEVYVCcsIHJlcHIoeCkpICMgQ29wb3V0CiAKIGRlZiB1bnBhY2soZGVzYywgZm9ybW9kdWxlbmFtZT0iIik6Ci0JIiIiVW5wYWNrIGFuIEFFIGRlc2NyaXB0b3IgdG8gYSBweXRob24gb2JqZWN0IiIiCi0JdCA9IGRlc2MudHlwZQotCQotCWlmIHVucGFja2VyX2NvZXJjaW9ucy5oYXNfa2V5KHQpOgotCQlkZXNjID0gZGVzYy5BRUNvZXJjZURlc2ModW5wYWNrZXJfY29lcmNpb25zW3RdKQotCQl0ID0gZGVzYy50eXBlICMgVGhpcyBpcyBhIGd1ZXNzIGJ5IEphY2suLi4uCi0JCi0JaWYgdCA9PSB0eXBlQUVMaXN0OgotCQlsID0gW10KLQkJZm9yIGkgaW4gcmFuZ2UoZGVzYy5BRUNvdW50SXRlbXMoKSk6Ci0JCQlrZXl3b3JkLCBpdGVtID0gZGVzYy5BRUdldE50aERlc2MoaSsxLCAnKioqKicpCi0JCQlsLmFwcGVuZCh1bnBhY2soaXRlbSwgZm9ybW9kdWxlbmFtZSkpCi0JCXJldHVybiBsCi0JaWYgdCA9PSB0eXBlQUVSZWNvcmQ6Ci0JCWQgPSB7fQotCQlmb3IgaSBpbiByYW5nZShkZXNjLkFFQ291bnRJdGVtcygpKToKLQkJCWtleXdvcmQsIGl0ZW0gPSBkZXNjLkFFR2V0TnRoRGVzYyhpKzEsICcqKioqJykKLQkJCWRba2V5d29yZF0gPSB1bnBhY2soaXRlbSwgZm9ybW9kdWxlbmFtZSkKLQkJcmV0dXJuIGQKLQlpZiB0ID09IHR5cGVBRVRleHQ6Ci0JCXJlY29yZCA9IGRlc2MuQUVDb2VyY2VEZXNjKCdyZWNvJykKLQkJcmV0dXJuIG1rYWV0ZXh0KHVucGFjayhyZWNvcmQsIGZvcm1vZHVsZW5hbWUpKQotCWlmIHQgPT0gdHlwZUFsaWFzOgotCQlyZXR1cm4gQ2FyYm9uLkZpbGUuQWxpYXMocmF3ZGF0YT1kZXNjLmRhdGEpCi0JIyB0eXBlQXBwbGVFdmVudCByZXR1cm5lZCBhcyB1bmtub3duCi0JaWYgdCA9PSB0eXBlQm9vbGVhbjoKLQkJcmV0dXJuIHN0cnVjdC51bnBhY2soJ2InLCBkZXNjLmRhdGEpWzBdCi0JaWYgdCA9PSB0eXBlQ2hhcjoKLQkJcmV0dXJuIGRlc2MuZGF0YQotCWlmIHQgPT0gdHlwZVVuaWNvZGVUZXh0OgotCQlyZXR1cm4gdW5pY29kZShkZXNjLmRhdGEsICd1dGYxNicpCi0JIyB0eXBlQ29sb3JUYWJsZSBjb2VyY2VkIHRvIHR5cGVBRUxpc3QKLQkjIHR5cGVDb21wIGNvZXJjZWQgdG8gZXh0ZW5kZWQKLQkjIHR5cGVEYXRhIHJldHVybmVkIGFzIHVua25vd24KLQkjIHR5cGVEcmF3aW5nQXJlYSBjb2VyY2VkIHRvIHR5cGVBRVJlY29yZAotCWlmIHQgPT0gdHlwZUVudW1lcmF0aW9uOgotCQlyZXR1cm4gbWtlbnVtKGRlc2MuZGF0YSkKLQkjIHR5cGVFUFMgcmV0dXJuZWQgYXMgdW5rbm93bgotCWlmIHQgPT0gdHlwZUZhbHNlOgotCQlyZXR1cm4gMAotCWlmIHQgPT0gdHlwZUZsb2F0OgotCQlkYXRhID0gZGVzYy5kYXRhCi0JCXJldHVybiBzdHJ1Y3QudW5wYWNrKCdkJywgZGF0YSlbMF0KLQlpZiB0ID09IHR5cGVGU1M6Ci0JCXJldHVybiBDYXJib24uRmlsZS5GU1NwZWMocmF3ZGF0YT1kZXNjLmRhdGEpCi0JaWYgdCA9PSB0eXBlRlNSZWY6Ci0JCXJldHVybiBDYXJib24uRmlsZS5GU1JlZihyYXdkYXRhPWRlc2MuZGF0YSkKLQlpZiB0ID09IHR5cGVJbnNlcnRpb25Mb2M6Ci0JCXJlY29yZCA9IGRlc2MuQUVDb2VyY2VEZXNjKCdyZWNvJykKLQkJcmV0dXJuIG1raW5zZXJ0aW9ubG9jKHVucGFjayhyZWNvcmQsIGZvcm1vZHVsZW5hbWUpKQotCSMgdHlwZUludGVnZXIgZXF1YWwgdG8gdHlwZUxvbmdJbnRlZ2VyCi0JaWYgdCA9PSB0eXBlSW50bFRleHQ6Ci0JCXNjcmlwdCwgbGFuZ3VhZ2UgPSBzdHJ1Y3QudW5wYWNrKCdoaCcsIGRlc2MuZGF0YVs6NF0pCi0JCXJldHVybiBhZXR5cGVzLkludGxUZXh0KHNjcmlwdCwgbGFuZ3VhZ2UsIGRlc2MuZGF0YVs0Ol0pCi0JaWYgdCA9PSB0eXBlSW50bFdyaXRpbmdDb2RlOgotCQlzY3JpcHQsIGxhbmd1YWdlID0gc3RydWN0LnVucGFjaygnaGgnLCBkZXNjLmRhdGEpCi0JCXJldHVybiBhZXR5cGVzLkludGxXcml0aW5nQ29kZShzY3JpcHQsIGxhbmd1YWdlKQotCWlmIHQgPT0gdHlwZUtleXdvcmQ6Ci0JCXJldHVybiBta2tleXdvcmQoZGVzYy5kYXRhKQotCWlmIHQgPT0gdHlwZUxvbmdJbnRlZ2VyOgotCQlyZXR1cm4gc3RydWN0LnVucGFjaygnbCcsIGRlc2MuZGF0YSlbMF0KLQlpZiB0ID09IHR5cGVMb25nRGF0ZVRpbWU6Ci0JCWEsIGIgPSBzdHJ1Y3QudW5wYWNrKCdsTCcsIGRlc2MuZGF0YSkKLQkJcmV0dXJuIChsb25nKGEpIDw8IDMyKSArIGIKLQlpZiB0ID09IHR5cGVOdWxsOgotCQlyZXR1cm4gTm9uZQotCWlmIHQgPT0gdHlwZU1hZ25pdHVkZToKLQkJdiA9IHN0cnVjdC51bnBhY2soJ2wnLCBkZXNjLmRhdGEpCi0JCWlmIHYgPCAwOgotCQkJdiA9IDB4MTAwMDAwMDAwTCArIHYKLQkJcmV0dXJuIHYKLQlpZiB0ID09IHR5cGVPYmplY3RTcGVjaWZpZXI6Ci0JCXJlY29yZCA9IGRlc2MuQUVDb2VyY2VEZXNjKCdyZWNvJykKLQkJIyBJZiB3ZSBoYXZlIGJlZW4gdG9sZCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdlIGFyZSB1bnBhY2tpbmcgYWVkZXNjcyBmb3IsCi0JCSMgd2UgY2FuIGF0dGVtcHQgdG8gY3JlYXRlIHRoZSByaWdodCB0eXBlIG9mIHB5dGhvbiBvYmplY3QgZnJvbSB0aGF0IG1vZHVsZS4KLQkJaWYgZm9ybW9kdWxlbmFtZToKLQkJCXJldHVybiBta29iamVjdGZyb21tb2R1bGUodW5wYWNrKHJlY29yZCwgZm9ybW9kdWxlbmFtZSksIGZvcm1vZHVsZW5hbWUpCi0JCXJldHVybiBta29iamVjdCh1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSkKLQkjIHR5cGVQaWN0IHJldHVybmVkIGFzIHVua25vd24KLQkjIHR5cGVQaXhlbE1hcCBjb2VyY2VkIHRvIHR5cGVBRVJlY29yZAotCSMgdHlwZVBpeGVsTWFwTWludXMgcmV0dXJuZWQgYXMgdW5rbm93bgotCSMgdHlwZVByb2Nlc3NTZXJpYWxOdW1iZXIgcmV0dXJuZWQgYXMgdW5rbm93bgotCWlmIHQgPT0gdHlwZVFEUG9pbnQ6Ci0JCXYsIGggPSBzdHJ1Y3QudW5wYWNrKCdoaCcsIGRlc2MuZGF0YSkKLQkJcmV0dXJuIGFldHlwZXMuUURQb2ludCh2LCBoKQotCWlmIHQgPT0gdHlwZVFEUmVjdGFuZ2xlOgotCQl2MCwgaDAsIHYxLCBoMSA9IHN0cnVjdC51bnBhY2soJ2hoaGgnLCBkZXNjLmRhdGEpCi0JCXJldHVybiBhZXR5cGVzLlFEUmVjdGFuZ2xlKHYwLCBoMCwgdjEsIGgxKQotCWlmIHQgPT0gdHlwZVJHQkNvbG9yOgotCQlyLCBnLCBiID0gc3RydWN0LnVucGFjaygnaGhoJywgZGVzYy5kYXRhKQotCQlyZXR1cm4gYWV0eXBlcy5SR0JDb2xvcihyLCBnLCBiKQotCSMgdHlwZVJvdGF0aW9uIGNvZXJjZWQgdG8gdHlwZUFFUmVjb3JkCi0JIyB0eXBlU2NyYXBTdHlsZXMgcmV0dXJuZWQgYXMgdW5rbm93bgotCSMgdHlwZVNlc3Npb25JRCByZXR1cm5lZCBhcyB1bmtub3duCi0JaWYgdCA9PSB0eXBlU2hvcnRGbG9hdDoKLQkJcmV0dXJuIHN0cnVjdC51bnBhY2soJ2YnLCBkZXNjLmRhdGEpWzBdCi0JaWYgdCA9PSB0eXBlU2hvcnRJbnRlZ2VyOgotCQlyZXR1cm4gc3RydWN0LnVucGFjaygnaCcsIGRlc2MuZGF0YSlbMF0KLQkjIHR5cGVTTUZsb2F0IGlkZW50aWNhbCB0byB0eXBlU2hvcnRGbG9hdAotCSMgdHlwZVNNSW50CWluZGV0aWNhbCB0byB0eXBlU2hvcnRJbnQKLQkjIHR5cGVTdHlsZWRUZXh0IGNvZXJjZWQgdG8gdHlwZUFFUmVjb3JkCi0JaWYgdCA9PSB0eXBlVGFyZ2V0SUQ6Ci0JCXJldHVybiBta3RhcmdldGlkKGRlc2MuZGF0YSkKLQkjIHR5cGVUZXh0U3R5bGVzIGNvZXJjZWQgdG8gdHlwZUFFUmVjb3JkCi0JIyB0eXBlVElGRiByZXR1cm5lZCBhcyB1bmtub3duCi0JaWYgdCA9PSB0eXBlVHJ1ZToKLQkJcmV0dXJuIDEKLQlpZiB0ID09IHR5cGVUeXBlOgotCQlyZXR1cm4gbWt0eXBlKGRlc2MuZGF0YSwgZm9ybW9kdWxlbmFtZSkKLQkjCi0JIyBUaGUgZm9sbG93aW5nIGFyZSBzcGVjaWFsCi0JIwotCWlmIHQgPT0gJ3JhbmcnOgotCQlyZWNvcmQgPSBkZXNjLkFFQ29lcmNlRGVzYygncmVjbycpCi0JCXJldHVybiBta3JhbmdlKHVucGFjayhyZWNvcmQsIGZvcm1vZHVsZW5hbWUpKQotCWlmIHQgPT0gJ2NtcGQnOgotCQlyZWNvcmQgPSBkZXNjLkFFQ29lcmNlRGVzYygncmVjbycpCi0JCXJldHVybiBta2NvbXBhcmlzb24odW5wYWNrKHJlY29yZCwgZm9ybW9kdWxlbmFtZSkpCi0JaWYgdCA9PSAnbG9naSc6Ci0JCXJlY29yZCA9IGRlc2MuQUVDb2VyY2VEZXNjKCdyZWNvJykKLQkJcmV0dXJuIG1rbG9naWNhbCh1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSkKLQlyZXR1cm4gbWt1bmtub3duKGRlc2MudHlwZSwgZGVzYy5kYXRhKQotCQorICAgICIiIlVucGFjayBhbiBBRSBkZXNjcmlwdG9yIHRvIGEgcHl0aG9uIG9iamVjdCIiIgorICAgIHQgPSBkZXNjLnR5cGUKKyAgICAKKyAgICBpZiB1bnBhY2tlcl9jb2VyY2lvbnMuaGFzX2tleSh0KToKKyAgICAgICAgZGVzYyA9IGRlc2MuQUVDb2VyY2VEZXNjKHVucGFja2VyX2NvZXJjaW9uc1t0XSkKKyAgICAgICAgdCA9IGRlc2MudHlwZSAjIFRoaXMgaXMgYSBndWVzcyBieSBKYWNrLi4uLgorICAgIAorICAgIGlmIHQgPT0gdHlwZUFFTGlzdDoKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGRlc2MuQUVDb3VudEl0ZW1zKCkpOgorICAgICAgICAgICAga2V5d29yZCwgaXRlbSA9IGRlc2MuQUVHZXROdGhEZXNjKGkrMSwgJyoqKionKQorICAgICAgICAgICAgbC5hcHBlbmQodW5wYWNrKGl0ZW0sIGZvcm1vZHVsZW5hbWUpKQorICAgICAgICByZXR1cm4gbAorICAgIGlmIHQgPT0gdHlwZUFFUmVjb3JkOgorICAgICAgICBkID0ge30KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGVzYy5BRUNvdW50SXRlbXMoKSk6CisgICAgICAgICAgICBrZXl3b3JkLCBpdGVtID0gZGVzYy5BRUdldE50aERlc2MoaSsxLCAnKioqKicpCisgICAgICAgICAgICBkW2tleXdvcmRdID0gdW5wYWNrKGl0ZW0sIGZvcm1vZHVsZW5hbWUpCisgICAgICAgIHJldHVybiBkCisgICAgaWYgdCA9PSB0eXBlQUVUZXh0OgorICAgICAgICByZWNvcmQgPSBkZXNjLkFFQ29lcmNlRGVzYygncmVjbycpCisgICAgICAgIHJldHVybiBta2FldGV4dCh1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSkKKyAgICBpZiB0ID09IHR5cGVBbGlhczoKKyAgICAgICAgcmV0dXJuIENhcmJvbi5GaWxlLkFsaWFzKHJhd2RhdGE9ZGVzYy5kYXRhKQorICAgICMgdHlwZUFwcGxlRXZlbnQgcmV0dXJuZWQgYXMgdW5rbm93bgorICAgIGlmIHQgPT0gdHlwZUJvb2xlYW46CisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCdiJywgZGVzYy5kYXRhKVswXQorICAgIGlmIHQgPT0gdHlwZUNoYXI6CisgICAgICAgIHJldHVybiBkZXNjLmRhdGEKKyAgICBpZiB0ID09IHR5cGVVbmljb2RlVGV4dDoKKyAgICAgICAgcmV0dXJuIHVuaWNvZGUoZGVzYy5kYXRhLCAndXRmMTYnKQorICAgICMgdHlwZUNvbG9yVGFibGUgY29lcmNlZCB0byB0eXBlQUVMaXN0CisgICAgIyB0eXBlQ29tcCBjb2VyY2VkIHRvIGV4dGVuZGVkCisgICAgIyB0eXBlRGF0YSByZXR1cm5lZCBhcyB1bmtub3duCisgICAgIyB0eXBlRHJhd2luZ0FyZWEgY29lcmNlZCB0byB0eXBlQUVSZWNvcmQKKyAgICBpZiB0ID09IHR5cGVFbnVtZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIG1rZW51bShkZXNjLmRhdGEpCisgICAgIyB0eXBlRVBTIHJldHVybmVkIGFzIHVua25vd24KKyAgICBpZiB0ID09IHR5cGVGYWxzZToKKyAgICAgICAgcmV0dXJuIDAKKyAgICBpZiB0ID09IHR5cGVGbG9hdDoKKyAgICAgICAgZGF0YSA9IGRlc2MuZGF0YQorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnZCcsIGRhdGEpWzBdCisgICAgaWYgdCA9PSB0eXBlRlNTOgorICAgICAgICByZXR1cm4gQ2FyYm9uLkZpbGUuRlNTcGVjKHJhd2RhdGE9ZGVzYy5kYXRhKQorICAgIGlmIHQgPT0gdHlwZUZTUmVmOgorICAgICAgICByZXR1cm4gQ2FyYm9uLkZpbGUuRlNSZWYocmF3ZGF0YT1kZXNjLmRhdGEpCisgICAgaWYgdCA9PSB0eXBlSW5zZXJ0aW9uTG9jOgorICAgICAgICByZWNvcmQgPSBkZXNjLkFFQ29lcmNlRGVzYygncmVjbycpCisgICAgICAgIHJldHVybiBta2luc2VydGlvbmxvYyh1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSkKKyAgICAjIHR5cGVJbnRlZ2VyIGVxdWFsIHRvIHR5cGVMb25nSW50ZWdlcgorICAgIGlmIHQgPT0gdHlwZUludGxUZXh0OgorICAgICAgICBzY3JpcHQsIGxhbmd1YWdlID0gc3RydWN0LnVucGFjaygnaGgnLCBkZXNjLmRhdGFbOjRdKQorICAgICAgICByZXR1cm4gYWV0eXBlcy5JbnRsVGV4dChzY3JpcHQsIGxhbmd1YWdlLCBkZXNjLmRhdGFbNDpdKQorICAgIGlmIHQgPT0gdHlwZUludGxXcml0aW5nQ29kZToKKyAgICAgICAgc2NyaXB0LCBsYW5ndWFnZSA9IHN0cnVjdC51bnBhY2soJ2hoJywgZGVzYy5kYXRhKQorICAgICAgICByZXR1cm4gYWV0eXBlcy5JbnRsV3JpdGluZ0NvZGUoc2NyaXB0LCBsYW5ndWFnZSkKKyAgICBpZiB0ID09IHR5cGVLZXl3b3JkOgorICAgICAgICByZXR1cm4gbWtrZXl3b3JkKGRlc2MuZGF0YSkKKyAgICBpZiB0ID09IHR5cGVMb25nSW50ZWdlcjoKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJ2wnLCBkZXNjLmRhdGEpWzBdCisgICAgaWYgdCA9PSB0eXBlTG9uZ0RhdGVUaW1lOgorICAgICAgICBhLCBiID0gc3RydWN0LnVucGFjaygnbEwnLCBkZXNjLmRhdGEpCisgICAgICAgIHJldHVybiAobG9uZyhhKSA8PCAzMikgKyBiCisgICAgaWYgdCA9PSB0eXBlTnVsbDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiB0ID09IHR5cGVNYWduaXR1ZGU6CisgICAgICAgIHYgPSBzdHJ1Y3QudW5wYWNrKCdsJywgZGVzYy5kYXRhKQorICAgICAgICBpZiB2IDwgMDoKKyAgICAgICAgICAgIHYgPSAweDEwMDAwMDAwMEwgKyB2CisgICAgICAgIHJldHVybiB2CisgICAgaWYgdCA9PSB0eXBlT2JqZWN0U3BlY2lmaWVyOgorICAgICAgICByZWNvcmQgPSBkZXNjLkFFQ29lcmNlRGVzYygncmVjbycpCisgICAgICAgICMgSWYgd2UgaGF2ZSBiZWVuIHRvbGQgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3ZSBhcmUgdW5wYWNraW5nIGFlZGVzY3MgZm9yLAorICAgICAgICAjIHdlIGNhbiBhdHRlbXB0IHRvIGNyZWF0ZSB0aGUgcmlnaHQgdHlwZSBvZiBweXRob24gb2JqZWN0IGZyb20gdGhhdCBtb2R1bGUuCisgICAgICAgIGlmIGZvcm1vZHVsZW5hbWU6CisgICAgICAgICAgICByZXR1cm4gbWtvYmplY3Rmcm9tbW9kdWxlKHVucGFjayhyZWNvcmQsIGZvcm1vZHVsZW5hbWUpLCBmb3Jtb2R1bGVuYW1lKQorICAgICAgICByZXR1cm4gbWtvYmplY3QodW5wYWNrKHJlY29yZCwgZm9ybW9kdWxlbmFtZSkpCisgICAgIyB0eXBlUGljdCByZXR1cm5lZCBhcyB1bmtub3duCisgICAgIyB0eXBlUGl4ZWxNYXAgY29lcmNlZCB0byB0eXBlQUVSZWNvcmQKKyAgICAjIHR5cGVQaXhlbE1hcE1pbnVzIHJldHVybmVkIGFzIHVua25vd24KKyAgICAjIHR5cGVQcm9jZXNzU2VyaWFsTnVtYmVyIHJldHVybmVkIGFzIHVua25vd24KKyAgICBpZiB0ID09IHR5cGVRRFBvaW50OgorICAgICAgICB2LCBoID0gc3RydWN0LnVucGFjaygnaGgnLCBkZXNjLmRhdGEpCisgICAgICAgIHJldHVybiBhZXR5cGVzLlFEUG9pbnQodiwgaCkKKyAgICBpZiB0ID09IHR5cGVRRFJlY3RhbmdsZToKKyAgICAgICAgdjAsIGgwLCB2MSwgaDEgPSBzdHJ1Y3QudW5wYWNrKCdoaGhoJywgZGVzYy5kYXRhKQorICAgICAgICByZXR1cm4gYWV0eXBlcy5RRFJlY3RhbmdsZSh2MCwgaDAsIHYxLCBoMSkKKyAgICBpZiB0ID09IHR5cGVSR0JDb2xvcjoKKyAgICAgICAgciwgZywgYiA9IHN0cnVjdC51bnBhY2soJ2hoaCcsIGRlc2MuZGF0YSkKKyAgICAgICAgcmV0dXJuIGFldHlwZXMuUkdCQ29sb3IociwgZywgYikKKyAgICAjIHR5cGVSb3RhdGlvbiBjb2VyY2VkIHRvIHR5cGVBRVJlY29yZAorICAgICMgdHlwZVNjcmFwU3R5bGVzIHJldHVybmVkIGFzIHVua25vd24KKyAgICAjIHR5cGVTZXNzaW9uSUQgcmV0dXJuZWQgYXMgdW5rbm93bgorICAgIGlmIHQgPT0gdHlwZVNob3J0RmxvYXQ6CisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCdmJywgZGVzYy5kYXRhKVswXQorICAgIGlmIHQgPT0gdHlwZVNob3J0SW50ZWdlcjoKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJ2gnLCBkZXNjLmRhdGEpWzBdCisgICAgIyB0eXBlU01GbG9hdCBpZGVudGljYWwgdG8gdHlwZVNob3J0RmxvYXQKKyAgICAjIHR5cGVTTUludCBpbmRldGljYWwgdG8gdHlwZVNob3J0SW50CisgICAgIyB0eXBlU3R5bGVkVGV4dCBjb2VyY2VkIHRvIHR5cGVBRVJlY29yZAorICAgIGlmIHQgPT0gdHlwZVRhcmdldElEOgorICAgICAgICByZXR1cm4gbWt0YXJnZXRpZChkZXNjLmRhdGEpCisgICAgIyB0eXBlVGV4dFN0eWxlcyBjb2VyY2VkIHRvIHR5cGVBRVJlY29yZAorICAgICMgdHlwZVRJRkYgcmV0dXJuZWQgYXMgdW5rbm93bgorICAgIGlmIHQgPT0gdHlwZVRydWU6CisgICAgICAgIHJldHVybiAxCisgICAgaWYgdCA9PSB0eXBlVHlwZToKKyAgICAgICAgcmV0dXJuIG1rdHlwZShkZXNjLmRhdGEsIGZvcm1vZHVsZW5hbWUpCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBhcmUgc3BlY2lhbAorICAgICMKKyAgICBpZiB0ID09ICdyYW5nJzoKKyAgICAgICAgcmVjb3JkID0gZGVzYy5BRUNvZXJjZURlc2MoJ3JlY28nKQorICAgICAgICByZXR1cm4gbWtyYW5nZSh1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSkKKyAgICBpZiB0ID09ICdjbXBkJzoKKyAgICAgICAgcmVjb3JkID0gZGVzYy5BRUNvZXJjZURlc2MoJ3JlY28nKQorICAgICAgICByZXR1cm4gbWtjb21wYXJpc29uKHVucGFjayhyZWNvcmQsIGZvcm1vZHVsZW5hbWUpKQorICAgIGlmIHQgPT0gJ2xvZ2knOgorICAgICAgICByZWNvcmQgPSBkZXNjLkFFQ29lcmNlRGVzYygncmVjbycpCisgICAgICAgIHJldHVybiBta2xvZ2ljYWwodW5wYWNrKHJlY29yZCwgZm9ybW9kdWxlbmFtZSkpCisgICAgcmV0dXJuIG1rdW5rbm93bihkZXNjLnR5cGUsIGRlc2MuZGF0YSkKKyAgICAKIGRlZiBjb2VyY2UoZGF0YSwgZWdkYXRhKToKLQkiIiJDb2VyY2UgYSBweXRob24gb2JqZWN0IHRvIGFub3RoZXIgdHlwZSB1c2luZyB0aGUgQUUgY29lcmNlcnMiIiIKLQlwZGF0YSA9IHBhY2soZGF0YSkKLQlwZWdkYXRhID0gcGFjayhlZ2RhdGEpCi0JcGRhdGEgPSBwZGF0YS5BRUNvZXJjZURlc2MocGVnZGF0YS50eXBlKQotCXJldHVybiB1bnBhY2socGRhdGEpCisgICAgIiIiQ29lcmNlIGEgcHl0aG9uIG9iamVjdCB0byBhbm90aGVyIHR5cGUgdXNpbmcgdGhlIEFFIGNvZXJjZXJzIiIiCisgICAgcGRhdGEgPSBwYWNrKGRhdGEpCisgICAgcGVnZGF0YSA9IHBhY2soZWdkYXRhKQorICAgIHBkYXRhID0gcGRhdGEuQUVDb2VyY2VEZXNjKHBlZ2RhdGEudHlwZSkKKyAgICByZXR1cm4gdW5wYWNrKHBkYXRhKQogCiAjCiAjIEhlbHBlciByb3V0aW5lcyBmb3IgdW5wYWNrCiAjCiBkZWYgbWt0YXJnZXRpZChkYXRhKToKLQlzZXNzaW9uSUQgPSBnZXRsb25nKGRhdGFbOjRdKQotCW5hbWUgPSBta3BwY3BvcnRyZWMoZGF0YVs0OjQrNzJdKQotCWxvY2F0aW9uID0gbWtsb2NhdGlvbm5hbWVyZWMoZGF0YVs3Njo3NiszNl0pCi0JcmN2ck5hbWUgPSBta3BwY3BvcnRyZWMoZGF0YVsxMTI6MTEyKzcyXSkKLQlyZXR1cm4gc2Vzc2lvbklELCBuYW1lLCBsb2NhdGlvbiwgcmN2ck5hbWUKKyAgICBzZXNzaW9uSUQgPSBnZXRsb25nKGRhdGFbOjRdKQorICAgIG5hbWUgPSBta3BwY3BvcnRyZWMoZGF0YVs0OjQrNzJdKQorICAgIGxvY2F0aW9uID0gbWtsb2NhdGlvbm5hbWVyZWMoZGF0YVs3Njo3NiszNl0pCisgICAgcmN2ck5hbWUgPSBta3BwY3BvcnRyZWMoZGF0YVsxMTI6MTEyKzcyXSkKKyAgICByZXR1cm4gc2Vzc2lvbklELCBuYW1lLCBsb2NhdGlvbiwgcmN2ck5hbWUKIAogZGVmIG1rcHBjcG9ydHJlYyhyZWMpOgotCW5hbWVzY3JpcHQgPSBnZXR3b3JkKHJlY1s6Ml0pCi0JbmFtZSA9IGdldHBzdHIocmVjWzI6MiszM10pCi0JcG9ydGtpbmQgPSBnZXR3b3JkKHJlY1szNjozOF0pCi0JaWYgcG9ydGtpbmQgPT0gMToKLQkJY3RvciA9IHJlY1szODo0Ml0KLQkJdHlwZSA9IHJlY1s0Mjo0Nl0KLQkJaWRlbnRpdHkgPSAoY3RvciwgdHlwZSkKLQllbHNlOgotCQlpZGVudGl0eSA9IGdldHBzdHIocmVjWzM4OjM4KzMzXSkKLQlyZXR1cm4gbmFtZXNjcmlwdCwgbmFtZSwgcG9ydGtpbmQsIGlkZW50aXR5CisgICAgbmFtZXNjcmlwdCA9IGdldHdvcmQocmVjWzoyXSkKKyAgICBuYW1lID0gZ2V0cHN0cihyZWNbMjoyKzMzXSkKKyAgICBwb3J0a2luZCA9IGdldHdvcmQocmVjWzM2OjM4XSkKKyAgICBpZiBwb3J0a2luZCA9PSAxOgorICAgICAgICBjdG9yID0gcmVjWzM4OjQyXQorICAgICAgICB0eXBlID0gcmVjWzQyOjQ2XQorICAgICAgICBpZGVudGl0eSA9IChjdG9yLCB0eXBlKQorICAgIGVsc2U6CisgICAgICAgIGlkZW50aXR5ID0gZ2V0cHN0cihyZWNbMzg6MzgrMzNdKQorICAgIHJldHVybiBuYW1lc2NyaXB0LCBuYW1lLCBwb3J0a2luZCwgaWRlbnRpdHkKIAogZGVmIG1rbG9jYXRpb25uYW1lcmVjKHJlYyk6Ci0Ja2luZCA9IGdldHdvcmQocmVjWzoyXSkKLQlzdHVmZiA9IHJlY1syOl0KLQlpZiBraW5kID09IDA6IHN0dWZmID0gTm9uZQotCWlmIGtpbmQgPT0gMjogc3R1ZmYgPSBnZXRwc3RyKHN0dWZmKQotCXJldHVybiBraW5kLCBzdHVmZgorICAgIGtpbmQgPSBnZXR3b3JkKHJlY1s6Ml0pCisgICAgc3R1ZmYgPSByZWNbMjpdCisgICAgaWYga2luZCA9PSAwOiBzdHVmZiA9IE5vbmUKKyAgICBpZiBraW5kID09IDI6IHN0dWZmID0gZ2V0cHN0cihzdHVmZikKKyAgICByZXR1cm4ga2luZCwgc3R1ZmYKIAogZGVmIG1rdW5rbm93bih0eXBlLCBkYXRhKToKLQlyZXR1cm4gYWV0eXBlcy5Vbmtub3duKHR5cGUsIGRhdGEpCisgICAgcmV0dXJuIGFldHlwZXMuVW5rbm93bih0eXBlLCBkYXRhKQogCiBkZWYgZ2V0cHN0cihzKToKLQlyZXR1cm4gc1sxOjErb3JkKHNbMF0pXQorICAgIHJldHVybiBzWzE6MStvcmQoc1swXSldCiAKIGRlZiBnZXRsb25nKHMpOgotCXJldHVybiAob3JkKHNbMF0pPDwyNCkgfCAob3JkKHNbMV0pPDwxNikgfCAob3JkKHNbMl0pPDw4KSB8IG9yZChzWzNdKQorICAgIHJldHVybiAob3JkKHNbMF0pPDwyNCkgfCAob3JkKHNbMV0pPDwxNikgfCAob3JkKHNbMl0pPDw4KSB8IG9yZChzWzNdKQogCiBkZWYgZ2V0d29yZChzKToKLQlyZXR1cm4gKG9yZChzWzBdKTw8OCkgfCAob3JkKHNbMV0pPDwwKQorICAgIHJldHVybiAob3JkKHNbMF0pPDw4KSB8IChvcmQoc1sxXSk8PDApCiAKIGRlZiBta2tleXdvcmQoa2V5d29yZCk6Ci0JcmV0dXJuIGFldHlwZXMuS2V5d29yZChrZXl3b3JkKQorICAgIHJldHVybiBhZXR5cGVzLktleXdvcmQoa2V5d29yZCkKIAogZGVmIG1rcmFuZ2UoZGljdCk6Ci0JcmV0dXJuIGFldHlwZXMuUmFuZ2UoZGljdFsnc3RhciddLCBkaWN0WydzdG9wJ10pCisgICAgcmV0dXJuIGFldHlwZXMuUmFuZ2UoZGljdFsnc3RhciddLCBkaWN0WydzdG9wJ10pCiAKIGRlZiBta2NvbXBhcmlzb24oZGljdCk6Ci0JcmV0dXJuIGFldHlwZXMuQ29tcGFyaXNvbihkaWN0WydvYmoxJ10sIGRpY3RbJ3JlbG8nXS5lbnVtLCBkaWN0WydvYmoyJ10pCisgICAgcmV0dXJuIGFldHlwZXMuQ29tcGFyaXNvbihkaWN0WydvYmoxJ10sIGRpY3RbJ3JlbG8nXS5lbnVtLCBkaWN0WydvYmoyJ10pCiAKIGRlZiBta2xvZ2ljYWwoZGljdCk6Ci0JcmV0dXJuIGFldHlwZXMuTG9naWNhbChkaWN0Wydsb2djJ10sIGRpY3RbJ3Rlcm0nXSkKKyAgICByZXR1cm4gYWV0eXBlcy5Mb2dpY2FsKGRpY3RbJ2xvZ2MnXSwgZGljdFsndGVybSddKQogCiBkZWYgbWtzdHlsZWR0ZXh0KGRpY3QpOgotCXJldHVybiBhZXR5cGVzLlN0eWxlZFRleHQoZGljdFsna3N0eSddLCBkaWN0WydrdHh0J10pCi0JCisgICAgcmV0dXJuIGFldHlwZXMuU3R5bGVkVGV4dChkaWN0Wydrc3R5J10sIGRpY3RbJ2t0eHQnXSkKKyAgICAKIGRlZiBta2FldGV4dChkaWN0KToKLQlyZXR1cm4gYWV0eXBlcy5BRVRleHQoZGljdFtrZXlBRVNjcmlwdFRhZ10sIGRpY3Rba2V5QUVTdHlsZXNdLCBkaWN0W2tleUFFVGV4dF0pCi0JCisgICAgcmV0dXJuIGFldHlwZXMuQUVUZXh0KGRpY3Rba2V5QUVTY3JpcHRUYWddLCBkaWN0W2tleUFFU3R5bGVzXSwgZGljdFtrZXlBRVRleHRdKQorICAgIAogZGVmIG1raW5zZXJ0aW9ubG9jKGRpY3QpOgotCXJldHVybiBhZXR5cGVzLkluc2VydGlvbkxvYyhkaWN0W2tleUFFT2JqZWN0XSwgZGljdFtrZXlBRVBvc2l0aW9uXSkKKyAgICByZXR1cm4gYWV0eXBlcy5JbnNlcnRpb25Mb2MoZGljdFtrZXlBRU9iamVjdF0sIGRpY3Rba2V5QUVQb3NpdGlvbl0pCiAKIGRlZiBta29iamVjdChkaWN0KToKLQl3YW50ID0gZGljdFsnd2FudCddLnR5cGUKLQlmb3JtID0gZGljdFsnZm9ybSddLmVudW0KLQlzZWxkID0gZGljdFsnc2VsZCddCi0JZnIgICA9IGRpY3RbJ2Zyb20nXQotCWlmIGZvcm0gaW4gKCduYW1lJywgJ2luZHgnLCAncmFuZycsICd0ZXN0Jyk6Ci0JCWlmIHdhbnQgPT0gJ3RleHQnOiByZXR1cm4gYWV0eXBlcy5UZXh0KHNlbGQsIGZyKQotCQlpZiB3YW50ID09ICdjaGEgJzogcmV0dXJuIGFldHlwZXMuQ2hhcmFjdGVyKHNlbGQsIGZyKQotCQlpZiB3YW50ID09ICdjd29yJzogcmV0dXJuIGFldHlwZXMuV29yZChzZWxkLCBmcikKLQkJaWYgd2FudCA9PSAnY2xpbic6IHJldHVybiBhZXR5cGVzLkxpbmUoc2VsZCwgZnIpCi0JCWlmIHdhbnQgPT0gJ2NwYXInOiByZXR1cm4gYWV0eXBlcy5QYXJhZ3JhcGgoc2VsZCwgZnIpCi0JCWlmIHdhbnQgPT0gJ2N3aW4nOiByZXR1cm4gYWV0eXBlcy5XaW5kb3coc2VsZCwgZnIpCi0JCWlmIHdhbnQgPT0gJ2RvY3UnOiByZXR1cm4gYWV0eXBlcy5Eb2N1bWVudChzZWxkLCBmcikKLQkJaWYgd2FudCA9PSAnZmlsZSc6IHJldHVybiBhZXR5cGVzLkZpbGUoc2VsZCwgZnIpCi0JCWlmIHdhbnQgPT0gJ2NpbnMnOiByZXR1cm4gYWV0eXBlcy5JbnNlcnRpb25Qb2ludChzZWxkLCBmcikKLQlpZiB3YW50ID09ICdwcm9wJyBhbmQgZm9ybSA9PSAncHJvcCcgYW5kIGFldHlwZXMuSXNUeXBlKHNlbGQpOgotCQlyZXR1cm4gYWV0eXBlcy5Qcm9wZXJ0eShzZWxkLnR5cGUsIGZyKQotCXJldHVybiBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50LCBmb3JtLCBzZWxkLCBmcikKKyAgICB3YW50ID0gZGljdFsnd2FudCddLnR5cGUKKyAgICBmb3JtID0gZGljdFsnZm9ybSddLmVudW0KKyAgICBzZWxkID0gZGljdFsnc2VsZCddCisgICAgZnIgICA9IGRpY3RbJ2Zyb20nXQorICAgIGlmIGZvcm0gaW4gKCduYW1lJywgJ2luZHgnLCAncmFuZycsICd0ZXN0Jyk6CisgICAgICAgIGlmIHdhbnQgPT0gJ3RleHQnOiByZXR1cm4gYWV0eXBlcy5UZXh0KHNlbGQsIGZyKQorICAgICAgICBpZiB3YW50ID09ICdjaGEgJzogcmV0dXJuIGFldHlwZXMuQ2hhcmFjdGVyKHNlbGQsIGZyKQorICAgICAgICBpZiB3YW50ID09ICdjd29yJzogcmV0dXJuIGFldHlwZXMuV29yZChzZWxkLCBmcikKKyAgICAgICAgaWYgd2FudCA9PSAnY2xpbic6IHJldHVybiBhZXR5cGVzLkxpbmUoc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2NwYXInOiByZXR1cm4gYWV0eXBlcy5QYXJhZ3JhcGgoc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2N3aW4nOiByZXR1cm4gYWV0eXBlcy5XaW5kb3coc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2RvY3UnOiByZXR1cm4gYWV0eXBlcy5Eb2N1bWVudChzZWxkLCBmcikKKyAgICAgICAgaWYgd2FudCA9PSAnZmlsZSc6IHJldHVybiBhZXR5cGVzLkZpbGUoc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2NpbnMnOiByZXR1cm4gYWV0eXBlcy5JbnNlcnRpb25Qb2ludChzZWxkLCBmcikKKyAgICBpZiB3YW50ID09ICdwcm9wJyBhbmQgZm9ybSA9PSAncHJvcCcgYW5kIGFldHlwZXMuSXNUeXBlKHNlbGQpOgorICAgICAgICByZXR1cm4gYWV0eXBlcy5Qcm9wZXJ0eShzZWxkLnR5cGUsIGZyKQorICAgIHJldHVybiBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50LCBmb3JtLCBzZWxkLCBmcikKIAogIyBOb3RlIGJ5IEphY2s6IEknbSBub3QgMTAwJSBzdXJlIG9mIHRoZSBmb2xsb3dpbmcgY29kZS4gVGhpcyB3YXMKICMgcHJvdmlkZWQgYnkgRG9ub3ZhbiBQcmVzdG9uLCBidXQgSSB3b25kZXIgd2hldGhlciB0aGUgYXNzaWdubWVudAogIyB0byBfX2NsYXNzX18gaXMgc2FmZS4gTW9yZW92ZXIsIHNob3VsZG4ndCB0aGVyZSBiZSBhIGJldHRlcgogIyBpbml0aWFsaXplciBmb3IgdGhlIGNsYXNzZXMgaW4gdGhlIHN1aXRlcz8KIGRlZiBta29iamVjdGZyb21tb2R1bGUoZGljdCwgbW9kdWxlbmFtZSk6Ci0JaWYgdHlwZShkaWN0Wyd3YW50J10pID09IHR5cGVzLkNsYXNzVHlwZSBhbmQgaXNzdWJjbGFzcyhkaWN0Wyd3YW50J10sIE9iamVjdFNwZWNpZmllcik6Ci0JCSMgVGhlIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBjb252ZXJ0ZWQgdG8gUHl0aG9uLiBDb252ZXJ0IGJhY2s6LSgKLQkJY2xhc3N0eXBlID0gZGljdFsnd2FudCddCi0JCWRpY3RbJ3dhbnQnXSA9IGFldHlwZXMubWt0eXBlKGNsYXNzdHlwZS53YW50KQotCXdhbnQgPSBkaWN0Wyd3YW50J10udHlwZQotCW1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlbmFtZSkKLQljb2RlbmFtZW1hcHBlciA9IG1vZHVsZS5fY2xhc3NkZWNsYXJhdGlvbnMKLQljbGFzc3R5cGUgPSBjb2RlbmFtZW1hcHBlci5nZXQod2FudCwgTm9uZSkKLQluZXdvYmogPSBta29iamVjdChkaWN0KQotCWlmIGNsYXNzdHlwZToKLQkJYXNzZXJ0IGlzc3ViY2xhc3MoY2xhc3N0eXBlLCBPYmplY3RTcGVjaWZpZXIpCi0JCW5ld29iai5fX2NsYXNzX18gPSBjbGFzc3R5cGUKLQlyZXR1cm4gbmV3b2JqCi0JCisgICAgaWYgdHlwZShkaWN0Wyd3YW50J10pID09IHR5cGVzLkNsYXNzVHlwZSBhbmQgaXNzdWJjbGFzcyhkaWN0Wyd3YW50J10sIE9iamVjdFNwZWNpZmllcik6CisgICAgICAgICMgVGhlIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBjb252ZXJ0ZWQgdG8gUHl0aG9uLiBDb252ZXJ0IGJhY2s6LSgKKyAgICAgICAgY2xhc3N0eXBlID0gZGljdFsnd2FudCddCisgICAgICAgIGRpY3RbJ3dhbnQnXSA9IGFldHlwZXMubWt0eXBlKGNsYXNzdHlwZS53YW50KQorICAgIHdhbnQgPSBkaWN0Wyd3YW50J10udHlwZQorICAgIG1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlbmFtZSkKKyAgICBjb2RlbmFtZW1hcHBlciA9IG1vZHVsZS5fY2xhc3NkZWNsYXJhdGlvbnMKKyAgICBjbGFzc3R5cGUgPSBjb2RlbmFtZW1hcHBlci5nZXQod2FudCwgTm9uZSkKKyAgICBuZXdvYmogPSBta29iamVjdChkaWN0KQorICAgIGlmIGNsYXNzdHlwZToKKyAgICAgICAgYXNzZXJ0IGlzc3ViY2xhc3MoY2xhc3N0eXBlLCBPYmplY3RTcGVjaWZpZXIpCisgICAgICAgIG5ld29iai5fX2NsYXNzX18gPSBjbGFzc3R5cGUKKyAgICByZXR1cm4gbmV3b2JqCisgICAgCiBkZWYgbWt0eXBlKHR5cGVjb2RlLCBtb2R1bGVuYW1lPU5vbmUpOgotCWlmIG1vZHVsZW5hbWU6Ci0JCW1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlbmFtZSkKLQkJY29kZW5hbWVtYXBwZXIgPSBtb2R1bGUuX2NsYXNzZGVjbGFyYXRpb25zCi0JCWNsYXNzdHlwZSA9IGNvZGVuYW1lbWFwcGVyLmdldCh0eXBlY29kZSwgTm9uZSkKLQkJaWYgY2xhc3N0eXBlOgotCQkJcmV0dXJuIGNsYXNzdHlwZQotCXJldHVybiBhZXR5cGVzLm1rdHlwZSh0eXBlY29kZSkKKyAgICBpZiBtb2R1bGVuYW1lOgorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKG1vZHVsZW5hbWUpCisgICAgICAgIGNvZGVuYW1lbWFwcGVyID0gbW9kdWxlLl9jbGFzc2RlY2xhcmF0aW9ucworICAgICAgICBjbGFzc3R5cGUgPSBjb2RlbmFtZW1hcHBlci5nZXQodHlwZWNvZGUsIE5vbmUpCisgICAgICAgIGlmIGNsYXNzdHlwZToKKyAgICAgICAgICAgIHJldHVybiBjbGFzc3R5cGUKKyAgICByZXR1cm4gYWV0eXBlcy5ta3R5cGUodHlwZWNvZGUpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvYWV0b29scy5weSBiL0xpYi9wbGF0LW1hYy9hZXRvb2xzLnB5CmluZGV4IGFjMjY0ZWUuLjc5YjgwNjkgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9hZXRvb2xzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9hZXRvb2xzLnB5CkBAIC05LDExICs5LDExIEBACiBQbHVzLi4uICBMb3RzIG9mIGNsYXNzZXMgYW5kIHJvdXRpbmVzIHRoYXQgaGVscCByZXByZXNlbnRpbmcgQUUgb2JqZWN0cywKIHJhbmdlcywgY29uZGl0aW9uYWxzLCBsb2dpY2FscywgZXRjLiwgc28geW91IGNhbiB3cml0ZSwgZS5nLjoKIAotCXggPSBDaGFyYWN0ZXIoMSwgRG9jdW1lbnQoImZvb2JhciIpKQorICAgIHggPSBDaGFyYWN0ZXIoMSwgRG9jdW1lbnQoImZvb2JhciIpKQogCiBhbmQgcGFjayh4KSB3aWxsIGNyZWF0ZSBhbiBBRSBvYmplY3QgcmVmZXJlbmNlIGVxdWl2YWxlbnQgdG8gQXBwbGVTY3JpcHQncwogCi0JY2hhcmFjdGVyIDEgb2YgZG9jdW1lbnQgImZvb2JhciIKKyAgICBjaGFyYWN0ZXIgMSBvZiBkb2N1bWVudCAiZm9vYmFyIgogCiBTb21lIG9mIHRoZSBzdHVmZiB0aGF0IGFwcGVhcnMgdG8gYmUgZXhwb3J0ZWQgZnJvbSB0aGlzIG1vZHVsZSBjb21lcyBmcm9tIG90aGVyCiBmaWxlczogdGhlIHBhY2sgc3R1ZmYgZnJvbSBhZXBhY2ssIHRoZSBvYmplY3RzIGZyb20gYWV0eXBlcy4KQEAgLTQxLDMwNiArNDEsMzA2IEBACiAjIE5vdGUgYnkgSmFjazogTm8/PyE/IElmIEkgcmVhZCB0aGUgZG9jcyBjb3JyZWN0bHkgaXQgKmlzKi4uLi4KIAogYWVrZXl3b3JkcyA9IFsKLQkndHJhbicsCi0JJ3J0aWQnLAotCSdldmNsJywKLQknZXZpZCcsCi0JJ2FkZHInLAotCSdvcHRrJywKLQkndGltbycsCi0JJ2ludGUnLAkjIHRoaXMgYXR0cmlidXRlIGlzIHJlYWQgb25seSAtIHdpbGwgYmUgc2V0IGluIEFFU2VuZAotCSdlc3JjJywJIyB0aGlzIGF0dHJpYnV0ZSBpcyByZWFkIG9ubHkKLQknbWlzcycsCSMgdGhpcyBhdHRyaWJ1dGUgaXMgcmVhZCBvbmx5Ci0JJ2Zyb20nCSMgbmV3IGluIDEuMC4xCisgICAgJ3RyYW4nLAorICAgICdydGlkJywKKyAgICAnZXZjbCcsCisgICAgJ2V2aWQnLAorICAgICdhZGRyJywKKyAgICAnb3B0aycsCisgICAgJ3RpbW8nLAorICAgICdpbnRlJywgIyB0aGlzIGF0dHJpYnV0ZSBpcyByZWFkIG9ubHkgLSB3aWxsIGJlIHNldCBpbiBBRVNlbmQKKyAgICAnZXNyYycsICMgdGhpcyBhdHRyaWJ1dGUgaXMgcmVhZCBvbmx5CisgICAgJ21pc3MnLCAjIHRoaXMgYXR0cmlidXRlIGlzIHJlYWQgb25seQorICAgICdmcm9tJyAgIyBuZXcgaW4gMS4wLjEKIF0KIAogZGVmIG1pc3NlZChhZSk6Ci0JdHJ5OgotCQlkZXNjID0gYWUuQUVHZXRBdHRyaWJ1dGVEZXNjKCdtaXNzJywgJ2tleXcnKQotCWV4Y2VwdCBBRS5FcnJvciwgbXNnOgotCQlyZXR1cm4gTm9uZQotCXJldHVybiBkZXNjLmRhdGEKKyAgICB0cnk6CisgICAgICAgIGRlc2MgPSBhZS5BRUdldEF0dHJpYnV0ZURlc2MoJ21pc3MnLCAna2V5dycpCisgICAgZXhjZXB0IEFFLkVycm9yLCBtc2c6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIGRlc2MuZGF0YQogCiBkZWYgdW5wYWNrZXZlbnQoYWUsIGZvcm1vZHVsZW5hbWU9IiIpOgotCXBhcmFtZXRlcnMgPSB7fQotCXRyeToKLQkJZGlyb2JqID0gYWUuQUVHZXRQYXJhbURlc2MoJy0tLS0nLCAnKioqKicpCi0JZXhjZXB0IEFFLkVycm9yOgotCQlwYXNzCi0JZWxzZToKLQkJcGFyYW1ldGVyc1snLS0tLSddID0gdW5wYWNrKGRpcm9iaiwgZm9ybW9kdWxlbmFtZSkKLQkJZGVsIGRpcm9iagotCSMgV29ya2Fyb3VuZCBmb3Igd2hhdCBJIGZlZWwgaXMgYSBidWcgaW4gT1NYIDEwLjI6ICdlcnJuJyB3b24ndCBzaG93IHVwIGluIG1pc3NlZC4uLgotCXRyeToKLQkJZGlyb2JqID0gYWUuQUVHZXRQYXJhbURlc2MoJ2Vycm4nLCAnKioqKicpCi0JZXhjZXB0IEFFLkVycm9yOgotCQlwYXNzCi0JZWxzZToKLQkJcGFyYW1ldGVyc1snZXJybiddID0gdW5wYWNrKGRpcm9iaiwgZm9ybW9kdWxlbmFtZSkKLQkJZGVsIGRpcm9iagotCXdoaWxlIDE6Ci0JCWtleSA9IG1pc3NlZChhZSkKLQkJaWYgbm90IGtleTogYnJlYWsKLQkJcGFyYW1ldGVyc1trZXldID0gdW5wYWNrKGFlLkFFR2V0UGFyYW1EZXNjKGtleSwgJyoqKionKSwgZm9ybW9kdWxlbmFtZSkKLQlhdHRyaWJ1dGVzID0ge30KLQlmb3Iga2V5IGluIGFla2V5d29yZHM6Ci0JCXRyeToKLQkJCWRlc2MgPSBhZS5BRUdldEF0dHJpYnV0ZURlc2Moa2V5LCAnKioqKicpCi0JCWV4Y2VwdCAoQUUuRXJyb3IsIE1hY09TLkVycm9yKSwgbXNnOgotCQkJaWYgbXNnWzBdICE9IC0xNzAxIGFuZCBtc2dbMF0gIT0gLTE3MDQ6Ci0JCQkJcmFpc2UKLQkJCWNvbnRpbnVlCi0JCWF0dHJpYnV0ZXNba2V5XSA9IHVucGFjayhkZXNjLCBmb3Jtb2R1bGVuYW1lKQotCXJldHVybiBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzCisgICAgcGFyYW1ldGVycyA9IHt9CisgICAgdHJ5OgorICAgICAgICBkaXJvYmogPSBhZS5BRUdldFBhcmFtRGVzYygnLS0tLScsICcqKioqJykKKyAgICBleGNlcHQgQUUuRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBwYXJhbWV0ZXJzWyctLS0tJ10gPSB1bnBhY2soZGlyb2JqLCBmb3Jtb2R1bGVuYW1lKQorICAgICAgICBkZWwgZGlyb2JqCisgICAgIyBXb3JrYXJvdW5kIGZvciB3aGF0IEkgZmVlbCBpcyBhIGJ1ZyBpbiBPU1ggMTAuMjogJ2Vycm4nIHdvbid0IHNob3cgdXAgaW4gbWlzc2VkLi4uCisgICAgdHJ5OgorICAgICAgICBkaXJvYmogPSBhZS5BRUdldFBhcmFtRGVzYygnZXJybicsICcqKioqJykKKyAgICBleGNlcHQgQUUuRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBwYXJhbWV0ZXJzWydlcnJuJ10gPSB1bnBhY2soZGlyb2JqLCBmb3Jtb2R1bGVuYW1lKQorICAgICAgICBkZWwgZGlyb2JqCisgICAgd2hpbGUgMToKKyAgICAgICAga2V5ID0gbWlzc2VkKGFlKQorICAgICAgICBpZiBub3Qga2V5OiBicmVhaworICAgICAgICBwYXJhbWV0ZXJzW2tleV0gPSB1bnBhY2soYWUuQUVHZXRQYXJhbURlc2Moa2V5LCAnKioqKicpLCBmb3Jtb2R1bGVuYW1lKQorICAgIGF0dHJpYnV0ZXMgPSB7fQorICAgIGZvciBrZXkgaW4gYWVrZXl3b3JkczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVzYyA9IGFlLkFFR2V0QXR0cmlidXRlRGVzYyhrZXksICcqKioqJykKKyAgICAgICAgZXhjZXB0IChBRS5FcnJvciwgTWFjT1MuRXJyb3IpLCBtc2c6CisgICAgICAgICAgICBpZiBtc2dbMF0gIT0gLTE3MDEgYW5kIG1zZ1swXSAhPSAtMTcwNDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYXR0cmlidXRlc1trZXldID0gdW5wYWNrKGRlc2MsIGZvcm1vZHVsZW5hbWUpCisgICAgcmV0dXJuIHBhcmFtZXRlcnMsIGF0dHJpYnV0ZXMKIAogZGVmIHBhY2tldmVudChhZSwgcGFyYW1ldGVycyA9IHt9LCBhdHRyaWJ1dGVzID0ge30pOgotCWZvciBrZXksIHZhbHVlIGluIHBhcmFtZXRlcnMuaXRlbXMoKToKLQkJcGFja2tleShhZSwga2V5LCB2YWx1ZSkKLQlmb3Iga2V5LCB2YWx1ZSBpbiBhdHRyaWJ1dGVzLml0ZW1zKCk6Ci0JCWFlLkFFUHV0QXR0cmlidXRlRGVzYyhrZXksIHBhY2sodmFsdWUpKQorICAgIGZvciBrZXksIHZhbHVlIGluIHBhcmFtZXRlcnMuaXRlbXMoKToKKyAgICAgICAgcGFja2tleShhZSwga2V5LCB2YWx1ZSkKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdHRyaWJ1dGVzLml0ZW1zKCk6CisgICAgICAgIGFlLkFFUHV0QXR0cmlidXRlRGVzYyhrZXksIHBhY2sodmFsdWUpKQogCiAjCiAjIFN1cHBvcnQgcm91dGluZSBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgU3VpdGUgaW50ZXJmYWNlcwogIyBUaGVzZSByb3V0aW5lcyBhcmUgYWxzbyB1c2VhYmxlIGZvciB0aGUgcmV2ZXJzZSBmdW5jdGlvbi4KICMKIGRlZiBrZXlzdWJzdChhcmd1bWVudHMsIGtleWRpY3QpOgotCSIiIlJlcGxhY2UgbG9uZyBuYW1lIGtleXMgYnkgdGhlaXIgNC1jaGFyIGNvdW50ZXJwYXJ0cywgYW5kIGNoZWNrIiIiCi0Jb2sgPSBrZXlkaWN0LnZhbHVlcygpCi0JZm9yIGsgaW4gYXJndW1lbnRzLmtleXMoKToKLQkJaWYga2V5ZGljdC5oYXNfa2V5KGspOgotCQkJdiA9IGFyZ3VtZW50c1trXQotCQkJZGVsIGFyZ3VtZW50c1trXQotCQkJYXJndW1lbnRzW2tleWRpY3Rba11dID0gdgotCQllbGlmIGsgIT0gJy0tLS0nIGFuZCBrIG5vdCBpbiBvazoKLQkJCXJhaXNlIFR5cGVFcnJvciwgJ1Vua25vd24ga2V5d29yZCBhcmd1bWVudDogJXMnJWsKLQkJCQorICAgICIiIlJlcGxhY2UgbG9uZyBuYW1lIGtleXMgYnkgdGhlaXIgNC1jaGFyIGNvdW50ZXJwYXJ0cywgYW5kIGNoZWNrIiIiCisgICAgb2sgPSBrZXlkaWN0LnZhbHVlcygpCisgICAgZm9yIGsgaW4gYXJndW1lbnRzLmtleXMoKToKKyAgICAgICAgaWYga2V5ZGljdC5oYXNfa2V5KGspOgorICAgICAgICAgICAgdiA9IGFyZ3VtZW50c1trXQorICAgICAgICAgICAgZGVsIGFyZ3VtZW50c1trXQorICAgICAgICAgICAgYXJndW1lbnRzW2tleWRpY3Rba11dID0gdgorICAgICAgICBlbGlmIGsgIT0gJy0tLS0nIGFuZCBrIG5vdCBpbiBvazoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ1Vua25vd24ga2V5d29yZCBhcmd1bWVudDogJXMnJWsKKyAgICAgICAgICAgIAogZGVmIGVudW1zdWJzdChhcmd1bWVudHMsIGtleSwgZWRpY3QpOgotCSIiIlN1YnN0aXR1dGUgYSBzaW5nbGUgZW51bSBrZXl3b3JkIGFyZ3VtZW50LCBpZiBpdCBvY2N1cnMiIiIKLQlpZiBub3QgYXJndW1lbnRzLmhhc19rZXkoa2V5KSBvciBlZGljdCBpcyBOb25lOgotCQlyZXR1cm4KLQl2ID0gYXJndW1lbnRzW2tleV0KLQlvayA9IGVkaWN0LnZhbHVlcygpCi0JaWYgZWRpY3QuaGFzX2tleSh2KToKLQkJYXJndW1lbnRzW2tleV0gPSBFbnVtKGVkaWN0W3ZdKQotCWVsaWYgbm90IHYgaW4gb2s6Ci0JCXJhaXNlIFR5cGVFcnJvciwgJ1Vua25vd24gZW51bWVyYXRvcjogJXMnJXYKLQkJCisgICAgIiIiU3Vic3RpdHV0ZSBhIHNpbmdsZSBlbnVtIGtleXdvcmQgYXJndW1lbnQsIGlmIGl0IG9jY3VycyIiIgorICAgIGlmIG5vdCBhcmd1bWVudHMuaGFzX2tleShrZXkpIG9yIGVkaWN0IGlzIE5vbmU6CisgICAgICAgIHJldHVybgorICAgIHYgPSBhcmd1bWVudHNba2V5XQorICAgIG9rID0gZWRpY3QudmFsdWVzKCkKKyAgICBpZiBlZGljdC5oYXNfa2V5KHYpOgorICAgICAgICBhcmd1bWVudHNba2V5XSA9IEVudW0oZWRpY3Rbdl0pCisgICAgZWxpZiBub3QgdiBpbiBvazoKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnVW5rbm93biBlbnVtZXJhdG9yOiAlcycldgorICAgICAgICAKIGRlZiBkZWNvZGVlcnJvcihhcmd1bWVudHMpOgotCSIiIkNyZWF0ZSB0aGUgJ2Jlc3QnIGFyZ3VtZW50IGZvciBhIHJhaXNlIE1hY09TLkVycm9yIiIiCi0JZXJybiA9IGFyZ3VtZW50c1snZXJybiddCi0JZXJyX2ExID0gZXJybgotCWlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcnJzJyk6Ci0JCWVycl9hMiA9IGFyZ3VtZW50c1snZXJycyddCi0JZWxzZToKLQkJZXJyX2EyID0gTWFjT1MuR2V0RXJyb3JTdHJpbmcoZXJybikKLQlpZiBhcmd1bWVudHMuaGFzX2tleSgnZXJvYicpOgotCQllcnJfYTMgPSBhcmd1bWVudHNbJ2Vyb2InXQotCWVsc2U6Ci0JCWVycl9hMyA9IE5vbmUKLQkKLQlyZXR1cm4gKGVycl9hMSwgZXJyX2EyLCBlcnJfYTMpCisgICAgIiIiQ3JlYXRlIHRoZSAnYmVzdCcgYXJndW1lbnQgZm9yIGEgcmFpc2UgTWFjT1MuRXJyb3IiIiIKKyAgICBlcnJuID0gYXJndW1lbnRzWydlcnJuJ10KKyAgICBlcnJfYTEgPSBlcnJuCisgICAgaWYgYXJndW1lbnRzLmhhc19rZXkoJ2VycnMnKToKKyAgICAgICAgZXJyX2EyID0gYXJndW1lbnRzWydlcnJzJ10KKyAgICBlbHNlOgorICAgICAgICBlcnJfYTIgPSBNYWNPUy5HZXRFcnJvclN0cmluZyhlcnJuKQorICAgIGlmIGFyZ3VtZW50cy5oYXNfa2V5KCdlcm9iJyk6CisgICAgICAgIGVycl9hMyA9IGFyZ3VtZW50c1snZXJvYiddCisgICAgZWxzZToKKyAgICAgICAgZXJyX2EzID0gTm9uZQorICAgIAorICAgIHJldHVybiAoZXJyX2ExLCBlcnJfYTIsIGVycl9hMykKIAogY2xhc3MgVGFsa1RvOgotCSIiIkFuIEFFIGNvbm5lY3Rpb24gdG8gYW4gYXBwbGljYXRpb24iIiIKLQlfc2lnbmF0dXJlID0gTm9uZQkjIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKLQlfbW9kdWxlTmFtZSA9IE5vbmUgIyBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzCi0JCi0JX19ldmVudGxvb3BfaW5pdGlhbGl6ZWQgPSAwCi0JZGVmIF9fZW5zdXJlX1dNQXZhaWxhYmxlKGtsYXNzKToKLQkJaWYga2xhc3MuX19ldmVudGxvb3BfaW5pdGlhbGl6ZWQ6IHJldHVybiAxCi0JCWlmIG5vdCBNYWNPUy5XTUF2YWlsYWJsZSgpOiByZXR1cm4gMAotCQkjIFdvcmthcm91bmQgZm9yIGEgYnV0IGluIE1hY09TWCAxMC4yOiB3ZSBtdXN0IGhhdmUgYW4gZXZlbnQKLQkJIyBsb29wIGJlZm9yZSB3ZSBjYW4gY2FsbCBBRVNlbmQuCi0JCUV2dC5XYWl0TmV4dEV2ZW50KDAsMCkKLQkJcmV0dXJuIDEKLQlfX2Vuc3VyZV9XTUF2YWlsYWJsZSA9IGNsYXNzbWV0aG9kKF9fZW5zdXJlX1dNQXZhaWxhYmxlKQorICAgICIiIkFuIEFFIGNvbm5lY3Rpb24gdG8gYW4gYXBwbGljYXRpb24iIiIKKyAgICBfc2lnbmF0dXJlID0gTm9uZSAgICMgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcworICAgIF9tb2R1bGVOYW1lID0gTm9uZSAjIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKKyAgICAKKyAgICBfX2V2ZW50bG9vcF9pbml0aWFsaXplZCA9IDAKKyAgICBkZWYgX19lbnN1cmVfV01BdmFpbGFibGUoa2xhc3MpOgorICAgICAgICBpZiBrbGFzcy5fX2V2ZW50bG9vcF9pbml0aWFsaXplZDogcmV0dXJuIDEKKyAgICAgICAgaWYgbm90IE1hY09TLldNQXZhaWxhYmxlKCk6IHJldHVybiAwCisgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgYSBidXQgaW4gTWFjT1NYIDEwLjI6IHdlIG11c3QgaGF2ZSBhbiBldmVudAorICAgICAgICAjIGxvb3AgYmVmb3JlIHdlIGNhbiBjYWxsIEFFU2VuZC4KKyAgICAgICAgRXZ0LldhaXROZXh0RXZlbnQoMCwwKQorICAgICAgICByZXR1cm4gMQorICAgIF9fZW5zdXJlX1dNQXZhaWxhYmxlID0gY2xhc3NtZXRob2QoX19lbnN1cmVfV01BdmFpbGFibGUpCiAKLQlkZWYgX19pbml0X18oc2VsZiwgc2lnbmF0dXJlPU5vbmUsIHN0YXJ0PTAsIHRpbWVvdXQ9MCk6Ci0JCSIiIkNyZWF0ZSBhIGNvbW11bmljYXRpb24gY2hhbm5lbCB3aXRoIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4KLQkJCi0JCUFkZHJlc3NpbmcgdGhlIGFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgc3BlY2lmeWluZyBlaXRoZXIgYQotCQk0LWJ5dGUgc2lnbmF0dXJlLCBhbiBBRURlc2Mgb3IgYW4gb2JqZWN0IHRoYXQgd2lsbCBfX2FlcGFja19fCi0JCXRvIGFuIEFFRGVzYy4KLQkJIiIiCi0JCXNlbGYudGFyZ2V0X3NpZ25hdHVyZSA9IE5vbmUKLQkJaWYgc2lnbmF0dXJlIGlzIE5vbmU6Ci0JCQlzaWduYXR1cmUgPSBzZWxmLl9zaWduYXR1cmUKLQkJaWYgdHlwZShzaWduYXR1cmUpID09IEFFRGVzY1R5cGU6Ci0JCQlzZWxmLnRhcmdldCA9IHNpZ25hdHVyZQotCQllbGlmIHR5cGUoc2lnbmF0dXJlKSA9PSBJbnN0YW5jZVR5cGUgYW5kIGhhc2F0dHIoc2lnbmF0dXJlLCAnX19hZXBhY2tfXycpOgotCQkJc2VsZi50YXJnZXQgPSBzaWduYXR1cmUuX19hZXBhY2tfXygpCi0JCWVsaWYgdHlwZShzaWduYXR1cmUpID09IFN0cmluZ1R5cGUgYW5kIGxlbihzaWduYXR1cmUpID09IDQ6Ci0JCQlzZWxmLnRhcmdldCA9IEFFLkFFQ3JlYXRlRGVzYyhBcHBsZUV2ZW50cy50eXBlQXBwbFNpZ25hdHVyZSwgc2lnbmF0dXJlKQotCQkJc2VsZi50YXJnZXRfc2lnbmF0dXJlID0gc2lnbmF0dXJlCi0JCWVsc2U6Ci0JCQlyYWlzZSBUeXBlRXJyb3IsICJzaWduYXR1cmUgc2hvdWxkIGJlIDQtY2hhciBzdHJpbmcgb3IgQUVEZXNjIgotCQlzZWxmLnNlbmRfZmxhZ3MgPSBBcHBsZUV2ZW50cy5rQUVXYWl0UmVwbHkKLQkJc2VsZi5zZW5kX3ByaW9yaXR5ID0gQXBwbGVFdmVudHMua0FFTm9ybWFsUHJpb3JpdHkKLQkJaWYgdGltZW91dDoKLQkJCXNlbGYuc2VuZF90aW1lb3V0ID0gdGltZW91dAotCQllbHNlOgotCQkJc2VsZi5zZW5kX3RpbWVvdXQgPSBBcHBsZUV2ZW50cy5rQUVEZWZhdWx0VGltZW91dAotCQlpZiBzdGFydDoKLQkJCXNlbGYuX3N0YXJ0KCkKLQkJCi0JZGVmIF9zdGFydChzZWxmKToKLQkJIiIiU3RhcnQgdGhlIGFwcGxpY2F0aW9uLCBpZiBpdCBpcyBub3QgcnVubmluZyB5ZXQiIiIKLQkJdHJ5OgotCQkJc2VsZi5zZW5kKCdhc2NyJywgJ25vb3AnKQotCQlleGNlcHQgQUUuRXJyb3I6Ci0JCQlfbGF1bmNoKHNlbGYudGFyZ2V0X3NpZ25hdHVyZSkKLQkJCWZvciBpIGluIHJhbmdlKExBVU5DSF9NQVhfV0FJVF9USU1FKToKLQkJCQl0cnk6Ci0JCQkJCXNlbGYuc2VuZCgnYXNjcicsICdub29wJykKLQkJCQlleGNlcHQgQUUuRXJyb3I6Ci0JCQkJCXBhc3MKLQkJCQllbHNlOgotCQkJCQlicmVhawotCQkJCXRpbWUuc2xlZXAoMSkKLQkJCQotCWRlZiBzdGFydChzZWxmKToKLQkJIiIiRGVwcmVjYXRlZCwgdXNlZCBfc3RhcnQoKSIiIgotCQlzZWxmLl9zdGFydCgpCi0JCQkKLQlkZWYgbmV3ZXZlbnQoc2VsZiwgY29kZSwgc3ViY29kZSwgcGFyYW1ldGVycyA9IHt9LCBhdHRyaWJ1dGVzID0ge30pOgotCQkiIiJDcmVhdGUgYSBjb21wbGV0ZSBzdHJ1Y3R1cmUgZm9yIGFuIGFwcGxlIGV2ZW50IiIiCi0JCQotCQlldmVudCA9IEFFLkFFQ3JlYXRlQXBwbGVFdmVudChjb2RlLCBzdWJjb2RlLCBzZWxmLnRhcmdldCwKLQkJICAgICAgCSAgQXBwbGVFdmVudHMua0F1dG9HZW5lcmF0ZVJldHVybklELCBBcHBsZUV2ZW50cy5rQW55VHJhbnNhY3Rpb25JRCkKLQkJcGFja2V2ZW50KGV2ZW50LCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzKQotCQlyZXR1cm4gZXZlbnQKLQkKLQlkZWYgc2VuZGV2ZW50KHNlbGYsIGV2ZW50KToKLQkJIiIiU2VuZCBhIHByZS1jcmVhdGVkIGFwcGxlZXZlbnQsIGF3YWl0IHRoZSByZXBseSBhbmQgdW5wYWNrIGl0IiIiCi0JCWlmIG5vdCBzZWxmLl9fZW5zdXJlX1dNQXZhaWxhYmxlKCk6Ci0JCQlyYWlzZSBSdW50aW1lRXJyb3IsICJObyB3aW5kb3cgbWFuYWdlciBhY2Nlc3MsIGNhbm5vdCBzZW5kIEFwcGxlRXZlbnQiCi0JCXJlcGx5ID0gZXZlbnQuQUVTZW5kKHNlbGYuc2VuZF9mbGFncywgc2VsZi5zZW5kX3ByaW9yaXR5LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF90aW1lb3V0KQotCQlwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzID0gdW5wYWNrZXZlbnQocmVwbHksIHNlbGYuX21vZHVsZU5hbWUpCi0JCXJldHVybiByZXBseSwgcGFyYW1ldGVycywgYXR0cmlidXRlcwotCQkKLQlkZWYgc2VuZChzZWxmLCBjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzID0ge30sIGF0dHJpYnV0ZXMgPSB7fSk6Ci0JCSIiIlNlbmQgYW4gYXBwbGVldmVudCBnaXZlbiBjb2RlL3N1YmNvZGUvcGFycy9hdHRycyBhbmQgdW5wYWNrIHRoZSByZXBseSIiIgotCQlyZXR1cm4gc2VsZi5zZW5kZXZlbnQoc2VsZi5uZXdldmVudChjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzKSkKLQkKLQkjCi0JIyBUaGUgZm9sbG93aW5nIGV2ZW50cyBhcmUgc29tZWhvdyAic3RhbmRhcmQiIGFuZCBkb24ndCBzZWVtIHRvIGFwcGVhciBpbiBhbnkKLQkjIHN1aXRlLi4uCi0JIwotCWRlZiBhY3RpdmF0ZShzZWxmKToKLQkJIiIiU2VuZCAnYWN0aXZhdGUnIGNvbW1hbmQiIiIKLQkJc2VsZi5zZW5kKCdtaXNjJywgJ2FjdHYnKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaWduYXR1cmU9Tm9uZSwgc3RhcnQ9MCwgdGltZW91dD0wKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsIHdpdGggYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLgorICAgICAgICAKKyAgICAgICAgQWRkcmVzc2luZyB0aGUgYXBwbGljYXRpb24gaXMgZG9uZSBieSBzcGVjaWZ5aW5nIGVpdGhlciBhCisgICAgICAgIDQtYnl0ZSBzaWduYXR1cmUsIGFuIEFFRGVzYyBvciBhbiBvYmplY3QgdGhhdCB3aWxsIF9fYWVwYWNrX18KKyAgICAgICAgdG8gYW4gQUVEZXNjLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50YXJnZXRfc2lnbmF0dXJlID0gTm9uZQorICAgICAgICBpZiBzaWduYXR1cmUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IHNlbGYuX3NpZ25hdHVyZQorICAgICAgICBpZiB0eXBlKHNpZ25hdHVyZSkgPT0gQUVEZXNjVHlwZToKKyAgICAgICAgICAgIHNlbGYudGFyZ2V0ID0gc2lnbmF0dXJlCisgICAgICAgIGVsaWYgdHlwZShzaWduYXR1cmUpID09IEluc3RhbmNlVHlwZSBhbmQgaGFzYXR0cihzaWduYXR1cmUsICdfX2FlcGFja19fJyk6CisgICAgICAgICAgICBzZWxmLnRhcmdldCA9IHNpZ25hdHVyZS5fX2FlcGFja19fKCkKKyAgICAgICAgZWxpZiB0eXBlKHNpZ25hdHVyZSkgPT0gU3RyaW5nVHlwZSBhbmQgbGVuKHNpZ25hdHVyZSkgPT0gNDoKKyAgICAgICAgICAgIHNlbGYudGFyZ2V0ID0gQUUuQUVDcmVhdGVEZXNjKEFwcGxlRXZlbnRzLnR5cGVBcHBsU2lnbmF0dXJlLCBzaWduYXR1cmUpCisgICAgICAgICAgICBzZWxmLnRhcmdldF9zaWduYXR1cmUgPSBzaWduYXR1cmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgInNpZ25hdHVyZSBzaG91bGQgYmUgNC1jaGFyIHN0cmluZyBvciBBRURlc2MiCisgICAgICAgIHNlbGYuc2VuZF9mbGFncyA9IEFwcGxlRXZlbnRzLmtBRVdhaXRSZXBseQorICAgICAgICBzZWxmLnNlbmRfcHJpb3JpdHkgPSBBcHBsZUV2ZW50cy5rQUVOb3JtYWxQcmlvcml0eQorICAgICAgICBpZiB0aW1lb3V0OgorICAgICAgICAgICAgc2VsZi5zZW5kX3RpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbmRfdGltZW91dCA9IEFwcGxlRXZlbnRzLmtBRURlZmF1bHRUaW1lb3V0CisgICAgICAgIGlmIHN0YXJ0OgorICAgICAgICAgICAgc2VsZi5fc3RhcnQoKQorICAgICAgICAKKyAgICBkZWYgX3N0YXJ0KHNlbGYpOgorICAgICAgICAiIiJTdGFydCB0aGUgYXBwbGljYXRpb24sIGlmIGl0IGlzIG5vdCBydW5uaW5nIHlldCIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNlbmQoJ2FzY3InLCAnbm9vcCcpCisgICAgICAgIGV4Y2VwdCBBRS5FcnJvcjoKKyAgICAgICAgICAgIF9sYXVuY2goc2VsZi50YXJnZXRfc2lnbmF0dXJlKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTEFVTkNIX01BWF9XQUlUX1RJTUUpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kKCdhc2NyJywgJ25vb3AnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBBRS5FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAgICAgCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICAiIiJEZXByZWNhdGVkLCB1c2VkIF9zdGFydCgpIiIiCisgICAgICAgIHNlbGYuX3N0YXJ0KCkKKyAgICAgICAgICAgIAorICAgIGRlZiBuZXdldmVudChzZWxmLCBjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzID0ge30sIGF0dHJpYnV0ZXMgPSB7fSk6CisgICAgICAgICIiIkNyZWF0ZSBhIGNvbXBsZXRlIHN0cnVjdHVyZSBmb3IgYW4gYXBwbGUgZXZlbnQiIiIKKyAgICAgICAgCisgICAgICAgIGV2ZW50ID0gQUUuQUVDcmVhdGVBcHBsZUV2ZW50KGNvZGUsIHN1YmNvZGUsIHNlbGYudGFyZ2V0LAorICAgICAgICAgICAgICAgICAgQXBwbGVFdmVudHMua0F1dG9HZW5lcmF0ZVJldHVybklELCBBcHBsZUV2ZW50cy5rQW55VHJhbnNhY3Rpb25JRCkKKyAgICAgICAgcGFja2V2ZW50KGV2ZW50LCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzKQorICAgICAgICByZXR1cm4gZXZlbnQKKyAgICAKKyAgICBkZWYgc2VuZGV2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiU2VuZCBhIHByZS1jcmVhdGVkIGFwcGxlZXZlbnQsIGF3YWl0IHRoZSByZXBseSBhbmQgdW5wYWNrIGl0IiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9fZW5zdXJlX1dNQXZhaWxhYmxlKCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJObyB3aW5kb3cgbWFuYWdlciBhY2Nlc3MsIGNhbm5vdCBzZW5kIEFwcGxlRXZlbnQiCisgICAgICAgIHJlcGx5ID0gZXZlbnQuQUVTZW5kKHNlbGYuc2VuZF9mbGFncywgc2VsZi5zZW5kX3ByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF90aW1lb3V0KQorICAgICAgICBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzID0gdW5wYWNrZXZlbnQocmVwbHksIHNlbGYuX21vZHVsZU5hbWUpCisgICAgICAgIHJldHVybiByZXBseSwgcGFyYW1ldGVycywgYXR0cmlidXRlcworICAgICAgICAKKyAgICBkZWYgc2VuZChzZWxmLCBjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzID0ge30sIGF0dHJpYnV0ZXMgPSB7fSk6CisgICAgICAgICIiIlNlbmQgYW4gYXBwbGVldmVudCBnaXZlbiBjb2RlL3N1YmNvZGUvcGFycy9hdHRycyBhbmQgdW5wYWNrIHRoZSByZXBseSIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZW5kZXZlbnQoc2VsZi5uZXdldmVudChjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzKSkKKyAgICAKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGV2ZW50cyBhcmUgc29tZWhvdyAic3RhbmRhcmQiIGFuZCBkb24ndCBzZWVtIHRvIGFwcGVhciBpbiBhbnkKKyAgICAjIHN1aXRlLi4uCisgICAgIworICAgIGRlZiBhY3RpdmF0ZShzZWxmKToKKyAgICAgICAgIiIiU2VuZCAnYWN0aXZhdGUnIGNvbW1hbmQiIiIKKyAgICAgICAgc2VsZi5zZW5kKCdtaXNjJywgJ2FjdHYnKQogCi0JZGVmIF9nZXQoc2VsZiwgX29iamVjdCwgYXM9Tm9uZSwgX2F0dHJpYnV0ZXM9e30pOgotCQkiIiJfZ2V0OiBnZXQgZGF0YSBmcm9tIGFuIG9iamVjdAotCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdAotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IHRoZSBkYXRhCi0JCSIiIgotCQlfY29kZSA9ICdjb3JlJwotCQlfc3ViY29kZSA9ICdnZXRkJworICAgIGRlZiBfZ2V0KHNlbGYsIF9vYmplY3QsIGFzPU5vbmUsIF9hdHRyaWJ1dGVzPXt9KToKKyAgICAgICAgIiIiX2dldDogZ2V0IGRhdGEgZnJvbSBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgZGF0YQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZ2V0ZCcKIAotCQlfYXJndW1lbnRzID0geyctLS0tJzpfb2JqZWN0fQotCQlpZiBhczoKLQkJCV9hcmd1bWVudHNbJ3J0eXAnXSA9IG1rdHlwZShhcykKKyAgICAgICAgX2FyZ3VtZW50cyA9IHsnLS0tLSc6X29iamVjdH0KKyAgICAgICAgaWYgYXM6CisgICAgICAgICAgICBfYXJndW1lbnRzWydydHlwJ10gPSBta3R5cGUoYXMpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgRXJyb3IsIGRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCBkZWNvZGVlcnJvcihfYXJndW1lbnRzKQogCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQotCQkJaWYgYXM6Ci0JCQkJaXRlbS5fX2NsYXNzX18gPSBhcwotCQkJcmV0dXJuIGl0ZW0KLQkKLQlnZXQgPSBfZ2V0Ci0JCQkKLQlfYXJnbWFwX3NldCA9IHsKLQkJJ3RvJyA6ICdkYXRhJywKLQl9CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICAgICAgaWYgYXM6CisgICAgICAgICAgICAgICAgaXRlbS5fX2NsYXNzX18gPSBhcworICAgICAgICAgICAgcmV0dXJuIGl0ZW0KKyAgICAKKyAgICBnZXQgPSBfZ2V0CisgICAgICAgICAgICAKKyAgICBfYXJnbWFwX3NldCA9IHsKKyAgICAgICAgJ3RvJyA6ICdkYXRhJywKKyAgICB9CiAKLQlkZWYgX3NldChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2V0OiBTZXQgYW4gb2JqZWN0J3MgZGF0YS4KLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCi0JCUtleXdvcmQgYXJndW1lbnQgdG86IFRoZSBuZXcgdmFsdWUuCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJIiIiCi0JCV9jb2RlID0gJ2NvcmUnCi0JCV9zdWJjb2RlID0gJ3NldGQnCisgICAgZGVmIF9zZXQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNldDogU2V0IGFuIG9iamVjdCdzIGRhdGEuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiBUaGUgbmV3IHZhbHVlLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdzZXRkJwogCi0JCWtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZXQpCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAga2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NldCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6Ci0JCQlyYWlzZSBFcnJvciwgZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KLQkJCQotCXNldCA9IF9zZXQKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgICAgIAorICAgIHNldCA9IF9zZXQKIAogIyBUaW55IEZpbmRlciBjbGFzcywgZm9yIGxvY2FsIHVzZSBvbmx5CiAKIGNsYXNzIF9taW5pRmluZGVyKFRhbGtUbyk6Ci0JZGVmIG9wZW4oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiIm9wZW46IE9wZW4gdGhlIHNwZWNpZmllZCBvYmplY3QocykKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBvcGVuCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJIiIiCi0JCV9jb2RlID0gJ2FldnQnCi0JCV9zdWJjb2RlID0gJ29kb2MnCisgICAgZGVmIG9wZW4oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm9wZW46IE9wZW4gdGhlIHNwZWNpZmllZCBvYmplY3QocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBvcGVuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29kb2MnCiAKLQkJaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CiAKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBFcnJvciwgZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsIGRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAjcGFzcwotCQorICAgIAogX2ZpbmRlciA9IF9taW5pRmluZGVyKCdNQUNTJykKIAogZGVmIF9sYXVuY2goYXBwZmlsZSk6Ci0JIiIiT3BlbiBhIGZpbGUgdGhydSB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMiIiIKLQlfZmluZGVyLm9wZW4oX2FwcGxpY2F0aW9uX2ZpbGUoKCdJRCAgJywgYXBwZmlsZSkpKQorICAgICIiIk9wZW4gYSBmaWxlIHRocnUgdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjIiIiCisgICAgX2ZpbmRlci5vcGVuKF9hcHBsaWNhdGlvbl9maWxlKCgnSUQgICcsIGFwcGZpbGUpKSkKIAogCiBjbGFzcyBfYXBwbGljYXRpb25fZmlsZShDb21wb25lbnRJdGVtKToKLQkiIiJhcHBsaWNhdGlvbiBmaWxlIC0gQW4gYXBwbGljYXRpb24ncyBmaWxlIG9uIGRpc2siIiIKLQl3YW50ID0gJ2FwcGYnCi0JCisgICAgIiIiYXBwbGljYXRpb24gZmlsZSAtIEFuIGFwcGxpY2F0aW9uJ3MgZmlsZSBvbiBkaXNrIiIiCisgICAgd2FudCA9ICdhcHBmJworICAgIAogX2FwcGxpY2F0aW9uX2ZpbGUuX3Byb3BkaWN0ID0gewogfQogX2FwcGxpY2F0aW9uX2ZpbGUuX2VsZW1kaWN0ID0gewogfQotCQorICAgIAogIyBUZXN0IHByb2dyYW0KICMgWFhYWCBTaG91bGQgdGVzdCBtb3JlLCByZWFsbHkuLi4KIAogZGVmIHRlc3QoKToKLQl0YXJnZXQgPSBBRS5BRUNyZWF0ZURlc2MoJ3NpZ24nLCAncXVpbCcpCi0JYWUgPSBBRS5BRUNyZWF0ZUFwcGxlRXZlbnQoJ2FldnQnLCAnb2FwcCcsIHRhcmdldCwgLTEsIDApCi0JcHJpbnQgdW5wYWNrZXZlbnQoYWUpCi0JcmF3X2lucHV0KCI6IikKLQlhZSA9IEFFLkFFQ3JlYXRlQXBwbGVFdmVudCgnY29yZScsICdnZXRkJywgdGFyZ2V0LCAtMSwgMCkKLQlvYmogPSBDaGFyYWN0ZXIoMiwgV29yZCgxLCBEb2N1bWVudCgxKSkpCi0JcHJpbnQgb2JqCi0JcHJpbnQgcmVwcihvYmopCi0JcGFja2V2ZW50KGFlLCB7Jy0tLS0nOiBvYmp9KQotCXBhcmFtcywgYXR0cnMgPSB1bnBhY2tldmVudChhZSkKLQlwcmludCBwYXJhbXNbJy0tLS0nXQotCXJhd19pbnB1dCgiOiIpCisgICAgdGFyZ2V0ID0gQUUuQUVDcmVhdGVEZXNjKCdzaWduJywgJ3F1aWwnKQorICAgIGFlID0gQUUuQUVDcmVhdGVBcHBsZUV2ZW50KCdhZXZ0JywgJ29hcHAnLCB0YXJnZXQsIC0xLCAwKQorICAgIHByaW50IHVucGFja2V2ZW50KGFlKQorICAgIHJhd19pbnB1dCgiOiIpCisgICAgYWUgPSBBRS5BRUNyZWF0ZUFwcGxlRXZlbnQoJ2NvcmUnLCAnZ2V0ZCcsIHRhcmdldCwgLTEsIDApCisgICAgb2JqID0gQ2hhcmFjdGVyKDIsIFdvcmQoMSwgRG9jdW1lbnQoMSkpKQorICAgIHByaW50IG9iagorICAgIHByaW50IHJlcHIob2JqKQorICAgIHBhY2tldmVudChhZSwgeyctLS0tJzogb2JqfSkKKyAgICBwYXJhbXMsIGF0dHJzID0gdW5wYWNrZXZlbnQoYWUpCisgICAgcHJpbnQgcGFyYW1zWyctLS0tJ10KKyAgICByYXdfaW5wdXQoIjoiKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCXRlc3QoKQotCXN5cy5leGl0KDEpCisgICAgdGVzdCgpCisgICAgc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9hZXR5cGVzLnB5IGIvTGliL3BsYXQtbWFjL2FldHlwZXMucHkKaW5kZXggZTYyZTg2Ni4uNTM4Y2YxNCAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2FldHlwZXMucHkKKysrIGIvTGliL3BsYXQtbWFjL2FldHlwZXMucHkKQEAgLTEwLDU0OSArMTAsNTQ5IEBACiAjIGFldG9vbHNfY29udmVydC4KICMKIGRlZiBwYWNrKCphcmdzLCAqKmt3YXJncyk6Ci0JZnJvbSBhZXBhY2sgaW1wb3J0IHBhY2sKLQlyZXR1cm4gcGFjayggKmFyZ3MsICoqa3dhcmdzKQotCQorICAgIGZyb20gYWVwYWNrIGltcG9ydCBwYWNrCisgICAgcmV0dXJuIHBhY2soICphcmdzLCAqKmt3YXJncykKKyAgICAKIGRlZiBuaWNlKHMpOgotCSIiIiduaWNlJyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QiIiIKLQlpZiB0eXBlKHMpIGlzIFN0cmluZ1R5cGU6IHJldHVybiByZXByKHMpCi0JZWxzZTogcmV0dXJuIHN0cihzKQorICAgICIiIiduaWNlJyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QiIiIKKyAgICBpZiB0eXBlKHMpIGlzIFN0cmluZ1R5cGU6IHJldHVybiByZXByKHMpCisgICAgZWxzZTogcmV0dXJuIHN0cihzKQogCiBjbGFzcyBVbmtub3duOgotCSIiIkFuIHVuaW50ZXJwcmV0ZWQgQUUgb2JqZWN0IiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHR5cGUsIGRhdGEpOgotCQlzZWxmLnR5cGUgPSB0eXBlCi0JCXNlbGYuZGF0YSA9IGRhdGEKLQkKLQlkZWYgX19yZXByX18oc2VsZik6Ci0JCXJldHVybiAiVW5rbm93biglcywgJXMpIiAlIChgc2VsZi50eXBlYCwgYHNlbGYuZGF0YWApCi0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHNlbGYuZGF0YSwgc2VsZi50eXBlKQorICAgICIiIkFuIHVuaW50ZXJwcmV0ZWQgQUUgb2JqZWN0IiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGUsIGRhdGEpOgorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVW5rbm93biglcywgJXMpIiAlIChgc2VsZi50eXBlYCwgYHNlbGYuZGF0YWApCisgICAgCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJldHVybiBwYWNrKHNlbGYuZGF0YSwgc2VsZi50eXBlKQogCiBjbGFzcyBFbnVtOgotCSIiIkFuIEFFIGVudW1lcmF0aW9uIHZhbHVlIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGVudW0pOgotCQlzZWxmLmVudW0gPSAiJS00LjRzIiAlIHN0cihlbnVtKQotCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICJFbnVtKCVzKSIgJSBgc2VsZi5lbnVtYAotCQotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlyZXR1cm4gc3RyaW5nLnN0cmlwKHNlbGYuZW51bSkKLQkKLQlkZWYgX19hZXBhY2tfXyhzZWxmKToKLQkJcmV0dXJuIHBhY2soc2VsZi5lbnVtLCB0eXBlRW51bWVyYXRpb24pCisgICAgIiIiQW4gQUUgZW51bWVyYXRpb24gdmFsdWUiIiIKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZW51bSk6CisgICAgICAgIHNlbGYuZW51bSA9ICIlLTQuNHMiICUgc3RyKGVudW0pCisgICAgCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkVudW0oJXMpIiAlIGBzZWxmLmVudW1gCisgICAgCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHJpbmcuc3RyaXAoc2VsZi5lbnVtKQorICAgIAorICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayhzZWxmLmVudW0sIHR5cGVFbnVtZXJhdGlvbikKIAogZGVmIElzRW51bSh4KToKLQlyZXR1cm4gaXNpbnN0YW5jZSh4LCBFbnVtKQorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIEVudW0pCiAKIGRlZiBta2VudW0oZW51bSk6Ci0JaWYgSXNFbnVtKGVudW0pOiByZXR1cm4gZW51bQotCXJldHVybiBFbnVtKGVudW0pCisgICAgaWYgSXNFbnVtKGVudW0pOiByZXR1cm4gZW51bQorICAgIHJldHVybiBFbnVtKGVudW0pCiAKICMgSmFjayBjaGFuZ2VkIHRoZSB3YXkgdGhpcyBpcyBkb25lCiBjbGFzcyBJbnNlcnRpb25Mb2M6Ci0JZGVmIF9faW5pdF9fKHNlbGYsIG9mLCBwb3MpOgotCQlzZWxmLm9mID0gb2YKLQkJc2VsZi5wb3MgPSBwb3MKLQkKLQlkZWYgX19yZXByX18oc2VsZik6Ci0JCXJldHVybiAiSW5zZXJ0aW9uTG9jKCVzLCAlcykiICUgKGBzZWxmLm9mYCwgYHNlbGYucG9zYCkKLQkJCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJlYyA9IHsna29iaic6IHNlbGYub2YsICdrcG9zJzogc2VsZi5wb3N9Ci0JCXJldHVybiBwYWNrKHJlYywgZm9yY2V0eXBlPSdpbnNsJykKLQkJCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mLCBwb3MpOgorICAgICAgICBzZWxmLm9mID0gb2YKKyAgICAgICAgc2VsZi5wb3MgPSBwb3MKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSW5zZXJ0aW9uTG9jKCVzLCAlcykiICUgKGBzZWxmLm9mYCwgYHNlbGYucG9zYCkKKyAgICAgICAgCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJlYyA9IHsna29iaic6IHNlbGYub2YsICdrcG9zJzogc2VsZi5wb3N9CisgICAgICAgIHJldHVybiBwYWNrKHJlYywgZm9yY2V0eXBlPSdpbnNsJykKKyAgICAgICAgCiAjIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgZHNwOgogZGVmIGJlZ2lubmluZyhvZik6Ci0JcmV0dXJuIEluc2VydGlvbkxvYyhvZiwgRW51bSgnYmduZycpKQotCQorICAgIHJldHVybiBJbnNlcnRpb25Mb2Mob2YsIEVudW0oJ2JnbmcnKSkKKyAgICAKIGRlZiBlbmQob2YpOgotCXJldHVybiBJbnNlcnRpb25Mb2Mob2YsIEVudW0oJ2VuZCAnKSkKKyAgICByZXR1cm4gSW5zZXJ0aW9uTG9jKG9mLCBFbnVtKCdlbmQgJykpCiAKIGNsYXNzIEJvb2xlYW46Ci0JIiIiQW4gQUUgYm9vbGVhbiB2YWx1ZSIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBib29sKToKLQkJc2VsZi5ib29sID0gKG5vdCBub3QgYm9vbCkKLQkKLQlkZWYgX19yZXByX18oc2VsZik6Ci0JCXJldHVybiAiQm9vbGVhbiglcykiICUgYHNlbGYuYm9vbGAKLQkKLQlkZWYgX19zdHJfXyhzZWxmKToKLQkJaWYgc2VsZi5ib29sOgotCQkJcmV0dXJuICJUcnVlIgotCQllbHNlOgotCQkJcmV0dXJuICJGYWxzZSIKLQkKLQlkZWYgX19hZXBhY2tfXyhzZWxmKToKLQkJcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2InLCBzZWxmLmJvb2wpLCAnYm9vbCcpCisgICAgIiIiQW4gQUUgYm9vbGVhbiB2YWx1ZSIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib29sKToKKyAgICAgICAgc2VsZi5ib29sID0gKG5vdCBub3QgYm9vbCkKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQm9vbGVhbiglcykiICUgYHNlbGYuYm9vbGAKKyAgICAKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5ib29sOgorICAgICAgICAgICAgcmV0dXJuICJUcnVlIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJGYWxzZSIKKyAgICAKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2InLCBzZWxmLmJvb2wpLCAnYm9vbCcpCiAKIGRlZiBJc0Jvb2xlYW4oeCk6Ci0JcmV0dXJuIGlzaW5zdGFuY2UoeCwgQm9vbGVhbikKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBCb29sZWFuKQogCiBkZWYgbWtib29sZWFuKGJvb2wpOgotCWlmIElzQm9vbGVhbihib29sKTogcmV0dXJuIGJvb2wKLQlyZXR1cm4gQm9vbGVhbihib29sKQorICAgIGlmIElzQm9vbGVhbihib29sKTogcmV0dXJuIGJvb2wKKyAgICByZXR1cm4gQm9vbGVhbihib29sKQogCiBjbGFzcyBUeXBlOgotCSIiIkFuIEFFIDQtY2hhciB0eXBlbmFtZSBvYmplY3QiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgdHlwZSk6Ci0JCXNlbGYudHlwZSA9ICIlLTQuNHMiICUgc3RyKHR5cGUpCi0JCi0JZGVmIF9fcmVwcl9fKHNlbGYpOgotCQlyZXR1cm4gIlR5cGUoJXMpIiAlIGBzZWxmLnR5cGVgCi0JCi0JZGVmIF9fc3RyX18oc2VsZik6Ci0JCXJldHVybiBzdHJpbmcuc3RyaXAoc2VsZi50eXBlKQotCQotCWRlZiBfX2FlcGFja19fKHNlbGYpOgotCQlyZXR1cm4gcGFjayhzZWxmLnR5cGUsIHR5cGVUeXBlKQorICAgICIiIkFuIEFFIDQtY2hhciB0eXBlbmFtZSBvYmplY3QiIiIKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSk6CisgICAgICAgIHNlbGYudHlwZSA9ICIlLTQuNHMiICUgc3RyKHR5cGUpCisgICAgCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlR5cGUoJXMpIiAlIGBzZWxmLnR5cGVgCisgICAgCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHJpbmcuc3RyaXAoc2VsZi50eXBlKQorICAgIAorICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayhzZWxmLnR5cGUsIHR5cGVUeXBlKQogCiBkZWYgSXNUeXBlKHgpOgotCXJldHVybiBpc2luc3RhbmNlKHgsIFR5cGUpCisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgVHlwZSkKIAogZGVmIG1rdHlwZSh0eXBlKToKLQlpZiBJc1R5cGUodHlwZSk6IHJldHVybiB0eXBlCi0JcmV0dXJuIFR5cGUodHlwZSkKKyAgICBpZiBJc1R5cGUodHlwZSk6IHJldHVybiB0eXBlCisgICAgcmV0dXJuIFR5cGUodHlwZSkKIAogCiBjbGFzcyBLZXl3b3JkOgotCSIiIkFuIEFFIDQtY2hhciBrZXl3b3JkIG9iamVjdCIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBrZXl3b3JkKToKLQkJc2VsZi5rZXl3b3JkID0gIiUtNC40cyIgJSBzdHIoa2V5d29yZCkKLQkKLQlkZWYgX19yZXByX18oc2VsZik6Ci0JCXJldHVybiAiS2V5d29yZCglcykiICUgYHNlbGYua2V5d29yZGAKLQkKLQlkZWYgX19zdHJfXyhzZWxmKToKLQkJcmV0dXJuIHN0cmluZy5zdHJpcChzZWxmLmtleXdvcmQpCi0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHNlbGYua2V5d29yZCwgdHlwZUtleXdvcmQpCisgICAgIiIiQW4gQUUgNC1jaGFyIGtleXdvcmQgb2JqZWN0IiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleXdvcmQpOgorICAgICAgICBzZWxmLmtleXdvcmQgPSAiJS00LjRzIiAlIHN0cihrZXl3b3JkKQorICAgIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJLZXl3b3JkKCVzKSIgJSBgc2VsZi5rZXl3b3JkYAorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyaW5nLnN0cmlwKHNlbGYua2V5d29yZCkKKyAgICAKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc2VsZi5rZXl3b3JkLCB0eXBlS2V5d29yZCkKIAogZGVmIElzS2V5d29yZCh4KToKLQlyZXR1cm4gaXNpbnN0YW5jZSh4LCBLZXl3b3JkKQorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIEtleXdvcmQpCiAKIGNsYXNzIFJhbmdlOgotCSIiIkFuIEFFIHJhbmdlIG9iamVjdCIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgc3RvcCk6Ci0JCXNlbGYuc3RhcnQgPSBzdGFydAotCQlzZWxmLnN0b3AgPSBzdG9wCi0JCi0JZGVmIF9fcmVwcl9fKHNlbGYpOgotCQlyZXR1cm4gIlJhbmdlKCVzLCAlcykiICUgKGBzZWxmLnN0YXJ0YCwgYHNlbGYuc3RvcGApCi0JCi0JZGVmIF9fc3RyX18oc2VsZik6Ci0JCXJldHVybiAiJXMgdGhydSAlcyIgJSAobmljZShzZWxmLnN0YXJ0KSwgbmljZShzZWxmLnN0b3ApKQotCQotCWRlZiBfX2FlcGFja19fKHNlbGYpOgotCQlyZXR1cm4gcGFjayh7J3N0YXInOiBzZWxmLnN0YXJ0LCAnc3RvcCc6IHNlbGYuc3RvcH0sICdyYW5nJykKKyAgICAiIiJBbiBBRSByYW5nZSBvYmplY3QiIiIKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIHN0b3ApOgorICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKKyAgICAgICAgc2VsZi5zdG9wID0gc3RvcAorICAgIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJSYW5nZSglcywgJXMpIiAlIChgc2VsZi5zdGFydGAsIGBzZWxmLnN0b3BgKQorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzIHRocnUgJXMiICUgKG5pY2Uoc2VsZi5zdGFydCksIG5pY2Uoc2VsZi5zdG9wKSkKKyAgICAKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soeydzdGFyJzogc2VsZi5zdGFydCwgJ3N0b3AnOiBzZWxmLnN0b3B9LCAncmFuZycpCiAKIGRlZiBJc1JhbmdlKHgpOgotCXJldHVybiBpc2luc3RhbmNlKHgsIFJhbmdlKQorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIFJhbmdlKQogCiBjbGFzcyBDb21wYXJpc29uOgotCSIiIkFuIEFFIENvbXBhcmlzb24iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgb2JqMSwgcmVsbywgb2JqMik6Ci0JCXNlbGYub2JqMSA9IG9iajEKLQkJc2VsZi5yZWxvID0gIiUtNC40cyIgJSBzdHIocmVsbykKLQkJc2VsZi5vYmoyID0gb2JqMgotCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICJDb21wYXJpc29uKCVzLCAlcywgJXMpIiAlIChgc2VsZi5vYmoxYCwgYHNlbGYucmVsb2AsIGBzZWxmLm9iajJgKQotCQotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlyZXR1cm4gIiVzICVzICVzIiAlIChuaWNlKHNlbGYub2JqMSksIHN0cmluZy5zdHJpcChzZWxmLnJlbG8pLCBuaWNlKHNlbGYub2JqMikpCi0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHsnb2JqMSc6IHNlbGYub2JqMSwKLQkJCSAgICAgJ3JlbG8nOiBta2VudW0oc2VsZi5yZWxvKSwKLQkJCSAgICAgJ29iajInOiBzZWxmLm9iajJ9LAotCQkJICAgICdjbXBkJykKKyAgICAiIiJBbiBBRSBDb21wYXJpc29uIiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iajEsIHJlbG8sIG9iajIpOgorICAgICAgICBzZWxmLm9iajEgPSBvYmoxCisgICAgICAgIHNlbGYucmVsbyA9ICIlLTQuNHMiICUgc3RyKHJlbG8pCisgICAgICAgIHNlbGYub2JqMiA9IG9iajIKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQ29tcGFyaXNvbiglcywgJXMsICVzKSIgJSAoYHNlbGYub2JqMWAsIGBzZWxmLnJlbG9gLCBgc2VsZi5vYmoyYCkKKyAgICAKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyAlcyAlcyIgJSAobmljZShzZWxmLm9iajEpLCBzdHJpbmcuc3RyaXAoc2VsZi5yZWxvKSwgbmljZShzZWxmLm9iajIpKQorICAgIAorICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayh7J29iajEnOiBzZWxmLm9iajEsCisgICAgICAgICAgICAgICAgICdyZWxvJzogbWtlbnVtKHNlbGYucmVsbyksCisgICAgICAgICAgICAgICAgICdvYmoyJzogc2VsZi5vYmoyfSwKKyAgICAgICAgICAgICAgICAnY21wZCcpCiAKIGRlZiBJc0NvbXBhcmlzb24oeCk6Ci0JcmV0dXJuIGlzaW5zdGFuY2UoeCwgQ29tcGFyaXNvbikKLQkKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBDb21wYXJpc29uKQorICAgIAogY2xhc3MgTkNvbXBhcmlzb24oQ29tcGFyaXNvbik6Ci0JIyBUaGUgY2xhc3MgYXR0cmlidXRlICdyZWxvJyBtdXN0IGJlIHNldCBpbiBhIHN1YmNsYXNzCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIG9iajEsIG9iajIpOgotCQlDb21wYXJpc29uLl9faW5pdF9fKG9iajEsIHNlbGYucmVsbywgb2JqMikKKyAgICAjIFRoZSBjbGFzcyBhdHRyaWJ1dGUgJ3JlbG8nIG11c3QgYmUgc2V0IGluIGEgc3ViY2xhc3MKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqMSwgb2JqMik6CisgICAgICAgIENvbXBhcmlzb24uX19pbml0X18ob2JqMSwgc2VsZi5yZWxvLCBvYmoyKQogCiBjbGFzcyBPcmRpbmFsOgotCSIiIkFuIEFFIE9yZGluYWwiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgYWJzbyk6Ci0jCQlzZWxmLm9iajEgPSBvYmoxCi0JCXNlbGYuYWJzbyA9ICIlLTQuNHMiICUgc3RyKGFic28pCi0JCi0JZGVmIF9fcmVwcl9fKHNlbGYpOgotCQlyZXR1cm4gIk9yZGluYWwoJXMpIiAlIChgc2VsZi5hYnNvYCkKLQkKLQlkZWYgX19zdHJfXyhzZWxmKToKLQkJcmV0dXJuICIlcyIgJSAoc3RyaW5nLnN0cmlwKHNlbGYuYWJzbykpCi0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHNlbGYuYWJzbywgJ2Fic28nKQorICAgICIiIkFuIEFFIE9yZGluYWwiIiIKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWJzbyk6CisjICAgICAgIHNlbGYub2JqMSA9IG9iajEKKyAgICAgICAgc2VsZi5hYnNvID0gIiUtNC40cyIgJSBzdHIoYWJzbykKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiT3JkaW5hbCglcykiICUgKGBzZWxmLmFic29gKQorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzIiAlIChzdHJpbmcuc3RyaXAoc2VsZi5hYnNvKSkKKyAgICAKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc2VsZi5hYnNvLCAnYWJzbycpCiAKIGRlZiBJc09yZGluYWwoeCk6Ci0JcmV0dXJuIGlzaW5zdGFuY2UoeCwgT3JkaW5hbCkKLQkKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBPcmRpbmFsKQorICAgIAogY2xhc3MgTk9yZGluYWwoT3JkaW5hbCk6Ci0JIyBUaGUgY2xhc3MgYXR0cmlidXRlICdhYnNvJyBtdXN0IGJlIHNldCBpbiBhIHN1YmNsYXNzCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlPcmRpbmFsLl9faW5pdF9fKHNlbGYsIHNlbGYuYWJzbykKKyAgICAjIFRoZSBjbGFzcyBhdHRyaWJ1dGUgJ2Fic28nIG11c3QgYmUgc2V0IGluIGEgc3ViY2xhc3MKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIE9yZGluYWwuX19pbml0X18oc2VsZiwgc2VsZi5hYnNvKQogCiBjbGFzcyBMb2dpY2FsOgotCSIiIkFuIEFFIGxvZ2ljYWwgZXhwcmVzc2lvbiBvYmplY3QiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgbG9nYywgdGVybSk6Ci0JCXNlbGYubG9nYyA9ICIlLTQuNHMiICUgc3RyKGxvZ2MpCi0JCXNlbGYudGVybSA9IHRlcm0KLQkKLQlkZWYgX19yZXByX18oc2VsZik6Ci0JCXJldHVybiAiTG9naWNhbCglcywgJXMpIiAlIChgc2VsZi5sb2djYCwgYHNlbGYudGVybWApCi0JCi0JZGVmIF9fc3RyX18oc2VsZik6Ci0JCWlmIHR5cGUoc2VsZi50ZXJtKSA9PSBMaXN0VHlwZSBhbmQgbGVuKHNlbGYudGVybSkgPT0gMjoKLQkJCXJldHVybiAiJXMgJXMgJXMiICUgKG5pY2Uoc2VsZi50ZXJtWzBdKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5zdHJpcChzZWxmLmxvZ2MpLAotCQkJICAgICAgICAgICAgICAgICAgICAgbmljZShzZWxmLnRlcm1bMV0pKQotCQllbHNlOgotCQkJcmV0dXJuICIlcyglcykiICUgKHN0cmluZy5zdHJpcChzZWxmLmxvZ2MpLCBuaWNlKHNlbGYudGVybSkpCi0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHsnbG9nYyc6IG1rZW51bShzZWxmLmxvZ2MpLCAndGVybSc6IHNlbGYudGVybX0sICdsb2dpJykKKyAgICAiIiJBbiBBRSBsb2dpY2FsIGV4cHJlc3Npb24gb2JqZWN0IiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ2MsIHRlcm0pOgorICAgICAgICBzZWxmLmxvZ2MgPSAiJS00LjRzIiAlIHN0cihsb2djKQorICAgICAgICBzZWxmLnRlcm0gPSB0ZXJtCisgICAgCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxvZ2ljYWwoJXMsICVzKSIgJSAoYHNlbGYubG9nY2AsIGBzZWxmLnRlcm1gKQorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiB0eXBlKHNlbGYudGVybSkgPT0gTGlzdFR5cGUgYW5kIGxlbihzZWxmLnRlcm0pID09IDI6CisgICAgICAgICAgICByZXR1cm4gIiVzICVzICVzIiAlIChuaWNlKHNlbGYudGVybVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuc3RyaXAoc2VsZi5sb2djKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pY2Uoc2VsZi50ZXJtWzFdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiJXMoJXMpIiAlIChzdHJpbmcuc3RyaXAoc2VsZi5sb2djKSwgbmljZShzZWxmLnRlcm0pKQorICAgIAorICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayh7J2xvZ2MnOiBta2VudW0oc2VsZi5sb2djKSwgJ3Rlcm0nOiBzZWxmLnRlcm19LCAnbG9naScpCiAKIGRlZiBJc0xvZ2ljYWwoeCk6Ci0JcmV0dXJuIGlzaW5zdGFuY2UoeCwgTG9naWNhbCkKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBMb2dpY2FsKQogCiBjbGFzcyBTdHlsZWRUZXh0OgotCSIiIkFuIEFFIG9iamVjdCByZXNwcmVzZW50aW5nIHRleHQgaW4gYSBjZXJ0YWluIHN0eWxlIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHN0eWxlLCB0ZXh0KToKLQkJc2VsZi5zdHlsZSA9IHN0eWxlCi0JCXNlbGYudGV4dCA9IHRleHQKLQkKLQlkZWYgX19yZXByX18oc2VsZik6Ci0JCXJldHVybiAiU3R5bGVkVGV4dCglcywgJXMpIiAlIChgc2VsZi5zdHlsZWAsIGBzZWxmLnRleHRgKQotCQotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlyZXR1cm4gc2VsZi50ZXh0Ci0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHsna3N0eSc6IHNlbGYuc3R5bGUsICdrdHh0Jzogc2VsZi50ZXh0fSwgJ1NUWFQnKQorICAgICIiIkFuIEFFIG9iamVjdCByZXNwcmVzZW50aW5nIHRleHQgaW4gYSBjZXJ0YWluIHN0eWxlIiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0eWxlLCB0ZXh0KToKKyAgICAgICAgc2VsZi5zdHlsZSA9IHN0eWxlCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiU3R5bGVkVGV4dCglcywgJXMpIiAlIChgc2VsZi5zdHlsZWAsIGBzZWxmLnRleHRgKQorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0CisgICAgCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJldHVybiBwYWNrKHsna3N0eSc6IHNlbGYuc3R5bGUsICdrdHh0Jzogc2VsZi50ZXh0fSwgJ1NUWFQnKQogCiBkZWYgSXNTdHlsZWRUZXh0KHgpOgotCXJldHVybiBpc2luc3RhbmNlKHgsIFN0eWxlZFRleHQpCisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgU3R5bGVkVGV4dCkKIAogY2xhc3MgQUVUZXh0OgotCSIiIkFuIEFFIHRleHQgb2JqZWN0IHdpdGggc3R5bGUsIHNjcmlwdCBhbmQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHNjcmlwdCwgc3R5bGUsIHRleHQpOgotCQlzZWxmLnNjcmlwdCA9IHNjcmlwdAotCQlzZWxmLnN0eWxlID0gc3R5bGUKLQkJc2VsZi50ZXh0ID0gdGV4dAotCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICJBRVRleHQoJXMsICVzLCAlcykiICUgKGBzZWxmLnNjcmlwdGAsIGBzZWxmLnN0eWxlYCwgYHNlbGYudGV4dGApCi0JCi0JZGVmIF9fc3RyX18oc2VsZik6Ci0JCXJldHVybiBzZWxmLnRleHQKLQkKLQlkZWYgX19hZXBhY2tfXyhzZWxmKToKLQkJcmV0dXJuIHBhY2soe2tleUFFU2NyaXB0VGFnOiBzZWxmLnNjcmlwdCwga2V5QUVTdHlsZXM6IHNlbGYuc3R5bGUsCi0JCQkJIGtleUFFVGV4dDogc2VsZi50ZXh0fSwgdHlwZUFFVGV4dCkKKyAgICAiIiJBbiBBRSB0ZXh0IG9iamVjdCB3aXRoIHN0eWxlLCBzY3JpcHQgYW5kIGxhbmd1YWdlIHNwZWNpZmllZCIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY3JpcHQsIHN0eWxlLCB0ZXh0KToKKyAgICAgICAgc2VsZi5zY3JpcHQgPSBzY3JpcHQKKyAgICAgICAgc2VsZi5zdHlsZSA9IHN0eWxlCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQUVUZXh0KCVzLCAlcywgJXMpIiAlIChgc2VsZi5zY3JpcHRgLCBgc2VsZi5zdHlsZWAsIGBzZWxmLnRleHRgKQorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0CisgICAgCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJldHVybiBwYWNrKHtrZXlBRVNjcmlwdFRhZzogc2VsZi5zY3JpcHQsIGtleUFFU3R5bGVzOiBzZWxmLnN0eWxlLAorICAgICAgICAgICAgICAgICBrZXlBRVRleHQ6IHNlbGYudGV4dH0sIHR5cGVBRVRleHQpCiAKIGRlZiBJc0FFVGV4dCh4KToKLQlyZXR1cm4gaXNpbnN0YW5jZSh4LCBBRVRleHQpCisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgQUVUZXh0KQogCiBjbGFzcyBJbnRsVGV4dDoKLQkiIiJBIHRleHQgb2JqZWN0IHdpdGggc2NyaXB0IGFuZCBsYW5ndWFnZSBzcGVjaWZpZWQiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgc2NyaXB0LCBsYW5ndWFnZSwgdGV4dCk6Ci0JCXNlbGYuc2NyaXB0ID0gc2NyaXB0Ci0JCXNlbGYubGFuZ3VhZ2UgPSBsYW5ndWFnZQotCQlzZWxmLnRleHQgPSB0ZXh0Ci0JCi0JZGVmIF9fcmVwcl9fKHNlbGYpOgotCQlyZXR1cm4gIkludGxUZXh0KCVzLCAlcywgJXMpIiAlIChgc2VsZi5zY3JpcHRgLCBgc2VsZi5sYW5ndWFnZWAsIGBzZWxmLnRleHRgKQotCQotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlyZXR1cm4gc2VsZi50ZXh0Ci0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHN0cnVjdC5wYWNrKCdoaCcsIHNlbGYuc2NyaXB0LCBzZWxmLmxhbmd1YWdlKStzZWxmLnRleHQsCi0JCQl0eXBlSW50bFRleHQpCisgICAgIiIiQSB0ZXh0IG9iamVjdCB3aXRoIHNjcmlwdCBhbmQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjcmlwdCwgbGFuZ3VhZ2UsIHRleHQpOgorICAgICAgICBzZWxmLnNjcmlwdCA9IHNjcmlwdAorICAgICAgICBzZWxmLmxhbmd1YWdlID0gbGFuZ3VhZ2UKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJbnRsVGV4dCglcywgJXMsICVzKSIgJSAoYHNlbGYuc2NyaXB0YCwgYHNlbGYubGFuZ3VhZ2VgLCBgc2VsZi50ZXh0YCkKKyAgICAKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dAorICAgIAorICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayhzdHJ1Y3QucGFjaygnaGgnLCBzZWxmLnNjcmlwdCwgc2VsZi5sYW5ndWFnZSkrc2VsZi50ZXh0LAorICAgICAgICAgICAgdHlwZUludGxUZXh0KQogCiBkZWYgSXNJbnRsVGV4dCh4KToKLQlyZXR1cm4gaXNpbnN0YW5jZSh4LCBJbnRsVGV4dCkKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBJbnRsVGV4dCkKIAogY2xhc3MgSW50bFdyaXRpbmdDb2RlOgotCSIiIkFuIG9iamVjdCByZXByZXNlbnRpbmcgc2NyaXB0IGFuZCBsYW5ndWFnZSIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzY3JpcHQsIGxhbmd1YWdlKToKLQkJc2VsZi5zY3JpcHQgPSBzY3JpcHQKLQkJc2VsZi5sYW5ndWFnZSA9IGxhbmd1YWdlCi0JCi0JZGVmIF9fcmVwcl9fKHNlbGYpOgotCQlyZXR1cm4gIkludGxXcml0aW5nQ29kZSglcywgJXMpIiAlIChgc2VsZi5zY3JpcHRgLCBgc2VsZi5sYW5ndWFnZWApCi0JCi0JZGVmIF9fc3RyX18oc2VsZik6Ci0JCXJldHVybiAic2NyaXB0IHN5c3RlbSAlZCwgbGFuZ3VhZ2UgJWQiJShzZWxmLnNjcmlwdCwgc2VsZi5sYW5ndWFnZSkKLQkKLQlkZWYgX19hZXBhY2tfXyhzZWxmKToKLQkJcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoJywgc2VsZi5zY3JpcHQsIHNlbGYubGFuZ3VhZ2UpLAotCQkJdHlwZUludGxXcml0aW5nQ29kZSkKKyAgICAiIiJBbiBvYmplY3QgcmVwcmVzZW50aW5nIHNjcmlwdCBhbmQgbGFuZ3VhZ2UiIiIKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyaXB0LCBsYW5ndWFnZSk6CisgICAgICAgIHNlbGYuc2NyaXB0ID0gc2NyaXB0CisgICAgICAgIHNlbGYubGFuZ3VhZ2UgPSBsYW5ndWFnZQorICAgIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJbnRsV3JpdGluZ0NvZGUoJXMsICVzKSIgJSAoYHNlbGYuc2NyaXB0YCwgYHNlbGYubGFuZ3VhZ2VgKQorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gInNjcmlwdCBzeXN0ZW0gJWQsIGxhbmd1YWdlICVkIiUoc2VsZi5zY3JpcHQsIHNlbGYubGFuZ3VhZ2UpCisgICAgCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJldHVybiBwYWNrKHN0cnVjdC5wYWNrKCdoaCcsIHNlbGYuc2NyaXB0LCBzZWxmLmxhbmd1YWdlKSwKKyAgICAgICAgICAgIHR5cGVJbnRsV3JpdGluZ0NvZGUpCiAKIGRlZiBJc0ludGxXcml0aW5nQ29kZSh4KToKLQlyZXR1cm4gaXNpbnN0YW5jZSh4LCBJbnRsV3JpdGluZ0NvZGUpCisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgSW50bFdyaXRpbmdDb2RlKQogCiBjbGFzcyBRRFBvaW50OgotCSIiIkEgcG9pbnQiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgdiwgaCk6Ci0JCXNlbGYudiA9IHYKLQkJc2VsZi5oID0gaAotCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICJRRFBvaW50KCVzLCAlcykiICUgKGBzZWxmLnZgLCBgc2VsZi5oYCkKLQkKLQlkZWYgX19zdHJfXyhzZWxmKToKLQkJcmV0dXJuICIoJWQsICVkKSIlKHNlbGYudiwgc2VsZi5oKQotCQotCWRlZiBfX2FlcGFja19fKHNlbGYpOgotCQlyZXR1cm4gcGFjayhzdHJ1Y3QucGFjaygnaGgnLCBzZWxmLnYsIHNlbGYuaCksCi0JCQl0eXBlUURQb2ludCkKKyAgICAiIiJBIHBvaW50IiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHYsIGgpOgorICAgICAgICBzZWxmLnYgPSB2CisgICAgICAgIHNlbGYuaCA9IGgKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUURQb2ludCglcywgJXMpIiAlIChgc2VsZi52YCwgYHNlbGYuaGApCisgICAgCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiKCVkLCAlZCkiJShzZWxmLnYsIHNlbGYuaCkKKyAgICAKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoJywgc2VsZi52LCBzZWxmLmgpLAorICAgICAgICAgICAgdHlwZVFEUG9pbnQpCiAKIGRlZiBJc1FEUG9pbnQoeCk6Ci0JcmV0dXJuIGlzaW5zdGFuY2UoeCwgUURQb2ludCkKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBRRFBvaW50KQogCiBjbGFzcyBRRFJlY3RhbmdsZToKLQkiIiJBIHJlY3RhbmdsZSIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCB2MCwgaDAsIHYxLCBoMSk6Ci0JCXNlbGYudjAgPSB2MAotCQlzZWxmLmgwID0gaDAKLQkJc2VsZi52MSA9IHYxCi0JCXNlbGYuaDEgPSBoMQotCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICJRRFJlY3RhbmdsZSglcywgJXMsICVzLCAlcykiICUgKGBzZWxmLnYwYCwgYHNlbGYuaDBgLAotCQkJCWBzZWxmLnYxYCwgYHNlbGYuaDFgKQotCQotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlyZXR1cm4gIiglZCwgJWQpLSglZCwgJWQpIiUoc2VsZi52MCwgc2VsZi5oMCwgc2VsZi52MSwgc2VsZi5oMSkKLQkKLQlkZWYgX19hZXBhY2tfXyhzZWxmKToKLQkJcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoaGgnLCBzZWxmLnYwLCBzZWxmLmgwLCBzZWxmLnYxLCBzZWxmLmgxKSwKLQkJCXR5cGVRRFJlY3RhbmdsZSkKKyAgICAiIiJBIHJlY3RhbmdsZSIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2MCwgaDAsIHYxLCBoMSk6CisgICAgICAgIHNlbGYudjAgPSB2MAorICAgICAgICBzZWxmLmgwID0gaDAKKyAgICAgICAgc2VsZi52MSA9IHYxCisgICAgICAgIHNlbGYuaDEgPSBoMQorICAgIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJRRFJlY3RhbmdsZSglcywgJXMsICVzLCAlcykiICUgKGBzZWxmLnYwYCwgYHNlbGYuaDBgLAorICAgICAgICAgICAgICAgIGBzZWxmLnYxYCwgYHNlbGYuaDFgKQorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiglZCwgJWQpLSglZCwgJWQpIiUoc2VsZi52MCwgc2VsZi5oMCwgc2VsZi52MSwgc2VsZi5oMSkKKyAgICAKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoaGgnLCBzZWxmLnYwLCBzZWxmLmgwLCBzZWxmLnYxLCBzZWxmLmgxKSwKKyAgICAgICAgICAgIHR5cGVRRFJlY3RhbmdsZSkKIAogZGVmIElzUURSZWN0YW5nbGUoeCk6Ci0JcmV0dXJuIGlzaW5zdGFuY2UoeCwgUURSZWN0YW5nbGUpCisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgUURSZWN0YW5nbGUpCiAKIGNsYXNzIFJHQkNvbG9yOgotCSIiIkFuIFJHQiBjb2xvciIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCByLCBnLCBiKToKLQkJc2VsZi5yID0gcgotCQlzZWxmLmcgPSBnCi0JCXNlbGYuYiA9IGIKLQkJCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICJSR0JDb2xvciglcywgJXMsICVzKSIgJSAoYHNlbGYucmAsIGBzZWxmLmdgLCBgc2VsZi5iYCkKLQkKLQlkZWYgX19zdHJfXyhzZWxmKToKLQkJcmV0dXJuICIweCV4IHJlZCwgMHgleCBncmVlbiwgMHgleCBibHVlIiUgKHNlbGYuciwgc2VsZi5nLCBzZWxmLmIpCi0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHN0cnVjdC5wYWNrKCdoaGgnLCBzZWxmLnIsIHNlbGYuZywgc2VsZi5iKSwKLQkJCXR5cGVSR0JDb2xvcikKKyAgICAiIiJBbiBSR0IgY29sb3IiIiIKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgciwgZywgYik6CisgICAgICAgIHNlbGYuciA9IHIKKyAgICAgICAgc2VsZi5nID0gZworICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgICAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUkdCQ29sb3IoJXMsICVzLCAlcykiICUgKGBzZWxmLnJgLCBgc2VsZi5nYCwgYHNlbGYuYmApCisgICAgCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiMHgleCByZWQsIDB4JXggZ3JlZW4sIDB4JXggYmx1ZSIlIChzZWxmLnIsIHNlbGYuZywgc2VsZi5iKQorICAgIAorICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayhzdHJ1Y3QucGFjaygnaGhoJywgc2VsZi5yLCBzZWxmLmcsIHNlbGYuYiksCisgICAgICAgICAgICB0eXBlUkdCQ29sb3IpCiAKIGRlZiBJc1JHQkNvbG9yKHgpOgotCXJldHVybiBpc2luc3RhbmNlKHgsIFJHQkNvbG9yKQorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIFJHQkNvbG9yKQogCiBjbGFzcyBPYmplY3RTcGVjaWZpZXI6Ci0JCi0JIiIiQSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGFuZCBtYW5pcHVsYXRpb24gQUUgb2JqZWN0IHNwZWNpZmllcnMgaW4gcHl0aG9uLgotCQotCUFuIG9iamVjdCBzcGVjaWZpZXIgaXMgYWN0dWFsbHkgYSByZWNvcmQgd2l0aCBmb3VyIGZpZWxkczoKLQkKLQlrZXkJdHlwZQlkZXNjcmlwdGlvbgotCS0tLQktLS0tCS0tLS0tLS0tLS0tCi0JCi0JJ3dhbnQnCXR5cGUJNC1jaGFyIGNsYXNzIGNvZGUgb2YgdGhpbmcgd2Ugd2FudCwKLQkJCWUuZy4gd29yZCwgcGFyYWdyYXBoIG9yIHByb3BlcnR5Ci0JCi0JJ2Zvcm0nCWVudW0JaG93IHdlIHNwZWNpZnkgd2hpY2ggJ3dhbnQnIHRoaW5nKHMpIHdlIHdhbnQsCi0JCQllLmcuIGJ5IGluZGV4LCBieSByYW5nZSwgYnkgbmFtZSwgb3IgYnkgcHJvcGVydHkgc3BlY2lmaWVyCi0JCi0JJ3NlbGQnCWFueQl3aGljaCB0aGluZyhzKSB3ZSB3YW50LAotCQkJZS5nLiBpdHMgaW5kZXgsIGl0cyBuYW1lLCBvciBpdHMgcHJvcGVydHkgc3BlY2lmaWVyCi0JCi0JJ2Zyb20nCW9iamVjdAl0aGUgb2JqZWN0IGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZCwKLQkJCW9yIG51bGwsIG1lYW5pbmcgbG9vayBmb3IgaXQgaW4gdGhlIGFwcGxpY2F0aW9uCi0JCi0JTm90ZSB0aGF0IHdlIGRvbid0IGNhbGwgdGhpcyBjbGFzcyBwbGFpbiAiT2JqZWN0Iiwgc2luY2UgdGhhdCBuYW1lCi0JaXMgbGlrZWx5IHRvIGJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotCSIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCB3YW50LCBmb3JtLCBzZWxkLCBmciA9IE5vbmUpOgotCQlzZWxmLndhbnQgPSB3YW50Ci0JCXNlbGYuZm9ybSA9IGZvcm0KLQkJc2VsZi5zZWxkID0gc2VsZAotCQlzZWxmLmZyID0gZnIKLQkKLQlkZWYgX19yZXByX18oc2VsZik6Ci0JCXMgPSAiT2JqZWN0U3BlY2lmaWVyKCVzLCAlcywgJXMiICUgKGBzZWxmLndhbnRgLCBgc2VsZi5mb3JtYCwgYHNlbGYuc2VsZGApCi0JCWlmIHNlbGYuZnI6Ci0JCQlzID0gcyArICIsICVzKSIgJSBgc2VsZi5mcmAKLQkJZWxzZToKLQkJCXMgPSBzICsgIikiCi0JCXJldHVybiBzCi0JCi0JZGVmIF9fYWVwYWNrX18oc2VsZik6Ci0JCXJldHVybiBwYWNrKHsnd2FudCc6IG1rdHlwZShzZWxmLndhbnQpLAotCQkJICAgICAnZm9ybSc6IG1rZW51bShzZWxmLmZvcm0pLAotCQkJICAgICAnc2VsZCc6IHNlbGYuc2VsZCwKLQkJCSAgICAgJ2Zyb20nOiBzZWxmLmZyfSwKLQkJCSAgICAnb2JqICcpCisgICAgCisgICAgIiIiQSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGFuZCBtYW5pcHVsYXRpb24gQUUgb2JqZWN0IHNwZWNpZmllcnMgaW4gcHl0aG9uLgorICAgIAorICAgIEFuIG9iamVjdCBzcGVjaWZpZXIgaXMgYWN0dWFsbHkgYSByZWNvcmQgd2l0aCBmb3VyIGZpZWxkczoKKyAgICAKKyAgICBrZXkgdHlwZSAgICBkZXNjcmlwdGlvbgorICAgIC0tLSAtLS0tICAgIC0tLS0tLS0tLS0tCisgICAgCisgICAgJ3dhbnQnICB0eXBlICAgIDQtY2hhciBjbGFzcyBjb2RlIG9mIHRoaW5nIHdlIHdhbnQsCisgICAgICAgICAgICBlLmcuIHdvcmQsIHBhcmFncmFwaCBvciBwcm9wZXJ0eQorICAgIAorICAgICdmb3JtJyAgZW51bSAgICBob3cgd2Ugc3BlY2lmeSB3aGljaCAnd2FudCcgdGhpbmcocykgd2Ugd2FudCwKKyAgICAgICAgICAgIGUuZy4gYnkgaW5kZXgsIGJ5IHJhbmdlLCBieSBuYW1lLCBvciBieSBwcm9wZXJ0eSBzcGVjaWZpZXIKKyAgICAKKyAgICAnc2VsZCcgIGFueSB3aGljaCB0aGluZyhzKSB3ZSB3YW50LAorICAgICAgICAgICAgZS5nLiBpdHMgaW5kZXgsIGl0cyBuYW1lLCBvciBpdHMgcHJvcGVydHkgc3BlY2lmaWVyCisgICAgCisgICAgJ2Zyb20nICBvYmplY3QgIHRoZSBvYmplY3QgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLAorICAgICAgICAgICAgb3IgbnVsbCwgbWVhbmluZyBsb29rIGZvciBpdCBpbiB0aGUgYXBwbGljYXRpb24KKyAgICAKKyAgICBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FsbCB0aGlzIGNsYXNzIHBsYWluICJPYmplY3QiLCBzaW5jZSB0aGF0IG5hbWUKKyAgICBpcyBsaWtlbHkgdG8gYmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgIiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhbnQsIGZvcm0sIHNlbGQsIGZyID0gTm9uZSk6CisgICAgICAgIHNlbGYud2FudCA9IHdhbnQKKyAgICAgICAgc2VsZi5mb3JtID0gZm9ybQorICAgICAgICBzZWxmLnNlbGQgPSBzZWxkCisgICAgICAgIHNlbGYuZnIgPSBmcgorICAgIAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcyA9ICJPYmplY3RTcGVjaWZpZXIoJXMsICVzLCAlcyIgJSAoYHNlbGYud2FudGAsIGBzZWxmLmZvcm1gLCBgc2VsZi5zZWxkYCkKKyAgICAgICAgaWYgc2VsZi5mcjoKKyAgICAgICAgICAgIHMgPSBzICsgIiwgJXMpIiAlIGBzZWxmLmZyYAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IHMgKyAiKSIKKyAgICAgICAgcmV0dXJuIHMKKyAgICAKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soeyd3YW50JzogbWt0eXBlKHNlbGYud2FudCksCisgICAgICAgICAgICAgICAgICdmb3JtJzogbWtlbnVtKHNlbGYuZm9ybSksCisgICAgICAgICAgICAgICAgICdzZWxkJzogc2VsZi5zZWxkLAorICAgICAgICAgICAgICAgICAnZnJvbSc6IHNlbGYuZnJ9LAorICAgICAgICAgICAgICAgICdvYmogJykKIAogZGVmIElzT2JqZWN0U3BlY2lmaWVyKHgpOgotCXJldHVybiBpc2luc3RhbmNlKHgsIE9iamVjdFNwZWNpZmllcikKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBPYmplY3RTcGVjaWZpZXIpCiAKIAogIyBCYWNrd2FyZHMgY29tcGF0YWJpbGl0eSwgc2lnaC4uLgogY2xhc3MgUHJvcGVydHkoT2JqZWN0U3BlY2lmaWVyKToKIAotCWRlZiBfX2luaXRfXyhzZWxmLCB3aGljaCwgZnIgPSBOb25lLCB3YW50PSdwcm9wJyk6Ci0JCU9iamVjdFNwZWNpZmllci5fX2luaXRfXyhzZWxmLCB3YW50LCAncHJvcCcsIG1rdHlwZSh3aGljaCksIGZyKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aGljaCwgZnIgPSBOb25lLCB3YW50PSdwcm9wJyk6CisgICAgICAgIE9iamVjdFNwZWNpZmllci5fX2luaXRfXyhzZWxmLCB3YW50LCAncHJvcCcsIG1rdHlwZSh3aGljaCksIGZyKQogCi0JZGVmIF9fcmVwcl9fKHNlbGYpOgotCQlpZiBzZWxmLmZyOgotCQkJcmV0dXJuICJQcm9wZXJ0eSglcywgJXMpIiAlIChgc2VsZi5zZWxkLnR5cGVgLCBgc2VsZi5mcmApCi0JCWVsc2U6Ci0JCQlyZXR1cm4gIlByb3BlcnR5KCVzKSIgJSBgc2VsZi5zZWxkLnR5cGVgCi0JCi0JZGVmIF9fc3RyX18oc2VsZik6Ci0JCWlmIHNlbGYuZnI6Ci0JCQlyZXR1cm4gIlByb3BlcnR5ICVzIG9mICVzIiAlIChzdHIoc2VsZi5zZWxkKSwgc3RyKHNlbGYuZnIpKQotCQllbHNlOgotCQkJcmV0dXJuICJQcm9wZXJ0eSAlcyIgJSBzdHIoc2VsZi5zZWxkKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mcjoKKyAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkoJXMsICVzKSIgJSAoYHNlbGYuc2VsZC50eXBlYCwgYHNlbGYuZnJgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSglcykiICUgYHNlbGYuc2VsZC50eXBlYAorICAgIAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZyOgorICAgICAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSAlcyBvZiAlcyIgJSAoc3RyKHNlbGYuc2VsZCksIHN0cihzZWxmLmZyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkgJXMiICUgc3RyKHNlbGYuc2VsZCkKIAogCiBjbGFzcyBOUHJvcGVydHkoT2JqZWN0U3BlY2lmaWVyKToKLQkjIFN1YmNsYXNzZXMgKm11c3QqIHNlbGYgYmFzZWNsYXNzIGF0dHJpYnV0ZXM6Ci0JIyB3YW50IGlzIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkKLQkjIHdoaWNoIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoaXMgcHJvcGVydHkKKyAgICAjIFN1YmNsYXNzZXMgKm11c3QqIHNlbGYgYmFzZWNsYXNzIGF0dHJpYnV0ZXM6CisgICAgIyB3YW50IGlzIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkKKyAgICAjIHdoaWNoIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoaXMgcHJvcGVydHkKIAotCWRlZiBfX2luaXRfXyhzZWxmLCBmciA9IE5vbmUpOgotCQkjdHJ5OgotCQkjCWR1bW15ID0gc2VsZi53YW50Ci0JCSNleGNlcHQ6Ci0JCSMJc2VsZi53YW50ID0gJ3Byb3AnCi0JCXNlbGYud2FudCA9ICdwcm9wJwotCQlPYmplY3RTcGVjaWZpZXIuX19pbml0X18oc2VsZiwgc2VsZi53YW50LCAncHJvcCcsIAotCQkJCQlta3R5cGUoc2VsZi53aGljaCksIGZyKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmciA9IE5vbmUpOgorICAgICAgICAjdHJ5OgorICAgICAgICAjICAgZHVtbXkgPSBzZWxmLndhbnQKKyAgICAgICAgI2V4Y2VwdDoKKyAgICAgICAgIyAgIHNlbGYud2FudCA9ICdwcm9wJworICAgICAgICBzZWxmLndhbnQgPSAncHJvcCcKKyAgICAgICAgT2JqZWN0U3BlY2lmaWVyLl9faW5pdF9fKHNlbGYsIHNlbGYud2FudCwgJ3Byb3AnLCAKKyAgICAgICAgICAgICAgICAgICAgbWt0eXBlKHNlbGYud2hpY2gpLCBmcikKIAotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcnYgPSAiUHJvcGVydHkoJXMiJWBzZWxmLnNlbGQudHlwZWAKLQkJaWYgc2VsZi5mcjoKLQkJCXJ2ID0gcnYgKyAiLCBmcj0lcyIgJSBgc2VsZi5mcmAKLQkJaWYgc2VsZi53YW50ICE9ICdwcm9wJzoKLQkJCXJ2ID0gcnYgKyAiLCB3YW50PSVzIiAlIGBzZWxmLndhbnRgCi0JCXJldHVybiBydiArICIpIgotCQotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlpZiBzZWxmLmZyOgotCQkJcmV0dXJuICJQcm9wZXJ0eSAlcyBvZiAlcyIgJSAoc3RyKHNlbGYuc2VsZCksIHN0cihzZWxmLmZyKSkKLQkJZWxzZToKLQkJCXJldHVybiAiUHJvcGVydHkgJXMiICUgc3RyKHNlbGYuc2VsZCkKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJ2ID0gIlByb3BlcnR5KCVzIiVgc2VsZi5zZWxkLnR5cGVgCisgICAgICAgIGlmIHNlbGYuZnI6CisgICAgICAgICAgICBydiA9IHJ2ICsgIiwgZnI9JXMiICUgYHNlbGYuZnJgCisgICAgICAgIGlmIHNlbGYud2FudCAhPSAncHJvcCc6CisgICAgICAgICAgICBydiA9IHJ2ICsgIiwgd2FudD0lcyIgJSBgc2VsZi53YW50YAorICAgICAgICByZXR1cm4gcnYgKyAiKSIKKyAgICAKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mcjoKKyAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkgJXMgb2YgJXMiICUgKHN0cihzZWxmLnNlbGQpLCBzdHIoc2VsZi5mcikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIlByb3BlcnR5ICVzIiAlIHN0cihzZWxmLnNlbGQpCiAKIAogY2xhc3MgU2VsZWN0YWJsZUl0ZW0oT2JqZWN0U3BlY2lmaWVyKToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgd2FudCwgc2VsZCwgZnIgPSBOb25lKToKLQkJdCA9IHR5cGUoc2VsZCkKLQkJaWYgdCA9PSBTdHJpbmdUeXBlOgotCQkJZm9ybSA9ICduYW1lJwotCQllbGlmIElzUmFuZ2Uoc2VsZCk6Ci0JCQlmb3JtID0gJ3JhbmcnCi0JCWVsaWYgSXNDb21wYXJpc29uKHNlbGQpIG9yIElzTG9naWNhbChzZWxkKToKLQkJCWZvcm0gPSAndGVzdCcKLQkJZWxpZiB0ID09IFR1cGxlVHlwZToKLQkJCSMgQnJlYWtvdXQ6IHNwZWNpZnkgYm90aCBmb3JtIGFuZCBzZWxkIGluIGEgdHVwbGUKLQkJCSMgKGlmIHlvdSB3YW50IElEIG9yIHJlbGUgb3Igc29tZXN1Y2gpCi0JCQlmb3JtLCBzZWxkID0gc2VsZAotCQllbHNlOgotCQkJZm9ybSA9ICdpbmR4JwotCQlPYmplY3RTcGVjaWZpZXIuX19pbml0X18oc2VsZiwgd2FudCwgZm9ybSwgc2VsZCwgZnIpCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhbnQsIHNlbGQsIGZyID0gTm9uZSk6CisgICAgICAgIHQgPSB0eXBlKHNlbGQpCisgICAgICAgIGlmIHQgPT0gU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGZvcm0gPSAnbmFtZScKKyAgICAgICAgZWxpZiBJc1JhbmdlKHNlbGQpOgorICAgICAgICAgICAgZm9ybSA9ICdyYW5nJworICAgICAgICBlbGlmIElzQ29tcGFyaXNvbihzZWxkKSBvciBJc0xvZ2ljYWwoc2VsZCk6CisgICAgICAgICAgICBmb3JtID0gJ3Rlc3QnCisgICAgICAgIGVsaWYgdCA9PSBUdXBsZVR5cGU6CisgICAgICAgICAgICAjIEJyZWFrb3V0OiBzcGVjaWZ5IGJvdGggZm9ybSBhbmQgc2VsZCBpbiBhIHR1cGxlCisgICAgICAgICAgICAjIChpZiB5b3Ugd2FudCBJRCBvciByZWxlIG9yIHNvbWVzdWNoKQorICAgICAgICAgICAgZm9ybSwgc2VsZCA9IHNlbGQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvcm0gPSAnaW5keCcKKyAgICAgICAgT2JqZWN0U3BlY2lmaWVyLl9faW5pdF9fKHNlbGYsIHdhbnQsIGZvcm0sIHNlbGQsIGZyKQogCiAKIGNsYXNzIENvbXBvbmVudEl0ZW0oU2VsZWN0YWJsZUl0ZW0pOgotCSMgRGVyaXZlZCBjbGFzc2VzICptdXN0KiBzZXQgdGhlICpjbGFzcyBhdHRyaWJ1dGUqICd3YW50JyB0byBzb21lIGNvbnN0YW50Ci0JIyBBbHNvLCBkaWN0aW9uYXJpZXMgX3Byb3BkaWN0IGFuZCBfZWxlbWRpY3QgbXVzdCBiZSBzZXQgdG8gbWFwIHByb3BlcnR5Ci0JIyBhbmQgZWxlbWVudCBuYW1lcyB0byB0aGUgY29ycmVjdCBjbGFzc2VzCisgICAgIyBEZXJpdmVkIGNsYXNzZXMgKm11c3QqIHNldCB0aGUgKmNsYXNzIGF0dHJpYnV0ZSogJ3dhbnQnIHRvIHNvbWUgY29uc3RhbnQKKyAgICAjIEFsc28sIGRpY3Rpb25hcmllcyBfcHJvcGRpY3QgYW5kIF9lbGVtZGljdCBtdXN0IGJlIHNldCB0byBtYXAgcHJvcGVydHkKKyAgICAjIGFuZCBlbGVtZW50IG5hbWVzIHRvIHRoZSBjb3JyZWN0IGNsYXNzZXMKIAotCV9wcm9wZGljdCA9IHt9Ci0JX2VsZW1kaWN0ID0ge30KLQlkZWYgX19pbml0X18oc2VsZiwgd2hpY2gsIGZyID0gTm9uZSk6Ci0JCVNlbGVjdGFibGVJdGVtLl9faW5pdF9fKHNlbGYsIHNlbGYud2FudCwgd2hpY2gsIGZyKQotCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJaWYgbm90IHNlbGYuZnI6Ci0JCQlyZXR1cm4gIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGBzZWxmLnNlbGRgKQotCQlyZXR1cm4gIiVzKCVzLCAlcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBgc2VsZi5zZWxkYCwgYHNlbGYuZnJgKQotCQotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlzZWxkID0gc2VsZi5zZWxkCi0JCWlmIHR5cGUoc2VsZCkgPT0gU3RyaW5nVHlwZToKLQkJCXNzID0gcmVwcihzZWxkKQotCQllbGlmIElzUmFuZ2Uoc2VsZCk6Ci0JCQlzdGFydCwgc3RvcCA9IHNlbGQuc3RhcnQsIHNlbGQuc3RvcAotCQkJaWYgdHlwZShzdGFydCkgPT0gSW5zdGFuY2VUeXBlID09IHR5cGUoc3RvcCkgYW5kIFwKLQkJCSAgIHN0YXJ0Ll9fY2xhc3NfXyA9PSBzZWxmLl9fY2xhc3NfXyA9PSBzdG9wLl9fY2xhc3NfXzoKLQkJCQlzcyA9IHN0cihzdGFydC5zZWxkKSArICIgdGhydSAiICsgc3RyKHN0b3Auc2VsZCkKLQkJCWVsc2U6Ci0JCQkJc3MgPSBzdHIoc2VsZCkKLQkJZWxzZToKLQkJCXNzID0gc3RyKHNlbGQpCi0JCXMgPSAiJXMgJXMiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzcykKLQkJaWYgc2VsZi5mcjogcyA9IHMgKyAiIG9mICVzIiAlIHN0cihzZWxmLmZyKQotCQlyZXR1cm4gcwotCQkKLQlkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6Ci0JCWlmIHNlbGYuX2VsZW1kaWN0Lmhhc19rZXkobmFtZSk6Ci0JCQljbHMgPSBzZWxmLl9lbGVtZGljdFtuYW1lXQotCQkJcmV0dXJuIERlbGF5ZWRDb21wb25lbnRJdGVtKGNscywgc2VsZikKLQkJaWYgc2VsZi5fcHJvcGRpY3QuaGFzX2tleShuYW1lKToKLQkgICAJCWNscyA9IHNlbGYuX3Byb3BkaWN0W25hbWVdCi0JICAgCQlyZXR1cm4gY2xzKHNlbGYpCi0JCXJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCi0JCQotCQkKKyAgICBfcHJvcGRpY3QgPSB7fQorICAgIF9lbGVtZGljdCA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdoaWNoLCBmciA9IE5vbmUpOgorICAgICAgICBTZWxlY3RhYmxlSXRlbS5fX2luaXRfXyhzZWxmLCBzZWxmLndhbnQsIHdoaWNoLCBmcikKKyAgICAKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmZyOgorICAgICAgICAgICAgcmV0dXJuICIlcyglcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBgc2VsZi5zZWxkYCkKKyAgICAgICAgcmV0dXJuICIlcyglcywgJXMpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgYHNlbGYuc2VsZGAsIGBzZWxmLmZyYCkKKyAgICAKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgc2VsZCA9IHNlbGYuc2VsZAorICAgICAgICBpZiB0eXBlKHNlbGQpID09IFN0cmluZ1R5cGU6CisgICAgICAgICAgICBzcyA9IHJlcHIoc2VsZCkKKyAgICAgICAgZWxpZiBJc1JhbmdlKHNlbGQpOgorICAgICAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxkLnN0YXJ0LCBzZWxkLnN0b3AKKyAgICAgICAgICAgIGlmIHR5cGUoc3RhcnQpID09IEluc3RhbmNlVHlwZSA9PSB0eXBlKHN0b3ApIGFuZCBcCisgICAgICAgICAgICAgICBzdGFydC5fX2NsYXNzX18gPT0gc2VsZi5fX2NsYXNzX18gPT0gc3RvcC5fX2NsYXNzX186CisgICAgICAgICAgICAgICAgc3MgPSBzdHIoc3RhcnQuc2VsZCkgKyAiIHRocnUgIiArIHN0cihzdG9wLnNlbGQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNzID0gc3RyKHNlbGQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzcyA9IHN0cihzZWxkKQorICAgICAgICBzID0gIiVzICVzIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3MpCisgICAgICAgIGlmIHNlbGYuZnI6IHMgPSBzICsgIiBvZiAlcyIgJSBzdHIoc2VsZi5mcikKKyAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBzZWxmLl9lbGVtZGljdC5oYXNfa2V5KG5hbWUpOgorICAgICAgICAgICAgY2xzID0gc2VsZi5fZWxlbWRpY3RbbmFtZV0KKyAgICAgICAgICAgIHJldHVybiBEZWxheWVkQ29tcG9uZW50SXRlbShjbHMsIHNlbGYpCisgICAgICAgIGlmIHNlbGYuX3Byb3BkaWN0Lmhhc19rZXkobmFtZSk6CisgICAgICAgICAgICBjbHMgPSBzZWxmLl9wcm9wZGljdFtuYW1lXQorICAgICAgICAgICAgcmV0dXJuIGNscyhzZWxmKQorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorICAgICAgICAKKyAgICAgICAgCiBjbGFzcyBEZWxheWVkQ29tcG9uZW50SXRlbToKLQlkZWYgX19pbml0X18oc2VsZiwgY29tcGNsYXNzLCBmcik6Ci0JCXNlbGYuY29tcGNsYXNzID0gY29tcGNsYXNzCi0JCXNlbGYuZnIgPSBmcgotCQkKLQlkZWYgX19jYWxsX18oc2VsZiwgd2hpY2gpOgotCQlyZXR1cm4gc2VsZi5jb21wY2xhc3Mod2hpY2gsIHNlbGYuZnIpCi0JCQotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICIlcyg/Pz8sICVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGBzZWxmLmZyYCkKLQkJCi0JZGVmIF9fc3RyX18oc2VsZik6Ci0JCXJldHVybiAic2VsZWN0b3IgZm9yIGVsZW1lbnQgJXMgb2YgJXMiJShzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYuZnIpKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21wY2xhc3MsIGZyKToKKyAgICAgICAgc2VsZi5jb21wY2xhc3MgPSBjb21wY2xhc3MKKyAgICAgICAgc2VsZi5mciA9IGZyCisgICAgICAgIAorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB3aGljaCk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbXBjbGFzcyh3aGljaCwgc2VsZi5mcikKKyAgICAgICAgCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzKD8/PywgJXMpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgYHNlbGYuZnJgKQorICAgICAgICAKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJzZWxlY3RvciBmb3IgZWxlbWVudCAlcyBvZiAlcyIlKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5mcikpCiAKIHRlbXBsYXRlID0gIiIiCiBjbGFzcyAlcyhDb21wb25lbnRJdGVtKTogd2FudCA9ICclcycKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9hcHBsZXNpbmdsZS5weSBiL0xpYi9wbGF0LW1hYy9hcHBsZXNpbmdsZS5weQppbmRleCBmOGJlM2QyLi41YjljMmRkIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5CkBAIC0yNCw3NyArMjQsNzcgQEAKIEFTX0lHTk9SRT0oMyw0LDUsNiw4LDksMTAsMTEsMTIsMTMsMTQsMTUpCiAKIGRlZiBkZWNvZGUoaW5wdXQsIG91dHB1dCwgcmVzb25seT0wKToKLQlpZiB0eXBlKGlucHV0KSA9PSB0eXBlKCcnKToKLQkJaW5wdXQgPSBvcGVuKGlucHV0LCAncmInKQotCSMgU2hvdWxkIHdlIGFsc28gdGVzdCBmb3IgRlNTcGVjcyBvciBGU1JlZnM/Ci0JaGVhZGVyID0gaW5wdXQucmVhZChBU19IRUFERVJfTEVOR1RIKQotCXRyeToKLQkJbWFnaWMsIHZlcnNpb24sIGR1bW15LCBuZW50cnkgPSBzdHJ1Y3QudW5wYWNrKEFTX0hFQURFUl9GT1JNQVQsIGhlYWRlcikKLQlleGNlcHQgVmFsdWVFcnJvciwgYXJnOgotCQlyYWlzZSBFcnJvciwgIlVucGFjayBoZWFkZXIgZXJyb3I6ICVzIiVhcmcKLQlpZiB2ZXJib3NlOgotCQlwcmludCAnTWFnaWM6ICAgMHglOC44eCclbWFnaWMKLQkJcHJpbnQgJ1ZlcnNpb246IDB4JTguOHgnJXZlcnNpb24KLQkJcHJpbnQgJ0VudHJpZXM6ICVkJyVuZW50cnkKLQlpZiBtYWdpYyAhPSBBU19NQUdJQzoKLQkJcmFpc2UgRXJyb3IsICdVbmtub3duIEFwcGxlU2luZ2xlIG1hZ2ljIG51bWJlciAweCU4Ljh4JyVtYWdpYwotCWlmIHZlcnNpb24gIT0gQVNfVkVSU0lPTjoKLQkJcmFpc2UgRXJyb3IsICdVbmtub3duIEFwcGxlU2luZ2xlIHZlcnNpb24gbnVtYmVyIDB4JTguOHgnJXZlcnNpb24KLQlpZiBuZW50cnkgPD0gMDoKLQkJcmFpc2UgRXJyb3IsICJBcHBsZVNpbmdsZSBmaWxlIGNvbnRhaW5zIG5vIGZvcmtzIgotCWhlYWRlcnMgPSBbaW5wdXQucmVhZChBU19FTlRSWV9MRU5HVEgpIGZvciBpIGluIHJhbmdlKG5lbnRyeSldCi0JZGlkd29yayA9IDAKLQlmb3IgaGRyIGluIGhlYWRlcnM6Ci0JCXRyeToKLQkJCWlkLCBvZmZzZXQsIGxlbmd0aCA9IHN0cnVjdC51bnBhY2soQVNfRU5UUllfRk9STUFULCBoZHIpCi0JCWV4Y2VwdCBWYWx1ZUVycm9yLCBhcmc6Ci0JCQlyYWlzZSBFcnJvciwgIlVucGFjayBlbnRyeSBlcnJvcjogJXMiJWFyZwotCQlpZiB2ZXJib3NlOgotCQkJcHJpbnQgJ0ZvcmsgJWQsIG9mZnNldCAlZCwgbGVuZ3RoICVkJyUoaWQsIG9mZnNldCwgbGVuZ3RoKQotCQlpbnB1dC5zZWVrKG9mZnNldCkKLQkJaWYgbGVuZ3RoID09IDA6Ci0JCQlkYXRhID0gJycKLQkJZWxzZToKLQkJCWRhdGEgPSBpbnB1dC5yZWFkKGxlbmd0aCkKLQkJaWYgbGVuKGRhdGEpICE9IGxlbmd0aDoKLQkJCXJhaXNlIEVycm9yLCAnU2hvcnQgcmVhZDogZXhwZWN0ZWQgJWQgYnl0ZXMgZ290ICVkJyUobGVuZ3RoLCBsZW4oZGF0YSkpCi0JCWlmIGlkID09IEFTX0RBVEFGT1JLOgotCQkJaWYgdmVyYm9zZToKLQkJCQlwcmludCAnICAoZGF0YSBmb3JrKScKLQkJCWlmIG5vdCByZXNvbmx5OgotCQkJCWRpZHdvcmsgPSAxCi0JCQkJZnAgPSBvcGVuKG91dHB1dCwgJ3diJykKLQkJCQlmcC53cml0ZShkYXRhKQotCQkJCWZwLmNsb3NlKCkKLQkJZWxpZiBpZCA9PSBBU19SRVNPVVJDRUZPUks6Ci0JCQlkaWR3b3JrID0gMQotCQkJaWYgdmVyYm9zZToKLQkJCQlwcmludCAnICAocmVzb3VyY2UgZm9yayknCi0JCQlpZiByZXNvbmx5OgotCQkJCWZwID0gb3BlbihvdXRwdXQsICd3YicpCi0JCQllbHNlOgotCQkJCWZwID0gTWFjT1Mub3BlbnJmKG91dHB1dCwgJ3diJykKLQkJCWZwLndyaXRlKGRhdGEpCi0JCQlmcC5jbG9zZSgpCi0JCWVsaWYgaWQgaW4gQVNfSUdOT1JFOgotCQkJaWYgdmVyYm9zZToKLQkJCQlwcmludCAnICAoaWdub3JlZCknCi0JCWVsc2U6Ci0JCQlyYWlzZSBFcnJvciwgJ1Vua25vd24gZm9yayB0eXBlICVkJyVpZAotCWlmIG5vdCBkaWR3b3JrOgotCQlyYWlzZSBFcnJvciwgJ05vIHVzZWZ1bCBmb3JrcyBmb3VuZCcKKyAgICBpZiB0eXBlKGlucHV0KSA9PSB0eXBlKCcnKToKKyAgICAgICAgaW5wdXQgPSBvcGVuKGlucHV0LCAncmInKQorICAgICMgU2hvdWxkIHdlIGFsc28gdGVzdCBmb3IgRlNTcGVjcyBvciBGU1JlZnM/CisgICAgaGVhZGVyID0gaW5wdXQucmVhZChBU19IRUFERVJfTEVOR1RIKQorICAgIHRyeToKKyAgICAgICAgbWFnaWMsIHZlcnNpb24sIGR1bW15LCBuZW50cnkgPSBzdHJ1Y3QudW5wYWNrKEFTX0hFQURFUl9GT1JNQVQsIGhlYWRlcikKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgYXJnOgorICAgICAgICByYWlzZSBFcnJvciwgIlVucGFjayBoZWFkZXIgZXJyb3I6ICVzIiVhcmcKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnTWFnaWM6ICAgMHglOC44eCclbWFnaWMKKyAgICAgICAgcHJpbnQgJ1ZlcnNpb246IDB4JTguOHgnJXZlcnNpb24KKyAgICAgICAgcHJpbnQgJ0VudHJpZXM6ICVkJyVuZW50cnkKKyAgICBpZiBtYWdpYyAhPSBBU19NQUdJQzoKKyAgICAgICAgcmFpc2UgRXJyb3IsICdVbmtub3duIEFwcGxlU2luZ2xlIG1hZ2ljIG51bWJlciAweCU4Ljh4JyVtYWdpYworICAgIGlmIHZlcnNpb24gIT0gQVNfVkVSU0lPTjoKKyAgICAgICAgcmFpc2UgRXJyb3IsICdVbmtub3duIEFwcGxlU2luZ2xlIHZlcnNpb24gbnVtYmVyIDB4JTguOHgnJXZlcnNpb24KKyAgICBpZiBuZW50cnkgPD0gMDoKKyAgICAgICAgcmFpc2UgRXJyb3IsICJBcHBsZVNpbmdsZSBmaWxlIGNvbnRhaW5zIG5vIGZvcmtzIgorICAgIGhlYWRlcnMgPSBbaW5wdXQucmVhZChBU19FTlRSWV9MRU5HVEgpIGZvciBpIGluIHJhbmdlKG5lbnRyeSldCisgICAgZGlkd29yayA9IDAKKyAgICBmb3IgaGRyIGluIGhlYWRlcnM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlkLCBvZmZzZXQsIGxlbmd0aCA9IHN0cnVjdC51bnBhY2soQVNfRU5UUllfRk9STUFULCBoZHIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBhcmc6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgIlVucGFjayBlbnRyeSBlcnJvcjogJXMiJWFyZworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ0ZvcmsgJWQsIG9mZnNldCAlZCwgbGVuZ3RoICVkJyUoaWQsIG9mZnNldCwgbGVuZ3RoKQorICAgICAgICBpbnB1dC5zZWVrKG9mZnNldCkKKyAgICAgICAgaWYgbGVuZ3RoID09IDA6CisgICAgICAgICAgICBkYXRhID0gJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSBpbnB1dC5yZWFkKGxlbmd0aCkKKyAgICAgICAgaWYgbGVuKGRhdGEpICE9IGxlbmd0aDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnU2hvcnQgcmVhZDogZXhwZWN0ZWQgJWQgYnl0ZXMgZ290ICVkJyUobGVuZ3RoLCBsZW4oZGF0YSkpCisgICAgICAgIGlmIGlkID09IEFTX0RBVEFGT1JLOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnICAoZGF0YSBmb3JrKScKKyAgICAgICAgICAgIGlmIG5vdCByZXNvbmx5OgorICAgICAgICAgICAgICAgIGRpZHdvcmsgPSAxCisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKG91dHB1dCwgJ3diJykKKyAgICAgICAgICAgICAgICBmcC53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZWxpZiBpZCA9PSBBU19SRVNPVVJDRUZPUks6CisgICAgICAgICAgICBkaWR3b3JrID0gMQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnICAocmVzb3VyY2UgZm9yayknCisgICAgICAgICAgICBpZiByZXNvbmx5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihvdXRwdXQsICd3YicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZwID0gTWFjT1Mub3BlbnJmKG91dHB1dCwgJ3diJykKKyAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGVsaWYgaWQgaW4gQVNfSUdOT1JFOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnICAoaWdub3JlZCknCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ1Vua25vd24gZm9yayB0eXBlICVkJyVpZAorICAgIGlmIG5vdCBkaWR3b3JrOgorICAgICAgICByYWlzZSBFcnJvciwgJ05vIHVzZWZ1bCBmb3JrcyBmb3VuZCcKIAogZGVmIF90ZXN0KCk6Ci0JaWYgbGVuKHN5cy5hcmd2KSA8IDMgb3Igc3lzLmFyZ3ZbMV0gPT0gJy1yJyBhbmQgbGVuKHN5cy5hcmd2KSAhPSA0OgotCQlwcmludCAnVXNhZ2U6IGFwcGxlc2luZ2xlLnB5IFstcl0gYXBwbGVzaW5nbGVmaWxlIGRlY29kZWRmaWxlJwotCQlzeXMuZXhpdCgxKQotCWlmIHN5cy5hcmd2WzFdID09ICctcic6Ci0JCXJlc29ubHkgPSAxCi0JCWRlbCBzeXMuYXJndlsxXQotCWVsc2U6Ci0JCXJlc29ubHkgPSAwCi0JZGVjb2RlKHN5cy5hcmd2WzFdLCBzeXMuYXJndlsyXSwgcmVzb25seT1yZXNvbmx5KQotCQorICAgIGlmIGxlbihzeXMuYXJndikgPCAzIG9yIHN5cy5hcmd2WzFdID09ICctcicgYW5kIGxlbihzeXMuYXJndikgIT0gNDoKKyAgICAgICAgcHJpbnQgJ1VzYWdlOiBhcHBsZXNpbmdsZS5weSBbLXJdIGFwcGxlc2luZ2xlZmlsZSBkZWNvZGVkZmlsZScKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBpZiBzeXMuYXJndlsxXSA9PSAnLXInOgorICAgICAgICByZXNvbmx5ID0gMQorICAgICAgICBkZWwgc3lzLmFyZ3ZbMV0KKyAgICBlbHNlOgorICAgICAgICByZXNvbmx5ID0gMAorICAgIGRlY29kZShzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0sIHJlc29ubHk9cmVzb25seSkKKyAgICAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JX3Rlc3QoKQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBfdGVzdCgpCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkgYi9MaWIvcGxhdC1tYWMvYXBwbGV0cmF3bWFpbi5weQppbmRleCA0NzcxZjNjLi44ODI1OWMxIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvYXBwbGV0cmF3bWFpbi5weQorKysgYi9MaWIvcGxhdC1tYWMvYXBwbGV0cmF3bWFpbi5weQpAQCAtMTQsMTMgKzE0LDEzIEBACiAjIGRpcmVjdG9yeS4KICMKIGlmIG5vdCBzeXMuYXJndiBvciBzeXMuYXJndlswXVs6MV0gPT0gJy0nOgotCSMgSW5zZXJ0IG91ciAoZ3Vlc3NlZCkgbmFtZS4KLQlfZGlyID0gb3MucGF0aC5zcGxpdChzeXMuZXhlY3V0YWJsZSlbMF0gIyByZW1vdmVzICJweXRob24iCi0JX2RpciA9IG9zLnBhdGguc3BsaXQoX2RpcilbMF0gIyBSZW1vdmVzICJNYWNPUyIKLQlfZGlyID0gb3MucGF0aC5qb2luKF9kaXIsICdSZXNvdXJjZXMnKQotCXN5cy5hcmd2Lmluc2VydCgwLCAnX19yYXdtYWluX18nKQorICAgICMgSW5zZXJ0IG91ciAoZ3Vlc3NlZCkgbmFtZS4KKyAgICBfZGlyID0gb3MucGF0aC5zcGxpdChzeXMuZXhlY3V0YWJsZSlbMF0gIyByZW1vdmVzICJweXRob24iCisgICAgX2RpciA9IG9zLnBhdGguc3BsaXQoX2RpcilbMF0gIyBSZW1vdmVzICJNYWNPUyIKKyAgICBfZGlyID0gb3MucGF0aC5qb2luKF9kaXIsICdSZXNvdXJjZXMnKQorICAgIHN5cy5hcmd2Lmluc2VydCgwLCAnX19yYXdtYWluX18nKQogZWxzZToKLQlfZGlyID0gb3MucGF0aC5zcGxpdChzeXMuYXJndlswXSlbMF0KKyAgICBfZGlyID0gb3MucGF0aC5zcGxpdChzeXMuYXJndlswXSlbMF0KICMKICMgQWRkIHRoZSBSZXNvdXJjZXMgZGlyZWN0b3J5IHRvIHRoZSBwYXRoLiBUaGlzIGlzIHdoZXJlIGZpbGVzIGluc3RhbGxlZAogIyBieSBCdWlsZEFwcGxldC5weSB3aXRoIHRoZSAtLWV4dHJhIG9wdGlvbiBzaG93IHVwLCBhbmQgaWYgdGhvc2UgZmlsZXMgYXJlIApAQCAtMzYsMjggKzM2LDI4IEBACiAjCiBfX2ZpbGVfXyA9IG9zLnBhdGguam9pbihfZGlyLCAnX19tYWluX18ucHknKQogaWYgb3MucGF0aC5leGlzdHMoX19maWxlX18pOgotCSMKLQkjIFNldHVwIHNvbWV0aGluZyByZXNlbWJsaW5nIGEgbm9ybWFsIGVudmlyb25tZW50IGFuZCBnby4KLQkjCi0Jc3lzLmFyZ3ZbMF0gPSBfX2ZpbGVfXwotCWRlbCBhcmd2ZW11bGF0b3IsIG9zLCBzeXMsIF9kaXIKLQlleGVjZmlsZShfX2ZpbGVfXykKKyAgICAjCisgICAgIyBTZXR1cCBzb21ldGhpbmcgcmVzZW1ibGluZyBhIG5vcm1hbCBlbnZpcm9ubWVudCBhbmQgZ28uCisgICAgIworICAgIHN5cy5hcmd2WzBdID0gX19maWxlX18KKyAgICBkZWwgYXJndmVtdWxhdG9yLCBvcywgc3lzLCBfZGlyCisgICAgZXhlY2ZpbGUoX19maWxlX18pCiBlbHNlOgotCV9fZmlsZV9fID0gb3MucGF0aC5qb2luKF9kaXIsICdfX21haW5fXy5weWMnKQotCWlmIG9zLnBhdGguZXhpc3RzKF9fZmlsZV9fKToKLQkJIwotCQkjIElmIHdlIGhhdmUgb25seSBhIC5weWMgZmlsZSB3ZSByZWFkIHRoZSBjb2RlIG9iamVjdCBmcm9tIHRoYXQKLQkJIwotCQlzeXMuYXJndlswXSA9IF9fZmlsZV9fCi0JCV9mcCA9IG9wZW4oX19maWxlX18sICdyYicpCi0JCV9mcC5yZWFkKDgpCi0JCV9fY29kZV9fID0gbWFyc2hhbC5sb2FkKF9mcCkKLQkJIwotCQkjIEFnYWluLCB3ZSBjcmVhdGUgYW4gYWxtb3N0LW5vcm1hbCBlbnZpcm9ubWVudCAob25seSBfX2NvZGVfXyBpcwotCQkjIGZ1bm55KSBhbmQgZ28uCi0JCSMKLQkJZGVsIGFyZ3ZlbXVsYXRvciwgb3MsIHN5cywgbWFyc2hhbCwgX2RpciwgX2ZwCi0JCWV4ZWMgX19jb2RlX18KLQllbHNlOgotCQlzeXMuc3RkZXJyLndyaXRlKCIlczogbmVpdGhlciBfX21haW5fXy5weSBub3IgX19tYWluX18ucHljIGZvdW5kXG4iJXN5cy5hcmd2WzBdKQotCQlzeXMuZXhpdCgxKQorICAgIF9fZmlsZV9fID0gb3MucGF0aC5qb2luKF9kaXIsICdfX21haW5fXy5weWMnKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKF9fZmlsZV9fKToKKyAgICAgICAgIworICAgICAgICAjIElmIHdlIGhhdmUgb25seSBhIC5weWMgZmlsZSB3ZSByZWFkIHRoZSBjb2RlIG9iamVjdCBmcm9tIHRoYXQKKyAgICAgICAgIworICAgICAgICBzeXMuYXJndlswXSA9IF9fZmlsZV9fCisgICAgICAgIF9mcCA9IG9wZW4oX19maWxlX18sICdyYicpCisgICAgICAgIF9mcC5yZWFkKDgpCisgICAgICAgIF9fY29kZV9fID0gbWFyc2hhbC5sb2FkKF9mcCkKKyAgICAgICAgIworICAgICAgICAjIEFnYWluLCB3ZSBjcmVhdGUgYW4gYWxtb3N0LW5vcm1hbCBlbnZpcm9ubWVudCAob25seSBfX2NvZGVfXyBpcworICAgICAgICAjIGZ1bm55KSBhbmQgZ28uCisgICAgICAgICMKKyAgICAgICAgZGVsIGFyZ3ZlbXVsYXRvciwgb3MsIHN5cywgbWFyc2hhbCwgX2RpciwgX2ZwCisgICAgICAgIGV4ZWMgX19jb2RlX18KKyAgICBlbHNlOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlczogbmVpdGhlciBfX21haW5fXy5weSBub3IgX19tYWluX18ucHljIGZvdW5kXG4iJXN5cy5hcmd2WzBdKQorICAgICAgICBzeXMuZXhpdCgxKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2FwcGxldHJ1bm5lci5weSBiL0xpYi9wbGF0LW1hYy9hcHBsZXRydW5uZXIucHkKaW5kZXggYWRkYTdiMS4uOGQ0NmMyYSAxMDA3NTUKLS0tIGEvTGliL3BsYXQtbWFjL2FwcGxldHJ1bm5lci5weQorKysgYi9MaWIvcGxhdC1tYWMvYXBwbGV0cnVubmVyLnB5CkBAIC02LDEyICs2LDEyIEBACiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGZvciBuYW1lIGluIFsiX19yYXdtYWluX18ucHkiLCAiX19yYXdtYWluX18ucHljIiwgIl9fbWFpbl9fLnB5IiwgIl9fbWFpbl9fLnB5YyJdOgotCXJlYWxtYWluID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSwKLQkJCQkJICAiUmVzb3VyY2VzIiwgbmFtZSkKLQlpZiBvcy5wYXRoLmV4aXN0cyhyZWFsbWFpbik6Ci0JCWJyZWFrCisgICAgcmVhbG1haW4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpLAorICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMiLCBuYW1lKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlYWxtYWluKToKKyAgICAgICAgYnJlYWsKIGVsc2U6Ci0Jc3lzLnN0ZGVyci53cml0ZSgiJXM6IGNhbm5vdCBmaW5kIGFwcGxldCBtYWluIHByb2dyYW1cbiIgJSBzeXMuYXJndlswXSkKLQlzeXMuZXhpdCgxKQorICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiBjYW5ub3QgZmluZCBhcHBsZXQgbWFpbiBwcm9ncmFtXG4iICUgc3lzLmFyZ3ZbMF0pCisgICAgc3lzLmV4aXQoMSkKIHN5cy5hcmd2Lmluc2VydCgxLCByZWFsbWFpbikKIG9zLmV4ZWN2ZShzeXMuZXhlY3V0YWJsZSwgc3lzLmFyZ3YsIG9zLmVudmlyb24pCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvYmdlbmxvY2F0aW9ucy5weSBiL0xpYi9wbGF0LW1hYy9iZ2VubG9jYXRpb25zLnB5CmluZGV4IDg5Njg2MWUuLjQxODAzN2QgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9iZ2VubG9jYXRpb25zLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9iZ2VubG9jYXRpb25zLnB5CkBAIC0xMiwxMiArMTIsMTIgQEAKICMgV2hlcmUgYmdlbiBpcy4gRm9yIHVuaXgtUHl0aG9uIGJnZW4gaXNuJ3QgaW5zdGFsbGVkLCBzbyB5b3UgaGF2ZSB0byByZWZlciB0bwogIyB0aGUgc291cmNlIHRyZWUgaGVyZS4KIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbWFjJzoKLQkjIEZvciBNYWNQeXRob24gd2Uga25vdyB3aGVyZSBpdCBpcwotCWRlZiBfcGFyZGlyKHApOiByZXR1cm4gb3MucGF0aC5zcGxpdChwKVswXQotCUJHRU5ESVI9b3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICJUb29scyIsICJiZ2VuIiwgImJnZW4iKQorICAgICMgRm9yIE1hY1B5dGhvbiB3ZSBrbm93IHdoZXJlIGl0IGlzCisgICAgZGVmIF9wYXJkaXIocCk6IHJldHVybiBvcy5wYXRoLnNwbGl0KHApWzBdCisgICAgQkdFTkRJUj1vcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgIlRvb2xzIiwgImJnZW4iLCAiYmdlbiIpCiBlbHNlOgotCSMgZm9yIHVuaXgtUHl0aG9uIHdlIGRvbid0IGtub3csIHBsZWFzZSBzZXQgaXQgeW91cnNlbGYuCi0JQkdFTkRJUj0iL1VzZXJzL2phY2svc3JjL3B5dGhvbi9Ub29scy9iZ2VuL2JnZW4iCisgICAgIyBmb3IgdW5peC1QeXRob24gd2UgZG9uJ3Qga25vdywgcGxlYXNlIHNldCBpdCB5b3Vyc2VsZi4KKyAgICBCR0VORElSPSIvVXNlcnMvamFjay9zcmMvcHl0aG9uL1Rvb2xzL2JnZW4vYmdlbiIKIAogIwogIyBXaGVyZSB0byBmaW5kIHRoZSBVbml2ZXJzYWwgSGVhZGVyIGluY2x1ZGUgZmlsZXMuIElmIHlvdSBoYXZlIENvZGVXYXJyaW9yCkBAIC0yNiw5ICsyNiw5IEBACiAjIGVuZCBvZiBsaW5lcywgc28gZG9uJ3Qgd29ycnkgYWJvdXQgdGhhdC4KICMKIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbWFjJzoKLQlfTVdFUktTRElSPSJTYXA6QXBwbGljYXRpb25zIChNYWMgT1MgOSk6TWV0cm93ZXJrcyBDb2RlV2FycmlvciA3LjA6TWV0cm93ZXJrcyBDb2RlV2FycmlvciIKKyAgICBfTVdFUktTRElSPSJTYXA6QXBwbGljYXRpb25zIChNYWMgT1MgOSk6TWV0cm93ZXJrcyBDb2RlV2FycmlvciA3LjA6TWV0cm93ZXJrcyBDb2RlV2FycmlvciIKIGVsc2U6Ci0JX01XRVJLU0RJUj0iL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IgNy4wL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IvIgorICAgIF9NV0VSS1NESVI9Ii9Wb2x1bWVzL1NhcC9BcHBsaWNhdGlvbnMgKE1hYyBPUyA5KS9NZXRyb3dlcmtzIENvZGVXYXJyaW9yIDcuMC9NZXRyb3dlcmtzIENvZGVXYXJyaW9yLyIKIElOQ0xVREVESVI9b3MucGF0aC5qb2luKF9NV0VSS1NESVIsICJNYWNPUyBTdXBwb3J0IiwgIlVuaXZlcnNhbCIsICJJbnRlcmZhY2VzIiwgIkNJbmNsdWRlcyIpCiAKICMKQEAgLTM3LDI1ICszNywyNSBAQAogIyB5b3VyIHNvdXJjZSBkaXJlY3RvcnksIG5vdCB5b3VyIGluc3RhbGxlZCBkaXJlY3RvcnkuCiAjCiBpZiBzeXMucGxhdGZvcm0gPT0gJ21hYyc6Ci0JVE9PTEJPWERJUj1vcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgIkxpYiIsICJwbGF0LW1hYyIsICJDYXJib24iKQorICAgIFRPT0xCT1hESVI9b3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICJMaWIiLCAicGxhdC1tYWMiLCAiQ2FyYm9uIikKIGVsc2U6Ci0JVE9PTEJPWERJUj0iL1VzZXJzL2phY2svc3JjL3B5dGhvbi9MaWIvcGxhdC1tYWMvQ2FyYm9uIgorICAgIFRPT0xCT1hESVI9Ii9Vc2Vycy9qYWNrL3NyYy9weXRob24vTGliL3BsYXQtbWFjL0NhcmJvbiIKIAogIyBDcmVhdG9yIGZvciBDIGZpbGVzOgogQ1JFQVRPUj0iQ1dJRSIKIAogaWYgbm90IG9zLnBhdGguZXhpc3RzKEJHRU5ESVIpOgotCXJhaXNlIEVycm9yLCAiUGxlYXNlIGZpeCBiZ2VubG9jYXRpb25zLnB5LCBCR0VORElSIGRvZXMgbm90IGV4aXN0OiAlcyIgJSBCR0VORElSCisgICAgcmFpc2UgRXJyb3IsICJQbGVhc2UgZml4IGJnZW5sb2NhdGlvbnMucHksIEJHRU5ESVIgZG9lcyBub3QgZXhpc3Q6ICVzIiAlIEJHRU5ESVIKIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhJTkNMVURFRElSKToKLQlyYWlzZSBFcnJvciwgIlBsZWFzZSBmaXggYmdlbmxvY2F0aW9ucy5weSwgSU5DTFVERURJUiBkb2VzIG5vdCBleGlzdDogJXMiICUgSU5DTFVERURJUgorICAgIHJhaXNlIEVycm9yLCAiUGxlYXNlIGZpeCBiZ2VubG9jYXRpb25zLnB5LCBJTkNMVURFRElSIGRvZXMgbm90IGV4aXN0OiAlcyIgJSBJTkNMVURFRElSCiBpZiBub3Qgb3MucGF0aC5leGlzdHMoVE9PTEJPWERJUik6Ci0JcmFpc2UgRXJyb3IsICJQbGVhc2UgZml4IGJnZW5sb2NhdGlvbnMucHksIFRPT0xCT1hESVIgZG9lcyBub3QgZXhpc3Q6ICVzIiAlIFRPT0xCT1hESVIKLQkKKyAgICByYWlzZSBFcnJvciwgIlBsZWFzZSBmaXggYmdlbmxvY2F0aW9ucy5weSwgVE9PTEJPWERJUiBkb2VzIG5vdCBleGlzdDogJXMiICUgVE9PTEJPWERJUgorICAgIAogIyBTaWdoLCBkdWUgdG8gdGhlIHdheSB0aGVzZSBhcmUgdXNlZCBtYWtlIHN1cmUgdGhleSBlbmQgd2l0aCA6IG9yIC8uCiBpZiBCR0VORElSWy0xXSAhPSBvcy5zZXA6Ci0JQkdFTkRJUiA9IEJHRU5ESVIgKyBvcy5zZXAKKyAgICBCR0VORElSID0gQkdFTkRJUiArIG9zLnNlcAogaWYgSU5DTFVERURJUlstMV0gIT0gb3Muc2VwOgotCUlOQ0xVREVESVIgPSBJTkNMVURFRElSICsgb3Muc2VwCisgICAgSU5DTFVERURJUiA9IElOQ0xVREVESVIgKyBvcy5zZXAKIGlmIFRPT0xCT1hESVJbLTFdICE9IG9zLnNlcDoKLQlUT09MQk9YRElSID0gVE9PTEJPWERJUiArIG9zLnNlcAotCQorICAgIFRPT0xCT1hESVIgPSBUT09MQk9YRElSICsgb3Muc2VwCisgICAgCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvYnVpbGR0b29scy5weSBiL0xpYi9wbGF0LW1hYy9idWlsZHRvb2xzLnB5CmluZGV4IDU2ZjIzYTQuLjZlNjM5NmQgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9idWlsZHRvb2xzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9idWlsZHRvb2xzLnB5CkBAIC00MiwzNzUgKzQyLDM3NSBAQAogUkVTT1VSQ0VfRk9SS19OQU1FPUNhcmJvbi5GaWxlLkZTR2V0UmVzb3VyY2VGb3JrTmFtZSgpCiAKIGRlZiBmaW5kdGVtcGxhdGUodGVtcGxhdGU9Tm9uZSk6Ci0JIiIiTG9jYXRlIHRoZSBhcHBsZXQgdGVtcGxhdGUgYWxvbmcgc3lzLnBhdGgiIiIKLQlpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ21hY2hvJzoKLQkJcmV0dXJuIE5vbmUKLQlpZiBub3QgdGVtcGxhdGU6Ci0JCXRlbXBsYXRlPVRFTVBMQVRFCi0JZm9yIHAgaW4gc3lzLnBhdGg6Ci0JCWZpbGUgPSBvcy5wYXRoLmpvaW4ocCwgdGVtcGxhdGUpCi0JCXRyeToKLQkJCWZpbGUsIGQxLCBkMiA9IENhcmJvbi5GaWxlLkZTUmVzb2x2ZUFsaWFzRmlsZShmaWxlLCAxKQotCQkJYnJlYWsKLQkJZXhjZXB0IChDYXJib24uRmlsZS5FcnJvciwgVmFsdWVFcnJvcik6Ci0JCQljb250aW51ZQotCWVsc2U6Ci0JCXJhaXNlIEJ1aWxkRXJyb3IsICJUZW1wbGF0ZSAlcyBub3QgZm91bmQgb24gc3lzLnBhdGgiICUgYHRlbXBsYXRlYAotCWZpbGUgPSBmaWxlLmFzX3BhdGhuYW1lKCkKLQlyZXR1cm4gZmlsZQotCQorICAgICIiIkxvY2F0ZSB0aGUgYXBwbGV0IHRlbXBsYXRlIGFsb25nIHN5cy5wYXRoIiIiCisgICAgaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdtYWNobyc6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgbm90IHRlbXBsYXRlOgorICAgICAgICB0ZW1wbGF0ZT1URU1QTEFURQorICAgIGZvciBwIGluIHN5cy5wYXRoOgorICAgICAgICBmaWxlID0gb3MucGF0aC5qb2luKHAsIHRlbXBsYXRlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlLCBkMSwgZDIgPSBDYXJib24uRmlsZS5GU1Jlc29sdmVBbGlhc0ZpbGUoZmlsZSwgMSkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGV4Y2VwdCAoQ2FyYm9uLkZpbGUuRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgY29udGludWUKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBCdWlsZEVycm9yLCAiVGVtcGxhdGUgJXMgbm90IGZvdW5kIG9uIHN5cy5wYXRoIiAlIGB0ZW1wbGF0ZWAKKyAgICBmaWxlID0gZmlsZS5hc19wYXRobmFtZSgpCisgICAgcmV0dXJuIGZpbGUKKyAgICAKIGRlZiBwcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZGVzdG5hbWUsIGNvcHlfY29kZWZyYWdtZW50PTAsIAotCQlyc3JjbmFtZT1Ob25lLCBvdGhlcnM9W10sIHJhdz0wLCBwcm9ncmVzcz0iZGVmYXVsdCIpOgotCQotCWlmIHByb2dyZXNzID09ICJkZWZhdWx0IjoKLQkJcHJvZ3Jlc3MgPSBFYXN5RGlhbG9ncy5Qcm9ncmVzc0JhcigiUHJvY2Vzc2luZyAlcy4uLiIlb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0sIDEyMCkKLQkJcHJvZ3Jlc3MubGFiZWwoIkNvbXBpbGluZy4uLiIpCi0JCXByb2dyZXNzLmluYygwKQotCSMgY2hlY2sgZm9yIHRoZSBzY3JpcHQgbmFtZSBiZWluZyBsb25nZXIgdGhhbiAzMiBjaGFycy4gVGhpcyBtYXkgdHJpZ2dlciBhIGJ1ZwotCSMgb24gT1NYIHRoYXQgY2FuIGRlc3Ryb3kgeW91ciBzb3VyY2VmaWxlLgotCWlmICcjJyBpbiBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXToKLQkJcmFpc2UgQnVpbGRFcnJvciwgIkJ1aWxkQXBwbGV0IGNvdWxkIGRlc3Ryb3kgeW91ciBzb3VyY2VmaWxlIG9uIE9TWCwgcGxlYXNlIHJlbmFtZTogJXMiICUgZmlsZW5hbWUKLQkjIFJlYWQgdGhlIHNvdXJjZSBhbmQgY29tcGlsZSBpdAotCSMgKHRoZXJlJ3Mgbm8gcG9pbnQgb3ZlcndyaXRpbmcgdGhlIGRlc3RpbmF0aW9uIGlmIGl0IGhhcyBhIHN5bnRheCBlcnJvcikKLQkKLQlmcCA9IG9wZW4oZmlsZW5hbWUsICdyVScpCi0JdGV4dCA9IGZwLnJlYWQoKQotCWZwLmNsb3NlKCkKLQl0cnk6Ci0JCWNvZGUgPSBjb21waWxlKHRleHQgKyAnXG4nLCBmaWxlbmFtZSwgImV4ZWMiKQotCWV4Y2VwdCBTeW50YXhFcnJvciwgYXJnOgotCQlyYWlzZSBCdWlsZEVycm9yLCAiU3ludGF4IGVycm9yIGluIHNjcmlwdCAlczogJXMiICUgKGZpbGVuYW1lLCBhcmcpCi0JZXhjZXB0IEVPRkVycm9yOgotCQlyYWlzZSBCdWlsZEVycm9yLCAiRW5kLW9mLWZpbGUgaW4gc2NyaXB0ICVzIiAlIChmaWxlbmFtZSwpCi0JCi0JIyBTZXQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZS4gTm90ZSB0aGF0IGJhc2VuYW1lCi0JIyBkb2VzIGNvbnRhaW4gdGhlIHdob2xlIGZpbGVwYXRoLCBvbmx5IGEgLnB5IGlzIHN0cmlwcGVkLgotCQotCWlmIHN0cmluZy5sb3dlcihmaWxlbmFtZVstMzpdKSA9PSAiLnB5IjoKLQkJYmFzZW5hbWUgPSBmaWxlbmFtZVs6LTNdCi0JCWlmIE1hY09TLnJ1bnRpbWVtb2RlbCAhPSAnbWFjaG8nIGFuZCBub3QgZGVzdG5hbWU6Ci0JCQlkZXN0bmFtZSA9IGJhc2VuYW1lCi0JZWxzZToKLQkJYmFzZW5hbWUgPSBmaWxlbmFtZQotCQkKLQlpZiBub3QgZGVzdG5hbWU6Ci0JCWlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnbWFjaG8nOgotCQkJZGVzdG5hbWUgPSBiYXNlbmFtZSArICcuYXBwJwotCQllbHNlOgotCQkJZGVzdG5hbWUgPSBiYXNlbmFtZSArICcuYXBwbGV0JwotCWlmIG5vdCByc3JjbmFtZToKLQkJcnNyY25hbWUgPSBiYXNlbmFtZSArICcucnNyYycKLQkJCi0JIyBUcnkgcmVtb3ZpbmcgdGhlIG91dHB1dCBmaWxlLiBUaGlzIGZhaWxzIGluIE1hY2hPLCBidXQgaXQgc2hvdWxkCi0JIyBkbyBhbnkgaGFybS4KLQl0cnk6Ci0JCW9zLnJlbW92ZShkZXN0bmFtZSkKLQlleGNlcHQgb3MuZXJyb3I6Ci0JCXBhc3MKLQlwcm9jZXNzX2NvbW1vbih0ZW1wbGF0ZSwgcHJvZ3Jlc3MsIGNvZGUsIHJzcmNuYW1lLCBkZXN0bmFtZSwgMCwgCi0JCWNvcHlfY29kZWZyYWdtZW50LCByYXcsIG90aGVycywgZmlsZW5hbWUpCi0JCisgICAgICAgIHJzcmNuYW1lPU5vbmUsIG90aGVycz1bXSwgcmF3PTAsIHByb2dyZXNzPSJkZWZhdWx0Iik6CisgICAgCisgICAgaWYgcHJvZ3Jlc3MgPT0gImRlZmF1bHQiOgorICAgICAgICBwcm9ncmVzcyA9IEVhc3lEaWFsb2dzLlByb2dyZXNzQmFyKCJQcm9jZXNzaW5nICVzLi4uIiVvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSwgMTIwKQorICAgICAgICBwcm9ncmVzcy5sYWJlbCgiQ29tcGlsaW5nLi4uIikKKyAgICAgICAgcHJvZ3Jlc3MuaW5jKDApCisgICAgIyBjaGVjayBmb3IgdGhlIHNjcmlwdCBuYW1lIGJlaW5nIGxvbmdlciB0aGFuIDMyIGNoYXJzLiBUaGlzIG1heSB0cmlnZ2VyIGEgYnVnCisgICAgIyBvbiBPU1ggdGhhdCBjYW4gZGVzdHJveSB5b3VyIHNvdXJjZWZpbGUuCisgICAgaWYgJyMnIGluIG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdOgorICAgICAgICByYWlzZSBCdWlsZEVycm9yLCAiQnVpbGRBcHBsZXQgY291bGQgZGVzdHJveSB5b3VyIHNvdXJjZWZpbGUgb24gT1NYLCBwbGVhc2UgcmVuYW1lOiAlcyIgJSBmaWxlbmFtZQorICAgICMgUmVhZCB0aGUgc291cmNlIGFuZCBjb21waWxlIGl0CisgICAgIyAodGhlcmUncyBubyBwb2ludCBvdmVyd3JpdGluZyB0aGUgZGVzdGluYXRpb24gaWYgaXQgaGFzIGEgc3ludGF4IGVycm9yKQorICAgIAorICAgIGZwID0gb3BlbihmaWxlbmFtZSwgJ3JVJykKKyAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgZnAuY2xvc2UoKQorICAgIHRyeToKKyAgICAgICAgY29kZSA9IGNvbXBpbGUodGV4dCArICdcbicsIGZpbGVuYW1lLCAiZXhlYyIpCisgICAgZXhjZXB0IFN5bnRheEVycm9yLCBhcmc6CisgICAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJTeW50YXggZXJyb3IgaW4gc2NyaXB0ICVzOiAlcyIgJSAoZmlsZW5hbWUsIGFyZykKKyAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJFbmQtb2YtZmlsZSBpbiBzY3JpcHQgJXMiICUgKGZpbGVuYW1lLCkKKyAgICAKKyAgICAjIFNldCB0aGUgZGVzdGluYXRpb24gZmlsZSBuYW1lLiBOb3RlIHRoYXQgYmFzZW5hbWUKKyAgICAjIGRvZXMgY29udGFpbiB0aGUgd2hvbGUgZmlsZXBhdGgsIG9ubHkgYSAucHkgaXMgc3RyaXBwZWQuCisgICAgCisgICAgaWYgc3RyaW5nLmxvd2VyKGZpbGVuYW1lWy0zOl0pID09ICIucHkiOgorICAgICAgICBiYXNlbmFtZSA9IGZpbGVuYW1lWzotM10KKyAgICAgICAgaWYgTWFjT1MucnVudGltZW1vZGVsICE9ICdtYWNobycgYW5kIG5vdCBkZXN0bmFtZToKKyAgICAgICAgICAgIGRlc3RuYW1lID0gYmFzZW5hbWUKKyAgICBlbHNlOgorICAgICAgICBiYXNlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIAorICAgIGlmIG5vdCBkZXN0bmFtZToKKyAgICAgICAgaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdtYWNobyc6CisgICAgICAgICAgICBkZXN0bmFtZSA9IGJhc2VuYW1lICsgJy5hcHAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXN0bmFtZSA9IGJhc2VuYW1lICsgJy5hcHBsZXQnCisgICAgaWYgbm90IHJzcmNuYW1lOgorICAgICAgICByc3JjbmFtZSA9IGJhc2VuYW1lICsgJy5yc3JjJworICAgICAgICAKKyAgICAjIFRyeSByZW1vdmluZyB0aGUgb3V0cHV0IGZpbGUuIFRoaXMgZmFpbHMgaW4gTWFjaE8sIGJ1dCBpdCBzaG91bGQKKyAgICAjIGRvIGFueSBoYXJtLgorICAgIHRyeToKKyAgICAgICAgb3MucmVtb3ZlKGRlc3RuYW1lKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcGFzcworICAgIHByb2Nlc3NfY29tbW9uKHRlbXBsYXRlLCBwcm9ncmVzcywgY29kZSwgcnNyY25hbWUsIGRlc3RuYW1lLCAwLCAKKyAgICAgICAgY29weV9jb2RlZnJhZ21lbnQsIHJhdywgb3RoZXJzLCBmaWxlbmFtZSkKKyAgICAKIAogZGVmIHVwZGF0ZSh0ZW1wbGF0ZSwgZmlsZW5hbWUsIG91dHB1dCk6Ci0JaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdtYWNobyc6Ci0JCXJhaXNlIEJ1aWxkRXJyb3IsICJObyB1cGRhdGluZyB5ZXQgZm9yIE1hY2hPIGFwcGxldHMiCi0JaWYgcHJvZ3Jlc3M6Ci0JCXByb2dyZXNzID0gRWFzeURpYWxvZ3MuUHJvZ3Jlc3NCYXIoIlVwZGF0aW5nICVzLi4uIiVvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSwgMTIwKQotCWVsc2U6Ci0JCXByb2dyZXNzID0gTm9uZQotCWlmIG5vdCBvdXRwdXQ6Ci0JCW91dHB1dCA9IGZpbGVuYW1lICsgJyAodXBkYXRlZCknCi0JCi0JIyBUcnkgcmVtb3ZpbmcgdGhlIG91dHB1dCBmaWxlCi0JdHJ5OgotCQlvcy5yZW1vdmUob3V0cHV0KQotCWV4Y2VwdCBvcy5lcnJvcjoKLQkJcGFzcwotCXByb2Nlc3NfY29tbW9uKHRlbXBsYXRlLCBwcm9ncmVzcywgTm9uZSwgZmlsZW5hbWUsIG91dHB1dCwgMSwgMSkKKyAgICBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ21hY2hvJzoKKyAgICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIk5vIHVwZGF0aW5nIHlldCBmb3IgTWFjaE8gYXBwbGV0cyIKKyAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgcHJvZ3Jlc3MgPSBFYXN5RGlhbG9ncy5Qcm9ncmVzc0JhcigiVXBkYXRpbmcgJXMuLi4iJW9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdLCAxMjApCisgICAgZWxzZToKKyAgICAgICAgcHJvZ3Jlc3MgPSBOb25lCisgICAgaWYgbm90IG91dHB1dDoKKyAgICAgICAgb3V0cHV0ID0gZmlsZW5hbWUgKyAnICh1cGRhdGVkKScKKyAgICAKKyAgICAjIFRyeSByZW1vdmluZyB0aGUgb3V0cHV0IGZpbGUKKyAgICB0cnk6CisgICAgICAgIG9zLnJlbW92ZShvdXRwdXQpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICBwYXNzCisgICAgcHJvY2Vzc19jb21tb24odGVtcGxhdGUsIHByb2dyZXNzLCBOb25lLCBmaWxlbmFtZSwgb3V0cHV0LCAxLCAxKQogCiAKIGRlZiBwcm9jZXNzX2NvbW1vbih0ZW1wbGF0ZSwgcHJvZ3Jlc3MsIGNvZGUsIHJzcmNuYW1lLCBkZXN0bmFtZSwgaXNfdXBkYXRlLCAKLQkJY29weV9jb2RlZnJhZ21lbnQsIHJhdz0wLCBvdGhlcnM9W10sIGZpbGVuYW1lPU5vbmUpOgotCWlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnbWFjaG8nOgotCQlyZXR1cm4gcHJvY2Vzc19jb21tb25fbWFjaG8odGVtcGxhdGUsIHByb2dyZXNzLCBjb2RlLCByc3JjbmFtZSwgZGVzdG5hbWUsCi0JCQlpc191cGRhdGUsIHJhdywgb3RoZXJzLCBmaWxlbmFtZSkKLQlpZiBvdGhlcnM6Ci0JCXJhaXNlIEJ1aWxkRXJyb3IsICJFeHRyYSBmaWxlcyBvbmx5IGFsbG93ZWQgZm9yIE1hY2hvUHl0aG9uIGFwcGxldHMiCi0JIyBDcmVhdGUgRlNTcGVjcyBmb3IgdGhlIHZhcmlvdXMgZmlsZXMKLQl0ZW1wbGF0ZV9mc3IsIGQxLCBkMiA9IENhcmJvbi5GaWxlLkZTUmVzb2x2ZUFsaWFzRmlsZSh0ZW1wbGF0ZSwgMSkKLQl0ZW1wbGF0ZSA9IHRlbXBsYXRlX2Zzci5hc19wYXRobmFtZSgpCi0JCi0JIyBDb3B5IGRhdGEgKG5vdCByZXNvdXJjZXMsIHlldCkgZnJvbSB0aGUgdGVtcGxhdGUKLQlpZiBwcm9ncmVzczoKLQkJcHJvZ3Jlc3MubGFiZWwoIkNvcHkgZGF0YSBmb3JrLi4uIikKLQkJcHJvZ3Jlc3Muc2V0KDEwKQotCQotCWlmIGNvcHlfY29kZWZyYWdtZW50OgotCQl0bXBsID0gb3Blbih0ZW1wbGF0ZSwgInJiIikKLQkJZGVzdCA9IG9wZW4oZGVzdG5hbWUsICJ3YiIpCi0JCWRhdGEgPSB0bXBsLnJlYWQoKQotCQlpZiBkYXRhOgotCQkJZGVzdC53cml0ZShkYXRhKQotCQlkZXN0LmNsb3NlKCkKLQkJdG1wbC5jbG9zZSgpCi0JCWRlbCBkZXN0Ci0JCWRlbCB0bXBsCi0JCi0JIyBPcGVuIHRoZSBvdXRwdXQgcmVzb3VyY2UgZm9yawotCQotCWlmIHByb2dyZXNzOgotCQlwcm9ncmVzcy5sYWJlbCgiQ29weSByZXNvdXJjZXMuLi4iKQotCQlwcm9ncmVzcy5zZXQoMjApCi0JdHJ5OgotCQlvdXRwdXQgPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKGRlc3RuYW1lLCBSRVNPVVJDRV9GT1JLX05BTUUsIFdSSVRFKQotCWV4Y2VwdCBNYWNPUy5FcnJvcjoKLQkJZGVzdGRpciwgZGVzdGZpbGUgPSBvcy5wYXRoLnNwbGl0KGRlc3RuYW1lKQotCQlSZXMuRlNDcmVhdGVSZXNvdXJjZUZpbGUoZGVzdGRpciwgdW5pY29kZShkZXN0ZmlsZSksIFJFU09VUkNFX0ZPUktfTkFNRSkKLQkJb3V0cHV0ID0gUmVzLkZTT3BlblJlc291cmNlRmlsZShkZXN0bmFtZSwgUkVTT1VSQ0VfRk9SS19OQU1FLCBXUklURSkKLQkKLQkjIENvcHkgdGhlIHJlc291cmNlcyBmcm9tIHRoZSB0YXJnZXQgc3BlY2lmaWMgcmVzb3VyY2UgdGVtcGxhdGUsIGlmIGFueQotCXR5cGVzZm91bmQsIG93bmVydHlwZSA9IFtdLCBOb25lCi0JdHJ5OgotCQlpbnB1dCA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUocnNyY25hbWUsIFJFU09VUkNFX0ZPUktfTkFNRSwgUkVBRCkKLQlleGNlcHQgKE1hY09TLkVycm9yLCBWYWx1ZUVycm9yKToKLQkJcGFzcwotCQlpZiBwcm9ncmVzczoKLQkJCXByb2dyZXNzLmluYyg1MCkKLQllbHNlOgotCQlpZiBpc191cGRhdGU6Ci0JCQlza2lwX29sZGZpbGUgPSBbJ2NmcmcnXQotCQllbHNlOgotCQkJc2tpcF9vbGRmaWxlID0gW10KLQkJdHlwZXNmb3VuZCwgb3duZXJ0eXBlID0gY29weXJlcyhpbnB1dCwgb3V0cHV0LCBza2lwX29sZGZpbGUsIDAsIHByb2dyZXNzKQotCQlSZXMuQ2xvc2VSZXNGaWxlKGlucHV0KQotCQotCSMgQ2hlY2sgd2hpY2ggcmVzb3VyY2UtdHlwZXMgd2Ugc2hvdWxkIG5vdCBjb3B5IGZyb20gdGhlIHRlbXBsYXRlCi0Jc2tpcHR5cGVzID0gW10KLQlpZiAndmVycycgaW4gdHlwZXNmb3VuZDogc2tpcHR5cGVzLmFwcGVuZCgndmVycycpCi0JaWYgJ1NJWkUnIGluIHR5cGVzZm91bmQ6IHNraXB0eXBlcy5hcHBlbmQoJ1NJWkUnKQotCWlmICdCTkRMJyBpbiB0eXBlc2ZvdW5kOiBza2lwdHlwZXMgPSBza2lwdHlwZXMgKyBbJ0JOREwnLCAnRlJFRicsICdpY2w0JywgCi0JCQknaWNsOCcsICdpY3M0JywgJ2ljczgnLCAnSUNOIycsICdpY3MjJ10KLQlpZiBub3QgY29weV9jb2RlZnJhZ21lbnQ6Ci0JCXNraXB0eXBlcy5hcHBlbmQoJ2NmcmcnKQotIyMJc2tpcG93bmVyID0gKG93bmVydHlwZSA8PiBOb25lKQotCQotCSMgQ29weSB0aGUgcmVzb3VyY2VzIGZyb20gdGhlIHRlbXBsYXRlCi0JCi0JaW5wdXQgPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKHRlbXBsYXRlLCBSRVNPVVJDRV9GT1JLX05BTUUsIFJFQUQpCi0JZHVtbXksIHRtcGxvd25lciA9IGNvcHlyZXMoaW5wdXQsIG91dHB1dCwgc2tpcHR5cGVzLCAxLCBwcm9ncmVzcykKLQkJCi0JUmVzLkNsb3NlUmVzRmlsZShpbnB1dCkKLSMjCWlmIG93bmVydHlwZSA9PSBOb25lOgotIyMJCXJhaXNlIEJ1aWxkRXJyb3IsICJObyBvd25lciByZXNvdXJjZSBmb3VuZCBpbiBlaXRoZXIgcmVzb3VyY2UgZmlsZSBvciB0ZW1wbGF0ZSIKLQkjIE1ha2Ugc3VyZSB3ZSdyZSBtYW5pcHVsYXRpbmcgdGhlIG91dHB1dCByZXNvdXJjZSBmaWxlIG5vdwotCQotCVJlcy5Vc2VSZXNGaWxlKG91dHB1dCkKKyAgICAgICAgY29weV9jb2RlZnJhZ21lbnQsIHJhdz0wLCBvdGhlcnM9W10sIGZpbGVuYW1lPU5vbmUpOgorICAgIGlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnbWFjaG8nOgorICAgICAgICByZXR1cm4gcHJvY2Vzc19jb21tb25fbWFjaG8odGVtcGxhdGUsIHByb2dyZXNzLCBjb2RlLCByc3JjbmFtZSwgZGVzdG5hbWUsCisgICAgICAgICAgICBpc191cGRhdGUsIHJhdywgb3RoZXJzLCBmaWxlbmFtZSkKKyAgICBpZiBvdGhlcnM6CisgICAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJFeHRyYSBmaWxlcyBvbmx5IGFsbG93ZWQgZm9yIE1hY2hvUHl0aG9uIGFwcGxldHMiCisgICAgIyBDcmVhdGUgRlNTcGVjcyBmb3IgdGhlIHZhcmlvdXMgZmlsZXMKKyAgICB0ZW1wbGF0ZV9mc3IsIGQxLCBkMiA9IENhcmJvbi5GaWxlLkZTUmVzb2x2ZUFsaWFzRmlsZSh0ZW1wbGF0ZSwgMSkKKyAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlX2Zzci5hc19wYXRobmFtZSgpCisgICAgCisgICAgIyBDb3B5IGRhdGEgKG5vdCByZXNvdXJjZXMsIHlldCkgZnJvbSB0aGUgdGVtcGxhdGUKKyAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgcHJvZ3Jlc3MubGFiZWwoIkNvcHkgZGF0YSBmb3JrLi4uIikKKyAgICAgICAgcHJvZ3Jlc3Muc2V0KDEwKQorICAgIAorICAgIGlmIGNvcHlfY29kZWZyYWdtZW50OgorICAgICAgICB0bXBsID0gb3Blbih0ZW1wbGF0ZSwgInJiIikKKyAgICAgICAgZGVzdCA9IG9wZW4oZGVzdG5hbWUsICJ3YiIpCisgICAgICAgIGRhdGEgPSB0bXBsLnJlYWQoKQorICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgZGVzdC53cml0ZShkYXRhKQorICAgICAgICBkZXN0LmNsb3NlKCkKKyAgICAgICAgdG1wbC5jbG9zZSgpCisgICAgICAgIGRlbCBkZXN0CisgICAgICAgIGRlbCB0bXBsCisgICAgCisgICAgIyBPcGVuIHRoZSBvdXRwdXQgcmVzb3VyY2UgZm9yaworICAgIAorICAgIGlmIHByb2dyZXNzOgorICAgICAgICBwcm9ncmVzcy5sYWJlbCgiQ29weSByZXNvdXJjZXMuLi4iKQorICAgICAgICBwcm9ncmVzcy5zZXQoMjApCisgICAgdHJ5OgorICAgICAgICBvdXRwdXQgPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKGRlc3RuYW1lLCBSRVNPVVJDRV9GT1JLX05BTUUsIFdSSVRFKQorICAgIGV4Y2VwdCBNYWNPUy5FcnJvcjoKKyAgICAgICAgZGVzdGRpciwgZGVzdGZpbGUgPSBvcy5wYXRoLnNwbGl0KGRlc3RuYW1lKQorICAgICAgICBSZXMuRlNDcmVhdGVSZXNvdXJjZUZpbGUoZGVzdGRpciwgdW5pY29kZShkZXN0ZmlsZSksIFJFU09VUkNFX0ZPUktfTkFNRSkKKyAgICAgICAgb3V0cHV0ID0gUmVzLkZTT3BlblJlc291cmNlRmlsZShkZXN0bmFtZSwgUkVTT1VSQ0VfRk9SS19OQU1FLCBXUklURSkKKyAgICAKKyAgICAjIENvcHkgdGhlIHJlc291cmNlcyBmcm9tIHRoZSB0YXJnZXQgc3BlY2lmaWMgcmVzb3VyY2UgdGVtcGxhdGUsIGlmIGFueQorICAgIHR5cGVzZm91bmQsIG93bmVydHlwZSA9IFtdLCBOb25lCisgICAgdHJ5OgorICAgICAgICBpbnB1dCA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUocnNyY25hbWUsIFJFU09VUkNFX0ZPUktfTkFNRSwgUkVBRCkKKyAgICBleGNlcHQgKE1hY09TLkVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgcGFzcworICAgICAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgICAgIHByb2dyZXNzLmluYyg1MCkKKyAgICBlbHNlOgorICAgICAgICBpZiBpc191cGRhdGU6CisgICAgICAgICAgICBza2lwX29sZGZpbGUgPSBbJ2NmcmcnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2tpcF9vbGRmaWxlID0gW10KKyAgICAgICAgdHlwZXNmb3VuZCwgb3duZXJ0eXBlID0gY29weXJlcyhpbnB1dCwgb3V0cHV0LCBza2lwX29sZGZpbGUsIDAsIHByb2dyZXNzKQorICAgICAgICBSZXMuQ2xvc2VSZXNGaWxlKGlucHV0KQorICAgIAorICAgICMgQ2hlY2sgd2hpY2ggcmVzb3VyY2UtdHlwZXMgd2Ugc2hvdWxkIG5vdCBjb3B5IGZyb20gdGhlIHRlbXBsYXRlCisgICAgc2tpcHR5cGVzID0gW10KKyAgICBpZiAndmVycycgaW4gdHlwZXNmb3VuZDogc2tpcHR5cGVzLmFwcGVuZCgndmVycycpCisgICAgaWYgJ1NJWkUnIGluIHR5cGVzZm91bmQ6IHNraXB0eXBlcy5hcHBlbmQoJ1NJWkUnKQorICAgIGlmICdCTkRMJyBpbiB0eXBlc2ZvdW5kOiBza2lwdHlwZXMgPSBza2lwdHlwZXMgKyBbJ0JOREwnLCAnRlJFRicsICdpY2w0JywgCisgICAgICAgICAgICAnaWNsOCcsICdpY3M0JywgJ2ljczgnLCAnSUNOIycsICdpY3MjJ10KKyAgICBpZiBub3QgY29weV9jb2RlZnJhZ21lbnQ6CisgICAgICAgIHNraXB0eXBlcy5hcHBlbmQoJ2NmcmcnKQorIyMgIHNraXBvd25lciA9IChvd25lcnR5cGUgPD4gTm9uZSkKKyAgICAKKyAgICAjIENvcHkgdGhlIHJlc291cmNlcyBmcm9tIHRoZSB0ZW1wbGF0ZQorICAgIAorICAgIGlucHV0ID0gUmVzLkZTT3BlblJlc291cmNlRmlsZSh0ZW1wbGF0ZSwgUkVTT1VSQ0VfRk9SS19OQU1FLCBSRUFEKQorICAgIGR1bW15LCB0bXBsb3duZXIgPSBjb3B5cmVzKGlucHV0LCBvdXRwdXQsIHNraXB0eXBlcywgMSwgcHJvZ3Jlc3MpCisgICAgICAgIAorICAgIFJlcy5DbG9zZVJlc0ZpbGUoaW5wdXQpCisjIyAgaWYgb3duZXJ0eXBlID09IE5vbmU6CisjIyAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJObyBvd25lciByZXNvdXJjZSBmb3VuZCBpbiBlaXRoZXIgcmVzb3VyY2UgZmlsZSBvciB0ZW1wbGF0ZSIKKyAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBtYW5pcHVsYXRpbmcgdGhlIG91dHB1dCByZXNvdXJjZSBmaWxlIG5vdworICAgIAorICAgIFJlcy5Vc2VSZXNGaWxlKG91dHB1dCkKIAotCWlmIG93bmVydHlwZSA9PSBOb25lOgotCQkjIE5vIG93bmVyIHJlc291cmNlIGluIHRoZSB0ZW1wbGF0ZS4gV2UgaGF2ZSBza2lwcGVkIHRoZQotCQkjIFB5dGhvbiBvd25lciByZXNvdXJjZSwgc28gd2UgaGF2ZSB0byBhZGQgb3VyIG93bi4gVGhlIHJlbGV2YW50Ci0JCSMgYnVuZGxlIHN0dWZmIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGludGVycHJldC9hcHBsZXQgdGVtcGxhdGUuCi0JCW5ld3JlcyA9IFJlcy5SZXNvdXJjZSgnXDAnKQotCQluZXdyZXMuQWRkUmVzb3VyY2UoREVGQVVMVF9BUFBMRVRfQ1JFQVRPUiwgMCwgIk93bmVyIHJlc291cmNlIikKLQkJb3duZXJ0eXBlID0gREVGQVVMVF9BUFBMRVRfQ1JFQVRPUgotCQotCWlmIGNvZGU6Ci0JCSMgRGVsZXRlIGFueSBleGlzdGluZyAnUFlDICcgcmVzb3VyY2UgbmFtZWQgX19tYWluX18KLQkJCi0JCXRyeToKLQkJCXJlcyA9IFJlcy5HZXQxTmFtZWRSZXNvdXJjZShSRVNUWVBFLCBSRVNOQU1FKQotCQkJcmVzLlJlbW92ZVJlc291cmNlKCkKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCXBhc3MKLQkJCi0JCSMgQ3JlYXRlIHRoZSByYXcgZGF0YSBmb3IgdGhlIHJlc291cmNlIGZyb20gdGhlIGNvZGUgb2JqZWN0Ci0JCWlmIHByb2dyZXNzOgotCQkJcHJvZ3Jlc3MubGFiZWwoIldyaXRlIFBZQyByZXNvdXJjZS4uLiIpCi0JCQlwcm9ncmVzcy5zZXQoMTIwKQotCQkKLQkJZGF0YSA9IG1hcnNoYWwuZHVtcHMoY29kZSkKLQkJZGVsIGNvZGUKLQkJZGF0YSA9IChNQUdJQyArICdcMFwwXDBcMCcpICsgZGF0YQotCQkKLQkJIyBDcmVhdGUgdGhlIHJlc291cmNlIGFuZCB3cml0ZSBpdAotCQkKLQkJaWQgPSAwCi0JCXdoaWxlIGlkIDwgMTI4OgotCQkJaWQgPSBSZXMuVW5pcXVlMUlEKFJFU1RZUEUpCi0JCXJlcyA9IFJlcy5SZXNvdXJjZShkYXRhKQotCQlyZXMuQWRkUmVzb3VyY2UoUkVTVFlQRSwgaWQsIFJFU05BTUUpCi0JCWF0dHJzID0gcmVzLkdldFJlc0F0dHJzKCkKLQkJYXR0cnMgPSBhdHRycyB8IDB4MDQJIyBzZXQgcHJlbG9hZAotCQlyZXMuU2V0UmVzQXR0cnMoYXR0cnMpCi0JCXJlcy5Xcml0ZVJlc291cmNlKCkKLQkJcmVzLlJlbGVhc2VSZXNvdXJjZSgpCi0JCi0JIyBDbG9zZSB0aGUgb3V0cHV0IGZpbGUKLQkKLQlSZXMuQ2xvc2VSZXNGaWxlKG91dHB1dCkKLQkKLQkjIE5vdyBzZXQgdGhlIGNyZWF0b3IsIHR5cGUgYW5kIGJ1bmRsZSBiaXQgb2YgdGhlIGRlc3RpbmF0aW9uLgotCSMgRG9uZSB3aXRoIEZTU3BlYydzLCBGU1JlZiBGSW5mbyBpc24ndCBnb29kIGVub3VnaCB5ZXQgKDIuM2ExKykKLQlkZXN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkZXN0bmFtZSkKLQlkZXN0X2ZpbmZvID0gZGVzdF9mc3MuRlNwR2V0RkluZm8oKQotCWRlc3RfZmluZm8uQ3JlYXRvciA9IG93bmVydHlwZQotCWRlc3RfZmluZm8uVHlwZSA9ICdBUFBMJwotCWRlc3RfZmluZm8uRmxhZ3MgPSBkZXN0X2ZpbmZvLkZsYWdzIHwgQ2FyYm9uLkZpbGVzLmtIYXNCdW5kbGUgfCBDYXJib24uRmlsZXMua0lzU2hhcmVkCi0JZGVzdF9maW5mby5GbGFncyA9IGRlc3RfZmluZm8uRmxhZ3MgJiB+Q2FyYm9uLkZpbGVzLmtIYXNCZWVuSW5pdGVkCi0JZGVzdF9mc3MuRlNwU2V0RkluZm8oZGVzdF9maW5mbykKLQkKLQltYWNvc3Rvb2xzLnRvdWNoZWQoZGVzdG5hbWUpCi0JaWYgcHJvZ3Jlc3M6Ci0JCXByb2dyZXNzLmxhYmVsKCJEb25lLiIpCi0JCXByb2dyZXNzLmluYygwKQorICAgIGlmIG93bmVydHlwZSA9PSBOb25lOgorICAgICAgICAjIE5vIG93bmVyIHJlc291cmNlIGluIHRoZSB0ZW1wbGF0ZS4gV2UgaGF2ZSBza2lwcGVkIHRoZQorICAgICAgICAjIFB5dGhvbiBvd25lciByZXNvdXJjZSwgc28gd2UgaGF2ZSB0byBhZGQgb3VyIG93bi4gVGhlIHJlbGV2YW50CisgICAgICAgICMgYnVuZGxlIHN0dWZmIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGludGVycHJldC9hcHBsZXQgdGVtcGxhdGUuCisgICAgICAgIG5ld3JlcyA9IFJlcy5SZXNvdXJjZSgnXDAnKQorICAgICAgICBuZXdyZXMuQWRkUmVzb3VyY2UoREVGQVVMVF9BUFBMRVRfQ1JFQVRPUiwgMCwgIk93bmVyIHJlc291cmNlIikKKyAgICAgICAgb3duZXJ0eXBlID0gREVGQVVMVF9BUFBMRVRfQ1JFQVRPUgorICAgIAorICAgIGlmIGNvZGU6CisgICAgICAgICMgRGVsZXRlIGFueSBleGlzdGluZyAnUFlDICcgcmVzb3VyY2UgbmFtZWQgX19tYWluX18KKyAgICAgICAgCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcyA9IFJlcy5HZXQxTmFtZWRSZXNvdXJjZShSRVNUWVBFLCBSRVNOQU1FKQorICAgICAgICAgICAgcmVzLlJlbW92ZVJlc291cmNlKCkKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgCisgICAgICAgICMgQ3JlYXRlIHRoZSByYXcgZGF0YSBmb3IgdGhlIHJlc291cmNlIGZyb20gdGhlIGNvZGUgb2JqZWN0CisgICAgICAgIGlmIHByb2dyZXNzOgorICAgICAgICAgICAgcHJvZ3Jlc3MubGFiZWwoIldyaXRlIFBZQyByZXNvdXJjZS4uLiIpCisgICAgICAgICAgICBwcm9ncmVzcy5zZXQoMTIwKQorICAgICAgICAKKyAgICAgICAgZGF0YSA9IG1hcnNoYWwuZHVtcHMoY29kZSkKKyAgICAgICAgZGVsIGNvZGUKKyAgICAgICAgZGF0YSA9IChNQUdJQyArICdcMFwwXDBcMCcpICsgZGF0YQorICAgICAgICAKKyAgICAgICAgIyBDcmVhdGUgdGhlIHJlc291cmNlIGFuZCB3cml0ZSBpdAorICAgICAgICAKKyAgICAgICAgaWQgPSAwCisgICAgICAgIHdoaWxlIGlkIDwgMTI4OgorICAgICAgICAgICAgaWQgPSBSZXMuVW5pcXVlMUlEKFJFU1RZUEUpCisgICAgICAgIHJlcyA9IFJlcy5SZXNvdXJjZShkYXRhKQorICAgICAgICByZXMuQWRkUmVzb3VyY2UoUkVTVFlQRSwgaWQsIFJFU05BTUUpCisgICAgICAgIGF0dHJzID0gcmVzLkdldFJlc0F0dHJzKCkKKyAgICAgICAgYXR0cnMgPSBhdHRycyB8IDB4MDQgICAgIyBzZXQgcHJlbG9hZAorICAgICAgICByZXMuU2V0UmVzQXR0cnMoYXR0cnMpCisgICAgICAgIHJlcy5Xcml0ZVJlc291cmNlKCkKKyAgICAgICAgcmVzLlJlbGVhc2VSZXNvdXJjZSgpCisgICAgCisgICAgIyBDbG9zZSB0aGUgb3V0cHV0IGZpbGUKKyAgICAKKyAgICBSZXMuQ2xvc2VSZXNGaWxlKG91dHB1dCkKKyAgICAKKyAgICAjIE5vdyBzZXQgdGhlIGNyZWF0b3IsIHR5cGUgYW5kIGJ1bmRsZSBiaXQgb2YgdGhlIGRlc3RpbmF0aW9uLgorICAgICMgRG9uZSB3aXRoIEZTU3BlYydzLCBGU1JlZiBGSW5mbyBpc24ndCBnb29kIGVub3VnaCB5ZXQgKDIuM2ExKykKKyAgICBkZXN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkZXN0bmFtZSkKKyAgICBkZXN0X2ZpbmZvID0gZGVzdF9mc3MuRlNwR2V0RkluZm8oKQorICAgIGRlc3RfZmluZm8uQ3JlYXRvciA9IG93bmVydHlwZQorICAgIGRlc3RfZmluZm8uVHlwZSA9ICdBUFBMJworICAgIGRlc3RfZmluZm8uRmxhZ3MgPSBkZXN0X2ZpbmZvLkZsYWdzIHwgQ2FyYm9uLkZpbGVzLmtIYXNCdW5kbGUgfCBDYXJib24uRmlsZXMua0lzU2hhcmVkCisgICAgZGVzdF9maW5mby5GbGFncyA9IGRlc3RfZmluZm8uRmxhZ3MgJiB+Q2FyYm9uLkZpbGVzLmtIYXNCZWVuSW5pdGVkCisgICAgZGVzdF9mc3MuRlNwU2V0RkluZm8oZGVzdF9maW5mbykKKyAgICAKKyAgICBtYWNvc3Rvb2xzLnRvdWNoZWQoZGVzdG5hbWUpCisgICAgaWYgcHJvZ3Jlc3M6CisgICAgICAgIHByb2dyZXNzLmxhYmVsKCJEb25lLiIpCisgICAgICAgIHByb2dyZXNzLmluYygwKQogCiBkZWYgcHJvY2Vzc19jb21tb25fbWFjaG8odGVtcGxhdGUsIHByb2dyZXNzLCBjb2RlLCByc3JjbmFtZSwgZGVzdG5hbWUsIGlzX3VwZGF0ZSwgCi0JCXJhdz0wLCBvdGhlcnM9W10sIGZpbGVuYW1lPU5vbmUpOgotCSMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgZmlsZW5hbWUKLQlpZiBmaWxlbmFtZSBpcyBOb25lOgotCQlyYWlzZSBCdWlsZEVycm9yLCAiTmVlZCBzb3VyY2UgZmlsZW5hbWUgb24gTWFjT1NYIgotCSMgRmlyc3QgbWFrZSBzdXJlIHRoZSBuYW1lIGVuZHMgaW4gIi5hcHAiCi0JaWYgZGVzdG5hbWVbLTQ6XSAhPSAnLmFwcCc6Ci0JCWRlc3RuYW1lID0gZGVzdG5hbWUgKyAnLmFwcCcKLQkjIE5vdyBkZWR1Y2UgdGhlIHNob3J0IG5hbWUKLQlkZXN0ZGlyLCBzaG9ydG5hbWUgPSBvcy5wYXRoLnNwbGl0KGRlc3RuYW1lKQotCWlmIHNob3J0bmFtZVstNDpdID09ICcuYXBwJzoKLQkJIyBTdHJpcCB0aGUgLmFwcCBzdWZmaXgKLQkJc2hvcnRuYW1lID0gc2hvcnRuYW1lWzotNF0KLQkjIEFuZCBkZWR1Y2UgdGhlIC5wbGlzdCBhbmQgLmljbnMgbmFtZXMKLQlwbGlzdG5hbWUgPSBOb25lCi0JaWNuc25hbWUgPSBOb25lCi0JaWYgcnNyY25hbWUgYW5kIHJzcmNuYW1lWy01Ol0gPT0gJy5yc3JjJzoKLQkJdG1wID0gcnNyY25hbWVbOi01XQotCQlwbGlzdG5hbWUgPSB0bXAgKyAnLnBsaXN0JwotCQlpZiBvcy5wYXRoLmV4aXN0cyhwbGlzdG5hbWUpOgotCQkJaWNuc25hbWUgPSB0bXAgKyAnLmljbnMnCi0JCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoaWNuc25hbWUpOgotCQkJCWljbnNuYW1lID0gTm9uZQotCQllbHNlOgotCQkJcGxpc3RuYW1lID0gTm9uZQotCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyc3JjbmFtZSk6Ci0JCXJzcmNuYW1lID0gTm9uZQotCWlmIHByb2dyZXNzOgotCQlwcm9ncmVzcy5sYWJlbCgnQ3JlYXRpbmcgYnVuZGxlLi4uJykKLQlpbXBvcnQgYnVuZGxlYnVpbGRlcgotCWJ1aWxkZXIgPSBidW5kbGVidWlsZGVyLkFwcEJ1aWxkZXIodmVyYm9zaXR5PTApCi0JYnVpbGRlci5tYWlucHJvZ3JhbSA9IGZpbGVuYW1lCi0JYnVpbGRlci5idWlsZGRpciA9IGRlc3RkaXIKLQlidWlsZGVyLm5hbWUgPSBzaG9ydG5hbWUKLQlpZiByc3JjbmFtZToKLQkJcmVhbHJzcmNuYW1lID0gbWFjcmVzb3VyY2UucmVzb3VyY2VfcGF0aG5hbWUocnNyY25hbWUpCi0JCWJ1aWxkZXIuZmlsZXMuYXBwZW5kKChyZWFscnNyY25hbWUsIAotCQkJb3MucGF0aC5qb2luKCdDb250ZW50cy9SZXNvdXJjZXMnLCBvcy5wYXRoLmJhc2VuYW1lKHJzcmNuYW1lKSkpKQotCWZvciBvIGluIG90aGVyczoKLQkJaWYgdHlwZShvKSA9PSBzdHI6Ci0JCQlidWlsZGVyLnJlc291cmNlcy5hcHBlbmQobykKLQkJZWxzZToKLQkJCWJ1aWxkZXIuZmlsZXMuYXBwZW5kKG8pCi0JaWYgcGxpc3RuYW1lOgotCQlpbXBvcnQgcGxpc3RsaWIKLQkJYnVpbGRlci5wbGlzdCA9IHBsaXN0bGliLlBsaXN0LmZyb21GaWxlKHBsaXN0bmFtZSkKLQlpZiBpY25zbmFtZToKLQkJYnVpbGRlci5pY29uZmlsZSA9IGljbnNuYW1lCi0JaWYgbm90IHJhdzoKLQkJYnVpbGRlci5hcmd2X2VtdWxhdGlvbiA9IDEKLQlidWlsZGVyLnNldHVwKCkKLQlidWlsZGVyLmJ1aWxkKCkKLQlpZiBwcm9ncmVzczogCi0JCXByb2dyZXNzLmxhYmVsKCdEb25lLicpCi0JCXByb2dyZXNzLmluYygwKQotCQotIyMJbWFjb3N0b29scy50b3VjaGVkKGRlc3RfZnNzKQorICAgICAgICByYXc9MCwgb3RoZXJzPVtdLCBmaWxlbmFtZT1Ob25lKToKKyAgICAjIENoZWNrIHRoYXQgd2UgaGF2ZSBhIGZpbGVuYW1lCisgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIk5lZWQgc291cmNlIGZpbGVuYW1lIG9uIE1hY09TWCIKKyAgICAjIEZpcnN0IG1ha2Ugc3VyZSB0aGUgbmFtZSBlbmRzIGluICIuYXBwIgorICAgIGlmIGRlc3RuYW1lWy00Ol0gIT0gJy5hcHAnOgorICAgICAgICBkZXN0bmFtZSA9IGRlc3RuYW1lICsgJy5hcHAnCisgICAgIyBOb3cgZGVkdWNlIHRoZSBzaG9ydCBuYW1lCisgICAgZGVzdGRpciwgc2hvcnRuYW1lID0gb3MucGF0aC5zcGxpdChkZXN0bmFtZSkKKyAgICBpZiBzaG9ydG5hbWVbLTQ6XSA9PSAnLmFwcCc6CisgICAgICAgICMgU3RyaXAgdGhlIC5hcHAgc3VmZml4CisgICAgICAgIHNob3J0bmFtZSA9IHNob3J0bmFtZVs6LTRdCisgICAgIyBBbmQgZGVkdWNlIHRoZSAucGxpc3QgYW5kIC5pY25zIG5hbWVzCisgICAgcGxpc3RuYW1lID0gTm9uZQorICAgIGljbnNuYW1lID0gTm9uZQorICAgIGlmIHJzcmNuYW1lIGFuZCByc3JjbmFtZVstNTpdID09ICcucnNyYyc6CisgICAgICAgIHRtcCA9IHJzcmNuYW1lWzotNV0KKyAgICAgICAgcGxpc3RuYW1lID0gdG1wICsgJy5wbGlzdCcKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxpc3RuYW1lKToKKyAgICAgICAgICAgIGljbnNuYW1lID0gdG1wICsgJy5pY25zJworICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGljbnNuYW1lKToKKyAgICAgICAgICAgICAgICBpY25zbmFtZSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBsaXN0bmFtZSA9IE5vbmUKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocnNyY25hbWUpOgorICAgICAgICByc3JjbmFtZSA9IE5vbmUKKyAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgcHJvZ3Jlc3MubGFiZWwoJ0NyZWF0aW5nIGJ1bmRsZS4uLicpCisgICAgaW1wb3J0IGJ1bmRsZWJ1aWxkZXIKKyAgICBidWlsZGVyID0gYnVuZGxlYnVpbGRlci5BcHBCdWlsZGVyKHZlcmJvc2l0eT0wKQorICAgIGJ1aWxkZXIubWFpbnByb2dyYW0gPSBmaWxlbmFtZQorICAgIGJ1aWxkZXIuYnVpbGRkaXIgPSBkZXN0ZGlyCisgICAgYnVpbGRlci5uYW1lID0gc2hvcnRuYW1lCisgICAgaWYgcnNyY25hbWU6CisgICAgICAgIHJlYWxyc3JjbmFtZSA9IG1hY3Jlc291cmNlLnJlc291cmNlX3BhdGhuYW1lKHJzcmNuYW1lKQorICAgICAgICBidWlsZGVyLmZpbGVzLmFwcGVuZCgocmVhbHJzcmNuYW1lLCAKKyAgICAgICAgICAgIG9zLnBhdGguam9pbignQ29udGVudHMvUmVzb3VyY2VzJywgb3MucGF0aC5iYXNlbmFtZShyc3JjbmFtZSkpKSkKKyAgICBmb3IgbyBpbiBvdGhlcnM6CisgICAgICAgIGlmIHR5cGUobykgPT0gc3RyOgorICAgICAgICAgICAgYnVpbGRlci5yZXNvdXJjZXMuYXBwZW5kKG8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWlsZGVyLmZpbGVzLmFwcGVuZChvKQorICAgIGlmIHBsaXN0bmFtZToKKyAgICAgICAgaW1wb3J0IHBsaXN0bGliCisgICAgICAgIGJ1aWxkZXIucGxpc3QgPSBwbGlzdGxpYi5QbGlzdC5mcm9tRmlsZShwbGlzdG5hbWUpCisgICAgaWYgaWNuc25hbWU6CisgICAgICAgIGJ1aWxkZXIuaWNvbmZpbGUgPSBpY25zbmFtZQorICAgIGlmIG5vdCByYXc6CisgICAgICAgIGJ1aWxkZXIuYXJndl9lbXVsYXRpb24gPSAxCisgICAgYnVpbGRlci5zZXR1cCgpCisgICAgYnVpbGRlci5idWlsZCgpCisgICAgaWYgcHJvZ3Jlc3M6IAorICAgICAgICBwcm9ncmVzcy5sYWJlbCgnRG9uZS4nKQorICAgICAgICBwcm9ncmVzcy5pbmMoMCkKKyAgICAKKyMjICBtYWNvc3Rvb2xzLnRvdWNoZWQoZGVzdF9mc3MpCiAKICMgQ29weSByZXNvdXJjZXMgYmV0d2VlbiB0d28gcmVzb3VyY2UgZmlsZSBkZXNjcmlwdG9ycy4KICMgc2tpcCBhIHJlc291cmNlIG5hbWVkICdfX21haW5fXycgb3IgKGlmIHNraXBvd25lciBpcyBzZXQpIHdpdGggSUQgemVyby4KICMgQWxzbyBza2lwIHJlc291cmNlcyB3aXRoIGEgdHlwZSBsaXN0ZWQgaW4gc2tpcHR5cGVzLgogIwogZGVmIGNvcHlyZXMoaW5wdXQsIG91dHB1dCwgc2tpcHR5cGVzLCBza2lwb3duZXIsIHByb2dyZXNzPU5vbmUpOgotCWN0b3IgPSBOb25lCi0JYWxsdHlwZXMgPSBbXQotCVJlcy5Vc2VSZXNGaWxlKGlucHV0KQotCW50eXBlcyA9IFJlcy5Db3VudDFUeXBlcygpCi0JcHJvZ3Jlc3NfdHlwZV9pbmMgPSA1MC9udHlwZXMKLQlmb3IgaXR5cGUgaW4gcmFuZ2UoMSwgMStudHlwZXMpOgotCQl0eXBlID0gUmVzLkdldDFJbmRUeXBlKGl0eXBlKQotCQlpZiB0eXBlIGluIHNraXB0eXBlczoKLQkJCWNvbnRpbnVlCi0JCWFsbHR5cGVzLmFwcGVuZCh0eXBlKQotCQlucmVzb3VyY2VzID0gUmVzLkNvdW50MVJlc291cmNlcyh0eXBlKQotCQlwcm9ncmVzc19jdXJfaW5jID0gcHJvZ3Jlc3NfdHlwZV9pbmMvbnJlc291cmNlcwotCQlmb3IgaXJlcyBpbiByYW5nZSgxLCAxK25yZXNvdXJjZXMpOgotCQkJcmVzID0gUmVzLkdldDFJbmRSZXNvdXJjZSh0eXBlLCBpcmVzKQotCQkJaWQsIHR5cGUsIG5hbWUgPSByZXMuR2V0UmVzSW5mbygpCi0JCQlsY25hbWUgPSBzdHJpbmcubG93ZXIobmFtZSkKKyAgICBjdG9yID0gTm9uZQorICAgIGFsbHR5cGVzID0gW10KKyAgICBSZXMuVXNlUmVzRmlsZShpbnB1dCkKKyAgICBudHlwZXMgPSBSZXMuQ291bnQxVHlwZXMoKQorICAgIHByb2dyZXNzX3R5cGVfaW5jID0gNTAvbnR5cGVzCisgICAgZm9yIGl0eXBlIGluIHJhbmdlKDEsIDErbnR5cGVzKToKKyAgICAgICAgdHlwZSA9IFJlcy5HZXQxSW5kVHlwZShpdHlwZSkKKyAgICAgICAgaWYgdHlwZSBpbiBza2lwdHlwZXM6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBhbGx0eXBlcy5hcHBlbmQodHlwZSkKKyAgICAgICAgbnJlc291cmNlcyA9IFJlcy5Db3VudDFSZXNvdXJjZXModHlwZSkKKyAgICAgICAgcHJvZ3Jlc3NfY3VyX2luYyA9IHByb2dyZXNzX3R5cGVfaW5jL25yZXNvdXJjZXMKKyAgICAgICAgZm9yIGlyZXMgaW4gcmFuZ2UoMSwgMStucmVzb3VyY2VzKToKKyAgICAgICAgICAgIHJlcyA9IFJlcy5HZXQxSW5kUmVzb3VyY2UodHlwZSwgaXJlcykKKyAgICAgICAgICAgIGlkLCB0eXBlLCBuYW1lID0gcmVzLkdldFJlc0luZm8oKQorICAgICAgICAgICAgbGNuYW1lID0gc3RyaW5nLmxvd2VyKG5hbWUpCiAKLQkJCWlmIGxjbmFtZSA9PSBPV05FUk5BTUUgYW5kIGlkID09IDA6Ci0JCQkJaWYgc2tpcG93bmVyOgotCQkJCQljb250aW51ZSAjIFNraXAgdGhpcyBvbmUKLQkJCQllbHNlOgotCQkJCQljdG9yID0gdHlwZQotCQkJc2l6ZSA9IHJlcy5zaXplCi0JCQlhdHRycyA9IHJlcy5HZXRSZXNBdHRycygpCi0JCQlpZiBwcm9ncmVzczoKLQkJCQlwcm9ncmVzcy5sYWJlbCgiQ29weSAlcyAlZCAlcyIlKHR5cGUsIGlkLCBuYW1lKSkKLQkJCQlwcm9ncmVzcy5pbmMocHJvZ3Jlc3NfY3VyX2luYykKLQkJCXJlcy5Mb2FkUmVzb3VyY2UoKQotCQkJcmVzLkRldGFjaFJlc291cmNlKCkKLQkJCVJlcy5Vc2VSZXNGaWxlKG91dHB1dCkKLQkJCXRyeToKLQkJCQlyZXMyID0gUmVzLkdldDFSZXNvdXJjZSh0eXBlLCBpZCkKLQkJCWV4Y2VwdCBNYWNPUy5FcnJvcjoKLQkJCQlyZXMyID0gTm9uZQotCQkJaWYgcmVzMjoKLQkJCQlpZiBwcm9ncmVzczoKLQkJCQkJcHJvZ3Jlc3MubGFiZWwoIk92ZXJ3cml0ZSAlcyAlZCAlcyIlKHR5cGUsIGlkLCBuYW1lKSkKLQkJCQkJcHJvZ3Jlc3MuaW5jKDApCi0JCQkJcmVzMi5SZW1vdmVSZXNvdXJjZSgpCi0JCQlyZXMuQWRkUmVzb3VyY2UodHlwZSwgaWQsIG5hbWUpCi0JCQlyZXMuV3JpdGVSZXNvdXJjZSgpCi0JCQlhdHRycyA9IGF0dHJzIHwgcmVzLkdldFJlc0F0dHJzKCkKLQkJCXJlcy5TZXRSZXNBdHRycyhhdHRycykKLQkJCVJlcy5Vc2VSZXNGaWxlKGlucHV0KQotCXJldHVybiBhbGx0eXBlcywgY3RvcgorICAgICAgICAgICAgaWYgbGNuYW1lID09IE9XTkVSTkFNRSBhbmQgaWQgPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBza2lwb3duZXI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgU2tpcCB0aGlzIG9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGN0b3IgPSB0eXBlCisgICAgICAgICAgICBzaXplID0gcmVzLnNpemUKKyAgICAgICAgICAgIGF0dHJzID0gcmVzLkdldFJlc0F0dHJzKCkKKyAgICAgICAgICAgIGlmIHByb2dyZXNzOgorICAgICAgICAgICAgICAgIHByb2dyZXNzLmxhYmVsKCJDb3B5ICVzICVkICVzIiUodHlwZSwgaWQsIG5hbWUpKQorICAgICAgICAgICAgICAgIHByb2dyZXNzLmluYyhwcm9ncmVzc19jdXJfaW5jKQorICAgICAgICAgICAgcmVzLkxvYWRSZXNvdXJjZSgpCisgICAgICAgICAgICByZXMuRGV0YWNoUmVzb3VyY2UoKQorICAgICAgICAgICAgUmVzLlVzZVJlc0ZpbGUob3V0cHV0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlczIgPSBSZXMuR2V0MVJlc291cmNlKHR5cGUsIGlkKQorICAgICAgICAgICAgZXhjZXB0IE1hY09TLkVycm9yOgorICAgICAgICAgICAgICAgIHJlczIgPSBOb25lCisgICAgICAgICAgICBpZiByZXMyOgorICAgICAgICAgICAgICAgIGlmIHByb2dyZXNzOgorICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5sYWJlbCgiT3ZlcndyaXRlICVzICVkICVzIiUodHlwZSwgaWQsIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5pbmMoMCkKKyAgICAgICAgICAgICAgICByZXMyLlJlbW92ZVJlc291cmNlKCkKKyAgICAgICAgICAgIHJlcy5BZGRSZXNvdXJjZSh0eXBlLCBpZCwgbmFtZSkKKyAgICAgICAgICAgIHJlcy5Xcml0ZVJlc291cmNlKCkKKyAgICAgICAgICAgIGF0dHJzID0gYXR0cnMgfCByZXMuR2V0UmVzQXR0cnMoKQorICAgICAgICAgICAgcmVzLlNldFJlc0F0dHJzKGF0dHJzKQorICAgICAgICAgICAgUmVzLlVzZVJlc0ZpbGUoaW5wdXQpCisgICAgcmV0dXJuIGFsbHR5cGVzLCBjdG9yCiAKIGRlZiBjb3B5YXBwdHJlZShzcmN0cmVlLCBkc3R0cmVlLCBleGNlcHRsaXN0PVtdLCBwcm9ncmVzcz1Ob25lKToKLQluYW1lcyA9IFtdCi0JaWYgb3MucGF0aC5leGlzdHMoZHN0dHJlZSk6Ci0JCXNodXRpbC5ybXRyZWUoZHN0dHJlZSkKLQlvcy5ta2Rpcihkc3R0cmVlKQotCXRvZG8gPSBvcy5saXN0ZGlyKHNyY3RyZWUpCi0Jd2hpbGUgdG9kbzoKLQkJdGhpcywgdG9kbyA9IHRvZG9bMF0sIHRvZG9bMTpdCi0JCWlmIHRoaXMgaW4gZXhjZXB0bGlzdDoKLQkJCWNvbnRpbnVlCi0JCXRoaXNwYXRoID0gb3MucGF0aC5qb2luKHNyY3RyZWUsIHRoaXMpCi0JCWlmIG9zLnBhdGguaXNkaXIodGhpc3BhdGgpOgotCQkJdGhpc2NvbnRlbnQgPSBvcy5saXN0ZGlyKHRoaXNwYXRoKQotCQkJZm9yIHQgaW4gdGhpc2NvbnRlbnQ6Ci0JCQkJdG9kby5hcHBlbmQob3MucGF0aC5qb2luKHRoaXMsIHQpKQotCQluYW1lcy5hcHBlbmQodGhpcykKLQlmb3IgdGhpcyBpbiBuYW1lczoKLQkJc3JjcGF0aCA9IG9zLnBhdGguam9pbihzcmN0cmVlLCB0aGlzKQotCQlkc3RwYXRoID0gb3MucGF0aC5qb2luKGRzdHRyZWUsIHRoaXMpCi0JCWlmIG9zLnBhdGguaXNkaXIoc3JjcGF0aCk6Ci0JCQlvcy5ta2Rpcihkc3RwYXRoKQotCQllbGlmIG9zLnBhdGguaXNsaW5rKHNyY3BhdGgpOgotCQkJZW5kcG9pbnQgPSBvcy5yZWFkbGluayhzcmNwYXRoKQotCQkJb3Muc3ltbGluayhlbmRwb2ludCwgZHN0cGF0aCkKLQkJZWxzZToKLQkJCWlmIHByb2dyZXNzOgotCQkJCXByb2dyZXNzLmxhYmVsKCdDb3B5ICcrdGhpcykKLQkJCQlwcm9ncmVzcy5pbmMoMCkKLQkJCXNodXRpbC5jb3B5MihzcmNwYXRoLCBkc3RwYXRoKQotCQkJCisgICAgbmFtZXMgPSBbXQorICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdHRyZWUpOgorICAgICAgICBzaHV0aWwucm10cmVlKGRzdHRyZWUpCisgICAgb3MubWtkaXIoZHN0dHJlZSkKKyAgICB0b2RvID0gb3MubGlzdGRpcihzcmN0cmVlKQorICAgIHdoaWxlIHRvZG86CisgICAgICAgIHRoaXMsIHRvZG8gPSB0b2RvWzBdLCB0b2RvWzE6XQorICAgICAgICBpZiB0aGlzIGluIGV4Y2VwdGxpc3Q6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0aGlzcGF0aCA9IG9zLnBhdGguam9pbihzcmN0cmVlLCB0aGlzKQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHRoaXNwYXRoKToKKyAgICAgICAgICAgIHRoaXNjb250ZW50ID0gb3MubGlzdGRpcih0aGlzcGF0aCkKKyAgICAgICAgICAgIGZvciB0IGluIHRoaXNjb250ZW50OgorICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKG9zLnBhdGguam9pbih0aGlzLCB0KSkKKyAgICAgICAgbmFtZXMuYXBwZW5kKHRoaXMpCisgICAgZm9yIHRoaXMgaW4gbmFtZXM6CisgICAgICAgIHNyY3BhdGggPSBvcy5wYXRoLmpvaW4oc3JjdHJlZSwgdGhpcykKKyAgICAgICAgZHN0cGF0aCA9IG9zLnBhdGguam9pbihkc3R0cmVlLCB0aGlzKQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNyY3BhdGgpOgorICAgICAgICAgICAgb3MubWtkaXIoZHN0cGF0aCkKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzbGluayhzcmNwYXRoKToKKyAgICAgICAgICAgIGVuZHBvaW50ID0gb3MucmVhZGxpbmsoc3JjcGF0aCkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoZW5kcG9pbnQsIGRzdHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgICAgICAgICBwcm9ncmVzcy5sYWJlbCgnQ29weSAnK3RoaXMpCisgICAgICAgICAgICAgICAgcHJvZ3Jlc3MuaW5jKDApCisgICAgICAgICAgICBzaHV0aWwuY29weTIoc3JjcGF0aCwgZHN0cGF0aCkKKyAgICAgICAgICAgIAogZGVmIHdyaXRlcHljZmlsZShjb2Rlb2JqZWN0LCBjZmlsZSk6Ci0JaW1wb3J0IG1hcnNoYWwKLQlmYyA9IG9wZW4oY2ZpbGUsICd3YicpCi0JZmMud3JpdGUoJ1wwXDBcMFwwJykgIyBNQUdJQyBwbGFjZWhvbGRlciwgd3JpdHRlbiBsYXRlcgotCWZjLndyaXRlKCdcMFwwXDBcMCcpICMgVGltZXN0YXAgcGxhY2Vob2xkZXIsIG5vdCBuZWVkZWQKLQltYXJzaGFsLmR1bXAoY29kZW9iamVjdCwgZmMpCi0JZmMuZmx1c2goKQotCWZjLnNlZWsoMCwgMCkKLQlmYy53cml0ZShNQUdJQykKLQlmYy5jbG9zZSgpCisgICAgaW1wb3J0IG1hcnNoYWwKKyAgICBmYyA9IG9wZW4oY2ZpbGUsICd3YicpCisgICAgZmMud3JpdGUoJ1wwXDBcMFwwJykgIyBNQUdJQyBwbGFjZWhvbGRlciwgd3JpdHRlbiBsYXRlcgorICAgIGZjLndyaXRlKCdcMFwwXDBcMCcpICMgVGltZXN0YXAgcGxhY2Vob2xkZXIsIG5vdCBuZWVkZWQKKyAgICBtYXJzaGFsLmR1bXAoY29kZW9iamVjdCwgZmMpCisgICAgZmMuZmx1c2goKQorICAgIGZjLnNlZWsoMCwgMCkKKyAgICBmYy53cml0ZShNQUdJQykKKyAgICBmYy5jbG9zZSgpCiAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5IGIvTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxkZXIucHkKaW5kZXggMjhjY2JkNy4uMjZjMzg4NiAxMDA3NTUKLS0tIGEvTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxkZXIucHkKKysrIGIvTGliL3BsYXQtbWFjL2J1bmRsZWJ1aWxkZXIucHkKQEAgLTQyLDE3MyArNDIsMTczIEBACiAKIGNsYXNzIERlZmF1bHRzOgogCi0JIiIiQ2xhc3MgYXR0cmlidXRlcyB0aGF0IGRvbid0IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZSBhbmQgYXJlCi0Jbm90IGZ1bmN0aW9ucyBvciBjbGFzc21ldGhvZHMgYXJlIChkZWVwKWNvcGllZCB0byBzZWxmLl9fZGljdF9fLgotCVRoaXMgYWxsb3dzIGZvciBtdXRhYmxlIGRlZmF1bHQgdmFsdWVzLgotCSIiIgorICAgICIiIkNsYXNzIGF0dHJpYnV0ZXMgdGhhdCBkb24ndCBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUgYW5kIGFyZQorICAgIG5vdCBmdW5jdGlvbnMgb3IgY2xhc3NtZXRob2RzIGFyZSAoZGVlcCljb3BpZWQgdG8gc2VsZi5fX2RpY3RfXy4KKyAgICBUaGlzIGFsbG93cyBmb3IgbXV0YWJsZSBkZWZhdWx0IHZhbHVlcy4KKyAgICAiIiIKIAotCWRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6Ci0JCWRlZmF1bHRzID0gc2VsZi5fZ2V0RGVmYXVsdHMoKQotCQlkZWZhdWx0cy51cGRhdGUoa3dhcmdzKQotCQlzZWxmLl9fZGljdF9fLnVwZGF0ZShkZWZhdWx0cykKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBkZWZhdWx0cyA9IHNlbGYuX2dldERlZmF1bHRzKCkKKyAgICAgICAgZGVmYXVsdHMudXBkYXRlKGt3YXJncykKKyAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoZGVmYXVsdHMpCiAKLQlkZWYgX2dldERlZmF1bHRzKGNscyk6Ci0JCWRlZmF1bHRzID0ge30KLQkJZm9yIG5hbWUsIHZhbHVlIGluIGNscy5fX2RpY3RfXy5pdGVtcygpOgotCQkJaWYgbmFtZVswXSAhPSAiXyIgYW5kIG5vdCBpc2luc3RhbmNlKHZhbHVlLAotCQkJCQkoZnVuY3Rpb24sIGNsYXNzbWV0aG9kKSk6Ci0JCQkJZGVmYXVsdHNbbmFtZV0gPSBkZWVwY29weSh2YWx1ZSkKLQkJZm9yIGJhc2UgaW4gY2xzLl9fYmFzZXNfXzoKLQkJCWlmIGhhc2F0dHIoYmFzZSwgIl9nZXREZWZhdWx0cyIpOgotCQkJCWRlZmF1bHRzLnVwZGF0ZShiYXNlLl9nZXREZWZhdWx0cygpKQotCQlyZXR1cm4gZGVmYXVsdHMKLQlfZ2V0RGVmYXVsdHMgPSBjbGFzc21ldGhvZChfZ2V0RGVmYXVsdHMpCisgICAgZGVmIF9nZXREZWZhdWx0cyhjbHMpOgorICAgICAgICBkZWZhdWx0cyA9IHt9CisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBjbHMuX19kaWN0X18uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5hbWVbMF0gIT0gIl8iIGFuZCBub3QgaXNpbnN0YW5jZSh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uLCBjbGFzc21ldGhvZCkpOgorICAgICAgICAgICAgICAgIGRlZmF1bHRzW25hbWVdID0gZGVlcGNvcHkodmFsdWUpCisgICAgICAgIGZvciBiYXNlIGluIGNscy5fX2Jhc2VzX186CisgICAgICAgICAgICBpZiBoYXNhdHRyKGJhc2UsICJfZ2V0RGVmYXVsdHMiKToKKyAgICAgICAgICAgICAgICBkZWZhdWx0cy51cGRhdGUoYmFzZS5fZ2V0RGVmYXVsdHMoKSkKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRzCisgICAgX2dldERlZmF1bHRzID0gY2xhc3NtZXRob2QoX2dldERlZmF1bHRzKQogCiAKIGNsYXNzIEJ1bmRsZUJ1aWxkZXIoRGVmYXVsdHMpOgogCi0JIiIiQnVuZGxlQnVpbGRlciBpcyBhIGJhcmVib25lcyBjbGFzcyBmb3IgYXNzZW1ibGluZyBidW5kbGVzLiBJdAotCWtub3dzIG5vdGhpbmcgYWJvdXQgZXhlY3V0YWJsZXMgb3IgaWNvbnMsIGl0IG9ubHkgY29waWVzIGZpbGVzCi0JYW5kIGNyZWF0ZXMgdGhlIFBrZ0luZm8gYW5kIEluZm8ucGxpc3QgZmlsZXMuCi0JIiIiCisgICAgIiIiQnVuZGxlQnVpbGRlciBpcyBhIGJhcmVib25lcyBjbGFzcyBmb3IgYXNzZW1ibGluZyBidW5kbGVzLiBJdAorICAgIGtub3dzIG5vdGhpbmcgYWJvdXQgZXhlY3V0YWJsZXMgb3IgaWNvbnMsIGl0IG9ubHkgY29waWVzIGZpbGVzCisgICAgYW5kIGNyZWF0ZXMgdGhlIFBrZ0luZm8gYW5kIEluZm8ucGxpc3QgZmlsZXMuCisgICAgIiIiCiAKLQkjIChOb3RlIHRoYXQgRGVmYXVsdHMuX19pbml0X18gKGRlZXApY29waWVzIHRoZXNlIHZhbHVlcyB0bwotCSMgaW5zdGFuY2UgdmFyaWFibGVzLiBNdXRhYmxlIGRlZmF1bHRzIGFyZSB0aGVyZWZvcmUgc2FmZS4pCisgICAgIyAoTm90ZSB0aGF0IERlZmF1bHRzLl9faW5pdF9fIChkZWVwKWNvcGllcyB0aGVzZSB2YWx1ZXMgdG8KKyAgICAjIGluc3RhbmNlIHZhcmlhYmxlcy4gTXV0YWJsZSBkZWZhdWx0cyBhcmUgdGhlcmVmb3JlIHNhZmUuKQogCi0JIyBOYW1lIG9mIHRoZSBidW5kbGUsIHdpdGggb3Igd2l0aG91dCBleHRlbnNpb24uCi0JbmFtZSA9IE5vbmUKKyAgICAjIE5hbWUgb2YgdGhlIGJ1bmRsZSwgd2l0aCBvciB3aXRob3V0IGV4dGVuc2lvbi4KKyAgICBuYW1lID0gTm9uZQogCi0JIyBUaGUgcHJvcGVydHkgbGlzdCAoInBsaXN0IikKLQlwbGlzdCA9IFBsaXN0KENGQnVuZGxlRGV2ZWxvcG1lbnRSZWdpb24gPSAiRW5nbGlzaCIsCi0JICAgICAgICAgICAgICBDRkJ1bmRsZUluZm9EaWN0aW9uYXJ5VmVyc2lvbiA9ICI2LjAiKQorICAgICMgVGhlIHByb3BlcnR5IGxpc3QgKCJwbGlzdCIpCisgICAgcGxpc3QgPSBQbGlzdChDRkJ1bmRsZURldmVsb3BtZW50UmVnaW9uID0gIkVuZ2xpc2giLAorICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb24gPSAiNi4wIikKIAotCSMgVGhlIHR5cGUgb2YgdGhlIGJ1bmRsZS4KLQl0eXBlID0gIkJOREwiCi0JIyBUaGUgY3JlYXRvciBjb2RlIG9mIHRoZSBidW5kbGUuCi0JY3JlYXRvciA9IE5vbmUKKyAgICAjIFRoZSB0eXBlIG9mIHRoZSBidW5kbGUuCisgICAgdHlwZSA9ICJCTkRMIgorICAgICMgVGhlIGNyZWF0b3IgY29kZSBvZiB0aGUgYnVuZGxlLgorICAgIGNyZWF0b3IgPSBOb25lCiAKLQkjIExpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIHRvIGJlIGNvcGllZCB0byA8YnVuZGxlPi9Db250ZW50cy9SZXNvdXJjZXMuCi0JcmVzb3VyY2VzID0gW10KKyAgICAjIExpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIHRvIGJlIGNvcGllZCB0byA8YnVuZGxlPi9Db250ZW50cy9SZXNvdXJjZXMuCisgICAgcmVzb3VyY2VzID0gW10KIAotCSMgTGlzdCBvZiAoc3JjLCBkZXN0KSB0dXBsZXM7IGRlc3Qgc2hvdWxkIGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYnVuZGxlCi0JIyAoZWcuICJDb250ZW50cy9SZXNvdXJjZXMvTXlTdHVmZi9Tb21lRmlsZS5leHQpLgotCWZpbGVzID0gW10KKyAgICAjIExpc3Qgb2YgKHNyYywgZGVzdCkgdHVwbGVzOyBkZXN0IHNob3VsZCBiZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZQorICAgICMgKGVnLiAiQ29udGVudHMvUmVzb3VyY2VzL015U3R1ZmYvU29tZUZpbGUuZXh0KS4KKyAgICBmaWxlcyA9IFtdCiAKLQkjIExpc3Qgb2Ygc2hhcmVkIGxpYnJhcmllcyAoZHlsaWJzLCBGcmFtZXdvcmtzKSB0byBidW5kbGUgd2l0aCB0aGUgYXBwCi0JIyB3aWxsIGJlIHBsYWNlZCBpbiBDb250ZW50cy9GcmFtZXdvcmtzCi0JbGlicyA9IFtdCisgICAgIyBMaXN0IG9mIHNoYXJlZCBsaWJyYXJpZXMgKGR5bGlicywgRnJhbWV3b3JrcykgdG8gYnVuZGxlIHdpdGggdGhlIGFwcAorICAgICMgd2lsbCBiZSBwbGFjZWQgaW4gQ29udGVudHMvRnJhbWV3b3JrcworICAgIGxpYnMgPSBbXQogCi0JIyBEaXJlY3Rvcnkgd2hlcmUgdGhlIGJ1bmRsZSB3aWxsIGJlIGFzc2VtYmxlZC4KLQlidWlsZGRpciA9ICJidWlsZCIKKyAgICAjIERpcmVjdG9yeSB3aGVyZSB0aGUgYnVuZGxlIHdpbGwgYmUgYXNzZW1ibGVkLgorICAgIGJ1aWxkZGlyID0gImJ1aWxkIgogCi0JIyBNYWtlIHN5bWxpbmtzIGluc3RlYWQgY29weWluZyBmaWxlcy4gVGhpcyBpcyBoYW5keSBkdXJpbmcgZGVidWdnaW5nLCBidXQKLQkjIG1ha2VzIHRoZSBidW5kbGUgbm9uLWRpc3RyaWJ1dGFibGUuCi0Jc3ltbGluayA9IDAKKyAgICAjIE1ha2Ugc3ltbGlua3MgaW5zdGVhZCBjb3B5aW5nIGZpbGVzLiBUaGlzIGlzIGhhbmR5IGR1cmluZyBkZWJ1Z2dpbmcsIGJ1dAorICAgICMgbWFrZXMgdGhlIGJ1bmRsZSBub24tZGlzdHJpYnV0YWJsZS4KKyAgICBzeW1saW5rID0gMAogCi0JIyBWZXJib3NpdHkgbGV2ZWwuCi0JdmVyYm9zaXR5ID0gMQorICAgICMgVmVyYm9zaXR5IGxldmVsLgorICAgIHZlcmJvc2l0eSA9IDEKIAotCWRlZiBzZXR1cChzZWxmKToKLQkJIyBYWFggcmV0aGluayBzZWxmLm5hbWUgbXVuZ2luZywgdGhpcyBpcyBicml0dGxlLgotCQlzZWxmLm5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKQotCQlpZiBub3QgZXh0OgotCQkJZXh0ID0gIi5idW5kbGUiCi0JCWJ1bmRsZWV4dGVuc2lvbiA9IGV4dAotCQkjIG1pc2MgKGRlcml2ZWQpIGF0dHJpYnV0ZXMKLQkJc2VsZi5idW5kbGVwYXRoID0gcGF0aGpvaW4oc2VsZi5idWlsZGRpciwgc2VsZi5uYW1lICsgYnVuZGxlZXh0ZW5zaW9uKQorICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgIyBYWFggcmV0aGluayBzZWxmLm5hbWUgbXVuZ2luZywgdGhpcyBpcyBicml0dGxlLgorICAgICAgICBzZWxmLm5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKQorICAgICAgICBpZiBub3QgZXh0OgorICAgICAgICAgICAgZXh0ID0gIi5idW5kbGUiCisgICAgICAgIGJ1bmRsZWV4dGVuc2lvbiA9IGV4dAorICAgICAgICAjIG1pc2MgKGRlcml2ZWQpIGF0dHJpYnV0ZXMKKyAgICAgICAgc2VsZi5idW5kbGVwYXRoID0gcGF0aGpvaW4oc2VsZi5idWlsZGRpciwgc2VsZi5uYW1lICsgYnVuZGxlZXh0ZW5zaW9uKQogCi0JCXBsaXN0ID0gc2VsZi5wbGlzdAotCQlwbGlzdC5DRkJ1bmRsZU5hbWUgPSBzZWxmLm5hbWUKLQkJcGxpc3QuQ0ZCdW5kbGVQYWNrYWdlVHlwZSA9IHNlbGYudHlwZQotCQlpZiBzZWxmLmNyZWF0b3IgaXMgTm9uZToKLQkJCWlmIGhhc2F0dHIocGxpc3QsICJDRkJ1bmRsZVNpZ25hdHVyZSIpOgotCQkJCXNlbGYuY3JlYXRvciA9IHBsaXN0LkNGQnVuZGxlU2lnbmF0dXJlCi0JCQllbHNlOgotCQkJCXNlbGYuY3JlYXRvciA9ICI/Pz8/IgotCQlwbGlzdC5DRkJ1bmRsZVNpZ25hdHVyZSA9IHNlbGYuY3JlYXRvcgotCQlpZiBub3QgaGFzYXR0cihwbGlzdCwgIkNGQnVuZGxlSWRlbnRpZmllciIpOgotCQkJcGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyID0gc2VsZi5uYW1lCisgICAgICAgIHBsaXN0ID0gc2VsZi5wbGlzdAorICAgICAgICBwbGlzdC5DRkJ1bmRsZU5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgcGxpc3QuQ0ZCdW5kbGVQYWNrYWdlVHlwZSA9IHNlbGYudHlwZQorICAgICAgICBpZiBzZWxmLmNyZWF0b3IgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIocGxpc3QsICJDRkJ1bmRsZVNpZ25hdHVyZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRvciA9IHBsaXN0LkNGQnVuZGxlU2lnbmF0dXJlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRvciA9ICI/Pz8/IgorICAgICAgICBwbGlzdC5DRkJ1bmRsZVNpZ25hdHVyZSA9IHNlbGYuY3JlYXRvcgorICAgICAgICBpZiBub3QgaGFzYXR0cihwbGlzdCwgIkNGQnVuZGxlSWRlbnRpZmllciIpOgorICAgICAgICAgICAgcGxpc3QuQ0ZCdW5kbGVJZGVudGlmaWVyID0gc2VsZi5uYW1lCiAKLQlkZWYgYnVpbGQoc2VsZik6Ci0JCSIiIkJ1aWxkIHRoZSBidW5kbGUuIiIiCi0JCWJ1aWxkZGlyID0gc2VsZi5idWlsZGRpcgotCQlpZiBidWlsZGRpciBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGJ1aWxkZGlyKToKLQkJCW9zLm1rZGlyKGJ1aWxkZGlyKQotCQlzZWxmLm1lc3NhZ2UoIkJ1aWxkaW5nICVzIiAlIHJlcHIoc2VsZi5idW5kbGVwYXRoKSwgMSkKLQkJaWYgb3MucGF0aC5leGlzdHMoc2VsZi5idW5kbGVwYXRoKToKLQkJCXNodXRpbC5ybXRyZWUoc2VsZi5idW5kbGVwYXRoKQotCQlvcy5ta2RpcihzZWxmLmJ1bmRsZXBhdGgpCi0JCXNlbGYucHJlUHJvY2VzcygpCi0JCXNlbGYuX2NvcHlGaWxlcygpCi0JCXNlbGYuX2FkZE1ldGFGaWxlcygpCi0JCXNlbGYucG9zdFByb2Nlc3MoKQotCQlzZWxmLm1lc3NhZ2UoIkRvbmUuIiwgMSkKKyAgICBkZWYgYnVpbGQoc2VsZik6CisgICAgICAgICIiIkJ1aWxkIHRoZSBidW5kbGUuIiIiCisgICAgICAgIGJ1aWxkZGlyID0gc2VsZi5idWlsZGRpcgorICAgICAgICBpZiBidWlsZGRpciBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGJ1aWxkZGlyKToKKyAgICAgICAgICAgIG9zLm1rZGlyKGJ1aWxkZGlyKQorICAgICAgICBzZWxmLm1lc3NhZ2UoIkJ1aWxkaW5nICVzIiAlIHJlcHIoc2VsZi5idW5kbGVwYXRoKSwgMSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5idW5kbGVwYXRoKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5idW5kbGVwYXRoKQorICAgICAgICBvcy5ta2RpcihzZWxmLmJ1bmRsZXBhdGgpCisgICAgICAgIHNlbGYucHJlUHJvY2VzcygpCisgICAgICAgIHNlbGYuX2NvcHlGaWxlcygpCisgICAgICAgIHNlbGYuX2FkZE1ldGFGaWxlcygpCisgICAgICAgIHNlbGYucG9zdFByb2Nlc3MoKQorICAgICAgICBzZWxmLm1lc3NhZ2UoIkRvbmUuIiwgMSkKIAotCWRlZiBwcmVQcm9jZXNzKHNlbGYpOgotCQkiIiJIb29rIGZvciBzdWJjbGFzc2VzLiIiIgotCQlwYXNzCi0JZGVmIHBvc3RQcm9jZXNzKHNlbGYpOgotCQkiIiJIb29rIGZvciBzdWJjbGFzc2VzLiIiIgotCQlwYXNzCisgICAgZGVmIHByZVByb2Nlc3Moc2VsZik6CisgICAgICAgICIiIkhvb2sgZm9yIHN1YmNsYXNzZXMuIiIiCisgICAgICAgIHBhc3MKKyAgICBkZWYgcG9zdFByb2Nlc3Moc2VsZik6CisgICAgICAgICIiIkhvb2sgZm9yIHN1YmNsYXNzZXMuIiIiCisgICAgICAgIHBhc3MKIAotCWRlZiBfYWRkTWV0YUZpbGVzKHNlbGYpOgotCQljb250ZW50cyA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgIkNvbnRlbnRzIikKLQkJbWFrZWRpcnMoY29udGVudHMpCi0JCSMKLQkJIyBXcml0ZSBDb250ZW50cy9Qa2dJbmZvCi0JCWFzc2VydCBsZW4oc2VsZi50eXBlKSA9PSBsZW4oc2VsZi5jcmVhdG9yKSA9PSA0LCBcCi0JCQkJInR5cGUgYW5kIGNyZWF0b3IgbXVzdCBiZSA0LWJ5dGUgc3RyaW5ncy4iCi0JCXBrZ2luZm8gPSBwYXRoam9pbihjb250ZW50cywgIlBrZ0luZm8iKQotCQlmID0gb3Blbihwa2dpbmZvLCAid2IiKQotCQlmLndyaXRlKHNlbGYudHlwZSArIHNlbGYuY3JlYXRvcikKLQkJZi5jbG9zZSgpCi0JCSMKLQkJIyBXcml0ZSBDb250ZW50cy9JbmZvLnBsaXN0Ci0JCWluZm9wbGlzdCA9IHBhdGhqb2luKGNvbnRlbnRzLCAiSW5mby5wbGlzdCIpCi0JCXNlbGYucGxpc3Qud3JpdGUoaW5mb3BsaXN0KQorICAgIGRlZiBfYWRkTWV0YUZpbGVzKHNlbGYpOgorICAgICAgICBjb250ZW50cyA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgIkNvbnRlbnRzIikKKyAgICAgICAgbWFrZWRpcnMoY29udGVudHMpCisgICAgICAgICMKKyAgICAgICAgIyBXcml0ZSBDb250ZW50cy9Qa2dJbmZvCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi50eXBlKSA9PSBsZW4oc2VsZi5jcmVhdG9yKSA9PSA0LCBcCisgICAgICAgICAgICAgICAgInR5cGUgYW5kIGNyZWF0b3IgbXVzdCBiZSA0LWJ5dGUgc3RyaW5ncy4iCisgICAgICAgIHBrZ2luZm8gPSBwYXRoam9pbihjb250ZW50cywgIlBrZ0luZm8iKQorICAgICAgICBmID0gb3Blbihwa2dpbmZvLCAid2IiKQorICAgICAgICBmLndyaXRlKHNlbGYudHlwZSArIHNlbGYuY3JlYXRvcikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMKKyAgICAgICAgIyBXcml0ZSBDb250ZW50cy9JbmZvLnBsaXN0CisgICAgICAgIGluZm9wbGlzdCA9IHBhdGhqb2luKGNvbnRlbnRzLCAiSW5mby5wbGlzdCIpCisgICAgICAgIHNlbGYucGxpc3Qud3JpdGUoaW5mb3BsaXN0KQogCi0JZGVmIF9jb3B5RmlsZXMoc2VsZik6Ci0JCWZpbGVzID0gc2VsZi5maWxlc1s6XQotCQlmb3IgcGF0aCBpbiBzZWxmLnJlc291cmNlczoKLQkJCWZpbGVzLmFwcGVuZCgocGF0aCwgcGF0aGpvaW4oIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsCi0JCQkJb3MucGF0aC5iYXNlbmFtZShwYXRoKSkpKQotCQlmb3IgcGF0aCBpbiBzZWxmLmxpYnM6Ci0JCQlmaWxlcy5hcHBlbmQoKHBhdGgsIHBhdGhqb2luKCJDb250ZW50cyIsICJGcmFtZXdvcmtzIiwKLQkJCQlvcy5wYXRoLmJhc2VuYW1lKHBhdGgpKSkpCi0JCWlmIHNlbGYuc3ltbGluazoKLQkJCXNlbGYubWVzc2FnZSgiTWFraW5nIHN5bWJvbGljIGxpbmtzIiwgMSkKLQkJCW1zZyA9ICJNYWtpbmcgc3ltbGluayBmcm9tIgotCQllbHNlOgotCQkJc2VsZi5tZXNzYWdlKCJDb3B5aW5nIGZpbGVzIiwgMSkKLQkJCW1zZyA9ICJDb3B5aW5nIgotCQlmaWxlcy5zb3J0KCkKLQkJZm9yIHNyYywgZHN0IGluIGZpbGVzOgotCQkJaWYgb3MucGF0aC5pc2RpcihzcmMpOgotCQkJCXNlbGYubWVzc2FnZSgiJXMgJXMvIHRvICVzLyIgJSAobXNnLCBzcmMsIGRzdCksIDIpCi0JCQllbHNlOgotCQkJCXNlbGYubWVzc2FnZSgiJXMgJXMgdG8gJXMiICUgKG1zZywgc3JjLCBkc3QpLCAyKQotCQkJZHN0ID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCBkc3QpCi0JCQlpZiBzZWxmLnN5bWxpbms6Ci0JCQkJc3ltbGluayhzcmMsIGRzdCwgbWtkaXJzPTEpCi0JCQllbHNlOgotCQkJCWNvcHkoc3JjLCBkc3QsIG1rZGlycz0xKQorICAgIGRlZiBfY29weUZpbGVzKHNlbGYpOgorICAgICAgICBmaWxlcyA9IHNlbGYuZmlsZXNbOl0KKyAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5yZXNvdXJjZXM6CisgICAgICAgICAgICBmaWxlcy5hcHBlbmQoKHBhdGgsIHBhdGhqb2luKCJDb250ZW50cyIsICJSZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUocGF0aCkpKSkKKyAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5saWJzOgorICAgICAgICAgICAgZmlsZXMuYXBwZW5kKChwYXRoLCBwYXRoam9pbigiQ29udGVudHMiLCAiRnJhbWV3b3JrcyIsCisgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShwYXRoKSkpKQorICAgICAgICBpZiBzZWxmLnN5bWxpbms6CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIk1ha2luZyBzeW1ib2xpYyBsaW5rcyIsIDEpCisgICAgICAgICAgICBtc2cgPSAiTWFraW5nIHN5bWxpbmsgZnJvbSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiQ29weWluZyBmaWxlcyIsIDEpCisgICAgICAgICAgICBtc2cgPSAiQ29weWluZyIKKyAgICAgICAgZmlsZXMuc29ydCgpCisgICAgICAgIGZvciBzcmMsIGRzdCBpbiBmaWxlczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc3JjKToKKyAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIiVzICVzLyB0byAlcy8iICUgKG1zZywgc3JjLCBkc3QpLCAyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIiVzICVzIHRvICVzIiAlIChtc2csIHNyYywgZHN0KSwgMikKKyAgICAgICAgICAgIGRzdCA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgZHN0KQorICAgICAgICAgICAgaWYgc2VsZi5zeW1saW5rOgorICAgICAgICAgICAgICAgIHN5bWxpbmsoc3JjLCBkc3QsIG1rZGlycz0xKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb3B5KHNyYywgZHN0LCBta2RpcnM9MSkKIAotCWRlZiBtZXNzYWdlKHNlbGYsIG1zZywgbGV2ZWw9MCk6Ci0JCWlmIGxldmVsIDw9IHNlbGYudmVyYm9zaXR5OgotCQkJaW5kZW50ID0gIiIKLQkJCWlmIGxldmVsID4gMToKLQkJCQlpbmRlbnQgPSAobGV2ZWwgLSAxKSAqICIgICIKLQkJCXN5cy5zdGRlcnIud3JpdGUoaW5kZW50ICsgbXNnICsgIlxuIikKKyAgICBkZWYgbWVzc2FnZShzZWxmLCBtc2csIGxldmVsPTApOgorICAgICAgICBpZiBsZXZlbCA8PSBzZWxmLnZlcmJvc2l0eToKKyAgICAgICAgICAgIGluZGVudCA9ICIiCisgICAgICAgICAgICBpZiBsZXZlbCA+IDE6CisgICAgICAgICAgICAgICAgaW5kZW50ID0gKGxldmVsIC0gMSkgKiAiICAiCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGluZGVudCArIG1zZyArICJcbiIpCiAKLQlkZWYgcmVwb3J0KHNlbGYpOgotCQkjIFhYWCBzb21ldGhpbmcgZGVjZW50Ci0JCXBhc3MKKyAgICBkZWYgcmVwb3J0KHNlbGYpOgorICAgICAgICAjIFhYWCBzb21ldGhpbmcgZGVjZW50CisgICAgICAgIHBhc3MKIAogCiBpZiBfX2RlYnVnX186Ci0JUFlDX0VYVCA9ICIucHljIgorICAgIFBZQ19FWFQgPSAiLnB5YyIKIGVsc2U6Ci0JUFlDX0VYVCA9ICIucHlvIgorICAgIFBZQ19FWFQgPSAiLnB5byIKIAogTUFHSUMgPSBpbXAuZ2V0X21hZ2ljKCkKIFVTRV9aSVBJTVBPUlQgPSAiemlwaW1wb3J0IiBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMKQEAgLTIyMSwxMyArMjIxLDEzIEBACiAiIiIKIAogaWYgVVNFX1pJUElNUE9SVDoKLQlaSVBfQVJDSElWRSA9ICJNb2R1bGVzLnppcCIKLQlTSVRFX1BZICs9ICJzeXMucGF0aC5hcHBlbmQoc3lzLnBhdGhbMF0gKyAnLyVzJylcbiIgJSBaSVBfQVJDSElWRQotCWRlZiBnZXRQeWNEYXRhKGZ1bGxuYW1lLCBjb2RlLCBpc3BrZyk6Ci0JCWlmIGlzcGtnOgotCQkJZnVsbG5hbWUgKz0gIi5fX2luaXRfXyIKLQkJcGF0aCA9IGZ1bGxuYW1lLnJlcGxhY2UoIi4iLCBvcy5zZXApICsgUFlDX0VYVAotCQlyZXR1cm4gcGF0aCwgTUFHSUMgKyAnXDBcMFwwXDAnICsgbWFyc2hhbC5kdW1wcyhjb2RlKQorICAgIFpJUF9BUkNISVZFID0gIk1vZHVsZXMuemlwIgorICAgIFNJVEVfUFkgKz0gInN5cy5wYXRoLmFwcGVuZChzeXMucGF0aFswXSArICcvJXMnKVxuIiAlIFpJUF9BUkNISVZFCisgICAgZGVmIGdldFB5Y0RhdGEoZnVsbG5hbWUsIGNvZGUsIGlzcGtnKToKKyAgICAgICAgaWYgaXNwa2c6CisgICAgICAgICAgICBmdWxsbmFtZSArPSAiLl9faW5pdF9fIgorICAgICAgICBwYXRoID0gZnVsbG5hbWUucmVwbGFjZSgiLiIsIG9zLnNlcCkgKyBQWUNfRVhUCisgICAgICAgIHJldHVybiBwYXRoLCBNQUdJQyArICdcMFwwXDBcMCcgKyBtYXJzaGFsLmR1bXBzKGNvZGUpCiAKIFNJVEVfQ08gPSBjb21waWxlKFNJVEVfUFksICI8LWJ1bmRsZWJ1aWxkZXIucHktPiIsICJleGVjIikKIApAQCAtMjM3LDIyICsyMzcsMjIgQEAKICMKIEVYVF9MT0FERVIgPSAiIiJcCiBkZWYgX19sb2FkKCk6Ci0JaW1wb3J0IGltcCwgc3lzLCBvcwotCWZvciBwIGluIHN5cy5wYXRoOgotCQlwYXRoID0gb3MucGF0aC5qb2luKHAsICIlKGZpbGVuYW1lKXMiKQotCQlpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLQkJCWJyZWFrCi0JZWxzZToKLQkJYXNzZXJ0IDAsICJmaWxlIG5vdCBmb3VuZDogJShmaWxlbmFtZSlzIgotCW1vZCA9IGltcC5sb2FkX2R5bmFtaWMoIiUobmFtZSlzIiwgcGF0aCkKKyAgICBpbXBvcnQgaW1wLCBzeXMsIG9zCisgICAgZm9yIHAgaW4gc3lzLnBhdGg6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocCwgIiUoZmlsZW5hbWUpcyIpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgMCwgImZpbGUgbm90IGZvdW5kOiAlKGZpbGVuYW1lKXMiCisgICAgbW9kID0gaW1wLmxvYWRfZHluYW1pYygiJShuYW1lKXMiLCBwYXRoKQogCiBfX2xvYWQoKQogZGVsIF9fbG9hZAogIiIiCiAKIE1BWU1JU1NfTU9EVUxFUyA9IFsnbWFjJywgJ29zMicsICdudCcsICdudHBhdGgnLCAnZG9zJywgJ2Rvc3BhdGgnLAotCSd3aW4zMmFwaScsICdjZScsICdfd2lucmVnJywgJ250dXJsMnBhdGgnLCAnc2l0ZWN1c3RvbWl6ZScsCi0JJ29yZy5weXRob24uY29yZScsICdyaXNjb3MnLCAncmlzY29zZW52aXJvbicsICdyaXNjb3NwYXRoJworICAgICd3aW4zMmFwaScsICdjZScsICdfd2lucmVnJywgJ250dXJsMnBhdGgnLCAnc2l0ZWN1c3RvbWl6ZScsCisgICAgJ29yZy5weXRob24uY29yZScsICdyaXNjb3MnLCAncmlzY29zZW52aXJvbicsICdyaXNjb3NwYXRoJwogXQogCiBTVFJJUF9FWEVDID0gIi91c3IvYmluL3N0cmlwIgpAQCAtMjgxLDcgKzI4MSw3IEBACiBzeXMuYXJndi5pbnNlcnQoMSwgbWFpbnByb2dyYW0pCiBvcy5lbnZpcm9uWyJQWVRIT05QQVRIIl0gPSByZXNkaXIKIGlmICUoc3RhbmRhbG9uZSlzOgotCW9zLmVudmlyb25bIlBZVEhPTkhPTUUiXSA9IHJlc2RpcgorICAgIG9zLmVudmlyb25bIlBZVEhPTkhPTUUiXSA9IHJlc2Rpcgogb3MuZW52aXJvblsiUFlUSE9ORVhFQ1VUQUJMRSJdID0gZXhlY3V0YWJsZQogb3MuZW52aXJvblsiRFlMRF9MSUJSQVJZX1BBVEgiXSA9IGxpYmRpcgogb3MuZXhlY3ZlKGV4ZWN1dGFibGUsIHN5cy5hcmd2LCBvcy5lbnZpcm9uKQpAQCAtMzAxLDMxMiArMzAxLDMxMiBAQAogCiBjbGFzcyBBcHBCdWlsZGVyKEJ1bmRsZUJ1aWxkZXIpOgogCi0JIyBPdmVycmlkZSB0eXBlIG9mIHRoZSBidW5kbGUuCi0JdHlwZSA9ICJBUFBMIgorICAgICMgT3ZlcnJpZGUgdHlwZSBvZiB0aGUgYnVuZGxlLgorICAgIHR5cGUgPSAiQVBQTCIKIAotCSMgcGxhdGZvcm0sIG5hbWUgb2YgdGhlIHN1YmZvbGRlciBvZiBDb250ZW50cyB0aGF0IGNvbnRhaW5zIHRoZSBleGVjdXRhYmxlLgotCXBsYXRmb3JtID0gIk1hY09TIgorICAgICMgcGxhdGZvcm0sIG5hbWUgb2YgdGhlIHN1YmZvbGRlciBvZiBDb250ZW50cyB0aGF0IGNvbnRhaW5zIHRoZSBleGVjdXRhYmxlLgorICAgIHBsYXRmb3JtID0gIk1hY09TIgogCi0JIyBBIFB5dGhvbiBtYWluIHByb2dyYW0uIElmIHRoaXMgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBtYWluCi0JIyBleGVjdXRhYmxlIGluIHRoZSBidW5kbGUgd2lsbCBiZSBhIHNtYWxsIHdyYXBwZXIgdGhhdCBpbnZva2VzCi0JIyB0aGUgbWFpbiBwcm9ncmFtLiAoWFhYIERpc2N1c3Mgd2h5LikKLQltYWlucHJvZ3JhbSA9IE5vbmUKKyAgICAjIEEgUHl0aG9uIG1haW4gcHJvZ3JhbS4gSWYgdGhpcyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIG1haW4KKyAgICAjIGV4ZWN1dGFibGUgaW4gdGhlIGJ1bmRsZSB3aWxsIGJlIGEgc21hbGwgd3JhcHBlciB0aGF0IGludm9rZXMKKyAgICAjIHRoZSBtYWluIHByb2dyYW0uIChYWFggRGlzY3VzcyB3aHkuKQorICAgIG1haW5wcm9ncmFtID0gTm9uZQogCi0JIyBUaGUgbWFpbiBleGVjdXRhYmxlLiBJZiBhIFB5dGhvbiBtYWluIHByb2dyYW0gaXMgc3BlY2lmaWVkCi0JIyB0aGUgZXhlY3V0YWJsZSB3aWxsIGJlIGNvcGllZCB0byBSZXNvdXJjZXMgYW5kIGJlIGludm9rZWQKLQkjIGJ5IHRoZSB3cmFwcGVyIHByb2dyYW0gbWVudGlvbmVkIGFib3ZlLiBPdGhlcndpc2UgaXQgd2lsbAotCSMgc2ltcGx5IGJlIHVzZWQgYXMgdGhlIG1haW4gZXhlY3V0YWJsZS4KLQlleGVjdXRhYmxlID0gTm9uZQorICAgICMgVGhlIG1haW4gZXhlY3V0YWJsZS4gSWYgYSBQeXRob24gbWFpbiBwcm9ncmFtIGlzIHNwZWNpZmllZAorICAgICMgdGhlIGV4ZWN1dGFibGUgd2lsbCBiZSBjb3BpZWQgdG8gUmVzb3VyY2VzIGFuZCBiZSBpbnZva2VkCisgICAgIyBieSB0aGUgd3JhcHBlciBwcm9ncmFtIG1lbnRpb25lZCBhYm92ZS4gT3RoZXJ3aXNlIGl0IHdpbGwKKyAgICAjIHNpbXBseSBiZSB1c2VkIGFzIHRoZSBtYWluIGV4ZWN1dGFibGUuCisgICAgZXhlY3V0YWJsZSA9IE5vbmUKIAotCSMgVGhlIG5hbWUgb2YgdGhlIG1haW4gbmliLCBmb3IgQ29jb2EgYXBwcy4gKk11c3QqIGJlIHNwZWNpZmllZAotCSMgd2hlbiBidWlsZGluZyBhIENvY29hIGFwcC4KLQluaWJuYW1lID0gTm9uZQorICAgICMgVGhlIG5hbWUgb2YgdGhlIG1haW4gbmliLCBmb3IgQ29jb2EgYXBwcy4gKk11c3QqIGJlIHNwZWNpZmllZAorICAgICMgd2hlbiBidWlsZGluZyBhIENvY29hIGFwcC4KKyAgICBuaWJuYW1lID0gTm9uZQogCi0JIyBUaGUgbmFtZSBvZiB0aGUgaWNvbiBmaWxlIHRvIGJlIGNvcGllZCB0byBSZXNvdXJjZXMgYW5kIHVzZWQgZm9yCi0JIyB0aGUgRmluZGVyIGljb24uCi0JaWNvbmZpbGUgPSBOb25lCisgICAgIyBUaGUgbmFtZSBvZiB0aGUgaWNvbiBmaWxlIHRvIGJlIGNvcGllZCB0byBSZXNvdXJjZXMgYW5kIHVzZWQgZm9yCisgICAgIyB0aGUgRmluZGVyIGljb24uCisgICAgaWNvbmZpbGUgPSBOb25lCiAKLQkjIFN5bWxpbmsgdGhlIGV4ZWN1dGFibGUgaW5zdGVhZCBvZiBjb3B5aW5nIGl0LgotCXN5bWxpbmtfZXhlYyA9IDAKKyAgICAjIFN5bWxpbmsgdGhlIGV4ZWN1dGFibGUgaW5zdGVhZCBvZiBjb3B5aW5nIGl0LgorICAgIHN5bWxpbmtfZXhlYyA9IDAKIAotCSMgSWYgVHJ1ZSwgYnVpbGQgc3RhbmRhbG9uZSBhcHAuCi0Jc3RhbmRhbG9uZSA9IDAKLQkKLQkjIElmIFRydWUsIGFkZCBhIHJlYWwgbWFpbiBwcm9ncmFtIHRoYXQgZW11bGF0ZXMgc3lzLmFyZ3YgYmVmb3JlIGNhbGxpbmcKLQkjIG1haW5wcm9ncmFtCi0JYXJndl9lbXVsYXRpb24gPSAwCisgICAgIyBJZiBUcnVlLCBidWlsZCBzdGFuZGFsb25lIGFwcC4KKyAgICBzdGFuZGFsb25lID0gMAorICAgIAorICAgICMgSWYgVHJ1ZSwgYWRkIGEgcmVhbCBtYWluIHByb2dyYW0gdGhhdCBlbXVsYXRlcyBzeXMuYXJndiBiZWZvcmUgY2FsbGluZworICAgICMgbWFpbnByb2dyYW0KKyAgICBhcmd2X2VtdWxhdGlvbiA9IDAKIAotCSMgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBvbmx5IHVzZWQgd2hlbiBidWlsZGluZyBhIHN0YW5kYWxvbmUgYXBwLgorICAgICMgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBvbmx5IHVzZWQgd2hlbiBidWlsZGluZyBhIHN0YW5kYWxvbmUgYXBwLgogCi0JIyBFeGNsdWRlIHRoZXNlIG1vZHVsZXMuCi0JZXhjbHVkZU1vZHVsZXMgPSBbXQorICAgICMgRXhjbHVkZSB0aGVzZSBtb2R1bGVzLgorICAgIGV4Y2x1ZGVNb2R1bGVzID0gW10KIAotCSMgSW5jbHVkZSB0aGVzZSBtb2R1bGVzLgotCWluY2x1ZGVNb2R1bGVzID0gW10KKyAgICAjIEluY2x1ZGUgdGhlc2UgbW9kdWxlcy4KKyAgICBpbmNsdWRlTW9kdWxlcyA9IFtdCiAKLQkjIEluY2x1ZGUgdGhlc2UgcGFja2FnZXMuCi0JaW5jbHVkZVBhY2thZ2VzID0gW10KKyAgICAjIEluY2x1ZGUgdGhlc2UgcGFja2FnZXMuCisgICAgaW5jbHVkZVBhY2thZ2VzID0gW10KIAotCSMgU3RyaXAgYmluYXJpZXMuCi0Jc3RyaXAgPSAwCisgICAgIyBTdHJpcCBiaW5hcmllcy4KKyAgICBzdHJpcCA9IDAKIAotCSMgRm91bmQgUHl0aG9uIG1vZHVsZXM6IFsobmFtZSwgY29kZW9iamVjdCwgaXNwa2cpLCAuLi5dCi0JcHltb2R1bGVzID0gW10KKyAgICAjIEZvdW5kIFB5dGhvbiBtb2R1bGVzOiBbKG5hbWUsIGNvZGVvYmplY3QsIGlzcGtnKSwgLi4uXQorICAgIHB5bW9kdWxlcyA9IFtdCiAKLQkjIE1vZHVsZXMgdGhhdCBtb2R1bGVmaW5kZXIgY291bGRuJ3QgZmluZDoKLQltaXNzaW5nTW9kdWxlcyA9IFtdCi0JbWF5YmVNaXNzaW5nTW9kdWxlcyA9IFtdCisgICAgIyBNb2R1bGVzIHRoYXQgbW9kdWxlZmluZGVyIGNvdWxkbid0IGZpbmQ6CisgICAgbWlzc2luZ01vZHVsZXMgPSBbXQorICAgIG1heWJlTWlzc2luZ01vZHVsZXMgPSBbXQogCi0JIyBMaXN0IG9mIGFsbCBiaW5hcmllcyAoZXhlY3V0YWJsZXMgb3Igc2hhcmVkIGxpYnMpLCBmb3Igc3RyaXBwaW5nIHB1cnBvc2VzCi0JYmluYXJpZXMgPSBbXQorICAgICMgTGlzdCBvZiBhbGwgYmluYXJpZXMgKGV4ZWN1dGFibGVzIG9yIHNoYXJlZCBsaWJzKSwgZm9yIHN0cmlwcGluZyBwdXJwb3NlcworICAgIGJpbmFyaWVzID0gW10KIAotCWRlZiBzZXR1cChzZWxmKToKLQkJaWYgc2VsZi5zdGFuZGFsb25lIGFuZCBzZWxmLm1haW5wcm9ncmFtIGlzIE5vbmU6Ci0JCQlyYWlzZSBCdW5kbGVCdWlsZGVyRXJyb3IsICgibXVzdCBzcGVjaWZ5ICdtYWlucHJvZ3JhbScgd2hlbiAiCi0JCQkJCSJidWlsZGluZyBhIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIikKLQkJaWYgc2VsZi5tYWlucHJvZ3JhbSBpcyBOb25lIGFuZCBzZWxmLmV4ZWN1dGFibGUgaXMgTm9uZToKLQkJCXJhaXNlIEJ1bmRsZUJ1aWxkZXJFcnJvciwgKCJtdXN0IHNwZWNpZnkgZWl0aGVyIG9yIGJvdGggb2YgIgotCQkJCQkiJ2V4ZWN1dGFibGUnIGFuZCAnbWFpbnByb2dyYW0nIikKKyAgICBkZWYgc2V0dXAoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhbmRhbG9uZSBhbmQgc2VsZi5tYWlucHJvZ3JhbSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgQnVuZGxlQnVpbGRlckVycm9yLCAoIm11c3Qgc3BlY2lmeSAnbWFpbnByb2dyYW0nIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAiYnVpbGRpbmcgYSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uLiIpCisgICAgICAgIGlmIHNlbGYubWFpbnByb2dyYW0gaXMgTm9uZSBhbmQgc2VsZi5leGVjdXRhYmxlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBCdW5kbGVCdWlsZGVyRXJyb3IsICgibXVzdCBzcGVjaWZ5IGVpdGhlciBvciBib3RoIG9mICIKKyAgICAgICAgICAgICAgICAgICAgIidleGVjdXRhYmxlJyBhbmQgJ21haW5wcm9ncmFtJyIpCiAKLQkJc2VsZi5leGVjZGlyID0gcGF0aGpvaW4oIkNvbnRlbnRzIiwgc2VsZi5wbGF0Zm9ybSkKKyAgICAgICAgc2VsZi5leGVjZGlyID0gcGF0aGpvaW4oIkNvbnRlbnRzIiwgc2VsZi5wbGF0Zm9ybSkKIAotCQlpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmU6Ci0JCQlwYXNzCi0JCWVsaWYgc2VsZi5tYWlucHJvZ3JhbSBpcyBub3QgTm9uZToKLQkJCXNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShzZWxmLm1haW5wcm9ncmFtKSlbMF0KLQkJZWxpZiBleGVjdXRhYmxlIGlzIG5vdCBOb25lOgotCQkJc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZXhlY3V0YWJsZSkpWzBdCi0JCWlmIHNlbGYubmFtZVstNDpdICE9ICIuYXBwIjoKLQkJCXNlbGYubmFtZSArPSAiLmFwcCIKKyAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIHNlbGYubWFpbnByb2dyYW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoc2VsZi5tYWlucHJvZ3JhbSkpWzBdCisgICAgICAgIGVsaWYgZXhlY3V0YWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShzZWxmLmV4ZWN1dGFibGUpKVswXQorICAgICAgICBpZiBzZWxmLm5hbWVbLTQ6XSAhPSAiLmFwcCI6CisgICAgICAgICAgICBzZWxmLm5hbWUgKz0gIi5hcHAiCiAKLQkJaWYgc2VsZi5leGVjdXRhYmxlIGlzIE5vbmU6Ci0JCQlpZiBub3Qgc2VsZi5zdGFuZGFsb25lOgotCQkJCXNlbGYuc3ltbGlua19leGVjID0gMQotCQkJc2VsZi5leGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgaWYgc2VsZi5leGVjdXRhYmxlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zdGFuZGFsb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc3ltbGlua19leGVjID0gMQorICAgICAgICAgICAgc2VsZi5leGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUKIAotCQlpZiBzZWxmLm5pYm5hbWU6Ci0JCQlzZWxmLnBsaXN0Lk5TTWFpbk5pYkZpbGUgPSBzZWxmLm5pYm5hbWUKLQkJCWlmIG5vdCBoYXNhdHRyKHNlbGYucGxpc3QsICJOU1ByaW5jaXBhbENsYXNzIik6Ci0JCQkJc2VsZi5wbGlzdC5OU1ByaW5jaXBhbENsYXNzID0gIk5TQXBwbGljYXRpb24iCisgICAgICAgIGlmIHNlbGYubmlibmFtZToKKyAgICAgICAgICAgIHNlbGYucGxpc3QuTlNNYWluTmliRmlsZSA9IHNlbGYubmlibmFtZQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5wbGlzdCwgIk5TUHJpbmNpcGFsQ2xhc3MiKToKKyAgICAgICAgICAgICAgICBzZWxmLnBsaXN0Lk5TUHJpbmNpcGFsQ2xhc3MgPSAiTlNBcHBsaWNhdGlvbiIKIAotCQlCdW5kbGVCdWlsZGVyLnNldHVwKHNlbGYpCisgICAgICAgIEJ1bmRsZUJ1aWxkZXIuc2V0dXAoc2VsZikKIAotCQlzZWxmLnBsaXN0LkNGQnVuZGxlRXhlY3V0YWJsZSA9IHNlbGYubmFtZQorICAgICAgICBzZWxmLnBsaXN0LkNGQnVuZGxlRXhlY3V0YWJsZSA9IHNlbGYubmFtZQogCi0JCWlmIHNlbGYuc3RhbmRhbG9uZToKLQkJCXNlbGYuZmluZERlcGVuZGVuY2llcygpCisgICAgICAgIGlmIHNlbGYuc3RhbmRhbG9uZToKKyAgICAgICAgICAgIHNlbGYuZmluZERlcGVuZGVuY2llcygpCiAKLQlkZWYgcHJlUHJvY2VzcyhzZWxmKToKLQkJcmVzZGlyID0gIkNvbnRlbnRzL1Jlc291cmNlcyIKLQkJaWYgc2VsZi5leGVjdXRhYmxlIGlzIG5vdCBOb25lOgotCQkJaWYgc2VsZi5tYWlucHJvZ3JhbSBpcyBOb25lOgotCQkJCWV4ZWNuYW1lID0gc2VsZi5uYW1lCi0JCQllbHNlOgotCQkJCWV4ZWNuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmV4ZWN1dGFibGUpCi0JCQlleGVjcGF0aCA9IHBhdGhqb2luKHNlbGYuZXhlY2RpciwgZXhlY25hbWUpCi0JCQlpZiBub3Qgc2VsZi5zeW1saW5rX2V4ZWM6Ci0JCQkJc2VsZi5maWxlcy5hcHBlbmQoKHNlbGYuZXhlY3V0YWJsZSwgZXhlY3BhdGgpKQotCQkJCXNlbGYuYmluYXJpZXMuYXBwZW5kKGV4ZWNwYXRoKQotCQkJc2VsZi5leGVjcGF0aCA9IGV4ZWNwYXRoCisgICAgZGVmIHByZVByb2Nlc3Moc2VsZik6CisgICAgICAgIHJlc2RpciA9ICJDb250ZW50cy9SZXNvdXJjZXMiCisgICAgICAgIGlmIHNlbGYuZXhlY3V0YWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYubWFpbnByb2dyYW0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBleGVjbmFtZSA9IHNlbGYubmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleGVjbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5leGVjdXRhYmxlKQorICAgICAgICAgICAgZXhlY3BhdGggPSBwYXRoam9pbihzZWxmLmV4ZWNkaXIsIGV4ZWNuYW1lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuc3ltbGlua19leGVjOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKChzZWxmLmV4ZWN1dGFibGUsIGV4ZWNwYXRoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmJpbmFyaWVzLmFwcGVuZChleGVjcGF0aCkKKyAgICAgICAgICAgIHNlbGYuZXhlY3BhdGggPSBleGVjcGF0aAogCi0JCWlmIHNlbGYubWFpbnByb2dyYW0gaXMgbm90IE5vbmU6Ci0JCQltYWlucHJvZ3JhbSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5tYWlucHJvZ3JhbSkKLQkJCXNlbGYuZmlsZXMuYXBwZW5kKChzZWxmLm1haW5wcm9ncmFtLCBwYXRoam9pbihyZXNkaXIsIG1haW5wcm9ncmFtKSkpCi0JCQlpZiBzZWxmLmFyZ3ZfZW11bGF0aW9uOgotCQkJCSMgQ2hhbmdlIHRoZSBtYWluIHByb2dyYW0sIGFuZCBjcmVhdGUgdGhlIGhlbHBlciBtYWluIHByb2dyYW0gKHdoaWNoCi0JCQkJIyBkb2VzIGFyZ3YgY29sbGVjdGlvbiBhbmQgdGhlbiBjYWxscyB0aGUgcmVhbCBtYWluKS4KLQkJCQkjIEFsc28gdXBkYXRlIHRoZSBpbmNsdWRlZCBtb2R1bGVzIChpZiB3ZSdyZSBjcmVhdGluZyBhIHN0YW5kYWxvbmUKLQkJCQkjIHByb2dyYW0pIGFuZCB0aGUgcGxpc3QKLQkJCQlyZWFsbWFpbnByb2dyYW0gPSBtYWlucHJvZ3JhbQotCQkJCW1haW5wcm9ncmFtID0gJ19fYXJndmVtdWxhdG9yXycgKyBtYWlucHJvZ3JhbQotCQkJCXJlc2RpcnBhdGggPSBwYXRoam9pbihzZWxmLmJ1bmRsZXBhdGgsIHJlc2RpcikKLQkJCQltYWlucHJvZ3JhbXBhdGggPSBwYXRoam9pbihyZXNkaXJwYXRoLCBtYWlucHJvZ3JhbSkKLQkJCQltYWtlZGlycyhyZXNkaXJwYXRoKQotCQkJCW9wZW4obWFpbnByb2dyYW1wYXRoLCAidyIpLndyaXRlKEFSR1ZfRU1VTEFUT1IgJSBsb2NhbHMoKSkKLQkJCQlpZiBzZWxmLnN0YW5kYWxvbmU6Ci0JCQkJCXNlbGYuaW5jbHVkZU1vZHVsZXMuYXBwZW5kKCJhcmd2ZW11bGF0b3IiKQotCQkJCQlzZWxmLmluY2x1ZGVNb2R1bGVzLmFwcGVuZCgib3MiKQotCQkJCWlmIG5vdCBzZWxmLnBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlRG9jdW1lbnRUeXBlcyIpOgotCQkJCQlzZWxmLnBsaXN0WyJDRkJ1bmRsZURvY3VtZW50VHlwZXMiXSA9IFsKLQkJCQkJCXsgIkNGQnVuZGxlVHlwZU9TVHlwZXMiIDogWwotCQkJCQkJCSIqKioqIiwKLQkJCQkJCQkiZm9sZCIsCi0JCQkJCQkJImRpc2siXSwKLQkJCQkJCSAgIkNGQnVuZGxlVHlwZVJvbGUiOiAiVmlld2VyIn1dCi0JCQkjIFdyaXRlIGJvb3RzdHJhcCBzY3JpcHQKLQkJCWV4ZWN1dGFibGUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZXhlY3V0YWJsZSkKLQkJCWV4ZWNkaXIgPSBwYXRoam9pbihzZWxmLmJ1bmRsZXBhdGgsIHNlbGYuZXhlY2RpcikKLQkJCWJvb3RzdHJhcHBhdGggPSBwYXRoam9pbihleGVjZGlyLCBzZWxmLm5hbWUpCi0JCQltYWtlZGlycyhleGVjZGlyKQotCQkJaWYgc2VsZi5zdGFuZGFsb25lOgotCQkJCSMgWFhYIHdlJ3JlIHNjcmV3ZWQgd2hlbiB0aGUgZW5kIHVzZXIgaGFzIGRlbGV0ZWQKLQkJCQkjIC91c3IvYmluL3B5dGhvbgotCQkJCWhhc2hiYW5nID0gIi91c3IvYmluL3B5dGhvbiIKLQkJCWVsc2U6Ci0JCQkJaGFzaGJhbmcgPSBvcy5wYXRoLnJlYWxwYXRoKHN5cy5leGVjdXRhYmxlKQotCQkJc3RhbmRhbG9uZSA9IHNlbGYuc3RhbmRhbG9uZQotCQkJb3Blbihib290c3RyYXBwYXRoLCAidyIpLndyaXRlKEJPT1RTVFJBUF9TQ1JJUFQgJSBsb2NhbHMoKSkKLQkJCW9zLmNobW9kKGJvb3RzdHJhcHBhdGgsIDA3NzUpCisgICAgICAgIGlmIHNlbGYubWFpbnByb2dyYW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtYWlucHJvZ3JhbSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5tYWlucHJvZ3JhbSkKKyAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKChzZWxmLm1haW5wcm9ncmFtLCBwYXRoam9pbihyZXNkaXIsIG1haW5wcm9ncmFtKSkpCisgICAgICAgICAgICBpZiBzZWxmLmFyZ3ZfZW11bGF0aW9uOgorICAgICAgICAgICAgICAgICMgQ2hhbmdlIHRoZSBtYWluIHByb2dyYW0sIGFuZCBjcmVhdGUgdGhlIGhlbHBlciBtYWluIHByb2dyYW0gKHdoaWNoCisgICAgICAgICAgICAgICAgIyBkb2VzIGFyZ3YgY29sbGVjdGlvbiBhbmQgdGhlbiBjYWxscyB0aGUgcmVhbCBtYWluKS4KKyAgICAgICAgICAgICAgICAjIEFsc28gdXBkYXRlIHRoZSBpbmNsdWRlZCBtb2R1bGVzIChpZiB3ZSdyZSBjcmVhdGluZyBhIHN0YW5kYWxvbmUKKyAgICAgICAgICAgICAgICAjIHByb2dyYW0pIGFuZCB0aGUgcGxpc3QKKyAgICAgICAgICAgICAgICByZWFsbWFpbnByb2dyYW0gPSBtYWlucHJvZ3JhbQorICAgICAgICAgICAgICAgIG1haW5wcm9ncmFtID0gJ19fYXJndmVtdWxhdG9yXycgKyBtYWlucHJvZ3JhbQorICAgICAgICAgICAgICAgIHJlc2RpcnBhdGggPSBwYXRoam9pbihzZWxmLmJ1bmRsZXBhdGgsIHJlc2RpcikKKyAgICAgICAgICAgICAgICBtYWlucHJvZ3JhbXBhdGggPSBwYXRoam9pbihyZXNkaXJwYXRoLCBtYWlucHJvZ3JhbSkKKyAgICAgICAgICAgICAgICBtYWtlZGlycyhyZXNkaXJwYXRoKQorICAgICAgICAgICAgICAgIG9wZW4obWFpbnByb2dyYW1wYXRoLCAidyIpLndyaXRlKEFSR1ZfRU1VTEFUT1IgJSBsb2NhbHMoKSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0YW5kYWxvbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5jbHVkZU1vZHVsZXMuYXBwZW5kKCJhcmd2ZW11bGF0b3IiKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmluY2x1ZGVNb2R1bGVzLmFwcGVuZCgib3MiKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlRG9jdW1lbnRUeXBlcyIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBsaXN0WyJDRkJ1bmRsZURvY3VtZW50VHlwZXMiXSA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIkNGQnVuZGxlVHlwZU9TVHlwZXMiIDogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqKioqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc2siXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNGQnVuZGxlVHlwZVJvbGUiOiAiVmlld2VyIn1dCisgICAgICAgICAgICAjIFdyaXRlIGJvb3RzdHJhcCBzY3JpcHQKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZXhlY3V0YWJsZSkKKyAgICAgICAgICAgIGV4ZWNkaXIgPSBwYXRoam9pbihzZWxmLmJ1bmRsZXBhdGgsIHNlbGYuZXhlY2RpcikKKyAgICAgICAgICAgIGJvb3RzdHJhcHBhdGggPSBwYXRoam9pbihleGVjZGlyLCBzZWxmLm5hbWUpCisgICAgICAgICAgICBtYWtlZGlycyhleGVjZGlyKQorICAgICAgICAgICAgaWYgc2VsZi5zdGFuZGFsb25lOgorICAgICAgICAgICAgICAgICMgWFhYIHdlJ3JlIHNjcmV3ZWQgd2hlbiB0aGUgZW5kIHVzZXIgaGFzIGRlbGV0ZWQKKyAgICAgICAgICAgICAgICAjIC91c3IvYmluL3B5dGhvbgorICAgICAgICAgICAgICAgIGhhc2hiYW5nID0gIi91c3IvYmluL3B5dGhvbiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGFzaGJhbmcgPSBvcy5wYXRoLnJlYWxwYXRoKHN5cy5leGVjdXRhYmxlKQorICAgICAgICAgICAgc3RhbmRhbG9uZSA9IHNlbGYuc3RhbmRhbG9uZQorICAgICAgICAgICAgb3Blbihib290c3RyYXBwYXRoLCAidyIpLndyaXRlKEJPT1RTVFJBUF9TQ1JJUFQgJSBsb2NhbHMoKSkKKyAgICAgICAgICAgIG9zLmNobW9kKGJvb3RzdHJhcHBhdGgsIDA3NzUpCiAKLQkJaWYgc2VsZi5pY29uZmlsZSBpcyBub3QgTm9uZToKLQkJCWljb25iYXNlID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmljb25maWxlKQotCQkJc2VsZi5wbGlzdC5DRkJ1bmRsZUljb25GaWxlID0gaWNvbmJhc2UKLQkJCXNlbGYuZmlsZXMuYXBwZW5kKChzZWxmLmljb25maWxlLCBwYXRoam9pbihyZXNkaXIsIGljb25iYXNlKSkpCisgICAgICAgIGlmIHNlbGYuaWNvbmZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpY29uYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5pY29uZmlsZSkKKyAgICAgICAgICAgIHNlbGYucGxpc3QuQ0ZCdW5kbGVJY29uRmlsZSA9IGljb25iYXNlCisgICAgICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZCgoc2VsZi5pY29uZmlsZSwgcGF0aGpvaW4ocmVzZGlyLCBpY29uYmFzZSkpKQogCi0JZGVmIHBvc3RQcm9jZXNzKHNlbGYpOgotCQlpZiBzZWxmLnN0YW5kYWxvbmU6Ci0JCQlzZWxmLmFkZFB5dGhvbk1vZHVsZXMoKQotCQlpZiBzZWxmLnN0cmlwIGFuZCBub3Qgc2VsZi5zeW1saW5rOgotCQkJc2VsZi5zdHJpcEJpbmFyaWVzKCkKKyAgICBkZWYgcG9zdFByb2Nlc3Moc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhbmRhbG9uZToKKyAgICAgICAgICAgIHNlbGYuYWRkUHl0aG9uTW9kdWxlcygpCisgICAgICAgIGlmIHNlbGYuc3RyaXAgYW5kIG5vdCBzZWxmLnN5bWxpbms6CisgICAgICAgICAgICBzZWxmLnN0cmlwQmluYXJpZXMoKQogCi0JCWlmIHNlbGYuc3ltbGlua19leGVjIGFuZCBzZWxmLmV4ZWN1dGFibGU6Ci0JCQlzZWxmLm1lc3NhZ2UoIlN5bWxpbmtpbmcgZXhlY3V0YWJsZSAlcyB0byAlcyIgJSAoc2VsZi5leGVjdXRhYmxlLAotCQkJCQlzZWxmLmV4ZWNwYXRoKSwgMikKLQkJCWRzdCA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgc2VsZi5leGVjcGF0aCkKLQkJCW1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShkc3QpKQotCQkJb3Muc3ltbGluayhvcy5wYXRoLmFic3BhdGgoc2VsZi5leGVjdXRhYmxlKSwgZHN0KQorICAgICAgICBpZiBzZWxmLnN5bWxpbmtfZXhlYyBhbmQgc2VsZi5leGVjdXRhYmxlOgorICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCJTeW1saW5raW5nIGV4ZWN1dGFibGUgJXMgdG8gJXMiICUgKHNlbGYuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5leGVjcGF0aCksIDIpCisgICAgICAgICAgICBkc3QgPSBwYXRoam9pbihzZWxmLmJ1bmRsZXBhdGgsIHNlbGYuZXhlY3BhdGgpCisgICAgICAgICAgICBtYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUoZHN0KSkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5hYnNwYXRoKHNlbGYuZXhlY3V0YWJsZSksIGRzdCkKIAotCQlpZiBzZWxmLm1pc3NpbmdNb2R1bGVzIG9yIHNlbGYubWF5YmVNaXNzaW5nTW9kdWxlczoKLQkJCXNlbGYucmVwb3J0TWlzc2luZygpCisgICAgICAgIGlmIHNlbGYubWlzc2luZ01vZHVsZXMgb3Igc2VsZi5tYXliZU1pc3NpbmdNb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5yZXBvcnRNaXNzaW5nKCkKIAotCWRlZiBhZGRQeXRob25Nb2R1bGVzKHNlbGYpOgotCQlzZWxmLm1lc3NhZ2UoIkFkZGluZyBQeXRob24gbW9kdWxlcyIsIDEpCisgICAgZGVmIGFkZFB5dGhvbk1vZHVsZXMoc2VsZik6CisgICAgICAgIHNlbGYubWVzc2FnZSgiQWRkaW5nIFB5dGhvbiBtb2R1bGVzIiwgMSkKIAotCQlpZiBVU0VfWklQSU1QT1JUOgotCQkJIyBDcmVhdGUgYSB6aXAgZmlsZSBjb250YWluaW5nIGFsbCBtb2R1bGVzIGFzIHB5Yy4KLQkJCWltcG9ydCB6aXBmaWxlCi0JCQlyZWxwYXRoID0gcGF0aGpvaW4oIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsIFpJUF9BUkNISVZFKQotCQkJYWJzcGF0aCA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgcmVscGF0aCkKLQkJCXpmID0gemlwZmlsZS5aaXBGaWxlKGFic3BhdGgsICJ3IiwgemlwZmlsZS5aSVBfREVGTEFURUQpCi0JCQlmb3IgbmFtZSwgY29kZSwgaXNwa2cgaW4gc2VsZi5weW1vZHVsZXM6Ci0JCQkJc2VsZi5tZXNzYWdlKCJBZGRpbmcgUHl0aG9uIG1vZHVsZSAlcyIgJSBuYW1lLCAyKQotCQkJCXBhdGgsIHB5YyA9IGdldFB5Y0RhdGEobmFtZSwgY29kZSwgaXNwa2cpCi0JCQkJemYud3JpdGVzdHIocGF0aCwgcHljKQotCQkJemYuY2xvc2UoKQotCQkJIyBhZGQgc2l0ZS5weWMKLQkJCXNpdGVwYXRoID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCAiQ29udGVudHMiLCAiUmVzb3VyY2VzIiwKLQkJCQkJInNpdGUiICsgUFlDX0VYVCkKLQkJCXdyaXRlUHljKFNJVEVfQ08sIHNpdGVwYXRoKQotCQllbHNlOgotCQkJIyBDcmVhdGUgaW5kaXZpZHVhbCAucHljIGZpbGVzLgotCQkJZm9yIG5hbWUsIGNvZGUsIGlzcGtnIGluIHNlbGYucHltb2R1bGVzOgotCQkJCWlmIGlzcGtnOgotCQkJCQluYW1lICs9ICIuX19pbml0X18iCi0JCQkJcGF0aCA9IG5hbWUuc3BsaXQoIi4iKQotCQkJCXBhdGggPSBwYXRoam9pbigiQ29udGVudHMiLCAiUmVzb3VyY2VzIiwgKnBhdGgpICsgUFlDX0VYVAorICAgICAgICBpZiBVU0VfWklQSU1QT1JUOgorICAgICAgICAgICAgIyBDcmVhdGUgYSB6aXAgZmlsZSBjb250YWluaW5nIGFsbCBtb2R1bGVzIGFzIHB5Yy4KKyAgICAgICAgICAgIGltcG9ydCB6aXBmaWxlCisgICAgICAgICAgICByZWxwYXRoID0gcGF0aGpvaW4oIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsIFpJUF9BUkNISVZFKQorICAgICAgICAgICAgYWJzcGF0aCA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgcmVscGF0aCkKKyAgICAgICAgICAgIHpmID0gemlwZmlsZS5aaXBGaWxlKGFic3BhdGgsICJ3IiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisgICAgICAgICAgICBmb3IgbmFtZSwgY29kZSwgaXNwa2cgaW4gc2VsZi5weW1vZHVsZXM6CisgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCJBZGRpbmcgUHl0aG9uIG1vZHVsZSAlcyIgJSBuYW1lLCAyKQorICAgICAgICAgICAgICAgIHBhdGgsIHB5YyA9IGdldFB5Y0RhdGEobmFtZSwgY29kZSwgaXNwa2cpCisgICAgICAgICAgICAgICAgemYud3JpdGVzdHIocGF0aCwgcHljKQorICAgICAgICAgICAgemYuY2xvc2UoKQorICAgICAgICAgICAgIyBhZGQgc2l0ZS5weWMKKyAgICAgICAgICAgIHNpdGVwYXRoID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCAiQ29udGVudHMiLCAiUmVzb3VyY2VzIiwKKyAgICAgICAgICAgICAgICAgICAgInNpdGUiICsgUFlDX0VYVCkKKyAgICAgICAgICAgIHdyaXRlUHljKFNJVEVfQ08sIHNpdGVwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBDcmVhdGUgaW5kaXZpZHVhbCAucHljIGZpbGVzLgorICAgICAgICAgICAgZm9yIG5hbWUsIGNvZGUsIGlzcGtnIGluIHNlbGYucHltb2R1bGVzOgorICAgICAgICAgICAgICAgIGlmIGlzcGtnOgorICAgICAgICAgICAgICAgICAgICBuYW1lICs9ICIuX19pbml0X18iCisgICAgICAgICAgICAgICAgcGF0aCA9IG5hbWUuc3BsaXQoIi4iKQorICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoam9pbigiQ29udGVudHMiLCAiUmVzb3VyY2VzIiwgKnBhdGgpICsgUFlDX0VYVAogCi0JCQkJaWYgaXNwa2c6Ci0JCQkJCXNlbGYubWVzc2FnZSgiQWRkaW5nIFB5dGhvbiBwYWNrYWdlICVzIiAlIHBhdGgsIDIpCi0JCQkJZWxzZToKLQkJCQkJc2VsZi5tZXNzYWdlKCJBZGRpbmcgUHl0aG9uIG1vZHVsZSAlcyIgJSBwYXRoLCAyKQorICAgICAgICAgICAgICAgIGlmIGlzcGtnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIkFkZGluZyBQeXRob24gcGFja2FnZSAlcyIgJSBwYXRoLCAyKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiQWRkaW5nIFB5dGhvbiBtb2R1bGUgJXMiICUgcGF0aCwgMikKIAotCQkJCWFic3BhdGggPSBwYXRoam9pbihzZWxmLmJ1bmRsZXBhdGgsIHBhdGgpCi0JCQkJbWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKGFic3BhdGgpKQotCQkJCXdyaXRlUHljKGNvZGUsIGFic3BhdGgpCisgICAgICAgICAgICAgICAgYWJzcGF0aCA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgcGF0aCkKKyAgICAgICAgICAgICAgICBtYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUoYWJzcGF0aCkpCisgICAgICAgICAgICAgICAgd3JpdGVQeWMoY29kZSwgYWJzcGF0aCkKIAotCWRlZiBzdHJpcEJpbmFyaWVzKHNlbGYpOgotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoU1RSSVBfRVhFQyk6Ci0JCQlzZWxmLm1lc3NhZ2UoIkVycm9yOiBjYW4ndCBzdHJpcCBiaW5hcmllczogbm8gc3RyaXAgcHJvZ3JhbSBhdCAiCi0JCQkJIiVzIiAlIFNUUklQX0VYRUMsIDApCi0JCWVsc2U6Ci0JCQlzZWxmLm1lc3NhZ2UoIlN0cmlwcGluZyBiaW5hcmllcyIsIDEpCi0JCQlmb3IgcmVscGF0aCBpbiBzZWxmLmJpbmFyaWVzOgotCQkJCXNlbGYubWVzc2FnZSgiU3RyaXBwaW5nICVzIiAlIHJlbHBhdGgsIDIpCi0JCQkJYWJzcGF0aCA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgcmVscGF0aCkKLQkJCQlhc3NlcnQgbm90IG9zLnBhdGguaXNsaW5rKGFic3BhdGgpCi0JCQkJcnYgPSBvcy5zeXN0ZW0oIiVzIC1TIFwiJXNcIiIgJSAoU1RSSVBfRVhFQywgYWJzcGF0aCkpCisgICAgZGVmIHN0cmlwQmluYXJpZXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhTVFJJUF9FWEVDKToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiRXJyb3I6IGNhbid0IHN0cmlwIGJpbmFyaWVzOiBubyBzdHJpcCBwcm9ncmFtIGF0ICIKKyAgICAgICAgICAgICAgICAiJXMiICUgU1RSSVBfRVhFQywgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiU3RyaXBwaW5nIGJpbmFyaWVzIiwgMSkKKyAgICAgICAgICAgIGZvciByZWxwYXRoIGluIHNlbGYuYmluYXJpZXM6CisgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCJTdHJpcHBpbmcgJXMiICUgcmVscGF0aCwgMikKKyAgICAgICAgICAgICAgICBhYnNwYXRoID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCByZWxwYXRoKQorICAgICAgICAgICAgICAgIGFzc2VydCBub3Qgb3MucGF0aC5pc2xpbmsoYWJzcGF0aCkKKyAgICAgICAgICAgICAgICBydiA9IG9zLnN5c3RlbSgiJXMgLVMgXCIlc1wiIiAlIChTVFJJUF9FWEVDLCBhYnNwYXRoKSkKIAotCWRlZiBmaW5kRGVwZW5kZW5jaWVzKHNlbGYpOgotCQlzZWxmLm1lc3NhZ2UoIkZpbmRpbmcgbW9kdWxlIGRlcGVuZGVuY2llcyIsIDEpCi0JCWltcG9ydCBtb2R1bGVmaW5kZXIKLQkJbWYgPSBtb2R1bGVmaW5kZXIuTW9kdWxlRmluZGVyKGV4Y2x1ZGVzPXNlbGYuZXhjbHVkZU1vZHVsZXMpCi0JCWlmIFVTRV9aSVBJTVBPUlQ6Ci0JCQkjIHppcGltcG9ydCBpbXBvcnRzIHpsaWIsIG11c3QgYWRkIGl0IG1hbnVhbGx5Ci0JCQltZi5pbXBvcnRfaG9vaygiemxpYiIpCi0JCSMgbWFudWFsbHkgYWRkIG91ciBvd24gc2l0ZS5weQotCQlzaXRlID0gbWYuYWRkX21vZHVsZSgic2l0ZSIpCi0JCXNpdGUuX19jb2RlX18gPSBTSVRFX0NPCi0JCW1mLnNjYW5fY29kZShTSVRFX0NPLCBzaXRlKQorICAgIGRlZiBmaW5kRGVwZW5kZW5jaWVzKHNlbGYpOgorICAgICAgICBzZWxmLm1lc3NhZ2UoIkZpbmRpbmcgbW9kdWxlIGRlcGVuZGVuY2llcyIsIDEpCisgICAgICAgIGltcG9ydCBtb2R1bGVmaW5kZXIKKyAgICAgICAgbWYgPSBtb2R1bGVmaW5kZXIuTW9kdWxlRmluZGVyKGV4Y2x1ZGVzPXNlbGYuZXhjbHVkZU1vZHVsZXMpCisgICAgICAgIGlmIFVTRV9aSVBJTVBPUlQ6CisgICAgICAgICAgICAjIHppcGltcG9ydCBpbXBvcnRzIHpsaWIsIG11c3QgYWRkIGl0IG1hbnVhbGx5CisgICAgICAgICAgICBtZi5pbXBvcnRfaG9vaygiemxpYiIpCisgICAgICAgICMgbWFudWFsbHkgYWRkIG91ciBvd24gc2l0ZS5weQorICAgICAgICBzaXRlID0gbWYuYWRkX21vZHVsZSgic2l0ZSIpCisgICAgICAgIHNpdGUuX19jb2RlX18gPSBTSVRFX0NPCisgICAgICAgIG1mLnNjYW5fY29kZShTSVRFX0NPLCBzaXRlKQogCi0JCSMgd2FybmluZ3MucHkgZ2V0cyBpbXBvcnRlZCBpbXBsaWNpdGx5IGZyb20gQwotCQltZi5pbXBvcnRfaG9vaygid2FybmluZ3MiKQorICAgICAgICAjIHdhcm5pbmdzLnB5IGdldHMgaW1wb3J0ZWQgaW1wbGljaXRseSBmcm9tIEMKKyAgICAgICAgbWYuaW1wb3J0X2hvb2soIndhcm5pbmdzIikKIAotCQlpbmNsdWRlTW9kdWxlcyA9IHNlbGYuaW5jbHVkZU1vZHVsZXNbOl0KLQkJZm9yIG5hbWUgaW4gc2VsZi5pbmNsdWRlUGFja2FnZXM6Ci0JCQlpbmNsdWRlTW9kdWxlcy5leHRlbmQoZmluZFBhY2thZ2VDb250ZW50cyhuYW1lKS5rZXlzKCkpCi0JCWZvciBuYW1lIGluIGluY2x1ZGVNb2R1bGVzOgotCQkJdHJ5OgotCQkJCW1mLmltcG9ydF9ob29rKG5hbWUpCi0JCQlleGNlcHQgSW1wb3J0RXJyb3I6Ci0JCQkJc2VsZi5taXNzaW5nTW9kdWxlcy5hcHBlbmQobmFtZSkKKyAgICAgICAgaW5jbHVkZU1vZHVsZXMgPSBzZWxmLmluY2x1ZGVNb2R1bGVzWzpdCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuaW5jbHVkZVBhY2thZ2VzOgorICAgICAgICAgICAgaW5jbHVkZU1vZHVsZXMuZXh0ZW5kKGZpbmRQYWNrYWdlQ29udGVudHMobmFtZSkua2V5cygpKQorICAgICAgICBmb3IgbmFtZSBpbiBpbmNsdWRlTW9kdWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZi5pbXBvcnRfaG9vayhuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYubWlzc2luZ01vZHVsZXMuYXBwZW5kKG5hbWUpCiAKLQkJbWYucnVuX3NjcmlwdChzZWxmLm1haW5wcm9ncmFtKQotCQltb2R1bGVzID0gbWYubW9kdWxlcy5pdGVtcygpCi0JCW1vZHVsZXMuc29ydCgpCi0JCWZvciBuYW1lLCBtb2QgaW4gbW9kdWxlczoKLQkJCWlmIG1vZC5fX2ZpbGVfXyBhbmQgbW9kLl9fY29kZV9fIGlzIE5vbmU6Ci0JCQkJIyBDIGV4dGVuc2lvbgotCQkJCXBhdGggPSBtb2QuX19maWxlX18KLQkJCQlmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKLQkJCQlpZiBVU0VfWklQSU1QT1JUOgotCQkJCQkjIFB5dGhvbiBtb2R1bGVzIGFyZSBzdG9yZWQgaW4gYSBaaXAgYXJjaGl2ZSwgYnV0IHB1dAotCQkJCQkjIGV4dGVuc2lvbnMgaW4gQ29udGVudHMvUmVzb3VyY2VzLy5hIGFuZCBhZGQgYSB0aW55ICJsb2FkZXIiCi0JCQkJCSMgcHJvZ3JhbSBpbiB0aGUgWmlwIGFyY2hpdmUuIER1ZSB0byBUaG9tYXMgSGVsbGVyLgotCQkJCQlkc3RwYXRoID0gcGF0aGpvaW4oIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsIGZpbGVuYW1lKQotCQkJCQlzb3VyY2UgPSBFWFRfTE9BREVSICUgeyJuYW1lIjogbmFtZSwgImZpbGVuYW1lIjogZmlsZW5hbWV9Ci0JCQkJCWNvZGUgPSBjb21waWxlKHNvdXJjZSwgIjxkeW5sb2FkZXIgZm9yICVzPiIgJSBuYW1lLCAiZXhlYyIpCi0JCQkJCW1vZC5fX2NvZGVfXyA9IGNvZGUKLQkJCQllbHNlOgotCQkJCQkjIGp1c3QgY29weSB0aGUgZmlsZQotCQkJCQlkc3RwYXRoID0gbmFtZS5zcGxpdCgiLiIpWzotMV0gKyBbZmlsZW5hbWVdCi0JCQkJCWRzdHBhdGggPSBwYXRoam9pbigiQ29udGVudHMiLCAiUmVzb3VyY2VzIiwgKmRzdHBhdGgpCi0JCQkJc2VsZi5maWxlcy5hcHBlbmQoKHBhdGgsIGRzdHBhdGgpKQotCQkJCXNlbGYuYmluYXJpZXMuYXBwZW5kKGRzdHBhdGgpCi0JCQlpZiBtb2QuX19jb2RlX18gaXMgbm90IE5vbmU6Ci0JCQkJaXNwa2cgPSBtb2QuX19wYXRoX18gaXMgbm90IE5vbmUKLQkJCQlpZiBub3QgVVNFX1pJUElNUE9SVCBvciBuYW1lICE9ICJzaXRlIjoKLQkJCQkJIyBPdXIgc2l0ZS5weSBpcyBkb2luZyB0aGUgYm9vdHN0cmFwcGluZywgc28gd2UgbXVzdAotCQkJCQkjIGluY2x1ZGUgYSByZWFsIC5weWMgZmlsZSBpZiBVU0VfWklQSU1QT1JUIGlzIFRydWUuCi0JCQkJCXNlbGYucHltb2R1bGVzLmFwcGVuZCgobmFtZSwgbW9kLl9fY29kZV9fLCBpc3BrZykpCisgICAgICAgIG1mLnJ1bl9zY3JpcHQoc2VsZi5tYWlucHJvZ3JhbSkKKyAgICAgICAgbW9kdWxlcyA9IG1mLm1vZHVsZXMuaXRlbXMoKQorICAgICAgICBtb2R1bGVzLnNvcnQoKQorICAgICAgICBmb3IgbmFtZSwgbW9kIGluIG1vZHVsZXM6CisgICAgICAgICAgICBpZiBtb2QuX19maWxlX18gYW5kIG1vZC5fX2NvZGVfXyBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgQyBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBwYXRoID0gbW9kLl9fZmlsZV9fCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCisgICAgICAgICAgICAgICAgaWYgVVNFX1pJUElNUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgIyBQeXRob24gbW9kdWxlcyBhcmUgc3RvcmVkIGluIGEgWmlwIGFyY2hpdmUsIGJ1dCBwdXQKKyAgICAgICAgICAgICAgICAgICAgIyBleHRlbnNpb25zIGluIENvbnRlbnRzL1Jlc291cmNlcy8uYSBhbmQgYWRkIGEgdGlueSAibG9hZGVyIgorICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gaW4gdGhlIFppcCBhcmNoaXZlLiBEdWUgdG8gVGhvbWFzIEhlbGxlci4KKyAgICAgICAgICAgICAgICAgICAgZHN0cGF0aCA9IHBhdGhqb2luKCJDb250ZW50cyIsICJSZXNvdXJjZXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc291cmNlID0gRVhUX0xPQURFUiAlIHsibmFtZSI6IG5hbWUsICJmaWxlbmFtZSI6IGZpbGVuYW1lfQorICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShzb3VyY2UsICI8ZHlubG9hZGVyIGZvciAlcz4iICUgbmFtZSwgImV4ZWMiKQorICAgICAgICAgICAgICAgICAgICBtb2QuX19jb2RlX18gPSBjb2RlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBqdXN0IGNvcHkgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgZHN0cGF0aCA9IG5hbWUuc3BsaXQoIi4iKVs6LTFdICsgW2ZpbGVuYW1lXQorICAgICAgICAgICAgICAgICAgICBkc3RwYXRoID0gcGF0aGpvaW4oIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsICpkc3RwYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKChwYXRoLCBkc3RwYXRoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmJpbmFyaWVzLmFwcGVuZChkc3RwYXRoKQorICAgICAgICAgICAgaWYgbW9kLl9fY29kZV9fIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlzcGtnID0gbW9kLl9fcGF0aF9fIGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgaWYgbm90IFVTRV9aSVBJTVBPUlQgb3IgbmFtZSAhPSAic2l0ZSI6CisgICAgICAgICAgICAgICAgICAgICMgT3VyIHNpdGUucHkgaXMgZG9pbmcgdGhlIGJvb3RzdHJhcHBpbmcsIHNvIHdlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgIyBpbmNsdWRlIGEgcmVhbCAucHljIGZpbGUgaWYgVVNFX1pJUElNUE9SVCBpcyBUcnVlLgorICAgICAgICAgICAgICAgICAgICBzZWxmLnB5bW9kdWxlcy5hcHBlbmQoKG5hbWUsIG1vZC5fX2NvZGVfXywgaXNwa2cpKQogCi0JCWlmIGhhc2F0dHIobWYsICJhbnlfbWlzc2luZ19tYXliZSIpOgotCQkJbWlzc2luZywgbWF5YmUgPSBtZi5hbnlfbWlzc2luZ19tYXliZSgpCi0JCWVsc2U6Ci0JCQltaXNzaW5nID0gbWYuYW55X21pc3NpbmcoKQotCQkJbWF5YmUgPSBbXQotCQlzZWxmLm1pc3NpbmdNb2R1bGVzLmV4dGVuZChtaXNzaW5nKQotCQlzZWxmLm1heWJlTWlzc2luZ01vZHVsZXMuZXh0ZW5kKG1heWJlKQorICAgICAgICBpZiBoYXNhdHRyKG1mLCAiYW55X21pc3NpbmdfbWF5YmUiKToKKyAgICAgICAgICAgIG1pc3NpbmcsIG1heWJlID0gbWYuYW55X21pc3NpbmdfbWF5YmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWlzc2luZyA9IG1mLmFueV9taXNzaW5nKCkKKyAgICAgICAgICAgIG1heWJlID0gW10KKyAgICAgICAgc2VsZi5taXNzaW5nTW9kdWxlcy5leHRlbmQobWlzc2luZykKKyAgICAgICAgc2VsZi5tYXliZU1pc3NpbmdNb2R1bGVzLmV4dGVuZChtYXliZSkKIAotCWRlZiByZXBvcnRNaXNzaW5nKHNlbGYpOgotCQltaXNzaW5nID0gW25hbWUgZm9yIG5hbWUgaW4gc2VsZi5taXNzaW5nTW9kdWxlcwotCQkJCWlmIG5hbWUgbm90IGluIE1BWU1JU1NfTU9EVUxFU10KLQkJaWYgc2VsZi5tYXliZU1pc3NpbmdNb2R1bGVzOgotCQkJbWF5YmUgPSBzZWxmLm1heWJlTWlzc2luZ01vZHVsZXMKLQkJZWxzZToKLQkJCW1heWJlID0gW25hbWUgZm9yIG5hbWUgaW4gbWlzc2luZyBpZiAiLiIgaW4gbmFtZV0KLQkJCW1pc3NpbmcgPSBbbmFtZSBmb3IgbmFtZSBpbiBtaXNzaW5nIGlmICIuIiBub3QgaW4gbmFtZV0KLQkJbWlzc2luZy5zb3J0KCkKLQkJbWF5YmUuc29ydCgpCi0JCWlmIG1heWJlOgotCQkJc2VsZi5tZXNzYWdlKCJXYXJuaW5nOiBjb3VsZG4ndCBmaW5kIHRoZSBmb2xsb3dpbmcgc3VibW9kdWxlczoiLCAxKQotCQkJc2VsZi5tZXNzYWdlKCIgICAgKE5vdGUgdGhhdCB0aGVzZSBjb3VsZCBiZSBmYWxzZSBhbGFybXMgLS0gIgotCQkJICAgICAgICAgICAgICJpdCdzIG5vdCBhbHdheXMiLCAxKQotCQkJc2VsZi5tZXNzYWdlKCIgICAgcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcImZyb20gcGFja2FnZSAiCi0JCQkgICAgICAgICAgICAgImltcG9ydCBzdWJtb2R1bGVcIiAiLCAxKQotCQkJc2VsZi5tZXNzYWdlKCIgICAgYW5kIFwiZnJvbSBwYWNrYWdlIGltcG9ydCBuYW1lXCIpIiwgMSkKLQkJCWZvciBuYW1lIGluIG1heWJlOgotCQkJCXNlbGYubWVzc2FnZSgiICA/ICIgKyBuYW1lLCAxKQotCQlpZiBtaXNzaW5nOgotCQkJc2VsZi5tZXNzYWdlKCJXYXJuaW5nOiBjb3VsZG4ndCBmaW5kIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoiLCAxKQotCQkJZm9yIG5hbWUgaW4gbWlzc2luZzoKLQkJCQlzZWxmLm1lc3NhZ2UoIiAgPyAiICsgbmFtZSwgMSkKKyAgICBkZWYgcmVwb3J0TWlzc2luZyhzZWxmKToKKyAgICAgICAgbWlzc2luZyA9IFtuYW1lIGZvciBuYW1lIGluIHNlbGYubWlzc2luZ01vZHVsZXMKKyAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBNQVlNSVNTX01PRFVMRVNdCisgICAgICAgIGlmIHNlbGYubWF5YmVNaXNzaW5nTW9kdWxlczoKKyAgICAgICAgICAgIG1heWJlID0gc2VsZi5tYXliZU1pc3NpbmdNb2R1bGVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXliZSA9IFtuYW1lIGZvciBuYW1lIGluIG1pc3NpbmcgaWYgIi4iIGluIG5hbWVdCisgICAgICAgICAgICBtaXNzaW5nID0gW25hbWUgZm9yIG5hbWUgaW4gbWlzc2luZyBpZiAiLiIgbm90IGluIG5hbWVdCisgICAgICAgIG1pc3Npbmcuc29ydCgpCisgICAgICAgIG1heWJlLnNvcnQoKQorICAgICAgICBpZiBtYXliZToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiV2FybmluZzogY291bGRuJ3QgZmluZCB0aGUgZm9sbG93aW5nIHN1Ym1vZHVsZXM6IiwgMSkKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiICAgIChOb3RlIHRoYXQgdGhlc2UgY291bGQgYmUgZmFsc2UgYWxhcm1zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaXQncyBub3QgYWx3YXlzIiwgMSkKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiICAgIHBvc3NpYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gXCJmcm9tIHBhY2thZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3VibW9kdWxlXCIgIiwgMSkKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiICAgIGFuZCBcImZyb20gcGFja2FnZSBpbXBvcnQgbmFtZVwiKSIsIDEpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBtYXliZToKKyAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIiAgPyAiICsgbmFtZSwgMSkKKyAgICAgICAgaWYgbWlzc2luZzoKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiV2FybmluZzogY291bGRuJ3QgZmluZCB0aGUgZm9sbG93aW5nIG1vZHVsZXM6IiwgMSkKKyAgICAgICAgICAgIGZvciBuYW1lIGluIG1pc3Npbmc6CisgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCIgID8gIiArIG5hbWUsIDEpCiAKLQlkZWYgcmVwb3J0KHNlbGYpOgotCQkjIFhYWCBzb21ldGhpbmcgZGVjZW50Ci0JCWltcG9ydCBwcHJpbnQKLQkJcHByaW50LnBwcmludChzZWxmLl9fZGljdF9fKQotCQlpZiBzZWxmLnN0YW5kYWxvbmU6Ci0JCQlzZWxmLnJlcG9ydE1pc3NpbmcoKQorICAgIGRlZiByZXBvcnQoc2VsZik6CisgICAgICAgICMgWFhYIHNvbWV0aGluZyBkZWNlbnQKKyAgICAgICAgaW1wb3J0IHBwcmludAorICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuX19kaWN0X18pCisgICAgICAgIGlmIHNlbGYuc3RhbmRhbG9uZToKKyAgICAgICAgICAgIHNlbGYucmVwb3J0TWlzc2luZygpCiAKICMKICMgVXRpbGl0aWVzLgpAQCAtNjE2LDY3ICs2MTYsNjcgQEAKIGlkZW50aWZpZXJSRSA9IHJlLmNvbXBpbGUociJbX2EtekEtel1bX2EtekEtWjAtOV0qJCIpCiAKIGRlZiBmaW5kUGFja2FnZUNvbnRlbnRzKG5hbWUsIHNlYXJjaHBhdGg9Tm9uZSk6Ci0JaGVhZCA9IG5hbWUuc3BsaXQoIi4iKVstMV0KLQlpZiBpZGVudGlmaWVyUkUubWF0Y2goaGVhZCkgaXMgTm9uZToKLQkJcmV0dXJuIHt9Ci0JdHJ5OgotCQlmcCwgcGF0aCwgKGV4dCwgbW9kZSwgdHApID0gaW1wLmZpbmRfbW9kdWxlKGhlYWQsIHNlYXJjaHBhdGgpCi0JZXhjZXB0IEltcG9ydEVycm9yOgotCQlyZXR1cm4ge30KLQltb2R1bGVzID0ge25hbWU6IE5vbmV9Ci0JaWYgdHAgPT0gaW1wLlBLR19ESVJFQ1RPUlkgYW5kIHBhdGg6Ci0JCWZpbGVzID0gb3MubGlzdGRpcihwYXRoKQotCQlmb3Igc3ViIGluIGZpbGVzOgotCQkJc3ViLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHN1YikKLQkJCWZ1bGxuYW1lID0gbmFtZSArICIuIiArIHN1YgotCQkJaWYgc3ViICE9ICJfX2luaXRfXyIgYW5kIGZ1bGxuYW1lIG5vdCBpbiBtb2R1bGVzOgotCQkJCW1vZHVsZXMudXBkYXRlKGZpbmRQYWNrYWdlQ29udGVudHMoZnVsbG5hbWUsIFtwYXRoXSkpCi0JcmV0dXJuIG1vZHVsZXMKKyAgICBoZWFkID0gbmFtZS5zcGxpdCgiLiIpWy0xXQorICAgIGlmIGlkZW50aWZpZXJSRS5tYXRjaChoZWFkKSBpcyBOb25lOgorICAgICAgICByZXR1cm4ge30KKyAgICB0cnk6CisgICAgICAgIGZwLCBwYXRoLCAoZXh0LCBtb2RlLCB0cCkgPSBpbXAuZmluZF9tb2R1bGUoaGVhZCwgc2VhcmNocGF0aCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiB7fQorICAgIG1vZHVsZXMgPSB7bmFtZTogTm9uZX0KKyAgICBpZiB0cCA9PSBpbXAuUEtHX0RJUkVDVE9SWSBhbmQgcGF0aDoKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGZvciBzdWIgaW4gZmlsZXM6CisgICAgICAgICAgICBzdWIsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc3ViKQorICAgICAgICAgICAgZnVsbG5hbWUgPSBuYW1lICsgIi4iICsgc3ViCisgICAgICAgICAgICBpZiBzdWIgIT0gIl9faW5pdF9fIiBhbmQgZnVsbG5hbWUgbm90IGluIG1vZHVsZXM6CisgICAgICAgICAgICAgICAgbW9kdWxlcy51cGRhdGUoZmluZFBhY2thZ2VDb250ZW50cyhmdWxsbmFtZSwgW3BhdGhdKSkKKyAgICByZXR1cm4gbW9kdWxlcwogCiBkZWYgd3JpdGVQeWMoY29kZSwgcGF0aCk6Ci0JZiA9IG9wZW4ocGF0aCwgIndiIikKLQlmLndyaXRlKE1BR0lDKQotCWYud3JpdGUoIlwwIiAqIDQpICAjIGRvbid0IGJvdGhlciBhYm91dCBhIHRpbWUgc3RhbXAKLQltYXJzaGFsLmR1bXAoY29kZSwgZikKLQlmLmNsb3NlKCkKKyAgICBmID0gb3BlbihwYXRoLCAid2IiKQorICAgIGYud3JpdGUoTUFHSUMpCisgICAgZi53cml0ZSgiXDAiICogNCkgICMgZG9uJ3QgYm90aGVyIGFib3V0IGEgdGltZSBzdGFtcAorICAgIG1hcnNoYWwuZHVtcChjb2RlLCBmKQorICAgIGYuY2xvc2UoKQogCiBkZWYgY29weShzcmMsIGRzdCwgbWtkaXJzPTApOgotCSIiIkNvcHkgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LiIiIgotCWlmIG1rZGlyczoKLQkJbWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKGRzdCkpCi0JaWYgb3MucGF0aC5pc2RpcihzcmMpOgotCQlzaHV0aWwuY29weXRyZWUoc3JjLCBkc3QpCi0JZWxzZToKLQkJc2h1dGlsLmNvcHkyKHNyYywgZHN0KQorICAgICIiIkNvcHkgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LiIiIgorICAgIGlmIG1rZGlyczoKKyAgICAgICAgbWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKGRzdCkpCisgICAgaWYgb3MucGF0aC5pc2RpcihzcmMpOgorICAgICAgICBzaHV0aWwuY29weXRyZWUoc3JjLCBkc3QpCisgICAgZWxzZToKKyAgICAgICAgc2h1dGlsLmNvcHkyKHNyYywgZHN0KQogCiBkZWYgY29weXRvZGlyKHNyYywgZHN0ZGlyKToKLQkiIiJDb3B5IGEgZmlsZSBvciBhIGRpcmVjdG9yeSB0byBhbiBleGlzdGluZyBkaXJlY3RvcnkuIiIiCi0JZHN0ID0gcGF0aGpvaW4oZHN0ZGlyLCBvcy5wYXRoLmJhc2VuYW1lKHNyYykpCi0JY29weShzcmMsIGRzdCkKKyAgICAiIiJDb3B5IGEgZmlsZSBvciBhIGRpcmVjdG9yeSB0byBhbiBleGlzdGluZyBkaXJlY3RvcnkuIiIiCisgICAgZHN0ID0gcGF0aGpvaW4oZHN0ZGlyLCBvcy5wYXRoLmJhc2VuYW1lKHNyYykpCisgICAgY29weShzcmMsIGRzdCkKIAogZGVmIG1ha2VkaXJzKGRpcik6Ci0JIiIiTWFrZSBhbGwgZGlyZWN0b3JpZXMgbGVhZGluZyB1cCB0byAnZGlyJyBpbmNsdWRpbmcgdGhlIGxlYWYKLQlkaXJlY3RvcnkuIERvbid0IG1vYW4gaWYgYW55IHBhdGggZWxlbWVudCBhbHJlYWR5IGV4aXN0cy4iIiIKLQl0cnk6Ci0JCW9zLm1ha2VkaXJzKGRpcikKLQlleGNlcHQgT1NFcnJvciwgd2h5OgotCQlpZiB3aHkuZXJybm8gIT0gZXJybm8uRUVYSVNUOgotCQkJcmFpc2UKKyAgICAiIiJNYWtlIGFsbCBkaXJlY3RvcmllcyBsZWFkaW5nIHVwIHRvICdkaXInIGluY2x1ZGluZyB0aGUgbGVhZgorICAgIGRpcmVjdG9yeS4gRG9uJ3QgbW9hbiBpZiBhbnkgcGF0aCBlbGVtZW50IGFscmVhZHkgZXhpc3RzLiIiIgorICAgIHRyeToKKyAgICAgICAgb3MubWFrZWRpcnMoZGlyKQorICAgIGV4Y2VwdCBPU0Vycm9yLCB3aHk6CisgICAgICAgIGlmIHdoeS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICByYWlzZQogCiBkZWYgc3ltbGluayhzcmMsIGRzdCwgbWtkaXJzPTApOgotCSIiIkNvcHkgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LiIiIgotCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzcmMpOgotCQlyYWlzZSBJT0Vycm9yLCAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTogJyVzJyIgJSBzcmMKLQlpZiBta2RpcnM6Ci0JCW1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShkc3QpKQotCW9zLnN5bWxpbmsob3MucGF0aC5hYnNwYXRoKHNyYyksIGRzdCkKKyAgICAiIiJDb3B5IGEgZmlsZSBvciBhIGRpcmVjdG9yeS4iIiIKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc3JjKToKKyAgICAgICAgcmFpc2UgSU9FcnJvciwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnk6ICclcyciICUgc3JjCisgICAgaWYgbWtkaXJzOgorICAgICAgICBtYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUoZHN0KSkKKyAgICBvcy5zeW1saW5rKG9zLnBhdGguYWJzcGF0aChzcmMpLCBkc3QpCiAKIGRlZiBwYXRoam9pbigqYXJncyk6Ci0JIiIiU2FmZSB3cmFwcGVyIGZvciBvcy5wYXRoLmpvaW46IGFzc2VydHMgdGhhdCBhbGwgYnV0IHRoZSBmaXJzdAotCWFyZ3VtZW50IGFyZSByZWxhdGl2ZSBwYXRocy4iIiIKLQlmb3Igc2VnIGluIGFyZ3NbMTpdOgotCQlhc3NlcnQgc2VnWzBdICE9ICIvIgotCXJldHVybiBvcy5wYXRoLmpvaW4oKmFyZ3MpCisgICAgIiIiU2FmZSB3cmFwcGVyIGZvciBvcy5wYXRoLmpvaW46IGFzc2VydHMgdGhhdCBhbGwgYnV0IHRoZSBmaXJzdAorICAgIGFyZ3VtZW50IGFyZSByZWxhdGl2ZSBwYXRocy4iIiIKKyAgICBmb3Igc2VnIGluIGFyZ3NbMTpdOgorICAgICAgICBhc3NlcnQgc2VnWzBdICE9ICIvIgorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKmFyZ3MpCiAKIAogY21kbGluZV9kb2MgPSAiIiJcCkBAIC03MTgsOTcgKzcxOCw5NyBAQAogIiIiCiAKIGRlZiB1c2FnZShtc2c9Tm9uZSk6Ci0JaWYgbXNnOgotCQlwcmludCBtc2cKLQlwcmludCBjbWRsaW5lX2RvYwotCXN5cy5leGl0KDEpCisgICAgaWYgbXNnOgorICAgICAgICBwcmludCBtc2cKKyAgICBwcmludCBjbWRsaW5lX2RvYworICAgIHN5cy5leGl0KDEpCiAKIGRlZiBtYWluKGJ1aWxkZXI9Tm9uZSk6Ci0JaWYgYnVpbGRlciBpcyBOb25lOgotCQlidWlsZGVyID0gQXBwQnVpbGRlcih2ZXJib3NpdHk9MSkKKyAgICBpZiBidWlsZGVyIGlzIE5vbmU6CisgICAgICAgIGJ1aWxkZXIgPSBBcHBCdWlsZGVyKHZlcmJvc2l0eT0xKQogCi0Jc2hvcnRvcHRzID0gImI6bjpyOmY6ZTptOmM6cDpseDppOmh2cWEiCi0JbG9uZ29wdHMgPSAoImJ1aWxkZGlyPSIsICJuYW1lPSIsICJyZXNvdXJjZT0iLCAiZmlsZT0iLCAiZXhlY3V0YWJsZT0iLAotCQkibWFpbnByb2dyYW09IiwgImNyZWF0b3I9IiwgIm5pYj0iLCAicGxpc3Q9IiwgImxpbmsiLAotCQkibGluay1leGVjIiwgImhlbHAiLCAidmVyYm9zZSIsICJxdWlldCIsICJhcmd2IiwgInN0YW5kYWxvbmUiLAotCQkiZXhjbHVkZT0iLCAiaW5jbHVkZT0iLCAicGFja2FnZT0iLCAic3RyaXAiLCAiaWNvbmZpbGU9IiwKLQkJImxpYj0iKQorICAgIHNob3J0b3B0cyA9ICJiOm46cjpmOmU6bTpjOnA6bHg6aTpodnFhIgorICAgIGxvbmdvcHRzID0gKCJidWlsZGRpcj0iLCAibmFtZT0iLCAicmVzb3VyY2U9IiwgImZpbGU9IiwgImV4ZWN1dGFibGU9IiwKKyAgICAgICAgIm1haW5wcm9ncmFtPSIsICJjcmVhdG9yPSIsICJuaWI9IiwgInBsaXN0PSIsICJsaW5rIiwKKyAgICAgICAgImxpbmstZXhlYyIsICJoZWxwIiwgInZlcmJvc2UiLCAicXVpZXQiLCAiYXJndiIsICJzdGFuZGFsb25lIiwKKyAgICAgICAgImV4Y2x1ZGU9IiwgImluY2x1ZGU9IiwgInBhY2thZ2U9IiwgInN0cmlwIiwgImljb25maWxlPSIsCisgICAgICAgICJsaWI9IikKIAotCXRyeToKLQkJb3B0aW9ucywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCBzaG9ydG9wdHMsIGxvbmdvcHRzKQotCWV4Y2VwdCBnZXRvcHQuZXJyb3I6Ci0JCXVzYWdlKCkKKyAgICB0cnk6CisgICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgc2hvcnRvcHRzLCBsb25nb3B0cykKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yOgorICAgICAgICB1c2FnZSgpCiAKLQlmb3Igb3B0LCBhcmcgaW4gb3B0aW9uczoKLQkJaWYgb3B0IGluICgnLWInLCAnLS1idWlsZGRpcicpOgotCQkJYnVpbGRlci5idWlsZGRpciA9IGFyZwotCQllbGlmIG9wdCBpbiAoJy1uJywgJy0tbmFtZScpOgotCQkJYnVpbGRlci5uYW1lID0gYXJnCi0JCWVsaWYgb3B0IGluICgnLXInLCAnLS1yZXNvdXJjZScpOgotCQkJYnVpbGRlci5yZXNvdXJjZXMuYXBwZW5kKGFyZykKLQkJZWxpZiBvcHQgaW4gKCctZicsICctLWZpbGUnKToKLQkJCXNyY2RzdCA9IGFyZy5zcGxpdCgnOicpCi0JCQlpZiBsZW4oc3JjZHN0KSAhPSAyOgotCQkJCXVzYWdlKCItZiBvciAtLWZpbGUgYXJndW1lbnQgbXVzdCBiZSB0d28gcGF0aHMsICIKLQkJCQkgICAgICAic2VwYXJhdGVkIGJ5IGEgY29sb24iKQotCQkJYnVpbGRlci5maWxlcy5hcHBlbmQoc3JjZHN0KQotCQllbGlmIG9wdCBpbiAoJy1lJywgJy0tZXhlY3V0YWJsZScpOgotCQkJYnVpbGRlci5leGVjdXRhYmxlID0gYXJnCi0JCWVsaWYgb3B0IGluICgnLW0nLCAnLS1tYWlucHJvZ3JhbScpOgotCQkJYnVpbGRlci5tYWlucHJvZ3JhbSA9IGFyZwotCQllbGlmIG9wdCBpbiAoJy1hJywgJy0tYXJndicpOgotCQkJYnVpbGRlci5hcmd2X2VtdWxhdGlvbiA9IDEKLQkJZWxpZiBvcHQgaW4gKCctYycsICctLWNyZWF0b3InKToKLQkJCWJ1aWxkZXIuY3JlYXRvciA9IGFyZwotCQllbGlmIG9wdCA9PSAnLS1pY29uZmlsZSc6Ci0JCQlidWlsZGVyLmljb25maWxlID0gYXJnCi0JCWVsaWYgb3B0ID09ICItLWxpYiI6Ci0JCQlidWlsZGVyLmxpYnMuYXBwZW5kKGFyZykKLQkJZWxpZiBvcHQgPT0gIi0tbmliIjoKLQkJCWJ1aWxkZXIubmlibmFtZSA9IGFyZwotCQllbGlmIG9wdCBpbiAoJy1wJywgJy0tcGxpc3QnKToKLQkJCWJ1aWxkZXIucGxpc3QgPSBQbGlzdC5mcm9tRmlsZShhcmcpCi0JCWVsaWYgb3B0IGluICgnLWwnLCAnLS1saW5rJyk6Ci0JCQlidWlsZGVyLnN5bWxpbmsgPSAxCi0JCWVsaWYgb3B0ID09ICctLWxpbmstZXhlYyc6Ci0JCQlidWlsZGVyLnN5bWxpbmtfZXhlYyA9IDEKLQkJZWxpZiBvcHQgaW4gKCctaCcsICctLWhlbHAnKToKLQkJCXVzYWdlKCkKLQkJZWxpZiBvcHQgaW4gKCctdicsICctLXZlcmJvc2UnKToKLQkJCWJ1aWxkZXIudmVyYm9zaXR5ICs9IDEKLQkJZWxpZiBvcHQgaW4gKCctcScsICctLXF1aWV0Jyk6Ci0JCQlidWlsZGVyLnZlcmJvc2l0eSAtPSAxCi0JCWVsaWYgb3B0ID09ICctLXN0YW5kYWxvbmUnOgotCQkJYnVpbGRlci5zdGFuZGFsb25lID0gMQotCQllbGlmIG9wdCBpbiAoJy14JywgJy0tZXhjbHVkZScpOgotCQkJYnVpbGRlci5leGNsdWRlTW9kdWxlcy5hcHBlbmQoYXJnKQotCQllbGlmIG9wdCBpbiAoJy1pJywgJy0taW5jbHVkZScpOgotCQkJYnVpbGRlci5pbmNsdWRlTW9kdWxlcy5hcHBlbmQoYXJnKQotCQllbGlmIG9wdCA9PSAnLS1wYWNrYWdlJzoKLQkJCWJ1aWxkZXIuaW5jbHVkZVBhY2thZ2VzLmFwcGVuZChhcmcpCi0JCWVsaWYgb3B0ID09ICctLXN0cmlwJzoKLQkJCWJ1aWxkZXIuc3RyaXAgPSAxCisgICAgZm9yIG9wdCwgYXJnIGluIG9wdGlvbnM6CisgICAgICAgIGlmIG9wdCBpbiAoJy1iJywgJy0tYnVpbGRkaXInKToKKyAgICAgICAgICAgIGJ1aWxkZXIuYnVpbGRkaXIgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctbicsICctLW5hbWUnKToKKyAgICAgICAgICAgIGJ1aWxkZXIubmFtZSA9IGFyZworICAgICAgICBlbGlmIG9wdCBpbiAoJy1yJywgJy0tcmVzb3VyY2UnKToKKyAgICAgICAgICAgIGJ1aWxkZXIucmVzb3VyY2VzLmFwcGVuZChhcmcpCisgICAgICAgIGVsaWYgb3B0IGluICgnLWYnLCAnLS1maWxlJyk6CisgICAgICAgICAgICBzcmNkc3QgPSBhcmcuc3BsaXQoJzonKQorICAgICAgICAgICAgaWYgbGVuKHNyY2RzdCkgIT0gMjoKKyAgICAgICAgICAgICAgICB1c2FnZSgiLWYgb3IgLS1maWxlIGFyZ3VtZW50IG11c3QgYmUgdHdvIHBhdGhzLCAiCisgICAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRlZCBieSBhIGNvbG9uIikKKyAgICAgICAgICAgIGJ1aWxkZXIuZmlsZXMuYXBwZW5kKHNyY2RzdCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctZScsICctLWV4ZWN1dGFibGUnKToKKyAgICAgICAgICAgIGJ1aWxkZXIuZXhlY3V0YWJsZSA9IGFyZworICAgICAgICBlbGlmIG9wdCBpbiAoJy1tJywgJy0tbWFpbnByb2dyYW0nKToKKyAgICAgICAgICAgIGJ1aWxkZXIubWFpbnByb2dyYW0gPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctYScsICctLWFyZ3YnKToKKyAgICAgICAgICAgIGJ1aWxkZXIuYXJndl9lbXVsYXRpb24gPSAxCisgICAgICAgIGVsaWYgb3B0IGluICgnLWMnLCAnLS1jcmVhdG9yJyk6CisgICAgICAgICAgICBidWlsZGVyLmNyZWF0b3IgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0taWNvbmZpbGUnOgorICAgICAgICAgICAgYnVpbGRlci5pY29uZmlsZSA9IGFyZworICAgICAgICBlbGlmIG9wdCA9PSAiLS1saWIiOgorICAgICAgICAgICAgYnVpbGRlci5saWJzLmFwcGVuZChhcmcpCisgICAgICAgIGVsaWYgb3B0ID09ICItLW5pYiI6CisgICAgICAgICAgICBidWlsZGVyLm5pYm5hbWUgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctcCcsICctLXBsaXN0Jyk6CisgICAgICAgICAgICBidWlsZGVyLnBsaXN0ID0gUGxpc3QuZnJvbUZpbGUoYXJnKQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1sJywgJy0tbGluaycpOgorICAgICAgICAgICAgYnVpbGRlci5zeW1saW5rID0gMQorICAgICAgICBlbGlmIG9wdCA9PSAnLS1saW5rLWV4ZWMnOgorICAgICAgICAgICAgYnVpbGRlci5zeW1saW5rX2V4ZWMgPSAxCisgICAgICAgIGVsaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6CisgICAgICAgICAgICB1c2FnZSgpCisgICAgICAgIGVsaWYgb3B0IGluICgnLXYnLCAnLS12ZXJib3NlJyk6CisgICAgICAgICAgICBidWlsZGVyLnZlcmJvc2l0eSArPSAxCisgICAgICAgIGVsaWYgb3B0IGluICgnLXEnLCAnLS1xdWlldCcpOgorICAgICAgICAgICAgYnVpbGRlci52ZXJib3NpdHkgLT0gMQorICAgICAgICBlbGlmIG9wdCA9PSAnLS1zdGFuZGFsb25lJzoKKyAgICAgICAgICAgIGJ1aWxkZXIuc3RhbmRhbG9uZSA9IDEKKyAgICAgICAgZWxpZiBvcHQgaW4gKCcteCcsICctLWV4Y2x1ZGUnKToKKyAgICAgICAgICAgIGJ1aWxkZXIuZXhjbHVkZU1vZHVsZXMuYXBwZW5kKGFyZykKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctaScsICctLWluY2x1ZGUnKToKKyAgICAgICAgICAgIGJ1aWxkZXIuaW5jbHVkZU1vZHVsZXMuYXBwZW5kKGFyZykKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0tcGFja2FnZSc6CisgICAgICAgICAgICBidWlsZGVyLmluY2x1ZGVQYWNrYWdlcy5hcHBlbmQoYXJnKQorICAgICAgICBlbGlmIG9wdCA9PSAnLS1zdHJpcCc6CisgICAgICAgICAgICBidWlsZGVyLnN0cmlwID0gMQogCi0JaWYgbGVuKGFyZ3MpICE9IDE6Ci0JCXVzYWdlKCJNdXN0IHNwZWNpZnkgb25lIGNvbW1hbmQgKCdidWlsZCcsICdyZXBvcnQnIG9yICdoZWxwJykiKQotCWNvbW1hbmQgPSBhcmdzWzBdCisgICAgaWYgbGVuKGFyZ3MpICE9IDE6CisgICAgICAgIHVzYWdlKCJNdXN0IHNwZWNpZnkgb25lIGNvbW1hbmQgKCdidWlsZCcsICdyZXBvcnQnIG9yICdoZWxwJykiKQorICAgIGNvbW1hbmQgPSBhcmdzWzBdCiAKLQlpZiBjb21tYW5kID09ICJidWlsZCI6Ci0JCWJ1aWxkZXIuc2V0dXAoKQotCQlidWlsZGVyLmJ1aWxkKCkKLQllbGlmIGNvbW1hbmQgPT0gInJlcG9ydCI6Ci0JCWJ1aWxkZXIuc2V0dXAoKQotCQlidWlsZGVyLnJlcG9ydCgpCi0JZWxpZiBjb21tYW5kID09ICJoZWxwIjoKLQkJdXNhZ2UoKQotCWVsc2U6Ci0JCXVzYWdlKCJVbmtub3duIGNvbW1hbmQgJyVzJyIgJSBjb21tYW5kKQorICAgIGlmIGNvbW1hbmQgPT0gImJ1aWxkIjoKKyAgICAgICAgYnVpbGRlci5zZXR1cCgpCisgICAgICAgIGJ1aWxkZXIuYnVpbGQoKQorICAgIGVsaWYgY29tbWFuZCA9PSAicmVwb3J0IjoKKyAgICAgICAgYnVpbGRlci5zZXR1cCgpCisgICAgICAgIGJ1aWxkZXIucmVwb3J0KCkKKyAgICBlbGlmIGNvbW1hbmQgPT0gImhlbHAiOgorICAgICAgICB1c2FnZSgpCisgICAgZWxzZToKKyAgICAgICAgdXNhZ2UoIlVua25vd24gY29tbWFuZCAnJXMnIiAlIGNvbW1hbmQpCiAKIAogZGVmIGJ1aWxkYXBwKCoqa3dhcmdzKToKLQlidWlsZGVyID0gQXBwQnVpbGRlcigqKmt3YXJncykKLQltYWluKGJ1aWxkZXIpCisgICAgYnVpbGRlciA9IEFwcEJ1aWxkZXIoKiprd2FyZ3MpCisgICAgbWFpbihidWlsZGVyKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvY2ZtZmlsZS5weSBiL0xpYi9wbGF0LW1hYy9jZm1maWxlLnB5CmluZGV4IGE0ZWVjZjIuLjMxNzA0NmEgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9jZm1maWxlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9jZm1maWxlLnB5CkBAIC0xOCwxNjcgKzE4LDE2NyBAQAogQlVGU0laRSA9IDB4ODAwMDAKIAogZGVmIG1lcmdlY2ZtZmlsZXMoc3JjbGlzdCwgZHN0LCBhcmNoaXRlY3R1cmUgPSAnZmF0Jyk6Ci0JIiIiTWVyZ2UgYWxsIGZpbGVzIGluIHNyY2xpc3QgaW50byBhIG5ldyBmaWxlIGRzdC4gCi0JCi0JSWYgYXJjaGl0ZWN0dXJlIGlzIGdpdmVuLCBvbmx5IGNvZGUgZnJhZ21lbnRzIG9mIHRoYXQgdHlwZSB3aWxsIGJlIHVzZWQ6Ci0JInB3cGMiIGZvciBQUEMsICJtNjhrIiBmb3IgY2ZtNjhrLiBUaGlzIGRvZXMgbm90IHdvcmsgZm9yICJjbGFzc2ljIgotCTY4ayBjb2RlLCBzaW5jZSBpdCBkb2VzIG5vdCB1c2UgY29kZSBmcmFnbWVudHMgdG8gYmVnaW4gd2l0aC4KLQlJZiBhcmNoaXRlY3R1cmUgaXMgTm9uZSwgYWxsIGZyYWdtZW50cyB3aWxsIGJlIHVzZWQsIGVuYWJsaW5nIEZBVCBiaW5hcmllcy4KLQkiIiIKLQkKLQlzcmNsaXN0ID0gbGlzdChzcmNsaXN0KQotCWZvciBpIGluIHJhbmdlKGxlbihzcmNsaXN0KSk6Ci0JCXNyY2xpc3RbaV0gPSBDYXJib24uRmlsZS5wYXRobmFtZShzcmNsaXN0W2ldKQotCWRzdCA9IENhcmJvbi5GaWxlLnBhdGhuYW1lKGRzdCkKLQkKLQlkc3RmaWxlID0gb3Blbihkc3QsICJ3YiIpCi0JcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoZHN0LCAzKQotCXRyeToKLQkJZHN0Y2ZyZyA9IENmcmdSZXNvdXJjZSgpCi0JCWZvciBzcmMgaW4gc3JjbGlzdDoKLQkJCXNyY2NmcmcgPSBDZnJnUmVzb3VyY2Uoc3JjKQotCQkJZm9yIGZyYWcgaW4gc3JjY2ZyZy5mcmFnbWVudHM6Ci0JCQkJaWYgZnJhZy5hcmNoaXRlY3R1cmUgPT0gJ3B3cGMnIGFuZCBhcmNoaXRlY3R1cmUgPT0gJ202OGsnOgotCQkJCQljb250aW51ZQotCQkJCWlmIGZyYWcuYXJjaGl0ZWN0dXJlID09ICdtNjhrJyBhbmQgYXJjaGl0ZWN0dXJlID09ICdwd3BjJzoKLQkJCQkJY29udGludWUKLQkJCQlkc3RjZnJnLmFwcGVuZChmcmFnKQotCQkJCQotCQkJCWZyYWcuY29weWRhdGEoZHN0ZmlsZSkKLQkJCQkKLQkJY2ZyZ3JlcyA9IFJlcy5SZXNvdXJjZShkc3RjZnJnLmJ1aWxkKCkpCi0JCVJlcy5Vc2VSZXNGaWxlKHJmKQotCQljZnJncmVzLkFkZFJlc291cmNlKCdjZnJnJywgMCwgIiIpCi0JZmluYWxseToKLQkJZHN0ZmlsZS5jbG9zZSgpCi0JCXJmID0gUmVzLkNsb3NlUmVzRmlsZShyZikKKyAgICAiIiJNZXJnZSBhbGwgZmlsZXMgaW4gc3JjbGlzdCBpbnRvIGEgbmV3IGZpbGUgZHN0LiAKKyAgICAKKyAgICBJZiBhcmNoaXRlY3R1cmUgaXMgZ2l2ZW4sIG9ubHkgY29kZSBmcmFnbWVudHMgb2YgdGhhdCB0eXBlIHdpbGwgYmUgdXNlZDoKKyAgICAicHdwYyIgZm9yIFBQQywgIm02OGsiIGZvciBjZm02OGsuIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgImNsYXNzaWMiCisgICAgNjhrIGNvZGUsIHNpbmNlIGl0IGRvZXMgbm90IHVzZSBjb2RlIGZyYWdtZW50cyB0byBiZWdpbiB3aXRoLgorICAgIElmIGFyY2hpdGVjdHVyZSBpcyBOb25lLCBhbGwgZnJhZ21lbnRzIHdpbGwgYmUgdXNlZCwgZW5hYmxpbmcgRkFUIGJpbmFyaWVzLgorICAgICIiIgorICAgIAorICAgIHNyY2xpc3QgPSBsaXN0KHNyY2xpc3QpCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNyY2xpc3QpKToKKyAgICAgICAgc3JjbGlzdFtpXSA9IENhcmJvbi5GaWxlLnBhdGhuYW1lKHNyY2xpc3RbaV0pCisgICAgZHN0ID0gQ2FyYm9uLkZpbGUucGF0aG5hbWUoZHN0KQorICAgIAorICAgIGRzdGZpbGUgPSBvcGVuKGRzdCwgIndiIikKKyAgICByZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShkc3QsIDMpCisgICAgdHJ5OgorICAgICAgICBkc3RjZnJnID0gQ2ZyZ1Jlc291cmNlKCkKKyAgICAgICAgZm9yIHNyYyBpbiBzcmNsaXN0OgorICAgICAgICAgICAgc3JjY2ZyZyA9IENmcmdSZXNvdXJjZShzcmMpCisgICAgICAgICAgICBmb3IgZnJhZyBpbiBzcmNjZnJnLmZyYWdtZW50czoKKyAgICAgICAgICAgICAgICBpZiBmcmFnLmFyY2hpdGVjdHVyZSA9PSAncHdwYycgYW5kIGFyY2hpdGVjdHVyZSA9PSAnbTY4ayc6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgZnJhZy5hcmNoaXRlY3R1cmUgPT0gJ202OGsnIGFuZCBhcmNoaXRlY3R1cmUgPT0gJ3B3cGMnOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRzdGNmcmcuYXBwZW5kKGZyYWcpCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZnJhZy5jb3B5ZGF0YShkc3RmaWxlKQorICAgICAgICAgICAgICAgIAorICAgICAgICBjZnJncmVzID0gUmVzLlJlc291cmNlKGRzdGNmcmcuYnVpbGQoKSkKKyAgICAgICAgUmVzLlVzZVJlc0ZpbGUocmYpCisgICAgICAgIGNmcmdyZXMuQWRkUmVzb3VyY2UoJ2NmcmcnLCAwLCAiIikKKyAgICBmaW5hbGx5OgorICAgICAgICBkc3RmaWxlLmNsb3NlKCkKKyAgICAgICAgcmYgPSBSZXMuQ2xvc2VSZXNGaWxlKHJmKQogCiAKIGNsYXNzIENmcmdSZXNvdXJjZToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcGF0aCA9IE5vbmUpOgotCQlzZWxmLnZlcnNpb24gPSAxCi0JCXNlbGYuZnJhZ21lbnRzID0gW10KLQkJc2VsZi5wYXRoID0gcGF0aAotCQlpZiBwYXRoIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLQkJCWN1cnJlbnRyZXNyZWYgPSBSZXMuQ3VyUmVzRmlsZSgpCi0JCQlyZXNyZWYgPSBSZXMuRlNwT3BlblJlc0ZpbGUocGF0aCwgMSkKLQkJCVJlcy5Vc2VSZXNGaWxlKHJlc3JlZikKLQkJCXRyeToKLQkJCQl0cnk6Ci0JCQkJCWRhdGEgPSBSZXMuR2V0MVJlc291cmNlKCdjZnJnJywgMCkuZGF0YQotCQkJCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQkJCXJhaXNlIFJlcy5FcnJvciwgIm5vICdjZnJnJyByZXNvdXJjZSBmb3VuZCIsIHN5cy5leGNfdHJhY2ViYWNrCi0JCQlmaW5hbGx5OgotCQkJCVJlcy5DbG9zZVJlc0ZpbGUocmVzcmVmKQotCQkJCVJlcy5Vc2VSZXNGaWxlKGN1cnJlbnRyZXNyZWYpCi0JCQlzZWxmLnBhcnNlKGRhdGEpCi0JCQlpZiBzZWxmLnZlcnNpb24gPD4gMToKLQkJCQlyYWlzZSBlcnJvciwgInVua25vd24gJ2NmcmcnIHJlc291cmNlIGZvcm1hdCIJCi0JCi0JZGVmIHBhcnNlKHNlbGYsIGRhdGEpOgotCQkocmVzMSwgcmVzMiwgc2VsZi52ZXJzaW9uLCAKLQkJCXJlczMsIHJlczQsIHJlczUsIHJlczYsIAotCQkJc2VsZi5tZW1iZXJDb3VudCkgPSBzdHJ1Y3QudW5wYWNrKCI4bCIsIGRhdGFbOjMyXSkKLQkJZGF0YSA9IGRhdGFbMzI6XQotCQl3aGlsZSBkYXRhOgotCQkJZnJhZyA9IEZyYWdtZW50RGVzY3JpcHRvcihzZWxmLnBhdGgsIGRhdGEpCi0JCQlkYXRhID0gZGF0YVtmcmFnLm1lbWJlclNpemU6XQotCQkJc2VsZi5mcmFnbWVudHMuYXBwZW5kKGZyYWcpCi0JCi0JZGVmIGJ1aWxkKHNlbGYpOgotCQlzZWxmLm1lbWJlckNvdW50ID0gbGVuKHNlbGYuZnJhZ21lbnRzKQotCQlkYXRhID0gc3RydWN0LnBhY2soIjhsIiwgMCwgMCwgc2VsZi52ZXJzaW9uLCAwLCAwLCAwLCAwLCBzZWxmLm1lbWJlckNvdW50KQotCQlmb3IgZnJhZyBpbiBzZWxmLmZyYWdtZW50czoKLQkJCWRhdGEgPSBkYXRhICsgZnJhZy5idWlsZCgpCi0JCXJldHVybiBkYXRhCi0JCi0JZGVmIGFwcGVuZChzZWxmLCBmcmFnKToKLQkJc2VsZi5mcmFnbWVudHMuYXBwZW5kKGZyYWcpCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGggPSBOb25lKToKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gMQorICAgICAgICBzZWxmLmZyYWdtZW50cyA9IFtdCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBjdXJyZW50cmVzcmVmID0gUmVzLkN1clJlc0ZpbGUoKQorICAgICAgICAgICAgcmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHBhdGgsIDEpCisgICAgICAgICAgICBSZXMuVXNlUmVzRmlsZShyZXNyZWYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gUmVzLkdldDFSZXNvdXJjZSgnY2ZyZycsIDApLmRhdGEKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSZXMuRXJyb3IsICJubyAnY2ZyZycgcmVzb3VyY2UgZm91bmQiLCBzeXMuZXhjX3RyYWNlYmFjaworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBSZXMuQ2xvc2VSZXNGaWxlKHJlc3JlZikKKyAgICAgICAgICAgICAgICBSZXMuVXNlUmVzRmlsZShjdXJyZW50cmVzcmVmKQorICAgICAgICAgICAgc2VsZi5wYXJzZShkYXRhKQorICAgICAgICAgICAgaWYgc2VsZi52ZXJzaW9uIDw+IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmtub3duICdjZnJnJyByZXNvdXJjZSBmb3JtYXQiICAgCisgICAgCisgICAgZGVmIHBhcnNlKHNlbGYsIGRhdGEpOgorICAgICAgICAocmVzMSwgcmVzMiwgc2VsZi52ZXJzaW9uLCAKKyAgICAgICAgICAgIHJlczMsIHJlczQsIHJlczUsIHJlczYsIAorICAgICAgICAgICAgc2VsZi5tZW1iZXJDb3VudCkgPSBzdHJ1Y3QudW5wYWNrKCI4bCIsIGRhdGFbOjMyXSkKKyAgICAgICAgZGF0YSA9IGRhdGFbMzI6XQorICAgICAgICB3aGlsZSBkYXRhOgorICAgICAgICAgICAgZnJhZyA9IEZyYWdtZW50RGVzY3JpcHRvcihzZWxmLnBhdGgsIGRhdGEpCisgICAgICAgICAgICBkYXRhID0gZGF0YVtmcmFnLm1lbWJlclNpemU6XQorICAgICAgICAgICAgc2VsZi5mcmFnbWVudHMuYXBwZW5kKGZyYWcpCisgICAgCisgICAgZGVmIGJ1aWxkKHNlbGYpOgorICAgICAgICBzZWxmLm1lbWJlckNvdW50ID0gbGVuKHNlbGYuZnJhZ21lbnRzKQorICAgICAgICBkYXRhID0gc3RydWN0LnBhY2soIjhsIiwgMCwgMCwgc2VsZi52ZXJzaW9uLCAwLCAwLCAwLCAwLCBzZWxmLm1lbWJlckNvdW50KQorICAgICAgICBmb3IgZnJhZyBpbiBzZWxmLmZyYWdtZW50czoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgZnJhZy5idWlsZCgpCisgICAgICAgIHJldHVybiBkYXRhCisgICAgCisgICAgZGVmIGFwcGVuZChzZWxmLCBmcmFnKToKKyAgICAgICAgc2VsZi5mcmFnbWVudHMuYXBwZW5kKGZyYWcpCiAKIAogY2xhc3MgRnJhZ21lbnREZXNjcmlwdG9yOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBkYXRhID0gTm9uZSk6Ci0JCXNlbGYucGF0aCA9IHBhdGgKLQkJaWYgZGF0YSBpcyBub3QgTm9uZToKLQkJCXNlbGYucGFyc2UoZGF0YSkKLQkKLQlkZWYgcGFyc2Uoc2VsZiwgZGF0YSk6Ci0JCXNlbGYuYXJjaGl0ZWN0dXJlID0gZGF0YVs6NF0KLQkJKAlzZWxmLnVwZGF0ZWxldmVsLCAKLQkJCXNlbGYuY3VycmVudFZlcnNpb24sIAotCQkJc2VsZi5vbGREZWZWZXJzaW9uLCAKLQkJCXNlbGYuc3RhY2tzaXplLAotCQkJc2VsZi5hcHBsaWJkaXIsIAotCQkJc2VsZi5mcmFndHlwZSwKLQkJCXNlbGYud2hlcmUsCi0JCQlzZWxmLm9mZnNldCwKLQkJCXNlbGYubGVuZ3RoLAotCQkJc2VsZi5yZXMxLCBzZWxmLnJlczIsCi0JCQlzZWxmLm1lbWJlclNpemUsKSA9IHN0cnVjdC51bnBhY2soIjRsaEJCNGxoIiwgZGF0YVs0OjQyXSkKLQkJcG5hbWUgPSBkYXRhWzQyOnNlbGYubWVtYmVyU2l6ZV0KLQkJc2VsZi5uYW1lID0gcG5hbWVbMToxK29yZChwbmFtZVswXSldCi0JCi0JZGVmIGJ1aWxkKHNlbGYpOgotCQlkYXRhID0gc2VsZi5hcmNoaXRlY3R1cmUKLQkJZGF0YSA9IGRhdGEgKyBzdHJ1Y3QucGFjaygiNGxoQkI0bCIsCi0JCQkJc2VsZi51cGRhdGVsZXZlbCwgCi0JCQkJc2VsZi5jdXJyZW50VmVyc2lvbiwgCi0JCQkJc2VsZi5vbGREZWZWZXJzaW9uLCAKLQkJCQlzZWxmLnN0YWNrc2l6ZSwKLQkJCQlzZWxmLmFwcGxpYmRpciwgCi0JCQkJc2VsZi5mcmFndHlwZSwKLQkJCQlzZWxmLndoZXJlLAotCQkJCXNlbGYub2Zmc2V0LAotCQkJCXNlbGYubGVuZ3RoLAotCQkJCXNlbGYucmVzMSwgc2VsZi5yZXMyKQotCQlzZWxmLm1lbWJlclNpemUgPSBsZW4oZGF0YSkgKyAyICsgMSArIGxlbihzZWxmLm5hbWUpCi0JCSMgcGFkIHRvIDQgYnl0ZSBib3VuZGFyaWVzCi0JCWlmIHNlbGYubWVtYmVyU2l6ZSAlIDQ6Ci0JCQlzZWxmLm1lbWJlclNpemUgPSBzZWxmLm1lbWJlclNpemUgKyA0IC0gKHNlbGYubWVtYmVyU2l6ZSAlIDQpCi0JCWRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soImhiIiwgc2VsZi5tZW1iZXJTaXplLCBsZW4oc2VsZi5uYW1lKSkKLQkJZGF0YSA9IGRhdGEgKyBzZWxmLm5hbWUKLQkJZGF0YSA9IGRhdGEgKyAnXDAwMCcgKiAoc2VsZi5tZW1iZXJTaXplIC0gbGVuKGRhdGEpKQotCQlyZXR1cm4gZGF0YQotCQotCWRlZiBnZXRmcmFnbWVudChzZWxmKToKLQkJaWYgc2VsZi53aGVyZSA8PiAxOgotCQkJcmFpc2UgZXJyb3IsICJjYW4ndCByZWFkIGZyYWdtZW50LCB1bnN1cHBvcnRlZCBsb2NhdGlvbiIKLQkJZiA9IG9wZW4oc2VsZi5wYXRoLCAicmIiKQotCQlmLnNlZWsoc2VsZi5vZmZzZXQpCi0JCWlmIHNlbGYubGVuZ3RoOgotCQkJZnJhZyA9IGYucmVhZChzZWxmLmxlbmd0aCkKLQkJZWxzZToKLQkJCWZyYWcgPSBmLnJlYWQoKQotCQlmLmNsb3NlKCkKLQkJcmV0dXJuIGZyYWcKLQkKLQlkZWYgY29weWRhdGEoc2VsZiwgb3V0ZmlsZSk6Ci0JCWlmIHNlbGYud2hlcmUgPD4gMToKLQkJCXJhaXNlIGVycm9yLCAiY2FuJ3QgcmVhZCBmcmFnbWVudCwgdW5zdXBwb3J0ZWQgbG9jYXRpb24iCi0JCWluZmlsZSA9IG9wZW4oc2VsZi5wYXRoLCAicmIiKQotCQlpZiBzZWxmLmxlbmd0aCA9PSAwOgotCQkJaW5maWxlLnNlZWsoMCwgMikKLQkJCXNlbGYubGVuZ3RoID0gaW5maWxlLnRlbGwoKQotCQkKLQkJIyBQb3NpdGlvbiBpbnB1dCBmaWxlIGFuZCByZWNvcmQgbmV3IG9mZnNldCBmcm9tIG91dHB1dCBmaWxlCi0JCWluZmlsZS5zZWVrKHNlbGYub2Zmc2V0KQotCQkKLQkJIyBwYWQgdG8gMTYgYnl0ZSBib3VuZGFyaWVzCi0JCW9mZnNldCA9IG91dGZpbGUudGVsbCgpCi0JCWlmIG9mZnNldCAlIDE2OgotCQkJb2Zmc2V0ID0gb2Zmc2V0ICsgMTYgLSAob2Zmc2V0ICUgMTYpCi0JCW91dGZpbGUuc2VlayhvZmZzZXQpCi0JCXNlbGYub2Zmc2V0ID0gb2Zmc2V0Ci0JCQotCQlsID0gc2VsZi5sZW5ndGgKLQkJd2hpbGUgbDoKLQkJCWlmIGwgPiBCVUZTSVpFOgotCQkJCW91dGZpbGUud3JpdGUoaW5maWxlLnJlYWQoQlVGU0laRSkpCi0JCQkJbCA9IGwgLSBCVUZTSVpFCi0JCQllbHNlOgotCQkJCW91dGZpbGUud3JpdGUoaW5maWxlLnJlYWQobCkpCi0JCQkJbCA9IDAKLQkJaW5maWxlLmNsb3NlKCkKKyAgICAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZGF0YSA9IE5vbmUpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhcnNlKGRhdGEpCisgICAgCisgICAgZGVmIHBhcnNlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFyY2hpdGVjdHVyZSA9IGRhdGFbOjRdCisgICAgICAgICggICBzZWxmLnVwZGF0ZWxldmVsLCAKKyAgICAgICAgICAgIHNlbGYuY3VycmVudFZlcnNpb24sIAorICAgICAgICAgICAgc2VsZi5vbGREZWZWZXJzaW9uLCAKKyAgICAgICAgICAgIHNlbGYuc3RhY2tzaXplLAorICAgICAgICAgICAgc2VsZi5hcHBsaWJkaXIsIAorICAgICAgICAgICAgc2VsZi5mcmFndHlwZSwKKyAgICAgICAgICAgIHNlbGYud2hlcmUsCisgICAgICAgICAgICBzZWxmLm9mZnNldCwKKyAgICAgICAgICAgIHNlbGYubGVuZ3RoLAorICAgICAgICAgICAgc2VsZi5yZXMxLCBzZWxmLnJlczIsCisgICAgICAgICAgICBzZWxmLm1lbWJlclNpemUsKSA9IHN0cnVjdC51bnBhY2soIjRsaEJCNGxoIiwgZGF0YVs0OjQyXSkKKyAgICAgICAgcG5hbWUgPSBkYXRhWzQyOnNlbGYubWVtYmVyU2l6ZV0KKyAgICAgICAgc2VsZi5uYW1lID0gcG5hbWVbMToxK29yZChwbmFtZVswXSldCisgICAgCisgICAgZGVmIGJ1aWxkKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5hcmNoaXRlY3R1cmUKKyAgICAgICAgZGF0YSA9IGRhdGEgKyBzdHJ1Y3QucGFjaygiNGxoQkI0bCIsCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVsZXZlbCwgCisgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VmVyc2lvbiwgCisgICAgICAgICAgICAgICAgc2VsZi5vbGREZWZWZXJzaW9uLCAKKyAgICAgICAgICAgICAgICBzZWxmLnN0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGxpYmRpciwgCisgICAgICAgICAgICAgICAgc2VsZi5mcmFndHlwZSwKKyAgICAgICAgICAgICAgICBzZWxmLndoZXJlLAorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0LAorICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoLAorICAgICAgICAgICAgICAgIHNlbGYucmVzMSwgc2VsZi5yZXMyKQorICAgICAgICBzZWxmLm1lbWJlclNpemUgPSBsZW4oZGF0YSkgKyAyICsgMSArIGxlbihzZWxmLm5hbWUpCisgICAgICAgICMgcGFkIHRvIDQgYnl0ZSBib3VuZGFyaWVzCisgICAgICAgIGlmIHNlbGYubWVtYmVyU2l6ZSAlIDQ6CisgICAgICAgICAgICBzZWxmLm1lbWJlclNpemUgPSBzZWxmLm1lbWJlclNpemUgKyA0IC0gKHNlbGYubWVtYmVyU2l6ZSAlIDQpCisgICAgICAgIGRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soImhiIiwgc2VsZi5tZW1iZXJTaXplLCBsZW4oc2VsZi5uYW1lKSkKKyAgICAgICAgZGF0YSA9IGRhdGEgKyBzZWxmLm5hbWUKKyAgICAgICAgZGF0YSA9IGRhdGEgKyAnXDAwMCcgKiAoc2VsZi5tZW1iZXJTaXplIC0gbGVuKGRhdGEpKQorICAgICAgICByZXR1cm4gZGF0YQorICAgIAorICAgIGRlZiBnZXRmcmFnbWVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi53aGVyZSA8PiAxOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJjYW4ndCByZWFkIGZyYWdtZW50LCB1bnN1cHBvcnRlZCBsb2NhdGlvbiIKKyAgICAgICAgZiA9IG9wZW4oc2VsZi5wYXRoLCAicmIiKQorICAgICAgICBmLnNlZWsoc2VsZi5vZmZzZXQpCisgICAgICAgIGlmIHNlbGYubGVuZ3RoOgorICAgICAgICAgICAgZnJhZyA9IGYucmVhZChzZWxmLmxlbmd0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyYWcgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIGZyYWcKKyAgICAKKyAgICBkZWYgY29weWRhdGEoc2VsZiwgb3V0ZmlsZSk6CisgICAgICAgIGlmIHNlbGYud2hlcmUgPD4gMToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiY2FuJ3QgcmVhZCBmcmFnbWVudCwgdW5zdXBwb3J0ZWQgbG9jYXRpb24iCisgICAgICAgIGluZmlsZSA9IG9wZW4oc2VsZi5wYXRoLCAicmIiKQorICAgICAgICBpZiBzZWxmLmxlbmd0aCA9PSAwOgorICAgICAgICAgICAgaW5maWxlLnNlZWsoMCwgMikKKyAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gaW5maWxlLnRlbGwoKQorICAgICAgICAKKyAgICAgICAgIyBQb3NpdGlvbiBpbnB1dCBmaWxlIGFuZCByZWNvcmQgbmV3IG9mZnNldCBmcm9tIG91dHB1dCBmaWxlCisgICAgICAgIGluZmlsZS5zZWVrKHNlbGYub2Zmc2V0KQorICAgICAgICAKKyAgICAgICAgIyBwYWQgdG8gMTYgYnl0ZSBib3VuZGFyaWVzCisgICAgICAgIG9mZnNldCA9IG91dGZpbGUudGVsbCgpCisgICAgICAgIGlmIG9mZnNldCAlIDE2OgorICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMTYgLSAob2Zmc2V0ICUgMTYpCisgICAgICAgIG91dGZpbGUuc2VlayhvZmZzZXQpCisgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIAorICAgICAgICBsID0gc2VsZi5sZW5ndGgKKyAgICAgICAgd2hpbGUgbDoKKyAgICAgICAgICAgIGlmIGwgPiBCVUZTSVpFOgorICAgICAgICAgICAgICAgIG91dGZpbGUud3JpdGUoaW5maWxlLnJlYWQoQlVGU0laRSkpCisgICAgICAgICAgICAgICAgbCA9IGwgLSBCVUZTSVpFCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dGZpbGUud3JpdGUoaW5maWxlLnJlYWQobCkpCisgICAgICAgICAgICAgICAgbCA9IDAKKyAgICAgICAgaW5maWxlLmNsb3NlKCkKIApkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL2ZpbmRlcnRvb2xzLnB5IGIvTGliL3BsYXQtbWFjL2ZpbmRlcnRvb2xzLnB5CmluZGV4IDVhZGQwNWYuLmIzMjIzYmQgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9maW5kZXJ0b29scy5weQorKysgYi9MaWIvcGxhdC1tYWMvZmluZGVydG9vbHMucHkKQEAgLTMwLDgwMyArMzAsODAzIEBACiBfZmluZGVyX3RhbGtlciA9IE5vbmUKIAogZGVmIF9nZXRmaW5kZXIoKToKLQkiIiJyZXR1cm5zIGJhc2ljIChyZWN5Y2xhYmxlKSBGaW5kZXIgQUUgaW50ZXJmYWNlIG9iamVjdCIiIgotCWdsb2JhbCBfZmluZGVyX3RhbGtlcgotCWlmIG5vdCBfZmluZGVyX3RhbGtlcjoKLQkJX2ZpbmRlcl90YWxrZXIgPSBGaW5kZXIuRmluZGVyKCkKLQlfZmluZGVyX3RhbGtlci5zZW5kX2ZsYWdzID0gKCBfZmluZGVyX3RhbGtlci5zZW5kX2ZsYWdzIHwgCi0JCUFwcGxlRXZlbnRzLmtBRUNhbkludGVyYWN0IHwgQXBwbGVFdmVudHMua0FFQ2FuU3dpdGNoTGF5ZXIpCi0JcmV0dXJuIF9maW5kZXJfdGFsa2VyCi0JCisgICAgIiIicmV0dXJucyBiYXNpYyAocmVjeWNsYWJsZSkgRmluZGVyIEFFIGludGVyZmFjZSBvYmplY3QiIiIKKyAgICBnbG9iYWwgX2ZpbmRlcl90YWxrZXIKKyAgICBpZiBub3QgX2ZpbmRlcl90YWxrZXI6CisgICAgICAgIF9maW5kZXJfdGFsa2VyID0gRmluZGVyLkZpbmRlcigpCisgICAgX2ZpbmRlcl90YWxrZXIuc2VuZF9mbGFncyA9ICggX2ZpbmRlcl90YWxrZXIuc2VuZF9mbGFncyB8IAorICAgICAgICBBcHBsZUV2ZW50cy5rQUVDYW5JbnRlcmFjdCB8IEFwcGxlRXZlbnRzLmtBRUNhblN3aXRjaExheWVyKQorICAgIHJldHVybiBfZmluZGVyX3RhbGtlcgorICAgIAogZGVmIGxhdW5jaChmaWxlKToKLQkiIiJPcGVuIGEgZmlsZSB0aHJ1IHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYyIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhmaWxlKQotCXJldHVybiBmaW5kZXIub3Blbihmc3MpCi0JCisgICAgIiIiT3BlbiBhIGZpbGUgdGhydSB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmc3MgPSBDYXJib24uRmlsZS5GU1NwZWMoZmlsZSkKKyAgICByZXR1cm4gZmluZGVyLm9wZW4oZnNzKQorICAgIAogZGVmIFByaW50KGZpbGUpOgotCSIiIlByaW50IGEgZmlsZSB0aHJ1IHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYyIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhmaWxlKQotCXJldHVybiBmaW5kZXIuX3ByaW50KGZzcykKLQkKKyAgICAiIiJQcmludCBhIGZpbGUgdGhydSB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmc3MgPSBDYXJib24uRmlsZS5GU1NwZWMoZmlsZSkKKyAgICByZXR1cm4gZmluZGVyLl9wcmludChmc3MpCisgICAgCiBkZWYgY29weShzcmMsIGRzdGRpcik6Ci0JIiIiQ29weSBhIGZpbGUgdG8gYSBmb2xkZXIiIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlpZiB0eXBlKHNyYykgPT0gdHlwZShbXSk6Ci0JCXNyY19mc3MgPSBbXQotCQlmb3IgcyBpbiBzcmM6Ci0JCQlzcmNfZnNzLmFwcGVuZChDYXJib24uRmlsZS5GU1NwZWMocykpCi0JZWxzZToKLQkJc3JjX2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhzcmMpCi0JZHN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkc3RkaXIpCi0JcmV0dXJuIGZpbmRlci5kdXBsaWNhdGUoc3JjX2ZzcywgdG89ZHN0X2ZzcykKKyAgICAiIiJDb3B5IGEgZmlsZSB0byBhIGZvbGRlciIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGlmIHR5cGUoc3JjKSA9PSB0eXBlKFtdKToKKyAgICAgICAgc3JjX2ZzcyA9IFtdCisgICAgICAgIGZvciBzIGluIHNyYzoKKyAgICAgICAgICAgIHNyY19mc3MuYXBwZW5kKENhcmJvbi5GaWxlLkZTU3BlYyhzKSkKKyAgICBlbHNlOgorICAgICAgICBzcmNfZnNzID0gQ2FyYm9uLkZpbGUuRlNTcGVjKHNyYykKKyAgICBkc3RfZnNzID0gQ2FyYm9uLkZpbGUuRlNTcGVjKGRzdGRpcikKKyAgICByZXR1cm4gZmluZGVyLmR1cGxpY2F0ZShzcmNfZnNzLCB0bz1kc3RfZnNzKQogCiBkZWYgbW92ZShzcmMsIGRzdGRpcik6Ci0JIiIiTW92ZSBhIGZpbGUgdG8gYSBmb2xkZXIiIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlpZiB0eXBlKHNyYykgPT0gdHlwZShbXSk6Ci0JCXNyY19mc3MgPSBbXQotCQlmb3IgcyBpbiBzcmM6Ci0JCQlzcmNfZnNzLmFwcGVuZChDYXJib24uRmlsZS5GU1NwZWMocykpCi0JZWxzZToKLQkJc3JjX2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhzcmMpCi0JZHN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkc3RkaXIpCi0JcmV0dXJuIGZpbmRlci5tb3ZlKHNyY19mc3MsIHRvPWRzdF9mc3MpCi0JCisgICAgIiIiTW92ZSBhIGZpbGUgdG8gYSBmb2xkZXIiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBpZiB0eXBlKHNyYykgPT0gdHlwZShbXSk6CisgICAgICAgIHNyY19mc3MgPSBbXQorICAgICAgICBmb3IgcyBpbiBzcmM6CisgICAgICAgICAgICBzcmNfZnNzLmFwcGVuZChDYXJib24uRmlsZS5GU1NwZWMocykpCisgICAgZWxzZToKKyAgICAgICAgc3JjX2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhzcmMpCisgICAgZHN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkc3RkaXIpCisgICAgcmV0dXJuIGZpbmRlci5tb3ZlKHNyY19mc3MsIHRvPWRzdF9mc3MpCisgICAgCiBkZWYgc2xlZXAoKToKLQkiIiJQdXQgdGhlIG1hYyB0byBzbGVlcCIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWZpbmRlci5zbGVlcCgpCi0JCisgICAgIiIiUHV0IHRoZSBtYWMgdG8gc2xlZXAiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmaW5kZXIuc2xlZXAoKQorICAgIAogZGVmIHNodXRkb3duKCk6Ci0JIiIiU2h1dCB0aGUgbWFjIGRvd24iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlmaW5kZXIuc2h1dF9kb3duKCkKLQkKKyAgICAiIiJTaHV0IHRoZSBtYWMgZG93biIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGZpbmRlci5zaHV0X2Rvd24oKQorICAgIAogZGVmIHJlc3RhcnQoKToKLQkiIiJSZXN0YXJ0IHRoZSBtYWMiIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlmaW5kZXIucmVzdGFydCgpCisgICAgIiIiUmVzdGFydCB0aGUgbWFjIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgZmluZGVyLnJlc3RhcnQoKQogCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMJQWRkaXRpb25hbCBmaW5kZXJ0b29scworIyAgIEFkZGl0aW9uYWwgZmluZGVydG9vbHMKICMKIAogZGVmIHJldmVhbChmaWxlKToKLQkiIiJSZXZlYWwgYSBmaWxlIGluIHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lLCBmc3JlZiBvciBmc3NwZWMuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZmlsZSkKLQlmaWxlX2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKLQlyZXR1cm4gZmluZGVyLnJldmVhbChmaWxlX2FsaWFzKQotCQorICAgICIiIlJldmVhbCBhIGZpbGUgaW4gdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUsIGZzcmVmIG9yIGZzc3BlYy4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmaWxlKQorICAgIGZpbGVfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIHJldHVybiBmaW5kZXIucmV2ZWFsKGZpbGVfYWxpYXMpCisgICAgCiBkZWYgc2VsZWN0KGZpbGUpOgotCSIiInNlbGVjdCBhIGZpbGUgaW4gdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUsIGZzcmVmIG9yIGZzc3BlYy4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmaWxlKQotCWZpbGVfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQotCXJldHVybiBmaW5kZXIuc2VsZWN0KGZpbGVfYWxpYXMpCi0JCisgICAgIiIic2VsZWN0IGEgZmlsZSBpbiB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSwgZnNyZWYgb3IgZnNzcGVjLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGZzciA9IENhcmJvbi5GaWxlLkZTUmVmKGZpbGUpCisgICAgZmlsZV9hbGlhcyA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgcmV0dXJuIGZpbmRlci5zZWxlY3QoZmlsZV9hbGlhcykKKyAgICAKIGRlZiB1cGRhdGUoZmlsZSk6Ci0JIiIiVXBkYXRlIHRoZSBkaXNwbGF5IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpIHRvIG1hdGNoIAotCXRoZWlyIG9uLWRpc2sgcmVwcmVzZW50YXRpb24uIFNwZWNpZnkgZmlsZSBieSBuYW1lLCBmc3JlZiBvciBmc3NwZWMuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZmlsZSkKLQlmaWxlX2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKLQlyZXR1cm4gZmluZGVyLnVwZGF0ZShmaWxlX2FsaWFzKQorICAgICIiIlVwZGF0ZSB0aGUgZGlzcGxheSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKSB0byBtYXRjaCAKKyAgICB0aGVpciBvbi1kaXNrIHJlcHJlc2VudGF0aW9uLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSwgZnNyZWYgb3IgZnNzcGVjLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGZzciA9IENhcmJvbi5GaWxlLkZTUmVmKGZpbGUpCisgICAgZmlsZV9hbGlhcyA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgcmV0dXJuIGZpbmRlci51cGRhdGUoZmlsZV9hbGlhcykKIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCU1vcmUgZmluZGVydG9vbHMKKyMgICBNb3JlIGZpbmRlcnRvb2xzCiAjCiAKIGRlZiBjb21tZW50KG9iamVjdCwgY29tbWVudD1Ob25lKToKLQkiIiJjb21tZW50OiBnZXQgb3Igc2V0IHRoZSBGaW5kZXItY29tbWVudCBvZiB0aGUgaXRlbSwgZGlzcGxheWVkIGluIHRoZSAnR2V0IEluZm8nIHdpbmRvdy4iIiIKLQlvYmplY3QgPSBDYXJib24uRmlsZS5GU1JlZihvYmplY3QpCi0Jb2JqZWN0X2FsaWFzID0gb2JqZWN0LkZTTmV3QWxpYXNNb25pbWFsKCkKLQlpZiBjb21tZW50ID09IE5vbmU6Ci0JCXJldHVybiBfZ2V0Y29tbWVudChvYmplY3RfYWxpYXMpCi0JZWxzZToKLQkJcmV0dXJuIF9zZXRjb21tZW50KG9iamVjdF9hbGlhcywgY29tbWVudCkKLQkKKyAgICAiIiJjb21tZW50OiBnZXQgb3Igc2V0IHRoZSBGaW5kZXItY29tbWVudCBvZiB0aGUgaXRlbSwgZGlzcGxheWVkIGluIHRoZSAnR2V0IEluZm8nIHdpbmRvdy4iIiIKKyAgICBvYmplY3QgPSBDYXJib24uRmlsZS5GU1JlZihvYmplY3QpCisgICAgb2JqZWN0X2FsaWFzID0gb2JqZWN0LkZTTmV3QWxpYXNNb25pbWFsKCkKKyAgICBpZiBjb21tZW50ID09IE5vbmU6CisgICAgICAgIHJldHVybiBfZ2V0Y29tbWVudChvYmplY3RfYWxpYXMpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9zZXRjb21tZW50KG9iamVjdF9hbGlhcywgY29tbWVudCkKKyAgICAKIGRlZiBfc2V0Y29tbWVudChvYmplY3RfYWxpYXMsIGNvbW1lbnQpOgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY29tdCcpLCBmcj1hZW9ial8wMCkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQotCWFyZ3NbImRhdGEiXSA9IGNvbW1lbnQKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorICAgIGFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjb210JyksIGZyPWFlb2JqXzAwKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisgICAgYXJnc1siZGF0YSJdID0gY29tbWVudAorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJzZXRkIiwgYXJncywgYXR0cnMpCisgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KIAogZGVmIF9nZXRjb21tZW50KG9iamVjdF9hbGlhcyk6Ci0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQotCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjb210JyksIGZyPWFlb2JqXzAwKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY29tdCcpLCBmcj1hZW9ial8wMCkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCUdldCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHByb2Nlc3NlcyBpbiB0aGUgRmluZGVyLgorIyAgIEdldCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHByb2Nlc3NlcyBpbiB0aGUgRmluZGVyLgogCiBkZWYgcHJvY2Vzc2VzKCk6Ci0JIiIicHJvY2Vzc2VzIHJldHVybnMgYSBsaXN0IG9mIGFsbCBhY3RpdmUgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhpcyBjb21wdXRlciBhbmQgdGhlaXIgY3JlYXRvcnMuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCXByb2Nlc3NuYW1lcyA9IFtdCi0JcHJvY2Vzc251bWJlcnMgPSBbXQotCWNyZWF0b3JzID0gW10KLQlwYXJ0aXRpb25zID0gW10KLQl1c2VkID0gW10KLQkjIyBnZXQgdGhlIHByb2Nlc3NuYW1lcyBvciBlbHNlIHRoZSBwcm9jZXNzbnVtYmVycwotCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFldHlwZXMuVW5rbm93bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlwID0gW10KLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcCA9ICBhcmdzWyctLS0tJ10KLQkJZm9yIHByb2MgaW4gcDoKLQkJCWlmIGhhc2F0dHIocHJvYywgJ3NlbGQnKToKLQkJCQkjIGl0IGhhcyBhIHJlYWwgbmFtZQotCQkJCXByb2Nlc3NuYW1lcy5hcHBlbmQocHJvYy5zZWxkKQotCQkJZWxpZiBoYXNhdHRyKHByb2MsICd0eXBlJyk6Ci0JCQkJaWYgcHJvYy50eXBlID09ICJwc24gIjoKLQkJCQkJIyBpdCBoYXMgYSBwcm9jZXNzIG51bWJlcgotCQkJCQlwcm9jZXNzbnVtYmVycy5hcHBlbmQocHJvYy5kYXRhKQotCSMjIGdldCB0aGUgY3JlYXRvcnMKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFldHlwZXMuVW5rbm93bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpCi0JYXJnc1snLS0tLSddID0gIGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZmNydCcpLCBmcj1hZW9ial8wKQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmcpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXAgPSAgYXJnc1snLS0tLSddCi0JCWNyZWF0b3JzID0gcFs6XQotCSMjIGNvbmNhdGVuYXRlIGluIG9uZSBkaWN0Ci0JcmVzdWx0ID0gW10KLQlpZiBsZW4ocHJvY2Vzc25hbWVzKSA+IGxlbihwcm9jZXNzbnVtYmVycyk6Ci0JCWRhdGEgPSBwcm9jZXNzbmFtZXMKLQllbHNlOgotCQlkYXRhID0gcHJvY2Vzc251bWJlcnMKLQlmb3IgaSBpbiByYW5nZShsZW4oY3JlYXRvcnMpKToKLQkJcmVzdWx0LmFwcGVuZCgoZGF0YVtpXSwgY3JlYXRvcnNbaV0pKQotCXJldHVybiByZXN1bHQKKyAgICAiIiJwcm9jZXNzZXMgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGFjdGl2ZSBwcm9jZXNzZXMgcnVubmluZyBvbiB0aGlzIGNvbXB1dGVyIGFuZCB0aGVpciBjcmVhdG9ycy4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgcHJvY2Vzc25hbWVzID0gW10KKyAgICBwcm9jZXNzbnVtYmVycyA9IFtdCisgICAgY3JlYXRvcnMgPSBbXQorICAgIHBhcnRpdGlvbnMgPSBbXQorICAgIHVzZWQgPSBbXQorICAgICMjIGdldCB0aGUgcHJvY2Vzc25hbWVzIG9yIGVsc2UgdGhlIHByb2Nlc3NudW1iZXJzCisgICAgYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3ByY3MnKSwgZm9ybT0iaW5keCIsIHNlbGQ9YWV0eXBlcy5Vbmtub3duKCdhYnNvJywgImFsbCAiKSwgZnI9Tm9uZSkKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAnZ2V0ZCcsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIHAgPSBbXQorICAgIGlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorICAgICAgICBwID0gIGFyZ3NbJy0tLS0nXQorICAgICAgICBmb3IgcHJvYyBpbiBwOgorICAgICAgICAgICAgaWYgaGFzYXR0cihwcm9jLCAnc2VsZCcpOgorICAgICAgICAgICAgICAgICMgaXQgaGFzIGEgcmVhbCBuYW1lCisgICAgICAgICAgICAgICAgcHJvY2Vzc25hbWVzLmFwcGVuZChwcm9jLnNlbGQpCisgICAgICAgICAgICBlbGlmIGhhc2F0dHIocHJvYywgJ3R5cGUnKToKKyAgICAgICAgICAgICAgICBpZiBwcm9jLnR5cGUgPT0gInBzbiAiOgorICAgICAgICAgICAgICAgICAgICAjIGl0IGhhcyBhIHByb2Nlc3MgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NudW1iZXJzLmFwcGVuZChwcm9jLmRhdGEpCisgICAgIyMgZ2V0IHRoZSBjcmVhdG9ycworICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3ByY3MnKSwgZm9ybT0iaW5keCIsIHNlbGQ9YWV0eXBlcy5Vbmtub3duKCdhYnNvJywgImFsbCAiKSwgZnI9Tm9uZSkKKyAgICBhcmdzWyctLS0tJ10gPSAgYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdmY3J0JyksIGZyPWFlb2JqXzApCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZykKKyAgICBpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgcCA9ICBhcmdzWyctLS0tJ10KKyAgICAgICAgY3JlYXRvcnMgPSBwWzpdCisgICAgIyMgY29uY2F0ZW5hdGUgaW4gb25lIGRpY3QKKyAgICByZXN1bHQgPSBbXQorICAgIGlmIGxlbihwcm9jZXNzbmFtZXMpID4gbGVuKHByb2Nlc3NudW1iZXJzKToKKyAgICAgICAgZGF0YSA9IHByb2Nlc3NuYW1lcworICAgIGVsc2U6CisgICAgICAgIGRhdGEgPSBwcm9jZXNzbnVtYmVycworICAgIGZvciBpIGluIHJhbmdlKGxlbihjcmVhdG9ycykpOgorICAgICAgICByZXN1bHQuYXBwZW5kKChkYXRhW2ldLCBjcmVhdG9yc1tpXSkpCisgICAgcmV0dXJuIHJlc3VsdAogCiBjbGFzcyBfcHJvY2VzczoKLQlwYXNzCisgICAgcGFzcwogCiBkZWYgaXNhY3RpdmVwcm9jZXNzKHByb2Nlc3NuYW1lKToKLQkiIiJDaGVjayBvZiBwcm9jZXNzbmFtZSBpcyBhY3RpdmUuIE1hY09TOSIiIgotCWFsbCA9IHByb2Nlc3NlcygpCi0Jb2sgPSAwCi0JZm9yIG4sIGMgaW4gYWxsOgotCQlpZiBuID09IHByb2Nlc3NuYW1lOgotCQkJcmV0dXJuIDEKLQlyZXR1cm4gMAotCQorICAgICIiIkNoZWNrIG9mIHByb2Nlc3NuYW1lIGlzIGFjdGl2ZS4gTWFjT1M5IiIiCisgICAgYWxsID0gcHJvY2Vzc2VzKCkKKyAgICBvayA9IDAKKyAgICBmb3IgbiwgYyBpbiBhbGw6CisgICAgICAgIGlmIG4gPT0gcHJvY2Vzc25hbWU6CisgICAgICAgICAgICByZXR1cm4gMQorICAgIHJldHVybiAwCisgICAgCiBkZWYgcHJvY2Vzc2luZm8ocHJvY2Vzc25hbWUpOgotCSIiIlJldHVybiBhbiBvYmplY3Qgd2l0aCBhbGwgcHJvY2VzcyBwcm9wZXJ0aWVzIGFzIGF0dHJpYnV0ZXMgZm9yIHByb2Nlc3NuYW1lLiBNYWNPUzkiIiIKLQlwID0gX3Byb2Nlc3MoKQotCQotCWlmIHByb2Nlc3NuYW1lID09ICJGaW5kZXIiOgotCQlwLnBhcnRpdGlvbiA9IE5vbmUKLQkJcC51c2VkID0gTm9uZQotCWVsc2U6Ci0JCXAucGFydGl0aW9uID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2FwcHQnKQotCQlwLnVzZWQgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncHVzZCcpCi0JcC52aXNpYmxlID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ3B2aXMnKQkJI0lzIHRoZSBwcm9jZXNzJyBsYXllciB2aXNpYmxlPwotCXAuZnJvbnRtb3N0ID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ3Bpc2YnKQkjSXMgdGhlIHByb2Nlc3MgdGhlIGZyb250bW9zdCBwcm9jZXNzPwotCXAuZmlsZSA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdmaWxlJykJCQkjdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgcHJvY2VzcyB3YXMgbGF1bmNoZWQKLQlwLmZpbGV0eXBlICA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdhc3R5JykJCSN0aGUgT1NUeXBlIG9mIHRoZSBmaWxlIHR5cGUgb2YgdGhlIHByb2Nlc3MKLQlwLmNyZWF0b3J0eXBlID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2ZjcnQnKQkjdGhlIE9TVHlwZSBvZiB0aGUgY3JlYXRvciBvZiB0aGUgcHJvY2VzcyAodGhlIHNpZ25hdHVyZSkKLQlwLmFjY2VwdGhpZ2hsZXZlbCA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdyZXZ0JykJI0lzIHRoZSBwcm9jZXNzIGhpZ2gtbGV2ZWwgZXZlbnQgYXdhcmUgKGFjY2VwdHMgb3BlbiBhcHBsaWNhdGlvbiwgb3BlbiBkb2N1bWVudCwgcHJpbnQgZG9jdW1lbnQsIGFuZCBxdWl0KT8KLQlwLmhhc3NjcmlwdGluZyA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdoc2NyJykJCSNEb2VzIHRoZSBwcm9jZXNzIGhhdmUgYSBzY3JpcHRpbmcgdGVybWlub2xvZ3ksIGkuZS4sIGNhbiBpdCBiZSBzY3JpcHRlZD8KLQlyZXR1cm4gcAotCQorICAgICIiIlJldHVybiBhbiBvYmplY3Qgd2l0aCBhbGwgcHJvY2VzcyBwcm9wZXJ0aWVzIGFzIGF0dHJpYnV0ZXMgZm9yIHByb2Nlc3NuYW1lLiBNYWNPUzkiIiIKKyAgICBwID0gX3Byb2Nlc3MoKQorICAgIAorICAgIGlmIHByb2Nlc3NuYW1lID09ICJGaW5kZXIiOgorICAgICAgICBwLnBhcnRpdGlvbiA9IE5vbmUKKyAgICAgICAgcC51c2VkID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIHAucGFydGl0aW9uID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2FwcHQnKQorICAgICAgICBwLnVzZWQgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncHVzZCcpCisgICAgcC52aXNpYmxlID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ3B2aXMnKSAgICAgICAjSXMgdGhlIHByb2Nlc3MnIGxheWVyIHZpc2libGU/CisgICAgcC5mcm9udG1vc3QgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncGlzZicpICNJcyB0aGUgcHJvY2VzcyB0aGUgZnJvbnRtb3N0IHByb2Nlc3M/CisgICAgcC5maWxlID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2ZpbGUnKSAgICAgICAgICAjdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgcHJvY2VzcyB3YXMgbGF1bmNoZWQKKyAgICBwLmZpbGV0eXBlICA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdhc3R5JykgICAgICN0aGUgT1NUeXBlIG9mIHRoZSBmaWxlIHR5cGUgb2YgdGhlIHByb2Nlc3MKKyAgICBwLmNyZWF0b3J0eXBlID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2ZjcnQnKSAgICN0aGUgT1NUeXBlIG9mIHRoZSBjcmVhdG9yIG9mIHRoZSBwcm9jZXNzICh0aGUgc2lnbmF0dXJlKQorICAgIHAuYWNjZXB0aGlnaGxldmVsID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ3JldnQnKSAgICNJcyB0aGUgcHJvY2VzcyBoaWdoLWxldmVsIGV2ZW50IGF3YXJlIChhY2NlcHRzIG9wZW4gYXBwbGljYXRpb24sIG9wZW4gZG9jdW1lbnQsIHByaW50IGRvY3VtZW50LCBhbmQgcXVpdCk/CisgICAgcC5oYXNzY3JpcHRpbmcgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnaHNjcicpICAgICAgI0RvZXMgdGhlIHByb2Nlc3MgaGF2ZSBhIHNjcmlwdGluZyB0ZXJtaW5vbG9neSwgaS5lLiwgY2FuIGl0IGJlIHNjcmlwdGVkPworICAgIHJldHVybiBwCisgICAgCiBkZWYgX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgcHJvcGVydHkpOgotCSIiInJldHVybiB0aGUgcGFydGl0aW9uIHNpemUgYW5kIG1lbW9yeSB1c2VkIGZvciBwcm9jZXNzbmFtZSIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09Im5hbWUiLCBzZWxkPXByb2Nlc3NuYW1lLCBmcj1Ob25lKQotCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKHByb3BlcnR5KSwgZnI9YWVvYmpfMDApCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCisgICAgIiIicmV0dXJuIHRoZSBwYXJ0aXRpb24gc2l6ZSBhbmQgbWVtb3J5IHVzZWQgZm9yIHByb2Nlc3NuYW1lIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3ByY3MnKSwgZm9ybT0ibmFtZSIsIHNlbGQ9cHJvY2Vzc25hbWUsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUocHJvcGVydHkpLCBmcj1hZW9ial8wMCkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCU1lc3MgYXJvdW5kIHdpdGggRmluZGVyIHdpbmRvd3MuCi0JCisjICAgTWVzcyBhcm91bmQgd2l0aCBGaW5kZXIgd2luZG93cy4KKyAgICAKIGRlZiBvcGVud2luZG93KG9iamVjdCk6Ci0JIiIiT3BlbiBhIEZpbmRlciB3aW5kb3cgZm9yIG9iamVjdCwgU3BlY2lmeSBvYmplY3QgYnkgbmFtZSBvciBmc3NwZWMuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0Jb2JqZWN0ID0gQ2FyYm9uLkZpbGUuRlNSZWYob2JqZWN0KQotCW9iamVjdF9hbGlhcyA9IG9iamVjdC5GU05ld0FsaWFzTWluaW1hbCgpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCV9jb2RlID0gJ2FldnQnCi0JX3N1YmNvZGUgPSAnb2RvYycKLQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQkKKyAgICAiIiJPcGVuIGEgRmluZGVyIHdpbmRvdyBmb3Igb2JqZWN0LCBTcGVjaWZ5IG9iamVjdCBieSBuYW1lIG9yIGZzc3BlYy4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBvYmplY3QgPSBDYXJib24uRmlsZS5GU1JlZihvYmplY3QpCisgICAgb2JqZWN0X2FsaWFzID0gb2JqZWN0LkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgX2NvZGUgPSAnYWV2dCcKKyAgICBfc3ViY29kZSA9ICdvZG9jJworICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMAorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIAogZGVmIGNsb3Nld2luZG93KG9iamVjdCk6Ci0JIiIiQ2xvc2UgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIsIFNwZWNpZnkgYnkgcGF0aC4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlvYmplY3QgPSBDYXJib24uRmlsZS5GU1JlZihvYmplY3QpCi0Jb2JqZWN0X2FsaWFzID0gb2JqZWN0LkZTTmV3QWxpYXNNaW5pbWFsKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JX2NvZGUgPSAnY29yZScKLQlfc3ViY29kZSA9ICdjbG9zJwotCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMAotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgICIiIkNsb3NlIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyLCBTcGVjaWZ5IGJ5IHBhdGguIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgb2JqZWN0ID0gQ2FyYm9uLkZpbGUuRlNSZWYob2JqZWN0KQorICAgIG9iamVjdF9hbGlhcyA9IG9iamVjdC5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIF9jb2RlID0gJ2NvcmUnCisgICAgX3N1YmNvZGUgPSAnY2xvcycKKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKIAogZGVmIGxvY2F0aW9uKG9iamVjdCwgcG9zPU5vbmUpOgotCSIiIlNldCB0aGUgcG9zaXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgotCUlmIHBvcz1Ob25lLCBsb2NhdGlvbiB3aWxsIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LiIiIgotCW9iamVjdCA9IENhcmJvbi5GaWxlLkZTUmVmKG9iamVjdCkKLQlvYmplY3RfYWxpYXMgPSBvYmplY3QuRlNOZXdBbGlhc01pbmltYWwoKQotCWlmIG5vdCBwb3M6Ci0JCXJldHVybiBfZ2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzKQotCXJldHVybiBfc2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzLCBwb3MpCi0JCisgICAgIiIiU2V0IHRoZSBwb3NpdGlvbiBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byBwb3M9KHcsIGgpLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuCisgICAgSWYgcG9zPU5vbmUsIGxvY2F0aW9uIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBvYmplY3QuIiIiCisgICAgb2JqZWN0ID0gQ2FyYm9uLkZpbGUuRlNSZWYob2JqZWN0KQorICAgIG9iamVjdF9hbGlhcyA9IG9iamVjdC5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgaWYgbm90IHBvczoKKyAgICAgICAgcmV0dXJuIF9nZXRsb2NhdGlvbihvYmplY3RfYWxpYXMpCisgICAgcmV0dXJuIF9zZXRsb2NhdGlvbihvYmplY3RfYWxpYXMsIHBvcykKKyAgICAKIGRlZiBfc2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzLCAoeCwgeSkpOgotCSIiIl9zZXRsb2NhdGlvbjogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaWNvbiBmb3IgdGhlIG9iamVjdC4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMDApCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEKLQlhcmdzWyJkYXRhIl0gPSBbeCwgeV0KLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCXJldHVybiAoeCx5KQotCQorICAgICIiIl9zZXRsb2NhdGlvbjogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaWNvbiBmb3IgdGhlIG9iamVjdC4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMDApCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKyAgICBhcmdzWyJkYXRhIl0gPSBbeCwgeV0KKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIHJldHVybiAoeCx5KQorICAgIAogZGVmIF9nZXRsb2NhdGlvbihvYmplY3RfYWxpYXMpOgotCSIiIl9nZXRsb2NhdGlvbjogZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaWNvbiBmb3IgdGhlIG9iamVjdC4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMDApCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlwb3MgPSBhcmdzWyctLS0tJ10KLQkJcmV0dXJuIHBvcy5oLCBwb3MudgorICAgICIiIl9nZXRsb2NhdGlvbjogZ2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaWNvbiBmb3IgdGhlIG9iamVjdC4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMDApCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorICAgICAgICBwb3MgPSBhcmdzWyctLS0tJ10KKyAgICAgICAgcmV0dXJuIHBvcy5oLCBwb3MudgogCiBkZWYgbGFiZWwob2JqZWN0LCBpbmRleD1Ob25lKToKLQkiIiJsYWJlbDogc2V0IG9yIGdldCB0aGUgbGFiZWwgb2YgdGhlIGl0ZW0uIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4iIiIKLQlvYmplY3QgPSBDYXJib24uRmlsZS5GU1JlZihvYmplY3QpCi0Jb2JqZWN0X2FsaWFzID0gb2JqZWN0LkZTTmV3QWxpYXNNaW5pbWFsKCkKLQlpZiBpbmRleCA9PSBOb25lOgotCQlyZXR1cm4gX2dldGxhYmVsKG9iamVjdF9hbGlhcykKLQlpZiBpbmRleCA8IDAgb3IgaW5kZXggPiA3OgotCQlpbmRleCA9IDAKLQlyZXR1cm4gX3NldGxhYmVsKG9iamVjdF9hbGlhcywgaW5kZXgpCi0JCisgICAgIiIibGFiZWw6IHNldCBvciBnZXQgdGhlIGxhYmVsIG9mIHRoZSBpdGVtLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuIiIiCisgICAgb2JqZWN0ID0gQ2FyYm9uLkZpbGUuRlNSZWYob2JqZWN0KQorICAgIG9iamVjdF9hbGlhcyA9IG9iamVjdC5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgaWYgaW5kZXggPT0gTm9uZToKKyAgICAgICAgcmV0dXJuIF9nZXRsYWJlbChvYmplY3RfYWxpYXMpCisgICAgaWYgaW5kZXggPCAwIG9yIGluZGV4ID4gNzoKKyAgICAgICAgaW5kZXggPSAwCisgICAgcmV0dXJuIF9zZXRsYWJlbChvYmplY3RfYWxpYXMsIGluZGV4KQorICAgIAogZGVmIF9nZXRsYWJlbChvYmplY3RfYWxpYXMpOgotCSIiImxhYmVsOiBHZXQgdGhlIGxhYmVsIGZvciB0aGUgb2JqZWN0LiIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnbGFiaScpLCBmcj1hZW9ial8wMCkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10KKyAgICAiIiJsYWJlbDogR2V0IHRoZSBsYWJlbCBmb3IgdGhlIG9iamVjdC4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2xhYmknKSwgZnI9YWVvYmpfMDApCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorICAgICAgICByZXR1cm4gYXJnc1snLS0tLSddCiAKIGRlZiBfc2V0bGFiZWwob2JqZWN0X2FsaWFzLCBpbmRleCk6Ci0JIiIibGFiZWw6IFNldCB0aGUgbGFiZWwgZm9yIHRoZSBvYmplY3QuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCV9jb2RlID0gJ2NvcmUnCi0JX3N1YmNvZGUgPSAnc2V0ZCcKLQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKLQkJCWZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKLQkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnbGFiaScpLCBmcj1hZW9ial8wKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzEKLQlhcmdzWyJkYXRhIl0gPSBpbmRleAotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZChfY29kZSwgX3N1YmNvZGUsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCXJldHVybiBpbmRleAorICAgICIiImxhYmVsOiBTZXQgdGhlIGxhYmVsIGZvciB0aGUgb2JqZWN0LiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBfY29kZSA9ICdjb3JlJworICAgIF9zdWJjb2RlID0gJ3NldGQnCisgICAgYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCisgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCisgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2xhYmknKSwgZnI9YWVvYmpfMCkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8xCisgICAgYXJnc1siZGF0YSJdID0gaW5kZXgKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICByZXR1cm4gaW5kZXgKIAogZGVmIHdpbmRvd3ZpZXcoZm9sZGVyLCB2aWV3PU5vbmUpOgotCSIiIndpbmRvd3ZpZXc6IFNldCB0aGUgdmlldyBvZiB0aGUgd2luZG93IGZvciB0aGUgZm9sZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuCi0JMCA9IGJ5IGljb24gKGRlZmF1bHQpCi0JMSA9IGJ5IG5hbWUKLQkyID0gYnkgYnV0dG9uCi0JIiIiCi0JZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZm9sZGVyKQotCWZvbGRlcl9hbGlhcyA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCi0JaWYgdmlldyA9PSBOb25lOgotCQlyZXR1cm4gX2dldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzKQotCXJldHVybiBfc2V0d2luZG93dmlldyhmb2xkZXJfYWxpYXMsIHZpZXcpCi0JCisgICAgIiIid2luZG93dmlldzogU2V0IHRoZSB2aWV3IG9mIHRoZSB3aW5kb3cgZm9yIHRoZSBmb2xkZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4KKyAgICAwID0gYnkgaWNvbiAoZGVmYXVsdCkKKyAgICAxID0gYnkgbmFtZQorICAgIDIgPSBieSBidXR0b24KKyAgICAiIiIKKyAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmb2xkZXIpCisgICAgZm9sZGVyX2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICBpZiB2aWV3ID09IE5vbmU6CisgICAgICAgIHJldHVybiBfZ2V0d2luZG93dmlldyhmb2xkZXJfYWxpYXMpCisgICAgcmV0dXJuIF9zZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcywgdmlldykKKyAgICAKIGRlZiBfc2V0d2luZG93dmlldyhmb2xkZXJfYWxpYXMsIHZpZXc9MCk6Ci0JIiIic2V0IHRoZSB3aW5kb3d2aWV3IiIiCi0JYXR0cnMgPSB7fQotCWFyZ3MgPSB7fQotCWlmIHZpZXcgPT0gMToKLQkJX3YgPSBhZXR5cGVzLlR5cGUoJ3BuYW0nKQotCWVsaWYgdmlldyA9PSAyOgotCQlfdiA9IGFldHlwZXMuVHlwZSgnbGdidScpCi0JZWxzZToKLQkJX3YgPSBhZXR5cGVzLlR5cGUoJ2lpbWcnKQotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdjZm9sJyksIAotCQkJZm9ybSA9ICdhbGlzJywgc2VsZCA9IGZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgncHJvcCcpLCAKLQkJCWZvcm0gPSAncHJvcCcsIHNlbGQgPSBhZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKLQlhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgncHJvcCcpLCAKLQkJCWZvcm0gPSAncHJvcCcsIHNlbGQgPSBhZXR5cGVzLlR5cGUoJ3B2ZXcnKSwgZnI9YWVvYmpfMSkKLQlhZW9ial8zID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgncHJvcCcpLCAKLQkJCWZvcm0gPSAncHJvcCcsIHNlbGQgPSBfdiwgZnI9Tm9uZSkKLQlfY29kZSA9ICdjb3JlJwotCV9zdWJjb2RlID0gJ3NldGQnCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMgotCWFyZ3NbJ2RhdGEnXSA9IGFlb2JqXzMKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorICAgICIiInNldCB0aGUgd2luZG93dmlldyIiIgorICAgIGF0dHJzID0ge30KKyAgICBhcmdzID0ge30KKyAgICBpZiB2aWV3ID09IDE6CisgICAgICAgIF92ID0gYWV0eXBlcy5UeXBlKCdwbmFtJykKKyAgICBlbGlmIHZpZXcgPT0gMjoKKyAgICAgICAgX3YgPSBhZXR5cGVzLlR5cGUoJ2xnYnUnKQorICAgIGVsc2U6CisgICAgICAgIF92ID0gYWV0eXBlcy5UeXBlKCdpaW1nJykKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKyAgICAgICAgICAgIGZvcm0gPSAnYWxpcycsIHNlbGQgPSBmb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgICAgICAgICBmb3JtID0gJ3Byb3AnLCBzZWxkID0gYWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisgICAgYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgICAgICAgICBmb3JtID0gJ3Byb3AnLCBzZWxkID0gYWV0eXBlcy5UeXBlKCdwdmV3JyksIGZyPWFlb2JqXzEpCisgICAgYWVvYmpfMyA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgICAgICAgICBmb3JtID0gJ3Byb3AnLCBzZWxkID0gX3YsIGZyPU5vbmUpCisgICAgX2NvZGUgPSAnY29yZScKKyAgICBfc3ViY29kZSA9ICdzZXRkJworICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzIKKyAgICBhcmdzWydkYXRhJ10gPSBhZW9ial8zCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKF9jb2RlLCBfc3ViY29kZSwgYXJncywgYXR0cnMpCisgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KIAogZGVmIF9nZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcyk6Ci0JIiIiZ2V0IHRoZSB3aW5kb3d2aWV3IiIiCi0JYXR0cnMgPSB7fQotCWFyZ3MgPSB7fQotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wMCkKLQlhZW9ial8wMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncHZldycpLCBmcj1hZW9ial8wMSkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMgotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0Jdmlld3MgPSB7J2lpbWcnOjAsICdwbmFtJzoxLCAnbGdidSc6Mn0KLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIHZpZXdzW2FyZ3NbJy0tLS0nXS5lbnVtXQorICAgICIiImdldCB0aGUgd2luZG93dmlldyIiIgorICAgIGF0dHJzID0ge30KKyAgICBhcmdzID0ge30KKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMDApCisgICAgYWVvYmpfMDIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3B2ZXcnKSwgZnI9YWVvYmpfMDEpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDIKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIHZpZXdzID0geydpaW1nJzowLCAncG5hbSc6MSwgJ2xnYnUnOjJ9CisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiB2aWV3c1thcmdzWyctLS0tJ10uZW51bV0KIAogZGVmIHdpbmRvd3NpemUoZm9sZGVyLCBzaXplPU5vbmUpOgotCSIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byBzaXplPSh3LCBoKSwgU3BlY2lmeSBieSBwYXRoLgotCUlmIHNpemU9Tm9uZSwgd2luZG93c2l6ZSB3aWxsIHJldHVybiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSB3aW5kb3cuCi0JU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgotCSIiIgotCWZzciA9IENhcmJvbi5GaWxlLkZTUmVmKGZvbGRlcikKLQlmb2xkZXJfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQotCW9wZW53aW5kb3coZnNyKQotCWlmIG5vdCBzaXplOgotCQlyZXR1cm4gX2dldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzKQotCXJldHVybiBfc2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMsIHNpemUpCi0JCisgICAgIiIiU2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvIHNpemU9KHcsIGgpLCBTcGVjaWZ5IGJ5IHBhdGguCisgICAgSWYgc2l6ZT1Ob25lLCB3aW5kb3dzaXplIHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHdpbmRvdy4KKyAgICBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMuCisgICAgIiIiCisgICAgZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZm9sZGVyKQorICAgIGZvbGRlcl9hbGlhcyA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgb3BlbndpbmRvdyhmc3IpCisgICAgaWYgbm90IHNpemU6CisgICAgICAgIHJldHVybiBfZ2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMpCisgICAgcmV0dXJuIF9zZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcywgc2l6ZSkKKyAgICAKIGRlZiBfc2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMsICh3LCBoKSk6Ci0JIiIiU2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvICh3LCBoKSIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlfY29kZSA9ICdjb3JlJwotCV9zdWJjb2RlID0gJ3NldGQnCi0JYWV2YXIwMCA9IFt3LCBoXQotCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLAotCQkJZm9ybT0iYWxpcyIsIHNlbGQ9Zm9sZGVyX2FsaWFzLCBmcj1Ob25lKQotCWFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKLQkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQotCWFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKLQkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncHRzeicpLCBmcj1hZW9ial8xKQotCWFyZ3NbJy0tLS0nXSA9IGFlb2JqXzIKLQlhcmdzWyJkYXRhIl0gPSBhZXZhcjAwCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKF9jb2RlLCBfc3ViY29kZSwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JcmV0dXJuICh3LCBoKQotCQkKKyAgICAiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIF9jb2RlID0gJ2NvcmUnCisgICAgX3N1YmNvZGUgPSAnc2V0ZCcKKyAgICBhZXZhcjAwID0gW3csIGhdCisgICAgYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksCisgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisgICAgYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMgorICAgIGFyZ3NbImRhdGEiXSA9IGFldmFyMDAKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICByZXR1cm4gKHcsIGgpCisgICAgICAgIAogZGVmIF9nZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcyk6Ci0JIiIiU2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvICh3LCBoKSIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCi0JYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAotCQkJZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMgotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10KKyAgICAiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKyAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKKyAgICBhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMSkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8yCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQogCiBkZWYgd2luZG93cG9zaXRpb24oZm9sZGVyLCBwb3M9Tm9uZSk6Ci0JIiIiU2V0IHRoZSBwb3NpdGlvbiBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byBwb3M9KHcsIGgpLiIiIgotCWZzciA9IENhcmJvbi5GaWxlLkZTUmVmKGZvbGRlcikKLQlmb2xkZXJfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQotCW9wZW53aW5kb3coZnNyKQotCWlmIG5vdCBwb3M6Ci0JCXJldHVybiBfZ2V0d2luZG93cG9zaXRpb24oZm9sZGVyX2FsaWFzKQotCWlmIHR5cGUocG9zKSA9PSBJbnN0YW5jZVR5cGU6Ci0JCSMgcG9zIG1pZ2h0IGJlIGEgUURQb2ludCBvYmplY3QgYXMgcmV0dXJuZWQgYnkgX2dldHdpbmRvd3Bvc2l0aW9uCi0JCXBvcyA9IChwb3MuaCwgcG9zLnYpCi0JcmV0dXJuIF9zZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMsIHBvcykKLQkJCQorICAgICIiIlNldCB0aGUgcG9zaXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4iIiIKKyAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmb2xkZXIpCisgICAgZm9sZGVyX2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICBvcGVud2luZG93KGZzcikKKyAgICBpZiBub3QgcG9zOgorICAgICAgICByZXR1cm4gX2dldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcykKKyAgICBpZiB0eXBlKHBvcykgPT0gSW5zdGFuY2VUeXBlOgorICAgICAgICAjIHBvcyBtaWdodCBiZSBhIFFEUG9pbnQgb2JqZWN0IGFzIHJldHVybmVkIGJ5IF9nZXR3aW5kb3dwb3NpdGlvbgorICAgICAgICBwb3MgPSAocG9zLmgsIHBvcy52KQorICAgIHJldHVybiBfc2V0d2luZG93cG9zaXRpb24oZm9sZGVyX2FsaWFzLCBwb3MpCisgICAgICAgICAgICAKIGRlZiBfc2V0d2luZG93cG9zaXRpb24oZm9sZGVyX2FsaWFzLCAoeCwgeSkpOgotCSIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKLQkJCWZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCi0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKLQlhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCi0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMSkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8yCi0JYXJnc1siZGF0YSJdID0gW3gsIHldCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ3NldGQnLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorICAgICIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkuIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKKyAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKKyAgICBhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCisgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMSkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8yCisgICAgYXJnc1siZGF0YSJdID0gW3gsIHldCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ3NldGQnLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQogCiBkZWYgX2dldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcyk6Ci0JIiIiR2V0IHRoZSBzaXplIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyLCBTcGVjaWZ5IGJ5IHBhdGguIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCAKLQkJCWZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKLQlhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCi0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKLQlhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCi0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3B0c3onKSwgZnI9YWVvYmpfMSkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8yCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorICAgICIiIkdldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciwgU3BlY2lmeSBieSBwYXRoLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgCisgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzApCisgICAgYWVvYmpfMiA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMgorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCisgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KIAogZGVmIGljb24ob2JqZWN0LCBpY29uZGF0YT1Ob25lKToKLQkiIiJpY29uIHNldHMgdGhlIGljb24gb2Ygb2JqZWN0LCBpZiBubyBpY29uZGF0YSBpcyBnaXZlbiwKLQlpY29uIHdpbGwgcmV0dXJuIGFuIEFFIG9iamVjdCB3aXRoIGJpbmFyeSBkYXRhIGZvciB0aGUgY3VycmVudCBpY29uLgotCUlmIGxlZnQgdW50b3VjaGVkLCB0aGlzIGRhdGEgY2FuIGJlIHVzZWQgdG8gcGFzdGUgdGhlIGljb24gb24gYW5vdGhlciBmaWxlLgotCURldmVsb3BtZW50IG9wcG9ydHVuaXR5OiBnZXQgYW5kIHNldCB0aGUgZGF0YSBhcyBQSUNULiIiIgotCWZzciA9IENhcmJvbi5GaWxlLkZTUmVmKG9iamVjdCkKLQlvYmplY3RfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQotCWlmIGljb25kYXRhID09IE5vbmU6Ci0JCXJldHVybiBfZ2V0aWNvbihvYmplY3RfYWxpYXMpCi0JcmV0dXJuIF9zZXRpY29uKG9iamVjdF9hbGlhcywgaWNvbmRhdGEpCi0JCisgICAgIiIiaWNvbiBzZXRzIHRoZSBpY29uIG9mIG9iamVjdCwgaWYgbm8gaWNvbmRhdGEgaXMgZ2l2ZW4sCisgICAgaWNvbiB3aWxsIHJldHVybiBhbiBBRSBvYmplY3Qgd2l0aCBiaW5hcnkgZGF0YSBmb3IgdGhlIGN1cnJlbnQgaWNvbi4KKyAgICBJZiBsZWZ0IHVudG91Y2hlZCwgdGhpcyBkYXRhIGNhbiBiZSB1c2VkIHRvIHBhc3RlIHRoZSBpY29uIG9uIGFub3RoZXIgZmlsZS4KKyAgICBEZXZlbG9wbWVudCBvcHBvcnR1bml0eTogZ2V0IGFuZCBzZXQgdGhlIGRhdGEgYXMgUElDVC4iIiIKKyAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihvYmplY3QpCisgICAgb2JqZWN0X2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICBpZiBpY29uZGF0YSA9PSBOb25lOgorICAgICAgICByZXR1cm4gX2dldGljb24ob2JqZWN0X2FsaWFzKQorICAgIHJldHVybiBfc2V0aWNvbihvYmplY3RfYWxpYXMsIGljb25kYXRhKQorICAgIAogZGVmIF9nZXRpY29uKG9iamVjdF9hbGlhcyk6Ci0JIiIiZ2V0IHRoZSBpY29uZGF0YSBmb3Igb2JqZWN0LiBCaW5hcnkgZGF0YSBvZiBzb21lIHNvcnQuIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2NvYmonKSwgCi0JCQlmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCi0JYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCAKLQkJCWZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnaWltZycpLCBmcj1hZW9ial8wMCkKLQlhcmdzWyctLS0tJ10gPSBhZW9ial8wMQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10KKyAgICAiIiJnZXQgdGhlIGljb25kYXRhIGZvciBvYmplY3QuIEJpbmFyeSBkYXRhIG9mIHNvbWUgc29ydC4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCAKKyAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQogCiBkZWYgX3NldGljb24ob2JqZWN0X2FsaWFzLCBpY29uZGF0YSk6Ci0JIiIic2V0IHRoZSBpY29uZGF0YSBmb3Igb2JqZWN0LCBmb3JtYXR0ZWQgYXMgcHJvZHVjZWQgYnkgX2dldGljb24oKSIiIgotCWZpbmRlciA9IF9nZXRmaW5kZXIoKQotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIAotCQkJZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQotCWFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgCi0JCQlmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2lpbWcnKSwgZnI9YWVvYmpfMDApCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDEKLQlhcmdzWyJkYXRhIl0gPSBpY29uZGF0YQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJzZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCXJldHVybiBhcmdzWyctLS0tJ10uZGF0YQorICAgICIiInNldCB0aGUgaWNvbmRhdGEgZm9yIG9iamVjdCwgZm9ybWF0dGVkIGFzIHByb2R1Y2VkIGJ5IF9nZXRpY29uKCkiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCAKKyAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisgICAgYXJnc1siZGF0YSJdID0gaWNvbmRhdGEKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorICAgICAgICByZXR1cm4gYXJnc1snLS0tLSddLmRhdGEKIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCVZvbHVtZXMgYW5kIHNlcnZlcnMuCi0JCisjICAgVm9sdW1lcyBhbmQgc2VydmVycy4KKyAgICAKIGRlZiBtb3VudHZvbHVtZSh2b2x1bWUsIHNlcnZlcj1Ob25lLCB1c2VybmFtZT1Ob25lLCBwYXNzd29yZD1Ob25lKToKLQkiIiJtb3VudCBhIHZvbHVtZSwgbG9jYWwgb3Igb24gYSBzZXJ2ZXIgb24gQXBwbGVUYWxrLgotCU5vdGU6IG1vdW50aW5nIGEgQVNJUCBzZXJ2ZXIgcmVxdWlyZXMgYSBkaWZmZXJlbnQgb3BlcmF0aW9uLgotCXNlcnZlciBpcyB0aGUgbmFtZSBvZiB0aGUgc2VydmVyIHdoZXJlIHRoZSB2b2x1bWUgYmVsb25ncwotCXVzZXJuYW1lLCBwYXNzd29yZCBiZWxvbmcgdG8gYSByZWdpc3RlcmVkIHVzZXIgb2YgdGhlIHZvbHVtZS4iIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JaWYgcGFzc3dvcmQ6Ci0JCWFyZ3NbIlBBU1MiXSA9IHBhc3N3b3JkCi0JaWYgdXNlcm5hbWU6Ci0JCWFyZ3NbIlVTRVIiXSA9IHVzZXJuYW1lCi0JaWYgc2VydmVyOgotCQlhcmdzWyJTUlZSIl0gPSBzZXJ2ZXIKLQlhcmdzWyctLS0tJ10gPSB2b2x1bWUKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImFldnQiLCAibXZvbCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCisgICAgIiIibW91bnQgYSB2b2x1bWUsIGxvY2FsIG9yIG9uIGEgc2VydmVyIG9uIEFwcGxlVGFsay4KKyAgICBOb3RlOiBtb3VudGluZyBhIEFTSVAgc2VydmVyIHJlcXVpcmVzIGEgZGlmZmVyZW50IG9wZXJhdGlvbi4KKyAgICBzZXJ2ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHNlcnZlciB3aGVyZSB0aGUgdm9sdW1lIGJlbG9uZ3MKKyAgICB1c2VybmFtZSwgcGFzc3dvcmQgYmVsb25nIHRvIGEgcmVnaXN0ZXJlZCB1c2VyIG9mIHRoZSB2b2x1bWUuIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGlmIHBhc3N3b3JkOgorICAgICAgICBhcmdzWyJQQVNTIl0gPSBwYXNzd29yZAorICAgIGlmIHVzZXJuYW1lOgorICAgICAgICBhcmdzWyJVU0VSIl0gPSB1c2VybmFtZQorICAgIGlmIHNlcnZlcjoKKyAgICAgICAgYXJnc1siU1JWUiJdID0gc2VydmVyCisgICAgYXJnc1snLS0tLSddID0gdm9sdW1lCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJhZXZ0IiwgIm12b2wiLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQogCiBkZWYgdW5tb3VudHZvbHVtZSh2b2x1bWUpOgotCSIiInVubW91bnQgYSB2b2x1bWUgdGhhdCdzIG9uIHRoZSBkZXNrdG9wIiIiCi0JcHV0YXdheSh2b2x1bWUpCi0JCisgICAgIiIidW5tb3VudCBhIHZvbHVtZSB0aGF0J3Mgb24gdGhlIGRlc2t0b3AiIiIKKyAgICBwdXRhd2F5KHZvbHVtZSkKKyAgICAKIGRlZiBwdXRhd2F5KG9iamVjdCk6Ci0JIiIicHV0aCB0aGUgb2JqZWN0IGF3YXksIHdoZXJlZXZlciBpdCBjYW1lIGZyb20uIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZGlzJyksIGZvcm09Im5hbWUiLCBzZWxkPW9iamVjdCwgZnI9Tm9uZSkKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gdGFsa2VyLnNlbmQoImZuZHIiLCAicHR3eSIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCisgICAgIiIicHV0aCB0aGUgb2JqZWN0IGF3YXksIHdoZXJlZXZlciBpdCBjYW1lIGZyb20uIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZGlzJyksIGZvcm09Im5hbWUiLCBzZWxkPW9iamVjdCwgZnI9Tm9uZSkKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gdGFsa2VyLnNlbmQoImZuZHIiLCAicHR3eSIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorICAgICAgICByZXR1cm4gYXJnc1snLS0tLSddCiAKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIwlNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucworIyAgIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zCiAjCiAKIGRlZiB2b2x1bWVsZXZlbChsZXZlbCk6Ci0JIiIic2V0IHRoZSBhdWRpbyBvdXRwdXQgbGV2ZWwsIHBhcmFtZXRlciBiZXR3ZWVuIDAgKHNpbGVudCkgYW5kIDcgKGZ1bGwgYmxhc3QpIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWlmIGxldmVsIDwgMDoKLQkJbGV2ZWwgPSAwCi0JZWxpZiBsZXZlbCA+IDc6Ci0JCWxldmVsID0gNwotCWFyZ3NbJy0tLS0nXSA9IGxldmVsCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJhZXZ0IiwgInN0dmwiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKLQlpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKLQkJcmV0dXJuIGFyZ3NbJy0tLS0nXQorICAgICIiInNldCB0aGUgYXVkaW8gb3V0cHV0IGxldmVsLCBwYXJhbWV0ZXIgYmV0d2VlbiAwIChzaWxlbnQpIGFuZCA3IChmdWxsIGJsYXN0KSIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBpZiBsZXZlbCA8IDA6CisgICAgICAgIGxldmVsID0gMAorICAgIGVsaWYgbGV2ZWwgPiA3OgorICAgICAgICBsZXZlbCA9IDcKKyAgICBhcmdzWyctLS0tJ10gPSBsZXZlbAorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiYWV2dCIsICJzdHZsIiwgYXJncywgYXR0cnMpCisgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KIAogZGVmIE9TdmVyc2lvbigpOgotCSIiInJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIHNvZnR3YXJlIiIiCi0JZmluZGVyID0gX2dldGZpbmRlcigpCi0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCd2ZXIyJyksIGZyPU5vbmUpCi0JYXJnc1snLS0tLSddID0gYWVvYmpfMDAKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlyZXR1cm4gYXJnc1snLS0tLSddCisgICAgIiIicmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0gc29mdHdhcmUiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3ZlcjInKSwgZnI9Tm9uZSkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8wMAorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisgICAgaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KIAogZGVmIGZpbGVzaGFyaW5nKCk6Ci0JIiIicmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBmaWxlc2hhcmluZyBhbmQgd2hldGhlciBpdCBpcyBzdGFydGluZyB1cCBvciBub3Q6Ci0JCS0xCWZpbGUgc2hhcmluZyBpcyBvZmYgYW5kIG5vdCBzdGFydGluZyB1cAotCQkwCWZpbGUgc2hhcmluZyBpcyBvZmYgYW5kIHN0YXJ0aW5nIHVwCi0JCTEJZmlsZSBzaGFyaW5nIGlzIG9uIiIiCi0Jc3RhdHVzID0gLTEKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQkjIHNlZSBpZiBpdCBpcyBvbgotCWFyZ3MgPSB7fQotCWF0dHJzID0ge30KLQlhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2ZzaHInKSwgZnI9Tm9uZSkKLQlfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQotCWlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgotCQlyYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQotCWlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgotCQlpZiBhcmdzWyctLS0tJ10gPT0gMDoKLQkJCXN0YXR1cyA9IC0xCi0JCWVsc2U6Ci0JCQlzdGF0dXMgPSAxCi0JIyBpcyBpdCBzdGFydGluZyB1cCBwZXJjaGFuY2U/Ci0JYXJncyA9IHt9Ci0JYXR0cnMgPSB7fQotCWFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZnN1cCcpLCBmcj1Ob25lKQotCV9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCi0JaWYgYXJncy5oYXNfa2V5KCdlcnJuJyk6Ci0JCXJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCi0JaWYgYXJncy5oYXNfa2V5KCctLS0tJyk6Ci0JCWlmIGFyZ3NbJy0tLS0nXSA9PSAxOgotCQkJc3RhdHVzID0gMAotCXJldHVybiBzdGF0dXMKLQkKKyAgICAiIiJyZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGZpbGVzaGFyaW5nIGFuZCB3aGV0aGVyIGl0IGlzIHN0YXJ0aW5nIHVwIG9yIG5vdDoKKyAgICAgICAgLTEgIGZpbGUgc2hhcmluZyBpcyBvZmYgYW5kIG5vdCBzdGFydGluZyB1cAorICAgICAgICAwICAgZmlsZSBzaGFyaW5nIGlzIG9mZiBhbmQgc3RhcnRpbmcgdXAKKyAgICAgICAgMSAgIGZpbGUgc2hhcmluZyBpcyBvbiIiIgorICAgIHN0YXR1cyA9IC0xCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgIyBzZWUgaWYgaXQgaXMgb24KKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdmc2hyJyksIGZyPU5vbmUpCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKyAgICBpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiBhcmdzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgaWYgYXJnc1snLS0tLSddID09IDA6CisgICAgICAgICAgICBzdGF0dXMgPSAtMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdHVzID0gMQorICAgICMgaXMgaXQgc3RhcnRpbmcgdXAgcGVyY2hhbmNlPworICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2ZzdXAnKSwgZnI9Tm9uZSkKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnLS0tLScpOgorICAgICAgICBpZiBhcmdzWyctLS0tJ10gPT0gMToKKyAgICAgICAgICAgIHN0YXR1cyA9IDAKKyAgICByZXR1cm4gc3RhdHVzCisgICAgCiBkZWYgbW92ZXRvdHJhc2gocGF0aCk6Ci0JIiIibW92ZSB0aGUgb2JqZWN0IHRvIHRoZSB0cmFzaCIiIgotCWZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhwYXRoKQotCXRyYXNoZm9sZGVyID0gQ2FyYm9uLkZvbGRlci5GU0ZpbmRGb2xkZXIoZnNzLmFzX3R1cGxlKClbMF0sICd0cnNoJywgMCkKLQltb3ZlKHBhdGgsIHRyYXNoZm9sZGVyKQorICAgICIiIm1vdmUgdGhlIG9iamVjdCB0byB0aGUgdHJhc2giIiIKKyAgICBmc3MgPSBDYXJib24uRmlsZS5GU1NwZWMocGF0aCkKKyAgICB0cmFzaGZvbGRlciA9IENhcmJvbi5Gb2xkZXIuRlNGaW5kRm9sZGVyKGZzcy5hc190dXBsZSgpWzBdLCAndHJzaCcsIDApCisgICAgbW92ZShwYXRoLCB0cmFzaGZvbGRlcikKIAogZGVmIGVtcHR5dHJhc2goKToKLQkiIiJlbXB0eSB0aGUgdHJhc2giIiIKLQlmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKLQlhcmdzID0ge30KLQlhdHRycyA9IHt9Ci0JYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCd0cnNoJyksIGZyPU5vbmUpCi0JX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJmbmRyIiwgImVtcHQiLCBhcmdzLCBhdHRycykKLQlpZiBhcmdzLmhhc19rZXkoJ2Vycm4nKToKLQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgICIiImVtcHR5IHRoZSB0cmFzaCIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Ryc2gnKSwgZnI9Tm9uZSkKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImZuZHIiLCAiZW1wdCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmIGFyZ3MuaGFzX2tleSgnZXJybicpOgorICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCiAKIAogZGVmIF90ZXN0KCk6Ci0JaW1wb3J0IEVhc3lEaWFsb2dzCi0JcHJpbnQgJ09yaWdpbmFsIGZpbmRlcnRvb2xzIGZ1bmN0aW9uYWxpdHkgdGVzdC4uLicKLQlwcmludCAnVGVzdGluZyBsYXVuY2guLi4nCi0JcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbignRmlsZSB0byBsYXVuY2g6JykKLQlpZiBwYXRobmFtZToKLQkJcmVzdWx0ID0gbGF1bmNoKHBhdGhuYW1lKQotCQlpZiByZXN1bHQ6Ci0JCQlwcmludCAnUmVzdWx0OiAnLCByZXN1bHQKLQkJcHJpbnQgJ1ByZXNzIHJldHVybi0nLAotCQlzeXMuc3RkaW4ucmVhZGxpbmUoKQotCXByaW50ICdUZXN0aW5nIHByaW50Li4uJwotCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4oJ0ZpbGUgdG8gcHJpbnQ6JykKLQlpZiBwYXRobmFtZToKLQkJcmVzdWx0ID0gUHJpbnQocGF0aG5hbWUpCi0JCWlmIHJlc3VsdDoKLQkJCXByaW50ICdSZXN1bHQ6ICcsIHJlc3VsdAotCQlwcmludCAnUHJlc3MgcmV0dXJuLScsCi0JCXN5cy5zdGRpbi5yZWFkbGluZSgpCi0JcHJpbnQgJ1Rlc3RpbmcgY29weS4uLicKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKCdGaWxlIHRvIGNvcHk6JykKLQlpZiBwYXRobmFtZToKLQkJZGVzdGRpciA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcignRGVzdGluYXRpb246JykKLQkJaWYgZGVzdGRpcjoKLQkJCXJlc3VsdCA9IGNvcHkocGF0aG5hbWUsIGRlc3RkaXIpCi0JCQlpZiByZXN1bHQ6Ci0JCQkJcHJpbnQgJ1Jlc3VsdDonLCByZXN1bHQKLQkJCXByaW50ICdQcmVzcyByZXR1cm4tJywKLQkJCXN5cy5zdGRpbi5yZWFkbGluZSgpCi0JcHJpbnQgJ1Rlc3RpbmcgbW92ZS4uLicKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKCdGaWxlIHRvIG1vdmU6JykKLQlpZiBwYXRobmFtZToKLQkJZGVzdGRpciA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcignRGVzdGluYXRpb246JykKLQkJaWYgZGVzdGRpcjoKLQkJCXJlc3VsdCA9IG1vdmUocGF0aG5hbWUsIGRlc3RkaXIpCi0JCQlpZiByZXN1bHQ6Ci0JCQkJcHJpbnQgJ1Jlc3VsdDonLCByZXN1bHQKLQkJCXByaW50ICdQcmVzcyByZXR1cm4tJywKLQkJCXN5cy5zdGRpbi5yZWFkbGluZSgpCi0JcHJpbnQgJ1Rlc3Rpbmcgc2xlZXAuLi4nCi0JaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NsZWVwPycpID4gMDoKLQkJcmVzdWx0ID0gc2xlZXAoKQotCQlpZiByZXN1bHQ6Ci0JCQlwcmludCAnUmVzdWx0OicsIHJlc3VsdAotCQlwcmludCAnUHJlc3MgcmV0dXJuLScsCi0JCXN5cy5zdGRpbi5yZWFkbGluZSgpCi0JcHJpbnQgJ1Rlc3Rpbmcgc2h1dGRvd24uLi4nCi0JaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NodXQgZG93bj8nKSA+IDA6Ci0JCXJlc3VsdCA9IHNodXRkb3duKCkKLQkJaWYgcmVzdWx0OgotCQkJcHJpbnQgJ1Jlc3VsdDonLCByZXN1bHQKLQkJcHJpbnQgJ1ByZXNzIHJldHVybi0nLAotCQlzeXMuc3RkaW4ucmVhZGxpbmUoKQotCXByaW50ICdUZXN0aW5nIHJlc3RhcnQuLi4nCi0JaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1Jlc3RhcnQ/JykgPiAwOgotCQlyZXN1bHQgPSByZXN0YXJ0KCkKLQkJaWYgcmVzdWx0OgotCQkJcHJpbnQgJ1Jlc3VsdDonLCByZXN1bHQKLQkJcHJpbnQgJ1ByZXNzIHJldHVybi0nLAotCQlzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgIHByaW50ICdPcmlnaW5hbCBmaW5kZXJ0b29scyBmdW5jdGlvbmFsaXR5IHRlc3QuLi4nCisgICAgcHJpbnQgJ1Rlc3RpbmcgbGF1bmNoLi4uJworICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4oJ0ZpbGUgdG8gbGF1bmNoOicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIHJlc3VsdCA9IGxhdW5jaChwYXRobmFtZSkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcHJpbnQgJ1Jlc3VsdDogJywgcmVzdWx0CisgICAgICAgIHByaW50ICdQcmVzcyByZXR1cm4tJywKKyAgICAgICAgc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICBwcmludCAnVGVzdGluZyBwcmludC4uLicKKyAgICBwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKCdGaWxlIHRvIHByaW50OicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIHJlc3VsdCA9IFByaW50KHBhdGhuYW1lKQorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICBwcmludCAnUmVzdWx0OiAnLCByZXN1bHQKKyAgICAgICAgcHJpbnQgJ1ByZXNzIHJldHVybi0nLAorICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIGNvcHkuLi4nCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbignRmlsZSB0byBjb3B5OicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIGRlc3RkaXIgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIoJ0Rlc3RpbmF0aW9uOicpCisgICAgICAgIGlmIGRlc3RkaXI6CisgICAgICAgICAgICByZXN1bHQgPSBjb3B5KHBhdGhuYW1lLCBkZXN0ZGlyKQorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgICAgICBwcmludCAnUHJlc3MgcmV0dXJuLScsCisgICAgICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIG1vdmUuLi4nCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbignRmlsZSB0byBtb3ZlOicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIGRlc3RkaXIgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIoJ0Rlc3RpbmF0aW9uOicpCisgICAgICAgIGlmIGRlc3RkaXI6CisgICAgICAgICAgICByZXN1bHQgPSBtb3ZlKHBhdGhuYW1lLCBkZXN0ZGlyKQorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgICAgICBwcmludCAnUHJlc3MgcmV0dXJuLScsCisgICAgICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIHNsZWVwLi4uJworICAgIGlmIEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTbGVlcD8nKSA+IDA6CisgICAgICAgIHJlc3VsdCA9IHNsZWVwKCkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcHJpbnQgJ1Jlc3VsdDonLCByZXN1bHQKKyAgICAgICAgcHJpbnQgJ1ByZXNzIHJldHVybi0nLAorICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIHNodXRkb3duLi4uJworICAgIGlmIEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTaHV0IGRvd24/JykgPiAwOgorICAgICAgICByZXN1bHQgPSBzaHV0ZG93bigpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgIHByaW50ICdQcmVzcyByZXR1cm4tJywKKyAgICAgICAgc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICBwcmludCAnVGVzdGluZyByZXN0YXJ0Li4uJworICAgIGlmIEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdSZXN0YXJ0PycpID4gMDoKKyAgICAgICAgcmVzdWx0ID0gcmVzdGFydCgpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgIHByaW50ICdQcmVzcyByZXR1cm4tJywKKyAgICAgICAgc3lzLnN0ZGluLnJlYWRsaW5lKCkKIAogZGVmIF90ZXN0MigpOgotCXByaW50ICdcbm1vcmVmaW5kZXJ0b29scyB2ZXJzaW9uICVzXG5UZXN0cyBjb21pbmcgdXAuLi4nICVfX3ZlcnNpb25fXwotCWltcG9ydCBvcwotCWltcG9ydCByYW5kb20KKyAgICBwcmludCAnXG5tb3JlZmluZGVydG9vbHMgdmVyc2lvbiAlc1xuVGVzdHMgY29taW5nIHVwLi4uJyAlX192ZXJzaW9uX18KKyAgICBpbXBvcnQgb3MKKyAgICBpbXBvcnQgcmFuZG9tCiAKLQkjIG1pc2NlbGxhbmVvdXMKLQlwcmludCAnXHRmaWxlc2hhcmluZyBvbj8nLAlmaWxlc2hhcmluZygpCQkjIGlzIGZpbGUgc2hhcmluZyBvbiwgb2ZmLCBzdGFydGluZyB1cD8KLQlwcmludCAnXHRPUyB2ZXJzaW9uJywgCQlPU3ZlcnNpb24oKQkJIyB0aGUgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIHNvZnR3YXJlCisgICAgIyBtaXNjZWxsYW5lb3VzCisgICAgcHJpbnQgJ1x0ZmlsZXNoYXJpbmcgb24/JywgIGZpbGVzaGFyaW5nKCkgICAgICAgIyBpcyBmaWxlIHNoYXJpbmcgb24sIG9mZiwgc3RhcnRpbmcgdXA/CisgICAgcHJpbnQgJ1x0T1MgdmVyc2lvbicsICAgICAgIE9TdmVyc2lvbigpICAgICAjIHRoZSB2ZXJzaW9uIG9mIHRoZSBzeXN0ZW0gc29mdHdhcmUKIAotCSMgc2V0IHRoZSBzb3VuZHZvbHVtZSBpbiBhIHNpbXBsZSB3YXkKLQlwcmludCAnXHRTeXN0ZW0gYmVlcCB2b2x1bWUnCi0JZm9yIGkgaW4gcmFuZ2UoMCwgNyk6Ci0JCXZvbHVtZWxldmVsKGkpCQkKLQkJTWFjT1MuU3lzQmVlcCgpCisgICAgIyBzZXQgdGhlIHNvdW5kdm9sdW1lIGluIGEgc2ltcGxlIHdheQorICAgIHByaW50ICdcdFN5c3RlbSBiZWVwIHZvbHVtZScKKyAgICBmb3IgaSBpbiByYW5nZSgwLCA3KToKKyAgICAgICAgdm9sdW1lbGV2ZWwoaSkgICAgICAKKyAgICAgICAgTWFjT1MuU3lzQmVlcCgpCiAKLQkjIEZpbmRlcidzIHdpbmRvd3MsIGZpbGUgbG9jYXRpb24sIGZpbGUgYXR0cmlidXRlcwotCW9wZW4oIkBmaW5kZXJ0b29sc3Rlc3QiLCAidyIpCi0JZiA9ICJAZmluZGVydG9vbHN0ZXN0IgotCXJldmVhbChmKQkJCQkjIHJldmVhbCB0aGlzIGZpbGUgaW4gYSBGaW5kZXIgd2luZG93Ci0Jc2VsZWN0KGYpCQkJCSMgc2VsZWN0IHRoaXMgZmlsZQorICAgICMgRmluZGVyJ3Mgd2luZG93cywgZmlsZSBsb2NhdGlvbiwgZmlsZSBhdHRyaWJ1dGVzCisgICAgb3BlbigiQGZpbmRlcnRvb2xzdGVzdCIsICJ3IikKKyAgICBmID0gIkBmaW5kZXJ0b29sc3Rlc3QiCisgICAgcmV2ZWFsKGYpICAgICAgICAgICAgICAgIyByZXZlYWwgdGhpcyBmaWxlIGluIGEgRmluZGVyIHdpbmRvdworICAgIHNlbGVjdChmKSAgICAgICAgICAgICAgICMgc2VsZWN0IHRoaXMgZmlsZQogCi0JYmFzZSwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZikKLQljbG9zZXdpbmRvdyhiYXNlKQkjIGNsb3NlIHRoZSB3aW5kb3cgdGhpcyBmaWxlIGlzIGluCShvcGVuZWQgYnkgcmV2ZWFsKQotCW9wZW53aW5kb3coYmFzZSkJCSMgb3BlbiBpdCBhZ2FpbgotCXdpbmRvd3ZpZXcoYmFzZSwgMSkJIyBzZXQgdGhlIHZpZXcgYnkgbGlzdAorICAgIGJhc2UsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGYpCisgICAgY2xvc2V3aW5kb3coYmFzZSkgICAjIGNsb3NlIHRoZSB3aW5kb3cgdGhpcyBmaWxlIGlzIGluICAob3BlbmVkIGJ5IHJldmVhbCkKKyAgICBvcGVud2luZG93KGJhc2UpICAgICAgICAjIG9wZW4gaXQgYWdhaW4KKyAgICB3aW5kb3d2aWV3KGJhc2UsIDEpICMgc2V0IHRoZSB2aWV3IGJ5IGxpc3QKIAotCWxhYmVsKGYsIDIpCQkJCSMgc2V0IHRoZSBsYWJlbCBvZiB0aGlzIGZpbGUgdG8gc29tZXRoaW5nIG9yYW5nZQotCXByaW50ICdcdGxhYmVsJywgbGFiZWwoZikJIyBnZXQgdGhlIGxhYmVsIG9mIHRoaXMgZmlsZQorICAgIGxhYmVsKGYsIDIpICAgICAgICAgICAgICMgc2V0IHRoZSBsYWJlbCBvZiB0aGlzIGZpbGUgdG8gc29tZXRoaW5nIG9yYW5nZQorICAgIHByaW50ICdcdGxhYmVsJywgbGFiZWwoZikgICAjIGdldCB0aGUgbGFiZWwgb2YgdGhpcyBmaWxlCiAKLQkjIHRoZSBmaWxlIGxvY2F0aW9uIG9ubHkgd29ya3MgaW4gYSB3aW5kb3cgd2l0aCBpY29uIHZpZXchCi0JcHJpbnQgJ1JhbmRvbSBsb2NhdGlvbnMgZm9yIGFuIGljb24nCi0Jd2luZG93dmlldyhiYXNlLCAwKQkJIyBzZXQgdGhlIHZpZXcgYnkgaWNvbgotCXdpbmRvd3NpemUoYmFzZSwgKDYwMCwgNjAwKSkKLQlmb3IgaSBpbiByYW5nZSg1MCk6Ci0JCWxvY2F0aW9uKGYsIChyYW5kb20ucmFuZGludCgxMCwgNTkwKSwgcmFuZG9tLnJhbmRpbnQoMTAsIDU5MCkpKQorICAgICMgdGhlIGZpbGUgbG9jYXRpb24gb25seSB3b3JrcyBpbiBhIHdpbmRvdyB3aXRoIGljb24gdmlldyEKKyAgICBwcmludCAnUmFuZG9tIGxvY2F0aW9ucyBmb3IgYW4gaWNvbicKKyAgICB3aW5kb3d2aWV3KGJhc2UsIDApICAgICAjIHNldCB0aGUgdmlldyBieSBpY29uCisgICAgd2luZG93c2l6ZShiYXNlLCAoNjAwLCA2MDApKQorICAgIGZvciBpIGluIHJhbmdlKDUwKToKKyAgICAgICAgbG9jYXRpb24oZiwgKHJhbmRvbS5yYW5kaW50KDEwLCA1OTApLCByYW5kb20ucmFuZGludCgxMCwgNTkwKSkpCiAKLQl3aW5kb3dzaXplKGJhc2UsICgyMDAsIDQwMCkpCi0Jd2luZG93dmlldyhiYXNlLCAxKQkJIyBzZXQgdGhlIHZpZXcgYnkgaWNvbgorICAgIHdpbmRvd3NpemUoYmFzZSwgKDIwMCwgNDAwKSkKKyAgICB3aW5kb3d2aWV3KGJhc2UsIDEpICAgICAjIHNldCB0aGUgdmlldyBieSBpY29uCiAKLQlvcmdwb3MgPSB3aW5kb3dwb3NpdGlvbihiYXNlKQotCXByaW50ICdBbmltYXRlZCB3aW5kb3cgbG9jYXRpb24nCi0JZm9yIGkgaW4gcmFuZ2UoMTApOgotCQlwb3MgPSAoMTAwK2kqMTAsIDEwMCtpKjEwKQotCQl3aW5kb3dwb3NpdGlvbihiYXNlLCBwb3MpCi0JCXByaW50ICdcdHdpbmRvdyBwb3NpdGlvbicsIHBvcwotCXdpbmRvd3Bvc2l0aW9uKGJhc2UsIG9yZ3BvcykJIyBwYXJrIGl0IHdoZXJlIGl0IHdhcyBiZWZvcmUKKyAgICBvcmdwb3MgPSB3aW5kb3dwb3NpdGlvbihiYXNlKQorICAgIHByaW50ICdBbmltYXRlZCB3aW5kb3cgbG9jYXRpb24nCisgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICBwb3MgPSAoMTAwK2kqMTAsIDEwMCtpKjEwKQorICAgICAgICB3aW5kb3dwb3NpdGlvbihiYXNlLCBwb3MpCisgICAgICAgIHByaW50ICdcdHdpbmRvdyBwb3NpdGlvbicsIHBvcworICAgIHdpbmRvd3Bvc2l0aW9uKGJhc2UsIG9yZ3BvcykgICAgIyBwYXJrIGl0IHdoZXJlIGl0IHdhcyBiZWZvcmUKIAotCXByaW50ICdQdXQgYSBjb21tZW50IGluIGZpbGUnLCBmLCAnOicKLQlwcmludCAnXHQnLCBjb21tZW50KGYpCQkjIHByaW50IHRoZSBGaW5kZXIgY29tbWVudCB0aGlzIGZpbGUgaGFzCi0JcyA9ICdUaGlzIGlzIGEgY29tbWVudCBubyBvbmUgcmVhZHMhJwotCWNvbW1lbnQoZiwgcykJCQkjIHNldCB0aGUgRmluZGVyIGNvbW1lbnQKLQkKKyAgICBwcmludCAnUHV0IGEgY29tbWVudCBpbiBmaWxlJywgZiwgJzonCisgICAgcHJpbnQgJ1x0JywgY29tbWVudChmKSAgICAgICMgcHJpbnQgdGhlIEZpbmRlciBjb21tZW50IHRoaXMgZmlsZSBoYXMKKyAgICBzID0gJ1RoaXMgaXMgYSBjb21tZW50IG5vIG9uZSByZWFkcyEnCisgICAgY29tbWVudChmLCBzKSAgICAgICAgICAgIyBzZXQgdGhlIEZpbmRlciBjb21tZW50CisgICAgCiBkZWYgX3Rlc3QzKCk6Ci0JcHJpbnQgJ01hY09TOSBvciBiZXR0ZXIgc3BlY2lmaWMgZnVuY3Rpb25zJwotCSMgcHJvY2Vzc2VzCi0JcHIgPSBwcm9jZXNzZXMoKQkJIyByZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyB3aXRoIChhY3RpdmVfcHJvY2Vzc25hbWUsIGNyZWF0b3Jjb2RlKQotCXByaW50ICdSZXR1cm4gYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIHByb2Nlc3NlczonCi0JZm9yIHAgaW4gcHI6Ci0JCXByaW50ICdcdCcsIHAKLQkKLQkjIGdldCBhdHRyaWJ1dGVzIG9mIHRoZSBmaXJzdCBwcm9jZXNzIGluIHRoZSBsaXN0Ci0JcHJpbnQgJ0F0dHJpYnV0ZXMgb2YgdGhlIGZpcnN0IHByb2Nlc3MgaW4gdGhlIGxpc3Q6JwotCXBpbmZvID0gcHJvY2Vzc2luZm8ocHJbMF1bMF0pCi0JcHJpbnQgJ1x0JywgcHJbMF1bMF0KLQlwcmludCAnXHRcdG1lbW9yeSBwYXJ0aXRpb24nLCBwaW5mby5wYXJ0aXRpb24JCSMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhpcyBwcm9jZXNzCi0JcHJpbnQgJ1x0XHRtZW1vcnkgdXNlZCcsIHBpbmZvLnVzZWQJCQkjIHRoZSBtZW1vcnkgYWN0dWFsbCB1c2VkIGJ5IHRoaXMgcHJvY2VzcwotCXByaW50ICdcdFx0aXMgdmlzaWJsZScsIHBpbmZvLnZpc2libGUJCQkjIGlzIHRoZSBwcm9jZXNzIHZpc2libGUgdG8gdGhlIHVzZXIKLQlwcmludCAnXHRcdGlzIGZyb250bW9zdCcsIHBpbmZvLmZyb250bW9zdAkJIyBpcyB0aGUgcHJvY2VzcyB0aGUgZnJvbnQgbW9zdCBvbmU/Ci0JcHJpbnQgJ1x0XHRoYXMgc2NyaXB0aW5nJywgcGluZm8uaGFzc2NyaXB0aW5nCQkjIGlzIHRoZSBwcm9jZXNzIHNjcmlwdGFibGU/Ci0JcHJpbnQgJ1x0XHRhY2NlcHRzIGhpZ2ggbGV2ZWwgZXZlbnRzJywgCXBpbmZvLmFjY2VwdGhpZ2hsZXZlbAkjIGRvZXMgdGhlIHByb2Nlc3MgYWNjZXB0IGhpZ2ggbGV2ZWwgYXBwbGVldmVudHM/CisgICAgcHJpbnQgJ01hY09TOSBvciBiZXR0ZXIgc3BlY2lmaWMgZnVuY3Rpb25zJworICAgICMgcHJvY2Vzc2VzCisgICAgcHIgPSBwcm9jZXNzZXMoKSAgICAgICAgIyByZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyB3aXRoIChhY3RpdmVfcHJvY2Vzc25hbWUsIGNyZWF0b3Jjb2RlKQorICAgIHByaW50ICdSZXR1cm4gYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIHByb2Nlc3NlczonCisgICAgZm9yIHAgaW4gcHI6CisgICAgICAgIHByaW50ICdcdCcsIHAKKyAgICAKKyAgICAjIGdldCBhdHRyaWJ1dGVzIG9mIHRoZSBmaXJzdCBwcm9jZXNzIGluIHRoZSBsaXN0CisgICAgcHJpbnQgJ0F0dHJpYnV0ZXMgb2YgdGhlIGZpcnN0IHByb2Nlc3MgaW4gdGhlIGxpc3Q6JworICAgIHBpbmZvID0gcHJvY2Vzc2luZm8ocHJbMF1bMF0pCisgICAgcHJpbnQgJ1x0JywgcHJbMF1bMF0KKyAgICBwcmludCAnXHRcdG1lbW9yeSBwYXJ0aXRpb24nLCBwaW5mby5wYXJ0aXRpb24gICAgICAgIyB0aGUgbWVtb3J5IGFsbG9jYXRlZCB0byB0aGlzIHByb2Nlc3MKKyAgICBwcmludCAnXHRcdG1lbW9yeSB1c2VkJywgcGluZm8udXNlZCAgICAgICAgICMgdGhlIG1lbW9yeSBhY3R1YWxsIHVzZWQgYnkgdGhpcyBwcm9jZXNzCisgICAgcHJpbnQgJ1x0XHRpcyB2aXNpYmxlJywgcGluZm8udmlzaWJsZSAgICAgICAgICAgIyBpcyB0aGUgcHJvY2VzcyB2aXNpYmxlIHRvIHRoZSB1c2VyCisgICAgcHJpbnQgJ1x0XHRpcyBmcm9udG1vc3QnLCBwaW5mby5mcm9udG1vc3QgICAgICAgIyBpcyB0aGUgcHJvY2VzcyB0aGUgZnJvbnQgbW9zdCBvbmU/CisgICAgcHJpbnQgJ1x0XHRoYXMgc2NyaXB0aW5nJywgcGluZm8uaGFzc2NyaXB0aW5nICAgICAgICMgaXMgdGhlIHByb2Nlc3Mgc2NyaXB0YWJsZT8KKyAgICBwcmludCAnXHRcdGFjY2VwdHMgaGlnaCBsZXZlbCBldmVudHMnLCAgcGluZm8uYWNjZXB0aGlnaGxldmVsICAgIyBkb2VzIHRoZSBwcm9jZXNzIGFjY2VwdCBoaWdoIGxldmVsIGFwcGxlZXZlbnRzPwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCV90ZXN0KCkKLQlfdGVzdDIoKQotCV90ZXN0MygpCi0JCisgICAgX3Rlc3QoKQorICAgIF90ZXN0MigpCisgICAgX3Rlc3QzKCkKKyAgICAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weSBiL0xpYi9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weQppbmRleCAwZmNkMWM0Li42MjIwMTZlIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHkKKysrIGIvTGliL3BsYXQtbWFjL2dlbnN1aXRlbW9kdWxlLnB5CkBAIC0yOSw4ICsyOSw4IEBACiBERUZBVUxUX1VTRVJfUEFDS0FHRUZPTERFUj1kaXN0dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKCkKIAogZGVmIHVzYWdlKCk6Ci0Jc3lzLnN0ZGVyci53cml0ZSgiVXNhZ2U6ICVzIFtvcHRzXSBhcHBsaWNhdGlvbi1vci1yZXNvdXJjZS1maWxlXG4iICUgc3lzLmFyZ3ZbMF0pCi0Jc3lzLnN0ZGVyci53cml0ZSgiIiJPcHRpb25zOgorICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzYWdlOiAlcyBbb3B0c10gYXBwbGljYXRpb24tb3ItcmVzb3VyY2UtZmlsZVxuIiAlIHN5cy5hcmd2WzBdKQorICAgIHN5cy5zdGRlcnIud3JpdGUoIiIiT3B0aW9uczoKIC0tb3V0cHV0IHBrZ2RpciAgUGF0aG5hbWUgb2YgdGhlIG91dHB1dCBwYWNrYWdlIChzaG9ydDogLW8pICAKIC0tcmVzb3VyY2UgICAgICAgUGFyc2UgcmVzb3VyY2UgZmlsZSBpbiBzdGVhZCBvZiBsYXVuY2hpbmcgYXBwbGljYXRpb24gKC1yKQogLS1iYXNlIHBhY2thZ2UgICBVc2UgYW5vdGhlciBiYXNlIHBhY2thZ2UgaW4gc3RlYWQgb2YgZGVmYXVsdCBTdGRTdWl0ZXMgKC1iKQpAQCAtMzksMjUyICszOSwyNTIgQEAKIC0tZHVtcCAgICAgICAgICAgRHVtcCBhZXRlIHJlc291cmNlIHRvIHN0ZG91dCBpbiBzdGVhZCBvZiBjcmVhdGluZyBtb2R1bGUgKC1kKQogLS12ZXJib3NlICAgICAgICBUZWxsIHVzIHdoYXQgaGFwcGVucyAoLXYpCiAiIiIpCi0Jc3lzLmV4aXQoMSkKKyAgICBzeXMuZXhpdCgxKQogCiBkZWYgbWFpbigpOgotCWlmIGxlbihzeXMuYXJndikgPiAxOgotCQlTSE9SVE9QVFMgPSAicmI6bzplOmM6ZHYiCi0JCUxPTkdPUFRTID0gKCJyZXNvdXJjZSIsICJiYXNlPSIsICJvdXRwdXQ9IiwgImVkaXQ9IiwgImNyZWF0b3I9IiwgImR1bXAiLCAidmVyYm9zZSIpCi0JCXRyeToKLQkJCW9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgU0hPUlRPUFRTLCBMT05HT1BUUykKLQkJZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKLQkJCXVzYWdlKCkKLQkJCi0JCXByb2Nlc3NfZnVuYyA9IHByb2Nlc3NmaWxlCi0JCWJhc2Vwa2duYW1lID0gJ1N0ZFN1aXRlcycKLQkJb3V0cHV0ID0gTm9uZQotCQllZGl0X21vZG5hbWVzID0gW10KLQkJY3JlYXRvcnNpZ25hdHVyZSA9IE5vbmUKLQkJZHVtcCA9IE5vbmUKLQkJdmVyYm9zZSA9IE5vbmUKLQkJCi0JCWZvciBvLCBhIGluIG9wdHM6Ci0JCQlpZiBvIGluICgnLXInLCAnLS1yZXNvdXJjZScpOgotCQkJCXByb2Nlc3NfZnVuYyA9IHByb2Nlc3NmaWxlX2Zyb21yZXNvdXJjZQotCQkJaWYgbyBpbiAoJy1iJywgJy0tYmFzZScpOgotCQkJCWJhc2Vwa2duYW1lID0gYQotCQkJaWYgbyBpbiAoJy1vJywgJy0tb3V0cHV0Jyk6Ci0JCQkJb3V0cHV0ID0gYQotCQkJaWYgbyBpbiAoJy1lJywgJy0tZWRpdCcpOgotCQkJCXNwbGl0ID0gYS5zcGxpdCgnPScpCi0JCQkJaWYgbGVuKHNwbGl0KSAhPSAyOgotCQkJCQl1c2FnZSgpCi0JCQkJZWRpdF9tb2RuYW1lcy5hcHBlbmQoc3BsaXQpCi0JCQlpZiBvIGluICgnLWMnLCAnLS1jcmVhdG9yJyk6Ci0JCQkJaWYgbGVuKGEpICE9IDQ6Ci0JCQkJCXN5cy5zdGRlcnIud3JpdGUoImNyZWF0b3IgbXVzdCBiZSA0LWNoYXIgc3RyaW5nXG4iKQotCQkJCQlzeXMuZXhpdCgxKQotCQkJCWNyZWF0b3JzaWduYXR1cmUgPSBhCi0JCQlpZiBvIGluICgnLWQnLCAnLS1kdW1wJyk6Ci0JCQkJZHVtcCA9IHN5cy5zdGRvdXQKLQkJCWlmIG8gaW4gKCctdicsICctLXZlcmJvc2UnKToKLQkJCQl2ZXJib3NlID0gc3lzLnN0ZGVycgotCQkJCQotCQkJCQkKLQkJaWYgb3V0cHV0IGFuZCBsZW4oYXJncykgPiAxOgotCQkJc3lzLnN0ZGVyci53cml0ZSgiJXM6IGNhbm5vdCBzcGVjaWZ5IC0tb3V0cHV0IHdpdGggbXVsdGlwbGUgaW5wdXRzXG4iICUgc3lzLmFyZ3ZbMF0pCi0JCQlzeXMuZXhpdCgxKQotCQkJCi0JCWZvciBmaWxlbmFtZSBpbiBhcmdzOgotCQkJcHJvY2Vzc19mdW5jKGZpbGVuYW1lLCBvdXRwdXQ9b3V0cHV0LCBiYXNlcGtnbmFtZT1iYXNlcGtnbmFtZSwgCi0JCQkJZWRpdF9tb2RuYW1lcz1lZGl0X21vZG5hbWVzLCBjcmVhdG9yc2lnbmF0dXJlPWNyZWF0b3JzaWduYXR1cmUsCi0JCQkJZHVtcD1kdW1wLCB2ZXJib3NlPXZlcmJvc2UpCi0JZWxzZToKLQkJbWFpbl9pbnRlcmFjdGl2ZSgpCi0JCQorICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICBTSE9SVE9QVFMgPSAicmI6bzplOmM6ZHYiCisgICAgICAgIExPTkdPUFRTID0gKCJyZXNvdXJjZSIsICJiYXNlPSIsICJvdXRwdXQ9IiwgImVkaXQ9IiwgImNyZWF0b3I9IiwgImR1bXAiLCAidmVyYm9zZSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgU0hPUlRPUFRTLCBMT05HT1BUUykKKyAgICAgICAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKyAgICAgICAgICAgIHVzYWdlKCkKKyAgICAgICAgCisgICAgICAgIHByb2Nlc3NfZnVuYyA9IHByb2Nlc3NmaWxlCisgICAgICAgIGJhc2Vwa2duYW1lID0gJ1N0ZFN1aXRlcycKKyAgICAgICAgb3V0cHV0ID0gTm9uZQorICAgICAgICBlZGl0X21vZG5hbWVzID0gW10KKyAgICAgICAgY3JlYXRvcnNpZ25hdHVyZSA9IE5vbmUKKyAgICAgICAgZHVtcCA9IE5vbmUKKyAgICAgICAgdmVyYm9zZSA9IE5vbmUKKyAgICAgICAgCisgICAgICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgICAgICBpZiBvIGluICgnLXInLCAnLS1yZXNvdXJjZScpOgorICAgICAgICAgICAgICAgIHByb2Nlc3NfZnVuYyA9IHByb2Nlc3NmaWxlX2Zyb21yZXNvdXJjZQorICAgICAgICAgICAgaWYgbyBpbiAoJy1iJywgJy0tYmFzZScpOgorICAgICAgICAgICAgICAgIGJhc2Vwa2duYW1lID0gYQorICAgICAgICAgICAgaWYgbyBpbiAoJy1vJywgJy0tb3V0cHV0Jyk6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gYQorICAgICAgICAgICAgaWYgbyBpbiAoJy1lJywgJy0tZWRpdCcpOgorICAgICAgICAgICAgICAgIHNwbGl0ID0gYS5zcGxpdCgnPScpCisgICAgICAgICAgICAgICAgaWYgbGVuKHNwbGl0KSAhPSAyOgorICAgICAgICAgICAgICAgICAgICB1c2FnZSgpCisgICAgICAgICAgICAgICAgZWRpdF9tb2RuYW1lcy5hcHBlbmQoc3BsaXQpCisgICAgICAgICAgICBpZiBvIGluICgnLWMnLCAnLS1jcmVhdG9yJyk6CisgICAgICAgICAgICAgICAgaWYgbGVuKGEpICE9IDQ6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImNyZWF0b3IgbXVzdCBiZSA0LWNoYXIgc3RyaW5nXG4iKQorICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAgICAgICAgIGNyZWF0b3JzaWduYXR1cmUgPSBhCisgICAgICAgICAgICBpZiBvIGluICgnLWQnLCAnLS1kdW1wJyk6CisgICAgICAgICAgICAgICAgZHVtcCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIGlmIG8gaW4gKCctdicsICctLXZlcmJvc2UnKToKKyAgICAgICAgICAgICAgICB2ZXJib3NlID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgaWYgb3V0cHV0IGFuZCBsZW4oYXJncykgPiAxOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6IGNhbm5vdCBzcGVjaWZ5IC0tb3V0cHV0IHdpdGggbXVsdGlwbGUgaW5wdXRzXG4iICUgc3lzLmFyZ3ZbMF0pCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAgICAgCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgcHJvY2Vzc19mdW5jKGZpbGVuYW1lLCBvdXRwdXQ9b3V0cHV0LCBiYXNlcGtnbmFtZT1iYXNlcGtnbmFtZSwgCisgICAgICAgICAgICAgICAgZWRpdF9tb2RuYW1lcz1lZGl0X21vZG5hbWVzLCBjcmVhdG9yc2lnbmF0dXJlPWNyZWF0b3JzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgZHVtcD1kdW1wLCB2ZXJib3NlPXZlcmJvc2UpCisgICAgZWxzZToKKyAgICAgICAgbWFpbl9pbnRlcmFjdGl2ZSgpCisgICAgICAgIAogZGVmIG1haW5faW50ZXJhY3RpdmUoaW50ZXJhY3Q9MCwgYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycpOgotCWlmIGludGVyYWN0OgotCQkjIEFzayBmb3Igc2F2ZS1maWxlbmFtZSBmb3IgZWFjaCBtb2R1bGUKLQkJZWRpdF9tb2RuYW1lcyA9IE5vbmUKLQllbHNlOgotCQkjIFVzZSBkZWZhdWx0IGZpbGVuYW1lcyBmb3IgZWFjaCBtb2R1bGUKLQkJZWRpdF9tb2RuYW1lcyA9IFtdCi0JYXBwc2ZvbGRlciA9IENhcmJvbi5Gb2xkZXIuRlNGaW5kRm9sZGVyKC0zMjc2NSwgJ2FwcHMnLCAwKQotCWZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4oCi0JCW1lc3NhZ2U9J1NlbGVjdCBzY3JpcHRhYmxlIGFwcGxpY2F0aW9uJywKLQkJZGlhbG9nT3B0aW9uRmxhZ3M9MHgxMDU2LCAJCSMgYWxsb3cgc2VsZWN0aW9uIG9mIC5hcHAgYnVuZGxlcwotCQlkZWZhdWx0TG9jYXRpb249YXBwc2ZvbGRlcikKLQlpZiBub3QgZmlsZW5hbWU6Ci0JCXJldHVybgotCWlmIG5vdCBpc19zY3JpcHRhYmxlKGZpbGVuYW1lKToKLQkJaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoCi0JCQkJIldhcm5pbmc6IGFwcGxpY2F0aW9uIGRvZXMgbm90IHNlZW0gc2NyaXB0YWJsZSIsCi0JCQkJeWVzPSJDb250aW51ZSIsIGRlZmF1bHQ9Miwgbm89IiIpIDw9IDA6Ci0JCQlyZXR1cm4KLQl0cnk6Ci0JCXByb2Nlc3NmaWxlKGZpbGVuYW1lLCBlZGl0X21vZG5hbWVzPWVkaXRfbW9kbmFtZXMsIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLAotCQl2ZXJib3NlPXN5cy5zdGRlcnIpCi0JZXhjZXB0IE1hY09TLkVycm9yLCBhcmc6Ci0JCXByaW50ICJFcnJvciBnZXR0aW5nIHRlcm1pbm9sb2d5OiIsIGFyZwotCQlwcmludCAiUmV0cnksIG1hbnVhbGx5IHBhcnNpbmcgcmVzb3VyY2VzIgotCQlwcm9jZXNzZmlsZV9mcm9tcmVzb3VyY2UoZmlsZW5hbWUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywKLQkJCWJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLCB2ZXJib3NlPXN5cy5zdGRlcnIpCi0JCQkKKyAgICBpZiBpbnRlcmFjdDoKKyAgICAgICAgIyBBc2sgZm9yIHNhdmUtZmlsZW5hbWUgZm9yIGVhY2ggbW9kdWxlCisgICAgICAgIGVkaXRfbW9kbmFtZXMgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgIyBVc2UgZGVmYXVsdCBmaWxlbmFtZXMgZm9yIGVhY2ggbW9kdWxlCisgICAgICAgIGVkaXRfbW9kbmFtZXMgPSBbXQorICAgIGFwcHNmb2xkZXIgPSBDYXJib24uRm9sZGVyLkZTRmluZEZvbGRlcigtMzI3NjUsICdhcHBzJywgMCkKKyAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKAorICAgICAgICBtZXNzYWdlPSdTZWxlY3Qgc2NyaXB0YWJsZSBhcHBsaWNhdGlvbicsCisgICAgICAgIGRpYWxvZ09wdGlvbkZsYWdzPTB4MTA1NiwgICAgICAgIyBhbGxvdyBzZWxlY3Rpb24gb2YgLmFwcCBidW5kbGVzCisgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1hcHBzZm9sZGVyKQorICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgcmV0dXJuCisgICAgaWYgbm90IGlzX3NjcmlwdGFibGUoZmlsZW5hbWUpOgorICAgICAgICBpZiBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgKKyAgICAgICAgICAgICAgICAiV2FybmluZzogYXBwbGljYXRpb24gZG9lcyBub3Qgc2VlbSBzY3JpcHRhYmxlIiwKKyAgICAgICAgICAgICAgICB5ZXM9IkNvbnRpbnVlIiwgZGVmYXVsdD0yLCBubz0iIikgPD0gMDoKKyAgICAgICAgICAgIHJldHVybgorICAgIHRyeToKKyAgICAgICAgcHJvY2Vzc2ZpbGUoZmlsZW5hbWUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywgYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsCisgICAgICAgIHZlcmJvc2U9c3lzLnN0ZGVycikKKyAgICBleGNlcHQgTWFjT1MuRXJyb3IsIGFyZzoKKyAgICAgICAgcHJpbnQgIkVycm9yIGdldHRpbmcgdGVybWlub2xvZ3k6IiwgYXJnCisgICAgICAgIHByaW50ICJSZXRyeSwgbWFudWFsbHkgcGFyc2luZyByZXNvdXJjZXMiCisgICAgICAgIHByb2Nlc3NmaWxlX2Zyb21yZXNvdXJjZShmaWxlbmFtZSwgZWRpdF9tb2RuYW1lcz1lZGl0X21vZG5hbWVzLAorICAgICAgICAgICAgYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsIHZlcmJvc2U9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIAogZGVmIGlzX3NjcmlwdGFibGUoYXBwbGljYXRpb24pOgotCSIiIlJldHVybiB0cnVlIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBzY3JpcHRhYmxlIiIiCi0JaWYgb3MucGF0aC5pc2RpcihhcHBsaWNhdGlvbik6Ci0JCXBsaXN0ZmlsZSA9IG9zLnBhdGguam9pbihhcHBsaWNhdGlvbiwgJ0NvbnRlbnRzJywgJ0luZm8ucGxpc3QnKQotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocGxpc3RmaWxlKToKLQkJCXJldHVybiBGYWxzZQotCQlwbGlzdCA9IHBsaXN0bGliLlBsaXN0LmZyb21GaWxlKHBsaXN0ZmlsZSkKLQkJcmV0dXJuIHBsaXN0LmdldCgnTlNBcHBsZVNjcmlwdEVuYWJsZWQnLCBGYWxzZSkKLQkjIElmIGl0IGlzIGEgZmlsZSB0ZXN0IGZvciBhbiBhZXRlL2FldXQgcmVzb3VyY2UuCi0JY3VycmYgPSBDdXJSZXNGaWxlKCkKLQl0cnk6Ci0JCXJlZm5vID0gbWFjcmVzb3VyY2Uub3Blbl9wYXRobmFtZShhcHBsaWNhdGlvbikKLQlleGNlcHQgTWFjT1MuRXJyb3I6Ci0JCXJldHVybiBGYWxzZQotCVVzZVJlc0ZpbGUocmVmbm8pCi0Jbl90ZXJtaW5vbG9neSA9IENvdW50MVJlc291cmNlcygnYWV0ZScpICsgQ291bnQxUmVzb3VyY2VzKCdhZXV0JykgKyBcCi0JCUNvdW50MVJlc291cmNlcygnc2NzeicpICsgQ291bnQxUmVzb3VyY2VzKCdvc2l6JykKLQlDbG9zZVJlc0ZpbGUocmVmbm8pCi0JVXNlUmVzRmlsZShjdXJyZikKLQlyZXR1cm4gbl90ZXJtaW5vbG9neSA+IDAKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgc2NyaXB0YWJsZSIiIgorICAgIGlmIG9zLnBhdGguaXNkaXIoYXBwbGljYXRpb24pOgorICAgICAgICBwbGlzdGZpbGUgPSBvcy5wYXRoLmpvaW4oYXBwbGljYXRpb24sICdDb250ZW50cycsICdJbmZvLnBsaXN0JykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBsaXN0ZmlsZSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcGxpc3QgPSBwbGlzdGxpYi5QbGlzdC5mcm9tRmlsZShwbGlzdGZpbGUpCisgICAgICAgIHJldHVybiBwbGlzdC5nZXQoJ05TQXBwbGVTY3JpcHRFbmFibGVkJywgRmFsc2UpCisgICAgIyBJZiBpdCBpcyBhIGZpbGUgdGVzdCBmb3IgYW4gYWV0ZS9hZXV0IHJlc291cmNlLgorICAgIGN1cnJmID0gQ3VyUmVzRmlsZSgpCisgICAgdHJ5OgorICAgICAgICByZWZubyA9IG1hY3Jlc291cmNlLm9wZW5fcGF0aG5hbWUoYXBwbGljYXRpb24pCisgICAgZXhjZXB0IE1hY09TLkVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBVc2VSZXNGaWxlKHJlZm5vKQorICAgIG5fdGVybWlub2xvZ3kgPSBDb3VudDFSZXNvdXJjZXMoJ2FldGUnKSArIENvdW50MVJlc291cmNlcygnYWV1dCcpICsgXAorICAgICAgICBDb3VudDFSZXNvdXJjZXMoJ3Njc3onKSArIENvdW50MVJlc291cmNlcygnb3NpeicpCisgICAgQ2xvc2VSZXNGaWxlKHJlZm5vKQorICAgIFVzZVJlc0ZpbGUoY3VycmYpCisgICAgcmV0dXJuIG5fdGVybWlub2xvZ3kgPiAwCiAKIGRlZiBwcm9jZXNzZmlsZV9mcm9tcmVzb3VyY2UoZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLCAKLQkJZWRpdF9tb2RuYW1lcz1Ob25lLCBjcmVhdG9yc2lnbmF0dXJlPU5vbmUsIGR1bXA9Tm9uZSwgdmVyYm9zZT1Ob25lKToKLQkiIiJQcm9jZXNzIGFsbCByZXNvdXJjZXMgaW4gYSBzaW5nbGUgZmlsZSIiIgotCWlmIG5vdCBpc19zY3JpcHRhYmxlKGZ1bGxuYW1lKSBhbmQgdmVyYm9zZToKLQkJcHJpbnQgPj52ZXJib3NlLCAiV2FybmluZzogYXBwIGRvZXMgbm90IHNlZW0gc2NyaXB0YWJsZTogJXMiICUgZnVsbG5hbWUKLQljdXIgPSBDdXJSZXNGaWxlKCkKLQlpZiB2ZXJib3NlOgotCQlwcmludCA+PnZlcmJvc2UsICJQcm9jZXNzaW5nIiwgZnVsbG5hbWUKLQlyZiA9IG1hY3Jlc291cmNlLm9wZW5fcGF0aG5hbWUoZnVsbG5hbWUpCi0JdHJ5OgotCQlVc2VSZXNGaWxlKHJmKQotCQlyZXNvdXJjZXMgPSBbXQotCQlmb3IgaSBpbiByYW5nZShDb3VudDFSZXNvdXJjZXMoJ2FldGUnKSk6Ci0JCQlyZXMgPSBHZXQxSW5kUmVzb3VyY2UoJ2FldGUnLCAxK2kpCi0JCQlyZXNvdXJjZXMuYXBwZW5kKHJlcykKLQkJZm9yIGkgaW4gcmFuZ2UoQ291bnQxUmVzb3VyY2VzKCdhZXV0JykpOgotCQkJcmVzID0gR2V0MUluZFJlc291cmNlKCdhZXV0JywgMStpKQotCQkJcmVzb3VyY2VzLmFwcGVuZChyZXMpCi0JCWlmIHZlcmJvc2U6CQotCQkJcHJpbnQgPj52ZXJib3NlLCAiXG5MSVNUSU5HIGFldGUrYWV1dCBSRVNPVVJDRVMgSU4iLCBgZnVsbG5hbWVgCi0JCWFldGVsaXN0ID0gW10KLQkJZm9yIHJlcyBpbiByZXNvdXJjZXM6Ci0JCQlpZiB2ZXJib3NlOgotCQkJCXByaW50ID4+dmVyYm9zZSwgImRlY29kaW5nIiwgcmVzLkdldFJlc0luZm8oKSwgIi4uLiIKLQkJCWRhdGEgPSByZXMuZGF0YQotCQkJYWV0ZSA9IGRlY29kZShkYXRhLCB2ZXJib3NlKQotCQkJYWV0ZWxpc3QuYXBwZW5kKChhZXRlLCByZXMuR2V0UmVzSW5mbygpKSkKLQlmaW5hbGx5OgotCQlpZiByZiA8PiBjdXI6Ci0JCQlDbG9zZVJlc0ZpbGUocmYpCi0JCQlVc2VSZXNGaWxlKGN1cikKLQkjIHN3aXRjaCBiYWNrIChuZWVkZWQgZm9yIGRpYWxvZ3MgaW4gUHl0aG9uKQotCVVzZVJlc0ZpbGUoY3VyKQotCWlmIGR1bXA6Ci0JCWR1bXBhZXRlbGlzdChhZXRlbGlzdCwgZHVtcCkKLQljb21waWxlYWV0ZWxpc3QoYWV0ZWxpc3QsIGZ1bGxuYW1lLCBvdXRwdXQ9b3V0cHV0LCAKLQkJYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywKLQkJY3JlYXRvcnNpZ25hdHVyZT1jcmVhdG9yc2lnbmF0dXJlLCB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIGVkaXRfbW9kbmFtZXM9Tm9uZSwgY3JlYXRvcnNpZ25hdHVyZT1Ob25lLCBkdW1wPU5vbmUsIHZlcmJvc2U9Tm9uZSk6CisgICAgIiIiUHJvY2VzcyBhbGwgcmVzb3VyY2VzIGluIGEgc2luZ2xlIGZpbGUiIiIKKyAgICBpZiBub3QgaXNfc2NyaXB0YWJsZShmdWxsbmFtZSkgYW5kIHZlcmJvc2U6CisgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIldhcm5pbmc6IGFwcCBkb2VzIG5vdCBzZWVtIHNjcmlwdGFibGU6ICVzIiAlIGZ1bGxuYW1lCisgICAgY3VyID0gQ3VyUmVzRmlsZSgpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAiUHJvY2Vzc2luZyIsIGZ1bGxuYW1lCisgICAgcmYgPSBtYWNyZXNvdXJjZS5vcGVuX3BhdGhuYW1lKGZ1bGxuYW1lKQorICAgIHRyeToKKyAgICAgICAgVXNlUmVzRmlsZShyZikKKyAgICAgICAgcmVzb3VyY2VzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoQ291bnQxUmVzb3VyY2VzKCdhZXRlJykpOgorICAgICAgICAgICAgcmVzID0gR2V0MUluZFJlc291cmNlKCdhZXRlJywgMStpKQorICAgICAgICAgICAgcmVzb3VyY2VzLmFwcGVuZChyZXMpCisgICAgICAgIGZvciBpIGluIHJhbmdlKENvdW50MVJlc291cmNlcygnYWV1dCcpKToKKyAgICAgICAgICAgIHJlcyA9IEdldDFJbmRSZXNvdXJjZSgnYWV1dCcsIDEraSkKKyAgICAgICAgICAgIHJlc291cmNlcy5hcHBlbmQocmVzKQorICAgICAgICBpZiB2ZXJib3NlOiAKKyAgICAgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIlxuTElTVElORyBhZXRlK2FldXQgUkVTT1VSQ0VTIElOIiwgYGZ1bGxuYW1lYAorICAgICAgICBhZXRlbGlzdCA9IFtdCisgICAgICAgIGZvciByZXMgaW4gcmVzb3VyY2VzOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCA+PnZlcmJvc2UsICJkZWNvZGluZyIsIHJlcy5HZXRSZXNJbmZvKCksICIuLi4iCisgICAgICAgICAgICBkYXRhID0gcmVzLmRhdGEKKyAgICAgICAgICAgIGFldGUgPSBkZWNvZGUoZGF0YSwgdmVyYm9zZSkKKyAgICAgICAgICAgIGFldGVsaXN0LmFwcGVuZCgoYWV0ZSwgcmVzLkdldFJlc0luZm8oKSkpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgcmYgPD4gY3VyOgorICAgICAgICAgICAgQ2xvc2VSZXNGaWxlKHJmKQorICAgICAgICAgICAgVXNlUmVzRmlsZShjdXIpCisgICAgIyBzd2l0Y2ggYmFjayAobmVlZGVkIGZvciBkaWFsb2dzIGluIFB5dGhvbikKKyAgICBVc2VSZXNGaWxlKGN1cikKKyAgICBpZiBkdW1wOgorICAgICAgICBkdW1wYWV0ZWxpc3QoYWV0ZWxpc3QsIGR1bXApCisgICAgY29tcGlsZWFldGVsaXN0KGFldGVsaXN0LCBmdWxsbmFtZSwgb3V0cHV0PW91dHB1dCwgCisgICAgICAgIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLCBlZGl0X21vZG5hbWVzPWVkaXRfbW9kbmFtZXMsCisgICAgICAgIGNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgdmVyYm9zZT12ZXJib3NlKQogCiBkZWYgcHJvY2Vzc2ZpbGUoZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLCAKLQkJZWRpdF9tb2RuYW1lcz1Ob25lLCBjcmVhdG9yc2lnbmF0dXJlPU5vbmUsIGR1bXA9Tm9uZSwKLQkJdmVyYm9zZT1Ob25lKToKLQkiIiJBc2sgYW4gYXBwbGljYXRpb24gZm9yIGl0cyB0ZXJtaW5vbG9neSBhbmQgcHJvY2VzcyB0aGF0IiIiCi0JaWYgbm90IGlzX3NjcmlwdGFibGUoZnVsbG5hbWUpIGFuZCB2ZXJib3NlOgotCQlwcmludCA+PnZlcmJvc2UsICJXYXJuaW5nOiBhcHAgZG9lcyBub3Qgc2VlbSBzY3JpcHRhYmxlOiAlcyIgJSBmdWxsbmFtZQotCWlmIHZlcmJvc2U6Ci0JCXByaW50ID4+dmVyYm9zZSwgIlxuQVNLSU5HIEZPUiBhZXRlIERJQ1RJT05BUlkgSU4iLCBgZnVsbG5hbWVgCi0JdHJ5OgotCQlhZWRlc2NvYmosIGxhdW5jaGVkID0gT1NBVGVybWlub2xvZ3kuR2V0QXBwVGVybWlub2xvZ3koZnVsbG5hbWUpCi0JZXhjZXB0IE1hY09TLkVycm9yLCBhcmc6Ci0JCWlmIGFyZ1swXSBpbiAoLTE3MDEsIC0xOTIpOiAjIGVyckFFRGVzY05vdEZvdW5kLCByZXNOb3RGb3VuZAotCQkJaWYgdmVyYm9zZToKLQkJCQlwcmludCA+PnZlcmJvc2UsICJHZXRBcHBUZXJtaW5vbG9neSBmYWlsZWQgd2l0aCBlcnJBRURlc2NOb3RGb3VuZC9yZXNOb3RGb3VuZCwgdHJ5aW5nIG1hbnVhbGx5IgotCQkJYWVkYXRhLCBzaWcgPSBnZXRhcHB0ZXJtaW5vbG9neShmdWxsbmFtZSwgdmVyYm9zZT12ZXJib3NlKQotCQkJaWYgbm90IGNyZWF0b3JzaWduYXR1cmU6Ci0JCQkJY3JlYXRvcnNpZ25hdHVyZSA9IHNpZwotCQllbHNlOgotCQkJcmFpc2UKLQllbHNlOgotCQlpZiBsYXVuY2hlZDoKLQkJCWlmIHZlcmJvc2U6Ci0JCQkJcHJpbnQgPj52ZXJib3NlLCAiTGF1bmNoZWQiLCBmdWxsbmFtZQotCQlyYXcgPSBhZXRvb2xzLnVucGFjayhhZWRlc2NvYmopCi0JCWlmIG5vdCByYXc6IAotCQkJaWYgdmVyYm9zZToKLQkJCQlwcmludCA+PnZlcmJvc2UsICdVbnBhY2sgcmV0dXJuZWQgZW1wdHkgdmFsdWU6JywgcmF3Ci0JCQlyZXR1cm4KLQkJaWYgbm90IHJhd1swXS5kYXRhOgotCQkJaWYgdmVyYm9zZToKLQkJCQlwcmludCA+PnZlcmJvc2UsICdVbnBhY2sgcmV0dXJuZWQgdmFsdWUgd2l0aG91dCBkYXRhOicsIHJhdwotCQkJcmV0dXJuCi0JCWFlZGF0YSA9IHJhd1swXQotCWFldGUgPSBkZWNvZGUoYWVkYXRhLmRhdGEsIHZlcmJvc2UpCi0JaWYgZHVtcDoKLQkJZHVtcGFldGVsaXN0KFthZXRlXSwgZHVtcCkKLQkJcmV0dXJuCi0JY29tcGlsZWFldGUoYWV0ZSwgTm9uZSwgZnVsbG5hbWUsIG91dHB1dD1vdXRwdXQsIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLAotCQljcmVhdG9yc2lnbmF0dXJlPWNyZWF0b3JzaWduYXR1cmUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywgCi0JCXZlcmJvc2U9dmVyYm9zZSkKLQkJCisgICAgICAgIGVkaXRfbW9kbmFtZXM9Tm9uZSwgY3JlYXRvcnNpZ25hdHVyZT1Ob25lLCBkdW1wPU5vbmUsCisgICAgICAgIHZlcmJvc2U9Tm9uZSk6CisgICAgIiIiQXNrIGFuIGFwcGxpY2F0aW9uIGZvciBpdHMgdGVybWlub2xvZ3kgYW5kIHByb2Nlc3MgdGhhdCIiIgorICAgIGlmIG5vdCBpc19zY3JpcHRhYmxlKGZ1bGxuYW1lKSBhbmQgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAiV2FybmluZzogYXBwIGRvZXMgbm90IHNlZW0gc2NyaXB0YWJsZTogJXMiICUgZnVsbG5hbWUKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCA+PnZlcmJvc2UsICJcbkFTS0lORyBGT1IgYWV0ZSBESUNUSU9OQVJZIElOIiwgYGZ1bGxuYW1lYAorICAgIHRyeToKKyAgICAgICAgYWVkZXNjb2JqLCBsYXVuY2hlZCA9IE9TQVRlcm1pbm9sb2d5LkdldEFwcFRlcm1pbm9sb2d5KGZ1bGxuYW1lKQorICAgIGV4Y2VwdCBNYWNPUy5FcnJvciwgYXJnOgorICAgICAgICBpZiBhcmdbMF0gaW4gKC0xNzAxLCAtMTkyKTogIyBlcnJBRURlc2NOb3RGb3VuZCwgcmVzTm90Rm91bmQKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAiR2V0QXBwVGVybWlub2xvZ3kgZmFpbGVkIHdpdGggZXJyQUVEZXNjTm90Rm91bmQvcmVzTm90Rm91bmQsIHRyeWluZyBtYW51YWxseSIKKyAgICAgICAgICAgIGFlZGF0YSwgc2lnID0gZ2V0YXBwdGVybWlub2xvZ3koZnVsbG5hbWUsIHZlcmJvc2U9dmVyYm9zZSkKKyAgICAgICAgICAgIGlmIG5vdCBjcmVhdG9yc2lnbmF0dXJlOgorICAgICAgICAgICAgICAgIGNyZWF0b3JzaWduYXR1cmUgPSBzaWcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgZWxzZToKKyAgICAgICAgaWYgbGF1bmNoZWQ6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIkxhdW5jaGVkIiwgZnVsbG5hbWUKKyAgICAgICAgcmF3ID0gYWV0b29scy51bnBhY2soYWVkZXNjb2JqKQorICAgICAgICBpZiBub3QgcmF3OiAKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAnVW5wYWNrIHJldHVybmVkIGVtcHR5IHZhbHVlOicsIHJhdworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCByYXdbMF0uZGF0YToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAnVW5wYWNrIHJldHVybmVkIHZhbHVlIHdpdGhvdXQgZGF0YTonLCByYXcKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhZWRhdGEgPSByYXdbMF0KKyAgICBhZXRlID0gZGVjb2RlKGFlZGF0YS5kYXRhLCB2ZXJib3NlKQorICAgIGlmIGR1bXA6CisgICAgICAgIGR1bXBhZXRlbGlzdChbYWV0ZV0sIGR1bXApCisgICAgICAgIHJldHVybgorICAgIGNvbXBpbGVhZXRlKGFldGUsIE5vbmUsIGZ1bGxuYW1lLCBvdXRwdXQ9b3V0cHV0LCBiYXNlcGtnbmFtZT1iYXNlcGtnbmFtZSwKKyAgICAgICAgY3JlYXRvcnNpZ25hdHVyZT1jcmVhdG9yc2lnbmF0dXJlLCBlZGl0X21vZG5hbWVzPWVkaXRfbW9kbmFtZXMsIAorICAgICAgICB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIAogZGVmIGdldGFwcHRlcm1pbm9sb2d5KGZ1bGxuYW1lLCB2ZXJib3NlPU5vbmUpOgotCSIiIkdldCBhcHBsaWNhdGlvbiB0ZXJtaW5vbG9neSBieSBzZW5kaW5nIGFuIEFwcGxlRXZlbnQiIiIKLQkjIEZpcnN0IGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkgY2FuIHNlbmQgQXBwbGVFdmVudHMKLQlpZiBub3QgTWFjT1MuV01BdmFpbGFibGUoKToKLQkJcmFpc2UgUnVudGltZUVycm9yLCAiQ2Fubm90IHNlbmQgQXBwbGVFdmVudHMsIG5vIGFjY2VzcyB0byB3aW5kb3cgbWFuYWdlciIKLQkjIE5leHQsIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gTWFjT1MgMTAuMjogc2VuZGluZyBldmVudHMgd2lsbCBoYW5nIHVubGVzcwotCSMgeW91IGhhdmUgY3JlYXRlZCBhbiBldmVudCBsb29wIGZpcnN0LgotCWltcG9ydCBDYXJib24uRXZ0Ci0JQ2FyYm9uLkV2dC5XYWl0TmV4dEV2ZW50KDAsMCkKLQlpZiBvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKToKLQkJIyBOb3cgZ2V0IHRoZSBzaWduYXR1cmUgb2YgdGhlIGFwcGxpY2F0aW9uLCBob3BpbmcgaXQgaXMgYSBidW5kbGUKLQkJcGtnaW5mbyA9IG9zLnBhdGguam9pbihmdWxsbmFtZSwgJ0NvbnRlbnRzJywgJ1BrZ0luZm8nKQotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocGtnaW5mbyk6Ci0JCQlyYWlzZSBSdW50aW1lRXJyb3IsICJObyBQa2dJbmZvIGZpbGUgZm91bmQiCi0JCXRwX2NyID0gb3Blbihwa2dpbmZvLCAncmInKS5yZWFkKCkKLQkJY3IgPSB0cF9jcls0OjhdCi0JZWxzZToKLQkJIyBBc3N1bWUgaXQgaXMgYSBmaWxlCi0JCWNyLCB0cCA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKGZ1bGxuYW1lKQotCSMgTGV0J3MgdGFsayB0byBpdCBhbmQgYXNrIGZvciBpdHMgQUVURQotCXRhbGtlciA9IGFldG9vbHMuVGFsa1RvKGNyKQotCXRyeToKLQkJdGFsa2VyLl9zdGFydCgpCi0JZXhjZXB0IChNYWNPUy5FcnJvciwgYWV0b29scy5FcnJvciksIGFyZzoKLQkJaWYgdmVyYm9zZToKLQkJCXByaW50ID4+dmVyYm9zZSwgJ1dhcm5pbmc6IHN0YXJ0KCkgZmFpbGVkLCBjb250aW51aW5nIGFueXdheTonLCBhcmcKLQlyZXBseSA9IHRhbGtlci5zZW5kKCJhc2NyIiwgImdkdGUiKQotCSNyZXBseTIgPSB0YWxrZXIuc2VuZCgiYXNjciIsICJnZHV0IikKLQkjIE5vdyBwaWNrIHRoZSBiaXRzIG91dCBvZiB0aGUgcmV0dXJuIHRoYXQgd2UgbmVlZC4KLQlyZXR1cm4gcmVwbHlbMV1bJy0tLS0nXSwgY3IKLQkKKyAgICAiIiJHZXQgYXBwbGljYXRpb24gdGVybWlub2xvZ3kgYnkgc2VuZGluZyBhbiBBcHBsZUV2ZW50IiIiCisgICAgIyBGaXJzdCBjaGVjayB0aGF0IHdlIGFjdHVhbGx5IGNhbiBzZW5kIEFwcGxlRXZlbnRzCisgICAgaWYgbm90IE1hY09TLldNQXZhaWxhYmxlKCk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNhbm5vdCBzZW5kIEFwcGxlRXZlbnRzLCBubyBhY2Nlc3MgdG8gd2luZG93IG1hbmFnZXIiCisgICAgIyBOZXh0LCBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIE1hY09TIDEwLjI6IHNlbmRpbmcgZXZlbnRzIHdpbGwgaGFuZyB1bmxlc3MKKyAgICAjIHlvdSBoYXZlIGNyZWF0ZWQgYW4gZXZlbnQgbG9vcCBmaXJzdC4KKyAgICBpbXBvcnQgQ2FyYm9uLkV2dAorICAgIENhcmJvbi5FdnQuV2FpdE5leHRFdmVudCgwLDApCisgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICMgTm93IGdldCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBhcHBsaWNhdGlvbiwgaG9waW5nIGl0IGlzIGEgYnVuZGxlCisgICAgICAgIHBrZ2luZm8gPSBvcy5wYXRoLmpvaW4oZnVsbG5hbWUsICdDb250ZW50cycsICdQa2dJbmZvJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ2luZm8pOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiTm8gUGtnSW5mbyBmaWxlIGZvdW5kIgorICAgICAgICB0cF9jciA9IG9wZW4ocGtnaW5mbywgJ3JiJykucmVhZCgpCisgICAgICAgIGNyID0gdHBfY3JbNDo4XQorICAgIGVsc2U6CisgICAgICAgICMgQXNzdW1lIGl0IGlzIGEgZmlsZQorICAgICAgICBjciwgdHAgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShmdWxsbmFtZSkKKyAgICAjIExldCdzIHRhbGsgdG8gaXQgYW5kIGFzayBmb3IgaXRzIEFFVEUKKyAgICB0YWxrZXIgPSBhZXRvb2xzLlRhbGtUbyhjcikKKyAgICB0cnk6CisgICAgICAgIHRhbGtlci5fc3RhcnQoKQorICAgIGV4Y2VwdCAoTWFjT1MuRXJyb3IsIGFldG9vbHMuRXJyb3IpLCBhcmc6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCA+PnZlcmJvc2UsICdXYXJuaW5nOiBzdGFydCgpIGZhaWxlZCwgY29udGludWluZyBhbnl3YXk6JywgYXJnCisgICAgcmVwbHkgPSB0YWxrZXIuc2VuZCgiYXNjciIsICJnZHRlIikKKyAgICAjcmVwbHkyID0gdGFsa2VyLnNlbmQoImFzY3IiLCAiZ2R1dCIpCisgICAgIyBOb3cgcGljayB0aGUgYml0cyBvdXQgb2YgdGhlIHJldHVybiB0aGF0IHdlIG5lZWQuCisgICAgcmV0dXJuIHJlcGx5WzFdWyctLS0tJ10sIGNyCisgICAgCiAKIGRlZiBjb21waWxlYWV0ZWxpc3QoYWV0ZWxpc3QsIGZ1bGxuYW1lLCBvdXRwdXQ9Tm9uZSwgYmFzZXBrZ25hbWU9Tm9uZSwgCi0JCQllZGl0X21vZG5hbWVzPU5vbmUsIGNyZWF0b3JzaWduYXR1cmU9Tm9uZSwgdmVyYm9zZT1Ob25lKToKLQlmb3IgYWV0ZSwgcmVzaW5mbyBpbiBhZXRlbGlzdDoKLQkJY29tcGlsZWFldGUoYWV0ZSwgcmVzaW5mbywgZnVsbG5hbWUsIG91dHB1dD1vdXRwdXQsIAotCQkJYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywKLQkJCWNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgdmVyYm9zZT12ZXJib3NlKQorICAgICAgICAgICAgZWRpdF9tb2RuYW1lcz1Ob25lLCBjcmVhdG9yc2lnbmF0dXJlPU5vbmUsIHZlcmJvc2U9Tm9uZSk6CisgICAgZm9yIGFldGUsIHJlc2luZm8gaW4gYWV0ZWxpc3Q6CisgICAgICAgIGNvbXBpbGVhZXRlKGFldGUsIHJlc2luZm8sIGZ1bGxuYW1lLCBvdXRwdXQ9b3V0cHV0LCAKKyAgICAgICAgICAgIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLCBlZGl0X21vZG5hbWVzPWVkaXRfbW9kbmFtZXMsCisgICAgICAgICAgICBjcmVhdG9yc2lnbmF0dXJlPWNyZWF0b3JzaWduYXR1cmUsIHZlcmJvc2U9dmVyYm9zZSkKIAogZGVmIGR1bXBhZXRlbGlzdChhZXRlbGlzdCwgb3V0cHV0KToKLQlpbXBvcnQgcHByaW50Ci0JcHByaW50LnBwcmludChhZXRlbGlzdCwgb3V0cHV0KQotCQorICAgIGltcG9ydCBwcHJpbnQKKyAgICBwcHJpbnQucHByaW50KGFldGVsaXN0LCBvdXRwdXQpCisgICAgCiBkZWYgZGVjb2RlKGRhdGEsIHZlcmJvc2U9Tm9uZSk6Ci0JIiIiRGVjb2RlIGEgcmVzb3VyY2UgaW50byBhIHB5dGhvbiBkYXRhIHN0cnVjdHVyZSIiIgotCWYgPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQotCWFldGUgPSBnZW5lcmljKGdldGFldGUsIGYpCi0JYWV0ZSA9IHNpbXBsaWZ5KGFldGUpCi0JcHJvY2Vzc2VkID0gZi50ZWxsKCkKLQl1bnByb2Nlc3NlZCA9IGxlbihmLnJlYWQoKSkKLQl0b3RhbCA9IGYudGVsbCgpCi0JaWYgdW5wcm9jZXNzZWQgYW5kIHZlcmJvc2U6Ci0JCXZlcmJvc2Uud3JpdGUoIiVkIHByb2Nlc3NlZCArICVkIHVucHJvY2Vzc2VkID0gJWQgdG90YWxcbiIgJQotCQkgICAgICAgICAgICAgICAgIChwcm9jZXNzZWQsIHVucHJvY2Vzc2VkLCB0b3RhbCkpCi0JcmV0dXJuIGFldGUKKyAgICAiIiJEZWNvZGUgYSByZXNvdXJjZSBpbnRvIGEgcHl0aG9uIGRhdGEgc3RydWN0dXJlIiIiCisgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCisgICAgYWV0ZSA9IGdlbmVyaWMoZ2V0YWV0ZSwgZikKKyAgICBhZXRlID0gc2ltcGxpZnkoYWV0ZSkKKyAgICBwcm9jZXNzZWQgPSBmLnRlbGwoKQorICAgIHVucHJvY2Vzc2VkID0gbGVuKGYucmVhZCgpKQorICAgIHRvdGFsID0gZi50ZWxsKCkKKyAgICBpZiB1bnByb2Nlc3NlZCBhbmQgdmVyYm9zZToKKyAgICAgICAgdmVyYm9zZS53cml0ZSgiJWQgcHJvY2Vzc2VkICsgJWQgdW5wcm9jZXNzZWQgPSAlZCB0b3RhbFxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NlZCwgdW5wcm9jZXNzZWQsIHRvdGFsKSkKKyAgICByZXR1cm4gYWV0ZQogCiBkZWYgc2ltcGxpZnkoaXRlbSk6Ci0JIiIiUmVjdXJzaXZlbHkgcmVwbGFjZSBzaW5nbGV0b24gdHVwbGVzIGJ5IHRoZWlyIGNvbnN0aXR1ZW50IGl0ZW0iIiIKLQlpZiB0eXBlKGl0ZW0pIGlzIHR5cGVzLkxpc3RUeXBlOgotCQlyZXR1cm4gbWFwKHNpbXBsaWZ5LCBpdGVtKQotCWVsaWYgdHlwZShpdGVtKSA9PSB0eXBlcy5UdXBsZVR5cGUgYW5kIGxlbihpdGVtKSA9PSAyOgotCQlyZXR1cm4gc2ltcGxpZnkoaXRlbVsxXSkKLQllbHNlOgotCQlyZXR1cm4gaXRlbQorICAgICIiIlJlY3Vyc2l2ZWx5IHJlcGxhY2Ugc2luZ2xldG9uIHR1cGxlcyBieSB0aGVpciBjb25zdGl0dWVudCBpdGVtIiIiCisgICAgaWYgdHlwZShpdGVtKSBpcyB0eXBlcy5MaXN0VHlwZToKKyAgICAgICAgcmV0dXJuIG1hcChzaW1wbGlmeSwgaXRlbSkKKyAgICBlbGlmIHR5cGUoaXRlbSkgPT0gdHlwZXMuVHVwbGVUeXBlIGFuZCBsZW4oaXRlbSkgPT0gMjoKKyAgICAgICAgcmV0dXJuIHNpbXBsaWZ5KGl0ZW1bMV0pCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGl0ZW0KIAogCiAjIEhlcmUgZm9sbG93cyB0aGUgYWV0ZSByZXNvdXJjZSBkZWNvZGVyLgpAQCAtMjkyLDUyMCArMjkyLDUyMCBAQAogIyByZWZlcmVuY2VzIHRvIHRoZSBsb3dlci1sZXZlbCBwYXJ0LWRlY29kZXJzIGZyb20gdGhlIGhpZ2gtbGV2ZWwgcGFydC1kZWNvZGVycy4KIAogZGVmIGdldGJ5dGUoZiwgKmFyZ3MpOgotCWMgPSBmLnJlYWQoMSkKLQlpZiBub3QgYzoKLQkJcmFpc2UgRU9GRXJyb3IsICdpbiBnZXRieXRlJyArIHN0cihhcmdzKQotCXJldHVybiBvcmQoYykKKyAgICBjID0gZi5yZWFkKDEpCisgICAgaWYgbm90IGM6CisgICAgICAgIHJhaXNlIEVPRkVycm9yLCAnaW4gZ2V0Ynl0ZScgKyBzdHIoYXJncykKKyAgICByZXR1cm4gb3JkKGMpCiAKIGRlZiBnZXR3b3JkKGYsICphcmdzKToKLQlnZXRhbGlnbihmKQotCXMgPSBmLnJlYWQoMikKLQlpZiBsZW4ocykgPCAyOgotCQlyYWlzZSBFT0ZFcnJvciwgJ2luIGdldHdvcmQnICsgc3RyKGFyZ3MpCi0JcmV0dXJuIChvcmQoc1swXSk8PDgpIHwgb3JkKHNbMV0pCisgICAgZ2V0YWxpZ24oZikKKyAgICBzID0gZi5yZWFkKDIpCisgICAgaWYgbGVuKHMpIDwgMjoKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IsICdpbiBnZXR3b3JkJyArIHN0cihhcmdzKQorICAgIHJldHVybiAob3JkKHNbMF0pPDw4KSB8IG9yZChzWzFdKQogCiBkZWYgZ2V0bG9uZyhmLCAqYXJncyk6Ci0JZ2V0YWxpZ24oZikKLQlzID0gZi5yZWFkKDQpCi0JaWYgbGVuKHMpIDwgNDoKLQkJcmFpc2UgRU9GRXJyb3IsICdpbiBnZXRsb25nJyArIHN0cihhcmdzKQotCXJldHVybiAob3JkKHNbMF0pPDwyNCkgfCAob3JkKHNbMV0pPDwxNikgfCAob3JkKHNbMl0pPDw4KSB8IG9yZChzWzNdKQorICAgIGdldGFsaWduKGYpCisgICAgcyA9IGYucmVhZCg0KQorICAgIGlmIGxlbihzKSA8IDQ6CisgICAgICAgIHJhaXNlIEVPRkVycm9yLCAnaW4gZ2V0bG9uZycgKyBzdHIoYXJncykKKyAgICByZXR1cm4gKG9yZChzWzBdKTw8MjQpIHwgKG9yZChzWzFdKTw8MTYpIHwgKG9yZChzWzJdKTw8OCkgfCBvcmQoc1szXSkKIAogZGVmIGdldG9zdHlwZShmLCAqYXJncyk6Ci0JZ2V0YWxpZ24oZikKLQlzID0gZi5yZWFkKDQpCi0JaWYgbGVuKHMpIDwgNDoKLQkJcmFpc2UgRU9GRXJyb3IsICdpbiBnZXRvc3R5cGUnICsgc3RyKGFyZ3MpCi0JcmV0dXJuIHMKKyAgICBnZXRhbGlnbihmKQorICAgIHMgPSBmLnJlYWQoNCkKKyAgICBpZiBsZW4ocykgPCA0OgorICAgICAgICByYWlzZSBFT0ZFcnJvciwgJ2luIGdldG9zdHlwZScgKyBzdHIoYXJncykKKyAgICByZXR1cm4gcwogCiBkZWYgZ2V0cHN0cihmLCAqYXJncyk6Ci0JYyA9IGYucmVhZCgxKQotCWlmIGxlbihjKSA8IDE6Ci0JCXJhaXNlIEVPRkVycm9yLCAnaW4gZ2V0cHN0clsxXScgKyBzdHIoYXJncykKLQluYnl0ZXMgPSBvcmQoYykKLQlpZiBuYnl0ZXMgPT0gMDogcmV0dXJuICcnCi0JcyA9IGYucmVhZChuYnl0ZXMpCi0JaWYgbGVuKHMpIDwgbmJ5dGVzOgotCQlyYWlzZSBFT0ZFcnJvciwgJ2luIGdldHBzdHJbMl0nICsgc3RyKGFyZ3MpCi0JcmV0dXJuIHMKKyAgICBjID0gZi5yZWFkKDEpCisgICAgaWYgbGVuKGMpIDwgMToKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IsICdpbiBnZXRwc3RyWzFdJyArIHN0cihhcmdzKQorICAgIG5ieXRlcyA9IG9yZChjKQorICAgIGlmIG5ieXRlcyA9PSAwOiByZXR1cm4gJycKKyAgICBzID0gZi5yZWFkKG5ieXRlcykKKyAgICBpZiBsZW4ocykgPCBuYnl0ZXM6CisgICAgICAgIHJhaXNlIEVPRkVycm9yLCAnaW4gZ2V0cHN0clsyXScgKyBzdHIoYXJncykKKyAgICByZXR1cm4gcwogCiBkZWYgZ2V0YWxpZ24oZik6Ci0JaWYgZi50ZWxsKCkgJiAxOgotCQljID0gZi5yZWFkKDEpCi0JCSMjaWYgYyA8PiAnXDAnOgotCQkjIwlwcmludCAnYWxpZ246JywgYGNgCisgICAgaWYgZi50ZWxsKCkgJiAxOgorICAgICAgICBjID0gZi5yZWFkKDEpCisgICAgICAgICMjaWYgYyA8PiAnXDAnOgorICAgICAgICAjIyAgcHJpbnQgJ2FsaWduOicsIGBjYAogCiBkZWYgZ2V0bGlzdChmLCBkZXNjcmlwdGlvbiwgZ2V0aXRlbSk6Ci0JY291bnQgPSBnZXR3b3JkKGYpCi0JbGlzdCA9IFtdCi0JZm9yIGkgaW4gcmFuZ2UoY291bnQpOgotCQlsaXN0LmFwcGVuZChnZW5lcmljKGdldGl0ZW0sIGYpKQotCQlnZXRhbGlnbihmKQotCXJldHVybiBsaXN0CisgICAgY291bnQgPSBnZXR3b3JkKGYpCisgICAgbGlzdCA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoY291bnQpOgorICAgICAgICBsaXN0LmFwcGVuZChnZW5lcmljKGdldGl0ZW0sIGYpKQorICAgICAgICBnZXRhbGlnbihmKQorICAgIHJldHVybiBsaXN0CiAKIGRlZiBhbHRfZ2VuZXJpYyh3aGF0LCBmLCAqYXJncyk6Ci0JcHJpbnQgImdlbmVyaWMiLCBgd2hhdGAsIGFyZ3MKLQlyZXMgPSB2YWdlbmVyaWMod2hhdCwgZiwgYXJncykKLQlwcmludCAnLT4nLCBgcmVzYAotCXJldHVybiByZXMKKyAgICBwcmludCAiZ2VuZXJpYyIsIGB3aGF0YCwgYXJncworICAgIHJlcyA9IHZhZ2VuZXJpYyh3aGF0LCBmLCBhcmdzKQorICAgIHByaW50ICctPicsIGByZXNgCisgICAgcmV0dXJuIHJlcwogCiBkZWYgZ2VuZXJpYyh3aGF0LCBmLCAqYXJncyk6Ci0JaWYgdHlwZSh3aGF0KSA9PSB0eXBlcy5GdW5jdGlvblR5cGU6Ci0JCXJldHVybiBhcHBseSh3aGF0LCAoZiwpICsgYXJncykKLQlpZiB0eXBlKHdoYXQpID09IHR5cGVzLkxpc3RUeXBlOgotCQlyZWNvcmQgPSBbXQotCQlmb3IgdGhpbmcgaW4gd2hhdDoKLQkJCWl0ZW0gPSBhcHBseShnZW5lcmljLCB0aGluZ1s6MV0gKyAoZiwpICsgdGhpbmdbMTpdKQotCQkJcmVjb3JkLmFwcGVuZCgodGhpbmdbMV0sIGl0ZW0pKQotCQlyZXR1cm4gcmVjb3JkCi0JcmV0dXJuICJCQUQgR0VORVJJQyBBUkdTOiAlcyIgJSBgd2hhdGAKKyAgICBpZiB0eXBlKHdoYXQpID09IHR5cGVzLkZ1bmN0aW9uVHlwZToKKyAgICAgICAgcmV0dXJuIGFwcGx5KHdoYXQsIChmLCkgKyBhcmdzKQorICAgIGlmIHR5cGUod2hhdCkgPT0gdHlwZXMuTGlzdFR5cGU6CisgICAgICAgIHJlY29yZCA9IFtdCisgICAgICAgIGZvciB0aGluZyBpbiB3aGF0OgorICAgICAgICAgICAgaXRlbSA9IGFwcGx5KGdlbmVyaWMsIHRoaW5nWzoxXSArIChmLCkgKyB0aGluZ1sxOl0pCisgICAgICAgICAgICByZWNvcmQuYXBwZW5kKCh0aGluZ1sxXSwgaXRlbSkpCisgICAgICAgIHJldHVybiByZWNvcmQKKyAgICByZXR1cm4gIkJBRCBHRU5FUklDIEFSR1M6ICVzIiAlIGB3aGF0YAogCiBnZXRkYXRhID0gWwotCShnZXRvc3R5cGUsICJ0eXBlIiksCi0JKGdldHBzdHIsICJkZXNjcmlwdGlvbiIpLAotCShnZXR3b3JkLCAiZmxhZ3MiKQotCV0KKyAgICAoZ2V0b3N0eXBlLCAidHlwZSIpLAorICAgIChnZXRwc3RyLCAiZGVzY3JpcHRpb24iKSwKKyAgICAoZ2V0d29yZCwgImZsYWdzIikKKyAgICBdCiBnZXRhcmd1bWVudCA9IFsKLQkoZ2V0cHN0ciwgIm5hbWUiKSwKLQkoZ2V0b3N0eXBlLCAia2V5d29yZCIpLAotCShnZXRkYXRhLCAid2hhdCIpCi0JXQorICAgIChnZXRwc3RyLCAibmFtZSIpLAorICAgIChnZXRvc3R5cGUsICJrZXl3b3JkIiksCisgICAgKGdldGRhdGEsICJ3aGF0IikKKyAgICBdCiBnZXRldmVudCA9IFsKLQkoZ2V0cHN0ciwgIm5hbWUiKSwKLQkoZ2V0cHN0ciwgImRlc2NyaXB0aW9uIiksCi0JKGdldG9zdHlwZSwgInN1aXRlIGNvZGUiKSwKLQkoZ2V0b3N0eXBlLCAiZXZlbnQgY29kZSIpLAotCShnZXRkYXRhLCAicmV0dXJucyIpLAotCShnZXRkYXRhLCAiYWNjZXB0cyIpLAotCShnZXRsaXN0LCAib3B0aW9uYWwgYXJndW1lbnRzIiwgZ2V0YXJndW1lbnQpCi0JXQorICAgIChnZXRwc3RyLCAibmFtZSIpLAorICAgIChnZXRwc3RyLCAiZGVzY3JpcHRpb24iKSwKKyAgICAoZ2V0b3N0eXBlLCAic3VpdGUgY29kZSIpLAorICAgIChnZXRvc3R5cGUsICJldmVudCBjb2RlIiksCisgICAgKGdldGRhdGEsICJyZXR1cm5zIiksCisgICAgKGdldGRhdGEsICJhY2NlcHRzIiksCisgICAgKGdldGxpc3QsICJvcHRpb25hbCBhcmd1bWVudHMiLCBnZXRhcmd1bWVudCkKKyAgICBdCiBnZXRwcm9wZXJ0eSA9IFsKLQkoZ2V0cHN0ciwgIm5hbWUiKSwKLQkoZ2V0b3N0eXBlLCAiY29kZSIpLAotCShnZXRkYXRhLCAid2hhdCIpCi0JXQorICAgIChnZXRwc3RyLCAibmFtZSIpLAorICAgIChnZXRvc3R5cGUsICJjb2RlIiksCisgICAgKGdldGRhdGEsICJ3aGF0IikKKyAgICBdCiBnZXRlbGVtZW50ID0gWwotCShnZXRvc3R5cGUsICJ0eXBlIiksCi0JKGdldGxpc3QsICJrZXlmb3JtIiwgZ2V0b3N0eXBlKQotCV0KKyAgICAoZ2V0b3N0eXBlLCAidHlwZSIpLAorICAgIChnZXRsaXN0LCAia2V5Zm9ybSIsIGdldG9zdHlwZSkKKyAgICBdCiBnZXRjbGFzcyA9IFsKLQkoZ2V0cHN0ciwgIm5hbWUiKSwKLQkoZ2V0b3N0eXBlLCAiY2xhc3MgY29kZSIpLAotCShnZXRwc3RyLCAiZGVzY3JpcHRpb24iKSwKLQkoZ2V0bGlzdCwgInByb3BlcnRpZXMiLCBnZXRwcm9wZXJ0eSksCi0JKGdldGxpc3QsICJlbGVtZW50cyIsIGdldGVsZW1lbnQpCi0JXQorICAgIChnZXRwc3RyLCAibmFtZSIpLAorICAgIChnZXRvc3R5cGUsICJjbGFzcyBjb2RlIiksCisgICAgKGdldHBzdHIsICJkZXNjcmlwdGlvbiIpLAorICAgIChnZXRsaXN0LCAicHJvcGVydGllcyIsIGdldHByb3BlcnR5KSwKKyAgICAoZ2V0bGlzdCwgImVsZW1lbnRzIiwgZ2V0ZWxlbWVudCkKKyAgICBdCiBnZXRjb21wYXJpc29uID0gWwotCShnZXRwc3RyLCAib3BlcmF0b3IgbmFtZSIpLAotCShnZXRvc3R5cGUsICJvcGVyYXRvciBJRCIpLAotCShnZXRwc3RyLCAib3BlcmF0b3IgY29tbWVudCIpLAotCV0KKyAgICAoZ2V0cHN0ciwgIm9wZXJhdG9yIG5hbWUiKSwKKyAgICAoZ2V0b3N0eXBlLCAib3BlcmF0b3IgSUQiKSwKKyAgICAoZ2V0cHN0ciwgIm9wZXJhdG9yIGNvbW1lbnQiKSwKKyAgICBdCiBnZXRlbnVtZXJhdG9yID0gWwotCShnZXRwc3RyLCAiZW51bWVyYXRvciBuYW1lIiksCi0JKGdldG9zdHlwZSwgImVudW1lcmF0b3IgSUQiKSwKLQkoZ2V0cHN0ciwgImVudW1lcmF0b3IgY29tbWVudCIpCi0JXQorICAgIChnZXRwc3RyLCAiZW51bWVyYXRvciBuYW1lIiksCisgICAgKGdldG9zdHlwZSwgImVudW1lcmF0b3IgSUQiKSwKKyAgICAoZ2V0cHN0ciwgImVudW1lcmF0b3IgY29tbWVudCIpCisgICAgXQogZ2V0ZW51bWVyYXRpb24gPSBbCi0JKGdldG9zdHlwZSwgImVudW1lcmF0aW9uIElEIiksCi0JKGdldGxpc3QsICJlbnVtZXJhdG9yIiwgZ2V0ZW51bWVyYXRvcikKLQldCisgICAgKGdldG9zdHlwZSwgImVudW1lcmF0aW9uIElEIiksCisgICAgKGdldGxpc3QsICJlbnVtZXJhdG9yIiwgZ2V0ZW51bWVyYXRvcikKKyAgICBdCiBnZXRzdWl0ZSA9IFsKLQkoZ2V0cHN0ciwgInN1aXRlIG5hbWUiKSwKLQkoZ2V0cHN0ciwgInN1aXRlIGRlc2NyaXB0aW9uIiksCi0JKGdldG9zdHlwZSwgInN1aXRlIElEIiksCi0JKGdldHdvcmQsICJzdWl0ZSBsZXZlbCIpLAotCShnZXR3b3JkLCAic3VpdGUgdmVyc2lvbiIpLAotCShnZXRsaXN0LCAiZXZlbnRzIiwgZ2V0ZXZlbnQpLAotCShnZXRsaXN0LCAiY2xhc3NlcyIsIGdldGNsYXNzKSwKLQkoZ2V0bGlzdCwgImNvbXBhcmlzb25zIiwgZ2V0Y29tcGFyaXNvbiksCi0JKGdldGxpc3QsICJlbnVtZXJhdGlvbnMiLCBnZXRlbnVtZXJhdGlvbikKLQldCisgICAgKGdldHBzdHIsICJzdWl0ZSBuYW1lIiksCisgICAgKGdldHBzdHIsICJzdWl0ZSBkZXNjcmlwdGlvbiIpLAorICAgIChnZXRvc3R5cGUsICJzdWl0ZSBJRCIpLAorICAgIChnZXR3b3JkLCAic3VpdGUgbGV2ZWwiKSwKKyAgICAoZ2V0d29yZCwgInN1aXRlIHZlcnNpb24iKSwKKyAgICAoZ2V0bGlzdCwgImV2ZW50cyIsIGdldGV2ZW50KSwKKyAgICAoZ2V0bGlzdCwgImNsYXNzZXMiLCBnZXRjbGFzcyksCisgICAgKGdldGxpc3QsICJjb21wYXJpc29ucyIsIGdldGNvbXBhcmlzb24pLAorICAgIChnZXRsaXN0LCAiZW51bWVyYXRpb25zIiwgZ2V0ZW51bWVyYXRpb24pCisgICAgXQogZ2V0YWV0ZSA9IFsKLQkoZ2V0d29yZCwgIm1ham9yL21pbm9yIHZlcnNpb24gaW4gQkNEIiksCi0JKGdldHdvcmQsICJsYW5ndWFnZSBjb2RlIiksCi0JKGdldHdvcmQsICJzY3JpcHQgY29kZSIpLAotCShnZXRsaXN0LCAic3VpdGVzIiwgZ2V0c3VpdGUpCi0JXQorICAgIChnZXR3b3JkLCAibWFqb3IvbWlub3IgdmVyc2lvbiBpbiBCQ0QiKSwKKyAgICAoZ2V0d29yZCwgImxhbmd1YWdlIGNvZGUiKSwKKyAgICAoZ2V0d29yZCwgInNjcmlwdCBjb2RlIiksCisgICAgKGdldGxpc3QsICJzdWl0ZXMiLCBnZXRzdWl0ZSkKKyAgICBdCiAKIGRlZiBjb21waWxlYWV0ZShhZXRlLCByZXNpbmZvLCBmbmFtZSwgb3V0cHV0PU5vbmUsIGJhc2Vwa2duYW1lPU5vbmUsIAotCQllZGl0X21vZG5hbWVzPU5vbmUsIGNyZWF0b3JzaWduYXR1cmU9Tm9uZSwgdmVyYm9zZT1Ob25lKToKLQkiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIGZ1bGwgYWV0ZSByZXNvdXJjZS4gZm5hbWUgcGFzc2VkIGZvciBkb2MgcHVycG9zZXMiIiIKLQlbdmVyc2lvbiwgbGFuZ3VhZ2UsIHNjcmlwdCwgc3VpdGVzXSA9IGFldGUKLQltYWpvciwgbWlub3IgPSBkaXZtb2QodmVyc2lvbiwgMjU2KQotCWlmIG5vdCBjcmVhdG9yc2lnbmF0dXJlOgotCQljcmVhdG9yc2lnbmF0dXJlLCBkdW1teSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKGZuYW1lKQotCXBhY2thZ2VuYW1lID0gaWRlbnRpZnkob3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZuYW1lKSlbMF0pCi0JaWYgbGFuZ3VhZ2U6Ci0JCXBhY2thZ2VuYW1lID0gcGFja2FnZW5hbWUrJ19sYW5nJWQnJWxhbmd1YWdlCi0JaWYgc2NyaXB0OgotCQlwYWNrYWdlbmFtZSA9IHBhY2thZ2VuYW1lKydfc2NyaXB0JWQnJXNjcmlwdAotCWlmIGxlbihwYWNrYWdlbmFtZSkgPiAyNzoKLQkJcGFja2FnZW5hbWUgPSBwYWNrYWdlbmFtZVs6MjddCi0JaWYgb3V0cHV0OgotCQkjIFhYWFggUHV0IHRoaXMgaW4gc2l0ZS1wYWNrYWdlcyBpZiBpdCBpc24ndCBhIGZ1bGwgcGF0aG5hbWU/Ci0JCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXQpOgotCQkJb3MubWtkaXIob3V0cHV0KQotCQlwYXRobmFtZSA9IG91dHB1dAotCWVsc2U6Ci0JCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKG1lc3NhZ2U9J0NyZWF0ZSBhbmQgc2VsZWN0IHBhY2thZ2UgZm9sZGVyIGZvciAlcyclcGFja2FnZW5hbWUsCi0JCQlkZWZhdWx0TG9jYXRpb249REVGQVVMVF9VU0VSX1BBQ0tBR0VGT0xERVIpCi0JCW91dHB1dCA9IHBhdGhuYW1lCi0JaWYgbm90IHBhdGhuYW1lOgotCQlyZXR1cm4KLQlwYWNrYWdlbmFtZSA9IG9zLnBhdGguc3BsaXQob3MucGF0aC5ub3JtcGF0aChwYXRobmFtZSkpWzFdCi0JaWYgbm90IGJhc2Vwa2duYW1lOgotCQliYXNlcGtnbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcihtZXNzYWdlPSdQYWNrYWdlIGZvbGRlciBmb3IgYmFzZSBzdWl0ZSAodXN1YWxseSBTdGRTdWl0ZXMpJywKLQkJCWRlZmF1bHRMb2NhdGlvbj1ERUZBVUxUX1NUQU5EQVJEX1BBQ0tBR0VGT0xERVIpCi0JaWYgYmFzZXBrZ25hbWU6Ci0JCWRpcm5hbWUsIGJhc2Vwa2duYW1lID0gb3MucGF0aC5zcGxpdChvcy5wYXRoLm5vcm1wYXRoKGJhc2Vwa2duYW1lKSkKLQkJaWYgZGlybmFtZSBhbmQgbm90IGRpcm5hbWUgaW4gc3lzLnBhdGg6Ci0JCQlzeXMucGF0aC5pbnNlcnQoMCwgZGlybmFtZSkKLQkJYmFzZXBhY2thZ2UgPSBfX2ltcG9ydF9fKGJhc2Vwa2duYW1lKQotCWVsc2U6Ci0JCWJhc2VwYWNrYWdlID0gTm9uZQotCXN1aXRlbGlzdCA9IFtdCi0JYWxscHJlY29tcGluZm8gPSBbXQotCWFsbHN1aXRlcyA9IFtdCi0JZm9yIHN1aXRlIGluIHN1aXRlczoKLQkJY29tcGlsZXIgPSBTdWl0ZUNvbXBpbGVyKHN1aXRlLCBiYXNlcGFja2FnZSwgb3V0cHV0LCBlZGl0X21vZG5hbWVzLCB2ZXJib3NlKQotCQljb2RlLCBtb2RuYW1lLCBwcmVjb21waW5mbyA9IGNvbXBpbGVyLnByZWNvbXBpbGVzdWl0ZSgpCi0JCWlmIG5vdCBjb2RlOgotCQkJY29udGludWUKLQkJYWxscHJlY29tcGluZm8gPSBhbGxwcmVjb21waW5mbyArIHByZWNvbXBpbmZvCi0JCXN1aXRlaW5mbyA9IHN1aXRlLCBwYXRobmFtZSwgbW9kbmFtZQotCQlzdWl0ZWxpc3QuYXBwZW5kKChjb2RlLCBtb2RuYW1lKSkKLQkJYWxsc3VpdGVzLmFwcGVuZChjb21waWxlcikKLQlmb3IgY29tcGlsZXIgaW4gYWxsc3VpdGVzOgotCQljb21waWxlci5jb21waWxlc3VpdGUobWFqb3IsIG1pbm9yLCBsYW5ndWFnZSwgc2NyaXB0LCBmbmFtZSwgYWxscHJlY29tcGluZm8pCi0JaW5pdGZpbGVuYW1lID0gb3MucGF0aC5qb2luKG91dHB1dCwgJ19faW5pdF9fLnB5JykKLQlmcCA9IG9wZW4oaW5pdGZpbGVuYW1lLCAndycpCi0JTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoaW5pdGZpbGVuYW1lLCAnUHl0aCcsICdURVhUJykKLQlmcC53cml0ZSgnIiIiXG4nKQotCWZwLndyaXRlKCJQYWNrYWdlIGdlbmVyYXRlZCBmcm9tICVzXG4iJWFzY2lpKGZuYW1lKSkKLQlpZiByZXNpbmZvOgotCQlmcC53cml0ZSgiUmVzb3VyY2UgJXMgcmVzaWQgJWQgJXNcbiIlKGFzY2lpKHJlc2luZm9bMV0pLCByZXNpbmZvWzBdLCBhc2NpaShyZXNpbmZvWzJdKSkpCi0JZnAud3JpdGUoJyIiIlxuJykKLQlmcC53cml0ZSgnaW1wb3J0IGFldG9vbHNcbicpCi0JZnAud3JpdGUoJ0Vycm9yID0gYWV0b29scy5FcnJvclxuJykKLQlzdWl0ZWxpc3Quc29ydCgpCi0JZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgotCQlmcC53cml0ZSgiaW1wb3J0ICVzXG4iICUgbW9kbmFtZSkKLQlmcC53cml0ZSgiXG5cbl9jb2RlX3RvX21vZHVsZSA9IHtcbiIpCi0JZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgotCQlmcC53cml0ZSgiXHQnJXMnIDogJXMsXG4iJShhc2NpaShjb2RlKSwgbW9kbmFtZSkpCi0JZnAud3JpdGUoIn1cblxuIikKLQlmcC53cml0ZSgiXG5cbl9jb2RlX3RvX2Z1bGxuYW1lID0ge1xuIikKLQlmb3IgY29kZSwgbW9kbmFtZSBpbiBzdWl0ZWxpc3Q6Ci0JCWZwLndyaXRlKCJcdCclcycgOiAoJyVzLiVzJywgJyVzJyksXG4iJShhc2NpaShjb2RlKSwgcGFja2FnZW5hbWUsIG1vZG5hbWUsIG1vZG5hbWUpKQotCWZwLndyaXRlKCJ9XG5cbiIpCi0JZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgotCQlmcC53cml0ZSgiZnJvbSAlcyBpbXBvcnQgKlxuIiVtb2RuYW1lKQotCQotCSMgR2VuZXJhdGUgcHJvcGVydHkgZGljdHMgYW5kIGVsZW1lbnQgZGljdHMgZm9yIGFsbCB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQotCWZwLndyaXRlKCJcbmRlZiBnZXRiYXNlY2xhc3Nlcyh2KTpcbiIpCi0JZnAud3JpdGUoIlx0aWYgbm90IGdldGF0dHIodiwgJ19wcm9wZGljdCcsIE5vbmUpOlxuIikKLQlmcC53cml0ZSgiXHRcdHYuX3Byb3BkaWN0ID0ge31cbiIpCi0JZnAud3JpdGUoIlx0XHR2Ll9lbGVtZGljdCA9IHt9XG4iKQotCWZwLndyaXRlKCJcdFx0Zm9yIHN1cGVyY2xhc3NuYW1lIGluIGdldGF0dHIodiwgJ19zdXBlcmNsYXNzbmFtZXMnLCBbXSk6XG4iKQotCWZwLndyaXRlKCJcdFx0XHRzdXBlcmNsYXNzID0gZXZhbChzdXBlcmNsYXNzbmFtZSlcbiIpCi0JZnAud3JpdGUoIlx0XHRcdGdldGJhc2VjbGFzc2VzKHN1cGVyY2xhc3MpXG4iKQotCWZwLndyaXRlKCJcdFx0XHR2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX3Byb3BkaWN0Jywge30pKVxuIikKLQlmcC53cml0ZSgiXHRcdFx0di5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIoc3VwZXJjbGFzcywgJ19lbGVtZGljdCcsIHt9KSlcbiIpCi0JZnAud3JpdGUoIlx0XHR2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZwcm9wZGljdCcsIHt9KSlcbiIpCi0JZnAud3JpdGUoIlx0XHR2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZlbGVtZGljdCcsIHt9KSlcbiIpCi0JZnAud3JpdGUoIlxuIikKLQlmcC53cml0ZSgiaW1wb3J0IFN0ZFN1aXRlc1xuIikKLQlhbGxwcmVjb21waW5mby5zb3J0KCkKLQlpZiBhbGxwcmVjb21waW5mbzoKLQkJZnAud3JpdGUoIlxuI1xuIyBTZXQgcHJvcGVydHkgYW5kIGVsZW1lbnQgZGljdGlvbmFyaWVzIG5vdyB0aGF0IGFsbCBjbGFzc2VzIGhhdmUgYmVlbiBkZWZpbmVkXG4jXG4iKQotCQlmb3IgY29kZW5hbWVtYXBwZXIgaW4gYWxscHJlY29tcGluZm86Ci0JCQlmb3IgaywgdiBpbiBjb2RlbmFtZW1hcHBlci5nZXRhbGwoJ2NsYXNzJyk6Ci0JCQkJZnAud3JpdGUoImdldGJhc2VjbGFzc2VzKCVzKVxuIiAlIHYpCisgICAgICAgIGVkaXRfbW9kbmFtZXM9Tm9uZSwgY3JlYXRvcnNpZ25hdHVyZT1Ob25lLCB2ZXJib3NlPU5vbmUpOgorICAgICIiIkdlbmVyYXRlIGNvZGUgZm9yIGEgZnVsbCBhZXRlIHJlc291cmNlLiBmbmFtZSBwYXNzZWQgZm9yIGRvYyBwdXJwb3NlcyIiIgorICAgIFt2ZXJzaW9uLCBsYW5ndWFnZSwgc2NyaXB0LCBzdWl0ZXNdID0gYWV0ZQorICAgIG1ham9yLCBtaW5vciA9IGRpdm1vZCh2ZXJzaW9uLCAyNTYpCisgICAgaWYgbm90IGNyZWF0b3JzaWduYXR1cmU6CisgICAgICAgIGNyZWF0b3JzaWduYXR1cmUsIGR1bW15ID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUoZm5hbWUpCisgICAgcGFja2FnZW5hbWUgPSBpZGVudGlmeShvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZm5hbWUpKVswXSkKKyAgICBpZiBsYW5ndWFnZToKKyAgICAgICAgcGFja2FnZW5hbWUgPSBwYWNrYWdlbmFtZSsnX2xhbmclZCclbGFuZ3VhZ2UKKyAgICBpZiBzY3JpcHQ6CisgICAgICAgIHBhY2thZ2VuYW1lID0gcGFja2FnZW5hbWUrJ19zY3JpcHQlZCclc2NyaXB0CisgICAgaWYgbGVuKHBhY2thZ2VuYW1lKSA+IDI3OgorICAgICAgICBwYWNrYWdlbmFtZSA9IHBhY2thZ2VuYW1lWzoyN10KKyAgICBpZiBvdXRwdXQ6CisgICAgICAgICMgWFhYWCBQdXQgdGhpcyBpbiBzaXRlLXBhY2thZ2VzIGlmIGl0IGlzbid0IGEgZnVsbCBwYXRobmFtZT8KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG91dHB1dCk6CisgICAgICAgICAgICBvcy5ta2RpcihvdXRwdXQpCisgICAgICAgIHBhdGhuYW1lID0gb3V0cHV0CisgICAgZWxzZToKKyAgICAgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIobWVzc2FnZT0nQ3JlYXRlIGFuZCBzZWxlY3QgcGFja2FnZSBmb2xkZXIgZm9yICVzJyVwYWNrYWdlbmFtZSwKKyAgICAgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1ERUZBVUxUX1VTRVJfUEFDS0FHRUZPTERFUikKKyAgICAgICAgb3V0cHV0ID0gcGF0aG5hbWUKKyAgICBpZiBub3QgcGF0aG5hbWU6CisgICAgICAgIHJldHVybgorICAgIHBhY2thZ2VuYW1lID0gb3MucGF0aC5zcGxpdChvcy5wYXRoLm5vcm1wYXRoKHBhdGhuYW1lKSlbMV0KKyAgICBpZiBub3QgYmFzZXBrZ25hbWU6CisgICAgICAgIGJhc2Vwa2duYW1lID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKG1lc3NhZ2U9J1BhY2thZ2UgZm9sZGVyIGZvciBiYXNlIHN1aXRlICh1c3VhbGx5IFN0ZFN1aXRlcyknLAorICAgICAgICAgICAgZGVmYXVsdExvY2F0aW9uPURFRkFVTFRfU1RBTkRBUkRfUEFDS0FHRUZPTERFUikKKyAgICBpZiBiYXNlcGtnbmFtZToKKyAgICAgICAgZGlybmFtZSwgYmFzZXBrZ25hbWUgPSBvcy5wYXRoLnNwbGl0KG9zLnBhdGgubm9ybXBhdGgoYmFzZXBrZ25hbWUpKQorICAgICAgICBpZiBkaXJuYW1lIGFuZCBub3QgZGlybmFtZSBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBkaXJuYW1lKQorICAgICAgICBiYXNlcGFja2FnZSA9IF9faW1wb3J0X18oYmFzZXBrZ25hbWUpCisgICAgZWxzZToKKyAgICAgICAgYmFzZXBhY2thZ2UgPSBOb25lCisgICAgc3VpdGVsaXN0ID0gW10KKyAgICBhbGxwcmVjb21waW5mbyA9IFtdCisgICAgYWxsc3VpdGVzID0gW10KKyAgICBmb3Igc3VpdGUgaW4gc3VpdGVzOgorICAgICAgICBjb21waWxlciA9IFN1aXRlQ29tcGlsZXIoc3VpdGUsIGJhc2VwYWNrYWdlLCBvdXRwdXQsIGVkaXRfbW9kbmFtZXMsIHZlcmJvc2UpCisgICAgICAgIGNvZGUsIG1vZG5hbWUsIHByZWNvbXBpbmZvID0gY29tcGlsZXIucHJlY29tcGlsZXN1aXRlKCkKKyAgICAgICAgaWYgbm90IGNvZGU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBhbGxwcmVjb21waW5mbyA9IGFsbHByZWNvbXBpbmZvICsgcHJlY29tcGluZm8KKyAgICAgICAgc3VpdGVpbmZvID0gc3VpdGUsIHBhdGhuYW1lLCBtb2RuYW1lCisgICAgICAgIHN1aXRlbGlzdC5hcHBlbmQoKGNvZGUsIG1vZG5hbWUpKQorICAgICAgICBhbGxzdWl0ZXMuYXBwZW5kKGNvbXBpbGVyKQorICAgIGZvciBjb21waWxlciBpbiBhbGxzdWl0ZXM6CisgICAgICAgIGNvbXBpbGVyLmNvbXBpbGVzdWl0ZShtYWpvciwgbWlub3IsIGxhbmd1YWdlLCBzY3JpcHQsIGZuYW1lLCBhbGxwcmVjb21waW5mbykKKyAgICBpbml0ZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnX19pbml0X18ucHknKQorICAgIGZwID0gb3Blbihpbml0ZmlsZW5hbWUsICd3JykKKyAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShpbml0ZmlsZW5hbWUsICdQeXRoJywgJ1RFWFQnKQorICAgIGZwLndyaXRlKCciIiJcbicpCisgICAgZnAud3JpdGUoIlBhY2thZ2UgZ2VuZXJhdGVkIGZyb20gJXNcbiIlYXNjaWkoZm5hbWUpKQorICAgIGlmIHJlc2luZm86CisgICAgICAgIGZwLndyaXRlKCJSZXNvdXJjZSAlcyByZXNpZCAlZCAlc1xuIiUoYXNjaWkocmVzaW5mb1sxXSksIHJlc2luZm9bMF0sIGFzY2lpKHJlc2luZm9bMl0pKSkKKyAgICBmcC53cml0ZSgnIiIiXG4nKQorICAgIGZwLndyaXRlKCdpbXBvcnQgYWV0b29sc1xuJykKKyAgICBmcC53cml0ZSgnRXJyb3IgPSBhZXRvb2xzLkVycm9yXG4nKQorICAgIHN1aXRlbGlzdC5zb3J0KCkKKyAgICBmb3IgY29kZSwgbW9kbmFtZSBpbiBzdWl0ZWxpc3Q6CisgICAgICAgIGZwLndyaXRlKCJpbXBvcnQgJXNcbiIgJSBtb2RuYW1lKQorICAgIGZwLndyaXRlKCJcblxuX2NvZGVfdG9fbW9kdWxlID0ge1xuIikKKyAgICBmb3IgY29kZSwgbW9kbmFtZSBpbiBzdWl0ZWxpc3Q6CisgICAgICAgIGZwLndyaXRlKCIgICAgJyVzJyA6ICVzLFxuIiUoYXNjaWkoY29kZSksIG1vZG5hbWUpKQorICAgIGZwLndyaXRlKCJ9XG5cbiIpCisgICAgZnAud3JpdGUoIlxuXG5fY29kZV90b19mdWxsbmFtZSA9IHtcbiIpCisgICAgZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgorICAgICAgICBmcC53cml0ZSgiICAgICclcycgOiAoJyVzLiVzJywgJyVzJyksXG4iJShhc2NpaShjb2RlKSwgcGFja2FnZW5hbWUsIG1vZG5hbWUsIG1vZG5hbWUpKQorICAgIGZwLndyaXRlKCJ9XG5cbiIpCisgICAgZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgorICAgICAgICBmcC53cml0ZSgiZnJvbSAlcyBpbXBvcnQgKlxuIiVtb2RuYW1lKQorICAgIAorICAgICMgR2VuZXJhdGUgcHJvcGVydHkgZGljdHMgYW5kIGVsZW1lbnQgZGljdHMgZm9yIGFsbCB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorICAgIGZwLndyaXRlKCJcbmRlZiBnZXRiYXNlY2xhc3Nlcyh2KTpcbiIpCisgICAgZnAud3JpdGUoIiAgICBpZiBub3QgZ2V0YXR0cih2LCAnX3Byb3BkaWN0JywgTm9uZSk6XG4iKQorICAgIGZwLndyaXRlKCIgICAgICAgIHYuX3Byb3BkaWN0ID0ge31cbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgdi5fZWxlbWRpY3QgPSB7fVxuIikKKyAgICBmcC53cml0ZSgiICAgICAgICBmb3Igc3VwZXJjbGFzc25hbWUgaW4gZ2V0YXR0cih2LCAnX3N1cGVyY2xhc3NuYW1lcycsIFtdKTpcbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHN1cGVyY2xhc3MgPSBldmFsKHN1cGVyY2xhc3NuYW1lKVxuIikKKyAgICBmcC53cml0ZSgiICAgICAgICAgICAgZ2V0YmFzZWNsYXNzZXMoc3VwZXJjbGFzcylcbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfcHJvcGRpY3QnLCB7fSkpXG4iKQorICAgIGZwLndyaXRlKCIgICAgICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX2VsZW1kaWN0Jywge30pKVxuIikKKyAgICBmcC53cml0ZSgiICAgICAgICB2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZwcm9wZGljdCcsIHt9KSlcbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgdi5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIodiwgJ19wcml2ZWxlbWRpY3QnLCB7fSkpXG4iKQorICAgIGZwLndyaXRlKCJcbiIpCisgICAgZnAud3JpdGUoImltcG9ydCBTdGRTdWl0ZXNcbiIpCisgICAgYWxscHJlY29tcGluZm8uc29ydCgpCisgICAgaWYgYWxscHJlY29tcGluZm86CisgICAgICAgIGZwLndyaXRlKCJcbiNcbiMgU2V0IHByb3BlcnR5IGFuZCBlbGVtZW50IGRpY3Rpb25hcmllcyBub3cgdGhhdCBhbGwgY2xhc3NlcyBoYXZlIGJlZW4gZGVmaW5lZFxuI1xuIikKKyAgICAgICAgZm9yIGNvZGVuYW1lbWFwcGVyIGluIGFsbHByZWNvbXBpbmZvOgorICAgICAgICAgICAgZm9yIGssIHYgaW4gY29kZW5hbWVtYXBwZXIuZ2V0YWxsKCdjbGFzcycpOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCJnZXRiYXNlY2xhc3NlcyglcylcbiIgJSB2KQogCi0JIyBHZW5lcmF0ZSBhIGNvZGUtdG8tbmFtZSBtYXBwZXIgZm9yIGFsbCBvZiB0aGUgdHlwZXMgKGNsYXNzZXMpIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCi0JaWYgYWxscHJlY29tcGluZm86Ci0JCWZwLndyaXRlKCJcbiNcbiMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZVxuI1xuIikKLQkJZnAud3JpdGUoIl9jbGFzc2RlY2xhcmF0aW9ucyA9IHtcbiIpCi0JCWZvciBjb2RlbmFtZW1hcHBlciBpbiBhbGxwcmVjb21waW5mbzoKLQkJCWZvciBrLCB2IGluIGNvZGVuYW1lbWFwcGVyLmdldGFsbCgnY2xhc3MnKToKLQkJCQlmcC53cml0ZSgiXHQlcyA6ICVzLFxuIiAlIChga2AsIHYpKQotCQlmcC53cml0ZSgifVxuIikKKyAgICAjIEdlbmVyYXRlIGEgY29kZS10by1uYW1lIG1hcHBlciBmb3IgYWxsIG9mIHRoZSB0eXBlcyAoY2xhc3NlcykgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyAgICBpZiBhbGxwcmVjb21waW5mbzoKKyAgICAgICAgZnAud3JpdGUoIlxuI1xuIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlXG4jXG4iKQorICAgICAgICBmcC53cml0ZSgiX2NsYXNzZGVjbGFyYXRpb25zID0ge1xuIikKKyAgICAgICAgZm9yIGNvZGVuYW1lbWFwcGVyIGluIGFsbHByZWNvbXBpbmZvOgorICAgICAgICAgICAgZm9yIGssIHYgaW4gY29kZW5hbWVtYXBwZXIuZ2V0YWxsKCdjbGFzcycpOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCIgICAgJXMgOiAlcyxcbiIgJSAoYGtgLCB2KSkKKyAgICAgICAgZnAud3JpdGUoIn1cbiIpCiAKLQlpZiBzdWl0ZWxpc3Q6Ci0JCWZwLndyaXRlKCJcblxuY2xhc3MgJXMoJXNfRXZlbnRzIiUocGFja2FnZW5hbWUsIHN1aXRlbGlzdFswXVsxXSkpCi0JCWZvciBjb2RlLCBtb2RuYW1lIGluIHN1aXRlbGlzdFsxOl06Ci0JCQlmcC53cml0ZSgiLFxuXHRcdCVzX0V2ZW50cyIlbW9kbmFtZSkKLQkJZnAud3JpdGUoIixcblx0XHRhZXRvb2xzLlRhbGtUbyk6XG4iKQotCQlmcC53cml0ZSgiXHRfc2lnbmF0dXJlID0gJXNcblxuIiVgY3JlYXRvcnNpZ25hdHVyZWApCi0JCWZwLndyaXRlKCJcdF9tb2R1bGVOYW1lID0gJyVzJ1xuXG4iJXBhY2thZ2VuYW1lKQotCWZwLmNsb3NlKCkKKyAgICBpZiBzdWl0ZWxpc3Q6CisgICAgICAgIGZwLndyaXRlKCJcblxuY2xhc3MgJXMoJXNfRXZlbnRzIiUocGFja2FnZW5hbWUsIHN1aXRlbGlzdFswXVsxXSkpCisgICAgICAgIGZvciBjb2RlLCBtb2RuYW1lIGluIHN1aXRlbGlzdFsxOl06CisgICAgICAgICAgICBmcC53cml0ZSgiLFxuICAgICAgICAlc19FdmVudHMiJW1vZG5hbWUpCisgICAgICAgIGZwLndyaXRlKCIsXG4gICAgICAgIGFldG9vbHMuVGFsa1RvKTpcbiIpCisgICAgICAgIGZwLndyaXRlKCIgICAgX3NpZ25hdHVyZSA9ICVzXG5cbiIlYGNyZWF0b3JzaWduYXR1cmVgKQorICAgICAgICBmcC53cml0ZSgiICAgIF9tb2R1bGVOYW1lID0gJyVzJ1xuXG4iJXBhY2thZ2VuYW1lKQorICAgIGZwLmNsb3NlKCkKIAogY2xhc3MgU3VpdGVDb21waWxlcjoKLQlkZWYgX19pbml0X18oc2VsZiwgc3VpdGUsIGJhc2VwYWNrYWdlLCBvdXRwdXQsIGVkaXRfbW9kbmFtZXMsIHZlcmJvc2UpOgotCQlzZWxmLnN1aXRlID0gc3VpdGUKLQkJc2VsZi5iYXNlcGFja2FnZSA9IGJhc2VwYWNrYWdlCi0JCXNlbGYuZWRpdF9tb2RuYW1lcyA9IGVkaXRfbW9kbmFtZXMKLQkJc2VsZi5vdXRwdXQgPSBvdXRwdXQKLQkJc2VsZi52ZXJib3NlID0gdmVyYm9zZQotCQkKLQkJIyBTZXQgYnkgcHJlY29tcGlsZXN1aXRlCi0JCXNlbGYucGF0aG5hbWUgPSBOb25lCi0JCXNlbGYubW9kbmFtZSA9IE5vbmUKLQkJCi0JCSMgU2V0IGJ5IGNvbXBpbGVzdWl0ZQotCQlzZWxmLmZwID0gTm9uZQotCQlzZWxmLmJhc2Vtb2R1bGUgPSBOb25lCi0JCXNlbGYuZW51bXNuZWVkZWQgPSB7fQotCQkJCi0JZGVmIHByZWNvbXBpbGVzdWl0ZShzZWxmKToKLQkJIiIiUGFyc2UgYSBzaW5nbGUgc3VpdGUgd2l0aG91dCBnZW5lcmF0aW5nIHRoZSBvdXRwdXQuIFRoaXMgc3RlcCBpcyBuZWVkZWQKLQkJc28gd2UgY2FuIHJlc29sdmUgcmVjdXJzaXZlIHJlZmVyZW5jZXMgYnkgc3VpdGVzIHRvIGVudW1zL2NvbXBzL2V0YyBkZWNsYXJlZAotCQlpbiBvdGhlciBzdWl0ZXMiIiIKLQkJW25hbWUsIGRlc2MsIGNvZGUsIGxldmVsLCB2ZXJzaW9uLCBldmVudHMsIGNsYXNzZXMsIGNvbXBzLCBlbnVtc10gPSBzZWxmLnN1aXRlCi0JCQotCQltb2RuYW1lID0gaWRlbnRpZnkobmFtZSkKLQkJaWYgbGVuKG1vZG5hbWUpID4gMjg6Ci0JCQltb2RuYW1lID0gbW9kbmFtZVs6MjddCi0JCWlmIHNlbGYuZWRpdF9tb2RuYW1lcyBpcyBOb25lOgotCQkJc2VsZi5wYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1B5dGhvbiBvdXRwdXQgZmlsZScsCi0JCQkJc2F2ZWRGaWxlTmFtZT1tb2RuYW1lKycucHknKQotCQllbHNlOgotCQkJZm9yIG9sZCwgbmV3IGluIHNlbGYuZWRpdF9tb2RuYW1lczoKLQkJCQlpZiBvbGQgPT0gbW9kbmFtZToKLQkJCQkJbW9kbmFtZSA9IG5ldwotCQkJaWYgbW9kbmFtZToKLQkJCQlzZWxmLnBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0LCBtb2RuYW1lICsgJy5weScpCi0JCQllbHNlOgotCQkJCXNlbGYucGF0aG5hbWUgPSBOb25lCi0JCWlmIG5vdCBzZWxmLnBhdGhuYW1lOgotCQkJcmV0dXJuIE5vbmUsIE5vbmUsIE5vbmUKLQkKLQkJc2VsZi5tb2RuYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLnNwbGl0KHNlbGYucGF0aG5hbWUpWzFdKVswXQotCQkKLQkJaWYgc2VsZi5iYXNlcGFja2FnZSBhbmQgc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19tb2R1bGUuaGFzX2tleShjb2RlKToKLQkJCSMgV2UgYXJlIGFuIGV4dGVuc2lvbiBvZiBhIGJhc2VjbGFzcyAodXN1YWxseSBhbiBhcHBsaWNhdGlvbiBleHRlbmRpbmcKLQkJCSMgU3RhbmRhcmRfU3VpdGUgb3Igc28pLiBJbXBvcnQgZXZlcnl0aGluZyBmcm9tIG91ciBiYXNlIG1vZHVsZQotCQkJYmFzZW1vZHVsZSA9IHNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fbW9kdWxlW2NvZGVdCi0JCWVsc2U6Ci0JCQkjIFdlIGFyZSBub3QgYW4gZXh0ZW5zaW9uLgotCQkJYmFzZW1vZHVsZSA9IE5vbmUKLQkKLQkJc2VsZi5lbnVtc25lZWRlZCA9IHt9Ci0JCWZvciBldmVudCBpbiBldmVudHM6Ci0JCQlzZWxmLmZpbmRlbnVtc2luZXZlbnQoZXZlbnQpCi0JCi0JCW9iamMgPSBPYmplY3RDb21waWxlcihOb25lLCBiYXNlbW9kdWxlLCBpbnRlcmFjdD0oc2VsZi5lZGl0X21vZG5hbWVzIGlzIE5vbmUpLAotCQkJdmVyYm9zZT1zZWxmLnZlcmJvc2UpCi0JCWZvciBjbHMgaW4gY2xhc3NlczoKLQkJCW9iamMuY29tcGlsZWNsYXNzKGNscykKLQkJZm9yIGNscyBpbiBjbGFzc2VzOgotCQkJb2JqYy5maWxsY2xhc3Nwcm9wc2FuZGVsZW1zKGNscykKLQkJZm9yIGNvbXAgaW4gY29tcHM6Ci0JCQlvYmpjLmNvbXBpbGVjb21wYXJpc29uKGNvbXApCi0JCWZvciBlbnVtIGluIGVudW1zOgotCQkJb2JqYy5jb21waWxlZW51bWVyYXRpb24oZW51bSkKLQkJCi0JCWZvciBlbnVtIGluIHNlbGYuZW51bXNuZWVkZWQua2V5cygpOgotCQkJb2JqYy5jaGVja2ZvcmVudW0oZW51bSkKLQkJCQotCQlvYmpjLmR1bXBpbmRleCgpCi0JCQotCQlwcmVjb21waW5mbyA9IG9iamMuZ2V0cHJlY29tcGluZm8oc2VsZi5tb2RuYW1lKQotCQkKLQkJcmV0dXJuIGNvZGUsIHNlbGYubW9kbmFtZSwgcHJlY29tcGluZm8KLQkKLQlkZWYgY29tcGlsZXN1aXRlKHNlbGYsIG1ham9yLCBtaW5vciwgbGFuZ3VhZ2UsIHNjcmlwdCwgZm5hbWUsIHByZWNvbXBpbmZvKToKLQkJIiIiR2VuZXJhdGUgY29kZSBmb3IgYSBzaW5nbGUgc3VpdGUiIiIKLQkJW25hbWUsIGRlc2MsIGNvZGUsIGxldmVsLCB2ZXJzaW9uLCBldmVudHMsIGNsYXNzZXMsIGNvbXBzLCBlbnVtc10gPSBzZWxmLnN1aXRlCi0JCSMgU29ydCB2YXJpb3VzIGxpc3RzLCBzbyByZS1nZW5lcmF0ZWQgc291cmNlIGlzIGVhc2llciBjb21wYXJlZAotCQlkZWYgY2xhc3Nfc29ydGVyKGsxLCBrMik6Ci0JCQkiIiJTb3J0IGNsYXNzZXMgYnkgY29kZSwgYW5kIG1ha2Ugc3VyZSBtYWluIGNsYXNzIHNvcnRzIGJlZm9yZSBzeW5vbnltcyIiIgotCQkJIyBbbmFtZSwgY29kZSwgZGVzYywgcHJvcGVydGllcywgZWxlbWVudHNdID0gY2xzCi0JCQlpZiBrMVsxXSA8IGsyWzFdOiByZXR1cm4gLTEKLQkJCWlmIGsxWzFdID4gazJbMV06IHJldHVybiAxCi0JCQlpZiBub3QgazJbM10gb3IgazJbM11bMF1bMV0gPT0gJ2NAIyEnOgotCQkJCSMgVGhpcyBpcyBhIHN5bm9ueW0sIHRoZSBvdGhlciBvbmUgaXMgYmV0dGVyCi0JCQkJcmV0dXJuIC0xCi0JCQlpZiBub3QgazFbM10gb3IgazFbM11bMF1bMV0gPT0gJ2NAIyEnOgotCQkJCSMgVGhpcyBpcyBhIHN5bm9ueW0sIHRoZSBvdGhlciBvbmUgaXMgYmV0dGVyCi0JCQkJcmV0dXJuIDEKLQkJCXJldHVybiAwCi0JCQkKLQkJZXZlbnRzLnNvcnQoKQotCQljbGFzc2VzLnNvcnQoY2xhc3Nfc29ydGVyKQotCQljb21wcy5zb3J0KCkKLQkJZW51bXMuc29ydCgpCi0JCQotCQlzZWxmLmZwID0gZnAgPSBvcGVuKHNlbGYucGF0aG5hbWUsICd3JykKLQkJTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoc2VsZi5wYXRobmFtZSwgJ1B5dGgnLCAnVEVYVCcpCi0JCQotCQlmcC53cml0ZSgnIiIiU3VpdGUgJXM6ICVzXG4nICUgKGFzY2lpKG5hbWUpLCBhc2NpaShkZXNjKSkpCi0JCWZwLndyaXRlKCJMZXZlbCAlZCwgdmVyc2lvbiAlZFxuXG4iICUgKGxldmVsLCB2ZXJzaW9uKSkKLQkJZnAud3JpdGUoIkdlbmVyYXRlZCBmcm9tICVzXG4iJWFzY2lpKGZuYW1lKSkKLQkJZnAud3JpdGUoIkFFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uICVkLyVkLCBsYW5ndWFnZSAlZCwgc2NyaXB0ICVkXG4iICUgXAotCQkJKG1ham9yLCBtaW5vciwgbGFuZ3VhZ2UsIHNjcmlwdCkpCi0JCWZwLndyaXRlKCciIiJcblxuJykKLQkJCi0JCWZwLndyaXRlKCdpbXBvcnQgYWV0b29sc1xuJykKLQkJZnAud3JpdGUoJ2ltcG9ydCBNYWNPU1xuXG4nKQotCQlmcC53cml0ZSgiX2NvZGUgPSAlc1xuXG4iJSBgY29kZWApCi0JCWlmIHNlbGYuYmFzZXBhY2thZ2UgYW5kIHNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fbW9kdWxlLmhhc19rZXkoY29kZSk6Ci0JCQkjIFdlIGFyZSBhbiBleHRlbnNpb24gb2YgYSBiYXNlY2xhc3MgKHVzdWFsbHkgYW4gYXBwbGljYXRpb24gZXh0ZW5kaW5nCi0JCQkjIFN0YW5kYXJkX1N1aXRlIG9yIHNvKS4gSW1wb3J0IGV2ZXJ5dGhpbmcgZnJvbSBvdXIgYmFzZSBtb2R1bGUKLQkJCWZwLndyaXRlKCdmcm9tICVzIGltcG9ydCAqXG4nJXNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fZnVsbG5hbWVbY29kZV1bMF0pCi0JCQliYXNlbW9kdWxlID0gc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19tb2R1bGVbY29kZV0KLQkJZWxpZiBzZWxmLmJhc2VwYWNrYWdlIGFuZCBzZWxmLmJhc2VwYWNrYWdlLl9jb2RlX3RvX21vZHVsZS5oYXNfa2V5KGNvZGUubG93ZXIoKSk6Ci0JCQkjIFRoaXMgaXMgbmVlZGVkIGJ5IENvZGVXYXJyaW9yIGFuZCBzb21lIG90aGVycy4KLQkJCWZwLndyaXRlKCdmcm9tICVzIGltcG9ydCAqXG4nJXNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fZnVsbG5hbWVbY29kZS5sb3dlcigpXVswXSkKLQkJCWJhc2Vtb2R1bGUgPSBzZWxmLmJhc2VwYWNrYWdlLl9jb2RlX3RvX21vZHVsZVtjb2RlLmxvd2VyKCldCi0JCWVsc2U6Ci0JCQkjIFdlIGFyZSBub3QgYW4gZXh0ZW5zaW9uLgotCQkJYmFzZW1vZHVsZSA9IE5vbmUKLQkJc2VsZi5iYXNlbW9kdWxlID0gYmFzZW1vZHVsZQotCQlzZWxmLmNvbXBpbGVjbGFzc2hlYWRlcigpCi0JCi0JCXNlbGYuZW51bXNuZWVkZWQgPSB7fQotCQlpZiBldmVudHM6Ci0JCQlmb3IgZXZlbnQgaW4gZXZlbnRzOgotCQkJCXNlbGYuY29tcGlsZWV2ZW50KGV2ZW50KQotCQllbHNlOgotCQkJZnAud3JpdGUoIlx0cGFzc1xuXG4iKQotCQotCQlvYmpjID0gT2JqZWN0Q29tcGlsZXIoZnAsIGJhc2Vtb2R1bGUsIHByZWNvbXBpbmZvLCBpbnRlcmFjdD0oc2VsZi5lZGl0X21vZG5hbWVzIGlzIE5vbmUpLAotCQkJdmVyYm9zZT1zZWxmLnZlcmJvc2UpCi0JCWZvciBjbHMgaW4gY2xhc3NlczoKLQkJCW9iamMuY29tcGlsZWNsYXNzKGNscykKLQkJZm9yIGNscyBpbiBjbGFzc2VzOgotCQkJb2JqYy5maWxsY2xhc3Nwcm9wc2FuZGVsZW1zKGNscykKLQkJZm9yIGNvbXAgaW4gY29tcHM6Ci0JCQlvYmpjLmNvbXBpbGVjb21wYXJpc29uKGNvbXApCi0JCWZvciBlbnVtIGluIGVudW1zOgotCQkJb2JqYy5jb21waWxlZW51bWVyYXRpb24oZW51bSkKLQkJCi0JCWZvciBlbnVtIGluIHNlbGYuZW51bXNuZWVkZWQua2V5cygpOgotCQkJb2JqYy5jaGVja2ZvcmVudW0oZW51bSkKLQkJCQotCQlvYmpjLmR1bXBpbmRleCgpCi0JCQotCWRlZiBjb21waWxlY2xhc3NoZWFkZXIoc2VsZik6Ci0JCSIiIkdlbmVyYXRlIGNsYXNzIGJvaWxlcnBsYXRlIiIiCi0JCWNsYXNzbmFtZSA9ICclc19FdmVudHMnJXNlbGYubW9kbmFtZQotCQlpZiBzZWxmLmJhc2Vtb2R1bGU6Ci0JCQltb2RzaG9ydG5hbWUgPSBzdHJpbmcuc3BsaXQoc2VsZi5iYXNlbW9kdWxlLl9fbmFtZV9fLCAnLicpWy0xXQotCQkJYmFzZWNsYXNzbmFtZSA9ICclc19FdmVudHMnJW1vZHNob3J0bmFtZQotCQkJc2VsZi5mcC53cml0ZSgiY2xhc3MgJXMoJXMpOlxuXG4iJShjbGFzc25hbWUsIGJhc2VjbGFzc25hbWUpKQotCQllbHNlOgotCQkJc2VsZi5mcC53cml0ZSgiY2xhc3MgJXM6XG5cbiIlY2xhc3NuYW1lKQotCQkKLQlkZWYgY29tcGlsZWV2ZW50KHNlbGYsIGV2ZW50KToKLQkJIiIiR2VuZXJhdGUgY29kZSBmb3IgYSBzaW5nbGUgZXZlbnQiIiIKLQkJW25hbWUsIGRlc2MsIGNvZGUsIHN1YmNvZGUsIHJldHVybnMsIGFjY2VwdHMsIGFyZ3VtZW50c10gPSBldmVudAotCQlmcCA9IHNlbGYuZnAKLQkJZnVuY25hbWUgPSBpZGVudGlmeShuYW1lKQotCQkjCi0JCSMgZ2VuZXJhdGUgbmFtZS0+a2V5d29yZCBtYXAKLQkJIwotCQlpZiBhcmd1bWVudHM6Ci0JCQlmcC53cml0ZSgiXHRfYXJnbWFwXyVzID0ge1xuIiVmdW5jbmFtZSkKLQkJCWZvciBhIGluIGFyZ3VtZW50czoKLQkJCQlmcC53cml0ZSgiXHRcdCVzIDogJXMsXG4iJShgaWRlbnRpZnkoYVswXSlgLCBgYVsxXWApKQotCQkJZnAud3JpdGUoIlx0fVxuXG4iKQotCQkJCi0JCSMKLQkJIyBHZW5lcmF0ZSBmdW5jdGlvbiBoZWFkZXIKLQkJIwotCQloYXNfYXJnID0gKG5vdCBpc19udWxsKGFjY2VwdHMpKQotCQlvcHRfYXJnID0gKGhhc19hcmcgYW5kIGlzX29wdGlvbmFsKGFjY2VwdHMpKQotCQkKLQkJZnAud3JpdGUoIlx0ZGVmICVzKHNlbGYsICIlZnVuY25hbWUpCi0JCWlmIGhhc19hcmc6Ci0JCQlpZiBub3Qgb3B0X2FyZzoKLQkJCQlmcC53cml0ZSgiX29iamVjdCwgIikJCSMgSW5jbHVkZSBkaXJlY3Qgb2JqZWN0LCBpZiBpdCBoYXMgb25lCi0JCQllbHNlOgotCQkJCWZwLndyaXRlKCJfb2JqZWN0PU5vbmUsICIpCSMgQWxzbyBpbmNsdWRlIGlmIGl0IGlzIG9wdGlvbmFsCi0JCWVsc2U6Ci0JCQlmcC53cml0ZSgiX25vX29iamVjdD1Ob25lLCAiKQkjIEZvciBhcmd1bWVudCBjaGVja2luZwotCQlmcC53cml0ZSgiX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6XG4iKQkjIGluY2x1ZGUgYXR0cmlidXRlIGRpY3QgYW5kIGFyZ3MKLQkJIwotCQkjIEdlbmVyYXRlIGRvYyBzdHJpbmcgKGltcG9ydGFudCwgc2luY2UgaXQgbWF5IGJlIHRoZSBvbmx5Ci0JCSMgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24sIGR1ZSB0byBvdXIgbmFtZS1yZW1hcGluZykKLQkJIwotCQlmcC53cml0ZSgnXHRcdCIiIiVzOiAlc1xuJyUoYXNjaWkobmFtZSksIGFzY2lpKGRlc2MpKSkKLQkJaWYgaGFzX2FyZzoKLQkJCWZwLndyaXRlKCJcdFx0UmVxdWlyZWQgYXJndW1lbnQ6ICVzXG4iJWdldGRhdGFkb2MoYWNjZXB0cykpCi0JCWVsaWYgb3B0X2FyZzoKLQkJCWZwLndyaXRlKCJcdFx0T3B0aW9uYWwgYXJndW1lbnQ6ICVzXG4iJWdldGRhdGFkb2MoYWNjZXB0cykpCi0JCWZvciBhcmcgaW4gYXJndW1lbnRzOgotCQkJZnAud3JpdGUoIlx0XHRLZXl3b3JkIGFyZ3VtZW50ICVzOiAlc1xuIiUoaWRlbnRpZnkoYXJnWzBdKSwKLQkJCQkJZ2V0ZGF0YWRvYyhhcmdbMl0pKSkKLQkJZnAud3JpdGUoIlx0XHRLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5XG4iKQotCQlpZiBub3QgaXNfbnVsbChyZXR1cm5zKToKLQkJCWZwLndyaXRlKCJcdFx0UmV0dXJuczogJXNcbiIlZ2V0ZGF0YWRvYyhyZXR1cm5zKSkKLQkJZnAud3JpdGUoJ1x0XHQiIiJcbicpCi0JCSMKLQkJIyBGaWRkbGUgdGhlIGFyZ3Mgc28gZXZlcnl0aGluZyBlbmRzIHVwIGluICdhcmd1bWVudHMnIGRpY3Rpb25hcnkKLQkJIwotCQlmcC53cml0ZSgiXHRcdF9jb2RlID0gJXNcbiIlIGBjb2RlYCkKLQkJZnAud3JpdGUoIlx0XHRfc3ViY29kZSA9ICVzXG5cbiIlIGBzdWJjb2RlYCkKLQkJIwotCQkjIERvIGtleXdvcmQgbmFtZSBzdWJzdGl0dXRpb24KLQkJIwotCQlpZiBhcmd1bWVudHM6Ci0JCQlmcC53cml0ZSgiXHRcdGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwXyVzKVxuIiVmdW5jbmFtZSkKLQkJZWxzZToKLQkJCWZwLndyaXRlKCJcdFx0aWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCdcbiIpCi0JCSMKLQkJIyBTdHVmZiByZXF1aXJlZCBhcmcgKGlmIHRoZXJlIGlzIG9uZSkgaW50byBhcmd1bWVudHMKLQkJIwotCQlpZiBoYXNfYXJnOgotCQkJZnAud3JpdGUoIlx0XHRfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0XG4iKQotCQllbGlmIG9wdF9hcmc6Ci0JCQlmcC53cml0ZSgiXHRcdGlmIF9vYmplY3Q6XG4iKQotCQkJZnAud3JpdGUoIlx0XHRcdF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3RcbiIpCi0JCWVsc2U6Ci0JCQlmcC53cml0ZSgiXHRcdGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCdcbiIpCi0JCWZwLndyaXRlKCJcbiIpCi0JCSMKLQkJIyBEbyBlbnVtLW5hbWUgc3Vic3RpdHV0aW9uCi0JCSMKLQkJZm9yIGEgaW4gYXJndW1lbnRzOgotCQkJaWYgaXNfZW51bShhWzJdKToKLQkJCQlrbmFtZSA9IGFbMV0KLQkJCQllbmFtZSA9IGFbMl1bMF0KLQkJCQlpZiBlbmFtZSA8PiAnKioqKic6Ci0JCQkJCWZwLndyaXRlKCJcdFx0YWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJXMsIF9FbnVtXyVzKVxuIiAlCi0JCQkJCQkoYGtuYW1lYCwgaWRlbnRpZnkoZW5hbWUpKSkKLQkJCQkJc2VsZi5lbnVtc25lZWRlZFtlbmFtZV0gPSAxCi0JCWZwLndyaXRlKCJcbiIpCi0JCSMKLQkJIyBEbyB0aGUgdHJhbnNhY3Rpb24KLQkJIwotCQlmcC53cml0ZSgiXHRcdF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLFxuIikKLQkJZnAud3JpdGUoIlx0XHRcdFx0X2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpXG4iKQotCQkjCi0JCSMgRXJyb3IgaGFuZGxpbmcKLQkJIwotCQlmcC53cml0ZSgiXHRcdGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6XG4iKQotCQlmcC53cml0ZSgiXHRcdFx0cmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKVxuIikKLQkJZnAud3JpdGUoIlx0XHQjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0XG4iKQotCQkjCi0JCSMgRGVjb2RlIHJlc3VsdAotCQkjCi0JCWZwLndyaXRlKCJcdFx0aWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6XG4iKQotCQlpZiBpc19lbnVtKHJldHVybnMpOgotCQkJZnAud3JpdGUoIlx0XHRcdCMgWFhYWCBTaG91bGQgZG8gZW51bSByZW1hcHBpbmcgaGVyZS4uLlxuIikKLQkJZnAud3JpdGUoIlx0XHRcdHJldHVybiBfYXJndW1lbnRzWyctLS0tJ11cbiIpCi0JCWZwLndyaXRlKCJcbiIpCi0JCQkKLQlkZWYgZmluZGVudW1zaW5ldmVudChzZWxmLCBldmVudCk6Ci0JCSIiIkZpbmQgYWxsIGVudW1zIGZvciBhIHNpbmdsZSBldmVudCIiIgotCQlbbmFtZSwgZGVzYywgY29kZSwgc3ViY29kZSwgcmV0dXJucywgYWNjZXB0cywgYXJndW1lbnRzXSA9IGV2ZW50Ci0JCWZvciBhIGluIGFyZ3VtZW50czoKLQkJCWlmIGlzX2VudW0oYVsyXSk6Ci0JCQkJZW5hbWUgPSBhWzJdWzBdCi0JCQkJaWYgZW5hbWUgPD4gJyoqKionOgotCQkJCQlzZWxmLmVudW1zbmVlZGVkW2VuYW1lXSA9IDEKLQkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3VpdGUsIGJhc2VwYWNrYWdlLCBvdXRwdXQsIGVkaXRfbW9kbmFtZXMsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLnN1aXRlID0gc3VpdGUKKyAgICAgICAgc2VsZi5iYXNlcGFja2FnZSA9IGJhc2VwYWNrYWdlCisgICAgICAgIHNlbGYuZWRpdF9tb2RuYW1lcyA9IGVkaXRfbW9kbmFtZXMKKyAgICAgICAgc2VsZi5vdXRwdXQgPSBvdXRwdXQKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICAKKyAgICAgICAgIyBTZXQgYnkgcHJlY29tcGlsZXN1aXRlCisgICAgICAgIHNlbGYucGF0aG5hbWUgPSBOb25lCisgICAgICAgIHNlbGYubW9kbmFtZSA9IE5vbmUKKyAgICAgICAgCisgICAgICAgICMgU2V0IGJ5IGNvbXBpbGVzdWl0ZQorICAgICAgICBzZWxmLmZwID0gTm9uZQorICAgICAgICBzZWxmLmJhc2Vtb2R1bGUgPSBOb25lCisgICAgICAgIHNlbGYuZW51bXNuZWVkZWQgPSB7fQorICAgICAgICAgICAgCisgICAgZGVmIHByZWNvbXBpbGVzdWl0ZShzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYSBzaW5nbGUgc3VpdGUgd2l0aG91dCBnZW5lcmF0aW5nIHRoZSBvdXRwdXQuIFRoaXMgc3RlcCBpcyBuZWVkZWQKKyAgICAgICAgc28gd2UgY2FuIHJlc29sdmUgcmVjdXJzaXZlIHJlZmVyZW5jZXMgYnkgc3VpdGVzIHRvIGVudW1zL2NvbXBzL2V0YyBkZWNsYXJlZAorICAgICAgICBpbiBvdGhlciBzdWl0ZXMiIiIKKyAgICAgICAgW25hbWUsIGRlc2MsIGNvZGUsIGxldmVsLCB2ZXJzaW9uLCBldmVudHMsIGNsYXNzZXMsIGNvbXBzLCBlbnVtc10gPSBzZWxmLnN1aXRlCisgICAgICAgIAorICAgICAgICBtb2RuYW1lID0gaWRlbnRpZnkobmFtZSkKKyAgICAgICAgaWYgbGVuKG1vZG5hbWUpID4gMjg6CisgICAgICAgICAgICBtb2RuYW1lID0gbW9kbmFtZVs6MjddCisgICAgICAgIGlmIHNlbGYuZWRpdF9tb2RuYW1lcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1B5dGhvbiBvdXRwdXQgZmlsZScsCisgICAgICAgICAgICAgICAgc2F2ZWRGaWxlTmFtZT1tb2RuYW1lKycucHknKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIG9sZCwgbmV3IGluIHNlbGYuZWRpdF9tb2RuYW1lczoKKyAgICAgICAgICAgICAgICBpZiBvbGQgPT0gbW9kbmFtZToKKyAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IG5ldworICAgICAgICAgICAgaWYgbW9kbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0LCBtb2RuYW1lICsgJy5weScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucGF0aG5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGhuYW1lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIE5vbmUKKyAgICAKKyAgICAgICAgc2VsZi5tb2RuYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLnNwbGl0KHNlbGYucGF0aG5hbWUpWzFdKVswXQorICAgICAgICAKKyAgICAgICAgaWYgc2VsZi5iYXNlcGFja2FnZSBhbmQgc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19tb2R1bGUuaGFzX2tleShjb2RlKToKKyAgICAgICAgICAgICMgV2UgYXJlIGFuIGV4dGVuc2lvbiBvZiBhIGJhc2VjbGFzcyAodXN1YWxseSBhbiBhcHBsaWNhdGlvbiBleHRlbmRpbmcKKyAgICAgICAgICAgICMgU3RhbmRhcmRfU3VpdGUgb3Igc28pLiBJbXBvcnQgZXZlcnl0aGluZyBmcm9tIG91ciBiYXNlIG1vZHVsZQorICAgICAgICAgICAgYmFzZW1vZHVsZSA9IHNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fbW9kdWxlW2NvZGVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGFyZSBub3QgYW4gZXh0ZW5zaW9uLgorICAgICAgICAgICAgYmFzZW1vZHVsZSA9IE5vbmUKKyAgICAKKyAgICAgICAgc2VsZi5lbnVtc25lZWRlZCA9IHt9CisgICAgICAgIGZvciBldmVudCBpbiBldmVudHM6CisgICAgICAgICAgICBzZWxmLmZpbmRlbnVtc2luZXZlbnQoZXZlbnQpCisgICAgCisgICAgICAgIG9iamMgPSBPYmplY3RDb21waWxlcihOb25lLCBzZWxmLm1vZG5hbWUsIGJhc2Vtb2R1bGUsIGludGVyYWN0PShzZWxmLmVkaXRfbW9kbmFtZXMgaXMgTm9uZSksCisgICAgICAgICAgICB2ZXJib3NlPXNlbGYudmVyYm9zZSkKKyAgICAgICAgZm9yIGNscyBpbiBjbGFzc2VzOgorICAgICAgICAgICAgb2JqYy5jb21waWxlY2xhc3MoY2xzKQorICAgICAgICBmb3IgY2xzIGluIGNsYXNzZXM6CisgICAgICAgICAgICBvYmpjLmZpbGxjbGFzc3Byb3BzYW5kZWxlbXMoY2xzKQorICAgICAgICBmb3IgY29tcCBpbiBjb21wczoKKyAgICAgICAgICAgIG9iamMuY29tcGlsZWNvbXBhcmlzb24oY29tcCkKKyAgICAgICAgZm9yIGVudW0gaW4gZW51bXM6CisgICAgICAgICAgICBvYmpjLmNvbXBpbGVlbnVtZXJhdGlvbihlbnVtKQorICAgICAgICAKKyAgICAgICAgZm9yIGVudW0gaW4gc2VsZi5lbnVtc25lZWRlZC5rZXlzKCk6CisgICAgICAgICAgICBvYmpjLmNoZWNrZm9yZW51bShlbnVtKQorICAgICAgICAgICAgCisgICAgICAgIG9iamMuZHVtcGluZGV4KCkKKyAgICAgICAgCisgICAgICAgIHByZWNvbXBpbmZvID0gb2JqYy5nZXRwcmVjb21waW5mbyhzZWxmLm1vZG5hbWUpCisgICAgICAgIAorICAgICAgICByZXR1cm4gY29kZSwgc2VsZi5tb2RuYW1lLCBwcmVjb21waW5mbworICAgIAorICAgIGRlZiBjb21waWxlc3VpdGUoc2VsZiwgbWFqb3IsIG1pbm9yLCBsYW5ndWFnZSwgc2NyaXB0LCBmbmFtZSwgcHJlY29tcGluZm8pOgorICAgICAgICAiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIHNpbmdsZSBzdWl0ZSIiIgorICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgbGV2ZWwsIHZlcnNpb24sIGV2ZW50cywgY2xhc3NlcywgY29tcHMsIGVudW1zXSA9IHNlbGYuc3VpdGUKKyAgICAgICAgIyBTb3J0IHZhcmlvdXMgbGlzdHMsIHNvIHJlLWdlbmVyYXRlZCBzb3VyY2UgaXMgZWFzaWVyIGNvbXBhcmVkCisgICAgICAgIGRlZiBjbGFzc19zb3J0ZXIoazEsIGsyKToKKyAgICAgICAgICAgICIiIlNvcnQgY2xhc3NlcyBieSBjb2RlLCBhbmQgbWFrZSBzdXJlIG1haW4gY2xhc3Mgc29ydHMgYmVmb3JlIHN5bm9ueW1zIiIiCisgICAgICAgICAgICAjIFtuYW1lLCBjb2RlLCBkZXNjLCBwcm9wZXJ0aWVzLCBlbGVtZW50c10gPSBjbHMKKyAgICAgICAgICAgIGlmIGsxWzFdIDwgazJbMV06IHJldHVybiAtMQorICAgICAgICAgICAgaWYgazFbMV0gPiBrMlsxXTogcmV0dXJuIDEKKyAgICAgICAgICAgIGlmIG5vdCBrMlszXSBvciBrMlszXVswXVsxXSA9PSAnY0AjISc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgc3lub255bSwgdGhlIG90aGVyIG9uZSBpcyBiZXR0ZXIKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIG5vdCBrMVszXSBvciBrMVszXVswXVsxXSA9PSAnY0AjISc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgc3lub255bSwgdGhlIG90aGVyIG9uZSBpcyBiZXR0ZXIKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIAorICAgICAgICBldmVudHMuc29ydCgpCisgICAgICAgIGNsYXNzZXMuc29ydChjbGFzc19zb3J0ZXIpCisgICAgICAgIGNvbXBzLnNvcnQoKQorICAgICAgICBlbnVtcy5zb3J0KCkKKyAgICAgICAgCisgICAgICAgIHNlbGYuZnAgPSBmcCA9IG9wZW4oc2VsZi5wYXRobmFtZSwgJ3cnKQorICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShzZWxmLnBhdGhuYW1lLCAnUHl0aCcsICdURVhUJykKKyAgICAgICAgCisgICAgICAgIGZwLndyaXRlKCciIiJTdWl0ZSAlczogJXNcbicgJSAoYXNjaWkobmFtZSksIGFzY2lpKGRlc2MpKSkKKyAgICAgICAgZnAud3JpdGUoIkxldmVsICVkLCB2ZXJzaW9uICVkXG5cbiIgJSAobGV2ZWwsIHZlcnNpb24pKQorICAgICAgICBmcC53cml0ZSgiR2VuZXJhdGVkIGZyb20gJXNcbiIlYXNjaWkoZm5hbWUpKQorICAgICAgICBmcC53cml0ZSgiQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gJWQvJWQsIGxhbmd1YWdlICVkLCBzY3JpcHQgJWRcbiIgJSBcCisgICAgICAgICAgICAobWFqb3IsIG1pbm9yLCBsYW5ndWFnZSwgc2NyaXB0KSkKKyAgICAgICAgZnAud3JpdGUoJyIiIlxuXG4nKQorICAgICAgICAKKyAgICAgICAgZnAud3JpdGUoJ2ltcG9ydCBhZXRvb2xzXG4nKQorICAgICAgICBmcC53cml0ZSgnaW1wb3J0IE1hY09TXG5cbicpCisgICAgICAgIGZwLndyaXRlKCJfY29kZSA9ICVzXG5cbiIlIGBjb2RlYCkKKyAgICAgICAgaWYgc2VsZi5iYXNlcGFja2FnZSBhbmQgc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19tb2R1bGUuaGFzX2tleShjb2RlKToKKyAgICAgICAgICAgICMgV2UgYXJlIGFuIGV4dGVuc2lvbiBvZiBhIGJhc2VjbGFzcyAodXN1YWxseSBhbiBhcHBsaWNhdGlvbiBleHRlbmRpbmcKKyAgICAgICAgICAgICMgU3RhbmRhcmRfU3VpdGUgb3Igc28pLiBJbXBvcnQgZXZlcnl0aGluZyBmcm9tIG91ciBiYXNlIG1vZHVsZQorICAgICAgICAgICAgZnAud3JpdGUoJ2Zyb20gJXMgaW1wb3J0ICpcbiclc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19mdWxsbmFtZVtjb2RlXVswXSkKKyAgICAgICAgICAgIGJhc2Vtb2R1bGUgPSBzZWxmLmJhc2VwYWNrYWdlLl9jb2RlX3RvX21vZHVsZVtjb2RlXQorICAgICAgICBlbGlmIHNlbGYuYmFzZXBhY2thZ2UgYW5kIHNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fbW9kdWxlLmhhc19rZXkoY29kZS5sb3dlcigpKToKKyAgICAgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgYnkgQ29kZVdhcnJpb3IgYW5kIHNvbWUgb3RoZXJzLgorICAgICAgICAgICAgZnAud3JpdGUoJ2Zyb20gJXMgaW1wb3J0ICpcbiclc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19mdWxsbmFtZVtjb2RlLmxvd2VyKCldWzBdKQorICAgICAgICAgICAgYmFzZW1vZHVsZSA9IHNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fbW9kdWxlW2NvZGUubG93ZXIoKV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2UgYXJlIG5vdCBhbiBleHRlbnNpb24uCisgICAgICAgICAgICBiYXNlbW9kdWxlID0gTm9uZQorICAgICAgICBzZWxmLmJhc2Vtb2R1bGUgPSBiYXNlbW9kdWxlCisgICAgICAgIHNlbGYuY29tcGlsZWNsYXNzaGVhZGVyKCkKKyAgICAKKyAgICAgICAgc2VsZi5lbnVtc25lZWRlZCA9IHt9CisgICAgICAgIGlmIGV2ZW50czoKKyAgICAgICAgICAgIGZvciBldmVudCBpbiBldmVudHM6CisgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlZXZlbnQoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgIHBhc3NcblxuIikKKyAgICAKKyAgICAgICAgb2JqYyA9IE9iamVjdENvbXBpbGVyKGZwLCBzZWxmLm1vZG5hbWUsIGJhc2Vtb2R1bGUsIHByZWNvbXBpbmZvLCBpbnRlcmFjdD0oc2VsZi5lZGl0X21vZG5hbWVzIGlzIE5vbmUpLAorICAgICAgICAgICAgdmVyYm9zZT1zZWxmLnZlcmJvc2UpCisgICAgICAgIGZvciBjbHMgaW4gY2xhc3NlczoKKyAgICAgICAgICAgIG9iamMuY29tcGlsZWNsYXNzKGNscykKKyAgICAgICAgZm9yIGNscyBpbiBjbGFzc2VzOgorICAgICAgICAgICAgb2JqYy5maWxsY2xhc3Nwcm9wc2FuZGVsZW1zKGNscykKKyAgICAgICAgZm9yIGNvbXAgaW4gY29tcHM6CisgICAgICAgICAgICBvYmpjLmNvbXBpbGVjb21wYXJpc29uKGNvbXApCisgICAgICAgIGZvciBlbnVtIGluIGVudW1zOgorICAgICAgICAgICAgb2JqYy5jb21waWxlZW51bWVyYXRpb24oZW51bSkKKyAgICAgICAgCisgICAgICAgIGZvciBlbnVtIGluIHNlbGYuZW51bXNuZWVkZWQua2V5cygpOgorICAgICAgICAgICAgb2JqYy5jaGVja2ZvcmVudW0oZW51bSkKKyAgICAgICAgICAgIAorICAgICAgICBvYmpjLmR1bXBpbmRleCgpCisgICAgICAgIAorICAgIGRlZiBjb21waWxlY2xhc3NoZWFkZXIoc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIGNsYXNzIGJvaWxlcnBsYXRlIiIiCisgICAgICAgIGNsYXNzbmFtZSA9ICclc19FdmVudHMnJXNlbGYubW9kbmFtZQorICAgICAgICBpZiBzZWxmLmJhc2Vtb2R1bGU6CisgICAgICAgICAgICBtb2RzaG9ydG5hbWUgPSBzdHJpbmcuc3BsaXQoc2VsZi5iYXNlbW9kdWxlLl9fbmFtZV9fLCAnLicpWy0xXQorICAgICAgICAgICAgYmFzZWNsYXNzbmFtZSA9ICclc19FdmVudHMnJW1vZHNob3J0bmFtZQorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgJXMoJXMpOlxuXG4iJShjbGFzc25hbWUsIGJhc2VjbGFzc25hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgJXM6XG5cbiIlY2xhc3NuYW1lKQorICAgICAgICAKKyAgICBkZWYgY29tcGlsZWV2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiR2VuZXJhdGUgY29kZSBmb3IgYSBzaW5nbGUgZXZlbnQiIiIKKyAgICAgICAgW25hbWUsIGRlc2MsIGNvZGUsIHN1YmNvZGUsIHJldHVybnMsIGFjY2VwdHMsIGFyZ3VtZW50c10gPSBldmVudAorICAgICAgICBmcCA9IHNlbGYuZnAKKyAgICAgICAgZnVuY25hbWUgPSBpZGVudGlmeShuYW1lKQorICAgICAgICAjCisgICAgICAgICMgZ2VuZXJhdGUgbmFtZS0+a2V5d29yZCBtYXAKKyAgICAgICAgIworICAgICAgICBpZiBhcmd1bWVudHM6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgIF9hcmdtYXBfJXMgPSB7XG4iJWZ1bmNuYW1lKQorICAgICAgICAgICAgZm9yIGEgaW4gYXJndW1lbnRzOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCIgICAgICAgICVzIDogJXMsXG4iJShgaWRlbnRpZnkoYVswXSlgLCBgYVsxXWApKQorICAgICAgICAgICAgZnAud3JpdGUoIiAgICB9XG5cbiIpCisgICAgICAgICAgICAKKyAgICAgICAgIworICAgICAgICAjIEdlbmVyYXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICAjCisgICAgICAgIGhhc19hcmcgPSAobm90IGlzX251bGwoYWNjZXB0cykpCisgICAgICAgIG9wdF9hcmcgPSAoaGFzX2FyZyBhbmQgaXNfb3B0aW9uYWwoYWNjZXB0cykpCisgICAgICAgIAorICAgICAgICBmcC53cml0ZSgiICAgIGRlZiAlcyhzZWxmLCAiJWZ1bmNuYW1lKQorICAgICAgICBpZiBoYXNfYXJnOgorICAgICAgICAgICAgaWYgbm90IG9wdF9hcmc6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoIl9vYmplY3QsICIpICAgICAgICMgSW5jbHVkZSBkaXJlY3Qgb2JqZWN0LCBpZiBpdCBoYXMgb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCJfb2JqZWN0PU5vbmUsICIpICAjIEFsc28gaW5jbHVkZSBpZiBpdCBpcyBvcHRpb25hbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnAud3JpdGUoIl9ub19vYmplY3Q9Tm9uZSwgIikgICAjIEZvciBhcmd1bWVudCBjaGVja2luZworICAgICAgICBmcC53cml0ZSgiX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6XG4iKSAgICAjIGluY2x1ZGUgYXR0cmlidXRlIGRpY3QgYW5kIGFyZ3MKKyAgICAgICAgIworICAgICAgICAjIEdlbmVyYXRlIGRvYyBzdHJpbmcgKGltcG9ydGFudCwgc2luY2UgaXQgbWF5IGJlIHRoZSBvbmx5CisgICAgICAgICMgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24sIGR1ZSB0byBvdXIgbmFtZS1yZW1hcGluZykKKyAgICAgICAgIworICAgICAgICBmcC53cml0ZSgnICAgICAgICAiIiIlczogJXNcbiclKGFzY2lpKG5hbWUpLCBhc2NpaShkZXNjKSkpCisgICAgICAgIGlmIGhhc19hcmc6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogJXNcbiIlZ2V0ZGF0YWRvYyhhY2NlcHRzKSkKKyAgICAgICAgZWxpZiBvcHRfYXJnOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6ICVzXG4iJWdldGRhdGFkb2MoYWNjZXB0cykpCisgICAgICAgIGZvciBhcmcgaW4gYXJndW1lbnRzOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgS2V5d29yZCBhcmd1bWVudCAlczogJXNcbiIlKGlkZW50aWZ5KGFyZ1swXSksCisgICAgICAgICAgICAgICAgICAgIGdldGRhdGFkb2MoYXJnWzJdKSkpCisgICAgICAgIGZwLndyaXRlKCIgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnlcbiIpCisgICAgICAgIGlmIG5vdCBpc19udWxsKHJldHVybnMpOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgUmV0dXJuczogJXNcbiIlZ2V0ZGF0YWRvYyhyZXR1cm5zKSkKKyAgICAgICAgZnAud3JpdGUoJyAgICAgICAgIiIiXG4nKQorICAgICAgICAjCisgICAgICAgICMgRmlkZGxlIHRoZSBhcmdzIHNvIGV2ZXJ5dGhpbmcgZW5kcyB1cCBpbiAnYXJndW1lbnRzJyBkaWN0aW9uYXJ5CisgICAgICAgICMKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgX2NvZGUgPSAlc1xuIiUgYGNvZGVgKQorICAgICAgICBmcC53cml0ZSgiICAgICAgICBfc3ViY29kZSA9ICVzXG5cbiIlIGBzdWJjb2RlYCkKKyAgICAgICAgIworICAgICAgICAjIERvIGtleXdvcmQgbmFtZSBzdWJzdGl0dXRpb24KKyAgICAgICAgIworICAgICAgICBpZiBhcmd1bWVudHM6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF8lcylcbiIlZnVuY25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJ1xuIikKKyAgICAgICAgIworICAgICAgICAjIFN0dWZmIHJlcXVpcmVkIGFyZyAoaWYgdGhlcmUgaXMgb25lKSBpbnRvIGFyZ3VtZW50cworICAgICAgICAjCisgICAgICAgIGlmIGhhc19hcmc6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0XG4iKQorICAgICAgICBlbGlmIG9wdF9hcmc6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBpZiBfb2JqZWN0OlxuIikKKyAgICAgICAgICAgIGZwLndyaXRlKCIgICAgICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0XG4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJ1xuIikKKyAgICAgICAgZnAud3JpdGUoIlxuIikKKyAgICAgICAgIworICAgICAgICAjIERvIGVudW0tbmFtZSBzdWJzdGl0dXRpb24KKyAgICAgICAgIworICAgICAgICBmb3IgYSBpbiBhcmd1bWVudHM6CisgICAgICAgICAgICBpZiBpc19lbnVtKGFbMl0pOgorICAgICAgICAgICAgICAgIGtuYW1lID0gYVsxXQorICAgICAgICAgICAgICAgIGVuYW1lID0gYVsyXVswXQorICAgICAgICAgICAgICAgIGlmIGVuYW1lIDw+ICcqKioqJzoKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJXMsIF9FbnVtXyVzKVxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAoYGtuYW1lYCwgaWRlbnRpZnkoZW5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnVtc25lZWRlZFtlbmFtZV0gPSAxCisgICAgICAgIGZwLndyaXRlKCJcbiIpCisgICAgICAgICMKKyAgICAgICAgIyBEbyB0aGUgdHJhbnNhY3Rpb24KKyAgICAgICAgIworICAgICAgICBmcC53cml0ZSgiICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSxcbiIpCisgICAgICAgIGZwLndyaXRlKCIgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpXG4iKQorICAgICAgICAjCisgICAgICAgICMgRXJyb3IgaGFuZGxpbmcKKyAgICAgICAgIworICAgICAgICBmcC53cml0ZSgiICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOlxuIikKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cylcbiIpCisgICAgICAgIGZwLndyaXRlKCIgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHRcbiIpCisgICAgICAgICMKKyAgICAgICAgIyBEZWNvZGUgcmVzdWx0CisgICAgICAgICMKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6XG4iKQorICAgICAgICBpZiBpc19lbnVtKHJldHVybnMpOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgICAgICMgWFhYWCBTaG91bGQgZG8gZW51bSByZW1hcHBpbmcgaGVyZS4uLlxuIikKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ11cbiIpCisgICAgICAgIGZwLndyaXRlKCJcbiIpCisgICAgICAgICAgICAKKyAgICBkZWYgZmluZGVudW1zaW5ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICIiIkZpbmQgYWxsIGVudW1zIGZvciBhIHNpbmdsZSBldmVudCIiIgorICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgc3ViY29kZSwgcmV0dXJucywgYWNjZXB0cywgYXJndW1lbnRzXSA9IGV2ZW50CisgICAgICAgIGZvciBhIGluIGFyZ3VtZW50czoKKyAgICAgICAgICAgIGlmIGlzX2VudW0oYVsyXSk6CisgICAgICAgICAgICAgICAgZW5hbWUgPSBhWzJdWzBdCisgICAgICAgICAgICAgICAgaWYgZW5hbWUgPD4gJyoqKionOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudW1zbmVlZGVkW2VuYW1lXSA9IDEKKyAgICAKICMKICMgVGhpcyBjbGFzcyBzdG9yZXMgdGhlIGNvZGU8LT5uYW1lIHRyYW5zbGF0aW9ucyBmb3IgYSBzaW5nbGUgbW9kdWxlLiBJdCBpcyB1c2VkCiAjIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIHdoaWxlIHdlJ3JlIGNvbXBpbGluZyB0aGUgbW9kdWxlLCBidXQgd2UgYWxzbyBrZWVwIHRoZXNlIG9iamVjdHMKQEAgLTgxNCwzNzggKzgxNCwzOTIgQEAKICMgaGFuZC4KICMKIGNsYXNzIENvZGVOYW1lTWFwcGVyOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBpbnRlcmFjdD0xLCB2ZXJib3NlPU5vbmUpOgotCQlzZWxmLmNvZGUybmFtZSA9IHsKLQkJCSJwcm9wZXJ0eSIgOiB7fSwKLQkJCSJjbGFzcyIgOiB7fSwKLQkJCSJlbnVtIiA6IHt9LAotCQkJImNvbXBhcmlzb24iIDoge30sCi0JCX0KLQkJc2VsZi5uYW1lMmNvZGUgPSAgewotCQkJInByb3BlcnR5IiA6IHt9LAotCQkJImNsYXNzIiA6IHt9LAotCQkJImVudW0iIDoge30sCi0JCQkiY29tcGFyaXNvbiIgOiB7fSwKLQkJfQotCQlzZWxmLm1vZHVsZW5hbWUgPSBOb25lCi0JCXNlbGYuc3Rhcl9pbXBvcnRlZCA9IDAKLQkJc2VsZi5jYW5faW50ZXJhY3QgPSBpbnRlcmFjdAotCQlzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCi0JCQotCWRlZiBhZGRuYW1lY29kZShzZWxmLCB0eXBlLCBuYW1lLCBjb2RlKToKLQkJc2VsZi5uYW1lMmNvZGVbdHlwZV1bbmFtZV0gPSBjb2RlCi0JCWlmIG5vdCBzZWxmLmNvZGUybmFtZVt0eXBlXS5oYXNfa2V5KGNvZGUpOgotCQkJc2VsZi5jb2RlMm5hbWVbdHlwZV1bY29kZV0gPSBuYW1lCi0JCQotCWRlZiBoYXNuYW1lKHNlbGYsIHR5cGUsIG5hbWUpOgotCQlyZXR1cm4gc2VsZi5uYW1lMmNvZGVbdHlwZV0uaGFzX2tleShuYW1lKQotCQkKLQlkZWYgaGFzY29kZShzZWxmLCB0eXBlLCBjb2RlKToKLQkJcmV0dXJuIHNlbGYuY29kZTJuYW1lW3R5cGVdLmhhc19rZXkoY29kZSkKLQkJCi0JZGVmIGZpbmRjb2RlbmFtZShzZWxmLCB0eXBlLCBjb2RlKToKLQkJaWYgbm90IHNlbGYuaGFzY29kZSh0eXBlLCBjb2RlKToKLQkJCXJldHVybiBOb25lLCBOb25lLCBOb25lCi0JCW5hbWUgPSBzZWxmLmNvZGUybmFtZVt0eXBlXVtjb2RlXQotCQlpZiBzZWxmLm1vZHVsZW5hbWUgYW5kIG5vdCBzZWxmLnN0YXJfaW1wb3J0ZWQ6Ci0JCQlxdWFsbmFtZSA9ICclcy4lcyclKHNlbGYubW9kdWxlbmFtZSwgbmFtZSkKLQkJZWxzZToKLQkJCXF1YWxuYW1lID0gbmFtZQotCQlyZXR1cm4gbmFtZSwgcXVhbG5hbWUsIHNlbGYubW9kdWxlbmFtZQotCQkKLQlkZWYgZ2V0YWxsKHNlbGYsIHR5cGUpOgotCQlyZXR1cm4gc2VsZi5jb2RlMm5hbWVbdHlwZV0uaXRlbXMoKQotCQkJCi0JZGVmIGFkZG1vZHVsZShzZWxmLCBtb2R1bGUsIG5hbWUsIHN0YXJfaW1wb3J0ZWQpOgotCQlzZWxmLm1vZHVsZW5hbWUgPSBuYW1lCi0JCXNlbGYuc3Rhcl9pbXBvcnRlZCA9IHN0YXJfaW1wb3J0ZWQKLQkJZm9yIGNvZGUsIG5hbWUgaW4gbW9kdWxlLl9wcm9wZGVjbGFyYXRpb25zLml0ZW1zKCk6Ci0JCQlzZWxmLmFkZG5hbWVjb2RlKCdwcm9wZXJ0eScsIG5hbWUsIGNvZGUpCi0JCWZvciBjb2RlLCBuYW1lIGluIG1vZHVsZS5fY2xhc3NkZWNsYXJhdGlvbnMuaXRlbXMoKToKLQkJCXNlbGYuYWRkbmFtZWNvZGUoJ2NsYXNzJywgbmFtZSwgY29kZSkKLQkJZm9yIGNvZGUgaW4gbW9kdWxlLl9lbnVtZGVjbGFyYXRpb25zLmtleXMoKToKLQkJCXNlbGYuYWRkbmFtZWNvZGUoJ2VudW0nLCAnX0VudW1fJytpZGVudGlmeShjb2RlKSwgY29kZSkKLQkJZm9yIGNvZGUsIG5hbWUgaW4gbW9kdWxlLl9jb21wZGVjbGFyYXRpb25zLml0ZW1zKCk6Ci0JCQlzZWxmLmFkZG5hbWVjb2RlKCdjb21wYXJpc29uJywgbmFtZSwgY29kZSkKLQkJCi0JZGVmIHByZXBhcmVmb3JleHBvcnQoc2VsZiwgbmFtZT1Ob25lKToKLQkJaWYgbm90IHNlbGYubW9kdWxlbmFtZToKLQkJCXNlbGYubW9kdWxlbmFtZSA9IG5hbWUKLQkJcmV0dXJuIHNlbGYKLQkJCQorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnRlcmFjdD0xLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICBzZWxmLmNvZGUybmFtZSA9IHsKKyAgICAgICAgICAgICJwcm9wZXJ0eSIgOiB7fSwKKyAgICAgICAgICAgICJjbGFzcyIgOiB7fSwKKyAgICAgICAgICAgICJlbnVtIiA6IHt9LAorICAgICAgICAgICAgImNvbXBhcmlzb24iIDoge30sCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5uYW1lMmNvZGUgPSAgeworICAgICAgICAgICAgInByb3BlcnR5IiA6IHt9LAorICAgICAgICAgICAgImNsYXNzIiA6IHt9LAorICAgICAgICAgICAgImVudW0iIDoge30sCisgICAgICAgICAgICAiY29tcGFyaXNvbiIgOiB7fSwKKyAgICAgICAgfQorICAgICAgICBzZWxmLm1vZHVsZW5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuc3Rhcl9pbXBvcnRlZCA9IDAKKyAgICAgICAgc2VsZi5jYW5faW50ZXJhY3QgPSBpbnRlcmFjdAorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIAorICAgIGRlZiBhZGRuYW1lY29kZShzZWxmLCB0eXBlLCBuYW1lLCBjb2RlKToKKyAgICAgICAgc2VsZi5uYW1lMmNvZGVbdHlwZV1bbmFtZV0gPSBjb2RlCisgICAgICAgIGlmIG5vdCBzZWxmLmNvZGUybmFtZVt0eXBlXS5oYXNfa2V5KGNvZGUpOgorICAgICAgICAgICAgc2VsZi5jb2RlMm5hbWVbdHlwZV1bY29kZV0gPSBuYW1lCisgICAgICAgIAorICAgIGRlZiBoYXNuYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBmb3IgZGljdCBpbiBzZWxmLm5hbWUyY29kZS52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGRpY3QuaGFzX2tleShuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgCisgICAgZGVmIGhhc2NvZGUoc2VsZiwgdHlwZSwgY29kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvZGUybmFtZVt0eXBlXS5oYXNfa2V5KGNvZGUpCisgICAgICAgIAorICAgIGRlZiBmaW5kY29kZW5hbWUoc2VsZiwgdHlwZSwgY29kZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhc2NvZGUodHlwZSwgY29kZSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSwgTm9uZQorICAgICAgICBuYW1lID0gc2VsZi5jb2RlMm5hbWVbdHlwZV1bY29kZV0KKyAgICAgICAgaWYgc2VsZi5tb2R1bGVuYW1lIGFuZCBub3Qgc2VsZi5zdGFyX2ltcG9ydGVkOgorICAgICAgICAgICAgcXVhbG5hbWUgPSAnJXMuJXMnJShzZWxmLm1vZHVsZW5hbWUsIG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxdWFsbmFtZSA9IG5hbWUKKyAgICAgICAgcmV0dXJuIG5hbWUsIHF1YWxuYW1lLCBzZWxmLm1vZHVsZW5hbWUKKyAgICAgICAgCisgICAgZGVmIGdldGFsbChzZWxmLCB0eXBlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZTJuYW1lW3R5cGVdLml0ZW1zKCkKKyAgICAgICAgICAgIAorICAgIGRlZiBhZGRtb2R1bGUoc2VsZiwgbW9kdWxlLCBuYW1lLCBzdGFyX2ltcG9ydGVkKToKKyAgICAgICAgc2VsZi5tb2R1bGVuYW1lID0gbmFtZQorICAgICAgICBzZWxmLnN0YXJfaW1wb3J0ZWQgPSBzdGFyX2ltcG9ydGVkCisgICAgICAgIGZvciBjb2RlLCBuYW1lIGluIG1vZHVsZS5fcHJvcGRlY2xhcmF0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hZGRuYW1lY29kZSgncHJvcGVydHknLCBuYW1lLCBjb2RlKQorICAgICAgICBmb3IgY29kZSwgbmFtZSBpbiBtb2R1bGUuX2NsYXNzZGVjbGFyYXRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFkZG5hbWVjb2RlKCdjbGFzcycsIG5hbWUsIGNvZGUpCisgICAgICAgIGZvciBjb2RlIGluIG1vZHVsZS5fZW51bWRlY2xhcmF0aW9ucy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmFkZG5hbWVjb2RlKCdlbnVtJywgJ19FbnVtXycraWRlbnRpZnkoY29kZSksIGNvZGUpCisgICAgICAgIGZvciBjb2RlLCBuYW1lIGluIG1vZHVsZS5fY29tcGRlY2xhcmF0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hZGRuYW1lY29kZSgnY29tcGFyaXNvbicsIG5hbWUsIGNvZGUpCisgICAgICAgIAorICAgIGRlZiBwcmVwYXJlZm9yZXhwb3J0KHNlbGYsIG5hbWU9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLm1vZHVsZW5hbWU6CisgICAgICAgICAgICBzZWxmLm1vZHVsZW5hbWUgPSBuYW1lCisgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICAKIGNsYXNzIE9iamVjdENvbXBpbGVyOgotCWRlZiBfX2luaXRfXyhzZWxmLCBmcCwgYmFzZXN1aXRlPU5vbmUsIG90aGVybmFtZW1hcHBlcnM9Tm9uZSwgaW50ZXJhY3Q9MSwgCi0JCQl2ZXJib3NlPU5vbmUpOgotCQlzZWxmLmZwID0gZnAKLQkJc2VsZi52ZXJib3NlID0gdmVyYm9zZQotCQlzZWxmLmJhc2VzdWl0ZSA9IGJhc2VzdWl0ZQotCQlzZWxmLmNhbl9pbnRlcmFjdCA9IGludGVyYWN0Ci0JCXNlbGYubmFtZW1hcHBlcnMgPSBbQ29kZU5hbWVNYXBwZXIoc2VsZi5jYW5faW50ZXJhY3QsIHNlbGYudmVyYm9zZSldCi0JCWlmIG90aGVybmFtZW1hcHBlcnM6Ci0JCQlzZWxmLm90aGVybmFtZW1hcHBlcnMgPSBvdGhlcm5hbWVtYXBwZXJzWzpdCi0JCWVsc2U6Ci0JCQlzZWxmLm90aGVybmFtZW1hcHBlcnMgPSBbXQotCQlpZiBiYXNlc3VpdGU6Ci0JCQliYXNlbWFwcGVyID0gQ29kZU5hbWVNYXBwZXIoc2VsZi5jYW5faW50ZXJhY3QsIHNlbGYudmVyYm9zZSkKLQkJCWJhc2VtYXBwZXIuYWRkbW9kdWxlKGJhc2VzdWl0ZSwgJycsIDEpCi0JCQlzZWxmLm5hbWVtYXBwZXJzLmFwcGVuZChiYXNlbWFwcGVyKQotCQkKLQlkZWYgZ2V0cHJlY29tcGluZm8oc2VsZiwgbW9kbmFtZSk6Ci0JCWxpc3QgPSBbXQotCQlmb3IgbWFwcGVyIGluIHNlbGYubmFtZW1hcHBlcnM6Ci0JCQllbWFwcGVyID0gbWFwcGVyLnByZXBhcmVmb3JleHBvcnQobW9kbmFtZSkKLQkJCWlmIGVtYXBwZXI6Ci0JCQkJbGlzdC5hcHBlbmQoZW1hcHBlcikKLQkJcmV0dXJuIGxpc3QKLQkJCi0JZGVmIGZpbmRjb2RlbmFtZShzZWxmLCB0eXBlLCBjb2RlKToKLQkJd2hpbGUgMToKLQkJCSMgRmlyc3QgdHJ5OiBjaGVjayB3aGV0aGVyIHdlIGFscmVhZHkga25vdyBhYm91dCB0aGlzIGNvZGUuCi0JCQlmb3IgbWFwcGVyIGluIHNlbGYubmFtZW1hcHBlcnM6Ci0JCQkJaWYgbWFwcGVyLmhhc2NvZGUodHlwZSwgY29kZSk6Ci0JCQkJCXJldHVybiBtYXBwZXIuZmluZGNvZGVuYW1lKHR5cGUsIGNvZGUpCi0JCQkjIFNlY29uZCB0cnk6IG1heWJlIG9uZSBvZiB0aGUgb3RoZXIgbW9kdWxlcyBrbm93cyBhYm91dCBpdC4KLQkJCWZvciBtYXBwZXIgaW4gc2VsZi5vdGhlcm5hbWVtYXBwZXJzOgotCQkJCWlmIG1hcHBlci5oYXNjb2RlKHR5cGUsIGNvZGUpOgotCQkJCQlzZWxmLm90aGVybmFtZW1hcHBlcnMucmVtb3ZlKG1hcHBlcikKLQkJCQkJc2VsZi5uYW1lbWFwcGVycy5hcHBlbmQobWFwcGVyKQotCQkJCQlpZiBzZWxmLmZwOgotCQkJCQkJc2VsZi5mcC53cml0ZSgiaW1wb3J0ICVzXG4iJW1hcHBlci5tb2R1bGVuYW1lKQotCQkJCQlicmVhawotCQkJZWxzZToKLQkJCQkjIElmIGFsbCB0aGlzIGhhcyBmYWlsZWQgd2UgYXNrIHRoZSB1c2VyIGZvciBhIGd1ZXNzIG9uIHdoZXJlIGl0IGNvdWxkCi0JCQkJIyBiZSBhbmQgcmV0cnkuCi0JCQkJaWYgc2VsZi5mcDoKLQkJCQkJbSA9IHNlbGYuYXNrZGVmaW5pdGlvbm1vZHVsZSh0eXBlLCBjb2RlKQotCQkJCWVsc2U6Ci0JCQkJCW0gPSBOb25lCi0JCQkJaWYgbm90IG06IHJldHVybiBOb25lLCBOb25lLCBOb25lCi0JCQkJbWFwcGVyID0gQ29kZU5hbWVNYXBwZXIoc2VsZi5jYW5faW50ZXJhY3QsIHNlbGYudmVyYm9zZSkKLQkJCQltYXBwZXIuYWRkbW9kdWxlKG0sIG0uX19uYW1lX18sIDApCi0JCQkJc2VsZi5uYW1lbWFwcGVycy5hcHBlbmQobWFwcGVyKQotCQotCWRlZiBhc2tkZWZpbml0aW9ubW9kdWxlKHNlbGYsIHR5cGUsIGNvZGUpOgotCQlpZiBub3Qgc2VsZi5jYW5faW50ZXJhY3Q6Ci0JCQlpZiBzZWxmLnZlcmJvc2U6Ci0JCQkJcHJpbnQgPj5zZWxmLnZlcmJvc2UsICIqKiBObyBkZWZpbml0aW9uIGZvciAlcyAnJXMnIGZvdW5kIiAlICh0eXBlLCBjb2RlKQotCQkJcmV0dXJuIE5vbmUKLQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1doZXJlIGlzICVzICVzIGRlY2xhcmVkPyclKHR5cGUsIGNvZGUpKQotCQlpZiBub3QgcGF0aDogcmV0dXJuCi0JCXBhdGgsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCi0JCW1vZG5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpWzBdCi0JCWlmIG5vdCBwYXRoIGluIHN5cy5wYXRoOgotCQkJc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGgpCi0JCW0gPSBfX2ltcG9ydF9fKG1vZG5hbWUpCi0JCXNlbGYuZnAud3JpdGUoImltcG9ydCAlc1xuIiVtb2RuYW1lKQotCQlyZXR1cm4gbQotCQkKLQlkZWYgY29tcGlsZWNsYXNzKHNlbGYsIGNscyk6Ci0JCVtuYW1lLCBjb2RlLCBkZXNjLCBwcm9wZXJ0aWVzLCBlbGVtZW50c10gPSBjbHMKLQkJcG5hbWUgPSBpZGVudGlmeShuYW1lKQotCQlpZiBzZWxmLm5hbWVtYXBwZXJzWzBdLmhhc2NvZGUoJ2NsYXNzJywgY29kZSk6Ci0JCQkjIHBsdXJhbCBmb3JtcyBhbmQgc3VjaAotCQkJb3RoZXJuYW1lLCBkdW1teSwgZHVtbXkgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmZpbmRjb2RlbmFtZSgnY2xhc3MnLCBjb2RlKQotCQkJaWYgc2VsZi5mcDoKLQkJCQlzZWxmLmZwLndyaXRlKCJcbiVzID0gJXNcbiIlKHBuYW1lLCBvdGhlcm5hbWUpKQotCQllbHNlOgotCQkJaWYgc2VsZi5mcDoKLQkJCQlzZWxmLmZwLndyaXRlKCdcbmNsYXNzICVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6XG4nICUgcG5hbWUpCi0JCQkJc2VsZi5mcC53cml0ZSgnXHQiIiIlcyAtICVzICIiIlxuJyAlIChhc2NpaShuYW1lKSwgYXNjaWkoZGVzYykpKQotCQkJCXNlbGYuZnAud3JpdGUoJ1x0d2FudCA9ICVzXG4nICUgYGNvZGVgKQotCQlzZWxmLm5hbWVtYXBwZXJzWzBdLmFkZG5hbWVjb2RlKCdjbGFzcycsIHBuYW1lLCBjb2RlKQotCQlwcm9wZXJ0aWVzLnNvcnQoKQotCQlmb3IgcHJvcCBpbiBwcm9wZXJ0aWVzOgotCQkJc2VsZi5jb21waWxlcHJvcGVydHkocHJvcCkKLQkJZWxlbWVudHMuc29ydCgpCi0JCWZvciBlbGVtIGluIGVsZW1lbnRzOgotCQkJc2VsZi5jb21waWxlZWxlbWVudChlbGVtKQotCQotCWRlZiBjb21waWxlcHJvcGVydHkoc2VsZiwgcHJvcCk6Ci0JCVtuYW1lLCBjb2RlLCB3aGF0XSA9IHByb3AKLQkJaWYgY29kZSA9PSAnY0AjISc6Ci0JCQkjIFNvbWV0aGluZyBzaWxseSB3aXRoIHBsdXJhbHMuIFNraXAgaXQuCi0JCQlyZXR1cm4KLQkJcG5hbWUgPSBpZGVudGlmeShuYW1lKQotCQlpZiBzZWxmLm5hbWVtYXBwZXJzWzBdLmhhc2NvZGUoJ3Byb3BlcnR5JywgY29kZSk6Ci0JCQkjIHBsdXJhbCBmb3JtcyBhbmQgc3VjaAotCQkJb3RoZXJuYW1lLCBkdW1teSwgZHVtbXkgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmZpbmRjb2RlbmFtZSgncHJvcGVydHknLCBjb2RlKQotCQkJaWYgcG5hbWUgPT0gb3RoZXJuYW1lOgotCQkJCXJldHVybgotCQkJaWYgc2VsZi5mcDoKLQkJCQlzZWxmLmZwLndyaXRlKCJcbl9Qcm9wXyVzID0gX1Byb3BfJXNcbiIlKHBuYW1lLCBvdGhlcm5hbWUpKQotCQllbHNlOgotCQkJaWYgc2VsZi5mcDoKLQkJCQlzZWxmLmZwLndyaXRlKCJjbGFzcyBfUHJvcF8lcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6XG4iICUgcG5hbWUpCi0JCQkJc2VsZi5mcC53cml0ZSgnXHQiIiIlcyAtICVzICIiIlxuJyAlIChhc2NpaShuYW1lKSwgYXNjaWkod2hhdFsxXSkpKQotCQkJCXNlbGYuZnAud3JpdGUoIlx0d2hpY2ggPSAlc1xuIiAlIGBjb2RlYCkKLQkJCQlzZWxmLmZwLndyaXRlKCJcdHdhbnQgPSAlc1xuIiAlIGB3aGF0WzBdYCkKLQkJc2VsZi5uYW1lbWFwcGVyc1swXS5hZGRuYW1lY29kZSgncHJvcGVydHknLCBwbmFtZSwgY29kZSkKLQkKLQlkZWYgY29tcGlsZWVsZW1lbnQoc2VsZiwgZWxlbSk6Ci0JCVtjb2RlLCBrZXlmb3JtXSA9IGVsZW0KLQkJaWYgc2VsZi5mcDoKLQkJCXNlbGYuZnAud3JpdGUoIiMgICAgICAgIGVsZW1lbnQgJXMgYXMgJXNcbiIgJSAoYGNvZGVgLCBrZXlmb3JtKSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIG1vZG5hbWUsIGJhc2VzdWl0ZSwgb3RoZXJuYW1lbWFwcGVycz1Ob25lLCBpbnRlcmFjdD0xLCAKKyAgICAgICAgICAgIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgIHNlbGYuZnAgPSBmcAorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIHNlbGYuYmFzZXN1aXRlID0gYmFzZXN1aXRlCisgICAgICAgIHNlbGYuY2FuX2ludGVyYWN0ID0gaW50ZXJhY3QKKyAgICAgICAgc2VsZi5tb2R1bGVuYW1lID0gbW9kbmFtZQorICAgICAgICBzZWxmLm5hbWVtYXBwZXJzID0gW0NvZGVOYW1lTWFwcGVyKHNlbGYuY2FuX2ludGVyYWN0LCBzZWxmLnZlcmJvc2UpXQorICAgICAgICBpZiBvdGhlcm5hbWVtYXBwZXJzOgorICAgICAgICAgICAgc2VsZi5vdGhlcm5hbWVtYXBwZXJzID0gb3RoZXJuYW1lbWFwcGVyc1s6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vdGhlcm5hbWVtYXBwZXJzID0gW10KKyAgICAgICAgaWYgYmFzZXN1aXRlOgorICAgICAgICAgICAgYmFzZW1hcHBlciA9IENvZGVOYW1lTWFwcGVyKHNlbGYuY2FuX2ludGVyYWN0LCBzZWxmLnZlcmJvc2UpCisgICAgICAgICAgICBiYXNlbWFwcGVyLmFkZG1vZHVsZShiYXNlc3VpdGUsICcnLCAxKQorICAgICAgICAgICAgc2VsZi5uYW1lbWFwcGVycy5hcHBlbmQoYmFzZW1hcHBlcikKKyAgICAgICAgCisgICAgZGVmIGdldHByZWNvbXBpbmZvKHNlbGYsIG1vZG5hbWUpOgorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgZm9yIG1hcHBlciBpbiBzZWxmLm5hbWVtYXBwZXJzOgorICAgICAgICAgICAgZW1hcHBlciA9IG1hcHBlci5wcmVwYXJlZm9yZXhwb3J0KG1vZG5hbWUpCisgICAgICAgICAgICBpZiBlbWFwcGVyOgorICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGVtYXBwZXIpCisgICAgICAgIHJldHVybiBsaXN0CisgICAgICAgIAorICAgIGRlZiBmaW5kY29kZW5hbWUoc2VsZiwgdHlwZSwgY29kZSk6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIEZpcnN0IHRyeTogY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyBjb2RlLgorICAgICAgICAgICAgZm9yIG1hcHBlciBpbiBzZWxmLm5hbWVtYXBwZXJzOgorICAgICAgICAgICAgICAgIGlmIG1hcHBlci5oYXNjb2RlKHR5cGUsIGNvZGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVyLmZpbmRjb2RlbmFtZSh0eXBlLCBjb2RlKQorICAgICAgICAgICAgIyBTZWNvbmQgdHJ5OiBtYXliZSBvbmUgb2YgdGhlIG90aGVyIG1vZHVsZXMga25vd3MgYWJvdXQgaXQuCisgICAgICAgICAgICBmb3IgbWFwcGVyIGluIHNlbGYub3RoZXJuYW1lbWFwcGVyczoKKyAgICAgICAgICAgICAgICBpZiBtYXBwZXIuaGFzY29kZSh0eXBlLCBjb2RlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vdGhlcm5hbWVtYXBwZXJzLnJlbW92ZShtYXBwZXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZW1hcHBlcnMuYXBwZW5kKG1hcHBlcikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoImltcG9ydCAlc1xuIiVtYXBwZXIubW9kdWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBJZiBhbGwgdGhpcyBoYXMgZmFpbGVkIHdlIGFzayB0aGUgdXNlciBmb3IgYSBndWVzcyBvbiB3aGVyZSBpdCBjb3VsZAorICAgICAgICAgICAgICAgICMgYmUgYW5kIHJldHJ5LgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZnA6CisgICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLmFza2RlZmluaXRpb25tb2R1bGUodHlwZSwgY29kZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIG5vdCBtOiByZXR1cm4gTm9uZSwgTm9uZSwgTm9uZQorICAgICAgICAgICAgICAgIG1hcHBlciA9IENvZGVOYW1lTWFwcGVyKHNlbGYuY2FuX2ludGVyYWN0LCBzZWxmLnZlcmJvc2UpCisgICAgICAgICAgICAgICAgbWFwcGVyLmFkZG1vZHVsZShtLCBtLl9fbmFtZV9fLCAwKQorICAgICAgICAgICAgICAgIHNlbGYubmFtZW1hcHBlcnMuYXBwZW5kKG1hcHBlcikKKyAgICAgICAgICAgICAgICAKKyAgICBkZWYgaGFzbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgZm9yIG1hcHBlciBpbiBzZWxmLm90aGVybmFtZW1hcHBlcnM6CisgICAgICAgICAgICBpZiBtYXBwZXIuaGFzbmFtZShuYW1lKSBhbmQgbWFwcGVyLm1vZHVsZW5hbWUgIT0gc2VsZi5tb2R1bGVuYW1lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnZlcmJvc2UsICJEdXBsaWNhdGUgUHl0aG9uIGlkZW50aWZpZXI6IiwgbmFtZSwgc2VsZi5tb2R1bGVuYW1lLCBtYXBwZXIubW9kdWxlbmFtZQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIAorICAgIGRlZiBhc2tkZWZpbml0aW9ubW9kdWxlKHNlbGYsIHR5cGUsIGNvZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5jYW5faW50ZXJhY3Q6CisgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnZlcmJvc2UsICIqKiBObyBkZWZpbml0aW9uIGZvciAlcyAnJXMnIGZvdW5kIiAlICh0eXBlLCBjb2RlKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1doZXJlIGlzICVzICVzIGRlY2xhcmVkPyclKHR5cGUsIGNvZGUpKQorICAgICAgICBpZiBub3QgcGF0aDogcmV0dXJuCisgICAgICAgIHBhdGgsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisgICAgICAgIG1vZG5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpWzBdCisgICAgICAgIGlmIG5vdCBwYXRoIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGgpCisgICAgICAgIG0gPSBfX2ltcG9ydF9fKG1vZG5hbWUpCisgICAgICAgIHNlbGYuZnAud3JpdGUoImltcG9ydCAlc1xuIiVtb2RuYW1lKQorICAgICAgICByZXR1cm4gbQorICAgICAgICAKKyAgICBkZWYgY29tcGlsZWNsYXNzKHNlbGYsIGNscyk6CisgICAgICAgIFtuYW1lLCBjb2RlLCBkZXNjLCBwcm9wZXJ0aWVzLCBlbGVtZW50c10gPSBjbHMKKyAgICAgICAgcG5hbWUgPSBpZGVudGlmeShuYW1lKQorICAgICAgICBpZiBzZWxmLm5hbWVtYXBwZXJzWzBdLmhhc2NvZGUoJ2NsYXNzJywgY29kZSk6CisgICAgICAgICAgICAjIHBsdXJhbCBmb3JtcyBhbmQgc3VjaAorICAgICAgICAgICAgb3RoZXJuYW1lLCBkdW1teSwgZHVtbXkgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmZpbmRjb2RlbmFtZSgnY2xhc3MnLCBjb2RlKQorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJcbiVzID0gJXNcbiIlKHBuYW1lLCBvdGhlcm5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCdcbmNsYXNzICVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6XG4nICUgcG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnICAgICIiIiVzIC0gJXMgIiIiXG4nICUgKGFzY2lpKG5hbWUpLCBhc2NpaShkZXNjKSkpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnICAgIHdhbnQgPSAlc1xuJyAlIGBjb2RlYCkKKyAgICAgICAgc2VsZi5uYW1lbWFwcGVyc1swXS5hZGRuYW1lY29kZSgnY2xhc3MnLCBwbmFtZSwgY29kZSkKKyAgICAgICAgcHJvcGVydGllcy5zb3J0KCkKKyAgICAgICAgZm9yIHByb3AgaW4gcHJvcGVydGllczoKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXByb3BlcnR5KHByb3ApCisgICAgICAgIGVsZW1lbnRzLnNvcnQoKQorICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50czoKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZWVsZW1lbnQoZWxlbSkKKyAgICAKKyAgICBkZWYgY29tcGlsZXByb3BlcnR5KHNlbGYsIHByb3ApOgorICAgICAgICBbbmFtZSwgY29kZSwgd2hhdF0gPSBwcm9wCisgICAgICAgIGlmIGNvZGUgPT0gJ2NAIyEnOgorICAgICAgICAgICAgIyBTb21ldGhpbmcgc2lsbHkgd2l0aCBwbHVyYWxzLiBTa2lwIGl0LgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBuYW1lID0gaWRlbnRpZnkobmFtZSkKKyAgICAgICAgaWYgc2VsZi5uYW1lbWFwcGVyc1swXS5oYXNjb2RlKCdwcm9wZXJ0eScsIGNvZGUpOgorICAgICAgICAgICAgIyBwbHVyYWwgZm9ybXMgYW5kIHN1Y2gKKyAgICAgICAgICAgIG90aGVybmFtZSwgZHVtbXksIGR1bW15ID0gc2VsZi5uYW1lbWFwcGVyc1swXS5maW5kY29kZW5hbWUoJ3Byb3BlcnR5JywgY29kZSkKKyAgICAgICAgICAgIGlmIHBuYW1lID09IG90aGVybmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNlbGYuZnA6CisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiXG5fUHJvcF8lcyA9IF9Qcm9wXyVzXG4iJShwbmFtZSwgb3RoZXJuYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuaGFzbmFtZShwbmFtZSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJjbGFzcyBfUHJvcF8lcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6XG4iICUgcG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnICAgICIiIiVzIC0gJXMgIiIiXG4nICUgKGFzY2lpKG5hbWUpLCBhc2NpaSh3aGF0WzFdKSkpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiICAgIHdoaWNoID0gJXNcbiIgJSBgY29kZWApCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiICAgIHdhbnQgPSAlc1xuIiAlIGB3aGF0WzBdYCkKKyAgICAgICAgc2VsZi5uYW1lbWFwcGVyc1swXS5hZGRuYW1lY29kZSgncHJvcGVydHknLCBwbmFtZSwgY29kZSkKKyAgICAKKyAgICBkZWYgY29tcGlsZWVsZW1lbnQoc2VsZiwgZWxlbSk6CisgICAgICAgIFtjb2RlLCBrZXlmb3JtXSA9IGVsZW0KKyAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiMgICAgICAgIGVsZW1lbnQgJXMgYXMgJXNcbiIgJSAoYGNvZGVgLCBrZXlmb3JtKSkKIAotCWRlZiBmaWxsY2xhc3Nwcm9wc2FuZGVsZW1zKHNlbGYsIGNscyk6Ci0JCVtuYW1lLCBjb2RlLCBkZXNjLCBwcm9wZXJ0aWVzLCBlbGVtZW50c10gPSBjbHMKLQkJY25hbWUgPSBpZGVudGlmeShuYW1lKQotCQlpZiBzZWxmLm5hbWVtYXBwZXJzWzBdLmhhc2NvZGUoJ2NsYXNzJywgY29kZSkgYW5kIFwKLQkJCQlzZWxmLm5hbWVtYXBwZXJzWzBdLmZpbmRjb2RlbmFtZSgnY2xhc3MnLCBjb2RlKVswXSAhPSBjbmFtZToKLQkJCSMgVGhpcyBpcyBhbiBvdGhlciBuYW1lIChwbHVyYWwgb3Igc28pIGZvciBzb21ldGhpbmcgZWxzZS4gU2tpcC4KLQkJCWlmIHNlbGYuZnAgYW5kIChlbGVtZW50cyBvciBsZW4ocHJvcGVydGllcykgPiAxIG9yIChsZW4ocHJvcGVydGllcykgPT0gMSBhbmQKLQkJCQlwcm9wZXJ0aWVzWzBdWzFdICE9ICdjQCMhJykpOgotCQkJCWlmIHNlbGYudmVyYm9zZToKLQkJCQkJcHJpbnQgPj5zZWxmLnZlcmJvc2UsICcqKiBTa2lwIG11bHRpcGxlICVzIG9mICVzIChjb2RlICVzKScgJSAoY25hbWUsIHNlbGYubmFtZW1hcHBlcnNbMF0uZmluZGNvZGVuYW1lKCdjbGFzcycsIGNvZGUpWzBdLCBgY29kZWApCi0JCQkJcmFpc2UgUnVudGltZUVycm9yLCAiQWJvdXQgdG8gc2tpcCBub24tZW1wdHkgY2xhc3MiCi0JCQlyZXR1cm4KLQkJcGxpc3QgPSBbXQotCQllbGlzdCA9IFtdCi0JCXN1cGVyY2xhc3NlcyA9IFtdCi0JCWZvciBwcm9wIGluIHByb3BlcnRpZXM6Ci0JCQlbcG5hbWUsIHBjb2RlLCB3aGF0XSA9IHByb3AKLQkJCWlmIHBjb2RlID09ICJjQCNeIjoKLQkJCQlzdXBlcmNsYXNzZXMuYXBwZW5kKHdoYXQpCi0JCQlpZiBwY29kZSA9PSAnY0AjISc6Ci0JCQkJY29udGludWUKLQkJCXBuYW1lID0gaWRlbnRpZnkocG5hbWUpCi0JCQlwbGlzdC5hcHBlbmQocG5hbWUpCisgICAgZGVmIGZpbGxjbGFzc3Byb3BzYW5kZWxlbXMoc2VsZiwgY2xzKToKKyAgICAgICAgW25hbWUsIGNvZGUsIGRlc2MsIHByb3BlcnRpZXMsIGVsZW1lbnRzXSA9IGNscworICAgICAgICBjbmFtZSA9IGlkZW50aWZ5KG5hbWUpCisgICAgICAgIGlmIHNlbGYubmFtZW1hcHBlcnNbMF0uaGFzY29kZSgnY2xhc3MnLCBjb2RlKSBhbmQgXAorICAgICAgICAgICAgICAgIHNlbGYubmFtZW1hcHBlcnNbMF0uZmluZGNvZGVuYW1lKCdjbGFzcycsIGNvZGUpWzBdICE9IGNuYW1lOgorICAgICAgICAgICAgIyBUaGlzIGlzIGFuIG90aGVyIG5hbWUgKHBsdXJhbCBvciBzbykgZm9yIHNvbWV0aGluZyBlbHNlLiBTa2lwLgorICAgICAgICAgICAgaWYgc2VsZi5mcCBhbmQgKGVsZW1lbnRzIG9yIGxlbihwcm9wZXJ0aWVzKSA+IDEgb3IgKGxlbihwcm9wZXJ0aWVzKSA9PSAxIGFuZAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbMF1bMV0gIT0gJ2NAIyEnKSk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYudmVyYm9zZSwgJyoqIFNraXAgbXVsdGlwbGUgJXMgb2YgJXMgKGNvZGUgJXMpJyAlIChjbmFtZSwgc2VsZi5uYW1lbWFwcGVyc1swXS5maW5kY29kZW5hbWUoJ2NsYXNzJywgY29kZSlbMF0sIGBjb2RlYCkKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJBYm91dCB0byBza2lwIG5vbi1lbXB0eSBjbGFzcyIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwbGlzdCA9IFtdCisgICAgICAgIGVsaXN0ID0gW10KKyAgICAgICAgc3VwZXJjbGFzc2VzID0gW10KKyAgICAgICAgZm9yIHByb3AgaW4gcHJvcGVydGllczoKKyAgICAgICAgICAgIFtwbmFtZSwgcGNvZGUsIHdoYXRdID0gcHJvcAorICAgICAgICAgICAgaWYgcGNvZGUgPT0gImNAI14iOgorICAgICAgICAgICAgICAgIHN1cGVyY2xhc3Nlcy5hcHBlbmQod2hhdCkKKyAgICAgICAgICAgIGlmIHBjb2RlID09ICdjQCMhJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcG5hbWUgPSBpZGVudGlmeShwbmFtZSkKKyAgICAgICAgICAgIHBsaXN0LmFwcGVuZChwbmFtZSkKIAotCQlzdXBlcmNsYXNzbmFtZXMgPSBbXQotCQlmb3Igc3VwZXJjbGFzcyBpbiBzdXBlcmNsYXNzZXM6Ci0JCQlzdXBlcklkLCBzdXBlckRlc2MsIGR1bW15ID0gc3VwZXJjbGFzcwotCQkJc3VwZXJjbGFzc25hbWUsIGZ1bGx5cXVhbGlmaWVkbmFtZSwgbW9kdWxlID0gc2VsZi5maW5kY29kZW5hbWUoImNsYXNzIiwgc3VwZXJJZCkKLQkJCSMgSSBkb24ndCB0aGluayB0aGlzIGlzIGNvcnJlY3Q6Ci0JCQlpZiBzdXBlcmNsYXNzbmFtZSA9PSBjbmFtZToKLQkJCQlwYXNzICMgc3VwZXJjbGFzc25hbWVzLmFwcGVuZChmdWxseXF1YWxpZmllZG5hbWUpCi0JCQllbHNlOgotCQkJCXN1cGVyY2xhc3NuYW1lcy5hcHBlbmQoc3VwZXJjbGFzc25hbWUpCisgICAgICAgIHN1cGVyY2xhc3NuYW1lcyA9IFtdCisgICAgICAgIGZvciBzdXBlcmNsYXNzIGluIHN1cGVyY2xhc3NlczoKKyAgICAgICAgICAgIHN1cGVySWQsIHN1cGVyRGVzYywgZHVtbXkgPSBzdXBlcmNsYXNzCisgICAgICAgICAgICBzdXBlcmNsYXNzbmFtZSwgZnVsbHlxdWFsaWZpZWRuYW1lLCBtb2R1bGUgPSBzZWxmLmZpbmRjb2RlbmFtZSgiY2xhc3MiLCBzdXBlcklkKQorICAgICAgICAgICAgIyBJIGRvbid0IHRoaW5rIHRoaXMgaXMgY29ycmVjdDoKKyAgICAgICAgICAgIGlmIHN1cGVyY2xhc3NuYW1lID09IGNuYW1lOgorICAgICAgICAgICAgICAgIHBhc3MgIyBzdXBlcmNsYXNzbmFtZXMuYXBwZW5kKGZ1bGx5cXVhbGlmaWVkbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3VwZXJjbGFzc25hbWVzLmFwcGVuZChzdXBlcmNsYXNzbmFtZSkKIAotCQlpZiBzZWxmLmZwOgotCQkJc2VsZi5mcC53cml0ZSgiJXMuX3N1cGVyY2xhc3NuYW1lcyA9ICVzXG4iJShjbmFtZSwgYHN1cGVyY2xhc3NuYW1lc2ApKQorICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiJXMuX3N1cGVyY2xhc3NuYW1lcyA9ICVzXG4iJShjbmFtZSwgYHN1cGVyY2xhc3NuYW1lc2ApKQogCi0JCWZvciBlbGVtIGluIGVsZW1lbnRzOgotCQkJW2Vjb2RlLCBrZXlmb3JtXSA9IGVsZW0KLQkJCWlmIGVjb2RlID09ICdjQCMhJzoKLQkJCQljb250aW51ZQotCQkJbmFtZSwgZW5hbWUsIG1vZHVsZSA9IHNlbGYuZmluZGNvZGVuYW1lKCdjbGFzcycsIGVjb2RlKQotCQkJaWYgbm90IG5hbWU6Ci0JCQkJaWYgc2VsZi5mcDoKLQkJCQkJc2VsZi5mcC53cml0ZSgiIyBYWFhYICVzIGVsZW1lbnQgJXMgbm90IGZvdW5kISFcbiIlKGNuYW1lLCBgZWNvZGVgKSkKLQkJCWVsc2U6Ci0JCQkJZWxpc3QuYXBwZW5kKChuYW1lLCBlbmFtZSkpCi0JCQkJCi0JCXBsaXN0LnNvcnQoKQotCQllbGlzdC5zb3J0KCkKLQkJCi0JCWlmIHNlbGYuZnA6Ci0JCQlzZWxmLmZwLndyaXRlKCIlcy5fcHJpdnByb3BkaWN0ID0ge1xuIiVjbmFtZSkKLQkJCWZvciBuIGluIHBsaXN0OgotCQkJCXNlbGYuZnAud3JpdGUoIlx0JyVzJyA6IF9Qcm9wXyVzLFxuIiUobiwgbikpCi0JCQlzZWxmLmZwLndyaXRlKCJ9XG4iKQotCQkJc2VsZi5mcC53cml0ZSgiJXMuX3ByaXZlbGVtZGljdCA9IHtcbiIlY25hbWUpCi0JCQlmb3IgbiwgZnVsbG4gaW4gZWxpc3Q6Ci0JCQkJc2VsZi5mcC53cml0ZSgiXHQnJXMnIDogJXMsXG4iJShuLCBmdWxsbikpCi0JCQlzZWxmLmZwLndyaXRlKCJ9XG4iKQotCQotCWRlZiBjb21waWxlY29tcGFyaXNvbihzZWxmLCBjb21wKToKLQkJW25hbWUsIGNvZGUsIGNvbW1lbnRdID0gY29tcAotCQlpbmFtZSA9IGlkZW50aWZ5KG5hbWUpCi0JCXNlbGYubmFtZW1hcHBlcnNbMF0uYWRkbmFtZWNvZGUoJ2NvbXBhcmlzb24nLCBpbmFtZSwgY29kZSkKLQkJaWYgc2VsZi5mcDoKLQkJCXNlbGYuZnAud3JpdGUoImNsYXNzICVzKGFldG9vbHMuTkNvbXBhcmlzb24pOlxuIiAlIGluYW1lKQotCQkJc2VsZi5mcC53cml0ZSgnXHQiIiIlcyAtICVzICIiIlxuJyAlIChhc2NpaShuYW1lKSwgYXNjaWkoY29tbWVudCkpKQotCQkKLQlkZWYgY29tcGlsZWVudW1lcmF0aW9uKHNlbGYsIGVudW0pOgotCQlbY29kZSwgaXRlbXNdID0gZW51bQotCQluYW1lID0gIl9FbnVtXyVzIiAlIGlkZW50aWZ5KGNvZGUpCi0JCWlmIHNlbGYuZnA6Ci0JCQlzZWxmLmZwLndyaXRlKCIlcyA9IHtcbiIgJSBuYW1lKQotCQkJZm9yIGl0ZW0gaW4gaXRlbXM6Ci0JCQkJc2VsZi5jb21waWxlZW51bWVyYXRvcihpdGVtKQotCQkJc2VsZi5mcC53cml0ZSgifVxuXG4iKQotCQlzZWxmLm5hbWVtYXBwZXJzWzBdLmFkZG5hbWVjb2RlKCdlbnVtJywgbmFtZSwgY29kZSkKLQkJcmV0dXJuIGNvZGUKLQkKLQlkZWYgY29tcGlsZWVudW1lcmF0b3Ioc2VsZiwgaXRlbSk6Ci0JCVtuYW1lLCBjb2RlLCBkZXNjXSA9IGl0ZW0KLQkJc2VsZi5mcC53cml0ZSgiXHQlcyA6ICVzLFx0IyAlc1xuIiAlIChgaWRlbnRpZnkobmFtZSlgLCBgY29kZWAsIGFzY2lpKGRlc2MpKSkKLQkJCi0JZGVmIGNoZWNrZm9yZW51bShzZWxmLCBlbnVtKToKLQkJIiIiVGhpcyBlbnVtIGNvZGUgaXMgdXNlZCBieSBhbiBldmVudC4gTWFrZSBzdXJlIGl0J3MgYXZhaWxhYmxlIiIiCi0JCW5hbWUsIGZ1bGxuYW1lLCBtb2R1bGUgPSBzZWxmLmZpbmRjb2RlbmFtZSgnZW51bScsIGVudW0pCi0JCWlmIG5vdCBuYW1lOgotCQkJaWYgc2VsZi5mcDoKLQkJCQlzZWxmLmZwLndyaXRlKCJfRW51bV8lcyA9IE5vbmUgIyBYWFhYIGVudW0gJXMgbm90IGZvdW5kISFcbiIlKGlkZW50aWZ5KGVudW0pLCBhc2NpaShlbnVtKSkpCi0JCQlyZXR1cm4KLQkJaWYgbW9kdWxlOgotCQkJaWYgc2VsZi5mcDoKLQkJCQlzZWxmLmZwLndyaXRlKCJmcm9tICVzIGltcG9ydCAlc1xuIiUobW9kdWxlLCBuYW1lKSkKLQkJCi0JZGVmIGR1bXBpbmRleChzZWxmKToKLQkJaWYgbm90IHNlbGYuZnA6Ci0JCQlyZXR1cm4KLQkJc2VsZi5mcC53cml0ZSgiXG4jXG4jIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGVcbiNcbiIpCi0JCQotCQlzZWxmLmZwLndyaXRlKCJfY2xhc3NkZWNsYXJhdGlvbnMgPSB7XG4iKQotCQljbGFzc2xpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnY2xhc3MnKQotCQljbGFzc2xpc3Quc29ydCgpCi0JCWZvciBrLCB2IGluIGNsYXNzbGlzdDoKLQkJCXNlbGYuZnAud3JpdGUoIlx0JXMgOiAlcyxcbiIgJSAoYGtgLCB2KSkKLQkJc2VsZi5mcC53cml0ZSgifVxuIikKLQkJCi0jIwkJc2VsZi5mcC53cml0ZSgiXG5fcHJvcGRlY2xhcmF0aW9ucyA9IHtcbiIpCi0jIwkJcHJvcGxpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgncHJvcGVydHknKQotIyMJCXByb3BsaXN0LnNvcnQoKQotIyMJCWZvciBrLCB2IGluIHByb3BsaXN0OgotIyMJCQlzZWxmLmZwLndyaXRlKCJcdCVzIDogX1Byb3BfJXMsXG4iICUgKGBrYCwgdikpCi0jIwkJc2VsZi5mcC53cml0ZSgifVxuIikKLSMjCQkKLSMjCQlzZWxmLmZwLndyaXRlKCJcbl9jb21wZGVjbGFyYXRpb25zID0ge1xuIikKLSMjCQljb21wbGlzdCA9IHNlbGYubmFtZW1hcHBlcnNbMF0uZ2V0YWxsKCdjb21wYXJpc29uJykKLSMjCQljb21wbGlzdC5zb3J0KCkKLSMjCQlmb3IgaywgdiBpbiBjb21wbGlzdDoKLSMjCQkJc2VsZi5mcC53cml0ZSgiXHQlcyA6ICVzLFxuIiAlIChga2AsIHYpKQotIyMJCXNlbGYuZnAud3JpdGUoIn1cbiIpCi0jIwkJCi0jIwkJc2VsZi5mcC53cml0ZSgiXG5fZW51bWRlY2xhcmF0aW9ucyA9IHtcbiIpCi0jIwkJZW51bWxpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnZW51bScpCi0jIwkJZW51bWxpc3Quc29ydCgpCi0jIwkJZm9yIGssIHYgaW4gZW51bWxpc3Q6Ci0jIwkJCXNlbGYuZnAud3JpdGUoIlx0JXMgOiAlcyxcbiIgJSAoYGtgLCB2KSkKLSMjCQlzZWxmLmZwLndyaXRlKCJ9XG4iKQorICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50czoKKyAgICAgICAgICAgIFtlY29kZSwga2V5Zm9ybV0gPSBlbGVtCisgICAgICAgICAgICBpZiBlY29kZSA9PSAnY0AjISc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG5hbWUsIGVuYW1lLCBtb2R1bGUgPSBzZWxmLmZpbmRjb2RlbmFtZSgnY2xhc3MnLCBlY29kZSkKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZnA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiMgWFhYWCAlcyBlbGVtZW50ICVzIG5vdCBmb3VuZCEhXG4iJShjbmFtZSwgYGVjb2RlYCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVsaXN0LmFwcGVuZCgobmFtZSwgZW5hbWUpKQorICAgICAgICAgICAgICAgIAorICAgICAgICBwbGlzdC5zb3J0KCkKKyAgICAgICAgZWxpc3Quc29ydCgpCisgICAgICAgIAorICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiJXMuX3ByaXZwcm9wZGljdCA9IHtcbiIlY25hbWUpCisgICAgICAgICAgICBmb3IgbiBpbiBwbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCIgICAgJyVzJyA6IF9Qcm9wXyVzLFxuIiUobiwgbikpCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJ9XG4iKQorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiJXMuX3ByaXZlbGVtZGljdCA9IHtcbiIlY25hbWUpCisgICAgICAgICAgICBmb3IgbiwgZnVsbG4gaW4gZWxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiICAgICclcycgOiAlcyxcbiIlKG4sIGZ1bGxuKSkKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIn1cbiIpCisgICAgCisgICAgZGVmIGNvbXBpbGVjb21wYXJpc29uKHNlbGYsIGNvbXApOgorICAgICAgICBbbmFtZSwgY29kZSwgY29tbWVudF0gPSBjb21wCisgICAgICAgIGluYW1lID0gaWRlbnRpZnkobmFtZSkKKyAgICAgICAgc2VsZi5uYW1lbWFwcGVyc1swXS5hZGRuYW1lY29kZSgnY29tcGFyaXNvbicsIGluYW1lLCBjb2RlKQorICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgJXMoYWV0b29scy5OQ29tcGFyaXNvbik6XG4iICUgaW5hbWUpCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCcgICAgIiIiJXMgLSAlcyAiIiJcbicgJSAoYXNjaWkobmFtZSksIGFzY2lpKGNvbW1lbnQpKSkKKyAgICAgICAgCisgICAgZGVmIGNvbXBpbGVlbnVtZXJhdGlvbihzZWxmLCBlbnVtKToKKyAgICAgICAgW2NvZGUsIGl0ZW1zXSA9IGVudW0KKyAgICAgICAgbmFtZSA9ICJfRW51bV8lcyIgJSBpZGVudGlmeShjb2RlKQorICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiJXMgPSB7XG4iICUgbmFtZSkKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZWVudW1lcmF0b3IoaXRlbSkKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIn1cblxuIikKKyAgICAgICAgc2VsZi5uYW1lbWFwcGVyc1swXS5hZGRuYW1lY29kZSgnZW51bScsIG5hbWUsIGNvZGUpCisgICAgICAgIHJldHVybiBjb2RlCisgICAgCisgICAgZGVmIGNvbXBpbGVlbnVtZXJhdG9yKHNlbGYsIGl0ZW0pOgorICAgICAgICBbbmFtZSwgY29kZSwgZGVzY10gPSBpdGVtCisgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlcyA6ICVzLFx0IyAlc1xuIiAlIChgaWRlbnRpZnkobmFtZSlgLCBgY29kZWAsIGFzY2lpKGRlc2MpKSkKKyAgICAgICAgCisgICAgZGVmIGNoZWNrZm9yZW51bShzZWxmLCBlbnVtKToKKyAgICAgICAgIiIiVGhpcyBlbnVtIGNvZGUgaXMgdXNlZCBieSBhbiBldmVudC4gTWFrZSBzdXJlIGl0J3MgYXZhaWxhYmxlIiIiCisgICAgICAgIG5hbWUsIGZ1bGxuYW1lLCBtb2R1bGUgPSBzZWxmLmZpbmRjb2RlbmFtZSgnZW51bScsIGVudW0pCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJfRW51bV8lcyA9IE5vbmUgIyBYWFhYIGVudW0gJXMgbm90IGZvdW5kISFcbiIlKGlkZW50aWZ5KGVudW0pLCBhc2NpaShlbnVtKSkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbW9kdWxlOgorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJmcm9tICVzIGltcG9ydCAlc1xuIiUobW9kdWxlLCBuYW1lKSkKKyAgICAgICAgCisgICAgZGVmIGR1bXBpbmRleChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZnA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mcC53cml0ZSgiXG4jXG4jIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGVcbiNcbiIpCisgICAgICAgIAorICAgICAgICBzZWxmLmZwLndyaXRlKCJfY2xhc3NkZWNsYXJhdGlvbnMgPSB7XG4iKQorICAgICAgICBjbGFzc2xpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnY2xhc3MnKQorICAgICAgICBjbGFzc2xpc3Quc29ydCgpCisgICAgICAgIGZvciBrLCB2IGluIGNsYXNzbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlcyA6ICVzLFxuIiAlIChga2AsIHYpKQorICAgICAgICBzZWxmLmZwLndyaXRlKCJ9XG4iKQorICAgICAgICAKKyMjICAgICAgc2VsZi5mcC53cml0ZSgiXG5fcHJvcGRlY2xhcmF0aW9ucyA9IHtcbiIpCisjIyAgICAgIHByb3BsaXN0ID0gc2VsZi5uYW1lbWFwcGVyc1swXS5nZXRhbGwoJ3Byb3BlcnR5JykKKyMjICAgICAgcHJvcGxpc3Quc29ydCgpCisjIyAgICAgIGZvciBrLCB2IGluIHByb3BsaXN0OgorIyMgICAgICAgICAgc2VsZi5mcC53cml0ZSgiICAgICVzIDogX1Byb3BfJXMsXG4iICUgKGBrYCwgdikpCisjIyAgICAgIHNlbGYuZnAud3JpdGUoIn1cbiIpCisjIyAgICAgIAorIyMgICAgICBzZWxmLmZwLndyaXRlKCJcbl9jb21wZGVjbGFyYXRpb25zID0ge1xuIikKKyMjICAgICAgY29tcGxpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnY29tcGFyaXNvbicpCisjIyAgICAgIGNvbXBsaXN0LnNvcnQoKQorIyMgICAgICBmb3IgaywgdiBpbiBjb21wbGlzdDoKKyMjICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlcyA6ICVzLFxuIiAlIChga2AsIHYpKQorIyMgICAgICBzZWxmLmZwLndyaXRlKCJ9XG4iKQorIyMgICAgICAKKyMjICAgICAgc2VsZi5mcC53cml0ZSgiXG5fZW51bWRlY2xhcmF0aW9ucyA9IHtcbiIpCisjIyAgICAgIGVudW1saXN0ID0gc2VsZi5uYW1lbWFwcGVyc1swXS5nZXRhbGwoJ2VudW0nKQorIyMgICAgICBlbnVtbGlzdC5zb3J0KCkKKyMjICAgICAgZm9yIGssIHYgaW4gZW51bWxpc3Q6CisjIyAgICAgICAgICBzZWxmLmZwLndyaXRlKCIgICAgJXMgOiAlcyxcbiIgJSAoYGtgLCB2KSkKKyMjICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKIAogZGVmIGNvbXBpbGVkYXRhKGRhdGEpOgotCVt0eXBlLCBkZXNjcmlwdGlvbiwgZmxhZ3NdID0gZGF0YQotCXJldHVybiAiJXMgLS0gJXMgJXMiICUgKGB0eXBlYCwgYGRlc2NyaXB0aW9uYCwgY29tcGlsZWRhdGFmbGFncyhmbGFncykpCi0JCisgICAgW3R5cGUsIGRlc2NyaXB0aW9uLCBmbGFnc10gPSBkYXRhCisgICAgcmV0dXJuICIlcyAtLSAlcyAlcyIgJSAoYHR5cGVgLCBgZGVzY3JpcHRpb25gLCBjb21waWxlZGF0YWZsYWdzKGZsYWdzKSkKKyAgICAKIGRlZiBpc19udWxsKGRhdGEpOgotCXJldHVybiBkYXRhWzBdID09ICdudWxsJwotCQorICAgIHJldHVybiBkYXRhWzBdID09ICdudWxsJworICAgIAogZGVmIGlzX29wdGlvbmFsKGRhdGEpOgotCXJldHVybiAoZGF0YVsyXSAmIDB4ODAwMCkKLQkKKyAgICByZXR1cm4gKGRhdGFbMl0gJiAweDgwMDApCisgICAgCiBkZWYgaXNfZW51bShkYXRhKToKLQlyZXR1cm4gKGRhdGFbMl0gJiAweDIwMDApCi0JCisgICAgcmV0dXJuIChkYXRhWzJdICYgMHgyMDAwKQorICAgIAogZGVmIGdldGRhdGFkb2MoZGF0YSk6Ci0JW3R5cGUsIGRlc2NyLCBmbGFnc10gPSBkYXRhCi0JaWYgZGVzY3I6Ci0JCXJldHVybiBhc2NpaShkZXNjcikKLQlpZiB0eXBlID09ICcqKioqJzoKLQkJcmV0dXJuICdhbnl0aGluZycKLQlpZiB0eXBlID09ICdvYmogJzoKLQkJcmV0dXJuICdhbiBBRSBvYmplY3QgcmVmZXJlbmNlJwotCXJldHVybiAidW5kb2N1bWVudGVkLCB0eXBlY29kZSAlcyIlYHR5cGVgCisgICAgW3R5cGUsIGRlc2NyLCBmbGFnc10gPSBkYXRhCisgICAgaWYgZGVzY3I6CisgICAgICAgIHJldHVybiBhc2NpaShkZXNjcikKKyAgICBpZiB0eXBlID09ICcqKioqJzoKKyAgICAgICAgcmV0dXJuICdhbnl0aGluZycKKyAgICBpZiB0eXBlID09ICdvYmogJzoKKyAgICAgICAgcmV0dXJuICdhbiBBRSBvYmplY3QgcmVmZXJlbmNlJworICAgIHJldHVybiAidW5kb2N1bWVudGVkLCB0eXBlY29kZSAlcyIlYHR5cGVgCiAKIGRhdGFmbGFnZGljdCA9IHsxNTogIm9wdGlvbmFsIiwgMTQ6ICJsaXN0IiwgMTM6ICJlbnVtIiwgMTI6ICJtdXRhYmxlIn0KIGRlZiBjb21waWxlZGF0YWZsYWdzKGZsYWdzKToKLQliaXRzID0gW10KLQlmb3IgaSBpbiByYW5nZSgxNik6Ci0JCWlmIGZsYWdzICYgKDE8PGkpOgotCQkJaWYgaSBpbiBkYXRhZmxhZ2RpY3Qua2V5cygpOgotCQkJCWJpdHMuYXBwZW5kKGRhdGFmbGFnZGljdFtpXSkKLQkJCWVsc2U6Ci0JCQkJYml0cy5hcHBlbmQoYGlgKQotCXJldHVybiAnWyVzXScgJSBzdHJpbmcuam9pbihiaXRzKQotCQorICAgIGJpdHMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDE2KToKKyAgICAgICAgaWYgZmxhZ3MgJiAoMTw8aSk6CisgICAgICAgICAgICBpZiBpIGluIGRhdGFmbGFnZGljdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgYml0cy5hcHBlbmQoZGF0YWZsYWdkaWN0W2ldKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiaXRzLmFwcGVuZChgaWApCisgICAgcmV0dXJuICdbJXNdJyAlIHN0cmluZy5qb2luKGJpdHMpCisgICAgCiBkZWYgYXNjaWkoc3RyKToKLQkiIiJSZXR1cm4gYSBzdHJpbmcgd2l0aCBhbGwgbm9uLWFzY2lpIGNoYXJhY3RlcnMgaGV4LWVuY29kZWQiIiIKLQlpZiB0eXBlKHN0cikgIT0gdHlwZSgnJyk6Ci0JCXJldHVybiBtYXAoYXNjaWksIHN0cikKLQlydiA9ICcnCi0JZm9yIGMgaW4gc3RyOgotCQlpZiBjIGluICgnXHQnLCAnXG4nLCAnXHInKSBvciAnICcgPD0gYyA8IGNocigweDdmKToKLQkJCXJ2ID0gcnYgKyBjCi0JCWVsc2U6Ci0JCQlydiA9IHJ2ICsgJ1xcJyArICd4JTAyLjJ4JyAlIG9yZChjKQotCXJldHVybiBydgotCQorICAgICIiIlJldHVybiBhIHN0cmluZyB3aXRoIGFsbCBub24tYXNjaWkgY2hhcmFjdGVycyBoZXgtZW5jb2RlZCIiIgorICAgIGlmIHR5cGUoc3RyKSAhPSB0eXBlKCcnKToKKyAgICAgICAgcmV0dXJuIG1hcChhc2NpaSwgc3RyKQorICAgIHJ2ID0gJycKKyAgICBmb3IgYyBpbiBzdHI6CisgICAgICAgIGlmIGMgaW4gKCdcdCcsICdcbicsICdccicpIG9yICcgJyA8PSBjIDwgY2hyKDB4N2YpOgorICAgICAgICAgICAgcnYgPSBydiArIGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJ2ID0gcnYgKyAnXFwnICsgJ3glMDIuMngnICUgb3JkKGMpCisgICAgcmV0dXJuIHJ2CisgICAgCiBkZWYgaWRlbnRpZnkoc3RyKToKLQkiIiJUdXJuIGFueSBzdHJpbmcgaW50byBhbiBpZGVudGlmaWVyOgotCS0gcmVwbGFjZSBzcGFjZSBieSBfCi0JLSByZXBsYWNlIG90aGVyIGlsbGVnYWwgY2hhcnMgYnkgX3h4XyAoaGV4IGNvZGUpCi0JLSBwcmVwZW5kIF8gaWYgdGhlIHJlc3VsdCBpcyBhIHB5dGhvbiBrZXl3b3JkCi0JIiIiCi0JaWYgbm90IHN0cjoKLQkJcmV0dXJuICJlbXB0eV9hZV9uYW1lXyIKLQlydiA9ICcnCi0Jb2sgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArICdfJwotCW9rMiA9IG9rICsgc3RyaW5nLmRpZ2l0cwotCWZvciBjIGluIHN0cjoKLQkJaWYgYyBpbiBvazoKLQkJCXJ2ID0gcnYgKyBjCi0JCWVsaWYgYyA9PSAnICc6Ci0JCQlydiA9IHJ2ICsgJ18nCi0JCWVsc2U6Ci0JCQlydiA9IHJ2ICsgJ18lMDIuMnhfJyVvcmQoYykKLQkJb2sgPSBvazIKLQlpZiBrZXl3b3JkLmlza2V5d29yZChydik6Ci0JCXJ2ID0gcnYgKyAnXycKLQlyZXR1cm4gcnYKKyAgICAiIiJUdXJuIGFueSBzdHJpbmcgaW50byBhbiBpZGVudGlmaWVyOgorICAgIC0gcmVwbGFjZSBzcGFjZSBieSBfCisgICAgLSByZXBsYWNlIG90aGVyIGlsbGVnYWwgY2hhcnMgYnkgX3h4XyAoaGV4IGNvZGUpCisgICAgLSBwcmVwZW5kIF8gaWYgdGhlIHJlc3VsdCBpcyBhIHB5dGhvbiBrZXl3b3JkCisgICAgIiIiCisgICAgaWYgbm90IHN0cjoKKyAgICAgICAgcmV0dXJuICJlbXB0eV9hZV9uYW1lXyIKKyAgICBydiA9ICcnCisgICAgb2sgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArICdfJworICAgIG9rMiA9IG9rICsgc3RyaW5nLmRpZ2l0cworICAgIGZvciBjIGluIHN0cjoKKyAgICAgICAgaWYgYyBpbiBvazoKKyAgICAgICAgICAgIHJ2ID0gcnYgKyBjCisgICAgICAgIGVsaWYgYyA9PSAnICc6CisgICAgICAgICAgICBydiA9IHJ2ICsgJ18nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBydiA9IHJ2ICsgJ18lMDIuMnhfJyVvcmQoYykKKyAgICAgICAgb2sgPSBvazIKKyAgICBpZiBrZXl3b3JkLmlza2V5d29yZChydik6CisgICAgICAgIHJ2ID0gcnYgKyAnXycKKyAgICByZXR1cm4gcnYKIAogIyBDYWxsIHRoZSBtYWluIHByb2dyYW0KIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQlzeXMuZXhpdCgxKQorICAgIG1haW4oKQorICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvaWMucHkgYi9MaWIvcGxhdC1tYWMvaWMucHkKaW5kZXggMzMwOTFmZi4uYjkwYWE3NSAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2ljLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9pYy5weQpAQCAtMTEsMTYgKzExLDE2IEBACiBlcnJvcj1pY2dsdWUuZXJyb3IKIAogIyBGcm9tIGljdHlwZXMuaDoKLWljUHJlZk5vdEZvdW5kRXJyID0gLTY2NgkJIyBwcmVmZXJlbmNlIG5vdCBmb3VuZCAoZHVoISkKLWljUGVybUVyciA9IC02NjcJCQkJIyBjYW5ub3Qgc2V0IHByZWZlcmVuY2UKLWljUHJlZkRhdGFFcnIgPSAtNjY4CQkJIyBwcm9ibGVtIHdpdGggcHJlZmVyZW5jZSBkYXRhCi1pY0ludGVybmFsRXJyID0gLTY2OQkJCSMgaG1tLCB0aGlzIGlzIG5vdCBnb29kCi1pY1RydW5jYXRlZEVyciA9IC02NzAJCQkjIG1vcmUgZGF0YSB3YXMgcHJlc2VudCB0aGFuIHdhcyByZXR1cm5lZAotaWNOb01vcmVXcml0ZXJzRXJyID0gLTY3MQkJIyB5b3UgY2Fubm90IGJlZ2luIGEgd3JpdGUgc2Vzc2lvbiBiZWNhdXNlIHNvbWVvbmUgZWxzZSBpcyBhbHJlYWR5IGRvaW5nIGl0ICovCi1pY05vdGhpbmdUb092ZXJyaWRlRXJyID0gLTY3MgkjIG5vIGNvbXBvbmVudCBmb3IgdGhlIG92ZXJyaWRlIGNvbXBvbmVudCB0byBjYXB0dXJlCi1pY05vVVJMRXJyID0gLTY3MwkJCQkjIG5vIFVSTCBmb3VuZAotaWNDb25maWdOb3RGb3VuZEVyciA9IC02NzQJCSMgbm8gY29uZmlndXJhdGlvbiB3YXMgZm91bmQKLWljQ29uZmlnSW5hcHByb3ByaWF0ZUVyciA9IC02NzUJIyBpbmNvcnJlY3QgbWFudWZhY3R1cmVyIGNvZGUKK2ljUHJlZk5vdEZvdW5kRXJyID0gLTY2NiAgICAgICAgIyBwcmVmZXJlbmNlIG5vdCBmb3VuZCAoZHVoISkKK2ljUGVybUVyciA9IC02NjcgICAgICAgICAgICAgICAgIyBjYW5ub3Qgc2V0IHByZWZlcmVuY2UKK2ljUHJlZkRhdGFFcnIgPSAtNjY4ICAgICAgICAgICAgIyBwcm9ibGVtIHdpdGggcHJlZmVyZW5jZSBkYXRhCitpY0ludGVybmFsRXJyID0gLTY2OSAgICAgICAgICAgICMgaG1tLCB0aGlzIGlzIG5vdCBnb29kCitpY1RydW5jYXRlZEVyciA9IC02NzAgICAgICAgICAgICMgbW9yZSBkYXRhIHdhcyBwcmVzZW50IHRoYW4gd2FzIHJldHVybmVkCitpY05vTW9yZVdyaXRlcnNFcnIgPSAtNjcxICAgICAgICMgeW91IGNhbm5vdCBiZWdpbiBhIHdyaXRlIHNlc3Npb24gYmVjYXVzZSBzb21lb25lIGVsc2UgaXMgYWxyZWFkeSBkb2luZyBpdCAqLworaWNOb3RoaW5nVG9PdmVycmlkZUVyciA9IC02NzIgICAjIG5vIGNvbXBvbmVudCBmb3IgdGhlIG92ZXJyaWRlIGNvbXBvbmVudCB0byBjYXB0dXJlCitpY05vVVJMRXJyID0gLTY3MyAgICAgICAgICAgICAgICMgbm8gVVJMIGZvdW5kCitpY0NvbmZpZ05vdEZvdW5kRXJyID0gLTY3NCAgICAgICMgbm8gY29uZmlndXJhdGlvbiB3YXMgZm91bmQKK2ljQ29uZmlnSW5hcHByb3ByaWF0ZUVyciA9IC02NzUgIyBpbmNvcnJlY3QgbWFudWZhY3R1cmVyIGNvZGUKIAogSUNhdHRyX25vX2NoYW5nZSA9IC0xCiAKQEAgLTMwLDI0MCArMzAsMjQwIEBACiAjIEVuZCBvZiBpY3R5cGVzLmgKIAogY2xhc3MgSUNPcGFxdWVEYXRhOgotCSIiIkFuIHVucGFyc2VhYmxlIElDIGVudHJ5IiIiCi0JZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgotCQlzZWxmLmRhdGEgPSBkYXRhCisgICAgIiIiQW4gdW5wYXJzZWFibGUgSUMgZW50cnkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKIAotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICJJQ09wYXF1ZURhdGEoJXMpIiVgc2VsZi5kYXRhYAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJQ09wYXF1ZURhdGEoJXMpIiVgc2VsZi5kYXRhYAogCiBfSUNPcGFxdWVEYXRhVHlwZT10eXBlKElDT3BhcXVlRGF0YSgnJykpCi0JCQorICAgICAgICAKIGRlZiBfZGVjb2RlX2RlZmF1bHQoZGF0YSwga2V5KToKLQlpZiBsZW4oZGF0YSkgPT0gMDoKLQkJcmV0dXJuIGRhdGEKLQlpZiBvcmQoZGF0YVswXSkgPT0gbGVuKGRhdGEpLTE6Ci0JCSMgQXNzdW1lIFBzdHJpbmcKLQkJcmV0dXJuIGRhdGFbMTpdCi0JcmV0dXJuIElDT3BhcXVlRGF0YShkYXRhKQotCQotCQorICAgIGlmIGxlbihkYXRhKSA9PSAwOgorICAgICAgICByZXR1cm4gZGF0YQorICAgIGlmIG9yZChkYXRhWzBdKSA9PSBsZW4oZGF0YSktMToKKyAgICAgICAgIyBBc3N1bWUgUHN0cmluZworICAgICAgICByZXR1cm4gZGF0YVsxOl0KKyAgICByZXR1cm4gSUNPcGFxdWVEYXRhKGRhdGEpCisgICAgCisgICAgCiBkZWYgX2RlY29kZV9tdWx0aXN0cihkYXRhLCBrZXkpOgotCW51bXN0ciA9IG9yZChkYXRhWzBdKSA8PCA4IHwgb3JkKGRhdGFbMV0pCi0JcnYgPSBbXQotCXB0ciA9IDIKLQlmb3IgaSBpbiByYW5nZShudW1zdHIpOgotCQlzdHJsZW4gPSBvcmQoZGF0YVtwdHJdKQotCQlzdHIgPSBkYXRhW3B0cisxOnB0citzdHJsZW4rMV0KLQkJcnYuYXBwZW5kKHN0cikKLQkJcHRyID0gcHRyICsgc3RybGVuICsgMQotCXJldHVybiBydgotCQorICAgIG51bXN0ciA9IG9yZChkYXRhWzBdKSA8PCA4IHwgb3JkKGRhdGFbMV0pCisgICAgcnYgPSBbXQorICAgIHB0ciA9IDIKKyAgICBmb3IgaSBpbiByYW5nZShudW1zdHIpOgorICAgICAgICBzdHJsZW4gPSBvcmQoZGF0YVtwdHJdKQorICAgICAgICBzdHIgPSBkYXRhW3B0cisxOnB0citzdHJsZW4rMV0KKyAgICAgICAgcnYuYXBwZW5kKHN0cikKKyAgICAgICAgcHRyID0gcHRyICsgc3RybGVuICsgMQorICAgIHJldHVybiBydgorICAgIAogZGVmIF9kZWNvZGVfZm9udHJlY29yZChkYXRhLCBrZXkpOgotCXNpemUgPSBvcmQoZGF0YVswXSkgPDwgOCB8IG9yZChkYXRhWzFdKQotCWZhY2UgPSBvcmQoZGF0YVsyXSkKLQluYW1lbGVuID0gb3JkKGRhdGFbNF0pCi0JcmV0dXJuIHNpemUsIGZhY2UsIGRhdGFbNTo1K25hbWVsZW5dCi0JCisgICAgc2l6ZSA9IG9yZChkYXRhWzBdKSA8PCA4IHwgb3JkKGRhdGFbMV0pCisgICAgZmFjZSA9IG9yZChkYXRhWzJdKQorICAgIG5hbWVsZW4gPSBvcmQoZGF0YVs0XSkKKyAgICByZXR1cm4gc2l6ZSwgZmFjZSwgZGF0YVs1OjUrbmFtZWxlbl0KKyAgICAKIGRlZiBfZGVjb2RlX2Jvb2xlYW4oZGF0YSwga2V5KToKLQlyZXR1cm4gb3JkKGRhdGFbMF0pCi0JCisgICAgcmV0dXJuIG9yZChkYXRhWzBdKQorICAgIAogZGVmIF9kZWNvZGVfdGV4dChkYXRhLCBrZXkpOgotCXJldHVybiBkYXRhCi0JCisgICAgcmV0dXJuIGRhdGEKKyAgICAKIGRlZiBfZGVjb2RlX2NoYXJzZXQoZGF0YSwga2V5KToKLQlyZXR1cm4gZGF0YVs6MjU2XSwgZGF0YVsyNTY6XQotCQorICAgIHJldHVybiBkYXRhWzoyNTZdLCBkYXRhWzI1NjpdCisgICAgCiBkZWYgX2RlY29kZV9hcHBzcGVjKGRhdGEsIGtleSk6Ci0JbmFtZWxlbiA9IG9yZChkYXRhWzRdKQotCXJldHVybiBkYXRhWzA6NF0sIGRhdGFbNTo1K25hbWVsZW5dCisgICAgbmFtZWxlbiA9IG9yZChkYXRhWzRdKQorICAgIHJldHVybiBkYXRhWzA6NF0sIGRhdGFbNTo1K25hbWVsZW5dCiAKIGRlZiBfY29kZV9kZWZhdWx0KGRhdGEsIGtleSk6Ci0JcmV0dXJuIGNocihsZW4oZGF0YSkpICsgZGF0YQotCQkKKyAgICByZXR1cm4gY2hyKGxlbihkYXRhKSkgKyBkYXRhCisgICAgICAgIAogZGVmIF9jb2RlX211bHRpc3RyKGRhdGEsIGtleSk6Ci0JbnVtc3RyID0gbGVuKGRhdGEpCi0JcnYgPSBjaHIoKG51bXN0cj4+OCkgJiAweGZmKSArIGNocihudW1zdHIgJiAweGZmKQotCWZvciBpIGluIGRhdGE6Ci0JCXJ2ID0gcnYgKyBfY29kZV9kZWZhdWx0KGkpCi0JcmV0dXJuIHJ2Ci0JCisgICAgbnVtc3RyID0gbGVuKGRhdGEpCisgICAgcnYgPSBjaHIoKG51bXN0cj4+OCkgJiAweGZmKSArIGNocihudW1zdHIgJiAweGZmKQorICAgIGZvciBpIGluIGRhdGE6CisgICAgICAgIHJ2ID0gcnYgKyBfY29kZV9kZWZhdWx0KGkpCisgICAgcmV0dXJuIHJ2CisgICAgCiBkZWYgX2NvZGVfZm9udHJlY29yZChkYXRhLCBrZXkpOgotCXNpemUsIGZhY2UsIG5hbWUgPSBkYXRhCi0JcmV0dXJuIGNocigoc2l6ZT4+OCkgJiAweGZmKSArIGNocihzaXplICYgMHhmZikgKyBjaHIoZmFjZSAmIDB4ZmYpICsgXAotCQljaHIoMCkgKyBfY29kZV9kZWZhdWx0KG5hbWUpCi0JCisgICAgc2l6ZSwgZmFjZSwgbmFtZSA9IGRhdGEKKyAgICByZXR1cm4gY2hyKChzaXplPj44KSAmIDB4ZmYpICsgY2hyKHNpemUgJiAweGZmKSArIGNocihmYWNlICYgMHhmZikgKyBcCisgICAgICAgIGNocigwKSArIF9jb2RlX2RlZmF1bHQobmFtZSkKKyAgICAKIGRlZiBfY29kZV9ib29sZWFuKGRhdGEsIGtleSk6Ci0JcHJpbnQgJ1hYWFggYm9vbGVhbjonLCBgZGF0YWAKLQlyZXR1cm4gY2hyKGRhdGEpCi0JCisgICAgcHJpbnQgJ1hYWFggYm9vbGVhbjonLCBgZGF0YWAKKyAgICByZXR1cm4gY2hyKGRhdGEpCisgICAgCiBkZWYgX2NvZGVfdGV4dChkYXRhLCBrZXkpOgotCXJldHVybiBkYXRhCi0JCisgICAgcmV0dXJuIGRhdGEKKyAgICAKIGRlZiBfY29kZV9jaGFyc2V0KGRhdGEsIGtleSk6Ci0JcmV0dXJuIGRhdGFbMF0gKyBkYXRhWzFdCi0JCisgICAgcmV0dXJuIGRhdGFbMF0gKyBkYXRhWzFdCisgICAgCiBkZWYgX2NvZGVfYXBwc3BlYyhkYXRhLCBrZXkpOgotCXJldHVybiBkYXRhWzBdICsgX2NvZGVfZGVmYXVsdChkYXRhWzFdKQotCQorICAgIHJldHVybiBkYXRhWzBdICsgX2NvZGVfZGVmYXVsdChkYXRhWzFdKQorICAgIAogX2RlY29kZXJfdGFibGUgPSB7Ci0JIkFyY2hpZUFsbCIgOiAoX2RlY29kZV9tdWx0aXN0ciAsIF9jb2RlX211bHRpc3RyKSwKLQkiVU1pY2hBbGwiIDogKF9kZWNvZGVfbXVsdGlzdHIgLCBfY29kZV9tdWx0aXN0ciksCi0JIkluZm9NYWNBbGwiIDogKF9kZWNvZGVfbXVsdGlzdHIgLCBfY29kZV9tdWx0aXN0ciksCi0JIkxpc3RGb250IiA6IChfZGVjb2RlX2ZvbnRyZWNvcmQgLCBfY29kZV9mb250cmVjb3JkKSwKLQkiU2NyZWVuRm9udCIgOiAoX2RlY29kZV9mb250cmVjb3JkICwgX2NvZGVfZm9udHJlY29yZCksCi0JIlByaW50ZXJGb250IiA6IChfZGVjb2RlX2ZvbnRyZWNvcmQgLCBfY29kZV9mb250cmVjb3JkKSwKLSMJIkRvd25sb2FkRm9sZGVyIiA6IChfZGVjb2RlX2ZpbGVzcGVjICwgX2NvZGVfZmlsZXNwZWMpLAotCSJTaWduYXR1cmUiOiAoX2RlY29kZV90ZXh0ICwgX2NvZGVfdGV4dCksCi0JIlBsYW4iIDogKF9kZWNvZGVfdGV4dCAsIF9jb2RlX3RleHQpLAotCSJNYWlsSGVhZGVycyIgOiAoX2RlY29kZV90ZXh0ICwgX2NvZGVfdGV4dCksCi0JIk5ld3NIZWFkZXJzIiA6IChfZGVjb2RlX3RleHQgLCBfY29kZV90ZXh0KSwKLSMJIk1hcHBpbmciIAotCSJDaGFyYWN0ZXJTZXQiIDogKF9kZWNvZGVfY2hhcnNldCAsIF9jb2RlX2NoYXJzZXQpLAotCSJIZWxwZXJcMjQ1IiA6IChfZGVjb2RlX2FwcHNwZWMgLCBfY29kZV9hcHBzcGVjKSwKLSMJIlNlcnZpY2VzIiA6IChfZGVjb2RlX3NlcnZpY2VzLCA/Pz8/KSwKLQkiTmV3TWFpbEZsYXNoSWNvbiIgOiAoX2RlY29kZV9ib29sZWFuICwgX2NvZGVfYm9vbGVhbiksCi0JIk5ld01haWxEaWFsb2ciIDogKF9kZWNvZGVfYm9vbGVhbiAsIF9jb2RlX2Jvb2xlYW4pLAotCSJOZXdNYWlsUGxheVNvdW5kIiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKLSMJIldlYkJhY2tncm91bmRDb2xvciIgOiBfZGVjb2RlX2NvbG9yLAotCSJOb1Byb3h5RG9tYWlucyIgOiAoX2RlY29kZV9tdWx0aXN0ciAsIF9jb2RlX211bHRpc3RyKSwKLQkiVXNlSFRUUFByb3h5IiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKLQkiVXNlR29waGVyUHJveHkiOiAoX2RlY29kZV9ib29sZWFuICwgX2NvZGVfYm9vbGVhbiksCi0JIlVzZUZUUFByb3h5IiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKLQkiVXNlUGFzc2l2ZUZUUCIgOiAoX2RlY29kZV9ib29sZWFuICwgX2NvZGVfYm9vbGVhbiksCisgICAgIkFyY2hpZUFsbCIgOiAoX2RlY29kZV9tdWx0aXN0ciAsIF9jb2RlX211bHRpc3RyKSwKKyAgICAiVU1pY2hBbGwiIDogKF9kZWNvZGVfbXVsdGlzdHIgLCBfY29kZV9tdWx0aXN0ciksCisgICAgIkluZm9NYWNBbGwiIDogKF9kZWNvZGVfbXVsdGlzdHIgLCBfY29kZV9tdWx0aXN0ciksCisgICAgIkxpc3RGb250IiA6IChfZGVjb2RlX2ZvbnRyZWNvcmQgLCBfY29kZV9mb250cmVjb3JkKSwKKyAgICAiU2NyZWVuRm9udCIgOiAoX2RlY29kZV9mb250cmVjb3JkICwgX2NvZGVfZm9udHJlY29yZCksCisgICAgIlByaW50ZXJGb250IiA6IChfZGVjb2RlX2ZvbnRyZWNvcmQgLCBfY29kZV9mb250cmVjb3JkKSwKKyMgICAiRG93bmxvYWRGb2xkZXIiIDogKF9kZWNvZGVfZmlsZXNwZWMgLCBfY29kZV9maWxlc3BlYyksCisgICAgIlNpZ25hdHVyZSI6IChfZGVjb2RlX3RleHQgLCBfY29kZV90ZXh0KSwKKyAgICAiUGxhbiIgOiAoX2RlY29kZV90ZXh0ICwgX2NvZGVfdGV4dCksCisgICAgIk1haWxIZWFkZXJzIiA6IChfZGVjb2RlX3RleHQgLCBfY29kZV90ZXh0KSwKKyAgICAiTmV3c0hlYWRlcnMiIDogKF9kZWNvZGVfdGV4dCAsIF9jb2RlX3RleHQpLAorIyAgICJNYXBwaW5nIiAKKyAgICAiQ2hhcmFjdGVyU2V0IiA6IChfZGVjb2RlX2NoYXJzZXQgLCBfY29kZV9jaGFyc2V0KSwKKyAgICAiSGVscGVyXDI0NSIgOiAoX2RlY29kZV9hcHBzcGVjICwgX2NvZGVfYXBwc3BlYyksCisjICAgIlNlcnZpY2VzIiA6IChfZGVjb2RlX3NlcnZpY2VzLCA/Pz8/KSwKKyAgICAiTmV3TWFpbEZsYXNoSWNvbiIgOiAoX2RlY29kZV9ib29sZWFuICwgX2NvZGVfYm9vbGVhbiksCisgICAgIk5ld01haWxEaWFsb2ciIDogKF9kZWNvZGVfYm9vbGVhbiAsIF9jb2RlX2Jvb2xlYW4pLAorICAgICJOZXdNYWlsUGxheVNvdW5kIiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKKyMgICAiV2ViQmFja2dyb3VuZENvbG9yIiA6IF9kZWNvZGVfY29sb3IsCisgICAgIk5vUHJveHlEb21haW5zIiA6IChfZGVjb2RlX211bHRpc3RyICwgX2NvZGVfbXVsdGlzdHIpLAorICAgICJVc2VIVFRQUHJveHkiIDogKF9kZWNvZGVfYm9vbGVhbiAsIF9jb2RlX2Jvb2xlYW4pLAorICAgICJVc2VHb3BoZXJQcm94eSI6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKKyAgICAiVXNlRlRQUHJveHkiIDogKF9kZWNvZGVfYm9vbGVhbiAsIF9jb2RlX2Jvb2xlYW4pLAorICAgICJVc2VQYXNzaXZlRlRQIiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKIH0KIAogZGVmIF9kZWNvZGUoZGF0YSwga2V5KToKLQlpZiAnXDI0NScgaW4ga2V5OgotCQlrZXkyID0ga2V5WzpzdHJpbmcuaW5kZXgoa2V5LCAnXDI0NScpKzFdCi0JZWxzZToKLQkJa2V5MiA9IGtleQotCWlmIF9kZWNvZGVyX3RhYmxlLmhhc19rZXkoa2V5Mik6Ci0JCWRlY29kZXIgPSBfZGVjb2Rlcl90YWJsZVtrZXkyXVswXQotCWVsc2U6Ci0JCWRlY29kZXIgPSBfZGVjb2RlX2RlZmF1bHQKLQlyZXR1cm4gZGVjb2RlcihkYXRhLCBrZXkpCisgICAgaWYgJ1wyNDUnIGluIGtleToKKyAgICAgICAga2V5MiA9IGtleVs6c3RyaW5nLmluZGV4KGtleSwgJ1wyNDUnKSsxXQorICAgIGVsc2U6CisgICAgICAgIGtleTIgPSBrZXkKKyAgICBpZiBfZGVjb2Rlcl90YWJsZS5oYXNfa2V5KGtleTIpOgorICAgICAgICBkZWNvZGVyID0gX2RlY29kZXJfdGFibGVba2V5Ml1bMF0KKyAgICBlbHNlOgorICAgICAgICBkZWNvZGVyID0gX2RlY29kZV9kZWZhdWx0CisgICAgcmV0dXJuIGRlY29kZXIoZGF0YSwga2V5KQogCiBkZWYgX2NvZGUoZGF0YSwga2V5KToKLQlpZiB0eXBlKGRhdGEpID09IF9JQ09wYXF1ZURhdGFUeXBlOgotCQlyZXR1cm4gZGF0YS5kYXRhCi0JaWYgJ1wyNDUnIGluIGtleToKLQkJa2V5MiA9IGtleVs6c3RyaW5nLmluZGV4KGtleSwgJ1wyNDUnKSsxXQotCWVsc2U6Ci0JCWtleTIgPSBrZXkKLQlpZiBfZGVjb2Rlcl90YWJsZS5oYXNfa2V5KGtleTIpOgotCQljb2RlciA9IF9kZWNvZGVyX3RhYmxlW2tleTJdWzFdCi0JZWxzZToKLQkJY29kZXIgPSBfY29kZV9kZWZhdWx0Ci0JcmV0dXJuIGNvZGVyKGRhdGEsIGtleSkKLQkKKyAgICBpZiB0eXBlKGRhdGEpID09IF9JQ09wYXF1ZURhdGFUeXBlOgorICAgICAgICByZXR1cm4gZGF0YS5kYXRhCisgICAgaWYgJ1wyNDUnIGluIGtleToKKyAgICAgICAga2V5MiA9IGtleVs6c3RyaW5nLmluZGV4KGtleSwgJ1wyNDUnKSsxXQorICAgIGVsc2U6CisgICAgICAgIGtleTIgPSBrZXkKKyAgICBpZiBfZGVjb2Rlcl90YWJsZS5oYXNfa2V5KGtleTIpOgorICAgICAgICBjb2RlciA9IF9kZWNvZGVyX3RhYmxlW2tleTJdWzFdCisgICAgZWxzZToKKyAgICAgICAgY29kZXIgPSBfY29kZV9kZWZhdWx0CisgICAgcmV0dXJuIGNvZGVyKGRhdGEsIGtleSkKKyAgICAKIGNsYXNzIElDOgotCWRlZiBfX2luaXRfXyhzZWxmLCBzaWduYXR1cmU9J1B5dGgnLCBpYz1Ob25lKToKLQkJaWYgaWM6Ci0JCQlzZWxmLmljID0gaWMKLQkJZWxzZToKLQkJCXNlbGYuaWMgPSBpY2dsdWUuSUNTdGFydChzaWduYXR1cmUpCi0JCQlpZiBoYXNhdHRyKHNlbGYuaWMsICdJQ0ZpbmRDb25maWdGaWxlJyk6Ci0JCQkJc2VsZi5pYy5JQ0ZpbmRDb25maWdGaWxlKCkKLQkJc2VsZi5oID0gUmVzLlJlc291cmNlKCcnKQotCQkJCi0JZGVmIGtleXMoc2VsZik6Ci0JCXJ2ID0gW10KLQkJc2VsZi5pYy5JQ0JlZ2luKGljUmVhZE9ubHlQZXJtKQotCQludW0gPSBzZWxmLmljLklDQ291bnRQcmVmKCkKLQkJZm9yIGkgaW4gcmFuZ2UobnVtKToKLQkJCXJ2LmFwcGVuZChzZWxmLmljLklDR2V0SW5kUHJlZihpKzEpKQotCQlzZWxmLmljLklDRW5kKCkKLQkJcmV0dXJuIHJ2Ci0JCQotCWRlZiBoYXNfa2V5KHNlbGYsIGtleSk6Ci0JCXJldHVybiBzZWxmLl9fY29udGFpbnNfXyhrZXkpCi0JCQotCWRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKLQkJdHJ5OgotCQkJZHVtbXkgPSBzZWxmLmljLklDRmluZFByZWZIYW5kbGUoa2V5LCBzZWxmLmgpCi0JCWV4Y2VwdCBpY2dsdWUuZXJyb3I6Ci0JCQlyZXR1cm4gMAotCQlyZXR1cm4gMQotCQkKLQlkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKLQkJYXR0ciA9IHNlbGYuaWMuSUNGaW5kUHJlZkhhbmRsZShrZXksIHNlbGYuaCkKLQkJcmV0dXJuIF9kZWNvZGUoc2VsZi5oLmRhdGEsIGtleSkKLQkJCi0JZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgotCQl2YWx1ZSA9IF9jb2RlKHZhbHVlLCBrZXkpCi0JCXNlbGYuaWMuSUNTZXRQcmVmKGtleSwgSUNhdHRyX25vX2NoYW5nZSwgdmFsdWUpCi0JCQotCWRlZiBsYXVuY2h1cmwoc2VsZiwgdXJsLCBoaW50PSIiKToKLQkJIyBXb3JrIGFyb3VuZCBhIGJ1ZyBpbiBJQ0xhdW5jaFVSTDogZmlsZTovZm9vIGRvZXMKLQkJIyBub3Qgd29yayBidXQgZmlsZTovLy9mb28gZG9lcy4KLQkJaWYgdXJsWzo2XSA9PSAnZmlsZTovJyBhbmQgdXJsWzZdICE9ICcvJzoKLQkJCXVybCA9ICdmaWxlOi8vLycgKyB1cmxbNjpdCi0JCXNlbGYuaWMuSUNMYXVuY2hVUkwoaGludCwgdXJsLCAwLCBsZW4odXJsKSkKLQkJCi0JZGVmIHBhcnNldXJsKHNlbGYsIGRhdGEsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lLCBoaW50PSIiKToKLQkJaWYgc3RhcnQgPT0gTm9uZToKLQkJCXNlbFN0YXJ0ID0gMAotCQkJc2VsRW5kID0gbGVuKGRhdGEpCi0JCWVsc2U6Ci0JCQlzZWxTdGFydCA9IHNlbEVuZCA9IHN0YXJ0Ci0JCWlmIGVuZCAhPSBOb25lOgotCQkJc2VsRW5kID0gZW5kCi0JCXNlbFN0YXJ0LCBzZWxFbmQgPSBzZWxmLmljLklDUGFyc2VVUkwoaGludCwgZGF0YSwgc2VsU3RhcnQsIHNlbEVuZCwgc2VsZi5oKQotCQlyZXR1cm4gc2VsZi5oLmRhdGEsIHNlbFN0YXJ0LCBzZWxFbmQKLQkJCi0JZGVmIG1hcGZpbGUoc2VsZiwgZmlsZSk6Ci0JCWlmIHR5cGUoZmlsZSkgIT0gdHlwZSgnJyk6Ci0JCQlmaWxlID0gZmlsZS5hc190dXBsZSgpWzJdCi0JCXJldHVybiBzZWxmLmljLklDTWFwRmlsZW5hbWUoZmlsZSkKLQkJCi0JZGVmIG1hcHR5cGVjcmVhdG9yKHNlbGYsIHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lPSIiKToKLQkJcmV0dXJuIHNlbGYuaWMuSUNNYXBUeXBlQ3JlYXRvcih0eXBlLCBjcmVhdG9yLCBmaWxlbmFtZSkKLQkJCi0JZGVmIHNldHR5cGVjcmVhdG9yKHNlbGYsIGZpbGUpOgotCQlmaWxlID0gQ2FyYm9uLkZpbGUucGF0aG5hbWUoZmlsZSkKLQkJcmVjb3JkID0gc2VsZi5tYXBmaWxlKG9zLnBhdGguc3BsaXQoZmlsZSlbMV0pCi0JCU1hY09TLlNldENyZWF0b3JBbmRUeXBlKGZpbGUsIHJlY29yZFsyXSwgcmVjb3JkWzFdKQotCQltYWNvc3Rvb2xzLnRvdWNoZWQoZnNzKQotCQkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2lnbmF0dXJlPSdQeXRoJywgaWM9Tm9uZSk6CisgICAgICAgIGlmIGljOgorICAgICAgICAgICAgc2VsZi5pYyA9IGljCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmljID0gaWNnbHVlLklDU3RhcnQoc2lnbmF0dXJlKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLmljLCAnSUNGaW5kQ29uZmlnRmlsZScpOgorICAgICAgICAgICAgICAgIHNlbGYuaWMuSUNGaW5kQ29uZmlnRmlsZSgpCisgICAgICAgIHNlbGYuaCA9IFJlcy5SZXNvdXJjZSgnJykKKyAgICAgICAgICAgIAorICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICBydiA9IFtdCisgICAgICAgIHNlbGYuaWMuSUNCZWdpbihpY1JlYWRPbmx5UGVybSkKKyAgICAgICAgbnVtID0gc2VsZi5pYy5JQ0NvdW50UHJlZigpCisgICAgICAgIGZvciBpIGluIHJhbmdlKG51bSk6CisgICAgICAgICAgICBydi5hcHBlbmQoc2VsZi5pYy5JQ0dldEluZFByZWYoaSsxKSkKKyAgICAgICAgc2VsZi5pYy5JQ0VuZCgpCisgICAgICAgIHJldHVybiBydgorICAgICAgICAKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NvbnRhaW5zX18oa2V5KQorICAgICAgICAKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGR1bW15ID0gc2VsZi5pYy5JQ0ZpbmRQcmVmSGFuZGxlKGtleSwgc2VsZi5oKQorICAgICAgICBleGNlcHQgaWNnbHVlLmVycm9yOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGF0dHIgPSBzZWxmLmljLklDRmluZFByZWZIYW5kbGUoa2V5LCBzZWxmLmgpCisgICAgICAgIHJldHVybiBfZGVjb2RlKHNlbGYuaC5kYXRhLCBrZXkpCisgICAgICAgIAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgdmFsdWUgPSBfY29kZSh2YWx1ZSwga2V5KQorICAgICAgICBzZWxmLmljLklDU2V0UHJlZihrZXksIElDYXR0cl9ub19jaGFuZ2UsIHZhbHVlKQorICAgICAgICAKKyAgICBkZWYgbGF1bmNodXJsKHNlbGYsIHVybCwgaGludD0iIik6CisgICAgICAgICMgV29yayBhcm91bmQgYSBidWcgaW4gSUNMYXVuY2hVUkw6IGZpbGU6L2ZvbyBkb2VzCisgICAgICAgICMgbm90IHdvcmsgYnV0IGZpbGU6Ly8vZm9vIGRvZXMuCisgICAgICAgIGlmIHVybFs6Nl0gPT0gJ2ZpbGU6LycgYW5kIHVybFs2XSAhPSAnLyc6CisgICAgICAgICAgICB1cmwgPSAnZmlsZTovLy8nICsgdXJsWzY6XQorICAgICAgICBzZWxmLmljLklDTGF1bmNoVVJMKGhpbnQsIHVybCwgMCwgbGVuKHVybCkpCisgICAgICAgIAorICAgIGRlZiBwYXJzZXVybChzZWxmLCBkYXRhLCBzdGFydD1Ob25lLCBlbmQ9Tm9uZSwgaGludD0iIik6CisgICAgICAgIGlmIHN0YXJ0ID09IE5vbmU6CisgICAgICAgICAgICBzZWxTdGFydCA9IDAKKyAgICAgICAgICAgIHNlbEVuZCA9IGxlbihkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsU3RhcnQgPSBzZWxFbmQgPSBzdGFydAorICAgICAgICBpZiBlbmQgIT0gTm9uZToKKyAgICAgICAgICAgIHNlbEVuZCA9IGVuZAorICAgICAgICBzZWxTdGFydCwgc2VsRW5kID0gc2VsZi5pYy5JQ1BhcnNlVVJMKGhpbnQsIGRhdGEsIHNlbFN0YXJ0LCBzZWxFbmQsIHNlbGYuaCkKKyAgICAgICAgcmV0dXJuIHNlbGYuaC5kYXRhLCBzZWxTdGFydCwgc2VsRW5kCisgICAgICAgIAorICAgIGRlZiBtYXBmaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICBpZiB0eXBlKGZpbGUpICE9IHR5cGUoJycpOgorICAgICAgICAgICAgZmlsZSA9IGZpbGUuYXNfdHVwbGUoKVsyXQorICAgICAgICByZXR1cm4gc2VsZi5pYy5JQ01hcEZpbGVuYW1lKGZpbGUpCisgICAgICAgIAorICAgIGRlZiBtYXB0eXBlY3JlYXRvcihzZWxmLCB0eXBlLCBjcmVhdG9yLCBmaWxlbmFtZT0iIik6CisgICAgICAgIHJldHVybiBzZWxmLmljLklDTWFwVHlwZUNyZWF0b3IodHlwZSwgY3JlYXRvciwgZmlsZW5hbWUpCisgICAgICAgIAorICAgIGRlZiBzZXR0eXBlY3JlYXRvcihzZWxmLCBmaWxlKToKKyAgICAgICAgZmlsZSA9IENhcmJvbi5GaWxlLnBhdGhuYW1lKGZpbGUpCisgICAgICAgIHJlY29yZCA9IHNlbGYubWFwZmlsZShvcy5wYXRoLnNwbGl0KGZpbGUpWzFdKQorICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShmaWxlLCByZWNvcmRbMl0sIHJlY29yZFsxXSkKKyAgICAgICAgbWFjb3N0b29scy50b3VjaGVkKGZzcykKKyAgICAgICAgCiAjIENvbnZlbmllbmNlIHJvdXRpbmVzCiBfZGZ0X2ljID0gTm9uZQogCiBkZWYgbGF1bmNodXJsKHVybCwgaGludD0iIik6Ci0JZ2xvYmFsIF9kZnRfaWMKLQlpZiBfZGZ0X2ljID09IE5vbmU6IF9kZnRfaWMgPSBJQygpCi0JcmV0dXJuIF9kZnRfaWMubGF1bmNodXJsKHVybCwgaGludCkKLQkKKyAgICBnbG9iYWwgX2RmdF9pYworICAgIGlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKKyAgICByZXR1cm4gX2RmdF9pYy5sYXVuY2h1cmwodXJsLCBoaW50KQorICAgIAogZGVmIHBhcnNldXJsKGRhdGEsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lLCBoaW50PSIiKToKLQlnbG9iYWwgX2RmdF9pYwotCWlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKLQlyZXR1cm4gX2RmdF9pYy5wYXJzZXVybChkYXRhLCBzdGFydCwgZW5kLCBoaW50KQotCQorICAgIGdsb2JhbCBfZGZ0X2ljCisgICAgaWYgX2RmdF9pYyA9PSBOb25lOiBfZGZ0X2ljID0gSUMoKQorICAgIHJldHVybiBfZGZ0X2ljLnBhcnNldXJsKGRhdGEsIHN0YXJ0LCBlbmQsIGhpbnQpCisgICAgCiBkZWYgbWFwZmlsZShmaWxlbmFtZSk6Ci0JZ2xvYmFsIF9kZnRfaWMKLQlpZiBfZGZ0X2ljID09IE5vbmU6IF9kZnRfaWMgPSBJQygpCi0JcmV0dXJuIF9kZnRfaWMubWFwZmlsZShmaWxlbmFtZSkKLQkKKyAgICBnbG9iYWwgX2RmdF9pYworICAgIGlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKKyAgICByZXR1cm4gX2RmdF9pYy5tYXBmaWxlKGZpbGVuYW1lKQorICAgIAogZGVmIG1hcHR5cGVjcmVhdG9yKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lPSIiKToKLQlnbG9iYWwgX2RmdF9pYwotCWlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKLQlyZXR1cm4gX2RmdF9pYy5tYXB0eXBlY3JlYXRvcih0eXBlLCBjcmVhdG9yLCBmaWxlbmFtZSkKLQkKKyAgICBnbG9iYWwgX2RmdF9pYworICAgIGlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKKyAgICByZXR1cm4gX2RmdF9pYy5tYXB0eXBlY3JlYXRvcih0eXBlLCBjcmVhdG9yLCBmaWxlbmFtZSkKKyAgICAKIGRlZiBzZXR0eXBlY3JlYXRvcihmaWxlKToKLQlnbG9iYWwgX2RmdF9pYwotCWlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKLQlyZXR1cm4gX2RmdF9pYy5zZXR0eXBlY3JlYXRvcihmaWxlKQotCQkKKyAgICBnbG9iYWwgX2RmdF9pYworICAgIGlmIF9kZnRfaWMgPT0gTm9uZTogX2RmdF9pYyA9IElDKCkKKyAgICByZXR1cm4gX2RmdF9pYy5zZXR0eXBlY3JlYXRvcihmaWxlKQorICAgICAgICAKIGRlZiBfdGVzdCgpOgotCWljID0gSUMoKQotCWZvciBrIGluIGljLmtleXMoKToKLQkJdHJ5OgotCQkJdiA9IGljW2tdCi0JCWV4Y2VwdCBlcnJvcjoKLQkJCXYgPSAnPz8/PycKLQkJcHJpbnQgaywgJ1x0JywgdgotCXN5cy5leGl0KDEpCi0JCisgICAgaWMgPSBJQygpCisgICAgZm9yIGsgaW4gaWMua2V5cygpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ID0gaWNba10KKyAgICAgICAgZXhjZXB0IGVycm9yOgorICAgICAgICAgICAgdiA9ICc/Pz8/JworICAgICAgICBwcmludCBrLCAnXHQnLCB2CisgICAgc3lzLmV4aXQoMSkKKyAgICAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JX3Rlc3QoKQotCQorICAgIF90ZXN0KCkKKyAgICAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9tYWNlcnJvcnMucHkgYi9MaWIvcGxhdC1tYWMvbWFjZXJyb3JzLnB5CmluZGV4IDMyZjAwYTEuLmNlMmExMTggMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy9tYWNlcnJvcnMucHkKKysrIGIvTGliL3BsYXQtbWFjL21hY2Vycm9ycy5weQpAQCAtMSwxODUyICsxLDE4NTIgQEAKLXN2VGVtcERpc2FibGUJPQktMzI3NjgJI3N2VGVtcERpc2FibGUKLXN2RGlzYWJsZWQJPQktMzI2NDAJI1Jlc2VydmUgcmFuZ2UgLTMyNjQwIHRvIC0zMjc2OCBmb3IgQXBwbGUgdGVtcCBkaXNhYmxlcy4KLWZvbnROb3RPdXRsaW5lRXJyCT0JLTMyNjE1CSNiaXRtYXAgZm9udCBwYXNzZWQgdG8gcm91dGluZSB0aGF0IGRvZXMgb3V0bGluZXMgb25seQota1VSTDY4a05vdFN1cHBvcnRlZEVycm9yCT0JLTMwNzg4CSNrVVJMNjhrTm90U3VwcG9ydGVkRXJyb3IKLWtVUkxBY2Nlc3NOb3RBdmFpbGFibGVFcnJvcgk9CS0zMDc4Nwkja1VSTEFjY2Vzc05vdEF2YWlsYWJsZUVycm9yCi1rVVJMSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvcgk9CS0zMDc4Ngkja1VSTEludmFsaWRDb25maWd1cmF0aW9uRXJyb3IKLWtVUkxFeHRlbnNpb25GYWlsdXJlRXJyb3IJPQktMzA3ODUJI2tVUkxFeHRlbnNpb25GYWlsdXJlRXJyb3IKLWtVUkxGaWxlRW1wdHlFcnJvcgk9CS0zMDc4Mwkja1VSTEZpbGVFbXB0eUVycm9yCi1rVVJMSW52YWxpZENhbGxFcnJvcgk9CS0zMDc4MQkja1VSTEludmFsaWRDYWxsRXJyb3IKLWtVUkxVbnNldHRhYmxlUHJvcGVydHlFcnJvcgk9CS0zMDc4MAkja1VSTFVuc2V0dGFibGVQcm9wZXJ0eUVycm9yCi1rVVJMUHJvcGVydHlCdWZmZXJUb29TbWFsbEVycm9yCT0JLTMwNzc5CSNrVVJMUHJvcGVydHlCdWZmZXJUb29TbWFsbEVycm9yCi1rVVJMVW5rbm93blByb3BlcnR5RXJyb3IJPQktMzA3NzgJI2tVUkxVbmtub3duUHJvcGVydHlFcnJvcgota1VSTFByb3BlcnR5Tm90WWV0S25vd25FcnJvcgk9CS0zMDc3Nwkja1VSTFByb3BlcnR5Tm90WWV0S25vd25FcnJvcgota1VSTEF1dGhlbnRpY2F0aW9uRXJyb3IJPQktMzA3NzYJI2tVUkxBdXRoZW50aWNhdGlvbkVycm9yCi1rVVJMU2VydmVyQnVzeUVycm9yCT0JLTMwNzc1CSNrVVJMU2VydmVyQnVzeUVycm9yCi1rVVJMVW5zdXBwb3J0ZWRTY2hlbWVFcnJvcgk9CS0zMDc3NAkja1VSTFVuc3VwcG9ydGVkU2NoZW1lRXJyb3IKLWtVUkxJbnZhbGlkVVJMRXJyb3IJPQktMzA3NzMJI2tVUkxJbnZhbGlkVVJMRXJyb3IKLWtVUkxEZXN0aW5hdGlvbkV4aXN0c0Vycm9yCT0JLTMwNzcyCSNrVVJMRGVzdGluYXRpb25FeGlzdHNFcnJvcgota1VSTFByb2dyZXNzQWxyZWFkeURpc3BsYXllZEVycm9yCT0JLTMwNzcxCSNrVVJMUHJvZ3Jlc3NBbHJlYWR5RGlzcGxheWVkRXJyb3IKLWtVUkxJbnZhbGlkVVJMUmVmZXJlbmNlRXJyb3IJPQktMzA3NzAJI2tVUkxJbnZhbGlkVVJMUmVmZXJlbmNlRXJyb3IKLWNvbnRyb2xIYW5kbGVJbnZhbGlkRXJyCT0JLTMwNTk5CSNjb250cm9sSGFuZGxlSW52YWxpZEVycgotY29udHJvbEludmFsaWREYXRhVmVyc2lvbkVycgk9CS0zMDU5NwkjY29udHJvbEludmFsaWREYXRhVmVyc2lvbkVycgotZXJySXRlbU5vdENvbnRyb2wJPQktMzA1OTYJI2Vyckl0ZW1Ob3RDb250cm9sCi1lcnJDYW50RW1iZWRSb290CT0JLTMwNTk1CSNlcnJDYW50RW1iZWRSb290Ci1lcnJDYW50RW1iZWRJbnRvU2VsZgk9CS0zMDU5NAkjZXJyQ2FudEVtYmVkSW50b1NlbGYKLWVycldpbmRvd1JlZ2lvbkNvZGVJbnZhbGlkCT0JLTMwNTkzCSNlcnJXaW5kb3dSZWdpb25Db2RlSW52YWxpZAotZXJyQ29udHJvbEhpZGRlbk9yRGlzYWJsZWQJPQktMzA1OTIJI2VyckNvbnRyb2xIaWRkZW5PckRpc2FibGVkCi1lcnJEYXRhU2l6ZU1pc21hdGNoCT0JLTMwNTkxCSNlcnJEYXRhU2l6ZU1pc21hdGNoCi1lcnJDb250cm9sSXNOb3RFbWJlZGRlcgk9CS0zMDU5MAkjZXJyQ29udHJvbElzTm90RW1iZWRkZXIKLWVyckNvbnRyb2xzQWxyZWFkeUV4aXN0CT0JLTMwNTg5CSNlcnJDb250cm9sc0FscmVhZHlFeGlzdAotZXJySW52YWxpZFBhcnRDb2RlCT0JLTMwNTg4CSNlcnJJbnZhbGlkUGFydENvZGUKLWVyclJvb3RBbHJlYWR5RXhpc3RzCT0JLTMwNTg3CSNlcnJSb290QWxyZWFkeUV4aXN0cwotZXJyTm9Sb290Q29udHJvbAk9CS0zMDU4NgkjZXJyTm9Sb290Q29udHJvbAotZXJyQ291bGRudFNldEZvY3VzCT0JLTMwNTg1CSNlcnJDb3VsZG50U2V0Rm9jdXMKLWVyclVua25vd25Db250cm9sCT0JLTMwNTg0CSNlcnJVbmtub3duQ29udHJvbAotZXJyV2luZG93RG9lc250U3VwcG9ydEZvY3VzCT0JLTMwNTgzCSNlcnJXaW5kb3dEb2VzbnRTdXBwb3J0Rm9jdXMKLWVyckNvbnRyb2xEb2VzbnRTdXBwb3J0Rm9jdXMJPQktMzA1ODIJI2VyckNvbnRyb2xEb2VzbnRTdXBwb3J0Rm9jdXMKLWVyckRhdGFOb3RTdXBwb3J0ZWQJPQktMzA1ODEJI2VyckRhdGFOb3RTdXBwb3J0ZWQKLWVyck1lc3NhZ2VOb3RTdXBwb3J0ZWQJPQktMzA1ODAJI2Vyck1lc3NhZ2VOb3RTdXBwb3J0ZWQKLXRoZW1lTW9uaXRvckRlcHRoTm90U3VwcG9ydGVkRXJyCT0JLTMwNTY3CSN0aGVtZSBub3Qgc3VwcG9ydGVkIGF0IG1vbml0b3IgZGVwdGgKLXRoZW1lU2NyaXB0Rm9udE5vdEZvdW5kRXJyCT0JLTMwNTY2CSN0aGVtZSBmb250IHJlcXVlc3RlZCBmb3IgdW5pbnN0YWxsZWQgc2NyaXB0IHN5c3RlbQotdGhlbWVCYWRDdXJzb3JJbmRleEVycgk9CS0zMDU2NQkjdGhlbWVCYWRDdXJzb3JJbmRleEVycgotdGhlbWVIYXNOb0FjY2VudHNFcnIJPQktMzA1NjQJI3RoZW1lSGFzTm9BY2NlbnRzRXJyCi10aGVtZUJhZFRleHRDb2xvckVycgk9CS0zMDU2MwkjdGhlbWVCYWRUZXh0Q29sb3JFcnIKLXRoZW1lUHJvY2Vzc05vdFJlZ2lzdGVyZWRFcnIJPQktMzA1NjIJI3RoZW1lUHJvY2Vzc05vdFJlZ2lzdGVyZWRFcnIKLXRoZW1lUHJvY2Vzc1JlZ2lzdGVyZWRFcnIJPQktMzA1NjEJI3RoZW1lUHJvY2Vzc1JlZ2lzdGVyZWRFcnIKLXRoZW1lSW52YWxpZEJydXNoRXJyCT0JLTMwNTYwCSNwYXR0ZXJuIGluZGV4IGludmFsaWQKLXF0dnJVbmluaXRpYWxpemVkCT0JLTMwNTU1CSNxdHZyVW5pbml0aWFsaXplZAotcXR2ckxpYnJhcnlMb2FkRXJyCT0JLTMwNTU0CSNxdHZyTGlicmFyeUxvYWRFcnIKLXN0cmVhbWluZ05vZGVOb3RSZWFkeUVycgk9CS0zMDU1Mwkjc3RyZWFtaW5nTm9kZU5vdFJlYWR5RXJyCi1ub01lbW9yeU5vZGVGYWlsZWRJbml0aWFsaXplCT0JLTMwNTUyCSNub01lbW9yeU5vZGVGYWlsZWRJbml0aWFsaXplCi1pbnZhbGlkSG90U3BvdElERXJyCT0JLTMwNTUxCSNpbnZhbGlkSG90U3BvdElERXJyCi1pbnZhbGlkTm9kZUZvcm1hdEVycgk9CS0zMDU1MAkjaW52YWxpZE5vZGVGb3JtYXRFcnIKLWxpbWl0UmVhY2hlZEVycgk9CS0zMDU0OQkjbGltaXRSZWFjaGVkRXJyCi1zZXR0aW5nTm90U3VwcG9ydGVkQnlOb2RlRXJyCT0JLTMwNTQ4CSNzZXR0aW5nTm90U3VwcG9ydGVkQnlOb2RlRXJyCi1wcm9wZXJ0eU5vdFN1cHBvcnRlZEJ5Tm9kZUVycgk9CS0zMDU0NwkjcHJvcGVydHlOb3RTdXBwb3J0ZWRCeU5vZGVFcnIKLXRpbWVOb3RJblZpZXdFcnIJPQktMzA1NDYJI3RpbWVOb3RJblZpZXdFcnIKLWludmFsaWRWaWV3U3RhdGVFcnIJPQktMzA1NDUJI2ludmFsaWRWaWV3U3RhdGVFcnIKLWludmFsaWROb2RlSURFcnIJPQktMzA1NDQJI2ludmFsaWROb2RlSURFcnIKLXNlbGVjdG9yTm90U3VwcG9ydGVkQnlOb2RlRXJyCT0JLTMwNTQzCSNzZWxlY3Rvck5vdFN1cHBvcnRlZEJ5Tm9kZUVycgotY2FsbE5vdFN1cHBvcnRlZEJ5Tm9kZUVycgk9CS0zMDU0MgkjY2FsbE5vdFN1cHBvcnRlZEJ5Tm9kZUVycgotY29uc3RyYWludFJlYWNoZWRFcnIJPQktMzA1NDEJI2NvbnN0cmFpbnRSZWFjaGVkRXJyCi1ub3RBUVRWUk1vdmllRXJyCT0JLTMwNTQwCSNub3RBUVRWUk1vdmllRXJyCi1rRkJDbm9TdWNoSGl0CT0JLTMwNTMyCSNrRkJDbm9TdWNoSGl0Ci1rRkJDYmFkU2VhcmNoU2Vzc2lvbgk9CS0zMDUzMQkja0ZCQ2JhZFNlYXJjaFNlc3Npb24KLWtGQkNpbmRleERpc2tJT0ZhaWxlZAk9CS0zMDUzMAkja0ZCQ2luZGV4RGlza0lPRmFpbGVkCi1rRkJDc3VtbWFyaXphdGlvbkNhbmNlbGVkCT0JLTMwNTI5CSNrRkJDc3VtbWFyaXphdGlvbkNhbmNlbGVkCi1rRkJDYmFkSW5kZXhGaWxlVmVyc2lvbgk9CS0zMDUyOAkja0ZCQ2JhZEluZGV4RmlsZVZlcnNpb24KLWtGQkNhbmFseXNpc05vdEF2YWlsYWJsZQk9CS0zMDUyNwkja0ZCQ2FuYWx5c2lzTm90QXZhaWxhYmxlCi1rRkJDaWxsZWdhbFNlc3Npb25DaGFuZ2UJPQktMzA1MjYJI3RyaWVkIHRvIGFkZC9yZW1vdmUgdm9scyB0byBhIHNlc3Npb24KLWtGQkNzb21lRmlsZXNOb3RJbmRleGVkCT0JLTMwNTI1CSNrRkJDc29tZUZpbGVzTm90SW5kZXhlZAota0ZCQ3NlYXJjaEZhaWxlZAk9CS0zMDUyNAkja0ZCQ3NlYXJjaEZhaWxlZAota0ZCQ2luZGV4Tm90QXZhaWxhYmxlCT0JLTMwNTIzCSNrRkJDaW5kZXhOb3RBdmFpbGFibGUKLWtGQkNpbmRleEZpbGVEZXN0cm95ZWQJPQktMzA1MjIJI2tGQkNpbmRleEZpbGVEZXN0cm95ZWQKLWtGQkNhY2Nlc3NDYW5jZWxlZAk9CS0zMDUyMQkja0ZCQ2FjY2Vzc0NhbmNlbGVkCi1rRkJDaW5kZXhpbmdDYW5jZWxlZAk9CS0zMDUyMAkja0ZCQ2luZGV4aW5nQ2FuY2VsZWQKLWtGQkNub1NlYXJjaFNlc3Npb24JPQktMzA1MTkJI2tGQkNub1NlYXJjaFNlc3Npb24KLWtGQkNpbmRleE5vdEZvdW5kCT0JLTMwNTE4CSNrRkJDaW5kZXhOb3RGb3VuZAota0ZCQ2ZsdXNoRmFpbGVkCT0JLTMwNTE3CSNrRkJDZmx1c2hGYWlsZWQKLWtGQkNhZGREb2NGYWlsZWQJPQktMzA1MTYJI2tGQkNhZGREb2NGYWlsZWQKLWtGQkNhY2Nlc3NvclN0b3JlRmFpbGVkCT0JLTMwNTE1CSNrRkJDYWNjZXNzb3JTdG9yZUZhaWxlZAota0ZCQ2luZGV4Q3JlYXRpb25GYWlsZWQJPQktMzA1MTQJI2NvdWxkbid0IGNyZWF0ZSBpbmRleAota0ZCQ21lcmdpbmdGYWlsZWQJPQktMzA1MTMJI2NvdWxkbid0IG1lcmdlIGluZGV4IGZpbGVzCi1rRkJDdG9rZW5pemF0aW9uRmFpbGVkCT0JLTMwNTEyCSNjb3VsZG4ndCByZWFkIGZyb20gZG9jdW1lbnQgb3IgcXVlcnkKLWtGQkNtb3ZlRmFpbGVkCT0JLTMwNTExCSNWLVR3aW4gZXhjZXB0aW9uIGNhdWdodAota0ZCQ2RlbGV0aW9uRmFpbGVkCT0JLTMwNTEwCSNWLVR3aW4gZXhjZXB0aW9uIGNhdWdodAota0ZCQ2NvbW1pdEZhaWxlZAk9CS0zMDUwOQkjVi1Ud2luIGV4Y2VwdGlvbiBjYXVnaHQKLWtGQkNpbmRleGluZ0ZhaWxlZAk9CS0zMDUwOAkjVi1Ud2luIGV4Y2VwdGlvbiBjYXVnaHQKLWtGQkN2YWxpZGF0aW9uRmFpbGVkCT0JLTMwNTA3CSNWLVR3aW4gZXhjZXB0aW9uIGNhdWdodAota0ZCQ2NvbXBhY3Rpb25GYWlsZWQJPQktMzA1MDYJI1YtVHdpbiBleGNlcHRpb24gY2F1Z2h0Ci1rRkJDYmFkSW5kZXhGaWxlCT0JLTMwNTA1CSNiYWQgRlNTcGVjLCBvciBiYWQgZGF0YSBpbiBmaWxlCi1rRkJDZmlsZU5vdEluZGV4ZWQJPQktMzA1MDQJI2tGQkNmaWxlTm90SW5kZXhlZAota0ZCQ2JhZFBhcmFtCT0JLTMwNTAzCSNrRkJDYmFkUGFyYW0KLWtGQkNhbGxvY0ZhaWxlZAk9CS0zMDUwMgkjcHJvYmFibHkgbG93IG1lbW9yeQota0ZCQ25vSW5kZXhlc0ZvdW5kCT0JLTMwNTAxCSNrRkJDbm9JbmRleGVzRm91bmQKLWtGQkN2VHdpbkV4Y2VwdGlvbkVycgk9CS0zMDUwMAkjbm8gdGVsbGluZyB3aGF0IGl0IHdhcwota0RTcFN0ZXJlb0NvbnRleHRFcnIJPQktMzA0NTAJI2tEU3BTdGVyZW9Db250ZXh0RXJyCi1rRFNwSW50ZXJuYWxFcnIJPQktMzA0NDkJI2tEU3BJbnRlcm5hbEVycgota0RTcENvbmZpcm1Td2l0Y2hXYXJuaW5nCT0JLTMwNDQ4CSNrRFNwQ29uZmlybVN3aXRjaFdhcm5pbmcKLWtEU3BGcmFtZVJhdGVOb3RSZWFkeUVycgk9CS0zMDQ0Nwkja0RTcEZyYW1lUmF0ZU5vdFJlYWR5RXJyCi1rRFNwQ29udGV4dE5vdEZvdW5kRXJyCT0JLTMwNDQ2CSNrRFNwQ29udGV4dE5vdEZvdW5kRXJyCi1rRFNwQ29udGV4dE5vdFJlc2VydmVkRXJyCT0JLTMwNDQ1CSNrRFNwQ29udGV4dE5vdFJlc2VydmVkRXJyCi1rRFNwQ29udGV4dEFscmVhZHlSZXNlcnZlZEVycgk9CS0zMDQ0NAkja0RTcENvbnRleHRBbHJlYWR5UmVzZXJ2ZWRFcnIKLWtEU3BJbnZhbGlkQXR0cmlidXRlc0Vycgk9CS0zMDQ0Mwkja0RTcEludmFsaWRBdHRyaWJ1dGVzRXJyCi1rRFNwSW52YWxpZENvbnRleHRFcnIJPQktMzA0NDIJI2tEU3BJbnZhbGlkQ29udGV4dEVycgota0RTcFN5c3RlbVNXVG9vT2xkRXJyCT0JLTMwNDQxCSNrRFNwU3lzdGVtU1dUb29PbGRFcnIKLWtEU3BOb3RJbml0aWFsaXplZEVycgk9CS0zMDQ0MAkja0RTcE5vdEluaXRpYWxpemVkRXJyCi1rSVNwTGlzdEJ1c3lFcnIJPQktMzA0MjkJI2tJU3BMaXN0QnVzeUVycgota0lTcERldmljZUFjdGl2ZUVycgk9CS0zMDQyOAkja0lTcERldmljZUFjdGl2ZUVycgota0lTcFN5c3RlbUFjdGl2ZUVycgk9CS0zMDQyNwkja0lTcFN5c3RlbUFjdGl2ZUVycgota0lTcERldmljZUluYWN0aXZlRXJyCT0JLTMwNDI2CSNrSVNwRGV2aWNlSW5hY3RpdmVFcnIKLWtJU3BTeXN0ZW1JbmFjdGl2ZUVycgk9CS0zMDQyNQkja0lTcFN5c3RlbUluYWN0aXZlRXJyCi1rSVNwRWxlbWVudE5vdEluTGlzdEVycgk9CS0zMDQyNAkja0lTcEVsZW1lbnROb3RJbkxpc3RFcnIKLWtJU3BFbGVtZW50SW5MaXN0RXJyCT0JLTMwNDIzCSNrSVNwRWxlbWVudEluTGlzdEVycgota0lTcEJ1ZmZlclRvU21hbGxFcnIJPQktMzA0MjIJI2tJU3BCdWZmZXJUb1NtYWxsRXJyCi1rSVNwU3lzdGVtTGlzdEVycgk9CS0zMDQyMQkja0lTcFN5c3RlbUxpc3RFcnIKLWtJU3BJbnRlcm5hbEVycgk9CS0zMDQyMAkja0lTcEludGVybmFsRXJyCi1rTlNwSm9pbkZhaWxlZEVycgk9CS0zMDM5OQkja05TcEpvaW5GYWlsZWRFcnIKLWtOU3BDYW50QmxvY2tFcnIJPQktMzAzOTgJI2tOU3BDYW50QmxvY2tFcnIKLWtOU3BNZXNzYWdlVG9vQmlnRXJyCT0JLTMwMzk3CSNrTlNwTWVzc2FnZVRvb0JpZ0Vycgota05TcFNlbmRGYWlsZWRFcnIJPQktMzAzOTYJI2tOU3BTZW5kRmFpbGVkRXJyCi1rTlNwQ29ubmVjdEZhaWxlZEVycgk9CS0zMDM5NQkja05TcENvbm5lY3RGYWlsZWRFcnIKLWtOU3BHYW1lVGVybWluYXRlZEVycgk9CS0zMDM5NAkja05TcEdhbWVUZXJtaW5hdGVkRXJyCi1rTlNwVGltZW91dEVycgk9CS0zMDM5Mwkja05TcFRpbWVvdXRFcnIKLWtOU3BJbnZhbGlkUHJvdG9jb2xMaXN0RXJyCT0JLTMwMzkyCSNrTlNwSW52YWxpZFByb3RvY29sTGlzdEVycgota05TcEludmFsaWRQcm90b2NvbFJlZkVycgk9CS0zMDM5MQkja05TcEludmFsaWRQcm90b2NvbFJlZkVycgota05TcEludmFsaWREZWZpbml0aW9uRXJyCT0JLTMwMzkwCSNrTlNwSW52YWxpZERlZmluaXRpb25FcnIKLWtOU3BBZGRQbGF5ZXJGYWlsZWRFcnIJPQktMzAzODkJI2tOU3BBZGRQbGF5ZXJGYWlsZWRFcnIKLWtOU3BDcmVhdGVHcm91cEZhaWxlZEVycgk9CS0zMDM4OAkja05TcENyZWF0ZUdyb3VwRmFpbGVkRXJyCi1rTlNwTm9Ib3N0Vm9sdW50ZWVyc0Vycgk9CS0zMDM4Nwkja05TcE5vSG9zdFZvbHVudGVlcnNFcnIKLWtOU3BOb0dyb3Vwc0Vycgk9CS0zMDM4Ngkja05TcE5vR3JvdXBzRXJyCi1rTlNwTm9QbGF5ZXJzRXJyCT0JLTMwMzg1CSNrTlNwTm9QbGF5ZXJzRXJyCi1rTlNwSW52YWxpZEdyb3VwSURFcnIJPQktMzAzODQJI2tOU3BJbnZhbGlkR3JvdXBJREVycgota05TcEludmFsaWRQbGF5ZXJJREVycgk9CS0zMDM4Mwkja05TcEludmFsaWRQbGF5ZXJJREVycgota05TcE5hbWVSZXF1aXJlZEVycgk9CS0zMDM4Mgkja05TcE5hbWVSZXF1aXJlZEVycgota05TcEZlYXR1cmVOb3RJbXBsZW1lbnRlZEVycgk9CS0zMDM4MQkja05TcEZlYXR1cmVOb3RJbXBsZW1lbnRlZEVycgota05TcEFkZHJlc3NJblVzZUVycgk9CS0zMDM4MAkja05TcEFkZHJlc3NJblVzZUVycgota05TcFJlbW92ZVBsYXllckZhaWxlZEVycgk9CS0zMDM3OQkja05TcFJlbW92ZVBsYXllckZhaWxlZEVycgota05TcEZyZWVRRXhoYXVzdGVkRXJyCT0JLTMwMzc4CSNrTlNwRnJlZVFFeGhhdXN0ZWRFcnIKLWtOU3BJbnZhbGlkQWRkcmVzc0Vycgk9CS0zMDM3Nwkja05TcEludmFsaWRBZGRyZXNzRXJyCi1rTlNwTm90QWR2ZXJ0aXNpbmdFcnIJPQktMzAzNzYJI2tOU3BOb3RBZHZlcnRpc2luZ0Vycgota05TcEFscmVhZHlBZHZlcnRpc2luZ0Vycgk9CS0zMDM3NAkja05TcEFscmVhZHlBZHZlcnRpc2luZ0Vycgota05TcE1lbUFsbG9jYXRpb25FcnIJPQktMzAzNzMJI2tOU3BNZW1BbGxvY2F0aW9uRXJyCi1rTlNwT1RWZXJzaW9uVG9vT2xkRXJyCT0JLTMwMzcxCSNrTlNwT1RWZXJzaW9uVG9vT2xkRXJyCi1rTlNwT1ROb3RQcmVzZW50RXJyCT0JLTMwMzcwCSNrTlNwT1ROb3RQcmVzZW50RXJyCi1rTlNwSW52YWxpZFBhcmFtZXRlckVycgk9CS0zMDM2OQkja05TcEludmFsaWRQYXJhbWV0ZXJFcnIKLWtOU3BJbnZhbGlkR2FtZVJlZkVycgk9CS0zMDM2Nwkja05TcEludmFsaWRHYW1lUmVmRXJyCi1rTlNwUHJvdG9jb2xOb3RBdmFpbGFibGVFcnIJPQktMzAzNjYJI2tOU3BQcm90b2NvbE5vdEF2YWlsYWJsZUVycgota05TcEhvc3RGYWlsZWRFcnIJPQktMzAzNjUJI2tOU3BIb3N0RmFpbGVkRXJyCi1rTlNwUGlwZUZ1bGxFcnIJPQktMzAzNjQJI2tOU3BQaXBlRnVsbEVycgota05TcFRvcG9sb2d5Tm90U3VwcG9ydGVkRXJyCT0JLTMwMzYyCSNrTlNwVG9wb2xvZ3lOb3RTdXBwb3J0ZWRFcnIKLWtOU3BBbHJlYWR5SW5pdGlhbGl6ZWRFcnIJPQktMzAzNjEJI2tOU3BBbHJlYWR5SW5pdGlhbGl6ZWRFcnIKLWtOU3BJbml0aWFsaXphdGlvbkZhaWxlZEVycgk9CS0zMDM2MAkja05TcEluaXRpYWxpemF0aW9uRmFpbGVkRXJyCi1rU1NwU2NhbGVUb1plcm9FcnIJPQktMzAzNDQJI2tTU3BTY2FsZVRvWmVyb0Vycgota1NTcFBhcmFsbGVsVXBWZWN0b3JFcnIJPQktMzAzNDMJI2tTU3BQYXJhbGxlbFVwVmVjdG9yRXJyCi1rU1NwQ2FudEluc3RhbGxFcnIJPQktMzAzNDIJI2tTU3BDYW50SW5zdGFsbEVycgota1NTcFZlcnNpb25FcnIJPQktMzAzNDEJI2tTU3BWZXJzaW9uRXJyCi1rU1NwSW50ZXJuYWxFcnIJPQktMzAzNDAJI2tTU3BJbnRlcm5hbEVycgota0FMTUludGVybmFsRXJyCT0JLTMwMDQ5CSNrQUxNSW50ZXJuYWxFcnIKLWtBTE1Hcm91cE5vdEZvdW5kRXJyCT0JLTMwMDQ4CSNrQUxNR3JvdXBOb3RGb3VuZEVycgota0FMTU5vU3VjaE1vZHVsZUVycgk9CS0zMDA0Nwkja0FMTU5vU3VjaE1vZHVsZUVycgota0FMTU1vZHVsZUNvbW11bmljYXRpb25FcnIJPQktMzAwNDYJI2tBTE1Nb2R1bGVDb21tdW5pY2F0aW9uRXJyCi1rQUxNRHVwbGljYXRlTW9kdWxlRXJyCT0JLTMwMDQ1CSNrQUxNRHVwbGljYXRlTW9kdWxlRXJyCi1rQUxNSW5zdGFsbGF0aW9uRXJyCT0JLTMwMDQ0CSNrQUxNSW5zdGFsbGF0aW9uRXJyCi1rQUxNRGVmZXJTd2l0Y2hFcnIJPQktMzAwNDMJI2tBTE1EZWZlclN3aXRjaEVycgota0FMTVJlYm9vdEZsYWdzTGV2ZWxFcnIJPQktMzAwNDIJI2tBTE1SZWJvb3RGbGFnc0xldmVsRXJyCi1rTG9jYWxlc0RlZmF1bHREaXNwbGF5U3RhdHVzCT0JLTMwMDI5CSNSZXF1ZXN0ZWQgZGlzcGxheSBsb2NhbGUgdW5hdmFpbGFibGUsIHVzZWQgZGVmYXVsdAota0xvY2FsZXNUYWJsZUZvcm1hdEVycgk9CS0zMDAwMgkja0xvY2FsZXNUYWJsZUZvcm1hdEVycgota0xvY2FsZXNCdWZmZXJUb29TbWFsbEVycgk9CS0zMDAwMQkja0xvY2FsZXNCdWZmZXJUb29TbWFsbEVycgota0ZOU05hbWVOb3RGb3VuZEVycgk9CS0yOTU4OQkjVGhlIG5hbWUgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtdGVycyB3YXMgbm90IGZvdW5kCi1rRk5TQmFkRmxhdHRlbmVkU2l6ZUVycgk9CS0yOTU4NwkjZmxhdHRlbmVkIHNpemUgZGlkbid0IG1hdGNoIGlucHV0IG9yIHdhcyB0b28gc21hbGwKLWtGTlNJbnN1ZmZpY2llbnREYXRhRXJyCT0JLTI5NTg2CSNpbnN1ZmZpY2llbnQgZGF0YSBmb3IgdGhlIG9wZXJhdGlvbgota0ZOU01pc21hdGNoRXJyCT0JLTI5NTg1CSNyZWZlcmVuY2UgZGlkbid0IG1hdGNoIG9yIHdhc24ndCBmb3VuZCBpbiBwcm9maWxlCi1rRk5TRHVwbGljYXRlUmVmZXJlbmNlRXJyCT0JLTI5NTg0CSN0aGUgcmVmLiBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IGluIHRoZSBwcm9maWxlCi1rRk5TQmFkUHJvZmlsZVZlcnNpb25FcnIJPQktMjk1ODMJI3Byb2ZpbGUgdmVyc2lvbiBpcyBvdXQgb2Yga25vd24gcmFuZ2UKLWtGTlNJbnZhbGlkUHJvZmlsZUVycgk9CS0yOTU4MgkjcHJvZmlsZSBpcyBOVUxMIG9yIG90aGVyd2lzZSBiYWQKLWtGTlNCYWRSZWZlcmVuY2VWZXJzaW9uRXJyCT0JLTI5NTgxCSNyZWYuIHZlcnNpb24gaXMgb3V0IG9mIGtub3duIHJhbmdlCi1rRk5TSW52YWxpZFJlZmVyZW5jZUVycgk9CS0yOTU4MAkjcmVmLiB3YXMgTlVMTCBvciBvdGhlcndpc2UgYmFkCi1rQ29sbGF0ZUludmFsaWRDb2xsYXRpb25SZWYJPQktMjk1MDcJI2tDb2xsYXRlSW52YWxpZENvbGxhdGlvblJlZgota0NvbGxhdGVCdWZmZXJUb29TbWFsbAk9CS0yOTUwNgkja0NvbGxhdGVCdWZmZXJUb29TbWFsbAota0NvbGxhdGVJbnZhbGlkQ2hhcgk9CS0yOTUwNQkja0NvbGxhdGVJbnZhbGlkQ2hhcgota0NvbGxhdGVQYXR0ZXJuTm90Rm91bmRFcnIJPQktMjk1MDQJI2tDb2xsYXRlUGF0dGVybk5vdEZvdW5kRXJyCi1rQ29sbGF0ZVVuaWNvZGVDb252ZXJ0RmFpbGVkRXJyCT0JLTI5NTAzCSNrQ29sbGF0ZVVuaWNvZGVDb252ZXJ0RmFpbGVkRXJyCi1rQ29sbGF0ZU1pc3NpbmdVbmljb2RlVGFibGVFcnIJPQktMjk1MDIJI2tDb2xsYXRlTWlzc2luZ1VuaWNvZGVUYWJsZUVycgota0NvbGxhdGVJbnZhbGlkT3B0aW9ucwk9CS0yOTUwMQkja0NvbGxhdGVJbnZhbGlkT3B0aW9ucwota0NvbGxhdGVBdHRyaWJ1dGVzTm90Rm91bmRFcnIJPQktMjk1MDAJI2tDb2xsYXRlQXR0cmlidXRlc05vdEZvdW5kRXJyCi1rTVBJbnZhbGlkSURFcnIJPQktMjkyOTkJI2tNUEludmFsaWRJREVycgota01QSW5zdWZmaWNpZW50UmVzb3VyY2VzRXJyCT0JLTI5Mjk4CSNrTVBJbnN1ZmZpY2llbnRSZXNvdXJjZXNFcnIKLWtNUFRhc2tBYm9ydGVkRXJyCT0JLTI5Mjk3CSNrTVBUYXNrQWJvcnRlZEVycgota01QVGltZW91dEVycgk9CS0yOTI5Ngkja01QVGltZW91dEVycgota01QRGVsZXRlZEVycgk9CS0yOTI5NQkja01QRGVsZXRlZEVycgota01QQmx1ZUJsb2NraW5nRXJyCT0JLTI5MjkzCSNrTVBCbHVlQmxvY2tpbmdFcnIKLWtNUFRhc2tTdG9wcGVkRXJyCT0JLTI5MjkyCSNBIGNvbnZlbnRpb24gdXNlZCB3aXRoIE1QVGhyb3dFeGNlcHRpb24uCi1rTVBUYXNrQmxvY2tlZEVycgk9CS0yOTI5MQkja01QVGFza0Jsb2NrZWRFcnIKLWtNUFRhc2tDcmVhdGVkRXJyCT0JLTI5MjkwCSNrTVBUYXNrQ3JlYXRlZEVycgota01QUHJvY2Vzc1Rlcm1pbmF0ZWRFcnIJPQktMjkyODkJI2tNUFByb2Nlc3NUZXJtaW5hdGVkRXJyCi1rTVBQcm9jZXNzQ3JlYXRlZEVycgk9CS0yOTI4OAkja01QUHJvY2Vzc0NyZWF0ZWRFcnIKLWtNUFByaXZpbGVnZWRFcnIJPQktMjkyNzYJI2tNUFByaXZpbGVnZWRFcnIKLWtNUEl0ZXJhdGlvbkVuZEVycgk9CS0yOTI3NQkja01QSXRlcmF0aW9uRW5kRXJyCi1rVUNUZXh0QnJlYWtMb2NhdG9yTWlzc2luZ1R5cGUJPQktMjUzNDEJI1VuaWNvZGUgdGV4dCBicmVhayBlcnJvcgota1VDT3V0cHV0QnVmZmVyVG9vU21hbGwJPQktMjUzNDAJI091dHB1dCBidWZmZXIgdG9vIHNtYWxsIGZvciBVbmljb2RlIHN0cmluZyByZXN1bHQKLWVycktDQ3JlYXRlQ2hhaW5GYWlsZWQJPQktMjUzMTgJI2VycktDQ3JlYXRlQ2hhaW5GYWlsZWQKLWVycktDRGF0YU5vdE1vZGlmaWFibGUJPQktMjUzMTcJI2VycktDRGF0YU5vdE1vZGlmaWFibGUKLWVycktDRGF0YU5vdEF2YWlsYWJsZQk9CS0yNTMxNgkjZXJyS0NEYXRhTm90QXZhaWxhYmxlCi1lcnJLQ0ludGVyYWN0aW9uUmVxdWlyZWQJPQktMjUzMTUJI2VycktDSW50ZXJhY3Rpb25SZXF1aXJlZAotZXJyS0NOb1BvbGljeU1vZHVsZQk9CS0yNTMxNAkjZXJyS0NOb1BvbGljeU1vZHVsZQotZXJyS0NOb0NlcnRpZmljYXRlTW9kdWxlCT0JLTI1MzEzCSNlcnJLQ05vQ2VydGlmaWNhdGVNb2R1bGUKLWVycktDTm9TdG9yYWdlTW9kdWxlCT0JLTI1MzEyCSNlcnJLQ05vU3RvcmFnZU1vZHVsZQotZXJyS0NLZXlTaXplTm90QWxsb3dlZAk9CS0yNTMxMQkjZXJyS0NLZXlTaXplTm90QWxsb3dlZAotZXJyS0NXcm9uZ0tDVmVyc2lvbgk9CS0yNTMxMAkjZXJyS0NXcm9uZ0tDVmVyc2lvbgotZXJyS0NSZWFkT25seUF0dHIJPQktMjUzMDkJI2VycktDUmVhZE9ubHlBdHRyCi1lcnJLQ0ludGVyYWN0aW9uTm90QWxsb3dlZAk9CS0yNTMwOAkjZXJyS0NJbnRlcmFjdGlvbk5vdEFsbG93ZWQKLWVycktDTm9EZWZhdWx0S2V5Y2hhaW4JPQktMjUzMDcJI2VycktDTm9EZWZhdWx0S2V5Y2hhaW4KLWVycktDTm9TdWNoQ2xhc3MJPQktMjUzMDYJI2VycktDTm9TdWNoQ2xhc3MKLWVycktDSW52YWxpZFNlYXJjaFJlZgk9CS0yNTMwNQkjZXJyS0NJbnZhbGlkU2VhcmNoUmVmCi1lcnJLQ0ludmFsaWRJdGVtUmVmCT0JLTI1MzA0CSNlcnJLQ0ludmFsaWRJdGVtUmVmCi1lcnJLQ05vU3VjaEF0dHIJPQktMjUzMDMJI2VycktDTm9TdWNoQXR0cgotZXJyS0NEYXRhVG9vTGFyZ2UJPQktMjUzMDIJI2VycktDRGF0YVRvb0xhcmdlCi1lcnJLQ0J1ZmZlclRvb1NtYWxsCT0JLTI1MzAxCSNlcnJLQ0J1ZmZlclRvb1NtYWxsCi1lcnJLQ0l0ZW1Ob3RGb3VuZAk9CS0yNTMwMAkjZXJyS0NJdGVtTm90Rm91bmQKLWVycktDRHVwbGljYXRlSXRlbQk9CS0yNTI5OQkjZXJyS0NEdXBsaWNhdGVJdGVtCi1lcnJLQ0ludmFsaWRDYWxsYmFjawk9CS0yNTI5OAkjZXJyS0NJbnZhbGlkQ2FsbGJhY2sKLWVycktDRHVwbGljYXRlQ2FsbGJhY2sJPQktMjUyOTcJI2VycktDRHVwbGljYXRlQ2FsbGJhY2sKLWVycktDRHVwbGljYXRlS2V5Y2hhaW4JPQktMjUyOTYJI2VycktDRHVwbGljYXRlS2V5Y2hhaW4KLWVycktDSW52YWxpZEtleWNoYWluCT0JLTI1Mjk1CSNlcnJLQ0ludmFsaWRLZXljaGFpbgotZXJyS0NOb1N1Y2hLZXljaGFpbgk9CS0yNTI5NAkjZXJyS0NOb1N1Y2hLZXljaGFpbgotZXJyS0NBdXRoRmFpbGVkCT0JLTI1MjkzCSNlcnJLQ0F1dGhGYWlsZWQKLWVycktDUmVhZE9ubHkJPQktMjUyOTIJI2VycktDUmVhZE9ubHkKLWVycktDTm90QXZhaWxhYmxlCT0JLTI1MjkxCSNlcnJLQ05vdEF2YWlsYWJsZQotcHJpbnRlclN0YXR1c09wQ29kZU5vdFN1cHBvcnRlZEVycgk9CS0yNTI4MAkjcHJpbnRlclN0YXR1c09wQ29kZU5vdFN1cHBvcnRlZEVycgota1RYTk91dHNpZGVPZkZyYW1lRXJyCT0JLTIyMDE4CSNrVFhOT3V0c2lkZU9mRnJhbWVFcnIKLWtUWE5PdXRzaWRlT2ZMaW5lRXJyCT0JLTIyMDE3CSNrVFhOT3V0c2lkZU9mTGluZUVycgota1RYTkFUU1VJSXNOb3RJbnN0YWxsZWRFcnIJPQktMjIwMTYJI2tUWE5BVFNVSUlzTm90SW5zdGFsbGVkRXJyCi1rVFhORGF0YVR5cGVOb3RBbGxvd2VkRXJyCT0JLTIyMDE1CSNrVFhORGF0YVR5cGVOb3RBbGxvd2VkRXJyCi1rVFhOQ29weU5vdEFsbG93ZWRJbkVjaG9Nb2RlRXJyCT0JLTIyMDE0CSNrVFhOQ29weU5vdEFsbG93ZWRJbkVjaG9Nb2RlRXJyCi1rVFhOQ2Fubm90VHVyblRTTU9mZldoZW5Vc2luZ1VuaWNvZGVFcnIJPQktMjIwMTMJI2tUWE5DYW5ub3RUdXJuVFNNT2ZmV2hlblVzaW5nVW5pY29kZUVycgota1RYTkFscmVhZHlJbml0aWFsaXplZEVycgk9CS0yMjAxMgkja1RYTkFscmVhZHlJbml0aWFsaXplZEVycgota1RYTkludmFsaWRSdW5JbmRleAk9CS0yMjAxMQkja1RYTkludmFsaWRSdW5JbmRleAota1RYTlNvbWVPckFsbFRhZ3NJbnZhbGlkRm9yUnVuRXJyCT0JLTIyMDEwCSNrVFhOU29tZU9yQWxsVGFnc0ludmFsaWRGb3JSdW5FcnIKLWtUWE5BdHRyaWJ1dGVUYWdJbnZhbGlkRm9yUnVuRXJyCT0JLTIyMDA5CSNkYXRhVmFsdWUgaXMgc2V0IHRvIHRoaXMgcGVyIGludmFsaWQgdGFnCi1rVFhOTm9NYXRjaEVycgk9CS0yMjAwOAkja1RYTk5vTWF0Y2hFcnIKLWtUWE5SdW5JbmRleE91dG9mQm91bmRzRXJyCT0JLTIyMDA3CSNrVFhOUnVuSW5kZXhPdXRvZkJvdW5kc0Vycgota1RYTkNhbm5vdFNldEF1dG9JbmRlbnRFcnIJPQktMjIwMDYJI2tUWE5DYW5ub3RTZXRBdXRvSW5kZW50RXJyCi1rVFhOQmFkRGVmYXVsdEZpbGVUeXBlV2FybmluZwk9CS0yMjAwNQkja1RYTkJhZERlZmF1bHRGaWxlVHlwZVdhcm5pbmcKLWtUWE5Vc2VyQ2FuY2VsZWRPcGVyYXRpb25FcnIJPQktMjIwMDQJI2tUWE5Vc2VyQ2FuY2VsZWRPcGVyYXRpb25FcnIKLWtUWE5JbGxlZ2FsVG9Dcm9zc0RhdGFCb3VuZGFyaWVzRXJyCT0JLTIyMDAzCSNrVFhOSWxsZWdhbFRvQ3Jvc3NEYXRhQm91bmRhcmllc0Vycgota1RYTkludmFsaWRGcmFtZUlERXJyCT0JLTIyMDAyCSNrVFhOSW52YWxpZEZyYW1lSURFcnIKLWtUWE5DYW5ub3RBZGRGcmFtZUVycgk9CS0yMjAwMQkja1RYTkNhbm5vdEFkZEZyYW1lRXJyCi1rVFhORW5kSXRlcmF0aW9uRXJyCT0JLTIyMDAwCSNrVFhORW5kSXRlcmF0aW9uRXJyCi1pbnZhbGlkSW5kZXhFcnIJPQktMjAwMDIJI1RoZSByZWNvcmRJbmRleCBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkLgotcmVjb3JkRGF0YVRvb0JpZ0Vycgk9CS0yMDAwMQkjVGhlIHJlY29yZCBkYXRhIGlzIGJpZ2dlciB0aGFuIGJ1ZmZlciBzaXplICgxMDI0IGJ5dGVzKS4KLXVua25vd25JbnNlcnRNb2RlRXJyCT0JLTIwMDAwCSNUaGVyZSBpcyBubyBzdWNoIGFuIGluc2VydCBtb2RlLgota01vZGVtU2NyaXB0TWlzc2luZwk9CS0xNDAwMgkja01vZGVtU2NyaXB0TWlzc2luZwota01vZGVtUHJlZmVyZW5jZXNNaXNzaW5nCT0JLTE0MDAxCSNrTW9kZW1QcmVmZXJlbmNlc01pc3NpbmcKLWtNb2RlbU91dE9mTWVtb3J5CT0JLTE0MDAwCSNrTW9kZW1PdXRPZk1lbW9yeQota0hJREJhc2VFcnJvcgk9CS0xMzk1MAkja0hJREJhc2VFcnJvcgota0hJRE51bGxTdGF0ZUVycgk9CS0xMzk0OQkja0hJRE51bGxTdGF0ZUVycgota0hJREJ1ZmZlclRvb1NtYWxsRXJyCT0JLTEzOTQ4CSNrSElEQnVmZmVyVG9vU21hbGxFcnIKLWtISURWYWx1ZU91dE9mUmFuZ2VFcnIJPQktMTM5NDcJI2tISURWYWx1ZU91dE9mUmFuZ2VFcnIKLWtISURVc2FnZU5vdEZvdW5kRXJyCT0JLTEzOTQ2CSNrSElEVXNhZ2VOb3RGb3VuZEVycgota0hJRE5vdFZhbHVlQXJyYXlFcnIJPQktMTM5NDUJI2tISUROb3RWYWx1ZUFycmF5RXJyCi1rSElESW52YWxpZFByZXBhcnNlZERhdGFFcnIJPQktMTM5NDQJI2tISURJbnZhbGlkUHJlcGFyc2VkRGF0YUVycgota0hJREluY29tcGF0aWJsZVJlcG9ydEVycgk9CS0xMzk0Mwkja0hJREluY29tcGF0aWJsZVJlcG9ydEVycgota0hJREJhZExvZ1BoeXNWYWx1ZXNFcnIJPQktMTM5NDIJI2tISURCYWRMb2dQaHlzVmFsdWVzRXJyCi1rSElESW52YWxpZFJlcG9ydFR5cGVFcnIJPQktMTM5NDEJI2tISURJbnZhbGlkUmVwb3J0VHlwZUVycgota0hJREludmFsaWRSZXBvcnRMZW5ndGhFcnIJPQktMTM5NDAJI2tISURJbnZhbGlkUmVwb3J0TGVuZ3RoRXJyCi1rSElETnVsbFBvaW50ZXJFcnIJPQktMTM5MzkJI2tISUROdWxsUG9pbnRlckVycgota0hJREJhZFBhcmFtZXRlckVycgk9CS0xMzkzOAkja0hJREJhZFBhcmFtZXRlckVycgota0hJRE5vdEVub3VnaE1lbW9yeUVycgk9CS0xMzkzNwkja0hJRE5vdEVub3VnaE1lbW9yeUVycgota0hJREVuZE9mRGVzY3JpcHRvckVycgk9CS0xMzkzNgkja0hJREVuZE9mRGVzY3JpcHRvckVycgota0hJRFVzYWdlUGFnZVplcm9FcnIJPQktMTM5MzUJI2tISURVc2FnZVBhZ2VaZXJvRXJyCi1rSElEQmFkTG9naWNhbE1pbmltdW1FcnIJPQktMTM5MzQJI2tISURCYWRMb2dpY2FsTWluaW11bUVycgota0hJREJhZExvZ2ljYWxNYXhpbXVtRXJyCT0JLTEzOTMzCSNrSElEQmFkTG9naWNhbE1heGltdW1FcnIKLWtISURJbnZlcnRlZExvZ2ljYWxSYW5nZUVycgk9CS0xMzkzMgkja0hJREludmVydGVkTG9naWNhbFJhbmdlRXJyCi1rSElESW52ZXJ0ZWRQaHlzaWNhbFJhbmdlRXJyCT0JLTEzOTMxCSNrSElESW52ZXJ0ZWRQaHlzaWNhbFJhbmdlRXJyCi1rSElEVW5tYXRjaGVkVXNhZ2VSYW5nZUVycgk9CS0xMzkzMAkja0hJRFVubWF0Y2hlZFVzYWdlUmFuZ2VFcnIKLWtISURJbnZlcnRlZFVzYWdlUmFuZ2VFcnIJPQktMTM5MjkJI2tISURJbnZlcnRlZFVzYWdlUmFuZ2VFcnIKLWtISURVbm1hdGNoZWRTdHJpbmdSYW5nZUVycgk9CS0xMzkyOAkja0hJRFVubWF0Y2hlZFN0cmluZ1JhbmdlRXJyCi1rSElEVW5tYXRjaGVkRGVzaWduYXRvclJhbmdlRXJyCT0JLTEzOTI3CSNrSElEVW5tYXRjaGVkRGVzaWduYXRvclJhbmdlRXJyCi1rSElEUmVwb3J0U2l6ZVplcm9FcnIJPQktMTM5MjYJI2tISURSZXBvcnRTaXplWmVyb0Vycgota0hJRFJlcG9ydENvdW50WmVyb0Vycgk9CS0xMzkyNQkja0hJRFJlcG9ydENvdW50WmVyb0Vycgota0hJRFJlcG9ydElEWmVyb0Vycgk9CS0xMzkyNAkja0hJRFJlcG9ydElEWmVyb0Vycgota0hJREludmFsaWRSYW5nZVBhZ2VFcnIJPQktMTM5MjMJI2tISURJbnZhbGlkUmFuZ2VQYWdlRXJyCi1rSElERGV2aWNlTm90UmVhZHkJPQktMTM5MTAJI1RoZSBkZXZpY2UgaXMgc3RpbGwgaW5pdGlhbGl6aW5nLCB0cnkgYWdhaW4gbGF0ZXIKLWtISURWZXJzaW9uSW5jb21wYXRpYmxlRXJyCT0JLTEzOTA5CSNrSElEVmVyc2lvbkluY29tcGF0aWJsZUVycgotZGVidWdnaW5nTm9NYXRjaEVycgk9CS0xMzg4NwkjZGVidWdnaW5nIGNvbXBvbmVudCBvciBvcHRpb24gbm90IGZvdW5kIGF0IHRoaXMgaW5kZXgKLWRlYnVnZ2luZ05vQ2FsbGJhY2tFcnIJPQktMTM4ODYJI2RlYnVnZ2luZyBjb21wb25lbnQgaGFzIG5vIGNhbGxiYWNrCi1kZWJ1Z2dpbmdJbnZhbGlkTmFtZUVycgk9CS0xMzg4NQkjY29tcG9uZW50TmFtZSBvciBvcHRpb25OYW1lIGlzIGludmFsaWQgKE5VTEwpCi1kZWJ1Z2dpbmdJbnZhbGlkT3B0aW9uRXJyCT0JLTEzODg0CSNvcHRpb25TZWxlY3Rvck51bSBpcyBub3QgcmVnaXN0ZXJlZAotZGVidWdnaW5nSW52YWxpZFNpZ25hdHVyZUVycgk9CS0xMzg4MwkjY29tcG9uZW50U2lnbmF0dXJlIG5vdCByZWdpc3RlcmVkCi1kZWJ1Z2dpbmdEdXBsaWNhdGVPcHRpb25FcnIJPQktMTM4ODIJI29wdGlvblNlbGVjdG9yTnVtIGFscmVhZHkgcmVnaXN0ZXJlZAotZGVidWdnaW5nRHVwbGljYXRlU2lnbmF0dXJlRXJyCT0JLTEzODgxCSNjb21wb25lbnRTaWduYXR1cmUgYWxyZWFkeSByZWdpc3RlcmVkCi1kZWJ1Z2dpbmdFeGVjdXRpb25Db250ZXh0RXJyCT0JLTEzODgwCSNyb3V0aW5lIGNhbm5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCi1rQnJpZGdlU29mdHdhcmVSdW5uaW5nQ2FudFNsZWVwCT0JLTEzMDM4CSNrQnJpZGdlU29mdHdhcmVSdW5uaW5nQ2FudFNsZWVwCi1rTm9TdWNoUG93ZXJTb3VyY2UJPQktMTMwMjAJI2tOb1N1Y2hQb3dlclNvdXJjZQota1Byb2Nlc3NvclRlbXBSb3V0aW5lUmVxdWlyZXNNUExpYjIJPQktMTMwMTQJI2tQcm9jZXNzb3JUZW1wUm91dGluZVJlcXVpcmVzTVBMaWIyCi1rQ2FudFJlcG9ydFByb2Nlc3NvclRlbXBlcmF0dXJlRXJyCT0JLTEzMDEzCSNrQ2FudFJlcG9ydFByb2Nlc3NvclRlbXBlcmF0dXJlRXJyCi1rUG93ZXJNZ3RSZXF1ZXN0RGVuaWVkCT0JLTEzMDEwCSNrUG93ZXJNZ3RSZXF1ZXN0RGVuaWVkCi1rUG93ZXJNZ3RNZXNzYWdlTm90SGFuZGxlZAk9CS0xMzAwOQkja1Bvd2VyTWd0TWVzc2FnZU5vdEhhbmRsZWQKLWtQb3dlckhhbmRsZXJOb3RGb3VuZEZvclByb2NFcnIJPQktMTMwMDgJI2tQb3dlckhhbmRsZXJOb3RGb3VuZEZvclByb2NFcnIKLWtQb3dlckhhbmRsZXJOb3RGb3VuZEZvckRldmljZUVycgk9CS0xMzAwNwkja1Bvd2VySGFuZGxlck5vdEZvdW5kRm9yRGV2aWNlRXJyCi1rUG93ZXJIYW5kbGVyRXhpc3RzRm9yRGV2aWNlRXJyCT0JLTEzMDA2CSNrUG93ZXJIYW5kbGVyRXhpc3RzRm9yRGV2aWNlRXJyCi1wbVJlY3ZFbmRFcnIJPQktMTMwMDUJI2R1cmluZyByZWNlaXZlLCBwbWdyIGRpZCBub3QgZmluaXNoIGhzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgY29ubmVjdGlvbgotcG1SZWN2U3RhcnRFcnIJPQktMTMwMDQJI2R1cmluZyByZWNlaXZlLCBwbWdyIGRpZCBub3Qgc3RhcnQgaHMKLXBtU2VuZEVuZEVycgk9CS0xMzAwMwkjZHVyaW5nIHNlbmQsIHBtZ3IgZGlkIG5vdCBmaW5pc2ggaHMKLXBtU2VuZFN0YXJ0RXJyCT0JLTEzMDAyCSNkdXJpbmcgc2VuZCwgcG1nciBkaWQgbm90IHN0YXJ0IGhzCi1wbVJlcGx5VE9FcnIJPQktMTMwMDEJI1RpbWVkIG91dCB3YWl0aW5nIGZvciByZXBseQotcG1CdXN5RXJyCT0JLTEzMDAwCSNQb3dlciBNZ3IgbmV2ZXIgcmVhZHkgdG8gc3RhcnQgaGFuZHNoYWtlCi1waWN0dXJlRGF0YUVycgk9CS0xMTAwNQkjdGhlIHBpY3R1cmUgZGF0YSB3YXMgaW52YWxpZAotY29sb3JzUmVxdWVzdGVkRXJyCT0JLTExMDA0CSN0aGUgbnVtYmVyIG9mIGNvbG9ycyByZXF1ZXN0ZWQgd2FzIGlsbGVnYWwKLWNhbnRMb2FkUGlja01ldGhvZEVycgk9CS0xMTAwMwkjdW5hYmxlIHRvIGxvYWQgdGhlIGN1c3RvbSBwaWNrIHByb2MKLXBpY3RJbmZvVmVyYkVycgk9CS0xMTAwMgkjdGhlIHBhc3NlZCB2ZXJiIHdhcyBpbnZhbGlkCi1waWN0SW5mb0lERXJyCT0JLTExMDAxCSN0aGUgaW50ZXJuYWwgY29uc2lzdGFuY3kgY2hlY2sgZm9yIHRoZSBQaWN0SW5mb0lEIGlzIHdyb25nCi1waWN0SW5mb1ZlcnNpb25FcnIJPQktMTEwMDAJI3dyb25nIHZlcnNpb24gb2YgdGhlIFBpY3RJbmZvIHN0cnVjdHVyZQotZXJyVGFza05vdEZvdW5kCT0JLTEwNzgwCSNubyB0YXNrIHdpdGggdGhhdCB0YXNrIGlkIGV4aXN0cwotdGVsTm90RW5vdWdoZHNwQlcJPQktMTAxMTYJI25vdCBlbm91Z2ggcmVhbC10aW1lIGZvciBhbGxvY2F0aW9uCi10ZWxCYWRTYW1wbGVSYXRlCT0JLTEwMTE1CSNpbmNvbXBhdGlibGUgc2FtcGxlIHJhdGUKLXRlbEJhZFNXRXJyCT0JLTEwMTE0CSNTb2Z0d2FyZSBub3QgaW5zdGFsbGVkIHByb3Blcmx5Ci10ZWxEZXRBbHJlYWR5T24JPQktMTAxMTMJI2RldGVjdGlvbiBpcyBhbHJlYWR5IHR1cm5lZCBvbgotdGVsQXV0b0Fuc05vdE9uCT0JLTEwMTEyCSNhdXRvQW5zd2VyIGluIG5vdCB0dXJuZWQgb24KLXRlbFZhbGlkYXRlRmFpbGVkCT0JLTEwMTExCSN0ZWxWYWxpZGF0ZSBmYWlsZWQKLXRlbEJhZFByb2NJRAk9CS0xMDExMAkjaW52YWxpZCBwcm9jSUQKLXRlbERldmljZU5vdEZvdW5kCT0JLTEwMTA5CSNkZXZpY2Ugbm90IGZvdW5kCi10ZWxCYWRDb2RlUmVzb3VyY2UJPQktMTAxMDgJI2NvZGUgcmVzb3VyY2Ugbm90IGZvdW5kCi10ZWxJbml0RmFpbGVkCT0JLTEwMTA3CSNpbml0aWFsaXphdGlvbiBmYWlsZWQKLXRlbE5vQ29tbUZvbGRlcgk9CS0xMDEwNgkjQ29tbXVuaWNhdGlvbnMvRXh0ZW5zaW9ucyCAIG5vdCBmb3VuZAotdGVsVW5rbm93bkVycgk9CS0xMDEwMwkjdW5hYmxlIHRvIHNldCBjb25maWcKLXRlbE5vU3VjaFRvb2wJPQktMTAxMDIJI3VuYWJsZSB0byBmaW5kIHRvb2wgd2l0aCBuYW1lIHNwZWNpZmllZAotdGVsQmFkRnVuY3Rpb24JPQktMTAwOTEJI2JhZCBtc2dDb2RlIHNwZWNpZmllZAotdGVsUEJFcnIJPQktMTAwOTAJI3BhcmFtZXRlciBibG9jayBlcnJvciwgYmFkIGZvcm1hdAotdGVsQ0FOb3REZWZsZWN0YWJsZQk9CS0xMDA4MgkjQ0Egbm90ICJkZWZsZWN0YWJsZSIKLXRlbENBTm90UmVqZWN0YWJsZQk9CS0xMDA4MQkjQ0Egbm90ICJyZWplY3RhYmxlIgotdGVsQ0FOb3RBY2NlcHRhYmxlCT0JLTEwMDgwCSNDQSBub3QgImFjY2VwdGFibGUiCi10ZWxUZXJtTm90T3Blbgk9CS0xMDA3MgkjdGVybWluYWwgbm90IG9wZW5lZCB2aWEgVEVMT3BlblRlcm0KLXRlbFN0aWxsTmVlZGVkCT0JLTEwMDcxCSN0ZXJtaW5hbCBkcml2ZXIgc3RpbGwgbmVlZGVkIGJ5IHNvbWVvbmUgZWxzZQotdGVsQWxyZWFkeU9wZW4JPQktMTAwNzAJI3Rlcm1pbmFsIGFscmVhZHkgb3BlbgotdGVsTm9DYWxsYmFja1JlZgk9CS0xMDA2NAkjbm8gY2FsbCBiYWNrIHJlZmVyZW5jZSB3YXMgc3BlY2lmaWVkLCBidXQgaXMgcmVxdWlyZWQKLXRlbERpc3BsYXlNb2RlTm90U3VwcAk9CS0xMDA2MwkjZGlzcGxheSBtb2RlIG5vdCBzdXBwb3J0ZWQgYnkgdG9vbAotdGVsQmFkRGlzcGxheU1vZGUJPQktMTAwNjIJI2JhZCBkaXNwbGF5IG1vZGUgc3BlY2lmaWVkCi10ZWxGd2RUeXBlTm90U3VwcAk9CS0xMDA2MQkjZm9yd2FyZCB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdG9vbAotdGVsRE5UeXBlTm90U3VwcAk9CS0xMDA2MAkjRE4gdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRvb2wKLXRlbEJhZFJhdGUJPQktMTAwNTkJI2JhZCByYXRlIHNwZWNpZmllZAotdGVsQmFkQmVhcmVyVHlwZQk9CS0xMDA1OAkjYmFkIGJlYXJlclR5cGUgc3BlY2lmaWVkCi10ZWxCYWRTZWxlY3QJPQktMTAwNTcJI3VuYWJsZSB0byBzZWxlY3Qgb3IgZGVzZWxlY3QgRE4KLXRlbEJhZFBhcmtJRAk9CS0xMDA1NgkjYmFkIHBhcmsgaWQgc3BlY2lmaWVkCi10ZWxCYWRQaWNrdXBHcm91cElECT0JLTEwMDU1CSNiYWQgcGlja3VwIGdyb3VwIElEIHNwZWNpZmllZAotdGVsQmFkRndkVHlwZQk9CS0xMDA1NAkjYmFkIGZ3ZFR5cGUgc3BlY2lmaWVkCi10ZWxCYWRGZWF0dXJlSUQJPQktMTAwNTMJI2JhZCBmZWF0dXJlIElEIHNwZWNpZmllZAotdGVsQmFkSW50ZXJjb21JRAk9CS0xMDA1MgkjYmFkIGludGVyY29tIElEIHNwZWNpZmllZAotdGVsQmFkUGFnZUlECT0JLTEwMDUxCSNiYWQgcGFnZSBJRCBzcGVjaWZpZWQKLXRlbEJhZEROVHlwZQk9CS0xMDA1MAkjRE4gdHlwZSBpbnZhbGlkCi10ZWxDb25mTGltaXRFeGNlZWRlZAk9CS0xMDA0NwkjYXR0ZW1wdCB0byBleGNlZWQgc3dpdGNoIGNvbmZlcmVuY2UgbGltaXRzCi10ZWxDQkVycgk9CS0xMDA0NgkjY2FsbCBiYWNrIGZlYXR1cmUgbm90IHNldCBwcmV2aW91c2x5Ci10ZWxUcmFuc2ZlclJlagk9CS0xMDA0NQkjdHJhbnNmZXIgcmVxdWVzdCByZWplY3RlZAotdGVsVHJhbnNmZXJFcnIJPQktMTAwNDQJI3RyYW5zZmVyIG5vdCBwcmVwYXJlZAotdGVsQ29uZlJlagk9CS0xMDA0MwkjY29uZmVyZW5jZSByZXF1ZXN0IHdhcyByZWplY3RlZAotdGVsQ29uZkVycgk9CS0xMDA0MgkjY29uZmVyZW5jZSB3YXMgbm90IHByZXBhcmVkCi10ZWxDb25mTm9MaW1pdAk9CS0xMDA0MQkjbm8gbGltaXQgd2FzIHNwZWNpZmllZCBidXQgcmVxdWlyZWQKLXRlbENvbmZMaW1pdEVycgk9CS0xMDA0MAkjbGltaXQgc3BlY2lmaWVkIGlzIHRvbyBoaWdoIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24KLXRlbEZlYXROb3RTdXBwCT0JLTEwMDMzCSNmZWF0dXJlIHByb2dyYW0gY2FsbCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbAotdGVsRmVhdEFjdGl2ZQk9CS0xMDAzMgkjZmVhdHVyZSBhbHJlYWR5IGFjdGl2ZQotdGVsRmVhdE5vdEF2YWlsCT0JLTEwMDMxCSNmZWF0dXJlIHN1YnNjcmliZWQgYnV0IG5vdCBhdmFpbGFibGUKLXRlbEZlYXROb3RTdWIJPQktMTAwMzAJI2ZlYXR1cmUgbm90IHN1YnNjcmliZWQKLWVyckFFUHJvcGVydGllc0NsYXNoCT0JLTEwMDI1CSNpbGxlZ2FsIGNvbWJpbmF0aW9uIG9mIHByb3BlcnRpZXMgc2V0dGluZ3MgZm9yIFNldCBEYXRhLCBtYWtlIG5ldywgb3IgZHVwbGljYXRlCi1lcnJBRUNhbnRQdXRUaGF0VGhlcmUJPQktMTAwMjQJI2luIG1ha2UgbmV3LCBkdXBsaWNhdGUsIGV0Yy4gY2xhc3MgY2FuJ3QgYmUgYW4gZWxlbWVudCBvZiBjb250YWluZXIKLWVyckFFTm90QW5FbnVtTWVtYmVyCT0JLTEwMDIzCSNlbnVtZXJhdGVkIHZhbHVlIGluIFNldERhdGEgaXMgbm90IGFsbG93ZWQgZm9yIHRoaXMgcHJvcGVydHkKLXRlbEludEV4dE5vdFN1cHAJPQktMTAwMjIJI2ludGVybmFsIGV4dGVybmFsIHR5cGUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRvb2wKLXRlbEJhZEludEV4dAk9CS0xMDAyMQkjYmFkIGludGVybmFsIGV4dGVybmFsIGVycm9yCi10ZWxTdGF0ZU5vdFN1cHAJPQktMTAwMjAJI2RldmljZSBzdGF0ZSBub3Qgc3VwcG9ydGVkIGJ5IHRvb2wKLXRlbEJhZFN0YXRlRXJyCT0JLTEwMDE5CSNiYWQgZGV2aWNlIHN0YXRlIHNwZWNpZmllZAotdGVsSW5kZXhOb3RTdXBwCT0JLTEwMDE4CSNpbmRleCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbAotdGVsQmFkSW5kZXgJPQktMTAwMTcJI2JhZCBpbmRleCBzcGVjaWZpZWQKLXRlbEFQYXR0Tm90U3VwcAk9CS0xMDAxNgkjYWxlcnRpbmcgcGF0dGVybiBub3Qgc3VwcG9ydGVkIGJ5IHRvb2wKLXRlbEJhZEFQYXR0RXJyCT0JLTEwMDE1CSNiYWQgYWxlcnRpbmcgcGF0dGVybiBzcGVjaWZpZWQKLXRlbFZUeXBlTm90U3VwcAk9CS0xMDAxNAkjdm9sdW1lIHR5cGUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRvb2wKLXRlbEJhZFZUeXBlRXJyCT0JLTEwMDEzCSNiYWQgdm9sdW1lIHR5cGUgZXJyb3IKLXRlbEJhZExldmVsRXJyCT0JLTEwMDEyCSNiYWQgdm9sdW1lIGxldmVsIHNldHRpbmcKLXRlbEhUeXBlTm90U3VwcAk9CS0xMDAxMQkjaG9vayB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0b29sCi10ZWxCYWRIVHlwZUVycgk9CS0xMDAxMAkjYmFkIGhvb2sgdHlwZSBzcGVjaWZpZWQKLWVyckFFQ2FudFN1cHBseVR5cGUJPQktMTAwMDkJI2VyckFFQ2FudFN1cHBseVR5cGUKLXRlbE5vT3BlbkVycgk9CS0xMDAwOAkjdW5hYmxlIHRvIG9wZW4gdGVybWluYWwKLXRlbE5vTWVtRXJyCT0JLTEwMDA3CSNubyBtZW1vcnkgdG8gYWxsb2NhdGUgaGFuZGxlCi1lcnJPU0FDYW50QXNzaWduCT0JLTEwMDA2CSNTaWduYWxlZCB3aGVuIGFuIG9iamVjdCBjYW5ub3QgYmUgc2V0IGluIGEgY29udGFpbmVyLgotdGVsQmFkUHJvY0Vycgk9CS0xMDAwNQkjYmFkIG1zZ1Byb2Mgc3BlY2lmaWVkCi10ZWxCYWRIYW5kRXJyCT0JLTEwMDA0CSNiYWQgaGFuZGxlIHNwZWNpZmllZAotT1NBSWxsZWdhbEFzc2lnbgk9CS0xMDAwMwkjU2lnbmFsZWQgd2hlbiBhbiBvYmplY3QgY2FuIG5ldmVyIGJlIHNldCBpbiBhIGNvbnRhaW5lcgotdGVsQmFkRE5FcnIJPQktMTAwMDIJI1RFTEROSGFuZGxlIG5vdCBmb3VuZCBvciBpbnZhbGlkCi10ZWxCYWRUZXJtRXJyCT0JLTEwMDAxCSNpbnZhbGlkIFRFTEhhbmRsZSBvciBoYW5kbGUgbm90IGZvdW5kCi1lcnJBRUV2ZW50RmFpbGVkCT0JLTEwMDAwCSNlcnJBRUV2ZW50RmFpbGVkCi1jYW5ub3RNb3ZlQXR0YWNoZWRDb250cm9sbGVyCT0JLTk5OTkJI2Nhbm5vdE1vdmVBdHRhY2hlZENvbnRyb2xsZXIKLWNvbnRyb2xsZXJIYXNGaXhlZEhlaWdodAk9CS05OTk4CSNjb250cm9sbGVySGFzRml4ZWRIZWlnaHQKLWNhbm5vdFNldFdpZHRoT2ZBdHRhY2hlZENvbnRyb2xsZXIJPQktOTk5NwkjY2Fubm90U2V0V2lkdGhPZkF0dGFjaGVkQ29udHJvbGxlcgotY29udHJvbGxlckJvdW5kc05vdEV4YWN0CT0JLTk5OTYJI2NvbnRyb2xsZXJCb3VuZHNOb3RFeGFjdAotZWRpdGluZ05vdEFsbG93ZWQJPQktOTk5NQkjZWRpdGluZ05vdEFsbG93ZWQKLWJhZENvbnRyb2xsZXJIZWlnaHQJPQktOTk5NAkjYmFkQ29udHJvbGxlckhlaWdodAotZGV2aWNlQ2FudE1lZXRSZXF1ZXN0CT0JLTk0MDgJI2RldmljZUNhbnRNZWV0UmVxdWVzdAotc2VxR3JhYkluZm9Ob3RBdmFpbGFibGUJPQktOTQwNwkjc2VxR3JhYkluZm9Ob3RBdmFpbGFibGUKLWJhZFNHQ2hhbm5lbAk9CS05NDA2CSNiYWRTR0NoYW5uZWwKLWNvdWxkbnRHZXRSZXF1aXJlZENvbXBvbmVudAk9CS05NDA1CSNjb3VsZG50R2V0UmVxdWlyZWRDb21wb25lbnQKLW5vdEVub3VnaERpc2tTcGFjZVRvR3JhYgk9CS05NDA0CSNub3RFbm91Z2hEaXNrU3BhY2VUb0dyYWIKLW5vdEVub3VnaE1lbW9yeVRvR3JhYgk9CS05NDAzCSNub3RFbm91Z2hNZW1vcnlUb0dyYWIKLWNhbnREb1RoYXRJbkN1cnJlbnRNb2RlCT0JLTk0MDIJI2NhbnREb1RoYXRJbkN1cnJlbnRNb2RlCi1ncmFiVGltZUNvbXBsZXRlCT0JLTk0MDEJI2dyYWJUaW1lQ29tcGxldGUKLW5vRGV2aWNlRm9yQ2hhbm5lbAk9CS05NDAwCSNub0RldmljZUZvckNoYW5uZWwKLWtOb0NhcmRCdXNDSVNFcnIJPQktOTEwOQkjTm8gdmFsaWQgQ0lTIGV4aXN0cyBmb3IgdGhpcyBDYXJkQnVzIGNhcmQKLWtOb3RaVkNhcGFibGVFcnIJPQktOTEwOAkjVGhpcyBzb2NrZXQgZG9lcyBub3Qgc3VwcG9ydCBab29tZWQgVmlkZW8KLWtDYXJkUG93ZXJPZmZFcnIJPQktOTEwNwkjUG93ZXIgdG8gdGhlIGNhcmQgaGFzIGJlZW4gdHVybmVkIG9mZgota0F0dGVtcHREdXBDYXJkRW50cnlFcnIJPQktOTEwNgkjVGhlIEVuYWJsZXIgd2FzIGFza2VkIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSBjYXJkIGVudHJ5Ci1rQWxyZWFkeVNhdmVkU3RhdGVFcnIJPQktOTEwNQkjVGhlIHN0YXRlIGhhcyBiZWVuIHNhdmVkIG9uIHByZXZpb3VzIGNhbGwKLWtUb29NYW55SU9XaW5kb3dzRXJyCT0JLTkxMDQJI2RldmljZSByZXF1ZXN0ZWQgbW9yZSB0aGFuIG9uZSBJL08gd2luZG93Ci1rTm90UmVhZHlFcnIJPQktOTEwMwkjUEMgQ2FyZCBmYWlsZWQgdG8gZ28gcmVhZHkKLWtDbGllbnRSZXF1ZXN0RGVuaWVkCT0JLTkxMDIJI0NTIENsaWVudHMgc2hvdWxkIHJldHVybiB0aGlzIGNvZGUgaW5vcmRlciB0bwota05vQ29tcGF0aWJsZU5hbWVFcnIJPQktOTEwMQkjVGhlcmUgaXMgbm8gY29tcGF0aWJsZSBkcml2ZXIgbmFtZSBmb3IgdGhpcyBkZXZpY2UKLWtOb0VuYWJsZXJGb3JDYXJkRXJyCT0JLTkxMDAJI05vIEVuYWJsZXJzIHdlcmUgZm91bmQgdGhhdCBjYW4gc3VwcG9ydCB0aGUgY2FyZAota05vQ2FyZEVuYWJsZXJzRm91bmRFcnIJPQktOTA5OQkjTm8gRW5hYmxlcnMgd2VyZSBmb3VuZAota1Vuc3VwcG9ydGVkQ2FyZEVycgk9CS05MDk4CSNDYXJkIG5vdCBzdXBwb3J0ZWQgYnkgZ2VuZXJpYyBlbmFibGVyCi1rTm9DbGllbnRUYWJsZUVycgk9CS05MDk3CSNUaGUgY2xpZW50IHRhYmxlIGhhcyBub3QgYmUgaW5pdGlhbGl6ZWQgeWV0Ci1rTm9Nb3JlSW50ZXJydXB0U2xvdHNFcnIJPQktOTA5NgkjQWxsIGludGVybmFsIEludGVycnVwdCBzbG90cyBhcmUgaW4gdXNlCi1rTm9Nb3JlVGltZXJDbGllbnRzRXJyCT0JLTkwOTUJI0FsbCB0aW1lciBjYWxsYmFja3MgYXJlIGluIHVzZQota05vSU9XaW5kb3dSZXF1ZXN0ZWRFcnIJPQktOTA5NAkjUmVxdWVzdCBJL08gd2luZG93IGJlZm9yZSBjYWxsaW5nIGNvbmZpZ3VyYXRpb24KLWtCYWRDdXN0b21JRklERXJyCT0JLTkwOTMJI0N1c3RvbSBpbnRlcmZhY2UgSUQgaXMgaW52YWxpZAota0JhZFR1cGxlRGF0YUVycgk9CS05MDkyCSNEYXRhIGluIHR1cGxlIGlzIGludmFsaWQKLWtJbnZhbGlkQ1NDbGllbnRFcnIJPQktOTA5MQkjQ2FyZCBTZXJ2aWNlcyBDbGllbnRJRCBpcyBub3QgcmVnaXN0ZXJlZAota1Vuc3VwcG9ydGVkVnNFcnIJPQktOTA5MAkjVW5zdXBwb3J0ZWQgVm9sdGFnZSBTZW5zZQota0ludmFsaWREZXZpY2VOdW1iZXIJPQktOTA4OQkja0ludmFsaWREZXZpY2VOdW1iZXIKLWtQb3N0Q2FyZEV2ZW50RXJyCT0JLTkwODgJI19QQ0NTTFBvc3RDYXJkRXZlbnQgZmFpbGVkIGFuZCBkcm9wcGVkIGFuIGV2ZW50Ci1rQ2FudENvbmZpZ3VyZUNhcmRFcnIJPQktOTA4Nwkja0NhbnRDb25maWd1cmVDYXJkRXJyCi1rUGFzc0NhbGxUb0NoYWluRXJyCT0JLTkwODYJI2tQYXNzQ2FsbFRvQ2hhaW5FcnIKLWtDYXJkQnVzQ2FyZEVycgk9CS05MDg1CSNrQ2FyZEJ1c0NhcmRFcnIKLWsxNkJpdENhcmRFcnIJPQktOTA4NAkjazE2Qml0Q2FyZEVycgota0JhZERldmljZUVycgk9CS05MDgzCSNrQmFkRGV2aWNlRXJyCi1rQmFkTGlua0Vycgk9CS05MDgyCSNrQmFkTGlua0Vycgota0ludmFsaWRSZWdFbnRyeUVycgk9CS05MDgxCSNrSW52YWxpZFJlZ0VudHJ5RXJyCi1rTm9DYXJkU2V2aWNlc1NvY2tldHNFcnIJPQktOTA4MAkja05vQ2FyZFNldmljZXNTb2NrZXRzRXJyCi1rT3V0T2ZSZXNvdXJjZUVycgk9CS05MDc5CSNDYXJkIFNlcnZpY2VzIGhhcyBleGhhdXN0ZWQgdGhlIHJlc291cmNlCi1rTm9Nb3JlSXRlbXNFcnIJPQktOTA3OAkjdGhlcmUgYXJlIG5vIG1vcmUgb2YgdGhlIHJlcXVlc3RlZCBpdGVtCi1rSW5Vc2VFcnIJPQktOTA3NwkjcmVxdWVzdGVkIHJlc291cmNlIGlzIGJlaW5nIHVzZWQgYnkgYSBjbGllbnQKLWtDb25maWd1cmF0aW9uTG9ja2VkRXJyCT0JLTkwNzYJI2EgY29uZmlndXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGxvY2tlZAota1dyaXRlUHJvdGVjdGVkRXJyCT0JLTkwNzUJI21lZGlhIGlzIHdyaXRlLXByb3RlY3RlZAota0J1c3lFcnIJPQktOTA3NAkjdW5hYmxlIHRvIHByb2Nlc3MgcmVxdWVzdCBhdCB0aGlzIHRpbWUgLSB0cnkgbGF0ZXIKLWtVbnN1cHBvcnRlZE1vZGVFcnIJPQktOTA3MwkjbW9kZSBpcyBub3Qgc3VwcG9ydGVkCi1rVW5zdXBwb3J0ZWRGdW5jdGlvbkVycgk9CS05MDcyCSNmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KLWtOb0NhcmRFcnIJPQktOTA3MQkjbm8gUEMgY2FyZCBpbiB0aGUgc29ja2V0Ci1rR2VuZXJhbEZhaWx1cmVFcnIJPQktOTA3MAkjYW4gdW5kZWZpbmVkIGVycm9yIGhhcyBvY2N1cnJlZAota1dyaXRlRmFpbHVyZUVycgk9CS05MDY5CSN1bmFibGUgdG8gY29tcGxldGUgd3JpdGUgcmVxdWVzdAota1JlYWRGYWlsdXJlRXJyCT0JLTkwNjgJI3VuYWJsZSB0byBjb21wbGV0ZSByZWFkIHJlcXVlc3QKLWtCYWRTcGVlZEVycgk9CS05MDY3CSNzcGVjaWZpZWQgc3BlZWQgaXMgdW5hdmFpbGFibGUKLWtCYWRDSVNFcnIJPQktOTA2NgkjQ0lTIG9uIGNhcmQgaXMgaW52YWxpZAota0JhZEhhbmRsZUVycgk9CS05MDY1CSNjbGllbnRIYW5kbGUgaXMgaW52YWxpZAota0JhZEFyZ3NFcnIJPQktOTA2NAkjdmFsdWVzIGluIGFyZ3VtZW50IHBhY2tldCBhcmUgaW52YWxpZAota0JhZEFyZ0xlbmd0aEVycgk9CS05MDYzCSNBcmdMZW5ndGggYXJndW1lbnQgaXMgaW52YWxpZAota0JhZFdpbmRvd0Vycgk9CS05MDYyCSNzcGVjaWZpZWQgd2luZG93IGlzIGludmFsaWQKLWtCYWRWcHBFcnIJPQktOTA2MQkjc3BlY2lmaWVkIFZwcDEgb3IgVnBwMiBwb3dlciBsZXZlbCBpbmRleCBpcyBpbnZhbGlkCi1rQmFkVmNjRXJyCT0JLTkwNjAJI3NwZWNpZmllZCBWY2MgcG93ZXIgbGV2ZWwgaW5kZXggaXMgaW52YWxpZAota0JhZFR5cGVFcnIJPQktOTA1OQkjc3BlY2lmaWVkIHdpbmRvdyBvciBpbnRlcmZhY2UgdHlwZSBpcyBpbnZhbGlkCi1rQmFkU29ja2V0RXJyCT0JLTkwNTgJI3NwZWNpZmllZCBsb2dpY2FsIG9yIHBoeXNpY2FsIHNvY2tldCBudW1iZXIgaXMgaW52YWxpZAota0JhZFNpemVFcnIJPQktOTA1Nwkjc3BlY2lmaWVkIHNpemUgaXMgaW52YWxpZAota0JhZFBhZ2VFcnIJPQktOTA1Ngkjc3BlY2lmaWVkIHBhZ2UgaXMgaW52YWxpZAota0JhZE9mZnNldEVycgk9CS05MDU1CSNzcGVjaWZpZWQgUEMgY2FyZCBtZW1vcnkgYXJyYXkgb2Zmc2V0IGlzIGludmFsaWQKLWtCYWRJUlFFcnIJPQktOTA1NAkjc3BlY2lmaWVkIElSUSBsZXZlbCBpcyBpbnZhbGlkCi1rQmFkRURDRXJyCT0JLTkwNTMJI3NwZWNpZmllZCBFREMgZ2VuZXJhdG9yIHNwZWNpZmllZCBpcyBpbnZhbGlkCi1rQmFkQmFzZUVycgk9CS05MDUyCSNzcGVjaWZpZWQgYmFzZSBzeXN0ZW0gbWVtb3J5IGFkZHJlc3MgaXMgaW52YWxpZAota0JhZEF0dHJpYnV0ZUVycgk9CS05MDUxCSNzcGVjaWZpZWQgYXR0cmlidXRlcyBmaWVsZCB2YWx1ZSBpcyBpbnZhbGlkCi1rQmFkQWRhcHRlckVycgk9CS05MDUwCSNpbnZhbGlkIGFkYXB0ZXIgbnVtYmVyCi1jb2RlY09mZnNjcmVlbkZhaWxlZFBsZWFzZVJldHJ5RXJyCT0JLTg5OTIJI2NvZGVjT2Zmc2NyZWVuRmFpbGVkUGxlYXNlUmV0cnlFcnIKLWxvY2tQb3J0Qml0c1dyb25nR0RldmljZUVycgk9CS04OTkxCSNsb2NrUG9ydEJpdHNXcm9uZ0dEZXZpY2VFcnIKLWRpcmVjdFhPYmplY3RBbHJlYWR5RXhpc3RzCT0JLTg5OTAJI2RpcmVjdFhPYmplY3RBbHJlYWR5RXhpc3RzCi1jb2RlY0Ryb3BwZWRGcmFtZUVycgk9CS04OTg5CSNyZXR1cm5lZCBmcm9tIEltYWdlQ29kZWNEcmF3QmFuZAotY29kZWNPZmZzY3JlZW5GYWlsZWRFcnIJPQktODk4OAkjY29kZWNPZmZzY3JlZW5GYWlsZWRFcnIKLWNvZGVjTmVlZEFjY2Vzc0tleUVycgk9CS04OTg3CSNjb2RlYyBuZWVkcyBwYXNzd29yZCBpbiBvcmRlciB0byBkZWNvbXByZXNzCi1jb2RlY1BhcmFtZXRlckRpYWxvZ0NvbmZpcm0JPQktODk4NgkjY29kZWNQYXJhbWV0ZXJEaWFsb2dDb25maXJtCi1sb2NrUG9ydEJpdHNTdXJmYWNlTG9zdEVycgk9CS04OTg1CSNsb2NrUG9ydEJpdHNTdXJmYWNlTG9zdEVycgotbG9ja1BvcnRCaXRzQmFkUG9ydEVycgk9CS04OTg0CSNsb2NrUG9ydEJpdHNCYWRQb3J0RXJyCi1sb2NrUG9ydEJpdHNXaW5kb3dDbGlwcGVkRXJyCT0JLTg5ODMJI2xvY2tQb3J0Qml0c1dpbmRvd0NsaXBwZWRFcnIKLWxvY2tQb3J0Qml0c1dpbmRvd1Jlc2l6ZWRFcnIJPQktODk4MgkjbG9ja1BvcnRCaXRzV2luZG93UmVzaXplZEVycgotbG9ja1BvcnRCaXRzV2luZG93TW92ZWRFcnIJPQktODk4MQkjbG9ja1BvcnRCaXRzV2luZG93TW92ZWRFcnIKLWxvY2tQb3J0Qml0c0JhZFN1cmZhY2VFcnIJPQktODk4MAkjbG9ja1BvcnRCaXRzQmFkU3VyZmFjZUVycgotY29kZWNOZWVkVG9GbHVzaENoYWluRXJyCT0JLTg5NzkJI2NvZGVjTmVlZFRvRmx1c2hDaGFpbkVycgotY29kZWNEaXNhYmxlZEVycgk9CS04OTc4CSNjb2RlYyBkaXNhYmxlZCBpdHNlbGYgLS0gcGFzcyBjb2RlY0ZsYWdSZWVuYWJsZSB0byByZXNldAotY29kZWNOb01lbW9yeVBsZWFzZVdhaXRFcnIJPQktODk3NwkjY29kZWNOb01lbW9yeVBsZWFzZVdhaXRFcnIKLWNvZGVjTm90aGluZ1RvQmxpdEVycgk9CS04OTc2CSNjb2RlY05vdGhpbmdUb0JsaXRFcnIKLWNvZGVjQ2FudFF1ZXVlRXJyCT0JLTg5NzUJI2NvZGVjQ2FudFF1ZXVlRXJyCi1jb2RlY0NhbnRXaGVuRXJyCT0JLTg5NzQJI2NvZGVjQ2FudFdoZW5FcnIKLWNvZGVjT3BlbkVycgk9CS04OTczCSNjb2RlY09wZW5FcnIKLWNvZGVjQ29uZGl0aW9uRXJyCT0JLTg5NzIJI2NvZGVjQ29uZGl0aW9uRXJyCi1jb2RlY0V4dGVuc2lvbk5vdEZvdW5kRXJyCT0JLTg5NzEJI2NvZGVjRXh0ZW5zaW9uTm90Rm91bmRFcnIKLWNvZGVjRGF0YVZlcnNFcnIJPQktODk3MAkjY29kZWNEYXRhVmVyc0VycgotY29kZWNCYWREYXRhRXJyCT0JLTg5NjkJI2NvZGVjQmFkRGF0YUVycgotY29kZWNXb3VsZE9mZnNjcmVlbkVycgk9CS04OTY4CSNjb2RlY1dvdWxkT2Zmc2NyZWVuRXJyCi1jb2RlY0Fib3J0RXJyCT0JLTg5NjcJI2NvZGVjQWJvcnRFcnIKLWNvZGVjU3Bvb2xFcnIJPQktODk2NgkjY29kZWNTcG9vbEVycgotY29kZWNJbWFnZUJ1ZkVycgk9CS04OTY1CSNjb2RlY0ltYWdlQnVmRXJyCi1jb2RlY1NjcmVlbkJ1ZkVycgk9CS04OTY0CSNjb2RlY1NjcmVlbkJ1ZkVycgotY29kZWNTaXplRXJyCT0JLTg5NjMJI2NvZGVjU2l6ZUVycgotY29kZWNVbmltcEVycgk9CS04OTYyCSNjb2RlY1VuaW1wRXJyCi1ub0NvZGVjRXJyCT0JLTg5NjEJI25vQ29kZWNFcnIKLWNvZGVjRXJyCT0JLTg5NjAJI2NvZGVjRXJyCi1rSWxsZWdhbENsb2NrVmFsdWVFcnIJPQktODg1Mgkja0lsbGVnYWxDbG9ja1ZhbHVlRXJyCi1rVVRDT3ZlcmZsb3dFcnIJPQktODg1MQkja1VUQ092ZXJmbG93RXJyCi1rVVRDVW5kZXJmbG93RXJyCT0JLTg4NTAJI2tVVENVbmRlcmZsb3dFcnIKLWtBVFNVTGFzdEVycgk9CS04ODA5CSNUaGUgbGFzdCBBVFNVSSBlcnJvciBjb2RlLgota0FUU1VMaW5lQnJlYWtJbldvcmQJPQktODgwOAkjVGhpcyBpcyBub3QgYW4gZXJyb3IgY29kZSBidXQgaXMgcmV0dXJuZWQgYnkgQVRTVUJyZWFrTGluZSB0bwota0FUU1VDb29yZGluYXRlT3ZlcmZsb3dFcnIJPQktODgwNwkjVXNlZCB0byBpbmRpY2F0ZSB0aGUgY29vcmRpbmF0ZXMgcHJvdmlkZWQgdG8gYW4gQVRTVUkgcm91dGluZSBjYXVzZWQKLWtBVFNVTm9Gb250U2NhbGVyQXZhaWxhYmxlRXJyCT0JLTg4MDYJI1VzZWQgd2hlbiBubyBmb250IHNjYWxlciBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb250IHBhc3NlZAota0FUU1VOb0ZvbnRDbWFwQXZhaWxhYmxlRXJyCT0JLTg4MDUJI1VzZWQgd2hlbiBubyBDTUFQIHRhYmxlIGNhbiBiZSBhY2Nlc3NlZCBvciBzeW50aGVzaXplZCBmb3IgdGhlCi1rQVRTVUxvd0xldmVsRXJyCT0JLTg4MDQJI1VzZWQgd2hlbiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2l0aGluIHRoZSBsb3cgbGV2ZWwgQVRTCi1rQVRTVVF1aWNrRHJhd1RleHRFcnIJPQktODgwMwkjVXNlZCB3aGVuIFF1aWNrRHJhdyBUZXh0IGVuY291bnRlcnMgYW4gZXJyb3IgcmVuZGVyaW5nIG9yIG1lYXN1cmluZwota0FUU1VOb1N0eWxlUnVuc0Fzc2lnbmVkRXJyCT0JLTg4MDIJI1VzZWQgd2hlbiBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIG1lYXN1cmUsIGhpZ2hsaWdodCBvciBkcmF3Ci1rQVRTVU5vdFNldEVycgk9CS04ODAxCSNVc2VkIHdoZW4gdGhlIGNsaWVudCBhdHRlbXB0cyB0byByZXRyaWV2ZSBhbiBhdHRyaWJ1dGUsCi1rQVRTVUludmFsaWRDYWNoZUVycgk9CS04ODAwCSNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byByZWFkIGluIHN0eWxlIGRhdGEKLWtBVFNVSW52YWxpZEF0dHJpYnV0ZVRhZ0Vycgk9CS04Nzk5CSNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1c2UgYSB0YWcgdmFsdWUgdGhhdAota0FUU1VJbnZhbGlkQXR0cmlidXRlU2l6ZUVycgk9CS04Nzk4CSNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1c2UgYW4gYXR0cmlidXRlIHdpdGggYQota0FUU1VJbnZhbGlkQXR0cmlidXRlVmFsdWVFcnIJPQktODc5NwkjVXNlZCB3aGVuIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gdXNlIGFuIGF0dHJpYnV0ZSB3aXRoCi1rQVRTVUludmFsaWRGb250RXJyCT0JLTg3OTYJI1VzZWQgd2hlbiBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHVzZSBhbiBpbnZhbGlkIGZvbnQgSUQuCi1rQVRTVU5vQ29ycmVzcG9uZGluZ0ZvbnRFcnIJPQktODc5NQkjVGhpcyB2YWx1ZSBpcyByZXRybmVkIGJ5IGZvbnQgSUQgY29udmVyc2lvbgota0FUU1VGb250c05vdE1hdGNoZWQJPQktODc5NAkjVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBieSBBVFNVTWF0Y2hGb250c1RvVGV4dCgpCi1rQVRTVUZvbnRzTWF0Y2hlZAk9CS04NzkzCSNUaGlzIGlzIG5vdCBhbiBlcnJvciBjb2RlIGJ1dCBpcyByZXR1cm5lZCBieQota0FUU1VJbnZhbGlkVGV4dFJhbmdlRXJyCT0JLTg3OTIJI0FuIGF0dGVtcHQgd2FzIG1hZGUgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbgota0FUU1VJbnZhbGlkU3R5bGVFcnIJPQktODc5MQkjQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1c2UgYSBBVFNVU3R5bGUgd2hpY2gKLWtBVFNVSW52YWxpZFRleHRMYXlvdXRFcnIJPQktODc5MAkjQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1c2UgYSBBVFNVVGV4dExheW91dAota1RFQ091dHB1dEJ1ZmZlckZ1bGxTdGF0dXMJPQktODc4NQkjb3V0cHV0IGJ1ZmZlciBoYXMgbm8gcm9vbSBmb3IgY29udmVyc2lvbiBvZiBuZXh0IGlucHV0IHRleHQgZWxlbWVudCAocGFydGlhbCBjb252ZXJzaW9uKQota1RFQ05lZWRGbHVzaFN0YXR1cwk9CS04Nzg0CSNrVEVDTmVlZEZsdXNoU3RhdHVzCi1rVEVDVXNlZEZhbGxiYWNrc1N0YXR1cwk9CS04NzgzCSNrVEVDVXNlZEZhbGxiYWNrc1N0YXR1cwota1RFQ0l0ZW1VbmF2YWlsYWJsZUVycgk9CS04NzcxCSNpdGVtIChlLmcuIG5hbWUpIG5vdCBhdmFpbGFibGUgZm9yIHNwZWNpZmllZCByZWdpb24gKCYgZW5jb2RpbmcgaWYgcmVsZXZhbnQpCi1rVEVDR2xvYmFsc1VuYXZhaWxhYmxlRXJyCT0JLTg3NzAJI2dsb2JhbHMgaGF2ZSBhbHJlYWR5IGJlZW4gZGVhbGxvY2F0ZWQgKHByZW1hdHVyZSBURVJNKQotdW5pY29kZUNoZWNrc3VtRXJyCT0JLTg3NjkJI3VuaWNvZGVDaGVja3N1bUVycgotdW5pY29kZU5vVGFibGVFcnIJPQktODc2OAkjdW5pY29kZU5vVGFibGVFcnIKLXVuaWNvZGVWYXJpYW50RXJyCT0JLTg3NjcJI3VuaWNvZGVWYXJpYW50RXJyCi11bmljb2RlRmFsbGJhY2tzRXJyCT0JLTg3NjYJI3VuaWNvZGVGYWxsYmFja3NFcnIKLXVuaWNvZGVQYXJ0Q29udmVydEVycgk9CS04NzY1CSN1bmljb2RlUGFydENvbnZlcnRFcnIKLXVuaWNvZGVCdWZFcnIJPQktODc2NAkjdW5pY29kZUJ1ZkVycgotdW5pY29kZUNoYXJFcnIJPQktODc2MwkjdW5pY29kZUNoYXJFcnIKLXVuaWNvZGVFbGVtZW50RXJyCT0JLTg3NjIJI3VuaWNvZGVFbGVtZW50RXJyCi11bmljb2RlTm90Rm91bmRFcnIJPQktODc2MQkjdW5pY29kZU5vdEZvdW5kRXJyCi11bmljb2RlVGFibGVGb3JtYXRFcnIJPQktODc2MAkjdW5pY29kZVRhYmxlRm9ybWF0RXJyCi11bmljb2RlRGlyZWN0aW9uRXJyCT0JLTg3NTkJI3VuaWNvZGVEaXJlY3Rpb25FcnIKLXVuaWNvZGVDb250ZXh0dWFsRXJyCT0JLTg3NTgJI3VuaWNvZGVDb250ZXh0dWFsRXJyCi11bmljb2RlVGV4dEVuY29kaW5nRGF0YUVycgk9CS04NzU3CSN1bmljb2RlVGV4dEVuY29kaW5nRGF0YUVycgota1RFQ0RpcmVjdGlvbkVycgk9CS04NzU2CSNkaXJlY3Rpb24gc3RhY2sgb3ZlcmZsb3csIGV0Yy4KLWtURUNJbmNvbXBsZXRlRWxlbWVudEVycgk9CS04NzU1CSN0ZXh0IGVsZW1lbnQgbWF5IGJlIGluY29tcGxldGUgb3IgaXMgdG9vIGxvbmcgZm9yIGludGVybmFsIGJ1ZmZlcnMKLWtURUNVbm1hcHBhYmxlRWxlbWVudEVycgk9CS04NzU0CSNrVEVDVW5tYXBwYWJsZUVsZW1lbnRFcnIKLWtURUNQYXJ0aWFsQ2hhckVycgk9CS04NzUzCSNpbnB1dCBidWZmZXIgZW5kcyBpbiB0aGUgbWlkZGxlIG9mIGEgbXVsdGlieXRlIGNoYXJhY3RlciwgY29udmVyc2lvbiBzdG9wcGVkCi1rVEVDQmFkVGV4dFJ1bkVycgk9CS04NzUyCSNrVEVDQmFkVGV4dFJ1bkVycgota1RFQ0FycmF5RnVsbEVycgk9CS04NzUxCSNzdXBwbGllZCBuYW1lIGJ1ZmZlciBvciBUZXh0UnVuLCBUZXh0RW5jb2RpbmcsIG9yIFVuaWNvZGVNYXBwaW5nIGFycmF5IGlzIHRvbyBzbWFsbAota1RFQ0J1ZmZlckJlbG93TWluaW11bVNpemVFcnIJPQktODc1MAkjb3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgdG8gYWxsb3cgcHJvY2Vzc2luZyBvZiBmaXJzdCBpbnB1dCB0ZXh0IGVsZW1lbnQKLWtURUNOb0NvbnZlcnNpb25QYXRoRXJyCT0JLTg3NDkJI2tURUNOb0NvbnZlcnNpb25QYXRoRXJyCi1rVEVDQ29ycnVwdENvbnZlcnRlckVycgk9CS04NzQ4CSNpbnZhbGlkIGNvbnZlcnRlciBvYmplY3QgcmVmZXJlbmNlCi1rVEVDVGFibGVGb3JtYXRFcnIJPQktODc0Nwkja1RFQ1RhYmxlRm9ybWF0RXJyCi1rVEVDVGFibGVDaGVja3N1bUVycgk9CS04NzQ2CSNrVEVDVGFibGVDaGVja3N1bUVycgota1RFQ01pc3NpbmdUYWJsZUVycgk9CS04NzQ1CSNrVEVDTWlzc2luZ1RhYmxlRXJyCi1rVGV4dFVuZGVmaW5lZEVsZW1lbnRFcnIJPQktODc0MAkjdGV4dCBjb252ZXJzaW9uIGVycm9ycwota1RleHRNYWxmb3JtZWRJbnB1dEVycgk9CS04NzM5CSNpbiBEQkNTLCBmb3IgZXhhbXBsZSwgaGlnaCBieXRlIGZvbGxvd2VkIGJ5IGludmFsaWQgbG93IGJ5dGUKLWtUZXh0VW5zdXBwb3J0ZWRFbmNvZGluZ0Vycgk9CS04NzM4CSNzcGVjaWZpZWQgZW5jb2Rpbmcgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24KLWtSQU5vdEVuYWJsZWQJPQktNzEzOQkja1JBTm90RW5hYmxlZAota1JBQ2FsbEJhY2tGYWlsZWQJPQktNzEzOAkja1JBQ2FsbEJhY2tGYWlsZWQKLWtSQUR1cGxpY2F0ZUlQQWRkcgk9CS03MTM3CSNrUkFEdXBsaWNhdGVJUEFkZHIKLWtSQU5DUFJlamVjdGVkYnlQZWVyCT0JLTcxMzYJI2tSQU5DUFJlamVjdGVkYnlQZWVyCi1rUkFFeHRBdXRoZW50aWNhdGlvbkZhaWxlZAk9CS03MTM1CSNrUkFFeHRBdXRoZW50aWNhdGlvbkZhaWxlZAota1JBQVRhbGtJbmFjdGl2ZQk9CS03MTM0CSNrUkFBVGFsa0luYWN0aXZlCi1rUkFQZWVyTm90UmVzcG9uZGluZwk9CS03MTMzCSNrUkFQZWVyTm90UmVzcG9uZGluZwota1JBUFBQUGVlckRpc2Nvbm5lY3RlZAk9CS03MTMyCSNrUkFQUFBQZWVyRGlzY29ubmVjdGVkCi1rUkFQUFBVc2VyRGlzY29ubmVjdGVkCT0JLTcxMzEJI2tSQVBQUFVzZXJEaXNjb25uZWN0ZWQKLWtSQVBQUE5lZ290aWF0aW9uRmFpbGVkCT0JLTcxMzAJI2tSQVBQUE5lZ290aWF0aW9uRmFpbGVkCi1rUkFQUFBBdXRoZW50aWNhdGlvbkZhaWxlZAk9CS03MTI5CSNrUkFQUFBBdXRoZW50aWNhdGlvbkZhaWxlZAota1JBUFBQUHJvdG9jb2xSZWplY3RlZAk9CS03MTI4CSNrUkFQUFBQcm90b2NvbFJlamVjdGVkCi1kY21CdWZmZXJPdmVyZmxvd0Vycgk9CS03MTI3CSNkYXRhIGlzIGxhcmdlciB0aGFuIGJ1ZmZlciBzaXplCi1rUkFOb3RQcmltYXJ5SW50ZXJmYWNlCT0JLTcxMjYJI3doZW4gSVBDUCBpcyBub3QgcHJpbWFyeSBUQ1AvSVAgaW50Zi4KLWtSQVRDUElQTm90Q29uZmlndXJlZAk9CS03MTI1CSNUQ1AvSVAgbm90IGNvbmZpZ3VyZWQsIGNvdWxkIGJlIGxvYWRlZAota1JBVENQSVBJbmFjdGl2ZQk9CS03MTI0CSNUQ1AvSVAgaW5hY3RpdmUsIGNhbm5vdCBiZSBsb2FkZWQKLWtSQVJlbW90ZUFjY2Vzc05vdFJlYWR5CT0JLTcxMjMJI2tSQVJlbW90ZUFjY2Vzc05vdFJlYWR5Ci1rUkFJbml0T3BlblRyYW5zcG9ydEZhaWxlZAk9CS03MTIyCSNrUkFJbml0T3BlblRyYW5zcG9ydEZhaWxlZAotZGNtUHJvdGVjdGVkRXJyCT0JLTcxMjEJI25lZWQga2V5d29yZCB0byB1c2UgZGljdGlvbmFyeQota1JBVXNlclB3ZEVudHJ5UmVxdWlyZWQJPQktNzEyMAkja1JBVXNlclB3ZEVudHJ5UmVxdWlyZWQKLWtSQVVzZXJQd2RDaGFuZ2VSZXF1aXJlZAk9CS03MTE5CSNrUkFVc2VyUHdkQ2hhbmdlUmVxdWlyZWQKLWRjbUJhZEZpbmRNZXRob2RFcnIJPQktNzExOAkjbm8gc3VjaCBmaW5kIG1ldGhvZCBzdXBwb3J0ZWQKLWtSQUludmFsaWRTZXJpYWxQcm90b2NvbAk9CS03MTE3CSNrUkFJbnZhbGlkU2VyaWFsUHJvdG9jb2wKLWtSQUludmFsaWRQb3J0U3RhdGUJPQktNzExNgkja1JBSW52YWxpZFBvcnRTdGF0ZQotZGNtQmFkS2V5RXJyCT0JLTcxMTUJI2JhZCBrZXkgaW5mb3JtYXRpb24KLWtSQVBvcnRCdXN5CT0JLTcxMTQJI2tSQVBvcnRCdXN5Ci1rUkFJbnN0YWxsYXRpb25EYW1hZ2VkCT0JLTcxMTMJI2tSQUluc3RhbGxhdGlvbkRhbWFnZWQKLWRjbUJhZEZpZWxkVHlwZUVycgk9CS03MTEyCSNubyBzdWNoIGZpZWxkIHR5cGUgc3VwcG9ydGVkCi1kY21CYWRGaWVsZEluZm9FcnIJPQktNzExMQkjaW5jb21wbGV0ZSBpbmZvcm1hdGlvbgotZGNtTmVjZXNzYXJ5RmllbGRFcnIJPQktNzExMAkjbGFjayByZXF1aXJlZC9pZGVudGlmeSBmaWVsZAotZGNtRHVwUmVjb3JkRXJyCT0JLTcxMDkJI3NhbWUgcmVjb3JkIGFscmVhZHkgZXhpc3QKLWtSQU5vdENvbm5lY3RlZAk9CS03MTA4CSNrUkFOb3RDb25uZWN0ZWQKLWRjbUJsb2NrRnVsbEVycgk9CS03MTA3CSNkaWN0aW9uYXJ5IGJsb2NrIGZ1bGwKLWtSQU1pc3NpbmdSZXNvdXJjZXMJPQktNzEwNgkja1JBTWlzc2luZ1Jlc291cmNlcwotZGNtRGljdGlvbmFyeUJ1c3lFcnIJPQktNzEwNQkjZGljdGlvbmFyeSBpcyBidXN5Ci1kY21EaWN0aW9uYXJ5Tm90T3BlbkVycgk9CS03MTA0CSNkaWN0aW9uYXJ5IG5vdCBvcGVuZWQKLWRjbVBlcm1pc3Npb25FcnIJPQktNzEwMwkjaW52YWxpZCBwZXJtaXNzaW9uCi1kY21CYWREaWN0aW9uYXJ5RXJyCT0JLTcxMDIJI2ludmFsaWQgZGljdGlvbmFyeQotZGNtTm90RGljdGlvbmFyeUVycgk9CS03MTAxCSNub3QgZGljdGlvbmFyeQota1JBSW52YWxpZFBhcmFtZXRlcgk9CS03MTAwCSNrUkFJbnZhbGlkUGFyYW1ldGVyCi1sYUVuZ2luZU5vdEZvdW5kRXJyCT0JLTcwMDAJI2Nhbid0IGZpbmQgdGhlIGVuZ2luZQotbGFQcm9wZXJ0eUVycgk9CS02OTk5CSNFcnJvciBpbiBwcm9wZXJ0aWVzCi1rVVNCVW5rbm93bkRldmljZUVycgk9CS02OTk4CSNkZXZpY2UgcmVmIG5vdCByZWNvZ25pc2VkCi1sYVByb3BlcnR5SXNSZWFkT25seUVycgk9CS02OTk3CSN0aGUgcHJvcGVydHkgaXMgcmVhZCBvbmx5Ci1sYVByb3BlcnR5VW5rbm93bkVycgk9CS02OTk2CSN0aGUgcHJvcGVydHkgaXMgdW5rbm93biB0byB0aGlzIGVudmlyb25tZW50Ci1sYVByb3BlcnR5VmFsdWVFcnIJPQktNjk5NQkjSW52YWxpZCBwcm9wZXJ0eSB2YWx1ZQotbGFEaWN0aW9uYXJ5VG9vTWFueUVycgk9CS02OTk0CSN0b28gbWFueSBkaWN0aW9uYXJpZXMKLWxhRGljdGlvbmFyeVVua25vd25FcnIJPQktNjk5MwkjY2FuJ3QgdXNlIHRoaXMgZGljdGlvbmFyeSB3aXRoIHRoaXMgZW52aXJvbm1lbnQKLWxhRGljdGlvbmFyeU5vdE9wZW5lZEVycgk9CS02OTkyCSN0aGUgZGljdGlvbmFyeSBpcyBub3Qgb3BlbmVkCi1sYVRleHRPdmVyRmxvd0Vycgk9CS02OTkxCSN0ZXh0IGlzIHRvbyBsb25nCi1sYUZhaWxBbmFseXNpc0Vycgk9CS02OTkwCSNhbmFseXNpcyBmYWlsZWQKLWxhTm9Nb3JlTW9ycGhlbWVFcnIJPQktNjk4OQkjbm90aGluZyB0byByZWFkCi1sYUludmFsaWRQYXRoRXJyCT0JLTY5ODgJI3BhdGggaXMgbm90IGNvcnJlY3QKLWtVU0JOb3RIYW5kbGVkCT0JLTY5ODcJI05vdGlmaWNhdGlvbiB3YXMgbm90IGhhbmRsZWQgICAoc2FtZSBhcyBOb3RGb3VuZCkKLWxhRW52aXJvbm1lbnROb3RGb3VuZEVycgk9CS02OTg2CSNjYW4ndCBmaW50IHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQKLWxhRW52aXJvbm1lbnRCdXN5RXJyCT0JLTY5ODUJI3NwZWNpZmllZCBlbnZpcm9ubWVudCBpcyB1c2VkCi1sYVRvb1NtYWxsQnVmZmVyRXJyCT0JLTY5ODQJI291dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIHN0b3JlIGFueSByZXN1bHQKLWtVU0JGbGFnc0Vycm9yCT0JLTY5ODMJI1VudXNlZCBmbGFncyBub3QgemVyb2VkCi1rVVNCQWJvcnRlZEVycm9yCT0JLTY5ODIJI1BpcGUgYWJvcnRlZAota1VTQk5vQmFuZHdpZHRoRXJyb3IJPQktNjk4MQkjTm90IGVub3VnaCBiYW5kd2lkdGggYXZhaWxhYmxlCi1rVVNCUGlwZUlkbGVFcnJvcgk9CS02OTgwCSNQaXBlIGlzIElkbGUsIGl0IHdpbGwgbm90IGFjY2VwdCB0cmFuc2FjdGlvbnMKLWtVU0JQaXBlU3RhbGxlZEVycm9yCT0JLTY5NzkJI1BpcGUgaGFzIHN0YWxsZWQsIGVycm9yIG5lZWRzIHRvIGJlIGNsZWFyZWQKLWtVU0JVbmtub3duSW50ZXJmYWNlRXJyCT0JLTY5NzgJI0ludGVyZmFjZSByZWYgbm90IHJlY29nbmlzZWQKLWtVU0JEZXZpY2VCdXN5CT0JLTY5NzcJI0RldmljZSBpcyBhbHJlYWR5IGJlaW5nIGNvbmZpZ3VyZWQKLWtVU0JEZXZpY2VQb3dlclByb2JsZW0JPQktNjk3NgkjRGV2aWNlIGhhcyBhIHBvd2VyIHByb2JsZW0KLWtVU0JJbnZhbGlkQnVmZmVyCT0JLTY5NzUJI2JhZCBidWZmZXIsIHVzdWFsbHkgbmlsCi1rVVNCRGV2aWNlU3VzcGVuZGVkCT0JLTY5NzQJI0RldmljZSBpcyBzdXNwZW5kZWQKLWtVU0JEZXZpY2VOb3RTdXNwZW5kZWQJPQktNjk3MwkjZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQgZm9yIHJlc3VtZQota1VTQkRldmljZURpc2Nvbm5lY3RlZAk9CS02OTcyCSNEaXNjb25uZWN0ZWQgZHVyaW5nIHN1c3BlbmQgb3IgcmVzZXQKLWtVU0JUaW1lZE91dAk9CS02OTcxCSNUcmFuc2FjdGlvbiB0aW1lZCBvdXQuCi1rVVNCUXVldWVBYm9ydGVkCT0JLTY5NzAJI1BpcGUgemVybyBzdGFsbCBjbGVhcmVkLgota1VTQlBvcnREaXNhYmxlZAk9CS02OTY5CSNUaGUgcG9ydCB5b3UgYXJlIGF0dGFjaGVkIHRvIGlzIGRpc2FibGVkLCB1c2UgVVNCRGV2aWNlUmVzZXQuCi1rVVNCQmFkRGlzcGF0Y2hUYWJsZQk9CS02OTUwCSNJbXByb3BlciBkcml2ZXIgZGlzcGF0Y2ggdGFibGUKLWtVU0JVbmtub3duTm90aWZpY2F0aW9uCT0JLTY5NDkJI05vdGlmaWNhdGlvbiB0eXBlIG5vdCBkZWZpbmVkCi1rVVNCUXVldWVGdWxsCT0JLTY5NDgJI0ludGVybmFsIHF1ZXVlIG1heHhlZAota1VTQkxpbmtFcnIJPQktNjkxNgkja1VTQkxpbmtFcnIKLWtVU0JDUkNFcnIJPQktNjkxNQkjUGlwZSBzdGFsbCwgYmFkIENSQwota1VTQkJpdHN0dWZFcnIJPQktNjkxNAkjUGlwZSBzdGFsbCwgYml0c3R1ZmZpbmcKLWtVU0JEYXRhVG9nZ2xlRXJyCT0JLTY5MTMJI1BpcGUgc3RhbGwsIEJhZCBkYXRhIHRvZ2dsZQota1VTQkVuZHBvaW50U3RhbGxFcnIJPQktNjkxMgkjRGV2aWNlIGRpZG4ndCB1bmRlcnN0YW5kCi1rVVNCTm90UmVzcG9uZGluZ0Vycgk9CS02OTExCSNQaXBlIHN0YWxsLCBObyBkZXZpY2UsIGRldmljZSBodW5nCi1rVVNCUElEQ2hlY2tFcnIJPQktNjkxMAkjUGlwZSBzdGFsbCwgUElEIENSQyBlcnJvcgota1VTQldyb25nUElERXJyCT0JLTY5MDkJI1BpcGUgc3RhbGwsIEJhZCBvciB3cm9uZyBQSUQKLWtVU0JPdmVyUnVuRXJyCT0JLTY5MDgJI1BhY2tldCB0b28gbGFyZ2Ugb3IgbW9yZSBkYXRhIHRoYW4gYnVmZmVyCi1rVVNCVW5kZXJSdW5FcnIJPQktNjkwNwkjTGVzcyBkYXRhIHRoYW4gYnVmZmVyCi1rVVNCUmVzMUVycgk9CS02OTA2CSNrVVNCUmVzMUVycgota1VTQlJlczJFcnIJPQktNjkwNQkja1VTQlJlczJFcnIKLWtVU0JCdWZPdnJSdW5FcnIJPQktNjkwNAkjSG9zdCBoYXJkd2FyZSBmYWlsdXJlIG9uIGRhdGEgaW4sIFBDSSBidXN5Pwota1VTQkJ1ZlVuZGVyUnVuRXJyCT0JLTY5MDMJI0hvc3QgaGFyZHdhcmUgZmFpbHVyZSBvbiBkYXRhIG91dCwgUENJIGJ1c3k/Ci1rVVNCTm90U2VudDFFcnIJPQktNjkwMgkjVHJhbnNhY3Rpb24gbm90IHNlbnQKLWtVU0JOb3RTZW50MkVycgk9CS02OTAxCSNUcmFuc2FjdGlvbiBub3Qgc2VudAota0RNRm91bmRFcnIJPQktNjIzMgkjRGlkIG5vdCBwcm9jZWVkIGJlY2F1c2Ugd2UgZm91bmQgYW4gaXRlbQota0RNTWFpbkRpc3BsYXlDYW5ub3RNb3ZlRXJyCT0JLTYyMzEJI1RyeWluZyB0byBtb3ZlIG1haW4gZGlzcGxheSAob3IgYSBkaXNwbGF5IG1pcnJvcmVkIHRvIGl0KQota0RNRGlzcGxheUFscmVhZHlJbnN0YWxsZWRFcnIJPQktNjIzMAkjQXR0ZW1wdCB0byBhZGQgYW4gYWxyZWFkeSBpbnN0YWxsZWQgZGlzcGxheS4KLWtETURpc3BsYXlOb3RGb3VuZEVycgk9CS02MjI5CSNDb3VsZCBub3QgZmluZCBpdGVtICh3aWxsIHNvbWVkYXkgcmVtb3ZlKS4KLWtETURyaXZlck5vdERpc3BsYXlNZ3JBd2FyZUVycgk9CS02MjI4CSNWaWRlbyBEcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBkaXNwbGF5IG1hbmFnZXIuCi1rRE1TV05vdEluaXRpYWxpemVkRXJyCT0JLTYyMjcJI1JlcXVpcmVkIHNvZnR3YXJlIG5vdCBpbml0aWFsaXplZCAoZWcgd2luZG93bWFuYWdlciBvciBkaXNwbGF5IG1ncikuCi1rU3lzU1dUb29PbGQJPQktNjIyNgkjTWlzc2luZyBjcml0aWNhbCBwaWVjZXMgb2YgU3lzdGVtIFNvZnR3YXJlLgota0RNTWlycm9yaW5nTm90T24JPQktNjIyNQkjUmV0dXJuZWQgYnkgYWxsIGNhbGxzIHRoYXQgbmVlZCBtaXJyb3JpbmcgdG8gYmUgb24gdG8gZG8gdGhlaXIgdGhpbmcuCi1rRE1DYW50QmxvY2sJPQktNjIyNAkjTWlycm9yaW5nIGlzIGFscmVhZHkgb24sIGNhbtV0IEJsb2NrIG5vdyAoY2FsbCBETVVuTWlycm9yKCkgZmlyc3QpLgota0RNTWlycm9yaW5nQmxvY2tlZAk9CS02MjIzCSNETUJsb2NrTWlycm9yaW5nKCkgaGFzIGJlZW4gY2FsbGVkLgota0RNV3JvbmdOdW1iZXJPZkRpc3BsYXlzCT0JLTYyMjIJI0NhbiBvbmx5IGhhbmRsZSAyIGRpc3BsYXlzIGZvciBub3cuCi1rRE1NaXJyb3JpbmdPbkFscmVhZHkJPQktNjIyMQkjUmV0dXJuZWQgYnkgYWxsIGNhbGxzIHRoYXQgbmVlZCBtaXJyb3JpbmcgdG8gYmUgb2ZmIHRvIGRvIHRoZWlyIHRoaW5nLgota0RNR2VuRXJyCT0JLTYyMjAJI1VuZXhwZWN0ZWQgRXJyb3IKLWtRVFNTVW5rbm93bkVycgk9CS02MTUwCSNrUVRTU1Vua25vd25FcnIKLWNvbGxlY3Rpb25WZXJzaW9uRXJyCT0JLTU3NTMJI2NvbGxlY3Rpb25WZXJzaW9uRXJyCi1jb2xsZWN0aW9uSW5kZXhSYW5nZUVycgk9CS01NzUyCSNjb2xsZWN0aW9uSW5kZXhSYW5nZUVycgotY29sbGVjdGlvbkl0ZW1Ob3RGb3VuZEVycgk9CS01NzUxCSNjb2xsZWN0aW9uSXRlbU5vdEZvdW5kRXJyCi1jb2xsZWN0aW9uSXRlbUxvY2tlZEVycgk9CS01NzUwCSNjb2xsZWN0aW9uSXRlbUxvY2tlZEVycgota05hdk1pc3NpbmdLaW5kU3RyaW5nRXJyCT0JLTU2OTkJI2tOYXZNaXNzaW5nS2luZFN0cmluZ0Vycgota05hdkludmFsaWRDdXN0b21Db250cm9sTWVzc2FnZUVycgk9CS01Njk4CSNrTmF2SW52YWxpZEN1c3RvbUNvbnRyb2xNZXNzYWdlRXJyCi1rTmF2Q3VzdG9tQ29udHJvbE1lc3NhZ2VGYWlsZWRFcnIJPQktNTY5Nwkja05hdkN1c3RvbUNvbnRyb2xNZXNzYWdlRmFpbGVkRXJyCi1rTmF2SW52YWxpZFN5c3RlbUNvbmZpZ0Vycgk9CS01Njk2CSNrTmF2SW52YWxpZFN5c3RlbUNvbmZpZ0Vycgota05hdldyb25nRGlhbG9nQ2xhc3NFcnIJPQktNTY5NQkja05hdldyb25nRGlhbG9nQ2xhc3NFcnIKLWtOYXZXcm9uZ0RpYWxvZ1N0YXRlRXJyCT0JLTU2OTQJI2tOYXZXcm9uZ0RpYWxvZ1N0YXRlRXJyCi1kaWFsb2dOb1RpbWVvdXRFcnIJPQktNTY0MAkjZGlhbG9nTm9UaW1lb3V0RXJyCi1tZW51SW52YWxpZEVycgk9CS01NjIzCSNtZW51IGlzIGludmFsaWQKLW1lbnVJdGVtTm90Rm91bmRFcnIJPQktNTYyMgkjc3BlY2lmaWVkIG1lbnUgaXRlbSB3YXNuJ3QgZm91bmQKLW1lbnVVc2VzU3lzdGVtRGVmRXJyCT0JLTU2MjEJI0dldE1lbnVEZWZpbml0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBtZW51IHVzZXMgdGhlIHN5c3RlbSBNREVGCi1tZW51Tm90Rm91bmRFcnIJPQktNTYyMAkjc3BlY2lmaWVkIG1lbnUgb3IgbWVudSBJRCB3YXNuJ3QgZm91bmQKLXdpbmRvd1dyb25nU3RhdGVFcnIJPQktNTYxNQkjd2luZG93IGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBjdXJyZW50IGFjdGlvbgotd2luZG93TWFuYWdlckludGVybmFsRXJyCT0JLTU2MTQJI3NvbWV0aGluZyByZWFsbHkgd2VpcmQgaGFwcGVuZWQgaW5zaWRlIHRoZSB3aW5kb3cgbWFuYWdlcgotd2luZG93QXR0cmlidXRlc0NvbmZsaWN0RXJyCT0JLTU2MTMJI3Bhc3NlZCBzb21lIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCi13aW5kb3dBdHRyaWJ1dGVJbW11dGFibGVFcnIJPQktNTYxMgkjdHJpZWQgdG8gY2hhbmdlIGF0dHJpYnV0ZXMgd2hpY2ggY2FuJ3QgYmUgY2hhbmdlZAotZXJyV2luZG93RG9lc05vdEZpdE9uc2NyZWVuCT0JLTU2MTEJI0NvbnN0cmFpbldpbmRvd1RvU2NyZWVuIGNvdWxkIG5vdCBtYWtlIHRoZSB3aW5kb3cgZml0IG9uc2NyZWVuCi1lcnJXaW5kb3dOb3RGb3VuZAk9CS01NjEwCSNyZXR1cm5lZCBmcm9tIEZpbmRXaW5kb3dPZkNsYXNzCi1lcnJGbG9hdGluZ1dpbmRvd3NOb3RJbml0aWFsaXplZAk9CS01NjA5CSNjYWxsZWQgSGlkZUZsb2F0aW5nV2luZG93cyBvciBTaG93RmxvYXRpbmdXaW5kb3dzIHdpdGhvdXQgY2FsbGluZyBJbml0RmxvYXRpbmdXaW5kb3dzCi1lcnJXaW5kb3dzQWxyZWFkeUluaXRpYWxpemVkCT0JLTU2MDgJI3RyaWVkIHRvIGNhbGwgSW5pdEZsb2F0aW5nV2luZG93cyB0d2ljZSwgb3IgY2FsbGVkIEluaXRXaW5kb3dzIGFuZCB0aGVuIGZsb2F0aW5nIHdpbmRvd3MKLWVyclVzZXJXYW50c1RvRHJhZ1dpbmRvdwk9CS01NjA3CSNpZiByZXR1cm5lZCBmcm9tIFRyYWNrV2luZG93UHJveHlEcmFnLCB5b3Ugc2hvdWxkIGNhbGwgRHJhZ1dpbmRvdyBvbiB0aGUgd2luZG93Ci1lcnJDb3JydXB0V2luZG93RGVzY3JpcHRpb24JPQktNTYwNgkjdHJpZWQgdG8gbG9hZCBhIGNvcnJ1cHQgd2luZG93IGRlc2NyaXB0aW9uIChzaXplIG9yIHZlcnNpb24gZmllbGRzIGluY29ycmVjdCkKLWVyclVucmVjb2duaXplZFdpbmRvd0NsYXNzCT0JLTU2MDUJI3RyaWVkIHRvIGNyZWF0ZSBhIHdpbmRvdyB3aXRoIGEgYmFkIFdpbmRvd0NsYXNzCi1lcnJXaW5kb3dQcm9wZXJ0eU5vdEZvdW5kCT0JLTU2MDQJI3RyaWVkIHRvIGdldCBhIG5vbmV4aXN0ZW50IHByb3BlcnR5Ci1lcnJJbnZhbGlkV2luZG93UHJvcGVydHkJPQktNTYwMwkjdHJpZWQgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGFnIHdpdGggcHJpdmF0ZSBjcmVhdG9yCi1lcnJXaW5kb3dEb2VzTm90SGF2ZVByb3h5CT0JLTU2MDIJI3RyaWVkIHRvIGRvIHNvbWV0aGluZyByZXF1aXJpbmcgYSBwcm94eSB0byBhIHdpbmRvdyB3aGljaCBkb2VzbtV0IGhhdmUgYSBwcm94eQotZXJyVW5zdXBwb3J0ZWRXaW5kb3dBdHRyaWJ1dGVzRm9yQ2xhc3MJPQktNTYwMQkjdHJpZWQgdG8gY3JlYXRlIGEgd2luZG93IHdpdGggV2luZG93QXR0cmlidXRlcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBXaW5kb3dDbGFzcwotZXJySW52YWxpZFdpbmRvd1B0cgk9CS01NjAwCSN0cmllZCB0byBwYXNzIGEgYmFkIFdpbmRvd1JlZiBhcmd1bWVudAotZ2VzdGFsdExvY2F0aW9uRXJyCT0JLTU1NTMJI2dlc3RhbHQgZnVuY3Rpb24gcHRyIHdhc24ndCBpbiBzeXNoZWFwCi1nZXN0YWx0RHVwU2VsZWN0b3JFcnIJPQktNTU1MgkjdHJpZWQgdG8gYWRkIGFuIGVudHJ5IHRoYXQgYWxyZWFkeSBleGlzdGVkCi1nZXN0YWx0VW5kZWZTZWxlY3RvckVycgk9CS01NTUxCSN1bmRlZmluZWQgc2VsZWN0b3Igd2FzIHBhc3NlZCB0byBHZXN0YWx0Ci1nZXN0YWx0VW5rbm93bkVycgk9CS01NTUwCSN2YWx1ZSByZXR1cm5lZCBpZiBHZXN0YWx0IGRvZXNuJ3Qga25vdyB0aGUgYW5zd2VyCi1lbnZWZXJzVG9vQmlnCT0JLTU1MDIJI1ZlcnNpb24gYmlnZ2VyIHRoYW4gY2FsbCBjYW4gaGFuZGxlCi1lbnZCYWRWZXJzCT0JLTU1MDEJI1ZlcnNpb24gbm9uLXBvc2l0aXZlCi1lbnZOb3RQcmVzZW50CT0JLTU1MDAJI3JldHVybmVkIGJ5IGdsdWUuCi1xdHNBZGRyZXNzQnVzeUVycgk9CS01NDIxCSNxdHNBZGRyZXNzQnVzeUVycgotcXRzQ29ubmVjdGlvbkZhaWxlZEVycgk9CS01NDIwCSNxdHNDb25uZWN0aW9uRmFpbGVkRXJyCi1xdHNUaW1lb3V0RXJyCT0JLTU0MDgJI3F0c1RpbWVvdXRFcnIKLXF0c1Vua25vd25WYWx1ZUVycgk9CS01NDA3CSNxdHNVbmtub3duVmFsdWVFcnIKLXF0c1Rvb011Y2hEYXRhRXJyCT0JLTU0MDYJI3F0c1Rvb011Y2hEYXRhRXJyCi1xdHNVbnN1cHBvcnRlZEZlYXR1cmVFcnIJPQktNTQwNQkjcXRzVW5zdXBwb3J0ZWRGZWF0dXJlRXJyCi1xdHNVbnN1cHBvcnRlZFJhdGVFcnIJPQktNTQwNAkjcXRzVW5zdXBwb3J0ZWRSYXRlRXJyCi1xdHNVbnN1cHBvcnRlZERhdGFUeXBlRXJyCT0JLTU0MDMJI3F0c1Vuc3VwcG9ydGVkRGF0YVR5cGVFcnIKLXF0c0JhZERhdGFFcnIJPQktNTQwMgkjc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIGRhdGEKLXF0c0JhZFN0YXRlRXJyCT0JLTU0MDEJI3F0c0JhZFN0YXRlRXJyCi1xdHNCYWRTZWxlY3RvckVycgk9CS01NDAwCSNxdHNCYWRTZWxlY3RvckVycgotZXJySUFFbmRPZlRleHRSdW4JPQktNTM4OAkjZXJySUFFbmRPZlRleHRSdW4KLWVycklBVGV4dEV4dHJhY3Rpb25FcnIJPQktNTM4NwkjZXJySUFUZXh0RXh0cmFjdGlvbkVycgotZXJySUFJbnZhbGlkRG9jdW1lbnQJPQktNTM4NgkjZXJySUFJbnZhbGlkRG9jdW1lbnQKLWVycklBQ2FuY2VsZWQJPQktNTM4NQkjZXJySUFDYW5jZWxlZAotZXJySUFCdWZmZXJUb29TbWFsbAk9CS01Mzg0CSNlcnJJQUJ1ZmZlclRvb1NtYWxsCi1lcnJJQU5vTW9yZUl0ZW1zCT0JLTUzODMJI2VycklBTm9Nb3JlSXRlbXMKLWVycklBUGFyYW1FcnIJPQktNTM4MgkjZXJySUFQYXJhbUVycgotZXJySUFBbGxvY2F0aW9uRXJyCT0JLTUzODEJI2VycklBQWxsb2NhdGlvbkVycgotZXJySUFVbmtub3duRXJyCT0JLTUzODAJI2VycklBVW5rbm93bkVycgotaHJVUkxOb3RIYW5kbGVkRXJyCT0JLTUzNjMJI2hyVVJMTm90SGFuZGxlZEVycgotaHJVbmFibGVUb1Jlc2l6ZUhhbmRsZUVycgk9CS01MzYyCSNoclVuYWJsZVRvUmVzaXplSGFuZGxlRXJyCi1ock1pc2NlbGxhbmVvdXNFeGNlcHRpb25FcnIJPQktNTM2MQkjaHJNaXNjZWxsYW5lb3VzRXhjZXB0aW9uRXJyCi1ockhUTUxSZW5kZXJpbmdMaWJOb3RJbnN0YWxsZWRFcnIJPQktNTM2MAkjaHJIVE1MUmVuZGVyaW5nTGliTm90SW5zdGFsbGVkRXJyCi1lcnJDYW5ub3RVbmRvCT0JLTUyNTMJI2VyckNhbm5vdFVuZG8KLWVyck5vbkNvbnRpdW91c0F0dHJpYnV0ZQk9CS01MjUyCSNlcnJOb25Db250aXVvdXNBdHRyaWJ1dGUKLWVyclVua25vd25FbGVtZW50CT0JLTUyNTEJI2VyclVua25vd25FbGVtZW50Ci1lcnJSZWFkT25seVRleHQJPQktNTI1MAkjZXJyUmVhZE9ubHlUZXh0Ci1lcnJFbXB0eVNjcmFwCT0JLTUyNDkJI2VyckVtcHR5U2NyYXAKLWVyck5vSGlsaXRlVGV4dAk9CS01MjQ4CSNlcnJOb0hpbGl0ZVRleHQKLWVyck9mZnNldE5vdE9uRWxlbWVudEJvdW5kYXkJPQktNTI0NwkjZXJyT2Zmc2V0Tm90T25FbGVtZW50Qm91bmRheQotZXJySW52YWxpZFJhbmdlCT0JLTUyNDYJI2VyckludmFsaWRSYW5nZQotZXJySXRlcmF0b3JSZWFjaGVkRW5kCT0JLTUyNDUJI2Vyckl0ZXJhdG9yUmVhY2hlZEVuZAotZXJyRW5naW5lTm90Rm91bmQJPQktNTI0NAkjZXJyRW5naW5lTm90Rm91bmQKLWVyckFscmVhZHlJbkltYWdpbmdNb2RlCT0JLTUyNDMJI2VyckFscmVhZHlJbkltYWdpbmdNb2RlCi1lcnJOb3RJbkltYWdpbmdNb2RlCT0JLTUyNDIJI2Vyck5vdEluSW1hZ2luZ01vZGUKLWVyck1hcmdpbldpbGxsTm90Rml0CT0JLTUyNDEJI2Vyck1hcmdpbldpbGxsTm90Rml0Ci1lcnJVbmtub3duQXR0cmlidXRlVGFnCT0JLTUyNDAJI2VyclVua25vd25BdHRyaWJ1dGVUYWcKLWFmcFNhbWVOb2RlRXJyCT0JLTUwNjMJI0FuIEF0dGVtcHQgd2FzIG1hZGUgdG8gY29ubmVjdCB0byBhIGZpbGUgc2VydmVyIHJ1bm5pbmcgb24gdGhlIHNhbWUgbWFjaGluZQotYWZwQWxyZWFkeU1vdW50ZWQJPQktNTA2MgkjVGhlIHZvbHVtZSBpcyBhbHJlYWR5IG1vdW50ZWQKLWFmcENhbnRNb3VudE1vcmVTcnZyZQk9CS01MDYxCSNUaGUgTWF4aW11bSBudW1iZXIgb2Ygc2VydmVyIGNvbm5lY3Rpb25zIGhhcyBiZWVuIHJlYWNoZWQKLWFmcEJhZERpcklEVHlwZQk9CS01MDYwCSNhZnBCYWREaXJJRFR5cGUKLWFmcENhbGxOb3RBbGxvd2VkCT0JLTUwNDgJI1RoZSBzZXJ2ZXIga25vd3Mgd2hhdCB5b3Ugd2FudGVkIHRvIGRvLCBidXQgd29uJ3QgbGV0IHlvdSBkbyBpdCBqdXN0IG5vdwotYWZwQWxyZWFkeUxvZ2dlZEluRXJyCT0JLTUwNDcJI1VzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBidXQgaXMgYWxyZWFkeSBsb2dnZWQgaW4gZnJvbSBhbm90aGVyIG1hY2hpbmUgKGFuZCB0aGF0J3Mgbm90IGFsbG93ZWQgb24gdGhpcyBzZXJ2ZXIpCi1hZnBQd2RQb2xpY3lFcnIJPQktNTA0NgkjUGFzc3dvcmQgZG9lcyBub3QgY29uZm9ybSB0byBzZXJ2ZXJzIHBhc3N3b3JkIHBvbGljeQotYWZwUHdkTmVlZHNDaGFuZ2VFcnIJPQktNTA0NQkjVGhlIHBhc3N3b3JkIG5lZWRzIHRvIGJlIGNoYW5nZWQKLWFmcEluc2lkZVRyYXNoRXJyCT0JLTUwNDQJI1RoZSBmb2xkZXIgYmVpbmcgc2hhcmVkIGlzIGluc2lkZSB0aGUgdHJhc2ggZm9sZGVyIE9SIHRoZSBzaGFyZWQgZm9sZGVyIGlzIGJlaW5nIG1vdmVkIGludG8gdGhlIHRyYXNoIGZvbGRlcgotYWZwSW5zaWRlU2hhcmVkRXJyCT0JLTUwNDMJI1RoZSBmb2xkZXIgYmVpbmcgc2hhcmVkIGlzIGluc2lkZSBhIHNoYXJlZCBmb2xkZXIgT1IgdGhlIGZvbGRlciBjb250YWlucyBhIHNoYXJlZCBmb2xkZXIgYW5kIGlzIGJlaW5nIG1vdmVkIGludG8gYSBzaGFyZWQgZm9sZGVyCi1hZnBQd2RFeHBpcmVkRXJyCT0JLTUwNDIJI1RoZSBwYXNzd29yZCBiZWluZyB1c2VkIGlzIHRvbyBvbGQ6IHRoaXMgcmVxdWlyZXMgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSBwYXNzd29yZCBiZWZvcmUgbG9nLWluIGNhbiBjb250aW51ZQotYWZwUHdkVG9vU2hvcnRFcnIJPQktNTA0MQkjVGhlIHBhc3N3b3JkIGJlaW5nIHNldCBpcyB0b28gc2hvcnQ6IHRoZXJlIGlzIGEgbWluaW11bSBsZW5ndGggdGhhdCBtdXN0IGJlIG1ldCBvciBleGNlZWRlZAotYWZwUHdkU2FtZUVycgk9CS01MDQwCSNTb21lb25lIHRyaWVkIHRvIGNoYW5nZSB0aGVpciBwYXNzd29yZCB0byB0aGUgc2FtZSBwYXNzd29yZCBvbiBhIG1hbnRhZG9yeSBwYXNzd29yZCBjaGFuZ2UKLWFmcEJhZElERXJyCT0JLTUwMzkJI2FmcEJhZElERXJyCi1hZnBTYW1lT2JqZWN0RXJyCT0JLTUwMzgJI2FmcFNhbWVPYmplY3RFcnIKLWFmcENhdGFsb2dDaGFuZ2VkCT0JLTUwMzcJI2FmcENhdGFsb2dDaGFuZ2VkCi1hZnBEaWZmVm9sRXJyCT0JLTUwMzYJI2FmcERpZmZWb2xFcnIKLWFmcElERXhpc3RzCT0JLTUwMzUJI2FmcElERXhpc3RzCi1hZnBJRE5vdEZvdW5kCT0JLTUwMzQJI2FmcElETm90Rm91bmQKLWFmcENvbnRhaW5zU2hhcmVkRXJyCT0JLTUwMzMJI3RoZSBmb2xkZXIgYmVpbmcgc2hhcmVkIGNvbnRhaW5zIGEgc2hhcmVkIGZvbGRlcgotYWZwT2JqZWN0TG9ja2VkCT0JLTUwMzIJI09iamVjdCBpcyBNL1IvRC9XIGluaGliaXRlZAotYWZwVm9sTG9ja2VkCT0JLTUwMzEJI1ZvbHVtZSBpcyBSZWFkLU9ubHkKLWFmcEljb25UeXBlRXJyb3IJPQktNTAzMAkjSWNvbiBzaXplIHNwZWNpZmllZCBkaWZmZXJlbnQgZnJvbSBleGlzdGluZyBpY29uIHNpemUKLWFmcERpck5vdEZvdW5kCT0JLTUwMjkJI1Vua25vd24gZGlyZWN0b3J5IHNwZWNpZmllZAotYWZwQ2FudFJlbmFtZQk9CS01MDI4CSNBRlBSZW5hbWUgY2Fubm90IHJlbmFtZSB2b2x1bWUKLWFmcFNlcnZlckdvaW5nRG93bgk9CS01MDI3CSNTZXJ2ZXIgaXMgc2h1dHRpbmcgZG93bgotYWZwVG9vTWFueUZpbGVzT3Blbgk9CS01MDI2CSNNYXhpbXVtIG9wZW4gZmlsZSBjb3VudCByZWFjaGVkCi1hZnBPYmplY3RUeXBlRXJyCT0JLTUwMjUJI0ZpbGUvRGlyZWN0b3J5IHNwZWNpZmllZCB3aGVyZSBEaXJlY3RvcnkvRmlsZSBleHBlY3RlZAotYWZwQ2FsbE5vdFN1cHBvcnRlZAk9CS01MDI0CSNVbnN1cHBvcnRlZCBBRlAgY2FsbCB3YXMgbWFkZQotYWZwVXNlck5vdEF1dGgJPQktNTAyMwkjTm8gQUZQTG9naW4gY2FsbCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFkZSBmb3IgdGhpcyBzZXNzaW9uCi1hZnBTZXNzQ2xvc2VkCT0JLTUwMjIJI1Nlc3Npb24gY2xvc2VkCi1hZnBSYW5nZU92ZXJsYXAJPQktNTAyMQkjU29tZSBvciBhbGwgb2YgcmFuZ2UgYWxyZWFkeSBsb2NrZWQgYnkgc2FtZSB1c2VyCi1hZnBSYW5nZU5vdExvY2tlZAk9CS01MDIwCSNUcmllZCB0byB1bmxvY2sgcmFuZ2UgdGhhdCB3YXMgbm90IGxvY2tlZCBieSB1c2VyCi1hZnBQYXJtRXJyCT0JLTUwMTkJI0Egc3BlY2lmaWVkIHBhcmFtZXRlciB3YXMgb3V0IG9mIGFsbG93YWJsZSByYW5nZQotYWZwT2JqZWN0Tm90Rm91bmQJPQktNTAxOAkjU3BlY2lmaWVkIGZpbGUgb3IgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Ci1hZnBPYmplY3RFeGlzdHMJPQktNTAxNwkjU3BlY2lmaWVkIGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzCi1hZnBOb1NlcnZlcgk9CS01MDE2CSNTZXJ2ZXIgbm90IHJlc3BvbmRpbmcKLWFmcE5vTW9yZUxvY2tzCT0JLTUwMTUJI01heGltdW0gbG9jayBsaW1pdCByZWFjaGVkCi1hZnBNaXNjRXJyCT0JLTUwMTQJI1VuZXhwZWN0ZWQgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGV4ZWN1dGlvbgotYWZwTG9ja0Vycgk9CS01MDEzCSNTb21lIG9yIGFsbCBvZiByZXF1ZXN0ZWQgcmFuZ2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgdXNlcgotYWZwSXRlbU5vdEZvdW5kCT0JLTUwMTIJI1Vua25vd24gVXNlck5hbWUvVXNlcklEIG9yIG1pc3NpbmcgY29tbWVudC9BUFBMIGVudHJ5Ci1hZnBGbGF0Vm9sCT0JLTUwMTEJI0Nhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IG9uIHNwZWNpZmllZCB2b2x1bWUKLWFmcEZpbGVCdXN5CT0JLTUwMTAJI0Nhbm5vdCBkZWxldGUgYW4gb3BlbiBmaWxlCi1hZnBFb2ZFcnJvcgk9CS01MDA5CSNSZWFkIGJleW9uZCBsb2dpY2FsIGVuZC1vZi1maWxlCi1hZnBEaXNrRnVsbAk9CS01MDA4CSNJbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSBvbiB2b2x1bWUgZm9yIG9wZXJhdGlvbgotYWZwRGlyTm90RW1wdHkJPQktNTAwNwkjQ2Fubm90IGRlbGV0ZSBub24tZW1wdHkgZGlyZWN0b3J5Ci1hZnBEZW55Q29uZmxpY3QJPQktNTAwNgkjU3BlY2lmaWVkIG9wZW4vZGVueSBtb2RlcyBjb25mbGljdCB3aXRoIGN1cnJlbnQgb3BlbiBtb2RlcwotYWZwQ2FudE1vdmUJPQktNTAwNQkjTW92ZSBkZXN0aW5hdGlvbiBpcyBvZmZzcHJpbmcgb2Ygc291cmNlLCBvciByb290IHdhcyBzcGVjaWZpZWQKLWFmcEJpdG1hcEVycgk9CS01MDA0CSNCaXRtYXAgY29udGFpbmVkIGJpdHMgdW5kZWZpbmVkIGZvciBjYWxsCi1hZnBCYWRWZXJzTnVtCT0JLTUwMDMJI1Vua25vd24gQUZQIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIHNwZWNpZmllZAotYWZwQmFkVUFNCT0JLTUwMDIJI1Vua25vd24gdXNlciBhdXRoZW50aWNhdGlvbiBtZXRob2Qgc3BlY2lmaWVkCi1hZnBBdXRoQ29udGludWUJPQktNTAwMQkjRnVydGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBjb21wbGV0ZSBBRlBMb2dpbiBjYWxsCi1hZnBBY2Nlc3NEZW5pZWQJPQktNTAwMAkjSW5zdWZmaWNpZW50IGFjY2VzcyBwcml2aWxlZ2VzIGZvciBvcGVyYXRpb24KLWlsbGVnYWxTY3JhcEZsYXZvclNpemVFcnIJPQktNDk5OQkjaWxsZWdhbFNjcmFwRmxhdm9yU2l6ZUVycgotaWxsZWdhbFNjcmFwRmxhdm9yVHlwZUVycgk9CS00OTk4CSNpbGxlZ2FsU2NyYXBGbGF2b3JUeXBlRXJyCi1pbGxlZ2FsU2NyYXBGbGF2b3JGbGFnc0Vycgk9CS00OTk3CSNpbGxlZ2FsU2NyYXBGbGF2b3JGbGFnc0Vycgotc2NyYXBGbGF2b3JTaXplTWlzbWF0Y2hFcnIJPQktNDk5Ngkjc2NyYXBGbGF2b3JTaXplTWlzbWF0Y2hFcnIKLXNjcmFwRmxhdm9yRmxhZ3NNaXNtYXRjaEVycgk9CS00OTk1CSNzY3JhcEZsYXZvckZsYWdzTWlzbWF0Y2hFcnIKLW5pbFNjcmFwRmxhdm9yRGF0YUVycgk9CS00OTk0CSNuaWxTY3JhcEZsYXZvckRhdGFFcnIKLW5vU2NyYXBQcm9taXNlS2VlcGVyRXJyCT0JLTQ5OTMJI25vU2NyYXBQcm9taXNlS2VlcGVyRXJyCi1zY3JhcFByb21pc2VOb3RLZXB0RXJyCT0JLTQ5OTIJI3NjcmFwUHJvbWlzZU5vdEtlcHRFcnIKLXByb2Nlc3NTdGF0ZUluY29ycmVjdEVycgk9CS00OTkxCSNwcm9jZXNzU3RhdGVJbmNvcnJlY3RFcnIKLWJhZFNjcmFwUmVmRXJyCT0JLTQ5OTAJI2JhZFNjcmFwUmVmRXJyCi1kdXBsaWNhdGVTY3JhcEZsYXZvckVycgk9CS00OTg5CSNkdXBsaWNhdGVTY3JhcEZsYXZvckVycgotaW50ZXJuYWxTY3JhcEVycgk9CS00OTg4CSNpbnRlcm5hbFNjcmFwRXJyCi1jb3JlRm91bmRhdGlvblVua25vd25FcnIJPQktNDk2MAkjY29yZUZvdW5kYXRpb25Vbmtub3duRXJyCi1iYWRSb3V0aW5nU2l6ZUVycgk9CS00Mjc2CSNiYWRSb3V0aW5nU2l6ZUVycgotcm91dGluZ05vdEZvdW5kRXJyCT0JLTQyNzUJI3JvdXRpbmdOb3RGb3VuZEVycgotZHVwbGljYXRlUm91dGluZ0Vycgk9CS00Mjc0CSNkdXBsaWNhdGVSb3V0aW5nRXJyCi1pbnZhbGlkRm9sZGVyVHlwZUVycgk9CS00MjczCSNpbnZhbGlkRm9sZGVyVHlwZUVycgotbm9Nb3JlRm9sZGVyRGVzY0Vycgk9CS00MjcyCSNub01vcmVGb2xkZXJEZXNjRXJyCi1kdXBsaWNhdGVGb2xkZXJEZXNjRXJyCT0JLTQyNzEJI2R1cGxpY2F0ZUZvbGRlckRlc2NFcnIKLWJhZEZvbGRlckRlc2NFcnIJPQktNDI3MAkjYmFkRm9sZGVyRGVzY0VycgotY21DYW50R2FtdXRDaGVja0Vycm9yCT0JLTQyMTcJI0dhbW11dCBjaGVja2luZyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgQ29sb3JXb3JsZAotY21OYW1lZENvbG9yTm90Rm91bmQJPQktNDIxNgkjTmFtZWRDb2xvciBub3QgZm91bmQKLWNtQ2FudENvcHlNb2RpZmllZFYxUHJvZmlsZQk9CS00MjE1CSNJbGxlZ2FsIHRvIGNvcHkgdmVyc2lvbiAxIHByb2ZpbGVzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkCi1jbVJhbmdlT3ZlckZsb3cJPQktNDIxNAkjQ29sb3IgY29udmVyc2lvbiB3YXJuaW5nIHRoYXQgc29tZSBvdXRwdXQgY29sb3IgdmFsdWVzIG92ZXIvdW5kZXJmbG93ZWQgYW5kIHdlcmUgY2xpcHBlZAotY21JbnZhbGlkUHJvZmlsZUNvbW1lbnQJPQktNDIxMwkjQmFkIFByb2ZpbGUgY29tbWVudCBkdXJpbmcgZHJhd3BpY3R1cmUKLWNtTm9HRGV2aWNlc0Vycm9yCT0JLTQyMTIJI0JlZ2luL0VuZCBNYXRjaGluZyAtLSBubyBnZGV2aWNlcyBhdmFpbGFibGUKLWNtSW52YWxpZERzdE1hcAk9CS00MjExCSNEZXN0aW5hdGlvbiBwaXgvYml0IG1hcCB3YXMgaW52YWxpZAotY21JbnZhbGlkU3JjTWFwCT0JLTQyMTAJI1NvdXJjZSBwaXgvYml0IG1hcCB3YXMgaW52YWxpZAotY21JbnZhbGlkQ29sb3JTcGFjZQk9CS00MjA5CSNQcm9maWxlIGNvbG9yc3BhY2UgZG9lcyBub3QgbWF0Y2ggYml0bWFwIHR5cGUKLWNtRXJySW5jb21wYXRpYmxlUHJvZmlsZQk9CS00MjA4CSNPdGhlciBDb2xvclN5bmMgRXJyb3JzCi1jbVNlYXJjaEVycm9yCT0JLTQyMDcJI2NtU2VhcmNoRXJyb3IKLWNtSW52YWxpZFNlYXJjaAk9CS00MjA2CSNCYWQgU2VhcmNoIEhhbmRsZQotY21JbnZhbGlkUHJvZmlsZUxvY2F0aW9uCT0JLTQyMDUJI09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHByb2ZpbGUgbG9jYXRpb24KLWNtSW52YWxpZFByb2ZpbGUJPQktNDIwNAkjQSBQcm9maWxlIG11c3QgY29udGFpbiBhICdjczEgJyB0YWcgdG8gYmUgdmFsaWQKLWNtRmF0YWxQcm9maWxlRXJyCT0JLTQyMDMJI2NtRmF0YWxQcm9maWxlRXJyCi1jbUNhbnREZWxldGVFbGVtZW50CT0JLTQyMDIJI2NtQ2FudERlbGV0ZUVsZW1lbnQKLWNtSW5kZXhSYW5nZUVycgk9CS00MjAxCSNUYWcgaW5kZXggb3V0IG9mIHJhbmdlCi1rTlNMSW5pdGlhbGl6YXRpb25GYWlsZWQJPQktNDIwMAkjVU5BQkxFIFRPIElOSVRJQUxJWkUgVEhFIE1BTkFHRVIhISEhISBETyBOT1QgQ09OVElOVUUhISEhCi1rTlNMTm90SW5pdGlhbGl6ZWQJPQktNDE5OQkja05TTE5vdEluaXRpYWxpemVkCi1rTlNMSW5zdWZmaWNpZW50U3lzVmVyCT0JLTQxOTgJI2tOU0xJbnN1ZmZpY2llbnRTeXNWZXIKLWtOU0xJbnN1ZmZpY2llbnRPVFZlcgk9CS00MTk3CSNrTlNMSW5zdWZmaWNpZW50T1RWZXIKLWtOU0xOb0VsZW1lbnRzSW5MaXN0CT0JLTQxOTYJI2tOU0xOb0VsZW1lbnRzSW5MaXN0Ci1rTlNMQmFkUmVmZXJlbmNlRXJyCT0JLTQxOTUJI2tOU0xCYWRSZWZlcmVuY2VFcnIKLWtOU0xCYWRTZXJ2aWNlVHlwZUVycgk9CS00MTk0CSNrTlNMQmFkU2VydmljZVR5cGVFcnIKLWtOU0xCYWREYXRhVHlwZUVycgk9CS00MTkzCSNrTlNMQmFkRGF0YVR5cGVFcnIKLWtOU0xCYWROZXRDb25uZWN0aW9uCT0JLTQxOTIJI2tOU0xCYWROZXRDb25uZWN0aW9uCi1rTlNMTm9TdXBwb3J0Rm9yU2VydmljZQk9CS00MTkxCSNrTlNMTm9TdXBwb3J0Rm9yU2VydmljZQota05TTEludmFsaWRQbHVnaW5TcGVjCT0JLTQxOTAJI2tOU0xJbnZhbGlkUGx1Z2luU3BlYwota05TTFJlcXVlc3RCdWZmZXJBbHJlYWR5SW5MaXN0CT0JLTQxODkJI2tOU0xSZXF1ZXN0QnVmZmVyQWxyZWFkeUluTGlzdAota05TTE5vQ29udGV4dEF2YWlsYWJsZQk9CS00MTg4CSMoQ29udGludWVMb29rdXAgZnVuY3Rpb24gcHRyIGludmFsaWQpCi1rTlNMQnVmZmVyVG9vU21hbGxGb3JEYXRhCT0JLTQxODcJIyhDbGllbnQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgZGF0YSBmcm9tIHBsdWdpbikKLWtOU0xDYW5ub3RDb250aW51ZUxvb2t1cAk9CS00MTg2CSMoQ2FuJ3QgY29udGludWUgbG9va3VwOyBlcnJvciBvciBiYWQgc3RhdGUpCi1rTlNMQmFkQ2xpZW50SW5mb1B0cgk9CS00MTg1CSMobmlsIENsaWVudEFzeW5jSW5mb1B0cjsgbm8gcmVmZXJlbmNlIGF2YWlsYWJsZSkKLWtOU0xOdWxsTGlzdFB0cgk9CS00MTg0CSMoY2xpZW50IGlzIHRyeWluZyB0byBhZGQgaXRlbXMgdG8gYSBuaWwgbGlzdCkKLWtOU0xCYWRQcm90b2NvbFR5cGVFcnIJPQktNDE4MwkjKGNsaWVudCBpcyB0cnlpbmcgdG8gYWRkIGEgbnVsbCBwcm90b2NvbCB0eXBlKQota05TTFBsdWdpbkxvYWRGYWlsZWQJPQktNDE4MgkjKG1hbmFnZXIgdW5hYmxlIHRvIGxvYWQgb25lIG9mIHRoZSBwbHVnaW5zKQota05TTE5vUGx1Z2luc0ZvdW5kCT0JLTQxODEJIyhtYW5hZ2VyIGRpZG4ndCBmaW5kIGFueSB2YWxpZCBwbHVnaW5zIHRvIGxvYWQpCi1rTlNMU2VhcmNoQWxyZWFkeUluUHJvZ3Jlc3MJPQktNDE4MAkjKHlvdSBjYW4gb25seSBoYXZlIG9uZSBvbmdvaW5nIHNlYXJjaCBwZXIgY2xpZW50UmVmKQota05TTE5vUGx1Z2luc0ZvclNlYXJjaAk9CS00MTc5CSMobm8gcGx1Z2lucyB3aWxsIHJlc3BvbmQgdG8gc2VhcmNoIHJlcXVlc3Q7IGJhZCBwcm90b2NvbChzKT8pCi1rTlNMTnVsbE5laWdoYm9yaG9vZFB0cgk9CS00MTc4CSMoY2xpZW50IHBhc3NlZCBhIG51bGwgbmVpZ2hib3Job29kIHB0cikKLWtOU0xTb21lUGx1Z2luc0ZhaWxlZFRvTG9hZAk9CS00MTc3CSMob25lIG9yIG1vcmUgcGx1Z2lucyBmYWlsZWQgdG8gbG9hZCwgYnV0IGF0IGxlYXN0IG9uZSBkaWQgbG9hZDsgdGhpcyBlcnJvciBpc24ndCBmYXRhbCkKLWtOU0xFcnJOdWxsUHRyRXJyb3IJPQktNDE3Ngkja05TTEVyck51bGxQdHJFcnJvcgota05TTE5vdEltcGxlbWVudGVkWWV0CT0JLTQxNzUJI2tOU0xOb3RJbXBsZW1lbnRlZFlldAota05TTFVJTGlicmFyeU5vdEF2YWlsYWJsZQk9CS00MTc0CSNUaGUgTlNMIFVJIExpYnJhcnkgbmVlZHMgdG8gYmUgaW4gdGhlIEV4dGVuc2lvbnMgRm9sZGVyCi1rTlNMTm9DYXJib25MaWIJPQktNDE3Mwkja05TTE5vQ2FyYm9uTGliCi1rTlNMQmFkVVJMU3ludGF4CT0JLTQxNzIJI1VSTCBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMKLWtOU0xTY2hlZHVsZXJFcnJvcgk9CS00MTcxCSNBIGN1c3RvbSB0aHJlYWQgcm91dGluZSBlbmNvdW50ZXJlZCBhbiBlcnJvcgota05TTDY4a0NvbnRleHROb3RTdXBwb3J0ZWQJPQktNDE3MAkjbm8gNjhrIGFsbG93ZWQKLW5vSGVscEZvckl0ZW0JPQktNDAwOQkjbm9IZWxwRm9ySXRlbQotYmFkUHJvZmlsZUVycm9yCT0JLTQwMDgJI2JhZFByb2ZpbGVFcnJvcgotY29sb3JTeW5jTm90SW5zdGFsbGVkCT0JLTQwMDcJI2NvbG9yU3luY05vdEluc3RhbGxlZAotcGlja2VyQ2FudExpdmUJPQktNDAwNgkjcGlja2VyQ2FudExpdmUKLWNhbnRMb2FkUGFja2FnZQk9CS00MDA1CSNjYW50TG9hZFBhY2thZ2UKLWNhbnRDcmVhdGVQaWNrZXJXaW5kb3cJPQktNDAwNAkjY2FudENyZWF0ZVBpY2tlcldpbmRvdwotY2FudExvYWRQaWNrZXIJPQktNDAwMwkjY2FudExvYWRQaWNrZXIKLXBpY2tlclJlc291cmNlRXJyb3IJPQktNDAwMgkjcGlja2VyUmVzb3VyY2VFcnJvcgotcmVxdWlyZWRGbGFnc0RvbnRNYXRjaAk9CS00MDAxCSNyZXF1aXJlZEZsYWdzRG9udE1hdGNoCi1maXJzdFBpY2tlckVycm9yCT0JLTQwMDAJI2ZpcnN0UGlja2VyRXJyb3IKLWtPVFBvcnRMb3N0Q29ubmVjdGlvbgk9CS0zMjg1CSMKLWtPVFVzZXJSZXF1ZXN0ZWRFcnIJPQktMzI4NAkjCi1rT1RDb25maWd1cmF0aW9uQ2hhbmdlZEVycgk9CS0zMjgzCSMKLWtPVEJhZENvbmZpZ3VyYXRpb25FcnIJPQktMzI4MgkjCi1rT1RQb3J0V2FzRWplY3RlZEVycgk9CS0zMjgxCSMKLWtPVFBvcnRIYXNEaWVkRXJyCT0JLTMyODAJIwota09UQ2xpZW50Tm90SW5pdHRlZEVycgk9CS0zMjc5CSMKLWtFTk9NU0dFcnIJPQktMzI3OAkjCi1rRVNSQ0hFcnIJPQktMzI3NwkjCi1rRUlOUFJPR1JFU1NFcnIJPQktMzI3NgkjCi1rRU5PREFUQUVycgk9CS0zMjc1CSMKLWtFTk9TVFJFcnIJPQktMzI3NAkjCi1rRUNBTkNFTEVycgk9CS0zMjczCSMKLWtFQkFETVNHRXJyCT0JLTMyNzIJIwota0VOT1NSRXJyCT0JLTMyNzEJIwota0VUSU1FRXJyCT0JLTMyNzAJIwota0VQUk9UT0Vycgk9CS0zMjY5CSOCgoIgZmlsbCBvdXQgbWlzc2luZyBjb2RlcyCCgoIKLWtFSE9TVFVOUkVBQ0hFcnIJPQktMzI2NAkjTm8gcm91dGUgdG8gaG9zdAota0VIT1NURE9XTkVycgk9CS0zMjYzCSNIb3N0IGlzIGRvd24KLWtFQ09OTlJFRlVTRURFcnIJPQktMzI2MAkjQ29ubmVjdGlvbiByZWZ1c2VkCi1rRVRJTUVET1VURXJyCT0JLTMyNTkJI0Nvbm5lY3Rpb24gdGltZWQgb3V0Ci1rRVRPT01BTllSRUZTRXJyCT0JLTMyNTgJI1RvbyBtYW55IHJlZmVyZW5jZXM6IGNhbid0IHNwbGljZQota0VTSFVURE9XTkVycgk9CS0zMjU3CSNDYW4ndCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgota0VOT1RDT05ORXJyCT0JLTMyNTYJI1NvY2tldCBpcyBub3QgY29ubmVjdGVkCi1rRUlTQ09OTkVycgk9CS0zMjU1CSNTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQKLWtFTk9CVUZTRXJyCT0JLTMyNTQJI05vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUKLWtFQ09OTlJFU0VURXJyCT0JLTMyNTMJI0Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgota0VDT05OQUJPUlRFREVycgk9CS0zMjUyCSNTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydAota0VORVRSRVNFVEVycgk9CS0zMjUxCSNOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBvbiByZXNldAota0VORVRVTlJFQUNIRXJyCT0JLTMyNTAJI05ldHdvcmsgaXMgdW5yZWFjaGFibGUKLWtFTkVURE9XTkVycgk9CS0zMjQ5CSNOZXR3b3JrIGlzIGRvd24KLWtFQUREUk5PVEFWQUlMRXJyCT0JLTMyNDgJI0Nhbid0IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcwota0VBRERSSU5VU0VFcnIJPQktMzI0NwkjQWRkcmVzcyBhbHJlYWR5IGluIHVzZQota0VPUE5PVFNVUFBFcnIJPQktMzI0NAkjT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gc29ja2V0Ci1rRVNPQ0tUTk9TVVBQT1JURXJyCT0JLTMyNDMJI1NvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQKLWtFUFJPVE9OT1NVUFBPUlRFcnIJPQktMzI0MgkjUHJvdG9jb2wgbm90IHN1cHBvcnRlZAota0VOT1BST1RPT1BURXJyCT0JLTMyNDEJI1Byb3RvY29sIG5vdCBhdmFpbGFibGUKLWtFUFJPVE9UWVBFRXJyCT0JLTMyNDAJI1Byb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldAota0VNU0dTSVpFRXJyCT0JLTMyMzkJI01lc3NhZ2UgdG9vIGxvbmcKLWtFREVTVEFERFJSRVFFcnIJPQktMzIzOAkjRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZAota0VOT1RTT0NLRXJyCT0JLTMyMzcJI1NvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldAota0VBTFJFQURZRXJyCT0JLTMyMzYJIwota0VXT1VMREJMT0NLRXJyCT0JLTMyMzQJI0NhbGwgd291bGQgYmxvY2ssIHNvIHdhcyBhYm9ydGVkCi1rRVJBTkdFRXJyCT0JLTMyMzMJI01lc3NhZ2Ugc2l6ZSB0b28gbGFyZ2UgZm9yIFNUUkVBTQota0VQSVBFRXJyCT0JLTMyMzEJI0Jyb2tlbiBwaXBlCi1rRU5PVFRZRXJyCT0JLTMyMjQJI05vdCBhIGNoYXJhY3RlciBkZXZpY2UKLWtFSU5WQUxFcnIJPQktMzIyMQkjSW52YWxpZCBhcmd1bWVudAota0VOT0RFVkVycgk9CS0zMjE4CSNObyBzdWNoIGRldmljZQota09URHVwbGljYXRlRm91bmRFcnIJPQktMzIxNgkjT1QgZ2VuZXJpYyBkdXBsaWNhdGUgZm91bmQgZXJyb3IKLWtFQlVTWUVycgk9CS0zMjE1CSNEZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeQota0VGQVVMVEVycgk9CS0zMjEzCSNCYWQgYWRkcmVzcwota0VBQ0NFU0Vycgk9CS0zMjEyCSNQZXJtaXNzaW9uIGRlbmllZAota09UT3V0T2ZNZW1vcnlFcnIJPQktMzIxMQkjT1QgcmFuIG91dCBvZiBtZW1vcnksIG1heSBiZSBhIHRlbXBvcmFyeQota0VBR0FJTkVycgk9CS0zMjEwCSNUcnkgb3BlcmF0aW9uIGFnYWluIGxhdGVyCi1rRUJBREZFcnIJPQktMzIwOAkjQmFkIGZpbGUgbnVtYmVyCi1rRU5YSU9FcnIJPQktMzIwNQkjTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwota0VJT0Vycgk9CS0zMjA0CSNJL08gZXJyb3IKLWtFSU5UUkVycgk9CS0zMjAzCSNJbnRlcnJ1cHRlZCBzeXN0ZW0gc2VydmljZQota0VOT1JTUkNFcnIJPQktMzIwMgkjTm8gc3VjaCByZXNvdXJjZQota09UTm90Rm91bmRFcnIJPQktMzIwMQkjT1QgZ2VuZXJpYyBub3QgZm91bmQgZXJyb3IKLWtFUEVSTUVycgk9CS0zMjAwCSNQZXJtaXNzaW9uIGRlbmllZAota09UQ2FuY2VsZWRFcnIJPQktMzE4MAkjWFRJMk9TU3RhdHVzKFRDQU5DRUxFRCkgVGhlIGNvbW1hbmQgd2FzIGNhbmNlbGxlZAota09UQmFkU3luY0Vycgk9CS0zMTc5CSNYVEkyT1NTdGF0dXMoVEJBRFNZTkMpIEEgc3luY2hyb25vdXMgY2FsbCBhdCBpbnRlcnJ1cHQgdGltZQota09UUHJvdG9jb2xFcnIJPQktMzE3OAkjWFRJMk9TU3RhdHVzKFRQUk9UTykgQW4gdW5zcGVjaWZpZWQgcHJvdmlkZXIgZXJyb3Igb2NjdXJyZWQKLWtPVFFGdWxsRXJyCT0JLTMxNzcJI1hUSTJPU1N0YXR1cyhUUUZVTEwpCi1rT1RSZXNBZGRyZXNzRXJyCT0JLTMxNzYJI1hUSTJPU1N0YXR1cyhUUkVTQUREUikKLWtPVFJlc1FMZW5FcnIJPQktMzE3NQkjWFRJMk9TU3RhdHVzKFRSRVNRTEVOKQota09UUHJvdmlkZXJNaXNtYXRjaEVycgk9CS0zMTc0CSNYVEkyT1NTdGF0dXMoVFBST1ZNSVNNQVRDSCkgVHJpZWQgdG8gYWNjZXB0IG9uIGluY29tcGF0aWJsZSBlbmRwb2ludAota09USW5kT3V0RXJyCT0JLTMxNzMJI1hUSTJPU1N0YXR1cyhUSU5ET1VUKSBBY2NlcHQgZmFpbGVkIGJlY2F1c2Ugb2YgcGVuZGluZyBsaXN0ZW4KLWtPVEFkZHJlc3NCdXN5RXJyCT0JLTMxNzIJI1hUSTJPU1N0YXR1cyhUQUREUkJVU1kpIEFkZHJlc3MgcmVxdWVzdGVkIGlzIGFscmVhZHkgaW4gdXNlCi1rT1RCYWRRTGVuRXJyCT0JLTMxNzEJI1hUSTJPU1N0YXR1cyhUQkFEUUxFTikgQSBCaW5kIHRvIGFuIGluLXVzZSBhZGRyIHdpdGggcWxlbiA+IDAKLWtPVEJhZE5hbWVFcnIJPQktMzE3MAkjWFRJMk9TU3RhdHVzKFRCQUROQU1FKSBBIGJhZCBlbmRwb2ludCBuYW1lIHdhcyBzdXBwbGllZAota09UTm9TdHJ1Y3R1cmVUeXBlRXJyCT0JLTMxNjkJI1hUSTJPU1N0YXR1cyhUTk9TVFJVQ1RZUEUpIEJhZCBzdHJ1Y3R1cmUgdHlwZSByZXF1ZXN0ZWQgZm9yIE9UQWxsb2MKLWtPVFN0YXRlQ2hhbmdlRXJyCT0JLTMxNjgJI1hUSTJPU1N0YXR1cyhUU1RBVEVDSE5HKSBTdGF0ZSBpcyBjaGFuZ2luZyAtIHRyeSBhZ2FpbiBsYXRlcgota09UTm90U3VwcG9ydGVkRXJyCT0JLTMxNjcJI1hUSTJPU1N0YXR1cyhUTk9UU1VQUE9SVCkgQ29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkCi1rT1ROb1JlbGVhc2VFcnIJPQktMzE2NgkjWFRJMk9TU3RhdHVzKFROT1JFTCkgTm8gb3JkZXJseSByZWxlYXNlIGluZGljYXRpb24gYXZhaWxhYmxlCi1rT1RCYWRGbGFnRXJyCT0JLTMxNjUJI1hUSTJPU1N0YXR1cyhUQkFERkxBRykgQSBCYWQgZmxhZyB2YWx1ZSB3YXMgc3VwcGxpZWQKLWtPVE5vVURFcnJFcnIJPQktMzE2NAkjWFRJMk9TU3RhdHVzKFROT1VERVJSKSBObyBVbml0IERhdGEgRXJyb3IgaW5kaWNhdGlvbiBhdmFpbGFibGUKLWtPVE5vRGlzY29ubmVjdEVycgk9CS0zMTYzCSNYVEkyT1NTdGF0dXMoVE5PRElTKSBObyBkaXNjb25uZWN0IGluZGljYXRpb24gYXZhaWxhYmxlCi1rT1ROb0RhdGFFcnIJPQktMzE2MgkjWFRJMk9TU3RhdHVzKFROT0RBVEEpIE5vIGRhdGEgYXZhaWxhYmxlIGZvciByZWFkaW5nCi1rT1RGbG93RXJyCT0JLTMxNjEJI1hUSTJPU1N0YXR1cyhURkxPVykgUHJvdmlkZXIgaXMgZmxvdy1jb250cm9sbGVkCi1rT1RCdWZmZXJPdmVyZmxvd0Vycgk9CS0zMTYwCSNYVEkyT1NTdGF0dXMoVEJVRk9WRkxXKSBQYXNzZWQgYnVmZmVyIG5vdCBiaWcgZW5vdWdoCi1rT1RCYWREYXRhRXJyCT0JLTMxNTkJI1hUSTJPU1N0YXR1cyhUQkFEREFUQSkgQW4gaWxsZWdhbCBhbW91bnQgb2YgZGF0YSB3YXMgc3BlY2lmaWVkCi1rT1RMb29rRXJyCT0JLTMxNTgJI1hUSTJPU1N0YXR1cyhUTE9PSykgQW4gZXZlbnQgb2NjdXJyZWQgLSBjYWxsIExvb2soKQota09UU3lzRXJyb3JFcnIJPQktMzE1NwkjWFRJMk9TU3RhdHVzKFRTWVNFUlIpIEEgc3lzdGVtIGVycm9yIG9jY3VycmVkCi1rT1RCYWRTZXF1ZW5jZUVycgk9CS0zMTU2CSNYVEkyT1NTdGF0dXMoVEJBRFNFUSkgU2VxdWVuY2Ugc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0Ci1rT1RPdXRTdGF0ZUVycgk9CS0zMTU1CSNYVEkyT1NTdGF0dXMoVE9VVFNUQVRFKSBDYWxsIGlzc3VlZCBpbiB3cm9uZyBzdGF0ZQota09UTm9BZGRyZXNzRXJyCT0JLTMxNTQJI1hUSTJPU1N0YXR1cyhUTk9BRERSKSBObyBhZGRyZXNzIHdhcyBzcGVjaWZpZWQKLWtPVEJhZFJlZmVyZW5jZUVycgk9CS0zMTUzCSNYVEkyT1NTdGF0dXMoVEJBREYpIEJhZCBwcm92aWRlciByZWZlcmVuY2UKLWtPVEFjY2Vzc0Vycgk9CS0zMTUyCSNYVEkyT1NTdGF0dXMoVEFDQ0VTKSBNaXNzaW5nIGFjY2VzcyBwZXJtaXNzaW9uCi1rT1RCYWRPcHRpb25FcnIJPQktMzE1MQkjWFRJMk9TU3RhdHVzKFRCQURPUFQpIEEgQmFkIG9wdGlvbiB3YXMgc3BlY2lmaWVkCi1rT1RCYWRBZGRyZXNzRXJyCT0JLTMxNTAJI1hUSTJPU1N0YXR1cyhUQkFEQUREUikgQSBCYWQgYWRkcmVzcyB3YXMgc3BlY2lmaWVkCi1za3RDbG9zZWRFcnIJPQktMzEwOQkjc2t0Q2xvc2VkRXJyCi1yZWNOb3RGbmQJPQktMzEwOAkjcmVjTm90Rm5kCi1hdHBCYWRSc3AJPQktMzEwNwkjYXRwQmFkUnNwCi1hdHBMZW5FcnIJPQktMzEwNgkjYXRwTGVuRXJyCi1yZWFkUUVycgk9CS0zMTA1CSNyZWFkUUVycgotZXh0cmFjdEVycgk9CS0zMTA0CSNleHRyYWN0RXJyCi1ja1N1bUVycgk9CS0zMTAzCSNja1N1bUVycgotbm9NUFBFcnIJPQktMzEwMgkjbm9NUFBFcnIKLWJ1ZjJTbWFsbEVycgk9CS0zMTAxCSNidWYyU21hbGxFcnIKLW5vUHJlZkFwcEVycgk9CS0zMDMyCSNub1ByZWZBcHBFcnIKLWJhZFRyYW5zbGF0aW9uU3BlY0Vycgk9CS0zMDMxCSNiYWRUcmFuc2xhdGlvblNwZWNFcnIKLW5vVHJhbnNsYXRpb25QYXRoRXJyCT0JLTMwMzAJI25vVHJhbnNsYXRpb25QYXRoRXJyCi1jb3VsZE5vdFBhcnNlU291cmNlRmlsZUVycgk9CS0zMDI2CSNTb3VyY2UgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbiBzb3VyY2UgdHlwZQotaW52YWxpZFRyYW5zbGF0aW9uUGF0aEVycgk9CS0zMDI1CSNTb3VyY2UgdHlwZSB0byBkZXN0aW5hdGlvbiB0eXBlIG5vdCBhIHZhbGlkIHBhdGgKLXJldHJ5Q29tcG9uZW50UmVnaXN0cmF0aW9uRXJyCT0JLTMwMDUJI3JldHJ5Q29tcG9uZW50UmVnaXN0cmF0aW9uRXJyCi11bnJlc29sdmVkQ29tcG9uZW50RExMRXJyCT0JLTMwMDQJI3VucmVzb2x2ZWRDb21wb25lbnRETExFcnIKLWNvbXBvbmVudERvbnRSZWdpc3Rlcgk9CS0zMDAzCSNjb21wb25lbnREb250UmVnaXN0ZXIKLWNvbXBvbmVudE5vdENhcHR1cmVkCT0JLTMwMDIJI2NvbXBvbmVudE5vdENhcHR1cmVkCi12YWxpZEluc3RhbmNlc0V4aXN0CT0JLTMwMDEJI3ZhbGlkSW5zdGFuY2VzRXhpc3QKLWludmFsaWRDb21wb25lbnRJRAk9CS0zMDAwCSNpbnZhbGlkQ29tcG9uZW50SUQKLWNmcmFnTGFzdEVyckNvZGUJPQktMjg5OQkjVGhlIGxhc3QgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIENGTSBlcnJvcnMuCi1jZnJhZ091dHB1dExlbmd0aEVycgk9CS0yODMxCSNBbiBvdXRwdXQgcGFyYW1ldGVyIGlzIHRvbyBzbWFsbCB0byBob2xkIHRoZSB2YWx1ZS4KLWNmcmFnQWJvcnRDbG9zdXJlRXJyCT0JLTI4MzAJI1VzZWQgYnkgbm90aWZpY2F0aW9uIGhhbmRsZXJzIHRvIGFib3J0IGEgY2xvc3VyZS4KLWNmcmFnQ2xvc3VyZUlERXJyCT0JLTI4MjkJI1RoZSBjbG9zdXJlIElEIHdhcyBub3QgdmFsaWQuCi1jZnJhZ0NvbnRhaW5lcklERXJyCT0JLTI4MjgJI1RoZSBmcmFnbWVudCBjb250YWluZXIgSUQgd2FzIG5vdCB2YWxpZC4KLWNmcmFnTm9SZWdpc3RyYXRpb25FcnIJPQktMjgyNwkjVGhlIHJlZ2lzdHJhdGlvbiBuYW1lIHdhcyBub3QgZm91bmQuCi1jZnJhZ05vdENsb3N1cmVFcnIJPQktMjgyNgkjVGhlIGNsb3N1cmUgSUQgd2FzIGFjdHVhbGx5IGEgY29ubmVjdGlvbiBJRC4KLWNmcmFnRmlsZVNpemVFcnIJPQktMjgyNQkjQSBmaWxlIHdhcyB0b28gbGFyZ2UgdG8gYmUgbWFwcGVkLgotY2ZyYWdGcmFnbWVudFVzYWdlRXJyCT0JLTI4MjQJI0Egc2VtYW50aWMgZXJyb3IgaW4gdXNhZ2Ugb2YgdGhlIGZyYWdtZW50LgotY2ZyYWdBcmNoaXRlY3R1cmVFcnIJPQktMjgyMwkjQSBmcmFnbWVudCBoYXMgYW4gdW5hY2NlcHRhYmxlIGFyY2hpdGVjdHVyZS4KLWNmcmFnTm9BcHBsaWNhdGlvbkVycgk9CS0yODIyCSNObyBhcHBsaWNhdGlvbiBtZW1iZXIgZm91bmQgaW4gdGhlIGNmcmcgcmVzb3VyY2UuCi1jZnJhZ0luaXRGdW5jdGlvbkVycgk9CS0yODIxCSNBIGZyYWdtZW50J3MgaW5pdGlhbGl6YXRpb24gcm91dGluZSByZXR1cm5lZCBhbiBlcnJvci4KLWNmcmFnRnJhZ21lbnRDb3JydXB0RXJyCT0JLTI4MjAJI0EgZnJhZ21lbnQncyBjb250YWluZXIgd2FzIGNvcnJ1cHQgKGtub3duIGZvcm1hdCkuCi1jZnJhZ0NGTUludGVybmFsRXJyCT0JLTI4MTkJI0FuIGludGVybmFsIGluY29uc3Rpc3RhbmN5IGhhcyBiZWVuIGRldGVjdGVkLgotY2ZyYWdDRk1TdGFydHVwRXJyCT0JLTI4MTgJI0ludGVybmFsIGVycm9yIGR1cmluZyBDRk0gaW5pdGlhbGl6YXRpb24uCi1jZnJhZ0xpYkNvbm5FcnIJPQktMjgxNwkjCi1jZnJhZ0luaXRBdEJvb3RFcnIJPQktMjgxNgkjQSBib290IGxpYnJhcnkgaGFzIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiAgKFN5c3RlbSA3IG9ubHkpCi1jZnJhZ0luaXRMb29wRXJyCT0JLTI4MTUJI0NpcmN1bGFyaXR5IGluIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIG9yZGVyLgotY2ZyYWdJbXBvcnRUb29OZXdFcnIJPQktMjgxNAkjQW4gaW1wb3J0IGxpYnJhcnkgd2FzIHRvbyBuZXcgZm9yIGEgY2xpZW50LgotY2ZyYWdJbXBvcnRUb29PbGRFcnIJPQktMjgxMwkjQW4gaW1wb3J0IGxpYnJhcnkgd2FzIHRvbyBvbGQgZm9yIGEgY2xpZW50LgotY2ZyYWdJbml0T3JkZXJFcnIJPQktMjgxMgkjCi1jZnJhZ05vSURzRXJyCT0JLTI4MTEJI05vIG1vcmUgQ0ZNIElEcyBmb3IgY29udGV4dHMsIGNvbm5lY3Rpb25zLCBldGMuCi1jZnJhZ05vQ2xpZW50TWVtRXJyCT0JLTI4MTAJI091dCBvZiBtZW1vcnkgZm9yIGZyYWdtZW50IG1hcHBpbmcgb3Igc2VjdGlvbiBpbnN0YW5jZXMuCi1jZnJhZ05vUHJpdmF0ZU1lbUVycgk9CS0yODA5CSNPdXQgb2YgbWVtb3J5IGZvciBpbnRlcm5hbCBib29ra2VlcGluZy4KLWNmcmFnTm9Qb3NpdGlvbkVycgk9CS0yODA4CSNUaGUgcmVnaXN0cmF0aW9uIGluc2VydGlvbiBwb2ludCB3YXMgbm90IGZvdW5kLgotY2ZyYWdVbnJlc29sdmVkRXJyCT0JLTI4MDcJI0EgZnJhZ21lbnQgaGFkICJoYXJkIiB1bnJlc29sdmVkIGltcG9ydHMuCi1jZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyCT0JLTI4MDYJI0EgZnJhZ21lbnQncyBjb250YWluZXIgZm9ybWF0IGlzIHVua25vd24uCi1jZnJhZ0R1cFJlZ2lzdHJhdGlvbkVycgk9CS0yODA1CSNUaGUgcmVnaXN0cmF0aW9uIG5hbWUgd2FzIGFscmVhZHkgaW4gdXNlLgotY2ZyYWdOb0xpYnJhcnlFcnIJPQktMjgwNAkjVGhlIG5hbWVkIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4KLWNmcmFnTm9TZWN0aW9uRXJyCT0JLTI4MDMJI1RoZSBzcGVjaWZpZWQgc2VjdGlvbiB3YXMgbm90IGZvdW5kLgotY2ZyYWdOb1N5bWJvbEVycgk9CS0yODAyCSNUaGUgc3BlY2lmaWVkIHN5bWJvbCB3YXMgbm90IGZvdW5kLgotY2ZyYWdDb25uZWN0aW9uSURFcnIJPQktMjgwMQkjVGhlIGNvbm5lY3Rpb24gSUQgd2FzIG5vdCB2YWxpZC4KLWNmcmFnRmlyc3RFcnJDb2RlCT0JLTI4MDAJI1RoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgcmFuZ2Ugb2YgQ0ZNIGVycm9ycy4KLWVyckFTSW5jb25zaXN0ZW50TmFtZXMJPQktMjc4MAkjRW5nbGlzaCBlcnJvcnM6Ci1lcnJBU05vUmVzdWx0UmV0dXJuZWQJPQktMjc2MwkjVGhlIHJhbmdlIC0yNzgwIHRocnUgLTI3OTkgaXMgcmVzZXJ2ZWQgZm9yIGRpYWxlY3Qgc3BlY2lmaWMgZXJyb3IgY29kZXMuIChFcnJvciBjb2RlcyBmcm9tIGRpZmZlcmVudCBkaWFsZWN0cyBtYXkgb3ZlcmxhcC4pCi1lcnJBU1BhcmFtZXRlck5vdEZvckV2ZW50CT0JLTI3NjIJI2VyckFTUGFyYW1ldGVyTm90Rm9yRXZlbnQKLWVyckFTSWxsZWdhbEZvcm1hbFBhcmFtZXRlcgk9CS0yNzYxCSNlcnJBU0lsbGVnYWxGb3JtYWxQYXJhbWV0ZXIKLWVyckFTVGVybWlub2xvZ3lOZXN0aW5nVG9vRGVlcAk9CS0yNzYwCSNlcnJBU1Rlcm1pbm9sb2d5TmVzdGluZ1Rvb0RlZXAKLU9TQUNvbnRyb2xGbG93RXJyb3IJPQktMjc1NQkjU2lnbmFsZWQgd2hlbiBpbGxlZ2FsIGNvbnRyb2wgZmxvdyBvY2N1cnMgaW4gYW4gYXBwbGljYXRpb24gKG5vIGNhdGNoZXIgZm9yIHRocm93LCBub24tbGV4aWNhbCBsb29wIGV4aXQsIGV0Yy4pCi1PU0FJbmNvbnNpc3RlbnREZWNsYXJhdGlvbnMJPQktMjc1NAkjU2lnbmFsZWQgd2hlbiBhIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5IGluIHRoZSBzYW1lIHNjb3BlLCBzdWNoIGFzIGJvdGggbG9jYWwgYW5kIGdsb2JhbAotT1NBVW5kZWZpbmVkVmFyaWFibGUJPQktMjc1MwkjU2lnbmFsZWQgd2hlbiBhIHZhcmlhYmxlIGlzIGFjY2Vzc2VkIHRoYXQgaGFzIG5vIHZhbHVlCi1PU0FEdXBsaWNhdGVIYW5kbGVyCT0JLTI3NTIJI1NpZ25hbGVkIHdoZW4gbW9yZSB0aGFuIG9uZSBoYW5kbGVyIGlzIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lIGluIGEgc2NvcGUgd2hlcmUgdGhlIGxhbmd1YWdlIGRvZXNuJ3QgYWxsb3cgaXQKLU9TQUR1cGxpY2F0ZVByb3BlcnR5CT0JLTI3NTEJI1NpZ25hbGVkIHdoZW4gYSBmb3JtYWwgcGFyYW1ldGVyLCBsb2NhbCB2YXJpYWJsZSwgb3IgaW5zdGFuY2UgdmFyaWFibGUgaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlLgotT1NBRHVwbGljYXRlUGFyYW1ldGVyCT0JLTI3NTAJI1NpZ25hbGVkIHdoZW4gYSBmb3JtYWwgcGFyYW1ldGVyLCBsb2NhbCB2YXJpYWJsZSwgb3IgaW5zdGFuY2UgdmFyaWFibGUgaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlCi1PU0FUb2tlblRvb0xvbmcJPQktMjc0MgkjU2lnbmFsZWQgd2hlbiBhIG5hbWUgb3IgbnVtYmVyIGlzIHRvbyBsb25nIHRvIGJlIHBhcnNlZAotT1NBU3ludGF4VHlwZUVycm9yCT0JLTI3NDEJI1NpZ25hbGVkIHdoZW4gYW5vdGhlciBmb3JtIG9mIHN5bnRheCB3YXMgZXhwZWN0ZWQuIChlLmcuICJleHBlY3RlZCBhIDx0eXBlPiBidXQgZm91bmQgPHRoaXM+IikKLU9TQVN5bnRheEVycm9yCT0JLTI3NDAJI1NpZ25hbGVkIHdoZW4gYSBzeW50YXggZXJyb3Igb2NjdXJzLiAoZS5nLiAiU3ludGF4IGVycm9yIiBvciAiPHRoaXM+IGNhbid0IGdvIGFmdGVyIDx0aGF0PiIpCi1lcnJBU0NhbnRDb21wYXJlTW9yZVRoYW4zMmsJPQktMjcyMQkjUGFyc2VyL0NvbXBpbGVyIGVycm9yczoKLWVyckFTQ2FudENvbnNpZGVyQW5kSWdub3JlCT0JLTI3MjAJI2VyckFTQ2FudENvbnNpZGVyQW5kSWdub3JlCi1lcnJPU0FDYW50Q3JlYXRlCT0JLTI3MTAJI2Vyck9TQUNhbnRDcmVhdGUKLWVyck9TQUNhbnRHZXRUZXJtaW5vbG9neQk9CS0yNzA5CSNlcnJPU0FDYW50R2V0VGVybWlub2xvZ3kKLWVyck9TQURhdGFCbG9ja1Rvb0xhcmdlCT0JLTI3MDgJI1NpZ25hbGVkIHdoZW4gYW4gaW50cmluc2ljIGxpbWl0YXRpb24gaXMgZXhjZWVkZWQgZm9yIHRoZSBzaXplIG9mIGEgdmFsdWUgb3IgZGF0YSBzdHJ1Y3R1cmUuCi1lcnJPU0FJbnRlcm5hbFRhYmxlT3ZlcmZsb3cJPQktMjcwNwkjU2lnbmFsZWQgd2hlbiBhIHJ1bnRpbWUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgb3ZlcmZsb3dzCi1lcnJPU0FTdGFja092ZXJmbG93CT0JLTI3MDYJI1NpZ25hbGVkIHdoZW4gdGhlIHJ1bnRpbWUgc3RhY2sgb3ZlcmZsb3dzCi1lcnJPU0FDb3JydXB0VGVybWlub2xvZ3kJPQktMjcwNQkjU2lnbmFsZWQgd2hlbiBhbiBhcHBsaWNhdGlvbidzIHRlcm1pbm9sb2d5IHJlc291cmNlIGlzIG5vdCByZWFkYWJsZQotZXJyT1NBQXBwTm90SGlnaExldmVsRXZlbnRBd2FyZQk9CS0yNzA0CSNTaWduYWxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIGNhbid0IHJlc3BvbmQgdG8gQXBwbGVFdmVudHMKLWVyck9TQUNhbnRMYXVuY2gJPQktMjcwMwkjU2lnbmFsZWQgd2hlbiBhcHBsaWNhdGlvbiBjYW4ndCBiZSBsYXVuY2hlZCBvciB3aGVuIGl0IGlzIHJlbW90ZSBhbmQgcHJvZ3JhbSBsaW5raW5nIGlzIG5vdCBlbmFibGVkCi1lcnJPU0FOdW1lcmljT3ZlcmZsb3cJPQktMjcwMgkjU2lnbmFsZWQgd2hlbiBpbnRlZ2VyIG9yIHJlYWwgdmFsdWUgaXMgdG9vIGxhcmdlIHRvIGJlIHJlcHJlc2VudGVkCi1lcnJPU0FEaXZpZGVCeVplcm8JPQktMjcwMQkjU2lnbmFsZWQgd2hlbiB0aGVyZSBpcyBhbiBhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvCi1lcnJPU0FHZW5lcmFsRXJyb3IJPQktMjcwMAkjU2lnbmFsZWQgYnkgdXNlciBzY3JpcHRzIG9yIGFwcGxpY2F0aW9ucyB3aGVuIG5vIGFjdHVhbCBlcnJvciBjb2RlIGlzIHRvIGJlIHJldHVybmVkLgotbm9JY29uRGF0YUF2YWlsYWJsZUVycgk9CS0yNTgyCSNUaGUgbmVjZXNzYXJ5IGljb24gZGF0YSBpcyBub3QgYXZhaWxhYmxlCi1ub1N1Y2hJY29uRXJyCT0JLTI1ODEJI1RoZSByZXF1ZXN0ZWQgaWNvbiBjb3VsZCBub3QgYmUgZm91bmQKLWludmFsaWRJY29uUmVmRXJyCT0JLTI1ODAJI1RoZSBpY29uIHJlZiBpcyBub3QgdmFsaWQKLW5yQ2FsbE5vdFN1cHBvcnRlZAk9CS0yNTU3CSNUaGlzIGNhbGwgaXMgbm90IGF2YWlsYWJsZSBvciBzdXBwb3J0ZWQgb24gdGhpcyBtYWNoaW5lCi1uclRyYW5zYWN0aW9uQWJvcnRlZAk9CS0yNTU2CSN0cmFuc2FjdGlvbiB3YXMgYWJvcnRlZAotbnJFeGl0ZWRJdGVyYXRvclNjb3BlCT0JLTI1NTUJI291dGVyIHNjb3BlIG9mIGl0ZXJhdG9yIHdhcyBleGl0ZWQKLW5ySXRlcmF0aW9uRG9uZQk9CS0yNTU0CSNpdGVyYXRpb24gb3BlcmF0aW9uIGlzIGRvbmUKLW5yUHJvcGVydHlBbHJlYWR5RXhpc3RzCT0JLTI1NTMJI3Byb3BlcnR5IGFscmVhZHkgZXhpc3RzCi1uckludmFsaWRFbnRyeUl0ZXJhdGlvbk9wCT0JLTI1NTIJI2ludmFsaWQgZW50cnkgaXRlcmF0aW9uIG9wZXJhdGlvbgotbnJQYXRoQnVmZmVyVG9vU21hbGwJPQktMjU1MQkjYnVmZmVyIGZvciBwYXRoIGlzIHRvbyBzbWFsbAotbnJQYXRoTm90Rm91bmQJPQktMjU1MAkjYSBwYXRoIGNvbXBvbmVudCBsb29rdXAgZmFpbGVkCi1uclJlc3VsdENvZGVCYXNlCT0JLTI1NDkJI25yUmVzdWx0Q29kZUJhc2UKLW5yT3ZlcnJ1bkVycgk9CS0yNTQ4CSNuck92ZXJydW5FcnIKLW5yTm90TW9kaWZpZWRFcnIJPQktMjU0NwkjbnJOb3RNb2RpZmllZEVycgotbnJUeXBlTWlzbWF0Y2hFcnIJPQktMjU0NgkjbnJUeXBlTWlzbWF0Y2hFcnIKLW5yUG93ZXJTd2l0Y2hBYm9ydEVycgk9CS0yNTQ1CSNuclBvd2VyU3dpdGNoQWJvcnRFcnIKLW5yUG93ZXJFcnIJPQktMjU0NAkjbnJQb3dlckVycgotbnJEYXRhVHJ1bmNhdGVkRXJyCT0JLTI1NDMJI25yRGF0YVRydW5jYXRlZEVycgotbnJOb3RTbG90RGV2aWNlRXJyCT0JLTI1NDIJI25yTm90U2xvdERldmljZUVycgotbnJOYW1lRXJyCT0JLTI1NDEJI25yTmFtZUVycgotbnJOb3RDcmVhdGVkRXJyCT0JLTI1NDAJI25yTm90Q3JlYXRlZEVycgotbnJOb3RGb3VuZEVycgk9CS0yNTM5CSNuck5vdEZvdW5kRXJyCi1uckludmFsaWROb2RlRXJyCT0JLTI1MzgJI25ySW52YWxpZE5vZGVFcnIKLW5yTm90RW5vdWdoTWVtb3J5RXJyCT0JLTI1MzcJI25yTm90RW5vdWdoTWVtb3J5RXJyCi1uckxvY2tlZEVycgk9CS0yNTM2CSNuckxvY2tlZEVycgotbW1JbnRlcm5hbEVycm9yCT0JLTI1MjYJI21tSW50ZXJuYWxFcnJvcgotdHNtRGVmYXVsdElzTm90SW5wdXRNZXRob2RFcnIJPQktMjUyNAkjQ3VycmVudCBJbnB1dCBzb3VyY2UgaXMgS0NIUiBvciB1Y2hyLCBub3QgSW5wdXQgTWV0aG9kICAoR2V0RGVmYXVsdElucHV0TWV0aG9kKQotdHNtTm9TdGVtCT0JLTI1MjMJI05vIHN0ZW0gZXhpc3RzIGZvciB0aGUgdG9rZW4KLXRzbU5vTW9yZVRva2Vucwk9CS0yNTIyCSNObyBtb3JlIHRva2VucyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgc291cmNlIHRleHQKLXRzbU5vSGFuZGxlcgk9CS0yNTIxCSNObyBDYWxsYmFjayBIYW5kbGVyIGV4aXN0cyBmb3IgY2FsbGJhY2sKLXRzbUludmFsaWRDb250ZXh0CT0JLTI1MjAJI0ludmFsaWQgVFNNQ29udGV4dCBzcGVjaWZpZWQgaW4gY2FsbAotdHNtVW5rbm93bkVycgk9CS0yNTE5CSNhbnkgb3RoZXIgZXJyb3JzCi10c21VbnN1cHBvcnRlZFR5cGVFcnIJPQktMjUxOAkjdW5TdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGUgZXJyb3IKLXRzbVNjcmlwdEhhc05vSU1FcnIJPQktMjUxNwkjc2NyaXB0IGhhcyBubyBpbXB1dCBtZXRob2Qgb3IgaXMgdXNpbmcgb2xkIElNCi10c21JbnB1dE1ldGhvZElzT2xkRXJyCT0JLTI1MTYJI3JldHVybmVkIGJ5IEdldERlZmF1bHRJbnB1dE1ldGhvZAotdHNtQ29tcG9uZW50QWxyZWFkeU9wZW5FcnIJPQktMjUxNQkjdGV4dCBzZXJ2aWNlIGFscmVhZHkgb3BlbmVkIGZvciB0aGUgZG9jdW1lbnQKLXRzbVRTTm90T3BlbkVycgk9CS0yNTE0CSN0ZXh0IHNlcnZpY2UgaXMgbm90IG9wZW4KLXRzbVRTSGFzTm9NZW51RXJyCT0JLTI1MTMJI3RoZSB0ZXh0IHNlcnZpY2UgaGFzIG5vIG1lbnUKLXRzbVVzZUlucHV0V2luZG93RXJyCT0JLTI1MTIJI25vdCBUU00gYXdhcmUgYmVjYXVzZSB3ZSBhcmUgdXNpbmcgaW5wdXQgd2luZG93Ci10c21Eb2N1bWVudE9wZW5FcnIJPQktMjUxMQkjdGhlcmUgYXJlIG9wZW4gZG9jdW1lbnRzCi10c21UZXh0U2VydmljZU5vdEZvdW5kRXJyCT0JLTI1MTAJI25vIHRleHQgc2VydmljZSBmb3VuZAotdHNtQ2FudE9wZW5Db21wb25lbnRFcnIJPQktMjUwOQkjY2Fu1XQgb3BlbiB0aGUgY29tcG9uZW50Ci10c21Ob09wZW5UU0Vycgk9CS0yNTA4CSNubyBvcGVuIHRleHQgc2VydmljZQotdHNtRG9jTm90QWN0aXZlRXJyCT0JLTI1MDcJI2RvY3VtZW50IGlzIE5PVCBhY3RpdmUKLXRzbVRTTURvY0J1c3lFcnIJPQktMjUwNgkjZG9jdW1lbnQgaXMgc3RpbGwgYWN0aXZlCi10c21JbnZhbGlkRG9jSURFcnIJPQktMjUwNQkjaW52YWxpZCBUU00gZG9jdW1lbnRhdGlvbiBpZAotdHNtTmV2ZXJSZWdpc3RlcmVkRXJyCT0JLTI1MDQJI2FwcCBuZXZlciByZWdpc3RlcmVkIGVycm9yIChub3QgVFNNIGF3YXJlKQotdHNtQWxyZWFkeVJlZ2lzdGVyZWRFcnIJPQktMjUwMwkjd2FudCB0byByZWdpc3RlciBhZ2FpbiBlcnJvcgotdHNtTm90QW5BcHBFcnIJPQktMjUwMgkjbm90IGFuIGFwcGxpY2F0aW9uIGVycm9yCi10c21JbnB1dE1ldGhvZE5vdEZvdW5kRXJyCT0JLTI1MDEJI3RzbUlucHV0TWV0aG9kTm90Rm91bmRFcnIKLXRzbVVuc3VwU2NyaXB0TGFuZ3VhZ2VFcnIJPQktMjUwMAkjdHNtVW5zdXBTY3JpcHRMYW5ndWFnZUVycgota2VybmVsVW5yZWNvdmVyYWJsZUVycgk9CS0yNDk5CSNrZXJuZWxVbnJlY292ZXJhYmxlRXJyCi1rZXJuZWxSZXR1cm5WYWx1ZUVycgk9CS0yNDIyCSNrZXJuZWxSZXR1cm5WYWx1ZUVycgota2VybmVsQWxyZWFkeUZyZWVFcnIJPQktMjQyMQkja2VybmVsQWxyZWFkeUZyZWVFcnIKLWtlcm5lbElERXJyCT0JLTI0MTkJI2tlcm5lbElERXJyCi1rZXJuZWxFeGNlcHRpb25FcnIJPQktMjQxOAkja2VybmVsRXhjZXB0aW9uRXJyCi1rZXJuZWxUZXJtaW5hdGVkRXJyCT0JLTI0MTcJI2tlcm5lbFRlcm1pbmF0ZWRFcnIKLWtlcm5lbEluVXNlRXJyCT0JLTI0MTYJI2tlcm5lbEluVXNlRXJyCi1rZXJuZWxUaW1lb3V0RXJyCT0JLTI0MTUJI2tlcm5lbFRpbWVvdXRFcnIKLWtlcm5lbEFzeW5jUmVjZWl2ZUxpbWl0RXJyCT0JLTI0MTQJI2tlcm5lbEFzeW5jUmVjZWl2ZUxpbWl0RXJyCi1rZXJuZWxBc3luY1NlbmRMaW1pdEVycgk9CS0yNDEzCSNrZXJuZWxBc3luY1NlbmRMaW1pdEVycgota2VybmVsQXR0cmlidXRlRXJyCT0JLTI0MTIJI2tlcm5lbEF0dHJpYnV0ZUVycgota2VybmVsRXhlY3V0aW9uTGV2ZWxFcnIJPQktMjQxMQkja2VybmVsRXhlY3V0aW9uTGV2ZWxFcnIKLWtlcm5lbERlbGV0ZVBlcm1pc3Npb25FcnIJPQktMjQxMAkja2VybmVsRGVsZXRlUGVybWlzc2lvbkVycgota2VybmVsRXhlY3V0ZVBlcm1pc3Npb25FcnIJPQktMjQwOQkja2VybmVsRXhlY3V0ZVBlcm1pc3Npb25FcnIKLWtlcm5lbFJlYWRQZXJtaXNzaW9uRXJyCT0JLTI0MDgJI2tlcm5lbFJlYWRQZXJtaXNzaW9uRXJyCi1rZXJuZWxXcml0ZVBlcm1pc3Npb25FcnIJPQktMjQwNwkja2VybmVsV3JpdGVQZXJtaXNzaW9uRXJyCi1rZXJuZWxPYmplY3RFeGlzdHNFcnIJPQktMjQwNgkja2VybmVsT2JqZWN0RXhpc3RzRXJyCi1rZXJuZWxVbnN1cHBvcnRlZEVycgk9CS0yNDA1CSNrZXJuZWxVbnN1cHBvcnRlZEVycgota2VybmVsUHJpdmlsZWdlRXJyCT0JLTI0MDQJI2tlcm5lbFByaXZpbGVnZUVycgota2VybmVsT3B0aW9uc0Vycgk9CS0yNDAzCSNrZXJuZWxPcHRpb25zRXJyCi1rZXJuZWxDYW5jZWxlZEVycgk9CS0yNDAyCSNrZXJuZWxDYW5jZWxlZEVycgota2VybmVsSW5jb21wbGV0ZUVycgk9CS0yNDAxCSNrZXJuZWxJbmNvbXBsZXRlRXJyCi1iYWRDYWxsT3JkZXJFcnIJPQktMjIwOQkjVXN1YWxseSBkdWUgdG8gYSBzdGF0dXMgY2FsbCBiZWluZyBjYWxsZWQgcHJpb3IgdG8gYmVpbmcgc2V0dXAgZmlyc3QKLW5vRE1BRXJyCT0JLTIyMDgJI0NhbtV0IGRvIERNQSBkaWdpdGl6aW5nIChpLmUuIGNhbid0IGdvIHRvIHJlcXVlc3RlZCBkZXN0Ci1iYWREZXB0aEVycgk9CS0yMjA3CSNDYW7VdCBkaWdpdGl6ZSBpbnRvIHRoaXMgZGVwdGgKLW5vdEV4YWN0U2l6ZUVycgk9CS0yMjA2CSNDYW7VdCBkbyBleGFjdCBzaXplIHJlcXVlc3RlZAotbm9Nb3JlS2V5Q29sb3JzRXJyCT0JLTIyMDUJI2FsbCBrZXkgaW5kZXhlcyBpbiB1c2UKLW5vdEV4YWN0TWF0cml4RXJyCT0JLTIyMDQJI3dhcm5pbmcgb2YgYmFkIG1hdHJpeCwgZGlnaXRpemVyIGRpZCBpdHMgYmVzdAotbWF0cml4RXJyCT0JLTIyMDMJI2JhZCBtYXRyaXgsIGRpZ2l0aXplciBkaWQgbm90aGluZwotcXRQYXJhbUVycgk9CS0yMjAyCSNiYWQgaW5wdXQgcGFyYW1ldGVyIChvdXQgb2YgcmFuZ2UsIGV0YykKLWRpZ2lVbmltcEVycgk9CS0yMjAxCSNmZWF0dXJlIHVuaW1wbGVtZW50ZWQKLXF0WE1MQXBwbGljYXRpb25FcnIJPQktMjE1OQkjcXRYTUxBcHBsaWNhdGlvbkVycgotcXRYTUxQYXJzZUVycgk9CS0yMTU4CSNxdFhNTFBhcnNlRXJyCi1xdEFjdGlvbk5vdEhhbmRsZWRFcnIJPQktMjE1NwkjcXRBY3Rpb25Ob3RIYW5kbGVkRXJyCi1ub3RFbm91Z2hEYXRhRXJyCT0JLTIxNDkJI25vdEVub3VnaERhdGFFcnIKLXVybERhdGFIRlRQVVJMRXJyCT0JLTIxNDgJI3VybERhdGFIRlRQVVJMRXJyCi11cmxEYXRhSEZUUFNlcnZlckRpc2Nvbm5lY3RlZEVycgk9CS0yMTQ3CSN1cmxEYXRhSEZUUFNlcnZlckRpc2Nvbm5lY3RlZEVycgotdXJsRGF0YUhGVFBOb1Bhc3N3b3JkRXJyCT0JLTIxNDYJI3VybERhdGFIRlRQTm9QYXNzd29yZEVycgotdXJsRGF0YUhGVFBOZWVkUGFzc3dvcmRFcnIJPQktMjE0NQkjdXJsRGF0YUhGVFBOZWVkUGFzc3dvcmRFcnIKLXVybERhdGFIRlRQQmFkTmFtZUxpc3RFcnIJPQktMjE0NAkjdXJsRGF0YUhGVFBCYWROYW1lTGlzdEVycgotdXJsRGF0YUhGVFBOb05ldERyaXZlckVycgk9CS0yMTQzCSN1cmxEYXRhSEZUUE5vTmV0RHJpdmVyRXJyCi11cmxEYXRhSEZUUEZpbGVuYW1lRXJyCT0JLTIxNDIJI3VybERhdGFIRlRQRmlsZW5hbWVFcnIKLXVybERhdGFIRlRQUGVybWlzc2lvbnNFcnIJPQktMjE0MQkjdXJsRGF0YUhGVFBQZXJtaXNzaW9uc0VycgotdXJsRGF0YUhGVFBRdW90YUVycgk9CS0yMTQwCSN1cmxEYXRhSEZUUFF1b3RhRXJyCi11cmxEYXRhSEZUUE5vRGlyZWN0b3J5RXJyCT0JLTIxMzkJI3VybERhdGFIRlRQTm9EaXJlY3RvcnlFcnIKLXVybERhdGFIRlRQRGF0YUNvbm5lY3Rpb25FcnIJPQktMjEzOAkjdXJsRGF0YUhGVFBEYXRhQ29ubmVjdGlvbkVycgotdXJsRGF0YUhGVFBTZXJ2ZXJFcnIJPQktMjEzNwkjdXJsRGF0YUhGVFBTZXJ2ZXJFcnIKLXVybERhdGFIRlRQQmFkUGFzc3dvcmRFcnIJPQktMjEzNgkjdXJsRGF0YUhGVFBCYWRQYXNzd29yZEVycgotdXJsRGF0YUhGVFBCYWRVc2VyRXJyCT0JLTIxMzUJI3VybERhdGFIRlRQQmFkVXNlckVycgotdXJsRGF0YUhGVFBTaHV0ZG93bkVycgk9CS0yMTM0CSN1cmxEYXRhSEZUUFNodXRkb3duRXJyCi11cmxEYXRhSEZUUFByb3RvY29sRXJyCT0JLTIxMzMJI3VybERhdGFIRlRQUHJvdG9jb2xFcnIKLXVybERhdGFISFRUUFJlZGlyZWN0RXJyCT0JLTIxMzIJI3VybERhdGFISFRUUFJlZGlyZWN0RXJyCi11cmxEYXRhSEhUVFBVUkxFcnIJPQktMjEzMQkjdXJsRGF0YUhIVFRQVVJMRXJyCi11cmxEYXRhSEhUVFBOb05ldERyaXZlckVycgk9CS0yMTMwCSN1cmxEYXRhSEhUVFBOb05ldERyaXZlckVycgotdXJsRGF0YUhIVFRQUHJvdG9jb2xFcnIJPQktMjEyOQkjdXJsRGF0YUhIVFRQUHJvdG9jb2xFcnIKLXF0TmV0d29ya0FscmVhZHlBbGxvY2F0ZWRFcnIJPQktMjEyNwkjcXROZXR3b3JrQWxyZWFkeUFsbG9jYXRlZEVycgotbm90QWxsb3dlZFRvU2F2ZU1vdmllRXJyCT0JLTIxMjYJI25vdEFsbG93ZWRUb1NhdmVNb3ZpZUVycgotZmlsZU9mZnNldFRvb0JpZ0Vycgk9CS0yMTI1CSNmaWxlT2Zmc2V0VG9vQmlnRXJyCi1BU0RFbnRyeU5vdEZvdW5kRXJyCT0JLTIxMjQJI0FTREVudHJ5Tm90Rm91bmRFcnIKLUFTREJhZEZvcmtFcnIJPQktMjEyMwkjQVNEQmFkRm9ya0VycgotQVNEQmFkSGVhZGVyRXJyCT0JLTIxMjIJI0FTREJhZEhlYWRlckVycgotQUFQTm90Rm91bmRFcnIJPQktMjEyMQkjQUFQTm90Rm91bmRFcnIKLUFBUE5vdENyZWF0ZWRFcnIJPQktMjEyMAkjQUFQTm90Q3JlYXRlZEVycgotcWZjYk5vdENyZWF0ZWRFcnIJPQktMjExOQkjcWZjYk5vdENyZWF0ZWRFcnIKLXFmY2JOb3RGb3VuZEVycgk9CS0yMTE4CSNxZmNiTm90Rm91bmRFcnIKLXdhY2tCYWRNZXRhRGF0YUVycgk9CS0yMTE3CSN3YWNrQmFkTWV0YURhdGFFcnIKLXdhY2tGb3JrTm90Rm91bmRFcnIJPQktMjExNgkjd2Fja0ZvcmtOb3RGb3VuZEVycgotd2Fja0JhZEZpbGVFcnIJPQktMjExNQkjd2Fja0JhZEZpbGVFcnIKLXVua25vd25Gb3JtYXRFcnIJPQktMjExNAkjdW5rbm93bkZvcm1hdEVycgotcGF0aE5vdFZlcmlmaWVkRXJyCT0JLTIxMTMJI3BhdGhOb3RWZXJpZmllZEVycgotbm9QYXRoTWFwcGluZ0Vycgk9CS0yMTEyCSNub1BhdGhNYXBwaW5nRXJyCi1lbXB0eVBhdGhFcnIJPQktMjExMQkjZW1wdHlQYXRoRXJyCi1wYXRoVG9vTG9uZ0Vycgk9CS0yMTEwCSNwYXRoVG9vTG9uZ0VycgotY2Fubm90QmVMZWFmQXRvbUVycgk9CS0yMTA5CSNjYW5ub3RCZUxlYWZBdG9tRXJyCi1pbnZhbGlkQXRvbVR5cGVFcnIJPQktMjEwOAkjaW52YWxpZEF0b21UeXBlRXJyCi1pbnZhbGlkQXRvbUNvbnRhaW5lckVycgk9CS0yMTA3CSNpbnZhbGlkQXRvbUNvbnRhaW5lckVycgotaW52YWxpZEF0b21FcnIJPQktMjEwNgkjaW52YWxpZEF0b21FcnIKLWR1cGxpY2F0ZUF0b21UeXBlQW5kSURFcnIJPQktMjEwNQkjZHVwbGljYXRlQXRvbVR5cGVBbmRJREVycgotYXRvbUluZGV4SW52YWxpZEVycgk9CS0yMTA0CSNhdG9tSW5kZXhJbnZhbGlkRXJyCi1hdG9tc05vdE9mU2FtZVR5cGVFcnIJPQktMjEwMwkjYXRvbXNOb3RPZlNhbWVUeXBlRXJyCi1ub3RMZWFmQXRvbUVycgk9CS0yMTAyCSNub3RMZWFmQXRvbUVycgotY2Fubm90RmluZEF0b21FcnIJPQktMjEwMQkjY2Fubm90RmluZEF0b21FcnIKLXVuc3VwcG9ydGVkUHJvY2Vzc29yRXJyCT0JLTIwOTcJI3Vuc3VwcG9ydGVkUHJvY2Vzc29yRXJyCi11bnN1cHBvcnRlZE9TRXJyCT0JLTIwOTYJI3Vuc3VwcG9ydGVkT1NFcnIKLXF0bWxVbmluaXRpYWxpemVkCT0JLTIwOTUJI3F0bWxVbmluaXRpYWxpemVkCi1xdG1sRGxsRW50cnlOb3RGb3VuZEVycgk9CS0yMDk0CSNXaW5kb3dzIHNwZWNpZmljIGVycm9ycyAod2hlbiBxdG1sIGlzIGxvYWRpbmcpCi1xdG1sRGxsTG9hZEVycgk9CS0yMDkzCSNXaW5kb3dzIHNwZWNpZmljIGVycm9ycyAod2hlbiBxdG1sIGlzIGxvYWRpbmcpCi1jb21wb25lbnREbGxFbnRyeU5vdEZvdW5kRXJyCT0JLTIwOTIJI1dpbmRvd3Mgc3BlY2lmaWMgZXJyb3JzICh3aGVuIGNvbXBvbmVudCBpcyBsb2FkaW5nKQotY29tcG9uZW50RGxsTG9hZEVycgk9CS0yMDkxCSNXaW5kb3dzIHNwZWNpZmljIGVycm9ycyAod2hlbiBjb21wb25lbnQgaXMgbG9hZGluZykKLXZpZGVvT3V0cHV0SW5Vc2VFcnIJPQktMjA5MAkjdmlkZW9PdXRwdXRJblVzZUVycgotbm9FeHBvcnRQcm9jQXZhaWxhYmxlRXJyCT0JLTIwODkJI25vRXhwb3J0UHJvY0F2YWlsYWJsZUVycgotdHVuZVBhcnNlT1NFcnIJPQktMjA4NwkjdHVuZVBhcnNlT1NFcnIKLXR1bmVQbGF5ZXJGdWxsT1NFcnIJPQktMjA4NgkjdHVuZVBsYXllckZ1bGxPU0Vycgotbm90ZUNoYW5uZWxOb3RBbGxvY2F0ZWRPU0Vycgk9CS0yMDg1CSNub3RlQ2hhbm5lbE5vdEFsbG9jYXRlZE9TRXJyCi1pbGxlZ2FsTm90ZUNoYW5uZWxPU0Vycgk9CS0yMDg0CSNpbGxlZ2FsTm90ZUNoYW5uZWxPU0Vycgotc3ludGhlc2l6ZXJPU0Vycgk9CS0yMDgzCSNzeW50aGVzaXplck9TRXJyCi1zeW50aGVzaXplck5vdFJlc3BvbmRpbmdPU0Vycgk9CS0yMDgyCSNzeW50aGVzaXplck5vdFJlc3BvbmRpbmdPU0VycgotbWlkaU1hbmFnZXJBYnNlbnRPU0Vycgk9CS0yMDgxCSNtaWRpTWFuYWdlckFic2VudE9TRXJyCi1pbGxlZ2FsQ29udHJvbGxlck9TRXJyCT0JLTIwODAJI2lsbGVnYWxDb250cm9sbGVyT1NFcnIKLWlsbGVnYWxJbnN0cnVtZW50T1NFcnIJPQktMjA3OQkjaWxsZWdhbEluc3RydW1lbnRPU0VycgotaWxsZWdhbEtub2JWYWx1ZU9TRXJyCT0JLTIwNzgJI2lsbGVnYWxLbm9iVmFsdWVPU0VycgotaWxsZWdhbEtub2JPU0Vycgk9CS0yMDc3CSNpbGxlZ2FsS25vYk9TRXJyCi1pbGxlZ2FsQ2hhbm5lbE9TRXJyCT0JLTIwNzYJI2lsbGVnYWxDaGFubmVsT1NFcnIKLWlsbGVnYWxQYXJ0T1NFcnIJPQktMjA3NQkjaWxsZWdhbFBhcnRPU0VycgotaWxsZWdhbFZvaWNlQWxsb2NhdGlvbk9TRXJyCT0JLTIwNzQJI2lsbGVnYWxWb2ljZUFsbG9jYXRpb25PU0VycgotY2FudFJlY2VpdmVGcm9tU3ludGhlc2l6ZXJPU0Vycgk9CS0yMDczCSNjYW50UmVjZWl2ZUZyb21TeW50aGVzaXplck9TRXJyCi1jYW50U2VuZFRvU3ludGhlc2l6ZXJPU0Vycgk9CS0yMDcyCSNjYW50U2VuZFRvU3ludGhlc2l6ZXJPU0Vycgotbm90SW1wbGVtZW50ZWRNdXNpY09TRXJyCT0JLTIwNzEJI25vdEltcGxlbWVudGVkTXVzaWNPU0VycgotaW50ZXJuYWxDb21wb25lbnRFcnIJPQktMjA3MAkjaW50ZXJuYWxDb21wb25lbnRFcnIKLWludmFsaWRTcHJpdGVJREVycgk9CS0yMDY5CSNpbnZhbGlkU3ByaXRlSURFcnIKLWludmFsaWRJbWFnZUluZGV4RXJyCT0JLTIwNjgJI2ludmFsaWRJbWFnZUluZGV4RXJyCi1pbnZhbGlkU3ByaXRlSW5kZXhFcnIJPQktMjA2NwkjaW52YWxpZFNwcml0ZUluZGV4RXJyCi1nV29ybGRzTm90U2FtZURlcHRoQW5kU2l6ZUVycgk9CS0yMDY2CSNnV29ybGRzTm90U2FtZURlcHRoQW5kU2l6ZUVycgotaW52YWxpZFNwcml0ZVByb3BlcnR5RXJyCT0JLTIwNjUJI2ludmFsaWRTcHJpdGVQcm9wZXJ0eUVycgotaW52YWxpZFNwcml0ZVdvcmxkUHJvcGVydHlFcnIJPQktMjA2NAkjaW52YWxpZFNwcml0ZVdvcmxkUHJvcGVydHlFcnIKLW1pc3NpbmdSZXF1aXJlZFBhcmFtZXRlckVycgk9CS0yMDYzCSNtaXNzaW5nUmVxdWlyZWRQYXJhbWV0ZXJFcnIKLW1vdmllVGV4dE5vdEZvdW5kRXJyCT0JLTIwNjIJI21vdmllVGV4dE5vdEZvdW5kRXJyCi1zb3VyY2VOb3RGb3VuZEVycgk9CS0yMDYxCSNzb3VyY2VOb3RGb3VuZEVycgotbm9Tb3VyY2VUcmVlRm91bmRFcnIJPQktMjA2MAkjbm9Tb3VyY2VUcmVlRm91bmRFcnIKLXNhbXBsZXNBbHJlYWR5SW5NZWRpYUVycgk9CS0yMDU5CSNzYW1wbGVzQWxyZWFkeUluTWVkaWFFcnIKLWF1eGlsaWFyeUV4cG9ydERhdGFVbmF2YWlsYWJsZQk9CS0yMDU4CSNhdXhpbGlhcnlFeHBvcnREYXRhVW5hdmFpbGFibGUKLXVuc3VwcG9ydGVkQXV4aWxpYXJ5SW1wb3J0RGF0YQk9CS0yMDU3CSN1bnN1cHBvcnRlZEF1eGlsaWFyeUltcG9ydERhdGEKLXNvdW5kU3VwcG9ydE5vdEF2YWlsYWJsZUVycgk9CS0yMDU2CSNRVCBmb3IgV2luZG93cyBlcnJvcgotbm9Tb3VuZFRyYWNrSW5Nb3ZpZUVycgk9CS0yMDU1CSNRVCBmb3IgV2luZG93cyBlcnJvcgotbm9WaWRlb1RyYWNrSW5Nb3ZpZUVycgk9CS0yMDU0CSNRVCBmb3IgV2luZG93cyBlcnJvcgotZmVhdHVyZVVuc3VwcG9ydGVkCT0JLTIwNTMJI2ZlYXR1cmVVbnN1cHBvcnRlZAotY291bGROb3RVc2VBbkV4aXN0aW5nU2FtcGxlCT0JLTIwNTIJI2NvdWxkTm90VXNlQW5FeGlzdGluZ1NhbXBsZQotbm9EZWZhdWx0RGF0YVJlZgk9CS0yMDUxCSNub0RlZmF1bHREYXRhUmVmCi1iYWREYXRhUmVmSW5kZXgJPQktMjA1MAkjYmFkRGF0YVJlZkluZGV4Ci1pbnZhbGlkRGF0YVJlZkNvbnRhaW5lcgk9CS0yMDQ5CSNpbnZhbGlkRGF0YVJlZkNvbnRhaW5lcgotbm9Nb3ZpZUZvdW5kCT0JLTIwNDgJI25vTW92aWVGb3VuZAotZGF0YU5vRGF0YVJlZgk9CS0yMDQ3CSNkYXRhTm9EYXRhUmVmCi1lbmRPZkRhdGFSZWFjaGVkCT0JLTIwNDYJI2VuZE9mRGF0YVJlYWNoZWQKLWRhdGFBbHJlYWR5Q2xvc2VkCT0JLTIwNDUJI2RhdGFBbHJlYWR5Q2xvc2VkCi1kYXRhQWxyZWFkeU9wZW5Gb3JXcml0ZQk9CS0yMDQ0CSNkYXRhQWxyZWFkeU9wZW5Gb3JXcml0ZQotZGF0YU5vdE9wZW5Gb3JXcml0ZQk9CS0yMDQzCSNkYXRhTm90T3BlbkZvcldyaXRlCi1kYXRhTm90T3BlbkZvclJlYWQJPQktMjA0MgkjZGF0YU5vdE9wZW5Gb3JSZWFkCi1pbnZhbGlkU2FtcGxlRGVzY3JpcHRpb24JPQktMjA0MQkjaW52YWxpZFNhbXBsZURlc2NyaXB0aW9uCi1pbnZhbGlkQ2h1bmtDYWNoZQk9CS0yMDQwCSNpbnZhbGlkQ2h1bmtDYWNoZQotaW52YWxpZFNhbXBsZURlc2NJbmRleAk9CS0yMDM5CSNpbnZhbGlkU2FtcGxlRGVzY0luZGV4Ci1pbnZhbGlkQ2h1bmtOdW0JPQktMjAzOAkjaW52YWxpZENodW5rTnVtCi1pbnZhbGlkU2FtcGxlTnVtCT0JLTIwMzcJI2ludmFsaWRTYW1wbGVOdW0KLWludmFsaWRSZWN0CT0JLTIwMzYJI2ludmFsaWRSZWN0Ci1jYW50RW5hYmxlVHJhY2sJPQktMjAzNQkjY2FudEVuYWJsZVRyYWNrCi1pbnRlcm5hbFF1aWNrVGltZUVycm9yCT0JLTIwMzQJI2ludGVybmFsUXVpY2tUaW1lRXJyb3IKLWJhZEVkaXRJbmRleAk9CS0yMDMzCSNiYWRFZGl0SW5kZXgKLXRpbWVOb3RJbk1lZGlhCT0JLTIwMzIJI3RpbWVOb3RJbk1lZGlhCi10aW1lTm90SW5UcmFjawk9CS0yMDMxCSN0aW1lTm90SW5UcmFjawotdHJhY2tOb3RJbk1vdmllCT0JLTIwMzAJI3RyYWNrTm90SW5Nb3ZpZQotdHJhY2tJRE5vdEZvdW5kCT0JLTIwMjkJI3RyYWNrSUROb3RGb3VuZAotYmFkVHJhY2tJbmRleAk9CS0yMDI4CSNiYWRUcmFja0luZGV4Ci1tYXhTaXplVG9Hcm93VG9vU21hbGwJPQktMjAyNwkjbWF4U2l6ZVRvR3Jvd1Rvb1NtYWxsCi11c2VyRGF0YUl0ZW1Ob3RGb3VuZAk9CS0yMDI2CSN1c2VyRGF0YUl0ZW1Ob3RGb3VuZAotc3RhbGVFZGl0U3RhdGUJPQktMjAyNQkjc3RhbGVFZGl0U3RhdGUKLW5vbk1hdGNoaW5nRWRpdFN0YXRlCT0JLTIwMjQJI25vbk1hdGNoaW5nRWRpdFN0YXRlCi1pbnZhbGlkRWRpdFN0YXRlCT0JLTIwMjMJI2ludmFsaWRFZGl0U3RhdGUKLWNhbnRDcmVhdGVTaW5nbGVGb3JrRmlsZQk9CS0yMDIyCSNoYXBwZW5zIHdoZW4gZmlsZSBhbHJlYWR5IGV4aXN0cwotd2ZGaWxlTm90Rm91bmQJPQktMjAyMQkjd2ZGaWxlTm90Rm91bmQKLW1vdmllVG9vbGJveFVuaW5pdGlhbGl6ZWQJPQktMjAyMAkjbW92aWVUb29sYm94VW5pbml0aWFsaXplZAotcHJvZ3Jlc3NQcm9jQWJvcnRlZAk9CS0yMDE5CSNwcm9ncmVzc1Byb2NBYm9ydGVkCi1tZWRpYVR5cGVzRG9udE1hdGNoCT0JLTIwMTgJI21lZGlhVHlwZXNEb250TWF0Y2gKLWJhZEVkaXRMaXN0CT0JLTIwMTcJI2JhZEVkaXRMaXN0Ci1jYW50UHV0UHVibGljTW92aWVBdG9tCT0JLTIwMTYJI2NhbnRQdXRQdWJsaWNNb3ZpZUF0b20KLWludmFsaWRUaW1lCT0JLTIwMTUJI2ludmFsaWRUaW1lCi1pbnZhbGlkRHVyYXRpb24JPQktMjAxNAkjaW52YWxpZER1cmF0aW9uCi1pbnZhbGlkSGFuZGxlcgk9CS0yMDEzCSNpbnZhbGlkSGFuZGxlcgotaW52YWxpZERhdGFSZWYJPQktMjAxMgkjaW52YWxpZERhdGFSZWYKLWludmFsaWRTYW1wbGVUYWJsZQk9CS0yMDExCSNpbnZhbGlkU2FtcGxlVGFibGUKLWludmFsaWRNb3ZpZQk9CS0yMDEwCSNpbnZhbGlkTW92aWUKLWludmFsaWRUcmFjawk9CS0yMDA5CSNpbnZhbGlkVHJhY2sKLWludmFsaWRNZWRpYQk9CS0yMDA4CSNpbnZhbGlkTWVkaWEKLW5vRGF0YUhhbmRsZXIJPQktMjAwNwkjbm9EYXRhSGFuZGxlcgotbm9NZWRpYUhhbmRsZXIJPQktMjAwNgkjbm9NZWRpYUhhbmRsZXIKLWJhZENvbXBvbmVudFR5cGUJPQktMjAwNQkjYmFkQ29tcG9uZW50VHlwZQotY2FudE9wZW5IYW5kbGVyCT0JLTIwMDQJI2NhbnRPcGVuSGFuZGxlcgotY2FudEZpbmRIYW5kbGVyCT0JLTIwMDMJI2NhbnRGaW5kSGFuZGxlcgotYmFkUHVibGljTW92aWVBdG9tCT0JLTIwMDIJI2JhZFB1YmxpY01vdmllQXRvbQotYmFkSW1hZ2VEZXNjcmlwdGlvbgk9CS0yMDAxCSNiYWRJbWFnZURlc2NyaXB0aW9uCi1jb3VsZE5vdFJlc29sdmVEYXRhUmVmCT0JLTIwMDAJI2NvdWxkTm90UmVzb2x2ZURhdGFSZWYKLW5vbkRyYWdPcmlnaW5hdG9yRXJyCT0JLTE4NjIJI2lsbGVnYWwgYXR0ZW1wdCBhdCBvcmlnaW5hdG9yIG9ubHkgZGF0YQotYmFkSW1hZ2VFcnIJPQktMTg2MQkjYmFkIHRyYW5zbHVjZW50IGltYWdlIFBpeE1hcAotYmFkSW1hZ2VSZ25FcnIJPQktMTg2MAkjYmFkIHRyYW5zbHVjZW50IGltYWdlIHJlZ2lvbgotbm9TdWl0YWJsZURpc3BsYXlzRXJyCT0JLTE4NTkJI25vIGRpc3BsYXlzIHN1cHBvcnQgdHJhbnNsdWNlbmN5Ci11bnN1cHBvcnRlZEZvclBsYXRmb3JtRXJyCT0JLTE4NTgJI2NhbGwgaXMgZm9yIFBvd2VyUEMgb25seQotZHJhZ05vdEFjY2VwdGVkRXJyCT0JLTE4NTcJI2RyYWcgd2FzIG5vdCBhY2NlcHRlZCBieSByZWNlaXZlcgotaGFuZGxlck5vdEZvdW5kRXJyCT0JLTE4NTYJI2hhbmRsZXIgbm90IGZvdW5kCi1kdXBsaWNhdGVIYW5kbGVyRXJyCT0JLTE4NTUJI2hhbmRsZXIgYWxyZWFkeSBleGlzdHMKLWNhbnRHZXRGbGF2b3JFcnIJPQktMTg1NAkjZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGdldCBmbGF2b3IgZGF0YQotZHVwbGljYXRlRmxhdm9yRXJyCT0JLTE4NTMJI2ZsYXZvciB0eXBlIGFscmVhZHkgZXhpc3RzCi1iYWREcmFnRmxhdm9yRXJyCT0JLTE4NTIJI3Vua25vd24gZmxhdm9yIHR5cGUKLWJhZERyYWdJdGVtRXJyCT0JLTE4NTEJI3Vua25vd24gZHJhZyBpdGVtIHJlZmVyZW5jZQotYmFkRHJhZ1JlZkVycgk9CS0xODUwCSN1bmtub3duIGRyYWcgcmVmZXJlbmNlCi1lcnJFbmRPZkJvZHkJPQktMTgxMwkjZXJyRW5kT2ZCb2R5Ci1lcnJFbmRPZkRvY3VtZW50CT0JLTE4MTIJI2VyckVuZE9mRG9jdW1lbnQKLWVyclRvcE9mQm9keQk9CS0xODExCSNlcnJUb3BPZkJvZHkKLWVyclRvcE9mRG9jdW1lbnQJPQktMTgxMAkjZXJyVG9wT2ZEb2N1bWVudAotZXJyT2Zmc2V0SXNPdXRzaWRlT2ZWaWV3CT0JLTE4MDEJI2Vyck9mZnNldElzT3V0c2lkZU9mVmlldwotZXJyT2Zmc2V0SW52YWxpZAk9CS0xODAwCSNlcnJPZmZzZXRJbnZhbGlkCi1lcnJPU0FDYW50T3BlbkNvbXBvbmVudAk9CS0xNzYyCSNDYW4ndCBjb25uZWN0IHRvIHNjcmlwdGluZyBzeXN0ZW0gd2l0aCB0aGF0IElECi1lcnJPU0FDb21wb25lbnRNaXNtYXRjaAk9CS0xNzYxCSNQYXJhbWV0ZXJzIGFyZSBmcm9tIDIgZGlmZmVyZW50IGNvbXBvbmVudHMKLWVyck9TQURhdGFGb3JtYXRUb29OZXcJPQktMTc1OQkjZXJyT1NBRGF0YUZvcm1hdFRvb05ldwotZXJyT1NBRGF0YUZvcm1hdE9ic29sZXRlCT0JLTE3NTgJI2Vyck9TQURhdGFGb3JtYXRPYnNvbGV0ZQotZXJyT1NBTm9TdWNoRGlhbGVjdAk9CS0xNzU3CSNlcnJPU0FOb1N1Y2hEaWFsZWN0Ci1lcnJPU0FTb3VyY2VOb3RBdmFpbGFibGUJPQktMTc1NgkjZXJyT1NBU291cmNlTm90QXZhaWxhYmxlCi1lcnJPU0FCYWRTZWxlY3Rvcgk9CS0xNzU0CSNlcnJPU0FCYWRTZWxlY3RvcgotZXJyT1NBU2NyaXB0RXJyb3IJPQktMTc1MwkjZXJyT1NBU2NyaXB0RXJyb3IKLWVyck9TQUJhZFN0b3JhZ2VUeXBlCT0JLTE3NTIJI2Vyck9TQUJhZFN0b3JhZ2VUeXBlCi1lcnJPU0FJbnZhbGlkSUQJPQktMTc1MQkjZXJyT1NBSW52YWxpZElECi1lcnJPU0FTeXN0ZW1FcnJvcgk9CS0xNzUwCSNlcnJPU0FTeXN0ZW1FcnJvcgotZXJyQUVCdWZmZXJUb29TbWFsbAk9CS0xNzQxCSNidWZmZXIgZm9yIEFFRmxhdHRlbkRlc2MgdG9vIHNtYWxsCi1lcnJBRUJ1aWxkU3ludGF4RXJyb3IJPQktMTc0MAkjQUVCdWlsZERlc2MgYW5kIGZyaWVuZHMgZGV0ZWN0ZWQgYSBzeW50YXggZXJyb3IKLWVyckFFRGVzY0lzTnVsbAk9CS0xNzM5CSNhdHRlbXB0aW5nIHRvIHBlcmZvcm0gYW4gaW52YWxpZCBvcGVyYXRpb24gb24gYSBudWxsIGRlc2NyaXB0b3IKLWVyckFFU3RyZWFtQWxyZWFkeUNvbnZlcnRlZAk9CS0xNzM4CSNhdHRlbXB0IHRvIGNvbnZlcnQgYSBzdHJlYW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZAotZXJyQUVTdHJlYW1CYWROZXN0aW5nCT0JLTE3MzcJI25lc3RpbmcgdmlvbGF0aW9uIHdoaWxlIHN0cmVhbWluZwotZXJyQUVEdXBsaWNhdGVIYW5kbGVyCT0JLTE3MzYJI2F0dGVtcHQgdG8gaW5zdGFsbCBoYW5kbGVyIGluIHRhYmxlIGZvciBpZGVudGljYWwgY2xhc3MgYW5kIGlkICgxLjEgb3IgZ3JlYXRlcikKLWVyckFFRXZlbnRGaWx0ZXJlZAk9CS0xNzM1CSNldmVudCBoYXMgYmVlbiBmaWx0ZXJlZCwgYW5kIHNob3VsZCBub3QgYmUgcHJvcG9nYXRlZCAoMS4xIG9yIGdyZWF0ZXIpCi1lcnJBRVJlY2VpdmVFc2NhcGVDdXJyZW50CT0JLTE3MzQJI2JyZWFrIG91dCBvZiBvbmx5IGxvd2VzdCBsZXZlbCBvZiBBRVJlY2VpdmUgKDEuMSBvciBncmVhdGVyKQotZXJyQUVSZWNlaXZlVGVybWluYXRlCT0JLTE3MzMJI2JyZWFrIG91dCBvZiBhbGwgbGV2ZWxzIG9mIEFFUmVjZWl2ZSB0byB0aGUgdG9wbW9zdCAoMS4xIG9yIGdyZWF0ZXIpCi1lcnJBRVJlY29yZGluZ0lzQWxyZWFkeU9uCT0JLTE3MzIJI2F2YWlsYWJsZSBvbmx5IGluIHZlcnNpb24gMS4wLjEgb3IgZ3JlYXRlcgotZXJyQUVVbmtub3duT2JqZWN0VHlwZQk9CS0xNzMxCSNhdmFpbGFibGUgb25seSBpbiB2ZXJzaW9uIDEuMC4xIG9yIGdyZWF0ZXIKLWVyckFFRW1wdHlMaXN0Q29udGFpbmVyCT0JLTE3MzAJI0F0dGVtcHQgdG8gcGFzcyBlbXB0eSBsaXN0IGFzIGNvbnRhaW5lciB0byBhY2Nlc3NvcgotZXJyQUVOZWdhdGl2ZUNvdW50CT0JLTE3MjkJI0NvdW50UHJvYyByZXR1cm5lZCBuZWdhdGl2ZSB2YWx1ZQotZXJyQUVOb1N1Y2hPYmplY3QJPQktMTcyOAkjZS5nLiw6IHNwZWNpZmllciBhc2tlZCBmb3IgdGhlIDNyZCwgYnV0IHRoZXJlIGFyZSBvbmx5IDIuIEJhc2ljYWxseSwgdGhpcyBpbmRpY2F0ZXMgYSBydW4tdGltZSByZXNvbHV0aW9uIGVycm9yLgotZXJyQUVOb3RBbk9ialNwZWMJPQktMTcyNwkjUGFyYW0gdG8gQUVSZXNvbHZlIG5vdCBvZiB0eXBlICdvYmogJwotZXJyQUVCYWRUZXN0S2V5CT0JLTE3MjYJI1Rlc3QgaXMgbmVpdGhlciB0eXBlTG9naWNhbERlc2NyaXB0b3Igbm9yIHR5cGVDb21wRGVzY3JpcHRvcgotZXJyQUVOb1N1Y2hMb2dpY2FsCT0JLTE3MjUJI1NvbWV0aGluZyBvdGhlciB0aGFuIEFORCwgT1IsIG9yIE5PVAotZXJyQUVBY2Nlc3Nvck5vdEZvdW5kCT0JLTE3MjMJI0FjY2Vzc29yIHByb2MgbWF0Y2hpbmcgd2FudENsYXNzIGFuZCBjb250YWluZXJUeXBlIG9yIHdpbGRjYXJkcyBub3QgZm91bmQKLWVyckFFV3JvbmdOdW1iZXJBcmdzCT0JLTE3MjEJI0xvZ2ljYWwgb3Aga0FFTk9UIHVzZWQgd2l0aCBvdGhlciB0aGFuIDEgdGVybQotZXJyQUVJbXBvc3NpYmxlUmFuZ2UJPQktMTcyMAkjQSByYW5nZSBsaWtlIDNyZCB0byAybmQsIG9yIDFzdCB0byBhbGwuCi1lcnJBRUlsbGVnYWxJbmRleAk9CS0xNzE5CSNpbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gYSBwdXQgb3BlcmF0aW9uCi1lcnJBRVJlcGx5Tm90QXJyaXZlZAk9CS0xNzE4CSN0aGUgY29udGVudHMgb2YgdGhlIHJlcGx5IHlvdSBhcmUgYWNjZXNzaW5nIGhhdmUgbm90IGFycml2ZWQgeWV0Ci1lcnJBRUhhbmRsZXJOb3RGb3VuZAk9CS0xNzE3CSNubyBoYW5kbGVyIGluIHRoZSBkaXNwYXRjaCB0YWJsZXMgZml0cyB0aGUgcGFyYW1ldGVycyB0byBBRUdldEV2ZW50SGFuZGxlciBvciBBRUdldENvZXJjaW9uSGFuZGxlcgotZXJyQUVVbmtub3duQWRkcmVzc1R5cGUJPQktMTcxNgkjdGhlIHRhcmdldCBhZGRyZXNzIHR5cGUgaXMgbm90IGtub3duCi1lcnJBRVBhcmFtTWlzc2VkCT0JLTE3MTUJI2EgcmVxdWlyZWQgcGFyYW1ldGVyIHdhcyBub3QgYWNjZXNzZWQKLWVyckFFTm90QVNwZWNpYWxGdW5jdGlvbgk9CS0xNzE0CSN0aGVyZSBpcyBubyBzcGVjaWFsIGZ1bmN0aW9uIGZvci93aXRoIHRoaXMga2V5d29yZAotZXJyQUVOb1VzZXJJbnRlcmFjdGlvbgk9CS0xNzEzCSNubyB1c2VyIGludGVyYWN0aW9uIGlzIGFsbG93ZWQKLWVyckFFVGltZW91dAk9CS0xNzEyCSN0aGUgQXBwbGVFdmVudCB0aW1lZCBvdXQKLWVyckFFV2FpdENhbmNlbGVkCT0JLTE3MTEJI2luIEFFU2VuZCwgdGhlIHVzZXIgY2FuY2VsbGVkIG91dCBvZiB3YWl0IGxvb3AgZm9yIHJlcGx5IG9yIHJlY2VpcHQKLWVyckFFVW5rbm93blNlbmRNb2RlCT0JLTE3MTAJI21vZGUgd2Fzbid0IE5vUmVwbHksIFdhaXRSZXBseSwgb3IgUXVldWVSZXBseSBvciBJbnRlcmFjdGlvbiBsZXZlbCBpcyB1bmtub3duCi1lcnJBRVJlcGx5Tm90VmFsaWQJPQktMTcwOQkjQUVSZXNldFRpbWVyIHdhcyBwYXNzZWQgYW4gaW52YWxpZCByZXBseSBwYXJhbWV0ZXIKLWVyckFFRXZlbnROb3RIYW5kbGVkCT0JLTE3MDgJI3RoZSBBcHBsZUV2ZW50IHdhcyBub3QgaGFuZGxlZCBieSBhbnkgaGFuZGxlcgotZXJyQUVOb3RBcHBsZUV2ZW50CT0JLTE3MDcJI3RoZSBldmVudCBpcyBub3QgaW4gQXBwbGVFdmVudCBmb3JtYXQKLWVyckFFTmV3ZXJWZXJzaW9uCT0JLTE3MDYJI25lZWQgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgQXBwbGVFdmVudCBtYW5hZ2VyCi1lcnJBRUJhZExpc3RJdGVtCT0JLTE3MDUJI3RoZSBzcGVjaWZpZWQgbGlzdCBpdGVtIGRvZXMgbm90IGV4aXN0Ci1lcnJBRU5vdEFFRGVzYwk9CS0xNzA0CSNlcnJBRU5vdEFFRGVzYwotZXJyQUVXcm9uZ0RhdGFUeXBlCT0JLTE3MDMJI2VyckFFV3JvbmdEYXRhVHlwZQotZXJyQUVDb3JydXB0RGF0YQk9CS0xNzAyCSNlcnJBRUNvcnJ1cHREYXRhCi1lcnJBRURlc2NOb3RGb3VuZAk9CS0xNzAxCSNlcnJBRURlc2NOb3RGb3VuZAotZXJyQUVDb2VyY2lvbkZhaWwJPQktMTcwMAkjYmFkIHBhcmFtZXRlciBkYXRhIG9yIHVuYWJsZSB0byBjb2VyY2UgdGhlIGRhdGEgc3VwcGxpZWQKLWVyckZTSXRlcmF0b3JOb3RTdXBwb3J0ZWQJPQktMTQyNAkjVGhlIGl0ZXJhdG9yJ3MgZmxhZ3Mgb3IgY29udGFpbmVyIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY2FsbAotZXJyRlNJdGVyYXRvck5vdEZvdW5kCT0JLTE0MjMJI1Bhc3NlZCBGU0l0ZXJhdG9yIGlzIG5vdCBhbiBvcGVuIGl0ZXJhdG9yCi1lcnJGU0JhZEl0ZXJhdG9yRmxhZ3MJPQktMTQyMgkjRmxhZ3MgcGFzc2VkIHRvIEZTT3Blbkl0ZXJhdG9yIGFyZSBiYWQKLWVyckZTRm9ya0V4aXN0cwk9CS0xNDIxCSNOYW1lZCBmb3JrIGFscmVhZHkgZXhpc3RzLgotZXJyRlNSZWZzRGlmZmVyZW50CT0JLTE0MjAJI0ZTQ29tcGFyZUZTUmVmczsgcmVmcyBhcmUgZm9yIGRpZmZlcmVudCBvYmplY3RzCi1lcnJGU0JhZFNlYXJjaFBhcmFtcwk9CS0xNDE5CSNTb21ldGhpbmcgd3Jvbmcgd2l0aCBDYXRhbG9nU2VhcmNoIHNlYXJjaFBhcmFtcwotZXJyRlNCYWRJdGVtQ291bnQJPQktMTQxOAkjbWF4aW11bUl0ZW1zIHdhcyB6ZXJvCi1lcnJGU05vTW9yZUl0ZW1zCT0JLTE0MTcJI0l0ZXJhdGlvbiByYW4gb3V0IG9mIGl0ZW1zIHRvIHJldHVybgotZXJyRlNCYWRBbGxvY0ZsYWdzCT0JLTE0MTMJI0ludmFsaWQgYml0cyBzZXQgaW4gYWxsb2NhdGlvbkZsYWdzCi1lcnJGU0JhZFBvc01vZGUJPQktMTQxMgkjTmV3bGluZSBiaXRzIHNldCBpbiBwb3NpdGlvbk1vZGUKLWVyckZTTWlzc2luZ05hbWUJPQktMTQxMQkjQSBVbmljb2RlIG5hbWUgcGFyYW1ldGVyIHdhcyBOVUxMIG9yIG5hbWVMZW5ndGggcGFyYW1ldGVyIHdhcyB6ZXJvCi1lcnJGU05hbWVUb29Mb25nCT0JLTE0MTAJI0ZpbGUvZm9yayBuYW1lIGlzIHRvbyBsb25nIHRvIGNyZWF0ZS9yZW5hbWUKLWVyckZTRm9ya05vdEZvdW5kCT0JLTE0MDkJI05hbWVkIGZvcmsgZG9lcyBub3QgZXhpc3QKLWVyckZTTm90QUZvbGRlcgk9CS0xNDA3CSNFeHBlY3RlZCBhIGZvbGRlciwgZ290IGEgZmlsZQotZXJyRlNNaXNzaW5nQ2F0SW5mbwk9CS0xNDA2CSNBIENhdGFsb2dJbmZvIHBhcmFtZXRlciB3YXMgTlVMTAotZXJyRlNCYWRJbmZvQml0bWFwCT0JLTE0MDUJI0EgQ2F0YWxvZ0luZm9CaXRtYXAgb3IgVm9sdW1lSW5mb0JpdG1hcCBoYXMgcmVzZXJ2ZWQgb3IgaW52YWxpZCBiaXRzIHNldAotZXJyRlNCYWRGb3JrUmVmCT0JLTE0MDQJI0EgRm9ya1JlZk51bSBwYXJhbWV0ZXIgd2FzIGJhZAotZXJyRlNCYWRCdWZmZXIJPQktMTQwMwkjQSBidWZmZXIgcGFyYW1ldGVyIHdhcyBiYWQKLWVyckZTQmFkRm9ya05hbWUJPQktMTQwMgkjRm9yayBuYW1lIHBhcmFtZXRlciBpcyBiYWQKLWVyckZTQmFkRlNSZWYJPQktMTQwMQkjRlNSZWYgcGFyYW1ldGVyIGlzIGJhZAotZXJyRlNVbmtub3duQ2FsbAk9CS0xNDAwCSNzZWxlY3RvciBpcyBub3QgcmVjb2duaXplZCBieSB0aGlzIGZpbGVzeXN0ZW0KLWJhZEZDQkVycgk9CS0xMzI3CSNGQ0JSZWNQdHIgaXMgbm90IHZhbGlkCi12b2xWTUJ1c3lFcnIJPQktMTMxMQkjY2FuJ3QgZWplY3QgYmVjYXVzZSB2b2x1bWUgaXMgaW4gdXNlIGJ5IFZNCi1mc0RhdGFUb29CaWdFcnIJPQktMTMxMAkjZmlsZSBvciB2b2x1bWUgaXMgdG9vIGJpZyBmb3Igc3lzdGVtCi1maWxlQm91bmRzRXJyCT0JLTEzMDkJI2ZpbGUncyBFT0YsIG9mZnNldCwgbWFyayBvciBzaXplIGlzIHRvbyBiaWcKLW5vdEFSZW1vdW50RXJyCT0JLTEzMDgJI3doZW4gX01vdW50IGFsbG93cyBvbmx5IHJlbW91bnRzIGFuZCBkb2Vzbid0IGdldCBvbmUKLWJhZEZpZEVycgk9CS0xMzA3CSNmaWxlIGlkIGlzIGRhbmdsaW5nIG9yIGRvZXNuJ3QgbWF0Y2ggd2l0aCB0aGUgZmlsZSBudW1iZXIKLXNhbWVGaWxlRXJyCT0JLTEzMDYJI2Nhbid0IGV4Y2hhbmdlIGEgZmlsZSB3aXRoIGl0c2VsZgotZGVza3RvcERhbWFnZWRFcnIJPQktMTMwNQkjZGVza3RvcCBkYXRhYmFzZSBmaWxlcyBhcmUgY29ycnVwdGVkCi1jYXRDaGFuZ2VkRXJyCT0JLTEzMDQJI3RoZSBjYXRhbG9nIGhhcyBiZWVuIG1vZGlmaWVkCi1kaWZmVm9sRXJyCT0JLTEzMDMJI2ZpbGVzIG9uIGRpZmZlcmVudCB2b2x1bWVzCi1ub3RBRmlsZUVycgk9CS0xMzAyCSNkaXJlY3Rvcnkgc3BlY2lmaWVkCi1maWRFeGlzdHMJPQktMTMwMQkjZmlsZSBpZCBhbHJlYWR5IGV4aXN0cwotZmlkTm90Rm91bmQJPQktMTMwMAkjbm8gZmlsZSB0aHJlYWQgZXhpc3RzLgotZXJyUmVmTnVtCT0JLTEyODAJI2JhZCBjb25uZWN0aW9uIHJlZk51bQotZXJyQWJvcnRlZAk9CS0xMjc5CSNjb250cm9sIGNhbGwgd2FzIGFib3J0ZWQKLWVyclN0YXRlCT0JLTEyNzgJI2JhZCBjb25uZWN0aW9uIHN0YXRlIGZvciB0aGlzIG9wZXJhdGlvbgotZXJyT3BlbmluZwk9CS0xMjc3CSNvcGVuIGNvbm5lY3Rpb24gcmVxdWVzdCBmYWlsZWQKLWVyckF0dGVudGlvbgk9CS0xMjc2CSNhdHRlbnRpb24gbWVzc2FnZSB0b28gbG9uZwotZXJyRndkUmVzZXQJPQktMTI3NQkjcmVhZCB0ZXJtaW5hdGVkIGJ5IGZvcndhcmQgcmVzZXQKLWVyckRTUFF1ZXVlU2l6ZQk9CS0xMjc0CSNEU1AgUmVhZC9Xcml0ZSBRdWV1ZSBUb28gc21hbGwKLWVyck9wZW5EZW5pZWQJPQktMTI3Mwkjb3BlbiBjb25uZWN0aW9uIHJlcXVlc3Qgd2FzIGRlbmllZAotcmVxQWJvcnRlZAk9CS0xMTA1CSNyZXFBYm9ydGVkCi1ub0RhdGFBcmVhCT0JLTExMDQJI25vRGF0YUFyZWEKLW5vU2VuZFJlc3AJPQktMTEwMwkjbm9TZW5kUmVzcAotY2JOb3RGb3VuZAk9CS0xMTAyCSNjYk5vdEZvdW5kCi1ub1JlbEVycgk9CS0xMTAxCSNub1JlbEVycgotYmFkQnVmZk51bQk9CS0xMTAwCSNiYWRCdWZmTnVtCi1iYWRBVFBTa3QJPQktMTA5OQkjYmFkQVRQU2t0Ci10b29NYW55U2t0cwk9CS0xMDk4CSN0b29NYW55U2t0cwotdG9vTWFueVJlcXMJPQktMTA5NwkjdG9vTWFueVJlcXMKLXJlcUZhaWxlZAk9CS0xMDk2CSNyZXFGYWlsZWQKLWFzcE5vQWNrCT0JLTEwNzUJI05vIGFjayBvbiBhdHRlbnRpb24gcmVxdWVzdCAoc2VydmVyIGVycikKLWFzcFRvb01hbnkJPQktMTA3NAkjVG9vIG1hbnkgY2xpZW50cyAoc2VydmVyIGVycm9yKQotYXNwU2l6ZUVycgk9CS0xMDczCSNDb21tYW5kIGJsb2NrIHRvbyBiaWcKLWFzcFNlc3NDbG9zZWQJPQktMTA3MgkjU2Vzc2lvbiBjbG9zZWQKLWFzcFNlcnZlckJ1c3kJPQktMTA3MQkjU2VydmVyIGNhbm5vdCBvcGVuIGFub3RoZXIgc2Vzc2lvbgotYXNwUGFyYW1FcnIJPQktMTA3MAkjUGFyYW1ldGVyIGVycm9yCi1hc3BOb1NlcnZlcnMJPQktMTA2OQkjTm8gc2VydmVycyBhdCB0aGF0IGFkZHJlc3MKLWFzcE5vTW9yZVNlc3MJPQktMTA2OAkjTm8gbW9yZSBzZXNzaW9ucyBvbiBzZXJ2ZXIKLWFzcEJ1ZlRvb1NtYWxsCT0JLTEwNjcJI0J1ZmZlciB0b28gc21hbGwKLWFzcEJhZFZlcnNOdW0JPQktMTA2NgkjU2VydmVyIGNhbm5vdCBzdXBwb3J0IHRoaXMgQVNQIHZlcnNpb24KLW5icE5JU0Vycgk9CS0xMDI5CSNFcnJvciB0cnlpbmcgdG8gb3BlbiB0aGUgTklTCi1uYnBOb3RGb3VuZAk9CS0xMDI4CSNOYW1lIG5vdCBmb3VuZCBvbiByZW1vdmUKLW5icER1cGxpY2F0ZQk9CS0xMDI3CSNEdXBsaWNhdGUgbmFtZSBleGlzdHMgYWxyZWFkeQotbmJwQ29uZkRpZmYJPQktMTAyNgkjTmFtZSBjb25maXJtZWQgYXQgZGlmZmVyZW50IHNvY2tldAotbmJwTm9Db25maXJtCT0JLTEwMjUJI25icE5vQ29uZmlybQotbmJwQnVmZk92cgk9CS0xMDI0CSNCdWZmZXIgb3ZlcmZsb3cgaW4gTG9va3VwTmFtZQotbm9NYXNrRm91bmRFcnIJPQktMTAwMAkjSWNvbiBVdGlsdGllcyBFcnJvcgota0ZNRm9udENvbnRhaW5lckFjY2Vzc0Vycgk9CS05ODUJI2tGTUZvbnRDb250YWluZXJBY2Nlc3NFcnIKLWtGTUZvbnRUYWJsZUFjY2Vzc0Vycgk9CS05ODQJI2tGTUZvbnRUYWJsZUFjY2Vzc0Vycgota0ZNSXRlcmF0aW9uU2NvcGVNb2RpZmllZEVycgk9CS05ODMJI2tGTUl0ZXJhdGlvblNjb3BlTW9kaWZpZWRFcnIKLWtGTUludmFsaWRGb250RXJyCT0JLTk4Mgkja0ZNSW52YWxpZEZvbnRFcnIKLWtGTUludmFsaWRGb250RmFtaWx5RXJyCT0JLTk4MQkja0ZNSW52YWxpZEZvbnRGYW1pbHlFcnIKLWtGTUl0ZXJhdGlvbkNvbXBsZXRlZAk9CS05ODAJI2tGTUl0ZXJhdGlvbkNvbXBsZXRlZAotZ3Vlc3ROb3RBbGxvd2VkRXJyCT0JLTkzMgkjZGVzdGluYXRpb24gcG9ydCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbgotYmFkTG9jTmFtZUVycgk9CS05MzEJI2xvY2F0aW9uIG5hbWUgbWFsZm9ybWVkCi1iYWRTZXJ2aWNlTWV0aG9kRXJyCT0JLTkzMAkjaWxsZWdhbCBzZXJ2aWNlIHR5cGUsIG9yIG5vdCBzdXBwb3J0ZWQKLW5vVXNlclJlY0Vycgk9CS05MjgJI0ludmFsaWQgdXNlciByZWZlcmVuY2UgbnVtYmVyCi1hdXRoRmFpbEVycgk9CS05MjcJI3VuYWJsZSB0byBhdXRoZW50aWNhdGUgdXNlciBhdCBkZXN0aW5hdGlvbgotbm9JbmZvcm1FcnIJPQktOTI2CSNQUENTdGFydCBmYWlsZWQgYmVjYXVzZSBkZXN0aW5hdGlvbiBkaWQgbm90IGhhdmUgaW5mb3JtIHBlbmRpbmcKLW5ldHdvcmtFcnIJPQktOTI1CSNBbiBlcnJvciBoYXMgb2NjdXJyZWQgaW4gdGhlIG5ldHdvcmssIG5vdCB0b28gbGlrZWx5Ci1ub1VzZXJSZWZFcnIJPQktOTI0CSN1bmFibGUgdG8gY3JlYXRlIGEgbmV3IHVzZXJSZWZOdW0KLW5vdExvZ2dlZEluRXJyCT0JLTkyMwkjVGhlIGRlZmF1bHQgdXNlclJlZk51bSBkb2VzIG5vdCB5ZXQgZXhpc3QKLW5vRGVmYXVsdFVzZXJFcnIJPQktOTIyCSN1c2VyIGhhc24ndCB0eXBlZCBpbiBvd25lcnMgbmFtZSBpbiBOZXR3b3JrIFNldHVwIENvbnRyb2wgUGFubmVsCi1iYWRQb3J0TmFtZUVycgk9CS05MTkJI1BQQ1BvcnRSZWMgbWFsZm9ybWVkCi1zZXNzQ2xvc2VkRXJyCT0JLTkxNwkjc2Vzc2lvbiB3YXMgY2xvc2VkCi1wb3J0Q2xvc2VkRXJyCT0JLTkxNgkjcG9ydCB3YXMgY2xvc2VkCi1ub1Jlc3BvbnNlRXJyCT0JLTkxNQkjdW5hYmxlIHRvIGNvbnRhY3QgZGVzdGluYXRpb24KLW5vVG9vbGJveE5hbWVFcnIJPQktOTE0CSNBIHN5c3RlbSByZXNvdXJjZSBpcyBtaXNzaW5nLCBub3QgdG9vIGxpa2VseQotbm9NYWNoaW5lTmFtZUVycgk9CS05MTMJI3VzZXIgaGFzbid0IG5hbWVkIGhpcyBNYWNpbnRvc2ggaW4gdGhlIE5ldHdvcmsgU2V0dXAgQ29udHJvbCBQYW5lbAotdXNlclJlamVjdEVycgk9CS05MTIJI0Rlc3RpbmF0aW9uIHJlamVjdGVkIHRoZSBzZXNzaW9uIHJlcXVlc3QKLW5vVXNlck5hbWVFcnIJPQktOTExCSN1c2VyIG5hbWUgdW5rbm93biBvbiBkZXN0aW5hdGlvbiBtYWNoaW5lCi1wb3J0TmFtZUV4aXN0c0Vycgk9CS05MTAJI3BvcnQgaXMgYWxyZWFkeSBvcGVuIChwZXJoYXBzIGluIGFub3RoZXIgYXBwKQotYmFkUmVxRXJyCT0JLTkwOQkjYmFkIHBhcmFtZXRlciBvciBpbnZhbGlkIHN0YXRlIGZvciBvcGVyYXRpb24KLW5vU2Vzc2lvbkVycgk9CS05MDgJI0ludmFsaWQgc2Vzc2lvbiByZWZlcmVuY2UgbnVtYmVyCi1zZXNzVGFibGVFcnIJPQktOTA3CSNPdXQgb2Ygc2Vzc2lvbiB0YWJsZXMsIHRyeSBhZ2FpbiBsYXRlcgotZGVzdFBvcnRFcnIJPQktOTA2CSNQb3J0IGRvZXMgbm90IGV4aXN0IGF0IGRlc3RpbmF0aW9uCi1sb2NhbE9ubHlFcnIJPQktOTA1CSNOZXR3b3JrIGFjdGl2aXR5IGlzIGN1cnJlbnRseSBkaXNhYmxlZAotbm9HbG9iYWxzRXJyCT0JLTkwNAkjVGhlIHN5c3RlbSBpcyBob3NlZCwgYmV0dGVyIHJlLWJvb3QKLW5vUG9ydEVycgk9CS05MDMJI1VuYWJsZSB0byBvcGVuIHBvcnQgb3IgYmFkIHBvcnRSZWZOdW0uICBJZiB5b3UncmUgY2FsbGluZwotbmFtZVR5cGVFcnIJPQktOTAyCSNJbnZhbGlkIG9yIGluYXBwcm9wcmlhdGUgbG9jYXRpb25LaW5kU2VsZWN0b3IgaW4gbG9jYXRpb25OYW1lCi1ub3RJbml0RXJyCT0JLTkwMAkjUFBDVG9vbEJveCBub3QgaW5pdGlhbGl6ZWQKLW5vdEFwcHJvcHJpYXRlRm9yQ2xhc3NpYwk9CS04NzcJI1RoaXMgYXBwbGljYXRpb24gd29uJ3Qgb3Igc2hvdWxkbid0IHJ1biBvbiBDbGFzc2ljIChQcm9ibGVtIDI0ODEwNTgpLgotYXBwVmVyc2lvblRvb09sZAk9CS04NzYJI1RoZSBhcHBsaWNhdGlvbidzIGNyZWF0b3IgYW5kIHZlcnNpb24gYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgTWFjIE9TLgotd3JvbmdBcHBsaWNhdGlvblBsYXRmb3JtCT0JLTg3NQkjVGhlIGFwcGxpY2F0aW9uIGNvdWxkIG5vdCBsYXVuY2ggYmVjYXVzZSB0aGUgcmVxdWlyZWQgcGxhdGZvcm0gaXMgbm90IGF2YWlsYWJsZQotaG1DbG9zZVZpZXdBY3RpdmUJPQktODYzCSNSZXR1cm5lZCBmcm9tIEhNUmVtb3ZlQmFsbG9vbiBpZiBDbG9zZVZpZXcgd2FzIGFjdGl2ZQotaG1Ob0JhbGxvb25VcAk9CS04NjIJI1JldHVybmVkIGZyb20gSE1SZW1vdmVCYWxsb29uIGlmIG5vIGJhbGxvb24gd2FzIHZpc2libGUgd2hlbiBjYWxsIHdhcyBtYWRlCi1obU9wZXJhdGlvblVuc3VwcG9ydGVkCT0JLTg2MQkjUmV0dXJuZWQgZnJvbSBITVNob3dCYWxsb29uIGNhbGwgaWYgYmFkIG1ldGhvZCBwYXNzZWQgdG8gcm91dGluZQotaG1Vbmtub3duSGVscFR5cGUJPQktODU5CSNSZXR1cm5lZCBpZiBoZWxwIG1zZyByZWNvcmQgY29udGFpbmVkIGEgYmFkIHR5cGUKLWhtV3JvbmdWZXJzaW9uCT0JLTg1OAkjUmV0dXJuZWQgaWYgaGVscCBtZ3IgcmVzb3VyY2Ugd2FzIHRoZSB3cm9uZyB2ZXJzaW9uCi1obVNraXBwZWRCYWxsb29uCT0JLTg1NwkjUmV0dXJuZWQgZnJvbSBjYWxscyBpZiBoZWxwbXNnIHNwZWNpZmllZCBhIHNraXAgYmFsbG9vbgotaG1IZWxwTWFuYWdlck5vdEluaXRlZAk9CS04NTUJI1JldHVybmVkIGZyb20gSE1HZXRIZWxwTWVudUhhbmRsZSBpZiBoZWxwIG1lbnUgbm90IHNldHVwCi1obVNhbWVBc0xhc3RCYWxsb29uCT0JLTg1NAkjUmV0dXJuZWQgZnJvbSBITVNob3dNZW51QmFsbG9vbiBpZiBtZW51ICYgaXRlbSBpcyBzYW1lIGFzIGxhc3QgdGltZQotaG1CYWxsb29uQWJvcnRlZAk9CS04NTMJI1JldHVybmVkIGlmIG1vdXNlIHdhcyBtb3Zpbmcgb3IgbW91c2Ugd2Fzbid0IGluIHdpbmRvdyBwb3J0IHJlY3QKLWhtSGVscERpc2FibGVkCT0JLTg1MAkjU2hvdyBCYWxsb29ucyBtb2RlIHdhcyBvZmYsIGNhbGwgdG8gcm91dGluZSBpZ25vcmVkCi1yY0RCUGFja05vdEluaXRlZAk9CS04MTMJI2F0dGVtcHQgdG8gY2FsbCBvdGhlciByb3V0aW5lIGJlZm9yZSBJbml0REJQYWNrCi1yY0RCV3JvbmdWZXJzaW9uCT0JLTgxMgkjaW5jb21wYXRpYmxlIHZlcnNpb25zCi1yY0RCTm9IYW5kbGVyCT0JLTgxMQkjbm8gYXBwIGhhbmRsZXIgZm9yIHNwZWNpZmllZCBkYXRhIHR5cGUKLXJjREJCYWRBc3luY1BCCT0JLTgxMAkjdHJpZWQgdG8ga2lsbCBhIGJhZCBwYgotcmNEQkFzeW5jTm90U3VwcAk9CS04MDkJI2RkZXYgZG9lcyBub3Qgc3VwcG9ydCBhc3luYyBjYWxscwotcmNEQkJhZERERVYJPQktODA4CSNiYWQgZGRldiBzcGVjaWZpZWQgb24gREJJbml0Ci1yY0RCQmFkU2Vzc051bQk9CS04MDcJI2JhZCBzZXNzaW9uIG51bWJlciBmb3IgREJHZXRDb25uSW5mbwotcmNEQkJhZFNlc3NJRAk9CS04MDYJI3JjREJCYWRTZXNzSUQKLXJjREJFeGVjCT0JLTgwNQkjcmNEQkV4ZWMKLXJjREJCcmVhawk9CS04MDQJI3JjREJCcmVhawotcmNEQkJhZFR5cGUJPQktODAzCSNyY0RCQmFkVHlwZQotcmNEQkVycm9yCT0JLTgwMgkjcmNEQkVycm9yCi1yY0RCVmFsdWUJPQktODAxCSNyY0RCVmFsdWUKLXJjREJOdWxsCT0JLTgwMAkjcmNEQk51bGwKLWljVG9vTWFueVByb2ZpbGVzRXJyCT0JLTY3NwkjdG9vIG1hbnkgcHJvZmlsZXMgaW4gZGF0YWJhc2UKLWljUHJvZmlsZU5vdEZvdW5kRXJyCT0JLTY3NgkjcHJvZmlsZSBub3QgZm91bmQKLWljQ29uZmlnSW5hcHByb3ByaWF0ZUVycgk9CS02NzUJI2luY29ycmVjdCBtYW51ZmFjdHVyZXIgY29kZQotaWNDb25maWdOb3RGb3VuZEVycgk9CS02NzQJI25vIGludGVybmV0IGNvbmZpZ3VyYXRpb24gd2FzIGZvdW5kCi1pY05vVVJMRXJyCT0JLTY3Mwkjbm8gVVJMIGZvdW5kCi1pY05vdGhpbmdUb092ZXJyaWRlRXJyCT0JLTY3Mgkjbm8gY29tcG9uZW50IGZvciB0aGUgb3ZlcnJpZGUgY29tcG9uZW50IHRvIGNhcHR1cmUKLWljTm9Nb3JlV3JpdGVyc0Vycgk9CS02NzEJI3lvdSBjYW5ub3QgYmVnaW4gYSB3cml0ZSBzZXNzaW9uIGJlY2F1c2Ugc29tZW9uZSBlbHNlIGlzIGFscmVhZHkgZG9pbmcgaXQKLWljVHJ1bmNhdGVkRXJyCT0JLTY3MAkjbW9yZSBkYXRhIHdhcyBwcmVzZW50IHRoYW4gd2FzIHJldHVybmVkCi1pY0ludGVybmFsRXJyCT0JLTY2OQkjSW50ZXJuZXQgQ29uZmlnIGludGVybmFsIGVycm9yCi1pY1ByZWZEYXRhRXJyCT0JLTY2OAkjcHJvYmxlbSB3aXRoIHByZWZlcmVuY2UgZGF0YQotaWNQZXJtRXJyCT0JLTY2NwkjY2Fubm90IHNldCBwcmVmZXJlbmNlCi1pY1ByZWZOb3RGb3VuZEVycgk9CS02NjYJI0ludGVybmV0IHByZWZlcmVuY2Ugbm90IGZvdW5kCi12bUludmFsaWRPd25pbmdQcm9jZXNzRXJyCT0JLTY0OAkjY3VycmVudCBwcm9jZXNzIGRvZXMgbm90IG93biB0aGUgQmFja2luZ0ZpbGVJRCBvciBGaWxlVmlld0lECi12bUFkZHJlc3NOb3RJbkZpbGVWaWV3RXJyCT0JLTY0NwkjYWRkcmVzcyBpcyBub3QgaW4gYSBGaWxlVmlldwotdm1Ob01vcmVGaWxlVmlld3NFcnIJPQktNjQ2CSNubyBtb3JlIEZpbGVWaWV3cyB3ZXJlIGZvdW5kCi12bUZpbGVWaWV3QWNjZXNzRXJyCT0JLTY0NQkjcmVxdWVzdGVkIEZpbGVWaWV3QWNjZXNzIGNhbm5vdCBiZSBvYnRhaW5lZAotdm1JbnZhbGlkRmlsZVZpZXdJREVycgk9CS02NDQJI2ludmFsaWQgRmlsZVZpZXdJRAotdm1Ob01vcmVCYWNraW5nRmlsZXNFcnIJPQktNjQzCSNubyBtb3JlIEJhY2tpbmdGaWxlcyB3ZXJlIGZvdW5kCi12bUJ1c3lCYWNraW5nRmlsZUVycgk9CS02NDIJI29wZW4gdmlld3MgZm91bmQgb24gQmFja2luZ0ZpbGUKLXZtTWFwcGluZ1ByaXZpbGVnZXNFcnIJPQktNjQxCSNyZXF1ZXN0ZWQgTWFwcGluZ1ByaXZpbGVnZXMgY2Fubm90IGJlIG9idGFpbmVkCi12bUludmFsaWRCYWNraW5nRmlsZUlERXJyCT0JLTY0MAkjaW52YWxpZCBCYWNraW5nRmlsZUlECi1ub01NVUVycgk9CS02MjYJI25vIE1NVSBwcmVzZW50Ci1jYW5ub3REZWZlckVycgk9CS02MjUJI3VuYWJsZSB0byBkZWZlciBhZGRpdGlvbmFsIGZ1bmN0aW9ucwotaW50ZXJydXB0c01hc2tlZEVycgk9CS02MjQJI2RvbtV0IGNhbGwgd2l0aCBpbnRlcnJ1cHRzIG1hc2tlZAotbm90TG9ja2VkRXJyCT0JLTYyMwkjc3BlY2lmaWVkIHJhbmdlIG9mIG1lbW9yeSBpcyBub3QgbG9ja2VkCi1jYW5ub3RNYWtlQ29udGlndW91c0Vycgk9CS02MjIJI2Nhbm5vdCBtYWtlIHNwZWNpZmllZCByYW5nZSBjb250aWd1b3VzCi1ub3RIZWxkRXJyCT0JLTYyMQkjc3BlY2lmaWVkIHJhbmdlIG9mIG1lbW9yeSBpcyBub3QgaGVsZAotbm90RW5vdWdoTWVtb3J5RXJyCT0JLTYyMAkjaW5zdWZmaWNpZW50IHBoeXNpY2FsIG1lbW9yeQotdGhyZWFkUHJvdG9jb2xFcnIJPQktNjE5CSN0aHJlYWRQcm90b2NvbEVycgotdGhyZWFkTm90Rm91bmRFcnIJPQktNjE4CSN0aHJlYWROb3RGb3VuZEVycgotdGhyZWFkVG9vTWFueVJlcXNFcnIJPQktNjE3CSN0aHJlYWRUb29NYW55UmVxc0Vycgotbm9Vc2VySW50ZXJhY3Rpb25BbGxvd2VkCT0JLTYxMAkjbm8gdXNlciBpbnRlcmFjdGlvbiBhbGxvd2VkCi1jb25uZWN0aW9uSW52YWxpZAk9CS02MDkJI2Nvbm5lY3Rpb25JbnZhbGlkCi1ub091dHN0YW5kaW5nSExFCT0JLTYwOAkjbm9PdXRzdGFuZGluZ0hMRQotYnVmZmVySXNTbWFsbAk9CS02MDcJI2Vycm9yIHJldHVybnMgZnJvbSBQb3N0IGFuZCBBY2NlcHQKLWFwcElzRGFlbW9uCT0JLTYwNgkjYXBwIGlzIEJHLW9ubHksIGFuZCBsYXVuY2ggZmxhZ3MgZGlzYWxsb3cgdGhpcwotYXBwTWVtRnVsbEVycgk9CS02MDUJI2FwcGxpY2F0aW9uIFNJWkUgbm90IGJpZyBlbm91Z2ggZm9yIGxhdW5jaAotaGFyZHdhcmVDb25maWdFcnIJPQktNjA0CSNoYXJkd2FyZSBjb25maWd1cmF0aW9uIG5vdCBjb3JyZWN0IGZvciBjYWxsCi1wcm90b2NvbEVycgk9CS02MDMJI2FwcCBtYWRlIG1vZHVsZSBjYWxscyBpbiBpbXByb3BlciBvcmRlcgotYXBwTW9kZUVycgk9CS02MDIJI21lbW9yeSBtb2RlIGlzIDMyLWJpdCwgYnV0IGFwcCBub3QgMzItYml0IGNsZWFuCi1tZW1GcmFnRXJyCT0JLTYwMQkjbm90IGVub3VnaCByb29tIHRvIGxhdW5jaCBhcHAgdy9zcGVjaWFsIHJlcXVpcmVtZW50cwotcHJvY05vdEZvdW5kCT0JLTYwMAkjbm8gZWxpZ2libGUgcHJvY2VzcyB3aXRoIHNwZWNpZmllZCBkZXNjcmlwdG9yCi1kcml2ZXJIYXJkd2FyZUdvbmVFcnIJPQktNTAzCSNkaXNrIGRyaXZlcidzIGhhcmR3YXJlIHdhcyBkaXNjb25uZWN0ZWQKLWh3UGFyYW1FcnIJPQktNTAyCSNiYWQgc2VsZWN0b3IgZm9yIF9IV1ByaXYKLXRlU2NyYXBTaXplRXJyCT0JLTUwMQkjc2NyYXAgaXRlbSB0b28gYmlnIGZvciB0ZXh0IGVkaXQgcmVjb3JkCi1yZ25Ub29CaWdFcnIJPQktNTAwCSNyZ25Ub29CaWdFcnIKLWV4VXNlckJyZWFrCT0JLTQ5MgkjdXNlciBkZWJ1Z2dlciBicmVhazsgZXhlY3V0ZSBkZWJ1Z2dlciBjb21tYW5kcyBvbiBzdGFjawotc3RyVXNlckJyZWFrCT0JLTQ5MQkjdXNlciBkZWJ1Z2dlciBicmVhazsgZGlzcGxheSBzdHJpbmcgb24gc3RhY2sKLXVzZXJCcmVhawk9CS00OTAJI3VzZXIgZGVidWdnZXIgYnJlYWsKLW5vdFRoZVB1Ymxpc2hlcldybgk9CS00NjMJI25vdCB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBwdWJsaXNoZXIgZm9yIHRoYXQgY29udGFpbmVyCi1jb250YWluZXJBbHJlYWR5T3Blbldybgk9CS00NjIJI2NvbnRhaW5lciBhbHJlYWR5IG9wZW5lZCBieSB0aGlzIHNlY3Rpb24KLWNvbnRhaW5lck5vdEZvdW5kV3JuCT0JLTQ2MQkjY291bGQgbm90IGZpbmQgZWRpdGlvbkNvbnRhaW5lciBhdCB0aGlzIHRpbWUKLW11bHRpcGxlUHVibGlzaGVyV3JuCT0JLTQ2MAkjQSBQdWJsaXNoZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciB0aGF0IGNvbnRhaW5lcgotYmFkU3ViUGFydEVycgk9CS00NTQJI2NhbiBub3QgdXNlIHN1YiBwYXJ0cyBpbiB0aGlzIHJlbGVhc2UKLWJhZEVkaXRpb25GaWxlRXJyCT0JLTQ1MwkjZWRpdGlvbiBmaWxlIGlzIGNvcnJ1cHQKLW5vdFJlZ2lzdGVyZWRTZWN0aW9uRXJyCT0JLTQ1Mgkjbm90IGEgcmVnaXN0ZXJlZCBTZWN0aW9uUmVjb3JkCi1iYWRTZWN0aW9uRXJyCT0JLTQ1MQkjbm90IGEgdmFsaWQgU2VjdGlvblJlY29yZAotZWRpdGlvbk1nckluaXRFcnIJPQktNDUwCSNlZGl0aW9uIG1hbmFnZXIgbm90IGluaXRlZCBieSB0aGlzIGFwcAotZnNtVW5rbm93bkZTTU1lc3NhZ2VFcnIJPQktNDM4CSN1bmtub3duIG1lc3NhZ2UgcGFzc2VkIHRvIEZTTQotZnNtTm9BbHRlcm5hdGVTdGFja0Vycgk9CS00MzcJI25vIGFsdGVybmF0ZSBzdGFjayBmb3IgSEZTIENJCi1mc21CYWRGU0RWZXJzaW9uRXJyCT0JLTQzNgkjRlNNIHZlcnNpb24gaW5jb21wYXRpYmxlIHdpdGggRlNECi1mc21EdXBsaWNhdGVGU0lERXJyCT0JLTQzNQkjRlNJRCBhbHJlYWR5IGV4aXN0cyBvbiBJbnN0YWxsRlMKLWZzbUJhZEZTRExlbkVycgk9CS00MzQJI0ZTRCBzaXplIGluY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgRlNNIHZlcnMKLWZzbUJhZEZGU05hbWVFcnIJPQktNDMzCSNOYW1lIGxlbmd0aCBub3QgMSA8PSBsZW5ndGggPD0gMzEKLWZzbUJ1c3lGRlNFcnIJPQktNDMyCSNGaWxlIHN5c3RlbSBpcyBidXN5LCBjYW5ub3QgYmUgcmVtb3ZlZAotZnNtRkZTTm90Rm91bmRFcnIJPQktNDMxCSNGb3JlaWduIEZpbGUgc3lzdGVtIGRvZXMgbm90IGV4aXN0IC0gbmV3IFBhY2syIGNvdWxkIHJldHVybiB0aGlzIGVycm9yIHRvbwotYnRLZXlBdHRyRXJyCT0JLTQxNwkjVGhlcmUgaXMgbm8gc3VjaCBhIGtleSBhdHRyaWJ1dGUuCi1idEtleUxlbkVycgk9CS00MTYJI01heGltdW0ga2V5IGxlbmd0aCBpcyB0b28gbG9uZyBvciBlcXVhbCB0byB6ZXJvLgotYnRSZWNOb3RGbmQJPQktNDE1CSNSZWNvcmQgY2Fubm90IGJlIGZvdW5kLgotYnREdXBSZWNFcnIJPQktNDE0CSNSZWNvcmQgYWxyZWFkeSBleGlzdHMuCi1idE5vU3BhY2UJPQktNDEzCSNDYW4ndCBhbGxvY2F0ZSBkaXNrIHNwYWNlLgotbm90QlRyZWUJPQktNDEwCSNUaGUgZmlsZSBpcyBub3QgYSBkaWN0aW9uYXJ5LgotZ2NyT25NRk1FcnIJPQktNDAwCSNnY3IgZm9ybWF0IG9uIGhpZ2ggZGVuc2l0eSBtZWRpYSBlcnJvcgotc2xvdE51bUVycgk9CS0zNjAJI2ludmFsaWQgc2xvdCAjIGVycm9yCi1zbVJlY05vdEZuZAk9CS0zNTEJI1JlY29yZCBub3QgZm91bmQgaW4gdGhlIFNSVC4KLXNtU1JUT3ZyRmxFcnIJPQktMzUwCSNTUlQgb3ZlciBmbG93Lgotc21Ob0dvb2RPcGVucwk9CS0zNDkJI05vIG9wZW5zIHdlcmUgc3VjY2Vzc2Z1bGwgaW4gdGhlIGxvb3AuCi1zbU9mZnNldEVycgk9CS0zNDgJI09mZnNldCB3YXMgdG9vIGJpZyAodGVtcG9yYXJ5IGVycm9yCi1zbUJ5dGVMYW5lc0Vycgk9CS0zNDcJI051bUJ5dGVMYW5lcyB3YXMgZGV0ZXJtaW5lZCB0byBiZSB6ZXJvLgotc21CYWRzUHRyRXJyCT0JLTM0NgkjQmFkIHBvaW50ZXIgd2FzIHBhc3NlZCB0byBzQ2FsY3NQb2ludGVyCi1zbXNHZXREcnZyRXJyCT0JLTM0NQkjRXJyb3Igb2NjdXJyZWQgZHVyaW5nIF9zR2V0RHJpdmVyLgotc21Ob01vcmVzUnNyY3MJPQktMzQ0CSNObyBtb3JlIHNSZXNvdXJjZXMKLXNtRGlzRHJ2ck5hbUVycgk9CS0zNDMJI0Vycm9yIG9jY3VycmVkIGR1cmluZyBfc0Rpc0RydnJOYW1lLgotc21HZXREcnZyTmFtRXJyCT0JLTM0MgkjRXJyb3Igb2NjdXJyZWQgZHVyaW5nIF9zR2V0RHJ2ck5hbWUuCi1zbUNrU3RhdHVzRXJyCT0JLTM0MQkjU3RhdHVzIG9mIHNsb3QgPSBmYWlsLgotc21CbGtNb3ZlRXJyCT0JLTM0MAkjX0Jsb2NrTW92ZSBlcnJvcgotc21OZXdQRXJyCT0JLTMzOQkjX05ld1B0ciBlcnJvcgotc21TZWxPT0JFcnIJPQktMzM4CSNTZWxlY3RvciBvdXQgb2YgYm91bmRzIGVycm9yCi1zbVNsb3RPT0JFcnIJPQktMzM3CSNTbG90IG91dCBvZiBib3VuZHMgZXJyb3IKLXNtTmlsc0Jsb2NrRXJyCT0JLTMzNgkjTmlsIHNCbG9jayBlcnJvciAoRG9udCBhbGxvY2F0ZSBhbmQgdHJ5IHRvIHVzZSBhIG5pbCBzQmxvY2spCi1zbXNQb2ludGVyTmlsCT0JLTMzNQkjTFBvaW50ZXIgaXMgbmlsIEZyb20gc09mZnNldERhdGEuIElmIHRoaXMgZXJyb3Igb2NjdXJzOyBjaGVjayBzSW5mbyByZWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zbUNQVUVycgk9CS0zMzQJI0NvZGUgcmV2aXNpb24gaXMgd3JvbmcKLXNtQ29kZVJldkVycgk9CS0zMzMJI0NvZGUgcmV2aXNpb24gaXMgd3JvbmcKLXNtUmVzZXJ2ZWRFcnIJPQktMzMyCSNSZXNlcnZlZCBmaWVsZCBub3QgemVybwotc21CYWRzTGlzdAk9CS0zMzEJI0JhZCBzTGlzdDogSWQxIDwgSWQyIDwgSWQzIC4uLmZvcm1hdCBpcyBub3QgZm9sbG93ZWQuCi1zbUJhZFJlZklkCT0JLTMzMAkjUmVmZXJlbmNlIElkIG5vdCBmb3VuZCBpbiBMaXN0Ci1zbUJ1c0VyclRPCT0JLTMyMAkjQnVzRXJyb3IgdGltZSBvdXQuCi1zbUJhZEJvYXJkSWQJPQktMzE5CSNCb2FyZElkIHdhcyB3cm9uZzsgcmUtaW5pdCB0aGUgUFJBTSByZWNvcmQuCi1zbVJlc2VydmVkU2xvdAk9CS0zMTgJI3Nsb3QgaXMgcmVzZXJ2ZWQsIFZNIHNob3VsZCBub3QgdXNlIHRoaXMgYWRkcmVzcyBzcGFjZS4KLXNtSW5pdFRibFZFcnIJPQktMzE3CSNBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgU2xvdCBSZXNvdXJjZSBUYWJsZS4KLXNtSW5pdFN0YXRWRXJyCT0JLTMxNgkjVGhlIEluaXRTdGF0dXNWIGZpZWxkIHdhcyBuZWdhdGl2ZSBhZnRlciBwcmltYXJ5IG9yIHNlY29uZGFyeSBpbml0Lgotc21Ob0JvYXJkSWQJPQktMzE1CSNObyBCb2FyZCBJZC4KLXNtR2V0UFJFcnIJPQktMzE0CSNFcnJvciBvY2N1cnJlZCBkdXJpbmcgX3NHZXRQUkFNUmVjIChTZWUgU0lNU3RhdHVzKS4KLXNtTm9Cb2FyZFNSc3JjCT0JLTMxMwkjTm8gQm9hcmQgc1Jlc291cmNlLgotc21EaXNwb3NlUEVycgk9CS0zMTIJI19EaXNwb3NlUG9pbnRlciBlcnJvcgotc21GSEJsa0Rpc3BFcnIJPQktMzExCSNFcnJvciBvY2N1cnJlZCBkdXJpbmcgX3NEaXNwb3NlUHRyIChEaXNwb3NlIG9mIEZIZWFkZXIgYmxvY2spLgotc21GSEJsb2NrUmRFcnIJPQktMzEwCSNFcnJvciBvY2N1cnJlZCBkdXJpbmcgX3NHZXRGSGVhZGVyLgotc21CTEZpZWxkQmFkCT0JLTMwOQkjQnl0ZUxhbmVzIGZpZWxkIHdhcyBiYWQuCi1zbVVuRXhCdXNFcnIJPQktMzA4CSNVbmV4cGVjdGVkIEJ1c0Vycm9yCi1zbVJlc3J2RXJyCT0JLTMwNwkjRmF0YWwgcmVzZXJ2ZWQgZXJyb3IuIFJlc3JldmVkIGZpZWxkIDw+IDAuCi1zbU5vc0luZm9BcnJheQk9CS0zMDYJI05vIHNJbmZvQXJyYXkuIE1lbW9yeSBNZ3IgZXJyb3IuCi1zbURpc2FibGVkU2xvdAk9CS0zMDUJI1RoaXMgc2xvdCBpcyBkaXNhYmxlZCAoLTMwNSB1c2UgdG8gYmUgc21MV1RzdEJhZCkKLXNtTm9EaXIJPQktMzA0CSNEaXJlY3Rvcnkgb2Zmc2V0IGlzIE5pbAotc21SZXZpc2lvbkVycgk9CS0zMDMJI1dyb25nIHJldmlzb24gbGV2ZWwKLXNtRm9ybWF0RXJyCT0JLTMwMgkjRkhlYWRlciBGb3JtYXQgaXMgbm90IEFwcGxlJ3MKLXNtQ1JDRmFpbAk9CS0zMDEJI0NSQyBjaGVjayBmYWlsZWQgZm9yIGRlY2xhcmF0aW9uIGRhdGEKLXNtRW1wdHlTbG90CT0JLTMwMAkjTm8gY2FyZCBpbiBzbG90Ci1ubVR5cEVycgk9CS0yOTkJI05vdGlmaWNhdGlvbiBNYW5hZ2VyOndyb25nIHF1ZXVlIHR5cGUKLXNtUHJpSW5pdEVycgk9CS0yOTMJI0Vycm9yOyBDYXJkcyBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQuCi1zbVBSQU1Jbml0RXJyCT0JLTI5MgkjRXJyb3I7IFNsb3QgUmVzb3VyY2UgVGFibGUgY291bGQgbm90IGJlIGluaXRpYWxpemVkLgotc21TUlRJbml0RXJyCT0JLTI5MQkjRXJyb3I7IFNsb3QgUmVzb3VyY2UgVGFibGUgY291bGQgbm90IGJlIGluaXRpYWxpemVkLgotc21TRE1Jbml0RXJyCT0JLTI5MAkjRXJyb3I7IFNETSBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQuCi1taWRpSW52YWxpZENtZEVycgk9CS0yNjEJI2NvbW1hbmQgbm90IHN1cHBvcnRlZCBmb3IgcG9ydCB0eXBlCi1taWRpRHVwSURFcnIJPQktMjYwCSNkdXBsaWNhdGUgY2xpZW50IElECi1taWRpTmFtZUxlbkVycgk9CS0yNTkJI25hbWUgc3VwcGxpZWQgaXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycwotbWlkaVdyaXRlRXJyCT0JLTI1OAkjTUlESVdyaXRlUGFja2V0IGNvdWxkbid0IHdyaXRlIHRvIGFsbCBjb25uZWN0ZWQgcG9ydHMKLW1pZGlOb0NvbkVycgk9CS0yNTcJI25vIGNvbm5lY3Rpb24gZXhpc3RzIGJldHdlZW4gc3BlY2lmaWVkIHBvcnRzCi1taWRpVkNvbm5lY3RSbXZkCT0JLTI1NgkjcGVuZGluZyB2aXJ0dWFsIGNvbm5lY3Rpb24gcmVtb3ZlZAotbWlkaVZDb25uZWN0TWFkZQk9CS0yNTUJI3BlbmRpbmcgdmlydHVhbCBjb25uZWN0aW9uIHJlc29sdmVkCi1taWRpVkNvbm5lY3RFcnIJPQktMjU0CSNwZW5kaW5nIHZpcnR1YWwgY29ubmVjdGlvbiBjcmVhdGVkCi1taWRpVG9vTWFueUNvbnNFcnIJPQktMjUzCSN0b28gbWFueSBjb25uZWN0aW9ucyBtYWRlCi1taWRpVG9vTWFueVBvcnRzRXJyCT0JLTI1MgkjdG9vIG1hbnkgcG9ydHMgYWxyZWFkeSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbQotbWlkaU5vUG9ydEVycgk9CS0yNTEJI25vIHBvcnQgd2l0aCB0aGF0IElEIGZvdW5kCi1taWRpTm9DbGllbnRFcnIJPQktMjUwCSNubyBjbGllbnQgd2l0aCB0aGF0IElEIGZvdW5kCi1iYWRJbnB1dFRleHQJPQktMjQ3CSNiYWRJbnB1dFRleHQKLWJhZERpY3RGb3JtYXQJPQktMjQ2CSNiYWREaWN0Rm9ybWF0Ci1pbmNvbXBhdGlibGVWb2ljZQk9CS0yNDUJI2luY29tcGF0aWJsZVZvaWNlCi12b2ljZU5vdEZvdW5kCT0JLTI0NAkjdm9pY2VOb3RGb3VuZAotYnVmVG9vU21hbGwJPQktMjQzCSNidWZUb29TbWFsbAotc3ludGhOb3RSZWFkeQk9CS0yNDIJI3N5bnRoTm90UmVhZHkKLXN5bnRoT3BlbkZhaWxlZAk9CS0yNDEJI3N5bnRoT3BlbkZhaWxlZAotbm9TeW50aEZvdW5kCT0JLTI0MAkjbm9TeW50aEZvdW5kCi1zaVVua25vd25RdWFsaXR5CT0JLTIzMgkjaW52YWxpZCBxdWFsaXR5IHNlbGVjdG9yIChyZXR1cm5lZCBieSBkcml2ZXIpCi1zaVVua25vd25JbmZvVHlwZQk9CS0yMzEJI2ludmFsaWQgaW5mbyB0eXBlIHNlbGVjdG9yIChyZXR1cm5lZCBieSBkcml2ZXIpCi1zaUlucHV0RGV2aWNlRXJyCT0JLTIzMAkjaW5wdXQgZGV2aWNlIGhhcmR3YXJlIGZhaWx1cmUKLXNpQmFkUmVmTnVtCT0JLTIyOQkjaW52YWxpZCBpbnB1dCBkZXZpY2UgcmVmZXJlbmNlIG51bWJlcgotc2lCYWREZXZpY2VOYW1lCT0JLTIyOAkjaW5wdXQgZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQKLXNpRGV2aWNlQnVzeUVycgk9CS0yMjcJI2lucHV0IGRldmljZSBhbHJlYWR5IGluIHVzZQotc2lJbnZhbGlkU2FtcGxlU2l6ZQk9CS0yMjYJI2ludmFsaWQgc2FtcGxlIHNpemUKLXNpSW52YWxpZFNhbXBsZVJhdGUJPQktMjI1CSNpbnZhbGlkIHNhbXBsZSByYXRlCi1zaUhhcmREcml2ZVRvb1Nsb3cJPQktMjI0CSNoYXJkIGRyaXZlIHRvbyBzbG93IHRvIHJlY29yZCB0byBkaXNrCi1zaUludmFsaWRDb21wcmVzc2lvbgk9CS0yMjMJI2ludmFsaWQgY29tcHJlc3Npb24gdHlwZQotc2lOb0J1ZmZlclNwZWNpZmllZAk9CS0yMjIJI3JldHVybmVkIGJ5IHN5bmNocm9ub3VzIFNQQlJlY29yZCBpZiBuaWwgYnVmZmVyIHBhc3NlZAotc2lCYWRTb3VuZEluRGV2aWNlCT0JLTIyMQkjaW52YWxpZCBpbmRleCBwYXNzZWQgdG8gU291bmRJbkdldEluZGV4ZWREZXZpY2UKLXNpTm9Tb3VuZEluSGFyZHdhcmUJPQktMjIwCSNubyBTb3VuZCBJbnB1dCBoYXJkd2FyZQotc2lWQlJDb21wcmVzc2lvbk5vdFN1cHBvcnRlZAk9CS0yMTMJI3ZiciBhdWRpbyBjb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIG9wZXJhdGlvbgotbm9Nb3JlUmVhbFRpbWUJPQktMjEyCSNub3QgZW5vdWdoIENQVSBjeWNsZXMgbGVmdCB0byBhZGQgYW5vdGhlciB0YXNrCi1jaGFubmVsTm90QnVzeQk9CS0yMTEJI2NoYW5uZWxOb3RCdXN5Ci1idWZmZXJzVG9vU21hbGwJPQktMjEwCSNjYW4gbm90IG9wZXJhdGUgaW4gdGhlIG1lbW9yeSBhbGxvd2VkCi1jaGFubmVsQnVzeQk9CS0yMDkJI3RoZSBDaGFubmVsIGlzIGJlaW5nIHVzZWQgZm9yIGEgUEZEIGFscmVhZHkKLWJhZEZpbGVGb3JtYXQJPQktMjA4CSN3YXMgbm90IHR5cGUgQUlGRiBvciB3YXMgb2YgYmFkIGZvcm1hdCxjb3JydXB0Ci1ub3RFbm91Z2hCdWZmZXJTcGFjZQk9CS0yMDcJI2NvdWxkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5Ci1iYWRGb3JtYXQJPQktMjA2CSNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKLWJhZENoYW5uZWwJPQktMjA1CSNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKLXJlc1Byb2JsZW0JPQktMjA0CSNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKLXF1ZXVlRnVsbAk9CS0yMDMJI1NvdW5kIE1hbmFnZXIgRXJyb3IgUmV0dXJucwotbm90RW5vdWdoSGFyZHdhcmVFcnIJPQktMjAxCSNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKLW5vSGFyZHdhcmVFcnIJPQktMjAwCSNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKLW1hcFJlYWRFcnIJPQktMTk5CSNtYXAgaW5jb25zaXN0ZW50IHdpdGggb3BlcmF0aW9uCi1yZXNBdHRyRXJyCT0JLTE5OAkjYXR0cmlidXRlIGluY29uc2lzdGVudCB3aXRoIG9wZXJhdGlvbgotcm12UmVmRmFpbGVkCT0JLTE5NwkjUm12ZVJlZmVyZW5jZSBmYWlsZWQKLXJtdlJlc0ZhaWxlZAk9CS0xOTYJI1JtdmVSZXNvdXJjZSBmYWlsZWQKLWFkZFJlZkZhaWxlZAk9CS0xOTUJI0FkZFJlZmVyZW5jZSBmYWlsZWQKLWFkZFJlc0ZhaWxlZAk9CS0xOTQJI0FkZFJlc291cmNlIGZhaWxlZAotcmVzRk5vdEZvdW5kCT0JLTE5MwkjUmVzb3VyY2UgZmlsZSBub3QgZm91bmQKLXJlc05vdEZvdW5kCT0JLTE5MgkjUmVzb3VyY2Ugbm90IGZvdW5kCi1pbnB1dE91dE9mQm91bmRzCT0JLTE5MAkjT2Zmc2V0IG9mIENvdW50IG91dCBvZiBib3VuZHMKLXdyaXRpbmdQYXN0RW5kCT0JLTE4OQkjV3JpdGluZyBwYXN0IGVuZCBvZiBmaWxlCi1yZXNvdXJjZUluTWVtb3J5CT0JLTE4OAkjUmVzb3VyY2UgYWxyZWFkeSBpbiBtZW1vcnkKLUNhbnREZWNvbXByZXNzCT0JLTE4NgkjcmVzb3VyY2UgYmVudCAoInRoZSBiZW5kcyIpIC0gY2FuJ3QgZGVjb21wcmVzcyBhIGNvbXByZXNzZWQgcmVzb3VyY2UKLWJhZEV4dFJlc291cmNlCT0JLTE4NQkjZXh0ZW5kZWQgcmVzb3VyY2UgaGFzIGEgYmFkIGZvcm1hdC4KLWNtTm9DdXJyZW50UHJvZmlsZQk9CS0xODIJI1Jlc3BvbmRlciBlcnJvcgotY21VbnN1cHBvcnRlZERhdGFUeXBlCT0JLTE4MQkjUmVzcG9uZGVyIGVycm9yCi1jbUNhbnREZWxldGVQcm9maWxlCT0JLTE4MAkjUmVzcG9uZGVyIGVycm9yCi1jbUNhbnRYWVoJPQktMTc5CSNDTU0gY2FudCBoYW5kbGUgWFlaIHNwYWNlCi1jbUNhbnRDb25jYXRlbmF0ZUVycm9yCT0JLTE3OAkjUHJvZmlsZSBjYW4ndCBiZSBjb25jYXRlbmF0ZWQKLWNtUHJvZmlsZXNJZGVudGljYWwJPQktMTc3CSNQcm9maWxlcyB0aGUgc2FtZQotY21Qcm9maWxlTm90Rm91bmQJPQktMTc2CSNSZXNwb25kZXIgZXJyb3IKLWNtTWV0aG9kTm90Rm91bmQJPQktMTc1CSNDTU0gbm90IHByZXNlbnQKLWNtTWV0aG9kRXJyb3IJPQktMTcxCSNjbU1ldGhvZEVycm9yCi1jbVByb2ZpbGVFcnJvcgk9CS0xNzAJI2NtUHJvZmlsZUVycm9yCi1jRGVwdGhFcnIJPQktMTU3CSNpbnZhbGlkIHBpeGVsIGRlcHRoCi1jUmVzRXJyCT0JLTE1NgkjaW52YWxpZCByZXNvbHV0aW9uIGZvciBNYWtlSVRhYmxlCi1jRGV2RXJyCT0JLTE1NQkjaW52YWxpZCB0eXBlIG9mIGdyYXBoaWNzIGRldmljZQotY1Byb3RlY3RFcnIJPQktMTU0CSNjb2xvclRhYmxlIGVudHJ5IHByb3RlY3Rpb24gdmlvbGF0aW9uCi1jUmFuZ2VFcnIJPQktMTUzCSNyYW5nZSBlcnJvciBvbiBjb2xvclRhYmxlIHJlcXVlc3QKLWNOb01lbUVycgk9CS0xNTIJI2ZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdHVyZQotY1RlbXBNZW1FcnIJPQktMTUxCSNmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0ZW1wb3Jhcnkgc3RydWN0dXJlcwotY01hdGNoRXJyCT0JLTE1MAkjQ29sb3IySW5kZXggZmFpbGVkIHRvIGZpbmQgYW4gaW5kZXgKLWluc3VmZmljaWVudFN0YWNrRXJyCT0JLTE0OQkjaW5zdWZmaWNpZW50U3RhY2tFcnIKLXBpeE1hcFRvb0RlZXBFcnIJPQktMTQ4CSNwaXhNYXBUb29EZWVwRXJyCi1yZ25PdmVyZmxvd0Vycgk9CS0xNDcJI3Jnbk92ZXJmbG93RXJyCi1ub01lbUZvclBpY3RQbGF5YmFja0Vycgk9CS0xNDUJI25vTWVtRm9yUGljdFBsYXliYWNrRXJyCi11c2VyQ2FuY2VsZWRFcnIJPQktMTI4CSN1c2VyQ2FuY2VsZWRFcnIKLWhNZW51RmluZEVycgk9CS0xMjcJI2NvdWxkIG5vdCBmaW5kIEhNZW51J3MgcGFyZW50IGluIE1lbnVLZXkgKHdyb25nIGVycm9yIGNvZGUgLSBvYnNvbGV0ZSkKLW1CYXJORm5kCT0JLTEyNgkjc3lzdGVtIGVycm9yIGNvZGUgZm9yIE1CREYgbm90IGZvdW5kCi11cGRQaXhNZW1FcnIJPQktMTI1CSNpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHVwZGF0ZSBhIHBpeG1hcAotdm9sR29uZUVycgk9CS0xMjQJI1NlcnZlciB2b2x1bWUgaGFzIGJlZW4gZGlzY29ubmVjdGVkLgotd3JnVm9sVHlwRXJyCT0JLTEyMwkjV3Jvbmcgdm9sdW1lIHR5cGUgZXJyb3IgW29wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGZvciBNRlNdCi1iYWRNb3ZFcnIJPQktMTIyCSNNb3ZlIGludG8gb2Zmc3ByaW5nIGVycm9yCi10bXdkb0Vycgk9CS0xMjEJI05vIGZyZWUgV0RDQiBhdmFpbGFibGUKLWRpck5GRXJyCT0JLTEyMAkjRGlyZWN0b3J5IG5vdCBmb3VuZAotbWVtTG9ja2VkRXJyCT0JLTExNwkjdHJ5aW5nIHRvIG1vdmUgYSBsb2NrZWQgYmxvY2sgKE1vdmVISGkpCi1tZW1TQ0Vycgk9CS0xMTYJI1NpemUgQ2hlY2sgZmFpbGVkCi1tZW1CQ0Vycgk9CS0xMTUJI0Jsb2NrIENoZWNrIGZhaWxlZAotbWVtUENFcnIJPQktMTE0CSNQb2ludGVyIENoZWNrIGZhaWxlZAotbWVtQVpFcnIJPQktMTEzCSNBZGRyZXNzIGluIHpvbmUgY2hlY2sgZmFpbGVkCi1tZW1QdXJFcnIJPQktMTEyCSN0cnlpbmcgdG8gcHVyZ2UgYSBsb2NrZWQgb3Igbm9uLXB1cmdlYWJsZSBibG9jawotbWVtV1pFcnIJPQktMTExCSNXaGljaFpvbmUgZmFpbGVkIChhcHBsaWVkIHRvIGZyZWUgYmxvY2spCi1tZW1BZHJFcnIJPQktMTEwCSNhZGRyZXNzIHdhcyBvZGQ7IG9yIG91dCBvZiByYW5nZQotbmlsSGFuZGxlRXJyCT0JLTEwOQkjTWFzdGVyIFBvaW50ZXIgd2FzIE5JTCBpbiBIYW5kbGVab25lIG9yIG90aGVyCi1tZW1GdWxsRXJyCT0JLTEwOAkjTm90IGVub3VnaCByb29tIGluIGhlYXAgem9uZQotbm9UeXBlRXJyCT0JLTEwMgkjTm8gb2JqZWN0IG9mIHRoYXQgdHlwZSBpbiBzY3JhcAotbm9TY3JhcEVycgk9CS0xMDAJI05vIHNjcmFwIGV4aXN0cyBlcnJvcgotbWVtUk9aV2Fybgk9CS05OQkjc29mdCBlcnJvciBpbiBST1oKLXBvcnROb3RDZgk9CS05OAkjZHJpdmVyIE9wZW4gZXJyb3IgY29kZSAocGFyYW1ldGVyIFJBTSBub3QgY29uZmlndXJlZCBmb3IgdGhpcyBjb25uZWN0aW9uKQotcG9ydEluVXNlCT0JLTk3CSNkcml2ZXIgT3BlbiBlcnJvciBjb2RlIChwb3J0IGlzIGluIHVzZSkKLXBvcnROb3RQd3IJPQktOTYJI3NlcmlhbCBwb3J0IG5vdCBjdXJyZW50bHkgcG93ZXJlZAotZXhjZXNzQ29sbHNucwk9CS05NQkjZXhjZXNzaXZlIGNvbGxpc2lvbnMgb24gd3JpdGUKLWxhcFByb3RFcnIJPQktOTQJI2Vycm9yIGluIGF0dGFjaGluZy9kZXRhY2hpbmcgcHJvdG9jb2wKLW5vQnJpZGdlRXJyCT0JLTkzCSNubyBuZXR3b3JrIGJyaWRnZSBmb3Igbm9uLWxvY2FsIHNlbmQKLWVMZW5FcnIJPQktOTIJI0xlbmd0aCBlcnJvciBkZHBMZW5FcnIKLWVNdWx0aUVycgk9CS05MQkjTXVsdGljYXN0IGFkZHJlc3MgZXJyb3IgZGRwU2t0RXJyCi1icmVha1JlY2QJPQktOTAJI0JyZWFrIHJlY2VpdmVkIChTQ0MpCi1yY3ZyRXJyCT0JLTg5CSNTQ0MgcmVjZWl2ZXIgZXJyb3IgKGZyYW1pbmc7IHBhcml0eTsgT1IpCi1wckluaXRFcnIJPQktODgJI0luaXRVdGlsIGZvdW5kIHRoZSBwYXJhbWV0ZXIgcmFtIHVuaW5pdGlhbGl6ZWQKLXByV3JFcnIJPQktODcJI3BhcmFtZXRlciByYW0gd3JpdHRlbiBkaWRuJ3QgcmVhZC12ZXJpZnkKLWNsa1dyRXJyCT0JLTg2CSN0aW1lIHdyaXR0ZW4gZGlkIG5vdCB2ZXJpZnkKLWNsa1JkRXJyCT0JLTg1CSN1bmFibGUgdG8gcmVhZCBzYW1lIGNsb2NrIHZhbHVlIHR3aWNlCi12ZXJFcnIJPQktODQJI3RyYWNrIGZhaWxlZCB0byB2ZXJpZnkKLWZtdDJFcnIJPQktODMJI2Nhbid0IGdldCBlbm91Z2ggc3luYwotZm10MUVycgk9CS04MgkjY2FuJ3QgZmluZCBzZWN0b3IgMCBhZnRlciB0cmFjayBmb3JtYXQKLXNlY3RORkVycgk9CS04MQkjc2VjdG9yIG51bWJlciBuZXZlciBmb3VuZCBvbiBhIHRyYWNrCi1zZWVrRXJyCT0JLTgwCSN0cmFjayBudW1iZXIgd3Jvbmcgb24gYWRkcmVzcyBtYXJrCi1zcGRBZGpFcnIJPQktNzkJI3VuYWJsZSB0byBjb3JyZWN0bHkgYWRqdXN0IGRpc2sgc3BlZWQKLXR3b1NpZGVFcnIJPQktNzgJI3RyaWVkIHRvIHJlYWQgMm5kIHNpZGUgb24gYSAxLXNpZGVkIGRyaXZlCi1pbml0SVdNRXJyCT0JLTc3CSN1bmFibGUgdG8gaW5pdGlhbGl6ZSBJV00KLXRrMEJhZEVycgk9CS03NgkjdHJhY2sgMCBkZXRlY3QgZG9lc24ndCBjaGFuZ2UKLWNhbnRTdGVwRXJyCT0JLTc1CSNzdGVwIGhhbmRzaGFrZSBmYWlsZWQKLXdyVW5kZXJydW4JPQktNzQJI3dyaXRlIHVuZGVycnVuIG9jY3VycmVkCi1iYWREQnRTbHAJPQktNzMJI2JhZCBkYXRhIG1hcmsgYml0IHNsaXAgbmliYmxlcwotYmFkRENrc3VtCT0JLTcyCSNiYWQgZGF0YSBtYXJrIGNoZWNrc3VtCi1ub0R0YU1rRXJyCT0JLTcxCSNjb3VsZG4ndCBmaW5kIGEgZGF0YSBtYXJrIGhlYWRlcgotYmFkQnRTbHBFcnIJPQktNzAJI2JhZCBhZGRyIG1hcmsgYml0IHNsaXAgbmliYmxlcwotYmFkQ2tzbUVycgk9CS02OQkjYWRkciBtYXJrIGNoZWNrc3VtIGRpZG4ndCBjaGVjawotZGF0YVZlckVycgk9CS02OAkjcmVhZCB2ZXJpZnkgY29tcGFyZSBmYWlsZWQKLW5vQWRyTWtFcnIJPQktNjcJI2NvdWxkbid0IGZpbmQgdmFsaWQgYWRkciBtYXJrCi1ub055YkVycgk9CS02NgkjY291bGRuJ3QgZmluZCA1IG55YmJsZXMgaW4gMjAwIHRyaWVzCi1vZmZMaW5FcnIJPQktNjUJI3IvdyByZXF1ZXN0ZWQgZm9yIGFuIG9mZi1saW5lIGRyaXZlCi1mb250RGVjRXJyb3IJPQktNjQJI2Vycm9yIGR1cmluZyBmb250IGRlY2xhcmF0aW9uCi13clBlcm1FcnIJPQktNjEJI3dyaXRlIHBlcm1pc3Npb25zIGVycm9yCi1iYWRNREJFcnIJPQktNjAJI2JhZCBtYXN0ZXIgZGlyZWN0b3J5IGJsb2NrCi1mc1JuRXJyCT0JLTU5CSNmaWxlIHN5c3RlbSBpbnRlcm5hbCBlcnJvcjpkdXJpbmcgcmVuYW1lIHRoZSBvbGQgZW50cnkgd2FzIGRlbGV0ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXN0b3JlZC4KLWV4dEZTRXJyCT0JLTU4CSN2b2x1bWUgaW4gcXVlc3Rpb24gYmVsb25ncyB0byBhbiBleHRlcm5hbCBmcwotbm9NYWNEc2tFcnIJPQktNTcJI25vdCBhIG1hYyBkaXNrZXR0ZSAoc2lnIGJ5dGVzIGFyZSB3cm9uZykKLW5zRHJ2RXJyCT0JLTU2CSNubyBzdWNoIGRyaXZlICh0cmllZCB0byBtb3VudCBhIGJhZCBkcml2ZSBudW0pCi12b2xPbkxpbkVycgk9CS01NQkjZHJpdmUgdm9sdW1lIGFscmVhZHkgb24tbGluZSBhdCBNb3VudFZvbAotcGVybUVycgk9CS01NAkjcGVybWlzc2lvbnMgZXJyb3IgKG9uIGZpbGUgb3BlbikKLXZvbE9mZkxpbkVycgk9CS01Mwkjdm9sdW1lIG5vdCBvbiBsaW5lIGVycm9yICh3YXMgRWplY3RlZCkKLWdmcEVycgk9CS01MgkjZ2V0IGZpbGUgcG9zaXRpb24gZXJyb3IKLXJmTnVtRXJyCT0JLTUxCSNyZWZudW0gZXJyb3IKLXBhcmFtRXJyCT0JLTUwCSNlcnJvciBpbiB1c2VyIHBhcmFtZXRlciBsaXN0Ci1vcFdyRXJyCT0JLTQ5CSNmaWxlIGFscmVhZHkgb3BlbiB3aXRoIHdpdGggd3JpdGUgcGVybWlzc2lvbgotZHVwRk5FcnIJPQktNDgJI2R1cGxpY2F0ZSBmaWxlbmFtZSAocmVuYW1lKQotZkJzeUVycgk9CS00NwkjRmlsZSBpcyBidXN5IChkZWxldGUpCi12TGNrZEVycgk9CS00Ngkjdm9sdW1lIGlzIGxvY2tlZAotZkxja2RFcnIJPQktNDUJI2ZpbGUgaXMgbG9ja2VkCi13UHJFcnIJPQktNDQJI2Rpc2tldHRlIGlzIHdyaXRlIHByb3RlY3RlZC4KLWZuZkVycgk9CS00MwkjRmlsZSBub3QgZm91bmQKLXRtZm9FcnIJPQktNDIJI3RvbyBtYW55IGZpbGVzIG9wZW4KLW1GdWxFcnIJPQktNDEJI21lbW9yeSBmdWxsIChvcGVuKSBvciBmaWxlIHdvbid0IGZpdCAobG9hZCkKLXBvc0Vycgk9CS00MAkjdHJpZWQgdG8gcG9zaXRpb24gdG8gYmVmb3JlIHN0YXJ0IG9mIGZpbGUgKHIvdykKLWVvZkVycgk9CS0zOQkjRW5kIG9mIGZpbGUKLWZuT3BuRXJyCT0JLTM4CSNGaWxlIG5vdCBvcGVuCi1iZE5hbUVycgk9CS0zNwkjdGhlcmUgbWF5IGJlIG5vIGJhZCBuYW1lcyBpbiB0aGUgZmluYWwgc3lzdGVtIQotaW9FcnIJPQktMzYJI0kvTyBlcnJvciAoYnVtbWVycykKLW5zdkVycgk9CS0zNQkjbm8gc3VjaCB2b2x1bWUKLWRza0Z1bEVycgk9CS0zNAkjZGlzayBmdWxsCi1kaXJGdWxFcnIJPQktMzMJI0RpcmVjdG9yeSBmdWxsCi1kY2VFeHRFcnIJPQktMzAJI2RjZSBleHRlbnNpb24gZXJyb3IKLXVuaXRUYmxGdWxsRXJyCT0JLTI5CSN1bml0IHRhYmxlIGhhcyBubyBtb3JlIGVudHJpZXMKLW5vdE9wZW5FcnIJPQktMjgJI0NvdWxkbid0IHJkL3dyL2N0bC9zdHMgY2F1c2UgZHJpdmVyIG5vdCBvcGVuZWQKLWlJT0Fib3J0RXJyCT0JLTI3CSNJTyBhYm9ydCBlcnJvciAoUHJpbnRpbmcgTWFuYWdlcikKLWRJbnN0RXJyCT0JLTI2CSNEcnZySW5zdGFsbCBjb3VsZG4ndCBmaW5kIGRyaXZlciBpbiByZXNvdXJjZXMKLWRSZW1vdkVycgk9CS0yNQkjdHJpZWQgdG8gcmVtb3ZlIGFuIG9wZW4gZHJpdmVyCi1jbG9zRXJyCT0JLTI0CSNJL08gU3lzdGVtIEVycm9ycwotb3BlbkVycgk9CS0yMwkjSS9PIFN5c3RlbSBFcnJvcnMKLXVuaXRFbXB0eUVycgk9CS0yMgkjSS9PIFN5c3RlbSBFcnJvcnMKLWJhZFVuaXRFcnIJPQktMjEJI0kvTyBTeXN0ZW0gRXJyb3JzCi13cml0RXJyCT0JLTIwCSNJL08gU3lzdGVtIEVycm9ycwotcmVhZEVycgk9CS0xOQkjSS9PIFN5c3RlbSBFcnJvcnMKLXN0YXR1c0Vycgk9CS0xOAkjSS9PIFN5c3RlbSBFcnJvcnMKLWNvbnRyb2xFcnIJPQktMTcJI0kvTyBTeXN0ZW0gRXJyb3JzCi1kc0V4dGVuc2lvbnNEaXNhYmxlZAk9CS0xMwkjc2F5IJZFeHRlbnNpb25zIERpc2FibGVklAotZHNIRDIwSW5zdGFsbGVkCT0JLTEyCSNzYXkglkhEMjAgU3RhcnR1cJQKLWRzRGlzYXNzZW1ibGVySW5zdGFsbGVkCT0JLTExCSNzYXkglkRpc2Fzc2VtYmxlciBJbnN0YWxsZWSUCi1kc01hY3NCdWdJbnN0YWxsZWQJPQktMTAJI3NheSCWTWFjc0J1ZyBJbnN0YWxsZWSUCi1zZU5vREIJPQktOAkjbm8gZGVidWdnZXIgaW5zdGFsbGVkIHRvIGhhbmRsZSBkZWJ1Z2dlciBjb21tYW5kCi1TbHBUeXBlRXJyCT0JLTUJI2ludmFsaWQgcXVldWUgZWxlbWVudAotdW5pbXBFcnIJPQktNAkjdW5pbXBsZW1lbnRlZCBjb3JlIHJvdXRpbmUKLWNvckVycgk9CS0zCSNjb3JlIHJvdXRpbmUgbnVtYmVyIG91dCBvZiByYW5nZQotZHNOb0V4dHNEaXNhc3NlbWJsZXIJPQktMgkjbm90IGEgU3lzRXJyLCBqdXN0IGEgcGxhY2Vob2xkZXIKLXFFcnIJPQktMQkjcXVldWUgZWxlbWVudCBub3QgZm91bmQgZHVyaW5nIGRlbGV0aW9uCi10c21Db21wb25lbnROb0Vycgk9CTAJI2NvbXBvbmVudCByZXN1bHQgPSBubyBlcnJvcgotRVBFUk0JPQkxCSNPcGVyYXRpb24gbm90IHBlcm1pdHRlZAotRU5PRU5UCT0JMgkjTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQotRVNSQ0gJPQkzCSNObyBzdWNoIHByb2Nlc3MKLUVJTlRSCT0JNAkjSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwKLUVJTwk9CTUJI0lucHV0L291dHB1dCBlcnJvcgotRU5YSU8JPQk2CSNEZXZpY2Ugbm90IGNvbmZpZ3VyZWQKLUUyQklHCT0JNwkjQXJndW1lbnQgbGlzdCB0b28gbG9uZwotRU5PRVhFQwk9CTgJI0V4ZWMgZm9ybWF0IGVycm9yCi1FQkFERgk9CTkJI0JhZCBmaWxlIGRlc2NyaXB0b3IKLUVDSElMRAk9CTEwCSNObyBjaGlsZCBwcm9jZXNzZXMKLUVERUFETEsJPQkxMQkjUmVzb3VyY2UgZGVhZGxvY2sgYXZvaWRlZAotRU5PTUVNCT0JMTIJI0Nhbm5vdCBhbGxvY2F0ZSBtZW1vcnkKLUVBQ0NFUwk9CTEzCSNQZXJtaXNzaW9uIGRlbmllZAotRUZBVUxUCT0JMTQJI0JhZCBhZGRyZXNzCi1FQ0FOQ0VMRUQJPQkxNQkjT3BlcmF0aW9uIGNhbmNlbGxlZAotRUJVU1kJPQkxNgkjRGV2aWNlIGJ1c3kKLUVFWElTVAk9CTE3CSNGaWxlIGV4aXN0cwotRVhERVYJPQkxOAkjQ3Jvc3MtZGV2aWNlIGxpbmsKLUVOT0RFVgk9CTE5CSNPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBieSBkZXZpY2UKLUVOT1RESVIJPQkyMAkjTm90IGEgZGlyZWN0b3J5Ci1FSVNESVIJPQkyMQkjSXMgYSBkaXJlY3RvcnkKLUVJTlZBTAk9CTIyCSNJbnZhbGlkIGFyZ3VtZW50Ci1FTkZJTEUJPQkyMwkjVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0KLUVNRklMRQk9CTI0CSNUb28gbWFueSBvcGVuIGZpbGVzCi1FTk9UVFkJPQkyNQkjSW5hcHByb3ByaWF0ZSBpb2N0bCBmb3IgZGV2aWNlCi1FU0lHUEFSTQk9CTI2CSNTaWduYWwgZXJyb3IKLUVGQklHCT0JMjcJI0ZpbGUgdG9vIGxhcmdlCi1FTk9TUEMJPQkyOAkjTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UKLUVTUElQRQk9CTI5CSNJbGxlZ2FsIHNlZWsKLUVST0ZTCT0JMzAJI1JlYWQtb25seSBmaWxlIHN5c3RlbQotRU1MSU5LCT0JMzEJI1RvbyBtYW55IGxpbmtzCi1FUElQRQk9CTMyCSNCcm9rZW4gcGlwZQotRURPTQk9CTMzCSNOdW1lcmljYWwgYXJndW1lbnQgb3V0IG9mIGRvbWFpbgotRVJBTkdFCT0JMzQJI1Jlc3VsdCB0b28gbGFyZ2UKLUVBR0FJTgk9CTM1CSNSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQotRUlOUFJPR1JFU1MJPQkzNgkjT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcwotRUFMUkVBRFkJPQkzNwkjT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MKLUVOT1RTT0NLCT0JMzgJI1NvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldAotRURFU1RBRERSUkVRCT0JMzkJI0Rlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQKLUVNU0dTSVpFCT0JNDAJI01lc3NhZ2UgdG9vIGxvbmcKLUVQUk9UT1RZUEUJPQk0MQkjUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Ci1FTk9QUk9UT09QVAk9CTQyCSNQcm90b2NvbCBub3QgYXZhaWxhYmxlCi1FUFJPVE9OT1NVUFBPUlQJPQk0MwkjUHJvdG9jb2wgbm90IHN1cHBvcnRlZAotRVNPQ0tUTk9TVVBQT1JUCT0JNDQJI1NvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQKLUVPUE5PVFNVUFAJPQk0NQkjT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQKLUVQRk5PU1VQUE9SVAk9CTQ2CSNQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZAotRUFGTk9TVVBQT1JUCT0JNDcJI0FkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wgZmFtaWx5Ci1FQUREUklOVVNFCT0JNDgJI0FkZHJlc3MgYWxyZWFkeSBpbiB1c2UKLUVBRERSTk9UQVZBSUwJPQk0OQkjQ2FuJ3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzCi1FTkVURE9XTgk9CTUwCSNOZXR3b3JrIGlzIGRvd24KLUVORVRVTlJFQUNICT0JNTEJI05ldHdvcmsgaXMgdW5yZWFjaGFibGUKLUVORVRSRVNFVAk9CTUyCSNOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBvbiByZXNldAotRUNPTk5BQk9SVEVECT0JNTMJI1NvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0Ci1FQ09OTlJFU0VUCT0JNTQJI0Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgotRU5PQlVGUwk9CTU1CSNObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlCi1FSVNDT05OCT0JNTYJI1NvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZAotRU5PVENPTk4JPQk1NwkjU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQKLUVTSFVURE9XTgk9CTU4CSNDYW4ndCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgotRVRPT01BTllSRUZTCT0JNTkJI1RvbyBtYW55IHJlZmVyZW5jZXM6IGNhbid0IHNwbGljZQotRVRJTUVET1VUCT0JNjAJI09wZXJhdGlvbiB0aW1lZCBvdXQKLUVDT05OUkVGVVNFRAk9CTYxCSNDb25uZWN0aW9uIHJlZnVzZWQKLUVMT09QCT0JNjIJI1RvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcwotRU5BTUVUT09MT05HCT0JNjMJI0ZpbGUgbmFtZSB0b28gbG9uZwotRUhPU1RET1dOCT0JNjQJI0hvc3QgaXMgZG93bgotRUhPU1RVTlJFQUNICT0JNjUJI05vIHJvdXRlIHRvIGhvc3QKLUVOT1RFTVBUWQk9CTY2CSNEaXJlY3Rvcnkgbm90IGVtcHR5Ci1FTE9PSwk9CTY3CSNJbnRlcm5hbCBtYXBwaW5nIGZvciBrT1RMb29rRXJyLCBkb24ndCByZXR1cm4gdG8gY2xpZW50Ci1FTk9MQ0sJPQk3NwkjTm8gbG9ja3MgYXZhaWxhYmxlCi1FTk9TWVMJPQk3OAkjRnVuY3Rpb24gbm90IGltcGxlbWVudGVkCi1FSUxTRVEJPQk4OAkjV2lkZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZXJyb3IKLUVVTktOT1dOCT0JOTkJI1Vua25vd24gZXJyb3IKK3N2VGVtcERpc2FibGUgICA9ICAgLTMyNzY4ICAjc3ZUZW1wRGlzYWJsZQorc3ZEaXNhYmxlZCAgPSAgIC0zMjY0MCAgI1Jlc2VydmUgcmFuZ2UgLTMyNjQwIHRvIC0zMjc2OCBmb3IgQXBwbGUgdGVtcCBkaXNhYmxlcy4KK2ZvbnROb3RPdXRsaW5lRXJyICAgPSAgIC0zMjYxNSAgI2JpdG1hcCBmb250IHBhc3NlZCB0byByb3V0aW5lIHRoYXQgZG9lcyBvdXRsaW5lcyBvbmx5CitrVVJMNjhrTm90U3VwcG9ydGVkRXJyb3IgICAgPSAgIC0zMDc4OCAgI2tVUkw2OGtOb3RTdXBwb3J0ZWRFcnJvcgora1VSTEFjY2Vzc05vdEF2YWlsYWJsZUVycm9yID0gICAtMzA3ODcgICNrVVJMQWNjZXNzTm90QXZhaWxhYmxlRXJyb3IKK2tVUkxJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yICAgPSAgIC0zMDc4NiAgI2tVUkxJbnZhbGlkQ29uZmlndXJhdGlvbkVycm9yCitrVVJMRXh0ZW5zaW9uRmFpbHVyZUVycm9yICAgPSAgIC0zMDc4NSAgI2tVUkxFeHRlbnNpb25GYWlsdXJlRXJyb3IKK2tVUkxGaWxlRW1wdHlFcnJvciAgPSAgIC0zMDc4MyAgI2tVUkxGaWxlRW1wdHlFcnJvcgora1VSTEludmFsaWRDYWxsRXJyb3IgICAgPSAgIC0zMDc4MSAgI2tVUkxJbnZhbGlkQ2FsbEVycm9yCitrVVJMVW5zZXR0YWJsZVByb3BlcnR5RXJyb3IgPSAgIC0zMDc4MCAgI2tVUkxVbnNldHRhYmxlUHJvcGVydHlFcnJvcgora1VSTFByb3BlcnR5QnVmZmVyVG9vU21hbGxFcnJvciA9ICAgLTMwNzc5ICAja1VSTFByb3BlcnR5QnVmZmVyVG9vU21hbGxFcnJvcgora1VSTFVua25vd25Qcm9wZXJ0eUVycm9yICAgID0gICAtMzA3NzggICNrVVJMVW5rbm93blByb3BlcnR5RXJyb3IKK2tVUkxQcm9wZXJ0eU5vdFlldEtub3duRXJyb3IgICAgPSAgIC0zMDc3NyAgI2tVUkxQcm9wZXJ0eU5vdFlldEtub3duRXJyb3IKK2tVUkxBdXRoZW50aWNhdGlvbkVycm9yID0gICAtMzA3NzYgICNrVVJMQXV0aGVudGljYXRpb25FcnJvcgora1VSTFNlcnZlckJ1c3lFcnJvciA9ICAgLTMwNzc1ICAja1VSTFNlcnZlckJ1c3lFcnJvcgora1VSTFVuc3VwcG9ydGVkU2NoZW1lRXJyb3IgID0gICAtMzA3NzQgICNrVVJMVW5zdXBwb3J0ZWRTY2hlbWVFcnJvcgora1VSTEludmFsaWRVUkxFcnJvciA9ICAgLTMwNzczICAja1VSTEludmFsaWRVUkxFcnJvcgora1VSTERlc3RpbmF0aW9uRXhpc3RzRXJyb3IgID0gICAtMzA3NzIgICNrVVJMRGVzdGluYXRpb25FeGlzdHNFcnJvcgora1VSTFByb2dyZXNzQWxyZWFkeURpc3BsYXllZEVycm9yICAgPSAgIC0zMDc3MSAgI2tVUkxQcm9ncmVzc0FscmVhZHlEaXNwbGF5ZWRFcnJvcgora1VSTEludmFsaWRVUkxSZWZlcmVuY2VFcnJvciAgICA9ICAgLTMwNzcwICAja1VSTEludmFsaWRVUkxSZWZlcmVuY2VFcnJvcgorY29udHJvbEhhbmRsZUludmFsaWRFcnIgPSAgIC0zMDU5OSAgI2NvbnRyb2xIYW5kbGVJbnZhbGlkRXJyCitjb250cm9sSW52YWxpZERhdGFWZXJzaW9uRXJyICAgID0gICAtMzA1OTcgICNjb250cm9sSW52YWxpZERhdGFWZXJzaW9uRXJyCitlcnJJdGVtTm90Q29udHJvbCAgID0gICAtMzA1OTYgICNlcnJJdGVtTm90Q29udHJvbAorZXJyQ2FudEVtYmVkUm9vdCAgICA9ICAgLTMwNTk1ICAjZXJyQ2FudEVtYmVkUm9vdAorZXJyQ2FudEVtYmVkSW50b1NlbGYgICAgPSAgIC0zMDU5NCAgI2VyckNhbnRFbWJlZEludG9TZWxmCitlcnJXaW5kb3dSZWdpb25Db2RlSW52YWxpZCAgPSAgIC0zMDU5MyAgI2VycldpbmRvd1JlZ2lvbkNvZGVJbnZhbGlkCitlcnJDb250cm9sSGlkZGVuT3JEaXNhYmxlZCAgPSAgIC0zMDU5MiAgI2VyckNvbnRyb2xIaWRkZW5PckRpc2FibGVkCitlcnJEYXRhU2l6ZU1pc21hdGNoID0gICAtMzA1OTEgICNlcnJEYXRhU2l6ZU1pc21hdGNoCitlcnJDb250cm9sSXNOb3RFbWJlZGRlciA9ICAgLTMwNTkwICAjZXJyQ29udHJvbElzTm90RW1iZWRkZXIKK2VyckNvbnRyb2xzQWxyZWFkeUV4aXN0ID0gICAtMzA1ODkgICNlcnJDb250cm9sc0FscmVhZHlFeGlzdAorZXJySW52YWxpZFBhcnRDb2RlICA9ICAgLTMwNTg4ICAjZXJySW52YWxpZFBhcnRDb2RlCitlcnJSb290QWxyZWFkeUV4aXN0cyAgICA9ICAgLTMwNTg3ICAjZXJyUm9vdEFscmVhZHlFeGlzdHMKK2Vyck5vUm9vdENvbnRyb2wgICAgPSAgIC0zMDU4NiAgI2Vyck5vUm9vdENvbnRyb2wKK2VyckNvdWxkbnRTZXRGb2N1cyAgPSAgIC0zMDU4NSAgI2VyckNvdWxkbnRTZXRGb2N1cworZXJyVW5rbm93bkNvbnRyb2wgICA9ICAgLTMwNTg0ICAjZXJyVW5rbm93bkNvbnRyb2wKK2VycldpbmRvd0RvZXNudFN1cHBvcnRGb2N1cyA9ICAgLTMwNTgzICAjZXJyV2luZG93RG9lc250U3VwcG9ydEZvY3VzCitlcnJDb250cm9sRG9lc250U3VwcG9ydEZvY3VzICAgID0gICAtMzA1ODIgICNlcnJDb250cm9sRG9lc250U3VwcG9ydEZvY3VzCitlcnJEYXRhTm90U3VwcG9ydGVkID0gICAtMzA1ODEgICNlcnJEYXRhTm90U3VwcG9ydGVkCitlcnJNZXNzYWdlTm90U3VwcG9ydGVkICA9ICAgLTMwNTgwICAjZXJyTWVzc2FnZU5vdFN1cHBvcnRlZAordGhlbWVNb25pdG9yRGVwdGhOb3RTdXBwb3J0ZWRFcnIgICAgPSAgIC0zMDU2NyAgI3RoZW1lIG5vdCBzdXBwb3J0ZWQgYXQgbW9uaXRvciBkZXB0aAordGhlbWVTY3JpcHRGb250Tm90Rm91bmRFcnIgID0gICAtMzA1NjYgICN0aGVtZSBmb250IHJlcXVlc3RlZCBmb3IgdW5pbnN0YWxsZWQgc2NyaXB0IHN5c3RlbQordGhlbWVCYWRDdXJzb3JJbmRleEVyciAgPSAgIC0zMDU2NSAgI3RoZW1lQmFkQ3Vyc29ySW5kZXhFcnIKK3RoZW1lSGFzTm9BY2NlbnRzRXJyICAgID0gICAtMzA1NjQgICN0aGVtZUhhc05vQWNjZW50c0VycgordGhlbWVCYWRUZXh0Q29sb3JFcnIgICAgPSAgIC0zMDU2MyAgI3RoZW1lQmFkVGV4dENvbG9yRXJyCit0aGVtZVByb2Nlc3NOb3RSZWdpc3RlcmVkRXJyICAgID0gICAtMzA1NjIgICN0aGVtZVByb2Nlc3NOb3RSZWdpc3RlcmVkRXJyCit0aGVtZVByb2Nlc3NSZWdpc3RlcmVkRXJyICAgPSAgIC0zMDU2MSAgI3RoZW1lUHJvY2Vzc1JlZ2lzdGVyZWRFcnIKK3RoZW1lSW52YWxpZEJydXNoRXJyICAgID0gICAtMzA1NjAgICNwYXR0ZXJuIGluZGV4IGludmFsaWQKK3F0dnJVbmluaXRpYWxpemVkICAgPSAgIC0zMDU1NSAgI3F0dnJVbmluaXRpYWxpemVkCitxdHZyTGlicmFyeUxvYWRFcnIgID0gICAtMzA1NTQgICNxdHZyTGlicmFyeUxvYWRFcnIKK3N0cmVhbWluZ05vZGVOb3RSZWFkeUVyciAgICA9ICAgLTMwNTUzICAjc3RyZWFtaW5nTm9kZU5vdFJlYWR5RXJyCitub01lbW9yeU5vZGVGYWlsZWRJbml0aWFsaXplICAgID0gICAtMzA1NTIgICNub01lbW9yeU5vZGVGYWlsZWRJbml0aWFsaXplCitpbnZhbGlkSG90U3BvdElERXJyID0gICAtMzA1NTEgICNpbnZhbGlkSG90U3BvdElERXJyCitpbnZhbGlkTm9kZUZvcm1hdEVyciAgICA9ICAgLTMwNTUwICAjaW52YWxpZE5vZGVGb3JtYXRFcnIKK2xpbWl0UmVhY2hlZEVyciA9ICAgLTMwNTQ5ICAjbGltaXRSZWFjaGVkRXJyCitzZXR0aW5nTm90U3VwcG9ydGVkQnlOb2RlRXJyICAgID0gICAtMzA1NDggICNzZXR0aW5nTm90U3VwcG9ydGVkQnlOb2RlRXJyCitwcm9wZXJ0eU5vdFN1cHBvcnRlZEJ5Tm9kZUVyciAgID0gICAtMzA1NDcgICNwcm9wZXJ0eU5vdFN1cHBvcnRlZEJ5Tm9kZUVycgordGltZU5vdEluVmlld0VyciAgICA9ICAgLTMwNTQ2ICAjdGltZU5vdEluVmlld0VycgoraW52YWxpZFZpZXdTdGF0ZUVyciA9ICAgLTMwNTQ1ICAjaW52YWxpZFZpZXdTdGF0ZUVycgoraW52YWxpZE5vZGVJREVyciAgICA9ICAgLTMwNTQ0ICAjaW52YWxpZE5vZGVJREVycgorc2VsZWN0b3JOb3RTdXBwb3J0ZWRCeU5vZGVFcnIgICA9ICAgLTMwNTQzICAjc2VsZWN0b3JOb3RTdXBwb3J0ZWRCeU5vZGVFcnIKK2NhbGxOb3RTdXBwb3J0ZWRCeU5vZGVFcnIgICA9ICAgLTMwNTQyICAjY2FsbE5vdFN1cHBvcnRlZEJ5Tm9kZUVycgorY29uc3RyYWludFJlYWNoZWRFcnIgICAgPSAgIC0zMDU0MSAgI2NvbnN0cmFpbnRSZWFjaGVkRXJyCitub3RBUVRWUk1vdmllRXJyICAgID0gICAtMzA1NDAgICNub3RBUVRWUk1vdmllRXJyCitrRkJDbm9TdWNoSGl0ICAgPSAgIC0zMDUzMiAgI2tGQkNub1N1Y2hIaXQKK2tGQkNiYWRTZWFyY2hTZXNzaW9uICAgID0gICAtMzA1MzEgICNrRkJDYmFkU2VhcmNoU2Vzc2lvbgora0ZCQ2luZGV4RGlza0lPRmFpbGVkICAgPSAgIC0zMDUzMCAgI2tGQkNpbmRleERpc2tJT0ZhaWxlZAora0ZCQ3N1bW1hcml6YXRpb25DYW5jZWxlZCAgID0gICAtMzA1MjkgICNrRkJDc3VtbWFyaXphdGlvbkNhbmNlbGVkCitrRkJDYmFkSW5kZXhGaWxlVmVyc2lvbiA9ICAgLTMwNTI4ICAja0ZCQ2JhZEluZGV4RmlsZVZlcnNpb24KK2tGQkNhbmFseXNpc05vdEF2YWlsYWJsZSAgICA9ICAgLTMwNTI3ICAja0ZCQ2FuYWx5c2lzTm90QXZhaWxhYmxlCitrRkJDaWxsZWdhbFNlc3Npb25DaGFuZ2UgICAgPSAgIC0zMDUyNiAgI3RyaWVkIHRvIGFkZC9yZW1vdmUgdm9scyB0byBhIHNlc3Npb24KK2tGQkNzb21lRmlsZXNOb3RJbmRleGVkID0gICAtMzA1MjUgICNrRkJDc29tZUZpbGVzTm90SW5kZXhlZAora0ZCQ3NlYXJjaEZhaWxlZCAgICA9ICAgLTMwNTI0ICAja0ZCQ3NlYXJjaEZhaWxlZAora0ZCQ2luZGV4Tm90QXZhaWxhYmxlICAgPSAgIC0zMDUyMyAgI2tGQkNpbmRleE5vdEF2YWlsYWJsZQora0ZCQ2luZGV4RmlsZURlc3Ryb3llZCAgPSAgIC0zMDUyMiAgI2tGQkNpbmRleEZpbGVEZXN0cm95ZWQKK2tGQkNhY2Nlc3NDYW5jZWxlZCAgPSAgIC0zMDUyMSAgI2tGQkNhY2Nlc3NDYW5jZWxlZAora0ZCQ2luZGV4aW5nQ2FuY2VsZWQgICAgPSAgIC0zMDUyMCAgI2tGQkNpbmRleGluZ0NhbmNlbGVkCitrRkJDbm9TZWFyY2hTZXNzaW9uID0gICAtMzA1MTkgICNrRkJDbm9TZWFyY2hTZXNzaW9uCitrRkJDaW5kZXhOb3RGb3VuZCAgID0gICAtMzA1MTggICNrRkJDaW5kZXhOb3RGb3VuZAora0ZCQ2ZsdXNoRmFpbGVkID0gICAtMzA1MTcgICNrRkJDZmx1c2hGYWlsZWQKK2tGQkNhZGREb2NGYWlsZWQgICAgPSAgIC0zMDUxNiAgI2tGQkNhZGREb2NGYWlsZWQKK2tGQkNhY2Nlc3NvclN0b3JlRmFpbGVkID0gICAtMzA1MTUgICNrRkJDYWNjZXNzb3JTdG9yZUZhaWxlZAora0ZCQ2luZGV4Q3JlYXRpb25GYWlsZWQgPSAgIC0zMDUxNCAgI2NvdWxkbid0IGNyZWF0ZSBpbmRleAora0ZCQ21lcmdpbmdGYWlsZWQgICA9ICAgLTMwNTEzICAjY291bGRuJ3QgbWVyZ2UgaW5kZXggZmlsZXMKK2tGQkN0b2tlbml6YXRpb25GYWlsZWQgID0gICAtMzA1MTIgICNjb3VsZG4ndCByZWFkIGZyb20gZG9jdW1lbnQgb3IgcXVlcnkKK2tGQkNtb3ZlRmFpbGVkICA9ICAgLTMwNTExICAjVi1Ud2luIGV4Y2VwdGlvbiBjYXVnaHQKK2tGQkNkZWxldGlvbkZhaWxlZCAgPSAgIC0zMDUxMCAgI1YtVHdpbiBleGNlcHRpb24gY2F1Z2h0CitrRkJDY29tbWl0RmFpbGVkICAgID0gICAtMzA1MDkgICNWLVR3aW4gZXhjZXB0aW9uIGNhdWdodAora0ZCQ2luZGV4aW5nRmFpbGVkICA9ICAgLTMwNTA4ICAjVi1Ud2luIGV4Y2VwdGlvbiBjYXVnaHQKK2tGQkN2YWxpZGF0aW9uRmFpbGVkICAgID0gICAtMzA1MDcgICNWLVR3aW4gZXhjZXB0aW9uIGNhdWdodAora0ZCQ2NvbXBhY3Rpb25GYWlsZWQgICAgPSAgIC0zMDUwNiAgI1YtVHdpbiBleGNlcHRpb24gY2F1Z2h0CitrRkJDYmFkSW5kZXhGaWxlICAgID0gICAtMzA1MDUgICNiYWQgRlNTcGVjLCBvciBiYWQgZGF0YSBpbiBmaWxlCitrRkJDZmlsZU5vdEluZGV4ZWQgID0gICAtMzA1MDQgICNrRkJDZmlsZU5vdEluZGV4ZWQKK2tGQkNiYWRQYXJhbSAgICA9ICAgLTMwNTAzICAja0ZCQ2JhZFBhcmFtCitrRkJDYWxsb2NGYWlsZWQgPSAgIC0zMDUwMiAgI3Byb2JhYmx5IGxvdyBtZW1vcnkKK2tGQkNub0luZGV4ZXNGb3VuZCAgPSAgIC0zMDUwMSAgI2tGQkNub0luZGV4ZXNGb3VuZAora0ZCQ3ZUd2luRXhjZXB0aW9uRXJyICAgPSAgIC0zMDUwMCAgI25vIHRlbGxpbmcgd2hhdCBpdCB3YXMKK2tEU3BTdGVyZW9Db250ZXh0RXJyICAgID0gICAtMzA0NTAgICNrRFNwU3RlcmVvQ29udGV4dEVycgora0RTcEludGVybmFsRXJyID0gICAtMzA0NDkgICNrRFNwSW50ZXJuYWxFcnIKK2tEU3BDb25maXJtU3dpdGNoV2FybmluZyAgICA9ICAgLTMwNDQ4ICAja0RTcENvbmZpcm1Td2l0Y2hXYXJuaW5nCitrRFNwRnJhbWVSYXRlTm90UmVhZHlFcnIgICAgPSAgIC0zMDQ0NyAgI2tEU3BGcmFtZVJhdGVOb3RSZWFkeUVycgora0RTcENvbnRleHROb3RGb3VuZEVyciAgPSAgIC0zMDQ0NiAgI2tEU3BDb250ZXh0Tm90Rm91bmRFcnIKK2tEU3BDb250ZXh0Tm90UmVzZXJ2ZWRFcnIgICA9ICAgLTMwNDQ1ICAja0RTcENvbnRleHROb3RSZXNlcnZlZEVycgora0RTcENvbnRleHRBbHJlYWR5UmVzZXJ2ZWRFcnIgICA9ICAgLTMwNDQ0ICAja0RTcENvbnRleHRBbHJlYWR5UmVzZXJ2ZWRFcnIKK2tEU3BJbnZhbGlkQXR0cmlidXRlc0VyciAgICA9ICAgLTMwNDQzICAja0RTcEludmFsaWRBdHRyaWJ1dGVzRXJyCitrRFNwSW52YWxpZENvbnRleHRFcnIgICA9ICAgLTMwNDQyICAja0RTcEludmFsaWRDb250ZXh0RXJyCitrRFNwU3lzdGVtU1dUb29PbGRFcnIgICA9ICAgLTMwNDQxICAja0RTcFN5c3RlbVNXVG9vT2xkRXJyCitrRFNwTm90SW5pdGlhbGl6ZWRFcnIgICA9ICAgLTMwNDQwICAja0RTcE5vdEluaXRpYWxpemVkRXJyCitrSVNwTGlzdEJ1c3lFcnIgPSAgIC0zMDQyOSAgI2tJU3BMaXN0QnVzeUVycgora0lTcERldmljZUFjdGl2ZUVyciA9ICAgLTMwNDI4ICAja0lTcERldmljZUFjdGl2ZUVycgora0lTcFN5c3RlbUFjdGl2ZUVyciA9ICAgLTMwNDI3ICAja0lTcFN5c3RlbUFjdGl2ZUVycgora0lTcERldmljZUluYWN0aXZlRXJyICAgPSAgIC0zMDQyNiAgI2tJU3BEZXZpY2VJbmFjdGl2ZUVycgora0lTcFN5c3RlbUluYWN0aXZlRXJyICAgPSAgIC0zMDQyNSAgI2tJU3BTeXN0ZW1JbmFjdGl2ZUVycgora0lTcEVsZW1lbnROb3RJbkxpc3RFcnIgPSAgIC0zMDQyNCAgI2tJU3BFbGVtZW50Tm90SW5MaXN0RXJyCitrSVNwRWxlbWVudEluTGlzdEVyciAgICA9ICAgLTMwNDIzICAja0lTcEVsZW1lbnRJbkxpc3RFcnIKK2tJU3BCdWZmZXJUb1NtYWxsRXJyICAgID0gICAtMzA0MjIgICNrSVNwQnVmZmVyVG9TbWFsbEVycgora0lTcFN5c3RlbUxpc3RFcnIgICA9ICAgLTMwNDIxICAja0lTcFN5c3RlbUxpc3RFcnIKK2tJU3BJbnRlcm5hbEVyciA9ICAgLTMwNDIwICAja0lTcEludGVybmFsRXJyCitrTlNwSm9pbkZhaWxlZEVyciAgID0gICAtMzAzOTkgICNrTlNwSm9pbkZhaWxlZEVycgora05TcENhbnRCbG9ja0VyciAgICA9ICAgLTMwMzk4ICAja05TcENhbnRCbG9ja0Vycgora05TcE1lc3NhZ2VUb29CaWdFcnIgICAgPSAgIC0zMDM5NyAgI2tOU3BNZXNzYWdlVG9vQmlnRXJyCitrTlNwU2VuZEZhaWxlZEVyciAgID0gICAtMzAzOTYgICNrTlNwU2VuZEZhaWxlZEVycgora05TcENvbm5lY3RGYWlsZWRFcnIgICAgPSAgIC0zMDM5NSAgI2tOU3BDb25uZWN0RmFpbGVkRXJyCitrTlNwR2FtZVRlcm1pbmF0ZWRFcnIgICA9ICAgLTMwMzk0ICAja05TcEdhbWVUZXJtaW5hdGVkRXJyCitrTlNwVGltZW91dEVyciAgPSAgIC0zMDM5MyAgI2tOU3BUaW1lb3V0RXJyCitrTlNwSW52YWxpZFByb3RvY29sTGlzdEVyciAgPSAgIC0zMDM5MiAgI2tOU3BJbnZhbGlkUHJvdG9jb2xMaXN0RXJyCitrTlNwSW52YWxpZFByb3RvY29sUmVmRXJyICAgPSAgIC0zMDM5MSAgI2tOU3BJbnZhbGlkUHJvdG9jb2xSZWZFcnIKK2tOU3BJbnZhbGlkRGVmaW5pdGlvbkVyciAgICA9ICAgLTMwMzkwICAja05TcEludmFsaWREZWZpbml0aW9uRXJyCitrTlNwQWRkUGxheWVyRmFpbGVkRXJyICA9ICAgLTMwMzg5ICAja05TcEFkZFBsYXllckZhaWxlZEVycgora05TcENyZWF0ZUdyb3VwRmFpbGVkRXJyICAgID0gICAtMzAzODggICNrTlNwQ3JlYXRlR3JvdXBGYWlsZWRFcnIKK2tOU3BOb0hvc3RWb2x1bnRlZXJzRXJyID0gICAtMzAzODcgICNrTlNwTm9Ib3N0Vm9sdW50ZWVyc0Vycgora05TcE5vR3JvdXBzRXJyID0gICAtMzAzODYgICNrTlNwTm9Hcm91cHNFcnIKK2tOU3BOb1BsYXllcnNFcnIgICAgPSAgIC0zMDM4NSAgI2tOU3BOb1BsYXllcnNFcnIKK2tOU3BJbnZhbGlkR3JvdXBJREVyciAgID0gICAtMzAzODQgICNrTlNwSW52YWxpZEdyb3VwSURFcnIKK2tOU3BJbnZhbGlkUGxheWVySURFcnIgID0gICAtMzAzODMgICNrTlNwSW52YWxpZFBsYXllcklERXJyCitrTlNwTmFtZVJlcXVpcmVkRXJyID0gICAtMzAzODIgICNrTlNwTmFtZVJlcXVpcmVkRXJyCitrTlNwRmVhdHVyZU5vdEltcGxlbWVudGVkRXJyICAgID0gICAtMzAzODEgICNrTlNwRmVhdHVyZU5vdEltcGxlbWVudGVkRXJyCitrTlNwQWRkcmVzc0luVXNlRXJyID0gICAtMzAzODAgICNrTlNwQWRkcmVzc0luVXNlRXJyCitrTlNwUmVtb3ZlUGxheWVyRmFpbGVkRXJyICAgPSAgIC0zMDM3OSAgI2tOU3BSZW1vdmVQbGF5ZXJGYWlsZWRFcnIKK2tOU3BGcmVlUUV4aGF1c3RlZEVyciAgID0gICAtMzAzNzggICNrTlNwRnJlZVFFeGhhdXN0ZWRFcnIKK2tOU3BJbnZhbGlkQWRkcmVzc0VyciAgID0gICAtMzAzNzcgICNrTlNwSW52YWxpZEFkZHJlc3NFcnIKK2tOU3BOb3RBZHZlcnRpc2luZ0VyciAgID0gICAtMzAzNzYgICNrTlNwTm90QWR2ZXJ0aXNpbmdFcnIKK2tOU3BBbHJlYWR5QWR2ZXJ0aXNpbmdFcnIgICA9ICAgLTMwMzc0ICAja05TcEFscmVhZHlBZHZlcnRpc2luZ0Vycgora05TcE1lbUFsbG9jYXRpb25FcnIgICAgPSAgIC0zMDM3MyAgI2tOU3BNZW1BbGxvY2F0aW9uRXJyCitrTlNwT1RWZXJzaW9uVG9vT2xkRXJyICA9ICAgLTMwMzcxICAja05TcE9UVmVyc2lvblRvb09sZEVycgora05TcE9UTm90UHJlc2VudEVyciA9ICAgLTMwMzcwICAja05TcE9UTm90UHJlc2VudEVycgora05TcEludmFsaWRQYXJhbWV0ZXJFcnIgPSAgIC0zMDM2OSAgI2tOU3BJbnZhbGlkUGFyYW1ldGVyRXJyCitrTlNwSW52YWxpZEdhbWVSZWZFcnIgICA9ICAgLTMwMzY3ICAja05TcEludmFsaWRHYW1lUmVmRXJyCitrTlNwUHJvdG9jb2xOb3RBdmFpbGFibGVFcnIgPSAgIC0zMDM2NiAgI2tOU3BQcm90b2NvbE5vdEF2YWlsYWJsZUVycgora05TcEhvc3RGYWlsZWRFcnIgICA9ICAgLTMwMzY1ICAja05TcEhvc3RGYWlsZWRFcnIKK2tOU3BQaXBlRnVsbEVyciA9ICAgLTMwMzY0ICAja05TcFBpcGVGdWxsRXJyCitrTlNwVG9wb2xvZ3lOb3RTdXBwb3J0ZWRFcnIgPSAgIC0zMDM2MiAgI2tOU3BUb3BvbG9neU5vdFN1cHBvcnRlZEVycgora05TcEFscmVhZHlJbml0aWFsaXplZEVyciAgID0gICAtMzAzNjEgICNrTlNwQWxyZWFkeUluaXRpYWxpemVkRXJyCitrTlNwSW5pdGlhbGl6YXRpb25GYWlsZWRFcnIgPSAgIC0zMDM2MCAgI2tOU3BJbml0aWFsaXphdGlvbkZhaWxlZEVycgora1NTcFNjYWxlVG9aZXJvRXJyICA9ICAgLTMwMzQ0ICAja1NTcFNjYWxlVG9aZXJvRXJyCitrU1NwUGFyYWxsZWxVcFZlY3RvckVyciA9ICAgLTMwMzQzICAja1NTcFBhcmFsbGVsVXBWZWN0b3JFcnIKK2tTU3BDYW50SW5zdGFsbEVyciAgPSAgIC0zMDM0MiAgI2tTU3BDYW50SW5zdGFsbEVycgora1NTcFZlcnNpb25FcnIgID0gICAtMzAzNDEgICNrU1NwVmVyc2lvbkVycgora1NTcEludGVybmFsRXJyID0gICAtMzAzNDAgICNrU1NwSW50ZXJuYWxFcnIKK2tBTE1JbnRlcm5hbEVyciA9ICAgLTMwMDQ5ICAja0FMTUludGVybmFsRXJyCitrQUxNR3JvdXBOb3RGb3VuZEVyciAgICA9ICAgLTMwMDQ4ICAja0FMTUdyb3VwTm90Rm91bmRFcnIKK2tBTE1Ob1N1Y2hNb2R1bGVFcnIgPSAgIC0zMDA0NyAgI2tBTE1Ob1N1Y2hNb2R1bGVFcnIKK2tBTE1Nb2R1bGVDb21tdW5pY2F0aW9uRXJyICA9ICAgLTMwMDQ2ICAja0FMTU1vZHVsZUNvbW11bmljYXRpb25FcnIKK2tBTE1EdXBsaWNhdGVNb2R1bGVFcnIgID0gICAtMzAwNDUgICNrQUxNRHVwbGljYXRlTW9kdWxlRXJyCitrQUxNSW5zdGFsbGF0aW9uRXJyID0gICAtMzAwNDQgICNrQUxNSW5zdGFsbGF0aW9uRXJyCitrQUxNRGVmZXJTd2l0Y2hFcnIgID0gICAtMzAwNDMgICNrQUxNRGVmZXJTd2l0Y2hFcnIKK2tBTE1SZWJvb3RGbGFnc0xldmVsRXJyID0gICAtMzAwNDIgICNrQUxNUmVib290RmxhZ3NMZXZlbEVycgora0xvY2FsZXNEZWZhdWx0RGlzcGxheVN0YXR1cyAgICA9ICAgLTMwMDI5ICAjUmVxdWVzdGVkIGRpc3BsYXkgbG9jYWxlIHVuYXZhaWxhYmxlLCB1c2VkIGRlZmF1bHQKK2tMb2NhbGVzVGFibGVGb3JtYXRFcnIgID0gICAtMzAwMDIgICNrTG9jYWxlc1RhYmxlRm9ybWF0RXJyCitrTG9jYWxlc0J1ZmZlclRvb1NtYWxsRXJyICAgPSAgIC0zMDAwMSAgI2tMb2NhbGVzQnVmZmVyVG9vU21hbGxFcnIKK2tGTlNOYW1lTm90Rm91bmRFcnIgPSAgIC0yOTU4OSAgI1RoZSBuYW1lIHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbXRlcnMgd2FzIG5vdCBmb3VuZAora0ZOU0JhZEZsYXR0ZW5lZFNpemVFcnIgPSAgIC0yOTU4NyAgI2ZsYXR0ZW5lZCBzaXplIGRpZG4ndCBtYXRjaCBpbnB1dCBvciB3YXMgdG9vIHNtYWxsCitrRk5TSW5zdWZmaWNpZW50RGF0YUVyciA9ICAgLTI5NTg2ICAjaW5zdWZmaWNpZW50IGRhdGEgZm9yIHRoZSBvcGVyYXRpb24KK2tGTlNNaXNtYXRjaEVyciA9ICAgLTI5NTg1ICAjcmVmZXJlbmNlIGRpZG4ndCBtYXRjaCBvciB3YXNuJ3QgZm91bmQgaW4gcHJvZmlsZQora0ZOU0R1cGxpY2F0ZVJlZmVyZW5jZUVyciAgID0gICAtMjk1ODQgICN0aGUgcmVmLiBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IGluIHRoZSBwcm9maWxlCitrRk5TQmFkUHJvZmlsZVZlcnNpb25FcnIgICAgPSAgIC0yOTU4MyAgI3Byb2ZpbGUgdmVyc2lvbiBpcyBvdXQgb2Yga25vd24gcmFuZ2UKK2tGTlNJbnZhbGlkUHJvZmlsZUVyciAgID0gICAtMjk1ODIgICNwcm9maWxlIGlzIE5VTEwgb3Igb3RoZXJ3aXNlIGJhZAora0ZOU0JhZFJlZmVyZW5jZVZlcnNpb25FcnIgID0gICAtMjk1ODEgICNyZWYuIHZlcnNpb24gaXMgb3V0IG9mIGtub3duIHJhbmdlCitrRk5TSW52YWxpZFJlZmVyZW5jZUVyciA9ICAgLTI5NTgwICAjcmVmLiB3YXMgTlVMTCBvciBvdGhlcndpc2UgYmFkCitrQ29sbGF0ZUludmFsaWRDb2xsYXRpb25SZWYgPSAgIC0yOTUwNyAgI2tDb2xsYXRlSW52YWxpZENvbGxhdGlvblJlZgora0NvbGxhdGVCdWZmZXJUb29TbWFsbCAgPSAgIC0yOTUwNiAgI2tDb2xsYXRlQnVmZmVyVG9vU21hbGwKK2tDb2xsYXRlSW52YWxpZENoYXIgPSAgIC0yOTUwNSAgI2tDb2xsYXRlSW52YWxpZENoYXIKK2tDb2xsYXRlUGF0dGVybk5vdEZvdW5kRXJyICA9ICAgLTI5NTA0ICAja0NvbGxhdGVQYXR0ZXJuTm90Rm91bmRFcnIKK2tDb2xsYXRlVW5pY29kZUNvbnZlcnRGYWlsZWRFcnIgPSAgIC0yOTUwMyAgI2tDb2xsYXRlVW5pY29kZUNvbnZlcnRGYWlsZWRFcnIKK2tDb2xsYXRlTWlzc2luZ1VuaWNvZGVUYWJsZUVyciAgPSAgIC0yOTUwMiAgI2tDb2xsYXRlTWlzc2luZ1VuaWNvZGVUYWJsZUVycgora0NvbGxhdGVJbnZhbGlkT3B0aW9ucyAgPSAgIC0yOTUwMSAgI2tDb2xsYXRlSW52YWxpZE9wdGlvbnMKK2tDb2xsYXRlQXR0cmlidXRlc05vdEZvdW5kRXJyICAgPSAgIC0yOTUwMCAgI2tDb2xsYXRlQXR0cmlidXRlc05vdEZvdW5kRXJyCitrTVBJbnZhbGlkSURFcnIgPSAgIC0yOTI5OSAgI2tNUEludmFsaWRJREVycgora01QSW5zdWZmaWNpZW50UmVzb3VyY2VzRXJyID0gICAtMjkyOTggICNrTVBJbnN1ZmZpY2llbnRSZXNvdXJjZXNFcnIKK2tNUFRhc2tBYm9ydGVkRXJyICAgPSAgIC0yOTI5NyAgI2tNUFRhc2tBYm9ydGVkRXJyCitrTVBUaW1lb3V0RXJyICAgPSAgIC0yOTI5NiAgI2tNUFRpbWVvdXRFcnIKK2tNUERlbGV0ZWRFcnIgICA9ICAgLTI5Mjk1ICAja01QRGVsZXRlZEVycgora01QQmx1ZUJsb2NraW5nRXJyICA9ICAgLTI5MjkzICAja01QQmx1ZUJsb2NraW5nRXJyCitrTVBUYXNrU3RvcHBlZEVyciAgID0gICAtMjkyOTIgICNBIGNvbnZlbnRpb24gdXNlZCB3aXRoIE1QVGhyb3dFeGNlcHRpb24uCitrTVBUYXNrQmxvY2tlZEVyciAgID0gICAtMjkyOTEgICNrTVBUYXNrQmxvY2tlZEVycgora01QVGFza0NyZWF0ZWRFcnIgICA9ICAgLTI5MjkwICAja01QVGFza0NyZWF0ZWRFcnIKK2tNUFByb2Nlc3NUZXJtaW5hdGVkRXJyID0gICAtMjkyODkgICNrTVBQcm9jZXNzVGVybWluYXRlZEVycgora01QUHJvY2Vzc0NyZWF0ZWRFcnIgICAgPSAgIC0yOTI4OCAgI2tNUFByb2Nlc3NDcmVhdGVkRXJyCitrTVBQcml2aWxlZ2VkRXJyICAgID0gICAtMjkyNzYgICNrTVBQcml2aWxlZ2VkRXJyCitrTVBJdGVyYXRpb25FbmRFcnIgID0gICAtMjkyNzUgICNrTVBJdGVyYXRpb25FbmRFcnIKK2tVQ1RleHRCcmVha0xvY2F0b3JNaXNzaW5nVHlwZSAgPSAgIC0yNTM0MSAgI1VuaWNvZGUgdGV4dCBicmVhayBlcnJvcgora1VDT3V0cHV0QnVmZmVyVG9vU21hbGwgPSAgIC0yNTM0MCAgI091dHB1dCBidWZmZXIgdG9vIHNtYWxsIGZvciBVbmljb2RlIHN0cmluZyByZXN1bHQKK2VycktDQ3JlYXRlQ2hhaW5GYWlsZWQgID0gICAtMjUzMTggICNlcnJLQ0NyZWF0ZUNoYWluRmFpbGVkCitlcnJLQ0RhdGFOb3RNb2RpZmlhYmxlICA9ICAgLTI1MzE3ICAjZXJyS0NEYXRhTm90TW9kaWZpYWJsZQorZXJyS0NEYXRhTm90QXZhaWxhYmxlICAgPSAgIC0yNTMxNiAgI2VycktDRGF0YU5vdEF2YWlsYWJsZQorZXJyS0NJbnRlcmFjdGlvblJlcXVpcmVkICAgID0gICAtMjUzMTUgICNlcnJLQ0ludGVyYWN0aW9uUmVxdWlyZWQKK2VycktDTm9Qb2xpY3lNb2R1bGUgPSAgIC0yNTMxNCAgI2VycktDTm9Qb2xpY3lNb2R1bGUKK2VycktDTm9DZXJ0aWZpY2F0ZU1vZHVsZSAgICA9ICAgLTI1MzEzICAjZXJyS0NOb0NlcnRpZmljYXRlTW9kdWxlCitlcnJLQ05vU3RvcmFnZU1vZHVsZSAgICA9ICAgLTI1MzEyICAjZXJyS0NOb1N0b3JhZ2VNb2R1bGUKK2VycktDS2V5U2l6ZU5vdEFsbG93ZWQgID0gICAtMjUzMTEgICNlcnJLQ0tleVNpemVOb3RBbGxvd2VkCitlcnJLQ1dyb25nS0NWZXJzaW9uID0gICAtMjUzMTAgICNlcnJLQ1dyb25nS0NWZXJzaW9uCitlcnJLQ1JlYWRPbmx5QXR0ciAgID0gICAtMjUzMDkgICNlcnJLQ1JlYWRPbmx5QXR0cgorZXJyS0NJbnRlcmFjdGlvbk5vdEFsbG93ZWQgID0gICAtMjUzMDggICNlcnJLQ0ludGVyYWN0aW9uTm90QWxsb3dlZAorZXJyS0NOb0RlZmF1bHRLZXljaGFpbiAgPSAgIC0yNTMwNyAgI2VycktDTm9EZWZhdWx0S2V5Y2hhaW4KK2VycktDTm9TdWNoQ2xhc3MgICAgPSAgIC0yNTMwNiAgI2VycktDTm9TdWNoQ2xhc3MKK2VycktDSW52YWxpZFNlYXJjaFJlZiAgID0gICAtMjUzMDUgICNlcnJLQ0ludmFsaWRTZWFyY2hSZWYKK2VycktDSW52YWxpZEl0ZW1SZWYgPSAgIC0yNTMwNCAgI2VycktDSW52YWxpZEl0ZW1SZWYKK2VycktDTm9TdWNoQXR0ciA9ICAgLTI1MzAzICAjZXJyS0NOb1N1Y2hBdHRyCitlcnJLQ0RhdGFUb29MYXJnZSAgID0gICAtMjUzMDIgICNlcnJLQ0RhdGFUb29MYXJnZQorZXJyS0NCdWZmZXJUb29TbWFsbCA9ICAgLTI1MzAxICAjZXJyS0NCdWZmZXJUb29TbWFsbAorZXJyS0NJdGVtTm90Rm91bmQgICA9ICAgLTI1MzAwICAjZXJyS0NJdGVtTm90Rm91bmQKK2VycktDRHVwbGljYXRlSXRlbSAgPSAgIC0yNTI5OSAgI2VycktDRHVwbGljYXRlSXRlbQorZXJyS0NJbnZhbGlkQ2FsbGJhY2sgICAgPSAgIC0yNTI5OCAgI2VycktDSW52YWxpZENhbGxiYWNrCitlcnJLQ0R1cGxpY2F0ZUNhbGxiYWNrICA9ICAgLTI1Mjk3ICAjZXJyS0NEdXBsaWNhdGVDYWxsYmFjaworZXJyS0NEdXBsaWNhdGVLZXljaGFpbiAgPSAgIC0yNTI5NiAgI2VycktDRHVwbGljYXRlS2V5Y2hhaW4KK2VycktDSW52YWxpZEtleWNoYWluICAgID0gICAtMjUyOTUgICNlcnJLQ0ludmFsaWRLZXljaGFpbgorZXJyS0NOb1N1Y2hLZXljaGFpbiA9ICAgLTI1Mjk0ICAjZXJyS0NOb1N1Y2hLZXljaGFpbgorZXJyS0NBdXRoRmFpbGVkID0gICAtMjUyOTMgICNlcnJLQ0F1dGhGYWlsZWQKK2VycktDUmVhZE9ubHkgICA9ICAgLTI1MjkyICAjZXJyS0NSZWFkT25seQorZXJyS0NOb3RBdmFpbGFibGUgICA9ICAgLTI1MjkxICAjZXJyS0NOb3RBdmFpbGFibGUKK3ByaW50ZXJTdGF0dXNPcENvZGVOb3RTdXBwb3J0ZWRFcnIgID0gICAtMjUyODAgICNwcmludGVyU3RhdHVzT3BDb2RlTm90U3VwcG9ydGVkRXJyCitrVFhOT3V0c2lkZU9mRnJhbWVFcnIgICA9ICAgLTIyMDE4ICAja1RYTk91dHNpZGVPZkZyYW1lRXJyCitrVFhOT3V0c2lkZU9mTGluZUVyciAgICA9ICAgLTIyMDE3ICAja1RYTk91dHNpZGVPZkxpbmVFcnIKK2tUWE5BVFNVSUlzTm90SW5zdGFsbGVkRXJyICA9ICAgLTIyMDE2ICAja1RYTkFUU1VJSXNOb3RJbnN0YWxsZWRFcnIKK2tUWE5EYXRhVHlwZU5vdEFsbG93ZWRFcnIgICA9ICAgLTIyMDE1ICAja1RYTkRhdGFUeXBlTm90QWxsb3dlZEVycgora1RYTkNvcHlOb3RBbGxvd2VkSW5FY2hvTW9kZUVyciA9ICAgLTIyMDE0ICAja1RYTkNvcHlOb3RBbGxvd2VkSW5FY2hvTW9kZUVycgora1RYTkNhbm5vdFR1cm5UU01PZmZXaGVuVXNpbmdVbmljb2RlRXJyID0gICAtMjIwMTMgICNrVFhOQ2Fubm90VHVyblRTTU9mZldoZW5Vc2luZ1VuaWNvZGVFcnIKK2tUWE5BbHJlYWR5SW5pdGlhbGl6ZWRFcnIgICA9ICAgLTIyMDEyICAja1RYTkFscmVhZHlJbml0aWFsaXplZEVycgora1RYTkludmFsaWRSdW5JbmRleCA9ICAgLTIyMDExICAja1RYTkludmFsaWRSdW5JbmRleAora1RYTlNvbWVPckFsbFRhZ3NJbnZhbGlkRm9yUnVuRXJyICAgPSAgIC0yMjAxMCAgI2tUWE5Tb21lT3JBbGxUYWdzSW52YWxpZEZvclJ1bkVycgora1RYTkF0dHJpYnV0ZVRhZ0ludmFsaWRGb3JSdW5FcnIgICAgPSAgIC0yMjAwOSAgI2RhdGFWYWx1ZSBpcyBzZXQgdG8gdGhpcyBwZXIgaW52YWxpZCB0YWcKK2tUWE5Ob01hdGNoRXJyICA9ICAgLTIyMDA4ICAja1RYTk5vTWF0Y2hFcnIKK2tUWE5SdW5JbmRleE91dG9mQm91bmRzRXJyICA9ICAgLTIyMDA3ICAja1RYTlJ1bkluZGV4T3V0b2ZCb3VuZHNFcnIKK2tUWE5DYW5ub3RTZXRBdXRvSW5kZW50RXJyICA9ICAgLTIyMDA2ICAja1RYTkNhbm5vdFNldEF1dG9JbmRlbnRFcnIKK2tUWE5CYWREZWZhdWx0RmlsZVR5cGVXYXJuaW5nICAgPSAgIC0yMjAwNSAgI2tUWE5CYWREZWZhdWx0RmlsZVR5cGVXYXJuaW5nCitrVFhOVXNlckNhbmNlbGVkT3BlcmF0aW9uRXJyICAgID0gICAtMjIwMDQgICNrVFhOVXNlckNhbmNlbGVkT3BlcmF0aW9uRXJyCitrVFhOSWxsZWdhbFRvQ3Jvc3NEYXRhQm91bmRhcmllc0VyciA9ICAgLTIyMDAzICAja1RYTklsbGVnYWxUb0Nyb3NzRGF0YUJvdW5kYXJpZXNFcnIKK2tUWE5JbnZhbGlkRnJhbWVJREVyciAgID0gICAtMjIwMDIgICNrVFhOSW52YWxpZEZyYW1lSURFcnIKK2tUWE5DYW5ub3RBZGRGcmFtZUVyciAgID0gICAtMjIwMDEgICNrVFhOQ2Fubm90QWRkRnJhbWVFcnIKK2tUWE5FbmRJdGVyYXRpb25FcnIgPSAgIC0yMjAwMCAgI2tUWE5FbmRJdGVyYXRpb25FcnIKK2ludmFsaWRJbmRleEVyciA9ICAgLTIwMDAyICAjVGhlIHJlY29yZEluZGV4IHBhcmFtZXRlciBpcyBub3QgdmFsaWQuCityZWNvcmREYXRhVG9vQmlnRXJyID0gICAtMjAwMDEgICNUaGUgcmVjb3JkIGRhdGEgaXMgYmlnZ2VyIHRoYW4gYnVmZmVyIHNpemUgKDEwMjQgYnl0ZXMpLgordW5rbm93bkluc2VydE1vZGVFcnIgICAgPSAgIC0yMDAwMCAgI1RoZXJlIGlzIG5vIHN1Y2ggYW4gaW5zZXJ0IG1vZGUuCitrTW9kZW1TY3JpcHRNaXNzaW5nID0gICAtMTQwMDIgICNrTW9kZW1TY3JpcHRNaXNzaW5nCitrTW9kZW1QcmVmZXJlbmNlc01pc3NpbmcgICAgPSAgIC0xNDAwMSAgI2tNb2RlbVByZWZlcmVuY2VzTWlzc2luZwora01vZGVtT3V0T2ZNZW1vcnkgICA9ICAgLTE0MDAwICAja01vZGVtT3V0T2ZNZW1vcnkKK2tISURCYXNlRXJyb3IgICA9ICAgLTEzOTUwICAja0hJREJhc2VFcnJvcgora0hJRE51bGxTdGF0ZUVyciAgICA9ICAgLTEzOTQ5ICAja0hJRE51bGxTdGF0ZUVycgora0hJREJ1ZmZlclRvb1NtYWxsRXJyICAgPSAgIC0xMzk0OCAgI2tISURCdWZmZXJUb29TbWFsbEVycgora0hJRFZhbHVlT3V0T2ZSYW5nZUVyciAgPSAgIC0xMzk0NyAgI2tISURWYWx1ZU91dE9mUmFuZ2VFcnIKK2tISURVc2FnZU5vdEZvdW5kRXJyICAgID0gICAtMTM5NDYgICNrSElEVXNhZ2VOb3RGb3VuZEVycgora0hJRE5vdFZhbHVlQXJyYXlFcnIgICAgPSAgIC0xMzk0NSAgI2tISUROb3RWYWx1ZUFycmF5RXJyCitrSElESW52YWxpZFByZXBhcnNlZERhdGFFcnIgPSAgIC0xMzk0NCAgI2tISURJbnZhbGlkUHJlcGFyc2VkRGF0YUVycgora0hJREluY29tcGF0aWJsZVJlcG9ydEVyciAgID0gICAtMTM5NDMgICNrSElESW5jb21wYXRpYmxlUmVwb3J0RXJyCitrSElEQmFkTG9nUGh5c1ZhbHVlc0VyciA9ICAgLTEzOTQyICAja0hJREJhZExvZ1BoeXNWYWx1ZXNFcnIKK2tISURJbnZhbGlkUmVwb3J0VHlwZUVyciAgICA9ICAgLTEzOTQxICAja0hJREludmFsaWRSZXBvcnRUeXBlRXJyCitrSElESW52YWxpZFJlcG9ydExlbmd0aEVyciAgPSAgIC0xMzk0MCAgI2tISURJbnZhbGlkUmVwb3J0TGVuZ3RoRXJyCitrSElETnVsbFBvaW50ZXJFcnIgID0gICAtMTM5MzkgICNrSElETnVsbFBvaW50ZXJFcnIKK2tISURCYWRQYXJhbWV0ZXJFcnIgPSAgIC0xMzkzOCAgI2tISURCYWRQYXJhbWV0ZXJFcnIKK2tISUROb3RFbm91Z2hNZW1vcnlFcnIgID0gICAtMTM5MzcgICNrSElETm90RW5vdWdoTWVtb3J5RXJyCitrSElERW5kT2ZEZXNjcmlwdG9yRXJyICA9ICAgLTEzOTM2ICAja0hJREVuZE9mRGVzY3JpcHRvckVycgora0hJRFVzYWdlUGFnZVplcm9FcnIgICAgPSAgIC0xMzkzNSAgI2tISURVc2FnZVBhZ2VaZXJvRXJyCitrSElEQmFkTG9naWNhbE1pbmltdW1FcnIgICAgPSAgIC0xMzkzNCAgI2tISURCYWRMb2dpY2FsTWluaW11bUVycgora0hJREJhZExvZ2ljYWxNYXhpbXVtRXJyICAgID0gICAtMTM5MzMgICNrSElEQmFkTG9naWNhbE1heGltdW1FcnIKK2tISURJbnZlcnRlZExvZ2ljYWxSYW5nZUVyciA9ICAgLTEzOTMyICAja0hJREludmVydGVkTG9naWNhbFJhbmdlRXJyCitrSElESW52ZXJ0ZWRQaHlzaWNhbFJhbmdlRXJyICAgID0gICAtMTM5MzEgICNrSElESW52ZXJ0ZWRQaHlzaWNhbFJhbmdlRXJyCitrSElEVW5tYXRjaGVkVXNhZ2VSYW5nZUVyciAgPSAgIC0xMzkzMCAgI2tISURVbm1hdGNoZWRVc2FnZVJhbmdlRXJyCitrSElESW52ZXJ0ZWRVc2FnZVJhbmdlRXJyICAgPSAgIC0xMzkyOSAgI2tISURJbnZlcnRlZFVzYWdlUmFuZ2VFcnIKK2tISURVbm1hdGNoZWRTdHJpbmdSYW5nZUVyciA9ICAgLTEzOTI4ICAja0hJRFVubWF0Y2hlZFN0cmluZ1JhbmdlRXJyCitrSElEVW5tYXRjaGVkRGVzaWduYXRvclJhbmdlRXJyID0gICAtMTM5MjcgICNrSElEVW5tYXRjaGVkRGVzaWduYXRvclJhbmdlRXJyCitrSElEUmVwb3J0U2l6ZVplcm9FcnIgICA9ICAgLTEzOTI2ICAja0hJRFJlcG9ydFNpemVaZXJvRXJyCitrSElEUmVwb3J0Q291bnRaZXJvRXJyICA9ICAgLTEzOTI1ICAja0hJRFJlcG9ydENvdW50WmVyb0Vycgora0hJRFJlcG9ydElEWmVyb0VyciA9ICAgLTEzOTI0ICAja0hJRFJlcG9ydElEWmVyb0Vycgora0hJREludmFsaWRSYW5nZVBhZ2VFcnIgPSAgIC0xMzkyMyAgI2tISURJbnZhbGlkUmFuZ2VQYWdlRXJyCitrSElERGV2aWNlTm90UmVhZHkgID0gICAtMTM5MTAgICNUaGUgZGV2aWNlIGlzIHN0aWxsIGluaXRpYWxpemluZywgdHJ5IGFnYWluIGxhdGVyCitrSElEVmVyc2lvbkluY29tcGF0aWJsZUVyciAgPSAgIC0xMzkwOSAgI2tISURWZXJzaW9uSW5jb21wYXRpYmxlRXJyCitkZWJ1Z2dpbmdOb01hdGNoRXJyID0gICAtMTM4ODcgICNkZWJ1Z2dpbmcgY29tcG9uZW50IG9yIG9wdGlvbiBub3QgZm91bmQgYXQgdGhpcyBpbmRleAorZGVidWdnaW5nTm9DYWxsYmFja0VyciAgPSAgIC0xMzg4NiAgI2RlYnVnZ2luZyBjb21wb25lbnQgaGFzIG5vIGNhbGxiYWNrCitkZWJ1Z2dpbmdJbnZhbGlkTmFtZUVyciA9ICAgLTEzODg1ICAjY29tcG9uZW50TmFtZSBvciBvcHRpb25OYW1lIGlzIGludmFsaWQgKE5VTEwpCitkZWJ1Z2dpbmdJbnZhbGlkT3B0aW9uRXJyICAgPSAgIC0xMzg4NCAgI29wdGlvblNlbGVjdG9yTnVtIGlzIG5vdCByZWdpc3RlcmVkCitkZWJ1Z2dpbmdJbnZhbGlkU2lnbmF0dXJlRXJyICAgID0gICAtMTM4ODMgICNjb21wb25lbnRTaWduYXR1cmUgbm90IHJlZ2lzdGVyZWQKK2RlYnVnZ2luZ0R1cGxpY2F0ZU9wdGlvbkVyciA9ICAgLTEzODgyICAjb3B0aW9uU2VsZWN0b3JOdW0gYWxyZWFkeSByZWdpc3RlcmVkCitkZWJ1Z2dpbmdEdXBsaWNhdGVTaWduYXR1cmVFcnIgID0gICAtMTM4ODEgICNjb21wb25lbnRTaWduYXR1cmUgYWxyZWFkeSByZWdpc3RlcmVkCitkZWJ1Z2dpbmdFeGVjdXRpb25Db250ZXh0RXJyICAgID0gICAtMTM4ODAgICNyb3V0aW5lIGNhbm5vdCBiZSBjYWxsZWQgYXQgdGhpcyB0aW1lCitrQnJpZGdlU29mdHdhcmVSdW5uaW5nQ2FudFNsZWVwID0gICAtMTMwMzggICNrQnJpZGdlU29mdHdhcmVSdW5uaW5nQ2FudFNsZWVwCitrTm9TdWNoUG93ZXJTb3VyY2UgID0gICAtMTMwMjAgICNrTm9TdWNoUG93ZXJTb3VyY2UKK2tQcm9jZXNzb3JUZW1wUm91dGluZVJlcXVpcmVzTVBMaWIyID0gICAtMTMwMTQgICNrUHJvY2Vzc29yVGVtcFJvdXRpbmVSZXF1aXJlc01QTGliMgora0NhbnRSZXBvcnRQcm9jZXNzb3JUZW1wZXJhdHVyZUVyciAgPSAgIC0xMzAxMyAgI2tDYW50UmVwb3J0UHJvY2Vzc29yVGVtcGVyYXR1cmVFcnIKK2tQb3dlck1ndFJlcXVlc3REZW5pZWQgID0gICAtMTMwMTAgICNrUG93ZXJNZ3RSZXF1ZXN0RGVuaWVkCitrUG93ZXJNZ3RNZXNzYWdlTm90SGFuZGxlZCAgPSAgIC0xMzAwOSAgI2tQb3dlck1ndE1lc3NhZ2VOb3RIYW5kbGVkCitrUG93ZXJIYW5kbGVyTm90Rm91bmRGb3JQcm9jRXJyID0gICAtMTMwMDggICNrUG93ZXJIYW5kbGVyTm90Rm91bmRGb3JQcm9jRXJyCitrUG93ZXJIYW5kbGVyTm90Rm91bmRGb3JEZXZpY2VFcnIgICA9ICAgLTEzMDA3ICAja1Bvd2VySGFuZGxlck5vdEZvdW5kRm9yRGV2aWNlRXJyCitrUG93ZXJIYW5kbGVyRXhpc3RzRm9yRGV2aWNlRXJyID0gICAtMTMwMDYgICNrUG93ZXJIYW5kbGVyRXhpc3RzRm9yRGV2aWNlRXJyCitwbVJlY3ZFbmRFcnIgICAgPSAgIC0xMzAwNSAgI2R1cmluZyByZWNlaXZlLCBwbWdyIGRpZCBub3QgZmluaXNoIGhzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgY29ubmVjdGlvbgorcG1SZWN2U3RhcnRFcnIgID0gICAtMTMwMDQgICNkdXJpbmcgcmVjZWl2ZSwgcG1nciBkaWQgbm90IHN0YXJ0IGhzCitwbVNlbmRFbmRFcnIgICAgPSAgIC0xMzAwMyAgI2R1cmluZyBzZW5kLCBwbWdyIGRpZCBub3QgZmluaXNoIGhzCitwbVNlbmRTdGFydEVyciAgPSAgIC0xMzAwMiAgI2R1cmluZyBzZW5kLCBwbWdyIGRpZCBub3Qgc3RhcnQgaHMKK3BtUmVwbHlUT0VyciAgICA9ICAgLTEzMDAxICAjVGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlcGx5CitwbUJ1c3lFcnIgICA9ICAgLTEzMDAwICAjUG93ZXIgTWdyIG5ldmVyIHJlYWR5IHRvIHN0YXJ0IGhhbmRzaGFrZQorcGljdHVyZURhdGFFcnIgID0gICAtMTEwMDUgICN0aGUgcGljdHVyZSBkYXRhIHdhcyBpbnZhbGlkCitjb2xvcnNSZXF1ZXN0ZWRFcnIgID0gICAtMTEwMDQgICN0aGUgbnVtYmVyIG9mIGNvbG9ycyByZXF1ZXN0ZWQgd2FzIGlsbGVnYWwKK2NhbnRMb2FkUGlja01ldGhvZEVyciAgID0gICAtMTEwMDMgICN1bmFibGUgdG8gbG9hZCB0aGUgY3VzdG9tIHBpY2sgcHJvYworcGljdEluZm9WZXJiRXJyID0gICAtMTEwMDIgICN0aGUgcGFzc2VkIHZlcmIgd2FzIGludmFsaWQKK3BpY3RJbmZvSURFcnIgICA9ICAgLTExMDAxICAjdGhlIGludGVybmFsIGNvbnNpc3RhbmN5IGNoZWNrIGZvciB0aGUgUGljdEluZm9JRCBpcyB3cm9uZworcGljdEluZm9WZXJzaW9uRXJyICA9ICAgLTExMDAwICAjd3JvbmcgdmVyc2lvbiBvZiB0aGUgUGljdEluZm8gc3RydWN0dXJlCitlcnJUYXNrTm90Rm91bmQgPSAgIC0xMDc4MCAgI25vIHRhc2sgd2l0aCB0aGF0IHRhc2sgaWQgZXhpc3RzCit0ZWxOb3RFbm91Z2hkc3BCVyAgID0gICAtMTAxMTYgICNub3QgZW5vdWdoIHJlYWwtdGltZSBmb3IgYWxsb2NhdGlvbgordGVsQmFkU2FtcGxlUmF0ZSAgICA9ICAgLTEwMTE1ICAjaW5jb21wYXRpYmxlIHNhbXBsZSByYXRlCit0ZWxCYWRTV0VyciA9ICAgLTEwMTE0ICAjU29mdHdhcmUgbm90IGluc3RhbGxlZCBwcm9wZXJseQordGVsRGV0QWxyZWFkeU9uID0gICAtMTAxMTMgICNkZXRlY3Rpb24gaXMgYWxyZWFkeSB0dXJuZWQgb24KK3RlbEF1dG9BbnNOb3RPbiA9ICAgLTEwMTEyICAjYXV0b0Fuc3dlciBpbiBub3QgdHVybmVkIG9uCit0ZWxWYWxpZGF0ZUZhaWxlZCAgID0gICAtMTAxMTEgICN0ZWxWYWxpZGF0ZSBmYWlsZWQKK3RlbEJhZFByb2NJRCAgICA9ICAgLTEwMTEwICAjaW52YWxpZCBwcm9jSUQKK3RlbERldmljZU5vdEZvdW5kICAgPSAgIC0xMDEwOSAgI2RldmljZSBub3QgZm91bmQKK3RlbEJhZENvZGVSZXNvdXJjZSAgPSAgIC0xMDEwOCAgI2NvZGUgcmVzb3VyY2Ugbm90IGZvdW5kCit0ZWxJbml0RmFpbGVkICAgPSAgIC0xMDEwNyAgI2luaXRpYWxpemF0aW9uIGZhaWxlZAordGVsTm9Db21tRm9sZGVyID0gICAtMTAxMDYgICNDb21tdW5pY2F0aW9ucy9FeHRlbnNpb25zIIAgbm90IGZvdW5kCit0ZWxVbmtub3duRXJyICAgPSAgIC0xMDEwMyAgI3VuYWJsZSB0byBzZXQgY29uZmlnCit0ZWxOb1N1Y2hUb29sICAgPSAgIC0xMDEwMiAgI3VuYWJsZSB0byBmaW5kIHRvb2wgd2l0aCBuYW1lIHNwZWNpZmllZAordGVsQmFkRnVuY3Rpb24gID0gICAtMTAwOTEgICNiYWQgbXNnQ29kZSBzcGVjaWZpZWQKK3RlbFBCRXJyICAgID0gICAtMTAwOTAgICNwYXJhbWV0ZXIgYmxvY2sgZXJyb3IsIGJhZCBmb3JtYXQKK3RlbENBTm90RGVmbGVjdGFibGUgPSAgIC0xMDA4MiAgI0NBIG5vdCAiZGVmbGVjdGFibGUiCit0ZWxDQU5vdFJlamVjdGFibGUgID0gICAtMTAwODEgICNDQSBub3QgInJlamVjdGFibGUiCit0ZWxDQU5vdEFjY2VwdGFibGUgID0gICAtMTAwODAgICNDQSBub3QgImFjY2VwdGFibGUiCit0ZWxUZXJtTm90T3BlbiAgPSAgIC0xMDA3MiAgI3Rlcm1pbmFsIG5vdCBvcGVuZWQgdmlhIFRFTE9wZW5UZXJtCit0ZWxTdGlsbE5lZWRlZCAgPSAgIC0xMDA3MSAgI3Rlcm1pbmFsIGRyaXZlciBzdGlsbCBuZWVkZWQgYnkgc29tZW9uZSBlbHNlCit0ZWxBbHJlYWR5T3BlbiAgPSAgIC0xMDA3MCAgI3Rlcm1pbmFsIGFscmVhZHkgb3BlbgordGVsTm9DYWxsYmFja1JlZiAgICA9ICAgLTEwMDY0ICAjbm8gY2FsbCBiYWNrIHJlZmVyZW5jZSB3YXMgc3BlY2lmaWVkLCBidXQgaXMgcmVxdWlyZWQKK3RlbERpc3BsYXlNb2RlTm90U3VwcCAgID0gICAtMTAwNjMgICNkaXNwbGF5IG1vZGUgbm90IHN1cHBvcnRlZCBieSB0b29sCit0ZWxCYWREaXNwbGF5TW9kZSAgID0gICAtMTAwNjIgICNiYWQgZGlzcGxheSBtb2RlIHNwZWNpZmllZAordGVsRndkVHlwZU5vdFN1cHAgICA9ICAgLTEwMDYxICAjZm9yd2FyZCB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdG9vbAordGVsRE5UeXBlTm90U3VwcCAgICA9ICAgLTEwMDYwICAjRE4gdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRvb2wKK3RlbEJhZFJhdGUgID0gICAtMTAwNTkgICNiYWQgcmF0ZSBzcGVjaWZpZWQKK3RlbEJhZEJlYXJlclR5cGUgICAgPSAgIC0xMDA1OCAgI2JhZCBiZWFyZXJUeXBlIHNwZWNpZmllZAordGVsQmFkU2VsZWN0ICAgID0gICAtMTAwNTcgICN1bmFibGUgdG8gc2VsZWN0IG9yIGRlc2VsZWN0IEROCit0ZWxCYWRQYXJrSUQgICAgPSAgIC0xMDA1NiAgI2JhZCBwYXJrIGlkIHNwZWNpZmllZAordGVsQmFkUGlja3VwR3JvdXBJRCA9ICAgLTEwMDU1ICAjYmFkIHBpY2t1cCBncm91cCBJRCBzcGVjaWZpZWQKK3RlbEJhZEZ3ZFR5cGUgICA9ICAgLTEwMDU0ICAjYmFkIGZ3ZFR5cGUgc3BlY2lmaWVkCit0ZWxCYWRGZWF0dXJlSUQgPSAgIC0xMDA1MyAgI2JhZCBmZWF0dXJlIElEIHNwZWNpZmllZAordGVsQmFkSW50ZXJjb21JRCAgICA9ICAgLTEwMDUyICAjYmFkIGludGVyY29tIElEIHNwZWNpZmllZAordGVsQmFkUGFnZUlEICAgID0gICAtMTAwNTEgICNiYWQgcGFnZSBJRCBzcGVjaWZpZWQKK3RlbEJhZEROVHlwZSAgICA9ICAgLTEwMDUwICAjRE4gdHlwZSBpbnZhbGlkCit0ZWxDb25mTGltaXRFeGNlZWRlZCAgICA9ICAgLTEwMDQ3ICAjYXR0ZW1wdCB0byBleGNlZWQgc3dpdGNoIGNvbmZlcmVuY2UgbGltaXRzCit0ZWxDQkVyciAgICA9ICAgLTEwMDQ2ICAjY2FsbCBiYWNrIGZlYXR1cmUgbm90IHNldCBwcmV2aW91c2x5Cit0ZWxUcmFuc2ZlclJlaiAgPSAgIC0xMDA0NSAgI3RyYW5zZmVyIHJlcXVlc3QgcmVqZWN0ZWQKK3RlbFRyYW5zZmVyRXJyICA9ICAgLTEwMDQ0ICAjdHJhbnNmZXIgbm90IHByZXBhcmVkCit0ZWxDb25mUmVqICA9ICAgLTEwMDQzICAjY29uZmVyZW5jZSByZXF1ZXN0IHdhcyByZWplY3RlZAordGVsQ29uZkVyciAgPSAgIC0xMDA0MiAgI2NvbmZlcmVuY2Ugd2FzIG5vdCBwcmVwYXJlZAordGVsQ29uZk5vTGltaXQgID0gICAtMTAwNDEgICNubyBsaW1pdCB3YXMgc3BlY2lmaWVkIGJ1dCByZXF1aXJlZAordGVsQ29uZkxpbWl0RXJyID0gICAtMTAwNDAgICNsaW1pdCBzcGVjaWZpZWQgaXMgdG9vIGhpZ2ggZm9yIHRoaXMgY29uZmlndXJhdGlvbgordGVsRmVhdE5vdFN1cHAgID0gICAtMTAwMzMgICNmZWF0dXJlIHByb2dyYW0gY2FsbCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbAordGVsRmVhdEFjdGl2ZSAgID0gICAtMTAwMzIgICNmZWF0dXJlIGFscmVhZHkgYWN0aXZlCit0ZWxGZWF0Tm90QXZhaWwgPSAgIC0xMDAzMSAgI2ZlYXR1cmUgc3Vic2NyaWJlZCBidXQgbm90IGF2YWlsYWJsZQordGVsRmVhdE5vdFN1YiAgID0gICAtMTAwMzAgICNmZWF0dXJlIG5vdCBzdWJzY3JpYmVkCitlcnJBRVByb3BlcnRpZXNDbGFzaCAgICA9ICAgLTEwMDI1ICAjaWxsZWdhbCBjb21iaW5hdGlvbiBvZiBwcm9wZXJ0aWVzIHNldHRpbmdzIGZvciBTZXQgRGF0YSwgbWFrZSBuZXcsIG9yIGR1cGxpY2F0ZQorZXJyQUVDYW50UHV0VGhhdFRoZXJlICAgPSAgIC0xMDAyNCAgI2luIG1ha2UgbmV3LCBkdXBsaWNhdGUsIGV0Yy4gY2xhc3MgY2FuJ3QgYmUgYW4gZWxlbWVudCBvZiBjb250YWluZXIKK2VyckFFTm90QW5FbnVtTWVtYmVyICAgID0gICAtMTAwMjMgICNlbnVtZXJhdGVkIHZhbHVlIGluIFNldERhdGEgaXMgbm90IGFsbG93ZWQgZm9yIHRoaXMgcHJvcGVydHkKK3RlbEludEV4dE5vdFN1cHAgICAgPSAgIC0xMDAyMiAgI2ludGVybmFsIGV4dGVybmFsIHR5cGUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRvb2wKK3RlbEJhZEludEV4dCAgICA9ICAgLTEwMDIxICAjYmFkIGludGVybmFsIGV4dGVybmFsIGVycm9yCit0ZWxTdGF0ZU5vdFN1cHAgPSAgIC0xMDAyMCAgI2RldmljZSBzdGF0ZSBub3Qgc3VwcG9ydGVkIGJ5IHRvb2wKK3RlbEJhZFN0YXRlRXJyICA9ICAgLTEwMDE5ICAjYmFkIGRldmljZSBzdGF0ZSBzcGVjaWZpZWQKK3RlbEluZGV4Tm90U3VwcCA9ICAgLTEwMDE4ICAjaW5kZXggbm90IHN1cHBvcnRlZCBieSB0aGlzIHRvb2wKK3RlbEJhZEluZGV4ID0gICAtMTAwMTcgICNiYWQgaW5kZXggc3BlY2lmaWVkCit0ZWxBUGF0dE5vdFN1cHAgPSAgIC0xMDAxNiAgI2FsZXJ0aW5nIHBhdHRlcm4gbm90IHN1cHBvcnRlZCBieSB0b29sCit0ZWxCYWRBUGF0dEVyciAgPSAgIC0xMDAxNSAgI2JhZCBhbGVydGluZyBwYXR0ZXJuIHNwZWNpZmllZAordGVsVlR5cGVOb3RTdXBwID0gICAtMTAwMTQgICN2b2x1bWUgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbAordGVsQmFkVlR5cGVFcnIgID0gICAtMTAwMTMgICNiYWQgdm9sdW1lIHR5cGUgZXJyb3IKK3RlbEJhZExldmVsRXJyICA9ICAgLTEwMDEyICAjYmFkIHZvbHVtZSBsZXZlbCBzZXR0aW5nCit0ZWxIVHlwZU5vdFN1cHAgPSAgIC0xMDAxMSAgI2hvb2sgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbAordGVsQmFkSFR5cGVFcnIgID0gICAtMTAwMTAgICNiYWQgaG9vayB0eXBlIHNwZWNpZmllZAorZXJyQUVDYW50U3VwcGx5VHlwZSA9ICAgLTEwMDA5ICAjZXJyQUVDYW50U3VwcGx5VHlwZQordGVsTm9PcGVuRXJyICAgID0gICAtMTAwMDggICN1bmFibGUgdG8gb3BlbiB0ZXJtaW5hbAordGVsTm9NZW1FcnIgPSAgIC0xMDAwNyAgI25vIG1lbW9yeSB0byBhbGxvY2F0ZSBoYW5kbGUKK2Vyck9TQUNhbnRBc3NpZ24gICAgPSAgIC0xMDAwNiAgI1NpZ25hbGVkIHdoZW4gYW4gb2JqZWN0IGNhbm5vdCBiZSBzZXQgaW4gYSBjb250YWluZXIuCit0ZWxCYWRQcm9jRXJyICAgPSAgIC0xMDAwNSAgI2JhZCBtc2dQcm9jIHNwZWNpZmllZAordGVsQmFkSGFuZEVyciAgID0gICAtMTAwMDQgICNiYWQgaGFuZGxlIHNwZWNpZmllZAorT1NBSWxsZWdhbEFzc2lnbiAgICA9ICAgLTEwMDAzICAjU2lnbmFsZWQgd2hlbiBhbiBvYmplY3QgY2FuIG5ldmVyIGJlIHNldCBpbiBhIGNvbnRhaW5lcgordGVsQmFkRE5FcnIgPSAgIC0xMDAwMiAgI1RFTEROSGFuZGxlIG5vdCBmb3VuZCBvciBpbnZhbGlkCit0ZWxCYWRUZXJtRXJyICAgPSAgIC0xMDAwMSAgI2ludmFsaWQgVEVMSGFuZGxlIG9yIGhhbmRsZSBub3QgZm91bmQKK2VyckFFRXZlbnRGYWlsZWQgICAgPSAgIC0xMDAwMCAgI2VyckFFRXZlbnRGYWlsZWQKK2Nhbm5vdE1vdmVBdHRhY2hlZENvbnRyb2xsZXIgICAgPSAgIC05OTk5ICAgI2Nhbm5vdE1vdmVBdHRhY2hlZENvbnRyb2xsZXIKK2NvbnRyb2xsZXJIYXNGaXhlZEhlaWdodCAgICA9ICAgLTk5OTggICAjY29udHJvbGxlckhhc0ZpeGVkSGVpZ2h0CitjYW5ub3RTZXRXaWR0aE9mQXR0YWNoZWRDb250cm9sbGVyICA9ICAgLTk5OTcgICAjY2Fubm90U2V0V2lkdGhPZkF0dGFjaGVkQ29udHJvbGxlcgorY29udHJvbGxlckJvdW5kc05vdEV4YWN0ICAgID0gICAtOTk5NiAgICNjb250cm9sbGVyQm91bmRzTm90RXhhY3QKK2VkaXRpbmdOb3RBbGxvd2VkICAgPSAgIC05OTk1ICAgI2VkaXRpbmdOb3RBbGxvd2VkCitiYWRDb250cm9sbGVySGVpZ2h0ID0gICAtOTk5NCAgICNiYWRDb250cm9sbGVySGVpZ2h0CitkZXZpY2VDYW50TWVldFJlcXVlc3QgICA9ICAgLTk0MDggICAjZGV2aWNlQ2FudE1lZXRSZXF1ZXN0CitzZXFHcmFiSW5mb05vdEF2YWlsYWJsZSA9ICAgLTk0MDcgICAjc2VxR3JhYkluZm9Ob3RBdmFpbGFibGUKK2JhZFNHQ2hhbm5lbCAgICA9ICAgLTk0MDYgICAjYmFkU0dDaGFubmVsCitjb3VsZG50R2V0UmVxdWlyZWRDb21wb25lbnQgPSAgIC05NDA1ICAgI2NvdWxkbnRHZXRSZXF1aXJlZENvbXBvbmVudAorbm90RW5vdWdoRGlza1NwYWNlVG9HcmFiICAgID0gICAtOTQwNCAgICNub3RFbm91Z2hEaXNrU3BhY2VUb0dyYWIKK25vdEVub3VnaE1lbW9yeVRvR3JhYiAgID0gICAtOTQwMyAgICNub3RFbm91Z2hNZW1vcnlUb0dyYWIKK2NhbnREb1RoYXRJbkN1cnJlbnRNb2RlID0gICAtOTQwMiAgICNjYW50RG9UaGF0SW5DdXJyZW50TW9kZQorZ3JhYlRpbWVDb21wbGV0ZSAgICA9ICAgLTk0MDEgICAjZ3JhYlRpbWVDb21wbGV0ZQorbm9EZXZpY2VGb3JDaGFubmVsICA9ICAgLTk0MDAgICAjbm9EZXZpY2VGb3JDaGFubmVsCitrTm9DYXJkQnVzQ0lTRXJyICAgID0gICAtOTEwOSAgICNObyB2YWxpZCBDSVMgZXhpc3RzIGZvciB0aGlzIENhcmRCdXMgY2FyZAora05vdFpWQ2FwYWJsZUVyciAgICA9ICAgLTkxMDggICAjVGhpcyBzb2NrZXQgZG9lcyBub3Qgc3VwcG9ydCBab29tZWQgVmlkZW8KK2tDYXJkUG93ZXJPZmZFcnIgICAgPSAgIC05MTA3ICAgI1Bvd2VyIHRvIHRoZSBjYXJkIGhhcyBiZWVuIHR1cm5lZCBvZmYKK2tBdHRlbXB0RHVwQ2FyZEVudHJ5RXJyID0gICAtOTEwNiAgICNUaGUgRW5hYmxlciB3YXMgYXNrZWQgdG8gY3JlYXRlIGEgZHVwbGljYXRlIGNhcmQgZW50cnkKK2tBbHJlYWR5U2F2ZWRTdGF0ZUVyciAgID0gICAtOTEwNSAgICNUaGUgc3RhdGUgaGFzIGJlZW4gc2F2ZWQgb24gcHJldmlvdXMgY2FsbAora1Rvb01hbnlJT1dpbmRvd3NFcnIgICAgPSAgIC05MTA0ICAgI2RldmljZSByZXF1ZXN0ZWQgbW9yZSB0aGFuIG9uZSBJL08gd2luZG93CitrTm90UmVhZHlFcnIgICAgPSAgIC05MTAzICAgI1BDIENhcmQgZmFpbGVkIHRvIGdvIHJlYWR5CitrQ2xpZW50UmVxdWVzdERlbmllZCAgICA9ICAgLTkxMDIgICAjQ1MgQ2xpZW50cyBzaG91bGQgcmV0dXJuIHRoaXMgY29kZSBpbm9yZGVyIHRvCitrTm9Db21wYXRpYmxlTmFtZUVyciAgICA9ICAgLTkxMDEgICAjVGhlcmUgaXMgbm8gY29tcGF0aWJsZSBkcml2ZXIgbmFtZSBmb3IgdGhpcyBkZXZpY2UKK2tOb0VuYWJsZXJGb3JDYXJkRXJyICAgID0gICAtOTEwMCAgICNObyBFbmFibGVycyB3ZXJlIGZvdW5kIHRoYXQgY2FuIHN1cHBvcnQgdGhlIGNhcmQKK2tOb0NhcmRFbmFibGVyc0ZvdW5kRXJyID0gICAtOTA5OSAgICNObyBFbmFibGVycyB3ZXJlIGZvdW5kCitrVW5zdXBwb3J0ZWRDYXJkRXJyID0gICAtOTA5OCAgICNDYXJkIG5vdCBzdXBwb3J0ZWQgYnkgZ2VuZXJpYyBlbmFibGVyCitrTm9DbGllbnRUYWJsZUVyciAgID0gICAtOTA5NyAgICNUaGUgY2xpZW50IHRhYmxlIGhhcyBub3QgYmUgaW5pdGlhbGl6ZWQgeWV0CitrTm9Nb3JlSW50ZXJydXB0U2xvdHNFcnIgICAgPSAgIC05MDk2ICAgI0FsbCBpbnRlcm5hbCBJbnRlcnJ1cHQgc2xvdHMgYXJlIGluIHVzZQora05vTW9yZVRpbWVyQ2xpZW50c0VyciAgPSAgIC05MDk1ICAgI0FsbCB0aW1lciBjYWxsYmFja3MgYXJlIGluIHVzZQora05vSU9XaW5kb3dSZXF1ZXN0ZWRFcnIgPSAgIC05MDk0ICAgI1JlcXVlc3QgSS9PIHdpbmRvdyBiZWZvcmUgY2FsbGluZyBjb25maWd1cmF0aW9uCitrQmFkQ3VzdG9tSUZJREVyciAgID0gICAtOTA5MyAgICNDdXN0b20gaW50ZXJmYWNlIElEIGlzIGludmFsaWQKK2tCYWRUdXBsZURhdGFFcnIgICAgPSAgIC05MDkyICAgI0RhdGEgaW4gdHVwbGUgaXMgaW52YWxpZAora0ludmFsaWRDU0NsaWVudEVyciA9ICAgLTkwOTEgICAjQ2FyZCBTZXJ2aWNlcyBDbGllbnRJRCBpcyBub3QgcmVnaXN0ZXJlZAora1Vuc3VwcG9ydGVkVnNFcnIgICA9ICAgLTkwOTAgICAjVW5zdXBwb3J0ZWQgVm9sdGFnZSBTZW5zZQora0ludmFsaWREZXZpY2VOdW1iZXIgICAgPSAgIC05MDg5ICAgI2tJbnZhbGlkRGV2aWNlTnVtYmVyCitrUG9zdENhcmRFdmVudEVyciAgID0gICAtOTA4OCAgICNfUENDU0xQb3N0Q2FyZEV2ZW50IGZhaWxlZCBhbmQgZHJvcHBlZCBhbiBldmVudAora0NhbnRDb25maWd1cmVDYXJkRXJyICAgPSAgIC05MDg3ICAgI2tDYW50Q29uZmlndXJlQ2FyZEVycgora1Bhc3NDYWxsVG9DaGFpbkVyciA9ICAgLTkwODYgICAja1Bhc3NDYWxsVG9DaGFpbkVycgora0NhcmRCdXNDYXJkRXJyID0gICAtOTA4NSAgICNrQ2FyZEJ1c0NhcmRFcnIKK2sxNkJpdENhcmRFcnIgICA9ICAgLTkwODQgICAjazE2Qml0Q2FyZEVycgora0JhZERldmljZUVyciAgID0gICAtOTA4MyAgICNrQmFkRGV2aWNlRXJyCitrQmFkTGlua0VyciA9ICAgLTkwODIgICAja0JhZExpbmtFcnIKK2tJbnZhbGlkUmVnRW50cnlFcnIgPSAgIC05MDgxICAgI2tJbnZhbGlkUmVnRW50cnlFcnIKK2tOb0NhcmRTZXZpY2VzU29ja2V0c0VyciAgICA9ICAgLTkwODAgICAja05vQ2FyZFNldmljZXNTb2NrZXRzRXJyCitrT3V0T2ZSZXNvdXJjZUVyciAgID0gICAtOTA3OSAgICNDYXJkIFNlcnZpY2VzIGhhcyBleGhhdXN0ZWQgdGhlIHJlc291cmNlCitrTm9Nb3JlSXRlbXNFcnIgPSAgIC05MDc4ICAgI3RoZXJlIGFyZSBubyBtb3JlIG9mIHRoZSByZXF1ZXN0ZWQgaXRlbQora0luVXNlRXJyICAgPSAgIC05MDc3ICAgI3JlcXVlc3RlZCByZXNvdXJjZSBpcyBiZWluZyB1c2VkIGJ5IGEgY2xpZW50CitrQ29uZmlndXJhdGlvbkxvY2tlZEVyciA9ICAgLTkwNzYgICAjYSBjb25maWd1cmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkCitrV3JpdGVQcm90ZWN0ZWRFcnIgID0gICAtOTA3NSAgICNtZWRpYSBpcyB3cml0ZS1wcm90ZWN0ZWQKK2tCdXN5RXJyICAgID0gICAtOTA3NCAgICN1bmFibGUgdG8gcHJvY2VzcyByZXF1ZXN0IGF0IHRoaXMgdGltZSAtIHRyeSBsYXRlcgora1Vuc3VwcG9ydGVkTW9kZUVyciA9ICAgLTkwNzMgICAjbW9kZSBpcyBub3Qgc3VwcG9ydGVkCitrVW5zdXBwb3J0ZWRGdW5jdGlvbkVyciA9ICAgLTkwNzIgICAjZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uCitrTm9DYXJkRXJyICA9ICAgLTkwNzEgICAjbm8gUEMgY2FyZCBpbiB0aGUgc29ja2V0CitrR2VuZXJhbEZhaWx1cmVFcnIgID0gICAtOTA3MCAgICNhbiB1bmRlZmluZWQgZXJyb3IgaGFzIG9jY3VycmVkCitrV3JpdGVGYWlsdXJlRXJyICAgID0gICAtOTA2OSAgICN1bmFibGUgdG8gY29tcGxldGUgd3JpdGUgcmVxdWVzdAora1JlYWRGYWlsdXJlRXJyID0gICAtOTA2OCAgICN1bmFibGUgdG8gY29tcGxldGUgcmVhZCByZXF1ZXN0CitrQmFkU3BlZWRFcnIgICAgPSAgIC05MDY3ICAgI3NwZWNpZmllZCBzcGVlZCBpcyB1bmF2YWlsYWJsZQora0JhZENJU0VyciAgPSAgIC05MDY2ICAgI0NJUyBvbiBjYXJkIGlzIGludmFsaWQKK2tCYWRIYW5kbGVFcnIgICA9ICAgLTkwNjUgICAjY2xpZW50SGFuZGxlIGlzIGludmFsaWQKK2tCYWRBcmdzRXJyID0gICAtOTA2NCAgICN2YWx1ZXMgaW4gYXJndW1lbnQgcGFja2V0IGFyZSBpbnZhbGlkCitrQmFkQXJnTGVuZ3RoRXJyICAgID0gICAtOTA2MyAgICNBcmdMZW5ndGggYXJndW1lbnQgaXMgaW52YWxpZAora0JhZFdpbmRvd0VyciAgID0gICAtOTA2MiAgICNzcGVjaWZpZWQgd2luZG93IGlzIGludmFsaWQKK2tCYWRWcHBFcnIgID0gICAtOTA2MSAgICNzcGVjaWZpZWQgVnBwMSBvciBWcHAyIHBvd2VyIGxldmVsIGluZGV4IGlzIGludmFsaWQKK2tCYWRWY2NFcnIgID0gICAtOTA2MCAgICNzcGVjaWZpZWQgVmNjIHBvd2VyIGxldmVsIGluZGV4IGlzIGludmFsaWQKK2tCYWRUeXBlRXJyID0gICAtOTA1OSAgICNzcGVjaWZpZWQgd2luZG93IG9yIGludGVyZmFjZSB0eXBlIGlzIGludmFsaWQKK2tCYWRTb2NrZXRFcnIgICA9ICAgLTkwNTggICAjc3BlY2lmaWVkIGxvZ2ljYWwgb3IgcGh5c2ljYWwgc29ja2V0IG51bWJlciBpcyBpbnZhbGlkCitrQmFkU2l6ZUVyciA9ICAgLTkwNTcgICAjc3BlY2lmaWVkIHNpemUgaXMgaW52YWxpZAora0JhZFBhZ2VFcnIgPSAgIC05MDU2ICAgI3NwZWNpZmllZCBwYWdlIGlzIGludmFsaWQKK2tCYWRPZmZzZXRFcnIgICA9ICAgLTkwNTUgICAjc3BlY2lmaWVkIFBDIGNhcmQgbWVtb3J5IGFycmF5IG9mZnNldCBpcyBpbnZhbGlkCitrQmFkSVJRRXJyICA9ICAgLTkwNTQgICAjc3BlY2lmaWVkIElSUSBsZXZlbCBpcyBpbnZhbGlkCitrQmFkRURDRXJyICA9ICAgLTkwNTMgICAjc3BlY2lmaWVkIEVEQyBnZW5lcmF0b3Igc3BlY2lmaWVkIGlzIGludmFsaWQKK2tCYWRCYXNlRXJyID0gICAtOTA1MiAgICNzcGVjaWZpZWQgYmFzZSBzeXN0ZW0gbWVtb3J5IGFkZHJlc3MgaXMgaW52YWxpZAora0JhZEF0dHJpYnV0ZUVyciAgICA9ICAgLTkwNTEgICAjc3BlY2lmaWVkIGF0dHJpYnV0ZXMgZmllbGQgdmFsdWUgaXMgaW52YWxpZAora0JhZEFkYXB0ZXJFcnIgID0gICAtOTA1MCAgICNpbnZhbGlkIGFkYXB0ZXIgbnVtYmVyCitjb2RlY09mZnNjcmVlbkZhaWxlZFBsZWFzZVJldHJ5RXJyICA9ICAgLTg5OTIgICAjY29kZWNPZmZzY3JlZW5GYWlsZWRQbGVhc2VSZXRyeUVycgorbG9ja1BvcnRCaXRzV3JvbmdHRGV2aWNlRXJyID0gICAtODk5MSAgICNsb2NrUG9ydEJpdHNXcm9uZ0dEZXZpY2VFcnIKK2RpcmVjdFhPYmplY3RBbHJlYWR5RXhpc3RzICA9ICAgLTg5OTAgICAjZGlyZWN0WE9iamVjdEFscmVhZHlFeGlzdHMKK2NvZGVjRHJvcHBlZEZyYW1lRXJyICAgID0gICAtODk4OSAgICNyZXR1cm5lZCBmcm9tIEltYWdlQ29kZWNEcmF3QmFuZAorY29kZWNPZmZzY3JlZW5GYWlsZWRFcnIgPSAgIC04OTg4ICAgI2NvZGVjT2Zmc2NyZWVuRmFpbGVkRXJyCitjb2RlY05lZWRBY2Nlc3NLZXlFcnIgICA9ICAgLTg5ODcgICAjY29kZWMgbmVlZHMgcGFzc3dvcmQgaW4gb3JkZXIgdG8gZGVjb21wcmVzcworY29kZWNQYXJhbWV0ZXJEaWFsb2dDb25maXJtID0gICAtODk4NiAgICNjb2RlY1BhcmFtZXRlckRpYWxvZ0NvbmZpcm0KK2xvY2tQb3J0Qml0c1N1cmZhY2VMb3N0RXJyICA9ICAgLTg5ODUgICAjbG9ja1BvcnRCaXRzU3VyZmFjZUxvc3RFcnIKK2xvY2tQb3J0Qml0c0JhZFBvcnRFcnIgID0gICAtODk4NCAgICNsb2NrUG9ydEJpdHNCYWRQb3J0RXJyCitsb2NrUG9ydEJpdHNXaW5kb3dDbGlwcGVkRXJyICAgID0gICAtODk4MyAgICNsb2NrUG9ydEJpdHNXaW5kb3dDbGlwcGVkRXJyCitsb2NrUG9ydEJpdHNXaW5kb3dSZXNpemVkRXJyICAgID0gICAtODk4MiAgICNsb2NrUG9ydEJpdHNXaW5kb3dSZXNpemVkRXJyCitsb2NrUG9ydEJpdHNXaW5kb3dNb3ZlZEVyciAgPSAgIC04OTgxICAgI2xvY2tQb3J0Qml0c1dpbmRvd01vdmVkRXJyCitsb2NrUG9ydEJpdHNCYWRTdXJmYWNlRXJyICAgPSAgIC04OTgwICAgI2xvY2tQb3J0Qml0c0JhZFN1cmZhY2VFcnIKK2NvZGVjTmVlZFRvRmx1c2hDaGFpbkVyciAgICA9ICAgLTg5NzkgICAjY29kZWNOZWVkVG9GbHVzaENoYWluRXJyCitjb2RlY0Rpc2FibGVkRXJyICAgID0gICAtODk3OCAgICNjb2RlYyBkaXNhYmxlZCBpdHNlbGYgLS0gcGFzcyBjb2RlY0ZsYWdSZWVuYWJsZSB0byByZXNldAorY29kZWNOb01lbW9yeVBsZWFzZVdhaXRFcnIgID0gICAtODk3NyAgICNjb2RlY05vTWVtb3J5UGxlYXNlV2FpdEVycgorY29kZWNOb3RoaW5nVG9CbGl0RXJyICAgPSAgIC04OTc2ICAgI2NvZGVjTm90aGluZ1RvQmxpdEVycgorY29kZWNDYW50UXVldWVFcnIgICA9ICAgLTg5NzUgICAjY29kZWNDYW50UXVldWVFcnIKK2NvZGVjQ2FudFdoZW5FcnIgICAgPSAgIC04OTc0ICAgI2NvZGVjQ2FudFdoZW5FcnIKK2NvZGVjT3BlbkVyciAgICA9ICAgLTg5NzMgICAjY29kZWNPcGVuRXJyCitjb2RlY0NvbmRpdGlvbkVyciAgID0gICAtODk3MiAgICNjb2RlY0NvbmRpdGlvbkVycgorY29kZWNFeHRlbnNpb25Ob3RGb3VuZEVyciAgID0gICAtODk3MSAgICNjb2RlY0V4dGVuc2lvbk5vdEZvdW5kRXJyCitjb2RlY0RhdGFWZXJzRXJyICAgID0gICAtODk3MCAgICNjb2RlY0RhdGFWZXJzRXJyCitjb2RlY0JhZERhdGFFcnIgPSAgIC04OTY5ICAgI2NvZGVjQmFkRGF0YUVycgorY29kZWNXb3VsZE9mZnNjcmVlbkVyciAgPSAgIC04OTY4ICAgI2NvZGVjV291bGRPZmZzY3JlZW5FcnIKK2NvZGVjQWJvcnRFcnIgICA9ICAgLTg5NjcgICAjY29kZWNBYm9ydEVycgorY29kZWNTcG9vbEVyciAgID0gICAtODk2NiAgICNjb2RlY1Nwb29sRXJyCitjb2RlY0ltYWdlQnVmRXJyICAgID0gICAtODk2NSAgICNjb2RlY0ltYWdlQnVmRXJyCitjb2RlY1NjcmVlbkJ1ZkVyciAgID0gICAtODk2NCAgICNjb2RlY1NjcmVlbkJ1ZkVycgorY29kZWNTaXplRXJyICAgID0gICAtODk2MyAgICNjb2RlY1NpemVFcnIKK2NvZGVjVW5pbXBFcnIgICA9ICAgLTg5NjIgICAjY29kZWNVbmltcEVycgorbm9Db2RlY0VyciAgPSAgIC04OTYxICAgI25vQ29kZWNFcnIKK2NvZGVjRXJyICAgID0gICAtODk2MCAgICNjb2RlY0Vycgora0lsbGVnYWxDbG9ja1ZhbHVlRXJyICAgPSAgIC04ODUyICAgI2tJbGxlZ2FsQ2xvY2tWYWx1ZUVycgora1VUQ092ZXJmbG93RXJyID0gICAtODg1MSAgICNrVVRDT3ZlcmZsb3dFcnIKK2tVVENVbmRlcmZsb3dFcnIgICAgPSAgIC04ODUwICAgI2tVVENVbmRlcmZsb3dFcnIKK2tBVFNVTGFzdEVyciAgICA9ICAgLTg4MDkgICAjVGhlIGxhc3QgQVRTVUkgZXJyb3IgY29kZS4KK2tBVFNVTGluZUJyZWFrSW5Xb3JkICAgID0gICAtODgwOCAgICNUaGlzIGlzIG5vdCBhbiBlcnJvciBjb2RlIGJ1dCBpcyByZXR1cm5lZCBieSBBVFNVQnJlYWtMaW5lIHRvCitrQVRTVUNvb3JkaW5hdGVPdmVyZmxvd0VyciAgPSAgIC04ODA3ICAgI1VzZWQgdG8gaW5kaWNhdGUgdGhlIGNvb3JkaW5hdGVzIHByb3ZpZGVkIHRvIGFuIEFUU1VJIHJvdXRpbmUgY2F1c2VkCitrQVRTVU5vRm9udFNjYWxlckF2YWlsYWJsZUVyciAgID0gICAtODgwNiAgICNVc2VkIHdoZW4gbm8gZm9udCBzY2FsZXIgaXMgYXZhaWxhYmxlIGZvciB0aGUgZm9udCBwYXNzZWQKK2tBVFNVTm9Gb250Q21hcEF2YWlsYWJsZUVyciA9ICAgLTg4MDUgICAjVXNlZCB3aGVuIG5vIENNQVAgdGFibGUgY2FuIGJlIGFjY2Vzc2VkIG9yIHN5bnRoZXNpemVkIGZvciB0aGUKK2tBVFNVTG93TGV2ZWxFcnIgICAgPSAgIC04ODA0ICAgI1VzZWQgd2hlbiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2l0aGluIHRoZSBsb3cgbGV2ZWwgQVRTCitrQVRTVVF1aWNrRHJhd1RleHRFcnIgICA9ICAgLTg4MDMgICAjVXNlZCB3aGVuIFF1aWNrRHJhdyBUZXh0IGVuY291bnRlcnMgYW4gZXJyb3IgcmVuZGVyaW5nIG9yIG1lYXN1cmluZwora0FUU1VOb1N0eWxlUnVuc0Fzc2lnbmVkRXJyID0gICAtODgwMiAgICNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBtZWFzdXJlLCBoaWdobGlnaHQgb3IgZHJhdwora0FUU1VOb3RTZXRFcnIgID0gICAtODgwMSAgICNVc2VkIHdoZW4gdGhlIGNsaWVudCBhdHRlbXB0cyB0byByZXRyaWV2ZSBhbiBhdHRyaWJ1dGUsCitrQVRTVUludmFsaWRDYWNoZUVyciAgICA9ICAgLTg4MDAgICAjVXNlZCB3aGVuIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gcmVhZCBpbiBzdHlsZSBkYXRhCitrQVRTVUludmFsaWRBdHRyaWJ1dGVUYWdFcnIgPSAgIC04Nzk5ICAgI1VzZWQgd2hlbiBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHVzZSBhIHRhZyB2YWx1ZSB0aGF0CitrQVRTVUludmFsaWRBdHRyaWJ1dGVTaXplRXJyICAgID0gICAtODc5OCAgICNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1c2UgYW4gYXR0cmlidXRlIHdpdGggYQora0FUU1VJbnZhbGlkQXR0cmlidXRlVmFsdWVFcnIgICA9ICAgLTg3OTcgICAjVXNlZCB3aGVuIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gdXNlIGFuIGF0dHJpYnV0ZSB3aXRoCitrQVRTVUludmFsaWRGb250RXJyID0gICAtODc5NiAgICNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1c2UgYW4gaW52YWxpZCBmb250IElELgora0FUU1VOb0NvcnJlc3BvbmRpbmdGb250RXJyID0gICAtODc5NSAgICNUaGlzIHZhbHVlIGlzIHJldHJuZWQgYnkgZm9udCBJRCBjb252ZXJzaW9uCitrQVRTVUZvbnRzTm90TWF0Y2hlZCAgICA9ICAgLTg3OTQgICAjVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBieSBBVFNVTWF0Y2hGb250c1RvVGV4dCgpCitrQVRTVUZvbnRzTWF0Y2hlZCAgID0gICAtODc5MyAgICNUaGlzIGlzIG5vdCBhbiBlcnJvciBjb2RlIGJ1dCBpcyByZXR1cm5lZCBieQora0FUU1VJbnZhbGlkVGV4dFJhbmdlRXJyICAgID0gICAtODc5MiAgICNBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24KK2tBVFNVSW52YWxpZFN0eWxlRXJyICAgID0gICAtODc5MSAgICNBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHVzZSBhIEFUU1VTdHlsZSB3aGljaAora0FUU1VJbnZhbGlkVGV4dExheW91dEVyciAgID0gICAtODc5MCAgICNBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHVzZSBhIEFUU1VUZXh0TGF5b3V0CitrVEVDT3V0cHV0QnVmZmVyRnVsbFN0YXR1cyAgPSAgIC04Nzg1ICAgI291dHB1dCBidWZmZXIgaGFzIG5vIHJvb20gZm9yIGNvbnZlcnNpb24gb2YgbmV4dCBpbnB1dCB0ZXh0IGVsZW1lbnQgKHBhcnRpYWwgY29udmVyc2lvbikKK2tURUNOZWVkRmx1c2hTdGF0dXMgPSAgIC04Nzg0ICAgI2tURUNOZWVkRmx1c2hTdGF0dXMKK2tURUNVc2VkRmFsbGJhY2tzU3RhdHVzID0gICAtODc4MyAgICNrVEVDVXNlZEZhbGxiYWNrc1N0YXR1cwora1RFQ0l0ZW1VbmF2YWlsYWJsZUVyciAgPSAgIC04NzcxICAgI2l0ZW0gKGUuZy4gbmFtZSkgbm90IGF2YWlsYWJsZSBmb3Igc3BlY2lmaWVkIHJlZ2lvbiAoJiBlbmNvZGluZyBpZiByZWxldmFudCkKK2tURUNHbG9iYWxzVW5hdmFpbGFibGVFcnIgICA9ICAgLTg3NzAgICAjZ2xvYmFscyBoYXZlIGFscmVhZHkgYmVlbiBkZWFsbG9jYXRlZCAocHJlbWF0dXJlIFRFUk0pCit1bmljb2RlQ2hlY2tzdW1FcnIgID0gICAtODc2OSAgICN1bmljb2RlQ2hlY2tzdW1FcnIKK3VuaWNvZGVOb1RhYmxlRXJyICAgPSAgIC04NzY4ICAgI3VuaWNvZGVOb1RhYmxlRXJyCit1bmljb2RlVmFyaWFudEVyciAgID0gICAtODc2NyAgICN1bmljb2RlVmFyaWFudEVycgordW5pY29kZUZhbGxiYWNrc0VyciA9ICAgLTg3NjYgICAjdW5pY29kZUZhbGxiYWNrc0VycgordW5pY29kZVBhcnRDb252ZXJ0RXJyICAgPSAgIC04NzY1ICAgI3VuaWNvZGVQYXJ0Q29udmVydEVycgordW5pY29kZUJ1ZkVyciAgID0gICAtODc2NCAgICN1bmljb2RlQnVmRXJyCit1bmljb2RlQ2hhckVyciAgPSAgIC04NzYzICAgI3VuaWNvZGVDaGFyRXJyCit1bmljb2RlRWxlbWVudEVyciAgID0gICAtODc2MiAgICN1bmljb2RlRWxlbWVudEVycgordW5pY29kZU5vdEZvdW5kRXJyICA9ICAgLTg3NjEgICAjdW5pY29kZU5vdEZvdW5kRXJyCit1bmljb2RlVGFibGVGb3JtYXRFcnIgICA9ICAgLTg3NjAgICAjdW5pY29kZVRhYmxlRm9ybWF0RXJyCit1bmljb2RlRGlyZWN0aW9uRXJyID0gICAtODc1OSAgICN1bmljb2RlRGlyZWN0aW9uRXJyCit1bmljb2RlQ29udGV4dHVhbEVyciAgICA9ICAgLTg3NTggICAjdW5pY29kZUNvbnRleHR1YWxFcnIKK3VuaWNvZGVUZXh0RW5jb2RpbmdEYXRhRXJyICA9ICAgLTg3NTcgICAjdW5pY29kZVRleHRFbmNvZGluZ0RhdGFFcnIKK2tURUNEaXJlY3Rpb25FcnIgICAgPSAgIC04NzU2ICAgI2RpcmVjdGlvbiBzdGFjayBvdmVyZmxvdywgZXRjLgora1RFQ0luY29tcGxldGVFbGVtZW50RXJyICAgID0gICAtODc1NSAgICN0ZXh0IGVsZW1lbnQgbWF5IGJlIGluY29tcGxldGUgb3IgaXMgdG9vIGxvbmcgZm9yIGludGVybmFsIGJ1ZmZlcnMKK2tURUNVbm1hcHBhYmxlRWxlbWVudEVyciAgICA9ICAgLTg3NTQgICAja1RFQ1VubWFwcGFibGVFbGVtZW50RXJyCitrVEVDUGFydGlhbENoYXJFcnIgID0gICAtODc1MyAgICNpbnB1dCBidWZmZXIgZW5kcyBpbiB0aGUgbWlkZGxlIG9mIGEgbXVsdGlieXRlIGNoYXJhY3RlciwgY29udmVyc2lvbiBzdG9wcGVkCitrVEVDQmFkVGV4dFJ1bkVyciAgID0gICAtODc1MiAgICNrVEVDQmFkVGV4dFJ1bkVycgora1RFQ0FycmF5RnVsbEVyciAgICA9ICAgLTg3NTEgICAjc3VwcGxpZWQgbmFtZSBidWZmZXIgb3IgVGV4dFJ1biwgVGV4dEVuY29kaW5nLCBvciBVbmljb2RlTWFwcGluZyBhcnJheSBpcyB0b28gc21hbGwKK2tURUNCdWZmZXJCZWxvd01pbmltdW1TaXplRXJyICAgPSAgIC04NzUwICAgI291dHB1dCBidWZmZXIgdG9vIHNtYWxsIHRvIGFsbG93IHByb2Nlc3Npbmcgb2YgZmlyc3QgaW5wdXQgdGV4dCBlbGVtZW50CitrVEVDTm9Db252ZXJzaW9uUGF0aEVyciA9ICAgLTg3NDkgICAja1RFQ05vQ29udmVyc2lvblBhdGhFcnIKK2tURUNDb3JydXB0Q29udmVydGVyRXJyID0gICAtODc0OCAgICNpbnZhbGlkIGNvbnZlcnRlciBvYmplY3QgcmVmZXJlbmNlCitrVEVDVGFibGVGb3JtYXRFcnIgID0gICAtODc0NyAgICNrVEVDVGFibGVGb3JtYXRFcnIKK2tURUNUYWJsZUNoZWNrc3VtRXJyICAgID0gICAtODc0NiAgICNrVEVDVGFibGVDaGVja3N1bUVycgora1RFQ01pc3NpbmdUYWJsZUVyciA9ICAgLTg3NDUgICAja1RFQ01pc3NpbmdUYWJsZUVycgora1RleHRVbmRlZmluZWRFbGVtZW50RXJyICAgID0gICAtODc0MCAgICN0ZXh0IGNvbnZlcnNpb24gZXJyb3JzCitrVGV4dE1hbGZvcm1lZElucHV0RXJyICA9ICAgLTg3MzkgICAjaW4gREJDUywgZm9yIGV4YW1wbGUsIGhpZ2ggYnl0ZSBmb2xsb3dlZCBieSBpbnZhbGlkIGxvdyBieXRlCitrVGV4dFVuc3VwcG9ydGVkRW5jb2RpbmdFcnIgPSAgIC04NzM4ICAgI3NwZWNpZmllZCBlbmNvZGluZyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIG9wZXJhdGlvbgora1JBTm90RW5hYmxlZCAgID0gICAtNzEzOSAgICNrUkFOb3RFbmFibGVkCitrUkFDYWxsQmFja0ZhaWxlZCAgID0gICAtNzEzOCAgICNrUkFDYWxsQmFja0ZhaWxlZAora1JBRHVwbGljYXRlSVBBZGRyICA9ICAgLTcxMzcgICAja1JBRHVwbGljYXRlSVBBZGRyCitrUkFOQ1BSZWplY3RlZGJ5UGVlciAgICA9ICAgLTcxMzYgICAja1JBTkNQUmVqZWN0ZWRieVBlZXIKK2tSQUV4dEF1dGhlbnRpY2F0aW9uRmFpbGVkICA9ICAgLTcxMzUgICAja1JBRXh0QXV0aGVudGljYXRpb25GYWlsZWQKK2tSQUFUYWxrSW5hY3RpdmUgICAgPSAgIC03MTM0ICAgI2tSQUFUYWxrSW5hY3RpdmUKK2tSQVBlZXJOb3RSZXNwb25kaW5nICAgID0gICAtNzEzMyAgICNrUkFQZWVyTm90UmVzcG9uZGluZwora1JBUFBQUGVlckRpc2Nvbm5lY3RlZCAgPSAgIC03MTMyICAgI2tSQVBQUFBlZXJEaXNjb25uZWN0ZWQKK2tSQVBQUFVzZXJEaXNjb25uZWN0ZWQgID0gICAtNzEzMSAgICNrUkFQUFBVc2VyRGlzY29ubmVjdGVkCitrUkFQUFBOZWdvdGlhdGlvbkZhaWxlZCA9ICAgLTcxMzAgICAja1JBUFBQTmVnb3RpYXRpb25GYWlsZWQKK2tSQVBQUEF1dGhlbnRpY2F0aW9uRmFpbGVkICA9ICAgLTcxMjkgICAja1JBUFBQQXV0aGVudGljYXRpb25GYWlsZWQKK2tSQVBQUFByb3RvY29sUmVqZWN0ZWQgID0gICAtNzEyOCAgICNrUkFQUFBQcm90b2NvbFJlamVjdGVkCitkY21CdWZmZXJPdmVyZmxvd0VyciAgICA9ICAgLTcxMjcgICAjZGF0YSBpcyBsYXJnZXIgdGhhbiBidWZmZXIgc2l6ZQora1JBTm90UHJpbWFyeUludGVyZmFjZSAgPSAgIC03MTI2ICAgI3doZW4gSVBDUCBpcyBub3QgcHJpbWFyeSBUQ1AvSVAgaW50Zi4KK2tSQVRDUElQTm90Q29uZmlndXJlZCAgID0gICAtNzEyNSAgICNUQ1AvSVAgbm90IGNvbmZpZ3VyZWQsIGNvdWxkIGJlIGxvYWRlZAora1JBVENQSVBJbmFjdGl2ZSAgICA9ICAgLTcxMjQgICAjVENQL0lQIGluYWN0aXZlLCBjYW5ub3QgYmUgbG9hZGVkCitrUkFSZW1vdGVBY2Nlc3NOb3RSZWFkeSA9ICAgLTcxMjMgICAja1JBUmVtb3RlQWNjZXNzTm90UmVhZHkKK2tSQUluaXRPcGVuVHJhbnNwb3J0RmFpbGVkICA9ICAgLTcxMjIgICAja1JBSW5pdE9wZW5UcmFuc3BvcnRGYWlsZWQKK2RjbVByb3RlY3RlZEVyciA9ICAgLTcxMjEgICAjbmVlZCBrZXl3b3JkIHRvIHVzZSBkaWN0aW9uYXJ5CitrUkFVc2VyUHdkRW50cnlSZXF1aXJlZCA9ICAgLTcxMjAgICAja1JBVXNlclB3ZEVudHJ5UmVxdWlyZWQKK2tSQVVzZXJQd2RDaGFuZ2VSZXF1aXJlZCAgICA9ICAgLTcxMTkgICAja1JBVXNlclB3ZENoYW5nZVJlcXVpcmVkCitkY21CYWRGaW5kTWV0aG9kRXJyID0gICAtNzExOCAgICNubyBzdWNoIGZpbmQgbWV0aG9kIHN1cHBvcnRlZAora1JBSW52YWxpZFNlcmlhbFByb3RvY29sICAgID0gICAtNzExNyAgICNrUkFJbnZhbGlkU2VyaWFsUHJvdG9jb2wKK2tSQUludmFsaWRQb3J0U3RhdGUgPSAgIC03MTE2ICAgI2tSQUludmFsaWRQb3J0U3RhdGUKK2RjbUJhZEtleUVyciAgICA9ICAgLTcxMTUgICAjYmFkIGtleSBpbmZvcm1hdGlvbgora1JBUG9ydEJ1c3kgPSAgIC03MTE0ICAgI2tSQVBvcnRCdXN5CitrUkFJbnN0YWxsYXRpb25EYW1hZ2VkICA9ICAgLTcxMTMgICAja1JBSW5zdGFsbGF0aW9uRGFtYWdlZAorZGNtQmFkRmllbGRUeXBlRXJyICA9ICAgLTcxMTIgICAjbm8gc3VjaCBmaWVsZCB0eXBlIHN1cHBvcnRlZAorZGNtQmFkRmllbGRJbmZvRXJyICA9ICAgLTcxMTEgICAjaW5jb21wbGV0ZSBpbmZvcm1hdGlvbgorZGNtTmVjZXNzYXJ5RmllbGRFcnIgICAgPSAgIC03MTEwICAgI2xhY2sgcmVxdWlyZWQvaWRlbnRpZnkgZmllbGQKK2RjbUR1cFJlY29yZEVyciA9ICAgLTcxMDkgICAjc2FtZSByZWNvcmQgYWxyZWFkeSBleGlzdAora1JBTm90Q29ubmVjdGVkID0gICAtNzEwOCAgICNrUkFOb3RDb25uZWN0ZWQKK2RjbUJsb2NrRnVsbEVyciA9ICAgLTcxMDcgICAjZGljdGlvbmFyeSBibG9jayBmdWxsCitrUkFNaXNzaW5nUmVzb3VyY2VzID0gICAtNzEwNiAgICNrUkFNaXNzaW5nUmVzb3VyY2VzCitkY21EaWN0aW9uYXJ5QnVzeUVyciAgICA9ICAgLTcxMDUgICAjZGljdGlvbmFyeSBpcyBidXN5CitkY21EaWN0aW9uYXJ5Tm90T3BlbkVyciA9ICAgLTcxMDQgICAjZGljdGlvbmFyeSBub3Qgb3BlbmVkCitkY21QZXJtaXNzaW9uRXJyICAgID0gICAtNzEwMyAgICNpbnZhbGlkIHBlcm1pc3Npb24KK2RjbUJhZERpY3Rpb25hcnlFcnIgPSAgIC03MTAyICAgI2ludmFsaWQgZGljdGlvbmFyeQorZGNtTm90RGljdGlvbmFyeUVyciA9ICAgLTcxMDEgICAjbm90IGRpY3Rpb25hcnkKK2tSQUludmFsaWRQYXJhbWV0ZXIgPSAgIC03MTAwICAgI2tSQUludmFsaWRQYXJhbWV0ZXIKK2xhRW5naW5lTm90Rm91bmRFcnIgPSAgIC03MDAwICAgI2Nhbid0IGZpbmQgdGhlIGVuZ2luZQorbGFQcm9wZXJ0eUVyciAgID0gICAtNjk5OSAgICNFcnJvciBpbiBwcm9wZXJ0aWVzCitrVVNCVW5rbm93bkRldmljZUVyciAgICA9ICAgLTY5OTggICAjZGV2aWNlIHJlZiBub3QgcmVjb2duaXNlZAorbGFQcm9wZXJ0eUlzUmVhZE9ubHlFcnIgPSAgIC02OTk3ICAgI3RoZSBwcm9wZXJ0eSBpcyByZWFkIG9ubHkKK2xhUHJvcGVydHlVbmtub3duRXJyICAgID0gICAtNjk5NiAgICN0aGUgcHJvcGVydHkgaXMgdW5rbm93biB0byB0aGlzIGVudmlyb25tZW50CitsYVByb3BlcnR5VmFsdWVFcnIgID0gICAtNjk5NSAgICNJbnZhbGlkIHByb3BlcnR5IHZhbHVlCitsYURpY3Rpb25hcnlUb29NYW55RXJyICA9ICAgLTY5OTQgICAjdG9vIG1hbnkgZGljdGlvbmFyaWVzCitsYURpY3Rpb25hcnlVbmtub3duRXJyICA9ICAgLTY5OTMgICAjY2FuJ3QgdXNlIHRoaXMgZGljdGlvbmFyeSB3aXRoIHRoaXMgZW52aXJvbm1lbnQKK2xhRGljdGlvbmFyeU5vdE9wZW5lZEVyciAgICA9ICAgLTY5OTIgICAjdGhlIGRpY3Rpb25hcnkgaXMgbm90IG9wZW5lZAorbGFUZXh0T3ZlckZsb3dFcnIgICA9ICAgLTY5OTEgICAjdGV4dCBpcyB0b28gbG9uZworbGFGYWlsQW5hbHlzaXNFcnIgICA9ICAgLTY5OTAgICAjYW5hbHlzaXMgZmFpbGVkCitsYU5vTW9yZU1vcnBoZW1lRXJyID0gICAtNjk4OSAgICNub3RoaW5nIHRvIHJlYWQKK2xhSW52YWxpZFBhdGhFcnIgICAgPSAgIC02OTg4ICAgI3BhdGggaXMgbm90IGNvcnJlY3QKK2tVU0JOb3RIYW5kbGVkICA9ICAgLTY5ODcgICAjTm90aWZpY2F0aW9uIHdhcyBub3QgaGFuZGxlZCAgIChzYW1lIGFzIE5vdEZvdW5kKQorbGFFbnZpcm9ubWVudE5vdEZvdW5kRXJyICAgID0gICAtNjk4NiAgICNjYW4ndCBmaW50IHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQKK2xhRW52aXJvbm1lbnRCdXN5RXJyICAgID0gICAtNjk4NSAgICNzcGVjaWZpZWQgZW52aXJvbm1lbnQgaXMgdXNlZAorbGFUb29TbWFsbEJ1ZmZlckVyciA9ICAgLTY5ODQgICAjb3V0cHV0IGJ1ZmZlciBpcyB0b28gc21hbGwgdG8gc3RvcmUgYW55IHJlc3VsdAora1VTQkZsYWdzRXJyb3IgID0gICAtNjk4MyAgICNVbnVzZWQgZmxhZ3Mgbm90IHplcm9lZAora1VTQkFib3J0ZWRFcnJvciAgICA9ICAgLTY5ODIgICAjUGlwZSBhYm9ydGVkCitrVVNCTm9CYW5kd2lkdGhFcnJvciAgICA9ICAgLTY5ODEgICAjTm90IGVub3VnaCBiYW5kd2lkdGggYXZhaWxhYmxlCitrVVNCUGlwZUlkbGVFcnJvciAgID0gICAtNjk4MCAgICNQaXBlIGlzIElkbGUsIGl0IHdpbGwgbm90IGFjY2VwdCB0cmFuc2FjdGlvbnMKK2tVU0JQaXBlU3RhbGxlZEVycm9yICAgID0gICAtNjk3OSAgICNQaXBlIGhhcyBzdGFsbGVkLCBlcnJvciBuZWVkcyB0byBiZSBjbGVhcmVkCitrVVNCVW5rbm93bkludGVyZmFjZUVyciA9ICAgLTY5NzggICAjSW50ZXJmYWNlIHJlZiBub3QgcmVjb2duaXNlZAora1VTQkRldmljZUJ1c3kgID0gICAtNjk3NyAgICNEZXZpY2UgaXMgYWxyZWFkeSBiZWluZyBjb25maWd1cmVkCitrVVNCRGV2aWNlUG93ZXJQcm9ibGVtICA9ICAgLTY5NzYgICAjRGV2aWNlIGhhcyBhIHBvd2VyIHByb2JsZW0KK2tVU0JJbnZhbGlkQnVmZmVyICAgPSAgIC02OTc1ICAgI2JhZCBidWZmZXIsIHVzdWFsbHkgbmlsCitrVVNCRGV2aWNlU3VzcGVuZGVkID0gICAtNjk3NCAgICNEZXZpY2UgaXMgc3VzcGVuZGVkCitrVVNCRGV2aWNlTm90U3VzcGVuZGVkICA9ICAgLTY5NzMgICAjZGV2aWNlIGlzIG5vdCBzdXNwZW5kZWQgZm9yIHJlc3VtZQora1VTQkRldmljZURpc2Nvbm5lY3RlZCAgPSAgIC02OTcyICAgI0Rpc2Nvbm5lY3RlZCBkdXJpbmcgc3VzcGVuZCBvciByZXNldAora1VTQlRpbWVkT3V0ICAgID0gICAtNjk3MSAgICNUcmFuc2FjdGlvbiB0aW1lZCBvdXQuCitrVVNCUXVldWVBYm9ydGVkICAgID0gICAtNjk3MCAgICNQaXBlIHplcm8gc3RhbGwgY2xlYXJlZC4KK2tVU0JQb3J0RGlzYWJsZWQgICAgPSAgIC02OTY5ICAgI1RoZSBwb3J0IHlvdSBhcmUgYXR0YWNoZWQgdG8gaXMgZGlzYWJsZWQsIHVzZSBVU0JEZXZpY2VSZXNldC4KK2tVU0JCYWREaXNwYXRjaFRhYmxlICAgID0gICAtNjk1MCAgICNJbXByb3BlciBkcml2ZXIgZGlzcGF0Y2ggdGFibGUKK2tVU0JVbmtub3duTm90aWZpY2F0aW9uID0gICAtNjk0OSAgICNOb3RpZmljYXRpb24gdHlwZSBub3QgZGVmaW5lZAora1VTQlF1ZXVlRnVsbCAgID0gICAtNjk0OCAgICNJbnRlcm5hbCBxdWV1ZSBtYXh4ZWQKK2tVU0JMaW5rRXJyID0gICAtNjkxNiAgICNrVVNCTGlua0Vycgora1VTQkNSQ0VyciAgPSAgIC02OTE1ICAgI1BpcGUgc3RhbGwsIGJhZCBDUkMKK2tVU0JCaXRzdHVmRXJyICA9ICAgLTY5MTQgICAjUGlwZSBzdGFsbCwgYml0c3R1ZmZpbmcKK2tVU0JEYXRhVG9nZ2xlRXJyICAgPSAgIC02OTEzICAgI1BpcGUgc3RhbGwsIEJhZCBkYXRhIHRvZ2dsZQora1VTQkVuZHBvaW50U3RhbGxFcnIgICAgPSAgIC02OTEyICAgI0RldmljZSBkaWRuJ3QgdW5kZXJzdGFuZAora1VTQk5vdFJlc3BvbmRpbmdFcnIgICAgPSAgIC02OTExICAgI1BpcGUgc3RhbGwsIE5vIGRldmljZSwgZGV2aWNlIGh1bmcKK2tVU0JQSURDaGVja0VyciA9ICAgLTY5MTAgICAjUGlwZSBzdGFsbCwgUElEIENSQyBlcnJvcgora1VTQldyb25nUElERXJyID0gICAtNjkwOSAgICNQaXBlIHN0YWxsLCBCYWQgb3Igd3JvbmcgUElECitrVVNCT3ZlclJ1bkVyciAgPSAgIC02OTA4ICAgI1BhY2tldCB0b28gbGFyZ2Ugb3IgbW9yZSBkYXRhIHRoYW4gYnVmZmVyCitrVVNCVW5kZXJSdW5FcnIgPSAgIC02OTA3ICAgI0xlc3MgZGF0YSB0aGFuIGJ1ZmZlcgora1VTQlJlczFFcnIgPSAgIC02OTA2ICAgI2tVU0JSZXMxRXJyCitrVVNCUmVzMkVyciA9ICAgLTY5MDUgICAja1VTQlJlczJFcnIKK2tVU0JCdWZPdnJSdW5FcnIgICAgPSAgIC02OTA0ICAgI0hvc3QgaGFyZHdhcmUgZmFpbHVyZSBvbiBkYXRhIGluLCBQQ0kgYnVzeT8KK2tVU0JCdWZVbmRlclJ1bkVyciAgPSAgIC02OTAzICAgI0hvc3QgaGFyZHdhcmUgZmFpbHVyZSBvbiBkYXRhIG91dCwgUENJIGJ1c3k/CitrVVNCTm90U2VudDFFcnIgPSAgIC02OTAyICAgI1RyYW5zYWN0aW9uIG5vdCBzZW50CitrVVNCTm90U2VudDJFcnIgPSAgIC02OTAxICAgI1RyYW5zYWN0aW9uIG5vdCBzZW50CitrRE1Gb3VuZEVyciA9ICAgLTYyMzIgICAjRGlkIG5vdCBwcm9jZWVkIGJlY2F1c2Ugd2UgZm91bmQgYW4gaXRlbQora0RNTWFpbkRpc3BsYXlDYW5ub3RNb3ZlRXJyID0gICAtNjIzMSAgICNUcnlpbmcgdG8gbW92ZSBtYWluIGRpc3BsYXkgKG9yIGEgZGlzcGxheSBtaXJyb3JlZCB0byBpdCkKK2tETURpc3BsYXlBbHJlYWR5SW5zdGFsbGVkRXJyICAgPSAgIC02MjMwICAgI0F0dGVtcHQgdG8gYWRkIGFuIGFscmVhZHkgaW5zdGFsbGVkIGRpc3BsYXkuCitrRE1EaXNwbGF5Tm90Rm91bmRFcnIgICA9ICAgLTYyMjkgICAjQ291bGQgbm90IGZpbmQgaXRlbSAod2lsbCBzb21lZGF5IHJlbW92ZSkuCitrRE1Ecml2ZXJOb3REaXNwbGF5TWdyQXdhcmVFcnIgID0gICAtNjIyOCAgICNWaWRlbyBEcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBkaXNwbGF5IG1hbmFnZXIuCitrRE1TV05vdEluaXRpYWxpemVkRXJyICA9ICAgLTYyMjcgICAjUmVxdWlyZWQgc29mdHdhcmUgbm90IGluaXRpYWxpemVkIChlZyB3aW5kb3dtYW5hZ2VyIG9yIGRpc3BsYXkgbWdyKS4KK2tTeXNTV1Rvb09sZCAgICA9ICAgLTYyMjYgICAjTWlzc2luZyBjcml0aWNhbCBwaWVjZXMgb2YgU3lzdGVtIFNvZnR3YXJlLgora0RNTWlycm9yaW5nTm90T24gICA9ICAgLTYyMjUgICAjUmV0dXJuZWQgYnkgYWxsIGNhbGxzIHRoYXQgbmVlZCBtaXJyb3JpbmcgdG8gYmUgb24gdG8gZG8gdGhlaXIgdGhpbmcuCitrRE1DYW50QmxvY2sgICAgPSAgIC02MjI0ICAgI01pcnJvcmluZyBpcyBhbHJlYWR5IG9uLCBjYW7VdCBCbG9jayBub3cgKGNhbGwgRE1Vbk1pcnJvcigpIGZpcnN0KS4KK2tETU1pcnJvcmluZ0Jsb2NrZWQgPSAgIC02MjIzICAgI0RNQmxvY2tNaXJyb3JpbmcoKSBoYXMgYmVlbiBjYWxsZWQuCitrRE1Xcm9uZ051bWJlck9mRGlzcGxheXMgICAgPSAgIC02MjIyICAgI0NhbiBvbmx5IGhhbmRsZSAyIGRpc3BsYXlzIGZvciBub3cuCitrRE1NaXJyb3JpbmdPbkFscmVhZHkgICA9ICAgLTYyMjEgICAjUmV0dXJuZWQgYnkgYWxsIGNhbGxzIHRoYXQgbmVlZCBtaXJyb3JpbmcgdG8gYmUgb2ZmIHRvIGRvIHRoZWlyIHRoaW5nLgora0RNR2VuRXJyICAgPSAgIC02MjIwICAgI1VuZXhwZWN0ZWQgRXJyb3IKK2tRVFNTVW5rbm93bkVyciA9ICAgLTYxNTAgICAja1FUU1NVbmtub3duRXJyCitjb2xsZWN0aW9uVmVyc2lvbkVyciAgICA9ICAgLTU3NTMgICAjY29sbGVjdGlvblZlcnNpb25FcnIKK2NvbGxlY3Rpb25JbmRleFJhbmdlRXJyID0gICAtNTc1MiAgICNjb2xsZWN0aW9uSW5kZXhSYW5nZUVycgorY29sbGVjdGlvbkl0ZW1Ob3RGb3VuZEVyciAgID0gICAtNTc1MSAgICNjb2xsZWN0aW9uSXRlbU5vdEZvdW5kRXJyCitjb2xsZWN0aW9uSXRlbUxvY2tlZEVyciA9ICAgLTU3NTAgICAjY29sbGVjdGlvbkl0ZW1Mb2NrZWRFcnIKK2tOYXZNaXNzaW5nS2luZFN0cmluZ0VyciAgICA9ICAgLTU2OTkgICAja05hdk1pc3NpbmdLaW5kU3RyaW5nRXJyCitrTmF2SW52YWxpZEN1c3RvbUNvbnRyb2xNZXNzYWdlRXJyICA9ICAgLTU2OTggICAja05hdkludmFsaWRDdXN0b21Db250cm9sTWVzc2FnZUVycgora05hdkN1c3RvbUNvbnRyb2xNZXNzYWdlRmFpbGVkRXJyICAgPSAgIC01Njk3ICAgI2tOYXZDdXN0b21Db250cm9sTWVzc2FnZUZhaWxlZEVycgora05hdkludmFsaWRTeXN0ZW1Db25maWdFcnIgID0gICAtNTY5NiAgICNrTmF2SW52YWxpZFN5c3RlbUNvbmZpZ0Vycgora05hdldyb25nRGlhbG9nQ2xhc3NFcnIgPSAgIC01Njk1ICAgI2tOYXZXcm9uZ0RpYWxvZ0NsYXNzRXJyCitrTmF2V3JvbmdEaWFsb2dTdGF0ZUVyciA9ICAgLTU2OTQgICAja05hdldyb25nRGlhbG9nU3RhdGVFcnIKK2RpYWxvZ05vVGltZW91dEVyciAgPSAgIC01NjQwICAgI2RpYWxvZ05vVGltZW91dEVycgorbWVudUludmFsaWRFcnIgID0gICAtNTYyMyAgICNtZW51IGlzIGludmFsaWQKK21lbnVJdGVtTm90Rm91bmRFcnIgPSAgIC01NjIyICAgI3NwZWNpZmllZCBtZW51IGl0ZW0gd2Fzbid0IGZvdW5kCittZW51VXNlc1N5c3RlbURlZkVyciAgICA9ICAgLTU2MjEgICAjR2V0TWVudURlZmluaXRpb24gZmFpbGVkIGJlY2F1c2UgdGhlIG1lbnUgdXNlcyB0aGUgc3lzdGVtIE1ERUYKK21lbnVOb3RGb3VuZEVyciA9ICAgLTU2MjAgICAjc3BlY2lmaWVkIG1lbnUgb3IgbWVudSBJRCB3YXNuJ3QgZm91bmQKK3dpbmRvd1dyb25nU3RhdGVFcnIgPSAgIC01NjE1ICAgI3dpbmRvdyBpcyBub3QgaW4gYSBzdGF0ZSB0aGF0IGlzIHZhbGlkIGZvciB0aGUgY3VycmVudCBhY3Rpb24KK3dpbmRvd01hbmFnZXJJbnRlcm5hbEVyciAgICA9ICAgLTU2MTQgICAjc29tZXRoaW5nIHJlYWxseSB3ZWlyZCBoYXBwZW5lZCBpbnNpZGUgdGhlIHdpbmRvdyBtYW5hZ2VyCit3aW5kb3dBdHRyaWJ1dGVzQ29uZmxpY3RFcnIgPSAgIC01NjEzICAgI3Bhc3NlZCBzb21lIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCit3aW5kb3dBdHRyaWJ1dGVJbW11dGFibGVFcnIgPSAgIC01NjEyICAgI3RyaWVkIHRvIGNoYW5nZSBhdHRyaWJ1dGVzIHdoaWNoIGNhbid0IGJlIGNoYW5nZWQKK2VycldpbmRvd0RvZXNOb3RGaXRPbnNjcmVlbiA9ICAgLTU2MTEgICAjQ29uc3RyYWluV2luZG93VG9TY3JlZW4gY291bGQgbm90IG1ha2UgdGhlIHdpbmRvdyBmaXQgb25zY3JlZW4KK2VycldpbmRvd05vdEZvdW5kICAgPSAgIC01NjEwICAgI3JldHVybmVkIGZyb20gRmluZFdpbmRvd09mQ2xhc3MKK2VyckZsb2F0aW5nV2luZG93c05vdEluaXRpYWxpemVkICAgID0gICAtNTYwOSAgICNjYWxsZWQgSGlkZUZsb2F0aW5nV2luZG93cyBvciBTaG93RmxvYXRpbmdXaW5kb3dzIHdpdGhvdXQgY2FsbGluZyBJbml0RmxvYXRpbmdXaW5kb3dzCitlcnJXaW5kb3dzQWxyZWFkeUluaXRpYWxpemVkICAgID0gICAtNTYwOCAgICN0cmllZCB0byBjYWxsIEluaXRGbG9hdGluZ1dpbmRvd3MgdHdpY2UsIG9yIGNhbGxlZCBJbml0V2luZG93cyBhbmQgdGhlbiBmbG9hdGluZyB3aW5kb3dzCitlcnJVc2VyV2FudHNUb0RyYWdXaW5kb3cgICAgPSAgIC01NjA3ICAgI2lmIHJldHVybmVkIGZyb20gVHJhY2tXaW5kb3dQcm94eURyYWcsIHlvdSBzaG91bGQgY2FsbCBEcmFnV2luZG93IG9uIHRoZSB3aW5kb3cKK2VyckNvcnJ1cHRXaW5kb3dEZXNjcmlwdGlvbiA9ICAgLTU2MDYgICAjdHJpZWQgdG8gbG9hZCBhIGNvcnJ1cHQgd2luZG93IGRlc2NyaXB0aW9uIChzaXplIG9yIHZlcnNpb24gZmllbGRzIGluY29ycmVjdCkKK2VyclVucmVjb2duaXplZFdpbmRvd0NsYXNzICA9ICAgLTU2MDUgICAjdHJpZWQgdG8gY3JlYXRlIGEgd2luZG93IHdpdGggYSBiYWQgV2luZG93Q2xhc3MKK2VycldpbmRvd1Byb3BlcnR5Tm90Rm91bmQgICA9ICAgLTU2MDQgICAjdHJpZWQgdG8gZ2V0IGEgbm9uZXhpc3RlbnQgcHJvcGVydHkKK2VyckludmFsaWRXaW5kb3dQcm9wZXJ0eSAgICA9ICAgLTU2MDMgICAjdHJpZWQgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGFnIHdpdGggcHJpdmF0ZSBjcmVhdG9yCitlcnJXaW5kb3dEb2VzTm90SGF2ZVByb3h5ICAgPSAgIC01NjAyICAgI3RyaWVkIHRvIGRvIHNvbWV0aGluZyByZXF1aXJpbmcgYSBwcm94eSB0byBhIHdpbmRvdyB3aGljaCBkb2VzbtV0IGhhdmUgYSBwcm94eQorZXJyVW5zdXBwb3J0ZWRXaW5kb3dBdHRyaWJ1dGVzRm9yQ2xhc3MgID0gICAtNTYwMSAgICN0cmllZCB0byBjcmVhdGUgYSB3aW5kb3cgd2l0aCBXaW5kb3dBdHRyaWJ1dGVzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFdpbmRvd0NsYXNzCitlcnJJbnZhbGlkV2luZG93UHRyID0gICAtNTYwMCAgICN0cmllZCB0byBwYXNzIGEgYmFkIFdpbmRvd1JlZiBhcmd1bWVudAorZ2VzdGFsdExvY2F0aW9uRXJyICA9ICAgLTU1NTMgICAjZ2VzdGFsdCBmdW5jdGlvbiBwdHIgd2Fzbid0IGluIHN5c2hlYXAKK2dlc3RhbHREdXBTZWxlY3RvckVyciAgID0gICAtNTU1MiAgICN0cmllZCB0byBhZGQgYW4gZW50cnkgdGhhdCBhbHJlYWR5IGV4aXN0ZWQKK2dlc3RhbHRVbmRlZlNlbGVjdG9yRXJyID0gICAtNTU1MSAgICN1bmRlZmluZWQgc2VsZWN0b3Igd2FzIHBhc3NlZCB0byBHZXN0YWx0CitnZXN0YWx0VW5rbm93bkVyciAgID0gICAtNTU1MCAgICN2YWx1ZSByZXR1cm5lZCBpZiBHZXN0YWx0IGRvZXNuJ3Qga25vdyB0aGUgYW5zd2VyCitlbnZWZXJzVG9vQmlnICAgPSAgIC01NTAyICAgI1ZlcnNpb24gYmlnZ2VyIHRoYW4gY2FsbCBjYW4gaGFuZGxlCitlbnZCYWRWZXJzICA9ICAgLTU1MDEgICAjVmVyc2lvbiBub24tcG9zaXRpdmUKK2Vudk5vdFByZXNlbnQgICA9ICAgLTU1MDAgICAjcmV0dXJuZWQgYnkgZ2x1ZS4KK3F0c0FkZHJlc3NCdXN5RXJyICAgPSAgIC01NDIxICAgI3F0c0FkZHJlc3NCdXN5RXJyCitxdHNDb25uZWN0aW9uRmFpbGVkRXJyICA9ICAgLTU0MjAgICAjcXRzQ29ubmVjdGlvbkZhaWxlZEVycgorcXRzVGltZW91dEVyciAgID0gICAtNTQwOCAgICNxdHNUaW1lb3V0RXJyCitxdHNVbmtub3duVmFsdWVFcnIgID0gICAtNTQwNyAgICNxdHNVbmtub3duVmFsdWVFcnIKK3F0c1Rvb011Y2hEYXRhRXJyICAgPSAgIC01NDA2ICAgI3F0c1Rvb011Y2hEYXRhRXJyCitxdHNVbnN1cHBvcnRlZEZlYXR1cmVFcnIgICAgPSAgIC01NDA1ICAgI3F0c1Vuc3VwcG9ydGVkRmVhdHVyZUVycgorcXRzVW5zdXBwb3J0ZWRSYXRlRXJyICAgPSAgIC01NDA0ICAgI3F0c1Vuc3VwcG9ydGVkUmF0ZUVycgorcXRzVW5zdXBwb3J0ZWREYXRhVHlwZUVyciAgID0gICAtNTQwMyAgICNxdHNVbnN1cHBvcnRlZERhdGFUeXBlRXJyCitxdHNCYWREYXRhRXJyICAgPSAgIC01NDAyICAgI3NvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBkYXRhCitxdHNCYWRTdGF0ZUVyciAgPSAgIC01NDAxICAgI3F0c0JhZFN0YXRlRXJyCitxdHNCYWRTZWxlY3RvckVyciAgID0gICAtNTQwMCAgICNxdHNCYWRTZWxlY3RvckVycgorZXJySUFFbmRPZlRleHRSdW4gICA9ICAgLTUzODggICAjZXJySUFFbmRPZlRleHRSdW4KK2VycklBVGV4dEV4dHJhY3Rpb25FcnIgID0gICAtNTM4NyAgICNlcnJJQVRleHRFeHRyYWN0aW9uRXJyCitlcnJJQUludmFsaWREb2N1bWVudCAgICA9ICAgLTUzODYgICAjZXJySUFJbnZhbGlkRG9jdW1lbnQKK2VycklBQ2FuY2VsZWQgICA9ICAgLTUzODUgICAjZXJySUFDYW5jZWxlZAorZXJySUFCdWZmZXJUb29TbWFsbCA9ICAgLTUzODQgICAjZXJySUFCdWZmZXJUb29TbWFsbAorZXJySUFOb01vcmVJdGVtcyAgICA9ICAgLTUzODMgICAjZXJySUFOb01vcmVJdGVtcworZXJySUFQYXJhbUVyciAgID0gICAtNTM4MiAgICNlcnJJQVBhcmFtRXJyCitlcnJJQUFsbG9jYXRpb25FcnIgID0gICAtNTM4MSAgICNlcnJJQUFsbG9jYXRpb25FcnIKK2VycklBVW5rbm93bkVyciA9ICAgLTUzODAgICAjZXJySUFVbmtub3duRXJyCitoclVSTE5vdEhhbmRsZWRFcnIgID0gICAtNTM2MyAgICNoclVSTE5vdEhhbmRsZWRFcnIKK2hyVW5hYmxlVG9SZXNpemVIYW5kbGVFcnIgICA9ICAgLTUzNjIgICAjaHJVbmFibGVUb1Jlc2l6ZUhhbmRsZUVycgoraHJNaXNjZWxsYW5lb3VzRXhjZXB0aW9uRXJyID0gICAtNTM2MSAgICNock1pc2NlbGxhbmVvdXNFeGNlcHRpb25FcnIKK2hySFRNTFJlbmRlcmluZ0xpYk5vdEluc3RhbGxlZEVyciAgID0gICAtNTM2MCAgICNockhUTUxSZW5kZXJpbmdMaWJOb3RJbnN0YWxsZWRFcnIKK2VyckNhbm5vdFVuZG8gICA9ICAgLTUyNTMgICAjZXJyQ2Fubm90VW5kbworZXJyTm9uQ29udGl1b3VzQXR0cmlidXRlICAgID0gICAtNTI1MiAgICNlcnJOb25Db250aXVvdXNBdHRyaWJ1dGUKK2VyclVua25vd25FbGVtZW50ICAgPSAgIC01MjUxICAgI2VyclVua25vd25FbGVtZW50CitlcnJSZWFkT25seVRleHQgPSAgIC01MjUwICAgI2VyclJlYWRPbmx5VGV4dAorZXJyRW1wdHlTY3JhcCAgID0gICAtNTI0OSAgICNlcnJFbXB0eVNjcmFwCitlcnJOb0hpbGl0ZVRleHQgPSAgIC01MjQ4ICAgI2Vyck5vSGlsaXRlVGV4dAorZXJyT2Zmc2V0Tm90T25FbGVtZW50Qm91bmRheSAgICA9ICAgLTUyNDcgICAjZXJyT2Zmc2V0Tm90T25FbGVtZW50Qm91bmRheQorZXJySW52YWxpZFJhbmdlID0gICAtNTI0NiAgICNlcnJJbnZhbGlkUmFuZ2UKK2Vyckl0ZXJhdG9yUmVhY2hlZEVuZCAgID0gICAtNTI0NSAgICNlcnJJdGVyYXRvclJlYWNoZWRFbmQKK2VyckVuZ2luZU5vdEZvdW5kICAgPSAgIC01MjQ0ICAgI2VyckVuZ2luZU5vdEZvdW5kCitlcnJBbHJlYWR5SW5JbWFnaW5nTW9kZSA9ICAgLTUyNDMgICAjZXJyQWxyZWFkeUluSW1hZ2luZ01vZGUKK2Vyck5vdEluSW1hZ2luZ01vZGUgPSAgIC01MjQyICAgI2Vyck5vdEluSW1hZ2luZ01vZGUKK2Vyck1hcmdpbldpbGxsTm90Rml0ICAgID0gICAtNTI0MSAgICNlcnJNYXJnaW5XaWxsbE5vdEZpdAorZXJyVW5rbm93bkF0dHJpYnV0ZVRhZyAgPSAgIC01MjQwICAgI2VyclVua25vd25BdHRyaWJ1dGVUYWcKK2FmcFNhbWVOb2RlRXJyICA9ICAgLTUwNjMgICAjQW4gQXR0ZW1wdCB3YXMgbWFkZSB0byBjb25uZWN0IHRvIGEgZmlsZSBzZXJ2ZXIgcnVubmluZyBvbiB0aGUgc2FtZSBtYWNoaW5lCithZnBBbHJlYWR5TW91bnRlZCAgID0gICAtNTA2MiAgICNUaGUgdm9sdW1lIGlzIGFscmVhZHkgbW91bnRlZAorYWZwQ2FudE1vdW50TW9yZVNydnJlICAgPSAgIC01MDYxICAgI1RoZSBNYXhpbXVtIG51bWJlciBvZiBzZXJ2ZXIgY29ubmVjdGlvbnMgaGFzIGJlZW4gcmVhY2hlZAorYWZwQmFkRGlySURUeXBlID0gICAtNTA2MCAgICNhZnBCYWREaXJJRFR5cGUKK2FmcENhbGxOb3RBbGxvd2VkICAgPSAgIC01MDQ4ICAgI1RoZSBzZXJ2ZXIga25vd3Mgd2hhdCB5b3Ugd2FudGVkIHRvIGRvLCBidXQgd29uJ3QgbGV0IHlvdSBkbyBpdCBqdXN0IG5vdworYWZwQWxyZWFkeUxvZ2dlZEluRXJyICAgPSAgIC01MDQ3ICAgI1VzZXIgaGFzIGJlZW4gYXV0aGVudGljYXRlZCBidXQgaXMgYWxyZWFkeSBsb2dnZWQgaW4gZnJvbSBhbm90aGVyIG1hY2hpbmUgKGFuZCB0aGF0J3Mgbm90IGFsbG93ZWQgb24gdGhpcyBzZXJ2ZXIpCithZnBQd2RQb2xpY3lFcnIgPSAgIC01MDQ2ICAgI1Bhc3N3b3JkIGRvZXMgbm90IGNvbmZvcm0gdG8gc2VydmVycyBwYXNzd29yZCBwb2xpY3kKK2FmcFB3ZE5lZWRzQ2hhbmdlRXJyICAgID0gICAtNTA0NSAgICNUaGUgcGFzc3dvcmQgbmVlZHMgdG8gYmUgY2hhbmdlZAorYWZwSW5zaWRlVHJhc2hFcnIgICA9ICAgLTUwNDQgICAjVGhlIGZvbGRlciBiZWluZyBzaGFyZWQgaXMgaW5zaWRlIHRoZSB0cmFzaCBmb2xkZXIgT1IgdGhlIHNoYXJlZCBmb2xkZXIgaXMgYmVpbmcgbW92ZWQgaW50byB0aGUgdHJhc2ggZm9sZGVyCithZnBJbnNpZGVTaGFyZWRFcnIgID0gICAtNTA0MyAgICNUaGUgZm9sZGVyIGJlaW5nIHNoYXJlZCBpcyBpbnNpZGUgYSBzaGFyZWQgZm9sZGVyIE9SIHRoZSBmb2xkZXIgY29udGFpbnMgYSBzaGFyZWQgZm9sZGVyIGFuZCBpcyBiZWluZyBtb3ZlZCBpbnRvIGEgc2hhcmVkIGZvbGRlcgorYWZwUHdkRXhwaXJlZEVyciAgICA9ICAgLTUwNDIgICAjVGhlIHBhc3N3b3JkIGJlaW5nIHVzZWQgaXMgdG9vIG9sZDogdGhpcyByZXF1aXJlcyB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHBhc3N3b3JkIGJlZm9yZSBsb2ctaW4gY2FuIGNvbnRpbnVlCithZnBQd2RUb29TaG9ydEVyciAgID0gICAtNTA0MSAgICNUaGUgcGFzc3dvcmQgYmVpbmcgc2V0IGlzIHRvbyBzaG9ydDogdGhlcmUgaXMgYSBtaW5pbXVtIGxlbmd0aCB0aGF0IG11c3QgYmUgbWV0IG9yIGV4Y2VlZGVkCithZnBQd2RTYW1lRXJyICAgPSAgIC01MDQwICAgI1NvbWVvbmUgdHJpZWQgdG8gY2hhbmdlIHRoZWlyIHBhc3N3b3JkIHRvIHRoZSBzYW1lIHBhc3N3b3JkIG9uIGEgbWFudGFkb3J5IHBhc3N3b3JkIGNoYW5nZQorYWZwQmFkSURFcnIgPSAgIC01MDM5ICAgI2FmcEJhZElERXJyCithZnBTYW1lT2JqZWN0RXJyICAgID0gICAtNTAzOCAgICNhZnBTYW1lT2JqZWN0RXJyCithZnBDYXRhbG9nQ2hhbmdlZCAgID0gICAtNTAzNyAgICNhZnBDYXRhbG9nQ2hhbmdlZAorYWZwRGlmZlZvbEVyciAgID0gICAtNTAzNiAgICNhZnBEaWZmVm9sRXJyCithZnBJREV4aXN0cyA9ICAgLTUwMzUgICAjYWZwSURFeGlzdHMKK2FmcElETm90Rm91bmQgICA9ICAgLTUwMzQgICAjYWZwSUROb3RGb3VuZAorYWZwQ29udGFpbnNTaGFyZWRFcnIgICAgPSAgIC01MDMzICAgI3RoZSBmb2xkZXIgYmVpbmcgc2hhcmVkIGNvbnRhaW5zIGEgc2hhcmVkIGZvbGRlcgorYWZwT2JqZWN0TG9ja2VkID0gICAtNTAzMiAgICNPYmplY3QgaXMgTS9SL0QvVyBpbmhpYml0ZWQKK2FmcFZvbExvY2tlZCAgICA9ICAgLTUwMzEgICAjVm9sdW1lIGlzIFJlYWQtT25seQorYWZwSWNvblR5cGVFcnJvciAgICA9ICAgLTUwMzAgICAjSWNvbiBzaXplIHNwZWNpZmllZCBkaWZmZXJlbnQgZnJvbSBleGlzdGluZyBpY29uIHNpemUKK2FmcERpck5vdEZvdW5kICA9ICAgLTUwMjkgICAjVW5rbm93biBkaXJlY3Rvcnkgc3BlY2lmaWVkCithZnBDYW50UmVuYW1lICAgPSAgIC01MDI4ICAgI0FGUFJlbmFtZSBjYW5ub3QgcmVuYW1lIHZvbHVtZQorYWZwU2VydmVyR29pbmdEb3duICA9ICAgLTUwMjcgICAjU2VydmVyIGlzIHNodXR0aW5nIGRvd24KK2FmcFRvb01hbnlGaWxlc09wZW4gPSAgIC01MDI2ICAgI01heGltdW0gb3BlbiBmaWxlIGNvdW50IHJlYWNoZWQKK2FmcE9iamVjdFR5cGVFcnIgICAgPSAgIC01MDI1ICAgI0ZpbGUvRGlyZWN0b3J5IHNwZWNpZmllZCB3aGVyZSBEaXJlY3RvcnkvRmlsZSBleHBlY3RlZAorYWZwQ2FsbE5vdFN1cHBvcnRlZCA9ICAgLTUwMjQgICAjVW5zdXBwb3J0ZWQgQUZQIGNhbGwgd2FzIG1hZGUKK2FmcFVzZXJOb3RBdXRoICA9ICAgLTUwMjMgICAjTm8gQUZQTG9naW4gY2FsbCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFkZSBmb3IgdGhpcyBzZXNzaW9uCithZnBTZXNzQ2xvc2VkICAgPSAgIC01MDIyICAgI1Nlc3Npb24gY2xvc2VkCithZnBSYW5nZU92ZXJsYXAgPSAgIC01MDIxICAgI1NvbWUgb3IgYWxsIG9mIHJhbmdlIGFscmVhZHkgbG9ja2VkIGJ5IHNhbWUgdXNlcgorYWZwUmFuZ2VOb3RMb2NrZWQgICA9ICAgLTUwMjAgICAjVHJpZWQgdG8gdW5sb2NrIHJhbmdlIHRoYXQgd2FzIG5vdCBsb2NrZWQgYnkgdXNlcgorYWZwUGFybUVyciAgPSAgIC01MDE5ICAgI0Egc3BlY2lmaWVkIHBhcmFtZXRlciB3YXMgb3V0IG9mIGFsbG93YWJsZSByYW5nZQorYWZwT2JqZWN0Tm90Rm91bmQgICA9ICAgLTUwMTggICAjU3BlY2lmaWVkIGZpbGUgb3IgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CithZnBPYmplY3RFeGlzdHMgPSAgIC01MDE3ICAgI1NwZWNpZmllZCBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cworYWZwTm9TZXJ2ZXIgPSAgIC01MDE2ICAgI1NlcnZlciBub3QgcmVzcG9uZGluZworYWZwTm9Nb3JlTG9ja3MgID0gICAtNTAxNSAgICNNYXhpbXVtIGxvY2sgbGltaXQgcmVhY2hlZAorYWZwTWlzY0VyciAgPSAgIC01MDE0ICAgI1VuZXhwZWN0ZWQgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGV4ZWN1dGlvbgorYWZwTG9ja0VyciAgPSAgIC01MDEzICAgI1NvbWUgb3IgYWxsIG9mIHJlcXVlc3RlZCByYW5nZSBpcyBsb2NrZWQgYnkgYW5vdGhlciB1c2VyCithZnBJdGVtTm90Rm91bmQgPSAgIC01MDEyICAgI1Vua25vd24gVXNlck5hbWUvVXNlcklEIG9yIG1pc3NpbmcgY29tbWVudC9BUFBMIGVudHJ5CithZnBGbGF0Vm9sICA9ICAgLTUwMTEgICAjQ2Fubm90IGNyZWF0ZSBkaXJlY3Rvcnkgb24gc3BlY2lmaWVkIHZvbHVtZQorYWZwRmlsZUJ1c3kgPSAgIC01MDEwICAgI0Nhbm5vdCBkZWxldGUgYW4gb3BlbiBmaWxlCithZnBFb2ZFcnJvciA9ICAgLTUwMDkgICAjUmVhZCBiZXlvbmQgbG9naWNhbCBlbmQtb2YtZmlsZQorYWZwRGlza0Z1bGwgPSAgIC01MDA4ICAgI0luc3VmZmljaWVudCBmcmVlIHNwYWNlIG9uIHZvbHVtZSBmb3Igb3BlcmF0aW9uCithZnBEaXJOb3RFbXB0eSAgPSAgIC01MDA3ICAgI0Nhbm5vdCBkZWxldGUgbm9uLWVtcHR5IGRpcmVjdG9yeQorYWZwRGVueUNvbmZsaWN0ID0gICAtNTAwNiAgICNTcGVjaWZpZWQgb3Blbi9kZW55IG1vZGVzIGNvbmZsaWN0IHdpdGggY3VycmVudCBvcGVuIG1vZGVzCithZnBDYW50TW92ZSA9ICAgLTUwMDUgICAjTW92ZSBkZXN0aW5hdGlvbiBpcyBvZmZzcHJpbmcgb2Ygc291cmNlLCBvciByb290IHdhcyBzcGVjaWZpZWQKK2FmcEJpdG1hcEVyciAgICA9ICAgLTUwMDQgICAjQml0bWFwIGNvbnRhaW5lZCBiaXRzIHVuZGVmaW5lZCBmb3IgY2FsbAorYWZwQmFkVmVyc051bSAgID0gICAtNTAwMyAgICNVbmtub3duIEFGUCBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBzcGVjaWZpZWQKK2FmcEJhZFVBTSAgID0gICAtNTAwMiAgICNVbmtub3duIHVzZXIgYXV0aGVudGljYXRpb24gbWV0aG9kIHNwZWNpZmllZAorYWZwQXV0aENvbnRpbnVlID0gICAtNTAwMSAgICNGdXJ0aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNvbXBsZXRlIEFGUExvZ2luIGNhbGwKK2FmcEFjY2Vzc0RlbmllZCA9ICAgLTUwMDAgICAjSW5zdWZmaWNpZW50IGFjY2VzcyBwcml2aWxlZ2VzIGZvciBvcGVyYXRpb24KK2lsbGVnYWxTY3JhcEZsYXZvclNpemVFcnIgICA9ICAgLTQ5OTkgICAjaWxsZWdhbFNjcmFwRmxhdm9yU2l6ZUVycgoraWxsZWdhbFNjcmFwRmxhdm9yVHlwZUVyciAgID0gICAtNDk5OCAgICNpbGxlZ2FsU2NyYXBGbGF2b3JUeXBlRXJyCitpbGxlZ2FsU2NyYXBGbGF2b3JGbGFnc0VyciAgPSAgIC00OTk3ICAgI2lsbGVnYWxTY3JhcEZsYXZvckZsYWdzRXJyCitzY3JhcEZsYXZvclNpemVNaXNtYXRjaEVyciAgPSAgIC00OTk2ICAgI3NjcmFwRmxhdm9yU2l6ZU1pc21hdGNoRXJyCitzY3JhcEZsYXZvckZsYWdzTWlzbWF0Y2hFcnIgPSAgIC00OTk1ICAgI3NjcmFwRmxhdm9yRmxhZ3NNaXNtYXRjaEVycgorbmlsU2NyYXBGbGF2b3JEYXRhRXJyICAgPSAgIC00OTk0ICAgI25pbFNjcmFwRmxhdm9yRGF0YUVycgorbm9TY3JhcFByb21pc2VLZWVwZXJFcnIgPSAgIC00OTkzICAgI25vU2NyYXBQcm9taXNlS2VlcGVyRXJyCitzY3JhcFByb21pc2VOb3RLZXB0RXJyICA9ICAgLTQ5OTIgICAjc2NyYXBQcm9taXNlTm90S2VwdEVycgorcHJvY2Vzc1N0YXRlSW5jb3JyZWN0RXJyICAgID0gICAtNDk5MSAgICNwcm9jZXNzU3RhdGVJbmNvcnJlY3RFcnIKK2JhZFNjcmFwUmVmRXJyICA9ICAgLTQ5OTAgICAjYmFkU2NyYXBSZWZFcnIKK2R1cGxpY2F0ZVNjcmFwRmxhdm9yRXJyID0gICAtNDk4OSAgICNkdXBsaWNhdGVTY3JhcEZsYXZvckVycgoraW50ZXJuYWxTY3JhcEVyciAgICA9ICAgLTQ5ODggICAjaW50ZXJuYWxTY3JhcEVycgorY29yZUZvdW5kYXRpb25Vbmtub3duRXJyICAgID0gICAtNDk2MCAgICNjb3JlRm91bmRhdGlvblVua25vd25FcnIKK2JhZFJvdXRpbmdTaXplRXJyICAgPSAgIC00Mjc2ICAgI2JhZFJvdXRpbmdTaXplRXJyCityb3V0aW5nTm90Rm91bmRFcnIgID0gICAtNDI3NSAgICNyb3V0aW5nTm90Rm91bmRFcnIKK2R1cGxpY2F0ZVJvdXRpbmdFcnIgPSAgIC00Mjc0ICAgI2R1cGxpY2F0ZVJvdXRpbmdFcnIKK2ludmFsaWRGb2xkZXJUeXBlRXJyICAgID0gICAtNDI3MyAgICNpbnZhbGlkRm9sZGVyVHlwZUVycgorbm9Nb3JlRm9sZGVyRGVzY0VyciA9ICAgLTQyNzIgICAjbm9Nb3JlRm9sZGVyRGVzY0VycgorZHVwbGljYXRlRm9sZGVyRGVzY0VyciAgPSAgIC00MjcxICAgI2R1cGxpY2F0ZUZvbGRlckRlc2NFcnIKK2JhZEZvbGRlckRlc2NFcnIgICAgPSAgIC00MjcwICAgI2JhZEZvbGRlckRlc2NFcnIKK2NtQ2FudEdhbXV0Q2hlY2tFcnJvciAgID0gICAtNDIxNyAgICNHYW1tdXQgY2hlY2tpbmcgbm90IHN1cHBvcnRlZCBieSB0aGlzIENvbG9yV29ybGQKK2NtTmFtZWRDb2xvck5vdEZvdW5kICAgID0gICAtNDIxNiAgICNOYW1lZENvbG9yIG5vdCBmb3VuZAorY21DYW50Q29weU1vZGlmaWVkVjFQcm9maWxlID0gICAtNDIxNSAgICNJbGxlZ2FsIHRvIGNvcHkgdmVyc2lvbiAxIHByb2ZpbGVzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkCitjbVJhbmdlT3ZlckZsb3cgPSAgIC00MjE0ICAgI0NvbG9yIGNvbnZlcnNpb24gd2FybmluZyB0aGF0IHNvbWUgb3V0cHV0IGNvbG9yIHZhbHVlcyBvdmVyL3VuZGVyZmxvd2VkIGFuZCB3ZXJlIGNsaXBwZWQKK2NtSW52YWxpZFByb2ZpbGVDb21tZW50ID0gICAtNDIxMyAgICNCYWQgUHJvZmlsZSBjb21tZW50IGR1cmluZyBkcmF3cGljdHVyZQorY21Ob0dEZXZpY2VzRXJyb3IgICA9ICAgLTQyMTIgICAjQmVnaW4vRW5kIE1hdGNoaW5nIC0tIG5vIGdkZXZpY2VzIGF2YWlsYWJsZQorY21JbnZhbGlkRHN0TWFwID0gICAtNDIxMSAgICNEZXN0aW5hdGlvbiBwaXgvYml0IG1hcCB3YXMgaW52YWxpZAorY21JbnZhbGlkU3JjTWFwID0gICAtNDIxMCAgICNTb3VyY2UgcGl4L2JpdCBtYXAgd2FzIGludmFsaWQKK2NtSW52YWxpZENvbG9yU3BhY2UgPSAgIC00MjA5ICAgI1Byb2ZpbGUgY29sb3JzcGFjZSBkb2VzIG5vdCBtYXRjaCBiaXRtYXAgdHlwZQorY21FcnJJbmNvbXBhdGlibGVQcm9maWxlICAgID0gICAtNDIwOCAgICNPdGhlciBDb2xvclN5bmMgRXJyb3JzCitjbVNlYXJjaEVycm9yICAgPSAgIC00MjA3ICAgI2NtU2VhcmNoRXJyb3IKK2NtSW52YWxpZFNlYXJjaCA9ICAgLTQyMDYgICAjQmFkIFNlYXJjaCBIYW5kbGUKK2NtSW52YWxpZFByb2ZpbGVMb2NhdGlvbiAgICA9ICAgLTQyMDUgICAjT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgcHJvZmlsZSBsb2NhdGlvbgorY21JbnZhbGlkUHJvZmlsZSAgICA9ICAgLTQyMDQgICAjQSBQcm9maWxlIG11c3QgY29udGFpbiBhICdjczEgJyB0YWcgdG8gYmUgdmFsaWQKK2NtRmF0YWxQcm9maWxlRXJyICAgPSAgIC00MjAzICAgI2NtRmF0YWxQcm9maWxlRXJyCitjbUNhbnREZWxldGVFbGVtZW50ID0gICAtNDIwMiAgICNjbUNhbnREZWxldGVFbGVtZW50CitjbUluZGV4UmFuZ2VFcnIgPSAgIC00MjAxICAgI1RhZyBpbmRleCBvdXQgb2YgcmFuZ2UKK2tOU0xJbml0aWFsaXphdGlvbkZhaWxlZCAgICA9ICAgLTQyMDAgICAjVU5BQkxFIFRPIElOSVRJQUxJWkUgVEhFIE1BTkFHRVIhISEhISBETyBOT1QgQ09OVElOVUUhISEhCitrTlNMTm90SW5pdGlhbGl6ZWQgID0gICAtNDE5OSAgICNrTlNMTm90SW5pdGlhbGl6ZWQKK2tOU0xJbnN1ZmZpY2llbnRTeXNWZXIgID0gICAtNDE5OCAgICNrTlNMSW5zdWZmaWNpZW50U3lzVmVyCitrTlNMSW5zdWZmaWNpZW50T1RWZXIgICA9ICAgLTQxOTcgICAja05TTEluc3VmZmljaWVudE9UVmVyCitrTlNMTm9FbGVtZW50c0luTGlzdCAgICA9ICAgLTQxOTYgICAja05TTE5vRWxlbWVudHNJbkxpc3QKK2tOU0xCYWRSZWZlcmVuY2VFcnIgPSAgIC00MTk1ICAgI2tOU0xCYWRSZWZlcmVuY2VFcnIKK2tOU0xCYWRTZXJ2aWNlVHlwZUVyciAgID0gICAtNDE5NCAgICNrTlNMQmFkU2VydmljZVR5cGVFcnIKK2tOU0xCYWREYXRhVHlwZUVyciAgPSAgIC00MTkzICAgI2tOU0xCYWREYXRhVHlwZUVycgora05TTEJhZE5ldENvbm5lY3Rpb24gICAgPSAgIC00MTkyICAgI2tOU0xCYWROZXRDb25uZWN0aW9uCitrTlNMTm9TdXBwb3J0Rm9yU2VydmljZSA9ICAgLTQxOTEgICAja05TTE5vU3VwcG9ydEZvclNlcnZpY2UKK2tOU0xJbnZhbGlkUGx1Z2luU3BlYyAgID0gICAtNDE5MCAgICNrTlNMSW52YWxpZFBsdWdpblNwZWMKK2tOU0xSZXF1ZXN0QnVmZmVyQWxyZWFkeUluTGlzdCAgPSAgIC00MTg5ICAgI2tOU0xSZXF1ZXN0QnVmZmVyQWxyZWFkeUluTGlzdAora05TTE5vQ29udGV4dEF2YWlsYWJsZSAgPSAgIC00MTg4ICAgIyhDb250aW51ZUxvb2t1cCBmdW5jdGlvbiBwdHIgaW52YWxpZCkKK2tOU0xCdWZmZXJUb29TbWFsbEZvckRhdGEgICA9ICAgLTQxODcgICAjKENsaWVudCBidWZmZXIgdG9vIHNtYWxsIGZvciBkYXRhIGZyb20gcGx1Z2luKQora05TTENhbm5vdENvbnRpbnVlTG9va3VwICAgID0gICAtNDE4NiAgICMoQ2FuJ3QgY29udGludWUgbG9va3VwOyBlcnJvciBvciBiYWQgc3RhdGUpCitrTlNMQmFkQ2xpZW50SW5mb1B0ciAgICA9ICAgLTQxODUgICAjKG5pbCBDbGllbnRBc3luY0luZm9QdHI7IG5vIHJlZmVyZW5jZSBhdmFpbGFibGUpCitrTlNMTnVsbExpc3RQdHIgPSAgIC00MTg0ICAgIyhjbGllbnQgaXMgdHJ5aW5nIHRvIGFkZCBpdGVtcyB0byBhIG5pbCBsaXN0KQora05TTEJhZFByb3RvY29sVHlwZUVyciAgPSAgIC00MTgzICAgIyhjbGllbnQgaXMgdHJ5aW5nIHRvIGFkZCBhIG51bGwgcHJvdG9jb2wgdHlwZSkKK2tOU0xQbHVnaW5Mb2FkRmFpbGVkICAgID0gICAtNDE4MiAgICMobWFuYWdlciB1bmFibGUgdG8gbG9hZCBvbmUgb2YgdGhlIHBsdWdpbnMpCitrTlNMTm9QbHVnaW5zRm91bmQgID0gICAtNDE4MSAgICMobWFuYWdlciBkaWRuJ3QgZmluZCBhbnkgdmFsaWQgcGx1Z2lucyB0byBsb2FkKQora05TTFNlYXJjaEFscmVhZHlJblByb2dyZXNzID0gICAtNDE4MCAgICMoeW91IGNhbiBvbmx5IGhhdmUgb25lIG9uZ29pbmcgc2VhcmNoIHBlciBjbGllbnRSZWYpCitrTlNMTm9QbHVnaW5zRm9yU2VhcmNoICA9ICAgLTQxNzkgICAjKG5vIHBsdWdpbnMgd2lsbCByZXNwb25kIHRvIHNlYXJjaCByZXF1ZXN0OyBiYWQgcHJvdG9jb2wocyk/KQora05TTE51bGxOZWlnaGJvcmhvb2RQdHIgPSAgIC00MTc4ICAgIyhjbGllbnQgcGFzc2VkIGEgbnVsbCBuZWlnaGJvcmhvb2QgcHRyKQora05TTFNvbWVQbHVnaW5zRmFpbGVkVG9Mb2FkID0gICAtNDE3NyAgICMob25lIG9yIG1vcmUgcGx1Z2lucyBmYWlsZWQgdG8gbG9hZCwgYnV0IGF0IGxlYXN0IG9uZSBkaWQgbG9hZDsgdGhpcyBlcnJvciBpc24ndCBmYXRhbCkKK2tOU0xFcnJOdWxsUHRyRXJyb3IgPSAgIC00MTc2ICAgI2tOU0xFcnJOdWxsUHRyRXJyb3IKK2tOU0xOb3RJbXBsZW1lbnRlZFlldCAgID0gICAtNDE3NSAgICNrTlNMTm90SW1wbGVtZW50ZWRZZXQKK2tOU0xVSUxpYnJhcnlOb3RBdmFpbGFibGUgICA9ICAgLTQxNzQgICAjVGhlIE5TTCBVSSBMaWJyYXJ5IG5lZWRzIHRvIGJlIGluIHRoZSBFeHRlbnNpb25zIEZvbGRlcgora05TTE5vQ2FyYm9uTGliID0gICAtNDE3MyAgICNrTlNMTm9DYXJib25MaWIKK2tOU0xCYWRVUkxTeW50YXggICAgPSAgIC00MTcyICAgI1VSTCBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMKK2tOU0xTY2hlZHVsZXJFcnJvciAgPSAgIC00MTcxICAgI0EgY3VzdG9tIHRocmVhZCByb3V0aW5lIGVuY291bnRlcmVkIGFuIGVycm9yCitrTlNMNjhrQ29udGV4dE5vdFN1cHBvcnRlZCAgPSAgIC00MTcwICAgI25vIDY4ayBhbGxvd2VkCitub0hlbHBGb3JJdGVtICAgPSAgIC00MDA5ICAgI25vSGVscEZvckl0ZW0KK2JhZFByb2ZpbGVFcnJvciA9ICAgLTQwMDggICAjYmFkUHJvZmlsZUVycm9yCitjb2xvclN5bmNOb3RJbnN0YWxsZWQgICA9ICAgLTQwMDcgICAjY29sb3JTeW5jTm90SW5zdGFsbGVkCitwaWNrZXJDYW50TGl2ZSAgPSAgIC00MDA2ICAgI3BpY2tlckNhbnRMaXZlCitjYW50TG9hZFBhY2thZ2UgPSAgIC00MDA1ICAgI2NhbnRMb2FkUGFja2FnZQorY2FudENyZWF0ZVBpY2tlcldpbmRvdyAgPSAgIC00MDA0ICAgI2NhbnRDcmVhdGVQaWNrZXJXaW5kb3cKK2NhbnRMb2FkUGlja2VyICA9ICAgLTQwMDMgICAjY2FudExvYWRQaWNrZXIKK3BpY2tlclJlc291cmNlRXJyb3IgPSAgIC00MDAyICAgI3BpY2tlclJlc291cmNlRXJyb3IKK3JlcXVpcmVkRmxhZ3NEb250TWF0Y2ggID0gICAtNDAwMSAgICNyZXF1aXJlZEZsYWdzRG9udE1hdGNoCitmaXJzdFBpY2tlckVycm9yICAgID0gICAtNDAwMCAgICNmaXJzdFBpY2tlckVycm9yCitrT1RQb3J0TG9zdENvbm5lY3Rpb24gICA9ICAgLTMyODUgICAjCitrT1RVc2VyUmVxdWVzdGVkRXJyID0gICAtMzI4NCAgICMKK2tPVENvbmZpZ3VyYXRpb25DaGFuZ2VkRXJyICA9ICAgLTMyODMgICAjCitrT1RCYWRDb25maWd1cmF0aW9uRXJyICA9ICAgLTMyODIgICAjCitrT1RQb3J0V2FzRWplY3RlZEVyciAgICA9ICAgLTMyODEgICAjCitrT1RQb3J0SGFzRGllZEVyciAgID0gICAtMzI4MCAgICMKK2tPVENsaWVudE5vdEluaXR0ZWRFcnIgID0gICAtMzI3OSAgICMKK2tFTk9NU0dFcnIgID0gICAtMzI3OCAgICMKK2tFU1JDSEVyciAgID0gICAtMzI3NyAgICMKK2tFSU5QUk9HUkVTU0VyciA9ICAgLTMyNzYgICAjCitrRU5PREFUQUVyciA9ICAgLTMyNzUgICAjCitrRU5PU1RSRXJyICA9ICAgLTMyNzQgICAjCitrRUNBTkNFTEVyciA9ICAgLTMyNzMgICAjCitrRUJBRE1TR0VyciA9ICAgLTMyNzIgICAjCitrRU5PU1JFcnIgICA9ICAgLTMyNzEgICAjCitrRVRJTUVFcnIgICA9ICAgLTMyNzAgICAjCitrRVBST1RPRXJyICA9ICAgLTMyNjkgICAjgoKCIGZpbGwgb3V0IG1pc3NpbmcgY29kZXMggoKCCitrRUhPU1RVTlJFQUNIRXJyICAgID0gICAtMzI2NCAgICNObyByb3V0ZSB0byBob3N0CitrRUhPU1RET1dORXJyICAgPSAgIC0zMjYzICAgI0hvc3QgaXMgZG93bgora0VDT05OUkVGVVNFREVyciAgICA9ICAgLTMyNjAgICAjQ29ubmVjdGlvbiByZWZ1c2VkCitrRVRJTUVET1VURXJyICAgPSAgIC0zMjU5ICAgI0Nvbm5lY3Rpb24gdGltZWQgb3V0CitrRVRPT01BTllSRUZTRXJyICAgID0gICAtMzI1OCAgICNUb28gbWFueSByZWZlcmVuY2VzOiBjYW4ndCBzcGxpY2UKK2tFU0hVVERPV05FcnIgICA9ICAgLTMyNTcgICAjQ2FuJ3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24KK2tFTk9UQ09OTkVyciAgICA9ICAgLTMyNTYgICAjU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQKK2tFSVNDT05ORXJyID0gICAtMzI1NSAgICNTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQKK2tFTk9CVUZTRXJyID0gICAtMzI1NCAgICNObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlCitrRUNPTk5SRVNFVEVyciAgPSAgIC0zMjUzICAgI0Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgora0VDT05OQUJPUlRFREVyciAgICA9ICAgLTMyNTIgICAjU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQKK2tFTkVUUkVTRVRFcnIgICA9ICAgLTMyNTEgICAjTmV0d29yayBkcm9wcGVkIGNvbm5lY3Rpb24gb24gcmVzZXQKK2tFTkVUVU5SRUFDSEVyciA9ICAgLTMyNTAgICAjTmV0d29yayBpcyB1bnJlYWNoYWJsZQora0VORVRET1dORXJyICAgID0gICAtMzI0OSAgICNOZXR3b3JrIGlzIGRvd24KK2tFQUREUk5PVEFWQUlMRXJyICAgPSAgIC0zMjQ4ICAgI0Nhbid0IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcwora0VBRERSSU5VU0VFcnIgID0gICAtMzI0NyAgICNBZGRyZXNzIGFscmVhZHkgaW4gdXNlCitrRU9QTk9UU1VQUEVyciAgPSAgIC0zMjQ0ICAgI09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHNvY2tldAora0VTT0NLVE5PU1VQUE9SVEVyciA9ICAgLTMyNDMgICAjU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZAora0VQUk9UT05PU1VQUE9SVEVyciA9ICAgLTMyNDIgICAjUHJvdG9jb2wgbm90IHN1cHBvcnRlZAora0VOT1BST1RPT1BURXJyID0gICAtMzI0MSAgICNQcm90b2NvbCBub3QgYXZhaWxhYmxlCitrRVBST1RPVFlQRUVyciAgPSAgIC0zMjQwICAgI1Byb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldAora0VNU0dTSVpFRXJyICAgID0gICAtMzIzOSAgICNNZXNzYWdlIHRvbyBsb25nCitrRURFU1RBRERSUkVRRXJyICAgID0gICAtMzIzOCAgICNEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkCitrRU5PVFNPQ0tFcnIgICAgPSAgIC0zMjM3ICAgI1NvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldAora0VBTFJFQURZRXJyICAgID0gICAtMzIzNiAgICMKK2tFV09VTERCTE9DS0VyciA9ICAgLTMyMzQgICAjQ2FsbCB3b3VsZCBibG9jaywgc28gd2FzIGFib3J0ZWQKK2tFUkFOR0VFcnIgID0gICAtMzIzMyAgICNNZXNzYWdlIHNpemUgdG9vIGxhcmdlIGZvciBTVFJFQU0KK2tFUElQRUVyciAgID0gICAtMzIzMSAgICNCcm9rZW4gcGlwZQora0VOT1RUWUVyciAgPSAgIC0zMjI0ICAgI05vdCBhIGNoYXJhY3RlciBkZXZpY2UKK2tFSU5WQUxFcnIgID0gICAtMzIyMSAgICNJbnZhbGlkIGFyZ3VtZW50CitrRU5PREVWRXJyICA9ICAgLTMyMTggICAjTm8gc3VjaCBkZXZpY2UKK2tPVER1cGxpY2F0ZUZvdW5kRXJyICAgID0gICAtMzIxNiAgICNPVCBnZW5lcmljIGR1cGxpY2F0ZSBmb3VuZCBlcnJvcgora0VCVVNZRXJyICAgPSAgIC0zMjE1ICAgI0RldmljZSBvciByZXNvdXJjZSBidXN5CitrRUZBVUxURXJyICA9ICAgLTMyMTMgICAjQmFkIGFkZHJlc3MKK2tFQUNDRVNFcnIgID0gICAtMzIxMiAgICNQZXJtaXNzaW9uIGRlbmllZAora09UT3V0T2ZNZW1vcnlFcnIgICA9ICAgLTMyMTEgICAjT1QgcmFuIG91dCBvZiBtZW1vcnksIG1heSBiZSBhIHRlbXBvcmFyeQora0VBR0FJTkVyciAgPSAgIC0zMjEwICAgI1RyeSBvcGVyYXRpb24gYWdhaW4gbGF0ZXIKK2tFQkFERkVyciAgID0gICAtMzIwOCAgICNCYWQgZmlsZSBudW1iZXIKK2tFTlhJT0VyciAgID0gICAtMzIwNSAgICNObyBzdWNoIGRldmljZSBvciBhZGRyZXNzCitrRUlPRXJyID0gICAtMzIwNCAgICNJL08gZXJyb3IKK2tFSU5UUkVyciAgID0gICAtMzIwMyAgICNJbnRlcnJ1cHRlZCBzeXN0ZW0gc2VydmljZQora0VOT1JTUkNFcnIgPSAgIC0zMjAyICAgI05vIHN1Y2ggcmVzb3VyY2UKK2tPVE5vdEZvdW5kRXJyICA9ICAgLTMyMDEgICAjT1QgZ2VuZXJpYyBub3QgZm91bmQgZXJyb3IKK2tFUEVSTUVyciAgID0gICAtMzIwMCAgICNQZXJtaXNzaW9uIGRlbmllZAora09UQ2FuY2VsZWRFcnIgID0gICAtMzE4MCAgICNYVEkyT1NTdGF0dXMoVENBTkNFTEVEKSBUaGUgY29tbWFuZCB3YXMgY2FuY2VsbGVkCitrT1RCYWRTeW5jRXJyICAgPSAgIC0zMTc5ICAgI1hUSTJPU1N0YXR1cyhUQkFEU1lOQykgQSBzeW5jaHJvbm91cyBjYWxsIGF0IGludGVycnVwdCB0aW1lCitrT1RQcm90b2NvbEVyciAgPSAgIC0zMTc4ICAgI1hUSTJPU1N0YXR1cyhUUFJPVE8pIEFuIHVuc3BlY2lmaWVkIHByb3ZpZGVyIGVycm9yIG9jY3VycmVkCitrT1RRRnVsbEVyciA9ICAgLTMxNzcgICAjWFRJMk9TU3RhdHVzKFRRRlVMTCkKK2tPVFJlc0FkZHJlc3NFcnIgICAgPSAgIC0zMTc2ICAgI1hUSTJPU1N0YXR1cyhUUkVTQUREUikKK2tPVFJlc1FMZW5FcnIgICA9ICAgLTMxNzUgICAjWFRJMk9TU3RhdHVzKFRSRVNRTEVOKQora09UUHJvdmlkZXJNaXNtYXRjaEVyciAgPSAgIC0zMTc0ICAgI1hUSTJPU1N0YXR1cyhUUFJPVk1JU01BVENIKSBUcmllZCB0byBhY2NlcHQgb24gaW5jb21wYXRpYmxlIGVuZHBvaW50CitrT1RJbmRPdXRFcnIgICAgPSAgIC0zMTczICAgI1hUSTJPU1N0YXR1cyhUSU5ET1VUKSBBY2NlcHQgZmFpbGVkIGJlY2F1c2Ugb2YgcGVuZGluZyBsaXN0ZW4KK2tPVEFkZHJlc3NCdXN5RXJyICAgPSAgIC0zMTcyICAgI1hUSTJPU1N0YXR1cyhUQUREUkJVU1kpIEFkZHJlc3MgcmVxdWVzdGVkIGlzIGFscmVhZHkgaW4gdXNlCitrT1RCYWRRTGVuRXJyICAgPSAgIC0zMTcxICAgI1hUSTJPU1N0YXR1cyhUQkFEUUxFTikgQSBCaW5kIHRvIGFuIGluLXVzZSBhZGRyIHdpdGggcWxlbiA+IDAKK2tPVEJhZE5hbWVFcnIgICA9ICAgLTMxNzAgICAjWFRJMk9TU3RhdHVzKFRCQUROQU1FKSBBIGJhZCBlbmRwb2ludCBuYW1lIHdhcyBzdXBwbGllZAora09UTm9TdHJ1Y3R1cmVUeXBlRXJyICAgPSAgIC0zMTY5ICAgI1hUSTJPU1N0YXR1cyhUTk9TVFJVQ1RZUEUpIEJhZCBzdHJ1Y3R1cmUgdHlwZSByZXF1ZXN0ZWQgZm9yIE9UQWxsb2MKK2tPVFN0YXRlQ2hhbmdlRXJyICAgPSAgIC0zMTY4ICAgI1hUSTJPU1N0YXR1cyhUU1RBVEVDSE5HKSBTdGF0ZSBpcyBjaGFuZ2luZyAtIHRyeSBhZ2FpbiBsYXRlcgora09UTm90U3VwcG9ydGVkRXJyICA9ICAgLTMxNjcgICAjWFRJMk9TU3RhdHVzKFROT1RTVVBQT1JUKSBDb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQKK2tPVE5vUmVsZWFzZUVyciA9ICAgLTMxNjYgICAjWFRJMk9TU3RhdHVzKFROT1JFTCkgTm8gb3JkZXJseSByZWxlYXNlIGluZGljYXRpb24gYXZhaWxhYmxlCitrT1RCYWRGbGFnRXJyICAgPSAgIC0zMTY1ICAgI1hUSTJPU1N0YXR1cyhUQkFERkxBRykgQSBCYWQgZmxhZyB2YWx1ZSB3YXMgc3VwcGxpZWQKK2tPVE5vVURFcnJFcnIgICA9ICAgLTMxNjQgICAjWFRJMk9TU3RhdHVzKFROT1VERVJSKSBObyBVbml0IERhdGEgRXJyb3IgaW5kaWNhdGlvbiBhdmFpbGFibGUKK2tPVE5vRGlzY29ubmVjdEVyciAgPSAgIC0zMTYzICAgI1hUSTJPU1N0YXR1cyhUTk9ESVMpIE5vIGRpc2Nvbm5lY3QgaW5kaWNhdGlvbiBhdmFpbGFibGUKK2tPVE5vRGF0YUVyciAgICA9ICAgLTMxNjIgICAjWFRJMk9TU3RhdHVzKFROT0RBVEEpIE5vIGRhdGEgYXZhaWxhYmxlIGZvciByZWFkaW5nCitrT1RGbG93RXJyICA9ICAgLTMxNjEgICAjWFRJMk9TU3RhdHVzKFRGTE9XKSBQcm92aWRlciBpcyBmbG93LWNvbnRyb2xsZWQKK2tPVEJ1ZmZlck92ZXJmbG93RXJyICAgID0gICAtMzE2MCAgICNYVEkyT1NTdGF0dXMoVEJVRk9WRkxXKSBQYXNzZWQgYnVmZmVyIG5vdCBiaWcgZW5vdWdoCitrT1RCYWREYXRhRXJyICAgPSAgIC0zMTU5ICAgI1hUSTJPU1N0YXR1cyhUQkFEREFUQSkgQW4gaWxsZWdhbCBhbW91bnQgb2YgZGF0YSB3YXMgc3BlY2lmaWVkCitrT1RMb29rRXJyICA9ICAgLTMxNTggICAjWFRJMk9TU3RhdHVzKFRMT09LKSBBbiBldmVudCBvY2N1cnJlZCAtIGNhbGwgTG9vaygpCitrT1RTeXNFcnJvckVyciAgPSAgIC0zMTU3ICAgI1hUSTJPU1N0YXR1cyhUU1lTRVJSKSBBIHN5c3RlbSBlcnJvciBvY2N1cnJlZAora09UQmFkU2VxdWVuY2VFcnIgICA9ICAgLTMxNTYgICAjWFRJMk9TU3RhdHVzKFRCQURTRVEpIFNlcXVlbmNlIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdAora09UT3V0U3RhdGVFcnIgID0gICAtMzE1NSAgICNYVEkyT1NTdGF0dXMoVE9VVFNUQVRFKSBDYWxsIGlzc3VlZCBpbiB3cm9uZyBzdGF0ZQora09UTm9BZGRyZXNzRXJyID0gICAtMzE1NCAgICNYVEkyT1NTdGF0dXMoVE5PQUREUikgTm8gYWRkcmVzcyB3YXMgc3BlY2lmaWVkCitrT1RCYWRSZWZlcmVuY2VFcnIgID0gICAtMzE1MyAgICNYVEkyT1NTdGF0dXMoVEJBREYpIEJhZCBwcm92aWRlciByZWZlcmVuY2UKK2tPVEFjY2Vzc0VyciAgICA9ICAgLTMxNTIgICAjWFRJMk9TU3RhdHVzKFRBQ0NFUykgTWlzc2luZyBhY2Nlc3MgcGVybWlzc2lvbgora09UQmFkT3B0aW9uRXJyID0gICAtMzE1MSAgICNYVEkyT1NTdGF0dXMoVEJBRE9QVCkgQSBCYWQgb3B0aW9uIHdhcyBzcGVjaWZpZWQKK2tPVEJhZEFkZHJlc3NFcnIgICAgPSAgIC0zMTUwICAgI1hUSTJPU1N0YXR1cyhUQkFEQUREUikgQSBCYWQgYWRkcmVzcyB3YXMgc3BlY2lmaWVkCitza3RDbG9zZWRFcnIgICAgPSAgIC0zMTA5ICAgI3NrdENsb3NlZEVycgorcmVjTm90Rm5kICAgPSAgIC0zMTA4ICAgI3JlY05vdEZuZAorYXRwQmFkUnNwICAgPSAgIC0zMTA3ICAgI2F0cEJhZFJzcAorYXRwTGVuRXJyICAgPSAgIC0zMTA2ICAgI2F0cExlbkVycgorcmVhZFFFcnIgICAgPSAgIC0zMTA1ICAgI3JlYWRRRXJyCitleHRyYWN0RXJyICA9ICAgLTMxMDQgICAjZXh0cmFjdEVycgorY2tTdW1FcnIgICAgPSAgIC0zMTAzICAgI2NrU3VtRXJyCitub01QUEVyciAgICA9ICAgLTMxMDIgICAjbm9NUFBFcnIKK2J1ZjJTbWFsbEVyciAgICA9ICAgLTMxMDEgICAjYnVmMlNtYWxsRXJyCitub1ByZWZBcHBFcnIgICAgPSAgIC0zMDMyICAgI25vUHJlZkFwcEVycgorYmFkVHJhbnNsYXRpb25TcGVjRXJyICAgPSAgIC0zMDMxICAgI2JhZFRyYW5zbGF0aW9uU3BlY0Vycgorbm9UcmFuc2xhdGlvblBhdGhFcnIgICAgPSAgIC0zMDMwICAgI25vVHJhbnNsYXRpb25QYXRoRXJyCitjb3VsZE5vdFBhcnNlU291cmNlRmlsZUVyciAgPSAgIC0zMDI2ICAgI1NvdXJjZSBkb2N1bWVudCBkb2VzIG5vdCBjb250YWluIHNvdXJjZSB0eXBlCitpbnZhbGlkVHJhbnNsYXRpb25QYXRoRXJyICAgPSAgIC0zMDI1ICAgI1NvdXJjZSB0eXBlIHRvIGRlc3RpbmF0aW9uIHR5cGUgbm90IGEgdmFsaWQgcGF0aAorcmV0cnlDb21wb25lbnRSZWdpc3RyYXRpb25FcnIgICA9ICAgLTMwMDUgICAjcmV0cnlDb21wb25lbnRSZWdpc3RyYXRpb25FcnIKK3VucmVzb2x2ZWRDb21wb25lbnRETExFcnIgICA9ICAgLTMwMDQgICAjdW5yZXNvbHZlZENvbXBvbmVudERMTEVycgorY29tcG9uZW50RG9udFJlZ2lzdGVyICAgPSAgIC0zMDAzICAgI2NvbXBvbmVudERvbnRSZWdpc3RlcgorY29tcG9uZW50Tm90Q2FwdHVyZWQgICAgPSAgIC0zMDAyICAgI2NvbXBvbmVudE5vdENhcHR1cmVkCit2YWxpZEluc3RhbmNlc0V4aXN0ID0gICAtMzAwMSAgICN2YWxpZEluc3RhbmNlc0V4aXN0CitpbnZhbGlkQ29tcG9uZW50SUQgID0gICAtMzAwMCAgICNpbnZhbGlkQ29tcG9uZW50SUQKK2NmcmFnTGFzdEVyckNvZGUgICAgPSAgIC0yODk5ICAgI1RoZSBsYXN0IHZhbHVlIGluIHRoZSByYW5nZSBvZiBDRk0gZXJyb3JzLgorY2ZyYWdPdXRwdXRMZW5ndGhFcnIgICAgPSAgIC0yODMxICAgI0FuIG91dHB1dCBwYXJhbWV0ZXIgaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIHZhbHVlLgorY2ZyYWdBYm9ydENsb3N1cmVFcnIgICAgPSAgIC0yODMwICAgI1VzZWQgYnkgbm90aWZpY2F0aW9uIGhhbmRsZXJzIHRvIGFib3J0IGEgY2xvc3VyZS4KK2NmcmFnQ2xvc3VyZUlERXJyICAgPSAgIC0yODI5ICAgI1RoZSBjbG9zdXJlIElEIHdhcyBub3QgdmFsaWQuCitjZnJhZ0NvbnRhaW5lcklERXJyID0gICAtMjgyOCAgICNUaGUgZnJhZ21lbnQgY29udGFpbmVyIElEIHdhcyBub3QgdmFsaWQuCitjZnJhZ05vUmVnaXN0cmF0aW9uRXJyICA9ICAgLTI4MjcgICAjVGhlIHJlZ2lzdHJhdGlvbiBuYW1lIHdhcyBub3QgZm91bmQuCitjZnJhZ05vdENsb3N1cmVFcnIgID0gICAtMjgyNiAgICNUaGUgY2xvc3VyZSBJRCB3YXMgYWN0dWFsbHkgYSBjb25uZWN0aW9uIElELgorY2ZyYWdGaWxlU2l6ZUVyciAgICA9ICAgLTI4MjUgICAjQSBmaWxlIHdhcyB0b28gbGFyZ2UgdG8gYmUgbWFwcGVkLgorY2ZyYWdGcmFnbWVudFVzYWdlRXJyICAgPSAgIC0yODI0ICAgI0Egc2VtYW50aWMgZXJyb3IgaW4gdXNhZ2Ugb2YgdGhlIGZyYWdtZW50LgorY2ZyYWdBcmNoaXRlY3R1cmVFcnIgICAgPSAgIC0yODIzICAgI0EgZnJhZ21lbnQgaGFzIGFuIHVuYWNjZXB0YWJsZSBhcmNoaXRlY3R1cmUuCitjZnJhZ05vQXBwbGljYXRpb25FcnIgICA9ICAgLTI4MjIgICAjTm8gYXBwbGljYXRpb24gbWVtYmVyIGZvdW5kIGluIHRoZSBjZnJnIHJlc291cmNlLgorY2ZyYWdJbml0RnVuY3Rpb25FcnIgICAgPSAgIC0yODIxICAgI0EgZnJhZ21lbnQncyBpbml0aWFsaXphdGlvbiByb3V0aW5lIHJldHVybmVkIGFuIGVycm9yLgorY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnIgPSAgIC0yODIwICAgI0EgZnJhZ21lbnQncyBjb250YWluZXIgd2FzIGNvcnJ1cHQgKGtub3duIGZvcm1hdCkuCitjZnJhZ0NGTUludGVybmFsRXJyID0gICAtMjgxOSAgICNBbiBpbnRlcm5hbCBpbmNvbnN0aXN0YW5jeSBoYXMgYmVlbiBkZXRlY3RlZC4KK2NmcmFnQ0ZNU3RhcnR1cEVyciAgPSAgIC0yODE4ICAgI0ludGVybmFsIGVycm9yIGR1cmluZyBDRk0gaW5pdGlhbGl6YXRpb24uCitjZnJhZ0xpYkNvbm5FcnIgPSAgIC0yODE3ICAgIworY2ZyYWdJbml0QXRCb290RXJyICA9ICAgLTI4MTYgICAjQSBib290IGxpYnJhcnkgaGFzIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLiAgKFN5c3RlbSA3IG9ubHkpCitjZnJhZ0luaXRMb29wRXJyICAgID0gICAtMjgxNSAgICNDaXJjdWxhcml0eSBpbiByZXF1aXJlZCBpbml0aWFsaXphdGlvbiBvcmRlci4KK2NmcmFnSW1wb3J0VG9vTmV3RXJyICAgID0gICAtMjgxNCAgICNBbiBpbXBvcnQgbGlicmFyeSB3YXMgdG9vIG5ldyBmb3IgYSBjbGllbnQuCitjZnJhZ0ltcG9ydFRvb09sZEVyciAgICA9ICAgLTI4MTMgICAjQW4gaW1wb3J0IGxpYnJhcnkgd2FzIHRvbyBvbGQgZm9yIGEgY2xpZW50LgorY2ZyYWdJbml0T3JkZXJFcnIgICA9ICAgLTI4MTIgICAjCitjZnJhZ05vSURzRXJyICAgPSAgIC0yODExICAgI05vIG1vcmUgQ0ZNIElEcyBmb3IgY29udGV4dHMsIGNvbm5lY3Rpb25zLCBldGMuCitjZnJhZ05vQ2xpZW50TWVtRXJyID0gICAtMjgxMCAgICNPdXQgb2YgbWVtb3J5IGZvciBmcmFnbWVudCBtYXBwaW5nIG9yIHNlY3Rpb24gaW5zdGFuY2VzLgorY2ZyYWdOb1ByaXZhdGVNZW1FcnIgICAgPSAgIC0yODA5ICAgI091dCBvZiBtZW1vcnkgZm9yIGludGVybmFsIGJvb2trZWVwaW5nLgorY2ZyYWdOb1Bvc2l0aW9uRXJyICA9ICAgLTI4MDggICAjVGhlIHJlZ2lzdHJhdGlvbiBpbnNlcnRpb24gcG9pbnQgd2FzIG5vdCBmb3VuZC4KK2NmcmFnVW5yZXNvbHZlZEVyciAgPSAgIC0yODA3ICAgI0EgZnJhZ21lbnQgaGFkICJoYXJkIiB1bnJlc29sdmVkIGltcG9ydHMuCitjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyICA9ICAgLTI4MDYgICAjQSBmcmFnbWVudCdzIGNvbnRhaW5lciBmb3JtYXQgaXMgdW5rbm93bi4KK2NmcmFnRHVwUmVnaXN0cmF0aW9uRXJyID0gICAtMjgwNSAgICNUaGUgcmVnaXN0cmF0aW9uIG5hbWUgd2FzIGFscmVhZHkgaW4gdXNlLgorY2ZyYWdOb0xpYnJhcnlFcnIgICA9ICAgLTI4MDQgICAjVGhlIG5hbWVkIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4KK2NmcmFnTm9TZWN0aW9uRXJyICAgPSAgIC0yODAzICAgI1RoZSBzcGVjaWZpZWQgc2VjdGlvbiB3YXMgbm90IGZvdW5kLgorY2ZyYWdOb1N5bWJvbEVyciAgICA9ICAgLTI4MDIgICAjVGhlIHNwZWNpZmllZCBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KK2NmcmFnQ29ubmVjdGlvbklERXJyICAgID0gICAtMjgwMSAgICNUaGUgY29ubmVjdGlvbiBJRCB3YXMgbm90IHZhbGlkLgorY2ZyYWdGaXJzdEVyckNvZGUgICA9ICAgLTI4MDAgICAjVGhlIGZpcnN0IHZhbHVlIGluIHRoZSByYW5nZSBvZiBDRk0gZXJyb3JzLgorZXJyQVNJbmNvbnNpc3RlbnROYW1lcyAgPSAgIC0yNzgwICAgI0VuZ2xpc2ggZXJyb3JzOgorZXJyQVNOb1Jlc3VsdFJldHVybmVkICAgPSAgIC0yNzYzICAgI1RoZSByYW5nZSAtMjc4MCB0aHJ1IC0yNzk5IGlzIHJlc2VydmVkIGZvciBkaWFsZWN0IHNwZWNpZmljIGVycm9yIGNvZGVzLiAoRXJyb3IgY29kZXMgZnJvbSBkaWZmZXJlbnQgZGlhbGVjdHMgbWF5IG92ZXJsYXAuKQorZXJyQVNQYXJhbWV0ZXJOb3RGb3JFdmVudCAgID0gICAtMjc2MiAgICNlcnJBU1BhcmFtZXRlck5vdEZvckV2ZW50CitlcnJBU0lsbGVnYWxGb3JtYWxQYXJhbWV0ZXIgPSAgIC0yNzYxICAgI2VyckFTSWxsZWdhbEZvcm1hbFBhcmFtZXRlcgorZXJyQVNUZXJtaW5vbG9neU5lc3RpbmdUb29EZWVwICA9ICAgLTI3NjAgICAjZXJyQVNUZXJtaW5vbG9neU5lc3RpbmdUb29EZWVwCitPU0FDb250cm9sRmxvd0Vycm9yID0gICAtMjc1NSAgICNTaWduYWxlZCB3aGVuIGlsbGVnYWwgY29udHJvbCBmbG93IG9jY3VycyBpbiBhbiBhcHBsaWNhdGlvbiAobm8gY2F0Y2hlciBmb3IgdGhyb3csIG5vbi1sZXhpY2FsIGxvb3AgZXhpdCwgZXRjLikKK09TQUluY29uc2lzdGVudERlY2xhcmF0aW9ucyA9ICAgLTI3NTQgICAjU2lnbmFsZWQgd2hlbiBhIHZhcmlhYmxlIGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5IGluIHRoZSBzYW1lIHNjb3BlLCBzdWNoIGFzIGJvdGggbG9jYWwgYW5kIGdsb2JhbAorT1NBVW5kZWZpbmVkVmFyaWFibGUgICAgPSAgIC0yNzUzICAgI1NpZ25hbGVkIHdoZW4gYSB2YXJpYWJsZSBpcyBhY2Nlc3NlZCB0aGF0IGhhcyBubyB2YWx1ZQorT1NBRHVwbGljYXRlSGFuZGxlciA9ICAgLTI3NTIgICAjU2lnbmFsZWQgd2hlbiBtb3JlIHRoYW4gb25lIGhhbmRsZXIgaXMgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gYSBzY29wZSB3aGVyZSB0aGUgbGFuZ3VhZ2UgZG9lc24ndCBhbGxvdyBpdAorT1NBRHVwbGljYXRlUHJvcGVydHkgICAgPSAgIC0yNzUxICAgI1NpZ25hbGVkIHdoZW4gYSBmb3JtYWwgcGFyYW1ldGVyLCBsb2NhbCB2YXJpYWJsZSwgb3IgaW5zdGFuY2UgdmFyaWFibGUgaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlLgorT1NBRHVwbGljYXRlUGFyYW1ldGVyICAgPSAgIC0yNzUwICAgI1NpZ25hbGVkIHdoZW4gYSBmb3JtYWwgcGFyYW1ldGVyLCBsb2NhbCB2YXJpYWJsZSwgb3IgaW5zdGFuY2UgdmFyaWFibGUgaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlCitPU0FUb2tlblRvb0xvbmcgPSAgIC0yNzQyICAgI1NpZ25hbGVkIHdoZW4gYSBuYW1lIG9yIG51bWJlciBpcyB0b28gbG9uZyB0byBiZSBwYXJzZWQKK09TQVN5bnRheFR5cGVFcnJvciAgPSAgIC0yNzQxICAgI1NpZ25hbGVkIHdoZW4gYW5vdGhlciBmb3JtIG9mIHN5bnRheCB3YXMgZXhwZWN0ZWQuIChlLmcuICJleHBlY3RlZCBhIDx0eXBlPiBidXQgZm91bmQgPHRoaXM+IikKK09TQVN5bnRheEVycm9yICA9ICAgLTI3NDAgICAjU2lnbmFsZWQgd2hlbiBhIHN5bnRheCBlcnJvciBvY2N1cnMuIChlLmcuICJTeW50YXggZXJyb3IiIG9yICI8dGhpcz4gY2FuJ3QgZ28gYWZ0ZXIgPHRoYXQ+IikKK2VyckFTQ2FudENvbXBhcmVNb3JlVGhhbjMyayA9ICAgLTI3MjEgICAjUGFyc2VyL0NvbXBpbGVyIGVycm9yczoKK2VyckFTQ2FudENvbnNpZGVyQW5kSWdub3JlICA9ICAgLTI3MjAgICAjZXJyQVNDYW50Q29uc2lkZXJBbmRJZ25vcmUKK2Vyck9TQUNhbnRDcmVhdGUgICAgPSAgIC0yNzEwICAgI2Vyck9TQUNhbnRDcmVhdGUKK2Vyck9TQUNhbnRHZXRUZXJtaW5vbG9neSAgICA9ICAgLTI3MDkgICAjZXJyT1NBQ2FudEdldFRlcm1pbm9sb2d5CitlcnJPU0FEYXRhQmxvY2tUb29MYXJnZSA9ICAgLTI3MDggICAjU2lnbmFsZWQgd2hlbiBhbiBpbnRyaW5zaWMgbGltaXRhdGlvbiBpcyBleGNlZWRlZCBmb3IgdGhlIHNpemUgb2YgYSB2YWx1ZSBvciBkYXRhIHN0cnVjdHVyZS4KK2Vyck9TQUludGVybmFsVGFibGVPdmVyZmxvdyA9ICAgLTI3MDcgICAjU2lnbmFsZWQgd2hlbiBhIHJ1bnRpbWUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgb3ZlcmZsb3dzCitlcnJPU0FTdGFja092ZXJmbG93ID0gICAtMjcwNiAgICNTaWduYWxlZCB3aGVuIHRoZSBydW50aW1lIHN0YWNrIG92ZXJmbG93cworZXJyT1NBQ29ycnVwdFRlcm1pbm9sb2d5ICAgID0gICAtMjcwNSAgICNTaWduYWxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uJ3MgdGVybWlub2xvZ3kgcmVzb3VyY2UgaXMgbm90IHJlYWRhYmxlCitlcnJPU0FBcHBOb3RIaWdoTGV2ZWxFdmVudEF3YXJlID0gICAtMjcwNCAgICNTaWduYWxlZCB3aGVuIGFuIGFwcGxpY2F0aW9uIGNhbid0IHJlc3BvbmQgdG8gQXBwbGVFdmVudHMKK2Vyck9TQUNhbnRMYXVuY2ggICAgPSAgIC0yNzAzICAgI1NpZ25hbGVkIHdoZW4gYXBwbGljYXRpb24gY2FuJ3QgYmUgbGF1bmNoZWQgb3Igd2hlbiBpdCBpcyByZW1vdGUgYW5kIHByb2dyYW0gbGlua2luZyBpcyBub3QgZW5hYmxlZAorZXJyT1NBTnVtZXJpY092ZXJmbG93ICAgPSAgIC0yNzAyICAgI1NpZ25hbGVkIHdoZW4gaW50ZWdlciBvciByZWFsIHZhbHVlIGlzIHRvbyBsYXJnZSB0byBiZSByZXByZXNlbnRlZAorZXJyT1NBRGl2aWRlQnlaZXJvICA9ICAgLTI3MDEgICAjU2lnbmFsZWQgd2hlbiB0aGVyZSBpcyBhbiBhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvCitlcnJPU0FHZW5lcmFsRXJyb3IgID0gICAtMjcwMCAgICNTaWduYWxlZCBieSB1c2VyIHNjcmlwdHMgb3IgYXBwbGljYXRpb25zIHdoZW4gbm8gYWN0dWFsIGVycm9yIGNvZGUgaXMgdG8gYmUgcmV0dXJuZWQuCitub0ljb25EYXRhQXZhaWxhYmxlRXJyICA9ICAgLTI1ODIgICAjVGhlIG5lY2Vzc2FyeSBpY29uIGRhdGEgaXMgbm90IGF2YWlsYWJsZQorbm9TdWNoSWNvbkVyciAgID0gICAtMjU4MSAgICNUaGUgcmVxdWVzdGVkIGljb24gY291bGQgbm90IGJlIGZvdW5kCitpbnZhbGlkSWNvblJlZkVyciAgID0gICAtMjU4MCAgICNUaGUgaWNvbiByZWYgaXMgbm90IHZhbGlkCituckNhbGxOb3RTdXBwb3J0ZWQgID0gICAtMjU1NyAgICNUaGlzIGNhbGwgaXMgbm90IGF2YWlsYWJsZSBvciBzdXBwb3J0ZWQgb24gdGhpcyBtYWNoaW5lCituclRyYW5zYWN0aW9uQWJvcnRlZCAgICA9ICAgLTI1NTYgICAjdHJhbnNhY3Rpb24gd2FzIGFib3J0ZWQKK25yRXhpdGVkSXRlcmF0b3JTY29wZSAgID0gICAtMjU1NSAgICNvdXRlciBzY29wZSBvZiBpdGVyYXRvciB3YXMgZXhpdGVkCituckl0ZXJhdGlvbkRvbmUgPSAgIC0yNTU0ICAgI2l0ZXJhdGlvbiBvcGVyYXRpb24gaXMgZG9uZQorbnJQcm9wZXJ0eUFscmVhZHlFeGlzdHMgPSAgIC0yNTUzICAgI3Byb3BlcnR5IGFscmVhZHkgZXhpc3RzCituckludmFsaWRFbnRyeUl0ZXJhdGlvbk9wICAgPSAgIC0yNTUyICAgI2ludmFsaWQgZW50cnkgaXRlcmF0aW9uIG9wZXJhdGlvbgorbnJQYXRoQnVmZmVyVG9vU21hbGwgICAgPSAgIC0yNTUxICAgI2J1ZmZlciBmb3IgcGF0aCBpcyB0b28gc21hbGwKK25yUGF0aE5vdEZvdW5kICA9ICAgLTI1NTAgICAjYSBwYXRoIGNvbXBvbmVudCBsb29rdXAgZmFpbGVkCituclJlc3VsdENvZGVCYXNlICAgID0gICAtMjU0OSAgICNuclJlc3VsdENvZGVCYXNlCituck92ZXJydW5FcnIgICAgPSAgIC0yNTQ4ICAgI25yT3ZlcnJ1bkVycgorbnJOb3RNb2RpZmllZEVyciAgICA9ICAgLTI1NDcgICAjbnJOb3RNb2RpZmllZEVycgorbnJUeXBlTWlzbWF0Y2hFcnIgICA9ICAgLTI1NDYgICAjbnJUeXBlTWlzbWF0Y2hFcnIKK25yUG93ZXJTd2l0Y2hBYm9ydEVyciAgID0gICAtMjU0NSAgICNuclBvd2VyU3dpdGNoQWJvcnRFcnIKK25yUG93ZXJFcnIgID0gICAtMjU0NCAgICNuclBvd2VyRXJyCituckRhdGFUcnVuY2F0ZWRFcnIgID0gICAtMjU0MyAgICNuckRhdGFUcnVuY2F0ZWRFcnIKK25yTm90U2xvdERldmljZUVyciAgPSAgIC0yNTQyICAgI25yTm90U2xvdERldmljZUVycgorbnJOYW1lRXJyICAgPSAgIC0yNTQxICAgI25yTmFtZUVycgorbnJOb3RDcmVhdGVkRXJyID0gICAtMjU0MCAgICNuck5vdENyZWF0ZWRFcnIKK25yTm90Rm91bmRFcnIgICA9ICAgLTI1MzkgICAjbnJOb3RGb3VuZEVycgorbnJJbnZhbGlkTm9kZUVyciAgICA9ICAgLTI1MzggICAjbnJJbnZhbGlkTm9kZUVycgorbnJOb3RFbm91Z2hNZW1vcnlFcnIgICAgPSAgIC0yNTM3ICAgI25yTm90RW5vdWdoTWVtb3J5RXJyCituckxvY2tlZEVyciA9ICAgLTI1MzYgICAjbnJMb2NrZWRFcnIKK21tSW50ZXJuYWxFcnJvciA9ICAgLTI1MjYgICAjbW1JbnRlcm5hbEVycm9yCit0c21EZWZhdWx0SXNOb3RJbnB1dE1ldGhvZEVyciAgID0gICAtMjUyNCAgICNDdXJyZW50IElucHV0IHNvdXJjZSBpcyBLQ0hSIG9yIHVjaHIsIG5vdCBJbnB1dCBNZXRob2QgIChHZXREZWZhdWx0SW5wdXRNZXRob2QpCit0c21Ob1N0ZW0gICA9ICAgLTI1MjMgICAjTm8gc3RlbSBleGlzdHMgZm9yIHRoZSB0b2tlbgordHNtTm9Nb3JlVG9rZW5zID0gICAtMjUyMiAgICNObyBtb3JlIHRva2VucyBhcmUgYXZhaWxhYmxlIGZvciB0aGUgc291cmNlIHRleHQKK3RzbU5vSGFuZGxlciAgICA9ICAgLTI1MjEgICAjTm8gQ2FsbGJhY2sgSGFuZGxlciBleGlzdHMgZm9yIGNhbGxiYWNrCit0c21JbnZhbGlkQ29udGV4dCAgID0gICAtMjUyMCAgICNJbnZhbGlkIFRTTUNvbnRleHQgc3BlY2lmaWVkIGluIGNhbGwKK3RzbVVua25vd25FcnIgICA9ICAgLTI1MTkgICAjYW55IG90aGVyIGVycm9ycwordHNtVW5zdXBwb3J0ZWRUeXBlRXJyICAgPSAgIC0yNTE4ICAgI3VuU3VwcG9ydGVkIGludGVyZmFjZSB0eXBlIGVycm9yCit0c21TY3JpcHRIYXNOb0lNRXJyID0gICAtMjUxNyAgICNzY3JpcHQgaGFzIG5vIGltcHV0IG1ldGhvZCBvciBpcyB1c2luZyBvbGQgSU0KK3RzbUlucHV0TWV0aG9kSXNPbGRFcnIgID0gICAtMjUxNiAgICNyZXR1cm5lZCBieSBHZXREZWZhdWx0SW5wdXRNZXRob2QKK3RzbUNvbXBvbmVudEFscmVhZHlPcGVuRXJyICA9ICAgLTI1MTUgICAjdGV4dCBzZXJ2aWNlIGFscmVhZHkgb3BlbmVkIGZvciB0aGUgZG9jdW1lbnQKK3RzbVRTTm90T3BlbkVyciA9ICAgLTI1MTQgICAjdGV4dCBzZXJ2aWNlIGlzIG5vdCBvcGVuCit0c21UU0hhc05vTWVudUVyciAgID0gICAtMjUxMyAgICN0aGUgdGV4dCBzZXJ2aWNlIGhhcyBubyBtZW51Cit0c21Vc2VJbnB1dFdpbmRvd0VyciAgICA9ICAgLTI1MTIgICAjbm90IFRTTSBhd2FyZSBiZWNhdXNlIHdlIGFyZSB1c2luZyBpbnB1dCB3aW5kb3cKK3RzbURvY3VtZW50T3BlbkVyciAgPSAgIC0yNTExICAgI3RoZXJlIGFyZSBvcGVuIGRvY3VtZW50cwordHNtVGV4dFNlcnZpY2VOb3RGb3VuZEVyciAgID0gICAtMjUxMCAgICNubyB0ZXh0IHNlcnZpY2UgZm91bmQKK3RzbUNhbnRPcGVuQ29tcG9uZW50RXJyID0gICAtMjUwOSAgICNjYW7VdCBvcGVuIHRoZSBjb21wb25lbnQKK3RzbU5vT3BlblRTRXJyICA9ICAgLTI1MDggICAjbm8gb3BlbiB0ZXh0IHNlcnZpY2UKK3RzbURvY05vdEFjdGl2ZUVyciAgPSAgIC0yNTA3ICAgI2RvY3VtZW50IGlzIE5PVCBhY3RpdmUKK3RzbVRTTURvY0J1c3lFcnIgICAgPSAgIC0yNTA2ICAgI2RvY3VtZW50IGlzIHN0aWxsIGFjdGl2ZQordHNtSW52YWxpZERvY0lERXJyICA9ICAgLTI1MDUgICAjaW52YWxpZCBUU00gZG9jdW1lbnRhdGlvbiBpZAordHNtTmV2ZXJSZWdpc3RlcmVkRXJyICAgPSAgIC0yNTA0ICAgI2FwcCBuZXZlciByZWdpc3RlcmVkIGVycm9yIChub3QgVFNNIGF3YXJlKQordHNtQWxyZWFkeVJlZ2lzdGVyZWRFcnIgPSAgIC0yNTAzICAgI3dhbnQgdG8gcmVnaXN0ZXIgYWdhaW4gZXJyb3IKK3RzbU5vdEFuQXBwRXJyICA9ICAgLTI1MDIgICAjbm90IGFuIGFwcGxpY2F0aW9uIGVycm9yCit0c21JbnB1dE1ldGhvZE5vdEZvdW5kRXJyICAgPSAgIC0yNTAxICAgI3RzbUlucHV0TWV0aG9kTm90Rm91bmRFcnIKK3RzbVVuc3VwU2NyaXB0TGFuZ3VhZ2VFcnIgICA9ICAgLTI1MDAgICAjdHNtVW5zdXBTY3JpcHRMYW5ndWFnZUVycgora2VybmVsVW5yZWNvdmVyYWJsZUVyciAgPSAgIC0yNDk5ICAgI2tlcm5lbFVucmVjb3ZlcmFibGVFcnIKK2tlcm5lbFJldHVyblZhbHVlRXJyICAgID0gICAtMjQyMiAgICNrZXJuZWxSZXR1cm5WYWx1ZUVycgora2VybmVsQWxyZWFkeUZyZWVFcnIgICAgPSAgIC0yNDIxICAgI2tlcm5lbEFscmVhZHlGcmVlRXJyCitrZXJuZWxJREVyciA9ICAgLTI0MTkgICAja2VybmVsSURFcnIKK2tlcm5lbEV4Y2VwdGlvbkVyciAgPSAgIC0yNDE4ICAgI2tlcm5lbEV4Y2VwdGlvbkVycgora2VybmVsVGVybWluYXRlZEVyciA9ICAgLTI0MTcgICAja2VybmVsVGVybWluYXRlZEVycgora2VybmVsSW5Vc2VFcnIgID0gICAtMjQxNiAgICNrZXJuZWxJblVzZUVycgora2VybmVsVGltZW91dEVyciAgICA9ICAgLTI0MTUgICAja2VybmVsVGltZW91dEVycgora2VybmVsQXN5bmNSZWNlaXZlTGltaXRFcnIgID0gICAtMjQxNCAgICNrZXJuZWxBc3luY1JlY2VpdmVMaW1pdEVycgora2VybmVsQXN5bmNTZW5kTGltaXRFcnIgPSAgIC0yNDEzICAgI2tlcm5lbEFzeW5jU2VuZExpbWl0RXJyCitrZXJuZWxBdHRyaWJ1dGVFcnIgID0gICAtMjQxMiAgICNrZXJuZWxBdHRyaWJ1dGVFcnIKK2tlcm5lbEV4ZWN1dGlvbkxldmVsRXJyID0gICAtMjQxMSAgICNrZXJuZWxFeGVjdXRpb25MZXZlbEVycgora2VybmVsRGVsZXRlUGVybWlzc2lvbkVyciAgID0gICAtMjQxMCAgICNrZXJuZWxEZWxldGVQZXJtaXNzaW9uRXJyCitrZXJuZWxFeGVjdXRlUGVybWlzc2lvbkVyciAgPSAgIC0yNDA5ICAgI2tlcm5lbEV4ZWN1dGVQZXJtaXNzaW9uRXJyCitrZXJuZWxSZWFkUGVybWlzc2lvbkVyciA9ICAgLTI0MDggICAja2VybmVsUmVhZFBlcm1pc3Npb25FcnIKK2tlcm5lbFdyaXRlUGVybWlzc2lvbkVyciAgICA9ICAgLTI0MDcgICAja2VybmVsV3JpdGVQZXJtaXNzaW9uRXJyCitrZXJuZWxPYmplY3RFeGlzdHNFcnIgICA9ICAgLTI0MDYgICAja2VybmVsT2JqZWN0RXhpc3RzRXJyCitrZXJuZWxVbnN1cHBvcnRlZEVyciAgICA9ICAgLTI0MDUgICAja2VybmVsVW5zdXBwb3J0ZWRFcnIKK2tlcm5lbFByaXZpbGVnZUVyciAgPSAgIC0yNDA0ICAgI2tlcm5lbFByaXZpbGVnZUVycgora2VybmVsT3B0aW9uc0VyciAgICA9ICAgLTI0MDMgICAja2VybmVsT3B0aW9uc0Vycgora2VybmVsQ2FuY2VsZWRFcnIgICA9ICAgLTI0MDIgICAja2VybmVsQ2FuY2VsZWRFcnIKK2tlcm5lbEluY29tcGxldGVFcnIgPSAgIC0yNDAxICAgI2tlcm5lbEluY29tcGxldGVFcnIKK2JhZENhbGxPcmRlckVyciA9ICAgLTIyMDkgICAjVXN1YWxseSBkdWUgdG8gYSBzdGF0dXMgY2FsbCBiZWluZyBjYWxsZWQgcHJpb3IgdG8gYmVpbmcgc2V0dXAgZmlyc3QKK25vRE1BRXJyICAgID0gICAtMjIwOCAgICNDYW7VdCBkbyBETUEgZGlnaXRpemluZyAoaS5lLiBjYW4ndCBnbyB0byByZXF1ZXN0ZWQgZGVzdAorYmFkRGVwdGhFcnIgPSAgIC0yMjA3ICAgI0NhbtV0IGRpZ2l0aXplIGludG8gdGhpcyBkZXB0aAorbm90RXhhY3RTaXplRXJyID0gICAtMjIwNiAgICNDYW7VdCBkbyBleGFjdCBzaXplIHJlcXVlc3RlZAorbm9Nb3JlS2V5Q29sb3JzRXJyICA9ICAgLTIyMDUgICAjYWxsIGtleSBpbmRleGVzIGluIHVzZQorbm90RXhhY3RNYXRyaXhFcnIgICA9ICAgLTIyMDQgICAjd2FybmluZyBvZiBiYWQgbWF0cml4LCBkaWdpdGl6ZXIgZGlkIGl0cyBiZXN0CittYXRyaXhFcnIgICA9ICAgLTIyMDMgICAjYmFkIG1hdHJpeCwgZGlnaXRpemVyIGRpZCBub3RoaW5nCitxdFBhcmFtRXJyICA9ICAgLTIyMDIgICAjYmFkIGlucHV0IHBhcmFtZXRlciAob3V0IG9mIHJhbmdlLCBldGMpCitkaWdpVW5pbXBFcnIgICAgPSAgIC0yMjAxICAgI2ZlYXR1cmUgdW5pbXBsZW1lbnRlZAorcXRYTUxBcHBsaWNhdGlvbkVyciA9ICAgLTIxNTkgICAjcXRYTUxBcHBsaWNhdGlvbkVycgorcXRYTUxQYXJzZUVyciAgID0gICAtMjE1OCAgICNxdFhNTFBhcnNlRXJyCitxdEFjdGlvbk5vdEhhbmRsZWRFcnIgICA9ICAgLTIxNTcgICAjcXRBY3Rpb25Ob3RIYW5kbGVkRXJyCitub3RFbm91Z2hEYXRhRXJyICAgID0gICAtMjE0OSAgICNub3RFbm91Z2hEYXRhRXJyCit1cmxEYXRhSEZUUFVSTEVyciAgID0gICAtMjE0OCAgICN1cmxEYXRhSEZUUFVSTEVycgordXJsRGF0YUhGVFBTZXJ2ZXJEaXNjb25uZWN0ZWRFcnIgICAgPSAgIC0yMTQ3ICAgI3VybERhdGFIRlRQU2VydmVyRGlzY29ubmVjdGVkRXJyCit1cmxEYXRhSEZUUE5vUGFzc3dvcmRFcnIgICAgPSAgIC0yMTQ2ICAgI3VybERhdGFIRlRQTm9QYXNzd29yZEVycgordXJsRGF0YUhGVFBOZWVkUGFzc3dvcmRFcnIgID0gICAtMjE0NSAgICN1cmxEYXRhSEZUUE5lZWRQYXNzd29yZEVycgordXJsRGF0YUhGVFBCYWROYW1lTGlzdEVyciAgID0gICAtMjE0NCAgICN1cmxEYXRhSEZUUEJhZE5hbWVMaXN0RXJyCit1cmxEYXRhSEZUUE5vTmV0RHJpdmVyRXJyICAgPSAgIC0yMTQzICAgI3VybERhdGFIRlRQTm9OZXREcml2ZXJFcnIKK3VybERhdGFIRlRQRmlsZW5hbWVFcnIgID0gICAtMjE0MiAgICN1cmxEYXRhSEZUUEZpbGVuYW1lRXJyCit1cmxEYXRhSEZUUFBlcm1pc3Npb25zRXJyICAgPSAgIC0yMTQxICAgI3VybERhdGFIRlRQUGVybWlzc2lvbnNFcnIKK3VybERhdGFIRlRQUXVvdGFFcnIgPSAgIC0yMTQwICAgI3VybERhdGFIRlRQUXVvdGFFcnIKK3VybERhdGFIRlRQTm9EaXJlY3RvcnlFcnIgICA9ICAgLTIxMzkgICAjdXJsRGF0YUhGVFBOb0RpcmVjdG9yeUVycgordXJsRGF0YUhGVFBEYXRhQ29ubmVjdGlvbkVyciAgICA9ICAgLTIxMzggICAjdXJsRGF0YUhGVFBEYXRhQ29ubmVjdGlvbkVycgordXJsRGF0YUhGVFBTZXJ2ZXJFcnIgICAgPSAgIC0yMTM3ICAgI3VybERhdGFIRlRQU2VydmVyRXJyCit1cmxEYXRhSEZUUEJhZFBhc3N3b3JkRXJyICAgPSAgIC0yMTM2ICAgI3VybERhdGFIRlRQQmFkUGFzc3dvcmRFcnIKK3VybERhdGFIRlRQQmFkVXNlckVyciAgID0gICAtMjEzNSAgICN1cmxEYXRhSEZUUEJhZFVzZXJFcnIKK3VybERhdGFIRlRQU2h1dGRvd25FcnIgID0gICAtMjEzNCAgICN1cmxEYXRhSEZUUFNodXRkb3duRXJyCit1cmxEYXRhSEZUUFByb3RvY29sRXJyICA9ICAgLTIxMzMgICAjdXJsRGF0YUhGVFBQcm90b2NvbEVycgordXJsRGF0YUhIVFRQUmVkaXJlY3RFcnIgPSAgIC0yMTMyICAgI3VybERhdGFISFRUUFJlZGlyZWN0RXJyCit1cmxEYXRhSEhUVFBVUkxFcnIgID0gICAtMjEzMSAgICN1cmxEYXRhSEhUVFBVUkxFcnIKK3VybERhdGFISFRUUE5vTmV0RHJpdmVyRXJyICA9ICAgLTIxMzAgICAjdXJsRGF0YUhIVFRQTm9OZXREcml2ZXJFcnIKK3VybERhdGFISFRUUFByb3RvY29sRXJyID0gICAtMjEyOSAgICN1cmxEYXRhSEhUVFBQcm90b2NvbEVycgorcXROZXR3b3JrQWxyZWFkeUFsbG9jYXRlZEVyciAgICA9ICAgLTIxMjcgICAjcXROZXR3b3JrQWxyZWFkeUFsbG9jYXRlZEVycgorbm90QWxsb3dlZFRvU2F2ZU1vdmllRXJyICAgID0gICAtMjEyNiAgICNub3RBbGxvd2VkVG9TYXZlTW92aWVFcnIKK2ZpbGVPZmZzZXRUb29CaWdFcnIgPSAgIC0yMTI1ICAgI2ZpbGVPZmZzZXRUb29CaWdFcnIKK0FTREVudHJ5Tm90Rm91bmRFcnIgPSAgIC0yMTI0ICAgI0FTREVudHJ5Tm90Rm91bmRFcnIKK0FTREJhZEZvcmtFcnIgICA9ICAgLTIxMjMgICAjQVNEQmFkRm9ya0VycgorQVNEQmFkSGVhZGVyRXJyID0gICAtMjEyMiAgICNBU0RCYWRIZWFkZXJFcnIKK0FBUE5vdEZvdW5kRXJyICA9ICAgLTIxMjEgICAjQUFQTm90Rm91bmRFcnIKK0FBUE5vdENyZWF0ZWRFcnIgICAgPSAgIC0yMTIwICAgI0FBUE5vdENyZWF0ZWRFcnIKK3FmY2JOb3RDcmVhdGVkRXJyICAgPSAgIC0yMTE5ICAgI3FmY2JOb3RDcmVhdGVkRXJyCitxZmNiTm90Rm91bmRFcnIgPSAgIC0yMTE4ICAgI3FmY2JOb3RGb3VuZEVycgord2Fja0JhZE1ldGFEYXRhRXJyICA9ICAgLTIxMTcgICAjd2Fja0JhZE1ldGFEYXRhRXJyCit3YWNrRm9ya05vdEZvdW5kRXJyID0gICAtMjExNiAgICN3YWNrRm9ya05vdEZvdW5kRXJyCit3YWNrQmFkRmlsZUVyciAgPSAgIC0yMTE1ICAgI3dhY2tCYWRGaWxlRXJyCit1bmtub3duRm9ybWF0RXJyICAgID0gICAtMjExNCAgICN1bmtub3duRm9ybWF0RXJyCitwYXRoTm90VmVyaWZpZWRFcnIgID0gICAtMjExMyAgICNwYXRoTm90VmVyaWZpZWRFcnIKK25vUGF0aE1hcHBpbmdFcnIgICAgPSAgIC0yMTEyICAgI25vUGF0aE1hcHBpbmdFcnIKK2VtcHR5UGF0aEVyciAgICA9ICAgLTIxMTEgICAjZW1wdHlQYXRoRXJyCitwYXRoVG9vTG9uZ0VyciAgPSAgIC0yMTEwICAgI3BhdGhUb29Mb25nRXJyCitjYW5ub3RCZUxlYWZBdG9tRXJyID0gICAtMjEwOSAgICNjYW5ub3RCZUxlYWZBdG9tRXJyCitpbnZhbGlkQXRvbVR5cGVFcnIgID0gICAtMjEwOCAgICNpbnZhbGlkQXRvbVR5cGVFcnIKK2ludmFsaWRBdG9tQ29udGFpbmVyRXJyID0gICAtMjEwNyAgICNpbnZhbGlkQXRvbUNvbnRhaW5lckVycgoraW52YWxpZEF0b21FcnIgID0gICAtMjEwNiAgICNpbnZhbGlkQXRvbUVycgorZHVwbGljYXRlQXRvbVR5cGVBbmRJREVyciAgID0gICAtMjEwNSAgICNkdXBsaWNhdGVBdG9tVHlwZUFuZElERXJyCithdG9tSW5kZXhJbnZhbGlkRXJyID0gICAtMjEwNCAgICNhdG9tSW5kZXhJbnZhbGlkRXJyCithdG9tc05vdE9mU2FtZVR5cGVFcnIgICA9ICAgLTIxMDMgICAjYXRvbXNOb3RPZlNhbWVUeXBlRXJyCitub3RMZWFmQXRvbUVyciAgPSAgIC0yMTAyICAgI25vdExlYWZBdG9tRXJyCitjYW5ub3RGaW5kQXRvbUVyciAgID0gICAtMjEwMSAgICNjYW5ub3RGaW5kQXRvbUVycgordW5zdXBwb3J0ZWRQcm9jZXNzb3JFcnIgPSAgIC0yMDk3ICAgI3Vuc3VwcG9ydGVkUHJvY2Vzc29yRXJyCit1bnN1cHBvcnRlZE9TRXJyICAgID0gICAtMjA5NiAgICN1bnN1cHBvcnRlZE9TRXJyCitxdG1sVW5pbml0aWFsaXplZCAgID0gICAtMjA5NSAgICNxdG1sVW5pbml0aWFsaXplZAorcXRtbERsbEVudHJ5Tm90Rm91bmRFcnIgPSAgIC0yMDk0ICAgI1dpbmRvd3Mgc3BlY2lmaWMgZXJyb3JzICh3aGVuIHF0bWwgaXMgbG9hZGluZykKK3F0bWxEbGxMb2FkRXJyICA9ICAgLTIwOTMgICAjV2luZG93cyBzcGVjaWZpYyBlcnJvcnMgKHdoZW4gcXRtbCBpcyBsb2FkaW5nKQorY29tcG9uZW50RGxsRW50cnlOb3RGb3VuZEVyciAgICA9ICAgLTIwOTIgICAjV2luZG93cyBzcGVjaWZpYyBlcnJvcnMgKHdoZW4gY29tcG9uZW50IGlzIGxvYWRpbmcpCitjb21wb25lbnREbGxMb2FkRXJyID0gICAtMjA5MSAgICNXaW5kb3dzIHNwZWNpZmljIGVycm9ycyAod2hlbiBjb21wb25lbnQgaXMgbG9hZGluZykKK3ZpZGVvT3V0cHV0SW5Vc2VFcnIgPSAgIC0yMDkwICAgI3ZpZGVvT3V0cHV0SW5Vc2VFcnIKK25vRXhwb3J0UHJvY0F2YWlsYWJsZUVyciAgICA9ICAgLTIwODkgICAjbm9FeHBvcnRQcm9jQXZhaWxhYmxlRXJyCit0dW5lUGFyc2VPU0VyciAgPSAgIC0yMDg3ICAgI3R1bmVQYXJzZU9TRXJyCit0dW5lUGxheWVyRnVsbE9TRXJyID0gICAtMjA4NiAgICN0dW5lUGxheWVyRnVsbE9TRXJyCitub3RlQ2hhbm5lbE5vdEFsbG9jYXRlZE9TRXJyICAgID0gICAtMjA4NSAgICNub3RlQ2hhbm5lbE5vdEFsbG9jYXRlZE9TRXJyCitpbGxlZ2FsTm90ZUNoYW5uZWxPU0VyciA9ICAgLTIwODQgICAjaWxsZWdhbE5vdGVDaGFubmVsT1NFcnIKK3N5bnRoZXNpemVyT1NFcnIgICAgPSAgIC0yMDgzICAgI3N5bnRoZXNpemVyT1NFcnIKK3N5bnRoZXNpemVyTm90UmVzcG9uZGluZ09TRXJyICAgPSAgIC0yMDgyICAgI3N5bnRoZXNpemVyTm90UmVzcG9uZGluZ09TRXJyCittaWRpTWFuYWdlckFic2VudE9TRXJyICA9ICAgLTIwODEgICAjbWlkaU1hbmFnZXJBYnNlbnRPU0VycgoraWxsZWdhbENvbnRyb2xsZXJPU0VyciAgPSAgIC0yMDgwICAgI2lsbGVnYWxDb250cm9sbGVyT1NFcnIKK2lsbGVnYWxJbnN0cnVtZW50T1NFcnIgID0gICAtMjA3OSAgICNpbGxlZ2FsSW5zdHJ1bWVudE9TRXJyCitpbGxlZ2FsS25vYlZhbHVlT1NFcnIgICA9ICAgLTIwNzggICAjaWxsZWdhbEtub2JWYWx1ZU9TRXJyCitpbGxlZ2FsS25vYk9TRXJyICAgID0gICAtMjA3NyAgICNpbGxlZ2FsS25vYk9TRXJyCitpbGxlZ2FsQ2hhbm5lbE9TRXJyID0gICAtMjA3NiAgICNpbGxlZ2FsQ2hhbm5lbE9TRXJyCitpbGxlZ2FsUGFydE9TRXJyICAgID0gICAtMjA3NSAgICNpbGxlZ2FsUGFydE9TRXJyCitpbGxlZ2FsVm9pY2VBbGxvY2F0aW9uT1NFcnIgPSAgIC0yMDc0ICAgI2lsbGVnYWxWb2ljZUFsbG9jYXRpb25PU0VycgorY2FudFJlY2VpdmVGcm9tU3ludGhlc2l6ZXJPU0VyciA9ICAgLTIwNzMgICAjY2FudFJlY2VpdmVGcm9tU3ludGhlc2l6ZXJPU0VycgorY2FudFNlbmRUb1N5bnRoZXNpemVyT1NFcnIgID0gICAtMjA3MiAgICNjYW50U2VuZFRvU3ludGhlc2l6ZXJPU0Vycgorbm90SW1wbGVtZW50ZWRNdXNpY09TRXJyICAgID0gICAtMjA3MSAgICNub3RJbXBsZW1lbnRlZE11c2ljT1NFcnIKK2ludGVybmFsQ29tcG9uZW50RXJyICAgID0gICAtMjA3MCAgICNpbnRlcm5hbENvbXBvbmVudEVycgoraW52YWxpZFNwcml0ZUlERXJyICA9ICAgLTIwNjkgICAjaW52YWxpZFNwcml0ZUlERXJyCitpbnZhbGlkSW1hZ2VJbmRleEVyciAgICA9ICAgLTIwNjggICAjaW52YWxpZEltYWdlSW5kZXhFcnIKK2ludmFsaWRTcHJpdGVJbmRleEVyciAgID0gICAtMjA2NyAgICNpbnZhbGlkU3ByaXRlSW5kZXhFcnIKK2dXb3JsZHNOb3RTYW1lRGVwdGhBbmRTaXplRXJyICAgPSAgIC0yMDY2ICAgI2dXb3JsZHNOb3RTYW1lRGVwdGhBbmRTaXplRXJyCitpbnZhbGlkU3ByaXRlUHJvcGVydHlFcnIgICAgPSAgIC0yMDY1ICAgI2ludmFsaWRTcHJpdGVQcm9wZXJ0eUVycgoraW52YWxpZFNwcml0ZVdvcmxkUHJvcGVydHlFcnIgICA9ICAgLTIwNjQgICAjaW52YWxpZFNwcml0ZVdvcmxkUHJvcGVydHlFcnIKK21pc3NpbmdSZXF1aXJlZFBhcmFtZXRlckVyciA9ICAgLTIwNjMgICAjbWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyRXJyCittb3ZpZVRleHROb3RGb3VuZEVyciAgICA9ICAgLTIwNjIgICAjbW92aWVUZXh0Tm90Rm91bmRFcnIKK3NvdXJjZU5vdEZvdW5kRXJyICAgPSAgIC0yMDYxICAgI3NvdXJjZU5vdEZvdW5kRXJyCitub1NvdXJjZVRyZWVGb3VuZEVyciAgICA9ICAgLTIwNjAgICAjbm9Tb3VyY2VUcmVlRm91bmRFcnIKK3NhbXBsZXNBbHJlYWR5SW5NZWRpYUVyciAgICA9ICAgLTIwNTkgICAjc2FtcGxlc0FscmVhZHlJbk1lZGlhRXJyCithdXhpbGlhcnlFeHBvcnREYXRhVW5hdmFpbGFibGUgID0gICAtMjA1OCAgICNhdXhpbGlhcnlFeHBvcnREYXRhVW5hdmFpbGFibGUKK3Vuc3VwcG9ydGVkQXV4aWxpYXJ5SW1wb3J0RGF0YSAgPSAgIC0yMDU3ICAgI3Vuc3VwcG9ydGVkQXV4aWxpYXJ5SW1wb3J0RGF0YQorc291bmRTdXBwb3J0Tm90QXZhaWxhYmxlRXJyID0gICAtMjA1NiAgICNRVCBmb3IgV2luZG93cyBlcnJvcgorbm9Tb3VuZFRyYWNrSW5Nb3ZpZUVyciAgPSAgIC0yMDU1ICAgI1FUIGZvciBXaW5kb3dzIGVycm9yCitub1ZpZGVvVHJhY2tJbk1vdmllRXJyICA9ICAgLTIwNTQgICAjUVQgZm9yIFdpbmRvd3MgZXJyb3IKK2ZlYXR1cmVVbnN1cHBvcnRlZCAgPSAgIC0yMDUzICAgI2ZlYXR1cmVVbnN1cHBvcnRlZAorY291bGROb3RVc2VBbkV4aXN0aW5nU2FtcGxlID0gICAtMjA1MiAgICNjb3VsZE5vdFVzZUFuRXhpc3RpbmdTYW1wbGUKK25vRGVmYXVsdERhdGFSZWYgICAgPSAgIC0yMDUxICAgI25vRGVmYXVsdERhdGFSZWYKK2JhZERhdGFSZWZJbmRleCA9ICAgLTIwNTAgICAjYmFkRGF0YVJlZkluZGV4CitpbnZhbGlkRGF0YVJlZkNvbnRhaW5lciA9ICAgLTIwNDkgICAjaW52YWxpZERhdGFSZWZDb250YWluZXIKK25vTW92aWVGb3VuZCAgICA9ICAgLTIwNDggICAjbm9Nb3ZpZUZvdW5kCitkYXRhTm9EYXRhUmVmICAgPSAgIC0yMDQ3ICAgI2RhdGFOb0RhdGFSZWYKK2VuZE9mRGF0YVJlYWNoZWQgICAgPSAgIC0yMDQ2ICAgI2VuZE9mRGF0YVJlYWNoZWQKK2RhdGFBbHJlYWR5Q2xvc2VkICAgPSAgIC0yMDQ1ICAgI2RhdGFBbHJlYWR5Q2xvc2VkCitkYXRhQWxyZWFkeU9wZW5Gb3JXcml0ZSA9ICAgLTIwNDQgICAjZGF0YUFscmVhZHlPcGVuRm9yV3JpdGUKK2RhdGFOb3RPcGVuRm9yV3JpdGUgPSAgIC0yMDQzICAgI2RhdGFOb3RPcGVuRm9yV3JpdGUKK2RhdGFOb3RPcGVuRm9yUmVhZCAgPSAgIC0yMDQyICAgI2RhdGFOb3RPcGVuRm9yUmVhZAoraW52YWxpZFNhbXBsZURlc2NyaXB0aW9uICAgID0gICAtMjA0MSAgICNpbnZhbGlkU2FtcGxlRGVzY3JpcHRpb24KK2ludmFsaWRDaHVua0NhY2hlICAgPSAgIC0yMDQwICAgI2ludmFsaWRDaHVua0NhY2hlCitpbnZhbGlkU2FtcGxlRGVzY0luZGV4ICA9ICAgLTIwMzkgICAjaW52YWxpZFNhbXBsZURlc2NJbmRleAoraW52YWxpZENodW5rTnVtID0gICAtMjAzOCAgICNpbnZhbGlkQ2h1bmtOdW0KK2ludmFsaWRTYW1wbGVOdW0gICAgPSAgIC0yMDM3ICAgI2ludmFsaWRTYW1wbGVOdW0KK2ludmFsaWRSZWN0ID0gICAtMjAzNiAgICNpbnZhbGlkUmVjdAorY2FudEVuYWJsZVRyYWNrID0gICAtMjAzNSAgICNjYW50RW5hYmxlVHJhY2sKK2ludGVybmFsUXVpY2tUaW1lRXJyb3IgID0gICAtMjAzNCAgICNpbnRlcm5hbFF1aWNrVGltZUVycm9yCitiYWRFZGl0SW5kZXggICAgPSAgIC0yMDMzICAgI2JhZEVkaXRJbmRleAordGltZU5vdEluTWVkaWEgID0gICAtMjAzMiAgICN0aW1lTm90SW5NZWRpYQordGltZU5vdEluVHJhY2sgID0gICAtMjAzMSAgICN0aW1lTm90SW5UcmFjawordHJhY2tOb3RJbk1vdmllID0gICAtMjAzMCAgICN0cmFja05vdEluTW92aWUKK3RyYWNrSUROb3RGb3VuZCA9ICAgLTIwMjkgICAjdHJhY2tJRE5vdEZvdW5kCitiYWRUcmFja0luZGV4ICAgPSAgIC0yMDI4ICAgI2JhZFRyYWNrSW5kZXgKK21heFNpemVUb0dyb3dUb29TbWFsbCAgID0gICAtMjAyNyAgICNtYXhTaXplVG9Hcm93VG9vU21hbGwKK3VzZXJEYXRhSXRlbU5vdEZvdW5kICAgID0gICAtMjAyNiAgICN1c2VyRGF0YUl0ZW1Ob3RGb3VuZAorc3RhbGVFZGl0U3RhdGUgID0gICAtMjAyNSAgICNzdGFsZUVkaXRTdGF0ZQorbm9uTWF0Y2hpbmdFZGl0U3RhdGUgICAgPSAgIC0yMDI0ICAgI25vbk1hdGNoaW5nRWRpdFN0YXRlCitpbnZhbGlkRWRpdFN0YXRlICAgID0gICAtMjAyMyAgICNpbnZhbGlkRWRpdFN0YXRlCitjYW50Q3JlYXRlU2luZ2xlRm9ya0ZpbGUgICAgPSAgIC0yMDIyICAgI2hhcHBlbnMgd2hlbiBmaWxlIGFscmVhZHkgZXhpc3RzCit3ZkZpbGVOb3RGb3VuZCAgPSAgIC0yMDIxICAgI3dmRmlsZU5vdEZvdW5kCittb3ZpZVRvb2xib3hVbmluaXRpYWxpemVkICAgPSAgIC0yMDIwICAgI21vdmllVG9vbGJveFVuaW5pdGlhbGl6ZWQKK3Byb2dyZXNzUHJvY0Fib3J0ZWQgPSAgIC0yMDE5ICAgI3Byb2dyZXNzUHJvY0Fib3J0ZWQKK21lZGlhVHlwZXNEb250TWF0Y2ggPSAgIC0yMDE4ICAgI21lZGlhVHlwZXNEb250TWF0Y2gKK2JhZEVkaXRMaXN0ID0gICAtMjAxNyAgICNiYWRFZGl0TGlzdAorY2FudFB1dFB1YmxpY01vdmllQXRvbSAgPSAgIC0yMDE2ICAgI2NhbnRQdXRQdWJsaWNNb3ZpZUF0b20KK2ludmFsaWRUaW1lID0gICAtMjAxNSAgICNpbnZhbGlkVGltZQoraW52YWxpZER1cmF0aW9uID0gICAtMjAxNCAgICNpbnZhbGlkRHVyYXRpb24KK2ludmFsaWRIYW5kbGVyICA9ICAgLTIwMTMgICAjaW52YWxpZEhhbmRsZXIKK2ludmFsaWREYXRhUmVmICA9ICAgLTIwMTIgICAjaW52YWxpZERhdGFSZWYKK2ludmFsaWRTYW1wbGVUYWJsZSAgPSAgIC0yMDExICAgI2ludmFsaWRTYW1wbGVUYWJsZQoraW52YWxpZE1vdmllICAgID0gICAtMjAxMCAgICNpbnZhbGlkTW92aWUKK2ludmFsaWRUcmFjayAgICA9ICAgLTIwMDkgICAjaW52YWxpZFRyYWNrCitpbnZhbGlkTWVkaWEgICAgPSAgIC0yMDA4ICAgI2ludmFsaWRNZWRpYQorbm9EYXRhSGFuZGxlciAgID0gICAtMjAwNyAgICNub0RhdGFIYW5kbGVyCitub01lZGlhSGFuZGxlciAgPSAgIC0yMDA2ICAgI25vTWVkaWFIYW5kbGVyCitiYWRDb21wb25lbnRUeXBlICAgID0gICAtMjAwNSAgICNiYWRDb21wb25lbnRUeXBlCitjYW50T3BlbkhhbmRsZXIgPSAgIC0yMDA0ICAgI2NhbnRPcGVuSGFuZGxlcgorY2FudEZpbmRIYW5kbGVyID0gICAtMjAwMyAgICNjYW50RmluZEhhbmRsZXIKK2JhZFB1YmxpY01vdmllQXRvbSAgPSAgIC0yMDAyICAgI2JhZFB1YmxpY01vdmllQXRvbQorYmFkSW1hZ2VEZXNjcmlwdGlvbiA9ICAgLTIwMDEgICAjYmFkSW1hZ2VEZXNjcmlwdGlvbgorY291bGROb3RSZXNvbHZlRGF0YVJlZiAgPSAgIC0yMDAwICAgI2NvdWxkTm90UmVzb2x2ZURhdGFSZWYKK25vbkRyYWdPcmlnaW5hdG9yRXJyICAgID0gICAtMTg2MiAgICNpbGxlZ2FsIGF0dGVtcHQgYXQgb3JpZ2luYXRvciBvbmx5IGRhdGEKK2JhZEltYWdlRXJyID0gICAtMTg2MSAgICNiYWQgdHJhbnNsdWNlbnQgaW1hZ2UgUGl4TWFwCitiYWRJbWFnZVJnbkVyciAgPSAgIC0xODYwICAgI2JhZCB0cmFuc2x1Y2VudCBpbWFnZSByZWdpb24KK25vU3VpdGFibGVEaXNwbGF5c0VyciAgID0gICAtMTg1OSAgICNubyBkaXNwbGF5cyBzdXBwb3J0IHRyYW5zbHVjZW5jeQordW5zdXBwb3J0ZWRGb3JQbGF0Zm9ybUVyciAgID0gICAtMTg1OCAgICNjYWxsIGlzIGZvciBQb3dlclBDIG9ubHkKK2RyYWdOb3RBY2NlcHRlZEVyciAgPSAgIC0xODU3ICAgI2RyYWcgd2FzIG5vdCBhY2NlcHRlZCBieSByZWNlaXZlcgoraGFuZGxlck5vdEZvdW5kRXJyICA9ICAgLTE4NTYgICAjaGFuZGxlciBub3QgZm91bmQKK2R1cGxpY2F0ZUhhbmRsZXJFcnIgPSAgIC0xODU1ICAgI2hhbmRsZXIgYWxyZWFkeSBleGlzdHMKK2NhbnRHZXRGbGF2b3JFcnIgICAgPSAgIC0xODU0ICAgI2Vycm9yIHdoaWxlIHRyeWluZyB0byBnZXQgZmxhdm9yIGRhdGEKK2R1cGxpY2F0ZUZsYXZvckVyciAgPSAgIC0xODUzICAgI2ZsYXZvciB0eXBlIGFscmVhZHkgZXhpc3RzCitiYWREcmFnRmxhdm9yRXJyICAgID0gICAtMTg1MiAgICN1bmtub3duIGZsYXZvciB0eXBlCitiYWREcmFnSXRlbUVyciAgPSAgIC0xODUxICAgI3Vua25vd24gZHJhZyBpdGVtIHJlZmVyZW5jZQorYmFkRHJhZ1JlZkVyciAgID0gICAtMTg1MCAgICN1bmtub3duIGRyYWcgcmVmZXJlbmNlCitlcnJFbmRPZkJvZHkgICAgPSAgIC0xODEzICAgI2VyckVuZE9mQm9keQorZXJyRW5kT2ZEb2N1bWVudCAgICA9ICAgLTE4MTIgICAjZXJyRW5kT2ZEb2N1bWVudAorZXJyVG9wT2ZCb2R5ICAgID0gICAtMTgxMSAgICNlcnJUb3BPZkJvZHkKK2VyclRvcE9mRG9jdW1lbnQgICAgPSAgIC0xODEwICAgI2VyclRvcE9mRG9jdW1lbnQKK2Vyck9mZnNldElzT3V0c2lkZU9mVmlldyAgICA9ICAgLTE4MDEgICAjZXJyT2Zmc2V0SXNPdXRzaWRlT2ZWaWV3CitlcnJPZmZzZXRJbnZhbGlkICAgID0gICAtMTgwMCAgICNlcnJPZmZzZXRJbnZhbGlkCitlcnJPU0FDYW50T3BlbkNvbXBvbmVudCA9ICAgLTE3NjIgICAjQ2FuJ3QgY29ubmVjdCB0byBzY3JpcHRpbmcgc3lzdGVtIHdpdGggdGhhdCBJRAorZXJyT1NBQ29tcG9uZW50TWlzbWF0Y2ggPSAgIC0xNzYxICAgI1BhcmFtZXRlcnMgYXJlIGZyb20gMiBkaWZmZXJlbnQgY29tcG9uZW50cworZXJyT1NBRGF0YUZvcm1hdFRvb05ldyAgPSAgIC0xNzU5ICAgI2Vyck9TQURhdGFGb3JtYXRUb29OZXcKK2Vyck9TQURhdGFGb3JtYXRPYnNvbGV0ZSAgICA9ICAgLTE3NTggICAjZXJyT1NBRGF0YUZvcm1hdE9ic29sZXRlCitlcnJPU0FOb1N1Y2hEaWFsZWN0ID0gICAtMTc1NyAgICNlcnJPU0FOb1N1Y2hEaWFsZWN0CitlcnJPU0FTb3VyY2VOb3RBdmFpbGFibGUgICAgPSAgIC0xNzU2ICAgI2Vyck9TQVNvdXJjZU5vdEF2YWlsYWJsZQorZXJyT1NBQmFkU2VsZWN0b3IgICA9ICAgLTE3NTQgICAjZXJyT1NBQmFkU2VsZWN0b3IKK2Vyck9TQVNjcmlwdEVycm9yICAgPSAgIC0xNzUzICAgI2Vyck9TQVNjcmlwdEVycm9yCitlcnJPU0FCYWRTdG9yYWdlVHlwZSAgICA9ICAgLTE3NTIgICAjZXJyT1NBQmFkU3RvcmFnZVR5cGUKK2Vyck9TQUludmFsaWRJRCA9ICAgLTE3NTEgICAjZXJyT1NBSW52YWxpZElECitlcnJPU0FTeXN0ZW1FcnJvciAgID0gICAtMTc1MCAgICNlcnJPU0FTeXN0ZW1FcnJvcgorZXJyQUVCdWZmZXJUb29TbWFsbCA9ICAgLTE3NDEgICAjYnVmZmVyIGZvciBBRUZsYXR0ZW5EZXNjIHRvbyBzbWFsbAorZXJyQUVCdWlsZFN5bnRheEVycm9yICAgPSAgIC0xNzQwICAgI0FFQnVpbGREZXNjIGFuZCBmcmllbmRzIGRldGVjdGVkIGEgc3ludGF4IGVycm9yCitlcnJBRURlc2NJc051bGwgPSAgIC0xNzM5ICAgI2F0dGVtcHRpbmcgdG8gcGVyZm9ybSBhbiBpbnZhbGlkIG9wZXJhdGlvbiBvbiBhIG51bGwgZGVzY3JpcHRvcgorZXJyQUVTdHJlYW1BbHJlYWR5Q29udmVydGVkID0gICAtMTczOCAgICNhdHRlbXB0IHRvIGNvbnZlcnQgYSBzdHJlYW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZAorZXJyQUVTdHJlYW1CYWROZXN0aW5nICAgPSAgIC0xNzM3ICAgI25lc3RpbmcgdmlvbGF0aW9uIHdoaWxlIHN0cmVhbWluZworZXJyQUVEdXBsaWNhdGVIYW5kbGVyICAgPSAgIC0xNzM2ICAgI2F0dGVtcHQgdG8gaW5zdGFsbCBoYW5kbGVyIGluIHRhYmxlIGZvciBpZGVudGljYWwgY2xhc3MgYW5kIGlkICgxLjEgb3IgZ3JlYXRlcikKK2VyckFFRXZlbnRGaWx0ZXJlZCAgPSAgIC0xNzM1ICAgI2V2ZW50IGhhcyBiZWVuIGZpbHRlcmVkLCBhbmQgc2hvdWxkIG5vdCBiZSBwcm9wb2dhdGVkICgxLjEgb3IgZ3JlYXRlcikKK2VyckFFUmVjZWl2ZUVzY2FwZUN1cnJlbnQgICA9ICAgLTE3MzQgICAjYnJlYWsgb3V0IG9mIG9ubHkgbG93ZXN0IGxldmVsIG9mIEFFUmVjZWl2ZSAoMS4xIG9yIGdyZWF0ZXIpCitlcnJBRVJlY2VpdmVUZXJtaW5hdGUgICA9ICAgLTE3MzMgICAjYnJlYWsgb3V0IG9mIGFsbCBsZXZlbHMgb2YgQUVSZWNlaXZlIHRvIHRoZSB0b3Btb3N0ICgxLjEgb3IgZ3JlYXRlcikKK2VyckFFUmVjb3JkaW5nSXNBbHJlYWR5T24gICA9ICAgLTE3MzIgICAjYXZhaWxhYmxlIG9ubHkgaW4gdmVyc2lvbiAxLjAuMSBvciBncmVhdGVyCitlcnJBRVVua25vd25PYmplY3RUeXBlICA9ICAgLTE3MzEgICAjYXZhaWxhYmxlIG9ubHkgaW4gdmVyc2lvbiAxLjAuMSBvciBncmVhdGVyCitlcnJBRUVtcHR5TGlzdENvbnRhaW5lciA9ICAgLTE3MzAgICAjQXR0ZW1wdCB0byBwYXNzIGVtcHR5IGxpc3QgYXMgY29udGFpbmVyIHRvIGFjY2Vzc29yCitlcnJBRU5lZ2F0aXZlQ291bnQgID0gICAtMTcyOSAgICNDb3VudFByb2MgcmV0dXJuZWQgbmVnYXRpdmUgdmFsdWUKK2VyckFFTm9TdWNoT2JqZWN0ICAgPSAgIC0xNzI4ICAgI2UuZy4sOiBzcGVjaWZpZXIgYXNrZWQgZm9yIHRoZSAzcmQsIGJ1dCB0aGVyZSBhcmUgb25seSAyLiBCYXNpY2FsbHksIHRoaXMgaW5kaWNhdGVzIGEgcnVuLXRpbWUgcmVzb2x1dGlvbiBlcnJvci4KK2VyckFFTm90QW5PYmpTcGVjICAgPSAgIC0xNzI3ICAgI1BhcmFtIHRvIEFFUmVzb2x2ZSBub3Qgb2YgdHlwZSAnb2JqICcKK2VyckFFQmFkVGVzdEtleSA9ICAgLTE3MjYgICAjVGVzdCBpcyBuZWl0aGVyIHR5cGVMb2dpY2FsRGVzY3JpcHRvciBub3IgdHlwZUNvbXBEZXNjcmlwdG9yCitlcnJBRU5vU3VjaExvZ2ljYWwgID0gICAtMTcyNSAgICNTb21ldGhpbmcgb3RoZXIgdGhhbiBBTkQsIE9SLCBvciBOT1QKK2VyckFFQWNjZXNzb3JOb3RGb3VuZCAgID0gICAtMTcyMyAgICNBY2Nlc3NvciBwcm9jIG1hdGNoaW5nIHdhbnRDbGFzcyBhbmQgY29udGFpbmVyVHlwZSBvciB3aWxkY2FyZHMgbm90IGZvdW5kCitlcnJBRVdyb25nTnVtYmVyQXJncyAgICA9ICAgLTE3MjEgICAjTG9naWNhbCBvcCBrQUVOT1QgdXNlZCB3aXRoIG90aGVyIHRoYW4gMSB0ZXJtCitlcnJBRUltcG9zc2libGVSYW5nZSAgICA9ICAgLTE3MjAgICAjQSByYW5nZSBsaWtlIDNyZCB0byAybmQsIG9yIDFzdCB0byBhbGwuCitlcnJBRUlsbGVnYWxJbmRleCAgID0gICAtMTcxOSAgICNpbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gYSBwdXQgb3BlcmF0aW9uCitlcnJBRVJlcGx5Tm90QXJyaXZlZCAgICA9ICAgLTE3MTggICAjdGhlIGNvbnRlbnRzIG9mIHRoZSByZXBseSB5b3UgYXJlIGFjY2Vzc2luZyBoYXZlIG5vdCBhcnJpdmVkIHlldAorZXJyQUVIYW5kbGVyTm90Rm91bmQgICAgPSAgIC0xNzE3ICAgI25vIGhhbmRsZXIgaW4gdGhlIGRpc3BhdGNoIHRhYmxlcyBmaXRzIHRoZSBwYXJhbWV0ZXJzIHRvIEFFR2V0RXZlbnRIYW5kbGVyIG9yIEFFR2V0Q29lcmNpb25IYW5kbGVyCitlcnJBRVVua25vd25BZGRyZXNzVHlwZSA9ICAgLTE3MTYgICAjdGhlIHRhcmdldCBhZGRyZXNzIHR5cGUgaXMgbm90IGtub3duCitlcnJBRVBhcmFtTWlzc2VkICAgID0gICAtMTcxNSAgICNhIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IGFjY2Vzc2VkCitlcnJBRU5vdEFTcGVjaWFsRnVuY3Rpb24gICAgPSAgIC0xNzE0ICAgI3RoZXJlIGlzIG5vIHNwZWNpYWwgZnVuY3Rpb24gZm9yL3dpdGggdGhpcyBrZXl3b3JkCitlcnJBRU5vVXNlckludGVyYWN0aW9uICA9ICAgLTE3MTMgICAjbm8gdXNlciBpbnRlcmFjdGlvbiBpcyBhbGxvd2VkCitlcnJBRVRpbWVvdXQgICAgPSAgIC0xNzEyICAgI3RoZSBBcHBsZUV2ZW50IHRpbWVkIG91dAorZXJyQUVXYWl0Q2FuY2VsZWQgICA9ICAgLTE3MTEgICAjaW4gQUVTZW5kLCB0aGUgdXNlciBjYW5jZWxsZWQgb3V0IG9mIHdhaXQgbG9vcCBmb3IgcmVwbHkgb3IgcmVjZWlwdAorZXJyQUVVbmtub3duU2VuZE1vZGUgICAgPSAgIC0xNzEwICAgI21vZGUgd2Fzbid0IE5vUmVwbHksIFdhaXRSZXBseSwgb3IgUXVldWVSZXBseSBvciBJbnRlcmFjdGlvbiBsZXZlbCBpcyB1bmtub3duCitlcnJBRVJlcGx5Tm90VmFsaWQgID0gICAtMTcwOSAgICNBRVJlc2V0VGltZXIgd2FzIHBhc3NlZCBhbiBpbnZhbGlkIHJlcGx5IHBhcmFtZXRlcgorZXJyQUVFdmVudE5vdEhhbmRsZWQgICAgPSAgIC0xNzA4ICAgI3RoZSBBcHBsZUV2ZW50IHdhcyBub3QgaGFuZGxlZCBieSBhbnkgaGFuZGxlcgorZXJyQUVOb3RBcHBsZUV2ZW50ICA9ICAgLTE3MDcgICAjdGhlIGV2ZW50IGlzIG5vdCBpbiBBcHBsZUV2ZW50IGZvcm1hdAorZXJyQUVOZXdlclZlcnNpb24gICA9ICAgLTE3MDYgICAjbmVlZCBuZXdlciB2ZXJzaW9uIG9mIHRoZSBBcHBsZUV2ZW50IG1hbmFnZXIKK2VyckFFQmFkTGlzdEl0ZW0gICAgPSAgIC0xNzA1ICAgI3RoZSBzcGVjaWZpZWQgbGlzdCBpdGVtIGRvZXMgbm90IGV4aXN0CitlcnJBRU5vdEFFRGVzYyAgPSAgIC0xNzA0ICAgI2VyckFFTm90QUVEZXNjCitlcnJBRVdyb25nRGF0YVR5cGUgID0gICAtMTcwMyAgICNlcnJBRVdyb25nRGF0YVR5cGUKK2VyckFFQ29ycnVwdERhdGEgICAgPSAgIC0xNzAyICAgI2VyckFFQ29ycnVwdERhdGEKK2VyckFFRGVzY05vdEZvdW5kICAgPSAgIC0xNzAxICAgI2VyckFFRGVzY05vdEZvdW5kCitlcnJBRUNvZXJjaW9uRmFpbCAgID0gICAtMTcwMCAgICNiYWQgcGFyYW1ldGVyIGRhdGEgb3IgdW5hYmxlIHRvIGNvZXJjZSB0aGUgZGF0YSBzdXBwbGllZAorZXJyRlNJdGVyYXRvck5vdFN1cHBvcnRlZCAgID0gICAtMTQyNCAgICNUaGUgaXRlcmF0b3IncyBmbGFncyBvciBjb250YWluZXIgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjYWxsCitlcnJGU0l0ZXJhdG9yTm90Rm91bmQgICA9ICAgLTE0MjMgICAjUGFzc2VkIEZTSXRlcmF0b3IgaXMgbm90IGFuIG9wZW4gaXRlcmF0b3IKK2VyckZTQmFkSXRlcmF0b3JGbGFncyAgID0gICAtMTQyMiAgICNGbGFncyBwYXNzZWQgdG8gRlNPcGVuSXRlcmF0b3IgYXJlIGJhZAorZXJyRlNGb3JrRXhpc3RzID0gICAtMTQyMSAgICNOYW1lZCBmb3JrIGFscmVhZHkgZXhpc3RzLgorZXJyRlNSZWZzRGlmZmVyZW50ICA9ICAgLTE0MjAgICAjRlNDb21wYXJlRlNSZWZzOyByZWZzIGFyZSBmb3IgZGlmZmVyZW50IG9iamVjdHMKK2VyckZTQmFkU2VhcmNoUGFyYW1zICAgID0gICAtMTQxOSAgICNTb21ldGhpbmcgd3Jvbmcgd2l0aCBDYXRhbG9nU2VhcmNoIHNlYXJjaFBhcmFtcworZXJyRlNCYWRJdGVtQ291bnQgICA9ICAgLTE0MTggICAjbWF4aW11bUl0ZW1zIHdhcyB6ZXJvCitlcnJGU05vTW9yZUl0ZW1zICAgID0gICAtMTQxNyAgICNJdGVyYXRpb24gcmFuIG91dCBvZiBpdGVtcyB0byByZXR1cm4KK2VyckZTQmFkQWxsb2NGbGFncyAgPSAgIC0xNDEzICAgI0ludmFsaWQgYml0cyBzZXQgaW4gYWxsb2NhdGlvbkZsYWdzCitlcnJGU0JhZFBvc01vZGUgPSAgIC0xNDEyICAgI05ld2xpbmUgYml0cyBzZXQgaW4gcG9zaXRpb25Nb2RlCitlcnJGU01pc3NpbmdOYW1lICAgID0gICAtMTQxMSAgICNBIFVuaWNvZGUgbmFtZSBwYXJhbWV0ZXIgd2FzIE5VTEwgb3IgbmFtZUxlbmd0aCBwYXJhbWV0ZXIgd2FzIHplcm8KK2VyckZTTmFtZVRvb0xvbmcgICAgPSAgIC0xNDEwICAgI0ZpbGUvZm9yayBuYW1lIGlzIHRvbyBsb25nIHRvIGNyZWF0ZS9yZW5hbWUKK2VyckZTRm9ya05vdEZvdW5kICAgPSAgIC0xNDA5ICAgI05hbWVkIGZvcmsgZG9lcyBub3QgZXhpc3QKK2VyckZTTm90QUZvbGRlciA9ICAgLTE0MDcgICAjRXhwZWN0ZWQgYSBmb2xkZXIsIGdvdCBhIGZpbGUKK2VyckZTTWlzc2luZ0NhdEluZm8gPSAgIC0xNDA2ICAgI0EgQ2F0YWxvZ0luZm8gcGFyYW1ldGVyIHdhcyBOVUxMCitlcnJGU0JhZEluZm9CaXRtYXAgID0gICAtMTQwNSAgICNBIENhdGFsb2dJbmZvQml0bWFwIG9yIFZvbHVtZUluZm9CaXRtYXAgaGFzIHJlc2VydmVkIG9yIGludmFsaWQgYml0cyBzZXQKK2VyckZTQmFkRm9ya1JlZiA9ICAgLTE0MDQgICAjQSBGb3JrUmVmTnVtIHBhcmFtZXRlciB3YXMgYmFkCitlcnJGU0JhZEJ1ZmZlciAgPSAgIC0xNDAzICAgI0EgYnVmZmVyIHBhcmFtZXRlciB3YXMgYmFkCitlcnJGU0JhZEZvcmtOYW1lICAgID0gICAtMTQwMiAgICNGb3JrIG5hbWUgcGFyYW1ldGVyIGlzIGJhZAorZXJyRlNCYWRGU1JlZiAgID0gICAtMTQwMSAgICNGU1JlZiBwYXJhbWV0ZXIgaXMgYmFkCitlcnJGU1Vua25vd25DYWxsICAgID0gICAtMTQwMCAgICNzZWxlY3RvciBpcyBub3QgcmVjb2duaXplZCBieSB0aGlzIGZpbGVzeXN0ZW0KK2JhZEZDQkVyciAgID0gICAtMTMyNyAgICNGQ0JSZWNQdHIgaXMgbm90IHZhbGlkCit2b2xWTUJ1c3lFcnIgICAgPSAgIC0xMzExICAgI2Nhbid0IGVqZWN0IGJlY2F1c2Ugdm9sdW1lIGlzIGluIHVzZSBieSBWTQorZnNEYXRhVG9vQmlnRXJyID0gICAtMTMxMCAgICNmaWxlIG9yIHZvbHVtZSBpcyB0b28gYmlnIGZvciBzeXN0ZW0KK2ZpbGVCb3VuZHNFcnIgICA9ICAgLTEzMDkgICAjZmlsZSdzIEVPRiwgb2Zmc2V0LCBtYXJrIG9yIHNpemUgaXMgdG9vIGJpZworbm90QVJlbW91bnRFcnIgID0gICAtMTMwOCAgICN3aGVuIF9Nb3VudCBhbGxvd3Mgb25seSByZW1vdW50cyBhbmQgZG9lc24ndCBnZXQgb25lCitiYWRGaWRFcnIgICA9ICAgLTEzMDcgICAjZmlsZSBpZCBpcyBkYW5nbGluZyBvciBkb2Vzbid0IG1hdGNoIHdpdGggdGhlIGZpbGUgbnVtYmVyCitzYW1lRmlsZUVyciA9ICAgLTEzMDYgICAjY2FuJ3QgZXhjaGFuZ2UgYSBmaWxlIHdpdGggaXRzZWxmCitkZXNrdG9wRGFtYWdlZEVyciAgID0gICAtMTMwNSAgICNkZXNrdG9wIGRhdGFiYXNlIGZpbGVzIGFyZSBjb3JydXB0ZWQKK2NhdENoYW5nZWRFcnIgICA9ICAgLTEzMDQgICAjdGhlIGNhdGFsb2cgaGFzIGJlZW4gbW9kaWZpZWQKK2RpZmZWb2xFcnIgID0gICAtMTMwMyAgICNmaWxlcyBvbiBkaWZmZXJlbnQgdm9sdW1lcworbm90QUZpbGVFcnIgPSAgIC0xMzAyICAgI2RpcmVjdG9yeSBzcGVjaWZpZWQKK2ZpZEV4aXN0cyAgID0gICAtMTMwMSAgICNmaWxlIGlkIGFscmVhZHkgZXhpc3RzCitmaWROb3RGb3VuZCA9ICAgLTEzMDAgICAjbm8gZmlsZSB0aHJlYWQgZXhpc3RzLgorZXJyUmVmTnVtICAgPSAgIC0xMjgwICAgI2JhZCBjb25uZWN0aW9uIHJlZk51bQorZXJyQWJvcnRlZCAgPSAgIC0xMjc5ICAgI2NvbnRyb2wgY2FsbCB3YXMgYWJvcnRlZAorZXJyU3RhdGUgICAgPSAgIC0xMjc4ICAgI2JhZCBjb25uZWN0aW9uIHN0YXRlIGZvciB0aGlzIG9wZXJhdGlvbgorZXJyT3BlbmluZyAgPSAgIC0xMjc3ICAgI29wZW4gY29ubmVjdGlvbiByZXF1ZXN0IGZhaWxlZAorZXJyQXR0ZW50aW9uICAgID0gICAtMTI3NiAgICNhdHRlbnRpb24gbWVzc2FnZSB0b28gbG9uZworZXJyRndkUmVzZXQgPSAgIC0xMjc1ICAgI3JlYWQgdGVybWluYXRlZCBieSBmb3J3YXJkIHJlc2V0CitlcnJEU1BRdWV1ZVNpemUgPSAgIC0xMjc0ICAgI0RTUCBSZWFkL1dyaXRlIFF1ZXVlIFRvbyBzbWFsbAorZXJyT3BlbkRlbmllZCAgID0gICAtMTI3MyAgICNvcGVuIGNvbm5lY3Rpb24gcmVxdWVzdCB3YXMgZGVuaWVkCityZXFBYm9ydGVkICA9ICAgLTExMDUgICAjcmVxQWJvcnRlZAorbm9EYXRhQXJlYSAgPSAgIC0xMTA0ICAgI25vRGF0YUFyZWEKK25vU2VuZFJlc3AgID0gICAtMTEwMyAgICNub1NlbmRSZXNwCitjYk5vdEZvdW5kICA9ICAgLTExMDIgICAjY2JOb3RGb3VuZAorbm9SZWxFcnIgICAgPSAgIC0xMTAxICAgI25vUmVsRXJyCitiYWRCdWZmTnVtICA9ICAgLTExMDAgICAjYmFkQnVmZk51bQorYmFkQVRQU2t0ICAgPSAgIC0xMDk5ICAgI2JhZEFUUFNrdAordG9vTWFueVNrdHMgPSAgIC0xMDk4ICAgI3Rvb01hbnlTa3RzCit0b29NYW55UmVxcyA9ICAgLTEwOTcgICAjdG9vTWFueVJlcXMKK3JlcUZhaWxlZCAgID0gICAtMTA5NiAgICNyZXFGYWlsZWQKK2FzcE5vQWNrICAgID0gICAtMTA3NSAgICNObyBhY2sgb24gYXR0ZW50aW9uIHJlcXVlc3QgKHNlcnZlciBlcnIpCithc3BUb29NYW55ICA9ICAgLTEwNzQgICAjVG9vIG1hbnkgY2xpZW50cyAoc2VydmVyIGVycm9yKQorYXNwU2l6ZUVyciAgPSAgIC0xMDczICAgI0NvbW1hbmQgYmxvY2sgdG9vIGJpZworYXNwU2Vzc0Nsb3NlZCAgID0gICAtMTA3MiAgICNTZXNzaW9uIGNsb3NlZAorYXNwU2VydmVyQnVzeSAgID0gICAtMTA3MSAgICNTZXJ2ZXIgY2Fubm90IG9wZW4gYW5vdGhlciBzZXNzaW9uCithc3BQYXJhbUVyciA9ICAgLTEwNzAgICAjUGFyYW1ldGVyIGVycm9yCithc3BOb1NlcnZlcnMgICAgPSAgIC0xMDY5ICAgI05vIHNlcnZlcnMgYXQgdGhhdCBhZGRyZXNzCithc3BOb01vcmVTZXNzICAgPSAgIC0xMDY4ICAgI05vIG1vcmUgc2Vzc2lvbnMgb24gc2VydmVyCithc3BCdWZUb29TbWFsbCAgPSAgIC0xMDY3ICAgI0J1ZmZlciB0b28gc21hbGwKK2FzcEJhZFZlcnNOdW0gICA9ICAgLTEwNjYgICAjU2VydmVyIGNhbm5vdCBzdXBwb3J0IHRoaXMgQVNQIHZlcnNpb24KK25icE5JU0VyciAgID0gICAtMTAyOSAgICNFcnJvciB0cnlpbmcgdG8gb3BlbiB0aGUgTklTCituYnBOb3RGb3VuZCA9ICAgLTEwMjggICAjTmFtZSBub3QgZm91bmQgb24gcmVtb3ZlCituYnBEdXBsaWNhdGUgICAgPSAgIC0xMDI3ICAgI0R1cGxpY2F0ZSBuYW1lIGV4aXN0cyBhbHJlYWR5CituYnBDb25mRGlmZiA9ICAgLTEwMjYgICAjTmFtZSBjb25maXJtZWQgYXQgZGlmZmVyZW50IHNvY2tldAorbmJwTm9Db25maXJtICAgID0gICAtMTAyNSAgICNuYnBOb0NvbmZpcm0KK25icEJ1ZmZPdnIgID0gICAtMTAyNCAgICNCdWZmZXIgb3ZlcmZsb3cgaW4gTG9va3VwTmFtZQorbm9NYXNrRm91bmRFcnIgID0gICAtMTAwMCAgICNJY29uIFV0aWx0aWVzIEVycm9yCitrRk1Gb250Q29udGFpbmVyQWNjZXNzRXJyICAgPSAgIC05ODUgICAgI2tGTUZvbnRDb250YWluZXJBY2Nlc3NFcnIKK2tGTUZvbnRUYWJsZUFjY2Vzc0VyciAgID0gICAtOTg0ICAgICNrRk1Gb250VGFibGVBY2Nlc3NFcnIKK2tGTUl0ZXJhdGlvblNjb3BlTW9kaWZpZWRFcnIgICAgPSAgIC05ODMgICAgI2tGTUl0ZXJhdGlvblNjb3BlTW9kaWZpZWRFcnIKK2tGTUludmFsaWRGb250RXJyICAgPSAgIC05ODIgICAgI2tGTUludmFsaWRGb250RXJyCitrRk1JbnZhbGlkRm9udEZhbWlseUVyciA9ICAgLTk4MSAgICAja0ZNSW52YWxpZEZvbnRGYW1pbHlFcnIKK2tGTUl0ZXJhdGlvbkNvbXBsZXRlZCAgID0gICAtOTgwICAgICNrRk1JdGVyYXRpb25Db21wbGV0ZWQKK2d1ZXN0Tm90QWxsb3dlZEVyciAgPSAgIC05MzIgICAgI2Rlc3RpbmF0aW9uIHBvcnQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24KK2JhZExvY05hbWVFcnIgICA9ICAgLTkzMSAgICAjbG9jYXRpb24gbmFtZSBtYWxmb3JtZWQKK2JhZFNlcnZpY2VNZXRob2RFcnIgPSAgIC05MzAgICAgI2lsbGVnYWwgc2VydmljZSB0eXBlLCBvciBub3Qgc3VwcG9ydGVkCitub1VzZXJSZWNFcnIgICAgPSAgIC05MjggICAgI0ludmFsaWQgdXNlciByZWZlcmVuY2UgbnVtYmVyCithdXRoRmFpbEVyciA9ICAgLTkyNyAgICAjdW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSB1c2VyIGF0IGRlc3RpbmF0aW9uCitub0luZm9ybUVyciA9ICAgLTkyNiAgICAjUFBDU3RhcnQgZmFpbGVkIGJlY2F1c2UgZGVzdGluYXRpb24gZGlkIG5vdCBoYXZlIGluZm9ybSBwZW5kaW5nCituZXR3b3JrRXJyICA9ICAgLTkyNSAgICAjQW4gZXJyb3IgaGFzIG9jY3VycmVkIGluIHRoZSBuZXR3b3JrLCBub3QgdG9vIGxpa2VseQorbm9Vc2VyUmVmRXJyICAgID0gICAtOTI0ICAgICN1bmFibGUgdG8gY3JlYXRlIGEgbmV3IHVzZXJSZWZOdW0KK25vdExvZ2dlZEluRXJyICA9ICAgLTkyMyAgICAjVGhlIGRlZmF1bHQgdXNlclJlZk51bSBkb2VzIG5vdCB5ZXQgZXhpc3QKK25vRGVmYXVsdFVzZXJFcnIgICAgPSAgIC05MjIgICAgI3VzZXIgaGFzbid0IHR5cGVkIGluIG93bmVycyBuYW1lIGluIE5ldHdvcmsgU2V0dXAgQ29udHJvbCBQYW5uZWwKK2JhZFBvcnROYW1lRXJyICA9ICAgLTkxOSAgICAjUFBDUG9ydFJlYyBtYWxmb3JtZWQKK3Nlc3NDbG9zZWRFcnIgICA9ICAgLTkxNyAgICAjc2Vzc2lvbiB3YXMgY2xvc2VkCitwb3J0Q2xvc2VkRXJyICAgPSAgIC05MTYgICAgI3BvcnQgd2FzIGNsb3NlZAorbm9SZXNwb25zZUVyciAgID0gICAtOTE1ICAgICN1bmFibGUgdG8gY29udGFjdCBkZXN0aW5hdGlvbgorbm9Ub29sYm94TmFtZUVyciAgICA9ICAgLTkxNCAgICAjQSBzeXN0ZW0gcmVzb3VyY2UgaXMgbWlzc2luZywgbm90IHRvbyBsaWtlbHkKK25vTWFjaGluZU5hbWVFcnIgICAgPSAgIC05MTMgICAgI3VzZXIgaGFzbid0IG5hbWVkIGhpcyBNYWNpbnRvc2ggaW4gdGhlIE5ldHdvcmsgU2V0dXAgQ29udHJvbCBQYW5lbAordXNlclJlamVjdEVyciAgID0gICAtOTEyICAgICNEZXN0aW5hdGlvbiByZWplY3RlZCB0aGUgc2Vzc2lvbiByZXF1ZXN0Citub1VzZXJOYW1lRXJyICAgPSAgIC05MTEgICAgI3VzZXIgbmFtZSB1bmtub3duIG9uIGRlc3RpbmF0aW9uIG1hY2hpbmUKK3BvcnROYW1lRXhpc3RzRXJyICAgPSAgIC05MTAgICAgI3BvcnQgaXMgYWxyZWFkeSBvcGVuIChwZXJoYXBzIGluIGFub3RoZXIgYXBwKQorYmFkUmVxRXJyICAgPSAgIC05MDkgICAgI2JhZCBwYXJhbWV0ZXIgb3IgaW52YWxpZCBzdGF0ZSBmb3Igb3BlcmF0aW9uCitub1Nlc3Npb25FcnIgICAgPSAgIC05MDggICAgI0ludmFsaWQgc2Vzc2lvbiByZWZlcmVuY2UgbnVtYmVyCitzZXNzVGFibGVFcnIgICAgPSAgIC05MDcgICAgI091dCBvZiBzZXNzaW9uIHRhYmxlcywgdHJ5IGFnYWluIGxhdGVyCitkZXN0UG9ydEVyciA9ICAgLTkwNiAgICAjUG9ydCBkb2VzIG5vdCBleGlzdCBhdCBkZXN0aW5hdGlvbgorbG9jYWxPbmx5RXJyICAgID0gICAtOTA1ICAgICNOZXR3b3JrIGFjdGl2aXR5IGlzIGN1cnJlbnRseSBkaXNhYmxlZAorbm9HbG9iYWxzRXJyICAgID0gICAtOTA0ICAgICNUaGUgc3lzdGVtIGlzIGhvc2VkLCBiZXR0ZXIgcmUtYm9vdAorbm9Qb3J0RXJyICAgPSAgIC05MDMgICAgI1VuYWJsZSB0byBvcGVuIHBvcnQgb3IgYmFkIHBvcnRSZWZOdW0uICBJZiB5b3UncmUgY2FsbGluZworbmFtZVR5cGVFcnIgPSAgIC05MDIgICAgI0ludmFsaWQgb3IgaW5hcHByb3ByaWF0ZSBsb2NhdGlvbktpbmRTZWxlY3RvciBpbiBsb2NhdGlvbk5hbWUKK25vdEluaXRFcnIgID0gICAtOTAwICAgICNQUENUb29sQm94IG5vdCBpbml0aWFsaXplZAorbm90QXBwcm9wcmlhdGVGb3JDbGFzc2ljICAgID0gICAtODc3ICAgICNUaGlzIGFwcGxpY2F0aW9uIHdvbid0IG9yIHNob3VsZG4ndCBydW4gb24gQ2xhc3NpYyAoUHJvYmxlbSAyNDgxMDU4KS4KK2FwcFZlcnNpb25Ub29PbGQgICAgPSAgIC04NzYgICAgI1RoZSBhcHBsaWNhdGlvbidzIGNyZWF0b3IgYW5kIHZlcnNpb24gYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgTWFjIE9TLgord3JvbmdBcHBsaWNhdGlvblBsYXRmb3JtICAgID0gICAtODc1ICAgICNUaGUgYXBwbGljYXRpb24gY291bGQgbm90IGxhdW5jaCBiZWNhdXNlIHRoZSByZXF1aXJlZCBwbGF0Zm9ybSBpcyBub3QgYXZhaWxhYmxlCitobUNsb3NlVmlld0FjdGl2ZSAgID0gICAtODYzICAgICNSZXR1cm5lZCBmcm9tIEhNUmVtb3ZlQmFsbG9vbiBpZiBDbG9zZVZpZXcgd2FzIGFjdGl2ZQoraG1Ob0JhbGxvb25VcCAgID0gICAtODYyICAgICNSZXR1cm5lZCBmcm9tIEhNUmVtb3ZlQmFsbG9vbiBpZiBubyBiYWxsb29uIHdhcyB2aXNpYmxlIHdoZW4gY2FsbCB3YXMgbWFkZQoraG1PcGVyYXRpb25VbnN1cHBvcnRlZCAgPSAgIC04NjEgICAgI1JldHVybmVkIGZyb20gSE1TaG93QmFsbG9vbiBjYWxsIGlmIGJhZCBtZXRob2QgcGFzc2VkIHRvIHJvdXRpbmUKK2htVW5rbm93bkhlbHBUeXBlICAgPSAgIC04NTkgICAgI1JldHVybmVkIGlmIGhlbHAgbXNnIHJlY29yZCBjb250YWluZWQgYSBiYWQgdHlwZQoraG1Xcm9uZ1ZlcnNpb24gID0gICAtODU4ICAgICNSZXR1cm5lZCBpZiBoZWxwIG1nciByZXNvdXJjZSB3YXMgdGhlIHdyb25nIHZlcnNpb24KK2htU2tpcHBlZEJhbGxvb24gICAgPSAgIC04NTcgICAgI1JldHVybmVkIGZyb20gY2FsbHMgaWYgaGVscG1zZyBzcGVjaWZpZWQgYSBza2lwIGJhbGxvb24KK2htSGVscE1hbmFnZXJOb3RJbml0ZWQgID0gICAtODU1ICAgICNSZXR1cm5lZCBmcm9tIEhNR2V0SGVscE1lbnVIYW5kbGUgaWYgaGVscCBtZW51IG5vdCBzZXR1cAoraG1TYW1lQXNMYXN0QmFsbG9vbiA9ICAgLTg1NCAgICAjUmV0dXJuZWQgZnJvbSBITVNob3dNZW51QmFsbG9vbiBpZiBtZW51ICYgaXRlbSBpcyBzYW1lIGFzIGxhc3QgdGltZQoraG1CYWxsb29uQWJvcnRlZCAgICA9ICAgLTg1MyAgICAjUmV0dXJuZWQgaWYgbW91c2Ugd2FzIG1vdmluZyBvciBtb3VzZSB3YXNuJ3QgaW4gd2luZG93IHBvcnQgcmVjdAoraG1IZWxwRGlzYWJsZWQgID0gICAtODUwICAgICNTaG93IEJhbGxvb25zIG1vZGUgd2FzIG9mZiwgY2FsbCB0byByb3V0aW5lIGlnbm9yZWQKK3JjREJQYWNrTm90SW5pdGVkICAgPSAgIC04MTMgICAgI2F0dGVtcHQgdG8gY2FsbCBvdGhlciByb3V0aW5lIGJlZm9yZSBJbml0REJQYWNrCityY0RCV3JvbmdWZXJzaW9uICAgID0gICAtODEyICAgICNpbmNvbXBhdGlibGUgdmVyc2lvbnMKK3JjREJOb0hhbmRsZXIgICA9ICAgLTgxMSAgICAjbm8gYXBwIGhhbmRsZXIgZm9yIHNwZWNpZmllZCBkYXRhIHR5cGUKK3JjREJCYWRBc3luY1BCICA9ICAgLTgxMCAgICAjdHJpZWQgdG8ga2lsbCBhIGJhZCBwYgorcmNEQkFzeW5jTm90U3VwcCAgICA9ICAgLTgwOSAgICAjZGRldiBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jIGNhbGxzCityY0RCQmFkRERFViA9ICAgLTgwOCAgICAjYmFkIGRkZXYgc3BlY2lmaWVkIG9uIERCSW5pdAorcmNEQkJhZFNlc3NOdW0gID0gICAtODA3ICAgICNiYWQgc2Vzc2lvbiBudW1iZXIgZm9yIERCR2V0Q29ubkluZm8KK3JjREJCYWRTZXNzSUQgICA9ICAgLTgwNiAgICAjcmNEQkJhZFNlc3NJRAorcmNEQkV4ZWMgICAgPSAgIC04MDUgICAgI3JjREJFeGVjCityY0RCQnJlYWsgICA9ICAgLTgwNCAgICAjcmNEQkJyZWFrCityY0RCQmFkVHlwZSA9ICAgLTgwMyAgICAjcmNEQkJhZFR5cGUKK3JjREJFcnJvciAgID0gICAtODAyICAgICNyY0RCRXJyb3IKK3JjREJWYWx1ZSAgID0gICAtODAxICAgICNyY0RCVmFsdWUKK3JjREJOdWxsICAgID0gICAtODAwICAgICNyY0RCTnVsbAoraWNUb29NYW55UHJvZmlsZXNFcnIgICAgPSAgIC02NzcgICAgI3RvbyBtYW55IHByb2ZpbGVzIGluIGRhdGFiYXNlCitpY1Byb2ZpbGVOb3RGb3VuZEVyciAgICA9ICAgLTY3NiAgICAjcHJvZmlsZSBub3QgZm91bmQKK2ljQ29uZmlnSW5hcHByb3ByaWF0ZUVyciAgICA9ICAgLTY3NSAgICAjaW5jb3JyZWN0IG1hbnVmYWN0dXJlciBjb2RlCitpY0NvbmZpZ05vdEZvdW5kRXJyID0gICAtNjc0ICAgICNubyBpbnRlcm5ldCBjb25maWd1cmF0aW9uIHdhcyBmb3VuZAoraWNOb1VSTEVyciAgPSAgIC02NzMgICAgI25vIFVSTCBmb3VuZAoraWNOb3RoaW5nVG9PdmVycmlkZUVyciAgPSAgIC02NzIgICAgI25vIGNvbXBvbmVudCBmb3IgdGhlIG92ZXJyaWRlIGNvbXBvbmVudCB0byBjYXB0dXJlCitpY05vTW9yZVdyaXRlcnNFcnIgID0gICAtNjcxICAgICN5b3UgY2Fubm90IGJlZ2luIGEgd3JpdGUgc2Vzc2lvbiBiZWNhdXNlIHNvbWVvbmUgZWxzZSBpcyBhbHJlYWR5IGRvaW5nIGl0CitpY1RydW5jYXRlZEVyciAgPSAgIC02NzAgICAgI21vcmUgZGF0YSB3YXMgcHJlc2VudCB0aGFuIHdhcyByZXR1cm5lZAoraWNJbnRlcm5hbEVyciAgID0gICAtNjY5ICAgICNJbnRlcm5ldCBDb25maWcgaW50ZXJuYWwgZXJyb3IKK2ljUHJlZkRhdGFFcnIgICA9ICAgLTY2OCAgICAjcHJvYmxlbSB3aXRoIHByZWZlcmVuY2UgZGF0YQoraWNQZXJtRXJyICAgPSAgIC02NjcgICAgI2Nhbm5vdCBzZXQgcHJlZmVyZW5jZQoraWNQcmVmTm90Rm91bmRFcnIgICA9ICAgLTY2NiAgICAjSW50ZXJuZXQgcHJlZmVyZW5jZSBub3QgZm91bmQKK3ZtSW52YWxpZE93bmluZ1Byb2Nlc3NFcnIgICA9ICAgLTY0OCAgICAjY3VycmVudCBwcm9jZXNzIGRvZXMgbm90IG93biB0aGUgQmFja2luZ0ZpbGVJRCBvciBGaWxlVmlld0lECit2bUFkZHJlc3NOb3RJbkZpbGVWaWV3RXJyICAgPSAgIC02NDcgICAgI2FkZHJlc3MgaXMgbm90IGluIGEgRmlsZVZpZXcKK3ZtTm9Nb3JlRmlsZVZpZXdzRXJyICAgID0gICAtNjQ2ICAgICNubyBtb3JlIEZpbGVWaWV3cyB3ZXJlIGZvdW5kCit2bUZpbGVWaWV3QWNjZXNzRXJyID0gICAtNjQ1ICAgICNyZXF1ZXN0ZWQgRmlsZVZpZXdBY2Nlc3MgY2Fubm90IGJlIG9idGFpbmVkCit2bUludmFsaWRGaWxlVmlld0lERXJyICA9ICAgLTY0NCAgICAjaW52YWxpZCBGaWxlVmlld0lECit2bU5vTW9yZUJhY2tpbmdGaWxlc0VyciA9ICAgLTY0MyAgICAjbm8gbW9yZSBCYWNraW5nRmlsZXMgd2VyZSBmb3VuZAordm1CdXN5QmFja2luZ0ZpbGVFcnIgICAgPSAgIC02NDIgICAgI29wZW4gdmlld3MgZm91bmQgb24gQmFja2luZ0ZpbGUKK3ZtTWFwcGluZ1ByaXZpbGVnZXNFcnIgID0gICAtNjQxICAgICNyZXF1ZXN0ZWQgTWFwcGluZ1ByaXZpbGVnZXMgY2Fubm90IGJlIG9idGFpbmVkCit2bUludmFsaWRCYWNraW5nRmlsZUlERXJyICAgPSAgIC02NDAgICAgI2ludmFsaWQgQmFja2luZ0ZpbGVJRAorbm9NTVVFcnIgICAgPSAgIC02MjYgICAgI25vIE1NVSBwcmVzZW50CitjYW5ub3REZWZlckVyciAgPSAgIC02MjUgICAgI3VuYWJsZSB0byBkZWZlciBhZGRpdGlvbmFsIGZ1bmN0aW9ucworaW50ZXJydXB0c01hc2tlZEVyciA9ICAgLTYyNCAgICAjZG9u1XQgY2FsbCB3aXRoIGludGVycnVwdHMgbWFza2VkCitub3RMb2NrZWRFcnIgICAgPSAgIC02MjMgICAgI3NwZWNpZmllZCByYW5nZSBvZiBtZW1vcnkgaXMgbm90IGxvY2tlZAorY2Fubm90TWFrZUNvbnRpZ3VvdXNFcnIgPSAgIC02MjIgICAgI2Nhbm5vdCBtYWtlIHNwZWNpZmllZCByYW5nZSBjb250aWd1b3VzCitub3RIZWxkRXJyICA9ICAgLTYyMSAgICAjc3BlY2lmaWVkIHJhbmdlIG9mIG1lbW9yeSBpcyBub3QgaGVsZAorbm90RW5vdWdoTWVtb3J5RXJyICA9ICAgLTYyMCAgICAjaW5zdWZmaWNpZW50IHBoeXNpY2FsIG1lbW9yeQordGhyZWFkUHJvdG9jb2xFcnIgICA9ICAgLTYxOSAgICAjdGhyZWFkUHJvdG9jb2xFcnIKK3RocmVhZE5vdEZvdW5kRXJyICAgPSAgIC02MTggICAgI3RocmVhZE5vdEZvdW5kRXJyCit0aHJlYWRUb29NYW55UmVxc0VyciAgICA9ICAgLTYxNyAgICAjdGhyZWFkVG9vTWFueVJlcXNFcnIKK25vVXNlckludGVyYWN0aW9uQWxsb3dlZCAgICA9ICAgLTYxMCAgICAjbm8gdXNlciBpbnRlcmFjdGlvbiBhbGxvd2VkCitjb25uZWN0aW9uSW52YWxpZCAgID0gICAtNjA5ICAgICNjb25uZWN0aW9uSW52YWxpZAorbm9PdXRzdGFuZGluZ0hMRSAgICA9ICAgLTYwOCAgICAjbm9PdXRzdGFuZGluZ0hMRQorYnVmZmVySXNTbWFsbCAgID0gICAtNjA3ICAgICNlcnJvciByZXR1cm5zIGZyb20gUG9zdCBhbmQgQWNjZXB0CithcHBJc0RhZW1vbiA9ICAgLTYwNiAgICAjYXBwIGlzIEJHLW9ubHksIGFuZCBsYXVuY2ggZmxhZ3MgZGlzYWxsb3cgdGhpcworYXBwTWVtRnVsbEVyciAgID0gICAtNjA1ICAgICNhcHBsaWNhdGlvbiBTSVpFIG5vdCBiaWcgZW5vdWdoIGZvciBsYXVuY2gKK2hhcmR3YXJlQ29uZmlnRXJyICAgPSAgIC02MDQgICAgI2hhcmR3YXJlIGNvbmZpZ3VyYXRpb24gbm90IGNvcnJlY3QgZm9yIGNhbGwKK3Byb3RvY29sRXJyID0gICAtNjAzICAgICNhcHAgbWFkZSBtb2R1bGUgY2FsbHMgaW4gaW1wcm9wZXIgb3JkZXIKK2FwcE1vZGVFcnIgID0gICAtNjAyICAgICNtZW1vcnkgbW9kZSBpcyAzMi1iaXQsIGJ1dCBhcHAgbm90IDMyLWJpdCBjbGVhbgorbWVtRnJhZ0VyciAgPSAgIC02MDEgICAgI25vdCBlbm91Z2ggcm9vbSB0byBsYXVuY2ggYXBwIHcvc3BlY2lhbCByZXF1aXJlbWVudHMKK3Byb2NOb3RGb3VuZCAgICA9ICAgLTYwMCAgICAjbm8gZWxpZ2libGUgcHJvY2VzcyB3aXRoIHNwZWNpZmllZCBkZXNjcmlwdG9yCitkcml2ZXJIYXJkd2FyZUdvbmVFcnIgICA9ICAgLTUwMyAgICAjZGlzayBkcml2ZXIncyBoYXJkd2FyZSB3YXMgZGlzY29ubmVjdGVkCitod1BhcmFtRXJyICA9ICAgLTUwMiAgICAjYmFkIHNlbGVjdG9yIGZvciBfSFdQcml2Cit0ZVNjcmFwU2l6ZUVyciAgPSAgIC01MDEgICAgI3NjcmFwIGl0ZW0gdG9vIGJpZyBmb3IgdGV4dCBlZGl0IHJlY29yZAorcmduVG9vQmlnRXJyICAgID0gICAtNTAwICAgICNyZ25Ub29CaWdFcnIKK2V4VXNlckJyZWFrID0gICAtNDkyICAgICN1c2VyIGRlYnVnZ2VyIGJyZWFrOyBleGVjdXRlIGRlYnVnZ2VyIGNvbW1hbmRzIG9uIHN0YWNrCitzdHJVc2VyQnJlYWsgICAgPSAgIC00OTEgICAgI3VzZXIgZGVidWdnZXIgYnJlYWs7IGRpc3BsYXkgc3RyaW5nIG9uIHN0YWNrCit1c2VyQnJlYWsgICA9ICAgLTQ5MCAgICAjdXNlciBkZWJ1Z2dlciBicmVhaworbm90VGhlUHVibGlzaGVyV3JuICA9ICAgLTQ2MyAgICAjbm90IHRoZSBmaXJzdCByZWdpc3RlcmVkIHB1Ymxpc2hlciBmb3IgdGhhdCBjb250YWluZXIKK2NvbnRhaW5lckFscmVhZHlPcGVuV3JuID0gICAtNDYyICAgICNjb250YWluZXIgYWxyZWFkeSBvcGVuZWQgYnkgdGhpcyBzZWN0aW9uCitjb250YWluZXJOb3RGb3VuZFdybiAgICA9ICAgLTQ2MSAgICAjY291bGQgbm90IGZpbmQgZWRpdGlvbkNvbnRhaW5lciBhdCB0aGlzIHRpbWUKK211bHRpcGxlUHVibGlzaGVyV3JuICAgID0gICAtNDYwICAgICNBIFB1Ymxpc2hlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoYXQgY29udGFpbmVyCitiYWRTdWJQYXJ0RXJyICAgPSAgIC00NTQgICAgI2NhbiBub3QgdXNlIHN1YiBwYXJ0cyBpbiB0aGlzIHJlbGVhc2UKK2JhZEVkaXRpb25GaWxlRXJyICAgPSAgIC00NTMgICAgI2VkaXRpb24gZmlsZSBpcyBjb3JydXB0Citub3RSZWdpc3RlcmVkU2VjdGlvbkVyciA9ICAgLTQ1MiAgICAjbm90IGEgcmVnaXN0ZXJlZCBTZWN0aW9uUmVjb3JkCitiYWRTZWN0aW9uRXJyICAgPSAgIC00NTEgICAgI25vdCBhIHZhbGlkIFNlY3Rpb25SZWNvcmQKK2VkaXRpb25NZ3JJbml0RXJyICAgPSAgIC00NTAgICAgI2VkaXRpb24gbWFuYWdlciBub3QgaW5pdGVkIGJ5IHRoaXMgYXBwCitmc21Vbmtub3duRlNNTWVzc2FnZUVyciA9ICAgLTQzOCAgICAjdW5rbm93biBtZXNzYWdlIHBhc3NlZCB0byBGU00KK2ZzbU5vQWx0ZXJuYXRlU3RhY2tFcnIgID0gICAtNDM3ICAgICNubyBhbHRlcm5hdGUgc3RhY2sgZm9yIEhGUyBDSQorZnNtQmFkRlNEVmVyc2lvbkVyciA9ICAgLTQzNiAgICAjRlNNIHZlcnNpb24gaW5jb21wYXRpYmxlIHdpdGggRlNECitmc21EdXBsaWNhdGVGU0lERXJyID0gICAtNDM1ICAgICNGU0lEIGFscmVhZHkgZXhpc3RzIG9uIEluc3RhbGxGUworZnNtQmFkRlNETGVuRXJyID0gICAtNDM0ICAgICNGU0Qgc2l6ZSBpbmNvbXBhdGlibGUgd2l0aCBjdXJyZW50IEZTTSB2ZXJzCitmc21CYWRGRlNOYW1lRXJyICAgID0gICAtNDMzICAgICNOYW1lIGxlbmd0aCBub3QgMSA8PSBsZW5ndGggPD0gMzEKK2ZzbUJ1c3lGRlNFcnIgICA9ICAgLTQzMiAgICAjRmlsZSBzeXN0ZW0gaXMgYnVzeSwgY2Fubm90IGJlIHJlbW92ZWQKK2ZzbUZGU05vdEZvdW5kRXJyICAgPSAgIC00MzEgICAgI0ZvcmVpZ24gRmlsZSBzeXN0ZW0gZG9lcyBub3QgZXhpc3QgLSBuZXcgUGFjazIgY291bGQgcmV0dXJuIHRoaXMgZXJyb3IgdG9vCitidEtleUF0dHJFcnIgICAgPSAgIC00MTcgICAgI1RoZXJlIGlzIG5vIHN1Y2ggYSBrZXkgYXR0cmlidXRlLgorYnRLZXlMZW5FcnIgPSAgIC00MTYgICAgI01heGltdW0ga2V5IGxlbmd0aCBpcyB0b28gbG9uZyBvciBlcXVhbCB0byB6ZXJvLgorYnRSZWNOb3RGbmQgPSAgIC00MTUgICAgI1JlY29yZCBjYW5ub3QgYmUgZm91bmQuCitidER1cFJlY0VyciA9ICAgLTQxNCAgICAjUmVjb3JkIGFscmVhZHkgZXhpc3RzLgorYnROb1NwYWNlICAgPSAgIC00MTMgICAgI0Nhbid0IGFsbG9jYXRlIGRpc2sgc3BhY2UuCitub3RCVHJlZSAgICA9ICAgLTQxMCAgICAjVGhlIGZpbGUgaXMgbm90IGEgZGljdGlvbmFyeS4KK2djck9uTUZNRXJyID0gICAtNDAwICAgICNnY3IgZm9ybWF0IG9uIGhpZ2ggZGVuc2l0eSBtZWRpYSBlcnJvcgorc2xvdE51bUVyciAgPSAgIC0zNjAgICAgI2ludmFsaWQgc2xvdCAjIGVycm9yCitzbVJlY05vdEZuZCA9ICAgLTM1MSAgICAjUmVjb3JkIG5vdCBmb3VuZCBpbiB0aGUgU1JULgorc21TUlRPdnJGbEVyciAgID0gICAtMzUwICAgICNTUlQgb3ZlciBmbG93Lgorc21Ob0dvb2RPcGVucyAgID0gICAtMzQ5ICAgICNObyBvcGVucyB3ZXJlIHN1Y2Nlc3NmdWxsIGluIHRoZSBsb29wLgorc21PZmZzZXRFcnIgPSAgIC0zNDggICAgI09mZnNldCB3YXMgdG9vIGJpZyAodGVtcG9yYXJ5IGVycm9yCitzbUJ5dGVMYW5lc0VyciAgPSAgIC0zNDcgICAgI051bUJ5dGVMYW5lcyB3YXMgZGV0ZXJtaW5lZCB0byBiZSB6ZXJvLgorc21CYWRzUHRyRXJyICAgID0gICAtMzQ2ICAgICNCYWQgcG9pbnRlciB3YXMgcGFzc2VkIHRvIHNDYWxjc1BvaW50ZXIKK3Ntc0dldERydnJFcnIgICA9ICAgLTM0NSAgICAjRXJyb3Igb2NjdXJyZWQgZHVyaW5nIF9zR2V0RHJpdmVyLgorc21Ob01vcmVzUnNyY3MgID0gICAtMzQ0ICAgICNObyBtb3JlIHNSZXNvdXJjZXMKK3NtRGlzRHJ2ck5hbUVyciA9ICAgLTM0MyAgICAjRXJyb3Igb2NjdXJyZWQgZHVyaW5nIF9zRGlzRHJ2ck5hbWUuCitzbUdldERydnJOYW1FcnIgPSAgIC0zNDIgICAgI0Vycm9yIG9jY3VycmVkIGR1cmluZyBfc0dldERydnJOYW1lLgorc21Da1N0YXR1c0VyciAgID0gICAtMzQxICAgICNTdGF0dXMgb2Ygc2xvdCA9IGZhaWwuCitzbUJsa01vdmVFcnIgICAgPSAgIC0zNDAgICAgI19CbG9ja01vdmUgZXJyb3IKK3NtTmV3UEVyciAgID0gICAtMzM5ICAgICNfTmV3UHRyIGVycm9yCitzbVNlbE9PQkVyciA9ICAgLTMzOCAgICAjU2VsZWN0b3Igb3V0IG9mIGJvdW5kcyBlcnJvcgorc21TbG90T09CRXJyICAgID0gICAtMzM3ICAgICNTbG90IG91dCBvZiBib3VuZHMgZXJyb3IKK3NtTmlsc0Jsb2NrRXJyICA9ICAgLTMzNiAgICAjTmlsIHNCbG9jayBlcnJvciAoRG9udCBhbGxvY2F0ZSBhbmQgdHJ5IHRvIHVzZSBhIG5pbCBzQmxvY2spCitzbXNQb2ludGVyTmlsICAgPSAgIC0zMzUgICAgI0xQb2ludGVyIGlzIG5pbCBGcm9tIHNPZmZzZXREYXRhLiBJZiB0aGlzIGVycm9yIG9jY3VyczsgY2hlY2sgc0luZm8gcmVjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorc21DUFVFcnIgICAgPSAgIC0zMzQgICAgI0NvZGUgcmV2aXNpb24gaXMgd3JvbmcKK3NtQ29kZVJldkVyciAgICA9ICAgLTMzMyAgICAjQ29kZSByZXZpc2lvbiBpcyB3cm9uZworc21SZXNlcnZlZEVyciAgID0gICAtMzMyICAgICNSZXNlcnZlZCBmaWVsZCBub3QgemVybworc21CYWRzTGlzdCAgPSAgIC0zMzEgICAgI0JhZCBzTGlzdDogSWQxIDwgSWQyIDwgSWQzIC4uLmZvcm1hdCBpcyBub3QgZm9sbG93ZWQuCitzbUJhZFJlZklkICA9ICAgLTMzMCAgICAjUmVmZXJlbmNlIElkIG5vdCBmb3VuZCBpbiBMaXN0CitzbUJ1c0VyclRPICA9ICAgLTMyMCAgICAjQnVzRXJyb3IgdGltZSBvdXQuCitzbUJhZEJvYXJkSWQgICAgPSAgIC0zMTkgICAgI0JvYXJkSWQgd2FzIHdyb25nOyByZS1pbml0IHRoZSBQUkFNIHJlY29yZC4KK3NtUmVzZXJ2ZWRTbG90ICA9ICAgLTMxOCAgICAjc2xvdCBpcyByZXNlcnZlZCwgVk0gc2hvdWxkIG5vdCB1c2UgdGhpcyBhZGRyZXNzIHNwYWNlLgorc21Jbml0VGJsVkVyciAgID0gICAtMzE3ICAgICNBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgU2xvdCBSZXNvdXJjZSBUYWJsZS4KK3NtSW5pdFN0YXRWRXJyICA9ICAgLTMxNiAgICAjVGhlIEluaXRTdGF0dXNWIGZpZWxkIHdhcyBuZWdhdGl2ZSBhZnRlciBwcmltYXJ5IG9yIHNlY29uZGFyeSBpbml0Lgorc21Ob0JvYXJkSWQgPSAgIC0zMTUgICAgI05vIEJvYXJkIElkLgorc21HZXRQUkVyciAgPSAgIC0zMTQgICAgI0Vycm9yIG9jY3VycmVkIGR1cmluZyBfc0dldFBSQU1SZWMgKFNlZSBTSU1TdGF0dXMpLgorc21Ob0JvYXJkU1JzcmMgID0gICAtMzEzICAgICNObyBCb2FyZCBzUmVzb3VyY2UuCitzbURpc3Bvc2VQRXJyICAgPSAgIC0zMTIgICAgI19EaXNwb3NlUG9pbnRlciBlcnJvcgorc21GSEJsa0Rpc3BFcnIgID0gICAtMzExICAgICNFcnJvciBvY2N1cnJlZCBkdXJpbmcgX3NEaXNwb3NlUHRyIChEaXNwb3NlIG9mIEZIZWFkZXIgYmxvY2spLgorc21GSEJsb2NrUmRFcnIgID0gICAtMzEwICAgICNFcnJvciBvY2N1cnJlZCBkdXJpbmcgX3NHZXRGSGVhZGVyLgorc21CTEZpZWxkQmFkICAgID0gICAtMzA5ICAgICNCeXRlTGFuZXMgZmllbGQgd2FzIGJhZC4KK3NtVW5FeEJ1c0VyciAgICA9ICAgLTMwOCAgICAjVW5leHBlY3RlZCBCdXNFcnJvcgorc21SZXNydkVyciAgPSAgIC0zMDcgICAgI0ZhdGFsIHJlc2VydmVkIGVycm9yLiBSZXNyZXZlZCBmaWVsZCA8PiAwLgorc21Ob3NJbmZvQXJyYXkgID0gICAtMzA2ICAgICNObyBzSW5mb0FycmF5LiBNZW1vcnkgTWdyIGVycm9yLgorc21EaXNhYmxlZFNsb3QgID0gICAtMzA1ICAgICNUaGlzIHNsb3QgaXMgZGlzYWJsZWQgKC0zMDUgdXNlIHRvIGJlIHNtTFdUc3RCYWQpCitzbU5vRGlyID0gICAtMzA0ICAgICNEaXJlY3Rvcnkgb2Zmc2V0IGlzIE5pbAorc21SZXZpc2lvbkVyciAgID0gICAtMzAzICAgICNXcm9uZyByZXZpc29uIGxldmVsCitzbUZvcm1hdEVyciA9ICAgLTMwMiAgICAjRkhlYWRlciBGb3JtYXQgaXMgbm90IEFwcGxlJ3MKK3NtQ1JDRmFpbCAgID0gICAtMzAxICAgICNDUkMgY2hlY2sgZmFpbGVkIGZvciBkZWNsYXJhdGlvbiBkYXRhCitzbUVtcHR5U2xvdCA9ICAgLTMwMCAgICAjTm8gY2FyZCBpbiBzbG90CitubVR5cEVyciAgICA9ICAgLTI5OSAgICAjTm90aWZpY2F0aW9uIE1hbmFnZXI6d3JvbmcgcXVldWUgdHlwZQorc21QcmlJbml0RXJyICAgID0gICAtMjkzICAgICNFcnJvcjsgQ2FyZHMgY291bGQgbm90IGJlIGluaXRpYWxpemVkLgorc21QUkFNSW5pdEVyciAgID0gICAtMjkyICAgICNFcnJvcjsgU2xvdCBSZXNvdXJjZSBUYWJsZSBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQuCitzbVNSVEluaXRFcnIgICAgPSAgIC0yOTEgICAgI0Vycm9yOyBTbG90IFJlc291cmNlIFRhYmxlIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KK3NtU0RNSW5pdEVyciAgICA9ICAgLTI5MCAgICAjRXJyb3I7IFNETSBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQuCittaWRpSW52YWxpZENtZEVyciAgID0gICAtMjYxICAgICNjb21tYW5kIG5vdCBzdXBwb3J0ZWQgZm9yIHBvcnQgdHlwZQorbWlkaUR1cElERXJyICAgID0gICAtMjYwICAgICNkdXBsaWNhdGUgY2xpZW50IElECittaWRpTmFtZUxlbkVyciAgPSAgIC0yNTkgICAgI25hbWUgc3VwcGxpZWQgaXMgbG9uZ2VyIHRoYW4gMzEgY2hhcmFjdGVycworbWlkaVdyaXRlRXJyICAgID0gICAtMjU4ICAgICNNSURJV3JpdGVQYWNrZXQgY291bGRuJ3Qgd3JpdGUgdG8gYWxsIGNvbm5lY3RlZCBwb3J0cworbWlkaU5vQ29uRXJyICAgID0gICAtMjU3ICAgICNubyBjb25uZWN0aW9uIGV4aXN0cyBiZXR3ZWVuIHNwZWNpZmllZCBwb3J0cworbWlkaVZDb25uZWN0Um12ZCAgICA9ICAgLTI1NiAgICAjcGVuZGluZyB2aXJ0dWFsIGNvbm5lY3Rpb24gcmVtb3ZlZAorbWlkaVZDb25uZWN0TWFkZSAgICA9ICAgLTI1NSAgICAjcGVuZGluZyB2aXJ0dWFsIGNvbm5lY3Rpb24gcmVzb2x2ZWQKK21pZGlWQ29ubmVjdEVyciA9ICAgLTI1NCAgICAjcGVuZGluZyB2aXJ0dWFsIGNvbm5lY3Rpb24gY3JlYXRlZAorbWlkaVRvb01hbnlDb25zRXJyICA9ICAgLTI1MyAgICAjdG9vIG1hbnkgY29ubmVjdGlvbnMgbWFkZQorbWlkaVRvb01hbnlQb3J0c0VyciA9ICAgLTI1MiAgICAjdG9vIG1hbnkgcG9ydHMgYWxyZWFkeSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbQorbWlkaU5vUG9ydEVyciAgID0gICAtMjUxICAgICNubyBwb3J0IHdpdGggdGhhdCBJRCBmb3VuZAorbWlkaU5vQ2xpZW50RXJyID0gICAtMjUwICAgICNubyBjbGllbnQgd2l0aCB0aGF0IElEIGZvdW5kCitiYWRJbnB1dFRleHQgICAgPSAgIC0yNDcgICAgI2JhZElucHV0VGV4dAorYmFkRGljdEZvcm1hdCAgID0gICAtMjQ2ICAgICNiYWREaWN0Rm9ybWF0CitpbmNvbXBhdGlibGVWb2ljZSAgID0gICAtMjQ1ICAgICNpbmNvbXBhdGlibGVWb2ljZQordm9pY2VOb3RGb3VuZCAgID0gICAtMjQ0ICAgICN2b2ljZU5vdEZvdW5kCitidWZUb29TbWFsbCA9ICAgLTI0MyAgICAjYnVmVG9vU21hbGwKK3N5bnRoTm90UmVhZHkgICA9ICAgLTI0MiAgICAjc3ludGhOb3RSZWFkeQorc3ludGhPcGVuRmFpbGVkID0gICAtMjQxICAgICNzeW50aE9wZW5GYWlsZWQKK25vU3ludGhGb3VuZCAgICA9ICAgLTI0MCAgICAjbm9TeW50aEZvdW5kCitzaVVua25vd25RdWFsaXR5ICAgID0gICAtMjMyICAgICNpbnZhbGlkIHF1YWxpdHkgc2VsZWN0b3IgKHJldHVybmVkIGJ5IGRyaXZlcikKK3NpVW5rbm93bkluZm9UeXBlICAgPSAgIC0yMzEgICAgI2ludmFsaWQgaW5mbyB0eXBlIHNlbGVjdG9yIChyZXR1cm5lZCBieSBkcml2ZXIpCitzaUlucHV0RGV2aWNlRXJyICAgID0gICAtMjMwICAgICNpbnB1dCBkZXZpY2UgaGFyZHdhcmUgZmFpbHVyZQorc2lCYWRSZWZOdW0gPSAgIC0yMjkgICAgI2ludmFsaWQgaW5wdXQgZGV2aWNlIHJlZmVyZW5jZSBudW1iZXIKK3NpQmFkRGV2aWNlTmFtZSA9ICAgLTIyOCAgICAjaW5wdXQgZGV2aWNlIGNvdWxkIG5vdCBiZSBvcGVuZWQKK3NpRGV2aWNlQnVzeUVyciA9ICAgLTIyNyAgICAjaW5wdXQgZGV2aWNlIGFscmVhZHkgaW4gdXNlCitzaUludmFsaWRTYW1wbGVTaXplID0gICAtMjI2ICAgICNpbnZhbGlkIHNhbXBsZSBzaXplCitzaUludmFsaWRTYW1wbGVSYXRlID0gICAtMjI1ICAgICNpbnZhbGlkIHNhbXBsZSByYXRlCitzaUhhcmREcml2ZVRvb1Nsb3cgID0gICAtMjI0ICAgICNoYXJkIGRyaXZlIHRvbyBzbG93IHRvIHJlY29yZCB0byBkaXNrCitzaUludmFsaWRDb21wcmVzc2lvbiAgICA9ICAgLTIyMyAgICAjaW52YWxpZCBjb21wcmVzc2lvbiB0eXBlCitzaU5vQnVmZmVyU3BlY2lmaWVkID0gICAtMjIyICAgICNyZXR1cm5lZCBieSBzeW5jaHJvbm91cyBTUEJSZWNvcmQgaWYgbmlsIGJ1ZmZlciBwYXNzZWQKK3NpQmFkU291bmRJbkRldmljZSAgPSAgIC0yMjEgICAgI2ludmFsaWQgaW5kZXggcGFzc2VkIHRvIFNvdW5kSW5HZXRJbmRleGVkRGV2aWNlCitzaU5vU291bmRJbkhhcmR3YXJlID0gICAtMjIwICAgICNubyBTb3VuZCBJbnB1dCBoYXJkd2FyZQorc2lWQlJDb21wcmVzc2lvbk5vdFN1cHBvcnRlZCAgICA9ICAgLTIxMyAgICAjdmJyIGF1ZGlvIGNvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb3BlcmF0aW9uCitub01vcmVSZWFsVGltZSAgPSAgIC0yMTIgICAgI25vdCBlbm91Z2ggQ1BVIGN5Y2xlcyBsZWZ0IHRvIGFkZCBhbm90aGVyIHRhc2sKK2NoYW5uZWxOb3RCdXN5ICA9ICAgLTIxMSAgICAjY2hhbm5lbE5vdEJ1c3kKK2J1ZmZlcnNUb29TbWFsbCA9ICAgLTIxMCAgICAjY2FuIG5vdCBvcGVyYXRlIGluIHRoZSBtZW1vcnkgYWxsb3dlZAorY2hhbm5lbEJ1c3kgPSAgIC0yMDkgICAgI3RoZSBDaGFubmVsIGlzIGJlaW5nIHVzZWQgZm9yIGEgUEZEIGFscmVhZHkKK2JhZEZpbGVGb3JtYXQgICA9ICAgLTIwOCAgICAjd2FzIG5vdCB0eXBlIEFJRkYgb3Igd2FzIG9mIGJhZCBmb3JtYXQsY29ycnVwdAorbm90RW5vdWdoQnVmZmVyU3BhY2UgICAgPSAgIC0yMDcgICAgI2NvdWxkIG5vdCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5CitiYWRGb3JtYXQgICA9ICAgLTIwNiAgICAjU291bmQgTWFuYWdlciBFcnJvciBSZXR1cm5zCitiYWRDaGFubmVsICA9ICAgLTIwNSAgICAjU291bmQgTWFuYWdlciBFcnJvciBSZXR1cm5zCityZXNQcm9ibGVtICA9ICAgLTIwNCAgICAjU291bmQgTWFuYWdlciBFcnJvciBSZXR1cm5zCitxdWV1ZUZ1bGwgICA9ICAgLTIwMyAgICAjU291bmQgTWFuYWdlciBFcnJvciBSZXR1cm5zCitub3RFbm91Z2hIYXJkd2FyZUVyciAgICA9ICAgLTIwMSAgICAjU291bmQgTWFuYWdlciBFcnJvciBSZXR1cm5zCitub0hhcmR3YXJlRXJyICAgPSAgIC0yMDAgICAgI1NvdW5kIE1hbmFnZXIgRXJyb3IgUmV0dXJucworbWFwUmVhZEVyciAgPSAgIC0xOTkgICAgI21hcCBpbmNvbnNpc3RlbnQgd2l0aCBvcGVyYXRpb24KK3Jlc0F0dHJFcnIgID0gICAtMTk4ICAgICNhdHRyaWJ1dGUgaW5jb25zaXN0ZW50IHdpdGggb3BlcmF0aW9uCitybXZSZWZGYWlsZWQgICAgPSAgIC0xOTcgICAgI1JtdmVSZWZlcmVuY2UgZmFpbGVkCitybXZSZXNGYWlsZWQgICAgPSAgIC0xOTYgICAgI1JtdmVSZXNvdXJjZSBmYWlsZWQKK2FkZFJlZkZhaWxlZCAgICA9ICAgLTE5NSAgICAjQWRkUmVmZXJlbmNlIGZhaWxlZAorYWRkUmVzRmFpbGVkICAgID0gICAtMTk0ICAgICNBZGRSZXNvdXJjZSBmYWlsZWQKK3Jlc0ZOb3RGb3VuZCAgICA9ICAgLTE5MyAgICAjUmVzb3VyY2UgZmlsZSBub3QgZm91bmQKK3Jlc05vdEZvdW5kID0gICAtMTkyICAgICNSZXNvdXJjZSBub3QgZm91bmQKK2lucHV0T3V0T2ZCb3VuZHMgICAgPSAgIC0xOTAgICAgI09mZnNldCBvZiBDb3VudCBvdXQgb2YgYm91bmRzCit3cml0aW5nUGFzdEVuZCAgPSAgIC0xODkgICAgI1dyaXRpbmcgcGFzdCBlbmQgb2YgZmlsZQorcmVzb3VyY2VJbk1lbW9yeSAgICA9ICAgLTE4OCAgICAjUmVzb3VyY2UgYWxyZWFkeSBpbiBtZW1vcnkKK0NhbnREZWNvbXByZXNzICA9ICAgLTE4NiAgICAjcmVzb3VyY2UgYmVudCAoInRoZSBiZW5kcyIpIC0gY2FuJ3QgZGVjb21wcmVzcyBhIGNvbXByZXNzZWQgcmVzb3VyY2UKK2JhZEV4dFJlc291cmNlICA9ICAgLTE4NSAgICAjZXh0ZW5kZWQgcmVzb3VyY2UgaGFzIGEgYmFkIGZvcm1hdC4KK2NtTm9DdXJyZW50UHJvZmlsZSAgPSAgIC0xODIgICAgI1Jlc3BvbmRlciBlcnJvcgorY21VbnN1cHBvcnRlZERhdGFUeXBlICAgPSAgIC0xODEgICAgI1Jlc3BvbmRlciBlcnJvcgorY21DYW50RGVsZXRlUHJvZmlsZSA9ICAgLTE4MCAgICAjUmVzcG9uZGVyIGVycm9yCitjbUNhbnRYWVogICA9ICAgLTE3OSAgICAjQ01NIGNhbnQgaGFuZGxlIFhZWiBzcGFjZQorY21DYW50Q29uY2F0ZW5hdGVFcnJvciAgPSAgIC0xNzggICAgI1Byb2ZpbGUgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkCitjbVByb2ZpbGVzSWRlbnRpY2FsID0gICAtMTc3ICAgICNQcm9maWxlcyB0aGUgc2FtZQorY21Qcm9maWxlTm90Rm91bmQgICA9ICAgLTE3NiAgICAjUmVzcG9uZGVyIGVycm9yCitjbU1ldGhvZE5vdEZvdW5kICAgID0gICAtMTc1ICAgICNDTU0gbm90IHByZXNlbnQKK2NtTWV0aG9kRXJyb3IgICA9ICAgLTE3MSAgICAjY21NZXRob2RFcnJvcgorY21Qcm9maWxlRXJyb3IgID0gICAtMTcwICAgICNjbVByb2ZpbGVFcnJvcgorY0RlcHRoRXJyICAgPSAgIC0xNTcgICAgI2ludmFsaWQgcGl4ZWwgZGVwdGgKK2NSZXNFcnIgPSAgIC0xNTYgICAgI2ludmFsaWQgcmVzb2x1dGlvbiBmb3IgTWFrZUlUYWJsZQorY0RldkVyciA9ICAgLTE1NSAgICAjaW52YWxpZCB0eXBlIG9mIGdyYXBoaWNzIGRldmljZQorY1Byb3RlY3RFcnIgPSAgIC0xNTQgICAgI2NvbG9yVGFibGUgZW50cnkgcHJvdGVjdGlvbiB2aW9sYXRpb24KK2NSYW5nZUVyciAgID0gICAtMTUzICAgICNyYW5nZSBlcnJvciBvbiBjb2xvclRhYmxlIHJlcXVlc3QKK2NOb01lbUVyciAgID0gICAtMTUyICAgICNmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJ1Y3R1cmUKK2NUZW1wTWVtRXJyID0gICAtMTUxICAgICNmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0ZW1wb3Jhcnkgc3RydWN0dXJlcworY01hdGNoRXJyICAgPSAgIC0xNTAgICAgI0NvbG9yMkluZGV4IGZhaWxlZCB0byBmaW5kIGFuIGluZGV4CitpbnN1ZmZpY2llbnRTdGFja0VyciAgICA9ICAgLTE0OSAgICAjaW5zdWZmaWNpZW50U3RhY2tFcnIKK3BpeE1hcFRvb0RlZXBFcnIgICAgPSAgIC0xNDggICAgI3BpeE1hcFRvb0RlZXBFcnIKK3Jnbk92ZXJmbG93RXJyICA9ICAgLTE0NyAgICAjcmduT3ZlcmZsb3dFcnIKK25vTWVtRm9yUGljdFBsYXliYWNrRXJyID0gICAtMTQ1ICAgICNub01lbUZvclBpY3RQbGF5YmFja0VycgordXNlckNhbmNlbGVkRXJyID0gICAtMTI4ICAgICN1c2VyQ2FuY2VsZWRFcnIKK2hNZW51RmluZEVyciAgICA9ICAgLTEyNyAgICAjY291bGQgbm90IGZpbmQgSE1lbnUncyBwYXJlbnQgaW4gTWVudUtleSAod3JvbmcgZXJyb3IgY29kZSAtIG9ic29sZXRlKQorbUJhck5GbmQgICAgPSAgIC0xMjYgICAgI3N5c3RlbSBlcnJvciBjb2RlIGZvciBNQkRGIG5vdCBmb3VuZAordXBkUGl4TWVtRXJyICAgID0gICAtMTI1ICAgICNpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIHVwZGF0ZSBhIHBpeG1hcAordm9sR29uZUVyciAgPSAgIC0xMjQgICAgI1NlcnZlciB2b2x1bWUgaGFzIGJlZW4gZGlzY29ubmVjdGVkLgord3JnVm9sVHlwRXJyICAgID0gICAtMTIzICAgICNXcm9uZyB2b2x1bWUgdHlwZSBlcnJvciBbb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yIE1GU10KK2JhZE1vdkVyciAgID0gICAtMTIyICAgICNNb3ZlIGludG8gb2Zmc3ByaW5nIGVycm9yCit0bXdkb0VyciAgICA9ICAgLTEyMSAgICAjTm8gZnJlZSBXRENCIGF2YWlsYWJsZQorZGlyTkZFcnIgICAgPSAgIC0xMjAgICAgI0RpcmVjdG9yeSBub3QgZm91bmQKK21lbUxvY2tlZEVyciAgICA9ICAgLTExNyAgICAjdHJ5aW5nIHRvIG1vdmUgYSBsb2NrZWQgYmxvY2sgKE1vdmVISGkpCittZW1TQ0VyciAgICA9ICAgLTExNiAgICAjU2l6ZSBDaGVjayBmYWlsZWQKK21lbUJDRXJyICAgID0gICAtMTE1ICAgICNCbG9jayBDaGVjayBmYWlsZWQKK21lbVBDRXJyICAgID0gICAtMTE0ICAgICNQb2ludGVyIENoZWNrIGZhaWxlZAorbWVtQVpFcnIgICAgPSAgIC0xMTMgICAgI0FkZHJlc3MgaW4gem9uZSBjaGVjayBmYWlsZWQKK21lbVB1ckVyciAgID0gICAtMTEyICAgICN0cnlpbmcgdG8gcHVyZ2UgYSBsb2NrZWQgb3Igbm9uLXB1cmdlYWJsZSBibG9jaworbWVtV1pFcnIgICAgPSAgIC0xMTEgICAgI1doaWNoWm9uZSBmYWlsZWQgKGFwcGxpZWQgdG8gZnJlZSBibG9jaykKK21lbUFkckVyciAgID0gICAtMTEwICAgICNhZGRyZXNzIHdhcyBvZGQ7IG9yIG91dCBvZiByYW5nZQorbmlsSGFuZGxlRXJyICAgID0gICAtMTA5ICAgICNNYXN0ZXIgUG9pbnRlciB3YXMgTklMIGluIEhhbmRsZVpvbmUgb3Igb3RoZXIKK21lbUZ1bGxFcnIgID0gICAtMTA4ICAgICNOb3QgZW5vdWdoIHJvb20gaW4gaGVhcCB6b25lCitub1R5cGVFcnIgICA9ICAgLTEwMiAgICAjTm8gb2JqZWN0IG9mIHRoYXQgdHlwZSBpbiBzY3JhcAorbm9TY3JhcEVyciAgPSAgIC0xMDAgICAgI05vIHNjcmFwIGV4aXN0cyBlcnJvcgorbWVtUk9aV2FybiAgPSAgIC05OSAjc29mdCBlcnJvciBpbiBST1oKK3BvcnROb3RDZiAgID0gICAtOTggI2RyaXZlciBPcGVuIGVycm9yIGNvZGUgKHBhcmFtZXRlciBSQU0gbm90IGNvbmZpZ3VyZWQgZm9yIHRoaXMgY29ubmVjdGlvbikKK3BvcnRJblVzZSAgID0gICAtOTcgI2RyaXZlciBPcGVuIGVycm9yIGNvZGUgKHBvcnQgaXMgaW4gdXNlKQorcG9ydE5vdFB3ciAgPSAgIC05NiAjc2VyaWFsIHBvcnQgbm90IGN1cnJlbnRseSBwb3dlcmVkCitleGNlc3NDb2xsc25zICAgPSAgIC05NSAjZXhjZXNzaXZlIGNvbGxpc2lvbnMgb24gd3JpdGUKK2xhcFByb3RFcnIgID0gICAtOTQgI2Vycm9yIGluIGF0dGFjaGluZy9kZXRhY2hpbmcgcHJvdG9jb2wKK25vQnJpZGdlRXJyID0gICAtOTMgI25vIG5ldHdvcmsgYnJpZGdlIGZvciBub24tbG9jYWwgc2VuZAorZUxlbkVyciA9ICAgLTkyICNMZW5ndGggZXJyb3IgZGRwTGVuRXJyCitlTXVsdGlFcnIgICA9ICAgLTkxICNNdWx0aWNhc3QgYWRkcmVzcyBlcnJvciBkZHBTa3RFcnIKK2JyZWFrUmVjZCAgID0gICAtOTAgI0JyZWFrIHJlY2VpdmVkIChTQ0MpCityY3ZyRXJyID0gICAtODkgI1NDQyByZWNlaXZlciBlcnJvciAoZnJhbWluZzsgcGFyaXR5OyBPUikKK3BySW5pdEVyciAgID0gICAtODggI0luaXRVdGlsIGZvdW5kIHRoZSBwYXJhbWV0ZXIgcmFtIHVuaW5pdGlhbGl6ZWQKK3ByV3JFcnIgPSAgIC04NyAjcGFyYW1ldGVyIHJhbSB3cml0dGVuIGRpZG4ndCByZWFkLXZlcmlmeQorY2xrV3JFcnIgICAgPSAgIC04NiAjdGltZSB3cml0dGVuIGRpZCBub3QgdmVyaWZ5CitjbGtSZEVyciAgICA9ICAgLTg1ICN1bmFibGUgdG8gcmVhZCBzYW1lIGNsb2NrIHZhbHVlIHR3aWNlCit2ZXJFcnIgID0gICAtODQgI3RyYWNrIGZhaWxlZCB0byB2ZXJpZnkKK2ZtdDJFcnIgPSAgIC04MyAjY2FuJ3QgZ2V0IGVub3VnaCBzeW5jCitmbXQxRXJyID0gICAtODIgI2Nhbid0IGZpbmQgc2VjdG9yIDAgYWZ0ZXIgdHJhY2sgZm9ybWF0CitzZWN0TkZFcnIgICA9ICAgLTgxICNzZWN0b3IgbnVtYmVyIG5ldmVyIGZvdW5kIG9uIGEgdHJhY2sKK3NlZWtFcnIgPSAgIC04MCAjdHJhY2sgbnVtYmVyIHdyb25nIG9uIGFkZHJlc3MgbWFyaworc3BkQWRqRXJyICAgPSAgIC03OSAjdW5hYmxlIHRvIGNvcnJlY3RseSBhZGp1c3QgZGlzayBzcGVlZAordHdvU2lkZUVyciAgPSAgIC03OCAjdHJpZWQgdG8gcmVhZCAybmQgc2lkZSBvbiBhIDEtc2lkZWQgZHJpdmUKK2luaXRJV01FcnIgID0gICAtNzcgI3VuYWJsZSB0byBpbml0aWFsaXplIElXTQordGswQmFkRXJyICAgPSAgIC03NiAjdHJhY2sgMCBkZXRlY3QgZG9lc24ndCBjaGFuZ2UKK2NhbnRTdGVwRXJyID0gICAtNzUgI3N0ZXAgaGFuZHNoYWtlIGZhaWxlZAord3JVbmRlcnJ1biAgPSAgIC03NCAjd3JpdGUgdW5kZXJydW4gb2NjdXJyZWQKK2JhZERCdFNscCAgID0gICAtNzMgI2JhZCBkYXRhIG1hcmsgYml0IHNsaXAgbmliYmxlcworYmFkRENrc3VtICAgPSAgIC03MiAjYmFkIGRhdGEgbWFyayBjaGVja3N1bQorbm9EdGFNa0VyciAgPSAgIC03MSAjY291bGRuJ3QgZmluZCBhIGRhdGEgbWFyayBoZWFkZXIKK2JhZEJ0U2xwRXJyID0gICAtNzAgI2JhZCBhZGRyIG1hcmsgYml0IHNsaXAgbmliYmxlcworYmFkQ2tzbUVyciAgPSAgIC02OSAjYWRkciBtYXJrIGNoZWNrc3VtIGRpZG4ndCBjaGVjaworZGF0YVZlckVyciAgPSAgIC02OCAjcmVhZCB2ZXJpZnkgY29tcGFyZSBmYWlsZWQKK25vQWRyTWtFcnIgID0gICAtNjcgI2NvdWxkbid0IGZpbmQgdmFsaWQgYWRkciBtYXJrCitub055YkVyciAgICA9ICAgLTY2ICNjb3VsZG4ndCBmaW5kIDUgbnliYmxlcyBpbiAyMDAgdHJpZXMKK29mZkxpbkVyciAgID0gICAtNjUgI3IvdyByZXF1ZXN0ZWQgZm9yIGFuIG9mZi1saW5lIGRyaXZlCitmb250RGVjRXJyb3IgICAgPSAgIC02NCAjZXJyb3IgZHVyaW5nIGZvbnQgZGVjbGFyYXRpb24KK3dyUGVybUVyciAgID0gICAtNjEgI3dyaXRlIHBlcm1pc3Npb25zIGVycm9yCitiYWRNREJFcnIgICA9ICAgLTYwICNiYWQgbWFzdGVyIGRpcmVjdG9yeSBibG9jaworZnNSbkVyciA9ICAgLTU5ICNmaWxlIHN5c3RlbSBpbnRlcm5hbCBlcnJvcjpkdXJpbmcgcmVuYW1lIHRoZSBvbGQgZW50cnkgd2FzIGRlbGV0ZWQgYnV0IGNvdWxkIG5vdCBiZSByZXN0b3JlZC4KK2V4dEZTRXJyICAgID0gICAtNTggI3ZvbHVtZSBpbiBxdWVzdGlvbiBiZWxvbmdzIHRvIGFuIGV4dGVybmFsIGZzCitub01hY0Rza0VyciA9ICAgLTU3ICNub3QgYSBtYWMgZGlza2V0dGUgKHNpZyBieXRlcyBhcmUgd3JvbmcpCituc0RydkVyciAgICA9ICAgLTU2ICNubyBzdWNoIGRyaXZlICh0cmllZCB0byBtb3VudCBhIGJhZCBkcml2ZSBudW0pCit2b2xPbkxpbkVyciA9ICAgLTU1ICNkcml2ZSB2b2x1bWUgYWxyZWFkeSBvbi1saW5lIGF0IE1vdW50Vm9sCitwZXJtRXJyID0gICAtNTQgI3Blcm1pc3Npb25zIGVycm9yIChvbiBmaWxlIG9wZW4pCit2b2xPZmZMaW5FcnIgICAgPSAgIC01MyAjdm9sdW1lIG5vdCBvbiBsaW5lIGVycm9yICh3YXMgRWplY3RlZCkKK2dmcEVyciAgPSAgIC01MiAjZ2V0IGZpbGUgcG9zaXRpb24gZXJyb3IKK3JmTnVtRXJyICAgID0gICAtNTEgI3JlZm51bSBlcnJvcgorcGFyYW1FcnIgICAgPSAgIC01MCAjZXJyb3IgaW4gdXNlciBwYXJhbWV0ZXIgbGlzdAorb3BXckVyciA9ICAgLTQ5ICNmaWxlIGFscmVhZHkgb3BlbiB3aXRoIHdpdGggd3JpdGUgcGVybWlzc2lvbgorZHVwRk5FcnIgICAgPSAgIC00OCAjZHVwbGljYXRlIGZpbGVuYW1lIChyZW5hbWUpCitmQnN5RXJyID0gICAtNDcgI0ZpbGUgaXMgYnVzeSAoZGVsZXRlKQordkxja2RFcnIgICAgPSAgIC00NiAjdm9sdW1lIGlzIGxvY2tlZAorZkxja2RFcnIgICAgPSAgIC00NSAjZmlsZSBpcyBsb2NrZWQKK3dQckVyciAgPSAgIC00NCAjZGlza2V0dGUgaXMgd3JpdGUgcHJvdGVjdGVkLgorZm5mRXJyICA9ICAgLTQzICNGaWxlIG5vdCBmb3VuZAordG1mb0VyciA9ICAgLTQyICN0b28gbWFueSBmaWxlcyBvcGVuCittRnVsRXJyID0gICAtNDEgI21lbW9yeSBmdWxsIChvcGVuKSBvciBmaWxlIHdvbid0IGZpdCAobG9hZCkKK3Bvc0VyciAgPSAgIC00MCAjdHJpZWQgdG8gcG9zaXRpb24gdG8gYmVmb3JlIHN0YXJ0IG9mIGZpbGUgKHIvdykKK2VvZkVyciAgPSAgIC0zOSAjRW5kIG9mIGZpbGUKK2ZuT3BuRXJyICAgID0gICAtMzggI0ZpbGUgbm90IG9wZW4KK2JkTmFtRXJyICAgID0gICAtMzcgI3RoZXJlIG1heSBiZSBubyBiYWQgbmFtZXMgaW4gdGhlIGZpbmFsIHN5c3RlbSEKK2lvRXJyICAgPSAgIC0zNiAjSS9PIGVycm9yIChidW1tZXJzKQorbnN2RXJyICA9ICAgLTM1ICNubyBzdWNoIHZvbHVtZQorZHNrRnVsRXJyICAgPSAgIC0zNCAjZGlzayBmdWxsCitkaXJGdWxFcnIgICA9ICAgLTMzICNEaXJlY3RvcnkgZnVsbAorZGNlRXh0RXJyICAgPSAgIC0zMCAjZGNlIGV4dGVuc2lvbiBlcnJvcgordW5pdFRibEZ1bGxFcnIgID0gICAtMjkgI3VuaXQgdGFibGUgaGFzIG5vIG1vcmUgZW50cmllcworbm90T3BlbkVyciAgPSAgIC0yOCAjQ291bGRuJ3QgcmQvd3IvY3RsL3N0cyBjYXVzZSBkcml2ZXIgbm90IG9wZW5lZAoraUlPQWJvcnRFcnIgPSAgIC0yNyAjSU8gYWJvcnQgZXJyb3IgKFByaW50aW5nIE1hbmFnZXIpCitkSW5zdEVyciAgICA9ICAgLTI2ICNEcnZySW5zdGFsbCBjb3VsZG4ndCBmaW5kIGRyaXZlciBpbiByZXNvdXJjZXMKK2RSZW1vdkVyciAgID0gICAtMjUgI3RyaWVkIHRvIHJlbW92ZSBhbiBvcGVuIGRyaXZlcgorY2xvc0VyciA9ICAgLTI0ICNJL08gU3lzdGVtIEVycm9ycworb3BlbkVyciA9ICAgLTIzICNJL08gU3lzdGVtIEVycm9ycwordW5pdEVtcHR5RXJyICAgID0gICAtMjIgI0kvTyBTeXN0ZW0gRXJyb3JzCitiYWRVbml0RXJyICA9ICAgLTIxICNJL08gU3lzdGVtIEVycm9ycword3JpdEVyciA9ICAgLTIwICNJL08gU3lzdGVtIEVycm9ycworcmVhZEVyciA9ICAgLTE5ICNJL08gU3lzdGVtIEVycm9ycworc3RhdHVzRXJyICAgPSAgIC0xOCAjSS9PIFN5c3RlbSBFcnJvcnMKK2NvbnRyb2xFcnIgID0gICAtMTcgI0kvTyBTeXN0ZW0gRXJyb3JzCitkc0V4dGVuc2lvbnNEaXNhYmxlZCAgICA9ICAgLTEzICNzYXkglkV4dGVuc2lvbnMgRGlzYWJsZWSUCitkc0hEMjBJbnN0YWxsZWQgPSAgIC0xMiAjc2F5IJZIRDIwIFN0YXJ0dXCUCitkc0Rpc2Fzc2VtYmxlckluc3RhbGxlZCA9ICAgLTExICNzYXkglkRpc2Fzc2VtYmxlciBJbnN0YWxsZWSUCitkc01hY3NCdWdJbnN0YWxsZWQgID0gICAtMTAgI3NheSCWTWFjc0J1ZyBJbnN0YWxsZWSUCitzZU5vREIgID0gICAtOCAgI25vIGRlYnVnZ2VyIGluc3RhbGxlZCB0byBoYW5kbGUgZGVidWdnZXIgY29tbWFuZAorU2xwVHlwZUVyciAgPSAgIC01ICAjaW52YWxpZCBxdWV1ZSBlbGVtZW50Cit1bmltcEVyciAgICA9ICAgLTQgICN1bmltcGxlbWVudGVkIGNvcmUgcm91dGluZQorY29yRXJyICA9ICAgLTMgICNjb3JlIHJvdXRpbmUgbnVtYmVyIG91dCBvZiByYW5nZQorZHNOb0V4dHNEaXNhc3NlbWJsZXIgICAgPSAgIC0yICAjbm90IGEgU3lzRXJyLCBqdXN0IGEgcGxhY2Vob2xkZXIKK3FFcnIgICAgPSAgIC0xICAjcXVldWUgZWxlbWVudCBub3QgZm91bmQgZHVyaW5nIGRlbGV0aW9uCit0c21Db21wb25lbnROb0VyciAgID0gICAwICAgI2NvbXBvbmVudCByZXN1bHQgPSBubyBlcnJvcgorRVBFUk0gICA9ICAgMSAgICNPcGVyYXRpb24gbm90IHBlcm1pdHRlZAorRU5PRU5UICA9ICAgMiAgICNObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CitFU1JDSCAgID0gICAzICAgI05vIHN1Y2ggcHJvY2VzcworRUlOVFIgICA9ICAgNCAgICNJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbAorRUlPID0gICA1ICAgI0lucHV0L291dHB1dCBlcnJvcgorRU5YSU8gICA9ICAgNiAgICNEZXZpY2Ugbm90IGNvbmZpZ3VyZWQKK0UyQklHICAgPSAgIDcgICAjQXJndW1lbnQgbGlzdCB0b28gbG9uZworRU5PRVhFQyA9ICAgOCAgICNFeGVjIGZvcm1hdCBlcnJvcgorRUJBREYgICA9ICAgOSAgICNCYWQgZmlsZSBkZXNjcmlwdG9yCitFQ0hJTEQgID0gICAxMCAgI05vIGNoaWxkIHByb2Nlc3NlcworRURFQURMSyA9ICAgMTEgICNSZXNvdXJjZSBkZWFkbG9jayBhdm9pZGVkCitFTk9NRU0gID0gICAxMiAgI0Nhbm5vdCBhbGxvY2F0ZSBtZW1vcnkKK0VBQ0NFUyAgPSAgIDEzICAjUGVybWlzc2lvbiBkZW5pZWQKK0VGQVVMVCAgPSAgIDE0ICAjQmFkIGFkZHJlc3MKK0VDQU5DRUxFRCAgID0gICAxNSAgI09wZXJhdGlvbiBjYW5jZWxsZWQKK0VCVVNZICAgPSAgIDE2ICAjRGV2aWNlIGJ1c3kKK0VFWElTVCAgPSAgIDE3ICAjRmlsZSBleGlzdHMKK0VYREVWICAgPSAgIDE4ICAjQ3Jvc3MtZGV2aWNlIGxpbmsKK0VOT0RFViAgPSAgIDE5ICAjT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlCitFTk9URElSID0gICAyMCAgI05vdCBhIGRpcmVjdG9yeQorRUlTRElSICA9ICAgMjEgICNJcyBhIGRpcmVjdG9yeQorRUlOVkFMICA9ICAgMjIgICNJbnZhbGlkIGFyZ3VtZW50CitFTkZJTEUgID0gICAyMyAgI1RvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtCitFTUZJTEUgID0gICAyNCAgI1RvbyBtYW55IG9wZW4gZmlsZXMKK0VOT1RUWSAgPSAgIDI1ICAjSW5hcHByb3ByaWF0ZSBpb2N0bCBmb3IgZGV2aWNlCitFU0lHUEFSTSAgICA9ICAgMjYgICNTaWduYWwgZXJyb3IKK0VGQklHICAgPSAgIDI3ICAjRmlsZSB0b28gbGFyZ2UKK0VOT1NQQyAgPSAgIDI4ICAjTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UKK0VTUElQRSAgPSAgIDI5ICAjSWxsZWdhbCBzZWVrCitFUk9GUyAgID0gICAzMCAgI1JlYWQtb25seSBmaWxlIHN5c3RlbQorRU1MSU5LICA9ICAgMzEgICNUb28gbWFueSBsaW5rcworRVBJUEUgICA9ICAgMzIgICNCcm9rZW4gcGlwZQorRURPTSAgICA9ICAgMzMgICNOdW1lcmljYWwgYXJndW1lbnQgb3V0IG9mIGRvbWFpbgorRVJBTkdFICA9ICAgMzQgICNSZXN1bHQgdG9vIGxhcmdlCitFQUdBSU4gID0gICAzNSAgI1Jlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlCitFSU5QUk9HUkVTUyA9ICAgMzYgICNPcGVyYXRpb24gbm93IGluIHByb2dyZXNzCitFQUxSRUFEWSAgICA9ICAgMzcgICNPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcworRU5PVFNPQ0sgICAgPSAgIDM4ICAjU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0CitFREVTVEFERFJSRVEgICAgPSAgIDM5ICAjRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZAorRU1TR1NJWkUgICAgPSAgIDQwICAjTWVzc2FnZSB0b28gbG9uZworRVBST1RPVFlQRSAgPSAgIDQxICAjUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0CitFTk9QUk9UT09QVCA9ICAgNDIgICNQcm90b2NvbCBub3QgYXZhaWxhYmxlCitFUFJPVE9OT1NVUFBPUlQgPSAgIDQzICAjUHJvdG9jb2wgbm90IHN1cHBvcnRlZAorRVNPQ0tUTk9TVVBQT1JUID0gICA0NCAgI1NvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQKK0VPUE5PVFNVUFAgID0gICA0NSAgI09wZXJhdGlvbiBub3Qgc3VwcG9ydGVkCitFUEZOT1NVUFBPUlQgICAgPSAgIDQ2ICAjUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQKK0VBRk5PU1VQUE9SVCAgICA9ICAgNDcgICNBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIGZhbWlseQorRUFERFJJTlVTRSAgPSAgIDQ4ICAjQWRkcmVzcyBhbHJlYWR5IGluIHVzZQorRUFERFJOT1RBVkFJTCAgID0gICA0OSAgI0Nhbid0IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcworRU5FVERPV04gICAgPSAgIDUwICAjTmV0d29yayBpcyBkb3duCitFTkVUVU5SRUFDSCA9ICAgNTEgICNOZXR3b3JrIGlzIHVucmVhY2hhYmxlCitFTkVUUkVTRVQgICA9ICAgNTIgICNOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBvbiByZXNldAorRUNPTk5BQk9SVEVEICAgID0gICA1MyAgI1NvZnR3YXJlIGNhdXNlZCBjb25uZWN0aW9uIGFib3J0CitFQ09OTlJFU0VUICA9ICAgNTQgICNDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIKK0VOT0JVRlMgPSAgIDU1ICAjTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQorRUlTQ09OTiA9ICAgNTYgICNTb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQKK0VOT1RDT05OICAgID0gICA1NyAgI1NvY2tldCBpcyBub3QgY29ubmVjdGVkCitFU0hVVERPV04gICA9ICAgNTggICNDYW4ndCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgorRVRPT01BTllSRUZTICAgID0gICA1OSAgI1RvbyBtYW55IHJlZmVyZW5jZXM6IGNhbid0IHNwbGljZQorRVRJTUVET1VUICAgPSAgIDYwICAjT3BlcmF0aW9uIHRpbWVkIG91dAorRUNPTk5SRUZVU0VEICAgID0gICA2MSAgI0Nvbm5lY3Rpb24gcmVmdXNlZAorRUxPT1AgICA9ICAgNjIgICNUb28gbWFueSBsZXZlbHMgb2Ygc3ltYm9saWMgbGlua3MKK0VOQU1FVE9PTE9ORyAgICA9ICAgNjMgICNGaWxlIG5hbWUgdG9vIGxvbmcKK0VIT1NURE9XTiAgID0gICA2NCAgI0hvc3QgaXMgZG93bgorRUhPU1RVTlJFQUNIICAgID0gICA2NSAgI05vIHJvdXRlIHRvIGhvc3QKK0VOT1RFTVBUWSAgID0gICA2NiAgI0RpcmVjdG9yeSBub3QgZW1wdHkKK0VMT09LICAgPSAgIDY3ICAjSW50ZXJuYWwgbWFwcGluZyBmb3Iga09UTG9va0VyciwgZG9uJ3QgcmV0dXJuIHRvIGNsaWVudAorRU5PTENLICA9ICAgNzcgICNObyBsb2NrcyBhdmFpbGFibGUKK0VOT1NZUyAgPSAgIDc4ICAjRnVuY3Rpb24gbm90IGltcGxlbWVudGVkCitFSUxTRVEgID0gICA4OCAgI1dpZGUgY2hhcmFjdGVyIGVuY29kaW5nIGVycm9yCitFVU5LTk9XTiAgICA9ICAgOTkgICNVbmtub3duIGVycm9yCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbWFjZnMucHkgYi9MaWIvcGxhdC1tYWMvbWFjZnMucHkKaW5kZXggOGMyNmRkNS4uMTFkYmJlYiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL21hY2ZzLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9tYWNmcy5weQpAQCAtMjgsMjUgKzI4LDI1IEBACiAjIEZpbmQgdGhlIGVwb2NoIGNvbnZlcnNpb24gZm9yIGZpbGUgZGF0ZXMgaW4gYSB3YXkgdGhhdCB3b3JrcyBvbiBPUzkgYW5kIE9TWAogaW1wb3J0IHRpbWUKIGlmIHRpbWUuZ210aW1lKDApWzBdID09IDE5NzA6Ci0JX0VQT0NIQ09OVkVSVCA9IC0oKDE5NzAtMTkwNCkqMzY1ICsgMTcpICogKDI0KjYwKjYwKSArIDB4MTAwMDAwMDAwTAotCWRlZiBfdXRjMnRpbWUodXRjKToKLQkJdCA9IHV0Y1sxXSArIF9FUE9DSENPTlZFUlQKLQkJcmV0dXJuIGludCh0KQotCWRlZiBfdGltZTJ1dGModCk6Ci0JCXQgPSBpbnQodCkgLSBfRVBPQ0hDT05WRVJUCi0JCWlmIHQgPCAtMHg3ZmZmZmZmZjoKLQkJCXQgPSB0ICsgMHgxMDAwMDAwMEwKLQkJcmV0dXJuICgwLCBpbnQodCksIDApCisgICAgX0VQT0NIQ09OVkVSVCA9IC0oKDE5NzAtMTkwNCkqMzY1ICsgMTcpICogKDI0KjYwKjYwKSArIDB4MTAwMDAwMDAwTAorICAgIGRlZiBfdXRjMnRpbWUodXRjKToKKyAgICAgICAgdCA9IHV0Y1sxXSArIF9FUE9DSENPTlZFUlQKKyAgICAgICAgcmV0dXJuIGludCh0KQorICAgIGRlZiBfdGltZTJ1dGModCk6CisgICAgICAgIHQgPSBpbnQodCkgLSBfRVBPQ0hDT05WRVJUCisgICAgICAgIGlmIHQgPCAtMHg3ZmZmZmZmZjoKKyAgICAgICAgICAgIHQgPSB0ICsgMHgxMDAwMDAwMEwKKyAgICAgICAgcmV0dXJuICgwLCBpbnQodCksIDApCiBlbHNlOgotCWRlZiBfdXRjMnRpbWUodXRjKTogCi0JCXQgPSB1dGNbMV0KLQkJaWYgdCA8IDA6Ci0JCQl0ID0gdCArIDB4MTAwMDAwMDAwTAotCQlyZXR1cm4gdAotCWRlZiBfdGltZTJ1dGModCk6Ci0JCWlmIHQgPiAweDdmZmZmZmZmOgotCQkJdCA9IHQgLSAweDEwMDAwMDAwMEwKLQkJcmV0dXJuICgwLCBpbnQodCksIDApCisgICAgZGVmIF91dGMydGltZSh1dGMpOiAKKyAgICAgICAgdCA9IHV0Y1sxXQorICAgICAgICBpZiB0IDwgMDoKKyAgICAgICAgICAgIHQgPSB0ICsgMHgxMDAwMDAwMDBMCisgICAgICAgIHJldHVybiB0CisgICAgZGVmIF90aW1lMnV0Yyh0KToKKyAgICAgICAgaWYgdCA+IDB4N2ZmZmZmZmY6CisgICAgICAgICAgICB0ID0gdCAtIDB4MTAwMDAwMDAwTAorICAgICAgICByZXR1cm4gKDAsIGludCh0KSwgMCkKIAogIyBUaGUgb2xkIG5hbWUgb2YgdGhlIGVycm9yIG9iamVjdDoKIGVycm9yID0gQ2FyYm9uLkZpbGUuRXJyb3IKQEAgLTU2LDYwICs1Niw2MCBAQAogIyBvZiB0aGUgbWV0aG9kIG5hbWVzIGFyZSBzdWJ0bHkgZGlmZmVyZW50LgogIwogY2xhc3MgRlNTcGVjKENhcmJvbi5GaWxlLkZTU3BlYyk6Ci0JZGVmIGFzX2ZzcmVmKHNlbGYpOgotCQlyZXR1cm4gRlNSZWYoc2VsZikKLQkJCi0JZGVmIE5ld0FsaWFzKHNlbGYsIHNyYz1Ob25lKToKLQkJcmV0dXJuIEFsaWFzKENhcmJvbi5GaWxlLk5ld0FsaWFzKHNyYywgc2VsZikpCi0JCQotCWRlZiBHZXRDcmVhdG9yVHlwZShzZWxmKToKLQkJZmluZm8gPSBzZWxmLkZTcEdldEZJbmZvKCkKLQkJcmV0dXJuIGZpbmZvLkNyZWF0b3IsIGZpbmZvLlR5cGUKLQkJCi0JZGVmIFNldENyZWF0b3JUeXBlKHNlbGYsIGN0b3IsIHRwKToKLQkJZmluZm8gPSBzZWxmLkZTcEdldEZJbmZvKCkKLQkJZmluZm8uQ3JlYXRvciA9IGN0b3IKLQkJZmluZm8uVHlwZSA9IHRwCi0JCXNlbGYuRlNwU2V0RkluZm8oZmluZm8pCi0JCQotCWRlZiBHZXRGSW5mbyhzZWxmKToKLQkJcmV0dXJuIHNlbGYuRlNwR2V0RkluZm8oKQotCQkKLQlkZWYgU2V0RkluZm8oc2VsZiwgaW5mbyk6Ci0JCXJldHVybiBzZWxmLkZTcFNldEZJbmZvKGluZm8pCi0JCQotCWRlZiBHZXREYXRlcyhzZWxmKToKLQkJY2F0SW5mb0ZsYWdzID0ga0ZTQ2F0SW5mb0NyZWF0ZURhdGV8a0ZTQ2F0SW5mb0NvbnRlbnRNb2R8a0ZTQ2F0SW5mb0JhY2t1cERhdGUKLQkJY2F0aW5mbywgZDEsIGQyLCBkMyA9IEZTUmVmKHNlbGYpLkZTR2V0Q2F0YWxvZ0luZm8oY2F0SW5mb0ZsYWdzKQotCQljZGF0ZSA9IGNhdGluZm8uY3JlYXRlRGF0ZQotCQltZGF0ZSA9IGNhdGluZm8uY29udGVudE1vZERhdGUKLQkJYmRhdGUgPSBjYXRpbmZvLmJhY2t1cERhdGUKLQkJcmV0dXJuIF91dGMydGltZShjZGF0ZSksIF91dGMydGltZShtZGF0ZSksIF91dGMydGltZShiZGF0ZSkKLQkKLQlkZWYgU2V0RGF0ZXMoc2VsZiwgY2RhdGUsIG1kYXRlLCBiZGF0ZSk6Ci0JCWNhdEluZm9GbGFncyA9IGtGU0NhdEluZm9DcmVhdGVEYXRlfGtGU0NhdEluZm9Db250ZW50TW9kfGtGU0NhdEluZm9CYWNrdXBEYXRlCi0JCWNhdGluZm8gPSBDYXJib24uRmlsZS5GU0NhdGFsb2dJbmZvKAotCQkJY3JlYXRlRGF0ZSA9IF90aW1lMnV0YyhjZGF0ZSksCi0JCQljb250ZW50TW9kRGF0ZSA9IF90aW1lMnV0YyhtZGF0ZSksCi0JCQliYWNrdXBEYXRlID0gX3RpbWUydXRjKGJkYXRlKSkKLQkJRlNSZWYoc2VsZikuRlNTZXRDYXRhbG9nSW5mbyhjYXRJbmZvRmxhZ3MsIGNhdGluZm8pCi0JCisgICAgZGVmIGFzX2ZzcmVmKHNlbGYpOgorICAgICAgICByZXR1cm4gRlNSZWYoc2VsZikKKyAgICAgICAgCisgICAgZGVmIE5ld0FsaWFzKHNlbGYsIHNyYz1Ob25lKToKKyAgICAgICAgcmV0dXJuIEFsaWFzKENhcmJvbi5GaWxlLk5ld0FsaWFzKHNyYywgc2VsZikpCisgICAgICAgIAorICAgIGRlZiBHZXRDcmVhdG9yVHlwZShzZWxmKToKKyAgICAgICAgZmluZm8gPSBzZWxmLkZTcEdldEZJbmZvKCkKKyAgICAgICAgcmV0dXJuIGZpbmZvLkNyZWF0b3IsIGZpbmZvLlR5cGUKKyAgICAgICAgCisgICAgZGVmIFNldENyZWF0b3JUeXBlKHNlbGYsIGN0b3IsIHRwKToKKyAgICAgICAgZmluZm8gPSBzZWxmLkZTcEdldEZJbmZvKCkKKyAgICAgICAgZmluZm8uQ3JlYXRvciA9IGN0b3IKKyAgICAgICAgZmluZm8uVHlwZSA9IHRwCisgICAgICAgIHNlbGYuRlNwU2V0RkluZm8oZmluZm8pCisgICAgICAgIAorICAgIGRlZiBHZXRGSW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuRlNwR2V0RkluZm8oKQorICAgICAgICAKKyAgICBkZWYgU2V0RkluZm8oc2VsZiwgaW5mbyk6CisgICAgICAgIHJldHVybiBzZWxmLkZTcFNldEZJbmZvKGluZm8pCisgICAgICAgIAorICAgIGRlZiBHZXREYXRlcyhzZWxmKToKKyAgICAgICAgY2F0SW5mb0ZsYWdzID0ga0ZTQ2F0SW5mb0NyZWF0ZURhdGV8a0ZTQ2F0SW5mb0NvbnRlbnRNb2R8a0ZTQ2F0SW5mb0JhY2t1cERhdGUKKyAgICAgICAgY2F0aW5mbywgZDEsIGQyLCBkMyA9IEZTUmVmKHNlbGYpLkZTR2V0Q2F0YWxvZ0luZm8oY2F0SW5mb0ZsYWdzKQorICAgICAgICBjZGF0ZSA9IGNhdGluZm8uY3JlYXRlRGF0ZQorICAgICAgICBtZGF0ZSA9IGNhdGluZm8uY29udGVudE1vZERhdGUKKyAgICAgICAgYmRhdGUgPSBjYXRpbmZvLmJhY2t1cERhdGUKKyAgICAgICAgcmV0dXJuIF91dGMydGltZShjZGF0ZSksIF91dGMydGltZShtZGF0ZSksIF91dGMydGltZShiZGF0ZSkKKyAgICAKKyAgICBkZWYgU2V0RGF0ZXMoc2VsZiwgY2RhdGUsIG1kYXRlLCBiZGF0ZSk6CisgICAgICAgIGNhdEluZm9GbGFncyA9IGtGU0NhdEluZm9DcmVhdGVEYXRlfGtGU0NhdEluZm9Db250ZW50TW9kfGtGU0NhdEluZm9CYWNrdXBEYXRlCisgICAgICAgIGNhdGluZm8gPSBDYXJib24uRmlsZS5GU0NhdGFsb2dJbmZvKAorICAgICAgICAgICAgY3JlYXRlRGF0ZSA9IF90aW1lMnV0YyhjZGF0ZSksCisgICAgICAgICAgICBjb250ZW50TW9kRGF0ZSA9IF90aW1lMnV0YyhtZGF0ZSksCisgICAgICAgICAgICBiYWNrdXBEYXRlID0gX3RpbWUydXRjKGJkYXRlKSkKKyAgICAgICAgRlNSZWYoc2VsZikuRlNTZXRDYXRhbG9nSW5mbyhjYXRJbmZvRmxhZ3MsIGNhdGluZm8pCisgICAgCiBjbGFzcyBGU1JlZihDYXJib24uRmlsZS5GU1JlZik6Ci0JZGVmIGFzX2Zzc3BlYyhzZWxmKToKLQkJcmV0dXJuIEZTU3BlYyhzZWxmKQotCQorICAgIGRlZiBhc19mc3NwZWMoc2VsZik6CisgICAgICAgIHJldHVybiBGU1NwZWMoc2VsZikKKyAgICAKIGNsYXNzIEFsaWFzKENhcmJvbi5GaWxlLkFsaWFzKToKIAotCWRlZiBHZXRJbmZvKHNlbGYsIGluZGV4KToKLQkJcmV0dXJuIHNlbGYuR2V0QWxpYXNJbmZvKGluZGV4KQotCQkKLQlkZWYgVXBkYXRlKHNlbGYsICphcmdzKToKLQkJcGFzcyAjIHByaW50ICJBbGlhcy5VcGRhdGUgbm90IHlldCBpbXBsZW1lbnRlZCIKLQkJCi0JZGVmIFJlc29sdmUoc2VsZiwgc3JjPU5vbmUpOgotCQlmc3MsIGNoYW5nZWQgPSBzZWxmLlJlc29sdmVBbGlhcyhzcmMpCi0JCXJldHVybiBGU1NwZWMoZnNzKSwgY2hhbmdlZAotCQkKKyAgICBkZWYgR2V0SW5mbyhzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLkdldEFsaWFzSW5mbyhpbmRleCkKKyAgICAgICAgCisgICAgZGVmIFVwZGF0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHBhc3MgIyBwcmludCAiQWxpYXMuVXBkYXRlIG5vdCB5ZXQgaW1wbGVtZW50ZWQiCisgICAgICAgIAorICAgIGRlZiBSZXNvbHZlKHNlbGYsIHNyYz1Ob25lKToKKyAgICAgICAgZnNzLCBjaGFuZ2VkID0gc2VsZi5SZXNvbHZlQWxpYXMoc3JjKQorICAgICAgICByZXR1cm4gRlNTcGVjKGZzcyksIGNoYW5nZWQKKyAgICAgICAgCiBmcm9tIENhcmJvbi5GaWxlIGltcG9ydCBGSW5mbwogCiAjIEJhY2t3YXJkLWNvbXBhdGlibGUgdHlwZSBuYW1lczoKQEAgLTEyMCwyMSArMTIwLDIxIEBACiAKICMgR2xvYmFsIGZ1bmN0aW9uczoKIGRlZiBSZXNvbHZlQWxpYXNGaWxlKGZzcywgY2hhaW49MSk6Ci0JZnNzLCBpc2RpciwgaXNhbGlhcyA9IENhcmJvbi5GaWxlLlJlc29sdmVBbGlhc0ZpbGUoZnNzLCBjaGFpbikKLQlyZXR1cm4gRlNTcGVjKGZzcyksIGlzZGlyLCBpc2FsaWFzCi0JCisgICAgZnNzLCBpc2RpciwgaXNhbGlhcyA9IENhcmJvbi5GaWxlLlJlc29sdmVBbGlhc0ZpbGUoZnNzLCBjaGFpbikKKyAgICByZXR1cm4gRlNTcGVjKGZzcyksIGlzZGlyLCBpc2FsaWFzCisgICAgCiBkZWYgUmF3RlNTcGVjKGRhdGEpOgotCXJldHVybiBGU1NwZWMocmF3ZGF0YT1kYXRhKQotCQorICAgIHJldHVybiBGU1NwZWMocmF3ZGF0YT1kYXRhKQorICAgIAogZGVmIFJhd0FsaWFzKGRhdGEpOgotCXJldHVybiBBbGlhcyhyYXdkYXRhPWRhdGEpCi0JCisgICAgcmV0dXJuIEFsaWFzKHJhd2RhdGE9ZGF0YSkKKyAgICAKIGRlZiBGaW5kQXBwbGljYXRpb24oKmFyZ3MpOgotCXJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJGaW5kQXBwbGljYXRpb24gbm8gbG9uZ2VyIGltcGxlbWVudGVkIgotCQorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJGaW5kQXBwbGljYXRpb24gbm8gbG9uZ2VyIGltcGxlbWVudGVkIgorICAgIAogZGVmIE5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aChwYXRoKToKLQlyZXR1cm4gQWxpYXMoQ2FyYm9uLkZpbGUuTmV3QWxpYXNNaW5pbWFsRnJvbUZ1bGxQYXRoKHBhdGgsICcnLCAnJykpCi0JCisgICAgcmV0dXJuIEFsaWFzKENhcmJvbi5GaWxlLk5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aChwYXRoLCAnJywgJycpKQorICAgIAogIyBBbm90aGVyIGdsb2JhbCBmdW5jdGlvbjoKIGZyb20gQ2FyYm9uLkZvbGRlciBpbXBvcnQgRmluZEZvbGRlcgogCkBAIC0xNDUsNTQgKzE0NSw1NCBAQAogX2N1cmZvbGRlciA9IE5vbmUKIAogZGVmIFN0YW5kYXJkR2V0RmlsZSgqdHlwZWxpc3QpOgotCSIiIkFzayBmb3IgYW4gaW5wdXQgZmlsZSwgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIDQtY2hhciBmaWxlIHR5cGVzIHRoYXQgYXJlCi0JYWxsb3dhYmxlIiIiCi0JcmV0dXJuIFByb21wdEdldEZpbGUoJycsICp0eXBlbGlzdCkKLQkKKyAgICAiIiJBc2sgZm9yIGFuIGlucHV0IGZpbGUsIG9wdGlvbmFsbHkgc3BlY2lmeWluZyA0LWNoYXIgZmlsZSB0eXBlcyB0aGF0IGFyZQorICAgIGFsbG93YWJsZSIiIgorICAgIHJldHVybiBQcm9tcHRHZXRGaWxlKCcnLCAqdHlwZWxpc3QpCisgICAgCiBkZWYgUHJvbXB0R2V0RmlsZShwcm9tcHQsICp0eXBlbGlzdCk6Ci0JIiIiQXNrIGZvciBhbiBpbnB1dCBmaWxlIGdpdmluZyB0aGUgdXNlciBhIHByb21wdCBtZXNzYWdlLiBPcHRpb25hbGx5IHlvdSBjYW4KLQlzcGVjaWZ5aW5nIDQtY2hhciBmaWxlIHR5cGVzIHRoYXQgYXJlIGFsbG93YWJsZSIiIgotCWltcG9ydCBFYXN5RGlhbG9ncwotCXdhcm5pbmdzLndhcm4oIm1hY2ZzLlN0YW5kYXJkR2V0RmlsZSBhbmQgZnJpZW5kcyBhcmUgZGVwcmVjYXRlZCwgdXNlIEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuIiwKKyAgICAiIiJBc2sgZm9yIGFuIGlucHV0IGZpbGUgZ2l2aW5nIHRoZSB1c2VyIGEgcHJvbXB0IG1lc3NhZ2UuIE9wdGlvbmFsbHkgeW91IGNhbgorICAgIHNwZWNpZnlpbmcgNC1jaGFyIGZpbGUgdHlwZXMgdGhhdCBhcmUgYWxsb3dhYmxlIiIiCisgICAgaW1wb3J0IEVhc3lEaWFsb2dzCisgICAgd2FybmluZ3Mud2FybigibWFjZnMuU3RhbmRhcmRHZXRGaWxlIGFuZCBmcmllbmRzIGFyZSBkZXByZWNhdGVkLCB1c2UgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4iLAogICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLQlpZiBub3QgdHlwZWxpc3Q6Ci0JCXR5cGVsaXN0ID0gTm9uZQotCWZzcyA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9cHJvbXB0LCB3YW50ZWQ9RlNTcGVjLCAKLQkJdHlwZUxpc3Q9dHlwZWxpc3QsIGRlZmF1bHRMb2NhdGlvbj1faGFuZGxlU2V0Rm9sZGVyKCkpCi0JcmV0dXJuIGZzcywgbm90IGZzcyBpcyBOb25lCisgICAgaWYgbm90IHR5cGVsaXN0OgorICAgICAgICB0eXBlbGlzdCA9IE5vbmUKKyAgICBmc3MgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPXByb21wdCwgd2FudGVkPUZTU3BlYywgCisgICAgICAgIHR5cGVMaXN0PXR5cGVsaXN0LCBkZWZhdWx0TG9jYXRpb249X2hhbmRsZVNldEZvbGRlcigpKQorICAgIHJldHVybiBmc3MsIG5vdCBmc3MgaXMgTm9uZQogCiBkZWYgU3RhbmRhcmRQdXRGaWxlKHByb21wdCwgZGVmYXVsdD1Ob25lKToKLQkiIiJBc2sgdGhlIHVzZXIgZm9yIGFuIG91dHB1dCBmaWxlLCB3aXRoIGEgcHJvbXB0LiBPcHRpb25hbGx5IHlvdSBjbiBzdXBwbHkgYQotCWRlZmF1bHQgb3V0cHV0IGZpbGVuYW1lIiIiCi0JaW1wb3J0IEVhc3lEaWFsb2dzCi0Jd2FybmluZ3Mud2FybigibWFjZnMuU3RhbmRhcmRHZXRGaWxlIGFuZCBmcmllbmRzIGFyZSBkZXByZWNhdGVkLCB1c2UgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4iLAorICAgICIiIkFzayB0aGUgdXNlciBmb3IgYW4gb3V0cHV0IGZpbGUsIHdpdGggYSBwcm9tcHQuIE9wdGlvbmFsbHkgeW91IGNuIHN1cHBseSBhCisgICAgZGVmYXVsdCBvdXRwdXQgZmlsZW5hbWUiIiIKKyAgICBpbXBvcnQgRWFzeURpYWxvZ3MKKyAgICB3YXJuaW5ncy53YXJuKCJtYWNmcy5TdGFuZGFyZEdldEZpbGUgYW5kIGZyaWVuZHMgYXJlIGRlcHJlY2F0ZWQsIHVzZSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbiIsCiAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotCWZzcyA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKHdhbnRlZD1GU1NwZWMsIG1lc3NhZ2U9cHJvbXB0LCAKLQlzYXZlZEZpbGVOYW1lPWRlZmF1bHQsIGRlZmF1bHRMb2NhdGlvbj1faGFuZGxlU2V0Rm9sZGVyKCkpCi0JcmV0dXJuIGZzcywgbm90IGZzcyBpcyBOb25lCi0JCisgICAgZnNzID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUod2FudGVkPUZTU3BlYywgbWVzc2FnZT1wcm9tcHQsIAorICAgIHNhdmVkRmlsZU5hbWU9ZGVmYXVsdCwgZGVmYXVsdExvY2F0aW9uPV9oYW5kbGVTZXRGb2xkZXIoKSkKKyAgICByZXR1cm4gZnNzLCBub3QgZnNzIGlzIE5vbmUKKyAgICAKIGRlZiBTZXRGb2xkZXIoZm9sZGVyKToKLQlnbG9iYWwgX2N1cmZvbGRlcgotCXdhcm5pbmdzLndhcm4oIm1hY2ZzLlN0YW5kYXJkR2V0RmlsZSBhbmQgZnJpZW5kcyBhcmUgZGVwcmVjYXRlZCwgdXNlIEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuIiwKKyAgICBnbG9iYWwgX2N1cmZvbGRlcgorICAgIHdhcm5pbmdzLndhcm4oIm1hY2ZzLlN0YW5kYXJkR2V0RmlsZSBhbmQgZnJpZW5kcyBhcmUgZGVwcmVjYXRlZCwgdXNlIEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuIiwKICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0JaWYgX2N1cmZvbGRlcjoKLQkJcnYgPSBGU1NwZWMoX2N1cmZvbGRlcikKLQllbHNlOgotCQlydiA9IE5vbmUKLQlfY3VyZm9sZGVyID0gZm9sZGVyCi0JcmV0dXJuIHJ2Ci0JCisgICAgaWYgX2N1cmZvbGRlcjoKKyAgICAgICAgcnYgPSBGU1NwZWMoX2N1cmZvbGRlcikKKyAgICBlbHNlOgorICAgICAgICBydiA9IE5vbmUKKyAgICBfY3VyZm9sZGVyID0gZm9sZGVyCisgICAgcmV0dXJuIHJ2CisgICAgCiBkZWYgX2hhbmRsZVNldEZvbGRlcigpOgotCWdsb2JhbCBfY3VyZm9sZGVyCi0JcnYgPSBfY3VyZm9sZGVyCi0JX2N1cmZvbGRlciA9IE5vbmUKLQlyZXR1cm4gcnYKLQkKKyAgICBnbG9iYWwgX2N1cmZvbGRlcgorICAgIHJ2ID0gX2N1cmZvbGRlcgorICAgIF9jdXJmb2xkZXIgPSBOb25lCisgICAgcmV0dXJuIHJ2CisgICAgCiBkZWYgR2V0RGlyZWN0b3J5KHByb21wdD1Ob25lKToKLQkiIiJBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZm9sZGVyLiBPcHRpb25hbGx5IHlvdSBjYW4gZ2l2ZSBhIHByb21wdC4iIiIKLQlpbXBvcnQgRWFzeURpYWxvZ3MKLQl3YXJuaW5ncy53YXJuKCJtYWNmcy5TdGFuZGFyZEdldEZpbGUgYW5kIGZyaWVuZHMgYXJlIGRlcHJlY2F0ZWQsIHVzZSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbiIsCisgICAgIiIiQXNrIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZvbGRlci4gT3B0aW9uYWxseSB5b3UgY2FuIGdpdmUgYSBwcm9tcHQuIiIiCisgICAgaW1wb3J0IEVhc3lEaWFsb2dzCisgICAgd2FybmluZ3Mud2FybigibWFjZnMuU3RhbmRhcmRHZXRGaWxlIGFuZCBmcmllbmRzIGFyZSBkZXByZWNhdGVkLCB1c2UgRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4iLAogICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLQlmc3MgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIobWVzc2FnZT1wcm9tcHQsIHdhbnRlZD1GU1NwZWMsIAotCQlkZWZhdWx0TG9jYXRpb249X2hhbmRsZVNldEZvbGRlcigpKQotCXJldHVybiBmc3MsIG5vdCBmc3MgaXMgTm9uZQorICAgIGZzcyA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcihtZXNzYWdlPXByb21wdCwgd2FudGVkPUZTU3BlYywgCisgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1faGFuZGxlU2V0Rm9sZGVyKCkpCisgICAgcmV0dXJuIGZzcywgbm90IGZzcyBpcyBOb25lCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvbWFjcmVzb3VyY2UucHkgYi9MaWIvcGxhdC1tYWMvbWFjcmVzb3VyY2UucHkKaW5kZXggZDg3MzNjMi4uZTRjM2Y2MiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL21hY3Jlc291cmNlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9tYWNyZXNvdXJjZS5weQpAQCAtMTAsMTM3ICsxMCwxMzcgQEAKIGNsYXNzIFJlc291cmNlRmlsZU5vdEZvdW5kRXJyb3IoSW1wb3J0RXJyb3IpOiBwYXNzCiAKIGRlZiBuZWVkKHJlc3R5cGUsIHJlc2lkLCBmaWxlbmFtZT1Ob25lLCBtb2RuYW1lPU5vbmUpOgotCSIiIk9wZW4gYSByZXNvdXJjZSBmaWxlLCBpZiBuZWVkZWQuIHJlc3R5cGUgYW5kIHJlc2lkCi0JYXJlIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFuZCBpZGVudGlmeSB0aGUgcmVzb3VyY2UgZm9yIHdoaWNoIHRvIHRlc3QuIElmIGl0Ci0JaXMgYXZhaWxhYmxlIHdlIGFyZSBkb25lLiBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIHdlIGxvb2sgZm9yIGEgZmlsZSBmaWxlbmFtZQotCShkZWZhdWx0OiBtb2RuYW1lIHdpdGggLnJzcmMgYXBwZW5kZWQpIGVpdGhlciBpbiB0aGUgc2FtZSBmb2xkZXIgYXMKLQl3aGVyZSBtb2RuYW1lIHdhcyBsb2FkZWQgZnJvbSwgb3Igb3RoZXJ3aXNlIGFjcm9zcyBzeXMucGF0aC4KLQkKLQlSZXR1cm5zIHRoZSByZWZubyBvZiB0aGUgcmVzb3VyY2UgZmlsZSBvcGVuZWQgKG9yIE5vbmUpIiIiCisgICAgIiIiT3BlbiBhIHJlc291cmNlIGZpbGUsIGlmIG5lZWRlZC4gcmVzdHlwZSBhbmQgcmVzaWQKKyAgICBhcmUgcmVxdWlyZWQgcGFyYW1ldGVycywgYW5kIGlkZW50aWZ5IHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggdG8gdGVzdC4gSWYgaXQKKyAgICBpcyBhdmFpbGFibGUgd2UgYXJlIGRvbmUuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgd2UgbG9vayBmb3IgYSBmaWxlIGZpbGVuYW1lCisgICAgKGRlZmF1bHQ6IG1vZG5hbWUgd2l0aCAucnNyYyBhcHBlbmRlZCkgZWl0aGVyIGluIHRoZSBzYW1lIGZvbGRlciBhcworICAgIHdoZXJlIG1vZG5hbWUgd2FzIGxvYWRlZCBmcm9tLCBvciBvdGhlcndpc2UgYWNyb3NzIHN5cy5wYXRoLgorICAgIAorICAgIFJldHVybnMgdGhlIHJlZm5vIG9mIHRoZSByZXNvdXJjZSBmaWxlIG9wZW5lZCAob3IgTm9uZSkiIiIKIAotCWlmIG1vZG5hbWUgaXMgTm9uZSBhbmQgZmlsZW5hbWUgaXMgTm9uZToKLQkJcmFpc2UgQXJndW1lbnRFcnJvciwgIkVpdGhlciBmaWxlbmFtZSBvciBtb2RuYW1lIGFyZ3VtZW50IChvciBib3RoKSBtdXN0IGJlIGdpdmVuIgotCQotCWlmIHR5cGUocmVzaWQpIGlzIHR5cGUoMSk6Ci0JCXRyeToKLQkJCWggPSBSZXMuR2V0UmVzb3VyY2UocmVzdHlwZSwgcmVzaWQpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQlwYXNzCi0JCWVsc2U6Ci0JCQlyZXR1cm4gTm9uZQotCWVsc2U6Ci0JCXRyeToKLQkJCWggPSBSZXMuR2V0TmFtZWRSZXNvdXJjZShyZXN0eXBlLCByZXNpZCkKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCXBhc3MKLQkJZWxzZToKLQkJCXJldHVybiBOb25lCi0JCQkKLQkjIENvbnN0cnVjdCBhIGZpbGVuYW1lIGlmIHdlIGRvbid0IGhhdmUgb25lCi0JaWYgbm90IGZpbGVuYW1lOgotCQlpZiAnLicgaW4gbW9kbmFtZToKLQkJCWZpbGVuYW1lID0gbW9kbmFtZS5zcGxpdCgnLicpWy0xXSArICcucnNyYycKLQkJZWxzZToKLQkJCWZpbGVuYW1lID0gbW9kbmFtZSArICcucnNyYycKLQkKLQkjIE5vdyBjcmVhdGUgYSBsaXN0IG9mIGZvbGRlcnMgdG8gc2VhcmNoCi0Jc2VhcmNoZGlycyA9IFtdCi0JaWYgbW9kbmFtZSA9PSAnX19tYWluX18nOgotCQkjIElmIHdlJ3JlIG1haW4gd2UgbG9vayBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKLQkJc2VhcmNoZGlycyA9IFtvcy5jdXJkaXJdCi0JaWYgc3lzLm1vZHVsZXMuaGFzX2tleShtb2RuYW1lKToKLQkJbW9kID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0KLQkJaWYgaGFzYXR0cihtb2QsICdfX2ZpbGVfXycpOgotCQkJc2VhcmNoZGlycyA9IFtvcy5wYXRoLmRpcm5hbWUobW9kLl9fZmlsZV9fKV0KLQlzZWFyY2hkaXJzLmV4dGVuZChzeXMucGF0aCkKLQkKLQkjIEFuZCBsb29rIGZvciB0aGUgZmlsZQotCWZvciBkaXIgaW4gc2VhcmNoZGlyczoKLQkJcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSkKLQkJaWYgb3MucGF0aC5leGlzdHMocGF0aG5hbWUpOgotCQkJYnJlYWsKLQllbHNlOgotCQlyYWlzZSBSZXNvdXJjZUZpbGVOb3RGb3VuZEVycm9yLCBmaWxlbmFtZQotCQotCXJlZm5vID0gb3Blbl9wYXRobmFtZShwYXRobmFtZSkKLQkKLQkjIEFuZCBjaGVjayB0aGF0IHRoZSByZXNvdXJjZSBleGlzdHMgbm93Ci0JaWYgdHlwZShyZXNpZCkgaXMgdHlwZSgxKToKLQkJaCA9IFJlcy5HZXRSZXNvdXJjZShyZXN0eXBlLCByZXNpZCkKLQllbHNlOgotCQloID0gUmVzLkdldE5hbWVkUmVzb3VyY2UocmVzdHlwZSwgcmVzaWQpCi0JcmV0dXJuIHJlZm5vCi0JCisgICAgaWYgbW9kbmFtZSBpcyBOb25lIGFuZCBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiRWl0aGVyIGZpbGVuYW1lIG9yIG1vZG5hbWUgYXJndW1lbnQgKG9yIGJvdGgpIG11c3QgYmUgZ2l2ZW4iCisgICAgCisgICAgaWYgdHlwZShyZXNpZCkgaXMgdHlwZSgxKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaCA9IFJlcy5HZXRSZXNvdXJjZShyZXN0eXBlLCByZXNpZCkKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaCA9IFJlcy5HZXROYW1lZFJlc291cmNlKHJlc3R5cGUsIHJlc2lkKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIAorICAgICMgQ29uc3RydWN0IGEgZmlsZW5hbWUgaWYgd2UgZG9uJ3QgaGF2ZSBvbmUKKyAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgIGlmICcuJyBpbiBtb2RuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBtb2RuYW1lLnNwbGl0KCcuJylbLTFdICsgJy5yc3JjJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBtb2RuYW1lICsgJy5yc3JjJworICAgIAorICAgICMgTm93IGNyZWF0ZSBhIGxpc3Qgb2YgZm9sZGVycyB0byBzZWFyY2gKKyAgICBzZWFyY2hkaXJzID0gW10KKyAgICBpZiBtb2RuYW1lID09ICdfX21haW5fXyc6CisgICAgICAgICMgSWYgd2UncmUgbWFpbiB3ZSBsb29rIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorICAgICAgICBzZWFyY2hkaXJzID0gW29zLmN1cmRpcl0KKyAgICBpZiBzeXMubW9kdWxlcy5oYXNfa2V5KG1vZG5hbWUpOgorICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2RuYW1lXQorICAgICAgICBpZiBoYXNhdHRyKG1vZCwgJ19fZmlsZV9fJyk6CisgICAgICAgICAgICBzZWFyY2hkaXJzID0gW29zLnBhdGguZGlybmFtZShtb2QuX19maWxlX18pXQorICAgIHNlYXJjaGRpcnMuZXh0ZW5kKHN5cy5wYXRoKQorICAgIAorICAgICMgQW5kIGxvb2sgZm9yIHRoZSBmaWxlCisgICAgZm9yIGRpciBpbiBzZWFyY2hkaXJzOgorICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihkaXIsIGZpbGVuYW1lKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRobmFtZSk6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFJlc291cmNlRmlsZU5vdEZvdW5kRXJyb3IsIGZpbGVuYW1lCisgICAgCisgICAgcmVmbm8gPSBvcGVuX3BhdGhuYW1lKHBhdGhuYW1lKQorICAgIAorICAgICMgQW5kIGNoZWNrIHRoYXQgdGhlIHJlc291cmNlIGV4aXN0cyBub3cKKyAgICBpZiB0eXBlKHJlc2lkKSBpcyB0eXBlKDEpOgorICAgICAgICBoID0gUmVzLkdldFJlc291cmNlKHJlc3R5cGUsIHJlc2lkKQorICAgIGVsc2U6CisgICAgICAgIGggPSBSZXMuR2V0TmFtZWRSZXNvdXJjZShyZXN0eXBlLCByZXNpZCkKKyAgICByZXR1cm4gcmVmbm8KKyAgICAKIGRlZiBvcGVuX3BhdGhuYW1lKHBhdGhuYW1lLCB2ZXJib3NlPTApOgotCSIiIk9wZW4gYSByZXNvdXJjZSBmaWxlIGdpdmVuIGJ5IHBhdGhuYW1lLCBwb3NzaWJseSBkZWNvZGluZyBhbgotCUFwcGxlU2luZ2xlIGZpbGUiIiIKLQl0cnk6Ci0JCXJlZm5vID0gUmVzLkZTcE9wZW5SZXNGaWxlKHBhdGhuYW1lLCAxKQotCWV4Y2VwdCBSZXMuRXJyb3IsIGFyZzoKLQkJaWYgYXJnWzBdIGluICgtMzcsIC0zOSk6Ci0JCQkjIE5vIHJlc291cmNlIGZvcmsuIFdlIG1heSBiZSBvbiBPU1gsIGFuZCB0aGlzIG1heSBiZSBlaXRoZXIKLQkJCSMgYSBkYXRhLWZvcmsgYmFzZWQgcmVzb3VyY2UgZmlsZSBvciBhIEFwcGxlU2luZ2xlIGZpbGUKLQkJCSMgZnJvbSB0aGUgQ1ZTIHJlcG9zaXRvcnkuCi0JCQl0cnk6Ci0JCQkJcmVmbm8gPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKHBhdGhuYW1lLCB1JycsIDEpCi0JCQlleGNlcHQgUmVzLkVycm9yLCBhcmc6Ci0JCQkJaWYgYXJnWzBdICE9IC0xOTk6Ci0JCQkJCSMgLTE5OSBpcyAiYmFkIHJlc291cmNlIG1hcCIKLQkJCQkJcmFpc2UKLQkJCWVsc2U6Ci0JCQkJcmV0dXJuIHJlZm5vCi0JCQkjIEZpbmFsbHkgdHJ5IGRlY29kaW5nIGFuIEFwcGxlU2luZ2xlIGZpbGUKLQkJCXBhdGhuYW1lID0gX2RlY29kZShwYXRobmFtZSwgdmVyYm9zZT12ZXJib3NlKQotCQkJcmVmbm8gPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKHBhdGhuYW1lLCB1JycsIDEpCi0JCWVsc2U6Ci0JCQlyYWlzZQotCXJldHVybiByZWZubwotCQorICAgICIiIk9wZW4gYSByZXNvdXJjZSBmaWxlIGdpdmVuIGJ5IHBhdGhuYW1lLCBwb3NzaWJseSBkZWNvZGluZyBhbgorICAgIEFwcGxlU2luZ2xlIGZpbGUiIiIKKyAgICB0cnk6CisgICAgICAgIHJlZm5vID0gUmVzLkZTcE9wZW5SZXNGaWxlKHBhdGhuYW1lLCAxKQorICAgIGV4Y2VwdCBSZXMuRXJyb3IsIGFyZzoKKyAgICAgICAgaWYgYXJnWzBdIGluICgtMzcsIC0zOSk6CisgICAgICAgICAgICAjIE5vIHJlc291cmNlIGZvcmsuIFdlIG1heSBiZSBvbiBPU1gsIGFuZCB0aGlzIG1heSBiZSBlaXRoZXIKKyAgICAgICAgICAgICMgYSBkYXRhLWZvcmsgYmFzZWQgcmVzb3VyY2UgZmlsZSBvciBhIEFwcGxlU2luZ2xlIGZpbGUKKyAgICAgICAgICAgICMgZnJvbSB0aGUgQ1ZTIHJlcG9zaXRvcnkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVmbm8gPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKHBhdGhuYW1lLCB1JycsIDEpCisgICAgICAgICAgICBleGNlcHQgUmVzLkVycm9yLCBhcmc6CisgICAgICAgICAgICAgICAgaWYgYXJnWzBdICE9IC0xOTk6CisgICAgICAgICAgICAgICAgICAgICMgLTE5OSBpcyAiYmFkIHJlc291cmNlIG1hcCIKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlZm5vCisgICAgICAgICAgICAjIEZpbmFsbHkgdHJ5IGRlY29kaW5nIGFuIEFwcGxlU2luZ2xlIGZpbGUKKyAgICAgICAgICAgIHBhdGhuYW1lID0gX2RlY29kZShwYXRobmFtZSwgdmVyYm9zZT12ZXJib3NlKQorICAgICAgICAgICAgcmVmbm8gPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKHBhdGhuYW1lLCB1JycsIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZQorICAgIHJldHVybiByZWZubworICAgIAogZGVmIHJlc291cmNlX3BhdGhuYW1lKHBhdGhuYW1lLCB2ZXJib3NlPTApOgotCSIiIlJldHVybiB0aGUgcGF0aG5hbWUgZm9yIGEgcmVzb3VyY2UgZmlsZSAoZWl0aGVyIERGIG9yIFJGIGJhc2VkKS4KLQlJZiB0aGUgcGF0aG5hbWUgZ2l2ZW4gYWxyZWFkeSByZWZlcnMgdG8gc3VjaCBhIGZpbGUgc2ltcGx5IHJldHVybiBpdCwKLQlvdGhlcndpc2UgZmlyc3QgZGVjb2RlIGl0LiIiIgotCXRyeToKLQkJcmVmbm8gPSBSZXMuRlNwT3BlblJlc0ZpbGUocGF0aG5hbWUsIDEpCi0JCVJlcy5DbG9zZVJlc0ZpbGUocmVmbm8pCi0JZXhjZXB0IFJlcy5FcnJvciwgYXJnOgotCQlpZiBhcmdbMF0gaW4gKC0zNywgLTM5KToKLQkJCSMgTm8gcmVzb3VyY2UgZm9yay4gV2UgbWF5IGJlIG9uIE9TWCwgYW5kIHRoaXMgbWF5IGJlIGVpdGhlcgotCQkJIyBhIGRhdGEtZm9yayBiYXNlZCByZXNvdXJjZSBmaWxlIG9yIGEgQXBwbGVTaW5nbGUgZmlsZQotCQkJIyBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeS4KLQkJCXRyeToKLQkJCQlyZWZubyA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUocGF0aG5hbWUsIHUnJywgMSkKLQkJCWV4Y2VwdCBSZXMuRXJyb3IsIGFyZzoKLQkJCQlpZiBhcmdbMF0gIT0gLTE5OToKLQkJCQkJIyAtMTk5IGlzICJiYWQgcmVzb3VyY2UgbWFwIgotCQkJCQlyYWlzZQotCQkJZWxzZToKLQkJCQlyZXR1cm4gcmVmbm8KLQkJCSMgRmluYWxseSB0cnkgZGVjb2RpbmcgYW4gQXBwbGVTaW5nbGUgZmlsZQotCQkJcGF0aG5hbWUgPSBfZGVjb2RlKHBhdGhuYW1lLCB2ZXJib3NlPXZlcmJvc2UpCi0JCWVsc2U6Ci0JCQlyYWlzZQotCXJldHVybiBwYXRobmFtZQotCQorICAgICIiIlJldHVybiB0aGUgcGF0aG5hbWUgZm9yIGEgcmVzb3VyY2UgZmlsZSAoZWl0aGVyIERGIG9yIFJGIGJhc2VkKS4KKyAgICBJZiB0aGUgcGF0aG5hbWUgZ2l2ZW4gYWxyZWFkeSByZWZlcnMgdG8gc3VjaCBhIGZpbGUgc2ltcGx5IHJldHVybiBpdCwKKyAgICBvdGhlcndpc2UgZmlyc3QgZGVjb2RlIGl0LiIiIgorICAgIHRyeToKKyAgICAgICAgcmVmbm8gPSBSZXMuRlNwT3BlblJlc0ZpbGUocGF0aG5hbWUsIDEpCisgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUocmVmbm8pCisgICAgZXhjZXB0IFJlcy5FcnJvciwgYXJnOgorICAgICAgICBpZiBhcmdbMF0gaW4gKC0zNywgLTM5KToKKyAgICAgICAgICAgICMgTm8gcmVzb3VyY2UgZm9yay4gV2UgbWF5IGJlIG9uIE9TWCwgYW5kIHRoaXMgbWF5IGJlIGVpdGhlcgorICAgICAgICAgICAgIyBhIGRhdGEtZm9yayBiYXNlZCByZXNvdXJjZSBmaWxlIG9yIGEgQXBwbGVTaW5nbGUgZmlsZQorICAgICAgICAgICAgIyBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWZubyA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUocGF0aG5hbWUsIHUnJywgMSkKKyAgICAgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3IsIGFyZzoKKyAgICAgICAgICAgICAgICBpZiBhcmdbMF0gIT0gLTE5OToKKyAgICAgICAgICAgICAgICAgICAgIyAtMTk5IGlzICJiYWQgcmVzb3VyY2UgbWFwIgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVmbm8KKyAgICAgICAgICAgICMgRmluYWxseSB0cnkgZGVjb2RpbmcgYW4gQXBwbGVTaW5nbGUgZmlsZQorICAgICAgICAgICAgcGF0aG5hbWUgPSBfZGVjb2RlKHBhdGhuYW1lLCB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZQorICAgIHJldHVybiBwYXRobmFtZQorICAgIAogZGVmIG9wZW5fZXJyb3JfcmVzb3VyY2UoKToKLQkiIiJPcGVuIHRoZSByZXNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGVycm9yIGNvZGUgdG8gZXJyb3IgbWVzc2FnZQotCW1hcHBpbmcuIiIiCi0JbmVlZCgnRXN0cicsIDEsIGZpbGVuYW1lPSJlcnJvcnMucnNyYyIsIG1vZG5hbWU9X19uYW1lX18pCi0JCisgICAgIiIiT3BlbiB0aGUgcmVzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBlcnJvciBjb2RlIHRvIGVycm9yIG1lc3NhZ2UKKyAgICBtYXBwaW5nLiIiIgorICAgIG5lZWQoJ0VzdHInLCAxLCBmaWxlbmFtZT0iZXJyb3JzLnJzcmMiLCBtb2RuYW1lPV9fbmFtZV9fKQorICAgIAogZGVmIF9kZWNvZGUocGF0aG5hbWUsIHZlcmJvc2U9MCk6Ci0JIyBEZWNvZGUgYW4gQXBwbGVTaW5nbGUgcmVzb3VyY2UgZmlsZSwgcmV0dXJuIHRoZSBuZXcgcGF0aG5hbWUuCi0JbmV3cGF0aG5hbWUgPSBwYXRobmFtZSArICcuZGYucnNyYycKLQlpZiBvcy5wYXRoLmV4aXN0cyhuZXdwYXRobmFtZSkgYW5kIFwKLQkJb3Muc3RhdChuZXdwYXRobmFtZSkuc3RfbXRpbWUgPj0gb3Muc3RhdChwYXRobmFtZSkuc3RfbXRpbWU6Ci0JCXJldHVybiBuZXdwYXRobmFtZQotCWlmIGhhc2F0dHIob3MsICdhY2Nlc3MnKSBhbmQgbm90IFwKLQkJb3MuYWNjZXNzKG9zLnBhdGguZGlybmFtZShwYXRobmFtZSksIG9zLldfT0t8b3MuWF9PSyk6Ci0JCSMgVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpc24ndCB3cml0ZWFibGUuIENyZWF0ZSB0aGUgZmlsZSBpbgotCQkjIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQotCQlpbXBvcnQgdGVtcGZpbGUKLQkJZmQsIG5ld3BhdGhuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgiLnJzcmMiKQotCWlmIHZlcmJvc2U6Ci0JCXByaW50ICdEZWNvZGluZycsIHBhdGhuYW1lLCAndG8nLCBuZXdwYXRobmFtZQotCWltcG9ydCBhcHBsZXNpbmdsZQotCWFwcGxlc2luZ2xlLmRlY29kZShwYXRobmFtZSwgbmV3cGF0aG5hbWUsIHJlc29ubHk9MSkKLQlyZXR1cm4gbmV3cGF0aG5hbWUKKyAgICAjIERlY29kZSBhbiBBcHBsZVNpbmdsZSByZXNvdXJjZSBmaWxlLCByZXR1cm4gdGhlIG5ldyBwYXRobmFtZS4KKyAgICBuZXdwYXRobmFtZSA9IHBhdGhuYW1lICsgJy5kZi5yc3JjJworICAgIGlmIG9zLnBhdGguZXhpc3RzKG5ld3BhdGhuYW1lKSBhbmQgXAorICAgICAgICBvcy5zdGF0KG5ld3BhdGhuYW1lKS5zdF9tdGltZSA+PSBvcy5zdGF0KHBhdGhuYW1lKS5zdF9tdGltZToKKyAgICAgICAgcmV0dXJuIG5ld3BhdGhuYW1lCisgICAgaWYgaGFzYXR0cihvcywgJ2FjY2VzcycpIGFuZCBub3QgXAorICAgICAgICBvcy5hY2Nlc3Mob3MucGF0aC5kaXJuYW1lKHBhdGhuYW1lKSwgb3MuV19PS3xvcy5YX09LKToKKyAgICAgICAgIyBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGlzbid0IHdyaXRlYWJsZS4gQ3JlYXRlIHRoZSBmaWxlIGluCisgICAgICAgICMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5CisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorICAgICAgICBmZCwgbmV3cGF0aG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCIucnNyYyIpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ0RlY29kaW5nJywgcGF0aG5hbWUsICd0bycsIG5ld3BhdGhuYW1lCisgICAgaW1wb3J0IGFwcGxlc2luZ2xlCisgICAgYXBwbGVzaW5nbGUuZGVjb2RlKHBhdGhuYW1lLCBuZXdwYXRobmFtZSwgcmVzb25seT0xKQorICAgIHJldHVybiBuZXdwYXRobmFtZQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL3BpbXAucHkgYi9MaWIvcGxhdC1tYWMvcGltcC5weQppbmRleCA2NjY0NDc1Li43ODZmNDBhIDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvcGltcC5weQorKysgYi9MaWIvcGxhdC1tYWMvcGltcC5weQpAQCAtNDMsNzU2ICs0Myw3NTYgQEAKIERFRkFVTFRfUElNUERBVEFCQVNFPSJodHRwOi8vd3d3LmN3aS5ubC9+amFjay9waW1wL3BpbXAtJXMucGxpc3QiICUgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkKIAogQVJDSElWRV9GT1JNQVRTID0gWwotCSgiLnRhci5aIiwgInpjYXQgXCIlc1wiIHwgdGFyIC14ZiAtIiksCi0JKCIudGF6IiwgInpjYXQgXCIlc1wiIHwgdGFyIC14ZiAtIiksCi0JKCIudGFyLmd6IiwgInpjYXQgXCIlc1wiIHwgdGFyIC14ZiAtIiksCi0JKCIudGd6IiwgInpjYXQgXCIlc1wiIHwgdGFyIC14ZiAtIiksCi0JKCIudGFyLmJ6IiwgImJ6Y2F0IFwiJXNcIiB8IHRhciAteGYgLSIpLAotCSgiLnppcCIsICJ1bnppcCBcIiVzXCIiKSwKKyAgICAoIi50YXIuWiIsICJ6Y2F0IFwiJXNcIiB8IHRhciAteGYgLSIpLAorICAgICgiLnRheiIsICJ6Y2F0IFwiJXNcIiB8IHRhciAteGYgLSIpLAorICAgICgiLnRhci5neiIsICJ6Y2F0IFwiJXNcIiB8IHRhciAteGYgLSIpLAorICAgICgiLnRneiIsICJ6Y2F0IFwiJXNcIiB8IHRhciAteGYgLSIpLAorICAgICgiLnRhci5ieiIsICJiemNhdCBcIiVzXCIgfCB0YXIgLXhmIC0iKSwKKyAgICAoIi56aXAiLCAidW56aXAgXCIlc1wiIiksCiBdCiAKIGNsYXNzIFBpbXBQcmVmZXJlbmNlczoKLQkiIiJDb250YWluZXIgZm9yIHBlci11c2VyIHByZWZlcmVuY2VzLCBzdWNoIGFzIHRoZSBkYXRhYmFzZSB0byB1c2UKLQlhbmQgd2hlcmUgdG8gaW5zdGFsbCBwYWNrYWdlcy4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgCi0JCQlmbGF2b3JPcmRlcj1Ob25lLAotCQkJZG93bmxvYWREaXI9Tm9uZSwKLQkJCWJ1aWxkRGlyPU5vbmUsCi0JCQlpbnN0YWxsRGlyPU5vbmUsCi0JCQlwaW1wRGF0YWJhc2U9Tm9uZSk6Ci0JCWlmIG5vdCBmbGF2b3JPcmRlcjoKLQkJCWZsYXZvck9yZGVyID0gREVGQVVMVF9GTEFWT1JPUkRFUgotCQlpZiBub3QgZG93bmxvYWREaXI6Ci0JCQlkb3dubG9hZERpciA9IERFRkFVTFRfRE9XTkxPQURESVIKLQkJaWYgbm90IGJ1aWxkRGlyOgotCQkJYnVpbGREaXIgPSBERUZBVUxUX0JVSUxERElSCi0JCWlmIG5vdCBpbnN0YWxsRGlyOgotCQkJaW5zdGFsbERpciA9IERFRkFVTFRfSU5TVEFMTERJUgotCQlpZiBub3QgcGltcERhdGFiYXNlOgotCQkJcGltcERhdGFiYXNlID0gREVGQVVMVF9QSU1QREFUQUJBU0UKLQkJc2VsZi5mbGF2b3JPcmRlciA9IGZsYXZvck9yZGVyCi0JCXNlbGYuZG93bmxvYWREaXIgPSBkb3dubG9hZERpcgotCQlzZWxmLmJ1aWxkRGlyID0gYnVpbGREaXIKLQkJc2VsZi5pbnN0YWxsRGlyID0gaW5zdGFsbERpcgotCQlzZWxmLnBpbXBEYXRhYmFzZSA9IHBpbXBEYXRhYmFzZQotCQkKLQlkZWYgY2hlY2soc2VsZik6Ci0JCSIiIkNoZWNrIHRoYXQgdGhlIHByZWZlcmVuY2VzIG1ha2Ugc2Vuc2U6IGRpcmVjdG9yaWVzIGV4aXN0IGFuZCBhcmUKLQkJd3JpdGFibGUsIHRoZSBpbnN0YWxsIGRpcmVjdG9yeSBpcyBvbiBzeXMucGF0aCwgZXRjLiIiIgotCQkKLQkJcnYgPSAiIgotCQlSV1hfT0sgPSBvcy5SX09LfG9zLldfT0t8b3MuWF9PSwotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5kb3dubG9hZERpcik6Ci0JCQlydiArPSAiV2FybmluZzogRG93bmxvYWQgZGlyZWN0b3J5IFwiJXNcIiBkb2VzIG5vdCBleGlzdFxuIiAlIHNlbGYuZG93bmxvYWREaXIKLQkJZWxpZiBub3Qgb3MuYWNjZXNzKHNlbGYuZG93bmxvYWREaXIsIFJXWF9PSyk6Ci0JCQlydiArPSAiV2FybmluZzogRG93bmxvYWQgZGlyZWN0b3J5IFwiJXNcIiBpcyBub3Qgd3JpdGFibGUgb3Igbm90IHJlYWRhYmxlXG4iICUgc2VsZi5kb3dubG9hZERpcgotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5idWlsZERpcik6Ci0JCQlydiArPSAiV2FybmluZzogQnVpbGQgZGlyZWN0b3J5IFwiJXNcIiBkb2VzIG5vdCBleGlzdFxuIiAlIHNlbGYuYnVpbGREaXIKLQkJZWxpZiBub3Qgb3MuYWNjZXNzKHNlbGYuYnVpbGREaXIsIFJXWF9PSyk6Ci0JCQlydiArPSAiV2FybmluZzogQnVpbGQgZGlyZWN0b3J5IFwiJXNcIiBpcyBub3Qgd3JpdGFibGUgb3Igbm90IHJlYWRhYmxlXG4iICUgc2VsZi5idWlsZERpcgotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5pbnN0YWxsRGlyKToKLQkJCXJ2ICs9ICJXYXJuaW5nOiBJbnN0YWxsIGRpcmVjdG9yeSBcIiVzXCIgZG9lcyBub3QgZXhpc3RcbiIgJSBzZWxmLmluc3RhbGxEaXIKLQkJZWxpZiBub3Qgb3MuYWNjZXNzKHNlbGYuaW5zdGFsbERpciwgUldYX09LKToKLQkJCXJ2ICs9ICJXYXJuaW5nOiBJbnN0YWxsIGRpcmVjdG9yeSBcIiVzXCIgaXMgbm90IHdyaXRhYmxlIG9yIG5vdCByZWFkYWJsZVxuIiAlIHNlbGYuaW5zdGFsbERpcgotCQllbHNlOgotCQkJaW5zdGFsbERpciA9IG9zLnBhdGgucmVhbHBhdGgoc2VsZi5pbnN0YWxsRGlyKQotCQkJZm9yIHAgaW4gc3lzLnBhdGg6Ci0JCQkJdHJ5OgotCQkJCQlyZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocCkKLQkJCQlleGNlcHQ6Ci0JCQkJCXBhc3MKLQkJCQlpZiBpbnN0YWxsRGlyID09IHJlYWxwYXRoOgotCQkJCQlicmVhawotCQkJZWxzZToKLQkJCQlydiArPSAiV2FybmluZzogSW5zdGFsbCBkaXJlY3RvcnkgXCIlc1wiIGlzIG5vdCBvbiBzeXMucGF0aFxuIiAlIHNlbGYuaW5zdGFsbERpcgotCQlyZXR1cm4gcnYJCQkKLQkJCi0JZGVmIGNvbXBhcmVGbGF2b3JzKHNlbGYsIGxlZnQsIHJpZ2h0KToKLQkJIiIiQ29tcGFyZSB0d28gZmxhdm9yIHN0cmluZ3MuIFRoaXMgaXMgcGFydCBvZiB5b3VyIHByZWZlcmVuY2VzCi0JCWJlY2F1c2Ugd2hldGhlciB0aGUgdXNlciBwcmVmZXJzIGluc3RhbGxpbmcgZnJvbSBzb3VyY2Ugb3IgYmluYXJ5IGlzLiIiIgotCQlpZiBsZWZ0IGluIHNlbGYuZmxhdm9yT3JkZXI6Ci0JCQlpZiByaWdodCBpbiBzZWxmLmZsYXZvck9yZGVyOgotCQkJCXJldHVybiBjbXAoc2VsZi5mbGF2b3JPcmRlci5pbmRleChsZWZ0KSwgc2VsZi5mbGF2b3JPcmRlci5pbmRleChyaWdodCkpCi0JCQlyZXR1cm4gLTEKLQkJaWYgcmlnaHQgaW4gc2VsZi5mbGF2b3JPcmRlcjoKLQkJCXJldHVybiAxCi0JCXJldHVybiBjbXAobGVmdCwgcmlnaHQpCi0JCQorICAgICIiIkNvbnRhaW5lciBmb3IgcGVyLXVzZXIgcHJlZmVyZW5jZXMsIHN1Y2ggYXMgdGhlIGRhdGFiYXNlIHRvIHVzZQorICAgIGFuZCB3aGVyZSB0byBpbnN0YWxsIHBhY2thZ2VzLiIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAKKyAgICAgICAgICAgIGZsYXZvck9yZGVyPU5vbmUsCisgICAgICAgICAgICBkb3dubG9hZERpcj1Ob25lLAorICAgICAgICAgICAgYnVpbGREaXI9Tm9uZSwKKyAgICAgICAgICAgIGluc3RhbGxEaXI9Tm9uZSwKKyAgICAgICAgICAgIHBpbXBEYXRhYmFzZT1Ob25lKToKKyAgICAgICAgaWYgbm90IGZsYXZvck9yZGVyOgorICAgICAgICAgICAgZmxhdm9yT3JkZXIgPSBERUZBVUxUX0ZMQVZPUk9SREVSCisgICAgICAgIGlmIG5vdCBkb3dubG9hZERpcjoKKyAgICAgICAgICAgIGRvd25sb2FkRGlyID0gREVGQVVMVF9ET1dOTE9BRERJUgorICAgICAgICBpZiBub3QgYnVpbGREaXI6CisgICAgICAgICAgICBidWlsZERpciA9IERFRkFVTFRfQlVJTERESVIKKyAgICAgICAgaWYgbm90IGluc3RhbGxEaXI6CisgICAgICAgICAgICBpbnN0YWxsRGlyID0gREVGQVVMVF9JTlNUQUxMRElSCisgICAgICAgIGlmIG5vdCBwaW1wRGF0YWJhc2U6CisgICAgICAgICAgICBwaW1wRGF0YWJhc2UgPSBERUZBVUxUX1BJTVBEQVRBQkFTRQorICAgICAgICBzZWxmLmZsYXZvck9yZGVyID0gZmxhdm9yT3JkZXIKKyAgICAgICAgc2VsZi5kb3dubG9hZERpciA9IGRvd25sb2FkRGlyCisgICAgICAgIHNlbGYuYnVpbGREaXIgPSBidWlsZERpcgorICAgICAgICBzZWxmLmluc3RhbGxEaXIgPSBpbnN0YWxsRGlyCisgICAgICAgIHNlbGYucGltcERhdGFiYXNlID0gcGltcERhdGFiYXNlCisgICAgICAgIAorICAgIGRlZiBjaGVjayhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCB0aGUgcHJlZmVyZW5jZXMgbWFrZSBzZW5zZTogZGlyZWN0b3JpZXMgZXhpc3QgYW5kIGFyZQorICAgICAgICB3cml0YWJsZSwgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGlzIG9uIHN5cy5wYXRoLCBldGMuIiIiCisgICAgICAgIAorICAgICAgICBydiA9ICIiCisgICAgICAgIFJXWF9PSyA9IG9zLlJfT0t8b3MuV19PS3xvcy5YX09LCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmRvd25sb2FkRGlyKToKKyAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBEb3dubG9hZCBkaXJlY3RvcnkgXCIlc1wiIGRvZXMgbm90IGV4aXN0XG4iICUgc2VsZi5kb3dubG9hZERpcgorICAgICAgICBlbGlmIG5vdCBvcy5hY2Nlc3Moc2VsZi5kb3dubG9hZERpciwgUldYX09LKToKKyAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBEb3dubG9hZCBkaXJlY3RvcnkgXCIlc1wiIGlzIG5vdCB3cml0YWJsZSBvciBub3QgcmVhZGFibGVcbiIgJSBzZWxmLmRvd25sb2FkRGlyCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJ1aWxkRGlyKToKKyAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBCdWlsZCBkaXJlY3RvcnkgXCIlc1wiIGRvZXMgbm90IGV4aXN0XG4iICUgc2VsZi5idWlsZERpcgorICAgICAgICBlbGlmIG5vdCBvcy5hY2Nlc3Moc2VsZi5idWlsZERpciwgUldYX09LKToKKyAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBCdWlsZCBkaXJlY3RvcnkgXCIlc1wiIGlzIG5vdCB3cml0YWJsZSBvciBub3QgcmVhZGFibGVcbiIgJSBzZWxmLmJ1aWxkRGlyCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmluc3RhbGxEaXIpOgorICAgICAgICAgICAgcnYgKz0gIldhcm5pbmc6IEluc3RhbGwgZGlyZWN0b3J5IFwiJXNcIiBkb2VzIG5vdCBleGlzdFxuIiAlIHNlbGYuaW5zdGFsbERpcgorICAgICAgICBlbGlmIG5vdCBvcy5hY2Nlc3Moc2VsZi5pbnN0YWxsRGlyLCBSV1hfT0spOgorICAgICAgICAgICAgcnYgKz0gIldhcm5pbmc6IEluc3RhbGwgZGlyZWN0b3J5IFwiJXNcIiBpcyBub3Qgd3JpdGFibGUgb3Igbm90IHJlYWRhYmxlXG4iICUgc2VsZi5pbnN0YWxsRGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbnN0YWxsRGlyID0gb3MucGF0aC5yZWFscGF0aChzZWxmLmluc3RhbGxEaXIpCisgICAgICAgICAgICBmb3IgcCBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5yZWFscGF0aChwKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGlmIGluc3RhbGxEaXIgPT0gcmVhbHBhdGg6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBJbnN0YWxsIGRpcmVjdG9yeSBcIiVzXCIgaXMgbm90IG9uIHN5cy5wYXRoXG4iICUgc2VsZi5pbnN0YWxsRGlyCisgICAgICAgIHJldHVybiBydiAgICAgICAgICAgCisgICAgICAgIAorICAgIGRlZiBjb21wYXJlRmxhdm9ycyhzZWxmLCBsZWZ0LCByaWdodCk6CisgICAgICAgICIiIkNvbXBhcmUgdHdvIGZsYXZvciBzdHJpbmdzLiBUaGlzIGlzIHBhcnQgb2YgeW91ciBwcmVmZXJlbmNlcworICAgICAgICBiZWNhdXNlIHdoZXRoZXIgdGhlIHVzZXIgcHJlZmVycyBpbnN0YWxsaW5nIGZyb20gc291cmNlIG9yIGJpbmFyeSBpcy4iIiIKKyAgICAgICAgaWYgbGVmdCBpbiBzZWxmLmZsYXZvck9yZGVyOgorICAgICAgICAgICAgaWYgcmlnaHQgaW4gc2VsZi5mbGF2b3JPcmRlcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZmxhdm9yT3JkZXIuaW5kZXgobGVmdCksIHNlbGYuZmxhdm9yT3JkZXIuaW5kZXgocmlnaHQpKQorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGlmIHJpZ2h0IGluIHNlbGYuZmxhdm9yT3JkZXI6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4gY21wKGxlZnQsIHJpZ2h0KQorICAgICAgICAKIGNsYXNzIFBpbXBEYXRhYmFzZToKLQkiIiJDbGFzcyByZXByZXNlbnRpbmcgYSBwaW1wIGRhdGFiYXNlLiBJdCBjYW4gYWN0dWFsbHkgY29udGFpbgotCWluZm9ybWF0aW9uIGZyb20gbXVsdGlwbGUgZGF0YWJhc2VzIHRocm91Z2ggaW5jbHVzaW9uLCBidXQgdGhlCi0JdG9wbGV2ZWwgZGF0YWJhc2UgaXMgY29uc2lkZXJlZCB0aGUgbWFzdGVyLCBhcyBpdHMgbWFpbnRhaW5lciBpcwotCSJyZXNwb25zaWJsZSIgZm9yIHRoZSBjb250ZW50cy4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcHJlZnMpOgotCQlzZWxmLl9wYWNrYWdlcyA9IFtdCi0JCXNlbGYucHJlZmVyZW5jZXMgPSBwcmVmcwotCQlzZWxmLl91cmxsaXN0ID0gW10KLQkJc2VsZi5fdmVyc2lvbiA9ICIiCi0JCXNlbGYuX21haW50YWluZXIgPSAiIgotCQlzZWxmLl9kZXNjcmlwdGlvbiA9ICIiCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJIiIiQ2xlYW4gdXAiIiIKLQkJc2VsZi5fcGFja2FnZXMgPSBbXQotCQlzZWxmLnByZWZlcmVuY2VzID0gTm9uZQotCQkKLQlkZWYgYXBwZW5kVVJMKHNlbGYsIHVybCwgaW5jbHVkZWQ9MCk6Ci0JCSIiIkFwcGVuZCBwYWNrYWdlcyBmcm9tIHRoZSBkYXRhYmFzZSB3aXRoIHRoZSBnaXZlbiBVUkwuCi0JCU9ubHkgdGhlIGZpcnN0IGRhdGFiYXNlIHNob3VsZCBzcGVjaWZ5IGluY2x1ZGVkPTAsIHNvIHRoZQotCQlnbG9iYWwgaW5mb3JtYXRpb24gKG1haW50YWluZXIsIGRlc2NyaXB0aW9uKSBnZXQgc3RvcmVkLiIiIgotCQkKLQkJaWYgdXJsIGluIHNlbGYuX3VybGxpc3Q6Ci0JCQlyZXR1cm4KLQkJc2VsZi5fdXJsbGlzdC5hcHBlbmQodXJsKQotCQlmcCA9IHVybGxpYjIudXJsb3Blbih1cmwpLmZwCi0JCWRpY3QgPSBwbGlzdGxpYi5QbGlzdC5mcm9tRmlsZShmcCkKLQkJIyBUZXN0IGhlcmUgZm9yIFBpbXAgdmVyc2lvbiwgZXRjCi0JCWlmIG5vdCBpbmNsdWRlZDoKLQkJCXNlbGYuX3ZlcnNpb24gPSBkaWN0LmdldCgnVmVyc2lvbicsICcwLjEnKQotCQkJaWYgc2VsZi5fdmVyc2lvbiAhPSBQSU1QX1ZFUlNJT046Ci0JCQkJc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogZGF0YWJhc2UgdmVyc2lvbiAlcyBkb2VzIG5vdCBtYXRjaCAlc1xuIiAKLQkJCQkJJSAoc2VsZi5fdmVyc2lvbiwgUElNUF9WRVJTSU9OKSkKLQkJCXNlbGYuX21haW50YWluZXIgPSBkaWN0LmdldCgnTWFpbnRhaW5lcicsICcnKQotCQkJc2VsZi5fZGVzY3JpcHRpb24gPSBkaWN0LmdldCgnRGVzY3JpcHRpb24nLCAnJykKLQkJc2VsZi5fYXBwZW5kUGFja2FnZXMoZGljdFsnUGFja2FnZXMnXSkKLQkJb3RoZXJzID0gZGljdC5nZXQoJ0luY2x1ZGUnLCBbXSkKLQkJZm9yIHVybCBpbiBvdGhlcnM6Ci0JCQlzZWxmLmFwcGVuZFVSTCh1cmwsIGluY2x1ZGVkPTEpCi0JCQotCWRlZiBfYXBwZW5kUGFja2FnZXMoc2VsZiwgcGFja2FnZXMpOgotCQkiIiJHaXZlbiBhIGxpc3Qgb2YgZGljdGlvbmFyaWVzIGNvbnRhaW5pbmcgcGFja2FnZQotCQlkZXNjcmlwdGlvbnMgY3JlYXRlIHRoZSBQaW1wUGFja2FnZSBvYmplY3RzIGFuZCBhcHBlbmQgdGhlbQotCQl0byBvdXIgaW50ZXJuYWwgc3RvcmFnZS4iIiIKLQkJCi0JCWZvciBwIGluIHBhY2thZ2VzOgotCQkJcCA9IGRpY3QocCkKLQkJCWZsYXZvciA9IHAuZ2V0KCdGbGF2b3InKQotCQkJaWYgZmxhdm9yID09ICdzb3VyY2UnOgotCQkJCXBrZyA9IFBpbXBQYWNrYWdlX3NvdXJjZShzZWxmLCBwKQotCQkJZWxpZiBmbGF2b3IgPT0gJ2JpbmFyeSc6Ci0JCQkJcGtnID0gUGltcFBhY2thZ2VfYmluYXJ5KHNlbGYsIHApCi0JCQllbHNlOgotCQkJCXBrZyA9IFBpbXBQYWNrYWdlKHNlbGYsIGRpY3QocCkpCi0JCQlzZWxmLl9wYWNrYWdlcy5hcHBlbmQocGtnKQotCQkJCi0JZGVmIGxpc3Qoc2VsZik6Ci0JCSIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIFBpbXBQYWNrYWdlIG9iamVjdHMgaW4gdGhlIGRhdGFiYXNlLiIiIgotCQkKLQkJcmV0dXJuIHNlbGYuX3BhY2thZ2VzCi0JCQotCWRlZiBsaXN0bmFtZXMoc2VsZik6Ci0JCSIiIlJldHVybiBhIGxpc3Qgb2YgbmFtZXMgb2YgYWxsIHBhY2thZ2VzIGluIHRoZSBkYXRhYmFzZS4iIiIKLQkJCi0JCXJ2ID0gW10KLQkJZm9yIHBrZyBpbiBzZWxmLl9wYWNrYWdlczoKLQkJCXJ2LmFwcGVuZChwa2cuZnVsbG5hbWUoKSkKLQkJcnYuc29ydCgpCi0JCXJldHVybiBydgotCQkKLQlkZWYgZHVtcChzZWxmLCBwYXRoT3JGaWxlKToKLQkJIiIiRHVtcCB0aGUgY29udGVudHMgb2YgdGhlIGRhdGFiYXNlIHRvIGFuIFhNTCAucGxpc3QgZmlsZS4KLQkJCi0JCVRoZSBmaWxlIGNhbiBiZSBwYXNzZWQgYXMgZWl0aGVyIGEgZmlsZSBvYmplY3Qgb3IgYSBwYXRobmFtZS4KLQkJQWxsIGRhdGEsIGluY2x1ZGluZyBpbmNsdWRlZCBkYXRhYmFzZXMsIGlzIGR1bXBlZC4iIiIKLQkJCi0JCXBhY2thZ2VzID0gW10KLQkJZm9yIHBrZyBpbiBzZWxmLl9wYWNrYWdlczoKLQkJCXBhY2thZ2VzLmFwcGVuZChwa2cuZHVtcCgpKQotCQlkaWN0ID0gewotCQkJJ1ZlcnNpb24nOiBzZWxmLl92ZXJzaW9uLAotCQkJJ01haW50YWluZXInOiBzZWxmLl9tYWludGFpbmVyLAotCQkJJ0Rlc2NyaXB0aW9uJzogc2VsZi5fZGVzY3JpcHRpb24sCi0JCQknUGFja2FnZXMnOiBwYWNrYWdlcwotCQkJfQotCQlwbGlzdCA9IHBsaXN0bGliLlBsaXN0KCoqZGljdCkKLQkJcGxpc3Qud3JpdGUocGF0aE9yRmlsZSkKLQkJCi0JZGVmIGZpbmQoc2VsZiwgaWRlbnQpOgotCQkiIiJGaW5kIGEgcGFja2FnZS4gVGhlIHBhY2thZ2UgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lCi0JCW9yIGFzIGEgZGljdGlvbmFyeSB3aXRoIG5hbWUsIHZlcnNpb24gYW5kIGZsYXZvciBlbnRyaWVzLgotCQkKLQkJT25seSBuYW1lIGlzIG9ibGlnYXRvcnkuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXRjaGVzIHRoZQotCQliZXN0IG9uZSAoaGlnaGVyIHZlcnNpb24gbnVtYmVyLCBmbGF2b3JzIG9yZGVyZWQgYWNjb3JkaW5nIHRvCi0JCXVzZXJzJyBwcmVmZXJlbmNlKSBpcyByZXR1cm5lZC4iIiIKLQkJCi0JCWlmIHR5cGUoaWRlbnQpID09IHN0cjoKLQkJCSMgUmVtb3ZlICggYW5kICkgZm9yIHBzZXVkby1wYWNrYWdlcwotCQkJaWYgaWRlbnRbMF0gPT0gJygnIGFuZCBpZGVudFstMV0gPT0gJyknOgotCQkJCWlkZW50ID0gaWRlbnRbMTotMV0KLQkJCSMgU3BsaXQgaW50byBuYW1lLXZlcnNpb24tZmxhdm9yCi0JCQlmaWVsZHMgPSBpZGVudC5zcGxpdCgnLScpCi0JCQlpZiBsZW4oZmllbGRzKSA8IDEgb3IgbGVuKGZpZWxkcykgPiAzOgotCQkJCXJldHVybiBOb25lCi0JCQluYW1lID0gZmllbGRzWzBdCi0JCQlpZiBsZW4oZmllbGRzKSA+IDE6Ci0JCQkJdmVyc2lvbiA9IGZpZWxkc1sxXQotCQkJZWxzZToKLQkJCQl2ZXJzaW9uID0gTm9uZQotCQkJaWYgbGVuKGZpZWxkcykgPiAyOgotCQkJCWZsYXZvciA9IGZpZWxkc1syXQotCQkJZWxzZToKLQkJCQlmbGF2b3IgPSBOb25lCi0JCWVsc2U6Ci0JCQluYW1lID0gaWRlbnRbJ05hbWUnXQotCQkJdmVyc2lvbiA9IGlkZW50LmdldCgnVmVyc2lvbicpCi0JCQlmbGF2b3IgPSBpZGVudC5nZXQoJ0ZsYXZvcicpCi0JCWZvdW5kID0gTm9uZQotCQlmb3IgcCBpbiBzZWxmLl9wYWNrYWdlczoKLQkJCWlmIG5hbWUgPT0gcC5uYW1lKCkgYW5kIFwKLQkJCQkJKG5vdCB2ZXJzaW9uIG9yIHZlcnNpb24gPT0gcC52ZXJzaW9uKCkpIGFuZCBcCi0JCQkJCShub3QgZmxhdm9yIG9yIGZsYXZvciA9PSBwLmZsYXZvcigpKToKLQkJCQlpZiBub3QgZm91bmQgb3IgZm91bmQgPCBwOgotCQkJCQlmb3VuZCA9IHAKLQkJcmV0dXJuIGZvdW5kCi0JCQorICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBhIHBpbXAgZGF0YWJhc2UuIEl0IGNhbiBhY3R1YWxseSBjb250YWluCisgICAgaW5mb3JtYXRpb24gZnJvbSBtdWx0aXBsZSBkYXRhYmFzZXMgdGhyb3VnaCBpbmNsdXNpb24sIGJ1dCB0aGUKKyAgICB0b3BsZXZlbCBkYXRhYmFzZSBpcyBjb25zaWRlcmVkIHRoZSBtYXN0ZXIsIGFzIGl0cyBtYWludGFpbmVyIGlzCisgICAgInJlc3BvbnNpYmxlIiBmb3IgdGhlIGNvbnRlbnRzLiIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmVmcyk6CisgICAgICAgIHNlbGYuX3BhY2thZ2VzID0gW10KKyAgICAgICAgc2VsZi5wcmVmZXJlbmNlcyA9IHByZWZzCisgICAgICAgIHNlbGYuX3VybGxpc3QgPSBbXQorICAgICAgICBzZWxmLl92ZXJzaW9uID0gIiIKKyAgICAgICAgc2VsZi5fbWFpbnRhaW5lciA9ICIiCisgICAgICAgIHNlbGYuX2Rlc2NyaXB0aW9uID0gIiIKKyAgICAgICAgCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbGVhbiB1cCIiIgorICAgICAgICBzZWxmLl9wYWNrYWdlcyA9IFtdCisgICAgICAgIHNlbGYucHJlZmVyZW5jZXMgPSBOb25lCisgICAgICAgIAorICAgIGRlZiBhcHBlbmRVUkwoc2VsZiwgdXJsLCBpbmNsdWRlZD0wKToKKyAgICAgICAgIiIiQXBwZW5kIHBhY2thZ2VzIGZyb20gdGhlIGRhdGFiYXNlIHdpdGggdGhlIGdpdmVuIFVSTC4KKyAgICAgICAgT25seSB0aGUgZmlyc3QgZGF0YWJhc2Ugc2hvdWxkIHNwZWNpZnkgaW5jbHVkZWQ9MCwgc28gdGhlCisgICAgICAgIGdsb2JhbCBpbmZvcm1hdGlvbiAobWFpbnRhaW5lciwgZGVzY3JpcHRpb24pIGdldCBzdG9yZWQuIiIiCisgICAgICAgIAorICAgICAgICBpZiB1cmwgaW4gc2VsZi5fdXJsbGlzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl91cmxsaXN0LmFwcGVuZCh1cmwpCisgICAgICAgIGZwID0gdXJsbGliMi51cmxvcGVuKHVybCkuZnAKKyAgICAgICAgZGljdCA9IHBsaXN0bGliLlBsaXN0LmZyb21GaWxlKGZwKQorICAgICAgICAjIFRlc3QgaGVyZSBmb3IgUGltcCB2ZXJzaW9uLCBldGMKKyAgICAgICAgaWYgbm90IGluY2x1ZGVkOgorICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IGRpY3QuZ2V0KCdWZXJzaW9uJywgJzAuMScpCisgICAgICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IFBJTVBfVkVSU0lPTjoKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBkYXRhYmFzZSB2ZXJzaW9uICVzIGRvZXMgbm90IG1hdGNoICVzXG4iIAorICAgICAgICAgICAgICAgICAgICAlIChzZWxmLl92ZXJzaW9uLCBQSU1QX1ZFUlNJT04pKQorICAgICAgICAgICAgc2VsZi5fbWFpbnRhaW5lciA9IGRpY3QuZ2V0KCdNYWludGFpbmVyJywgJycpCisgICAgICAgICAgICBzZWxmLl9kZXNjcmlwdGlvbiA9IGRpY3QuZ2V0KCdEZXNjcmlwdGlvbicsICcnKQorICAgICAgICBzZWxmLl9hcHBlbmRQYWNrYWdlcyhkaWN0WydQYWNrYWdlcyddKQorICAgICAgICBvdGhlcnMgPSBkaWN0LmdldCgnSW5jbHVkZScsIFtdKQorICAgICAgICBmb3IgdXJsIGluIG90aGVyczoKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kVVJMKHVybCwgaW5jbHVkZWQ9MSkKKyAgICAgICAgCisgICAgZGVmIF9hcHBlbmRQYWNrYWdlcyhzZWxmLCBwYWNrYWdlcyk6CisgICAgICAgICIiIkdpdmVuIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgY29udGFpbmluZyBwYWNrYWdlCisgICAgICAgIGRlc2NyaXB0aW9ucyBjcmVhdGUgdGhlIFBpbXBQYWNrYWdlIG9iamVjdHMgYW5kIGFwcGVuZCB0aGVtCisgICAgICAgIHRvIG91ciBpbnRlcm5hbCBzdG9yYWdlLiIiIgorICAgICAgICAKKyAgICAgICAgZm9yIHAgaW4gcGFja2FnZXM6CisgICAgICAgICAgICBwID0gZGljdChwKQorICAgICAgICAgICAgZmxhdm9yID0gcC5nZXQoJ0ZsYXZvcicpCisgICAgICAgICAgICBpZiBmbGF2b3IgPT0gJ3NvdXJjZSc6CisgICAgICAgICAgICAgICAgcGtnID0gUGltcFBhY2thZ2Vfc291cmNlKHNlbGYsIHApCisgICAgICAgICAgICBlbGlmIGZsYXZvciA9PSAnYmluYXJ5JzoKKyAgICAgICAgICAgICAgICBwa2cgPSBQaW1wUGFja2FnZV9iaW5hcnkoc2VsZiwgcCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGtnID0gUGltcFBhY2thZ2Uoc2VsZiwgZGljdChwKSkKKyAgICAgICAgICAgIHNlbGYuX3BhY2thZ2VzLmFwcGVuZChwa2cpCisgICAgICAgICAgICAKKyAgICBkZWYgbGlzdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgUGltcFBhY2thZ2Ugb2JqZWN0cyBpbiB0aGUgZGF0YWJhc2UuIiIiCisgICAgICAgIAorICAgICAgICByZXR1cm4gc2VsZi5fcGFja2FnZXMKKyAgICAgICAgCisgICAgZGVmIGxpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBuYW1lcyBvZiBhbGwgcGFja2FnZXMgaW4gdGhlIGRhdGFiYXNlLiIiIgorICAgICAgICAKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBmb3IgcGtnIGluIHNlbGYuX3BhY2thZ2VzOgorICAgICAgICAgICAgcnYuYXBwZW5kKHBrZy5mdWxsbmFtZSgpKQorICAgICAgICBydi5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHJ2CisgICAgICAgIAorICAgIGRlZiBkdW1wKHNlbGYsIHBhdGhPckZpbGUpOgorICAgICAgICAiIiJEdW1wIHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YWJhc2UgdG8gYW4gWE1MIC5wbGlzdCBmaWxlLgorICAgICAgICAKKyAgICAgICAgVGhlIGZpbGUgY2FuIGJlIHBhc3NlZCBhcyBlaXRoZXIgYSBmaWxlIG9iamVjdCBvciBhIHBhdGhuYW1lLgorICAgICAgICBBbGwgZGF0YSwgaW5jbHVkaW5nIGluY2x1ZGVkIGRhdGFiYXNlcywgaXMgZHVtcGVkLiIiIgorICAgICAgICAKKyAgICAgICAgcGFja2FnZXMgPSBbXQorICAgICAgICBmb3IgcGtnIGluIHNlbGYuX3BhY2thZ2VzOgorICAgICAgICAgICAgcGFja2FnZXMuYXBwZW5kKHBrZy5kdW1wKCkpCisgICAgICAgIGRpY3QgPSB7CisgICAgICAgICAgICAnVmVyc2lvbic6IHNlbGYuX3ZlcnNpb24sCisgICAgICAgICAgICAnTWFpbnRhaW5lcic6IHNlbGYuX21haW50YWluZXIsCisgICAgICAgICAgICAnRGVzY3JpcHRpb24nOiBzZWxmLl9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICdQYWNrYWdlcyc6IHBhY2thZ2VzCisgICAgICAgICAgICB9CisgICAgICAgIHBsaXN0ID0gcGxpc3RsaWIuUGxpc3QoKipkaWN0KQorICAgICAgICBwbGlzdC53cml0ZShwYXRoT3JGaWxlKQorICAgICAgICAKKyAgICBkZWYgZmluZChzZWxmLCBpZGVudCk6CisgICAgICAgICIiIkZpbmQgYSBwYWNrYWdlLiBUaGUgcGFja2FnZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IG5hbWUKKyAgICAgICAgb3IgYXMgYSBkaWN0aW9uYXJ5IHdpdGggbmFtZSwgdmVyc2lvbiBhbmQgZmxhdm9yIGVudHJpZXMuCisgICAgICAgIAorICAgICAgICBPbmx5IG5hbWUgaXMgb2JsaWdhdG9yeS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1hdGNoZXMgdGhlCisgICAgICAgIGJlc3Qgb25lIChoaWdoZXIgdmVyc2lvbiBudW1iZXIsIGZsYXZvcnMgb3JkZXJlZCBhY2NvcmRpbmcgdG8KKyAgICAgICAgdXNlcnMnIHByZWZlcmVuY2UpIGlzIHJldHVybmVkLiIiIgorICAgICAgICAKKyAgICAgICAgaWYgdHlwZShpZGVudCkgPT0gc3RyOgorICAgICAgICAgICAgIyBSZW1vdmUgKCBhbmQgKSBmb3IgcHNldWRvLXBhY2thZ2VzCisgICAgICAgICAgICBpZiBpZGVudFswXSA9PSAnKCcgYW5kIGlkZW50Wy0xXSA9PSAnKSc6CisgICAgICAgICAgICAgICAgaWRlbnQgPSBpZGVudFsxOi0xXQorICAgICAgICAgICAgIyBTcGxpdCBpbnRvIG5hbWUtdmVyc2lvbi1mbGF2b3IKKyAgICAgICAgICAgIGZpZWxkcyA9IGlkZW50LnNwbGl0KCctJykKKyAgICAgICAgICAgIGlmIGxlbihmaWVsZHMpIDwgMSBvciBsZW4oZmllbGRzKSA+IDM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIG5hbWUgPSBmaWVsZHNbMF0KKyAgICAgICAgICAgIGlmIGxlbihmaWVsZHMpID4gMToKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZmllbGRzWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCisgICAgICAgICAgICBpZiBsZW4oZmllbGRzKSA+IDI6CisgICAgICAgICAgICAgICAgZmxhdm9yID0gZmllbGRzWzJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYXZvciA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSBpZGVudFsnTmFtZSddCisgICAgICAgICAgICB2ZXJzaW9uID0gaWRlbnQuZ2V0KCdWZXJzaW9uJykKKyAgICAgICAgICAgIGZsYXZvciA9IGlkZW50LmdldCgnRmxhdm9yJykKKyAgICAgICAgZm91bmQgPSBOb25lCisgICAgICAgIGZvciBwIGluIHNlbGYuX3BhY2thZ2VzOgorICAgICAgICAgICAgaWYgbmFtZSA9PSBwLm5hbWUoKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAobm90IHZlcnNpb24gb3IgdmVyc2lvbiA9PSBwLnZlcnNpb24oKSkgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgKG5vdCBmbGF2b3Igb3IgZmxhdm9yID09IHAuZmxhdm9yKCkpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZCBvciBmb3VuZCA8IHA6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gcAorICAgICAgICByZXR1cm4gZm91bmQKKyAgICAgICAgCiBBTExPV0VEX0tFWVMgPSBbCi0JIk5hbWUiLAotCSJWZXJzaW9uIiwKLQkiRmxhdm9yIiwKLQkiRGVzY3JpcHRpb24iLAotCSJIb21lLXBhZ2UiLAotCSJEb3dubG9hZC1VUkwiLAotCSJJbnN0YWxsLXRlc3QiLAotCSJJbnN0YWxsLWNvbW1hbmQiLAotCSJQcmUtaW5zdGFsbC1jb21tYW5kIiwKLQkiUG9zdC1pbnN0YWxsLWNvbW1hbmQiLAotCSJQcmVyZXF1aXNpdGVzIiwKLQkiTUQ1U3VtIgorICAgICJOYW1lIiwKKyAgICAiVmVyc2lvbiIsCisgICAgIkZsYXZvciIsCisgICAgIkRlc2NyaXB0aW9uIiwKKyAgICAiSG9tZS1wYWdlIiwKKyAgICAiRG93bmxvYWQtVVJMIiwKKyAgICAiSW5zdGFsbC10ZXN0IiwKKyAgICAiSW5zdGFsbC1jb21tYW5kIiwKKyAgICAiUHJlLWluc3RhbGwtY29tbWFuZCIsCisgICAgIlBvc3QtaW5zdGFsbC1jb21tYW5kIiwKKyAgICAiUHJlcmVxdWlzaXRlcyIsCisgICAgIk1ENVN1bSIKIF0KIAogY2xhc3MgUGltcFBhY2thZ2U6Ci0JIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgc2luZ2xlIHBhY2thZ2UuIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGRiLCBkaWN0KToKLQkJc2VsZi5fZGIgPSBkYgotCQluYW1lID0gZGljdFsiTmFtZSJdCi0JCWZvciBrIGluIGRpY3Qua2V5cygpOgotCQkJaWYgbm90IGsgaW4gQUxMT1dFRF9LRVlTOgotCQkJCXN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6ICVzOiB1bmtub3duIGtleSAlc1xuIiAlIChuYW1lLCBrKSkKLQkJc2VsZi5fZGljdCA9IGRpY3QKLQkKLQlkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKLQkJcmV0dXJuIHNlbGYuX2RpY3Rba2V5XQotCQkKLQlkZWYgbmFtZShzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3RbJ05hbWUnXQotCWRlZiB2ZXJzaW9uKHNlbGYpOiByZXR1cm4gc2VsZi5fZGljdFsnVmVyc2lvbiddCi0JZGVmIGZsYXZvcihzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3RbJ0ZsYXZvciddCi0JZGVmIGRlc2NyaXB0aW9uKHNlbGYpOiByZXR1cm4gc2VsZi5fZGljdFsnRGVzY3JpcHRpb24nXQotCWRlZiBob21lcGFnZShzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3QuZ2V0KCdIb21lLXBhZ2UnKQotCWRlZiBkb3dubG9hZFVSTChzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3RbJ0Rvd25sb2FkLVVSTCddCi0JCi0JZGVmIGZ1bGxuYW1lKHNlbGYpOgotCQkiIiJSZXR1cm4gdGhlIGZ1bGwgbmFtZSAibmFtZS12ZXJzaW9uLWZsYXZvciIgb2YgYSBwYWNrYWdlLgotCQkKLQkJSWYgdGhlIHBhY2thZ2UgaXMgYSBwc2V1ZG8tcGFja2FnZSwgc29tZXRoaW5nIHRoYXQgY2Fubm90IGJlCi0JCWluc3RhbGxlZCB0aHJvdWdoIHBpbXAsIHJldHVybiB0aGUgbmFtZSBpbiAocGFyZW50aGVzZXMpLiIiIgotCQkKLQkJcnYgPSBzZWxmLl9kaWN0WydOYW1lJ10KLQkJaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdWZXJzaW9uJyk6Ci0JCQlydiA9IHJ2ICsgJy0lcycgJSBzZWxmLl9kaWN0WydWZXJzaW9uJ10KLQkJaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdGbGF2b3InKToKLQkJCXJ2ID0gcnYgKyAnLSVzJyAlIHNlbGYuX2RpY3RbJ0ZsYXZvciddCi0JCWlmIG5vdCBzZWxmLl9kaWN0LmdldCgnRG93bmxvYWQtVVJMJyk6Ci0JCQkjIFBzZXVkby1wYWNrYWdlLCBzaG93IGluIHBhcmVudGhlc2VzCi0JCQlydiA9ICcoJXMpJyAlIHJ2Ci0JCXJldHVybiBydgotCQotCWRlZiBkdW1wKHNlbGYpOgotCQkiIiJSZXR1cm4gYSBkaWN0IG9iamVjdCBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcGFja2FnZS4iIiIKLQkJcmV0dXJuIHNlbGYuX2RpY3QKLQkJCi0JZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotCQkiIiJDb21wYXJlIHR3byBwYWNrYWdlcywgd2hlcmUgdGhlICJiZXR0ZXIiIHBhY2thZ2Ugc29ydHMgbG93ZXIuIiIiCi0JCQotCQlpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgUGltcFBhY2thZ2UpOgotCQkJcmV0dXJuIGNtcChpZChzZWxmKSwgaWQob3RoZXIpKQotCQlpZiBzZWxmLm5hbWUoKSAhPSBvdGhlci5uYW1lKCk6Ci0JCQlyZXR1cm4gY21wKHNlbGYubmFtZSgpLCBvdGhlci5uYW1lKCkpCi0JCWlmIHNlbGYudmVyc2lvbigpICE9IG90aGVyLnZlcnNpb24oKToKLQkJCXJldHVybiAtY21wKHNlbGYudmVyc2lvbigpLCBvdGhlci52ZXJzaW9uKCkpCi0JCXJldHVybiBzZWxmLl9kYi5wcmVmZXJlbmNlcy5jb21wYXJlRmxhdm9ycyhzZWxmLmZsYXZvcigpLCBvdGhlci5mbGF2b3IoKSkKLQkJCi0JZGVmIGluc3RhbGxlZChzZWxmKToKLQkJIiIiVGVzdCB3aGV0ZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLgotCQkKLQkJUmV0dXJucyB0d28gdmFsdWVzOiBhIHN0YXR1cyBpbmRpY2F0b3Igd2hpY2ggaXMgb25lIG9mCi0JCSJ5ZXMiLCAibm8iLCAib2xkIiAoYW4gb2xkZXIgdmVyc2lvbiBpcyBpbnN0YWxsZWQpIG9yICJiYWQiCi0JCShzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGluc3RhbGwgdGVzdCkgYW5kIGEgaHVtYW4KLQkJcmVhZGFibGUgc3RyaW5nIHdoaWNoIG1heSBjb250YWluIG1vcmUgZGV0YWlscy4iIiIKLQkJCi0JCW5hbWVzcGFjZSA9IHsKLQkJCSJOb3RJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX05vdEluc3RhbGxlZCwKLQkJCSJPbGRJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX09sZEluc3RhbGxlZCwKLQkJCSJCYWRJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX0JhZEluc3RhbGxlZCwKLQkJCSJvcyI6IG9zLAotCQkJInN5cyI6IHN5cywKLQkJCX0KLQkJaW5zdGFsbFRlc3QgPSBzZWxmLl9kaWN0WydJbnN0YWxsLXRlc3QnXS5zdHJpcCgpICsgJ1xuJwotCQl0cnk6Ci0JCQlleGVjIGluc3RhbGxUZXN0IGluIG5hbWVzcGFjZQotCQlleGNlcHQgSW1wb3J0RXJyb3IsIGFyZzoKLQkJCXJldHVybiAibm8iLCBzdHIoYXJnKQotCQlleGNlcHQgX3NjcmlwdEV4Y19Ob3RJbnN0YWxsZWQsIGFyZzoKLQkJCXJldHVybiAibm8iLCBzdHIoYXJnKQotCQlleGNlcHQgX3NjcmlwdEV4Y19PbGRJbnN0YWxsZWQsIGFyZzoKLQkJCXJldHVybiAib2xkIiwgc3RyKGFyZykKLQkJZXhjZXB0IF9zY3JpcHRFeGNfQmFkSW5zdGFsbGVkLCBhcmc6Ci0JCQlyZXR1cm4gImJhZCIsIHN0cihhcmcpCi0JCWV4Y2VwdDoKLQkJCXN5cy5zdGRlcnIud3JpdGUoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCi0JCQlzeXMuc3RkZXJyLndyaXRlKCItLS0tICVzOiBpbnN0YWxsIHRlc3QgZ290IGV4Y2VwdGlvblxuIiAlIHNlbGYuZnVsbG5hbWUoKSkKLQkJCXN5cy5zdGRlcnIud3JpdGUoIi0tLS0gc291cmNlOlxuIikKLQkJCXN5cy5zdGRlcnIud3JpdGUoaW5zdGFsbFRlc3QpCi0JCQlzeXMuc3RkZXJyLndyaXRlKCItLS0tIGV4Y2VwdGlvbjpcbiIpCi0JCQlpbXBvcnQgdHJhY2ViYWNrCi0JCQl0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9c3lzLnN0ZGVycikKLQkJCWlmIHNlbGYuX2RiLl9tYWludGFpbmVyOgotCQkJCXN5cy5zdGRlcnIud3JpdGUoIi0tLS0gUGxlYXNlIGNvcHkgdGhpcyBhbmQgbWFpbCB0byAlc1xuIiAlIHNlbGYuX2RiLl9tYWludGFpbmVyKQotCQkJc3lzLnN0ZGVyci53cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikKLQkJCXJldHVybiAiYmFkIiwgIlBhY2thZ2UgaW5zdGFsbCB0ZXN0IGdvdCBleGNlcHRpb24iCi0JCXJldHVybiAieWVzIiwgIiIKLQkJCi0JZGVmIHByZXJlcXVpc2l0ZXMoc2VsZik6Ci0JCSIiIlJldHVybiBhIGxpc3Qgb2YgcHJlcmVxdWlzaXRlcyBmb3IgdGhpcyBwYWNrYWdlLgotCQkKLQkJVGhlIGxpc3QgY29udGFpbnMgMi10dXBsZXMsIG9mIHdoaWNoIHRoZSBmaXJzdCBpdGVtIGlzIGVpdGhlcgotCQlhIFBpbXBQYWNrYWdlIG9iamVjdCBvciBOb25lLCBhbmQgdGhlIHNlY29uZCBpcyBhIGRlc2NyaXB0aXZlCi0JCXN0cmluZy4gVGhlIGZpcnN0IGl0ZW0gY2FuIGJlIE5vbmUgaWYgdGhpcyBwYWNrYWdlIGRlcGVuZHMgb24KLQkJc29tZXRoaW5nIHRoYXQgaXNuJ3QgcGltcC1pbnN0YWxsYWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgZGVzY3JpcHRpdmUKLQkJc3RyaW5nIHNob3VsZCB0ZWxsIHRoZSB1c2VyIHdoYXQgdG8gZG8uIiIiCi0JCQotCQlydiA9IFtdCi0JCWlmIG5vdCBzZWxmLl9kaWN0LmdldCgnRG93bmxvYWQtVVJMJyk6Ci0JCQlyZXR1cm4gWyhOb25lLCAKLQkJCQkiJXM6IFRoaXMgcGFja2FnZSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgbWFudWFsbHkgKG5vIERvd25sb2FkLVVSTCBmaWVsZCkiICUKLQkJCQkJc2VsZi5mdWxsbmFtZSgpKV0KLQkJaWYgbm90IHNlbGYuX2RpY3QuZ2V0KCdQcmVyZXF1aXNpdGVzJyk6Ci0JCQlyZXR1cm4gW10KLQkJZm9yIGl0ZW0gaW4gc2VsZi5fZGljdFsnUHJlcmVxdWlzaXRlcyddOgotCQkJaWYgdHlwZShpdGVtKSA9PSBzdHI6Ci0JCQkJcGtnID0gTm9uZQotCQkJCWRlc2NyID0gc3RyKGl0ZW0pCi0JCQllbHNlOgotCQkJCW5hbWUgPSBpdGVtWydOYW1lJ10KLQkJCQlpZiBpdGVtLmhhc19rZXkoJ1ZlcnNpb24nKToKLQkJCQkJbmFtZSA9IG5hbWUgKyAnLScgKyBpdGVtWydWZXJzaW9uJ10KLQkJCQlpZiBpdGVtLmhhc19rZXkoJ0ZsYXZvcicpOgotCQkJCQluYW1lID0gbmFtZSArICctJyArIGl0ZW1bJ0ZsYXZvciddCi0JCQkJcGtnID0gc2VsZi5fZGIuZmluZChuYW1lKQotCQkJCWlmIG5vdCBwa2c6Ci0JCQkJCWRlc2NyID0gIlJlcXVpcmVzIHVua25vd24gJXMiJW5hbWUKLQkJCQllbHNlOgotCQkJCQlkZXNjciA9IHBrZy5kZXNjcmlwdGlvbigpCi0JCQlydi5hcHBlbmQoKHBrZywgZGVzY3IpKQotCQlyZXR1cm4gcnYKLQkJCQotCWRlZiBfY21kKHNlbGYsIG91dHB1dCwgZGlyLCAqY21kaXRlbXMpOgotCQkiIiJJbnRlcm5hbCByb3V0aW5lIHRvIHJ1biBhIHNoZWxsIGNvbW1hbmQgaW4gYSBnaXZlbiBkaXJlY3RvcnkuIiIiCi0JCQotCQljbWQgPSAoImNkIFwiJXNcIjsgIiAlIGRpcikgKyAiICIuam9pbihjbWRpdGVtcykKLQkJaWYgb3V0cHV0OgotCQkJb3V0cHV0LndyaXRlKCIrICVzXG4iICUgY21kKQotCQlpZiBOT19FWEVDVVRFOgotCQkJcmV0dXJuIDAKLQkJY2hpbGQgPSBwb3BlbjIuUG9wZW40KGNtZCkKLQkJY2hpbGQudG9jaGlsZC5jbG9zZSgpCi0JCXdoaWxlIDE6Ci0JCQlsaW5lID0gY2hpbGQuZnJvbWNoaWxkLnJlYWRsaW5lKCkKLQkJCWlmIG5vdCBsaW5lOgotCQkJCWJyZWFrCi0JCQlpZiBvdXRwdXQ6Ci0JCQkJb3V0cHV0LndyaXRlKGxpbmUpCi0JCXJldHVybiBjaGlsZC53YWl0KCkKLQkJCi0JZGVmIGRvd25sb2FkUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgotCQkiIiJEb3dubG9hZCBhIHNpbmdsZSBwYWNrYWdlLCBpZiBuZWVkZWQuCi0JCQotCQlBbiBNRDUgc2lnbmF0dXJlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZG93bmxvYWQgaXMgbmVlZGVkLAotCQlhbmQgdG8gdGVzdCB0aGF0IHdlIGFjdHVhbGx5IGRvd25sb2FkZWQgd2hhdCB3ZSBleHBlY3RlZC4KLQkJSWYgb3V0cHV0IGlzIGdpdmVuIGl0IGlzIGEgZmlsZS1saWtlIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSBhIGxvZwotCQlvZiB3aGF0IGhhcHBlbnMuCi0JCQotCQlJZiBhbnl0aGluZyB1bmZvcmVzZWVuIGhhcHBlbmVkIHRoZSBtZXRob2QgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlCi0JCXN0cmluZy4KLQkJIiIiCi0JCQotCQlzY2hlbWUsIGxvYywgcGF0aCwgcXVlcnksIGZyYWcgPSB1cmxwYXJzZS51cmxzcGxpdChzZWxmLl9kaWN0WydEb3dubG9hZC1VUkwnXSkKLQkJcGF0aCA9IHVybGxpYi51cmwycGF0aG5hbWUocGF0aCkKLQkJZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWzFdCi0JCXNlbGYuYXJjaGl2ZUZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RiLnByZWZlcmVuY2VzLmRvd25sb2FkRGlyLCBmaWxlbmFtZSkJCQkKLQkJaWYgbm90IHNlbGYuX2FyY2hpdmVPSygpOgotCQkJaWYgc2NoZW1lID09ICdtYW51YWwnOgotCQkJCXJldHVybiAiUGxlYXNlIGRvd25sb2FkIHBhY2thZ2UgbWFudWFsbHkgYW5kIHNhdmUgYXMgJXMiICUgc2VsZi5hcmNoaXZlRmlsZW5hbWUKLQkJCWlmIHNlbGYuX2NtZChvdXRwdXQsIHNlbGYuX2RiLnByZWZlcmVuY2VzLmRvd25sb2FkRGlyLAotCQkJCQkiY3VybCIsCi0JCQkJCSItLW91dHB1dCIsIHNlbGYuYXJjaGl2ZUZpbGVuYW1lLAotCQkJCQlzZWxmLl9kaWN0WydEb3dubG9hZC1VUkwnXSk6Ci0JCQkJcmV0dXJuICJkb3dubG9hZCBjb21tYW5kIGZhaWxlZCIKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYXJjaGl2ZUZpbGVuYW1lKSBhbmQgbm90IE5PX0VYRUNVVEU6Ci0JCQlyZXR1cm4gImFyY2hpdmUgbm90IGZvdW5kIGFmdGVyIGRvd25sb2FkIgotCQlpZiBub3Qgc2VsZi5fYXJjaGl2ZU9LKCk6Ci0JCQlyZXR1cm4gImFyY2hpdmUgZG9lcyBub3QgaGF2ZSBjb3JyZWN0IE1ENSBjaGVja3N1bSIKLQkJCQotCWRlZiBfYXJjaGl2ZU9LKHNlbGYpOgotCQkiIiJUZXN0IGFuIGFyY2hpdmUuIEl0IHNob3VsZCBleGlzdCBhbmQgdGhlIE1ENSBjaGVja3N1bSBzaG91bGQgYmUgY29ycmVjdC4iIiIKLQkJCi0JCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmFyY2hpdmVGaWxlbmFtZSk6Ci0JCQlyZXR1cm4gMAotCQlpZiBub3Qgc2VsZi5fZGljdC5nZXQoJ01ENVN1bScpOgotCQkJc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogbm8gTUQ1U3VtIGZvciAlc1xuIiAlIHNlbGYuZnVsbG5hbWUoKSkKLQkJCXJldHVybiAxCi0JCWRhdGEgPSBvcGVuKHNlbGYuYXJjaGl2ZUZpbGVuYW1lLCAncmInKS5yZWFkKCkKLQkJY2hlY2tzdW0gPSBtZDUubmV3KGRhdGEpLmhleGRpZ2VzdCgpCi0JCXJldHVybiBjaGVja3N1bSA9PSBzZWxmLl9kaWN0WydNRDVTdW0nXQotCQkJCi0JZGVmIHVucGFja1BhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKLQkJIiIiVW5wYWNrIGEgZG93bmxvYWRlZCBwYWNrYWdlIGFyY2hpdmUuIiIiCi0JCQotCQlmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5hcmNoaXZlRmlsZW5hbWUpWzFdCi0JCWZvciBleHQsIGNtZCBpbiBBUkNISVZFX0ZPUk1BVFM6Ci0JCQlpZiBmaWxlbmFtZVstbGVuKGV4dCk6XSA9PSBleHQ6Ci0JCQkJYnJlYWsKLQkJZWxzZToKLQkJCXJldHVybiAidW5rbm93biBleHRlbnNpb24gZm9yIGFyY2hpdmUgZmlsZTogJXMiICUgZmlsZW5hbWUKLQkJc2VsZi5iYXNlbmFtZSA9IGZpbGVuYW1lWzotbGVuKGV4dCldCi0JCWNtZCA9IGNtZCAlIHNlbGYuYXJjaGl2ZUZpbGVuYW1lCi0JCWlmIHNlbGYuX2NtZChvdXRwdXQsIHNlbGYuX2RiLnByZWZlcmVuY2VzLmJ1aWxkRGlyLCBjbWQpOgotCQkJcmV0dXJuICJ1bnBhY2sgY29tbWFuZCBmYWlsZWQiCi0JCQkKLQlkZWYgaW5zdGFsbFBhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKLQkJIiIiRGVmYXVsdCBpbnN0YWxsIG1ldGhvZCwgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIiIiCi0JCXJldHVybiAiJXM6IFRoaXMgcGFja2FnZSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgbWFudWFsbHkgKG5vIHN1cHBvcnQgZm9yIGZsYXZvcj1cIiVzXCIpIiBcCi0JCQklIChzZWxmLmZ1bGxuYW1lKCksIHNlbGYuX2RpY3QuZ2V0KGZsYXZvciwgIiIpKQotCQkJCi0JZGVmIGluc3RhbGxTaW5nbGVQYWNrYWdlKHNlbGYsIG91dHB1dD1Ob25lKToKLQkJIiIiRG93bmxvYWQsIHVucGFjayBhbmQgaW5zdGFsbCBhIHNpbmdsZSBwYWNrYWdlLgotCQkKLQkJSWYgb3V0cHV0IGlzIGdpdmVuIGl0IHNob3VsZCBiZSBhIGZpbGUtbGlrZSBvYmplY3QgYW5kIGl0Ci0JCXdpbGwgcmVjZWl2ZSBhIGxvZyBvZiB3aGF0IGhhcHBlbmVkLiIiIgotCQkKLQkJaWYgbm90IHNlbGYuX2RpY3RbJ0Rvd25sb2FkLVVSTCddOgotCQkJcmV0dXJuICIlczogVGhpcyBwYWNrYWdlIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBtYW51YWxseSAobm8gRG93bmxvYWQtVVJMIGZpZWxkKSIgJSBfZm10cGFja2FnZW5hbWUoc2VsZikKLQkJbXNnID0gc2VsZi5kb3dubG9hZFBhY2thZ2VPbmx5KG91dHB1dCkKLQkJaWYgbXNnOgotCQkJcmV0dXJuICIlczogZG93bmxvYWQ6ICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIG1zZykKLQkJCQotCQltc2cgPSBzZWxmLnVucGFja1BhY2thZ2VPbmx5KG91dHB1dCkKLQkJaWYgbXNnOgotCQkJcmV0dXJuICIlczogdW5wYWNrOiAlcyIgJSAoc2VsZi5mdWxsbmFtZSgpLCBtc2cpCi0JCQkKLQkJcmV0dXJuIHNlbGYuaW5zdGFsbFBhY2thZ2VPbmx5KG91dHB1dCkKLQkJCi0JZGVmIGJlZm9yZUluc3RhbGwoc2VsZik6Ci0JCSIiIkJvb2trZWVwaW5nIGJlZm9yZSBpbnN0YWxsYXRpb246IHJlbWVtYmVyIHdoYXQgd2UgaGF2ZSBpbiBzaXRlLXBhY2thZ2VzIiIiCi0JCXNlbGYuX29sZF9jb250ZW50cyA9IG9zLmxpc3RkaXIoc2VsZi5fZGIucHJlZmVyZW5jZXMuaW5zdGFsbERpcikKLQkJCi0JZGVmIGFmdGVySW5zdGFsbChzZWxmKToKLQkJIiIiQm9va2tlZXBpbmcgYWZ0ZXIgaW5zdGFsbGF0aW9uOiBpbnRlcnByZXQgYW55IG5ldyAucHRoIGZpbGVzIHRoYXQgaGF2ZQotCQlhcHBlYXJlZCIiIgotCQkJCQotCQluZXdfY29udGVudHMgPSBvcy5saXN0ZGlyKHNlbGYuX2RiLnByZWZlcmVuY2VzLmluc3RhbGxEaXIpCi0JCWZvciBmbiBpbiBuZXdfY29udGVudHM6Ci0JCQlpZiBmbiBpbiBzZWxmLl9vbGRfY29udGVudHM6Ci0JCQkJY29udGludWUKLQkJCWlmIGZuWy00Ol0gIT0gJy5wdGgnOgotCQkJCWNvbnRpbnVlCi0JCQlmdWxsbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9kYi5wcmVmZXJlbmNlcy5pbnN0YWxsRGlyLCBmbikKLQkJCWYgPSBvcGVuKGZ1bGxuYW1lKQotCQkJZm9yIGxpbmUgaW4gZi5yZWFkbGluZXMoKToKLQkJCQlpZiBub3QgbGluZToKLQkJCQkJY29udGludWUKLQkJCQlpZiBsaW5lWzBdID09ICcjJzoKLQkJCQkJY29udGludWUKLQkJCQlpZiBsaW5lWzo2XSA9PSAnaW1wb3J0JzoKLQkJCQkJZXhlYyBsaW5lCi0JCQkJCWNvbnRpbnVlCi0JCQkJaWYgbGluZVstMV0gPT0gJ1xuJzoKLQkJCQkJbGluZSA9IGxpbmVbOi0xXQotCQkJCWlmIG5vdCBvcy5wYXRoLmlzYWJzKGxpbmUpOgotCQkJCQlsaW5lID0gb3MucGF0aC5qb2luKHNlbGYuX2RiLnByZWZlcmVuY2VzLmluc3RhbGxEaXIsIGxpbmUpCi0JCQkJbGluZSA9IG9zLnBhdGgucmVhbHBhdGgobGluZSkKLQkJCQlpZiBub3QgbGluZSBpbiBzeXMucGF0aDoKLQkJCQkJc3lzLnBhdGguYXBwZW5kKGxpbmUpCQkJCisgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgc2luZ2xlIHBhY2thZ2UuIiIiCisgICAgCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiLCBkaWN0KToKKyAgICAgICAgc2VsZi5fZGIgPSBkYgorICAgICAgICBuYW1lID0gZGljdFsiTmFtZSJdCisgICAgICAgIGZvciBrIGluIGRpY3Qua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IGsgaW4gQUxMT1dFRF9LRVlTOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6ICVzOiB1bmtub3duIGtleSAlc1xuIiAlIChuYW1lLCBrKSkKKyAgICAgICAgc2VsZi5fZGljdCA9IGRpY3QKKyAgICAKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RpY3Rba2V5XQorICAgICAgICAKKyAgICBkZWYgbmFtZShzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3RbJ05hbWUnXQorICAgIGRlZiB2ZXJzaW9uKHNlbGYpOiByZXR1cm4gc2VsZi5fZGljdFsnVmVyc2lvbiddCisgICAgZGVmIGZsYXZvcihzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3RbJ0ZsYXZvciddCisgICAgZGVmIGRlc2NyaXB0aW9uKHNlbGYpOiByZXR1cm4gc2VsZi5fZGljdFsnRGVzY3JpcHRpb24nXQorICAgIGRlZiBob21lcGFnZShzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3QuZ2V0KCdIb21lLXBhZ2UnKQorICAgIGRlZiBkb3dubG9hZFVSTChzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3RbJ0Rvd25sb2FkLVVSTCddCisgICAgCisgICAgZGVmIGZ1bGxuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgbmFtZSAibmFtZS12ZXJzaW9uLWZsYXZvciIgb2YgYSBwYWNrYWdlLgorICAgICAgICAKKyAgICAgICAgSWYgdGhlIHBhY2thZ2UgaXMgYSBwc2V1ZG8tcGFja2FnZSwgc29tZXRoaW5nIHRoYXQgY2Fubm90IGJlCisgICAgICAgIGluc3RhbGxlZCB0aHJvdWdoIHBpbXAsIHJldHVybiB0aGUgbmFtZSBpbiAocGFyZW50aGVzZXMpLiIiIgorICAgICAgICAKKyAgICAgICAgcnYgPSBzZWxmLl9kaWN0WydOYW1lJ10KKyAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdWZXJzaW9uJyk6CisgICAgICAgICAgICBydiA9IHJ2ICsgJy0lcycgJSBzZWxmLl9kaWN0WydWZXJzaW9uJ10KKyAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdGbGF2b3InKToKKyAgICAgICAgICAgIHJ2ID0gcnYgKyAnLSVzJyAlIHNlbGYuX2RpY3RbJ0ZsYXZvciddCisgICAgICAgIGlmIG5vdCBzZWxmLl9kaWN0LmdldCgnRG93bmxvYWQtVVJMJyk6CisgICAgICAgICAgICAjIFBzZXVkby1wYWNrYWdlLCBzaG93IGluIHBhcmVudGhlc2VzCisgICAgICAgICAgICBydiA9ICcoJXMpJyAlIHJ2CisgICAgICAgIHJldHVybiBydgorICAgIAorICAgIGRlZiBkdW1wKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBkaWN0IG9iamVjdCBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcGFja2FnZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RpY3QKKyAgICAgICAgCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJlIHR3byBwYWNrYWdlcywgd2hlcmUgdGhlICJiZXR0ZXIiIHBhY2thZ2Ugc29ydHMgbG93ZXIuIiIiCisgICAgICAgIAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgUGltcFBhY2thZ2UpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChpZChzZWxmKSwgaWQob3RoZXIpKQorICAgICAgICBpZiBzZWxmLm5hbWUoKSAhPSBvdGhlci5uYW1lKCk6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYubmFtZSgpLCBvdGhlci5uYW1lKCkpCisgICAgICAgIGlmIHNlbGYudmVyc2lvbigpICE9IG90aGVyLnZlcnNpb24oKToKKyAgICAgICAgICAgIHJldHVybiAtY21wKHNlbGYudmVyc2lvbigpLCBvdGhlci52ZXJzaW9uKCkpCisgICAgICAgIHJldHVybiBzZWxmLl9kYi5wcmVmZXJlbmNlcy5jb21wYXJlRmxhdm9ycyhzZWxmLmZsYXZvcigpLCBvdGhlci5mbGF2b3IoKSkKKyAgICAgICAgCisgICAgZGVmIGluc3RhbGxlZChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB3aGV0ZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLgorICAgICAgICAKKyAgICAgICAgUmV0dXJucyB0d28gdmFsdWVzOiBhIHN0YXR1cyBpbmRpY2F0b3Igd2hpY2ggaXMgb25lIG9mCisgICAgICAgICJ5ZXMiLCAibm8iLCAib2xkIiAoYW4gb2xkZXIgdmVyc2lvbiBpcyBpbnN0YWxsZWQpIG9yICJiYWQiCisgICAgICAgIChzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGluc3RhbGwgdGVzdCkgYW5kIGEgaHVtYW4KKyAgICAgICAgcmVhZGFibGUgc3RyaW5nIHdoaWNoIG1heSBjb250YWluIG1vcmUgZGV0YWlscy4iIiIKKyAgICAgICAgCisgICAgICAgIG5hbWVzcGFjZSA9IHsKKyAgICAgICAgICAgICJOb3RJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX05vdEluc3RhbGxlZCwKKyAgICAgICAgICAgICJPbGRJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX09sZEluc3RhbGxlZCwKKyAgICAgICAgICAgICJCYWRJbnN0YWxsZWQiOiBfc2NyaXB0RXhjX0JhZEluc3RhbGxlZCwKKyAgICAgICAgICAgICJvcyI6IG9zLAorICAgICAgICAgICAgInN5cyI6IHN5cywKKyAgICAgICAgICAgIH0KKyAgICAgICAgaW5zdGFsbFRlc3QgPSBzZWxmLl9kaWN0WydJbnN0YWxsLXRlc3QnXS5zdHJpcCgpICsgJ1xuJworICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjIGluc3RhbGxUZXN0IGluIG5hbWVzcGFjZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGFyZzoKKyAgICAgICAgICAgIHJldHVybiAibm8iLCBzdHIoYXJnKQorICAgICAgICBleGNlcHQgX3NjcmlwdEV4Y19Ob3RJbnN0YWxsZWQsIGFyZzoKKyAgICAgICAgICAgIHJldHVybiAibm8iLCBzdHIoYXJnKQorICAgICAgICBleGNlcHQgX3NjcmlwdEV4Y19PbGRJbnN0YWxsZWQsIGFyZzoKKyAgICAgICAgICAgIHJldHVybiAib2xkIiwgc3RyKGFyZykKKyAgICAgICAgZXhjZXB0IF9zY3JpcHRFeGNfQmFkSW5zdGFsbGVkLCBhcmc6CisgICAgICAgICAgICByZXR1cm4gImJhZCIsIHN0cihhcmcpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCItLS0tICVzOiBpbnN0YWxsIHRlc3QgZ290IGV4Y2VwdGlvblxuIiAlIHNlbGYuZnVsbG5hbWUoKSkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi0tLS0gc291cmNlOlxuIikKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoaW5zdGFsbFRlc3QpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCItLS0tIGV4Y2VwdGlvbjpcbiIpCisgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIGlmIHNlbGYuX2RiLl9tYWludGFpbmVyOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi0tLS0gUGxlYXNlIGNvcHkgdGhpcyBhbmQgbWFpbCB0byAlc1xuIiAlIHNlbGYuX2RiLl9tYWludGFpbmVyKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikKKyAgICAgICAgICAgIHJldHVybiAiYmFkIiwgIlBhY2thZ2UgaW5zdGFsbCB0ZXN0IGdvdCBleGNlcHRpb24iCisgICAgICAgIHJldHVybiAieWVzIiwgIiIKKyAgICAgICAgCisgICAgZGVmIHByZXJlcXVpc2l0ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcHJlcmVxdWlzaXRlcyBmb3IgdGhpcyBwYWNrYWdlLgorICAgICAgICAKKyAgICAgICAgVGhlIGxpc3QgY29udGFpbnMgMi10dXBsZXMsIG9mIHdoaWNoIHRoZSBmaXJzdCBpdGVtIGlzIGVpdGhlcgorICAgICAgICBhIFBpbXBQYWNrYWdlIG9iamVjdCBvciBOb25lLCBhbmQgdGhlIHNlY29uZCBpcyBhIGRlc2NyaXB0aXZlCisgICAgICAgIHN0cmluZy4gVGhlIGZpcnN0IGl0ZW0gY2FuIGJlIE5vbmUgaWYgdGhpcyBwYWNrYWdlIGRlcGVuZHMgb24KKyAgICAgICAgc29tZXRoaW5nIHRoYXQgaXNuJ3QgcGltcC1pbnN0YWxsYWJsZSwgaW4gd2hpY2ggY2FzZSB0aGUgZGVzY3JpcHRpdmUKKyAgICAgICAgc3RyaW5nIHNob3VsZCB0ZWxsIHRoZSB1c2VyIHdoYXQgdG8gZG8uIiIiCisgICAgICAgIAorICAgICAgICBydiA9IFtdCisgICAgICAgIGlmIG5vdCBzZWxmLl9kaWN0LmdldCgnRG93bmxvYWQtVVJMJyk6CisgICAgICAgICAgICByZXR1cm4gWyhOb25lLCAKKyAgICAgICAgICAgICAgICAiJXM6IFRoaXMgcGFja2FnZSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgbWFudWFsbHkgKG5vIERvd25sb2FkLVVSTCBmaWVsZCkiICUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsbmFtZSgpKV0KKyAgICAgICAgaWYgbm90IHNlbGYuX2RpY3QuZ2V0KCdQcmVyZXF1aXNpdGVzJyk6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fZGljdFsnUHJlcmVxdWlzaXRlcyddOgorICAgICAgICAgICAgaWYgdHlwZShpdGVtKSA9PSBzdHI6CisgICAgICAgICAgICAgICAgcGtnID0gTm9uZQorICAgICAgICAgICAgICAgIGRlc2NyID0gc3RyKGl0ZW0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUgPSBpdGVtWydOYW1lJ10KKyAgICAgICAgICAgICAgICBpZiBpdGVtLmhhc19rZXkoJ1ZlcnNpb24nKToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnLScgKyBpdGVtWydWZXJzaW9uJ10KKyAgICAgICAgICAgICAgICBpZiBpdGVtLmhhc19rZXkoJ0ZsYXZvcicpOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICctJyArIGl0ZW1bJ0ZsYXZvciddCisgICAgICAgICAgICAgICAgcGtnID0gc2VsZi5fZGIuZmluZChuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBwa2c6CisgICAgICAgICAgICAgICAgICAgIGRlc2NyID0gIlJlcXVpcmVzIHVua25vd24gJXMiJW5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZXNjciA9IHBrZy5kZXNjcmlwdGlvbigpCisgICAgICAgICAgICBydi5hcHBlbmQoKHBrZywgZGVzY3IpKQorICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgICAgIAorICAgIGRlZiBfY21kKHNlbGYsIG91dHB1dCwgZGlyLCAqY21kaXRlbXMpOgorICAgICAgICAiIiJJbnRlcm5hbCByb3V0aW5lIHRvIHJ1biBhIHNoZWxsIGNvbW1hbmQgaW4gYSBnaXZlbiBkaXJlY3RvcnkuIiIiCisgICAgICAgIAorICAgICAgICBjbWQgPSAoImNkIFwiJXNcIjsgIiAlIGRpcikgKyAiICIuam9pbihjbWRpdGVtcykKKyAgICAgICAgaWYgb3V0cHV0OgorICAgICAgICAgICAgb3V0cHV0LndyaXRlKCIrICVzXG4iICUgY21kKQorICAgICAgICBpZiBOT19FWEVDVVRFOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgY2hpbGQgPSBwb3BlbjIuUG9wZW40KGNtZCkKKyAgICAgICAgY2hpbGQudG9jaGlsZC5jbG9zZSgpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gY2hpbGQuZnJvbWNoaWxkLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGxpbmUpCisgICAgICAgIHJldHVybiBjaGlsZC53YWl0KCkKKyAgICAgICAgCisgICAgZGVmIGRvd25sb2FkUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICAiIiJEb3dubG9hZCBhIHNpbmdsZSBwYWNrYWdlLCBpZiBuZWVkZWQuCisgICAgICAgIAorICAgICAgICBBbiBNRDUgc2lnbmF0dXJlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZG93bmxvYWQgaXMgbmVlZGVkLAorICAgICAgICBhbmQgdG8gdGVzdCB0aGF0IHdlIGFjdHVhbGx5IGRvd25sb2FkZWQgd2hhdCB3ZSBleHBlY3RlZC4KKyAgICAgICAgSWYgb3V0cHV0IGlzIGdpdmVuIGl0IGlzIGEgZmlsZS1saWtlIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSBhIGxvZworICAgICAgICBvZiB3aGF0IGhhcHBlbnMuCisgICAgICAgIAorICAgICAgICBJZiBhbnl0aGluZyB1bmZvcmVzZWVuIGhhcHBlbmVkIHRoZSBtZXRob2QgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlCisgICAgICAgIHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIAorICAgICAgICBzY2hlbWUsIGxvYywgcGF0aCwgcXVlcnksIGZyYWcgPSB1cmxwYXJzZS51cmxzcGxpdChzZWxmLl9kaWN0WydEb3dubG9hZC1VUkwnXSkKKyAgICAgICAgcGF0aCA9IHVybGxpYi51cmwycGF0aG5hbWUocGF0aCkKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWzFdCisgICAgICAgIHNlbGYuYXJjaGl2ZUZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RiLnByZWZlcmVuY2VzLmRvd25sb2FkRGlyLCBmaWxlbmFtZSkgICAgICAgICAKKyAgICAgICAgaWYgbm90IHNlbGYuX2FyY2hpdmVPSygpOgorICAgICAgICAgICAgaWYgc2NoZW1lID09ICdtYW51YWwnOgorICAgICAgICAgICAgICAgIHJldHVybiAiUGxlYXNlIGRvd25sb2FkIHBhY2thZ2UgbWFudWFsbHkgYW5kIHNhdmUgYXMgJXMiICUgc2VsZi5hcmNoaXZlRmlsZW5hbWUKKyAgICAgICAgICAgIGlmIHNlbGYuX2NtZChvdXRwdXQsIHNlbGYuX2RiLnByZWZlcmVuY2VzLmRvd25sb2FkRGlyLAorICAgICAgICAgICAgICAgICAgICAiY3VybCIsCisgICAgICAgICAgICAgICAgICAgICItLW91dHB1dCIsIHNlbGYuYXJjaGl2ZUZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kaWN0WydEb3dubG9hZC1VUkwnXSk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkb3dubG9hZCBjb21tYW5kIGZhaWxlZCIKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYXJjaGl2ZUZpbGVuYW1lKSBhbmQgbm90IE5PX0VYRUNVVEU6CisgICAgICAgICAgICByZXR1cm4gImFyY2hpdmUgbm90IGZvdW5kIGFmdGVyIGRvd25sb2FkIgorICAgICAgICBpZiBub3Qgc2VsZi5fYXJjaGl2ZU9LKCk6CisgICAgICAgICAgICByZXR1cm4gImFyY2hpdmUgZG9lcyBub3QgaGF2ZSBjb3JyZWN0IE1ENSBjaGVja3N1bSIKKyAgICAgICAgICAgIAorICAgIGRlZiBfYXJjaGl2ZU9LKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGFuIGFyY2hpdmUuIEl0IHNob3VsZCBleGlzdCBhbmQgdGhlIE1ENSBjaGVja3N1bSBzaG91bGQgYmUgY29ycmVjdC4iIiIKKyAgICAgICAgCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmFyY2hpdmVGaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBub3Qgc2VsZi5fZGljdC5nZXQoJ01ENVN1bScpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogbm8gTUQ1U3VtIGZvciAlc1xuIiAlIHNlbGYuZnVsbG5hbWUoKSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGRhdGEgPSBvcGVuKHNlbGYuYXJjaGl2ZUZpbGVuYW1lLCAncmInKS5yZWFkKCkKKyAgICAgICAgY2hlY2tzdW0gPSBtZDUubmV3KGRhdGEpLmhleGRpZ2VzdCgpCisgICAgICAgIHJldHVybiBjaGVja3N1bSA9PSBzZWxmLl9kaWN0WydNRDVTdW0nXQorICAgICAgICAgICAgCisgICAgZGVmIHVucGFja1BhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKKyAgICAgICAgIiIiVW5wYWNrIGEgZG93bmxvYWRlZCBwYWNrYWdlIGFyY2hpdmUuIiIiCisgICAgICAgIAorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5hcmNoaXZlRmlsZW5hbWUpWzFdCisgICAgICAgIGZvciBleHQsIGNtZCBpbiBBUkNISVZFX0ZPUk1BVFM6CisgICAgICAgICAgICBpZiBmaWxlbmFtZVstbGVuKGV4dCk6XSA9PSBleHQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAidW5rbm93biBleHRlbnNpb24gZm9yIGFyY2hpdmUgZmlsZTogJXMiICUgZmlsZW5hbWUKKyAgICAgICAgc2VsZi5iYXNlbmFtZSA9IGZpbGVuYW1lWzotbGVuKGV4dCldCisgICAgICAgIGNtZCA9IGNtZCAlIHNlbGYuYXJjaGl2ZUZpbGVuYW1lCisgICAgICAgIGlmIHNlbGYuX2NtZChvdXRwdXQsIHNlbGYuX2RiLnByZWZlcmVuY2VzLmJ1aWxkRGlyLCBjbWQpOgorICAgICAgICAgICAgcmV0dXJuICJ1bnBhY2sgY29tbWFuZCBmYWlsZWQiCisgICAgICAgICAgICAKKyAgICBkZWYgaW5zdGFsbFBhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKKyAgICAgICAgIiIiRGVmYXVsdCBpbnN0YWxsIG1ldGhvZCwgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIiIiCisgICAgICAgIHJldHVybiAiJXM6IFRoaXMgcGFja2FnZSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgbWFudWFsbHkgKG5vIHN1cHBvcnQgZm9yIGZsYXZvcj1cIiVzXCIpIiBcCisgICAgICAgICAgICAlIChzZWxmLmZ1bGxuYW1lKCksIHNlbGYuX2RpY3QuZ2V0KGZsYXZvciwgIiIpKQorICAgICAgICAgICAgCisgICAgZGVmIGluc3RhbGxTaW5nbGVQYWNrYWdlKHNlbGYsIG91dHB1dD1Ob25lKToKKyAgICAgICAgIiIiRG93bmxvYWQsIHVucGFjayBhbmQgaW5zdGFsbCBhIHNpbmdsZSBwYWNrYWdlLgorICAgICAgICAKKyAgICAgICAgSWYgb3V0cHV0IGlzIGdpdmVuIGl0IHNob3VsZCBiZSBhIGZpbGUtbGlrZSBvYmplY3QgYW5kIGl0CisgICAgICAgIHdpbGwgcmVjZWl2ZSBhIGxvZyBvZiB3aGF0IGhhcHBlbmVkLiIiIgorICAgICAgICAKKyAgICAgICAgaWYgbm90IHNlbGYuX2RpY3RbJ0Rvd25sb2FkLVVSTCddOgorICAgICAgICAgICAgcmV0dXJuICIlczogVGhpcyBwYWNrYWdlIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBtYW51YWxseSAobm8gRG93bmxvYWQtVVJMIGZpZWxkKSIgJSBfZm10cGFja2FnZW5hbWUoc2VsZikKKyAgICAgICAgbXNnID0gc2VsZi5kb3dubG9hZFBhY2thZ2VPbmx5KG91dHB1dCkKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgcmV0dXJuICIlczogZG93bmxvYWQ6ICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIG1zZykKKyAgICAgICAgICAgIAorICAgICAgICBtc2cgPSBzZWxmLnVucGFja1BhY2thZ2VPbmx5KG91dHB1dCkKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgcmV0dXJuICIlczogdW5wYWNrOiAlcyIgJSAoc2VsZi5mdWxsbmFtZSgpLCBtc2cpCisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbFBhY2thZ2VPbmx5KG91dHB1dCkKKyAgICAgICAgCisgICAgZGVmIGJlZm9yZUluc3RhbGwoc2VsZik6CisgICAgICAgICIiIkJvb2trZWVwaW5nIGJlZm9yZSBpbnN0YWxsYXRpb246IHJlbWVtYmVyIHdoYXQgd2UgaGF2ZSBpbiBzaXRlLXBhY2thZ2VzIiIiCisgICAgICAgIHNlbGYuX29sZF9jb250ZW50cyA9IG9zLmxpc3RkaXIoc2VsZi5fZGIucHJlZmVyZW5jZXMuaW5zdGFsbERpcikKKyAgICAgICAgCisgICAgZGVmIGFmdGVySW5zdGFsbChzZWxmKToKKyAgICAgICAgIiIiQm9va2tlZXBpbmcgYWZ0ZXIgaW5zdGFsbGF0aW9uOiBpbnRlcnByZXQgYW55IG5ldyAucHRoIGZpbGVzIHRoYXQgaGF2ZQorICAgICAgICBhcHBlYXJlZCIiIgorICAgICAgICAgICAgICAgIAorICAgICAgICBuZXdfY29udGVudHMgPSBvcy5saXN0ZGlyKHNlbGYuX2RiLnByZWZlcmVuY2VzLmluc3RhbGxEaXIpCisgICAgICAgIGZvciBmbiBpbiBuZXdfY29udGVudHM6CisgICAgICAgICAgICBpZiBmbiBpbiBzZWxmLl9vbGRfY29udGVudHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGZuWy00Ol0gIT0gJy5wdGgnOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9kYi5wcmVmZXJlbmNlcy5pbnN0YWxsRGlyLCBmbikKKyAgICAgICAgICAgIGYgPSBvcGVuKGZ1bGxuYW1lKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZi5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBsaW5lWzBdID09ICcjJzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBsaW5lWzo2XSA9PSAnaW1wb3J0JzoKKyAgICAgICAgICAgICAgICAgICAgZXhlYyBsaW5lCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbGluZVstMV0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gb3MucGF0aC5qb2luKHNlbGYuX2RiLnByZWZlcmVuY2VzLmluc3RhbGxEaXIsIGxpbmUpCisgICAgICAgICAgICAgICAgbGluZSA9IG9zLnBhdGgucmVhbHBhdGgobGluZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZSBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICAgICAgICAgc3lzLnBhdGguYXBwZW5kKGxpbmUpICAgICAgICAgICAKIAogY2xhc3MgUGltcFBhY2thZ2VfYmluYXJ5KFBpbXBQYWNrYWdlKToKIAotCWRlZiB1bnBhY2tQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6Ci0JCSIiIldlIGRvbid0IHVucGFjayBiaW5hcnkgcGFja2FnZXMgdW50aWwgaW5zdGFsbGluZyIiIgotCQlwYXNzCi0JCQkKLQlkZWYgaW5zdGFsbFBhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKLQkJIiIiSW5zdGFsbCBhIHNpbmdsZSBzb3VyY2UgcGFja2FnZS4KLQkJCi0JCUlmIG91dHB1dCBpcyBnaXZlbiBpdCBzaG91bGQgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0IGFuZCBpdAotCQl3aWxsIHJlY2VpdmUgYSBsb2cgb2Ygd2hhdCBoYXBwZW5lZC4iIiIKLQkJcHJpbnQgJ1BpbXBQYWNrYWdlX2JpbmFyeSBpbnN0YWxsUGFja2FnZU9ubHknCi0JCQkJCQotCQltc2dzID0gW10KLQkJaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdQcmUtaW5zdGFsbC1jb21tYW5kJyk6Ci0JCQltc2cuYXBwZW5kKCIlczogUHJlLWluc3RhbGwtY29tbWFuZCBpZ25vcmVkIiAlIHNlbGYuZnVsbG5hbWUoKSkKLQkJaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdJbnN0YWxsLWNvbW1hbmQnKToKLQkJCW1zZ3MuYXBwZW5kKCIlczogSW5zdGFsbC1jb21tYW5kIGlnbm9yZWQiICUgc2VsZi5mdWxsbmFtZSgpKQotCQlpZiBzZWxmLl9kaWN0Lmhhc19rZXkoJ1Bvc3QtaW5zdGFsbC1jb21tYW5kJyk6Ci0JCQltc2dzLmFwcGVuZCgiJXM6IFBvc3QtaW5zdGFsbC1jb21tYW5kIGlnbm9yZWQiICUgc2VsZi5mdWxsbmFtZSgpKQotCQkJCQkKLQkJc2VsZi5iZWZvcmVJbnN0YWxsKCkKKyAgICBkZWYgdW5wYWNrUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICAiIiJXZSBkb24ndCB1bnBhY2sgYmluYXJ5IHBhY2thZ2VzIHVudGlsIGluc3RhbGxpbmciIiIKKyAgICAgICAgcGFzcworICAgICAgICAgICAgCisgICAgZGVmIGluc3RhbGxQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgICIiIkluc3RhbGwgYSBzaW5nbGUgc291cmNlIHBhY2thZ2UuCisgICAgICAgIAorICAgICAgICBJZiBvdXRwdXQgaXMgZ2l2ZW4gaXQgc2hvdWxkIGJlIGEgZmlsZS1saWtlIG9iamVjdCBhbmQgaXQKKyAgICAgICAgd2lsbCByZWNlaXZlIGEgbG9nIG9mIHdoYXQgaGFwcGVuZWQuIiIiCisgICAgICAgIHByaW50ICdQaW1wUGFja2FnZV9iaW5hcnkgaW5zdGFsbFBhY2thZ2VPbmx5JworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgbXNncyA9IFtdCisgICAgICAgIGlmIHNlbGYuX2RpY3QuaGFzX2tleSgnUHJlLWluc3RhbGwtY29tbWFuZCcpOgorICAgICAgICAgICAgbXNnLmFwcGVuZCgiJXM6IFByZS1pbnN0YWxsLWNvbW1hbmQgaWdub3JlZCIgJSBzZWxmLmZ1bGxuYW1lKCkpCisgICAgICAgIGlmIHNlbGYuX2RpY3QuaGFzX2tleSgnSW5zdGFsbC1jb21tYW5kJyk6CisgICAgICAgICAgICBtc2dzLmFwcGVuZCgiJXM6IEluc3RhbGwtY29tbWFuZCBpZ25vcmVkIiAlIHNlbGYuZnVsbG5hbWUoKSkKKyAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdQb3N0LWluc3RhbGwtY29tbWFuZCcpOgorICAgICAgICAgICAgbXNncy5hcHBlbmQoIiVzOiBQb3N0LWluc3RhbGwtY29tbWFuZCBpZ25vcmVkIiAlIHNlbGYuZnVsbG5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHNlbGYuYmVmb3JlSW5zdGFsbCgpCiAKLQkJIyBJbnN0YWxsIGJ5IHVucGFja2luZwotCQlmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5hcmNoaXZlRmlsZW5hbWUpWzFdCi0JCWZvciBleHQsIGNtZCBpbiBBUkNISVZFX0ZPUk1BVFM6Ci0JCQlpZiBmaWxlbmFtZVstbGVuKGV4dCk6XSA9PSBleHQ6Ci0JCQkJYnJlYWsKLQkJZWxzZToKLQkJCXJldHVybiAidW5rbm93biBleHRlbnNpb24gZm9yIGFyY2hpdmUgZmlsZTogJXMiICUgZmlsZW5hbWUKLQkJCi0JCSMgRXh0cmFjdCB0aGUgZmlsZXMgaW4gdGhlIHJvb3QgZm9sZGVyLgotCQljbWQgPSBjbWQgJSBzZWxmLmFyY2hpdmVGaWxlbmFtZQotCQlpZiBzZWxmLl9jbWQob3V0cHV0LCAiLyIsIGNtZCk6Ci0JCQlyZXR1cm4gInVucGFjayBjb21tYW5kIGZhaWxlZCIKLQkJCi0JCXNlbGYuYWZ0ZXJJbnN0YWxsKCkKLQkJCi0JCWlmIHNlbGYuX2RpY3QuaGFzX2tleSgnUG9zdC1pbnN0YWxsLWNvbW1hbmQnKToKLQkJCWlmIHNlbGYuX2NtZChvdXRwdXQsIHNlbGYuX2J1aWxkRGlybmFtZSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSk6Ci0JCQkJcmV0dXJuICJwb3N0LWluc3RhbGwgJXM6IHJ1bm5pbmcgXCIlc1wiIGZhaWxlZCIgJSBcCi0JCQkJCShzZWxmLmZ1bGxuYW1lKCksIHNlbGYuX2RpY3RbJ1Bvc3QtaW5zdGFsbC1jb21tYW5kJ10pCi0JCXJldHVybiBOb25lCi0JCQotCQorICAgICAgICAjIEluc3RhbGwgYnkgdW5wYWNraW5nCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLmFyY2hpdmVGaWxlbmFtZSlbMV0KKyAgICAgICAgZm9yIGV4dCwgY21kIGluIEFSQ0hJVkVfRk9STUFUUzoKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lWy1sZW4oZXh0KTpdID09IGV4dDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIGV4dGVuc2lvbiBmb3IgYXJjaGl2ZSBmaWxlOiAlcyIgJSBmaWxlbmFtZQorICAgICAgICAKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaWxlcyBpbiB0aGUgcm9vdCBmb2xkZXIuCisgICAgICAgIGNtZCA9IGNtZCAlIHNlbGYuYXJjaGl2ZUZpbGVuYW1lCisgICAgICAgIGlmIHNlbGYuX2NtZChvdXRwdXQsICIvIiwgY21kKToKKyAgICAgICAgICAgIHJldHVybiAidW5wYWNrIGNvbW1hbmQgZmFpbGVkIgorICAgICAgICAKKyAgICAgICAgc2VsZi5hZnRlckluc3RhbGwoKQorICAgICAgICAKKyAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdQb3N0LWluc3RhbGwtY29tbWFuZCcpOgorICAgICAgICAgICAgaWYgc2VsZi5fY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBzZWxmLl9kaWN0WydQb3N0LWluc3RhbGwtY29tbWFuZCddKToKKyAgICAgICAgICAgICAgICByZXR1cm4gInBvc3QtaW5zdGFsbCAlczogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuZnVsbG5hbWUoKSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgCisgICAgCiBjbGFzcyBQaW1wUGFja2FnZV9zb3VyY2UoUGltcFBhY2thZ2UpOgogCi0JZGVmIHVucGFja1BhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKLQkJIiIiVW5wYWNrIGEgc291cmNlIHBhY2thZ2UgYW5kIGNoZWNrIHRoYXQgc2V0dXAucHkgZXhpc3RzIiIiCi0JCVBpbXBQYWNrYWdlLnVucGFja1BhY2thZ2VPbmx5KHNlbGYsIG91dHB1dCkKLQkJIyBUZXN0IHRoYXQgYSBzZXR1cCBzY3JpcHQgaGFzIGJlZW4gY3JlYXRlCi0JCXNlbGYuX2J1aWxkRGlybmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9kYi5wcmVmZXJlbmNlcy5idWlsZERpciwgc2VsZi5iYXNlbmFtZSkKLQkJc2V0dXBuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2J1aWxkRGlybmFtZSwgInNldHVwLnB5IikKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKHNldHVwbmFtZSkgYW5kIG5vdCBOT19FWEVDVVRFOgotCQkJcmV0dXJuICJubyBzZXR1cC5weSBmb3VuZCBhZnRlciB1bnBhY2sgb2YgYXJjaGl2ZSIKKyAgICBkZWYgdW5wYWNrUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICAiIiJVbnBhY2sgYSBzb3VyY2UgcGFja2FnZSBhbmQgY2hlY2sgdGhhdCBzZXR1cC5weSBleGlzdHMiIiIKKyAgICAgICAgUGltcFBhY2thZ2UudW5wYWNrUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0KQorICAgICAgICAjIFRlc3QgdGhhdCBhIHNldHVwIHNjcmlwdCBoYXMgYmVlbiBjcmVhdGUKKyAgICAgICAgc2VsZi5fYnVpbGREaXJuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RiLnByZWZlcmVuY2VzLmJ1aWxkRGlyLCBzZWxmLmJhc2VuYW1lKQorICAgICAgICBzZXR1cG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fYnVpbGREaXJuYW1lLCAic2V0dXAucHkiKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2V0dXBuYW1lKSBhbmQgbm90IE5PX0VYRUNVVEU6CisgICAgICAgICAgICByZXR1cm4gIm5vIHNldHVwLnB5IGZvdW5kIGFmdGVyIHVucGFjayBvZiBhcmNoaXZlIgogCi0JZGVmIGluc3RhbGxQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6Ci0JCSIiIkluc3RhbGwgYSBzaW5nbGUgc291cmNlIHBhY2thZ2UuCi0JCQotCQlJZiBvdXRwdXQgaXMgZ2l2ZW4gaXQgc2hvdWxkIGJlIGEgZmlsZS1saWtlIG9iamVjdCBhbmQgaXQKLQkJd2lsbCByZWNlaXZlIGEgbG9nIG9mIHdoYXQgaGFwcGVuZWQuIiIiCi0JCQkJCQotCQlpZiBzZWxmLl9kaWN0Lmhhc19rZXkoJ1ByZS1pbnN0YWxsLWNvbW1hbmQnKToKLQkJCWlmIHNlbGYuX2NtZChvdXRwdXQsIHNlbGYuX2J1aWxkRGlybmFtZSwgc2VsZi5fZGljdFsnUHJlLWluc3RhbGwtY29tbWFuZCddKToKLQkJCQlyZXR1cm4gInByZS1pbnN0YWxsICVzOiBydW5uaW5nIFwiJXNcIiBmYWlsZWQiICUgXAotCQkJCQkoc2VsZi5mdWxsbmFtZSgpLCBzZWxmLl9kaWN0WydQcmUtaW5zdGFsbC1jb21tYW5kJ10pCi0JCQkJCQotCQlzZWxmLmJlZm9yZUluc3RhbGwoKQotCQlpbnN0YWxsY21kID0gc2VsZi5fZGljdC5nZXQoJ0luc3RhbGwtY29tbWFuZCcpCi0JCWlmIG5vdCBpbnN0YWxsY21kOgotCQkJaW5zdGFsbGNtZCA9ICciJXMiIHNldHVwLnB5IGluc3RhbGwnICUgc3lzLmV4ZWN1dGFibGUKLQkJaWYgc2VsZi5fY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBpbnN0YWxsY21kKToKLQkJCXJldHVybiAiaW5zdGFsbCAlczogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKLQkJCQkoc2VsZi5mdWxsbmFtZSgpLCBpbnN0YWxsY21kKQotCQkKLQkJc2VsZi5hZnRlckluc3RhbGwoKQotCQkKLQkJaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdQb3N0LWluc3RhbGwtY29tbWFuZCcpOgotCQkJaWYgc2VsZi5fY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBzZWxmLl9kaWN0WydQb3N0LWluc3RhbGwtY29tbWFuZCddKToKLQkJCQlyZXR1cm4gInBvc3QtaW5zdGFsbCAlczogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKLQkJCQkJKHNlbGYuZnVsbG5hbWUoKSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSkKLQkJcmV0dXJuIE5vbmUKLQkJCi0JCisgICAgZGVmIGluc3RhbGxQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgICIiIkluc3RhbGwgYSBzaW5nbGUgc291cmNlIHBhY2thZ2UuCisgICAgICAgIAorICAgICAgICBJZiBvdXRwdXQgaXMgZ2l2ZW4gaXQgc2hvdWxkIGJlIGEgZmlsZS1saWtlIG9iamVjdCBhbmQgaXQKKyAgICAgICAgd2lsbCByZWNlaXZlIGEgbG9nIG9mIHdoYXQgaGFwcGVuZWQuIiIiCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiBzZWxmLl9kaWN0Lmhhc19rZXkoJ1ByZS1pbnN0YWxsLWNvbW1hbmQnKToKKyAgICAgICAgICAgIGlmIHNlbGYuX2NtZChvdXRwdXQsIHNlbGYuX2J1aWxkRGlybmFtZSwgc2VsZi5fZGljdFsnUHJlLWluc3RhbGwtY29tbWFuZCddKToKKyAgICAgICAgICAgICAgICByZXR1cm4gInByZS1pbnN0YWxsICVzOiBydW5uaW5nIFwiJXNcIiBmYWlsZWQiICUgXAorICAgICAgICAgICAgICAgICAgICAoc2VsZi5mdWxsbmFtZSgpLCBzZWxmLl9kaWN0WydQcmUtaW5zdGFsbC1jb21tYW5kJ10pCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzZWxmLmJlZm9yZUluc3RhbGwoKQorICAgICAgICBpbnN0YWxsY21kID0gc2VsZi5fZGljdC5nZXQoJ0luc3RhbGwtY29tbWFuZCcpCisgICAgICAgIGlmIG5vdCBpbnN0YWxsY21kOgorICAgICAgICAgICAgaW5zdGFsbGNtZCA9ICciJXMiIHNldHVwLnB5IGluc3RhbGwnICUgc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgaWYgc2VsZi5fY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBpbnN0YWxsY21kKToKKyAgICAgICAgICAgIHJldHVybiAiaW5zdGFsbCAlczogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKKyAgICAgICAgICAgICAgICAoc2VsZi5mdWxsbmFtZSgpLCBpbnN0YWxsY21kKQorICAgICAgICAKKyAgICAgICAgc2VsZi5hZnRlckluc3RhbGwoKQorICAgICAgICAKKyAgICAgICAgaWYgc2VsZi5fZGljdC5oYXNfa2V5KCdQb3N0LWluc3RhbGwtY29tbWFuZCcpOgorICAgICAgICAgICAgaWYgc2VsZi5fY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBzZWxmLl9kaWN0WydQb3N0LWluc3RhbGwtY29tbWFuZCddKToKKyAgICAgICAgICAgICAgICByZXR1cm4gInBvc3QtaW5zdGFsbCAlczogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuZnVsbG5hbWUoKSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgCisgICAgCiBjbGFzcyBQaW1wSW5zdGFsbGVyOgotCSIiIkluc3RhbGxlciBlbmdpbmU6IGNvbXB1dGVzIGRlcGVuZGVuY2llcyBhbmQgaW5zdGFsbHMKLQlwYWNrYWdlcyBpbiB0aGUgcmlnaHQgb3JkZXIuIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGRiKToKLQkJc2VsZi5fdG9kbyA9IFtdCi0JCXNlbGYuX2RiID0gZGIKLQkJc2VsZi5fY3VydG9kbyA9IFtdCi0JCXNlbGYuX2N1cm1lc3NhZ2VzID0gW10KLQkJCi0JZGVmIF9fY29udGFpbnNfXyhzZWxmLCBwYWNrYWdlKToKLQkJcmV0dXJuIHBhY2thZ2UgaW4gc2VsZi5fdG9kbwotCQkKLQlkZWYgX2FkZFBhY2thZ2VzKHNlbGYsIHBhY2thZ2VzKToKLQkJZm9yIHBhY2thZ2UgaW4gcGFja2FnZXM6Ci0JCQlpZiBub3QgcGFja2FnZSBpbiBzZWxmLl90b2RvOgotCQkJCXNlbGYuX3RvZG8uaW5zZXJ0KDAsIHBhY2thZ2UpCi0JCQkKLQlkZWYgX3ByZXBhcmVJbnN0YWxsKHNlbGYsIHBhY2thZ2UsIGZvcmNlPTAsIHJlY3Vyc2l2ZT0xKToKLQkJIiIiSW50ZXJuYWwgcm91dGluZSwgcmVjdXJzaXZlIGVuZ2luZSBmb3IgcHJlcGFyZUluc3RhbGwuCi0JCQotCQlUZXN0IHdoZXRoZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGFuZCAoaWYgbm90IGluc3RhbGxlZAotCQlvciBpZiBmb3JjZT09MSkgcHJlcGVuZCBpdCB0byB0aGUgdGVtcG9yYXJ5IHRvZG8gbGlzdCBhbmQKLQkJY2FsbCBvdXJzZWx2ZXMgcmVjdXJzaXZlbHkgb24gYWxsIHByZXJlcXVpc2l0ZXMuIiIiCi0JCQotCQlpZiBub3QgZm9yY2U6Ci0JCQlzdGF0dXMsIG1lc3NhZ2UgPSBwYWNrYWdlLmluc3RhbGxlZCgpCi0JCQlpZiBzdGF0dXMgPT0gInllcyI6Ci0JCQkJcmV0dXJuIAotCQlpZiBwYWNrYWdlIGluIHNlbGYuX3RvZG8gb3IgcGFja2FnZSBpbiBzZWxmLl9jdXJ0b2RvOgotCQkJcmV0dXJuCi0JCXNlbGYuX2N1cnRvZG8uaW5zZXJ0KDAsIHBhY2thZ2UpCi0JCWlmIG5vdCByZWN1cnNpdmU6Ci0JCQlyZXR1cm4KLQkJcHJlcmVxcyA9IHBhY2thZ2UucHJlcmVxdWlzaXRlcygpCi0JCWZvciBwa2csIGRlc2NyIGluIHByZXJlcXM6Ci0JCQlpZiBwa2c6Ci0JCQkJc2VsZi5fcHJlcGFyZUluc3RhbGwocGtnLCBmb3JjZSwgcmVjdXJzaXZlKQotCQkJZWxzZToKLQkJCQlzZWxmLl9jdXJtZXNzYWdlcy5hcHBlbmQoIlJlcXVpcmVzOiAlcyIgJSBkZXNjcikKLQkJCQkKLQlkZWYgcHJlcGFyZUluc3RhbGwoc2VsZiwgcGFja2FnZSwgZm9yY2U9MCwgcmVjdXJzaXZlPTEpOgotCQkiIiJQcmVwYXJlIGluc3RhbGxhdGlvbiBvZiBhIHBhY2thZ2UuCi0JCQotCQlJZiB0aGUgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCBhbmQgZm9yY2UgaXMgZmFsc2Ugbm90aGluZwotCQlpcyBkb25lLiBJZiByZWN1cnNpdmUgaXMgdHJ1ZSBwcmVyZXF1aXNpdGVzIGFyZSBpbnN0YWxsZWQgZmlyc3QuCi0JCQotCQlSZXR1cm5zIGEgbGlzdCBvZiBwYWNrYWdlcyAodG8gYmUgcGFzc2VkIHRvIGluc3RhbGwpIGFuZCBhIGxpc3QKLQkJb2YgbWVzc2FnZXMgb2YgYW55IHByb2JsZW1zIGVuY291bnRlcmVkLgotCQkiIiIKLQkJCi0JCXNlbGYuX2N1cnRvZG8gPSBbXQotCQlzZWxmLl9jdXJtZXNzYWdlcyA9IFtdCi0JCXNlbGYuX3ByZXBhcmVJbnN0YWxsKHBhY2thZ2UsIGZvcmNlLCByZWN1cnNpdmUpCi0JCXJ2ID0gc2VsZi5fY3VydG9kbywgc2VsZi5fY3VybWVzc2FnZXMKLQkJc2VsZi5fY3VydG9kbyA9IFtdCi0JCXNlbGYuX2N1cm1lc3NhZ2VzID0gW10KLQkJcmV0dXJuIHJ2Ci0JCQotCWRlZiBpbnN0YWxsKHNlbGYsIHBhY2thZ2VzLCBvdXRwdXQpOgotCQkiIiJJbnN0YWxsIGEgbGlzdCBvZiBwYWNrYWdlcy4iIiIKLQkJCi0JCXNlbGYuX2FkZFBhY2thZ2VzKHBhY2thZ2VzKQotCQlzdGF0dXMgPSBbXQotCQlmb3IgcGtnIGluIHNlbGYuX3RvZG86Ci0JCQltc2cgPSBwa2cuaW5zdGFsbFNpbmdsZVBhY2thZ2Uob3V0cHV0KQotCQkJaWYgbXNnOgotCQkJCXN0YXR1cy5hcHBlbmQobXNnKQotCQlyZXR1cm4gc3RhdHVzCi0JCQotCQkKLQkKKyAgICAiIiJJbnN0YWxsZXIgZW5naW5lOiBjb21wdXRlcyBkZXBlbmRlbmNpZXMgYW5kIGluc3RhbGxzCisgICAgcGFja2FnZXMgaW4gdGhlIHJpZ2h0IG9yZGVyLiIiIgorICAgIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYik6CisgICAgICAgIHNlbGYuX3RvZG8gPSBbXQorICAgICAgICBzZWxmLl9kYiA9IGRiCisgICAgICAgIHNlbGYuX2N1cnRvZG8gPSBbXQorICAgICAgICBzZWxmLl9jdXJtZXNzYWdlcyA9IFtdCisgICAgICAgIAorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgcGFja2FnZSk6CisgICAgICAgIHJldHVybiBwYWNrYWdlIGluIHNlbGYuX3RvZG8KKyAgICAgICAgCisgICAgZGVmIF9hZGRQYWNrYWdlcyhzZWxmLCBwYWNrYWdlcyk6CisgICAgICAgIGZvciBwYWNrYWdlIGluIHBhY2thZ2VzOgorICAgICAgICAgICAgaWYgbm90IHBhY2thZ2UgaW4gc2VsZi5fdG9kbzoKKyAgICAgICAgICAgICAgICBzZWxmLl90b2RvLmluc2VydCgwLCBwYWNrYWdlKQorICAgICAgICAgICAgCisgICAgZGVmIF9wcmVwYXJlSW5zdGFsbChzZWxmLCBwYWNrYWdlLCBmb3JjZT0wLCByZWN1cnNpdmU9MSk6CisgICAgICAgICIiIkludGVybmFsIHJvdXRpbmUsIHJlY3Vyc2l2ZSBlbmdpbmUgZm9yIHByZXBhcmVJbnN0YWxsLgorICAgICAgICAKKyAgICAgICAgVGVzdCB3aGV0aGVyIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBhbmQgKGlmIG5vdCBpbnN0YWxsZWQKKyAgICAgICAgb3IgaWYgZm9yY2U9PTEpIHByZXBlbmQgaXQgdG8gdGhlIHRlbXBvcmFyeSB0b2RvIGxpc3QgYW5kCisgICAgICAgIGNhbGwgb3Vyc2VsdmVzIHJlY3Vyc2l2ZWx5IG9uIGFsbCBwcmVyZXF1aXNpdGVzLiIiIgorICAgICAgICAKKyAgICAgICAgaWYgbm90IGZvcmNlOgorICAgICAgICAgICAgc3RhdHVzLCBtZXNzYWdlID0gcGFja2FnZS5pbnN0YWxsZWQoKQorICAgICAgICAgICAgaWYgc3RhdHVzID09ICJ5ZXMiOgorICAgICAgICAgICAgICAgIHJldHVybiAKKyAgICAgICAgaWYgcGFja2FnZSBpbiBzZWxmLl90b2RvIG9yIHBhY2thZ2UgaW4gc2VsZi5fY3VydG9kbzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jdXJ0b2RvLmluc2VydCgwLCBwYWNrYWdlKQorICAgICAgICBpZiBub3QgcmVjdXJzaXZlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHByZXJlcXMgPSBwYWNrYWdlLnByZXJlcXVpc2l0ZXMoKQorICAgICAgICBmb3IgcGtnLCBkZXNjciBpbiBwcmVyZXFzOgorICAgICAgICAgICAgaWYgcGtnOgorICAgICAgICAgICAgICAgIHNlbGYuX3ByZXBhcmVJbnN0YWxsKHBrZywgZm9yY2UsIHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fY3VybWVzc2FnZXMuYXBwZW5kKCJSZXF1aXJlczogJXMiICUgZGVzY3IpCisgICAgICAgICAgICAgICAgCisgICAgZGVmIHByZXBhcmVJbnN0YWxsKHNlbGYsIHBhY2thZ2UsIGZvcmNlPTAsIHJlY3Vyc2l2ZT0xKToKKyAgICAgICAgIiIiUHJlcGFyZSBpbnN0YWxsYXRpb24gb2YgYSBwYWNrYWdlLgorICAgICAgICAKKyAgICAgICAgSWYgdGhlIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGZvcmNlIGlzIGZhbHNlIG5vdGhpbmcKKyAgICAgICAgaXMgZG9uZS4gSWYgcmVjdXJzaXZlIGlzIHRydWUgcHJlcmVxdWlzaXRlcyBhcmUgaW5zdGFsbGVkIGZpcnN0LgorICAgICAgICAKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgcGFja2FnZXMgKHRvIGJlIHBhc3NlZCB0byBpbnN0YWxsKSBhbmQgYSBsaXN0CisgICAgICAgIG9mIG1lc3NhZ2VzIG9mIGFueSBwcm9ibGVtcyBlbmNvdW50ZXJlZC4KKyAgICAgICAgIiIiCisgICAgICAgIAorICAgICAgICBzZWxmLl9jdXJ0b2RvID0gW10KKyAgICAgICAgc2VsZi5fY3VybWVzc2FnZXMgPSBbXQorICAgICAgICBzZWxmLl9wcmVwYXJlSW5zdGFsbChwYWNrYWdlLCBmb3JjZSwgcmVjdXJzaXZlKQorICAgICAgICBydiA9IHNlbGYuX2N1cnRvZG8sIHNlbGYuX2N1cm1lc3NhZ2VzCisgICAgICAgIHNlbGYuX2N1cnRvZG8gPSBbXQorICAgICAgICBzZWxmLl9jdXJtZXNzYWdlcyA9IFtdCisgICAgICAgIHJldHVybiBydgorICAgICAgICAKKyAgICBkZWYgaW5zdGFsbChzZWxmLCBwYWNrYWdlcywgb3V0cHV0KToKKyAgICAgICAgIiIiSW5zdGFsbCBhIGxpc3Qgb2YgcGFja2FnZXMuIiIiCisgICAgICAgIAorICAgICAgICBzZWxmLl9hZGRQYWNrYWdlcyhwYWNrYWdlcykKKyAgICAgICAgc3RhdHVzID0gW10KKyAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl90b2RvOgorICAgICAgICAgICAgbXNnID0gcGtnLmluc3RhbGxTaW5nbGVQYWNrYWdlKG91dHB1dCkKKyAgICAgICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgICAgICBzdGF0dXMuYXBwZW5kKG1zZykKKyAgICAgICAgcmV0dXJuIHN0YXR1cworICAgICAgICAKKyAgICAgICAgCisgICAgCiBkZWYgX3J1bihtb2RlLCB2ZXJib3NlLCBmb3JjZSwgYXJncyk6Ci0JIiIiRW5naW5lIGZvciB0aGUgbWFpbiBwcm9ncmFtIiIiCi0JCi0JcHJlZnMgPSBQaW1wUHJlZmVyZW5jZXMoKQotCXByZWZzLmNoZWNrKCkKLQlkYiA9IFBpbXBEYXRhYmFzZShwcmVmcykKLQlkYi5hcHBlbmRVUkwocHJlZnMucGltcERhdGFiYXNlKQotCQotCWlmIG1vZGUgPT0gJ2R1bXAnOgotCQlkYi5kdW1wKHN5cy5zdGRvdXQpCi0JZWxpZiBtb2RlID09J2xpc3QnOgotCQlpZiBub3QgYXJnczoKLQkJCWFyZ3MgPSBkYi5saXN0bmFtZXMoKQotCQlwcmludCAiJS0yMC4yMHNcdCVzIiAlICgiUGFja2FnZSIsICJEZXNjcmlwdGlvbiIpCi0JCXByaW50Ci0JCWZvciBwa2duYW1lIGluIGFyZ3M6Ci0JCQlwa2cgPSBkYi5maW5kKHBrZ25hbWUpCi0JCQlpZiBwa2c6Ci0JCQkJZGVzY3JpcHRpb24gPSBwa2cuZGVzY3JpcHRpb24oKQotCQkJCXBrZ25hbWUgPSBwa2cuZnVsbG5hbWUoKQotCQkJZWxzZToKLQkJCQlkZXNjcmlwdGlvbiA9ICdFcnJvcjogbm8gc3VjaCBwYWNrYWdlJwotCQkJcHJpbnQgIiUtMjAuMjBzXHQlcyIgJSAocGtnbmFtZSwgZGVzY3JpcHRpb24pCi0JCQlpZiB2ZXJib3NlOgotCQkJCXByaW50ICJcdEhvbWUgcGFnZTpcdCIsIHBrZy5ob21lcGFnZSgpCi0JCQkJcHJpbnQgIlx0RG93bmxvYWQgVVJMOlx0IiwgcGtnLmRvd25sb2FkVVJMKCkKLQllbGlmIG1vZGUgPT0nc3RhdHVzJzoKLQkJaWYgbm90IGFyZ3M6Ci0JCQlhcmdzID0gZGIubGlzdG5hbWVzKCkKLQkJCXByaW50ICIlLTIwLjIwc1x0JXNcdCVzIiAlICgiUGFja2FnZSIsICJJbnN0YWxsZWQiLCAiTWVzc2FnZSIpCi0JCQlwcmludAotCQlmb3IgcGtnbmFtZSBpbiBhcmdzOgotCQkJcGtnID0gZGIuZmluZChwa2duYW1lKQotCQkJaWYgcGtnOgotCQkJCXN0YXR1cywgbXNnID0gcGtnLmluc3RhbGxlZCgpCi0JCQkJcGtnbmFtZSA9IHBrZy5mdWxsbmFtZSgpCi0JCQllbHNlOgotCQkJCXN0YXR1cyA9ICdlcnJvcicKLQkJCQltc2cgPSAnTm8gc3VjaCBwYWNrYWdlJwotCQkJcHJpbnQgIiUtMjAuMjBzXHQlLTkuOXNcdCVzIiAlIChwa2duYW1lLCBzdGF0dXMsIG1zZykKLQkJCWlmIHZlcmJvc2UgYW5kIHN0YXR1cyA9PSAibm8iOgotCQkJCXByZXJlcSA9IHBrZy5wcmVyZXF1aXNpdGVzKCkKLQkJCQlmb3IgcGtnLCBtc2cgaW4gcHJlcmVxOgotCQkJCQlpZiBub3QgcGtnOgotCQkJCQkJcGtnID0gJycKLQkJCQkJZWxzZToKLQkJCQkJCXBrZyA9IHBrZy5mdWxsbmFtZSgpCi0JCQkJCXByaW50ICIlLTIwLjIwc1x0UmVxdWlyZW1lbnQ6ICVzICVzIiAlICgiIiwgcGtnLCBtc2cpCi0JZWxpZiBtb2RlID09ICdpbnN0YWxsJzoKLQkJaWYgbm90IGFyZ3M6Ci0JCQlwcmludCAnUGxlYXNlIHNwZWNpZnkgcGFja2FnZXMgdG8gaW5zdGFsbCcKLQkJCXN5cy5leGl0KDEpCi0JCWluc3QgPSBQaW1wSW5zdGFsbGVyKGRiKQotCQlmb3IgcGtnbmFtZSBpbiBhcmdzOgotCQkJcGtnID0gZGIuZmluZChwa2duYW1lKQotCQkJaWYgbm90IHBrZzoKLQkJCQlwcmludCAnJXM6IE5vIHN1Y2ggcGFja2FnZScgJSBwa2duYW1lCi0JCQkJY29udGludWUKLQkJCWxpc3QsIG1lc3NhZ2VzID0gaW5zdC5wcmVwYXJlSW5zdGFsbChwa2csIGZvcmNlKQotCQkJaWYgbWVzc2FnZXMgYW5kIG5vdCBmb3JjZToKLQkJCQlwcmludCAiJXM6IE5vdCBpbnN0YWxsZWQ6IiAlIHBrZ25hbWUKLQkJCQlmb3IgbSBpbiBtZXNzYWdlczoKLQkJCQkJcHJpbnQgIlx0IiwgbQotCQkJZWxzZToKLQkJCQlpZiB2ZXJib3NlOgotCQkJCQlvdXRwdXQgPSBzeXMuc3Rkb3V0Ci0JCQkJZWxzZToKLQkJCQkJb3V0cHV0ID0gTm9uZQotCQkJCW1lc3NhZ2VzID0gaW5zdC5pbnN0YWxsKGxpc3QsIG91dHB1dCkKLQkJCQlpZiBtZXNzYWdlczoKLQkJCQkJcHJpbnQgIiVzOiBOb3QgaW5zdGFsbGVkOiIgJSBwa2duYW1lCi0JCQkJCWZvciBtIGluIG1lc3NhZ2VzOgotCQkJCQkJcHJpbnQgIlx0IiwgbQorICAgICIiIkVuZ2luZSBmb3IgdGhlIG1haW4gcHJvZ3JhbSIiIgorICAgIAorICAgIHByZWZzID0gUGltcFByZWZlcmVuY2VzKCkKKyAgICBwcmVmcy5jaGVjaygpCisgICAgZGIgPSBQaW1wRGF0YWJhc2UocHJlZnMpCisgICAgZGIuYXBwZW5kVVJMKHByZWZzLnBpbXBEYXRhYmFzZSkKKyAgICAKKyAgICBpZiBtb2RlID09ICdkdW1wJzoKKyAgICAgICAgZGIuZHVtcChzeXMuc3Rkb3V0KQorICAgIGVsaWYgbW9kZSA9PSdsaXN0JzoKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBhcmdzID0gZGIubGlzdG5hbWVzKCkKKyAgICAgICAgcHJpbnQgIiUtMjAuMjBzXHQlcyIgJSAoIlBhY2thZ2UiLCAiRGVzY3JpcHRpb24iKQorICAgICAgICBwcmludAorICAgICAgICBmb3IgcGtnbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgcGtnID0gZGIuZmluZChwa2duYW1lKQorICAgICAgICAgICAgaWYgcGtnOgorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcGtnLmRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICBwa2duYW1lID0gcGtnLmZ1bGxuYW1lKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnRXJyb3I6IG5vIHN1Y2ggcGFja2FnZScKKyAgICAgICAgICAgIHByaW50ICIlLTIwLjIwc1x0JXMiICUgKHBrZ25hbWUsIGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiXHRIb21lIHBhZ2U6XHQiLCBwa2cuaG9tZXBhZ2UoKQorICAgICAgICAgICAgICAgIHByaW50ICJcdERvd25sb2FkIFVSTDpcdCIsIHBrZy5kb3dubG9hZFVSTCgpCisgICAgZWxpZiBtb2RlID09J3N0YXR1cyc6CisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgYXJncyA9IGRiLmxpc3RuYW1lcygpCisgICAgICAgICAgICBwcmludCAiJS0yMC4yMHNcdCVzXHQlcyIgJSAoIlBhY2thZ2UiLCAiSW5zdGFsbGVkIiwgIk1lc3NhZ2UiKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgZm9yIHBrZ25hbWUgaW4gYXJnczoKKyAgICAgICAgICAgIHBrZyA9IGRiLmZpbmQocGtnbmFtZSkKKyAgICAgICAgICAgIGlmIHBrZzoKKyAgICAgICAgICAgICAgICBzdGF0dXMsIG1zZyA9IHBrZy5pbnN0YWxsZWQoKQorICAgICAgICAgICAgICAgIHBrZ25hbWUgPSBwa2cuZnVsbG5hbWUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZXJyb3InCisgICAgICAgICAgICAgICAgbXNnID0gJ05vIHN1Y2ggcGFja2FnZScKKyAgICAgICAgICAgIHByaW50ICIlLTIwLjIwc1x0JS05LjlzXHQlcyIgJSAocGtnbmFtZSwgc3RhdHVzLCBtc2cpCisgICAgICAgICAgICBpZiB2ZXJib3NlIGFuZCBzdGF0dXMgPT0gIm5vIjoKKyAgICAgICAgICAgICAgICBwcmVyZXEgPSBwa2cucHJlcmVxdWlzaXRlcygpCisgICAgICAgICAgICAgICAgZm9yIHBrZywgbXNnIGluIHByZXJlcToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHBrZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZyA9ICcnCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwa2cgPSBwa2cuZnVsbG5hbWUoKQorICAgICAgICAgICAgICAgICAgICBwcmludCAiJS0yMC4yMHNcdFJlcXVpcmVtZW50OiAlcyAlcyIgJSAoIiIsIHBrZywgbXNnKQorICAgIGVsaWYgbW9kZSA9PSAnaW5zdGFsbCc6CisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgcHJpbnQgJ1BsZWFzZSBzcGVjaWZ5IHBhY2thZ2VzIHRvIGluc3RhbGwnCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBpbnN0ID0gUGltcEluc3RhbGxlcihkYikKKyAgICAgICAgZm9yIHBrZ25hbWUgaW4gYXJnczoKKyAgICAgICAgICAgIHBrZyA9IGRiLmZpbmQocGtnbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBwa2c6CisgICAgICAgICAgICAgICAgcHJpbnQgJyVzOiBObyBzdWNoIHBhY2thZ2UnICUgcGtnbmFtZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsaXN0LCBtZXNzYWdlcyA9IGluc3QucHJlcGFyZUluc3RhbGwocGtnLCBmb3JjZSkKKyAgICAgICAgICAgIGlmIG1lc3NhZ2VzIGFuZCBub3QgZm9yY2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBOb3QgaW5zdGFsbGVkOiIgJSBwa2duYW1lCisgICAgICAgICAgICAgICAgZm9yIG0gaW4gbWVzc2FnZXM6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJcdCIsIG0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IE5vbmUKKyAgICAgICAgICAgICAgICBtZXNzYWdlcyA9IGluc3QuaW5zdGFsbChsaXN0LCBvdXRwdXQpCisgICAgICAgICAgICAgICAgaWYgbWVzc2FnZXM6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIlczogTm90IGluc3RhbGxlZDoiICUgcGtnbmFtZQorICAgICAgICAgICAgICAgICAgICBmb3IgbSBpbiBtZXNzYWdlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJcdCIsIG0KIAogZGVmIG1haW4oKToKLQkiIiJNaW5pbWFsIGNvbW1hbmRsaW5lIHRvb2wgdG8gZHJpdmUgcGltcC4iIiIKLQkKLQlpbXBvcnQgZ2V0b3B0Ci0JZGVmIF9oZWxwKCk6Ci0JCXByaW50ICJVc2FnZTogcGltcCBbLXZdIC1zIFtwYWNrYWdlIC4uLl0gIExpc3QgaW5zdGFsbGVkIHN0YXR1cyIKLQkJcHJpbnQgIiAgICAgICBwaW1wIFstdl0gLWwgW3BhY2thZ2UgLi4uXSAgU2hvdyBwYWNrYWdlIGluZm9ybWF0aW9uIgotCQlwcmludCAiICAgICAgIHBpbXAgWy12Zl0gLWkgcGFja2FnZSAuLi4gICBJbnN0YWxsIHBhY2thZ2VzIgotCQlwcmludCAiICAgICAgIHBpbXAgLWQgICAgICAgICAgICAgICAgICAgICBEdW1wIGRhdGFiYXNlIHRvIHN0ZG91dCIKLQkJcHJpbnQgIk9wdGlvbnM6IgotCQlwcmludCAiICAgICAgIC12ICBWZXJib3NlIgotCQlwcmludCAiICAgICAgIC1mICBGb3JjZSBpbnN0YWxsYXRpb24iCi0JCXN5cy5leGl0KDEpCi0JCQotCXRyeToKLQkJb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAic2xpZnZkIikKLQlleGNlcHQgZ2V0b3B0LkVycm9yOgotCQlfaGVscCgpCi0JaWYgbm90IG9wdHMgYW5kIG5vdCBhcmdzOgotCQlfaGVscCgpCi0JbW9kZSA9IE5vbmUKLQlmb3JjZSA9IDAKLQl2ZXJib3NlID0gMAotCWZvciBvLCBhIGluIG9wdHM6Ci0JCWlmIG8gPT0gJy1zJzoKLQkJCWlmIG1vZGU6Ci0JCQkJX2hlbHAoKQotCQkJbW9kZSA9ICdzdGF0dXMnCi0JCWlmIG8gPT0gJy1sJzoKLQkJCWlmIG1vZGU6Ci0JCQkJX2hlbHAoKQotCQkJbW9kZSA9ICdsaXN0JwotCQlpZiBvID09ICctZCc6Ci0JCQlpZiBtb2RlOgotCQkJCV9oZWxwKCkKLQkJCW1vZGUgPSAnZHVtcCcKLQkJaWYgbyA9PSAnLWknOgotCQkJbW9kZSA9ICdpbnN0YWxsJwotCQlpZiBvID09ICctZic6Ci0JCQlmb3JjZSA9IDEKLQkJaWYgbyA9PSAnLXYnOgotCQkJdmVyYm9zZSA9IDEKLQlpZiBub3QgbW9kZToKLQkJX2hlbHAoKQotCV9ydW4obW9kZSwgdmVyYm9zZSwgZm9yY2UsIGFyZ3MpCi0JCQkJCisgICAgIiIiTWluaW1hbCBjb21tYW5kbGluZSB0b29sIHRvIGRyaXZlIHBpbXAuIiIiCisgICAgCisgICAgaW1wb3J0IGdldG9wdAorICAgIGRlZiBfaGVscCgpOgorICAgICAgICBwcmludCAiVXNhZ2U6IHBpbXAgWy12XSAtcyBbcGFja2FnZSAuLi5dICBMaXN0IGluc3RhbGxlZCBzdGF0dXMiCisgICAgICAgIHByaW50ICIgICAgICAgcGltcCBbLXZdIC1sIFtwYWNrYWdlIC4uLl0gIFNob3cgcGFja2FnZSBpbmZvcm1hdGlvbiIKKyAgICAgICAgcHJpbnQgIiAgICAgICBwaW1wIFstdmZdIC1pIHBhY2thZ2UgLi4uICAgSW5zdGFsbCBwYWNrYWdlcyIKKyAgICAgICAgcHJpbnQgIiAgICAgICBwaW1wIC1kICAgICAgICAgICAgICAgICAgICAgRHVtcCBkYXRhYmFzZSB0byBzdGRvdXQiCisgICAgICAgIHByaW50ICJPcHRpb25zOiIKKyAgICAgICAgcHJpbnQgIiAgICAgICAtdiAgVmVyYm9zZSIKKyAgICAgICAgcHJpbnQgIiAgICAgICAtZiAgRm9yY2UgaW5zdGFsbGF0aW9uIgorICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgInNsaWZ2ZCIpCisgICAgZXhjZXB0IGdldG9wdC5FcnJvcjoKKyAgICAgICAgX2hlbHAoKQorICAgIGlmIG5vdCBvcHRzIGFuZCBub3QgYXJnczoKKyAgICAgICAgX2hlbHAoKQorICAgIG1vZGUgPSBOb25lCisgICAgZm9yY2UgPSAwCisgICAgdmVyYm9zZSA9IDAKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctcyc6CisgICAgICAgICAgICBpZiBtb2RlOgorICAgICAgICAgICAgICAgIF9oZWxwKCkKKyAgICAgICAgICAgIG1vZGUgPSAnc3RhdHVzJworICAgICAgICBpZiBvID09ICctbCc6CisgICAgICAgICAgICBpZiBtb2RlOgorICAgICAgICAgICAgICAgIF9oZWxwKCkKKyAgICAgICAgICAgIG1vZGUgPSAnbGlzdCcKKyAgICAgICAgaWYgbyA9PSAnLWQnOgorICAgICAgICAgICAgaWYgbW9kZToKKyAgICAgICAgICAgICAgICBfaGVscCgpCisgICAgICAgICAgICBtb2RlID0gJ2R1bXAnCisgICAgICAgIGlmIG8gPT0gJy1pJzoKKyAgICAgICAgICAgIG1vZGUgPSAnaW5zdGFsbCcKKyAgICAgICAgaWYgbyA9PSAnLWYnOgorICAgICAgICAgICAgZm9yY2UgPSAxCisgICAgICAgIGlmIG8gPT0gJy12JzoKKyAgICAgICAgICAgIHZlcmJvc2UgPSAxCisgICAgaWYgbm90IG1vZGU6CisgICAgICAgIF9oZWxwKCkKKyAgICBfcnVuKG1vZGUsIHZlcmJvc2UsIGZvcmNlLCBhcmdzKQorICAgICAgICAgICAgICAgIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKLQkKKyAgICBtYWluKCkKKyAgICAKKyAgICAKZGlmZiAtLWdpdCBhL0xpYi9wbGF0LW1hYy9wbGlzdGxpYi5weSBiL0xpYi9wbGF0LW1hYy9wbGlzdGxpYi5weQppbmRleCA5YzkxNGQyLi40MGUyNjc1IDEwMDY0NAotLS0gYS9MaWIvcGxhdC1tYWMvcGxpc3RsaWIucHkKKysrIGIvTGliL3BsYXQtbWFjL3BsaXN0bGliLnB5CkBAIC0zMywyOSArMzMsMjkgQEAKIAogR2VuZXJhdGUgUGxpc3QgZXhhbXBsZToKIAotCXBsID0gUGxpc3QoCi0JCWFTdHJpbmc9IkRvb2RhaCIsCi0JCWFMaXN0PVsiQSIsICJCIiwgMTIsIDMyLjEsIFsxLCAyLCAzXV0sCi0JCWFGbG9hdCA9IDAuMSwKLQkJYW5JbnQgPSA3MjgsCi0JCWFEaWN0PURpY3QoCi0JCQlhbm90aGVyU3RyaW5nPSI8aGVsbG8gJiBoaSB0aGVyZSE+IiwKLQkJCWFVbmljb2RlVmFsdWU9dSdNXHhlNHNzaWcsIE1hXHhkZicsCi0JCQlhVHJ1ZVZhbHVlPVRydWUsCi0JCQlhRmFsc2VWYWx1ZT1GYWxzZSwKLQkJKSwKLQkJc29tZURhdGEgPSBEYXRhKCI8YmluYXJ5IGd1bms+IiksCi0JCXNvbWVNb3JlRGF0YSA9IERhdGEoIjxsb3RzIG9mIGJpbmFyeSBndW5rPiIgKiAxMCksCi0JCWFEYXRlID0gRGF0ZSh0aW1lLm1rdGltZSh0aW1lLmdtdGltZSgpKSksCi0JKQotCSMgdW5pY29kZSBrZXlzIGFyZSBwb3NzaWJsZSwgYnV0IGEgbGl0dGxlIGF3a3dhcmQgdG8gdXNlOgotCXBsW3UnXHhjNWJlbnJhYSddID0gIlRoYXQgd2FzIGEgdW5pY29kZSBrZXkuIgotCXBsLndyaXRlKGZpbGVOYW1lKQorICAgIHBsID0gUGxpc3QoCisgICAgICAgIGFTdHJpbmc9IkRvb2RhaCIsCisgICAgICAgIGFMaXN0PVsiQSIsICJCIiwgMTIsIDMyLjEsIFsxLCAyLCAzXV0sCisgICAgICAgIGFGbG9hdCA9IDAuMSwKKyAgICAgICAgYW5JbnQgPSA3MjgsCisgICAgICAgIGFEaWN0PURpY3QoCisgICAgICAgICAgICBhbm90aGVyU3RyaW5nPSI8aGVsbG8gJiBoaSB0aGVyZSE+IiwKKyAgICAgICAgICAgIGFVbmljb2RlVmFsdWU9dSdNXHhlNHNzaWcsIE1hXHhkZicsCisgICAgICAgICAgICBhVHJ1ZVZhbHVlPVRydWUsCisgICAgICAgICAgICBhRmFsc2VWYWx1ZT1GYWxzZSwKKyAgICAgICAgKSwKKyAgICAgICAgc29tZURhdGEgPSBEYXRhKCI8YmluYXJ5IGd1bms+IiksCisgICAgICAgIHNvbWVNb3JlRGF0YSA9IERhdGEoIjxsb3RzIG9mIGJpbmFyeSBndW5rPiIgKiAxMCksCisgICAgICAgIGFEYXRlID0gRGF0ZSh0aW1lLm1rdGltZSh0aW1lLmdtdGltZSgpKSksCisgICAgKQorICAgICMgdW5pY29kZSBrZXlzIGFyZSBwb3NzaWJsZSwgYnV0IGEgbGl0dGxlIGF3a3dhcmQgdG8gdXNlOgorICAgIHBsW3UnXHhjNWJlbnJhYSddID0gIlRoYXQgd2FzIGEgdW5pY29kZSBrZXkuIgorICAgIHBsLndyaXRlKGZpbGVOYW1lKQogCiBQYXJzZSBQbGlzdCBleGFtcGxlOgogCi0JcGwgPSBQbGlzdC5mcm9tRmlsZShwYXRoT3JGaWxlKQotCXByaW50IHBsLmFLZXkKKyAgICBwbCA9IFBsaXN0LmZyb21GaWxlKHBhdGhPckZpbGUpCisgICAgcHJpbnQgcGwuYUtleQogCiAKICIiIgpAQCAtNzEsNDAgKzcxLDQwIEBACiAKIGNsYXNzIER1bWJYTUxXcml0ZXI6CiAKLQlkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6Ci0JCXNlbGYuZmlsZSA9IGZpbGUKLQkJc2VsZi5zdGFjayA9IFtdCi0JCXNlbGYuaW5kZW50TGV2ZWwgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmluZGVudExldmVsID0gMAogCi0JZGVmIGJlZ2luRWxlbWVudChzZWxmLCBlbGVtZW50KToKLQkJc2VsZi5zdGFjay5hcHBlbmQoZWxlbWVudCkKLQkJc2VsZi53cml0ZWxuKCI8JXM+IiAlIGVsZW1lbnQpCi0JCXNlbGYuaW5kZW50TGV2ZWwgKz0gMQorICAgIGRlZiBiZWdpbkVsZW1lbnQoc2VsZiwgZWxlbWVudCk6CisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKGVsZW1lbnQpCisgICAgICAgIHNlbGYud3JpdGVsbigiPCVzPiIgJSBlbGVtZW50KQorICAgICAgICBzZWxmLmluZGVudExldmVsICs9IDEKIAotCWRlZiBlbmRFbGVtZW50KHNlbGYsIGVsZW1lbnQpOgotCQlhc3NlcnQgc2VsZi5pbmRlbnRMZXZlbCA+IDAKLQkJYXNzZXJ0IHNlbGYuc3RhY2sucG9wKCkgPT0gZWxlbWVudAotCQlzZWxmLmluZGVudExldmVsIC09IDEKLQkJc2VsZi53cml0ZWxuKCI8LyVzPiIgJSBlbGVtZW50KQorICAgIGRlZiBlbmRFbGVtZW50KHNlbGYsIGVsZW1lbnQpOgorICAgICAgICBhc3NlcnQgc2VsZi5pbmRlbnRMZXZlbCA+IDAKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhY2sucG9wKCkgPT0gZWxlbWVudAorICAgICAgICBzZWxmLmluZGVudExldmVsIC09IDEKKyAgICAgICAgc2VsZi53cml0ZWxuKCI8LyVzPiIgJSBlbGVtZW50KQogCi0JZGVmIHNpbXBsZUVsZW1lbnQoc2VsZiwgZWxlbWVudCwgdmFsdWU9Tm9uZSk6Ci0JCWlmIHZhbHVlOgotCQkJdmFsdWUgPSBfZW5jb2RlKHZhbHVlKQotCQkJc2VsZi53cml0ZWxuKCI8JXM+JXM8LyVzPiIgJSAoZWxlbWVudCwgdmFsdWUsIGVsZW1lbnQpKQotCQllbHNlOgotCQkJc2VsZi53cml0ZWxuKCI8JXMvPiIgJSBlbGVtZW50KQorICAgIGRlZiBzaW1wbGVFbGVtZW50KHNlbGYsIGVsZW1lbnQsIHZhbHVlPU5vbmUpOgorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHZhbHVlID0gX2VuY29kZSh2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVsbigiPCVzPiVzPC8lcz4iICUgKGVsZW1lbnQsIHZhbHVlLCBlbGVtZW50KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVsbigiPCVzLz4iICUgZWxlbWVudCkKIAotCWRlZiB3cml0ZWxuKHNlbGYsIGxpbmUpOgotCQlpZiBsaW5lOgotCQkJc2VsZi5maWxlLndyaXRlKHNlbGYuaW5kZW50TGV2ZWwgKiBJTkRFTlQgKyBsaW5lICsgIlxuIikKLQkJZWxzZToKLQkJCXNlbGYuZmlsZS53cml0ZSgiXG4iKQorICAgIGRlZiB3cml0ZWxuKHNlbGYsIGxpbmUpOgorICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKHNlbGYuaW5kZW50TGV2ZWwgKiBJTkRFTlQgKyBsaW5lICsgIlxuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZSgiXG4iKQogCiAKIGRlZiBfZW5jb2RlKHRleHQpOgotCXRleHQgPSB0ZXh0LnJlcGxhY2UoIiYiLCAiJmFtcDsiKQotCXRleHQgPSB0ZXh0LnJlcGxhY2UoIjwiLCAiJmx0OyIpCi0JcmV0dXJuIHRleHQuZW5jb2RlKCJ1dGYtOCIpCisgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiJiIsICImYW1wOyIpCisgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiPCIsICImbHQ7IikKKyAgICByZXR1cm4gdGV4dC5lbmNvZGUoInV0Zi04IikKIAogCiBQTElTVEhFQURFUiA9ICIiIlwKQEAgLTExNCwzMjMgKzExNCwzMjMgQEAKIAogY2xhc3MgUGxpc3RXcml0ZXIoRHVtYlhNTFdyaXRlcik6CiAKLQlkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6Ci0JCWZpbGUud3JpdGUoUExJU1RIRUFERVIpCi0JCUR1bWJYTUxXcml0ZXIuX19pbml0X18oc2VsZiwgZmlsZSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CisgICAgICAgIGZpbGUud3JpdGUoUExJU1RIRUFERVIpCisgICAgICAgIER1bWJYTUxXcml0ZXIuX19pbml0X18oc2VsZiwgZmlsZSkKIAotCWRlZiB3cml0ZVZhbHVlKHNlbGYsIHZhbHVlKToKLQkJaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKHN0ciwgdW5pY29kZSkpOgotCQkJc2VsZi5zaW1wbGVFbGVtZW50KCJzdHJpbmciLCB2YWx1ZSkKLQkJZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBib29sKToKLQkJCSMgbXVzdCBzd2l0Y2ggZm9yIGJvb2wgYmVmb3JlIGludCwgYXMgYm9vbCBpcyBhCi0JCQkjIHN1YmNsYXNzIG9mIGludC4uLgotCQkJaWYgdmFsdWU6Ci0JCQkJc2VsZi5zaW1wbGVFbGVtZW50KCJ0cnVlIikKLQkJCWVsc2U6Ci0JCQkJc2VsZi5zaW1wbGVFbGVtZW50KCJmYWxzZSIpCi0JCWVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgaW50KToKLQkJCXNlbGYuc2ltcGxlRWxlbWVudCgiaW50ZWdlciIsIHN0cih2YWx1ZSkpCi0JCWVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZmxvYXQpOgotCQkJIyBzaG91bGQgcGVyaGFwcyB1c2UgcmVwcigpIGZvciBiZXR0ZXIgcHJlY2lzaW9uPwotCQkJc2VsZi5zaW1wbGVFbGVtZW50KCJyZWFsIiwgc3RyKHZhbHVlKSkKLQkJZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAoZGljdCwgRGljdCkpOgotCQkJc2VsZi53cml0ZURpY3QodmFsdWUpCi0JCWVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRGF0YSk6Ci0JCQlzZWxmLndyaXRlRGF0YSh2YWx1ZSkKLQkJZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBEYXRlKToKLQkJCXNlbGYuc2ltcGxlRWxlbWVudCgiZGF0ZSIsIHZhbHVlLnRvU3RyaW5nKCkpCi0JCWVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKHR1cGxlLCBsaXN0KSk6Ci0JCQlzZWxmLndyaXRlQXJyYXkodmFsdWUpCi0JCWVsc2U6Ci0JCQlhc3NlcnQgMCwgInVuc3Vwb3J0ZWQgdHlwZTogJXMiICUgdHlwZSh2YWx1ZSkKKyAgICBkZWYgd3JpdGVWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgic3RyaW5nIiwgdmFsdWUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CisgICAgICAgICAgICAjIG11c3Qgc3dpdGNoIGZvciBib29sIGJlZm9yZSBpbnQsIGFzIGJvb2wgaXMgYQorICAgICAgICAgICAgIyBzdWJjbGFzcyBvZiBpbnQuLi4KKyAgICAgICAgICAgIGlmIHZhbHVlOgorICAgICAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgidHJ1ZSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgiZmFsc2UiKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGludCk6CisgICAgICAgICAgICBzZWxmLnNpbXBsZUVsZW1lbnQoImludGVnZXIiLCBzdHIodmFsdWUpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICAgICAgICAgICMgc2hvdWxkIHBlcmhhcHMgdXNlIHJlcHIoKSBmb3IgYmV0dGVyIHByZWNpc2lvbj8KKyAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgicmVhbCIsIHN0cih2YWx1ZSkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGRpY3QsIERpY3QpKToKKyAgICAgICAgICAgIHNlbGYud3JpdGVEaWN0KHZhbHVlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIERhdGEpOgorICAgICAgICAgICAgc2VsZi53cml0ZURhdGEodmFsdWUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRGF0ZSk6CisgICAgICAgICAgICBzZWxmLnNpbXBsZUVsZW1lbnQoImRhdGUiLCB2YWx1ZS50b1N0cmluZygpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICAgICAgc2VsZi53cml0ZUFycmF5KHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IDAsICJ1bnN1cG9ydGVkIHR5cGU6ICVzIiAlIHR5cGUodmFsdWUpCiAKLQlkZWYgd3JpdGVEYXRhKHNlbGYsIGRhdGEpOgotCQlzZWxmLmJlZ2luRWxlbWVudCgiZGF0YSIpCi0JCWZvciBsaW5lIGluIGRhdGEuYXNCYXNlNjQoKS5zcGxpdCgiXG4iKToKLQkJCWlmIGxpbmU6Ci0JCQkJc2VsZi53cml0ZWxuKGxpbmUpCi0JCXNlbGYuZW5kRWxlbWVudCgiZGF0YSIpCisgICAgZGVmIHdyaXRlRGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5iZWdpbkVsZW1lbnQoImRhdGEiKQorICAgICAgICBmb3IgbGluZSBpbiBkYXRhLmFzQmFzZTY0KCkuc3BsaXQoIlxuIik6CisgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVsbihsaW5lKQorICAgICAgICBzZWxmLmVuZEVsZW1lbnQoImRhdGEiKQogCi0JZGVmIHdyaXRlRGljdChzZWxmLCBkKToKLQkJc2VsZi5iZWdpbkVsZW1lbnQoImRpY3QiKQotCQlpdGVtcyA9IGQuaXRlbXMoKQotCQlpdGVtcy5zb3J0KCkKLQkJZm9yIGtleSwgdmFsdWUgaW4gaXRlbXM6Ci0JCQlhc3NlcnQgaXNpbnN0YW5jZShrZXksIChzdHIsIHVuaWNvZGUpKSwgImtleXMgbXVzdCBiZSBzdHJpbmdzIgotCQkJc2VsZi5zaW1wbGVFbGVtZW50KCJrZXkiLCBrZXkpCi0JCQlzZWxmLndyaXRlVmFsdWUodmFsdWUpCi0JCXNlbGYuZW5kRWxlbWVudCgiZGljdCIpCisgICAgZGVmIHdyaXRlRGljdChzZWxmLCBkKToKKyAgICAgICAgc2VsZi5iZWdpbkVsZW1lbnQoImRpY3QiKQorICAgICAgICBpdGVtcyA9IGQuaXRlbXMoKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gaXRlbXM6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShrZXksIChzdHIsIHVuaWNvZGUpKSwgImtleXMgbXVzdCBiZSBzdHJpbmdzIgorICAgICAgICAgICAgc2VsZi5zaW1wbGVFbGVtZW50KCJrZXkiLCBrZXkpCisgICAgICAgICAgICBzZWxmLndyaXRlVmFsdWUodmFsdWUpCisgICAgICAgIHNlbGYuZW5kRWxlbWVudCgiZGljdCIpCiAKLQlkZWYgd3JpdGVBcnJheShzZWxmLCBhcnJheSk6Ci0JCXNlbGYuYmVnaW5FbGVtZW50KCJhcnJheSIpCi0JCWZvciB2YWx1ZSBpbiBhcnJheToKLQkJCXNlbGYud3JpdGVWYWx1ZSh2YWx1ZSkKLQkJc2VsZi5lbmRFbGVtZW50KCJhcnJheSIpCisgICAgZGVmIHdyaXRlQXJyYXkoc2VsZiwgYXJyYXkpOgorICAgICAgICBzZWxmLmJlZ2luRWxlbWVudCgiYXJyYXkiKQorICAgICAgICBmb3IgdmFsdWUgaW4gYXJyYXk6CisgICAgICAgICAgICBzZWxmLndyaXRlVmFsdWUodmFsdWUpCisgICAgICAgIHNlbGYuZW5kRWxlbWVudCgiYXJyYXkiKQogCiAKIGNsYXNzIERpY3Q6CiAKLQkiIiJEaWN0IHdyYXBwZXIgZm9yIGNvbnZlbmllbnQgYWNjZXNzIG9mIHZhbHVlcyB0aHJvdWdoIGF0dHJpYnV0ZXMuIiIiCisgICAgIiIiRGljdCB3cmFwcGVyIGZvciBjb252ZW5pZW50IGFjY2VzcyBvZiB2YWx1ZXMgdGhyb3VnaCBhdHRyaWJ1dGVzLiIiIgogCi0JZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKLQkJc2VsZi5fX2RpY3RfXy51cGRhdGUoa3dhcmdzKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGt3YXJncykKIAotCWRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKLQkJaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgotCQkJcmV0dXJuIGNtcChzZWxmLl9fZGljdF9fLCBvdGhlci5fX2RpY3RfXykKLQkJZWxpZiBpc2luc3RhbmNlKG90aGVyLCBkaWN0KToKLQkJCXJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIpCi0JCWVsc2U6Ci0JCQlyZXR1cm4gY21wKGlkKHNlbGYpLCBpZChvdGhlcikpCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuX19kaWN0X18sIG90aGVyLl9fZGljdF9fKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGRpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLl9fZGljdF9fLCBvdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKIAotCWRlZiBfX3N0cl9fKHNlbGYpOgotCQlyZXR1cm4gIiVzKCoqJXMpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fX2RpY3RfXykKLQlfX3JlcHJfXyA9IF9fc3RyX18KKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcygqKiVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX19kaWN0X18pCisgICAgX19yZXByX18gPSBfX3N0cl9fCiAKLQlkZWYgY29weShzZWxmKToKLQkJcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqc2VsZi5fX2RpY3RfXykKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqc2VsZi5fX2RpY3RfXykKIAotCWRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKLQkJIiIiRGVsZWdhdGUgZXZlcnl0aGluZyBlbHNlIHRvIHRoZSBkaWN0IG9iamVjdC4iIiIKLQkJcmV0dXJuIGdldGF0dHIoc2VsZi5fX2RpY3RfXywgYXR0cikKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgICIiIkRlbGVnYXRlIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUgZGljdCBvYmplY3QuIiIiCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX19kaWN0X18sIGF0dHIpCiAKIAogY2xhc3MgUGxpc3QoRGljdCk6CiAKLQkiIiJUaGUgbWFpbiBQbGlzdCBvYmplY3QuIEJhc2ljYWxseSBhIGRpY3QgKHRoZSB0b3BsZXZlbCBvYmplY3QKLQlvZiBhIHBsaXN0IGlzIGEgZGljdCkgd2l0aCB0d28gYWRkaXRpb25hbCBtZXRob2RzIHRvIHJlYWQgZnJvbQotCWFuZCB3cml0ZSB0byBmaWxlcy4KLQkiIiIKKyAgICAiIiJUaGUgbWFpbiBQbGlzdCBvYmplY3QuIEJhc2ljYWxseSBhIGRpY3QgKHRoZSB0b3BsZXZlbCBvYmplY3QKKyAgICBvZiBhIHBsaXN0IGlzIGEgZGljdCkgd2l0aCB0d28gYWRkaXRpb25hbCBtZXRob2RzIHRvIHJlYWQgZnJvbQorICAgIGFuZCB3cml0ZSB0byBmaWxlcy4KKyAgICAiIiIKIAotCWRlZiBmcm9tRmlsZShjbHMsIHBhdGhPckZpbGUpOgotCQlkaWRPcGVuID0gMAotCQlpZiBub3QgaGFzYXR0cihwYXRoT3JGaWxlLCAid3JpdGUiKToKLQkJCXBhdGhPckZpbGUgPSBvcGVuKHBhdGhPckZpbGUpCi0JCQlkaWRPcGVuID0gMQotCQlwID0gUGxpc3RQYXJzZXIoKQotCQlwbGlzdCA9IHAucGFyc2UocGF0aE9yRmlsZSkKLQkJaWYgZGlkT3BlbjoKLQkJCXBhdGhPckZpbGUuY2xvc2UoKQotCQlyZXR1cm4gcGxpc3QKLQlmcm9tRmlsZSA9IGNsYXNzbWV0aG9kKGZyb21GaWxlKQorICAgIGRlZiBmcm9tRmlsZShjbHMsIHBhdGhPckZpbGUpOgorICAgICAgICBkaWRPcGVuID0gMAorICAgICAgICBpZiBub3QgaGFzYXR0cihwYXRoT3JGaWxlLCAid3JpdGUiKToKKyAgICAgICAgICAgIHBhdGhPckZpbGUgPSBvcGVuKHBhdGhPckZpbGUpCisgICAgICAgICAgICBkaWRPcGVuID0gMQorICAgICAgICBwID0gUGxpc3RQYXJzZXIoKQorICAgICAgICBwbGlzdCA9IHAucGFyc2UocGF0aE9yRmlsZSkKKyAgICAgICAgaWYgZGlkT3BlbjoKKyAgICAgICAgICAgIHBhdGhPckZpbGUuY2xvc2UoKQorICAgICAgICByZXR1cm4gcGxpc3QKKyAgICBmcm9tRmlsZSA9IGNsYXNzbWV0aG9kKGZyb21GaWxlKQogCi0JZGVmIHdyaXRlKHNlbGYsIHBhdGhPckZpbGUpOgotCQlpZiBub3QgaGFzYXR0cihwYXRoT3JGaWxlLCAid3JpdGUiKToKLQkJCXBhdGhPckZpbGUgPSBvcGVuKHBhdGhPckZpbGUsICJ3IikKLQkJCWRpZE9wZW4gPSAxCi0JCWVsc2U6Ci0JCQlkaWRPcGVuID0gMAorICAgIGRlZiB3cml0ZShzZWxmLCBwYXRoT3JGaWxlKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIocGF0aE9yRmlsZSwgIndyaXRlIik6CisgICAgICAgICAgICBwYXRoT3JGaWxlID0gb3BlbihwYXRoT3JGaWxlLCAidyIpCisgICAgICAgICAgICBkaWRPcGVuID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlkT3BlbiA9IDAKIAotCQl3cml0ZXIgPSBQbGlzdFdyaXRlcihwYXRoT3JGaWxlKQotCQl3cml0ZXIud3JpdGVsbigiPHBsaXN0IHZlcnNpb249XCIxLjBcIj4iKQotCQl3cml0ZXIud3JpdGVEaWN0KHNlbGYuX19kaWN0X18pCi0JCXdyaXRlci53cml0ZWxuKCI8L3BsaXN0PiIpCisgICAgICAgIHdyaXRlciA9IFBsaXN0V3JpdGVyKHBhdGhPckZpbGUpCisgICAgICAgIHdyaXRlci53cml0ZWxuKCI8cGxpc3QgdmVyc2lvbj1cIjEuMFwiPiIpCisgICAgICAgIHdyaXRlci53cml0ZURpY3Qoc2VsZi5fX2RpY3RfXykKKyAgICAgICAgd3JpdGVyLndyaXRlbG4oIjwvcGxpc3Q+IikKIAotCQlpZiBkaWRPcGVuOgotCQkJcGF0aE9yRmlsZS5jbG9zZSgpCisgICAgICAgIGlmIGRpZE9wZW46CisgICAgICAgICAgICBwYXRoT3JGaWxlLmNsb3NlKCkKIAogCiBjbGFzcyBEYXRhOgogCi0JIiIiV3JhcHBlciBmb3IgYmluYXJ5IGRhdGEuIiIiCisgICAgIiIiV3JhcHBlciBmb3IgYmluYXJ5IGRhdGEuIiIiCiAKLQlkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6Ci0JCXNlbGYuZGF0YSA9IGRhdGEKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKIAotCWRlZiBmcm9tQmFzZTY0KGNscywgZGF0YSk6Ci0JCWltcG9ydCBiYXNlNjQKLQkJcmV0dXJuIGNscyhiYXNlNjQuZGVjb2Rlc3RyaW5nKGRhdGEpKQotCWZyb21CYXNlNjQgPSBjbGFzc21ldGhvZChmcm9tQmFzZTY0KQorICAgIGRlZiBmcm9tQmFzZTY0KGNscywgZGF0YSk6CisgICAgICAgIGltcG9ydCBiYXNlNjQKKyAgICAgICAgcmV0dXJuIGNscyhiYXNlNjQuZGVjb2Rlc3RyaW5nKGRhdGEpKQorICAgIGZyb21CYXNlNjQgPSBjbGFzc21ldGhvZChmcm9tQmFzZTY0KQogCi0JZGVmIGFzQmFzZTY0KHNlbGYpOgotCQlpbXBvcnQgYmFzZTY0Ci0JCXJldHVybiBiYXNlNjQuZW5jb2Rlc3RyaW5nKHNlbGYuZGF0YSkKKyAgICBkZWYgYXNCYXNlNjQoc2VsZik6CisgICAgICAgIGltcG9ydCBiYXNlNjQKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5lbmNvZGVzdHJpbmcoc2VsZi5kYXRhKQogCi0JZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotCQlpZiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0JCQlyZXR1cm4gY21wKHNlbGYuZGF0YSwgb3RoZXIuZGF0YSkKLQkJZWxpZiBpc2luc3RhbmNlKG90aGVyLCBzdHIpOgotCQkJcmV0dXJuIGNtcChzZWxmLmRhdGEsIG90aGVyKQotCQllbHNlOgotCQkJcmV0dXJuIGNtcChpZChzZWxmKSwgaWQob3RoZXIpKQorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmRhdGEsIG90aGVyLmRhdGEpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBvdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKIAotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICIlcyglcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCByZXByKHNlbGYuZGF0YSkpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHJlcHIoc2VsZi5kYXRhKSkKIAogCiBjbGFzcyBEYXRlOgogCi0JIiIiUHJpbWl0aXZlIGRhdGUgd3JhcHBlciwgdXNlcyB0aW1lIGZsb2F0cyBpbnRlcm5hbGx5LCBpcyBhZ25vc3RpYwotCWFib3V0IHRpbWUgem9uZXMuCi0JIiIiCisgICAgIiIiUHJpbWl0aXZlIGRhdGUgd3JhcHBlciwgdXNlcyB0aW1lIGZsb2F0cyBpbnRlcm5hbGx5LCBpcyBhZ25vc3RpYworICAgIGFib3V0IHRpbWUgem9uZXMuCisgICAgIiIiCiAKLQlkZWYgX19pbml0X18oc2VsZiwgZGF0ZSk6Ci0JCWlmIGlzaW5zdGFuY2UoZGF0ZSwgc3RyKToKLQkJCWZyb20geG1sLnV0aWxzLmlzbzg2MDEgaW1wb3J0IHBhcnNlCi0JCQlkYXRlID0gcGFyc2UoZGF0ZSkKLQkJc2VsZi5kYXRlID0gZGF0ZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRlLCBzdHIpOgorICAgICAgICAgICAgZnJvbSB4bWwudXRpbHMuaXNvODYwMSBpbXBvcnQgcGFyc2UKKyAgICAgICAgICAgIGRhdGUgPSBwYXJzZShkYXRlKQorICAgICAgICBzZWxmLmRhdGUgPSBkYXRlCiAKLQlkZWYgdG9TdHJpbmcoc2VsZik6Ci0JCWZyb20geG1sLnV0aWxzLmlzbzg2MDEgaW1wb3J0IHRvc3RyaW5nCi0JCXJldHVybiB0b3N0cmluZyhzZWxmLmRhdGUpCisgICAgZGVmIHRvU3RyaW5nKHNlbGYpOgorICAgICAgICBmcm9tIHhtbC51dGlscy5pc284NjAxIGltcG9ydCB0b3N0cmluZworICAgICAgICByZXR1cm4gdG9zdHJpbmcoc2VsZi5kYXRlKQogCi0JZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotCQlpZiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0JCQlyZXR1cm4gY21wKHNlbGYuZGF0ZSwgb3RoZXIuZGF0ZSkKLQkJZWxpZiBpc2luc3RhbmNlKG90aGVyLCAoaW50LCBmbG9hdCkpOgotCQkJcmV0dXJuIGNtcChzZWxmLmRhdGUsIG90aGVyKQotCQllbHNlOgotCQkJcmV0dXJuIGNtcChpZChzZWxmKSwgaWQob3RoZXIpKQorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmRhdGUsIG90aGVyLmRhdGUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgKGludCwgZmxvYXQpKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRlLCBvdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKIAotCWRlZiBfX3JlcHJfXyhzZWxmKToKLQkJcmV0dXJuICIlcyglcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCByZXByKHNlbGYudG9TdHJpbmcoKSkpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHJlcHIoc2VsZi50b1N0cmluZygpKSkKIAogCiBjbGFzcyBQbGlzdFBhcnNlcjoKIAotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJc2VsZi5zdGFjayA9IFtdCi0JCXNlbGYuY3VycmVudEtleSA9IE5vbmUKLQkJc2VsZi5yb290ID0gTm9uZQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYuY3VycmVudEtleSA9IE5vbmUKKyAgICAgICAgc2VsZi5yb290ID0gTm9uZQogCi0JZGVmIHBhcnNlKHNlbGYsIGZpbGUpOgotCQlmcm9tIHhtbC5wYXJzZXJzLmV4cGF0IGltcG9ydCBQYXJzZXJDcmVhdGUKLQkJcGFyc2VyID0gUGFyc2VyQ3JlYXRlKCkKLQkJcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLmhhbmRsZUJlZ2luRWxlbWVudAotCQlwYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBzZWxmLmhhbmRsZUVuZEVsZW1lbnQKLQkJcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gc2VsZi5oYW5kbGVEYXRhCi0JCXBhcnNlci5QYXJzZUZpbGUoZmlsZSkKLQkJcmV0dXJuIHNlbGYucm9vdAorICAgIGRlZiBwYXJzZShzZWxmLCBmaWxlKToKKyAgICAgICAgZnJvbSB4bWwucGFyc2Vycy5leHBhdCBpbXBvcnQgUGFyc2VyQ3JlYXRlCisgICAgICAgIHBhcnNlciA9IFBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5oYW5kbGVCZWdpbkVsZW1lbnQKKyAgICAgICAgcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5oYW5kbGVFbmRFbGVtZW50CisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuaGFuZGxlRGF0YQorICAgICAgICBwYXJzZXIuUGFyc2VGaWxlKGZpbGUpCisgICAgICAgIHJldHVybiBzZWxmLnJvb3QKIAotCWRlZiBoYW5kbGVCZWdpbkVsZW1lbnQoc2VsZiwgZWxlbWVudCwgYXR0cnMpOgotCQlzZWxmLmRhdGEgPSBbXQotCQloYW5kbGVyID0gZ2V0YXR0cihzZWxmLCAiYmVnaW5fIiArIGVsZW1lbnQsIE5vbmUpCi0JCWlmIGhhbmRsZXIgaXMgbm90IE5vbmU6Ci0JCQloYW5kbGVyKGF0dHJzKQorICAgIGRlZiBoYW5kbGVCZWdpbkVsZW1lbnQoc2VsZiwgZWxlbWVudCwgYXR0cnMpOgorICAgICAgICBzZWxmLmRhdGEgPSBbXQorICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCAiYmVnaW5fIiArIGVsZW1lbnQsIE5vbmUpCisgICAgICAgIGlmIGhhbmRsZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBoYW5kbGVyKGF0dHJzKQogCi0JZGVmIGhhbmRsZUVuZEVsZW1lbnQoc2VsZiwgZWxlbWVudCk6Ci0JCWhhbmRsZXIgPSBnZXRhdHRyKHNlbGYsICJlbmRfIiArIGVsZW1lbnQsIE5vbmUpCi0JCWlmIGhhbmRsZXIgaXMgbm90IE5vbmU6Ci0JCQloYW5kbGVyKCkKKyAgICBkZWYgaGFuZGxlRW5kRWxlbWVudChzZWxmLCBlbGVtZW50KToKKyAgICAgICAgaGFuZGxlciA9IGdldGF0dHIoc2VsZiwgImVuZF8iICsgZWxlbWVudCwgTm9uZSkKKyAgICAgICAgaWYgaGFuZGxlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGhhbmRsZXIoKQogCi0JZGVmIGhhbmRsZURhdGEoc2VsZiwgZGF0YSk6Ci0JCXNlbGYuZGF0YS5hcHBlbmQoZGF0YSkKKyAgICBkZWYgaGFuZGxlRGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhLmFwcGVuZChkYXRhKQogCi0JZGVmIGFkZE9iamVjdChzZWxmLCB2YWx1ZSk6Ci0JCWlmIHNlbGYuY3VycmVudEtleSBpcyBub3QgTm9uZToKLQkJCXNlbGYuc3RhY2tbLTFdW3NlbGYuY3VycmVudEtleV0gPSB2YWx1ZQotCQkJc2VsZi5jdXJyZW50S2V5ID0gTm9uZQotCQllbGlmIG5vdCBzZWxmLnN0YWNrOgotCQkJIyB0aGlzIGlzIHRoZSByb290IG9iamVjdAotCQkJYXNzZXJ0IHNlbGYucm9vdCBpcyB2YWx1ZQotCQllbHNlOgotCQkJc2VsZi5zdGFja1stMV0uYXBwZW5kKHZhbHVlKQorICAgIGRlZiBhZGRPYmplY3Qoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRLZXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnN0YWNrWy0xXVtzZWxmLmN1cnJlbnRLZXldID0gdmFsdWUKKyAgICAgICAgICAgIHNlbGYuY3VycmVudEtleSA9IE5vbmUKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5zdGFjazoKKyAgICAgICAgICAgICMgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3QKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnJvb3QgaXMgdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhY2tbLTFdLmFwcGVuZCh2YWx1ZSkKIAotCWRlZiBnZXREYXRhKHNlbGYpOgotCQlkYXRhID0gIiIuam9pbihzZWxmLmRhdGEpCi0JCXRyeToKLQkJCWRhdGEgPSBkYXRhLmVuY29kZSgiYXNjaWkiKQotCQlleGNlcHQgVW5pY29kZUVycm9yOgotCQkJcGFzcwotCQlzZWxmLmRhdGEgPSBbXQotCQlyZXR1cm4gZGF0YQorICAgIGRlZiBnZXREYXRhKHNlbGYpOgorICAgICAgICBkYXRhID0gIiIuam9pbihzZWxmLmRhdGEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgiYXNjaWkiKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmRhdGEgPSBbXQorICAgICAgICByZXR1cm4gZGF0YQogCi0JIyBlbGVtZW50IGhhbmRsZXJzCisgICAgIyBlbGVtZW50IGhhbmRsZXJzCiAKLQlkZWYgYmVnaW5fZGljdChzZWxmLCBhdHRycyk6Ci0JCWlmIHNlbGYucm9vdCBpcyBOb25lOgotCQkJc2VsZi5yb290ID0gZCA9IFBsaXN0KCkKLQkJZWxzZToKLQkJCWQgPSBEaWN0KCkKLQkJc2VsZi5hZGRPYmplY3QoZCkKLQkJc2VsZi5zdGFjay5hcHBlbmQoZCkKLQlkZWYgZW5kX2RpY3Qoc2VsZik6Ci0JCXNlbGYuc3RhY2sucG9wKCkKKyAgICBkZWYgYmVnaW5fZGljdChzZWxmLCBhdHRycyk6CisgICAgICAgIGlmIHNlbGYucm9vdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5yb290ID0gZCA9IFBsaXN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGQgPSBEaWN0KCkKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoZCkKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoZCkKKyAgICBkZWYgZW5kX2RpY3Qoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2sucG9wKCkKIAotCWRlZiBlbmRfa2V5KHNlbGYpOgotCQlzZWxmLmN1cnJlbnRLZXkgPSBzZWxmLmdldERhdGEoKQorICAgIGRlZiBlbmRfa2V5KHNlbGYpOgorICAgICAgICBzZWxmLmN1cnJlbnRLZXkgPSBzZWxmLmdldERhdGEoKQogCi0JZGVmIGJlZ2luX2FycmF5KHNlbGYsIGF0dHJzKToKLQkJYSA9IFtdCi0JCXNlbGYuYWRkT2JqZWN0KGEpCi0JCXNlbGYuc3RhY2suYXBwZW5kKGEpCi0JZGVmIGVuZF9hcnJheShzZWxmKToKLQkJc2VsZi5zdGFjay5wb3AoKQorICAgIGRlZiBiZWdpbl9hcnJheShzZWxmLCBhdHRycyk6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLmFkZE9iamVjdChhKQorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZChhKQorICAgIGRlZiBlbmRfYXJyYXkoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2sucG9wKCkKIAotCWRlZiBlbmRfdHJ1ZShzZWxmKToKLQkJc2VsZi5hZGRPYmplY3QoVHJ1ZSkKLQlkZWYgZW5kX2ZhbHNlKHNlbGYpOgotCQlzZWxmLmFkZE9iamVjdChGYWxzZSkKLQlkZWYgZW5kX2ludGVnZXIoc2VsZik6Ci0JCXNlbGYuYWRkT2JqZWN0KGludChzZWxmLmdldERhdGEoKSkpCi0JZGVmIGVuZF9yZWFsKHNlbGYpOgotCQlzZWxmLmFkZE9iamVjdChmbG9hdChzZWxmLmdldERhdGEoKSkpCi0JZGVmIGVuZF9zdHJpbmcoc2VsZik6Ci0JCXNlbGYuYWRkT2JqZWN0KHNlbGYuZ2V0RGF0YSgpKQotCWRlZiBlbmRfZGF0YShzZWxmKToKLQkJc2VsZi5hZGRPYmplY3QoRGF0YS5mcm9tQmFzZTY0KHNlbGYuZ2V0RGF0YSgpKSkKLQlkZWYgZW5kX2RhdGUoc2VsZik6Ci0JCXNlbGYuYWRkT2JqZWN0KERhdGUoc2VsZi5nZXREYXRhKCkpKQorICAgIGRlZiBlbmRfdHJ1ZShzZWxmKToKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoVHJ1ZSkKKyAgICBkZWYgZW5kX2ZhbHNlKHNlbGYpOgorICAgICAgICBzZWxmLmFkZE9iamVjdChGYWxzZSkKKyAgICBkZWYgZW5kX2ludGVnZXIoc2VsZik6CisgICAgICAgIHNlbGYuYWRkT2JqZWN0KGludChzZWxmLmdldERhdGEoKSkpCisgICAgZGVmIGVuZF9yZWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFkZE9iamVjdChmbG9hdChzZWxmLmdldERhdGEoKSkpCisgICAgZGVmIGVuZF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYWRkT2JqZWN0KHNlbGYuZ2V0RGF0YSgpKQorICAgIGRlZiBlbmRfZGF0YShzZWxmKToKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoRGF0YS5mcm9tQmFzZTY0KHNlbGYuZ2V0RGF0YSgpKSkKKyAgICBkZWYgZW5kX2RhdGUoc2VsZik6CisgICAgICAgIHNlbGYuYWRkT2JqZWN0KERhdGUoc2VsZi5nZXREYXRhKCkpKQogCiAKICMgY3J1ZnQgdG8gc3VwcG9ydCBib29sZWFucyBpbiBQeXRob24gPD0gMi4zCiBpbXBvcnQgc3lzCiBpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA8ICgyLCAzKToKLQkjIFB5dGhvbiAyLjIgYW5kIGVhcmxpZXI6IG5vIGJvb2xlYW5zCi0JIyBQeXRob24gMi4yLng6IGJvb2xlYW5zIGFyZSBpbnRzCi0JY2xhc3MgYm9vbChpbnQpOgotCQkiIiJJbWl0YXRpb24gb2YgdGhlIFB5dGhvbiAyLjMgYm9vbCBvYmplY3QuIiIiCi0JCWRlZiBfX25ld19fKGNscywgdmFsdWUpOgotCQkJcmV0dXJuIGludC5fX25ld19fKGNscywgbm90IG5vdCB2YWx1ZSkKLQkJZGVmIF9fcmVwcl9fKHNlbGYpOgotCQkJaWYgc2VsZjoKLQkJCQlyZXR1cm4gIlRydWUiCi0JCQllbHNlOgotCQkJCXJldHVybiAiRmFsc2UiCi0JVHJ1ZSA9IGJvb2woMSkKLQlGYWxzZSA9IGJvb2woMCkKKyAgICAjIFB5dGhvbiAyLjIgYW5kIGVhcmxpZXI6IG5vIGJvb2xlYW5zCisgICAgIyBQeXRob24gMi4yLng6IGJvb2xlYW5zIGFyZSBpbnRzCisgICAgY2xhc3MgYm9vbChpbnQpOgorICAgICAgICAiIiJJbWl0YXRpb24gb2YgdGhlIFB5dGhvbiAyLjMgYm9vbCBvYmplY3QuIiIiCisgICAgICAgIGRlZiBfX25ld19fKGNscywgdmFsdWUpOgorICAgICAgICAgICAgcmV0dXJuIGludC5fX25ld19fKGNscywgbm90IG5vdCB2YWx1ZSkKKyAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRydWUiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAiRmFsc2UiCisgICAgVHJ1ZSA9IGJvb2woMSkKKyAgICBGYWxzZSA9IGJvb2woMCkKIGVsc2U6Ci0JIyBCaW5kIHRoZSBib29sZWFuIGJ1aWx0aW5zIHRvIGxvY2FsIG5hbWVzCi0JVHJ1ZSA9IFRydWUKLQlGYWxzZSA9IEZhbHNlCi0JYm9vbCA9IGJvb2wKKyAgICAjIEJpbmQgdGhlIGJvb2xlYW4gYnVpbHRpbnMgdG8gbG9jYWwgbmFtZXMKKyAgICBUcnVlID0gVHJ1ZQorICAgIEZhbHNlID0gRmFsc2UKKyAgICBib29sID0gYm9vbAogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLQlpbXBvcnQgdGltZQotCWlmIGxlbihzeXMuYXJndikgPT0gMToKLQkJcGwgPSBQbGlzdCgKLQkJCWFTdHJpbmc9IkRvb2RhaCIsCi0JCQlhTGlzdD1bIkEiLCAiQiIsIDEyLCAzMi4xLCBbMSwgMiwgM11dLAotCQkJYUZsb2F0ID0gMC4xLAotCQkJYW5JbnQgPSA3MjgsCi0JCQlhRGljdD1EaWN0KAotCQkJCWFub3RoZXJTdHJpbmc9IjxoZWxsbyAmIGhpIHRoZXJlIT4iLAotCQkJCWFVbmljb2RlVmFsdWU9dSdNXHhlNHNzaWcsIE1hXHhkZicsCi0JCQkJYVRydWVWYWx1ZT1UcnVlLAotCQkJCWFGYWxzZVZhbHVlPUZhbHNlLAotCQkJKSwKLQkJCXNvbWVEYXRhID0gRGF0YSgiPGJpbmFyeSBndW5rPiIpLAotCQkJc29tZU1vcmVEYXRhID0gRGF0YSgiPGxvdHMgb2YgYmluYXJ5IGd1bms+IiAqIDEwKSwKLQkJCWFEYXRlID0gRGF0ZSh0aW1lLm1rdGltZSh0aW1lLmdtdGltZSgpKSksCi0JCSkKLQllbGlmIGxlbihzeXMuYXJndikgPT0gMjoKLQkJcGwgPSBQbGlzdC5mcm9tRmlsZShzeXMuYXJndlsxXSkKLQllbHNlOgotCQlwcmludCAiVG9vIG1hbnkgYXJndW1lbnRzOiBhdCBtb3N0IDEgcGxpc3QgZmlsZSBjYW4gYmUgZ2l2ZW4uIgotCQlzeXMuZXhpdCgxKQorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgaW1wb3J0IHRpbWUKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDE6CisgICAgICAgIHBsID0gUGxpc3QoCisgICAgICAgICAgICBhU3RyaW5nPSJEb29kYWgiLAorICAgICAgICAgICAgYUxpc3Q9WyJBIiwgIkIiLCAxMiwgMzIuMSwgWzEsIDIsIDNdXSwKKyAgICAgICAgICAgIGFGbG9hdCA9IDAuMSwKKyAgICAgICAgICAgIGFuSW50ID0gNzI4LAorICAgICAgICAgICAgYURpY3Q9RGljdCgKKyAgICAgICAgICAgICAgICBhbm90aGVyU3RyaW5nPSI8aGVsbG8gJiBoaSB0aGVyZSE+IiwKKyAgICAgICAgICAgICAgICBhVW5pY29kZVZhbHVlPXUnTVx4ZTRzc2lnLCBNYVx4ZGYnLAorICAgICAgICAgICAgICAgIGFUcnVlVmFsdWU9VHJ1ZSwKKyAgICAgICAgICAgICAgICBhRmFsc2VWYWx1ZT1GYWxzZSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBzb21lRGF0YSA9IERhdGEoIjxiaW5hcnkgZ3Vuaz4iKSwKKyAgICAgICAgICAgIHNvbWVNb3JlRGF0YSA9IERhdGEoIjxsb3RzIG9mIGJpbmFyeSBndW5rPiIgKiAxMCksCisgICAgICAgICAgICBhRGF0ZSA9IERhdGUodGltZS5ta3RpbWUodGltZS5nbXRpbWUoKSkpLAorICAgICAgICApCisgICAgZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6CisgICAgICAgIHBsID0gUGxpc3QuZnJvbUZpbGUoc3lzLmFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgIlRvbyBtYW55IGFyZ3VtZW50czogYXQgbW9zdCAxIHBsaXN0IGZpbGUgY2FuIGJlIGdpdmVuLiIKKyAgICAgICAgc3lzLmV4aXQoMSkKIAotCSMgdW5pY29kZSBrZXlzIGFyZSBwb3NzaWJsZSwgYnV0IGEgbGl0dGxlIGF3a3dhcmQgdG8gdXNlOgotCXBsW3UnXHhjNWJlbnJhYSddID0gIlRoYXQgd2FzIGEgdW5pY29kZSBrZXkuIgotCWYgPSBTdHJpbmdJTygpCi0JcGwud3JpdGUoZikKLQl4bWwgPSBmLmdldHZhbHVlKCkKLQlwcmludCB4bWwKLQlmLnNlZWsoMCkKLQlwbDIgPSBQbGlzdC5mcm9tRmlsZShmKQotCWFzc2VydCBwbCA9PSBwbDIKLQlmID0gU3RyaW5nSU8oKQotCXBsMi53cml0ZShmKQotCWFzc2VydCB4bWwgPT0gZi5nZXR2YWx1ZSgpCi0JI3ByaW50IHJlcHIocGwyKQorICAgICMgdW5pY29kZSBrZXlzIGFyZSBwb3NzaWJsZSwgYnV0IGEgbGl0dGxlIGF3a3dhcmQgdG8gdXNlOgorICAgIHBsW3UnXHhjNWJlbnJhYSddID0gIlRoYXQgd2FzIGEgdW5pY29kZSBrZXkuIgorICAgIGYgPSBTdHJpbmdJTygpCisgICAgcGwud3JpdGUoZikKKyAgICB4bWwgPSBmLmdldHZhbHVlKCkKKyAgICBwcmludCB4bWwKKyAgICBmLnNlZWsoMCkKKyAgICBwbDIgPSBQbGlzdC5mcm9tRmlsZShmKQorICAgIGFzc2VydCBwbCA9PSBwbDIKKyAgICBmID0gU3RyaW5nSU8oKQorICAgIHBsMi53cml0ZShmKQorICAgIGFzc2VydCB4bWwgPT0gZi5nZXR2YWx1ZSgpCisgICAgI3ByaW50IHJlcHIocGwyKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5IGIvTGliL3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5CmluZGV4IDYxNTMyODcuLjY0NmM3MjYgMTAwNjQ0Ci0tLSBhL0xpYi9wbGF0LW1hYy92aWRlb3JlYWRlci5weQorKysgYi9MaWIvcGxhdC1tYWMvdmlkZW9yZWFkZXIucHkKQEAgLTEzLDI4MCArMTMsMjgwIEBACiBmcm9tIENhcmJvbiBpbXBvcnQgUURPZmZzY3JlZW4KIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKIHRyeToKLQlpbXBvcnQgTWVkaWFEZXNjcgorICAgIGltcG9ydCBNZWRpYURlc2NyCiBleGNlcHQgSW1wb3J0RXJyb3I6Ci0JZGVmIF9hdWRpb2Rlc2NyKGRhdGEpOgotCQlyZXR1cm4gTm9uZQorICAgIGRlZiBfYXVkaW9kZXNjcihkYXRhKToKKyAgICAgICAgcmV0dXJuIE5vbmUKIGVsc2U6Ci0JZGVmIF9hdWRpb2Rlc2NyKGRhdGEpOgotCQlyZXR1cm4gTWVkaWFEZXNjci5Tb3VuZERlc2NyaXB0aW9uLmRlY29kZShkYXRhKQorICAgIGRlZiBfYXVkaW9kZXNjcihkYXRhKToKKyAgICAgICAgcmV0dXJuIE1lZGlhRGVzY3IuU291bmREZXNjcmlwdGlvbi5kZWNvZGUoZGF0YSkKIHRyeToKLQlmcm9tIGltZ2Zvcm1hdCBpbXBvcnQgbWFjcmdiCisgICAgZnJvbSBpbWdmb3JtYXQgaW1wb3J0IG1hY3JnYgogZXhjZXB0IEltcG9ydEVycm9yOgotCW1hY3JnYiA9ICJNYWNpbnRvc2ggUkdCIGZvcm1hdCIKKyAgICBtYWNyZ2IgPSAiTWFjaW50b3NoIFJHQiBmb3JtYXQiCiBpbXBvcnQgb3MKICMgaW1wb3J0IGF1ZGlvLmZvcm1hdAogCiBjbGFzcyBWaWRlb0Zvcm1hdDoKLQlkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZGVzY3IsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk6Ci0JCXNlbGYuX19uYW1lID0gbmFtZQotCQlzZWxmLl9fZGVzY3IgPSBkZXNjcgotCQlzZWxmLl9fd2lkdGggPSB3aWR0aAotCQlzZWxmLl9faGVpZ2h0ID0gaGVpZ2h0Ci0JCXNlbGYuX19mb3JtYXQgPSBmb3JtYXQKLQkJCi0JZGVmIGdldG5hbWUoc2VsZik6Ci0JCXJldHVybiBzZWxmLl9fbmFtZQotCQkKLQlkZWYgZ2V0ZGVzY3Ioc2VsZik6Ci0JCXJldHVybiBzZWxmLl9fZGVzY3IKLQkJCi0JZGVmIGdldHNpemUoc2VsZik6Ci0JCXJldHVybiBzZWxmLl9fd2lkdGgsIHNlbGYuX19oZWlnaHQKLQkJCi0JZGVmIGdldGZvcm1hdChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX19mb3JtYXQKLQkJCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGRlc2NyLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOgorICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5fX2Rlc2NyID0gZGVzY3IKKyAgICAgICAgc2VsZi5fX3dpZHRoID0gd2lkdGgKKyAgICAgICAgc2VsZi5fX2hlaWdodCA9IGhlaWdodAorICAgICAgICBzZWxmLl9fZm9ybWF0ID0gZm9ybWF0CisgICAgICAgIAorICAgIGRlZiBnZXRuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUKKyAgICAgICAgCisgICAgZGVmIGdldGRlc2NyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2Rlc2NyCisgICAgICAgIAorICAgIGRlZiBnZXRzaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3dpZHRoLCBzZWxmLl9faGVpZ2h0CisgICAgICAgIAorICAgIGRlZiBnZXRmb3JtYXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fZm9ybWF0CisgICAgICAgIAogY2xhc3MgX1JlYWRlcjoKLQlkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6Ci0JCWZkID0gUXQuT3Blbk1vdmllRmlsZShwYXRoLCAwKQotCQlzZWxmLm1vdmllLCBkMSwgZDIgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKGZkLCAwLCAwKQotCQlzZWxmLm1vdmlldGltZXNjYWxlID0gc2VsZi5tb3ZpZS5HZXRNb3ZpZVRpbWVTY2FsZSgpCi0JCXRyeToKLQkJCXNlbGYuYXVkaW90cmFjayA9IHNlbGYubW92aWUuR2V0TW92aWVJbmRUcmFja1R5cGUoMSwKLQkJCQlRdWlja1RpbWUuQXVkaW9NZWRpYUNoYXJhY3RlcmlzdGljLCBRdWlja1RpbWUubW92aWVUcmFja0NoYXJhY3RlcmlzdGljKQotCQkJc2VsZi5hdWRpb21lZGlhID0gc2VsZi5hdWRpb3RyYWNrLkdldFRyYWNrTWVkaWEoKQotCQlleGNlcHQgUXQuRXJyb3I6Ci0JCQlzZWxmLmF1ZGlvdHJhY2sgPSBzZWxmLmF1ZGlvbWVkaWEgPSBOb25lCi0JCQlzZWxmLmF1ZGlvZGVzY3IgPSB7fQotCQllbHNlOgotCQkJaGFuZGxlID0gUmVzLkhhbmRsZSgnJykKLQkJCW4gPSBzZWxmLmF1ZGlvbWVkaWEuR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50KCkKLQkJCXNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKDEsIGhhbmRsZSkKLQkJCXNlbGYuYXVkaW9kZXNjciA9IF9hdWRpb2Rlc2NyKGhhbmRsZS5kYXRhKQotCQkJc2VsZi5hdWRpb3RpbWVzY2FsZSA9IHNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYVRpbWVTY2FsZSgpCi0JCQlkZWwgaGFuZGxlCi0JCi0JCXRyeToJCi0JCQlzZWxmLnZpZGVvdHJhY2sgPSBzZWxmLm1vdmllLkdldE1vdmllSW5kVHJhY2tUeXBlKDEsCi0JCQkJUXVpY2tUaW1lLlZpc3VhbE1lZGlhQ2hhcmFjdGVyaXN0aWMsIFF1aWNrVGltZS5tb3ZpZVRyYWNrQ2hhcmFjdGVyaXN0aWMpCi0JCQlzZWxmLnZpZGVvbWVkaWEgPSBzZWxmLnZpZGVvdHJhY2suR2V0VHJhY2tNZWRpYSgpCi0JCWV4Y2VwdCBRdC5FcnJvcjoKLQkJCXNlbGYudmlkZW90cmFjayA9IHNlbGYudmlkZW9tZWRpYSA9IHNlbGYudmlkZW90aW1lc2NhbGUgPSBOb25lCi0JCWlmIHNlbGYudmlkZW90cmFjazoKLQkJCXNlbGYudmlkZW90aW1lc2NhbGUgPSBzZWxmLnZpZGVvbWVkaWEuR2V0TWVkaWFUaW1lU2NhbGUoKQotCQkJeDAsIHkwLCB4MSwgeTEgPSBzZWxmLm1vdmllLkdldE1vdmllQm94KCkKLQkJCXNlbGYudmlkZW9kZXNjciA9IHsnd2lkdGgnOih4MS14MCksICdoZWlnaHQnOih5MS15MCl9Ci0JCQlzZWxmLl9pbml0Z3dvcmxkKCkKLQkJc2VsZi52aWRlb2N1cnRpbWUgPSBOb25lCi0JCXNlbGYuYXVkaW9jdXJ0aW1lID0gTm9uZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgZmQgPSBRdC5PcGVuTW92aWVGaWxlKHBhdGgsIDApCisgICAgICAgIHNlbGYubW92aWUsIGQxLCBkMiA9IFF0Lk5ld01vdmllRnJvbUZpbGUoZmQsIDAsIDApCisgICAgICAgIHNlbGYubW92aWV0aW1lc2NhbGUgPSBzZWxmLm1vdmllLkdldE1vdmllVGltZVNjYWxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hdWRpb3RyYWNrID0gc2VsZi5tb3ZpZS5HZXRNb3ZpZUluZFRyYWNrVHlwZSgxLAorICAgICAgICAgICAgICAgIFF1aWNrVGltZS5BdWRpb01lZGlhQ2hhcmFjdGVyaXN0aWMsIFF1aWNrVGltZS5tb3ZpZVRyYWNrQ2hhcmFjdGVyaXN0aWMpCisgICAgICAgICAgICBzZWxmLmF1ZGlvbWVkaWEgPSBzZWxmLmF1ZGlvdHJhY2suR2V0VHJhY2tNZWRpYSgpCisgICAgICAgIGV4Y2VwdCBRdC5FcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXVkaW90cmFjayA9IHNlbGYuYXVkaW9tZWRpYSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuYXVkaW9kZXNjciA9IHt9CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoYW5kbGUgPSBSZXMuSGFuZGxlKCcnKQorICAgICAgICAgICAgbiA9IHNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQoKQorICAgICAgICAgICAgc2VsZi5hdWRpb21lZGlhLkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oMSwgaGFuZGxlKQorICAgICAgICAgICAgc2VsZi5hdWRpb2Rlc2NyID0gX2F1ZGlvZGVzY3IoaGFuZGxlLmRhdGEpCisgICAgICAgICAgICBzZWxmLmF1ZGlvdGltZXNjYWxlID0gc2VsZi5hdWRpb21lZGlhLkdldE1lZGlhVGltZVNjYWxlKCkKKyAgICAgICAgICAgIGRlbCBoYW5kbGUKKyAgICAKKyAgICAgICAgdHJ5OiAgICAKKyAgICAgICAgICAgIHNlbGYudmlkZW90cmFjayA9IHNlbGYubW92aWUuR2V0TW92aWVJbmRUcmFja1R5cGUoMSwKKyAgICAgICAgICAgICAgICBRdWlja1RpbWUuVmlzdWFsTWVkaWFDaGFyYWN0ZXJpc3RpYywgUXVpY2tUaW1lLm1vdmllVHJhY2tDaGFyYWN0ZXJpc3RpYykKKyAgICAgICAgICAgIHNlbGYudmlkZW9tZWRpYSA9IHNlbGYudmlkZW90cmFjay5HZXRUcmFja01lZGlhKCkKKyAgICAgICAgZXhjZXB0IFF0LkVycm9yOgorICAgICAgICAgICAgc2VsZi52aWRlb3RyYWNrID0gc2VsZi52aWRlb21lZGlhID0gc2VsZi52aWRlb3RpbWVzY2FsZSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi52aWRlb3RyYWNrOgorICAgICAgICAgICAgc2VsZi52aWRlb3RpbWVzY2FsZSA9IHNlbGYudmlkZW9tZWRpYS5HZXRNZWRpYVRpbWVTY2FsZSgpCisgICAgICAgICAgICB4MCwgeTAsIHgxLCB5MSA9IHNlbGYubW92aWUuR2V0TW92aWVCb3goKQorICAgICAgICAgICAgc2VsZi52aWRlb2Rlc2NyID0geyd3aWR0aCc6KHgxLXgwKSwgJ2hlaWdodCc6KHkxLXkwKX0KKyAgICAgICAgICAgIHNlbGYuX2luaXRnd29ybGQoKQorICAgICAgICBzZWxmLnZpZGVvY3VydGltZSA9IE5vbmUKKyAgICAgICAgc2VsZi5hdWRpb2N1cnRpbWUgPSBOb25lCiAKLQkJCi0JZGVmIF9fZGVsX18oc2VsZik6Ci0JCXNlbGYuYXVkaW9tZWRpYSA9IE5vbmUKLQkJc2VsZi5hdWRpb3RyYWNrID0gTm9uZQotCQlzZWxmLnZpZGVvbWVkaWEgPSBOb25lCi0JCXNlbGYudmlkZW90cmFjayA9IE5vbmUKLQkJc2VsZi5tb3ZpZSA9IE5vbmUKLQkJCi0JZGVmIF9pbml0Z3dvcmxkKHNlbGYpOgotCQlvbGRfcG9ydCwgb2xkX2RldiA9IFFkb2Zmcy5HZXRHV29ybGQoKQotCQl0cnk6Ci0JCQltb3ZpZV93ID0gc2VsZi52aWRlb2Rlc2NyWyd3aWR0aCddCi0JCQltb3ZpZV9oID0gc2VsZi52aWRlb2Rlc2NyWydoZWlnaHQnXQotCQkJbW92aWVfcmVjdCA9ICgwLCAwLCBtb3ZpZV93LCBtb3ZpZV9oKQotCQkJc2VsZi5nd29ybGQgPSBRZG9mZnMuTmV3R1dvcmxkKDMyLCAgbW92aWVfcmVjdCwgTm9uZSwgTm9uZSwgUURPZmZzY3JlZW4ua2VlcExvY2FsKQotCQkJc2VsZi5waXhtYXAgPSBzZWxmLmd3b3JsZC5HZXRHV29ybGRQaXhNYXAoKQotCQkJUWRvZmZzLkxvY2tQaXhlbHMoc2VsZi5waXhtYXApCi0JCQlRZG9mZnMuU2V0R1dvcmxkKHNlbGYuZ3dvcmxkLmFzX0dyYWZQdHIoKSwgTm9uZSkKLQkJCVFkLkVyYXNlUmVjdChtb3ZpZV9yZWN0KQotCQkJc2VsZi5tb3ZpZS5TZXRNb3ZpZUdXb3JsZChzZWxmLmd3b3JsZC5hc19HcmFmUHRyKCksIE5vbmUpCi0JCQlzZWxmLm1vdmllLlNldE1vdmllQm94KG1vdmllX3JlY3QpCi0JCQlzZWxmLm1vdmllLlNldE1vdmllQWN0aXZlKDEpCi0JCQlzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKLQkJCXNlbGYubW92aWUuU2V0TW92aWVQbGF5SGludHMoUXVpY2tUaW1lLmhpbnRzSGlnaFF1YWxpdHksIFF1aWNrVGltZS5oaW50c0hpZ2hRdWFsaXR5KQotCQkJIyBYWFhYIGZyYW1lcmF0ZQotCQlmaW5hbGx5OgotCQkJUWRvZmZzLlNldEdXb3JsZChvbGRfcG9ydCwgb2xkX2RldikKLQkJCi0JZGVmIF9nZXR0cmFja2R1cmF0aW9uX21zKHNlbGYsIHRyYWNrKToKLQkJdHJhY2t0aW1lID0gdHJhY2suR2V0VHJhY2tEdXJhdGlvbigpCi0JCXJldHVybiBzZWxmLl9tb3ZpZXRpbWVfdG9fbXModHJhY2t0aW1lKQotCQkKLQlkZWYgX21vdmlldGltZV90b19tcyhzZWxmLCB0aW1lKToKLQkJdmFsdWUsIGQxLCBkMiA9IFF0LkNvbnZlcnRUaW1lU2NhbGUoKHRpbWUsIHNlbGYubW92aWV0aW1lc2NhbGUsIE5vbmUpLCAxMDAwKQotCQlyZXR1cm4gdmFsdWUKLQkJCi0JZGVmIF92aWRlb3RpbWVfdG9fbXMoc2VsZiwgdGltZSk6Ci0JCXZhbHVlLCBkMSwgZDIgPSBRdC5Db252ZXJ0VGltZVNjYWxlKCh0aW1lLCBzZWxmLnZpZGVvdGltZXNjYWxlLCBOb25lKSwgMTAwMCkKLQkJcmV0dXJuIHZhbHVlCi0JCQotCWRlZiBfYXVkaW90aW1lX3RvX21zKHNlbGYsIHRpbWUpOgotCQl2YWx1ZSwgZDEsIGQyID0gUXQuQ29udmVydFRpbWVTY2FsZSgodGltZSwgc2VsZi5hdWRpb3RpbWVzY2FsZSwgTm9uZSksIDEwMDApCi0JCXJldHVybiB2YWx1ZQotCQkKLQlkZWYgX3ZpZGVvdGltZV90b19tb3ZpZXRpbWUoc2VsZiwgdGltZSk6Ci0JCXZhbHVlLCBkMSwgZDIgPSBRdC5Db252ZXJ0VGltZVNjYWxlKCh0aW1lLCBzZWxmLnZpZGVvdGltZXNjYWxlLCBOb25lKSwKLQkJCQlzZWxmLm1vdmlldGltZXNjYWxlKQotCQlyZXR1cm4gdmFsdWUKLQkJCi0JZGVmIEhhc0F1ZGlvKHNlbGYpOgotCQlyZXR1cm4gbm90IHNlbGYuYXVkaW90cmFjayBpcyBOb25lCi0JCQotCWRlZiBIYXNWaWRlbyhzZWxmKToKLQkJcmV0dXJuIG5vdCBzZWxmLnZpZGVvdHJhY2sgaXMgTm9uZQotCQkKLQlkZWYgR2V0QXVkaW9EdXJhdGlvbihzZWxmKToKLQkJaWYgbm90IHNlbGYuYXVkaW90cmFjazoKLQkJCXJldHVybiAwCi0JCXJldHVybiBzZWxmLl9nZXR0cmFja2R1cmF0aW9uX21zKHNlbGYuYXVkaW90cmFjaykKKyAgICAgICAgCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuYXVkaW9tZWRpYSA9IE5vbmUKKyAgICAgICAgc2VsZi5hdWRpb3RyYWNrID0gTm9uZQorICAgICAgICBzZWxmLnZpZGVvbWVkaWEgPSBOb25lCisgICAgICAgIHNlbGYudmlkZW90cmFjayA9IE5vbmUKKyAgICAgICAgc2VsZi5tb3ZpZSA9IE5vbmUKKyAgICAgICAgCisgICAgZGVmIF9pbml0Z3dvcmxkKHNlbGYpOgorICAgICAgICBvbGRfcG9ydCwgb2xkX2RldiA9IFFkb2Zmcy5HZXRHV29ybGQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb3ZpZV93ID0gc2VsZi52aWRlb2Rlc2NyWyd3aWR0aCddCisgICAgICAgICAgICBtb3ZpZV9oID0gc2VsZi52aWRlb2Rlc2NyWydoZWlnaHQnXQorICAgICAgICAgICAgbW92aWVfcmVjdCA9ICgwLCAwLCBtb3ZpZV93LCBtb3ZpZV9oKQorICAgICAgICAgICAgc2VsZi5nd29ybGQgPSBRZG9mZnMuTmV3R1dvcmxkKDMyLCAgbW92aWVfcmVjdCwgTm9uZSwgTm9uZSwgUURPZmZzY3JlZW4ua2VlcExvY2FsKQorICAgICAgICAgICAgc2VsZi5waXhtYXAgPSBzZWxmLmd3b3JsZC5HZXRHV29ybGRQaXhNYXAoKQorICAgICAgICAgICAgUWRvZmZzLkxvY2tQaXhlbHMoc2VsZi5waXhtYXApCisgICAgICAgICAgICBRZG9mZnMuU2V0R1dvcmxkKHNlbGYuZ3dvcmxkLmFzX0dyYWZQdHIoKSwgTm9uZSkKKyAgICAgICAgICAgIFFkLkVyYXNlUmVjdChtb3ZpZV9yZWN0KQorICAgICAgICAgICAgc2VsZi5tb3ZpZS5TZXRNb3ZpZUdXb3JsZChzZWxmLmd3b3JsZC5hc19HcmFmUHRyKCksIE5vbmUpCisgICAgICAgICAgICBzZWxmLm1vdmllLlNldE1vdmllQm94KG1vdmllX3JlY3QpCisgICAgICAgICAgICBzZWxmLm1vdmllLlNldE1vdmllQWN0aXZlKDEpCisgICAgICAgICAgICBzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKKyAgICAgICAgICAgIHNlbGYubW92aWUuU2V0TW92aWVQbGF5SGludHMoUXVpY2tUaW1lLmhpbnRzSGlnaFF1YWxpdHksIFF1aWNrVGltZS5oaW50c0hpZ2hRdWFsaXR5KQorICAgICAgICAgICAgIyBYWFhYIGZyYW1lcmF0ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgUWRvZmZzLlNldEdXb3JsZChvbGRfcG9ydCwgb2xkX2RldikKKyAgICAgICAgCisgICAgZGVmIF9nZXR0cmFja2R1cmF0aW9uX21zKHNlbGYsIHRyYWNrKToKKyAgICAgICAgdHJhY2t0aW1lID0gdHJhY2suR2V0VHJhY2tEdXJhdGlvbigpCisgICAgICAgIHJldHVybiBzZWxmLl9tb3ZpZXRpbWVfdG9fbXModHJhY2t0aW1lKQorICAgICAgICAKKyAgICBkZWYgX21vdmlldGltZV90b19tcyhzZWxmLCB0aW1lKToKKyAgICAgICAgdmFsdWUsIGQxLCBkMiA9IFF0LkNvbnZlcnRUaW1lU2NhbGUoKHRpbWUsIHNlbGYubW92aWV0aW1lc2NhbGUsIE5vbmUpLCAxMDAwKQorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgCisgICAgZGVmIF92aWRlb3RpbWVfdG9fbXMoc2VsZiwgdGltZSk6CisgICAgICAgIHZhbHVlLCBkMSwgZDIgPSBRdC5Db252ZXJ0VGltZVNjYWxlKCh0aW1lLCBzZWxmLnZpZGVvdGltZXNjYWxlLCBOb25lKSwgMTAwMCkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIAorICAgIGRlZiBfYXVkaW90aW1lX3RvX21zKHNlbGYsIHRpbWUpOgorICAgICAgICB2YWx1ZSwgZDEsIGQyID0gUXQuQ29udmVydFRpbWVTY2FsZSgodGltZSwgc2VsZi5hdWRpb3RpbWVzY2FsZSwgTm9uZSksIDEwMDApCisgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICAKKyAgICBkZWYgX3ZpZGVvdGltZV90b19tb3ZpZXRpbWUoc2VsZiwgdGltZSk6CisgICAgICAgIHZhbHVlLCBkMSwgZDIgPSBRdC5Db252ZXJ0VGltZVNjYWxlKCh0aW1lLCBzZWxmLnZpZGVvdGltZXNjYWxlLCBOb25lKSwKKyAgICAgICAgICAgICAgICBzZWxmLm1vdmlldGltZXNjYWxlKQorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgCisgICAgZGVmIEhhc0F1ZGlvKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuYXVkaW90cmFjayBpcyBOb25lCisgICAgICAgIAorICAgIGRlZiBIYXNWaWRlbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnZpZGVvdHJhY2sgaXMgTm9uZQorICAgICAgICAKKyAgICBkZWYgR2V0QXVkaW9EdXJhdGlvbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuYXVkaW90cmFjazoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiBzZWxmLl9nZXR0cmFja2R1cmF0aW9uX21zKHNlbGYuYXVkaW90cmFjaykKIAotCWRlZiBHZXRWaWRlb0R1cmF0aW9uKHNlbGYpOgotCQlpZiBub3Qgc2VsZi52aWRlb3RyYWNrOgotCQkJcmV0dXJuIDAKLQkJcmV0dXJuIHNlbGYuX2dldHRyYWNrZHVyYXRpb25fbXMoc2VsZi52aWRlb3RyYWNrKQotCQkKLQlkZWYgR2V0QXVkaW9Gb3JtYXQoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLmF1ZGlvZGVzY3I6Ci0JCQlyZXR1cm4gTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZQotCQlicHMgPSBzZWxmLmF1ZGlvZGVzY3JbJ3NhbXBsZVNpemUnXQotCQluY2ggPSBzZWxmLmF1ZGlvZGVzY3JbJ251bUNoYW5uZWxzJ10KLQkJaWYgbmNoID09IDE6Ci0JCQljaGFubmVscyA9IFsnbW9ubyddCi0JCWVsaWYgbmNoID09IDI6Ci0JCQljaGFubmVscyA9IFsnbGVmdCcsICdyaWdodCddCi0JCWVsc2U6Ci0JCQljaGFubmVscyA9IG1hcChsYW1iZGEgeDogc3RyKHgrMSksIHJhbmdlKG5jaCkpCi0JCWlmIGJwcyAlIDg6Ci0JCQkjIEZ1bm55IGJpdHMtcGVyIHNhbXBsZS4gV2UgcHJldGVuZCBub3QgdG8gdW5kZXJzdGFuZAotCQkJYmxvY2tzaXplID0gMAotCQkJZnBiID0gMAotCQllbHNlOgotCQkJIyBRdWlja1RpbWUgaXMgZWFzeSAoZm9yIGFzIGZhciBhcyB3ZSBzdXBwb3J0IGl0KTogc2FtcGxlcyBhcmUgYWx3YXlzIGEgd2hvbGUKLQkJCSMgbnVtYmVyIG9mIGJ5dGVzLCBzbyBmcmFtZXMgYXJlIG5jaGFubmVscypzYW1wbGVzaXplLCBhbmQgdGhlcmUncyBvbmUgZnJhbWUgcGVyIGJsb2NrLgotCQkJYmxvY2tzaXplID0gKGJwcy84KSpuY2gKLQkJCWZwYiA9IDEKLQkJaWYgc2VsZi5hdWRpb2Rlc2NyWydkYXRhRm9ybWF0J10gPT0gJ3JhdyAnOgotCQkJZW5jb2RpbmcgPSAnbGluZWFyLWV4Y2VzcycKLQkJZWxpZiBzZWxmLmF1ZGlvZGVzY3JbJ2RhdGFGb3JtYXQnXSA9PSAndHdvcyc6Ci0JCQllbmNvZGluZyA9ICdsaW5lYXItc2lnbmVkJwotCQllbHNlOgotCQkJZW5jb2RpbmcgPSAncXVpY2t0aW1lLWNvZGluZy0lcyclc2VsZi5hdWRpb2Rlc2NyWydkYXRhRm9ybWF0J10KLSMjCQlyZXR1cm4gYXVkaW8uZm9ybWF0LkF1ZGlvRm9ybWF0TGluZWFyKCdxdWlja3RpbWVfYXVkaW8nLCAnUXVpY2tUaW1lIEF1ZGlvIEZvcm1hdCcsIAotIyMJCQljaGFubmVscywgZW5jb2RpbmcsIGJsb2Nrc2l6ZT1ibG9ja3NpemUsIGZwYj1mcGIsIGJwcz1icHMpCi0JCXJldHVybiBjaGFubmVscywgZW5jb2RpbmcsIGJsb2Nrc2l6ZSwgZnBiLCBicHMKLQkJCQotCWRlZiBHZXRBdWRpb0ZyYW1lUmF0ZShzZWxmKToKLQkJaWYgbm90IHNlbGYuYXVkaW9kZXNjcjoKLQkJCXJldHVybiBOb25lCi0JCXJldHVybiBpbnQoc2VsZi5hdWRpb2Rlc2NyWydzYW1wbGVSYXRlJ10pCi0JCQotCWRlZiBHZXRWaWRlb0Zvcm1hdChzZWxmKToKLQkJd2lkdGggPSBzZWxmLnZpZGVvZGVzY3JbJ3dpZHRoJ10KLQkJaGVpZ2h0ID0gc2VsZi52aWRlb2Rlc2NyWydoZWlnaHQnXQotCQlyZXR1cm4gVmlkZW9Gb3JtYXQoJ2R1bW15X2Zvcm1hdCcsICdEdW1teSBWaWRlbyBGb3JtYXQnLCB3aWR0aCwgaGVpZ2h0LCBtYWNyZ2IpCi0JCQotCWRlZiBHZXRWaWRlb0ZyYW1lUmF0ZShzZWxmKToKLQkJdHYgPSBzZWxmLnZpZGVvY3VydGltZQotCQlpZiB0diA9PSBOb25lOgotCQkJdHYgPSAwCi0JCWZsYWdzID0gUXVpY2tUaW1lLm5leHRUaW1lU3RlcHxRdWlja1RpbWUubmV4dFRpbWVFZGdlT0sKLQkJdHYsIGR1ciA9IHNlbGYudmlkZW9tZWRpYS5HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUoZmxhZ3MsIHR2LCAxLjApCi0JCWR1ciA9IHNlbGYuX3ZpZGVvdGltZV90b19tcyhkdXIpCi0JCXJldHVybiBpbnQoKDEwMDAuMC9kdXIpKzAuNSkKLQkJCi0JZGVmIFJlYWRBdWRpbyhzZWxmLCBuZnJhbWVzLCB0aW1lPU5vbmUpOgotCQlpZiBub3QgdGltZSBpcyBOb25lOgotCQkJc2VsZi5hdWRpb2N1cnRpbWUgPSB0aW1lCi0JCWZsYWdzID0gUXVpY2tUaW1lLm5leHRUaW1lU3RlcHxRdWlja1RpbWUubmV4dFRpbWVFZGdlT0sKLQkJaWYgc2VsZi5hdWRpb2N1cnRpbWUgPT0gTm9uZToKLQkJCXNlbGYuYXVkaW9jdXJ0aW1lID0gMAotCQl0diA9IHNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5KGZsYWdzLCBzZWxmLmF1ZGlvY3VydGltZSwgMS4wKQotCQlpZiB0diA8IDAgb3IgKHNlbGYuYXVkaW9jdXJ0aW1lIGFuZCB0diA8IHNlbGYuYXVkaW9jdXJ0aW1lKToKLQkJCXJldHVybiBzZWxmLl9hdWRpb3RpbWVfdG9fbXMoc2VsZi5hdWRpb2N1cnRpbWUpLCBOb25lCi0JCWggPSBSZXMuSGFuZGxlKCcnKQotCQlkZXNjX2ggPSBSZXMuSGFuZGxlKCcnKQotCQlzaXplLCBhY3R1YWx0aW1lLCBzYW1wbGVkdXJhdGlvbiwgZGVzY19pbmRleCwgYWN0dWFsY291bnQsIGZsYWdzID0gXAotCQkJc2VsZi5hdWRpb21lZGlhLkdldE1lZGlhU2FtcGxlKGgsIDAsIHR2LCBkZXNjX2gsIG5mcmFtZXMpCi0JCXNlbGYuYXVkaW9jdXJ0aW1lID0gYWN0dWFsdGltZSArIGFjdHVhbGNvdW50KnNhbXBsZWR1cmF0aW9uCi0JCXJldHVybiBzZWxmLl9hdWRpb3RpbWVfdG9fbXMoYWN0dWFsdGltZSksIGguZGF0YQotCQkKLQlkZWYgUmVhZFZpZGVvKHNlbGYsIHRpbWU9Tm9uZSk6Ci0JCWlmIG5vdCB0aW1lIGlzIE5vbmU6Ci0JCQlzZWxmLnZpZGVvY3VydGltZSA9IHRpbWUKLQkJZmxhZ3MgPSBRdWlja1RpbWUubmV4dFRpbWVTdGVwCi0JCWlmIHNlbGYudmlkZW9jdXJ0aW1lID09IE5vbmU6Ci0JCQlmbGFncyA9IGZsYWdzIHwgUXVpY2tUaW1lLm5leHRUaW1lRWRnZU9LCi0JCQlzZWxmLnZpZGVvY3VydGltZSA9IDAKLQkJdHYgPSBzZWxmLnZpZGVvbWVkaWEuR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seShmbGFncywgc2VsZi52aWRlb2N1cnRpbWUsIDEuMCkKLQkJaWYgdHYgPCAwIG9yIChzZWxmLnZpZGVvY3VydGltZSBhbmQgdHYgPD0gc2VsZi52aWRlb2N1cnRpbWUpOgotCQkJcmV0dXJuIHNlbGYuX3ZpZGVvdGltZV90b19tcyhzZWxmLnZpZGVvY3VydGltZSksIE5vbmUKLQkJc2VsZi52aWRlb2N1cnRpbWUgPSB0dgotCQltb3ZpZWN1cnRpbWUgPSBzZWxmLl92aWRlb3RpbWVfdG9fbW92aWV0aW1lKHNlbGYudmlkZW9jdXJ0aW1lKQotCQlzZWxmLm1vdmllLlNldE1vdmllVGltZVZhbHVlKG1vdmllY3VydGltZSkKLQkJc2VsZi5tb3ZpZS5Nb3ZpZXNUYXNrKDApCi0JCXJldHVybiBzZWxmLl92aWRlb3RpbWVfdG9fbXMoc2VsZi52aWRlb2N1cnRpbWUpLCBzZWxmLl9nZXRwaXhtYXBjb250ZW50KCkKLQkJCi0JZGVmIF9nZXRwaXhtYXBjb250ZW50KHNlbGYpOgotCQkiIiJTaHVmZmxlIHRoZSBvZmZzY3JlZW4gUGl4TWFwIGRhdGEsIGJlY2F1c2UgaXQgbWF5IGhhdmUgZnVubnkgc3RyaWRlIHZhbHVlcyIiIgotCQlyb3dieXRlcyA9IFFkb2Zmcy5HZXRQaXhSb3dCeXRlcyhzZWxmLnBpeG1hcCkKLQkJd2lkdGggPSBzZWxmLnZpZGVvZGVzY3JbJ3dpZHRoJ10KLQkJaGVpZ2h0ID0gc2VsZi52aWRlb2Rlc2NyWydoZWlnaHQnXQotCQlzdGFydCA9IDAKLQkJcnYgPSAnJwotCQlmb3IgaSBpbiByYW5nZShoZWlnaHQpOgotCQkJbmV4dGxpbmUgPSBRZG9mZnMuR2V0UGl4TWFwQnl0ZXMoc2VsZi5waXhtYXAsIHN0YXJ0LCB3aWR0aCo0KQotCQkJc3RhcnQgPSBzdGFydCArIHJvd2J5dGVzCi0JCQlydiA9IHJ2ICsgbmV4dGxpbmUKLQkJcmV0dXJuIHJ2CisgICAgZGVmIEdldFZpZGVvRHVyYXRpb24oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnZpZGVvdHJhY2s6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0dHJhY2tkdXJhdGlvbl9tcyhzZWxmLnZpZGVvdHJhY2spCisgICAgICAgIAorICAgIGRlZiBHZXRBdWRpb0Zvcm1hdChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuYXVkaW9kZXNjcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lCisgICAgICAgIGJwcyA9IHNlbGYuYXVkaW9kZXNjclsnc2FtcGxlU2l6ZSddCisgICAgICAgIG5jaCA9IHNlbGYuYXVkaW9kZXNjclsnbnVtQ2hhbm5lbHMnXQorICAgICAgICBpZiBuY2ggPT0gMToKKyAgICAgICAgICAgIGNoYW5uZWxzID0gWydtb25vJ10KKyAgICAgICAgZWxpZiBuY2ggPT0gMjoKKyAgICAgICAgICAgIGNoYW5uZWxzID0gWydsZWZ0JywgJ3JpZ2h0J10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNoYW5uZWxzID0gbWFwKGxhbWJkYSB4OiBzdHIoeCsxKSwgcmFuZ2UobmNoKSkKKyAgICAgICAgaWYgYnBzICUgODoKKyAgICAgICAgICAgICMgRnVubnkgYml0cy1wZXIgc2FtcGxlLiBXZSBwcmV0ZW5kIG5vdCB0byB1bmRlcnN0YW5kCisgICAgICAgICAgICBibG9ja3NpemUgPSAwCisgICAgICAgICAgICBmcGIgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFF1aWNrVGltZSBpcyBlYXN5IChmb3IgYXMgZmFyIGFzIHdlIHN1cHBvcnQgaXQpOiBzYW1wbGVzIGFyZSBhbHdheXMgYSB3aG9sZQorICAgICAgICAgICAgIyBudW1iZXIgb2YgYnl0ZXMsIHNvIGZyYW1lcyBhcmUgbmNoYW5uZWxzKnNhbXBsZXNpemUsIGFuZCB0aGVyZSdzIG9uZSBmcmFtZSBwZXIgYmxvY2suCisgICAgICAgICAgICBibG9ja3NpemUgPSAoYnBzLzgpKm5jaAorICAgICAgICAgICAgZnBiID0gMQorICAgICAgICBpZiBzZWxmLmF1ZGlvZGVzY3JbJ2RhdGFGb3JtYXQnXSA9PSAncmF3ICc6CisgICAgICAgICAgICBlbmNvZGluZyA9ICdsaW5lYXItZXhjZXNzJworICAgICAgICBlbGlmIHNlbGYuYXVkaW9kZXNjclsnZGF0YUZvcm1hdCddID09ICd0d29zJzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ2xpbmVhci1zaWduZWQnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGluZyA9ICdxdWlja3RpbWUtY29kaW5nLSVzJyVzZWxmLmF1ZGlvZGVzY3JbJ2RhdGFGb3JtYXQnXQorIyMgICAgICByZXR1cm4gYXVkaW8uZm9ybWF0LkF1ZGlvRm9ybWF0TGluZWFyKCdxdWlja3RpbWVfYXVkaW8nLCAnUXVpY2tUaW1lIEF1ZGlvIEZvcm1hdCcsIAorIyMgICAgICAgICAgY2hhbm5lbHMsIGVuY29kaW5nLCBibG9ja3NpemU9YmxvY2tzaXplLCBmcGI9ZnBiLCBicHM9YnBzKQorICAgICAgICByZXR1cm4gY2hhbm5lbHMsIGVuY29kaW5nLCBibG9ja3NpemUsIGZwYiwgYnBzCisgICAgICAgICAgICAKKyAgICBkZWYgR2V0QXVkaW9GcmFtZVJhdGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmF1ZGlvZGVzY3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gaW50KHNlbGYuYXVkaW9kZXNjclsnc2FtcGxlUmF0ZSddKQorICAgICAgICAKKyAgICBkZWYgR2V0VmlkZW9Gb3JtYXQoc2VsZik6CisgICAgICAgIHdpZHRoID0gc2VsZi52aWRlb2Rlc2NyWyd3aWR0aCddCisgICAgICAgIGhlaWdodCA9IHNlbGYudmlkZW9kZXNjclsnaGVpZ2h0J10KKyAgICAgICAgcmV0dXJuIFZpZGVvRm9ybWF0KCdkdW1teV9mb3JtYXQnLCAnRHVtbXkgVmlkZW8gRm9ybWF0Jywgd2lkdGgsIGhlaWdodCwgbWFjcmdiKQorICAgICAgICAKKyAgICBkZWYgR2V0VmlkZW9GcmFtZVJhdGUoc2VsZik6CisgICAgICAgIHR2ID0gc2VsZi52aWRlb2N1cnRpbWUKKyAgICAgICAgaWYgdHYgPT0gTm9uZToKKyAgICAgICAgICAgIHR2ID0gMAorICAgICAgICBmbGFncyA9IFF1aWNrVGltZS5uZXh0VGltZVN0ZXB8UXVpY2tUaW1lLm5leHRUaW1lRWRnZU9LCisgICAgICAgIHR2LCBkdXIgPSBzZWxmLnZpZGVvbWVkaWEuR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKGZsYWdzLCB0diwgMS4wKQorICAgICAgICBkdXIgPSBzZWxmLl92aWRlb3RpbWVfdG9fbXMoZHVyKQorICAgICAgICByZXR1cm4gaW50KCgxMDAwLjAvZHVyKSswLjUpCisgICAgICAgIAorICAgIGRlZiBSZWFkQXVkaW8oc2VsZiwgbmZyYW1lcywgdGltZT1Ob25lKToKKyAgICAgICAgaWYgbm90IHRpbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXVkaW9jdXJ0aW1lID0gdGltZQorICAgICAgICBmbGFncyA9IFF1aWNrVGltZS5uZXh0VGltZVN0ZXB8UXVpY2tUaW1lLm5leHRUaW1lRWRnZU9LCisgICAgICAgIGlmIHNlbGYuYXVkaW9jdXJ0aW1lID09IE5vbmU6CisgICAgICAgICAgICBzZWxmLmF1ZGlvY3VydGltZSA9IDAKKyAgICAgICAgdHYgPSBzZWxmLmF1ZGlvbWVkaWEuR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seShmbGFncywgc2VsZi5hdWRpb2N1cnRpbWUsIDEuMCkKKyAgICAgICAgaWYgdHYgPCAwIG9yIChzZWxmLmF1ZGlvY3VydGltZSBhbmQgdHYgPCBzZWxmLmF1ZGlvY3VydGltZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXVkaW90aW1lX3RvX21zKHNlbGYuYXVkaW9jdXJ0aW1lKSwgTm9uZQorICAgICAgICBoID0gUmVzLkhhbmRsZSgnJykKKyAgICAgICAgZGVzY19oID0gUmVzLkhhbmRsZSgnJykKKyAgICAgICAgc2l6ZSwgYWN0dWFsdGltZSwgc2FtcGxlZHVyYXRpb24sIGRlc2NfaW5kZXgsIGFjdHVhbGNvdW50LCBmbGFncyA9IFwKKyAgICAgICAgICAgIHNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYVNhbXBsZShoLCAwLCB0diwgZGVzY19oLCBuZnJhbWVzKQorICAgICAgICBzZWxmLmF1ZGlvY3VydGltZSA9IGFjdHVhbHRpbWUgKyBhY3R1YWxjb3VudCpzYW1wbGVkdXJhdGlvbgorICAgICAgICByZXR1cm4gc2VsZi5fYXVkaW90aW1lX3RvX21zKGFjdHVhbHRpbWUpLCBoLmRhdGEKKyAgICAgICAgCisgICAgZGVmIFJlYWRWaWRlbyhzZWxmLCB0aW1lPU5vbmUpOgorICAgICAgICBpZiBub3QgdGltZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi52aWRlb2N1cnRpbWUgPSB0aW1lCisgICAgICAgIGZsYWdzID0gUXVpY2tUaW1lLm5leHRUaW1lU3RlcAorICAgICAgICBpZiBzZWxmLnZpZGVvY3VydGltZSA9PSBOb25lOgorICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IFF1aWNrVGltZS5uZXh0VGltZUVkZ2VPSworICAgICAgICAgICAgc2VsZi52aWRlb2N1cnRpbWUgPSAwCisgICAgICAgIHR2ID0gc2VsZi52aWRlb21lZGlhLkdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkoZmxhZ3MsIHNlbGYudmlkZW9jdXJ0aW1lLCAxLjApCisgICAgICAgIGlmIHR2IDwgMCBvciAoc2VsZi52aWRlb2N1cnRpbWUgYW5kIHR2IDw9IHNlbGYudmlkZW9jdXJ0aW1lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl92aWRlb3RpbWVfdG9fbXMoc2VsZi52aWRlb2N1cnRpbWUpLCBOb25lCisgICAgICAgIHNlbGYudmlkZW9jdXJ0aW1lID0gdHYKKyAgICAgICAgbW92aWVjdXJ0aW1lID0gc2VsZi5fdmlkZW90aW1lX3RvX21vdmlldGltZShzZWxmLnZpZGVvY3VydGltZSkKKyAgICAgICAgc2VsZi5tb3ZpZS5TZXRNb3ZpZVRpbWVWYWx1ZShtb3ZpZWN1cnRpbWUpCisgICAgICAgIHNlbGYubW92aWUuTW92aWVzVGFzaygwKQorICAgICAgICByZXR1cm4gc2VsZi5fdmlkZW90aW1lX3RvX21zKHNlbGYudmlkZW9jdXJ0aW1lKSwgc2VsZi5fZ2V0cGl4bWFwY29udGVudCgpCisgICAgICAgIAorICAgIGRlZiBfZ2V0cGl4bWFwY29udGVudChzZWxmKToKKyAgICAgICAgIiIiU2h1ZmZsZSB0aGUgb2Zmc2NyZWVuIFBpeE1hcCBkYXRhLCBiZWNhdXNlIGl0IG1heSBoYXZlIGZ1bm55IHN0cmlkZSB2YWx1ZXMiIiIKKyAgICAgICAgcm93Ynl0ZXMgPSBRZG9mZnMuR2V0UGl4Um93Qnl0ZXMoc2VsZi5waXhtYXApCisgICAgICAgIHdpZHRoID0gc2VsZi52aWRlb2Rlc2NyWyd3aWR0aCddCisgICAgICAgIGhlaWdodCA9IHNlbGYudmlkZW9kZXNjclsnaGVpZ2h0J10KKyAgICAgICAgc3RhcnQgPSAwCisgICAgICAgIHJ2ID0gJycKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoaGVpZ2h0KToKKyAgICAgICAgICAgIG5leHRsaW5lID0gUWRvZmZzLkdldFBpeE1hcEJ5dGVzKHNlbGYucGl4bWFwLCBzdGFydCwgd2lkdGgqNCkKKyAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgKyByb3dieXRlcworICAgICAgICAgICAgcnYgPSBydiArIG5leHRsaW5lCisgICAgICAgIHJldHVybiBydgogCiBkZWYgcmVhZGVyKHVybCk6Ci0JdHJ5OgotCQlyZHIgPSBfUmVhZGVyKHVybCkKLQlleGNlcHQgSU9FcnJvcjoKLQkJcmV0dXJuIE5vbmUKLQlyZXR1cm4gcmRyCisgICAgdHJ5OgorICAgICAgICByZHIgPSBfUmVhZGVyKHVybCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gcmRyCiAKIGRlZiBfdGVzdCgpOgotCWltcG9ydCBFYXN5RGlhbG9ncwotCXRyeToKLQkJaW1wb3J0IGltZwotCWV4Y2VwdCBJbXBvcnRFcnJvcjoKLQkJaW1nID0gTm9uZQotCWltcG9ydCBNYWNPUwotCVF0LkVudGVyTW92aWVzKCkKLQlwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0nVmlkZW8gdG8gY29udmVydCcpCi0JaWYgbm90IHBhdGg6IHN5cy5leGl0KDApCi0JcmRyID0gcmVhZGVyKHBhdGgpCi0JaWYgbm90IHJkcjoKLQkJc3lzLmV4aXQoMSkKLQlkc3RkaXIgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdOYW1lIGZvciBvdXRwdXQgZm9sZGVyJykKLQlpZiBub3QgZHN0ZGlyOiBzeXMuZXhpdCgwKQotCW51bSA9IDAKLQlvcy5ta2Rpcihkc3RkaXIpCi0JdmlkZW9mbXQgPSByZHIuR2V0VmlkZW9Gb3JtYXQoKQotCWltZ2ZtdCA9IHZpZGVvZm10LmdldGZvcm1hdCgpCi0JaW1ndywgaW1naCA9IHZpZGVvZm10LmdldHNpemUoKQotCXRpbWVzdGFtcCwgZGF0YSA9IHJkci5SZWFkVmlkZW8oKQotCXdoaWxlIGRhdGE6Ci0JCWZuYW1lID0gJ2ZyYW1lJTA0LjRkLmpwZyclbnVtCi0JCW51bSA9IG51bSsxCi0JCXBuYW1lID0gb3MucGF0aC5qb2luKGRzdGRpciwgZm5hbWUpCi0JCWlmIG5vdCBpbWc6IHByaW50ICdOb3QnLAotCQlwcmludCAnV3JpdGluZyAlcywgc2l6ZSAlZHglZCwgJWQgYnl0ZXMnJShmbmFtZSwgaW1ndywgaW1naCwgbGVuKGRhdGEpKQotCQlpZiBpbWc6Ci0JCQl3cnQgPSBpbWcud3JpdGVyKGltZ2ZtdCwgcG5hbWUpCi0JCQl3cnQud2lkdGggPSBpbWd3Ci0JCQl3cnQuaGVpZ2h0ID0gaW1naAotCQkJd3J0LndyaXRlKGRhdGEpCi0JCQl0aW1lc3RhbXAsIGRhdGEgPSByZHIuUmVhZFZpZGVvKCkKLQkJCU1hY09TLlNldENyZWF0b3JBbmRUeXBlKHBuYW1lLCAnb2dsZScsICdKUEVHJykKLQkJCWlmIG51bSA+IDIwOiAKLQkJCQlwcmludCAnc3RvcHBpbmcgYXQgMjAgZnJhbWVzIHNvIHlvdXIgZGlzayBkb2VzIG5vdCBmaWxsIHVwOi0pJwotCQkJCWJyZWFrCi0JcHJpbnQgJ1RvdGFsIGZyYW1lczonLCBudW0KLQkJCisgICAgaW1wb3J0IEVhc3lEaWFsb2dzCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgaW1nCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBpbWcgPSBOb25lCisgICAgaW1wb3J0IE1hY09TCisgICAgUXQuRW50ZXJNb3ZpZXMoKQorICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSdWaWRlbyB0byBjb252ZXJ0JykKKyAgICBpZiBub3QgcGF0aDogc3lzLmV4aXQoMCkKKyAgICByZHIgPSByZWFkZXIocGF0aCkKKyAgICBpZiBub3QgcmRyOgorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGRzdGRpciA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J05hbWUgZm9yIG91dHB1dCBmb2xkZXInKQorICAgIGlmIG5vdCBkc3RkaXI6IHN5cy5leGl0KDApCisgICAgbnVtID0gMAorICAgIG9zLm1rZGlyKGRzdGRpcikKKyAgICB2aWRlb2ZtdCA9IHJkci5HZXRWaWRlb0Zvcm1hdCgpCisgICAgaW1nZm10ID0gdmlkZW9mbXQuZ2V0Zm9ybWF0KCkKKyAgICBpbWd3LCBpbWdoID0gdmlkZW9mbXQuZ2V0c2l6ZSgpCisgICAgdGltZXN0YW1wLCBkYXRhID0gcmRyLlJlYWRWaWRlbygpCisgICAgd2hpbGUgZGF0YToKKyAgICAgICAgZm5hbWUgPSAnZnJhbWUlMDQuNGQuanBnJyVudW0KKyAgICAgICAgbnVtID0gbnVtKzEKKyAgICAgICAgcG5hbWUgPSBvcy5wYXRoLmpvaW4oZHN0ZGlyLCBmbmFtZSkKKyAgICAgICAgaWYgbm90IGltZzogcHJpbnQgJ05vdCcsCisgICAgICAgIHByaW50ICdXcml0aW5nICVzLCBzaXplICVkeCVkLCAlZCBieXRlcyclKGZuYW1lLCBpbWd3LCBpbWdoLCBsZW4oZGF0YSkpCisgICAgICAgIGlmIGltZzoKKyAgICAgICAgICAgIHdydCA9IGltZy53cml0ZXIoaW1nZm10LCBwbmFtZSkKKyAgICAgICAgICAgIHdydC53aWR0aCA9IGltZ3cKKyAgICAgICAgICAgIHdydC5oZWlnaHQgPSBpbWdoCisgICAgICAgICAgICB3cnQud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHRpbWVzdGFtcCwgZGF0YSA9IHJkci5SZWFkVmlkZW8oKQorICAgICAgICAgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUocG5hbWUsICdvZ2xlJywgJ0pQRUcnKQorICAgICAgICAgICAgaWYgbnVtID4gMjA6IAorICAgICAgICAgICAgICAgIHByaW50ICdzdG9wcGluZyBhdCAyMCBmcmFtZXMgc28geW91ciBkaXNrIGRvZXMgbm90IGZpbGwgdXA6LSknCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBwcmludCAnVG90YWwgZnJhbWVzOicsIG51bQorICAgICAgICAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JX3Rlc3QoKQotCXN5cy5leGl0KDEpCi0JCQorICAgIF90ZXN0KCkKKyAgICBzeXMuZXhpdCgxKQorICAgICAgICAK