ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggNjY5YWEwMi4uNTBjN2JjMyAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTUgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzAxMTIgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzAxMjAgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDExMjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBCZXR0ZXIgc3VwcG9ydCBmb3Igbm9uLVVTIGtleWJvYXJkcy4KLQktIFN1cHBvcnQgZm9yIFZGQVQgZmlsZXN5c3RlbSBzaG9ydCBuYW1lcy4KLQktIE1hbnkgaW1wcm92ZW1lbnRzIHRvIHRoZSBidWlsdC1pbiBkZWJ1Z2dlci4KLQktIE1vcmUgV2luMzIgc3R1ZmYuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05NzAxMjA6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gTW9yZSBrZXlib2FyZCBpbXByb3ZlbWVudHMuCisJLSBTb21lIG5ldyBwcmludGVyIGRyaXZlciBmdW5jdGlvbnMuCisJLSBNYW55IGZpeGVzIHRvIFdpbjMyIGxvYWRlci4KKwktIEJldHRlciBlZGl0IGNvbnRyb2wuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTgsMTAgKzE4LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDExMi50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAxMTIudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAxMTIudGFyLmd6Ci0gIGZ0cDovL2FyaXMuY29tL3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMTEyLnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAxMjAudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMTIwLnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMTIwLnRhci5negorICBmdHA6Ly9hcmlzLmNvbS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDEyMC50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggYmYwYzU1ZC4uMjcxMzRhZSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDExMCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3VuIEphbiAxOSAxMTo0Njo0OCAxOTk3ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogW2xvYWRlci9tb2R1bGUuY10KKwlGaXhlZCBMb2FkTW9kdWxlKCkgdG8gYWx3YXlzIGNhbGwgdGhlIERMTCBpbml0aWFsaXphdGlvbiBjb2RlLgorCisJKiBbd2luZG93cy9ldmVudC5jXQorCU1vdmVkIGFsbCB0aGUga2V5Ym9hcmQgc3R1ZmYgdG8gd2luZG93cy9rZXlib2FyZC5jCisKKwkqIFt0b29scy9idWlsZC5jXQorCUZpeGVkIFdpbjMyIHJlZ2lzdGVyIGZ1bmN0aW9ucy4KKworU2F0IEphbiAxOCAyMjoyNDo0MSAxOTk3ICBEYXZpZCBNYWtlcGVhY2UgIDxELk1ha2VwZWFjZUBtYWlsYm94LnVxLm96LmF1PgorCisgICAgICAgICogW3Rvb2xzL21ha2VkZXAuY10KKyAgICAgICAgRml4ZWQgYnVnIHdoaWNoIGNhdXNlcyBTRUdWIG9uIFNvbGFyaXMgeDg2LgorCitGcmkgSmFuIDE3IDE4OjMyOjI3IDE5OTcgIEZyYW5zIHZhbiBEb3Jzc2VsYWVyIDxkb3Jzc2VsQHJ1bGhtcGM0OS5MZWlkZW5Vbml2Lm5sPgorCisJKiBbY29udHJvbHMvZWRpdC5jXQorCUltcGxlbWVudGVkIFdNX1VORE8sIFdNX0NPTlRFWFRNRU5VICh0ZW1wb3JhcnkgdXNpbmcgV01fUkJVVFRPTlVQKSwKKwlXTV9DT01NQU5ELCBXTV9JTklUUE9QVVBNRU5VLCBXTV9TWVNLRVlET1dOLgorCUZpeGVkIEVNX1NFVFNFTCBhbmQgc29tZSBtaW5vciBidWdzIChmZWF0dXJlcykuCisJSGVuY2U6IGZ1bGx5IGZ1bmN0aW9uYWwgdW5kbyBhbmQgYSB3aW45NSBtZW51IHdpdGggdGhlIHJpZ2h0IG1vdXNlCisJCWJ1dHRvbi4KKworCSogW2luY2x1ZGUvcmVzb3VyY2VzLmhdIFtyZXNvdXJjZXMvVE9ET10gW3Jlc291cmNlcy9zeXNyZXNfPz8ucmNdCisJQWRkZWQgYSBjb250ZXh0IG1lbnUgZm9yIHRoZSBlZGl0IGNvbnRyb2wuCisJVHJhbnNsYXRpb25zLCBwbGVhc2UgLi4uCisKK0ZyaSBKYW4JMTcgMDg6Mjk6NTIgMTk5NyAgRGF2aWQgRmF1cmUgPGRhdmlkLmZhdXJlQGlmaGFteS5pbnNhLWx5b24uZnI+CisKKwkqIFt3aW5kb3dzL2V2ZW50LmNdCisJTW92ZSBFVkVOVF9Ub0FzY2lpIHRvIHdpbmRvd3Mva2V5Ym9hcmQuYyAod2hlcmUgbmFtZSBUb0FzY2lpKQorCUZpeGVkIEtleXBhZCBrZXlzIDAtOSBhbmQgLiBpbiBFVkVOVF9ldmVudF90b192a2V5LgorCUFkZGVkIDMtc3RhdGUgaGFuZGxpbmcgb2YgdG9nZ2xlIGtleXMgKENhcHNMb2NrLCBOdW1Mb2NrKSBpbiBvcmRlcgorCXRvIG1ha2UgdGhlbSB3b3JrIHdpdGggYW55IFggc2VydmVyLgorCVRvZ2dsZSBrZXlzIG5vdyBnZW5lcmF0ZSBXTV9LRVlET1dOIGFuZCBXTV9LRVlVUCBvbiBlYWNoIHByZXNzaW5nLgorCisJKiBbaW5jbHVkZS9rZXlib2FyZC5oXQorCVRvdGFsbHkgcmVwbGFjZWQgdGhlIGZpbGUgKGZvcm1lcmx5IGNvbnRhaW5pbmcgdGhlIHZrY2FzZSBkZWZpbml0aW9ucykKKwlieSB0aGUgZGVjbGFyYXRpb24gb2YgJ2V4dGVybicgdmFyaWFibGVzIGNvbnRhaW5lZCBieSBldmVudC5jIGFuZCB1c2VkCisJYnkga2V5Ym9hcmQuYworCQorCSogW3dpbmRvd3Mva2V5Ym9hcmQuY10KKwlTdGFydGVkIHRvIHJld3JpdGUgVmtLZXlTY2FuIGFuZCBNYXBWaXJ0dWFsS2V5LCB0byBtYWtlIHRoZW0gdXNlIHRoZSAKKwl0YWJsZSBrZXljMnZrZXkgb3IgWCBmdW5jdGlvbnMgb25seS4KKwlUb0FzY2lpIDogYWRkZWQga2V5cGFkIDAtOSBhbmQgLiBzcGVjaWFsIGNhc2UuCisJQ2hhbmdlZCB0b2dnbGUga2V5cyBhY3RpdmUgbWFzayBmcm9tIDB4ODAgdG8gMHgxLgorCisJKiBbbWlzYy9rZXlib2FyZC5jXQorCUZpbGUgZGVsZXRlZC4gQ29udGVudHMgbW92ZWQgdG8gd2luZG93cy9rZXlib2FyZC5jLgorCisJKiBbbWlzYy9tYWluLmNdCisJQWRkZWQgcHV0ZW52IFhLQl9ESVNBQkxFIHRvIGRpc2FibGUgWEtCIGV4dGVuc2lvbiAod2hpY2gsIHdoZW4KKwlwcmVzZW50LCBjYXVzZXMgQWx0R3IgdG8gY2hhbmdlIGtleWJvYXJkIGdyb3VwIGluc3RlYWQgb2YgYmVpbmcgYQorCW1vZGlmaWVyKS4KKworVHVlIEphbiAxNCAyMjo1Njo0MyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgorCisJKiBbd2luZG93cy9ldmVudC5jXQorCURvIG5vdCBhc3N1bWUgTnVtTG9ja01hc2sgaXMgTW9kMk1hc2ssIGJ1dCBjb21wdXRlIGl0IGJ5IHNjYW5uaW5nCisJb3V0cHV0IG9mIFhHZXRNb2RpZmllck1hcHBpbmcgZm9yIFhLX051bV9Mb2NrLgorCitUdWUgSmFuIDE0IDE1OjQ5OjQ5IDE5OTcgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbbG9hZGVyL3BlXyouY10gW2luY2x1ZGUvcGVleGUuaF0gW2luY2x1ZGUvcmVzb3VyY2UzMi5oXQorCSAgW2RlYnVnZ2VyLyouY10KKwlHZW5lcmFsIGNsZWFuIHVwLgorCUNoYW5nZWQgZGVmaW5lcy9zdHJ1Y3R1cmVzIHRvIG1hdGNoIFdpbmRvd3MgTlQgU0RLLgorCisJKiBbbG9hZGVyL21haW4uY10KKwlEb24ndCBjcmFzaCBvbiBlbXB0eSBjb21tYW5kLWxpbmUuCisKKwkqIFt3aW5kb3dzL3dpbnBvcy5jXQorCXdpbnBvcy5jIG1hZGUgd2luMzIgY2xlYW4uCisKKwkqIFttaXNjL250ZGxsLmNdCisJU29tZSBzdHJpbmcgY29udmVyc2lvbiBhZGRpdGlvbnMuCisKKwkqIFtmaWxlcy9maWxlLmNdCisJR2V0RmlsZUF0dHJpYnV0ZXMvR2V0VGVtcEZpbGVOYW1lIGZpeGVkLgorCisJKiBbbWlzYy92ZXIuY10KKwlWZXJJbnN0YWxsRmlsZSBpbXBsZW1lbnRlZC4KKworTW9uIEphbiAxMyAxNTowMzoxMSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgorCisJKiBbdG9vbHMvYnVpbGQuY106IFVzZSBQUkVGSVggYWxzbyBpbiBzdGFicyBtZXNzYWdlcy4KKworTW9uIEphbiAxMyAxMDo0MDozMyAxOTk3ICBKb2huIEhhcnZleSA8am9obkBkaXZpc2lvbi5jby51az4KKworCSogW2dyYXBoaWNzL3dpbjE2ZHJ2LypdIFtpbmNsdWRlL3dpbjE2ZHJ2LmhdCisJTWFueSBmaXhlcyBhbmQgc29tZSBuZXcgZmVhdHVyZXMuCisKKwkqIFtncmFwaGljcy94MTFkcnYvZm9udC5jXSBbZ3JhcGhpY3MveDExZHJ2L2luaXQuY10KKwkgIFtpbmNsdWRlL3gxMWRydi5oXSBbb2JqZWN0cy9mb250LmNdCisJR2V0VGV4dE1ldHJpY3MoKSBtb3ZlZCB0byBncmFwaGljcyBkcml2ZXIuCisKKwkqIFtpZjE2MzIvZ2RpLnNwZWNdIFttaXNjL2ZvbnRlbmdpbmUuY10gW21pc2MvTWFrZWZpbGUuaW5dCisJTmV3IGR1bW15IEVuZ2luZUVudW1lcmF0ZUZvbnQsIEVuZ2luZVJlYWxpemVGb250IGZ1bmN0aW9ucy4KKworCSogW2luY2x1ZGUvd2luZG93cy5oXQorCVRFWFRGT1JNMTYgYW5kIEZPTlRJTkZPMTYgc3RydWN0dXJlIGRlZmluaXRpb25zIG1vdmVkIGhlcmUgZnJvbQorCWluY2x1ZGUvd2luMTZkcnYuaAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTYXQgSmFuIDExIDE4OjE3OjU5IDE5OTcgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgogCiAJKiBbY29udHJvbHMvbWVudS5jXQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tYm8uYyBiL2NvbnRyb2xzL2NvbWJvLmMKaW5kZXggZGFjYzc2MC4uNzI1OWFlYyAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tYm8uYworKysgYi9jb250cm9scy9jb21iby5jCkBAIC0xNTksNyArMTU5LDcgQEAKICAgICAgbHBoYy0+UmVjdEJ1dHRvbiA9IHJlY3Q7CiAgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCA9IGxwaGMtPlJlY3RCdXR0b24ucmlnaHQgLSA2IC0gQ0JpdFdpZHRoOwogICAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSA9IGxwaGMtPlJlY3RCdXR0b24udG9wICsgbHBobC0+U3RkSXRlbUhlaWdodDsKLSAgICAgU2V0V2luZG93UG9zKGh3bmQsIDAsIDAsIDAsIHJlY3QucmlnaHQgLXJlY3QubGVmdCArIDIqU1lTTUVUUklDU19DWEJPUkRFUiwKKyAgICAgU2V0V2luZG93UG9zMzIoaHduZCwgMCwgMCwgMCwgcmVjdC5yaWdodCAtcmVjdC5sZWZ0ICsgMipTWVNNRVRSSUNTX0NYQk9SREVSLAogCQkgbHBobC0+U3RkSXRlbUhlaWdodCArIDIqU1lTTUVUUklDU19DWUJPUkRFUiwKIAkJIFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9TRU5EQ0hBTkdJTkcgfCBTV1BfTk9BQ1RJVkFURSk7CiAgICAgIGRwcmludGZfY29tYm8oc3RkZGViLChjc3R5bGUgJiAzKT09Q0JTX0RST1BET1dOID8gIkNCU19EUk9QRE9XTlxuIjogIkNCU19EUk9QRE9XTkxJU1RcbiIpOwpAQCAtMjA5LDggKzIwOSw4IEBACiB7CiAgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKLSAgaWYgKGxwaGMtPmhXbmRFZGl0KSBEZXN0cm95V2luZG93KCBscGhjLT5oV25kRWRpdCApOwotICBpZiAobHBoYy0+aFduZExCb3gpIERlc3Ryb3lXaW5kb3coIGxwaGMtPmhXbmRMQm94ICk7CisgIGlmIChscGhjLT5oV25kRWRpdCkgRGVzdHJveVdpbmRvdzMyKCBscGhjLT5oV25kRWRpdCApOworICBpZiAobHBoYy0+aFduZExCb3gpIERlc3Ryb3lXaW5kb3czMiggbHBoYy0+aFduZExCb3ggKTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQkgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCArIDIsbHBoYy0+UmVjdEJ1dHRvbi50b3AgKyAyLAogCQkgICAgIDAsIDAsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOwogICB9Ci0gIGlmICghSXNXaW5kb3dWaXNpYmxlKGh3bmQpIHx8ICFscGhsLT5iUmVkcmF3RmxhZyAKKyAgaWYgKCFJc1dpbmRvd1Zpc2libGUxNihod25kKSB8fCAhbHBobC0+YlJlZHJhd0ZsYWcgCiAgICAgICB8fCAobHBoYy0+ZHdTdHlsZSAmIDMpICE9IENCU19EUk9QRE9XTkxJU1QpIAogICB7CiAgICAgLyogd2UgZG9uJ3Qgd2FudCB0byBkcmF3IGFuIGVudHJ5IHdoZW4gdGhlcmUgaXMgYW4gZWRpdCBjb250cm9sICovCkBAIC02MTYsNyArNjE2LDcgQEAKICAgaWYgKHdQYXJhbSAhPSBscGhjLT5Ecm9wRG93blZpc2libGUpIHsKICAgICBscGhjLT5Ecm9wRG93blZpc2libGUgPSB3UGFyYW07CiAgICAgR2V0V2luZG93UmVjdDMyKGh3bmQsJnJlY3QpOwotICAgIFNldFdpbmRvd1BvcyhscGhjLT5oV25kTEJveCwgMCwgcmVjdC5sZWZ0LCByZWN0LnRvcCtscGhjLT5MQm94VG9wLCAwLCAwLAorICAgIFNldFdpbmRvd1BvczMyKGxwaGMtPmhXbmRMQm94LCAwLCByZWN0LmxlZnQsIHJlY3QudG9wK2xwaGMtPkxCb3hUb3AsIDAsIDAsCiAJCSBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUgfAogICAgICAgICAgICAgICAgICAod1BhcmFtID8gU1dQX1NIT1dXSU5ET1cgOiBTV1BfSElERVdJTkRPVykpOwogICAgIGlmICghd1BhcmFtKSBTZXRGb2N1czMyKGh3bmQpOwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAKICAgaWYgKChjUmVjdC5ib3R0b20gLSBjUmVjdC50b3ApID4KICAgICAgIChscGhsLT5TdGRJdGVtSGVpZ2h0ICsgMipTWVNNRVRSSUNTX0NZQk9SREVSKSkgewotICAgIFNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCAKKyAgICBTZXRXaW5kb3dQb3MzMihod25kLCAwLCAwLCAwLCAKIAkJIGNSZWN0LnJpZ2h0LWNSZWN0LmxlZnQsCiAJCSBscGhsLT5TdGRJdGVtSGVpZ2h0KzIqU1lTTUVUUklDU19DWUJPUkRFUiwgCiAJCSBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PUkVEUkFXIHwgU1dQX05PQUNUSVZBVEUgKTsKQEAgLTY3MywxMiArNjczLDEyIEBACiAgICAgfQogICAgIC8qIG90aGVyd2lzZSB3ZSBuZWVkIHRvIG1ha2UgdGhlIGNsaWVudCBpbmNsdWRlIHRoZSBidXR0b24gKi8KICAgICBlbHNlCi0gICAgICBTZXRXaW5kb3dQb3MoaHduZCwgMCwgMCwgMCwgbHBoYy0+UmVjdEJ1dHRvbi5yaWdodCwKKyAgICAgIFNldFdpbmRvd1BvczMyKGh3bmQsIDAsIDAsIDAsIGxwaGMtPlJlY3RCdXR0b24ucmlnaHQsCiAJCSAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQrMipTWVNNRVRSSUNTX0NZQk9SREVSLAogCQkgICBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PUkVEUkFXIHwgU1dQX05PQUNUSVZBVEUpOwogCiAgICAgICBpZiAoKGxwaGMtPmR3U3R5bGUgJiAzKSAhPSBDQlNfRFJPUERPV05MSVNUKQotICAgICAgICBTZXRXaW5kb3dQb3MobHBoYy0+aFduZEVkaXQsIDAsIDAsIDAsIGxwaGMtPlJlY3RCdXR0b24ubGVmdCwKKyAgICAgICAgU2V0V2luZG93UG9zMzIobHBoYy0+aFduZEVkaXQsIDAsIDAsIDAsIGxwaGMtPlJlY3RCdXR0b24ubGVmdCwKIAkJICAgICBscGhsLT5TdGRJdGVtSGVpZ2h0LAogCQkgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUiApOwogICB9CkBAIC05MzQsNyArOTM0LDcgQEAKICAgdG9wID0gMDsKICAgaGRjID0gQmVnaW5QYWludDE2KCBod25kLCAmcHMgKTsKIAotICBpZiAoIUlzV2luZG93VmlzaWJsZShod25kKSB8fCAhbHBobC0+YlJlZHJhd0ZsYWcpIHsKKyAgaWYgKCFJc1dpbmRvd1Zpc2libGUxNihod25kKSB8fCAhbHBobC0+YlJlZHJhd0ZsYWcpIHsKICAgICBFbmRQYWludDE2KGh3bmQsICZwcyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTEyMDIsNyArMTIwMiw3IEBACiAgIGlmICgobFJlY3QuYm90dG9tLWxSZWN0LnRvcCA8IDMqbHBobC0+U3RkSXRlbUhlaWdodCkgfHwgZHcpIHsKICAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiICAgIENoYW5naW5nOyB0b3RIZWlnaHQgJWQgIFN0ZEl0ZW1IZ2h0ICVkICBkdyAlZFxuIiwKIAkJICB0b3RoZWlnaHQsbHBobC0+U3RkSXRlbUhlaWdodCxkdyk7Ci0gICAgU2V0V2luZG93UG9zKGhXbmRMQm94LCAwLCBsUmVjdC5sZWZ0LCBsUmVjdC50b3AsIAorICAgIFNldFdpbmRvd1BvczMyKGhXbmRMQm94LCAwLCBsUmVjdC5sZWZ0LCBsUmVjdC50b3AsIAogCQkgbHdSZWN0LnJpZ2h0LWx3UmVjdC5sZWZ0K2R3LCB0b3RoZWlnaHQrMipTWVNNRVRSSUNTX0NZQk9SREVSLCAKIAkJIFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgfCBTV1BfTk9SRURSQVcgfCBTV1BfTk9BQ1RJVkFURSApOwogICB9CmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggZTUzMTAzZS4uYzhiMjQxZCAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJsb2NhbC5oIgorI2luY2x1ZGUgInJlc291cmNlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKQEAgLTg4LDcgKzg5LDExIEBACiAJSU5UMzIgQnVmTGltaXQ7CiAJSU5UMzIgQnVmU2l6ZTsKIAlCT09MMzIgVGV4dENoYW5nZWQ7Ci0JQk9PTDMyIENhblVuZG87CisJSU5UMzIgVW5kb0luc2VydExlbjsKKwlJTlQzMiBVbmRvUG9zOworCUlOVDMyIFVuZG9CdWZTaXplOworCUhMT0NBTDMyIGhVbmRvQnVmOworCUxQU1RSIFVuZG9UZXh0OwogCUJPT0wzMiBSZWRyYXc7CiAJSU5UMzIgU2VsU3RhcnQ7CQkvKiBvZmZzZXQgb2Ygc2VsZWN0aW9uIHN0YXJ0LCA9PSBTZWxFbmQgaWYgbm8gc2VsZWN0aW9uICovCiAJSU5UMzIgU2VsRW5kOwkJLyogb2Zmc2V0IG9mIHNlbGVjdGlvbiBlbmQgPT0gY3VycmVudCBjYXJldCBwb3NpdGlvbiAqLwpAQCAtMTM1LDcgKzE0MCw3IEBACiAJCSAgICAoTFBBUkFNKSh3bmRQdHIpLT5od25kU2VsZiApKQogI2RlZmluZSBEUFJJTlRGX0VESVRfTVNHMTYoc3RyKSBcCiAgICAgZHByaW50Zl9lZGl0KHN0ZGRlYiwgXAotCQkgImVkaXQ6IDE2IGJpdCA6ICIgc3RyICI6IGh3bmQ9JTA4eCwgd1BhcmFtPSUwOHgsIGxQYXJhbT0lMDh4XG4gICIsIFwKKwkJICJlZGl0OiAxNiBiaXQgOiAiIHN0ciAiOiBod25kPSUwOHgsIHdQYXJhbT0lMDh4LCBsUGFyYW09JTA4eFxuIiwgXAogCQkgKFVJTlQzMilod25kLCAoVUlOVDMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0pCiAjZGVmaW5lIERQUklOVEZfRURJVF9NU0czMihzdHIpIFwKICAgICBkcHJpbnRmX2VkaXQoc3RkZGViLCBcCkBAIC0xNjYsMTIgKzE3MSwxNCBAQAogc3RhdGljIEJPT0wzMiAgRURJVF9HZXRSZWRyYXcoV05EICp3bmRQdHIpOwogc3RhdGljIHZvaWQgICAgRURJVF9HZXRTZWwoV05EICp3bmRQdHIsIExQSU5UMzIgcywgTFBJTlQzMiBlKTsKIHN0YXRpYyBJTlQzMiAgIEVESVRfR2V0VGV4dFdpZHRoKFdORCAqd25kUHRyKTsKK3N0YXRpYyBMUFNUUiAgIEVESVRfR2V0VW5kb1BvaW50ZXIoV05EICp3bmRQdHIpOwogc3RhdGljIElOVDMyICAgRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KFdORCAqd25kUHRyKTsKIHN0YXRpYyBJTlQzMiAgIEVESVRfR2V0V25kV2lkdGgoV05EICp3bmRQdHIpOwogc3RhdGljIElOVDMyICAgRURJVF9HZXRYT2Zmc2V0KFdORCAqd25kUHRyKTsKIHN0YXRpYyB2b2lkICAgIEVESVRfSW52YWxpZGF0ZVRleHQoV05EICp3bmRQdHIsIElOVDMyIHN0YXJ0LCBJTlQzMiBlbmQpOwogc3RhdGljIElOVDMyICAgRURJVF9MaW5lRnJvbVduZFkoV05EICp3bmRQdHIsIElOVDMyIHkpOwogc3RhdGljIEJPT0wzMiAgRURJVF9NYWtlRml0KFdORCAqd25kUHRyLCBJTlQzMiBzaXplKTsKK3N0YXRpYyBCT09MMzIgIEVESVRfTWFrZVVuZG9GaXQoV05EICp3bmRQdHIsIElOVDMyIHNpemUpOwogc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlQmFja3dhcmQoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpOwogc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlRG93bndhcmQoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpOwogc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlRW5kKFdORCAqd25kUHRyLCBCT09MMzIgZXh0ZW5kKTsKQEAgLTE4NSw2ICsxOTIsOCBAQAogc3RhdGljIHZvaWQgICAgRURJVF9QYWludExpbmUoV05EICp3bmRQdHIsIEhEQzMyIGhkYywgSU5UMzIgbGluZSwgQk9PTDMyIHJldik7CiBzdGF0aWMgSU5UMzIgICBFRElUX1BhaW50VGV4dChXTkQgKnduZFB0ciwgSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiBsaW5lLCBJTlQzMiBjb2wsIElOVDMyIGNvdW50LCBCT09MMzIgcmV2KTsKIHN0YXRpYyB2b2lkICAgIEVESVRfUmVsZWFzZVBvaW50ZXIoV05EICp3bmRQdHIpOworc3RhdGljIHZvaWQgICAgRURJVF9SZWxlYXNlVW5kb1BvaW50ZXIoV05EICp3bmRQdHIpOworc3RhdGljIHZvaWQgICAgRURJVF9TZXRTZWwoV05EICp3bmRQdHIsIElOVDMyIG5zLCBJTlQzMiBuZSk7CiBzdGF0aWMgSU5UMzIgICBFRElUX1duZFhGcm9tQ29sKFdORCAqd25kUHRyLCBJTlQzMiBsaW5lLCBJTlQzMiBjb2wpOwogc3RhdGljIElOVDMyICAgRURJVF9XbmRZRnJvbUxpbmUoV05EICp3bmRQdHIsIElOVDMyIGxpbmUpOwogc3RhdGljIElOVDMyICAgRURJVF9Xb3JkQnJlYWtQcm9jKExQU1RSIHMsIElOVDMyIGluZGV4LCBJTlQzMiBjb3VudCwgSU5UMzIgYWN0aW9uKTsKQEAgLTIzMyw2ICsyNDIsOCBAQAogCiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0NoYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0NsZWFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9XTV9Db21tYW5kKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9XTV9Db250ZXh0TWVudShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ29weShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ3V0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9DcmVhdGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CkBAIC0yNDQsNiArMjU1LDcgQEAKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fR2V0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fR2V0VGV4dExlbmd0aChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fSFNjcm9sbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fSW5pdE1lbnVQb3B1cChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fS2V5RG93bihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fS2lsbEZvY3VzKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9MQnV0dG9uRGJsQ2xrKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwpAQCAtMjU4LDYgKzI3MCw4IEBACiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX1NldFJlZHJhdyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fU2V0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fU2l6ZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fU3lzS2V5RG93bihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fVGltZXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX1ZTY3JvbGwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiAKIApAQCAtNjQ4LDYgKzY2MiwyMyBAQAogCQlsUmVzdWx0ID0gRURJVF9XTV9DbGVhcih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CiAKKwljYXNlIFdNX0NPTU1BTkQ6CisJCURQUklOVEZfRURJVF9NU0czMigiV01fQ09NTUFORCIpOworCQlsUmVzdWx0ID0gRURJVF9XTV9Db21tYW5kKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworLyoKKyAqCUZJWE1FOiB3aGVuIHRoaXMgb25lIGlzIGFkZGVkIHRvIFdJTkUsIGNoYW5nZSBSQlVUVE9OVVAgdG8gQ09OVEVYVE1FTlUKKyAqCUZ1cnRoZXJtb3JlLCBjb29yZGluYXRlIGNvbnZlcnNpb24gc2hvdWxkIG5vIGxvbmdlciBiZSByZXF1aXJlZAorICoKKyAqCWNhc2UgV01fQ09OVEVYVE1FTlU6CisgKi8KKyAJY2FzZSBXTV9SQlVUVE9OVVA6CisJCURQUklOVEZfRURJVF9NU0czMigiV01fUkJVVFRPTlVQIik7CisJCUNsaWVudFRvU2NyZWVuMTYod25kUHRyLT5od25kU2VsZiwgKExQUE9JTlQxNikmbFBhcmFtKTsKKwkJbFJlc3VsdCA9IEVESVRfV01fQ29udGV4dE1lbnUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCiAJY2FzZSBXTV9DT1BZOgogCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0NPUFkiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fQ29weSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTY5OCw2ICs3MjksMTEgQEAKIAkJbFJlc3VsdCA9IEVESVRfV01fSFNjcm9sbCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CiAKKwljYXNlIFdNX0lOSVRNRU5VUE9QVVA6CisJCURQUklOVEZfRURJVF9NU0czMigiV01fSU5JVE1FTlVQT1BVUCIpOworCQlsUmVzdWx0ID0gRURJVF9XTV9Jbml0TWVudVBvcHVwKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKwogCWNhc2UgV01fS0VZRE9XTjoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9LRVlET1dOIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX0tleURvd24od25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC03NzIsNiArODA4LDE2IEBACiAJCWxSZXN1bHQgPSBFRElUX1dNX1NpemUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOwogCisJY2FzZSBXTV9TWVNLRVlET1dOOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX1NZU0tFWURPV04iKTsKKwkJbFJlc3VsdCA9IEVESVRfV01fU3lzS2V5RG93bih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNX1RJTUVSOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX1RJTUVSIik7CisJCWxSZXN1bHQgPSBFRElUX1dNX1RpbWVyKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKwogCWNhc2UgV01fVlNDUk9MTDoKIAkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9WU0NST0xMIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX1ZTY3JvbGwod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC0xMTA1LDcgKzExNTEsOCBAQAogICoJRURJVF9HZXRTZWwKICAqCiAgKglCZXdhcmU6IFRoaXMgaXMgbm90IHRoZSBmdW5jdGlvbiBjYWxsZWQgb24gRU1fR0VUU0VMLgotICoJKGJlY2F1c2UgcyBjYW4gYmUgZ3JlYXRlciB0aGFuIGUpLgorICoJCVRoaXMgaXMgdGhlIHVub3JkZXJlZCB2ZXJzaW9uIHVzZWQgaW50ZXJuYWxseQorICoJCShzIGNhbiBiZSA+IGUpLiAgTm8gcmV0dXJuIHZhbHVlIGVpdGhlci4KICAqCiAgKi8KIHN0YXRpYyB2b2lkIEVESVRfR2V0U2VsKFdORCAqd25kUHRyLCBMUElOVDMyIHMsIExQSU5UMzIgZSkKQEAgLTExMzQsNiArMTE4MSwyNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICoJRURJVF9HZXRVbmRvUG9pbnRlcgorICoKKyAqCVRoaXMgYWN0cyBhcyBhIExvY2FsTG9jazMyKCksIGJ1dCBpdCBsb2NrcyBvbmx5IG9uY2UuICBUaGlzIHdheQorICoJeW91IGNhbiBjYWxsIGl0IHdoZW5ldmVyIHlvdSBsaWtlLCB3aXRob3V0IHVubG9ja2luZy4KKyAqCisgKi8KK3N0YXRpYyBMUFNUUiBFRElUX0dldFVuZG9Qb2ludGVyKFdORCAqd25kUHRyKQoreworCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKKworCWlmICghZXMtPlVuZG9UZXh0ICYmIGVzLT5oVW5kb0J1ZikKKwkJZXMtPlVuZG9UZXh0ID0gKExQU1RSKUxvY2FsTG9jazMyKGVzLT5oVW5kb0J1Zik7CisJcmV0dXJuIGVzLT5VbmRvVGV4dDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICoJRURJVF9HZXRWaXNpYmxlTGluZUNvdW50CiAgKgogICovCkBAIC0xMTk3LDcgKzEyNjIsNyBAQAogCVJFQ1QzMiByY1VwZGF0ZTsKIAlJTlQzMiBsOwogCi0JaWYgKGVuZCA9PSBzdGFydCApCisJaWYgKGVuZCA9PSBzdGFydCkKIAkJcmV0dXJuOwogCiAJaWYgKGVuZCA9PSAtMSkKQEAgLTEyNzgsOCArMTM0MywxMSBAQAogCiAJaWYgKHNpemUgPD0gZXMtPkJ1ZlNpemUpCiAJCXJldHVybiBUUlVFOwotCWlmIChzaXplID4gZXMtPkJ1ZkxpbWl0KQorCWlmIChzaXplID4gZXMtPkJ1ZkxpbWl0KSB7CisJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fTUFYVEVYVCBzZW50XG4iKTsKKwkJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fTUFYVEVYVCk7CiAJCXJldHVybiBGQUxTRTsKKwl9CiAJc2l6ZSA9ICgoc2l6ZSAvIEdST1dMRU5HVEgpICsgMSkgKiBHUk9XTEVOR1RIOwogCWlmIChzaXplID4gZXMtPkJ1ZkxpbWl0KQogCQlzaXplID0gZXMtPkJ1ZkxpbWl0OwpAQCAtMTI5NCw2ICsxMzYyLDggQEAKIAkJCWVzLT5CdWZTaXplID0gTUlOKExvY2FsU2l6ZTMyKGVzLT5oQnVmMzIpIC0gMSwgZXMtPkJ1ZkxpbWl0KTsKIAkJCWlmIChlcy0+QnVmU2l6ZSA8IHNpemUpIHsKIAkJCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlRml0OiBGQUlMRUQgISAgV2Ugbm93IGhhdmUgJWQrMVxuIiwgZXMtPkJ1ZlNpemUpOworCQkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fRVJSU1BBQ0Ugc2VudFxuIik7CisJCQkJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fRVJSU1BBQ0UpOwogCQkJCXJldHVybiBGQUxTRTsKIAkJCX0KIAkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VGaXQ6IFdlIG5vdyBoYXZlICVkKzFcbiIsIGVzLT5CdWZTaXplKTsKQEAgLTEzMDYsMTIgKzEzNzYsNTEgQEAKIAkJCWVzLT5CdWZTaXplID0gTUlOKExPQ0FMX1NpemUod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmMTYpIC0gMSwgZXMtPkJ1ZkxpbWl0KTsKIAkJCWlmIChlcy0+QnVmU2l6ZSA8IHNpemUpIHsKIAkJCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlRml0OiBGQUlMRUQgISAgV2Ugbm93IGhhdmUgJWQrMVxuIiwgZXMtPkJ1ZlNpemUpOworCQkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fRVJSU1BBQ0Ugc2VudFxuIik7CisJCQkJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fRVJSU1BBQ0UpOwogCQkJCXJldHVybiBGQUxTRTsKIAkJCX0KIAkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VGaXQ6IFdlIG5vdyBoYXZlICVkKzFcbiIsIGVzLT5CdWZTaXplKTsKIAkJCXJldHVybiBUUlVFOwogCQl9CiAJfQorCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VGaXQ6IFJlYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fRVJSU1BBQ0Ugc2VudFxuIik7CisJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fRVJSU1BBQ0UpOworCXJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRURJVF9NYWtlVW5kb0ZpdAorICoKKyAqCVRyeSB0byBmaXQgc2l6ZSArIDEgYnl0ZXMgaW4gdGhlIHVuZG8gYnVmZmVyLgorICoKKyAqLworc3RhdGljIEJPT0wzMiBFRElUX01ha2VVbmRvRml0KFdORCAqd25kUHRyLCBJTlQzMiBzaXplKQoreworCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKKwlITE9DQUwzMiBoTmV3OworCisJaWYgKHNpemUgPD0gZXMtPlVuZG9CdWZTaXplKQorCQlyZXR1cm4gVFJVRTsKKwlzaXplID0gKChzaXplIC8gR1JPV0xFTkdUSCkgKyAxKSAqIEdST1dMRU5HVEg7CisKKwlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlVW5kb0ZpdDogdHJ5aW5nIHRvIFJlQWxsb2MgdG8gJWQrMVxuIiwgc2l6ZSk7CisKKwlFRElUX1JlbGVhc2VVbmRvUG9pbnRlcih3bmRQdHIpOworCWlmICgoaE5ldyA9IExvY2FsUmVBbGxvYzMyKGVzLT5oVW5kb0J1Ziwgc2l6ZSArIDEsIDApKSkgeworCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlVW5kb0ZpdDogT2xkIGhhbmRsZSAlMDh4LCBuZXcgaGFuZGxlICUwOHhcbiIsIGVzLT5oVW5kb0J1ZiwgaE5ldyk7CisJCWVzLT5oVW5kb0J1ZiA9IGhOZXc7CisJCWVzLT5VbmRvQnVmU2l6ZSA9IExvY2FsU2l6ZTMyKGVzLT5oVW5kb0J1ZikgLSAxOworCQlpZiAoZXMtPlVuZG9CdWZTaXplIDwgc2l6ZSkgeworCQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfTWFrZVVuZG9GaXQ6IEZBSUxFRCAhICBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+VW5kb0J1ZlNpemUpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VVbmRvRml0OiBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+VW5kb0J1ZlNpemUpOworCQlyZXR1cm4gVFJVRTsKKwl9CiAJcmV0dXJuIEZBTFNFOwogfQogCkBAIC0xMzQwLDcgKzE0NDksNyBAQAogCQllLS07CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiB9CiAKQEAgLTEzNzEsNyArMTQ4MCw3IEBACiAJfQogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIGUpOworCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7CiAJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCkBAIC0xMzk2LDcgKzE1MDUsNyBAQAogCWUgPSBsaSArIGxsOwogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIGUpOworCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7CiAJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCkBAIC0xNDI3LDcgKzE1MzYsNyBAQAogCQllKys7CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiB9CiAKQEAgLTE0NTIsNyArMTU2MSw3IEBACiAJZSA9IGxpOwogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIGUpOworCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7CiAJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCkBAIC0xNDgzLDcgKzE1OTIsNyBAQAogCX0KIAlpZiAoIWV4dGVuZCkKIAkJcyA9IGU7Ci0JRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBlKTsKKwlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGUpOwogCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKIH0KIApAQCAtMTUxMiw3ICsxNjIxLDcgQEAKIAl9CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiB9CiAKQEAgLTE1NDEsNyArMTY1MCw3IEBACiAJfQogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIGUpOworCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7CiAJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCkBAIC0xNTc2LDcgKzE2ODUsNyBAQAogCX0KIAlpZiAoIWV4dGVuZCkKIAkJcyA9IGU7Ci0JRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBlKTsKKwlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGUpOwogCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKIH0KIApAQCAtMTYxMSw3ICsxNzIwLDcgQEAKIAl9CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiB9CiAKQEAgLTE3MDgsMTkgKzE4MTcsNzcgQEAKIAogCWlmICghZXMpCiAJCXJldHVybjsKLQlpZiAoZXMtPnRleHQgJiYgKGVzLT5oQnVmMzIgfHwgZXMtPmhCdWYxNikpCi0gICAgICAgIHsKKwlpZiAoZXMtPnRleHQgJiYgKGVzLT5oQnVmMzIgfHwgZXMtPmhCdWYxNikpIHsKIAkJaWYgKGVzLT5oQnVmMzIpCiAJCQlMb2NhbFVubG9jazMyKGVzLT5oQnVmMzIpOwogCQllbHNlCiAJCQlMT0NBTF9VbmxvY2sod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmMTYpOwotICAgICAgICB9CisJfQogCWVzLT50ZXh0ID0gTlVMTDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICoJRURJVF9SZWxlYXNlVW5kb1BvaW50ZXIKKyAqCisgKglUaGlzIGlzIHRoZSBvbmx5IGhlbHBlciBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBlcyA9IE5VTEwuCisgKglJdCBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBFZGl0V25kUHJvYygpIHRvIHVubG9jayB0aGUgYnVmZmVyLgorICoKKyAqLworc3RhdGljIHZvaWQgRURJVF9SZWxlYXNlVW5kb1BvaW50ZXIoV05EICp3bmRQdHIpCit7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJaWYgKCFlcykKKwkJcmV0dXJuOworCWlmIChlcy0+VW5kb1RleHQgJiYgZXMtPmhVbmRvQnVmKQorCQlMb2NhbFVubG9jazMyKGVzLT5oVW5kb0J1Zik7CisJZXMtPlVuZG9UZXh0ID0gTlVMTDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRURJVF9TZXRTZWwKKyAqCisgKglCZXdhcmU6IFRoaXMgaXMgbm90IHRoZSBmdW5jdGlvbiBjYWxsZWQgb24gRU1fU0VUU0VMLgorICoJCVRoaXMgaXMgdGhlIHVub3JkZXJlZCB2ZXJzaW9uIHVzZWQgaW50ZXJuYWxseQorICoJCShzIGNhbiBiZSA+IGUpLiAgRG9lc24ndCBhY2NlcHQgLTEgcGFyYW1ldGVycyBlaXRoZXIuCisgKgkJTm8gcmFuZ2UgY2hlY2tpbmcuCisgKgorICovCitzdGF0aWMgdm9pZCBFRElUX1NldFNlbChXTkQgKnduZFB0ciwgSU5UMzIgbnMsIElOVDMyIG5lKQoreworCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKKwlMUkVTVUxUIHBvczsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisKKwlFRElUX0VNX0dldFNlbCh3bmRQdHIsIChXUEFSQU0zMikmcywgKExQQVJBTSkmZSk7CisJZXMtPlNlbFN0YXJ0ID0gbnM7CisJZXMtPlNlbEVuZCA9IG5lOworCWlmIChFRElUX0dldFJlZHJhdyh3bmRQdHIpKSB7CisJCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkgeworCQkJcG9zID0gRURJVF9FTV9Qb3NGcm9tQ2hhcih3bmRQdHIsIG5lLCAwKTsKKwkJCVNldENhcmV0UG9zKChJTlQxNilMT1dPUkQocG9zKSwgKElOVDE2KUhJV09SRChwb3MpKTsKKwkJfQorCQlPUkRFUl9JTlQzMihzLCBucyk7CisJCU9SREVSX0lOVDMyKHMsIG5lKTsKKwkJT1JERVJfSU5UMzIoZSwgbnMpOworCQlPUkRFUl9JTlQzMihlLCBuZSk7CisJCU9SREVSX0lOVDMyKG5zLCBuZSk7CisJCWlmIChlICE9IG5zKSB7CisJCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgcywgZSk7CisJCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgbnMsIG5lKTsKKwkJfSBlbHNlCisJCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgcywgbmUpOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICoJRURJVF9XbmRYRnJvbUNvbAogICoKICAqCUNhbGN1bGF0ZXMsIGZvciBhIGdpdmVuIGxpbmUgYW5kIGNvbHVtbiwgdGhlIFgtY29vcmRpbmF0ZSBvbiB0aGUgc2NyZWVuLgpAQCAtMTg0NSw3ICsyMDEyLDcgQEAKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKLQlyZXR1cm4gKExSRVNVTFQpZXMtPkNhblVuZG87CisJcmV0dXJuIChMUkVTVUxUKShlcy0+VW5kb0luc2VydExlbiB8fCBsc3RybGVuMzJBKEVESVRfR2V0VW5kb1BvaW50ZXIod25kUHRyKSkpOwogfQogCiAKQEAgLTE4ODcsNyArMjA1NCw4IEBACiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCi0JZXMtPkNhblVuZG8gPSBGQUxTRTsKKwllcy0+VW5kb0luc2VydExlbiA9IDA7CisJKkVESVRfR2V0VW5kb1BvaW50ZXIod25kUHRyKSA9ICdcMCc7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyNzcsNyArMjQ0NSw2IEBACiAJSU5UMzIgdHcgPSBFRElUX0dldFRleHRXaWR0aCh3bmRQdHIpOwogCUlOVDMyIGR4OwogCUlOVDMyIGR5OwotCVBPSU5UMzIgcG9zOwogCiAJaWYgKG5mdiA+PSBsYykKIAkJbmZ2ID0gbGMgLSAxOwpAQCAtMjI4Nyw4ICsyNDU0LDYgQEAKIAlkeCA9IHhvZmYgLSBueG9mZjsKIAlkeSA9IEVESVRfV25kWUZyb21MaW5lKHduZFB0ciwgZnYpIC0gRURJVF9XbmRZRnJvbUxpbmUod25kUHRyLCBuZnYpOwogCWlmIChkeCB8fCBkeSkgewotCQlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1czMyKCkpCi0JCQlIaWRlQ2FyZXQod25kUHRyLT5od25kU2VsZik7CiAJCWlmIChFRElUX0dldFJlZHJhdyh3bmRQdHIpKQogCQkJU2Nyb2xsV2luZG93MzIod25kUHRyLT5od25kU2VsZiwgZHgsIGR5LCBOVUxMLCBOVUxMKTsKIAkJZXMtPkZpcnN0VmlzaWJsZUxpbmUgPSBuZnY7CkBAIC0yMjk5LDExICsyNDY0LDYgQEAKIAkJaWYgKElzSFNjcm9sbEJhcih3bmRQdHIpKQogCQkJU2V0U2Nyb2xsUG9zMzIod25kUHRyLT5od25kU2VsZiwgU0JfSE9SWiwKIAkJCQlFRElUX1dNX0hTY3JvbGwod25kUHRyLCBFTV9HRVRUSFVNQjE2LCAwKSwgVFJVRSk7Ci0JCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkgewotCQkJR2V0Q2FyZXRQb3MzMigmcG9zKTsKLQkJCVNldENhcmV0UG9zKHBvcy54ICsgZHgsIHBvcy55ICsgZHkpOwotCQkJU2hvd0NhcmV0KHduZFB0ci0+aHduZFNlbGYpOwotCQl9CiAJfQogCWlmIChJc011bHRpTGluZSh3bmRQdHIpKQogCQlyZXR1cm4gVFJVRTsKQEAgLTIzMzUsNDYgKzI0OTUsMTAxIEBACiAgKgogICoJRU1fUkVQTEFDRVNFTAogICoKLSAqCUZJWE1FOiB3UGFyYW0gaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIG1haW50YWluIGFuIHVuZG8gYnVmZmVyCi0gKglmb3IgdGhpcyBvcGVyYXRpb24uCi0gKgogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1JlcGxhY2VTZWwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKKwlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAJTFBDU1RSIHN0ciA9IChMUENTVFIpbFBhcmFtOwogCUlOVDMyIHN0cmwgPSBsc3RybGVuMzJBKHN0cik7CiAJSU5UMzIgdGwgPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgdXRsOwogCUlOVDMyIHM7CiAJSU5UMzIgZTsKIAlJTlQzMiBpOwogCUxQU1RSIHA7CiAJTFBTVFIgdGV4dDsKKwlMUFNUUiB1dGV4dDsKIAlCT09MMzIgcmVkcmF3OwogCi0JRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwotCU9SREVSX0lOVDMyKHMsZSk7Ci0JaWYgKCFFRElUX01ha2VGaXQod25kUHRyLCB0bCAtIChlIC0gcykgKyBzdHJsKSkgewotCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogbm90aWZpY2F0aW9uIEVOX01BWFRFWFQgc2VudFxuIik7Ci0JCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX01BWFRFWFQpOworCUVESVRfRU1fR2V0U2VsKHduZFB0ciwgKFdQQVJBTTMyKSZzLCAoTFBBUkFNKSZlKTsKKworCWlmICgocyA9PSBlKSAmJiAhc3RybCkKIAkJcmV0dXJuIDA7CisKKwlpZiAoIUVESVRfTWFrZUZpdCh3bmRQdHIsIHRsIC0gKGUgLSBzKSArIHN0cmwpKQorCQlyZXR1cm4gMDsKKworCXRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKKwl1dGV4dCA9IEVESVRfR2V0VW5kb1BvaW50ZXIod25kUHRyKTsKKwlpZiAoZSAhPSBzKSB7CisJCS8qIHRoZXJlIGlzIHNvbWV0aGluZyB0byBiZSBkZWxldGVkICovCisJCWlmICgoQk9PTDMyKXdQYXJhbSkgeworCQkJLyogd2UgaGF2ZSB0byBiZSBhYmxlIHRvIHVuZG8gKi8KKwkJCXV0bCA9IGxzdHJsZW4zMkEodXRleHQpOworCQkJaWYgKCFlcy0+VW5kb0luc2VydExlbiAmJiAoKnV0ZXh0ICYmIChzID09IGVzLT5VbmRvUG9zKSkpIHsKKwkJCQkvKiB1bmRvLWJ1ZmZlciBpcyBleHRlbmRlZCB0byB0aGUgcmlnaHQgKi8KKwkJCQlFRElUX01ha2VVbmRvRml0KHduZFB0ciwgdXRsICsgZSAtIHMpOworCQkJCWxzdHJjcHluMzJBKHV0ZXh0ICsgdXRsLCB0ZXh0ICsgcywgZSAtIHMgKyAxKTsKKwkJCX0gZWxzZSBpZiAoIWVzLT5VbmRvSW5zZXJ0TGVuICYmICgqdXRleHQgJiYgKGUgPT0gZXMtPlVuZG9Qb3MpKSkgeworCQkJCS8qIHVuZG8tYnVmZmVyIGlzIGV4dGVuZGVkIHRvIHRoZSBsZWZ0ICovCisJCQkJRURJVF9NYWtlVW5kb0ZpdCh3bmRQdHIsIHV0bCArIGUgLSBzKTsKKwkJCQlmb3IgKHAgPSB1dGV4dCArIHV0bCA7IHAgPj0gdXRleHQgOyBwLS0pCisJCQkJCXBbZSAtIHNdID0gcFswXTsKKwkJCQlmb3IgKGkgPSAwICwgcCA9IHV0ZXh0IDsgaSA8IGUgLSBzIDsgaSsrKQorCQkJCQlwW2ldID0gKHRleHQgKyBzKVtpXTsKKwkJCQllcy0+VW5kb1BvcyA9IHM7CisJCQl9IGVsc2UgeworCQkJCS8qIG5ldyB1bmRvLWJ1ZmZlciAqLworCQkJCUVESVRfTWFrZVVuZG9GaXQod25kUHRyLCBlIC0gcyk7CisJCQkJbHN0cmNweW4zMkEodXRleHQsIHRleHQgKyBzLCBlIC0gcyArIDEpOworCQkJCWVzLT5VbmRvUG9zID0gczsKKwkJCX0KKwkJCS8qIGFueSBkZWxldGlvbiBtYWtlcyB0aGUgb2xkIGluc2VydGlvbi11bmRvIGludmFsaWQgKi8KKwkJCWVzLT5VbmRvSW5zZXJ0TGVuID0gMDsKKwkJfSBlbHNlCisJCQlFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcih3bmRQdHIsIDAsIDApOworCisJCS8qIG5vdyBkZWxldGUgKi8KKwkJbHN0cmNweTMyQSh0ZXh0ICsgcywgdGV4dCArIGUpOworCX0KKwlpZiAoc3RybCkgeworCQkvKiB0aGVyZSBpcyBhbiBpbnNlcnRpb24gKi8KKwkJaWYgKChCT09MMzIpd1BhcmFtKSB7CisJCQkvKiB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gdW5kbyAqLworCQkJaWYgKChzID09IGVzLT5VbmRvUG9zKSB8fAorCQkJCQkoKGVzLT5VbmRvSW5zZXJ0TGVuKSAmJgorCQkJCQkocyA9PSBlcy0+VW5kb1BvcyArIGVzLT5VbmRvSW5zZXJ0TGVuKSkpCisJCQkJLyoKKwkJCQkgKiBpbnNlcnRpb24gaXMgbmV3IGFuZCBhdCBkZWxldGUgcG9zaXRpb24gb3IKKwkJCQkgKiBhbiBleHRlbnNpb24gdG8gZWl0aGVyIGxlZnQgb3IgcmlnaHQKKwkJCQkgKi8KKwkJCQllcy0+VW5kb0luc2VydExlbiArPSBzdHJsOworCQkJZWxzZSB7CisJCQkJLyogbmV3IGluc2VydGlvbiB1bmRvICovCisJCQkJZXMtPlVuZG9Qb3MgPSBzOworCQkJCWVzLT5VbmRvSW5zZXJ0TGVuID0gc3RybDsKKwkJCQkvKiBuZXcgaW5zZXJ0aW9uIG1ha2VzIG9sZCBkZWxldGUtYnVmZmVyIGludmFsaWQgKi8KKwkJCQkqdXRleHQgPSAnXDAnOworCQkJfQorCQl9IGVsc2UKKwkJCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0ciwgMCwgMCk7CisKKwkJLyogbm93IGluc2VydCAqLworCQl0bCA9IGxzdHJsZW4zMkEodGV4dCk7CisJCWZvciAocCA9IHRleHQgKyB0bCA7IHAgPj0gdGV4dCArIHMgOyBwLS0pCisJCQlwW3N0cmxdID0gcFswXTsKKwkJZm9yIChpID0gMCAsIHAgPSB0ZXh0ICsgcyA7IGkgPCBzdHJsIDsgaSsrKQorCQkJcFtpXSA9IHN0cltpXTsKKwkJaWYoSXNVcHBlcih3bmRQdHIpKQorCQkJQ2hhclVwcGVyQnVmZjMyQShwLCBzdHJsKTsKKwkJZWxzZSBpZihJc0xvd2VyKHduZFB0cikpCisJCQlDaGFyTG93ZXJCdWZmMzJBKHAsIHN0cmwpOworCQlzICs9IHN0cmw7CiAJfQogCXJlZHJhdyA9IEVESVRfR2V0UmVkcmF3KHduZFB0cik7CiAJRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCBGQUxTRSwgMCk7Ci0JRURJVF9XTV9DbGVhcih3bmRQdHIsIDAsIDApOwotCXRsID0gRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7Ci0JRURJVF9HZXRTZWwod25kUHRyLCBOVUxMLCAmZSk7Ci0JdGV4dCA9IEVESVRfR2V0UG9pbnRlcih3bmRQdHIpOwotCWZvciAocCA9IHRleHQgKyB0bCA7IHAgPj0gdGV4dCArIGUgOyBwLS0pCi0JCXBbc3RybF0gPSBwWzBdOwotCWZvciAoaSA9IDAgLCBwID0gdGV4dCArIGUgOyBpIDwgc3RybCA7IGkrKykKLQkJcFtpXSA9IHN0cltpXTsKLQlpZihJc1VwcGVyKHduZFB0cikpCi0JCUNoYXJVcHBlckJ1ZmYzMkEocCwgc3RybCk7Ci0JZWxzZSBpZihJc0xvd2VyKHduZFB0cikpCi0JCUNoYXJMb3dlckJ1ZmYzMkEocCwgc3RybCk7CiAJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7Ci0JZSArPSBzdHJsOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgZSwgZSk7CisJRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBzKTsKIAlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiAJRURJVF9FTV9TZXRNb2RpZnkod25kUHRyLCBUUlVFLCAwKTsKIAlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogbm90aWZpY2F0aW9uIEVOX1VQREFURSBzZW50XG4iKTsKQEAgLTI1MTgsNiArMjczMyw5IEBACiAgKgogICoJRU1fU0VUTElNSVRURVhUCiAgKgorICoJRklYTUU6IGluIFdpbk5UIG1heHNpemUgaXMgMHg3RkZGRkZGRiAvIDB4RkZGRkZGRkYKKyAqCUhvd2V2ZXIsIHRoZSB3aW5kb3dzIHZlcnNpb24gaXMgbm90IGNvbXBsaWVkIHRvIHlldCBpbiBhbGwgb2YgZWRpdC5jCisgKgogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldExpbWl0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewpAQCAtMjY0MSw1NCArMjg1OSwyNCBAQAogICoKICAqCUVNX1NFVFNFTAogICoKLSAqCUZJWE1FOiBzcGVjcyBzdGF0ZSB0aGF0IHdlIHNob3VsZCBvcmRlciBzdGFydCBhbmQgZW5kLgotICoJCUhvd2V2ZXIsIHdlIHVzZSBpbnRlcm5hbGx5IHRoYXQgdGhpcyBpcyBub3QgdGhlIGNhc2UuCi0gKgogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFNlbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKIAlJTlQzMiBucyA9IChJTlQzMil3UGFyYW07CiAJSU5UMzIgbmUgPSAoSU5UMzIpbFBhcmFtOwotCUlOVDMyIHM7Ci0JSU5UMzIgZTsKLQlJTlQzMiBlbDsKLQlJTlQzMiBlbGk7CiAJSU5UMzIgdGwgPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7CiAKLQlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CiAJaWYgKG5zID09IC0xKSB7Ci0JCW5zID0gZTsKLQkJbmUgPSBlOwotCX0KLQlpZiAobmUgPT0gLTEpCi0JCW5lID0gZTsKLS8qCi0JT1JERVJfSU5UMzIobnMsIG5lKTsKLSovCi0JbnMgPSBNSU4obnMsIHRsKTsKLQluZSA9IE1JTihuZSwgdGwpOwotCWVzLT5TZWxTdGFydCA9IG5zOwotCWVzLT5TZWxFbmQgPSBuZTsKLQlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1czMyKCkpIHsKLQkJZWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBuZSwgMCk7Ci0JCWVsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGVsLCAwKTsKLQkJU2V0Q2FyZXRQb3MoRURJVF9XbmRYRnJvbUNvbCh3bmRQdHIsIGVsLCBuZSAtIGVsaSksCi0JCQkJRURJVF9XbmRZRnJvbUxpbmUod25kUHRyLCBlbCkpOwotCX0KLQlpZiAoRURJVF9HZXRSZWRyYXcod25kUHRyKSkgewotCQlPUkRFUl9JTlQzMihzLCBlKTsKLQkJT1JERVJfSU5UMzIocywgbnMpOwotCQlPUkRFUl9JTlQzMihzLCBuZSk7Ci0JCU9SREVSX0lOVDMyKGUsIG5zKTsKLQkJT1JERVJfSU5UMzIoZSwgbmUpOworCQlFRElUX0dldFNlbCh3bmRQdHIsIE5VTEwsICZuZSk7CisJCW5zID0gbmU7CisJfSBlbHNlIGlmICgoIW5zKSAmJiAobmUgPT0gLTEpKQorCQluZSA9IHRsOworCWVsc2UgeworCQlucyA9IE1BWCgwLCBNSU4obnMsIHRsKSk7CisJCW5lID0gTUFYKDAsIE1JTihuZSwgdGwpKTsKIAkJT1JERVJfSU5UMzIobnMsIG5lKTsKLQkJaWYgKGUgIT0gbnMpIHsKLQkJCUVESVRfSW52YWxpZGF0ZVRleHQod25kUHRyLCBzLCBlKTsKLQkJCUVESVRfSW52YWxpZGF0ZVRleHQod25kUHRyLCBucywgbmUpOwotCQl9IGVsc2UKLQkJCUVESVRfSW52YWxpZGF0ZVRleHQod25kUHRyLCBzLCBuZSk7CiAJfQorCUVESVRfU2V0U2VsKHduZFB0ciwgbnMsIG5lKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTI3MDUsNyArMjg5Myw3IEBACiAKIAlpZiAoKElOVDE2KUxPV09SRChsUGFyYW0pID09IC0xKQogCQlucyA9IC0xOwotCWlmICgoSU5UMTYpSElXT1JEKGxQYXJhbSkgPT0gLTEpCisJaWYgKCghbnMpICYmICgoSU5UMTYpSElXT1JEKGxQYXJhbSkgPT0gLTEpKQogCQluZSA9IC0xOwogCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgbnMsIG5lKTsKIAlpZiAoIXdQYXJhbSkKQEAgLTI3ODMsMTYgKzI5NzEsMjcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqCUVNX1VORE8KKyAqCUVNX1VORE8gLyBXTV9VTkRPCiAgKgogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1VuZG8oV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlmcHJpbnRmKHN0ZG5pbXAsImVkaXQ6IEVNX1VORE86IG1lc3NhZ2Ugbm90IGltcGxlbWVudGVkXG4iKTsKLQlpZiAoSXNNdWx0aUxpbmUod25kUHRyKSkKLQkJcmV0dXJuIEZBTFNFOwotCWVsc2UKLQkJcmV0dXJuIFRSVUU7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCUxQU1RSIHV0ZXh0ID0geHN0cmR1cChFRElUX0dldFVuZG9Qb2ludGVyKHduZFB0cikpOworCisJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IGJlZm9yZSBVTkRPOmluc2VydGlvbiBsZW5ndGggPSAlZCwgZGVsZXRpb24gYnVmZmVyID0gJXNcbiIsCisJCQllcy0+VW5kb0luc2VydExlbiwgdXRleHQpOworCisJRURJVF9FTV9TZXRTZWwod25kUHRyLCBlcy0+VW5kb1BvcywgZXMtPlVuZG9Qb3MgKyBlcy0+VW5kb0luc2VydExlbik7CisJRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwKTsKKwlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCBUUlVFLCAoTFBBUkFNKXV0ZXh0KTsKKwlFRElUX0VNX1NldFNlbCh3bmRQdHIsIGVzLT5VbmRvUG9zLCBlcy0+VW5kb1BvcyArIGVzLT5VbmRvSW5zZXJ0TGVuKTsKKwlmcmVlKHV0ZXh0KTsKKworCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBhZnRlciBVTkRPOiBpbnNlcnRpb24gbGVuZ3RoID0gJWQsIGRlbGV0aW9uIGJ1ZmZlciA9ICVzXG4iLAorCQkJZXMtPlVuZG9JbnNlcnRMZW4sIEVESVRfR2V0VW5kb1BvaW50ZXIod25kUHRyKSk7CisKKwlyZXR1cm4gVFJVRTsKIH0KIAogCkBAIC0yODE0LDE4ICszMDEzLDE4IEBACiAJCQkJRURJVF9Nb3ZlSG9tZSh3bmRQdHIsIEZBTFNFKTsKIAkJCQlFRElUX01vdmVEb3dud2FyZCh3bmRQdHIsIEZBTFNFKTsKIAkJCX0gZWxzZQotCQkJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIDAsIChMUEFSQU0pIlxyXG4iKTsKKwkJCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAoV1BBUkFNMzIpVFJVRSwgKExQQVJBTSkiXHJcbiIpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgJ1x0JzoKIAkJaWYgKElzTXVsdGlMaW5lKHduZFB0cikgJiYgIUlzUmVhZE9ubHkod25kUHRyKSkKLQkJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIDAsIChMUEFSQU0pIlx0Iik7CisJCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAoV1BBUkFNMzIpVFJVRSwgKExQQVJBTSkiXHQiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaWYgKCFJc1JlYWRPbmx5KHduZFB0cikgJiYgKGMgPj0gJyAnKSAmJiAoYyAhPSAxMjcpKSB7CiAgCQkJc3RyWzBdID0gYzsKICAJCQlzdHJbMV0gPSAnXDAnOwotIAkJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIDAsIChMUEFSQU0pc3RyKTsKKyAJCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAoV1BBUkFNMzIpVFJVRSwgKExQQVJBTSlzdHIpOwogIAkJfQogCQlicmVhazsKIAl9CkBAIC0yODQwLDMwICszMDM5LDQ1IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ2xlYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlJTlQzMiBzOwotCUlOVDMyIGU7Ci0JTFBTVFIgdGV4dDsKLQlCT09MMzIgcmVkcmF3OworCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIFRSVUUsIChMUEFSQU0pIiIpOwogCi0JRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwotCWlmIChzICE9IGUpIHsKLQkJcmVkcmF3ID0gRURJVF9HZXRSZWRyYXcod25kUHRyKTsKLQkJRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCBGQUxTRSwgMCk7Ci0JCU9SREVSX0lOVDMyKHMsIGUpOwotCQl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7Ci0JCWxzdHJjcHkzMkEodGV4dCArIHMsIHRleHQgKyBlKTsKLQkJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7Ci0JCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgcyk7Ci0JCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKLQkJRURJVF9FTV9TZXRNb2RpZnkod25kUHRyLCBUUlVFLCAwKTsKLQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IG5vdGlmaWNhdGlvbiBFTl9VUERBVEUgc2VudFxuIik7Ci0JCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX1VQREFURSk7Ci0JCUVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgcmVkcmF3LCAwKTsKLQkJaWYgKHJlZHJhdykgewotCQkJSW52YWxpZGF0ZVJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgVFJVRSApOwotCQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IG5vdGlmaWNhdGlvbiBFTl9DSEFOR0Ugc2VudFxuIik7Ci0JCQlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9DSEFOR0UpOwotCQl9CisJcmV0dXJuIC0xOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglXTV9DT01NQU5ECisgKgorICovCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0NvbW1hbmQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlpZiAoSElXT1JEKHdQYXJhbSkpCisJCXJldHVybiAwOworCisJc3dpdGNoIChMT1dPUkQod1BhcmFtKSkgeworCQljYXNlIEVNX1VORE8zMjoJCisJCQlFRElUX0VNX1VuZG8od25kUHRyLCAwLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFdNX0NVVDoKKwkJCUVESVRfV01fQ3V0KHduZFB0ciwgMCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBXTV9DT1BZOgorCQkJRURJVF9XTV9Db3B5KHduZFB0ciwgMCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBXTV9QQVNURToKKwkJCUVESVRfV01fUGFzdGUod25kUHRyLCAwLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFdNX0NMRUFSOgorCQkJRURJVF9XTV9DbGVhcih3bmRQdHIsIDAsIDApOworCQkJYnJlYWs7CisJCWNhc2UgRU1fU0VUU0VMMzI6CisJCQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIC0xKTsKKwkJCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IHVua25vd24gbWVudSBpdGVtLCBwbGVhc2UgcmVwb3J0XG4iKTsKKwkJCWJyZWFrOwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC0yODcxLDYgKzMwODUsMjcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqCVdNX0NPTlRFWFRNRU5VCisgKgorICoJTm90ZTogdGhlIHJlc291cmNlIGZpbGVzIHJlc291cmNlL3N5c3Jlc18/Py5yYyBjYW5ub3QgZGVmaW5lIGEKKyAqCQlzaW5nbGUgcG9wdXAgbWVudS4gIEhlbmNlIHdlIHVzZSBhIChkdW1teSkgbWVudWJhcgorICoJCWNvbnRhaW5pbmcgdGhlIHNpbmdsZSBwb3B1cCBtZW51IGFzIGl0cyBmaXJzdCBpdGVtLgorICoKKyAqLworc3RhdGljIExSRVNVTFQgRURJVF9XTV9Db250ZXh0TWVudShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworCUhNRU5VMzIgaE1lbnUgPSBMb2FkTWVudUluZGlyZWN0MzJBKFNZU1JFU19HZXRSZXNQdHIoU1lTUkVTX01FTlVfRURJVE1FTlUpKTsKKwlITUVOVTMyIGhQb3B1cCA9IEdldFN1Yk1lbnUzMihoTWVudSwgMCk7CisKKwlUcmFja1BvcHVwTWVudTMyKGhQb3B1cCwgVFBNX0xFRlRBTElHTiB8IFRQTV9SSUdIVEJVVFRPTiwgTE9XT1JEKGxQYXJhbSksCisJCQlISVdPUkQobFBhcmFtKSwgMCwgd25kUHRyLT5od25kU2VsZiwgTlVMTCk7CisJRGVzdHJveU1lbnUzMihoTWVudSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqCVdNX0NPUFkKICAqCiAgKi8KQEAgLTI4ODEsOCArMzExNiw2IEBACiAJSEdMT0JBTDE2IGhkc3Q7CiAJTFBTVFIgdGV4dDsKIAlMUFNUUiBkc3Q7Ci0JTFBTVFIgc3JjOwotCUlOVDMyIGk7CiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CiAJaWYgKGUgPT0gcykKQEAgLTI4OTEsMTAgKzMxMjQsNyBAQAogCWhkc3QgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsIChEV09SRCkoZSAtIHMgKyAxKSk7CiAJZHN0ID0gR2xvYmFsTG9jazE2KGhkc3QpOwogCXRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKLQlzcmMgPSB0ZXh0ICsgczsKLQlmb3IgKGkgPSAwIDsgaSA8IGUgLSBzIDsgaSsrKQotCQkqZHN0KysgPSAqc3JjKys7Ci0JKmRzdCA9ICdcMCc7CisJbHN0cmNweW4zMkEoZHN0LCB0ZXh0ICsgcywgZSAtIHMgKyAxKTsKIAlHbG9iYWxVbmxvY2sxNihoZHN0KTsKIAlPcGVuQ2xpcGJvYXJkKHduZFB0ci0+aHduZFNlbGYpOwogCUVtcHR5Q2xpcGJvYXJkKCk7CkBAIC0yOTQyLDEzICszMTcyLDIxIEBACiAJCWZwcmludGYoc3RkZXJyLCAiZWRpdDogV01fQ1JFQVRFOiB1bmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KKwlpZiAoIShlcy0+aFVuZG9CdWYgPSBMb2NhbEFsbG9jMzIoTE1FTV9NT1ZFQUJMRSwgZXMtPkJ1ZlNpemUgKyAxKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBXTV9DUkVBVEU6IHVuYWJsZSB0byBhbGxvY2F0ZSB1bmRvIGJ1ZmZlclxuIik7CisJCUxvY2FsRnJlZTMyKGVzLT5oQnVmMzIpOworCQllcy0+aEJ1ZjMyID0gKEhMT0NBTDMyKU5VTEw7CisJCXJldHVybiAtMTsKKwl9CiAJZXMtPkJ1ZlNpemUgPSBMb2NhbFNpemUzMihlcy0+aEJ1ZjMyKSAtIDE7CisJZXMtPlVuZG9CdWZTaXplID0gTG9jYWxTaXplMzIoZXMtPmhVbmRvQnVmKSAtIDE7CisJRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwKTsKIAl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7CiAJKnRleHQgPSAnXDAnOwogCUVESVRfQnVpbGRMaW5lRGVmcyh3bmRQdHIpOwogCUVESVRfV01fU2V0Rm9udCh3bmRQdHIsIDAsIDApOwogCWlmIChjcy0+bHBzek5hbWUgJiYgKihjcy0+bHBzek5hbWUpICE9ICdcMCcpCi0JCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIEZBTFNFLCAoTFBBUkFNKWNzLT5scHN6TmFtZSk7CisJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIChXUEFSQU0zMilGQUxTRSwgKExQQVJBTSljcy0+bHBzek5hbWUpOwogCUVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgVFJVRSwgMCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yOTc5LDYgKzMyMTcsOCBAQAogCWZyZWUoZXMtPkxpbmVEZWZzKTsKIAlpZiAoZXMtPlRhYlN0b3BzKQogCQlmcmVlKGVzLT5UYWJTdG9wcyk7CisJRURJVF9SZWxlYXNlVW5kb1BvaW50ZXIod25kUHRyKTsKKwlMb2NhbEZyZWUzMihlcy0+aFVuZG9CdWYpOwogCUVESVRfUmVsZWFzZVBvaW50ZXIod25kUHRyKTsKIAlpZiAoZXMtPmhCdWYzMikKIAkJTG9jYWxGcmVlMzIoZXMtPmhCdWYzMik7CkBAIC0zMTU0LDYgKzMzOTQsNDkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqCVdNX0lOSVRNRU5VUE9QVVAKKyAqCisgKglGSVhNRTogdGhlIG1lc3NhZ2UgaWRlbnRpZmllcnMgaGF2ZSBiZWVuIGNob3NlbiBhcmJpdHJhcmlseSwKKyAqCQloZW5jZSB3ZSB1c2UgTUZfQllQT1NJVElPTi4KKyAqCQlXZSBtaWdodCBhcyB3ZWxsIHVzZSB0aGUgInJlYWwiIHZhbHVlcyAoYW55Ym9keSBrbm93cyA/KQorICoJCVRoZSBtZW51IGRlZmluaXRpb24gaXMgaW4gcmVzb3VyY2VzL3N5c3Jlc18/Py5yYy4KKyAqCQlPbmNlIHRoZXNlIGFyZSBPSywgd2UgYmV0dGVyIHVzZSBNRl9CWUNPTU1BTkQgaGVyZQorICoJCShhcyB3ZSBkbyBpbiBFRElUX1dNX0NvbW1hbmQoKSkuCisgKgorICovCitzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0luaXRNZW51UG9wdXAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlITUVOVTMyIGhQb3B1cCA9IChITUVOVTMyKXdQYXJhbTsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisKKwlFRElUX0VNX0dldFNlbCh3bmRQdHIsIChXUEFSQU0zMikmcywgKExQQVJBTSkmZSk7CisKKwkvKiB1bmRvICovCisJRW5hYmxlTWVudUl0ZW0zMihoUG9wdXAsIDAsIE1GX0JZUE9TSVRJT04gfAorCQkoRURJVF9FTV9DYW5VbmRvKHduZFB0ciwgMCwgMCkgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEKSk7CisJLyogY3V0ICovCisJRW5hYmxlTWVudUl0ZW0zMihoUG9wdXAsIDIsIE1GX0JZUE9TSVRJT04gfAorCQkoKGUgLSBzKSAmJiAhSXNQYXNzd29yZCh3bmRQdHIpID8gTUZfRU5BQkxFRCA6IE1GX0dSQVlFRCkpOworCS8qIGNvcHkgKi8KKwlFbmFibGVNZW51SXRlbTMyKGhQb3B1cCwgMywgTUZfQllQT1NJVElPTiB8CisJCSgoZSAtIHMpICYmICFJc1Bhc3N3b3JkKHduZFB0cikgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEKSk7CisJLyogcGFzdGUgKi8KKwlFbmFibGVNZW51SXRlbTMyKGhQb3B1cCwgNCwgTUZfQllQT1NJVElPTiB8CisJCShJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9URVhUKSA/IE1GX0VOQUJMRUQgOiBNRl9HUkFZRUQpKTsKKwkvKiBkZWxldGUgKi8KKwlFbmFibGVNZW51SXRlbTMyKGhQb3B1cCwgNSwgTUZfQllQT1NJVElPTiB8CisJCSgoZSAtIHMpID8gTUZfRU5BQkxFRCA6IE1GX0dSQVlFRCkpOworCS8qIHNlbGVjdCBhbGwgKi8KKwlFbmFibGVNZW51SXRlbTMyKGhQb3B1cCwgNywgTUZfQllQT1NJVElPTiB8CisJCShzIHx8IChlICE9IEVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIsIDAsIDApKSA/IE1GX0VOQUJMRUQgOiBNRl9HUkFZRUQpKTsKKworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKglXTV9LRVlET1dOCiAgKgogICoJSGFuZGxpbmcgb2Ygc3BlY2lhbCBrZXlzIHRoYXQgZG9uJ3QgcHJvZHVjZSBhIFdNX0NIQVIKQEAgLTMyNTUsNyArMzUzOCw3IEBACiAKIAlEZXN0cm95Q2FyZXQoKTsKIAlpZighKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpIHsKLQkJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCQlFRElUX0VNX0dldFNlbCh3bmRQdHIsIChXUEFSQU0zMikmcywgKExQQVJBTSkmZSk7CiAJCUVESVRfSW52YWxpZGF0ZVRleHQod25kUHRyLCBzLCBlKTsKIAl9CiAJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IG5vdGlmaWNhdGlvbiBFTl9LSUxMRk9DVVMgc2VudFxuIik7CkBAIC0zMzIwLDggKzM2MDMsOSBAQAogCQlFRElUX0dldFNlbCh3bmRQdHIsICZzLCBOVUxMKTsKIAllbHNlCiAJCXMgPSBlOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJU2V0VGltZXIzMih3bmRQdHItPmh3bmRTZWxmLCAwLCAxMDAsIE5VTEwpOwogCXJldHVybiAwOwogfQogCkBAIC0zMzMzLDggKzM2MTcsMTAgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9MQnV0dG9uVXAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gd25kUHRyLT5od25kU2VsZikKKwlpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gd25kUHRyLT5od25kU2VsZikgeworCQlLaWxsVGltZXIzMih3bmRQdHItPmh3bmRTZWxmLCAwKTsKIAkJUmVsZWFzZUNhcHR1cmUoKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzNjYsOCArMzY1MiwxMiBAQAogCQljID0gRURJVF9Db2xGcm9tV25kWCh3bmRQdHIsIGwsIHgpOwogCQlFRElUX0dldFNlbCh3bmRQdHIsICZzLCBOVUxMKTsKIAkJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKLQkJRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBsaSArIGMpOworCQlFRElUX1NldFNlbCh3bmRQdHIsIHMsIGxpICsgYyk7CiAJfQorCS8qCisJICoJRklYTUU6IGdvdHRhIGRvIHNvbWUgc2Nyb2xsaW5nIGlmIG91dHNpZGUgY2xpZW50IChmb3JtYXQgPykKKwkgKgkJYXJlYS4gIE1heWJlIHJlc2V0IHRoZSB0aW1lciA/CisJICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzOTAsNyArMzY4MCw5IEBACiAJUkVDVDMyIHJjOwogCVJFQ1QzMiByY0xpbmU7CiAJUkVDVDMyIHJjUmduOwotCUJPT0wzMiByZXYgPSBJc1dpbmRvd0VuYWJsZWQod25kUHRyLT5od25kU2VsZikgJiYKKyAJTFJFU1VMVCBwb3M7CisgCUlOVDMyIGU7CisJQk9PTDMyIHJldiA9IElzV2luZG93RW5hYmxlZDMyKHduZFB0ci0+aHduZFNlbGYpICYmCiAJCQkJKChHZXRGb2N1czMyKCkgPT0gd25kUHRyLT5od25kU2VsZikgfHwKIAkJCQkJKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpOwogCkBAIC0zNDAxLDcgKzM2OTMsNyBAQAogCWlmIChoRm9udCkKIAkJb2xkRm9udCA9IChIRk9OVDMyKVNlbGVjdE9iamVjdDMyKGhkYywgaEZvbnQpOwogCUVESVRfU0VORF9DVExDT0xPUih3bmRQdHIsIGhkYyk7Ci0JaWYgKCFJc1dpbmRvd0VuYWJsZWQod25kUHRyLT5od25kU2VsZikpCisJaWYgKCFJc1dpbmRvd0VuYWJsZWQzMih3bmRQdHItPmh3bmRTZWxmKSkKIAkJU2V0VGV4dENvbG9yKGhkYywgR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpKTsKIAlHZXRDbGlwQm94MzIoaGRjLCAmcmNSZ24pOwogCWZvciAoaSA9IGZ2IDsgaSA8PSBNSU4oZnYgKyB2bGMsIGZ2ICsgbGMgLSAxKSA7IGkrKyApIHsKQEAgLTM0MTAsNiArMzcwMiwxMSBAQAogCQkJRURJVF9QYWludExpbmUod25kUHRyLCBoZGMsIGksIHJldik7CiAJfQogCWlmIChoRm9udCkgU2VsZWN0T2JqZWN0MzIoaGRjLCBvbGRGb250KTsKKwlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1czMyKCkpIHsKKwkJRURJVF9HZXRTZWwod25kUHRyLCBOVUxMLCAmZSk7CisJCXBvcyA9IEVESVRfRU1fUG9zRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwkJU2V0Q2FyZXRQb3MoKElOVDE2KUxPV09SRChwb3MpLCAoSU5UMTYpSElXT1JEKHBvcykpOworCX0KIAlFbmRQYWludDMyKHduZFB0ci0+aHduZFNlbGYsICZwcyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNDI4LDcgKzM3MjUsNyBAQAogCU9wZW5DbGlwYm9hcmQod25kUHRyLT5od25kU2VsZik7CiAJaWYgKChoc3JjID0gR2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKSkpIHsKIAkJc3JjID0gKExQU1RSKUdsb2JhbExvY2sxNihoc3JjKTsKLQkJRURJVF9FTV9SZXBsYWNlU2VsKHduZFB0ciwgMCwgKExQQVJBTSlzcmMpOworCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAoV1BBUkFNMzIpVFJVRSwgKExQQVJBTSlzcmMpOwogCQlHbG9iYWxVbmxvY2sxNihoc3JjKTsKIAl9CiAJQ2xvc2VDbGlwYm9hcmQoKTsKQEAgLTM0NjMsNyArMzc2MCw3IEBACiAKIAlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CiAJQ3JlYXRlQ2FyZXQod25kUHRyLT5od25kU2VsZiwgMCwgMiwgRURJVF9HZXRMaW5lSGVpZ2h0KHduZFB0cikpOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9TZXRTZWwod25kUHRyLCBzLCBlKTsKIAlpZighKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpCiAJCUVESVRfSW52YWxpZGF0ZVRleHQod25kUHRyLCBzLCBlKTsKIAlTaG93Q2FyZXQod25kUHRyLT5od25kU2VsZik7CkBAIC0zNTAyLDcgKzM3OTksNyBAQAogCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkgewogCQlEZXN0cm95Q2FyZXQoKTsKIAkJQ3JlYXRlQ2FyZXQod25kUHRyLT5od25kU2VsZiwgMCwgMiwgRURJVF9HZXRMaW5lSGVpZ2h0KHduZFB0cikpOwotCQlFRElUX0VNX1NldFNlbDE2KHduZFB0ciwgcywgZSk7CisJCUVESVRfU2V0U2VsKHduZFB0ciwgcywgZSk7CiAJCVNob3dDYXJldCh3bmRQdHItPmh3bmRTZWxmKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0zNTMyLDEwICszODI5LDcgQEAKIHsKIAlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIC0xKTsKIAlpZiAobFBhcmFtKQotCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAwLCBsUGFyYW0pOwotCWVsc2UKLSAgICAgICAgICAgIEVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKLQlFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcih3bmRQdHIsIDAsIDApOworCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAoV1BBUkFNMzIpRkFMU0UsIGxQYXJhbSk7CiAJRURJVF9FTV9TZXRNb2RpZnkod25kUHRyLCBUUlVFLCAwKTsKIAlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiAJcmV0dXJuIDE7CkBAIC0zNTUyLDcgKzM4NDYsOSBAQAogc3RhdGljIExSRVNVTFQgRURJVF9XTV9TaXplKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwotCisJSU5UMzIgZTsKKwkKKwlFRElUX0dldFNlbCh3bmRQdHIsIDAsICZlKTsKIAlHZXRDbGllbnRSZWN0MzIod25kUHRyLT5od25kU2VsZiwgJmVzLT5Gb3JtYXRSZWN0KTsKIAlpZiAoRURJVF9HZXRSZWRyYXcod25kUHRyKSAmJgogCQkJKCh3UGFyYW0gPT0gU0laRV9NQVhJTUlaRUQpIHx8CkBAIC0zNTY3LDYgKzM4NjMsMzUgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKKyAqCVdNX1NZU0tFWURPV04KKyAqCisgKi8KK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fU3lzS2V5RG93bihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworCWlmICgod1BhcmFtID09IFZLX0JBQ0spICYmIChsUGFyYW0gJiAweDIwMDApICYmCisJCQkoQk9PTDMyKUVESVRfRU1fQ2FuVW5kbyh3bmRQdHIsIDAsIDApKQorCQlFRElUX0VNX1VuZG8od25kUHRyLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJV01fVElNRVIKKyAqCisgKi8KK3N0YXRpYyBMUkVTVUxUIEVESVRfV01fVGltZXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKy8qCisgKglGSVhNRTogZ290dGEgZG8gc29tZSBzY3JvbGxpbmcgaGVyZSwgbGlrZQorICoJCUVESVRfRU1fTGluZVNjcm9sbCh3bmRQdHIsIDAsIDEpOworICovCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqCVdNX1ZTQ1JPTEwKICAqCiAgKglGSVhNRTogc2Nyb2xsYmFyIGNvZGUgaXRzZWxmIGlzIGJyb2tlbiwgc28gdGhpcyBvbmUgaXMgYSBoYWNrLgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbGlzdGJveC5jIGIvY29udHJvbHMvbGlzdGJveC5jCmluZGV4IDBmM2I0MzEuLjAwNmRlMjUgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2xpc3Rib3guYworKysgYi9jb250cm9scy9saXN0Ym94LmMKQEAgLTMxMCwxMSArMzEwLDExIEBACiAgICAgICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTGlzdGJveCAlMDR4OiBjaGFuZ2luZyBoZWlnaHQgJWQgLT4gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgZGVzY3ItPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+aGVpZ2h0IC0gZGVzY3ItPmhlaWdodCVkZXNjci0+aXRlbV9oZWlnaHQgKTsKLSAgICAgICAgICAgIFNldFdpbmRvd1Bvcyggd25kLT5od25kU2VsZiwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5yZWN0V2luZG93LnJpZ2h0IC0gd25kLT5yZWN0V2luZG93LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+cmVjdFdpbmRvdy5ib3R0b20gLSB3bmQtPnJlY3RXaW5kb3cudG9wIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjci0+aGVpZ2h0ICUgZGVzY3ItPml0ZW1faGVpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9NT1ZFICk7CisgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMiggd25kLT5od25kU2VsZiwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPnJlY3RXaW5kb3cucmlnaHQgLSB3bmQtPnJlY3RXaW5kb3cubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPnJlY3RXaW5kb3cuYm90dG9tIC0gd25kLT5yZWN0V2luZG93LnRvcCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjci0+aGVpZ2h0ICUgZGVzY3ItPml0ZW1faGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9aT1JERVIgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT01PVkUgKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCAxOTcyNjJmLi5iZWRkNjc3IDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC02NTAsNyArNjUwLDcgQEAKIAogICAgIGlmIChscGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9CSVRNQVApCiAgICAgewotCUdSQVBIX0RyYXdCaXRtYXAoIGhkYywgKEhCSVRNQVAxNikoVUlOVDMyKWxwaXRlbS0+dGV4dCwKKwlHUkFQSF9EcmF3Qml0bWFwKCBoZGMsIChIQklUTUFQMzIpbHBpdGVtLT50ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsIHJlY3QudG9wLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LnJpZ2h0LXJlY3QubGVmdCwgcmVjdC5ib3R0b20tcmVjdC50b3AgKTsKIAlyZXR1cm47CkBAIC04NjQsMTIgKzg2NCwxMiBAQAogCiAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIG1lbnUtPmhXbmQgKTsKIAotICAgIFNldFdpbmRvd1BvcyhtZW51LT5oV25kLCAwLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LAorICAgIFNldFdpbmRvd1BvczMyKG1lbnUtPmhXbmQsIDAsIHgsIHksIHdpZHRoLCBoZWlnaHQsCiAJCSAgCQkgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT1JFRFJBVyk7CiAgICAgICAvKiBEaXNwbGF5IHRoZSB3aW5kb3cgKi8KIAotICAgIFNldFdpbmRvd1BvcyggbWVudS0+aFduZCwgSFdORF9UT1AsIDAsIDAsIDAsIDAsCi0JCSAgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFICk7CisgICAgU2V0V2luZG93UG9zMzIoIG1lbnUtPmhXbmQsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLAorCQkgICAgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFICk7CiAgICAgVXBkYXRlV2luZG93KCBtZW51LT5oV25kICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xMDE1LDggKzEwMTUsOCBAQAogICAgICAgICAgICAgaXRlbS0+dGV4dCA9IHRleHQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZWxzZSBpZiAoKGZsYWdzICYgTUZfQklUTUFQKSB8fCAoZmxhZ3MgJiBNRl9PV05FUkRSQVcpKQotICAgICAgICBpdGVtLT50ZXh0ID0gKExQU1RSKXN0cjsKKyAgICBlbHNlIGlmIChmbGFncyAmIE1GX0JJVE1BUCkgaXRlbS0+dGV4dCA9IChMUFNUUikoSEJJVE1BUDMyKUxPV09SRChzdHIpOworICAgIGVsc2UgaWYgKGZsYWdzICYgTUZfT1dORVJEUkFXKSBpdGVtLT50ZXh0ID0gKExQU1RSKXN0cjsKICAgICBlbHNlIGl0ZW0tPnRleHQgPSBOVUxMOwogCiAgICAgaXRlbS0+aXRlbV9mbGFncyA9IGZsYWdzICYgfihNRl9ISUxJVEUgfCBNRl9NT1VTRVNFTEVDVCk7CkBAIC0xMTkxLDEyICsxMTkxLDEyIEBACiAgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhzdWJtZW51LCBOT19TRUxFQ1RFRF9JVEVNLCBzZW5kTWVudVNlbGVjdCApOwogICAgIGlmIChzdWJtZW51LT5oV25kID09IHBUb3BQV25kLT5od25kU2VsZiApIAogICAgIHsKLQlTaG93V2luZG93KCBzdWJtZW51LT5oV25kLCBTV19ISURFICk7CisJU2hvd1dpbmRvdzMyKCBzdWJtZW51LT5oV25kLCBTV19ISURFICk7CiAJdVN1YlBXbmRMZXZlbCA9IDA7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0JRGVzdHJveVdpbmRvdyggc3VibWVudS0+aFduZCApOworCURlc3Ryb3lXaW5kb3czMiggc3VibWVudS0+aFduZCApOwogCXN1Ym1lbnUtPmhXbmQgPSAwOwogICAgIH0KIH0KQEAgLTE0ODUsMTAgKzE0ODUsMTAgQEAKIAogICAgIGlmKCAobWVudS0+d0ZsYWdzICYgKE1GX1BPUFVQIHwgTUZfU1lTTUVOVSkpID09IChNRl9QT1BVUCB8IE1GX1NZU01FTlUpICkKIAl7Ci0JICBTaG93V2luZG93KCBtZW51LT5oV25kLCBTV19ISURFICk7CisJICBTaG93V2luZG93MzIoIG1lbnUtPmhXbmQsIFNXX0hJREUgKTsKIAkgIHVTdWJQV25kTGV2ZWwgPSAwOwogCi0JICBpZiggIUlzSWNvbmljKCAqaHduZE93bmVyICkgKQorCSAgaWYoICFJc0ljb25pYzMyKCAqaHduZE93bmVyICkgKQogCSAgeyAKIAkgICAgSERDMzIgaGRjID0gR2V0RENFeDMyKCAqaHduZE93bmVyLCAwLCBEQ1hfQ0FDSEUgfCBEQ1hfV0lORE9XKTsKIAkgICAgTkNfRHJhd1N5c0J1dHRvbiggKmh3bmRPd25lciwgaGRjLCBGQUxTRSApOwpAQCAtMTUyMyw3ICsxNTIzLDcgQEAKICAgICAgICAgICAgICAgICBNRU5VX1Nob3dQb3B1cCggKmh3bmRPd25lciwgKmhtZW51LCAwLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NYU0laRSwgU1lTTUVUUklDU19DWVNJWkUgKTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoICFJc0ljb25pYyggKmh3bmRPd25lciApICkKKyAgICAgICAgICAgIGlmKCAhSXNJY29uaWMzMiggKmh3bmRPd25lciApICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBIREMzMiBoZGMgPSAgR2V0RENFeDMyKCAqaHduZE93bmVyLCAwLCBEQ1hfQ0FDSEUgfCBEQ1hfV0lORE9XKTsKICAgICAgICAgICAgICAgICBOQ19EcmF3U3lzQnV0dG9uKCAqaHduZE93bmVyLCBoZGMsIFRSVUUgKTsKQEAgLTE4MTgsNyArMTgxOCw3IEBACiAgICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOwogICAgIGlmIChtZW51ICYmIG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSAKICAgICB7Ci0gICAgICAgICBTaG93V2luZG93KCBtZW51LT5oV25kLCBTV19ISURFICk7CisgICAgICAgICBTaG93V2luZG93MzIoIG1lbnUtPmhXbmQsIFNXX0hJREUgKTsKIAkgdVN1YlBXbmRMZXZlbCA9IDA7CiAgICAgfQogICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnUsIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFICk7CkBAIC0yNzAyLDcgKzI3MDIsNyBAQAogICAgIGlmICgobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSAmJgogICAgICAgICBscHBvcC0+aFduZCAmJgogICAgICAgICAoIXBUb3BQV25kIHx8IChscHBvcC0+aFduZCAhPSBwVG9wUFduZC0+aHduZFNlbGYpKSkKLSAgICAgICAgRGVzdHJveVdpbmRvdyggbHBwb3AtPmhXbmQgKTsKKyAgICAgICAgRGVzdHJveVdpbmRvdzMyKCBscHBvcC0+aFduZCApOwogCiAgICAgaWYgKGxwcG9wLT5pdGVtcykKICAgICB7CkBAIC0yODI0LDkgKzI4MjQsOSBAQAogICAgICAgICBscG1lbnUtPndGbGFncyAmPSB+TUZfUE9QVVA7ICAvKiBDYW4ndCBiZSBhIHBvcHVwICovCiAgICAgICAgIGxwbWVudS0+SGVpZ2h0ID0gMDsgIC8qIE1ha2Ugc3VyZSB3ZSByZWNhbGN1bGF0ZSB0aGUgc2l6ZSAqLwogICAgIH0KLSAgICBpZiAoSXNXaW5kb3dWaXNpYmxlKGhXbmQpKQotICAgICAgICBTZXRXaW5kb3dQb3MoIGhXbmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwKLSAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKKyAgICBpZiAoSXNXaW5kb3dWaXNpYmxlMzIoaFduZCkpCisgICAgICAgIFNldFdpbmRvd1BvczMyKCBoV25kLCAwLCAwLCAwLCAwLCAwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjg3Nyw4ICsyODc3LDggQEAKICAgICAgICAgaWYgKGxwcG9wID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgICAgICBscHBvcC0+SGVpZ2h0ID0gMDsgLyogTWFrZSBzdXJlIHdlIGNhbGwgTUVOVV9NZW51QmFyQ2FsY1NpemUgKi8KLSAgICAgICAgU2V0V2luZG93UG9zKCBoV25kLCAwLCAwLCAwLCAwLCAwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgfCBTV1BfRlJBTUVDSEFOR0VEICk7CisgICAgICAgIFNldFdpbmRvd1BvczMyKCBoV25kLCAwLCAwLCAwLCAwLCAwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggZWEwNGUzOC4uMTRjM2Y0MCAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTc3OCwyNCArNzc4LDI0IEBACiAJICAgIGlmIChscENyZWF0LT5zdHlsZSAmIFNCU19WRVJUKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChscENyZWF0LT5zdHlsZSAmIFNCU19MRUZUQUxJR04pCi0gICAgICAgICAgICAgICAgICAgIE1vdmVXaW5kb3coIGh3bmQsIGxwQ3JlYXQtPngsIGxwQ3JlYXQtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1hWU0NST0xMKzEsIGxwQ3JlYXQtPmN5LCBGQUxTRSApOworICAgICAgICAgICAgICAgICAgICBNb3ZlV2luZG93MzIoIGh3bmQsIGxwQ3JlYXQtPngsIGxwQ3JlYXQtPnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTUVUUklDU19DWFZTQ1JPTEwrMSwgbHBDcmVhdC0+Y3ksIEZBTFNFICk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAobHBDcmVhdC0+c3R5bGUgJiBTQlNfUklHSFRBTElHTikKLSAgICAgICAgICAgICAgICAgICAgTW92ZVdpbmRvdyggaHduZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ3JlYXQtPngrbHBDcmVhdC0+Y3gtU1lTTUVUUklDU19DWFZTQ1JPTEwtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDcmVhdC0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTUVUUklDU19DWFZTQ1JPTEwgKyAxLCBscENyZWF0LT5jeSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgTW92ZVdpbmRvdzMyKCBod25kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENyZWF0LT54K2xwQ3JlYXQtPmN4LVNZU01FVFJJQ1NfQ1hWU0NST0xMLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDcmVhdC0+eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNNRVRSSUNTX0NYVlNDUk9MTCsxLCBscENyZWF0LT5jeSwgRkFMU0UgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgIC8qIFNCU19IT1JaICovCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGxwQ3JlYXQtPnN0eWxlICYgU0JTX1RPUEFMSUdOKQotICAgICAgICAgICAgICAgICAgICBNb3ZlV2luZG93KCBod25kLCBscENyZWF0LT54LCBscENyZWF0LT55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENyZWF0LT5jeCwgU1lTTUVUUklDU19DWUhTQ1JPTEwrMSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgTW92ZVdpbmRvdzMyKCBod25kLCBscENyZWF0LT54LCBscENyZWF0LT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ3JlYXQtPmN4LCBTWVNNRVRSSUNTX0NZSFNDUk9MTCsxLCBGQUxTRSApOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxwQ3JlYXQtPnN0eWxlICYgU0JTX0JPVFRPTUFMSUdOKQotICAgICAgICAgICAgICAgICAgICBNb3ZlV2luZG93KCBod25kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDcmVhdC0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDcmVhdC0+eStscENyZWF0LT5jeS1TWVNNRVRSSUNTX0NZSFNDUk9MTC0xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENyZWF0LT5jeCwgU1lTTUVUUklDU19DWUhTQ1JPTEwrMSwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICAgICAgTW92ZVdpbmRvdzMyKCBod25kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENyZWF0LT54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ3JlYXQtPnkrbHBDcmVhdC0+Y3ktU1lTTUVUUklDU19DWUhTQ1JPTEwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENyZWF0LT5jeCwgU1lTTUVUUklDU19DWUhTQ1JPTEwrMSwgRkFMU0UgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIWhVcEFycm93KSBTQ1JPTExfTG9hZEJpdG1hcHMoKTsKQEAgLTEyMTAsNyArMTIxMCw3IEBACiAgICAgc3dpdGNoKG5CYXIpCiAgICAgewogICAgIGNhc2UgU0JfQ1RMOgotICAgICAgICBTaG93V2luZG93KCBod25kLCBmU2hvdyA/IFNXX1NIT1cgOiBTV19ISURFICk7CisgICAgICAgIFNob3dXaW5kb3czMiggaHduZCwgZlNob3cgPyBTV19TSE9XIDogU1dfSElERSApOwogICAgICAgICByZXR1cm4gVFJVRTsKIAogICAgIGNhc2UgU0JfSE9SWjoKQEAgLTEyNTcsOCArMTI1Nyw4IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIFRSVUU7ICAvKiBOb3RoaW5nIHRvIGRvISAqLwogICAgIH0KLSAgICBTZXRXaW5kb3dQb3MoIGh3bmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFCi0gICAgICAgICAgICAgICAgIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgfCBTV1BfRlJBTUVDSEFOR0VEICk7CisgICAgU2V0V2luZG93UG9zMzIoIGh3bmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFCisgICAgICAgICAgICAgICAgICAgIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgfCBTV1BfRlJBTUVDSEFOR0VEICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXRpYy5jIGIvY29udHJvbHMvc3RhdGljLmMKaW5kZXggMjg5YjBhNS4uOTE4NGNmNSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc3RhdGljLmMKKysrIGIvY29udHJvbHMvc3RhdGljLmMKQEAgLTU2LDggKzU2LDggQEAKICAgICBpZiAoaGljb24pCiAgICAgewogICAgICAgICBDVVJTT1JJQ09OSU5GTyAqaW5mbyA9IChDVVJTT1JJQ09OSU5GTyAqKSBHbG9iYWxMb2NrMTYoIGhpY29uICk7Ci0gICAgICAgIFNldFdpbmRvd1Bvcyggd25kUHRyLT5od25kU2VsZiwgMCwgMCwgMCwgaW5mby0+bldpZHRoLCBpbmZvLT5uSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSICk7CisgICAgICAgIFNldFdpbmRvd1BvczMyKCB3bmRQdHItPmh3bmRTZWxmLCAwLCAwLCAwLCBpbmZvLT5uV2lkdGgsIGluZm8tPm5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIgKTsKICAgICAgICAgR2xvYmFsVW5sb2NrMTYoIGhpY29uICk7CiAgICAgfQogICAgIHJldHVybiBwcmV2SWNvbjsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXR1cy5jIGIvY29udHJvbHMvc3RhdHVzLmMKaW5kZXggY2NiMTg4Yi4uMTdjNDM3MiAxMDA2NDQKLS0tIGEvY29udHJvbHMvc3RhdHVzLmMKKysrIGIvY29udHJvbHMvc3RhdHVzLmMKQEAgLTg1LDcgKzg1LDcgQEAKIHsKIAlpbnQJaTsKIAotCWlmICghSXNXaW5kb3dWaXNpYmxlKGh3bmQpKSB7CisJaWYgKCFJc1dpbmRvd1Zpc2libGUzMihod25kKSkgewogCSAgICByZXR1cm4gKFRSVUUpOwogCX0KIApAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgR2V0Q2xpZW50UmVjdDMyKHBhcmVudCwgJnJlY3QpOwogICAgIHdpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKICAgICBoZWlnaHQgPSAoc2VsZi0+dGV4dEhlaWdodCAqIDMpLzI7Ci0gICAgTW92ZVdpbmRvdyhod25kLCBscENyZWF0ZS0+eCwgbHBDcmVhdGUtPnktMSwgd2lkdGgsIGhlaWdodCwgRkFMU0UpOworICAgIE1vdmVXaW5kb3czMihod25kLCBscENyZWF0ZS0+eCwgbHBDcmVhdGUtPnktMSwgd2lkdGgsIGhlaWdodCwgRkFMU0UpOwogICAgIFNXX1NldFBhcnRCb3VuZHMoaHduZCwgc2VsZik7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC00MDAsOCArNDAwLDggQEAKIAl3aWR0aCA9IHBhcmVudF9yZWN0LnJpZ2h0IC0gcGFyZW50X3JlY3QubGVmdDsKIAl4ID0gcGFyZW50X3JlY3QubGVmdDsKIAl5ID0gcGFyZW50X3JlY3QuYm90dG9tIC0gaGVpZ2h0OwotCU1vdmVXaW5kb3coaHduZCwgcGFyZW50X3JlY3QubGVmdCwgcGFyZW50X3JlY3QuYm90dG9tIC0gaGVpZ2h0IC0gMSwKLQkJICAgd2lkdGgsIGhlaWdodCwgVFJVRSk7CisJTW92ZVdpbmRvdzMyKGh3bmQsIHBhcmVudF9yZWN0LmxlZnQsIHBhcmVudF9yZWN0LmJvdHRvbSAtIGhlaWdodCAtIDEsCisJCSAgICAgd2lkdGgsIGhlaWdodCwgVFJVRSk7CiAJU1dfU2V0UGFydEJvdW5kcyhod25kLCBzZWxmKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9SRUFETUUgYi9kZWJ1Z2dlci9SRUFETUUKaW5kZXggMDJjYWQ5Yi4uNDEyYjdlOCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvUkVBRE1FCisrKyBiL2RlYnVnZ2VyL1JFQURNRQpAQCAtMSw4ICsxLDcgQEAKLQlUaGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBXaW5lIGRlYnVnZ2VyLiAgTWFueSBwaWVjZXMgaGF2ZSBiZWVuCi1zaGFtZWxlc3NseSBzdG9sZW4gLSB0aGUgcmV2ZXJzZSBhc3NlbWJlciB3YXMgc3RvbGVuIGZyb20gTWFjaCBtb3JlIG9yCi1sZXNzIGludGFjdC4gIEl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGFyZSB0d28gdmFyaWFibGVzIHRoYXQgYXJlIHNldAotZGlmZmVyZW50bHkgaWYgeW91IGFyZSByZXZlcnNlIGFzc2VtYmxpbmcgMTYgYml0IGNvZGUsIGFuZCBvbiB0aGUKLXdob2xlIGl0IHNlZW1zIHRvIHdvcmsuCisJVGhpcyBpcyB0aGUgY29yZSBvZiB0aGUgV2luZSBkZWJ1Z2dlci4gIFRoZSByZXZlcnNlIGFzc2VtYmVyCit3YXMgc3RvbGVuIGZyb20gTWFjaCBtb3JlIG9yIGxlc3MgaW50YWN0LiAgSXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgYXJlCit0d28gdmFyaWFibGVzIHRoYXQgYXJlIHNldCBkaWZmZXJlbnRseSBpZiB5b3UgYXJlIHJldmVyc2UgYXNzZW1ibGluZworMTYgYml0IGNvZGUsIGFuZCBvbiB0aGUgd2hvbGUgaXQgc2VlbXMgdG8gd29yay4KIAogTkVXUzoKIApAQCAtNjMsNiArNjIsMTYgQEAKIGF1dG9tYXRpYyBkaXNwbGF5IGV4cHJlc3Npb25zLiAgQW4gZXhhbXBsZSBpcyBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4gIFRoZQogc3ludGF4IGFuZCB1c2FnZSBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIHRoYXQgb2YgZ2RiLgogCisJOCkgVHlwZSBjYXN0cyBjYW4gYmUgbWFkZSBmcm9tIHdpdGhpbiB0aGUgZGVidWdnZXIsIGJ1dCB0aGV5IGN1cnJlbnRseQorZG9uJ3Qgd29yayB3aXRoIHR5cGVkZWYnZWQgdHlwZXMuICBUaGV5IG9ubHkgd29yayB3aXRoIGJ1aWx0aW4gdHlwZXMgYW5kCituYW1lZCBzdHJ1Y3R1cmVzIHVuaW9ucywgZXRjLiAgVGhlIHByb2JsZW0gaXMgdGhhdCBpbnRlcm5hbGx5IHdlIGRvbid0IGFsd2F5cworcmVjb3JkIHRoZSB0eXBlZGVmZWQgbmFtZXMgb2Ygc3RydWN0dXJlcywgc28gd2UgaGF2ZSBubyBndWFyYW50ZWUgdGhhdCB3ZQord291bGQga25vdyB3aGF0IGVhY2ggdHlwZSBpcy4gIFRoaXMgY2FuIGJlIGZpeGVkLCBvZiBjb3Vyc2UgLSAgaXQganVzdCB0YWtlcworbW9yZSBtZW1vcnkuICBOb3RlIHRoYXQgaW4gc29tZSBjYXNlcywgdHlwZWRlZmVkIHN0cnVjdHVyZXMgY291bGQgYmUgY2FzdAordXNpbmcgJyhzdHJ1Y3QgdHlwZWRmbmFtZSknIGluc3RlYWQgb2YgJyh0eXBlZGZuYW1lKScuICAgVGVjaG5pY2FsbHkgdGhpcworaXNuJ3QgcXVpdGUgY29ycmVjdCwgYnV0IGlmIGFuZCB3aGVuIHRoZSByZXN0IG9mIHRoaXMgc3R1ZmYgZ2V0cyBmaXhlZCwKK3RoaXMgd291bGQgbmVlZCB0byBnZXQgY29ycmVjdGVkIHRvby4KKwogTk9URVM6CiAKIAlJZiBpdCB3ZXJlbid0IGZvciB0aGUgZmFjdCB0aGF0IGdkYiBkb2Vzbid0IGdyb2sgdGhlIFdpbjMyIGRlYnVnCkBAIC03MywxNiArODIsNiBAQAogCiBMSU1JVEFUSU9OUyBBTkQgRElGRkVSRU5DRVMgRlJPTSBHREI6CiAKLQlZb3UgY2Fubm90IHVzZSB0eXBlIGNhc3RzIGluIGV4cHJlc3Npb25zIHRoYXQgeW91IGdpdmUgdG8gdGhlCi1kZWJ1Z2dlci4gIFRoZSBoYXJkZXN0IHBhcnQgYWJvdXQgYWRkaW5nIHN1cHBvcnQgZm9yIHRoaXMgaXMgZml4aW5nCi10aGUgcGFyc2VyL2xleGVyIHRvIGtub3cgd2hlbiBpdCBpcyBoYW5kbGluZyBhIHR5cGUgY2FzdCwgYW5kIHdoZW4gaXQKLWlzIGhhbmRsaW5nIGFueSBvdGhlciB0eXBlIG9mIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbi4gIFdpdGggbGV4ZXIKLXN0YXRlcywgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB3ZSB3b3VsZCBleHBlY3QgYXQKLWFueSBnaXZlbiBtb21lbnQsIGJ1dCBpdCB3b3VsZCBiZSB0ZWRpb3VzIHRvIGdvIHRocm91Z2ggYW5kIG1ha2Ugc3VyZQotdGhhdCB0aGUgc3RhdGUgaXMgc2V0IHVwIGNvcnJlY3RseSBmb3IgYWxsIG9mIHRoZSBkaWZmZXJlbnQgb3BlcmF0b3JzCi1hbmQgY2hhcmFjdGVycyB0aGF0IHdlIGFjY2VwdCwgYW5kIEkgYW0gbm90IHlldCBjb252aW5jZWQgdGhhdCB0aGlzIHdvdWxkCi1ldmVuIHdvcmsuCi0KIAlZb3UgY2Fubm90IHNldCBhIGJyZWFrcG9pbnQgYnkgZmlsZSBhbmQgbGluZSBudW1iZXIgYXMgeW91IGNhbgogd2l0aCBnZGIuICBBZGRpbmcgc3VwcG9ydCBmb3IgdGhpcyB3b3VsZG4ndCBiZSBhbGwgdGhhdCB0b3VnaCwgSSBndWVzcywgYnV0CiBpdCB3b3VsZCBiZSBhIG51aXNhbmNlLiAgIFlvdSBjYW4gc2V0IGEgYnJlYWtwb2ludCBnaXZlbiBhIGZ1bmN0aW9uIGFuZApAQCAtMzQ4LDExICszNDcsNiBAQAogCVlvdSBjYW4gdXNlIHRoZSBzZXQgY29tbWFuZCB0byBzZXQgbW9yZSBvciBsZXNzIGFueXRoaW5nLiAgTm90ZQogaG93ZXZlciB0aGF0IHlvdSBjYW5ub3QgdXNlIGVudW1lcmF0ZWQgdHlwZXMgb24gdGhlIFJIUyBvZiB0aGUgZXhwcmVzc2lvbi4KIAotCUZpbmFsbHksIHR5cGUgY2FzdHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIHRoZSBleHByZXNzaW9uCi1oYW5kbGluZy4gIFRoZXJlIGlzIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gc3RvcmVkIGludGVybmFsbHkgdG8gYmUKLWFibGUgdG8gaGFuZGxlIHRoaXMgLSB0aGUgbWFpbiBjaGFsbGVuZ2UgaXMgdGhhdCB0aGUgcGFyc2VyIHdvdWxkCi1uZWVkIHRvIGJlIGZpeGVkIHRvIGNvcnJlY3RseSBwYXJzZSB0aGUgdHlwZSBjYXN0LgotCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvVE9ETyBiL2RlYnVnZ2VyL1RPRE8KaW5kZXggMzU0NGIxMi4uYzUyN2I5MjIgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL1RPRE8KKysrIGIvZGVidWdnZXIvVE9ETwpAQCAtMywxMCArMyw5IEBACiBwb3NzaWJsZSB0byBtZSByaWdodCBub3cuICAgSW4gbm8gcGFydGljdWxhciBvcmRlci4gIElmIHNvbWVvbmUgZWxzZQogd2FudHMgdG8gZGlnIGluLCBmZWVsIGZyZWUuCiAKLTEpIFNvbWUga2luZCBvZiB3YXRjaHBvaW50IGNhcGFiaWxpdHkuICBQcmV0dHkgZWFzeSBvbmNlIHdlIGhhdmUgYQotCXNpbmdsZSBzdGVwIGNhcGFiaWxpdHksIGJ1dCB3ZSBlbmQgdXAgcnVubmluZyB0aGUgcHJvZ3JhbQotCXJlYWxseSBzbG93bHkgb25lIGluc3RydWN0aW9uIGF0IGEgdGltZS4gIFVzZSBoYXJkd2FyZSBkZWJ1ZwotCXJlZ2lzdGVycyBmb3IgdGhpcz8/PworMSkgU29tZSBraW5kIG9mIHdhdGNocG9pbnQgY2FwYWJpbGl0eS4gIFByZXR0eSBlYXN5LCBidXQgd2UgZW5kIHVwCisgICAgICAgIHJ1bm5pbmcgdGhlIHByb2dyYW0gcmVhbGx5IHNsb3dseSBvbmUgaW5zdHJ1Y3Rpb24gYXQgYSB0aW1lLiAgCisJVXNlIGhhcmR3YXJlIGRlYnVnIHJlZ2lzdGVycyBmb3IgdGhpcyAobXVjaCBoYXJkZXIpPz8/CiAKIDIpIFNvbWUga2luZCBvZiAud2RiaW5pdCBmaWxlLgogCkBAIC0zMSwxNCArMzAsNiBAQAogOCkgU29tZSBvZiB0aGUgbmV3ZXIgZGlzcGxheXMgYXJlIHN0aWxsIGEgbGl0dGxlIGJpdCBzcGFyc2Ugb24gaW5mb3JtYXRpb24uCiAJTWFrZSB0aGVzZSBtb3JlIGxpa2UgZ2RiLgogCi05KSBEb24ndCBib3RoZXIgdG8gZGlzYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gd2hlbiB3ZSBzdG9wIGF0IGEgYnJlYWtwb2ludAotCWFuZCBpZiB3ZSBoYXZlIGEgdmFsaWQgc291cmNlIGxpbmUgd2UgYXJlIGRpc3BsYXlpbmcuCi0KLTEwKSBBZGQgc3VwcG9ydCBmb3IgJy9pJywgZXRjIGluIGRpc3BsYXkgY29tbWFuZC4gIE1ha2Ugc3VyZSAnZGlzcGxheS9pICRlaXAnCi0JZG9lcyB0aGUgY29ycmVjdCB0aGluZywgYW5kIHRoZW4gc2tpcCBhdXRvbWF0aWMgZGlzYXNzZW1ibHkgY29tcGxldGVseS4KLQotMTEpCUxpbWl0IGFtb3VudCBvZiBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgd2l0aCBwcmludCBjb21tYW5kLgotCi0xMikJTWFrZSBzdXJlIG9wZXJhdG9yIHByZWNlZGVuY2Ugd29ya3MgT0suCis5KSBNYWtlIHN1cmUgb3BlcmF0b3IgcHJlY2VkZW5jZSB3b3JrcyBPSy4KIAogKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvYnJlYWsuYyBiL2RlYnVnZ2VyL2JyZWFrLmMKaW5kZXggNWNmMTY0Zi4uZDg0NDI3ZCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvYnJlYWsuYworKysgYi9kZWJ1Z2dlci9icmVhay5jCkBAIC0yNTIsNiArMjUyLDEzIEBACiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkludmFsaWQgYnJlYWtwb2ludCBudW1iZXIgJWRcbiIsIG51bSApOwogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgaWYoIGJyZWFrcG9pbnRzW251bV0uY29uZGl0aW9uICE9IE5VTEwgKQorICAgICAgeworCURFQlVHX0ZyZWVFeHByKGJyZWFrcG9pbnRzW251bV0uY29uZGl0aW9uKTsKKwlicmVha3BvaW50c1tudW1dLmNvbmRpdGlvbiA9IE5VTEw7CisgICAgICB9CisKICAgICBicmVha3BvaW50c1tudW1dLmVuYWJsZWQgPSBGQUxTRTsKICAgICBicmVha3BvaW50c1tudW1dLmluX3VzZSAgPSBGQUxTRTsKICAgICBicmVha3BvaW50c1tudW1dLnNraXBjb3VudCA9IDA7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYmcueSBiL2RlYnVnZ2VyL2RiZy55CmluZGV4IDhkYjA4ODUuLmY3OWEzZmYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RiZy55CisrKyBiL2RlYnVnZ2VyL2RiZy55CkBAIC00MSw2ICs0MSw3IEBACiAgICAgaW50ICAgICAgICAgICAgICBpbnRlZ2VyOwogICAgIHN0cnVjdCBsaXN0X2lkICAgbGlzdGluZzsKICAgICBzdHJ1Y3QgZXhwciAqICAgIGV4cHJlc3Npb247CisgICAgc3RydWN0IGRhdGF0eXBlICogdHlwZTsKIH0KIAogJXRva2VuIHRDT05UIHRTVEVQIHRMSVNUIHRORVhUIHRRVUlUIHRIRUxQIHRCQUNLVFJBQ0UgdElORk8gdFdBTEsgdFVQIHRET1dOCkBAIC00OCwxMiArNDksMTUgQEAKICV0b2tlbiB0Q0xBU1MgdE1PRFVMRSB0U1RBQ0sgdFNFR01FTlRTIHRSRUdTIHRXTkQgdFFVRVVFIHRMT0NBTAogJXRva2VuIHRFT0wgdFNUUklORwogJXRva2VuIHRGUkFNRSB0U0hBUkUgdENPTkQgdERJU1BMQVkgdFVORElTUExBWQotJXRva2VuIHRTVEVQSSB0TkVYVEkgdEZJTklTSCB0U0hPVyB0RElSIAorJXRva2VuIHRTVEVQSSB0TkVYVEkgdEZJTklTSCB0U0hPVyB0RElSCiAldG9rZW4gPHN0cmluZz4gdFBBVEgKICV0b2tlbiA8c3RyaW5nPiB0SURFTlRJRklFUiB0U1RSSU5HCiAldG9rZW4gPGludGVnZXI+IHROVU0gdEZPUk1BVAogJXRva2VuIDxyZWc+IHRSRUcKIAorJXRva2VuIHRDSEFSIHRTSE9SVCB0SU5UIHRMT05HIHRGTE9BVCB0RE9VQkxFIHRVTlNJR05FRCB0U0lHTkVEIAorJXRva2VuIHRTVFJVQ1QgdFVOSU9OIHRFTlVNCisKIC8qICVsZWZ0ICcsJyAqLwogLyogJWxlZnQgJz0nIE9QX09SX0VRVUFMIE9QX1hPUl9FUVVBTCBPUF9BTkRfRVFVQUwgT1BfU0hMX0VRVUFMIFwKICAgICAgICAgIE9QX1NIUl9FUVVBTCBPUF9QTFVTX0VRVUFMIE9QX01JTlVTX0VRVUFMIFwKQEAgLTY2LDE0ICs3MCwxNSBAQAogJWxlZnQgJyYnCiAlbGVmdCBPUF9FUSBPUF9ORQogJWxlZnQgJzwnICc+JyBPUF9MRSBPUF9HRQotJWxlZnQgT1BfU0hMIE9QX1NIUiBPUF9EUkYKKyVsZWZ0IE9QX1NITCBPUF9TSFIKICVsZWZ0ICcrJyAnLScKICVsZWZ0ICcqJyAnLycgJyUnCiAlbGVmdCBPUF9TSUdOICchJyAnficgT1BfREVSRUYgLyogT1BfSU5DIE9QX0RFQyBPUF9BRERSICovCi0lbGVmdCAnLicgJ1snCislbGVmdCAnLicgJ1snIE9QX0RSRgogJW5vbmFzc29jICc6JwogCi0ldHlwZSA8ZXhwcmVzc2lvbj4gZXhwciBsdmFsIGx2YWx1ZQorJXR5cGUgPGV4cHJlc3Npb24+IGV4cHIgbHZhbCBsdmFsdWUgCisldHlwZSA8dHlwZT4gdHlwZV9jYXN0IHR5cGVfZXhwcgogJXR5cGUgPGFkZHJlc3M+IGV4cHJfYWRkciBsdmFsX2FkZHIKICV0eXBlIDxpbnRlZ2VyPiBleHByX3ZhbHVlCiAldHlwZSA8c3RyaW5nPiBwYXRobmFtZQpAQCAtMTI5LDcgKzEzNCw5IEBACiAgICAgfCB0U0hPVyB0RElSIHRFT0wJICAgICAgIHsgREVCVUdfU2hvd0RpcigpOyB9CiAgICAgfCB0RElSIHBhdGhuYW1lIHRFT0wgICAgICAgeyBERUJVR19BZGRQYXRoKCAkMiApOyB9CiAgICAgfCB0RElSIHRFT0wJCSAgICAgICB7IERFQlVHX051a2VQYXRoKCk7IH0KLSAgICB8IHRESVNQTEFZIGV4cHIgdEVPTCAgICAgICB7IERFQlVHX0FkZERpc3BsYXkoJDIpOyB9CisgICAgfCB0RElTUExBWSB0RU9MCSAgICAgICB7IERFQlVHX0luZm9EaXNwbGF5KCk7IH0KKyAgICB8IHRESVNQTEFZIGV4cHIgdEVPTCAgICAgICB7IERFQlVHX0FkZERpc3BsYXkoJDIsIDEsIDApOyB9CisgICAgfCB0RElTUExBWSB0Rk9STUFUIGV4cHIgdEVPTCB7IERFQlVHX0FkZERpc3BsYXkoJDMsICQyID4+IDgsICQyICYgMHhmZik7IH0KICAgICB8IHRERUxFVEUgdERJU1BMQVkgdE5VTSB0RU9MIHsgREVCVUdfRGVsRGlzcGxheSggJDMgKTsgfQogICAgIHwgdERFTEVURSB0RElTUExBWSB0RU9MICAgIHsgREVCVUdfRGVsRGlzcGxheSggLTEgKTsgfQogICAgIHwgdFVORElTUExBWSB0TlVNIHRFT0wgICAgIHsgREVCVUdfRGVsRGlzcGxheSggJDIgKTsgfQpAQCAtMjU3LDYgKzI2NCwzMCBAQAogICAgIHwgdFdBTEsgdFdORCB0RU9MICAgICAgICAgICB7IFdJTl9XYWxrV2luZG93cyggMCwgMCApOyB9CiAgICAgfCB0V0FMSyB0V05EIHROVU0gdEVPTCAgICAgIHsgV0lOX1dhbGtXaW5kb3dzKCAkMywgMCApOyB9CiAKKwordHlwZV9jYXN0OiAKKyAgICAgICcoJyB0eXBlX2V4cHIgJyknCQl7ICQkID0gJDI7IH0KKwordHlwZV9leHByOgorICAgICAgdHlwZV9leHByICcqJwkJeyAkJCA9IERFQlVHX0ZpbmRPck1ha2VQb2ludGVyVHlwZSgkMSk7IH0KKyAgICB8ICB0SU5UCQkJeyAkJCA9IERFQlVHX1R5cGVDYXN0KEJBU0lDLCAiaW50Iik7IH0KKyAgICB8IHRDSEFSCQkJeyAkJCA9IERFQlVHX1R5cGVDYXN0KEJBU0lDLCAiY2hhciIpOyB9CisgICAgfCB0TE9ORyB0SU5UCQl7ICQkID0gREVCVUdfVHlwZUNhc3QoQkFTSUMsICJsb25nIGludCIpOyB9CisgICAgfCB0VU5TSUdORUQgdElOVAkJeyAkJCA9IERFQlVHX1R5cGVDYXN0KEJBU0lDLCAidW5zaWduZWQgaW50Iik7IH0KKyAgICB8IHRMT05HIHRVTlNJR05FRCB0SU5UCXsgJCQgPSBERUJVR19UeXBlQ2FzdChCQVNJQywgImxvbmcgdW5zaWduZWQgaW50Iik7IH0KKyAgICB8IHRMT05HIHRMT05HIHRJTlQJCXsgJCQgPSBERUJVR19UeXBlQ2FzdChCQVNJQywgImxvbmcgbG9uZyBpbnQiKTsgfQorICAgIHwgdExPTkcgdExPTkcgdFVOU0lHTkVEIHRJTlQgeyAkJCA9IERFQlVHX1R5cGVDYXN0KEJBU0lDLCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIpOyB9CisgICAgfCB0U0hPUlQgdElOVAkJeyAkJCA9IERFQlVHX1R5cGVDYXN0KEJBU0lDLCAic2hvcnQgaW50Iik7IH0KKyAgICB8IHRTSE9SVCB0VU5TSUdORUQgdElOVAl7ICQkID0gREVCVUdfVHlwZUNhc3QoQkFTSUMsICJzaG9ydCB1bnNpZ25lZCBpbnQiKTsgfQorICAgIHwgdFNJR05FRCB0Q0hBUgkJeyAkJCA9IERFQlVHX1R5cGVDYXN0KEJBU0lDLCAic2lnbmVkIGNoYXIiKTsgfQorICAgIHwgdFVOU0lHTkVEIHRDSEFSCQl7ICQkID0gREVCVUdfVHlwZUNhc3QoQkFTSUMsICJ1bnNpZ25lZCBjaGFyIik7IH0KKyAgICB8IHRGTE9BVAkJCXsgJCQgPSBERUJVR19UeXBlQ2FzdChCQVNJQywgImZsb2F0Iik7IH0KKyAgICB8IHRET1VCTEUJCQl7ICQkID0gREVCVUdfVHlwZUNhc3QoQkFTSUMsICJkb3VibGUiKTsgfQorICAgIHwgdExPTkcgdERPVUJMRQkJeyAkJCA9IERFQlVHX1R5cGVDYXN0KEJBU0lDLCAibG9uZyBkb3VibGUiKTsgfQorICAgIHwgdFNUUlVDVCB0SURFTlRJRklFUgl7ICQkID0gREVCVUdfVHlwZUNhc3QoU1RSVUNULCAkMik7IH0KKyAgICB8IHRVTklPTiB0SURFTlRJRklFUgl7ICQkID0gREVCVUdfVHlwZUNhc3QoU1RSVUNULCAkMik7IH0KKyAgICB8IHRFTlVNIHRJREVOVElGSUVSCQl7ICQkID0gREVCVUdfVHlwZUNhc3QoRU5VTSwgJDIpOyB9CisKIGV4cHJfYWRkcjoKICAgICBleHByCQkJIHsgJCQgPSBERUJVR19FdmFsRXhwcigkMSkgfQogCkBAIC0zMTAsNiArMzQxLDcgQEAKICAgICB8ICcoJyBleHByICcpJyAgICAgICAgICAgICAgIHsgJCQgPSAkMjsgfQogICAgIHwgJyonIGV4cHIgJXByZWMgT1BfREVSRUYgICAgeyAkJCA9IERFQlVHX1Vub3BFeHByKEVYUF9PUF9ERVJFRiwgJDIpOyB9CiAgICAgfCAnJicgZXhwciAlcHJlYyBPUF9ERVJFRiAgICB7ICQkID0gREVCVUdfVW5vcEV4cHIoRVhQX09QX0FERFIsICQyKTsgfQorICAgIHwgdHlwZV9jYXN0IGV4cHIgJXByZWMgT1BfREVSRUYgeyAkJCA9IERFQlVHX1R5cGVDYXN0RXhwcigkMSwgJDIpOyB9IAogCQogLyoKICAqIFRoZSBsdmFsdWUgcnVsZSBidWlsZHMgYW4gZXhwcmVzc2lvbiB0cmVlLiAgVGhpcyBpcyBhIGxpbWl0ZWQgZm9ybQpAQCAtNDYwLDE1ICs0OTIsMTggQEAKIAkgICAgREVCVUdfU2lsZW50QmFja1RyYWNlKCk7CiAJfQogCi0gICAgICAgIC8qIFNob3cgd2hlcmUgd2UgY3Jhc2hlZCAqLwotICAgICAgICBjdXJyX2ZyYW1lID0gMDsKLSAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUsIFRSVUUgKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIjogICIpOwotICAgICAgICBpZiAoREJHX0NIRUNLX1JFQURfUFRSKCAmYWRkciwgMSApKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19EaXNhc20oICZhZGRyLCBUUlVFICk7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKLSAgICAgICAgfQorCWlmKCBzaWduYWwgIT0gU0lHVFJBUCApCisJICB7CisJICAgIC8qIFNob3cgd2hlcmUgd2UgY3Jhc2hlZCAqLworCSAgICBjdXJyX2ZyYW1lID0gMDsKKwkgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUsIFRSVUUgKTsKKwkgICAgZnByaW50ZihzdGRlcnIsIjogICIpOworCSAgICBpZiAoREJHX0NIRUNLX1JFQURfUFRSKCAmYWRkciwgMSApKQorCSAgICAgIHsKKwkJREVCVUdfRGlzYXNtKCAmYWRkciwgVFJVRSApOworCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkgICAgICB9CisJICB9CiAKICAgICAgICAgcmV0X29rID0gMDsKICAgICAgICAgZG8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZ21haW4uYyBiL2RlYnVnZ2VyL2RiZ21haW4uYwppbmRleCA5ZDNmYjhjLi43YzE5OTJiIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmdtYWluLmMKKysrIGIvZGVidWdnZXIvZGJnbWFpbi5jCkBAIC02LDE1ICs2LDE2IEBACiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAKICNpbmNsdWRlIDxsZHQuaD4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8dG9vbGhlbHAuaD4KLSNpbmNsdWRlIDxtb2R1bGUuaD4KLSNpbmNsdWRlIDxkZWJ1Z2dlci5oPgotI2luY2x1ZGUgPGNsYXNzLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgInRvb2xoZWxwLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKKyNpbmNsdWRlICJjbGFzcy5oIgogI2luY2x1ZGUgPFgxMS9YbGliLmg+CiAKICNpbmNsdWRlICJkZWJ1Z2dlci5oIgogI2luY2x1ZGUgInBlZXhlLmgiCisjaW5jbHVkZSAicGVfaW1hZ2UuaCIKIAogbGR0X2NvcHlfZW50cnkgbGR0X2NvcHlbTERUX1NJWkVdOwogdW5zaWduZWQgY2hhciBsZHRfZmxhZ3NfY29weVtMRFRfU0laRV07CkBAIC0xNzEsNyArMTcyLDcgQEAKIAlpbnQJCQkJICBkYmdfc2l6ZTsKIAlzdHJ1Y3QgUEVfRGVidWdfZGlyCQkqIGRiZ2RpcjsKIAlzdHJ1Y3QgcGVfZGF0YQkJCSogcGU7Ci0gICAgICAgIHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlICAgICAgICAgKiBzZWN0cDsKKyAgICAgICAgTFBJTUFHRV9TRUNUSU9OX0hFQURFUiAgICAgICAgICAgIHNlY3RwOwogCWludAkJCQkgIG5zZWN0OwogCXNob3J0IGludAkJCSAgZGJnX2luZGV4OwkJCQogCWNoYXIJCQkJICBsb2FkZWQ7CkBAIC0xOTAsNyArMTkxLDcgQEAKICAgc3RydWN0IGRlZmVycmVkX2RlYnVnX2luZm8gZGVlZmVyOwogICBzdHJ1Y3QgUEVfRGVidWdfZGlyCWRpbmZvOwogICBzdHJ1Y3QgQ29kZVZpZXdEZWJ1ZyBjZGVidWc7Ci0gIHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlIHNlY3RzWzEwXTsKKyAgSU1BR0VfU0VDVElPTl9IRUFERVIgIHNlY3RzWzEwXTsKIAogICBtZW1zZXQoJmRlZWZlciwgMCwgc2l6ZW9mKGRlZWZlcikpOwogICBtZW1zZXQoJmRpbmZvLCAwLCBzaXplb2YoZGluZm8pKTsKQEAgLTIwMSw3ICsyMDIsNyBAQAogICBkaW5mby50aW1lc3RhbXAgPSA4MTI5MzIzOTU7CiAgIGNkZWJ1Zy5jdl90aW1lc3RhbXAgPSA4MzMzOTIxMzcgIC8qIDg0MTk1MTM5NyAqLzsKICAgZGVlZmVyLmRiZ2RpciA9ICZkaW5mbzsKLSAgZGVlZmVyLnNlY3RwID0gJnNlY3RzOworICBkZWVmZXIuc2VjdHAgPSBzZWN0czsKICAgZGVlZmVyLm5zZWN0ID0gMTA7CiAKICAgREVCVUdfSW5pdFR5cGVzKCk7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kZWJ1Zy5sIGIvZGVidWdnZXIvZGVidWcubAppbmRleCA1ZjZjY2UyLi5kMzNiNGMwIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kZWJ1Zy5sCisrKyBiL2RlYnVnZ2VyL2RlYnVnLmwKQEAgLTExMyw3ICsxMTMsNyBAQAogPElOSVRJQUw+bGlzdHxsaXN8bGl8bAkJCXsgQkVHSU4oUEFUSF9FWFBFQ1RFRCk7IHJldHVybiB0TElTVDsgfQogPElOSVRJQUw+ZW5hYmxlfGVuYWJsfGVuYWJ8ZW5hCQl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRFTkFCTEU7fQogPElOSVRJQUw+ZGlzYWJsZXxkaXNhYmx8ZGlzYWJ8ZGlzYXxkaXMJeyBCRUdJTihOT0NNRCk7IHJldHVybiB0RElTQUJMRTsgfQotPElOSVRJQUwsSU5GT19DTUQsREVMX0NNRD5kaXNwbGF5fGRpc3BsYXxkaXNwbHxkaXNwCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdERJU1BMQVk7IH0KKzxJTklUSUFMLElORk9fQ01ELERFTF9DTUQ+ZGlzcGxheXxkaXNwbGF8ZGlzcGx8ZGlzcAl7IEJFR0lOKEZPUk1BVF9FWFBFQ1RFRCk7IHJldHVybiB0RElTUExBWTsgfQogPElOSVRJQUw+dW5kaXNwbGF5fHVuZGlzcGxhfHVuZGlzcGx8dW5kaXNwfHVuZGlzfHVuZGl8dW5kCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdFVORElTUExBWTsgfQogPElOSVRJQUw+ZGVsZXRlfGRlbGV0fGRlbGV8ZGVsCQl7IEJFR0lOKERFTF9DTUQpOyByZXR1cm4gdERFTEVURTsgfQogPElOSVRJQUw+cXVpdHxxdWl8cXV8cQkJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdFFVSVQ7IH0KQEAgLTE1NSwxMSArMTU1LDIyIEBACiA8SU5JVElBTCxTSE9XX0NNRD5kaXJlY3Rvcmllc3xkaXJlY3RvcmllfGRpcmVjdG9yaXxkaXJlY3RvcnxkaXJlY3RvfGRpcmVjdHxkaXJlY3xkaXJlY3xkaXIgeyAKIAkJCUJFR0lOKFBBVEhfRVhQRUNURUQpOyByZXR1cm4gdERJUjsgfQogCitjaGFyCQkJCQl7IHJldHVybiB0Q0hBUjsgfQorc2hvcnQJCQkJCXsgcmV0dXJuIHRTSE9SVDsgfQoraW50CQkJCQl7IHJldHVybiB0SU5UOyB9Citsb25nCQkJCQl7IHJldHVybiB0TE9ORzsgfQorZmxvYXQJCQkJCXsgcmV0dXJuIHRGTE9BVDsgfQorZG91YmxlCQkJCQl7IHJldHVybiB0RE9VQkxFOyB9Cit1bnNpZ25lZAkJCQl7IHJldHVybiB0VU5TSUdORUQ7IH0KK3NpZ25lZAkJCQkJeyByZXR1cm4gdFNJR05FRDsgfQorc3RydWN0CQkJCQl7IHJldHVybiB0U1RSVUNUOyB9Cit1bmlvbgkJCQkJeyByZXR1cm4gdFVOSU9OOyB9CitlbnVtCQkJCQl7IHJldHVybiB0RU5VTTsgfQorCiB7SURFTlRJRklFUn0JeyB5eWx2YWwuc3RyaW5nID0gbWFrZV9zeW1ib2woeXl0ZXh0KTsgcmV0dXJuIHRJREVOVElGSUVSOyB9CiAKIDxQQVRIX0VYUEVDVEVEPntQQVRITkFNRX0JeyB5eWx2YWwuc3RyaW5nID0gbWFrZV9zeW1ib2woeXl0ZXh0KTsgcmV0dXJuIHRQQVRIOyB9CiAKLQogWyBcdF0rICAgICAgICAvKiBFYXQgdXAgd2hpdGVzcGFjZSAqLwogCiAuCQl7IGlmIChzeW50YXhfZXJyb3IgPT0gMCkKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2Rpc3BsYXkuYyBiL2RlYnVnZ2VyL2Rpc3BsYXkuYwppbmRleCBiMTcwMDI2Li5mZDdlOGM2IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kaXNwbGF5LmMKKysrIGIvZGVidWdnZXIvZGlzcGxheS5jCkBAIC0yMCwxMCArMjAsMTggQEAKICNpbmNsdWRlIDxzdGRhcmcuaD4KIAogI2RlZmluZSBNQVhfRElTUExBWSAyNQotc3RhdGljIHN0cnVjdCBleHByICogZGlzcGxheXBvaW50c1tNQVhfRElTUExBWV07CisKK3N0cnVjdCBkaXNwbGF5Cit7CisgIHN0cnVjdCBleHByICoJZXhwOworICBpbnQJCWNvdW50OworICBjaGFyCQlmb3JtYXQ7Cit9OworCitzdGF0aWMgc3RydWN0IGRpc3BsYXkgZGlzcGxheXBvaW50c1tNQVhfRElTUExBWV07CiAKIGludAotREVCVUdfQWRkRGlzcGxheShzdHJ1Y3QgZXhwciAqIGV4cCkKK0RFQlVHX0FkZERpc3BsYXkoc3RydWN0IGV4cHIgKiBleHAsIGludCBjb3VudCwgY2hhciBmb3JtYXQpCiB7CiAgIGludCBpOwogCkBAIC0zMiw5ICs0MCwxMSBAQAogICAgKi8KICAgZm9yKGk9MDsgaSA8IE1BWF9ESVNQTEFZOyBpKysgKQogICAgIHsKLSAgICAgIGlmKCBkaXNwbGF5cG9pbnRzW2ldID09IE5VTEwgKQorICAgICAgaWYoIGRpc3BsYXlwb2ludHNbaV0uZXhwID09IE5VTEwgKQogCXsKLQkgIGRpc3BsYXlwb2ludHNbaV0gPSBERUJVR19DbG9uZUV4cHIoZXhwKTsKKwkgIGRpc3BsYXlwb2ludHNbaV0uZXhwID0gREVCVUdfQ2xvbmVFeHByKGV4cCk7CisJICBkaXNwbGF5cG9pbnRzW2ldLmNvdW50ICA9IGNvdW50OworCSAgZGlzcGxheXBvaW50c1tpXS5mb3JtYXQgPSBmb3JtYXQ7CiAJICBicmVhazsKIAl9CiAgICAgfQpAQCAtNTIsMTAgKzYyLDEwIEBACiAgICAqLwogICBmb3IoaT0wOyBpIDwgTUFYX0RJU1BMQVk7IGkrKyApCiAgICAgewotICAgICAgaWYoIGRpc3BsYXlwb2ludHNbaV0gIT0gTlVMTCApCisgICAgICBpZiggZGlzcGxheXBvaW50c1tpXS5leHAgIT0gTlVMTCApCiAJewogCSAgZnByaW50ZihzdGRlcnIsICIlZCA6ICIsIGkrMSk7Ci0JICBERUJVR19EaXNwbGF5RXhwcihkaXNwbGF5cG9pbnRzW2ldKTsKKwkgIERFQlVHX0Rpc3BsYXlFeHByKGRpc3BsYXlwb2ludHNbaV0uZXhwKTsKIAkgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKIAl9CiAgICAgfQpAQCAtNzQsMjIgKzg0LDMzIEBACiAgICAqLwogICBmb3IoaT0wOyBpIDwgTUFYX0RJU1BMQVk7IGkrKyApCiAgICAgewotICAgICAgaWYoIGRpc3BsYXlwb2ludHNbaV0gIT0gTlVMTCApCisgICAgICBpZiggZGlzcGxheXBvaW50c1tpXS5leHAgIT0gTlVMTCApCiAJewotCSAgYWRkciA9IERFQlVHX0V2YWxFeHByKGRpc3BsYXlwb2ludHNbaV0pOworCSAgYWRkciA9IERFQlVHX0V2YWxFeHByKGRpc3BsYXlwb2ludHNbaV0uZXhwKTsKIAkgIGlmKCBhZGRyLnR5cGUgPT0gTlVMTCApCiAJICAgIHsKIAkgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBldmFsdWF0ZSBleHByZXNzaW9uICIpOwotCSAgICAgIERFQlVHX0Rpc3BsYXlFeHByKGRpc3BsYXlwb2ludHNbaV0pOworCSAgICAgIERFQlVHX0Rpc3BsYXlFeHByKGRpc3BsYXlwb2ludHNbaV0uZXhwKTsKIAkgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuRGlzYWJsaW5nLi4uXG4iKTsKIAkgICAgICBERUJVR19EZWxEaXNwbGF5KGkpOwogCSAgICB9CiAJICBlbHNlCiAJICAgIHsKIAkgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkICA6ICIsIGkgKyAxKTsKLQkgICAgICBERUJVR19EaXNwbGF5RXhwcihkaXNwbGF5cG9pbnRzW2ldKTsKKwkgICAgICBERUJVR19EaXNwbGF5RXhwcihkaXNwbGF5cG9pbnRzW2ldLmV4cCk7CiAJICAgICAgZnByaW50ZihzdGRlcnIsICIgPSAiKTsKLQkgICAgICBERUJVR19QcmludCggJmFkZHIsIDEsIDAsIDApOworCSAgICAgIGlmKCBkaXNwbGF5cG9pbnRzW2ldLmZvcm1hdCA9PSAnaScgKQorCQl7CisJCSAgREVCVUdfRXhhbWluZU1lbW9yeSggJmFkZHIsIAorCQkJICAgICAgIGRpc3BsYXlwb2ludHNbaV0uY291bnQsIAorCQkJICAgICAgIGRpc3BsYXlwb2ludHNbaV0uZm9ybWF0KTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIERFQlVHX1ByaW50KCAmYWRkciwgCisJCQkgICAgICAgZGlzcGxheXBvaW50c1tpXS5jb3VudCwgCisJCQkgICAgICAgZGlzcGxheXBvaW50c1tpXS5mb3JtYXQsIDApOworCQl9CiAJICAgIH0KIAl9CiAgICAgfQpAQCAtMTExLDE3ICsxMzIsMTcgQEAKICAgICB7CiAgICAgICBmb3IoaT0wOyBpIDwgTUFYX0RJU1BMQVk7IGkrKyApCiAJewotCSAgaWYoIGRpc3BsYXlwb2ludHNbaV0gIT0gTlVMTCApCisJICBpZiggZGlzcGxheXBvaW50c1tpXS5leHAgIT0gTlVMTCApCiAJICAgIHsKLQkgICAgICBERUJVR19GcmVlRXhwcihkaXNwbGF5cG9pbnRzW2ldKTsKLQkgICAgICBkaXNwbGF5cG9pbnRzW2ldID0gTlVMTDsKKwkgICAgICBERUJVR19GcmVlRXhwcihkaXNwbGF5cG9pbnRzW2ldLmV4cCk7CisJICAgICAgZGlzcGxheXBvaW50c1tpXS5leHAgPSBOVUxMOwogCSAgICB9CiAJfQogICAgIH0KLSAgZWxzZSBpZiggZGlzcGxheXBvaW50c1tkaXNwbGF5bnVtIC0gMV0gIT0gTlVMTCApCisgIGVsc2UgaWYoIGRpc3BsYXlwb2ludHNbZGlzcGxheW51bSAtIDFdLmV4cCAhPSBOVUxMICkKICAgICB7Ci0gICAgICBERUJVR19GcmVlRXhwcihkaXNwbGF5cG9pbnRzW2Rpc3BsYXludW0gLSAxXSk7Ci0gICAgICBkaXNwbGF5cG9pbnRzW2Rpc3BsYXludW0gLSAxXSA9IE5VTEw7CisgICAgICBERUJVR19GcmVlRXhwcihkaXNwbGF5cG9pbnRzW2Rpc3BsYXludW0gLSAxXS5leHApOworICAgICAgZGlzcGxheXBvaW50c1tkaXNwbGF5bnVtIC0gMV0uZXhwID0gTlVMTDsKICAgICB9CiAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZXhwci5jIGIvZGVidWdnZXIvZXhwci5jCmluZGV4IDRiZjc4ZWYuLjZlZjhkMzcgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2V4cHIuYworKysgYi9kZWJ1Z2dlci9leHByLmMKQEAgLTcwLDYgKzcwLDEyIEBACiAKICAgICBzdHJ1Y3QKICAgICB7CisgICAgICBzdHJ1Y3QgZGF0YXR5cGUgKiBjYXN0OworICAgICAgc3RydWN0IGV4cHIgICAgICogZXhwcjsKKyAgICB9IGNhc3Q7CisKKyAgICBzdHJ1Y3QKKyAgICB7CiAgICAgICBzdHJ1Y3QgZXhwciAqIGV4cDE7CiAgICAgICBjb25zdCBjaGFyICogZWxlbWVudF9uYW1lOwogICAgICAgaW50IHJlc3VsdDsKQEAgLTEwMyw2ICsxMDksNyBAQAogI2RlZmluZSBFWFBSX1RZUEVfQVJSQVkJCTgKICNkZWZpbmUgRVhQUl9UWVBFX0NBTEwJCTkKICNkZWZpbmUgRVhQUl9UWVBFX1NUUklORwkxMAorI2RlZmluZSBFWFBSX1RZUEVfQ0FTVAkJMTEKIAogc3RhdGljIGNoYXIgZXhwcl9saXN0WzQwOTZdOwogc3RhdGljIGludCBuZXh0X2V4cHJfZnJlZSA9IDA7CkBAIC0xMzIsNiArMTM5LDE4IEBACiAgIG5leHRfZXhwcl9mcmVlID0gMDsKIH0KIAorc3RydWN0IGV4cHIgKgorREVCVUdfVHlwZUNhc3RFeHByKHN0cnVjdCBkYXRhdHlwZSAqIGR0LCBzdHJ1Y3QgZXhwciAqIGV4cCkKK3sKKyAgc3RydWN0IGV4cHIgKiBleDsKKworICBleCA9IERFQlVHX0dldEZyZWVFeHByKCk7CisKKyAgZXgtPnR5cGUgICAgICAgID0gRVhQUl9UWVBFX0NBU1Q7CisgIGV4LT51bi5jYXN0LmNhc3QgPSBkdDsKKyAgZXgtPnVuLmNhc3QuZXhwciA9IGV4cDsKKyAgcmV0dXJuIGV4OworfQogCiBzdHJ1Y3QgZXhwciAqCiBERUJVR19SZWdpc3RlckV4cHIoZW51bSBkZWJ1Z19yZWdzIHJlZ25vKQpAQCAtMjk0LDYgKzMxMywxMCBAQAogCiAgIHN3aXRjaChleHAtPnR5cGUpCiAgICAgeworICAgIGNhc2UgRVhQUl9UWVBFX0NBU1Q6CisgICAgICBydG4gPSBERUJVR19FdmFsRXhwcihleHAtPnVuLmNhc3QuZXhwcik7CisgICAgICBydG4udHlwZSA9IGV4cC0+dW4uY2FzdC5jYXN0OworICAgICAgYnJlYWs7CiAgICAgY2FzZSBFWFBSX1RZUEVfU1RSSU5HOgogICAgICAgcnRuLnR5cGUgPSBERUJVR19UeXBlU3RyaW5nOwogICAgICAgcnRuLm9mZiA9ICh1bnNpZ25lZCBpbnQpICZleHAtPnVuLnN0cmluZy5zdHI7CkBAIC02MjAsNiArNjQzLDEzIEBACiAKICAgc3dpdGNoKGV4cC0+dHlwZSkKICAgICB7CisgICAgY2FzZSBFWFBSX1RZUEVfQ0FTVDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiKCgiKTsKKyAgICAgIERFQlVHX1ByaW50VHlwZUNhc3QoZXhwLT51bi5jYXN0LmNhc3QpOworICAgICAgZnByaW50ZihzdGRlcnIsICIpIik7CisgICAgICBERUJVR19EaXNwbGF5RXhwcihleHAtPnVuLmNhc3QuZXhwcik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIikiKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRVhQUl9UWVBFX1JFR0lTVEVSOgogICAgICAgREVCVUdfUHJpbnRSZWdpc3RlcihleHAtPnVuLnJnaXN0ZXIucmVnKTsKICAgICAgIGJyZWFrOwpAQCAtNzgwLDYgKzgxMCw5IEBACiAKICAgc3dpdGNoKGV4cC0+dHlwZSkKICAgICB7CisgICAgY2FzZSBFWFBSX1RZUEVfQ0FTVDoKKyAgICAgIHJ0bi0+dW4uY2FzdC5leHByID0gREVCVUdfQ2xvbmVFeHByKGV4cC0+dW4uY2FzdC5leHByKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRVhQUl9UWVBFX1JFR0lTVEVSOgogICAgIGNhc2UgRVhQUl9UWVBFX1VTX0NPTlNUOgogICAgIGNhc2UgRVhQUl9UWVBFX0NPTlNUOgpAQCAtODM0LDYgKzg2Nyw5IEBACiAKICAgc3dpdGNoKGV4cC0+dHlwZSkKICAgICB7CisgICAgY2FzZSBFWFBSX1RZUEVfQ0FTVDoKKyAgICAgIERFQlVHX0ZyZWVFeHByKGV4cC0+dW4uY2FzdC5leHByKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRVhQUl9UWVBFX1JFR0lTVEVSOgogICAgIGNhc2UgRVhQUl9UWVBFX1VTX0NPTlNUOgogICAgIGNhc2UgRVhQUl9UWVBFX0NPTlNUOgpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvaGFzaC5jIGIvZGVidWdnZXIvaGFzaC5jCmluZGV4IDI2ODRlYTAuLjIwZjNlNjQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2hhc2guYworKysgYi9kZWJ1Z2dlci9oYXNoLmMKQEAgLTE4LDYgKzE4LDkgQEAKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKICNkZWZpbmUgTlJfTkFNRV9IQVNIIDE2Mzg0CisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYIF9NQVhfUEFUSAorI2VuZGlmCiAKIHN0YXRpYyBjaGFyICogcmVnX25hbWVbXSA9CiB7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9pbmZvLmMgYi9kZWJ1Z2dlci9pbmZvLmMKaW5kZXggNmM1ZjRkZS4uZGQ1Yjc2YSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvaW5mby5jCisrKyBiL2RlYnVnZ2VyL2luZm8uYwpAQCAtMTcsMTAgKzE3LDEwIEBACiAgKi8KIHZvaWQgREVCVUdfUHJpbnRCYXNpYyggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBjb3VudCwgY2hhciBmb3JtYXQgKQogewotICBjaGFyICogZGVmYXVsdF9mb3JtYXQ7CisgIGNoYXIgICAgICAgICogZGVmYXVsdF9mb3JtYXQ7CiAgIGxvbmcgbG9uZyBpbnQgdmFsdWU7CiAKLSAgICBpZiggYWRkci0+dHlwZSA9PSBOVUxMICkKKyAgaWYoIGFkZHItPnR5cGUgPT0gTlVMTCApCiAgICAgewogICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZXZhbHVhdGUgZXhwcmVzc2lvblxuIik7CiAgICAgICByZXR1cm47CkBAIC0zMiwxNiArMzIsMjIgQEAKICAgc3dpdGNoKGZvcm1hdCkKICAgICB7CiAgICAgY2FzZSAneCc6Ci0gICAgICBpZiAoYWRkci0+c2VnKSBmcHJpbnRmKCBzdGRlcnIsICIweCUwNGx4IiwgKGxvbmcgdW5zaWduZWQgaW50KSB2YWx1ZSApOwotICAgICAgZWxzZSBmcHJpbnRmKCBzdGRlcnIsICIweCUwOGx4IiwgKGxvbmcgdW5zaWduZWQgaW50KSB2YWx1ZSApOworICAgICAgaWYgKGFkZHItPnNlZykgCisJeworCSAgREVCVUdfbmNoYXIgKz0gZnByaW50Ziggc3RkZXJyLCAiMHglMDRseCIsIChsb25nIHVuc2lnbmVkIGludCkgdmFsdWUgKTsKKwl9CisgICAgICBlbHNlIAorCXsKKwkgIERFQlVHX25jaGFyICs9IGZwcmludGYoIHN0ZGVyciwgIjB4JTA4bHgiLCAobG9uZyB1bnNpZ25lZCBpbnQpIHZhbHVlICk7CisJfQogICAgICAgYnJlYWs7CiAgICAgICAKICAgICBjYXNlICdkJzoKLSAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVsZFxuIiwgKGxvbmcgaW50KSB2YWx1ZSApOworICAgICAgREVCVUdfbmNoYXIgKz0gZnByaW50Ziggc3RkZXJyLCAiJWxkXG4iLCAobG9uZyBpbnQpIHZhbHVlICk7CiAgICAgICBicmVhazsKICAgICAgIAogICAgIGNhc2UgJ2MnOgotICAgICAgZnByaW50Ziggc3RkZXJyLCAiJWQgPSAnJWMnIiwKKyAgICAgIERFQlVHX25jaGFyICs9IGZwcmludGYoIHN0ZGVyciwgIiVkID0gJyVjJyIsCiAJICAgICAgIChjaGFyKSh2YWx1ZSAmIDB4ZmYpLCAoY2hhcikodmFsdWUgJiAweGZmKSApOwogICAgICAgYnJlYWs7CiAgICAgICAKQEAgLTUzLDExICs1OSwxMCBAQAogICAgIGNhc2UgMDoKICAgICAgIGlmKCBkZWZhdWx0X2Zvcm1hdCAhPSBOVUxMICkKIAl7Ci0JICBmcHJpbnRmKCBzdGRlcnIsIGRlZmF1bHRfZm9ybWF0LCB2YWx1ZSApOworCSAgREVCVUdfbmNoYXIgKz0gZnByaW50Ziggc3RkZXJyLCBkZWZhdWx0X2Zvcm1hdCwgdmFsdWUgKTsKIAl9CiAgICAgICBicmVhazsKICAgICB9Ci0KIH0KIAogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9tc2MuYyBiL2RlYnVnZ2VyL21zYy5jCmluZGV4IDFjMTgxN2IuLjkwYmYwZmQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL21zYy5jCisrKyBiL2RlYnVnZ2VyL21zYy5jCkBAIC01MTIsOSArNTEyLDkgQEAKIAljaGFyCQkJCSogbW9kdWxlX25hbWU7CiAJY2hhcgkJCQkqIGRiZ19pbmZvOwogCWludAkJCQkgIGRiZ19zaXplOwotCXN0cnVjdCBQRV9EZWJ1Z19kaXIJCSogZGJnZGlyOworCUxQSU1BR0VfREVCVUdfRElSRUNUT1JZICAgICAgICAgICBkYmdkaXI7CiAJc3RydWN0IHBlX2RhdGEJCQkqIHBlOwotICAgICAgICBzdHJ1Y3QgcGVfc2VnbWVudF90YWJsZSAgICAgICAgICogc2VjdHA7CisgICAgICAgIExQSU1BR0VfU0VDVElPTl9IRUFERVIJICAgICAgICAgIHNlY3RwOwogCWludAkJCQkgIG5zZWN0OwogCXNob3J0IGludAkJCSAgZGJnX2luZGV4OwkJCQogCWNoYXIJCQkJICBsb2FkZWQ7CkBAIC03NDcsMTcgKzc0NywyNCBAQAogCSAgICB9CiAJICBtZW1zZXQoc3ltbmFtZSwgMCwgc2l6ZW9mKHN5bW5hbWUpKTsKIAkgIG1lbWNweShzeW1uYW1lLCB0eXBlLT5zdHJ1Y3R1cmUubmFtZSwgdHlwZS0+c3RydWN0dXJlLm5hbWVsZW4pOwotCSAgdHlwZXB0ciA9IERFQlVHX05ld0RhdGFUeXBlKFNUUlVDVCwgc3ltbmFtZSk7CisJICBpZiggc3RyY21wKHN5bW5hbWUsICJfX3VubmFtZWQiKSA9PSAwICkKKwkgICAgeworCSAgICAgIHR5cGVwdHIgPSBERUJVR19OZXdEYXRhVHlwZShTVFJVQ1QsIE5VTEwpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0eXBlcHRyID0gREVCVUdfTmV3RGF0YVR5cGUoU1RSVUNULCBzeW1uYW1lKTsKKwkgICAgfQogCSAgY3ZfZGVmaW5lZF90eXBlc1tjdXJyX3R5cGUgLSAweDEwMDBdID0gdHlwZXB0cjsKIAogCSAgLyoKIAkgICAqIE5vdyBjb3B5IHRoZSByZWxldmFudCBiaXRzIGZyb20gdGhlIGZpZWxkbGlzdCB0aGF0IHdlIHNwZWNpZmllZC4KIAkgICAqLwogCSAgc3VidHlwZSA9IERFQlVHX0dldENWVHlwZSh0eXBlLT5zdHJ1Y3R1cmUuZmllbGRsaXN0KTsKLQkgIERFQlVHX1NldFN0cnVjdFNpemUodHlwZXB0ciwgdHlwZS0+c3RydWN0dXJlLnN0cnVjdGxlbik7CiAKIAkgIGlmKCBzdWJ0eXBlICE9IE5VTEwgKQogCSAgICB7CisJICAgICAgREVCVUdfU2V0U3RydWN0U2l6ZSh0eXBlcHRyLCB0eXBlLT5zdHJ1Y3R1cmUuc3RydWN0bGVuKTsKIAkgICAgICBERUJVR19Db3B5RmllbGRsaXN0KHR5cGVwdHIsIHN1YnR5cGUpOwogCSAgICB9CiAJICBicmVhazsKQEAgLTc3MywxNyArNzgwLDI2IEBACiAJICAgIH0KIAkgIG1lbXNldChzeW1uYW1lLCAwLCBzaXplb2Yoc3ltbmFtZSkpOwogCSAgbWVtY3B5KHN5bW5hbWUsIHR5cGUtPnRfdW5pb24ubmFtZSwgdHlwZS0+dF91bmlvbi5uYW1lbGVuKTsKLQkgIHR5cGVwdHIgPSBERUJVR19OZXdEYXRhVHlwZShTVFJVQ1QsIHN5bW5hbWUpOworCisJICBpZiggc3RyY21wKHN5bW5hbWUsICJfX3VubmFtZWQiKSA9PSAwICkKKwkgICAgeworCSAgICAgIHR5cGVwdHIgPSBERUJVR19OZXdEYXRhVHlwZShTVFJVQ1QsIE5VTEwpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0eXBlcHRyID0gREVCVUdfTmV3RGF0YVR5cGUoU1RSVUNULCBzeW1uYW1lKTsKKwkgICAgfQorCiAJICBjdl9kZWZpbmVkX3R5cGVzW2N1cnJfdHlwZSAtIDB4MTAwMF0gPSB0eXBlcHRyOwogCiAJICAvKgogCSAgICogTm93IGNvcHkgdGhlIHJlbGV2YW50IGJpdHMgZnJvbSB0aGUgZmllbGRsaXN0IHRoYXQgd2Ugc3BlY2lmaWVkLgogCSAgICovCiAJICBzdWJ0eXBlID0gREVCVUdfR2V0Q1ZUeXBlKHR5cGUtPnRfdW5pb24uZmllbGQpOwotCSAgREVCVUdfU2V0U3RydWN0U2l6ZSh0eXBlcHRyLCB0eXBlLT50X3VuaW9uLnVuX2xlbik7CiAKIAkgIGlmKCBzdWJ0eXBlICE9IE5VTEwgKQogCSAgICB7CisJICAgICAgREVCVUdfU2V0U3RydWN0U2l6ZSh0eXBlcHRyLCB0eXBlLT50X3VuaW9uLnVuX2xlbik7CiAJICAgICAgREVCVUdfQ29weUZpZWxkbGlzdCh0eXBlcHRyLCBzdWJ0eXBlKTsKIAkgICAgfQogCSAgYnJlYWs7CkBAIC04NzQsMTQgKzg5MCwxNCBAQAogICBpbnQJCQkgIGhhc19jb2RldmlldyA9IEZBTFNFOwogICBpbnQJCQkgIHJ0biA9IEZBTFNFOwogICBpbnQJCQkgIG9yaWdfc2l6ZTsKLSAgc3RydWN0IFBFX0RlYnVnX2RpcgkqIGRiZ3B0cjsKKyAgTFBJTUFHRV9ERUJVR19ESVJFQ1RPUlkgZGJncHRyOwogICBzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbyAqIGRlZWZlcjsKIAogICBvcmlnX3NpemUgPSBzaXplOwotICBkYmdwdHIgPSAoc3RydWN0IFBFX0RlYnVnX2RpciAqKSAobG9hZF9hZGRyICsgdl9hZGRyKTsKKyAgZGJncHRyID0gKExQSU1BR0VfREVCVUdfRElSRUNUT1JZKSAobG9hZF9hZGRyICsgdl9hZGRyKTsKICAgZm9yKDsgc2l6ZSA+IDA7IHNpemUgLT0gc2l6ZW9mKCpkYmdwdHIpLCBkYmdwdHIrKyApCiAgICAgewotICAgICAgc3dpdGNoKGRiZ3B0ci0+dHlwZSkKKyAgICAgIHN3aXRjaChkYmdwdHItPlR5cGUpCiAJewogCWNhc2UgSU1BR0VfREVCVUdfVFlQRV9DT0RFVklFVzoKIAljYXNlIElNQUdFX0RFQlVHX1RZUEVfTUlTQzoKQEAgLTg5MSwxMCArOTA3LDEwIEBACiAgICAgfQogCiAgIHNpemUgPSBvcmlnX3NpemU7Ci0gIGRiZ3B0ciA9IChzdHJ1Y3QgUEVfRGVidWdfZGlyICopIChsb2FkX2FkZHIgKyB2X2FkZHIpOworICBkYmdwdHIgPSAoTFBJTUFHRV9ERUJVR19ESVJFQ1RPUlkpIChsb2FkX2FkZHIgKyB2X2FkZHIpOwogICBmb3IoOyBzaXplID4gMDsgc2l6ZSAtPSBzaXplb2YoKmRiZ3B0ciksIGRiZ3B0cisrICkKICAgICB7Ci0gICAgICBzd2l0Y2goZGJncHRyLT50eXBlKQorICAgICAgc3dpdGNoKGRiZ3B0ci0+VHlwZSkKIAl7CiAJY2FzZSBJTUFHRV9ERUJVR19UWVBFX0NPRkY6CiAJICAvKgpAQCAtOTIxLDggKzkzNyw4IEBACiAJICAgKiBtZWFucyB0aGF0IHRoaXMgZW50cnkgcG9pbnRzIHRvIGEgLkRCRyBmaWxlLiAgT3RoZXJ3aXNlLAogCSAgICogaXQganVzdCBwb2ludHMgdG8gaXRzZWxmLCBhbmQgd2UgY2FuIGlnbm9yZSB0aGlzLgogCSAgICovCi0JICBpZiggICAgKGRiZ3B0ci0+dHlwZSA9PSBJTUFHRV9ERUJVR19UWVBFX01JU0MpCi0JICAgICAgJiYgKHBlLT5wZV9oZWFkZXItPmNvZmYuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCkgPT0gMCApCisJICBpZiggICAgKGRiZ3B0ci0+VHlwZSA9PSBJTUFHRV9ERUJVR19UWVBFX01JU0MpCisJICAgICAgJiYgKHBlLT5wZV9oZWFkZXItPkZpbGVIZWFkZXIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCkgPT0gMCApCiAJICAgIHsKIAkgICAgICBicmVhazsKIAkgICAgfQpAQCAtOTM4LDkgKzk1NCw5IEBACiAJICAgKiB1cG9uIHRoZSB0eXBlLCBidXQgdGhpcyBpcyBhbHdheXMgZW5vdWdoIHNvIHdlIGFyZSBhYmxlCiAJICAgKiB0byBwcm9jZWVkIGlmIHdlIGtub3cgd2hhdCB3ZSBuZWVkIHRvIGRvIG5leHQuCiAJICAgKi8KLQkgIGRlZWZlci0+ZGJnX3NpemUgPSBkYmdwdHItPmRiZ3NpemU7Ci0JICBkZWVmZXItPmRiZ19pbmZvID0gKGNoYXIgKikgeG1hbGxvYyhkYmdwdHItPmRiZ3NpemUpOwotCSAgbHNlZWsoZmQsIGRiZ3B0ci0+ZGJnb2ZmLCBTRUVLX1NFVCk7CisJICBkZWVmZXItPmRiZ19zaXplID0gZGJncHRyLT5TaXplT2ZEYXRhOworCSAgZGVlZmVyLT5kYmdfaW5mbyA9IChjaGFyICopIHhtYWxsb2MoZGJncHRyLT5TaXplT2ZEYXRhKTsKKwkgIGxzZWVrKGZkLCBkYmdwdHItPlBvaW50ZXJUb1Jhd0RhdGEsIFNFRUtfU0VUKTsKIAkgIHJlYWQoZmQsIGRlZWZlci0+ZGJnX2luZm8sIGRlZWZlci0+ZGJnX3NpemUpOwogCiAJICBkZWVmZXItPmxvYWRfYWRkciA9IChjaGFyICopIGxvYWRfYWRkcjsKQEAgLTk1MSw3ICs5NjcsNyBAQAogCSAgZGVlZmVyLT5tb2R1bGVfbmFtZSA9IHhzdHJkdXAoREVCVUdfY3Vycl9tb2R1bGUpOwogCiAJICBkZWVmZXItPnNlY3RwID0gcGUtPnBlX3NlZzsKLQkgIGRlZWZlci0+bnNlY3QgPSBwZS0+cGVfaGVhZGVyLT5jb2ZmLk51bWJlck9mU2VjdGlvbnM7CisJICBkZWVmZXItPm5zZWN0ID0gcGUtPnBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zOwogCiAJICBkYmdsaXN0ID0gZGVlZmVyOwogCSAgYnJlYWs7CkBAIC0xNTM4LDcgKzE1NTQsNyBAQAogICBEQkdfQUREUgkJICBuZXdfYWRkcjsKICAgaW50CQkJICBuc2VjdDsKICAgdW5pb24gYW55X3NpemUJICBwdHI7Ci0gIHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlICogc2VjdHA7CisgIElNQUdFX1NFQ1RJT05fSEVBREVSICAqIHNlY3RwOwogICB1bmlvbgljb2Rldmlld19zeW1ib2wJKiBzeW07CiAgIGNoYXIJCQkgIHN5bW5hbWVbUEFUSF9NQVhdOwogICBzdHJ1Y3QgbmFtZV9oYXNoCSogdGh1bmtfc3ltID0gTlVMTDsKQEAgLTE2MDEsNyArMTYxNyw3IEBACiAJICBuZXdfYWRkci5zZWcgPSAwOwogCSAgbmV3X2FkZHIudHlwZSA9IERFQlVHX0dldENWVHlwZShzeW0tPmRhdGEuc3ltdHlwZSk7CiAJICBuZXdfYWRkci5vZmYgPSAodW5zaWduZWQgaW50KSBkZWVmZXItPmxvYWRfYWRkciArIAotCSAgICBzZWN0cFtzeW0tPmRhdGEuc2VnIC0gMV0uVmlydHVhbF9BZGRyZXNzICsgCisJICAgIHNlY3RwW3N5bS0+ZGF0YS5zZWcgLSAxXS5WaXJ0dWFsQWRkcmVzcyArIAogCSAgICBzeW0tPmRhdGEub2Zmc2V0OwogCSAgREVCVUdfQWRkU3ltYm9sKCBzeW1uYW1lLCAmbmV3X2FkZHIsIE5VTEwsIFNZTV9XSU4zMiB8IFNZTV9EQVRBICk7CiAJICBicmVhazsKQEAgLTE2MTUsNyArMTYzMSw3IEBACiAJICBuZXdfYWRkci5zZWcgPSAwOwogCSAgbmV3X2FkZHIudHlwZSA9IE5VTEw7CiAJICBuZXdfYWRkci5vZmYgPSAodW5zaWduZWQgaW50KSBkZWVmZXItPmxvYWRfYWRkciArIAotCSAgICBzZWN0cFtzeW0tPnRodW5rLnNlZ21lbnQgLSAxXS5WaXJ0dWFsX0FkZHJlc3MgKyAKKwkgICAgc2VjdHBbc3ltLT50aHVuay5zZWdtZW50IC0gMV0uVmlydHVhbEFkZHJlc3MgKyAKIAkgICAgc3ltLT50aHVuay5vZmZzZXQ7CiAJICB0aHVua19zeW0gPSBERUJVR19BZGRTeW1ib2woIHN5bW5hbWUsICZuZXdfYWRkciwgTlVMTCwgCiAJCQkJICAgICAgIFNZTV9XSU4zMiB8IFNZTV9GVU5DKTsKQEAgLTE2MzAsNyArMTY0Niw3IEBACiAJICBuZXdfYWRkci5zZWcgPSAwOwogCSAgbmV3X2FkZHIudHlwZSA9IERFQlVHX0dldENWVHlwZShzeW0tPnByb2MucHJvY3R5cGUpOwogCSAgbmV3X2FkZHIub2ZmID0gKHVuc2lnbmVkIGludCkgZGVlZmVyLT5sb2FkX2FkZHIgKyAKLQkgICAgc2VjdHBbc3ltLT5wcm9jLnNlZ21lbnQgLSAxXS5WaXJ0dWFsX0FkZHJlc3MgKyAKKwkgICAgc2VjdHBbc3ltLT5wcm9jLnNlZ21lbnQgLSAxXS5WaXJ0dWFsQWRkcmVzcyArIAogCSAgICBzeW0tPnByb2Mub2Zmc2V0OwogCSAgLyoKIAkgICAqIFNlZSBpZiB3ZSBjYW4gZmluZCBhIHNlZ21lbnQgdGhhdCB0aGlzIGdvZXMgd2l0aC4gIElmIHNvLApAQCAtMTY0MCwxMCArMTY1NiwxMCBAQAogCSAgZm9yKGk9MDsgbGluZXRhYltpXS5saW5ldGFiICE9IE5VTEw7IGkrKykKIAkgICAgewogCSAgICAgIGlmKCAgICAgKCh1bnNpZ25lZCBpbnQpIGRlZWZlci0+bG9hZF9hZGRyIAotCQkgICAgICAgKyBzZWN0cFtsaW5ldGFiW2ldLnNlZ25vIC0gMV0uVmlydHVhbF9BZGRyZXNzIAorCQkgICAgICAgKyBzZWN0cFtsaW5ldGFiW2ldLnNlZ25vIC0gMV0uVmlydHVhbEFkZHJlc3MgCiAJCSAgICAgICArIGxpbmV0YWJbaV0uc3RhcnQgPD0gbmV3X2FkZHIub2ZmKQogCQkgICYmICAoKHVuc2lnbmVkIGludCkgZGVlZmVyLT5sb2FkX2FkZHIgCi0JCSAgICAgICArIHNlY3RwW2xpbmV0YWJbaV0uc2Vnbm8gLSAxXS5WaXJ0dWFsX0FkZHJlc3MgCisJCSAgICAgICArIHNlY3RwW2xpbmV0YWJbaV0uc2Vnbm8gLSAxXS5WaXJ0dWFsQWRkcmVzcyAKIAkJICAgICAgICsgbGluZXRhYltpXS5lbmQgPiBuZXdfYWRkci5vZmYpICkKIAkJewogCQkgIGJyZWFrOwpAQCAtMjExOSw4ICsyMTM1LDggQEAKICAgaW50CQkJCWo7CiAgIHN0cnVjdCBjb2Rldmlld19saW5ldGFiX2hkciAqIGxpbmV0YWI7CiAgIGludAkJCQluc2VjdDsKLSAgc3RydWN0IFBFX0RCR19GaWxlSGVhZGVyICAgICogcGRiZyA9IE5VTEw7Ci0gIHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlICAgICAqIHNlY3RwOworICBMUElNQUdFX1NFUEFSQVRFX0RFQlVHX0hFQURFUiBwZGJnID0gTlVMTDsKKyAgSU1BR0VfU0VDVElPTl9IRUFERVIgICAgICAgICogc2VjdHA7CiAgIHN0cnVjdCBzdGF0CQkJc3RhdGJ1ZjsKICAgaW50CQkJCXN0YXR1czsKICAgCkBAIC0yMTQ4LDkgKzIxNjQsOSBAQAogICBhZGRyID0gbW1hcCgwLCBzdGF0YnVmLnN0X3NpemUsIFBST1RfUkVBRCwgCiAJICAgICAgTUFQX1BSSVZBVEUsIGZkLCAwKTsKIAotICBwZGJnID0gKHN0cnVjdCBQRV9EQkdfRmlsZUhlYWRlciAqKSBhZGRyOworICBwZGJnID0gKExQSU1BR0VfU0VQQVJBVEVfREVCVUdfSEVBREVSKSBhZGRyOwogCi0gIGlmKCBwZGJnLT5UaW1lRGF0ZVN0YW1wICE9IGRlZWZlci0+ZGJnZGlyLT50aW1lc3RhbXAgKQorICBpZiggcGRiZy0+VGltZURhdGVTdGFtcCAhPSBkZWVmZXItPmRiZ2Rpci0+VGltZURhdGVTdGFtcCApCiAgICAgewogICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nIC0gJXMgaGFzIGluY29ycmVjdCBpbnRlcm5hbCB0aW1lc3RhbXBcbiIsCiAJICAgICAgZmlsZW5hbWUpOwpAQCAtMjE2MCwxMCArMjE3NiwxMCBAQAogICBmcHJpbnRmKHN0ZGVyciwgIlByb2Nlc3Npbmcgc3ltYm9scyBmcm9tICVzLi4uXG4iLCBmaWxlbmFtZSk7CiAKICAgZGJnaGRyID0gKHN0cnVjdCBQRV9EZWJ1Z19kaXIgKikgKCAgYWRkciArIHNpemVvZigqcGRiZykgCi0JCSArIHBkYmctPk51bWJlck9mU2VjdGlvbnMgKiBzaXplb2Yoc3RydWN0IHBlX3NlZ21lbnRfdGFibGUpIAorCQkgKyBwZGJnLT5OdW1iZXJPZlNlY3Rpb25zICogc2l6ZW9mKElNQUdFX1NFQ1RJT05fSEVBREVSKSAKIAkJICsgcGRiZy0+RXhwb3J0ZWROYW1lc1NpemUpOwogCi0gIHNlY3RwID0gKHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlICopICgoY2hhciAqKSBwZGJnICsgc2l6ZW9mKCpwZGJnKSk7CisgIHNlY3RwID0gKExQSU1BR0VfU0VDVElPTl9IRUFERVIpICgoY2hhciAqKSBwZGJnICsgc2l6ZW9mKCpwZGJnKSk7CiAgIG5zZWN0ID0gcGRiZy0+TnVtYmVyT2ZTZWN0aW9uczsKIAogICBmb3IoIGk9MDsgaSA8IHBkYmctPkRlYnVnRGlyZWN0b3J5U2l6ZSAvIHNpemVvZigqcGRiZyk7IGkrKywgZGJnaGRyKysgKQpAQCAtMjMwMCw3ICsyMzE2LDcgQEAKIAkgIGxhc3RfcHJvYyA9IGRlZWZlci0+ZGJnX2luZGV4OwogCX0KIAotICAgICAgc3dpdGNoKGRlZWZlci0+ZGJnZGlyLT50eXBlKQorICAgICAgc3dpdGNoKGRlZWZlci0+ZGJnZGlyLT5UeXBlKQogCXsKIAljYXNlIElNQUdFX0RFQlVHX1RZUEVfQ09GRjoKIAkgIC8qCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWdpc3RlcnMuYyBiL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCmluZGV4IDdjNjhmNmEuLjVlZDc0ZGQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCisrKyBiL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCkBAIC0xODgsNyArMTg4LDcgQEAKICNpZmRlZiBHU19zaWcKICAgICBHU19zaWcoc2lnY29udGV4dCkgID0gR1NfcmVnKCZERUJVR19jb250ZXh0KTsKICNlbHNlCi0gICAgX19hc21fXygibW92dyAldzAsJSVncyI6OiJyIiAoRlNfcmVnKCZERUJVR19jb250ZXh0KSkpOworICAgIF9fYXNtX18oIm1vdncgJXcwLCUlZ3MiOjoiciIgKEdTX3JlZygmREVCVUdfY29udGV4dCkpKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zb3VyY2UuYyBiL2RlYnVnZ2VyL3NvdXJjZS5jCmluZGV4IGQ4MGQzODYuLjRlY2U5MzcgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3NvdXJjZS5jCisrKyBiL2RlYnVnZ2VyL3NvdXJjZS5jCkBAIC05Myw3ICs5Myw3IEBACiB9CiAKIHN0YXRpYwotdm9pZAoraW50CiBERUJVR19EaXNwbGF5U291cmNlKGNoYXIgKiBzb3VyY2VmaWxlLCBpbnQgc3RhcnQsIGludCBlbmQpCiB7CiAgIGNoYXIJCQkgICAgICAqIGFkZHI7CkBAIC0xMDMsNiArMTAzLDcgQEAKICAgc3RydWN0IG9wZW5fZmlsZWxpc3QJICAgICAgKiBvbDsKICAgaW50CQkJCW5saW5lczsKICAgY2hhcgkJCSAgICAgICogcG50OworICBpbnQJCQkJcnRuOwogICBzdHJ1Y3Qgc2VhcmNobGlzdAkgICAgICAqIHNsOwogICBzdHJ1Y3Qgc3RhdAkJCXN0YXRidWY7CiAgIGludAkJCQlzdGF0dXM7CkBAIC0yMTcsNyArMjE4LDcgQEAKIAkJICBvbC0+bGluZWxpc3QgPSBOVUxMOwogCQkgIG9maWxlcyA9IG9sOwogCQkgIGZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gb3BlbiBmaWxlICVzXG4iLCB0bXBwYXRoKTsKLQkJICByZXR1cm47CisJCSAgcmV0dXJuIEZBTFNFOwogCQl9CiAJICAgIH0KIAl9CkBAIC0yMzksMTMgKzI0MCwxMyBAQAogICAgICAgZmQgPSBvcGVuKHRtcHBhdGgsIE9fUkRPTkxZKTsKICAgICAgIGlmKCBmZCA9PSAtMSApCiAJewotCSAgcmV0dXJuOworCSAgcmV0dXJuIEZBTFNFOwogCX0KIAogICAgICAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CiAgICAgICBpZiggYWRkciA9PSAoY2hhciAqKSAtMSApCiAJewotCSAgcmV0dXJuOworCSAgcmV0dXJuIEZBTFNFOwogCX0KIAogICAgICAgLyoKQEAgLTI4NSwxOSArMjg2LDIwIEBACiAgICAgICBmZCA9IG9wZW4ob2wtPnJlYWxfcGF0aCwgT19SRE9OTFkpOwogICAgICAgaWYoIGZkID09IC0xICkKIAl7Ci0JICByZXR1cm47CisJICByZXR1cm4gRkFMU0U7CiAJfQogICAgICAgCiAgICAgICBhZGRyID0gbW1hcCgwLCBvbC0+c2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwogICAgICAgaWYoIGFkZHIgPT0gKGNoYXIgKikgLTEgKQogCXsKLQkgIHJldHVybjsKKwkgIHJldHVybiBGQUxTRTsKIAl9CiAgICAgfQogICAKICAgLyoKICAgICogQWxsIHdlIG5lZWQgdG8gZG8gaXMgdG8gZGlzcGxheSB0aGUgc291cmNlIGxpbmVzIGhlcmUuCiAgICAqLworICBydG4gPSBGQUxTRTsKICAgZm9yKGk9c3RhcnQgLSAxOyBpIDw9IGVuZCAtIDE7IGkrKykKICAgICB7CiAgICAgICBpZiggaSA8IDAgfHwgaSA+PSBvbC0+bmxpbmVzIC0gMSkKQEAgLTMwNSw2ICszMDcsNyBAQAogCSAgY29udGludWU7CiAJfQogCisgICAgICBydG4gPSBUUlVFOwogICAgICAgbWVtc2V0KCZidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKICAgICAgIGlmKCBvbC0+bGluZWxpc3RbaSsxXSAhPSBvbC0+bGluZWxpc3RbaV0gKQogCXsKQEAgLTMxNyw2ICszMjAsOCBAQAogICBtdW5tYXAoYWRkciwgb2wtPnNpemUpOwogICBjbG9zZShmZCk7CiAKKyAgcmV0dXJuIHJ0bjsKKwogfQogCiB2b2lkCkBAIC0zMjQsNiArMzI5LDcgQEAKIAkJCSBpbnQgZGVsdGEpCiB7CiAgIGludCAgICBlbmQ7CisgIGludCAgICBydG47CiAgIGludCAgICBzdGFydDsKICAgY2hhciAqIHNvdXJjZWZpbGU7CiAKQEAgLTQwNiw3ICs0MTIsNyBAQAogICAvKgogICAgKiBOb3cgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRvIHRoZSBkaXJ0eSB3b3JrLgogICAgKi8KLSAgREVCVUdfRGlzcGxheVNvdXJjZShzb3VyY2VmaWxlLCBzdGFydCwgZW5kKTsKKyAgcnRuID0gREVCVUdfRGlzcGxheVNvdXJjZShzb3VyY2VmaWxlLCBzdGFydCwgZW5kKTsKIAogICBpZiggc291cmNlZmlsZSAhPSAoY2hhciAqKSAmREVCVUdfY3VycmVudF9zb3VyY2VmaWxlICkKICAgICB7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFicy5jIGIvZGVidWdnZXIvc3RhYnMuYwppbmRleCAwYzFkZGYxLi5hNTJjNDY3IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zdGFicy5jCisrKyBiL2RlYnVnZ2VyL3N0YWJzLmMKQEAgLTc1LDYgKzc1LDQ0IEBACiAgIHVuc2lnbmVkIGxvbmcgbl92YWx1ZTsKIH07CiAKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBrbm93biBkYXRhdHlwZXMgc28gdGhhdCB3ZSBkb24ndCByZWRlZmluZQorICogdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluLiAgSXQgc3Vja3MgdXAgbG90cyBvZiBtZW1vcnkgb3RoZXJ3aXNlLgorICovCitzdHJ1Y3Qga25vd25fdHlwZWRlZgoreworICBzdHJ1Y3Qga25vd25fdHlwZWRlZiAqIG5leHQ7CisgIGNoYXIJCSAgICAgICAqIG5hbWU7CisgIGludAkJCSBuZGVmczsKKyAgc3RydWN0IGRhdGF0eXBlICAgICAgKiB0eXBlc1swXTsKK307CisKKyNkZWZpbmUgTlJfU1RBQl9IQVNIIDUyMQorCitzdHJ1Y3Qga25vd25fdHlwZWRlZiAqIGt0ZF9oZWFkW05SX1NUQUJfSEFTSF07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYl9oYXNoKCBjb25zdCBjaGFyICogbmFtZSApCit7CisgICAgdW5zaWduZWQgaW50IGhhc2ggPSAwOworICAgIHVuc2lnbmVkIGludCB0bXA7CisgICAgY29uc3QgY2hhciAqIHA7CisKKyAgICBwID0gbmFtZTsKKworICAgIHdoaWxlICgqcCkgCisgICAgICB7CisJaGFzaCA9IChoYXNoIDw8IDQpICsgKnArKzsKKworCWlmKCAodG1wID0gKGhhc2ggJiAweGYwMDAwMDAwKSkgKQorCSAgeworCSAgICBoYXNoIF49IHRtcCA+PiAyNDsKKwkgIH0KKwloYXNoICY9IH50bXA7CisgICAgICB9CisgICAgcmV0dXJuIGhhc2ggJSBOUl9TVEFCX0hBU0g7Cit9CisKKwogc3RhdGljIHZvaWQgc3RhYl9zdHJjcHkoY2hhciAqIGRlc3QsIGNvbnN0IGNoYXIgKiBzb3VyY2UpCiB7CiAgIC8qCkBAIC04OSw2ICsxMjcsMTc5IEBACiAgICpkZXN0KysgPSAnXDAnOwogfQogCisjZGVmaW5lIE1BWF9URF9ORVNUSU5HCTEyOAorCitzdGF0aWMKK2ludAorREVCVUdfUmVnaXN0ZXJUeXBlZGVmKGNvbnN0IGNoYXIgKiBuYW1lLCBzdHJ1Y3QgZGF0YXR5cGUgKiogdHlwZXMsIGludCBuZGVmKQoreworICBpbnQJCQkgaGFzaDsKKyAgc3RydWN0IGtub3duX3R5cGVkZWYgKiBrdGQ7CisKKyAgaWYoIG5kZWYgPT0gMSApCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGt0ZCA9IChzdHJ1Y3Qga25vd25fdHlwZWRlZiAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBrbm93bl90eXBlZGVmKSAKKwkJCQkJKyBuZGVmICogc2l6ZW9mKHN0cnVjdCBkYXRhdHlwZSAqKSk7CisgIAorICBoYXNoID0gc3RhYl9oYXNoKG5hbWUpOworCisgIGt0ZC0+bmFtZSA9IHhzdHJkdXAobmFtZSk7CisgIGt0ZC0+bmRlZnMgPSBuZGVmOworICBtZW1jcHkoJmt0ZC0+dHlwZXNbMF0sIHR5cGVzLCBuZGVmICogc2l6ZW9mKHN0cnVjdCBkYXRhdHlwZSAqKSk7CisgIGt0ZC0+bmV4dCA9IGt0ZF9oZWFkW2hhc2hdOworICBrdGRfaGVhZFtoYXNoXSA9IGt0ZDsKKworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljCitpbnQKK0RFQlVHX0hhbmRsZVByZXZpb3VzVHlwZWRlZihjb25zdCBjaGFyICogbmFtZSwgY29uc3QgY2hhciAqIHN0YWIpCit7CisgIGludAkJCSBjb3VudDsKKyAgZW51bSBkZWJ1Z190eXBlCSBleHBlY3Q7CisgIGludAkJCSBoYXNoOworICBzdHJ1Y3Qga25vd25fdHlwZWRlZiAqIGt0ZDsKKyAgY2hhcgkJICAgICAgICogcHRyOworICBjaGFyCQkgICAgICAgKiB0YzsKKyAgaW50CQkJIHR5cGVudW07CisKKyAgaGFzaCA9IHN0YWJfaGFzaChuYW1lKTsKKworICBmb3Ioa3RkID0ga3RkX2hlYWRbaGFzaF07IGt0ZDsga3RkID0ga3RkLT5uZXh0KQorICAgIHsKKyAgICAgIGlmKCAgICAoa3RkLT5uYW1lWzBdID09IG5hbWVbMF0pCisJICAmJiAoc3RyY21wKG5hbWUsIGt0ZC0+bmFtZSkgPT0gMCkgKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgLyoKKyAgICogRGlkbid0IGZpbmQgaXQuICBUaGlzIG11c3QgYmUgYSBuZXcgb25lLgorICAgKi8KKyAgaWYoIGt0ZCA9PSBOVUxMICkKKyAgICB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIC8qCisgICAqIEV4YW1pbmUgdGhlIHN0YWIgdG8gbWFrZSBzdXJlIGl0IGhhcyB0aGUgc2FtZSBudW1iZXIgb2YgZGVmaW5pdGlvbnMuCisgICAqLworICBjb3VudCA9IDA7CisgIGZvcihwdHIgPSBzdHJjaHIoc3RhYiwgJz0nKTsgcHRyOyBwdHIgPSBzdHJjaHIocHRyKzEsICc9JykpCisgICAgeworICAgICAgaWYoIGNvdW50ID49IGt0ZC0+bmRlZnMgKQorCXsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBNYWtlIHN1cmUgdGhlIHR5cGVzIG9mIGFsbCBvZiB0aGUgb2JqZWN0cyBpcyBjb25zaXN0ZW50IHdpdGgKKyAgICAgICAqIHdoYXQgd2UgaGF2ZSBhbHJlYWR5IHBhcnNlZC4KKyAgICAgICAqLworICAgICAgc3dpdGNoKHB0clsxXSkKKwl7CisJY2FzZSAnKic6CisJICBleHBlY3QgPSBQT0lOVEVSOworCSAgYnJlYWs7CisJY2FzZSAncyc6CisJY2FzZSAndSc6CisJICBleHBlY3QgPSBTVFJVQ1Q7CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIGV4cGVjdCA9IEFSUkFZOworCSAgYnJlYWs7CisJY2FzZSAnMSc6CisJY2FzZSAncic6CisJICBleHBlY3QgPSBCQVNJQzsKKwkgIGJyZWFrOworCWNhc2UgJ3gnOgorCSAgZXhwZWN0ID0gU1RSVUNUOworCSAgYnJlYWs7CisJY2FzZSAnZSc6CisJICBleHBlY3QgPSBFTlVNOworCSAgYnJlYWs7CisJY2FzZSAnZic6CisJICBleHBlY3QgPSBGVU5DOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0eXBlLlxuIik7CisgICAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKyAgICAgIGlmKCBleHBlY3QgIT0gREVCVUdfR2V0VHlwZShrdGQtPnR5cGVzW2NvdW50XSkgKQorCXsKKwkgIHJldHVybiBGQUxTRTsKKwl9CisgICAgICBjb3VudCsrOworICAgIH0KKworICBpZigga3RkLT5uZGVmcyAhPSBjb3VudCApCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAvKgorICAgKiBPSywgdGhpcyBvbmUgaXMgc2FmZS4gIEdvIHRocm91Z2gsIGRpZyBvdXQgYWxsIG9mIHRoZSB0eXBlIG51bWJlcnMsCisgICAqIGFuZCBzdWJzdGl0dXRlIHRoZSBhcHByb3ByaWF0ZSB0aGluZ3MuCisgICAqLworICBjb3VudCA9IDA7CisgIGZvcihwdHIgPSBzdHJjaHIoc3RhYiwgJz0nKTsgcHRyOyBwdHIgPSBzdHJjaHIocHRyKzEsICc9JykpCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEJhY2sgdXAgdW50aWwgd2UgZ2V0IHRvIGEgbm9uLW51bWVyaWMgY2hhcmFjdGVyLiAgVGhpcyBpcyB0aGUgdHlwZQorICAgICAgICogbnVtYmVyLgorICAgICAgICovCisgICAgICB0YyA9IHB0ciAtIDE7CisgICAgICB3aGlsZSggKnRjID49ICcwJyAmJiAqdGMgPD0gJzknICkKKwl7CisJICB0Yy0tOworCX0KKyAgICAgIAorICAgICAgdHlwZW51bSA9IGF0b2wodGMgKyAxKTsKKyAgICAgIGlmKCBudW1fc3RhYl90eXBlcyA8PSB0eXBlbnVtICkKKwl7CisJICBudW1fc3RhYl90eXBlcyA9IHR5cGVudW0gKyAzMjsKKwkgIHN0YWJfdHlwZXMgPSAoc3RydWN0IGRhdGF0eXBlICoqKSB4cmVhbGxvYyhzdGFiX3R5cGVzLCAKKwkJCQkJCSAgICAgbnVtX3N0YWJfdHlwZXMgKiBzaXplb2Yoc3RydWN0IGRhdGF0eXBlICopKTsKKwkgIGlmKCBzdGFiX3R5cGVzID09IE5VTEwgKQorCSAgICB7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgICB9CisJfQorCisgICAgICBzdGFiX3R5cGVzW3R5cGVudW1dID0ga3RkLT50eXBlc1tjb3VudCsrXTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgREVCVUdfRnJlZVJlZ2lzdGVyZWRUeXBlZGVmcygpCit7CisgIGludAkJCSBjb3VudDsKKyAgaW50CQkJIGo7CisgIHN0cnVjdCBrbm93bl90eXBlZGVmICoga3RkOworICBzdHJ1Y3Qga25vd25fdHlwZWRlZiAqIG5leHQ7CisKKyAgY291bnQgPSAwOworICBmb3Ioaj0wOyBqIDwgTlJfU1RBQl9IQVNIOyBqKysgKQorICAgIHsKKyAgICAgIGZvcihrdGQgPSBrdGRfaGVhZFtqXTsga3RkOyBrdGQgPSBuZXh0KQorCXsKKwkgIGNvdW50Kys7CisJICBuZXh0ID0ga3RkLT5uZXh0OworCSAgZnJlZShrdGQtPm5hbWUpOworCSAgZnJlZShrdGQpOworCX0gIAorICAgICAga3RkX2hlYWRbal0gPSBOVUxMOworICAgIH0KKworICByZXR1cm4gVFJVRTsKKworfQogCiBzdGF0aWMgCiBpbnQKQEAgLTk2LDIxICszMDcsMzMgQEAKIHsKICAgaW50CQkgICAgYXJybWF4OwogICBpbnQJCSAgICBhcnJtaW47Ci0gIGNoYXIgKiBjOworICBjaGFyCQkgICogYzsKICAgc3RydWN0IGRhdGF0eXBlICogY3Vycl90eXBlOwogICBzdHJ1Y3QgZGF0YXR5cGUgKiBkYXRhdHlwZTsKKyAgc3RydWN0IGRhdGF0eXBlICogY3Vycl90eXBlc1tNQVhfVERfTkVTVElOR107CiAgIGNoYXIJICAgICAgICAgICAgZWxlbWVudF9uYW1lWzEwMjRdOworICBpbnQJCSAgICBudHlwZXMgPSAwOwogICBpbnQJCSAgICBvZmZzZXQ7CisgIGNvbnN0IGNoYXIJICAqIG9yaWdfdHlwZW5hbWU7CiAgIGludAkJICAgIHJ0biA9IEZBTFNFOwogICBpbnQJCSAgICBzaXplOwogICBjaGFyCQkgICogdGM7CiAgIGNoYXIJCSAgKiB0YzI7CiAgIGludAkJICAgIHR5cGVudW07CiAKLSAgLyoKLSAgICogR28gZnJvbSBiYWNrIHRvIGZyb250LiAgRmlyc3Qgd2UgZ28gdGhyb3VnaCBhbmQgZmlndXJlIG91dCB3aGF0IHR5cGUgbnVtYmVycwotICAgKiB3ZSBuZWVkLCBhbmQgcmVnaXN0ZXIgdGhvc2UgdHlwZXMuICBUaGVuIHdlIGdvIGluIGFuZCBmaWxsIHRoZSBkZXRhaWxzLgorICBvcmlnX3R5cGVuYW1lID0gdHlwZW5hbWU7CisKKyAgaWYoIERFQlVHX0hhbmRsZVByZXZpb3VzVHlwZWRlZih0eXBlbmFtZSwgcHRyKSA9PSBUUlVFICkKKyAgICB7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgLyogCisgICAqIEdvIGZyb20gYmFjayB0byBmcm9udC4gIEZpcnN0IHdlIGdvIHRocm91Z2ggYW5kIGZpZ3VyZSBvdXQgd2hhdAorICAgKiB0eXBlIG51bWJlcnMgd2UgbmVlZCwgYW5kIHJlZ2lzdGVyIHRob3NlIHR5cGVzLiAgVGhlbiB3ZSBnbyBpbgorICAgKiBhbmQgZmlsbCB0aGUgZGV0YWlscy4gIAogICAgKi8KKwogICBmb3IoIGMgPSBzdHJjaHIocHRyLCAnPScpOyBjICE9IE5VTEw7IGMgPSBzdHJjaHIoYyArIDEsICc9JykgKQogICAgIHsKICAgICAgIC8qCkBAIC0xMzQsMzEgKzM1Nyw0NyBAQAogCSAgICB9CiAJfQogCisgICAgICBpZiggbnR5cGVzID49IE1BWF9URF9ORVNUSU5HICkKKwl7CisJICAvKgorCSAgICogSWYgdGhpcyBldmVyIGhhcHBlbnMsIGp1c3QgYnVtcCB0aGUgY291bnRlci4KKwkgICAqLworCSAgZnByaW50ZihzdGRlcnIsICJUeXBlZGVmIG5lc3Rpbmcgb3ZlcmZsb3dcbiIpOworCSAgcmV0dXJuIEZBTFNFOworCX0KKwogICAgICAgc3dpdGNoKGNbMV0pCiAJewogCWNhc2UgJyonOgogCSAgc3RhYl90eXBlc1t0eXBlbnVtXSA9IERFQlVHX05ld0RhdGFUeXBlKFBPSU5URVIsIE5VTEwpOworCSAgY3Vycl90eXBlc1tudHlwZXMrK10gPSBzdGFiX3R5cGVzW3R5cGVudW1dOwogCSAgYnJlYWs7CiAJY2FzZSAncyc6CiAJY2FzZSAndSc6CiAJICBzdGFiX3R5cGVzW3R5cGVudW1dID0gREVCVUdfTmV3RGF0YVR5cGUoU1RSVUNULCB0eXBlbmFtZSk7CisJICBjdXJyX3R5cGVzW250eXBlcysrXSA9IHN0YWJfdHlwZXNbdHlwZW51bV07CiAJICBicmVhazsKIAljYXNlICdhJzoKIAkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShBUlJBWSwgTlVMTCk7CisJICBjdXJyX3R5cGVzW250eXBlcysrXSA9IHN0YWJfdHlwZXNbdHlwZW51bV07CiAJICBicmVhazsKIAljYXNlICcxJzoKIAljYXNlICdyJzoKIAkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShCQVNJQywgdHlwZW5hbWUpOworCSAgY3Vycl90eXBlc1tudHlwZXMrK10gPSBzdGFiX3R5cGVzW3R5cGVudW1dOwogCSAgYnJlYWs7CiAJY2FzZSAneCc6CiAJICBzdGFiX3N0cmNweShlbGVtZW50X25hbWUsIGMgKyAzKTsKIAkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShTVFJVQ1QsIGVsZW1lbnRfbmFtZSk7CisJICBjdXJyX3R5cGVzW250eXBlcysrXSA9IHN0YWJfdHlwZXNbdHlwZW51bV07CiAJICBicmVhazsKIAljYXNlICdlJzoKIAkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShFTlVNLCBOVUxMKTsKKwkgIGN1cnJfdHlwZXNbbnR5cGVzKytdID0gc3RhYl90eXBlc1t0eXBlbnVtXTsKIAkgIGJyZWFrOwogCWNhc2UgJ2YnOgogCSAgc3RhYl90eXBlc1t0eXBlbnVtXSA9IERFQlVHX05ld0RhdGFUeXBlKEZVTkMsIE5VTEwpOworCSAgY3Vycl90eXBlc1tudHlwZXMrK10gPSBzdGFiX3R5cGVzW3R5cGVudW1dOwogCSAgYnJlYWs7CiAJZGVmYXVsdDoKIAkgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0eXBlLlxuIik7CkBAIC0xNjYsMTU0ICs0MDUsMTg0IEBACiAgICAgICB0eXBlbmFtZSA9IE5VTEw7CiAgICAgfQogCi0gICAgIC8qCi0gICAgICAqIE9LLCBub3cgdGFrZSBhIHNlY29uZCBzd2VlcCB0aHJvdWdoLiAgTm93IHdlIHdpbGwgYmUgZGlnZ2luZyBvdXQgdGhlIGRlZmluaXRpb25zCi0gICAgICAqIG9mIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMsIGFuZCBzdG9yaW5nIHRoZW0gaW4gdGhlIHNrZWxldG9ucyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotICAgICAgKiBhbGxvY2F0ZWQuICBXZSB0YWtlIGEgcmlnaHQtdG8gbGVmdCBzZWFyY2ggYXMgdGhpcyBpcyBtdWNoIGVhc2llciB0byBwYXJzZS4KLSAgICAgICovCi0gIGZvciggYyA9IHN0cnJjaHIocHRyLCAnPScpOyBjICE9IE5VTEw7IGMgPSBzdHJyY2hyKHB0ciwgJz0nKSApCi0gICAgewogICAgICAgLyoKLSAgICAgICAqIEJhY2sgdXAgdW50aWwgd2UgZ2V0IHRvIGEgbm9uLW51bWVyaWMgY2hhcmFjdGVyLiAgVGhpcyBpcyB0aGUgdHlwZQotICAgICAgICogbnVtYmVyLgotICAgICAgICovCi0gICAgICB0YyA9IGMgLSAxOwotICAgICAgd2hpbGUoICp0YyA+PSAnMCcgJiYgKnRjIDw9ICc5JyApCi0JewotCSAgdGMtLTsKLQl9Ci0gICAgICB0eXBlbnVtID0gYXRvbCh0YyArIDEpOwotICAgICAgY3Vycl90eXBlID0gc3RhYl90eXBlc1t0eXBlbnVtXTsKKyAgICAgICogTm93IHJlZ2lzdGVyIHRoZSB0eXBlIHNvIHRoYXQgaWYgd2UgZW5jb3VudGVyIGl0IGFnYWluLCB3ZSB3aWxsIGtub3cKKyAgICAgICogd2hhdCB0byBkby4KKyAgICAgICovCisgICAgIERFQlVHX1JlZ2lzdGVyVHlwZWRlZihvcmlnX3R5cGVuYW1lLCBjdXJyX3R5cGVzLCBudHlwZXMpOwogCi0gICAgICBzd2l0Y2goY1sxXSkKLQl7Ci0JY2FzZSAneCc6Ci0JICB0YyA9IGMgKyAzOwotCSAgd2hpbGUoICp0YyAhPSAnOicgKQotCSAgICB7Ci0JICAgICAgdGMgKys7Ci0JICAgIH0KLQkgIHRjKys7Ci0JICBpZiggKnRjID09ICdcMCcgKQotCSAgICB7Ci0JICAgICAgKmMgPSAnXDAnOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJjcHkoYywgdGMpOwotCSAgICB9CisgICAgIC8qIAorICAgICAgKiBPSywgbm93IHRha2UgYSBzZWNvbmQgc3dlZXAgdGhyb3VnaC4gIE5vdyB3ZSB3aWxsIGJlIGRpZ2dpbmcKKyAgICAgICogb3V0IHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgdmFyaW91cyBjb21wb25lbnRzLCBhbmQgc3RvcmluZworICAgICAgKiB0aGVtIGluIHRoZSBza2VsZXRvbnMgdGhhdCB3ZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkLiAgV2UgdGFrZQorICAgICAgKiBhIHJpZ2h0LXRvIGxlZnQgc2VhcmNoIGFzIHRoaXMgaXMgbXVjaCBlYXNpZXIgdG8gcGFyc2UuICAKKyAgICAgICovCisgICAgIGZvciggYyA9IHN0cnJjaHIocHRyLCAnPScpOyBjICE9IE5VTEw7IGMgPSBzdHJyY2hyKHB0ciwgJz0nKSApCisgICAgICAgeworCSAvKgorCSAgKiBCYWNrIHVwIHVudGlsIHdlIGdldCB0byBhIG5vbi1udW1lcmljIGNoYXJhY3Rlci4gIFRoaXMgaXMgdGhlIHR5cGUKKwkgICogbnVtYmVyLgorCSAgKi8KKwkgdGMgPSBjIC0gMTsKKwkgd2hpbGUoICp0YyA+PSAnMCcgJiYgKnRjIDw9ICc5JyApCisJICAgeworCSAgICAgdGMtLTsKKwkgICB9CisJIHR5cGVudW0gPSBhdG9sKHRjICsgMSk7CisJIGN1cnJfdHlwZSA9IHN0YWJfdHlwZXNbdHlwZW51bV07CisJIAorCSBzd2l0Y2goY1sxXSkKKwkgICB7CisJICAgY2FzZSAneCc6CisJICAgICB0YyA9IGMgKyAzOworCSAgICAgd2hpbGUoICp0YyAhPSAnOicgKQorCSAgICAgICB7CisJCSB0YyArKzsKKwkgICAgICAgfQorCSAgICAgdGMrKzsKKwkgICAgIGlmKCAqdGMgPT0gJ1wwJyApCisJICAgICAgIHsKKwkJICpjID0gJ1wwJzsKKwkgICAgICAgfQorCSAgICAgZWxzZQorCSAgICAgICB7CisJCSBzdHJjcHkoYywgdGMpOworCSAgICAgICB9CisJICAgICAKKwkgICAgIGJyZWFrOworCSAgIGNhc2UgJyonOgorCSAgIGNhc2UgJ2YnOgorCSAgICAgdGMgPSBjICsgMjsKKwkgICAgIGRhdGF0eXBlID0gc3RhYl90eXBlc1tzdHJ0b2wodGMsICZ0YywgMTApXTsKKwkgICAgIERFQlVHX1NldFBvaW50ZXJUeXBlKGN1cnJfdHlwZSwgZGF0YXR5cGUpOworCSAgICAgaWYoICp0YyA9PSAnXDAnICkKKwkgICAgICAgeworCQkgKmMgPSAnXDAnOworCSAgICAgICB9CisJICAgICBlbHNlCisJICAgICAgIHsKKwkJIHN0cmNweShjLCB0Yyk7CisJICAgICAgIH0KKwkgICAgIGJyZWFrOworCSAgIGNhc2UgJzEnOgorCSAgIGNhc2UgJ3InOgorCSAgICAgLyoKKwkgICAgICAqIFdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkIHRoZXNlIGFib3ZlLgorCSAgICAgICovCisJICAgICAqYyA9ICdcMCc7CisJICAgICBicmVhazsKKwkgICBjYXNlICdhJzoKKwkgICAgIHRjICA9IGMgKyA1OworCSAgICAgYXJybWluID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKKwkgICAgIHRjKys7CisJICAgICBhcnJtYXggPSBzdHJ0b2wodGMsICZ0YywgMTApOworCSAgICAgdGMrKzsKKwkgICAgIGRhdGF0eXBlID0gc3RhYl90eXBlc1tzdHJ0b2wodGMsICZ0YywgMTApXTsKKwkgICAgIGlmKCAqdGMgPT0gJ1wwJyApCisJICAgICAgIHsKKwkJICpjID0gJ1wwJzsKKwkgICAgICAgfQorCSAgICAgZWxzZQorCSAgICAgICB7CisJCSBzdHJjcHkoYywgdGMpOworCSAgICAgICB9CisJICAgICAKKwkgICAgIERFQlVHX1NldEFycmF5UGFyYW1zKGN1cnJfdHlwZSwgYXJybWluLCBhcnJtYXgsIGRhdGF0eXBlKTsKKwkgICAgIGJyZWFrOworCSAgIGNhc2UgJ3MnOgorCSAgIGNhc2UgJ3UnOgorCSAgICAgdGMgPSBjICsgMjsKKwkgICAgIGlmKCBERUJVR19TZXRTdHJ1Y3RTaXplKGN1cnJfdHlwZSwgc3RydG9sKHRjLCAmdGMsIDEwKSkgPT0gRkFMU0UgKQorCSAgICAgICB7CisJCSAvKgorCQkgICogV2UgaGF2ZSBhbHJlYWR5IGZpbGxlZCBvdXQgdGhpcyBzdHJ1Y3R1cmUuICBOb3RoaW5nIHRvIGRvLAorCQkgICogc28ganVzdCBza2lwIGZvcndhcmQgdG8gdGhlIGVuZCBvZiB0aGUgZGVmaW5pdGlvbi4KKwkJICAqLworCQkgd2hpbGUoIHRjWzBdICE9ICc7JyAmJiB0Y1sxXSAhPSAnOycgKQorCQkgICB7CisJCSAgICAgdGMrKzsKKwkJICAgfQorCQkgCisJCSB0YyArPSAyOworCQkgCisJCSBpZiggKnRjID09ICdcMCcgKQorCQkgICB7CisJCSAgICAgKmMgPSAnXDAnOworCQkgICB9CisJCSBlbHNlCisJCSAgIHsKKwkJICAgICBzdHJjcHkoYywgdGMgKyAxKTsKKwkJICAgfQorCQkgY29udGludWU7CisJICAgICAgIH0KIAotCSAgYnJlYWs7Ci0JY2FzZSAnKic6Ci0JY2FzZSAnZic6Ci0JICB0YyA9IGMgKyAyOwotCSAgZGF0YXR5cGUgPSBzdGFiX3R5cGVzW3N0cnRvbCh0YywgJnRjLCAxMCldOwotCSAgREVCVUdfU2V0UG9pbnRlclR5cGUoY3Vycl90eXBlLCBkYXRhdHlwZSk7Ci0JICBpZiggKnRjID09ICdcMCcgKQotCSAgICB7Ci0JICAgICAgKmMgPSAnXDAnOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJjcHkoYywgdGMpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICcxJzoKLQljYXNlICdyJzoKLQkgIC8qCi0JICAgKiBXZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGVzZSBhYm92ZS4KLQkgICAqLwotCSAgKmMgPSAnXDAnOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICB0YyAgPSBjICsgNTsKLSAJICBhcnJtaW4gPSBzdHJ0b2wodGMsICZ0YywgMTApOwotCSAgdGMrKzsKLSAJICBhcnJtYXggPSBzdHJ0b2wodGMsICZ0YywgMTApOwotCSAgdGMrKzsKLQkgIGRhdGF0eXBlID0gc3RhYl90eXBlc1tzdHJ0b2wodGMsICZ0YywgMTApXTsKLQkgIGlmKCAqdGMgPT0gJ1wwJyApCi0JICAgIHsKLQkgICAgICAqYyA9ICdcMCc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cmNweShjLCB0Yyk7Ci0JICAgIH0KLQkgIAotCSAgREVCVUdfU2V0QXJyYXlQYXJhbXMoY3Vycl90eXBlLCBhcnJtaW4sIGFycm1heCwgZGF0YXR5cGUpOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JY2FzZSAndSc6Ci0JICB0YyA9IGMgKyAyOwotCSAgREVCVUdfU2V0U3RydWN0U2l6ZShjdXJyX3R5cGUsIHN0cnRvbCh0YywgJnRjLCAxMCkpOwotCSAgLyoKLQkgICAqIE5vdyBwYXJzZSB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiB0aGUgc3RydWN0dXJlL3VuaW9uLgotCSAgICovCi0JICB3aGlsZSgqdGMgIT0gJzsnKQotCSAgICB7Ci0JICAgICAgdGMyID0gZWxlbWVudF9uYW1lOwotCSAgICAgIHdoaWxlKCp0YyAhPSAnOicpCi0JCXsKLQkJICAqdGMyKysgPSAqdGMrKzsKLQkJfQotCSAgICAgIHRjKys7Ci0JICAgICAgKnRjMisrID0gJ1wwJzsKLQkgICAgICBkYXRhdHlwZSA9IHN0YWJfdHlwZXNbc3RydG9sKHRjLCAmdGMsIDEwKV07Ci0JICAgICAgdGMrKzsKLQkgICAgICBvZmZzZXQgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKLQkgICAgICB0YysrOwotCSAgICAgIHNpemUgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKLQkgICAgICB0YysrOwotCSAgICAgIERFQlVHX0FkZFN0cnVjdEVsZW1lbnQoY3Vycl90eXBlLCBlbGVtZW50X25hbWUsIGRhdGF0eXBlLCBvZmZzZXQsIHNpemUpOwotCSAgICB9Ci0JICBpZiggKnRjID09ICdcMCcgKQotCSAgICB7Ci0JICAgICAgKmMgPSAnXDAnOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJjcHkoYywgdGMgKyAxKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICB0YyA9IGMgKyAyOwotCSAgLyoKLQkgICAqIE5vdyBwYXJzZSB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiB0aGUgc3RydWN0dXJlL3VuaW9uLgotCSAgICovCi0JICB3aGlsZSgqdGMgIT0gJzsnKQotCSAgICB7Ci0JICAgICAgdGMyID0gZWxlbWVudF9uYW1lOwotCSAgICAgIHdoaWxlKCp0YyAhPSAnOicpCi0JCXsKLQkJICAqdGMyKysgPSAqdGMrKzsKLQkJfQotCSAgICAgIHRjKys7Ci0JICAgICAgKnRjMisrID0gJ1wwJzsKLQkgICAgICBvZmZzZXQgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKLQkgICAgICB0YysrOwotCSAgICAgIERFQlVHX0FkZFN0cnVjdEVsZW1lbnQoY3Vycl90eXBlLCBlbGVtZW50X25hbWUsIE5VTEwsIG9mZnNldCwgMCk7Ci0JICAgIH0KLQkgIGlmKCAqdGMgPT0gJ1wwJyApCi0JICAgIHsKLQkgICAgICAqYyA9ICdcMCc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cmNweShjLCB0YyArIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHR5cGUuXG4iKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcnRuID0gVFJVRTsKLQorCSAgICAgLyoKKwkgICAgICAqIE5vdyBwYXJzZSB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiB0aGUgc3RydWN0dXJlL3VuaW9uLgorCSAgICAgICovCisJICAgICB3aGlsZSgqdGMgIT0gJzsnKQorCSAgICAgICB7CisJCSB0YzIgPSBlbGVtZW50X25hbWU7CisJCSB3aGlsZSgqdGMgIT0gJzonKQorCQkgICB7CisJCSAgICAgKnRjMisrID0gKnRjKys7CisJCSAgIH0KKwkJIHRjKys7CisJCSAqdGMyKysgPSAnXDAnOworCQkgZGF0YXR5cGUgPSBzdGFiX3R5cGVzW3N0cnRvbCh0YywgJnRjLCAxMCldOworCQkgdGMrKzsKKwkJIG9mZnNldCAgPSBzdHJ0b2wodGMsICZ0YywgMTApOworCQkgdGMrKzsKKwkJIHNpemUgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKKwkJIHRjKys7CisJCSBERUJVR19BZGRTdHJ1Y3RFbGVtZW50KGN1cnJfdHlwZSwgZWxlbWVudF9uYW1lLCBkYXRhdHlwZSwgb2Zmc2V0LCBzaXplKTsKKwkgICAgICAgfQorCSAgICAgaWYoICp0YyA9PSAnXDAnICkKKwkgICAgICAgeworCQkgKmMgPSAnXDAnOworCSAgICAgICB9CisJICAgICBlbHNlCisJICAgICAgIHsKKwkJIHN0cmNweShjLCB0YyArIDEpOworCSAgICAgICB9CisJICAgICBicmVhazsKKwkgICBjYXNlICdlJzoKKwkgICAgIHRjID0gYyArIDI7CisJICAgICAvKgorCSAgICAgICogTm93IHBhcnNlIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIHRoZSBzdHJ1Y3R1cmUvdW5pb24uCisJICAgICAgKi8KKwkgICAgIHdoaWxlKCp0YyAhPSAnOycpCisJICAgICAgIHsKKwkJIHRjMiA9IGVsZW1lbnRfbmFtZTsKKwkJIHdoaWxlKCp0YyAhPSAnOicpCisJCSAgIHsKKwkJICAgICAqdGMyKysgPSAqdGMrKzsKKwkJICAgfQorCQkgdGMrKzsKKwkJICp0YzIrKyA9ICdcMCc7CisJCSBvZmZzZXQgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKKwkJIHRjKys7CisJCSBERUJVR19BZGRTdHJ1Y3RFbGVtZW50KGN1cnJfdHlwZSwgZWxlbWVudF9uYW1lLCBOVUxMLCBvZmZzZXQsIDApOworCSAgICAgICB9CisJICAgICBpZiggKnRjID09ICdcMCcgKQorCSAgICAgICB7CisJCSAqYyA9ICdcMCc7CisJICAgICAgIH0KKwkgICAgIGVsc2UKKwkgICAgICAgeworCQkgc3RyY3B5KGMsIHRjICsgMSk7CisJICAgICAgIH0KKwkgICAgIGJyZWFrOworCSAgIGRlZmF1bHQ6CisJICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gdHlwZS5cbiIpOworCSAgICAgYnJlYWs7CisJICAgfQorICAgICAgIH0KKyAgICAgCisgICAgIHJ0biA9IFRSVUU7CisgICAgIAogbGVhdmU6Ci0KLSAgcmV0dXJuIHJ0bjsKKyAgICAgCisgICAgIHJldHVybiBydG47CiAKIH0KIApAQCAtNjc2LDYgKzk0NSw5IEBACiAgICAgICBudW1fc3RhYl90eXBlcyA9IDA7CiAgICAgfQogCisKKyAgREVCVUdfRnJlZVJlZ2lzdGVyZWRUeXBlZGVmcygpOworCiAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci90eXBlcy5jIGIvZGVidWdnZXIvdHlwZXMuYwppbmRleCA1ODFkMDk2Li4wYjI2ZDUwIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci90eXBlcy5jCisrKyBiL2RlYnVnZ2VyL3R5cGVzLmMKQEAgLTExLDggKzExLDExIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpZm5kZWYgX19FTVhfXwogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RyaW5ncy5oPgpAQCAtMjgsNiArMzEsOSBAQAogCiAjZGVmaW5lIE5SX1RZUEVfSEFTSCA1MjEKIAoraW50CQkgIERFQlVHX25jaGFyOworc3RhdGljIGludAkgIERFQlVHX21heGNoYXIgPSAxMDI0OworCiBzdHJ1Y3QgZW5fdmFsdWVzCiB7CiAgIHN0cnVjdCBlbl92YWx1ZXMqIG5leHQ7CkBAIC0xNzcsNiArMTgzLDMyIEBACiAgIHJldHVybiBkdDsKIH0KIAorc3RhdGljCitzdHJ1Y3QgZGF0YXR5cGUgKgorREVCVUdfTG9va3VwRGF0YVR5cGUoZW51bSBkZWJ1Z190eXBlIHh0eXBlLCBpbnQgaGFzaCwgY29uc3QgY2hhciAqIHR5cGVuYW1lKQoreworICBzdHJ1Y3QgZGF0YXR5cGUgKiBkdCA9IE5VTEw7CisKKyAgaWYoIHR5cGVuYW1lICE9IE5VTEwgKQorICAgIHsKKyAgICAgIGZvciggZHQgPSB0eXBlX2hhc2hfdGFibGVbaGFzaF07IGR0OyBkdCA9IGR0LT5uZXh0ICkKKwl7CisJICBpZiggeHR5cGUgIT0gZHQtPnR5cGUgfHwgZHQtPm5hbWUgPT0gTlVMTCAKKwkgICAgICB8fCBkdC0+bmFtZVswXSAhPSB0eXBlbmFtZVswXSkKKwkgICAgeworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisJICAJICAKKwkgIGlmKCBzdHJjbXAoZHQtPm5hbWUsIHR5cGVuYW1lKSA9PSAwICkKKwkgICAgeworCSAgICAgIHJldHVybiBkdDsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIGR0OworfQorCiBzdHJ1Y3QgZGF0YXR5cGUgKgogREVCVUdfTmV3RGF0YVR5cGUoZW51bSBkZWJ1Z190eXBlIHh0eXBlLCBjb25zdCBjaGFyICogdHlwZW5hbWUpCiB7CkBAIC0xOTUsMjIgKzIyNyw3IEBACiAgICAgICBoYXNoID0gdHlwZV9oYXNoKHR5cGVuYW1lKTsKICAgICB9CiAKLSAgaWYoIHR5cGVuYW1lICE9IE5VTEwgKQotICAgIHsKLSAgICAgIGZvciggZHQgPSB0eXBlX2hhc2hfdGFibGVbaGFzaF07IGR0OyBkdCA9IGR0LT5uZXh0ICkKLQl7Ci0JICBpZiggeHR5cGUgIT0gZHQtPnR5cGUgfHwgZHQtPm5hbWUgPT0gTlVMTCAKLQkgICAgICB8fCBkdC0+bmFtZVswXSAhPSB0eXBlbmFtZVswXSkKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAJICAKLQkgIGlmKCBzdHJjbXAoZHQtPm5hbWUsIHR5cGVuYW1lKSA9PSAwICkKLQkgICAgewotCSAgICAgIHJldHVybiBkdDsKLQkgICAgfQotCX0KLSAgICB9CisgIGR0ID0gREVCVUdfTG9va3VwRGF0YVR5cGUoeHR5cGUsIGhhc2gsIHR5cGVuYW1lKTsKIAogICBpZiggZHQgPT0gTlVMTCApCiAgICAgewpAQCAtMzQ3LDYgKzM2NCwxMSBAQAogICBzd2l0Y2goYWRkci0+dHlwZS0+dHlwZSkKICAgICB7CiAgICAgY2FzZSBCQVNJQzoKKyAgICAgIGlmICghREJHX0NIRUNLX1JFQURfUFRSKCBhZGRyLCAgYWRkci0+dHlwZS0+dW4uYmFzaWMuYmFzaWNfc2l6ZSkpIAorCXsKKwkgIHJldHVybiAwOworCX0KKwogICAgICAgbWVtY3B5KCZydG4sIChjaGFyICopIGFkZHItPm9mZiwgYWRkci0+dHlwZS0+dW4uYmFzaWMuYmFzaWNfc2l6ZSk7CiAgICAgICBpZiggICAgKGFkZHItPnR5cGUtPnVuLmJhc2ljLmJfc2lnbmVkKQogCSAgJiYgKChhZGRyLT50eXBlLT51bi5iYXNpYy5iYXNpY19zaXplICYgMykgIT0gMCkKQEAgLTQ5NSw2ICs1MTcsMTIgQEAKIERFQlVHX1NldFN0cnVjdFNpemUoc3RydWN0IGRhdGF0eXBlICogZHQsIGludCBzaXplKQogewogICBhc3NlcnQoZHQtPnR5cGUgPT0gU1RSVUNUKTsKKworICBpZiggZHQtPnVuLnN0cnVjdHVyZS5tZW1iZXJzICE9IE5VTEwgKQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKICAgZHQtPnVuLnN0cnVjdHVyZS5zaXplID0gc2l6ZTsKICAgZHQtPnVuLnN0cnVjdHVyZS5tZW1iZXJzID0gTlVMTDsKIApAQCAtNzEwLDcgKzczOCw4IEBACiAgKgogICogSW1wbGVtZW50YXRpb24gb2YgdGhlICdwcmludCcgY29tbWFuZC4KICAqLwotdm9pZCBERUJVR19QcmludCggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBjb3VudCwgY2hhciBmb3JtYXQsIGludCBsZXZlbCApCit2b2lkCitERUJVR19QcmludCggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBjb3VudCwgY2hhciBmb3JtYXQsIGludCBsZXZlbCApCiB7CiAgIERCR19BRERSCSAgYWRkcjE7CiAgIGludAkJICBpOwpAQCAtNzI4LDkgKzc1NywyMCBAQAogICBpZiggYWRkci0+dHlwZSA9PSBOVUxMICkKICAgICB7CiAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBldmFsdWF0ZSBleHByZXNzaW9uXG4iKTsKLSAgICAgIHJldHVybjsKKyAgICAgIGdvdG8gbGVhdmU7CiAgICAgfQogICAKKyAgaWYoIGxldmVsID09IDAgKQorICAgIHsKKyAgICAgIERFQlVHX25jaGFyID0gMDsKKyAgICB9CisKKyAgaWYoIERFQlVHX25jaGFyID4gREVCVUdfbWF4Y2hhciApCisgICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICIuLi4iKTsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCiAgIGlmKCBmb3JtYXQgPT0gJ2knIHx8IGZvcm1hdCA9PSAncycgfHwgZm9ybWF0ID09ICd3JyB8fCBmb3JtYXQgPT0gJ2InICkKICAgICB7CiAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJGb3JtYXQgc3BlY2lmaWVyICclYycgaXMgbWVhbmluZ2xlc3MgaW4gJ3ByaW50JyBjb21tYW5kXG4iLCBmb3JtYXQgKTsKQEAgLTc0NiwyMCArNzg2LDI1IEBACiAgICAgICBERUJVR19QcmludEJhc2ljKGFkZHIsIDEsIGZvcm1hdCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFNUUlVDVDoKLSAgICAgIGZwcmludGYoc3RkZXJyLCAieyIpOworICAgICAgREVCVUdfbmNoYXIgKz0gZnByaW50ZihzdGRlcnIsICJ7Iik7CiAgICAgICBmb3IobSA9IGFkZHItPnR5cGUtPnVuLnN0cnVjdHVyZS5tZW1iZXJzOyBtOyBtID0gbS0+bmV4dCkKIAl7CiAJICBhZGRyMSA9ICphZGRyOwogCSAgREVCVUdfRmluZFN0cnVjdEVsZW1lbnQoJmFkZHIxLCBtLT5uYW1lLAogCQkJCSAgKGludCAqKSAmdmFsdWUpOwotCSAgZnByaW50ZihzdGRlcnIsICIlcz0iLCBtLT5uYW1lKTsKKwkgIERFQlVHX25jaGFyICs9IGZwcmludGYoc3RkZXJyLCAiJXM9IiwgbS0+bmFtZSk7CiAJICBERUJVR19QcmludCgmYWRkcjEsIDEsIGZvcm1hdCwgbGV2ZWwgKyAxKTsKIAkgIGlmKCBtLT5uZXh0ICE9IE5VTEwgKQogCSAgICB7Ci0JICAgICAgZnByaW50ZihzdGRlcnIsICIsICIpOworCSAgICAgIERFQlVHX25jaGFyICs9IGZwcmludGYoc3RkZXJyLCAiLCAiKTsKKwkgICAgfQorCSAgaWYoIERFQlVHX25jaGFyID4gREVCVUdfbWF4Y2hhciApCisJICAgIHsKKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIi4uLn0iKTsKKwkgICAgICBnb3RvIGxlYXZlOwogCSAgICB9CiAJfQotICAgICAgZnByaW50ZihzdGRlcnIsICJ9Iik7CisgICAgICBERUJVR19uY2hhciArPSBmcHJpbnRmKHN0ZGVyciwgIn0iKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVJSQVk6CiAgICAgICAvKgpAQCAtNzcyLDI4ICs4MTcsMzkgQEAKIAkgICAqIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGNoYXJhY3RlciBhcnJheXMuCiAJICAgKi8KIAkgIHBudCA9IChjaGFyICopIGFkZHItPm9mZjsKLQkgIGZwcmludGYoc3RkZXJyLCAiXCIiKTsKKwkgIERFQlVHX25jaGFyICs9IGZwcmludGYoc3RkZXJyLCAiXCIiKTsKIAkgIGZvciggaT1hZGRyLT50eXBlLT51bi5hcnJheS5zdGFydDsgaSA8IGFkZHItPnR5cGUtPnVuLmFycmF5LmVuZDsgaSsrICkKIAkgICAgewogCSAgICAgIGZwdXRjKCpwbnQrKywgc3RkZXJyKTsKKwkgICAgICBERUJVR19uY2hhcisrOworCSAgICAgIGlmKCBERUJVR19uY2hhciA+IERFQlVHX21heGNoYXIgKQorCQl7CisJCSAgZnByaW50ZihzdGRlcnIsICIuLi5cIiIpOworCQkgIGdvdG8gbGVhdmU7CisJCX0KIAkgICAgfQotCSAgZnByaW50ZihzdGRlcnIsICJcIiIpOworCSAgREVCVUdfbmNoYXIgKz0gZnByaW50ZihzdGRlcnIsICJcIiIpOwogCSAgYnJlYWs7CiAJfQogICAgICAgYWRkcjEgPSAqYWRkcjsKICAgICAgIGFkZHIxLnR5cGUgPSBhZGRyLT50eXBlLT51bi5hcnJheS5iYXNpY3R5cGU7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgInsiKTsKKyAgICAgIERFQlVHX25jaGFyICs9IGZwcmludGYoc3RkZXJyLCAieyIpOwogICAgICAgZm9yKCBpPWFkZHItPnR5cGUtPnVuLmFycmF5LnN0YXJ0OyBpIDw9IGFkZHItPnR5cGUtPnVuLmFycmF5LmVuZDsgaSsrICkKIAl7CiAJICBERUJVR19QcmludCgmYWRkcjEsIDEsIGZvcm1hdCwgbGV2ZWwgKyAxKTsKIAkgIGFkZHIxLm9mZiArPSBzaXplOwogCSAgaWYoIGkgPT0gYWRkci0+dHlwZS0+dW4uYXJyYXkuZW5kICkKIAkgICAgewotCSAgICAgIGZwcmludGYoc3RkZXJyLCAifSIpOworCSAgICAgIERFQlVHX25jaGFyICs9IGZwcmludGYoc3RkZXJyLCAifSIpOwogCSAgICB9CiAJICBlbHNlCiAJICAgIHsKLQkgICAgICBmcHJpbnRmKHN0ZGVyciwgIiwgIik7CisJICAgICAgREVCVUdfbmNoYXIgKz0gZnByaW50ZihzdGRlcnIsICIsICIpOworCSAgICB9CisJICBpZiggREVCVUdfbmNoYXIgPiBERUJVR19tYXhjaGFyICkKKwkgICAgeworCSAgICAgIGZwcmludGYoc3RkZXJyLCAiLi4ufSIpOworCSAgICAgIGdvdG8gbGVhdmU7CiAJICAgIH0KIAl9CiAgICAgICBicmVhazsKQEAgLTgwMiw4ICs4NTgsMTU3IEBACiAgICAgICBicmVhazsKICAgICB9CiAKK2xlYXZlOgorCiAgIGlmKCBsZXZlbCA9PSAwICkKICAgICB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICBERUJVR19uY2hhciArPSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CiAgICAgfQorICByZXR1cm47CiB9CisKK2ludAorREVCVUdfRHVtcFR5cGVzKCkKK3sKKyAgc3RydWN0IGRhdGF0eXBlICogZHQgPSBOVUxMOworICBzdHJ1Y3QgbWVtYmVyICogbTsKKyAgaW50IGhhc2g7CisgIGludCBubTsKKyAgY2hhciAqIG5hbWU7CisgIGNoYXIgKiBtZW1iZXJfbmFtZTsKKworICBmb3IoaGFzaCA9IDA7IGhhc2ggPCBOUl9UWVBFX0hBU0ggKyAxOyBoYXNoKyspCisgICAgeworICAgICAgZm9yKCBkdCA9IHR5cGVfaGFzaF90YWJsZVtoYXNoXTsgZHQ7IGR0ID0gZHQtPm5leHQgKQorCXsKKwkgIG5hbWUgPSAgIm5vbmUiOworCSAgaWYoIGR0LT5uYW1lICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgbmFtZSA9IGR0LT5uYW1lOworCSAgICB9CisJICBzd2l0Y2goZHQtPnR5cGUpCisJICAgIHsKKwkgICAgY2FzZSBCQVNJQzoKKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIjB4JXAgLSBCQVNJQyglcylcbiIsCisJCSAgICAgIGR0LCBuYW1lKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBQT0lOVEVSOgorCSAgICAgIGZwcmludGYoc3RkZXJyLCAiMHglcCAtIFBPSU5URVIoJXMpKCVwKVxuIiwKKwkJICAgICAgZHQsIG5hbWUsIGR0LT51bi5wb2ludGVyLnBvaW50c3RvKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBTVFJVQ1Q6CisJICAgICAgbWVtYmVyX25hbWUgPSAibm9uZSI7CisJICAgICAgbm0gPSAwOworCSAgICAgIGlmKCBkdC0+dW4uc3RydWN0dXJlLm1lbWJlcnMgIT0gTlVMTAorCQkgICYmIGR0LT51bi5zdHJ1Y3R1cmUubWVtYmVycy0+bmFtZSAhPSBOVUxMICkKKwkJeworCQkgIG1lbWJlcl9uYW1lID0gZHQtPnVuLnN0cnVjdHVyZS5tZW1iZXJzLT5uYW1lOworCQkgIGZvciggbSA9IGR0LT51bi5zdHJ1Y3R1cmUubWVtYmVyczsgbTsgbSA9IG0tPm5leHQpCisJCSAgICB7CisJCSAgICAgIG5tKys7CisJCSAgICB9CisJCX0KKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIjB4JXAgLSBTVFJVQ1QoJXMpICVkICVkICVzXG4iLCBkdCwgbmFtZSwKKwkJICAgICAgZHQtPnVuLnN0cnVjdHVyZS5zaXplLCBubSwgbWVtYmVyX25hbWUpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIEFSUkFZOgorCSAgICAgIGZwcmludGYoc3RkZXJyLCAiMHglcCAtIEFSUkFZKCVzKSglcClcbiIsCisJCSAgICAgIGR0LCBuYW1lLCBkdC0+dW4uYXJyYXkuYmFzaWN0eXBlKTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSBFTlVNOgorCSAgICAgIGZwcmludGYoc3RkZXJyLCAiMHglcCAtIEVOVU0oJXMpXG4iLAorCQkgICAgICBkdCwgbmFtZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQklURklFTEQ6CisJICAgICAgZnByaW50ZihzdGRlcnIsICIweCVwIC0gQklURklFTEQoJXMpXG4iLCBkdCwgbmFtZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgRlVOQzoKKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIjB4JXAgLSBGVU5DKCVzKSglcClcbiIsCisJCSAgICAgIGR0LCBuYW1lLCBkdC0+dW4uZnVuY3QucmV0dHlwZSk7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgQ09OU1Q6CisJICAgIGNhc2UgVFlQRURFRjoKKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIldoYXQ/Pz9cbiIpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZW51bSBkZWJ1Z190eXBlIERFQlVHX0dldFR5cGUoc3RydWN0IGRhdGF0eXBlICogZHQpCit7CisgIHJldHVybiBkdC0+dHlwZTsKK30KKworc3RydWN0IGRhdGF0eXBlICoKK0RFQlVHX1R5cGVDYXN0KGVudW0gZGVidWdfdHlwZSB0eXBlLCBjb25zdCBjaGFyICogbmFtZSkKK3sKKyAgaW50CQkJICBoYXNoOworICBzdHJ1Y3QgZGF0YXR5cGUJKiBydG47CisKKyAgLyoKKyAgICogVGhlIGxhc3QgYnVja2V0IGlzIHNwZWNpYWwsIGFuZCBpcyB1c2VkIHRvIGhvbGQgdHlwZWxlc3MgbmFtZXMuCisgICAqLworICBpZiggbmFtZSA9PSBOVUxMICkKKyAgICB7CisgICAgICBoYXNoID0gTlJfVFlQRV9IQVNIOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGhhc2ggPSB0eXBlX2hhc2gobmFtZSk7CisgICAgfQorCisgIHJ0biA9IERFQlVHX0xvb2t1cERhdGFUeXBlKHR5cGUsIGhhc2gsIG5hbWUpOworCisgIHJldHVybiBydG47CisKK30KKworaW50CitERUJVR19QcmludFR5cGVDYXN0KHN0cnVjdCBkYXRhdHlwZSAqIGR0KQoreworICBjaGFyCQkqIG5hbWU7CisKKyAgbmFtZSA9ICAibm9uZSI7CisgIGlmKCBkdC0+bmFtZSAhPSBOVUxMICkKKyAgICB7CisgICAgICBuYW1lID0gZHQtPm5hbWU7CisgICAgfQorCisgIHN3aXRjaChkdC0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBCQVNJQzoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE9JTlRFUjoKKyAgICAgIERFQlVHX1ByaW50VHlwZUNhc3QoZHQtPnVuLnBvaW50ZXIucG9pbnRzdG8pOworICAgICAgZnByaW50ZihzdGRlcnIsICIqIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUUlVDVDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAic3RydWN0ICVzIiwgbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSUkFZOgorICAgICAgZnByaW50ZihzdGRlcnIsICIlc1tdIiwgbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVOVU06CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImVudW0gJXMiLCBuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQklURklFTEQ6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuc2lnbmVkICVzIiwgbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZVTkM6CisgICAgICBERUJVR19QcmludFR5cGVDYXN0KGR0LT51bi5mdW5jdC5yZXR0eXBlKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiKColcykoKSIsIG5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT05TVDoKKyAgICBjYXNlIFRZUEVERUY6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldoYXQ/Pz9cbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vd2luZV9vczIudHh0IGIvZG9jdW1lbnRhdGlvbi93aW5lX29zMi50eHQKaW5kZXggOWIxYzBlMy4uOTdhZDA0NCAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi93aW5lX29zMi50eHQKKysrIGIvZG9jdW1lbnRhdGlvbi93aW5lX29zMi50eHQKQEAgLTUsMTAgKzUsMTEgQEAKIFhGcmVlODYgMy4yIE9TLzIgKHdpdGggZGV2ZWxvcG1lbnQgbGlicmFyaWVzKQogYmFzaCwgZ251IG1ha2UsIGdyZXAsIHRhciwgYmlzb24sIGZsZXgKIHNlZCAoYSB3b3JraW5nIGNvcHkgb2YpCit4cG0KIGRpZmYgYW5kIHBhdGNoIGFyZSByZWNvbW1lbmRlZAogCiBUbyBjb21waWxlOgotc2gKK3NoIAogdG9vbHMvbWFrZV9vczIuc2gKIG1ha2UgZGVwZW5kCiBtYWtlIChtYWtlIGRvZXNuJ3Qgd29yayB5ZXQuLi4gSSB3aWxsIG5lZWQgdG8gZG8gc29tZSBvdGhlcnMgcGF0Y2gsIG9yCkBAIC0xNiwxNCArMTcsMjUgQEAKIAogQ3VycmVudGx5OgogLSBjb25maWd1cmUgYW5kIG1ha2UgZGVwZW5kIHdvcmsuLi4KLS0gbWFrZSBkb2Vzbid0IHdvcmsKKy0gbWFrZSBkb2Vzbid0IHdvcmsgd2VsbC4uLgogLSB0aGUgc2VsZWN0b3JzIG51bWJlcnMgKDApIGFyZSB3cm9uZy4uLgorLSBzaWduYWwgaGFuZGxpbmcgaXMgaG9ycmlibGUuLi4gKGlmIGFueSkKKy0gRU1YIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IG1tYXAKKy0gZGVidWdnZXIgZG9uJ3QgY29tcGlsZSBhdCBhbGwKKy0gc2lnY29udGV4dC5oIGlzbid0IHJpZ2h0IChpbmNvbXBsZXRlIHN0cnVjdHVyZT8pLgogCiBXaGF0IG5lZWRzIHRvIGJlIHJlZG9uZToKLUZpbGUgZnVuY3Rpb25zLCBJL08gYWNjZXNzIChkbyBpdCEpLCBJbnRlcnJ1cHQgKGlmIGludCB1bmtub3csIGNhbGwKLWN1cnJlbnQgUmVhbE1vZGUgb25lLi4uKSwgdmVyaWZ5IHRoYXQgZXZlcnl0aGluZyBpcyB0aHJlYWQgc2FmZSAoaG93Ci1kb2VzIFdpbjk1L05UIGhhbmRsZSBtdWx0aS10aHJlYWQ/KSwgbW92ZSBYIGZ1bmN0aW9ucyBpbiBzb21lIGZpbGVzCi0oYW5kIG1ha2UgYSB3cmFwcGVyLCB0byB1c2UgUE0gaW5zdGVhZCBsYXR0ZXIpLCBldGMuLi4KKy0gRmlsZSBmdW5jdGlvbnMsIAorLSBJL08gYWNjZXNzIChkbyBpdCEpLAorLSBDb21tdW5pY2F0aW9uIChtb2RlbSksCistIEludGVycnVwdCAoaWYgaW50IHVua25vdywgY2FsbCBjdXJyZW50IFJlYWxNb2RlIG9uZS4uLiksIAorLSB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIGlzIHRocmVhZCBzYWZlIChob3cgZG9lcyBXaW45NS9OVCBoYW5kbGUgbXVsdGktdGhyZWFkPyksIAorLSBtb3ZlIFggZnVuY3Rpb25zIGluIHNvbWUgZmlsZXMgKGFuZCBtYWtlIGEgd3JhcHBlciwgdG8gdXNlIFBNIGluc3RlYWQgbGF0dGVyKSwgCistIGltcGxlbWVudCBtbWFwIChvciBmaW5kIHNvbWV0aGluZyBlbHNlKSwgCistIG1ha2UgZGVidWdnZXIgd29yaywgCistIHJldHVybiByaWdodCBDUFUgdHlwZSwgCistIG1ha2Ugd2luc29jayB3b3JrCisKIAogVGhlIGdvb2QgdGhpbmdzOgogLSBPUy8yIGhhdmUgRE9TIGludGVycnVwdHMKQEAgLTMzLDMgKzQ1LDQgQEAKIAogUm9iZXJ0IFBvdWxpb3QgPGtyeW5vc0BjbGljLm5ldD4KIEphbnVhcnkgOSwgMTk5NworGgpkaWZmIC0tZ2l0IGEvZmlsZXMvZG9zX2ZzLmMgYi9maWxlcy9kb3NfZnMuYwppbmRleCA5YjA4MWEwLi40Njc4NmRkIDEwMDY0NAotLS0gYS9maWxlcy9kb3NfZnMuYworKysgYi9maWxlcy9kb3NfZnMuYwpAQCAtMTMzMyw4ICsxMzMzLDcgQEAKICAgICB9CiAgICAgbHN0cmNweTMyQShidWZmZXIsIlxcREVWXFwiKTsKICAgICBsc3RyY2F0MzJBKGJ1ZmZlcixkZXZuYW1lKTsKLSAgICBpZiAocz1zdHJjaHIoYnVmZmVyLCc6JykpCi0gICAgCSpzPSdcMCc7CisgICAgaWYgKChzPXN0cmNocihidWZmZXIsJzonKSkpICpzPSdcMCc7CiAgICAgbHN0cmNweW4zMkEodGFyZ2V0LGJ1ZmZlcixidWZzaXplKTsKICAgICByZXR1cm4gc3RybGVuKGJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9maWxlcy9kcml2ZS5jIGIvZmlsZXMvZHJpdmUuYwppbmRleCBkNTllMDJiLi5iMzhmMmMxIDEwMDY0NAotLS0gYS9maWxlcy9kcml2ZS5jCisrKyBiL2ZpbGVzL2RyaXZlLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvZXJybm8uaD4KICNlbmRpZgotI2lmIGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykKKyNpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpIHx8IGRlZmluZWQoX19FTVhfXykKICNpbmNsdWRlIDxzeXMvc3RhdGZzLmg+CiAjZW5kaWYKIApAQCAtNTA1LDcgKzUwNSw3IEBACiAgICAgfQogCiAgICAgKnNpemUgPSBpbmZvLmZfYnNpemUgKiBpbmZvLmZfYmxvY2tzOwotI2lmIGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykKKyNpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpIHx8IGRlZmluZWQoX19FTVhfXykKICAgICAqYXZhaWxhYmxlID0gaW5mby5mX2JmcmVlICogaW5mby5mX2JzaXplOwogI2Vsc2UKICAgICAqYXZhaWxhYmxlID0gaW5mby5mX2JhdmFpbCAqIGluZm8uZl9ic2l6ZTsKZGlmZiAtLWdpdCBhL2ZpbGVzL2ZpbGUuYyBiL2ZpbGVzL2ZpbGUuYwppbmRleCAwNDhlNThkLi5iOWUyYjRhIDEwMDY0NAotLS0gYS9maWxlcy9maWxlLmMKKysrIGIvZmlsZXMvZmlsZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL2Vycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0zMTYsNiArMzE3LDggQEAKICAgICBpbmZvLT5kd0ZpbGVBdHRyaWJ1dGVzID0gRklMRV9BVFRSSUJVVEVfQVJDSElWRTsKICAgICBpZiAoU19JU0RJUihzdC0+c3RfbW9kZSkpCiAgICAgICAgIGluZm8tPmR3RmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZOworICAgIGlmICghKHN0LT5zdF9tb2RlICYgU19JV1VTUikpCisgICAgICAgIGluZm8tPmR3RmlsZUF0dHJpYnV0ZXMgfD0gRklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7CiAKICAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIHN0LT5zdF9tdGltZSwgJmluZm8tPmZ0Q3JlYXRpb25UaW1lLCAwICk7CiAgICAgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKCBzdC0+c3RfbXRpbWUsICZpbmZvLT5mdExhc3RXcml0ZVRpbWUsIDAgKTsKQEAgLTUxMCw2ICs1MTMsOCBAQAogICAgIGlmICghcGF0aCkgcmV0dXJuIDA7CiAgICAgc3RyY3B5KCBidWZmZXIsIHBhdGggKTsKICAgICBwID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CisgICAgLyogYWRkIGEgXCwgaWYgdGhlcmUgaXNuJ3Qgb25lIC4uLiAqLworICAgIGlmICgocCA9PSBidWZmZXIpIHx8IChwWy0xXSAhPSAnXFwnKSkgKnArKyA9ICdcXCc7CiAgICAgKnArKyA9ICd+JzsKICAgICBmb3IgKGkgPSAzOyAoaSA+IDApICYmICgqcHJlZml4KTsgaS0tKSAqcCsrID0gKnByZWZpeCsrOwogICAgIHNwcmludGYoIHAsICIlMDR4LnRtcCIsIG51bSApOwpAQCAtNTM4LDYgKzU0Myw4IEBACiAKICAgICBpZiAoRE9TRlNfR2V0RnVsbE5hbWUoIGJ1ZmZlciwgRkFMU0UsICZmdWxsX25hbWUgKSkKICAgICB7CisgICAgICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgd3JpdGUgYWNjZXNzIGluIHRoZSBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKChwID0gc3RycmNociggZnVsbF9uYW1lLmxvbmdfbmFtZSwgJy8nICkpKSAqcCA9ICdcMCc7CiAgICAgICAgIGlmIChhY2Nlc3MoIGZ1bGxfbmFtZS5sb25nX25hbWUsIFdfT0sgKSA9PSAtMSkKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBHZXRUZW1wRmlsZU5hbWUgcmV0dXJucyAnJXMnLCB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgd3JpdGVhYmxlLlxuIgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvTWFrZWZpbGUuaW4gYi9ncmFwaGljcy93aW4xNmRydi9NYWtlZmlsZS5pbgppbmRleCA0NTE0MzgyLi5hZDcxYjk5IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9NYWtlZmlsZS5pbgorKysgYi9ncmFwaGljcy93aW4xNmRydi9NYWtlZmlsZS5pbgpAQCAtNyw3ICs3LDggQEAKIAogQ19TUkNTID0gXAogCWZvbnQuYyBcCi0JaW5pdC5jCisJaW5pdC5jIFwKKwl0ZXh0LmMKIAogYWxsOiAkKE1PRFVMRSkubwogCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMgYi9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKaW5kZXggMGYwMzk5YS4uOTMwZDAwNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwpAQCAtMzEsNiArMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHN0ciwgVUlOVDE2IGNvdW50LCBjb25zdCBJTlQxNiAqbHBEeCk7CiAjZW5kaWYKIAorRFJBV01PREUgRHJhd01vZGU7CiBzdGF0aWMgQk9PTDMyIFdJTjE2RFJWX0NyZWF0ZURDKCBEQyAqZGMsIExQQ1NUUiBkcml2ZXIsIExQQ1NUUiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgb3V0cHV0LCBjb25zdCBERVZNT0RFMTYqIGluaXREYXRhICk7CiBzdGF0aWMgSU5UMzIgV0lOMTZEUlZfRXNjYXBlKCBEQyAqZGMsIElOVDMyIG5Fc2NhcGUsIElOVDMyIGNiSW5wdXQsIApAQCAtNDksNyArNTAsNyBAQAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBFeGNsdWRlQ2xpcFJlY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXhjbHVkZVZpc1JlY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KKyAgICBXSU4xNkRSVl9FeHRUZXh0T3V0LCAgICAgICAgICAgICAvKiBwRXh0VGV4dE91dCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBHZXRQaXhlbCAqLwogICAgIFdJTjE2RFJWX0dldFRleHRFeHRlbnRQb2ludCwgICAgIC8qIHBHZXRUZXh0RXh0ZW50UG9pbnQgKi8KICAgICBXSU4xNkRSVl9HZXRUZXh0TWV0cmljcywgICAgICAgICAvKiBwR2V0VGV4dE1ldHJpY3MgKi8KQEAgLTU4LDggKzU5LDggQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwTGluZVRvICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcE1vdmVUb0V4ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcE9mZnNldENsaXBSZ24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwT2Zmc2V0Vmlld3BvcnRPcmcgKG9wdGlvbmFsKSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBPZmZzZXRXaW5kb3dPcmcgKG9wdGlvbmFsKSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBPZmZzZXRWaWV3cG9ydE9yZ0V4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcE9mZnNldFdpbmRvd09yZ0V4ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBhaW50UmduICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBhdEJsdCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQaWUgKi8KQEAgLTcxLDggKzcyLDggQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUmVzdG9yZURDICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFJvdW5kUmVjdCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTYXZlREMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2NhbGVWaWV3cG9ydEV4dCAob3B0aW9uYWwpICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNjYWxlV2luZG93RXh0IChvcHRpb25hbCkgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2NhbGVWaWV3cG9ydEV4dEV4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNjYWxlV2luZG93RXh0RXggKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2VsZWN0Q2xpcFJnbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZWxlY3RPYmplY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2VsZWN0UGFsZXR0ZSAqLwpAQCAtODAsNyArODEsNyBAQAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRCa01vZGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0RGV2aWNlQ2xpcHBpbmcgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0RElCaXRzVG9EZXZpY2UgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0TWFwTW9kZSAob3B0aW9uYWwpICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldE1hcE1vZGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0TWFwcGVyRmxhZ3MgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0UGl4ZWwgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0UG9seUZpbGxNb2RlICovCkBAIC05MSwxMCArOTIsMTAgQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0VGV4dENoYXJhY3RlckV4dHJhICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFRleHRDb2xvciAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRUZXh0SnVzdGlmaWNhdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRWaWV3cG9ydEV4dCAob3B0aW9uYWwpICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFZpZXdwb3J0T3JnIChvcHRpb25hbCkgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0V2luZG93RXh0IChvcHRpb25hbCkgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0V2luZG93T3JnIChvcHRpb25hbCkgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0Vmlld3BvcnRFeHRFeCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRWaWV3cG9ydE9yZ0V4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFdpbmRvd0V4dEV4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFdpbmRvd09yZ0V4ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFN0cmV0Y2hCbHQgKi8KICAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU3RyZXRjaERJQml0cyAqLwogfTsKQEAgLTExNiw3ICsxMTcsNyBAQAogCiAvKiBUZW1wb3J5IGZ1bmN0aW9ucywgZm9yIGluaXRpYWxpc2luZyBzdHJ1Y3R1cmVzICovCiAvKiBUaGVzZSB2YWx1ZXMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsIG5vdCBoYXJkY29kZWQgKi8KLXZvaWQgSW5pdFRleHRYRm9ybShMUFRFWFRYRk9STSBscFRleHRYRm9ybSkKK3ZvaWQgSW5pdFRleHRYRm9ybShMUFRFWFRYRk9STTE2IGxwVGV4dFhGb3JtKQogewogICAgIGxwVGV4dFhGb3JtLT50eGZIZWlnaHQgCT0gMHgwMDAxOwogICAgIGxwVGV4dFhGb3JtLT50eGZXaWR0aCAJPSAweDAwMGM7CkBAIC01NDksNyArNTUwLDcgQEAKICAqLwogRFdPUkQgUFJURFJWX1JlYWxpemVPYmplY3QoTFBQREVWSUNFIGxwRGVzdERldiwgV09SRCB3U3R5bGUsIAogCQkgICAgTFBWT0lEIGxwSW5PYmosIExQVk9JRCBscE91dE9iaiwKLSAgICAgICAgICAgICAgICAgICAgTFBURVhUWEZPUk0gbHBUZXh0WEZvcm0pCisgICAgICAgICAgICAgICAgICAgIExQVEVYVFhGT1JNMTYgbHBUZXh0WEZvcm0pCiB7CiAgICAgV09SRCBkd1JldCA9IDA7CiAgICAgTE9BREVEX1BSSU5URVJfRFJJVkVSICpwTFBEID0gTlVMTDsKQEAgLTU5MSw3ICs1OTIsNyBAQAogCWlmIChscFRleHRYRm9ybSAhPSBOVUxMKQogCXsKIAkgICAgbFA1ID0gU2VnUHRyOwotCSAgICBuU2l6ZSA9IHNpemVvZihURVhUWEZPUk0pOworCSAgICBuU2l6ZSA9IHNpemVvZihURVhUWEZPUk0xNik7CiAJICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBUZXh0WEZvcm0sIG5TaXplLCBMaW1pdCk7CQogCX0KIAllbHNlCkBAIC02MTYsOSArNjE3LDEwIEBACiAgICAgaW50IG5QREVWSUNFc2l6ZTsKICAgICBQREVWSUNFX0hFQURFUiAqcFBESDsKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2OworICAgIExQRFJBV01PREUgbHBEcmF3TW9kZSA9ICZEcmF3TW9kZTsKIAogICAgIC8qIFJlYWxpemluZyBmb250cyAqLwotICAgIFRFWFRYRk9STSBUZXh0WEZvcm07CisgICAgVEVYVFhGT1JNMTYgVGV4dFhGb3JtOwogICAgIGludCBuU2l6ZTsKICAgICBjaGFyIHByaW50ZXJFbmFibGVkWzIwXTsKICAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoICJ3aW5lIiwgInByaW50ZXIiLCAib2ZmIiwKQEAgLTc1MSw3ICs3NTMsNyBAQAogICAgIC8qIFF1aWNrIGxvb2sgYXQgc3RydWN0dXJlICovCiAgICAgaWYgKHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvKQogICAgIHsgIAotCUZPTlRJTkZPICpwID0gKEZPTlRJTkZPICopUFRSX1NFR19UT19MSU4ocGh5c0Rldi0+c2VncHRyRm9udEluZm8pOworCUZPTlRJTkZPMTYgKnAgPSAoRk9OVElORk8xNiAqKVBUUl9TRUdfVE9fTElOKHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvKTsKIAogCWRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiVDolZCBWUjolZCBIUjolZCwgRjolZCBMOiVkXG4iLAogCSAgICAgICBwLT5kZlR5cGUsCkBAIC03NjIsNiArNzY0LDcgQEAKIAogI2VuZGlmCiAgICAgLyogVFREIExvdHMgbW9yZSB0byBkbyBoZXJlICovCisgICAgSW5pdERyYXdNb2RlKGxwRHJhd01vZGUpOwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC03OTksNyArODAyLDcgQEAKIERXT1JEIFBSVERSVl9FeHRUZXh0T3V0KExQUERFVklDRSBscERlc3REZXYsIFdPUkQgd0Rlc3RYT3JnLCBXT1JEIHdEZXN0WU9yZywKICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QxNiAqbHBDbGlwUmVjdCwgTFBDU1RSIGxwU3RyaW5nLCBXT1JEIHdDb3VudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgbHBGb250SW5mbywgTFBEUkFXTU9ERSBscERyYXdNb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIExQVEVYVFhGT1JNIGxwVGV4dFhGb3JtLCBTSE9SVCAqbHBDaGFyV2lkdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFBURVhUWEZPUk0xNiBscFRleHRYRm9ybSwgU0hPUlQgKmxwQ2hhcldpZHRocywKICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ1QxNiAqICAgICBscE9wYXF1ZVJlY3QsIFdPUkQgd09wdGlvbnMpCiB7CiAgICAgRFdPUkQgZHdSZXQgPSAwOwpAQCAtODExLDYgKzgxNCw4IEBACiAgICAgewogCUxPTkcgbFAxLCBsUDQsIGxQNSwgbFA3LCBsUDgsIGxQOSwgbFAxMCwgbFAxMTsgIAogCVdPUkQgd1AyLCB3UDMsIHdQNiwgd1AxMjsKKyAgICAgICAgSU5UMTYgaVA2OworCiAJU0VHUFRSIFNlZ1B0ciA9IHBMUEQtPlRodW5rQnVmU2VnUHRyOwogCVNFR1BUUiBMaW1pdCA9IHBMUEQtPlRodW5rQnVmTGltaXQ7CiAJaW50ICAgblNpemU7CkBAIC04NDEsNiArODQ2LDcgQEAKIAkgICAgLyogVFREIFdBUk5JTkcgVEhJUyBTVFJJTkcgSVNOVCBOVUxMIFRFUk1JTkFURUQgKi8KIAkgICAgbFA1ID0gU2VnUHRyOwogCSAgICBuU2l6ZSA9IHN0cmxlbihscFN0cmluZyk7CisgICAgICAgICAgICBuU2l6ZSA9IGFicyh3Q291bnQpOwogICAgICAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJBZGRpbmcgc3RyaW5nIHNpemUgJWRcbiIsblNpemUpOwogICAgICAgICAgICAgCiAJICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBTdHJpbmcsIG5TaXplLCBMaW1pdCk7CQpAQCAtODQ4LDcgKzg1NCw3IEBACiAJZWxzZQogCSAgbFA1ID0gMEw7CiAJCi0Jd1A2ID0gd0NvdW50OworCWlQNiA9IHdDb3VudDsKIAkKIAkvKiBUaGlzIHNob3VsZCBiZSByZWFsaXplZCBieSB0aGUgZHJpdmVyLCBzbyBpbiAxNmJpdCBkYXRhIGFyZWEgKi8KIAlsUDcgPSBscEZvbnRJbmZvOwpAQCAtODY3LDcgKzg3Myw3IEBACiAJaWYgKGxwVGV4dFhGb3JtICE9IE5VTEwpCiAJewogCSAgICBsUDkgPSBTZWdQdHI7Ci0JICAgIG5TaXplID0gc2l6ZW9mKFRFWFRYRk9STSk7CisJICAgIG5TaXplID0gc2l6ZW9mKFRFWFRYRk9STTE2KTsKICAgICAgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQWRkaW5nIFRleHRYRm9ybVxuIik7CiAJICAgIEFkZERhdGEoJlNlZ1B0ciwgbHBUZXh0WEZvcm0sIG5TaXplLCBMaW1pdCk7CQogCX0KQEAgLTg5MSw5NiArODk3LDIwIEBACiAJd1AxMiA9IHdPcHRpb25zOwogCWRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiQ2FsbGluZyBleHR0ZXh0b3V0IDB4JWx4IDB4JXggMHgleCAweCVseFxuMHglbHggMHgleCAweCVseCAweCVseFxuIgogICAgICAgICAgICAgICAgIjB4JWx4IDB4JWx4IDB4JWx4IDB4JXhcbiIsbFAxLCB3UDIsIHdQMywgbFA0LCAKLQkJCQkJICAgbFA1LCB3UDYsIGxQNywgbFA4LCBsUDksIGxQMTAsCisJCQkJCSAgIGxQNSwgaVA2LCBsUDcsIGxQOCwgbFA5LCBsUDEwLAogCQkJCQkgICBsUDExLCB3UDEyKTsKIAlkd1JldCA9IENhbGxUbzE2X2xvbmdfbHd3bGx3bGxsbGx3KHBMUEQtPmZuW0ZVTkNfRVhUVEVYVE9VVF0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQMSwgd1AyLCB3UDMsIGxQNCwgCi0JCQkJCSAgIGxQNSwgd1A2LCBsUDcsIGxQOCwgbFA5LCBsUDEwLAorCQkJCQkgICBsUDUsIGlQNiwgbFA3LCBsUDgsIGxQOSwgbFAxMCwKIAkJCQkJICAgbFAxMSwgd1AxMik7CisgICAgICAgIGlmIChscERyYXdNb2RlKQorICAgICAgICAgICAgR2V0UGFyYW1EYXRhKGxQOCwgbHBEcmF3TW9kZSwgc2l6ZW9mKERSQVdNT0RFKSk7CiAgICAgfQogICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiUFJURFJWX0V4dFRleHRPdXQ6IHJldHVybiAlbHhcbiIsIGR3UmV0KTsKICAgICByZXR1cm4gZHdSZXQ7CiB9CiAKIAotLyoKLSAqIEV4dFRleHRPdXQgKEdESS4zNTEpCi0gKi8KLXN0YXRpYyBCT09MMTYgd2luZHJ2RXh0VGV4dE91dDE2KCBEQyAqZGMsIElOVDE2IHgsIElOVDE2IHksIFVJTlQxNiBmbGFncywgY29uc3QgUkVDVDE2ICogbHByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHN0ciwgVUlOVDE2IGNvdW50LCBjb25zdCBJTlQxNiAqbHBEeCkKLXsKLSAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKLSAgICBCT09MMzIgYlJldCA9IDE7Ci0gICAgRFJBV01PREUgRHJhd01vZGU7Ci0gICAgTFBEUkFXTU9ERSBscERyYXdNb2RlID0gJkRyYXdNb2RlOwotICAgIFRFWFRYRk9STSBUZXh0WEZvcm07Ci0gICAgTFBURVhUWEZPUk0gbHBUZXh0WEZvcm0gPSAmVGV4dFhGb3JtOwotICAgIFJFQ1QxNiByY0NsaXBSZWN0OwotICAgIFJFQ1QxNiAqIGxwQ2xpcFJlY3QgPSAmcmNDbGlwUmVjdDsKLSAgICBSRUNUMTYgcmNPcGFxdWVSZWN0OwotICAgIFJFQ1QxNiAqbHBPcGFxdWVSZWN0ID0gJnJjT3BhcXVlUmVjdDsKLSAgICBXT1JEIHdPcHRpb25zID0gMDsKLSAgICBXT1JEIHdDb3VudCA9IGNvdW50OwotCi0gICAgc3RhdGljIEJPT0wzMiBiSW5pdCA9IEZBTFNFOwotICAgIAotCi0KLSAgICBpZiAoY291bnQgPT0gMCkKLSAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiTFBHRElfRXh0VGV4dE91dDogJTA0eCAlZCAlZCAleCAlcCAlKnMgJXBcbiIsIGRjLT5oU2VsZiwgeCwgeSwgCi0JICAgZmxhZ3MsICBscHJlY3QsIGNvdW50ID4gMCA/IGNvdW50IDogOCwgc3RyLCBscER4KTsKLQotICAgIEluaXRUZXh0WEZvcm0obHBUZXh0WEZvcm0pOwotICAgIEluaXREcmF3TW9kZShscERyYXdNb2RlKTsKLQotICAgIGlmIChiSW5pdCA9PSBGQUxTRSkKLSAgICB7Ci0JRFdPUkQgZHdSZXQ7Ci0KLQlkd1JldCA9IFBSVERSVl9FeHRUZXh0T3V0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIDAsIDAsIAotCQkJCSAgTlVMTCwgIiAiLCAKLQkJCQkgIC0xLCAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIGxwRHJhd01vZGUsIAotCQkJCSAgbHBUZXh0WEZvcm0sIE5VTEwsIE5VTEwsIDApOwotCWJJbml0ID0gVFJVRTsKLSAgICB9Ci0KLSAgICBpZiAoZGMgIT0gTlVMTCkgICAKLSAgICB7Ci0JRFdPUkQgZHdSZXQ7Ci0vKgotCWR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCi0JCQkJICBOVUxMLCAiMCIsIAotCQkJCSAgLTEsICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCi0JCQkJICBscFRleHRYRm9ybSwgTlVMTCwgTlVMTCwgMCk7Ci0KLQlkd1JldCA9IFBSVERSVl9FeHRUZXh0T3V0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIDAsIDAsIAotCQkJCSAgTlVMTCwgc3RyLCAtd0NvdW50LAotCQkJCSAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIGxwRHJhd01vZGUsIAotCQkJCSAgbHBUZXh0WEZvcm0sIE5VTEwsIE5VTEwsIDApOwotKi8KLQlscENsaXBSZWN0LT5sZWZ0ID0gMDsKLQlscENsaXBSZWN0LT50b3AgPSAwOwotCWxwQ2xpcFJlY3QtPnJpZ2h0ID0gMHgzZmM7Ci0JbHBDbGlwUmVjdC0+Ym90dG9tID0gMHg0MjsKLQlscE9wYXF1ZVJlY3QtPmxlZnQgPSB4OwotCWxwT3BhcXVlUmVjdC0+dG9wID0geTsKLQlscE9wYXF1ZVJlY3QtPnJpZ2h0ID0gMHgzYTE7Ci0JbHBPcGFxdWVSZWN0LT5ib3R0b20gPSAweDAxOwotLyoKLQlkd1JldCA9IFBSVERSVl9FeHRUZXh0T3V0KHBoeXNEZXYtPnNlZ3B0clBERVZJQ0UsIHgsIHksIAotCQkJCSAgbHBDbGlwUmVjdCwgc3RyLCAKLQkJCQkgIHdDb3VudCwgIHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvLCBscERyYXdNb2RlLCAKLQkJCQkgIGxwVGV4dFhGb3JtLCBscER4LCBscE9wYXF1ZVJlY3QsIHdPcHRpb25zKTsKLSovCi0JZHdSZXQgPSBQUlREUlZfRXh0VGV4dE91dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCB4LCB5LCAKLQkJCQkgIE5VTEwsIHN0ciwgCi0JCQkJICB3Q291bnQsICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCi0JCQkJICBscFRleHRYRm9ybSwgTlVMTCwgTlVMTCwgd09wdGlvbnMpOwotICAgIH0KLSAgICByZXR1cm4gYlJldDsKLX0KIAogLyoqKioqKioqKioqKioqKioqKiBtaXNjLiBwcmludGVyIHJlbGVhdGVkIGZ1bmN0aW9ucyAqLwogCkBAIC05OTAsMTQgKzkyMCw5MCBAQAogI2lmbmRlZiBIUFEgCiAjZGVmaW5lIEhQUSBXT1JECiAjZW5kaWYKLUhQUSBDcmVhdGVQUShpbnQgc2l6ZSkgeyBwcmludGYoIkNyZWF0ZVBROiAlZFxuIixzaXplKTsgcmV0dXJuIDE7IH0KLWludCBEZWxldGVQUShIUFEgaFBRKSB7IHByaW50ZigiRGVsZXRlUFE6ICV4XG4iLCBoUFEpOyByZXR1cm4gMDsgfQotaW50IEV4dHJhY3RQUShIUFEgaFBRKSB7IHByaW50ZigiRXh0cmFjdFBROiAleFxuIiwgaFBRKTsgcmV0dXJuIDA7IH0KLWludCBJbnNlcnRQUShIUFEgaFBRLCBpbnQgdGFnLCBpbnQga2V5KSAKLXsgcHJpbnRmKCJFeHRyYWN0UFE6ICV4ICVkICVkXG4iLCBoUFEsIHRhZywga2V5KTsgIHJldHVybiAwOyB9Ci1pbnQgTWluUFEoSFBRIGhQUSkgeyBwcmludGYoIk1pblBROiAleFxuIiwgaFBRKTsgcmV0dXJuIDA7IH0KLWludCBTaXplUFEoSFBRIGhQUSwgaW50IHNpemVjaGFuZ2UpIAoteyAgcHJpbnRmKCJTaXplUFE6ICV4ICVkXG4iLCBoUFEsIHNpemVjaGFuZ2UpOyByZXR1cm4gLTE7IH0KK3N0cnVjdCBocHEgCit7CisgICAgc3RydWN0IGhwcSAJKm5leHQ7CisgICAgaW50CQkgdGFnOworICAgIGludAkJIGtleTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaHBxICpocHF1ZXVlOworCitIUFEgCitDcmVhdGVQUShpbnQgc2l6ZSkgCit7CisgICAgcHJpbnRmKCJDcmVhdGVQUTogJWRcbiIsc2l6ZSk7CisgICAgcmV0dXJuIDE7Cit9CitpbnQgCitEZWxldGVQUShIUFEgaFBRKSAKK3sKKyAgICBwcmludGYoIkRlbGV0ZVBROiAleFxuIiwgaFBRKTsKKyAgICByZXR1cm4gMDsKK30KK2ludCAKK0V4dHJhY3RQUShIUFEgaFBRKSAKK3sgCisgICAgc3RydWN0IGhwcSAqcXVldWUsICpwcmV2LCAqY3VycmVudCwgKmN1cnJlbnRQcmV2OworICAgIGludCBrZXksIHRhZyA9IC0xOworICAgIGN1cnJlbnRQcmV2ID0gcHJldiA9IE5VTEw7CisgICAgcXVldWUgPSBjdXJyZW50ID0gaHBxdWV1ZTsKKyAgICBpZiAoY3VycmVudCkKKyAgICAgICAga2V5ID0gY3VycmVudC0+a2V5OworICAgIAorICAgIHdoaWxlIChjdXJyZW50KQorICAgIHsKKyAgICAgICAgY3VycmVudFByZXYgPSBjdXJyZW50OworICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKyAgICAgICAgaWYgKGN1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5rZXkgPCBrZXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcXVldWUgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIHByZXYgPSBjdXJyZW50UHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocXVldWUpCisgICAgeworICAgICAgICB0YWcgPSBxdWV1ZS0+dGFnOworICAgICAgICAKKyAgICAgICAgaWYgKHByZXYpCisgICAgICAgICAgICBwcmV2LT5uZXh0ID0gcXVldWUtPm5leHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhwcXVldWUgPSBxdWV1ZS0+bmV4dDsKKyAgICAgICAgZnJlZShxdWV1ZSk7CisgICAgfQorICAgIAorICAgIHByaW50ZigiRXh0cmFjdFBROiAleCBnb3QgdGFnICVkIGtleSAlZFxuIiwgaFBRLCB0YWcsIGtleSk7IAorCisgICAgcmV0dXJuIHRhZzsKK30KKworaW50IAorSW5zZXJ0UFEoSFBRIGhQUSwgaW50IHRhZywgaW50IGtleSkgCit7CisgICAgc3RydWN0IGhwcSAqcXVldWVJdGVtID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgaHBxKSk7CisgICAgcXVldWVJdGVtLT5uZXh0ID0gaHBxdWV1ZTsKKyAgICBocHF1ZXVlID0gcXVldWVJdGVtOworICAgIHF1ZXVlSXRlbS0+a2V5ID0ga2V5OworICAgIHF1ZXVlSXRlbS0+dGFnID0gdGFnOworICAgIAorICAgIHByaW50ZigiSW5zZXJ0UFE6ICV4ICVkICVkXG4iLCBoUFEsIHRhZywga2V5KTsKKyAgICByZXR1cm4gVFJVRTsKK30KK2ludAorTWluUFEoSFBRIGhQUSkgCit7CisgICAgcHJpbnRmKCJNaW5QUTogJXhcbiIsIGhQUSk7IAorICAgIHJldHVybiAwOworfQoraW50CitTaXplUFEoSFBRIGhQUSwgaW50IHNpemVjaGFuZ2UpIAoreyAgCisgICAgcHJpbnRmKCJTaXplUFE6ICV4ICVkXG4iLCBoUFEsIHNpemVjaGFuZ2UpOyAKKyAgICByZXR1cm4gLTE7IAorfQogCiAvKiAKICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGltcGxlbWVudCBwYXJ0IG9mIHRoZSBzcG9vbGluZyBwcm9jZXNzIHRvIApAQCAtMTAxNiw4ICsxMDIyLDYgQEAKIH0gUFJJTlRKT0IsICpQUFJJTlRKT0I7CiAKICNkZWZpbmUgTUFYX1BSSU5UX0pPQlMgMQotI2RlZmluZSBTUF9FUlJPUiAtMQotI2RlZmluZSBTUF9PVVRPRkRJU0sgLTQKICNkZWZpbmUgU1BfT0sgMQogCiBQUFJJTlRKT0IgZ1ByaW50Sm9ic1RhYmxlW01BWF9QUklOVF9KT0JTXTsKQEAgLTExNDIsNyArMTE0Niw3IEBACiAKICAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIldyaXRlRGlhbG9nOiAlMDR4ICUwNHggXCIlc1wiXG4iLCBoSm9iLCAgY2NoTXNnLCBscE1zZyk7CiAKLSAgICBuUmV0ID0gTWVzc2FnZUJveDE2KDAsIGxwTXNnLCAiUHJpbnRpbmcgRXJyb3IiLCBNQl9PS0NBTkNFTCk7CisgICAgblJldCA9IE1lc3NhZ2VCb3gxNihOVUxMLCBscE1zZywgIlByaW50aW5nIEVycm9yIiwgTUJfT0tDQU5DRUwpOwogICAgIHJldHVybiBuUmV0OwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMgYi9ncmFwaGljcy93aW4xNmRydi90ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyMGRkYwotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L3RleHQuYwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIHdpbjE2IGRyaXZlciB0ZXh0IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk2IEpvaG4gSGFydmV5CisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW4xNmRydi5oIgorI2luY2x1ZGUgImRjLmgiCisjaW5jbHVkZSAiZ2RpLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKy8qICNkZWZpbmUgREVCVUdfV0lOMTZEUlYgKi8KKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXSU4xNkRSVl9FeHRUZXh0T3V0CisgKi8KK0JPT0wzMiBXSU4xNkRSVl9FeHRUZXh0T3V0KCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksIFVJTlQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1QzMiAqbHByZWN0LCBMUENTVFIgc3RyLCBVSU5UMzIgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQzMiAqbHBEeCApCit7CisgICAgV0lOMTZEUlZfUERFVklDRSAqcGh5c0RldiA9IChXSU4xNkRSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CisgICAgQk9PTDMyIGJSZXQgPSAxOworICAgIGV4dGVybiBEUkFXTU9ERSBEcmF3TW9kZTsKKyAgICBMUERSQVdNT0RFIGxwRHJhd01vZGUgPSAmRHJhd01vZGU7CisgICAgVEVYVFhGT1JNMTYgVGV4dFhGb3JtOworICAgIExQVEVYVFhGT1JNMTYgbHBUZXh0WEZvcm0gPSAmVGV4dFhGb3JtOworICAgIFJFQ1QxNiByY0NsaXBSZWN0OworICAgIFJFQ1QxNiAqIGxwQ2xpcFJlY3QgPSAmcmNDbGlwUmVjdDsKKyAgICBSRUNUMTYgcmNPcGFxdWVSZWN0OworICAgIFJFQ1QxNiAqbHBPcGFxdWVSZWN0ID0gJnJjT3BhcXVlUmVjdDsKKyAgICBXT1JEIHdPcHRpb25zID0gMDsKKyAgICBXT1JEIHdDb3VudCA9IGNvdW50OworCisgICAgc3RhdGljIEJPT0wzMiBiSW5pdCA9IEZBTFNFOworICAgIAorCisKKyAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV0lOMTZEUlZfRXh0VGV4dE91dDogJTA0eCAlZCAlZCAleCAlcCAlKnMgJXBcbiIsIGRjLT5oU2VsZiwgeCwgeSwgCisJICAgZmxhZ3MsICBscHJlY3QsIGNvdW50ID4gMCA/IGNvdW50IDogOCwgc3RyLCBscER4KTsKKworICAgIEluaXRUZXh0WEZvcm0obHBUZXh0WEZvcm0pOworCisgICAgaWYgKGJJbml0ID09IEZBTFNFKQorICAgIHsKKwlEV09SRCBkd1JldDsKKworCWR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCisJCQkJICBOVUxMLCAiICIsIAorCQkJCSAgLTEsICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCisJCQkJICBscFRleHRYRm9ybSwgTlVMTCwgTlVMTCwgMCk7CisJYkluaXQgPSBUUlVFOworICAgIH0KKworICAgIGlmIChkYyAhPSBOVUxMKSAgIAorICAgIHsKKwlEV09SRCBkd1JldDsKKy8qCisJZHdSZXQgPSBQUlREUlZfRXh0VGV4dE91dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCAwLCAwLCAKKwkJCQkgIE5VTEwsICIwIiwgCisJCQkJICAtMSwgIHBoeXNEZXYtPnNlZ3B0ckZvbnRJbmZvLCBscERyYXdNb2RlLCAKKwkJCQkgIGxwVGV4dFhGb3JtLCBOVUxMLCBOVUxMLCAwKTsKKworCWR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgMCwgMCwgCisJCQkJICBOVUxMLCBzdHIsIC13Q291bnQsCisJCQkJICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCisJCQkJICBscFRleHRYRm9ybSwgTlVMTCwgTlVMTCwgMCk7CisqLworCWxwQ2xpcFJlY3QtPmxlZnQgPSBscHJlY3QtPmxlZnQgOworCWxwQ2xpcFJlY3QtPnRvcCA9IGxwcmVjdC0+dG9wOworCWxwQ2xpcFJlY3QtPnJpZ2h0ID0gbHByZWN0LT5yaWdodDsKKwlscENsaXBSZWN0LT5ib3R0b20gPSBscHJlY3QtPmJvdHRvbTsKKyAgICAgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJXSU4xNkRSVl9FeHRUZXh0T3V0IENsaXAgcmVjdCBsZWZ0ICVkIHRvcCAlZCByaWd0ICVkIGJvdHRvbSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBscENsaXBSZWN0LT5sZWZ0LGxwQ2xpcFJlY3QtPnRvcCxscENsaXBSZWN0LT5yaWdodCxscENsaXBSZWN0LT5ib3R0b20pOworICAgICAgICAKKwlscENsaXBSZWN0LT5sZWZ0ID0gMDsKKwlscENsaXBSZWN0LT50b3AgPSAwOworCWxwQ2xpcFJlY3QtPnJpZ2h0ID0gMHgzZmM7CisJbHBDbGlwUmVjdC0+Ym90dG9tID0gMHg2MzA7CisgICAgICAgIGRwcmludGZfd2luMTZkcnYoc3RkZGViLCAiV0lOMTZEUlZfRXh0VGV4dE91dCBDbGlwIHJlY3QgbGVmdCAlZCB0b3AgJWQgcmlndCAlZCBib3R0b20gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbHBDbGlwUmVjdC0+bGVmdCxscENsaXBSZWN0LT50b3AsbHBDbGlwUmVjdC0+cmlnaHQsbHBDbGlwUmVjdC0+Ym90dG9tKTsKKwlscE9wYXF1ZVJlY3QtPmxlZnQgPSB4OworCWxwT3BhcXVlUmVjdC0+dG9wID0geTsKKwlscE9wYXF1ZVJlY3QtPnJpZ2h0ID0gMHgzYTE7CisJbHBPcGFxdWVSZWN0LT5ib3R0b20gPSAweDAxOworICAgICAgICBwcmludGYoImRyYXdtb2RlIHJvcHQgMHgleCBia01vZGUgMHgleCBia0NvbG9yIDB4JXggdGV4dENvbG9yIDB4JXggdGJicmVha0V4dHJhIDB4JXggYnJlYWtleHRyYSAweCV4XG4iLAorICAgICAgICAgICAgICAgbHBEcmF3TW9kZS0+Um9wMiwgICAgbHBEcmF3TW9kZS0+YmtNb2RlLCAgICBscERyYXdNb2RlLT5ia0NvbG9yLAorICAgICAgICAgICAgICAgbHBEcmF3TW9kZS0+VGV4dENvbG9yLCAgICBscERyYXdNb2RlLT5UQnJlYWtFeHRyYSwgICAgbHBEcmF3TW9kZS0+QnJlYWtFeHRyYSk7CisgICAgICAgIHByaW50ZigiYnJlYWtlcnIgMHgleCBicmVha3JlbSAweCV4IGJyZWFrY291bnQgMHgleCBjaGV4dHJhIDB4JXggbGJrY29sb3IgMHgleCBsdGV4dGNvbG9yIDB4JXhcbiIsCisgICAgICAgICAgICAgICBscERyYXdNb2RlLT5CcmVha0VyciwgICAgbHBEcmF3TW9kZS0+QnJlYWtSZW0sICAgIGxwRHJhd01vZGUtPkJyZWFrQ291bnQsCisgICAgICAgICAgICAgICBscERyYXdNb2RlLT5DaGFyRXh0cmEsCSAgIGxwRHJhd01vZGUtPkxia0NvbG9yLCAgICBscERyYXdNb2RlLT5MVGV4dENvbG9yKTsKKworICAgIHsKKyAgICAgICAgUkVDVDE2IHJjUGFnZVNpemU7CisJRk9OVElORk8xNiAqcCA9IChGT05USU5GTzE2ICopUFRSX1NFR19UT19MSU4ocGh5c0Rldi0+c2VncHRyRm9udEluZm8pOworICAgICAgICByY1BhZ2VTaXplLmxlZnQgPSAwOworICAgICAgICByY1BhZ2VTaXplLnJpZ2h0ID0gMHgzYzA7CisgICAgICAgIAorICAgICAgICByY1BhZ2VTaXplLnRvcCA9IDA7CisgICAgICAgIHJjUGFnZVNpemUuYm90dG9tID0gMHg2MzA7CisgICAgICAgIAorCisKKworICAgICAgICBpZih5IDwgcmNQYWdlU2l6ZS50b3AgIHx8ICB5ICsgcC0+ZGZQaXhIZWlnaHQgPiByY1BhZ2VTaXplLmJvdHRvbSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQgMSB5ICVkIHRvcCAlZCB5ICtoZWlnaHQgJWQgYm90dG9tICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHksIHJjUGFnZVNpemUudG9wICAsICB5ICsgcC0+ZGZQaXhIZWlnaHQgLCByY1BhZ2VTaXplLmJvdHRvbSk7CisgICAgICAgIH0KKyAgICAgICAgCisKKyAgICAgICAgaWYoeCA+PSByY1BhZ2VTaXplLnJpZ2h0ICB8fAorICAgICAgICAgICAgeCArIHdDb3VudCAqIHAtPmRmUGl4V2lkdGggPCByY1BhZ2VTaXplLmxlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiRmFpbGUgMlxuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgICAgICAKKworCWR3UmV0ID0gUFJURFJWX0V4dFRleHRPdXQocGh5c0Rldi0+c2VncHRyUERFVklDRSwgeCwgeSwgCisJCQkJICBscENsaXBSZWN0LCBzdHIsIAorCQkJCSAgd0NvdW50LCAgcGh5c0Rldi0+c2VncHRyRm9udEluZm8sIGxwRHJhd01vZGUsIAorCQkJCSAgbHBUZXh0WEZvcm0sIE5VTEwsIE5VTEwsIHdPcHRpb25zKTsKKy8qCisJZHdSZXQgPSBQUlREUlZfRXh0VGV4dE91dChwaHlzRGV2LT5zZWdwdHJQREVWSUNFLCB4LCB5LCAKKwkJCQkgIGxwQ2xpcFJlY3QsIHN0ciwgCisJCQkJICB3Q291bnQsICBwaHlzRGV2LT5zZWdwdHJGb250SW5mbywgbHBEcmF3TW9kZSwgCisJCQkJICBscFRleHRYRm9ybSwgbHBEeCwgTlVMTCwgZmxhZ3MpOworKi8KKyAgICB9CisgICAgcmV0dXJuIGJSZXQ7Cit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy93aW5nLmMgYi9ncmFwaGljcy93aW5nLmMKaW5kZXggYzMyNTRiYy4uYWVkMGUzOSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvd2luZy5jCisrKyBiL2dyYXBoaWNzL3dpbmcuYwpAQCAtOCw3ICs4LDkgQEAKICNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2lmbmRlZiBfX0VNWF9fCiAjaW5jbHVkZSA8c3lzL3NobS5oPgorI2VuZGlmCiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZm9udC5jIGIvZ3JhcGhpY3MveDExZHJ2L2ZvbnQuYwppbmRleCA2ZmFlYmFlLi40YjgxNmUyIDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvZm9udC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9mb250LmMKQEAgLTI1LDMgKzI1LDQxIEBACiAJCSAgICAqIGRjLT53bmRFeHRZIC8gZGMtPnZwb3J0RXh0WSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKK0JPT0wzMiBYMTFEUlZfR2V0VGV4dE1ldHJpY3MoREMgKmRjLCBURVhUTUVUUklDMzJBICptZXRyaWNzKQoreworICAgIAorICAgIG1ldHJpY3MtPnRtV2VpZ2h0ICAgICAgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtV2VpZ2h0OworICAgIG1ldHJpY3MtPnRtT3ZlcmhhbmcgICAgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtT3Zlcmhhbmc7CisgICAgbWV0cmljcy0+dG1EaWdpdGl6ZWRBc3BlY3RYID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1EaWdpdGl6ZWRBc3BlY3RYOworICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WSA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGlnaXRpemVkQXNwZWN0WTsKKyAgICBtZXRyaWNzLT50bUZpcnN0Q2hhciAgICAgICAgPSBkYy0+dS54LmZvbnQubWV0cmljcy50bUZpcnN0Q2hhcjsKKyAgICBtZXRyaWNzLT50bUxhc3RDaGFyICAgICAgICAgPSBkYy0+dS54LmZvbnQubWV0cmljcy50bUxhc3RDaGFyOworICAgIG1ldHJpY3MtPnRtRGVmYXVsdENoYXIgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGVmYXVsdENoYXI7CisgICAgbWV0cmljcy0+dG1CcmVha0NoYXIgICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1CcmVha0NoYXI7CisgICAgbWV0cmljcy0+dG1JdGFsaWMgICAgICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1JdGFsaWM7CisgICAgbWV0cmljcy0+dG1VbmRlcmxpbmVkICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1VbmRlcmxpbmVkOworICAgIG1ldHJpY3MtPnRtU3RydWNrT3V0ICAgICAgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtU3RydWNrT3V0OworICAgIG1ldHJpY3MtPnRtUGl0Y2hBbmRGYW1pbHkgICA9IGRjLT51LnguZm9udC5tZXRyaWNzLnRtUGl0Y2hBbmRGYW1pbHk7CisgICAgbWV0cmljcy0+dG1DaGFyU2V0ICAgICAgICAgID0gZGMtPnUueC5mb250Lm1ldHJpY3MudG1DaGFyU2V0OworCisgICAgbWV0cmljcy0+dG1Bc2NlbnQgID0gYWJzKCBkYy0+dS54LmZvbnQubWV0cmljcy50bUFzY2VudAorCQkJICAgICAgKiBkYy0+d25kRXh0WSAvIGRjLT52cG9ydEV4dFkgKTsKKyAgICBtZXRyaWNzLT50bURlc2NlbnQgPSBhYnMoIGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGVzY2VudAorCQkJICAgICAgKiBkYy0+d25kRXh0WSAvIGRjLT52cG9ydEV4dFkgKTsKKyAgICBtZXRyaWNzLT50bUhlaWdodCAgPSBkYy0+dS54LmZvbnQubWV0cmljcy50bUFzY2VudCArIGRjLT51LnguZm9udC5tZXRyaWNzLnRtRGVzY2VudDsKKyAgICBtZXRyaWNzLT50bUludGVybmFsTGVhZGluZyA9IGFicyggZGMtPnUueC5mb250Lm1ldHJpY3MudG1JbnRlcm5hbExlYWRpbmcKKwkJCQkgICAgICAqIGRjLT53bmRFeHRZIC8gZGMtPnZwb3J0RXh0WSApOworICAgIG1ldHJpY3MtPnRtRXh0ZXJuYWxMZWFkaW5nID0gYWJzKCBkYy0+dS54LmZvbnQubWV0cmljcy50bUV4dGVybmFsTGVhZGluZworCQkJCSAgICAgICogZGMtPnduZEV4dFkgLyBkYy0+dnBvcnRFeHRZICk7CisgICAgbWV0cmljcy0+dG1NYXhDaGFyV2lkdGggICAgPSBhYnMoIGRjLT51LnguZm9udC5tZXRyaWNzLnRtTWF4Q2hhcldpZHRoIAorCQkJCSAgICAgICogZGMtPnduZEV4dFggLyBkYy0+dnBvcnRFeHRYICk7CisgICAgbWV0cmljcy0+dG1BdmVDaGFyV2lkdGggICAgPSBhYnMoIGRjLT51LnguZm9udC5tZXRyaWNzLnRtQXZlQ2hhcldpZHRoCisJCQkJICAgICAgKiBkYy0+d25kRXh0WCAvIGRjLT52cG9ydEV4dFggKTsKKworICAgIHJldHVybiBUUlVFOworICAgIAorfQorCisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwppbmRleCA4MzQzODRhLi4yNjE5NDI1IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYworKysgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwpAQCAtNSw2ICs1LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bWF0aC5oPgorI2lmIGRlZmluZWQoX19FTVhfXykKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8WDExL1hsaWIuaD4KICNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9pbml0LmMgYi9ncmFwaGljcy94MTFkcnYvaW5pdC5jCmluZGV4IDc5OWRlYzguLmE3ZmQzNjEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2luaXQuYwpAQCAtMzAsNyArMzAsNyBAQAogICAgIFgxMURSVl9FeHRUZXh0T3V0LCAgICAgICAgICAgICAgIC8qIHBFeHRUZXh0T3V0ICovCiAgICAgWDExRFJWX0dldFBpeGVsLCAgICAgICAgICAgICAgICAgLyogcEdldFBpeGVsICovCiAgICAgWDExRFJWX0dldFRleHRFeHRlbnRQb2ludCwgICAgICAgLyogcEdldFRleHRFeHRlbnRQb2ludCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBHZXRUZXh0TWV0cmljcyAqLworICAgIFgxMURSVl9HZXRUZXh0TWV0cmljcywgICAgICAgICAgIC8qIHBHZXRUZXh0TWV0cmljcyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBJbnRlcnNlY3RDbGlwUmVjdCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBJbnRlcnNlY3RWaXNSZWN0ICovCiAgICAgWDExRFJWX0xpbmVUbywgICAgICAgICAgICAgICAgICAgLyogcExpbmVUbyAqLwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3RleHQuYyBiL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKaW5kZXggNGVhMjU4Ny4uNTYxY2I1ZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L3RleHQuYworKysgYi9ncmFwaGljcy94MTFkcnYvdGV4dC5jCkBAIC00MSw4ICs0MSw4IEBACiAgICAgaWYgKCFEQ19TZXR1cEdDRm9yVGV4dCggZGMgKSkgcmV0dXJuIFRSVUU7CiAgICAgZm9udCA9IGRjLT51LnguZm9udC5mc3RydWN0OwogCi0gICAgZHByaW50Zl90ZXh0KHN0ZGRlYiwiRXh0VGV4dE91dDogaGRjPSUwNHggJWQsJWQgJyUqLipzJywgJWQgIGZsYWdzPSVkXG4iLAotICAgICAgICAgICAgICAgICBkYy0+aFNlbGYsIHgsIHksIGNvdW50LCBjb3VudCwgc3RyLCBjb3VudCwgZmxhZ3MpOworICAgIGRwcmludGZfdGV4dChzdGRkZWIsIkV4dFRleHRPdXQ6IGhkYz0lMDR4ICVkLCVkICclLipzJywgJWQgIGZsYWdzPSVkXG4iLAorICAgICAgICAgICAgICAgICBkYy0+aFNlbGYsIHgsIHksIChpbnQpY291bnQsIHN0ciwgY291bnQsIGZsYWdzKTsKICAgICBpZiAobHByZWN0ICE9IE5VTEwpIGRwcmludGZfdGV4dChzdGRkZWIsICJcdHJlY3Q9KCVkLCVkLSAlZCwlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHByZWN0LT5sZWZ0LCBscHJlY3QtPnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHJlY3QtPnJpZ2h0LCBscHJlY3QtPmJvdHRvbSApOwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2FkdmFwaTMyLnNwZWMgYi9pZjE2MzIvYWR2YXBpMzIuc3BlYwppbmRleCAxYjVjYzdkLi5hNzhkNzhkIDEwMDY0NAotLS0gYS9pZjE2MzIvYWR2YXBpMzIuc3BlYworKysgYi9pZjE2MzIvYWR2YXBpMzIuc3BlYwpAQCAtMTExLDcgKzExMSw3IEBACiAwMTA2IHN0dWIgT3BlbkJhY2t1cEV2ZW50TG9nVwogMDEwNyBzdHViIE9wZW5FdmVudExvZ0EKIDAxMDggc3R1YiBPcGVuRXZlbnRMb2dXCi0wMTA5IHN0dWIgT3BlblByb2Nlc3NUb2tlbgorMDEwOSBzdGRjYWxsIE9wZW5Qcm9jZXNzVG9rZW4obG9uZyBsb25nIHB0cikgT3BlblByb2Nlc3NUb2tlbgogMDExMCBzdHViIE9wZW5TQ01hbmFnZXJBCiAwMTExIHN0dWIgT3BlblNDTWFuYWdlclcKIDAxMTIgc3R1YiBPcGVuU2VydmljZUEKQEAgLTEyOSw3ICsxMjksNyBAQAogMDEyNCBzdHViIFJlYWRFdmVudExvZ0EKIDAxMjUgc3R1YiBSZWFkRXZlbnRMb2dXCiAwMTI2IHN0ZGNhbGwgUmVnQ2xvc2VLZXkobG9uZykgUmVnQ2xvc2VLZXkKLTAxMjcgc3R1YiBSZWdDb25uZWN0UmVnaXN0cnlBCiswMTI3IHN0ZGNhbGwgUmVnQ29ubmVjdFJlZ2lzdHJ5QShwdHIgbG9uZyBwdHIpIFJlZ0Nvbm5lY3RSZWdpc3RyeTMyQQogMDEyOCBzdHViIFJlZ0Nvbm5lY3RSZWdpc3RyeVcKIDAxMjkgc3RkY2FsbCBSZWdDcmVhdGVLZXlBKGxvbmcgcHRyIHB0cikgUmVnQ3JlYXRlS2V5MzJBCiAwMTMwIHN0ZGNhbGwgUmVnQ3JlYXRlS2V5RXhBKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcgbG9uZyBwdHIgcHRyIHB0cikgUmVnQ3JlYXRlS2V5RXgzMkEKZGlmZiAtLWdpdCBhL2lmMTYzMi9jcnRkbGwuc3BlYyBiL2lmMTYzMi9jcnRkbGwuc3BlYwppbmRleCBhN2M2Zjg4Li5iMjQ5YjYwIDEwMDY0NAotLS0gYS9pZjE2MzIvY3J0ZGxsLnNwZWMKKysrIGIvaWYxNjMyL2NydGRsbC5zcGVjCkBAIC0yNjcsNyArMjY3LDcgQEAKIDI2MiBzdHViIF9zZWFyY2hlbnYKIDI2MyBzdHViIF9zZXRlcnJvcm1vZGUKIDI2NCBzdHViIF9zZXRqbXAKLTI2NSBzdHViIF9zZXRtb2RlCisyNjUgY2RlY2wgX3NldG1vZGUobG9uZyBsb25nKSBDUlRETExfX3NldG1vZGUKIDI2NiBzdHViIF9zZXRzeXN0aW1lCiAyNjcgc3R1YiBfc2xlZXAKIDI2OCBzdHViIF9zbnByaW50ZgpAQCAtMjk1LDcgKzI5NSw3IEBACiAyOTAgc3R1YiBfc3RybHdyCiAyOTEgc3R1YiBfc3RybmNudAogMjkyIHN0dWIgX3N0cm5leHRjCi0yOTMgc3R1YiBfc3RybmljbXAKKzI5MyBjZGVjbCBfc3RybmljbXAocHRyIHB0ciBsb25nKSBsc3RybmNtcGkzMkEKIDI5NCBzdHViIF9zdHJuaW5jCiAyOTUgc3R1YiBfc3RybnNldAogMjk2IHN0dWIgX3N0cnJldgpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAzNDIgY2RlY2wgYXNpbihsb25nKSBDUlRETExfYXNpbgogMzQzIGNkZWNsIGF0YW4obG9uZykgQ1JURExMX2F0YW4KIDM0NCBjZGVjbCBhdGFuMihsb25nIGxvbmcpIENSVERMTF9hdGFuMgotMzQ1IHN0dWIgYXRleGl0CiszNDUgY2RlY2wgYXRleGl0KHB0cikgQ1JURExMX2F0ZXhpdAogMzQ2IGNkZWNsIGF0b2YocHRyKSBDUlRETExfYXRvZgogMzQ3IGNkZWNsIGF0b2kocHRyKSBDUlRETExfYXRvaQogMzQ4IGNkZWNsIGF0b2wocHRyKSBDUlRETExfYXRvbApAQCAtNDQ2LDcgKzQ0Niw3IEBACiA0NDEgc3R1YiBwdXRjCiA0NDIgY2RlY2wgcHV0Y2hhcihsb25nKSBDUlRETExfcHV0Y2hhcgogNDQzIHN0dWIgcHV0cwotNDQ0IHN0dWIgcXNvcnQKKzQ0NCBjZGVjbCBxc29ydChwdHIgbG9uZyBsb25nIHB0cikgcXNvcnQKIDQ0NSBzdHViIHJhaXNlCiA0NDYgY2RlY2wgcmFuZCgpIENSVERMTF9yYW5kCiA0NDcgY2RlY2wgcmVhbGxvYyhwdHIgbG9uZykgQ1JURExMX3JlYWxsb2MKZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkuc3BlYyBiL2lmMTYzMi9nZGkuc3BlYwppbmRleCA0ZDI4NDZiLi4yOTBmYjg1IDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpLnNwZWMKKysrIGIvaWYxNjMyL2dkaS5zcGVjCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzX3dvcmQgc193b3JkIGxvbmcpIFN0cmV0Y2hCbHQxNgogMzYgIHBhc2NhbDE2IFBvbHlnb24gKHdvcmQgcHRyIHdvcmQpIFBvbHlnb24xNgogMzcgIHBhc2NhbDE2IFBvbHlsaW5lICh3b3JkIHB0ciB3b3JkKSBQb2x5bGluZTE2Ci0zOCAgcGFzY2FsIEVzY2FwZSh3b3JkIHdvcmQgd29yZCBzZWdwdHIgc2VncHRyKSBFc2NhcGUKKzM4ICBwYXNjYWwgRXNjYXBlKHdvcmQgd29yZCB3b3JkIHNlZ3B0ciBzZWdwdHIpIEVzY2FwZTE2CiAzOSAgcGFzY2FsMTYgUmVzdG9yZURDKHdvcmQgc193b3JkKSBSZXN0b3JlREMxNgogNDAgIHBhc2NhbDE2IEZpbGxSZ24od29yZCB3b3JkIHdvcmQpIEZpbGxSZ24xNgogNDEgIHBhc2NhbDE2IEZyYW1lUmduKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgRnJhbWVSZ24xNgpAQCAtMjA5LDkgKzIwOSw5IEBACiAyODEgcGFzY2FsIERydlNldFByaW50ZXJEYXRhKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBEcnZTZXRQcmludGVyRGF0YQogMjgyIHBhc2NhbCBEcnZHZXRQcmludGVyRGF0YShwdHIgcHRyIHB0ciBwdHIgbG9uZyBwdHIpIERydkdldFByaW50ZXJEYXRhCiAyOTkgc3R1YiBFTkdJTkVHRVRDSEFSV0lEVEhFWAotMzAwIHN0dWIgRU5HSU5FRU5VTUVSQVRFRk9OVAorMzAwIHBhc2NhbCBFbmdpbkVudW1lcmF0ZUZvbnQocHRyIHNlZ3B0ciBsb25nKSBFbmdpbmVFbnVtZXJhdGVGb250CiAzMDEgc3R1YiBFTkdJTkVERUxFVEVGT05UCi0zMDIgc3R1YiBFTkdJTkVSRUFMSVpFRk9OVAorMzAyIHBhc2NhbCBFbmdpblJlYWxpemVGb250KHB0ciBwdHIgcHRyKSBFbmdpbmVSZWFsaXplRm9udAogMzAzIHN0dWIgRU5HSU5FR0VUQ0hBUldJRFRICiAzMDQgc3R1YiBFTkdJTkVTRVRGT05UQ09OVEVYVAogMzA1IHN0dWIgRU5HSU5FR0VUR0xZUEhCTVAKZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkzMi5zcGVjIGIvaWYxNjMyL2dkaTMyLnNwZWMKaW5kZXggY2M4ZjI1Zi4uYzIwZWVhYSAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaTMyLnNwZWMKKysrIGIvaWYxNjMyL2dkaTMyLnNwZWMKQEAgLTk2LDcgKzk2LDcgQEAKIDAwODggc3R1YiBFbnVtTWV0YUZpbGUKIDAwODkgc3RkY2FsbCBFbnVtT2JqZWN0cyhsb25nIGxvbmcgcHRyIGxvbmcpIFRIVU5LX0VudW1PYmplY3RzMzIKIDAwOTAgc3RkY2FsbCBFcXVhbFJnbihsb25nIGxvbmcpIEVxdWFsUmduMzIKLTAwOTEgc3RkY2FsbCBFc2NhcGUobG9uZyBsb25nIGxvbmcgcHRyIHB0cikgRXNjYXBlCiswMDkxIHN0ZGNhbGwgRXNjYXBlKGxvbmcgbG9uZyBsb25nIHB0ciBwdHIpIEVzY2FwZTMyCiAwMDkyIHN0ZGNhbGwgRXhjbHVkZUNsaXBSZWN0KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgRXhjbHVkZUNsaXBSZWN0MzIKIDAwOTMgc3R1YiBFeHRDcmVhdGVQZW4KIDAwOTQgc3R1YiBFeHRDcmVhdGVSZWdpb24KZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCBmMzhiMTkwLi5jN2QwMWI5IDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC02Myw3ICs2Myw3IEBACiA2NCAgcGFzY2FsMTYgQWNjZXNzUmVzb3VyY2Uod29yZCB3b3JkKSBBY2Nlc3NSZXNvdXJjZTE2CiA2NSAgcGFzY2FsIFNpemVvZlJlc291cmNlKHdvcmQgd29yZCkgU2l6ZW9mUmVzb3VyY2UxNgogNjYgIHBhc2NhbDE2IEFsbG9jUmVzb3VyY2Uod29yZCB3b3JkIGxvbmcpIEFsbG9jUmVzb3VyY2UxNgotNjcgIHN0dWIgU2V0UmVzb3VyY2VIYW5kbGVyCis2NyAgcGFzY2FsIFNldFJlc291cmNlSGFuZGxlcih3b3JkIHB0ciBwdHIpIFNldFJlc291cmNlSGFuZGxlcgogNjggIHBhc2NhbDE2IEluaXRBdG9tVGFibGUod29yZCkgSW5pdEF0b21UYWJsZQogNjkgIHBhc2NhbDE2IEZpbmRBdG9tKHNlZ3B0cikgRmluZEF0b20KIDcwICBwYXNjYWwxNiBBZGRBdG9tKHNlZ3B0cikgQWRkQXRvbQpkaWZmIC0tZ2l0IGEvaWYxNjMyL250ZGxsLnNwZWMgYi9pZjE2MzIvbnRkbGwuc3BlYwppbmRleCA0N2Q0ZDM3Li40OGVjZTU3IDEwMDY0NAotLS0gYS9pZjE2MzIvbnRkbGwuc3BlYworKysgYi9pZjE2MzIvbnRkbGwuc3BlYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAyNjYgc3RkY2FsbCBSdGxBbGxvY2F0ZUhlYXAobG9uZyBsb25nIGxvbmcpIEhlYXBBbGxvYwogMjY3IHN0dWIgUnRsQW5zaUNoYXJUb1VuaWNvZGVDaGFyCiAyNjggc3R1YiBSdGxBbnNpU3RyaW5nVG9Vbmljb2RlU2l6ZQotMjY5IHN0dWIgUnRsQW5zaVN0cmluZ1RvVW5pY29kZVN0cmluZworMjY5IHN0ZGNhbGwgUnRsQW5zaVN0cmluZ1RvVW5pY29kZVN0cmluZyhwdHIgcHRyIGxvbmcpIFJ0bEFuc2lTdHJpbmdUb1VuaWNvZGVTdHJpbmcKIDI3MCBzdHViIFJ0bEFwcGVuZEFzY2lpelRvU3RyaW5nCiAyNzEgc3R1YiBSdGxBcHBlbmRTdHJpbmdUb1N0cmluZwogMjcyIHN0dWIgUnRsQXBwZW5kVW5pY29kZVN0cmluZ1RvU3RyaW5nCkBAIC0zNDUsNyArMzQ1LDcgQEAKIDM0MSBzdHViIFJ0bEVubGFyZ2VkSW50ZWdlck11bHRpcGx5CiAzNDIgc3R1YiBSdGxFbmxhcmdlZFVuc2lnbmVkRGl2aWRlCiAzNDMgc3R1YiBSdGxFbmxhcmdlZFVuc2lnbmVkTXVsdGlwbHkKLTM0NCBzdHViIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uCiszNDQgc3RkY2FsbCBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbihwdHIpIEVudGVyQ3JpdGljYWxTZWN0aW9uCiAzNDUgc3R1YiBSdGxFbnVtUHJvY2Vzc0hlYXBzCiAzNDYgc3R1YiBSdGxFbnVtZXJhdGVHZW5lcmljVGFibGUKIDM0NyBzdHViIFJ0bEVudW1lcmF0ZUdlbmVyaWNUYWJsZVdpdGhvdXRTcGxheWluZwpAQCAtMzkxLDcgKzM5MSw3IEBACiAzODcgc3R1YiBSdGxHZXRHcm91cFNlY3VyaXR5RGVzY3JpcHRvcgogMzg4IHN0dWIgUnRsR2V0TG9uZ2VzdE50UGF0aExlbmd0aAogMzg5IHN0dWIgUnRsR2V0TnRHbG9iYWxGbGFncwotMzkwIHN0dWIgUnRsR2V0TnRQcm9kdWN0VHlwZQorMzkwIHN0ZGNhbGwgUnRsR2V0TnRQcm9kdWN0VHlwZShwdHIpIFJ0bEdldE50UHJvZHVjdFR5cGUKIDM5MSBzdHViIFJ0bEdldE93bmVyU2VjdXJpdHlEZXNjcmlwdG9yCiAzOTIgc3R1YiBSdGxHZXRQcm9jZXNzSGVhcHMKIDM5MyBzdHViIFJ0bEdldFNhY2xTZWN1cml0eURlc2NyaXB0b3IKQEAgLTQwMywxMSArNDAzLDExIEBACiAzOTkgc3R1YiBSdGxJbml0QW5zaVN0cmluZwogNDAwIHN0dWIgUnRsSW5pdENvZGVQYWdlVGFibGUKIDQwMSBzdHViIFJ0bEluaXRObHNUYWJsZXMKLTQwMiBzdHViIFJ0bEluaXRTdHJpbmcKLTQwMyBzdHViIFJ0bEluaXRVbmljb2RlU3RyaW5nCis0MDIgc3RkY2FsbCBSdGxJbml0U3RyaW5nKHB0ciBwdHIpIFJ0bEluaXRTdHJpbmcKKzQwMyBzdGRjYWxsIFJ0bEluaXRVbmljb2RlU3RyaW5nKHB0ciBwdHIpIFJ0bEluaXRVbmljb2RlU3RyaW5nCiA0MDQgc3R1YiBSdGxJbml0aWFsaXplQml0TWFwCiA0MDUgc3R1YiBSdGxJbml0aWFsaXplQ29udGV4dAotNDA2IHN0dWIgUnRsSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgorNDA2IHN0ZGNhbGwgUnRsSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihwdHIpIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24KIDQwNyBzdHViIFJ0bEluaXRpYWxpemVHZW5lcmljVGFibGUKIDQwOCBzdHViIFJ0bEluaXRpYWxpemVSWGFjdAogNDA5IHN0dWIgUnRsSW5pdGlhbGl6ZVJlc291cmNlCkBAIC00MjcsNyArNDI3LDcgQEAKIDQyMyBzdHViIFJ0bExhcmdlSW50ZWdlclNoaWZ0UmlnaHQKIDQyNCBzdHViIFJ0bExhcmdlSW50ZWdlclN1YnRyYWN0CiA0MjUgc3R1YiBSdGxMYXJnZUludGVnZXJUb0NoYXIKLTQyNiBzdHViIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uCis0MjYgc3RkY2FsbCBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbihwdHIpIExlYXZlQ3JpdGljYWxTZWN0aW9uCiA0Mjcgc3RkY2FsbCBSdGxMZW5ndGhSZXF1aXJlZFNpZChsb25nKSBSdGxMZW5ndGhSZXF1aXJlZFNpZAogNDI4IHN0dWIgUnRsTGVuZ3RoU2VjdXJpdHlEZXNjcmlwdG9yCiA0Mjkgc3R1YiBSdGxMZW5ndGhTaWQKQEAgLTQ0MywxMiArNDQzLDEyIEBACiA0Mzkgc3R1YiBSdGxOZXdTZWN1cml0eUdyYW50ZWRBY2Nlc3MKIDQ0MCBzdHViIFJ0bE5ld1NlY3VyaXR5T2JqZWN0CiA0NDEgc3RkY2FsbCBSdGxOb3JtYWxpemVQcm9jZXNzUGFyYW1zKHB0cikgUnRsTm9ybWFsaXplUHJvY2Vzc1BhcmFtcwotNDQyIHN0dWIgUnRsTnRTdGF0dXNUb0Rvc0Vycm9yCis0NDIgc3RkY2FsbCBSdGxOdFN0YXR1c1RvRG9zRXJyb3IobG9uZykgUnRsTnRTdGF0dXNUb0Rvc0Vycm9yCiA0NDMgc3R1YiBSdGxOdW1iZXJHZW5lcmljVGFibGVFbGVtZW50cwogNDQ0IHN0dWIgUnRsTnVtYmVyT2ZDbGVhckJpdHMKIDQ0NSBzdHViIFJ0bE51bWJlck9mU2V0Qml0cwogNDQ2IHN0dWIgUnRsT2VtU3RyaW5nVG9Vbmljb2RlU2l6ZQotNDQ3IHN0dWIgUnRsT2VtU3RyaW5nVG9Vbmljb2RlU3RyaW5nCis0NDcgc3RkY2FsbCBSdGxPZW1TdHJpbmdUb1VuaWNvZGVTdHJpbmcocHRyIHB0ciBsb25nKSBSdGxPZW1TdHJpbmdUb1VuaWNvZGVTdHJpbmcKIDQ0OCBzdGRjYWxsIFJ0bE9lbVRvVW5pY29kZU4ocHRyIGxvbmcgcHRyIHB0ciBsb25nKSBSdGxPZW1Ub1VuaWNvZGVOCiA0NDkgc3R1YiBSdGxPcGVuQ3VycmVudFVzZXIKIDQ1MCBzdHViIFJ0bFBjVG9GaWxlSGVhZGVyCkBAIC01MjEsNyArNTIxLDcgQEAKIDUxNyBzdHViIFJ0bFVubG9ja0hlYXAKIDUxOCBzdHViIFJ0bFVud2luZAogNTE5IHN0dWIgUnRsVXBjYXNlVW5pY29kZUNoYXIKLTUyMCBzdHViIFJ0bFVwY2FzZVVuaWNvZGVTdHJpbmcKKzUyMCBzdGRjYWxsIFJ0bFVwY2FzZVVuaWNvZGVTdHJpbmcocHRyIHB0ciBsb25nKSBSdGxVcGNhc2VVbmljb2RlU3RyaW5nCiA1MjEgc3R1YiBSdGxVcGNhc2VVbmljb2RlU3RyaW5nVG9BbnNpU3RyaW5nCiA1MjIgc3R1YiBSdGxVcGNhc2VVbmljb2RlU3RyaW5nVG9Db3VudGVkT2VtU3RyaW5nCiA1MjMgc3R1YiBSdGxVcGNhc2VVbmljb2RlU3RyaW5nVG9PZW1TdHJpbmcKQEAgLTU0OSw4ICs1NDksOCBAQAogNTQ1IHN0dWIgUnRscE50U2V0VmFsdWVLZXkKIDU0NiBzdHViIFJ0bHBVbldhaXRDcml0aWNhbFNlY3Rpb24KIDU0NyBzdHViIFJ0bHBXYWl0Rm9yQ3JpdGljYWxTZWN0aW9uCi01NDggc3R1YiBSdGx4QW5zaVN0cmluZ1RvVW5pY29kZVNpemUKLTU0OSBzdHViIFJ0bHhPZW1TdHJpbmdUb1VuaWNvZGVTaXplCis1NDggc3RkY2FsbCBSdGx4QW5zaVN0cmluZ1RvVW5pY29kZVNpemUocHRyKSBSdGx4QW5zaVN0cmluZ1RvVW5pY29kZVNpemUKKzU0OSBzdGRjYWxsIFJ0bHhPZW1TdHJpbmdUb1VuaWNvZGVTaXplKHB0cikgUnRseE9lbVN0cmluZ1RvVW5pY29kZVNpemUKIDU1MCBzdHViIFJ0bHhVbmljb2RlU3RyaW5nVG9BbnNpU2l6ZQogNTUxIHN0dWIgUnRseFVuaWNvZGVTdHJpbmdUb09lbVNpemUKIDU1MiBzdHViIFNhdmVFbTg3Q29udGV4dApAQCAtOTI4LDI3ICs5MjgsMjcgQEAKIDkyNCBzdGRjYWxsIHN0cnJjaHIocHRyIGxvbmcpIHN0cnJjaHIKIDkyNSBzdHViIHN0cnNwbgogOTI2IHN0dWIgc3Ryc3RyCi05Mjcgc3R1YiBzd3ByaW50ZgorOTI3IHN0ZGNhbGwgc3dwcmludGYoKSBDUlRETExfc3dwcmludGYKIDkyOCBzdHViIHRhbgogOTI5IHN0dWIgdG9sb3dlcgogOTMwIHN0dWIgdG91cHBlcgogOTMxIHN0dWIgdG93bG93ZXIKIDkzMiBzdHViIHRvd3VwcGVyCiA5MzMgc3R1YiB2c3ByaW50ZgotOTM0IHN0dWIgd2NzY2F0Ci05MzUgc3R1YiB3Y3NjaHIKKzkzNCBzdGRjYWxsIHdjc2NhdChwdHIgcHRyKSBsc3RyY2F0MzJXCis5MzUgc3RkY2FsbCB3Y3NjaHIocHRyIGxvbmcpIENSVERMTF93Y3NjaHIKIDkzNiBzdHViIHdjc2NtcAotOTM3IHN0dWIgd2NzY3B5Cis5Mzcgc3RkY2FsbCB3Y3NjcHkocHRyIHB0cikgbHN0cmNweTMyVwogOTM4IHN0dWIgd2NzY3NwbgotOTM5IHN0dWIgd2NzbGVuCis5Mzkgc3RkY2FsbCB3Y3NsZW4ocHRyKSBsc3RybGVuMzJXCiA5NDAgc3R1YiB3Y3NuY2F0CiA5NDEgc3R1YiB3Y3NuY21wCi05NDIgc3R1YiB3Y3NuY3B5Cis5NDIgc3RkY2FsbCB3Y3NuY3B5KHB0ciBwdHIgbG9uZykgbHN0cmNweW4zMlcKIDk0MyBzdHViIHdjc3BicmsKLTk0NCBzdHViIHdjc3JjaHIKKzk0NCBzdGRjYWxsIHdjc3JjaHIocHRyIGxvbmcpIENSVERMTF93Y3NyY2hyCiA5NDUgc3R1YiB3Y3NzcG4KLTk0NiBzdHViIHdjc3N0cgorOTQ2IHN0ZGNhbGwgd2Nzc3RyKHB0ciBwdHIpIENSVERMTF93Y3NzdHIKIDk0NyBzdHViIHdjc3RvawogOTQ4IHN0dWIgd2NzdG9sCi05NDkgc3R1YiB3Y3N0b21icworOTQ5IHN0ZGNhbGwgd2NzdG9tYnMocHRyIHB0cikgbHN0cmNweVd0b0EKIDk1MCBzdHViIHdjc3RvdWwKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheS5jIGIvaWYxNjMyL3JlbGF5LmMKaW5kZXggNzEyMDQ2ZS4uOGRlODQ5NSAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5LmMKKysrIGIvaWYxNjMyL3JlbGF5LmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogICAgIHByaW50ZiggIikgcmV0PSUwOHhcbiIsIHN0YWNrWzFdICk7CiAgICAgaWYgKG5iX2FyZ3MgPT0gLTEpICAvKiBSZWdpc3RlciBmdW5jdGlvbiAqLwogICAgIHsKLSAgICAgICAgQ09OVEVYVCAqY29udGV4dCA9IChDT05URVhUICopKChCWVRFICopc3RhY2sgLSBzaXplb2YoQ09OVEVYVCkgLSAxMik7CisgICAgICAgIENPTlRFWFQgKmNvbnRleHQgPSAoQ09OVEVYVCAqKSgoQllURSAqKXN0YWNrIC0gc2l6ZW9mKENPTlRFWFQpIC0gOCk7CiAgICAgICAgIHByaW50ZiggIiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHggRVNJPSUwOGx4IEVEST0lMDhseFxuIiwKICAgICAgICAgICAgICAgICBjb250ZXh0LT5FYXgsIGNvbnRleHQtPkVieCwgY29udGV4dC0+RWN4LCBjb250ZXh0LT5FZHgsCiAgICAgICAgICAgICAgICAgY29udGV4dC0+RXNpLCBjb250ZXh0LT5FZGkgKTsKQEAgLTI2Myw3ICsyNjMsNyBAQAogICAgICAgICAgICAgQlVJTFRJTl9HZXRFbnRyeVBvaW50MzIoICh2b2lkICopc3RhY2tbLTJdICksIHJldF92YWwsIHN0YWNrWzFdICk7CiAgICAgaWYgKG5iX2FyZ3MgPT0gLTEpICAvKiBSZWdpc3RlciBmdW5jdGlvbiAqLwogICAgIHsKLSAgICAgICAgQ09OVEVYVCAqY29udGV4dCA9IChDT05URVhUICopKChCWVRFICopc3RhY2sgLSBzaXplb2YoQ09OVEVYVCkgLSAxMik7CisgICAgICAgIENPTlRFWFQgKmNvbnRleHQgPSAoQ09OVEVYVCAqKSgoQllURSAqKXN0YWNrIC0gc2l6ZW9mKENPTlRFWFQpIC0gOCk7CiAgICAgICAgIHByaW50ZiggIiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHggRVNJPSUwOGx4IEVEST0lMDhseFxuIiwKICAgICAgICAgICAgICAgICBjb250ZXh0LT5FYXgsIGNvbnRleHQtPkVieCwgY29udGV4dC0+RWN4LCBjb250ZXh0LT5FZHgsCiAgICAgICAgICAgICAgICAgY29udGV4dC0+RXNpLCBjb250ZXh0LT5FZGkgKTsKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyLnNwZWMgYi9pZjE2MzIvdXNlci5zcGVjCmluZGV4IGM4Nzg3MjQuLmRhYTI0YzIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtMzAsMTEgKzMwLDExIEBACiAyOCAgcGFzY2FsMTYgQ2xpZW50VG9TY3JlZW4od29yZCBwdHIpIENsaWVudFRvU2NyZWVuMTYKIDI5ICBwYXNjYWwxNiBTY3JlZW5Ub0NsaWVudCh3b3JkIHB0cikgU2NyZWVuVG9DbGllbnQxNgogMzAgIHBhc2NhbDE2IFdpbmRvd0Zyb21Qb2ludChsb25nKSBXaW5kb3dGcm9tUG9pbnQxNgotMzEgIHBhc2NhbDE2IElzSWNvbmljKHdvcmQpIElzSWNvbmljCiszMSAgcGFzY2FsMTYgSXNJY29uaWMod29yZCkgSXNJY29uaWMxNgogMzIgIHBhc2NhbDE2IEdldFdpbmRvd1JlY3Qod29yZCBwdHIpIEdldFdpbmRvd1JlY3QxNgogMzMgIHBhc2NhbDE2IEdldENsaWVudFJlY3Qod29yZCBwdHIpIEdldENsaWVudFJlY3QxNgotMzQgIHBhc2NhbDE2IEVuYWJsZVdpbmRvdyh3b3JkIHdvcmQpIEVuYWJsZVdpbmRvdwotMzUgIHBhc2NhbDE2IElzV2luZG93RW5hYmxlZCh3b3JkKSBJc1dpbmRvd0VuYWJsZWQKKzM0ICBwYXNjYWwxNiBFbmFibGVXaW5kb3cod29yZCB3b3JkKSBFbmFibGVXaW5kb3cxNgorMzUgIHBhc2NhbDE2IElzV2luZG93RW5hYmxlZCh3b3JkKSBJc1dpbmRvd0VuYWJsZWQxNgogMzYgIHBhc2NhbDE2IEdldFdpbmRvd1RleHQod29yZCBzZWdwdHIgd29yZCkgR2V0V2luZG93VGV4dDE2CiAzNyAgcGFzY2FsMTYgU2V0V2luZG93VGV4dCh3b3JkIHNlZ3B0cikgU2V0V2luZG93VGV4dDE2CiAzOCAgcGFzY2FsMTYgR2V0V2luZG93VGV4dExlbmd0aCh3b3JkKSBHZXRXaW5kb3dUZXh0TGVuZ3RoMTYKQEAgLTQyLDI1ICs0MiwyNSBAQAogNDAgIHBhc2NhbDE2IEVuZFBhaW50KHdvcmQgcHRyKSBFbmRQYWludDE2CiA0MSAgcGFzY2FsMTYgQ3JlYXRlV2luZG93KHB0ciBwdHIgbG9uZyBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQKIAkgICAgICAgICAgICAgICAgICB3b3JkIHdvcmQgd29yZCBzZWdwdHIpIENyZWF0ZVdpbmRvdzE2Ci00MiAgcGFzY2FsMTYgU2hvd1dpbmRvdyh3b3JkIHdvcmQpIFNob3dXaW5kb3cKKzQyICBwYXNjYWwxNiBTaG93V2luZG93KHdvcmQgd29yZCkgU2hvd1dpbmRvdzE2CiA0MyAgcGFzY2FsMTYgQ2xvc2VXaW5kb3cod29yZCkgQ2xvc2VXaW5kb3cKIDQ0ICBwYXNjYWwxNiBPcGVuSWNvbih3b3JkKSBPcGVuSWNvbgotNDUgIHBhc2NhbDE2IEJyaW5nV2luZG93VG9Ub3Aod29yZCkgQnJpbmdXaW5kb3dUb1RvcAorNDUgIHBhc2NhbDE2IEJyaW5nV2luZG93VG9Ub3Aod29yZCkgQnJpbmdXaW5kb3dUb1RvcDE2CiA0NiAgcGFzY2FsMTYgR2V0UGFyZW50KHdvcmQpIEdldFBhcmVudDE2CiA0NyAgcGFzY2FsMTYgSXNXaW5kb3cod29yZCkgSXNXaW5kb3cKLTQ4ICBwYXNjYWwxNiBJc0NoaWxkKHdvcmQgd29yZCkgSXNDaGlsZAotNDkgIHBhc2NhbDE2IElzV2luZG93VmlzaWJsZSh3b3JkKSBJc1dpbmRvd1Zpc2libGUKKzQ4ICBwYXNjYWwxNiBJc0NoaWxkKHdvcmQgd29yZCkgSXNDaGlsZDE2Cis0OSAgcGFzY2FsMTYgSXNXaW5kb3dWaXNpYmxlKHdvcmQpIElzV2luZG93VmlzaWJsZTE2CiA1MCAgcGFzY2FsMTYgRmluZFdpbmRvdyhzZWdwdHIgcHRyKSBGaW5kV2luZG93MTYKICM1MSBCRUFSNTEKIDUyICBwYXNjYWwxNiBBbnlQb3B1cCgpIEFueVBvcHVwCi01MyAgcGFzY2FsMTYgRGVzdHJveVdpbmRvdyh3b3JkKSBEZXN0cm95V2luZG93Cis1MyAgcGFzY2FsMTYgRGVzdHJveVdpbmRvdyh3b3JkKSBEZXN0cm95V2luZG93MTYKIDU0ICBwYXNjYWwxNiBFbnVtV2luZG93cyhzZWdwdHIgbG9uZykgVEhVTktfRW51bVdpbmRvd3MxNgogNTUgIHBhc2NhbDE2IEVudW1DaGlsZFdpbmRvd3Mod29yZCBzZWdwdHIgbG9uZykgVEhVTktfRW51bUNoaWxkV2luZG93czE2Ci01NiAgcGFzY2FsMTYgTW92ZVdpbmRvdyh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgTW92ZVdpbmRvdworNTYgIHBhc2NhbDE2IE1vdmVXaW5kb3cod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIE1vdmVXaW5kb3cxNgogNTcgIHBhc2NhbDE2IFJlZ2lzdGVyQ2xhc3MocHRyKSBSZWdpc3RlckNsYXNzMTYKIDU4ICBwYXNjYWwxNiBHZXRDbGFzc05hbWUod29yZCBwdHIgd29yZCkgR2V0Q2xhc3NOYW1lMTYKLTU5ICBwYXNjYWwxNiBTZXRBY3RpdmVXaW5kb3cod29yZCkgU2V0QWN0aXZlV2luZG93Ci02MCAgcGFzY2FsMTYgR2V0QWN0aXZlV2luZG93KCkgR2V0QWN0aXZlV2luZG93Cis1OSAgcGFzY2FsMTYgU2V0QWN0aXZlV2luZG93KHdvcmQpIFNldEFjdGl2ZVdpbmRvdzE2Cis2MCAgcGFzY2FsMTYgR2V0QWN0aXZlV2luZG93KCkgR2V0QWN0aXZlV2luZG93MTYKIDYxICBwYXNjYWwxNiBTY3JvbGxXaW5kb3cod29yZCBzX3dvcmQgc193b3JkIHB0ciBwdHIpIFNjcm9sbFdpbmRvdzE2CiA2MiAgcGFzY2FsMTYgU2V0U2Nyb2xsUG9zKHdvcmQgd29yZCBzX3dvcmQgd29yZCkgU2V0U2Nyb2xsUG9zMTYKIDYzICBwYXNjYWwxNiBHZXRTY3JvbGxQb3Mod29yZCB3b3JkKSBHZXRTY3JvbGxQb3MxNgpAQCAtOTAsMTQgKzkwLDE0IEBACiA4OCAgcGFzY2FsMTYgRW5kRGlhbG9nKHdvcmQgc193b3JkKSBFbmREaWFsb2cKIDg5ICBwYXNjYWwxNiBDcmVhdGVEaWFsb2cod29yZCBzZWdwdHIgd29yZCBzZWdwdHIpIENyZWF0ZURpYWxvZzE2CiA5MCAgcGFzY2FsMTYgSXNEaWFsb2dNZXNzYWdlKHdvcmQgcHRyKSBJc0RpYWxvZ01lc3NhZ2UKLTkxICBwYXNjYWwxNiBHZXREbGdJdGVtKHdvcmQgd29yZCkgR2V0RGxnSXRlbQorOTEgIHBhc2NhbDE2IEdldERsZ0l0ZW0od29yZCB3b3JkKSBHZXREbGdJdGVtMTYKIDkyICBwYXNjYWwxNiBTZXREbGdJdGVtVGV4dCh3b3JkIHdvcmQgc2VncHRyKSBTZXREbGdJdGVtVGV4dDE2CiA5MyAgcGFzY2FsMTYgR2V0RGxnSXRlbVRleHQod29yZCB3b3JkIHNlZ3B0ciB3b3JkKSBHZXREbGdJdGVtVGV4dDE2CiA5NCAgcGFzY2FsMTYgU2V0RGxnSXRlbUludCh3b3JkIHdvcmQgd29yZCB3b3JkKSBTZXREbGdJdGVtSW50MTYKLTk1ICBwYXNjYWwxNiBHZXREbGdJdGVtSW50KHdvcmQgd29yZCBwdHIgd29yZCkgR2V0RGxnSXRlbUludAotOTYgIHBhc2NhbDE2IENoZWNrUmFkaW9CdXR0b24od29yZCB3b3JkIHdvcmQgd29yZCkgQ2hlY2tSYWRpb0J1dHRvbgotOTcgIHBhc2NhbDE2IENoZWNrRGxnQnV0dG9uKHdvcmQgd29yZCB3b3JkKSBDaGVja0RsZ0J1dHRvbgotOTggIHBhc2NhbDE2IElzRGxnQnV0dG9uQ2hlY2tlZCh3b3JkIHdvcmQpIElzRGxnQnV0dG9uQ2hlY2tlZAorOTUgIHBhc2NhbDE2IEdldERsZ0l0ZW1JbnQod29yZCBzX3dvcmQgcHRyIHdvcmQpIEdldERsZ0l0ZW1JbnQxNgorOTYgIHBhc2NhbDE2IENoZWNrUmFkaW9CdXR0b24od29yZCB3b3JkIHdvcmQgd29yZCkgQ2hlY2tSYWRpb0J1dHRvbjE2Cis5NyAgcGFzY2FsMTYgQ2hlY2tEbGdCdXR0b24od29yZCB3b3JkIHdvcmQpIENoZWNrRGxnQnV0dG9uMTYKKzk4ICBwYXNjYWwxNiBJc0RsZ0J1dHRvbkNoZWNrZWQod29yZCB3b3JkKSBJc0RsZ0J1dHRvbkNoZWNrZWQxNgogOTkgIHBhc2NhbDE2IERsZ0RpclNlbGVjdCh3b3JkIHB0ciB3b3JkKSBEbGdEaXJTZWxlY3QKIDEwMCBwYXNjYWwxNiBEbGdEaXJMaXN0KHdvcmQgcHRyIHdvcmQgd29yZCB3b3JkKSBEbGdEaXJMaXN0MTYKIDEwMSBwYXNjYWwgICBTZW5kRGxnSXRlbU1lc3NhZ2Uod29yZCB3b3JkIHdvcmQgd29yZCBsb25nKSBTZW5kRGxnSXRlbU1lc3NhZ2UxNgpAQCAtMTY5LDcgKzE2OSw3IEBACiAxNjcgcGFzY2FsMTYgU2hvd0NhcmV0KHdvcmQpIFNob3dDYXJldAogMTY4IHBhc2NhbDE2IFNldENhcmV0QmxpbmtUaW1lKHdvcmQpIFNldENhcmV0QmxpbmtUaW1lCiAxNjkgcGFzY2FsMTYgR2V0Q2FyZXRCbGlua1RpbWUoKSBHZXRDYXJldEJsaW5rVGltZTE2Ci0xNzAgcGFzY2FsMTYgQXJyYW5nZUljb25pY1dpbmRvd3Mod29yZCkgQXJyYW5nZUljb25pY1dpbmRvd3MKKzE3MCBwYXNjYWwxNiBBcnJhbmdlSWNvbmljV2luZG93cyh3b3JkKSBBcnJhbmdlSWNvbmljV2luZG93czE2CiAxNzEgcGFzY2FsMTYgV2luSGVscCh3b3JkIHB0ciB3b3JkIGxvbmcpIFdpbkhlbHAxNgogMTcyIHN0dWIgU3dpdGNoVG9UaGlzV2luZG93CiAxNzMgcGFzY2FsMTYgTG9hZEN1cnNvcih3b3JkIHNlZ3B0cikgTG9hZEN1cnNvcjE2CkBAIC0yMjksMTAgKzIyOSwxMCBAQAogMjI2IHN0dWIgTG9ja0lucHV0CiAyMjcgcGFzY2FsMTYgR2V0TmV4dERsZ0dyb3VwSXRlbSh3b3JkIHdvcmQgd29yZCkgR2V0TmV4dERsZ0dyb3VwSXRlbTE2CiAyMjggcGFzY2FsMTYgR2V0TmV4dERsZ1RhYkl0ZW0od29yZCB3b3JkIHdvcmQpIEdldE5leHREbGdUYWJJdGVtMTYKLTIyOSBwYXNjYWwxNiBHZXRUb3BXaW5kb3cod29yZCkgR2V0VG9wV2luZG93Ci0yMzAgcGFzY2FsMTYgR2V0TmV4dFdpbmRvdyh3b3JkIHdvcmQpIEdldE5leHRXaW5kb3cKKzIyOSBwYXNjYWwxNiBHZXRUb3BXaW5kb3cod29yZCkgR2V0VG9wV2luZG93MTYKKzIzMCBwYXNjYWwxNiBHZXROZXh0V2luZG93KHdvcmQgd29yZCkgR2V0TmV4dFdpbmRvdzE2CiAyMzEgc3R1YiBHZXRTeXN0ZW1EZWJ1Z1N0YXRlCi0yMzIgcGFzY2FsMTYgU2V0V2luZG93UG9zKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIFNldFdpbmRvd1BvcworMjMyIHBhc2NhbDE2IFNldFdpbmRvd1Bvcyh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkKSBTZXRXaW5kb3dQb3MxNgogMjMzIHBhc2NhbDE2IFNldFBhcmVudCh3b3JkIHdvcmQpIFNldFBhcmVudAogMjM0IHBhc2NhbDE2IFVuaG9va1dpbmRvd3NIb29rKHNfd29yZCBzZWdwdHIpIFRIVU5LX1VuaG9va1dpbmRvd3NIb29rMTYKIDIzNSBwYXNjYWwgICBEZWZIb29rUHJvYyhzX3dvcmQgd29yZCBsb25nIHB0cikgRGVmSG9va1Byb2MxNgpAQCAtMjYxLDExICsyNjEsMTEgQEAKIDI1NiBwYXNjYWwxNiBHZXREcml2ZXJJbmZvKHdvcmQgcHRyKSBHZXREcml2ZXJJbmZvCiAyNTcgcGFzY2FsMTYgR2V0TmV4dERyaXZlcih3b3JkIGxvbmcpIEdldE5leHREcml2ZXIKIDI1OCBwYXNjYWwxNiBNYXBXaW5kb3dQb2ludHMod29yZCB3b3JkIHB0ciB3b3JkKSBNYXBXaW5kb3dQb2ludHMxNgotMjU5IHBhc2NhbDE2IEJlZ2luRGVmZXJXaW5kb3dQb3Moc193b3JkKSBCZWdpbkRlZmVyV2luZG93UG9zCisyNTkgcGFzY2FsMTYgQmVnaW5EZWZlcldpbmRvd1BvcyhzX3dvcmQpIEJlZ2luRGVmZXJXaW5kb3dQb3MxNgogMjYwIHBhc2NhbDE2IERlZmVyV2luZG93UG9zKHdvcmQgd29yZCB3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCB3b3JkKQotICAgICAgICAgICAgIERlZmVyV2luZG93UG9zCi0yNjEgcGFzY2FsMTYgRW5kRGVmZXJXaW5kb3dQb3Mod29yZCkgRW5kRGVmZXJXaW5kb3dQb3MKLTI2MiBwYXNjYWwxNiBHZXRXaW5kb3cod29yZCB3b3JkKSBHZXRXaW5kb3cKKyAgICAgICAgICAgICBEZWZlcldpbmRvd1BvczE2CisyNjEgcGFzY2FsMTYgRW5kRGVmZXJXaW5kb3dQb3Mod29yZCkgRW5kRGVmZXJXaW5kb3dQb3MxNgorMjYyIHBhc2NhbDE2IEdldFdpbmRvdyh3b3JkIHdvcmQpIEdldFdpbmRvdzE2CiAyNjMgcGFzY2FsMTYgR2V0TWVudUl0ZW1Db3VudCh3b3JkKSBHZXRNZW51SXRlbUNvdW50MTYKIDI2NCBwYXNjYWwxNiBHZXRNZW51SXRlbUlEKHdvcmQgd29yZCkgR2V0TWVudUl0ZW1JRDE2CiAyNjUgcGFzY2FsMTYgU2hvd093bmVkUG9wdXBzKHdvcmQgd29yZCkgU2hvd093bmVkUG9wdXBzCkBAIC0yNzUsMTIgKzI3NSwxMiBAQAogMjY5IHBhc2NhbDE2IEdsb2JhbERlbGV0ZUF0b20od29yZCkgR2xvYmFsRGVsZXRlQXRvbQogMjcwIHBhc2NhbDE2IEdsb2JhbEZpbmRBdG9tKHNlZ3B0cikgR2xvYmFsRmluZEF0b20xNgogMjcxIHBhc2NhbDE2IEdsb2JhbEdldEF0b21OYW1lKHdvcmQgcHRyIHNfd29yZCkgR2xvYmFsR2V0QXRvbU5hbWUxNgotMjcyIHBhc2NhbDE2IElzWm9vbWVkKHdvcmQpIElzWm9vbWVkCisyNzIgcGFzY2FsMTYgSXNab29tZWQod29yZCkgSXNab29tZWQxNgogMjczIHN0dWIgQ29udHJvbFBhbmVsSW5mbwogMjc0IHN0dWIgR2V0TmV4dFF1ZXVlV2luZG93CiAyNzUgc3R1YiBSZXBhaW50U2NyZWVuCiAyNzYgc3R1YiBMb2NrTXlUYXNrCi0yNzcgcGFzY2FsMTYgR2V0RGxnQ3RybElEKHdvcmQpIEdldERsZ0N0cmxJRAorMjc3IHBhc2NhbDE2IEdldERsZ0N0cmxJRCh3b3JkKSBHZXREbGdDdHJsSUQxNgogMjc4IHBhc2NhbDE2IEdldERlc2t0b3BId25kKCkgR2V0RGVza3RvcEh3bmQKIDI3OSBzdHViIE9sZFNldERlc2tQYXR0ZXJuCiAyODAgcGFzY2FsMTYgU2V0U3lzdGVtTWVudSh3b3JkIHdvcmQpIFNldFN5c3RlbU1lbnUxNgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIzMi5zcGVjIGIvaWYxNjMyL3VzZXIzMi5zcGVjCmluZGV4IDQxYmM1MjIuLjdjNTEwMTIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyMzIuc3BlYworKysgYi9pZjE2MzIvdXNlcjMyLnNwZWMKQEAgLTgsMTEgKzgsMTEgQEAKIDAwMDMgc3R1YiBBbnlQb3B1cAogMDAwNCBzdGRjYWxsIEFwcGVuZE1lbnVBKGxvbmcgbG9uZyBsb25nIHB0cikgQXBwZW5kTWVudTMyQQogMDAwNSBzdGRjYWxsIEFwcGVuZE1lbnVXKGxvbmcgbG9uZyBsb25nIHB0cikgQXBwZW5kTWVudTMyVwotMDAwNiBzdHViIEFycmFuZ2VJY29uaWNXaW5kb3dzCiswMDA2IHN0ZGNhbGwgQXJyYW5nZUljb25pY1dpbmRvd3MobG9uZykgQXJyYW5nZUljb25pY1dpbmRvd3MzMgogMDAwNyBzdHViIEF0dGFjaFRocmVhZElucHV0Ci0wMDA4IHN0ZGNhbGwgQmVnaW5EZWZlcldpbmRvd1Bvcyhsb25nKSBCZWdpbkRlZmVyV2luZG93UG9zCiswMDA4IHN0ZGNhbGwgQmVnaW5EZWZlcldpbmRvd1Bvcyhsb25nKSBCZWdpbkRlZmVyV2luZG93UG9zMzIKIDAwMDkgc3RkY2FsbCBCZWdpblBhaW50KGxvbmcgcHRyKSBCZWdpblBhaW50MzIKLTAwMTAgc3RkY2FsbCBCcmluZ1dpbmRvd1RvVG9wKGxvbmcpIEJyaW5nV2luZG93VG9Ub3AKKzAwMTAgc3RkY2FsbCBCcmluZ1dpbmRvd1RvVG9wKGxvbmcpIEJyaW5nV2luZG93VG9Ub3AzMgogMDAxMSBzdHViIEJyb2FkY2FzdFN5c3RlbU1lc3NhZ2UKIDAwMTIgc3R1YiBDYWxjQ2hpbGRTY3JvbGwKIDAwMTMgc3R1YiBDYWxsTXNnRmlsdGVyCkBAIC00NiwxMCArNDYsMTAgQEAKIDAwNDEgc3RkY2FsbCBDaGFyVXBwZXJCdWZmQShwdHIgbG9uZykgQ2hhclVwcGVyQnVmZjMyQQogMDA0MiBzdGRjYWxsIENoYXJVcHBlckJ1ZmZXKHB0ciBsb25nKSBDaGFyVXBwZXJCdWZmMzJXCiAwMDQzIHN0ZGNhbGwgQ2hhclVwcGVyVyhwdHIpIENoYXJVcHBlcjMyVwotMDA0NCBzdGRjYWxsIENoZWNrRGxnQnV0dG9uKGxvbmcgbG9uZyBsb25nKSBDaGVja0RsZ0J1dHRvbgorMDA0NCBzdGRjYWxsIENoZWNrRGxnQnV0dG9uKGxvbmcgbG9uZyBsb25nKSBDaGVja0RsZ0J1dHRvbjMyCiAwMDQ1IHN0ZGNhbGwgQ2hlY2tNZW51SXRlbShsb25nIGxvbmcgbG9uZykgQ2hlY2tNZW51SXRlbTMyCiAwMDQ2IHN0dWIgQ2hlY2tNZW51UmFkaW9JdGVtCi0wMDQ3IHN0ZGNhbGwgQ2hlY2tSYWRpb0J1dHRvbihsb25nIGxvbmcgbG9uZyBsb25nKSBDaGVja1JhZGlvQnV0dG9uCiswMDQ3IHN0ZGNhbGwgQ2hlY2tSYWRpb0J1dHRvbihsb25nIGxvbmcgbG9uZyBsb25nKSBDaGVja1JhZGlvQnV0dG9uMzIKIDAwNDggc3RkY2FsbCBDaGlsZFdpbmRvd0Zyb21Qb2ludChsb25nIGxvbmcgbG9uZykgQ2hpbGRXaW5kb3dGcm9tUG9pbnQzMgogMDA0OSBzdHViIENoaWxkV2luZG93RnJvbVBvaW50RXgKIDAwNTAgc3R1YiBDbGllbnRUaHJlYWRDb25uZWN0CkBAIC0xMDYsNyArMTA2LDcgQEAKIDAwOTkgc3R1YiBEZGVGcmVlRGF0YUhhbmRsZQogMDEwMCBzdHViIERkZUZyZWVTdHJpbmdIYW5kbGUKIDAxMDEgc3R1YiBEZGVHZXREYXRhCi0wMTAyIHN0dWIgRGRlR2V0TGFzdEVycm9yCiswMTAyIHJldHVybiBEZGVHZXRMYXN0RXJyb3IgNCAwCiAwMTAzIHN0dWIgRGRlR2V0UXVhbGl0eU9mU2VydmljZQogMDEwNCBzdHViIERkZUltcGVyc29uYXRlQ2xpZW50CiAwMTA1IHJldHVybiBEZGVJbml0aWFsaXplQSAxNiAwCkBAIC0xMzEsMTQgKzEzMSwxNCBAQAogMDEyNCBzdGRjYWxsIERlZk1ESUNoaWxkUHJvY1cobG9uZyBsb25nIGxvbmcgbG9uZykgRGVmTURJQ2hpbGRQcm9jMzJXCiAwMTI1IHN0ZGNhbGwgRGVmV2luZG93UHJvY0EobG9uZyBsb25nIGxvbmcgbG9uZykgRGVmV2luZG93UHJvYzMyQQogMDEyNiBzdGRjYWxsIERlZldpbmRvd1Byb2NXKGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZldpbmRvd1Byb2MzMlcKLTAxMjcgc3RkY2FsbCBEZWZlcldpbmRvd1Bvcyhsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZmVyV2luZG93UG9zCiswMTI3IHN0ZGNhbGwgRGVmZXJXaW5kb3dQb3MobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBEZWZlcldpbmRvd1BvczMyCiAwMTI4IHN0ZGNhbGwgRGVsZXRlTWVudShsb25nIGxvbmcgbG9uZykgRGVsZXRlTWVudTMyCiAwMTI5IHN0dWIgRGVzdHJveUFjY2VsZXJhdG9yVGFibGUKIDAxMzAgc3RkY2FsbCBEZXN0cm95Q2FyZXQoKSBEZXN0cm95Q2FyZXQKIDAxMzEgc3R1YiBEZXN0cm95Q3Vyc29yCiAwMTMyIHN0dWIgRGVzdHJveUljb24KIDAxMzMgc3RkY2FsbCBEZXN0cm95TWVudShsb25nKSBEZXN0cm95TWVudTMyCi0wMTM0IHN0ZGNhbGwgRGVzdHJveVdpbmRvdyhsb25nKSBEZXN0cm95V2luZG93CiswMTM0IHN0ZGNhbGwgRGVzdHJveVdpbmRvdyhsb25nKSBEZXN0cm95V2luZG93MzIKIDAxMzUgc3RkY2FsbCBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtQShsb25nIHB0ciBsb25nIHB0ciBsb25nKSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJBCiAwMTM2IHN0dWIgRGlhbG9nQm94SW5kaXJlY3RQYXJhbUFvclcKIDAxMzcgc3RkY2FsbCBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtVyhsb25nIHB0ciBsb25nIHB0ciBsb25nKSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJXCkBAIC0xNzUsOCArMTc1LDggQEAKIDAxNjggc3RkY2FsbCBFbXB0eUNsaXBib2FyZCgpIEVtcHR5Q2xpcGJvYXJkCiAwMTY5IHN0ZGNhbGwgRW5hYmxlTWVudUl0ZW0obG9uZyBsb25nIGxvbmcpIEVuYWJsZU1lbnVJdGVtMzIKIDAxNzAgc3RkY2FsbCBFbmFibGVTY3JvbGxCYXIobG9uZyBsb25nIGxvbmcpIEVuYWJsZVNjcm9sbEJhcjMyCi0wMTcxIHN0ZGNhbGwgRW5hYmxlV2luZG93KGxvbmcgbG9uZykgRW5hYmxlV2luZG93Ci0wMTcyIHN0ZGNhbGwgRW5kRGVmZXJXaW5kb3dQb3MobG9uZykgRW5kRGVmZXJXaW5kb3dQb3MKKzAxNzEgc3RkY2FsbCBFbmFibGVXaW5kb3cobG9uZyBsb25nKSBFbmFibGVXaW5kb3czMgorMDE3MiBzdGRjYWxsIEVuZERlZmVyV2luZG93UG9zKGxvbmcpIEVuZERlZmVyV2luZG93UG9zMzIKIDAxNzMgc3RkY2FsbCBFbmREaWFsb2cobG9uZyBsb25nKSBFbmREaWFsb2cKIDAxNzQgc3RkY2FsbCBFbmRNZW51KCkgRW5kTWVudQogMDE3NSBzdGRjYWxsIEVuZFBhaW50KGxvbmcgcHRyKSBFbmRQYWludDMyCkBAIC0yMDgsNyArMjA4LDcgQEAKIDAyMDEgc3RkY2FsbCBGbGFzaFdpbmRvdyhsb25nIGxvbmcpIEZsYXNoV2luZG93CiAwMjAyIHN0ZGNhbGwgRnJhbWVSZWN0KGxvbmcgcHRyIGxvbmcpIEZyYW1lUmVjdDMyCiAwMjAzIHN0dWIgRnJlZURERWxQYXJhbQotMDIwNCBzdGRjYWxsIEdldEFjdGl2ZVdpbmRvdygpIEdldEFjdGl2ZVdpbmRvdworMDIwNCBzdGRjYWxsIEdldEFjdGl2ZVdpbmRvdygpIEdldEFjdGl2ZVdpbmRvdzMyCiAwMjA1IHN0ZGNhbGwgR2V0QXBwQ29tcGF0RmxhZ3MobG9uZykgR2V0QXBwQ29tcGF0RmxhZ3MKIDAyMDYgc3RkY2FsbCBHZXRBc3luY0tleVN0YXRlKGxvbmcpIEdldEFzeW5jS2V5U3RhdGUKIDAyMDcgc3RkY2FsbCBHZXRDYXB0dXJlKCkgR2V0Q2FwdHVyZTMyCkBAIC0yMzcsOSArMjM3LDkgQEAKIDAyMzAgc3RkY2FsbCBHZXREQ0V4KGxvbmcgbG9uZyBsb25nKSBHZXREQ0V4MzIKIDAyMzEgc3RkY2FsbCBHZXREZXNrdG9wV2luZG93KCkgR2V0RGVza3RvcFdpbmRvdzMyCiAwMjMyIHN0ZGNhbGwgR2V0RGlhbG9nQmFzZVVuaXRzKCkgR2V0RGlhbG9nQmFzZVVuaXRzCi0wMjMzIHN0ZGNhbGwgR2V0RGxnQ3RybElEKGxvbmcpIEdldERsZ0N0cmxJRAotMDIzNCBzdGRjYWxsIEdldERsZ0l0ZW0obG9uZyBsb25nKSBHZXREbGdJdGVtCi0wMjM1IHN0ZGNhbGwgR2V0RGxnSXRlbUludChsb25nIGxvbmcgbG9uZyBsb25nKSBHZXREbGdJdGVtSW50CiswMjMzIHN0ZGNhbGwgR2V0RGxnQ3RybElEKGxvbmcpIEdldERsZ0N0cmxJRDMyCiswMjM0IHN0ZGNhbGwgR2V0RGxnSXRlbShsb25nIGxvbmcpIEdldERsZ0l0ZW0zMgorMDIzNSBzdGRjYWxsIEdldERsZ0l0ZW1JbnQobG9uZyBsb25nIHB0ciBsb25nKSBHZXREbGdJdGVtSW50MzIKIDAyMzYgc3RkY2FsbCBHZXREbGdJdGVtVGV4dEEobG9uZyBsb25nIHB0ciBsb25nKSBHZXREbGdJdGVtVGV4dDMyQQogMDIzNyBzdGRjYWxsIEdldERsZ0l0ZW1UZXh0Vyhsb25nIGxvbmcgcHRyIGxvbmcpIEdldERsZ0l0ZW1UZXh0MzJXCiAwMjM4IHN0dWIgR2V0RG91YmxlQ2xpY2tUaW1lCkBAIC0yNTksNyArMjU5LDcgQEAKIDAyNTIgc3R1YiBHZXRLZXlib2FyZExheW91dE5hbWVXCiAwMjUzIHN0dWIgR2V0S2V5Ym9hcmRTdGF0ZQogMDI1NCBzdHViIEdldEtleWJvYXJkVHlwZQotMDI1NSBzdHViIEdldExhc3RBY3RpdmVQb3B1cAorMDI1NSBzdGRjYWxsIEdldExhc3RBY3RpdmVQb3B1cChsb25nKSBHZXRMYXN0QWN0aXZlUG9wdXAKIDAyNTYgc3RkY2FsbCBHZXRNZW51KGxvbmcpIEdldE1lbnUzMgogMDI1NyBzdGRjYWxsIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zKCkgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMKIDAyNTggc3R1YiBHZXRNZW51Q29udGV4dEhlbHBJZApAQCAtMjk5LDEzICsyOTksMTMgQEAKIDAyOTIgc3RkY2FsbCBHZXRUYWJiZWRUZXh0RXh0ZW50QShsb25nIHB0ciBsb25nIGxvbmcgcHRyKSBHZXRUYWJiZWRUZXh0RXh0ZW50CiAwMjkzIHN0dWIgR2V0VGFiYmVkVGV4dEV4dGVudFcKIDAyOTQgc3R1YiBHZXRUaHJlYWREZXNrdG9wCi0wMjk1IHN0dWIgR2V0VG9wV2luZG93CiswMjk1IHN0ZGNhbGwgR2V0VG9wV2luZG93KGxvbmcpIEdldFRvcFdpbmRvdzMyCiAwMjk2IHN0ZGNhbGwgR2V0VXBkYXRlUmVjdChsb25nIHB0ciBsb25nKSBHZXRVcGRhdGVSZWN0MzIKIDAyOTcgc3RkY2FsbCBHZXRVcGRhdGVSZ24obG9uZyBsb25nIGxvbmcpIEdldFVwZGF0ZVJnbgogMDI5OCBzdHViIEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEKIDAyOTkgc3R1YiBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25XCiAwMzAwIHN0dWIgR2V0VXNlck9iamVjdFNlY3VyaXR5Ci0wMzAxIHN0ZGNhbGwgR2V0V2luZG93KGxvbmcgbG9uZykgR2V0V2luZG93CiswMzAxIHN0ZGNhbGwgR2V0V2luZG93KGxvbmcgbG9uZykgR2V0V2luZG93MzIKIDAzMDIgc3R1YiBHZXRXaW5kb3dDb250ZXh0SGVscElkCiAwMzAzIHN0ZGNhbGwgR2V0V2luZG93REMobG9uZykgR2V0V2luZG93REMzMgogMDMwNCBzdGRjYWxsIEdldFdpbmRvd0xvbmdBKGxvbmcgbG9uZykgR2V0V2luZG93TG9uZzMyQQpAQCAtMzQyLDIwICszNDIsMjAgQEAKIDAzMzUgc3RkY2FsbCBJc0NoYXJMb3dlclcobG9uZykgSXNDaGFyTG93ZXIzMlcKIDAzMzYgc3RkY2FsbCBJc0NoYXJVcHBlckEobG9uZykgSXNDaGFyVXBwZXIzMkEKIDAzMzcgc3RkY2FsbCBJc0NoYXJVcHBlclcobG9uZykgSXNDaGFyVXBwZXIzMlcKLTAzMzggc3R1YiBJc0NoaWxkCiswMzM4IHN0ZGNhbGwgSXNDaGlsZChsb25nIGxvbmcpIElzQ2hpbGQzMgogMDMzOSBzdGRjYWxsIElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKGxvbmcpIElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlCiAwMzQwIHN0dWIgSXNEaWFsb2dNZXNzYWdlCiAwMzQxIHN0ZGNhbGwgSXNEaWFsb2dNZXNzYWdlQShsb25nIHB0cikgSXNEaWFsb2dNZXNzYWdlMzJBCiAwMzQyIHN0dWIgSXNEaWFsb2dNZXNzYWdlVwotMDM0MyBzdGRjYWxsIElzRGxnQnV0dG9uQ2hlY2tlZChsb25nIGxvbmcpIElzRGxnQnV0dG9uQ2hlY2tlZAotMDM0NCBzdGRjYWxsIElzSWNvbmljKGxvbmcpIElzSWNvbmljCiswMzQzIHN0ZGNhbGwgSXNEbGdCdXR0b25DaGVja2VkKGxvbmcgbG9uZykgSXNEbGdCdXR0b25DaGVja2VkMzIKKzAzNDQgc3RkY2FsbCBJc0ljb25pYyhsb25nKSBJc0ljb25pYzMyCiAwMzQ1IHN0ZGNhbGwgSXNNZW51KGxvbmcpIElzTWVudTMyCiAwMzQ2IHN0ZGNhbGwgSXNSZWN0RW1wdHkocHRyKSBJc1JlY3RFbXB0eTMyCiAwMzQ3IHN0ZGNhbGwgSXNXaW5kb3cobG9uZykgSXNXaW5kb3cKLTAzNDggc3RkY2FsbCBJc1dpbmRvd0VuYWJsZWQobG9uZykgSXNXaW5kb3dFbmFibGVkCiswMzQ4IHN0ZGNhbGwgSXNXaW5kb3dFbmFibGVkKGxvbmcpIElzV2luZG93RW5hYmxlZDMyCiAwMzQ5IHN0ZGNhbGwgSXNXaW5kb3dVbmljb2RlKGxvbmcpIElzV2luZG93VW5pY29kZQotMDM1MCBzdGRjYWxsIElzV2luZG93VmlzaWJsZShsb25nKSBJc1dpbmRvd1Zpc2libGUKLTAzNTEgc3RkY2FsbCBJc1pvb21lZChsb25nKSBJc1pvb21lZAorMDM1MCBzdGRjYWxsIElzV2luZG93VmlzaWJsZShsb25nKSBJc1dpbmRvd1Zpc2libGUzMgorMDM1MSBzdGRjYWxsIElzWm9vbWVkKGxvbmcpIElzWm9vbWVkMzIKIDAzNTIgc3RkY2FsbCBLaWxsU3lzdGVtVGltZXIobG9uZyBsb25nKSBLaWxsU3lzdGVtVGltZXIzMgogMDM1MyBzdGRjYWxsIEtpbGxUaW1lcihsb25nIGxvbmcpIEtpbGxUaW1lcjMyCiAwMzU0IHN0ZGNhbGwgTG9hZEFjY2VsZXJhdG9yc0EobG9uZyBwdHIpIExvYWRBY2NlbGVyYXRvcnMzMkEKQEAgLTQwMiw3ICs0MDIsNyBAQAogMDM5NSBzdGRjYWxsIE1lc3NhZ2VCb3hXKGxvbmcgcHRyIHB0ciBsb25nKSBNZXNzYWdlQm94MzJXCiAwMzk2IHN0ZGNhbGwgTW9kaWZ5TWVudUEobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIpIE1vZGlmeU1lbnUzMkEKIDAzOTcgc3RkY2FsbCBNb2RpZnlNZW51Vyhsb25nIGxvbmcgbG9uZyBsb25nIHB0cikgTW9kaWZ5TWVudTMyVwotMDM5OCBzdGRjYWxsIE1vdmVXaW5kb3cobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1vdmVXaW5kb3cKKzAzOTggc3RkY2FsbCBNb3ZlV2luZG93KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBNb3ZlV2luZG93MzIKIDAzOTkgc3R1YiBNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCiAwNDAwIHN0dWIgT2VtS2V5U2NhbgogMDQwMSBzdGRjYWxsIE9lbVRvQ2hhckEocHRyIHB0cikgT2VtVG9DaGFyMzJBCkBAIC00NjYsNyArNDY2LDcgQEAKIDA0NTkgc3R1YiBTZW5kTm90aWZ5TWVzc2FnZUEKIDA0NjAgc3R1YiBTZW5kTm90aWZ5TWVzc2FnZVcKIDA0NjEgc3R1YiBTZXJ2ZXJTZXRGdW5jdGlvblBvaW50ZXJzCi0wNDYyIHN0ZGNhbGwgU2V0QWN0aXZlV2luZG93KGxvbmcpIFNldEFjdGl2ZVdpbmRvdworMDQ2MiBzdGRjYWxsIFNldEFjdGl2ZVdpbmRvdyhsb25nKSBTZXRBY3RpdmVXaW5kb3czMgogMDQ2MyBzdGRjYWxsIFNldENhcHR1cmUobG9uZykgU2V0Q2FwdHVyZTMyCiAwNDY0IHN0ZGNhbGwgU2V0Q2FyZXRCbGlua1RpbWUobG9uZykgU2V0Q2FyZXRCbGlua1RpbWUKIDA0NjUgc3RkY2FsbCBTZXRDYXJldFBvcyhsb25nIGxvbmcpIFNldENhcmV0UG9zCkBAIC01MjMsNyArNTIzLDcgQEAKIDA1MTYgc3RkY2FsbCBTZXRXaW5kb3dMb25nQShsb25nIGxvbmcgbG9uZykgU2V0V2luZG93TG9uZzMyQQogMDUxNyBzdGRjYWxsIFNldFdpbmRvd0xvbmdXKGxvbmcgbG9uZyBsb25nKSBTZXRXaW5kb3dMb25nMzJXCiAwNTE4IHN0ZGNhbGwgU2V0V2luZG93UGxhY2VtZW50KGxvbmcgcHRyKSBTZXRXaW5kb3dQbGFjZW1lbnQzMgotMDUxOSBzdGRjYWxsIFNldFdpbmRvd1Bvcyhsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRXaW5kb3dQb3MKKzA1MTkgc3RkY2FsbCBTZXRXaW5kb3dQb3MobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgU2V0V2luZG93UG9zMzIKIDA1MjAgc3R1YiBTZXRXaW5kb3dTdGF0aW9uVXNlcgogMDUyMSBzdGRjYWxsIFNldFdpbmRvd1RleHRBKGxvbmcgcHRyKSBTZXRXaW5kb3dUZXh0MzJBCiAwNTIyIHN0ZGNhbGwgU2V0V2luZG93VGV4dFcobG9uZyBwdHIpIFNldFdpbmRvd1RleHQzMlcKQEAgLTUzNyw3ICs1MzcsNyBAQAogMDUzMCBzdHViIFNob3dPd25lZFBvcHVwcwogMDUzMSBzdGRjYWxsIFNob3dTY3JvbGxCYXIobG9uZyBsb25nIGxvbmcpIFNob3dTY3JvbGxCYXIzMgogMDUzMiBzdHViIFNob3dTdGFydEdsYXNzCi0wNTMzIHN0ZGNhbGwgU2hvd1dpbmRvdyhsb25nIGxvbmcpIFNob3dXaW5kb3cKKzA1MzMgc3RkY2FsbCBTaG93V2luZG93KGxvbmcgbG9uZykgU2hvd1dpbmRvdzMyCiAwNTM0IHN0dWIgU2hvd1dpbmRvd0FzeW5jCiAwNTM1IHN0ZGNhbGwgU3VidHJhY3RSZWN0KHB0ciBwdHIgcHRyKSBTdWJ0cmFjdFJlY3QzMgogMDUzNiBzdGRjYWxsIFN3YXBNb3VzZUJ1dHRvbihsb25nKSBTd2FwTW91c2VCdXR0b24KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVidWdnZXIuaCBiL2luY2x1ZGUvZGVidWdnZXIuaAppbmRleCAxMzc3OWQwLi45MWY1MTIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVnZ2VyLmgKKysrIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCkBAIC0xNjcsOSArMTY3LDkgQEAKIHN0cnVjdCBleHByICogREVCVUdfU3RydWN0RXhwcihzdHJ1Y3QgZXhwciAqLCBjb25zdCBjaGFyICogZWxlbWVudCk7CiBzdHJ1Y3QgZXhwciAqIERFQlVHX0FycmF5RXhwcihzdHJ1Y3QgZXhwciAqLCBzdHJ1Y3QgZXhwciAqIGluZGV4KTsKIHN0cnVjdCBleHByICogREVCVUdfQ2FsbEV4cHIoY29uc3QgY2hhciAqLCBpbnQgbmFyZ3MsIC4uLik7CitzdHJ1Y3QgZXhwciAqIERFQlVHX1R5cGVDYXN0RXhwcihzdHJ1Y3QgZGF0YXR5cGUgKiwgc3RydWN0IGV4cHIgKik7CiBleHRlcm4gICBpbnQgIERFQlVHX0V4cHJWYWx1ZShEQkdfQUREUiAqLCB1bnNpZ25lZCBpbnQgKik7CiBEQkdfQUREUiBERUJVR19FdmFsRXhwcihzdHJ1Y3QgZXhwciAqKTsKLWV4dGVybiBpbnQgREVCVUdfQWRkRGlzcGxheShzdHJ1Y3QgZXhwciAqIGV4cCk7CiBleHRlcm4gaW50IERFQlVHX0RlbERpc3BsYXkoaW50IGRpc3BsYXludW0pOwogZXh0ZXJuIHN0cnVjdCBleHByICogREVCVUdfQ2xvbmVFeHByKHN0cnVjdCBleHByICogZXhwKTsKIGV4dGVybiBpbnQgREVCVUdfRnJlZUV4cHIoc3RydWN0IGV4cHIgKiBleHApOwpAQCAtMTgwLDcgKzE4MCw3IEBACiAKICAgLyogZGVidWdnZXIvZGlzcGxheS5jICovCiBleHRlcm4gaW50IERFQlVHX0RvRGlzcGxheSh2b2lkKTsKLWV4dGVybiBpbnQgREVCVUdfQWRkRGlzcGxheShzdHJ1Y3QgZXhwciAqIGV4cCk7CitleHRlcm4gaW50IERFQlVHX0FkZERpc3BsYXkoc3RydWN0IGV4cHIgKiBleHAsIGludCBjb3VudCwgY2hhciBmb3JtYXQpOwogZXh0ZXJuIGludCBERUJVR19Eb0Rpc3BsYXkodm9pZCk7CiBleHRlcm4gaW50IERFQlVHX0RlbERpc3BsYXkoaW50IGRpc3BsYXludW0pOwogZXh0ZXJuIGludCBERUJVR19JbmZvRGlzcGxheSh2b2lkKTsKQEAgLTI3Myw2ICsyNzMsNyBAQAogZXh0ZXJuIHZvaWQgREVCVUdfSW5pdENWRGF0YVR5cGVzKHZvaWQpOwogCiAgIC8qIGRlYnVnZ2VyL3R5cGVzLmMgKi8KK2V4dGVybiBpbnQgREVCVUdfbmNoYXI7CiBleHRlcm4gdm9pZCBERUJVR19Jbml0VHlwZXModm9pZCk7CiBleHRlcm4gc3RydWN0IGRhdGF0eXBlICogREVCVUdfTmV3RGF0YVR5cGUoZW51bSBkZWJ1Z190eXBlIHh0eXBlLCAKIAkJCQkJICAgY29uc3QgY2hhciAqIHR5cGVuYW1lKTsKQEAgLTI5Niw3ICsyOTcsOSBAQAogZXh0ZXJuIGludCBERUJVR19TZXRCaXRmaWVsZFBhcmFtcyhzdHJ1Y3QgZGF0YXR5cGUgKiBkdCwgaW50IG9mZnNldCwgCiAJCQkJICAgaW50IG5iaXRzLCBzdHJ1Y3QgZGF0YXR5cGUgKiBkdDIpOwogZXh0ZXJuIGludCBERUJVR19Db3B5RmllbGRsaXN0KHN0cnVjdCBkYXRhdHlwZSAqIGR0LCBzdHJ1Y3QgZGF0YXR5cGUgKiBkdDIpOwotCitleHRlcm4gZW51bSBkZWJ1Z190eXBlIERFQlVHX0dldFR5cGUoc3RydWN0IGRhdGF0eXBlICogZHQpOworZXh0ZXJuIHN0cnVjdCBkYXRhdHlwZSAqIERFQlVHX1R5cGVDYXN0KGVudW0gZGVidWdfdHlwZSwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgREVCVUdfUHJpbnRUeXBlQ2FzdChzdHJ1Y3QgZGF0YXR5cGUgKik7CiAKICAgLyogZGVidWdnZXIvc291cmNlLmMgKi8KIGV4dGVybiB2b2lkIERFQlVHX1Nob3dEaXIodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2tleWJvYXJkLmggYi9pbmNsdWRlL2tleWJvYXJkLmgKaW5kZXggOTVmNjgxYy4uOTQ2NWUzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9rZXlib2FyZC5oCisrKyBiL2luY2x1ZGUva2V5Ym9hcmQuaApAQCAtMSwzMiArMSwxOSBAQAogLyoKLSAqIEtleWJvYXJkIGRlZmluaXRpb25zCisgKiBLZXlib2FyZCBoZWFkZXIgZmlsZQorICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICAqCiAgKi8KIAogI2lmbmRlZiBfX1dJTkVfS0VZQk9BUkRfSAogI2RlZmluZSBfX1dJTkVfS0VZQk9BUkRfSAogCi0jZGVmaW5lIFdJTkVfVktFWV9NQVBQSU5HU1wKLQkJdmtjYXNlKCchJywgJzEnKVwKLQkJdmtjYXNlKCdAJywgJzInKVwKLQkJdmtjYXNlKCcjJywgJzMnKVwKLQkJdmtjYXNlKCckJywgJzQnKVwKLQkJdmtjYXNlKCclJywgJzUnKVwKLQkJdmtjYXNlKCdeJywgJzYnKVwKLQkJdmtjYXNlKCcmJywgJzcnKVwKLQkJdmtjYXNlKCcqJywgJzgnKVwKLQkJdmtjYXNlKCcoJywgJzknKVwKLQkJdmtjYXNlKCcpJywgJzAnKVwKLQkJdmtjYXNlMignYCcsICd+JywgMHhjMClcCi0JCXZrY2FzZTIoJy0nLCAnXycsIDB4YmQpXAotCQl2a2Nhc2UyKCc9JywgJysnLCAweGJiKVwKLQkJdmtjYXNlMignWycsICd7JywgMHhkYilcCi0JCXZrY2FzZTIoJ10nLCAnfScsIDB4ZGQpXAotCQl2a2Nhc2UyKCc7JywgJzonLCAweGJhKVwKLQkJdmtjYXNlMignXCcnLCAnIicsIDB4ZGUpXAotCQl2a2Nhc2UyKCcsJywgJzwnLCAweGJjKVwKLQkJdmtjYXNlMignLicsICc+JywgMHhiZSlcCi0JCXZrY2FzZTIoJy8nLCAnPycsIDB4YmYpXAotCQl2a2Nhc2UyKCdcXCcsICd8JywgMHhkYykKK2V4dGVybiBCT09MMzIgTW91c2VCdXR0b25zU3RhdGVzWzNdOworZXh0ZXJuIEJPT0wzMiBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1szXTsKK2V4dGVybiBCWVRFIElucHV0S2V5U3RhdGVUYWJsZVsyNTZdOworZXh0ZXJuIEJZVEUgUXVldWVLZXlTdGF0ZVRhYmxlWzI1Nl07CitleHRlcm4gQllURSBBc3luY0tleVN0YXRlVGFibGVbMjU2XTsKKworZXh0ZXJuIEJPT0wzMiBLRVlCT0FSRF9Jbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgS0VZQk9BUkRfSGFuZGxlRXZlbnQoIFhLZXlFdmVudCAqZXZlbnQgKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfS0VZQk9BUkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tb2R1bGUuaCBiL2luY2x1ZGUvbW9kdWxlLmgKaW5kZXggM2I1MjAzOS4uOTUzY2RmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tb2R1bGUuaAorKysgYi9pbmNsdWRlL21vZHVsZS5oCkBAIC0xMjAsNiArMTIwLDcgQEAKIGV4dGVybiBITU9EVUxFMTYgTU9EVUxFX0ZpbmRNb2R1bGUoIExQQ1NUUiBwYXRoICk7CiBleHRlcm4gSElOU1RBTkNFMTYgTU9EVUxFX0dldEluc3RhbmNlKCBITU9EVUxFMTYgaE1vZHVsZSApOwogZXh0ZXJuIEhNT0RVTEUxNiBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoIGNvbnN0IE9GU1RSVUNUICpvZnMgKTsKK2V4dGVybiBISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrLCBCT09MMzIgZmlyc3QgKTsKIGV4dGVybiBXT1JEIE1PRFVMRV9HZXRPcmRpbmFsKCBITU9EVUxFMTYgaE1vZHVsZSwgY29uc3QgY2hhciAqbmFtZSApOwogZXh0ZXJuIEZBUlBST0MxNiBNT0RVTEVfR2V0RW50cnlQb2ludCggSE1PRFVMRTE2IGhNb2R1bGUsIFdPUkQgb3JkaW5hbCApOwogZXh0ZXJuIEJPT0wxNiBNT0RVTEVfU2V0RW50cnlQb2ludCggSE1PRFVMRTE2IGhNb2R1bGUsIFdPUkQgb3JkaW5hbCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGVfaW1hZ2UuaCBiL2luY2x1ZGUvcGVfaW1hZ2UuaAppbmRleCAxMzM2ZmZmLi4xMTMwYmE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BlX2ltYWdlLmgKKysrIGIvaW5jbHVkZS9wZV9pbWFnZS5oCkBAIC0zLDE0ICszLDE2IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2lubnQuaCIKKyNpbmNsdWRlICJwZWV4ZS5oIgogCiBzdHJ1Y3QgcGVfZGF0YSB7Ci0Jc3RydWN0IHBlX2hlYWRlcl9zICpwZV9oZWFkZXI7Ci0Jc3RydWN0IHBlX3NlZ21lbnRfdGFibGUgKnBlX3NlZzsKLQlzdHJ1Y3QgUEVfSW1wb3J0X0RpcmVjdG9yeSAqcGVfaW1wb3J0OwotCXN0cnVjdCBQRV9FeHBvcnRfRGlyZWN0b3J5ICpwZV9leHBvcnQ7Ci0Jc3RydWN0IFBFX1Jlc291cmNlX0RpcmVjdG9yeSAqcGVfcmVzb3VyY2U7Ci0Jc3RydWN0IFBFX1JlbG9jX0Jsb2NrICpwZV9yZWxvYzsKKwlMUElNQUdFX05UX0hFQURFUlMJCQlwZV9oZWFkZXI7CisJTFBJTUFHRV9TRUNUSU9OX0hFQURFUgkJCXBlX3NlZzsKKwlMUElNQUdFX0lNUE9SVF9ERVNDUklQVE9SCQlwZV9pbXBvcnQ7CisJTFBJTUFHRV9FWFBPUlRfRElSRUNUT1JZCQlwZV9leHBvcnQ7CisJTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkJCXBlX3Jlc291cmNlOworCUxQSU1BR0VfQkFTRV9SRUxPQ0FUSU9OCQkJcGVfcmVsb2M7CiAJaW50IGJhc2VfYWRkcjsKIAlpbnQgbG9hZF9hZGRyOwogCWludCB2bWFfc2l6ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGVleGUuaCBiL2luY2x1ZGUvcGVleGUuaAppbmRleCBjYTQ2ZTk3Li5jNzU0NTBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BlZXhlLmgKKysrIGIvaW5jbHVkZS9wZWV4ZS5oCkBAIC01LDE4ICs1LDE3IEBACiAjZGVmaW5lIF9fV0lORV9QRUVYRV9ICiAKIAordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0ZJTEVfSEVBREVSIHsKKwlXT1JECU1hY2hpbmU7CisJV09SRAlOdW1iZXJPZlNlY3Rpb25zOworCURXT1JECVRpbWVEYXRlU3RhbXA7CisJRFdPUkQJUG9pbnRlclRvU3ltYm9sVGFibGU7CisJRFdPUkQJTnVtYmVyT2ZTeW1ib2xzOworCVdPUkQJU2l6ZU9mT3B0aW9uYWxIZWFkZXI7CisJV09SRAlDaGFyYWN0ZXJpc3RpY3M7Cit9IElNQUdFX0ZJTEVfSEVBREVSLCpMUElNQUdFX0ZJTEVfSEVBREVSOwogCi1zdHJ1Y3QgY29mZl9oZWFkZXIKLXsKLQl1X3Nob3J0IE1hY2hpbmU7Ci0JdV9zaG9ydCBOdW1iZXJPZlNlY3Rpb25zOwotICAgICAgICB1X2xvbmcgVGltZURhdGVTdGFtcDsKLSAgICAgICAgdV9sb25nIFBvaW50ZXJUb1N5bWJvbFRhYmxlOwotICAgICAgICB1X2xvbmcgTnVtYmVyT2ZTeW1ib2xzOwotICAgICAgICB1X3Nob3J0IFNpemVPZk9wdGlvbmFsSGVhZGVyOwotICAgICAgICB1X3Nob3J0IENoYXJhY3RlcmlzdGljczsKLX07Ci0KKyNkZWZpbmUJSU1BR0VfU0laRU9GX0ZJTEVfSEVBREVSCTIwCiAKIC8qIFRoZXNlIGRlZmluZXMgZGVzY3JpYmUgdGhlIG1lYW5pbmdzIG9mIHRoZSBiaXRzIGluIHRoZSBDaGFyYWN0ZXJpc3RpY3MKICAgIGZpZWxkICovCkBAIC0zNCwxOTQgKzMzLDM0MyBAQAogI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0hJCTB4ODAwMAogCiAvKiBUaGVzZSBhcmUgdGhlIHNldHRpbmdzIG9mIHRoZSBNYWNoaW5lIGZpZWxkLiAqLwotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTiAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9JODYwICAgIDB4MTRkCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9JMzg2ICAgIDB4MTRjCi0jZGVmaW5lIElNQUdFX0ZJTEVfTUFDSElORV9SMzAwMAkweDE2MgotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfUjQwMDAJMHgxNjYKLSNkZWZpbmUgSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBCTB4MTg0CisjZGVmaW5lCUlNQUdFX0ZJTEVfTUFDSElORV9VTktOT1dOCTAKKyNkZWZpbmUJSU1BR0VfRklMRV9NQUNISU5FX0k4NjAJCTB4MTRkCisjZGVmaW5lCUlNQUdFX0ZJTEVfTUFDSElORV9JMzg2CQkweDE0YworI2RlZmluZQlJTUFHRV9GSUxFX01BQ0hJTkVfUjMwMDAJMHgxNjIKKyNkZWZpbmUJSU1BR0VfRklMRV9NQUNISU5FX1I0MDAwCTB4MTY2CisjZGVmaW5lCUlNQUdFX0ZJTEVfTUFDSElORV9SMTAwMDAJMHgxNjgKKyNkZWZpbmUJSU1BR0VfRklMRV9NQUNISU5FX0FMUEhBCTB4MTg0CisjZGVmaW5lCUlNQUdFX0ZJTEVfTUFDSElORV9QT1dFUlBDCTB4MUYwICAKIAotc3RydWN0IERpcmVjdG9yeQordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RBVEFfRElSRUNUT1JZCiB7Ci0gIHVfbG9uZyBWaXJ0dWFsX2FkZHJlc3M7Ci0gIHVfbG9uZyBTaXplOwotfTsKKwlEV09SRAlWaXJ0dWFsQWRkcmVzczsKKwlEV09SRAlTaXplOworfSBJTUFHRV9EQVRBX0RJUkVDVE9SWSwqTFBJTUFHRV9EQVRBX0RJUkVDVE9SWTsKIAorI2RlZmluZQlJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUyAxNgogCiAvKiBPcHRpb25hbCBjb2ZmIGhlYWRlciAtIHVzZWQgYnkgTlQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAqLwotCi1zdHJ1Y3Qgb2NvZmZoZHIKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9PUFRJT05BTF9IRUFERVIKIHsKLQl1X3Nob3J0IE1hZ2ljOyAgCQkvKiBHb29kIG9sZCBDT0ZGIG1hZ2ljIDA0MTMgKi8KLQl1X2NoYXIgTWFqb3JMaW5rZXJWZXJzaW9uOwotCXVfY2hhciBNaW5vckxpbmtlclZlcnNpb247Ci0JdV9sb25nIFNpemVPZkNvZGU7Ci0JdV9sb25nIFNpemVPZkluaXRpYWxpemVkRGF0YTsKLQl1X2xvbmcgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7Ci0JdV9sb25nIEFkZHJlc3NPZkVudHJ5UG9pbnQ7Ci0JdV9sb25nIEJhc2VPZkNvZGU7Ci0JdV9sb25nIEJhc2VPZkRhdGE7Ci0JdV9sb25nIEJhc2VPZkltYWdlOwotCXVfbG9uZyBTZWN0aW9uQWxpZ25tZW50OwotCXVfbG9uZyBGaWxlQWxpZ25tZW50OwotCXVfc2hvcnQgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOwotCXVfc2hvcnQgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOwotCXVfc2hvcnQgTWFqb3JJbWFnZVZlcnNpb247Ci0JdV9zaG9ydCBNaW5vckltYWdlVmVyc2lvbjsKLQl1X3Nob3J0IE1ham9yU3Vic3lzdGVtVmVyc2lvbjsKLQl1X3Nob3J0IE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsKLQl1X2xvbmcgVW5rbm93bjE7Ci0JdV9sb25nIFNpemVPZkltYWdlOwotCXVfbG9uZyBTaXplT2ZIZWFkZXJzOwotCXVfbG9uZyBDaGVja1N1bTsKLQl1X3Nob3J0IFN1YnN5c3RlbTsKLQl1X3Nob3J0IERsbENoYXJhY3RlcmlzdGljczsKLQl1X2xvbmcgU2l6ZU9mU3RhY2tSZXNlcnZlOwotCXVfbG9uZyBTaXplT2ZTdGFja0NvbW1pdDsKLQl1X2xvbmcgU2l6ZU9mSGVhcFJlc2VydmU7Ci0JdV9sb25nIFNpemVPZkhlYXBDb21taXQ7Ci0JdV9sb25nIExvYWRlckZsYWdzOwotCXVfbG9uZyBOdW1iZXJPZlJ2YUFuZFNpemVzOwotCXN0cnVjdCBEaXJlY3RvcnkgRGF0YURpcmVjdG9yeVsxNl07Ci19OworCS8qCisJICogU3RhbmRhcmQgZmllbGRzLgorCSAqLworCisJV09SRAlNYWdpYzsKKwlCWVRFCU1ham9yTGlua2VyVmVyc2lvbjsKKwlCWVRFCU1pbm9yTGlua2VyVmVyc2lvbjsKKwlEV09SRAlTaXplT2ZDb2RlOworCURXT1JECVNpemVPZkluaXRpYWxpemVkRGF0YTsKKwlEV09SRAlTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKwlEV09SRAlBZGRyZXNzT2ZFbnRyeVBvaW50OworCURXT1JECUJhc2VPZkNvZGU7CisJRFdPUkQJQmFzZU9mRGF0YTsKKworCS8qCisJICogTlQgYWRkaXRpb25hbCBmaWVsZHMuCisJICovCisKKwlEV09SRAlJbWFnZUJhc2U7CisJRFdPUkQJU2VjdGlvbkFsaWdubWVudDsKKwlEV09SRAlGaWxlQWxpZ25tZW50OworCVdPUkQJTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworCVdPUkQJTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworCVdPUkQJTWFqb3JJbWFnZVZlcnNpb247CisJV09SRAlNaW5vckltYWdlVmVyc2lvbjsKKwlXT1JECU1ham9yU3Vic3lzdGVtVmVyc2lvbjsKKwlXT1JECU1pbm9yU3Vic3lzdGVtVmVyc2lvbjsKKwlEV09SRAlSZXNlcnZlZDE7CisJRFdPUkQJU2l6ZU9mSW1hZ2U7CisJRFdPUkQJU2l6ZU9mSGVhZGVyczsKKwlEV09SRAlDaGVja1N1bTsKKwlXT1JECVN1YnN5c3RlbTsKKwlXT1JECURsbENoYXJhY3RlcmlzdGljczsKKwlEV09SRAlTaXplT2ZTdGFja1Jlc2VydmU7CisJRFdPUkQJU2l6ZU9mU3RhY2tDb21taXQ7CisJRFdPUkQJU2l6ZU9mSGVhcFJlc2VydmU7CisJRFdPUkQJU2l6ZU9mSGVhcENvbW1pdDsKKwlEV09SRAlMb2FkZXJGbGFnczsKKwlEV09SRAlOdW1iZXJPZlJ2YUFuZFNpemVzOworCUlNQUdFX0RBVEFfRElSRUNUT1JZIERhdGFEaXJlY3RvcnlbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdOworfSBJTUFHRV9PUFRJT05BTF9IRUFERVIsKkxQSU1BR0VfT1BUSU9OQUxfSEVBREVSOwogCiAvKiBUaGVzZSBhcmUgaW5kZXhlcyBpbnRvIHRoZSBEYXRhRGlyZWN0b3J5IGFycmF5ICovCi0jZGVmaW5lIElNQUdFX0ZJTEVfRVhQT1JUX0RJUkVDVE9SWSAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfSU1QT1JUX0RJUkVDVE9SWSAxCi0jZGVmaW5lIElNQUdFX0ZJTEVfUkVTT1VSQ0VfRElSRUNUT1JZIDIKLSNkZWZpbmUgSU1BR0VfRklMRV9FWENFUFRJT05fRElSRUNUT1JZIDMKLSNkZWZpbmUgSU1BR0VfRklMRV9TRUNVUklUWV9ESVJFQ1RPUlkgNAotI2RlZmluZSBJTUFHRV9GSUxFX0JBU0VfUkVMT0NBVElPTl9UQUJMRSA1Ci0jZGVmaW5lIElNQUdFX0ZJTEVfREVCVUdfRElSRUNUT1JZIDYKLSNkZWZpbmUgSU1BR0VfRklMRV9ERVNDUklQVElPTl9TVFJJTkcgNwotI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVkFMVUUgOCAgLyogTWlwcyAqLwotI2RlZmluZSBJTUFHRV9GSUxFX1RIUkVBRF9MT0NBTF9TVE9SQUdFIDkKLSNkZWZpbmUgSU1BR0VfRklMRV9DQUxMQkFDS19ESVJFQ1RPUlkgMTAKKyNkZWZpbmUgSU1BR0VfRklMRV9FWFBPUlRfRElSRUNUT1JZCQkwCisjZGVmaW5lIElNQUdFX0ZJTEVfSU1QT1JUX0RJUkVDVE9SWQkJMQorI2RlZmluZSBJTUFHRV9GSUxFX1JFU09VUkNFX0RJUkVDVE9SWQkJMgorI2RlZmluZSBJTUFHRV9GSUxFX0VYQ0VQVElPTl9ESVJFQ1RPUlkJCTMKKyNkZWZpbmUgSU1BR0VfRklMRV9TRUNVUklUWV9ESVJFQ1RPUlkJCTQKKyNkZWZpbmUgSU1BR0VfRklMRV9CQVNFX1JFTE9DQVRJT05fVEFCTEUJNQorI2RlZmluZSBJTUFHRV9GSUxFX0RFQlVHX0RJUkVDVE9SWQkJNgorI2RlZmluZSBJTUFHRV9GSUxFX0RFU0NSSVBUSU9OX1NUUklORwkJNworI2RlZmluZSBJTUFHRV9GSUxFX01BQ0hJTkVfVkFMVUUJCTggIC8qIE1pcHMgKi8KKyNkZWZpbmUgSU1BR0VfRklMRV9USFJFQURfTE9DQUxfU1RPUkFHRQkJOQorI2RlZmluZSBJTUFHRV9GSUxFX0NBTExCQUNLX0RJUkVDVE9SWQkJMTAKIAotc3RydWN0IHBlX2hlYWRlcl9zCi17Ci0JY2hhciBtYWdpY1s0XTsgIC8qIE11c3QgYmUgJ1AnLCAnRScsIDAsIDAgKi8KLQlzdHJ1Y3QgY29mZl9oZWFkZXIgY29mZjsKLQlzdHJ1Y3Qgb2NvZmZoZHIgICAgb3B0X2NvZmY7Ci19OworLyogRGlyZWN0b3J5IEVudHJpZXMsIGluZGljZXMgaW50byB0aGUgRGF0YURpcmVjdG9yeSBhcnJheSAqLwogCisjZGVmaW5lCUlNQUdFX0RJUkVDVE9SWV9FTlRSWV9FWFBPUlQJCTAKKyNkZWZpbmUJSU1BR0VfRElSRUNUT1JZX0VOVFJZX0lNUE9SVAkJMQorI2RlZmluZQlJTUFHRV9ESVJFQ1RPUllfRU5UUllfUkVTT1VSQ0UJCTIKKyNkZWZpbmUJSU1BR0VfRElSRUNUT1JZX0VOVFJZX0VYQ0VQVElPTgkJMworI2RlZmluZQlJTUFHRV9ESVJFQ1RPUllfRU5UUllfU0VDVVJJVFkJCTQKKyNkZWZpbmUJSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JBU0VSRUxPQwkJNQorI2RlZmluZQlJTUFHRV9ESVJFQ1RPUllfRU5UUllfREVCVUcJCTYKKyNkZWZpbmUJSU1BR0VfRElSRUNUT1JZX0VOVFJZX0NPUFlSSUdIVAkJNworI2RlZmluZQlJTUFHRV9ESVJFQ1RPUllfRU5UUllfR0xPQkFMUFRSCQk4ICAgLyogKE1JUFMgR1ApICovCisjZGVmaW5lCUlNQUdFX0RJUkVDVE9SWV9FTlRSWV9UTFMJCTkKKyNkZWZpbmUJSU1BR0VfRElSRUNUT1JZX0VOVFJZX0xPQURfQ09ORklHCTEwCisjZGVmaW5lCUlNQUdFX0RJUkVDVE9SWV9FTlRSWV9CT1VORF9JTVBPUlQJMTEKKyNkZWZpbmUJSU1BR0VfRElSRUNUT1JZX0VOVFJZX0lBVAkJMTIgIC8qIEltcG9ydCBBZGRyZXNzIFRhYmxlICovCiAKLXN0cnVjdCBwZV9zZWdtZW50X3RhYmxlCi17Ci0gIHVfY2hhciBOYW1lWzhdOwotICB1X2xvbmcgVmlydHVhbF9TaXplOwotICB1X2xvbmcgVmlydHVhbF9BZGRyZXNzOwotICB1X2xvbmcgU2l6ZV9PZl9SYXdfRGF0YTsKLSAgdV9sb25nICAgUG9pbnRlclRvUmF3RGF0YTsKLSAgdV9sb25nICAgUG9pbnRlclRvUmVsb2NhdGlvbnM7Ci0gIHVfbG9uZyAgIFBvaW50ZXJUb0xpbmVudW1iZXJzOwotICB1X3Nob3J0ICBOdW1iZXJPZlJlbG9jYXRpb25zOwotICB1X3Nob3J0ICBOdW1iZXJPZkxpbmVudW1iZXJzOwotICB1X2xvbmcgICBDaGFyYWN0ZXJpc3RpY3M7Ci19OworLyogU3Vic3lzdGVtIFZhbHVlcyAqLworCisjZGVmaW5lCUlNQUdFX1NVQlNZU1RFTV9VTktOT1dOCQkwCisjZGVmaW5lCUlNQUdFX1NVQlNZU1RFTV9OQVRJVkUJCTEKKyNkZWZpbmUJSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfR1VJCTIJLyogV2luZG93cyBHVUkgc3Vic3lzdGVtICovCisjZGVmaW5lCUlNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0NVSQkzCS8qIFdpbmRvd3MgY2hhcmFjdGVyIHN1YnN5c3RlbSovCisjZGVmaW5lCUlNQUdFX1NVQlNZU1RFTV9PUzJfQ1VJCQk1CisjZGVmaW5lCUlNQUdFX1NVQlNZU1RFTV9QT1NJWF9DVUkJNworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfTlRfSEVBREVSUyB7CisJRFdPUkQJCQlTaWduYXR1cmU7CisJSU1BR0VfRklMRV9IRUFERVIJRmlsZUhlYWRlcjsKKwlJTUFHRV9PUFRJT05BTF9IRUFERVIJT3B0aW9uYWxIZWFkZXI7Cit9IElNQUdFX05UX0hFQURFUlMsKkxQSU1BR0VfTlRfSEVBREVSUzsKKworLyogU2VjdGlvbiBoZWFkZXIgZm9ybWF0ICovCisKKyNkZWZpbmUJSU1BR0VfU0laRU9GX1NIT1JUX05BTUUJOAorCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfU0VDVElPTl9IRUFERVIgeworCUJZVEUJTmFtZVtJTUFHRV9TSVpFT0ZfU0hPUlRfTkFNRV07CisJdW5pb24geworCQlEV09SRAlQaHlzaWNhbEFkZHJlc3M7CisJCURXT1JECVZpcnR1YWxTaXplOworCX0gTWlzYzsKKwlEV09SRAlWaXJ0dWFsQWRkcmVzczsKKwlEV09SRAlTaXplT2ZSYXdEYXRhOworCURXT1JECVBvaW50ZXJUb1Jhd0RhdGE7CisJRFdPUkQJUG9pbnRlclRvUmVsb2NhdGlvbnM7CisJRFdPUkQJUG9pbnRlclRvTGluZW51bWJlcnM7CisJV09SRAlOdW1iZXJPZlJlbG9jYXRpb25zOworCVdPUkQJTnVtYmVyT2ZMaW5lbnVtYmVyczsKKwlEV09SRAlDaGFyYWN0ZXJpc3RpY3M7Cit9IElNQUdFX1NFQ1RJT05fSEVBREVSLCpMUElNQUdFX1NFQ1RJT05fSEVBREVSOworCisjZGVmaW5lCUlNQUdFX1NJWkVPRl9TRUNUSU9OX0hFQURFUiA0MAogCiAvKiBUaGVzZSBkZWZpbmVzIGFyZSBmb3IgdGhlIENoYXJhY3RlcmlzdGljcyBiaXRmaWVsZC4gKi8KKy8qICNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfUkVHCQkJMHgwMDAwMDAwMCAtIFJlc2VydmVkICovCisvKiAjZGVmaW5lIElNQUdFX1NDTl9UWVBFX0RTRUNUCQkJMHgwMDAwMDAwMSAtIFJlc2VydmVkICovCisvKiAjZGVmaW5lIElNQUdFX1NDTl9UWVBFX05PTE9BRAkJMHgwMDAwMDAwMiAtIFJlc2VydmVkICovCisvKiAjZGVmaW5lIElNQUdFX1NDTl9UWVBFX0dST1VQCQkJMHgwMDAwMDAwNCAtIFJlc2VydmVkICovCisvKiAjZGVmaW5lIElNQUdFX1NDTl9UWVBFX05PX1BBRAkJMHgwMDAwMDAwOCAtIFJlc2VydmVkICovCisvKiAjZGVmaW5lIElNQUdFX1NDTl9UWVBFX0NPUFkJCQkweDAwMDAwMDEwIC0gUmVzZXJ2ZWQgKi8KIAotI2RlZmluZSBJTUFHRV9TQ05fVFlQRV9DTlRfQ09ERSAweDIwCi0jZGVmaW5lIElNQUdFX1NDTl9UWVBFX0NOVF9JTklUSUFMSVpFRF9EQVRBIDB4NDAKLSNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfQ05UX1VOSU5JVElBTElaRURfREFUQSAweDgwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgIDB4MjAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1NIQVJFRCAJICAweDEwMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRVhFQ1VURQkgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFECSAgMHg0MDAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFCSAgMHg4MDAwMDAwMAorI2RlZmluZSBJTUFHRV9TQ05fQ05UX0NPREUJCQkweDAwMDAwMDIwCisjZGVmaW5lIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQQkJMHgwMDAwMDA0MAorI2RlZmluZSBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQQkweDAwMDAwMDgwCiAKLS8qCi0gKiBJbXBvcnQgbW9kdWxlIGRpcmVjdG9yeSBzdHVmZgotICovCisjZGVmaW5lCUlNQUdFX1NDTl9MTktfT1RIRVIJCQkweDAwMDAwMTAwIAorI2RlZmluZQlJTUFHRV9TQ05fTE5LX0lORk8JCQkweDAwMDAwMjAwICAKKy8qICNkZWZpbmUJSU1BR0VfU0NOX1RZUEVfT1ZFUgkJMHgwMDAwMDQwMCAtIFJlc2VydmVkICovCisjZGVmaW5lCUlNQUdFX1NDTl9MTktfUkVNT1ZFCQkJMHgwMDAwMDgwMAorI2RlZmluZQlJTUFHRV9TQ05fTE5LX0NPTURBVAkJCTB4MDAwMDEwMDAKIAotc3RydWN0IFBFX0ltcG9ydF9EaXJlY3RvcnkKLXsKLSAgdV9pbnQgSW1wb3J0X0xpc3Q7Ci0gIHVfaW50IFRpbWVEYXRlOwotICB1X2ludCBGb3J3YXJkZXI7Ci0gIHVfaW50IE1vZHVsZU5hbWU7Ci0gIHVfaW50IFRodW5rX0xpc3Q7Ci19OworLyogCQkJCQkJMHgwMDAwMjAwMCAtIFJlc2VydmVkICovCisvKiAjZGVmaW5lIElNQUdFX1NDTl9NRU1fUFJPVEVDVEVEIAkJMHgwMDAwNDAwMCAtIE9ic29sZXRlICovCisjZGVmaW5lCUlNQUdFX1NDTl9NRU1fRkFSREFUQQkJCTB4MDAwMDgwMDAKIAotc3RydWN0IHBlX2ltcG9ydF9uYW1lCi17Ci0gIHVfc2hvcnQgSGludDsKLSAgdV9jaGFyIE5hbWVbMV07Ci19OworLyogI2RlZmluZSBJTUFHRV9TQ05fTUVNX1NZU0hFQVAJCTB4MDAwMTAwMDAgLSBPYnNvbGV0ZSAqLworI2RlZmluZQlJTUFHRV9TQ05fTUVNX1BVUkdFQUJMRQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUJSU1BR0VfU0NOX01FTV8xNkJJVAkJCTB4MDAwMjAwMDAKKyNkZWZpbmUJSU1BR0VfU0NOX01FTV9MT0NLRUQJCQkweDAwMDQwMDAwCisjZGVmaW5lCUlNQUdFX1NDTl9NRU1fUFJFTE9BRAkJCTB4MDAwODAwMDAKIAotLyoKLSAqIEV4cG9ydCBtb2R1bGUgZGlyZWN0b3J5IHN0dWZmCi0gKi8KKyNkZWZpbmUJSU1BR0VfU0NOX0FMSUdOXzFCWVRFUwkJCTB4MDAxMDAwMDAKKyNkZWZpbmUJSU1BR0VfU0NOX0FMSUdOXzJCWVRFUwkJCTB4MDAyMDAwMDAKKyNkZWZpbmUJSU1BR0VfU0NOX0FMSUdOXzRCWVRFUwkJCTB4MDAzMDAwMDAKKyNkZWZpbmUJSU1BR0VfU0NOX0FMSUdOXzhCWVRFUwkJCTB4MDA0MDAwMDAKKyNkZWZpbmUJSU1BR0VfU0NOX0FMSUdOXzE2QllURVMJCQkweDAwNTAwMDAwICAvKiBEZWZhdWx0ICovCisjZGVmaW5lIElNQUdFX1NDTl9BTElHTl8zMkJZVEVTCQkJMHgwMDYwMDAwMAorI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUwkJCTB4MDA3MDAwMDAKKy8qIAkJCQkJCTB4MDA4MDAwMDAgLSBVbnVzZWQgKi8KIAotc3RydWN0IFBFX0V4cG9ydF9EaXJlY3RvcnkKLXsKLSAgdV9sb25nIENoYXJhY3RlcmlzdGljczsKLSAgdV9sb25nIFRpbWVEYXRlU3RhbXA7Ci0gIHVfc2hvcnQgTWFqb3JfdmVyc2lvbjsKLSAgdV9zaG9ydCBNaW5vcl92ZXJzaW9uOwotICB1X2xvbmcgTmFtZTsKLSAgdV9sb25nIEJhc2U7Ci0gIHVfbG9uZyBOdW1iZXJfT2ZfRnVuY3Rpb25zOwotICB1X2xvbmcgTnVtYmVyX09mX05hbWVzOwotICB1X2xvbmcgKiBBZGRyZXNzT2ZGdW5jdGlvbnM7Ci0gIHVfbG9uZyAqIEFkZHJlc3NPZk5hbWVzOwotICB1X3Nob3J0ICogQWRkcmVzc19PZl9OYW1lX09yZGluYWxzOworI2RlZmluZSBJTUFHRV9TQ05fTE5LX05SRUxPQ19PVkZMCQkweDAxMDAwMDAwCisKKworI2RlZmluZSBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCQkweDAyMDAwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRAkJMHgwNDAwMDAwMAorI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRAkJCTB4MDgwMDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9TSEFSRUQJCQkweDEwMDAwMDAwCisjZGVmaW5lIElNQUdFX1NDTl9NRU1fRVhFQ1VURQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFECQkJMHg0MDAwMDAwMAorI2RlZmluZSBJTUFHRV9TQ05fTUVNX1dSSVRFCQkJMHg4MDAwMDAwMAorCisKKy8qIEltcG9ydCBuYW1lIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfSU1QT1JUX0JZX05BTUUgeworCVdPUkQJSGludDsKKwlCWVRFCU5hbWVbMV07Cit9IElNQUdFX0lNUE9SVF9CWV9OQU1FLCpMUElNQUdFX0lNUE9SVF9CWV9OQU1FOworCisvKiBJbXBvcnQgdGh1bmsgKi8KK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9USFVOS19EQVRBIHsKKwl1bmlvbiB7CisJCUxQQllURQlGb3J3YXJkZXJTdHJpbmc7CisJCUxQRFdPUkQJRnVuY3Rpb247CisJCURXT1JECU9yZGluYWw7CisJCUxQSU1BR0VfSU1QT1JUX0JZX05BTUUJQWRkcmVzc09mRGF0YTsKKwl9IHUxOworfSBJTUFHRV9USFVOS19EQVRBLCpMUElNQUdFX1RIVU5LX0RBVEE7CisKKy8qIEltcG9ydCBtb2R1bGUgZGlyZWN0b3J5ICovCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9JTVBPUlRfREVTQ1JJUFRPUiB7CisJdW5pb24geworCQlEV09SRAlDaGFyYWN0ZXJpc3RpY3M7IC8qIDAgZm9yIHRlcm1pbmF0aW5nIG51bGwgaW1wb3J0IGRlc2NyaXB0b3IgICovCisJCUxQSU1BR0VfVEhVTktfREFUQSBPcmlnaW5hbEZpcnN0VGh1bms7CS8qIFJWQSB0byBvcmlnaW5hbCB1bmJvdW5kIElBVCAqLworCX0gdTsKKwlEV09SRAlUaW1lRGF0ZVN0YW1wOwkvKiAwIGlmIG5vdCBib3VuZCwKKwkJCQkgKiAtMSBpZiBib3VuZCwgYW5kIHJlYWwgZGF0ZVx0aW1lIHN0YW1wCisJCQkJICogICAgaW4gSU1BR0VfRElSRUNUT1JZX0VOVFJZX0JPVU5EX0lNUE9SVAorCQkJCSAqIChuZXcgQklORCkKKwkJCQkgKiBvdGhlcndpc2UgZGF0ZS90aW1lIHN0YW1wIG9mIERMTCBib3VuZCB0bworCQkJCSAqIChPbGQgQklORCkKKwkJCQkgKi8KKwlEV09SRAlGb3J3YXJkZXJDaGFpbjsJLyogLTEgaWYgbm8gZm9yd2FyZGVycyAqLworCURXT1JECU5hbWU7CisJLyogUlZBIHRvIElBVCAoaWYgYm91bmQgdGhpcyBJQVQgaGFzIGFjdHVhbCBhZGRyZXNzZXMpICovCisJTFBJTUFHRV9USFVOS19EQVRBIEZpcnN0VGh1bms7CQorfSBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUiwqTFBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUjsKKworI2RlZmluZQlJTUFHRV9PUkRJTkFMX0ZMQUcJCTB4ODAwMDAwMDAKKyNkZWZpbmUJSU1BR0VfU05BUF9CWV9PUkRJTkFMKE9yZGluYWwpCSgoT3JkaW5hbCAmIElNQUdFX09SRElOQUxfRkxBRykgIT0gMCkKKyNkZWZpbmUJSU1BR0VfT1JESU5BTChPcmRpbmFsKQkJKE9yZGluYWwgJiAweGZmZmYpCisKKy8qIEV4cG9ydCBtb2R1bGUgZGlyZWN0b3J5ICovCisKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9FWFBPUlRfRElSRUNUT1JZIHsKKwlEV09SRAlDaGFyYWN0ZXJpc3RpY3M7CisJRFdPUkQJVGltZURhdGVTdGFtcDsKKwlXT1JECU1ham9yVmVyc2lvbjsKKwlXT1JECU1pbm9yVmVyc2lvbjsKKwlEV09SRAlOYW1lOworCURXT1JECUJhc2U7CisJRFdPUkQJTnVtYmVyT2ZGdW5jdGlvbnM7CisJRFdPUkQJTnVtYmVyT2ZOYW1lczsKKwlMUERXT1JECSpBZGRyZXNzT2ZGdW5jdGlvbnM7CisJTFBEV09SRAkqQWRkcmVzc09mTmFtZXM7CisJTFBXT1JECSpBZGRyZXNzT2ZOYW1lT3JkaW5hbHM7CiAvKiAgdV9jaGFyIE1vZHVsZU5hbWVbMV07ICovCi19OworfSBJTUFHRV9FWFBPUlRfRElSRUNUT1JZLCpMUElNQUdFX0VYUE9SVF9ESVJFQ1RPUlk7CisKIAogLyoKICAqIFJlc291cmNlIGRpcmVjdG9yeSBzdHVmZgogICovCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIHsKKwlEV09SRAlDaGFyYWN0ZXJpc3RpY3M7CisJRFdPUkQJVGltZURhdGVTdGFtcDsKKwlXT1JECU1ham9yVmVyc2lvbjsKKwlXT1JECU1pbm9yVmVyc2lvbjsKKwlXT1JECU51bWJlck9mTmFtZWRFbnRyaWVzOworCVdPUkQJTnVtYmVyT2ZJZEVudHJpZXM7CisJLyogIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSBEaXJlY3RvcnlFbnRyaWVzW107ICovCit9IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSwqTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlk7CiAKLXN0cnVjdCBQRV9SZXNvdXJjZV9EaXJlY3RvcnkKKyNkZWZpbmUJSU1BR0VfUkVTT1VSQ0VfTkFNRV9JU19TVFJJTkcJCTB4ODAwMDAwMDAKKyNkZWZpbmUJSU1BR0VfUkVTT1VSQ0VfREFUQV9JU19ESVJFQ1RPUlkJMHg4MDAwMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlEV09SRCBOYW1lT2Zmc2V0OjMxOworCQkJRFdPUkQgTmFtZUlzU3RyaW5nOjE7CisJCX0gczsKKwkJRFdPUkQgICBOYW1lOworCQlXT1JEICAgIElkOworCX0gdTE7CisJdW5pb24geworCQlEV09SRCAgIE9mZnNldFRvRGF0YTsKKwkJc3RydWN0IHsKKwkJCURXT1JEICAgT2Zmc2V0VG9EaXJlY3Rvcnk6MzE7CisJCQlEV09SRCAgIERhdGFJc0RpcmVjdG9yeToxOworCQl9IHM7CisJfSB1MjsKK30gSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZLCpMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWTsKKworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX1NUUklORyB7CisJV09SRAlMZW5ndGg7CisJQ0hBUglOYW1lU3RyaW5nWyAxIF07Cit9IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9TVFJJTkcsKkxQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX1NUUklORzsKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1JFU09VUkNFX0RJUl9TVFJJTkdfVSB7CisJV09SRAlMZW5ndGg7CisJV0NIQVIJTmFtZVN0cmluZ1sgMSBdOworfSBJTUFHRV9SRVNPVVJDRV9ESVJfU1RSSU5HX1UsKkxQSU1BR0VfUkVTT1VSQ0VfRElSX1NUUklOR19VOworCit0eXBlZGVmIHN0cnVjdCBfSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSB7CisJRFdPUkQJT2Zmc2V0VG9EYXRhOworCURXT1JECVNpemU7CisJRFdPUkQJQ29kZVBhZ2U7CisJRFdPUkQJUmVzZXJ2ZWQ7Cit9IElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlksKkxQSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0JBU0VfUkVMT0NBVElPTgogewotICB1X2xvbmcgQ2hhcmFjdGVyaXN0aWNzOwotICB1X2xvbmcgVGltZURhdGVTdGFtcDsKLSAgdV9zaG9ydCBNYWpvclZlcnNpb247Ci0gIHVfc2hvcnQgTWlub3JWZXJzaW9uOwotICB1X3Nob3J0IE51bWJlck9mTmFtZWRFbnRyaWVzOwotICB1X3Nob3J0IE51bWJlck9mSWRFbnRyaWVzOwotfTsKKwlEV09SRAlWaXJ0dWFsQWRkcmVzczsKKwlEV09SRAlTaXplT2ZCbG9jazsKKwlXT1JECVR5cGVPZmZzZXRbMV07Cit9IElNQUdFX0JBU0VfUkVMT0NBVElPTiwqTFBJTUFHRV9CQVNFX1JFTE9DQVRJT047CiAKLXN0cnVjdCBQRV9EaXJlY3RvcnlfRW50cnkKLXsKLSAgdV9sb25nIE5hbWU7Ci0gIHVfbG9uZyBPZmZzZXRUb0RhdGE7Ci19OwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX0RFQlVHX0RJUkVDVE9SWSB7CisJRFdPUkQJQ2hhcmFjdGVyaXN0aWNzOworCURXT1JECVRpbWVEYXRlU3RhbXA7CisJV09SRAlNYWpvclZlcnNpb247CisJV09SRAlNaW5vclZlcnNpb247CisJRFdPUkQJVHlwZTsKKwlEV09SRAlTaXplT2ZEYXRhOworCURXT1JECUFkZHJlc3NPZlJhd0RhdGE7CisJRFdPUkQJUG9pbnRlclRvUmF3RGF0YTsKK30gSU1BR0VfREVCVUdfRElSRUNUT1JZLCpMUElNQUdFX0RFQlVHX0RJUkVDVE9SWTsKIAotc3RydWN0IFBFX0RpcmVjdG9yeV9OYW1lX1N0cmluZwotewotICB1X3Nob3J0IExlbmd0aDsKLSAgY2hhciBOYW1lU3RyaW5nWzFdOwotfTsKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9MT0FEX0NPTkZJR19ESVJFQ1RPUlkgeworCURXT1JECUNoYXJhY3RlcmlzdGljczsKKwlEV09SRAlUaW1lRGF0ZVN0YW1wOworCVdPUkQJTWFqb3JWZXJzaW9uOworCVdPUkQJTWlub3JWZXJzaW9uOworCURXT1JECUdsb2JhbEZsYWdzQ2xlYXI7CisJRFdPUkQJR2xvYmFsRmxhZ3NTZXQ7CisJRFdPUkQJQ3JpdGljYWxTZWN0aW9uRGVmYXVsdFRpbWVvdXQ7CisJRFdPUkQJRGVDb21taXRGcmVlQmxvY2tUaHJlc2hvbGQ7CisJRFdPUkQJRGVDb21taXRUb3RhbEZyZWVUaHJlc2hvbGQ7CisJTFBWT0lECUxvY2tQcmVmaXhUYWJsZTsKKwlEV09SRAlNYXhpbXVtQWxsb2NhdGlvblNpemU7CisJRFdPUkQJVmlydHVhbE1lbW9yeVRocmVzaG9sZDsKKwlEV09SRAlQcm9jZXNzSGVhcEZsYWdzOworCURXT1JECVJlc2VydmVkWyA0IF07Cit9IElNQUdFX0xPQURfQ09ORklHX0RJUkVDVE9SWSwqTFBJTUFHRV9MT0FEX0NPTkZJR19ESVJFQ1RPUlk7CiAKLXN0cnVjdCBQRV9EaXJlY3RvcnlfTmFtZV9TdHJpbmdfVQotewotICB1X3Nob3J0IExlbmd0aDsKLSAgdV9zaG9ydCBOYW1lU3RyaW5nWzFdOwotfTsKK3R5cGVkZWYgVk9JRCAoKkxQSU1BR0VfVExTX0NBTExCQUNLKSgKKwlMUFZPSUQgRGxsSGFuZGxlLERXT1JEIFJlYXNvbixMUFZPSUQgUmVzZXJ2ZWQKKyk7CiAKLXN0cnVjdCBQRV9SZXNvdXJjZV9MZWFmX0VudHJ5Ci17Ci0gIHVfbG9uZyBPZmZzZXRUb0RhdGE7Ci0gIHVfbG9uZyBTaXplOwotICB1X2xvbmcgQ29kZVBhZ2U7Ci0gIHVfbG9uZyBSZXNlcnZlZDsKLX07Ci0KLSNkZWZpbmUgSU1BR0VfUkVTT1VSQ0VfTkFNRV9JU19TVFJJTkcgICAgMHg4MDAwMDAwMAotI2RlZmluZSBJTUFHRV9SRVNPVVJDRV9EQVRBX0lTX0RJUkVDVE9SWSAweDgwMDAwMDAwCi0KLXN0cnVjdCBQRV9SZWxvY19CbG9jawotewotCXVfbG9uZyBQYWdlUlZBOwotCXVfbG9uZyBCbG9ja1NpemU7Ci0Jc2hvcnQgUmVsb2NhdGlvbnNbMV07Ci19OwordHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1RMU19ESVJFQ1RPUlkgeworCURXT1JECVN0YXJ0QWRkcmVzc09mUmF3RGF0YTsKKwlEV09SRAlFbmRBZGRyZXNzT2ZSYXdEYXRhOworCUxQRFdPUkQJQWRkcmVzc09mSW5kZXg7CisJTFBJTUFHRV9UTFNfQ0FMTEJBQ0sgKkFkZHJlc3NPZkNhbGxCYWNrczsKKwlEV09SRAlTaXplT2ZaZXJvRmlsbDsKKwlEV09SRAlDaGFyYWN0ZXJpc3RpY3M7Cit9IElNQUdFX1RMU19ESVJFQ1RPUlksKkxQSU1BR0VfVExTX0RJUkVDVE9SWTsKIAogLyoKLSAqIFRoZSBJTUFHRV9GSUxFX0RFQlVHX0RJUkVDVE9SWSBkYXRhIGRpcmVjdG9yeSBwb2ludHMgdG8gYW4gYXJyYXkgb2YKKyAqIFRoZSBJTUFHRV9ERUJVR19ESVJFQ1RPUlkgZGF0YSBkaXJlY3RvcnkgcG9pbnRzIHRvIGFuIGFycmF5IG9mCiAgKiB0aGVzZSBzdHJ1Y3R1cmVzLgogICovCiBzdHJ1Y3QgUEVfRGVidWdfZGlyCkBAIC0yNDUsMzAgKzM5MywzNyBAQAogI2RlZmluZSBJTUFHRV9ERUJVR19UWVBFX0NPREVWSUVXCTIKICNkZWZpbmUgSU1BR0VfREVCVUdfVFlQRV9GUE8JCTMKICNkZWZpbmUgSU1BR0VfREVCVUdfVFlQRV9NSVNDCQk0CisjZGVmaW5lIElNQUdFX0RFQlVHX1RZUEVfRVhDRVBUSU9OCTUKKyNkZWZpbmUgSU1BR0VfREVCVUdfVFlQRV9GSVhVUAkJNgorI2RlZmluZSBJTUFHRV9ERUJVR19UWVBFX09NQVBfVE9fU1JDCTcKKyNkZWZpbmUgSU1BR0VfREVCVUdfVFlQRV9PTUFQX0ZST01fU1JDCTgKKwogCiAjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9BQlNPTFVURSAJCTAKICNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0gJCQkxCi0jZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9MT1cJCQkJMgorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfTE9XCQkJMgogI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfSElHSExPVwkJCTMKICNkZWZpbmUgSU1BR0VfUkVMX0JBU0VEX0hJR0hBREoJCQk0Ci0jZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9NSVBTX0pNUEFERFIJNQorI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfTUlQU19KTVBBRERSCQk1CiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdGhhdCBhcHBlYXJzIGF0IHRoZSB2ZXJ5IHN0YXJ0IG9mIGEgLkRCRyBmaWxlLgogICovCi1zdHJ1Y3QgUEVfREJHX0ZpbGVIZWFkZXIgewotICAgIHVuc2lnbmVkIHNob3J0IGludCBTaWduYXR1cmU7Ci0gICAgdW5zaWduZWQgc2hvcnQgaW50IEZsYWdzOwotICAgIHVuc2lnbmVkIHNob3J0IGludCBNYWNoaW5lOwotICAgIHVuc2lnbmVkIHNob3J0IGludCBDaGFyYWN0ZXJpc3RpY3M7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgIFRpbWVEYXRlU3RhbXA7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgIENoZWNrU3VtOwotICAgIHVuc2lnbmVkIGludCAgICAgICBJbWFnZUJhc2U7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgIFNpemVPZkltYWdlOwotICAgIHVuc2lnbmVkIGludCAgICAgICBOdW1iZXJPZlNlY3Rpb25zOwotICAgIHVuc2lnbmVkIGludCAgICAgICBFeHBvcnRlZE5hbWVzU2l6ZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgRGVidWdEaXJlY3RvcnlTaXplOwotICAgIHVuc2lnbmVkIGludCAgICAgICBSZXNlcnZlZFsgMyBdOwotfTsKK3R5cGVkZWYgc3RydWN0IF9JTUFHRV9TRVBBUkFURV9ERUJVR19IRUFERVIgeworCVdPUkQJU2lnbmF0dXJlOworCVdPUkQJRmxhZ3M7CisJV09SRAlNYWNoaW5lOworCVdPUkQJQ2hhcmFjdGVyaXN0aWNzOworCURXT1JECVRpbWVEYXRlU3RhbXA7CisJRFdPUkQJQ2hlY2tTdW07CisJRFdPUkQJSW1hZ2VCYXNlOworCURXT1JECVNpemVPZkltYWdlOworCURXT1JECU51bWJlck9mU2VjdGlvbnM7CisJRFdPUkQJRXhwb3J0ZWROYW1lc1NpemU7CisJRFdPUkQJRGVidWdEaXJlY3RvcnlTaXplOworCURXT1JECVJlc2VydmVkWyAzIF07Cit9IElNQUdFX1NFUEFSQVRFX0RFQlVHX0hFQURFUiwqTFBJTUFHRV9TRVBBUkFURV9ERUJVR19IRUFERVI7CisKKyNkZWZpbmUgSU1BR0VfU0VQQVJBVEVfREVCVUdfU0lHTkFUVVJFIDB4NDk0NAogCiAjZW5kaWYgLyogX19XSU5FX1BFRVhFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVzb3VyY2UuaCBiL2luY2x1ZGUvcmVzb3VyY2UuaAppbmRleCAwODk4ZmVkLi4wMmE2ZGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Jlc291cmNlLmgKKysrIGIvaW5jbHVkZS9yZXNvdXJjZS5oCkBAIC0yMiw2ICsyMiw3IEBACiB0eXBlZGVmIGVudW0KIHsKICAgICBTWVNSRVNfTUVOVV9TWVNNRU5VLAorICAgIFNZU1JFU19NRU5VX0VESVRNRU5VLAogICAgIFNZU1JFU19ESUFMT0dfTVNHQk9YLAogICAgIFNZU1JFU19ESUFMT0dfU0hFTExfQUJPVVRfTVNHQk9YLAogICAgIFNZU1JFU19ESUFMT0dfT1BFTl9GSUxFLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZXNvdXJjZTMyLmggYi9pbmNsdWRlL3Jlc291cmNlMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0YjZhZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3Jlc291cmNlMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBXaW4zMiBmdW5jdGlvbnMsIHN0cnVjdHVyZXMsIGFuZCB0eXBlcyByZWxhdGVkIHRvIHJlc291cmNlcwotICoKLSAqIENvcHlyaWdodCAxOTk1IFRob21hcyBTYW5kZm9yZAotICoKLSAqLwotCi0jaWZuZGVmIF9fV0lORV9SRVNPVVJDRTMyX0gKLSNkZWZpbmUgX19XSU5FX1JFU09VUkNFMzJfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLXR5cGVkZWYgc3RydWN0IF9JTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgewotCURXT1JEIENoYXJhY3RlcmlzdGljczsKLQlEV09SRCBUaW1lRGF0ZVN0YW1wOwotCVdPUkQgTWFqb3JWZXJzaW9uOwotCVdPUkQgTWlub3JWZXJzaW9uOwotCVdPUkQgTnVtYmVyT2ZOYW1lZEVudHJpZXM7Ci0JV09SRCBOdW1iZXJPZklkRW50cmllczsKLX0gSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZLCAqUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWTsKLQotdHlwZWRlZiBzdHJ1Y3QgX0lNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSB7Ci0JRFdPUkQgTmFtZTsKLQlEV09SRCBPZmZzZXRUb0RhdGE7Ci19IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSwgKlBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlk7Ci0KLXR5cGVkZWYgc3RydWN0IF9JTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZIHsKLQlEV09SRCBPZmZzZXRUb0RhdGE7Ci0JRFdPUkQgU2l6ZTsKLQlEV09SRCBDb2RlUGFnZTsKLQlEV09SRCBSZXNlcnZlZDsKLX0gSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSwgKlBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZOwotCi10eXBlZGVmIHN0cnVjdCBfSU1BR0VfUkVTT1VSQ0VfRElSX1NUUklOR19VIHsKLQlXT1JEIExlbmd0aDsKLQlXQ0hBUiBOYW1lU3RyaW5nWzFdOwotfSBJTUFHRV9SRVNPVVJDRV9ESVJfU1RSSU5HX1UsICpQSU1BR0VfUkVTT1VSQ0VfRElSX1NUUklOR19VOwotCi0jZW5kaWYgIC8qIF9fV0lORV9SRVNPVVJDRTMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2lnY29udGV4dC5oIGIvaW5jbHVkZS9zaWdjb250ZXh0LmgKaW5kZXggMjRlNWE1OS4uMTU3YmQ5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaWdjb250ZXh0LmgKKysrIGIvaW5jbHVkZS9zaWdjb250ZXh0LmgKQEAgLTQ0LDYgKzQ0LDExIEBACiB0eXBlZGVmIHN0cnVjdCBzaWdjb250ZXh0IFNJR0NPTlRFWFQ7CiAjZW5kaWYgIC8qIE5ldEJTRCAqLwogCisjaWZkZWYgX19GcmVlQlNEX18KKyNpbmNsdWRlIDxzaWduYWwuaD4KK3R5cGVkZWYgc3RydWN0IHNpZ2NvbnRleHQgU0lHQ09OVEVYVDsKKyNlbmRpZiAgLyogRnJlZUJTRCAqLworCiAjaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2lmZGVmIF9TQ09fRFMKQEAgLTUzLDEyICs1OCwxMiBAQAogdHlwZWRlZiBzdHJ1Y3QgdWNvbnRleHQgU0lHQ09OVEVYVDsKICNlbmRpZiAgLyogc3ZyNCB8fCBTQ09fRFMgKi8KIAotI2lmZGVmIF9fRnJlZUJTRF9fCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci10eXBlZGVmIHN0cnVjdCBzaWdjb250ZXh0IFNJR0NPTlRFWFQ7Ci0jZW5kaWYgIC8qIEZyZWVCU0QgKi8KKyNpZmRlZiBfX0VNWF9fCit0eXBlZGVmIHN0cnVjdCBDT05URVhUUkVDT1JEIFNJR0NPTlRFWFQ7CisjZW5kaWYgIC8qIF9fRU1YX18gKi8KIAotI2lmICFkZWZpbmVkKF9fc3ZyNF9fKSAmJiAhZGVmaW5lZChfU0NPX0RTKQorCisjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCiAjZGVmaW5lIEVBWF9zaWcoY29udGV4dCkgICAgICgoY29udGV4dCktPnNjX2VheCkKICNkZWZpbmUgRUJYX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+c2NfZWJ4KQpAQCAtODgsNyArOTMsOSBAQAogI2RlZmluZSBFSVBfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5zY19laXApCiAjZGVmaW5lIEVTUF9zaWcoY29udGV4dCkgICAgICgoY29udGV4dCktPnNjX2VzcCkKIAotI2Vsc2UgIC8qIF9fc3ZyNF9fIHx8IF9TQ09fRFMgKi8KKyNlbmRpZiAgLyogbGludXggfHwgX19OZXRCU0RfXyB8fCBfX0ZyZWVCU0RfXyAqLworCisjaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQogCiAjaWZkZWYgX1NDT19EUwogI2RlZmluZSBncmVncyByZWdzCkBAIC0xMTgsOCArMTI1LDMxIEBACiAjZWxzZQogI2RlZmluZSBFU1Bfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tFU1BdKQogI2VuZGlmCisKKyNlbmRpZiAgLyogc3ZyNCB8fCBTQ09fRFMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSNlbmRpZiAgLyogX19zdnI0X18gfHwgX1NDT19EUyAqLworI2lmZGVmIF9fRU1YX18KKworI2RlZmluZSBFQVhfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRWF4KQorI2RlZmluZSBFQlhfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRWJ4KQorI2RlZmluZSBFQ1hfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRWN4KQorI2RlZmluZSBFRFhfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRWR4KQorI2RlZmluZSBFU0lfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRXNpKQorI2RlZmluZSBFRElfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRWRpKQorI2RlZmluZSBFQlBfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRWJwKQorI2RlZmluZSBFU1Bfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRXNwKQorI2RlZmluZSBDU19zaWcoY29udGV4dCkgICAgICAoKGNvbnRleHQpLT5jdHhfU2VnQ1MpCisjZGVmaW5lIERTX3NpZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPmN0eF9TZWdEUykKKyNkZWZpbmUgRVNfc2lnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+Y3R4X1NlZ0VTKQorI2RlZmluZSBTU19zaWcoY29udGV4dCkgICAgICAoKGNvbnRleHQpLT5jdHhfU2VnU1MpCisjZGVmaW5lIEZTX3NpZyhjb250ZXh0KSAgICAgICgoY29udGV4dCktPmN0eF9TZWdGUykKKyNkZWZpbmUgR1Nfc2lnKGNvbnRleHQpICAgICAgKChjb250ZXh0KS0+Y3R4X1NlZ0dTKQorI2RlZmluZSBFRkxfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfRUZsYWdzKQorI2RlZmluZSBFSVBfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5jdHhfUmVnRWlwKQorCisjZW5kaWYgIC8qIF9fRU1YX18gKi8KKworLyogR2VuZXJpYyBkZWZpbml0aW9ucyAqLwogCiAjZGVmaW5lIEFYX3NpZyhjb250ZXh0KSAgICAgICgqKFdPUkQqKSZFQVhfc2lnKGNvbnRleHQpKQogI2RlZmluZSBCWF9zaWcoY29udGV4dCkgICAgICAoKihXT1JEKikmRUJYX3NpZyhjb250ZXh0KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luMTZkcnYuaCBiL2luY2x1ZGUvd2luMTZkcnYuaAppbmRleCA2ZWU0OGFmLi5jNmQ3MzQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbjE2ZHJ2LmgKKysrIGIvaW5jbHVkZS93aW4xNmRydi5oCkBAIC0xMTAsMjMgKzExMCw2IEBACiB0eXBlZGVmIHNob3J0IFNIT1JUOyAKIAogI3ByYWdtYSBwYWNrKDEpCi0KLXR5cGVkZWYgc3RydWN0IFRFWFRYRk9STSAKLXsKLSAgICBTSE9SVCAgdHhmSGVpZ2h0OwotICAgIFNIT1JUICB0eGZXaWR0aDsKLSAgICBTSE9SVCAgdHhmRXNjYXBlbWVudDsKLSAgICBTSE9SVCAgdHhmT3JpZW50YXRpb247Ci0gICAgU0hPUlQgIHR4ZldlaWdodDsKLSAgICBDSEFSICAgdHhmSXRhbGljOwotICAgIENIQVIgICB0eGZVbmRlcmxpbmU7Ci0gICAgQ0hBUiAgIHR4ZlN0cmlrZU91dDsKLSAgICBDSEFSICAgdHhmT3V0UHJlY2lzaW9uOwotICAgIENIQVIgICB0eGZDbGlwUHJlY2lzaW9uOwotICAgIFNIT1JUICB0eGZBY2NlbGVyYXRvciBXSU5FX1BBQ0tFRDsKLSAgICBTSE9SVCAgdHhmT3ZlcmhhbmcgV0lORV9QQUNLRUQ7Ci19IFRFWFRYRk9STSwgKkxQVEVYVFhGT1JNOwotCiAjZGVmaW5lIFBDT0xPUiBEV09SRAogdHlwZWRlZiBzdHJ1Y3QgRFJBV01PREUgCiB7CkBAIC0xNDQsNDIgKzEyNyw2IEBACiAgICAgQ09MT1JSRUYgTFRleHRDb2xvcjsgCiB9IERSQVdNT0RFLCAqTFBEUkFXTU9ERTsKIAotdHlwZWRlZiBzdHJ1Y3QgRk9OVElORk8gCi17Ci0gICAgU0hPUlQgZGZUeXBlOwotICAgIFNIT1JUIGRmUG9pbnRzOwotICAgIFNIT1JUIGRmVmVydFJlczsKLSAgICBTSE9SVCBkZkhvcml6UmVzOwotICAgIFNIT1JUIGRmQXNjZW50OwotICAgIFNIT1JUIGRmSW50ZXJuYWxMZWFkaW5nOwotICAgIFNIT1JUIGRmRXh0ZXJuYWxMZWFkaW5nOwotICAgIENIQVIgIGRmSXRhbGljOwotICAgIENIQVIgIGRmVW5kZXJsaW5lOwotICAgIENIQVIgIGRmU3RyaWtlT3V0OwotICAgIFNIT1JUIGRmV2VpZ2h0OwotICAgIENIQVIgIGRmQ0hBUlNldDsKLSAgICBTSE9SVCBkZlBpeFdpZHRoOwotICAgIFNIT1JUIGRmUGl4SGVpZ2h0OwotICAgIENIQVIgIGRmUGl0Y2hBbmRGYW1pbHk7Ci0gICAgU0hPUlQgZGZBdmdXaWR0aDsKLSAgICBTSE9SVCBkZk1heFdpZHRoOwotICAgIENIQVIgIGRmRmlyc3RDSEFSOwotICAgIENIQVIgIGRmTGFzdENIQVI7Ci0gICAgQ0hBUiAgZGZEZWZhdWx0Q0hBUjsKLSAgICBDSEFSICBkZkJyZWFrQ0hBUjsKLSAgICBTSE9SVCBkZldpZHRoQnl0ZXM7Ci0gICAgTE9ORyAgZGZEZXZpY2U7Ci0gICAgTE9ORyAgZGZGYWNlOwotICAgIExPTkcgIGRmQml0c1BvaW50ZXI7Ci0gICAgTE9ORyAgZGZCaXRzT2Zmc2V0OwotICAgIENIQVIgIGRmUmVzZXJ2ZWQ7Ci0gICAgTE9ORyAgZGZGbGFnczsKLSAgICBTSE9SVCBkZkFzcGFjZTsKLSAgICBTSE9SVCBkZkJzcGFjZTsKLSAgICBTSE9SVCBkZkNzcGFjZTsKLSAgICBMT05HICBkZkNvbG9yUG9pbnRlcjsKLSAgICBMT05HICBkZlJlc2VydmVkMVs0XTsKLX0gRk9OVElORk8sICpMUEZPTlRJTkZPOwogCiAjcHJhZ21hIHBhY2soNCkKIApAQCAtMjExLDQgKzE1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTSVpFMzIgc2l6ZSApOwogZXh0ZXJuIEJPT0wzMiBXSU4xNkRSVl9HZXRUZXh0TWV0cmljcyggREMgKmRjLCBURVhUTUVUUklDMzJBICptZXRyaWNzICk7CiAKK2V4dGVybiBCT09MMzIgV0lOMTZEUlZfRXh0VGV4dE91dCggREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LCBVSU5UMzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVDMyICpscHJlY3QsIExQQ1NUUiBzdHIsIFVJTlQzMiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQzMiAqbHBEeCApOwogI2VuZGlmICAvKiBfX1dJTkVfV0lOMTZEUlZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5iYXNlLmggYi9pbmNsdWRlL3dpbmJhc2UuaAppbmRleCA1YjQzMmM3Li5lMjc3MzUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmJhc2UuaAorKysgYi9pbmNsdWRlL3dpbmJhc2UuaApAQCAtNDYsNiArNDYsNyBAQAogCiAvKldJTkFQSSBpbnQgIFNldEVycm9yTW9kZShpbnQpOyovCiAKKyNkZWZpbmUgU1RBVFVTX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAogI2RlZmluZSBTVEFUVVNfV0FJVF8wICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwICAgIAogI2RlZmluZSBTVEFUVVNfQUJBTkRPTkVEX1dBSVRfMCAgICAgICAgICAweDAwMDAwMDgwICAgIAogI2RlZmluZSBTVEFUVVNfVVNFUl9BUEMgICAgICAgICAgICAgICAgICAweDAwMDAwMEMwICAgIApAQCAtNTUsMTAgKzU2LDEyIEBACiAjZGVmaW5lIFNUQVRVU19EQVRBVFlQRV9NSVNBTElHTk1FTlQgICAgIDB4ODAwMDAwMDIgICAgCiAjZGVmaW5lIFNUQVRVU19CUkVBS1BPSU5UICAgICAgICAgICAgICAgIDB4ODAwMDAwMDMgICAgCiAjZGVmaW5lIFNUQVRVU19TSU5HTEVfU1RFUCAgICAgICAgICAgICAgIDB4ODAwMDAwMDQgICAgCisjZGVmaW5lCVNUQVRVU19CVUZGRVJfT1ZFUkZMT1cgICAgICAgICAgIDB4ODAwMDAwMDUKICNkZWZpbmUgU1RBVFVTX0FDQ0VTU19WSU9MQVRJT04gICAgICAgICAgMHhDMDAwMDAwNSAgICAKICNkZWZpbmUgU1RBVFVTX0lOX1BBR0VfRVJST1IgICAgICAgICAgICAgMHhDMDAwMDAwNiAgICAKICNkZWZpbmUgU1RBVFVTX05PX01FTU9SWSAgICAgICAgICAgICAgICAgMHhDMDAwMDAxNyAgICAKICNkZWZpbmUgU1RBVFVTX0lMTEVHQUxfSU5TVFJVQ1RJT04gICAgICAgMHhDMDAwMDAxRCAgICAKKyNkZWZpbmUJU1RBVFVTX0JVRkZFUl9UT09fU01BTEwgICAgICAgICAgMHhDMDAwMDAyMwogI2RlZmluZSBTVEFUVVNfTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OICAweEMwMDAwMDI1ICAgIAogI2RlZmluZSBTVEFUVVNfSU5WQUxJRF9ESVNQT1NJVElPTiAgICAgICAweEMwMDAwMDI2ICAgIAogI2RlZmluZSBTVEFUVVNfQVJSQVlfQk9VTkRTX0VYQ0VFREVEICAgICAweEMwMDAwMDhDICAgIApAQCAtNzIsNiArNzUsNyBAQAogI2RlZmluZSBTVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVSTyAgICAweEMwMDAwMDk0ICAgIAogI2RlZmluZSBTVEFUVVNfSU5URUdFUl9PVkVSRkxPVyAgICAgICAgICAweEMwMDAwMDk1ICAgIAogI2RlZmluZSBTVEFUVVNfUFJJVklMRUdFRF9JTlNUUlVDVElPTiAgICAweEMwMDAwMDk2ICAgIAorI2RlZmluZQlTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMiAgICAgICAweEMwMDAwMEYwCiAjZGVmaW5lIFNUQVRVU19TVEFDS19PVkVSRkxPVyAgICAgICAgICAgIDB4QzAwMDAwRkQgICAgCiAjZGVmaW5lIFNUQVRVU19DT05UUk9MX0NfRVhJVCAgICAgICAgICAgIDB4QzAwMDAxM0EgICAgCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggYTY1NzgyZC4uNGQ3MWNlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTEwODcsNiArMTA4Nyw1OCBAQAogICBEV09SRCBmc0NzYlsyXTsKIH0gRk9OVFNJR05BVFVSRSwqTFBGT05UU0lHTkFUVVJFOwogCit0eXBlZGVmIHN0cnVjdCAKK3sKKyAgICBJTlQxNiAgdHhmSGVpZ2h0OworICAgIElOVDE2ICB0eGZXaWR0aDsKKyAgICBJTlQxNiAgdHhmRXNjYXBlbWVudDsKKyAgICBJTlQxNiAgdHhmT3JpZW50YXRpb247CisgICAgSU5UMTYgIHR4ZldlaWdodDsKKyAgICBDSEFSICAgdHhmSXRhbGljOworICAgIENIQVIgICB0eGZVbmRlcmxpbmU7CisgICAgQ0hBUiAgIHR4ZlN0cmlrZU91dDsKKyAgICBDSEFSICAgdHhmT3V0UHJlY2lzaW9uOworICAgIENIQVIgICB0eGZDbGlwUHJlY2lzaW9uOworICAgIElOVDE2ICB0eGZBY2NlbGVyYXRvciBXSU5FX1BBQ0tFRDsKKyAgICBJTlQxNiAgdHhmT3ZlcmhhbmcgV0lORV9QQUNLRUQ7Cit9IFRFWFRYRk9STTE2LCAqTFBURVhUWEZPUk0xNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJTlQxNiBkZlR5cGU7CisgICAgSU5UMTYgZGZQb2ludHM7CisgICAgSU5UMTYgZGZWZXJ0UmVzOworICAgIElOVDE2IGRmSG9yaXpSZXM7CisgICAgSU5UMTYgZGZBc2NlbnQ7CisgICAgSU5UMTYgZGZJbnRlcm5hbExlYWRpbmc7CisgICAgSU5UMTYgZGZFeHRlcm5hbExlYWRpbmc7CisgICAgQ0hBUiAgZGZJdGFsaWM7CisgICAgQ0hBUiAgZGZVbmRlcmxpbmU7CisgICAgQ0hBUiAgZGZTdHJpa2VPdXQ7CisgICAgSU5UMTYgZGZXZWlnaHQ7CisgICAgQ0hBUiAgZGZDSEFSU2V0OworICAgIElOVDE2IGRmUGl4V2lkdGg7CisgICAgSU5UMTYgZGZQaXhIZWlnaHQ7CisgICAgQ0hBUiAgZGZQaXRjaEFuZEZhbWlseTsKKyAgICBJTlQxNiBkZkF2Z1dpZHRoOworICAgIElOVDE2IGRmTWF4V2lkdGg7CisgICAgQ0hBUiAgZGZGaXJzdENIQVI7CisgICAgQ0hBUiAgZGZMYXN0Q0hBUjsKKyAgICBDSEFSICBkZkRlZmF1bHRDSEFSOworICAgIENIQVIgIGRmQnJlYWtDSEFSOworICAgIElOVDE2IGRmV2lkdGhCeXRlczsKKyAgICBMT05HICBkZkRldmljZTsKKyAgICBMT05HICBkZkZhY2U7CisgICAgTE9ORyAgZGZCaXRzUG9pbnRlcjsKKyAgICBMT05HICBkZkJpdHNPZmZzZXQ7CisgICAgQ0hBUiAgZGZSZXNlcnZlZDsKKyAgICBMT05HICBkZkZsYWdzOworICAgIElOVDE2IGRmQXNwYWNlOworICAgIElOVDE2IGRmQnNwYWNlOworICAgIElOVDE2IGRmQ3NwYWNlOworICAgIExPTkcgIGRmQ29sb3JQb2ludGVyOworICAgIExPTkcgIGRmUmVzZXJ2ZWQxWzRdOworfSBGT05USU5GTzE2LCAqTFBGT05USU5GTzE2OwogCiAgIC8qIGxmV2VpZ2h0IHZhbHVlcyAqLwogI2RlZmluZSBGV19ET05UQ0FSRQkgICAgMApAQCAtNDQzOCw4ICs0NDkwLDggQEAKIH0gQ1NUUklORywqTFBDU1RSSU5HOwogCiB0eXBlZGVmIHN0cnVjdCBfVU5JQ09ERV9TVFJJTkcgewotCVVJTlQxNglMZW5ndGg7CQkvKiBieXRlcyA/ICovCi0JVUlOVDE2CU1heGltdW1MZW5ndGg7CS8qIGJ5dGVzID8gKi8KKwlVSU5UMTYJTGVuZ3RoOwkJLyogYnl0ZXMgKi8KKwlVSU5UMTYJTWF4aW11bUxlbmd0aDsJLyogYnl0ZXMgKi8KIAlMUFdTVFIJQnVmZmVyOwogfSBVTklDT0RFX1NUUklORywqTFBVTklDT0RFX1NUUklORzsKIApAQCAtNDQ0OSw2ICs0NTAxLDEwMiBAQAogI2RlZmluZQlISUdIX1BSSU9SSVRZX0NMQVNTCTB4MDAwMDAwODAKICNkZWZpbmUJUkVBTFRJTUVfUFJJT1JJVFlfQ0xBU1MJMHgwMDAwMDEwMAogCisvKiBHREkgRXNjYXBlIGNvbW1hbmRzICovCisjZGVmaW5lCU5FV0ZSQU1FCQkxCisjZGVmaW5lCUFCT1JURE9DCQkyCisjZGVmaW5lCU5FWFRCQU5ECQkzCisjZGVmaW5lCVNFVENPTE9SVEFCTEUJCTQKKyNkZWZpbmUJR0VUQ09MT1JUQUJMRQkJNQorI2RlZmluZQlGTFVTSE9VVFBVVAkJNgorI2RlZmluZQlEUkFGVE1PREUJCTcKKyNkZWZpbmUJUVVFUllFU0NTVVBQT1JUCQk4CisjZGVmaW5lCVNFVEFCT1JUUFJPQwkJOQorI2RlZmluZQlTVEFSVERPQwkJMTAKKyNkZWZpbmUJRU5ERE9DCQkJMTEKKyNkZWZpbmUJR0VUUEhZU1BBR0VTSVpFCQkxMgorI2RlZmluZQlHRVRQUklOVElOR09GRlNFVAkxMworI2RlZmluZQlHRVRTQ0FMSU5HRkFDVE9SCTE0CisjZGVmaW5lCU1GQ09NTUVOVAkJMTUKKyNkZWZpbmUJR0VUUEVOV0lEVEgJCTE2CisjZGVmaW5lCVNFVENPUFlDT1VOVAkJMTcKKyNkZWZpbmUJU0VMRUNUUEFQRVJTT1VSQ0UJMTgKKyNkZWZpbmUJREVWSUNFREFUQQkJMTkKKyNkZWZpbmUJUEFTU1RIUk9VR0gJCTE5CisjZGVmaW5lCUdFVFRFQ0hOT0xHWQkJMjAKKyNkZWZpbmUJR0VUVEVDSE5PTE9HWQkJMjAgLyogeWVzLCBib3RoIG9mIHRoZW0gKi8KKyNkZWZpbmUJU0VUTElORUNBUAkJMjEKKyNkZWZpbmUJU0VUTElORUpPSU4JCTIyCisjZGVmaW5lCVNFVE1JVEVSTElNSVQJCTIzCisjZGVmaW5lCUJBTkRJTkZPCQkyNAorI2RlZmluZQlEUkFXUEFUVEVSTlJFQ1QJCTI1CisjZGVmaW5lCUdFVFZFQ1RPUlBFTlNJWkUJMjYKKyNkZWZpbmUJR0VUVkVDVE9SQlJVU0hTSVpFCTI3CisjZGVmaW5lCUVOQUJMRURVUExFWAkJMjgKKyNkZWZpbmUJR0VUU0VUUEFQRVJCSU5TCQkyOQorI2RlZmluZQlHRVRTRVRQUklOVE9SSUVOVAkzMAorI2RlZmluZQlFTlVNUEFQRVJCSU5TCQkzMQorI2RlZmluZQlTRVRESUJTQ0FMSU5HCQkzMgorI2RlZmluZQlFUFNQUklOVElORwkJMzMKKyNkZWZpbmUJRU5VTVBBUEVSTUVUUklDUwkzNAorI2RlZmluZQlHRVRTRVRQQVBFUk1FVFJJQ1MJMzUKKyNkZWZpbmUJUE9TVFNDUklQVF9EQVRBCQkzNworI2RlZmluZQlQT1NUU0NSSVBUX0lHTk9SRQkzOAorI2RlZmluZQlNT1VTRVRSQUlMUwkJMzkKKyNkZWZpbmUJR0VUREVWSUNFVU5JVFMJCTQyCisKKyNkZWZpbmUJR0VURVhURU5ERURURVhUTUVUUklDUwkyNTYKKyNkZWZpbmUJR0VURVhURU5UVEFCTEUJCTI1NworI2RlZmluZQlHRVRQQUlSS0VSTlRBQkxFCTI1OAorI2RlZmluZQlHRVRUUkFDS0tFUk5UQUJMRQkyNTkKKyNkZWZpbmUJRVhUVEVYVE9VVAkJNTEyCisjZGVmaW5lCUdFVEZBQ0VOQU1FCQk1MTMKKyNkZWZpbmUJRE9XTkxPQURGQUNFCQk1MTQKKyNkZWZpbmUJRU5BQkxFUkVMQVRJVkVXSURUSFMJNzY4CisjZGVmaW5lCUVOQUJMRVBBSVJLRVJOSU5HCTc2OQorI2RlZmluZQlTRVRLRVJOVFJBQ0sJCTc3MAorI2RlZmluZQlTRVRBTExKVVNUVkFMVUVTCTc3MQorI2RlZmluZQlTRVRDSEFSU0VUCQk3NzIKKworI2RlZmluZQlTVFJFVENIQkxUCQkyMDQ4CisjZGVmaW5lCUdFVFNFVFNDUkVFTlBBUkFNUwkzMDcyCisjZGVmaW5lCVFVRVJZRElCU1VQUE9SVAkJMzA3MworI2RlZmluZQlCRUdJTl9QQVRICQk0MDk2CisjZGVmaW5lCUNMSVBfVE9fUEFUSAkJNDA5NworI2RlZmluZQlFTkRfUEFUSAkJNDA5OAorI2RlZmluZQlFWFRfREVWSUNFX0NBUFMJCTQwOTkKKyNkZWZpbmUJUkVTVE9SRV9DVE0JCTQxMDAKKyNkZWZpbmUJU0FWRV9DVE0JCTQxMDEKKyNkZWZpbmUJU0VUX0FSQ19ESVJFQ1RJT04JNDEwMgorI2RlZmluZQlTRVRfQkFDS0dST1VORF9DT0xPUgk0MTAzCisjZGVmaW5lCVNFVF9QT0xZX01PREUJCTQxMDQKKyNkZWZpbmUJU0VUX1NDUkVFTl9BTkdMRQk0MTA1CisjZGVmaW5lCVNFVF9TUFJFQUQJCTQxMDYKKyNkZWZpbmUJVFJBTlNGT1JNX0NUTQkJNDEwNworI2RlZmluZQlTRVRfQ0xJUF9CT1gJCTQxMDgKKyNkZWZpbmUJU0VUX0JPVU5EUwkJNDEwOQorI2RlZmluZQlTRVRfTUlSUk9SX01PREUJCTQxMTAKKyNkZWZpbmUJT1BFTkNIQU5ORUwJCTQxMTAKKyNkZWZpbmUJRE9XTkxPQURIRUFERVIJCTQxMTEKKyNkZWZpbmUgQ0xPU0VDSEFOTkVMCQk0MTEyCisjZGVmaW5lCVBPU1RTQ1JJUFRfUEFTU1RIUk9VR0gJNDExNQorI2RlZmluZQlFTkNBUFNVTEFURURfUE9TVFNDUklQVAk0MTE2CisKKy8qIEZsYWcgcmV0dXJuZWQgZnJvbSBFc2NhcGUgUVVFUllESUJTVVBQT1JUICovCisjZGVmaW5lCVFESV9TRVRESUJJVFMJCTEKKyNkZWZpbmUJUURJX0dFVERJQklUUwkJMgorI2RlZmluZQlRRElfRElCVE9TQ1JFRU4JCTQKKyNkZWZpbmUJUURJX1NUUkVUQ0hESUIJCTgKKworLyogU3Bvb2xlciBFcnJvciBDb2RlcyAqLworI2RlZmluZQlTUF9OT1RSRVBPUlRFRAkweDQwMDAKKyNkZWZpbmUJU1BfRVJST1IJKC0xKQorI2RlZmluZQlTUF9BUFBBQk9SVAkoLTIpCisjZGVmaW5lCVNQX1VTRVJBQk9SVAkoLTMpCisjZGVmaW5lCVNQX09VVE9GRElTSwkoLTQpCisjZGVmaW5lCVNQX09VVE9GTUVNT1JZCSgtNSkKKworI2RlZmluZSBQUl9KT0JTVEFUVVMJMHgwMDAwCisKICNwcmFnbWEgcGFjayg0KQogCiAvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGV4aXN0IG9ubHkgaW4gV2luMTYgKi8KQEAgLTQ3MjQsOCArNDg3Miw2IEBACiAKIC8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIHRoZSBzYW1lIGluIFdpbjE2IGFuZCBXaW4zMiAqLwogCi1CT09MMTYgICAgIENoZWNrRGxnQnV0dG9uKEhXTkQzMixJTlQzMixVSU5UMzIpOwotQk9PTDE2ICAgICBDaGVja1JhZGlvQnV0dG9uKEhXTkQzMixVSU5UMzIsVUlOVDMyLFVJTlQzMik7CiBIQklUTUFQMTYgIENyZWF0ZUJpdG1hcChJTlQzMixJTlQzMixVSU5UMzIsVUlOVDMyLExQQ1ZPSUQpOwogQk9PTDE2ICAgICBDcmVhdGVDYXJldChIV05EMzIsSEJJVE1BUDMyLElOVDMyLElOVDMyKTsKIEhCSVRNQVAxNiAgQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChIREMzMixJTlQzMixJTlQzMik7CkBAIC00NzM3LDcgKzQ4ODMsNiBAQAogTE9ORyAgICAgICBHZXRCaXRtYXBCaXRzKEhCSVRNQVAzMixMT05HLExQVk9JRCk7CiBXT1JEICAgICAgIEdldENsYXNzV29yZChIV05EMzIsSU5UMzIpOwogRFdPUkQgICAgICBHZXREaWFsb2dCYXNlVW5pdHModm9pZCk7Ci1JTlQxNiAgICAgIEdldERsZ0N0cmxJRChIV05EMzIpOwogRFdPUkQgICAgICBHZXRMYXN0RXJyb3Iodm9pZCk7CiBEV09SRCAgICAgIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zKHZvaWQpOwogQ09MT1JSRUYgICBHZXRTeXNDb2xvcihJTlQzMik7CkBAIC00ODE2LDEyICs0OTYxLDIxIEBACiBCT09MMTYgICAgIEFyYzE2KEhEQzE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2KTsKIEJPT0wzMiAgICAgQXJjMzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOwogI2RlZmluZSAgICBBcmMgV0lORUxJQl9OQU1FKEFyYykKK1VJTlQxNiAgICAgQXJyYW5nZUljb25pY1dpbmRvd3MxNihIV05EMTYpOworVUlOVDMyICAgICBBcnJhbmdlSWNvbmljV2luZG93czMyKEhXTkQzMik7CisjZGVmaW5lICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzIFdJTkVMSUJfTkFNRShBcnJhbmdlSWNvbmljV2luZG93cykKK0hEV1AxNiAgICAgQmVnaW5EZWZlcldpbmRvd1BvczE2KElOVDE2KTsKK0hEV1AzMiAgICAgQmVnaW5EZWZlcldpbmRvd1BvczMyKElOVDMyKTsKKyNkZWZpbmUgICAgQmVnaW5EZWZlcldpbmRvd1BvcyBXSU5FTElCX05BTUUoQmVnaW5EZWZlcldpbmRvd1BvcykKIEhEQzE2ICAgICAgQmVnaW5QYWludDE2KEhXTkQxNixMUFBBSU5UU1RSVUNUMTYpOwogSERDMzIgICAgICBCZWdpblBhaW50MzIoSFdORDMyLExQUEFJTlRTVFJVQ1QzMik7CiAjZGVmaW5lICAgIEJlZ2luUGFpbnQgV0lORUxJQl9OQU1FKEJlZ2luUGFpbnQpCiBCT09MMTYgICAgIEJpdEJsdDE2KEhEQzE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LEhEQzE2LElOVDE2LElOVDE2LERXT1JEKTsKIEJPT0wzMiAgICAgQml0Qmx0MzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSERDMzIsSU5UMzIsSU5UMzIsRFdPUkQpOwogI2RlZmluZSAgICBCaXRCbHQgV0lORUxJQl9OQU1FKEJpdEJsdCkKK0JPT0wxNiAgICAgQnJpbmdXaW5kb3dUb1RvcDE2KEhXTkQxNik7CitCT09MMzIgICAgIEJyaW5nV2luZG93VG9Ub3AzMihIV05EMzIpOworI2RlZmluZSAgICBCcmluZ1dpbmRvd1RvVG9wIFdJTkVMSUJfTkFNRShCcmluZ1dpbmRvd1RvVG9wKQogQk9PTDE2ICAgICBCdWlsZENvbW1EQ0IxNihMUENTVFIsTFBEQ0IxNik7CiBCT09MMzIgICAgIEJ1aWxkQ29tbURDQjMyQShMUENTVFIsTFBEQ0IzMik7CiBCT09MMzIgICAgIEJ1aWxkQ29tbURDQjMyVyhMUENXU1RSLExQRENCMzIpOwpAQCAtNDg3Myw5ICs1MDI3LDE1IEBACiBCT09MMzIgICAgIENoYXJUb09lbUJ1ZmYzMkEoTFBDU1RSLExQU1RSLERXT1JEKTsKIEJPT0wzMiAgICAgQ2hhclRvT2VtQnVmZjMyVyhMUENXU1RSLExQU1RSLERXT1JEKTsKICNkZWZpbmUgICAgQ2hhclRvT2VtQnVmZiBXSU5FTElCX05BTUVfQVcoQ2hhclRvT2VtQnVmZikKK0JPT0wxNiAgICAgQ2hlY2tEbGdCdXR0b24xNihIV05EMTYsSU5UMTYsVUlOVDE2KTsKK0JPT0wzMiAgICAgQ2hlY2tEbGdCdXR0b24zMihIV05EMzIsSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgQ2hlY2tEbGdCdXR0b24gV0lORUxJQl9OQU1FKENoZWNrRGxnQnV0dG9uKQogQk9PTDE2ICAgICBDaGVja01lbnVJdGVtMTYoSE1FTlUxNixVSU5UMTYsVUlOVDE2KTsKIERXT1JEICAgICAgQ2hlY2tNZW51SXRlbTMyKEhNRU5VMzIsVUlOVDMyLFVJTlQzMik7CiAjZGVmaW5lICAgIENoZWNrTWVudUl0ZW0gV0lORUxJQl9OQU1FKENoZWNrTWVudUl0ZW0pCitCT09MMTYgICAgIENoZWNrUmFkaW9CdXR0b24xNihIV05EMTYsVUlOVDE2LFVJTlQxNixVSU5UMTYpOworQk9PTDMyICAgICBDaGVja1JhZGlvQnV0dG9uMzIoSFdORDMyLFVJTlQzMixVSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgQ2hlY2tSYWRpb0J1dHRvbiBXSU5FTElCX05BTUUoQ2hlY2tSYWRpb0J1dHRvbikKIEhXTkQxNiAgICAgQ2hpbGRXaW5kb3dGcm9tUG9pbnQxNihIV05EMTYsUE9JTlQxNik7CiBIV05EMzIgICAgIENoaWxkV2luZG93RnJvbVBvaW50MzIoSFdORDMyLFBPSU5UMzIpOwogI2RlZmluZSAgICBDaGlsZFdpbmRvd0Zyb21Qb2ludCBXSU5FTElCX05BTUUoQ2hpbGRXaW5kb3dGcm9tUG9pbnQpCkBAIC01MDM3LDYgKzUxOTcsOSBAQAogTFJFU1VMVCAgICBEZWZEbGdQcm9jMzJBKEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKIExSRVNVTFQgICAgRGVmRGxnUHJvYzMyVyhIV05EMzIsVUlOVDMyLFdQQVJBTTMyLExQQVJBTSk7CiAjZGVmaW5lICAgIERlZkRsZ1Byb2MgV0lORUxJQl9OQU1FX0FXKERlZkRsZ1Byb2MpCitIRFdQMTYgICAgIERlZmVyV2luZG93UG9zMTYoSERXUDE2LEhXTkQxNixIV05EMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsVUlOVDE2KTsKK0hEV1AzMiAgICAgRGVmZXJXaW5kb3dQb3MzMihIRFdQMzIsSFdORDMyLEhXTkQzMixJTlQzMixJTlQzMixJTlQzMixJTlQzMixVSU5UMzIpOworI2RlZmluZSAgICBEZWZlcldpbmRvd1BvcyBXSU5FTElCX05BTUUoRGVmZXJXaW5kb3dQb3MpCiBMUkVTVUxUICAgIERlZkZyYW1lUHJvYzE2KEhXTkQxNixIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CiBMUkVTVUxUICAgIERlZkZyYW1lUHJvYzMyQShIV05EMzIsSFdORDMyLFVJTlQzMixXUEFSQU0zMixMUEFSQU0pOwogTFJFU1VMVCAgICBEZWZGcmFtZVByb2MzMlcoSFdORDMyLEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKQEAgLTUwNzIsNiArNTIzNSw5IEBACiBCT09MMTYgICAgIERlc3Ryb3lNZW51MTYoSE1FTlUxNik7CiBCT09MMzIgICAgIERlc3Ryb3lNZW51MzIoSE1FTlUzMik7CiAjZGVmaW5lICAgIERlc3Ryb3lNZW51IFdJTkVMSUJfTkFNRShEZXN0cm95TWVudSkKK0JPT0wxNiAgICAgRGVzdHJveVdpbmRvdzE2KEhXTkQxNik7CitCT09MMzIgICAgIERlc3Ryb3lXaW5kb3czMihIV05EMzIpOworI2RlZmluZSAgICBEZXN0cm95V2luZG93IFdJTkVMSUJfTkFNRShEZXN0cm95V2luZG93KQogSU5UMTYgICAgICBEaWFsb2dCb3gxNihISU5TVEFOQ0UxNixTRUdQVFIsSFdORDE2LERMR1BST0MxNik7CiAjZGVmaW5lICAgIERpYWxvZ0JveDMyQShpbnN0LHRlbXBsYXRlLG93bmVyLGZ1bmMpIFwKICAgICAgICAgICAgRGlhbG9nQm94UGFyYW0zMkEoaW5zdCx0ZW1wbGF0ZSxvd25lcixmdW5jLDApCkBAIC01MTM2LDYgKzUzMDIsMTIgQEAKIEJPT0wxNiAgICAgRW5hYmxlU2Nyb2xsQmFyMTYoSFdORDE2LElOVDE2LFVJTlQxNik7CiBCT09MMzIgICAgIEVuYWJsZVNjcm9sbEJhcjMyKEhXTkQzMixJTlQzMixVSU5UMzIpOwogI2RlZmluZSAgICBFbmFibGVTY3JvbGxCYXIgV0lORUxJQl9OQU1FKEVuYWJsZVNjcm9sbEJhcikKK0JPT0wxNiAgICAgRW5hYmxlV2luZG93MTYoSFdORDE2LEJPT0wxNik7CitCT09MMzIgICAgIEVuYWJsZVdpbmRvdzMyKEhXTkQzMixCT09MMzIpOworI2RlZmluZSAgICBFbmFibGVXaW5kb3cgV0lORUxJQl9OQU1FKEVuYWJsZVdpbmRvdykKK0JPT0wxNiAgICAgRW5kRGVmZXJXaW5kb3dQb3MxNihIRFdQMTYpOworQk9PTDMyICAgICBFbmREZWZlcldpbmRvd1BvczMyKEhEV1AzMik7CisjZGVmaW5lICAgIEVuZERlZmVyV2luZG93UG9zIFdJTkVMSUJfTkFNRShFbmREZWZlcldpbmRvd1BvcykKIEJPT0wxNiAgICAgRW5kUGFpbnQxNihIV05EMTYsY29uc3QgUEFJTlRTVFJVQ1QxNiopOwogQk9PTDMyICAgICBFbmRQYWludDMyKEhXTkQzMixjb25zdCBQQUlOVFNUUlVDVDMyKik7CiAjZGVmaW5lICAgIEVuZFBhaW50IFdJTkVMSUJfTkFNRShFbmRQYWludCkKQEAgLTUxNzQsNiArNTM0Niw5IEBACiBCT09MMTYgICAgIEVxdWFsUmduMTYoSFJHTjE2LEhSR04xNik7CiBCT09MMzIgICAgIEVxdWFsUmduMzIoSFJHTjMyLEhSR04zMik7CiAjZGVmaW5lICAgIEVxdWFsUmduIFdJTkVMSUJfTkFNRShFcXVhbFJnbikKK0lOVDE2ICAgICAgRXNjYXBlMTYoSERDMTYsSU5UMTYsSU5UMTYsU0VHUFRSLFNFR1BUUik7CitJTlQzMiAgICAgIEVzY2FwZTMyKEhEQzMyLElOVDMyLElOVDMyLExQVk9JRCxMUFZPSUQpOworI2RlZmluZSAgICBFc2NhcGUgV0lORUxJQl9OQU1FKEVzY2FwZSkKIExPTkcgICAgICAgRXNjYXBlQ29tbUZ1bmN0aW9uMTYoVUlOVDE2LFVJTlQxNik7CiBCT09MMzIgICAgIEVzY2FwZUNvbW1GdW5jdGlvbjMyKElOVDMyLFVJTlQzMik7CiAjZGVmaW5lICAgIEVzY2FwZUNvbW1GdW5jdGlvbiBXSU5FTElCX05BTUUoRXNjYXBlQ29tbUZ1bmN0aW9uKQpAQCAtNTI0MSw2ICs1NDE2LDkgQEAKIEJPT0wxNiAgICAgRnJlZVJlc291cmNlMTYoSEdMT0JBTDE2KTsKIEJPT0wzMiAgICAgRnJlZVJlc291cmNlMzIoSEdMT0JBTDMyKTsKICNkZWZpbmUgICAgRnJlZVJlc291cmNlIFdJTkVMSUJfTkFNRShGcmVlUmVzb3VyY2UpCitIV05EMTYgICAgIEdldEFjdGl2ZVdpbmRvdzE2KHZvaWQpOworSFdORDMyICAgICBHZXRBY3RpdmVXaW5kb3czMih2b2lkKTsKKyNkZWZpbmUgICAgR2V0QWN0aXZlV2luZG93IFdJTkVMSUJfTkFNRShHZXRBY3RpdmVXaW5kb3cpCiBCT09MMTYgICAgIEdldEJpdG1hcERpbWVuc2lvbkV4MTYoSEJJVE1BUDE2LExQU0laRTE2KTsKIEJPT0wzMiAgICAgR2V0Qml0bWFwRGltZW5zaW9uRXgzMihIQklUTUFQMzIsTFBTSVpFMzIpOwogI2RlZmluZSAgICBHZXRCaXRtYXBEaW1lbnNpb25FeCBXSU5FTElCX05BTUUoR2V0Qml0bWFwRGltZW5zaW9uRXgpCkBAIC01MzI3LDYgKzU1MDUsMTUgQEAKIEJPT0wzMiAgICAgR2V0RGlza0ZyZWVTcGFjZTMyQShMUENTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCk7CiBCT09MMzIgICAgIEdldERpc2tGcmVlU3BhY2UzMlcoTFBDV1NUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JEKTsKICNkZWZpbmUgICAgR2V0RGlza0ZyZWVTcGFjZSBXSU5FTElCX05BTUVfQVcoR2V0RGlza0ZyZWVTcGFjZSkKK0lOVDE2ICAgICAgR2V0RGxnQ3RybElEMTYoSFdORDE2KTsKK0lOVDMyICAgICAgR2V0RGxnQ3RybElEMzIoSFdORDMyKTsKKyNkZWZpbmUgICAgR2V0RGxnQ3RybElEIFdJTkVMSUJfTkFNRShHZXREbGdDdHJsSUQpCitIV05EMTYgICAgIEdldERsZ0l0ZW0xNihIV05EMTYsSU5UMTYpOworSFdORDMyICAgICBHZXREbGdJdGVtMzIoSFdORDMyLElOVDMyKTsKKyNkZWZpbmUgICAgR2V0RGxnSXRlbSBXSU5FTElCX05BTUUoR2V0RGxnSXRlbSkKK1VJTlQxNiAgICAgR2V0RGxnSXRlbUludDE2KEhXTkQxNixJTlQxNixCT09MMTYqLEJPT0wxNik7CitVSU5UMzIgICAgIEdldERsZ0l0ZW1JbnQzMihIV05EMzIsSU5UMzIsQk9PTDMyKixCT09MMzIpOworI2RlZmluZSAgICBHZXREbGdJdGVtSW50IFdJTkVMSUJfTkFNRShHZXREbGdJdGVtSW50KQogSU5UMTYgICAgICBHZXREbGdJdGVtVGV4dDE2KEhXTkQxNixJTlQxNixTRUdQVFIsVUlOVDE2KTsKIElOVDMyICAgICAgR2V0RGxnSXRlbVRleHQzMkEoSFdORDMyLElOVDMyLExQU1RSLFVJTlQzMik7CiBJTlQzMiAgICAgIEdldERsZ0l0ZW1UZXh0MzJXKEhXTkQzMixJTlQzMixMUFdTVFIsVUlOVDMyKTsKQEAgLTUzOTMsNiArNTU4MCw5IEBACiBIV05EMTYgICAgIEdldE5leHREbGdUYWJJdGVtMTYoSFdORDE2LEhXTkQxNixCT09MMTYpOwogSFdORDMyICAgICBHZXROZXh0RGxnVGFiSXRlbTMyKEhXTkQzMixIV05EMzIsQk9PTDMyKTsKICNkZWZpbmUgICAgR2V0TmV4dERsZ1RhYkl0ZW0gV0lORUxJQl9OQU1FKEdldE5leHREbGdUYWJJdGVtKQorSFdORDE2ICAgICBHZXROZXh0V2luZG93MTYoSFdORDE2LFdPUkQpOworI2RlZmluZSAgICBHZXROZXh0V2luZG93MzIgR2V0V2luZG93MzIKKyNkZWZpbmUgICAgR2V0TmV4dFdpbmRvdyBXSU5FTElCX05BTUUoR2V0TmV4dFdpbmRvdykKIElOVDE2ICAgICAgR2V0T2JqZWN0MTYoSEFORExFMTYsSU5UMTYsTFBWT0lEKTsKIElOVDMyICAgICAgR2V0T2JqZWN0MzJBKEhBTkRMRTMyLElOVDMyLExQVk9JRCk7CiBJTlQzMiAgICAgIEdldE9iamVjdDMyVyhIQU5ETEUzMixJTlQzMixMUFZPSUQpOwpAQCAtNTQ5Nyw2ICs1Njg3LDkgQEAKIEJPT0wzMiAgICAgR2V0VGV4dE1ldHJpY3MzMkEoSERDMzIsTFBURVhUTUVUUklDMzJBKTsKIEJPT0wzMiAgICAgR2V0VGV4dE1ldHJpY3MzMlcoSERDMzIsTFBURVhUTUVUUklDMzJXKTsKICNkZWZpbmUgICAgR2V0VGV4dE1ldHJpY3MgV0lORUxJQl9OQU1FX0FXKEdldFRleHRNZXRyaWNzKQorSFdORDE2ICAgICBHZXRUb3BXaW5kb3cxNihIV05EMTYpOworSFdORDMyICAgICBHZXRUb3BXaW5kb3czMihIV05EMzIpOworI2RlZmluZSAgICBHZXRUb3BXaW5kb3cgV0lORUxJQl9OQU1FKEdldFRvcFdpbmRvdykKIEJPT0wxNiAgICAgR2V0VXBkYXRlUmVjdDE2KEhXTkQxNixMUFJFQ1QxNixCT09MMTYpOwogQk9PTDMyICAgICBHZXRVcGRhdGVSZWN0MzIoSFdORDMyLExQUkVDVDMyLEJPT0wzMik7CiAjZGVmaW5lICAgIEdldFVwZGF0ZVJlY3QgV0lORUxJQl9OQU1FKEdldFVwZGF0ZVJlY3QpCkBAIC01NTEyLDYgKzU3MDUsOSBAQAogQk9PTDMyICAgICBHZXRWb2x1bWVJbmZvcm1hdGlvbjMyQShMUENTVFIsTFBTVFIsRFdPUkQsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBTVFIsRFdPUkQpOwogQk9PTDMyICAgICBHZXRWb2x1bWVJbmZvcm1hdGlvbjMyVyhMUENXU1RSLExQV1NUUixEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUFdTVFIsRFdPUkQpOwogI2RlZmluZSAgICBHZXRWb2x1bWVJbmZvcm1hdGlvbiBXSU5FTElCX05BTUVfQVcoR2V0Vm9sdW1lSW5mb3JtYXRpb24pCitIV05EMTYgICAgIEdldFdpbmRvdzE2KEhXTkQxNixXT1JEKTsKK0hXTkQzMiAgICAgR2V0V2luZG93MzIoSFdORDMyLFdPUkQpOworI2RlZmluZSAgICBHZXRXaW5kb3cgV0lORUxJQl9OQU1FKEdldFdpbmRvdykKIEhEQzE2ICAgICAgR2V0V2luZG93REMxNihIV05EMTYpOwogSERDMzIgICAgICBHZXRXaW5kb3dEQzMyKEhXTkQzMik7CiAjZGVmaW5lICAgIEdldFdpbmRvd0RDIFdJTkVMSUJfTkFNRShHZXRXaW5kb3dEQykKQEAgLTU2NDgsMTUgKzU4NDQsMzMgQEAKIEJPT0wzMiAgICAgSXNDaGFyVXBwZXIzMkEoQ0hBUik7CiBCT09MMzIgICAgIElzQ2hhclVwcGVyMzJXKFdDSEFSKTsKICNkZWZpbmUgICAgSXNDaGFyVXBwZXIgV0lORUxJQl9OQU1FX0FXKElzQ2hhclVwcGVyKQorQk9PTDE2ICAgICBJc0NoaWxkMTYoSFdORDE2LEhXTkQxNik7CitCT09MMzIgICAgIElzQ2hpbGQzMihIV05EMzIsSFdORDMyKTsKKyNkZWZpbmUgICAgSXNDaGlsZCBXSU5FTElCX05BTUUoSXNDaGlsZCkKIEJPT0wxNiAgICAgSXNEQkNTTGVhZEJ5dGUxNihCWVRFKTsKIEJPT0wzMiAgICAgSXNEQkNTTGVhZEJ5dGUzMihCWVRFKTsKICNkZWZpbmUgICAgSXNEQkNTTGVhZEJ5dGUgV0lORUxJQl9OQU1FKElzREJDU0xlYWRCeXRlKQorVUlOVDE2ICAgICBJc0RsZ0J1dHRvbkNoZWNrZWQxNihIV05EMTYsVUlOVDE2KTsKK1VJTlQzMiAgICAgSXNEbGdCdXR0b25DaGVja2VkMzIoSFdORDMyLFVJTlQzMik7CisjZGVmaW5lICAgIElzRGxnQnV0dG9uQ2hlY2tlZCBXSU5FTElCX05BTUUoSXNEbGdCdXR0b25DaGVja2VkKQorQk9PTDE2ICAgICBJc0ljb25pYzE2KEhXTkQxNik7CitCT09MMzIgICAgIElzSWNvbmljMzIoSFdORDMyKTsKKyNkZWZpbmUgICAgSXNJY29uaWMgV0lORUxJQl9OQU1FKElzSWNvbmljKQogQk9PTDE2ICAgICBJc01lbnUxNihITUVOVTE2KTsKIEJPT0wzMiAgICAgSXNNZW51MzIoSE1FTlUzMik7CiAjZGVmaW5lICAgIElzTWVudSBXSU5FTElCX05BTUUoSXNNZW51KQogQk9PTDE2ICAgICBJc1JlY3RFbXB0eTE2KGNvbnN0IFJFQ1QxNiopOwogQk9PTDMyICAgICBJc1JlY3RFbXB0eTMyKGNvbnN0IFJFQ1QzMiopOwogI2RlZmluZSAgICBJc1JlY3RFbXB0eSBXSU5FTElCX05BTUUoSXNSZWN0RW1wdHkpCitCT09MMTYgICAgIElzV2luZG93RW5hYmxlZDE2KEhXTkQxNik7CitCT09MMzIgICAgIElzV2luZG93RW5hYmxlZDMyKEhXTkQzMik7CisjZGVmaW5lICAgIElzV2luZG93RW5hYmxlZCBXSU5FTElCX05BTUUoSXNXaW5kb3dFbmFibGVkKQorQk9PTDE2ICAgICBJc1dpbmRvd1Zpc2libGUxNihIV05EMTYpOworQk9PTDMyICAgICBJc1dpbmRvd1Zpc2libGUzMihIV05EMzIpOworI2RlZmluZSAgICBJc1dpbmRvd1Zpc2libGUgV0lORUxJQl9OQU1FKElzV2luZG93VmlzaWJsZSkKK0JPT0wxNiAgICAgSXNab29tZWQxNihIV05EMTYpOworQk9PTDMyICAgICBJc1pvb21lZDMyKEhXTkQzMik7CisjZGVmaW5lICAgIElzWm9vbWVkIFdJTkVMSUJfTkFNRShJc1pvb21lZCkKIEJPT0wxNiAgICAgS2lsbFN5c3RlbVRpbWVyMTYoSFdORDE2LFVJTlQxNik7CiBCT09MMzIgICAgIEtpbGxTeXN0ZW1UaW1lcjMyKEhXTkQzMixVSU5UMzIpOwogI2RlZmluZSAgICBLaWxsU3lzdGVtVGltZXIgV0lORUxJQl9OQU1FKEtpbGxTeXN0ZW1UaW1lcikKQEAgLTU3ODUsNiArNTk5OSw5IEBACiBCT09MMTYgICAgIE1vdmVUb0V4MTYoSERDMTYsSU5UMTYsSU5UMTYsTFBQT0lOVDE2KTsKIEJPT0wzMiAgICAgTW92ZVRvRXgzMihIREMzMixJTlQzMixJTlQzMixMUFBPSU5UMzIpOwogI2RlZmluZSAgICBNb3ZlVG9FeCBXSU5FTElCX05BTUUoTW92ZVRvRXgpCitCT09MMTYgICAgIE1vdmVXaW5kb3cxNihIV05EMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsQk9PTDE2KTsKK0JPT0wzMiAgICAgTW92ZVdpbmRvdzMyKEhXTkQzMixJTlQzMixJTlQzMixJTlQzMixJTlQzMixCT09MMzIpOworI2RlZmluZSAgICBNb3ZlV2luZG93IFdJTkVMSUJfTkFNRShNb3ZlV2luZG93KQogSU5UMTYgICAgICBNdWxEaXYxNihJTlQxNixJTlQxNixJTlQxNik7CiBJTlQzMiAgICAgIE11bERpdjMyKElOVDMyLElOVDMyLElOVDMyKTsKICNkZWZpbmUgICAgTXVsRGl2IFdJTkVMSUJfTkFNRShNdWxEaXYpCkBAIC01OTg4LDYgKzYyMDUsOSBAQAogTFJFU1VMVCAgICBTZW5kTWVzc2FnZTMyQShIV05EMzIsVUlOVDMyLFdQQVJBTTMyLExQQVJBTSk7CiBMUkVTVUxUICAgIFNlbmRNZXNzYWdlMzJXKEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKICNkZWZpbmUgICAgU2VuZE1lc3NhZ2UgV0lORUxJQl9OQU1FX0FXKFNlbmRNZXNzYWdlKQorSFdORDE2ICAgICBTZXRBY3RpdmVXaW5kb3cxNihIV05EMTYpOworSFdORDMyICAgICBTZXRBY3RpdmVXaW5kb3czMihIV05EMzIpOworI2RlZmluZSAgICBTZXRBY3RpdmVXaW5kb3cgV0lORUxJQl9OQU1FKFNldEFjdGl2ZVdpbmRvdykKIEJPT0wxNiAgICAgU2V0Qml0bWFwRGltZW5zaW9uRXgxNihIQklUTUFQMTYsSU5UMTYsSU5UMTYsTFBTSVpFMTYpOwogQk9PTDMyICAgICBTZXRCaXRtYXBEaW1lbnNpb25FeDMyKEhCSVRNQVAzMixJTlQzMixJTlQzMixMUFNJWkUzMik7CiAjZGVmaW5lICAgIFNldEJpdG1hcERpbWVuc2lvbkV4IFdJTkVMSUJfTkFNRShTZXRCaXRtYXBEaW1lbnNpb25FeCkKQEAgLTYxMjksNiArNjM0OSw5IEBACiBISE9PSyAgICAgIFNldFdpbmRvd3NIb29rRXgzMkEoSU5UMzIsSE9PS1BST0MzMixISU5TVEFOQ0UzMixEV09SRCk7CiBISE9PSyAgICAgIFNldFdpbmRvd3NIb29rRXgzMlcoSU5UMzIsSE9PS1BST0MzMixISU5TVEFOQ0UzMixEV09SRCk7CiAjZGVmaW5lICAgIFNldFdpbmRvd3NIb29rRXggV0lORUxJQl9OQU1FX0FXKFNldFdpbmRvd3NIb29rRXgpCitCT09MMTYgICAgIFNldFdpbmRvd1BvczE2KEhXTkQxNixIV05EMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsV09SRCk7CitCT09MMzIgICAgIFNldFdpbmRvd1BvczMyKEhXTkQzMixIV05EMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsV09SRCk7CisjZGVmaW5lICAgIFNldFdpbmRvd1BvcyBXSU5FTElCX05BTUUoU2V0V2luZG93UG9zKQogdm9pZCAgICAgICBTZXRXaW5kb3dUZXh0MTYoSFdORDE2LFNFR1BUUik7CiB2b2lkICAgICAgIFNldFdpbmRvd1RleHQzMkEoSFdORDMyLExQQ1NUUik7CiB2b2lkICAgICAgIFNldFdpbmRvd1RleHQzMlcoSFdORDMyLExQQ1dTVFIpOwpAQCAtNjE0MCw2ICs2MzYzLDkgQEAKIHZvaWQgICAgICAgU2hvd1Njcm9sbEJhcjE2KEhXTkQxNixJTlQxNixCT09MMTYpOwogQk9PTDMyICAgICBTaG93U2Nyb2xsQmFyMzIoSFdORDMyLElOVDMyLEJPT0wzMik7CiAjZGVmaW5lICAgIFNob3dTY3JvbGxCYXIgV0lORUxJQl9OQU1FKFNob3dTY3JvbGxCYXIpCitCT09MMTYgICAgIFNob3dXaW5kb3cxNihIV05EMTYsSU5UMTYpOworQk9PTDMyICAgICBTaG93V2luZG93MzIoSFdORDMyLElOVDMyKTsKKyNkZWZpbmUgICAgU2hvd1dpbmRvdyBXSU5FTElCX05BTUUoU2hvd1dpbmRvdykKIEJPT0wxNiAgICAgU3RyZXRjaEJsdDE2KEhEQzE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LEhEQzE2LElOVDE2LElOVDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYsSU5UMTYsRFdPUkQpOwogQk9PTDMyICAgICBTdHJldGNoQmx0MzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSERDMzIsSU5UMzIsSU5UMzIsCkBAIC02MTk2LDkgKzY0MjIsOSBAQAogRFdPUkQgICAgICBWZXJGaW5kRmlsZTMyQShVSU5UMzIsTFBDU1RSLExQQ1NUUixMUENTVFIsTFBTVFIsVUlOVDMyKixMUFNUUixVSU5UMzIqKTsKIERXT1JEICAgICAgVmVyRmluZEZpbGUzMlcoVUlOVDMyLExQQ1dTVFIsTFBDV1NUUixMUENXU1RSLExQV1NUUixVSU5UMzIqLExQV1NUUixVSU5UMzIqKTsKICNkZWZpbmUgICAgVmVyRmluZEZpbGUgV0lORUxJQl9OQU1FX0FXKFZlckZpbmRGaWxlKQotRFdPUkQgICAgICBWZXJJbnN0YWxsRmlsZTE2KFVJTlQxNixMUENTVFIsTFBDU1RSLExQQ1NUUixMUENTVFIsTFBTVFIsVUlOVDE2Kik7Ci1EV09SRCAgICAgIFZlckluc3RhbGxGaWxlMzJBKFVJTlQzMixMUENTVFIsTFBDU1RSLExQQ1NUUixMUENTVFIsTFBTVFIsVUlOVDMyKik7Ci1EV09SRCAgICAgIFZlckluc3RhbGxGaWxlMzJXKFVJTlQzMixMUENXU1RSLExQQ1dTVFIsTFBDV1NUUixMUENXU1RSLExQV1NUUixVSU5UMzIqKTsKK0RXT1JEICAgICAgVmVySW5zdGFsbEZpbGUxNihVSU5UMTYsTFBDU1RSLExQQ1NUUixMUENTVFIsTFBDU1RSLExQQ1NUUixMUFNUUixVSU5UMTYqKTsKK0RXT1JEICAgICAgVmVySW5zdGFsbEZpbGUzMkEoVUlOVDMyLExQQ1NUUixMUENTVFIsTFBDU1RSLExQQ1NUUixMUENTVFIsTFBTVFIsVUlOVDMyKik7CitEV09SRCAgICAgIFZlckluc3RhbGxGaWxlMzJXKFVJTlQzMixMUENXU1RSLExQQ1dTVFIsTFBDV1NUUixMUENXU1RSLExQQ1dTVFIsTFBXU1RSLFVJTlQzMiopOwogI2RlZmluZSAgICBWZXJJbnN0YWxsRmlsZSBXSU5FTElCX05BTUVfQVcoVmVySW5zdGFsbEZpbGUpCiBEV09SRCAgICAgIFZlckxhbmd1YWdlTmFtZTE2KFVJTlQxNixMUFNUUixVSU5UMTYpOwogRFdPUkQgICAgICBWZXJMYW5ndWFnZU5hbWUzMkEoVUlOVDMyLExQU1RSLFVJTlQzMik7CkBAIC02MzQ1LDkgKzY1NzEsNiBAQAogSU5UICAgICAgICBBZGRGb250UmVzb3VyY2UoTFBDU1RSKTsKIEJPT0wgICAgICAgQW5pbWF0ZVBhbGV0dGUoSFBBTEVUVEUxNixVSU5ULFVJTlQsTFBQQUxFVFRFRU5UUlkpOwogQk9PTCAgICAgICBBbnlQb3B1cCh2b2lkKTsKLVVJTlQgICAgICAgQXJyYW5nZUljb25pY1dpbmRvd3MoSFdORCk7Ci1IRFdQMTYgICAgIEJlZ2luRGVmZXJXaW5kb3dQb3MoSU5UKTsKLUJPT0wgICAgICAgQnJpbmdXaW5kb3dUb1RvcChIV05EKTsKIHZvaWQgICAgICAgQ2FsY0NoaWxkU2Nyb2xsKEhXTkQsV09SRCk7CiBCT09MICAgICAgIENhbGxNc2dGaWx0ZXIoU0VHUFRSLElOVCk7CiBCT09MICAgICAgIENsb3NlQ2xpcGJvYXJkKHZvaWQpOwpAQCAtNjM2MSwyMiArNjU4NCwxNyBAQAogSEdMT0JBTDE2ICBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoSElOU1RBTkNFMTYsQ1VSU09SSUNPTklORk8qLGNvbnN0IEJZVEUqLGNvbnN0IEJZVEUqKTsKIEhJQ09OMTYgICAgQ3JlYXRlSWNvbihISU5TVEFOQ0UxNixJTlQsSU5ULEJZVEUsQllURSxjb25zdCBCWVRFKixjb25zdCBCWVRFKik7CiBIUEFMRVRURTE2IENyZWF0ZVBhbGV0dGUoY29uc3QgTE9HUEFMRVRURSopOwotSERXUDE2ICAgICBEZWZlcldpbmRvd1BvcyhIRFdQMTYsSFdORCxIV05ELElOVCxJTlQsSU5ULElOVCxVSU5UKTsKIEFUT00gICAgICAgRGVsZXRlQXRvbShBVE9NKTsKIEJPT0wgICAgICAgRGVzdHJveUN1cnNvcihIQ1VSU09SMTYpOwogQk9PTCAgICAgICBEZXN0cm95SWNvbihISUNPTjE2KTsKLUJPT0wgICAgICAgRGVzdHJveVdpbmRvdyhIV05EKTsKIExPTkcgICAgICAgRGlzcGF0Y2hNZXNzYWdlKGNvbnN0IE1TRzE2Kik7CiBCT09MMTYgICAgIERyYWdEZXRlY3QoSFdORDE2LFBPSU5UMTYpOwogRFdPUkQgICAgICBEcmFnT2JqZWN0KEhXTkQsIEhXTkQsIFdPUkQsIEhBTkRMRTE2LCBXT1JELCBIQ1VSU09SMTYpOwogQk9PTCAgICAgICBEcmF3SWNvbihIREMxNixJTlQsSU5ULEhJQ09OMTYpOwogRFdPUkQgICAgICBEdW1wSWNvbihTRUdQVFIsV09SRCosU0VHUFRSKixTRUdQVFIqKTsKIEJPT0wgICAgICAgRW1wdHlDbGlwYm9hcmQodm9pZCk7Ci1CT09MICAgICAgIEVuYWJsZVdpbmRvdyhIV05ELEJPT0wpOwotQk9PTCAgICAgICBFbmREZWZlcldpbmRvd1BvcyhIRFdQMTYpOwogVUlOVDE2ICAgICBFbnVtQ2xpcGJvYXJkRm9ybWF0cyhVSU5UMTYpOwogQk9PTCAgICAgICBFbnVtTWV0YUZpbGUoSERDMTYsSE1FVEFGSUxFMTYsTUZFTlVNUFJPQzE2LExQQVJBTSk7Ci1JTlQgICAgICAgIEVzY2FwZShIREMxNixJTlQsSU5ULFNFR1BUUixTRUdQVFIpOwogSElDT04xNiAgICBFeHRyYWN0SWNvbihISU5TVEFOQ0UxNixMUENTVFIsV09SRCk7CiB2b2lkICAgICAgIEZhdGFsRXhpdChpbnQpOwogQVRPTSAgICAgICBGaW5kQXRvbShTRUdQVFIpOwpAQCAtNjM4NSw3ICs2NjAzLDYgQEAKIHZvaWQgICAgICAgRnJlZUxpYnJhcnkoSElOU1RBTkNFMTYpOwogVUlOVCAgICAgICBHRElSZWFsaXplUGFsZXR0ZShIREMxNik7CiBIUEFMRVRURTE2IEdESVNlbGVjdFBhbGV0dGUoSERDMTYsSFBBTEVUVEUxNixXT1JEKTsKLUhXTkQgICAgICAgR2V0QWN0aXZlV2luZG93KHZvaWQpOwogRFdPUkQgICAgICBHZXRBc3BlY3RSYXRpb0ZpbHRlcihIREMxNik7CiBpbnQgICAgICAgIEdldEFzeW5jS2V5U3RhdGUoaW50KTsKIFdPUkQgICAgICAgR2V0QXRvbU5hbWUoQVRPTSxMUFNUUixzaG9ydCk7CkBAIC02Mzk4LDggKzY2MTUsNiBAQAogSENVUlNPUjE2ICBHZXRDdXJzb3Iodm9pZCk7CiBTRUdQVFIgICAgIEdldERPU0Vudmlyb25tZW50KHZvaWQpOwogaW50ICAgICAgICBHZXREZXZpY2VDYXBzKEhEQzE2LFdPUkQpOwotSFdORCAgICAgICBHZXREbGdJdGVtKEhXTkQsV09SRCk7Ci1XT1JEICAgICAgIEdldERsZ0l0ZW1JbnQoSFdORCxXT1JELEJPT0wqLEJPT0wpOwogV09SRCAgICAgICBHZXREb3VibGVDbGlja1RpbWUodm9pZCk7CiBpbnQgICAgICAgIEdldEVudmlyb25tZW50KExQU1RSLExQU1RSLFdPUkQpOwogRFdPUkQgICAgICBHZXRGcmVlU3BhY2UoVUlOVDE2KTsKQEAgLTY0MjEsNyArNjYzNiw2IEBACiBJTlQxNiAgICAgIEdldE1vZHVsZVVzYWdlKEhJTlNUQU5DRTE2KTsKIERXT1JEICAgICAgR2V0TmVhcmVzdENvbG9yKEhEQzE2LERXT1JEKTsKIFdPUkQgICAgICAgR2V0TmVhcmVzdFBhbGV0dGVJbmRleChIUEFMRVRURTE2LERXT1JEKTsKLUhXTkQgICAgICAgR2V0TmV4dFdpbmRvdyhIV05ELFdPUkQpOwogSFdORCAgICAgICBHZXRPcGVuQ2xpcGJvYXJkV2luZG93KHZvaWQpOwogV09SRCAgICAgICBHZXRQYWxldHRlRW50cmllcyhIUEFMRVRURTE2LFdPUkQsV09SRCxMUFBBTEVUVEVFTlRSWSk7CiBpbnQgICAgICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0KFdPUkQqLHNob3J0KTsKQEAgLTY0MzQsMTAgKzY2NDgsOCBAQAogQllURSAgICAgICBHZXRUZW1wRHJpdmUoQllURSk7CiBMUElOVDE2ICAgIEdldFRocmVzaG9sZEV2ZW50KHZvaWQpOwogaW50ICAgICAgICBHZXRUaHJlc2hvbGRTdGF0dXModm9pZCk7Ci1IV05EICAgICAgIEdldFRvcFdpbmRvdyhIV05EKTsKIEJPT0wgICAgICAgR2V0V2luRGVidWdJbmZvKExQV0lOREVCVUdJTkZPLFVJTlQpOwogTE9ORyAgICAgICBHZXRXaW5GbGFncyh2b2lkKTsKLUhXTkQgICAgICAgR2V0V2luZG93KEhXTkQsV09SRCk7CiBBVE9NICAgICAgIEdsb2JhbERlbGV0ZUF0b20oQVRPTSk7CiB2b2lkICAgICAgIEdsb2JhbEZpeChIR0xPQkFMMTYpOwogQk9PTDE2ICAgICBHbG9iYWxVbldpcmUoSEdMT0JBTDE2KTsKQEAgLTY0NDYsMjAgKzY2NTgsMTMgQEAKIEJPT0wgICAgICAgR3JheVN0cmluZyhIREMxNixIQlJVU0gxNixHUkFZU1RSSU5HUFJPQzE2LExQQVJBTSxJTlQsSU5ULElOVCxJTlQsSU5UKTsKIEJPT0wgICAgICAgSW5TZW5kTWVzc2FnZSh2b2lkKTsKIFdPUkQgICAgICAgSW5pdEF0b21UYWJsZShXT1JEKTsKLUJPT0wgICAgICAgSXNDaGlsZChIV05ELEhXTkQpOwogQk9PTCAgICAgICBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShXT1JEKTsKLUJPT0wgICAgICAgSXNEaWFsb2dNZXNzYWdlKEhXTkQsTFBNU0cxNik7Ci1XT1JEICAgICAgIElzRGxnQnV0dG9uQ2hlY2tlZChIV05ELFdPUkQpOwotQk9PTCAgICAgICBJc0ljb25pYyhIV05EKTsKK0JPT0wxNiAgICAgSXNEaWFsb2dNZXNzYWdlKEhXTkQxNixMUE1TRzE2KTsKIEJPT0wgICAgICAgSXNWYWxpZE1ldGFGaWxlKEhNRVRBRklMRTE2KTsKLUJPT0wgICAgICAgSXNXaW5kb3dFbmFibGVkKEhXTkQpOwotQk9PTCAgICAgICBJc1dpbmRvd1Zpc2libGUoSFdORCk7Ci1CT09MICAgICAgIElzWm9vbWVkKEhXTkQpOwogSElOU1RBTkNFMTYgTG9hZE1vZHVsZShMUENTVFIsTFBWT0lEKTsKIEZBUlBST0MxNiAgTG9jYWxOb3RpZnkoRkFSUFJPQzE2KTsKIFdPUkQgICAgICAgTWFwVmlydHVhbEtleShXT1JELFdPUkQpOwogdm9pZCAgICAgICBNZXNzYWdlQmVlcChXT1JEKTsKLUJPT0wgICAgICAgTW92ZVdpbmRvdyhIV05ELHNob3J0LHNob3J0LHNob3J0LHNob3J0LEJPT0wpOwogRFdPUkQgICAgICBPZW1LZXlTY2FuKFdPUkQpOwogQk9PTCAgICAgICBPcGVuQ2xpcGJvYXJkKEhXTkQpOwogQk9PTCAgICAgICBPcGVuSWNvbihIV05EKTsKQEAgLTY0ODMsNyArNjY4OCw2IEBACiBCT09MICAgICAgIFJlc2l6ZVBhbGV0dGUoSFBBTEVUVEUxNixVSU5UKTsKIHZvaWQgICAgICAgU2Nyb2xsQ2hpbGRyZW4oSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBIUEFMRVRURTE2IFNlbGVjdFBhbGV0dGUoSERDMTYsSFBBTEVUVEUxNixCT09MKTsKLUhXTkQgICAgICAgU2V0QWN0aXZlV2luZG93KEhXTkQpOwogSEFORExFMTYgICBTZXRDbGlwYm9hcmREYXRhKFdPUkQsSEFORExFMTYpOwogSFdORCAgICAgICBTZXRDbGlwYm9hcmRWaWV3ZXIoSFdORCk7CiB2b2lkICAgICAgIFNldENvbnZlcnRIb29rKEJPT0wpOwpAQCAtNjUxMiwxMSArNjcxNiw5IEBACiBpbnQgICAgICAgIFNldFZvaWNlU291bmQoaW50LExPTkcsaW50KTsKIGludCAgICAgICAgU2V0Vm9pY2VUaHJlc2hvbGQoaW50LGludCk7CiBCT09MICAgICAgIFNldFdpbkRlYnVnSW5mbyhMUFdJTkRFQlVHSU5GTyk7Ci1CT09MICAgICAgIFNldFdpbmRvd1BvcyhIV05ELEhXTkQsSU5ULElOVCxJTlQsSU5ULFdPUkQpOwogSElOU1RBTkNFMTYgU2hlbGxFeGVjdXRlKEhXTkQsTFBDU1RSLExQQ1NUUixMUFNUUixMUENTVFIsSU5UKTsKIGludCAgICAgICAgU2hvd0N1cnNvcihCT09MKTsKIHZvaWQgICAgICAgU2hvd093bmVkUG9wdXBzKEhXTkQsQk9PTCk7Ci1CT09MICAgICAgIFNob3dXaW5kb3coSFdORCxpbnQpOwogRFdPUkQgICAgICBTaXplb2ZSZXNvdXJjZShITU9EVUxFMTYsSFJTUkMxNik7CiBpbnQgICAgICAgIFN0YXJ0U291bmQodm9pZCk7CiBpbnQgICAgICAgIFN0b3BTb3VuZCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZXJyb3IuaCBiL2luY2x1ZGUvd2luZXJyb3IuaAppbmRleCA2NDg4ZTVlLi4yOGNjMDA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmVycm9yLmgKKysrIGIvaW5jbHVkZS93aW5lcnJvci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lIEVSUk9SX0JBRF9GT1JNQVQgICAgICAgICAgICAxMQogI2RlZmluZSBFUlJPUl9PVVRPRk1FTU9SWSAgICAgICAgICAgMTQKICNkZWZpbmUgRVJST1JfTk9fTU9SRV9GSUxFUyAgICAgICAgIDE4CisjZGVmaW5lIEVSUk9SX1NIQVJJTkdfVklPTEFUSU9OICAgICAzMgogI2RlZmluZSBFUlJPUl9GSUxFX0VYSVNUUyAgICAgICAgICAgODAKICNkZWZpbmUgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgICAgIDg3CiAjZGVmaW5lIEVSUk9SX0JST0tFTl9QSVBFICAgICAgICAgICAxMDkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lucG9zLmggYi9pbmNsdWRlL3dpbnBvcy5oCmluZGV4IGQ4ZGYwNzIuLmJlMjFlZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lucG9zLmgKKysrIGIvaW5jbHVkZS93aW5wb3MuaApAQCAtOSw3ICs5LDcgQEAKIAogI2luY2x1ZGUgIndpbi5oIgogCi0jZGVmaW5lIERXUF9NQUdJQyAgMHg1MDU3ICAvKiAnV1AnICovCisjZGVmaW5lIERXUF9NQUdJQyAgKChJTlQzMikoJ1cnIHwgKCdQJyA8PCA4KSB8ICgnTycgPDwgMTYpIHwgKCdTJyA8PCAyNCkpKQogCiAvKiB1bmRvY3VtZW50ZWQgU1dQIGZsYWdzIC0gZnJvbSBTREsgMy4xICovCiAjZGVmaW5lIFNXUF9OT0NMSUVOVFNJWkUJMHgwODAwCkBAIC0xNywxMiArMTcsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBXT1JEICAgICAgICBhY3R1YWxDb3VudDsKLSAgICBXT1JEICAgICAgICBzdWdnZXN0ZWRDb3VudDsKLSAgICBXT1JEICAgICAgICB2YWxpZDsKLSAgICBXT1JEICAgICAgICB3TWFnaWM7CisgICAgSU5UMzIgICAgICAgYWN0dWFsQ291bnQ7CisgICAgSU5UMzIgICAgICAgc3VnZ2VzdGVkQ291bnQ7CisgICAgQk9PTDMyICAgICAgdmFsaWQ7CisgICAgSU5UMzIgICAgICAgd01hZ2ljOwogICAgIEhXTkQzMiAgICAgIGh3bmRQYXJlbnQ7Ci0gICAgV0lORE9XUE9TMTYgd2luUG9zWzFdOworICAgIFdJTkRPV1BPUzMyIHdpblBvc1sxXTsKIH0gRFdQOwogCiBleHRlcm4gdm9pZCBXSU5QT1NfRmluZEljb25Qb3MoIEhXTkQzMiBod25kICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3gxMWRydi5oIGIvaW5jbHVkZS94MTFkcnYuaAppbmRleCA5MzcyMjI0Li4xMjc0NDFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3gxMWRydi5oCisrKyBiL2luY2x1ZGUveDExZHJ2LmgKQEAgLTU1LDYgKzU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeFNyYywgSU5UMzIgeVNyYywgRFdPUkQgcm9wICk7CiBleHRlcm4gQk9PTDMyIFgxMURSVl9HZXRUZXh0RXh0ZW50UG9pbnQoIHN0cnVjdCB0YWdEQyAqZGMsIExQQ1NUUiBzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNvdW50LCBMUFNJWkUzMiBzaXplICk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9HZXRUZXh0TWV0cmljcyhzdHJ1Y3QgdGFnREMgKmRjLCBURVhUTUVUUklDMzJBICptZXRyaWNzKTsKIGV4dGVybiBCT09MMzIgWDExRFJWX1BhdEJsdCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB3aWR0aCwgSU5UMzIgaGVpZ2h0LCBEV09SRCByb3AgKTsKIGV4dGVybiBWT0lEIFgxMURSVl9TZXREZXZpY2VDbGlwcGluZyhzdHJ1Y3QgdGFnREMgKmRjKTsKZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IDliMTNlOGYuLmY3OGVlNzggMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAia2V5Ym9hcmQuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCkBAIC0zMiw3ICszMyw2IEBACiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJkY2UuaCIKLSNpbmNsdWRlICJwZV9pbWFnZS5oIgogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCkBAIC0xMjMsNiArMTIzLDkgQEAKICAgICAgIC8qIENyZWF0ZSB0aGUgRENFcyAqLwogICAgIERDRV9Jbml0KCk7CiAKKyAgICAvKiBJbml0aWFsaXplIGtleWJvYXJkICovCisgICAgaWYgKCFLRVlCT0FSRF9Jbml0KCkpIHJldHVybiAwOworCiAgICAgLyogSW5pdGlhbGl6ZSB3aW5kb3cgcHJvY2VkdXJlcyAqLwogICAgIGlmICghV0lOUFJPQ19Jbml0KCkpIHJldHVybiAwOwogCkBAIC0xNjQsNyArMTY3LDcgQEAKICAgICBleHRlcm4gQk9PTDMyIE1BSU5fV2luZUluaXQoIGludCAqYXJnYywgY2hhciAqYXJndltdICk7CiAgICAgZXh0ZXJuIGNoYXIgKiBERUJVR19hcmd2MDsKIAotICAgIGludCBpOworICAgIGludCBpLGxvYWRlZDsKICAgICBISU5TVEFOQ0UxNiBoYW5kbGU7CiAKICAgICAvKgpAQCAtMTc2LDYgKzE3OSw3IEBACiAgICAgaWYgKCFNQUlOX1dpbmVJbml0KCAmYXJnYywgYXJndiApKSByZXR1cm4gMTsKICAgICBpZiAoIU1BSU5fSW5pdCgpKSByZXR1cm4gMTsKIAorICAgIGxvYWRlZD0wOwogICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCiAgICAgewogICAgICAgICBpZiAoKGhhbmRsZSA9IFdpbkV4ZWMzMiggYXJndltpXSwgU1dfU0hPV05PUk1BTCApKSA8IDMyKQpAQCAtMTkwLDYgKzE5NCwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KKwlsb2FkZWQrKzsKKyAgICB9CisKKyAgICBpZiAoIWxvYWRlZCkgeyAvKiBub3RoaW5nIGxvYWRlZCAqLworICAgIAlleHRlcm4gdm9pZCBNQUlOX1VzYWdlKGNoYXIqKTsKKyAgICAJTUFJTl9Vc2FnZShhcmd2WzBdKTsKKwlyZXR1cm4gMTsKICAgICB9CiAKICAgICBpZiAoT3B0aW9ucy5kZWJ1ZykgREVCVUdfU2V0QnJlYWtwb2ludHMoIFRSVUUgKTsgIC8qIFNldHVwIGJyZWFrcG9pbnRzICovCmRpZmYgLS1naXQgYS9sb2FkZXIvbW9kdWxlLmMgYi9sb2FkZXIvbW9kdWxlLmMKaW5kZXggZTBiOWY5ZC4uNGY0YzFlNCAxMDA2NDQKLS0tIGEvbG9hZGVyL21vZHVsZS5jCisrKyBiL2xvYWRlci9tb2R1bGUuYwpAQCAtMTAwOCw5ICsxMDA4LDExIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBMb2FkTW9kdWxlICAgIChLRVJORUwuNDUpCisgKgkgICAgTU9EVUxFX0xvYWQKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBMb2FkTW9kdWxlKCkKICAqLwotSElOU1RBTkNFMTYgTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrICkKK0hJTlNUQU5DRTE2IE1PRFVMRV9Mb2FkKCBMUENTVFIgbmFtZSwgTFBWT0lEIHBhcmFtQmxvY2ssIEJPT0wzMiBmaXJzdCApCiB7CiAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlLCBoUHJldkluc3RhbmNlOwpAQCAtMTAyMSw3ICsxMDIzLDcgQEAKICAgICBXT1JEICpwTW9kUmVmLCAqcERMTHM7CiAgICAgSEZJTEUzMiBoRmlsZTsKICAgICBpbnQgaTsKLSAgICBleHRlcm4gY2hhciAqIERFQlVHX2N1cnJfbW9kdWxlOworICAgIGV4dGVybiBjb25zdCBjaGFyICogREVCVUdfY3Vycl9tb2R1bGU7CiAKICAgICBoTW9kdWxlID0gTU9EVUxFX0ZpbmRNb2R1bGUoIG5hbWUgKTsKIApAQCAtMTA4OSw4ICsxMDkxLDkgQEAKICAgICAgICAgICAgICAgICAvKiBpdHMgaGFuZGxlIGluIHRoZSBsaXN0IG9mIERMTHMgdG8gaW5pdGlhbGl6ZS4gICAqLwogICAgICAgICAgICAgICAgIEhNT0RVTEUxNiBoRExMOwogCi0gICAgICAgICAgICAgICAgaWYgKChoRExMID0gTG9hZE1vZHVsZSggYnVmZmVyLCAoTFBWT0lEKS0xICkpID09IDIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgIGlmICgoaERMTCA9IE1PRFVMRV9Mb2FkKCBidWZmZXIsIChMUFZPSUQpLTEsIEZBTFNFICkpID09IDIpCiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogICAgICAgICAgICAgICAgICAgICBjaGFyICpwOwogCiAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB3aXRoIHByZXBlbmRpbmcgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgbW9kdWxlICovCkBAIC0xMDk4LDcgKzExMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoIShwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKSBwID0gYnVmZmVyOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHAgKyAxLCBwc3RyICsgMSwgKnBzdHIgKTsKICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCBwICsgMSArICpwc3RyLCAiLmRsbCIgKTsKLSAgICAgICAgICAgICAgICAgICAgaERMTCA9IExvYWRNb2R1bGUoIGJ1ZmZlciwgKExQVk9JRCktMSApOworICAgICAgICAgICAgICAgICAgICBoRExMID0gTU9EVUxFX0xvYWQoIGJ1ZmZlciwgKExQVk9JRCktMSwgRkFMU0UgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGhETEwgPCAzMikKICAgICAgICAgICAgICAgICB7CkBAIC0xMjEyLDYgKzEyMTUsOSBAQAogICAgICAgICAgIC8qIHRoZSBtb2R1bGUsIGV2ZW4gaWYgaXQgY29udGFpbnMgY2lyY3VsYXIgRExMIHJlZmVyZW5jZXMgKi8KIAogICAgICAgICBwTW9kdWxlLT5jb3VudCA9IDE7CisKKyAgICAgICAgaWYgKGZpcnN0ICYmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpKQorICAgICAgICAgICAgTkVfSW5pdGlhbGl6ZURMTHMoIGhNb2R1bGUgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTEyNTYsNiArMTI2MiwxNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgTG9hZE1vZHVsZSAgICAoS0VSTkVMLjQ1KQorICovCitISU5TVEFOQ0UxNiBMb2FkTW9kdWxlKCBMUENTVFIgbmFtZSwgTFBWT0lEIHBhcmFtQmxvY2sgKQoreworICAgIHJldHVybiBNT0RVTEVfTG9hZCggbmFtZSwgcGFyYW1CbG9jaywgVFJVRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgRnJlZU1vZHVsZTE2ICAgIChLRVJORUwuNDYpCiAgKi8KIEJPT0wxNiBGcmVlTW9kdWxlMTYoIEhNT0RVTEUxNiBoTW9kdWxlICkKQEAgLTEzODIsMTcgKzEzOTcsMTQgQEAKICAgICAgKiB0aGVyZWZvcmUgY2F1c2UgY3Jhc2hlcyBvbiBGcmVlTGlicmFyeSBjYWxscy4KICAgICBpZiAoKGhhbmRsZSA9IE1PRFVMRV9GaW5kTW9kdWxlKCBsaWJuYW1lICkpICE9IDApIHJldHVybiBoYW5kbGU7CiAgICAgICovCi0gICAgaGFuZGxlID0gTG9hZE1vZHVsZSggbGlibmFtZSwgKExQVk9JRCktMSApOworICAgIGhhbmRsZSA9IE1PRFVMRV9Mb2FkKCBsaWJuYW1lLCAoTFBWT0lEKS0xLCBUUlVFICk7CiAgICAgaWYgKGhhbmRsZSA9PSAoSElOU1RBTkNFMTYpMikgIC8qIGZpbGUgbm90IGZvdW5kICovCiAgICAgewogICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwogICAgICAgICBsc3RyY3B5bjMyQSggYnVmZmVyLCBsaWJuYW1lLCAyNTIgKTsKICAgICAgICAgc3RyY2F0KCBidWZmZXIsICIuZGxsIiApOwotICAgICAgICBoYW5kbGUgPSBMb2FkTW9kdWxlKCBidWZmZXIsIChMUFZPSUQpLTEgKTsKKyAgICAgICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGJ1ZmZlciwgKExQVk9JRCktMSwgVFJVRSApOwogICAgIH0KLSNpZm5kZWYgV0lORUxJQgotICAgIGlmIChoYW5kbGUgPj0gKEhJTlNUQU5DRTE2KTMyKSBORV9Jbml0aWFsaXplRExMcyggR2V0RXhlUHRyKGhhbmRsZSkgKTsKLSNlbmRpZgogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9pbWFnZS5jIGIvbG9hZGVyL3BlX2ltYWdlLmMKaW5kZXggNzNjOWNlOS4uOWQ0ODE2YyAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX2ltYWdlLmMKKysrIGIvbG9hZGVyL3BlX2ltYWdlLmMKQEAgLTE3LDcgKzE3LDkgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZm5kZWYgX19FTVhfXwogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCkBAIC0zMyw1MCArMzUsMTAgQEAKICNpbmNsdWRlICJkZWJ1Z2dlci5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKIAotdm9pZCBteV93Y3N0b21icyhjaGFyICogcmVzdWx0LCB1X3Nob3J0ICogc291cmNlLCBpbnQgbGVuKQotewotICB3aGlsZShsZW4tLSkgewotICAgIC8qIHRoaXMgdXNlZCB0byBiZSBpc2FzY2lpLCBidXQgc2VlIGlzYXNjaWkgaW1wbGVtZW50YXRpb24gaW4gTGludXgnCi0JICAgY3R5cGUuaCAqLwotICAgIGlmKCpzb3VyY2U8MjU1KSAqcmVzdWx0KysgPSAqc291cmNlKys7Ci0gICAgZWxzZSB7Ci0gICAgICBwcmludGYoIlVuYWJsZSB0byBoYW5kbGUgdW5pY29kZSByaWdodCBub3dcbiIpOwotICAgICAgZXhpdCgwKTsKLSAgICB9Ci0gIH07Ci19CisvKiBjb252ZXJ0IFBFIGltYWdlIFZpcnR1YWxBZGRyZXNzIHRvIFJlYWwgQWRkcmVzcyAqLworI2RlZmluZSBSVkEoeCkgKCh1bnNpZ25lZCBpbnQpbG9hZF9hZGRyKyh1bnNpZ25lZCBpbnQpKHgpKQogCi0jaWYgMAotY2hhciAqIHhtbWFwKGNoYXIgKiB2YWRkciwgdW5zaWduZWQgaW50IHZfc2l6ZSwgdW5zaWduZWQgaW50IHJfc2l6ZSwKLQlpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIHVuc2lnbmVkIGludCBmaWxlX29mZnNldCkKLXsKLSAgY2hhciAqIHJlc3VsdDsKLSAgLyogLmJzcyBoYXMgbm8gYXNzb2NpYXRlZCBzdG9yYWdlIGluIHRoZSBQRSBmaWxlICovCi0gIGlmKHJfc2l6ZSkKLSAgICB2X3NpemU9cl9zaXplOwotICBlbHNlCi0jaWYgZGVmaW5lZChfX3N2cjRfXykgfHwgZGVmaW5lZChfU0NPX0RTKQotICAgIGZwcmludGYoc3RkZXJyLCJ4bW1hcDogJXMgbGluZSAlZCBkb2Vzbid0IHN1cHBvcnQgTUFQX0FOT05cbiIsX19GSUxFX18sIF9fTElORV9fKTsKLSNlbHNlCi0gICAgZmxhZ3MgfD0gTUFQX0FOT047Ci0jZW5kaWYKLSAgcmVzdWx0ID0gbW1hcCh2YWRkciwgdl9zaXplLCBwcm90LCBmbGFncywgZmQsIGZpbGVfb2Zmc2V0KTsKLSAgaWYoKHVuc2lnbmVkIGludCkgcmVzdWx0ICE9IDB4ZmZmZmZmZmYpIHJldHVybiByZXN1bHQ7Ci0KLSAgLyogU2lnaC4gIEFsaWdubWVudCBtdXN0IGJlIHdyb25nIGZvciBtbWFwLiAgRG8gdGhpcyB0aGUgaGFyZCB3YXkuICovCi0gIGlmKCEoZmxhZ3MgJiBNQVBfRklYRUQpKSB7Ci0gICAgdmFkZHIgPSAoY2hhciAqKTB4NDAwMDAwMDA7Ci0gICAgZmxhZ3MgfD0gTUFQX0ZJWEVEOwotICB9OwotCi0gIG1tYXAodmFkZHIsIHZfc2l6ZSwgcHJvdCwgTUFQX0FOT05ZTU9VUyB8IGZsYWdzLCAwLCAwKTsKLSAgbHNlZWsoZmQsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gIHJlYWQoZmQsIHZhZGRyLCB2X3NpemUpOwotICByZXR1cm4gdmFkZHI7Ci19OwotI2VuZGlmCi0KLXZvaWQgZHVtcF9leHBvcnRzKHN0cnVjdCBQRV9FeHBvcnRfRGlyZWN0b3J5ICogcGVfZXhwb3J0cywgdW5zaWduZWQgaW50IGxvYWRfYWRkcikKK3ZvaWQgZHVtcF9leHBvcnRzKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgKiBwZV9leHBvcnRzLCB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyKQogeyAKICAgY2hhcgkJKk1vZHVsZTsKICAgaW50CQlpOwpAQCAtODgsMzAgKzUwLDMwIEBACiAKICAgZGFkZHIuc2VnID0gMDsKICAgZGFkZHIudHlwZSA9IE5VTEw7Ci0gIE1vZHVsZSA9ICgoY2hhciopbG9hZF9hZGRyKStwZV9leHBvcnRzLT5OYW1lOworICBNb2R1bGUgPSAoY2hhciopUlZBKHBlX2V4cG9ydHMtPk5hbWUpOwogICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiXG4qKioqKioqRVhQT1JUIERBVEEqKioqKioqXG5Nb2R1bGUgbmFtZSBpcyAlcywgJWxkIGZ1bmN0aW9ucywgJWxkIG5hbWVzXG4iLCAKIAkgTW9kdWxlLAotCSBwZV9leHBvcnRzLT5OdW1iZXJfT2ZfRnVuY3Rpb25zLAotCSBwZV9leHBvcnRzLT5OdW1iZXJfT2ZfTmFtZXMpOworCSBwZV9leHBvcnRzLT5OdW1iZXJPZkZ1bmN0aW9ucywKKwkgcGVfZXhwb3J0cy0+TnVtYmVyT2ZOYW1lcyk7CiAKLSAgb3JkaW5hbD0odV9zaG9ydCopKCgoY2hhciopbG9hZF9hZGRyKSsoaW50KXBlX2V4cG9ydHMtPkFkZHJlc3NfT2ZfTmFtZV9PcmRpbmFscyk7Ci0gIGZ1bmN0aW9ucz1mdW5jdGlvbj0odV9sb25nKikoKChjaGFyKilsb2FkX2FkZHIpKyhpbnQpcGVfZXhwb3J0cy0+QWRkcmVzc09mRnVuY3Rpb25zKTsKLSAgbmFtZT0odV9jaGFyKiopKCgoY2hhciopbG9hZF9hZGRyKSsoaW50KXBlX2V4cG9ydHMtPkFkZHJlc3NPZk5hbWVzKTsKKyAgb3JkaW5hbD0odV9zaG9ydCopIFJWQShwZV9leHBvcnRzLT5BZGRyZXNzT2ZOYW1lT3JkaW5hbHMpOworICBmdW5jdGlvbnM9ZnVuY3Rpb249KHVfbG9uZyopIFJWQShwZV9leHBvcnRzLT5BZGRyZXNzT2ZGdW5jdGlvbnMpOworICBuYW1lPSh1X2NoYXIqKikgUlZBKHBlX2V4cG9ydHMtPkFkZHJlc3NPZk5hbWVzKTsKIAogICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiJS0zMnMgT3JkaW5hbCBWaXJ0IEFkZHJcbiIsICJGdW5jdGlvbiBOYW1lIik7Ci0gIGZvciAoaT0wO2k8cGVfZXhwb3J0cy0+TnVtYmVyX09mX0Z1bmN0aW9ucztpKyspIHsKLSAgICAgIGlmIChpPHBlX2V4cG9ydHMtPk51bWJlcl9PZl9OYW1lcykgewotCSAgZW5hbWU9KGNoYXIqKSgoKGNoYXIqKWxvYWRfYWRkcikrKGludCkqbmFtZSsrKTsKKyAgZm9yIChpPTA7aTxwZV9leHBvcnRzLT5OdW1iZXJPZkZ1bmN0aW9ucztpKyspIHsKKyAgICAgIGlmIChpPHBlX2V4cG9ydHMtPk51bWJlck9mTmFtZXMpIHsKKwkgIGVuYW1lPShjaGFyKilSVkEoKm5hbWUrKyk7CiAJICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiJS0zMnMgJTRkICAgICU4LjhseCAoJTguOGx4KVxuIixlbmFtZSwqb3JkaW5hbCxmdW5jdGlvbnNbKm9yZGluYWxdLCpmdW5jdGlvbik7CiAJICBzcHJpbnRmKGJ1ZmZlciwiJXMuJXMiLE1vZHVsZSxlbmFtZSk7Ci0JICBkYWRkci5vZmY9bG9hZF9hZGRyK2Z1bmN0aW9uc1sqb3JkaW5hbF07CisJICBkYWRkci5vZmY9UlZBKGZ1bmN0aW9uc1sqb3JkaW5hbF0pOwogCSAgb3JkaW5hbCsrOwogCSAgZnVuY3Rpb24rKzsKICAgICAgIH0gZWxzZSB7CiAgICAgICAJICAvKiBvcmRpbmFscy9uYW1lcyBubyBsb25nZXIgdmFsaWQsIGJ1dCB3ZSBzdGlsbCBnb3QgZnVuY3Rpb25zICovCiAJICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiJS0zMnMgJTRzICAgICU4cyAlOC44bHhcbiIsIiIsIiIsIiIsKmZ1bmN0aW9uKTsKIAkgIHNwcmludGYoYnVmZmVyLCIlcy4lZCIsTW9kdWxlLGkpOwotCSAgZGFkZHIub2ZmPWxvYWRfYWRkcisqZnVuY3Rpb25zOworCSAgZGFkZHIub2ZmPVJWQSgqZnVuY3Rpb25zKTsKIAkgIGZ1bmN0aW9uKys7CiAgICAgICB9CiAgICAgICBERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOwpAQCAtMTI4LDcgKzkwLDcgQEAKICAqLwogRkFSUFJPQzMyIFBFX0ZpbmRFeHBvcnRlZEZ1bmN0aW9uKHN0cnVjdCBwZV9kYXRhICpwZSwgTFBDU1RSIGZ1bmNOYW1lKQogewotCXN0cnVjdCBQRV9FeHBvcnRfRGlyZWN0b3J5ICogZXhwb3J0cyA9IHBlLT5wZV9leHBvcnQ7CisJSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSAqIGV4cG9ydHMgPSBwZS0+cGVfZXhwb3J0OwogCXVuc2lnbmVkIGxvYWRfYWRkciA9IHBlLT5sb2FkX2FkZHI7CiAJdV9zaG9ydCAqIG9yZGluYWw7CiAJdV9sb25nICogZnVuY3Rpb247CkBAIC0xNDEsMjQgKzEwMywyNCBAQAogCQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oJWQpXG4iLChpbnQpZnVuY05hbWUpOwogCWlmICghZXhwb3J0cykKIAkJcmV0dXJuIE5VTEw7Ci0Jb3JkaW5hbD0odV9zaG9ydCopKCgoY2hhciopbG9hZF9hZGRyKSsoaW50KWV4cG9ydHMtPkFkZHJlc3NfT2ZfTmFtZV9PcmRpbmFscyk7Ci0JZnVuY3Rpb249KHVfbG9uZyopKCgoY2hhciopbG9hZF9hZGRyKSsoaW50KWV4cG9ydHMtPkFkZHJlc3NPZkZ1bmN0aW9ucyk7Ci0JbmFtZT0odV9jaGFyICoqKSgoKGNoYXIqKWxvYWRfYWRkcikrKGludClleHBvcnRzLT5BZGRyZXNzT2ZOYW1lcyk7CisJb3JkaW5hbD0odV9zaG9ydCopIFJWQShleHBvcnRzLT5BZGRyZXNzT2ZOYW1lT3JkaW5hbHMpOworCWZ1bmN0aW9uPSh1X2xvbmcqKSBSVkEoZXhwb3J0cy0+QWRkcmVzc09mRnVuY3Rpb25zKTsKKwluYW1lPSh1X2NoYXIgKiopIFJWQShleHBvcnRzLT5BZGRyZXNzT2ZOYW1lcyk7CiAJaWYgKEhJV09SRChmdW5jTmFtZSkpIHsKLQkJZm9yKGk9MDsgaTxleHBvcnRzLT5OdW1iZXJfT2ZfTmFtZXM7IGkrKykgewotCQkJZW5hbWU9KGNoYXIqKSgoKGNoYXIqKWxvYWRfYWRkcikrKGludCkqbmFtZSk7CisJCWZvcihpPTA7IGk8ZXhwb3J0cy0+TnVtYmVyT2ZOYW1lczsgaSsrKSB7CisJCQllbmFtZT0oY2hhciopIFJWQSgqbmFtZSk7CiAJCQlpZighc3RyY21wKGVuYW1lLGZ1bmNOYW1lKSkKLQkJCQlyZXR1cm4gKEZBUlBST0MzMikobG9hZF9hZGRyK2Z1bmN0aW9uWypvcmRpbmFsXSk7CisJCQkJcmV0dXJuIChGQVJQUk9DMzIpIFJWQShmdW5jdGlvblsqb3JkaW5hbF0pOwogCQkJb3JkaW5hbCsrOwogCQkJbmFtZSsrOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKExPV09SRChmdW5jTmFtZSktZXhwb3J0cy0+QmFzZSA+IGV4cG9ydHMtPk51bWJlcl9PZl9GdW5jdGlvbnMpIHsKKwkJaWYgKExPV09SRChmdW5jTmFtZSktZXhwb3J0cy0+QmFzZSA+IGV4cG9ydHMtPk51bWJlck9mRnVuY3Rpb25zKSB7CiAJCQlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwiCW9yZGluYWwgJWQgb3V0IG9mIHJhbmdlIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XT1JEKGZ1bmNOYW1lKSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlyZXR1cm4gKEZBUlBST0MzMikobG9hZF9hZGRyK2Z1bmN0aW9uWyhpbnQpZnVuY05hbWUtZXhwb3J0cy0+QmFzZV0pOworCQlyZXR1cm4gKEZBUlBST0MzMikgUlZBKGZ1bmN0aW9uWyhpbnQpZnVuY05hbWUtZXhwb3J0cy0+QmFzZV0pOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE2NiwxOSArMTI4LDI3IEBACiB2b2lkIAogZml4dXBfaW1wb3J0cyAoc3RydWN0IHBlX2RhdGEgKnBlLCBITU9EVUxFMTYgaE1vZHVsZSkKIHsKLSAgICBzdHJ1Y3QgUEVfSW1wb3J0X0RpcmVjdG9yeSAqcGVfaW1wOworICAgIElNQUdFX0lNUE9SVF9ERVNDUklQVE9SICpwZV9pbXA7CiAgICAgaW50CWZpeHVwX2ZhaWxlZCA9IDA7CiAgICAgdW5zaWduZWQgaW50IGxvYWRfYWRkciA9IHBlLT5sb2FkX2FkZHI7CiAgICAgaW50IGk7CiAgICAgTkVfTU9EVUxFICpuZV9tb2Q7CiAgICAgSE1PRFVMRTE2ICptb2RfcHRyOworICAgIGNoYXIgKm1vZG5hbWU7CisgICAgCisgICAgaWYgKHBlLT5wZV9leHBvcnQpCisgICAgCW1vZG5hbWUgPSAoY2hhciopIFJWQShwZS0+cGVfZXhwb3J0LT5OYW1lKTsKKyAgICBlbHNlCisgICAgICAgIG1vZG5hbWUgPSAiPHVua25vd24+IjsKIAogICAgIC8qIE9LLCBub3cgZHVtcCB0aGUgaW1wb3J0IGxpc3QgKi8KICAgICBkcHJpbnRmX3dpbjMyIChzdGRkZWIsICJcbkR1bXBpbmcgaW1wb3J0cyBsaXN0XG4iKTsKIAogICAgIC8qIGZpcnN0LCBjb3VudCB0aGUgbnVtYmVyIG9mIGltcG9ydGVkIG5vbi1pbnRlcm5hbCBtb2R1bGVzICovCiAgICAgcGVfaW1wID0gcGUtPnBlX2ltcG9ydDsKLSAgICBmb3IgKGkgPSAwOyBwZV9pbXAtPk1vZHVsZU5hbWU7IHBlX2ltcCsrKQorCisgICAgLyogRklYTUU6IHNob3VsZCB0ZXJtaW5hdGUgb24gMCBDaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICBmb3IgKGkgPSAwOyBwZV9pbXAtPk5hbWU7IHBlX2ltcCsrKQogCWkrKzsKIAogICAgIC8qIE5vdywgYWxsb2NhdGUgbWVtb3J5IGZvciBkbGxzX3RvX2luaXQgKi8KQEAgLTE4Nyw5ICsxNTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFKTsKICAgICBtb2RfcHRyID0gR2xvYmFsTG9jazE2IChuZV9tb2QtPmRsbHNfdG9faW5pdCk7CiAgICAgLyogbG9hZCB0aGUgbW9kdWxlcyBhbmQgcHV0IHRoZWlyIGhhbmRsZXMgaW50byB0aGUgbGlzdCAqLwotICAgIGZvciAoaSA9IDAsIHBlX2ltcCA9IHBlLT5wZV9pbXBvcnQ7IHBlX2ltcC0+TW9kdWxlTmFtZTsgcGVfaW1wKyspIHsKLQljaGFyICpuYW1lID0gKGNoYXIgKikgbG9hZF9hZGRyICsgcGVfaW1wLT5Nb2R1bGVOYW1lOwotCW1vZF9wdHJbaV0gPSBMb2FkTW9kdWxlIChuYW1lLCAoTFBWT0lEKSAtIDEpOworIAorICAgICAvKiBGSVhNRTogc2hvdWxkIHRlcm1pbmF0ZSBvbiAwIENoYXJhY3RlcmlzdGljcyAqLworICAgICBmb3IgKGkgPSAwLCBwZV9pbXAgPSBwZS0+cGVfaW1wb3J0OyBwZV9pbXAtPk5hbWU7IHBlX2ltcCsrKSB7CisgCWNoYXIgKm5hbWUgPSAoY2hhciAqKSBSVkEocGVfaW1wLT5OYW1lKTsKKwltb2RfcHRyW2ldID0gTU9EVUxFX0xvYWQoIG5hbWUsIChMUFZPSUQpLTEsIEZBTFNFICk7CiAJaWYgKG1vZF9wdHJbaV0gPD0gKEhNT0RVTEUxNikgMzIpIHsKIAkgICAgY2hhciAqcCwgYnVmZmVyWzI1Nl07CiAKQEAgLTE5OCw3ICsxNzAsNyBAQAogCSAgICBpZiAoIShwID0gc3RycmNociAoYnVmZmVyLCAnXFwnKSkpCiAJCXAgPSBidWZmZXI7CiAJICAgIHN0cmNweSAocCArIDEsIG5hbWUpOwotCSAgICBtb2RfcHRyW2ldID0gTG9hZE1vZHVsZSAoYnVmZmVyLCAoTFBWT0lEKSAtIDEpOworCSAgICBtb2RfcHRyW2ldID0gTU9EVUxFX0xvYWQoIGJ1ZmZlciwgKExQVk9JRCktMSwgRkFMU0UgKTsKIAl9CiAJaWYgKG1vZF9wdHJbaV0gPD0gKEhNT0RVTEUxNikgMzIpIHsKIAkgICAgZnByaW50ZiAoc3RkZXJyLCAiTW9kdWxlICVzIG5vdCBmb3VuZFxuIiwgbmFtZSk7CkBAIC0yMDcsNjYgKzE3OSw4MCBAQAogCWkrKzsKICAgICB9CiAgICAgcGVfaW1wID0gcGUtPnBlX2ltcG9ydDsKLSAgICB3aGlsZSAocGVfaW1wLT5Nb2R1bGVOYW1lKSB7Ci0JY2hhciAqTW9kdWxlOwotCXN0cnVjdCBwZV9pbXBvcnRfbmFtZSAqcGVfbmFtZTsKLQl1bnNpZ25lZCBpbnQgKmltcG9ydF9saXN0LCAqdGh1bmtfbGlzdDsKKyAgICB3aGlsZSAocGVfaW1wLT5OYW1lKSB7CisJY2hhcgkJCSpNb2R1bGU7CisJSU1BR0VfSU1QT1JUX0JZX05BTUUJKnBlX25hbWU7CisJTFBJTUFHRV9USFVOS19EQVRBCWltcG9ydF9saXN0LHRodW5rX2xpc3Q7CisJaW50CQkJb3JkaW1wb3J0d2FybmVkOwogCi0JTW9kdWxlID0gKChjaGFyICopIGxvYWRfYWRkcikgKyBwZV9pbXAtPk1vZHVsZU5hbWU7CisgICAgICAgIG9yZGltcG9ydHdhcm5lZCA9IDA7CisJTW9kdWxlID0gKGNoYXIgKikgUlZBKHBlX2ltcC0+TmFtZSk7CiAJZHByaW50Zl93aW4zMiAoc3RkZGViLCAiJXNcbiIsIE1vZHVsZSk7CiAKLQlpZiAocGVfaW1wLT5JbXBvcnRfTGlzdCAhPSAwKSB7CS8qIG9yaWdpbmFsIG1pY3Jvc29mdCBzdHlsZSAqLworCWlmIChwZV9pbXAtPnUuT3JpZ2luYWxGaXJzdFRodW5rICE9IDApIHsgLyogb3JpZ2luYWwgTVMgc3R5bGUgKi8KIAkgICAgZHByaW50Zl93aW4zMiAoc3RkZGViLCAiTWljcm9zb2Z0IHN0eWxlIGltcG9ydHMgdXNlZFxuIik7Ci0JICAgIGltcG9ydF9saXN0ID0gKHVuc2lnbmVkIGludCAqKSgoKHVuc2lnbmVkIGludClsb2FkX2FkZHIpK3BlX2ltcC0+SW1wb3J0X0xpc3QpOwotCSAgICB0aHVua19saXN0ID0gKHVuc2lnbmVkIGludCAqKSgoKHVuc2lnbmVkIGludClsb2FkX2FkZHIpK3BlX2ltcC0+VGh1bmtfTGlzdCk7CisJICAgIGltcG9ydF9saXN0ID0oTFBJTUFHRV9USFVOS19EQVRBKSBSVkEocGVfaW1wLT51Lk9yaWdpbmFsRmlyc3RUaHVuayk7CisJICAgIHRodW5rX2xpc3QgPSAoTFBJTUFHRV9USFVOS19EQVRBKSBSVkEocGVfaW1wLT5GaXJzdFRodW5rKTsKIAotCSAgICB3aGlsZSAoKmltcG9ydF9saXN0KSB7Ci0JCXBlX25hbWUgPSAoc3RydWN0IHBlX2ltcG9ydF9uYW1lICopICgoaW50KSBsb2FkX2FkZHIgKyAoKHVuc2lnbmVkKSAqaW1wb3J0X2xpc3QgJiB+MHg4MDAwMDAwMCkpOwotCQlpZiAoKHVuc2lnbmVkKSAqaW1wb3J0X2xpc3QgJiAweDgwMDAwMDAwKSB7Ci0JCSAgICBpbnQgb3JkaW5hbCA9ICppbXBvcnRfbGlzdCAmICgweDgwMDAwMDAwIC0gMSk7CisJICAgIHdoaWxlIChpbXBvcnRfbGlzdC0+dTEuT3JkaW5hbCkgeworCQlpZiAoSU1BR0VfU05BUF9CWV9PUkRJTkFMKGltcG9ydF9saXN0LT51MS5PcmRpbmFsKSkgeworCQkgICAgaW50IG9yZGluYWwgPSBJTUFHRV9PUkRJTkFMKGltcG9ydF9saXN0LT51MS5PcmRpbmFsKTsKKworCQkgICAgaWYoIWxzdHJuY21waTMyQShNb2R1bGUsImtlcm5lbDMyIiw4KSAmJiAhb3JkaW1wb3J0d2FybmVkKXsKKwkJICAgICAgIGZwcmludGYoc3RkZXJyLCIlcyBpbXBvcnRzIGtlcm5lbDMyLmRsbCBieSBvcmRpbmFsLiBNYXkgY3Jhc2guXG4iLG1vZG5hbWUpOworCQkgICAgICAgb3JkaW1wb3J0d2FybmVkID0gMTsKKwkJICAgIH0KIAkJICAgIGRwcmludGZfd2luMzIgKHN0ZGRlYiwgIi0tLSBPcmRpbmFsICVzLCVkXG4iLCBNb2R1bGUsIG9yZGluYWwpOwotCQkgICAgKnRodW5rX2xpc3QgPSAodW5zaWduZWQpR2V0UHJvY0FkZHJlc3MzMihNT0RVTEVfRmluZE1vZHVsZSAoTW9kdWxlKSwKLQkJICAgIAkJCQkgICAoTFBDU1RSKSBvcmRpbmFsKTsKLQkJICAgIGlmICghKnRodW5rX2xpc3QpIHsKKwkJICAgIHRodW5rX2xpc3QtPnUxLkZ1bmN0aW9uPShMUERXT1JEKUdldFByb2NBZGRyZXNzMzIoTU9EVUxFX0ZpbmRNb2R1bGUoTW9kdWxlKSwoTFBDU1RSKW9yZGluYWwpOworCQkgICAgaWYgKCF0aHVua19saXN0LT51MS5GdW5jdGlvbikgewogCQkJZnByaW50ZihzdGRlcnIsIk5vIGltcGxlbWVudGF0aW9uIGZvciAlcy4lZCwgc2V0dGluZyB0byBOVUxMXG4iLAogCQkJCU1vZHVsZSwgb3JkaW5hbCk7CiAJCQkvKiBmaXh1cF9mYWlsZWQ9MTsgKi8KIAkJICAgIH0KIAkJfSBlbHNlIHsJCS8qIGltcG9ydCBieSBuYW1lICovCisJCSAgICBwZV9uYW1lID0gKExQSU1BR0VfSU1QT1JUX0JZX05BTUUpUlZBKGltcG9ydF9saXN0LT51MS5BZGRyZXNzT2ZEYXRhKTsKIAkJICAgIGRwcmludGZfd2luMzIgKHN0ZGRlYiwgIi0tLSAlcyAlcy4lZFxuIiwgcGVfbmFtZS0+TmFtZSwgTW9kdWxlLCBwZV9uYW1lLT5IaW50KTsKLQkJICAgICp0aHVua19saXN0ID0gKHVuc2lnbmVkKUdldFByb2NBZGRyZXNzMzIoTU9EVUxFX0ZpbmRNb2R1bGUgKE1vZHVsZSksCi0JCQkJCQkgICBwZV9uYW1lLT5OYW1lKTsKLQkJICAgIGlmICghKnRodW5rX2xpc3QpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiTm8gaW1wbGVtZW50YXRpb24gZm9yICVzLiVkKCVzKSwgc2V0dGluZyB0byBOVUxMXG4iLAotCQkJCU1vZHVsZSwgcGVfbmFtZS0+SGludCwgcGVfbmFtZS0+TmFtZSk7CisJCSAgICB0aHVua19saXN0LT51MS5GdW5jdGlvbj0oTFBEV09SRClHZXRQcm9jQWRkcmVzczMyKAorCQkJCQkJTU9EVUxFX0ZpbmRNb2R1bGUgKE1vZHVsZSksCisJCQkJCQlwZV9uYW1lLT5OYW1lKTsKKwkJICAgIGlmICghdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb24pIHsKKwkJCWZwcmludGYoc3RkZXJyLCJObyBpbXBsZW1lbnRhdGlvbiBmb3IgJXMuJWQoJXMpLCBzZXR0aW5nIHRvIE5VTExcbiIsCisJCQkJTW9kdWxlLHBlX25hbWUtPkhpbnQscGVfbmFtZS0+TmFtZSk7CiAJCQkvKiBmaXh1cF9mYWlsZWQ9MTsgKi8KIAkJICAgIH0KIAkJfQogCQlpbXBvcnRfbGlzdCsrOwogCQl0aHVua19saXN0Kys7CiAJICAgIH0KLQl9IGVsc2UgewkJCS8qIEJvcmxhbmQgc3R5bGUgKi8KKwl9IGVsc2UgewkvKiBCb3JsYW5kIHN0eWxlICovCiAJICAgIGRwcmludGZfd2luMzIgKHN0ZGRlYiwgIkJvcmxhbmQgc3R5bGUgaW1wb3J0cyB1c2VkXG4iKTsKLQkgICAgdGh1bmtfbGlzdCA9ICh1bnNpZ25lZCBpbnQgKikoKCh1bnNpZ25lZCBpbnQpbG9hZF9hZGRyKStwZV9pbXAtPlRodW5rX0xpc3QpOwotCSAgICB3aGlsZSAoKnRodW5rX2xpc3QpIHsKLQkJcGVfbmFtZT0oc3RydWN0IHBlX2ltcG9ydF9uYW1lICopKChpbnQpbG9hZF9hZGRyKyp0aHVua19saXN0KTsKLQkJaWYgKCh1bnNpZ25lZCkgcGVfbmFtZSAmIDB4ODAwMDAwMDApIHsKKwkgICAgdGh1bmtfbGlzdCA9IChMUElNQUdFX1RIVU5LX0RBVEEpIFJWQShwZV9pbXAtPkZpcnN0VGh1bmspOworCSAgICB3aGlsZSAodGh1bmtfbGlzdC0+dTEuT3JkaW5hbCkgeworCQlpZiAoSU1BR0VfU05BUF9CWV9PUkRJTkFMKHRodW5rX2xpc3QtPnUxLk9yZGluYWwpKSB7CiAJCSAgICAvKiBub3Qgc3VyZSBhYm91dCB0aGlzIGJyYW5jaCwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgKi8KLQkJICAgIGludCBvcmRpbmFsID0gKnRodW5rX2xpc3QgJiB+MHg4MDAwMDAwMDsKKwkJICAgIGludCBvcmRpbmFsID0gSU1BR0VfT1JESU5BTCh0aHVua19saXN0LT51MS5PcmRpbmFsKTsKKworCisJCSAgICBpZiAoIWxzdHJuY21waTMyQShNb2R1bGUsImtlcm5lbDMyIiw4KSAmJiAKKwkJICAgIAkhb3JkaW1wb3J0d2FybmVkCisJCSAgICApIHsKKwkJICAgICAgIGZwcmludGYoc3RkZXJyLCIlcyBpbXBvcnRzIGtlcm5lbDMyLmRsbCBieSBvcmRpbmFsLiBNYXkgY3Jhc2guXG4iLG1vZG5hbWUpOworCQkgICAgICAgb3JkaW1wb3J0d2FybmVkID0gMTsKKwkJICAgIH0KIAkJICAgIGRwcmludGZfd2luMzIoc3RkZGViLCItLS0gT3JkaW5hbCAlcy4lZFxuIixNb2R1bGUsb3JkaW5hbCk7Ci0JCSAgICAqdGh1bmtfbGlzdCA9ICh1bnNpZ25lZClHZXRQcm9jQWRkcmVzczMyKE1PRFVMRV9GaW5kTW9kdWxlIChNb2R1bGUpLAotCQkJCQkJICAgKExQQ1NUUikgb3JkaW5hbCk7Ci0JCSAgICBpZiAoISp0aHVua19saXN0KSB7CisJCSAgICB0aHVua19saXN0LT51MS5GdW5jdGlvbj0oTFBEV09SRClHZXRQcm9jQWRkcmVzczMyKE1PRFVMRV9GaW5kTW9kdWxlKE1vZHVsZSksCisJCQkJCQkgICAgIChMUENTVFIpIG9yZGluYWwpOworCQkgICAgaWYgKCF0aHVua19saXN0LT51MS5GdW5jdGlvbikgewogCQkJZnByaW50ZihzdGRlcnIsICJObyBpbXBsZW1lbnRhdGlvbiBmb3IgJXMuJWQsIHNldHRpbmcgdG8gTlVMTFxuIiwKIAkJCQlNb2R1bGUsb3JkaW5hbCk7CiAJCQkvKiBmaXh1cF9mYWlsZWQ9MTsgKi8KIAkJICAgIH0KIAkJfSBlbHNlIHsKKwkJICAgIHBlX25hbWU9KExQSU1BR0VfSU1QT1JUX0JZX05BTUUpIFJWQSh0aHVua19saXN0LT51MS5BZGRyZXNzT2ZEYXRhKTsKIAkJICAgIGRwcmludGZfd2luMzIoc3RkZGViLCItLS0gJXMgJXMuJWRcbiIsCi0JCSAgIAkJICBwZV9uYW1lLT5OYW1lLCBNb2R1bGUsIHBlX25hbWUtPkhpbnQpOwotCQkgICAgKnRodW5rX2xpc3QgPSAodW5zaWduZWQpR2V0UHJvY0FkZHJlc3MzMihNT0RVTEVfRmluZE1vZHVsZShNb2R1bGUpLAotCQkJCQkJICAgcGVfbmFtZS0+TmFtZSk7Ci0JCSAgICBpZiAoISp0aHVua19saXN0KSB7CisJCSAgIAkJICBwZV9uYW1lLT5OYW1lLE1vZHVsZSxwZV9uYW1lLT5IaW50KTsKKwkJICAgIHRodW5rX2xpc3QtPnUxLkZ1bmN0aW9uPShMUERXT1JEKUdldFByb2NBZGRyZXNzMzIoTU9EVUxFX0ZpbmRNb2R1bGUoTW9kdWxlKSxwZV9uYW1lLT5OYW1lKTsKKwkJICAgIGlmICghdGh1bmtfbGlzdC0+dTEuRnVuY3Rpb24pIHsKIAkJICAgIAlmcHJpbnRmKHN0ZGVyciwgIk5vIGltcGxlbWVudGF0aW9uIGZvciAlcy4lZCwgc2V0dGluZyB0byBOVUxMXG4iLAogCQkJCU1vZHVsZSwgcGVfbmFtZS0+SGludCk7CiAJCSAgICAJLyogZml4dXBfZmFpbGVkPTE7ICovCkBAIC0yODYsMTMgKzI3MiwxMyBAQAogCiAgIGRwcmludGZfd2luMzIoc3RkZGViLCAiRHVtcCBvZiBzZWdtZW50IHRhYmxlXG4iKTsKICAgZHByaW50Zl93aW4zMihzdGRkZWIsICIgICBOYW1lICAgIFZTeiAgVmFkZHIgICAgIFN6UmF3ICAgRmlsZWFkciAgKlJlbG9jICpMaW5ldW0gI1JlbG9jICNMaW51bSBDaGFyXG4iKTsKLSAgZm9yKGk9MDsgaTwgcGUtPnBlX2hlYWRlci0+Y29mZi5OdW1iZXJPZlNlY3Rpb25zOyBpKyspCisgIGZvcihpPTA7IGk8IHBlLT5wZV9oZWFkZXItPkZpbGVIZWFkZXIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKQogICAgIHsKICAgICAgIGRwcmludGZfd2luMzIoc3RkZGViLCAiJThzOiAlNC40bHggJTguOGx4ICU4LjhseCAlOC44bHggJTguOGx4ICU4LjhseCAlNC40eCAlNC40eCAlOC44bHhcbiIsIAogCSAgICAgcGUtPnBlX3NlZ1tpXS5OYW1lLCAKLQkgICAgIHBlLT5wZV9zZWdbaV0uVmlydHVhbF9TaXplLAotCSAgICAgcGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3MsCi0JICAgICBwZS0+cGVfc2VnW2ldLlNpemVfT2ZfUmF3X0RhdGEsCisJICAgICBwZS0+cGVfc2VnW2ldLk1pc2MuVmlydHVhbFNpemUsCisJICAgICBwZS0+cGVfc2VnW2ldLlZpcnR1YWxBZGRyZXNzLAorCSAgICAgcGUtPnBlX3NlZ1tpXS5TaXplT2ZSYXdEYXRhLAogCSAgICAgcGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9SYXdEYXRhLAogCSAgICAgcGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9SZWxvY2F0aW9ucywKIAkgICAgIHBlLT5wZV9zZWdbaV0uUG9pbnRlclRvTGluZW51bWJlcnMsCkBAIC0zMDAsMzMgKzI4NiwzNiBAQAogCSAgICAgcGUtPnBlX3NlZ1tpXS5OdW1iZXJPZkxpbmVudW1iZXJzLAogCSAgICAgcGUtPnBlX3NlZ1tpXS5DaGFyYWN0ZXJpc3RpY3MpOwogCSAgcGUtPnZtYV9zaXplID0gTUFYKHBlLT52bWFfc2l6ZSwKLQkgIAkJcGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3MgKyAKLQkJCXBlLT5wZV9zZWdbaV0uU2l6ZV9PZl9SYXdfRGF0YSk7CisJICAJCXBlLT5wZV9zZWdbaV0uVmlydHVhbEFkZHJlc3MgKyAKKwkJCXBlLT5wZV9zZWdbaV0uU2l6ZU9mUmF3RGF0YSk7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBkb19yZWxvY2F0aW9ucyhzdHJ1Y3QgcGVfZGF0YSAqcGUpCiB7CiAJaW50IGRlbHRhID0gcGUtPmxvYWRfYWRkciAtIHBlLT5iYXNlX2FkZHI7Ci0Jc3RydWN0IFBFX1JlbG9jX0Jsb2NrICpyID0gcGUtPnBlX3JlbG9jOworCXVuc2lnbmVkIGludCBsb2FkX2FkZHIgPSBwZS0+bG9hZF9hZGRyOworCUlNQUdFX0JBU0VfUkVMT0NBVElPTgkqciA9IHBlLT5wZV9yZWxvYzsKIAlpbnQgaGRlbHRhID0gKGRlbHRhID4+IDE2KSAmIDB4RkZGRjsKIAlpbnQgbGRlbHRhID0gZGVsdGEgJiAweEZGRkY7CisKIAkvKiBpbnQgcmVsb2Nfc2l6ZSA9ICovCisKIAlpZihkZWx0YSA9PSAwKQogCQkvKiBOb3RoaW5nIHRvIGRvICovCiAJCXJldHVybjsKLQl3aGlsZShyLT5QYWdlUlZBKQorCXdoaWxlKHItPlZpcnR1YWxBZGRyZXNzKQogCXsKLQkJY2hhciAqcGFnZSA9IChjaGFyKilwZS0+bG9hZF9hZGRyICsgci0+UGFnZVJWQTsKLQkJaW50IGNvdW50ID0gKHItPkJsb2NrU2l6ZSAtIDgpLzI7CisJCWNoYXIgKnBhZ2UgPSAoY2hhciopIFJWQShyLT5WaXJ0dWFsQWRkcmVzcyk7CisJCWludCBjb3VudCA9IChyLT5TaXplT2ZCbG9jayAtIDgpLzI7CiAJCWludCBpOwogCQlkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwgIiV4IHJlbG9jYXRpb25zIGZvciBwYWdlICVseFxuIiwKLQkJCWNvdW50LCByLT5QYWdlUlZBKTsKKwkJCWNvdW50LCByLT5WaXJ0dWFsQWRkcmVzcyk7CiAJCS8qIHBhdGNoaW5nIGluIHJldmVyc2Ugb3JkZXIgKi8KIAkJZm9yKGk9MDtpPGNvdW50O2krKykKIAkJewotCQkJaW50IG9mZnNldCA9IHItPlJlbG9jYXRpb25zW2ldICYgMHhGRkY7Ci0JCQlpbnQgdHlwZSA9IHItPlJlbG9jYXRpb25zW2ldID4+IDEyOworCQkJaW50IG9mZnNldCA9IHItPlR5cGVPZmZzZXRbaV0gJiAweEZGRjsKKwkJCWludCB0eXBlID0gci0+VHlwZU9mZnNldFtpXSA+PiAxMjsKIAkJCWRwcmludGZfZml4dXAoc3RkZGViLCJwYXRjaGluZyAleCB0eXBlICV4XG4iLCBvZmZzZXQsIHR5cGUpOwogCQkJc3dpdGNoKHR5cGUpCiAJCQl7CkBAIC0zNDIsNyArMzMxLDcgQEAKIAkJCQkqKGludCopKHBhZ2Urb2Zmc2V0KSArPSBkZWx0YTsKICNlbHNlCiAJCQkJeyBpbnQgaD0qKHVuc2lnbmVkIHNob3J0KikocGFnZStvZmZzZXQpOwotCQkJCSAgaW50IGw9ci0+UmVsb2NhdGlvbnNbKytpXTsKKwkJCQkgIGludCBsPXItPlR5cGVPZmZzZXRbKytpXTsKIAkJCQkgICoodW5zaWduZWQgaW50KikocGFnZSArIG9mZnNldCkgPSAoaDw8MTYpICsgbCArIGRlbHRhOwogCQkJCX0KICNlbmRpZgpAQCAtMzU4LDcgKzM0Nyw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJciA9IChzdHJ1Y3QgUEVfUmVsb2NfQmxvY2sqKSgoY2hhciopciArIHItPkJsb2NrU2l6ZSk7CisJCXIgPSAoSU1BR0VfQkFTRV9SRUxPQ0FUSU9OKikoKGNoYXIqKXIgKyByLT5TaXplT2ZCbG9jayk7CiAJfQogfQogCQkKQEAgLTM3Miw0MCArMzYxLDM5IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcGVfZGF0YSAqUEVfTG9hZEltYWdlKCBpbnQgZmQsIEhNT0RVTEUxNiBoTW9kdWxlLCBXT1JEIG9mZnNldCApCiB7Ci0gICAgc3RydWN0IHBlX2RhdGEgKnBlOwotICAgIGludCBpLCByZXN1bHQ7Ci0gICAgaW50IGxvYWRfYWRkcjsKLSAgICBzdHJ1Y3QgRGlyZWN0b3J5IGRpcjsKLSAgICBjaGFyCWJ1ZmZlclsyMDBdOwotICAgIERCR19BRERSCWRhZGRyOworCXN0cnVjdCBwZV9kYXRhCQkqcGU7CisJaW50CQkJaSwgcmVzdWx0OworCWludAkJCWxvYWRfYWRkcjsKKwlJTUFHRV9EQVRBX0RJUkVDVE9SWQlkaXI7CisJY2hhcgkJCWJ1ZmZlclsyMDBdOworCURCR19BRERSCQlkYWRkcjsKIAogCWRhZGRyLnNlZz0wOwogCWRhZGRyLnR5cGUgPSBOVUxMOwogCXBlID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBlX2RhdGEpKTsKIAltZW1zZXQocGUsMCxzaXplb2Yoc3RydWN0IHBlX2RhdGEpKTsKLQlwZS0+cGVfaGVhZGVyID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBlX2hlYWRlcl9zKSk7CisJcGUtPnBlX2hlYWRlciA9IHhtYWxsb2Moc2l6ZW9mKElNQUdFX05UX0hFQURFUlMpKTsKIAogCS8qIHJlYWQgUEUgaGVhZGVyICovCiAJbHNlZWsoIGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLQlyZWFkKCBmZCwgcGUtPnBlX2hlYWRlciwgc2l6ZW9mKHN0cnVjdCBwZV9oZWFkZXJfcykpOworCXJlYWQoIGZkLCBwZS0+cGVfaGVhZGVyLCBzaXplb2YoSU1BR0VfTlRfSEVBREVSUykpOwogCiAvKiBGSVhNRTogdGhpcyBpcyBhICpob3JyaWJsZSogaGFjayB0byBtYWtlIENPTURMRzMyLkRMTCBsb2FkIE9LLiBUaGUKIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQgcHJvcGVybHkgYXQgc29tZSBzdGFnZSAqLwogCi0JaWYgKHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLk51bWJlck9mUnZhQW5kU2l6ZXMgIT0gMTYpIHsKKwlpZiAocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuTnVtYmVyT2ZSdmFBbmRTaXplcyAhPSAxNikgewogCQlwcmludGYoIlNob3J0IFBFIEhlYWRlciEhIVxuIik7Ci0JCWxzZWVrKCBmZCwgLSgxNiAtIHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLk51bWJlck9mUnZhQW5kU2l6ZXMpICogc2l6ZW9mIChzdHJ1Y3QgRGlyZWN0b3J5KSwgU0VFS19DVVIpOworCQlsc2VlayggZmQsIC0oMTYgLSBwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5OdW1iZXJPZlJ2YUFuZFNpemVzKSAqIHNpemVvZihJTUFHRV9EQVRBX0RJUkVDVE9SWSksIFNFRUtfQ1VSKTsKIAl9CiAKIC8qIGhvcnJpYmxlIGhhY2sgZW5kcyAhISEgKi8KLQogCS8qIHJlYWQgc2VjdGlvbnMgKi8KLQlwZS0+cGVfc2VnID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBlX3NlZ21lbnRfdGFibGUpICogCi0JCQkJICAgcGUtPnBlX2hlYWRlci0+Y29mZi5OdW1iZXJPZlNlY3Rpb25zKTsKLQlyZWFkKCBmZCwgcGUtPnBlX3NlZywgc2l6ZW9mKHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlKSAqIAotCQkJcGUtPnBlX2hlYWRlci0+Y29mZi5OdW1iZXJPZlNlY3Rpb25zKTsKKwlwZS0+cGVfc2VnID0geG1hbGxvYyhzaXplb2YoSU1BR0VfU0VDVElPTl9IRUFERVIpICogCisJCQkJICAgcGUtPnBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zKTsKKwlyZWFkKCBmZCwgcGUtPnBlX3NlZywgc2l6ZW9mKElNQUdFX1NFQ1RJT05fSEVBREVSKSAqIAorCQkJcGUtPnBlX2hlYWRlci0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zKTsKIAotCWxvYWRfYWRkciA9IHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkJhc2VPZkltYWdlOworCWxvYWRfYWRkciA9IHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkltYWdlQmFzZTsKIAlwZS0+YmFzZV9hZGRyPWxvYWRfYWRkcjsKIAlwZS0+dm1hX3NpemU9MDsKIAlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIkxvYWQgYWRkciBpcyAleFxuIixsb2FkX2FkZHIpOwpAQCAtNDI5LDEzNSArNDE3LDEyMiBAQAogCQlwZS0+bG9hZF9hZGRyLCBwZS0+dm1hX3NpemUpOwogCQogCi0JZm9yKGk9MDsgaSA8IHBlLT5wZV9oZWFkZXItPmNvZmYuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKQorCWZvcihpPTA7IGkgPCBwZS0+cGVfaGVhZGVyLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7IGkrKykKIAl7CiAJCS8qIGxvYWQgb25seSBub24tQlNTIHNlZ21lbnRzICovCiAJCWlmKHBlLT5wZV9zZWdbaV0uQ2hhcmFjdGVyaXN0aWNzICYgCi0JCQl+IElNQUdFX1NDTl9UWVBFX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEpCisJCQl+IElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBKQogCQlpZihsc2VlayhmZCxwZS0+cGVfc2VnW2ldLlBvaW50ZXJUb1Jhd0RhdGEsU0VFS19TRVQpID09IC0xCi0JCXx8IHJlYWQoZmQsKGNoYXIgKilsb2FkX2FkZHIgKyBwZS0+cGVfc2VnW2ldLlZpcnR1YWxfQWRkcmVzcywKLQkJCQlwZS0+cGVfc2VnW2ldLlNpemVfT2ZfUmF3X0RhdGEpIAotCQkJCSE9IHBlLT5wZV9zZWdbaV0uU2l6ZV9PZl9SYXdfRGF0YSkKKwkJfHwgcmVhZChmZCwoY2hhciopUlZBKHBlLT5wZV9zZWdbaV0uVmlydHVhbEFkZHJlc3MpLAorCQkJICAgcGUtPnBlX3NlZ1tpXS5TaXplT2ZSYXdEYXRhKSAhPSBwZS0+cGVfc2VnW2ldLlNpemVPZlJhd0RhdGEpCiAJCXsKIAkJCWZwcmludGYoc3RkZXJyLCJGYWlsZWQgdG8gbG9hZCBzZWN0aW9uICV4XG4iLCBpKTsKIAkJCWV4aXQoMCk7CiAJCX0KLQkJcmVzdWx0ID0gbG9hZF9hZGRyICsgcGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3M7Ci0jaWYgMAotCWlmKCFsb2FkX2FkZHIpIHsKLQkJCi0JCXJlc3VsdCA9IChpbnQpeG1tYXAoKGNoYXIgKikwLCBwZS0+cGVfc2VnW2ldLlZpcnR1YWxfU2l6ZSwKLQkJCXBlLT5wZV9zZWdbaV0uU2l6ZV9PZl9SYXdfRGF0YSwgNywKLQkJCU1BUF9QUklWQVRFLCBmZCwgcGUtPnBlX3NlZ1tpXS5Qb2ludGVyVG9SYXdEYXRhKTsKLQkJbG9hZF9hZGRyID0gKHVuc2lnbmVkIGludCkgcmVzdWx0IC0gIHBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IChpbnQpeG1tYXAoKGNoYXIgKikgbG9hZF9hZGRyICsgcGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3MsIAotCQkJICBwZS0+cGVfc2VnW2ldLlZpcnR1YWxfU2l6ZSwKLQkJICAgICAgcGUtPnBlX3NlZ1tpXS5TaXplX09mX1Jhd19EYXRhLCA3LCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgCi0JCSAgICAgIGZkLCBwZS0+cGVfc2VnW2ldLlBvaW50ZXJUb1Jhd0RhdGEpOwotCX0KLQlpZihyZXN1bHQ9PS0xKXsKLQkJZnByaW50ZihzdGRlcnIsIkNvdWxkIG5vdCBsb2FkIHNlY3Rpb24gJXggdG8gZGVzaXJlZCBhZGRyZXNzICVseFxuIiwKLQkJCWksIGxvYWRfYWRkcitwZS0+cGVfc2VnW2ldLlZpcnR1YWxfQWRkcmVzcyk7Ci0JCWZwcmludGYoc3RkZXJyLCJOZWVkIHRvIGltcGxlbWVudCByZWxvY2F0aW9ucyBub3dcbiIpOwotCQlleGl0KDApOwotCX0KKwkJcmVzdWx0ID0gUlZBIChwZS0+cGVfc2VnW2ldLlZpcnR1YWxBZGRyZXNzKTsKKyNpZiAxCisJCS8qIG5vdCBuZWVkZWQsIG1lbW9yeSBpcyB6ZXJvICovCisJCWlmKHN0cmNtcChwZS0+cGVfc2VnW2ldLk5hbWUsICIuYnNzIikgPT0gMCkKKwkJICAgIG1lbXNldCgodm9pZCAqKXJlc3VsdCwgMCwgCisJCQkgICBwZS0+cGVfc2VnW2ldLk1pc2MuVmlydHVhbFNpemUgPworCQkJICAgcGUtPnBlX3NlZ1tpXS5NaXNjLlZpcnR1YWxTaXplIDoKKwkJCSAgIHBlLT5wZV9zZWdbaV0uU2l6ZU9mUmF3RGF0YSk7CiAjZW5kaWYKIAotI2lmIDAKLQkvKiBub3QgbmVlZGVkLCBtZW1vcnkgaXMgemVybyAqLwotICAgICAgICBpZihzdHJjbXAocGUtPnBlX3NlZ1tpXS5OYW1lLCAiLmJzcyIpID09IDApCi0gICAgICAgICAgICBtZW1zZXQoKHZvaWQgKilyZXN1bHQsIDAsIAotICAgICAgICAgICAgICAgICAgIHBlLT5wZV9zZWdbaV0uVmlydHVhbF9TaXplID8KLSAgICAgICAgICAgICAgICAgICBwZS0+cGVfc2VnW2ldLlZpcnR1YWxfU2l6ZSA6Ci0gICAgICAgICAgICAgICAgICAgcGUtPnBlX3NlZ1tpXS5TaXplX09mX1Jhd19EYXRhKTsKLSNlbmRpZgorCQlpZihzdHJjbXAocGUtPnBlX3NlZ1tpXS5OYW1lLCAiLmlkYXRhIikgPT0gMCkKKwkJCXBlLT5wZV9pbXBvcnQgPSAoTFBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUikgcmVzdWx0OwogCi0JaWYoc3RyY21wKHBlLT5wZV9zZWdbaV0uTmFtZSwgIi5pZGF0YSIpID09IDApCi0JCXBlLT5wZV9pbXBvcnQgPSAoc3RydWN0IFBFX0ltcG9ydF9EaXJlY3RvcnkgKikgcmVzdWx0OworCQlpZihzdHJjbXAocGUtPnBlX3NlZ1tpXS5OYW1lLCAiLmVkYXRhIikgPT0gMCkKKwkJCXBlLT5wZV9leHBvcnQgPSAoTFBJTUFHRV9FWFBPUlRfRElSRUNUT1JZKSByZXN1bHQ7CiAKLQlpZihzdHJjbXAocGUtPnBlX3NlZ1tpXS5OYW1lLCAiLmVkYXRhIikgPT0gMCkKLQkJcGUtPnBlX2V4cG9ydCA9IChzdHJ1Y3QgUEVfRXhwb3J0X0RpcmVjdG9yeSAqKSByZXN1bHQ7CisJCWlmKHN0cmNtcChwZS0+cGVfc2VnW2ldLk5hbWUsICIucnNyYyIpID09IDApCisJCQlwZS0+cGVfcmVzb3VyY2UgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpIHJlc3VsdDsKIAotCWlmKHN0cmNtcChwZS0+cGVfc2VnW2ldLk5hbWUsICIucnNyYyIpID09IDApCi0JICAgIHBlLT5wZV9yZXNvdXJjZSA9IChzdHJ1Y3QgUEVfUmVzb3VyY2VfRGlyZWN0b3J5ICopIHJlc3VsdDsKLQotCWlmKHN0cmNtcChwZS0+cGVfc2VnW2ldLk5hbWUsICIucmVsb2MiKSA9PSAwKQotCQlwZS0+cGVfcmVsb2MgPSAoc3RydWN0IFBFX1JlbG9jX0Jsb2NrICopIHJlc3VsdDsKKwkJaWYoc3RyY21wKHBlLT5wZV9zZWdbaV0uTmFtZSwgIi5yZWxvYyIpID09IDApCisJCQlwZS0+cGVfcmVsb2MgPSAoTFBJTUFHRV9CQVNFX1JFTE9DQVRJT04pIHJlc3VsdDsKIAogCX0KIAogCS8qIFRoZXJlIGlzIHdvcmQgdGhhdCB0aGUgYWN0dWFsIGxvYWRlciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQogCSAgIHNlY3Rpb24gbmFtZXMsIGFuZCBvbmx5IGdvZXMgZm9yIHRoZSBEYXRhRGlyZWN0b3J5ICovCi0JZGlyPXBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9FWFBPUlRfRElSRUNUT1JZXTsKKwlkaXI9cGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfRVhQT1JUXTsKIAlpZihkaXIuU2l6ZSkKIAl7Ci0JCWlmKHBlLT5wZV9leHBvcnQgJiYgCi0JCQkoaW50KXBlLT5wZV9leHBvcnQhPWxvYWRfYWRkcitkaXIuVmlydHVhbF9hZGRyZXNzKQorCQlpZihwZS0+cGVfZXhwb3J0ICYmIChpbnQpcGUtPnBlX2V4cG9ydCE9UlZBKGRpci5WaXJ0dWFsQWRkcmVzcykpCiAJCQlmcHJpbnRmKHN0ZGVyciwid3JvbmcgZXhwb3J0IGRpcmVjdG9yeT8/XG4iKTsKIAkJLyogYWx3YXlzIHRydXN0IHRoZSBkaXJlY3RvcnkgKi8KLQkJcGUtPnBlX2V4cG9ydCA9ICh2b2lkICopKGxvYWRfYWRkcitkaXIuVmlydHVhbF9hZGRyZXNzKTsKKwkJcGUtPnBlX2V4cG9ydCA9IChMUElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkpIFJWQShkaXIuVmlydHVhbEFkZHJlc3MpOwogCX0KIAotCWRpcj1wZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfSU1QT1JUX0RJUkVDVE9SWV07CisJZGlyPXBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0lNUE9SVF07CiAJaWYoZGlyLlNpemUpCiAJewotCQlpZihwZS0+cGVfaW1wb3J0ICYmIAotCQkJKGludClwZS0+cGVfaW1wb3J0IT1sb2FkX2FkZHIrZGlyLlZpcnR1YWxfYWRkcmVzcykKKwkJaWYocGUtPnBlX2ltcG9ydCAmJiAoaW50KXBlLT5wZV9pbXBvcnQhPVJWQShkaXIuVmlydHVhbEFkZHJlc3MpKQogCQkJZnByaW50ZihzdGRlcnIsIndyb25nIGltcG9ydCBkaXJlY3Rvcnk/P1xuIik7Ci0JCXBlLT5wZV9pbXBvcnQgPSAodm9pZCAqKShsb2FkX2FkZHIrZGlyLlZpcnR1YWxfYWRkcmVzcyk7CisJCXBlLT5wZV9pbXBvcnQgPSAoTFBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUikgUlZBKGRpci5WaXJ0dWFsQWRkcmVzcyk7CiAJfQogCi0JZGlyPXBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9SRVNPVVJDRV9ESVJFQ1RPUlldOworCWRpcj1wZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRV07CiAJaWYoZGlyLlNpemUpCiAJewotCQlpZihwZS0+cGVfcmVzb3VyY2UgJiYgCi0JCQkoaW50KXBlLT5wZV9yZXNvdXJjZSE9bG9hZF9hZGRyK2Rpci5WaXJ0dWFsX2FkZHJlc3MpCisJCWlmKHBlLT5wZV9yZXNvdXJjZSAmJiAoaW50KXBlLT5wZV9yZXNvdXJjZSE9UlZBKGRpci5WaXJ0dWFsQWRkcmVzcykpCiAJCQlmcHJpbnRmKHN0ZGVyciwid3JvbmcgcmVzb3VyY2UgZGlyZWN0b3J5Pz9cbiIpOwotCQlwZS0+cGVfcmVzb3VyY2UgPSAodm9pZCAqKShsb2FkX2FkZHIrZGlyLlZpcnR1YWxfYWRkcmVzcyk7CisJCXBlLT5wZV9yZXNvdXJjZSA9IChMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkgUlZBKGRpci5WaXJ0dWFsQWRkcmVzcyk7CiAJfQogCi0JZGlyPXBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9CQVNFX1JFTE9DQVRJT05fVEFCTEVdOwotCWlmKGRpci5TaXplKQotCXsKLQkJaWYocGUtPnBlX3JlbG9jICYmIAotCQkJKGludClwZS0+cGVfcmVsb2MhPWxvYWRfYWRkcitkaXIuVmlydHVhbF9hZGRyZXNzKQotCQkJZnByaW50ZihzdGRlcnIsIndyb25nIHJlbG9jYXRpb24gbGlzdD8/XG4iKTsKLQkJcGUtPnBlX3JlbG9jID0gKHZvaWQgKikobG9hZF9hZGRyK2Rpci5WaXJ0dWFsX2FkZHJlc3MpOwotCX0KLQotCWlmKHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnkKLQkJW0lNQUdFX0ZJTEVfRVhDRVBUSU9OX0RJUkVDVE9SWV0uU2l6ZSkKKwlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9FWENFUFRJT05dLlNpemUpCiAJCWRwcmludGZfd2luMzIoc3RkbmltcCwiRXhjZXB0aW9uIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKIAotCWlmKHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnkKLQkJW0lNQUdFX0ZJTEVfU0VDVVJJVFlfRElSRUNUT1JZXS5TaXplKQorCWlmKHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1NFQ1VSSVRZXS5TaXplKQogCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIlNlY3VyaXR5IGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKIAotCWlmKHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnkKLQkJW0lNQUdFX0ZJTEVfREVCVUdfRElSRUNUT1JZXS5TaXplKQorCisKKwlkaXI9cGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfQkFTRVJFTE9DXTsKKwlpZihkaXIuU2l6ZSkKKwl7CisJCWlmKHBlLT5wZV9yZWxvYyAmJiAoaW50KXBlLT5wZV9yZWxvYyE9IFJWQShkaXIuVmlydHVhbEFkZHJlc3MpKQorCQkJZnByaW50ZihzdGRlcnIsIndyb25nIHJlbG9jYXRpb24gbGlzdD8/XG4iKTsKKwkJcGUtPnBlX3JlbG9jID0gKHZvaWQgKikgUlZBKGRpci5WaXJ0dWFsQWRkcmVzcyk7CisJfQorCisJaWYocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQorCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHXS5TaXplKQogCSAgewogCSAgICBERUJVR19SZWdpc3RlckRlYnVnSW5mbyhmZCwgcGUsIGxvYWRfYWRkciwgCi0JCQlwZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfREVCVUdfRElSRUNUT1JZXS5WaXJ0dWFsX2FkZHJlc3MsCi0JCQlwZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfREVCVUdfRElSRUNUT1JZXS5TaXplKTsKKwkJCXBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHXS5WaXJ0dWFsQWRkcmVzcywKKwkJCXBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0RFQlVHXS5TaXplKTsKIAkgIH0KIAotCWlmKHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnkKLQkJW0lNQUdFX0ZJTEVfREVTQ1JJUFRJT05fU1RSSU5HXS5TaXplKQotCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkRlc2NyaXB0aW9uIHN0cmluZyBpZ25vcmVkXG4iKTsKKwlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CisJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfQ09QWVJJR0hUXS5TaXplKQorCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkNvcHlyaWdodCBzdHJpbmcgaWdub3JlZFxuIik7CiAKLQlpZihwZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5Ci0JCVtJTUFHRV9GSUxFX01BQ0hJTkVfVkFMVUVdLlNpemUpCi0JCWRwcmludGZfd2luMzIoc3RkbmltcCwiTWFjaGluZSBWYWx1ZSBpZ25vcmVkXG4iKTsKKwlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CisJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfR0xPQkFMUFRSXS5TaXplKQorCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkdsb2JhbCBQb2ludGVyIChNSVBTKSBpZ25vcmVkXG4iKTsKIAotCWlmKHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkRhdGFEaXJlY3RvcnkKLQkJW0lNQUdFX0ZJTEVfVEhSRUFEX0xPQ0FMX1NUT1JBR0VdLlNpemUpCisJaWYocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQorCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX1RMU10uU2l6ZSkKIAkJIGRwcmludGZfd2luMzIoc3RkbmltcCwiVGhyZWFkIGxvY2FsIHN0b3JhZ2UgaWdub3JlZFxuIik7CiAKLQlpZihwZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5EYXRhRGlyZWN0b3J5Ci0JCVtJTUFHRV9GSUxFX0NBTExCQUNLX0RJUkVDVE9SWV0uU2l6ZSkKLQkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJDYWxsYmFjayBkaXJlY3RvcnkgaWdub3JlZFxuIik7CisJaWYocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeQorCQlbSU1BR0VfRElSRUNUT1JZX0VOVFJZX0xPQURfQ09ORklHXS5TaXplKQorCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkxvYWQgQ29uZmlndXJhdGlvbiBkaXJlY3RvcnkgaWdub3JlZFxuIik7CiAKKwlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CisJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfQk9VTkRfSU1QT1JUXS5TaXplKQorCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkJvdW5kIEltcG9ydCBkaXJlY3RvcnkgaWdub3JlZFxuIik7CisKKwlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5CisJCVtJTUFHRV9ESVJFQ1RPUllfRU5UUllfSUFUXS5TaXplKQorCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIkltcG9ydCBBZGRyZXNzIFRhYmxlIGRpcmVjdG9yeSBpZ25vcmVkXG4iKTsKKwlpZihwZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5WzEzXS5TaXplKQorCQlkcHJpbnRmX3dpbjMyKHN0ZG5pbXAsIlVua25vd24gZGlyZWN0b3J5IDEzIGlnbm9yZWRcbiIpOworCWlmKHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbMTRdLlNpemUpCisJCWRwcmludGZfd2luMzIoc3RkbmltcCwiVW5rbm93biBkaXJlY3RvcnkgMTQgaWdub3JlZFxuIik7CisJaWYocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVsxNV0uU2l6ZSkKKwkJZHByaW50Zl93aW4zMihzdGRuaW1wLCJVbmtub3duIGRpcmVjdG9yeSAxNSBpZ25vcmVkXG4iKTsKIAogCWlmKHBlLT5wZV9yZWxvYykgZG9fcmVsb2NhdGlvbnMocGUpOwogCWlmKHBlLT5wZV9pbXBvcnQpIGZpeHVwX2ltcG9ydHMocGUsIGhNb2R1bGUpOwpAQCAtNTY1LDIxICs1NDAsMjEgQEAKICAgCQkKIAlpZiAocGUtPnBlX2V4cG9ydCkgewogCQkvKiBhZGQgc3RhcnQgb2Ygc2VjdGlvbnMgYXMgZGVidWdzeW1ib2xzICovCi0JCWZvcihpPTA7aTxwZS0+cGVfaGVhZGVyLT5jb2ZmLk51bWJlck9mU2VjdGlvbnM7aSsrKSB7CisJCWZvcihpPTA7aTxwZS0+cGVfaGVhZGVyLT5GaWxlSGVhZGVyLk51bWJlck9mU2VjdGlvbnM7aSsrKSB7CiAJCQlzcHJpbnRmKGJ1ZmZlciwiJXMuJXMiLAotCQkJCSgoY2hhciopbG9hZF9hZGRyKStwZS0+cGVfZXhwb3J0LT5OYW1lLAorCQkJCShjaGFyKilSVkEocGUtPnBlX2V4cG9ydC0+TmFtZSksCiAJCQkJcGUtPnBlX3NlZ1tpXS5OYW1lCiAJCQkpOwotCQkJZGFkZHIub2ZmPWxvYWRfYWRkcitwZS0+cGVfc2VnW2ldLlZpcnR1YWxfQWRkcmVzczsKKwkJCWRhZGRyLm9mZj0gUlZBKHBlLT5wZV9zZWdbaV0uVmlydHVhbEFkZHJlc3MpOwogCQkJREVCVUdfQWRkU3ltYm9sKGJ1ZmZlciwmZGFkZHIsIE5VTEwsIFNZTV9XSU4zMiB8IFNZTV9GVU5DKTsKIAkJfQogCQkvKiBhZGQgZW50cnkgcG9pbnQgKi8KLQkJc3ByaW50ZihidWZmZXIsIiVzLkVudHJ5UG9pbnQiLCgoY2hhciopbG9hZF9hZGRyKStwZS0+cGVfZXhwb3J0LT5OYW1lKTsKLQkJZGFkZHIub2ZmPWxvYWRfYWRkcitwZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5BZGRyZXNzT2ZFbnRyeVBvaW50OworCQlzcHJpbnRmKGJ1ZmZlciwiJXMuRW50cnlQb2ludCIsKGNoYXIqKVJWQShwZS0+cGVfZXhwb3J0LT5OYW1lKSk7CisJCWRhZGRyLm9mZj1SVkEocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCk7CiAJCURFQlVHX0FkZFN5bWJvbChidWZmZXIsJmRhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CiAJCS8qIGFkZCBzdGFydCBvZiBETEwgKi8KIAkJZGFkZHIub2ZmPWxvYWRfYWRkcjsKLQkJREVCVUdfQWRkU3ltYm9sKCgoY2hhciopbG9hZF9hZGRyKStwZS0+cGVfZXhwb3J0LT5OYW1lLCZkYWRkciwKKwkJREVCVUdfQWRkU3ltYm9sKChjaGFyKikgUlZBKHBlLT5wZV9leHBvcnQtPk5hbWUpLCZkYWRkciwKIAkJCQlOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CiAJfQogICAgICAgICByZXR1cm4gcGU7CkBAIC02MDUsNyArNTgwLDcgQEAKIAogICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9DcmVhdGVJbnN0YW5jZSggaE1vZHVsZSwgcGFyYW1zICk7CiAKLSAgICBpZiAoIShwTW9kdWxlLT5wZV9tb2R1bGUtPnBlX2hlYWRlci0+Y29mZi5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkpCisgICAgaWYgKCEocE1vZHVsZS0+cGVfbW9kdWxlLT5wZV9oZWFkZXItPkZpbGVIZWFkZXIuQ2hhcmFjdGVyaXN0aWNzICYgSU1BR0VfRklMRV9ETEwpKQogICAgIHsKICAgICAgICAgVEFTS19DcmVhdGVUYXNrKCBoTW9kdWxlLCBoSW5zdGFuY2UsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5oRW52aXJvbm1lbnQsCkBAIC02MjYsNiArNjAxLDcgQEAKIHsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgUEVfTU9EVUxFICpwZTsKKyAgICB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyOwogCiAgICAgaE1vZHVsZSA9IEdldEV4ZVB0cihoTW9kdWxlKTsKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0cihoTW9kdWxlKSkpIHJldHVybjsKQEAgLTYzNiwxMyArNjEyLDE4IEBACiAgICAgICoJICAgICAgKHRoZSBNU0ROIGxpYnJhcnkgSkFOOTYgc2F5cyAncmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UnKQogICAgICAqLwogICAgICAgICAKLSAgICAvKiBJcyB0aGlzIGEgbGlicmFyeT8gKi8KLSAgICBpZiAocGUtPnBlX2hlYWRlci0+Y29mZi5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiSW5pdFBFRExMKCkgY2FsbGVkIVxuIik7Ci0gICAgICAgIENhbGxETExFbnRyeVByb2MzMiggKEZBUlBST0MzMikocGUtPmxvYWRfYWRkciArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkFkZHJlc3NPZkVudHJ5UG9pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIERMTF9QUk9DRVNTX0FUVEFDSCwgLTEgKTsKKyAgICAvKiBJcyB0aGlzIGEgbGlicmFyeT8gQW5kIGhhcyBpdCBnb3QgYW4gZW50cnlwb2ludD8gKi8KKyAgICBpZiAoCShwZS0+cGVfaGVhZGVyLT5GaWxlSGVhZGVyLkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX0ZJTEVfRExMKSAmJgorCQkocGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCkKKyAgICApIHsKKyAgICAgICAgbG9hZF9hZGRyID0gcGUtPmxvYWRfYWRkcjsKKwlwcmludGYoIkluaXRQRURMTCgpIGNhbGxlZCFcbiIpOworCUNhbGxETExFbnRyeVByb2MzMiggCisJICAgIChGQVJQUk9DMzIpUlZBKHBlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpLAorCSAgICBoTW9kdWxlLAorCSAgICBETExfUFJPQ0VTU19BVFRBQ0gsCisJICAgIC0xCisJKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9yZXNvdXJjZS5jIGIvbG9hZGVyL3BlX3Jlc291cmNlLmMKaW5kZXggNzRiNzRiYy4uN2M3ZTZhZiAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3BlX3Jlc291cmNlLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiaGFuZGxlMzIuaCIKICNpbmNsdWRlICJsaWJyZXMuaCIKLSNpbmNsdWRlICJyZXNvdXJjZTMyLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAiYWNjZWwuaCIKQEAgLTQyLDQ4ICs0MSw0NyBAQAogICoJSGVscGVyIGZ1bmN0aW9uIC0gZ29lcyBkb3duIG9uZSBsZXZlbCBvZiBQRSByZXNvdXJjZSB0cmVlCiAgKgogICovCi1QSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIEdldFJlc0RpckVudHJ5VyhQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIHJlc2RpcnB0ciwKLQkJCQkJIExQQ1dTVFIgbmFtZSwKLQkJCQkJIERXT1JEIHJvb3QpCitMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBHZXRSZXNEaXJFbnRyeVcoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgcmVzZGlycHRyLAorCQkJCQkgICBMUENXU1RSIG5hbWUsRFdPUkQgcm9vdCkKIHsKICAgICBpbnQgZW50cnludW07Ci0gICAgUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSBlbnRyeVRhYmxlOwotCWludCBuYW1lbGVuOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIGVudHJ5VGFibGU7CisgICAgaW50IG5hbWVsZW47CiAKICAgICBpZiAoSElXT1JEKG5hbWUpKSB7CiAgICAgLyogRklYTUU6IHdoYXQgYWJvdXQgI3h4eCBuYW1lcz8gKi8KLQllbnRyeVRhYmxlID0gKFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkpICgKKwllbnRyeVRhYmxlID0gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZKSAoCiAJCQkoQllURSAqKSByZXNkaXJwdHIgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKTsKIAluYW1lbGVuID0gbHN0cmxlbjMyVyhuYW1lKTsKIAlmb3IgKGVudHJ5bnVtID0gMDsgZW50cnludW0gPCByZXNkaXJwdHItPk51bWJlck9mTmFtZWRFbnRyaWVzOyBlbnRyeW51bSsrKQogCXsKLQkJUElNQUdFX1JFU09VUkNFX0RJUl9TVFJJTkdfVSBzdHIgPQotCQkoUElNQUdFX1JFU09VUkNFX0RJUl9TVFJJTkdfVSkgKHJvb3QgKyAKLQkJCShlbnRyeVRhYmxlW2VudHJ5bnVtXS5OYW1lICYgMHg3ZmZmZmZmZikpOworCQlMUElNQUdFX1JFU09VUkNFX0RJUl9TVFJJTkdfVSBzdHIgPQorCQkoTFBJTUFHRV9SRVNPVVJDRV9ESVJfU1RSSU5HX1UpIChyb290ICsgCisJCQllbnRyeVRhYmxlW2VudHJ5bnVtXS51MS5zLk5hbWVPZmZzZXQpOwogCQlpZihuYW1lbGVuICE9IHN0ci0+TGVuZ3RoKQogCQkJY29udGludWU7CiAJCWlmKGxzdHJuY21waTMyVyhuYW1lLHN0ci0+TmFtZVN0cmluZyxzdHItPkxlbmd0aCk9PTApCi0JCQlyZXR1cm4gKFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpICgKKwkJCXJldHVybiAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpICgKIAkJCQlyb290ICsKLQkJCQkoZW50cnlUYWJsZVtlbnRyeW51bV0uT2Zmc2V0VG9EYXRhICYgMHg3ZmZmZmZmZikpOworCQkJCWVudHJ5VGFibGVbZW50cnludW1dLnUyLnMuT2Zmc2V0VG9EaXJlY3RvcnkpOwogCX0KIAlyZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotCWVudHJ5VGFibGUgPSAoUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkgKAorCWVudHJ5VGFibGUgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkpICgKIAkJCShCWVRFICopIHJlc2RpcnB0ciArIAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkgKwogCQkJcmVzZGlycHRyLT5OdW1iZXJPZk5hbWVkRW50cmllcyAqIHNpemVvZihJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkpKTsKIAlmb3IgKGVudHJ5bnVtID0gMDsgZW50cnludW0gPCByZXNkaXJwdHItPk51bWJlck9mSWRFbnRyaWVzOyBlbnRyeW51bSsrKQotCSAgICBpZiAoKERXT1JEKWVudHJ5VGFibGVbZW50cnludW1dLk5hbWUgPT0gKERXT1JEKW5hbWUpCi0JCXJldHVybiAoUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkgKAorCSAgICBpZiAoKERXT1JEKWVudHJ5VGFibGVbZW50cnludW1dLnUxLk5hbWUgPT0gKERXT1JEKW5hbWUpCisJCXJldHVybiAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpICgKIAkJCXJvb3QgKwotCQkJKGVudHJ5VGFibGVbZW50cnludW1dLk9mZnNldFRvRGF0YSAmIDB4N2ZmZmZmZmYpKTsKKwkJCWVudHJ5VGFibGVbZW50cnludW1dLnUyLnMuT2Zmc2V0VG9EaXJlY3RvcnkpOwogCS8qIGp1c3QgdXNlIGZpcnN0IGVudHJ5IGlmIG5vIGRlZmF1bHQgY2FuIGJlIGZvdW5kICovCiAJaWYgKCFuYW1lICYmIHJlc2RpcnB0ci0+TnVtYmVyT2ZJZEVudHJpZXMpCi0JCXJldHVybiAoUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkgKAorCQlyZXR1cm4gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKSAoCiAJCQlyb290ICsKLQkJCShlbnRyeVRhYmxlWzBdLk9mZnNldFRvRGF0YSAmIDB4N2ZmZmZmZmYpKTsKKwkJCWVudHJ5VGFibGVbMF0udTIucy5PZmZzZXRUb0RpcmVjdG9yeSk7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQogfQpAQCAtOTQsMTIgKzkyLDEyIEBACiAgKglIZWxwZXIgZnVuY3Rpb24gLSBnb2VzIGRvd24gb25lIGxldmVsIG9mIFBFIHJlc291cmNlIHRyZWUKICAqCiAgKi8KLVBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgR2V0UmVzRGlyRW50cnlBKFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgcmVzZGlycHRyLAotCQkJCQkgTFBDU1RSIG5hbWUsCi0JCQkJCSBEV09SRCByb290KQorTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgR2V0UmVzRGlyRW50cnlBKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIHJlc2RpcnB0ciwKKwkJCQkJICAgTFBDU1RSIG5hbWUsCisJCQkJCSAgIERXT1JEIHJvb3QpCiB7CiAJTFBXU1RSCQkJCXhuYW1lOwotCVBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkJcmV0OworCUxQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCXJldDsKIAogCWlmIChISVdPUkQoKERXT1JEKW5hbWUpKQogCQl4bmFtZQk9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOwpAQCAtMTE1LDEzICsxMTMsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgUEVfRmluZFJlc291cmNlRXgzMlcKICAqLwotSEFORExFMzIgUEVfRmluZFJlc291cmNlRXgzMlcoIAotCUhJTlNUQU5DRTMyIGhNb2R1bGUsIExQQ1dTVFIgbmFtZSwgTFBDV1NUUiB0eXBlLCBXT1JEIGxhbmcKLSkKLXsKK0hBTkRMRTMyIFBFX0ZpbmRSZXNvdXJjZUV4MzJXKAorCUhJTlNUQU5DRTMyIGhNb2R1bGUsTFBDV1NUUiBuYW1lLExQQ1dTVFIgdHlwZSxXT1JEIGxhbmcKKykgewogICAgIFBFX01PRFVMRSAqcGU7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgcmVzZGlycHRyOworICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIHJlc2RpcnB0cjsKICAgICBEV09SRCByb290OwogICAgIEhBTkRMRTMyIHJlc3VsdDsKIApAQCAtMTM1LDcgKzEzMiw3IEBACiAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpKSByZXR1cm4gMDsgIC8qIEZJWE1FPyAqLwogICAgIGlmICghKHBlID0gcE1vZHVsZS0+cGVfbW9kdWxlKSB8fCAhcGUtPnBlX3Jlc291cmNlKSByZXR1cm4gMDsKIAotICAgIHJlc2RpcnB0ciA9IChQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKSBwZS0+cGVfcmVzb3VyY2U7CisgICAgcmVzZGlycHRyID0gcGUtPnBlX3Jlc291cmNlOwogICAgIHJvb3QgPSAoRFdPUkQpIHJlc2RpcnB0cjsKICAgICBpZiAoKHJlc2RpcnB0ciA9IEdldFJlc0RpckVudHJ5VyhyZXNkaXJwdHIsIHR5cGUsIHJvb3QpKSA9PSBOVUxMKQogCXJldHVybiAwOwpAQCAtMTY2LDYgKzE2Myw2IEBACiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwogICAgIGlmICghKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKSkgcmV0dXJuIDA7ICAvKiBGSVhNRT8gKi8KICAgICBpZiAoIShwZSA9IHBNb2R1bGUtPnBlX21vZHVsZSkgfHwgIXBlLT5wZV9yZXNvdXJjZSkgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIChIQU5ETEUzMikgKHBlLT5sb2FkX2FkZHIrKChQSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSloUnNyYyktPk9mZnNldFRvRGF0YSk7CisgICAgcmV0dXJuIChIQU5ETEUzMikgKHBlLT5sb2FkX2FkZHIrKChMUElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkpaFJzcmMpLT5PZmZzZXRUb0RhdGEpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IDNhZTY4MjEuLmRlMjg5YjYgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC03MzEsMyArNzMxLDE2IEBACiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJU2V0UmVzb3VyY2VIYW5kbGVyCShLRVJORUwuNDMpCisgKi8KK0ZBUlBST0MxNgorU2V0UmVzb3VyY2VIYW5kbGVyKEhJTlNUQU5DRTE2IGluc3RhbmNlLExQU1RSIHMsRkFSUFJPQzE2IGZhcnByb2MpCit7CisgICAgaWYgKEhJV09SRChzKSkKKwlmcHJpbnRmKHN0ZGVyciwiU2V0UmVzb3VyY2VIYW5kbGVyKCUwNHgsJXMsJXApLCBlbXB0eSBTVFVCIVxuIixpbnN0YW5jZSxzLGZhcnByb2MpOworICAgIGVsc2UKKwlmcHJpbnRmKHN0ZGVyciwiU2V0UmVzb3VyY2VIYW5kbGVyKCUwNHgsMHglMDR4LCVwKSwgZW1wdHkgU1RVQiFcbiIsaW5zdGFuY2UsTE9XT1JEKHMpLGZhcnByb2MpOworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IGEyZWE5NzkuLjJkOTdlZDUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTEyLDggKzEyLDggQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCi0jaWZuZGVmIF9TQ09fRFMKKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykgfHwgZGVmaW5lZChfX0VNWF9fKQorI2lmICFkZWZpbmVkKF9TQ09fRFMpICYmICFkZWZpbmVkKF9fRU1YX18pCiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNlbmRpZgogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgpAQCAtMTQzLDYgKzE0Myw3IEBACiBzdGF0aWMgdm9pZCBTSUdOQUxfZmF1bHQoaW50IHNpZ25hbCwgaW50IGNvZGUsIFNJR0NPTlRFWFQgKmNvbnRleHQpCiB7CiAjZW5kaWYKKyNpZm5kZWYgX19FTVhfXyAvKiBGSVhNRTogWFhfc2lnKGNvbnN0ZXh0KT1wb2ludGVyIHRvIGluY29tcGxldGUgdHlwZSAoRU1YKSAqLwogICAgIGlmIChDU19zaWcoY29udGV4dCkgPT0gV0lORV9DT0RFX1NFTEVDVE9SKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiU2VnbWVudGF0aW9uIGZhdWx0IGluIFdpbmUgcHJvZ3JhbSAoJXg6JWx4KS4iCkBAIC0xNTYsNiArMTU3LDcgQEAKICAgICAgICAgICAgICAgICAgQ1Nfc2lnKGNvbnRleHQpLCBFSVBfc2lnKGNvbnRleHQpICk7CiAgICAgfQogICAgIHdpbmVfZGVidWcoIHNpZ25hbCwgY29udGV4dCApOworI2VuZGlmCiB9CiAKIApAQCAtMjU3LDcgKzI1OSw5IEBACiAjaWZkZWYgQ09ORklHX0lQQwogICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdVU1IyLCAodm9pZCAoKikoKSlzdG9wX3dhaXQsIDEpOyAJLyogRm9yIElQQyAqLwogI2VuZGlmCisjaWZuZGVmIF9fRU1YX18gLyogRklYTUUgKi8KICAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHSU8sICAgKHZvaWQgKCopKCkpV0lOU09DS19zaWdpbywgMCk7IAorI2VuZGlmCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTI2OSw2ICsyNzMsNyBAQAogICovCiB2b2lkIFNJR05BTF9TdGFydEJJT1NUaW1lcih2b2lkKQogeworI2lmbmRlZiBfX0VNWF9fIC8qIEZJWE1FOiBUaW1lIGRvbid0IHdvcmsuLi4gVXNlIEJJT1MgZGlyZWN0bHkgaW5zdGVhZCAqLwogICAgIHN0cnVjdCBpdGltZXJ2YWwgdnRfdGltZXI7CiAgICAgc3RhdGljIGludCB0aW1lcl9zdGFydGVkID0gMDsKIApAQCAtMjc5LDYgKzI4NCw3IEBACiAgICAgdnRfdGltZXIuaXRfdmFsdWUgPSB2dF90aW1lci5pdF9pbnRlcnZhbDsKIAogICAgIHNldGl0aW1lcihJVElNRVJfUkVBTCwgJnZ0X3RpbWVyLCBOVUxMKTsKKyNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjg4LDcgKzI5NCw5IEBACiB7CiAgIHNpZ3NldF90IAlzZXQ7CiAgIHNpZ2VtcHR5c2V0KCZzZXQpOworI2lmbmRlZiBfX0VNWF9fIC8qIEZJWE1FICovCiAgIHNpZ2FkZHNldCgmc2V0LCBTSUdJTyk7CisjZW5kaWYKICAgc2lnYWRkc2V0KCZzZXQsIFNJR1VTUjEpOwogI2lmZGVmIENPTkZJR19JUEMKICAgc2lnYWRkc2V0KCZzZXQsIFNJR1VTUjIpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggMjdjZmNiZS4uMGI3MjFlNiAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC0zNjgsNyArMzY4LDcgQEAKICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdncgJXcwLCUlZnMiOjoiciIgKHBDdXJyZW50VGhyZWFkLT50ZWJfc2VsKSk7CiAgICAgICAgIFBFX0luaXRpYWxpemVETExzKCBwVGFzay0+aE1vZHVsZSApOwogICAgICAgICBleGl0X2NvZGUgPSBDYWxsVGFza1N0YXJ0MzIoKEZBUlBST0MzMikocE1vZHVsZS0+cGVfbW9kdWxlLT5sb2FkX2FkZHIgKyAKLSAgICAgICAgICAgICAgICBwTW9kdWxlLT5wZV9tb2R1bGUtPnBlX2hlYWRlci0+b3B0X2NvZmYuQWRkcmVzc09mRW50cnlQb2ludCkgKTsKKyAgICAgICAgICAgICAgICBwTW9kdWxlLT5wZV9tb2R1bGUtPnBlX2hlYWRlci0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCkgKTsKICAgICAgICAgVEFTS19LaWxsQ3VycmVudFRhc2soIGV4aXRfY29kZSApOwogICAgIH0KICAgICBlbHNlCkBAIC01OTMsNyArNTkzLDcgQEAKICAgICAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQogICAgICAgICB7CiAgICAgICAgICAgICBEQkdfQUREUiBhZGRyID0geyBOVUxMLCAwLCBwTW9kdWxlLT5wZV9tb2R1bGUtPmxvYWRfYWRkciArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+cGVfbW9kdWxlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkFkZHJlc3NPZkVudHJ5UG9pbnQgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2R1bGUtPnBlX21vZHVsZS0+cGVfaGVhZGVyLT5PcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50IH07CiAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXaW4zMiB0YXNrICclcyc6ICIsIG5hbWUgKTsKICAgICAgICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21pc2MvTWFrZWZpbGUuaW4gYi9taXNjL01ha2VmaWxlLmluCmluZGV4IDcwMmJiMDAuLjNiNGRmYWEgMTAwNjQ0Ci0tLSBhL21pc2MvTWFrZWZpbGUuaW4KKysrIGIvbWlzYy9NYWtlZmlsZS5pbgpAQCAtMTUsNyArMTUsNyBAQAogCWRyaXZlci5jIFwKIAlleGVjLmMgXAogCWVzY2FwZS5jIFwKLQlrZXlib2FyZC5jIFwKKwlmb250ZW5naW5lLmMgXAogCWxzdHIuYyBcCiAJbHpleHBhbmQuYyBcCiAJbWFpbi5jIFwKZGlmZiAtLWdpdCBhL21pc2MvY2xpcGJvYXJkLmMgYi9taXNjL2NsaXBib2FyZC5jCmluZGV4IGFhN2JhNGQuLmY3ZDM4YWUgMTAwNjQ0Ci0tLSBhL21pc2MvY2xpcGJvYXJkLmMKKysrIGIvbWlzYy9jbGlwYm9hcmQuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAgKi8KIEJPT0wgQ0xJUEJPQVJEX1JlcXVlc3RYU2VsZWN0aW9uKCkKIHsKLSAgSFdORCBoV25kID0gKGhXbmRDbGlwV2luZG93KSA/IGhXbmRDbGlwV2luZG93IDogR2V0QWN0aXZlV2luZG93KCk7CisgIEhXTkQgaFduZCA9IChoV25kQ2xpcFdpbmRvdykgPyBoV25kQ2xpcFdpbmRvdyA6IEdldEFjdGl2ZVdpbmRvdzE2KCk7CiAKICAgaWYoICFoV25kICkgcmV0dXJuIEZBTFNFOwogCmRpZmYgLS1naXQgYS9taXNjL2NvbW1kbGcuYyBiL21pc2MvY29tbWRsZy5jCmluZGV4IGU3MjlkNDEuLmVjZTNmMDMgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbWRsZy5jCisrKyBiL21pc2MvY29tbWRsZy5jCkBAIC00MjcsOSArNDI3LDkgQEAKICAgbiA9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpOwogICBTZW5kRGxnSXRlbU1lc3NhZ2UxNihoV25kLCBjbWIyLCBDQl9TRVRDVVJTRUwxNiwgbiwgMCk7CiAgIGlmICghKGxwb2ZuLT5GbGFncyAmIE9GTl9TSE9XSEVMUCkpCi0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhXbmQsIHBzaEhlbHApLCBTV19ISURFKTsKKyAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHBzaEhlbHApLCBTV19ISURFKTsKICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9ISURFUkVBRE9OTFkpCi0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhXbmQsIGNoeDEpLCBTV19ISURFKTsgCisgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBjaHgxKSwgU1dfSElERSk7IAogICBpZiAoRklMRURMR19Ib29rQ2FsbENoayhscG9mbikpCiAgICAgIHJldHVybiAoQk9PTClDYWxsV2luZG93UHJvYzE2KGxwb2ZuLT5scGZuSG9vaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsICBXTV9JTklURElBTE9HLCB3UGFyYW0sIGxQYXJhbSApOwpAQCAtNTc5LDcgKzU3OSw3IEBACiAJfQogICAgICAgZWxzZSBTZXREbGdJdGVtVGV4dDMyQSggaFduZCwgZWR0MSwgdG1wc3RyICk7CiAjaWYgMAotICAgICAgU2hvd1dpbmRvdyhoV25kLCBTV19ISURFKTsgICAvKiB0aGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5ID8hICglJSUpICovCisgICAgICBTaG93V2luZG93MTYoaFduZCwgU1dfSElERSk7ICAgLyogdGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSA/ISAoJSUlKSAqLwogI2VuZGlmCiAgICAgICB7CiAJaW50IGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7CkBAIC02MTQsNyArNjE0LDcgQEAKICAgICAgICB7CiAgICAgICAgICAqbHBvZm49b2ZuMjsgLyogcmVzdG9yZSBvbGQgc3RhdGUgKi8KICNpZiAwCi0gICAgICAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1cpOyAgICAgICAgICAgICAgIC8qIG9ubHkgaWYgYWJvdmUgKCUlJSkgU1dfSElERSB1c2VkICovCisgICAgICAgICBTaG93V2luZG93MTYoaFduZCwgU1dfU0hPVyk7ICAgICAgICAgICAgICAgLyogb25seSBpZiBhYm92ZSAoJSUlKSBTV19ISURFIHVzZWQgKi8KICNlbmRpZiAgICAgICAgIAogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQpAQCAtNzg1LDMxICs3ODUsMzEgQEAKICAgICAgKiBlbmFibGVkLgogICAgICAqLwogICAgIFNldERsZ0l0ZW1UZXh0MTYoaFduZCwgZWR0MSwgbHBmci0+bHBzdHJGaW5kV2hhdCk7Ci0gICAgQ2hlY2tSYWRpb0J1dHRvbihoV25kLCByYWQxLCByYWQyLCAobHBmci0+RmxhZ3MgJiBGUl9ET1dOKSA/IHJhZDIgOiByYWQxKTsKKyAgICBDaGVja1JhZGlvQnV0dG9uMzIoaFduZCwgcmFkMSwgcmFkMiwgKGxwZnItPkZsYWdzICYgRlJfRE9XTikgPyByYWQyIDogcmFkMSk7CiAgICAgaWYgKGxwZnItPkZsYWdzICYgKEZSX0hJREVVUERPV04gfCBGUl9OT1VQRE9XTikpIHsKLQlFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCByYWQxKSwgRkFMU0UpOwotCUVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIHJhZDIpLCBGQUxTRSk7CisJRW5hYmxlV2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHJhZDEpLCBGQUxTRSk7CisJRW5hYmxlV2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHJhZDIpLCBGQUxTRSk7CiAgICAgfQogICAgIGlmIChscGZyLT5GbGFncyAmIEZSX0hJREVVUERPV04pIHsKLQlTaG93V2luZG93KEdldERsZ0l0ZW0oaFduZCwgcmFkMSksIFNXX0hJREUpOwotCVNob3dXaW5kb3coR2V0RGxnSXRlbShoV25kLCByYWQyKSwgU1dfSElERSk7Ci0JU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhXbmQsIGdycDEpLCBTV19ISURFKTsKKwlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHJhZDEpLCBTV19ISURFKTsKKwlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHJhZDIpLCBTV19ISURFKTsKKwlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGdycDEpLCBTV19ISURFKTsKICAgICB9Ci0gICAgQ2hlY2tEbGdCdXR0b24oaFduZCwgY2h4MSwgKGxwZnItPkZsYWdzICYgRlJfV0hPTEVXT1JEKSA/IDEgOiAwKTsKKyAgICBDaGVja0RsZ0J1dHRvbjMyKGhXbmQsIGNoeDEsIChscGZyLT5GbGFncyAmIEZSX1dIT0xFV09SRCkgPyAxIDogMCk7CiAgICAgaWYgKGxwZnItPkZsYWdzICYgKEZSX0hJREVXSE9MRVdPUkQgfCBGUl9OT1dIT0xFV09SRCkpCi0JRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaFduZCwgY2h4MSksIEZBTFNFKTsKKwlFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgY2h4MSksIEZBTFNFKTsKICAgICBpZiAobHBmci0+RmxhZ3MgJiBGUl9ISURFV0hPTEVXT1JEKQotCVNob3dXaW5kb3coR2V0RGxnSXRlbShoV25kLCBjaHgxKSwgU1dfSElERSk7Ci0gICAgQ2hlY2tEbGdCdXR0b24oaFduZCwgY2h4MiwgKGxwZnItPkZsYWdzICYgRlJfTUFUQ0hDQVNFKSA/IDEgOiAwKTsKKwlTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGNoeDEpLCBTV19ISURFKTsKKyAgICBDaGVja0RsZ0J1dHRvbjMyKGhXbmQsIGNoeDIsIChscGZyLT5GbGFncyAmIEZSX01BVENIQ0FTRSkgPyAxIDogMCk7CiAgICAgaWYgKGxwZnItPkZsYWdzICYgKEZSX0hJREVNQVRDSENBU0UgfCBGUl9OT01BVENIQ0FTRSkpCi0JRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaFduZCwgY2h4MiksIEZBTFNFKTsKKwlFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgY2h4MiksIEZBTFNFKTsKICAgICBpZiAobHBmci0+RmxhZ3MgJiBGUl9ISURFTUFUQ0hDQVNFKQotCVNob3dXaW5kb3coR2V0RGxnSXRlbShoV25kLCBjaHgyKSwgU1dfSElERSk7CisJU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBjaHgyKSwgU1dfSElERSk7CiAgICAgaWYgKCEobHBmci0+RmxhZ3MgJiBGUl9TSE9XSEVMUCkpIHsKLQlFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBwc2hIZWxwKSwgRkFMU0UpOwotCVNob3dXaW5kb3coR2V0RGxnSXRlbShoV25kLCBwc2hIZWxwKSwgU1dfSElERSk7CisJRW5hYmxlV2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHBzaEhlbHApLCBGQUxTRSk7CisJU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBwc2hIZWxwKSwgU1dfSElERSk7CiAgICAgfQotICAgIFNob3dXaW5kb3coaFduZCwgU1dfU0hPV05PUk1BTCk7CisgICAgU2hvd1dpbmRvdzMyKGhXbmQsIFNXX1NIT1dOT1JNQUwpOwogICAgIHJldHVybiBUUlVFOwogfSAgICAKIApAQCAtODI3LDEzICs4MjcsMTMgQEAKICAgICBzd2l0Y2ggKHdQYXJhbSkgewogCWNhc2UgSURPSzoKIAkgICAgR2V0RGxnSXRlbVRleHQxNihoV25kLCBlZHQxLCBscGZyLT5scHN0ckZpbmRXaGF0LCBscGZyLT53RmluZFdoYXRMZW4pOwotCSAgICBpZiAoSXNEbGdCdXR0b25DaGVja2VkKGhXbmQsIHJhZDIpKQorCSAgICBpZiAoSXNEbGdCdXR0b25DaGVja2VkMzIoaFduZCwgcmFkMikpCiAJCWxwZnItPkZsYWdzIHw9IEZSX0RPV047CiAJCWVsc2UgbHBmci0+RmxhZ3MgJj0gfkZSX0RPV047Ci0JICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgY2h4MSkpCisJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgxKSkKIAkJbHBmci0+RmxhZ3MgfD0gRlJfV0hPTEVXT1JEOyAKIAkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfV0hPTEVXT1JEOwotCSAgICBpZiAoSXNEbGdCdXR0b25DaGVja2VkKGhXbmQsIGNoeDIpKQorCSAgICBpZiAoSXNEbGdCdXR0b25DaGVja2VkMzIoaFduZCwgY2h4MikpCiAJCWxwZnItPkZsYWdzIHw9IEZSX01BVENIQ0FTRTsgCiAJCWVsc2UgbHBmci0+RmxhZ3MgJj0gfkZSX01BVENIQ0FTRTsKICAgICAgICAgICAgIGxwZnItPkZsYWdzICY9IH4oRlJfUkVQTEFDRSB8IEZSX1JFUExBQ0VBTEwgfCBGUl9ESUFMT0dURVJNKTsKQEAgLTg0Niw3ICs4NDYsNyBAQAogCSAgICBscGZyLT5GbGFncyB8PSBGUl9ESUFMT0dURVJNOwogCSAgICBTZW5kTWVzc2FnZTE2KGxwZnItPmh3bmRPd25lciwgdUZpbmRSZXBsYWNlTWVzc2FnZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V2luZG93TG9uZzMyQShoV25kLCBEV0xfVVNFUikgKTsKLQkgICAgRGVzdHJveVdpbmRvdyhoV25kKTsKKwkgICAgRGVzdHJveVdpbmRvdzE2KGhXbmQpOwogCSAgICByZXR1cm4gVFJVRTsKIAljYXNlIHBzaEhlbHA6CiAJICAgIC8qIEZJWE1FIDogc2hvdWxkIGxwZnIgc3RydWN0dXJlIGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCA/Pz8gKi8KQEAgLTg4OSwyMSArODg5LDIxIEBACiAgICAgICovCiAgICAgU2V0RGxnSXRlbVRleHQxNihoV25kLCBlZHQxLCBscGZyLT5scHN0ckZpbmRXaGF0KTsKICAgICBTZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDIsIGxwZnItPmxwc3RyUmVwbGFjZVdpdGgpOwotICAgIENoZWNrRGxnQnV0dG9uKGhXbmQsIGNoeDEsIChscGZyLT5GbGFncyAmIEZSX1dIT0xFV09SRCkgPyAxIDogMCk7CisgICAgQ2hlY2tEbGdCdXR0b24zMihoV25kLCBjaHgxLCAobHBmci0+RmxhZ3MgJiBGUl9XSE9MRVdPUkQpID8gMSA6IDApOwogICAgIGlmIChscGZyLT5GbGFncyAmIChGUl9ISURFV0hPTEVXT1JEIHwgRlJfTk9XSE9MRVdPUkQpKQotCUVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIGNoeDEpLCBGQUxTRSk7CisJRW5hYmxlV2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGNoeDEpLCBGQUxTRSk7CiAgICAgaWYgKGxwZnItPkZsYWdzICYgRlJfSElERVdIT0xFV09SRCkKLQlTaG93V2luZG93KEdldERsZ0l0ZW0oaFduZCwgY2h4MSksIFNXX0hJREUpOwotICAgIENoZWNrRGxnQnV0dG9uKGhXbmQsIGNoeDIsIChscGZyLT5GbGFncyAmIEZSX01BVENIQ0FTRSkgPyAxIDogMCk7CisJU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBjaHgxKSwgU1dfSElERSk7CisgICAgQ2hlY2tEbGdCdXR0b24zMihoV25kLCBjaHgyLCAobHBmci0+RmxhZ3MgJiBGUl9NQVRDSENBU0UpID8gMSA6IDApOwogICAgIGlmIChscGZyLT5GbGFncyAmIChGUl9ISURFTUFUQ0hDQVNFIHwgRlJfTk9NQVRDSENBU0UpKQotCUVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIGNoeDIpLCBGQUxTRSk7CisJRW5hYmxlV2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIGNoeDIpLCBGQUxTRSk7CiAgICAgaWYgKGxwZnItPkZsYWdzICYgRlJfSElERU1BVENIQ0FTRSkKLQlTaG93V2luZG93KEdldERsZ0l0ZW0oaFduZCwgY2h4MiksIFNXX0hJREUpOworCVNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgY2h4MiksIFNXX0hJREUpOwogICAgIGlmICghKGxwZnItPkZsYWdzICYgRlJfU0hPV0hFTFApKSB7Ci0JRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaFduZCwgcHNoSGVscCksIEZBTFNFKTsKLQlTaG93V2luZG93KEdldERsZ0l0ZW0oaFduZCwgcHNoSGVscCksIFNXX0hJREUpOworCUVuYWJsZVdpbmRvdzMyKEdldERsZ0l0ZW0zMihoV25kLCBwc2hIZWxwKSwgRkFMU0UpOworCVNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaFduZCwgcHNoSGVscCksIFNXX0hJREUpOwogICAgIH0KLSAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOworICAgIFNob3dXaW5kb3czMihoV25kLCBTV19TSE9XTk9STUFMKTsKICAgICByZXR1cm4gVFJVRTsKIH0gICAgCiAKQEAgLTkyMiwxMCArOTIyLDEwIEBACiAJY2FzZSBJRE9LOgogCSAgICBHZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDEsIGxwZnItPmxwc3RyRmluZFdoYXQsIGxwZnItPndGaW5kV2hhdExlbik7CiAJICAgIEdldERsZ0l0ZW1UZXh0MTYoaFduZCwgZWR0MiwgbHBmci0+bHBzdHJSZXBsYWNlV2l0aCwgbHBmci0+d1JlcGxhY2VXaXRoTGVuKTsKLQkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZChoV25kLCBjaHgxKSkKKwkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZDMyKGhXbmQsIGNoeDEpKQogCQlscGZyLT5GbGFncyB8PSBGUl9XSE9MRVdPUkQ7IAogCQllbHNlIGxwZnItPkZsYWdzICY9IH5GUl9XSE9MRVdPUkQ7Ci0JICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgY2h4MikpCisJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgyKSkKIAkJbHBmci0+RmxhZ3MgfD0gRlJfTUFUQ0hDQVNFOyAKIAkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfTUFUQ0hDQVNFOwogICAgICAgICAgICAgbHBmci0+RmxhZ3MgJj0gfihGUl9SRVBMQUNFIHwgRlJfUkVQTEFDRUFMTCB8IEZSX0RJQUxPR1RFUk0pOwpAQCAtOTM4LDE1ICs5MzgsMTUgQEAKIAkgICAgbHBmci0+RmxhZ3MgfD0gRlJfRElBTE9HVEVSTTsKIAkgICAgU2VuZE1lc3NhZ2UxNihscGZyLT5od25kT3duZXIsIHVGaW5kUmVwbGFjZU1lc3NhZ2UsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFdpbmRvd0xvbmczMkEoaFduZCwgRFdMX1VTRVIpICk7Ci0JICAgIERlc3Ryb3lXaW5kb3coaFduZCk7CisJICAgIERlc3Ryb3lXaW5kb3cxNihoV25kKTsKIAkgICAgcmV0dXJuIFRSVUU7CiAJY2FzZSBwc2gxOgogCSAgICBHZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDEsIGxwZnItPmxwc3RyRmluZFdoYXQsIGxwZnItPndGaW5kV2hhdExlbik7CiAJICAgIEdldERsZ0l0ZW1UZXh0MTYoaFduZCwgZWR0MiwgbHBmci0+bHBzdHJSZXBsYWNlV2l0aCwgbHBmci0+d1JlcGxhY2VXaXRoTGVuKTsKLQkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZChoV25kLCBjaHgxKSkKKwkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZDMyKGhXbmQsIGNoeDEpKQogCQlscGZyLT5GbGFncyB8PSBGUl9XSE9MRVdPUkQ7IAogCQllbHNlIGxwZnItPkZsYWdzICY9IH5GUl9XSE9MRVdPUkQ7Ci0JICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgY2h4MikpCisJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgyKSkKIAkJbHBmci0+RmxhZ3MgfD0gRlJfTUFUQ0hDQVNFOyAKIAkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfTUFUQ0hDQVNFOwogICAgICAgICAgICAgbHBmci0+RmxhZ3MgJj0gfihGUl9GSU5ETkVYVCB8IEZSX1JFUExBQ0VBTEwgfCBGUl9ESUFMT0dURVJNKTsKQEAgLTk1NywxMCArOTU3LDEwIEBACiAJY2FzZSBwc2gyOgogCSAgICBHZXREbGdJdGVtVGV4dDE2KGhXbmQsIGVkdDEsIGxwZnItPmxwc3RyRmluZFdoYXQsIGxwZnItPndGaW5kV2hhdExlbik7CiAJICAgIEdldERsZ0l0ZW1UZXh0MTYoaFduZCwgZWR0MiwgbHBmci0+bHBzdHJSZXBsYWNlV2l0aCwgbHBmci0+d1JlcGxhY2VXaXRoTGVuKTsKLQkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZChoV25kLCBjaHgxKSkKKwkgICAgaWYgKElzRGxnQnV0dG9uQ2hlY2tlZDMyKGhXbmQsIGNoeDEpKQogCQlscGZyLT5GbGFncyB8PSBGUl9XSE9MRVdPUkQ7IAogCQllbHNlIGxwZnItPkZsYWdzICY9IH5GUl9XSE9MRVdPUkQ7Ci0JICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgY2h4MikpCisJICAgIGlmIChJc0RsZ0J1dHRvbkNoZWNrZWQzMihoV25kLCBjaHgyKSkKIAkJbHBmci0+RmxhZ3MgfD0gRlJfTUFUQ0hDQVNFOyAKIAkJZWxzZSBscGZyLT5GbGFncyAmPSB+RlJfTUFUQ0hDQVNFOwogICAgICAgICAgICAgbHBmci0+RmxhZ3MgJj0gfihGUl9GSU5ETkVYVCB8IEZSX1JFUExBQ0UgfCBGUl9ESUFMT0dURVJNKTsKQEAgLTEwMzUsNyArMTAzNSw3IEBACiAgICAgewogICAgIGNhc2UgV01fSU5JVERJQUxPRzoKICAgICAgIGRwcmludGZfY29tbWRsZyhzdGRkZWIsIlByaW50RGxnUHJvYyAvLyBXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKLSAgICAgIFNob3dXaW5kb3coaFduZCwgU1dfU0hPV05PUk1BTCk7CisgICAgICBTaG93V2luZG93MTYoaFduZCwgU1dfU0hPV05PUk1BTCk7CiAgICAgICByZXR1cm4gKFRSVUUpOwogICAgIGNhc2UgV01fQ09NTUFORDoKICAgICAgIHN3aXRjaCAod1BhcmFtKQpAQCAtMTA2Miw3ICsxMDYyLDcgQEAKICAgICB7CiAgICAgY2FzZSBXTV9JTklURElBTE9HOgogICAgICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiUHJpbnRTZXR1cERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7Ci0gICAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOworICAgICAgU2hvd1dpbmRvdzE2KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwogICAgICAgcmV0dXJuIChUUlVFKTsKICAgICBjYXNlIFdNX0NPTU1BTkQ6CiAgICAgICBzd2l0Y2ggKHdQYXJhbSkgewpAQCAtMTMzOSw3ICsxMzM5LDcgQEAKICBpbnQgZHgsZHkseCx5OwogCiAgQ2xpZW50VG9TY3JlZW4xNihoRGxnLCZwb2ludCk7Ci0gaHduZD1HZXREbGdJdGVtKGhEbGcsZGxnaXRlbSk7CisgaHduZD1HZXREbGdJdGVtMzIoaERsZyxkbGdpdGVtKTsKICBHZXRXaW5kb3dSZWN0MTYoaHduZCwmcmVjdCk7CiAgaWYgKFB0SW5SZWN0MTYoJnJlY3QscG9pbnQpKQogIHsKQEAgLTEzNzEsNyArMTM3MSw3IEBACiAgaW50IGR4LGR5LHgseTsKIAogIENsaWVudFRvU2NyZWVuMTYoaERsZywmcG9pbnQpOwotIGh3bmQ9R2V0RGxnSXRlbShoRGxnLGRsZ2l0ZW0pOworIGh3bmQ9R2V0RGxnSXRlbTMyKGhEbGcsZGxnaXRlbSk7CiAgR2V0V2luZG93UmVjdDE2KGh3bmQsJnJlY3QpOwogIGlmIChQdEluUmVjdDE2KCZyZWN0LHBvaW50KSkKICB7CkBAIC0xNDA2LDEzICsxNDA2LDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgQ0NfTW91c2VDaGVja0NvbG9yR3JhcGgoSFdORCBoRGxnLGludCBkbGdpdGVtLGludCAqaG9yaSxpbnQgKnZlcnQsTFBBUkFNIGxQYXJhbSkKIHsKLSBIV05EIGh3bmQ7CisgSFdORDMyIGh3bmQ7CiAgUE9JTlQxNiBwb2ludCA9IE1BS0VQT0lOVDE2KGxQYXJhbSk7CiAgUkVDVDE2IHJlY3Q7CiAgbG9uZyB4LHk7CiAKICBDbGllbnRUb1NjcmVlbjE2KGhEbGcsJnBvaW50KTsKLSBod25kPUdldERsZ0l0ZW0oaERsZyxkbGdpdGVtKTsKKyBod25kPUdldERsZ0l0ZW0zMihoRGxnLGRsZ2l0ZW0pOwogIEdldFdpbmRvd1JlY3QxNihod25kLCZyZWN0KTsKICBpZiAoUHRJblJlY3QxNigmcmVjdCxwb2ludCkpCiAgewpAQCAtMTQ0Myw3ICsxNDQzLDcgQEAKICBSRUNUMTYgcmVjdDsKIAogIENsaWVudFRvU2NyZWVuMTYoaERsZywmcG9pbnQpOwotIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmM1KTsKKyBod25kPUdldERsZ0l0ZW0zMihoRGxnLDB4MmM1KTsKICBHZXRXaW5kb3dSZWN0MTYoaHduZCwmcmVjdCk7CiAgaWYgKFB0SW5SZWN0MTYoJnJlY3QscG9pbnQpKQogIHsKQEAgLTE1MDIsOCArMTUwMiw4IEBACiAgUkVDVDE2IHJlY3Q7CiAgSERDMzIgIGhkYzsKICBIQlJVU0gzMiBoQnJ1c2g7Ci0gSFdORCBod25kPUdldERsZ0l0ZW0oaERsZywweDJjNSk7Ci0gaWYgKElzV2luZG93VmlzaWJsZShHZXREbGdJdGVtKGhEbGcsMHgyYzYpKSkgICAvKiBpZiBmdWxsIHNpemUgKi8KKyBIV05EMzIgaHduZD1HZXREbGdJdGVtMzIoaERsZywweDJjNSk7CisgaWYgKElzV2luZG93VmlzaWJsZTMyKEdldERsZ0l0ZW0zMihoRGxnLDB4MmM2KSkpICAgLyogaWYgZnVsbCBzaXplICovCiAgewogICBoZGM9R2V0REMzMihod25kKTsKICAgR2V0Q2xpZW50UmVjdDE2IChod25kLCAmcmVjdCkgOwpAQCAtMTUzNywxMCArMTUzNywxMCBAQAogIGludCBoZWlnaHQ7CiAgaW50IG9iZW47CiAgUkVDVDE2IHJlY3Q7Ci0gSFdORCBod25kPUdldERsZ0l0ZW0oaERsZywweDJiZSk7CisgSFdORCBod25kPUdldERsZ0l0ZW0zMihoRGxnLDB4MmJlKTsKICBzdHJ1Y3QgQ0NQUklWQVRFICpscHA9KHN0cnVjdCBDQ1BSSVZBVEUgKilHZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSKTsgCiAKLSBpZiAoSXNXaW5kb3dWaXNpYmxlKEdldERsZ0l0ZW0oaERsZywweDJjNikpKSAgIC8qIGlmIGZ1bGwgc2l6ZSAqLworIGlmIChJc1dpbmRvd1Zpc2libGUzMihHZXREbGdJdGVtMzIoaERsZywweDJjNikpKSAgIC8qIGlmIGZ1bGwgc2l6ZSAqLwogIHsKICAgIEdldENsaWVudFJlY3QxNihod25kLCZyZWN0KTsKICAgIGhlaWdodD1yZWN0LmJvdHRvbTsKQEAgLTE1NzcsMTMgKzE1NzcsMTMgQEAKIHsKICBIREMzMiBoREM7CiAgaW50IHc9R2V0RGlhbG9nQmFzZVVuaXRzKCk7Ci0gSFdORCBod25kPUdldERsZ0l0ZW0oaERsZywweDJjNik7CisgSFdORCBod25kPUdldERsZ0l0ZW0zMihoRGxnLDB4MmM2KTsKICBzdHJ1Y3QgQ0NQUklWQVRFICogbHBwPShzdHJ1Y3QgQ0NQUklWQVRFICopR2V0V2luZG93TG9uZzMyQShoRGxnLCBEV0xfVVNFUik7IAogIFJFQ1QxNiByZWN0OwogIFBPSU5UMTYgcG9pbnQ7CiAgSFBFTjMyIGhQZW47CiAKLSBpZiAoSXNXaW5kb3dWaXNpYmxlKEdldERsZ0l0ZW0oaERsZywweDJjNikpKSAgIC8qIGlmIGZ1bGwgc2l6ZSAqLworIGlmIChJc1dpbmRvd1Zpc2libGUzMihHZXREbGdJdGVtMzIoaERsZywweDJjNikpKSAgIC8qIGlmIGZ1bGwgc2l6ZSAqLwogIHsKICAgIEdldENsaWVudFJlY3QxNihod25kLCZyZWN0KTsKICAgIGhEQz1HZXREQzMyKGh3bmQpOwpAQCAtMTYyMiw3ICsxNjIyLDcgQEAKIHN0YXRpYyB2b2lkIENDX1ByZXBhcmVDb2xvckdyYXBoKEhXTkQgaERsZykgICAgCiB7CiAgaW50IHNkaWYsaGRpZix4ZGlmLHlkaWYscixnLGIsaHVlLHNhdDsKLSBIV05EIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmM2KTsKKyBIV05EMzIgaHduZD1HZXREbGdJdGVtMzIoaERsZywweDJjNik7CiAgc3RydWN0IENDUFJJVkFURSAqIGxwcD0oc3RydWN0IENDUFJJVkFURSAqKUdldFdpbmRvd0xvbmczMkEoaERsZywgRFdMX1VTRVIpOyAgCiAgSEJSVVNIMzIgaGJydXNoOwogIEhEQzMyIGhkYyA7CkBAIC0xNjY1LDExICsxNjY1LDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIENDX1BhaW50Q29sb3JHcmFwaChIV05EIGhEbGcpCiB7Ci0gSFdORCBod25kPUdldERsZ0l0ZW0oaERsZywweDJjNik7CisgSFdORDMyIGh3bmQ9R2V0RGxnSXRlbTMyKGhEbGcsMHgyYzYpOwogIHN0cnVjdCBDQ1BSSVZBVEUgKiBscHA9KHN0cnVjdCBDQ1BSSVZBVEUgKilHZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSKTsgCiAgSERDMzIgIGhEQzsKICBSRUNUMTYgcmVjdDsKLSBpZiAoSXNXaW5kb3dWaXNpYmxlKGh3bmQpKSAgIC8qIGlmIGZ1bGwgc2l6ZSAqLworIGlmIChJc1dpbmRvd1Zpc2libGUzMihod25kKSkgICAvKiBpZiBmdWxsIHNpemUgKi8KICB7CiAgIGlmICghbHBwLT5oZGNNZW0pCiAgICBDQ19QcmVwYXJlQ29sb3JHcmFwaChoRGxnKTsgICAvKiBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSAqLwpAQCAtMTY4OCwxMyArMTY4OCwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBDQ19QYWludEx1bUJhcihIV05EIGhEbGcsaW50IGh1ZSxpbnQgc2F0KQogewotIEhXTkQgaHduZD1HZXREbGdJdGVtKGhEbGcsMHgyYmUpOworIEhXTkQzMiBod25kPUdldERsZ0l0ZW0zMihoRGxnLDB4MmJlKTsKICBSRUNUMTYgcmVjdCxjbGllbnQ7CiAgaW50IGx1bSxsZGlmLHlkaWYscixnLGI7CiAgSEJSVVNIMzIgaGJydXNoOwogIEhEQzMyIGhEQzsKIAotIGlmIChJc1dpbmRvd1Zpc2libGUoaHduZCkpCisgaWYgKElzV2luZG93VmlzaWJsZTMyKGh3bmQpKQogIHsKICAgaERDPUdldERDMzIoaHduZCk7CiAgIEdldENsaWVudFJlY3QxNihod25kLCZjbGllbnQpOwpAQCAtMTcyOSwxNSArMTcyOSwxNSBAQAogIGludCByPUdldFJWYWx1ZShjcik7CiAgaW50IGc9R2V0R1ZhbHVlKGNyKTsKICBpbnQgYj1HZXRCVmFsdWUoY3IpOwotIGlmIChJc1dpbmRvd1Zpc2libGUoR2V0RGxnSXRlbShoRGxnLDB4MmM2KSkpICAgLyogaWYgZnVsbCBzaXplICovCisgaWYgKElzV2luZG93VmlzaWJsZTMyKEdldERsZ0l0ZW0zMihoRGxnLDB4MmM2KSkpICAgLyogaWYgZnVsbCBzaXplICovCiAgewogICAgbHBwLT51cGRhdGluZz1UUlVFOwogICAgc3ByaW50ZihidWZmZXIsIiVkIixyKTsKLSAgIFNldFdpbmRvd1RleHQzMkEoR2V0RGxnSXRlbShoRGxnLDB4MmMyKSxidWZmZXIpOworICAgU2V0V2luZG93VGV4dDMyQShHZXREbGdJdGVtMzIoaERsZywweDJjMiksYnVmZmVyKTsKICAgIHNwcmludGYoYnVmZmVyLCIlZCIsZyk7Ci0gICBTZXRXaW5kb3dUZXh0MzJBKEdldERsZ0l0ZW0oaERsZywweDJjMyksYnVmZmVyKTsKKyAgIFNldFdpbmRvd1RleHQzMkEoR2V0RGxnSXRlbTMyKGhEbGcsMHgyYzMpLGJ1ZmZlcik7CiAgICBzcHJpbnRmKGJ1ZmZlciwiJWQiLGIpOwotICAgU2V0V2luZG93VGV4dDMyQShHZXREbGdJdGVtKGhEbGcsMHgyYzQpLGJ1ZmZlcik7CisgICBTZXRXaW5kb3dUZXh0MzJBKEdldERsZ0l0ZW0zMihoRGxnLDB4MmM0KSxidWZmZXIpOwogICAgbHBwLT51cGRhdGluZz1GQUxTRTsKICB9CiB9CkBAIC0xNzUwLDE1ICsxNzUwLDE1IEBACiAgY2hhciBidWZmZXJbMTBdOwogIHN0cnVjdCBDQ1BSSVZBVEUgKiBscHA9KHN0cnVjdCBDQ1BSSVZBVEUgKilHZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSKTsgCiAgbHBwLT51cGRhdGluZz1UUlVFOwotIGlmIChJc1dpbmRvd1Zpc2libGUoR2V0RGxnSXRlbShoRGxnLDB4MmM2KSkpICAgLyogaWYgZnVsbCBzaXplICovCisgaWYgKElzV2luZG93VmlzaWJsZTMyKEdldERsZ0l0ZW0zMihoRGxnLDB4MmM2KSkpICAgLyogaWYgZnVsbCBzaXplICovCiAgewogICAgbHBwLT51cGRhdGluZz1UUlVFOwogICAgc3ByaW50ZihidWZmZXIsIiVkIixoKTsKLSAgIFNldFdpbmRvd1RleHQzMkEoR2V0RGxnSXRlbShoRGxnLDB4MmJmKSxidWZmZXIpOworICAgU2V0V2luZG93VGV4dDMyQShHZXREbGdJdGVtMzIoaERsZywweDJiZiksYnVmZmVyKTsKICAgIHNwcmludGYoYnVmZmVyLCIlZCIscyk7Ci0gICBTZXRXaW5kb3dUZXh0MzJBKEdldERsZ0l0ZW0oaERsZywweDJjMCksYnVmZmVyKTsKKyAgIFNldFdpbmRvd1RleHQzMkEoR2V0RGxnSXRlbTMyKGhEbGcsMHgyYzApLGJ1ZmZlcik7CiAgICBzcHJpbnRmKGJ1ZmZlciwiJWQiLGwpOwotICAgU2V0V2luZG93VGV4dDMyQShHZXREbGdJdGVtKGhEbGcsMHgyYzEpLGJ1ZmZlcik7CisgICBTZXRXaW5kb3dUZXh0MzJBKEdldERsZ0l0ZW0zMihoRGxnLDB4MmMxKSxidWZmZXIpOwogICAgbHBwLT51cGRhdGluZz1GQUxTRTsKICB9CiAgQ0NfUGFpbnRMdW1CYXIoaERsZyxoLHMpOwpAQCAtMTc3MiwyMiArMTc3MiwyMiBAQAogIGludCBpOwogIHN0cnVjdCBDQ1BSSVZBVEUgKiBscHA9KHN0cnVjdCBDQ1BSSVZBVEUgKilHZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSKTsgCiAgCi0gRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaERsZywweDJjZiksRkFMU0UpOworIEVuYWJsZVdpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLDB4MmNmKSxGQUxTRSk7CiAgQ0NfUHJlcGFyZUNvbG9yR3JhcGgoaERsZyk7CiAgZm9yIChpPTB4MmJmO2k8MHgyYzU7aSsrKQotICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaERsZyxpKSxUUlVFKTsKKyAgIEVuYWJsZVdpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLGkpLFRSVUUpOwogIGZvciAoaT0weDJkMztpPDB4MmQ5O2krKykKLSAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhEbGcsaSksVFJVRSk7Ci0gRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaERsZywweDJjOSksVFJVRSk7Ci0gRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaERsZywweDJjOCksVFJVRSk7CisgICBFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZyxpKSxUUlVFKTsKKyBFbmFibGVXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZywweDJjOSksVFJVRSk7CisgRW5hYmxlV2luZG93MzIoR2V0RGxnSXRlbTMyKGhEbGcsMHgyYzgpLFRSVUUpOwogCiAgaWYgKGxwcmVjdCkKLSAgU2V0V2luZG93UG9zKGhEbGcsTlVMTCwwLDAsbHByZWN0LT5yaWdodC1scHJlY3QtPmxlZnQsCisgIFNldFdpbmRvd1BvczMyKGhEbGcsTlVMTCwwLDAsbHByZWN0LT5yaWdodC1scHJlY3QtPmxlZnQsCiAgICBscHJlY3QtPmJvdHRvbS1scHJlY3QtPnRvcCwgU1dQX05PTU9WRXxTV1BfTk9aT1JERVIpOwogCi0gU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsMHgyYzYpLFNXX1NIT1cpOwotIFNob3dXaW5kb3coR2V0RGxnSXRlbShoRGxnLDB4MmJlKSxTV19TSE9XKTsKLSBTaG93V2luZG93KEdldERsZ0l0ZW0oaERsZywweDJjNSksU1dfU0hPVyk7CisgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLDB4MmM2KSxTV19TSE9XKTsKKyBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhEbGcsMHgyYmUpLFNXX1NIT1cpOworIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZywweDJjNSksU1dfU0hPVyk7CiAKICBDQ19FZGl0U2V0UkdCKGhEbGcscmVzdWx0KTsKICBDQ19FZGl0U2V0SFNMKGhEbGcsbHBwLT5oLGxwcC0+cyxscHAtPmwpOwpAQCAtMTc5OCw3ICsxNzk4LDcgQEAKICAqLwogc3RhdGljIHZvaWQgQ0NfUGFpbnRQcmVkZWZDb2xvckFycmF5KEhXTkQgaERsZyxpbnQgcm93cyxpbnQgY29scykKIHsKLSBIV05EIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmQwKTsKKyBIV05EMzIgaHduZD1HZXREbGdJdGVtMzIoaERsZywweDJkMCk7CiAgUkVDVDE2IHJlY3Q7CiAgSERDMzIgIGhkYzsKICBIQlJVU0gzMiBoQnJ1c2g7CkBAIC0xODM3LDcgKzE4MzcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBDQ19QYWludFVzZXJDb2xvckFycmF5KEhXTkQgaERsZyxpbnQgcm93cyxpbnQgY29scyxDT0xPUlJFRiogbHBjcikKIHsKLSBIV05EIGh3bmQ9R2V0RGxnSXRlbShoRGxnLDB4MmQxKTsKKyBIV05EMzIgaHduZD1HZXREbGdJdGVtMzIoaERsZywweDJkMSk7CiAgUkVDVDE2IHJlY3Q7CiAgSERDMzIgIGhkYzsKICBIQlJVU0gzMiBoQnJ1c2g7CkBAIC0xOTEwLDcgKzE5MTAsNyBAQAogICAgU2V0V2luZG93TG9uZzMyQShoRGxnLCBEV0xfVVNFUiwgKExPTkcpbHBwKTsgCiAKICAgIGlmICghKGxwcC0+bHBjYy0+RmxhZ3MgJiBDQ19TSE9XSEVMUCkpCi0gICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaERsZywweDQwZSksU1dfSElERSk7CisgICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhEbGcsMHg0MGUpLFNXX0hJREUpOwogICAgbHBwLT5tc2V0cmdiPVJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggU0VUUkdCU1RSSU5HICk7CiAjaWYgMAogICAgY3Bvcz1NQUtFTE9ORyg1LDcpOyAvKiBpbml0ICovCkBAIC0xOTMwLDI5ICsxOTMwLDI5IEBACiAgICBHZXRXaW5kb3dSZWN0MTYoaERsZywmbHBwLT5mdWxsc2l6ZSk7CiAgICBpZiAobHBwLT5scGNjLT5GbGFncyAmIENDX0ZVTExPUEVOIHx8IGxwcC0+bHBjYy0+RmxhZ3MgJiBDQ19QUkVWRU5URlVMTE9QRU4pCiAgICB7Ci0gICAgICBod25kPUdldERsZ0l0ZW0oaERsZywweDJjZik7Ci0gICAgICBFbmFibGVXaW5kb3coaHduZCxGQUxTRSk7CisgICAgICBod25kPUdldERsZ0l0ZW0zMihoRGxnLDB4MmNmKTsKKyAgICAgIEVuYWJsZVdpbmRvdzMyKGh3bmQsRkFMU0UpOwogICAgfQogICAgaWYgKCEobHBwLT5scGNjLT5GbGFncyAmIENDX0ZVTExPUEVOKSB8fCBscHAtPmxwY2MtPkZsYWdzICYgQ0NfUFJFVkVOVEZVTExPUEVOKQogICAgewogICAgICAgcmVjdD1scHAtPmZ1bGxzaXplOwogICAgICAgcmVzPXJlY3QuYm90dG9tLXJlY3QudG9wOwotICAgICAgaHduZD1HZXREbGdJdGVtKGhEbGcsMHgyYzYpOyAvKiBjdXQgYXQgbGVmdCBib3JkZXIgKi8KKyAgICAgIGh3bmQ9R2V0RGxnSXRlbTMyKGhEbGcsMHgyYzYpOyAvKiBjdXQgYXQgbGVmdCBib3JkZXIgKi8KICAgICAgIHBvaW50Lng9cG9pbnQueT0wOwogICAgICAgQ2xpZW50VG9TY3JlZW4xNihod25kLCZwb2ludCk7CiAgICAgICBTY3JlZW5Ub0NsaWVudDE2KGhEbGcsJnBvaW50KTsKICAgICAgIEdldENsaWVudFJlY3QxNihoRGxnLCZyZWN0KTsKICAgICAgIHBvaW50LngrPUdldFN5c3RlbU1ldHJpY3MoU01fQ1hETEdGUkFNRSk7Ci0gICAgICBTZXRXaW5kb3dQb3MoaERsZyxOVUxMLDAsMCxwb2ludC54LHJlcyxTV1BfTk9NT1ZFfFNXUF9OT1pPUkRFUik7CisgICAgICBTZXRXaW5kb3dQb3MzMihoRGxnLE5VTEwsMCwwLHBvaW50LngscmVzLFNXUF9OT01PVkV8U1dQX05PWk9SREVSKTsKIAotICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsMHgyYzYpLFNXX0hJREUpOwotICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsMHgyYzUpLFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLDB4MmM2KSxTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZywweDJjNSksU1dfSElERSk7CiAgICB9CiAgICBlbHNlCiAgICAgICBDQ19Td2l0Y2hUb0Z1bGxTaXplKGhEbGcsbHBwLT5scGNjLT5yZ2JSZXN1bHQsTlVMTCk7CiAgICByZXM9VFJVRTsKICAgIGZvciAoaT0weDJiZjtpPDB4MmM1O2krKykKLSAgICAgU2VuZE1lc3NhZ2UxNihHZXREbGdJdGVtKGhEbGcsaSksRU1fTElNSVRURVhUMTYsMywwKTsgICAgICAvKiBtYXggMyBkaWdpdHM6ICB4eXogICovCisgICAgIFNlbmRNZXNzYWdlMTYoR2V0RGxnSXRlbTMyKGhEbGcsaSksRU1fTElNSVRURVhUMTYsMywwKTsgICAgICAvKiBtYXggMyBkaWdpdHM6ICB4eXogICovCiAgICBpZiAoQ0NfSG9va0NhbGxDaGsobHBwLT5scGNjKSkKICAgICAgIHJlcz1DYWxsV2luZG93UHJvYzE2KGxwcC0+bHBjYy0+bHBmbkhvb2ssaERsZyxXTV9JTklURElBTE9HLHdQYXJhbSxsUGFyYW0pOwogICAgcmV0dXJuIHJlczsKQEAgLTIwMzEsNyArMjAzMSw3IEBACiAgICAgICAgICAgY2FzZSAweDJjZjoKICAgICAgICAgICAgICAgIENDX1N3aXRjaFRvRnVsbFNpemUoaERsZyxscHAtPmxwY2MtPnJnYlJlc3VsdCwmbHBwLT5mdWxsc2l6ZSk7CiAJICAgICAgIEludmFsaWRhdGVSZWN0MzIoIGhEbGcsIE5VTEwsIFRSVUUgKTsKLQkgICAgICAgU2V0Rm9jdXMzMihHZXREbGdJdGVtKGhEbGcsMHgyYmYpKTsKKwkgICAgICAgU2V0Rm9jdXMzMihHZXREbGdJdGVtMzIoaERsZywweDJiZikpOwogCSAgICAgICBicmVhazsKIAogICAgICAgICAgIGNhc2UgMHgyYzg6ICAgIC8qIGFkZCBjb2xvcnMgLi4uIGNvbHVtbiBieSBjb2x1bW4gKi8KQEAgLTIxMDIsMTEgKzIxMDIsMTEgQEAKICAgICBDQ19QYWludFNlbGVjdGVkQ29sb3IoaERsZyxscHAtPmxwY2MtPnJnYlJlc3VsdCk7CiAKICAgICAvKiBzcGVjaWFsIG5lY2Vzc2FyeSBmb3IgV2luZSAqLwotICAgIFZhbGlkYXRlUmVjdDMyKEdldERsZ0l0ZW0oaERsZywweDJkMCksTlVMTCk7Ci0gICAgVmFsaWRhdGVSZWN0MzIoR2V0RGxnSXRlbShoRGxnLDB4MmQxKSxOVUxMKTsKLSAgICBWYWxpZGF0ZVJlY3QzMihHZXREbGdJdGVtKGhEbGcsMHgyYzYpLE5VTEwpOwotICAgIFZhbGlkYXRlUmVjdDMyKEdldERsZ0l0ZW0oaERsZywweDJiZSksTlVMTCk7Ci0gICAgVmFsaWRhdGVSZWN0MzIoR2V0RGxnSXRlbShoRGxnLDB4MmM1KSxOVUxMKTsKKyAgICBWYWxpZGF0ZVJlY3QzMihHZXREbGdJdGVtMzIoaERsZywweDJkMCksTlVMTCk7CisgICAgVmFsaWRhdGVSZWN0MzIoR2V0RGxnSXRlbTMyKGhEbGcsMHgyZDEpLE5VTEwpOworICAgIFZhbGlkYXRlUmVjdDMyKEdldERsZ0l0ZW0zMihoRGxnLDB4MmM2KSxOVUxMKTsKKyAgICBWYWxpZGF0ZVJlY3QzMihHZXREbGdJdGVtMzIoaERsZywweDJiZSksTlVMTCk7CisgICAgVmFsaWRhdGVSZWN0MzIoR2V0RGxnSXRlbTMyKGhEbGcsMHgyYzUpLE5VTEwpOwogICAgIC8qIGhvcGUgd2UgY2FuIHJlbW92ZSBpdCBsYXRlciAtLT5GSVhNRSAqLwogIHJldHVybiAwOwogfQpAQCAtMjQ4MCw5ICsyNDgwLDkgQEAKICAgICBoQml0bWFwVFQgPSBMb2FkQml0bWFwMTYoMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9UUlRZUEUpKTsKIAkJCSAKICAgaWYgKCEobHBjZi0+RmxhZ3MgJiBDRl9TSE9XSEVMUCkgfHwgIUlzV2luZG93KGxwY2YtPmh3bmRPd25lcikpCi0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcscHNoSGVscCksU1dfSElERSk7CisgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLHBzaEhlbHApLFNXX0hJREUpOwogICBpZiAoIShscGNmLT5GbGFncyAmIENGX0FQUExZKSkKLSAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaERsZyxwc2gzKSxTV19ISURFKTsKKyAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhEbGcscHNoMyksU1dfSElERSk7CiAgIGlmIChscGNmLT5GbGFncyAmIENGX0VGRkVDVFMpCiAgIHsKICAgICBmb3IgKHJlcz0xLGk9MDtyZXMgJiYgaTxURVhUX0NPTE9SUztpKyspCkBAIC0yNTAwLDE2ICsyNTAwLDE3IEBACiAgIH0KICAgZWxzZQogICB7Ci0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsY21iNCksU1dfSElERSk7Ci0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsY2h4MSksU1dfSElERSk7Ci0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsY2h4MiksU1dfSElERSk7Ci0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsZ3JwMSksU1dfSElERSk7Ci0gICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGhEbGcsc3RjNCksU1dfSElERSk7CisgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLGNtYjQpLFNXX0hJREUpOworICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZyxjaHgxKSxTV19ISURFKTsKKyAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhEbGcsY2h4MiksU1dfSElERSk7CisgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihoRGxnLGdycDEpLFNXX0hJREUpOworICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaERsZyxzdGM0KSxTV19ISURFKTsKICAgfQogICBoZGM9IChscGNmLT5GbGFncyAmIENGX1BSSU5URVJGT05UUyAmJiBscGNmLT5oREMpID8gbHBjZi0+aERDIDogR2V0REMzMihoRGxnKTsKICAgaWYgKGhkYykKICAgewotICAgIGlmICghRW51bUZvbnRGYW1pbGllczE2KGhkYywgTlVMTCxGb250RmFtaWx5RW51bVByb2MsKExQQVJBTSlHZXREbGdJdGVtKGhEbGcsY21iMSkpKQorICAgIGlmICghRW51bUZvbnRGYW1pbGllczE2KGhkYywgTlVMTCxGb250RmFtaWx5RW51bVByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtMzIoaERsZyxjbWIxKSkpCiAgICAgICBkcHJpbnRmX2NvbW1kbGcoc3RkZGViLCJXTV9JTklURElBTE9HOiBFbnVtRm9udEZhbWlsaWVzIHJldHVybnMgMFxuIik7CiAgICAgaWYgKGxwY2YtPkZsYWdzICYgQ0ZfSU5JVFRPTE9HRk9OVFNUUlVDVCkKICAgICB7CkBAIC0yNTE4LDcgKzI1MTksOCBAQAogICAgICAgaWYgKGohPUNCX0VSUikKICAgICAgIHsKICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaERsZyxjbWIxLENCX1NFVENVUlNFTDE2LGosMCk7Ci0JU2VuZE1lc3NhZ2UxNihoRGxnLFdNX0NPTU1BTkQsY21iMSxNQUtFTE9ORyhHZXREbGdJdGVtKGhEbGcsY21iMSksQ0JOX1NFTENIQU5HRSkpOworCVNlbmRNZXNzYWdlMTYoaERsZyxXTV9DT01NQU5ELGNtYjEsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoR2V0RGxnSXRlbTMyKGhEbGcsY21iMSksQ0JOX1NFTENIQU5HRSkpOwogICAgICAgICBpbml0PTE7CiAgICAgICAgIC8qIGxvb2sgZm9yIGZpdHRpbmcgZm9udCBzdHlsZSBpbiBjb21ib2JveDIgKi8KICAgICAgICAgbD1NQUtFTE9ORyhscHh4LT5sZldlaWdodCA+IEZXX01FRElVTSA/IEZXX0JPTEQ6RldfTk9STUFMLGxweHgtPmxmSXRhbGljICE9MCk7CkBAIC0yNTM5LDcgKzI1NDEsOCBAQAogICAgICAgaWYgKCFpbml0KQogICAgICAgewogICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UxNihoRGxnLGNtYjEsQ0JfU0VUQ1VSU0VMMTYsMCwwKTsKLQlTZW5kTWVzc2FnZTE2KGhEbGcsV01fQ09NTUFORCxjbWIxLE1BS0VMT05HKEdldERsZ0l0ZW0oaERsZyxjbWIxKSxDQk5fU0VMQ0hBTkdFKSk7ICAgICAgCisJU2VuZE1lc3NhZ2UxNihoRGxnLFdNX0NPTU1BTkQsY21iMSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhHZXREbGdJdGVtMzIoaERsZyxjbWIxKSxDQk5fU0VMQ0hBTkdFKSk7ICAgICAgCiAgICAgICB9CiAgICAgfQogICAgIGlmIChscGNmLT5GbGFncyAmIENGX1VTRVNUWUxFICYmIGxwY2YtPmxwc3pTdHlsZSkKQEAgLTI1NDgsNyArMjU1MSw4IEBACiAgICAgICBpZiAoaiE9Q0JfRVJSKQogICAgICAgewogICAgICAgICBqPVNlbmREbGdJdGVtTWVzc2FnZTE2KGhEbGcsY21iMixDQl9TRVRDVVJTRUwxNixqLDApOwotICAgICAgICBTZW5kTWVzc2FnZTE2KGhEbGcsV01fQ09NTUFORCxjbWIyLE1BS0VMT05HKEdldERsZ0l0ZW0oaERsZyxjbWIyKSxDQk5fU0VMQ0hBTkdFKSk7CisgICAgICAgIFNlbmRNZXNzYWdlMTYoaERsZyxXTV9DT01NQU5ELGNtYjIsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoR2V0RGxnSXRlbTMyKGhEbGcsY21iMiksQ0JOX1NFTENIQU5HRSkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMjY4Niw3ICsyNjkwLDcgQEAKICAgTFBDSE9PU0VGT05UIGxwY2Y9KExQQ0hPT1NFRk9OVClHZXRXaW5kb3dMb25nMzJBKGhEbGcsIERXTF9VU0VSKTsgCiAKICAgaWYgKGxwY2YtPkZsYWdzICYgQ0ZfRUZGRUNUUykKLSAgIGlmIChISVdPUkQobFBhcmFtKT09Q1RMQ09MT1JfU1RBVElDICYmIEdldERsZ0N0cmxJRChMT1dPUkQobFBhcmFtKSk9PXN0YzYpCisgICBpZiAoSElXT1JEKGxQYXJhbSk9PUNUTENPTE9SX1NUQVRJQyAmJiBHZXREbGdDdHJsSUQzMihMT1dPUkQobFBhcmFtKSk9PXN0YzYpCiAgICB7CiAgICAgIFNldFRleHRDb2xvcih3UGFyYW0sbHBjZi0+cmdiQ29sb3JzKTsKICAgICAgcmV0dXJuIEdldFN0b2NrT2JqZWN0MzIoV0hJVEVfQlJVU0gpOwpAQCAtMjcyNSw3ICsyNzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pU0VHUFRSX0dFVChzdHIpKTsKIAkgICAgICAgICAgICAgICAgZHByaW50Zl9jb21tZGxnKHN0ZGRlYiwiV01fQ09NTUFORC9jbWIxID0+JXNcbiIsc3RyKTsKICAgICAgICAJCSAgICAgICAgRW51bUZvbnRGYW1pbGllczE2KGhkYyxzdHIsRm9udFN0eWxlRW51bVByb2MsCi0JCSAgICAgICAgICAgICBNQUtFTE9ORyhHZXREbGdJdGVtKGhEbGcsY21iMiksR2V0RGxnSXRlbShoRGxnLGNtYjMpKSk7CisJCSAgICAgICAgICAgICBNQUtFTE9ORyhHZXREbGdJdGVtMzIoaERsZyxjbWIyKSxHZXREbGdJdGVtMzIoaERsZyxjbWIzKSkpOwogCQkgICAgICAgIFNldEN1cnNvcihoY3Vyc29yKTsgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSX0ZSRUUoc3RyKTsKIAkJICAgICAgfQpAQCAtMjc3OCw4ICsyNzgyLDggQEAKIAkJICAgICAgbHB4eC0+bGZIZWlnaHQ9LUxPV09SRChTZW5kRGxnSXRlbU1lc3NhZ2UxNihoRGxnLGNtYjMsQ0JfR0VUSVRFTURBVEExNixpLDApKTsKIAkJICAgIGVsc2UKIAkJICAgICAgbHB4eC0+bGZIZWlnaHQ9MDsKLQkJICAgIGxweHgtPmxmU3RyaWtlT3V0PUlzRGxnQnV0dG9uQ2hlY2tlZChoRGxnLGNoeDEpOwotCQkgICAgbHB4eC0+bGZVbmRlcmxpbmU9SXNEbGdCdXR0b25DaGVja2VkKGhEbGcsY2h4Mik7CisJCSAgICBscHh4LT5sZlN0cmlrZU91dD1Jc0RsZ0J1dHRvbkNoZWNrZWQzMihoRGxnLGNoeDEpOworCQkgICAgbHB4eC0+bGZVbmRlcmxpbmU9SXNEbGdCdXR0b25DaGVja2VkMzIoaERsZyxjaHgyKTsKIAkJICAgIGxweHgtPmxmV2lkdGg9bHB4eC0+bGZPcmllbnRhdGlvbj1scHh4LT5sZkVzY2FwZW1lbnQ9MDsKIAkJICAgIGxweHgtPmxmT3V0UHJlY2lzaW9uPU9VVF9ERUZBVUxUX1BSRUNJUzsKIAkJICAgIGxweHgtPmxmQ2xpcFByZWNpc2lvbj1DTElQX0RFRkFVTFRfUFJFQ0lTOwpAQCAtMjc5Nyw3ICsyODAxLDcgQEAKIAkJICBpZiAoaSE9Q0JfRVJSKQogCQkgIHsKIAkJICAgbHBjZi0+cmdiQ29sb3JzPXRleHRjb2xvcnNbaV07Ci0JCSAgIEludmFsaWRhdGVSZWN0MzIoIEdldERsZ0l0ZW0oaERsZyxzdGM2KSwgTlVMTCwgMCApOworCQkgICBJbnZhbGlkYXRlUmVjdDMyKCBHZXREbGdJdGVtMzIoaERsZyxzdGM2KSwgTlVMTCwgMCApOwogCQkgIH0KIAkJICBicmVhazsKIAkKZGlmZiAtLWdpdCBhL21pc2MvY3J0ZGxsLmMgYi9taXNjL2NydGRsbC5jCmluZGV4IDNkMjliY2EuLjU5MDlhNTMgMTAwNjQ0Ci0tLSBhL21pc2MvY3J0ZGxsLmMKKysrIGIvbWlzYy9jcnRkbGwuYwpAQCAtODQ4LDMgKzg0OCwyMyBAQAogCXJldHVybiBOVUxMOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIF9zZXRtb2RlICAgICAgICAgICAoQ1JURExMLjI2NSkKKyAqIEZJWE1FOiBkdW5ubyB3aGF0IHRoaXMgaXMuCisgKi8KK0RXT1JECitDUlRETExfX3NldG1vZGUoTFBWT0lEIHgsSU5UMzIgeSkgeworCS8qIEZJWE1FICovCisJZnByaW50ZihzdGRuaW1wLCJDUlRETEwuX3NldG1vZGUoJXAsJWQpLCBTVFVCLlxuIix4LHkpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIGF0ZXhpdCAgICAgICAgICAgKENSVERMTC4zNDUpCisgKi8KK0lOVDMyCitDUlRETExfYXRleGl0KExQVk9JRCB4KSB7CisJLyogRklYTUUgKi8KKwlmcHJpbnRmKHN0ZG5pbXAsIkNSVERMTC5hdGV4aXQoJXApLCBTVFVCLlxuIix4KTsKKwlyZXR1cm4gMDsgLyogc3VjY2Vzc2Z1bCAqLworfQpkaWZmIC0tZ2l0IGEvbWlzYy9lc2NhcGUuYyBiL21pc2MvZXNjYXBlLmMKaW5kZXggZWMwNjE1Ni4uYTQyODI3YyAxMDA2NDQKLS0tIGEvbWlzYy9lc2NhcGUuYworKysgYi9taXNjL2VzY2FwZS5jCkBAIC00LDIxICs0LDI1IEBACiAgKiBDb3B5cmlnaHQgMTk5NCAgQm9iIEFtc3RhZHQKICAqLwogCi0jaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJnZGkuaCIKKyNpbmNsdWRlICJkYy5oIgogCi1JTlQgRXNjYXBlKCBIREMxNiBoZGMsIElOVCBuRXNjYXBlLCBJTlQgY2JJbnB1dCwKLSAgICAgICAgICAgIFNFR1BUUiBscHN6SW5EYXRhLCBTRUdQVFIgbHB2T3V0RGF0YSApCitJTlQxNiBFc2NhcGUxNiggSERDMTYgaGRjLCBJTlQxNiBuRXNjYXBlLCBJTlQxNiBjYklucHV0LAorICAgICAgICAgICAgICAgIFNFR1BUUiBscHN6SW5EYXRhLCBTRUdQVFIgbHB2T3V0RGF0YSApCiB7Ci0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7Ci0gICAgaWYgKCFkYykgCi0gICAgewotCWRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIE1FVEFGSUxFX0RDX01BR0lDKTsKLQlpZiAoIWRjKSByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIWRjLT5mdW5jcy0+cEVzY2FwZSkgcmV0dXJuIDA7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKKyAgICBpZiAoIWRjIHx8ICFkYy0+ZnVuY3MtPnBFc2NhcGUpIHJldHVybiAwOwogICAgIHJldHVybiBkYy0+ZnVuY3MtPnBFc2NhcGUoIGRjLCBuRXNjYXBlLCBjYklucHV0LCBscHN6SW5EYXRhLCBscHZPdXREYXRhICk7CiB9CisKK0lOVDMyIEVzY2FwZTMyKCBIREMzMiBoZGMsIElOVDMyIG5Fc2NhcGUsIElOVDMyIGNiSW5wdXQsCisgICAgICAgICAgICAgICAgTFBWT0lEIGxwc3pJbkRhdGEsIExQVk9JRCBscHZPdXREYXRhICkKK3sKKyAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOworICAgIGlmICghZGMgfHwgIWRjLT5mdW5jcy0+cEVzY2FwZSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIGRjLT5mdW5jcy0+cEVzY2FwZSggZGMsIG5Fc2NhcGUsIGNiSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNFR1BUUilscHN6SW5EYXRhLCAoU0VHUFRSKWxwdk91dERhdGEgKTsKK30KZGlmZiAtLWdpdCBhL21pc2MvZm9udGVuZ2luZS5jIGIvbWlzYy9mb250ZW5naW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5OTgwNwotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvZm9udGVuZ2luZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBUcnVlIFR5cGUgZm9udCBlbmdpbmUgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAxOTk2IEpvaG4gSGFydmV5CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKworLyogR0RJIDMwMCAqLworV09SRCAKK0VuZ2luZUVudW1lcmF0ZUZvbnQoTFBTVFIgZm9udG5hbWUsIEZBUlBST0MxNiBwcm9jLCBEV09SRCBkYXRhICkKK3sKKyAgICBwcmludGYoIkluIGVuZ2luZUVudW1lcmF0ZUZvbnQgZm9yICVzXG4iLGZvbnRuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKyNpZmRlZiBOT1RERUYKKy8qIEdESSAzMDEgKi8KK1dPUkQgCitFbmdpbmVEZWxldGVGb250KExQRk9OVElORk8xNiBscEZvbnRJbmZvKQoreworICAgIHJldHVybiAwCit9CisjZW5kaWYKKy8qIEdESSAzMDIgKi8KK1dPUkQKK0VuZ2luZVJlYWxpemVGb250KExQTE9HRk9OVDE2IGxwbG9nRm9udCwgTFBURVhUWEZPUk0xNiBscHRleHR4Zm9ybSwgTFBGT05USU5GTzE2IGxwZm9udEluZm8pCit7CisgICAgcHJpbnRmKCJJbiBFbmdpbmVSZWFsaXplRm9udFxuIik7CisgICAgCisgICAgcmV0dXJuIDA7Cit9CisjaWZkZWYgTk9UREVGCisvKiBHREkgMzAzICovCitXT1JEIAorRW5naW5lR2V0Q2hhcldpZHRoKExQRk9OVElORk8xNiBscEZvbnRJbmZvLCBCWVRFLCBCWVRFLCBMUElOVDE2KQoreworICAgIHJldHVybiAwOworfQorCisvKiBHREkgMzA0ICovCitXT1JEIAorRW5naW5lU2V0Rm9udENvbnRleHQoTFBGT05USU5GTyBscEZvbnRJbmZvLCBXT1JEIGRhdGEpCit7Cit9CisvKiBHREkgMzA1ICovCitXT1JEIAorRW5naW5lR2V0R2x5cGhCTVAoV09SRCB3b3JkLCBMUEZPTlRJTkZPIGxwRm9udEluZm8sIFdPUkQsIFdPUkQsIExQU1RSIHN0cmluZywgRFdPUkQgZHdvcmQsIExQQklUTUFQTUVUUklDUzE2IG1ldHJpY3MpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEdESSAzMDYgKi8KK0RXT1JEIAorRW5naW5lTWFrZUZvbnREaXIoSERDMTYgaGRjLCBMUEZPTlRESVIgZm9udGRpciwgTFBDU1RSIHN0cmluZykKK3sKKyAgICByZXR1cm4gMDsKKyAgICAKK30KKworLyogR0RJIDMxNCAqLworCitXT1JEIAorRW5naW5lRXh0VGV4dE91dCgpCit7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCBkMWE0ZGNjMy4uMTQ2MDhkMCAxMDA2NDQKLS0tIGEvbWlzYy9tYWluLmMKKysrIGIvbWlzYy9tYWluLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogICogICAgICAgICAgIE1BSU5fVXNhZ2UKICAqLwogI2lmbmRlZiBXSU5FTElCMzIKLXN0YXRpYyB2b2lkIE1BSU5fVXNhZ2UoIGNoYXIgKm5hbWUgKQordm9pZCBNQUlOX1VzYWdlKCBjaGFyICpuYW1lICkKIHsKICAgICBmcHJpbnRmKCBzdGRlcnIsIFVTQUdFLCBuYW1lICk7CiAgICAgZXhpdCgxKTsKQEAgLTY0Miw3ICs2NDIsOSBAQAogICAgIE1TR19XaW5lU3RhcnRUaWNrcyA9ICh0di50dl9zZWMgKiAxMDAwKSArICh0di50dl91c2VjIC8gMTAwMCk7CiAKICAgICBYcm1Jbml0aWFsaXplKCk7Ci0gICAgCisKKyAgICBwdXRlbnYoIlhLQl9ESVNBQkxFPSIpOyAvKiBEaXNhYmxlIFhLQiBleHRlbnNpb24gaWYgcHJlc2VudC4gKi8KKwogICAgIE1BSU5fUGFyc2VPcHRpb25zKCBhcmdjLCBhcmd2ICk7CiAKICAgICBpZiAoT3B0aW9ucy5kZXNrdG9wR2VvbWV0cnkgJiYgT3B0aW9ucy5tYW5hZ2VkKQpkaWZmIC0tZ2l0IGEvbWlzYy9udGRsbC5jIGIvbWlzYy9udGRsbC5jCmluZGV4IDdmNDNkMzIuLjZmMThlMjYgMTAwNjQ0Ci0tLSBhL21pc2MvbnRkbGwuYworKysgYi9taXNjL250ZGxsLmMKQEAgLTcsMTYgKzcsMTUgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc0LDEyICs3Myw1NSBAQAogRFdPUkQKIFJ0bENvcHlTaWQoRFdPUkQgbGVuLExQU0lEIHRvLExQU0lEIGZyb20pIHsKIAlpZiAobGVuPChmcm9tLT5TdWJBdXRob3JpdHlDb3VudCo0KzgpKQotCQlyZXR1cm4gMHhDMDAwMDAyMzsKKwkJcmV0dXJuIFNUQVRVU19CVUZGRVJfVE9PX1NNQUxMOwogCW1lbW1vdmUodG8sZnJvbSxmcm9tLT5TdWJBdXRob3JpdHlDb3VudCo0KzgpOwotCXJldHVybiAwOworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRsQW5zaVN0cmluZ1RvVW5pY29kZVN0cmluZwkJW05URExMXQorICovCitEV09SRCAvKiBOVFNUQVRVUyAqLworUnRsQW5zaVN0cmluZ1RvVW5pY29kZVN0cmluZyhMUFVOSUNPREVfU1RSSU5HIHVuaSxMUEFOU0lfU1RSSU5HIGFuc2ksQk9PTDMyIGRvYWxsb2MpIHsKKwlEV09SRAl1bmlsZW4gPSAoYW5zaS0+TGVuZ3RoKzEpKnNpemVvZihXQ0hBUik7CisKKwlpZiAodW5pbGVuPjB4RkZGRikKKwkJcmV0dXJuIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8yOworCXVuaS0+TGVuZ3RoID0gdW5pbGVuOworCWlmIChkb2FsbG9jKSB7CisJCXVuaS0+TWF4aW11bUxlbmd0aCA9IHVuaWxlbjsKKwkJdW5pLT5CdWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHVuaWxlbik7CisJCWlmICghdW5pLT5CdWZmZXIpCisJCQlyZXR1cm4gU1RBVFVTX05PX01FTU9SWTsKKwl9CisJaWYgKHVuaWxlbj51bmktPk1heGltdW1MZW5ndGgpCisJCXJldHVybiBTVEFUVVNfQlVGRkVSX09WRVJGTE9XOworCWxzdHJjcHluQXRvVyh1bmktPkJ1ZmZlcixhbnNpLT5CdWZmZXIsdW5pbGVuLzIpOworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRsT2VtU3RyaW5nVG9Vbmljb2RlU3RyaW5nCQlbTlRETExdCisgKi8KK0RXT1JEIC8qIE5UU1RBVFVTICovCitSdGxPZW1TdHJpbmdUb1VuaWNvZGVTdHJpbmcoTFBVTklDT0RFX1NUUklORyB1bmksTFBTVFJJTkcgYW5zaSxCT09MMzIgZG9hbGxvYykgeworCURXT1JECXVuaWxlbiA9IChhbnNpLT5MZW5ndGgrMSkqc2l6ZW9mKFdDSEFSKTsKKworCWlmICh1bmlsZW4+MHhGRkZGKQorCQlyZXR1cm4gU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzI7CisJdW5pLT5MZW5ndGggPSB1bmlsZW47CisJaWYgKGRvYWxsb2MpIHsKKwkJdW5pLT5NYXhpbXVtTGVuZ3RoID0gdW5pbGVuOworCQl1bmktPkJ1ZmZlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksdW5pbGVuKTsKKwkJaWYgKCF1bmktPkJ1ZmZlcikKKwkJCXJldHVybiBTVEFUVVNfTk9fTUVNT1JZOworCX0KKwlpZiAodW5pbGVuPnVuaS0+TWF4aW11bUxlbmd0aCkKKwkJcmV0dXJuIFNUQVRVU19CVUZGRVJfT1ZFUkZMT1c7CisJbHN0cmNweW5BdG9XKHVuaS0+QnVmZmVyLGFuc2ktPkJ1ZmZlcix1bmlsZW4vMik7CisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgUnRsT2VtVG9Vbmljb2RlTgkJCVtOVERMTF0KICAqLwogRFdPUkQgLyogTlRTVEFUVVMgKi8KQEAgLTkwLDcgKzEzMiw3IEBACiAJbGVuID0gb2VtbGVuOwogCWlmICh1bmlsZW4vMiA8IGxlbikKIAkJbGVuID0gdW5pbGVuLzI7Ci0JeD0oTFBXU1RSKXhtYWxsb2MoKGxlbisxKSpzaXplb2YoV0NIQVIpKTsKKwl4PShMUFdTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSwobGVuKzEpKnNpemVvZihXQ0hBUikpOwogCWxzdHJjcHluQXRvVyh4LG9lbXN0cixsZW4rMSk7CiAJbWVtY3B5KHVuaXN0cix4LGxlbioyKTsKIAlpZiAocmVzbGVuKSAqcmVzbGVuID0gbGVuKjI7CkBAIC05OCw2ICsxNDAsNDQgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRsSW5pdFN0cmluZwkJCVtOVERMTF0KKyAqLworVk9JRAorUnRsSW5pdEFuc2lTdHJpbmcoTFBBTlNJX1NUUklORyB0YXJnZXQsTFBDU1RSIHNvdXJjZSkgeworCXRhcmdldC0+TGVuZ3RoID0gdGFyZ2V0LT5NYXhpbXVtTGVuZ3RoID0gMDsKKwl0YXJnZXQtPkJ1ZmZlciA9IChMUFNUUilzb3VyY2U7CisJaWYgKCFzb3VyY2UpCisJCXJldHVybjsKKwl0YXJnZXQtPkxlbmd0aCA9IGxzdHJsZW4zMkEodGFyZ2V0LT5CdWZmZXIpOworCXRhcmdldC0+TWF4aW11bUxlbmd0aCA9IHRhcmdldC0+TGVuZ3RoKzE7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICBSdGxJbml0U3RyaW5nCQkJW05URExMXQorICovCitWT0lECitSdGxJbml0U3RyaW5nKExQU1RSSU5HIHRhcmdldCxMUENTVFIgc291cmNlKSB7CisJdGFyZ2V0LT5MZW5ndGggPSB0YXJnZXQtPk1heGltdW1MZW5ndGggPSAwOworCXRhcmdldC0+QnVmZmVyID0gKExQU1RSKXNvdXJjZTsKKwlpZiAoIXNvdXJjZSkKKwkJcmV0dXJuOworCXRhcmdldC0+TGVuZ3RoID0gbHN0cmxlbjMyQSh0YXJnZXQtPkJ1ZmZlcik7CisJdGFyZ2V0LT5NYXhpbXVtTGVuZ3RoID0gdGFyZ2V0LT5MZW5ndGgrMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRsSW5pdFVuaWNvZGVTdHJpbmcJCQlbTlRETExdCisgKi8KK1ZPSUQKK1J0bEluaXRVbmljb2RlU3RyaW5nKExQVU5JQ09ERV9TVFJJTkcgdGFyZ2V0LExQQ1dTVFIgc291cmNlKSB7CisJdGFyZ2V0LT5MZW5ndGggPSB0YXJnZXQtPk1heGltdW1MZW5ndGggPSAwOworCXRhcmdldC0+QnVmZmVyID0gKExQV1NUUilzb3VyY2U7CisJaWYgKCFzb3VyY2UpCisJCXJldHVybjsKKwl0YXJnZXQtPkxlbmd0aCA9IGxzdHJsZW4zMlcodGFyZ2V0LT5CdWZmZXIpKjI7CisJdGFyZ2V0LT5NYXhpbXVtTGVuZ3RoID0gdGFyZ2V0LT5MZW5ndGgrMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgUnRsVW5pY29kZVRvT2VtTgkJCVtOVERMTF0KICAqLwogRFdPUkQgLyogTlRTVEFUVVMgKi8KQEAgLTEwOCw3ICsxODgsNyBAQAogCWxlbiA9IG9lbWxlbjsKIAlpZiAodW5pbGVuLzIgPCBsZW4pCiAJCWxlbiA9IHVuaWxlbi8yOwotCXg9KExQU1RSKXhtYWxsb2MobGVuKzEpOworCXg9KExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksbGVuKzEpOwogCWxzdHJjcHluV3RvQSh4LHVuaXN0cixsZW4rMSk7CiAJbWVtY3B5KG9lbXN0cix4LGxlbik7CiAJaWYgKHJlc2xlbikgKnJlc2xlbiA9IGxlbjsKQEAgLTEyMiwxMCArMjAyLDcxIEBACiBSdGxVbmljb2RlU3RyaW5nVG9PZW1TdHJpbmcoTFBVTklDT0RFX1NUUklORyB1bmksTFBBTlNJX1NUUklORyBvZW0sQk9PTDMyIGFsbG9jKQogewogCWlmIChhbGxvYykgewotCQlvZW0tPkJ1ZmZlciA9IChMUFNUUil4bWFsbG9jKHVuaS0+TGVuZ3RoLzIpKzE7CisJCW9lbS0+QnVmZmVyID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksdW5pLT5MZW5ndGgvMikrMTsKIAkJb2VtLT5NYXhpbXVtTGVuZ3RoID0gdW5pLT5MZW5ndGgvMisxOwogCX0KIAlvZW0tPkxlbmd0aCA9IHVuaS0+TGVuZ3RoLzI7CiAJbHN0cmNweW5XdG9BKG9lbS0+QnVmZmVyLHVuaS0+QnVmZmVyLHVuaS0+TGVuZ3RoLzIrMSk7CiAJcmV0dXJuIDA7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgIFJ0bE50U3RhdHVzVG9Eb3NFcnJvCQkJW05URExMXQorICovCitEV09SRAorUnRsTnRTdGF0dXNUb0Rvc0Vycm9yKERXT1JEIGVycm9yKSB7CisJLyogRklYTUU6IG1hcCBTVEFUVVNfIHRvIEVSUk9SXyAqLworCXJldHVybiBlcnJvcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRsR2V0TnRQcm9kdWN0VHlwZQkJCVtOVERMTF0KKyAqLworRFdPUkQKK1J0bEdldE50UHJvZHVjdFR5cGUoTFBWT0lEIHgpIHsKKwkvKiBGSVhNRSA6IGZpbmQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBvbmUgKi8KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRsVXBjYXNlVW5pY29kZVN0cmluZwkJW05URExMXQorICovCitEV09SRAorUnRsVXBjYXNlVW5pY29kZVN0cmluZyhMUFVOSUNPREVfU1RSSU5HIGRlc3QsTFBVTklDT0RFX1NUUklORyBzcmMsQk9PTDMyIGRvYWxsb2MpIHsKKwlMUFdTVFIJcyx0OworCURXT1JECWksbGVuOworCisJbGVuID0gc3JjLT5MZW5ndGg7CisJaWYgKGRvYWxsb2MpIHsKKwkJZGVzdC0+TWF4aW11bUxlbmd0aCA9IGxlbjsgCisJCWRlc3QtPkJ1ZmZlciA9IChMUFdTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxsZW4pOworCQlpZiAoIWRlc3QtPkJ1ZmZlcikKKwkJCXJldHVybiBTVEFUVVNfTk9fTUVNT1JZOworCisJfQorCWlmIChkZXN0LT5NYXhpbXVtTGVuZ3RoIDwgbGVuKQorCQlyZXR1cm4gU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzsKKwlzPWRlc3QtPkJ1ZmZlcjt0PXNyYy0+QnVmZmVyOworCWZvciAoaT0wO2k8bGVuO2krKykgeworCQlzW2ldPXRvdXBwZXIodFtpXSk7CisJCXMrKzsKKwkJdCsrOworCX0KKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgIFJ0bHhPZW1TdHJpbmdUb1VuaWNvZGVTaXplCQlbTlRETExdCisgKi8KK1VJTlQzMgorUnRseE9lbVN0cmluZ1RvVW5pY29kZVNpemUoTFBTVFJJTkcgc3RyKSB7CisJcmV0dXJuIHN0ci0+TGVuZ3RoKjIrMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgUnRseEFuc2lTdHJpbmdUb1VuaWNvZGVTaXplCQlbTlRETExdCisgKi8KK1VJTlQzMgorUnRseEFuc2lTdHJpbmdUb1VuaWNvZGVTaXplKExQQU5TSV9TVFJJTkcgc3RyKSB7CisJcmV0dXJuIHN0ci0+TGVuZ3RoKjIrMjsKK30KZGlmZiAtLWdpdCBhL21pc2MvcmVnaXN0cnkuYyBiL21pc2MvcmVnaXN0cnkuYwppbmRleCA0OGI1NzdmLi4yMjJkOTk0IDEwMDY0NAotLS0gYS9taXNjL3JlZ2lzdHJ5LmMKKysrIGIvbWlzYy9yZWdpc3RyeS5jCkBAIC0zMDE1LDMgKzMwMTUsMTAgQEAKIAkJZnJlZShscHN6Q2xhc3NXKTsKIAlyZXR1cm4gcmV0OwogfQorLyogUmVnQ29ubmVjdFJlZ2lzdHJ5QQkJW0FEVkFQSTMyLjEyN10gKi8KK0RXT1JEIFJlZ0Nvbm5lY3RSZWdpc3RyeTMyQShMUENTVFIgbWFjaGluZSxIS0VZIGhrZXksTFBIS0VZIHJlc2tleSkgeworCWZwcmludGYoc3RkZXJyLCJSZWdDb25uZWN0UmVnaXN0cnkzMkEoJXMsJTA4bHgsJXApLCBTVFVCLlxuIiwKKwkJbWFjaGluZSxoa2V5LHJlc2tleQorCSk7CisJcmV0dXJuIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOyAvKiBGSVhNRSAqLworfQpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IDUwNmIxM2UuLmFkNDkyYzAgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTM3MCw3ICszNzAsNyBAQAogICAgICAgICAgICAgICAgIEdldFdpbmRvd1RleHQzMkEoIGhXbmQsIFRlbXBsYXRlLCBzaXplb2YoVGVtcGxhdGUpICk7CiAgICAgICAgICAgICAgICAgc3ByaW50ZiggQXBwVGl0bGUsIFRlbXBsYXRlLCBpbmZvLT5zekFwcCApOwogICAgICAgICAgICAgICAgIFNldFdpbmRvd1RleHQzMkEoIGhXbmQsIEFwcFRpdGxlICk7Ci0gICAgICAgICAgICAgICAgU2V0V2luZG93VGV4dDMyQSggR2V0RGxnSXRlbShoV25kLDEwMCksIGluZm8tPnN6T3RoZXJTdHVmZiApOworICAgICAgICAgICAgICAgIFNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLDEwMCksIGluZm8tPnN6T3RoZXJTdHVmZiApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvbWlzYy92ZXIuYyBiL21pc2MvdmVyLmMKaW5kZXggN2VlZGY2ZC4uMjc3OWEwMCAxMDA2NDQKLS0tIGEvbWlzYy92ZXIuYworKysgYi9taXNjL3Zlci5jCkBAIC0zLDcgKzMsNiBAQAogICogCiAgKiBDb3B5cmlnaHQgMTk5NiBNYXJjdXMgTWVpc3NuZXIKICAqLwotCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTQwLDYgKzM5LDcgQEAKIAkJTFpTZWVrMzIobHpmZCxtemgubmVfb2Zmc2V0LFNFRUtfU0VUKTsKIAkJcmV0dXJuIDE7CiAJfQorCWZwcmludGYoc3RkZXJyLCJtaXNjL3Zlci5jOnJlYWRfbmVfaGVhZGVyOmNhbid0IGhhbmRsZSBQRSBmaWxlcyB5ZXQuXG4iKTsKIAkvKiBtdXN0IGhhbmRsZSBQRSBmaWxlcyB0b28uIExhdGVyLiAqLwogCXJldHVybiAwOwogfQpAQCAtNDQyLDM3ICs0NDIsMjIyIEBACiBEV09SRAogVmVySW5zdGFsbEZpbGUxNigKIAlVSU5UMTYgZmxhZ3MsTFBDU1RSIHNyY2ZpbGVuYW1lLExQQ1NUUiBkZXN0ZmlsZW5hbWUsTFBDU1RSIHNyY2RpciwKLQlMUENTVFIgZGVzdGRpcixMUFNUUiB0bXBmaWxlLFVJTlQxNiAqdG1wZmlsZWxlbgotKSB7Ci0JZHByaW50Zl92ZXIoc3RkZGViLCJWZXJJbnN0YWxsRmlsZSgleCwlcywlcywlcywlcywlcCwlZClcbiIsCi0JCWZsYWdzLHNyY2ZpbGVuYW1lLGRlc3RmaWxlbmFtZSxzcmNkaXIsZGVzdGRpcix0bXBmaWxlLCp0bXBmaWxlbGVuCi0JKTsKLQotCS8qIEZJWE1FOiBJbXBsZW1lbnRhdGlvbiBzdGlsbCBtaXNzaW5nIC4uLi4gKi8KLQotCXJldHVybiBWSUZfU1JDT0xEOwotfQotCi0vKiBWZXJGaW5kRmlsZUEJCQkJCVtWRVJTSU9OLjVdICovCi1EV09SRAotVmVySW5zdGFsbEZpbGUzMkEoCi0JVUlOVDMyIGZsYWdzLExQQ1NUUiBzcmNmaWxlbmFtZSxMUENTVFIgZGVzdGZpbGVuYW1lLExQQ1NUUiBzcmNkaXIsCi0JTFBDU1RSIGRlc3RkaXIsTFBTVFIgdG1wZmlsZSxVSU5UMzIgKnRtcGZpbGVsZW4gKQorIAlMUENTVFIgZGVzdGRpcixMUENTVFIgY3VyZGlyLExQU1RSIHRtcGZpbGUsVUlOVDE2ICp0bXBmaWxlbGVuICkKIHsKLSAgICBVSU5UMTYgZmlsZWxlbjsKLSAgICBEV09SRCByZXQ9IFZlckluc3RhbGxGaWxlMTYoZmxhZ3Msc3JjZmlsZW5hbWUsZGVzdGZpbGVuYW1lLHNyY2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGRpcix0bXBmaWxlLCZmaWxlbGVuKTsKKyAgICBVSU5UMzIJZmlsZWxlbjsKKyAgICBEV09SRCByZXQ9IFZlckluc3RhbGxGaWxlMzJBKGZsYWdzLHNyY2ZpbGVuYW1lLGRlc3RmaWxlbmFtZSxzcmNkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ZGlyLGN1cmRpcix0bXBmaWxlLCZmaWxlbGVuKTsKKwogICAgICp0bXBmaWxlbGVuID0gZmlsZWxlbjsKICAgICByZXR1cm4gcmV0OwogfQogCi0vKiBWZXJGaW5kRmlsZVcJCQkJCVtWRVJTSU9OLjZdICovCisvKiBWZXJJbnN0YWxsRmlsZUEJCQkJW1ZFUlNJT04uN10gKi8KK3N0YXRpYyBMUEJZVEUKK19mZXRjaF92ZXJzaW9uaW5mbyhMUFNUUiBmbikgeworICAgIERXT1JECWFsbG9jbGVuOworICAgIExQQllURQlidWY7CisgICAgRFdPUkQJcmV0OworCisgICAgYWxsb2NsZW4gPSAxMDAwOworICAgIGJ1Zj0geG1hbGxvYyhhbGxvY2xlbik7CisgICAgd2hpbGUgKDEpIHsKKyAgICAJcmV0ID0gR2V0RmlsZVZlcnNpb25JbmZvMzJBKGZuLDAsYWxsb2NsZW4sYnVmKTsKKwlpZiAoIXJldCkgeworCSAgICBmcmVlKGJ1Zik7CisJICAgIHJldHVybiAwOworCX0KKwlpZiAoYWxsb2NsZW48KihXT1JEKilidWYpIHsKKwkgICAgZnJlZShidWYpOworCSAgICBhbGxvY2xlbiA9ICooV09SRCopYnVmOworCSAgICBidWYgPSB4bWFsbG9jKGFsbG9jbGVuKTsKKwl9IGVsc2UKKwkgICAgcmV0dXJuIGJ1ZjsKKyAgICB9Cit9CisKK3N0YXRpYyBEV09SRAorX2Vycm9yMnZpZihEV09SRCBlcnJvcikgeworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICBjYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CisgICAgCXJldHVybiBWSUZfQUNDRVNTVklPTEFUSU9OOworICAgIGNhc2UgRVJST1JfU0hBUklOR19WSU9MQVRJT046CisgICAgCXJldHVybiBWSUZfU0hBUklOR1ZJT0xBVElPTjsKKyAgICBkZWZhdWx0OgorICAgIAlyZXR1cm4gMDsKKyAgICB9Cit9CisKK0RXT1JECitWZXJJbnN0YWxsRmlsZTMyQSgKKwlVSU5UMzIgZmxhZ3MsTFBDU1RSIHNyY2ZpbGVuYW1lLExQQ1NUUiBkZXN0ZmlsZW5hbWUsTFBDU1RSIHNyY2RpciwKKyAJTFBDU1RSIGRlc3RkaXIsTFBDU1RSIGN1cmRpcixMUFNUUiB0bXBmaWxlLFVJTlQzMiAqdG1wZmlsZWxlbiApCit7CisgICAgY2hhcglkZXN0Zm5bMjYwXSx0bXBmblsyNjBdLHNyY2ZuWzI2MF07CisgICAgSEZJTEUzMgloZnNyYyxoZmRzdDsKKyAgICBEV09SRAlhdHRyLHJldCx4cmV0LHRtcGxhc3Q7CisgICAgTFBCWVRFCWJ1ZjEsYnVmMjsKKyAgICBPRlNUUlVDVAlvZnM7CisKKyAgICBmcHJpbnRmKHN0ZGRlYiwiVmVySW5zdGFsbEZpbGUoJXgsJXMsJXMsJXMsJXMsJXMsJXAsJWQpXG4iLAorCSAgICBmbGFncyxzcmNmaWxlbmFtZSxkZXN0ZmlsZW5hbWUsc3JjZGlyLGRlc3RkaXIsY3VyZGlyLHRtcGZpbGUsKnRtcGZpbGVsZW4KKyAgICApOworICAgIHhyZXQgPSAwOworICAgIHNwcmludGYoc3JjZm4sIiVzXFwlcyIsc3JjZGlyLHNyY2ZpbGVuYW1lKTsKKyAgICBzcHJpbnRmKGRlc3RmbiwiJXNcXCVzIixkZXN0ZGlyLGRlc3RmaWxlbmFtZSk7CisgICAgaGZzcmM9TFpPcGVuRmlsZTMyQShzcmNmbiwmb2ZzLE9GX1JFQUQpOworICAgIGlmIChoZnNyYz09SEZJTEVfRVJST1IzMikKKyAgICAJcmV0dXJuIFZJRl9DQU5OT1RSRUFEU1JDOworICAgIHNwcmludGYodG1wZm4sIiVzXFwlcyIsZGVzdGRpcixkZXN0ZmlsZW5hbWUpOworICAgIHRtcGxhc3Q9c3RybGVuKGRlc3RkaXIpKzE7CisgICAgYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzMzJBKHRtcGZuKTsKKyAgICBpZiAoYXR0ciE9LTEpIHsKKwlpZiAoYXR0ciAmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSB7CisJICAgIExaQ2xvc2UzMihoZnNyYyk7CisJICAgIHJldHVybiBWSUZfV1JJVEVQUk9UOworCX0KKwkvKiBGSVhNRTogY2hlY2sgaWYgZmlsZSBjdXJyZW50bHkgaW4gdXNlIGFuZCByZXR1cm4gVklGX0ZJTEVJTlVTRSAqLworICAgIH0KKyAgICBhdHRyID0gLTE7CisgICAgaWYgKGZsYWdzICYgVklGRl9GT1JDRUlOU1RBTEwpIHsKKyAgICAJaWYgKHRtcGZpbGVbMF0pIHsKKwkgICAgc3ByaW50Zih0bXBmbiwiJXNcXCVzIixkZXN0ZGlyLHRtcGZpbGUpOworCSAgICB0bXBsYXN0ID0gc3RybGVuKGRlc3RkaXIpKzE7CisJICAgIGF0dHIgPSBHZXRGaWxlQXR0cmlidXRlczMyQSh0bXBmbik7CisJICAgIC8qIGlmIGl0IGV4aXN0cywgaXQgaGFzIGJlZW4gY29waWVkIGJ5IHRoZSBjYWxsIGJlZm9yZS4KKwkgICAgICogd2UganVtcCBvdmVyIHRoZSBjb3B5IHBhcnQuLi4gCisJICAgICAqLworCX0KKyAgICB9CisgICAgaWYgKGF0dHIgPT0gLTEpIHsKKyAgICAJY2hhcgkqczsKKworCUdldFRlbXBGaWxlTmFtZTMyQShkZXN0ZGlyLCJ2ZXIiLDAsdG1wZm4pOyAvKiBzaG91bGQgbm90IGZhaWwgLi4uICovCisJcz1zdHJyY2hyKHRtcGZuLCdcXCcpOworCWlmIChzKQorCSAgICB0bXBsYXN0ID0gcy10bXBmbjsKKwllbHNlCisJICAgIHRtcGxhc3QgPSAwOworCWhmZHN0ID0gT3BlbkZpbGUzMih0bXBmbiwmb2ZzLE9GX0NSRUFURSk7CisJaWYgKGhmZHN0ID09IEhGSUxFX0VSUk9SMzIpIHsKKwkgICAgTFpDbG9zZTMyKGhmc3JjKTsKKwkgICAgcmV0dXJuIFZJRl9DQU5OT1RDUkVBVEU7IC8qIHwgdHJhbnNsYXRlZCBkb3MgZXJyb3IgKi8KKwl9CisJcmV0ID0gTFpDb3B5MzIoaGZzcmMsaGZkc3QpOworCV9sY2xvc2UzMihoZmRzdCk7CisJaWYgKHJldDwwKSB7CisJICAgIC8qIHRyYW5zbGF0ZSBMWiBlcnJvcnMgaW50byBWSUZfeHh4ICovCisJICAgIHN3aXRjaCAocmV0KSB7CisJICAgIGNhc2UgTFpFUlJPUl9CQURJTkhBTkRMRToKKwkgICAgY2FzZSBMWkVSUk9SX1JFQUQ6CisJICAgIGNhc2UgTFpFUlJPUl9CQURWQUxVRToKKwkgICAgY2FzZSBMWkVSUk9SX1VOS05PV05BTEc6CisJCXJldCA9IFZJRl9DQU5OT1RSRUFEU1JDOworCQlicmVhazsKKwkgICAgY2FzZSBMWkVSUk9SX0JBRE9VVEhBTkRMRToKKwkgICAgY2FzZSBMWkVSUk9SX1dSSVRFOgorCQlyZXQgPSBWSUZfT1VUT0ZNRU1PUlk7IC8qIEZJWE1FOiBjb3JyZWN0PyAqLworCQlicmVhazsKKwkgICAgY2FzZSBMWkVSUk9SX0dMT0JBTExPQzoKKwkgICAgY2FzZSBMWkVSUk9SX0dMT0JMT0NLOgorCQlyZXQgPSBWSUZfT1VUT0ZTUEFDRTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6IC8qIHVua25vd24gZXJyb3IsIHNob3VsZCBub3QgaGFwcGVuICovCisJCXJldCA9IDA7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChyZXQpIHsKKwkJTFpDbG9zZTMyKGhmc3JjKTsKKwkJcmV0dXJuIHJldDsKKwkgICAgfQorCX0KKyAgICB9CisgICAgeHJldCA9IDA7CisgICAgaWYgKCEoZmxhZ3MgJiBWSUZGX0ZPUkNFSU5TVEFMTCkpIHsKKyAgICAJYnVmMSA9IF9mZXRjaF92ZXJzaW9uaW5mbyhkZXN0Zm4pOworCWlmIChidWYxKSB7CisJICAgIGJ1ZjIgPSBfZmV0Y2hfdmVyc2lvbmluZm8odG1wZm4pOworCSAgICBpZiAoIWJ1ZjIpIHsKKwkgICAgCWNoYXIJKnRidWYxLCp0YnVmMjsKKwkJVlNfRklYRURGSUxFSU5GTyAqZGVzdHZmZmksKnRtcHZmZmk7CisJCVVJTlQzMglsZW4xLGxlbjI7CisKKwkJZGVzdHZmZmk9IChWU19GSVhFREZJTEVJTkZPKikoYnVmMSsweDE0KTsKKwkJdG1wdmZmaSA9IChWU19GSVhFREZJTEVJTkZPKikoYnVmMisweDE0KTsKKwkJbGVuMT1sZW4yPTQwOworCisJCS8qIGNvbXBhcmUgZmlsZSB2ZXJzaW9ucyAqLworCQlpZiAoKGRlc3R2ZmZpLT5kd0ZpbGVWZXJzaW9uTVMgPiB0bXB2ZmZpLT5kd0ZpbGVWZXJzaW9uTVMpfHwKKwkJICAgICgoZGVzdHZmZmktPmR3RmlsZVZlcnNpb25NUz09dG1wdmZmaS0+ZHdGaWxlVmVyc2lvbk1TKSYmCisJCSAgICAgKGRlc3R2ZmZpLT5kd0ZpbGVWZXJzaW9uTFMgPiB0bXB2ZmZpLT5kd0ZpbGVWZXJzaW9uTFMpCisJCSAgICApCisJCSkKKwkJICAgIHhyZXQgfD0gVklGX01JU01BVENIfFZJRl9TUkNPTEQ7CisJCS8qIGNvbXBhcmUgZmlsZXR5cGVzIGFuZCBmaWxlc3VidHlwZXMgKi8KKwkJaWYgKChkZXN0dmZmaS0+ZHdGaWxlVHlwZSE9dG1wdmZmaS0+ZHdGaWxlVHlwZSkgfHwKKwkJICAgIChkZXN0dmZmaS0+ZHdGaWxlU3VidHlwZSE9dG1wdmZmaS0+ZHdGaWxlU3VidHlwZSkKKwkJKQorCQkgICAgeHJldCB8PSBWSUZfTUlTTUFUQ0h8VklGX0RJRkZUWVBFOworCQlpZiAoVmVyUXVlcnlWYWx1ZTMyQShidWYxLCJcXFZhckZpbGVJbmZvXFxUcmFuc2xhdGlvbiIsKExQVk9JRCopJnRidWYxLCZsZW4xKSAmJgorCQkgICAgVmVyUXVlcnlWYWx1ZTMyQShidWYyLCJcXFZhckZpbGVJbmZvXFxUcmFuc2xhdGlvbiIsKExQVk9JRCopJnRidWYyLCZsZW4yKQorCQkpIHsKKwkJICAgIC8qIGlyZ2VuZHdhcyBtaXQgdGJ1ZjEgdW5kIHRidWYyIG1hY2hlbiAKKwkJICAgICAqIGdlbmVyaWVydCBESUZGTEFOR3xNSVNNQVRDSAorCQkgICAgICovCisJCX0KKwkJZnJlZShidWYyKTsKKwkgICAgfSBlbHNlCisJCXhyZXQ9VklGX01JU01BVENIfFZJRl9TUkNPTEQ7CisJICAgIGZyZWUoYnVmMSk7CisJfQorICAgIH0KKyAgICBpZiAoeHJldCkgeworCWlmICgqdG1wZmlsZWxlbjxzdHJsZW4odG1wZm4rdG1wbGFzdCkpIHsKKwkgICAgeHJldHw9VklGX0JVRlRPU01BTEw7CisJICAgIERlbGV0ZUZpbGUzMkEodG1wZm4pOworCX0gZWxzZSB7CisJICAgIHN0cmNweSh0bXBmaWxlLHRtcGZuK3RtcGxhc3QpOworCSAgICAqdG1wZmlsZWxlbiA9IHN0cmxlbih0bXBmbit0bXBsYXN0KSsxOworCSAgICB4cmV0fD1WSUZfVEVNUEZJTEU7CisJfQorICAgIH0gZWxzZSB7CisgICAgCWlmICgtMSE9R2V0RmlsZUF0dHJpYnV0ZXMzMkEoZGVzdGZuKSkKKwkgICAgaWYgKCFEZWxldGVGaWxlMzJBKGRlc3RmbikpIHsKKwkJeHJldHw9X2Vycm9yMnZpZihHZXRMYXN0RXJyb3IoKSl8VklGX0NBTk5PVERFTEVURTsKKwkJRGVsZXRlRmlsZTMyQSh0bXBmbik7CisJCUxaQ2xvc2UzMihoZnNyYyk7CisJCXJldHVybiB4cmV0OworCSAgICB9CisJaWYgKCghKGZsYWdzICYgVklGRl9ET05UREVMRVRFT0xEKSkJJiYgCisJICAgIGN1cmRpcgkJCQkmJiAKKwkgICAgKmN1cmRpcgkJCQkmJgorCSAgICBsc3RyY21waTMyQShjdXJkaXIsZGVzdGRpcikKKwkpIHsKKwkgICAgY2hhciBjdXJmblsyNjBdOworCisJICAgIHNwcmludGYoY3VyZm4sIiVzXFwlcyIsY3VyZGlyLGRlc3RmaWxlbmFtZSk7CisJICAgIGlmICgtMSE9R2V0RmlsZUF0dHJpYnV0ZXMzMkEoY3VyZm4pKSB7CisJCS8qIEZJWE1FOiBjaGVjayBpZiBpbiB1c2UgLi4uIGlmIGl0IGlzLCBWSUZfQ0FOTk9UREVMRVRFQ1VSICovCisJCWlmICghRGVsZXRlRmlsZTMyQShjdXJmbikpCisJICAgIAkgICAgeHJldHw9X2Vycm9yMnZpZihHZXRMYXN0RXJyb3IoKSl8VklGX0NBTk5PVERFTEVURUNVUjsKKwkgICAgfQorCX0KKwlpZiAoIU1vdmVGaWxlMzJBKHRtcGZuLGRlc3RmbikpIHsKKwkgICAgeHJldHw9X2Vycm9yMnZpZihHZXRMYXN0RXJyb3IoKSl8VklGX0NBTk5PVFJFTkFNRTsKKwkgICAgRGVsZXRlRmlsZTMyQSh0bXBmbik7CisJfQorICAgIH0KKyAgICBMWkNsb3NlMzIoaGZzcmMpOworICAgIHJldHVybiB4cmV0OworfQorCisvKiBWZXJJbnN0YWxsRmlsZVcJCQkJW1ZFUlNJT04uOF0gKi8KIERXT1JECiBWZXJJbnN0YWxsRmlsZTMyVygKIAlVSU5UMzIgZmxhZ3MsTFBDV1NUUiBzcmNmaWxlbmFtZSxMUENXU1RSIGRlc3RmaWxlbmFtZSxMUENXU1RSIHNyY2RpciwKLQlMUENXU1RSIGRlc3RkaXIsTFBXU1RSIHRtcGZpbGUsVUlOVDMyICp0bXBmaWxlbGVuICkKKwlMUENXU1RSIGRlc3RkaXIsTFBDV1NUUiBjdXJkaXIsTFBXU1RSIHRtcGZpbGUsVUlOVDMyICp0bXBmaWxlbGVuICkKIHsKLSAgICBMUFNUUiB3c3JjZix3c3JjZCx3ZGVzdGYsd2Rlc3RkLHd0bXBmOworICAgIExQU1RSIHdzcmNmLHdzcmNkLHdkZXN0Zix3ZGVzdGQsd3RtcGYsd2N1cmQ7CiAgICAgRFdPUkQgcmV0OwogCiAgICAgd3NyY2YgID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNmaWxlbmFtZSApOwpAQCAtNDgwLDE4ICs2NjUsMjMgQEAKICAgICB3ZGVzdGYgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGRlc3RmaWxlbmFtZSApOwogICAgIHdkZXN0ZCA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGVzdGRpciApOwogICAgIHd0bXBmICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdG1wZmlsZSApOwotICAgIHJldCA9IFZlckluc3RhbGxGaWxlMzJBKGZsYWdzLHdzcmNmLHdkZXN0Zix3c3JjZCx3ZGVzdGQsd3RtcGYsdG1wZmlsZWxlbik7CisgICAgd2N1cmQgID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjdXJkaXIgKTsKKyAgICByZXQgPSBWZXJJbnN0YWxsRmlsZTMyQShmbGFncyx3c3JjZix3ZGVzdGYsd3NyY2Qsd2Rlc3RkLHdjdXJkLHd0bXBmLHRtcGZpbGVsZW4pOworICAgIGlmICghcmV0KQorICAgIAlsc3RyY3B5bkF0b1codG1wZmlsZSx3dG1wZiwqdG1wZmlsZWxlbik7CiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHdzcmNmICk7CiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHdzcmNkICk7CiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHdkZXN0ZiApOwogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB3ZGVzdGQgKTsKICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd3RtcGYgKTsKKyAgICBpZiAod2N1cmQpIAorICAgIAlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd2N1cmQgKTsKICAgICByZXR1cm4gcmV0OwogfQogCiAvKiBGSVhNRTogVGhpcyB0YWJsZSBzaG91bGQsIG9mIGNvdXJzZSwgYmUgbGFuZ3VhZ2UgZGVwZW5kZW5kICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1hcF9pZDJzdHIgewotCVVJTlQJbGFuZ2lkOworCVVJTlQxNglsYW5naWQ7CiAJY29uc3QgY2hhciAqbGFuZ25hbWU7CiB9IGxhbmd1YWdlc1tdPXsKIAl7MHgwNDAxLCJBcmFiaXNjaCJ9LApkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrLmMgYi9taXNjL3dpbnNvY2suYwppbmRleCA1YWNhZGNkLi4zMzZjM2ZjIDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2suYworKysgYi9taXNjL3dpbnNvY2suYwpAQCAtMTYsNiArMTYsOSBAQAogI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KICNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CiAjZW5kaWYKKyNpZiBkZWZpbmVkKF9fRU1YX18pCisjaW5jbHVkZSA8c3lzL3NvX2lvY3RsLmg+CisjZW5kaWYKICNpbmNsdWRlIDxzeXMvbXNnLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CmRpZmYgLS1naXQgYS9tc2Rvcy9kb3NtZW0uYyBiL21zZG9zL2Rvc21lbS5jCmluZGV4IDU1MDc4YWYuLmFhODQ1OTMgMTAwNjQ0Ci0tLSBhL21zZG9zL2Rvc21lbS5jCisrKyBiL21zZG9zL2Rvc21lbS5jCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgKiB0aGlzIGZlZWxzIG1vcmUgbGlrZSBhIGhhY2sgdG8gbWUgdGhhbiB0aGlzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMuCiAgICAgICogSWYgeW91IGZpbmQgYW5vdGhlciwgYmV0dGVyLCBtZXRob2QsIGp1c3QgY2hhbmdlIGl0LiAtTWFyY3VzIE1laXNzbmVyCiAgICAgICovCi0gICAgRE9TTUVNX2Rvc21lbSA9IFZpcnR1YWxBbGxvYyhOVUxMLDB4MTAwMDAwMCxNRU1fQ09NTUlULFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworICAgIERPU01FTV9kb3NtZW0gPSBWaXJ0dWFsQWxsb2MoTlVMTCwweDEwMDAwMCxNRU1fQ09NTUlULFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOwogICAgIGlmICghRE9TTUVNX2Rvc21lbSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBET1MgbWVtb3J5LlxuIiApOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IDZjYjYyMGMuLmJmZTA1ODggMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTgyNywxMSArODI3LDEwIEBACiAqLwogVUlOVCBtY2lHZXREZXZpY2VJRCAoTFBDU1RSIGxwc3RyTmFtZSkKIHsKLQljaGFyCXN0clsxMjhdOwotCWRwcmludGZfbWNpKHN0ZGRlYiwgIm1jaUdldERldmljZUlEKCVzKVxuIiwgbHBzdHJOYW1lKTsKLQlpZiAobHBzdHJOYW1lICYmICFsc3RyY21waTMyQShscHN0ck5hbWUsICJBTEwiKSkKLSAgICAgICAgICAgIHJldHVybiBNQ0lfQUxMX0RFVklDRV9JRDsKLQlyZXR1cm4gMDsKKyAgICBkcHJpbnRmX21jaShzdGRkZWIsICJtY2lHZXREZXZpY2VJRCglcylcbiIsIGxwc3RyTmFtZSk7CisgICAgaWYgKGxwc3RyTmFtZSAmJiAhbHN0cmNtcGkzMkEobHBzdHJOYW1lLCAiQUxMIikpCisgICAgICAgIHJldHVybiBNQ0lfQUxMX0RFVklDRV9JRDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9vYmplY3RzL2N1cnNvcmljb24uYyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCmluZGV4IDBlZTg2NTcuLjQ2YTU0MDUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY3Vyc29yaWNvbi5jCisrKyBiL29iamVjdHMvY3Vyc29yaWNvbi5jCkBAIC04NDIsMTIgKzg0MiwxMiBAQAogICAgIGVsc2UKICAgICB7CiAgICAgICAgIC8qIFNldCB0aGUgc2FtZSBjdXJzb3IgZm9yIGFsbCB0b3AtbGV2ZWwgd2luZG93cyAqLwotICAgICAgICBIV05EIGh3bmQgPSBHZXRXaW5kb3coIEdldERlc2t0b3BXaW5kb3czMigpLCBHV19DSElMRCApOworICAgICAgICBIV05EIGh3bmQgPSBHZXRXaW5kb3czMiggR2V0RGVza3RvcFdpbmRvdzMyKCksIEdXX0NISUxEICk7CiAgICAgICAgIHdoaWxlKGh3bmQpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdpbmRvdyB3aW4gPSBXSU5fR2V0WFdpbmRvdyggaHduZCApOwogICAgICAgICAgICAgaWYgKHdpbikgWERlZmluZUN1cnNvciggZGlzcGxheSwgd2luLCBjdXJzb3IgKTsKLSAgICAgICAgICAgIGh3bmQgPSBHZXRXaW5kb3coIGh3bmQsIEdXX0hXTkRORVhUICk7CisgICAgICAgICAgICBod25kID0gR2V0V2luZG93MzIoIGh3bmQsIEdXX0hXTkRORVhUICk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDA3Yjk1YTYuLjI0ODllNGQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0xMDI3LDc3ICsxMDI3LDkgQEAKICAqLwogQk9PTDE2IEdldFRleHRNZXRyaWNzMTYoIEhEQzE2IGhkYywgVEVYVE1FVFJJQzE2ICptZXRyaWNzICkKIHsKLSAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSByZXR1cm4gRkFMU0U7Ci0gICAgbWVtY3B5KCBtZXRyaWNzLCAmZGMtPnUueC5mb250Lm1ldHJpY3MsIHNpemVvZigqbWV0cmljcykgKTsKLQotICAgIG1ldHJpY3MtPnRtQXNjZW50ICA9IGFicyggbWV0cmljcy0+dG1Bc2NlbnQKLQkJCSAgICAgICogZGMtPnduZEV4dFkgLyBkYy0+dnBvcnRFeHRZICk7Ci0gICAgbWV0cmljcy0+dG1EZXNjZW50ID0gYWJzKCBtZXRyaWNzLT50bURlc2NlbnQKLQkJCSAgICAgICogZGMtPnduZEV4dFkgLyBkYy0+dnBvcnRFeHRZICk7Ci0gICAgbWV0cmljcy0+dG1IZWlnaHQgID0gbWV0cmljcy0+dG1Bc2NlbnQgKyBtZXRyaWNzLT50bURlc2NlbnQ7Ci0gICAgbWV0cmljcy0+dG1JbnRlcm5hbExlYWRpbmcgPSBhYnMoIG1ldHJpY3MtPnRtSW50ZXJuYWxMZWFkaW5nCi0JCQkJICAgICAgKiBkYy0+d25kRXh0WSAvIGRjLT52cG9ydEV4dFkgKTsKLSAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZyA9IGFicyggbWV0cmljcy0+dG1FeHRlcm5hbExlYWRpbmcKLQkJCQkgICAgICAqIGRjLT53bmRFeHRZIC8gZGMtPnZwb3J0RXh0WSApOwotICAgIG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoICAgID0gYWJzKCBtZXRyaWNzLT50bU1heENoYXJXaWR0aCAKLQkJCQkgICAgICAqIGRjLT53bmRFeHRYIC8gZGMtPnZwb3J0RXh0WCApOwotICAgIG1ldHJpY3MtPnRtQXZlQ2hhcldpZHRoICAgID0gYWJzKCBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aAotCQkJCSAgICAgICogZGMtPnduZEV4dFggLyBkYy0+dnBvcnRFeHRYICk7Ci0KLSAgICBkcHJpbnRmX2ZvbnQoc3RkbmltcCwidGV4dCBtZXRyaWNzOlxuCi0JSW50ZXJuYWxMZWFkaW5nID0gJWkKLQlFeHRlcm5hbExlYWRpbmcgPSAlaQotCU1heENoYXJXaWR0aCA9ICVpCi0JV2VpZ2h0ID0gJWkKLQlJdGFsaWMgPSAlaQotCVVuZGVybGluZWQgPSAlaQotCVN0cnVja091dCA9ICVpCi0JRmlyc3RDaGFyID0gJWkKLQlMYXN0Q2hhciA9ICVpCi0JRGVmYXVsdENoYXIgPSAlaQotCUJyZWFrQ2hhciA9ICVpCi0JQ2hhclNldCA9ICVpCi0JT3ZlcmhhbmcgPSAlaQotCURpZ2l0aXplZEFzcGVjdFggPSAlaQotCURpZ2l0aXplZEFzcGVjdFkgPSAlaQotCUF2ZUNoYXJXaWR0aCA9ICVpCi0JTWF4Q2hhcldpZHRoID0gJWkKLQlBc2NlbnQgPSAlaQotCURlc2NlbnQgPSAlaQotCUhlaWdodCA9ICVpXG4iLAotICAgIG1ldHJpY3MtPnRtSW50ZXJuYWxMZWFkaW5nLAotICAgIG1ldHJpY3MtPnRtRXh0ZXJuYWxMZWFkaW5nLAotICAgIG1ldHJpY3MtPnRtTWF4Q2hhcldpZHRoLAotICAgIG1ldHJpY3MtPnRtV2VpZ2h0LAotICAgIG1ldHJpY3MtPnRtSXRhbGljLAotICAgIG1ldHJpY3MtPnRtVW5kZXJsaW5lZCwKLSAgICBtZXRyaWNzLT50bVN0cnVja091dCwKLSAgICBtZXRyaWNzLT50bUZpcnN0Q2hhciwKLSAgICBtZXRyaWNzLT50bUxhc3RDaGFyLAotICAgIG1ldHJpY3MtPnRtRGVmYXVsdENoYXIsCi0gICAgbWV0cmljcy0+dG1CcmVha0NoYXIsCi0gICAgbWV0cmljcy0+dG1DaGFyU2V0LAotICAgIG1ldHJpY3MtPnRtT3ZlcmhhbmcsCi0gICAgbWV0cmljcy0+dG1EaWdpdGl6ZWRBc3BlY3RYLAotICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WSwKLSAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCwKLSAgICBtZXRyaWNzLT50bU1heENoYXJXaWR0aCwKLSAgICBtZXRyaWNzLT50bUFzY2VudCwKLSAgICBtZXRyaWNzLT50bURlc2NlbnQsCi0gICAgbWV0cmljcy0+dG1IZWlnaHQpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0VGV4dE1ldHJpY3MzMkEgICAgKEdESTMyLjIzNikKLSAqLwotQk9PTDMyIEdldFRleHRNZXRyaWNzMzJBKCBIREMzMiBoZGMsIFRFWFRNRVRSSUMzMkEgKm1ldHJpY3MgKQotewotICAgIFRFWFRNRVRSSUMxNiB0bTsKLSAgICBpZiAoIUdldFRleHRNZXRyaWNzMTYoIChIREMxNiloZGMsICZ0bSApKSByZXR1cm4gRkFMU0U7CisgICAgVEVYVE1FVFJJQzMyQSB0bTsKKyAgICAKKyAgICBpZiAoIUdldFRleHRNZXRyaWNzMzJBKCAoSERDMzIpaGRjLCAmdG0gKSkgcmV0dXJuIEZBTFNFOwogICAgIG1ldHJpY3MtPnRtSGVpZ2h0ICAgICAgICAgICA9IHRtLnRtSGVpZ2h0OwogICAgIG1ldHJpY3MtPnRtQXNjZW50ICAgICAgICAgICA9IHRtLnRtQXNjZW50OwogICAgIG1ldHJpY3MtPnRtRGVzY2VudCAgICAgICAgICA9IHRtLnRtRGVzY2VudDsKQEAgLTExMjMsMTIgKzEwNTUsNzIgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRUZXh0TWV0cmljczMyQSAgICAoR0RJMzIuMjM2KQorICovCitCT09MMzIgR2V0VGV4dE1ldHJpY3MzMkEoIEhEQzMyIGhkYywgVEVYVE1FVFJJQzMyQSAqbWV0cmljcyApCit7CitEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpZiAoIWRjKQorICAgIHsKKwlpZiAoIShkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKSkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKCFkYy0+ZnVuY3MtPnBHZXRUZXh0TWV0cmljcyB8fAorICAgICAgICAhZGMtPmZ1bmNzLT5wR2V0VGV4dE1ldHJpY3MoIGRjLG1ldHJpY3MgKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGRwcmludGZfZm9udChzdGRuaW1wLCJ0ZXh0IG1ldHJpY3M6XG4KKwlJbnRlcm5hbExlYWRpbmcgPSAlaQorCUV4dGVybmFsTGVhZGluZyA9ICVpCisJTWF4Q2hhcldpZHRoID0gJWkKKwlXZWlnaHQgPSAlaQorCUl0YWxpYyA9ICVpCisJVW5kZXJsaW5lZCA9ICVpCisJU3RydWNrT3V0ID0gJWkKKwlGaXJzdENoYXIgPSAlaQorCUxhc3RDaGFyID0gJWkKKwlEZWZhdWx0Q2hhciA9ICVpCisJQnJlYWtDaGFyID0gJWkKKwlDaGFyU2V0ID0gJWkKKwlPdmVyaGFuZyA9ICVpCisJRGlnaXRpemVkQXNwZWN0WCA9ICVpCisJRGlnaXRpemVkQXNwZWN0WSA9ICVpCisJQXZlQ2hhcldpZHRoID0gJWkKKwlNYXhDaGFyV2lkdGggPSAlaQorCUFzY2VudCA9ICVpCisJRGVzY2VudCA9ICVpCisJSGVpZ2h0ID0gJWlcbiIsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtSW50ZXJuYWxMZWFkaW5nLAorICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUV4dGVybmFsTGVhZGluZywKKyAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1NYXhDaGFyV2lkdGgsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtV2VpZ2h0LAorICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUl0YWxpYywKKyAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1VbmRlcmxpbmVkLAorICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bVN0cnVja091dCwKKyAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1GaXJzdENoYXIsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtTGFzdENoYXIsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtRGVmYXVsdENoYXIsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtQnJlYWtDaGFyLAorICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUNoYXJTZXQsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtT3ZlcmhhbmcsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtRGlnaXRpemVkQXNwZWN0WCwKKyAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1EaWdpdGl6ZWRBc3BlY3RZLAorICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bUF2ZUNoYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgbWV0cmljcy0+dG1NYXhDaGFyV2lkdGgsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtQXNjZW50LAorICAgICAgICAgICAgICAgICBtZXRyaWNzLT50bURlc2NlbnQsCisgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnRtSGVpZ2h0KTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRUZXh0TWV0cmljczMyVyAgICAoR0RJMzIuMjM3KQogICovCiBCT09MMzIgR2V0VGV4dE1ldHJpY3MzMlcoIEhEQzMyIGhkYywgVEVYVE1FVFJJQzMyVyAqbWV0cmljcyApCiB7Ci0gICAgVEVYVE1FVFJJQzE2IHRtOwotICAgIGlmICghR2V0VGV4dE1ldHJpY3MxNiggKEhEQzE2KWhkYywgJnRtICkpIHJldHVybiBGQUxTRTsKKyAgICBURVhUTUVUUklDMzJBIHRtOworICAgIGlmICghR2V0VGV4dE1ldHJpY3MzMkEoIChIREMxNiloZGMsICZ0bSApKSByZXR1cm4gRkFMU0U7CiAgICAgbWV0cmljcy0+dG1IZWlnaHQgICAgICAgICAgID0gdG0udG1IZWlnaHQ7CiAgICAgbWV0cmljcy0+dG1Bc2NlbnQgICAgICAgICAgID0gdG0udG1Bc2NlbnQ7CiAgICAgbWV0cmljcy0+dG1EZXNjZW50ICAgICAgICAgID0gdG0udG1EZXNjZW50OwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wYWxldHRlLmMgYi9vYmplY3RzL3BhbGV0dGUuYwppbmRleCA3YTY3NTcxLi41MzA4OWE5IDEwMDY0NAotLS0gYS9vYmplY3RzL3BhbGV0dGUuYworKysgYi9vYmplY3RzL3BhbGV0dGUuYwpAQCAtNDE2LDExICs0MTYsMTEgQEAKICAgICBpZiggaFBhbCAhPSBTVE9DS19ERUZBVUxUX1BBTEVUVEUgKQogICAgIHsKIAlIV05EMzIgaFduZCA9IFdpbmRvd0Zyb21EQzMyKCBoREMgKTsKLQlIV05EMzIgaEFjdGl2ZSA9IEdldEFjdGl2ZVdpbmRvdygpOworCUhXTkQzMiBoQWN0aXZlID0gR2V0QWN0aXZlV2luZG93MzIoKTsKIAkKIAkvKiBzZXQgcHJpbWFyeSBwYWxldHRlIGlmIGl0J3MgcmVsYXRlZCB0byBjdXJyZW50IGFjdGl2ZSAqLwogCi0JaWYoKCFoV25kIHx8IChoQWN0aXZlID09IGhXbmQgfHwgSXNDaGlsZChoQWN0aXZlLGhXbmQpKSkgJiYKKwlpZigoIWhXbmQgfHwgKGhBY3RpdmUgPT0gaFduZCB8fCBJc0NoaWxkMTYoaEFjdGl2ZSxoV25kKSkpICYmCiAgICAgICAgICAgICAhYkZvcmNlQmFja2dyb3VuZCApCiAJICAgIHdCa2dQYWxldHRlID0gMDsKICAgICB9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYyBiL3Byb2dyYW1zL3dpbmhlbHAvd2luaGVscC5jCmluZGV4IGZmMDAzZDUuLmVjOTQzNmEgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbmhlbHAvd2luaGVscC5jCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvd2luaGVscC5jCkBAIC0zMDYsNyArMzA2LDkgQEAKIAogCSAgV0lOSEVMUF9Jbml0Rm9udHMod2luLT5oTWFpblduZCk7CiAKLQkgIFNldFdpbmRvd1RleHQod2luLT5oTWFpblduZCwgcGFnZS0+ZmlsZS0+bHBzelRpdGxlKTsKKwkgIGlmIChwYWdlKSB7CisJICAgIFNldFdpbmRvd1RleHQod2luLT5oTWFpblduZCwgcGFnZS0+ZmlsZS0+bHBzelRpdGxlKTsKKyAgICAgICAgICB9CiAKIAkgIFdJTkhFTFBfU2V0dXBUZXh0KHdpbi0+aFRleHRXbmQpOwogCSAgSW52YWxpZGF0ZVJlY3Qod2luLT5oVGV4dFduZCwgTlVMTCwgVFJVRSk7CmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvVE9ETyBiL3Jlc291cmNlcy9UT0RPCmluZGV4IDY0MWQ1MzkuLjMzZjlkYzQgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9UT0RPCisrKyBiL3Jlc291cmNlcy9UT0RPCkBAIC03MiwzICs3MiwyNiBAQAogQWxicmVjaHQgS2xlaW5lCiBrbGVpbmVAYWsuc2F4LmRlCiAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisxOTk3LCBKYW51YXJ5CisKK1N1YmplY3Q6IEVESVRNRU5VCisKK1RoZXJlIG5vdyBpcyBhIHJlc291cmNlIEVESVRNRU5VLiAgSXQgaXMgdGhlIG1lbnUgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiB5b3UKK2NsaWNrIHRoZSByaWdodCBtb3VzZSBidXR0b24gd2l0aGluIGFuIGVkaXQgY29udHJvbC4gIEkgaW5jbHVkZWQgYW4gRW5nbGlzaAordmVyc2lvbiBpbiBhbGwgc3lzcmVzXz8/LnJjIGZpbGVzLCB3aGljaCBuZWVkcyB0cmFuc2xhdGlvbiBpbiB5b3VyIGxhbmd1YWdlLgorVGhpcyBoYXMgbm93IGJlZW4gZG9uZSBmb3I6CisKKyogRW5nbGlzaAorLi4uLi4KKworTm90ZTogSSBwaWNrZWQgdGhlIElEcyBvZiB0aGUgbWVudWl0ZW1zICJhdCByYW5kb20iLiAgV2hlbiBzb21lb25lIHdhbnRzIHRvCitmaW5kIG91dCB0aGUgInJlYWwiICh3aW45NSkgdmFsdWVzLCBmZWVsIGZyZWUgdG8gY2hhbmdlIHRoZW0uICBIb3dldmVyLCB5b3UKK3Nob3VsZCBjaGFuZ2UgX2FsbF8gc3lzcmVzXz8/LnJjIGZpbGVzIGFuZCBzdWJzZXF1ZW50bHkgdGhlIGZ1bmN0aW9uCitFRElUX1dNX0NvbW1hbmQoKSBpbiBjb250cm9scy9lZGl0LmMuICBUaGlzIGlzIGEgbWF0dGVyIG9mIG1pbnV0ZXMgKGkuZS4gbm8KK3Byb2dyYW1taW5nIHNraWxscyByZXF1aXJlZCkuCisKK0J5ZSwKKworRnJhbnMgdmFuIERvcnNzZWxhZXIKK2RvcnNzZWxAcnVsaG0xLkxlaWRlblVuaXYubmwKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfQ3oucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0N6LnJjCmluZGV4IDlkZGJjMWMuLmRiMTk2YjAgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfQ3oucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Dei5yYwpAQCAtMTMsNiArMTMsMjEgQEAKICBNRU5VSVRFTSAiJk8gcHJvZ3JhbXUgV0lORSIsIDYxNzYxCiB9CiAKK0VESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCVBPUFVQICIiCisJQkVHSU4KKwkJTUVOVUlURU0gIiZVbmRvIiwgRU1fVU5ETzMyCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCisJCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiU2VsZWN0ICZBbGwiLCBFTV9TRVRTRUwzMgorCUVORAorfQorCiBNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CiBTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQkVHSU4KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRGEucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0RhLnJjCmluZGV4IDk5NDI1YzUuLmQ0M2E3ZTYgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRGEucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19EYS5yYwpAQCAtMTMsNiArMTMsMjEgQEAKICBNRU5VSVRFTSAiJk9tIFdJTkUgLi4uIiwgNjE3NjEKIH0KIAorRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisJUE9QVVAgIiIKKwlCRUdJTgorCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJDdSZ0IiwgV01fQ1VUCisJCU1FTlVJVEVNICImQ29weSIsIFdNX0NPUFkKKwkJTUVOVUlURU0gIiZQYXN0ZSIsIFdNX1BBU1RFCisJCU1FTlVJVEVNICImRGVsZXRlIiwgV01fQ0xFQVIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJTZWxlY3QgJkFsbCIsIEVNX1NFVFNFTDMyCisJRU5ECit9CisKIE1TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKIFNUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBCRUdJTgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19EZS5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRGUucmMKaW5kZXggMTNlNWMxYS4uYTkyMDhjYyAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19EZS5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0RlLnJjCkBAIC0xMyw2ICsxMywyMSBAQAogIE1FTlVJVEVNICIm3GJlciBXSU5FIC4uLiIsIDYxNzYxCiB9CiAKK0VESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCVBPUFVQICIiCisJQkVHSU4KKwkJTUVOVUlURU0gIiZVbmRvIiwgRU1fVU5ETzMyCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCisJCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiU2VsZWN0ICZBbGwiLCBFTV9TRVRTRUwzMgorCUVORAorfQorCiBNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CiBTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQkVHSU4KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRW4ucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0VuLnJjCmluZGV4IGViZThkYmEuLmI3YjZhZGUgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRW4ucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Fbi5yYwpAQCAtMTMsNiArMTMsMjEgQEAKICBNRU5VSVRFTSAiJkFib3V0IFdJTkUgLi4uIiwgNjE3NjEKIH0KIAorRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisJUE9QVVAgIiIKKwlCRUdJTgorCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJDdSZ0IiwgV01fQ1VUCisJCU1FTlVJVEVNICImQ29weSIsIFdNX0NPUFkKKwkJTUVOVUlURU0gIiZQYXN0ZSIsIFdNX1BBU1RFCisJCU1FTlVJVEVNICImRGVsZXRlIiwgV01fQ0xFQVIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJTZWxlY3QgJkFsbCIsIEVNX1NFVFNFTDMyCisJRU5ECit9CisKIE1TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKIFNUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBCRUdJTgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19Fby5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRW8ucmMKaW5kZXggYmIzZDdkMC4uYTVkNWIzMWUgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRW8ucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Fby5yYwpAQCAtMTMsNiArMTMsMjEgQEAKICBNRU5VSVRFTSAiJlByaSBXSU5FIC4uLiIsIDYxNzYxCiB9CiAKK0VESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCVBPUFVQICIiCisJQkVHSU4KKwkJTUVOVUlURU0gIiZVbmRvIiwgRU1fVU5ETzMyCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCisJCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiU2VsZWN0ICZBbGwiLCBFTV9TRVRTRUwzMgorCUVORAorfQorCiBNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CiBTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQkVHSU4KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRXMucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0VzLnJjCmluZGV4IDczODA4OTQuLmUzYjNkYWMgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRXMucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Fcy5yYwpAQCAtMTQsNiArMTQsMjEgQEAKICBNRU5VSVRFTSAiJkFjZXJjYSBkZSBXSU5FLi4uIiwgNjE3NjEKIH0KIAorRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisJUE9QVVAgIiIKKwlCRUdJTgorCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJDdSZ0IiwgV01fQ1VUCisJCU1FTlVJVEVNICImQ29weSIsIFdNX0NPUFkKKwkJTUVOVUlURU0gIiZQYXN0ZSIsIFdNX1BBU1RFCisJCU1FTlVJVEVNICImRGVsZXRlIiwgV01fQ0xFQVIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJTZWxlY3QgJkFsbCIsIEVNX1NFVFNFTDMyCisJRU5ECit9CisKIE1TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKIFNUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBCRUdJTgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19GaS5yYyBiL3Jlc291cmNlcy9zeXNyZXNfRmkucmMKaW5kZXggMmRjM2FmZi4uNTlmYTE3MSAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19GaS5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0ZpLnJjCkBAIC0xMyw2ICsxMywyMSBAQAogIE1FTlVJVEVNICImVGlldG9qYSBXSU5FaXN0YS4uLiIsIDYxNzYxCiB9CiAKK0VESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCVBPUFVQICIiCisJQkVHSU4KKwkJTUVOVUlURU0gIiZVbmRvIiwgRU1fVU5ETzMyCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCisJCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiU2VsZWN0ICZBbGwiLCBFTV9TRVRTRUwzMgorCUVORAorfQorCiBNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CiBTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQkVHSU4KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRnIucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0ZyLnJjCmluZGV4IGE4ODAxZGMuLmM1OGJiYzkgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRnIucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Gci5yYwpAQCAtMTQsNiArMTQsMjEgQEAKICBNRU5VSVRFTSAiQSBwcm9wb3MgZGUgJldpbmUgLi4uIiwgNjE3NjEKIH0KIAorRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCit7CisJUE9QVVAgIiIKKwlCRUdJTgorCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJDdSZ0IiwgV01fQ1VUCisJCU1FTlVJVEVNICImQ29weSIsIFdNX0NPUFkKKwkJTUVOVUlURU0gIiZQYXN0ZSIsIFdNX1BBU1RFCisJCU1FTlVJVEVNICImRGVsZXRlIiwgV01fQ0xFQVIKKwkJTUVOVUlURU0gU0VQQVJBVE9SCisJCU1FTlVJVEVNICJTZWxlY3QgJkFsbCIsIEVNX1NFVFNFTDMyCisJRU5ECit9CisKIE1TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKIFNUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCiBCRUdJTgpkaWZmIC0tZ2l0IGEvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYyBiL3Jlc291cmNlcy9zeXNyZXNfSXQucmMKaW5kZXggODJhOWJiOS4uYWZhNmQwMyAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlc19JdC5yYworKysgYi9yZXNvdXJjZXMvc3lzcmVzX0l0LnJjCkBAIC0xMyw2ICsxMywyMSBAQAogIE1FTlVJVEVNICImSW5mbyBzdSBXSU5FIC4uLiIsIDYxNzYxCiB9CiAKK0VESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCVBPUFVQICIiCisJQkVHSU4KKwkJTUVOVUlURU0gIiZVbmRvIiwgRU1fVU5ETzMyCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCisJCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiU2VsZWN0ICZBbGwiLCBFTV9TRVRTRUwzMgorCUVORAorfQorCiBNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CiBTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQkVHSU4KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfS28ucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0tvLnJjCmluZGV4IDI0ZGZiNGUuLmFiMjZkMDYgMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfS28ucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19Lby5yYwpAQCAtMTMsNiArMTMsMjEgQEAKICBNRU5VSVRFTSAiv83Azr+hILD8x8+/qSAuLi4iLCA2MTc2MQogfQogCitFRElUTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKK3sKKwlQT1BVUCAiIgorCUJFR0lOCisJCU1FTlVJVEVNICImVW5kbyIsIEVNX1VORE8zMgorCQlNRU5VSVRFTSBTRVBBUkFUT1IKKwkJTUVOVUlURU0gIkN1JnQiLCBXTV9DVVQKKwkJTUVOVUlURU0gIiZDb3B5IiwgV01fQ09QWQorCQlNRU5VSVRFTSAiJlBhc3RlIiwgV01fUEFTVEUKKwkJTUVOVUlURU0gIiZEZWxldGUiLCBXTV9DTEVBUgorCQlNRU5VSVRFTSBTRVBBUkFUT1IKKwkJTUVOVUlURU0gIlNlbGVjdCAmQWxsIiwgRU1fU0VUU0VMMzIKKwlFTkQKK30KKwogTVNHQk9YIERJQUxPRyAxMDAsIDgwLCAyMTYsIDE2OAogU1RZTEUgRFNfU1lTTU9EQUwgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKIEJFR0lOCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzX05vLnJjIGIvcmVzb3VyY2VzL3N5c3Jlc19Oby5yYwppbmRleCA0MTkyMTQyLi5lZWQ3ZGZlIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvc3lzcmVzX05vLnJjCisrKyBiL3Jlc291cmNlcy9zeXNyZXNfTm8ucmMKQEAgLTEzLDYgKzEzLDIxIEBACiAgTUVOVUlURU0gIiZPbSBXSU5FIC4uLiIsIDYxNzYxCiB9CiAKK0VESVRNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworCVBPUFVQICIiCisJQkVHSU4KKwkJTUVOVUlURU0gIiZVbmRvIiwgRU1fVU5ETzMyCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAorCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCisJCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNIFNFUEFSQVRPUgorCQlNRU5VSVRFTSAiU2VsZWN0ICZBbGwiLCBFTV9TRVRTRUwzMgorCUVORAorfQorCiBNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CiBTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQogQkVHSU4KZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDg5NGI3M2MuLjg2NmFhZjAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMTMyNSw3ICsxMzI1LDcgQEAKIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKICNpZmRlZiBfX0dOVUNfXwotICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsVG8zMl9MYXJnZVN0YWNrOkYxXCIsMzYsMCwwLENhbGxUbzMyX0xhcmdlU3RhY2tcbiIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsVG8zMl9MYXJnZVN0YWNrOkYxXCIsMzYsMCwwLCIgUFJFRklYICJDYWxsVG8zMl9MYXJnZVN0YWNrXG4iKTsKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ2FsbFRvMzJfTGFyZ2VTdGFja1xuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ2FsbFRvMzJfTGFyZ2VTdGFjazpcbiIgKTsKQEAgLTE2MDQsNyArMTYwNCw3IEBACiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5cdC5hbGlnbiA0XG4iICk7CiAjaWZkZWYgX19HTlVDX18KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiQ2FsbEZyb20xNl8lczpGMVwiLDM2LDAsMCxDYWxsRnJvbTE2XyVzXG4iLCAKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiQ2FsbEZyb20xNl8lczpGMVwiLDM2LDAsMCwiIFBSRUZJWCAiQ2FsbEZyb20xNl8lc1xuIiwgCiAJICAgICBwcm9maWxlLCBwcm9maWxlKTsKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ2FsbEZyb20xNl8lc1xuIiwgcHJvZmlsZSApOwpAQCAtMTgyMyw3ICsxODIzLDcgQEAKIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKICNpZmRlZiBfX0dOVUNfXwotICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsVG8xNl8lczpGMVwiLDM2LDAsMCxDYWxsVG8xNl8lc1xuIiwgCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIkNhbGxUbzE2XyVzOkYxXCIsMzYsMCwwLCIgUFJFRklYICJDYWxsVG8xNl8lc1xuIiwgCiAJICAgICBwcm9maWxlLCBwcm9maWxlKTsKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ2FsbFRvMTZfJXNcbiIsIHByb2ZpbGUgKTsKQEAgLTIwNzMsMTMgKzIwNzMsMTUgQEAKIHsKICAgICAvKiBSZXN0b3JlIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAqLwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bGVhbCAlZCglJWVicCksJSVlc3BcbiIsIC1zaXplb2YoQ09OVEVYVCktMTIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRsZWFsICVkKCUlZWJwKSwlJWVzcFxuIiwgLXNpemVvZihDT05URVhUKS04ICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZnJzdG9yICVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChGbG9hdFNhdmUpICk7CiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVheFxuIiwgQ09OVEVYVE9GRlNFVChFaXApICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCw0KCUlZWJwKVxuIiApOyAvKiAlZWlwIGF0IHRpbWUgb2YgY2FsbCAqLwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlZWF4XG4iLCBDT05URVhUT0ZGU0VUKEVicCkgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LDAoJSVlYnApXG4iICk7IC8qICVlYnAgYXQgdGltZSBvZiBjYWxsICovCisKKyAgICAvKiBTdG9yZSBmbGFncyBvdmVyIHRoZSByZWxheSBhZGRyICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoRUZsYWdzKSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYXgsJWQoJSVlc3ApXG4iLCBzaXplb2YoQ09OVEVYVCkgKTsKIApAQCAtMjE1Miw3ICsyMTU0LDcgQEAKIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKICNpZmRlZiBfX0dOVUNfXwotICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsRnJvbTMyXyVzOkYxXCIsMzYsMCwwLENhbGxGcm9tMzJfJXNcbiIsIAorICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsRnJvbTMyXyVzOkYxXCIsMzYsMCwwLCIgUFJFRklYICJDYWxsRnJvbTMyXyVzXG4iLCAKIAkgICAgIHByb2ZpbGUsIHByb2ZpbGUpOwogI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDYWxsRnJvbTMyXyVzXG4iLCBwcm9maWxlICk7CkBAIC0yMjQzLDcgKzIyNDUsNyBAQAogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlxuXHQuYWxpZ24gNFxuIiApOwogI2lmZGVmIF9fR05VQ19fCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIkNhbGxUbzMyXyVkOkYxXCIsMzYsMCwwLENhbGxUbzMyXyVkXG4iLCAKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiQ2FsbFRvMzJfJWQ6RjFcIiwzNiwwLDAsIiBQUkVGSVggIkNhbGxUbzMyXyVkXG4iLCAKIAkgICAgIGFyZ3MsIGFyZ3MpOwogI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDYWxsVG8zMl8lZFxuIiwgYXJncyApOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZWRlcC5jIGIvdG9vbHMvbWFrZWRlcC5jCmluZGV4IDE2Mzg5ODcuLjk1MTFmODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21ha2VkZXAuYworKysgYi90b29scy9tYWtlZGVwLmMKQEAgLTI3MSw2ICsyNzEsNyBAQAogICAgICAgICB3aGlsZSAoZmdldHMoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZpbGUgKSkKICAgICAgICAgICAgIGlmICghc3RybmNtcCggYnVmZmVyLCBTZXBhcmF0b3IsIHN0cmxlbihTZXBhcmF0b3IpICkpIGJyZWFrOwogICAgICAgICBmdHJ1bmNhdGUoIGZpbGVubyhmaWxlKSwgZnRlbGwoZmlsZSkgKTsKKyAgICAgICAgZnNlZWsoIGZpbGUsIDBMLCBTRUVLX0VORCApOwogICAgIH0KICAgICBpZiAoIWZpbGUpCiAgICAgewpkaWZmIC0tZ2l0IGEvd2luMzIvdGltZS5jIGIvd2luMzIvdGltZS5jCmluZGV4IGJmYzI2ZWYuLjZiMzhlYjggMTAwNjQ0Ci0tLSBhL3dpbjMyL3RpbWUuYworKysgYi93aW4zMi90aW1lLmMKQEAgLTEyMyw3ICsxMjMsMTEgQEAKICAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAKICAgICB0ei50el9taW51dGVzd2VzdCA9IHR6aW5mby0+QmlhczsKKyNpZmRlZiBfX0VNWF9fIC8qIEZJWE1FICovCisgICAgdHoudHpfZHN0dGltZSA9IDA7CisjZWxzZQogICAgIHR6LnR6X2RzdHRpbWUgPSBEU1RfTk9ORTsKKyNlbmRpZgogICAgIHJldHVybiAhc2V0dGltZW9mZGF5KE5VTEwsICZ0eik7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGNlLmMgYi93aW5kb3dzL2RjZS5jCmluZGV4IDU2ODg5Y2UuLjA4YzA5ZTEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGNlLmMKKysrIGIvd2luZG93cy9kY2UuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAgKiBjbGlwcGVkIGJ5IHRoZSBjbGllbnQgYXJlYSBvZiBhbGwgYW5jZXN0b3JzLCBhbmQgdGhlbiBvcHRpb25hbGx5CiAgKiBieSBzaWJsaW5ncyBhbmQgY2hpbGRyZW4uCiAgKi8KLUhSR04zMiBEQ0VfR2V0VmlzUmduKCBIV05EIGh3bmQsIFdPUkQgZmxhZ3MgKQorSFJHTjMyIERDRV9HZXRWaXNSZ24oIEhXTkQzMiBod25kLCBXT1JEIGZsYWdzICkKIHsKICAgICBSRUNUMTYgcmVjdDsKICAgICBIUkdOMzIgaHJnbjsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmZGxnLmMgYi93aW5kb3dzL2RlZmRsZy5jCmluZGV4IGE0ODA4ZTkuLjBlYzVjNDQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmZGxnLmMKKysrIGIvd2luZG93cy9kZWZkbGcuYwpAQCAtMjEsNyArMjEsNyBAQAogewogICAgIEhXTkQzMiBod25kUHJldiA9IEdldEZvY3VzMzIoKTsKIAotICAgIGlmIChJc0NoaWxkKCBod25kRGxnLCBod25kUHJldiApKQorICAgIGlmIChJc0NoaWxkMzIoIGh3bmREbGcsIGh3bmRQcmV2ICkpCiAgICAgewogICAgICAgICBpZiAoU2VuZE1lc3NhZ2UxNiggaHduZFByZXYsIFdNX0dFVERMR0NPREUsIDAsIDAgKSAmIERMR0NfSEFTU0VUU0VMKQogICAgICAgICAgICAgU2VuZE1lc3NhZ2UxNiggaHduZFByZXYsIEVNX1NFVFNFTDE2LCBUUlVFLCBNQUtFTE9ORyggLTEsIDAgKSApOwpAQCAtMzksNyArMzksNyBAQAogewogICAgIEhXTkQzMiBod25kRm9jdXMgPSBHZXRGb2N1czMyKCk7CiAKLSAgICBpZiAoIWh3bmRGb2N1cyB8fCAhSXNDaGlsZCggaHduZCwgaHduZEZvY3VzICkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIWh3bmRGb2N1cyB8fCAhSXNDaGlsZDMyKCBod25kLCBod25kRm9jdXMgKSkgcmV0dXJuIEZBTFNFOwogICAgIGluZm9QdHItPmh3bmRGb2N1cyA9IGh3bmRGb2N1czsKICAgICAgIC8qIFJlbW92ZSBkZWZhdWx0IGJ1dHRvbiAqLwogICAgIHJldHVybiBUUlVFOwpAQCAtNTEsNyArNTEsNyBAQAogICovCiBzdGF0aWMgQk9PTDMyIERFRkRMR19SZXN0b3JlRm9jdXMoIEhXTkQzMiBod25kLCBESUFMT0dJTkZPICppbmZvUHRyICkKIHsKLSAgICBpZiAoIWluZm9QdHItPmh3bmRGb2N1cyB8fCBJc0ljb25pYyhod25kKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghaW5mb1B0ci0+aHduZEZvY3VzIHx8IElzSWNvbmljMzIoaHduZCkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoIUlzV2luZG93KCBpbmZvUHRyLT5od25kRm9jdXMgKSkgcmV0dXJuIEZBTFNFOwogICAgIERFRkRMR19TZXRGb2N1cyggaHduZCwgaW5mb1B0ci0+aHduZEZvY3VzICk7CiAgICAgaW5mb1B0ci0+aHduZEZvY3VzID0gMDsKQEAgLTY2LDEyICs2NiwxMiBAQAogICovCiBzdGF0aWMgSFdORDMyIERFRkRMR19GaW5kRGVmQnV0dG9uKCBIV05EMzIgaHduZERsZyApCiB7Ci0gICAgSFdORDMyIGh3bmRDaGlsZCA9IEdldFdpbmRvdyggaHduZERsZywgR1dfQ0hJTEQgKTsKKyAgICBIV05EMzIgaHduZENoaWxkID0gR2V0V2luZG93MzIoIGh3bmREbGcsIEdXX0NISUxEICk7CiAgICAgd2hpbGUgKGh3bmRDaGlsZCkKICAgICB7CiAgICAgICAgIGlmIChTZW5kTWVzc2FnZTE2KCBod25kQ2hpbGQsIFdNX0dFVERMR0NPREUsIDAsIDAgKSAmIERMR0NfREVGUFVTSEJVVFRPTikKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBod25kQ2hpbGQgPSBHZXRXaW5kb3coIGh3bmRDaGlsZCwgR1dfSFdORE5FWFQgKTsKKyAgICAgICAgaHduZENoaWxkID0gR2V0V2luZG93MzIoIGh3bmRDaGlsZCwgR1dfSFdORE5FWFQgKTsKICAgICB9CiAgICAgcmV0dXJuIGh3bmRDaGlsZDsKIH0KQEAgLTkxLDE0ICs5MSwxNCBAQAogICAgIAogICAgIGlmIChkbGdJbmZvLT5pZFJlc3VsdCkgIC8qIFRoZXJlJ3MgYWxyZWFkeSBhIGRlZmF1bHQgcHVzaGJ1dHRvbiAqLwogICAgIHsKLSAgICAgICAgSFdORDMyIGh3bmRPbGQgPSBHZXREbGdJdGVtKCBod25kRGxnLCBkbGdJbmZvLT5pZFJlc3VsdCApOworICAgICAgICBIV05EMzIgaHduZE9sZCA9IEdldERsZ0l0ZW0zMiggaHduZERsZywgZGxnSW5mby0+aWRSZXN1bHQgKTsKICAgICAgICAgaWYgKFNlbmRNZXNzYWdlMzJBKCBod25kT2xkLCBXTV9HRVRETEdDT0RFLCAwLCAwKSAmIERMR0NfREVGUFVTSEJVVFRPTikKICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBod25kT2xkLCBCTV9TRVRTVFlMRTMyLCBCU19QVVNIQlVUVE9OLCBUUlVFICk7CiAgICAgfQogICAgIGlmIChod25kTmV3KQogICAgIHsKICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGh3bmROZXcsIEJNX1NFVFNUWUxFMzIsIEJTX0RFRlBVU0hCVVRUT04sIFRSVUUgKTsKLSAgICAgICAgZGxnSW5mby0+aWRSZXN1bHQgPSBHZXREbGdDdHJsSUQoIGh3bmROZXcgKTsKKyAgICAgICAgZGxnSW5mby0+aWRSZXN1bHQgPSBHZXREbGdDdHJsSUQzMiggaHduZE5ldyApOwogICAgIH0KICAgICBlbHNlIGRsZ0luZm8tPmlkUmVzdWx0ID0gMDsKICAgICByZXR1cm4gVFJVRTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgICAgICBjYXNlIERNX1NFVERFRklEOgogICAgICAgICAgICAgaWYgKGRsZ0luZm8tPmZFbmQpIHJldHVybiAxOwogICAgICAgICAgICAgREVGRExHX1NldERlZkJ1dHRvbiggaHduZCwgZGxnSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdQYXJhbSA/IEdldERsZ0l0ZW0oIGh3bmQsIHdQYXJhbSApIDogMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1BhcmFtID8gR2V0RGxnSXRlbTMyKCBod25kLCB3UGFyYW0gKSA6IDAgKTsKICAgICAgICAgICAgIHJldHVybiAxOwogCiAgICAgICAgIGNhc2UgRE1fR0VUREVGSUQ6CkBAIC0xNzksNyArMTc5LDcgQEAKIAkgICAgICByZXR1cm4gTUFLRUxPTkcoIGRsZ0luZm8tPmlkUmVzdWx0LCBEQ19IQVNERUZJRCApOwogCSAgICBod25kRGVmSWQgPSBERUZETEdfRmluZERlZkJ1dHRvbiggaHduZCApOwogCSAgICBpZiAoaHduZERlZklkKQotCSAgICAgIHJldHVybiBNQUtFTE9ORyggR2V0RGxnQ3RybElEKCBod25kRGVmSWQgKSwgRENfSEFTREVGSUQpOworCSAgICAgIHJldHVybiBNQUtFTE9ORyggR2V0RGxnQ3RybElEMzIoIGh3bmREZWZJZCApLCBEQ19IQVNERUZJRCk7CiAJICAgIHJldHVybiAwOwogCiAJY2FzZSBXTV9ORVhURExHQ1RMOgpAQCAtMTk3LDcgKzE5Nyw3IEBACiAKICAgICAgICAgY2FzZSBXTV9DTE9TRToKICAgICAgICAgICAgIEVuZERpYWxvZyggaHduZCwgVFJVRSApOwotICAgICAgICAgICAgRGVzdHJveVdpbmRvdyggaHduZCApOworICAgICAgICAgICAgRGVzdHJveVdpbmRvdzMyKCBod25kICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCBiNjY2Y2NhLi5jMzkzZWI3IDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTEzMiwxMSArMTMyLDE1IEBACiAgICAgICAgICAgICBWYWxpZGF0ZVJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgTlVMTCApOwogICAgICAgICAgICAgd25kUHRyLT5mbGFncyB8PSBXSU5fTk9fUkVEUkFXOwogICAgICAgICB9Ci0gICAgICAgIGVsc2Ugd25kUHRyLT5mbGFncyAmPSB+V0lOX05PX1JFRFJBVzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3bmRQdHItPmZsYWdzICY9IH5XSU5fTk9fUkVEUkFXOworICAgICAgICAgICAgU2hvd1dpbmRvdzMyKCB3bmRQdHItPmh3bmRTZWxmLCBTV19TSE9XICk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBjYXNlIFdNX0NMT1NFOgotCURlc3Ryb3lXaW5kb3coIHduZFB0ci0+aHduZFNlbGYgKTsKKwlEZXN0cm95V2luZG93MzIoIHduZFB0ci0+aHduZFNlbGYgKTsKIAlyZXR1cm4gMDsKIAogICAgIGNhc2UgV01fTU9VU0VBQ1RJVkFURToKQEAgLTI5Nyw3ICszMDEsNyBAQAogICAgICAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19QT1BVUCkgfHwgIXduZFB0ci0+b3duZXIpIHJldHVybiAwOwogICAgICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEUpICYmIHdQYXJhbSkgcmV0dXJuIDA7CiAJZWxzZSBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFKSAmJiAhd1BhcmFtKSByZXR1cm4gMDsKLSAgICAgICAgU2hvd1dpbmRvdyggd25kUHRyLT5od25kU2VsZiwgd1BhcmFtID8gU1dfU0hPV05PQUNUSVZBVEUgOiBTV19ISURFICk7CisgICAgICAgIFNob3dXaW5kb3czMiggd25kUHRyLT5od25kU2VsZiwgd1BhcmFtID8gU1dfU0hPV05PQUNUSVZBVEUgOiBTV19ISURFICk7CiAJYnJlYWs7IAogCiAgICAgY2FzZSBXTV9DQU5DRUxNT0RFOgpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggYmNkNzNlYS4uNWZiZDRlZSAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC01LDYgKzUsNyBAQAogICovCiAKICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0yMjYsNyArMjI3LDcgQEAKICAqIENyZWF0ZSB0aGUgY29udHJvbCB3aW5kb3dzIGZvciBhIGRpYWxvZy4KICAqLwogc3RhdGljIEJPT0wzMiBESUFMT0dfQ3JlYXRlQ29udHJvbHMoIFdORCAqcFduZCwgTFBDU1RSIHRlbXBsYXRlLCBJTlQzMiBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UzMiBoSW5zdCwgQk9PTCB3aW4zMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMzIgaEluc3QsIEJPT0wzMiB3aW4zMiApCiB7CiAgICAgRElBTE9HSU5GTyAqZGxnSW5mbyA9IChESUFMT0dJTkZPICopcFduZC0+d0V4dHJhOwogICAgIERMR19DT05UUk9MX0lORk8gaW5mbzsKQEAgLTQ2NSw4ICs0NjYsOCBAQAogewogICAgIEhNRU5VMTYgaE1lbnUgPSAwOwogICAgIEhGT05UMTYgaEZvbnQgPSAwOwotICAgIEhXTkQgaHduZDsKLSAgICBSRUNUMTYgcmVjdDsKKyAgICBIV05EMzIgaHduZDsKKyAgICBSRUNUMzIgcmVjdDsKICAgICBXTkQgKiB3bmRQdHI7CiAgICAgRExHX1RFTVBMQVRFIHRlbXBsYXRlOwogICAgIERJQUxPR0lORk8gKiBkbGdJbmZvOwpAQCAtNTI0LDcgKzUyNSw3IEBACiAgICAgcmVjdC5ib3R0b20gPSB0ZW1wbGF0ZS5jeSAqIHlVbml0IC8gODsKICAgICBpZiAodGVtcGxhdGUuc3R5bGUgJiBEU19NT0RBTEZSQU1FKQogICAgICAgICB0ZW1wbGF0ZS5leFN0eWxlIHw9IFdTX0VYX0RMR01PREFMRlJBTUU7Ci0gICAgQWRqdXN0V2luZG93UmVjdEV4MTYoICZyZWN0LCB0ZW1wbGF0ZS5zdHlsZSwgCisgICAgQWRqdXN0V2luZG93UmVjdEV4MzIoICZyZWN0LCB0ZW1wbGF0ZS5zdHlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNZW51ID8gVFJVRSA6IEZBTFNFICwgdGVtcGxhdGUuZXhTdHlsZSApOwogICAgIHJlY3QucmlnaHQgLT0gcmVjdC5sZWZ0OwogICAgIHJlY3QuYm90dG9tIC09IHJlY3QudG9wOwpAQCAtNTQzLDcgKzU0NCw3IEBACiAgICAgICAgICAgICBJTlQxNiBkWCwgZFk7CiAKICAgICAgICAgICAgIGlmKCAhKHRlbXBsYXRlLnN0eWxlICYgRFNfQUJTQUxJR04pICkKLSAgICAgICAgICAgICAgICBDbGllbnRUb1NjcmVlbjE2KCBvd25lciwgKFBPSU5UMTYgKikmcmVjdCApOworICAgICAgICAgICAgICAgIENsaWVudFRvU2NyZWVuMzIoIG93bmVyLCAoUE9JTlQzMiAqKSZyZWN0ICk7CiAJICAgIAogICAgICAgICAgICAgLyogdHJ5IHRvIGZpdCBpdCBpbnRvIHRoZSBkZXNrdG9wICovCiAKQEAgLTU5Niw3ICs1OTcsNyBAQAogICAgIGlmICghRElBTE9HX0NyZWF0ZUNvbnRyb2xzKCB3bmRQdHIsIGRsZ1RlbXBsYXRlLCB0ZW1wbGF0ZS5uYkl0ZW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5zdCwgd2luMzJUZW1wbGF0ZSApKQogICAgIHsKLSAgICAgICAgRGVzdHJveVdpbmRvdyggaHduZCApOworICAgICAgICBEZXN0cm95V2luZG93MzIoIGh3bmQgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC02MDYsNyArNjA3LDcgQEAKICAgICBpZiAoU2VuZE1lc3NhZ2UzMkEoIGh3bmQsIFdNX0lOSVRESUFMT0csCiAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApKQogCVNldEZvY3VzMzIoIGRsZ0luZm8tPmh3bmRGb2N1cyApOwotICAgIGlmICh0ZW1wbGF0ZS5zdHlsZSAmIFdTX1ZJU0lCTEUpIFNob3dXaW5kb3coIGh3bmQsIFNXX1NIT1cgKTsKKyAgICBpZiAodGVtcGxhdGUuc3R5bGUgJiBXU19WSVNJQkxFKSBTaG93V2luZG93MzIoIGh3bmQsIFNXX1NIT1cgKTsKICAgICByZXR1cm4gaHduZDsKIH0KIApAQCAtNzM2LDggKzczNyw4IEBACiAgICAgb3duZXIgPSBXSU5fR2V0VG9wUGFyZW50KCBvd25lciApOwogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gLTE7CiAgICAgZGxnSW5mbyA9IChESUFMT0dJTkZPICopd25kUHRyLT53RXh0cmE7Ci0gICAgRW5hYmxlV2luZG93KCBvd25lciwgRkFMU0UgKTsKLSAgICBTaG93V2luZG93KCBod25kLCBTV19TSE9XICk7CisgICAgRW5hYmxlV2luZG93MzIoIG93bmVyLCBGQUxTRSApOworICAgIFNob3dXaW5kb3czMiggaHduZCwgU1dfU0hPVyApOwogCiAgICAgd2hpbGUgKE1TR19JbnRlcm5hbEdldE1lc3NhZ2UoJm1zZywgaHduZCwgb3duZXIsIE1TR0ZfRElBTE9HQk9YLCBQTV9SRU1PVkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISh3bmRQdHItPmR3U3R5bGUgJiBEU19OT0lETEVNU0cpICkpCkBAIC03NTAsOCArNzUxLDggQEAKIAlpZiAoZGxnSW5mby0+ZkVuZCkgYnJlYWs7CiAgICAgfQogICAgIHJldHZhbCA9IGRsZ0luZm8tPmlkUmVzdWx0OwotICAgIEVuYWJsZVdpbmRvdyggb3duZXIsIFRSVUUgKTsKLSAgICBEZXN0cm95V2luZG93KCBod25kICk7CisgICAgRW5hYmxlV2luZG93MzIoIG93bmVyLCBUUlVFICk7CisgICAgRGVzdHJveVdpbmRvdzMyKCBod25kICk7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtODcyLDEzICs4NzMsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIElzRGlhbG9nTWVzc2FnZSAgIChVU0VSLjkwKQogICovCi1CT09MIElzRGlhbG9nTWVzc2FnZSggSFdORCBod25kRGxnLCBMUE1TRzE2IG1zZyApCitCT09MMTYgSXNEaWFsb2dNZXNzYWdlKCBIV05EMTYgaHduZERsZywgTFBNU0cxNiBtc2cgKQogewogICAgIFdORCAqIHduZFB0cjsKICAgICBpbnQgZGxnQ29kZTsKIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kRGxnICkpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKChod25kRGxnICE9IG1zZy0+aHduZCkgJiYgIUlzQ2hpbGQoIGh3bmREbGcsIG1zZy0+aHduZCApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKChod25kRGxnICE9IG1zZy0+aHduZCkgJiYgIUlzQ2hpbGQxNiggaHduZERsZywgbXNnLT5od25kICkpIHJldHVybiBGQUxTRTsKIAogICAgICAgLyogT25seSB0aGUga2V5IG1lc3NhZ2VzIGdldCBzcGVjaWFsIHByb2Nlc3NpbmcgKi8KICAgICBpZiAoKG1zZy0+bWVzc2FnZSAhPSBXTV9LRVlET1dOKSAmJgpAQCAtOTMwLDcgKzkzMSw3IEBACiAKICAgICAgICAgY2FzZSBWS19FU0NBUEU6CiAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaHduZERsZywgV01fQ09NTUFORCwgSURDQU5DRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtKCBod25kRGxnLCBJRENBTkNFTCApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtMzIoIGh3bmREbGcsIElEQ0FOQ0VMICkgKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVktfUkVUVVJOOgpAQCAtOTM5LDEwICs5NDAsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAoSElXT1JEKGR3KSA9PSBEQ19IQVNERUZJRCkKICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGh3bmREbGcsIFdNX0NPTU1BTkQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRVdQQVJBTSggTE9XT1JEKGR3KSwgQk5fQ0xJQ0tFRCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtKCBod25kRGxnLCBMT1dPUkQoZHcpICkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtMzIoaHduZERsZywgTE9XT1JEKGR3KSkpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGh3bmREbGcsIFdNX0NPTU1BTkQsIElET0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKUdldERsZ0l0ZW0oIGh3bmREbGcsIElET0sgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlHZXREbGdJdGVtMzIoIGh3bmREbGcsIElET0sgKSApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTk2OSw5ICs5NzAsMjAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBHZXREbGdDdHJsSUQgICAoVVNFUi4yNzcpIChVU0VSMzIuMjMzKQorICogICAgICAgICBHZXREbGdDdHJsSUQxNiAgIChVU0VSLjI3NykKICAqLwotSU5UMTYgR2V0RGxnQ3RybElEKCBIV05EMzIgaHduZCApCitJTlQxNiBHZXREbGdDdHJsSUQxNiggSFdORDE2IGh3bmQgKQoreworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgaWYgKHduZFB0cikgcmV0dXJuIHduZFB0ci0+d0lEbWVudTsKKyAgICBlbHNlIHJldHVybiAwOworfQorIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXREbGdDdHJsSUQzMiAgIChVU0VSMzIuMjMzKQorICovCitJTlQzMiBHZXREbGdDdHJsSUQzMiggSFdORDMyIGh3bmQgKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAgICAgaWYgKHduZFB0cikgcmV0dXJuIHduZFB0ci0+d0lEbWVudTsKQEAgLTk4MCwxNSArOTkyLDI5IEBACiAgCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldERsZ0l0ZW0gICAoVVNFUi45MSkKKyAqICAgICAgICAgICBHZXREbGdJdGVtMTYgICAoVVNFUi45MSkKICAqLwotSFdORCBHZXREbGdJdGVtKCBIV05EIGh3bmREbGcsIFdPUkQgaWQgKQorSFdORDE2IEdldERsZ0l0ZW0xNiggSFdORDE2IGh3bmREbGcsIElOVDE2IGlkICkKIHsKICAgICBXTkQgKnBXbmQ7CiAKICAgICBpZiAoIShwV25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmREbGcgKSkpIHJldHVybiAwOwogICAgIGZvciAocFduZCA9IHBXbmQtPmNoaWxkOyBwV25kOyBwV25kID0gcFduZC0+bmV4dCkKLSAgICAgICAgaWYgKHBXbmQtPndJRG1lbnUgPT0gaWQpIHJldHVybiBwV25kLT5od25kU2VsZjsKKyAgICAgICAgaWYgKHBXbmQtPndJRG1lbnUgPT0gKFVJTlQxNilpZCkgcmV0dXJuIHBXbmQtPmh3bmRTZWxmOworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldERsZ0l0ZW0zMiAgIChVU0VSMzIuMjM0KQorICovCitIV05EMzIgR2V0RGxnSXRlbTMyKCBIV05EMzIgaHduZERsZywgSU5UMzIgaWQgKQoreworICAgIFdORCAqcFduZDsKKworICAgIGlmICghKHBXbmQgPSBXSU5fRmluZFduZFB0ciggaHduZERsZyApKSkgcmV0dXJuIDA7CisgICAgZm9yIChwV25kID0gcFduZC0+Y2hpbGQ7IHBXbmQ7IHBXbmQgPSBwV25kLT5uZXh0KQorICAgICAgICBpZiAocFduZC0+d0lEbWVudSA9PSAoVUlOVDE2KWlkKSByZXR1cm4gcFduZC0+aHduZFNlbGY7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTk5OSw3ICsxMDI1LDcgQEAKIExSRVNVTFQgU2VuZERsZ0l0ZW1NZXNzYWdlMTYoIEhXTkQxNiBod25kLCBJTlQxNiBpZCwgVUlOVDE2IG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgSFdORDE2IGh3bmRDdHJsID0gR2V0RGxnSXRlbSggaHduZCwgaWQgKTsKKyAgICBIV05EMTYgaHduZEN0cmwgPSBHZXREbGdJdGVtMTYoIGh3bmQsIGlkICk7CiAgICAgaWYgKGh3bmRDdHJsKSByZXR1cm4gU2VuZE1lc3NhZ2UxNiggaHduZEN0cmwsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKICAgICBlbHNlIHJldHVybiAwOwogfQpAQCAtMTAxMSw3ICsxMDM3LDcgQEAKIExSRVNVTFQgU2VuZERsZ0l0ZW1NZXNzYWdlMzJBKCBIV05EMzIgaHduZCwgSU5UMzIgaWQsIFVJTlQzMiBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKLSAgICBIV05EIGh3bmRDdHJsID0gR2V0RGxnSXRlbSggKEhXTkQxNilod25kLCAoSU5UMTYpaWQgKTsKKyAgICBIV05EMzIgaHduZEN0cmwgPSBHZXREbGdJdGVtMzIoIGh3bmQsIGlkICk7CiAgICAgaWYgKGh3bmRDdHJsKSByZXR1cm4gU2VuZE1lc3NhZ2UzMkEoIGh3bmRDdHJsLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiAgICAgZWxzZSByZXR1cm4gMDsKIH0KQEAgLTEwMjMsNyArMTA0OSw3IEBACiBMUkVTVUxUIFNlbmREbGdJdGVtTWVzc2FnZTMyVyggSFdORDMyIGh3bmQsIElOVDMyIGlkLCBVSU5UMzIgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgSFdORCBod25kQ3RybCA9IEdldERsZ0l0ZW0oIChIV05EMTYpaHduZCwgKElOVDE2KWlkICk7CisgICAgSFdORDMyIGh3bmRDdHJsID0gR2V0RGxnSXRlbTMyKCBod25kLCBpZCApOwogICAgIGlmIChod25kQ3RybCkgcmV0dXJuIFNlbmRNZXNzYWdlMzJXKCBod25kQ3RybCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOwogICAgIGVsc2UgcmV0dXJuIDA7CiB9CkBAIC0xMDkxLDEzICsxMTE3LDcgQEAKICAqLwogdm9pZCBTZXREbGdJdGVtSW50MTYoIEhXTkQxNiBod25kLCBJTlQxNiBpZCwgVUlOVDE2IHZhbHVlLCBCT09MMTYgZlNpZ25lZCApCiB7Ci0gICAgY2hhciAqc3RyID0gKGNoYXIgKilTRUdQVFJfQUxMT0MoIDIwICogc2l6ZW9mKGNoYXIpICk7Ci0KLSAgICBpZiAoIXN0cikgcmV0dXJuOwotICAgIGlmIChmU2lnbmVkKSBzcHJpbnRmKCBzdHIsICIlZCIsIChJTlQzMikoSU5UMTYpdmFsdWUgKTsKLSAgICBlbHNlIHNwcmludGYoIHN0ciwgIiV1IiwgdmFsdWUgKTsKLSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UxNiggaHduZCwgaWQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pU0VHUFRSX0dFVChzdHIpICk7Ci0gICAgU0VHUFRSX0ZSRUUoc3RyKTsKKyAgICByZXR1cm4gU2V0RGxnSXRlbUludDMyKCBod25kLCAoVUlOVDMyKShVSU5UMTYpaWQsIHZhbHVlLCBmU2lnbmVkICk7CiB9CiAKIApAQCAtMTExNSw0MiArMTEzNSw2NyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldERsZ0l0ZW1JbnQgICAoVVNFUi45NSkKKyAqICAgICAgICAgICBHZXREbGdJdGVtSW50MTYgICAoVVNFUi45NSkKICAqLwotV09SRCBHZXREbGdJdGVtSW50KCBIV05EIGh3bmQsIFdPUkQgaWQsIEJPT0wgKiB0cmFuc2xhdGVkLCBCT09MIGZTaWduZWQgKQorVUlOVDE2IEdldERsZ0l0ZW1JbnQxNiggSFdORDE2IGh3bmQsIElOVDE2IGlkLCBCT09MMTYgKnRyYW5zbGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBCT09MMTYgZlNpZ25lZCApCiB7Ci0gICAgY2hhciAqc3RyOwotICAgIGxvbmcgcmVzdWx0ID0gMDsKLSAgICAKKyAgICBVSU5UMzIgcmVzdWx0OworICAgIEJPT0wzMiBvazsKKwogICAgIGlmICh0cmFuc2xhdGVkKSAqdHJhbnNsYXRlZCA9IEZBTFNFOwotICAgIGlmICghKHN0ciA9IChjaGFyICopU0VHUFRSX0FMTE9DKCAzMCAqIHNpemVvZihjaGFyKSApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKFNlbmREbGdJdGVtTWVzc2FnZTE2KCBod25kLCBpZCwgV01fR0VUVEVYVCwgMzAsIChMUEFSQU0pU0VHUFRSX0dFVChzdHIpKSkKKyAgICByZXN1bHQgPSBHZXREbGdJdGVtSW50MzIoIGh3bmQsIChVSU5UMzIpKFVJTlQxNilpZCwgJm9rLCBmU2lnbmVkICk7CisgICAgaWYgKCFvaykgcmV0dXJuIDA7CisgICAgaWYgKGZTaWduZWQpCiAgICAgewotCWNoYXIgKiBlbmRwdHI7Ci0JcmVzdWx0ID0gc3RydG9sKCBzdHIsICZlbmRwdHIsIDEwICk7Ci0JaWYgKGVuZHB0ciAmJiAoZW5kcHRyICE9IHN0cikpICAvKiBDb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsICovCi0JewotCSAgICBpZiAoZlNpZ25lZCkKLQkgICAgewotCQlpZiAoKHJlc3VsdCA8IC0zMjc2NykgfHwgKHJlc3VsdCA+IDMyNzY3KSkgcmVzdWx0ID0gMDsKLQkJZWxzZSBpZiAodHJhbnNsYXRlZCkgKnRyYW5zbGF0ZWQgPSBUUlVFOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlpZiAoKHJlc3VsdCA8IDApIHx8IChyZXN1bHQgPiA2NTUzNSkpIHJlc3VsdCA9IDA7Ci0JCWVsc2UgaWYgKHRyYW5zbGF0ZWQpICp0cmFuc2xhdGVkID0gVFJVRTsKLQkgICAgfQotCX0KKyAgICAgICAgaWYgKCgoSU5UMzIpcmVzdWx0IDwgLTMyNzY3KSB8fCAoKElOVDMyKXJlc3VsdCA+IDMyNzY3KSkgcmV0dXJuIDA7CiAgICAgfQotICAgIFNFR1BUUl9GUkVFKHN0cik7Ci0gICAgcmV0dXJuIChXT1JEKXJlc3VsdDsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocmVzdWx0ID4gNjU1MzUpIHJldHVybiAwOworICAgIH0KKyAgICBpZiAodHJhbnNsYXRlZCkgKnRyYW5zbGF0ZWQgPSBUUlVFOworICAgIHJldHVybiAoVUlOVDE2KXJlc3VsdDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGVja0RsZ0J1dHRvbiAgIChVU0VSLjk3KSAoVVNFUjMyLjQ0KQorICogICAgICAgICAgIEdldERsZ0l0ZW1JbnQzMiAgIChVU0VSMzIuMjM1KQogICovCi1CT09MMTYgQ2hlY2tEbGdCdXR0b24oIEhXTkQzMiBod25kLCBJTlQzMiBpZCwgVUlOVDMyIGNoZWNrICkKK1VJTlQzMiBHZXREbGdJdGVtSW50MzIoIEhXTkQzMiBod25kLCBJTlQzMiBpZCwgQk9PTDMyICp0cmFuc2xhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGZTaWduZWQgKQoreworICAgIGNoYXIgc3RyWzMwXTsKKyAgICBjaGFyICogZW5kcHRyOworICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICAKKyAgICBpZiAodHJhbnNsYXRlZCkgKnRyYW5zbGF0ZWQgPSBGQUxTRTsKKyAgICBpZiAoIVNlbmREbGdJdGVtTWVzc2FnZTMyQShod25kLCBpZCwgV01fR0VUVEVYVCwgc2l6ZW9mKHN0ciksIChMUEFSQU0pc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGZTaWduZWQpCisgICAgeworICAgICAgICByZXN1bHQgPSBzdHJ0b2woIHN0ciwgJmVuZHB0ciwgMTAgKTsKKyAgICAgICAgaWYgKCFlbmRwdHIgfHwgKGVuZHB0ciA9PSBzdHIpKSAgLyogQ29udmVyc2lvbiB3YXMgdW5zdWNjZXNzZnVsICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCgocmVzdWx0ID09IExPTkdfTUlOKSB8fCAocmVzdWx0ID09IExPTkdfTUFYKSkgJiYgKGVycm5vPT1FUkFOR0UpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IHN0cnRvdWwoIHN0ciwgJmVuZHB0ciwgMTAgKTsKKyAgICAgICAgaWYgKCFlbmRwdHIgfHwgKGVuZHB0ciA9PSBzdHIpKSAgLyogQ29udmVyc2lvbiB3YXMgdW5zdWNjZXNzZnVsICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKChyZXN1bHQgPT0gVUxPTkdfTUFYKSAmJiAoZXJybm8gPT0gRVJBTkdFKSkgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICh0cmFuc2xhdGVkKSAqdHJhbnNsYXRlZCA9IFRSVUU7CisgICAgcmV0dXJuIChVSU5UMzIpcmVzdWx0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENoZWNrRGxnQnV0dG9uMTYgICAoVVNFUi45NykKKyAqLworQk9PTDE2IENoZWNrRGxnQnV0dG9uMTYoIEhXTkQxNiBod25kLCBJTlQxNiBpZCwgVUlOVDE2IGNoZWNrICkKIHsKICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UzMkEoIGh3bmQsIGlkLCBCTV9TRVRDSEVDSzMyLCBjaGVjaywgMCApOwogICAgIHJldHVybiBUUlVFOwpAQCAtMTE1OCwxOSArMTIwMyw0OCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIElzRGxnQnV0dG9uQ2hlY2tlZCAgIChVU0VSLjk4KQorICogICAgICAgICAgIENoZWNrRGxnQnV0dG9uMzIgICAoVVNFUjMyLjQ0KQogICovCi1XT1JEIElzRGxnQnV0dG9uQ2hlY2tlZCggSFdORCBod25kLCBXT1JEIGlkICkKK0JPT0wzMiBDaGVja0RsZ0J1dHRvbjMyKCBIV05EMzIgaHduZCwgSU5UMzIgaWQsIFVJTlQzMiBjaGVjayApCiB7Ci0gICAgcmV0dXJuIChXT1JEKVNlbmREbGdJdGVtTWVzc2FnZTMyQSggaHduZCwgaWQsIEJNX0dFVENIRUNLMzIsIDAsIDAgKTsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UzMkEoIGh3bmQsIGlkLCBCTV9TRVRDSEVDSzMyLCBjaGVjaywgMCApOworICAgIHJldHVybiBUUlVFOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoZWNrUmFkaW9CdXR0b24gICAoVVNFUi45NikgKFVTRVIzMi40NykKKyAqICAgICAgICAgICBJc0RsZ0J1dHRvbkNoZWNrZWQxNiAgIChVU0VSLjk4KQogICovCi1CT09MMTYgQ2hlY2tSYWRpb0J1dHRvbiggSFdORDMyIGh3bmREbGcsIFVJTlQzMiBmaXJzdElELCBVSU5UMzIgbGFzdElELAotICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBjaGVja0lEICkKK1VJTlQxNiBJc0RsZ0J1dHRvbkNoZWNrZWQxNiggSFdORDE2IGh3bmQsIFVJTlQxNiBpZCApCit7CisgICAgcmV0dXJuIChVSU5UMTYpU2VuZERsZ0l0ZW1NZXNzYWdlMzJBKCBod25kLCBpZCwgQk1fR0VUQ0hFQ0szMiwgMCwgMCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElzRGxnQnV0dG9uQ2hlY2tlZDMyICAgKFVTRVIzMi4zNDMpCisgKi8KK1VJTlQzMiBJc0RsZ0J1dHRvbkNoZWNrZWQzMiggSFdORDMyIGh3bmQsIFVJTlQzMiBpZCApCit7CisgICAgcmV0dXJuIChVSU5UMzIpU2VuZERsZ0l0ZW1NZXNzYWdlMzJBKCBod25kLCBpZCwgQk1fR0VUQ0hFQ0szMiwgMCwgMCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENoZWNrUmFkaW9CdXR0b24xNiAgIChVU0VSLjk2KQorICovCitCT09MMTYgQ2hlY2tSYWRpb0J1dHRvbjE2KCBIV05EMTYgaHduZERsZywgVUlOVDE2IGZpcnN0SUQsIFVJTlQxNiBsYXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgY2hlY2tJRCApCit7CisgICAgcmV0dXJuIENoZWNrUmFkaW9CdXR0b24zMiggaHduZERsZywgZmlyc3RJRCwgbGFzdElELCBjaGVja0lEICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ2hlY2tSYWRpb0J1dHRvbjMyICAgKFVTRVIzMi40NykKKyAqLworQk9PTDMyIENoZWNrUmFkaW9CdXR0b24zMiggSFdORDMyIGh3bmREbGcsIFVJTlQzMiBmaXJzdElELCBVSU5UMzIgbGFzdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGNoZWNrSUQgKQogewogICAgIFdORCAqcFduZCA9IFdJTl9GaW5kV25kUHRyKCBod25kRGxnICk7CiAgICAgaWYgKCFwV25kKSByZXR1cm4gRkFMU0U7CkBAIC0xMzU0LDcgKzE0MjgsNyBAQAogICAgIGNoYXIgKmJ1ZmZlciwgKnB0cjsKICAgICBJTlQzMiBpdGVtLCBzaXplOwogICAgIEJPT0wzMiByZXQ7Ci0gICAgSFdORDMyIGxpc3Rib3ggPSBHZXREbGdJdGVtKCBod25kLCBpZCApOworICAgIEhXTkQzMiBsaXN0Ym94ID0gR2V0RGxnSXRlbTMyKCBod25kLCBpZCApOwogCiAgICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIkRsZ0RpclNlbGVjdDogJTA0eCAnJXMnICVkXG4iLCBod25kLCBzdHIsIGlkICk7CiAgICAgaWYgKCFsaXN0Ym94KSByZXR1cm4gRkFMU0U7CkBAIC0xNDM2LDcgKzE1MTAsNyBAQAogICAgIH0KICAgICBlbHNlIGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7CiAKLSAgICBpZiAoaWRMQm94ICYmICgoaHduZCA9IEdldERsZ0l0ZW0oIGhEbGcsIGlkTEJveCApKSAhPSAwKSkKKyAgICBpZiAoaWRMQm94ICYmICgoaHduZCA9IEdldERsZ0l0ZW0zMiggaERsZywgaWRMQm94ICkpICE9IDApKQogICAgIHsKICAgICAgICAgLyogSWYgdGhlIHBhdGggZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeSwgY2hkaXIgdG8gaXQgKi8KICAgICAgICAgaWYgKCFzcGVjIHx8ICFzcGVjWzBdIHx8IERSSVZFX0NoZGlyKCBkcml2ZSwgc3BlYyApKSBzcGVjID0gIiouKiI7CkBAIC0xNDg0LDcgKzE1NTgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGlkU3RhdGljICYmICgoaHduZCA9IEdldERsZ0l0ZW0oIGhEbGcsIGlkU3RhdGljICkpICE9IDApKQorICAgIGlmIChpZFN0YXRpYyAmJiAoKGh3bmQgPSBHZXREbGdJdGVtMzIoIGhEbGcsIGlkU3RhdGljICkpICE9IDApKQogICAgIHsKICAgICAgICAgY2hhciB0ZW1wWzUxMl07CiAgICAgICAgIGludCBkcml2ZSA9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IDE5NDgwZGQuLmQ4ZTZkZmIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTU4LDExICs1OCw2IEBACiAgIC8qIFggY29udGV4dCB0byBhc3NvY2lhdGUgYSBod25kIHRvIGFuIFggd2luZG93ICovCiBzdGF0aWMgWENvbnRleHQgd2luQ29udGV4dCA9IDA7CiAKLSAgLyogU3RhdGUgdmFyaWFibGVzICovCi1CT09MIE1vdXNlQnV0dG9uc1N0YXRlc1tOQl9CVVRUT05TXTsKLUJPT0wgQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbTkJfQlVUVE9OU107Ci1CWVRFIElucHV0S2V5U3RhdGVUYWJsZVsyNTZdOwotCiBzdGF0aWMgSU5UMTYgIGNhcHR1cmVIVCA9IEhUQ0xJRU5UOwogc3RhdGljIEhXTkQzMiBjYXB0dXJlV25kID0gMDsKIHN0YXRpYyBCT09MMzIgSW5wdXRFbmFibGVkID0gVFJVRTsKQEAgLTg1LDcgKzgwLDcgQEAKIH07CiAKICAgLyogRXZlbnQgaGFuZGxlcnMgKi8KLXN0YXRpYyB2b2lkIEVWRU5UX2tleSggWEtleUV2ZW50ICpldmVudCApOworc3RhdGljIHZvaWQgRVZFTlRfS2V5KCBYS2V5RXZlbnQgKmV2ZW50ICk7CiBzdGF0aWMgdm9pZCBFVkVOVF9CdXR0b25QcmVzcyggWEJ1dHRvbkV2ZW50ICpldmVudCApOwogc3RhdGljIHZvaWQgRVZFTlRfQnV0dG9uUmVsZWFzZSggWEJ1dHRvbkV2ZW50ICpldmVudCApOwogc3RhdGljIHZvaWQgRVZFTlRfTW90aW9uTm90aWZ5KCBYTW90aW9uRXZlbnQgKmV2ZW50ICk7CkBAIC0xMjgsNyArMTIzLDcgQEAKICAgICBjYXNlIEtleVByZXNzOgogICAgIGNhc2UgS2V5UmVsZWFzZToKICAgICAgICAgaWYgKElucHV0RW5hYmxlZCkKLSAgICAgICAgICAgIEVWRU5UX2tleSggKFhLZXlFdmVudCopZXZlbnQgKTsKKyAgICAgICAgICAgIEVWRU5UX0tleSggKFhLZXlFdmVudCopZXZlbnQgKTsKIAlicmVhazsKIAkKICAgICBjYXNlIEJ1dHRvblByZXNzOgpAQCAtNDQ1LDQxNyArNDQwLDEzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRVZFTlRfa2V5CisgKiAgICAgICAgICAgRVZFTlRfS2V5CiAgKgogICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICAqLwotCi0vKiBLZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZXMgKi8KLXN0YXRpYyBjb25zdCBpbnQgc3BlY2lhbF9rZXlbXSA9CitzdGF0aWMgdm9pZCBFVkVOVF9LZXkoIFhLZXlFdmVudCAqZXZlbnQgKQogewotICAgIFZLX0JBQ0ssIFZLX1RBQiwgMCwgVktfQ0xFQVIsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgIC8qIEZGMDggKi8KLSAgICAwLCAwLCAwLCBWS19QQVVTRSwgVktfU0NST0xMLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjEwICovCi0gICAgMCwgMCwgMCwgVktfRVNDQVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwotfTsKLQotc3RhdGljIGNvbnN0IGludCBjdXJzb3Jfa2V5W10gPQotewotICAgIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCBWS19SSUdIVCwgVktfRE9XTiwgVktfUFJJT1IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTkVYVCwgVktfRU5EICAgICAgICAgIC8qIEZGNTAgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgbWlzY19rZXlbXSA9Ci17Ci0gICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLCAwLCAwLCAwLCAgLyogRkY2MCAqLwotICAgIFZLX0NBTkNFTCwgVktfSEVMUCwgVktfQ0FOQ0VMLCBWS19NRU5VICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNjggKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQga2V5cGFkX2tleVtdID0KLXsKLSAgICAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogRkY3RSAqLwotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KLSAgICAwLCAwLCAwLCAwLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCi0gICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwotICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgVktfRU5ELCAwLAotCQkJCSBWS19JTlNFUlQsIFZLX0RFTEVURSwgICAgICAgICAgLyogRkY5OCAqLwotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KLSAgICAwLCAwLCBWS19NVUxUSVBMWSwgVktfQURELCBWS19TRVBBUkFUT1IsIFZLX1NVQlRSQUNULCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ERUNJTUFMLCBWS19ESVZJREUsICAgICAgICAgICAvKiBGRkE4ICovCi0gICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgVktfTlVNUEFENCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LCAvKiBGRkIwICovCi0gICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwotfTsKLSAgICAKLXN0YXRpYyBjb25zdCBpbnQgZnVuY3Rpb25fa2V5W10gPQotewotICAgIFZLX0YxLCBWS19GMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQkUgKi8KLSAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCi0gICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiAgICAgICAgICAgICAgLyogRkZDOCAqLwotfTsKLQotc3RhdGljIGNvbnN0IGludCBtb2RpZmllcl9rZXlbXSA9Ci17Ci0gICAgVktfU0hJRlQsIFZLX1NISUZULCBWS19DT05UUk9MLCBWS19DT05UUk9MLCBWS19DQVBJVEFMLCAwLCAvKiBGRkUxICovCi0gICAgVktfTUVOVSwgVktfTUVOVSwgVktfTUVOVSwgVktfTUVOVSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkU3ICovCi19OwotCi1zdGF0aWMgaW50IEFsdEdyTWFzazsKLXN0YXRpYyBpbnQgbWluX2tleWNvZGUsIG1heF9rZXljb2RlOwotc3RhdGljIGludCBrZXljMnZrZXkgWzI1Nl07Ci0vKiBGb3IgZXhhbXBsZSA6IGtleWMydmtleVsxMF0gaXMgdGhlIFZLXyogYXNzb2NpYXRlZCB3aXRoIGtleWNvZGUxMCAqLwotCi1zdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYS2V5RXZlbnQgKmUpCi17Ci0gIHN0YXRpYyBpbnQga2V5c3ltc19wZXJfa2V5Y29kZTsKLSAgaW50IGk7Ci0gIEtleVN5bSBrZXlzeW07Ci0KLSAgaWYgKCFrZXlzeW1zX3Blcl9rZXljb2RlKSAvKiBGaXJzdCB0aW1lIDogSW5pdGlhbGl6YXRpb24gKi8KLSAgICB7Ci0gICAgICBLZXlTeW0gKmtzcDsKLSAgICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwotICAgICAgS2V5Q29kZSAqa2NwOwotICAgICAgWEtleUV2ZW50IGUyOwotICAgICAgV09SRCB2a2V5LCBPRU12a2V5OwotCi0gICAgICBYRGlzcGxheUtleWNvZGVzKGUtPmRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKLSAgICAgIGtzcCA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZS0+ZGlzcGxheSwgbWluX2tleWNvZGUsCi0JCQkJbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KLQkgVGhlcmUgaXMgbm8gbmVlZCB0byBob2xkIGEgbG9jYWwgY29weSBvZiB0aGUga2V5c3ltcyB0YWJsZSAqLwotICAgICAgWEZyZWUoa3NwKTsKLSAgICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZS0+ZGlzcGxheSk7Ci0gICAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwotICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwotCXsKLQkgIGludCBqOwotCi0JICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQotCSAgICBpZiAoKmtjcCkKLQkgICAgICB7Ci0JCWludCBrOwotCi0JCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCi0JCSAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZS0+ZGlzcGxheSwgKmtjcCwgaykKLQkJICAgICAgPT0gWEtfTW9kZV9zd2l0Y2gpCi0JCSAgICB7Ci0JCSAgICAgIEFsdEdyTWFzayA9IDEgPDwgaTsKLQkJICAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiQWx0R3JNYXNrIGlzICV4XG4iLCBBbHRHck1hc2spOwotCQkgICAgfQotCSAgICAgIH0KLQl9Ci0gICAgICBYRnJlZU1vZGlmaWVybWFwKG1tcCk7Ci0JCi0JLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6Ci0JICoga2V5Y29kZSAtPiB2a2V5ICsgZXh0ZW5kZWQKLQkgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwotCi0gICAgICBlMi5kaXNwbGF5ID0gZS0+ZGlzcGxheTsKLSAgICAgIGUyLnN0YXRlID0gMDsKLQotICAgICAgT0VNdmtleSA9IDB4Yjk7IC8qIGZpcnN0IE9FTSB2aXJ0dWFsIGtleSBhdmFpbGFibGUgaXMgYmEgKi8KLSAgICAgIGZvciAoZTIua2V5Y29kZT1taW5fa2V5Y29kZTsgZTIua2V5Y29kZTw9bWF4X2tleWNvZGU7IGUyLmtleWNvZGUrKykKLQl7Ci0JICBYTG9va3VwU3RyaW5nKCZlMiwgTlVMTCwgMCwgJmtleXN5bSwgTlVMTCk7Ci0JICB2a2V5ID0gMDsKLQkgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KLQkgICAgewotCSAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KLQkJewotCQkgIGludCBrZXkgPSBrZXlzeW0gJiAweGZmOwotCQkKLQkJICBpZiAoa2V5ID49IDB4MDggJiYga2V5IDw9IDB4MUIpICAgICAgICAgLyogc3BlY2lhbCBrZXkgKi8KLQkJICAgIHZrZXkgPSBzcGVjaWFsX2tleVtrZXkgLSAweDA4XTsKLQkJICBlbHNlIGlmIChrZXkgPj0gMHg1MCAmJiBrZXkgPD0gMHg1NykgICAgLyogY3Vyc29yIGtleSAqLwotCQkgICAgdmtleSA9IGN1cnNvcl9rZXlba2V5IC0gMHg1MF07Ci0JCSAgZWxzZSBpZiAoa2V5ID49IDB4NjAgJiYga2V5IDw9IDB4NkIpICAgIC8qIG1pc2NlbGxhbmVvdXMga2V5ICovCi0JCSAgICB2a2V5ID0gbWlzY19rZXlba2V5IC0gMHg2MF07Ci0JCSAgZWxzZSBpZiAoa2V5ID49IDB4N0UgJiYga2V5IDw9IDB4QjkpICAgIC8qIGtleXBhZCBrZXkgKi8KLQkJICAgIHZrZXkgPSBrZXlwYWRfa2V5W2tleSAtIDB4N0VdOwotCQkgIGVsc2UgaWYgKGtleSA+PSAweEJFICYmIGtleSA8PSAweENEKSAgICAvKiBmdW5jdGlvbiBrZXkgKi8KLQkJICAgIHsKLQkJICAgICAgdmtleSA9IGZ1bmN0aW9uX2tleVtrZXkgLSAweEJFXTsKLQkJICAgICAgdmtleSB8PSAweDEwMDsgLyogc2V0IGV4dGVuZGVkIGJpdCAqLwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGtleSA+PSAweEUxICYmIGtleSA8PSAweEVBKSAgICAvKiBtb2RpZmllciBrZXkgKi8KLQkJICAgIHZrZXkgPSBtb2RpZmllcl9rZXlba2V5IC0gMHhFMV07Ci0JCSAgZWxzZSBpZiAoa2V5ID09IDB4RkYpICAgICAgICAgICAgICAgICAgIC8qIERFTCBrZXkgKi8KLQkJICAgIHZrZXkgPSBWS19ERUxFVEU7Ci0JCSAgLyogZXh0ZW5kZWQgbXVzdCBhbHNvIGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKLQkJICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCi0JCSAgICAga2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KLQkJICBzd2l0Y2ggKGtleXN5bSkKLQkJICAgIHsKLQkJICAgIGNhc2UgWEtfQ29udHJvbF9SIDoKLQkJICAgIGNhc2UgWEtfQWx0X1IgOgotCQkgICAgY2FzZSBYS19JbnNlcnQgOgotCQkgICAgY2FzZSBYS19EZWxldGUgOgotCQkgICAgY2FzZSBYS19Ib21lIDoKLQkJICAgIGNhc2UgWEtfRW5kIDoKLQkJICAgIGNhc2UgWEtfUHJpb3IgOgotCQkgICAgY2FzZSBYS19OZXh0IDoKLQkJICAgIGNhc2UgWEtfTGVmdCA6Ci0JCSAgICBjYXNlIFhLX1VwIDoKLQkJICAgIGNhc2UgWEtfUmlnaHQgOgotCQkgICAgY2FzZSBYS19Eb3duIDoKLQkJICAgIGNhc2UgWEtfS1BfRGl2aWRlIDoKLQkJICAgIGNhc2UgWEtfS1BfRW50ZXIgOgotCQkgICAgICB2a2V5IHw9IDB4MTAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCi0JCXsKLQkJICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7Ci0JCSAgaWYgKChrZXlzeW0gPj0gVktfMCAmJiBrZXlzeW0gPD0gVktfOSkKLQkJICAgICAgfHwgKGtleXN5bSA+PSBWS19BICYmIGtleXN5bSA8PSBWS19aKQotCQkgICAgICB8fCBrZXlzeW0gPT0gVktfU1BBQ0UpCi0JCSAgICB2a2V5ID0ga2V5c3ltOwotCQl9Ci0KLQkgICAgICBpZiAoIXZrZXkpCi0JCXsKLQkJICAvKiBPdGhlcnMga2V5czogbGV0J3MgYXNzaWduIE9FTSB2aXJ0dWFsIGtleSBjb2RlcyBpbiB0aGUgYWxsb3dlZCByYW5nZSwKLQkJICAgKiB0aGF0IGlzIChbMHhiYSwweGMwXSwgWzB4ZGIsMHhlNF0sIDB4ZTYgKGdpdmVuIHVwKSBldCBbMHhlOSwweGY1XSkgKi8KLQkJICBzd2l0Y2ggKCsrT0VNdmtleSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMHhjMSA6IE9FTXZrZXk9MHhkYjsgYnJlYWs7Ci0JCSAgICBjYXNlIDB4ZTUgOiBPRU12a2V5PTB4ZTk7IGJyZWFrOwotCQkgICAgY2FzZSAweGY2IDogT0VNdmtleT0weGY1OyBmcHJpbnRmKHN0ZGVyciwiTm8gbW9yZSBPRU0gdmtleSBhdmFpbGFibGUhXG4iKTsKLQkJICAgIH0KLQkJICAKLQkJICB2a2V5ID0gT0VNdmtleTsKLQkJICAKLQkJICBpZiAoZGVidWdnaW5nX2tleWJvYXJkKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmKHN0ZGRlYiwiT0VNIHNwZWNpZmljIHZpcnR1YWwga2V5ICVYIGFzc2lnbmVkIHRvIGtleWNvZGUgJVggOlxuICgiCi0JCQkgICAgICAsT0VNdmtleSxlMi5rZXljb2RlKTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKLQkJCXsKLQkJCSAgY2hhcgkqa3NuYW1lOwotCQkJICAKLQkJCSAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwotCQkJICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKLQkJCSAgaWYgKCFrc25hbWUpCi0JCQkgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKLQkJCSAgZnByaW50ZihzdGRkZWIsICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7Ci0JCQl9Ci0JCSAgICAgIGZwcmludGYoc3RkZGViLCAiKVxuIik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKLQl9IC8qIGZvciAqLwotICAgIH0gLyogSW5pdGlhbGl6YXRpb24gKi8KLSAgCi0gIHJldHVybiBrZXljMnZrZXlbZS0+a2V5Y29kZV07Ci0gIAotfQotCi1pbnQgRVZFTlRfVG9Bc2NpaShXT1JEIHdWaXJ0S2V5LCBXT1JEIHdTY2FuQ29kZSwgTFBTVFIgbHBLZXlTdGF0ZSwgCi0JTFBWT0lEIGxwQ2hhciwgV09SRCB3RmxhZ3MpIAotewotICAgIFhLZXlFdmVudCBlOwotICAgIEtleVN5bSBrZXlzeW07Ci0gICAgc3RhdGljIFhDb21wb3NlU3RhdHVzIGNzOwotICAgIGludCByZXQ7Ci0gICAgV09SRCBrZXljOwotCi0gICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKLSAgICBlLmtleWNvZGUgPSAwOwotICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsga2V5Yzw9bWF4X2tleWNvZGU7IGtleWMrKykKLSAgICAgIHsgLyogdGhpcyBjb3VsZCBiZSBzcGVlZCB1cCBieSBtYWtpbmcgYW5vdGhlciB0YWJsZSwgYW4gYXJyYXkgb2Ygc3RydWN0IHZrZXksa2V5Y29kZQotCSAqICh2a2V5IC0+IGtleWNvZGUpIHdpdGggdmtleXMgc29ydGVkIC4uLi4gYnV0IGl0IHRha2VzIG1lbW9yeSAoNTEyKjMgYnl0ZXMpISAgREYgKi8KLQlpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpPT0gd1ZpcnRLZXkpIC8qIG5vIG5lZWQgdG8gbWFrZSBhIG1vcmUgcHJlY2lzZSB0ZXN0ICh3aXRoIHRoZSBleHRlbmRlZCBiaXQgY29ycmVjdGx5IHNldCBhYm92ZSB3VmlydEtleSAuLi4gVksqIGFyZSBkaWZmZXJlbnQgZW5vdWdoLi4uICovCi0JICB7Ci0JICAgIGlmICgoZS5rZXljb2RlKSAmJiAoKHdWaXJ0S2V5PDB4MTApIHx8ICh3VmlydEtleT4weDEyKSkpIAotCQkvKiBpdCdzIG5vcm1hbCB0byBoYXZlIDIgc2hpZnQsIGNvbnRyb2wsIGFuZCBhbHQgISAqLwotCQlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiU3RyYW5nZSAuLi4gdGhlIGtleWNvZGVzICVYIGFuZCAlWCBhcmUgbWF0Y2hpbmchXG4iLAotCQkJCSBlLmtleWNvZGUsa2V5Yyk7Ci0JICAgIGUua2V5Y29kZSA9IGtleWM7Ci0JICB9Ci0gICAgICB9Ci0gICAgaWYgKCFlLmtleWNvZGUpIAotICAgICAgewotCWZwcmludGYoc3RkZXJyLCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsd1ZpcnRLZXkpOwotCXJldHVybiB3VmlydEtleTsgLyogd2hhdGV2ZXIgKi8KLSAgICAgIH0KLSAgICBlLnN0YXRlID0gMDsKLSAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQotCWUuc3RhdGUgfD0gU2hpZnRNYXNrOwotICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHg4MCkKLQllLnN0YXRlIHw9IExvY2tNYXNrOwotICAgIGlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkKLQlpZiAobHBLZXlTdGF0ZVtWS19NRU5VXSAmIDB4ODApCi0JICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwotCWVsc2UKLQkgICAgZS5zdGF0ZSB8PSBDb250cm9sTWFzazsKLSAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4ODApCi0JZS5zdGF0ZSB8PSBNb2QyTWFzazsKLSAgICBkcHJpbnRmX2tleShzdGRkZWIsICJFVkVOVF9Ub0FzY2lpKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAlWFxuIiwKLQkJd1ZpcnRLZXksIHdTY2FuQ29kZSwgZS5zdGF0ZSk7Ci0gICAgcmV0ID0gWExvb2t1cFN0cmluZygmZSwgbHBDaGFyLCAyLCAma2V5c3ltLCAmY3MpOwotICAgIGlmIChyZXQgPT0gMCkKLQl7Ci0JQllURSBkZWFkX2NoYXIgPSAwOwotCi0JKChjaGFyKilscENoYXIpWzFdID0gJ1wwJzsKLQlzd2l0Y2ggKGtleXN5bSkKLQkgICAgewotCSAgICBjYXNlIFhLX2RlYWRfdGlsZGUgOgotCSAgICBjYXNlIDB4MTAwMEZFN0UgOiAvKiBYZnJlZSdzIFhLX0R0aWxkZSAqLwotCQlkZWFkX2NoYXIgPSAnfic7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFhLX2RlYWRfYWN1dGUgOgotCSAgICBjYXNlIDB4MTAwMEZFMjcgOiAvKiBYZnJlZSdzIFhLX0RhY3V0ZV9hY2NlbnQgKi8KLQkJZGVhZF9jaGFyID0gMHhiNDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgWEtfZGVhZF9jaXJjdW1mbGV4IDoKLQkgICAgY2FzZSAweDEwMDBGRTVFIDogLyogWGZyZWUncyBYS19EY2lyY3VtZmxleF9hY2NlbnQgKi8KLQkJZGVhZF9jaGFyID0gJ14nOwotCQlicmVhazsKLQkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKLQkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCi0JCWRlYWRfY2hhciA9ICdgJzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgWEtfZGVhZF9kaWFlcmVzaXMgOgotCSAgICBjYXNlIDB4MTAwMEZFMjIgOiAvKiBYZnJlZSdzIFhLX0RkaWFlcmVzaXMgKi8KLQkJZGVhZF9jaGFyID0gMHhhODsKLQkJYnJlYWs7Ci0JICAgIH0KLQlpZiAoZGVhZF9jaGFyKQotCSAgICB7Ci0JICAgICooY2hhciopbHBDaGFyID0gZGVhZF9jaGFyOwotCSAgICByZXQgPSAtMTsKLQkgICAgfQotCWVsc2UKLQkgICAgewotCSAgICBjaGFyCSprc25hbWU7Ci0KLQkgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7Ci0JICAgIGlmICgha3NuYW1lKQotCQlrc25hbWUgPSAiTm8gTmFtZSI7Ci0JICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCi0JCXsKLQkJZnByaW50ZihzdGRlcnIsICJQbGVhc2UgcmVwb3J0IDogbm8gY2hhciBmb3Iga2V5c3ltICUwNGxYICglcykgOlxuIiwKLQkJCWtleXN5bSwga3NuYW1lKTsKLQkJZnByaW50ZihzdGRlcnIsICIgIHdWaXJ0S2V5ID0gJVgsIHdTY2FuQ29kZSA9ICVYLCBrZXljb2RlID0gJVgsIHN0YXRlID0gJVhcbiIsCi0JCQl3VmlydEtleSwgd1NjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgZHByaW50Zl9rZXkoc3RkZGViLCAiRVZFTlRfVG9Bc2NpaSBhYm91dCB0byByZXR1cm4gJWQgd2l0aCBjaGFyICV4XG4iLAotCQlyZXQsICooY2hhciopbHBDaGFyKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi10eXBlZGVmIHVuaW9uCi17Ci0gICAgc3RydWN0Ci0gICAgewotCXVuc2lnbmVkIGxvbmcgY291bnQgOiAxNjsKLQl1bnNpZ25lZCBsb25nIGNvZGUgOiA4OwotCXVuc2lnbmVkIGxvbmcgZXh0ZW5kZWQgOiAxOwotCXVuc2lnbmVkIGxvbmcgdW51c2VkIDogMjsKLQl1bnNpZ25lZCBsb25nIHdpbl9pbnRlcm5hbCA6IDI7Ci0JdW5zaWduZWQgbG9uZyBjb250ZXh0IDogMTsKLQl1bnNpZ25lZCBsb25nIHByZXZpb3VzIDogMTsKLQl1bnNpZ25lZCBsb25nIHRyYW5zaXRpb24gOiAxOwotICAgIH0gbHAxOwotICAgIHVuc2lnbmVkIGxvbmcgbHAyOwotfSBLRVlMUDsKLQotc3RhdGljIHZvaWQgRVZFTlRfa2V5KCBYS2V5RXZlbnQgKmV2ZW50ICkKLXsKLSAgICBjaGFyIFN0clsyNF07IAotICAgIFhDb21wb3NlU3RhdHVzIGNzOyAKLSAgICBLZXlTeW0ga2V5c3ltOwotICAgIFdPUkQgdmtleSA9IDA7Ci0gICAgS0VZTFAga2V5bHA7Ci0gICAgV09SRCBtZXNzYWdlOwotICAgIHN0YXRpYyBCT09MIGZvcmNlX2V4dGVuZGVkID0gRkFMU0U7IC8qIGhhY2sgZm9yIEFsdEdyIHRyYW5zbGF0aW9uICovCi0KLSAgICBpbnQgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBTdHIsIDEsICZrZXlzeW0sICZjcyk7Ci0KLSAgICBkcHJpbnRmX2tleShzdGRkZWIsICJFVkVOVF9rZXkgOiBzdGF0ZSA9ICVYXG4iLCBldmVudC0+c3RhdGUpOwotICAgIGlmIChrZXlzeW0gPT0gWEtfTW9kZV9zd2l0Y2gpCi0JewotCWRwcmludGZfa2V5KHN0ZGRlYiwgIkFsdCBHciBrZXkgZXZlbnQgcmVjZWl2ZWRcbiIpOwotCWV2ZW50LT5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShldmVudC0+ZGlzcGxheSwgWEtfQ29udHJvbF9MKTsKLQlkcHJpbnRmX2tleShzdGRkZWIsICJDb250cm9sX0wgaXMga2V5Y29kZSAweCV4XG4iLCBldmVudC0+a2V5Y29kZSk7Ci0JRVZFTlRfa2V5KGV2ZW50KTsKLQlldmVudC0+a2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZXZlbnQtPmRpc3BsYXksIFhLX0FsdF9MKTsKLQlkcHJpbnRmX2tleShzdGRkZWIsICJBbHRfTCBpcyBrZXljb2RlIDB4JXhcbiIsIGV2ZW50LT5rZXljb2RlKTsKLQlmb3JjZV9leHRlbmRlZCA9IFRSVUU7Ci0JRVZFTlRfa2V5KGV2ZW50KTsKLQlmb3JjZV9leHRlbmRlZCA9IEZBTFNFOwotCXJldHVybjsKLQl9Ci0KLSAgICBTdHJbYXNjaWlfY2hhcnNdID0gJ1wwJzsKLSAgICBpZiAoZGVidWdnaW5nX2tleSkKLQl7Ci0JY2hhcgkqa3NuYW1lOwotCi0Ja3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7Ci0JaWYgKCFrc25hbWUpCi0JICAgIGtzbmFtZSA9ICJObyBOYW1lIjsKLQlmcHJpbnRmKHN0ZGRlYiwgIiVzIDoga2V5c3ltPSVsWCAoJXMpLCBhc2NpaSBjaGFycz0ldSAvICVYIC8gJyVzJ1xuIiwgCi0JICAgIGV2ZW50X25hbWVzW2V2ZW50LT50eXBlXSwga2V5c3ltLCBrc25hbWUsCi0JICAgIGFzY2lpX2NoYXJzLCBTdHJbMF0gJiAweGZmLCBTdHIpOwotCX0KLQotI2lmIDAKLSAgICAvKiBDdHJsLUFsdC1SZXR1cm4gZW50ZXJzIHRoZSBkZWJ1Z2dlciAqLwotICAgIGlmICgoa2V5c3ltID09IFhLX1JldHVybikgJiYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSAmJgotICAgICAgICAoZXZlbnQtPnN0YXRlICYgQ29udHJvbE1hc2spICYmIChldmVudC0+c3RhdGUgJiBNb2QxTWFzaykpCi0gICAgICAgIERFQlVHX0VudGVyRGVidWdnZXIoKTsKLSNlbmRpZgotCi0gICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoZXZlbnQpOwotICAgIGlmIChmb3JjZV9leHRlbmRlZCkgdmtleSB8PSAweDEwMDsKLQotICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgImtleWNvZGUgMHgleCBjb252ZXJ0ZWQgdG8gdmtleSAweCV4XG4iLAotCQkgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwotCi0gICAga2V5bHAubHAxLmNvdW50ID0gMTsKLSAgICBrZXlscC5scDEuY29kZSA9IExPQllURShldmVudC0+a2V5Y29kZSkgLSA4OwotICAgIGtleWxwLmxwMS5leHRlbmRlZCA9ICh2a2V5ICYgMHgxMDAgPyAxIDogMCk7Ci0gICAga2V5bHAubHAxLndpbl9pbnRlcm5hbCA9IDA7IC8qIHRoaXMgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIGRpYWxvZ3MsIAotCQkJCSogZG9uJ3QgcmVtZW1iZXIgd2hlcmUgSSByZWFkIGl0IC0gQUsgKi8KLQkJCQkvKiBpdCdzICcxJyB1bmRlciB3aW5kb3dzLCB3aGVuIGEgZGlhbG9nIGJveCBhcHBlYXJzCi0JCQkJICogYW5kIHlvdSBwcmVzcyBvbmUgb2YgdGhlIHVuZGVybGluZWQga2V5cyAtIERGKi8KLSAgICB2a2V5ICY9IDB4ZmY7Ci0gICAgaWYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKQotICAgIHsKLQlrZXlscC5scDEucHJldmlvdXMgPSAoSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkgIT0gMDsKLSAgICAgICAgaWYgKCEoSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkpCi0gICAgICAgICAgICBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gXj0gMHgwMTsKLQlJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gfD0gMHg4MDsKLQlrZXlscC5scDEudHJhbnNpdGlvbiA9IDA7Ci0JbWVzc2FnZSA9IChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKQotCQkgICAgJiYgIShJbnB1dEtleVN0YXRlVGFibGVbVktfQ09OVFJPTF0gJiAweDgwKQotCQkJID8gV01fU1lTS0VZRE9XTiA6IFdNX0tFWURPV047Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JVUlOVCBzeXNLZXkgPSAoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdICYgMHg4MCkKLQkJCSYmICEoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCkKLQkJCSYmIChmb3JjZV9leHRlbmRlZCA9PSBGQUxTRSk7IC8qIGZvciBBbHQgZnJvbSBBbHRHciAqLwotCi0JSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldICY9IH4weDgwOyAKLQlrZXlscC5scDEucHJldmlvdXMgPSAxOwotCWtleWxwLmxwMS50cmFuc2l0aW9uID0gMTsKLQltZXNzYWdlID0gc3lzS2V5ID8gV01fU1lTS0VZVVAgOiBXTV9LRVlVUDsKLSAgICB9Ci0gICAga2V5bHAubHAxLmNvbnRleHQgPSAoIChldmVudC0+c3RhdGUgJiBNb2QxTWFzaykgIHx8IAotCQkJICAoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdICYgMHg4MCkpID8gMSA6IDA7Ci0gICAgZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICB3UGFyYW09JTA0WCwgbFBhcmFtPSUwOGxYXG4iLCAKLQkJdmtleSwga2V5bHAubHAyICk7Ci0gICAgZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICBJbnB1dEtleVN0YXRlPSVYXG4iLAotCQlJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOwotCi0gICAgaGFyZHdhcmVfZXZlbnQoIG1lc3NhZ2UsIHZrZXksIGtleWxwLmxwMiwgZXZlbnQtPnhfcm9vdCAtIGRlc2t0b3BYLAotCSAgICBldmVudC0+eV9yb290IC0gZGVza3RvcFksIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCAwICk7CisgICAgS0VZQk9BUkRfSGFuZGxlRXZlbnQoIGV2ZW50ICk7CiB9CiAKIApAQCAtOTMzLDggKzUyNCw4IEBACiBzdGF0aWMgdm9pZCBFVkVOVF9Gb2N1c0luIChIV05EIGh3bmQsIFhGb2N1c0NoYW5nZUV2ZW50ICpldmVudCApCiB7CiAgICAgaWYgKGV2ZW50LT5kZXRhaWwgPT0gTm90aWZ5UG9pbnRlcikgcmV0dXJuOwotICAgIGlmIChod25kICE9IEdldEFjdGl2ZVdpbmRvdygpKSBXSU5QT1NfQ2hhbmdlQWN0aXZlV2luZG93KCBod25kLCBGQUxTRSApOwotICAgIGlmICgoaHduZCAhPSBHZXRGb2N1czMyKCkpICYmICFJc0NoaWxkKCBod25kLCBHZXRGb2N1czMyKCkpKQorICAgIGlmIChod25kICE9IEdldEFjdGl2ZVdpbmRvdzMyKCkpIFdJTlBPU19DaGFuZ2VBY3RpdmVXaW5kb3coIGh3bmQsIEZBTFNFICk7CisgICAgaWYgKChod25kICE9IEdldEZvY3VzMzIoKSkgJiYgIUlzQ2hpbGQzMiggaHduZCwgR2V0Rm9jdXMzMigpKSkKICAgICAgICAgU2V0Rm9jdXMzMiggaHduZCApOwogfQogCkBAIC05NDcsOCArNTM4LDggQEAKIHN0YXRpYyB2b2lkIEVWRU5UX0ZvY3VzT3V0KCBIV05EIGh3bmQsIFhGb2N1c0NoYW5nZUV2ZW50ICpldmVudCApCiB7CiAgICAgaWYgKGV2ZW50LT5kZXRhaWwgPT0gTm90aWZ5UG9pbnRlcikgcmV0dXJuOwotICAgIGlmIChod25kID09IEdldEFjdGl2ZVdpbmRvdygpKSBXSU5QT1NfQ2hhbmdlQWN0aXZlV2luZG93KCAwLCBGQUxTRSApOwotICAgIGlmICgoaHduZCA9PSBHZXRGb2N1czMyKCkpIHx8IElzQ2hpbGQoIGh3bmQsIEdldEZvY3VzMzIoKSkpCisgICAgaWYgKGh3bmQgPT0gR2V0QWN0aXZlV2luZG93MzIoKSkgV0lOUE9TX0NoYW5nZUFjdGl2ZVdpbmRvdyggMCwgRkFMU0UgKTsKKyAgICBpZiAoKGh3bmQgPT0gR2V0Rm9jdXMzMigpKSB8fCBJc0NoaWxkMzIoIGh3bmQsIEdldEZvY3VzMzIoKSkpCiAgICAgICAgIFNldEZvY3VzMzIoIDAgKTsKIH0KIApAQCAtMTI3MSw3ICs4NjIsNyBAQAogewogICAgIEhXTkQzMiBod25kRm9jdXMgPSBHZXRGb2N1czMyKCk7CiAKLSAgICBpZiAoaHduZEZvY3VzICYmIElzQ2hpbGQoIGhXbmQsIGh3bmRGb2N1cyApKQorICAgIGlmIChod25kRm9jdXMgJiYgSXNDaGlsZDMyKCBoV25kLCBod25kRm9jdXMgKSkKICAgICAgIEZPQ1VTX1NldFhGb2N1cyggKEhXTkQzMilod25kRm9jdXMgKTsKIAogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZm9jdXMuYyBiL3dpbmRvd3MvZm9jdXMuYwppbmRleCA3ZDI4NGQwLi5mNDBjNWRiIDEwMDY0NAotLS0gYS93aW5kb3dzL2ZvY3VzLmMKKysrIGIvd2luZG93cy9mb2N1cy5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgICAgcmV0dXJuIDA7CiAKICAgICAgICAgLyogYWN0aXZhdGUgaHduZFRvcCBpZiBuZWVkZWQuICovCi0JaWYgKGh3bmRUb3AgIT0gR2V0QWN0aXZlV2luZG93KCkpCisJaWYgKGh3bmRUb3AgIT0gR2V0QWN0aXZlV2luZG93MzIoKSkKIAl7CiAJICAgIGlmICghV0lOUE9TX1NldEFjdGl2ZVdpbmRvdyhod25kVG9wLCAwLCAwKSkgcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mva2V5Ym9hcmQuYyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwppbmRleCAxYTQxOGZkLi4xMmMzZmNlIDEwMDY0NAotLS0gYS93aW5kb3dzL2tleWJvYXJkLmMKKysrIGIvd2luZG93cy9rZXlib2FyZC5jCkBAIC0zLDIyICszLDQyNCBAQAogICoKICAqIENvcHlyaWdodCAxOTkzIEJvYiBBbXN0YWR0CiAgKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUgCisgKiBDb3B5cmlnaHQgMTk5NyBEYXZpZCBGYXVyZQorICoKICAqLwotCisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAiYWNjZWwuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWHJlc291cmNlLmg+CisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjaW5jbHVkZSA8WDExL1hhdG9tLmg+CiAKLWV4dGVybiBCT09MIE1vdXNlQnV0dG9uc1N0YXRlc1szXTsKLWV4dGVybiBCT09MIEFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzNdOwotZXh0ZXJuIEJZVEUgSW5wdXRLZXlTdGF0ZVRhYmxlWzI1Nl07CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgImtleWJvYXJkLmgiCisjaW5jbHVkZSAibWVzc2FnZS5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisvKiAjZGVmaW5lIERFQlVHX0tFWUJPQVJEICovCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAiYWNjZWwuaCIKKworQk9PTDMyIE1vdXNlQnV0dG9uc1N0YXRlc1szXTsKK0JPT0wzMiBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1szXTsKK0JZVEUgSW5wdXRLZXlTdGF0ZVRhYmxlWzI1Nl07CitCWVRFIFF1ZXVlS2V5U3RhdGVUYWJsZVsyNTZdOwogQllURSBBc3luY0tleVN0YXRlVGFibGVbMjU2XTsKIAotZXh0ZXJuIEJZVEUgUXVldWVLZXlTdGF0ZVRhYmxlWzI1Nl07CitzdGF0aWMgaW50IE51bUxvY2tNYXNrOworc3RhdGljIGludCBBbHRHck1hc2s7CitzdGF0aWMgaW50IG1pbl9rZXljb2RlLCBtYXhfa2V5Y29kZTsKK3N0YXRpYyBpbnQga2V5YzJ2a2V5WzI1Nl07CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBzdHJ1Y3QKKyAgICB7CisJdW5zaWduZWQgbG9uZyBjb3VudCA6IDE2OworCXVuc2lnbmVkIGxvbmcgY29kZSA6IDg7CisJdW5zaWduZWQgbG9uZyBleHRlbmRlZCA6IDE7CisJdW5zaWduZWQgbG9uZyB1bnVzZWQgOiAyOworCXVuc2lnbmVkIGxvbmcgd2luX2ludGVybmFsIDogMjsKKwl1bnNpZ25lZCBsb25nIGNvbnRleHQgOiAxOworCXVuc2lnbmVkIGxvbmcgcHJldmlvdXMgOiAxOworCXVuc2lnbmVkIGxvbmcgdHJhbnNpdGlvbiA6IDE7CisgICAgfSBscDE7CisgICAgdW5zaWduZWQgbG9uZyBscDI7Cit9IEtFWUxQOworCit0eXBlZGVmIGVudW0ge09GRixJTlRFUk0sT059IFRvZ2dsZUtleVN0YXRlOworCisvKiBLZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZXMgKi8KK3N0YXRpYyBjb25zdCBpbnQgc3BlY2lhbF9rZXlbXSA9Cit7CisgICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLworICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KKyAgICAwLCAwLCAwLCBWS19FU0NBUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCit9OworCitzdGF0aWMgY29uc3QgaW50IGN1cnNvcl9rZXlbXSA9Cit7CisgICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ORVhULCBWS19FTkQgICAgICAgICAgLyogRkY1MCAqLworfTsKKworc3RhdGljIGNvbnN0IGludCBtaXNjX2tleVtdID0KK3sKKyAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsIDAsIDAsIDAsICAvKiBGRjYwICovCisgICAgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIFZLX01FTlUgICAgICAgICAgICAgICAgICAgICAgLyogRkY2OCAqLworfTsKKworc3RhdGljIGNvbnN0IGludCBrZXlwYWRfa2V5W10gPQoreworICAgIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBGRjdFICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLworICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KKyAgICAwLCAwLCAwLCAwLCAwLCBWS19IT01FLCBWS19MRUZULCBWS19VUCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCisgICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsIDAsCisJCQkJIFZLX0lOU0VSVCwgVktfREVMRVRFLCAgICAgICAgICAvKiBGRjk4ICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLworICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwgICAgICAgICAgIC8qIEZGQTggKi8KKyAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCBWS19OVU1QQUQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsIC8qIEZGQjAgKi8KKyAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCit9OworICAgIAorc3RhdGljIGNvbnN0IGludCBmdW5jdGlvbl9rZXlbXSA9Cit7CisgICAgVktfRjEsIFZLX0YyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCRSAqLworICAgIFZLX0YzLCBWS19GNCwgVktfRjUsIFZLX0Y2LCBWS19GNywgVktfRjgsIFZLX0Y5LCBWS19GMTAsICAgIC8qIEZGQzAgKi8KKyAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2ICAgICAgICAgICAgICAvKiBGRkM4ICovCit9OworCitzdGF0aWMgY29uc3QgaW50IG1vZGlmaWVyX2tleVtdID0KK3sKKyAgICBWS19TSElGVCwgVktfU0hJRlQsIFZLX0NPTlRST0wsIFZLX0NPTlRST0wsIFZLX0NBUElUQUwsIDAsIC8qIEZGRTEgKi8KKyAgICBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTcgKi8KK307CisKKworc3RhdGljIFdPUkQgRVZFTlRfZXZlbnRfdG9fdmtleSggWEtleUV2ZW50ICplKQoreworICAgIEtleVN5bSBrZXlzeW07CisKKyAgICBYTG9va3VwU3RyaW5nKGUsIE5VTEwsIDAsICZrZXlzeW0sIE5VTEwpOworCisgICAgaWYgKChrZXlzeW0gPj0gMHhGRkFFKSAmJiAoa2V5c3ltIDw9IDB4RkZCOSkgJiYgKGUtPnN0YXRlICYgTnVtTG9ja01hc2spKSAKKyAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKKyAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBOdW1Mb2NrIHN0YXRlICovCisgICAgICAgIHJldHVybiBrZXlwYWRfa2V5WyhrZXlzeW0gJiAweEZGKSAtIDB4N0VdOworCisgICAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlLRVlCT0FSRF9Jbml0CisgKi8KK0JPT0wzMiBLRVlCT0FSRF9Jbml0KHZvaWQpCit7CisgICAgaW50IGksIGtleXN5bXNfcGVyX2tleWNvZGU7CisgICAgS2V5U3ltICprc3A7CisgICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CisgICAgS2V5U3ltIGtleXN5bTsKKyAgICBLZXlDb2RlICprY3A7CisgICAgWEtleUV2ZW50IGUyOworICAgIFdPUkQgdmtleSwgT0VNdmtleTsKKworICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOworICAgIGtzcCA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfa2V5Y29kZSArIDEgLSBtaW5fa2V5Y29kZSwgJmtleXN5bXNfcGVyX2tleWNvZGUpOworICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KKyAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIGhvbGQgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlzeW1zIHRhYmxlICovCisgICAgWEZyZWUoa3NwKTsKKyAgICBtbXAgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGRpc3BsYXkpOworICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLworICAgIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQorCSAgICBpZiAoKmtjcCkKKyAgICAgICAgICAgIHsKKwkJaW50IGs7CisgICAgICAgICAgICAgICAgCisJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCisgICAgICAgICAgICAgICAgICAgIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX01vZGVfc3dpdGNoKQorCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWx0R3JNYXNrID0gMSA8PCBpOworICAgICAgICAgICAgICAgICAgICAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiQWx0R3JNYXNrIGlzICV4XG4iLCBBbHRHck1hc2spOworCQkgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX051bV9Mb2NrKQorCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJOdW1Mb2NrTWFzayBpcyAleFxuIiwgTnVtTG9ja01hc2spOworCQkgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKyAgICBYRnJlZU1vZGlmaWVybWFwKG1tcCk7CisKKyAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKKyAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBleHRlbmRlZAorICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCisKKyAgICBlMi5kaXNwbGF5ID0gZGlzcGxheTsKKyAgICBlMi5zdGF0ZSA9IDA7CisKKyAgICBPRU12a2V5ID0gMHhiOTsgLyogZmlyc3QgT0VNIHZpcnR1YWwga2V5IGF2YWlsYWJsZSBpcyBiYSAqLworICAgIGZvciAoZTIua2V5Y29kZT1taW5fa2V5Y29kZTsgZTIua2V5Y29kZTw9bWF4X2tleWNvZGU7IGUyLmtleWNvZGUrKykKKyAgICB7CisgICAgICAgIFhMb29rdXBTdHJpbmcoJmUyLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKKyAgICAgICAgdmtleSA9IDA7CisgICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBrZXkgPSBrZXlzeW0gJiAweGZmOworCQkKKyAgICAgICAgICAgICAgICBpZiAoa2V5ID49IDB4MDggJiYga2V5IDw9IDB4MUIpICAgICAgICAgLyogc3BlY2lhbCBrZXkgKi8KKwkJICAgIHZrZXkgPSBzcGVjaWFsX2tleVtrZXkgLSAweDA4XTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPj0gMHg1MCAmJiBrZXkgPD0gMHg1NykgICAgLyogY3Vyc29yIGtleSAqLworCQkgICAgdmtleSA9IGN1cnNvcl9rZXlba2V5IC0gMHg1MF07CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID49IDB4NjAgJiYga2V5IDw9IDB4NkIpICAgIC8qIG1pc2NlbGxhbmVvdXMga2V5ICovCisJCSAgICB2a2V5ID0gbWlzY19rZXlba2V5IC0gMHg2MF07CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID49IDB4N0UgJiYga2V5IDw9IDB4QjkpICAgIC8qIGtleXBhZCBrZXkgKi8KKwkJICAgIHZrZXkgPSBrZXlwYWRfa2V5W2tleSAtIDB4N0VdOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA+PSAweEJFICYmIGtleSA8PSAweENEKSAgICAvKiBmdW5jdGlvbiBrZXkgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBmdW5jdGlvbl9rZXlba2V5IC0gMHhCRV07CisgICAgICAgICAgICAgICAgICAgIHZrZXkgfD0gMHgxMDA7IC8qIHNldCBleHRlbmRlZCBiaXQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID49IDB4RTEgJiYga2V5IDw9IDB4RUEpICAgIC8qIG1vZGlmaWVyIGtleSAqLworCQkgICAgdmtleSA9IG1vZGlmaWVyX2tleVtrZXkgLSAweEUxXTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXkgPT0gMHhGRikgICAgICAgICAgICAgICAgICAgLyogREVMIGtleSAqLworCQkgICAgdmtleSA9IFZLX0RFTEVURTsKKyAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGFsc28gYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAorICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKKyAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLworICAgICAgICAgICAgICAgIC8qIEZJWE1FIHNob3VsZCB3ZSBzZXQgZXh0ZW5kZWQgYml0IGZvciBOdW1Mb2NrID8gTXkKKyAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCisgICAgICAgICAgICAgICAgc3dpdGNoIChrZXlzeW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgWEtfQ29udHJvbF9SIDoKKyAgICAgICAgICAgICAgICBjYXNlIFhLX0FsdF9SIDoKKyAgICAgICAgICAgICAgICBjYXNlIFhLX0luc2VydCA6CisgICAgICAgICAgICAgICAgY2FzZSBYS19EZWxldGUgOgorICAgICAgICAgICAgICAgIGNhc2UgWEtfSG9tZSA6CisgICAgICAgICAgICAgICAgY2FzZSBYS19FbmQgOgorICAgICAgICAgICAgICAgIGNhc2UgWEtfUHJpb3IgOgorICAgICAgICAgICAgICAgIGNhc2UgWEtfTmV4dCA6CisgICAgICAgICAgICAgICAgY2FzZSBYS19MZWZ0IDoKKyAgICAgICAgICAgICAgICBjYXNlIFhLX1VwIDoKKyAgICAgICAgICAgICAgICBjYXNlIFhLX1JpZ2h0IDoKKyAgICAgICAgICAgICAgICBjYXNlIFhLX0Rvd24gOgorICAgICAgICAgICAgICAgIGNhc2UgWEtfS1BfRGl2aWRlIDoKKyAgICAgICAgICAgICAgICBjYXNlIFhLX0tQX0VudGVyIDoKKyAgICAgICAgICAgICAgICAgICAgdmtleSB8PSAweDEwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CisgICAgICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gVktfMCAmJiBrZXlzeW0gPD0gVktfOSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBWS19BICYmIGtleXN5bSA8PSBWS19aKQorICAgICAgICAgICAgICAgICAgICB8fCBrZXlzeW0gPT0gVktfU1BBQ0UpCisJCSAgICB2a2V5ID0ga2V5c3ltOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXZrZXkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogT3RoZXJzIGtleXM6IGxldCdzIGFzc2lnbiBPRU0gdmlydHVhbCBrZXkgY29kZXMgaW4gdGhlIGFsbG93ZWQgcmFuZ2UsCisgICAgICAgICAgICAgICAgICogdGhhdCBpcyAoWzB4YmEsMHhjMF0sIFsweGRiLDB4ZTRdLCAweGU2IChnaXZlbiB1cCkgZXQgWzB4ZTksMHhmNV0pICovCisgICAgICAgICAgICAgICAgc3dpdGNoICgrK09FTXZrZXkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMHhjMSA6IE9FTXZrZXk9MHhkYjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweGU1IDogT0VNdmtleT0weGU5OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IGZwcmludGYoc3RkZXJyLCJObyBtb3JlIE9FTSB2a2V5IGF2YWlsYWJsZSFcbiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZrZXkgPSBPRU12a2V5OworCQkgIAorICAgICAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfa2V5Ym9hcmQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGRlYiwiT0VNIHNwZWNpZmljIHZpcnR1YWwga2V5ICVYIGFzc2lnbmVkIHRvIGtleWNvZGUgJVggOlxuICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLE9FTXZrZXksZTIua2V5Y29kZSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIJKmtzbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtzbmFtZSkKKwkJCSAgICBrc25hbWUgPSAiTm9TeW1ib2wiOworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRkZWIsICIlbFggKCVzKSAiLCBrZXlzeW0sIGtzbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRkZWIsICIpXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKKyAgICB9IC8qIGZvciAqLworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEtFWUJPQVJEX0hhbmRsZUV2ZW50CisgKgorICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKKyAqLwordm9pZCBLRVlCT0FSRF9IYW5kbGVFdmVudCggWEtleUV2ZW50ICpldmVudCApCit7CisgICAgY2hhciBTdHJbMjRdOyAKKyAgICBYQ29tcG9zZVN0YXR1cyBjczsgCisgICAgS2V5U3ltIGtleXN5bTsKKyAgICBXT1JEIHZrZXkgPSAwOworICAgIEtFWUxQIGtleWxwOworICAgIFdPUkQgbWVzc2FnZTsKKyAgICBzdGF0aWMgQk9PTCBmb3JjZV9leHRlbmRlZCA9IEZBTFNFOyAvKiBoYWNrIGZvciBBbHRHciB0cmFuc2xhdGlvbiAqLworICAgIEJPT0wgRG9udFByb3BhZ2F0ZTsKKyAgICBUb2dnbGVLZXlTdGF0ZSAqIFN0YXRlOworICAgIHN0YXRpYyBUb2dnbGVLZXlTdGF0ZSBOdW1TdGF0ZT1PRkYsIENhcHNTdGF0ZT1PRkY7CisKKyAgICBpbnQgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBTdHIsIDEsICZrZXlzeW0sICZjcyk7CisKKyAgICBkcHJpbnRmX2tleShzdGRkZWIsICJFVkVOVF9rZXkgOiBzdGF0ZSA9ICVYXG4iLCBldmVudC0+c3RhdGUpOworICAgIGlmIChrZXlzeW0gPT0gWEtfTW9kZV9zd2l0Y2gpCisJeworCWRwcmludGZfa2V5KHN0ZGRlYiwgIkFsdCBHciBrZXkgZXZlbnQgcmVjZWl2ZWRcbiIpOworCWV2ZW50LT5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShldmVudC0+ZGlzcGxheSwgWEtfQ29udHJvbF9MKTsKKwlkcHJpbnRmX2tleShzdGRkZWIsICJDb250cm9sX0wgaXMga2V5Y29kZSAweCV4XG4iLCBldmVudC0+a2V5Y29kZSk7CisJS0VZQk9BUkRfSGFuZGxlRXZlbnQoZXZlbnQpOworCWV2ZW50LT5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShldmVudC0+ZGlzcGxheSwgWEtfQWx0X0wpOworCWRwcmludGZfa2V5KHN0ZGRlYiwgIkFsdF9MIGlzIGtleWNvZGUgMHgleFxuIiwgZXZlbnQtPmtleWNvZGUpOworCWZvcmNlX2V4dGVuZGVkID0gVFJVRTsKKwlLRVlCT0FSRF9IYW5kbGVFdmVudChldmVudCk7CisJZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsKKwlyZXR1cm47CisJfQorCisgICAgU3RyW2FzY2lpX2NoYXJzXSA9ICdcMCc7CisgICAgaWYgKGRlYnVnZ2luZ19rZXkpCisJeworCWNoYXIJKmtzbmFtZTsKKworCWtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOworCWlmICgha3NuYW1lKQorCSAgICBrc25hbWUgPSAiTm8gTmFtZSI7CisJZnByaW50ZihzdGRkZWIsICIlcyA6IGtleXN5bT0lbFggKCVzKSwgYXNjaWkgY2hhcnM9JXUgLyAlWCAvICclcydcbiIsIAorICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAorICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdICYgMHhmZiwgU3RyKTsKKwl9CisKKyNpZiAwCisgICAgLyogQ3RybC1BbHQtUmV0dXJuIGVudGVycyB0aGUgZGVidWdnZXIgKi8KKyAgICBpZiAoKGtleXN5bSA9PSBYS19SZXR1cm4pICYmIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgJiYKKyAgICAgICAgKGV2ZW50LT5zdGF0ZSAmIENvbnRyb2xNYXNrKSAmJiAoZXZlbnQtPnN0YXRlICYgTW9kMU1hc2spKQorICAgICAgICBERUJVR19FbnRlckRlYnVnZ2VyKCk7CisjZW5kaWYKKworICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KGV2ZW50KTsKKyAgICBpZiAoZm9yY2VfZXh0ZW5kZWQpIHZrZXkgfD0gMHgxMDA7CisKKyAgICBkcHJpbnRmX2tleShzdGRkZWIsICJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKKwkJICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKKworICAgIGlmICh2a2V5KQorICAgIHsKKyAgICBrZXlscC5scDEuY291bnQgPSAxOworICAgIGtleWxwLmxwMS5jb2RlID0gTE9CWVRFKGV2ZW50LT5rZXljb2RlKSAtIDg7CisgICAga2V5bHAubHAxLmV4dGVuZGVkID0gKHZrZXkgJiAweDEwMCA/IDEgOiAwKTsKKyAgICBrZXlscC5scDEud2luX2ludGVybmFsID0gMDsgLyogdGhpcyBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggZGlhbG9ncywgCisJCQkJKiBkb24ndCByZW1lbWJlciB3aGVyZSBJIHJlYWQgaXQgLSBBSyAqLworCQkJCS8qIGl0J3MgJzEnIHVuZGVyIHdpbmRvd3MsIHdoZW4gYSBkaWFsb2cgYm94IGFwcGVhcnMKKwkJCQkgKiBhbmQgeW91IHByZXNzIG9uZSBvZiB0aGUgdW5kZXJsaW5lZCBrZXlzIC0gREYqLworICAgIHZrZXkgJj0gMHhmZjsKKyAgICBpZiAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCisgICAgeworCWtleWxwLmxwMS5wcmV2aW91cyA9IChJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gJiAweDgwKSAhPSAwOworICAgICAgICBpZiAoIShJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gJiAweDgwKSkKKyAgICAgICAgICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSBePSAweDAxOworCUlucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSB8PSAweDgwOworCWtleWxwLmxwMS50cmFuc2l0aW9uID0gMDsKKwltZXNzYWdlID0gKElucHV0S2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApCisJCSAgICAmJiAhKElucHV0S2V5U3RhdGVUYWJsZVtWS19DT05UUk9MXSAmIDB4ODApCisJCQkgPyBXTV9TWVNLRVlET1dOIDogV01fS0VZRE9XTjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlVSU5UIHN5c0tleSA9IChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKQorCQkJJiYgIShJbnB1dEtleVN0YXRlVGFibGVbVktfQ09OVFJPTF0gJiAweDgwKQorCQkJJiYgKGZvcmNlX2V4dGVuZGVkID09IEZBTFNFKTsgLyogZm9yIEFsdCBmcm9tIEFsdEdyICovCisKKwlJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4ODA7IAorCWtleWxwLmxwMS5wcmV2aW91cyA9IDE7CisJa2V5bHAubHAxLnRyYW5zaXRpb24gPSAxOworCW1lc3NhZ2UgPSBzeXNLZXkgPyBXTV9TWVNLRVlVUCA6IFdNX0tFWVVQOworICAgIH0KKyAgICBrZXlscC5scDEuY29udGV4dCA9ICggKGV2ZW50LT5zdGF0ZSAmIE1vZDFNYXNrKSAgfHwgCisJCQkgIChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKSkgPyAxIDogMDsKKyAgICBEb250UHJvcGFnYXRlID0gRkFMU0U7CisgICAgaWYgKCh2a2V5PT1WS19OVU1MT0NLKSB8fCAodmtleT09VktfQ0FQSVRBTCkpCisgICAgICB7CisJCisJc3dpdGNoICgqKCBTdGF0ZSA9ICh2a2V5PT1WS19OVU1MT0NLPyAmTnVtU3RhdGUgOiAmQ2Fwc1N0YXRlKSkpIHsKKwljYXNlIE9GRjppZiAoZXZlbnQtPnR5cGU9PUtleVByZXNzKQorCSAgeworCSAgICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiT0ZGICsgS2V5cHJlc3MgPT4gRE9XTiBhbmQgVVAgZ2VuZXJhdGVkLiBcbiIpOworCSAgICBoYXJkd2FyZV9ldmVudCggbWVzc2FnZSwgdmtleSwga2V5bHAubHAyLCBldmVudC0+eF9yb290IC0gZGVza3RvcFgsCisJCQkgICAgZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLCBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCk7CisJICAgIG1lc3NhZ2UgKz0gV01fS0VZVVAgLSBXTV9LRVlET1dOOyAvKiBjcmVhdGUgYSAqVVAgbWVzc2FnZSBmcm9tIHRoZSAqRE9XTiBvbmUgKi8KKwkgICAga2V5bHAubHAxLnByZXZpb3VzID0gMTsKKwkgICAga2V5bHAubHAxLnRyYW5zaXRpb24gPSAxOworCSAgICAqU3RhdGUgPSBJTlRFUk07CisJICB9IGJyZWFrOworCWNhc2UgSU5URVJNOgorCSAgLyogVGhlICdJTlRFUk0nIHN0YXRlIG1lYW5zIDoganVzdCBhZnRlciBhICdwcmVzcycgZXZlbnQsIGlmIGEgJ3JlbGVhc2UnIGV2ZW50IGNvbWVzLAorCSAgICAgZG9uJ3QgInByb3BhZ2F0ZSIgaXQuIEl0J3MgZnJvbSB0aGUgc2FtZSBrZXkgcHJlc3MuIFRoZW4gdGhlIHN0YXRlIGdvZXMgdG8gT04uCisJICAgICBBbmQgZnJvbSB0aGVyZSwgYSAncmVsZWFzZScgZXZlbnQgd2lsbCBzd2l0Y2ggb2ZmIHRoZSB0b2dnbGUga2V5LiAqLworCSAgRG9udFByb3BhZ2F0ZSA9IFRSVUU7CisJICAqU3RhdGU9T047CisJICBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gfD0gMHgwMTsgLyogZm9yY2UgdG8gJ29uJyBldmVudCBpZiBhIHJlbGVhc2UgZXZlbnQgd2FzIHJlY2VpdmVkICovCisJICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiSU5URVJNIDogZG9uXCd0IHByb3BhZ2F0ZSBwcmVzcy9yZWxlYXNlIG9mIHRvZ2dsZSBrZXkuIElucHV0S2V5U3RhdGVUYWJsZVslI3hdID0gJSN4Iix2a2V5LElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CisJICBicmVhazsKKwljYXNlIE9OOiBpZiAoZXZlbnQtPnR5cGU9PUtleVByZXNzKSBEb250UHJvcGFnYXRlID0gVFJVRTsgZWxzZQorCSAgeworCSAgICBLRVlMUCBkb3dua2V5bHAgPSBrZXlscDsKKwkgICAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIk9OICsgS2V5UmVsZWFzZSA9PiBnZW5lcmF0aW5nIERPV04gbXNnIGJlZm9yZSB0aGUgVVBcbiIpOworCSAgICBtZXNzYWdlICs9IFdNX0tFWURPV04gLSBXTV9LRVlVUDsgLyogY3JlYXRlIHRoZSAqRE9XTiBmcm9tIHRoZSAqVVAgKi8KKwkgICAgZG93bmtleWxwLmxwMS5wcmV2aW91cyA9IDA7IC8qID8gKi8KKwkgICAgZG93bmtleWxwLmxwMS50cmFuc2l0aW9uID0gMDsKKwkgICAgaGFyZHdhcmVfZXZlbnQoIG1lc3NhZ2UsIHZrZXksIGRvd25rZXlscC5scDIsIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwKKwkJCSAgICBldmVudC0+eV9yb290IC0gZGVza3RvcFksIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCAwKTsKKwkgICAgbWVzc2FnZSArPSBXTV9LRVlVUCAtIFdNX0tFWURPV047IC8qIGJhY2sgdG8gdGhlIFVQIG1lc3NhZ2UgKi8KKyAgICAgICAgICAgICpTdGF0ZT1PRkY7CisJICB9IGJyZWFrOworCX0KKwlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiSW50ZXJuYWwgU3RhdGUgOiAlZCAoMD1PRkYgMT1JTlRFUk0gMj1PTikuIElucHV0VGFibGUgc3RhdGUgOiAlI3ggXG4iLCpTdGF0ZSxJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOworICAgICAgfSBlbHNlIHsKKwlpZiAoTnVtU3RhdGUgPT0gSU5URVJNKSBOdW1TdGF0ZSA9IE9OOworCWlmIChDYXBzU3RhdGUgPT0gSU5URVJNKSBDYXBzU3RhdGUgPSBPTjsKKyAgICAgIH0KKyAgICAKKyAgICBpZiAoIURvbnRQcm9wYWdhdGUpCisgICAgICB7CisJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICB3UGFyYW09JTA0WCwgbFBhcmFtPSUwOGxYXG4iLCAKKwkJICAgIHZrZXksIGtleWxwLmxwMiApOworCWRwcmludGZfa2V5KHN0ZGRlYiwiICAgICAgICAgICAgSW5wdXRLZXlTdGF0ZT0lWFxuIiwKKwkJICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CisKKwloYXJkd2FyZV9ldmVudCggbWVzc2FnZSwgdmtleSwga2V5bHAubHAyLCBldmVudC0+eF9yb290IC0gZGVza3RvcFgsCisJCQlldmVudC0+eV9yb290IC0gZGVza3RvcFksIGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzLCAwICk7CisgICAgICB9CisgICAgfQorfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJR2V0S2V5U3RhdGUJCQlbVVNFUi4xMDZdCkBAIC0yMDEsNyArNjAzLDcgQEAKICAgICAgICAgIGlmIChHZXRDYXB0dXJlMTYoKSkKICAgICAgICAgICAgbWVzZz0yOwogICAgICAgICAgZWxzZQotICAgICAgICAgIGlmICghSXNXaW5kb3dFbmFibGVkKGhXbmQpKQorICAgICAgICAgIGlmICghSXNXaW5kb3dFbmFibGVkMTYoaFduZCkpCiAgICAgICAgICAgICBtZXNnPTM7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKQEAgLTIyNiw3ICs2MjgsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICBpZiAoaVN0YXQhPS0xKQogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKElzSWNvbmljKGhXbmQpKQorICAgICAgICAgICAgICAgIGlmIChJc0ljb25pYzMyKGhXbmQpKQogICAgICAgICAgICAgICAgICAgbWVzZz01OwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CkBAIC0yNjgsMyArNjcwLDI2NCBAQAogICAgIEdsb2JhbFVubG9jazE2KGhBY2NlbCk7CiAgICAgcmV0dXJuIDA7CiB9CisKKworRFdPUkQgT2VtS2V5U2NhbihXT1JEIHdPZW1DaGFyKQoreworICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCIqT2VtS2V5U2NhbiAoJWQpXG4iLHdPZW1DaGFyKTsKKworICAgIHJldHVybiB3T2VtQ2hhcjsKK30KKworLyogVmtLZXlTY2FuIHRyYW5zbGF0ZXMgYW4gQU5TSSBjaGFyYWN0ZXIgdG8gYSB2aXJ0dWFsLWtleSBhbmQgc2hpZnQgY29kZQorICogZm9yIHRoZSBjdXJyZW50IGtleWJvYXJkLgorICogRklYTUUgaGlnaC1vcmRlciBieXRlIHNob3VsZCB5aWVsZCA6CisgKgkwCVVuc2hpZnRlZAorICoJMQlTaGlmdAorICoJMglDdHJsCisgKgkzLTUJU2hpZnQta2V5IGNvbWJpbmF0aW9ucyB0aGF0IGFyZSBub3QgdXNlZCBmb3IgY2hhcmFjdGVycworICoJNglDdHJsLUFsdAorICoJNwlDdHJsLUFsdC1TaGlmdAorICoJSS5lLiA6CVNoaWZ0ID0gMSwgQ3RybCA9IDIsIEFsdCA9IDQuCisgKi8KKworV09SRCBWa0tleVNjYW4oV09SRCBjQ2hhcikKK3sKKwlLZXlDb2RlIGtleWNvZGU7CisgICAgCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJWa0tleVNjYW4gJyVjJyglZCkgIixjQ2hhcixjQ2hhcik7CisJCisvKiBsZXQncyBkbyB0aGlzIDogY2hhciA9IGtleXN5bSAoZm9yIEFOU0kgY2hhcnMpIC0+IGtleWMgWyArIHNoaWZ0IC4uLiAoPz8gaG93ID8/KV0KK2tleWMgLT4gKGtleWMydmtleSkgdmtleSAqLworCisJa2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwgY0NoYXIgJiAweEZGKTsKKwkKKwlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiIC4uLiBnb3Qga2V5Y29kZSAweCV4IC4uLiByZXR1cm5pbmcgMHgleFxuIiwKKwkJCSBrZXljb2RlLGtleWMydmtleVtrZXljb2RlXSk7CisJcmV0dXJuIGtleWMydmtleVtrZXljb2RlXTsKK30KKworV09SRCBWa0tleVNjYW4zMlcoV09SRCBjQ2hhcikKK3sKKwkvKiBsb3dlciBwYXJ0IG9mIGNDaGFyIGlzIHVzZWQgYW55d2F5ICovCisJcmV0dXJuIFZrS2V5U2NhbihjQ2hhcik7Cit9CisKK2ludCBHZXRLZXlib2FyZFR5cGUoaW50IG5UeXBlRmxhZykKK3sKKyAgZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkdldEtleWJvYXJkVHlwZSglZClcbiIsblR5cGVGbGFnKTsKKyAgc3dpdGNoKG5UeXBlRmxhZykKKyAgICB7CisgICAgY2FzZSAwOiAgICAgIC8qIEtleWJvYXJkIHR5cGUgKi8KKyAgICAgIHJldHVybiA0OyAgICAvKiBBVC0xMDEgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTogICAgICAvKiBLZXlib2FyZCBTdWJ0eXBlICovCisgICAgICByZXR1cm4gMDsgICAgLyogVGhlcmUgYXJlIG5vIGRlZmluZWQgc3VidHlwZXMgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjogICAgICAvKiBOdW1iZXIgb2YgRi1rZXlzICovCisgICAgICByZXR1cm4gMTI7ICAgLyogV2UncmUgZG9pbmcgYW4gMTAxIGZvciBub3csIHNvIHJldHVybiAxMiBGLWtleXMgKi8KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0eXBlIG9uIEdldEtleWJvYXJkVHlwZVxuIik7CisgICAgICByZXR1cm4gMDsgICAgLyogVGhlIGJvb2sgc2F5cyAwIGhlcmUsIHNvIDAgKi8KKyAgICB9Cit9CisKKy8qIE1hcFZpcnR1YWxLZXkgdHJhbnNsYXRlcyBrZXljb2RlcyBmcm9tIG9uZSBmb3JtYXQgdG8gYW5vdGhlci4gKi8KKworV09SRCBNYXBWaXJ0dWFsS2V5KFdPUkQgd0NvZGUsIFdPUkQgd01hcFR5cGUpCit7CisjZGVmaW5lIHJldHVybk1WSyh2YWx1ZSkgeyBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwicmV0dXJuaW5nIDB4JXguXG4iLHZhbHVlKTsgcmV0dXJuIHZhbHVlOyB9CisKKwlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiTWFwVmlydHVhbEtleSB3Q29kZT0weCV4IHdNYXBUeXBlPSVkIC4uLiAiLHdDb2RlLHdNYXBUeXBlKTsKKwlzd2l0Y2god01hcFR5cGUpIHsKKwkJY2FzZSAwOgl7IC8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KKwkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCisJCQlLZXlDb2RlIGtleWM7CisJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspIC8qIHNlZSBldmVudC5jICovCisJCQkJaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKT09IHdDb2RlKQorCQkJCQlyZXR1cm5NVksgKGtleWMgLSA4KTsKKwkJICAgICAgICByZXR1cm4gMDsgfQorCisJCWNhc2UgMTogLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLworCQkJLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KKworCQkJcmV0dXJuTVZLIChrZXljMnZrZXlbKHdDb2RlICYgMHhGRikgKyA4XSk7CisKKwkJY2FzZSAyOiB7IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCisJCQkvKiAod2FzIEZJWE1FKSA6IHdoYXQgZG9lcyB1bnNoaWZ0ZWQgbWVhbiA/ICdhJyBvciAnQScgPyAqLworCQkgICAgICAgIC8qIE15IFdpbmRvd3MgcmV0dXJucyAnQScuICovCisJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLworCQkJWEtleUV2ZW50IGU7CisJCQlLZXlTeW0ga2V5c3ltOworCQkJY2hhciBzWzJdOworCQkJZS5kaXNwbGF5ID0gZGlzcGxheTsKKwkJCWUuc3RhdGUgPSAwOyAvKiB1bnNoaWZ0ZWQgKi8KKwkJCWUua2V5Y29kZSA9IE1hcFZpcnR1YWxLZXkoIHdDb2RlLCAwKTsKKwkJCWlmICghWExvb2t1cFN0cmluZygmZSwgcyAsIDIgLCAma2V5c3ltLCBOVUxMKSkKKwkJCSAgcmV0dXJuTVZLICgqcyk7CisJCQkKKwkJCXJldHVybiAwOworCQkJfQorCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLworCQkJZnByaW50ZihzdGRlcnIsICJNYXBWaXJ0dWFsS2V5OiB1bmtub3duIHdNYXBUeXBlICVkICFcbiIsCisJCQkJd01hcFR5cGUpOworCQkJcmV0dXJuIDA7CQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IEdldEtiQ29kZVBhZ2Uodm9pZCkKK3sKKyAgICAJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsIkdldEtiQ29kZVBhZ2UoKVxuIik7CisJcmV0dXJuIDg1MDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUdldEtleU5hbWVUZXh0MzJXICAgKFVTRVIzMi4yNDcpCisgKi8KK0lOVDMyIEdldEtleU5hbWVUZXh0MzJXKExPTkcgbFBhcmFtLCBMUFdTVFIgbHBCdWZmZXIsIElOVDMyIG5TaXplKQoreworCUxQU1RSIGJ1ZiA9IHhtYWxsb2MoblNpemUpOworCWludAlyZXMgPSBHZXRLZXlOYW1lVGV4dDMyQShsUGFyYW0sYnVmLG5TaXplKTsKKworCWxzdHJjcHluQXRvVyhscEJ1ZmZlcixidWYsblNpemUpOworCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJR2V0S2V5TmFtZVRleHQzMkEgICAoVVNFUjMyLjI0NikKKyAqLworSU5UMzIgR2V0S2V5TmFtZVRleHQzMkEoTE9ORyBsUGFyYW0sIExQU1RSIGxwQnVmZmVyLCBJTlQzMiBuU2l6ZSkKK3sKKwlyZXR1cm4gR2V0S2V5TmFtZVRleHQxNihsUGFyYW0sbHBCdWZmZXIsblNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJR2V0S2V5TmFtZVRleHQxNiAgIChLRVlCT0FSRC4xMzMpCisgKi8KK0lOVDE2IEdldEtleU5hbWVUZXh0MTYoTE9ORyBsUGFyYW0sIExQU1RSIGxwQnVmZmVyLCBJTlQxNiBuU2l6ZSkKK3sKKyAgLyoJaW50IGk7ICovCisJCisgICAgCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJHZXRLZXlOYW1lVGV4dCglbGQsPHB0cj4sJWQpXG4iLGxQYXJhbSxuU2l6ZSk7CisKKwlsUGFyYW0gPj49IDE2OworCWxQYXJhbSAmPSAweGZmOworCisJLyoJZm9yIChpID0gMCA7IGkgIT0gS2V5VGFibGVTaXplIDsgaSsrKSAKKwkJaWYgKEtleVRhYmxlW2ldLnNjYW5jb2RlID09IGxQYXJhbSkgIHsKKwkJCWxzdHJjcHluMzJBKCBscEJ1ZmZlciwgS2V5VGFibGVbaV0ubmFtZSwgblNpemUgKTsKKwkJCXJldHVybiBzdHJsZW4obHBCdWZmZXIpOworCQl9CisJCSovCisJLyogRklYTUUgISBHZXRLZXlOYW1lVGV4dCBpcyBzdGlsbCB0byBkby4uLgorICovCisJKmxwQnVmZmVyID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IFRvQXNjaWkoV09SRCB3VmlydEtleSwgV09SRCB3U2NhbkNvZGUsIExQU1RSIGxwS2V5U3RhdGUsIAorCUxQVk9JRCBscENoYXIsIFdPUkQgd0ZsYWdzKSAKK3sKKyAgICBYS2V5RXZlbnQgZTsKKyAgICBLZXlTeW0ga2V5c3ltOworICAgIHN0YXRpYyBYQ29tcG9zZVN0YXR1cyBjczsKKyAgICBpbnQgcmV0OworICAgIFdPUkQga2V5YzsKKworICAgIGUuZGlzcGxheSA9IGRpc3BsYXk7CisgICAgZS5rZXljb2RlID0gMDsKKyAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCisgICAgICB7IC8qIHRoaXMgY291bGQgYmUgc3BlZWRlZCB1cCBieSBtYWtpbmcgYW5vdGhlciB0YWJsZSwgYW4gYXJyYXkgb2Ygc3RydWN0IHZrZXksa2V5Y29kZQorCSAqICh2a2V5IC0+IGtleWNvZGUpIHdpdGggdmtleXMgc29ydGVkIC4uLi4gYnV0IGl0IHRha2VzIG1lbW9yeSAoNTEyKjMgYnl0ZXMpISAgREYgKi8KKwlpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpPT0gd1ZpcnRLZXkpIC8qIG5vIG5lZWQgdG8gbWFrZSBhIG1vcmUgcHJlY2lzZSB0ZXN0ICh3aXRoIHRoZSBleHRlbmRlZCBiaXQgY29ycmVjdGx5IHNldCBhYm92ZSB3VmlydEtleSAuLi4gVksqIGFyZSBkaWZmZXJlbnQgZW5vdWdoLi4uICovCisJICB7CisJICAgIGlmICgoZS5rZXljb2RlKSAmJiAoKHdWaXJ0S2V5PDB4MTApIHx8ICh3VmlydEtleT4weDEyKSkpIAorCQkvKiBpdCdzIG5vcm1hbCB0byBoYXZlIDIgc2hpZnQsIGNvbnRyb2wsIGFuZCBhbHQgISAqLworCQlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiVG9Bc2NpaSA6IFRoZSBrZXljb2RlcyAlWCBhbmQgJVggYXJlIG1hdGNoaW5nIHRoZSBzYW1lIHZrZXkgJVhcbiIsCisJCQkJIGUua2V5Y29kZSxrZXljLHdWaXJ0S2V5KTsKKwkgICAgZS5rZXljb2RlID0ga2V5YzsKKwkgIH0KKyAgICAgIH0KKyAgICBpZiAoKCFlLmtleWNvZGUpICYmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkpIAorICAgICAgeworCWlmICgod1ZpcnRLZXk+PVZLX05VTVBBRDApICYmICh3VmlydEtleTw9VktfTlVNUEFEOSkpCisJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd1ZpcnRLZXktVktfTlVNUEFEMCtYS19LUF8wKTsKKwlpZiAod1ZpcnRLZXk9PVZLX0RFQ0lNQUwpCisJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CisgICAgICB9CisgICAgaWYgKCFlLmtleWNvZGUpCisgICAgICB7CisJZnByaW50ZihzdGRlcnIsIlRvQXNjaWkgOiBVbmtub3duIHZpcnR1YWwga2V5ICVYICEhISBcbiIsd1ZpcnRLZXkpOworCXJldHVybiB3VmlydEtleTsgLyogd2hhdGV2ZXIgKi8KKyAgICAgIH0KKyAgICBlLnN0YXRlID0gMDsKKyAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQorCWUuc3RhdGUgfD0gU2hpZnRNYXNrOworICAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJUb0FzY2lpIDogbHBLZXlTdGF0ZVsweDE0KFZLX0NBUElUQUwpXT0lI3hcbiIsbHBLZXlTdGF0ZVtWS19DQVBJVEFMXSk7CisgICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDAxKQorCWUuc3RhdGUgfD0gTG9ja01hc2s7CisgICAgaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKQorCWlmIChscEtleVN0YXRlW1ZLX01FTlVdICYgMHg4MCkKKwkgICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CisJZWxzZQorCSAgICBlLnN0YXRlIHw9IENvbnRyb2xNYXNrOworICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKKwllLnN0YXRlIHw9IE51bUxvY2tNYXNrOworICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIlRvQXNjaWkoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9ICVYXG4iLAorCQl3VmlydEtleSwgd1NjYW5Db2RlLCBlLnN0YXRlKTsKKyAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBscENoYXIsIDIsICZrZXlzeW0sICZjcyk7CisgICAgaWYgKHJldCA9PSAwKQorCXsKKwlCWVRFIGRlYWRfY2hhciA9IDA7CisKKwkoKGNoYXIqKWxwQ2hhcilbMV0gPSAnXDAnOworCXN3aXRjaCAoa2V5c3ltKQorCSAgICB7CisJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CisJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCisJCWRlYWRfY2hhciA9ICd+JzsKKwkJYnJlYWs7CisJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CisJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLworCQlkZWFkX2NoYXIgPSAweGI0OworCQlicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXggOgorCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLworCQlkZWFkX2NoYXIgPSAnXic7CisJCWJyZWFrOworCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgorCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KKwkJZGVhZF9jaGFyID0gJ2AnOworCQlicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CisJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLworCQlkZWFkX2NoYXIgPSAweGE4OworCQlicmVhazsKKwkgICAgfQorCWlmIChkZWFkX2NoYXIpCisJICAgIHsKKwkgICAgKihjaGFyKilscENoYXIgPSBkZWFkX2NoYXI7CisJICAgIHJldCA9IC0xOworCSAgICB9CisJZWxzZQorCSAgICB7CisJICAgIGNoYXIJKmtzbmFtZTsKKworCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKKwkgICAgaWYgKCFrc25hbWUpCisJCWtzbmFtZSA9ICJObyBOYW1lIjsKKwkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwgIlBsZWFzZSByZXBvcnQgOiBubyBjaGFyIGZvciBrZXlzeW0gJTA0bFggKCVzKSA6XG4iLAorCQkJa2V5c3ltLCBrc25hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgd1ZpcnRLZXkgPSAlWCwgd1NjYW5Db2RlID0gJVgsIGtleWNvZGUgPSAlWCwgc3RhdGUgPSAlWFxuIiwKKwkJCXdWaXJ0S2V5LCB3U2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CisJCX0KKwkgICAgfQorCX0KKyAgICBkcHJpbnRmX2tleShzdGRkZWIsICJUb0FzY2lpIGFib3V0IHRvIHJldHVybiAlZCB3aXRoIGNoYXIgJXhcbiIsCisJCXJldCwgKihjaGFyKilscENoYXIpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCBmNmU1YmFjLi41NThmOWNlIDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTI4NCw3ICsyODQsNyBAQAogICovCiBXT1JEIE1ESUljb25BcnJhbmdlKEhXTkQgcGFyZW50KQogewotICByZXR1cm4gQXJyYW5nZUljb25pY1dpbmRvd3MocGFyZW50KTsJCS8qIEFueSByZWFzb24gd2h5IHRoZSAgICAqLworICByZXR1cm4gQXJyYW5nZUljb25pY1dpbmRvd3MxNihwYXJlbnQpOwkvKiBBbnkgcmVhc29uIHdoeSB0aGUgICAgKi8KIAkJCQkJCS8qIGV4aXN0aW5nIGljb24gYXJyYW5nZSAqLwogCQkJCQkJLyogY2FuJ3QgYmUgdXNlZCBoZXJlPwkgKi8KIAkJCQkJCS8qIC1EUlAJCQkgKi8KQEAgLTMzMyw3ICszMzMsNyBAQAogCWlmKCBzdHlsZSAmIFdTX01BWElNSVpFICkKIAkgIFNlbmRNZXNzYWdlMTYody0+aHduZFNlbGYsIFdNX1NFVFJFRFJBVywgRkFMU0UsIDBMICk7CiAJaHduZE1heCA9IGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQ7Ci0JU2hvd1dpbmRvdyggaHduZE1heCwgU1dfU0hPV05PQUNUSVZBVEUgKTsKKwlTaG93V2luZG93MTYoIGh3bmRNYXgsIFNXX1NIT1dOT0FDVElWQVRFICk7CiAJaWYoIHN0eWxlICYgV1NfTUFYSU1JWkUgKQogCSAgU2VuZE1lc3NhZ2UxNih3LT5od25kU2VsZiwgV01fU0VUUkVEUkFXLCBUUlVFLCAwTCApOwogICAgICAgfQpAQCAtMzY1LDEwICszNjUsMTAgQEAKIAogCU1ESV9NZW51TW9kaWZ5SXRlbSh3ICxod25kKTsgCiAJaWYoIHduZC0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICYmIGNpLT5od25kQWN0aXZlQ2hpbGQgKQotCSAgICBTaG93V2luZG93KCBod25kLCBTV19TSE9XTUlOTk9BQ1RJVkUgKTsKKwkgICAgU2hvd1dpbmRvdzE2KCBod25kLCBTV19TSE9XTUlOTk9BQ1RJVkUgKTsKIAllbHNlCiAJICB7Ci0JICAgIFNldFdpbmRvd1BvcyggaHduZCwgMCwgMCwgMCwgMCwgMCwgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOworCSAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgMCwgMCwgMCwgMCwgU1dQX1NIT1dXSU5ET1cgfCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOwogCiAJICAgIC8qIFNldCBtYXhpbWl6ZWQgc3RhdGUgaGVyZSBpbiBjYXNlIGh3bmQgZGlkbid0IHJlY2VpdmUgV01fU0laRQogCSAgICAgKiBkdXJpbmcgQ3JlYXRlV2luZG93IC0gYmFkIQpAQCAtMzg4LDcgKzM4OCw3IEBACiAJY2ktPm5BY3RpdmVDaGlsZHJlbi0tOwogCURlbGV0ZU1lbnUzMihjaS0+aFdpbmRvd01lbnUsd0lEbWVudSxNRl9CWUNPTU1BTkQpOwogCWlmKCBJc1dpbmRvdyhod25kTWF4KSApCi0JICAgIFNob3dXaW5kb3coaHduZE1heCwgU1dfU0hPV01BWElNSVpFRCk7CisJICAgIFNob3dXaW5kb3cxNihod25kTWF4LCBTV19TSE9XTUFYSU1JWkVEKTsKICAgICB9CiAJCiAgICAgcmV0dXJuIGh3bmQ7CkBAIC00NTMsMTYgKzQ1MywxNiBAQAogCSAgICAgIHctPmR3U3R5bGUgJj0gfldTX1ZJU0lCTEU7CiAJICAgIH0KIAotCSAgU2V0V2luZG93UG9zKCBod25kVG8sIEhXTkRfVE9QLCAwLCAwLCAwLCAwLCAKKwkgIFNldFdpbmRvd1BvczMyKCBod25kVG8sIEhXTkRfVE9QLCAwLCAwLCAwLCAwLCAKIAkJCVNXUF9OT01PVkUgfCBTV1BfTk9TSVpFICk7CiAJICBpZiggIXdUbyAmJiBod25kUHJldiApCiAJICAgIHsKLQkgICAgICAgU2V0V2luZG93UG9zKCBod25kUHJldiwgSFdORF9CT1RUT00sIDAsIDAsIDAsIDAsIAorCSAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZFByZXYsIEhXTkRfQk9UVE9NLCAwLCAwLCAwLCAwLCAKIAkJICAJICAgICBTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSB8IFNXUF9OT0FDVElWQVRFKTsKIAkgICAgfQogCiAJICBpZiggYk9wdGltaXplICkKLQkgICAgICAgU2hvd1dpbmRvdyggY2xpZW50SHduZCwgU1dfU0hPVyApOworCSAgICAgICBTaG93V2luZG93MTYoIGNsaWVudEh3bmQsIFNXX1NIT1cgKTsKIAl9CiB9CiAKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCiAJICAgIGlmKCBjaGlsZCA9PSBjaS0+aHduZEFjdGl2ZUNoaWxkICkKIAkgICAgICB7Ci0JCVNob3dXaW5kb3coIGNoaWxkLCBTV19ISURFKTsKKwkJU2hvd1dpbmRvdzE2KCBjaGlsZCwgU1dfSElERSk7CiAJCWlmKCBjaGlsZCA9PSBjaS0+aHduZENoaWxkTWF4aW1pemVkICkKIAkJICB7CiAJCSAgICBNRElfUmVzdG9yZUZyYW1lTWVudSh3X3BhcmVudC0+cGFyZW50LCBjaGlsZCk7CkBAIC01MDIsOCArNTAyLDggQEAKIAogICAgICAgICBpZiAoZmxhZ0Rlc3Ryb3kpCiAJICAgewotCSAgICAgTURJX1Bvc3RVcGRhdGUoR2V0UGFyZW50MTYoY2hpbGQpLCBjaSwgU0JfQk9USCsxKTsKLSAgICAgICAgICAgIERlc3Ryb3lXaW5kb3coY2hpbGQpOworCSAgICBNRElfUG9zdFVwZGF0ZShHZXRQYXJlbnQxNihjaGlsZCksIGNpLCBTQl9CT1RIKzEpOworICAgICAgICAgICAgRGVzdHJveVdpbmRvdzMyKGNoaWxkKTsKIAkgICB9CiAgICAgfQogCkBAIC01MzEsNyArNTMxLDcgQEAKIAogICAgIGRwcmludGZfbWRpKHN0ZGRlYiwiTURJX0NoaWxkQWN0aXZhdGU6ICUwNHhcbiIsIGhXbmRDaGlsZCk7CiAKLSAgICBpZiggR2V0QWN0aXZlV2luZG93KCkgPT0gY2xpZW50UHRyLT5wYXJlbnQtPmh3bmRTZWxmICkKKyAgICBpZiggR2V0QWN0aXZlV2luZG93MzIoKSA9PSBjbGllbnRQdHItPnBhcmVudC0+aHduZFNlbGYgKQogICAgICAgICBpc0FjdGl2ZUZyYW1lV25kID0gVFJVRTsKIAkKICAgICAvKiBkZWFjdGl2YXRlIHByZXYuIGFjdGl2ZSBjaGlsZCAqLwpAQCAtNTYwLDEwICs1NjAsMTAgQEAKICAgICAgICAgaWYoIGhXbmRDaGlsZCApCiAJICAgICAgICB7CiAJCSAgY2xpZW50SW5mby0+aHduZEFjdGl2ZUNoaWxkID0gaFduZENoaWxkOwotCQkgIFNob3dXaW5kb3coIGhXbmRDaGlsZCwgU1dfU0hPV01BWElNSVpFRCk7CisJCSAgU2hvd1dpbmRvdzE2KCBoV25kQ2hpbGQsIFNXX1NIT1dNQVhJTUlaRUQpOwogCSAgICAgICAgfQogCWVsc2UKLQkJU2hvd1dpbmRvdyggY2xpZW50SW5mby0+aHduZEFjdGl2ZUNoaWxkLCAKKwkJU2hvd1dpbmRvdzE2KCBjbGllbnRJbmZvLT5od25kQWN0aXZlQ2hpbGQsIAogCQkJICAgIFNXX1NIT1dOT1JNQUwgKTsKIAogICAgIGNsaWVudEluZm8tPmh3bmRBY3RpdmVDaGlsZCA9IGhXbmRDaGlsZDsKQEAgLTU4Miw3ICs1ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+d0lEbWVudSwgTUZfQ0hFQ0tFRCk7CiAKICAgICAvKiBicmluZyBhY3RpdmUgY2hpbGQgdG8gdGhlIHRvcCAqLwotICAgIFNldFdpbmRvd1BvcyggaFduZENoaWxkLCAwLDAsMCwwLDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwgU1dQX05PQUNUSVZBVEUpOworICAgIFNldFdpbmRvd1BvczMyKCBoV25kQ2hpbGQsIDAsMCwwLDAsMCwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfTk9BQ1RJVkFURSk7CiAKICAgICBpZiggaXNBY3RpdmVGcmFtZVduZCApCiAJICB7CkBAIC02OTYsNyArNjk2LDcgQEAKICAgICBQT0lOVDE2ICAgICAgIHBvc1syXTsKICAgCiAgICAgaWYgKGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQpCi0gICAgICAgIFNob3dXaW5kb3coIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQsIFNXX05PUk1BTCk7CisgICAgICAgIFNob3dXaW5kb3cxNiggY2ktPmh3bmRDaGlsZE1heGltaXplZCwgU1dfTk9STUFMKTsKIAogICAgIGlmIChjaS0+bkFjdGl2ZUNoaWxkcmVuID09IDApIHJldHVybiAwOwogCkBAIC03MTQsOCArNzE0LDggQEAKIAlpZiggbGlzdFRvcC0+aENoaWxkICkKICAgICAgICAgewogICAgICAgICAgICAgTURJX0NhbGNEZWZhdWx0Q2hpbGRQb3MoY2xpZW50V25kLCBuKyssIHBvcywgZGVsdGEpOwotICAgICAgICAgICAgU2V0V2luZG93UG9zKGxpc3RUb3AtPmhDaGlsZCwgMCwgcG9zWzBdLngsIHBvc1swXS55LCBwb3NbMV0ueCwgcG9zWzFdLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgU1dQX0RSQVdGUkFNRSB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSKTsKKyAgICAgICAgICAgIFNldFdpbmRvd1BvczMyKGxpc3RUb3AtPmhDaGlsZCwgMCwgcG9zWzBdLngsIHBvc1swXS55LCBwb3NbMV0ueCwgcG9zWzFdLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfRFJBV0ZSQU1FIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIpOwogICAgICAgICB9CiAKIAlsaXN0UHJldiA9IGxpc3RUb3AtPnByZXY7CkBAIC03MjQsNyArNzI0LDcgQEAKICAgICB9CiAKICAgICBpZiggaVRvUG9zaXRpb24gPCBjaS0+bkFjdGl2ZUNoaWxkcmVuICkKLSAgICAgICAgQXJyYW5nZUljb25pY1dpbmRvd3MoIGNsaWVudFduZC0+aHduZFNlbGYgKTsKKyAgICAgICAgQXJyYW5nZUljb25pY1dpbmRvd3MzMiggY2xpZW50V25kLT5od25kU2VsZiApOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC03NDUsNyArNzQ1LDcgQEAKICAgICBJTlQxNgkgIGlUb1Bvc2l0aW9uID0gMDsKIAogICAgIGlmIChjaS0+aHduZENoaWxkTWF4aW1pemVkKQotCVNob3dXaW5kb3coY2ktPmh3bmRDaGlsZE1heGltaXplZCwgU1dfTk9STUFMKTsKKwlTaG93V2luZG93MTYoY2ktPmh3bmRDaGlsZE1heGltaXplZCwgU1dfTk9STUFMKTsKIAogICAgIGlmIChjaS0+bkFjdGl2ZUNoaWxkcmVuID09IDApIHJldHVybiAwOwogCkBAIC04MDQsOCArODA0LDggQEAKICAgICAJICAgICAgICAgICAgZnJlZShsaXN0VG9wKTsKICAgICAJICAgICAgICAgICAgbGlzdFRvcCA9IGxpc3RQcmV2OwogICAgIAkgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2V0V2luZG93UG9zKGxpc3RUb3AtPmhDaGlsZCwgMCwgeCwgeSwgeHNpemUsIHlzaXplLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX0RSQVdGUkFNRSB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSKTsKKyAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMihsaXN0VG9wLT5oQ2hpbGQsIDAsIHgsIHksIHhzaXplLCB5c2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX0RSQVdGUkFNRSB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSKTsKICAgICAgICAgICAgICAgICB5ICs9IHlzaXplOwogICAgIAkgICAgICAgIGxpc3RQcmV2ID0gbGlzdFRvcC0+cHJldjsKICAgICAJICAgICAgICBmcmVlKGxpc3RUb3ApOwpAQCAtODI0LDcgKzgyNCw3IEBACiAgICAgfQogICAgIAogICAgIGlmIChpVG9Qb3NpdGlvbiA8IGNpLT5uQWN0aXZlQ2hpbGRyZW4gKQotICAgICAgICBBcnJhbmdlSWNvbmljV2luZG93cyggd25kQ2xpZW50LT5od25kU2VsZiApOworICAgICAgICBBcnJhbmdlSWNvbmljV2luZG93czMyKCB3bmRDbGllbnQtPmh3bmRTZWxmICk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTk1OSw4ICs5NTksOCBAQAogCiAgREVGV05EX1NldFRleHQoIGZyYW1lV25kLCBscEJ1ZmZlciApOwogIGlmKCByZXBhaW50ID09IE1ESV9SRVBBSU5URlJBTUUpCi0gICAgIFNldFdpbmRvd1BvcyhmcmFtZVduZC0+aHduZFNlbGYsIDAsMCwwLDAsMCwgU1dQX0ZSQU1FQ0hBTkdFRCB8Ci0gICAgICAgICAgICAgICAgICBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSICk7CisgICAgIFNldFdpbmRvd1BvczMyKGZyYW1lV25kLT5od25kU2VsZiwgMCwwLDAsMCwwLCBTV1BfRlJBTUVDSEFOR0VEIHwKKyAgICAgICAgICAgICAgICAgICAgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiApOwogfQogCiAKQEAgLTEwMjksNyArMTAyOSw3IEBACiAKICAgICAgIGNhc2UgV01fTURJQUNUSVZBVEU6CiAgICAgICAgIGlmKCBjaS0+aHduZEFjdGl2ZUNoaWxkICE9IChIV05EKXdQYXJhbSApCi0JICAgIFNldFdpbmRvd1BvcygoSFdORCl3UGFyYW0sIDAsMCwwLDAsMCwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgKTsgCisJICAgIFNldFdpbmRvd1BvczMyKChIV05EKXdQYXJhbSwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOyAKIAlyZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9NRElDQVNDQURFOgpAQCAtMTA1Myw3ICsxMDUzLDcgQEAKIAlyZXR1cm4gMDsKIAkKICAgICAgIGNhc2UgV01fTURJTUFYSU1JWkU6Ci0JU2hvd1dpbmRvdygoSFdORCl3UGFyYW0sIFNXX01BWElNSVpFKTsKKwlTaG93V2luZG93MTYoKEhXTkQxNil3UGFyYW0sIFNXX01BWElNSVpFKTsKIAlyZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9NRElORVhUOgpAQCAtMTA2MSw3ICsxMDYxLDcgQEAKIAlicmVhazsKIAkKICAgICAgIGNhc2UgV01fTURJUkVTVE9SRToKLQlTaG93V2luZG93KCAoSFdORCl3UGFyYW0sIFNXX05PUk1BTCk7CisJU2hvd1dpbmRvdzE2KCAoSFdORDE2KXdQYXJhbSwgU1dfTk9STUFMKTsKIAlyZXR1cm4gMDsKIAogICAgICAgY2FzZSBXTV9NRElTRVRNRU5VOgpAQCAtMTExNSw3ICsxMTE1LDcgQEAKICAgICAgICAgICAgICAgICBpZiggd25kLT5vd25lciApIGNoaWxkID0gd25kLT5vd25lci0+aHduZFNlbGY7CiAKICAgICAgICAgICAgICAgICBpZiggY2hpbGQgIT0gY2ktPmh3bmRBY3RpdmVDaGlsZCApCi0gICAgICAgICAgICAgICAgICAgIFNldFdpbmRvd1BvcyhjaGlsZCwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOworICAgICAgICAgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMihjaGlsZCwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSApOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKQEAgLTExMjcsOCArMTEyNyw4IEBACiAJICAgICBSRUNUMTYJcmVjdCAgPSB7IDAsIDAsIExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSB9OwogCiAJICAgICBBZGp1c3RXaW5kb3dSZWN0RXgxNigmcmVjdCwgY2hpbGQtPmR3U3R5bGUsIDAsIGNoaWxkLT5kd0V4U3R5bGUpOwotCSAgICAgTW92ZVdpbmRvdyhjaS0+aHduZENoaWxkTWF4aW1pemVkLCByZWN0LmxlZnQsIHJlY3QudG9wLAotCQkJcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgMSk7CisJICAgICBNb3ZlV2luZG93MTYoY2ktPmh3bmRDaGlsZE1heGltaXplZCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwKKwkJCSAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgcmVjdC5ib3R0b20gLSByZWN0LnRvcCwgMSk7CiAJICB9CiAJZWxzZQogCSAgTURJX1Bvc3RVcGRhdGUoaHduZCwgY2ksIFNCX0JPVEgrMSk7CkBAIC0xMjEzLDggKzEyMTMsOCBAQAogCSAgICBicmVhazsKIAogCSAgY2FzZSBXTV9TSVpFOgotCSAgICBNb3ZlV2luZG93KGh3bmRNRElDbGllbnQsIDAsIDAsIAotCQkgICAgICAgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pLCBUUlVFKTsKKwkgICAgTW92ZVdpbmRvdzE2KGh3bmRNRElDbGllbnQsIDAsIDAsIAorCQkgICAgICAgICBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSksIFRSVUUpOwogCSAgICBicmVhazsKIAogCSAgY2FzZSBXTV9ORVhUTUVOVToKQEAgLTE0MTQsNyArMTQxNCw3IEBACiAJICAgICAgIFNlbmRNZXNzYWdlMTYoIGhNYXhDaGlsZCwgV01fU0VUUkVEUkFXLCBGQUxTRSwgMEwgKTsKIAogCSAgICAgICBNRElfUmVzdG9yZUZyYW1lTWVudSggY2xpZW50V25kLT5wYXJlbnQsIGhNYXhDaGlsZCk7Ci0JICAgICAgIFNob3dXaW5kb3coIGhNYXhDaGlsZCwgU1dfU0hPV05PQUNUSVZBVEUpOworCSAgICAgICBTaG93V2luZG93MTYoIGhNYXhDaGlsZCwgU1dfU0hPV05PQUNUSVZBVEUpOwogCiAJICAgICAgIFNlbmRNZXNzYWdlMTYoIGhNYXhDaGlsZCwgV01fU0VUUkVEUkFXLCBUUlVFLCAwTCApOwogCSAgICAgIH0KQEAgLTE2NDAsOCArMTY0MCw4IEBACiAJY2FzZSBTQl9CT1RIOgogCQkJU0NST0xMX1NldE5DU2JTdGF0ZSggV25kLCB2bWluLCB2bWF4LCB2cG9zLAogCQkJCQkJICBobWluLCBobWF4LCBocG9zKTsKLQkJCVNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCAwLCAwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKKwkJCVNldFdpbmRvd1BvczMyKGh3bmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSIHwgU1dQX0ZSQU1FQ0hBTkdFRCApOwogICAgICAgfSAgICAKIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCAyMDNkN2U4Li43MzU4ZjRiIDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiaG9vay5oIgorI2luY2x1ZGUgImtleWJvYXJkLmgiCiAjaW5jbHVkZSAic3B5LmgiCiAjaW5jbHVkZSAid2lucG9zLmgiCiAjaW5jbHVkZSAiYXRvbS5oIgpAQCAtMzUsMTMgKzM2LDYgQEAKIHR5cGVkZWYgZW51bSB7IFNZU1FfTVNHX0FCQU5ET04sIFNZU1FfTVNHX1NLSVAsIAogICAgICAgICAgICAgICAgU1lTUV9NU0dfQUNDRVBULCBTWVNRX01TR19DT05USU5VRSB9IFNZU1FfU1RBVFVTOwogCi1leHRlcm4gQk9PTCBNb3VzZUJ1dHRvbnNTdGF0ZXNbM107Ci1leHRlcm4gQk9PTCBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1szXTsKLWV4dGVybiBCWVRFIElucHV0S2V5U3RhdGVUYWJsZVsyNTZdOwotZXh0ZXJuIEJZVEUgQXN5bmNLZXlTdGF0ZVRhYmxlWzI1Nl07Ci0KLUJZVEUgUXVldWVLZXlTdGF0ZVRhYmxlWzI1Nl07Ci0KIGV4dGVybiBNRVNTQUdFUVVFVUUgKnBDdXJzb3JRdWV1ZTsJCQkgLyogcXVldWUuYyAqLwogZXh0ZXJuIE1FU1NBR0VRVUVVRSAqcEFjdGl2ZVF1ZXVlOwogCkBAIC0xMjEsNyArMTE1LDcgQEAKIAkvKiBjaGVjayBpZiBoV25kIGlzIHdpdGhpbiBoV25kU2NvcGUgKi8KIAogICAgIGlmKCBoV25kU2NvcGUgJiYgaFduZCAhPSBoV25kU2NvcGUgKQotCWlmKCAhSXNDaGlsZChoV25kU2NvcGUsIGhXbmQpICkgcmV0dXJuIFNZU1FfTVNHX0NPTlRJTlVFOworCWlmKCAhSXNDaGlsZDE2KGhXbmRTY29wZSwgaFduZCkgKSByZXR1cm4gU1lTUV9NU0dfQ09OVElOVUU7CiAKICAgICBpZiggbW91c2VDbGljayApCiAgICAgewpAQCAtMjAzLDcgKzE5Nyw3IEBACiAKICAgICAgICAgICAgIC8qIEFjdGl2YXRlIHRoZSB3aW5kb3cgaWYgbmVlZGVkICovCiAKLSAgICAgICAgICAgIGlmIChoV25kICE9IEdldEFjdGl2ZVdpbmRvdygpICYmIGhXbmQgIT0gR2V0RGVza3RvcFdpbmRvdzE2KCkpCisgICAgICAgICAgICBpZiAoaFduZCAhPSBHZXRBY3RpdmVXaW5kb3cxNigpICYmIGhXbmQgIT0gR2V0RGVza3RvcFdpbmRvdzE2KCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgTE9ORyByZXQgPSBTZW5kTWVzc2FnZTE2KCBoV25kLCBXTV9NT1VTRUFDVElWQVRFLCBod25kVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIGhpdHRlc3QsIG1lc3NhZ2UgKSApOwpAQCAtMjEyLDcgKzIwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0TXNnID0gVFJVRTsKIAogICAgICAgICAgICAgICAgIGlmICgoKHJldCA9PSBNQV9BQ1RJVkFURSkgfHwgKHJldCA9PSBNQV9BQ1RJVkFURUFOREVBVCkpIAotICAgICAgICAgICAgICAgICAgICAgICYmIGh3bmRUb3AgIT0gR2V0QWN0aXZlV2luZG93KCkgKQorICAgICAgICAgICAgICAgICAgICAgICYmIGh3bmRUb3AgIT0gR2V0QWN0aXZlV2luZG93MTYoKSApCiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFXSU5QT1NfU2V0QWN0aXZlV2luZG93KCBod25kVG9wLCBUUlVFICwgVFJVRSApKQogCQkJIGVhdE1zZyA9IFRSVUU7CiAgICAgICAgICAgICB9CkBAIC0yNTIsNyArMjQ2LDcgQEAKIAkgIC8qIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSB3aW5kb3cgaW5zdGVhZCwgICovCiAJICAvKiB0cmFuc2xhdGluZyBtZXNzYWdlcyB0byB0aGVpciBXTV9TWVMgZXF1aXZhbGVudCAqLwogCi0JaFduZCA9IEdldEFjdGl2ZVdpbmRvdygpOworCWhXbmQgPSBHZXRBY3RpdmVXaW5kb3cxNigpOwogCiAJaWYoIG1lc3NhZ2UgPCBXTV9TWVNLRVlET1dOICkKIAkgICAgbWVzc2FnZSArPSBXTV9TWVNLRVlET1dOIC0gV01fS0VZRE9XTjsKQEAgLTI3MCw3ICsyNjQsNyBAQAogICAgIH0KIAogICAgIGlmIChoV25kU2NvcGUgJiYgaFduZCAhPSBoV25kU2NvcGUpCi0JaWYgKCFJc0NoaWxkKGhXbmRTY29wZSwgaFduZCkpIHJldHVybiBTWVNRX01TR19DT05USU5VRTsKKwlpZiAoIUlzQ2hpbGQxNihoV25kU2NvcGUsIGhXbmQpKSByZXR1cm4gU1lTUV9NU0dfQ09OVElOVUU7CiAgICAgaWYgKCFNU0dfQ2hlY2tGaWx0ZXIobWVzc2FnZSwgZmlsdGVyKSkgcmV0dXJuIFNZU1FfTVNHX0NPTlRJTlVFOwogCiAgICAgbXNnLT5od25kID0gaFduZDsKQEAgLTc2MCw3ICs3NTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBtc2ctPndQYXJhbSA9IDE7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYoICFod25kIHx8IG1zZy0+aHduZCA9PSBod25kIHx8IElzQ2hpbGQoaHduZCxtc2ctPmh3bmQpICkKKyAgICAgICAgICAgICAgICBpZiggIWh3bmQgfHwgbXNnLT5od25kID09IGh3bmQgfHwgSXNDaGlsZDE2KGh3bmQsbXNnLT5od25kKSApCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiggd25kUHRyLT5mbGFncyAmIFdJTl9JTlRFUk5BTF9QQUlOVCAmJiAhd25kUHRyLT5ocmduVXBkYXRlKQogICAgICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS93aW5kb3dzL21zZ2JveC5jIGIvd2luZG93cy9tc2dib3guYwppbmRleCA0MGQ5MzQ0Li5mNWE1ZDI2IDEwMDY0NAotLS0gYS93aW5kb3dzL21zZ2JveC5jCisrKyBiL3dpbmRvd3MvbXNnYm94LmMKQEAgLTQyLDMzICs0MiwzMyBAQAogICAgY2FzZSBXTV9JTklURElBTE9HOgogICAgIGxwbWIgPSAoTFBNU0dCT1gpbFBhcmFtOwogICAgIGlmIChscG1iLT50aXRsZSkgU2V0V2luZG93VGV4dDMyQShod25kLCBscG1iLT50aXRsZSk7Ci0gICAgU2V0V2luZG93VGV4dDMyQShHZXREbGdJdGVtKGh3bmQsIDEwMCksIGxwbWItPnRleHQpOworICAgIFNldFdpbmRvd1RleHQzMkEoR2V0RGxnSXRlbTMyKGh3bmQsIDEwMCksIGxwbWItPnRleHQpOwogICAgIC8qIEhpZGUgbm90IHNlbGVjdGVkIGJ1dHRvbnMgKi8KICAgICBzd2l0Y2gobHBtYi0+dHlwZSAmIE1CX1RZUEVNQVNLKSB7CiAgICAgIGNhc2UgTUJfT0s6Ci0gICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgMiksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihod25kLCAyKSwgU1dfSElERSk7CiAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgY2FzZSBNQl9PS0NBTkNFTDoKLSAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCAzKSwgU1dfSElERSk7Ci0gICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgNCksIFNXX0hJREUpOwotICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDUpLCBTV19ISURFKTsKLSAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCA2KSwgU1dfSElERSk7Ci0gICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgNyksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihod25kLCAzKSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGh3bmQsIDQpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaHduZCwgNSksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihod25kLCA2KSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGh3bmQsIDcpLCBTV19ISURFKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1CX0FCT1JUUkVUUllJR05PUkU6Ci0gICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgMSksIFNXX0hJREUpOwotICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDIpLCBTV19ISURFKTsKLSAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCA2KSwgU1dfSElERSk7Ci0gICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgNyksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihod25kLCAxKSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGh3bmQsIDIpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaHduZCwgNiksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihod25kLCA3KSwgU1dfSElERSk7CiAgICAgICBicmVhazsKICAgICAgY2FzZSBNQl9ZRVNOTzoKLSAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCAyKSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGh3bmQsIDIpLCBTV19ISURFKTsKICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICBjYXNlIE1CX1lFU05PQ0FOQ0VMOgotICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDEpLCBTV19ISURFKTsKLSAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCAzKSwgU1dfSElERSk7Ci0gICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgNCksIFNXX0hJREUpOwotICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDUpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaHduZCwgMSksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdzMyKEdldERsZ0l0ZW0zMihod25kLCAzKSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGh3bmQsIDQpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3czMihHZXREbGdJdGVtMzIoaHduZCwgNSksIFNXX0hJREUpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIC8qIFNldCB0aGUgaWNvbiAqLwpAQCAtMTAwLDIzICsxMDAsMjMgQEAKICAgICBib3JoZWlnaHQgLT0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKIAogICAgIC8qIEdldCB0aGUgaWNvbiBoZWlnaHQgKi8KLSAgICBHZXRXaW5kb3dSZWN0MzIoR2V0RGxnSXRlbShod25kLCAxMDg4KSwgJnJlY3QpOworICAgIEdldFdpbmRvd1JlY3QzMihHZXREbGdJdGVtMzIoaHduZCwgMTA4OCksICZyZWN0KTsKICAgICBpaGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKICAgICAKICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiB2aXNpYmxlIGJ1dHRvbnMgYW5kIHRoZWlyIHdpZHRoICovCi0gICAgR2V0V2luZG93UmVjdDMyKEdldERsZ0l0ZW0oaHduZCwgMiksICZyZWN0KTsKKyAgICBHZXRXaW5kb3dSZWN0MzIoR2V0RGxnSXRlbTMyKGh3bmQsIDIpLCAmcmVjdCk7CiAgICAgYmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CiAgICAgYndpZHRoID0gcmVjdC5sZWZ0OwotICAgIEdldFdpbmRvd1JlY3QzMihHZXREbGdJdGVtKGh3bmQsIDEpLCAmcmVjdCk7CisgICAgR2V0V2luZG93UmVjdDMyKEdldERsZ0l0ZW0zMihod25kLCAxKSwgJnJlY3QpOwogICAgIGJ3aWR0aCAtPSByZWN0LmxlZnQ7CiAgICAgZm9yIChidXR0b25zID0gMCwgaSA9IDE7IGkgPCA4OyBpKyspCiAgICAgewotICAgICAgaEl0ZW0gPSBHZXREbGdJdGVtKGh3bmQsIGkpOworICAgICAgaEl0ZW0gPSBHZXREbGdJdGVtMzIoaHduZCwgaSk7CiAgICAgICBpZiAoR2V0V2luZG93TG9uZzMyQShoSXRlbSwgR1dMX1NUWUxFKSAmIFdTX1ZJU0lCTEUpIGJ1dHRvbnMrKzsKICAgICB9CiAgICAgCiAgICAgLyogR2V0IHRoZSB0ZXh0IHNpemUgKi8KLSAgICBoSXRlbSA9IEdldERsZ0l0ZW0oaHduZCwgMTAwKTsKKyAgICBoSXRlbSA9IEdldERsZ0l0ZW0zMihod25kLCAxMDApOwogICAgIEdldFdpbmRvd1JlY3QzMihoSXRlbSwgJnRleHRyZWN0KTsKICAgICBNYXBXaW5kb3dQb2ludHMzMigwLCBod25kLCAoTFBQT0lOVDMyKSZ0ZXh0cmVjdCwgMik7CiAgICAgCkBAIC0xMjksMzQgKzEyOSwzNCBAQAogICAgIFJlbGVhc2VEQzMyKGhJdGVtLCBoZGMpOwogICAgIAogICAgIC8qIFBvc2l0aW9uIHRoZSB0ZXh0ICovCi0gICAgU2V0V2luZG93UG9zKGhJdGVtLCAwLCB0ZXh0cmVjdC5sZWZ0LCAodGloZWlnaHQgLSB0aGVpZ2h0KSAvIDIsIAotCQkgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgdGhlaWdodCwKLQkJIFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXKTsKKyAgICBTZXRXaW5kb3dQb3MzMihoSXRlbSwgMCwgdGV4dHJlY3QubGVmdCwgKHRpaGVpZ2h0IC0gdGhlaWdodCkgLyAyLCAKKwkJICAgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgdGhlaWdodCwKKwkJICAgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcpOwogICAgIAogICAgIC8qIFBvc2l0aW9uIHRoZSBpY29uICovCi0gICAgaEl0ZW0gPSBHZXREbGdJdGVtKGh3bmQsIDEwODgpOworICAgIGhJdGVtID0gR2V0RGxnSXRlbTMyKGh3bmQsIDEwODgpOwogICAgIEdldFdpbmRvd1JlY3QzMihoSXRlbSwgJnJlY3QpOwogICAgIE1hcFdpbmRvd1BvaW50czMyKDAsIGh3bmQsIChMUFBPSU5UMzIpJnJlY3QsIDIpOwotICAgIFNldFdpbmRvd1BvcyhoSXRlbSwgMCwgcmVjdC5sZWZ0LCAodGloZWlnaHQgLSBpaGVpZ2h0KSAvIDIsIDAsIDAsCi0JCSBTV1BfTk9TSVpFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcpOworICAgIFNldFdpbmRvd1BvczMyKGhJdGVtLCAwLCByZWN0LmxlZnQsICh0aWhlaWdodCAtIGloZWlnaHQpIC8gMiwgMCwgMCwKKwkJICAgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXKTsKICAgICAKICAgICAvKiBSZXNpemUgdGhlIHdpbmRvdyAqLwotICAgIFNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCB3d2lkdGgsIDggKyB0aWhlaWdodCArIGJoZWlnaHQgKyBib3JoZWlnaHQsCi0JCSBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcpOworICAgIFNldFdpbmRvd1BvczMyKGh3bmQsIDAsIDAsIDAsIHd3aWR0aCwgOCArIHRpaGVpZ2h0ICsgYmhlaWdodCArIGJvcmhlaWdodCwKKwkJICAgU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXKTsKICAgICAKICAgICAvKiBQb3NpdGlvbiB0aGUgYnV0dG9ucyAqLwogICAgIGJwb3MgPSAod3dpZHRoIC0gYndpZHRoICogYnV0dG9ucykgLyAyOwotICAgIEdldFdpbmRvd1JlY3QzMihHZXREbGdJdGVtKGh3bmQsIDEpLCAmcmVjdCk7CisgICAgR2V0V2luZG93UmVjdDMyKEdldERsZ0l0ZW0zMihod25kLCAxKSwgJnJlY3QpOwogICAgIGZvciAoYnV0dG9ucyA9IGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAgICAgICAvKiBzb21lIGFyaXRobWV0aWMgdG8gZ2V0IHRoZSByaWdodCBvcmRlciBmb3IgWWVzTm9DYW5jZWwgd2luZG93cyAqLwotICAgICAgaEl0ZW0gPSBHZXREbGdJdGVtKGh3bmQsIChpICsgNSkgJSA3ICsgMSk7CisgICAgICBoSXRlbSA9IEdldERsZ0l0ZW0zMihod25kLCAoaSArIDUpICUgNyArIDEpOwogICAgICAgaWYgKEdldFdpbmRvd0xvbmczMkEoaEl0ZW0sIEdXTF9TVFlMRSkgJiBXU19WSVNJQkxFKSB7CiAJaWYgKGJ1dHRvbnMrKyA9PSAoKGxwbWItPnR5cGUgJiBNQl9ERUZNQVNLKSA+PiA4KSkgewogCSAgU2V0Rm9jdXMzMihoSXRlbSk7CiAJICBTZW5kTWVzc2FnZTMyQSggaEl0ZW0sIEJNX1NFVFNUWUxFMzIsIEJTX0RFRlBVU0hCVVRUT04sIFRSVUUgKTsKIAl9Ci0JU2V0V2luZG93UG9zKGhJdGVtLCAwLCBicG9zLCB0aWhlaWdodCwgMCwgMCwKLQkJICAgICBTV1BfTk9TSVpFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcpOworCVNldFdpbmRvd1BvczMyKGhJdGVtLCAwLCBicG9zLCB0aWhlaWdodCwgMCwgMCwKKwkJICAgICAgIFNXUF9OT1NJWkV8U1dQX05PWk9SREVSfFNXUF9OT0FDVElWQVRFfFNXUF9OT1JFRFJBVyk7CiAJYnBvcyArPSBid2lkdGg7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggMmY5M2E2YS4uYmE1ZjZjYyAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC00NjUsNyArNDY1LDcgQEAKICAgICBpZiggISh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpICkKICAgICB7CiAgICAgICBOQ19HZXRJbnNpZGVSZWN0KCBod25kLCAmcmVjdCApOwotICAgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCAoSXNab29tZWQoaHduZCkgPworICAgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCAoSXNab29tZWQzMihod25kKSA/CiAJCQkgICAgIChkb3duID8gaGJpdG1hcFJlc3RvcmVEIDogaGJpdG1hcFJlc3RvcmUpIDoKIAkJCSAgICAgKGRvd24gPyBoYml0bWFwTWF4aW1pemVEIDogaGJpdG1hcE1heGltaXplKSksCiAJCSAgICAgICAgcmVjdC5yaWdodCAtIFNZU01FVFJJQ1NfQ1hTSVpFIC0gMSwgcmVjdC50b3AsCkBAIC0xMDI0LDcgKzEwMjQsNyBAQAogICAgIEJPT0wzMiAgICBpY29uaWMgPSB3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRTsKICAgICBpbnQgICAgICAgbW92ZWQgPSAwOwogCi0gICAgaWYgKElzWm9vbWVkKGh3bmQpIHx8ICFJc1dpbmRvd1Zpc2libGUoaHduZCkgfHwKKyAgICBpZiAoSXNab29tZWQzMihod25kKSB8fCAhSXNXaW5kb3dWaXNpYmxlMzIoaHduZCkgfHwKICAgICAgICAgKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTUFOQUdFRCkpIHJldHVybjsKIAogICAgIGlmICgod1BhcmFtICYgMHhmZmYwKSA9PSBTQ19NT1ZFKQpAQCAtMTE5Nyw3ICsxMTk3LDcgQEAKICAgICAgICB9CiAgICAgfQogICAgIFNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX0VYSVRTSVpFTU9WRSwgMCwgMCApOwotICAgIFNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NFVFZJU0lCTEUsICFJc0ljb25pYyhod25kKSwgMEwpOworICAgIFNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX1NFVFZJU0lCTEUsICFJc0ljb25pYzE2KGh3bmQpLCAwTCk7CiAKICAgICAvKiBTaW5nbGUgY2xpY2sgYnJpbmdzIHVwIHRoZSBzeXN0ZW0gbWVudSB3aGVuIGljb25pemVkICovCiAKQEAgLTEyMTEsMTIgKzEyMTEsMTIgQEAKICAgICBpZiAoKG1zZy5tZXNzYWdlID09IFdNX0tFWURPV04pICYmIChtc2cud1BhcmFtID09IFZLX0VTQ0FQRSkpIHJldHVybjsKIAogICAgIGlmIChoaXR0ZXN0ICE9IEhUQ0FQVElPTikKLQlTZXRXaW5kb3dQb3MoIGh3bmQsIDAsIHNpemluZ1JlY3QubGVmdCwgc2l6aW5nUmVjdC50b3AsCi0JCSAgICAgc2l6aW5nUmVjdC5yaWdodCAtIHNpemluZ1JlY3QubGVmdCwKLQkJICAgICBzaXppbmdSZWN0LmJvdHRvbSAtIHNpemluZ1JlY3QudG9wLAotCQkgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSICk7Ci0gICAgZWxzZSBTZXRXaW5kb3dQb3MoIGh3bmQsIDAsIHNpemluZ1JlY3QubGVmdCwgc2l6aW5nUmVjdC50b3AsIDAsIDAsCi0JCSAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiApOworCVNldFdpbmRvd1BvczMyKCBod25kLCAwLCBzaXppbmdSZWN0LmxlZnQsIHNpemluZ1JlY3QudG9wLAorCQkgICAgICAgIHNpemluZ1JlY3QucmlnaHQgLSBzaXppbmdSZWN0LmxlZnQsCisJCSAgICAgICAgc2l6aW5nUmVjdC5ib3R0b20gLSBzaXppbmdSZWN0LnRvcCwKKwkJICAgICAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiApOworICAgIGVsc2UgU2V0V2luZG93UG9zMzIoIGh3bmQsIDAsIHNpemluZ1JlY3QubGVmdCwgc2l6aW5nUmVjdC50b3AsIDAsIDAsCisJCSAgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiApOwogfQogCiAKQEAgLTEyNTksNyArMTI1OSw3IEBACiAJU2VuZE1lc3NhZ2UxNiggaHduZCwgV01fU1lTQ09NTUFORCwgU0NfTUlOSU1JWkUsICooTE9ORyopJm1zZy5wdCApOwogICAgIGVsc2UKIAlTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9TWVNDT01NQU5ELCAKLQkJICBJc1pvb21lZChod25kKSA/IFNDX1JFU1RPUkUgOiBTQ19NQVhJTUlaRSwgKihMT05HKikmbXNnLnB0ICk7CisJCSAgSXNab29tZWQzMihod25kKSA/IFNDX1JFU1RPUkU6U0NfTUFYSU1JWkUsICooTE9ORyopJm1zZy5wdCApOwogfQogCiAKQEAgLTE0MzEsMTUgKzE0MzEsMTUgQEAKIAlicmVhazsKIAogICAgIGNhc2UgU0NfTUlOSU1JWkU6Ci0JU2hvd1dpbmRvdyggaHduZCwgU1dfTUlOSU1JWkUgKTsgCisJU2hvd1dpbmRvdzMyKCBod25kLCBTV19NSU5JTUlaRSApOyAKIAlicmVhazsKIAogICAgIGNhc2UgU0NfTUFYSU1JWkU6Ci0JU2hvd1dpbmRvdyggaHduZCwgU1dfTUFYSU1JWkUgKTsKKwlTaG93V2luZG93MzIoIGh3bmQsIFNXX01BWElNSVpFICk7CiAJYnJlYWs7CiAKICAgICBjYXNlIFNDX1JFU1RPUkU6Ci0JU2hvd1dpbmRvdyggaHduZCwgU1dfUkVTVE9SRSApOworCVNob3dXaW5kb3czMiggaHduZCwgU1dfUkVTVE9SRSApOwogCWJyZWFrOwogCiAgICAgY2FzZSBTQ19DTE9TRToKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCA0MmRhY2M2Li5iZGM1NTkzIDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC03MSw3ICs3MSw3IEBACiAKICAgICB3bmQtPmZsYWdzICY9IH5XSU5fTkVFRFNfTkNQQUlOVDsKIAotICAgIGlmICgod25kLT5od25kU2VsZiA9PSBHZXRBY3RpdmVXaW5kb3coKSkgJiYKKyAgICBpZiAoKHduZC0+aHduZFNlbGYgPT0gR2V0QWN0aXZlV2luZG93MzIoKSkgJiYKICAgICAgICAgISh3bmQtPmZsYWdzICYgV0lOX05DQUNUSVZBVEVEKSkKICAgICB7CiAgICAgICAgIHduZC0+ZmxhZ3MgfD0gV0lOX05DQUNUSVZBVEVEOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAKICAgICBpZiAoIWh3bmQpIGh3bmQgPSBHZXREZXNrdG9wV2luZG93MzIoKTsKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghSXNXaW5kb3dWaXNpYmxlKGh3bmQpIHx8ICh3bmRQdHItPmZsYWdzICYgV0lOX05PX1JFRFJBVykpCisgICAgaWYgKCFJc1dpbmRvd1Zpc2libGUzMihod25kKSB8fCAod25kUHRyLT5mbGFncyAmIFdJTl9OT19SRURSQVcpKQogICAgICAgICByZXR1cm4gVFJVRTsgIC8qIE5vIHJlZHJhdyBuZWVkZWQgKi8KIAogICAgIGJJY29uID0gKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICYmIHduZFB0ci0+Y2xhc3MtPmhJY29uKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvc2Nyb2xsLmMgYi93aW5kb3dzL3Njcm9sbC5jCmluZGV4IDg2ODlmOTAuLjlmZWMzZTAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvc2Nyb2xsLmMKKysrIGIvd2luZG93cy9zY3JvbGwuYwpAQCAtNjQsNyArNjQsNyBAQAogCSAgR2V0Q2xpZW50UmVjdDMyKGh3bmQsICZyYyk7CiAJICBocmduQ2xpcCA9IENyZWF0ZVJlY3RSZ25JbmRpcmVjdDMyKCAmcmMgKTsKIAotICAgICAgICAgIGlmICgoaENhcmV0V25kID09IGh3bmQpIHx8IElzQ2hpbGQoaHduZCxoQ2FyZXRXbmQpKQorICAgICAgICAgIGlmICgoaENhcmV0V25kID09IGh3bmQpIHx8IElzQ2hpbGQzMihod25kLGhDYXJldFduZCkpCiAgICAgICAgICAgICAgIEhpZGVDYXJldChoQ2FyZXRXbmQpOwogICAgICAgICAgIGVsc2UgaENhcmV0V25kID0gMDsKICAKQEAgLTk4LDEwICs5OCwxMCBAQAogCU9mZnNldFJnbjMyKCB3bmRTY3JvbGwtPmhyZ25VcGRhdGUsIGR4LCBkeSApOwogCiAgICAgICBmb3IgKHduZFB0ciA9IHduZFNjcm9sbC0+Y2hpbGQ7IHduZFB0cjsgd25kUHRyID0gd25kUHRyLT5uZXh0KQotICAgICAgICBTZXRXaW5kb3dQb3Mod25kUHRyLT5od25kU2VsZiwgMCwgd25kUHRyLT5yZWN0V2luZG93LmxlZnQgKyBkeCwKLSAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+cmVjdFdpbmRvdy50b3AgICsgZHksIDAsMCwgU1dQX05PWk9SREVSIHwKLSAgICAgICAgICAgICAgICAgICAgIFNXUF9OT1NJWkUgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1JFRFJBVyB8Ci0gICAgICAgICAgICAgICAgICAgICBTV1BfREVGRVJFUkFTRSApOworICAgICAgICBTZXRXaW5kb3dQb3MzMih3bmRQdHItPmh3bmRTZWxmLCAwLCB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCArIGR4LAorICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cudG9wICArIGR5LCAwLDAsIFNXUF9OT1pPUkRFUiB8CisgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT1NJWkUgfCBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1JFRFJBVyB8CisgICAgICAgICAgICAgICAgICAgICAgIFNXUF9ERUZFUkVSQVNFICk7CiAgICAgfQogCiAgICAgUEFJTlRfUmVkcmF3V2luZG93KCBod25kLCBOVUxMLCBocmduVXBkYXRlLCBSRFdfQUxMQ0hJTERSRU4gfApAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAgICAgUkVDVDMyCXJjOwogICAgICAgIENBUkVUX0dldFJlY3QoICZyYyApOwogICAgICAgIGlmKCBoQ2FyZXQgPT0gaFduZCB8fAotICAgICAgICAgIChmbGFncyAmIFNXX1NDUk9MTENISUxEUkVOICYmIElzQ2hpbGQoaFduZCwgaENhcmV0KSkgKQorICAgICAgICAgIChmbGFncyAmIFNXX1NDUk9MTENISUxEUkVOICYmIElzQ2hpbGQzMihoV25kLCBoQ2FyZXQpKSApCiAgICAgICAgewogICAgICAgICAgICBQT0lOVDMyICAgICBwdDsKIApAQCAtNDM2LDEwICs0MzYsMTAgQEAKIAkgICAgewogCQkgQ09OVl9SRUNUMTZUTzMyKCAmdy0+cmVjdFdpbmRvdywgJnIgKTsKIAkgICAgICAgICBpZiggSW50ZXJzZWN0UmVjdDMyKCZyLCAmciwgJmNsaXByYykgKQotCQkgICAgIFNldFdpbmRvd1Bvcyh3LT5od25kU2VsZiwgMCwgdy0+cmVjdFdpbmRvdy5sZWZ0ICsgZHgsCi0JCQkJICB3LT5yZWN0V2luZG93LnRvcCAgKyBkeSwgMCwwLCBTV1BfTk9aT1JERVIgfAotCQkJCSAgU1dQX05PU0laRSB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXIHwKLQkJCQkgIFNXUF9ERUZFUkVSQVNFICk7CisJCSAgICAgU2V0V2luZG93UG9zMzIody0+aHduZFNlbGYsIDAsIHctPnJlY3RXaW5kb3cubGVmdCArIGR4LAorCQkJCSAgICB3LT5yZWN0V2luZG93LnRvcCAgKyBkeSwgMCwwLCBTV1BfTk9aT1JERVIgfAorCQkJCSAgICBTV1BfTk9TSVpFIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcgfAorCQkJCSAgICBTV1BfREVGRVJFUkFTRSApOwogCSAgICB9CiAJfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCAwOTY2YjQ5Li4zMWNlZmZkIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJkZGVfcHJvYy5oIgogI2luY2x1ZGUgImNsaXBib2FyZC5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19XSU4gICovIAogLyogI2RlZmluZSBERUJVR19NRU5VICovCkBAIC0zODUsNyArMzg2LDcgQEAKICAgICAgICAgbmV4dCA9IHduZC0+bmV4dDsKICAgICAgICAgaWYgKHduZC0+aG1lbVRhc2tRID09IGhRdWV1ZSkKIAkgICBpZiggaE5ldyApIHduZC0+aG1lbVRhc2tRID0gaE5ldzsKLQkgICBlbHNlIERlc3Ryb3lXaW5kb3coIHduZC0+aHduZFNlbGYgKTsKKwkgICBlbHNlIERlc3Ryb3lXaW5kb3czMiggd25kLT5od25kU2VsZiApOwogICAgICAgICBlbHNlIFdJTl9SZXNldFF1ZXVlV2luZG93cyggd25kLT5jaGlsZCwgaFF1ZXVlLCBoTmV3ICk7CiAgICAgICAgIHduZCA9IG5leHQ7CiAgICAgfQpAQCAtNzgyLDIwICs3ODMsMjAgQEAKIAogICAgICAgICB3bmRQdHItPmR3U3R5bGUgJj0gfldTX01BWElNSVpFOwogICAgICAgICBXSU5QT1NfRmluZEljb25Qb3MoIGh3bmQgKTsKLSAgICAgICAgU2V0V2luZG93UG9zKCBod25kLCAwLCB3bmRQdHItPnB0SWNvblBvcy54LCB3bmRQdHItPnB0SWNvblBvcy55LAotICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1hJQ09OLCBTWVNNRVRSSUNTX0NZSUNPTiwgCi0gICAgICAgICAgICAgICAgICAgICAgU1dQX0ZSQU1FQ0hBTkdFRCB8ICgoR2V0QWN0aXZlV2luZG93KCkpPyBTV1BfTk9BQ1RJVkFURSA6IDApICApOworICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgd25kUHRyLT5wdEljb25Qb3MueCwgd25kUHRyLT5wdEljb25Qb3MueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNZU01FVFJJQ1NfQ1hJQ09OLCBTWVNNRVRSSUNTX0NZSUNPTiwgCisgICAgICAgICAgICAgICAgICAgICAgICBTV1BfRlJBTUVDSEFOR0VEIHwgKChHZXRBY3RpdmVXaW5kb3czMigpKT8gU1dQX05PQUNUSVZBVEUgOiAwKSAgKTsKICAgICB9CiAgICAgZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkUpCiAgICAgewogCS8qIE1pbk1heGltaXplKGh3bmQsIFNXX1NIT1dNQVhJTUlaRUQsIDEpICovCiAKICAgICAgICAgTkNfR2V0TWluTWF4SW5mbyggd25kUHRyLCAmbWF4U2l6ZSwgJm1heFBvcywgJm1pblRyYWNrLCAmbWF4VHJhY2sgKTsKLSAgICAgICAgU2V0V2luZG93UG9zKCBod25kLCAwLCBtYXhQb3MueCwgbWF4UG9zLnksIG1heFNpemUueCwgbWF4U2l6ZS55LAotICAgICAgICAgICAgKChHZXRBY3RpdmVXaW5kb3coKSk/IFNXUF9OT0FDVElWQVRFIDogMCkgfCBTV1BfRlJBTUVDSEFOR0VEICk7CisgICAgICAgIFNldFdpbmRvd1BvczMyKCBod25kLCAwLCBtYXhQb3MueCwgbWF4UG9zLnksIG1heFNpemUueCwgbWF4U2l6ZS55LAorICAgICAgICAgICAgKChHZXRBY3RpdmVXaW5kb3czMigpKT8gU1dQX05PQUNUSVZBVEUgOiAwKSB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKICAgICB9CiAgICAgCi0gICAgaWYgKGNzLT5zdHlsZSAmIFdTX1ZJU0lCTEUpIFNob3dXaW5kb3coIGh3bmQsIFNXX1NIT1cgKTsKKyAgICBpZiAoY3MtPnN0eWxlICYgV1NfVklTSUJMRSkgU2hvd1dpbmRvdzMyKCBod25kLCBTV19TSE9XICk7CiAKICAgICAvKiBDYWxsIFdIX1NIRUxMIGhvb2sgKi8KIApAQCAtOTg5LDcgKzk5MCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRGVzdHJveVdpbmRvdyAgIChVU0VSLjUzKQogICovCi1CT09MIERlc3Ryb3lXaW5kb3coIEhXTkQgaHduZCApCitCT09MMTYgRGVzdHJveVdpbmRvdzE2KCBIV05EMTYgaHduZCApCit7CisgICAgcmV0dXJuIERlc3Ryb3lXaW5kb3czMihod25kKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERlc3Ryb3lXaW5kb3cgICAoVVNFUjMyLjEzNCkKKyAqLworQk9PTDMyIERlc3Ryb3lXaW5kb3czMiggSFdORDMyIGh3bmQgKQogewogICAgIFdORCAqIHduZFB0cjsKIApAQCAtMTAyMSw5ICsxMDI5LDkgQEAKIAogICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFKQogICAgIHsKLSAgICAgICAgU2V0V2luZG93UG9zKCBod25kLCAwLCAwLCAwLCAwLCAwLCBTV1BfSElERVdJTkRPVyB8Ci0JCSAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PTU9WRSB8IFNXUF9OT1NJWkUgfAotCQkgICAgKChRVUVVRV9Jc0Rvb21lZFF1ZXVlKHduZFB0ci0+aG1lbVRhc2tRKSk/U1dQX0RFRkVSRVJBU0U6MCkgKTsKKyAgICAgICAgU2V0V2luZG93UG9zMzIoIGh3bmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9ISURFV0lORE9XIHwKKwkJICAgICAgICBTV1BfTk9BQ1RJVkFURXxTV1BfTk9aT1JERVJ8U1dQX05PTU9WRXxTV1BfTk9TSVpFfAorCQkgICAgICAgICgoUVVFVUVfSXNEb29tZWRRdWV1ZSh3bmRQdHItPmhtZW1UYXNrUSkpP1NXUF9ERUZFUkVSQVNFOjApICk7CiAJaWYoICFJc1dpbmRvdyhod25kKSApIHJldHVybiBUUlVFOwogICAgIH0KIApAQCAtMTA0Myw3ICsxMDUxLDcgQEAKICAgICAgICAgICAgICAgICAgICBzaWJsaW5nUHRyLT5vd25lciA9IE5VTEw7CiAgICAgICAgICAgICBzaWJsaW5nUHRyID0gc2libGluZ1B0ci0+bmV4dDsKICAgICAgICAgfQotICAgICAgICBpZiAoc2libGluZ1B0cikgRGVzdHJveVdpbmRvdyggc2libGluZ1B0ci0+aHduZFNlbGYgKTsKKyAgICAgICAgaWYgKHNpYmxpbmdQdHIpIERlc3Ryb3lXaW5kb3czMiggc2libGluZ1B0ci0+aHduZFNlbGYgKTsKICAgICAgICAgZWxzZSBicmVhazsKICAgICAgIH0KIApAQCAtMTA3Nyw3ICsxMDg1LDcgQEAKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKICAgICBpZiAoIXduZFB0ciB8fCAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpKSByZXR1cm4gVFJVRTsKLSAgICBTaG93V2luZG93KGhXbmQsIFNXX01JTklNSVpFKTsKKyAgICBTaG93V2luZG93MzIoaFduZCwgU1dfTUlOSU1JWkUpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0xMDg3LDggKzEwOTUsOCBAQAogICovCiBCT09MIE9wZW5JY29uKEhXTkQgaFduZCkKIHsKLSAgICBpZiAoIUlzSWNvbmljKGhXbmQpKSByZXR1cm4gRkFMU0U7Ci0gICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKKyAgICBpZiAoIUlzSWNvbmljMTYoaFduZCkpIHJldHVybiBGQUxTRTsKKyAgICBTaG93V2luZG93MzIoaFduZCwgU1dfU0hPV05PUk1BTCk7CiAgICAgcmV0dXJuKFRSVUUpOwogfQogCkBAIC0xMjc2LDkgKzEyODQsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVuYWJsZVdpbmRvdyAgIChVU0VSLjM0KQorICogICAgICAgICAgIEVuYWJsZVdpbmRvdzE2ICAgKFVTRVIuMzQpCiAgKi8KLUJPT0wgRW5hYmxlV2luZG93KCBIV05EIGh3bmQsIEJPT0wgZW5hYmxlICkKK0JPT0wxNiBFbmFibGVXaW5kb3cxNiggSFdORDE2IGh3bmQsIEJPT0wxNiBlbmFibGUgKQoreworICAgIHJldHVybiBFbmFibGVXaW5kb3czMiggaHduZCwgZW5hYmxlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFbmFibGVXaW5kb3czMiAgIChVU0VSMzIuMTcxKQorICovCitCT09MMzIgRW5hYmxlV2luZG93MzIoIEhXTkQzMiBod25kLCBCT09MMzIgZW5hYmxlICkKIHsKICAgICBXTkQgKnduZFB0cjsKIApAQCAtMTI4NywxOCArMTMwNCwxOCBAQAogICAgIHsKIAkgIC8qIEVuYWJsZSB3aW5kb3cgKi8KIAl3bmRQdHItPmR3U3R5bGUgJj0gfldTX0RJU0FCTEVEOwotCVNlbmRNZXNzYWdlMTYoIGh3bmQsIFdNX0VOQUJMRSwgVFJVRSwgMCApOworCVNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9FTkFCTEUsIFRSVUUsIDAgKTsKIAlyZXR1cm4gVFJVRTsKICAgICB9CiAgICAgZWxzZSBpZiAoIWVuYWJsZSAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSkKICAgICB7CiAJICAvKiBEaXNhYmxlIHdpbmRvdyAqLwogCXduZFB0ci0+ZHdTdHlsZSB8PSBXU19ESVNBQkxFRDsKLQlpZiAoKGh3bmQgPT0gR2V0Rm9jdXMzMigpKSB8fCBJc0NoaWxkKCBod25kLCBHZXRGb2N1czMyKCkgKSkKKwlpZiAoKGh3bmQgPT0gR2V0Rm9jdXMzMigpKSB8fCBJc0NoaWxkMzIoIGh3bmQsIEdldEZvY3VzMzIoKSApKQogCSAgICBTZXRGb2N1czMyKCAwICk7ICAvKiBBIGRpc2FibGVkIHdpbmRvdyBjYW4ndCBoYXZlIHRoZSBmb2N1cyAqLwotCWlmICgoaHduZCA9PSBHZXRDYXB0dXJlMzIoKSkgfHwgSXNDaGlsZCggaHduZCwgR2V0Q2FwdHVyZTMyKCkgKSkKKwlpZiAoKGh3bmQgPT0gR2V0Q2FwdHVyZTMyKCkpIHx8IElzQ2hpbGQzMiggaHduZCwgR2V0Q2FwdHVyZTMyKCkgKSkKIAkgICAgUmVsZWFzZUNhcHR1cmUoKTsgIC8qIEEgZGlzYWJsZWQgd2luZG93IGNhbid0IGNhcHR1cmUgdGhlIG1vdXNlICovCi0JU2VuZE1lc3NhZ2UxNiggaHduZCwgV01fRU5BQkxFLCBGQUxTRSwgMCApOworCVNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9FTkFCTEUsIEZBTFNFLCAwICk7CiAJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gKCh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkgIT0gMCk7CkBAIC0xMzA2LDkgKzEzMjMsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBJc1dpbmRvd0VuYWJsZWQgICAoVVNFUi4zNSkgKFVTRVIzMi4zNDgpCisgKiAgICAgICAgICAgSXNXaW5kb3dFbmFibGVkMTYgICAoVVNFUi4zNSkKICAqLyAKLUJPT0wgSXNXaW5kb3dFbmFibGVkKEhXTkQgaFduZCkKK0JPT0wxNiBJc1dpbmRvd0VuYWJsZWQxNihIV05EMTYgaFduZCkKK3sKKyAgICByZXR1cm4gSXNXaW5kb3dFbmFibGVkMzIoaFduZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSXNXaW5kb3dFbmFibGVkMzIgICAoVVNFUjMyLjM0OCkKKyAqLyAKK0JPT0wzMiBJc1dpbmRvd0VuYWJsZWQzMihIV05EMzIgaFduZCkKIHsKICAgICBXTkQgKiB3bmRQdHI7IAogCkBAIC0xNjkxLDcgKzE3MTcsNyBAQAogICAgIGlmIChod25kTmV3UGFyZW50KSB3bmRQdHItPnBhcmVudCA9IHBXbmRQYXJlbnQ7CiAgICAgV0lOX0xpbmtXaW5kb3coaHduZENoaWxkLCBIV05EX0JPVFRPTSk7CiAgICAgCi0gICAgaWYgKElzV2luZG93VmlzaWJsZShod25kQ2hpbGQpKSBVcGRhdGVXaW5kb3coaHduZENoaWxkKTsKKyAgICBpZiAoSXNXaW5kb3dWaXNpYmxlMzIoaHduZENoaWxkKSkgVXBkYXRlV2luZG93KGh3bmRDaGlsZCk7CiAgICAgCiAgICAgcmV0dXJuIG9sZFBhcmVudDsKIH0KQEAgLTE3MDEsNyArMTcyNywxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgSXNDaGlsZCAgICAoVVNFUi40OCkKICAqLwotQk9PTCBJc0NoaWxkKCBIV05EIHBhcmVudCwgSFdORCBjaGlsZCApCitCT09MMTYgSXNDaGlsZDE2KCBIV05EMTYgcGFyZW50LCBIV05EMTYgY2hpbGQgKQoreworICAgIHJldHVybiBJc0NoaWxkMzIocGFyZW50LGNoaWxkKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIElzQ2hpbGQgICAgKFVTRVIzMi4zMzgpCisgKi8KK0JPT0wzMiBJc0NoaWxkMzIoIEhXTkQzMiBwYXJlbnQsIEhXTkQzMiBjaGlsZCApCiB7CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGNoaWxkICk7CiAgICAgd2hpbGUgKHduZFB0ciAmJiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpKQpAQCAtMTcxNCw5ICsxNzQ3LDE2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSXNXaW5kb3dWaXNpYmxlICAgKFVTRVIuNDkpIChVU0VSMzIuMzUwKQorICogICAgICAgICAgIElzV2luZG93VmlzaWJsZSAgIChVU0VSLjQ5KQogICovCi1CT09MIElzV2luZG93VmlzaWJsZSggSFdORCBod25kICkKK0JPT0wxNiBJc1dpbmRvd1Zpc2libGUxNiggSFdORDE2IGh3bmQgKQoreworICAgIHJldHVybiBJc1dpbmRvd1Zpc2libGUzMihod25kKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElzV2luZG93VmlzaWJsZSAgIChVU0VSMzIuMzUwKQorICovCitCT09MMzIgSXNXaW5kb3dWaXNpYmxlMzIoIEhXTkQzMiBod25kICkKIHsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgd2hpbGUgKHduZFB0ciAmJiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpKQpAQCAtMTc1Myw3ICsxNzkzLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBHZXRUb3BXaW5kb3cgICAgKFVTRVIuMjI5KQogICovCi1IV05EIEdldFRvcFdpbmRvdyggSFdORCBod25kICkKK0hXTkQxNiBHZXRUb3BXaW5kb3cxNiggSFdORDE2IGh3bmQgKQoreworICAgIHJldHVybiBHZXRUb3BXaW5kb3czMihod25kKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldFRvcFdpbmRvdyAgICAoVVNFUi4yMjkpCisgKi8KK0hXTkQzMiBHZXRUb3BXaW5kb3czMiggSFdORDMyIGh3bmQgKQogewogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAgICAgaWYgKHduZFB0ciAmJiB3bmRQdHItPmNoaWxkKSByZXR1cm4gd25kUHRyLT5jaGlsZC0+aHduZFNlbGY7CkBAIC0xNzY0LDcgKzE4MTEsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIEdldFdpbmRvdyAgICAoVVNFUi4yNjIpCiAgKi8KLUhXTkQgR2V0V2luZG93KCBIV05EIGh3bmQsIFdPUkQgcmVsICkKK0hXTkQxNiBHZXRXaW5kb3cxNiggSFdORDE2IGh3bmQsIFdPUkQgcmVsICkKK3sKKyAgICByZXR1cm4gR2V0V2luZG93MzIoIGh3bmQscmVsICk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRXaW5kb3cgICAgKFVTRVIzMi4zMDEpCisgKi8KK0hXTkQzMiBHZXRXaW5kb3czMiggSFdORDMyIGh3bmQsIFdPUkQgcmVsICkKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKQEAgLTE4MDcsMTAgKzE4NjEsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIEdldE5leHRXaW5kb3cgICAgKFVTRVIuMjMwKQogICovCi1IV05EIEdldE5leHRXaW5kb3coIEhXTkQgaHduZCwgV09SRCBmbGFnICkKK0hXTkQxNiBHZXROZXh0V2luZG93MTYoIEhXTkQxNiBod25kLCBXT1JEIGZsYWcgKQogewogICAgIGlmICgoZmxhZyAhPSBHV19IV05ETkVYVCkgJiYgKGZsYWcgIT0gR1dfSFdORFBSRVYpKSByZXR1cm4gMDsKLSAgICByZXR1cm4gR2V0V2luZG93KCBod25kLCBmbGFnICk7CisgICAgcmV0dXJuIEdldFdpbmRvdzE2KCBod25kLCBmbGFnICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xODIzLDcgKzE4NzcsNyBAQAogICAgIHsKICAgICAgICAgaWYgKHBXbmQtPm93bmVyICYmIChwV25kLT5vd25lci0+aHduZFNlbGYgPT0gb3duZXIpICYmCiAgICAgICAgICAgICAocFduZC0+ZHdTdHlsZSAmIFdTX1BPUFVQKSkKLSAgICAgICAgICAgIFNob3dXaW5kb3coIHBXbmQtPmh3bmRTZWxmLCBmU2hvdyA/IFNXX1NIT1cgOiBTV19ISURFICk7CisgICAgICAgICAgICBTaG93V2luZG93MzIoIHBXbmQtPmh3bmRTZWxmLCBmU2hvdyA/IFNXX1NIT1cgOiBTV19ISURFICk7CiAgICAgICAgIHBXbmQgPSBwV25kLT5uZXh0OwogICAgIH0KIH0KQEAgLTE5MzcsNyArMTk5MSw5IEBACiAgKi8KIEJPT0wzMiBFbnVtVGhyZWFkV2luZG93cyggRFdPUkQgaWQsIFdOREVOVU1QUk9DMzIgZnVuYywgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgcmV0dXJuIChCT09MMTYpRW51bVRhc2tXaW5kb3dzMTYoKEhUQVNLMTYpaWQsIChXTkRFTlVNUFJPQzE2KWZ1bmMsIGxQYXJhbSk7CisgICAgVEhEQgkqdGRiID0gKFRIREIqKWlkOworCisgICAgcmV0dXJuIChCT09MMTYpRW51bVRhc2tXaW5kb3dzMTYodGRiLT50ZWIuaHRhc2sxNiwgKFdOREVOVU1QUk9DMTYpZnVuYywgbFBhcmFtKTsKIH0KIAogCkBAIC0yMDM5LDcgKzIwOTUsNyBAQAogICAgIHsKICAgICAgICAgV1BBUkFNMTYgd3BhcmFtOwogICAgICAgICBpZiAoYkludmVydCkgd3BhcmFtID0gISh3bmRQdHItPmZsYWdzICYgV0lOX05DQUNUSVZBVEVEKTsKLSAgICAgICAgZWxzZSB3cGFyYW0gPSAoaFduZCA9PSBHZXRBY3RpdmVXaW5kb3coKSk7CisgICAgICAgIGVsc2Ugd3BhcmFtID0gKGhXbmQgPT0gR2V0QWN0aXZlV2luZG93MzIoKSk7CiAKICAgICAgICAgU2VuZE1lc3NhZ2UxNiggaFduZCwgV01fTkNBQ1RJVkFURSwgd3BhcmFtLCAoTFBBUkFNKTAgKTsKICAgICAgICAgcmV0dXJuIHdwYXJhbTsKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IDQwNTE2ZjMuLmFkYWM4MmYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtNSw2ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAxOTk1LDE5OTYgQWxleCBLb3JvYmthCiAgKi8KIAorI2RlZmluZSBOT19UUkFOU0lUSU9OX1RZUEVTCiAjaW5jbHVkZSA8WDExL1hsaWIuaD4KICNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KICNpbmNsdWRlIDxYMTEvWGF0b20uaD4KQEAgLTM4LDE1ICszOSwxNSBAQAogCiAvKiAtLS0tLSBleHRlcm5hbCBmdW5jdGlvbnMgLS0tLS0gKi8KIAotZXh0ZXJuIHZvaWQgCUZPQ1VTX1N3aXRjaEZvY3VzKCBIV05EICwgSFdORCApOwotZXh0ZXJuIEhSR04zMiAJRENFX0dldFZpc1JnbiggSFdORCwgV09SRCApOwotZXh0ZXJuIEhXTkQJQ0FSRVRfR2V0SHduZCgpOwotZXh0ZXJuIEJPT0wgICAgIERDRV9JbnZhbGlkYXRlRENFKFdORCosIFJFQ1QxNiogKTsKK2V4dGVybiB2b2lkIAlGT0NVU19Td2l0Y2hGb2N1cyggSFdORDMyICwgSFdORDMyICk7CitleHRlcm4gSFJHTjMyIAlEQ0VfR2V0VmlzUmduKCBIV05EMzIsIFdPUkQgKTsKK2V4dGVybiBIV05EMzIJQ0FSRVRfR2V0SHduZCgpOworZXh0ZXJuIEJPT0wzMiAgIERDRV9JbnZhbGlkYXRlRENFKFdORCosIFJFQ1QxNiogKTsKIAogLyogLS0tLS0gaW50ZXJuYWwgdmFyaWFibGVzIC0tLS0tICovCiAKLXN0YXRpYyBIV05EIGh3bmRBY3RpdmUgICAgICA9IDA7ICAvKiBDdXJyZW50bHkgYWN0aXZlIHdpbmRvdyAqLwotc3RhdGljIEhXTkQgaHduZFByZXZBY3RpdmUgID0gMDsgIC8qIFByZXZpb3VzbHkgYWN0aXZlIHdpbmRvdyAqLworc3RhdGljIEhXTkQzMiBod25kQWN0aXZlICAgICAgPSAwOyAgLyogQ3VycmVudGx5IGFjdGl2ZSB3aW5kb3cgKi8KK3N0YXRpYyBIV05EMzIgaHduZFByZXZBY3RpdmUgID0gMDsgIC8qIFByZXZpb3VzbHkgYWN0aXZlIHdpbmRvdyAqLwogCiBleHRlcm4gTUVTU0FHRVFVRVVFKiBwQWN0aXZlUXVldWU7CiAKQEAgLTExNywyNiArMTE4LDMyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQXJyYW5nZUljb25pY1dpbmRvd3MgICAoVVNFUjMyLjYpCisgKi8KK1VJTlQxNiBBcnJhbmdlSWNvbmljV2luZG93czE2KCBIV05EMTYgcGFyZW50KSB7CisgICAgcmV0dXJuIEFycmFuZ2VJY29uaWNXaW5kb3dzMzIocGFyZW50KTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzICAgKFVTRVIuMTcwKQogICovCi1VSU5UIEFycmFuZ2VJY29uaWNXaW5kb3dzKCBIV05EIHBhcmVudCApCitVSU5UMzIgQXJyYW5nZUljb25pY1dpbmRvd3MzMiggSFdORDMyIHBhcmVudCApCiB7Ci0gICAgUkVDVDE2IHJlY3RQYXJlbnQ7Ci0gICAgSFdORCBod25kQ2hpbGQ7Ci0gICAgSU5UIHgsIHksIHhzcGFjaW5nLCB5c3BhY2luZzsKKyAgICBSRUNUMzIgcmVjdFBhcmVudDsKKyAgICBIV05EMzIgaHduZENoaWxkOworICAgIElOVDMyIHgsIHksIHhzcGFjaW5nLCB5c3BhY2luZzsKIAotICAgIEdldENsaWVudFJlY3QxNiggcGFyZW50LCAmcmVjdFBhcmVudCApOworICAgIEdldENsaWVudFJlY3QzMiggcGFyZW50LCAmcmVjdFBhcmVudCApOwogICAgIHggPSByZWN0UGFyZW50LmxlZnQ7CiAgICAgeSA9IHJlY3RQYXJlbnQuYm90dG9tOwogICAgIHhzcGFjaW5nID0geXNwYWNpbmcgPSA3MDsgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBjb21lIGZyb20gV0lOLklOSSAqLwotICAgIGh3bmRDaGlsZCA9IEdldFdpbmRvdyggcGFyZW50LCBHV19DSElMRCApOworICAgIGh3bmRDaGlsZCA9IEdldFdpbmRvdzMyKCBwYXJlbnQsIEdXX0NISUxEICk7CiAgICAgd2hpbGUgKGh3bmRDaGlsZCkKICAgICB7Ci0gICAgICAgIGlmIChJc0ljb25pYyggaHduZENoaWxkICkpCisgICAgICAgIGlmIChJc0ljb25pYzMyKCBod25kQ2hpbGQgKSkKICAgICAgICAgewotICAgICAgICAgICAgU2V0V2luZG93UG9zKCBod25kQ2hpbGQsIDAsIHggKyAoeHNwYWNpbmcgLSBTWVNNRVRSSUNTX0NYSUNPTikgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB5IC0gKHlzcGFjaW5nICsgU1lTTUVUUklDU19DWUlDT04pIC8gMiwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFICk7CisgICAgICAgICAgICBTZXRXaW5kb3dQb3MzMiggaHduZENoaWxkLCAwLCB4ICsgKHhzcGFjaW5nIC0gU1lTTUVUUklDU19DWElDT04pIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC0gKHlzcGFjaW5nICsgU1lTTUVUUklDU19DWUlDT04pIC8gMiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV1BfTk9TSVpFfFNXUF9OT1pPUkRFUnxTV1BfTk9BQ1RJVkFURSApOwogICAgICAgICAgICAgaWYgKHggPD0gcmVjdFBhcmVudC5yaWdodCAtIHhzcGFjaW5nKSB4ICs9IHhzcGFjaW5nOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtMTQ0LDcgKzE1MSw3IEBACiAgICAgICAgICAgICAgICAgeSAtPSB5c3BhY2luZzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBod25kQ2hpbGQgPSBHZXRXaW5kb3coIGh3bmRDaGlsZCwgR1dfSFdORE5FWFQgKTsKKyAgICAgICAgaHduZENoaWxkID0gR2V0V2luZG93MzIoIGh3bmRDaGlsZCwgR1dfSFdORE5FWFQgKTsKICAgICB9CiAgICAgcmV0dXJuIHlzcGFjaW5nOwogfQpAQCAtMzE2LDcgKzMyMyw3IEBACiAKICAgICAgICAgLyogU2VuZCB0aGUgV01fTkNISVRURVNUIG1lc3NhZ2UgKG9ubHkgaWYgdG8gdGhlIHNhbWUgdGFzaykgKi8KICAgICAgICAgaWYgKCgqcHBXbmQpLT5obWVtVGFza1EgIT0gR2V0VGFza1F1ZXVlKDApKSByZXR1cm4gSFRDTElFTlQ7Ci0gICAgICAgIGhpdHRlc3QgPSAoSU5UKVNlbmRNZXNzYWdlMTYoICgqcHBXbmQpLT5od25kU2VsZiwgV01fTkNISVRURVNULCAwLAorICAgICAgICBoaXR0ZXN0ID0gKElOVDE2KVNlbmRNZXNzYWdlMTYoICgqcHBXbmQpLT5od25kU2VsZiwgV01fTkNISVRURVNULCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoIHB0LngsIHB0LnkgKSApOwogICAgICAgICBpZiAoaGl0dGVzdCAhPSBIVFRSQU5TUEFSRU5UKSByZXR1cm4gaGl0dGVzdDsgIC8qIEZvdW5kIHRoZSB3aW5kb3cgKi8KIApAQCAtNDg1LDcgKzQ5MiwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSXNJY29uaWMgICAoVVNFUi4zMSkKICAqLwotQk9PTCBJc0ljb25pYyhIV05EIGhXbmQpCitCT09MMTYgSXNJY29uaWMxNihIV05EMTYgaFduZCkKK3sKKyAgICByZXR1cm4gSXNJY29uaWMzMihoV25kKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElzSWNvbmljICAgKFVTRVIzMi4zNDQpCisgKi8KK0JPT0wzMiBJc0ljb25pYzMyKEhXTkQzMiBoV25kKQogewogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwogICAgIGlmICh3bmRQdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwpAQCAtNDk2LDcgKzUxMCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgSXNab29tZWQgICAoVVNFUi4yNzIpCiAgKi8KLUJPT0wgSXNab29tZWQoSFdORCBoV25kKQorQk9PTDE2IElzWm9vbWVkMTYoSFdORDE2IGhXbmQpCit7CisgICAgcmV0dXJuIElzWm9vbWVkMzIoaFduZCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJc1pvb21lZCAgIChVU0VSMzIuMzUxKQorICovCitCT09MMzIgSXNab29tZWQzMihIV05EMzIgaFduZCkKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKICAgICBpZiAod25kUHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKQEAgLTUwNyw3ICs1MjgsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIEdldEFjdGl2ZVdpbmRvdyAgICAoVVNFUi42MCkKICAqLwotSFdORCBHZXRBY3RpdmVXaW5kb3codm9pZCkKK0hXTkQxNiBHZXRBY3RpdmVXaW5kb3cxNih2b2lkKQoreworICAgIHJldHVybiBHZXRBY3RpdmVXaW5kb3czMigpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgR2V0QWN0aXZlV2luZG93ICAgIChVU0VSMzIuMjA0KQorICovCitIV05EMzIgR2V0QWN0aXZlV2luZG93MzIodm9pZCkKIHsKICAgICByZXR1cm4gaHduZEFjdGl2ZTsKIH0KQEAgLTUyNiw5ICs1NTQsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIFNldEFjdGl2ZVdpbmRvdyAgICAoVVNFUi41OSkKICAqLwotSFdORCBTZXRBY3RpdmVXaW5kb3coIEhXTkQgaHduZCApCitIV05EMTYgU2V0QWN0aXZlV2luZG93MTYoIEhXTkQxNiBod25kICkKIHsKLSAgICBIV05EIHByZXYgPSBod25kQWN0aXZlOworICAgIHJldHVybiBTZXRBY3RpdmVXaW5kb3czMihod25kKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIFNldEFjdGl2ZVdpbmRvdyAgICAoVVNFUi41OSkKKyAqLworSFdORDMyIFNldEFjdGl2ZVdpbmRvdzMyKCBIV05EMzIgaHduZCApCit7CisgICAgSFdORDMyIHByZXYgPSBod25kQWN0aXZlOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKIAogICAgIGlmICggIVdJTlBPU19Jc0dvb2RFbm91Z2god25kUHRyKSApIHJldHVybiAwOwpAQCAtNTQxLDI5ICs1NzYsNTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEJyaW5nV2luZG93VG9Ub3AgICAoVVNFUi40NSkKICAqLwotQk9PTCBCcmluZ1dpbmRvd1RvVG9wKCBIV05EIGh3bmQgKQorQk9PTDE2IEJyaW5nV2luZG93VG9Ub3AxNiggSFdORDE2IGh3bmQgKQogewotICAgIHJldHVybiBTZXRXaW5kb3dQb3MoIGh3bmQsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLCBTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSApOworICAgIHJldHVybiBCcmluZ1dpbmRvd1RvVG9wMzIoaHduZCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBCcmluZ1dpbmRvd1RvVG9wICAgKFVTRVIzMi4xMCkKKyAqLworQk9PTDMyIEJyaW5nV2luZG93VG9Ub3AzMiggSFdORDMyIGh3bmQgKQoreworICAgIHJldHVybiBTZXRXaW5kb3dQb3MzMiggaHduZCwgSFdORF9UT1AsIDAsIDAsIDAsIDAsIFNXUF9OT01PVkV8U1dQX05PU0laRSApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1vdmVXaW5kb3cgICAoVVNFUi41NikKICAqLwotQk9PTCBNb3ZlV2luZG93KCBIV05EIGh3bmQsIHNob3J0IHgsIHNob3J0IHksIHNob3J0IGN4LCBzaG9ydCBjeSwgQk9PTCByZXBhaW50KQoteyAgICAKK0JPT0wxNiBNb3ZlV2luZG93MTYoCisJSFdORDE2IGh3bmQsIElOVDE2IHgsIElOVDE2IHksIElOVDE2IGN4LCBJTlQxNiBjeSwgQk9PTDE2IHJlcGFpbnQKKykgeworICAgIHJldHVybiBNb3ZlV2luZG93MzIoaHduZCx4LHksY3gsY3kscmVwYWludCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNb3ZlV2luZG93ICAgKFVTRVIzMi4zOTgpCisgKi8KK0JPT0wzMiBNb3ZlV2luZG93MzIoCisJSFdORDMyIGh3bmQsIElOVDMyIHgsIElOVDMyIHksIElOVDMyIGN4LCBJTlQzMiBjeSwgQk9PTDMyIHJlcGFpbnQKKykgeyAgICAKICAgICBpbnQgZmxhZ3MgPSBTV1BfTk9aT1JERVIgfCBTV1BfTk9BQ1RJVkFURTsKICAgICBpZiAoIXJlcGFpbnQpIGZsYWdzIHw9IFNXUF9OT1JFRFJBVzsKICAgICBkcHJpbnRmX3dpbihzdGRkZWIsICJNb3ZlV2luZG93OiAlMDR4ICVkLCVkICVkeCVkICVkXG4iLCAKIAkgICAgaHduZCwgeCwgeSwgY3gsIGN5LCByZXBhaW50ICk7Ci0gICAgcmV0dXJuIFNldFdpbmRvd1BvcyggaHduZCwgMCwgeCwgeSwgY3gsIGN5LCBmbGFncyApOworICAgIHJldHVybiBTZXRXaW5kb3dQb3MzMiggaHduZCwgMCwgeCwgeSwgY3gsIGN5LCBmbGFncyApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNob3dXaW5kb3cgICAoVVNFUi40MikKICAqLwotQk9PTCBTaG93V2luZG93KCBIV05EIGh3bmQsIGludCBjbWQgKSAKK0JPT0wxNiBTaG93V2luZG93MTYoIEhXTkQxNiBod25kLCBJTlQxNiBjbWQgKSAKK3sgICAgCisgICAgcmV0dXJuIFNob3dXaW5kb3czMihod25kLGNtZCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTaG93V2luZG93ICAgKFVTRVIuNDIpCisgKi8KK0JPT0wzMiBTaG93V2luZG93MzIoIEhXTkQzMiBod25kLCBJTlQzMiBjbWQgKSAKIHsgICAgCiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBCT09MMzIgd2FzVmlzaWJsZSwgc2hvd0ZsYWc7CkBAIC02MzYsNyArNjkzLDcgQEAKICAgICAgICAgICAgICAgICB5ICA9IHduZFB0ci0+cHRNYXhQb3MueTsKIAogCQlpZiggd25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUgKQotCQkgICAgaWYoICFTZW5kTWVzc2FnZTE2KCBod25kLCBXTV9RVUVSWU9QRU4sIDAsIDBMICkgKQorCQkgICAgaWYoICFTZW5kTWVzc2FnZTMyQSggaHduZCwgV01fUVVFUllPUEVOLCAwLCAwTCApICkKIAkJCXsKIAkJICAgICAgICAgc3dwZmxhZ3MgfD0gU1dQX05PU0laRSB8IFNXUF9OT01PVkU7CiAJCQkgYnJlYWs7CkBAIC02NjAsNyArNzE3LDcgQEAKIAogCWNhc2UgU1dfU0hPV05PQUNUSVZBVEU6CiAgICAgICAgICAgICBzd3BmbGFncyB8PSBTV1BfTk9aT1JERVI7Ci0gICAgICAgICAgICBpZiAoR2V0QWN0aXZlV2luZG93KCkpIHN3cGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFOworICAgICAgICAgICAgaWYgKEdldEFjdGl2ZVdpbmRvdzMyKCkpIHN3cGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFOwogICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTV19TSE9XTk9STUFMOiAgLyogc2FtZSBhcyBTV19OT1JNQUw6ICovCiAJY2FzZSBTV19TSE9XREVGQVVMVDogLyogRklYTUU6IHNob3VsZCBoYXZlIGl0cyBvd24gaGFuZGxlciAqLwpAQCAtNzI1LDEwICs3ODIsMTAgQEAKICAgICB9CiAKICAgICBpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSAmJgotICAgICAgICAhSXNXaW5kb3dWaXNpYmxlKCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYgKSAmJgorICAgICAgICAhSXNXaW5kb3dWaXNpYmxlMzIoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiApICYmCiAgICAgICAgIChzd3BmbGFncyAmIFNXUF9OT1NJWkUpICYmIChzd3BmbGFncyAmIFNXUF9OT01PVkUpKQogICAgIHsKLSAgICAgICAgLyogRG9uJ3QgY2FsbCBTZXRXaW5kb3dQb3MoKSBvbiBpbnZpc2libGUgY2hpbGQgd2luZG93cyAqLworICAgICAgICAvKiBEb24ndCBjYWxsIFNldFdpbmRvd1BvczMyKCkgb24gaW52aXNpYmxlIGNoaWxkIHdpbmRvd3MgKi8KICAgICAgICAgaWYgKGNtZCA9PSBTV19ISURFKSB3bmRQdHItPmR3U3R5bGUgJj0gfldTX1ZJU0lCTEU7CiAgICAgICAgIGVsc2Ugd25kUHRyLT5kd1N0eWxlIHw9IFdTX1ZJU0lCTEU7CiAgICAgfQpAQCAtNzM3LDcgKzc5NCw3IEBACiAgICAgICAgIC8qIFdlIGNhbid0IGFjdGl2YXRlIGEgY2hpbGQgd2luZG93ICovCiAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkKICAgICAgICAgICAgIHN3cGZsYWdzIHw9IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSOwotICAgICAgICBTZXRXaW5kb3dQb3MoIGh3bmQsIEhXTkRfVE9QLCB4LCB5LCBjeCwgY3ksIHN3cGZsYWdzICk7CisgICAgICAgIFNldFdpbmRvd1BvczMyKCBod25kLCBIV05EX1RPUCwgeCwgeSwgY3gsIGN5LCBzd3BmbGFncyApOwogICAgICAgICBpZiAoIUlzV2luZG93KCBod25kICkpIHJldHVybiB3YXNWaXNpYmxlOwogICAgIH0KIApAQCAtODM1LDggKzg5Miw4IEBACiAKICAgICB3bmRwbC0+bGVuZ3RoICA9IHNpemVvZigqd25kcGwpOwogICAgIHduZHBsLT5mbGFncyAgID0gMDsKLSAgICB3bmRwbC0+c2hvd0NtZCA9IElzWm9vbWVkKGh3bmQpID8gU1dfU0hPV01BWElNSVpFRCA6IAotCSAgICAgICAgICAgICAoSXNJY29uaWMoaHduZCkgPyBTV19TSE9XTUlOSU1JWkVEIDogU1dfU0hPV05PUk1BTCk7CisgICAgd25kcGwtPnNob3dDbWQgPSBJc1pvb21lZDE2KGh3bmQpID8gU1dfU0hPV01BWElNSVpFRCA6IAorCSAgICAgICAgICAgICAoSXNJY29uaWMxNihod25kKSA/IFNXX1NIT1dNSU5JTUlaRUQgOiBTV19TSE9XTk9STUFMKTsKICAgICB3bmRwbC0+cHRNaW5Qb3NpdGlvbiA9IHduZFB0ci0+cHRJY29uUG9zOwogICAgIHduZHBsLT5wdE1heFBvc2l0aW9uID0gd25kUHRyLT5wdE1heFBvczsKICAgICB3bmRwbC0+cmNOb3JtYWxQb3NpdGlvbiA9IHduZFB0ci0+cmVjdE5vcm1hbDsKQEAgLTg1NCw4ICs5MTEsOCBAQAogCiAgICAgd25kcGwtPmxlbmd0aCAgPSBzaXplb2YoKnduZHBsKTsKICAgICB3bmRwbC0+ZmxhZ3MgICA9IDA7Ci0gICAgd25kcGwtPnNob3dDbWQgPSBJc1pvb21lZChod25kKSA/IFNXX1NIT1dNQVhJTUlaRUQgOiAKLQkgICAgICAgICAgICAgKElzSWNvbmljKGh3bmQpID8gU1dfU0hPV01JTklNSVpFRCA6IFNXX1NIT1dOT1JNQUwpOworICAgIHduZHBsLT5zaG93Q21kID0gSXNab29tZWQzMihod25kKSA/IFNXX1NIT1dNQVhJTUlaRUQgOiAKKwkgICAgICAgICAgICAgKElzSWNvbmljMzIoaHduZCkgPyBTV19TSE9XTUlOSU1JWkVEIDogU1dfU0hPV05PUk1BTCk7CiAgICAgQ09OVl9QT0lOVDE2VE8zMiggJnduZFB0ci0+cHRJY29uUG9zLCAmd25kcGwtPnB0TWluUG9zaXRpb24gKTsKICAgICBDT05WX1BPSU5UMTZUTzMyKCAmd25kUHRyLT5wdE1heFBvcywgJnduZHBsLT5wdE1heFBvc2l0aW9uICk7CiAgICAgQ09OVl9SRUNUMTZUTzMyKCAmd25kUHRyLT5yZWN0Tm9ybWFsLCAmd25kcGwtPnJjTm9ybWFsUG9zaXRpb24gKTsKQEAgLTg3Nyw3ICs5MzQsNyBAQAogCSh3bmRwbC0+c2hvd0NtZCA9PSBTV19TSE9XTUlOSU1JWkVEKSkgd25kUHRyLT5mbGFncyB8PSBXSU5fUkVTVE9SRV9NQVg7CiAgICAgd25kUHRyLT5wdE1heFBvcyAgID0gd25kcGwtPnB0TWF4UG9zaXRpb247CiAgICAgd25kUHRyLT5yZWN0Tm9ybWFsID0gd25kcGwtPnJjTm9ybWFsUG9zaXRpb247Ci0gICAgU2hvd1dpbmRvdyggaHduZCwgd25kcGwtPnNob3dDbWQgKTsKKyAgICBTaG93V2luZG93MTYoIGh3bmQsIHduZHBsLT5zaG93Q21kICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTg5Niw3ICs5NTMsNyBAQAogCSh3bmRwbC0+c2hvd0NtZCA9PSBTV19TSE9XTUlOSU1JWkVEKSkgd25kUHRyLT5mbGFncyB8PSBXSU5fUkVTVE9SRV9NQVg7CiAgICAgQ09OVl9QT0lOVDMyVE8xNiggJnduZHBsLT5wdE1heFBvc2l0aW9uLCAmd25kUHRyLT5wdE1heFBvcyApOwogICAgIENPTlZfUkVDVDMyVE8xNiggJnduZHBsLT5yY05vcm1hbFBvc2l0aW9uLCAmd25kUHRyLT5yZWN0Tm9ybWFsICk7Ci0gICAgU2hvd1dpbmRvdyggaHduZCwgd25kcGwtPnNob3dDbWQgKTsKKyAgICBTaG93V2luZG93MzIoIGh3bmQsIHduZHBsLT5zaG93Q21kICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTEwMTAsOCArMTA2Nyw4IEBACiAJICAgIGlmICh3bmRUZW1wLT5kd1N0eWxlICYgV1NfVklTSUJMRSkgYnJlYWs7CiAKIAlpZiggd25kVGVtcCAhPSB3bmRQdHIgKQotCSAgICBTZXRXaW5kb3dQb3MoaFduZCwgSFdORF9UT1AsIDAsMCwwLDAsIAotCQkJIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwgU1dQX05PQUNUSVZBVEUgKTsKKwkgICAgU2V0V2luZG93UG9zMzIoaFduZCwgSFdORF9UT1AsIDAsMCwwLDAsIAorCQkJICAgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfCBTV1BfTk9BQ1RJVkFURSApOwogICAgICAgICBpZiggIUlzV2luZG93KGhXbmQpICkgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xMjU0LDkgKzEzMTEsOSBAQAogICogTW92ZSBhIHdpbmRvdyBpbiBaIG9yZGVyLCBpbnZhbGlkYXRpbmcgZXZlcnl0aGluZyB0aGF0IG5lZWRzIGl0LgogICogT25seSBuZWNlc3NhcnkgZm9yIHdpbmRvd3Mgd2l0aG91dCBhc3NvY2lhdGVkIFggd2luZG93LgogICovCi1zdGF0aWMgdm9pZCBXSU5QT1NfTW92ZVdpbmRvd1pPcmRlciggSFdORCBod25kLCBIV05EIGh3bmRBZnRlciApCitzdGF0aWMgdm9pZCBXSU5QT1NfTW92ZVdpbmRvd1pPcmRlciggSFdORDMyIGh3bmQsIEhXTkQzMiBod25kQWZ0ZXIgKQogewotICAgIEJPT0wgbW92aW5nVXA7CisgICAgQk9PTDMyIG1vdmluZ1VwOwogICAgIFdORCAqcFduZEFmdGVyLCAqcFduZEN1ciwgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAKICAgICAvKiBXZSBoYXZlIHR3byBwb3NzaWJsZSBjYXNlczoKQEAgLTEzMzIsNyArMTM4OSw3IEBACiAgKiBmaXggWiBvcmRlciB0YWtpbmcgaW50byBhY2NvdW50IG93bmVkIHBvcHVwcyAtCiAgKiBiYXNpY2FsbHkgd2UgbmVlZCB0byBtYWludGFpbiB0aGVtIGFib3ZlIG93bmVyIHdpbmRvdwogICovCi1IV05EIFdJTlBPU19SZW9yZGVyT3duZWRQb3B1cHMoSFdORCBod25kSW5zZXJ0QWZ0ZXIsIFdORCogd25kUHRyLCBXT1JEIGZsYWdzKQorSFdORDMyIFdJTlBPU19SZW9yZGVyT3duZWRQb3B1cHMoSFdORDMyIGh3bmRJbnNlcnRBZnRlcixXTkQqIHduZFB0cixXT1JEIGZsYWdzKQogewogIFdORCogCXcgPSBXSU5fR2V0RGVza3RvcCgpLT5jaGlsZDsKIApAQCAtMTM0MCw3ICsxMzk3LDcgQEAKICAgewogICAgLyogaW1wbGVtZW50ICJsb2NhbCB6LW9yZGVyIiBiZXR3ZWVuIHRoZSB0b3AgYW5kIG93bmVyIHdpbmRvdyAqLwogCi0gICAgIEhXTkQgaHduZExvY2FsUHJldiA9IEhXTkRfVE9QOworICAgICBIV05EMzIgaHduZExvY2FsUHJldiA9IEhXTkRfVE9QOwogCiAgICAgIGlmKCBod25kSW5zZXJ0QWZ0ZXIgIT0gSFdORF9UT1AgKQogICAgICB7CkBAIC0xMzYzLDggKzE0MjAsOCBAQAogCiAgICAgaWYoIHctPmR3U3R5bGUgJiBXU19QT1BVUCAmJiB3LT5vd25lciA9PSB3bmRQdHIgKQogICAgIHsKLSAgICAgIFNldFdpbmRvd1Bvcyh3LT5od25kU2VsZiwgaHduZEluc2VydEFmdGVyLCAwLCAwLCAwLCAwLCBTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PU0VORENIQU5HSU5HIHwgU1dQX0RFRkVSRVJBU0UpOworICAgICAgU2V0V2luZG93UG9zMzIody0+aHduZFNlbGYsIGh3bmRJbnNlcnRBZnRlciwgMCwgMCwgMCwgMCwgU1dQX05PTU9WRSB8IFNXUF9OT1NJWkUgfAorICAgICAgICAgICAgICAgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9TRU5EQ0hBTkdJTkcgfCBTV1BfREVGRVJFUkFTRSk7CiAgICAgICBod25kSW5zZXJ0QWZ0ZXIgPSB3LT5od25kU2VsZjsKICAgICB9CiAgICAgdyA9IHctPm5leHQ7CkBAIC0xMzg0LDcgKzE0NDEsNyBAQAogICogdXBkYXRlIHJlZ2lvbnMgYXJlIGluIHdpbmRvdyBjbGllbnQgY29vcmRpbmF0ZXMKICAqIGNsaWVudCBhbmQgd2luZG93IHJlY3RhbmdsZXMgYXJlIGluIHBhcmVudCBjbGllbnQgY29vcmRpbmF0ZXMKICAqLwotc3RhdGljIFVJTlQgV0lOUE9TX1NpemVNb3ZlQ2xlYW4oV05EKiBXbmQsIEhSR04zMiBvbGRWaXNSZ24sIExQUkVDVDE2IGxwT2xkV25kUmVjdCwgTFBSRUNUMTYgbHBPbGRDbGllbnRSZWN0LCBVSU5UIHVGbGFncyApCitzdGF0aWMgVUlOVDMyIFdJTlBPU19TaXplTW92ZUNsZWFuKFdORCogV25kLCBIUkdOMzIgb2xkVmlzUmduLCBMUFJFQ1QxNiBscE9sZFduZFJlY3QsIExQUkVDVDE2IGxwT2xkQ2xpZW50UmVjdCwgVUlOVDMyIHVGbGFncyApCiB7CiAgSFJHTjMyIG5ld1Zpc1JnbiA9IERDRV9HZXRWaXNSZ24oV25kLT5od25kU2VsZixEQ1hfV0lORE9XIHwgRENYX0NMSVBTSUJMSU5HUyk7CiAgSFJHTjMyIGRpcnR5UmduID0gQ3JlYXRlUmVjdFJnbjMyKDAsMCwwLDApOwpAQCAtMTYwNSwxNiArMTY2MiwyNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2V0V2luZG93UG9zICAgKFVTRVIuMjMyKQogICovCi1CT09MIFNldFdpbmRvd1BvcyggSFdORCBod25kLCBIV05EIGh3bmRJbnNlcnRBZnRlciwgSU5UIHgsIElOVCB5LAotCQkgICBJTlQgY3gsIElOVCBjeSwgV09SRCBmbGFncyApCitCT09MMTYgU2V0V2luZG93UG9zMTYoIEhXTkQxNiBod25kLCBIV05EMTYgaHduZEluc2VydEFmdGVyLCBJTlQxNiB4LCBJTlQxNiB5LAorICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjeCwgSU5UMTYgY3ksIFdPUkQgZmxhZ3MgKQoreworICAgIHJldHVybiBTZXRXaW5kb3dQb3MzMihod25kLChJTlQzMikoSU5UMTYpaHduZEluc2VydEFmdGVyLHgseSxjeCxjeSxmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFdpbmRvd1BvcyAgIChVU0VSMzIuNTE5KQorICovCitCT09MMzIgU2V0V2luZG93UG9zMzIoIEhXTkQzMiBod25kLCBIV05EMzIgaHduZEluc2VydEFmdGVyLCBJTlQzMiB4LCBJTlQzMiB5LAorICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjeCwgSU5UMzIgY3ksIFdPUkQgZmxhZ3MgKQogewogICAgIFdJTkRPV1BPUzE2ICp3aW5wb3M7CiAgICAgV05EICoJd25kUHRyOwogICAgIFJFQ1QxNiAJbmV3V2luZG93UmVjdCwgbmV3Q2xpZW50UmVjdCwgb2xkV2luZG93UmVjdDsKICAgICBIUkdOMzIJdmlzUmduID0gMDsKLSAgICBIV05ECXRlbXBJbnNlcnRBZnRlcj0gMDsKKyAgICBIV05EMzIJdGVtcEluc2VydEFmdGVyPSAwOwogICAgIGludCAJcmVzdWx0ID0gMDsKLSAgICBVSU5UIAl1RmxhZ3MgPSAwOworICAgIFVJTlQzMiAJdUZsYWdzID0gMDsKIAogICAgIGRwcmludGZfd2luKHN0ZGRlYiwiU2V0V2luZG93UG9zOiBod25kICUwNHgsICglaSwlaSktKCVpLCVpKSBmbGFncyAlMDh4XG4iLCAKIAkJCQkJCSBod25kLCB4LCB5LCB4K2N4LCB5K2N5LCBmbGFncyk7ICAKQEAgLTE5MTQsNyArMTk4MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHdpbnBvcy0+aHduZCA9PSBHZXRGb2N1czMyKCkpIHx8Ci0gICAgICAgICAgICBJc0NoaWxkKCB3aW5wb3MtPmh3bmQsIEdldEZvY3VzMzIoKSkpCisgICAgICAgICAgICBJc0NoaWxkMzIoIHdpbnBvcy0+aHduZCwgR2V0Rm9jdXMzMigpKSkKICAgICAgICAgewogICAgICAgICAgICAgLyogUmV2ZXJ0IGZvY3VzIHRvIHBhcmVudCAqLwogICAgICAgICAgICAgU2V0Rm9jdXMzMiggR2V0UGFyZW50MzIod2lucG9zLT5od25kKSApOwpAQCAtMTkyNCwxMCArMTk5MCwxMCBAQAogCWlmICh3aW5wb3MtPmh3bmQgPT0gaHduZEFjdGl2ZSkKIAl7CiAJICAgICAgLyogQWN0aXZhdGUgcHJldmlvdXNseSBhY3RpdmUgd2luZG93IGlmIHBvc3NpYmxlICovCi0JICAgIEhXTkQgbmV3QWN0aXZlID0gaHduZFByZXZBY3RpdmU7CisJICAgIEhXTkQzMiBuZXdBY3RpdmUgPSBod25kUHJldkFjdGl2ZTsKIAkgICAgaWYgKCFJc1dpbmRvdyhuZXdBY3RpdmUpIHx8IChuZXdBY3RpdmUgPT0gd2lucG9zLT5od25kKSkKIAkgICAgewotCQluZXdBY3RpdmUgPSBHZXRUb3BXaW5kb3coIEdldERlc2t0b3BXaW5kb3czMigpICk7CisJCW5ld0FjdGl2ZSA9IEdldFRvcFdpbmRvdzMyKCBHZXREZXNrdG9wV2luZG93MzIoKSApOwogCQlpZiAobmV3QWN0aXZlID09IHdpbnBvcy0+aHduZCkKICAgICAgICAgICAgICAgICAgICAgbmV3QWN0aXZlID0gd25kUHRyLT5uZXh0ID8gd25kUHRyLT5uZXh0LT5od25kU2VsZiA6IDA7CiAJICAgIH0JICAgIApAQCAtMTk3MywxNSArMjAzOSwyNCBAQAogCiAJCQkJCQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQmVnaW5EZWZlcldpbmRvd1BvcyAgIChVU0VSLjI1OSkKKyAqICAgICAgICAgICBCZWdpbkRlZmVyV2luZG93UG9zMTYgICAoVVNFUi4yNTkpCiAgKi8KLUhEV1AxNiBCZWdpbkRlZmVyV2luZG93UG9zKCBJTlQgY291bnQgKQorSERXUDE2IEJlZ2luRGVmZXJXaW5kb3dQb3MxNiggSU5UMTYgY291bnQgKQogewotICAgIEhEV1AxNiBoYW5kbGU7CisgICAgcmV0dXJuIEJlZ2luRGVmZXJXaW5kb3dQb3MzMiggY291bnQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBCZWdpbkRlZmVyV2luZG93UG9zMzIgICAoVVNFUjMyLjgpCisgKi8KK0hEV1AzMiBCZWdpbkRlZmVyV2luZG93UG9zMzIoIElOVDMyIGNvdW50ICkKK3sKKyAgICBIRFdQMzIgaGFuZGxlOwogICAgIERXUCAqcERXUDsKIAogICAgIGlmIChjb3VudCA8PSAwKSByZXR1cm4gMDsKLSAgICBoYW5kbGUgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihEV1ApICsgKGNvdW50LTEpKnNpemVvZihXSU5ET1dQT1MxNikgKTsKKyAgICBoYW5kbGUgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihEV1ApICsgKGNvdW50LTEpKnNpemVvZihXSU5ET1dQT1MzMikgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CiAgICAgcERXUCA9IChEV1AgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoYW5kbGUgKTsKICAgICBwRFdQLT5hY3R1YWxDb3VudCAgICA9IDA7CkBAIC0xOTk0LDE1ICsyMDY5LDI2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGVmZXJXaW5kb3dQb3MgICAoVVNFUi4yNjApCisgKiAgICAgICAgICAgRGVmZXJXaW5kb3dQb3MxNiAgIChVU0VSLjI2MCkKICAqLwotSERXUDE2IERlZmVyV2luZG93UG9zKCBIRFdQMTYgaGR3cCwgSFdORCBod25kLCBIV05EIGh3bmRBZnRlciwgSU5UIHgsIElOVCB5LAotICAgICAgICAgICAgICAgICAgICAgICBJTlQgY3gsIElOVCBjeSwgVUlOVCBmbGFncyApCitIRFdQMTYgRGVmZXJXaW5kb3dQb3MxNiggSERXUDE2IGhkd3AsIEhXTkQxNiBod25kLCBIV05EMTYgaHduZEFmdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IHgsIElOVDE2IHksIElOVDE2IGN4LCBJTlQxNiBjeSwgVUlOVDE2IGZsYWdzICkKK3sKKyAgICByZXR1cm4gRGVmZXJXaW5kb3dQb3MzMiggaGR3cCwgaHduZCwgKElOVDMyKShJTlQxNilod25kQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGN4LCBjeSwgZmxhZ3MgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEZWZlcldpbmRvd1BvczMyICAgKFVTRVIzMi4xMjcpCisgKi8KK0hEV1AzMiBEZWZlcldpbmRvd1BvczMyKCBIRFdQMzIgaGR3cCwgSFdORDMyIGh3bmQsIEhXTkQzMiBod25kQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeCwgSU5UMzIgeSwgSU5UMzIgY3gsIElOVDMyIGN5LCBVSU5UMzIgZmxhZ3MgKQogewogICAgIERXUCAqcERXUDsKICAgICBpbnQgaTsKLSAgICBIRFdQMTYgbmV3aGR3cCA9IGhkd3A7Ci0gICAgSFdORCBwYXJlbnQ7CisgICAgSERXUDMyIG5ld2hkd3AgPSBoZHdwOworICAgIEhXTkQzMiBwYXJlbnQ7CiAKICAgICBwRFdQID0gKERXUCAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhkd3AgKTsKICAgICBpZiAoIXBEV1ApIHJldHVybiAwOwpAQCAtMjA0OSw3ICsyMTM1LDcgQEAKICAgICBpZiAocERXUC0+YWN0dWFsQ291bnQgPj0gcERXUC0+c3VnZ2VzdGVkQ291bnQpCiAgICAgewogICAgICAgICBuZXdoZHdwID0gVVNFUl9IRUFQX1JFQUxMT0MoIGhkd3AsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXUCkgKyBwRFdQLT5zdWdnZXN0ZWRDb3VudCpzaXplb2YoV0lORE9XUE9TMTYpICk7CisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXUCkgKyBwRFdQLT5zdWdnZXN0ZWRDb3VudCpzaXplb2YoV0lORE9XUE9TMzIpICk7CiAgICAgICAgIGlmICghbmV3aGR3cCkgcmV0dXJuIDA7CiAgICAgICAgIHBEV1AgPSAoRFdQICopIFVTRVJfSEVBUF9MSU5fQUREUiggbmV3aGR3cCApOwogICAgICAgICBwRFdQLT5zdWdnZXN0ZWRDb3VudCsrOwpAQCAtMjA2NywyMiArMjE1MywzMSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVuZERlZmVyV2luZG93UG9zICAgKFVTRVIuMjYxKQorICogICAgICAgICAgIEVuZERlZmVyV2luZG93UG9zMTYgICAoVVNFUi4yNjEpCiAgKi8KLUJPT0wgRW5kRGVmZXJXaW5kb3dQb3MoIEhEV1AxNiBoZHdwICkKK0JPT0wxNiBFbmREZWZlcldpbmRvd1BvczE2KCBIRFdQMTYgaGR3cCApCit7CisgICAgcmV0dXJuIEVuZERlZmVyV2luZG93UG9zMzIoIGhkd3AgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFbmREZWZlcldpbmRvd1BvczMyICAgKFVTRVIzMi4xNzIpCisgKi8KK0JPT0wzMiBFbmREZWZlcldpbmRvd1BvczMyKCBIRFdQMzIgaGR3cCApCiB7CiAgICAgRFdQICpwRFdQOwotICAgIFdJTkRPV1BPUzE2ICp3aW5wb3M7Ci0gICAgQk9PTCByZXMgPSBUUlVFOworICAgIFdJTkRPV1BPUzMyICp3aW5wb3M7CisgICAgQk9PTDMyIHJlcyA9IFRSVUU7CiAgICAgaW50IGk7CiAKICAgICBwRFdQID0gKERXUCAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhkd3AgKTsKICAgICBpZiAoIXBEV1ApIHJldHVybiBGQUxTRTsKICAgICBmb3IgKGkgPSAwLCB3aW5wb3MgPSBwRFdQLT53aW5Qb3M7IGkgPCBwRFdQLT5hY3R1YWxDb3VudDsgaSsrLCB3aW5wb3MrKykKICAgICB7Ci0gICAgICAgIGlmICghKHJlcyA9IFNldFdpbmRvd1Bvcyggd2lucG9zLT5od25kLCB3aW5wb3MtPmh3bmRJbnNlcnRBZnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5wb3MtPngsIHdpbnBvcy0+eSwgd2lucG9zLT5jeCwgd2lucG9zLT5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5wb3MtPmZsYWdzICkpKSBicmVhazsKKyAgICAgICAgaWYgKCEocmVzID0gU2V0V2luZG93UG9zMzIoIHdpbnBvcy0+aHduZCwgd2lucG9zLT5od25kSW5zZXJ0QWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5wb3MtPngsIHdpbnBvcy0+eSwgd2lucG9zLT5jeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbnBvcy0+Y3ksIHdpbnBvcy0+ZmxhZ3MgKSkpIGJyZWFrOwogICAgIH0KICAgICBVU0VSX0hFQVBfRlJFRSggaGR3cCApOwogICAgIHJldHVybiByZXM7CkBAIC0yMDkyLDcgKzIxODcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVGlsZUNoaWxkV2luZG93cyAgIChVU0VSLjE5OSkKICAqLwotdm9pZCBUaWxlQ2hpbGRXaW5kb3dzKCBIV05EIHBhcmVudCwgV09SRCBhY3Rpb24gKQordm9pZCBUaWxlQ2hpbGRXaW5kb3dzKCBIV05EMTYgcGFyZW50LCBXT1JEIGFjdGlvbiApCiB7CiAgICAgcHJpbnRmKCJTVFVCIFRpbGVDaGlsZFdpbmRvd3MoJTA0eCwgJWQpXG4iLCBwYXJlbnQsIGFjdGlvbik7CiB9CkBAIC0yMTAwLDcgKzIxOTUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ2FzY2FnZUNoaWxkV2luZG93cyAgIChVU0VSLjE5OCkKICAqLwotdm9pZCBDYXNjYWRlQ2hpbGRXaW5kb3dzKCBIV05EIHBhcmVudCwgV09SRCBhY3Rpb24gKQordm9pZCBDYXNjYWRlQ2hpbGRXaW5kb3dzKCBIV05EMTYgcGFyZW50LCBXT1JEIGFjdGlvbiApCiB7CiAgICAgcHJpbnRmKCJTVFVCIENhc2NhZGVDaGlsZFdpbmRvd3MoJTA0eCwgJWQpXG4iLCBwYXJlbnQsIGFjdGlvbik7CiB9Cg==