ZGlmZiAtLWdpdCBhL3N0ZC90aGluZy9jb21tYW5kcy5jIGIvc3RkL3RoaW5nL2NvbW1hbmRzLmMKaW5kZXggNWNiOTY3My4uZjY4NDI4OCAxMDA2NDQKLS0tIGEvc3RkL3RoaW5nL2NvbW1hbmRzLmMKKysrIGIvc3RkL3RoaW5nL2NvbW1hbmRzLmMKQEAgLTE0NiwzNiArMTQ2LDM1IEBACiB9CiAKIHByaXZhdGUgY2xvc3VyZSBfY2hlY2tfc3RyaW5nbWV0aG9kKG1peGVkIGZ1bmMsIGludCBleCwgc3RyaW5nIHJlc3ApIHsKLSAgY2xvc3VyZSBjbDsKLSAgaWYoIWZ1bmN0aW9uX2V4aXN0cyhmdW5jKSkKKyAgY2xvc3VyZSBjbCA9IHN5bWJvbF9mdW5jdGlvbihmdW5jLCB0aGlzX29iamVjdCgpKTsKKyAgaWYoIWNsKQorICB7CiAgICAgY2F0Y2gocmFpc2VfZXJyb3Ioc3ByaW50ZigKICAgICAgIHJlc3ArInN0cmluZy1NZXRob2RlICclcycgZmVobHQgb2RlciBpc3QgcHJpdmF0ZS5cbiIsIGZ1bmMpKTsKICAgICAgIHB1Ymxpc2gpOworICAgIHJldHVybiAwOworICB9CiAKICAgLy8gZXh0ZXJuIGVyc3RlbGx0ZSBhdWYgU2ljaHRiYXJrZWl0IHBydWVmZW4gdW5kIGFiYnJlY2hlbi9kYXZvciB3YXJuZW4KICAgaWYoZXgpIHsKICAgICBtaXhlZCAqZmwgPSBmdW5jdGlvbmxpc3QodGhpc19vYmplY3QoKSwgUkVUVVJOX0ZVTkNUSU9OX05BTUV8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9GVU5DVElPTl9GTEFHUyk7CiAgICAgaW50IGluZGV4ID0gbWVtYmVyKGZsLCBmdW5jKSsxOwotICAgIGlmKGluZGV4PD0wIHx8IHNpemVvZihmbCk8PWluZGV4KQotICAgICAgY2F0Y2gocmFpc2VfZXJyb3Ioc3ByaW50ZigKLSAgICAgICAgcmVzcCsic3RyaW5nLU1ldGhvZGUgJyVzJyBuaWNodCBpbiBmdW5jdGlvbmxpc3QuXG4iLCBmdW5jKSk7Ci0gICAgICAgIHB1Ymxpc2gpOwotICAgIGVsc2UgaWYoZmxbaW5kZXhdJlRZUEVfTU9EX1BST1RFQ1RFRCB8fCBmbFtpbmRleF0mVFlQRV9NT0RfU1RBVElDKQorICAgIGlmKGluZGV4PD0wIHx8IHNpemVvZihmbCk8PWluZGV4KSAvLyBzb2xsdGUgbmljaHQgcGFzc2llcmVuLCBzLm8uCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICByZXNwKyJzdHJpbmctTWV0aG9kZSAnJXMnIHRyb3R6IGZ1bmN0aW9uX2V4aXN0cygpIG5pY2h0IGluICIKKyAgICAgICAgICAgICAiZnVuY3Rpb25saXN0LiBXVEY/XG4iLCBmdW5jKSk7CisgICAgZWxzZSBpZihmbFtpbmRleF0mVFlQRV9NT0RfUFJPVEVDVEVEIHx8IGZsW2luZGV4XSZUWVBFX01PRF9TVEFUSUMpIHsKICAgICAgIGNhdGNoKHJhaXNlX2Vycm9yKHNwcmludGYoCiAgICAgICAgIHJlc3ArInN0cmluZy1NZXRob2RlICclcycgaXN0IHByb3RlY3RlZC9zdGF0aWMuIEV4dGVybiAiCiAgICAgICAgICJkZWZpbmllcnRlcyBLb21tYW5kbyBkYXJmIHNvIGVpbmUgTWV0aG9kZSBuaWNodCBhdWZydWZlbiFcbiIsCiAgICAgICAgIGZ1bmMpKTsKICAgICAgICAgcHVibGlzaCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CiAgIH0KIAogICAvLyBhbnNvbnN0ZW4gTWV0aG9kZSBlcnN0bWFsIGNhY2hlbgotICBjbCA9IHN5bWJvbF9mdW5jdGlvbihmdW5jLCB0aGlzX29iamVjdCgpKTsKLSAgaWYoIWNsKQotICAgIGNhdGNoKHJhaXNlX2Vycm9yKHNwcmludGYoCi0gICAgICByZXNwKyJzdHJpbmctTWV0aG9kZSAnJXMnIG5pY2h0IGluIENsb3N1cmUgd2FuZGVsYmFyP1xuIiwgZnVuYykpOwotICAgICAgcHVibGlzaCk7Ci0KICAgcmV0dXJuIGNsOwogfQogCkBAIC0zMzQsMTkgKzMzMywxOSBAQAogICAgIHdoaWxlKGotLSkgewogICAgICBpbnQgazsKICAgICAgLy8gREJHKHJ1bGVbal0pOwotICAgIAkvLyBSZWdlbG4gbmljaHQgbPZzY2hlbiB1bmQgUmVnZWw/CisgICAgCS8vIFJlZ2VsbiBuaWNodCBsw7ZzY2hlbiB1bmQgUmVnZWw/CiAgICAgIGlmKCEoZGVsX25vcnVsZSAmJiBwb2ludGVycChydWxlW2pdKSkgJiYKLSAgICAgICAgLy8gbnVyIGJlc3RpbW10ZSBJRCBs9nNjaGVuIHVuZCBJRCBwYXNzdCBuaWNodD8KKyAgICAgICAgLy8gbnVyIGJlc3RpbW10ZSBJRCBsw7ZzY2hlbiB1bmQgSUQgcGFzc3QgbmljaHQ/CiAgICAgICAgICEob25seWlkICYmICghcG9pbnRlcnAoaWRzKSB8fCBzaXplb2YoaWRzKTw9aiB8fCBpZHNbal0hPW9ubHlpZCkpICYmCi0gICAgICAgIC8vIEz2c2NocmVnZWwgZXhpc3RpZXJ0IHVuZCBwYXNzdCBuaWNodCBhdWYgUmVnZWw/CisgICAgICAgIC8vIEzDtnNjaHJlZ2VsIGV4aXN0aWVydCB1bmQgcGFzc3QgbmljaHQgYXVmIFJlZ2VsPwogICAgICAgICAhKGRlbHJ1bGUgJiYgKGs9c2l6ZW9mKHJ1bGVbal0pKSE9c2l6ZW9mKGRlbHJ1bGUpKSkgewotICAgICAgLy8gcGFydGllbGxlcyBUZXN0ZW4gZWluZXIgTPZzY2hyZWdlbCAuLi4KKyAgICAgIC8vIHBhcnRpZWxsZXMgVGVzdGVuIGVpbmVyIEzDtnNjaHJlZ2VsIC4uLgogICAgICAgaWYoZGVscnVsZSkgewogICAgICAgIHdoaWxlKGstLSkKICAgICAgICAgaWYoIXNpemVvZihydWxlW2pdW2tdJmRlbHJ1bGVba10pKSBicmVhazsKICAgICAgICBpZihrPj0wKSBjb250aW51ZTsKICAgICAgIH0KLSAgICAgIC8vIGFsbGVzIGtvcnJla3Q6IEz2c2NoZW4hCisgICAgICAvLyBhbGxlcyBrb3JyZWt0OiBMw7ZzY2hlbiEKICAgICAgIC8vIChBcnJheWJlcmVpY2ggZHVyY2ggbGVlcmVzIEFycmF5IGxvZXNjaGVuKQogICAgICAgZmxhZ1tqLi5qXSAgICA9IGFsbG9jYXRlKDApOwogICAgICAgZnVuW2ouLmpdICAgICA9IGFsbG9jYXRlKDApOwpAQCAtNDY1LDcgKzQ2NCw3IEBACiAgICAgIHdoaWxlKChyYW5nZT1yX2VuZC1xX3N0YXJ0KT49MCkgewogICAgICAgbWl4ZWQgdG1wb2JqOwogCi0gICAgICAvLyB3aWUgd2VpdCB3b2xsZW4gd2lyIHp1cvxja2dlaGVuPworICAgICAgLy8gd2llIHdlaXQgd29sbGVuIHdpciB6dXLDvGNrZ2VoZW4/CiAgICAgICBpZihyYW5nZSkKICAgICAgICAgaWYoIShjaGVja19wcmVzZW50JkNIRUNLX1BVVEdFVCkpCiAgICAgICAgICAgcmFuZ2U9cmFuZ2U+Mj8yOnJhbmdlOyAvLyAzIEZyYWdtZW50ZSBmdWVyIEBJRC9AUFJFU0VOVCAoQWR2ZXJiL05yKQo=