ZGlmZiAtLWdpdCBhL2d5cC9ncHUuZ3lwaSBiL2d5cC9ncHUuZ3lwaQppbmRleCA5YmZlNTcyLi43ZDNjMGYyIDEwMDY0NAotLS0gYS9neXAvZ3B1Lmd5cGkKKysrIGIvZ3lwL2dwdS5neXBpCkBAIC0xMCw2ICsxMCw3IEBACiAgICAgJ2dyX3NvdXJjZXMnOiBbCiAgICAgICAnPChza2lhX2luY2x1ZGVfcGF0aCkvZ3B1L0dyQUFSZWN0UmVuZGVyZXIuaCcsCiAgICAgICAnPChza2lhX2luY2x1ZGVfcGF0aCkvZ3B1L0dyQmFja2VuZEVmZmVjdEZhY3RvcnkuaCcsCisgICAgICAnPChza2lhX2luY2x1ZGVfcGF0aCkvZ3B1L0dyQ2FjaGVJRC5oJywKICAgICAgICc8KHNraWFfaW5jbHVkZV9wYXRoKS9ncHUvR3JDbGlwRGF0YS5oJywKICAgICAgICc8KHNraWFfaW5jbHVkZV9wYXRoKS9ncHUvR3JDb2xvci5oJywKICAgICAgICc8KHNraWFfaW5jbHVkZV9wYXRoKS9ncHUvR3JDb25maWcuaCcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dwdS9HckNhY2hlSUQuaCBiL2luY2x1ZGUvZ3B1L0dyQ2FjaGVJRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTNkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2dwdS9HckNhY2hlSUQuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4KKyAqCisgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorICovCisKKyNpZm5kZWYgR3JDYWNoZUlEX0RFRklORUQKKyNkZWZpbmUgR3JDYWNoZUlEX0RFRklORUQKKworI2luY2x1ZGUgIkdyVHlwZXMuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBHUl9ERUNMQVJFX1JFU09VUkNFX0NBQ0hFX1RZUEUoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGludDhfdCBHZXRSZXNvdXJjZVR5cGUoKTsKKworI2RlZmluZSBHUl9ERUZJTkVfUkVTT1VSQ0VfQ0FDSEVfVFlQRShDbGFzc05hbWUpICAgICAgICAgICAgICAgICBcCisgICAgaW50OF90IENsYXNzTmFtZTo6R2V0UmVzb3VyY2VUeXBlKCkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljIGludDhfdCBrUmVzb3VyY2VUeXBlSUQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoMCA9PSBrUmVzb3VyY2VUeXBlSUQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBrUmVzb3VyY2VUeXBlSUQgPSBHckNhY2hlSUQ6OkdldE5leHRSZXNvdXJjZVR5cGUoKTsgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4ga1Jlc291cmNlVHlwZUlEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgR1JfREVDTEFSRV9SRVNPVVJDRV9DQUNIRV9ET01BSU4oQWNjZXNzb3JOYW1lKSAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbnQ4X3QgQWNjZXNzb3JOYW1lKCk7CisKKyNkZWZpbmUgR1JfREVGSU5FX1JFU09VUkNFX0NBQ0hFX0RPTUFJTihDbGFzc05hbWUsIEFjY2Vzc29yTmFtZSkgXAorICAgIGludDhfdCBDbGFzc05hbWU6OkFjY2Vzc29yTmFtZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBpbnQ4X3Qga0RvbWFpbklEID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKDAgPT0ga0RvbWFpbklEKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAga0RvbWFpbklEID0gR3JDYWNoZUlEOjpHZXROZXh0RG9tYWluKCk7ICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIGtEb21haW5JRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLyoqCisgKiBUaGUgY2FjaGUgSUQgYWRkcyBzdHJ1Y3R1cmUgdG8gdGhlIElEcyB1c2VkIGZvciBjYWNoaW5nIEdQVSByZXNvdXJjZXMuIEl0CisgKiBpcyBicm9rZW4gaW50byB0aHJlZSBwb3J0aW9uczoKKyAqICAgICAgdGhlIHB1YmxpYyBwb3J0aW9uIC0gd2hpY2ggaXMgZmlsbGVkIGluIGJ5IFNraWEgY2xpZW50cworICogICAgICB0aGUgcHJpdmF0ZSBwb3J0aW9uIC0gd2hpY2ggaXMgdXNlZCBieSB0aGUgY2FjaGUgKGRvbWFpbiAmIHR5cGUpCisgKiAgICAgIHRoZSByZXNvdXJjZS1zcGVjaWZpYyBwb3J0aW9uIC0gd2hpY2ggaXMgZmlsbGVkIGluIGJ5IGVhY2ggR3JSZXNvdXJjZS0KKyAqICAgICAgICAgICAgICBkZXJpdmVkIGNsYXNzLgorICoKKyAqIEZvciB0aGUgcHVibGljIHBvcnRpb24gZWFjaCBjbGllbnQgb2YgdGhlIGNhY2hlIG1ha2VzIHVwIGl0cyBvd24KKyAqIHVuaXF1ZS1wZXItcmVzb3VyY2UgaWRlbnRpZmllciAoZS5nLiwgYml0bWFwIGdlbklEKS4gQSBwdWJsaWMgSUQgb2YKKyAqICdrU2NyYXRjaF9DYWNoZUlEJyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYSAic2NyYXRjaCIgcmVzb3VyY2UuCisgKiBXaGVuIHVzZWQgdG8gYWNxdWlyZSBhIHJlc291cmNlIGl0IGluZGljYXRlcyB0aGUgY2FjaGUgdXNlciBpcworICogbG9va2luZyBmb3IgYSByZXNvdXJjZSB0aGF0IG1hdGNoZXMgYSByZXNvdXJjZS1zdWJjbGFzcy1zcGVjaWZpYyBzZXQgb2YKKyAqIJNkaW1lbnNpb25zlCBzdWNoIGFzIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciBzaXplLCBvciBwaXhlbCBjb25maWcsIGJ1dCBub3QKKyAqIGZvciBwYXJ0aWN1bGFyIHJlc291cmNlIGNvbnRlbnRzIChlLmcuLCB0ZXhlbCBvciB2ZXJ0ZXggdmFsdWVzKS4gVGhlIHB1YmxpYworICogSURzIGFyZSB1bmlxdWUgd2l0aGluIGEgcHJpdmF0ZSBJRCB2YWx1ZSBidXQgbm90IG5lY2Vzc2FyaWx5IGFjcm9zcworICogcHJpdmF0ZSBJRHMuCisgKgorICogVGhlIGRvbWFpbiBwb3J0aW9uIGlkZW50aWZpZXMgdGhlIGNhY2hlIGNsaWVudCB3aGlsZSB0aGUgdHlwZSBmaWVsZAorICogaW5kaWNhdGVzIHRoZSByZXNvdXJjZSB0eXBlLiBXaGVuIHRoZSBwdWJsaWMgcG9ydGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAqIHJlc291cmNlIGlzIGEgc2NyYXRjaCByZXNvdXJjZSwgdGhlIGRvbWFpbiBmaWVsZCBzaG91bGQgYmUga1VucmVzdHJpY3RlZAorICogc28gdGhhdCBzY3JhdGNoIHJlc291cmNlcyBjYW4gYmUgcmVjeWNsZWQgYWNyb3NzIGRvbWFpbnMuCisgKi8KK2NsYXNzIEdyQ2FjaGVJRCB7CitwdWJsaWM6CisgICAgdWludDY0X3QgICAgIGZQdWJsaWNJRDsKKworICAgIHVpbnQzMl90ICAgICBmUmVzb3VyY2VTcGVjaWZpYzMyOworCisgICAgdWludDhfdCAgICAgIGZEb21haW47Citwcml2YXRlOgorICAgIHVpbnQ4X3QgICAgICBmUmVzb3VyY2VUeXBlOworCitwdWJsaWM6CisgICAgdWludDE2X3QgICAgIGZSZXNvdXJjZVNwZWNpZmljMTY7CisKKyAgICBHckNhY2hlSUQodWludDhfdCByZXNvdXJjZVR5cGUpCisgICAgICAgIDogZlB1YmxpY0lEKGtEZWZhdWx0UHVibGljQ2FjaGVJRCkKKyAgICAgICAgLCBmRG9tYWluKEdyQ2FjaGVEYXRhOjprU2NyYXRjaF9SZXNvdXJjZURvbWFpbikKKyAgICAgICAgLCBmUmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSkgeworICAgIH0KKworICAgIHZvaWQgdG9SYXcodWludDMyX3Qgdls0XSk7CisKKyAgICB1aW50OF90IGdldFJlc291cmNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGZSZXNvdXJjZVR5cGU7IH0KKworICAgIC8qCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgcHVibGljIHBvcnRpb24gb2YgR3JDYWNoZUlECisgICAgICovCisgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEZWZhdWx0UHVibGljQ2FjaGVJRCA9IDA7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrSW52YWxpZF9SZXNvdXJjZVR5cGUgPSAwOworCisgICAgc3RhdGljIHVpbnQ4X3QgICAgR2V0TmV4dERvbWFpbigpOworICAgIHN0YXRpYyB1aW50OF90ICAgIEdldE5leHRSZXNvdXJjZVR5cGUoKTsKKworCit9OworCisjZW5kaWYgLy8gR3JDYWNoZUlEX0RFRklORUQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3B1L0dyQ29udGV4dC5oIGIvaW5jbHVkZS9ncHUvR3JDb250ZXh0LmgKaW5kZXggYjFlOWRkNi4uMDZkMjY4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ncHUvR3JDb250ZXh0LmgKKysrIGIvaW5jbHVkZS9ncHUvR3JDb250ZXh0LmgKQEAgLTExOCwyMSArMTE4LDIyIEBACiAgICAgLy8gVGV4dHVyZXMKIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBlbnRyeSwgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBrZXkgYW5kIHRleHR1cmUgYW5kIHJldHVybiBpdC4KKyAgICAgKiAgQ3JlYXRlIGEgbmV3IGVudHJ5LCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGtleSBhbmQgdGV4dHVyZSwgYW5kIHJldHVybgorICAgICAqICBhICJsb2NrZWQiIHRleHR1cmUuIE11c3QgY2FsbCBiZSBiYWxhbmNlZCB3aXRoIGFuIHVubG9ja1RleHR1cmUoKSBjYWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhcmFtcyAgICBUaGUgdGV4dHVyZSBwYXJhbXMgdXNlZCB0byBkcmF3IGEgdGV4dHVyZSBtYXkgaGVscCBkZXRlcm1pbmUKICAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBjYWNoZSBlbnRyeSB1c2VkLiAoZS5nLiBkaWZmZXJlbnQgdmVyc2lvbnMgbWF5IGV4aXN0CiAgICAgICogICAgICAgICAgICAgICAgICBmb3IgZGlmZmVyZW50IHdyYXAgbW9kZXMgb24gR1BVcyB3aXRoIGxpbWl0ZWQgTlBPVAogICAgICAqICAgICAgICAgICAgICAgICAgdGV4dHVyZSBzdXBwb3J0KS4gTlVMTCBpbXBsaWVzIGNsYW1wIHdyYXAgbW9kZXMuCiAgICAgICogQHBhcmFtIGRlc2MgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgdGV4dHVyZSBwcm9wZXJ0aWVzLgotICAgICAqIEBwYXJhbSBjYWNoZUlEIENhY2hlLXNwZWNpZmljIHByb3BlcnRpZXMgKGUuZy4sIHRleHR1cmUgZ2VuIElEKQorICAgICAqIEBwYXJhbSBjYWNoZURhdGEgQ2FjaGUtc3BlY2lmaWMgcHJvcGVydGllcyAoZS5nLiwgdGV4dHVyZSBnZW4gSUQpCiAgICAgICogQHBhcmFtIHNyY0RhdGEgICBQb2ludGVyIHRvIHRoZSBwaXhlbCB2YWx1ZXMuCiAgICAgICogQHBhcmFtIHJvd0J5dGVzICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gcm93cyBvZiB0aGUgdGV4dHVyZS4gWmVybwogICAgICAqICAgICAgICAgICAgICAgICAgaW1wbGllcyB0aWdodGx5IHBhY2tlZCByb3dzLgogICAgICAqLwogICAgIEdyVGV4dHVyZSogY3JlYXRlVGV4dHVyZShjb25zdCBHclRleHR1cmVQYXJhbXMqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JDYWNoZUlEJiBjYWNoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlRGF0YSYgY2FjaGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzcmNEYXRhLCBzaXplX3Qgcm93Qnl0ZXMpOwogCiAgICAgLyoqCkBAIC0xNDAsMTQgKzE0MSwxNCBAQAogICAgICAqICByZXR1cm4gaXQuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBOVUxMIGlmIG5vdCBmb3VuZC4KICAgICAgKgogICAgICAqICBAcGFyYW0gZGVzYyAgICAgRGVzY3JpcHRpb24gb2YgdGhlIHRleHR1cmUgcHJvcGVydGllcy4KLSAgICAgKiAgQHBhcmFtIGNhY2hlSUQgQ2FjaGUtc3BlY2lmaWMgcHJvcGVydGllcyAoZS5nLiwgdGV4dHVyZSBnZW4gSUQpCisgICAgICogIEBwYXJhbSBjYWNoZURhdGEgQ2FjaGUtc3BlY2lmaWMgcHJvcGVydGllcyAoZS5nLiwgdGV4dHVyZSBnZW4gSUQpCiAgICAgICogIEBwYXJhbSBwYXJhbXMgICBUaGUgdGV4dHVyZSBwYXJhbXMgdXNlZCB0byBkcmF3IGEgdGV4dHVyZSBtYXkgaGVscCBkZXRlcm1pbmUKICAgICAgKiAgICAgICAgICAgICAgICAgIHRoZSBjYWNoZSBlbnRyeSB1c2VkLiAoZS5nLiBkaWZmZXJlbnQgdmVyc2lvbnMgbWF5IGV4aXN0CiAgICAgICogICAgICAgICAgICAgICAgICBmb3IgZGlmZmVyZW50IHdyYXAgbW9kZXMgb24gR1BVcyB3aXRoIGxpbWl0ZWQgTlBPVAogICAgICAqICAgICAgICAgICAgICAgICAgdGV4dHVyZSBzdXBwb3J0KS4gTlVMTCBpbXBsaWVzIGNsYW1wIHdyYXAgbW9kZXMuCiAgICAgICovCiAgICAgR3JUZXh0dXJlKiBmaW5kVGV4dHVyZShjb25zdCBHclRleHR1cmVEZXNjJiBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JDYWNoZUlEJiBjYWNoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JDYWNoZURhdGEmIGNhY2hlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZVBhcmFtcyogcGFyYW1zKTsKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSB0ZXh0dXJlIGlzIGluIHRoZSBjYWNoZS4gSWYgdGhlIHRleHR1cmUgaXMgZm91bmQgaXQKQEAgLTE1NSw3ICsxNTYsNyBAQAogICAgICAqIHRoZSB0ZXh0dXJlIGZvciBkZWxldGlvbi4KICAgICAgKi8KICAgICBib29sIGlzVGV4dHVyZUluQ2FjaGUoY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JDYWNoZUlEJiBjYWNoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlRGF0YSYgY2FjaGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHclRleHR1cmVQYXJhbXMqIHBhcmFtcykgY29uc3Q7CiAKICAgICAvKioKQEAgLTE5MCwxMCArMTkxLDExIEBACiAgICAgICogc3VjaCBhbiBBUEkgd2lsbCBjcmVhdGUgZ2FwcyBpbiB0aGUgdGlsaW5nIHBhdHRlcm4uIFRoaXMgaW5jbHVkZXMgY2xhbXAKICAgICAgKiBtb2RlLiAoVGhpcyBtYXkgYmUgYWRkcmVzc2VkIGluIGEgZnV0dXJlIHVwZGF0ZS4pCiAgICAgICovCi0gICAgR3JUZXh0dXJlKiBsb2NrU2NyYXRjaFRleHR1cmUoY29uc3QgR3JUZXh0dXJlRGVzYyYsIFNjcmF0Y2hUZXhNYXRjaCBtYXRjaCk7CisgICAgR3JUZXh0dXJlKiBsb2NrU2NyYXRjaFRleHR1cmUoY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JhdGNoVGV4TWF0Y2ggbWF0Y2gpOwogCiAgICAgLyoqCi0gICAgICogIFdoZW4gZG9uZSB3aXRoIGFuIGVudHJ5LCBjYWxsIHVubG9ja1NjcmF0Y2hUZXh0dXJlKGVudHJ5KSBvbiBpdCwgd2hpY2ggcmV0dXJucworICAgICAqICBXaGVuIGRvbmUgd2l0aCBhbiBlbnRyeSwgY2FsbCB1bmxvY2tUZXh0dXJlKGVudHJ5KSBvbiBpdCwgd2hpY2ggcmV0dXJucwogICAgICAqICBpdCB0byB0aGUgY2FjaGUsIHdoZXJlIGl0IG1heSBiZSBwdXJnZWQuCiAgICAgICovCiAgICAgdm9pZCB1bmxvY2tTY3JhdGNoVGV4dHVyZShHclRleHR1cmUqIHRleHR1cmUpOwpAQCAtOTExLDcgKzkxMyw3IEBACiAgICAgdm9pZCBpbnRlcm5hbERyYXdQYXRoKGNvbnN0IEdyUGFpbnQmIHBhaW50LCBjb25zdCBTa1BhdGgmIHBhdGgsIGNvbnN0IFNrU3Ryb2tlUmVjJiBzdHJva2UpOwogCiAgICAgR3JUZXh0dXJlKiBjcmVhdGVSZXNpemVkVGV4dHVyZShjb25zdCBHclRleHR1cmVEZXNjJiBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JDYWNoZUlEJiBjYWNoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JDYWNoZURhdGEmIGNhY2hlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHNyY0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm93Qnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzRmlsdGVyaW5nKTsKQEAgLTk0OSw3ICs5NTEsOCBAQAogCiAgICAgR3JBdXRvU2NyYXRjaFRleHR1cmUoR3JDb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZURlc2MmIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR3JDb250ZXh0OjpTY3JhdGNoVGV4TWF0Y2ggbWF0Y2ggPSBHckNvbnRleHQ6OmtBcHByb3hfU2NyYXRjaFRleE1hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgIEdyQ29udGV4dDo6U2NyYXRjaFRleE1hdGNoIG1hdGNoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHckNvbnRleHQ6OmtBcHByb3hfU2NyYXRjaFRleE1hdGNoKQogICAgICAgOiBmQ29udGV4dChOVUxMKQogICAgICAgLCBmVGV4dHVyZShOVUxMKSB7CiAgICAgICB0aGlzLT5zZXQoY29udGV4dCwgZGVzYywgbWF0Y2gpOwpAQCAtOTkzLDcgKzk5Niw4IEBACiAKICAgICBHclRleHR1cmUqIHNldChHckNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYywKLSAgICAgICAgICAgICAgICAgICBHckNvbnRleHQ6OlNjcmF0Y2hUZXhNYXRjaCBtYXRjaCA9IEdyQ29udGV4dDo6a0FwcHJveF9TY3JhdGNoVGV4TWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICBHckNvbnRleHQ6OlNjcmF0Y2hUZXhNYXRjaCBtYXRjaCA9CisgICAgICAgICAgICAgICAgICAgICAgICBHckNvbnRleHQ6OmtBcHByb3hfU2NyYXRjaFRleE1hdGNoKSB7CiAgICAgICAgIHRoaXMtPnJlc2V0KCk7CiAKICAgICAgICAgZkNvbnRleHQgPSBjb250ZXh0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ncHUvR3JUZXh0dXJlLmggYi9pbmNsdWRlL2dwdS9HclRleHR1cmUuaAppbmRleCAzNjUxNWI0Li5kNDFiZTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2dwdS9HclRleHR1cmUuaAorKysgYi9pbmNsdWRlL2dwdS9HclRleHR1cmUuaApAQCAtMTAsNiArMTAsNyBAQAogI2RlZmluZSBHclRleHR1cmVfREVGSU5FRAogCiAjaW5jbHVkZSAiR3JTdXJmYWNlLmgiCisjaW5jbHVkZSAiR3JDYWNoZUlELmgiCiAKIGNsYXNzIEdyUmVuZGVyVGFyZ2V0OwogY2xhc3MgR3JSZXNvdXJjZUtleTsKQEAgLTE5LDYgKzIwLDggQEAKIAogcHVibGljOgogICAgIFNLX0RFQ0xBUkVfSU5TVF9DT1VOVChHclRleHR1cmUpCisgICAgR1JfREVDTEFSRV9SRVNPVVJDRV9DQUNIRV9UWVBFKCkKKwogICAgIC8vIGZyb20gR3JSZXNvdXJjZQogICAgIC8qKgogICAgICAqIEluZm9ybWF0aW9uYWwgdGV4dHVyZSBmbGFncwpAQCAtMTI3LDEyICsxMzAsMTUgQEAKICNlbHNlCiAgICAgdm9pZCB2YWxpZGF0ZSgpIGNvbnN0IHt9CiAjZW5kaWYKKwogICAgIHN0YXRpYyBHclJlc291cmNlS2V5IENvbXB1dGVLZXkoY29uc3QgR3JHcHUqIGdwdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZVBhcmFtcyogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlUGFyYW1zKiBzYW1wbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyQ2FjaGVJRCYgY2FjaGVJRCk7Ci0gICAgc3RhdGljIEdyUmVzb3VyY2VLZXkgQ29tcHV0ZVNjcmF0Y2hLZXkoY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlRGF0YSYgY2FjaGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzY3JhdGNoKTsKKwogICAgIHN0YXRpYyBib29sIE5lZWRzUmVzaXppbmcoY29uc3QgR3JSZXNvdXJjZUtleSYga2V5KTsKKyAgICBzdGF0aWMgYm9vbCBJc1NjcmF0Y2hUZXh0dXJlKGNvbnN0IEdyUmVzb3VyY2VLZXkmIGtleSk7CiAgICAgc3RhdGljIGJvb2wgTmVlZHNGaWx0ZXJpbmcoY29uc3QgR3JSZXNvdXJjZUtleSYga2V5KTsKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ncHUvR3JUeXBlcy5oIGIvaW5jbHVkZS9ncHUvR3JUeXBlcy5oCmluZGV4IGJmNTk5YTAuLjIxYWU2ZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3B1L0dyVHlwZXMuaAorKysgYi9pbmNsdWRlL2dwdS9HclR5cGVzLmgKQEAgLTQ1OSw1NSArNDU5LDQ0IEBACiB9OwogCiAvKioKLSAqIEdyQ2FjaGVJRCBpcyB1c2VkIGNyZWF0ZSBhbmQgZmluZCBjYWNoZWQgR3JSZXNvdXJjZXMgKGUuZy4gR3JUZXh0dXJlcykuIFRoZSBJRCBoYXMgdHdvIHBhcnRzOgotICogdGhlIGRvbWFpbiBhbmQgdGhlIGtleS4gRG9tYWlucyBzaW1wbHkgYWxsb3cgbXVsdGlwbGUgY2xpZW50cyB0byB1c2UgMC1iYXNlZCBpbmRpY2VzIGFzIHRoZWlyCi0gKiBjYWNoZSBrZXkgd2l0aG91dCBjb2xsaWRpbmcuIFRoZSBrZXkgdW5pcXVlbHkgaWRlbnRpZmllcyBhIEdyUmVzb3VyY2Ugd2l0aGluIHRoZSBkb21haW4uCi0gKiBVc2VycyBvZiB0aGUgY2FjaGUgbXVzdCBvYnRhaW4gYSBkb21haW4gdmlhIEdlbmVyYXRlRG9tYWluKCkuCisgKiBHckNhY2hlRGF0YSBob2xkcyB1c2VyLXByb3ZpZGVkIGNhY2hlLXNwZWNpZmljIGRhdGEuIEl0IGlzIHVzZWQgaW4KKyAqIGNvbWJpbmF0aW9uIHdpdGggdGhlIEdyVGV4dHVyZURlc2MgdG8gY29uc3RydWN0IGEgY2FjaGUga2V5IGZvciB0ZXh0dXJlCisgKiByZXNvdXJjZXMuCiAgKi8KLXN0cnVjdCBHckNhY2hlSUQgewotcHVibGljOgotICAgIHR5cGVkZWYgdWludDhfdCAgRG9tYWluOwotCi0gICAgc3RydWN0IEtleSB7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgIGZEYXRhOFsxNl07Ci0gICAgICAgICAgICB1aW50MzJfdCBmRGF0YTMyWzRdOwotICAgICAgICAgICAgdWludDY0X3QgZkRhdGE2NFsyXTsKLSAgICAgICAgfTsKLSAgICB9Oworc3RydWN0IEdyQ2FjaGVEYXRhIHsKKyAgICAvKgorICAgICAqIFNjcmF0Y2ggdGV4dHVyZXMgc2hvdWxkIGFsbCBoYXZlIHRoaXMgdmFsdWUgYXMgdGhlaXIgZkNsaWVudENhY2hlSUQKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga1NjcmF0Y2hfQ2FjaGVJRCA9IDB4QkJCQkJCQkI7CiAKICAgICAvKioKLSAgICAgKiBBIGRlZmF1bHQgY2FjaGUgSUQgaXMgaW52YWxpZDsgYSBzZXQgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgb2JqZWN0IGlzIHVzZWQuCi0gICAgICovCi0gICAgR3JDYWNoZUlEKCkgeyBmRG9tYWluID0ga0ludmFsaWRfRG9tYWluOyB9CisgICAgICAqIFJlc291cmNlcyBpbiB0aGUgInNjcmF0Y2giIGRvbWFpbiBjYW4gYmUgdXNlZCBieSBhbnkgZG9tYWluLiBBbGwKKyAgICAgICogc2NyYXRjaCB0ZXh0dXJlcyB3aWxsIGhhdmUgdGhpcyBhcyB0aGVpciBkb21haW4uCisgICAgICAqLworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTY3JhdGNoX1Jlc291cmNlRG9tYWluID0gMDsKKworCisgICAgLy8gTm8gZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCBzaW5jZSwgaWYgeW91IGFyZSBjcmVhdGluZyBvbmUKKyAgICAvLyBvZiB0aGVzZSwgeW91IHNob3VsZCBkZWZpbml0ZWx5IGhhdmUgYSBrZXkgKG9yIGJlIHVzaW5nIHRoZSBzY3JhdGNoCisgICAgLy8ga2V5KS4KKyAgICBHckNhY2hlRGF0YSh1aW50NjRfdCBrZXkpCisgICAgOiBmQ2xpZW50Q2FjaGVJRChrZXkpCisgICAgLCBmUmVzb3VyY2VEb21haW4oa1NjcmF0Y2hfUmVzb3VyY2VEb21haW4pIHsKKyAgICB9CiAKICAgICAvKioKLSAgICAgKiBJbml0aWFsaXplIHRoZSBjYWNoZSBJRCB0byBhIGRvbWFpbiBhbmQga2V5LgorICAgICAqIEEgdXNlci1wcm92aWRlZCB0ZXh0dXJlIElELiBJdCBzaG91bGQgYmUgdW5pcXVlIHRvIHRoZSB0ZXh0dXJlIGRhdGEgYW5kCisgICAgICogZG9lcyBub3QgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgd2lkdGggb3IgaGVpZ2h0LiBUd28gdGV4dHVyZXMKKyAgICAgKiB3aXRoIHRoZSBzYW1lIElEIGJ1dCBkaWZmZXJlbnQgZGltZW5zaW9ucyB3aWxsIG5vdCBjb2xsaWRlLiBUaGlzIGZpZWxkCisgICAgICogaXMgb25seSByZWxldmFudCBmb3IgdGV4dHVyZXMgdGhhdCB3aWxsIGJlIGNhY2hlZC4KICAgICAgKi8KLSAgICBHckNhY2hlSUQoRG9tYWluIGRvbWFpbiwgY29uc3QgS2V5JiBrZXkpIHsKLSAgICAgICAgR3JBc3NlcnQoa0ludmFsaWRfRG9tYWluICE9IGRvbWFpbik7IAotICAgICAgICB0aGlzLT5yZXNldChkb21haW4sIGtleSk7Ci0gICAgfQorICAgIHVpbnQ2NF90ICAgICAgICAgICAgICAgZkNsaWVudENhY2hlSUQ7CiAKLSAgICB2b2lkIHJlc2V0KERvbWFpbiBkb21haW4sIGNvbnN0IEtleSYga2V5KSB7Ci0gICAgICAgIGZEb21haW4gPSBkb21haW47Ci0gICAgICAgIG1lbWNweSgmZktleSwgJmtleSwgc2l6ZW9mKEtleSkpOwotICAgIH0KLQotICAgIC8qKiBIYXMgdGhpcyBiZWVuIGluaXRpYWxpemVkIHRvIGEgdmFsaWQgZG9tYWluICovCi0gICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4ga0ludmFsaWRfRG9tYWluICE9IGZEb21haW47IH0KLQotICAgIGNvbnN0IEtleSYgZ2V0S2V5KCkgY29uc3QgeyBHckFzc2VydCh0aGlzLT5pc1ZhbGlkKCkpOyByZXR1cm4gZktleTsgfQotICAgIERvbWFpbiBnZXREb21haW4oKSBjb25zdCB7IEdyQXNzZXJ0KHRoaXMtPmlzVmFsaWQoKSk7IHJldHVybiBmRG9tYWluOyB9Ci0gICAgCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgdW5pcXVlIElEIGRvbWFpbi4gKi8KLSAgICBzdGF0aWMgRG9tYWluIEdlbmVyYXRlRG9tYWluKCk7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ICAgICAgICAgICAgIGZLZXk7Ci0gICAgRG9tYWluICAgICAgICAgIGZEb21haW47Ci0KLSAgICBzdGF0aWMgY29uc3QgRG9tYWluIGtJbnZhbGlkX0RvbWFpbiA9IDA7CisgICAgLyoqCisgICAgICogQWxsb3dzIGNhY2hlIGNsaWVudHMgdG8gY2x1c3RlciB0aGVpciB0ZXh0dXJlcyBpbnNpZGUgZG9tYWlucyAoZS5nLiwKKyAgICAgKiBhbHBoYSBjbGlwIG1hc2tzKS4gT25seSByZWxldmFudCBmb3IgY2FjaGVkIHRleHR1cmVzLgorICAgICAqLworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgZlJlc291cmNlRG9tYWluOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dwdS9Ta0dwdURldmljZS5oIGIvaW5jbHVkZS9ncHUvU2tHcHVEZXZpY2UuaAppbmRleCA0NWIwNjkzLi4xZTc4YjRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2dwdS9Ta0dwdURldmljZS5oCisrKyBiL2luY2x1ZGUvZ3B1L1NrR3B1RGV2aWNlLmgKQEAgLTExMCw2ICsxMTAsOSBAQAogICAgIGNsYXNzIFNrQXV0b0NhY2hlZFRleHR1cmU7IC8vIHVzZWQgaW50ZXJuYWxseQogCiBwcm90ZWN0ZWQ6CisgICAgYm9vbCBpc0JpdG1hcEluVGV4dHVyZUNhY2hlKGNvbnN0IFNrQml0bWFwJiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZVBhcmFtcyYgcGFyYW1zKSBjb25zdDsKKwogICAgIC8vIG92ZXJyaWRlcyBmcm9tIFNrRGV2aWNlCiAgICAgdmlydHVhbCBib29sIG9uUmVhZFBpeGVscyhjb25zdCBTa0JpdG1hcCYgYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ncHUvU2tHci5oIGIvaW5jbHVkZS9ncHUvU2tHci5oCmluZGV4IGU3YzI5NjQuLjg4Y2EwOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3B1L1NrR3IuaAorKysgYi9pbmNsdWRlL2dwdS9Ta0dyLmgKQEAgLTc1LDkgKzc1LDkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotYm9vbCBHcklzQml0bWFwSW5DYWNoZShjb25zdCBHckNvbnRleHQqLCBjb25zdCBTa0JpdG1hcCYsIGNvbnN0IEdyVGV4dHVyZVBhcmFtcyopOwotCi1HclRleHR1cmUqIEdyTG9ja0NhY2hlZEJpdG1hcFRleHR1cmUoR3JDb250ZXh0KiwgY29uc3QgU2tCaXRtYXAmLCBjb25zdCBHclRleHR1cmVQYXJhbXMqKTsKK0dyVGV4dHVyZSogR3JMb2NrQ2FjaGVkQml0bWFwVGV4dHVyZShHckNvbnRleHQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrQml0bWFwJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHclRleHR1cmVQYXJhbXMqKTsKIAogdm9pZCBHclVubG9ja0NhY2hlZEJpdG1hcFRleHR1cmUoR3JUZXh0dXJlKik7CiAKZGlmZiAtLWdpdCBhL3NyYy9ncHUvR3JCaW5IYXNoS2V5LmggYi9zcmMvZ3B1L0dyQmluSGFzaEtleS5oCmluZGV4IDhmYTUzZWYuLmQyMTk0ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9ncHUvR3JCaW5IYXNoS2V5LmgKKysrIGIvc3JjL2dwdS9HckJpbkhhc2hLZXkuaApAQCAtMTYsMjcgKzE2LDI1IEBACiAgKiAgSGFzaCBmdW5jdGlvbiBjbGFzcyB0aGF0IGNhbiB0YWtlIGEgZGF0YSBjaHVuayBvZiBhbnkgcHJlZGV0ZXJtaW5lZCBsZW5ndGguIFRoZSBoYXNoIGZ1bmN0aW9uCiAgKiAgdXNlZCBpcyB0aGUgT25lLWF0LWEtVGltZSBIYXNoIChodHRwOi8vYnVydGxlYnVydGxlLm5ldC9ib2IvaGFzaC9kb29icy5odG1sKS4KICAqCi0gKiAgS2V5cyBhcmUgY29tcHV0ZWQgZnJvbSBFTlRSWSBvYmplY3RzLiBFTlRSWSBtdXN0IGJlIGZ1bGx5IG9yZGVyZWQgYnkgYSBtZW1iZXI6Ci0gKiAgICAgIGludCBjb21wYXJlKGNvbnN0IEdyVEJpbkhhc2hLZXk8RU5UUlksIC4uPiYgayk7Ci0gKiAgd2hpY2ggcmV0dXJucyBuZWdhdGl2ZSBpZiB0aGUgRU5UUlkgPCBrLCAwIGlmIGl0IGVxdWFscyBrLCBhbmQgcG9zaXRpdmUgaWYgayA8IHRoZSBFTlRSWS4KLSAqICBBZGRpdGlvbmFsbHksIEVOVFJZIG11c3QgYmUgZmxhdHRlbmFibGUgaW50byB0aGUga2V5IHVzaW5nIHNldEtleURhdGEuCisgKiAgS2V5cyBhcmUgY29tcHV0ZWQgZnJvbSBFbnRyeSBvYmplY3RzLiBFbnRyeSBtdXN0IGJlIGZ1bGx5IG9yZGVyZWQgYnkgYSBtZW1iZXI6CisgKiAgICAgIGludCBjb21wYXJlKGNvbnN0IEdyVEJpbkhhc2hLZXk8RW50cnksIC4uPiYgayk7CisgKiAgd2hpY2ggcmV0dXJucyBuZWdhdGl2ZSBpZiB0aGUgRW50cnkgPCBrLCAwIGlmIGl0IGVxdWFscyBrLCBhbmQgcG9zaXRpdmUgaWYgayA8IHRoZSBFbnRyeS4KKyAqICBBZGRpdGlvbmFsbHksIEVudHJ5IG11c3QgYmUgZmxhdHRlbmFibGUgaW50byB0aGUga2V5IHVzaW5nIHNldEtleURhdGEuCiAgKgogICogIFRoaXMgY2xhc3Mgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgdG8gYmUgYSBrZXkgZm9yIGEgR3JUSGFzaFRhYmxlLgogICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBFTlRSWSwgc2l6ZV90IEtFWV9TSVpFPgordGVtcGxhdGU8dHlwZW5hbWUgRW50cnksIHNpemVfdCBLZXlTaXplPgogY2xhc3MgR3JUQmluSGFzaEtleSB7CiBwdWJsaWM6Ci0gICAgZW51bSB7IGtLZXlTaXplID0gS0VZX1NJWkUgfTsKLQogICAgIEdyVEJpbkhhc2hLZXkoKSB7CiAgICAgICAgIHRoaXMtPnJlc2V0KCk7CiAgICAgfQogCi0gICAgR3JUQmluSGFzaEtleShjb25zdCBHclRCaW5IYXNoS2V5PEVOVFJZLCBLRVlfU0laRT4mIG90aGVyKSB7CisgICAgR3JUQmluSGFzaEtleShjb25zdCBHclRCaW5IYXNoS2V5PEVudHJ5LCBLZXlTaXplPiYgb3RoZXIpIHsKICAgICAgICAgKnRoaXMgPSBvdGhlcjsKICAgICB9CiAKLSAgICBHclRCaW5IYXNoS2V5PEVOVFJZLCBLRVlfU0laRT4mIG9wZXJhdG9yPShjb25zdCBHclRCaW5IYXNoS2V5PEVOVFJZLCBLRVlfU0laRT4mIG90aGVyKSB7CisgICAgR3JUQmluSGFzaEtleTxFbnRyeSwgS2V5U2l6ZT4mIG9wZXJhdG9yPShjb25zdCBHclRCaW5IYXNoS2V5PEVudHJ5LCBLZXlTaXplPiYgb3RoZXIpIHsKICAgICAgICAgbWVtY3B5KHRoaXMsICZvdGhlciwgc2l6ZW9mKCp0aGlzKSk7CiAgICAgICAgIHJldHVybiAqdGhpczsKICAgICB9CkBAIC01MiwxMSArNTAsMTEgQEAKICAgICB9CiAKICAgICB2b2lkIHNldEtleURhdGEoY29uc3QgdWludDMyX3QqIFNLX1JFU1RSSUNUIGRhdGEpIHsKLSAgICAgICAgR3JBc3NlcnQoR3JJc0FMSUdONChLRVlfU0laRSkpOwotICAgICAgICBtZW1jcHkoJmZEYXRhLCBkYXRhLCBLRVlfU0laRSk7CisgICAgICAgIEdyQXNzZXJ0KEdySXNBTElHTjQoS2V5U2l6ZSkpOworICAgICAgICBtZW1jcHkoJmZEYXRhLCBkYXRhLCBLZXlTaXplKTsKIAogICAgICAgICB1aW50MzJfdCBoYXNoID0gMDsKLSAgICAgICAgc2l6ZV90IGxlbiA9IEtFWV9TSVpFOworICAgICAgICBzaXplX3QgbGVuID0gS2V5U2l6ZTsKICAgICAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgICAgICAgICBoYXNoICs9ICpkYXRhKys7CiAgICAgICAgICAgICBoYXNoICs9IChmSGFzaCA8PCAxMCk7CkBAIC03MiwxNyArNzAsMTcgQEAKICAgICAgICAgZkhhc2ggPSBoYXNoOwogICAgIH0KIAotICAgIGludCBjb21wYXJlKGNvbnN0IEdyVEJpbkhhc2hLZXk8RU5UUlksIEtFWV9TSVpFPiYga2V5KSBjb25zdCB7CisgICAgaW50IGNvbXBhcmUoY29uc3QgR3JUQmluSGFzaEtleTxFbnRyeSwgS2V5U2l6ZT4mIGtleSkgY29uc3QgewogICAgICAgICBHckFzc2VydChmSXNWYWxpZCAmJiBrZXkuZklzVmFsaWQpOwotICAgICAgICByZXR1cm4gbWVtY21wKGZEYXRhLCBrZXkuZkRhdGEsIEtFWV9TSVpFKTsKKyAgICAgICAgcmV0dXJuIG1lbWNtcChmRGF0YSwga2V5LmZEYXRhLCBLZXlTaXplKTsKICAgICB9CiAKLSAgICBzdGF0aWMgYm9vbCBFUShjb25zdCBFTlRSWSYgZW50cnksIGNvbnN0IEdyVEJpbkhhc2hLZXk8RU5UUlksIEtFWV9TSVpFPiYga2V5KSB7CisgICAgc3RhdGljIGJvb2wgRVEoY29uc3QgRW50cnkmIGVudHJ5LCBjb25zdCBHclRCaW5IYXNoS2V5PEVudHJ5LCBLZXlTaXplPiYga2V5KSB7CiAgICAgICAgIEdyQXNzZXJ0KGtleS5mSXNWYWxpZCk7CiAgICAgICAgIHJldHVybiAwID09IGVudHJ5LmNvbXBhcmUoa2V5KTsKICAgICB9CiAKLSAgICBzdGF0aWMgYm9vbCBMVChjb25zdCBFTlRSWSYgZW50cnksIGNvbnN0IEdyVEJpbkhhc2hLZXk8RU5UUlksIEtFWV9TSVpFPiYga2V5KSB7CisgICAgc3RhdGljIGJvb2wgTFQoY29uc3QgRW50cnkmIGVudHJ5LCBjb25zdCBHclRCaW5IYXNoS2V5PEVudHJ5LCBLZXlTaXplPiYga2V5KSB7CiAgICAgICAgIEdyQXNzZXJ0KGtleS5mSXNWYWxpZCk7CiAgICAgICAgIHJldHVybiBlbnRyeS5jb21wYXJlKGtleSkgPCAwOwogICAgIH0KQEAgLTkyLDE0ICs5MCw5IEBACiAgICAgICAgIHJldHVybiBmSGFzaDsKICAgICB9CiAKLSAgICBjb25zdCB1aW50OF90KiBnZXREYXRhKCkgY29uc3QgewotICAgICAgICBHckFzc2VydChmSXNWYWxpZCk7Ci0gICAgICAgIHJldHVybiBmRGF0YTsKLSAgICB9Ci0KIHByaXZhdGU6CiAgICAgdWludDMyX3QgICAgICAgICAgICBmSGFzaDsKLSAgICB1aW50OF90ICAgICAgICAgICAgIGZEYXRhW0tFWV9TSVpFXTsgIC8vIEJ1ZmZlciBmb3Iga2V5IHN0b3JhZ2UKKyAgICB1aW50OF90ICAgICAgICAgICAgIGZEYXRhW0tleVNpemVdOyAgLy8gQnVmZmVyIGZvciBrZXkgc3RvcmFnZQogCiAjaWYgR1JfREVCVUcKIHB1YmxpYzoKZGlmZiAtLWdpdCBhL3NyYy9ncHUvR3JDYWNoZUlELmNwcCBiL3NyYy9ncHUvR3JDYWNoZUlELmNwcAppbmRleCBjZTQ3YWYzLi40YzZkZDQ5IDEwMDY0NAotLS0gYS9zcmMvZ3B1L0dyQ2FjaGVJRC5jcHAKKysrIGIvc3JjL2dwdS9HckNhY2hlSUQuY3BwCkBAIC01LDIxICs1LDQwIEBACiAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogICovCiAKLSNpbmNsdWRlICJHclR5cGVzLmgiCisjaW5jbHVkZSAiR3JDYWNoZUlELmgiCiAjaW5jbHVkZSAiU2tUaHJlYWQuaCIgICAgICAgLy8gZm9yIHNrX2F0b21pY19pbmMKIAotc3RhdGljIGNvbnN0IEdyQ2FjaGVJRDo6S2V5IGtBc3NlcnRLZXk7Ci1HUl9TVEFUSUNfQVNTRVJUKHNpemVvZihrQXNzZXJ0S2V5LmZEYXRhOCkgID09IHNpemVvZihrQXNzZXJ0S2V5LmZEYXRhMzIpKTsKLUdSX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGtBc3NlcnRLZXkuZkRhdGE4KSA9PSBzaXplb2Yoa0Fzc2VydEtleS5mRGF0YTY0KSk7Ci1HUl9TVEFUSUNfQVNTRVJUKHNpemVvZihrQXNzZXJ0S2V5LmZEYXRhOCkgPT0gc2l6ZW9mKGtBc3NlcnRLZXkpKTsKLQotR3JDYWNoZUlEOjpEb21haW4gR3JDYWNoZUlEOjpHZW5lcmF0ZURvbWFpbigpIHsKLSAgICBzdGF0aWMgaW50MzJfdCBnTmV4dERvbWFpbiA9IGtJbnZhbGlkX0RvbWFpbiArIDE7Cit1aW50OF90IEdyQ2FjaGVJRDo6R2V0TmV4dERvbWFpbigpIHsKKyAgICAvLyAwIHJlc2VydmVkIGZvciBrVW5yZXN0cmljdGVkX1Jlc291cmNlRG9tYWluCisgICAgc3RhdGljIGludDMyX3QgZ05leHREb21haW4gPSAxOwogCiAgICAgaW50MzJfdCBkb21haW4gPSBza19hdG9taWNfaW5jKCZnTmV4dERvbWFpbik7Ci0gICAgaWYgKGRvbWFpbiA+PSAxIDw8ICg4ICogc2l6ZW9mKERvbWFpbikpKSB7CisgICAgaWYgKGRvbWFpbiA+PSAyNTYpIHsKICAgICAgICAgR3JDcmFzaCgiVG9vIG1hbnkgQ2FjaGUgRG9tYWlucyIpOwogICAgIH0KIAotICAgIHJldHVybiBzdGF0aWNfY2FzdDxEb21haW4+KGRvbWFpbik7CisgICAgcmV0dXJuICh1aW50OF90KSBkb21haW47Cit9CisKK3VpbnQ4X3QgR3JDYWNoZUlEOjpHZXROZXh0UmVzb3VyY2VUeXBlKCkgeworICAgIC8vIDAgcmVzZXJ2ZWQgZm9yIGtJbnZhbGlkX1Jlc291cmNlVHlwZQorICAgIHN0YXRpYyBpbnQzMl90IGdOZXh0UmVzb3VyY2VUeXBlID0gMTsKKworICAgIGludDMyX3QgdHlwZSA9IHNrX2F0b21pY19pbmMoJmdOZXh0UmVzb3VyY2VUeXBlKTsKKyAgICBpZiAodHlwZSA+PSAyNTYpIHsKKyAgICAgICAgR3JDcmFzaCgiVG9vIG1hbnkgQ2FjaGUgUmVzb3VyY2UgVHlwZXMiKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHVpbnQ4X3QpIHR5cGU7Cit9CisKK3ZvaWQgR3JDYWNoZUlEOjp0b1Jhdyh1aW50MzJfdCB2WzRdKSB7CisgICAgR3JBc3NlcnQoNCpzaXplb2YodWludDMyX3QpID09IHNpemVvZihHckNhY2hlSUQpKTsKKworICAgIHZbMF0gPSAodWludDMyX3QpIChmUHVibGljSUQgJiAweGZmZmZmZmZmVUwpOworICAgIHZbMV0gPSAodWludDMyX3QpICgoZlB1YmxpY0lEID4+IDMyKSAmIDB4ZmZmZmZmZmZVTCk7CisgICAgdlsyXSA9IGZSZXNvdXJjZVNwZWNpZmljMzI7CisgICAgdlszXSA9IGZEb21haW4gPDwgMjQgfAorICAgICAgICAgICBmUmVzb3VyY2VUeXBlIDw8IDE2IHwKKyAgICAgICAgICAgZlJlc291cmNlU3BlY2lmaWMxNjsKIH0KZGlmZiAtLWdpdCBhL3NyYy9ncHUvR3JDbGlwTWFza01hbmFnZXIuY3BwIGIvc3JjL2dwdS9HckNsaXBNYXNrTWFuYWdlci5jcHAKaW5kZXggN2VhYjBjZS4uYTU5NjA4OCAxMDA2NDQKLS0tIGEvc3JjL2dwdS9HckNsaXBNYXNrTWFuYWdlci5jcHAKKysrIGIvc3JjL2dwdS9HckNsaXBNYXNrTWFuYWdlci5jcHAKQEAgLTE4LDkgKzE4LDEyIEBACiAjaW5jbHVkZSAiR3JBQUNvbnZleFBhdGhSZW5kZXJlci5oIgogI2luY2x1ZGUgIkdyQUFIYWlyTGluZVBhdGhSZW5kZXJlci5oIgogI2luY2x1ZGUgIkdyU1dNYXNrSGVscGVyLmgiCisjaW5jbHVkZSAiR3JDYWNoZUlELmgiCiAKICNpbmNsdWRlICJTa1RMYXp5LmgiCiAKK0dSX0RFRklORV9SRVNPVVJDRV9DQUNIRV9ET01BSU4oR3JDbGlwTWFza01hbmFnZXIsIEdldEFscGhhTWFza0RvbWFpbikKKwogI2RlZmluZSBHUl9BQV9DTElQIDEKIAogdHlwZWRlZiBTa0NsaXBTdGFjazo6RWxlbWVudCBFbGVtZW50OwpkaWZmIC0tZ2l0IGEvc3JjL2dwdS9HckNsaXBNYXNrTWFuYWdlci5oIGIvc3JjL2dwdS9HckNsaXBNYXNrTWFuYWdlci5oCmluZGV4IDUzNDY4OWEuLjQ4ZDE3ZTEgMTAwNjQ0Ci0tLSBhL3NyYy9ncHUvR3JDbGlwTWFza01hbmFnZXIuaAorKysgYi9zcmMvZ3B1L0dyQ2xpcE1hc2tNYW5hZ2VyLmgKQEAgLTQxLDYgKzQxLDggQEAKICAqLwogY2xhc3MgR3JDbGlwTWFza01hbmFnZXIgOiBwdWJsaWMgR3JOb25jb3B5YWJsZSB7CiBwdWJsaWM6CisgICAgR1JfREVDTEFSRV9SRVNPVVJDRV9DQUNIRV9ET01BSU4oR2V0QWxwaGFNYXNrRG9tYWluKQorCiAgICAgR3JDbGlwTWFza01hbmFnZXIoKQogICAgICAgICA6IGZHcHUoTlVMTCkKICAgICAgICAgLCBmQ3VyckNsaXBNYXNrVHlwZShrTm9uZV9DbGlwTWFza1R5cGUpIHsKZGlmZiAtLWdpdCBhL3NyYy9ncHUvR3JDb250ZXh0LmNwcCBiL3NyYy9ncHUvR3JDb250ZXh0LmNwcAppbmRleCAxMmZiZWI2Li5kMDBlMDYyIDEwMDY0NAotLS0gYS9zcmMvZ3B1L0dyQ29udGV4dC5jcHAKKysrIGIvc3JjL2dwdS9HckNvbnRleHQuY3BwCkBAIC0yMDksMjAgKzIwOSwxOCBAQAogCiB9CiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KIEdyVGV4dHVyZSogR3JDb250ZXh0OjpmaW5kVGV4dHVyZShjb25zdCBHclRleHR1cmVEZXNjJiBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyQ2FjaGVJRCYgY2FjaGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlRGF0YSYgY2FjaGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZVBhcmFtcyogcGFyYW1zKSB7Ci0gICAgR3JSZXNvdXJjZUtleSByZXNvdXJjZUtleSA9IEdyVGV4dHVyZTo6Q29tcHV0ZUtleShmR3B1LCBwYXJhbXMsIGRlc2MsIGNhY2hlSUQpOworICAgIEdyUmVzb3VyY2VLZXkgcmVzb3VyY2VLZXkgPSBHclRleHR1cmU6OkNvbXB1dGVLZXkoZkdwdSwgcGFyYW1zLCBkZXNjLCBjYWNoZURhdGEsIGZhbHNlKTsKICAgICBHclJlc291cmNlKiByZXNvdXJjZSA9IGZUZXh0dXJlQ2FjaGUtPmZpbmQocmVzb3VyY2VLZXkpOwogICAgIHJldHVybiBzdGF0aWNfY2FzdDxHclRleHR1cmUqPihyZXNvdXJjZSk7CiB9CiAKIGJvb2wgR3JDb250ZXh0Ojppc1RleHR1cmVJbkNhY2hlKGNvbnN0IEdyVGV4dHVyZURlc2MmIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlSUQmIGNhY2hlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlRGF0YSYgY2FjaGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlUGFyYW1zKiBwYXJhbXMpIGNvbnN0IHsKLSAgICBHclJlc291cmNlS2V5IHJlc291cmNlS2V5ID0gR3JUZXh0dXJlOjpDb21wdXRlS2V5KGZHcHUsIHBhcmFtcywgZGVzYywgY2FjaGVJRCk7CisgICAgR3JSZXNvdXJjZUtleSByZXNvdXJjZUtleSA9IEdyVGV4dHVyZTo6Q29tcHV0ZUtleShmR3B1LCBwYXJhbXMsIGRlc2MsIGNhY2hlRGF0YSwgZmFsc2UpOwogICAgIHJldHVybiBmVGV4dHVyZUNhY2hlLT5oYXNLZXkocmVzb3VyY2VLZXkpOwogfQogCkBAIC0yNzQsMTMgKzI3MiwxMyBAQAogLy8gVGhlIGRlc2lyZWQgdGV4dHVyZSBpcyBOUE9UIGFuZCB0aWxlZCBidXQgdGhhdCBpc24ndCBzdXBwb3J0ZWQgYnkKIC8vIHRoZSBjdXJyZW50IGhhcmR3YXJlLiBSZXNpemUgdGhlIHRleHR1cmUgdG8gYmUgYSBQT1QKIEdyVGV4dHVyZSogR3JDb250ZXh0OjpjcmVhdGVSZXNpemVkVGV4dHVyZShjb25zdCBHclRleHR1cmVEZXNjJiBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyQ2FjaGVJRCYgY2FjaGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlRGF0YSYgY2FjaGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHNyY0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJvd0J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNGaWx0ZXJpbmcpIHsKLSAgICBHclRleHR1cmUqIGNsYW1wZWRUZXh0dXJlID0gdGhpcy0+ZmluZFRleHR1cmUoZGVzYywgY2FjaGVJRCwgTlVMTCk7CisgICAgR3JUZXh0dXJlKiBjbGFtcGVkVGV4dHVyZSA9IHRoaXMtPmZpbmRUZXh0dXJlKGRlc2MsIGNhY2hlRGF0YSwgTlVMTCk7CiAgICAgaWYgKE5VTEwgPT0gY2xhbXBlZFRleHR1cmUpIHsKLSAgICAgICAgY2xhbXBlZFRleHR1cmUgPSB0aGlzLT5jcmVhdGVUZXh0dXJlKE5VTEwsIGRlc2MsIGNhY2hlSUQsIHNyY0RhdGEsIHJvd0J5dGVzKTsKKyAgICAgICAgY2xhbXBlZFRleHR1cmUgPSB0aGlzLT5jcmVhdGVUZXh0dXJlKE5VTEwsIGRlc2MsIGNhY2hlRGF0YSwgc3JjRGF0YSwgcm93Qnl0ZXMpOwogCiAgICAgICAgIGlmIChOVUxMID09IGNsYW1wZWRUZXh0dXJlKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM1MiwyMiArMzUwLDIyIEBACiBHclRleHR1cmUqIEdyQ29udGV4dDo6Y3JlYXRlVGV4dHVyZSgKICAgICAgICAgY29uc3QgR3JUZXh0dXJlUGFyYW1zKiBwYXJhbXMsCiAgICAgICAgIGNvbnN0IEdyVGV4dHVyZURlc2MmIGRlc2MsCi0gICAgICAgIGNvbnN0IEdyQ2FjaGVJRCYgY2FjaGVJRCwKKyAgICAgICAgY29uc3QgR3JDYWNoZURhdGEmIGNhY2hlRGF0YSwKICAgICAgICAgdm9pZCogc3JjRGF0YSwKICAgICAgICAgc2l6ZV90IHJvd0J5dGVzKSB7Ci0gICAgU0tfVFJBQ0VfRVZFTlQwKCJHckNvbnRleHQ6OmNyZWF0ZVRleHR1cmUiKTsKKyAgICBTS19UUkFDRV9FVkVOVDAoIkdyQ29udGV4dDo6Y3JlYXRlQW5kTG9ja1RleHR1cmUiKTsKIAogI2lmIEdSX0RVTVBfVEVYVFVSRV9VUExPQUQKLSAgICBHclByaW50ZigiR3JDb250ZXh0OjpjcmVhdGVUZXh0dXJlWyVkICVkXVxuIiwgZGVzYy5mV2lkdGgsIGRlc2MuZkhlaWdodCk7CisgICAgR3JQcmludGYoIkdyQ29udGV4dDo6Y3JlYXRlQW5kTG9ja1RleHR1cmUgWyVkICVkXVxuIiwgZGVzYy5mV2lkdGgsIGRlc2MuZkhlaWdodCk7CiAjZW5kaWYKIAotICAgIEdyUmVzb3VyY2VLZXkgcmVzb3VyY2VLZXkgPSBHclRleHR1cmU6OkNvbXB1dGVLZXkoZkdwdSwgcGFyYW1zLCBkZXNjLCBjYWNoZUlEKTsKKyAgICBHclJlc291cmNlS2V5IHJlc291cmNlS2V5ID0gR3JUZXh0dXJlOjpDb21wdXRlS2V5KGZHcHUsIHBhcmFtcywgZGVzYywgY2FjaGVEYXRhLCBmYWxzZSk7CiAKICAgICBTa0F1dG9UVW5yZWY8R3JUZXh0dXJlPiB0ZXh0dXJlOwogICAgIGlmIChHclRleHR1cmU6Ok5lZWRzUmVzaXppbmcocmVzb3VyY2VLZXkpKSB7Ci0gICAgICAgIHRleHR1cmUucmVzZXQodGhpcy0+Y3JlYXRlUmVzaXplZFRleHR1cmUoZGVzYywgY2FjaGVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNEYXRhLCByb3dCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHclRleHR1cmU6Ok5lZWRzRmlsdGVyaW5nKHJlc291cmNlS2V5KSkpOworICAgICAgICB0ZXh0dXJlLnJlc2V0KHRoaXMtPmNyZWF0ZVJlc2l6ZWRUZXh0dXJlKGRlc2MsIGNhY2hlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsIHJvd0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JUZXh0dXJlOjpOZWVkc0ZpbHRlcmluZyhyZXNvdXJjZUtleSkpKTsKICAgICB9IGVsc2UgewogICAgICAgICB0ZXh0dXJlLnJlc2V0KGZHcHUtPmNyZWF0ZVRleHR1cmUoZGVzYywgc3JjRGF0YSwgcm93Qnl0ZXMpKTsKICAgICB9CkBAIC0zNzksMTMgKzM3NywxNSBAQAogICAgIHJldHVybiB0ZXh0dXJlOwogfQogCi1HclRleHR1cmUqIEdyQ29udGV4dDo6bG9ja1NjcmF0Y2hUZXh0dXJlKGNvbnN0IEdyVGV4dHVyZURlc2MmIGluRGVzYywgU2NyYXRjaFRleE1hdGNoIG1hdGNoKSB7CitHclRleHR1cmUqIEdyQ29udGV4dDo6bG9ja1NjcmF0Y2hUZXh0dXJlKGNvbnN0IEdyVGV4dHVyZURlc2MmIGluRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyYXRjaFRleE1hdGNoIG1hdGNoKSB7CiAgICAgR3JUZXh0dXJlRGVzYyBkZXNjID0gaW5EZXNjOworICAgIEdyQ2FjaGVEYXRhIGNhY2hlRGF0YShHckNhY2hlRGF0YTo6a1NjcmF0Y2hfQ2FjaGVJRCk7CiAKICAgICBHckFzc2VydCgoZGVzYy5mRmxhZ3MgJiBrUmVuZGVyVGFyZ2V0X0dyVGV4dHVyZUZsYWdCaXQpIHx8CiAgICAgICAgICAgICAgIShkZXNjLmZGbGFncyAmIGtOb1N0ZW5jaWxfR3JUZXh0dXJlRmxhZ0JpdCkpOwogCi0gICAgaWYgKGtBcHByb3hfU2NyYXRjaFRleE1hdGNoID09IG1hdGNoKSB7CisgICAgaWYgKGtFeGFjdF9TY3JhdGNoVGV4TWF0Y2ggIT0gbWF0Y2gpIHsKICAgICAgICAgLy8gYmluIGJ5IHBvdzIgd2l0aCBhIHJlYXNvbmFibGUgbWluCiAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgTUlOX1NJWkUgPSAyNTY7CiAgICAgICAgIGRlc2MuZldpZHRoICA9IEdyTWF4KE1JTl9TSVpFLCBHck5leHRQb3cyKGRlc2MuZldpZHRoKSk7CkBAIC0zOTksNyArMzk5LDcgQEAKICAgICBib29sIGRvdWJsZWRIID0gZmFsc2U7CiAKICAgICBkbyB7Ci0gICAgICAgIEdyUmVzb3VyY2VLZXkga2V5ID0gR3JUZXh0dXJlOjpDb21wdXRlU2NyYXRjaEtleShkZXNjKTsKKyAgICAgICAgR3JSZXNvdXJjZUtleSBrZXkgPSBHclRleHR1cmU6OkNvbXB1dGVLZXkoZkdwdSwgTlVMTCwgZGVzYywgY2FjaGVEYXRhLCB0cnVlKTsKICAgICAgICAgLy8gRW5zdXJlIHdlIGhhdmUgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgdGV4dHVyZSBzbyBmdXR1cmUgJ2ZpbmQnIGNhbGxzIGRvbid0IHJldHVybiBpdAogICAgICAgICByZXNvdXJjZSA9IGZUZXh0dXJlQ2FjaGUtPmZpbmQoa2V5LCBHclJlc291cmNlQ2FjaGU6OmtIaWRlX093bmVyc2hpcEZsYWcpOwogICAgICAgICAvLyBpZiB3ZSBtaXNzLCByZWxheCB0aGUgZml0IG9mIHRoZSBmbGFncy4uLgpAQCAtNDMzLDcgKzQzMywxMCBAQAogICAgICAgICBkZXNjLmZIZWlnaHQgPSBvcmlnSGVpZ2h0OwogICAgICAgICBTa0F1dG9UVW5yZWY8R3JUZXh0dXJlPiB0ZXh0dXJlKGZHcHUtPmNyZWF0ZVRleHR1cmUoZGVzYywgTlVMTCwgMCkpOwogICAgICAgICBpZiAoTlVMTCAhPSB0ZXh0dXJlKSB7Ci0gICAgICAgICAgICBHclJlc291cmNlS2V5IGtleSA9IEdyVGV4dHVyZTo6Q29tcHV0ZVNjcmF0Y2hLZXkodGV4dHVyZS0+ZGVzYygpKTsKKyAgICAgICAgICAgIEdyUmVzb3VyY2VLZXkga2V5ID0gR3JUZXh0dXJlOjpDb21wdXRlS2V5KGZHcHUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLT5kZXNjKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICAgICAgICAgIC8vIE1ha2UgdGhlIHJlc291cmNlIGV4Y2x1c2l2ZSBzbyBmdXR1cmUgJ2ZpbmQnIGNhbGxzIGRvbid0IHJldHVybiBpdAogICAgICAgICAgICAgZlRleHR1cmVDYWNoZS0+YWRkUmVzb3VyY2Uoa2V5LCB0ZXh0dXJlLCBHclJlc291cmNlQ2FjaGU6OmtIaWRlX093bmVyc2hpcEZsYWcpOwogICAgICAgICAgICAgcmVzb3VyY2UgPSB0ZXh0dXJlOwpAQCAtNDcyLDcgKzQ3NSw3IEBACiAgICAgLy8gSWYgdGhpcyBpcyBhIHNjcmF0Y2ggdGV4dHVyZSB3ZSBkZXRhY2hlZCBpdCBmcm9tIHRoZSBjYWNoZQogICAgIC8vIHdoaWxlIGl0IHdhcyBsb2NrZWQgKHRvIGF2b2lkIHR3byBjYWxsZXJzIHNpbXVsdGFuZW91c2x5IGdldHRpbmcKICAgICAvLyB0aGUgc2FtZSB0ZXh0dXJlKS4KLSAgICBpZiAodGV4dHVyZS0+Z2V0Q2FjaGVFbnRyeSgpLT5rZXkoKS5pc1NjcmF0Y2goKSkgeworICAgIGlmIChHclRleHR1cmU6OklzU2NyYXRjaFRleHR1cmUodGV4dHVyZS0+Z2V0Q2FjaGVFbnRyeSgpLT5rZXkoKSkpIHsKICAgICAgICAgZlRleHR1cmVDYWNoZS0+bWFrZU5vbkV4Y2x1c2l2ZSh0ZXh0dXJlLT5nZXRDYWNoZUVudHJ5KCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2dwdS9HclJlc291cmNlQ2FjaGUuY3BwIGIvc3JjL2dwdS9HclJlc291cmNlQ2FjaGUuY3BwCmluZGV4IDQ1Yjk5OWYuLmExZjFkNzkgMTAwNjQ0Ci0tLSBhL3NyYy9ncHUvR3JSZXNvdXJjZUNhY2hlLmNwcAorKysgYi9zcmMvZ3B1L0dyUmVzb3VyY2VDYWNoZS5jcHAKQEAgLTExLDIwICsxMSw2IEBACiAjaW5jbHVkZSAiR3JSZXNvdXJjZUNhY2hlLmgiCiAjaW5jbHVkZSAiR3JSZXNvdXJjZS5oIgogCi0KLUdyUmVzb3VyY2VLZXk6OlJlc291cmNlVHlwZSBHclJlc291cmNlS2V5OjpHZW5lcmF0ZVJlc291cmNlVHlwZSgpIHsKLSAgICBzdGF0aWMgaW50MzJfdCBnTmV4dFR5cGUgPSAwOwotCi0gICAgaW50MzJfdCB0eXBlID0gc2tfYXRvbWljX2luYygmZ05leHRUeXBlKTsKLSAgICBpZiAodHlwZSA+PSAoMSA8PCA4ICogc2l6ZW9mKFJlc291cmNlVHlwZSkpKSB7Ci0gICAgICAgIEdyQ3Jhc2goIlRvbyBtYW55IFJlc291cmNlIFR5cGVzIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc291cmNlVHlwZT4odHlwZSk7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQogR3JSZXNvdXJjZUVudHJ5OjpHclJlc291cmNlRW50cnkoY29uc3QgR3JSZXNvdXJjZUtleSYga2V5LCBHclJlc291cmNlKiByZXNvdXJjZSkKICAgICAgICAgOiBmS2V5KGtleSksIGZSZXNvdXJjZShyZXNvdXJjZSkgewogICAgIC8vIHdlIGFzc3VtZSBvd25lcnNoaXAgb2YgdGhlIHJlc291cmNlLCBhbmQgd2lsbCB1bnJlZiBpdCB3aGVuIHdlIGRpZQpAQCAtNDcsNiArMzMsMzYgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCitjbGFzcyBHclJlc291cmNlQ2FjaGU6OktleSB7CisgICAgdHlwZWRlZiBHclJlc291cmNlRW50cnkgVDsKKworICAgIGNvbnN0IEdyUmVzb3VyY2VLZXkmIGZLZXk7CitwdWJsaWM6CisgICAgS2V5KGNvbnN0IEdyUmVzb3VyY2VLZXkmIGtleSkgOiBmS2V5KGtleSkge30KKworICAgIHVpbnQzMl90IGdldEhhc2goKSBjb25zdCB7IHJldHVybiBmS2V5Lmhhc2hJbmRleCgpOyB9CisKKyAgICBzdGF0aWMgYm9vbCBMVChjb25zdCBUJiBlbnRyeSwgY29uc3QgS2V5JiBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGVudHJ5LmtleSgpIDwga2V5LmZLZXk7CisgICAgfQorICAgIHN0YXRpYyBib29sIEVRKGNvbnN0IFQmIGVudHJ5LCBjb25zdCBLZXkmIGtleSkgeworICAgICAgICByZXR1cm4gZW50cnkua2V5KCkgPT0ga2V5LmZLZXk7CisgICAgfQorI2lmIEdSX0RFQlVHCisgICAgc3RhdGljIHVpbnQzMl90IEdldEhhc2goY29uc3QgVCYgZW50cnkpIHsKKyAgICAgICAgcmV0dXJuIGVudHJ5LmtleSgpLmhhc2hJbmRleCgpOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBMVChjb25zdCBUJiBhLCBjb25zdCBUJiBiKSB7CisgICAgICAgIHJldHVybiBhLmtleSgpIDwgYi5rZXkoKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgRVEoY29uc3QgVCYgYSwgY29uc3QgVCYgYikgeworICAgICAgICByZXR1cm4gYS5rZXkoKSA9PSBiLmtleSgpOworICAgIH0KKyNlbmRpZgorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCiBHclJlc291cmNlQ2FjaGU6OkdyUmVzb3VyY2VDYWNoZShpbnQgbWF4Q291bnQsIHNpemVfdCBtYXhCeXRlcykgOgogICAgICAgICBmTWF4Q291bnQobWF4Q291bnQpLAogICAgICAgICBmTWF4Qnl0ZXMobWF4Qnl0ZXMpIHsKZGlmZiAtLWdpdCBhL3NyYy9ncHUvR3JSZXNvdXJjZUNhY2hlLmggYi9zcmMvZ3B1L0dyUmVzb3VyY2VDYWNoZS5oCmluZGV4IGI0YzlkZjcuLmUxMjA3YTIgMTAwNjQ0Ci0tLSBhL3NyYy9ncHUvR3JSZXNvdXJjZUNhY2hlLmgKKysrIGIvc3JjL2dwdS9HclJlc291cmNlQ2FjaGUuaApAQCAtMTQsMTIgKzE0LDI3IEBACiAjaW5jbHVkZSAiR3JDb25maWcuaCIKICNpbmNsdWRlICJHclR5cGVzLmgiCiAjaW5jbHVkZSAiR3JUSGFzaENhY2hlLmgiCi0jaW5jbHVkZSAiR3JCaW5IYXNoS2V5LmgiCiAjaW5jbHVkZSAiU2tUSW50ZXJuYWxMTGlzdC5oIgogCiBjbGFzcyBHclJlc291cmNlOwotY2xhc3MgR3JSZXNvdXJjZUVudHJ5OwogCisvLyByZXR1cm4gdHJ1ZSBpZiBhPGIsIG9yIGZhbHNlIGlmIGI8YQorLy8KKyNkZWZpbmUgUkVUX0lGX0xUX09SX0dUKGEsIGIpICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoYSkgPCAoYikpIHsgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoYikgPCAoYSkpIHsgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyoqCisgKiAgSGVscGVyIGNsYXNzIGZvciBHclJlc291cmNlQ2FjaGUsIHRoZSBLZXkgaXMgdXNlZCB0byBpZGVudGlmeSBzcmMgZGF0YSBmb3IKKyAqICBhIHJlc291cmNlLiBJdCBpcyBpZGVudGlmaWVkIGJ5IDIgMzJiaXQgZGF0YSBmaWVsZHMgd2hpY2ggY2FuIGhvbGQgYW55CisgKiAgZGF0YSAodW5pbnRlcnByZXRlZCBieSB0aGUgY2FjaGUpIGFuZCBhIHdpZHRoL2hlaWdodC4KKyAqLwogY2xhc3MgR3JSZXNvdXJjZUtleSB7CiBwdWJsaWM6CiAgICAgZW51bSB7CkBAIC0yOCwxMTggKzQzLDgyIEBACiAgICAgICAgIGtIYXNoTWFzayAgID0ga0hhc2hDb3VudCAtIDEKICAgICB9OwogCi0gICAgc3RhdGljIEdyQ2FjaGVJRDo6RG9tYWluIFNjcmF0Y2hEb21haW4oKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBHckNhY2hlSUQ6OkRvbWFpbiBnRG9tYWluID0gR3JDYWNoZUlEOjpHZW5lcmF0ZURvbWFpbigpOwotICAgICAgICByZXR1cm4gZ0RvbWFpbjsKKyAgICBHclJlc291cmNlS2V5KHVpbnQzMl90IHAwLCB1aW50MzJfdCBwMSwgdWludDMyX3QgcDIsIHVpbnQzMl90IHAzKSB7CisgICAgICAgIGZQWzBdID0gcDA7CisgICAgICAgIGZQWzFdID0gcDE7CisgICAgICAgIGZQWzJdID0gcDI7CisgICAgICAgIGZQWzNdID0gcDM7CisgICAgICAgIHRoaXMtPmNvbXB1dGVIYXNoSW5kZXgoKTsKICAgICB9CiAKLSAgICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgR3JSZXNvdXJjZSBzdWJjbGFzcyBpbiB0aGUga2V5IHRvIGF2b2lkIGNvbGxpc2lvbnMKLSAgICAgICAgYWNyb3NzIHJlc291cmNlIHR5cGVzLiAqLwotICAgIHR5cGVkZWYgdWludDhfdCBSZXNvdXJjZVR5cGU7Ci0KLSAgICAvKiogRmxhZ3Mgc2V0IGJ5IHRoZSBHclJlc291cmNlIHN1YmNsYXNzLiAqLwotICAgIHR5cGVkZWYgdWludDhfdCBSZXNvdXJjZUZsYWdzOwotCi0gICAgLyoqIEdlbmVyYXRlIGEgdW5pcXVlIFJlc291cmNlVHlwZSAqLwotICAgIHN0YXRpYyBSZXNvdXJjZVR5cGUgR2VuZXJhdGVSZXNvdXJjZVR5cGUoKTsKLQotICAgIC8qKiBDcmVhdGVzIGEga2V5IGZvciByZXNvdXJjZSAqLwotICAgIEdyUmVzb3VyY2VLZXkoY29uc3QgR3JDYWNoZUlEJiBpZCwgUmVzb3VyY2VUeXBlIHR5cGUsIFJlc291cmNlRmxhZ3MgZmxhZ3MpIHsKLSAgICAgICAgdGhpcy0+aW5pdChpZC5nZXREb21haW4oKSwgaWQuZ2V0S2V5KCksIHR5cGUsIGZsYWdzKTsKLSAgICB9OworICAgIEdyUmVzb3VyY2VLZXkodWludDMyX3Qgdls0XSkgeworICAgICAgICBtZW1jcHkoZlAsIHYsIDQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgdGhpcy0+Y29tcHV0ZUhhc2hJbmRleCgpOworICAgIH0KIAogICAgIEdyUmVzb3VyY2VLZXkoY29uc3QgR3JSZXNvdXJjZUtleSYgc3JjKSB7Ci0gICAgICAgIGZLZXkgPSBzcmMuZktleTsKLSAgICB9Ci0KLSAgICBHclJlc291cmNlS2V5KCkgewotICAgICAgICBmS2V5LmZIYXNoZWRLZXkucmVzZXQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlc2V0KGNvbnN0IEdyQ2FjaGVJRCYgaWQsIFJlc291cmNlVHlwZSB0eXBlLCBSZXNvdXJjZUZsYWdzIGZsYWdzKSB7Ci0gICAgICAgIHRoaXMtPmluaXQoaWQuZ2V0RG9tYWluKCksIGlkLmdldEtleSgpLCB0eXBlLCBmbGFncyk7CisgICAgICAgIG1lbWNweShmUCwgc3JjLmZQLCA0ICogc2l6ZW9mKHVpbnQzMl90KSk7CisjaWYgR1JfREVCVUcKKyAgICAgICAgdGhpcy0+Y29tcHV0ZUhhc2hJbmRleCgpOworICAgICAgICBHckFzc2VydChmSGFzaEluZGV4ID09IHNyYy5mSGFzaEluZGV4KTsKKyNlbmRpZgorICAgICAgICBmSGFzaEluZGV4ID0gc3JjLmZIYXNoSW5kZXg7CiAgICAgfQogCiAgICAgLy8hPCByZXR1cm5zIGhhc2ggdmFsdWUgWzAuLmtIYXNoTWFza10gZm9yIHRoZSBrZXkKLSAgICBpbnQgZ2V0SGFzaCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGZLZXkuZkhhc2hlZEtleS5nZXRIYXNoKCkgJiBrSGFzaE1hc2s7CisgICAgaW50IGhhc2hJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGZIYXNoSW5kZXg7IH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgR3JSZXNvdXJjZUtleSYgYSwgY29uc3QgR3JSZXNvdXJjZUtleSYgYikgeworICAgICAgICBHUl9ERUJVR0FTU0VSVCgtMSAhPSBhLmZIYXNoSW5kZXggJiYgLTEgIT0gYi5mSGFzaEluZGV4KTsKKyAgICAgICAgcmV0dXJuIDAgPT0gbWVtY21wKGEuZlAsIGIuZlAsIDQgKiBzaXplb2YodWludDMyX3QpKTsKICAgICB9CiAKLSAgICBib29sIGlzU2NyYXRjaCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFNjcmF0Y2hEb21haW4oKSA9PQotICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgR3JDYWNoZUlEOjpEb21haW4qPihmS2V5LmZIYXNoZWRLZXkuZ2V0RGF0YSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NhY2hlSUREb21haW5PZmZzZXQpOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgR3JSZXNvdXJjZUtleSYgYSwgY29uc3QgR3JSZXNvdXJjZUtleSYgYikgeworICAgICAgICBHUl9ERUJVR0FTU0VSVCgtMSAhPSBhLmZIYXNoSW5kZXggJiYgLTEgIT0gYi5mSGFzaEluZGV4KTsKKyAgICAgICAgcmV0dXJuICEoYSA9PSBiKTsKICAgICB9CiAKLSAgICBSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVzb3VyY2VUeXBlKj4oZktleS5mSGFzaGVkS2V5LmdldERhdGEoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVzb3VyY2VUeXBlT2Zmc2V0KTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgR3JSZXNvdXJjZUtleSYgYSwgY29uc3QgR3JSZXNvdXJjZUtleSYgYikgeworICAgICAgICBSRVRfSUZfTFRfT1JfR1QoYS5mUFswXSwgYi5mUFswXSk7CisgICAgICAgIFJFVF9JRl9MVF9PUl9HVChhLmZQWzFdLCBiLmZQWzFdKTsKKyAgICAgICAgUkVUX0lGX0xUX09SX0dUKGEuZlBbMl0sIGIuZlBbMl0pOworICAgICAgICByZXR1cm4gYS5mUFszXSA8IGIuZlBbM107CiAgICAgfQogCi0gICAgUmVzb3VyY2VGbGFncyBnZXRSZXNvdXJjZUZsYWdzKCkgY29uc3QgewotICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVzb3VyY2VGbGFncyo+KGZLZXkuZkhhc2hlZEtleS5nZXREYXRhKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXNvdXJjZUZsYWdzT2Zmc2V0KTsKKyAgICB1aW50MzJfdCBnZXRWYWx1ZTMyKGludCBpKSBjb25zdCB7CisgICAgICAgIEdyQXNzZXJ0KGkgPj0wICYmIGkgPCA0KTsKKyAgICAgICAgcmV0dXJuIGZQW2ldOwogICAgIH0KLQotICAgIGludCBjb21wYXJlKGNvbnN0IEdyUmVzb3VyY2VLZXkmIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBmS2V5LmZIYXNoZWRLZXkuY29tcGFyZShvdGhlci5mS2V5LmZIYXNoZWRLZXkpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIExUKGNvbnN0IEdyUmVzb3VyY2VLZXkmIGEsIGNvbnN0IEdyUmVzb3VyY2VLZXkmIGIpIHsKLSAgICAgICAgcmV0dXJuIGEuY29tcGFyZShiKSA8IDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgRVEoY29uc3QgR3JSZXNvdXJjZUtleSYgYSwgY29uc3QgR3JSZXNvdXJjZUtleSYgYikgewotICAgICAgICByZXR1cm4gMCA9PSBhLmNvbXBhcmUoYik7Ci0gICAgfQotCi0gICAgaW5saW5lIHN0YXRpYyBib29sIExUKGNvbnN0IEdyUmVzb3VyY2VFbnRyeSYgZW50cnksIGNvbnN0IEdyUmVzb3VyY2VLZXkmIGtleSk7Ci0gICAgaW5saW5lIHN0YXRpYyBib29sIEVRKGNvbnN0IEdyUmVzb3VyY2VFbnRyeSYgZW50cnksIGNvbnN0IEdyUmVzb3VyY2VLZXkmIGtleSk7Ci0gICAgaW5saW5lIHN0YXRpYyBib29sIExUKGNvbnN0IEdyUmVzb3VyY2VFbnRyeSYgYSwgY29uc3QgR3JSZXNvdXJjZUVudHJ5JiBiKTsKLSAgICBpbmxpbmUgc3RhdGljIGJvb2wgRVEoY29uc3QgR3JSZXNvdXJjZUVudHJ5JiBhLCBjb25zdCBHclJlc291cmNlRW50cnkmIGIpOwotCiBwcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrQ2FjaGVJREtleU9mZnNldCA9IDAsCi0gICAgICAgIGtDYWNoZUlERG9tYWluT2Zmc2V0ID0ga0NhY2hlSURLZXlPZmZzZXQgKyBzaXplb2YoR3JDYWNoZUlEOjpLZXkpLAotICAgICAgICBrUmVzb3VyY2VUeXBlT2Zmc2V0ID0ga0NhY2hlSUREb21haW5PZmZzZXQgKyBzaXplb2YoR3JDYWNoZUlEOjpEb21haW4pLAotICAgICAgICBrUmVzb3VyY2VGbGFnc09mZnNldCA9IGtSZXNvdXJjZVR5cGVPZmZzZXQgKyBzaXplb2YoUmVzb3VyY2VUeXBlKSwKLSAgICAgICAga1BhZE9mZnNldCA9IGtSZXNvdXJjZUZsYWdzT2Zmc2V0ICsgc2l6ZW9mKFJlc291cmNlRmxhZ3MpLAotICAgICAgICBrS2V5U2l6ZSA9IFNrQWxpZ240KGtQYWRPZmZzZXQpLAotICAgICAgICBrUGFkU2l6ZSA9IGtLZXlTaXplIC0ga1BhZE9mZnNldAotICAgIH07CiAKLSAgICB2b2lkIGluaXQoY29uc3QgR3JDYWNoZUlEOjpEb21haW4gZG9tYWluLAotICAgICAgICAgICAgICBjb25zdCBHckNhY2hlSUQ6OktleSYga2V5LAotICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgUmVzb3VyY2VGbGFncyBmbGFncykgewotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICB1aW50OF90ICBmS2V5OFtrS2V5U2l6ZV07Ci0gICAgICAgICAgICB1aW50MzJfdCBmS2V5MzJba0tleVNpemUgLyA0XTsKLSAgICAgICAgfSBrZXlEYXRhOwotICAgICAgICAKLSAgICAgICAgdWludDhfdCogayA9IGtleURhdGEuZktleTg7Ci0gICAgICAgIG1lbWNweShrICsga0NhY2hlSURLZXlPZmZzZXQsIGtleS5mRGF0YTgsIHNpemVvZihHckNhY2hlSUQ6OktleSkpOwotICAgICAgICBtZW1jcHkoayArIGtDYWNoZUlERG9tYWluT2Zmc2V0LCAmZG9tYWluLCBzaXplb2YoR3JDYWNoZUlEOjpEb21haW4pKTsKLSAgICAgICAgbWVtY3B5KGsgKyBrUmVzb3VyY2VUeXBlT2Zmc2V0LCAmdHlwZSwgc2l6ZW9mKFJlc291cmNlVHlwZSkpOwotICAgICAgICBtZW1jcHkoayArIGtSZXNvdXJjZUZsYWdzT2Zmc2V0LCAmZmxhZ3MsIHNpemVvZihSZXNvdXJjZUZsYWdzKSk7Ci0gICAgICAgIG1lbXNldChrICsga1BhZE9mZnNldCwgMCwga1BhZFNpemUpOwotICAgICAgICBmS2V5LmZIYXNoZWRLZXkuc2V0S2V5RGF0YShrZXlEYXRhLmZLZXkzMik7CisgICAgc3RhdGljIHVpbnQzMl90IHJvbCh1aW50MzJfdCB4KSB7CisgICAgICAgIHJldHVybiAoeCA+PiAyNCkgfCAoeCA8PCA4KTsKKyAgICB9CisgICAgc3RhdGljIHVpbnQzMl90IHJvcih1aW50MzJfdCB4KSB7CisgICAgICAgIHJldHVybiAoeCA+PiA4KSB8ICh4IDw8IDI0KTsKKyAgICB9CisgICAgc3RhdGljIHVpbnQzMl90IHJvaGFsZih1aW50MzJfdCB4KSB7CisgICAgICAgIHJldHVybiAoeCA+PiAxNikgfCAoeCA8PCAxNik7CiAgICAgfQogCi0gICAgc3RydWN0IEtleTsKLSAgICB0eXBlZGVmIEdyVEJpbkhhc2hLZXk8S2V5LCBrS2V5U2l6ZT4gSGFzaGVkS2V5OworICAgIHZvaWQgY29tcHV0ZUhhc2hJbmRleCgpIHsKKyAgICAgICAgdWludDMyX3QgaGFzaCA9IGZQWzBdIF4gcm9sKGZQWzFdKSBeIHJvcihmUFsyXSkgXiByb2hhbGYoZlBbM10pOworICAgICAgICAvLyB0aGlzIHdheSB0byBtaXggYW5kIHJlZHVjZSBoYXNoIHRvIGl0cyBpbmRleCBtYXkgaGF2ZSB0byBjaGFuZ2UKKyAgICAgICAgLy8gZGVwZW5kaW5nIG9uIGhvdyBtYW55IGJpdHMgd2UgYWxsb2NhdGUgdG8gdGhlIGluZGV4CisgICAgICAgIGhhc2ggXj0gaGFzaCA+PiAxNjsKKyAgICAgICAgaGFzaCBePSBoYXNoID4+IDg7CisgICAgICAgIGZIYXNoSW5kZXggPSBoYXNoICYga0hhc2hNYXNrOworICAgIH0KIAotICAgIHN0cnVjdCBLZXkgewotICAgICAgICBpbnQgY29tcGFyZShjb25zdCBIYXNoZWRLZXkmIGhhc2hlZEtleSkgY29uc3QgewotICAgICAgICAgICAgZkhhc2hlZEtleS5jb21wYXJlKGZIYXNoZWRLZXkpOwotICAgICAgICB9Ci0gICAgICAgIEhhc2hlZEtleSBmSGFzaGVkS2V5OwotICAgIH07CisgICAgdWludDMyX3QgICAgZlBbNF07CiAKLSAgICBLZXkgZktleTsKKyAgICAvLyB0aGlzIGlzIGNvbXB1dGVkIGZyb20gdGhlIGZQLi4uIGZpZWxkcworICAgIGludCAgICAgICAgIGZIYXNoSW5kZXg7CisKKyAgICBmcmllbmQgY2xhc3MgR3JDb250ZXh0OwogfTsKIAorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGNsYXNzIEdyUmVzb3VyY2VFbnRyeSB7CkBAIC0xNjcsMjIgKzE0Niw2IEBACiAgICAgZnJpZW5kIGNsYXNzIEdyRExpbmtlZExpc3Q7CiB9OwogCi1ib29sIEdyUmVzb3VyY2VLZXk6OkxUKGNvbnN0IEdyUmVzb3VyY2VFbnRyeSYgZW50cnksIGNvbnN0IEdyUmVzb3VyY2VLZXkmIGtleSkgewotICAgIHJldHVybiBMVChlbnRyeS5rZXkoKSwga2V5KTsKLX0KLQotYm9vbCBHclJlc291cmNlS2V5OjpFUShjb25zdCBHclJlc291cmNlRW50cnkmIGVudHJ5LCBjb25zdCBHclJlc291cmNlS2V5JiBrZXkpIHsKLSAgICByZXR1cm4gRVEoZW50cnkua2V5KCksIGtleSk7Ci19Ci0KLWJvb2wgR3JSZXNvdXJjZUtleTo6TFQoY29uc3QgR3JSZXNvdXJjZUVudHJ5JiBhLCBjb25zdCBHclJlc291cmNlRW50cnkmIGIpIHsKLSAgICByZXR1cm4gTFQoYS5rZXkoKSwgYi5rZXkoKSk7Ci19Ci0KLWJvb2wgR3JSZXNvdXJjZUtleTo6RVEoY29uc3QgR3JSZXNvdXJjZUVudHJ5JiBhLCBjb25zdCBHclJlc291cmNlRW50cnkmIGIpIHsKLSAgICByZXR1cm4gRVEoYS5rZXkoKSwgYi5rZXkoKSk7Ci19Ci0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogI2luY2x1ZGUgIkdyVEhhc2hDYWNoZS5oIgpAQCAtMzI2LDcgKzI4OSw4IEBACiAKICAgICB2b2lkIHJlbW92ZUludmFsaWRSZXNvdXJjZShHclJlc291cmNlRW50cnkqIGVudHJ5KTsKIAotICAgIEdyVEhhc2hUYWJsZTxHclJlc291cmNlRW50cnksIEdyUmVzb3VyY2VLZXksIDg+IGZDYWNoZTsKKyAgICBjbGFzcyBLZXk7CisgICAgR3JUSGFzaFRhYmxlPEdyUmVzb3VyY2VFbnRyeSwgS2V5LCA4PiBmQ2FjaGU7CiAKICAgICAvLyBXZSdyZSBhbiBpbnRlcm5hbCBkb3VibHkgbGlua2VkIGxpc3QKICAgICB0eXBlZGVmIFNrVEludGVybmFsTExpc3Q8R3JSZXNvdXJjZUVudHJ5PiBFbnRyeUxpc3Q7CmRpZmYgLS1naXQgYS9zcmMvZ3B1L0dyU3RlbmNpbEJ1ZmZlci5jcHAgYi9zcmMvZ3B1L0dyU3RlbmNpbEJ1ZmZlci5jcHAKaW5kZXggNjIzODYxZC4uMTgwOTEyZSAxMDA2NDQKLS0tIGEvc3JjL2dwdS9HclN0ZW5jaWxCdWZmZXIuY3BwCisrKyBiL3NyYy9ncHUvR3JTdGVuY2lsQnVmZmVyLmNwcApAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgIkdyUmVzb3VyY2VDYWNoZS5oIgogCiBTS19ERUZJTkVfSU5TVF9DT1VOVChHclN0ZW5jaWxCdWZmZXIpCitHUl9ERUZJTkVfUkVTT1VSQ0VfQ0FDSEVfVFlQRShHclN0ZW5jaWxCdWZmZXIpCiAKIHZvaWQgR3JTdGVuY2lsQnVmZmVyOjp0cmFuc2ZlclRvQ2FjaGUoKSB7CiAgICAgR3JBc3NlcnQoTlVMTCA9PSB0aGlzLT5nZXRDYWNoZUVudHJ5KCkpOwpAQCAtMjEsMjggKzIyLDMwIEBACiB9CiAKIG5hbWVzcGFjZSB7Ci0vLyB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIHN0ZW5jaWwgYnVmZmVyIHdpdGggc2FtZSBjb21ibyBvZiAod2lkdGgsaGVpZ2h0LHNhbXBsZWNvdW50KQotdm9pZCBnZW5fY2FjaGVfaWQoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2FtcGxlQ250LCBHckNhY2hlSUQqIGNhY2hlSUQpIHsKLSAgICBzdGF0aWMgY29uc3QgR3JDYWNoZUlEOjpEb21haW4gZ1N0ZW5jaWxCdWZmZXJEb21haW4gPSBHckNhY2hlSUQ6OkdlbmVyYXRlRG9tYWluKCk7Ci0gICAgR3JDYWNoZUlEOjpLZXkga2V5OwotICAgIHVpbnQzMl90KiBrZXlEYXRhID0ga2V5LmZEYXRhMzI7Ci0gICAga2V5RGF0YVswXSA9IHdpZHRoOwotICAgIGtleURhdGFbMV0gPSBoZWlnaHQ7Ci0gICAga2V5RGF0YVsyXSA9IHNhbXBsZUNudDsKLSAgICBHUl9TVEFUSUNfQVNTRVJUKHNpemVvZihrZXkpID49IDMgKiBzaXplb2YodWludDMyX3QpKTsKLSAgICBjYWNoZUlELT5yZXNldChnU3RlbmNpbEJ1ZmZlckRvbWFpbiwga2V5KTsKKy8vIHdlIHNob3VsZCBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgc3RlbmNpbCBidWZmZXIgd2l0aCBzYW1lIGNvbWJvIG9mCisvLyAod2lkdGgsaGVpZ2h0LHNhbXBsZWNvdW50KQordm9pZCBnZW5fc3RlbmNpbF9rZXlfdmFsdWVzKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JDYWNoZUlEKiBjYWNoZUlEKSB7CisgICAgY2FjaGVJRC0+ZlB1YmxpY0lEID0gR3JDYWNoZUlEOjprRGVmYXVsdFB1YmxpY0NhY2hlSUQ7CisgICAgY2FjaGVJRC0+ZlJlc291cmNlU3BlY2lmaWMzMiA9IHdpZHRoIHwgKGhlaWdodCA8PCAxNik7CisgICAgY2FjaGVJRC0+ZkRvbWFpbiA9IEdyQ2FjaGVEYXRhOjprU2NyYXRjaF9SZXNvdXJjZURvbWFpbjsKKworICAgIEdyQXNzZXJ0KHNhbXBsZUNudCA+PSAwICYmIHNhbXBsZUNudCA8IDI1Nik7CisgICAgY2FjaGVJRC0+ZlJlc291cmNlU3BlY2lmaWMxNiA9IHNhbXBsZUNudCA8PCA4OworCisgICAgLy8gbGFzdCA4IGJpdHMgb2YgJ2ZSZXNvdXJjZVNwZWNpZmljMTYnIGlzIGZyZWUgZm9yIGZsYWdzCiB9CiB9CiAKIEdyUmVzb3VyY2VLZXkgR3JTdGVuY2lsQnVmZmVyOjpDb21wdXRlS2V5KGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlQ250KSB7Ci0gICAgLy8gQWxsIFNCcyBhcmUgY3JlYXRlZCBpbnRlcm5hbGx5IHRvIGF0dGFjaCB0byBSVHMgc28gdGhleSBhbGwgdXNlIHRoZSBzYW1lIGRvbWFpbi4KLSAgICBzdGF0aWMgY29uc3QgR3JSZXNvdXJjZUtleTo6UmVzb3VyY2VUeXBlIGdTdGVuY2lsQnVmZmVyUmVzb3VyY2VUeXBlID0KLSAgICAgICAgR3JSZXNvdXJjZUtleTo6R2VuZXJhdGVSZXNvdXJjZVR5cGUoKTsKLSAgICBHckNhY2hlSUQgaWQ7Ci0gICAgZ2VuX2NhY2hlX2lkKHdpZHRoLCBoZWlnaHQsIHNhbXBsZUNudCwgJmlkKTsKKyAgICBHckNhY2hlSUQgaWQoR3JTdGVuY2lsQnVmZmVyOjpHZXRSZXNvdXJjZVR5cGUoKSk7CisgICAgZ2VuX3N0ZW5jaWxfa2V5X3ZhbHVlcyh3aWR0aCwgaGVpZ2h0LCBzYW1wbGVDbnQsICZpZCk7CiAKLSAgICAvLyB3ZSBkb24ndCB1c2UgYW55IGZsYWdzIGZvciBTQnMgY3VycmVudGx5LgotICAgIHJldHVybiBHclJlc291cmNlS2V5KGlkLCBnU3RlbmNpbEJ1ZmZlclJlc291cmNlVHlwZSwgMCk7CisgICAgdWludDMyX3Qgdls0XTsKKyAgICBpZC50b1Jhdyh2KTsKKyAgICByZXR1cm4gR3JSZXNvdXJjZUtleSh2KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9ncHUvR3JTdGVuY2lsQnVmZmVyLmggYi9zcmMvZ3B1L0dyU3RlbmNpbEJ1ZmZlci5oCmluZGV4IDQ1OWQ4MDEuLmU0ZTUxOTAgMTAwNjQ0Ci0tLSBhL3NyYy9ncHUvR3JTdGVuY2lsQnVmZmVyLmgKKysrIGIvc3JjL2dwdS9HclN0ZW5jaWxCdWZmZXIuaApAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSAiR3JDbGlwRGF0YS5oIgogI2luY2x1ZGUgIkdyUmVzb3VyY2UuaCIKKyNpbmNsdWRlICJHckNhY2hlSUQuaCIKIAogY2xhc3MgR3JSZW5kZXJUYXJnZXQ7CiBjbGFzcyBHclJlc291cmNlRW50cnk7CkBAIC0yMCw2ICsyMSw3IEBACiBjbGFzcyBHclN0ZW5jaWxCdWZmZXIgOiBwdWJsaWMgR3JSZXNvdXJjZSB7CiBwdWJsaWM6CiAgICAgU0tfREVDTEFSRV9JTlNUX0NPVU5UKEdyU3RlbmNpbEJ1ZmZlcik7CisgICAgR1JfREVDTEFSRV9SRVNPVVJDRV9DQUNIRV9UWVBFKCkKIAogICAgIHZpcnR1YWwgfkdyU3RlbmNpbEJ1ZmZlcigpIHsKICAgICAgICAgLy8gVE9ETzogYWxsb3cgU0IgdG8gYmUgcHVyZ2VkIGFuZCBkZXRhY2ggaXRzZWxmIGZyb20gcnRzCmRpZmYgLS1naXQgYS9zcmMvZ3B1L0dyVEhhc2hDYWNoZS5oIGIvc3JjL2dwdS9HclRIYXNoQ2FjaGUuaAppbmRleCA4NTQ3MjM3Li40NDk0ZjlmIDEwMDY0NAotLS0gYS9zcmMvZ3B1L0dyVEhhc2hDYWNoZS5oCisrKyBiL3NyYy9ncHUvR3JUSGFzaENhY2hlLmgKQEAgLTIyNiw2ICsyMjYsMTMgQEAKICNpZiBHUl9ERUJVRwogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEtleSwgc2l6ZV90IGtIYXNoQml0cz4KIHZvaWQgR3JUSGFzaFRhYmxlPFQsIEtleSwga0hhc2hCaXRzPjo6dmFsaWRhdGUoKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHUl9BUlJBWV9DT1VOVChmSGFzaCk7IGkrKykgeworICAgICAgICBpZiAoZkhhc2hbaV0pIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGhhc2hJbmRleCA9IGhhc2gySW5kZXgoS2V5OjpHZXRIYXNoKCpmSGFzaFtpXSkpOworICAgICAgICAgICAgR3JBc3NlcnQoaGFzaEluZGV4ID09IGkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50IGNvdW50ID0gZlNvcnRlZC5jb3VudCgpOwogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICBHckFzc2VydChLZXk6OkxUKCpmU29ydGVkW2kgLSAxXSwgKmZTb3J0ZWRbaV0pIHx8CmRpZmYgLS1naXQgYS9zcmMvZ3B1L0dyVGV4dHVyZS5jcHAgYi9zcmMvZ3B1L0dyVGV4dHVyZS5jcHAKaW5kZXggZWIzYTU4Ni4uYzMxZDc3NCAxMDA2NDQKLS0tIGEvc3JjL2dwdS9HclRleHR1cmUuY3BwCisrKyBiL3NyYy9ncHUvR3JUZXh0dXJlLmNwcApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgIkdyUmVzb3VyY2VDYWNoZS5oIgogCiBTS19ERUZJTkVfSU5TVF9DT1VOVChHclRleHR1cmUpCitHUl9ERUZJTkVfUkVTT1VSQ0VfQ0FDSEVfVFlQRShHclRleHR1cmUpCiAKIC8qKgogICogVGhpcyBtZXRob2QgYWxsb3dzIHVzIHRvIGludGVycnVwdCB0aGUgbm9ybWFsIGRlbGV0aW9uIHByb2Nlc3MgYW5kIHBsYWNlCkBAIC0xMTUsNzMgKzExNiw5NyBAQAogICAgIH0KIH0KIAotLy8gVGhlc2UgZmxhZ3MgbmVlZCB0byBmaXQgaW4gYSBHclJlc291cmNlS2V5OjpSZXNvdXJjZUZsYWdzIHNvIHRoZXkgY2FuIGJlIGZvbGRlZCBpbnRvIHRoZSB0ZXh0dXJlCisvLyBUaGVzZSBmbGFncyBuZWVkIHRvIGZpdCBpbiA8PSA4IGJpdHMgc28gdGhleSBjYW4gYmUgZm9sZGVkIGludG8gdGhlIHRleHR1cmUKIC8vIGtleQotZW51bSBUZXh0dXJlRmxhZ3MgewotICAgIC8qKgotICAgICAqIFRoZSBrU3RyZXRjaFRvUE9UIGJpdCBpcyBzZXQgd2hlbiB0aGUgdGV4dHVyZSBpcyBOUE9UIGFuZCBpcyBiZWluZyByZXBlYXRlZCBidXQgdGhlCi0gICAgICogaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IHRoYXQgZmVhdHVyZS4KK2VudW0gVGV4dHVyZUJpdHMgeworICAgIC8qCisgICAgICogVGhlIGtOUE9UIGJpdCBpcyBzZXQgd2hlbiB0aGUgdGV4dHVyZSBpcyBOUE9UIGFuZCBpcyBiZWluZyByZXBlYXRlZAorICAgICAqIGJ1dCB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IHRoYXQgZmVhdHVyZS4KICAgICAgKi8KLSAgICBrU3RyZXRjaFRvUE9UX1RleHR1cmVGbGFnID0gMHgxLAotICAgIC8qKgotICAgICAqIFRoZSBrRmlsdGVyIGJpdCBjYW4gb25seSBiZSBzZXQgd2hlbiB0aGUga1N0cmV0Y2hUb1BPVCBmbGFnIGlzIHNldCBhbmQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlCi0gICAgICogc3RyZXRjaGVkIHRleHR1cmUgc2hvdWxkIGJlIGJpbGVycCBmaWx0ZXJlZCBvciBwb2ludCBzYW1wbGVkLiAKKyAgICBrTlBPVF9UZXh0dXJlQml0ICAgICAgICAgICAgPSAweDEsCisgICAgLyoKKyAgICAgKiBUaGUga0ZpbHRlciBiaXQgY2FuIG9ubHkgYmUgc2V0IHdoZW4gdGhlIGtOUE9UIGZsYWcgaXMgc2V0IGFuZCBpbmRpY2F0ZXMKKyAgICAgKiB3aGV0aGVyIHRoZSByZXNpemluZyBvZiB0aGUgdGV4dHVyZSBzaG91bGQgdXNlIGZpbHRlcmluZy4gVGhpcyBpcworICAgICAqIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgb3JpZ2luYWwgdGV4dHVyZSBpcyBpbmRleGVkIHRvIGRpc2FibGUKKyAgICAgKiBmaWx0ZXJpbmcuCiAgICAgICovCi0gICAga0ZpbHRlcl9UZXh0dXJlRmxhZyAgICAgICA9IDB4MiwKKyAgICBrRmlsdGVyX1RleHR1cmVCaXQgICAgICAgICAgPSAweDIsCisgICAgLyoKKyAgICAgKiBUaGUga1NjcmF0Y2ggYml0IGlzIHNldCBpZiB0aGUgdGV4dHVyZSBpcyBiZWluZyB1c2VkIGFzIGEgc2NyYXRjaAorICAgICAqIHRleHR1cmUuCisgICAgICovCisgICAga1NjcmF0Y2hfVGV4dHVyZUJpdCAgICAgICAgID0gMHg0LAogfTsKIAogbmFtZXNwYWNlIHsKLUdyUmVzb3VyY2VLZXk6OlJlc291cmNlRmxhZ3MgZ2V0X3RleHR1cmVfZmxhZ3MoY29uc3QgR3JHcHUqIGdwdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlUGFyYW1zKiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZURlc2MmIGRlc2MpIHsKLSAgICBHclJlc291cmNlS2V5OjpSZXNvdXJjZUZsYWdzIGZsYWdzID0gMDsKLSAgICBib29sIHRpbGVkID0gTlVMTCAhPSBwYXJhbXMgJiYgcGFyYW1zLT5pc1RpbGVkKCk7Ci0gICAgaWYgKHRpbGVkICYgIWdwdS0+Z2V0Q2FwcygpLm5wb3RUZXh0dXJlVGlsZVN1cHBvcnQoKSkgewotICAgICAgICBpZiAoIUdySXNQb3cyKGRlc2MuZldpZHRoKSB8fCBHcklzUG93MihkZXNjLmZIZWlnaHQpKSB7Ci0gICAgICAgICAgICBmbGFncyB8PSBrU3RyZXRjaFRvUE9UX1RleHR1cmVGbGFnOwordm9pZCBnZW5fdGV4dHVyZV9rZXlfdmFsdWVzKGNvbnN0IEdyR3B1KiBncHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlUGFyYW1zKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHckNhY2hlRGF0YSYgY2FjaGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHckNhY2hlSUQqIGNhY2hlSUQpIHsKKworICAgIHVpbnQ2NF90IGNsaWVudEtleSA9IGNhY2hlRGF0YS5mQ2xpZW50Q2FjaGVJRDsKKworICAgIGlmIChzY3JhdGNoKSB7CisgICAgICAgIC8vIEluc3RlYWQgb2YgYSBjbGllbnQtcHJvdmlkZWQga2V5IG9mIHRoZSB0ZXh0dXJlIGNvbnRlbnRzCisgICAgICAgIC8vIHdlIGNyZWF0ZSBhIGtleSBmcm9tIHRoZSBkZXNjcmlwdG9yLgorICAgICAgICBHckFzc2VydChHckNhY2hlRGF0YTo6a1NjcmF0Y2hfQ2FjaGVJRCA9PSBjbGllbnRLZXkpOworICAgICAgICBjbGllbnRLZXkgPSAoZGVzYy5mRmxhZ3MgPDwgOCkgfCAoKHVpbnQ2NF90KSBkZXNjLmZDb25maWcgPDwgMzIpOworICAgIH0KKworICAgIGNhY2hlSUQtPmZQdWJsaWNJRCA9IGNsaWVudEtleTsKKyAgICBjYWNoZUlELT5mRG9tYWluID0gY2FjaGVEYXRhLmZSZXNvdXJjZURvbWFpbjsKKworICAgIC8vIHdlIGFzc3VtZSB3ZSBvbmx5IG5lZWQgMTYgYml0cyBvZiB3aWR0aCBhbmQgaGVpZ2h0CisgICAgLy8gYXNzZXJ0IHRoYXQgdGV4dHVyZSBjcmVhdGlvbiB3aWxsIGZhaWwgYW55d2F5IGlmIHRoaXMgYXNzdW1wdGlvbgorICAgIC8vIHdvdWxkIGNhdXNlIGtleSBjb2xsaXNpb25zLgorICAgIEdyQXNzZXJ0KGdwdS0+Z2V0Q2FwcygpLm1heFRleHR1cmVTaXplKCkgPD0gU0tfTWF4VTE2KTsKKyAgICBjYWNoZUlELT5mUmVzb3VyY2VTcGVjaWZpYzMyID0gZGVzYy5mV2lkdGggfCAoZGVzYy5mSGVpZ2h0IDw8IDE2KTsKKworICAgIEdyQXNzZXJ0KGRlc2MuZlNhbXBsZUNudCA+PSAwICYmIGRlc2MuZlNhbXBsZUNudCA8IDI1Nik7CisgICAgY2FjaGVJRC0+ZlJlc291cmNlU3BlY2lmaWMxNiA9IGRlc2MuZlNhbXBsZUNudCA8PCA4OworCisgICAgaWYgKCFncHUtPmdldENhcHMoKS5ucG90VGV4dHVyZVRpbGVTdXBwb3J0KCkpIHsKKyAgICAgICAgYm9vbCBpc1BvdzIgPSBHcklzUG93MihkZXNjLmZXaWR0aCkgJiYgR3JJc1BvdzIoZGVzYy5mSGVpZ2h0KTsKKworICAgICAgICBib29sIHRpbGVkID0gTlVMTCAhPSBwYXJhbXMgJiYgcGFyYW1zLT5pc1RpbGVkKCk7CisKKyAgICAgICAgaWYgKHRpbGVkICYmICFpc1BvdzIpIHsKKyAgICAgICAgICAgIGNhY2hlSUQtPmZSZXNvdXJjZVNwZWNpZmljMTYgfD0ga05QT1RfVGV4dHVyZUJpdDsKICAgICAgICAgICAgIGlmIChwYXJhbXMtPmlzQmlsZXJwKCkpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBrRmlsdGVyX1RleHR1cmVGbGFnOworICAgICAgICAgICAgICAgIGNhY2hlSUQtPmZSZXNvdXJjZVNwZWNpZmljMTYgfD0ga0ZpbHRlcl9UZXh0dXJlQml0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmbGFnczsKLX0KIAotR3JSZXNvdXJjZUtleTo6UmVzb3VyY2VUeXBlIHRleHR1cmVfcmVzb3VyY2VfdHlwZSgpIHsKLSAgICBzdGF0aWMgY29uc3QgR3JSZXNvdXJjZUtleTo6UmVzb3VyY2VUeXBlIGdUeXBlID0gR3JSZXNvdXJjZUtleTo6R2VuZXJhdGVSZXNvdXJjZVR5cGUoKTsKLSAgICByZXR1cm4gZ1R5cGU7CisgICAgaWYgKHNjcmF0Y2gpIHsKKyAgICAgICAgY2FjaGVJRC0+ZlJlc291cmNlU3BlY2lmaWMxNiB8PSBrU2NyYXRjaF9UZXh0dXJlQml0OworICAgIH0KIH0KIH0KIAogR3JSZXNvdXJjZUtleSBHclRleHR1cmU6OkNvbXB1dGVLZXkoY29uc3QgR3JHcHUqIGdwdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZVBhcmFtcyogcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyQ2FjaGVJRCYgY2FjaGVJRCkgewotICAgIEdyUmVzb3VyY2VLZXk6OlJlc291cmNlRmxhZ3MgZmxhZ3MgPSBnZXRfdGV4dHVyZV9mbGFncyhncHUsIHBhcmFtcywgZGVzYyk7Ci0gICAgcmV0dXJuIEdyUmVzb3VyY2VLZXkoY2FjaGVJRCwgdGV4dHVyZV9yZXNvdXJjZV90eXBlKCksIGZsYWdzKTsKLX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyQ2FjaGVEYXRhJiBjYWNoZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNjcmF0Y2gpIHsKKyAgICBHckNhY2hlSUQgaWQoR3JUZXh0dXJlOjpHZXRSZXNvdXJjZVR5cGUoKSk7CisgICAgZ2VuX3RleHR1cmVfa2V5X3ZhbHVlcyhncHUsIHBhcmFtcywgZGVzYywgY2FjaGVEYXRhLCBzY3JhdGNoLCAmaWQpOwogCi1HclJlc291cmNlS2V5IEdyVGV4dHVyZTo6Q29tcHV0ZVNjcmF0Y2hLZXkoY29uc3QgR3JUZXh0dXJlRGVzYyYgZGVzYykgewotICAgIEdyQ2FjaGVJRDo6S2V5IGlkS2V5OwotICAgIC8vIEluc3RlYWQgb2YgYSBjbGllbnQtcHJvdmlkZWQga2V5IG9mIHRoZSB0ZXh0dXJlIGNvbnRlbnRzIHdlIGNyZWF0ZSBhIGtleSBmcm9tIHRoZQotICAgIC8vIGRlc2NyaXB0b3IuCi0gICAgR1JfU1RBVElDX0FTU0VSVChzaXplb2YoaWRLZXkpID49IDEyKTsKLSAgICBHckFzc2VydChkZXNjLmZIZWlnaHQgPCAoMSA8PCAxNikpOwotICAgIEdyQXNzZXJ0KGRlc2MuZldpZHRoIDwgKDEgPDwgMTYpKTsKLSAgICBpZEtleS5mRGF0YTMyWzBdID0gKGRlc2MuZldpZHRoKSB8IChkZXNjLmZIZWlnaHQgPDwgMTYpOwotICAgIGlkS2V5LmZEYXRhMzJbMV0gPSBkZXNjLmZDb25maWcgfCBkZXNjLmZTYW1wbGVDbnQgPDwgMTY7Ci0gICAgaWRLZXkuZkRhdGEzMlsyXSA9IGRlc2MuZkZsYWdzOwotICAgIHN0YXRpYyBjb25zdCBpbnQga1BhZFNpemUgPSBzaXplb2YoaWRLZXkpIC0gMTI7Ci0gICAgbWVtc2V0KGlkS2V5LmZEYXRhOCArIDEyLCAwLCBrUGFkU2l6ZSk7Ci0KLSAgICBHckNhY2hlSUQgY2FjaGVJRChHclJlc291cmNlS2V5OjpTY3JhdGNoRG9tYWluKCksIGlkS2V5KTsKLSAgICByZXR1cm4gR3JSZXNvdXJjZUtleShjYWNoZUlELCB0ZXh0dXJlX3Jlc291cmNlX3R5cGUoKSwgMCk7CisgICAgdWludDMyX3Qgdls0XTsKKyAgICBpZC50b1Jhdyh2KTsKKyAgICByZXR1cm4gR3JSZXNvdXJjZUtleSh2KTsKIH0KIAogYm9vbCBHclRleHR1cmU6Ok5lZWRzUmVzaXppbmcoY29uc3QgR3JSZXNvdXJjZUtleSYga2V5KSB7Ci0gICAgcmV0dXJuIFNrVG9Cb29sKGtleS5nZXRSZXNvdXJjZUZsYWdzKCkgJiBrU3RyZXRjaFRvUE9UX1RleHR1cmVGbGFnKTsKKyAgICByZXR1cm4gMCAhPSAoa2V5LmdldFZhbHVlMzIoMykgJiBrTlBPVF9UZXh0dXJlQml0KTsKK30KKworYm9vbCBHclRleHR1cmU6OklzU2NyYXRjaFRleHR1cmUoY29uc3QgR3JSZXNvdXJjZUtleSYga2V5KSB7CisgICAgcmV0dXJuIDAgIT0gKGtleS5nZXRWYWx1ZTMyKDMpICYga1NjcmF0Y2hfVGV4dHVyZUJpdCk7CiB9CiAKIGJvb2wgR3JUZXh0dXJlOjpOZWVkc0ZpbHRlcmluZyhjb25zdCBHclJlc291cmNlS2V5JiBrZXkpIHsKLSAgICByZXR1cm4gU2tUb0Jvb2woa2V5LmdldFJlc291cmNlRmxhZ3MoKSAmIGtGaWx0ZXJfVGV4dHVyZUZsYWcpOworICAgIHJldHVybiAwICE9IChrZXkuZ2V0VmFsdWUzMigzKSAmIGtGaWx0ZXJfVGV4dHVyZUJpdCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvZ3B1L1NrR3B1RGV2aWNlLmNwcCBiL3NyYy9ncHUvU2tHcHVEZXZpY2UuY3BwCmluZGV4IGY0YzRjZjYuLjdiMDZkNjAgMTAwNjQ0Ci0tLSBhL3NyYy9ncHUvU2tHcHVEZXZpY2UuY3BwCisrKyBiL3NyYy9ncHUvU2tHcHVEZXZpY2UuY3BwCkBAIC0xMTA0LDcgKzExMDQsNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIC8vIGlmIHRoZSBlbnRpcmUgdGV4dHVyZSBpcyBhbHJlYWR5IGluIG91ciBjYWNoZSB0aGVuIG5vIHJlYXNvbiB0byB0aWxlIGl0Ci0gICAgaWYgKEdySXNCaXRtYXBJbkNhY2hlKGZDb250ZXh0LCBiaXRtYXAsICZwYXJhbXMpKSB7CisgICAgaWYgKHRoaXMtPmlzQml0bWFwSW5UZXh0dXJlQ2FjaGUoYml0bWFwLCBwYXJhbXMpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTE4NDgsNiArMTg0OCwyMiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKK2Jvb2wgU2tHcHVEZXZpY2U6OmlzQml0bWFwSW5UZXh0dXJlQ2FjaGUoY29uc3QgU2tCaXRtYXAmIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlUGFyYW1zJiBwYXJhbXMpIGNvbnN0IHsKKyAgICB1aW50NjRfdCBrZXkgPSBiaXRtYXAuZ2V0R2VuZXJhdGlvbklEKCk7CisgICAga2V5IHw9ICgodWludDY0X3QpIGJpdG1hcC5waXhlbFJlZk9mZnNldCgpKSA8PCAzMjsKKworICAgIEdyVGV4dHVyZURlc2MgZGVzYzsKKyAgICBkZXNjLmZXaWR0aCA9IGJpdG1hcC53aWR0aCgpOworICAgIGRlc2MuZkhlaWdodCA9IGJpdG1hcC5oZWlnaHQoKTsKKyAgICBkZXNjLmZDb25maWcgPSBTa0JpdG1hcENvbmZpZzJHclBpeGVsQ29uZmlnKGJpdG1hcC5jb25maWcoKSk7CisKKyAgICBHckNhY2hlRGF0YSBjYWNoZURhdGEoa2V5KTsKKworICAgIHJldHVybiB0aGlzLT5jb250ZXh0KCktPmlzVGV4dHVyZUluQ2FjaGUoZGVzYywgY2FjaGVEYXRhLCAmcGFyYW1zKTsKK30KKworCiBTa0RldmljZSogU2tHcHVEZXZpY2U6Om9uQ3JlYXRlQ29tcGF0aWJsZURldmljZShTa0JpdG1hcDo6Q29uZmlnIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPcGFxdWUsCkBAIC0xODY3LDEwICsxODgzLDEwIEBACiAjaWYgQ0FDSEVfQ09NUEFUSUJMRV9ERVZJQ0VfVEVYVFVSRVMKICAgICAvLyBsYXllcnMgYXJlIG5ldmVyIGRyYXcgaW4gcmVwZWF0IG1vZGVzLCBzbyB3ZSBjYW4gcmVxdWVzdCBhbiBhcHByb3gKICAgICAvLyBtYXRjaCBhbmQgaWdub3JlIGFueSBwYWRkaW5nLgotICAgIGNvbnN0IEdyQ29udGV4dDo6U2NyYXRjaFRleE1hdGNoIG1hdGNoID0gKGtTYXZlTGF5ZXJfVXNhZ2UgPT0gdXNhZ2UpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyQ29udGV4dDo6a0FwcHJveF9TY3JhdGNoVGV4TWF0Y2ggOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JDb250ZXh0OjprRXhhY3RfU2NyYXRjaFRleE1hdGNoOwotICAgIHRleHR1cmUgPSBmQ29udGV4dC0+bG9ja1NjcmF0Y2hUZXh0dXJlKGRlc2MsIG1hdGNoKTsKKyAgICBHckNvbnRleHQ6OlNjcmF0Y2hUZXhNYXRjaCBtYXRjaFR5cGUgPSAoa1NhdmVMYXllcl9Vc2FnZSA9PSB1c2FnZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JDb250ZXh0OjprQXBwcm94X1NjcmF0Y2hUZXhNYXRjaCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHckNvbnRleHQ6OmtFeGFjdF9TY3JhdGNoVGV4TWF0Y2g7CisgICAgdGV4dHVyZSA9IGZDb250ZXh0LT5sb2NrU2NyYXRjaFRleHR1cmUoZGVzYywgbWF0Y2hUeXBlKTsKICNlbHNlCiAgICAgdHVucmVmLnJlc2V0KGZDb250ZXh0LT5jcmVhdGVVbmNhY2hlZFRleHR1cmUoZGVzYywgTlVMTCwgMCkpOwogICAgIHRleHR1cmUgPSB0dW5yZWYuZ2V0KCk7CmRpZmYgLS1naXQgYS9zcmMvZ3B1L1NrR3IuY3BwIGIvc3JjL2dwdS9Ta0dyLmNwcAppbmRleCBiYzk5NmNmLi43OWJjNzVkIDEwMDY0NAotLS0gYS9zcmMvZ3B1L1NrR3IuY3BwCisrKyBiL3NyYy9ncHUvU2tHci5jcHAKQEAgLTU2LDM0ICs1Niw4IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXZvaWQgZ2VuZXJhdGVfYml0bWFwX2NhY2hlX2lkKGNvbnN0IFNrQml0bWFwJiBiaXRtYXAsIEdyQ2FjaGVJRCogaWQpIHsKLSAgICAvLyBPdXIgaWQgaW5jbHVkZXMgdGhlIG9mZnNldCwgd2lkdGgsIGFuZCBoZWlnaHQgc28gdGhhdCBiaXRtYXBzIGNyZWF0ZWQgYnkgZXh0cmFjdFN1YnNldCgpCi0gICAgLy8gYXJlIHVuaXF1ZS4KLSAgICB1aW50MzJfdCBnZW5JRCA9IGJpdG1hcC5nZXRHZW5lcmF0aW9uSUQoKTsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gYml0bWFwLnBpeGVsUmVmT2Zmc2V0KCk7Ci0gICAgaW50MTZfdCB3aWR0aCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KGJpdG1hcC53aWR0aCgpKTsKLSAgICBpbnQxNl90IGhlaWdodCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KGJpdG1hcC5oZWlnaHQoKSk7Ci0KLSAgICBHckNhY2hlSUQ6OktleSBrZXk7ICAgICAgICAKLSAgICBtZW1jcHkoa2V5LmZEYXRhOCwgJmdlbklELCA0KTsKLSAgICBtZW1jcHkoa2V5LmZEYXRhOCArIDQsICZ3aWR0aCwgMik7Ci0gICAgbWVtY3B5KGtleS5mRGF0YTggKyA2LCAmaGVpZ2h0LCAyKTsKLSAgICBtZW1jcHkoa2V5LmZEYXRhOCArIDgsICZvZmZzZXQsIHNpemVvZihzaXplX3QpKTsKLSAgICBHUl9TVEFUSUNfQVNTRVJUKHNpemVvZihrZXkpID49IDggKyBzaXplb2Yoc2l6ZV90KSk7Ci0gICAgc3RhdGljIGNvbnN0IEdyQ2FjaGVJRDo6RG9tYWluIGdCaXRtYXBUZXh0dXJlRG9tYWluID0gR3JDYWNoZUlEOjpHZW5lcmF0ZURvbWFpbigpOwotICAgIGlkLT5yZXNldChnQml0bWFwVGV4dHVyZURvbWFpbiwga2V5KTsKLX0KLQotdm9pZCBnZW5lcmF0ZV9iaXRtYXBfdGV4dHVyZV9kZXNjKGNvbnN0IFNrQml0bWFwJiBiaXRtYXAsIEdyVGV4dHVyZURlc2MqIGRlc2MpIHsKLSAgICBkZXNjLT5mRmxhZ3MgPSBrTm9uZV9HclRleHR1cmVGbGFnczsKLSAgICBkZXNjLT5mV2lkdGggPSBiaXRtYXAud2lkdGgoKTsKLSAgICBkZXNjLT5mSGVpZ2h0ID0gYml0bWFwLmhlaWdodCgpOwotICAgIGRlc2MtPmZDb25maWcgPSBTa0JpdG1hcENvbmZpZzJHclBpeGVsQ29uZmlnKGJpdG1hcC5jb25maWcoKSk7Ci0gICAgZGVzYy0+ZlNhbXBsZUNudCA9IDA7Ci19Ci0KIHN0YXRpYyBHclRleHR1cmUqIHNrX2dyX2NyZWF0ZV9iaXRtYXBfdGV4dHVyZShHckNvbnRleHQqIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHclRleHR1cmVQYXJhbXMqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0JpdG1hcCYgb3JpZ0JpdG1hcCkgewogICAgIFNrQXV0b0xvY2tQaXhlbHMgYWxwKG9yaWdCaXRtYXApOwpAQCAtOTcsNyArNzEsMTEgQEAKICAgICBjb25zdCBTa0JpdG1hcCogYml0bWFwID0gJm9yaWdCaXRtYXA7CiAKICAgICBHclRleHR1cmVEZXNjIGRlc2M7Ci0gICAgZ2VuZXJhdGVfYml0bWFwX3RleHR1cmVfZGVzYygqYml0bWFwLCAmZGVzYyk7CisgICAgZGVzYy5mV2lkdGggPSBiaXRtYXAtPndpZHRoKCk7CisgICAgZGVzYy5mSGVpZ2h0ID0gYml0bWFwLT5oZWlnaHQoKTsKKyAgICBkZXNjLmZDb25maWcgPSBTa0JpdG1hcENvbmZpZzJHclBpeGVsQ29uZmlnKGJpdG1hcC0+Y29uZmlnKCkpOworCisgICAgR3JDYWNoZURhdGEgY2FjaGVEYXRhKGtleSk7CiAKICAgICBpZiAoU2tCaXRtYXA6OmtJbmRleDhfQ29uZmlnID09IGJpdG1hcC0+Y29uZmlnKCkpIHsKICAgICAgICAgLy8gYnVpbGRfY29tcHJlc3NlZF9kYXRhIGRvZXNuJ3QgZG8gbnBvdC0+cG90IGV4cGFuc2lvbgpAQCAtMTEzLDMzICs5MSwzMSBAQAogICAgICAgICAgICAgLy8gb3VyIGNvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHRyaW1tZWQsIHNvIHBhc3Mgd2lkdGgoKSBmb3IgaXRzCiAgICAgICAgICAgICAvLyAicm93Qnl0ZXMiLCBzaW5jZSB0aGV5IGFyZSB0aGUgc2FtZSBub3cuCiAKLSAgICAgICAgICAgIGlmIChjYWNoZSkgewotICAgICAgICAgICAgICAgIEdyQ2FjaGVJRCBjYWNoZUlEOwotICAgICAgICAgICAgICAgIGdlbmVyYXRlX2JpdG1hcF9jYWNoZV9pZChvcmlnQml0bWFwLCAmY2FjaGVJRCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC0+Y3JlYXRlVGV4dHVyZShwYXJhbXMsIGRlc2MsIGNhY2hlSUQsCisgICAgICAgICAgICBpZiAoR3JDYWNoZURhdGE6OmtTY3JhdGNoX0NhY2hlSUQgIT0ga2V5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN0eC0+Y3JlYXRlVGV4dHVyZShwYXJhbXMsIGRlc2MsIGNhY2hlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPndpZHRoKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBHclRleHR1cmUqIHJlc3VsdCA9IGN0eC0+bG9ja1NjcmF0Y2hUZXh0dXJlKGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHckNvbnRleHQ6OmtFeGFjdF9TY3JhdGNoVGV4TWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JDb250ZXh0OjprRXhhY3RfU2NyYXRjaFRleE1hdGNoKTsKICAgICAgICAgICAgICAgICByZXN1bHQtPndyaXRlUGl4ZWxzKDAsIDAsIGJpdG1hcC0+d2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+aGVpZ2h0KCksIGRlc2MuZkNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UuZ2V0KCkpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9CisKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG9yaWdCaXRtYXAuY29weVRvKCZ0bXBCaXRtYXAsIFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZyk7CiAgICAgICAgICAgICAvLyBub3cgYml0bWFwIHBvaW50cyB0byBvdXIgdGVtcCwgd2hpY2ggaGFzIGJlZW4gcHJvbW90ZWQgdG8gMzJiaXRzCiAgICAgICAgICAgICBiaXRtYXAgPSAmdG1wQml0bWFwOwotICAgICAgICAgICAgZGVzYy5mQ29uZmlnID0gU2tCaXRtYXBDb25maWcyR3JQaXhlbENvbmZpZyhiaXRtYXAtPmNvbmZpZygpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChjYWNoZSkgeworICAgIGRlc2MuZkNvbmZpZyA9IFNrQml0bWFwQ29uZmlnMkdyUGl4ZWxDb25maWcoYml0bWFwLT5jb25maWcoKSk7CisgICAgaWYgKEdyQ2FjaGVEYXRhOjprU2NyYXRjaF9DYWNoZUlEICE9IGtleSkgewogICAgICAgICAvLyBUaGlzIHRleHR1cmUgaXMgbGlrZWx5IHRvIGJlIHVzZWQgYWdhaW4gc28gbGVhdmUgaXQgaW4gdGhlIGNhY2hlCi0gICAgICAgIEdyQ2FjaGVJRCBjYWNoZUlEOwotICAgICAgICBnZW5lcmF0ZV9iaXRtYXBfY2FjaGVfaWQob3JpZ0JpdG1hcCwgJmNhY2hlSUQpOwotICAgICAgICByZXR1cm4gY3R4LT5jcmVhdGVUZXh0dXJlKHBhcmFtcywgZGVzYywgY2FjaGVJRCwKKyAgICAgICAgLy8gYnV0IGxvY2tlZC4KKyAgICAgICAgcmV0dXJuIGN0eC0+Y3JlYXRlVGV4dHVyZShwYXJhbXMsIGRlc2MsIGNhY2hlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmdldFBpeGVscygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+cm93Qnl0ZXMoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTE0OCw3ICsxMjQsOCBAQAogICAgICAgICAvLyBjYWNoZSBzbyBubyBvbmUgZWxzZSBjYW4gZmluZCBpdC4gQWRkaXRpb25hbGx5LCBvbmNlIHVubG9ja2VkLCB0aGUKICAgICAgICAgLy8gc2NyYXRjaCB0ZXh0dXJlIHdpbGwgZ28gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBmb3IgcHVyZ2luZyBzbyB3aWxsCiAgICAgICAgIC8vIGxpa2VseSBiZSBhdmFpbGFibGUgZm9yIHRoaXMgdm9sYXRpbGUgYml0bWFwIHRoZSBuZXh0IHRpbWUgYXJvdW5kLgotICAgICAgICBHclRleHR1cmUqIHJlc3VsdCA9IGN0eC0+bG9ja1NjcmF0Y2hUZXh0dXJlKGRlc2MsIEdyQ29udGV4dDo6a0V4YWN0X1NjcmF0Y2hUZXhNYXRjaCk7CisgICAgICAgIEdyVGV4dHVyZSogcmVzdWx0ID0gY3R4LT5sb2NrU2NyYXRjaFRleHR1cmUoZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JDb250ZXh0OjprRXhhY3RfU2NyYXRjaFRleE1hdGNoKTsKICAgICAgICAgcmVzdWx0LT53cml0ZVBpeGVscygwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmZDb25maWcsCkBAIC0xNTgsMzcgKzEzNSwzMiBAQAogICAgIH0KIH0KIAotYm9vbCBHcklzQml0bWFwSW5DYWNoZShjb25zdCBHckNvbnRleHQqIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR3JUZXh0dXJlUGFyYW1zKiBwYXJhbXMpIHsKLSAgICBHckNhY2hlSUQgY2FjaGVJRDsKLSAgICBnZW5lcmF0ZV9iaXRtYXBfY2FjaGVfaWQoYml0bWFwLCAmY2FjaGVJRCk7Ci0KLSAgICBHclRleHR1cmVEZXNjIGRlc2M7Ci0gICAgZ2VuZXJhdGVfYml0bWFwX3RleHR1cmVfZGVzYyhiaXRtYXAsICZkZXNjKTsKLSAgICByZXR1cm4gY3R4LT5pc1RleHR1cmVJbkNhY2hlKGRlc2MsIGNhY2hlSUQsIHBhcmFtcyk7Ci19CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEdyVGV4dHVyZSogR3JMb2NrQ2FjaGVkQml0bWFwVGV4dHVyZShHckNvbnRleHQqIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0JpdG1hcCYgYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyVGV4dHVyZVBhcmFtcyogcGFyYW1zKSB7CiAgICAgR3JUZXh0dXJlKiByZXN1bHQgPSBOVUxMOwogCi0gICAgYm9vbCBjYWNoZSA9ICFiaXRtYXAuaXNWb2xhdGlsZSgpOwotCi0gICAgaWYgKGNhY2hlKSB7Ci0gICAgICAgIC8vIElmIHRoZSBiaXRtYXAgaXNuJ3QgY2hhbmdpbmcgdHJ5IHRvIGZpbmQgYSBjYWNoZWQgY29weSBmaXJzdC4KLQotICAgICAgICBHckNhY2hlSUQgY2FjaGVJRDsKLSAgICAgICAgZ2VuZXJhdGVfYml0bWFwX2NhY2hlX2lkKGJpdG1hcCwgJmNhY2hlSUQpOworICAgIGlmICghYml0bWFwLmlzVm9sYXRpbGUoKSkgeworICAgICAgICAvLyBJZiB0aGUgYml0bWFwIGlzbid0IGNoYW5naW5nIHRyeSB0byBmaW5kIGEgY2FjaGVkIGNvcHkgZmlyc3QKKyAgICAgICAgdWludDY0X3Qga2V5ID0gYml0bWFwLmdldEdlbmVyYXRpb25JRCgpOworICAgICAgICBrZXkgfD0gKCh1aW50NjRfdCkgYml0bWFwLnBpeGVsUmVmT2Zmc2V0KCkpIDw8IDMyOwogCiAgICAgICAgIEdyVGV4dHVyZURlc2MgZGVzYzsKLSAgICAgICAgZ2VuZXJhdGVfYml0bWFwX3RleHR1cmVfZGVzYyhiaXRtYXAsICZkZXNjKTsKKyAgICAgICAgZGVzYy5mV2lkdGggPSBiaXRtYXAud2lkdGgoKTsKKyAgICAgICAgZGVzYy5mSGVpZ2h0ID0gYml0bWFwLmhlaWdodCgpOworICAgICAgICBkZXNjLmZDb25maWcgPSBTa0JpdG1hcENvbmZpZzJHclBpeGVsQ29uZmlnKGJpdG1hcC5jb25maWcoKSk7CiAKLSAgICAgICAgcmVzdWx0ID0gY3R4LT5maW5kVGV4dHVyZShkZXNjLCBjYWNoZUlELCBwYXJhbXMpOwotICAgIH0KLSAgICBpZiAoTlVMTCA9PSByZXN1bHQpIHsKLSAgICAgICAgcmVzdWx0ID0gc2tfZ3JfY3JlYXRlX2JpdG1hcF90ZXh0dXJlKGN0eCwgY2FjaGUsIHBhcmFtcywgYml0bWFwKTsKKyAgICAgICAgR3JDYWNoZURhdGEgY2FjaGVEYXRhKGtleSk7CisKKyAgICAgICAgcmVzdWx0ID0gY3R4LT5maW5kVGV4dHVyZShkZXNjLCBjYWNoZURhdGEsIHBhcmFtcyk7CisgICAgICAgIGlmIChOVUxMID09IHJlc3VsdCkgeworICAgICAgICAgICAgLy8gZGlkbid0IGZpbmQgYSBjYWNoZWQgY29weSBzbyBjcmVhdGUgb25lCisgICAgICAgICAgICByZXN1bHQgPSBza19ncl9jcmVhdGVfYml0bWFwX3RleHR1cmUoY3R4LCBrZXksIHBhcmFtcywgYml0bWFwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IHNrX2dyX2NyZWF0ZV9iaXRtYXBfdGV4dHVyZShjdHgsIEdyQ2FjaGVEYXRhOjprU2NyYXRjaF9DYWNoZUlELCBwYXJhbXMsIGJpdG1hcCk7CiAgICAgfQogICAgIGlmIChOVUxMID09IHJlc3VsdCkgewogICAgICAgICBHclByaW50ZigiLS0tLSBmYWlsZWQgdG8gY3JlYXRlIHRleHR1cmUgZm9yIGNhY2hlIFslZCAlZF1cbiIsCmRpZmYgLS1naXQgYS9zcmMvZ3B1L2VmZmVjdHMvR3JUZXh0dXJlU3RyaXBBdGxhcy5jcHAgYi9zcmMvZ3B1L2VmZmVjdHMvR3JUZXh0dXJlU3RyaXBBdGxhcy5jcHAKaW5kZXggMzBkN2NlNC4uOTJmNWFkNSAxMDA2NDQKLS0tIGEvc3JjL2dwdS9lZmZlY3RzL0dyVGV4dHVyZVN0cmlwQXRsYXMuY3BwCisrKyBiL3NyYy9ncHUvZWZmZWN0cy9HclRleHR1cmVTdHJpcEF0bGFzLmNwcApAQCAtMTcsNiArMTcsOSBAQAogICAgICNkZWZpbmUgVkFMSURBVEUKICNlbmRpZgogCitHUl9ERUZJTkVfUkVTT1VSQ0VfQ0FDSEVfRE9NQUlOKEdyVGV4dHVyZVN0cmlwQXRsYXMsIEdldFRleHR1cmVTdHJpcEF0bGFzRG9tYWluKQorCisKIGludDMyX3QgR3JUZXh0dXJlU3RyaXBBdGxhczo6Z0NhY2hlQ291bnQgPSAwOwogCiBHclRIYXNoVGFibGU8R3JUZXh0dXJlU3RyaXBBdGxhczo6QXRsYXNFbnRyeSwKQEAgLTcwLDcgKzczLDcgQEAKIH0KIAogR3JUZXh0dXJlU3RyaXBBdGxhczo6R3JUZXh0dXJlU3RyaXBBdGxhcyhHclRleHR1cmVTdHJpcEF0bGFzOjpEZXNjIGRlc2MpCi0gICAgOiBmQ2FjaGVLZXkoc2tfYXRvbWljX2luYygmZ0NhY2hlQ291bnQpKQorICAgIDogZkNhY2hlSUQoc2tfYXRvbWljX2luYygmZ0NhY2hlQ291bnQpKQogICAgICwgZkxvY2tlZFJvd3MoMCkKICAgICAsIGZEZXNjKGRlc2MpCiAgICAgLCBmTnVtUm93cyhkZXNjLmZIZWlnaHQgLyBkZXNjLmZSb3dIZWlnaHQpCkBAIC0xOTUsMTYgKzE5OCwxMSBAQAogICAgIHRleERlc2MuZldpZHRoID0gZkRlc2MuZldpZHRoOwogICAgIHRleERlc2MuZkhlaWdodCA9IGZEZXNjLmZIZWlnaHQ7CiAgICAgdGV4RGVzYy5mQ29uZmlnID0gZkRlc2MuZkNvbmZpZzsKLSAgICAKLSAgICBzdGF0aWMgY29uc3QgR3JDYWNoZUlEOjpEb21haW4gZ1RleHR1cmVTdHJpcEF0bGFzRG9tYWluID0gR3JDYWNoZUlEOjpHZW5lcmF0ZURvbWFpbigpOwotICAgIEdyQ2FjaGVJRDo6S2V5IGtleTsKLSAgICAqa2V5LmZEYXRhMzIgPSBmQ2FjaGVLZXk7Ci0gICAgbWVtc2V0KGtleS5mRGF0YTMyICsgMSwgMCwgc2l6ZW9mKGtleSkgLSBzaXplb2YodWludDMyX3QpKTsKLSAgICBHckNhY2hlSUQgY2FjaGVJRChnVGV4dHVyZVN0cmlwQXRsYXNEb21haW4sIGtleSk7Ci0KLSAgICBmVGV4dHVyZSA9IGZEZXNjLmZDb250ZXh0LT5maW5kVGV4dHVyZSh0ZXhEZXNjLCBjYWNoZUlELCAmcGFyYW1zKTsKKyAgICBHckNhY2hlRGF0YSBjYWNoZURhdGEoZkNhY2hlSUQpOworICAgIGNhY2hlRGF0YS5mUmVzb3VyY2VEb21haW4gPSBHZXRUZXh0dXJlU3RyaXBBdGxhc0RvbWFpbigpOworICAgIGZUZXh0dXJlID0gZkRlc2MuZkNvbnRleHQtPmZpbmRUZXh0dXJlKHRleERlc2MsIGNhY2hlRGF0YSwgJnBhcmFtcyk7CiAgICAgaWYgKE5VTEwgPT0gZlRleHR1cmUpIHsKLSAgICAgICAgZlRleHR1cmUgPSBmRGVzYy5mQ29udGV4dC0+Y3JlYXRlVGV4dHVyZSgmcGFyYW1zLCB0ZXhEZXNjLCBjYWNoZUlELCBOVUxMLCAwKTsKKyAgICAgICAgZlRleHR1cmUgPSBmRGVzYy5mQ29udGV4dC0+Y3JlYXRlVGV4dHVyZSgmcGFyYW1zLCB0ZXhEZXNjLCBjYWNoZURhdGEsIE5VTEwsIDApOwogICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IHRleHR1cmUsIHNvIGFsbCBvZiBvdXIgY2FjaGUgaW5mbyBpcyBub3cgaW52YWxpZAogICAgICAgICB0aGlzLT5pbml0TFJVKCk7CiAgICAgICAgIGZLZXlUYWJsZS5yZXdpbmQoKTsKZGlmZiAtLWdpdCBhL3NyYy9ncHUvZWZmZWN0cy9HclRleHR1cmVTdHJpcEF0bGFzLmggYi9zcmMvZ3B1L2VmZmVjdHMvR3JUZXh0dXJlU3RyaXBBdGxhcy5oCmluZGV4IDFlMWU1MDguLjIxMGQ4OGUgMTAwNjQ0Ci0tLSBhL3NyYy9ncHUvZWZmZWN0cy9HclRleHR1cmVTdHJpcEF0bGFzLmgKKysrIGIvc3JjL2dwdS9lZmZlY3RzL0dyVGV4dHVyZVN0cmlwQXRsYXMuaApAQCAtMjEsNiArMjEsOCBAQAogICovCiBjbGFzcyBHclRleHR1cmVTdHJpcEF0bGFzIHsKIHB1YmxpYzoKKyAgICBHUl9ERUNMQVJFX1JFU09VUkNFX0NBQ0hFX0RPTUFJTihHZXRUZXh0dXJlU3RyaXBBdGxhc0RvbWFpbikKKwogICAgIC8qKgogICAgICAqIERlc2NyaXB0b3Igc3RydWN0IHdoaWNoIHdlJ2xsIHVzZSBhcyBhIGhhc2ggdGFibGUga2V5CiAgICAgICoqLwpAQCAtMTU1LDcgKzE1Nyw3IEBACiAKICAgICAvLyBBIHVuaXF1ZSBJRCBmb3IgdGhpcyB0ZXh0dXJlIChmb3JtZWQgd2l0aDogZ0NhY2hlQ291bnQrKyksIHNvIHdlIGNhbiBiZSBzdXJlIHRoYXQgaWYgd2UKICAgICAvLyBnZXQgYSB0ZXh0dXJlIGJhY2sgZnJvbSB0aGUgdGV4dHVyZSBjYWNoZSwgdGhhdCBpdCdzIHRoZSBzYW1lIG9uZSB3ZSBsYXN0IHVzZWQuCi0gICAgY29uc3QgaW50MzJfdCBmQ2FjaGVLZXk7CisgICAgY29uc3QgdWludDY0X3QgZkNhY2hlSUQ7CiAKICAgICAvLyBUb3RhbCBsb2NrcyBvbiBhbGwgcm93cyAod2hlbiB0aGlzIHJlYWNoZXMgemVybywgd2UgY2FuIHVubG9jayBvdXIgdGV4dHVyZSkKICAgICBpbnQzMl90IGZMb2NrZWRSb3dzOwo=