ZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CmluZGV4IDBkNDc5NzcuLmIwOGRhOWMgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtMjY4LDYgKzI2OCwxMiBAQAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCBbKDEsKSwgKDIsKSwgKDMsKV0pCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3Uucm93Y291bnQsIDMpCiAKKyAgICBkZWYgQ2hlY2tUb3RhbENoYW5nZXMoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIGlmIHNlbGYuY3gudG90YWxfY2hhbmdlcyA8IDI6CisgICAgICAgICAgICBzZWxmLmZhaWwoInRvdGFsIGNoYW5nZXMgcmVwb3J0ZWQgd3JvbmcgdmFsdWUiKQorCiAgICAgIyBDaGVja3MgZm9yIGV4ZWN1dGVtYW55OgogICAgICMgU2VxdWVuY2VzIGFyZSByZXF1aXJlZCBieSB0aGUgREItQVBJLCBpdGVyYXRvcnMKICAgICAjIGVuaGFuY2VtZW50cyBpbiBweXNxbGl0ZS4KZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjdiODgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CkBAIC0wLDAgKzEsMTE1IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcworIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBvcywgdW5pdHRlc3QKK2ltcG9ydCBweXNxbGl0ZTIuZGJhcGkyIGFzIHNxbGl0ZQorCitjbGFzcyBDb2xsYXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdENhbGxhYmxlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiWCIsIDQyKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBUeXBlRXJyb3IiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKQorCisgICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90QXNjaWkoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJjb2xs5CIsIGNtcCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgZToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0NvbGxhdGlvbklzVXNlZChzZWxmKToKKyAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKKyAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKworICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbXljb2xsKQorICAgICAgICBzcWwgPSAiIiIKKyAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKAorICAgICAgICAgICAgc2VsZWN0ICdhJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdiJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CisgICAgICAgICAgICApIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKKyAgICAgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKKyAgICAgICAgaWYgcmVzdWx0WzBdWzBdICE9ICJjIiBvciByZXN1bHRbMV1bMF0gIT0gImIiIG9yIHJlc3VsdFsyXVswXSAhPSAiYSI6CisgICAgICAgICAgICBzZWxmLmZhaWwoInRoZSBleHBlY3RlZCBvcmRlciB3YXMgbm90IHJldHVybmVkIikKKworICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6IG15Y29sbCIpCisKKyAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZWdpc3RlclR3aWNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVnaXN0ZXIgdHdvIGRpZmZlcmVudCBjb2xsYXRpb24gZnVuY3Rpb25zIHVuZGVyIHRoZSBzYW1lIG5hbWUuCisgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBsYXN0IG9uZSBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGNtcCkKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGxhbWJkYSB4LCB5OiAtY21wKHgsIHkpKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKHNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHgpIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKKyAgICAgICAgICAgICIiIikuZmV0Y2hhbGwoKQorICAgICAgICBpZiByZXN1bHRbMF1bMF0gIT0gJ2InIG9yIHJlc3VsdFsxXVswXSAhPSAnYSc6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGNvbGxhdGlvbiBmdW5jdGlvbiBpcyB1c2VkIikKKworICAgIGRlZiBDaGVja0RlcmVnaXN0ZXJDb2xsYXRpb24oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZWdpc3RlciBhIGNvbGxhdGlvbiwgdGhlbiBkZXJlZ2lzdGVyIGl0LiBNYWtlIHN1cmUgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHdlIHRyeQorICAgICAgICB0byB1c2UgaXQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgY21wKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmV4ZWN1dGUoInNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHggb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5zdGFydHN3aXRoKCJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgT3BlcmF0aW9uYWxFcnJvciByYWlzZWQiKQorCitkZWYgc3VpdGUoKToKKyAgICBjb2xsYXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29sbGF0aW9uVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29sbGF0aW9uX3N1aXRlLCkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhhZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CkBAIC0wLDAgKzEsNDggQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9yZWdyZXNzaW9uLnB5OiBweXNxbGl0ZSByZWdyZXNzaW9uIHRlc3RzCisjCisjIENvcHlyaWdodCAoQykgMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcHlzcWxpdGUyLmRiYXBpMiBhcyBzcWxpdGUKKworY2xhc3MgUmVncmVzc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrUHJhZ21hVXNlclZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGhpcyB1c2VkIHRvIGNyYXNoIHB5c3FsaXRlIGJlY2F1c2UgdGhpcyBwcmFnbWEgY29tbWFuZCByZXR1cm5zIE5VTEwgZm9yIHRoZSBjb2x1bW4gbmFtZQorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHVzZXJfdmVyc2lvbiIpCisKK2RlZiBzdWl0ZSgpOgorICAgIHJlZ3Jlc3Npb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUmVncmVzc2lvblRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHJlZ3Jlc3Npb25fc3VpdGUsKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQppbmRleCAyODIwMmNiLi4xZjBiMTlhIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQpAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCiAKIGRlZiBnZXRfZGJfcGF0aCgpOgotICAgIHJldHVybiAidGVzdGRiIgorICAgIHJldHVybiAic3FsaXRlX3Rlc3RkYiIKIAogY2xhc3MgVHJhbnNhY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtNDcsNiArNDcsOCBAQAogICAgICAgICBzZWxmLmN1cjIuY2xvc2UoKQogICAgICAgICBzZWxmLmNvbjIuY2xvc2UoKQogCisgICAgICAgIG9zLnVubGluayhnZXRfZGJfcGF0aCgpKQorCiAgICAgZGVmIENoZWNrRE1MZG9lc0F1dG9Db21taXRCZWZvcmUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQo=