ZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggMGIzZDQ3Ny4uMDYxZDBmNSAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTMzLDcgKzMzLDcgQEAKIF9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbiQiCiAjICRTb3VyY2UkCiAKLXZlcnNpb24gICAgID0gIjAuNi40IgordmVyc2lvbiAgICAgPSAiMC44LjAiCiBfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3TkYmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCiBfX2RhdGVfXyAgICA9ICIkRGF0ZSQiCiBfX2N2c2lkX18gICA9ICIkSWQkIgpAQCAtMTMyLDIxICsxMzIsNjUgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgU29tZSB1c2VmdWwgZnVuY3Rpb25zCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1kZWYgbnRzKHMpOgotICAgICIiIkNvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlciB0byBhIHB5dGhvbiBzdHJpbmcuCi0gICAgIiIiCi0gICAgcmV0dXJuIHMucnN0cmlwKE5VTCkKIAotZGVmIGNhbGNfY2hrc3VtKGJ1Zik6Ci0gICAgIiIiQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBmb3IgYSBtZW1iZXIncyBoZWFkZXIuIEl0J3MgYSBzaW1wbGUgYWRkaXRpb24KLSAgICAgICBvZiBhbGwgYnl0ZXMsIHRyZWF0aW5nIHRoZSBjaGtzdW0gZmllbGQgYXMgaWYgZmlsbGVkIHdpdGggc3BhY2VzLgotICAgICAgIGJ1ZiBpcyBhIDUxMiBieXRlIGxvbmcgc3RyaW5nIGJ1ZmZlciB3aGljaCBob2xkcyB0aGUgaGVhZGVyLgorZGVmIHN0bihzLCBsZW5ndGgpOgorICAgICIiIkNvbnZlcnQgYSBweXRob24gc3RyaW5nIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBidWZmZXIuCiAgICAgIiIiCi0gICAgY2hrID0gMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGtzdW0gZmllbGQgaXMgdHJlYXRlZCBhcyBibGFua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyB0aGUgaW5pdGlhbCB2YWx1ZSBpcyA4ICogb3JkKCIgIikKLSAgICBmb3IgYyBpbiBidWZbOjE0OF06IGNoayArPSBvcmQoYykgICAjIHN1bSB1cCBhbGwgYnl0ZXMgYmVmb3JlIGNoa3N1bQotICAgIGZvciBjIGluIGJ1ZlsxNTY6XTogY2hrICs9IG9yZChjKSAgICMgc3VtIHVwIGFsbCBieXRlcyBhZnRlciBjaGtzdW0KLSAgICByZXR1cm4gY2hrCisgICAgcmV0dXJuIHNbOmxlbmd0aC0xXSArIChsZW5ndGggLSBsZW4ocykgLSAxKSAqIE5VTCArIE5VTAorCitkZWYgbnRpKHMpOgorICAgICIiIkNvbnZlcnQgYSBudW1iZXIgZmllbGQgdG8gYSBweXRob24gbnVtYmVyLgorICAgICIiIgorICAgICMgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBlbmNvZGluZ3MgZm9yIGEgbnVtYmVyIGZpZWxkLCBzZWUKKyAgICAjIGl0bigpIGJlbG93LgorICAgIGlmIHNbMF0gIT0gY2hyKDAyMDApOgorICAgICAgICBuID0gaW50KHMucnN0cmlwKE5VTCkgb3IgIjAiLCA4KQorICAgIGVsc2U6CisgICAgICAgIG4gPSAwTAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHMpIC0gMSk6CisgICAgICAgICAgICBuIDw8PSA4CisgICAgICAgICAgICBuICs9IG9yZChzW2kgKyAxXSkKKyAgICByZXR1cm4gbgorCitkZWYgaXRuKG4sIGRpZ2l0cz04LCBwb3NpeD1GYWxzZSk6CisgICAgIiIiQ29udmVydCBhIHB5dGhvbiBudW1iZXIgdG8gYSBudW1iZXIgZmllbGQuCisgICAgIiIiCisgICAgIyBQT1NJWCAxMDAzLjEtMTk4OCByZXF1aXJlcyBudW1iZXJzIHRvIGJlIGVuY29kZWQgYXMgYSBzdHJpbmcgb2YKKyAgICAjIG9jdGFsIGRpZ2l0cyBmb2xsb3dlZCBieSBhIG51bGwtYnl0ZSwgdGhpcyBhbGxvd3MgdmFsdWVzIHVwIHRvCisgICAgIyAoOCoqKGRpZ2l0cy0xKSktMS4gR05VIHRhciBhbGxvd3Mgc3RvcmluZyBudW1iZXJzIGdyZWF0ZXIgdGhhbgorICAgICMgdGhhdCBpZiBuZWNlc3NhcnkuIEEgbGVhZGluZyAwMjAwIGJ5dGUgaW5kaWNhdGVzIHRoaXMgcGFydGljdWxhcgorICAgICMgZW5jb2RpbmcsIHRoZSBmb2xsb3dpbmcgZGlnaXRzLTEgYnl0ZXMgYXJlIGEgYmlnLWVuZGlhbgorICAgICMgcmVwcmVzZW50YXRpb24uIFRoaXMgYWxsb3dzIHZhbHVlcyB1cCB0byAoMjU2KiooZGlnaXRzLTEpKS0xLgorICAgIGlmIDAgPD0gbiA8IDggKiogKGRpZ2l0cyAtIDEpOgorICAgICAgICBzID0gIiUwKm8iICUgKGRpZ2l0cyAtIDEsIG4pICsgTlVMCisgICAgZWxzZToKKyAgICAgICAgaWYgcG9zaXg6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvdmVyZmxvdyBpbiBudW1iZXIgZmllbGQiKQorCisgICAgICAgIGlmIG4gPCAwOgorICAgICAgICAgICAgIyBYWFggV2UgbWltaWMgR05VIHRhcidzIGJlaGF2aW91ciB3aXRoIG5lZ2F0aXZlIG51bWJlcnMsCisgICAgICAgICAgICAjIHRoaXMgY291bGQgcmFpc2UgT3ZlcmZsb3dFcnJvci4KKyAgICAgICAgICAgIG4gPSBzdHJ1Y3QudW5wYWNrKCJMIiwgc3RydWN0LnBhY2soImwiLCBuKSlbMF0KKworICAgICAgICBzID0gIiIKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGRpZ2l0cyAtIDEpOgorICAgICAgICAgICAgcyA9IGNocihuICYgMDM3NykgKyBzCisgICAgICAgICAgICBuID4+PSA4CisgICAgICAgIHMgPSBjaHIoMDIwMCkgKyBzCisgICAgcmV0dXJuIHMKKworZGVmIGNhbGNfY2hrc3VtcyhidWYpOgorICAgICIiIkNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gZm9yIGEgbWVtYmVyJ3MgaGVhZGVyIGJ5IHN1bW1pbmcgdXAgYWxsCisgICAgICAgY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBjaGtzdW0gZmllbGQgd2hpY2ggaXMgdHJlYXRlZCBhcyBpZgorICAgICAgIGl0IHdhcyBmaWxsZWQgd2l0aCBzcGFjZXMuIEFjY29yZGluZyB0byB0aGUgR05VIHRhciBzb3VyY2VzLAorICAgICAgIHNvbWUgdGFycyAoU3VuIGFuZCBOZVhUKSBjYWxjdWxhdGUgY2hrc3VtIHdpdGggc2lnbmVkIGNoYXIsCisgICAgICAgd2hpY2ggd2lsbCBiZSBkaWZmZXJlbnQgaWYgdGhlcmUgYXJlIGNoYXJzIGluIHRoZSBidWZmZXIgd2l0aAorICAgICAgIHRoZSBoaWdoIGJpdCBzZXQuIFNvIHdlIGNhbGN1bGF0ZSB0d28gY2hlY2tzdW1zLCB1bnNpZ25lZCBhbmQKKyAgICAgICBzaWduZWQuCisgICAgIiIiCisgICAgdW5zaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OEIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2QiIsIGJ1ZlsxNTY6NTEyXSkpCisgICAgc2lnbmVkX2Noa3N1bSA9IDI1NiArIHN1bShzdHJ1Y3QudW5wYWNrKCIxNDhiIiwgYnVmWzoxNDhdKSArIHN0cnVjdC51bnBhY2soIjM1NmIiLCBidWZbMTU2OjUxMl0pKQorICAgIHJldHVybiB1bnNpZ25lZF9jaGtzdW0sIHNpZ25lZF9jaGtzdW0KIAogZGVmIGNvcHlmaWxlb2JqKHNyYywgZHN0LCBsZW5ndGg9Tm9uZSk6CiAgICAgIiIiQ29weSBsZW5ndGggYnl0ZXMgZnJvbSBmaWxlb2JqIHNyYyB0byBmaWxlb2JqIGRzdC4KQEAgLTE2MywxMyArMjA3LDEzIEBACiAgICAgZm9yIGIgaW4geHJhbmdlKGJsb2Nrcyk6CiAgICAgICAgIGJ1ZiA9IHNyYy5yZWFkKEJVRlNJWkUpCiAgICAgICAgIGlmIGxlbihidWYpIDwgQlVGU0laRToKLSAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJlbmQgb2YgZmlsZSByZWFjaGVkIgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiZW5kIG9mIGZpbGUgcmVhY2hlZCIpCiAgICAgICAgIGRzdC53cml0ZShidWYpCiAKICAgICBpZiByZW1haW5kZXIgIT0gMDoKICAgICAgICAgYnVmID0gc3JjLnJlYWQocmVtYWluZGVyKQogICAgICAgICBpZiBsZW4oYnVmKSA8IHJlbWFpbmRlcjoKLSAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJlbmQgb2YgZmlsZSByZWFjaGVkIgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiZW5kIG9mIGZpbGUgcmVhY2hlZCIpCiAgICAgICAgIGRzdC53cml0ZShidWYpCiAgICAgcmV0dXJuCiAKQEAgLTMwMSw3ICszNDUsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGltcG9ydCB6bGliCiAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvciwgInpsaWIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiCisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiemxpYiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCiAgICAgICAgICAgICBzZWxmLnpsaWIgPSB6bGliCiAgICAgICAgICAgICBzZWxmLmNyYyA9IHpsaWIuY3JjMzIoIiIpCiAgICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKQEAgLTMxMyw3ICszNTcsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGltcG9ydCBiejIKICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCiAgICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKICAgICAgICAgICAgICAgICBzZWxmLmRidWYgPSAiIgogICAgICAgICAgICAgICAgIHNlbGYuY21wID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCkBAIC0zODksOSArNDMzLDkgQEAKIAogICAgICAgICAjIHRha2VuIGZyb20gZ3ppcC5HemlwRmlsZSB3aXRoIHNvbWUgYWx0ZXJhdGlvbnMKICAgICAgICAgaWYgc2VsZi5fX3JlYWQoMikgIT0gIlwwMzdcMjEzIjoKLSAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvciwgIm5vdCBhIGd6aXAgZmlsZSIKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgZ3ppcCBmaWxlIikKICAgICAgICAgaWYgc2VsZi5fX3JlYWQoMSkgIT0gIlwwMTAiOgotICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvciwgInVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCIKKyAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInVuc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZCIpCiAKICAgICAgICAgZmxhZyA9IG9yZChzZWxmLl9fcmVhZCgxKSkKICAgICAgICAgc2VsZi5fX3JlYWQoNikKQEAgLTQyNyw3ICs0NzEsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYucmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgICBzZWxmLnJlYWQocmVtYWluZGVyKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IsICJzZWVraW5nIGJhY2t3YXJkcyBpcyBub3QgYWxsb3dlZCIKKyAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yKCJzZWVraW5nIGJhY2t3YXJkcyBpcyBub3QgYWxsb3dlZCIpCiAgICAgICAgIHJldHVybiBzZWxmLnBvcwogCiAgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKQEAgLTUwOCw2ICs1NTIsNjkgQEAKICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICMgY2xhc3MgU3RyZWFtUHJveHkKIAorY2xhc3MgX0JaMlByb3h5KG9iamVjdCk6CisgICAgIiIiU21hbGwgcHJveHkgY2xhc3MgdGhhdCBlbmFibGVzIGV4dGVybmFsIGZpbGUgb2JqZWN0CisgICAgICAgc3VwcG9ydCBmb3IgInI6YnoyIiBhbmQgInc6YnoyIiBtb2Rlcy4gVGhpcyBpcyBhY3R1YWxseQorICAgICAgIGEgd29ya2Fyb3VuZCBmb3IgYSBsaW1pdGF0aW9uIGluIGJ6MiBtb2R1bGUncyBCWjJGaWxlCisgICAgICAgY2xhc3Mgd2hpY2ggKHVubGlrZSBnemlwLkd6aXBGaWxlKSBoYXMgbm8gc3VwcG9ydCBmb3IKKyAgICAgICBhIGZpbGUgb2JqZWN0IGFyZ3VtZW50LgorICAgICIiIgorCisgICAgYmxvY2tzaXplID0gMTYgKiAxMDI0CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSk6CisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLmluaXQoKQorCisgICAgZGVmIGluaXQoc2VsZik6CisgICAgICAgIGltcG9ydCBiejIKKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CisgICAgICAgICAgICBzZWxmLmJ6Mm9iaiA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQorICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnoyb2JqID0gYnoyLkJaMkNvbXByZXNzb3IoKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGIgPSBbc2VsZi5idWZdCisgICAgICAgIHggPSBsZW4oc2VsZi5idWYpCisgICAgICAgIHdoaWxlIHggPCBzaXplOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhdyA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYmxvY2tzaXplKQorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLmJ6Mm9iai5kZWNvbXByZXNzKHJhdykKKyAgICAgICAgICAgICAgICBiLmFwcGVuZChkYXRhKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB4ICs9IGxlbihkYXRhKQorICAgICAgICBzZWxmLmJ1ZiA9ICIiLmpvaW4oYikKKworICAgICAgICBidWYgPSBzZWxmLmJ1Zls6c2l6ZV0KKyAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZltzaXplOl0KKyAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGJ1ZikKKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zKToKKyAgICAgICAgaWYgcG9zIDwgc2VsZi5wb3M6CisgICAgICAgICAgICBzZWxmLmluaXQoKQorICAgICAgICBzZWxmLnJlYWQocG9zIC0gc2VsZi5wb3MpCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucG9zCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYucG9zICs9IGxlbihkYXRhKQorICAgICAgICByYXcgPSBzZWxmLmJ6Mm9iai5jb21wcmVzcyhkYXRhKQorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUocmF3KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInciOgorICAgICAgICAgICAgcmF3ID0gc2VsZi5iejJvYmouZmx1c2goKQorICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHJhdykKKyAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKyMgY2xhc3MgX0JaMlByb3h5CisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgRXh0cmFjdGlvbiBmaWxlIG9iamVjdAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTgxLDcgKzY4OCw3IEBACiAgICAgICAgICIiIlJlYWQgb3BlcmF0aW9uIGZvciByZWd1bGFyIGZpbGVzLgogICAgICAgICAiIiIKICAgICAgICAgaWYgc2VsZi5jbG9zZWQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZmlsZSBpcyBjbG9zZWQiCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWxlIGlzIGNsb3NlZCIpCiAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0ICsgc2VsZi5wb3MpCiAgICAgICAgIGJ5dGVzbGVmdCA9IHNlbGYuc2l6ZSAtIHNlbGYucG9zCiAgICAgICAgIGlmIHNpemUgaXMgTm9uZToKQEAgLTU5NSw3ICs3MDIsNyBAQAogICAgICAgICAiIiJSZWFkIG9wZXJhdGlvbiBmb3Igc3BhcnNlIGZpbGVzLgogICAgICAgICAiIiIKICAgICAgICAgaWYgc2VsZi5jbG9zZWQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZmlsZSBpcyBjbG9zZWQiCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWxlIGlzIGNsb3NlZCIpCiAKICAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICAgc2l6ZSA9IHNlbGYuc2l6ZSAtIHNlbGYucG9zCkBAIC02ODQsMjQgKzc5MSwyNCBAQAogICAgICAgICAgICBvZiB0aGUgbWVtYmVyLgogICAgICAgICAiIiIKIAotICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZSAgICAgICAjIG1lbWJlciBuYW1lIChkaXJuYW1lcyBtdXN0IGVuZCB3aXRoICcvJykKLSAgICAgICAgc2VsZi5tb2RlICAgICA9IDA2NjYgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCi0gICAgICAgIHNlbGYudWlkICAgICAgPSAwICAgICAgICAgICMgdXNlciBpZAotICAgICAgICBzZWxmLmdpZCAgICAgID0gMCAgICAgICAgICAjIGdyb3VwIGlkCi0gICAgICAgIHNlbGYuc2l6ZSAgICAgPSAwICAgICAgICAgICMgZmlsZSBzaXplCi0gICAgICAgIHNlbGYubXRpbWUgICAgPSAwICAgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUKLSAgICAgICAgc2VsZi5jaGtzdW0gICA9IDAgICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KLSAgICAgICAgc2VsZi50eXBlICAgICA9IFJFR1RZUEUgICAgIyBtZW1iZXIgdHlwZQotICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAgICAjIGxpbmsgbmFtZQotICAgICAgICBzZWxmLnVuYW1lICAgID0gInVzZXIiICAgICAjIHVzZXIgbmFtZQotICAgICAgICBzZWxmLmduYW1lICAgID0gImdyb3VwIiAgICAjIGdyb3VwIG5hbWUKLSAgICAgICAgc2VsZi5kZXZtYWpvciA9IDAgICAgICAgICAgIy0KLSAgICAgICAgc2VsZi5kZXZtaW5vciA9IDAgICAgICAgICAgIy1mb3IgdXNlIHdpdGggQ0hSVFlQRSBhbmQgQkxLVFlQRQotICAgICAgICBzZWxmLnByZWZpeCAgID0gIiIgICAgICAgICAjIHByZWZpeCB0byBmaWxlbmFtZSBvciBob2xkaW5nIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdXQgc3BhcnNlIGZpbGVzCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgICAgICMgbWVtYmVyIG5hbWUgKGRpcm5hbWVzIG11c3QgZW5kIHdpdGggJy8nKQorICAgICAgICBzZWxmLm1vZGUgPSAwNjY2ICAgICAgICAjIGZpbGUgcGVybWlzc2lvbnMKKyAgICAgICAgc2VsZi51aWQgPSAwICAgICAgICAgICAgIyB1c2VyIGlkCisgICAgICAgIHNlbGYuZ2lkID0gMCAgICAgICAgICAgICMgZ3JvdXAgaWQKKyAgICAgICAgc2VsZi5zaXplID0gMCAgICAgICAgICAgIyBmaWxlIHNpemUKKyAgICAgICAgc2VsZi5tdGltZSA9IDAgICAgICAgICAgIyBtb2RpZmljYXRpb24gdGltZQorICAgICAgICBzZWxmLmNoa3N1bSA9IDAgICAgICAgICAjIGhlYWRlciBjaGVja3N1bQorICAgICAgICBzZWxmLnR5cGUgPSBSRUdUWVBFICAgICAjIG1lbWJlciB0eXBlCisgICAgICAgIHNlbGYubGlua25hbWUgPSAiIiAgICAgICMgbGluayBuYW1lCisgICAgICAgIHNlbGYudW5hbWUgPSAidXNlciIgICAgICMgdXNlciBuYW1lCisgICAgICAgIHNlbGYuZ25hbWUgPSAiZ3JvdXAiICAgICMgZ3JvdXAgbmFtZQorICAgICAgICBzZWxmLmRldm1ham9yID0gMCAgICAgICAjIGRldmljZSBtYWpvciBudW1iZXIKKyAgICAgICAgc2VsZi5kZXZtaW5vciA9IDAgICAgICAgIyBkZXZpY2UgbWlub3IgbnVtYmVyCisgICAgICAgIHNlbGYucHJlZml4ID0gIiIgICAgICAgICMgcHJlZml4IHRvIGZpbGVuYW1lIG9yIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWJvdXQgc3BhcnNlIGZpbGVzCiAKLSAgICAgICAgc2VsZi5vZmZzZXQgICA9IDAgICAgICAgICAgIyB0aGUgdGFyIGhlYWRlciBzdGFydHMgaGVyZQotICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gMCAgICAgICAjIHRoZSBmaWxlJ3MgZGF0YSBzdGFydHMgaGVyZQorICAgICAgICBzZWxmLm9mZnNldCA9IDAgICAgICAgICAjIHRoZSB0YXIgaGVhZGVyIHN0YXJ0cyBoZXJlCisgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSAwICAgICMgdGhlIGZpbGUncyBkYXRhIHN0YXJ0cyBoZXJlCiAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiPCVzICVyIGF0ICUjeD4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLHNlbGYubmFtZSxpZChzZWxmKSkKQEAgLTcxMCw5NSArODE3LDU3IEBACiAgICAgZGVmIGZyb21idWYoY2xzLCBidWYpOgogICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdCBmcm9tIGEgNTEyIGJ5dGUgc3RyaW5nIGJ1ZmZlci4KICAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihidWYpICE9IEJMT0NLU0laRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRydW5jYXRlZCBoZWFkZXIiKQorICAgICAgICBpZiBidWYuY291bnQoTlVMKSA9PSBCTE9DS1NJWkU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBoZWFkZXIiKQorCiAgICAgICAgIHRhcmluZm8gPSBjbHMoKQotICAgICAgICB0YXJpbmZvLm5hbWUgICA9IG50cyhidWZbMDoxMDBdKQotICAgICAgICB0YXJpbmZvLm1vZGUgICA9IGludChidWZbMTAwOjEwOF0sIDgpCi0gICAgICAgIHRhcmluZm8udWlkICAgID0gaW50KGJ1ZlsxMDg6MTE2XSw4KQotICAgICAgICB0YXJpbmZvLmdpZCAgICA9IGludChidWZbMTE2OjEyNF0sOCkKLQotICAgICAgICAjIFRoZXJlIGFyZSB0d28gcG9zc2libGUgY29kaW5ncyBmb3IgdGhlIHNpemUgZmllbGQgd2UKLSAgICAgICAgIyBoYXZlIHRvIGRpc2NyaW1pbmF0ZSwgc2VlIGNvbW1lbnQgaW4gdG9idWYoKSBiZWxvdy4KLSAgICAgICAgaWYgYnVmWzEyNF0gIT0gY2hyKDAyMDApOgotICAgICAgICAgICAgdGFyaW5mby5zaXplID0gbG9uZyhidWZbMTI0OjEzNl0sIDgpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB0YXJpbmZvLnNpemUgPSAwTAotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTEpOgotICAgICAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA8PD0gOAotICAgICAgICAgICAgICAgIHRhcmluZm8uc2l6ZSArPSBvcmQoYnVmWzEyNSArIGldKQotCi0gICAgICAgIHRhcmluZm8ubXRpbWUgID0gbG9uZyhidWZbMTM2OjE0OF0sIDgpCi0gICAgICAgIHRhcmluZm8uY2hrc3VtID0gaW50KGJ1ZlsxNDg6MTU2XSwgOCkKLSAgICAgICAgdGFyaW5mby50eXBlICAgPSBidWZbMTU2OjE1N10KLSAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IG50cyhidWZbMTU3OjI1N10pCi0gICAgICAgIHRhcmluZm8udW5hbWUgID0gbnRzKGJ1ZlsyNjU6Mjk3XSkKLSAgICAgICAgdGFyaW5mby5nbmFtZSAgPSBudHMoYnVmWzI5NzozMjldKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gaW50KGJ1ZlszMjk6MzM3XSwgOCkKLSAgICAgICAgICAgIHRhcmluZm8uZGV2bWlub3IgPSBpbnQoYnVmWzMzNzozNDVdLCA4KQotICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSB0YXJpbmZvLmRldm1ham9yID0gMAorICAgICAgICB0YXJpbmZvLmJ1ZiA9IGJ1ZgorICAgICAgICB0YXJpbmZvLm5hbWUgPSBidWZbMDoxMDBdLnJzdHJpcChOVUwpCisgICAgICAgIHRhcmluZm8ubW9kZSA9IG50aShidWZbMTAwOjEwOF0pCisgICAgICAgIHRhcmluZm8udWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKKyAgICAgICAgdGFyaW5mby5naWQgPSBudGkoYnVmWzExNjoxMjRdKQorICAgICAgICB0YXJpbmZvLnNpemUgPSBudGkoYnVmWzEyNDoxMzZdKQorICAgICAgICB0YXJpbmZvLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKKyAgICAgICAgdGFyaW5mby5jaGtzdW0gPSBudGkoYnVmWzE0ODoxNTZdKQorICAgICAgICB0YXJpbmZvLnR5cGUgPSBidWZbMTU2OjE1N10KKyAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGJ1ZlsxNTc6MjU3XS5yc3RyaXAoTlVMKQorICAgICAgICB0YXJpbmZvLnVuYW1lID0gYnVmWzI2NToyOTddLnJzdHJpcChOVUwpCisgICAgICAgIHRhcmluZm8uZ25hbWUgPSBidWZbMjk3OjMyOV0ucnN0cmlwKE5VTCkKKyAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IG50aShidWZbMzI5OjMzN10pCisgICAgICAgIHRhcmluZm8uZGV2bWlub3IgPSBudGkoYnVmWzMzNzozNDVdKQogICAgICAgICB0YXJpbmZvLnByZWZpeCA9IGJ1ZlszNDU6NTAwXQogCi0gICAgICAgICMgU29tZSBvbGQgdGFyIHByb2dyYW1zIHJlcHJlc2VudCBhIGRpcmVjdG9yeSBhcyBhIHJlZ3VsYXIKLSAgICAgICAgIyBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KLSAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIGFuZCB0YXJpbmZvLm5hbWUuZW5kc3dpdGgoIi8iKToKLSAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IERJUlRZUEUKLQotICAgICAgICAjIFRoZSBwcmVmaXggZmllbGQgaXMgdXNlZCBmb3IgZmlsZW5hbWVzID4gMTAwIGluCi0gICAgICAgICMgdGhlIFBPU0lYIHN0YW5kYXJkLgotICAgICAgICAjIG5hbWUgPSBwcmVmaXggKyAnLycgKyBuYW1lCi0gICAgICAgIGlmIHRhcmluZm8udHlwZSAhPSBHTlVUWVBFX1NQQVJTRToKLSAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IG5vcm1wYXRoKG9zLnBhdGguam9pbihudHModGFyaW5mby5wcmVmaXgpLCB0YXJpbmZvLm5hbWUpKQotCi0gICAgICAgICMgRGlyZWN0b3J5IG5hbWVzIHNob3VsZCBoYXZlIGEgJy8nIGF0IHRoZSBlbmQuCi0gICAgICAgIGlmIHRhcmluZm8uaXNkaXIoKToKLSAgICAgICAgICAgIHRhcmluZm8ubmFtZSArPSAiLyIKKyAgICAgICAgaWYgdGFyaW5mby5jaGtzdW0gbm90IGluIGNhbGNfY2hrc3VtcyhidWYpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBoZWFkZXIiKQogICAgICAgICByZXR1cm4gdGFyaW5mbwogCi0gICAgZGVmIHRvYnVmKHNlbGYpOgorICAgIGRlZiB0b2J1ZihzZWxmLCBwb3NpeD1GYWxzZSk6CiAgICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYmxvY2sgYXMgYSA1MTIgYnl0ZSBzdHJpbmcuCiAgICAgICAgICIiIgotICAgICAgICAjIFByZWZlciB0aGUgc2l6ZSB0byBiZSBlbmNvZGVkIGFzIDExIG9jdGFsIGFzY2lpIGRpZ2l0cwotICAgICAgICAjIHdoaWNoIGlzIHRoZSBtb3N0IHBvcnRhYmxlLiBJZiB0aGUgc2l6ZSBleGNlZWRzIHRoaXMKLSAgICAgICAgIyBsaW1pdCAoPj0gOCBHQiksIGVuY29kZSBpdCBhcyBhbiA4OC1iaXQgdmFsdWUgd2hpY2ggaXMKLSAgICAgICAgIyBhIEdOVSB0YXIgZmVhdHVyZS4KLSAgICAgICAgaWYgc2VsZi5zaXplIDw9IE1BWFNJWkVfTUVNQkVSOgotICAgICAgICAgICAgc2l6ZSA9ICIlMDExbyIgJSBzZWxmLnNpemUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHMgPSBzZWxmLnNpemUKLSAgICAgICAgICAgIHNpemUgPSAiIgotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTEpOgotICAgICAgICAgICAgICAgIHNpemUgPSBjaHIocyAmIDAzNzcpICsgc2l6ZQotICAgICAgICAgICAgICAgIHMgPj49IDgKLSAgICAgICAgICAgIHNpemUgPSBjaHIoMDIwMCkgKyBzaXplCisgICAgICAgIHBhcnRzID0gWworICAgICAgICAgICAgc3RuKHNlbGYubmFtZSwgMTAwKSwKKyAgICAgICAgICAgIGl0bihzZWxmLm1vZGUgJiAwNzc3NywgOCwgcG9zaXgpLAorICAgICAgICAgICAgaXRuKHNlbGYudWlkLCA4LCBwb3NpeCksCisgICAgICAgICAgICBpdG4oc2VsZi5naWQsIDgsIHBvc2l4KSwKKyAgICAgICAgICAgIGl0bihzZWxmLnNpemUsIDEyLCBwb3NpeCksCisgICAgICAgICAgICBpdG4oc2VsZi5tdGltZSwgMTIsIHBvc2l4KSwKKyAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKKyAgICAgICAgICAgIHNlbGYudHlwZSwKKyAgICAgICAgICAgIHN0bihzZWxmLmxpbmtuYW1lLCAxMDApLAorICAgICAgICAgICAgc3RuKE1BR0lDLCA2KSwKKyAgICAgICAgICAgIHN0bihWRVJTSU9OLCAyKSwKKyAgICAgICAgICAgIHN0bihzZWxmLnVuYW1lLCAzMiksCisgICAgICAgICAgICBzdG4oc2VsZi5nbmFtZSwgMzIpLAorICAgICAgICAgICAgaXRuKHNlbGYuZGV2bWFqb3IsIDgsIHBvc2l4KSwKKyAgICAgICAgICAgIGl0bihzZWxmLmRldm1pbm9yLCA4LCBwb3NpeCksCisgICAgICAgICAgICBzdG4oc2VsZi5wcmVmaXgsIDE1NSkKKyAgICAgICAgXQogCi0gICAgICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBjb250cmlidXRlZCBieSBEZXRsZWYgTGFubmVydC4KLSAgICAgICAgcGFydHMgPSBbXQotICAgICAgICBmb3IgdmFsdWUsIGZpZWxkc2l6ZSBpbiAoCi0gICAgICAgICAgICAgICAgKHNlbGYubmFtZSwgMTAwKSwKLSAgICAgICAgICAgICAgICAoIiUwN28iICUgKHNlbGYubW9kZSAmIDA3Nzc3KSwgOCksCi0gICAgICAgICAgICAgICAgKCIlMDdvIiAlIHNlbGYudWlkLCA4KSwKLSAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5naWQsIDgpLAotICAgICAgICAgICAgICAgIChzaXplLCAxMiksCi0gICAgICAgICAgICAgICAgKCIlMDExbyIgJSBzZWxmLm10aW1lLCAxMiksCi0gICAgICAgICAgICAgICAgKCIgICAgICAgICIsIDgpLAotICAgICAgICAgICAgICAgIChzZWxmLnR5cGUsIDEpLAotICAgICAgICAgICAgICAgIChzZWxmLmxpbmtuYW1lLCAxMDApLAotICAgICAgICAgICAgICAgIChNQUdJQywgNiksCi0gICAgICAgICAgICAgICAgKFZFUlNJT04sIDIpLAotICAgICAgICAgICAgICAgIChzZWxmLnVuYW1lLCAzMiksCi0gICAgICAgICAgICAgICAgKHNlbGYuZ25hbWUsIDMyKSwKLSAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5kZXZtYWpvciwgOCksCi0gICAgICAgICAgICAgICAgKCIlMDdvIiAlIHNlbGYuZGV2bWlub3IsIDgpLAotICAgICAgICAgICAgICAgIChzZWxmLnByZWZpeCwgMTU1KQotICAgICAgICAgICAgKToKLSAgICAgICAgICAgIGwgPSBsZW4odmFsdWUpCi0gICAgICAgICAgICBwYXJ0cy5hcHBlbmQodmFsdWVbOmZpZWxkc2l6ZV0gKyAoZmllbGRzaXplIC0gbCkgKiBOVUwpCi0KLSAgICAgICAgYnVmID0gIiIuam9pbihwYXJ0cykKLSAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW0oYnVmKQorICAgICAgICBidWYgPSBzdHJ1Y3QucGFjaygiJWRzIiAlIEJMT0NLU0laRSwgIiIuam9pbihwYXJ0cykpCisgICAgICAgIGNoa3N1bSA9IGNhbGNfY2hrc3VtcyhidWYpWzBdCiAgICAgICAgIGJ1ZiA9IGJ1Zls6MTQ4XSArICIlMDZvXDAiICUgY2hrc3VtICsgYnVmWzE1NTpdCi0gICAgICAgIGJ1ZiArPSAoQkxPQ0tTSVpFIC0gbGVuKGJ1ZikpICogTlVMCiAgICAgICAgIHNlbGYuYnVmID0gYnVmCiAgICAgICAgIHJldHVybiBidWYKIApAQCAtODU3LDcgKzkyNiw3IEBACiAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKIAogICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIikKICAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGUKICAgICAgICAgc2VsZi5tb2RlID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IifVttb2RlXQogCkBAIC04NzMsMTIgKzk0MiwxMiBAQAogICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAKICAgICAgICAgIyBJbml0IGRhdGFzdHJ1Y3R1cmVzCi0gICAgICAgIHNlbGYuY2xvc2VkICAgICAgPSBGYWxzZQotICAgICAgICBzZWxmLm1lbWJlcnMgICAgID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCi0gICAgICAgIHNlbGYuX2xvYWRlZCAgICAgPSBGYWxzZSAgICAjIGZsYWcgaWYgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQKLSAgICAgICAgc2VsZi5vZmZzZXQgICAgICA9IDBMICAgICAgICMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJjaGl2ZSBmaWxlCi0gICAgICAgIHNlbGYuaW5vZGVzICAgICAgPSB7fSAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyY2hpdmUgbWVtYmVycyBhbHJlYWR5IGFkZGVkCisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5tZW1iZXJzID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCisgICAgICAgIHNlbGYuX2xvYWRlZCA9IEZhbHNlICAgICMgZmxhZyBpZiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZAorICAgICAgICBzZWxmLm9mZnNldCA9IDBMICAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQorICAgICAgICBzZWxmLmlub2RlcyA9IHt9ICAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKIAogICAgICAgICBpZiBzZWxmLl9tb2RlID09ICJyIjoKICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCkBAIC05MzcsNyArMTAwNiw3IEBACiAgICAgICAgICIiIgogCiAgICAgICAgIGlmIG5vdCBuYW1lIGFuZCBub3QgZmlsZW9iajoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJub3RoaW5nIHRvIG9wZW4iCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJub3RoaW5nIHRvIG9wZW4iKQogCiAgICAgICAgIGlmIG1vZGUgaW4gKCJyIiwgInI6KiIpOgogICAgICAgICAgICAgIyBGaW5kIG91dCB3aGljaCAqb3BlbigpIGlzIGFwcHJvcHJpYXRlIGZvciBvcGVuaW5nIHRoZSBmaWxlLgpAQCAtOTQ3LDcgKzEwMTYsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCAiciIsIGZpbGVvYmopCiAgICAgICAgICAgICAgICAgZXhjZXB0IChSZWFkRXJyb3IsIENvbXByZXNzaW9uRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCAiZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIHN1Y2Nlc3NmdWxseSIKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIHN1Y2Nlc3NmdWxseSIpCiAKICAgICAgICAgZWxpZiAiOiIgaW4gbW9kZToKICAgICAgICAgICAgIGZpbGVtb2RlLCBjb21wdHlwZSA9IG1vZGUuc3BsaXQoIjoiLCAxKQpAQCAtOTU5LDcgKzEwMjgsNyBAQAogICAgICAgICAgICAgaWYgY29tcHR5cGUgaW4gY2xzLk9QRU5fTUVUSDoKICAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yLCAidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICVyIiAlIGNvbXB0eXBlCisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICVyIiAlIGNvbXB0eXBlKQogICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgZmlsZW1vZGUsIGZpbGVvYmopCiAKICAgICAgICAgZWxpZiAifCIgaW4gbW9kZToKQEAgLTk2OCw3ICsxMDM3LDcgQEAKICAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKIAogICAgICAgICAgICAgaWYgZmlsZW1vZGUgbm90IGluICJydyI6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKIAogICAgICAgICAgICAgdCA9IGNscyhuYW1lLCBmaWxlbW9kZSwKICAgICAgICAgICAgICAgICAgICAgX1N0cmVhbShuYW1lLCBmaWxlbW9kZSwgY29tcHR5cGUsIGZpbGVvYmosIGJ1ZnNpemUpKQpAQCAtOTc4LDE0ICsxMDQ3LDE0IEBACiAgICAgICAgIGVsaWYgbW9kZSBpbiAiYXciOgogICAgICAgICAgICAgcmV0dXJuIGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmopCiAKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVuZGlzY2VybmlibGUgbW9kZSIKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5kaXNjZXJuaWJsZSBtb2RlIikKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0YXJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgICIiIk9wZW4gdW5jb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQogICAgICAgICByZXR1cm4gY2xzKG5hbWUsIG1vZGUsIGZpbGVvYmopCiAKICAgICBAY2xhc3NtZXRob2QKQEAgLTk5NCwxMyArMTA2MywxMyBAQAogICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgICIiIgogICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJydyI6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibW9kZSBtdXN0IGJlICdyJyBvciAndyciCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IGd6aXAKICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUKICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgotICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvciwgImd6aXAgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiCisgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJnemlwIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKIAogICAgICAgICBwcmUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKICAgICAgICAgcHJlID0gb3MucGF0aC5iYXNlbmFtZShwcmUpCkBAIC0xMDIxLDcgKzEwOTAsNyBAQAogICAgICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaikKICAgICAgICAgICAgICkKICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsICJub3QgYSBnemlwIGZpbGUiCisgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGd6aXAgZmlsZSIpCiAgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICByZXR1cm4gdAogCkBAIC0xMDMxLDEyICsxMTAwLDEyIEBACiAgICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InIG9yICd3Jy4iCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3Jy4iKQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydCBiejIKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvciwgImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIKKyAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCiAKICAgICAgICAgcHJlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCiAgICAgICAgIHByZSA9IG9zLnBhdGguYmFzZW5hbWUocHJlKQpAQCAtMTA0NywxMiArMTExNiwxNCBAQAogICAgICAgICB0YXJuYW1lID0gcHJlICsgZXh0CiAKICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJubyBzdXBwb3J0IGZvciBleHRlcm5hbCBmaWxlIG9iamVjdHMiCisgICAgICAgICAgICBmaWxlb2JqID0gX0JaMlByb3h5KGZpbGVvYmosIG1vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlb2JqID0gYnoyLkJaMkZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbD1jb21wcmVzc2xldmVsKQogCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHQgPSBjbHMudGFyb3Blbih0YXJuYW1lLCBtb2RlLCBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpKQorICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKHRhcm5hbWUsIG1vZGUsIGZpbGVvYmopCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCAibm90IGEgYnppcDIgZmlsZSIKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgYnppcDIgZmlsZSIpCiAgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICByZXR1cm4gdAogCkBAIC0xMDk0LDcgKzExNjUsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgdGFyaW5mbyA9IHNlbGYuX2dldG1lbWJlcihuYW1lKQogICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6Ci0gICAgICAgICAgICByYWlzZSBLZXlFcnJvciwgImZpbGVuYW1lICVyIG5vdCBmb3VuZCIgJSBuYW1lCisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiZmlsZW5hbWUgJXIgbm90IGZvdW5kIiAlIG5hbWUpCiAgICAgICAgIHJldHVybiB0YXJpbmZvCiAKICAgICBkZWYgZ2V0bWVtYmVycyhzZWxmKToKQEAgLTEzMTMsMTUgKzEzODQsMTQgQEAKIAogICAgICAgICBpZiB0YXJpbmZvLnNpemUgPiBNQVhTSVpFX01FTUJFUjoKICAgICAgICAgICAgIGlmIHNlbGYucG9zaXg6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImZpbGUgaXMgdG9vIGxhcmdlICg+PSA4IEdCKSIKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmaWxlIGlzIHRvbyBsYXJnZSAoPj0gOCBHQikiKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IENyZWF0ZWQgR05VIHRhciBsYXJnZWZpbGUgaGVhZGVyIikKIAogCiAgICAgICAgIGlmIGxlbih0YXJpbmZvLmxpbmtuYW1lKSA+IExFTkdUSF9MSU5LOgogICAgICAgICAgICAgaWYgc2VsZi5wb3NpeDoKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibGlua25hbWUgaXMgdG9vIGxvbmcgKD4lZCkiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChMRU5HVEhfTElOSykKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJsaW5rbmFtZSBpcyB0b28gbG9uZyAoPiVkKSIgJSAoTEVOR1RIX0xJTkspKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLl9jcmVhdGVfZ251bG9uZyh0YXJpbmZvLmxpbmtuYW1lLCBHTlVUWVBFX0xPTkdMSU5LKQogICAgICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSB0YXJpbmZvLmxpbmtuYW1lWzpMRU5HVEhfTElOSyAtMV0KQEAgLTEzMzcsOCArMTQwNyw3IEBACiAgICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KIAogICAgICAgICAgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJuYW1lIGlzIHRvbyBsb25nICg+JWQpIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKExFTkdUSF9OQU1FKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuYW1lIGlzIHRvbyBsb25nICg+JWQpIiAlIChMRU5HVEhfTkFNRSkpCiAKICAgICAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgICA9IG5hbWUKICAgICAgICAgICAgICAgICB0YXJpbmZvLnByZWZpeCA9IHByZWZpeApAQCAtMTM0Nyw3ICsxNDE2LDcgQEAKICAgICAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgPSB0YXJpbmZvLm5hbWVbOkxFTkdUSF9OQU1FIC0gMV0KICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IENyZWF0ZWQgR05VIHRhciBleHRlbnNpb24gTE9OR05BTUUiKQogCi0gICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSh0YXJpbmZvLnRvYnVmKCkpCisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSh0YXJpbmZvLnRvYnVmKHNlbGYucG9zaXgpKQogICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKIAogICAgICAgICAjIElmIHRoZXJlJ3MgZGF0YSB0byBmb2xsb3csIGFwcGVuZCBpdC4KQEAgLTE0NjQsNyArMTUzMyw3IEBACiAgICAgICAgICAgICAgICAgIyBBIHNtYWxsIGJ1dCB1Z2x5IHdvcmthcm91bmQgZm9yIHRoZSBjYXNlIHRoYXQgc29tZW9uZSB0cmllcwogICAgICAgICAgICAgICAgICMgdG8gZXh0cmFjdCBhIChzeW0pbGluayBhcyBhIGZpbGUtb2JqZWN0IGZyb20gYSBub24tc2Vla2FibGUKICAgICAgICAgICAgICAgICAjIHN0cmVhbSBvZiB0YXIgYmxvY2tzLgotICAgICAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yLCAiY2Fubm90IGV4dHJhY3QgKHN5bSlsaW5rIGFzIGZpbGUgb2JqZWN0IgorICAgICAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yKCJjYW5ub3QgZXh0cmFjdCAoc3ltKWxpbmsgYXMgZmlsZSBvYmplY3QiKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIEEgKHN5bSlsaW5rJ3MgZmlsZSBvYmplY3QgaXMgaXRzIHRhcmdldCdzIGZpbGUgb2JqZWN0LgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dHJhY3RmaWxlKHNlbGYuX2dldG1lbWJlcih0YXJpbmZvLmxpbmtuYW1lLApAQCAtMTU2NCwxMyArMTYzMywxMyBAQAogICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWtmaWZvIik6CiAgICAgICAgICAgICBvcy5ta2ZpZm8odGFyZ2V0cGF0aCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImZpZm8gbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iCisgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImZpZm8gbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iKQogCiAgICAgZGVmIG1ha2VkZXYoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgICIiIk1ha2UgYSBjaGFyYWN0ZXIgb3IgYmxvY2sgZGV2aWNlIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICAiIiIKICAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJta25vZCIpIG9yIG5vdCBoYXNhdHRyKG9zLCAibWFrZWRldiIpOgotICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yLCAic3BlY2lhbCBkZXZpY2VzIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIgorICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJzcGVjaWFsIGRldmljZXMgbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0iKQogCiAgICAgICAgIG1vZGUgPSB0YXJpbmZvLm1vZGUKICAgICAgICAgaWYgdGFyaW5mby5pc2JsaygpOgpAQCAtMTYwNiw3ICsxNjc1LDcgQEAKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihsaW5rcGF0aCwgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgImxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQiCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQiKQogCiAgICAgZGVmIGNob3duKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICAiIiJTZXQgb3duZXIgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KQEAgLTE2MzQsNyArMTcwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAib3MyZW14IjoKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNob3duKHRhcmdldHBhdGgsIHUsIGcpCiAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKLSAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IsICJjb3VsZCBub3QgY2hhbmdlIG93bmVyIgorICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiY291bGQgbm90IGNoYW5nZSBvd25lciIpCiAKICAgICBkZWYgY2htb2Qoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgICIiIlNldCBmaWxlIHBlcm1pc3Npb25zIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCkBAIC0xNjQzLDcgKzE3MTIsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldHBhdGgsIHRhcmluZm8ubW9kZSkKICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgotICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImNvdWxkIG5vdCBjaGFuZ2UgbW9kZSIKKyAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2UgbW9kZSIpCiAKICAgICBkZWYgdXRpbWUoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgICIiIlNldCBtb2RpZmljYXRpb24gdGltZSBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgpAQCAtMTY1NywxMCArMTcyNiw5IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9zLnV0aW1lKHRhcmdldHBhdGgsICh0YXJpbmZvLm10aW1lLCB0YXJpbmZvLm10aW1lKSkKICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6Ci0gICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IsICJjb3VsZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIgorICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIikKIAogICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgYXMgYSBUYXJJbmZvIG9iamVjdCwgd2hlbgogICAgICAgICAgICBUYXJGaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZy4gUmV0dXJuIE5vbmUgaWYgdGhlcmUgaXMgbm8gbW9yZQpAQCAtMTY3OCw3MCArMTc0Niw5MSBAQAogICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdGFyaW5mbyA9IFRhckluZm8uZnJvbWJ1ZihidWYpCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKworICAgICAgICAgICAgICAgICMgV2Ugc2hvdWxkbid0IHJlbHkgb24gdGhpcyBjaGVja3N1bSwgYmVjYXVzZSBzb21lIHRhciBwcm9ncmFtcworICAgICAgICAgICAgICAgICMgY2FsY3VsYXRlIGl0IGRpZmZlcmVudGx5IGFuZCBpdCBpcyBtZXJlbHkgdmFsaWRhdGluZyB0aGUKKyAgICAgICAgICAgICAgICAjIGhlYWRlciBibG9jay4gV2UgY291bGQganVzdCBhcyB3ZWxsIHNraXAgdGhpcyBwYXJ0LCB3aGljaCB3b3VsZAorICAgICAgICAgICAgICAgICMgaGF2ZSBhIHNsaWdodCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UuLi4KKyAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogQmFkIENoZWNrc3VtICVyIiAlIHRhcmluZm8ubmFtZSkKKworICAgICAgICAgICAgICAgICMgU2V0IHRoZSBUYXJJbmZvIG9iamVjdCdzIG9mZnNldCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICAjIFRhckZpbGUgYW5kIHNldCBzZWxmLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzCisgICAgICAgICAgICAgICAgIyBzaG91bGQgYmVnaW4uCisgICAgICAgICAgICAgICAgdGFyaW5mby5vZmZzZXQgPSBzZWxmLm9mZnNldAorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQorCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYucHJvY19tZW1iZXIodGFyaW5mbykKKworICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CiAgICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfemVyb3M6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGJ1Zi5jb3VudChOVUwpID09IEJMT0NLU0laRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkaiA9ICJlbXB0eSIKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkaiA9ICJpbnZhbGlkIgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6ICVzIGJsb2NrIiAlIChzZWxmLm9mZnNldCwgYWRqKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiBlbXB0eSBvciBpbnZhbGlkIGJsb2NrOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYub2Zmc2V0LCBlKSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgIyBCbG9jayBpcyBlbXB0eSBvciB1bnJlYWRhYmxlLgogICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGUgZmlyc3QgYmxvY2sgaXMgaW52YWxpZC4gVGhhdCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgIyBsb29rIGxpa2UgYSB0YXIgYXJjaGl2ZSB3ZSBjYW4gaGFuZGxlLgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCJlbXB0eSwgdW5yZWFkYWJsZSBvciBjb21wcmVzc2VkIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImVtcHR5LCB1bnJlYWRhYmxlIG9yIGNvbXByZXNzZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlOiAlcyIgJSBlKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgYnJlYWsKIAotICAgICAgICAjIFdlIHNob3VsZG4ndCByZWx5IG9uIHRoaXMgY2hlY2tzdW0sIGJlY2F1c2Ugc29tZSB0YXIgcHJvZ3JhbXMKLSAgICAgICAgIyBjYWxjdWxhdGUgaXQgZGlmZmVyZW50bHkgYW5kIGl0IGlzIG1lcmVseSB2YWxpZGF0aW5nIHRoZQotICAgICAgICAjIGhlYWRlciBibG9jay4gV2UgY291bGQganVzdCBhcyB3ZWxsIHNraXAgdGhpcyBwYXJ0LCB3aGljaCB3b3VsZAotICAgICAgICAjIGhhdmUgYSBzbGlnaHQgZWZmZWN0IG9uIHBlcmZvcm1hbmNlLi4uCi0gICAgICAgIGlmIHRhcmluZm8uY2hrc3VtICE9IGNhbGNfY2hrc3VtKGJ1Zik6Ci0gICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IEJhZCBDaGVja3N1bSAlciIgJSB0YXJpbmZvLm5hbWUpCisgICAgICAgICMgU29tZSBvbGQgdGFyIHByb2dyYW1zIHJlcHJlc2VudCBhIGRpcmVjdG9yeSBhcyBhIHJlZ3VsYXIKKyAgICAgICAgIyBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KKyAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIGFuZCB0YXJpbmZvLm5hbWUuZW5kc3dpdGgoIi8iKToKKyAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IERJUlRZUEUKIAotICAgICAgICAjIFNldCB0aGUgVGFySW5mbyBvYmplY3QncyBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCi0gICAgICAgICMgVGFyRmlsZSBhbmQgc2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MKLSAgICAgICAgIyBzaG91bGQgYmVnaW4uCi0gICAgICAgIHRhcmluZm8ub2Zmc2V0ID0gc2VsZi5vZmZzZXQKLSAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgICMgVGhlIHByZWZpeCBmaWVsZCBpcyB1c2VkIGZvciBmaWxlbmFtZXMgPiAxMDAgaW4KKyAgICAgICAgIyB0aGUgUE9TSVggc3RhbmRhcmQuCisgICAgICAgICMgbmFtZSA9IHByZWZpeCArICcvJyArIG5hbWUKKyAgICAgICAgdGFyaW5mby5uYW1lID0gbm9ybXBhdGgob3MucGF0aC5qb2luKHRhcmluZm8ucHJlZml4LnJzdHJpcChOVUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5uYW1lKSkKIAotICAgICAgICAjIENoZWNrIGlmIHRoZSBUYXJJbmZvIG9iamVjdCBoYXMgYSB0eXBlZmxhZyBmb3Igd2hpY2ggYSBjYWxsYmFjawotICAgICAgICAjIG1ldGhvZCBpcyByZWdpc3RlcmVkIGluIHRoZSBUWVBFX01FVEguIElmIHNvLCB0aGVuIGNhbGwgaXQuCi0gICAgICAgIGlmIHRhcmluZm8udHlwZSBpbiBzZWxmLlRZUEVfTUVUSDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLlRZUEVfTUVUSFt0YXJpbmZvLnR5cGVdKHNlbGYsIHRhcmluZm8pCi0KLSAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBvciB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKLSAgICAgICAgICAgICMgU2tpcCB0aGUgZm9sbG93aW5nIGRhdGEgYmxvY2tzLgotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2VsZi5fYmxvY2sodGFyaW5mby5zaXplKQorICAgICAgICAjIERpcmVjdG9yeSBuYW1lcyBzaG91bGQgaGF2ZSBhICcvJyBhdCB0aGUgZW5kLgorICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CisgICAgICAgICAgICB0YXJpbmZvLm5hbWUgKz0gIi8iCiAKICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQogICAgICAgICByZXR1cm4gdGFyaW5mbwogCiAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIyBCZWxvdyBhcmUgc29tZSBtZXRob2RzIHdoaWNoIGFyZSBjYWxsZWQgZm9yIHNwZWNpYWwgdHlwZWZsYWdzIGluIHRoZQotICAgICMgbmV4dCgpIG1ldGhvZCwgZS5nLiBmb3IgdW53cmFwcGluZyBHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgYmxvY2tzLiBUaGV5Ci0gICAgIyBhcmUgcmVnaXN0ZXJlZCBpbiBUWVBFX01FVEggYmVsb3cuIFlvdSBjYW4gcmVnaXN0ZXIgeW91ciBvd24gbWV0aG9kcwotICAgICMgd2l0aCB0aGlzIG1hcHBpbmcuCi0gICAgIyBBIHJlZ2lzdGVyZWQgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGEgVGFySW5mbyBvYmplY3QgYXMgb25seSBhcmd1bWVudC4KLSAgICAjCi0gICAgIyBEdXJpbmcgaXRzIGV4ZWN1dGlvbiB0aGUgbWV0aG9kIE1VU1QgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOgotICAgICMgMS4gc2V0IHRhcmluZm8ub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKLSAgICAjICAgIGlmIHRoZXJlIGlzIGRhdGEgdG8gZm9sbG93LgotICAgICMgMi4gc2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAorICAgICMgVGhlIGZvbGxvd2luZyBhcmUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGEKKyAgICAjIG1lbWJlci4gVGhlIGVudHJ5IHBvaW50IGlzIHByb2NfbWVtYmVyKCkgd2hpY2ggaXMgY2FsbGVkIHdpdGggYSBUYXJJbmZvCisgICAgIyBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBoZWFkZXIgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBvZmZzZXQuIFRoZQorICAgICMgcHJvY19tZW1iZXIoKSBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcyB0byBhZGQgY3VzdG9tCisgICAgIyBwcm9jXyooKSBtZXRob2RzLiBBIHByb2NfKigpIG1ldGhvZCBNVVNUIGltcGxlbWVudCB0aGUgZm9sbG93aW5nCisgICAgIyBvcGVyYXRpb25zOgorICAgICMgMS4gU2V0IHRhcmluZm8ub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKKyAgICAjICAgIGlmIHRoZXJlIGlzIGRhdGEgdGhhdCBmb2xsb3dzLgorICAgICMgMi4gU2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAogICAgICMgICAgYmVnaW4uCi0gICAgIyAzLiBhcHBlbmQgdGhlIHRhcmluZm8gb2JqZWN0IHRvIHNlbGYubWVtYmVycywgaWYgaXQgaXMgc3VwcG9zZWQgdG8gYXBwZWFyCi0gICAgIyAgICBhcyBhIG1lbWJlciBvZiB0aGUgVGFyRmlsZSBvYmplY3QuCi0gICAgIyA0LiByZXR1cm4gdGFyaW5mbyBvciBhbm90aGVyIHZhbGlkIFRhckluZm8gb2JqZWN0LgorICAgICMgMy4gUmV0dXJuIHRhcmluZm8gb3IgYW5vdGhlciB2YWxpZCBUYXJJbmZvIG9iamVjdC4KKyAgICBkZWYgcHJvY19tZW1iZXIoc2VsZiwgdGFyaW5mbyk6CisgICAgICAgICIiIkNob29zZSB0aGUgcmlnaHQgcHJvY2Vzc2luZyBtZXRob2QgZm9yIHRhcmluZm8gZGVwZW5kaW5nCisgICAgICAgICAgIG9uIGl0cyB0eXBlIGFuZCBjYWxsIGl0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdGFyaW5mby50eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2NfZ251bG9uZyh0YXJpbmZvKQorICAgICAgICBlbGlmIHRhcmluZm8udHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2Nfc3BhcnNlKHRhcmluZm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jX2J1aWx0aW4odGFyaW5mbykKKworICAgIGRlZiBwcm9jX2J1aWx0aW4oc2VsZiwgdGFyaW5mbyk6CisgICAgICAgICIiIlByb2Nlc3MgYSBidWlsdGluIHR5cGUgbWVtYmVyIG9yIGFuIHVua25vd24gbWVtYmVyCisgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHRhcmluZm8ub2Zmc2V0X2RhdGEgPSBzZWxmLm9mZnNldAorICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCkgb3IgdGFyaW5mby50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CisgICAgICAgICAgICAjIFNraXAgdGhlIGZvbGxvd2luZyBkYXRhIGJsb2Nrcy4KKyAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHRhcmluZm8uc2l6ZSkKKyAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogICAgIGRlZiBwcm9jX2dudWxvbmcoc2VsZiwgdGFyaW5mbyk6Ci0gICAgICAgICIiIkV2YWx1YXRlIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCisgICAgICAgICIiIlByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGhvbGQgYSBHTlUgbG9uZ25hbWUKICAgICAgICAgICAgb3IgbG9uZ2xpbmsgbWVtYmVyLgogICAgICAgICAiIiIKICAgICAgICAgYnVmID0gIiIKQEAgLTE3NTIsMjEgKzE4NDEsMjcgQEAKICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogICAgICAgICAgICAgY291bnQgLT0gQkxPQ0tTSVpFCiAKLSAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIKLSAgICAgICAgbmV4dCA9IHNlbGYubmV4dCgpCisgICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyIGFuZCBwcm9jZXNzIGl0LgorICAgICAgICBiID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQorICAgICAgICB0ID0gVGFySW5mby5mcm9tYnVmKGIpCisgICAgICAgIHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgIG5leHQgPSBzZWxmLnByb2NfbWVtYmVyKHQpCiAKKyAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgbmV4dCBoZWFkZXIgd2l0aAorICAgICAgICAjIHRoZSBsb25nbmFtZSBpbmZvcm1hdGlvbi4KICAgICAgICAgbmV4dC5vZmZzZXQgPSB0YXJpbmZvLm9mZnNldAogICAgICAgICBpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTkFNRToKLSAgICAgICAgICAgIG5leHQubmFtZSA9IG50cyhidWYpCisgICAgICAgICAgICBuZXh0Lm5hbWUgPSBidWYucnN0cmlwKE5VTCkKICAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTElOSzoKLSAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBudHMoYnVmKQorICAgICAgICAgICAgbmV4dC5saW5rbmFtZSA9IGJ1Zi5yc3RyaXAoTlVMKQogCiAgICAgICAgIHJldHVybiBuZXh0CiAKICAgICBkZWYgcHJvY19zcGFyc2Uoc2VsZiwgdGFyaW5mbyk6Ci0gICAgICAgICIiIkFuYWx5emUgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCisgICAgICAgICIiIlByb2Nlc3MgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCiAgICAgICAgICIiIgotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKCkKKyAgICAgICAgYnVmID0gdGFyaW5mby5idWYKICAgICAgICAgc3AgPSBfcmluZ2J1ZmZlcigpCiAgICAgICAgIHBvcyA9IDM4NgogICAgICAgICBsYXN0cG9zID0gMEwKQEAgLTE3NzUsOCArMTg3MCw4IEBACiAgICAgICAgICMgZmlyc3QgaGVhZGVyLgogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNCk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gaW50KGJ1Zltwb3M6cG9zICsgMTJdLCA4KQotICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gaW50KGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0sIDgpCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQorICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKQEAgLTE3ODcsNyArMTg4Miw3IEBACiAgICAgICAgICAgICBwb3MgKz0gMjQKIAogICAgICAgICBpc2V4dGVuZGVkID0gb3JkKGJ1Zls0ODJdKQotICAgICAgICBvcmlnc2l6ZSA9IGludChidWZbNDgzOjQ5NV0sIDgpCisgICAgICAgIG9yaWdzaXplID0gbnRpKGJ1Zls0ODM6NDk1XSkKIAogICAgICAgICAjIElmIHRoZSBpc2V4dGVuZGVkIGZsYWcgaXMgZ2l2ZW4sCiAgICAgICAgICMgdGhlcmUgYXJlIGV4dHJhIGhlYWRlcnMgdG8gcHJvY2Vzcy4KQEAgLTE3OTcsOCArMTg5Miw4IEBACiAgICAgICAgICAgICBwb3MgPSAwCiAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gaW50KGJ1Zltwb3M6cG9zICsgMTJdLCA4KQotICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IGludChidWZbcG9zICsgMTI6cG9zICsgMjRdLCA4KQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCisgICAgICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCiAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKQEAgLTE4MTgsMTcgKzE5MTMsMTEgQEAKICAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2VsZi5fYmxvY2sodGFyaW5mby5zaXplKQogICAgICAgICB0YXJpbmZvLnNpemUgPSBvcmlnc2l6ZQogCi0gICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KKyAgICAgICAgIyBDbGVhciB0aGUgcHJlZml4IGZpZWxkIHNvIHRoYXQgaXQgaXMgbm90IHVzZWQKKyAgICAgICAgIyBhcyBhIHBhdGhuYW1lIGluIG5leHQoKS4KKyAgICAgICAgdGFyaW5mby5wcmVmaXggPSAiIgogCi0gICAgIyBUaGUgdHlwZSBtYXBwaW5nIGZvciB0aGUgbmV4dCgpIG1ldGhvZC4gVGhlIGtleXMgYXJlIHNpbmdsZSBjaGFyYWN0ZXIKLSAgICAjIHN0cmluZ3MsIHRoZSB0eXBlZmxhZy4gVGhlIHZhbHVlcyBhcmUgbWV0aG9kcyB3aGljaCBhcmUgY2FsbGVkIHdoZW4KLSAgICAjIG5leHQoKSBlbmNvdW50ZXJzIHN1Y2ggYSB0eXBlZmxhZy4KLSAgICBUWVBFX01FVEggPSB7Ci0gICAgICAgIEdOVVRZUEVfTE9OR05BTUU6IHByb2NfZ251bG9uZywKLSAgICAgICAgR05VVFlQRV9MT05HTElOSzogcHJvY19nbnVsb25nLAotICAgICAgICBHTlVUWVBFX1NQQVJTRTogICBwcm9jX3NwYXJzZQotICAgIH0KKyAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICMgTGl0dGxlIGhlbHBlciBtZXRob2RzOgpAQCAtMTg3Myw5ICsxOTYyLDkgQEAKICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gVGFyRmlsZSdzIG1vZGUuCiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKLSAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICIlcyBpcyBjbG9zZWQiICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKICAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5fbW9kZSBub3QgaW4gbW9kZToKLSAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJiYWQgb3BlcmF0aW9uIGZvciBtb2RlICVyIiAlIHNlbGYuX21vZGUKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImJhZCBvcGVyYXRpb24gZm9yIG1vZGUgJXIiICUgc2VsZi5fbW9kZSkKIAogICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgIiIiUHJvdmlkZSBhbiBpdGVyYXRvciBvYmplY3QuCkBAIC0yMDExLDcgKzIxMDAsNyBAQAogICAgICAgICBlbGlmIGNvbXByZXNzaW9uID09IFRBUl9HWklQUEVEOgogICAgICAgICAgICAgc2VsZi50YXJmaWxlID0gVGFyRmlsZS5nem9wZW4oZmlsZSwgbW9kZSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIGNvbnN0YW50IgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBjb21wcmVzc2lvbiBjb25zdGFudCIpCiAgICAgICAgIGlmIG1vZGVbMDoxXSA9PSAiciI6CiAgICAgICAgICAgICBtZW1iZXJzID0gc2VsZi50YXJmaWxlLmdldG1lbWJlcnMoKQogICAgICAgICAgICAgZm9yIG0gaW4gbWVtYmVyczoK