ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDYxY2Y2NmYuLmRhMjlmZDYgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTY1LDYgKzE2NSw3IEBACiAJJChMT0NBTF9QQVRIKS9XZWJDb3JlL3BsYXRmb3JtL3NxbCBcCiAJJChMT0NBTF9QQVRIKS9XZWJDb3JlL3BsYXRmb3JtL3RleHQgXAogCSQoTE9DQUxfUEFUSCkvV2ViQ29yZS9wbHVnaW5zIFwKKwkkKExPQ0FMX1BBVEgpL1dlYkNvcmUvcGx1Z2lucy9hbmRyb2lkIFwKIAkkKExPQ0FMX1BBVEgpL1dlYkNvcmUvcmVuZGVyaW5nIFwKIAkkKExPQ0FMX1BBVEgpL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlIFwKIAkkKExPQ0FMX1BBVEgpL1dlYkNvcmUvc3RvcmFnZSBcCkBAIC0yNTksOSArMjYwLDYgQEAKIAlXZWJLaXQvYW5kcm9pZC9qbmkvV2ViQ29yZUpuaU9uTG9hZC5jcHAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAotIyBCdWlsZCB0aGUgcGx1Z2luIHRlc3Qgc2VwYXJhdGVseSBmcm9tIGxpYndlYmNvcmUKLWluY2x1ZGUgJChCQVNFX1BBVEgpL1dlYktpdC9hbmRyb2lkL3BsdWdpbnMvc2FtcGxlL0FuZHJvaWQubWsKLQogIyBCdWlsZCB0aGUgd2RzIGNsaWVudAogaW5jbHVkZSAkKEJBU0VfUEFUSCkvV2ViS2l0L2FuZHJvaWQvd2RzL2NsaWVudC9BbmRyb2lkLm1rCiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGFnZS9TZXR0aW5ncy5jcHAgYi9XZWJDb3JlL3BhZ2UvU2V0dGluZ3MuY3BwCmluZGV4IDE4MTU1MzUuLmY1NWFjNDIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGFnZS9TZXR0aW5ncy5jcHAKKysrIGIvV2ViQ29yZS9wYWdlL1NldHRpbmdzLmNwcApAQCAtMjM4LDEzICsyMzgsNiBAQAogICAgIG1fYXJlUGx1Z2luc0VuYWJsZWQgPSBhcmVQbHVnaW5zRW5hYmxlZDsKIH0KIAotI2lmZGVmIEFORFJPSURfUExVR0lOUwotdm9pZCBTZXR0aW5nczo6c2V0UGx1Z2luc1BhdGgoY29uc3QgU3RyaW5nJiBwbHVnaW5zUGF0aCkKLXsKLSAgICBtX3BsdWdpbnNQYXRoID0gcGx1Z2luc1BhdGg7Ci19Ci0jZW5kaWYKLQogdm9pZCBTZXR0aW5nczo6c2V0RGF0YWJhc2VzRW5hYmxlZChib29sIGRhdGFiYXNlc0VuYWJsZWQpCiB7CiAgICAgbV9kYXRhYmFzZXNFbmFibGVkID0gZGF0YWJhc2VzRW5hYmxlZDsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGFnZS9TZXR0aW5ncy5oIGIvV2ViQ29yZS9wYWdlL1NldHRpbmdzLmgKaW5kZXggOTI1MzI0Zi4uNWE5ZWUzYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wYWdlL1NldHRpbmdzLmgKKysrIGIvV2ViQ29yZS9wYWdlL1NldHRpbmdzLmgKQEAgLTEyNywxMSArMTI3LDYgQEAKICAgICAgICAgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZChib29sKTsKICAgICAgICAgYm9vbCBhcmVQbHVnaW5zRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYXJlUGx1Z2luc0VuYWJsZWQ7IH0KIAotI2lmZGVmIEFORFJPSURfUExVR0lOUwotICAgICAgICB2b2lkIHNldFBsdWdpbnNQYXRoKGNvbnN0IFN0cmluZyYgcGx1Z2luc1BhdGgpOwotICAgICAgICBjb25zdCBTdHJpbmcmIHBsdWdpbnNQYXRoKCkgY29uc3QgeyByZXR1cm4gbV9wbHVnaW5zUGF0aDsgfQotI2VuZGlmCi0KICAgICAgICAgdm9pZCBzZXREYXRhYmFzZXNFbmFibGVkKGJvb2wpOwogICAgICAgICBib29sIGRhdGFiYXNlc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2RhdGFiYXNlc0VuYWJsZWQ7IH0KIApAQCAtMjY1LDkgKzI2MCw2IEBACiAgICAgICAgIAogICAgICAgICBTdHJpbmcgbV9kZWZhdWx0VGV4dEVuY29kaW5nTmFtZTsKICAgICAgICAgU3RyaW5nIG1fZnRwRGlyZWN0b3J5VGVtcGxhdGVQYXRoOwotI2lmZGVmIEFORFJPSURfUExVR0lOUwotICAgICAgICBTdHJpbmcgbV9wbHVnaW5zUGF0aDsKLSNlbmRpZgogICAgICAgICBTdHJpbmcgbV9sb2NhbFN0b3JhZ2VEYXRhYmFzZVBhdGg7CiAgICAgICAgIEtVUkwgbV91c2VyU3R5bGVTaGVldExvY2F0aW9uOwogICAgICAgICBBdG9taWNTdHJpbmcgbV9zdGFuZGFyZEZvbnRGYW1pbHk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsdWdpbnMvUGx1Z2luRGF0YWJhc2UuY3BwIGIvV2ViQ29yZS9wbHVnaW5zL1BsdWdpbkRhdGFiYXNlLmNwcAppbmRleCBlM2I4NmFlLi4xNTViZDI0IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsdWdpbnMvUGx1Z2luRGF0YWJhc2UuY3BwCisrKyBiL1dlYkNvcmUvcGx1Z2lucy9QbHVnaW5EYXRhYmFzZS5jcHAKQEAgLTMyLDYgKzMyLDExIEBACiAjaW5jbHVkZSAiUGx1Z2luUGFja2FnZS5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCisjaWYgUExBVEZPUk0oQU5EUk9JRCkKKyNpbmNsdWRlICJKYXZhU2hhcmVkQ2xpZW50LmgiCisjaW5jbHVkZSAiUGx1Z2luQ2xpZW50LmgiCisjZW5kaWYKKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBQbHVnaW5EYXRhYmFzZSogUGx1Z2luRGF0YWJhc2U6Omluc3RhbGxlZFBsdWdpbnMoKQpAQCAtMzI3LDYgKzMzMiwxMSBAQAogICAgIHBhdGhzLmFwcGVuZChxdFBhdGhzKTsKICNlbmRpZgogCisjaWYgUExBVEZPUk0oQU5EUk9JRCkKKyAgICBpZiAoYW5kcm9pZDo6SmF2YVNoYXJlZENsaWVudDo6R2V0UGx1Z2luQ2xpZW50KCkpCisgICAgICAgIHJldHVybiBhbmRyb2lkOjpKYXZhU2hhcmVkQ2xpZW50OjpHZXRQbHVnaW5DbGllbnQoKS0+Z2V0UGx1Z2luRGlyZWN0b3JpZXMoKTsKKyNlbmRpZgorCiAgICAgcmV0dXJuIHBhdGhzOwogfQogCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsdWdpbnMvUGx1Z2luRGF0YWJhc2UuaCBiL1dlYkNvcmUvcGx1Z2lucy9QbHVnaW5EYXRhYmFzZS5oCmluZGV4IGNjYjM4MjEuLmIwNWQzMzQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGx1Z2lucy9QbHVnaW5EYXRhYmFzZS5oCisrKyBiL1dlYkNvcmUvcGx1Z2lucy9QbHVnaW5EYXRhYmFzZS5oCkBAIC02Myw5ICs2MywxNCBAQAogCiAgICAgICAgIFBsdWdpblBhY2thZ2UqIGZpbmRQbHVnaW4oY29uc3QgS1VSTCYsIFN0cmluZyYgbWltZVR5cGUpOwogCi0gICAgcHJpdmF0ZToKKyNpZmRlZiBBTkRST0lEX1BMVUdJTlMKICAgICAgICAgdm9pZCBzZXRQbHVnaW5EaXJlY3Rvcmllcyhjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGlyZWN0b3JpZXMpIHsgbV9wbHVnaW5EaXJlY3RvcmllcyA9IGRpcmVjdG9yaWVzOyB9CisjZW5kaWYKIAorICAgIHByaXZhdGU6CisjaWZuZGVmIEFORFJPSURfUExVR0lOUworICAgICAgICB2b2lkIHNldFBsdWdpbkRpcmVjdG9yaWVzKGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBkaXJlY3RvcmllcykgeyBtX3BsdWdpbkRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXM7IH0KKyNlbmRpZgogICAgICAgICB2b2lkIGdldFBsdWdpblBhdGhzSW5EaXJlY3RvcmllcyhIYXNoU2V0PFN0cmluZz4mKSBjb25zdDsKICAgICAgICAgdm9pZCBnZXREZWxldGVkUGx1Z2lucyhQbHVnaW5TZXQmKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvbWFpbi5oIGIvV2ViQ29yZS9wbHVnaW5zL2FuZHJvaWQvUGx1Z2luQ2xpZW50LmgKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20gV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvbWFpbi5oCnJlbmFtZSB0byBXZWJDb3JlL3BsdWdpbnMvYW5kcm9pZC9QbHVnaW5DbGllbnQuaAppbmRleCA4YmY1MjBlLi41ZGMzMDBjIDEwMDY0NAotLS0gYS9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zL3NhbXBsZS9tYWluLmgKKysrIGIvV2ViQ29yZS9wbHVnaW5zL2FuZHJvaWQvUGx1Z2luQ2xpZW50LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTIyLDkgKzIyLDIzIEBACiAgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KLSAKLSNpbmNsdWRlIDxucGFwaS5oPgotI2luY2x1ZGUgPG5wZnVuY3Rpb25zLmg+Ci0jaW5jbHVkZSA8bnBydW50aW1lLmg+CiAKLWV4dGVybiBOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXI7CisjaWZuZGVmIFBMVUdJTkNMSUVOVF9IXworI2RlZmluZSBQTFVHSU5DTElFTlRfSF8KKworI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisgICAgY2xhc3MgUGx1Z2luQ2xpZW50CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+UGx1Z2luQ2xpZW50KCkge30KKyAgICAgICAgdmlydHVhbCBWZWN0b3I8U3RyaW5nPiBnZXRQbHVnaW5EaXJlY3RvcmllcygpID0gMDsKKyAgICB9OworfQorCisjZW5kaWYgLyogUExVR0lOQ0xJRU5UX0hfICovCmRpZmYgLS1naXQgYS9XZWJLaXQvYW5kcm9pZC9qbmkvSmF2YUJyaWRnZS5jcHAgYi9XZWJLaXQvYW5kcm9pZC9qbmkvSmF2YUJyaWRnZS5jcHAKaW5kZXggYTcxM2YxNy4uNmNiMjE2NyAxMDA2NDQKLS0tIGEvV2ViS2l0L2FuZHJvaWQvam5pL0phdmFCcmlkZ2UuY3BwCisrKyBiL1dlYktpdC9hbmRyb2lkL2puaS9KYXZhQnJpZGdlLmNwcApAQCAtMzMsNiArMzMsOSBAQAogI2luY2x1ZGUgIkphdmFTaGFyZWRDbGllbnQuaCIKICNpbmNsdWRlICJLVVJMLmgiCiAjaW5jbHVkZSAiTmV0d29ya1N0YXRlTm90aWZpZXIuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGx1Z2luQ2xpZW50LmgiCisjaW5jbHVkZSAiUGx1Z2luRGF0YWJhc2UuaCIKICNpbmNsdWRlICJUaW1lci5oIgogI2luY2x1ZGUgIlRpbWVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiam5pX3V0aWxpdHkuaCIKQEAgLTU1LDcgKzU4LDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCi1jbGFzcyBKYXZhQnJpZGdlIDogcHVibGljIFRpbWVyQ2xpZW50LCBwdWJsaWMgQ29va2llQ2xpZW50CitjbGFzcyBKYXZhQnJpZGdlIDogcHVibGljIFRpbWVyQ2xpZW50LCBwdWJsaWMgQ29va2llQ2xpZW50LCBwdWJsaWMgUGx1Z2luQ2xpZW50CiB7CiBwdWJsaWM6CiAgICAgSmF2YUJyaWRnZShKTklFbnYqIGVudiwgam9iamVjdCBvYmopOwpAQCAtNzEsNiArNzQsOCBAQAogICAgIHZpcnR1YWwgV2ViQ29yZTo6U3RyaW5nIGNvb2tpZXMoV2ViQ29yZTo6S1VSTCBjb25zdCYgdXJsKTsKICAgICB2aXJ0dWFsIGJvb2wgY29va2llc0VuYWJsZWQoKTsKIAorICAgIHZpcnR1YWwgV1RGOjpWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBnZXRQbHVnaW5EaXJlY3RvcmllcygpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIHZpcnR1YWwgdm9pZCBzZXRTaGFyZWRUaW1lckNhbGxiYWNrKHZvaWQgKCpmKSgpKTsKQEAgLTg3LDYgKzkyLDcgQEAKICAgICBzdGF0aWMgdm9pZCBTZXROZXR3b3JrT25MaW5lKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaiwgamJvb2xlYW4gb25saW5lKTsKICAgICBzdGF0aWMgdm9pZCBTZXREZWZlcnJpbmdUaW1lcnMoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqLCBqYm9vbGVhbiBkZWZlcik7CiAgICAgc3RhdGljIHZvaWQgU2VydmljZUZ1bmNQdHJRdWV1ZShKTklFbnYqKTsKKyAgICBzdGF0aWMgdm9pZCBVcGRhdGVQbHVnaW5EaXJlY3RvcmllcyhKTklFbnYqIGVudiwgam9iamVjdCBvYmosIGpvYmplY3RBcnJheSBhcnJheSwgamJvb2xlYW4gcmVsb2FkKTsKIAogcHJpdmF0ZToKICAgICBqb2JqZWN0ICAgICBtSmF2YU9iamVjdDsKQEAgLTk1LDYgKzEwMSw3IEBACiAgICAgam1ldGhvZElEICAgbVNldENvb2tpZXM7CiAgICAgam1ldGhvZElEICAgbUNvb2tpZXM7CiAgICAgam1ldGhvZElEICAgbUNvb2tpZXNFbmFibGVkOworICAgIGptZXRob2RJRCAgIG1HZXRQbHVnaW5EaXJlY3RvcmllczsKICAgICBqbWV0aG9kSUQgICBtU2lnbmFsRnVuY1B0clF1ZXVlOwogfTsKIApAQCAtMTEwLDYgKzExNyw3IEBACiAgICAgbVNldENvb2tpZXMgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAic2V0Q29va2llcyIsICIoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYiKTsKICAgICBtQ29va2llcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJjb29raWVzIiwgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7Iik7CiAgICAgbUNvb2tpZXNFbmFibGVkID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgImNvb2tpZXNFbmFibGVkIiwgIigpWiIpOworICAgIG1HZXRQbHVnaW5EaXJlY3RvcmllcyA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJnZXRQbHVnaW5EaXJlY3RvcmllcyIsICIoKVtMamF2YS9sYW5nL1N0cmluZzsiKTsKICAgICBtU2lnbmFsRnVuY1B0clF1ZXVlID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgInNpZ25hbFNlcnZpY2VGdW5jUHRyUXVldWUiLCAiKClWIik7CiAKICAgICBMT0dfQVNTRVJUKG1TZXRTaGFyZWRUaW1lciwgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCBzZXRTaGFyZWRUaW1lciIpOwpAQCAtMTIwLDggKzEyOCw5IEBACiAKICAgICBKYXZhU2hhcmVkQ2xpZW50OjpTZXRUaW1lckNsaWVudCh0aGlzKTsKICAgICBKYXZhU2hhcmVkQ2xpZW50OjpTZXRDb29raWVDbGllbnQodGhpcyk7Ci19ICAgCi0gICAgCisgICAgSmF2YVNoYXJlZENsaWVudDo6U2V0UGx1Z2luQ2xpZW50KHRoaXMpOworfQorCiBKYXZhQnJpZGdlOjp+SmF2YUJyaWRnZSgpCiB7CiAgICAgaWYgKG1KYXZhT2JqZWN0KSB7CkBAIC0xOTIsNiArMjAxLDI1IEBACiAgICAgcmV0dXJuIChyZXQgIT0gMCk7CiB9CiAKK1dURjo6VmVjdG9yPFdlYkNvcmU6OlN0cmluZz4KK0phdmFCcmlkZ2U6OmdldFBsdWdpbkRpcmVjdG9yaWVzKCkKK3sKKyAgICBXVEY6OlZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+IGRpcmVjdG9yaWVzOworICAgIEpOSUVudiogZW52ID0gSlNDOjpCaW5kaW5nczo6Z2V0Sk5JRW52KCk7CisgICAgQXV0b0pPYmplY3Qgb2JqID0gZ2V0UmVhbE9iamVjdChlbnYsIG1KYXZhT2JqZWN0KTsKKyAgICBqb2JqZWN0QXJyYXkgYXJyYXkgPSAoam9iamVjdEFycmF5KQorICAgICAgICAgICAgZW52LT5DYWxsT2JqZWN0TWV0aG9kKG9iai5nZXQoKSwgbUdldFBsdWdpbkRpcmVjdG9yaWVzKTsKKyAgICBpbnQgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAganN0cmluZyBkaXIgPSAoanN0cmluZykgZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyYXksIGkpOworICAgICAgICBkaXJlY3Rvcmllcy5hcHBlbmQodG9fc3RyaW5nKGVudiwgZGlyKSk7CisgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGlyKTsKKyAgICB9CisgICAgZW52LT5EZWxldGVMb2NhbFJlZihhcnJheSk7CisgICAgY2hlY2tFeGNlcHRpb24oZW52KTsKKyAgICByZXR1cm4gZGlyZWN0b3JpZXM7Cit9CisKIHZvaWQKIEphdmFCcmlkZ2U6OnNldFNoYXJlZFRpbWVyQ2FsbGJhY2sodm9pZCAoKmYpKCkpCiB7CkBAIC0yNjAsNiArMjg4LDIzIEBACiAgICAgSmF2YVNoYXJlZENsaWVudDo6U2VydmljZUZ1bmN0aW9uUHRyUXVldWUoKTsKIH0KIAordm9pZCBKYXZhQnJpZGdlOjpVcGRhdGVQbHVnaW5EaXJlY3RvcmllcyhKTklFbnYqIGVudiwgam9iamVjdCBvYmosCisgICAgICAgIGpvYmplY3RBcnJheSBhcnJheSwgamJvb2xlYW4gcmVsb2FkKSB7CisgICAgV1RGOjpWZWN0b3I8V2ViQ29yZTo6U3RyaW5nPiBkaXJlY3RvcmllczsKKyAgICBpbnQgY291bnQgPSBlbnYtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAganN0cmluZyBkaXIgPSAoanN0cmluZykgZW52LT5HZXRPYmplY3RBcnJheUVsZW1lbnQoYXJyYXksIGkpOworICAgICAgICBkaXJlY3Rvcmllcy5hcHBlbmQodG9fc3RyaW5nKGVudiwgZGlyKSk7CisgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGlyKTsKKyAgICB9CisgICAgY2hlY2tFeGNlcHRpb24oZW52KTsKKyAgICBXZWJDb3JlOjpQbHVnaW5EYXRhYmFzZSAqcGx1Z2luRGF0YWJhc2UgPQorICAgICAgICAgICAgV2ViQ29yZTo6UGx1Z2luRGF0YWJhc2U6Omluc3RhbGxlZFBsdWdpbnMoKTsKKyAgICBwbHVnaW5EYXRhYmFzZS0+c2V0UGx1Z2luRGlyZWN0b3JpZXMoZGlyZWN0b3JpZXMpOworICAgIC8vIHJlZnJlc2hQbHVnaW5zKCkgc2hvdWxkIHJlZnJlc2ggYm90aCBQbHVnaW5EYXRhYmFzZSBhbmQgUGFnZSdzIFBsdWdpbkRhdGEKKyAgICBXZWJDb3JlOjpQYWdlOjpyZWZyZXNoUGx1Z2lucyhyZWxvYWQpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8qCkBAIC0yNzksNiArMzI0LDggQEAKICAgICAgICAgKHZvaWQqKSBKYXZhQnJpZGdlOjpTZXROZXR3b3JrT25MaW5lIH0sCiAgICAgeyAibmF0aXZlU2VydmljZUZ1bmNQdHJRdWV1ZSIsICIoKVYiLAogICAgICAgICAodm9pZCopIEphdmFCcmlkZ2U6OlNlcnZpY2VGdW5jUHRyUXVldWUgfSwKKyAgICB7ICJuYXRpdmVVcGRhdGVQbHVnaW5EaXJlY3RvcmllcyIsICIoW0xqYXZhL2xhbmcvU3RyaW5nO1opViIsCisgICAgICAgICh2b2lkKikgSmF2YUJyaWRnZTo6VXBkYXRlUGx1Z2luRGlyZWN0b3JpZXMgfQogfTsKIAogaW50IHJlZ2lzdGVyX2phdmFicmlkZ2UoSk5JRW52KiBlbnYpCmRpZmYgLS1naXQgYS9XZWJLaXQvYW5kcm9pZC9qbmkvSmF2YVNoYXJlZENsaWVudC5jcHAgYi9XZWJLaXQvYW5kcm9pZC9qbmkvSmF2YVNoYXJlZENsaWVudC5jcHAKaW5kZXggZmNjY2Q4NS4uM2RkZjcyNiAxMDA2NDQKLS0tIGEvV2ViS2l0L2FuZHJvaWQvam5pL0phdmFTaGFyZWRDbGllbnQuY3BwCisrKyBiL1dlYktpdC9hbmRyb2lkL2puaS9KYXZhU2hhcmVkQ2xpZW50LmNwcApAQCAtNDAsNiArNDAsMTEgQEAKICAgICAgICAgcmV0dXJuIGdDb29raWVDbGllbnQ7CiAgICAgfQogCisgICAgUGx1Z2luQ2xpZW50KiBKYXZhU2hhcmVkQ2xpZW50OjpHZXRQbHVnaW5DbGllbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdQbHVnaW5DbGllbnQ7CisgICAgfQorCiAgICAgdm9pZCBKYXZhU2hhcmVkQ2xpZW50OjpTZXRUaW1lckNsaWVudChUaW1lckNsaWVudCogY2xpZW50KQogICAgIHsKICAgICAgICAgZ1RpbWVyQ2xpZW50ID0gY2xpZW50OwpAQCAtNTAsOCArNTUsMTQgQEAKICAgICAgICAgZ0Nvb2tpZUNsaWVudCA9IGNsaWVudDsKICAgICB9CiAKKyAgICB2b2lkIEphdmFTaGFyZWRDbGllbnQ6OlNldFBsdWdpbkNsaWVudChQbHVnaW5DbGllbnQqIGNsaWVudCkKKyAgICB7CisgICAgICAgIGdQbHVnaW5DbGllbnQgPSBjbGllbnQ7CisgICAgfQorCiAgICAgVGltZXJDbGllbnQqICAgIEphdmFTaGFyZWRDbGllbnQ6OmdUaW1lckNsaWVudCA9IE5VTEw7CiAgICAgQ29va2llQ2xpZW50KiAgIEphdmFTaGFyZWRDbGllbnQ6OmdDb29raWVDbGllbnQgPSBOVUxMOworICAgIFBsdWdpbkNsaWVudCogICBKYXZhU2hhcmVkQ2xpZW50OjpnUGx1Z2luQ2xpZW50ID0gTlVMTDsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIApkaWZmIC0tZ2l0IGEvV2ViS2l0L2FuZHJvaWQvam5pL0phdmFTaGFyZWRDbGllbnQuaCBiL1dlYktpdC9hbmRyb2lkL2puaS9KYXZhU2hhcmVkQ2xpZW50LmgKaW5kZXggMDU3ODhlMS4uNjljMDVjZSAxMDA2NDQKLS0tIGEvV2ViS2l0L2FuZHJvaWQvam5pL0phdmFTaGFyZWRDbGllbnQuaAorKysgYi9XZWJLaXQvYW5kcm9pZC9qbmkvSmF2YVNoYXJlZENsaWVudC5oCkBAIC0zMCwyNCArMzAsMjggQEAKIAogICAgIGNsYXNzIFRpbWVyQ2xpZW50OwogICAgIGNsYXNzIENvb2tpZUNsaWVudDsKKyAgICBjbGFzcyBQbHVnaW5DbGllbnQ7CiAKICAgICBjbGFzcyBKYXZhU2hhcmVkQ2xpZW50CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIFRpbWVyQ2xpZW50KiBHZXRUaW1lckNsaWVudCgpOyAKICAgICAgICAgc3RhdGljIENvb2tpZUNsaWVudCogR2V0Q29va2llQ2xpZW50KCk7CisgICAgICAgIHN0YXRpYyBQbHVnaW5DbGllbnQqIEdldFBsdWdpbkNsaWVudCgpOwogCiAgICAgICAgIHN0YXRpYyB2b2lkIFNldFRpbWVyQ2xpZW50KFRpbWVyQ2xpZW50KiBjbGllbnQpOwogICAgICAgICBzdGF0aWMgdm9pZCBTZXRDb29raWVDbGllbnQoQ29va2llQ2xpZW50KiBjbGllbnQpOworICAgICAgICBzdGF0aWMgdm9pZCBTZXRQbHVnaW5DbGllbnQoUGx1Z2luQ2xpZW50KiBjbGllbnQpOwogCiAgICAgICAgIC8vIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkLCB0byBiZSBleGVjdXRlZCBpbiB3ZWJraXQgdGhyZWFkCiAgICAgICAgIHN0YXRpYyB2b2lkIEVucXVldWVGdW5jdGlvblB0cih2b2lkICgqcHJvYykodm9pZCopLCB2b2lkKiBwYXlsb2FkKTsKICAgICAgICAgLy8gb25seSBjYWxsIHRoaXMgZnJvbSB3ZWJraXQgdGhyZWFkCiAgICAgICAgIHN0YXRpYyB2b2lkIFNlcnZpY2VGdW5jdGlvblB0clF1ZXVlKCk7Ci0gICAgICAgIAorCiAgICAgcHJpdmF0ZToKICAgICAgICAgc3RhdGljIFRpbWVyQ2xpZW50KiBnVGltZXJDbGllbnQ7CiAgICAgICAgIHN0YXRpYyBDb29raWVDbGllbnQqIGdDb29raWVDbGllbnQ7CisgICAgICAgIHN0YXRpYyBQbHVnaW5DbGllbnQqIGdQbHVnaW5DbGllbnQ7CiAgICAgfTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViS2l0L2FuZHJvaWQvam5pL1dlYlNldHRpbmdzLmNwcCBiL1dlYktpdC9hbmRyb2lkL2puaS9XZWJTZXR0aW5ncy5jcHAKaW5kZXggNzc0MTA3NC4uMTEwY2RlMCAxMDA2NDQKLS0tIGEvV2ViS2l0L2FuZHJvaWQvam5pL1dlYlNldHRpbmdzLmNwcAorKysgYi9XZWJLaXQvYW5kcm9pZC9qbmkvV2ViU2V0dGluZ3MuY3BwCkBAIC00MSwxMCArNDEsNiBAQAogI2luY2x1ZGUgIkRvY0xvYWRlci5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJSZW5kZXJUYWJsZS5oIgotI2lmZGVmIEFORFJPSURfUExVR0lOUwotI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAiUGx1Z2luRGF0YWJhc2UuaCIKLSNlbmRpZgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAiV2ViQ29yZUZyYW1lQnJpZGdlLmgiCiAjaW5jbHVkZSAiV2ViQ29yZUpuaS5oIgpAQCAtNTIsMTEgKzQ4LDYgQEAKICNpbmNsdWRlIDxKTklIZWxwLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0vLyBEZWZpbmVkIGluIEZpbGVTeXN0ZW1BbmRyb2lkLmNwcAotZXh0ZXJuIFN0cmluZyBzUGx1Z2luUGF0aDsKLX0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgRmllbGRJZHMgewpAQCAtOTEsOSArODIsNiBAQAogI2VuZGlmCiAgICAgICAgIG1KYXZhU2NyaXB0RW5hYmxlZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1KYXZhU2NyaXB0RW5hYmxlZCIsICJaIik7CiAgICAgICAgIG1QbHVnaW5zRW5hYmxlZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1QbHVnaW5zRW5hYmxlZCIsICJaIik7Ci0jaWZkZWYgQU5EUk9JRF9QTFVHSU5TCi0gICAgICAgIG1QbHVnaW5zUGF0aCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1QbHVnaW5zUGF0aCIsICJMamF2YS9sYW5nL1N0cmluZzsiKTsKLSNlbmRpZgogI2lmIEVOQUJMRShEQVRBQkFTRSkKICAgICAgICAgbURhdGFiYXNlRW5hYmxlZCA9IGVudi0+R2V0RmllbGRJRChjbGF6eiwgIm1EYXRhYmFzZUVuYWJsZWQiLCAiWiIpOwogICAgICAgICBtRGF0YWJhc2VQYXRoID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibURhdGFiYXNlUGF0aCIsICJMamF2YS9sYW5nL1N0cmluZzsiKTsKQEAgLTEyOSw5ICsxMTcsNiBAQAogI2VuZGlmCiAgICAgICAgIExPR19BU1NFUlQobUphdmFTY3JpcHRFbmFibGVkLCAiQ291bGQgbm90IGZpbmQgZmllbGQgbUphdmFTY3JpcHRFbmFibGVkIik7CiAgICAgICAgIExPR19BU1NFUlQobVBsdWdpbnNFbmFibGVkLCAiQ291bGQgbm90IGZpbmQgZmllbGQgbVBsdWdpbnNFbmFibGVkIik7Ci0jaWZkZWYgQU5EUk9JRF9QTFVHSU5TCi0gICAgICAgIExPR19BU1NFUlQobVBsdWdpbnNQYXRoLCAiQ291bGQgbm90IGZpbmQgZmllbGQgbVBsdWdpbnNQYXRoIik7Ci0jZW5kaWYKICNpZiBFTkFCTEUoT0ZGTElORV9XRUJfQVBQTElDQVRJT05TKQogICAgICAgICBMT0dfQVNTRVJUKG1BcHBDYWNoZUVuYWJsZWQsICJDb3VsZCBub3QgZmluZCBmaWVsZCBtQXBwQ2FjaGVFbmFibGVkIik7CiAgICAgICAgIExPR19BU1NFUlQobUFwcENhY2hlUGF0aCwgIkNvdWxkIG5vdCBmaW5kIGZpZWxkIG1BcHBDYWNoZVBhdGgiKTsKQEAgLTE3Myw5ICsxNTgsNiBAQAogI2VuZGlmCiAgICAgamZpZWxkSUQgbUphdmFTY3JpcHRFbmFibGVkOwogICAgIGpmaWVsZElEIG1QbHVnaW5zRW5hYmxlZDsKLSNpZmRlZiBBTkRST0lEX1BMVUdJTlMKLSAgICBqZmllbGRJRCBtUGx1Z2luc1BhdGg7Ci0jZW5kaWYKICNpZiBFTkFCTEUoT0ZGTElORV9XRUJfQVBQTElDQVRJT05TKQogICAgIGpmaWVsZElEIG1BcHBDYWNoZUVuYWJsZWQ7CiAgICAgamZpZWxkSUQgbUFwcENhY2hlUGF0aDsKQEAgLTI5OSw0NiArMjgxLDYgQEAKICAgICAgICAgZmxhZyA9IGVudi0+R2V0Qm9vbGVhbkZpZWxkKG9iaiwgZ0ZpZWxkSWRzLT5tUGx1Z2luc0VuYWJsZWQpOwogICAgICAgICBzLT5zZXRQbHVnaW5zRW5hYmxlZChmbGFnKTsKIAotI2lmZGVmIEFORFJPSURfUExVR0lOUwotICAgICAgICA6OldlYkNvcmU6OlBsdWdpbkRhdGFiYXNlICpwbHVnaW5EYXRhYmFzZSA9Ci0gICAgICAgICAgICAgICAgICA6OldlYkNvcmU6OlBsdWdpbkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKCk7Ci0gICAgICAgIHN0ciA9IChqc3RyaW5nKWVudi0+R2V0T2JqZWN0RmllbGQob2JqLCBnRmllbGRJZHMtPm1QbHVnaW5zUGF0aCk7Ci0gICAgICAgIGlmIChzdHIpIHsKLSAgICAgICAgICAgIFdlYkNvcmU6OlN0cmluZyBwbHVnaW5zUGF0aCA9IHRvX3N0cmluZyhlbnYsIHN0cik7Ci0gICAgICAgICAgICAvLyBXaGVuIGEgbmV3IGJyb3dzZXIgVGFiIGlzIGNyZWF0ZWQsIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAvLyBKYXZhIFdlYlZpZXdDb3JlIG9iamVjdCB3aWxsIHN5bmMgKHdpdGggdGhlIG5hdGl2ZQotICAgICAgICAgICAgLy8gc2lkZSkgaXRzIGFzc29jaWF0ZWQgV2ViU2V0dGluZ3MgYXQgaW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgIC8vIHRpbWUuIEhvd2V2ZXIsIGF0IHRoYXQgcG9pbnQsIHRoZSBXZWJTZXR0aW5ncyBvYmplY3QncwotICAgICAgICAgICAgLy8gbVBsdWdpbnNQYXRocyBtZW1iZXIgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcuIFRoZQotICAgICAgICAgICAgLy8gcmVhbCBwbHVnaW4gcGF0aCB3aWxsIGJlIHNldCBsYXRlciBieSB0aGUgdGFiIGFuZCB0aGUKLSAgICAgICAgICAgIC8vIFdlYlNldHRpbmdzIHdpbGwgYmUgc3luY2VkIGFnYWluLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IGluIGluc3RydWN0aW5nIFdlYkNvcmUncwotICAgICAgICAgICAgLy8gUGx1Z2luRGF0YWJhc2UgaW5zdGFuY2UgdG8gc2V0IHRoZSBwbHVnaW4gcGF0aCB0byB0aGUKLSAgICAgICAgICAgIC8vIGVtcHR5IHN0cmluZy4gRnVydGhlcm1vcmUsIGlmIHRoZSBQbHVnaW5EYXRhYmFzZQotICAgICAgICAgICAgLy8gaW5zdGFuY2UgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwgc2V0dGluZyB0aGUgcGF0aCB0bwotICAgICAgICAgICAgLy8gdGhlIGVtcHR5IHN0cmluZyB3aWxsIGNhdXNlIHRoZSBQbHVnaW5EYXRhYmFzZSB0bwotICAgICAgICAgICAgLy8gZm9yZ2V0IGFib3V0IHRoZSBwbHVnaW4gZmlsZXMgaXQgaGFzIGFscmVhZHkKLSAgICAgICAgICAgIC8vIGluc3BlY3RlZC4gV2hlbiB0aGUgcGF0aCBpcyBzdWJzZXF1ZW50bHkgc2V0IHRvIHRoZQotICAgICAgICAgICAgLy8gY29ycmVjdCB2YWx1ZSwgdGhlIFBsdWdpbkRhdGFiYXNlIHdpbGwgYXR0ZW1wdCB0byBsb2FkCi0gICAgICAgICAgICAvLyBhbmQgaW5pdGlhbGl6ZSBwbHVnaW5zIHRoYXQgYXJlIGFscmVhZHkgbG9hZGVkIGFuZAotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQuCi0gICAgICAgICAgICBpZiAocGx1Z2luc1BhdGgubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBzLT5zZXRQbHVnaW5zUGF0aChwbHVnaW5zUGF0aCk7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwbHVnaW4gZGlyZWN0b3JpZXMgdG8gdGhpcyBzaW5nbGUgZW50cnkuCi0gICAgICAgICAgICAgICAgV1RGOjpWZWN0b3I8IDo6V2ViQ29yZTo6U3RyaW5nID4gcGF0aHMoMSk7Ci0gICAgICAgICAgICAgICAgcGF0aHNbMF0gPSBwbHVnaW5zUGF0aDsKLSAgICAgICAgICAgICAgICBwbHVnaW5EYXRhYmFzZS0+c2V0UGx1Z2luRGlyZWN0b3JpZXMocGF0aHMpOwotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHBsdWdpbiB0ZW1wb3JhcnkgZmlsZXMKLSAgICAgICAgICAgICAgICBXZWJDb3JlOjpzUGx1Z2luUGF0aCA9IHBhdGhzWzBdOwotICAgICAgICAgICAgICAgIC8vIFJlbG9hZCBwbHVnaW5zLiBXZSBjYWxsIFBhZ2U6OnJlZnJlc2hQbHVnaW5zKCkgaW5zdGVhZAotICAgICAgICAgICAgICAgIC8vIG9mIHBsdWdpbkRhdGFiYXNlLT5yZWZyZXNoKCksIGFzIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQKLSAgICAgICAgICAgICAgICAvLyB0aGUgbGlzdCBvZiBtaW1ldHlwZXMgZXhwb3NlZCBieSB0aGUgYnJvd3NlciBhcmUgYWxzbwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQuCi0gICAgICAgICAgICAgICAgV2ViQ29yZTo6UGFnZTo6cmVmcmVzaFBsdWdpbnMoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKICNpZiBFTkFCTEUoT0ZGTElORV9XRUJfQVBQTElDQVRJT05TKQogICAgICAgICBmbGFnID0gZW52LT5HZXRCb29sZWFuRmllbGQob2JqLCBnRmllbGRJZHMtPm1BcHBDYWNoZUVuYWJsZWQpOwogICAgICAgICBzLT5zZXRPZmZsaW5lV2ViQXBwbGljYXRpb25DYWNoZUVuYWJsZWQoZmxhZyk7CmRpZmYgLS1naXQgYS9XZWJLaXQvYW5kcm9pZC9qbmkvV2ViVmlld0NvcmUuY3BwIGIvV2ViS2l0L2FuZHJvaWQvam5pL1dlYlZpZXdDb3JlLmNwcAppbmRleCAxODEwODU5Li5hNTliOTY3IDEwMDY0NAotLS0gYS9XZWJLaXQvYW5kcm9pZC9qbmkvV2ViVmlld0NvcmUuY3BwCisrKyBiL1dlYktpdC9hbmRyb2lkL2puaS9XZWJWaWV3Q29yZS5jcHAKQEAgLTY4LDcgKzY4LDYgQEAKICNpbmNsdWRlICJQYWdlLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNsdWRlICJQbHVnaW5JbmZvU3RvcmUuaCIKICNpbmNsdWRlICJQbHVnaW5XaWRnZXRBbmRyb2lkLmgiCiAjaW5jbHVkZSAiUG9zaXRpb24uaCIKICNpbmNsdWRlICJQcm9ncmVzc1RyYWNrZXIuaCIKQEAgLTI1NjEsMTggKzI1NjAsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyB2b2lkIFJlZnJlc2hQbHVnaW5zKEpOSUVudiAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiByZWxvYWRPcGVuUGFnZXMpCi17Ci0jaWZkZWYgQU5EUk9JRF9JTlNUUlVNRU5UCi0gICAgVGltZUNvdW50ZXJBdXRvIGNvdW50ZXIoVGltZUNvdW50ZXI6OldlYlZpZXdDb3JlVGltZUNvdW50ZXIpOwotI2VuZGlmCi0gICAgLy8gUmVmcmVzaCB0aGUgbGlzdCBvZiBwbHVnaW5zLCBvcHRpb25hbGx5IHJlbG9hZGluZyBhbGwgb3BlbgotICAgIC8vIHBhZ2VzLgotICAgIFdlYkNvcmU6OnJlZnJlc2hQbHVnaW5zKHJlbG9hZE9wZW5QYWdlcyk7Ci19Ci0KIHN0YXRpYyB2b2lkIFJlZ2lzdGVyVVJMU2NoZW1lQXNMb2NhbChKTklFbnYqIGVudiwgam9iamVjdCBvYmosIGpzdHJpbmcgc2NoZW1lKSB7CiAjaWZkZWYgQU5EUk9JRF9JTlNUUlVNRU5UCiAgICAgVGltZUNvdW50ZXJBdXRvIGNvdW50ZXIoVGltZUNvdW50ZXI6OldlYlZpZXdDb3JlVGltZUNvdW50ZXIpOwpAQCAtMjY4Niw4ICsyNjczLDYgQEAKICAgICAgICAgKHZvaWQqKSBTZXRCYWNrZ3JvdW5kQ29sb3IgfSwKICAgICB7ICJuYXRpdmVHZXRTZWxlY3Rpb24iLCAiKExhbmRyb2lkL2dyYXBoaWNzL1JlZ2lvbjspTGphdmEvbGFuZy9TdHJpbmc7IiwKICAgICAgICAgKHZvaWQqKSBHZXRTZWxlY3Rpb24gfSwKLSAgICB7ICJuYXRpdmVSZWZyZXNoUGx1Z2lucyIsICIoWilWIiwKLSAgICAgICAgKHZvaWQqKSBSZWZyZXNoUGx1Z2lucyB9LAogICAgIHsgIm5hdGl2ZVJlZ2lzdGVyVVJMU2NoZW1lQXNMb2NhbCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVYiLAogICAgICAgICAodm9pZCopIFJlZ2lzdGVyVVJMU2NoZW1lQXNMb2NhbCB9LAogICAgIHsgIm5hdGl2ZUR1bXBEb21UcmVlIiwgIihaKVYiLApkaWZmIC0tZ2l0IGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvQW5kcm9pZC5tayBiL1dlYktpdC9hbmRyb2lkL3BsdWdpbnMvc2FtcGxlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOGRkYzUuLjAwMDAwMDAKLS0tIGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjCi0jIwotIyMgQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMjCi0jIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyMgYXJlIG1ldDoKLSMjICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotIyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMjCi0jIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQotIyMgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSMjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotIyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0jIyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSMjIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotIyMgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotIyMgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCW1haW4uY3BwIFwKLQlQbHVnaW5PYmplY3QuY3BwIFwKLQlwbHVnaW5HcmFwaGljcy5jcHAKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0JJChMT0NBTF9QQVRIKSBcCi0JZXh0ZXJuYWwvd2Via2l0L1dlYkNvcmUvYnJpZGdlIFwKLQlleHRlcm5hbC93ZWJraXQvV2ViQ29yZS9wbHVnaW5zIFwKLQlleHRlcm5hbC93ZWJraXQvV2ViQ29yZS9wbGF0Zm9ybS9hbmRyb2lkL0phdmFWTSBcCi0JZXh0ZXJuYWwvd2Via2l0L1dlYktpdC9hbmRyb2lkL3BsdWdpbnMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTE9DQUxfU1JDX0ZJTEVTKQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gCi1MT0NBTF9QUkVMSU5LX01PRFVMRTo9ZmFsc2UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBTSEFSRURfTElCUkFSSUVTCi0KLUxPQ0FMX01PRFVMRTo9IGJyb3dzZXJ0ZXN0cGx1Z2luCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvUGx1Z2luT2JqZWN0LmNwcCBiL1dlYktpdC9hbmRyb2lkL3BsdWdpbnMvc2FtcGxlL1BsdWdpbk9iamVjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTkwNzIuLjAwMDAwMDAKLS0tIGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvUGx1Z2luT2JqZWN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKgotIElNUE9SVEFOVDogIFRoaXMgQXBwbGUgc29mdHdhcmUgaXMgc3VwcGxpZWQgdG8geW91IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBpbgotIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHlvdXIgdXNlLCBpbnN0YWxsYXRpb24sIAotIG1vZGlmaWNhdGlvbiBvciByZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIEFwcGxlIHNvZnR3YXJlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlc2UgCi0gdGVybXMuICBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMsIHBsZWFzZSBkbyBub3QgdXNlLCBpbnN0YWxsLCBtb2RpZnkgb3IgCi0gcmVkaXN0cmlidXRlIHRoaXMgQXBwbGUgc29mdHdhcmUuCi0gCi0gSW4gY29uc2lkZXJhdGlvbiBvZiB5b3VyIGFncmVlbWVudCB0byBhYmlkZSBieSB0aGUgZm9sbG93aW5nIHRlcm1zLCBhbmQgc3ViamVjdCB0byB0aGVzZSAKLSB0ZXJtcywgQXBwbGUgZ3JhbnRzIHlvdSBhIHBlcnNvbmFsLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHVuZGVyIEFwcGxl1XMgY29weXJpZ2h0cyBpbiAKLSB0aGlzIG9yaWdpbmFsIEFwcGxlIHNvZnR3YXJlICh0aGUgIkFwcGxlIFNvZnR3YXJlIiksIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnkgYW5kIAotIHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBpbiBzb3VyY2UgYW5kL29yIGJpbmFyeSAKLSBmb3JtczsgcHJvdmlkZWQgdGhhdCBpZiB5b3UgcmVkaXN0cmlidXRlIHRoZSBBcHBsZSBTb2Z0d2FyZSBpbiBpdHMgZW50aXJldHkgYW5kIHdpdGhvdXQgCi0gbW9kaWZpY2F0aW9ucywgeW91IG11c3QgcmV0YWluIHRoaXMgbm90aWNlIGFuZCB0aGUgZm9sbG93aW5nIHRleHQgYW5kIGRpc2NsYWltZXJzIGluIGFsbCAKLSBzdWNoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgQXBwbGUgU29mdHdhcmUuICBOZWl0aGVyIHRoZSBuYW1lLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzIAotIG9yIGxvZ29zIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gCi0gdGhlIEFwcGxlIFNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGZyb20gQXBwbGUuIEV4Y2VwdCBhcyBleHByZXNzbHkKLSBzdGF0ZWQgaW4gdGhpcyBub3RpY2UsIG5vIG90aGVyIHJpZ2h0cyBvciBsaWNlbnNlcywgZXhwcmVzcyBvciBpbXBsaWVkLCBhcmUgZ3JhbnRlZCBieSBBcHBsZQotIGhlcmVpbiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBhbnkgcGF0ZW50IHJpZ2h0cyB0aGF0IG1heSBiZSBpbmZyaW5nZWQgYnkgeW91ciAKLSBkZXJpdmF0aXZlIHdvcmtzIG9yIGJ5IG90aGVyIHdvcmtzIGluIHdoaWNoIHRoZSBBcHBsZSBTb2Z0d2FyZSBtYXkgYmUgaW5jb3Jwb3JhdGVkLgotIAotIFRoZSBBcHBsZSBTb2Z0d2FyZSBpcyBwcm92aWRlZCBieSBBcHBsZSBvbiBhbiAiQVMgSVMiIGJhc2lzLiAgQVBQTEUgTUFLRVMgTk8gV0FSUkFOVElFUywgCi0gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgCi0gTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBBUFBMRSBTT0ZUV0FSRSBPUiBJVFMgCi0gVVNFIEFORCBPUEVSQVRJT04gQUxPTkUgT1IgSU4gQ09NQklOQVRJT04gV0lUSCBZT1VSIFBST0RVQ1RTLgotIAotIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgCi0gREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgCi0gICAgICAgICAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSwgCi0gUkVQUk9EVUNUSU9OLCBNT0RJRklDQVRJT04gQU5EL09SIERJU1RSSUJVVElPTiBPRiBUSEUgQVBQTEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VEIEFORCAKLSBXSEVUSEVSIFVOREVSIFRIRU9SWSBPRiBDT05UUkFDVCwgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBTVFJJQ1QgTElBQklMSVRZIE9SIAotIE9USEVSV0lTRSwgRVZFTiBJRiBBUFBMRSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgotCi1zdGF0aWMgdm9pZCBwbHVnaW5JbnZhbGlkYXRlKE5QT2JqZWN0ICpvYmopOwotc3RhdGljIGJvb2wgcGx1Z2luSGFzUHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUpOwotc3RhdGljIGJvb2wgcGx1Z2luSGFzTWV0aG9kKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lKTsKLXN0YXRpYyBib29sIHBsdWdpbkdldFByb3BlcnR5KE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBOUFZhcmlhbnQgKnZhcmlhbnQpOwotc3RhdGljIGJvb2wgcGx1Z2luU2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqdmFyaWFudCk7Ci1zdGF0aWMgYm9vbCBwbHVnaW5JbnZva2UoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KTsKLXN0YXRpYyBib29sIHBsdWdpbkludm9rZURlZmF1bHQoTlBPYmplY3QgKm9iaiwgY29uc3QgTlBWYXJpYW50ICphcmdzLCB1aW50MzJfdCBhcmdDb3VudCwgTlBWYXJpYW50ICpyZXN1bHQpOwotc3RhdGljIE5QT2JqZWN0ICpwbHVnaW5BbGxvY2F0ZShOUFAgbnBwLCBOUENsYXNzICp0aGVDbGFzcyk7Ci1zdGF0aWMgdm9pZCBwbHVnaW5EZWFsbG9jYXRlKE5QT2JqZWN0ICpvYmopOwotc3RhdGljIGJvb2wgcGx1Z2luUmVtb3ZlUHJvcGVydHkoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgbmFtZSk7Ci1zdGF0aWMgYm9vbCBwbHVnaW5FbnVtZXJhdGUoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgKip2YWx1ZSwgdWludDMyX3QgKmNvdW50KTsKLQotCi0KLXN0YXRpYyBOUENsYXNzIHBsdWdpbkNsYXNzID0geyAKLSAgICBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKLSAgICBwbHVnaW5BbGxvY2F0ZSwgCi0gICAgcGx1Z2luRGVhbGxvY2F0ZSwgCi0gICAgcGx1Z2luSW52YWxpZGF0ZSwKLSAgICBwbHVnaW5IYXNNZXRob2QsCi0gICAgcGx1Z2luSW52b2tlLAotICAgIHBsdWdpbkludm9rZURlZmF1bHQsCi0gICAgcGx1Z2luSGFzUHJvcGVydHksCi0gICAgcGx1Z2luR2V0UHJvcGVydHksCi0gICAgcGx1Z2luU2V0UHJvcGVydHksCi0gICAgcGx1Z2luUmVtb3ZlUHJvcGVydHksCi0gICAgcGx1Z2luRW51bWVyYXRlCi19OwotIAotTlBDbGFzcyAqZ2V0UGx1Z2luQ2xhc3Modm9pZCkKLXsKLSAgICByZXR1cm4gJnBsdWdpbkNsYXNzOwotfQotCi1zdGF0aWMgYm9vbCBpZGVudGlmaWVyc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLSNkZWZpbmUgSURfVEVTVEZJTEVfUFJPUEVSVFkgICAgICAgICAgICAwCi0jZGVmaW5lIE5VTV9QUk9QRVJUWV9JREVOVElGSUVSUyAgICAgICAgMQotCi1zdGF0aWMgTlBJZGVudGlmaWVyIHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnNbTlVNX1BST1BFUlRZX0lERU5USUZJRVJTXTsKLXN0YXRpYyBjb25zdCBOUFVURjggKnBsdWdpblByb3BlcnR5SWRlbnRpZmllck5hbWVzW05VTV9QUk9QRVJUWV9JREVOVElGSUVSU10gPSB7Ci0gICAgInRlc3RmaWxlIgotfTsKLQotI2RlZmluZSBJRF9HRVRURVNURklMRV9NRVRIT0QgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBOVU1fTUVUSE9EX0lERU5USUZJRVJTICAgICAgICAgICAgICAgICAgMQotCi1zdGF0aWMgTlBJZGVudGlmaWVyIHBsdWdpbk1ldGhvZElkZW50aWZpZXJzW05VTV9NRVRIT0RfSURFTlRJRklFUlNdOwotc3RhdGljIGNvbnN0IE5QVVRGOCAqcGx1Z2luTWV0aG9kSWRlbnRpZmllck5hbWVzW05VTV9NRVRIT0RfSURFTlRJRklFUlNdID0gewotICAgICJnZXRUZXN0RmlsZSIKLX07Ci0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVJZGVudGlmaWVycyh2b2lkKQotewotICAgIGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXJzKHBsdWdpblByb3BlcnR5SWRlbnRpZmllck5hbWVzLCBOVU1fUFJPUEVSVFlfSURFTlRJRklFUlMsIHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnMpOwotICAgIGJyb3dzZXItPmdldHN0cmluZ2lkZW50aWZpZXJzKHBsdWdpbk1ldGhvZElkZW50aWZpZXJOYW1lcywgTlVNX01FVEhPRF9JREVOVElGSUVSUywgcGx1Z2luTWV0aG9kSWRlbnRpZmllcnMpOwotfQotCi1zdGF0aWMgYm9vbCBwbHVnaW5IYXNQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1BST1BFUlRZX0lERU5USUZJRVJTOyBpKyspCi0gICAgICAgIGlmIChuYW1lID09IHBsdWdpblByb3BlcnR5SWRlbnRpZmllcnNbaV0pCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHBsdWdpbkhhc01ldGhvZChOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01FVEhPRF9JREVOVElGSUVSUzsgaSsrKQotICAgICAgICBpZiAobmFtZSA9PSBwbHVnaW5NZXRob2RJZGVudGlmaWVyc1tpXSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcGx1Z2luR2V0UHJvcGVydHkoTlBPYmplY3QgKm9iaiwgTlBJZGVudGlmaWVyIG5hbWUsIE5QVmFyaWFudCAqdmFyaWFudCkKLXsKLSAgICBQbHVnaW5PYmplY3QgKnBsdWdpbiA9IChQbHVnaW5PYmplY3QgKilvYmo7Ci0gICAgaWYgKG5hbWUgPT0gcGx1Z2luUHJvcGVydHlJZGVudGlmaWVyc1tJRF9URVNURklMRV9QUk9QRVJUWV0pIHsKLSAgICAgICAgQk9PTEVBTl9UT19OUFZBUklBTlQodHJ1ZSwgKnZhcmlhbnQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBwbHVnaW5TZXRQcm9wZXJ0eShOUE9iamVjdCAqb2JqLCBOUElkZW50aWZpZXIgbmFtZSwgY29uc3QgTlBWYXJpYW50ICp2YXJpYW50KQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcGx1Z2luSW52b2tlKE5QT2JqZWN0ICpvYmosIE5QSWRlbnRpZmllciBuYW1lLCBjb25zdCBOUFZhcmlhbnQgKmFyZ3MsIHVpbnQzMl90IGFyZ0NvdW50LCBOUFZhcmlhbnQgKnJlc3VsdCkKLXsKLSAgICBQbHVnaW5PYmplY3QgKnBsdWdpbiA9IChQbHVnaW5PYmplY3QgKilvYmo7Ci0gICAgaWYgKG5hbWUgPT0gcGx1Z2luTWV0aG9kSWRlbnRpZmllcnNbSURfR0VUVEVTVEZJTEVfTUVUSE9EXSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBwbHVnaW5JbnZva2VEZWZhdWx0KE5QT2JqZWN0ICpvYmosIGNvbnN0IE5QVmFyaWFudCAqYXJncywgdWludDMyX3QgYXJnQ291bnQsIE5QVmFyaWFudCAqcmVzdWx0KQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgcGx1Z2luSW52YWxpZGF0ZShOUE9iamVjdCAqb2JqKQotewotICAgIC8vIFJlbGVhc2UgYW55IHJlbWFpbmluZyByZWZlcmVuY2VzIHRvIEphdmFTY3JpcHQgb2JqZWN0cy4KLX0KLQotc3RhdGljIE5QT2JqZWN0ICpwbHVnaW5BbGxvY2F0ZShOUFAgbnBwLCBOUENsYXNzICp0aGVDbGFzcykKLXsKLSAgICBQbHVnaW5PYmplY3QgKm5ld0luc3RhbmNlID0gKFBsdWdpbk9iamVjdCopIG1hbGxvYyhzaXplb2YoUGx1Z2luT2JqZWN0KSk7Ci0gICAgbmV3SW5zdGFuY2UtPmhlYWRlci5fY2xhc3MgPSB0aGVDbGFzczsKLSAgICBuZXdJbnN0YW5jZS0+aGVhZGVyLnJlZmVyZW5jZUNvdW50ID0gMTsKLSAgICAKLSAgICBpZiAoIWlkZW50aWZpZXJzSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgaWRlbnRpZmllcnNJbml0aWFsaXplZCA9IHRydWU7Ci0gICAgICAgIGluaXRpYWxpemVJZGVudGlmaWVycygpOwotICAgIH0KLSAgICAKLSAgICBuZXdJbnN0YW5jZS0+bnBwID0gbnBwOwotCi0gICAgcmV0dXJuICZuZXdJbnN0YW5jZS0+aGVhZGVyOwotfQotCi1zdGF0aWMgdm9pZCBwbHVnaW5EZWFsbG9jYXRlKE5QT2JqZWN0ICpvYmopIAotewotICAgIGZyZWUob2JqKTsKLX0KLQotc3RhdGljIGJvb2wgcGx1Z2luUmVtb3ZlUHJvcGVydHkoTlBPYmplY3QgKm5wb2JqLCBOUElkZW50aWZpZXIgbmFtZSkKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIHBsdWdpbkVudW1lcmF0ZShOUE9iamVjdCAqbnBvYmosIE5QSWRlbnRpZmllciAqKnZhbHVlLCB1aW50MzJfdCAqY291bnQpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCmRpZmYgLS1naXQgYS9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zL3NhbXBsZS9QbHVnaW5PYmplY3QuaCBiL1dlYktpdC9hbmRyb2lkL3BsdWdpbnMvc2FtcGxlL1BsdWdpbk9iamVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg5NjNkLi4wMDAwMDAwCi0tLSBhL1dlYktpdC9hbmRyb2lkL3BsdWdpbnMvc2FtcGxlL1BsdWdpbk9iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSBJTVBPUlRBTlQ6ICBUaGlzIEFwcGxlIHNvZnR3YXJlIGlzIHN1cHBsaWVkIHRvIHlvdSBieSBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgaW4KLSBjb25zaWRlcmF0aW9uIG9mIHlvdXIgYWdyZWVtZW50IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMsIGFuZCB5b3VyIHVzZSwgaW5zdGFsbGF0aW9uLCAKLSBtb2RpZmljYXRpb24gb3IgcmVkaXN0cmlidXRpb24gb2YgdGhpcyBBcHBsZSBzb2Z0d2FyZSBjb25zdGl0dXRlcyBhY2NlcHRhbmNlIG9mIHRoZXNlIAotIHRlcm1zLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zLCBwbGVhc2UgZG8gbm90IHVzZSwgaW5zdGFsbCwgbW9kaWZ5IG9yIAotIHJlZGlzdHJpYnV0ZSB0aGlzIEFwcGxlIHNvZnR3YXJlLgotIAotIEluIGNvbnNpZGVyYXRpb24gb2YgeW91ciBhZ3JlZW1lbnQgdG8gYWJpZGUgYnkgdGhlIGZvbGxvd2luZyB0ZXJtcywgYW5kIHN1YmplY3QgdG8gdGhlc2UgCi0gdGVybXMsIEFwcGxlIGdyYW50cyB5b3UgYSBwZXJzb25hbCwgbm9uLWV4Y2x1c2l2ZSBsaWNlbnNlLCB1bmRlciBBcHBsZdVzIGNvcHlyaWdodHMgaW4gCi0gdGhpcyBvcmlnaW5hbCBBcHBsZSBzb2Z0d2FyZSAodGhlICJBcHBsZSBTb2Z0d2FyZSIpLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5IGFuZCAKLSByZWRpc3RyaWJ1dGUgdGhlIEFwcGxlIFNvZnR3YXJlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgaW4gc291cmNlIGFuZC9vciBiaW5hcnkgCi0gZm9ybXM7IHByb3ZpZGVkIHRoYXQgaWYgeW91IHJlZGlzdHJpYnV0ZSB0aGUgQXBwbGUgU29mdHdhcmUgaW4gaXRzIGVudGlyZXR5IGFuZCB3aXRob3V0IAotIG1vZGlmaWNhdGlvbnMsIHlvdSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZSBhbmQgdGhlIGZvbGxvd2luZyB0ZXh0IGFuZCBkaXNjbGFpbWVycyBpbiBhbGwgCi0gc3VjaCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEFwcGxlIFNvZnR3YXJlLiAgTmVpdGhlciB0aGUgbmFtZSwgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcyAKLSBvciBsb2dvcyBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIAotIHRoZSBBcHBsZSBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIEFwcGxlLiBFeGNlcHQgYXMgZXhwcmVzc2x5Ci0gc3RhdGVkIGluIHRoaXMgbm90aWNlLCBubyBvdGhlciByaWdodHMgb3IgbGljZW5zZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgYXJlIGdyYW50ZWQgYnkgQXBwbGUKLSBoZXJlaW4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gYW55IHBhdGVudCByaWdodHMgdGhhdCBtYXkgYmUgaW5mcmluZ2VkIGJ5IHlvdXIgCi0gZGVyaXZhdGl2ZSB3b3JrcyBvciBieSBvdGhlciB3b3JrcyBpbiB3aGljaCB0aGUgQXBwbGUgU29mdHdhcmUgbWF5IGJlIGluY29ycG9yYXRlZC4KLSAKLSBUaGUgQXBwbGUgU29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgQXBwbGUgb24gYW4gIkFTIElTIiBiYXNpcy4gIEFQUExFIE1BS0VTIE5PIFdBUlJBTlRJRVMsIAotIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIAotIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgQVBQTEUgU09GVFdBUkUgT1IgSVRTIAotIFVTRSBBTkQgT1BFUkFUSU9OIEFMT05FIE9SIElOIENPTUJJTkFUSU9OIFdJVEggWU9VUiBQUk9EVUNUUy4KLSAKLSBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIAotIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIAotICAgICAgICAgIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UsIAotIFJFUFJPRFVDVElPTiwgTU9ESUZJQ0FUSU9OIEFORC9PUiBESVNUUklCVVRJT04gT0YgVEhFIEFQUExFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCBBTkQgCi0gV0hFVEhFUiBVTkRFUiBUSEVPUlkgT0YgQ09OVFJBQ1QsIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFKSwgU1RSSUNUIExJQUJJTElUWSBPUiAKLSBPVEhFUldJU0UsIEVWRU4gSUYgQVBQTEUgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBQbHVnaW5PYmplY3RfX0RFRklORUQKLSNkZWZpbmUgUGx1Z2luT2JqZWN0X19ERUZJTkVECi0KLSNpbmNsdWRlICJucGFwaS5oIgotCi1zdHJ1Y3QgQU5QQ2FudmFzOwotc3RydWN0IEFOUEF1ZGlvVHJhY2s7Ci0KLWNsYXNzIEFuaW1hdGlvbiB7Ci1wdWJsaWM6Ci0gICAgQW5pbWF0aW9uKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQotICAgIHZpcnR1YWwgfkFuaW1hdGlvbigpIHt9Ci0gICAgdmlydHVhbCB2b2lkIGRyYXcoQU5QQ2FudmFzKikgPSAwOwotICAgIAotICAgIE5QUCBpbnN0KCkgY29uc3QgeyByZXR1cm4gbV9pbnN0OyB9Ci0gICAgCi1wcml2YXRlOgotICAgIE5QUCBtX2luc3Q7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBQbHVnaW5PYmplY3QgewotICAgIE5QT2JqZWN0IGhlYWRlcjsKLSAgICBOUFAgbnBwOwotICAgIE5QV2luZG93KiB3aW5kb3c7Ci0gICAgQW5pbWF0aW9uKiBhbmltOwotICAgIEFOUEF1ZGlvVHJhY2sqIHRyYWNrOwotICAgIGludDMyX3QgbVVuaWNoYXI7Ci0gICAgCi0gICAgYm9vbCBtVGVzdFRpbWVyczsKLSAgICB1aW50MzJfdCBtU3RhcnRUaW1lOwotICAgIHVpbnQzMl90IG1QcmV2VGltZTsKLSAgICBpbnQgICAgICBtVGltZXJDb3VudDsKLX0gUGx1Z2luT2JqZWN0OwotCi1OUENsYXNzICpnZXRQbHVnaW5DbGFzcyh2b2lkKTsKLQotI2VuZGlmIC8vIFBsdWdpbk9iamVjdF9fREVGSU5FRApkaWZmIC0tZ2l0IGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvbWFpbi5jcHAgYi9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zL3NhbXBsZS9tYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFiYzA3Yy4uMDAwMDAwMAotLS0gYS9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zL3NhbXBsZS9tYWluLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgIlBsdWdpbk9iamVjdC5oIgotI2luY2x1ZGUgInBsdWdpbkdyYXBoaWNzLmgiCi0jaW5jbHVkZSAiYW5kcm9pZF9ucGFwaS5oIgotCi1OUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXI7Ci0jZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQotCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLCAKLSAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCk7Ci1OUEVycm9yIE5QUF9EZXN0cm95KE5QUCBpbnN0YW5jZSwgTlBTYXZlZERhdGEqKiBzYXZlKTsKLU5QRXJyb3IgTlBQX1NldFdpbmRvdyhOUFAgaW5zdGFuY2UsIE5QV2luZG93KiB3aW5kb3cpOwotTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCAKLSAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKTsKLU5QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pOwotaW50MzIgICBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pOwotaW50MzIgICBOUFBfV3JpdGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBpbnQzMiBvZmZzZXQsIGludDMyIGxlbiwgCi0gICAgICAgIHZvaWQqIGJ1ZmZlcik7Ci12b2lkICAgIE5QUF9TdHJlYW1Bc0ZpbGUoTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBjb25zdCBjaGFyKiBmbmFtZSk7Ci12b2lkICAgIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpOwotaW50MTYgICBOUFBfSGFuZGxlRXZlbnQoTlBQIGluc3RhbmNlLCB2b2lkKiBldmVudCk7Ci12b2lkICAgIE5QUF9VUkxOb3RpZnkoTlBQIGluc3RhbmNlLCBjb25zdCBjaGFyKiBVUkwsIE5QUmVhc29uIHJlYXNvbiwgCi0gICAgICAgIHZvaWQqIG5vdGlmeURhdGEpOwotTlBFcnJvciBOUFBfR2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwotTlBFcnJvciBOUFBfU2V0VmFsdWUoTlBQIGluc3RhbmNlLCBOUE5WYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCAqdmFsdWUpOwotCi1leHRlcm4gIkMiIHsKLUVYUE9SVCBOUEVycm9yIE5QX0luaXRpYWxpemUoTlBOZXRzY2FwZUZ1bmNzKiBicm93c2VyRnVuY3MsIE5QUGx1Z2luRnVuY3MqIHBsdWdpbkZ1bmNzLCB2b2lkICpqYXZhX2Vudiwgdm9pZCAqYXBwbGljYXRpb25fY29udGV4dCk7Ci1FWFBPUlQgTlBFcnJvciBOUF9HZXRWYWx1ZShOUFAgaW5zdGFuY2UsIE5QUFZhcmlhYmxlIHZhcmlhYmxlLCB2b2lkICp2YWx1ZSk7Ci1FWFBPUlQgY29uc3QgY2hhciogTlBfR2V0TUlNRURlc2NyaXB0aW9uKHZvaWQpOwotRVhQT1JUIHZvaWQgTlBfU2h1dGRvd24odm9pZCk7IAotfTsKLQotQU5QQXVkaW9UcmFja0ludGVyZmFjZVYwICAgIGdTb3VuZEk7Ci1BTlBDYW52YXNJbnRlcmZhY2VWMCAgICAgICAgZ0NhbnZhc0k7Ci1BTlBMb2dJbnRlcmZhY2VWMCAgICAgICAgICAgZ0xvZ0k7Ci1BTlBQYWludEludGVyZmFjZVYwICAgICAgICAgZ1BhaW50STsKLUFOUFBhdGhJbnRlcmZhY2VWMCAgICAgICAgICBnUGF0aEk7Ci1BTlBUeXBlZmFjZUludGVyZmFjZVYwICAgICAgZ1R5cGVmYWNlSTsKLQotI2RlZmluZSBBUlJBWV9DT1VOVChhcnJheSkgICAgICAoc2l6ZW9mKGFycmF5KSAvIHNpemVvZihhcnJheVswXSkpCi0KLU5QRXJyb3IgTlBfSW5pdGlhbGl6ZShOUE5ldHNjYXBlRnVuY3MqIGJyb3dzZXJGdW5jcywgTlBQbHVnaW5GdW5jcyogcGx1Z2luRnVuY3MsIHZvaWQgKmphdmFfZW52LCB2b2lkICphcHBsaWNhdGlvbl9jb250ZXh0KQotewotICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZnVuY3Rpb24gdGFibGUgZXF1YWwgb3IgbGFyZ2VyIHRoYW4gd2UgYXJlIGJ1aWx0IGFnYWluc3QuCi0gICAgaWYgKGJyb3dzZXJGdW5jcy0+c2l6ZSA8IHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKSB7Ci0gICAgICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwotICAgIH0KLSAgICAKLSAgICAvLyBDb3B5IHRoZSBmdW5jdGlvbiB0YWJsZSAoc3RydWN0dXJlKQotICAgIGJyb3dzZXIgPSAoTlBOZXRzY2FwZUZ1bmNzKikgbWFsbG9jKHNpemVvZihOUE5ldHNjYXBlRnVuY3MpKTsKLSAgICBtZW1jcHkoYnJvd3NlciwgYnJvd3NlckZ1bmNzLCBzaXplb2YoTlBOZXRzY2FwZUZ1bmNzKSk7Ci0gICAgCi0gICAgLy8gQnVpbGQgdGhlIHBsdWdpbiBmdW5jdGlvbiB0YWJsZQotICAgIHBsdWdpbkZ1bmNzLT52ZXJzaW9uID0gMTE7Ci0gICAgcGx1Z2luRnVuY3MtPnNpemUgPSBzaXplb2YocGx1Z2luRnVuY3MpOwotICAgIHBsdWdpbkZ1bmNzLT5uZXdwID0gTlBQX05ldzsKLSAgICBwbHVnaW5GdW5jcy0+ZGVzdHJveSA9IE5QUF9EZXN0cm95OwotICAgIHBsdWdpbkZ1bmNzLT5zZXR3aW5kb3cgPSBOUFBfU2V0V2luZG93OwotICAgIHBsdWdpbkZ1bmNzLT5uZXdzdHJlYW0gPSBOUFBfTmV3U3RyZWFtOwotICAgIHBsdWdpbkZ1bmNzLT5kZXN0cm95c3RyZWFtID0gTlBQX0Rlc3Ryb3lTdHJlYW07Ci0gICAgcGx1Z2luRnVuY3MtPmFzZmlsZSA9IE5QUF9TdHJlYW1Bc0ZpbGU7Ci0gICAgcGx1Z2luRnVuY3MtPndyaXRlcmVhZHkgPSBOUFBfV3JpdGVSZWFkeTsKLSAgICBwbHVnaW5GdW5jcy0+d3JpdGUgPSAoTlBQX1dyaXRlUHJvY1B0cilOUFBfV3JpdGU7Ci0gICAgcGx1Z2luRnVuY3MtPnByaW50ID0gTlBQX1ByaW50OwotICAgIHBsdWdpbkZ1bmNzLT5ldmVudCA9IE5QUF9IYW5kbGVFdmVudDsKLSAgICBwbHVnaW5GdW5jcy0+dXJsbm90aWZ5ID0gTlBQX1VSTE5vdGlmeTsKLSAgICBwbHVnaW5GdW5jcy0+Z2V0dmFsdWUgPSBOUFBfR2V0VmFsdWU7Ci0gICAgcGx1Z2luRnVuY3MtPnNldHZhbHVlID0gTlBQX1NldFZhbHVlOwotCi0gICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgICAgIE5QTlZhcmlhYmxlICAgICB2OwotICAgICAgICB1aW50MzJfdCAgICAgICAgc2l6ZTsKLSAgICAgICAgQU5QSW50ZXJmYWNlKiAgIGk7Ci0gICAgfSBnUGFpcnNbXSA9IHsKLSAgICAgICAgeyBrTG9nSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgICAgIHNpemVvZihnTG9nSSksICAgICAgJmdMb2dJIH0sCi0gICAgICAgIHsga0NhbnZhc0ludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICBzaXplb2YoZ0NhbnZhc0kpLCAgICZnQ2FudmFzSSB9LAotICAgICAgICB7IGtQYWludEludGVyZmFjZVYwX0FOUEdldFZhbHVlLCAgICAgICAgc2l6ZW9mKGdQYWludEkpLCAgICAmZ1BhaW50SSB9LAotICAgICAgICB7IGtQYXRoSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICAgICAgc2l6ZW9mKGdQYXRoSSksICAgICAmZ1BhdGhJIH0sCi0gICAgICAgIHsga1R5cGVmYWNlSW50ZXJmYWNlVjBfQU5QR2V0VmFsdWUsICAgICBzaXplb2YoZ1BhaW50SSksICAgICZnVHlwZWZhY2VJIH0sCi0gICAgICAgIHsga0F1ZGlvVHJhY2tJbnRlcmZhY2VWMF9BTlBHZXRWYWx1ZSwgICBzaXplb2YoZ1NvdW5kSSksICAgICZnU291bmRJIH0sCi0gICAgfTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX0NPVU5UKGdQYWlycyk7IGkrKykgewotICAgICAgICBnUGFpcnNbaV0uaS0+aW5TaXplID0gZ1BhaXJzW2ldLnNpemU7Ci0gICAgICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+Z2V0dmFsdWUoTlVMTCwgZ1BhaXJzW2ldLnYsIGdQYWlyc1tpXS5pKTsKLSAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Ci19Ci0KLXZvaWQgTlBfU2h1dGRvd24odm9pZCkKLXsKLQotfQotCi1jb25zdCBjaGFyICpOUF9HZXRNSU1FRGVzY3JpcHRpb24odm9pZCkgCi17Ci0gICAgcmV0dXJuICJhcHBsaWNhdGlvbi94LXRlc3RwbHVnaW46dHN0OlRlc3QgcGx1Z2luIG1pbWV0eXBlIGlzIGFwcGxpY2F0aW9uL3gtdGVzdHBsdWdpbiI7Ci19Ci0KLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCi0gICAgICAgICAgICAgICAgY2hhciogYXJnbltdLCBjaGFyKiBhcmd2W10sIE5QU2F2ZWREYXRhKiBzYXZlZCkKLXsKLSAgICBQbHVnaW5PYmplY3QgKm9iaiA9IE5VTEw7Ci0KLSAgICAvLyBTY3JpcHRpbmcgZnVuY3Rpb25zIGFwcGVhcmVkIGluIE5QQVBJIHZlcnNpb24gMTQKLSAgICBpZiAoYnJvd3Nlci0+dmVyc2lvbiA+PSAxNCkgewotICAgICAgICBpbnN0YW5jZS0+cGRhdGEgPSBicm93c2VyLT5jcmVhdGVvYmplY3QgKGluc3RhbmNlLCBnZXRQbHVnaW5DbGFzcygpKTsKLSAgICAgICAgb2JqID0gc3RhdGljX2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKLSAgICAgICAgYnplcm8ob2JqLCBzaXplb2YoKm9iaikpOwotICAgIH0KLSAgICAKLSAgICB1aW50MzJfdCBiaXRzOwotICAgIE5QRXJyb3IgZXJyID0gYnJvd3Nlci0+Z2V0dmFsdWUoaW5zdGFuY2UsIGtTdXBwb3J0ZWREcmF3aW5nTW9kZWxfQU5QR2V0VmFsdWUsICZiaXRzKTsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0Vycm9yX0FOUExvZ1R5cGUsICJzdXBwb3J0ZWQgbW9kZWwgZXJyICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgCi0gICAgQU5QRHJhd2luZ01vZGVsIG1vZGVsID0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWw7Ci0KLSAgICBpbnQgY291bnQgPSBhcmdjOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBpZiAoIXN0cmNtcChhcmduW2ldLCAiRHJhd2luZ01vZGVsIikpIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICJCaXRtYXAiKSkgewotICAgICAgICAgICAgICAgIG1vZGVsID0ga0JpdG1hcF9BTlBEcmF3aW5nTW9kZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiQ2FudmFzIikpIHsKLSAgICAgICAgICAgIC8vICAgIG9iai0+bVRlc3RUaW1lcnMgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLSAlcCBEcmF3aW5nTW9kZWwgaXMgJWQiLCBpbnN0YW5jZSwgbW9kZWwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjb21tZW50IHRoaXMgb3V0IHRvIGRyYXcgdmlhIGJpdG1hcHMgKHRoZSBkZWZhdWx0KQotICAgIGVyciA9IGJyb3dzZXItPnNldHZhbHVlKGluc3RhbmNlLCBrUmVxdWVzdERyYXdpbmdNb2RlbF9BTlBTZXRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihtb2RlbCkpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgInJlcXVlc3QgbW9kZWwgJWQgZXJyICVkIiwgbW9kZWwsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU5QRXJyb3IgTlBQX0Rlc3Ryb3koTlBQIGluc3RhbmNlLCBOUFNhdmVkRGF0YSoqIHNhdmUpCi17Ci0gICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOwotICAgIGRlbGV0ZSBvYmotPmFuaW07Ci0gICAgZ1NvdW5kSS5kZWxldGVUcmFjayhvYmotPnRyYWNrKTsKLQotICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKLX0KLQotc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKSB7Ci0gICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLS0tIG9uZXNob3QgdGltZXJcbiIpOwotfQotCi1zdGF0aWMgaW50IGdUaW1lclJlcGVhdENvdW50Owotc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKLSAgICAKLSAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLS0tLS0gcmVwZWF0IHRpbWVyICVkXG4iLAotICAgICAgICAgICAgICBnVGltZXJSZXBlYXRDb3VudCk7Ci0gICAgaWYgKC0tZ1RpbWVyUmVwZWF0Q291bnQgPT0gMCkgewotICAgICAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIHRpbWVySUQpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgdGltZXJfbmV2ZXJmaXJlcyhOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKSB7Ci0gICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRXJyb3JfQU5QTG9nVHlwZSwgIi0tLS0tLS0tIHRpbWVyX25ldmVyZmlyZXMhISFcbiIpOwotfQotCi0jZGVmaW5lIFRJTUVSX0lOVEVSVkFMICAgICA1MAotCi1zdGF0aWMgdm9pZCB0aW1lcl9sYXRlbmN5KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKLSAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7Ci0KLSAgICBvYmotPm1UaW1lckNvdW50ICs9IDE7Ci0KLSAgICB1aW50MzJfdCBub3cgPSBnZXRNU2VjcygpOwotICAgIHVpbnQzMl90IGludGVydmFsID0gbm93IC0gb2JqLT5tUHJldlRpbWU7Ci0KLSAgICB1aW50MzJfdCBkdXIgPSBub3cgLSBvYmotPm1TdGFydFRpbWU7Ci0gICAgdWludDMyX3QgZXhwZWN0ZWREdXIgPSBvYmotPm1UaW1lckNvdW50ICogVElNRVJfSU5URVJWQUw7Ci0gICAgaW50MzJfdCBkcmlmdCA9IGR1ciAtIGV4cGVjdGVkRHVyOwotICAgIGludDMyX3QgYXZlRHJpZnQgPSBkcmlmdCAvIG9iai0+bVRpbWVyQ291bnQ7Ci0gICAgCi0gICAgb2JqLT5tUHJldlRpbWUgPSBub3c7Ci0gICAgCi0gICAgZ0xvZ0kubG9nKGluc3RhbmNlLCBrRGVidWdfQU5QTG9nVHlwZSwKLSAgICAgICAgICAgICAgIi0tLS0tLS0tIGxhdGVuY3kgdGVzdDogWyUzZF0gaW50ZXJ2YWwgJWQgZXhwZWN0ZWQgJWQsIHRvdGFsICVkIGV4cGVjdGVkICVkLCBkcmlmdCAlZCBhdmUgJWRcbiIsCi0gICAgICAgICAgICAgIG9iai0+bVRpbWVyQ291bnQsIGludGVydmFsLCBUSU1FUl9JTlRFUlZBTCwgZHVyLCBleHBlY3RlZER1ciwKLSAgICAgICAgICAgICAgZHJpZnQsIGF2ZURyaWZ0KTsKLX0KLQotTlBFcnJvciBOUFBfU2V0V2luZG93KE5QUCBpbnN0YW5jZSwgTlBXaW5kb3cqIHdpbmRvdykKLXsKLSAgICBQbHVnaW5PYmplY3QgKm9iaiA9IChQbHVnaW5PYmplY3QqKSBpbnN0YW5jZS0+cGRhdGE7Ci0gICAgCi0gICAgLy8gRG8gbm90aGluZyBpZiBicm93c2VyIGRpZG4ndCBzdXBwb3J0IE5QTl9DcmVhdGVPYmplY3Qgd2hpY2ggd291bGQgaGF2ZSBjcmVhdGVkIHRoZSBQbHVnaW5PYmplY3QuCi0gICAgaWYgKG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgIG9iai0+d2luZG93ID0gd2luZG93OwotICAgIH0KLSAgICAKLSAgICBzdGF0aWMgYm9vbCBnVGVzdFRpbWVyczsKLSAgICBpZiAoIWdUZXN0VGltZXJzKSB7Ci0gICAgICAgIGdUZXN0VGltZXJzID0gdHJ1ZTsKLSAgICAgICAgLy8gdGVzdCBmb3IgYm9ndXMgdGltZXJJRAotICAgICAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIDk5OTk5OSk7Ci0gICAgICAgIC8vIHRlc3Qgb25lc2hvdAotICAgICAgICBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCAxMDAsIGZhbHNlLCB0aW1lcl9vbmVzaG90KTsKLSAgICAgICAgLy8gdGVzdCByZXBlYXQKLSAgICAgICAgZ1RpbWVyUmVwZWF0Q291bnQgPSAxMDsKLSAgICAgICAgYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgNTAsIHRydWUsIHRpbWVyX3JlcGVhdCk7Ci0gICAgICAgIC8vIHRlc3QgdW5zY2hlZHVsZSBpbW1lZGlhdGVseQotICAgICAgICB1aW50MzIgaWQgPSBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCAxMDAsIGZhbHNlLCB0aW1lcl9uZXZlcmZpcmVzKTsKLSAgICAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBpZCk7Ci0gICAgICAgIC8vIHRlc3QgZG91YmxlIHVuc2NoZWRsdWUgKHNob3VsZCBiZSBuby1vcCkKLSAgICAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBpZCk7Ci0gICAgfQotICAgIAotICAgIGlmIChvYmotPm1UZXN0VGltZXJzKSB7Ci0gICAgICAgIGJyb3dzZXItPnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIFRJTUVSX0lOVEVSVkFMLCB0cnVlLCB0aW1lcl9sYXRlbmN5KTsKLSAgICAgICAgb2JqLT5tU3RhcnRUaW1lID0gb2JqLT5tUHJldlRpbWUgPSBnZXRNU2VjcygpOwotICAgICAgICBvYmotPm1UZXN0VGltZXJzID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKLQotICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKLX0KLSAKLQotTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNiogc3R5cGUpCi17Ci0gICAgKnN0eXBlID0gTlBfQVNGSUxFT05MWTsKLSAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7Ci19Ci0KLU5QRXJyb3IgTlBQX0Rlc3Ryb3lTdHJlYW0oTlBQIGluc3RhbmNlLCBOUFN0cmVhbSogc3RyZWFtLCBOUFJlYXNvbiByZWFzb24pCi17Ci0gICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwotfQotCi1pbnQzMiBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludDMyIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLCB2b2lkKiBidWZmZXIpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgTlBQX1N0cmVhbUFzRmlsZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIGZuYW1lKQotewotfQotCi12b2lkIE5QUF9QcmludChOUFAgaW5zdGFuY2UsIE5QUHJpbnQqIHBsYXRmb3JtUHJpbnQpCi17Ci0KLX0KLQotc3RydWN0IFNvdW5kUGxheSB7Ci0gICAgTlBQICAgICAgICAgICAgIGluc3RhbmNlOwotICAgIEFOUEF1ZGlvVHJhY2sqICB0cmFjazsKLSAgICBGSUxFKiAgICAgICAgICAgZmlsZTsKLX07Ci0KLXN0YXRpYyB2b2lkIGF1ZGlvQ2FsbGJhY2soQU5QQXVkaW9FdmVudCBldnQsIHZvaWQqIHVzZXIsIEFOUEF1ZGlvQnVmZmVyKiBidWZmZXIpIHsKLSAgICBzd2l0Y2ggKGV2dCkgewotICAgICAgICBjYXNlIGtNb3JlRGF0YV9BTlBBdWRpb0V2ZW50OiB7Ci0gICAgICAgICAgICBTb3VuZFBsYXkqIHBsYXkgPSByZWludGVycHJldF9jYXN0PFNvdW5kUGxheSo+KHVzZXIpOwotICAgICAgICAgICAgc2l6ZV90IGFtb3VudCA9IGZyZWFkKGJ1ZmZlci0+YnVmZmVyRGF0YSwgMSwgYnVmZmVyLT5zaXplLCBwbGF5LT5maWxlKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFtb3VudDsKLSAgICAgICAgICAgIGlmIChhbW91bnQgPT0gMCkgewotICAgICAgICAgICAgICAgIGdTb3VuZEkuc3RvcChwbGF5LT50cmFjayk7Ci0gICAgICAgICAgICAgICAgZmNsb3NlKHBsYXktPmZpbGUpOwotICAgICAgICAgICAgICAgIHBsYXktPmZpbGUgPSBOVUxMOwotICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gbm90aWZ5IG91ciBtYWluIHRocmVhZCB0byBkZWxldGUgdGhlIHRyYWNrIG5vdwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIEFOUEF1ZGlvVHJhY2sqIGNyZWF0ZVRyYWNrKE5QUCBpbnN0YW5jZSwgY29uc3QgY2hhciBwYXRoW10pIHsKLSAgICBGSUxFKiBmID0gZm9wZW4ocGF0aCwgInIiKTsKLSAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtXYXJuaW5nX0FOUExvZ1R5cGUsICItLS0gcGF0aCAlcyBGSUxFICVwIiwgcGF0aCwgZik7Ci0gICAgaWYgKE5VTEwgPT0gZikgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgU291bmRQbGF5KiBwbGF5ID0gbmV3IFNvdW5kUGxheTsKLSAgICBwbGF5LT5maWxlID0gZjsKLSAgICBwbGF5LT50cmFjayA9IGdTb3VuZEkubmV3VHJhY2soNDQxMDAsIGtQQ00xNkJpdF9BTlBTYW1wbGVGb3JtYXQsIDIsIGF1ZGlvQ2FsbGJhY2ssIHBsYXkpOwotICAgIGlmIChOVUxMID09IHBsYXktPnRyYWNrKSB7Ci0gICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgZGVsZXRlIHBsYXk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcGxheS0+dHJhY2s7Ci19Ci0KLWludDE2IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQotewotICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOwotICAgIGNvbnN0IEFOUEV2ZW50KiBldnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEFOUEV2ZW50Kj4oZXZlbnQpOwotCi0gICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewotICAgICAgICBjYXNlIGtEcmF3X0FOUEV2ZW50VHlwZToKLSAgICAgICAgICAgIHN3aXRjaCAoZXZ0LT5kYXRhLmRyYXdDb250ZXh0Lm1vZGVsKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBrQml0bWFwX0FOUERyYXdpbmdNb2RlbDoKLSAgICAgICAgICAgICAgICAgICAgZHJhd1BsdWdpbihpbnN0YW5jZSwgZXZ0LT5kYXRhLmRyYXdDb250ZXh0LmRhdGEuYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS5kcmF3Q29udGV4dC5jbGlwKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLy8gdW5rbm93biBkcmF3aW5nIG1vZGVsCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrS2V5X0FOUEV2ZW50VHlwZToKLSAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICItLS0tICVwIEtleSBhY3Rpb249JWQiCi0gICAgICAgICAgICAgICAgICAgICAgIiBjb2RlPSVkIHZjb2RlPSVkIHVuaWNoYXI9JWQgcmVwZWF0PSVkIG1vZHM9JXgiLCBpbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5LmFjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5Lm5hdGl2ZUNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS52aXJ0dWFsQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5LnVuaWNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgZXZ0LT5kYXRhLmtleS5yZXBlYXRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBldnQtPmRhdGEua2V5Lm1vZGlmaWVycyk7Ci0gICAgICAgICAgICBpZiAoZXZ0LT5kYXRhLmtleS5hY3Rpb24gPT0ga0Rvd25fQU5QS2V5QWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgb2JqLT5tVW5pY2hhciA9IGV2dC0+ZGF0YS5rZXkudW5pY2hhcjsKLSAgICAgICAgICAgICAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBjYXNlIGtUb3VjaF9BTlBFdmVudFR5cGU6Ci0gICAgICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiLS0tLSAlcCBUb3VjaCBhY3Rpb249JWQgWyVkICVkXSIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIGV2dC0+ZGF0YS50b3VjaC5hY3Rpb24sIGV2dC0+ZGF0YS50b3VjaC54LAotICAgICAgICAgICAgICAgICAgICAgIGV2dC0+ZGF0YS50b3VjaC55KTsKLSAgICAgICAgICAgIGlmIChrVXBfQU5QVG91Y2hBY3Rpb24gPT0gZXZ0LT5kYXRhLnRvdWNoLmFjdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChOVUxMID09IG9iai0+dHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgb2JqLT50cmFjayA9IGNyZWF0ZVRyYWNrKGluc3RhbmNlLCAiL3NkY2FyZC9zYW1wbGUuc25kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvYmotPnRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdMb2dJLmxvZyhpbnN0YW5jZSwga0RlYnVnX0FOUExvZ1R5cGUsICJ0cmFjayAlcCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmotPnRyYWNrLCBnU291bmRJLmlzU3RvcHBlZChvYmotPnRyYWNrKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnU291bmRJLmlzU3RvcHBlZChvYmotPnRyYWNrKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ1NvdW5kSS5zdGFydChvYmotPnRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdTb3VuZEkucGF1c2Uob2JqLT50cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOyAgIC8vIHVua25vd24gb3IgdW5oYW5kbGVkIGV2ZW50Ci19Ci0KLXZvaWQgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIHVybCwgTlBSZWFzb24gcmVhc29uLCB2b2lkKiBub3RpZnlEYXRhKQotewotCi19Ci0KLUVYUE9SVCBOUEVycm9yIE5QX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKSB7Ci0KLSAgICBpZiAodmFyaWFibGUgPT0gTlBQVnBsdWdpbk5hbWVTdHJpbmcpIHsKLSAgICAgICAgY29uc3QgY2hhciAqKnN0ciA9IChjb25zdCBjaGFyICoqKXZhbHVlOwotICAgICAgICAqc3RyID0gIlRlc3QgUGx1Z2luIjsKLSAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwotICAgIH0KLSAgICAKLSAgICBpZiAodmFyaWFibGUgPT0gTlBQVnBsdWdpbkRlc2NyaXB0aW9uU3RyaW5nKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKipzdHIgPSAoY29uc3QgY2hhciAqKil2YWx1ZTsKLSAgICAgICAgKnN0ciA9ICJEZXNjcmlwdGlvbiBvZiBUZXN0IFBsdWdpbiI7Ci0gICAgICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Ci19Ci0KLU5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKQotewotICAgIGlmICh2YXJpYWJsZSA9PSBOUFBWcGx1Z2luU2NyaXB0YWJsZU5QT2JqZWN0KSB7Ci0gICAgICAgIHZvaWQgKip2ID0gKHZvaWQgKiopdmFsdWU7Ci0gICAgICAgIFBsdWdpbk9iamVjdCAqb2JqID0gKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YTsKLSAgICAgICAgCi0gICAgICAgIGlmIChvYmopCi0gICAgICAgICAgICBicm93c2VyLT5yZXRhaW5vYmplY3QoKE5QT2JqZWN0KilvYmopOwotICAgICAgICAKLSAgICAgICAgKnYgPSBvYmo7Ci0gICAgICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Ci19Ci0KLU5QRXJyb3IgTlBQX1NldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBOVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKQotewotICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwotfQotCmRpZmYgLS1naXQgYS9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zL3NhbXBsZS9wbHVnaW5HcmFwaGljcy5jcHAgYi9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zL3NhbXBsZS9wbHVnaW5HcmFwaGljcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYmY3YTcuLjAwMDAwMDAKLS0tIGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvcGx1Z2luR3JhcGhpY3MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotIAotI2luY2x1ZGUgInBsdWdpbkdyYXBoaWNzLmgiCi0KLSNpbmNsdWRlICJhbmRyb2lkX25wYXBpLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLWV4dGVybiBOUE5ldHNjYXBlRnVuY3MqICAgICAgICBicm93c2VyOwotZXh0ZXJuIEFOUExvZ0ludGVyZmFjZVYwICAgICAgIGdMb2dJOwotZXh0ZXJuIEFOUENhbnZhc0ludGVyZmFjZVYwICAgIGdDYW52YXNJOwotZXh0ZXJuIEFOUFBhaW50SW50ZXJmYWNlVjAgICAgIGdQYWludEk7Ci1leHRlcm4gQU5QUGF0aEludGVyZmFjZVYwICAgICAgZ1BhdGhJOwotZXh0ZXJuIEFOUFR5cGVmYWNlSW50ZXJmYWNlVjAgIGdUeXBlZmFjZUk7Ci0KLXN0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSkgewotICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKLX0KLQotc3RhdGljIHVpbnQxNiBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKLSAgICBpbnQgaXggPSAoaW50KXJvdW5kZih4KSArIGluc2V0OwotICAgIGlmIChpeCA8IDApIHsKLSAgICAgICAgaXggPSAwOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2PihpeCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgewotICAgIGNvbnN0IGludCBpbnNldCA9IGRvQUEgPyAtMSA6IDA7Ci0KLSAgICBQbHVnaW5PYmplY3QgKm9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luT2JqZWN0Kj4oaW5zdGFuY2UtPnBkYXRhKTsKLSAgICBOUFJlY3QgaW52YWw7Ci0gICAgaW52YWwubGVmdCA9IHJuZDE2KHIubGVmdCwgaW5zZXQpOwotICAgIGludmFsLnRvcCA9IHJuZDE2KHIudG9wLCBpbnNldCk7Ci0gICAgaW52YWwucmlnaHQgPSBybmQxNihyLnJpZ2h0LCAtaW5zZXQpOwotICAgIGludmFsLmJvdHRvbSA9IHJuZDE2KHIuYm90dG9tLCAtaW5zZXQpOwotICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCAmaW52YWwpOwotfQotCi11aW50MzJfdCBnZXRNU2VjcygpIHsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLSAgICByZXR1cm4gKHVpbnQzMl90KSAodHYudHZfc2VjICogMTAwMCArIHR2LnR2X3VzZWMgLyAxMDAwICk7IC8vIG1pY3Jvc2Vjb25kcyB0byBtaWxsaXNlY29uZHMKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1jbGFzcyBCYWxsQW5pbWF0aW9uIDogcHVibGljIEFuaW1hdGlvbiB7Ci1wdWJsaWM6Ci0gICAgQmFsbEFuaW1hdGlvbihOUFAgaW5zdCk7Ci0gICAgdmlydHVhbCB+QmFsbEFuaW1hdGlvbigpOwotICAgIHZpcnR1YWwgdm9pZCBkcmF3KEFOUENhbnZhcyopOwotcHJpdmF0ZToKLSAgICBmbG9hdCBtX3g7Ci0gICAgZmxvYXQgbV95OwotICAgIGZsb2F0IG1fZHg7Ci0gICAgZmxvYXQgbV9keTsKLSAgICAKLSAgICBBTlBSZWN0RiAgICBtX292YWw7Ci0gICAgQU5QUGFpbnQqICAgbV9wYWludDsKLSAgICAKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgU0NBTEUgPSAwLjE7Ci19OwotCi1CYWxsQW5pbWF0aW9uOjpCYWxsQW5pbWF0aW9uKE5QUCBpbnN0KSA6IEFuaW1hdGlvbihpbnN0KSB7Ci0gICAgbV94ID0gbV95ID0gMDsKLSAgICBtX2R4ID0gNyAqIFNDQUxFOwotICAgIG1fZHkgPSA1ICogU0NBTEU7Ci0gICAgCi0gICAgbWVtc2V0KCZtX292YWwsIDAsIHNpemVvZihtX292YWwpKTsKLQotICAgIG1fcGFpbnQgPSBnUGFpbnRJLm5ld1BhaW50KCk7Ci0gICAgZ1BhaW50SS5zZXRGbGFncyhtX3BhaW50LCBnUGFpbnRJLmdldEZsYWdzKG1fcGFpbnQpIHwga0FudGlBbGlhc19BTlBQYWludEZsYWcpOwotICAgIGdQYWludEkuc2V0Q29sb3IobV9wYWludCwgMHhGRkZGMDAwMCk7Ci0gICAgZ1BhaW50SS5zZXRUZXh0U2l6ZShtX3BhaW50LCAyNCk7Ci0gICAgCi0gICAgQU5QVHlwZWZhY2UqIHRmID0gZ1R5cGVmYWNlSS5jcmVhdGVGcm9tTmFtZSgic2VyaWYiLCBrSXRhbGljX0FOUFR5cGVmYWNlU3R5bGUpOwotICAgIGdQYWludEkuc2V0VHlwZWZhY2UobV9wYWludCwgdGYpOwotICAgIGdUeXBlZmFjZUkudW5yZWYodGYpOwotfQotCi1CYWxsQW5pbWF0aW9uOjp+QmFsbEFuaW1hdGlvbigpIHsKLSAgICBnUGFpbnRJLmRlbGV0ZVBhaW50KG1fcGFpbnQpOwotfQotCi1zdGF0aWMgdm9pZCBib3VuY2UoZmxvYXQqIHgsIGZsb2F0KiBkeCwgY29uc3QgZmxvYXQgbWF4KSB7Ci0gICAgKnggKz0gKmR4OwotICAgIGlmICgqeCA8IDApIHsKLSAgICAgICAgKnggPSAwOwotICAgICAgICBpZiAoKmR4IDwgMCkgewotICAgICAgICAgICAgKmR4ID0gLSpkeDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoKnggPiBtYXgpIHsKLSAgICAgICAgKnggPSBtYXg7Ci0gICAgICAgIGlmICgqZHggPiAwKSB7Ci0gICAgICAgICAgICAqZHggPSAtKmR4OwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEJhbGxBbmltYXRpb246OmRyYXcoQU5QQ2FudmFzKiBjYW52YXMpIHsKLSAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7Ci0gICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOwotICAgIGNvbnN0IGZsb2F0IE9XID0gMjA7Ci0gICAgY29uc3QgZmxvYXQgT0ggPSAyMDsKLSAgICBjb25zdCBpbnQgVyA9IG9iai0+d2luZG93LT53aWR0aDsKLSAgICBjb25zdCBpbnQgSCA9IG9iai0+d2luZG93LT5oZWlnaHQ7Ci0KLSAgICBpbnZhbChpbnN0YW5jZSwgbV9vdmFsLCB0cnVlKTsgIC8vIGludmFsIHRoZSBvbGQKLSAgICBtX292YWwubGVmdCA9IG1feDsKLSAgICBtX292YWwudG9wID0gbV95OwotICAgIG1fb3ZhbC5yaWdodCA9IG1feCArIE9XOwotICAgIG1fb3ZhbC5ib3R0b20gPSBtX3kgKyBPSDsKLSAgICBpbnZhbChpbnN0YW5jZSwgbV9vdmFsLCB0cnVlKTsgIC8vIGludmFsIHRoZSBuZXcKLQotICAgIGdDYW52YXNJLmRyYXdDb2xvcihjYW52YXMsIDB4RkZGRkZGRkYpOwotCi0gICAgLy8gdGVzdCBvdXQgdGhlIFBhdGggQVBJCi0gICAgewotICAgICAgICBBTlBQYXRoKiBwYXRoID0gZ1BhdGhJLm5ld1BhdGgoKTsKLQotICAgICAgICBmbG9hdCBjeCA9IFcgKiAwLjVmOwotICAgICAgICBmbG9hdCBjeSA9IEggKiAwLjVmOwotICAgICAgICBnUGF0aEkubW92ZVRvKHBhdGgsIDAsIDApOwotICAgICAgICBnUGF0aEkucXVhZFRvKHBhdGgsIGN4LCBjeSwgVywgMCk7Ci0gICAgICAgIGdQYXRoSS5xdWFkVG8ocGF0aCwgY3gsIGN5LCBXLCBIKTsKLSAgICAgICAgZ1BhdGhJLnF1YWRUbyhwYXRoLCBjeCwgY3ksIDAsIEgpOwotICAgICAgICBnUGF0aEkucXVhZFRvKHBhdGgsIGN4LCBjeSwgMCwgMCk7Ci0KLSAgICAgICAgZ1BhaW50SS5zZXRDb2xvcihtX3BhaW50LCAweEZGMDAwMEZGKTsKLSAgICAgICAgZ0NhbnZhc0kuZHJhd1BhdGgoY2FudmFzLCBwYXRoLCBtX3BhaW50KTsKLQotICAgICAgICBBTlBSZWN0RiBib3VuZHM7Ci0gICAgICAgIG1lbXNldCgmYm91bmRzLCAwLCBzaXplb2YoYm91bmRzKSk7Ci0gICAgICAgIGdQYXRoSS5nZXRCb3VuZHMocGF0aCwgJmJvdW5kcyk7Ci0jaWYgMAotICAgICAgICBnTG9nSS5sb2coaW5zdGFuY2UsIGtEZWJ1Z19BTlBMb2dUeXBlLCAiZHJhd3BhdGg6IGNlbnRlciAlZyAlZyBib3VuZHMgWyVnICVnICVnICVnXVxuIiwKLSAgICAgICAgICAgICAgICAgIGN4LCBjeSwKLSAgICAgICAgICAgICAgICAgIGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20pOwotI2VuZGlmCi0gICAgICAgIGdQYXRoSS5kZWxldGVQYXRoKHBhdGgpOwotICAgIH0KLSAgICAKLSAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkZGRjAwMDApOwotICAgIGdDYW52YXNJLmRyYXdPdmFsKGNhbnZhcywgJm1fb3ZhbCwgbV9wYWludCk7Ci0gICAgCi0gICAgYm91bmNlKCZtX3gsICZtX2R4LCBvYmotPndpbmRvdy0+d2lkdGggLSBPVyk7Ci0gICAgYm91bmNlKCZtX3ksICZtX2R5LCBvYmotPndpbmRvdy0+aGVpZ2h0IC0gT0gpOwotICAgIAotICAgIGlmIChvYmotPm1VbmljaGFyKSB7Ci0gICAgICAgIEFOUEZvbnRNZXRyaWNzIGZtOwotICAgICAgICBnUGFpbnRJLmdldEZvbnRNZXRyaWNzKG1fcGFpbnQsICZmbSk7Ci0gICAgICAgIAotICAgICAgICBnUGFpbnRJLnNldENvbG9yKG1fcGFpbnQsIDB4RkYwMDAwRkYpOwotICAgICAgICBjaGFyIGMgPSBzdGF0aWNfY2FzdDxjaGFyPihvYmotPm1VbmljaGFyKTsKLSAgICAgICAgZ0NhbnZhc0kuZHJhd1RleHQoY2FudmFzLCAmYywgMSwgMTAsIC1mbS5mVG9wLCBtX3BhaW50KTsKLSAgICB9Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotdm9pZCBkcmF3UGx1Z2luKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKSB7Ci0gICAgQU5QQ2FudmFzKiBjYW52YXMgPSBnQ2FudmFzSS5uZXdDYW52YXMoJmJpdG1hcCk7Ci0gICAgCi0gICAgQU5QUmVjdEYgY2xpcFI7Ci0gICAgY2xpcFIubGVmdCA9IGNsaXAubGVmdDsKLSAgICBjbGlwUi50b3AgPSBjbGlwLnRvcDsKLSAgICBjbGlwUi5yaWdodCA9IGNsaXAucmlnaHQ7Ci0gICAgY2xpcFIuYm90dG9tID0gY2xpcC5ib3R0b207Ci0gICAgZ0NhbnZhc0kuY2xpcFJlY3QoY2FudmFzLCAmY2xpcFIpOwotICAgIAotICAgIGRyYXdQbHVnaW4oaW5zdGFuY2UsIGNhbnZhcyk7Ci0gICAgCi0gICAgZ0NhbnZhc0kuZGVsZXRlQ2FudmFzKGNhbnZhcyk7Ci19Ci0KLXZvaWQgZHJhd1BsdWdpbihOUFAgaW5zdGFuY2UsIEFOUENhbnZhcyogY2FudmFzKSB7Ci0gICAgUGx1Z2luT2JqZWN0ICpvYmogPSAoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhOyAgICAKLSAgICBpZiAob2JqLT5hbmltID09IE5VTEwpIHsKLSAgICAgICAgb2JqLT5hbmltID0gbmV3IEJhbGxBbmltYXRpb24oaW5zdGFuY2UpOwotICAgIH0KLSAgICBvYmotPmFuaW0tPmRyYXcoY2FudmFzKTsKLX0KLQpkaWZmIC0tZ2l0IGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvcGx1Z2luR3JhcGhpY3MuaCBiL1dlYktpdC9hbmRyb2lkL3BsdWdpbnMvc2FtcGxlL3BsdWdpbkdyYXBoaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2ViMjYuLjAwMDAwMDAKLS0tIGEvV2ViS2l0L2FuZHJvaWQvcGx1Z2lucy9zYW1wbGUvcGx1Z2luR3JhcGhpY3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotIAotI2luY2x1ZGUgIm1haW4uaCIgLy8gZm9yIE5QQVBJIGRlZmluaXRpb25zCi0jaW5jbHVkZSAiUGx1Z2luT2JqZWN0LmgiCi0KLSNpZm5kZWYgcGx1Z2luR3JhcGhpY3NfX0RFRklORUQKLSNkZWZpbmUgcGx1Z2luR3JhcGhpY3NfX0RFRklORUQKLQotc3RydWN0IEFOUEJpdG1hcDsKLXN0cnVjdCBBTlBDYW52YXM7Ci1zdHJ1Y3QgQU5QUmVjdEk7Ci0KLXZvaWQgZHJhd1BsdWdpbihOUFAgaW5zdGFuY2UsIGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7Ci12b2lkIGRyYXdQbHVnaW4oTlBQIGluc3RhbmNlLCBBTlBDYW52YXMqKTsKLXVpbnQzMl90IGdldE1TZWNzKCk7Ci0KLSNlbmRpZiAvLyBwbHVnaW5HcmFwaGljc19fREVGSU5FRAo=