ZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfY3JlYXRvci5jcHAgYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2NyZWF0b3IuY3BwCmluZGV4IDNjOTY3NWUuLjlhMmI4OGIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfY3JlYXRvci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmNwcApAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgpAQCAtMjIsNiArMjMsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zZWN1cml0eV9oYW5kbGVyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvb2JqZWN0X3RyZWVfdHJhdmVyc2FsX3V0aWwuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2RhdGFfdmVjdG9yLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3JhbmRvbS5oIgpAQCAtMTYzLDEzICsxNjUsMzAgQEAKIH0KIAogYm9vbCBDUERGX0NyZWF0b3I6OldyaXRlT2xkT2JqcygpIHsKLSAgdWludDMyX3Qgbkxhc3RPYmpOdW0gPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgaWYgKCFtX3BQYXJzZXItPklzVmFsaWRPYmplY3ROdW1iZXIobkxhc3RPYmpOdW0pKQorICBjb25zdCB1aW50MzJfdCBuTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOworICBpZiAoIW1fcFBhcnNlci0+SXNWYWxpZE9iamVjdE51bWJlcihuTGFzdE9iak51bSkpIHsKICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAobV9DdXJPYmpOdW0gPiBuTGFzdE9iak51bSkgeworICAgIHJldHVybiB0cnVlOworICB9CiAKKyAgY29uc3Qgc3RkOjpzZXQ8dWludDMyX3Q+IG9iamVjdHNfd2l0aF9yZWZzID0KKyAgICAgIEdldE9iamVjdHNXaXRoUmVmZXJlbmNlcyhtX3BEb2N1bWVudCk7CisgIHVpbnQzMl90IGxhc3Rfb2JqZWN0X251bWJlcl93cml0dGVuID0gMDsKICAgZm9yICh1aW50MzJfdCBvYmpudW0gPSBtX0N1ck9iak51bTsgb2JqbnVtIDw9IG5MYXN0T2JqTnVtOyArK29iam51bSkgewotICAgIGlmICghV3JpdGVPbGRJbmRpcmVjdE9iamVjdChvYmpudW0pKQorICAgIGlmICghcGRmaXVtOjpDb250YWlucyhvYmplY3RzX3dpdGhfcmVmcywgb2JqbnVtKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghV3JpdGVPbGRJbmRpcmVjdE9iamVjdChvYmpudW0pKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGxhc3Rfb2JqZWN0X251bWJlcl93cml0dGVuID0gb2JqbnVtOworICB9CisgIC8vIElmIHRoZXJlIGFyZSBubyBuZXcgb2JqZWN0cyB0byB3cml0ZSwgdGhlbiBhZGp1c3QgYG1fZHdMYXN0T2JqTnVtYCBpZgorICAvLyBuZWVkZWQgdG8gcmVmbGVjdCB0aGUgYWN0dWFsIGxhc3Qgb2JqZWN0IG51bWJlci4KKyAgaWYgKG1fTmV3T2JqTnVtQXJyYXkuZW1wdHkoKSkgeworICAgIG1fZHdMYXN0T2JqTnVtID0gbGFzdF9vYmplY3RfbnVtYmVyX3dyaXR0ZW47CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yLmNwcCBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3IuY3BwCmluZGV4IDczNGE3MTcuLjg3MTcwMjggMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3IuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3IuY3BwCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8dHVwbGU+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAorI2luY2x1ZGUgImNvbnN0YW50cy9wYWdlX29iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfY29udGVudHN0cmVhbV93cml0ZV91dGlscy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRtYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9zdHJpbmdhcmNoaXZlc3RyZWFtLmgiCkBAIC0zNyw2ICszOCw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9vYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvY2hlY2suaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2NvbnRhaW5lcnMvY29udGFpbnMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL25vdHJlYWNoZWQuaCIKQEAgLTQ1LDYgKzQ3LDEwIEBACiAKIG5hbWVzcGFjZSB7CiAKKy8vIEtleTogVGhlIHJlc291cmNlIHR5cGUuCisvLyBWYWx1ZTogVGhlIHJlc291cmNlIG5hbWVzIG9mIGEgZ2l2ZW4gdHlwZS4KK3VzaW5nIFJlc291cmNlc01hcCA9IHN0ZDo6bWFwPEJ5dGVTdHJpbmcsIHN0ZDo6c2V0PEJ5dGVTdHJpbmc+PjsKKwogYm9vbCBHZXRDb2xvcihjb25zdCBDUERGX0NvbG9yKiBwQ29sb3IsIGZsb2F0KiByZ2IpIHsKICAgaW50IGludFJHQlszXTsKICAgaWYgKCFwQ29sb3IgfHwgIXBDb2xvci0+SXNDb2xvclNwYWNlUkdCKCkgfHwKQEAgLTU3LDYgKzYzLDY4IEBACiAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIFJlY29yZFBhZ2VPYmplY3RSZXNvdXJjZVVzYWdlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcGFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlc01hcCYgc2Vlbl9yZXNvdXJjZXMpIHsKKyAgY29uc3QgQnl0ZVN0cmluZyYgcmVzb3VyY2VfbmFtZSA9IHBhZ2Vfb2JqZWN0LT5HZXRSZXNvdXJjZU5hbWUoKTsKKyAgaWYgKCFyZXNvdXJjZV9uYW1lLklzRW1wdHkoKSkgeworICAgIHN3aXRjaCAocGFnZV9vYmplY3QtPkdldFR5cGUoKSkgeworICAgICAgY2FzZSBDUERGX1BhZ2VPYmplY3Q6OlR5cGU6OmtUZXh0OgorICAgICAgICBzZWVuX3Jlc291cmNlc1siRm9udCJdLmluc2VydChyZXNvdXJjZV9uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfUGFnZU9iamVjdDo6VHlwZTo6a0ltYWdlOgorICAgICAgY2FzZSBDUERGX1BhZ2VPYmplY3Q6OlR5cGU6OmtGb3JtOgorICAgICAgICBzZWVuX3Jlc291cmNlc1siWE9iamVjdCJdLmluc2VydChyZXNvdXJjZV9uYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENQREZfUGFnZU9iamVjdDo6VHlwZTo6a1BhdGg6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDUERGX1BhZ2VPYmplY3Q6OlR5cGU6OmtTaGFkaW5nOgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgY29uc3QgQnl0ZVN0cmluZyYgZ3JhcGhpY3NfcmVzb3VyY2VfbmFtZSA9CisgICAgICBwYWdlX29iamVjdC0+R2V0R3JhcGhpY3NSZXNvdXJjZU5hbWUoKTsKKyAgaWYgKCFncmFwaGljc19yZXNvdXJjZV9uYW1lLklzRW1wdHkoKSkgeworICAgIHNlZW5fcmVzb3VyY2VzWyJFeHRHU3RhdGUiXS5pbnNlcnQoZ3JhcGhpY3NfcmVzb3VyY2VfbmFtZSk7CisgIH0KK30KKwordm9pZCBSZW1vdmVVbnVzZWRSZXNvdXJjZXMoUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gcmVzb3VyY2VzX2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXNvdXJjZXNNYXAmIHJlc291cmNlc19pbl91c2UpIHsKKyAgLy8gVE9ETyh0aGVzdGlnKTogUmVtb3ZlIG90aGVyIHVudXNlZCByZXNvdXJjZSB0eXBlczoKKyAgLy8gLSBDb2xvclNwYWNlCisgIC8vIC0gUGF0dGVybgorICAvLyAtIFNoYWRpbmcKKyAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrUmVzb3VyY2VLZXlzW10gPSB7IkV4dEdTdGF0ZSIsICJGb250IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlhPYmplY3QifTsKKyAgZm9yIChjb25zdCBjaGFyKiByZXNvdXJjZV9rZXkgOiBrUmVzb3VyY2VLZXlzKSB7CisgICAgUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gcmVzb3VyY2VfZGljdCA9CisgICAgICAgIHJlc291cmNlc19kaWN0LT5HZXRNdXRhYmxlRGljdEZvcihyZXNvdXJjZV9rZXkpOworICAgIGlmICghcmVzb3VyY2VfZGljdCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8Qnl0ZVN0cmluZz4ga2V5czsKKyAgICB7CisgICAgICBDUERGX0RpY3Rpb25hcnlMb2NrZXIgcmVzb3VyY2VfZGljdF9sb2NrZXIocmVzb3VyY2VfZGljdCk7CisgICAgICBmb3IgKGF1dG8mIGl0IDogcmVzb3VyY2VfZGljdF9sb2NrZXIpIHsKKyAgICAgICAga2V5cy5wdXNoX2JhY2soaXQuZmlyc3QpOworICAgICAgfQorICAgIH0KKworICAgIGF1dG8gaXQgPSByZXNvdXJjZXNfaW5fdXNlLmZpbmQocmVzb3VyY2Vfa2V5KTsKKyAgICBjb25zdCBzdGQ6OnNldDxCeXRlU3RyaW5nPiogcmVzb3VyY2VfaW5fdXNlX29mX2N1cnJlbnRfdHlwZSA9CisgICAgICAgIGl0ICE9IHJlc291cmNlc19pbl91c2UuZW5kKCkgPyAmaXQtPnNlY29uZCA6IG51bGxwdHI7CisgICAgZm9yIChjb25zdCBCeXRlU3RyaW5nJiBrZXkgOiBrZXlzKSB7CisgICAgICBpZiAocmVzb3VyY2VfaW5fdXNlX29mX2N1cnJlbnRfdHlwZSAmJgorICAgICAgICAgIHBkZml1bTo6Q29udGFpbnMoKnJlc291cmNlX2luX3VzZV9vZl9jdXJyZW50X3R5cGUsIGtleSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHJlc291cmNlX2RpY3QtPlJlbW92ZUZvcihrZXkuQXNTdHJpbmdWaWV3KCkpOworICAgIH0KKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvcjo6Q1BERl9QYWdlQ29udGVudEdlbmVyYXRvcigKQEAgLTcyLDcgKzE0MCwxNSBAQAogCiB2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OkdlbmVyYXRlQ29udGVudCgpIHsKICAgRENIRUNLKG1fcE9iakhvbGRlci0+SXNQYWdlKCkpOwotICBVcGRhdGVDb250ZW50U3RyZWFtcyhHZW5lcmF0ZU1vZGlmaWVkU3RyZWFtcygpKTsKKyAgc3RkOjptYXA8aW50MzJfdCwgZnhjcnQ6Om9zdHJpbmdzdHJlYW0+IG5ld19zdHJlYW1fZGF0YSA9CisgICAgICBHZW5lcmF0ZU1vZGlmaWVkU3RyZWFtcygpOworICAvLyBJZiBubyBzdHJlYW1zIHdlcmUgcmVnZW5lcmF0ZWQgb3IgcmVtb3ZlZCwgbm90aGluZyB0byBkbyBoZXJlLgorICBpZiAobmV3X3N0cmVhbV9kYXRhLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBVcGRhdGVDb250ZW50U3RyZWFtcyhzdGQ6Om1vdmUobmV3X3N0cmVhbV9kYXRhKSk7CisgIFVwZGF0ZVJlc291cmNlc0RpY3QoKTsKIH0KIAogc3RkOjptYXA8aW50MzJfdCwgZnhjcnQ6Om9zdHJpbmdzdHJlYW0+CkBAIC0xNDEsMTIgKzIxNywxMCBAQAogCiB2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlVwZGF0ZUNvbnRlbnRTdHJlYW1zKAogICAgIHN0ZDo6bWFwPGludDMyX3QsIGZ4Y3J0Ojpvc3RyaW5nc3RyZWFtPiYmIG5ld19zdHJlYW1fZGF0YSkgewotICAvLyBJZiBubyBzdHJlYW1zIHdlcmUgcmVnZW5lcmF0ZWQgb3IgcmVtb3ZlZCwgbm90aGluZyB0byBkbyBoZXJlLgotICBpZiAobmV3X3N0cmVhbV9kYXRhLmVtcHR5KCkpCi0gICAgcmV0dXJuOworICBDSEVDSyghbmV3X3N0cmVhbV9kYXRhLmVtcHR5KCkpOwogCiAgIC8vIE1ha2Ugc3VyZSBkZWZhdWx0IGdyYXBoaWNzIGFyZSBjcmVhdGVkLgotICBHZXRPckNyZWF0ZURlZmF1bHRHcmFwaGljcygpOworICBtX0RlZmF1bHRHcmFwaGljc05hbWUgPSBHZXRPckNyZWF0ZURlZmF1bHRHcmFwaGljcygpOwogCiAgIENQREZfUGFnZUNvbnRlbnRNYW5hZ2VyIHBhZ2VfY29udGVudF9tYW5hZ2VyKG1fcE9iakhvbGRlciwgbV9wRG9jdW1lbnQpOwogICBmb3IgKGF1dG8mIHBhaXIgOiBuZXdfc3RyZWFtX2RhdGEpIHsKQEAgLTE2MCwxOCArMjM0LDQyIEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBSZXRhaW5QdHI8Q1BERl9TdHJlYW0+IG9sZF9zdHJlYW0gPQotICAgICAgICBwYWdlX2NvbnRlbnRfbWFuYWdlci5HZXRTdHJlYW1CeUluZGV4KHN0cmVhbV9pbmRleCk7Ci0gICAgRENIRUNLKG9sZF9zdHJlYW0pOwotCi0gICAgLy8gSWYgYnVmIGlzIG5vdyBlbXB0eSwgcmVtb3ZlIHRoZSBzdHJlYW0gaW5zdGVhZCBvZiBzZXR0aW5nIHRoZSBkYXRhLgotICAgIGlmIChidWYtPnRlbGxwKCkgPD0gMCkKLSAgICAgIHBhZ2VfY29udGVudF9tYW5hZ2VyLlNjaGVkdWxlUmVtb3ZlU3RyZWFtQnlJbmRleChzdHJlYW1faW5kZXgpOwotICAgIGVsc2UKLSAgICAgIG9sZF9zdHJlYW0tPlNldERhdGFGcm9tU3RyaW5nc3RyZWFtQW5kUmVtb3ZlRmlsdGVyKGJ1Zik7CisgICAgcGFnZV9jb250ZW50X21hbmFnZXIuVXBkYXRlU3RyZWFtKHN0cmVhbV9pbmRleCwgYnVmKTsKICAgfQogfQogCit2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlVwZGF0ZVJlc291cmNlc0RpY3QoKSB7CisgIFJldGFpblB0cjxDUERGX0RpY3Rpb25hcnk+IHJlc291cmNlcyA9IG1fcE9iakhvbGRlci0+R2V0TXV0YWJsZVJlc291cmNlcygpOworICBpZiAoIXJlc291cmNlcykgeworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IHVpbnQzMl90IHJlc291cmNlc19vYmplY3RfbnVtYmVyID0gcmVzb3VyY2VzLT5HZXRPYmpOdW0oKTsKKyAgaWYgKHJlc291cmNlc19vYmplY3RfbnVtYmVyKSB7CisgICAgLy8gSWYgYHJlc291cmNlc2AgaXMgbm90IGFuIGlubGluZSBvYmplY3QsIHRoZW4gZG8gbm90IG1vZGlmeSBpdCBkaXJlY3RseSBpZgorICAgIC8vIGl0IGhhcyBtdWx0aXBsZSByZWZlcmVuY2VzLgorICAgIGlmIChwZGZpdW06OkNvbnRhaW5zKEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzKG1fcERvY3VtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNfb2JqZWN0X251bWJlcikpIHsKKyAgICAgIHJlc291cmNlcyA9IHBkZml1bTo6V3JhcFJldGFpbihyZXNvdXJjZXMtPkNsb25lKCktPkFzTXV0YWJsZURpY3Rpb25hcnkoKSk7CisgICAgICBjb25zdCB1aW50MzJfdCBjbG9uZV9vYmplY3RfbnVtYmVyID0KKyAgICAgICAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocmVzb3VyY2VzKTsKKyAgICAgIG1fcE9iakhvbGRlci0+U2V0UmVzb3VyY2VzKHJlc291cmNlcyk7CisgICAgICBtX3BPYmpIb2xkZXItPkdldE11dGFibGVEaWN0KCktPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oCisgICAgICAgICAgcGRmaXVtOjpwYWdlX29iamVjdDo6a1Jlc291cmNlcywgbV9wRG9jdW1lbnQsIGNsb25lX29iamVjdF9udW1iZXIpOworICAgIH0KKyAgfQorCisgIFJlc291cmNlc01hcCBzZWVuX3Jlc291cmNlczsKKyAgZm9yIChhdXRvJiBwYWdlX29iamVjdCA6IG1fcGFnZU9iamVjdHMpIHsKKyAgICBSZWNvcmRQYWdlT2JqZWN0UmVzb3VyY2VVc2FnZShwYWdlX29iamVjdCwgc2Vlbl9yZXNvdXJjZXMpOworICB9CisgIGlmICghbV9EZWZhdWx0R3JhcGhpY3NOYW1lLklzRW1wdHkoKSkgeworICAgIHNlZW5fcmVzb3VyY2VzWyJFeHRHU3RhdGUiXS5pbnNlcnQobV9EZWZhdWx0R3JhcGhpY3NOYW1lKTsKKyAgfQorCisgIFJlbW92ZVVudXNlZFJlc291cmNlcyhzdGQ6Om1vdmUocmVzb3VyY2VzKSwgc2Vlbl9yZXNvdXJjZXMpOworfQorCiBCeXRlU3RyaW5nIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlJlYWxpemVSZXNvdXJjZSgKICAgICBjb25zdCBDUERGX09iamVjdCogcFJlc291cmNlLAogICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGJzVHlwZSkgY29uc3QgewpAQCAtMTc5LDcgKzI3Nyw4IEBACiAgIGlmICghbV9wT2JqSG9sZGVyLT5HZXRSZXNvdXJjZXMoKSkgewogICAgIG1fcE9iakhvbGRlci0+U2V0UmVzb3VyY2VzKG1fcERvY3VtZW50LT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCkpOwogICAgIG1fcE9iakhvbGRlci0+R2V0TXV0YWJsZURpY3QoKS0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigKLSAgICAgICAgIlJlc291cmNlcyIsIG1fcERvY3VtZW50LCBtX3BPYmpIb2xkZXItPkdldFJlc291cmNlcygpLT5HZXRPYmpOdW0oKSk7CisgICAgICAgIHBkZml1bTo6cGFnZV9vYmplY3Q6OmtSZXNvdXJjZXMsIG1fcERvY3VtZW50LAorICAgICAgICBtX3BPYmpIb2xkZXItPkdldFJlc291cmNlcygpLT5HZXRPYmpOdW0oKSk7CiAgIH0KIAogICBSZXRhaW5QdHI8Q1BERl9EaWN0aW9uYXJ5PiBwUmVzTGlzdCA9CkBAIC0zMjEsNiArNDIwLDggQEAKICAgICBwSW1hZ2UtPkNvbnZlcnRTdHJlYW1Ub0luZGlyZWN0T2JqZWN0KCk7CiAKICAgQnl0ZVN0cmluZyBuYW1lID0gUmVhbGl6ZVJlc291cmNlKHBTdHJlYW0sICJYT2JqZWN0Iik7CisgIHBJbWFnZU9iai0+U2V0UmVzb3VyY2VOYW1lKG5hbWUpOworCiAgIGlmIChiV2FzSW5saW5lKSB7CiAgICAgYXV0byogcFBhZ2VEYXRhID0gQ1BERl9Eb2NQYWdlRGF0YTo6RnJvbURvY3VtZW50KG1fcERvY3VtZW50KTsKICAgICBwSW1hZ2VPYmotPlNldEltYWdlKHBQYWdlRGF0YS0+R2V0SW1hZ2UocFN0cmVhbS0+R2V0T2JqTnVtKCkpKTsKQEAgLTM0MCwxMCArNDQxLDExIEBACiAgIGlmICghcFN0cmVhbSkKICAgICByZXR1cm47CiAKKyAgQnl0ZVN0cmluZyBuYW1lID0gUmVhbGl6ZVJlc291cmNlKHBTdHJlYW0uR2V0KCksICJYT2JqZWN0Iik7CisgIHBGb3JtT2JqLT5TZXRSZXNvdXJjZU5hbWUobmFtZSk7CisKICAgKmJ1ZiA8PCAicVxuIjsKICAgV3JpdGVNYXRyaXgoKmJ1ZiwgcEZvcm1PYmotPmZvcm1fbWF0cml4KCkpIDw8ICIgY20gIjsKLQotICBCeXRlU3RyaW5nIG5hbWUgPSBSZWFsaXplUmVzb3VyY2UocFN0cmVhbS5HZXQoKSwgIlhPYmplY3QiKTsKICAgKmJ1ZiA8PCAiLyIgPDwgUERGX05hbWVFbmNvZGUobmFtZSkgPDwgIiBEbyBRXG4iOwogfQogCkBAIC00OTgsNiArNjAwLDcgQEAKICAgICB9CiAgICAgbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KGdzRGljdCk7CiAgICAgbmFtZSA9IFJlYWxpemVSZXNvdXJjZShzdGQ6Om1vdmUoZ3NEaWN0KSwgIkV4dEdTdGF0ZSIpOworICAgIHBQYWdlT2JqLT5TZXRHcmFwaGljc1Jlc291cmNlTmFtZShuYW1lKTsKICAgICBtX3BPYmpIb2xkZXItPkdyYXBoaWNzTWFwSW5zZXJ0KGdyYXBoRCwgbmFtZSk7CiAgIH0KICAgKmJ1ZiA8PCAiLyIgPDwgUERGX05hbWVFbmNvZGUobmFtZSkgPDwgIiBncyAiOwpAQCAtNTA4LDggKzYxMSw4IEBACiAgICpidWYgPDwgIjAgMCAwIFJHIDAgMCAwIHJnIDEgdyAiCiAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXA6OmtCdXR0KSA8PCAiIEogIgogICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbjo6a01pdGVyKSA8PCAiIGpcbiI7Ci0gIEJ5dGVTdHJpbmcgbmFtZSA9IEdldE9yQ3JlYXRlRGVmYXVsdEdyYXBoaWNzKCk7Ci0gICpidWYgPDwgIi8iIDw8IFBERl9OYW1lRW5jb2RlKG5hbWUpIDw8ICIgZ3MgIjsKKyAgbV9EZWZhdWx0R3JhcGhpY3NOYW1lID0gR2V0T3JDcmVhdGVEZWZhdWx0R3JhcGhpY3MoKTsKKyAgKmJ1ZiA8PCAiLyIgPDwgUERGX05hbWVFbmNvZGUobV9EZWZhdWx0R3JhcGhpY3NOYW1lKSA8PCAiIGdzICI7CiB9CiAKIEJ5dGVTdHJpbmcgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvcjo6R2V0T3JDcmVhdGVEZWZhdWx0R3JhcGhpY3MoKSBjb25zdCB7CkBAIC01NjIsMTAgKzY2NSwxMCBAQAogICB9CiAgIGRhdGEuYmFzZUZvbnQgPSBwRm9udC0+R2V0QmFzZUZvbnROYW1lKCk7CiAKLSAgQnl0ZVN0cmluZyBkaWN0TmFtZTsKKyAgQnl0ZVN0cmluZyBkaWN0X25hbWU7CiAgIGFic2w6Om9wdGlvbmFsPEJ5dGVTdHJpbmc+IG1heWJlX25hbWUgPSBtX3BPYmpIb2xkZXItPkZvbnRzTWFwU2VhcmNoKGRhdGEpOwogICBpZiAobWF5YmVfbmFtZS5oYXNfdmFsdWUoKSkgewotICAgIGRpY3ROYW1lID0gc3RkOjptb3ZlKG1heWJlX25hbWUudmFsdWUoKSk7CisgICAgZGljdF9uYW1lID0gc3RkOjptb3ZlKG1heWJlX25hbWUudmFsdWUoKSk7CiAgIH0gZWxzZSB7CiAgICAgUmV0YWluUHRyPGNvbnN0IENQREZfT2JqZWN0PiBwSW5kaXJlY3RGb250ID0gcEZvbnQtPkdldEZvbnREaWN0KCk7CiAgICAgaWYgKHBJbmRpcmVjdEZvbnQtPklzSW5saW5lKCkpIHsKQEAgLTU4MSwxMCArNjg0LDEyIEBACiAgICAgICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QocEZvbnREaWN0KTsKICAgICAgIHBJbmRpcmVjdEZvbnQgPSBzdGQ6Om1vdmUocEZvbnREaWN0KTsKICAgICB9Ci0gICAgZGljdE5hbWUgPSBSZWFsaXplUmVzb3VyY2Uoc3RkOjptb3ZlKHBJbmRpcmVjdEZvbnQpLCAiRm9udCIpOwotICAgIG1fcE9iakhvbGRlci0+Rm9udHNNYXBJbnNlcnQoZGF0YSwgZGljdE5hbWUpOworICAgIGRpY3RfbmFtZSA9IFJlYWxpemVSZXNvdXJjZShzdGQ6Om1vdmUocEluZGlyZWN0Rm9udCksICJGb250Iik7CisgICAgbV9wT2JqSG9sZGVyLT5Gb250c01hcEluc2VydChkYXRhLCBkaWN0X25hbWUpOwogICB9Ci0gICpidWYgPDwgIi8iIDw8IFBERl9OYW1lRW5jb2RlKGRpY3ROYW1lKSA8PCAiICI7CisgIHBUZXh0T2JqLT5TZXRSZXNvdXJjZU5hbWUoZGljdF9uYW1lKTsKKworICAqYnVmIDw8ICIvIiA8PCBQREZfTmFtZUVuY29kZShkaWN0X25hbWUpIDw8ICIgIjsKICAgV3JpdGVGbG9hdCgqYnVmLCBwVGV4dE9iai0+R2V0Rm9udFNpemUoKSkgPDwgIiBUZiAiOwogICAqYnVmIDw8IHN0YXRpY19jYXN0PGludD4ocFRleHRPYmotPkdldFRleHRSZW5kZXJNb2RlKCkpIDw8ICIgVHIgIjsKICAgQnl0ZVN0cmluZyB0ZXh0OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5oIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5oCmluZGV4IDQ1ODk0ZjMuLjA2YmIyMzkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3IuaAorKysgYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yLmgKQEAgLTU5LDE4ICs1OSwyNCBAQAogICAvLyBzdHJlYW1zIGFyZSBub3QgdG91Y2hlZC4KICAgc3RkOjptYXA8aW50MzJfdCwgZnhjcnQ6Om9zdHJpbmdzdHJlYW0+IEdlbmVyYXRlTW9kaWZpZWRTdHJlYW1zKCk7CiAKLSAgLy8gQWRkIGJ1ZmZlciBhcyBhIHN0cmVhbSBpbiBwYWdlJ3MgJ0NvbnRlbnRzJworICAvLyBGb3IgZWFjaCBlbnRyeSBpbiBgbmV3X3N0cmVhbV9kYXRhYCwgYWRkcyB0aGUgc3RyaW5nIGJ1ZmZlciB0byB0aGUgcGFnZSdzCisgIC8vIGNvbnRlbnQgc3RyZWFtLgogICB2b2lkIFVwZGF0ZUNvbnRlbnRTdHJlYW1zKAogICAgICAgc3RkOjptYXA8aW50MzJfdCwgZnhjcnQ6Om9zdHJpbmdzdHJlYW0+JiYgbmV3X3N0cmVhbV9kYXRhKTsKIAotICAvLyBTZXQgdGhlIHN0cmVhbSBpbmRleCBvZiBhbGwgcGFnZSBvYmplY3RzIHdpdGggc3RyZWFtIGluZGV4ID09CisgIC8vIFNldHMgdGhlIHN0cmVhbSBpbmRleCBvZiBhbGwgcGFnZSBvYmplY3RzIHdpdGggc3RyZWFtIGluZGV4ID09CiAgIC8vIHxDUERGX1BhZ2VPYmplY3Q6OmtOb0NvbnRlbnRTdHJlYW18LiBUaGVzZSBhcmUgbmV3IG9iamVjdHMgdGhhdCBoYWQgbm90CiAgIC8vIGJlZW4gcGFyc2VkIGZyb20gb3Igd3JpdHRlbiB0byBhbnkgY29udGVudCBzdHJlYW0geWV0LgogICB2b2lkIFVwZGF0ZVN0cmVhbWxlc3NQYWdlT2JqZWN0cyhpbnQgbmV3X2NvbnRlbnRfc3RyZWFtX2luZGV4KTsKIAorICAvLyBVcGRhdGVzIHRoZSByZXNvdXJjZSBkaWN0aW9uYXJ5IGZvciBgbV9wT2JqSG9sZGVyYCB0byBhY2NvdW50IGZvciBhbGwgdGhlCisgIC8vIGNoYW5nZXMuCisgIHZvaWQgVXBkYXRlUmVzb3VyY2VzRGljdCgpOworCiAgIFVub3duZWRQdHI8Q1BERl9QYWdlT2JqZWN0SG9sZGVyPiBjb25zdCBtX3BPYmpIb2xkZXI7CiAgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CiAgIHN0ZDo6dmVjdG9yPFVub3duZWRQdHI8Q1BERl9QYWdlT2JqZWN0Pj4gbV9wYWdlT2JqZWN0czsKKyAgQnl0ZVN0cmluZyBtX0RlZmF1bHRHcmFwaGljc05hbWU7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9FRElUX0NQREZfUEFHRUNPTlRFTlRHRU5FUkFUT1JfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRtYW5hZ2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRtYW5hZ2VyLmNwcAppbmRleCBkZTk3N2M5Li40YmUyMmU2IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50bWFuYWdlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudG1hbmFnZXIuY3BwCkBAIC00LDggKzQsMTIgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRtYW5hZ2VyLmgiCiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCkBAIC0xNiwyMSArMjAsMjUgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvb2JqZWN0X3RyZWVfdHJhdmVyc2FsX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hYnNlaWwtY3BwL2Fic2wvdHlwZXMvdmFyaWFudC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvY2hlY2suaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2NvbnRhaW5lcnMvYWRhcHRlcnMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2NvbnRhaW5lcnMvY29udGFpbnMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKIAogQ1BERl9QYWdlQ29udGVudE1hbmFnZXI6OkNQREZfUGFnZUNvbnRlbnRNYW5hZ2VyKAogICAgIENQREZfUGFnZU9iamVjdEhvbGRlciogcGFnZV9vYmpfaG9sZGVyLAotICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIGluZGlyZWN0X29ial9ob2xkZXIpCisgICAgQ1BERl9Eb2N1bWVudCogZG9jdW1lbnQpCiAgICAgOiBwYWdlX29ial9ob2xkZXJfKHBhZ2Vfb2JqX2hvbGRlciksCi0gICAgICBpbmRpcmVjdF9vYmpfaG9sZGVyXyhpbmRpcmVjdF9vYmpfaG9sZGVyKSB7CisgICAgICBkb2N1bWVudF8oZG9jdW1lbnQpLAorICAgICAgb2JqZWN0c193aXRoX211bHRpX3JlZnNfKEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzKGRvY3VtZW50XykpIHsKICAgUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gcGFnZV9kaWN0ID0gcGFnZV9vYmpfaG9sZGVyXy0+R2V0TXV0YWJsZURpY3QoKTsKICAgUmV0YWluUHRyPENQREZfT2JqZWN0PiBjb250ZW50c19vYmogPQogICAgICAgcGFnZV9kaWN0LT5HZXRNdXRhYmxlT2JqZWN0Rm9yKCJDb250ZW50cyIpOwogICBSZXRhaW5QdHI8Q1BERl9BcnJheT4gY29udGVudHNfYXJyYXkgPSBUb0FycmF5KGNvbnRlbnRzX29iaik7CiAgIGlmIChjb250ZW50c19hcnJheSkgeworICAgIENIRUNLKGNvbnRlbnRzX2FycmF5LT5Jc0lubGluZSgpKTsKICAgICBjb250ZW50c18gPSBzdGQ6Om1vdmUoY29udGVudHNfYXJyYXkpOwogICAgIHJldHVybjsKICAgfQpAQCAtNDMsMTAgKzUxLDE5IEBACiAgICAgICByZXR1cm47CiAKICAgICBjb250ZW50c19hcnJheS5SZXNldChpbmRpcmVjdF9vYmotPkFzTXV0YWJsZUFycmF5KCkpOwotICAgIGlmIChjb250ZW50c19hcnJheSkKLSAgICAgIGNvbnRlbnRzXyA9IHN0ZDo6bW92ZShjb250ZW50c19hcnJheSk7Ci0gICAgZWxzZSBpZiAoaW5kaXJlY3Rfb2JqLT5Jc1N0cmVhbSgpKQorICAgIGlmIChjb250ZW50c19hcnJheSkgeworICAgICAgaWYgKHBkZml1bTo6Q29udGFpbnMob2JqZWN0c193aXRoX211bHRpX3JlZnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNfYXJyYXktPkdldE9iak51bSgpKSkgeworICAgICAgICBSZXRhaW5QdHI8Q1BERl9BcnJheT4gY2xvbmVkX2NvbnRlbnRzX2FycmF5ID0KKyAgICAgICAgICAgIHBkZml1bTo6V3JhcFJldGFpbihjb250ZW50c19hcnJheS0+Q2xvbmUoKS0+QXNNdXRhYmxlQXJyYXkoKSk7CisgICAgICAgIHBhZ2VfZGljdC0+U2V0Rm9yKCJDb250ZW50cyIsIGNsb25lZF9jb250ZW50c19hcnJheSk7CisgICAgICAgIGNvbnRlbnRzXyA9IHN0ZDo6bW92ZShjbG9uZWRfY29udGVudHNfYXJyYXkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGVudHNfID0gc3RkOjptb3ZlKGNvbnRlbnRzX2FycmF5KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGluZGlyZWN0X29iai0+SXNTdHJlYW0oKSkgewogICAgICAgY29udGVudHNfID0gcGRmaXVtOjpXcmFwUmV0YWluKGluZGlyZWN0X29iai0+QXNNdXRhYmxlU3RyZWFtKCkpOworICAgIH0KICAgfQogfQogCkBAIC03NSwyMSArOTIsMjEgQEAKIH0KIAogc2l6ZV90IENQREZfUGFnZUNvbnRlbnRNYW5hZ2VyOjpBZGRTdHJlYW0oZnhjcnQ6Om9zdHJpbmdzdHJlYW0qIGJ1ZikgewotICBhdXRvIG5ld19zdHJlYW0gPSBpbmRpcmVjdF9vYmpfaG9sZGVyXy0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KCk7CisgIGF1dG8gbmV3X3N0cmVhbSA9IGRvY3VtZW50Xy0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KCk7CiAgIG5ld19zdHJlYW0tPlNldERhdGFGcm9tU3RyaW5nc3RyZWFtKGJ1Zik7CiAKICAgLy8gSWYgdGhlcmUgaXMgb25lIENvbnRlbnQgc3RyZWFtIChub3QgaW4gYW4gYXJyYXkpLCBub3cgdGhlcmUgd2lsbCBiZSB0d28sIHNvCiAgIC8vIGNyZWF0ZSBhbiBhcnJheSB3aXRoIHRoZSBvbGQgYW5kIHRoZSBuZXcgb25lLiBUaGUgbmV3IG9uZSdzIGluZGV4IGlzIDEuCiAgIFJldGFpblB0cjxDUERGX1N0cmVhbT4gY29udGVudHNfc3RyZWFtID0gR2V0Q29udGVudHNTdHJlYW0oKTsKICAgaWYgKGNvbnRlbnRzX3N0cmVhbSkgewotICAgIGF1dG8gbmV3X2NvbnRlbnRzX2FycmF5ID0gaW5kaXJlY3Rfb2JqX2hvbGRlcl8tPk5ld0luZGlyZWN0PENQREZfQXJyYXk+KCk7Ci0gICAgbmV3X2NvbnRlbnRzX2FycmF5LT5BcHBlbmROZXc8Q1BERl9SZWZlcmVuY2U+KGluZGlyZWN0X29ial9ob2xkZXJfLAorICAgIGF1dG8gbmV3X2NvbnRlbnRzX2FycmF5ID0gZG9jdW1lbnRfLT5OZXdJbmRpcmVjdDxDUERGX0FycmF5PigpOworICAgIG5ld19jb250ZW50c19hcnJheS0+QXBwZW5kTmV3PENQREZfUmVmZXJlbmNlPihkb2N1bWVudF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzX3N0cmVhbS0+R2V0T2JqTnVtKCkpOwotICAgIG5ld19jb250ZW50c19hcnJheS0+QXBwZW5kTmV3PENQREZfUmVmZXJlbmNlPihpbmRpcmVjdF9vYmpfaG9sZGVyXywKKyAgICBuZXdfY29udGVudHNfYXJyYXktPkFwcGVuZE5ldzxDUERGX1JlZmVyZW5jZT4oZG9jdW1lbnRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3RyZWFtLT5HZXRPYmpOdW0oKSk7CiAKICAgICBSZXRhaW5QdHI8Q1BERl9EaWN0aW9uYXJ5PiBwYWdlX2RpY3QgPSBwYWdlX29ial9ob2xkZXJfLT5HZXRNdXRhYmxlRGljdCgpOwotICAgIHBhZ2VfZGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiQ29udGVudHMiLCBpbmRpcmVjdF9vYmpfaG9sZGVyXywKKyAgICBwYWdlX2RpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkNvbnRlbnRzIiwgZG9jdW1lbnRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfY29udGVudHNfYXJyYXktPkdldE9iak51bSgpKTsKICAgICBjb250ZW50c18gPSBzdGQ6Om1vdmUobmV3X2NvbnRlbnRzX2FycmF5KTsKICAgICByZXR1cm4gMTsKQEAgLTk4LDcgKzExNSw3IEBACiAgIC8vIElmIHRoZXJlIGlzIGFuIGFycmF5LCBqdXN0IGFkZCB0aGUgbmV3IHN0cmVhbSB0byBpdCwgYXQgdGhlIGxhc3QgcG9zaXRpb24uCiAgIFJldGFpblB0cjxDUERGX0FycmF5PiBjb250ZW50c19hcnJheSA9IEdldENvbnRlbnRzQXJyYXkoKTsKICAgaWYgKGNvbnRlbnRzX2FycmF5KSB7Ci0gICAgY29udGVudHNfYXJyYXktPkFwcGVuZE5ldzxDUERGX1JlZmVyZW5jZT4oaW5kaXJlY3Rfb2JqX2hvbGRlcl8sCisgICAgY29udGVudHNfYXJyYXktPkFwcGVuZE5ldzxDUERGX1JlZmVyZW5jZT4oZG9jdW1lbnRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zdHJlYW0tPkdldE9iak51bSgpKTsKICAgICByZXR1cm4gY29udGVudHNfYXJyYXktPnNpemUoKSAtIDE7CiAgIH0KQEAgLTEwNiwxMiArMTIzLDUyIEBACiAgIC8vIFRoZXJlIHdlcmUgbm8gQ29udGVudHMsIHNvIGFkZCB0aGUgbmV3IHN0cmVhbSBhcyB0aGUgc2luZ2xlIENvbnRlbnQgc3RyZWFtLgogICAvLyBJdHMgaW5kZXggaXMgMC4KICAgUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gcGFnZV9kaWN0ID0gcGFnZV9vYmpfaG9sZGVyXy0+R2V0TXV0YWJsZURpY3QoKTsKLSAgcGFnZV9kaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJDb250ZW50cyIsIGluZGlyZWN0X29ial9ob2xkZXJfLAorICBwYWdlX2RpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkNvbnRlbnRzIiwgZG9jdW1lbnRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0cmVhbS0+R2V0T2JqTnVtKCkpOwogICBjb250ZW50c18gPSBzdGQ6Om1vdmUobmV3X3N0cmVhbSk7CiAgIHJldHVybiAwOwogfQogCit2b2lkIENQREZfUGFnZUNvbnRlbnRNYW5hZ2VyOjpVcGRhdGVTdHJlYW0oc2l6ZV90IHN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeGNydDo6b3N0cmluZ3N0cmVhbSogYnVmKSB7CisgIC8vIElmIGBidWZgIGlzIG5vdyBlbXB0eSwgcmVtb3ZlIHRoZSBzdHJlYW0gaW5zdGVhZCBvZiBzZXR0aW5nIHRoZSBkYXRhLgorICBpZiAoYnVmLT50ZWxscCgpIDw9IDApIHsKKyAgICBTY2hlZHVsZVJlbW92ZVN0cmVhbUJ5SW5kZXgoc3RyZWFtX2luZGV4KTsKKyAgICByZXR1cm47CisgIH0KKworICBSZXRhaW5QdHI8Q1BERl9TdHJlYW0+IGV4aXN0aW5nX3N0cmVhbSA9IEdldFN0cmVhbUJ5SW5kZXgoc3RyZWFtX2luZGV4KTsKKyAgQ0hFQ0soZXhpc3Rpbmdfc3RyZWFtKTsKKyAgaWYgKCFwZGZpdW06OkNvbnRhaW5zKG9iamVjdHNfd2l0aF9tdWx0aV9yZWZzXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3N0cmVhbS0+R2V0T2JqTnVtKCkpKSB7CisgICAgZXhpc3Rpbmdfc3RyZWFtLT5TZXREYXRhRnJvbVN0cmluZ3N0cmVhbUFuZFJlbW92ZUZpbHRlcihidWYpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChHZXRDb250ZW50c1N0cmVhbSgpKSB7CisgICAgYXV0byBuZXdfc3RyZWFtID0gZG9jdW1lbnRfLT5OZXdJbmRpcmVjdDxDUERGX1N0cmVhbT4oKTsKKyAgICBuZXdfc3RyZWFtLT5TZXREYXRhRnJvbVN0cmluZ3N0cmVhbShidWYpOworICAgIFJldGFpblB0cjxDUERGX0RpY3Rpb25hcnk+IHBhZ2VfZGljdCA9IHBhZ2Vfb2JqX2hvbGRlcl8tPkdldE11dGFibGVEaWN0KCk7CisgICAgcGFnZV9kaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJDb250ZW50cyIsIGRvY3VtZW50XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N0cmVhbS0+R2V0T2JqTnVtKCkpOworICB9CisKKyAgUmV0YWluUHRyPENQREZfQXJyYXk+IGNvbnRlbnRzX2FycmF5ID0gR2V0Q29udGVudHNBcnJheSgpOworICBpZiAoIWNvbnRlbnRzX2FycmF5KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgUmV0YWluUHRyPENQREZfUmVmZXJlbmNlPiBzdHJlYW1fcmVmZXJlbmNlID0KKyAgICAgIFRvUmVmZXJlbmNlKGNvbnRlbnRzX2FycmF5LT5HZXRNdXRhYmxlT2JqZWN0QXQoc3RyZWFtX2luZGV4KSk7CisgIGlmICghc3RyZWFtX3JlZmVyZW5jZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGF1dG8gbmV3X3N0cmVhbSA9IGRvY3VtZW50Xy0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KCk7CisgIG5ld19zdHJlYW0tPlNldERhdGFGcm9tU3RyaW5nc3RyZWFtKGJ1Zik7CisgIHN0cmVhbV9yZWZlcmVuY2UtPlNldFJlZihkb2N1bWVudF8sIG5ld19zdHJlYW0tPkdldE9iak51bSgpKTsKK30KKwogdm9pZCBDUERGX1BhZ2VDb250ZW50TWFuYWdlcjo6U2NoZWR1bGVSZW1vdmVTdHJlYW1CeUluZGV4KHNpemVfdCBzdHJlYW1faW5kZXgpIHsKICAgc3RyZWFtc190b19yZW1vdmVfLmluc2VydChzdHJlYW1faW5kZXgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudG1hbmFnZXIuaCBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRtYW5hZ2VyLmgKaW5kZXggMzAxMzg0YS4uNTc4NWZjMyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudG1hbmFnZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50bWFuYWdlci5oCkBAIC01LDYgKzUsOCBAQAogI2lmbmRlZiBDT1JFX0ZQREZBUElfRURJVF9DUERGX1BBR0VDT05URU5UTUFOQUdFUl9IXwogI2RlZmluZSBDT1JFX0ZQREZBUElfRURJVF9DUERGX1BBR0VDT05URU5UTUFOQUdFUl9IXwogCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKICNpbmNsdWRlIDxzZXQ+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZ193cmFwcGVycy5oIgpAQCAtMTMsNDAgKzE1LDQ0IEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYWJzZWlsLWNwcC9hYnNsL3R5cGVzL3ZhcmlhbnQuaCIKIAogY2xhc3MgQ1BERl9BcnJheTsKLWNsYXNzIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI7CitjbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgQ1BERl9QYWdlT2JqZWN0SG9sZGVyOwogY2xhc3MgQ1BERl9TdHJlYW07CiAKIGNsYXNzIENQREZfUGFnZUNvbnRlbnRNYW5hZ2VyIHsKICBwdWJsaWM6CiAgIENQREZfUGFnZUNvbnRlbnRNYW5hZ2VyKENQREZfUGFnZU9iamVjdEhvbGRlciogcGFnZV9vYmpfaG9sZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBpbmRpcmVjdF9vYmpfaG9sZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogZG9jdW1lbnQpOwogICB+Q1BERl9QYWdlQ29udGVudE1hbmFnZXIoKTsKIAotICAvLyBHZXRzIHRoZSBDb250ZW50IHN0cmVhbSBhdCBhIGdpdmVuIGluZGV4LiBJZiBDb250ZW50cyBpcyBhIHNpbmdsZSBzdHJlYW0KLSAgLy8gcmF0aGVyIHRoYW4gYW4gYXJyYXksIGl0IGlzIHJldHJpZXZhYmxlIGF0IGluZGV4IDAuCi0gIFJldGFpblB0cjxDUERGX1N0cmVhbT4gR2V0U3RyZWFtQnlJbmRleChzaXplX3Qgc3RyZWFtX2luZGV4KTsKLQogICAvLyBBZGRzIGEgbmV3IENvbnRlbnQgc3RyZWFtLiBJdHMgaW5kZXggaW4gdGhlIGFycmF5IHdpbGwgYmUgcmV0dXJuZWQsIG9yIDAKICAgLy8gaWYgQ29udGVudHMgaXMgbm90IGFuIGFycmF5LCBidXQgb25seSBhIHNpbmdsZSBzdHJlYW0uCiAgIHNpemVfdCBBZGRTdHJlYW0oZnhjcnQ6Om9zdHJpbmdzdHJlYW0qIGJ1Zik7CiAKLSAgLy8gU2NoZWR1bGUgdGhlIHJlbW92YWwgb2YgdGhlIENvbnRlbnQgc3RyZWFtIGF0IGEgZ2l2ZW4gaW5kZXguIEl0IHdpbGwgYmUKKyAgLy8gQ2hhbmdlcyB0aGUgc3RyZWFtIGF0IGBzdHJlYW1faW5kZXhgIHRvIGNvbnRhaW4gdGhlIGRhdGEgaW4gYGJ1ZmAuIElmIGBidWZgCisgIC8vIGlzIGVtcHR5LCB0aGVuIHNjaGVkdWxlIHRoZSByZW1vdmFsIG9mIHRoZSBzdHJlYW0gaW5zdGVhZC4KKyAgdm9pZCBVcGRhdGVTdHJlYW0oc2l6ZV90IHN0cmVhbV9pbmRleCwgZnhjcnQ6Om9zdHJpbmdzdHJlYW0qIGJ1Zik7CisKKyBwcml2YXRlOgorICAvLyBHZXRzIHRoZSBDb250ZW50IHN0cmVhbSBhdCBhIGdpdmVuIGluZGV4LiBJZiBDb250ZW50cyBpcyBhIHNpbmdsZSBzdHJlYW0KKyAgLy8gcmF0aGVyIHRoYW4gYW4gYXJyYXksIGl0IGlzIHJldHJpZXZhYmxlIGF0IGluZGV4IDAuCisgIFJldGFpblB0cjxDUERGX1N0cmVhbT4gR2V0U3RyZWFtQnlJbmRleChzaXplX3Qgc3RyZWFtX2luZGV4KTsKKworICAvLyBTY2hlZHVsZXMgdGhlIHJlbW92YWwgb2YgdGhlIENvbnRlbnQgc3RyZWFtIGF0IGEgZ2l2ZW4gaW5kZXguIEl0IHdpbGwgYmUKICAgLy8gcmVtb3ZlZCB1cG9uIENQREZfUGFnZUNvbnRlbnRNYW5hZ2VyIGRlc3RydWN0aW9uLgogICB2b2lkIFNjaGVkdWxlUmVtb3ZlU3RyZWFtQnlJbmRleChzaXplX3Qgc3RyZWFtX2luZGV4KTsKIAotIHByaXZhdGU6Ci0gIC8vIFJlbW92ZSBhbGwgQ29udGVudCBzdHJlYW1zIGZvciB3aGljaCBTY2hlZHVsZVJlbW92ZVN0cmVhbUJ5SW5kZXgoKSB3YXMKKyAgLy8gUmVtb3ZlcyBhbGwgQ29udGVudCBzdHJlYW1zIGZvciB3aGljaCBTY2hlZHVsZVJlbW92ZVN0cmVhbUJ5SW5kZXgoKSB3YXMKICAgLy8gY2FsbGVkLiBVcGRhdGUgdGhlIGNvbnRlbnQgc3RyZWFtIG9mIGFsbCBwYWdlIG9iamVjdHMgd2l0aCB0aGUgc2hpZnRlZAogICAvLyBpbmRleGVzLgogICB2b2lkIEV4ZWN1dGVTY2hlZHVsZWRSZW1vdmFscygpOwogCi0gcHJpdmF0ZToKICAgUmV0YWluUHRyPENQREZfU3RyZWFtPiBHZXRDb250ZW50c1N0cmVhbSgpOwogICBSZXRhaW5QdHI8Q1BERl9BcnJheT4gR2V0Q29udGVudHNBcnJheSgpOwogCiAgIFVub3duZWRQdHI8Q1BERl9QYWdlT2JqZWN0SG9sZGVyPiBjb25zdCBwYWdlX29ial9ob2xkZXJfOwotICBVbm93bmVkUHRyPENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI+IGNvbnN0IGluZGlyZWN0X29ial9ob2xkZXJfOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IGNvbnN0IGRvY3VtZW50XzsKKyAgY29uc3Qgc3RkOjpzZXQ8dWludDMyX3Q+IG9iamVjdHNfd2l0aF9tdWx0aV9yZWZzXzsKICAgLy8gV2hlbiBob2xkaW5nIGEgQ1BERl9TdHJlYW0sIHRoZSBwb2ludGVyIG1heSBiZSBudWxsLgogICBhYnNsOjp2YXJpYW50PFJldGFpblB0cjxDUERGX1N0cmVhbT4sIFJldGFpblB0cjxDUERGX0FycmF5Pj4gY29udGVudHNfOwogICBzdGQ6OnNldDxzaXplX3Q+IHN0cmVhbXNfdG9fcmVtb3ZlXzsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgKaW5kZXggZGVlMTcyNC4uYTc0Y2JhOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgKQEAgLTEzMyw2ICsxMzMsOSBAQAogCiAgIENGWF9Gb250KiBHZXRGb250RmFsbGJhY2soaW50IHBvc2l0aW9uKTsKIAorICBjb25zdCBCeXRlU3RyaW5nJiBHZXRSZXNvdXJjZU5hbWUoKSBjb25zdCB7IHJldHVybiBtX1Jlc291cmNlTmFtZTsgfQorICB2b2lkIFNldFJlc291cmNlTmFtZShjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7IG1fUmVzb3VyY2VOYW1lID0gbmFtZTsgfQorCiAgcHJvdGVjdGVkOgogICBDUERGX0ZvbnQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LCBSZXRhaW5QdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRm9udERpY3QpOwogCkBAIC0xNjMsNiArMTY2LDcgQEAKICAgdm9pZCBDaGVja0ZvbnRNZXRyaWNzKCk7CiAKICAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBjb25zdCBtX3BEb2N1bWVudDsKKyAgQnl0ZVN0cmluZyBtX1Jlc291cmNlTmFtZTsgIC8vIFRoZSByZXNvdXJjZSBuYW1lIGZvciB0aGlzIGZvbnQuCiAgIENGWF9Gb250IG1fRm9udDsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9Gb250Pj4gbV9Gb250RmFsbGJhY2tzOwogICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IG1fcEZvbnRGaWxlOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9hbGxzdGF0ZXMuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9hbGxzdGF0ZXMuY3BwCmluZGV4IDA3ZDRjNGYuLmE0MzMwZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2FsbHN0YXRlcy5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2N4eDE3X2JhY2twb3J0cy5oIgogCkBAIC0yNSw2ICsyNiw3IEBACiAKIHZvaWQgQ1BERl9BbGxTdGF0ZXM6OkNvcHkoY29uc3QgQ1BERl9BbGxTdGF0ZXMmIHNyYykgewogICBDb3B5U3RhdGVzKHNyYyk7CisgIG1fR3JhcGhpY3NSZXNvdXJjZU5hbWUgPSBzcmMubV9HcmFwaGljc1Jlc291cmNlTmFtZTsKICAgbV9UZXh0TWF0cml4ID0gc3JjLm1fVGV4dE1hdHJpeDsKICAgbV9QYXJlbnRNYXRyaXggPSBzcmMubV9QYXJlbnRNYXRyaXg7CiAgIG1fQ1RNID0gc3JjLm1fQ1RNOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9hbGxzdGF0ZXMuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmgKaW5kZXggMGFlMjgwMi4uNjNlYjUyNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9hbGxzdGF0ZXMuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2FsbHN0YXRlcy5oCkBAIC04LDYgKzgsNyBAQAogI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0FMTFNUQVRFU19IXwogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9ncmFwaGljc3RhdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9ieXRlc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogCiBjbGFzcyBDUERGX0FycmF5OwpAQCAtMjQsNiArMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIqIHBQYXJzZXIpOwogICB2b2lkIFNldExpbmVEYXNoKGNvbnN0IENQREZfQXJyYXkqIHBBcnJheSwgZmxvYXQgcGhhc2UsIGZsb2F0IHNjYWxlKTsKIAorICBCeXRlU3RyaW5nIG1fR3JhcGhpY3NSZXNvdXJjZU5hbWU7CiAgIENGWF9NYXRyaXggbV9UZXh0TWF0cml4OwogICBDRlhfTWF0cml4IG1fQ1RNOwogICBDRlhfTWF0cml4IG1fUGFyZW50TWF0cml4OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuaAppbmRleCBiNWY1ZTNmLi43ZDlkMDE1IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFya3MuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2dyYXBoaWNzdGF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2J5dGVzdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAKIGNsYXNzIENQREZfRm9ybU9iamVjdDsKQEAgLTg4LDYgKzg5LDE4IEBACiAgICAgbV9Db250ZW50U3RyZWFtID0gbmV3X2NvbnRlbnRfc3RyZWFtOwogICB9CiAKKyAgY29uc3QgQnl0ZVN0cmluZyYgR2V0UmVzb3VyY2VOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9SZXNvdXJjZU5hbWU7IH0KKyAgdm9pZCBTZXRSZXNvdXJjZU5hbWUoY29uc3QgQnl0ZVN0cmluZyYgcmVzb3VyY2VfbmFtZSkgeworICAgIG1fUmVzb3VyY2VOYW1lID0gcmVzb3VyY2VfbmFtZTsKKyAgfQorCisgIGNvbnN0IEJ5dGVTdHJpbmcmIEdldEdyYXBoaWNzUmVzb3VyY2VOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtX0dyYXBoaWNzUmVzb3VyY2VOYW1lOworICB9CisgIHZvaWQgU2V0R3JhcGhpY3NSZXNvdXJjZU5hbWUoY29uc3QgQnl0ZVN0cmluZyYgcmVzb3VyY2VfbmFtZSkgeworICAgIG1fR3JhcGhpY3NSZXNvdXJjZU5hbWUgPSByZXNvdXJjZV9uYW1lOworICB9CisKICBwcm90ZWN0ZWQ6CiAgIHZvaWQgQ29weURhdGEoY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwU3JjT2JqZWN0KTsKIApAQCAtOTcsNiArMTEwLDggQEAKICAgQ1BERl9Db250ZW50TWFya3MgbV9Db250ZW50TWFya3M7CiAgIGJvb2wgbV9iRGlydHkgPSBmYWxzZTsKICAgaW50MzJfdCBtX0NvbnRlbnRTdHJlYW07CisgIEJ5dGVTdHJpbmcgbV9SZXNvdXJjZU5hbWU7ICAgICAgICAgIC8vIFRoZSByZXNvdXJjZSBuYW1lIGZvciB0aGlzIG9iamVjdC4KKyAgQnl0ZVN0cmluZyBtX0dyYXBoaWNzUmVzb3VyY2VOYW1lOyAgLy8gTGlrZSBgbV9SZXNvdXJjZU5hbWVgIGJ1dCBmb3IgZ3JhcGhpY3MuCiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFHRU9CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlci5jcHAKaW5kZXggYzdjMjkxMS4uM2JiMzQ3MSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvYXV0b251bGxlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvc2NvcGVkX3NldF9pbnNlcnRpb24uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L3N0bF91dGlsLmgiCkBAIC00MjYsNiArNDI3LDcgQEAKICAgaWYgKGJUZXh0KSB7CiAgICAgcE9iai0+bV9UZXh0U3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlOwogICB9CisgIHBPYmotPlNldEdyYXBoaWNzUmVzb3VyY2VOYW1lKG1fcEN1clN0YXRlcy0+bV9HcmFwaGljc1Jlc291cmNlTmFtZSk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNjUwLDcgKzY1Miw4IEBACiAgICAgaWYgKG1fcFN5bnRheC0+R2V0V29yZCgpID09ICJFSSIpCiAgICAgICBicmVhazsKICAgfQotICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0gQWRkSW1hZ2VGcm9tU3RyZWFtKHN0ZDo6bW92ZShwU3RyZWFtKSk7CisgIENQREZfSW1hZ2VPYmplY3QqIHBPYmogPQorICAgICAgQWRkSW1hZ2VGcm9tU3RyZWFtKHN0ZDo6bW92ZShwU3RyZWFtKSwgLypyZXNvdXJjZV9uYW1lPSovIiIpOwogICAvLyBSZWNvcmQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGlzIGltYWdlLCBzbyByZW5kZXJpbmcgY29kZSBjYW4gZHJhdyBpdAogICAvLyBwcm9wZXJseS4KICAgaWYgKHBPYmogJiYgcE9iai0+R2V0SW1hZ2UoKS0+SXNNYXNrKCkpCkBAIC03NDIsMTQgKzc0NSwxNSBAQAogICAgIHR5cGUgPSBwWE9iamVjdC0+R2V0RGljdCgpLT5HZXRCeXRlU3RyaW5nRm9yKCJTdWJ0eXBlIik7CiAKICAgaWYgKHR5cGUgPT0gIkZvcm0iKSB7Ci0gICAgQWRkRm9ybShzdGQ6Om1vdmUocFhPYmplY3QpKTsKKyAgICBBZGRGb3JtKHN0ZDo6bW92ZShwWE9iamVjdCksIG5hbWUpOwogICAgIHJldHVybjsKICAgfQogCiAgIGlmICh0eXBlID09ICJJbWFnZSIpIHsKICAgICBDUERGX0ltYWdlT2JqZWN0KiBwT2JqID0KLSAgICAgICAgcFhPYmplY3QtPklzSW5saW5lKCkgPyBBZGRJbWFnZUZyb21TdHJlYW0oVG9TdHJlYW0ocFhPYmplY3QtPkNsb25lKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFkZEltYWdlRnJvbVN0cmVhbU9iak51bShwWE9iamVjdC0+R2V0T2JqTnVtKCkpOworICAgICAgICBwWE9iamVjdC0+SXNJbmxpbmUoKQorICAgICAgICAgICAgPyBBZGRJbWFnZUZyb21TdHJlYW0oVG9TdHJlYW0ocFhPYmplY3QtPkNsb25lKCkpLCBuYW1lKQorICAgICAgICAgICAgOiBBZGRJbWFnZUZyb21TdHJlYW1PYmpOdW0ocFhPYmplY3QtPkdldE9iak51bSgpLCBuYW1lKTsKIAogICAgIG1fTGFzdEltYWdlTmFtZSA9IHN0ZDo6bW92ZShuYW1lKTsKICAgICBpZiAocE9iaikgewpAQCAtNzYwLDcgKzc2NCw4IEBACiAgIH0KIH0KIAotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZEZvcm0oUmV0YWluUHRyPENQREZfU3RyZWFtPiBwU3RyZWFtKSB7Cit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkRm9ybShSZXRhaW5QdHI8Q1BERl9TdHJlYW0+IHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7CiAgIENQREZfQWxsU3RhdGVzIHN0YXR1czsKICAgc3RhdHVzLm1fR2VuZXJhbFN0YXRlID0gbV9wQ3VyU3RhdGVzLT5tX0dlbmVyYWxTdGF0ZTsKICAgc3RhdHVzLm1fR3JhcGhTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9HcmFwaFN0YXRlOwpAQCAtNzczLDYgKzc3OCw4IEBACiAgIENGWF9NYXRyaXggbWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX0NUTSAqIG1fbXRDb250ZW50VG9Vc2VyOwogICBhdXRvIHBGb3JtT2JqID0gc3RkOjptYWtlX3VuaXF1ZTxDUERGX0Zvcm1PYmplY3Q+KEdldEN1cnJlbnRTdHJlYW1JbmRleCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShmb3JtKSwgbWF0cml4KTsKKyAgcEZvcm1PYmotPlNldFJlc291cmNlTmFtZShuYW1lKTsKKyAgcEZvcm1PYmotPlNldEdyYXBoaWNzUmVzb3VyY2VOYW1lKG1fcEN1clN0YXRlcy0+bV9HcmFwaGljc1Jlc291cmNlTmFtZSk7CiAgIGlmICghbV9wT2JqZWN0SG9sZGVyLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKSAmJgogICAgICAgcEZvcm1PYmotPmZvcm0oKS0+QmFja2dyb3VuZEFscGhhTmVlZGVkKCkpIHsKICAgICBtX3BPYmplY3RIb2xkZXItPlNldEJhY2tncm91bmRBbHBoYU5lZWRlZCh0cnVlKTsKQEAgLTc4MywxMSArNzkwLDEzIEBACiB9CiAKIENQREZfSW1hZ2VPYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkSW1hZ2VGcm9tU3RyZWFtKAotICAgIFJldGFpblB0cjxDUERGX1N0cmVhbT4gcFN0cmVhbSkgeworICAgIFJldGFpblB0cjxDUERGX1N0cmVhbT4gcFN0cmVhbSwKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7CiAgIGlmICghcFN0cmVhbSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBhdXRvIHBJbWFnZU9iaiA9IHN0ZDo6bWFrZV91bmlxdWU8Q1BERl9JbWFnZU9iamVjdD4oR2V0Q3VycmVudFN0cmVhbUluZGV4KCkpOworICBwSW1hZ2VPYmotPlNldFJlc291cmNlTmFtZShuYW1lKTsKICAgcEltYWdlT2JqLT5TZXRJbWFnZSgKICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDUERGX0ltYWdlPihtX3BEb2N1bWVudCwgc3RkOjptb3ZlKHBTdHJlYW0pKSk7CiAKQEAgLTc5NSw4ICs4MDQsMTAgQEAKIH0KIAogQ1BERl9JbWFnZU9iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRJbWFnZUZyb21TdHJlYW1PYmpOdW0oCi0gICAgdWludDMyX3Qgc3RyZWFtX29ial9udW0pIHsKKyAgICB1aW50MzJfdCBzdHJlYW1fb2JqX251bSwKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7CiAgIGF1dG8gcEltYWdlT2JqID0gc3RkOjptYWtlX3VuaXF1ZTxDUERGX0ltYWdlT2JqZWN0PihHZXRDdXJyZW50U3RyZWFtSW5kZXgoKSk7CisgIHBJbWFnZU9iai0+U2V0UmVzb3VyY2VOYW1lKG5hbWUpOwogICBwSW1hZ2VPYmotPlNldEltYWdlKAogICAgICAgQ1BERl9Eb2NQYWdlRGF0YTo6RnJvbURvY3VtZW50KG1fcERvY3VtZW50KS0+R2V0SW1hZ2Uoc3RyZWFtX29ial9udW0pKTsKIApAQCAtODA3LDYgKzgxOCw3IEBACiAgIERDSEVDSyhtX3BMYXN0SW1hZ2UpOwogCiAgIGF1dG8gcEltYWdlT2JqID0gc3RkOjptYWtlX3VuaXF1ZTxDUERGX0ltYWdlT2JqZWN0PihHZXRDdXJyZW50U3RyZWFtSW5kZXgoKSk7CisgIHBJbWFnZU9iai0+U2V0UmVzb3VyY2VOYW1lKG1fTGFzdEltYWdlTmFtZSk7CiAgIHBJbWFnZU9iai0+U2V0SW1hZ2UoQ1BERl9Eb2NQYWdlRGF0YTo6RnJvbURvY3VtZW50KG1fcERvY3VtZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldEltYWdlKG1fcExhc3RJbWFnZS0+R2V0U3RyZWFtKCktPkdldE9iak51bSgpKSk7CiAKQEAgLTg5Miw2ICs5MDQsNyBAQAogICBpZiAoIXBHUykKICAgICByZXR1cm47CiAKKyAgbV9wQ3VyU3RhdGVzLT5tX0dyYXBoaWNzUmVzb3VyY2VOYW1lID0gbmFtZTsKICAgbV9wQ3VyU3RhdGVzLT5Qcm9jZXNzRXh0R1MocEdTLkdldCgpLCB0aGlzKTsKIH0KIApAQCAtMTE0Niw5ICsxMTU5LDE0IEBACiAgIH0KICAgUmV0YWluUHRyPENQREZfRm9udD4gcEZvbnQgPSBDUERGX0RvY1BhZ2VEYXRhOjpGcm9tRG9jdW1lbnQobV9wRG9jdW1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0Rm9udChzdGQ6Om1vdmUocEZvbnREaWN0KSk7Ci0gIGlmIChwRm9udCAmJiBwRm9udC0+SXNUeXBlM0ZvbnQoKSkgewotICAgIHBGb250LT5Bc1R5cGUzRm9udCgpLT5TZXRQYWdlUmVzb3VyY2VzKG1fcFJlc291cmNlcy5HZXQoKSk7Ci0gICAgcEZvbnQtPkFzVHlwZTNGb250KCktPkNoZWNrVHlwZTNGb250TWV0cmljcygpOworICBpZiAocEZvbnQpIHsKKyAgICAvLyBTYXZlIGBuYW1lYCBmb3IgbGF0ZXIgcmV0cmlldmFsIGJ5IHRoZSBDUERGX1RleHRPYmplY3QgdGhhdCB1c2VzIHRoZQorICAgIC8vIGZvbnQuCisgICAgcEZvbnQtPlNldFJlc291cmNlTmFtZShuYW1lKTsKKyAgICBpZiAocEZvbnQtPklzVHlwZTNGb250KCkpIHsKKyAgICAgIHBGb250LT5Bc1R5cGUzRm9udCgpLT5TZXRQYWdlUmVzb3VyY2VzKG1fcFJlc291cmNlcy5HZXQoKSk7CisgICAgICBwRm9udC0+QXNUeXBlM0ZvbnQoKS0+Q2hlY2tUeXBlM0ZvbnRNZXRyaWNzKCk7CisgICAgfQogICB9CiAgIHJldHVybiBwRm9udDsKIH0KQEAgLTEyMjMsNiArMTI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0VGV4dE1vZGUoKTsKICAgewogICAgIGF1dG8gcFRleHQgPSBzdGQ6Om1ha2VfdW5pcXVlPENQREZfVGV4dE9iamVjdD4oR2V0Q3VycmVudFN0cmVhbUluZGV4KCkpOworICAgIHBUZXh0LT5TZXRSZXNvdXJjZU5hbWUocEZvbnQtPkdldFJlc291cmNlTmFtZSgpKTsKICAgICBTZXRHcmFwaGljU3RhdGVzKHBUZXh0LmdldCgpLCB0cnVlLCB0cnVlLCB0cnVlKTsKICAgICBpZiAoVGV4dFJlbmRlcmluZ01vZGVJc1N0cm9rZU1vZGUodGV4dF9tb2RlKSkgewogICAgICAgcGRmaXVtOjpzcGFuPGZsb2F0PiBwQ1RNID0gcFRleHQtPm1fVGV4dFN0YXRlLkdldE11dGFibGVDVE0oKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlci5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmgKaW5kZXggODZkYTQ3ZC4uMjc2ZGM3MiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmgKQEAgLTExOSwxMSArMTE5LDEzIEBACiAgIHZvaWQgQWRkUGF0aFJlY3QoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgdywgZmxvYXQgaCk7CiAgIHZvaWQgQWRkUGF0aE9iamVjdChDRlhfRmlsbFJlbmRlck9wdGlvbnM6OkZpbGxUeXBlIGZpbGxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgIFJlbmRlclR5cGUgcmVuZGVyX3R5cGUpOwotICBDUERGX0ltYWdlT2JqZWN0KiBBZGRJbWFnZUZyb21TdHJlYW0oUmV0YWluUHRyPENQREZfU3RyZWFtPiBwU3RyZWFtKTsKLSAgQ1BERl9JbWFnZU9iamVjdCogQWRkSW1hZ2VGcm9tU3RyZWFtT2JqTnVtKHVpbnQzMl90IHN0cmVhbV9vYmpfbnVtKTsKKyAgQ1BERl9JbWFnZU9iamVjdCogQWRkSW1hZ2VGcm9tU3RyZWFtKFJldGFpblB0cjxDUERGX1N0cmVhbT4gcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpOworICBDUERGX0ltYWdlT2JqZWN0KiBBZGRJbWFnZUZyb21TdHJlYW1PYmpOdW0odWludDMyX3Qgc3RyZWFtX29ial9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lKTsKICAgQ1BERl9JbWFnZU9iamVjdCogQWRkTGFzdEltYWdlKCk7CiAKLSAgdm9pZCBBZGRGb3JtKFJldGFpblB0cjxDUERGX1N0cmVhbT4gcFN0cmVhbSk7CisgIHZvaWQgQWRkRm9ybShSZXRhaW5QdHI8Q1BERl9TdHJlYW0+IHBTdHJlYW0sIGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpOwogICB2b2lkIFNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUZXh0LApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9CVUlMRC5nbiBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvQlVJTEQuZ24KaW5kZXggYmRjMmU4Ni4uZTMxNTJkOCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9CVUlMRC5nbgorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL0JVSUxELmduCkBAIC03Myw2ICs3Myw4IEBACiAgICAgImZwZGZfcGFyc2VyX2RlY29kZS5oIiwKICAgICAiZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAiLAogICAgICJmcGRmX3BhcnNlcl91dGlsaXR5LmgiLAorICAgICJvYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbC5jcHAiLAorICAgICJvYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbC5oIiwKICAgXQogICBjb25maWdzICs9IFsgIi4uLy4uLy4uLzpwZGZpdW1fc3RyaWN0X2NvbmZpZyIgXQogICBkZXBzID0gWwpAQCAtMTUxLDYgKzE1Myw3IEBACiAgICAgImNwZGZfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJjcGRmX3NlY3VyaXR5X2hhbmRsZXJfZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgICAgImZwZGZfcGFyc2VyX2RlY29kZV9lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAib2JqZWN0X3RyZWVfdHJhdmVyc2FsX3V0aWxfZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgIF0KICAgZGVwcyA9IFsKICAgICAiOnBhcnNlciIsCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX3RhYmxlLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfdGFibGUuY3BwCmluZGV4IDI0NzQ5MzEuLjBiYjViYjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfdGFibGUuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfdGFibGUuY3BwCkBAIC0yNyw4ICsyNywxMCBAQAogCiBDUERGX0Nyb3NzUmVmVGFibGU6OkNQREZfQ3Jvc3NSZWZUYWJsZSgpID0gZGVmYXVsdDsKIAotQ1BERl9Dcm9zc1JlZlRhYmxlOjpDUERGX0Nyb3NzUmVmVGFibGUoUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gdHJhaWxlcikKLSAgICA6IHRyYWlsZXJfKHN0ZDo6bW92ZSh0cmFpbGVyKSkge30KK0NQREZfQ3Jvc3NSZWZUYWJsZTo6Q1BERl9Dcm9zc1JlZlRhYmxlKFJldGFpblB0cjxDUERGX0RpY3Rpb25hcnk+IHRyYWlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0cmFpbGVyX29iamVjdF9udW1iZXIpCisgICAgOiB0cmFpbGVyXyhzdGQ6Om1vdmUodHJhaWxlcikpLAorICAgICAgdHJhaWxlcl9vYmplY3RfbnVtYmVyXyh0cmFpbGVyX29iamVjdF9udW1iZXIpIHt9CiAKIENQREZfQ3Jvc3NSZWZUYWJsZTo6fkNQREZfQ3Jvc3NSZWZUYWJsZSgpID0gZGVmYXVsdDsKIApAQCAtOTAsOCArOTIsMTAgQEAKICAgaW5mby5wb3MgPSAwOwogfQogCi12b2lkIENQREZfQ3Jvc3NSZWZUYWJsZTo6U2V0VHJhaWxlcihSZXRhaW5QdHI8Q1BERl9EaWN0aW9uYXJ5PiB0cmFpbGVyKSB7Cit2b2lkIENQREZfQ3Jvc3NSZWZUYWJsZTo6U2V0VHJhaWxlcihSZXRhaW5QdHI8Q1BERl9EaWN0aW9uYXJ5PiB0cmFpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhaWxlcl9vYmplY3RfbnVtYmVyKSB7CiAgIHRyYWlsZXJfID0gc3RkOjptb3ZlKHRyYWlsZXIpOworICB0cmFpbGVyX29iamVjdF9udW1iZXJfID0gdHJhaWxlcl9vYmplY3RfbnVtYmVyOwogfQogCiBjb25zdCBDUERGX0Nyb3NzUmVmVGFibGU6Ok9iamVjdEluZm8qIENQREZfQ3Jvc3NSZWZUYWJsZTo6R2V0T2JqZWN0SW5mbygKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfdGFibGUuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfdGFibGUuaAppbmRleCBjMWQ2MzlmLi4yNDZlMTI5IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX3RhYmxlLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Nyb3NzX3JlZl90YWJsZS5oCkBAIC00OSw3ICs0OSw4IEBACiAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Dcm9zc1JlZlRhYmxlPiB0b3ApOwogCiAgIENQREZfQ3Jvc3NSZWZUYWJsZSgpOwotICBleHBsaWNpdCBDUERGX0Nyb3NzUmVmVGFibGUoUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gdHJhaWxlcik7CisgIENQREZfQ3Jvc3NSZWZUYWJsZShSZXRhaW5QdHI8Q1BERl9EaWN0aW9uYXJ5PiB0cmFpbGVyLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhaWxlcl9vYmplY3RfbnVtYmVyKTsKICAgfkNQREZfQ3Jvc3NSZWZUYWJsZSgpOwogCiAgIHZvaWQgQWRkQ29tcHJlc3NlZCh1aW50MzJfdCBvYmpfbnVtLApAQCAtNTgsNyArNTksOSBAQAogICB2b2lkIEFkZE5vcm1hbCh1aW50MzJfdCBvYmpfbnVtLCB1aW50MTZfdCBnZW5fbnVtLCBGWF9GSUxFU0laRSBwb3MpOwogICB2b2lkIFNldEZyZWUodWludDMyX3Qgb2JqX251bSk7CiAKLSAgdm9pZCBTZXRUcmFpbGVyKFJldGFpblB0cjxDUERGX0RpY3Rpb25hcnk+IHRyYWlsZXIpOworICB2b2lkIFNldFRyYWlsZXIoUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gdHJhaWxlciwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRyYWlsZXJfb2JqZWN0X251bWJlcik7CisgIHVpbnQzMl90IHRyYWlsZXJfb2JqZWN0X251bWJlcigpIGNvbnN0IHsgcmV0dXJuIHRyYWlsZXJfb2JqZWN0X251bWJlcl87IH0KICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiB0cmFpbGVyKCkgY29uc3QgeyByZXR1cm4gdHJhaWxlcl8uR2V0KCk7IH0KICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRNdXRhYmxlVHJhaWxlckZvclRlc3RpbmcoKSB7IHJldHVybiB0cmFpbGVyXy5HZXQoKTsgfQogCkBAIC03Nyw2ICs4MCwxMCBAQAogICB2b2lkIFVwZGF0ZVRyYWlsZXIoUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gbmV3X3RyYWlsZXIpOwogCiAgIFJldGFpblB0cjxDUERGX0RpY3Rpb25hcnk+IHRyYWlsZXJfOworICAvLyBgdHJhaWxlcl9gIGNhbiBiZSB0aGUgZGljdGlvbmFyeSBwYXJ0IG9mIGEgWFJlZiBzdHJlYW0gb2JqZWN0LiBTaW5jZSBpdCBpcworICAvLyBpbmxpbmUsIGl0IGhhcyBubyBvYmplY3QgbnVtYmVyLiBTdG9yZSB0aGUgc3RyZWFtJ3Mgb2JqZWN0IG51bWJlciwgb3IgMCBpZgorICAvLyB0aGVyZSBpcyBub25lLgorICB1aW50MzJfdCB0cmFpbGVyX29iamVjdF9udW1iZXJfID0gMDsKICAgc3RkOjptYXA8dWludDMyX3QsIE9iamVjdEluZm8+IG9iamVjdHNfaW5mb187CiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuY3BwCmluZGV4IGUyYmJmYmYuLjMwMmFlYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuY3BwCkBAIC01MSw2ICs1MSw5IEBACiAvLyBkaWN0aW9uYXJ5LgogY29uc3RleHByIHNpemVfdCBrTWluRmllbGRDb3VudCA9IDM7CiAKKy8vIFY0IHRyYWlsZXJzIGFyZSBpbmxpbmUuCitjb25zdGV4cHIgdWludDMyX3Qga05vVjRUcmFpbGVyT2JqZWN0TnVtYmVyID0gMDsKKwogc3RydWN0IENyb3NzUmVmVjVJbmRleEVudHJ5IHsKICAgdWludDMyX3Qgc3RhcnRfb2JqX251bTsKICAgdWludDMyX3Qgb2JqX2NvdW50OwpAQCAtMzc4LDcgKzM4MSw3IEBACiAgIGlmICghdHJhaWxlcikKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgbV9Dcm9zc1JlZlRhYmxlLT5TZXRUcmFpbGVyKHN0ZDo6bW92ZSh0cmFpbGVyKSk7CisgIG1fQ3Jvc3NSZWZUYWJsZS0+U2V0VHJhaWxlcihzdGQ6Om1vdmUodHJhaWxlciksIGtOb1Y0VHJhaWxlck9iamVjdE51bWJlcik7CiAgIGNvbnN0IGludDMyX3QgeHJlZnNpemUgPSBHZXRUcmFpbGVyKCktPkdldERpcmVjdEludGVnZXJGb3IoIlNpemUiKTsKICAgaWYgKHhyZWZzaXplID4gMCAmJiB4cmVmc2l6ZSA8PSBrTWF4WFJlZlNpemUpCiAgICAgU2hyaW5rT2JqZWN0TWFwKHhyZWZzaXplKTsKQEAgLTQxMiw3ICs0MTUsOCBAQAogCiAgICAgLy8gU0xPVyAuLi4KICAgICBtX0Nyb3NzUmVmVGFibGUgPSBDUERGX0Nyb3NzUmVmVGFibGU6Ok1lcmdlVXAoCi0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q1BERl9Dcm9zc1JlZlRhYmxlPihzdGQ6Om1vdmUocERpY3QpKSwKKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDUERGX0Nyb3NzUmVmVGFibGU+KHN0ZDo6bW92ZShwRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTm9WNFRyYWlsZXJPYmplY3ROdW1iZXIpLAogICAgICAgICBzdGQ6Om1vdmUobV9Dcm9zc1JlZlRhYmxlKSk7CiAgIH0KIApAQCAtNDUxLDcgKzQ1NSw4IEBACiAKICAgLy8gTWVyZ2UgdGhlIHRyYWlsZXJzLgogICBtX0Nyb3NzUmVmVGFibGUgPSBDUERGX0Nyb3NzUmVmVGFibGU6Ok1lcmdlVXAoCi0gICAgICBzdGQ6Om1ha2VfdW5pcXVlPENQREZfQ3Jvc3NSZWZUYWJsZT4oc3RkOjptb3ZlKG1haW5fdHJhaWxlcikpLAorICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDUERGX0Nyb3NzUmVmVGFibGU+KHN0ZDo6bW92ZShtYWluX3RyYWlsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtOb1Y0VHJhaWxlck9iamVjdE51bWJlciksCiAgICAgICBzdGQ6Om1vdmUobV9Dcm9zc1JlZlRhYmxlKSk7CiAKICAgLy8gTm93IEdldFRyYWlsZXIoKSByZXR1cm5zIHRoZSBtZXJnZWQgdHJhaWxlciwgd2hlcmUgL1ByZXYgaXMgZnJvbSB0aGUKQEAgLTQ3OCw3ICs0ODMsOCBAQAogCiAgICAgLy8gU0xPVyAuLi4KICAgICBtX0Nyb3NzUmVmVGFibGUgPSBDUERGX0Nyb3NzUmVmVGFibGU6Ok1lcmdlVXAoCi0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q1BERl9Dcm9zc1JlZlRhYmxlPihzdGQ6Om1vdmUocERpY3QpKSwKKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDUERGX0Nyb3NzUmVmVGFibGU+KHN0ZDo6bW92ZShwRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTm9WNFRyYWlsZXJPYmplY3ROdW1iZXIpLAogICAgICAgICBzdGQ6Om1vdmUobV9Dcm9zc1JlZlRhYmxlKSk7CiAgIH0KIApAQCAtNjkzLDExICs2OTksMTcgQEAKICAgICB9IGVsc2UgaWYgKHdvcmQgPT0gInRyYWlsZXIiKSB7CiAgICAgICBSZXRhaW5QdHI8Q1BERl9PYmplY3Q+IHBUcmFpbGVyID0gbV9wU3ludGF4LT5HZXRPYmplY3RCb2R5KG51bGxwdHIpOwogICAgICAgaWYgKHBUcmFpbGVyKSB7CisgICAgICAgIENQREZfU3RyZWFtKiBzdHJlYW1fdHJhaWxlciA9IHBUcmFpbGVyLT5Bc011dGFibGVTdHJlYW0oKTsKKyAgICAgICAgLy8gR3JhYiB0aGUgb2JqZWN0IG51bWJlciBmcm9tIGBwVHJhaWxlcmAgYmVmb3JlIHBvdGVudGlhbGx5IGNhbGxpbmcKKyAgICAgICAgLy8gc3RkOjptb3ZlKHBUcmFpbGVyKSBiZWxvdy4KKyAgICAgICAgY29uc3QgdWludDMyX3QgdHJhaWxlcl9vYmplY3RfbnVtYmVyID0gcFRyYWlsZXItPkdldE9iak51bSgpOworICAgICAgICBSZXRhaW5QdHI8Q1BERl9EaWN0aW9uYXJ5PiB0cmFpbGVyX2RpY3QgPQorICAgICAgICAgICAgc3RyZWFtX3RyYWlsZXIgPyBzdHJlYW1fdHJhaWxlci0+R2V0TXV0YWJsZURpY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUb0RpY3Rpb25hcnkoc3RkOjptb3ZlKHBUcmFpbGVyKSk7CiAgICAgICAgIGNyb3NzX3JlZl90YWJsZSA9IENQREZfQ3Jvc3NSZWZUYWJsZTo6TWVyZ2VVcCgKICAgICAgICAgICAgIHN0ZDo6bW92ZShjcm9zc19yZWZfdGFibGUpLAotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDUERGX0Nyb3NzUmVmVGFibGU+KFRvRGljdGlvbmFyeSgKLSAgICAgICAgICAgICAgICBwVHJhaWxlci0+SXNTdHJlYW0oKSA/IHBUcmFpbGVyLT5Bc1N0cmVhbSgpLT5HZXREaWN0KCktPkNsb25lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0ZDo6bW92ZShwVHJhaWxlcikpKSk7CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENQREZfQ3Jvc3NSZWZUYWJsZT4oc3RkOjptb3ZlKHRyYWlsZXJfZGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlcl9vYmplY3RfbnVtYmVyKSk7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmICh3b3JkID09ICJvYmoiICYmIG51bWJlcnMuc2l6ZSgpID09IDJ1KSB7CiAgICAgICBjb25zdCBGWF9GSUxFU0laRSBvYmpfcG9zID0gbnVtYmVyc1swXS5zZWNvbmQ7CkBAIC03MTMsNyArNzI1LDggQEAKICAgICAgICAgY3Jvc3NfcmVmX3RhYmxlID0gQ1BERl9Dcm9zc1JlZlRhYmxlOjpNZXJnZVVwKAogICAgICAgICAgICAgc3RkOjptb3ZlKGNyb3NzX3JlZl90YWJsZSksCiAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENQREZfQ3Jvc3NSZWZUYWJsZT4oCi0gICAgICAgICAgICAgICAgVG9EaWN0aW9uYXJ5KHBTdHJlYW0tPkdldERpY3QoKS0+Q2xvbmUoKSkpKTsKKyAgICAgICAgICAgICAgICBUb0RpY3Rpb25hcnkocFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpKSwKKyAgICAgICAgICAgICAgICBwU3RyZWFtLT5HZXRPYmpOdW0oKSkpOwogICAgICAgfQogCiAgICAgICBpZiAob2JqX251bSA8IGtNYXhPYmplY3ROdW1iZXIpIHsKQEAgLTc2MywxMiArNzc2LDEzIEBACiAKICAgUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gcE5ld1RyYWlsZXIgPSBUb0RpY3Rpb25hcnkocERpY3QtPkNsb25lKCkpOwogICBpZiAoYk1haW5YUmVmKSB7Ci0gICAgbV9Dcm9zc1JlZlRhYmxlID0KLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDUERGX0Nyb3NzUmVmVGFibGU+KHN0ZDo6bW92ZShwTmV3VHJhaWxlcikpOworICAgIG1fQ3Jvc3NSZWZUYWJsZSA9IHN0ZDo6bWFrZV91bmlxdWU8Q1BERl9Dcm9zc1JlZlRhYmxlPigKKyAgICAgICAgc3RkOjptb3ZlKHBOZXdUcmFpbGVyKSwgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwogICAgIG1fQ3Jvc3NSZWZUYWJsZS0+U2hyaW5rT2JqZWN0TWFwKHNpemUpOwogICB9IGVsc2UgewogICAgIG1fQ3Jvc3NSZWZUYWJsZSA9IENQREZfQ3Jvc3NSZWZUYWJsZTo6TWVyZ2VVcCgKLSAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDUERGX0Nyb3NzUmVmVGFibGU+KHN0ZDo6bW92ZShwTmV3VHJhaWxlcikpLAorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENQREZfQ3Jvc3NSZWZUYWJsZT4oc3RkOjptb3ZlKHBOZXdUcmFpbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPkdldE9iak51bSgpKSwKICAgICAgICAgc3RkOjptb3ZlKG1fQ3Jvc3NSZWZUYWJsZSkpOwogICB9CiAKQEAgLTkxMiw2ICs5MjYsMTAgQEAKICAgcmV0dXJuIG1fQ3Jvc3NSZWZUYWJsZS0+R2V0TXV0YWJsZVRyYWlsZXJGb3JUZXN0aW5nKCk7CiB9CiAKK3VpbnQzMl90IENQREZfUGFyc2VyOjpHZXRUcmFpbGVyT2JqZWN0TnVtYmVyKCkgY29uc3QgeworICByZXR1cm4gbV9Dcm9zc1JlZlRhYmxlLT50cmFpbGVyX29iamVjdF9udW1iZXIoKTsKK30KKwogUmV0YWluUHRyPENQREZfRGljdGlvbmFyeT4gQ1BERl9QYXJzZXI6OkdldENvbWJpbmVkVHJhaWxlcigpIGNvbnN0IHsKICAgcmV0dXJuIG1fQ3Jvc3NSZWZUYWJsZS0+dHJhaWxlcigpCiAgICAgICAgICAgICAgPyBUb0RpY3Rpb25hcnkobV9Dcm9zc1JlZlRhYmxlLT50cmFpbGVyKCktPkNsb25lKCkpCkBAIC0xMDc2LDcgKzEwOTQsNyBAQAogICAgIGlmICghdHJhaWxlcikKICAgICAgIHJldHVybiBTVUNDRVNTOwogCi0gICAgbV9Dcm9zc1JlZlRhYmxlLT5TZXRUcmFpbGVyKHN0ZDo6bW92ZSh0cmFpbGVyKSk7CisgICAgbV9Dcm9zc1JlZlRhYmxlLT5TZXRUcmFpbGVyKHN0ZDo6bW92ZSh0cmFpbGVyKSwga05vVjRUcmFpbGVyT2JqZWN0TnVtYmVyKTsKICAgICBjb25zdCBpbnQzMl90IHhyZWZzaXplID0gR2V0VHJhaWxlcigpLT5HZXREaXJlY3RJbnRlZ2VyRm9yKCJTaXplIik7CiAgICAgaWYgKHhyZWZzaXplID4gMCkgewogICAgICAgLy8gQ2hlY2sgaWYgYHhyZWZzaXplYCBpcyBjb3JyZWN0LiBJZiBpdCBpcyBpbmNvcnJlY3QsIGdpdmUgdXAgYW5kIHJlYnVpbGQKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuaAppbmRleCA1ZDAzNmEyLi4yMWRkOGFhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlci5oCkBAIC03OSw2ICs3OSw3IEBACiAKICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBHZXRUcmFpbGVyKCkgY29uc3Q7CiAgIENQREZfRGljdGlvbmFyeSogR2V0TXV0YWJsZVRyYWlsZXJGb3JUZXN0aW5nKCk7CisgIHVpbnQzMl90IEdldFRyYWlsZXJPYmplY3ROdW1iZXIoKSBjb25zdDsKIAogICAvLyBSZXR1cm5zIGEgbmV3IHRyYWlsZXIgd2hpY2ggY29tYmluZXMgdGhlIGxhc3QgcmVhZCB0cmFpbGVyIHdpdGggdGhlIC9Sb290CiAgIC8vIGFuZCAvSW5mbyBmcm9tIHByZXZpb3VzIG9uZXMuCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXJfdW5pdHRlc3QuY3BwCmluZGV4IGRhNjg2NDEuLmVmZGU5MGUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXJfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXJfdW5pdHRlc3QuY3BwCkBAIC0xMDIsNiArMTAyLDEwIEBACiAgICAgRVhQRUNUX0VRKG9mZnNldHNbaV0sIEdldE9iakluZm8ocGFyc2VyLCBpKS5wb3MpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ZDo6c2l6ZSh2ZXJzaW9ucyk7ICsraSkKICAgICBFWFBFQ1RfRVEodmVyc2lvbnNbaV0sIEdldE9iakluZm8ocGFyc2VyLCBpKS5nZW5udW0pOworCisgIGNvbnN0IENQREZfQ3Jvc3NSZWZUYWJsZSogY3Jvc3NfcmVmX3RhYmxlID0gcGFyc2VyLkdldENyb3NzUmVmVGFibGUoKTsKKyAgQVNTRVJUX1RSVUUoY3Jvc3NfcmVmX3RhYmxlKTsKKyAgRVhQRUNUX0VRKDB1LCBjcm9zc19yZWZfdGFibGUtPnRyYWlsZXJfb2JqZWN0X251bWJlcigpKTsKIH0KIAogVEVTVChQYXJzZXJUZXN0LCBSZWJ1aWxkQ3Jvc3NSZWZGYWlsZWQpIHsKQEAgLTMzNCw2ICszMzgsMTAgQEAKICAgQ1BERl9UZXN0UGFyc2VyIHBhcnNlcjsKICAgcGFyc2VyLkluaXRUZXN0RnJvbUJ1ZmZlcldpdGhPZmZzZXQoZGF0YSwga1Rlc3RIZWFkZXJPZmZzZXQpOwogICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VMaW5lYXJpemVkSGVhZGVyKCkpOworCisgIGNvbnN0IENQREZfQ3Jvc3NSZWZUYWJsZSogY3Jvc3NfcmVmX3RhYmxlID0gcGFyc2VyLkdldENyb3NzUmVmVGFibGUoKTsKKyAgQVNTRVJUX1RSVUUoY3Jvc3NfcmVmX3RhYmxlKTsKKyAgRVhQRUNUX0VRKDB1LCBjcm9zc19yZWZfdGFibGUtPnRyYWlsZXJfb2JqZWN0X251bWJlcigpKTsKIH0KIAogVEVTVChQYXJzZXJUZXN0LCBCYWRTdGFydFhyZWZTaG91bGROb3RCdWlsZENyb3NzUmVmVGFibGUpIHsKQEAgLTQzNCw4ICs0NDIsMTEgQEAKICAgICAgICIlJUVPRlxuIjsKICAgQVNTRVJUX1RSVUUocGFyc2VyLkluaXRUZXN0RnJvbUJ1ZmZlcihrRGF0YSkpOwogICBFWFBFQ1RfRVEoQ1BERl9QYXJzZXI6OlNVQ0NFU1MsIHBhcnNlci5TdGFydFBhcnNlSW50ZXJuYWwoKSk7Ci0gIEFTU0VSVF9UUlVFKHBhcnNlci5HZXRDcm9zc1JlZlRhYmxlKCkpOwotICBjb25zdCBhdXRvJiBvYmplY3RzX2luZm8gPSBwYXJzZXIuR2V0Q3Jvc3NSZWZUYWJsZSgpLT5vYmplY3RzX2luZm8oKTsKKworICBjb25zdCBDUERGX0Nyb3NzUmVmVGFibGUqIGNyb3NzX3JlZl90YWJsZSA9IHBhcnNlci5HZXRDcm9zc1JlZlRhYmxlKCk7CisgIEFTU0VSVF9UUlVFKGNyb3NzX3JlZl90YWJsZSk7CisgIEVYUEVDVF9FUSg3dSwgY3Jvc3NfcmVmX3RhYmxlLT50cmFpbGVyX29iamVjdF9udW1iZXIoKSk7CisgIGNvbnN0IGF1dG8mIG9iamVjdHNfaW5mbyA9IGNyb3NzX3JlZl90YWJsZS0+b2JqZWN0c19pbmZvKCk7CiAgIEVYUEVDVF9FUSgydSwgb2JqZWN0c19pbmZvLnNpemUoKSk7CiAKICAgLy8gU2tpcCBvdmVyIHRoZSBmaXJzdCBvYmplY3QsIGFuZCBjb250aW51ZSBwYXJzaW5nIHRoZSByZW1haW5pbmcgb2JqZWN0cy4KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaAppbmRleCBkZjI0NDU4Li4yNDFiMzk4IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oCkBAIC0zMiw2ICszMiw3IEBACiAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBob2xkZXIpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHVpbnQzMl90IEdldFJlZk9iak51bSgpIGNvbnN0IHsgcmV0dXJuIG1fUmVmT2JqTnVtOyB9CisgIGJvb2wgSGFzSW5kaXJlY3RPYmplY3RIb2xkZXIoKSBjb25zdCB7IHJldHVybiAhIW1fcE9iakxpc3Q7IH0KICAgdm9pZCBTZXRSZWYoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcERvYywgdWludDMyX3Qgb2JqbnVtKTsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL29iamVjdF90cmVlX3RyYXZlcnNhbF91dGlsLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvb2JqZWN0X3RyZWVfdHJhdmVyc2FsX3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTBkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL29iamVjdF90cmVlX3RyYXZlcnNhbF91dGlsLmNwcApAQCAtMCwwICsxLDIyMSBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIFBERml1bSBBdXRob3JzCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9vYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbC5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvY2hlY2suaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2NvbnRhaW5lcnMvY29udGFpbnMuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgT2JqZWN0VHJlZVRyYXZlcnNlciB7CisgcHVibGljOgorICBleHBsaWNpdCBPYmplY3RUcmVlVHJhdmVyc2VyKGNvbnN0IENQREZfRG9jdW1lbnQqIGRvY3VtZW50KQorICAgICAgOiBkb2N1bWVudF8oZG9jdW1lbnQpIHsKKyAgICBjb25zdCBDUERGX1BhcnNlciogcGFyc2VyID0gZG9jdW1lbnRfLT5HZXRQYXJzZXIoKTsKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHRyYWlsZXIgPSBwYXJzZXIgPyBwYXJzZXItPkdldFRyYWlsZXIoKSA6IG51bGxwdHI7CisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiByb290ID0gdHJhaWxlciA/IHRyYWlsZXIgOiBkb2N1bWVudF8tPkdldFJvb3QoKTsKKyAgICBjb25zdCB1aW50MzJfdCByb290X29iamVjdF9udW1iZXIgPQorICAgICAgICB0cmFpbGVyID8gcGFyc2VyLT5HZXRUcmFpbGVyT2JqZWN0TnVtYmVyKCkgOiByb290LT5HZXRPYmpOdW0oKTsKKyAgICAvLyBJZiBgcm9vdGAgaXMgYSB0cmFpbGVyLCB0aGVuIGl0IG1heSBub3QgaGF2ZSBhbiBvYmplY3QgbnVtYmVyLCBhcyBtYW55CisgICAgLy8gdHJhaWxlcnMgYXJlIGlubGluZWQuCisgICAgaWYgKHJvb3Rfb2JqZWN0X251bWJlcikgeworICAgICAgcmVmZXJlbmNlZF9vYmplY3RzX1tyb290X29iamVjdF9udW1iZXJdID0gMTsKKyAgICAgIG9iamVjdF9udW1iZXJfbWFwX1tyb290XSA9IHJvb3Rfb2JqZWN0X251bWJlcjsKKyAgICB9CisKKyAgICBvYmplY3RfcXVldWVfLnB1c2gocGRmaXVtOjpXcmFwUmV0YWluKHJvb3QpKTsKKyAgICBzZWVuX29iamVjdHNfLmluc2VydChyb290KTsKKyAgfQorICB+T2JqZWN0VHJlZVRyYXZlcnNlcigpID0gZGVmYXVsdDsKKworICB2b2lkIFRyYXZlcnNlKCkgeyBDYWxjdWxhdGVSZWZlcmVuY2VDb3VudHMoR2V0UmVmZXJlbmNlRW50cmllcygpKTsgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHVpbnQzMl90LCBpbnQ+JiByZWZlcmVuY2VkX29iamVjdHMoKSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZWRfb2JqZWN0c187CisgIH0KKworIHByaXZhdGU6CisgIHN0cnVjdCBSZWZlcmVuY2VFbnRyeSB7CisgICAgdWludDMyX3QgcmVmX29iamVjdF9udW1iZXI7CisgICAgdWludDMyX3QgcmVmZXJlbmNlZF9vYmplY3RfbnVtYmVyOworICB9OworCisgIHN0ZDo6dmVjdG9yPFJlZmVyZW5jZUVudHJ5PiBHZXRSZWZlcmVuY2VFbnRyaWVzKCkgeworICAgIHN0ZDo6dmVjdG9yPFJlZmVyZW5jZUVudHJ5PiByZWZlcmVuY2VfZW50cmllczsKKyAgICB3aGlsZSAoIW9iamVjdF9xdWV1ZV8uZW1wdHkoKSkgeworICAgICAgUmV0YWluUHRyPGNvbnN0IENQREZfT2JqZWN0PiBjdXJyZW50X29iamVjdCA9IG9iamVjdF9xdWV1ZV8uZnJvbnQoKTsKKyAgICAgIG9iamVjdF9xdWV1ZV8ucG9wKCk7CisKKyAgICAgIHN3aXRjaCAoY3VycmVudF9vYmplY3QtPkdldFR5cGUoKSkgeworICAgICAgICBjYXNlIENQREZfT2JqZWN0OjprQXJyYXk6IHsKKyAgICAgICAgICBDUERGX0FycmF5TG9ja2VyIGxvY2tlcihjdXJyZW50X29iamVjdC0+QXNBcnJheSgpKTsKKyAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbG9ja2VyKSB7CisgICAgICAgICAgICBQdXNoTmV3T2JqZWN0KGN1cnJlbnRfb2JqZWN0LCBpdCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1BERl9PYmplY3Q6OmtEaWN0aW9uYXJ5OiB7CisgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5TG9ja2VyIGxvY2tlcihjdXJyZW50X29iamVjdC0+QXNEaWN0aW9uYXJ5KCkpOworICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBsb2NrZXIpIHsKKyAgICAgICAgICAgIFB1c2hOZXdPYmplY3QoY3VycmVudF9vYmplY3QsIGl0LnNlY29uZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1BERl9PYmplY3Q6OmtSZWZlcmVuY2U6IHsKKyAgICAgICAgICBjb25zdCBDUERGX1JlZmVyZW5jZSogcmVmX29iamVjdCA9IGN1cnJlbnRfb2JqZWN0LT5Bc1JlZmVyZW5jZSgpOworICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlZl9vYmplY3RfbnVtYmVyID0gR2V0T2JqZWN0TnVtYmVyKHJlZl9vYmplY3QpOworICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJlZmVyZW5jZWRfb2JqZWN0X251bWJlciA9IHJlZl9vYmplY3QtPkdldFJlZk9iak51bSgpOworICAgICAgICAgIENIRUNLKHJlZmVyZW5jZWRfb2JqZWN0X251bWJlcik7CisKKyAgICAgICAgICBSZXRhaW5QdHI8Y29uc3QgQ1BERl9PYmplY3Q+IHJlZmVyZW5jZWRfb2JqZWN0OworICAgICAgICAgIGlmIChyZWZfb2JqZWN0LT5IYXNJbmRpcmVjdE9iamVjdEhvbGRlcigpKSB7CisgICAgICAgICAgICAvLyBDYWxsaW5nIEdldEluZGlyZWN0T2JqZWN0KCkgZG9lcyBub3Qgd29yayBmb3Igbm9ybWFsIHJlZmVyZW5jZXMuCisgICAgICAgICAgICByZWZlcmVuY2VkX29iamVjdCA9IHJlZl9vYmplY3QtPkdldERpcmVjdCgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDYWxsaW5nIEdldERpcmVjdCgpIGRvZXMgbm90IHdvcmsgZm9yIHJlZmVyZW5jZXMgZnJvbSB0cmFpbGVycy4KKyAgICAgICAgICAgIHJlZmVyZW5jZWRfb2JqZWN0ID0KKyAgICAgICAgICAgICAgICBkb2N1bWVudF8tPkdldEluZGlyZWN0T2JqZWN0KHJlZmVyZW5jZWRfb2JqZWN0X251bWJlcik7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFVubGlrZSB0aGUgb3RoZXIgb2JqZWN0IHR5cGVzLCBDUERGX1JlZmVyZW5jZSBjYW4gcG9pbnQgYXQgbnVsbHB0ci4KKyAgICAgICAgICBpZiAocmVmZXJlbmNlZF9vYmplY3QpIHsKKyAgICAgICAgICAgIHJlZmVyZW5jZV9lbnRyaWVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICB7cmVmX29iamVjdF9udW1iZXIsIHJlZmVyZW5jZWRfb2JqZWN0X251bWJlcn0pOworICAgICAgICAgICAgUHVzaE5ld09iamVjdChyZWZfb2JqZWN0LCByZWZlcmVuY2VkX29iamVjdCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1BERl9PYmplY3Q6OmtTdHJlYW06IHsKKyAgICAgICAgICBSZXRhaW5QdHI8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5PiBkaWN0ID0KKyAgICAgICAgICAgICAgY3VycmVudF9vYmplY3QtPkFzU3RyZWFtKCktPkdldERpY3QoKTsKKyAgICAgICAgICBDSEVDSyhkaWN0LT5Jc0lubGluZSgpKTsgIC8vIGkuZS4gTm8gb2JqZWN0IG51bWJlci4KKyAgICAgICAgICBDUERGX0RpY3Rpb25hcnlMb2NrZXIgbG9ja2VyKGRpY3QpOworICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBsb2NrZXIpIHsKKyAgICAgICAgICAgIFB1c2hOZXdPYmplY3QoY3VycmVudF9vYmplY3QsIGl0LnNlY29uZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVmZXJlbmNlX2VudHJpZXM7CisgIH0KKworICB2b2lkIENhbGN1bGF0ZVJlZmVyZW5jZUNvdW50cygKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFJlZmVyZW5jZUVudHJ5PiYgcmVmZXJlbmNlX2VudHJpZXMpIHsKKyAgICAvLyBUcmFja3MgUERGIG9iamVjdHMgdGhhdCByZWZlcmVuY2VkIG90aGVyIFBERiBvYmplY3RzLCBpZGVudGlmaWVkIGJ5IHRoZWlyCisgICAgLy8gb2JqZWN0IG51bWJlcnMuIE5ldmVyIDAuCisgICAgc3RkOjpzZXQ8dWludDMyX3Q+IHNlZW5fcmVmX29iamVjdHM7CisKKyAgICBmb3IgKGNvbnN0IFJlZmVyZW5jZUVudHJ5JiBlbnRyeSA6IHJlZmVyZW5jZV9lbnRyaWVzKSB7CisgICAgICAvLyBNYWtlIHN1cmUgdGhpcyBpcyBub3QgYSBzZWxmLXJlZmVyZW5jZS4KKyAgICAgIGlmIChlbnRyeS5yZWZlcmVuY2VkX29iamVjdF9udW1iZXIgPT0gZW50cnkucmVmX29iamVjdF9udW1iZXIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIGlzIG5vdCBhIGNpcmN1bGFyIHJlZmVyZW5jZS4KKyAgICAgIGlmIChwZGZpdW06OkNvbnRhaW5zKHNlZW5fcmVmX29iamVjdHMsIGVudHJ5LnJlZl9vYmplY3RfbnVtYmVyKSAmJgorICAgICAgICAgIHBkZml1bTo6Q29udGFpbnMoc2Vlbl9yZWZfb2JqZWN0cywgZW50cnkucmVmZXJlbmNlZF9vYmplY3RfbnVtYmVyKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgKytyZWZlcmVuY2VkX29iamVjdHNfW2VudHJ5LnJlZmVyZW5jZWRfb2JqZWN0X251bWJlcl07CisgICAgICBpZiAoZW50cnkucmVmX29iamVjdF9udW1iZXIpIHsKKyAgICAgICAgc2Vlbl9yZWZfb2JqZWN0cy5pbnNlcnQoZW50cnkucmVmX29iamVjdF9udW1iZXIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgUHVzaE5ld09iamVjdChjb25zdCBDUERGX09iamVjdCogcGFyZW50X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgIFJldGFpblB0cjxjb25zdCBDUERGX09iamVjdD4gY2hpbGRfb2JqZWN0KSB7CisgICAgQ0hFQ0socGFyZW50X29iamVjdCk7CisgICAgQ0hFQ0soY2hpbGRfb2JqZWN0KTsKKyAgICBjb25zdCBib29sIGluc2VydGVkID0gc2Vlbl9vYmplY3RzXy5pbnNlcnQoY2hpbGRfb2JqZWN0KS5zZWNvbmQ7CisgICAgaWYgKCFpbnNlcnRlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCB1aW50MzJfdCBjaGlsZF9vYmplY3RfbnVtYmVyID0gY2hpbGRfb2JqZWN0LT5HZXRPYmpOdW0oKTsKKyAgICBpZiAoY2hpbGRfb2JqZWN0X251bWJlcikgeworICAgICAgb2JqZWN0X251bWJlcl9tYXBfW2NoaWxkX29iamVjdF0gPSBjaGlsZF9vYmplY3RfbnVtYmVyOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGlzIHNlYXJjaCBjYW4gZmFpbCBmb3IgaW5saW5lZCB0cmFpbGVycy4KKyAgICAgIGF1dG8gaXQgPSBvYmplY3RfbnVtYmVyX21hcF8uZmluZChwYXJlbnRfb2JqZWN0KTsKKyAgICAgIGlmIChpdCAhPSBvYmplY3RfbnVtYmVyX21hcF8uZW5kKCkpIHsKKyAgICAgICAgb2JqZWN0X251bWJlcl9tYXBfW2NoaWxkX29iamVjdF0gPSBpdC0+c2Vjb25kOworICAgICAgfQorICAgIH0KKyAgICBvYmplY3RfcXVldWVfLnB1c2goc3RkOjptb3ZlKGNoaWxkX29iamVjdCkpOworICB9CisKKyAgLy8gUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4KKyAgdWludDMyX3QgR2V0T2JqZWN0TnVtYmVyKGNvbnN0IENQREZfT2JqZWN0KiBvYmplY3QpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gb2JqZWN0X251bWJlcl9tYXBfLmZpbmQob2JqZWN0KTsKKyAgICByZXR1cm4gaXQgIT0gb2JqZWN0X251bWJlcl9tYXBfLmVuZCgpID8gaXQtPnNlY29uZCA6IDA7CisgIH0KKworICBjb25zdCBDUERGX0RvY3VtZW50KiBjb25zdCBkb2N1bWVudF87CisKKyAgLy8gUXVldWUgb2Ygb2JqZWN0cyB0byB0cmF2ZXJzZS4KKyAgLy8gLSBQb2ludGVycyBpbiB0aGUgcXVldWUgYXJlIG5vbi1udWxsLgorICAvLyAtIFRoZSBzYW1lIHBvaW50ZXIgbmV2ZXIgZW50ZXJzIHRoZSBxdWV1ZSB0d2ljZS4KKyAgc3RkOjpxdWV1ZTxSZXRhaW5QdHI8Y29uc3QgQ1BERl9PYmplY3Q+PiBvYmplY3RfcXVldWVfOworCisgIC8vIE1hcCBvZiBvYmplY3RzIHRvICJ0b3AtbGV2ZWwiIG9iamVjdCBudW1iZXJzLiBGb3IgaW5saW5lIG9iamVjdHMsIHRoaXMgaXMKKyAgLy8gdGhlIGFuY2VzdG9yIG9iamVjdCB3aXRoIGFuIG9iamVjdCBudW1iZXIuIFRoZSBrZXlzIGFyZSBub24tbnVsbCBhbmQgdGhlCisgIC8vIHZhbHVlcyBhcmUgbmV2ZXIgMC4KKyAgLy8gVGhpcyBpcyB1c2VkIHRvIHByZXZlbnQgc2VsZi1yZWZlcmVuY2VzLCBhcyBhIHNpbmdsZSBQREYgb2JqZWN0LCB3aXRoCisgIC8vIGlubGluZWQgb2JqZWN0cywgaXMgcmVwcmVzZW50ZWQgYnkgbXVsdGlwbGUgQ1BERl9PYmplY3RzLgorICBzdGQ6Om1hcDxjb25zdCBDUERGX09iamVjdCosIHVpbnQzMl90PiBvYmplY3RfbnVtYmVyX21hcF87CisKKyAgLy8gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIHRvIHByZXZlbnQgZHVwbGljYXRlcyBmcm9tIGdldHRpbmcgaW50bworICAvLyBgb2JqZWN0X3F1ZXVlX2AgYW5kIGBvYmplY3RfbnVtYmVyX21hcF9gLgorICBzdGQ6OnNldDxjb25zdCBDUERGX09iamVjdCo+IHNlZW5fb2JqZWN0c187CisKKyAgLy8gVHJhY2tzIHdoaWNoIFBERiBvYmplY3RzIGFyZSByZWZlcmVuY2VkLgorICAvLyBLZXk6IG9iamVjdCBudW1iZXIKKyAgLy8gVmFsdWU6IG51bWJlciBvZiB0aW1lcyByZWZlcmVuY2VkCisgIHN0ZDo6bWFwPHVpbnQzMl90LCBpbnQ+IHJlZmVyZW5jZWRfb2JqZWN0c187Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjpzZXQ8dWludDMyX3Q+IEdldE9iamVjdHNXaXRoUmVmZXJlbmNlcyhjb25zdCBDUERGX0RvY3VtZW50KiBkb2N1bWVudCkgeworICBPYmplY3RUcmVlVHJhdmVyc2VyIHRyYXZlcnNlcihkb2N1bWVudCk7CisgIHRyYXZlcnNlci5UcmF2ZXJzZSgpOworCisgIHN0ZDo6c2V0PHVpbnQzMl90PiByZXN1bHRzOworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogdHJhdmVyc2VyLnJlZmVyZW5jZWRfb2JqZWN0cygpKSB7CisgICAgcmVzdWx0cy5pbnNlcnQoaXQuZmlyc3QpOworICB9CisgIHJldHVybiByZXN1bHRzOworfQorCitzdGQ6OnNldDx1aW50MzJfdD4gR2V0T2JqZWN0c1dpdGhNdWx0aXBsZVJlZmVyZW5jZXMoCisgICAgY29uc3QgQ1BERl9Eb2N1bWVudCogZG9jdW1lbnQpIHsKKyAgT2JqZWN0VHJlZVRyYXZlcnNlciB0cmF2ZXJzZXIoZG9jdW1lbnQpOworICB0cmF2ZXJzZXIuVHJhdmVyc2UoKTsKKworICBzdGQ6OnNldDx1aW50MzJfdD4gcmVzdWx0czsKKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6IHRyYXZlcnNlci5yZWZlcmVuY2VkX29iamVjdHMoKSkgeworICAgIGlmIChpdC5zZWNvbmQgPiAxKSB7CisgICAgICByZXN1bHRzLmluc2VydChpdC5maXJzdCk7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHRzOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9vYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbC5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9vYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZGI5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL29iamVjdF90cmVlX3RyYXZlcnNhbF91dGlsLmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIFBERml1bSBBdXRob3JzCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPUkVfRlBERkFQSV9QQVJTRVJfT0JKRUNUX1RSRUVfVFJBVkVSU0FMX1VUSUxfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX1BBUlNFUl9PQkpFQ1RfVFJFRV9UUkFWRVJTQUxfVVRJTF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzZXQ+CisKK2NsYXNzIENQREZfRG9jdW1lbnQ7CisKKy8vIFRyYXZlcnNlcyBgZG9jdW1lbnRgIHN0YXJ0aW5nIHdpdGggaXRzIHRyYWlsZXIsIGlmIGl0IGhhcyBvbmUsIG9yIHN0YXJ0aW5nIGF0CisvLyB0aGUgY2F0YWxvZywgd2hpY2ggYWx3YXlzIGV4aXN0cy4gVGhlIHRyYWlsZXIgc2hvdWxkIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlCisvLyBjYXRhbG9nLiBUaGUgdHJhdmVyc2FsIGF2b2lkcyBjeWNsZXMuCisvLyBSZXR1cm5zIGFsbCB0aGUgUERGIG9iamVjdHMgKG5vdCBDUERGX09iamVjdHMpIHRoZSB0cmF2ZXJzYWwgcmVhY2hlZCBhcyBhIHNldAorLy8gb2Ygb2JqZWN0IG51bWJlcnMuCitzdGQ6OnNldDx1aW50MzJfdD4gR2V0T2JqZWN0c1dpdGhSZWZlcmVuY2VzKGNvbnN0IENQREZfRG9jdW1lbnQqIGRvY3VtZW50KTsKKworLy8gU2FtZSBhcyBHZXRPYmplY3RzV2l0aFJlZmVyZW5jZXMoKSwgYnV0IG9ubHkgcmV0dXJucyB0aGUgb2JqZWN0cyB3aXRoCisvLyBtdWx0aXBsZSByZWZlcmVuY2VzLiBSZWZlcmVuY2VzIHRoYXQgd291bGQgY3JlYXRlIGEgY3ljbGUgYXJlIGlnbm9yZWQuCisvLworLy8gSW4gdGhpcyBleGFtcGxlLCB3aGVyZSAoQSkgaXMgdGhlIHJvb3Qgbm9kZToKKy8vCisvLyAgICAgQSAtPiBCCisvLyAgICAgQSAtPiBDCisvLyAgICAgQiAtPiBECisvLyAgICAgQyAtPiBECisvLworLy8gR2V0T2JqZWN0c1dpdGhNdWx0aXBsZVJlZmVyZW5jZXMoKSByZXR1cm5zIHtEfSwgc2luY2UgYm90aCAoQikgYW5kIChDKQorLy8gcmVmZXJlbmNlcyB0byAoRCksIGFuZCB0aGVyZSBhcmUgbm8gY3ljbGVzLgorLy8KKy8vIEluIHRoaXMgZXhhbXBsZSwgd2hlcmUgKEEpIGlzIHRoZSByb290IG5vZGU6CisvLworLy8gICAgIEEgLT4gQgorLy8gICAgIEIgLT4gQworLy8gICAgIEMgLT4gQgorLy8KKy8vIEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzKCkgcmV0dXJucyB7fSwgZXZlbiB0aG91Z2ggYm90aCAoQSkgYW5kIChDKQorLy8gcmVmZXJlbmNlcyAoQikuIFNpbmNlIChCKSAtPiAoQykgLT4gKEIpIGNyZWF0ZXMgYSBjeWNsZSwgdGhlIChDKSAtPiAoQikKKy8vIHJlZmVyZW5jZSBkb2VzIG5vdCBjb3VudC4KK3N0ZDo6c2V0PHVpbnQzMl90PiBHZXRPYmplY3RzV2l0aE11bHRpcGxlUmVmZXJlbmNlcygKKyAgICBjb25zdCBDUERGX0RvY3VtZW50KiBkb2N1bWVudCk7CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9PQkpFQ1RfVFJFRV9UUkFWRVJTQUxfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9vYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbF9lbWJlZGRlcnRlc3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9vYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbF9lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MGM3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL29iamVjdF90cmVlX3RyYXZlcnNhbF91dGlsX2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIFBERml1bSBBdXRob3JzCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9vYmplY3RfdHJlZV90cmF2ZXJzYWxfdXRpbC5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgdGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheTsKK3VzaW5nIE9iamVjdFRyZWVUcmF2ZXJzYWxVdGlsRW1iZWRkZXJUZXN0ID0gRW1iZWRkZXJUZXN0OworCituYW1lc3BhY2UgeworCitDUERGX0RvY3VtZW50KiBHZXRDUERGRG9jdW1lbnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICAvLyBUaGlzIGlzIGNoZWF0aW5nIHNsaWdodGx5IHRvIGF2b2lkIGEgbGF5ZXJpbmcgdmlvbGF0aW9uLCBzaW5jZSB0aGlzIGZpbGUKKyAgLy8gY2Fubm90IGluY2x1ZGUgZnBkZnNkay9jcGRmc2RrX2hlbHBlcnMuaCB0byBnZXQgYWNjZXNzIHRvCisgIC8vIENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoKS4KKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q1BERl9Eb2N1bWVudCo+KChkb2N1bWVudCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKE9iamVjdFRyZWVUcmF2ZXJzYWxVdGlsRW1iZWRkZXJUZXN0LCBHZXRPYmplY3RzV2l0aFJlZmVyZW5jZXNCYXNpYykgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkLnBkZiIpKTsKKyAgQ1BERl9Eb2N1bWVudCogZG9jID0gR2V0Q1BERkRvY3VtZW50KGRvY3VtZW50KCkpOworICBzdGQ6OnNldDx1aW50MzJfdD4gcmVmZXJlbmNlZF9vYmplY3RzID0gR2V0T2JqZWN0c1dpdGhSZWZlcmVuY2VzKGRvYyk7CisgIEVYUEVDVF9USEFUKHJlZmVyZW5jZWRfb2JqZWN0cywKKyAgICAgICAgICAgICAgVW5vcmRlcmVkRWxlbWVudHNBcmVBcnJheSh7MSwgMiwgMywgNCwgNSwgNn0pKTsKK30KKworVEVTVF9GKE9iamVjdFRyZWVUcmF2ZXJzYWxVdGlsRW1iZWRkZXJUZXN0LCBHZXRPYmplY3RzV2l0aFJlZmVyZW5jZXNOZXdEb2MpIHsKKyAgU2NvcGVkRlBERkRvY3VtZW50IG5ld19kb2MoRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpKTsKKyAgQ1BERl9Eb2N1bWVudCogZG9jID0gR2V0Q1BERkRvY3VtZW50KG5ld19kb2MuZ2V0KCkpOworICBzdGQ6OnNldDx1aW50MzJfdD4gcmVmZXJlbmNlZF9vYmplY3RzID0gR2V0T2JqZWN0c1dpdGhSZWZlcmVuY2VzKGRvYyk7CisgIC8vIEVtcHR5IGRvY3VtZW50cyBoYXZlIGEgY2F0YWxvZyBhbmQgYW4gZW1wdHkgcGFnZXMgb2JqZWN0LgorICBFWFBFQ1RfVEhBVChyZWZlcmVuY2VkX29iamVjdHMsIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoezEsIDJ9KSk7Cit9CisKK1RFU1RfRihPYmplY3RUcmVlVHJhdmVyc2FsVXRpbEVtYmVkZGVyVGVzdCwKKyAgICAgICBHZXRPYmplY3RzV2l0aFJlZmVyZW5jZXNDaXJjdWxhclJlZnMpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJjaXJjdWxhcl92aWV3ZXJfcmVmLnBkZiIpKTsKKyAgQ1BERl9Eb2N1bWVudCogZG9jID0gR2V0Q1BERkRvY3VtZW50KGRvY3VtZW50KCkpOworICBzdGQ6OnNldDx1aW50MzJfdD4gcmVmZXJlbmNlZF9vYmplY3RzID0gR2V0T2JqZWN0c1dpdGhSZWZlcmVuY2VzKGRvYyk7CisgIC8vIFRoZSB0cmFpbGVyIHBvaW50cyBhdCBhIGNhdGFsb2csIGFuZCB0aGUgY2F0YWxvZyBvbmx5IHJlZmVyZW5jZXMgaXRzZWxmLgorICBFWFBFQ1RfVEhBVChyZWZlcmVuY2VkX29iamVjdHMsIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoezF9KSk7Cit9CisKK1RFU1RfRihPYmplY3RUcmVlVHJhdmVyc2FsVXRpbEVtYmVkZGVyVGVzdCwKKyAgICAgICBHZXRPYmplY3RzV2l0aFJlZmVyZW5jZXNDcm9zc1JlZlN0cmVhbSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z18xMzk5LnBkZiIpKTsKKyAgQ1BERl9Eb2N1bWVudCogZG9jID0gR2V0Q1BERkRvY3VtZW50KGRvY3VtZW50KCkpOworICBzdGQ6OnNldDx1aW50MzJfdD4gcmVmZXJlbmNlZF9vYmplY3RzID0gR2V0T2JqZWN0c1dpdGhSZWZlcmVuY2VzKGRvYyk7CisgIC8vIFRoZSB0cmFpbGVyIGlzIHRoZSBkaWN0aW9uYXJ5IGluc2lkZSAvWFJlZiBvYmplY3QgMTYgMC4gTm90ZSB0aGF0IGl0CisgIC8vIHJlZmVyZW5jZXMgb2JqZWN0IDMgMCwgYnV0IHRoZSByZXN0IG9mIHRoZSBkb2N1bWVudCBkb2VzIG5vdC4KKyAgRVhQRUNUX1RIQVQocmVmZXJlbmNlZF9vYmplY3RzLAorICAgICAgICAgICAgICBVbm9yZGVyZWRFbGVtZW50c0FyZUFycmF5KHsxLCAyLCAzLCA0LCA1LCAxMiwgMTMsIDE0LCAxNn0pKTsKK30KKworVEVTVF9GKE9iamVjdFRyZWVUcmF2ZXJzYWxVdGlsRW1iZWRkZXJUZXN0LAorICAgICAgIEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzQmFzaWMpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CisgIENQREZfRG9jdW1lbnQqIGRvYyA9IEdldENQREZEb2N1bWVudChkb2N1bWVudCgpKTsKKyAgc3RkOjpzZXQ8dWludDMyX3Q+IHJlZmVyZW5jZWRfb2JqZWN0cyA9IEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzKGRvYyk7CisgIEVYUEVDVF9UUlVFKHJlZmVyZW5jZWRfb2JqZWN0cy5lbXB0eSgpKTsKK30KKworVEVTVF9GKE9iamVjdFRyZWVUcmF2ZXJzYWxVdGlsRW1iZWRkZXJUZXN0LAorICAgICAgIEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzTmV3RG9jKSB7CisgIFNjb3BlZEZQREZEb2N1bWVudCBuZXdfZG9jKEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKSk7CisgIENQREZfRG9jdW1lbnQqIGRvYyA9IEdldENQREZEb2N1bWVudChuZXdfZG9jLmdldCgpKTsKKyAgc3RkOjpzZXQ8dWludDMyX3Q+IHJlZmVyZW5jZWRfb2JqZWN0cyA9IEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzKGRvYyk7CisgIEVYUEVDVF9UUlVFKHJlZmVyZW5jZWRfb2JqZWN0cy5lbXB0eSgpKTsKK30KKworVEVTVF9GKE9iamVjdFRyZWVUcmF2ZXJzYWxVdGlsRW1iZWRkZXJUZXN0LAorICAgICAgIEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzQ2lyY3VsYXJSZWZzKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiY2lyY3VsYXJfdmlld2VyX3JlZi5wZGYiKSk7CisgIENQREZfRG9jdW1lbnQqIGRvYyA9IEdldENQREZEb2N1bWVudChkb2N1bWVudCgpKTsKKyAgc3RkOjpzZXQ8dWludDMyX3Q+IHJlZmVyZW5jZWRfb2JqZWN0cyA9IEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzKGRvYyk7CisgIEVYUEVDVF9UUlVFKHJlZmVyZW5jZWRfb2JqZWN0cy5lbXB0eSgpKTsKK30KKworVEVTVF9GKE9iamVjdFRyZWVUcmF2ZXJzYWxVdGlsRW1iZWRkZXJUZXN0LAorICAgICAgIEdldE9iamVjdHNXaXRoTXVsdGlwbGVSZWZlcmVuY2VzU2hhcmVkT2JqZWN0cykgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkXzJfcGFnZXMucGRmIikpOworICBDUERGX0RvY3VtZW50KiBkb2MgPSBHZXRDUERGRG9jdW1lbnQoZG9jdW1lbnQoKSk7CisgIHN0ZDo6c2V0PHVpbnQzMl90PiByZWZlcmVuY2VkX29iamVjdHMgPSBHZXRPYmplY3RzV2l0aE11bHRpcGxlUmVmZXJlbmNlcyhkb2MpOworICBFWFBFQ1RfVEhBVChyZWZlcmVuY2VkX29iamVjdHMsIFVub3JkZXJlZEVsZW1lbnRzQXJlQXJyYXkoezUsIDYsIDd9KSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZfZWRpdF9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9mcGRmX2VkaXRfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCBjZTQ2MmQ0Li45MWI5ZDZiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfZWRpdF9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZl9lZGl0X2VtYmVkZGVydGVzdC5jcHAKQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2NoZWNrLmgiCiAKIHVzaW5nIHBkZml1bTo6SGVsbG9Xb3JsZENoZWNrc3VtOwordXNpbmcgdGVzdGluZzo6SGFzU3Vic3RyOwordXNpbmcgdGVzdGluZzo6Tm90OwogCiBuYW1lc3BhY2UgewogCkBAIC05MDQsNiArOTA2LDcgQEAKICAgewogICAgIFNjb3BlZEZQREZQYWdlT2JqZWN0IHBhZ2Vfb2JqZWN0KEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAwKSk7CiAgICAgQVNTRVJUX1RSVUUocGFnZV9vYmplY3QpOworICAgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfVEVYVCwgRlBERlBhZ2VPYmpfR2V0VHlwZShwYWdlX29iamVjdC5nZXQoKSkpOwogICAgIEVYUEVDVF9UUlVFKEZQREZQYWdlX1JlbW92ZU9iamVjdChwYWdlLCBwYWdlX29iamVjdC5nZXQoKSkpOwogICB9CiAgIEFTU0VSVF9FUSgxLCBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZSkpOwpAQCAtOTI1LDkgKzkyOCwxOTcgQEAKICAgQVNTRVJUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKICAgVmVyaWZ5U2F2ZWREb2N1bWVudCgyMDAsIDIwMCwgRmlyc3RSZW1vdmVkQ2hlY2tzdW0oKSk7CiAKKyAgLy8gVmVyaWZ5IHJlbW92ZWQvcmVuYW1lZCByZXNvdXJjZXMgYXJlIG5vIGxvbmdlciB0aGVyZS4KKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIE5vdChIYXNTdWJzdHIoIi9GMSIpKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBOb3QoSGFzU3Vic3RyKCIvRjIiKSkpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgTm90KEhhc1N1YnN0cigiL1RpbWVzLVJvbWFuIikpKTsKKwogICBVbmxvYWRQYWdlKHBhZ2UpOwogfQogCitURVNUX0YoRlBERkVkaXRFbWJlZGRlclRlc3QsCisgICAgICAgUmVtb3ZlVGV4dE9iamVjdFdpdGhUd29QYWdlc1NoYXJpbmdDb250ZW50U3RyZWFtQW5kUmVzb3VyY2VzKSB7CisgIC8vIExvYWQgZG9jdW1lbnQgd2l0aCBzb21lIHRleHQuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGRfMl9wYWdlcy5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlMSA9IExvYWRQYWdlKDApOworICBBU1NFUlRfVFJVRShwYWdlMSk7CisgIEZQREZfUEFHRSBwYWdlMiA9IExvYWRQYWdlKDEpOworICBBU1NFUlRfVFJVRShwYWdlMik7CisKKyAgLy8gU2hvdyB3aGF0IHRoZSBvcmlnaW5hbCBmaWxlIGxvb2tzIGxpa2UuCisgIHsKKyAgICBTY29wZWRGUERGQml0bWFwIHBhZ2UxX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZTEpOworICAgIENvbXBhcmVCaXRtYXAocGFnZTFfYml0bWFwLmdldCgpLCAyMDAsIDIwMCwgSGVsbG9Xb3JsZENoZWNrc3VtKCkpOworICAgIFNjb3BlZEZQREZCaXRtYXAgcGFnZTJfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlMik7CisgICAgQ29tcGFyZUJpdG1hcChwYWdlMl9iaXRtYXAuZ2V0KCksIDIwMCwgMjAwLCBIZWxsb1dvcmxkQ2hlY2tzdW0oKSk7CisgIH0KKworICAvLyBHZXQgdGhlICJIZWxsbywgd29ybGQhIiB0ZXh0IG9iamVjdCBmcm9tIHBhZ2UgMSBhbmQgcmVtb3ZlIGl0LgorICBBU1NFUlRfRVEoMiwgRlBERlBhZ2VfQ291bnRPYmplY3RzKHBhZ2UxKSk7CisgIHsKKyAgICBTY29wZWRGUERGUGFnZU9iamVjdCBwYWdlX29iamVjdChGUERGUGFnZV9HZXRPYmplY3QocGFnZTEsIDApKTsKKyAgICBBU1NFUlRfVFJVRShwYWdlX29iamVjdCk7CisgICAgQVNTRVJUX0VRKEZQREZfUEFHRU9CSl9URVhULCBGUERGUGFnZU9ial9HZXRUeXBlKHBhZ2Vfb2JqZWN0LmdldCgpKSk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfUmVtb3ZlT2JqZWN0KHBhZ2UxLCBwYWdlX29iamVjdC5nZXQoKSkpOworICB9CisgIEFTU0VSVF9FUSgxLCBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZTEpKTsKKworICAvLyBWZXJpZnkgdGhlICJIZWxsbywgd29ybGQhIiB0ZXh0IGlzIGdvbmUgZnJvbSBwYWdlIDEuCisgIHsKKyAgICBTY29wZWRGUERGQml0bWFwIHBhZ2UxX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZTEpOworICAgIENvbXBhcmVCaXRtYXAocGFnZTFfYml0bWFwLmdldCgpLCAyMDAsIDIwMCwgRmlyc3RSZW1vdmVkQ2hlY2tzdW0oKSk7CisgICAgU2NvcGVkRlBERkJpdG1hcCBwYWdlMl9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UyKTsKKyAgICBDb21wYXJlQml0bWFwKHBhZ2UyX2JpdG1hcC5nZXQoKSwgMjAwLCAyMDAsIEhlbGxvV29ybGRDaGVja3N1bSgpKTsKKyAgfQorCisgIC8vIFZlcmlmeSB0aGUgcmVuZGVyaW5nIGFnYWluIGFmdGVyIGNhbGxpbmcgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KCkuCisgIEFTU0VSVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlMSkpOworICB7CisgICAgU2NvcGVkRlBERkJpdG1hcCBwYWdlMV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UxKTsKKyAgICBDb21wYXJlQml0bWFwKHBhZ2UxX2JpdG1hcC5nZXQoKSwgMjAwLCAyMDAsIEZpcnN0UmVtb3ZlZENoZWNrc3VtKCkpOworICAgIFNjb3BlZEZQREZCaXRtYXAgcGFnZTJfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlMik7CisgICAgQ29tcGFyZUJpdG1hcChwYWdlMl9iaXRtYXAuZ2V0KCksIDIwMCwgMjAwLCBIZWxsb1dvcmxkQ2hlY2tzdW0oKSk7CisgIH0KKworICAvLyBTYXZlIHRoZSBkb2N1bWVudCBhbmQgdmVyaWZ5IGl0IGFmdGVyIHJlbG9hZGluZy4KKyAgQVNTRVJUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgQVNTRVJUX1RSVUUoT3BlblNhdmVkRG9jdW1lbnQoKSk7CisgIEZQREZfUEFHRSBzYXZlZF9wYWdlMSA9IExvYWRTYXZlZFBhZ2UoMCk7CisgIFZlcmlmeVNhdmVkUmVuZGVyaW5nKHNhdmVkX3BhZ2UxLCAyMDAsIDIwMCwgRmlyc3RSZW1vdmVkQ2hlY2tzdW0oKSk7CisgIENsb3NlU2F2ZWRQYWdlKHNhdmVkX3BhZ2UxKTsKKyAgRlBERl9QQUdFIHNhdmVkX3BhZ2UyID0gTG9hZFNhdmVkUGFnZSgxKTsKKyAgVmVyaWZ5U2F2ZWRSZW5kZXJpbmcoc2F2ZWRfcGFnZTIsIDIwMCwgMjAwLCBIZWxsb1dvcmxkQ2hlY2tzdW0oKSk7CisgIENsb3NlU2F2ZWRQYWdlKHNhdmVkX3BhZ2UyKTsKKyAgQ2xvc2VTYXZlZERvY3VtZW50KCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0X3NhdmVkX2RhdGEgPSBTdHJpbmdTcGxpdChHZXRTdHJpbmcoKSwgJ1xuJyk7CisgIC8vIFZlcmlmeSByZW1vdmVkL3JlbmFtZWQgcmVzb3VyY2VzIGFyZSBpbiB0aGUgc2F2ZSBQREYgdGhlIGNvcnJlY3QgbnVtYmVyIG9mCisgIC8vIHRpbWVzLgorICBFWFBFQ1RfVEhBVChzcGxpdF9zYXZlZF9kYXRhLCBDb250YWlucyhIYXNTdWJzdHIoIi9GMSIpKS5UaW1lcygxKSk7CisgIEVYUEVDVF9USEFUKHNwbGl0X3NhdmVkX2RhdGEsIENvbnRhaW5zKEhhc1N1YnN0cigiL0YyIikpLlRpbWVzKDEpKTsKKyAgRVhQRUNUX1RIQVQoc3BsaXRfc2F2ZWRfZGF0YSwgQ29udGFpbnMoSGFzU3Vic3RyKCIvVGltZXMtUm9tYW4iKSkuVGltZXMoMSkpOworCisgIFVubG9hZFBhZ2UocGFnZTEpOworICBVbmxvYWRQYWdlKHBhZ2UyKTsKK30KKworVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJUZXN0LAorICAgICAgIFJlbW92ZVRleHRPYmplY3RXaXRoVHdvUGFnZXNTaGFyaW5nQ29udGVudEFycmF5QW5kUmVzb3VyY2VzKSB7CisgIC8vIExvYWQgZG9jdW1lbnQgd2l0aCBzb21lIHRleHQuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGRfMl9wYWdlc19zcGxpdF9zdHJlYW1zLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UxID0gTG9hZFBhZ2UoMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UxKTsKKyAgRlBERl9QQUdFIHBhZ2UyID0gTG9hZFBhZ2UoMSk7CisgIEFTU0VSVF9UUlVFKHBhZ2UyKTsKKworICAvLyBTaG93IHdoYXQgdGhlIG9yaWdpbmFsIGZpbGUgbG9va3MgbGlrZS4KKyAgeworICAgIFNjb3BlZEZQREZCaXRtYXAgcGFnZTFfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlMSk7CisgICAgQ29tcGFyZUJpdG1hcChwYWdlMV9iaXRtYXAuZ2V0KCksIDIwMCwgMjAwLCBIZWxsb1dvcmxkQ2hlY2tzdW0oKSk7CisgICAgU2NvcGVkRlBERkJpdG1hcCBwYWdlMl9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UyKTsKKyAgICBDb21wYXJlQml0bWFwKHBhZ2UyX2JpdG1hcC5nZXQoKSwgMjAwLCAyMDAsIEhlbGxvV29ybGRDaGVja3N1bSgpKTsKKyAgfQorCisgIC8vIEdldCB0aGUgIkhlbGxvLCB3b3JsZCEiIHRleHQgb2JqZWN0IGZyb20gcGFnZSAxIGFuZCByZW1vdmUgaXQuCisgIEFTU0VSVF9FUSgyLCBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZTEpKTsKKyAgeworICAgIFNjb3BlZEZQREZQYWdlT2JqZWN0IHBhZ2Vfb2JqZWN0KEZQREZQYWdlX0dldE9iamVjdChwYWdlMSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHBhZ2Vfb2JqZWN0KTsKKyAgICBBU1NFUlRfRVEoRlBERl9QQUdFT0JKX1RFWFQsIEZQREZQYWdlT2JqX0dldFR5cGUocGFnZV9vYmplY3QuZ2V0KCkpKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGFnZV9SZW1vdmVPYmplY3QocGFnZTEsIHBhZ2Vfb2JqZWN0LmdldCgpKSk7CisgIH0KKyAgQVNTRVJUX0VRKDEsIEZQREZQYWdlX0NvdW50T2JqZWN0cyhwYWdlMSkpOworCisgIC8vIFZlcmlmeSB0aGUgIkhlbGxvLCB3b3JsZCEiIHRleHQgaXMgZ29uZSBmcm9tIHBhZ2UgMS4KKyAgeworICAgIFNjb3BlZEZQREZCaXRtYXAgcGFnZTFfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlMSk7CisgICAgQ29tcGFyZUJpdG1hcChwYWdlMV9iaXRtYXAuZ2V0KCksIDIwMCwgMjAwLCBGaXJzdFJlbW92ZWRDaGVja3N1bSgpKTsKKyAgICBTY29wZWRGUERGQml0bWFwIHBhZ2UyX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZTIpOworICAgIENvbXBhcmVCaXRtYXAocGFnZTJfYml0bWFwLmdldCgpLCAyMDAsIDIwMCwgSGVsbG9Xb3JsZENoZWNrc3VtKCkpOworICB9CisKKyAgLy8gVmVyaWZ5IHRoZSByZW5kZXJpbmcgYWdhaW4gYWZ0ZXIgY2FsbGluZyBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoKS4KKyAgQVNTRVJUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UxKSk7CisgIHsKKyAgICBTY29wZWRGUERGQml0bWFwIHBhZ2UxX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZTEpOworICAgIENvbXBhcmVCaXRtYXAocGFnZTFfYml0bWFwLmdldCgpLCAyMDAsIDIwMCwgRmlyc3RSZW1vdmVkQ2hlY2tzdW0oKSk7CisgICAgU2NvcGVkRlBERkJpdG1hcCBwYWdlMl9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UyKTsKKyAgICBDb21wYXJlQml0bWFwKHBhZ2UyX2JpdG1hcC5nZXQoKSwgMjAwLCAyMDAsIEhlbGxvV29ybGRDaGVja3N1bSgpKTsKKyAgfQorCisgIC8vIFNhdmUgdGhlIGRvY3VtZW50IGFuZCB2ZXJpZnkgaXQgYWZ0ZXIgcmVsb2FkaW5nLgorICBBU1NFUlRfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICBBU1NFUlRfVFJVRShPcGVuU2F2ZWREb2N1bWVudCgpKTsKKyAgRlBERl9QQUdFIHNhdmVkX3BhZ2UxID0gTG9hZFNhdmVkUGFnZSgwKTsKKyAgVmVyaWZ5U2F2ZWRSZW5kZXJpbmcoc2F2ZWRfcGFnZTEsIDIwMCwgMjAwLCBGaXJzdFJlbW92ZWRDaGVja3N1bSgpKTsKKyAgQ2xvc2VTYXZlZFBhZ2Uoc2F2ZWRfcGFnZTEpOworICBGUERGX1BBR0Ugc2F2ZWRfcGFnZTIgPSBMb2FkU2F2ZWRQYWdlKDEpOworICBWZXJpZnlTYXZlZFJlbmRlcmluZyhzYXZlZF9wYWdlMiwgMjAwLCAyMDAsIEhlbGxvV29ybGRDaGVja3N1bSgpKTsKKyAgQ2xvc2VTYXZlZFBhZ2Uoc2F2ZWRfcGFnZTIpOworICBDbG9zZVNhdmVkRG9jdW1lbnQoKTsKKworICBVbmxvYWRQYWdlKHBhZ2UxKTsKKyAgVW5sb2FkUGFnZShwYWdlMik7Cit9CisKK1RFU1RfRihGUERGRWRpdEVtYmVkZGVyVGVzdCwgUmVtb3ZlVGV4dE9iamVjdFdpdGhUd29QYWdlc1NoYXJpbmdSZXNvdXJjZXNEaWN0KSB7CisgIC8vIExvYWQgZG9jdW1lbnQgd2l0aCBzb21lIHRleHQuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGRfMl9wYWdlc19zaGFyZWRfcmVzb3VyY2VzX2RpY3QucGRmIikpOworICBGUERGX1BBR0UgcGFnZTEgPSBMb2FkUGFnZSgwKTsKKyAgQVNTRVJUX1RSVUUocGFnZTEpOworICBGUERGX1BBR0UgcGFnZTIgPSBMb2FkUGFnZSgxKTsKKyAgQVNTRVJUX1RSVUUocGFnZTIpOworCisgIC8vIFNob3cgd2hhdCB0aGUgb3JpZ2luYWwgZmlsZSBsb29rcyBsaWtlLgorICB7CisgICAgU2NvcGVkRlBERkJpdG1hcCBwYWdlMV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UxKTsKKyAgICBDb21wYXJlQml0bWFwKHBhZ2UxX2JpdG1hcC5nZXQoKSwgMjAwLCAyMDAsIEhlbGxvV29ybGRDaGVja3N1bSgpKTsKKyAgICBTY29wZWRGUERGQml0bWFwIHBhZ2UyX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZTIpOworICAgIENvbXBhcmVCaXRtYXAocGFnZTJfYml0bWFwLmdldCgpLCAyMDAsIDIwMCwgSGVsbG9Xb3JsZENoZWNrc3VtKCkpOworICB9CisKKyAgLy8gR2V0IHRoZSAiSGVsbG8sIHdvcmxkISIgdGV4dCBvYmplY3QgZnJvbSBwYWdlIDEgYW5kIHJlbW92ZSBpdC4KKyAgQVNTRVJUX0VRKDIsIEZQREZQYWdlX0NvdW50T2JqZWN0cyhwYWdlMSkpOworICB7CisgICAgU2NvcGVkRlBERlBhZ2VPYmplY3QgcGFnZV9vYmplY3QoRlBERlBhZ2VfR2V0T2JqZWN0KHBhZ2UxLCAwKSk7CisgICAgQVNTRVJUX1RSVUUocGFnZV9vYmplY3QpOworICAgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfVEVYVCwgRlBERlBhZ2VPYmpfR2V0VHlwZShwYWdlX29iamVjdC5nZXQoKSkpOworICAgIEVYUEVDVF9UUlVFKEZQREZQYWdlX1JlbW92ZU9iamVjdChwYWdlMSwgcGFnZV9vYmplY3QuZ2V0KCkpKTsKKyAgfQorICBBU1NFUlRfRVEoMSwgRlBERlBhZ2VfQ291bnRPYmplY3RzKHBhZ2UxKSk7CisKKyAgLy8gVmVyaWZ5IHRoZSAiSGVsbG8sIHdvcmxkISIgdGV4dCBpcyBnb25lIGZyb20gcGFnZSAxCisgIHsKKyAgICBTY29wZWRGUERGQml0bWFwIHBhZ2UxX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZTEpOworICAgIENvbXBhcmVCaXRtYXAocGFnZTFfYml0bWFwLmdldCgpLCAyMDAsIDIwMCwgRmlyc3RSZW1vdmVkQ2hlY2tzdW0oKSk7CisgICAgU2NvcGVkRlBERkJpdG1hcCBwYWdlMl9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UyKTsKKyAgICBDb21wYXJlQml0bWFwKHBhZ2UyX2JpdG1hcC5nZXQoKSwgMjAwLCAyMDAsIEhlbGxvV29ybGRDaGVja3N1bSgpKTsKKyAgfQorCisgIC8vIFZlcmlmeSB0aGUgcmVuZGVyaW5nIGFnYWluIGFmdGVyIGNhbGxpbmcgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KCkuCisgIEFTU0VSVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlMSkpOworICB7CisgICAgU2NvcGVkRlBERkJpdG1hcCBwYWdlMV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UxKTsKKyAgICBDb21wYXJlQml0bWFwKHBhZ2UxX2JpdG1hcC5nZXQoKSwgMjAwLCAyMDAsIEZpcnN0UmVtb3ZlZENoZWNrc3VtKCkpOworICAgIFNjb3BlZEZQREZCaXRtYXAgcGFnZTJfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlMik7CisgICAgQ29tcGFyZUJpdG1hcChwYWdlMl9iaXRtYXAuZ2V0KCksIDIwMCwgMjAwLCBIZWxsb1dvcmxkQ2hlY2tzdW0oKSk7CisgIH0KKworICAvLyBTYXZlIHRoZSBkb2N1bWVudCBhbmQgdmVyaWZ5IGl0IGFmdGVyIHJlbG9hZGluZy4KKyAgQVNTRVJUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgQVNTRVJUX1RSVUUoT3BlblNhdmVkRG9jdW1lbnQoKSk7CisgIEZQREZfUEFHRSBzYXZlZF9wYWdlMSA9IExvYWRTYXZlZFBhZ2UoMCk7CisgIFZlcmlmeVNhdmVkUmVuZGVyaW5nKHNhdmVkX3BhZ2UxLCAyMDAsIDIwMCwgRmlyc3RSZW1vdmVkQ2hlY2tzdW0oKSk7CisgIENsb3NlU2F2ZWRQYWdlKHNhdmVkX3BhZ2UxKTsKKyAgRlBERl9QQUdFIHNhdmVkX3BhZ2UyID0gTG9hZFNhdmVkUGFnZSgxKTsKKyAgVmVyaWZ5U2F2ZWRSZW5kZXJpbmcoc2F2ZWRfcGFnZTIsIDIwMCwgMjAwLCBIZWxsb1dvcmxkQ2hlY2tzdW0oKSk7CisgIENsb3NlU2F2ZWRQYWdlKHNhdmVkX3BhZ2UyKTsKKyAgQ2xvc2VTYXZlZERvY3VtZW50KCk7CisKKyAgVW5sb2FkUGFnZShwYWdlMSk7CisgIFVubG9hZFBhZ2UocGFnZTIpOworfQorCiB2b2lkIENoZWNrTWFya0NvdW50cyhGUERGX1BBR0UgcGFnZSwKICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9mcm9tLAogICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX29iamVjdF9jb3VudCwKQEAgLTI4NzQsMTAgKzMwNjUsMTEgQEAKICAgICAgICAgICAgICAgICAgICI1Mzg0ZGEzNDA2ZDYyMzYwZmZiNWNhYzQ0NzZmZmYxYyIpOwogICB9CiAKLSAgLy8gTmV2ZXIgbWluZCwgbXkgbmV3IGZhdm9yaXRlIGNvbG9yIGlzIGJsdWUsIGluY3JlYXNlIGFscGhhCisgIC8vIE5ldmVyIG1pbmQsIG15IG5ldyBmYXZvcml0ZSBjb2xvciBpcyBibHVlLCBpbmNyZWFzZSBhbHBoYS4KKyAgLy8gVGhlIHJlZCBncmFwaGljcyBzdGF0ZSBnb2VzIGF3YXkuCiAgIEVYUEVDVF9UUlVFKEZQREZQYWdlT2JqX1NldEZpbGxDb2xvcihyZWN0LCAwLCAwLCAyNTUsIDE4MCkpOwogICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOwotICBFWFBFQ1RfRVEoM3UsIGdyYXBoaWNzX2RpY3QtPnNpemUoKSk7CisgIEVYUEVDVF9FUSgydSwgZ3JhcGhpY3NfZGljdC0+c2l6ZSgpKTsKIAogICAvLyBDaGVjayB0aGF0IGJpdG1hcCBkaXNwbGF5cyBjaGFuZ2VkIGNvbnRlbnQKICAgewpAQCAtMjg4OCw3ICszMDgwLDcgQEAKIAogICAvLyBBbmQgbm93IGdlbmVyYXRlLCB3aXRob3V0IGNoYW5nZXMKICAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKLSAgRVhQRUNUX0VRKDN1LCBncmFwaGljc19kaWN0LT5zaXplKCkpOworICBFWFBFQ1RfRVEoMnUsIGdyYXBoaWNzX2RpY3QtPnNpemUoKSk7CiAgIHsKICAgICBTY29wZWRGUERGQml0bWFwIHBhZ2VfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKICAgICBDb21wYXJlQml0bWFwKHBhZ2VfYml0bWFwLmdldCgpLCA2MTIsIDc5MiwKQEAgLTI5MTEsNyArMzEwMyw3IEBACiAKICAgLy8gR2VuZXJhdGUgeWV0IGFnYWluLCBjaGVjayBkaWN0cyBhcmUgcmVhc29uYWJseSBzaXplZAogICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOwotICBFWFBFQ1RfRVEoM3UsIGdyYXBoaWNzX2RpY3QtPnNpemUoKSk7CisgIEVYUEVDVF9FUSgydSwgZ3JhcGhpY3NfZGljdC0+c2l6ZSgpKTsKICAgRVhQRUNUX0VRKDF1LCBmb250X2RpY3QtPnNpemUoKSk7CiAgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmX3NhdmVfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZl9zYXZlX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggNDEzYmQ5MS4uM2Y1ZWZkOCAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmX3NhdmVfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL2ZwZGZfc2F2ZV9lbWJlZGRlcnRlc3QuY3BwCkBAIC0xNSw0MSArMTUsNDUgQEAKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAordXNpbmcgdGVzdGluZzo6SGFzU3Vic3RyOwordXNpbmcgdGVzdGluZzo6Tm90OwordXNpbmcgdGVzdGluZzo6U3RhcnRzV2l0aDsKKwogY2xhc3MgRlBERlNhdmVFbWJlZGRlclRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OwogCiBURVNUX0YoRlBERlNhdmVFbWJlZGRlclRlc3QsIFNhdmVTaW1wbGVEb2MpIHsKICAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7Ci0gIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuN1xyXG4iKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBTdGFydHNXaXRoKCIlUERGLTEuN1xyXG4iKSk7CiAgIEVYUEVDVF9FUSg4MDV1LCBHZXRTdHJpbmcoKS5zaXplKCkpOwogfQogCiBURVNUX0YoRlBERlNhdmVFbWJlZGRlclRlc3QsIFNhdmVTaW1wbGVEb2NXaXRoVmVyc2lvbikgewogICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkLnBkZiIpKTsKICAgRVhQRUNUX1RSVUUoRlBERl9TYXZlV2l0aFZlcnNpb24oZG9jdW1lbnQoKSwgdGhpcywgMCwgMTQpKTsKLSAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoIiVQREYtMS40XHJcbiIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIFN0YXJ0c1dpdGgoIiVQREYtMS40XHJcbiIpKTsKICAgRVhQRUNUX0VRKDgwNXUsIEdldFN0cmluZygpLnNpemUoKSk7CiB9CiAKIFRFU1RfRihGUERGU2F2ZUVtYmVkZGVyVGVzdCwgU2F2ZVNpbXBsZURvY1dpdGhCYWRWZXJzaW9uKSB7CiAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOwogICBFWFBFQ1RfVFJVRShGUERGX1NhdmVXaXRoVmVyc2lvbihkb2N1bWVudCgpLCB0aGlzLCAwLCAtMSkpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6U3RhcnRzV2l0aCgiJVBERi0xLjdcclxuIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgU3RhcnRzV2l0aCgiJVBERi0xLjdcclxuIikpOwogCiAgIENsZWFyU3RyaW5nKCk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZVdpdGhWZXJzaW9uKGRvY3VtZW50KCksIHRoaXMsIDAsIDApKTsKLSAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoIiVQREYtMS43XHJcbiIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIFN0YXJ0c1dpdGgoIiVQREYtMS43XHJcbiIpKTsKIAogICBDbGVhclN0cmluZygpOwogICBFWFBFQ1RfVFJVRShGUERGX1NhdmVXaXRoVmVyc2lvbihkb2N1bWVudCgpLCB0aGlzLCAwLCAxOCkpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6U3RhcnRzV2l0aCgiJVBERi0xLjdcclxuIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgU3RhcnRzV2l0aCgiJVBERi0xLjdcclxuIikpOwogfQogCiBURVNUX0YoRlBERlNhdmVFbWJlZGRlclRlc3QsIFNhdmVTaW1wbGVEb2NJbmNyZW1lbnRhbCkgewogICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkLnBkZiIpKTsKICAgRVhQRUNUX1RSVUUoRlBERl9TYXZlV2l0aFZlcnNpb24oZG9jdW1lbnQoKSwgdGhpcywgRlBERl9JTkNSRU1FTlRBTCwgMTQpKTsKICAgLy8gVmVyc2lvbiBnZXRzIHRha2VuIGFzLWlzIGZyb20gaW5wdXQgZG9jdW1lbnQuCi0gIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuN1xuJVx4YTBceGYyXHhhNFx4ZjQiKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBTdGFydHNXaXRoKCIlUERGLTEuN1xuJVx4YTBceGYyXHhhNFx4ZjQiKSk7CiAgIC8vIEFkZGl0aW9uYWwgb3V0cHV0IHByb2R1Y2VkIHZzLiBub24gaW5jcmVtZW50YWwuCiAgIEVYUEVDVF9FUSg5ODV1LCBHZXRTdHJpbmcoKS5zaXplKCkpOwogfQpAQCAtNTcsMjEgKzYxLDIxIEBACiBURVNUX0YoRlBERlNhdmVFbWJlZGRlclRlc3QsIFNhdmVTaW1wbGVEb2NOb0luY3JlbWVudGFsKSB7CiAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOwogICBFWFBFQ1RfVFJVRShGUERGX1NhdmVXaXRoVmVyc2lvbihkb2N1bWVudCgpLCB0aGlzLCBGUERGX05PX0lOQ1JFTUVOVEFMLCAxNCkpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6U3RhcnRzV2l0aCgiJVBERi0xLjRcclxuIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgU3RhcnRzV2l0aCgiJVBERi0xLjRcclxuIikpOwogICBFWFBFQ1RfRVEoODA1dSwgR2V0U3RyaW5nKCkuc2l6ZSgpKTsKIH0KIAogVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBTYXZlU2ltcGxlRG9jUmVtb3ZlU2VjdXJpdHkpIHsKICAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZVdpdGhWZXJzaW9uKGRvY3VtZW50KCksIHRoaXMsIEZQREZfUkVNT1ZFX1NFQ1VSSVRZLCAxNCkpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6U3RhcnRzV2l0aCgiJVBERi0xLjRcclxuIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgU3RhcnRzV2l0aCgiJVBERi0xLjRcclxuIikpOwogICBFWFBFQ1RfRVEoODA1dSwgR2V0U3RyaW5nKCkuc2l6ZSgpKTsKIH0KIAogVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBTYXZlU2ltcGxlRG9jQmFkRmxhZ3MpIHsKICAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZVdpdGhWZXJzaW9uKGRvY3VtZW50KCksIHRoaXMsIDk5OTk5OSwgMTQpKTsKLSAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoIiVQREYtMS40XHJcbiIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIFN0YXJ0c1dpdGgoIiVQREYtMS40XHJcbiIpKTsKICAgRVhQRUNUX0VRKDgwNXUsIEdldFN0cmluZygpLnNpemUoKSk7CiB9CiAKQEAgLTEwNiwxMCArMTEwLDE1IEBACiAgIH0KIAogICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6U3RhcnRzV2l0aCgiJVBERi0xLjZcclxuIikpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCIvUm9vdCAiKSk7Ci0gIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIi9JbmZvICIpKTsKLSAgRVhQRUNUX0VRKDgyMTl1LCBHZXRTdHJpbmcoKS5zaXplKCkpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgU3RhcnRzV2l0aCgiJVBERi0xLjZcclxuIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgSGFzU3Vic3RyKCIvUm9vdCAiKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBIYXNTdWJzdHIoIi9JbmZvICIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIEhhc1N1YnN0cigiL1NpemUgMzciKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBIYXNTdWJzdHIoIjM1IDAgb2JqIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgSGFzU3Vic3RyKCIzNiAwIG9iaiIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIE5vdChIYXNTdWJzdHIoIjM3IDAgb2JqIikpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIE5vdChIYXNTdWJzdHIoIjM4IDAgb2JqIikpKTsKKyAgRVhQRUNUX0VRKDc5MDh1LCBHZXRTdHJpbmcoKS5zaXplKCkpOwogCiAgIC8vIE1ha2Ugc3VyZSBuZXcgZG9jdW1lbnQgcmVuZGVycyB0aGUgc2FtZSBhcyB0aGUgb2xkIG9uZS4KICAgQVNTRVJUX1RSVUUoT3BlblNhdmVkRG9jdW1lbnQoKSk7CkBAIC0xNDYsMTkgKzE1NSwxNyBAQAogICBDbG9zZVNhdmVkUGFnZShzYXZlZF9wYWdlKTsKICAgQ2xvc2VTYXZlZERvY3VtZW50KCk7CiAKLSAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoIiVQREYtMS43XHJcbiIpKTsKLSAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6Okhhc1N1YnN0cigiL1Jvb3QgIikpOwotICAvLyBUT0RPKGNyYnVnLmNvbS9wZGZpdW0vMTQwOSk6IFRoZSBQREYgc2hvdWxkIG5vdCBoYXZlIGFueSBpbWFnZXMsIGdpdmVuIGl0Ci0gIC8vIGlzIHJlbmRlcmluZyBibGFuay4gVGhlIGZpbGUgc2l6ZSBzaG91bGQgYWxzbyBiZSBhIGxvdCBzbWFsbGVyLgotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCIvSW1hZ2UiKSk7Ci0gIEVYUEVDVF9MVChHZXRTdHJpbmcoKS5zaXplKCksIDEzMDB1KTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIFN0YXJ0c1dpdGgoIiVQREYtMS43XHJcbiIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIEhhc1N1YnN0cigiL1Jvb3QgIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgTm90KEhhc1N1YnN0cigiL0ltYWdlIikpKTsKKyAgRVhQRUNUX0xUKEdldFN0cmluZygpLnNpemUoKSwgNjAwdSk7CiB9CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBTYXZlWEZBRG9jKSB7CiAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7Ci0gIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuN1xyXG4iKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBTdGFydHNXaXRoKCIlUERGLTEuN1xyXG4iKSk7CiAgIEFTU0VSVF9UUlVFKE9wZW5TYXZlZERvY3VtZW50KCkpOwogICAvLyBUT0RPKHRzZXBleik6IGNoZWNrIGZvciBYRkEgZm9ybXMgaW4gZG9jdW1lbnQKICAgQ2xvc2VTYXZlZERvY3VtZW50KCk7CkBAIC0xNjgsMTUgKzE3NSwxNCBAQAogVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBCVUdfMzQyKSB7CiAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOwogICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCIwMDAwMDAwMDAwIDY1NTM1IGZcclxuIikpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwKLSAgICAgICAgICAgICAgdGVzdGluZzo6Tm90KHRlc3Rpbmc6Okhhc1N1YnN0cigiMDAwMDAwMDAwMCA2NTUzNiBmXHJcbiIpKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBIYXNTdWJzdHIoIjAwMDAwMDAwMDAgNjU1MzUgZlxyXG4iKSk7CisgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCBOb3QoSGFzU3Vic3RyKCIwMDAwMDAwMDAwIDY1NTM2IGZcclxuIikpKTsKIH0KIAogVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBCVUdfOTA1MTQyKSB7CiAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzkwNTE0Mi5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7Ci0gIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpIYXNTdWJzdHIoIi9MZW5ndGggMCIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIEhhc1N1YnN0cigiL0xlbmd0aCAwIikpOwogfQogCiAvLyBTaG91bGQgbm90IHRyaWdnZXIgYSBEQ0hFQ0soKSBmYWlsdXJlIGluIENGWF9GaWxlQnVmZmVyQXJjaGl2ZS4KQEAgLTE4NCw1ICsxOTAsNSBAQAogVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBCdWcxMzI4Mzg5KSB7CiAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzEzMjgzODkucGRmIikpOwogICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOwotICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCIvRm9vLyIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIEhhc1N1YnN0cigiL0Zvby8iKSk7CiB9CmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZF8yX3BhZ2VzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGRfMl9wYWdlcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzMzMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGRfMl9wYWdlcy5pbgpAQCAtMCwwICsxLDY3IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMgorICAvS2lkcyBbMyAwIFIgNCAwIFJdCisgIC9NZWRpYUJveCBbMCAwIDIwMCAyMDBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDUgMCBSCisgICAgICAvRjIgNiAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNyAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNSAwIFIKKyAgICAgIC9GMiA2IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA3IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagore3tvYmplY3QgNyAwfX0gPDwKKyAge3tzdHJlYW1sZW59fQorPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhIZWxsbywgd29ybGQhKSBUagorMCA1MCBUZAorL0YyIDE2IFRmCisoR29vZGJ5ZSwgd29ybGQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQore3t0cmFpbGVyfX0KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZF8yX3BhZ2VzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NDJlM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZF8yX3BhZ2VzLnBkZgpAQCAtMCwwICsxLDgxIEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmogPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWzAgMCAyMDAgMjAwXQorICAvQ291bnQgMgorICAvS2lkcyBbMyAwIFIgNCAwIFJdCis+PgorZW5kb2JqCiszIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNSAwIFIKKyAgICAgIC9GMiA2IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA3IDAgUgorPj4KK2VuZG9iagorNCAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDUgMCBSCisgICAgICAvRjIgNiAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNyAwIFIKKz4+CitlbmRvYmoKKzUgMCBvYmogPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKKzYgMCBvYmogPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCis3IDAgb2JqIDw8CisgIC9MZW5ndGggODMKKz4+CitzdHJlYW0KK0JUCisyMCA1MCBUZAorL0YxIDEyIFRmCisoSGVsbG8sIHdvcmxkISkgVGoKKzAgNTAgVGQKKy9GMiAxNiBUZgorKEdvb2RieWUsIHdvcmxkISkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagoreHJlZgorMCA4CiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMDY4IDAwMDAwIG4gCiswMDAwMDAwMTYzIDAwMDAwIG4gCiswMDAwMDAwMzA1IDAwMDAwIG4gCiswMDAwMDAwNDQ3IDAwMDAwIG4gCiswMDAwMDAwNTI1IDAwMDAwIG4gCiswMDAwMDAwNjAxIDAwMDAwIG4gCit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCisgIC9TaXplIDgKKz4+CitzdGFydHhyZWYKKzczNQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXNfc2hhcmVkX3Jlc291cmNlc19kaWN0LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGRfMl9wYWdlc19zaGFyZWRfcmVzb3VyY2VzX2RpY3QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzMDc4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXNfc2hhcmVkX3Jlc291cmNlc19kaWN0LmluCkBAIC0wLDAgKzEsNjQgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAyCisgIC9LaWRzIFszIDAgUiA0IDAgUl0KKyAgL01lZGlhQm94IFswIDAgMjAwIDIwMF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorICAvQ29udGVudHMgOCAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorICAvQ29udGVudHMgOCAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9Gb250IDw8CisgICAgL0YxIDYgMCBSCisgICAgL0YyIDcgMCBSCisgID4+Cis+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNyAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCit7e29iamVjdCA4IDB9fSA8PAorICB7e3N0cmVhbWxlbn19Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKEhlbGxvLCB3b3JsZCEpIFRqCiswIDUwIFRkCisvRjIgMTYgVGYKKyhHb29kYnllLCB3b3JsZCEpIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit7e3RyYWlsZXJ9fQore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXNfc2hhcmVkX3Jlc291cmNlc19kaWN0LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXNfc2hhcmVkX3Jlc291cmNlc19kaWN0LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmIyNTMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGRfMl9wYWdlc19zaGFyZWRfcmVzb3VyY2VzX2RpY3QucGRmCkBAIC0wLDAgKzEsNzkgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAyCisgIC9LaWRzIFszIDAgUiA0IDAgUl0KKyAgL01lZGlhQm94IFswIDAgMjAwIDIwMF0KKz4+CitlbmRvYmoKKzMgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDUgMCBSCisgIC9Db250ZW50cyA4IDAgUgorPj4KK2VuZG9iagorNCAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKyAgL0NvbnRlbnRzIDggMCBSCis+PgorZW5kb2JqCis1IDAgb2JqIDw8CisgIC9Gb250IDw8CisgICAgL0YxIDYgMCBSCisgICAgL0YyIDcgMCBSCisgID4+Cis+PgorZW5kb2JqCis2IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCis3IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorOCAwIG9iaiA8PAorICAvTGVuZ3RoIDgzCis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKEhlbGxvLCB3b3JsZCEpIFRqCiswIDUwIFRkCisvRjIgMTYgVGYKKyhHb29kYnllLCB3b3JsZCEpIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3hyZWYKKzAgOQorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDA2OCAwMDAwMCBuIAorMDAwMDAwMDE2MyAwMDAwMCBuIAorMDAwMDAwMDI1MSAwMDAwMCBuIAorMDAwMDAwMDMzOSAwMDAwMCBuIAorMDAwMDAwMDQwNCAwMDAwMCBuIAorMDAwMDAwMDQ4MiAwMDAwMCBuIAorMDAwMDAwMDU1OCAwMDAwMCBuIAordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSA5Cis+Pgorc3RhcnR4cmVmCis2OTIKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZF8yX3BhZ2VzX3NwbGl0X3N0cmVhbXMuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZF8yX3BhZ2VzX3NwbGl0X3N0cmVhbXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2OGY1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXNfc3BsaXRfc3RyZWFtcy5pbgpAQCAtMCwwICsxLDc1IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMgorICAvS2lkcyBbMyAwIFIgNCAwIFJdCisgIC9NZWRpYUJveCBbMCAwIDIwMCAyMDBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDUgMCBSCisgICAgICAvRjIgNiAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNyAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNSAwIFIKKyAgICAgIC9GMiA2IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA3IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagore3tvYmplY3QgNyAwfX0gWzggMCBSIDkgMCBSXQore3tvYmplY3QgOCAwfX0gPDwKKyAge3tzdHJlYW1sZW59fQorPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhIZWxsbywgd29ybGQhKSBUagorZW5kc3RyZWFtCitlbmRvYmoKK3t7b2JqZWN0IDkgMH19IDw8CisgIHt7c3RyZWFtbGVufX0KKz4+CitzdHJlYW0KK0JUCisyMCAxMDAgVGQKKy9GMiAxNiBUZgorKEdvb2RieWUsIHdvcmxkISkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3t7dHJhaWxlcn19Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGRfMl9wYWdlc19zcGxpdF9zdHJlYW1zLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXNfc3BsaXRfc3RyZWFtcy5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjODI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkXzJfcGFnZXNfc3BsaXRfc3RyZWFtcy5wZGYKQEAgLTAsMCArMSw5MSBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagorMiAwIG9iaiA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDIKKyAgL0tpZHMgWzMgMCBSIDQgMCBSXQorICAvTWVkaWFCb3ggWzAgMCAyMDAgMjAwXQorPj4KK2VuZG9iagorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDUgMCBSCisgICAgICAvRjIgNiAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNyAwIFIKKz4+CitlbmRvYmoKKzQgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA1IDAgUgorICAgICAgL0YyIDYgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDcgMCBSCis+PgorZW5kb2JqCis1IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCis2IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorNyAwIG9iaiBbOCAwIFIgOSAwIFJdCis4IDAgb2JqIDw8CisgIC9MZW5ndGggNDEKKz4+CitzdHJlYW0KK0JUCisyMCA1MCBUZAorL0YxIDEyIFRmCisoSGVsbG8sIHdvcmxkISkgVGoKK2VuZHN0cmVhbQorZW5kb2JqCis5IDAgb2JqIDw8CisgIC9MZW5ndGggNDcKKz4+CitzdHJlYW0KK0JUCisyMCAxMDAgVGQKKy9GMiAxNiBUZgorKEdvb2RieWUsIHdvcmxkISkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagoreHJlZgorMCAxMAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDA2OCAwMDAwMCBuIAorMDAwMDAwMDE2MyAwMDAwMCBuIAorMDAwMDAwMDMwNSAwMDAwMCBuIAorMDAwMDAwMDQ0NyAwMDAwMCBuIAorMDAwMDAwMDUyNSAwMDAwMCBuIAorMDAwMDAwMDYwMSAwMDAwMCBuIAorMDAwMDAwMDYyMyAwMDAwMCBuIAorMDAwMDAwMDcxNSAwMDAwMCBuIAordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSAxMAorPj4KK3N0YXJ0eHJlZgorODEzCislJUVPRgo=