ZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXggYi9Eb2MvbGliL2xpYnRhcmZpbGUudGV4CmluZGV4IGE0OTk0MmIuLmNhNmU2NWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGFyZmlsZS50ZXgKKysrIGIvRG9jL2xpYi9saWJ0YXJmaWxlLnRleApAQCAtMzM0LDggKzMzNCwxMiBAQAogICAgIENyZWF0ZSBhbmQgcmV0dXJuIGEgXGNsYXNze1RhckluZm99IG9iamVjdCBmcm9tIGEgc3RyaW5nIGJ1ZmZlci4KIFxlbmR7bWV0aG9kZGVzY30KIAotXGJlZ2lue21ldGhvZGRlc2N9e3RvYnVmfXt9CitcYmVnaW57bWV0aG9kZGVzY317dG9idWZ9e3Bvc2l4fQogICAgIENyZWF0ZSBhIHN0cmluZyBidWZmZXIgZnJvbSBhIFxjbGFzc3tUYXJJbmZvfSBvYmplY3QuCisgICAgU2VlIFxjbGFzc3tUYXJGaWxlfSdzIFxtZW1iZXJ7cG9zaXh9IGF0dHJpYnV0ZSBmb3IgaW5mb3JtYXRpb24KKyAgICBvbiB0aGUgXHZhcntwb3NpeH0gYXJndW1lbnQuIEl0IGRlZmF1bHRzIHRvIFxjb25zdGFudHtGYWxzZX0uCisKKyAgICBcdmVyc2lvbmFkZGVkW1RoZSBcdmFye3Bvc2l4fSBwYXJhbWV0ZXJdezIuNX0KIFxlbmR7bWV0aG9kZGVzY30KIAogQSBcY29kZXtUYXJJbmZvfSBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgcHVibGljIGRhdGEgYXR0cmlidXRlczoKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggMGIzZDQ3Ny4uODk4N2NhNyAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTMzLDcgKzMzLDcgQEAKIF9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbiQiCiAjICRTb3VyY2UkCiAKLXZlcnNpb24gICAgID0gIjAuNi40IgordmVyc2lvbiAgICAgPSAiMC44LjAiCiBfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3TkYmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCiBfX2RhdGVfXyAgICA9ICIkRGF0ZSQiCiBfX2N2c2lkX18gICA9ICIkSWQkIgpAQCAtMTM3LDE2ICsxMzcsNjQgQEAKICAgICAiIiIKICAgICByZXR1cm4gcy5yc3RyaXAoTlVMKQogCi1kZWYgY2FsY19jaGtzdW0oYnVmKToKLSAgICAiIiJDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGZvciBhIG1lbWJlcidzIGhlYWRlci4gSXQncyBhIHNpbXBsZSBhZGRpdGlvbgotICAgICAgIG9mIGFsbCBieXRlcywgdHJlYXRpbmcgdGhlIGNoa3N1bSBmaWVsZCBhcyBpZiBmaWxsZWQgd2l0aCBzcGFjZXMuCi0gICAgICAgYnVmIGlzIGEgNTEyIGJ5dGUgbG9uZyBzdHJpbmcgYnVmZmVyIHdoaWNoIGhvbGRzIHRoZSBoZWFkZXIuCitkZWYgc3RuKHMsIGxlbmd0aCk6CisgICAgIiIiQ29udmVydCBhIHB5dGhvbiBzdHJpbmcgdG8gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlci4KICAgICAiIiIKLSAgICBjaGsgPSAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNoa3N1bSBmaWVsZCBpcyB0cmVhdGVkIGFzIGJsYW5rcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvIHRoZSBpbml0aWFsIHZhbHVlIGlzIDggKiBvcmQoIiAiKQotICAgIGZvciBjIGluIGJ1Zls6MTQ4XTogY2hrICs9IG9yZChjKSAgICMgc3VtIHVwIGFsbCBieXRlcyBiZWZvcmUgY2hrc3VtCi0gICAgZm9yIGMgaW4gYnVmWzE1NjpdOiBjaGsgKz0gb3JkKGMpICAgIyBzdW0gdXAgYWxsIGJ5dGVzIGFmdGVyIGNoa3N1bQotICAgIHJldHVybiBjaGsKKyAgICByZXR1cm4gc3RydWN0LnBhY2soIiVkcyIgJSAobGVuZ3RoIC0gMSksIHMpICsgTlVMCisKK2RlZiBudGkocyk6CisgICAgIiIiQ29udmVydCBhIG51bWJlciBmaWVsZCB0byBhIHB5dGhvbiBudW1iZXIuCisgICAgIiIiCisgICAgIyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBudW1iZXIgZmllbGQsIHNlZQorICAgICMgaXRuKCkgYmVsb3cuCisgICAgaWYgc1swXSAhPSBjaHIoMDIwMCk6CisgICAgICAgIG4gPSBpbnQocy5yc3RyaXAoTlVMKSBvciAiMCIsIDgpCisgICAgZWxzZToKKyAgICAgICAgbiA9IDBMCisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4ocykgLSAxKToKKyAgICAgICAgICAgIG4gPDw9IDgKKyAgICAgICAgICAgIG4gKz0gb3JkKHNbaSArIDFdKQorICAgIHJldHVybiBuCisKK2RlZiBpdG4obiwgZGlnaXRzPTgsIHBvc2l4PUZhbHNlKToKKyAgICAiIiJDb252ZXJ0IGEgcHl0aG9uIG51bWJlciB0byBhIG51bWJlciBmaWVsZC4KKyAgICAiIiIKKyAgICAjIFBPU0lYIDEwMDMuMS0xOTg4IHJlcXVpcmVzIG51bWJlcnMgdG8gYmUgZW5jb2RlZCBhcyBhIHN0cmluZyBvZgorICAgICMgb2N0YWwgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbnVsbC1ieXRlLCB0aGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8KKyAgICAjICg4KiooZGlnaXRzLTEpKS0xLiBHTlUgdGFyIGFsbG93cyBzdG9yaW5nIG51bWJlcnMgZ3JlYXRlciB0aGFuCisgICAgIyB0aGF0IGlmIG5lY2Vzc2FyeS4gQSBsZWFkaW5nIDAyMDAgYnl0ZSBpbmRpY2F0ZXMgdGhpcyBwYXJ0aWN1bGFyCisgICAgIyBlbmNvZGluZywgdGhlIGZvbGxvd2luZyBkaWdpdHMtMSBieXRlcyBhcmUgYSBiaWctZW5kaWFuCisgICAgIyByZXByZXNlbnRhdGlvbi4gVGhpcyBhbGxvd3MgdmFsdWVzIHVwIHRvICgyNTYqKihkaWdpdHMtMSkpLTEuCisgICAgaWYgMCA8PSBuIDwgOCAqKiAoZGlnaXRzIC0gMSk6CisgICAgICAgIHMgPSAiJTAqbyIgJSAoZGlnaXRzIC0gMSwgbikgKyBOVUwKKyAgICBlbHNlOgorICAgICAgICBpZiBwb3NpeDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJvdmVyZmxvdyBpbiBudW1iZXIgZmllbGQiCisKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICAjIFhYWCBXZSBtaW1pYyBHTlUgdGFyJ3MgYmVoYXZpb3VyIHdpdGggbmVnYXRpdmUgbnVtYmVycywKKyAgICAgICAgICAgICMgdGhpcyBjb3VsZCByYWlzZSBPdmVyZmxvd0Vycm9yLgorICAgICAgICAgICAgbiA9IHN0cnVjdC51bnBhY2soIkwiLCBzdHJ1Y3QucGFjaygibCIsIG4pKVswXQorCisgICAgICAgIHMgPSAiIgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoZGlnaXRzIC0gMSk6CisgICAgICAgICAgICBzID0gY2hyKG4gJiAwMzc3KSArIHMKKyAgICAgICAgICAgIG4gPj49IDgKKyAgICAgICAgcyA9IGNocigwMjAwKSArIHMKKyAgICByZXR1cm4gcworCitkZWYgY2FsY19jaGtzdW1zKGJ1Zik6CisgICAgIiIiQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBmb3IgYSBtZW1iZXIncyBoZWFkZXIgYnkgc3VtbWluZyB1cCBhbGwKKyAgICAgICBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3IgdGhlIGNoa3N1bSBmaWVsZCB3aGljaCBpcyB0cmVhdGVkIGFzIGlmCisgICAgICAgaXQgd2FzIGZpbGxlZCB3aXRoIHNwYWNlcy4gQWNjb3JkaW5nIHRvIHRoZSBHTlUgdGFyIHNvdXJjZXMsCisgICAgICAgc29tZSB0YXJzIChTdW4gYW5kIE5lWFQpIGNhbGN1bGF0ZSBjaGtzdW0gd2l0aCBzaWduZWQgY2hhciwKKyAgICAgICB3aGljaCB3aWxsIGJlIGRpZmZlcmVudCBpZiB0aGVyZSBhcmUgY2hhcnMgaW4gdGhlIGJ1ZmZlciB3aXRoCisgICAgICAgdGhlIGhpZ2ggYml0IHNldC4gU28gd2UgY2FsY3VsYXRlIHR3byBjaGVja3N1bXMsIHVuc2lnbmVkIGFuZAorICAgICAgIHNpZ25lZC4KKyAgICAiIiIKKyAgICB1bnNpZ25lZF9jaGtzdW0gPSAyNTYgKyBzdW0oc3RydWN0LnVucGFjaygiMTQ4QiIsIGJ1Zls6MTQ4XSkgKyBzdHJ1Y3QudW5wYWNrKCIzNTZCIiwgYnVmWzE1Njo1MTJdKSkKKyAgICBzaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OGIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2YiIsIGJ1ZlsxNTY6NTEyXSkpCisgICAgcmV0dXJuIHVuc2lnbmVkX2Noa3N1bSwgc2lnbmVkX2Noa3N1bQogCiBkZWYgY29weWZpbGVvYmooc3JjLCBkc3QsIGxlbmd0aD1Ob25lKToKICAgICAiIiJDb3B5IGxlbmd0aCBieXRlcyBmcm9tIGZpbGVvYmogc3JjIHRvIGZpbGVvYmogZHN0LgpAQCAtNjU1LDcgKzcwMyw3IEBACiAgICAgICAgICIiIkdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBmaWxlIG9iamVjdC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgIGRlZiBuZXh0KHNlbGYpOgpAQCAtNjg0LDI0ICs3MzIsMjQgQEAKICAgICAgICAgICAgb2YgdGhlIG1lbWJlci4KICAgICAgICAgIiIiCiAKLSAgICAgICAgc2VsZi5uYW1lICAgICA9IG5hbWUgICAgICAgIyBtZW1iZXIgbmFtZSAoZGlybmFtZXMgbXVzdCBlbmQgd2l0aCAnLycpCi0gICAgICAgIHNlbGYubW9kZSAgICAgPSAwNjY2ICAgICAgICMgZmlsZSBwZXJtaXNzaW9ucwotICAgICAgICBzZWxmLnVpZCAgICAgID0gMCAgICAgICAgICAjIHVzZXIgaWQKLSAgICAgICAgc2VsZi5naWQgICAgICA9IDAgICAgICAgICAgIyBncm91cCBpZAotICAgICAgICBzZWxmLnNpemUgICAgID0gMCAgICAgICAgICAjIGZpbGUgc2l6ZQotICAgICAgICBzZWxmLm10aW1lICAgID0gMCAgICAgICAgICAjIG1vZGlmaWNhdGlvbiB0aW1lCi0gICAgICAgIHNlbGYuY2hrc3VtICAgPSAwICAgICAgICAgICMgaGVhZGVyIGNoZWNrc3VtCi0gICAgICAgIHNlbGYudHlwZSAgICAgPSBSRUdUWVBFICAgICMgbWVtYmVyIHR5cGUKLSAgICAgICAgc2VsZi5saW5rbmFtZSA9ICIiICAgICAgICAgIyBsaW5rIG5hbWUKLSAgICAgICAgc2VsZi51bmFtZSAgICA9ICJ1c2VyIiAgICAgIyB1c2VyIG5hbWUKLSAgICAgICAgc2VsZi5nbmFtZSAgICA9ICJncm91cCIgICAgIyBncm91cCBuYW1lCi0gICAgICAgIHNlbGYuZGV2bWFqb3IgPSAwICAgICAgICAgICMtCi0gICAgICAgIHNlbGYuZGV2bWlub3IgPSAwICAgICAgICAgICMtZm9yIHVzZSB3aXRoIENIUlRZUEUgYW5kIEJMS1RZUEUKLSAgICAgICAgc2VsZi5wcmVmaXggICA9ICIiICAgICAgICAgIyBwcmVmaXggdG8gZmlsZW5hbWUgb3IgaG9sZGluZyBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFib3V0IHNwYXJzZSBmaWxlcworICAgICAgICBzZWxmLm5hbWUgPSBuYW1lICAgICAgICAjIG1lbWJlciBuYW1lIChkaXJuYW1lcyBtdXN0IGVuZCB3aXRoICcvJykKKyAgICAgICAgc2VsZi5tb2RlID0gMDY2NiAgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCisgICAgICAgIHNlbGYudWlkID0gMCAgICAgICAgICAgICMgdXNlciBpZAorICAgICAgICBzZWxmLmdpZCA9IDAgICAgICAgICAgICAjIGdyb3VwIGlkCisgICAgICAgIHNlbGYuc2l6ZSA9IDAgICAgICAgICAgICMgZmlsZSBzaXplCisgICAgICAgIHNlbGYubXRpbWUgPSAwICAgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUKKyAgICAgICAgc2VsZi5jaGtzdW0gPSAwICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KKyAgICAgICAgc2VsZi50eXBlID0gUkVHVFlQRSAgICAgIyBtZW1iZXIgdHlwZQorICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAjIGxpbmsgbmFtZQorICAgICAgICBzZWxmLnVuYW1lID0gInVzZXIiICAgICAjIHVzZXIgbmFtZQorICAgICAgICBzZWxmLmduYW1lID0gImdyb3VwIiAgICAjIGdyb3VwIG5hbWUKKyAgICAgICAgc2VsZi5kZXZtYWpvciA9IDAgICAgICAgIyBkZXZpY2UgbWFqb3IgbnVtYmVyCisgICAgICAgIHNlbGYuZGV2bWlub3IgPSAwICAgICAgICMgZGV2aWNlIG1pbm9yIG51bWJlcgorICAgICAgICBzZWxmLnByZWZpeCA9ICIiICAgICAgICAjIHByZWZpeCB0byBmaWxlbmFtZSBvciBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFib3V0IHNwYXJzZSBmaWxlcwogCi0gICAgICAgIHNlbGYub2Zmc2V0ICAgPSAwICAgICAgICAgICMgdGhlIHRhciBoZWFkZXIgc3RhcnRzIGhlcmUKLSAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IDAgICAgICAgIyB0aGUgZmlsZSdzIGRhdGEgc3RhcnRzIGhlcmUKKyAgICAgICAgc2VsZi5vZmZzZXQgPSAwICAgICAgICAgIyB0aGUgdGFyIGhlYWRlciBzdGFydHMgaGVyZQorICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gMCAgICAjIHRoZSBmaWxlJ3MgZGF0YSBzdGFydHMgaGVyZQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCkBAIC03MTAsOTUgKzc1OCw1NyBAQAogICAgIGRlZiBmcm9tYnVmKGNscywgYnVmKToKICAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QgZnJvbSBhIDUxMiBieXRlIHN0cmluZyBidWZmZXIuCiAgICAgICAgICIiIgorICAgICAgICBpZiBsZW4oYnVmKSAhPSBCTE9DS1NJWkU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidHJ1bmNhdGVkIGhlYWRlciIKKyAgICAgICAgaWYgYnVmLmNvdW50KE5VTCkgPT0gQkxPQ0tTSVpFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IGhlYWRlciIKKwogICAgICAgICB0YXJpbmZvID0gY2xzKCkKLSAgICAgICAgdGFyaW5mby5uYW1lICAgPSBudHMoYnVmWzA6MTAwXSkKLSAgICAgICAgdGFyaW5mby5tb2RlICAgPSBpbnQoYnVmWzEwMDoxMDhdLCA4KQotICAgICAgICB0YXJpbmZvLnVpZCAgICA9IGludChidWZbMTA4OjExNl0sOCkKLSAgICAgICAgdGFyaW5mby5naWQgICAgPSBpbnQoYnVmWzExNjoxMjRdLDgpCi0KLSAgICAgICAgIyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGNvZGluZ3MgZm9yIHRoZSBzaXplIGZpZWxkIHdlCi0gICAgICAgICMgaGF2ZSB0byBkaXNjcmltaW5hdGUsIHNlZSBjb21tZW50IGluIHRvYnVmKCkgYmVsb3cuCi0gICAgICAgIGlmIGJ1ZlsxMjRdICE9IGNocigwMjAwKToKLSAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA9IGxvbmcoYnVmWzEyNDoxMzZdLCA4KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgdGFyaW5mby5zaXplID0gMEwKLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDExKToKLSAgICAgICAgICAgICAgICB0YXJpbmZvLnNpemUgPDw9IDgKLSAgICAgICAgICAgICAgICB0YXJpbmZvLnNpemUgKz0gb3JkKGJ1ZlsxMjUgKyBpXSkKLQotICAgICAgICB0YXJpbmZvLm10aW1lICA9IGxvbmcoYnVmWzEzNjoxNDhdLCA4KQotICAgICAgICB0YXJpbmZvLmNoa3N1bSA9IGludChidWZbMTQ4OjE1Nl0sIDgpCi0gICAgICAgIHRhcmluZm8udHlwZSAgID0gYnVmWzE1NjoxNTddCisgICAgICAgIHRhcmluZm8uYnVmID0gYnVmCisgICAgICAgIHRhcmluZm8ubmFtZSA9IG50cyhidWZbMDoxMDBdKQorICAgICAgICB0YXJpbmZvLm1vZGUgPSBudGkoYnVmWzEwMDoxMDhdKQorICAgICAgICB0YXJpbmZvLnVpZCA9IG50aShidWZbMTA4OjExNl0pCisgICAgICAgIHRhcmluZm8uZ2lkID0gbnRpKGJ1ZlsxMTY6MTI0XSkKKyAgICAgICAgdGFyaW5mby5zaXplID0gbnRpKGJ1ZlsxMjQ6MTM2XSkKKyAgICAgICAgdGFyaW5mby5tdGltZSA9IG50aShidWZbMTM2OjE0OF0pCisgICAgICAgIHRhcmluZm8uY2hrc3VtID0gbnRpKGJ1ZlsxNDg6MTU2XSkKKyAgICAgICAgdGFyaW5mby50eXBlID0gYnVmWzE1NjoxNTddCiAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBudHMoYnVmWzE1NzoyNTddKQotICAgICAgICB0YXJpbmZvLnVuYW1lICA9IG50cyhidWZbMjY1OjI5N10pCi0gICAgICAgIHRhcmluZm8uZ25hbWUgID0gbnRzKGJ1ZlsyOTc6MzI5XSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IGludChidWZbMzI5OjMzN10sIDgpCi0gICAgICAgICAgICB0YXJpbmZvLmRldm1pbm9yID0gaW50KGJ1ZlszMzc6MzQ1XSwgOCkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gdGFyaW5mby5kZXZtYWpvciA9IDAKKyAgICAgICAgdGFyaW5mby51bmFtZSA9IG50cyhidWZbMjY1OjI5N10pCisgICAgICAgIHRhcmluZm8uZ25hbWUgPSBudHMoYnVmWzI5NzozMjldKQorICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gbnRpKGJ1ZlszMjk6MzM3XSkKKyAgICAgICAgdGFyaW5mby5kZXZtaW5vciA9IG50aShidWZbMzM3OjM0NV0pCiAgICAgICAgIHRhcmluZm8ucHJlZml4ID0gYnVmWzM0NTo1MDBdCiAKLSAgICAgICAgIyBTb21lIG9sZCB0YXIgcHJvZ3JhbXMgcmVwcmVzZW50IGEgZGlyZWN0b3J5IGFzIGEgcmVndWxhcgotICAgICAgICAjIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgotICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCkgYW5kIHRhcmluZm8ubmFtZS5lbmRzd2l0aCgiLyIpOgotICAgICAgICAgICAgdGFyaW5mby50eXBlID0gRElSVFlQRQotCi0gICAgICAgICMgVGhlIHByZWZpeCBmaWVsZCBpcyB1c2VkIGZvciBmaWxlbmFtZXMgPiAxMDAgaW4KLSAgICAgICAgIyB0aGUgUE9TSVggc3RhbmRhcmQuCi0gICAgICAgICMgbmFtZSA9IHByZWZpeCArICcvJyArIG5hbWUKLSAgICAgICAgaWYgdGFyaW5mby50eXBlICE9IEdOVVRZUEVfU1BBUlNFOgotICAgICAgICAgICAgdGFyaW5mby5uYW1lID0gbm9ybXBhdGgob3MucGF0aC5qb2luKG50cyh0YXJpbmZvLnByZWZpeCksIHRhcmluZm8ubmFtZSkpCi0KLSAgICAgICAgIyBEaXJlY3RvcnkgbmFtZXMgc2hvdWxkIGhhdmUgYSAnLycgYXQgdGhlIGVuZC4KLSAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgotICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgorICAgICAgICBpZiB0YXJpbmZvLmNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW52YWxpZCBoZWFkZXIiCiAgICAgICAgIHJldHVybiB0YXJpbmZvCiAKLSAgICBkZWYgdG9idWYoc2VsZik6CisgICAgZGVmIHRvYnVmKHNlbGYsIHBvc2l4PUZhbHNlKToKICAgICAgICAgIiIiUmV0dXJuIGEgdGFyIGhlYWRlciBibG9jayBhcyBhIDUxMiBieXRlIHN0cmluZy4KICAgICAgICAgIiIiCi0gICAgICAgICMgUHJlZmVyIHRoZSBzaXplIHRvIGJlIGVuY29kZWQgYXMgMTEgb2N0YWwgYXNjaWkgZGlnaXRzCi0gICAgICAgICMgd2hpY2ggaXMgdGhlIG1vc3QgcG9ydGFibGUuIElmIHRoZSBzaXplIGV4Y2VlZHMgdGhpcwotICAgICAgICAjIGxpbWl0ICg+PSA4IEdCKSwgZW5jb2RlIGl0IGFzIGFuIDg4LWJpdCB2YWx1ZSB3aGljaCBpcwotICAgICAgICAjIGEgR05VIHRhciBmZWF0dXJlLgotICAgICAgICBpZiBzZWxmLnNpemUgPD0gTUFYU0laRV9NRU1CRVI6Ci0gICAgICAgICAgICBzaXplID0gIiUwMTFvIiAlIHNlbGYuc2l6ZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcyA9IHNlbGYuc2l6ZQotICAgICAgICAgICAgc2l6ZSA9ICIiCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMSk6Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IGNocihzICYgMDM3NykgKyBzaXplCi0gICAgICAgICAgICAgICAgcyA+Pj0gOAotICAgICAgICAgICAgc2l6ZSA9IGNocigwMjAwKSArIHNpemUKKyAgICAgICAgcGFydHMgPSBbCisgICAgICAgICAgICBzdG4oc2VsZi5uYW1lLCAxMDApLAorICAgICAgICAgICAgaXRuKHNlbGYubW9kZSAmIDA3Nzc3LCA4LCBwb3NpeCksCisgICAgICAgICAgICBpdG4oc2VsZi51aWQsIDgsIHBvc2l4KSwKKyAgICAgICAgICAgIGl0bihzZWxmLmdpZCwgOCwgcG9zaXgpLAorICAgICAgICAgICAgaXRuKHNlbGYuc2l6ZSwgMTIsIHBvc2l4KSwKKyAgICAgICAgICAgIGl0bihzZWxmLm10aW1lLCAxMiwgcG9zaXgpLAorICAgICAgICAgICAgIiAgICAgICAgIiwgIyBjaGVja3N1bSBmaWVsZAorICAgICAgICAgICAgc2VsZi50eXBlLAorICAgICAgICAgICAgc3RuKHNlbGYubGlua25hbWUsIDEwMCksCisgICAgICAgICAgICBzdG4oTUFHSUMsIDYpLAorICAgICAgICAgICAgc3RuKFZFUlNJT04sIDIpLAorICAgICAgICAgICAgc3RuKHNlbGYudW5hbWUsIDMyKSwKKyAgICAgICAgICAgIHN0bihzZWxmLmduYW1lLCAzMiksCisgICAgICAgICAgICBpdG4oc2VsZi5kZXZtYWpvciwgOCwgcG9zaXgpLAorICAgICAgICAgICAgaXRuKHNlbGYuZGV2bWlub3IsIDgsIHBvc2l4KSwKKyAgICAgICAgICAgIHN0bihzZWxmLnByZWZpeCwgMTU1KQorICAgICAgICBdCiAKLSAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IERldGxlZiBMYW5uZXJ0LgotICAgICAgICBwYXJ0cyA9IFtdCi0gICAgICAgIGZvciB2YWx1ZSwgZmllbGRzaXplIGluICgKLSAgICAgICAgICAgICAgICAoc2VsZi5uYW1lLCAxMDApLAotICAgICAgICAgICAgICAgICgiJTA3byIgJSAoc2VsZi5tb2RlICYgMDc3NzcpLCA4KSwKLSAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi51aWQsIDgpLAotICAgICAgICAgICAgICAgICgiJTA3byIgJSBzZWxmLmdpZCwgOCksCi0gICAgICAgICAgICAgICAgKHNpemUsIDEyKSwKLSAgICAgICAgICAgICAgICAoIiUwMTFvIiAlIHNlbGYubXRpbWUsIDEyKSwKLSAgICAgICAgICAgICAgICAoIiAgICAgICAgIiwgOCksCi0gICAgICAgICAgICAgICAgKHNlbGYudHlwZSwgMSksCi0gICAgICAgICAgICAgICAgKHNlbGYubGlua25hbWUsIDEwMCksCi0gICAgICAgICAgICAgICAgKE1BR0lDLCA2KSwKLSAgICAgICAgICAgICAgICAoVkVSU0lPTiwgMiksCi0gICAgICAgICAgICAgICAgKHNlbGYudW5hbWUsIDMyKSwKLSAgICAgICAgICAgICAgICAoc2VsZi5nbmFtZSwgMzIpLAotICAgICAgICAgICAgICAgICgiJTA3byIgJSBzZWxmLmRldm1ham9yLCA4KSwKLSAgICAgICAgICAgICAgICAoIiUwN28iICUgc2VsZi5kZXZtaW5vciwgOCksCi0gICAgICAgICAgICAgICAgKHNlbGYucHJlZml4LCAxNTUpCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgbCA9IGxlbih2YWx1ZSkKLSAgICAgICAgICAgIHBhcnRzLmFwcGVuZCh2YWx1ZVs6ZmllbGRzaXplXSArIChmaWVsZHNpemUgLSBsKSAqIE5VTCkKLQotICAgICAgICBidWYgPSAiIi5qb2luKHBhcnRzKQotICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bShidWYpCisgICAgICAgIGJ1ZiA9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCAiIi5qb2luKHBhcnRzKSkKKyAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZilbMF0KICAgICAgICAgYnVmID0gYnVmWzoxNDhdICsgIiUwNm9cMCIgJSBjaGtzdW0gKyBidWZbMTU1Ol0KLSAgICAgICAgYnVmICs9IChCTE9DS1NJWkUgLSBsZW4oYnVmKSkgKiBOVUwKICAgICAgICAgc2VsZi5idWYgPSBidWYKICAgICAgICAgcmV0dXJuIGJ1ZgogCkBAIC04NzMsMTIgKzg4MywxMiBAQAogICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAKICAgICAgICAgIyBJbml0IGRhdGFzdHJ1Y3R1cmVzCi0gICAgICAgIHNlbGYuY2xvc2VkICAgICAgPSBGYWxzZQotICAgICAgICBzZWxmLm1lbWJlcnMgICAgID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCi0gICAgICAgIHNlbGYuX2xvYWRlZCAgICAgPSBGYWxzZSAgICAjIGZsYWcgaWYgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQKLSAgICAgICAgc2VsZi5vZmZzZXQgICAgICA9IDBMICAgICAgICMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJjaGl2ZSBmaWxlCi0gICAgICAgIHNlbGYuaW5vZGVzICAgICAgPSB7fSAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyY2hpdmUgbWVtYmVycyBhbHJlYWR5IGFkZGVkCisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5tZW1iZXJzID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCisgICAgICAgIHNlbGYuX2xvYWRlZCA9IEZhbHNlICAgICMgZmxhZyBpZiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZAorICAgICAgICBzZWxmLm9mZnNldCA9IDBMICAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQorICAgICAgICBzZWxmLmlub2RlcyA9IHt9ICAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKIAogICAgICAgICBpZiBzZWxmLl9tb2RlID09ICJyIjoKICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCkBAIC0xMzQ3LDcgKzEzNTcsNyBAQAogICAgICAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHRhcmluZm8ubmFtZVs6TEVOR1RIX05BTUUgLSAxXQogICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogQ3JlYXRlZCBHTlUgdGFyIGV4dGVuc2lvbiBMT05HTkFNRSIpCiAKLSAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHRhcmluZm8udG9idWYoKSkKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHRhcmluZm8udG9idWYoc2VsZi5wb3NpeCkpCiAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogCiAgICAgICAgICMgSWYgdGhlcmUncyBkYXRhIHRvIGZvbGxvdywgYXBwZW5kIGl0LgpAQCAtMTY2MCw3ICsxNjcwLDYgQEAKICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvciwgImNvdWxkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUiCiAKICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogICAgIGRlZiBuZXh0KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgVGFySW5mbyBvYmplY3QsIHdoZW4KICAgICAgICAgICAgVGFyRmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcuIFJldHVybiBOb25lIGlmIHRoZXJlIGlzIG5vIG1vcmUKQEAgLTE2NzgsNzAgKzE2ODcsODEgQEAKICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHRhcmluZm8gPSBUYXJJbmZvLmZyb21idWYoYnVmKQotICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisKKyAgICAgICAgICAgICAgICAjIFNldCB0aGUgVGFySW5mbyBvYmplY3QncyBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCisgICAgICAgICAgICAgICAgIyBUYXJGaWxlIGFuZCBzZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcworICAgICAgICAgICAgICAgICMgc2hvdWxkIGJlZ2luLgorICAgICAgICAgICAgICAgIHRhcmluZm8ub2Zmc2V0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKKworICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnByb2NfbWVtYmVyKHRhcmluZm8pCisKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgogICAgICAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlX3plcm9zOgotICAgICAgICAgICAgICAgICAgICBpZiBidWYuY291bnQoTlVMKSA9PSBCTE9DS1NJWkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGogPSAiZW1wdHkiCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGogPSAiaW52YWxpZCIKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyBibG9jayIgJSAoc2VsZi5vZmZzZXQsIGFkaikpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAiMHglWDogJXMiICUgKHNlbGYub2Zmc2V0LCBlKSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgIyBCbG9jayBpcyBlbXB0eSBvciB1bnJlYWRhYmxlLgogICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGUgZmlyc3QgYmxvY2sgaXMgaW52YWxpZC4gVGhhdCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgIyBsb29rIGxpa2UgYSB0YXIgYXJjaGl2ZSB3ZSBjYW4gaGFuZGxlLgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yLCJlbXB0eSwgdW5yZWFkYWJsZSBvciBjb21wcmVzc2VkIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IsIHN0cihlKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgYnJlYWsKIAotICAgICAgICAjIFdlIHNob3VsZG4ndCByZWx5IG9uIHRoaXMgY2hlY2tzdW0sIGJlY2F1c2Ugc29tZSB0YXIgcHJvZ3JhbXMKLSAgICAgICAgIyBjYWxjdWxhdGUgaXQgZGlmZmVyZW50bHkgYW5kIGl0IGlzIG1lcmVseSB2YWxpZGF0aW5nIHRoZQotICAgICAgICAjIGhlYWRlciBibG9jay4gV2UgY291bGQganVzdCBhcyB3ZWxsIHNraXAgdGhpcyBwYXJ0LCB3aGljaCB3b3VsZAotICAgICAgICAjIGhhdmUgYSBzbGlnaHQgZWZmZWN0IG9uIHBlcmZvcm1hbmNlLi4uCi0gICAgICAgIGlmIHRhcmluZm8uY2hrc3VtICE9IGNhbGNfY2hrc3VtKGJ1Zik6Ci0gICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IEJhZCBDaGVja3N1bSAlciIgJSB0YXJpbmZvLm5hbWUpCisgICAgICAgICMgU29tZSBvbGQgdGFyIHByb2dyYW1zIHJlcHJlc2VudCBhIGRpcmVjdG9yeSBhcyBhIHJlZ3VsYXIKKyAgICAgICAgIyBmaWxlIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KKyAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIGFuZCB0YXJpbmZvLm5hbWUuZW5kc3dpdGgoIi8iKToKKyAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IERJUlRZUEUKIAotICAgICAgICAjIFNldCB0aGUgVGFySW5mbyBvYmplY3QncyBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCi0gICAgICAgICMgVGFyRmlsZSBhbmQgc2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MKLSAgICAgICAgIyBzaG91bGQgYmVnaW4uCi0gICAgICAgIHRhcmluZm8ub2Zmc2V0ID0gc2VsZi5vZmZzZXQKLSAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgICMgVGhlIHByZWZpeCBmaWVsZCBpcyB1c2VkIGZvciBmaWxlbmFtZXMgPiAxMDAgaW4KKyAgICAgICAgIyB0aGUgUE9TSVggc3RhbmRhcmQuCisgICAgICAgICMgbmFtZSA9IHByZWZpeCArICcvJyArIG5hbWUKKyAgICAgICAgdGFyaW5mby5uYW1lID0gbm9ybXBhdGgob3MucGF0aC5qb2luKG50cyh0YXJpbmZvLnByZWZpeCksIHRhcmluZm8ubmFtZSkpCiAKLSAgICAgICAgIyBDaGVjayBpZiB0aGUgVGFySW5mbyBvYmplY3QgaGFzIGEgdHlwZWZsYWcgZm9yIHdoaWNoIGEgY2FsbGJhY2sKLSAgICAgICAgIyBtZXRob2QgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgVFlQRV9NRVRILiBJZiBzbywgdGhlbiBjYWxsIGl0LgotICAgICAgICBpZiB0YXJpbmZvLnR5cGUgaW4gc2VsZi5UWVBFX01FVEg6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5UWVBFX01FVEhbdGFyaW5mby50eXBlXShzZWxmLCB0YXJpbmZvKQotCi0gICAgICAgIHRhcmluZm8ub2Zmc2V0X2RhdGEgPSBzZWxmLm9mZnNldAotICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCkgb3IgdGFyaW5mby50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6Ci0gICAgICAgICAgICAjIFNraXAgdGhlIGZvbGxvd2luZyBkYXRhIGJsb2Nrcy4KLSAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHRhcmluZm8uc2l6ZSkKKyAgICAgICAgIyBEaXJlY3RvcnkgbmFtZXMgc2hvdWxkIGhhdmUgYSAnLycgYXQgdGhlIGVuZC4KKyAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgorICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgogCiAgICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKICAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICMgQmVsb3cgYXJlIHNvbWUgbWV0aG9kcyB3aGljaCBhcmUgY2FsbGVkIGZvciBzcGVjaWFsIHR5cGVmbGFncyBpbiB0aGUKLSAgICAjIG5leHQoKSBtZXRob2QsIGUuZy4gZm9yIHVud3JhcHBpbmcgR05VIGxvbmduYW1lL2xvbmdsaW5rIGJsb2Nrcy4gVGhleQotICAgICMgYXJlIHJlZ2lzdGVyZWQgaW4gVFlQRV9NRVRIIGJlbG93LiBZb3UgY2FuIHJlZ2lzdGVyIHlvdXIgb3duIG1ldGhvZHMKLSAgICAjIHdpdGggdGhpcyBtYXBwaW5nLgotICAgICMgQSByZWdpc3RlcmVkIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhIFRhckluZm8gb2JqZWN0IGFzIG9ubHkgYXJndW1lbnQuCi0gICAgIwotICAgICMgRHVyaW5nIGl0cyBleGVjdXRpb24gdGhlIG1ldGhvZCBNVVNUIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB0YXNrczoKLSAgICAjIDEuIHNldCB0YXJpbmZvLm9mZnNldF9kYXRhIHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MgYmVnaW4sCi0gICAgIyAgICBpZiB0aGVyZSBpcyBkYXRhIHRvIGZvbGxvdy4KLSAgICAjIDIuIHNldCBzZWxmLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5leHQgbWVtYmVyJ3MgaGVhZGVyIHdpbGwKKyAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhCisgICAgIyBtZW1iZXIuIFRoZSBlbnRyeSBwb2ludCBpcyBwcm9jX21lbWJlcigpIHdoaWNoIGlzIGNhbGxlZCB3aXRoIGEgVGFySW5mbworICAgICMgb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgaGVhZGVyIGJsb2NrIGZyb20gdGhlIGN1cnJlbnQgb2Zmc2V0LiBUaGUKKyAgICAjIHByb2NfbWVtYmVyKCkgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3MgdG8gYWRkIGN1c3RvbQorICAgICMgcHJvY18qKCkgbWV0aG9kcy4gQSBwcm9jXyooKSBtZXRob2QgTVVTVCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZworICAgICMgb3BlcmF0aW9uczoKKyAgICAjIDEuIFNldCB0YXJpbmZvLm9mZnNldF9kYXRhIHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MgYmVnaW4sCisgICAgIyAgICBpZiB0aGVyZSBpcyBkYXRhIHRoYXQgZm9sbG93cy4KKyAgICAjIDIuIFNldCBzZWxmLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5leHQgbWVtYmVyJ3MgaGVhZGVyIHdpbGwKICAgICAjICAgIGJlZ2luLgotICAgICMgMy4gYXBwZW5kIHRoZSB0YXJpbmZvIG9iamVjdCB0byBzZWxmLm1lbWJlcnMsIGlmIGl0IGlzIHN1cHBvc2VkIHRvIGFwcGVhcgotICAgICMgICAgYXMgYSBtZW1iZXIgb2YgdGhlIFRhckZpbGUgb2JqZWN0LgotICAgICMgNC4gcmV0dXJuIHRhcmluZm8gb3IgYW5vdGhlciB2YWxpZCBUYXJJbmZvIG9iamVjdC4KKyAgICAjIDMuIFJldHVybiB0YXJpbmZvIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCisgICAgZGVmIHByb2NfbWVtYmVyKHNlbGYsIHRhcmluZm8pOgorICAgICAgICAiIiJDaG9vc2UgdGhlIHJpZ2h0IHByb2Nlc3NpbmcgbWV0aG9kIGZvciB0YXJpbmZvIGRlcGVuZGluZworICAgICAgICAgICBvbiBpdHMgdHlwZSBhbmQgY2FsbCBpdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRhcmluZm8udHlwZSBpbiAoR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jX2dudWxvbmcodGFyaW5mbykKKyAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9TUEFSU0U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9jX3NwYXJzZSh0YXJpbmZvKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19idWlsdGluKHRhcmluZm8pCisKKyAgICBkZWYgcHJvY19idWlsdGluKHNlbGYsIHRhcmluZm8pOgorICAgICAgICAiIiJQcm9jZXNzIGEgYnVpbHRpbiB0eXBlIG1lbWJlciBvciBhbiB1bmtub3duIG1lbWJlcgorICAgICAgICAgICB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhID0gc2VsZi5vZmZzZXQKKyAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpIG9yIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCisgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBzZWxmLl9ibG9jayh0YXJpbmZvLnNpemUpCisgICAgICAgIHJldHVybiB0YXJpbmZvCiAKICAgICBkZWYgcHJvY19nbnVsb25nKHNlbGYsIHRhcmluZm8pOgotICAgICAgICAiIiJFdmFsdWF0ZSB0aGUgYmxvY2tzIHRoYXQgaG9sZCBhIEdOVSBsb25nbmFtZQorICAgICAgICAiIiJQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCiAgICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KICAgICAgICAgIiIiCiAgICAgICAgIGJ1ZiA9ICIiCkBAIC0xNzUyLDkgKzE3NzIsMTUgQEAKICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogICAgICAgICAgICAgY291bnQgLT0gQkxPQ0tTSVpFCiAKLSAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIKLSAgICAgICAgbmV4dCA9IHNlbGYubmV4dCgpCisgICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyIGFuZCBwcm9jZXNzIGl0LgorICAgICAgICBiID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQorICAgICAgICB0ID0gVGFySW5mby5mcm9tYnVmKGIpCisgICAgICAgIHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgIG5leHQgPSBzZWxmLnByb2NfbWVtYmVyKHQpCiAKKyAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgbmV4dCBoZWFkZXIgd2l0aAorICAgICAgICAjIHRoZSBsb25nbmFtZSBpbmZvcm1hdGlvbi4KICAgICAgICAgbmV4dC5vZmZzZXQgPSB0YXJpbmZvLm9mZnNldAogICAgICAgICBpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTkFNRToKICAgICAgICAgICAgIG5leHQubmFtZSA9IG50cyhidWYpCkBAIC0xNzY0LDkgKzE3OTAsOSBAQAogICAgICAgICByZXR1cm4gbmV4dAogCiAgICAgZGVmIHByb2Nfc3BhcnNlKHNlbGYsIHRhcmluZm8pOgotICAgICAgICAiIiJBbmFseXplIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgorICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgogICAgICAgICAiIiIKLSAgICAgICAgYnVmID0gdGFyaW5mby50b2J1ZigpCisgICAgICAgIGJ1ZiA9IHRhcmluZm8uYnVmCiAgICAgICAgIHNwID0gX3JpbmdidWZmZXIoKQogICAgICAgICBwb3MgPSAzODYKICAgICAgICAgbGFzdHBvcyA9IDBMCkBAIC0xNzc1LDggKzE4MDEsOCBAQAogICAgICAgICAjIGZpcnN0IGhlYWRlci4KICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDQpOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9mZnNldCA9IGludChidWZbcG9zOnBvcyArIDEyXSwgOCkKLSAgICAgICAgICAgICAgICBudW1ieXRlcyA9IGludChidWZbcG9zICsgMTI6cG9zICsgMjRdLCA4KQorICAgICAgICAgICAgICAgIG9mZnNldCA9IG50aShidWZbcG9zOnBvcyArIDEyXSkKKyAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQogICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CkBAIC0xNzg3LDcgKzE4MTMsNyBAQAogICAgICAgICAgICAgcG9zICs9IDI0CiAKICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNDgyXSkKLSAgICAgICAgb3JpZ3NpemUgPSBpbnQoYnVmWzQ4Mzo0OTVdLCA4KQorICAgICAgICBvcmlnc2l6ZSA9IG50aShidWZbNDgzOjQ5NV0pCiAKICAgICAgICAgIyBJZiB0aGUgaXNleHRlbmRlZCBmbGFnIGlzIGdpdmVuLAogICAgICAgICAjIHRoZXJlIGFyZSBleHRyYSBoZWFkZXJzIHRvIHByb2Nlc3MuCkBAIC0xNzk3LDggKzE4MjMsOCBAQAogICAgICAgICAgICAgcG9zID0gMAogICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIxKToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGludChidWZbcG9zOnBvcyArIDEyXSwgOCkKLSAgICAgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBpbnQoYnVmW3BvcyArIDEyOnBvcyArIDI0XSwgOCkKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQorICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CkBAIC0xODE4LDE3ICsxODQ0LDExIEBACiAgICAgICAgIHNlbGYub2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHRhcmluZm8uc2l6ZSkKICAgICAgICAgdGFyaW5mby5zaXplID0gb3JpZ3NpemUKIAotICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCi0gICAgICAgIHJldHVybiB0YXJpbmZvCisgICAgICAgICMgQ2xlYXIgdGhlIHByZWZpeCBmaWVsZCBzbyB0aGF0IGl0IGlzIG5vdCB1c2VkCisgICAgICAgICMgYXMgYSBwYXRobmFtZSBpbiBuZXh0KCkuCisgICAgICAgIHRhcmluZm8ucHJlZml4ID0gIiIKIAotICAgICMgVGhlIHR5cGUgbWFwcGluZyBmb3IgdGhlIG5leHQoKSBtZXRob2QuIFRoZSBrZXlzIGFyZSBzaW5nbGUgY2hhcmFjdGVyCi0gICAgIyBzdHJpbmdzLCB0aGUgdHlwZWZsYWcuIFRoZSB2YWx1ZXMgYXJlIG1ldGhvZHMgd2hpY2ggYXJlIGNhbGxlZCB3aGVuCi0gICAgIyBuZXh0KCkgZW5jb3VudGVycyBzdWNoIGEgdHlwZWZsYWcuCi0gICAgVFlQRV9NRVRIID0gewotICAgICAgICBHTlVUWVBFX0xPTkdOQU1FOiBwcm9jX2dudWxvbmcsCi0gICAgICAgIEdOVVRZUEVfTE9OR0xJTks6IHByb2NfZ251bG9uZywKLSAgICAgICAgR05VVFlQRV9TUEFSU0U6ICAgcHJvY19zcGFyc2UKLSAgICB9CisgICAgICAgIHJldHVybiB0YXJpbmZvCiAKICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAjIExpdHRsZSBoZWxwZXIgbWV0aG9kczoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCA5ODM0OWM0Li4wM2ZiNTVmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0yLDYgKzIsNyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBTdHJpbmdJTwogCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0YXJmaWxlCkBAIC0yNSw3ICsyNiw3IEBACiB0ZXN0dGFyID0gcGF0aCgidGVzdHRhci50YXIiKQogdGVtcGRpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksICJ0ZXN0dGFyIiArIG9zLmV4dHNlcCArICJkaXIiKQogdGVtcG5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCi1tZW1iZXJjb3VudCA9IDEwCittZW1iZXJjb3VudCA9IDEyCiAKIGRlZiB0YXJuYW1lKGNvbXA9IiIpOgogICAgIGlmIG5vdCBjb21wOgpAQCAtMjU0LDcgKzI1NSw3IEBACiAgICAgICAgICAgICBpZiBub3QgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICBmID0gc2VsZi5zcmMuZXh0cmFjdGZpbGUodGFyaW5mbykKLSAgICAgICAgICAgIGlmIHNlbGYuZHN0LnBvc2l4IGFuZCBsZW4odGFyaW5mby5uYW1lKSA+IHRhcmZpbGUuTEVOR1RIX05BTUU6CisgICAgICAgICAgICBpZiBzZWxmLmRzdC5wb3NpeCBhbmQgbGVuKHRhcmluZm8ubmFtZSkgPiB0YXJmaWxlLkxFTkdUSF9OQU1FIGFuZCAiLyIgbm90IGluIHRhcmluZm8ubmFtZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmRzdC5hZGRmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mbywgZikKICAgICAgICAgICAgIGVsc2U6CkBAIC0zODUsNiArMzg2LDQ5IEBACiAgICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lXyIsCiAgICAgICAgICAgICAgICAgICAgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rXyIpCiAKK2NsYXNzIFJlYWRHTlVMb25nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUoKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfMTQ3MTQyNyhzZWxmKToKKyAgICAgICAgIiIiVGVzdCByZWFkaW5nIG9mIGxvbmduYW1lIChidWcgIzE0NzE0MjcpLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICJ0ZXN0LyIgKiAyMCArICIwLVJFR1RZUEUiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobmFtZSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgdGFyaW5mbyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8gaXMgbm90IE5vbmUsICJsb25nbmFtZSBub3QgZm91bmQiKQorICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlICE9IHRhcmZpbGUuRElSVFlQRSwgInJlYWQgbG9uZ25hbWUgYXMgZGlydHlwZSIpCisKKyAgICBkZWYgdGVzdF9yZWFkX25hbWUoc2VsZik6CisgICAgICAgIG5hbWUgPSAoIjAtTE9OR05BTUUtIiAqIDEwKVs6MTAxXQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKG5hbWUpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHRhcmluZm8gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvIGlzIG5vdCBOb25lLCAibG9uZ25hbWUgbm90IGZvdW5kIikKKworICAgIGRlZiB0ZXN0X3JlYWRfbGluayhzZWxmKToKKyAgICAgICAgbGluayA9ICgiMS1MT05HTElOSy0iICogMTApWzoxMDFdCisgICAgICAgIG5hbWUgPSAoIjAtTE9OR05BTUUtIiAqIDEwKVs6MTAxXQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxpbmspCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHRhcmluZm8gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvIGlzIG5vdCBOb25lLCAibG9uZ2xpbmsgbm90IGZvdW5kIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8ubGlua25hbWUgPT0gbmFtZSwgImxpbmtuYW1lIHdyb25nIikKKworICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9sb25nbmFtZShzZWxmKToKKyAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKGZpbGUodGFybmFtZSgpKS5yZWFkKDEwMjQpKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4obmFtZT0iZm9vLnRhciIsIGZpbGVvYmo9Zm9iaikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih0YXIuZ2V0bWVtYmVycygpKSA9PSAwLCAiIikKKworCiBjbGFzcyBFeHRyYWN0SGFyZGxpbmtUZXN0KEJhc2VUZXN0KToKIAogICAgIGRlZiB0ZXN0X2hhcmRsaW5rKHNlbGYpOgpAQCAtNTEyLDYgKzU1Niw3IEBACiAgICAgICAgIFdyaXRlU2l6ZTBUZXN0LAogICAgICAgICBXcml0ZVN0cmVhbVRlc3QsCiAgICAgICAgIFdyaXRlR05VTG9uZ1Rlc3QsCisgICAgICAgIFJlYWRHTlVMb25nVGVzdCwKICAgICBdCiAKICAgICBpZiBoYXNhdHRyKG9zLCAibGluayIpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdHRhci50YXIgYi9MaWIvdGVzdC90ZXN0dGFyLnRhcgppbmRleCA4ZmQwYzUwLi4xZjQ0OTNmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0dGFyLnRhcgorKysgYi9MaWIvdGVzdC90ZXN0dGFyLnRhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggYWI4NGRiZi4uNDAxZjVkOSAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtOTYsNiArOTYsMTAgQEAKIExpYnJhcnkKIC0tLS0tLS0KIAorLSBQYXRjaCAjMTQ4NDY5NTogVXBkYXRlIHRoZSB0YXJmaWxlIG1vZHVsZSB0byB2ZXJzaW9uIDAuOC4gVGhpcyBmaXhlcworICBhIGNvdXBsZSBvZiBpc3N1ZXMsIG5vdGFibHkgaGFuZGxpbmcgb2YgbG9uZyBmaWxlIG5hbWVzIHVzaW5nIHRoZQorICBHTlUgTE9OR05BTUUgZXh0ZW5zaW9uLgorCiAtIFBhdGNoICMxNDc4MjkyLiBgYGRvY3Rlc3QucmVnaXN0ZXJfb3B0aW9uZmxhZyhuYW1lKWBgIHNob3VsZG4ndCBjcmVhdGUgYQogICBuZXcgZmxhZyB3aGVuIGBgbmFtZWBgIGlzIGFscmVhZHkgdGhlIG5hbWUgb2YgYW4gb3B0aW9uIGZsYWcuCiAK